技術をかじる猫

適当に気になった技術や言語、思ったこと考えた事など。

Mac で ansible 基礎設定やってみた。

Ansible のことをちまちまやったので、その件メモ。
ネカフェでやってるんだけど、近くのネカフェは速度が遅すぎてこれ以上はちょっと厳しかった。

Install

と言ってもこれだけ。

$ brew install ansible

ちなみにバージョンは

$ ansible --version
ansible 1.9.2
  configured module search path = None

OSS でよくある話だけど、後方互換ってなくなるから…

セットアップ先環境

テストだから Vagrant で環境作った。
自分の環境は 1.7.1 で、バージョンアップしたらコマンド変わってるかもわからん。
あと、VirtualBox4.3.30 とちょっと古め。新しいやつ推奨かな。
環境もかなり適当に Cent6 を A list of base boxes for Vagrant - Vagrantbox.es から拾ってきた。

vagrant box add cent6.6 [https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box]
vagrant init centos6.6

成功したら、Vagrantfile というファイルが出来上がるので、ssh 用の設定を追加。

  # Create a forwarded port mapping which allows access to a specific port
  # within the machine from a port on the host machine. In the example below,
  # accessing "localhost:8080" will access port 80 on the guest machine.
  # config.vm.network "forwarded_port", guest: 80, host: 8080

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # ここの設定を有効化。サンプルでは下記のIP
  config.vm.network "private_network", ip: "192.168.33.10"

最後に vagrant up で起動する。

Ansible hosts 設定

ansible は基本的に専用の hosts ファイルで接続先を設定する。
mac で、Homebrew 経由の場合、/usr/local/etc/ansible/hosts に書いてある。

なんか指定しないと怒られる雰囲気だったので、下記のように指定。

[servers]
192.168.33.10

ここまできたら、まずは vagrant up を実行し、起動後に vagrant ssh-config --host vagrant >> ~/.ssh/configssh 設定を設定ファイルに流し込んでおく。
その後、~/.ssh/config を開くと、下記のような設定ができている。

Host vagrant
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/hoge/Documents/projects/play_2.4_activerecord/ansibles/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

重要なのは「IdentityFile」で、これを元に、下記のような定義を作っておく。

Host 192.168.33.*
  IdentityFile /Users/hoge/Documents/projects/play_2.4_activerecord/ansibles/.vagrant/machines/default/virtualbox/private_key
  User vagrant
  PasswordAuthentication no

これで設定完了。
一応 ssh 192.168.33.10 が通るかだけ確認しておくと良い。

続きを読む

LL Ring 行ったメモ

LLRing memo

第一試合 Ruby vs Perl vs PHP vs JS

Python はイベント衝突で不参加

Javascript

ECHMA Script 2015 が発表、ECHMA 6 が名称変更で、正式公開。
言語仕様の追加が行われてる。

JavaScript の仕様が変わるとみんな地獄をみる。しかし、ALT JS なんか結構出てきたんだ。
ES2015 では class, ラムダ式 なんかが入る。
Babel というプロジェクトで、新しい文法を書きつつ、ES5 以下のコードにコンパイルもできる。

モダンな書き方に移行しつつある。
let,val などもそうだが静的型に寄ってきた。
言語仕様として強制が大きい。

ここがすごい

世界で一番動いてるはず。
Acrobat reader にすら乗ってる(結構攻撃に使われるけどね)
地デジでも使われる。

全部 immutable なのはいいんだけどさ。

いまいち

数字の Number が浮動小数点なんだよね。
64bit 整数とか扱えないんだよね。
ES2015 から、整数演算のやりようができる…。

NaN に隠しデータを持たせることがテクニックとしてある。

この辺がいい

コンパイラのバックエンドをされたり、ソースマップ機能があるので、デバッグも容易。
ビット演算をすると、32bit 整数に変換される。
言語仕様を逆手に取るのが普通

PHP

PHP7 がそろそろ出る。
現在 RC2 で 11月に正式版が出る。

PHP7 で速度が倍!基本のデータ構造が変わる。
内部の構造が大きく変わったという話で、PHP コードはあんま変わんない。
C で書いた extention なんかが死ぬ可能性大。

ここ数年で、無名関数とか少しづつ入った。しかし、言語的に強制はしない。
一応 PHP7 から少しづつライブラリが変わる。

ここがすごい

ちょっと困っちゃう…。
追いついたと思うと、他のは先に行ってる…PHP は共和制だからなぁ。
カリスマ主導者ないよね

