複数行を読み込む時に空行を無視する
プログラミング問題で出てきて躓いたのでメモ。
String word = "123 string\n \nstring2\nstr\n-----end-----"; word = word.replaceAll("(?m)^\\s*$[\n\r]{1,}", ""); Scanner sc = new Scanner(word); while (sc.hasNextLine()){ String str = sc.nextLine(); System.out.println(str); }
/^\s*$[\n\r]{1,}/gm
が必要な正規表現。
before_createの実行タイミング(callbackのタイミング)
Ruby on Railsの勉強を、ということでRailsチュートリアルをやっていたが、はまったポイントがあったので備忘録。
before_save
がbefore_create
よりも先に実行される
Userモデルを作成して実行する場合に、英語の意味的にcreateしてsaveするんだからbefore_create
-> before_save
でしょーって勘違いしていて、ちょっとつまった。
最初はnewのタイミングで呼ばれると思っていたが、railsリファレンスにもある通り、モデルのcreateメソッドというのは、モデルオブジェクトを「生成して保存」するという行為のため、newしてsaveするのがcreateということ。よってbefore_save
-> before_create
の順番で行われる。
順番的には、
before_validation
after_validation
before_save
before_create
or before_update
after_create
or after_update
after_save
after_commit
モデルのnew_record?
がtrueの時はcreate, falseのときはupdateが呼ばれるということで。
forEachの中ではindexが利用できない(ラムダ式使用の注意)
Javaいじってて、ロジックは簡単だったので適当にfor文をforEach処理に変えていたときに発生した問題。
forEach中ではindexが使えません。
何かで取得できたような気がしましたけど"java forEach index"とかで検索すると同じことを考えていた先人たちが使えない使えないと大合唱。
//コンパイルエラー int i = 0; Arrays.asList("a", "b", "c").forEach( x -> System.out.println(++i + ": " + x);
以下のようにすれば一応は書ける。
int[] i = {0}; Arrays.asList("a", "b", "c").forEach( x -> System.out.println(++i[0] + ": " + x);
ラムダはラムダ内で完結してて状態を持たせないのが良いとのことなのでこのインデックスの取得も本当はあんまりよくないのかも。
ラムダのメリットとしてよく書かれるのが、
・記述が簡潔
・テストしやすい
・入力に対して出力が一意に定まる
などですが、記述がしやすいといっても、やっぱり複雑にFuctionを渡しまくっているものだと記述は短くても容易に読めないと思います。
その場合テストもしやすくはありません。
3つ目の 入力に対して出力が一意に定まる = 外部の状態をスコープ内に持たない
これが肝で、このためにテストしやすくなる等の恩恵を受けられるのかなと。
以上から、状態をもってきていないことが明らかにすぐわかる場合や状態を持ってきたい場合は従来通りfor文で良いのかなと思います。
10月発売のEffective Java 3rd Editionにもラムダの運用とかについても説明がなされることを期待しているので、発売待ってます。
めっちゃ久しぶりにrubyをupdateしようと思ったらいっぱいひっかかった
一年前にrailsでざっくりいじった程度でずっと放置してたrubyのバージョン上げとくかと思ったらめっちゃつっかかったのでメモ
Homebrewでbrew updateしようとしたら・・・
$brew update xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun Error: /usr/local must be writable!
まずCommandLineToolsがないってことなので
$xcode-select --install
次に権限がどうのこうのなので
$sudo chown -R $(whoami) /usr/local
これで意気揚々とやったら
$brew update /usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
brew pruneすればいいらしいので
$brew prune Pruned 0 symbolic links and 2 directories from /usr/local
$brew upgrade ruby-build $rbenv install 2.4.1 $rbenv global 2.4.1
なんとかできました。
[Eclipse]Tomcatが起動しないときの対処法[Mac]
MacでEclipseを使用してTomcatでサーバー立ててコーディングしてると、たまにTomcatを正常終了できなかったのか、
「ポート8080,8009が使用中です」みたいなエラーメッセージが出てTomcatが起動できなくなる。
再起動すればまた起動できるようになるのだが、いちいちするのもめんどい。
ということで探したのだけどWindowsではコントロールパネル使って停止するみたいなことを書いてあるもののMacだとなかなか見つからない。
で、どうやらTomcatをインストールしたフォルダ内のbinフォルダにあるshutdown.shを実行すれば良いらしい。
これでまた起動できるようになりました。