技術をかじる猫

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

「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)
}

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

続きを読む

LoT LT行ってみた(追記)

iotlt.connpass.com

みっけたのでリンク

メモだけざっくり。 整理はしない。

キーワードだけ拾えればいいかな的な発想。

前段

IoT Letter というサイトがある。 IoT 関連書籍やイベント、記事ソリューション等を中心に情報を集約してる。

dots.

会員制で、8月中は無料らしい。

イベント会場、もしくは working space としての貸し出し。 飲食可能で、wifi 電源完備。 ホワイトボード、モニターの無料貸し出しをしている。 コミュニティや有志の勉強会時の貸し出しは無料。

IoTメーカーに求められること:サービス化 佐藤 氏 @ Qrio

ものだけではなく、物事も含まれると考えられる。 人にできない事を、もの同士のつながりを経て自律的に動くべきだ。

ホームオートメーションの会社です。

Qrio :スマートロック。スマートフォンで鍵を開ける。LINE や Facebook で鍵を共有できるとか。

ソリューションを提供できる。例えばGEがジェット機のエンジンをサブスクリプションで販売したりとか。 離陸から着陸までを課金してる。

IOT はサービス提供の時代ではないか?

モノのMASHUPで作る ✄ ちょっぴり未来の生活 五十嵐 氏 @ Ladicle

ガジェットオタ!

朝Hueが部屋をゆっくり明るく RassberryPi が勝手にカーテンを開ける VoiceText + WebAPI で予定を読み上げ IR Kit + Lift で出社と同時に家電が消える

17:00 にエアコンが自動起動 netatmo + IFTTT Wifi の SSID 検出で居室に入った瞬間に電気がつく

Fitbit で血圧見て、0 時過ぎに寝落ちしてたら消灯

いろいろできる

CDNのマルチプロトコル対応にして 鍋島 公章 氏

IoMT という言葉。 Internet of multimedia things. IoT のマルティメディア対応。 カメラやマイク、映像や音を扱う。

Medical とかいろいろあるけどね〜

カメラ 画素数が一気に進化、マルティメディア分析(声紋とか。個体数認識とか)、ユースケースとしても、気象認識とかもできる。 防犯カメラも、カメラタグでモーションJPEG変換して、トランスコードでH264にでもして、gateway経由で、BaaS に投げるとかできる。

やろうぜ!おうちハック 木村 氏 @ リノベる / 大和田 氏 @ SONY CSL

「萌え家電」出した。 いろいろネットでできるように家電を改造する=おうちハッカー

Kadecot なんてものも出してる。

やろうずおうちハック!

入ってください「おうちハック同好会」

JS Board Shibuya立ち上げました(仮) 川野 氏 @ テクニカルロックスターズ

milkcocoa やってるひと JavaScript で動くデバイス = JSBoard

JSBoard-Shibuya = みんなで集まって javascript でいろいろいじってみる勉強会

全てのデバイスが JS で動けばいいと思う。

8pino とか弄ってる最中。 hako.js とか。 johnny-five とか

助け合うコミュニティです。

Tech in Asia IoT Business Campについて(仮) 伊澤 氏 @ ハタプロ

シンガポール拠点の IoT 共同イベント。 初心者歓迎 定員 50人までの少人数制。 2day の IoT 起業を体験。

IoT 推進企業が金出してる。

続・NFCおじさん(仮) 山本 氏 @ バニーホップ

nfcpy 0.10.0 ではまった話。

オムロン体温計とか NFCで通信できるらしいという声で試してみた。 でも、通信内容が非公開。逆汗は法的にアウトだからね。

nfcpy のマイナーバージョンが変わった。 Suica 履歴を取得するとかだいぶ変わった。

NFCタグのパスワード認証に対応したとか、Type4B (運転免許所)とかに対応。

がっつりソースが変わってる…。 代わりにかなり細かい制御ができるようになったけどね。

なんでバージョンアップですげーはまります。

9軸センサー+BLEを搭載したArduino互換のスポーツセンサーボード Q.board のご紹介 平野雄一 氏@リクルートマーケティングパートナーズ

3cm x 2cm サイズのボードで、9軸センサー。 スポーツ関係でよく使える。

Arbuino 環境をそのまま使える。