いまいち

非同期の扱いがないからなぁ。
言語仕様も貧弱だからなぁ。

この辺がいい

Perl

Perl5 が不定期更新だったが、年1度にバージョンアップに変わった。
Perl6 を今年のクリスマスに出す!(ラリー・ウォール氏)

Perl6 は完全に互換性がない。
ともかくたくさんの意味不明なオペレータがあるwww
内積をとるとか、配列のreduceをとるオペレータとか…
今回からクラスがきちんと入ってる。
文字列連結とか色々変わった。「.」から「~」に、「.」はメソッド呼び出しに変更。

基本的にバージョンアップで何も動かなくなる。 余計な言語仕様を削除していく方向も。

ここがすごい

機能が豊富。
パーサーを書く機能まで入ったし、言語仕様自体も改変可能。
Perl6 で書かれたVMで動いてる。

いまいち

Perl6 は遅いし、Perl5 はもう変化ないんだよね。
Perl5 の 100 倍遅い…。
最近 JIT 頑張ってる

この辺がいい

Perl5 でパーサーを自分のコードで乗っ取りができる。
まじ正規表現はダントツだよね〜。

正規表現で普通にパーサー書けるくらいだぜ。

Ruby

Ryby 2.0 が出たので、仕様変更は抑えめ。
クリスマスに 2.3 が出る。
最近は速度改善がメイン。
バイト列の扱いが大きく変わって一部が泣いた。

文字列リテラルが全部 immutable にするぞーとか言い部が騒いでる。

2.0 で古いのがっさーいった。
バイト列を自分で操作するのは止めましょうとかそういう方向。

ここがすごい

Rails があるところ!むしろ Rails のためのランタイムだ!
Bundler もすごいよ?

いまいち

JRuby とか羨ましい、ブラウザで動く JavaScript とかいいなぁ。
ネイティブエクステンションでひどいことになってるけどきれない

この辺がいい

C 拡張ライブラリが書きやすいし、ライブラリが一通り揃ってるからね。
PHP を dis るのに非常に便利?

質疑

JavaScript

問:typescript の機能は、ES6 にいつ入る?
ES7 が検討中で、どこまで入るか不明。
型は、Babel で対応しているし、今後それが普通になる。

JavaScript

問:node って JavaScript と仕様上何か影響がある?
これまで、ブラウザ依存の処理系だったんだけど、nodejs は純粋な言語仕様の世界。
そのおかげで、言語仕様としての論議が発展した感じがある。
ES6 で import とか入ってくる。モジュール化も仕様として入ってきた。

LL で MultiThread はどうなるかね?

  • JavaScipr: nodeJSどおよ?
  • PHP: 1リクエスト1レスポンスでしか考えない。
  • Perl6 : Thread は当たり前、でも fork はないかな?
  • Ruby : JRuby やれや、マルチプロセスでってのは課題。書けるけど、ライブラリへぼいか?GO で拡張ライブラリ書けるから、それでやるんじゃね?

言い残したこと

  • JavaScript : Babel やってよー楽しいぜ?
  • PHP : あんま愛を語ってないことか…早くなるのは楽しみか?
  • Perl6 : リリース直前!触ってて楽しいぜ?
  • Ruby : クリスマスに 2.3 出ます、そろそろまた会議あるので、提案出してください!
続きを読む

「AUひかり」で買ってきたルータを使うときの注意

まず、AUの課金の仕方がひどいと思った…とはいえ、建物がAU契約なのでほかの選択肢がなかなかなかったのだが、ともかくひどい。

  • 無線LANを使うには別契約が必要(追加課金)
  • 替えの性能いいルータをレンタルするなら追加課金

ルータすら契約上「貸与」で、もっといいルータ使いたかったら追加課金…

別にルータだけの問題じゃね?と思って、本日ヨドバシカメラBUFFALO WZR-1750DHP2/N を買ってきた。
契約 so-net で、PPPoE の設定も契約書に書いてあるので、全く気にしなかった。

で、問題が発生する。

ケーブルをすべて差して、電源を入れ、PPPoE 設定をしてもインターネットにつながらない事象が発生した。

