読者です 読者をやめる 読者になる 読者になる

基本的に怠Diary

学習ログを残したい

ScalaでJUnit事始めと見せかけて実は大したことできないからとりあえず初めてだから許してって気持ちかなり入ってる

仕事が辛い。無能すぎて辛い。

上司とか上司がすごく苦い顔してくるのかなり辛い。

能力は非常に高いです。私を雇う以外は特に失敗は確認できません。

人を見る目以外はとてもすごい上司です。尊敬してます。

ごめんなさいごめんなさいごめんなさい

それはさておきScalaする。

Scalaは一年ぐらいかけてのんびりやりたいのでテストとか書いて丁寧にやりたい。

いやそれが当たり前なんだけどね。

というわけでテストフレームワークを使うのは確定で、

何を使うのかと言うとタイトル通りJUnitを使って行きたいと思います。

JUnitなら仕事で使う可能性の高いJavaとかにも活かせるしいいかなーって

JUnitの技術書買ったし、

記事書くっつったし

ちなみに開発環境はZorinOSでIntelliJ Idea使ってますです。

ビルドツールはsbt使ってます。IntelliJの設定でPlugin追加してあげました。

当たり前ですがプロジェクト作成時点でJUnitなんて入ってないので

sbtの場合はインスコしてあげることを教えてあげないといけないです。

>libraryDependencies += "com.novocode" % "junit-interface" % "0.8" % "test->default"