BLE でデータを飛ばせる。CPU に浮動小数点演算ユニット持ち。

CPU 64MHz 8MB Strage

義足に組み込んだり、リハビリアシスト装置に突っ込んだりしてる。 バーチャル人形とか、ゲームに使ったりとかしてる。

フリスクでBLEアプリを作ってみた 呉屋寛裕 氏@ニフティ株式会社

FRISK に REBL600FR 突っ込んで使える。 BLE インターフェースがある。

組み込みはいがいとやってみりゃできる。

感情インタラクション のびすけ 氏@LIG / TOLABL

Hue 弄ってる。プログラムできる ライト。 「こころコンパス」というテンポ、音程等から感情を分析する。

これを使って、発音、音量、ツイート、熱気を使っていろいろできそう。 ともかく可視化は楽しい。

この勉強会、次回:9/15 に第7回をやる予定

Polymer1.0 の入門を始める

Polymer ってなんぞ?

What is Polymer? - Polymer

Custom elements extend the web

一言でビルトイン以外のカスタムタグを追加すると。
カスタムなイベントや、デフォルトのスタイルも含めてコンポーネントとして定義できるらしい。

面白いのは「フレームワーク」とは名乗ってない所か。HTML5とか勉強会で聞いた通りだ。

ソースを読む

Polymer の導入そのものは、bower さえ入ってれば速攻できるらしい。 Get the code - Polymer
簡単なことはいいことだ。

その上でコンポーネント製作テンプレートを眺めてみた。

Create a reusable element - Polymer

結構いろいろ入ってるが、コンポーネントを作って GitHub で共有するところまであるらしい。
テンプレートを見る限り、基本的にテストも含む全件が入っていそうな感じだ。

Play で導入するなら、画面切り離しでサブプロジェクトでコンポーネントを作ってアクセスするのが良さそうに見える。

後でやってみよう。

ドキュメントを読んでみる

Quick tour of Polymer - Polymer

そして先ほども思ったが、非常にシンプルに作れるっぽい。
コンポーネント製作部分。下記の例だと、proto-element というタグを定義(ファイル名もproto-element"

<link rel="import"
      href="bower_components/polymer/polymer.html">

<script>
  // register a new element called proto-element
  Polymer({
    is: "proto-element",
    // add a callback to the element's prototype
    ready: function() {
      this.textContent = "I'm a proto-element. Check out my prototype!"
    }
  });
</script>

このコンポーネントはどうも JavaScript 上の運用もできる模様。Registration and lifecycle - Polymer

既存のタグを継承して作ることもできる。

MyInput = Polymer({

  is: 'my-input',

  extends: 'input',

  created: function() {
    this.style.border = '1px solid red';
  }

});

var el1 = new MyInput();
console.log(el1 instanceof HTMLInputElement); // true

var el2 = document.createElement('input', 'my-input');
console.log(el2 instanceof HTMLInputElement); // true

作ったコンポーネントは、is 属性を使って既存タグに適用することもできる

<input is="my-input">

ライフサイクルについても読んでみた

順序別配置。

  • created: 初期化後に呼ばれるイベントハンドラ
  • (ローカルDOM作成)
  • ready: DOM が作成されたタイミングでコールされるイベントハンドラ
  • factoryImpl: コンストラクタ
    ただし、HTML上にタグとして定義した場合は動作しない。
  • attached: 見たまま。利用可能になった際のイベント。

また、この後に、以下の事が書かれてる。

  • create は必ず ready 前に実行される
  • ready は必ず attached の前に実行される
  • ready は子要素から順に呼ばれる

残りのイベントハンドラ

  • detached: 見たまま。画面から外された時だと思われ
  • attributeChanged: 見たまま、属性変更時。
var MyElement = Polymer.Class({

  is: 'my-element',

  // See below for lifecycle callbacks
  created: function() {
    this.textContent = 'My element!';
  }

});

document.registerElement('my-element', MyElement);

// Equivalent:
var el1 = new MyElement();
var el2 = document.createElement('my-element');

後は、registerElement でタグを定義して、 createElement で貼り付けができるらしい。

とりあえず、初回導入とコンポーネント追加以外では bower 要らなそうなので、Play にもそのまま組み込めると思われ。