("゚д゚)ポカーン

そこで解決のために行った変遷は以下の通り。

  • ともかくいろんな設定項目も見直す → どれも標準的に PPPoE 設定がされている
  • 同じルータでPPPoEした人の資料見る → ほぼ一致
  • 前のルータ(au から貸し出されてるやつ)の WebAdmin を調べる → PPPoE 設定が項目としてない(!?)ってことはルータ自体がカスタムされてる?
  • ルータの型番からググって、ドキュメント見つける → どうもベンダー側で設定してレンタルに出している模様
  • ルーター自体 au ひかりにくっついてる? → 検索ワードに「au ひかり」を追加

そして見つかった答え。

www.iesod.com

そしてそこにあった原因を見て呆然とした。

ルーターMAC アドレスを認識して、弾くようになっている」

俺、引っ越したら絶対 au 使わないんだ…。

そう言いたくなる作りである。
ただでさえ挫折する人が多いルーターの、MAC アドレスまで見て、指定以外のルーターを蹴ってる(屋内端末のほうだと思われ)ようだ。

幸い、「BUFFALO WZR-1750DHP2/N」は MAC アドレスを変更する機能があったから良かったようなものの、まさかルータの機能どころか、ルータ自体まで人質にして金をせびる体質だとは恐れ入る。

尚、デフォルトルータにはセキュリティホールがあり、こんな告知 がされている。
どう見ても CSRF 攻撃です、本当にありがとうございました。

なんかもう紹介せざるを得なかったScala記事「バカ向け言語Scala」

まともにモジュール化設計もできていない保守不能糞コードの設計者を「エリート様」と皮肉って、「バカな私は、シンプルさを求めたScalaを使う」と言う記事。

センスに溢れて「いいぞーもっとやれー」と応援したくなってしまいました。

rirakkumya.hatenablog.com

では、ここで真面目に補足もしておきたい。

シンプルに書くのはバカにはできません

シンプルに書けるよう設計するというのは、実は相当難しい。
以前紹介した「ReadableCode」なんて書籍が書けてしまうくらい、可読性を高く、可能な限り多くの人が保守できる設計というのは実はかなり難しい。

KISSの原則 - Wikipedia

では逆に「シンプルにしていない者こそバカ」と言い切ってる。

タイトルに反してScalaはバカ向けなのか?

もちろんここの「バカ」は 「Coboler のようなエリート様」と対比するための皮肉なのは百も承知だが、それを脇に置いておいたとしても、Scala を真面目に理解してそれらしく書くのはきっとバカには無理じゃないかと思う。

よく入門書として使われている、コップ本 なんかは有名なのだが、これもなかなかの厚さを持っている。

つまり学習コストはそれなりに高い。

  1. JVM システム同様に、オブジェクト指向を強要する
    何を今さらと言われるかも知れないが、業界で働いていても「オブジェクト指向の3点セットは?本質は?」で躓く人は結構多い。
    技術ブログ書いてたり、勉強会行く人間には「何を今さら」なレベルなのだが、現実問題一つのハードルと考えていいハズだ。
    まして ScalaJava よりもオブジェクト指向が徹底している。
  2. 関数型の思考もそれなりに要求する
    関数型の思考で最たるものは、「関数」が第一級オブジェクトであるという考え方だ。
    「関数というオブジェクトを作成して、定数、変数、引数、返値にしたうえ、その先で実行できる」という事を理解すること。
    実は JavaScript もその意味では関数型なのだが、この思考も一つのハードルになる。
  3. 豊富なコレクションメソッド
    どちらかというと関数型言語の真価の一端といった方がいいかもしれないが、
    Scalaコレクションメソッドメモ(Hishidama's Scala collection method Memo)
    使いこなせ…というのは酷だとは思うが、何かに触れ「そういやこんな事ってできたような…」と思って調べようと思えるくらいの全容把握にどれくらいかかるか?

基礎レベルですらこれだ
また、省略可能な規則の把握、DSL の設計等も含めて、果たしてそれがバカにできる事だろうか?

それにより、海外の企業向けソーシャルを行っていた Yammer (現Microsoft傘下)は、Scala の採用をやめてJavaに移行し始めた。

言語としてのScalaは興味深い特徴を持っている。しかし、とても複雑な言語でもある。 Scalaがもたらす概念や実装に加えて、自然なScalaを書こうとする文化がある。これを突き詰めるとある時点でベストプラクティスが現れる。それは、コミュニティを無視することだ。 後になって気付いたことだが、私はScalaを学ぶこと(教えること)の難しさと重要さを低く見積もりすぎていた。というのは、Scalaの経験のある開発者を雇うのは不可能だからだ。これは思ったよりも遥かに大きな問題だ。

内容は 2011 年のもので、今と情勢が違うのは間違いないが、要するに

  • 学習コスト高くて、きちんと使うのはなかなか難しい
  • そもそも Scala エンジニアは数が少なすぎて雇えないから、チームの習熟には余計にコストがかかる

という話だ。

求人を見ると Scala エンジニアの募集は速攻で見つかる。国内なら尚更だ。
逆を言えば

それだけ Scala が使えるエンジニアが足りてない

という事の裏返しとも言える。

バカでも使えなくはないScala

正確にはこう言うべきかもしれない。
Java っぽく書こうと思えば書けるし、関数型っぽく書けると言えば書ける。

独習 Scalaz — 独習 Scalaz

とも書く、書いて動かすだけなら、(静的型の割には)凄まじく自由に書ける。

しかし、使いこなそうと思ったら、本にして人を殴り殺せそうな量の仕様を把握する必要がるということだ。

でもやってみればそこまで恐れる程でもないよ?

とってつけた(ホントそう)ようで申し訳ない。散々脅しておいてなんだが、言うほど怖い話でもないんじゃないかと思う。

要は、毛嫌いせずにやってみればきっと気に入る言語だってレベルの問題でしかない。

学習コストといっても、言語使用の数は Ruby の学習コストとそう変わらない。
むしろ静的型の制約が入る分、Ruby より楽かもしれない。

Java/Scala 比較。一定期間の曜日ごとの購買集計

単純なお題。

標準出力から、日数と、その日数に応じた日々の購買金額が入力されたとき、曜日ごとの集計額を計算しなさい。 ただし日数は 7 の倍数であることが保証され、曜日の先頭は日曜日である。

入力例:

14 日間を指定、各日付の購買数は、下記の通りの場合 7,8,9,10,11,12,13 3,9,8, 7, 7, 1, 4

14
7
8
9
10
11
12
13
3
9
8
7
7
1
4

出力例:

10
17
17
17
18
13
17

これを満たすプログラムを書く。

続きを読む

Play2.4 の DI を弄ってみる

まず適当に Singleton アノテーションをくっつけて使用する。

package utils.modules

import javax.inject._

/**
 * アクセスカウンター
 */
@Singleton
class AccessCounter {

  @volatile private var price = 0

  def add(p: Int) = price += p
  def get = price
}

そしたらコントローラでそれを Inject で利用する。

class Application @Inject() (accessCounter: AccessCounter) extends Controller {
  def index = Action {
    accessCounter.add(1)
    Ok(views.html.index(s"CurrentCount is ${accessCounter.get}."))
  }
}

凄まじく単純な使い方だ。

続きを読む

Playframework 2.4.x でセキュリティヘッダの設定など

まず前提として、Playframework にはフィルタという機能がある。

Playframework 2.3.x 以下の場合は、Global オブジェクトにミックスインする形式をとっていた。

ScalaHttpFilters

だが、Playframework 2.4.x 以降は、DI も含めて形式が変更となり、root パッケージに、Filters クラスを配置する形式に変わった。
名称の変更方法などは、公式を見て欲しい。

ScalaHttpFilters

そもそもが 2.4 のロードマップに、Global を廃止して、Plaggable である事を謳っているので、この方針変更は移植の時注意すべき点だろう。

で、実装方法については、下記の操作を行う。

標準で用意されているヘッダーを使う準備

まずは、./build.sbt の libraryDependencies に filters を追記する。これには Cross-Origin Resource Sharing Filter, GzipFilter, SecurityHeaderFilter 機能が入っている。

libraryDependencies ++= Seq(
  filters,
  jdbc,
  cache,
  ws,
  specs2 % Test
)

Filters.scala の実装

次に、Filters を作成して、フィルタの実装を行う。
今回は Gzip と Security だけ適用してみる。

import javax.inject.Inject

import play.api.http.HttpFilters
import play.api.mvc.EssentialFilter
import play.filters.gzip.GzipFilter
import play.filters.headers.SecurityHeadersFilter

/**
 * Example filters.
 * Created by azalea on 2015/08/23.
 */
class Filters @Inject() (gzipFilter: GzipFilter,
                         secure: SecurityHeadersFilter) extends HttpFilters {

  val filters: Seq[EssentialFilter] = Seq(gzipFilter, secure)
}

なんとこれで設定は完了。

続きを読む