Kuchitama Tech Note

はてな記法がいつまでたっても覚えられないので、はてなダイアリーからマークダウンが使えるこっちに引っ越してきました。

AWS LambdaでScalaを使ってみたんだが

こんな記事を書きました

qiita.com

とても気になっている問題があります。

それが、AWS Lambda Deployment Limits です。

docs.aws.amazon.com

項目 デフォルトの制限
Lambda 関数デプロイパッケージのサイズ(.zip/.jar ファイル) 50 MB
リージョンあたりの、アップロードできるすべてのデプロイパッケージの合計サイズ 75 GB
デプロイパッケージ(非圧縮 zip/jar サイズ)に圧縮できるコード/依存関係のサイズ 250 MB

こういう制限があるけど、Scalaコードは、Scalaの標準ライブラリとかjarに含まれるはずなので、Javaで書くよりもjarのサイズは大きくなるはず。 この影響がどれぐらいかというのを調べてみました。

実験

とりあえず、シンプルなサンプルとして、Serverless Frameworkで create しただけのjarのサイズを見てみます。 Serverless Frameworkについては、Web+DB PRESS vol.95 で取り上げられてたので、読むといいと思います。

WEB+DB PRESS Vol.95

WEB+DB PRESS Vol.95

$ sls create -t aws-scala-sbt
$ sbt assembly
$ ll target/scala-2.11/hello.jar
-rw-rw-r-- 1 k2 k2 15M 10月 29 00:58 target/scala-2.11/hello.jar

ということで、 15MB のjarができました。 この時点で既に 50MBの 30% を消費しています。

ちなみに、冒頭の記事で最終的に作成した、依存関係に skinny-json を追加したバージョンのjarのサイズを見てみます。

qiita.com

$ sbt assembly
$ ll target/scala-2.11/hello.jar
-rw-rw-r-- 1 k2 k2 37M 10月 31 12:48 target/scala-2.11/hello.jar

なんと、 37MB まで増えました。

実に上限の 74% です。

もう少し調べます。

AWS Lamdaでは、zip/jarの展開後の容量も制限があって、250MBに収まっている必要があります。

$ mv hello.jar hello.zip
$ unzip hello.zip

$ du -hcd 2    
15M     ./models
24K     ./hello
108K    ./com/thoughtworks
17M     ./com/amazonaws
5.2M    ./com/fasterxml
22M     ./com
60K     ./skinny/util
64K     ./skinny
184K    ./mozilla
2.0M    ./software/amazon
2.0M    ./software
16K     ./META-INF/services
188K    ./META-INF/native
344K    ./META-INF
12K     ./scala/compat
20M     ./scala/reflect
720K    ./scala/sys
68K     ./scala/ref
52M     ./scala/tools
128K    ./scala/annotation
868K    ./scala/math
15M     ./scala/collection
2.3M    ./scala/xml
80K     ./scala/text
900K    ./scala/concurrent
44K     ./scala/beans
2.5M    ./scala/util
1.2M    ./scala/runtime
196K    ./scala/io
97M     ./scala
3.7M    ./org/joda
5.0M    ./org/apache
2.9M    ./org/json4s
12M     ./org
148M    .
148M    合計

skinny-jsonを追加した状態で、展開後のファイルサイズは合計148Mでした。 250MBの59.2%ですね。こちらも制限の半分を超えています。 やはり、./scalaが 97M と大変ボリュームがあります。

油断してライブラリを追加してしまうと、あっという間に上限に迫ってしまいそうです。 気持よく開発をつづけてたら、突然デプロイに失敗する危険があります。

依存関係の追加は計画的に行いましょう!!

ちなみに

aws-java-gradle テンプレートで build したzipのサイズ

$ sls create -t aws-java-gradle
$ gradle build
$ ll build/distributions/hello.zip 
-rw-rw-r-- 1 k2 k2 7.9M 10月 28 14:41 build/distributions/hello.zip

こちらは、 15.8% ですね。

Windows10 Aniversary Updateでデュアルブートしてるubuntuのパーティションが削除されなかった

事の発端

仕事用のマシンを、デュアルブートでUbuntu16.04 を使っているので、これがマジだと結構困ったことになります。 というわけで、色々調べてみました。

また、一応デュアルブートをあきらめて、Windows上でbashを使うことも検討してみました。

悪くない感じはするんですけど、Javaが動かないのは業務的に困るので、こっちに頼るのはやめました。

最終的に、GRUBが上書きされるだけだ、という情報を信じることにして、アップデートを決めました。 その結果。。。