ちなみにこの一行はぐぐって見つけたものをそのままいれてbuild moduleさせたらなんかインスコしてくれました(問題発言

alvinalexander.com

それは流石にダメだから調べてみる。

sbt Reference Manual — ライブラリ依存性

なんか公式っぽいとこにあった。

libraryDependencies += groupID % artifactID % revision

でも最後のtest->defaultってなんなのだろう

ある依存ライブラリが Test コンフィギュレーションのクラスパスには出てきてほしいが、 Compile コンフィギュレーションでは要らないという場合は、以下のように % "test" と追加する:

defaultってなんだよってば

sbt Reference Manual — Library Management

めっちゃ探した・・・・もうマヂムリ・・・

libraryDependencies += "org.scalatest" %% "scalatest" % "2.1.3" % "test->compile"

似たようなのあった

This says that your project’s "test" configuration uses ScalaTest’s "compile" configuration. See the Ivy >documentation for more advanced mappings. Most projects published to Maven repositories will use the >"compile" configuration.

Google翻訳大先輩

これは、プロジェクトの「テスト」設定がScalaTestの「コンパイル」設定を
使用していることを示しています。
より高度なマッピングについては、Ivy>のドキュメントを参照してください。
 Mavenリポジトリに公開されるほとんどのプロジェクトは、 "コンパイル"設定を使用します。

つまり「test」設定がJUnitの「default」設定を使用しているということか*1

なるほど、微妙にわからん。


クラスとかはCopの本にあるクラスを使ってテストします。

RationalTest.scala

import org.junit.{Test,Assert}
import chap6.Rational


class RationalTest {
  @Test
  def toStringTest = {
    val n = 5
    val d = 1
    val rat = new Rational(n,d)
    Assert.assertEquals(rat.toString,"created " + n + "/" + d)
  }
  @Test(expected = classOf[IllegalArgumentException])
  def zeroCheckTest = {
    val rat = new Rational(5,0)
  }
}

Assert.assertEqualsの使い方はまんまだったけど

例外投げる挙動のテストだとJavaと微妙に違ったので

かなり調べて思いつかなかったけどIntelliJくんがこれじゃねって教えてくれてなんとかできた。

@Test(expected = classOf[IllegalArgumentException])

ここなんだけど、私が見ていたJavaの技術書ではIllegalArgumentException.class

でいけるって書いてあったけどどうやらScalaではclassOfでクラスを取得するようだ。

あ、ちなみにRationalクラスはまだ途中だけどこんな感じ

class Rational(n:Int,d:Int) {
  require(d != 0)
  override def toString = "created " + n + "/" + d
}

これからもテスト頑張るぞい。

もとい、Scala一年続けることのできるように

この後滅茶滅茶参考にした。 Amazon CAPTCHA

*1:私の英語力は底辺中学生レベルです。

宇宙(そら)へ・・・

f:id:saborin78:20170112192756p:plain

スペェェェスゥェエェェィィムァァァックス(ねっとりボイス

私のEmacsが宇宙でカスタムされたSpacemacsになりました。

明日をつかめデビルマシン♪

とりあえず.emacs.dをすり替えて再び起動したらSpacemacsになってました。

でも使い方ってなんか変わるのでしょうか。

と触って初めて気がつく。

Vimってる!?

どういうことだってばよ・・・とりあえずEmacsすごい人達の作った記事を見ることに

qiita.com

Spacemacsとはemacsの便利機能を設定の手間を最小限に、提供するemacs lisp群である

なるほど。

だが使い方はわからん。

とりあえずRubyやらJSやらの補完とか欲しいのでホームディレクトリの下にできているという.spacemacsの

dotspacemacs-configuration-layersに言語を追加してEmacs再び立ち上げると

なんか更新始まりました。

どうやら自動でインストールしてくれるみたいです。

まぁいろいろあるんですけどね、

すごく使いづらいというか使い方わかってないのがあれ

C-x uでUndoするときによくわからない画面が立ち上がって謎の動きするの辛い。

ここでもうやめるってなるのがぱしょこんしょしんしゃ

ぼくは初学者だ。冷静に画面の情報を集めるところから始めることができる。

するとundo-treeという名前が書いてあるではないか。なぜ知らないと言われても

私はキーバインドになれてからそういうの入れようと思ってたんです。決して

undo-treeくんを忘れてたわけではないんです。

とりあえず彼と理解するところから始めましょう。

qiita.com

(今回リンク多すぎでは)

ブログはじめたてというか最近までリンクって極力少なくしたほうがいい的なことついったランドの

意識とプログラミング力の高い人間たちを見て私もそれに当てられてましたが

よくよく考えてみるとリンク集でも十分だよなって思いました。

〜言い訳タイム終了〜

ようするにGitだねって問題発言。実用Gitで詳しく説明してくれてるけど私は全然わかってない。

ただこれ使い方が悪いのか、画面をどんどん奪っていくのほんとつらい。

でもUndo一気に戻れるの便利だから使ったちゃう///

そしてポエム書いてたら何も進まずに今日は終わりへと向かっていく。

今日の進捗。

f:id:saborin78:20170112224504j:plain

ブログ書いてる途中で何やってんだ俺ってなりました。

一年目終わるまでの目標

糞みたいな内容こいてた。


もっともっとシンプルにする。


まず今年の目標ではなく、社会人1年目が終わるまでの目標へと変えます。


# 1.資格取得

スペシャリスト系取得します。春にデスペで秋にネスペ受けます。LPICは一年目切符が切れる前に受けます。


LPICとDB共に読書程度しかしてません。


LPICはそろそろ演習問題解きはじめます。


デスペも今週参考書買って過去問考察に入りたいと思います。


# 2.アプリ的な何かの作成

読書管理ツールは終わらせたいです。

今までのペース的にそれ以外は無理なのですっぱり諦めます。


これに関しては完全にストップしている。

まず設計から見直すべきなのかも

# 3.Scala

これって何すればいいの・・・?

なんかかっこよさそうだったからいろいろ本買いましたが

適切なゴールが未だにわかりません。何すればいいかわからないです。

とりあえずノート作ろう。

Emacs de PostgreSQL

EmacsでPostgres使いたい!


やだやだ!ぼくつかいたい!なんかかっこよく使いたい!


pgAdminやーだー!けんしゅうでつかってるし他のAdmin系でハマってだるくなってるから嫌だ!





と私のゴーストが言っているのでEmacsでデータベース管理ができるように設定していきたいです。


手持ちの本

Amazon CAPTCHA


に書いてある方法試してみたけどよくわかりませんでした。


というかsql-interactive-modeがなくて


sql-interactive-mode-menuみたいなコマンドは存在してて、実行してみたらパラメタが足りない的な単語が出てきて


調べてもよくわからなかったので別アプローチかけてみました。




それがsql-postgresです。


TrườngTX Blog




ここみて設定しました。



(setq sql-postgres-login-params
'((user :default "ログインユーザ")
(database :default "DB名")
(server :default "localhost")
(port :default 5432)))

てかこのコードelispなるものらしいが、

はてなのコード挿入のアレにそれがないのでのlispで囲っても良いものか


lisp過激派とかに殺されたりするの嫌なので素で貼る(面倒くさいだけ



これをinit.elにいれて、Emacs起動して、


M-xでsql-postgresいれてEnterバシバシ(確認はしよう!)さあログインできない。




なんも表示されずとりあえずEnter押したら


password for user DB名


とでてきてpassいれてもProcessがない的なメッセでておしまいでした。。。


とりあえずlogin...done


の後にパスワード入力したらログインできました。



ここらへんうまく調整できたらいいのですが・・・今日はここまで。



残りの時間はエロゲして本読んで寝ます。

コミュ障(ガチ)でも読書管理がしたい!

達人プログラマ見ながらふと、私は思いました。








本を登録し、


そこから本を選択して読書を開始し、


途中経過(ページ)を登録し


読書の途中経過、リザルトなどを確認できること。


OSはUbuntu16.04LTS

DBはMongoDB(初めて触ります)

サーバサイドはNodejs+Express(こんな表記でいいのだろうか)


です。


MongoDBのインストールはぐぐって適当にやりました。


某サイトの猿真似で普通にできたのでプライベートのノートに書くだけにしときます。


Expressについてですが、普通にできませんでした。


Expressをnpmでインストールした後に


nodeなんて存在しないよ的なエラーがでてたので

sudo ln -s /usr/bin/nodejs /usr/bin/node

でなんとか動くようにしてます・・・w


インストール時名前がnodejsになってるアレの仕業みたいなので


aptに細工入れずにインストールした場合は今回みたいにシンボリックリンク貼るか


ちゃんと細工しましょう。私はこの開発環境はいつ消すかわからないのでそういう検証しません。


流石に検証してもいない古い記事のソースを貼るのもなんかあれなのでやりません。(今更


テーブル構成

books

b_id
name
max_pages
description

readings

rb_id
b_id
current_page
memo
starting_date
last_modified

finish_readings

frb_id
rb_id
end_date





いつものガバ英語




ちなみにこいつは現段階では無視。

checking_books

cb_id
rb_id
target_page
target_row
memo

target_rowは必須入力にはしないつもりです。


memoになんか文字列いれといて後から検索で引っ張ることができたりするといいのかなってテーブル。


そこまでやる気残ってないだろうなという想定のもとで止めときます。


実はもう少し追加したい機能があったりするのですが多分辿りつけないのでやめときます。


本に金額カラムを追加してそこから


購入した本の合計及び、読了した本の合計を使って


そこからいろいろ導き出して自分を煽りたいっての少しあります。






できたらいいなーというマインドの元、軽いテーブル設計だけ作りました。


去年のやらかしや


本年度のライフスタイル的には最後まで作る可能性は非常に低いです。


現在Expressの最初あたりでハマってるので続投は(ry




このままできなかったらやめるか、Laravelをベースに作りなおしになると思います。




とりあえずできなかったらDBにテーブル作って子供みたいにごっこ遊びして勝手に満足してくろーずします。

あーねんまつ

今年は1人で年越ししました。


とうとう家族とも仲良くできなくなりました。


俺は今日も1人で、きっと来年も1人だと思います。


私がこうなってしまった経緯にはとても複雑で辛いものがありません。





あるわけないじゃないですか。


ただ、人よりわがままで頭が悪かったからこうなりました。






私はコミュニケーション力だけでは集団に戻ることはできません。


そんなの当たり前だろうと発言できる方は恐らく社内でとても頼りにされている


スーパーマンなのだと思います。


残念ながら私は糞雑魚うんこまんなのでそのような発言はできません。


今の会社は新卒で入社し、現状では私の未来の能力に賭けていただき、


なんとか居座らせていただいています。





結論から言えばそのような未来は来ません。その社員、無能だよ。



技術書一つ手に持てば、理解できずに100ページ付近で止まり、


理解しないままなんとなく進めて閉じ、


成果物一つろくに作れず、結局去年は何も作れませんでした。


でもこの社会はとても優しいのでそういう人間の生き方って存在します。


集団に媚びへつらうことです。それだけで生きていけます。


私は技術的に普通のそれに遥かに劣り、さらに媚の売り方が下手くそです。


私はどうすれば生きていけるのか、と常に考えていますが結局思考停止の


読書という対処を取っています。


多分最適解は友人を作るために外に出ることです。


何故それを行わないのか。


外に出て、人に見られることを想像して、自分の悪口言われるかもしれない


と被害妄想が外に出る前から始まるこの私にそれはとても厳しいです。













今の私にできることは一つ。この人生を何か他のものの所為にして精神を保つことです。


何故私には優れた才能が一つもなかったのか。

何故私はこのような見難い見た目なのか。

何故私は





でもそれって人のせいにする前に、自分に刺さってるんですよ。





なぜなら、

才能を真面目に磨こうとしなかったのも

見難いお腹や顔への対処をしなかったのも

すべて私だったからです。






そこまで考えると頭がもやもやしてくる。


私はどうすればいいのだろうか。このままサボるにももやもやが晴れねば苦しいだけで


改善するためには頑張らないといけないが、何をどう頑張ればよいのだ。





考えても考えても何も思い浮かばない。







そこで気がつく。





そうか、私の人生はもう詰んでいるのか。




考えをまとめていくうちに


すでに私の人生は締めに入っていることに気がつきました。




残りの人生どうしようかなんて考えるだけ無駄。








夜、寝る前、明日をどうやって生きるかを考えよう。


今日を精一杯生きよう。


明後日や明々後日のことを考えるのはやめよう。


私は今、やりたいと思ったことをやる。


数年後後悔しようが知らない。来年は土に帰ってるかもしれないのだから。

ミント、Golangまたやるってよ。

ちなみに元ネタ全く知らないよ。



暇だったのでクッソ有名なRSSライブラリ使って遊んでたよ。


github.com



これです。


ここのテストに書いてあるように利用すれば簡単にRSSで取得できました。



取得して後ろに日付つけたテキストファイルに保存まではできました。


後フィルタ(笑)機能もついていて、TitleとDescriptionに指定した単語が含まれていないものは弾くというものです。




package main

import (
	"fmt"
	"io/ioutil"
        "os"
	"regexp"
	"time"
	"bufio"
	"strings"
	"strconv"
	rss "github.com/jteeuwen/go-pkg-rss"
)

func main(){
	checkRSS("http://b.hatena.ne.jp/hotentry/it.rss")
}

func checkRSS(uri string){
	feed := rss.New(20,false,chanHandler,itemHandler)
	err := feed.Fetch(uri,nil)
	if err != nil {
		fmt.Fprintf(os.Stderr, "[e] %s: %s", uri, err)
		return
	}
}


func chanHandler(feed *rss.Feed, newchannels []*rss.Channel) {
	fmt.Printf("%d new channel(s) in %s\n", len(newchannels), feed.Url)
}

func itemHandler(feed *rss.Feed, ch *rss.Channel, newitems []*rss.Item) {
	contents := ""
	for _, item := range newitems {
		//別々よりこっちの方が早そう
		fmt.Println("title:" + item.Title + "\n")
		if isWordIncludingList(item.Title + item.Description){
			contents += "title:" + item.Title + "\n"
			for _, link := range item.Links {
				contents += "url:" + link.Href + "\n"
			}
		}
	}
	saveContentsLogFile(contents)
}

//受け取った文字列を日付付きのファイル名で./logの下に保存するよ
func saveContentsLogFile(contents string){
	t := time.Now()
	date := t.Format("20060102")
	hour := strconv.Itoa(t.Hour())
	ioutil.WriteFile("log/hatena_" + date + hour + ".txt",
								[]byte(contents),os.ModePerm)
}


func isWordIncludingList(title string) bool{
	var fp *os.File
	var err error
	
	fp, err = os.Open("list.txt")
	if err != nil {
		panic(err)
	}
	defer fp.Close()
	
	scanner := bufio.NewScanner(fp)
	for scanner.Scan() {
		ptr := regexp.MustCompile(strings.ToLower(scanner.Text()))
		if(ptr.MatchString(strings.ToLower(title))){
			return true
		}
	}
	if err := scanner.Err(); err != nil {
		panic(err)
	}
	return false
}

ほとんどパクったようなコードにゴミが混ざってるだけです・・・


これ自体進展させるとしたら

Sqliteを活用する。

・フィルタ機能をもう少し捻る。

GUIでいろいろ操作できるように。



これぐらいでしょうか。やる気は微妙にない。




RSSはもういい


次の記事はJUnitでなんかいろいろする記事の予定です。