彷徨う園児ニア

主に備忘録。

複数行を読み込む時に空行を無視する

プログラミング問題で出てきて躓いたのでメモ。

 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_savebefore_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が呼ばれるということで。

pom.xmlに「ライフサイクル構成でカバーされていないプラグインの実行」というエラーが出る

m2e-aptというプラグインが必要とのことなのでインストールするも解決されず。

他にも色々試してみたが、
環境設定 -> Maven -> ディスカバリー -> カタログを開く
から、AspectJをインストールすると解決した。

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

Mac OS Sierraにするとなるとかなんとか。

次に権限がどうのこうのなので

$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]

MacEclipseを使用してTomcatでサーバー立ててコーディングしてると、たまにTomcatを正常終了できなかったのか、

「ポート8080,8009が使用中です」みたいなエラーメッセージが出てTomcatが起動できなくなる。

再起動すればまた起動できるようになるのだが、いちいちするのもめんどい。

ということで探したのだけどWindowsではコントロールパネル使って停止するみたいなことを書いてあるもののMacだとなかなか見つからない。

 

で、どうやらTomcatをインストールしたフォルダ内のbinフォルダにあるshutdown.shを実行すれば良いらしい。

 

これでまた起動できるようになりました。

Macでh2データベースを起動する

h2のデータベースの起動で戸惑って検索・・・

という作業を3回もやったので備忘録として書き残しておく。

 

  1. Macはh2をインストーラでインストールできないようなので、zipでh2ファイルをダウンロードしてくる
  2. zipを適当なフォルダに解凍
  3. ターミナルで解凍したフォルダ内のh2/binディレクトリに移動
  4. projectのlibraryにh2-x-x-xxx.jarをコピー
  5. h2/binディレクトリ内のh2.shを実行 コマンド ./h2.sh

とりあえずこれで起動できました。

[追記]library内のjarファイルをダブルクリックでも普通に起動できた