というわけで、問題なくAniversary Updateが適用できました。

アップデートにビビってる方、えいやっとやっちゃっても大丈夫かもしれません(責任は負いかねます)

Ubuntuの更新でVirtualBoxと無線LANが死んだ…

先日、Ubuntuのソフトウェアアップデートを行ったら、無線LANVirtualBoxが動かなくなりました。 かなり、ハマりにハマってなかなか治らなかったんですが、3日費やしてようやくちゃんと動くようになったので、備忘録的にまとめておきます。

問題が発生したマシンは DELL XPS13 で、ubuntuのバージョンは 15.10 と 16.04 です。

VirtualBoxは 5.0 と 5.1 で問題を確認しましたが、4系でも同様のはずです。

原因

直接の原因は、アップデートでlinux-kernel がバージョンアップして 4.4.0-31-generic になったためです。

このバージョンのカーネルUEFIのセキュアブートが、どうやら相性悪いようです。

このバージョンのカーネルを使っている状態で、セキュアブートが有効になっていると、 module が有効化できないという問題が発生していました。

そのため、 wlvboxdrv が有効化できませんでした。

対応

有効化するには、ubuntuを再起動して、起動時に boot menuを開きます。

SecureBootの項目があるので、そこで disable してやればOK

これで無線LANは認識されるはずです。もし、無線LANが認識されないようであれば、 sudo modprobe wl すればいいはず

VirtualBoxについては、多分セキュアブートを無効にしてからVirtualBoxをインストールすれば問題ないはずです

本当は、下記の情報を参考に MOKを登録してやれば、 vboxdrv を認識できるようになるはずなのですが、私の環境でうまく動作しませんでした

askubuntu.com

SecureBootとMOK(Machine Owner Keys)は下記がわかりやすいです。

技術者見習いの独り言: SecureBootとLinuxorumin.blogspot.jp

以上、ざっくりしたメモ書きでした

参考資料

www.lifeboat.jp

qiita.com

新しいLinuxの教科書

新しいLinuxの教科書

フロント苦手な私にはFrascoが最高のツールだった件

先日のRuby関西で紹介されてた Frascoというツールがとても良さげに感じたので、帰って早速使ってみました。

Frascoとは

Quick starter project for Jekyll including full setup for gulp, Sass, Autoprefixer, Bourbon/Neat/Bitters, Webpack, Imagemin, Browsersync, etc.

だそうです。 要は、JekyllでWebサイトつくるときに、便利なツール類まとめておいたから、さくっと始められるよ。ってことです。

DojoCon JapanのサイトもFrasco使ってるそうです。

Frascoの使い方

とりあえず、 jekyllnpm のインストールは必要です。それぞれ、自分のマシンにインストールしておいてください

それさえあれば、あとはFrasco公式ページに乗っている通り、 Frascoをcloneして、 npm install, npm start すればすぐに利用できます

