ux00ff

ビールとプログラミングと

StreamのGroupByは一度最後まで探す

実装がこうなってるので仕方がない。無限Streamに使うと倒れる。

動作として、GroupByした結果もStreamになって欲しかった気もあります。新しいグループキーが現れたらストリーム増える的に。

  def groupBy[K](f: A => K): immutable.Map[K, Repr] = {
    val m = mutable.Map.empty[K, Builder[A, Repr]]
    for (elem <- this) {
      val key = f(elem)
      val bldr = m.getOrElseUpdate(key, newBuilder)
      bldr += elem
    }
    val b = immutable.Map.newBuilder[K, Repr]
    for ((k, v) <- m)
      b += ((k, v.result))

    b.result
  }

Docker for Mac のコンテナの中からホストにつなぐ

結論

Guest to Host はけっこうみんな苦しんでいるらしい。

Docker for MacLinux VMが間に挟まっているので期待した感じに動かすのが大変。ホストというか Mac を発見できれば良いので、--add-host を指定して代替する。linkと大差ない使い心地になる。

具体的には

# 手元で en0 を普段使っているからこうしているが、
# プライベートIP調べて直接設定して良い
PRIVATE_IP=$(ifconfig en0 | grep "inet " | awk '{print $2}')

docker run --add-host CONTAINER_HOST:${PRIVATE_IP} myContainer 

こうすると、立ち上がったコンテナの中では CONTAINER_HOST って名前で指定したIPアドレスにルーティングされるようになる。これでローカルホストに立てたサービスにDockerコンテナ内からアクセスできるようになる。べんり。まあ外回るけど。大事なのはコンテナ内で決まった名前で解決できることだ。

implicit parameter として引数と戻り値が同じ型の関数型を指定するとコンパイルが通らない

Mac OS Sierra / scala 2.12.1 にて。結論から言えば、Predef で定義されているものとコンフリクトするので、自前で利用する implicit parameter にはちゃんと固有の型をつけなさいって話であり。

タイトル通りの現象にひとしきり悩んだ

以下のような test.scala を用意する。

implicit val intToString = (a:Int) => s"string ${a}"

def lovelyIntAndString(implicit f: Int => String) = f(10)

println(lovelyIntAndString)

で、スクリプトモードで実行すると、想像通りの動作をするわけです。

$ scala test.scala
string 10

lovelyIntAndString メソッドが、implicit parameterとして、同じスコープに存在する intToString を拾って動作しています。

これが、メソッドのシグネチャInt => Intにすると、コンパイルが通りません。以下は test2.scala として作成したサンプル。

implicit val intToint = (a:Int) => a

def lovelyInt(implicit f: Int => Int) = f(10)

println(lovelyInt)

これを同様に実行すると、

$ scala test2.scala
/Users/ma2saka/Developments/test.scala:5: error: ambiguous implicit values:
 both method $conforms in object Predef of type [A]=> <:<[A,A]
 and value intToint of type => Int => Int
 match expected type Int => Int
println(lovelyInt)
        ^
one error found
続きを読む

docker 17.06 の仕様変更に伴う aws-cli の動作変更

docker login 時に -e オプションを取らなくなったよ、ということで。

# docker 17.06より前
aws ecr get-login

# docker 17.06以後 ( aws-cli 1.11.91 以上が必要)
aws ecr get-login --no-include-email

こうなるのでヨロシクってメールがAWSから来ていた。というメモ。

メールで「 [Action Required] Docker Email Flag Removal [AWS Account: hogehoge]」ってきたから一瞬びびった。確かに、メッセージさらっとしか見てなかったけど今確認したら、docker 17.03 ではログイン成功したって表示のあとにさりげなく Flag --email has been deprecated, will be removed in 1.14.って書いてる。

sbtのバージョンを確認する

いつも忘れるので。

うまくいかない

$ sbt version

versionサブコマンドはsbtのバージョンではなく、現在のプロジェクトのバージョン値を返す。だいたいホームディレクトリで間違って打っちゃって、最初は1.0-SNAPSHOTって表示され、気がつくとホームディレクトリに projects/ とかできていることに気がつく。

うまくいかない

$ sbt --version

そんなオプションねーよと怒られる。-versionとか-Vとかたいてい試す。全部ダメ。

正解

$ sbt sbt-version

ということで、sbt-versionサブコマンドが正解。

> sbt-version
[info] 0.13.15

MindNode2

マインドマップツールが欲しかったので導入しました。

f:id:ux00ff:20170511121106p:plain

もともとFreeMindを使っていましたが、仕事で使うってこともあるしちゃんと業務用として使っているツールについては開発元に還元せねばという気持ちが最近強く。製品版なら課金はするし、GitHubにあるライブラリとかなら・・・えっと、Starを細々とつけたり? なるべくコントリビュートしたいとは思いますが、なかなかできていないのが実情で、いやそれはともかくとして。

ツール類は1000円超える価格帯だと妙にゴテゴテしてたりするのがありますが、MindNode2はそういうこともなく。シンプルできちんと動くツールとして重宝します。レビューで日本語がうまく入力できないとか書かれてたりしますが少なくともうちの環境では問題なかったです。macOS 10.12.4 Sierraと標準の日本語入力の組み合わせですね。

とりあえず以下のショートカットさえ使えればすぐに使い始められるシンプルさが大事です。

機能 キー
新しい子ノードを追加 Tab
新しい兄弟ノードを下に追加 Enter
新しい兄弟ノードを上に追加 Alt + Enter
ノードのテキストを編集 Command + Enter
兄弟間の位置の変更 Command + ↑, Command + ↓

日常的に使うツールはこのあたりの操作が直感的でないと辛いところ。どんなに高機能でも人は使い慣れたツールに戻っていくんですよ。そう、秀丸とかに。