$ git clone [https://github.com/ixkaito/frasco.git:embed]
$ cd frasco
$ npm install
$ npm start

Frascoのいいところ

  • さくっとブラウザで確認できる
  • デフォルトでイケてるCSSフレームワークが導入されてる

さくっとプラウザで確認できる

npm start するだけで、Jekyllがビルドされてブラウザで確認できます。 sassなどの変更も見てくれるので、かなり快適にページ制作ができます。 とても便利で感動しました。

デフォルトでイケてるCSSフレームワークが導入されてる

これは、 Burbonと Burbon Neat がイケてるってことなんですけど、使いやすくて良いです。

sassファイルの変更も検知して、リロードしてくれるので、コーディング -> 確認の流れがスムーズで快適でした。

Frascoのイマイチなポイント

Frascoを軽く触ってみて、改善したいなと思ったポイントを挙げます。 対応できそうなものは、週末にでもPR投げると思います。

  • Jekyllのバージョンが開発環境に依存
  • プロジェクトのGit管理しづらい

Jekyllのバージョンが開発環境に依存

Frascoでは、gulp を通してjekyllのコマンドやその他のタスクを実行しています。 そのために、ローカルマシンの Jekyll に依存するのは、仕方ないのですが、プロジェクト内に Gemfile などが用意されているわけではないので、Jekyllのバージョンなどの管理は完全にユーザ依存になっています。 複数人でサイトを管理するときに、(CIサービスなど使わなければ)各自のマシンのJekyllバージョンに依存することになります。

これは、ユーザ側で好きに Gemfile を用意すればいいだけのことではあるんですが、Frasco側で推奨Jekyllバージョンみたいなのを用意してもいいんじゃないかと思いました。

プロジェクトのGit管理がしづらい

Frascoはサクッと開発できて便利なんですが、今のところFrasco本体のGitリポジトリを clone してその中で、開発を行います。 そのため、制作しているサイトを自分でGit管理するために色々と作業が必要でした。

  1. .gitディレクトリを削除
  2. git init を実行
  3. リモートリポジトリを用意して、 git remote add する
  4. git commit, git push を実行

あとは、必要に応じて READMEやpackage.json を書き換えます。 READMEは全部書き換えるだけでいいですが、package.jsonは内容を見て、部分的に書き換える必要があります。 大体、package.json 内の次の項目を書き換えるといいでしょう。

  • name
  • version
  • description
  • repository
  • keywords
  • author
  • bugs
  • homepage
  • license

これは、Frascoをcloneして使うのではなく、 yo などで、プロジェクトの雛型を吐き出すようにすればいいんじゃないかと思います。 私自身はyoでテンプレートを作ったことはないのですが、少し勉強してできればPR投げたいなと思っています。

Frascoで作ってるもの

なにがタイムリーだったかって、ちょうどいい加減去年の大都会で宣言した A Tour of Go のScala版作るの真面目に取り組もうとしてたからです。

Jekyll使って作ろうというのは、なんとなく考えてたんですが、フロント開発が苦手で着手が先延ばしに鳴ってましたが、Frascoあれば雛型が出来上がってるので、重い腰がすっと上がりました。 これから、マジメに作ります。

Ruby関西勉強会で登壇してきました #rubykansai

先日開催された第73回 Ruby関西に参加してきました。

Ruby系の勉強会に登壇するのは初めてだったので、アウェー感を感じつつも、楽しい1日を過ごしました。 まぁ、着ていった服のせいでアウェー感がましてた気もします

発表内容

発表資料はこちら。

Scalaプログラマの私がRubyRuby on Railsを触った時に感じた違和感などを紹介しています。

自分の発表以外は、ゆったりと話を聞いてました。

今回は発表本数が多くて、楽しめました。

RedDotRubyConf

シンガポールで開催された RedDotRubyConf の模様を紹介して頂きました。 RedDotとはシンガポールの愛称だそうです。 世界地図上で見た時にシンガポールが国土が小さくて、点(Dot)の様に見えることと、国旗の色からつけられたそうです。

以下、気になった点のメモ

  • シンガポールはみんな英語と中国語が話せる
  • 発表内容は日本のRubyKaigiに比べてゆるめで、コワイ感ない
  • 料理美味しい
  • 教育水準高い

SciRubyプロジェクトの紹介

Rubyをデータ解析に活用できる様にするSciRubyプロジェクトの紹介。

気の長い話に聞こえましたが、そもそもPythonもRが出てきてから、後追いで現在のデータ解析に強い言語としての地位を築いたそうです。 負けるなRuby!!

Jekyll Starter Project: Frasco

Jekyll を 便利に使うために Frascoというツールを作られたそうです。 めっちゃ便利そう! Jekyllを始めるためにあった方がいいものが、全て最初に用意されているので、さくっとページ制作を開始できそうです。 これは、ぜひ触ってみたいです

登壇中に、発表者の @ixkaito さん作 Worker の GithubStarが300突破してました。おめでとうございます!!:embed]

RubyからC#を扱う

誰得なんだ、とか思いつつ聞いてました(すいません) 内容は、タイトルの通りのことを実現するための、ライブラリを開発されたそうです。

個人的には、内容そのものよりも、マイクロソフトが最近取り組んでいるオープン化が、実際身の回りにまで影響を及ぼしたことが感慨深かったです。 てらだよしおさんの話や、色々なイベントレポートで、マイクロソフトオープンソースに舵を切っていることは知っていましたが、地方の全くMS関係ない勉強会にその取り組みに絡んだ内容が出てきたのは、成果の現れと言えるんじゃないでしょうか

わたしが Rails Girl になるまで

cherry.rb オーガナイザーの との さんの発表。 今年の初め頃に cherry.rbには何度か参加してたんですが、今こんなことになっているとは

gemの話

gemについてのちょっとしたノウハウとか、おすすめgemとかでした

冒頭で、Gem作ったある人がどれくらいいるかアンケートしてました。

公開したことのある人もアンケートしたら良かったんじゃないかな?

2対のMVC (Double MVC)

GUI(React/Flux) と Web(Rails)でそれぞれにMVCを持ち、サービス開発するハンズオン

サービス全体を通してアーキテクチャの設計をする人には、非常に参考になると思います

資料がすごく長いけど、少しずつ進めていけばちゃんと理解できるはず

Ruby 初級者向けレッスン - Array と Hash

Ruby関西お馴染みの初心者向けレッスン なんですけど、たまたま座った席がcherry.rb勢が固まってて、レッスンせずに雑談してました(すいません)

最後に出てきたジョーク回答面白かったです

感想

ホントは懇親会行きたかったんですが、夏風邪のため体調優先で帰りました。 もっとRuby界隈の人とも交流していきたいので、また次回も参加したいと思います。

Cherry.rbでRails5やってみた

最近、仕事でRailsを触らずを得ない感じになってきたので、本格的にRailsの勉強をはじめました。

そしたら、ちょうどRailsもくもく会があったので、参加してきました。

cherryrb.doorkeeper.jp

やったこと

このもくもく会では、毎回題材が決まってるっぽいです。

今回の題材は、Rails APIを試すでした。

で、僕もこれやるつもりだったんですが、 Railsは5年以上触ってないって 主催者の一人の tono さんに話したら、 「こっちのチュートリアルがいいよ」と教えてもらえたので、 チャットアプリを作りました。

qiita.com

やってみた雑感

とりあえず2時間もあれば、ある程度動くものができる、しかもリアルタイムに更新されるから気分がいい 課題でした。

ただ、前提として Rails5に組み込まれた ActionCable / WebSocket を体感するためのサンプルなので、これでRailsの知識や力が身につくかというと、 まったくそんなことは無い です。

このサンプルは次にマッチする人には良さそうですが、僕にはマッチしませんでした。

  • Railsをこれまで触っていて、WebSocketについて知りたい人
  • Webアプリ開発初心者で、とりあえず動くものを作ったというモチベーションが欲しい人

このどちらかに当てはまる人にはいいんじゃないでしょうか?

つまったこと

基本的に、記事の通りに書いて動かしていけば、問題なく動きました。

唯一、Google先生に頼ったのは、次の問題。

stackoverflow.com

どうも、uglifier が JSを圧縮するために、 node を使ってるらしい

qiita.com

その時に思わずつぶやいたのがこれ

あとは、動かすぶんには問題なかったけど、とりあえず動かしただけで調べないといけないことがあるのでメモ

Redisの役割

Redisは概要ぐらいは知ってるものの、今回の実装の中でいつの間に使ったのかわかりませんでした。

あまりにもよしなにしてくれるので、役割が見えませんでした。

ActionCableが使ってるのか、 ActiveRecord が使ってるのかだと思うんですが、適当なときにちゃんと調べようと思います。

もくもく会の感想

会場が会社から近いし、ほどよくゆるい雰囲気なので、次回も参加しようと思います。

ある程度、Web開発の知識がある人向けに、Railsの勉強するお題があればだれか教えてくだしあ

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)

パーフェクト Ruby on Rails

パーフェクト Ruby on Rails

slick3 で sql in を書く

最近仕事でSlick3を使ってますが、 SELECT * FROM hoge WHERE hoge.id IN (1, 2, 3) 的な書き方が最初わからなかったのでメモ。

SQLパターン

SQLではどうやらListを扱ってないらしい。 というのを、 id:tarao さんのこの記事で知りました。

d.hatena.ne.jp

へぇ、そうだったのか。 taraoさんには、Scala関西Summitで発表していただいたし、 bullet-scala 面白そうなので、今のプレジェクトに突っ込むかもしれないと思いつつ、勉強させて頂いてますが、 IN のことは知りませんでした。

github.com

liftedな書き方パターン

Scalaらしいモナモナした(?)書き方でやるとき。 今のプロジェクトではこっちでやってます。

こういうやつ↓

db.run {
  hoges.filter(id = 1).result
}

これで、SQLIN を使うには、2通りあるらしい。

一つは、SQLのサブクエリを評価するとき。これには in を使う

db.run {
  hoges.filter(id.in(fugas.map(_.hogeId))).result
}

もうひとつ、 Scalaのコレクションを利用するとき。これには、 inSet という関数が用意されてる。

val hogeIds = List(1,2,3)
db.run {
  hoges.filter(id.inSet(hogeIds)).result
}

これ、公式ドキュメントに普通に載ってるんですが、Querysのページばっかり読んでて、見つけるまで時間がかかってしまいました。

http://slick.typesafe.com/doc/3.0.3/sql-to-slick.html