1
|
|
というエラーになり、原因調査のためにOpenSSLで当該ホストに繋いでも同様に
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
このようなことになってしまった。なおcurlやChromeでは普通につながる。
Server Helloの段階で拒否されてるので証明書の検証エラーではなさそう。
いろいろ調べたところ、SNIが原因だった(検証に使用したドメインはこのページより)。
SNI対応サーバに対しては、-servername
を指定してやらないと拒絶されるんですね。
1 2 3 4 5 6 |
|
Java7以降では標準でSNI有効になってるらしいんですが、
Jsoupで証明書の検証を無効にしようとConnection#validateTLSCertificates(true)
したところ巻き添えで無効になってしまった模様。
さて近年ErgoDoxの普及などで分割キーボードに注目が集まっており、個人的にも作業姿勢(スタンディングデスク使用)との兼ね合いから興味があり、よしとりあえずその辺のキーボードを買ってきて切ろうという勢いが出てきたのでProgress Touch Retroと糸鋸などが購入された。
これがProgress Touch Retroです。ヨドバシ店舗で「USB接続、テンキーレス、US配列、黒軸」という条件のキーボードが発見できなかったのでテンキーありのものを買った。 キーボードにおいては2016年もこのようなことが度々発生するため、DIYの必要性は未だ存在する。
背景がスポーツ新聞なのはコンビニにそれしかなかったからです。皆さんは本当にどうでもいいことを気にする。
開封の儀
基盤は二層。ベタGNDがしっかししていて、ノイズ対策に気を使ってるようにみえる。
Progress Touch Retroの基板について興味を持つ人がいるかもしれないので多めに写真を掲載しておきます。
フム。
オアーッ(ハンダ吸い取り機でがんばる)
スイッチはコツを掴むと割と簡単に抜けます。
スイッチを全部抜くことで鉄板が外れます。
そして鉄板を切る、ピンバイスと糸鋸でひたすらがんばる(さすがに電動ドリルくらいは使ったほうが良かったと思います)
基板も同様にがんばる、鉄板よりマシだろうと思ったがそれほどでもなかった(糸鋸の刃がバンバン折れる)
アーーーッ、アーーーーーッ(切れた)
そのままだとSpaceキーが片方にしかないので、基板の空いてるスペースに穴開けてスイッチ増設した。
次は左右のモジュールを配線していきます。これが三層以上の基板でなくて本当に良かった。二層が人類の限界。
ホットボンド過程など省略しますが、できた!!!!!!!!!!!!!!!!!!
両手の配置を調整することで負荷が減ってかなり良くなりました。
おい、そういういいものがあるなら先に言え、おい(工作の数ヶ月後に発売されました)(会社用に買った)
]]>2015年になってもターミナルの表示が重いとか言っているしムーアの法則とはなんだったのか???????
— トデス子'\ (@todesking) August 11, 2015iTerm2で、非ASCII文字が大量に表示されていると描画が異常に重くなるという問題にぶつかりまして。
アンチエイリアス無効やスクロールバッファ小さくしても無駄。試行錯誤した結果、Non-ASCII Fontに設定したフォントによって表示が重くなるようだ。
↑最初の設定(重い)
↑Non-ASCII Fontに日本語フォントを設定(軽い)
設定を変更することで、ASCII文字のみ表示されてる時と遜色ない速度になりました(めでたし)
]]>とりあえずebayでGENUINE APPLE MACBOOK AIR A1465 11” MID 2013 TRACK PAD 923-0429買った。
MacBookの部品を使用した外付けトラックパッド自作には前例があり、以下のページで紹介されてます。
これらの資料によれば2008年くらいまでのモデルのトラックパッドはUSBインタフェースを内蔵しているため改造が容易、それ以降の物は本体側に移動しているので難しいだろうとのことなのですが、今回手に入れたトラックパッドにはUSBインタフェース内蔵マイコンが搭載されており、最近のモデルでふたたび改造可能になった可能性があります。
写真が暗い、だがこれは序章にすぎない。
基板写真いちばん右のチップ。
1 2 3 4 |
|
Macronix のメモリIC ML25L2006Eシリーズらしい。
動作電圧は2.7V - 3.6Vっぽい。データシートの見方がいまいち自信なし。
1 2 3 4 |
|
Mainstream Performance line, ARM Cortex-M3 MCU with 128 Kbytes Flash, 72 MHz CPU, motor control, USB and CAN
USBインタフェース内臓のCPU、これは期待が持てる。
動作電圧は2.0 - 3.6V とのこと。
1 2 3 |
|
謎です。
1 2 |
|
謎です。
下のやつは実際は鏡面になってて(チップスケールパッケージというものだと思う)、表面の印刷を読み取るのが困難すぎる。
iFixtによるとBroadcom BCM5976A0KUB2G trackpad controllerとのこと。
とりあえず電源電圧として何ボルト用意すればいいのか知りたいですね。 基板上にレギュレータがあって適当に5V突っ込めば動いてくれるのか、3.3V用意しないといけないのかが不明。
フレキケーブルのコネクタが4個並んでいて、左右のコネクタはトラックパッドのセンサと接続されている模様。
おそらくはこの基板がキーボードとのインタフェースを兼ねていて、中央のコネクタのうち大きいほうがキーボードとの接続、もう一方が本体に続いている。
銀色のシールが貼られているようにみえるのは、トラックパッドのセンサ面にGNDを接続するためのものだと思われる。
その反対にある「いかにもコネクタ(8ピン)がつきそうな空きパターン」が気になる。iFixitの写真を見ると、フレキケーブル用と思われるコネクタが実装されている(未接続)。 これがテスト端子だとすると、USB信号線を楽に引き出せる可能性があるのだが。
]]>入力デバイス配置の都合上、 超小型のL字型Micr USBコネクタ付きケーブルがないと困るということとなったが入手できなかったので自作した。
とりあえず剥く
不要な部分をガンガン切ってから適切に配線する。電源用途なのでデータ線省略できて楽。
ホットボンドで固める。ホットボンド最高!!(強度はない)
使用風景。あまりにコンパクトすぎて何がなんだかわからん状態となった。通常のコネクタ使うとキーボードとトラックパッドの間が2センチ以上空きます。
以上です。良かったですね。
]]>1 2 |
|
テキストとして解釈してHTMLとして読み出せば確かに安全だ、これはいける!!!!!111 と思ってこういうことをすると
1
|
|
こういう入力が来て、インターネットがめちゃくちゃになってしまうので今すぐ悔い改めてほしい。
1 2 3 4 |
|
以上、innerHTML
は"
をエスケープしてくれるとは限らないという話でした。
じゃあどうすればいいのかというと、危険な文字を手動で置き換えるしかないんじゃないでしょうか……(下記で本当に安全なのか、それほど自信がない)
1 2 3 |
|
ただ電源端子が上部にあるという問題があって、キーボードの手前において充電しながら使うとケーブルが物凄く邪魔、余分な空間ができるので指が長くないと使えない。 というわけで電源端子の位置を横に移動させるべく分解を試みたんですが、ガラス製天板とプラスチックのボディの接着部を剥がすのが困難すぎたのであきらめました。 力ずくでやると絶対割れる。
というわけでバッテリ駆動で使用することになった。
こういう邪悪なデバイスはヒートガン使うといいっぽいので情熱のある人は試すといいんじゃないでしょうか。
]]>Javadoc/Scaladocのhtmlをmarkdownに変換するコマンドを作りました。便利です。
scala-libraryの変換済みアーカイブも提供してます:
Conscriptユーザの人は
1
|
|
でインストール可能です。
それ以外の人はプロジェクトをcloneしてきてsbt run
するなどしてください。
1 2 |
|
source-location
にあるドキュメントをmarkdown化してdest-dir
に保存します。
~/.ctags
にこのような設定を書いておく
1 2 3 4 5 |
|
ドキュメントのあるディレクトリで以下のコマンドを実行すればタグファイルができます。
1 2 |
|
私はunite.vim
を使ってます。
1
|
|
scala-2.11.2
を選択
immutable/Seq.md
を選択
1
|
|
便利です。
]]>:TOhtml
コマンドで可能あまりにもつらいので調査したところ、textutil
とpbcopy
コマンド(どちらもMac標準だと思います)を組み合わせることで解決することがわかった。
1 2 3 4 5 6 7 8 |
|
便利!!!!!!!!!!!!!!!!!!!!!!!(以上です)
]]>1 2 |
|
ScriptEngineManager
の引数には目的のScriptEngine
をロード可能なClassLoader
を指定する必要があるんですが、
引数省略時にはThread.currentThread.contextClassLoader
が使用されるようになっており、sbt run
で起動した場合に謎のクラスローダーが使われることになってJDKのextensionであるNashornのエンジンがロード不能。なので明示的にnull
を渡す必要があります。
これ、sbt console
だと引数省略でもうまくいったりするので闇が深い。sbtのクラスローダには気をつけましょう。
ref: http://stackoverflow.com/questions/23567500/how-to-use-scriptengine-in-scalatest
]]>Javaには以前からJavaScriptエンジン(Rhino)が同梱されていたが、Java 8からはNashornと呼ばれる高速化されたエンジンになった。従来よりも圧倒的に速いらしいので、動的コード生成が必要な場所で使えるかどうか、パフォーマンス特性について調べてみた。
結論としては、
以下詳細。ベンチマークコードはこちら
適当にでっち上げたLisp風言語インタプリタもどきと比較して、同内容の処理が1.5 〜 2倍速い。
1 2 3 4 |
|
NeiveがScala、下の二つがJS。律儀に関数呼び出ししても1.5倍、+に展開すると2倍速い。
NativeはふつうにScalaの関数オブジェクトで書いたやつ。静的に定義可能な処理は静的に定義したほうがいいのがわかる。
1 2 |
|
(cached)
は同一の関数定義を1000回繰り返したケース。(uncached)
は一回ごとに関数定義内の定数を変えている。
関数定義があまりにも遅いのでキャッシュが実装されているらしいことが伺える。
Scalaによる遺伝的プログラミング実装に、ツリーの内容をJSに変換する最適化処理を実装してみたんですが、このユースケース(関数1k回定義→600k回実行くらい。実行速度はナイーブ実装で1ms以下)だと10倍くらい遅くなるので使えななかったです(´・_・`)
]]>--error
オプションでログレベル変更、showSuccess := false
で終了時のメッセージ非表示。
たぶんERRORレベルのメッセージは出るけど、問題なかろう。
1
|
|
クラスパス外にあるJDBCドライバを使いたいというケース。
クラスパスにある場合は、以下のようなコードでドライバを使用できる。
1 2 3 4 5 6 |
|
クラスパス外のドライバを使いたい場合、追加で
ClassLoader
を作成DriverManager
はシステムクラスローダを使ったDriver
しか使ってくれないので、ラップするという処理を行う必要がある。
主要部分はこんなかんじ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
ドライバがシステムクラスローダ以外を使っている場合は、DriverManager
を騙すためにラップするためのクラス。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
ざっくり説明すると、ConscriptというのはGitHub上のコンソールアプリプロジェクトを自動でビルド+インストールしてくれるツール。
何かツールを配布したいときは、自分のプロジェクトにConscriptの設定ファイルを含めておけばcs
コマンド一発でインストール可能になって便利というやつです。
Giter8というプロジェクトテンプレート管理システム用にConscriptプロジェクトのテンプレートが提供されてるので、新規プロジェクトの時はこれ使うと良さそう。
launchconfig
を元に、sbt-launcher
のラッパーコマンドを作成するsbt-launcher
は、launchconfig
の内容に応じて依存ライブラリの解決とアプリケーションの起動を行う最初勘違いしてたんだけど、GitHubからソース一式落としてきてビルドしてるわけじゃないです。launchconfig
以外はmvnリポジトリ経由で取得しているので、ビルド済みのjarを公開しておかないとインストールできない。
launchconfig
の書き方などが知りたいときはsbt-launcherのドキュメント読むと書いてあります。
launchconfig
まずsrc/main/conscript/(実行ファイル名)/launchconfig
に設定を書く
1 2 3 4 5 6 7 8 9 10 11 12 |
|
インストール時は[repositories]
の定義を元に依存ライブラリ(アプリ本体含む)を探すので、必要な物を書いておく。
[app] class:
には起動用のクラスを指定する。xsbti.AppMain
を継承している必要がある。
sbtと定義内容がかぶってるので、自動生成するようにしてみた。version
は「現在mvnリポジトリから入手可能なバージョン」である必要があるので微妙なことをしている……。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Conscript sbt plugin を指定することで、依存関係とか設定してくれるっぽい。
1 2 |
|
1 2 |
|
自前のリポジトリでjarをホスティングするためのpublish設定の例。
この設定でsbt publish
すると./repo/
以下に必要なファイル一式が出力されるので、適当なサーバに公開するとよい。
1 2 |
|
テストフレームワークはScalaTest使ってます
Scalaのカバレッジ測定、scctというのが一般的だったけど、なにか色々あって現在はScoverageという名前になって開発が継続されています。
Scoverageの最新バージョンはScala2.10をサポートしていないので注意しましょう(旧バージョン指定したら動くかも。試してないけど。)
導入は以下の通り。
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 |
|
これでカバレッジ測定用のsbtタスクが使えるようになります。
sbt scoverage:compile
sbt scoverage:test
sbt coveralls
COVERALLS_REPO_TOKEN
が設定されてる必要あり。人間が見られる形式のレポートは、target/scala-2.11/scoverage-report/index.html
にある。
circle.yml
の書き方は公式ドキュメント参照。
sbtのバージョンは、project/build.properties
で指定しておけばそれを使ってくれるようです。
1 2 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
COVERALLSのトークンを入れる環境変数 COVERALLS_REPO_TOKEN
は、リポジトリに含めたくないのでCircleCIのプロジェクト設定画面から追加する。
あと、CircleCIはjunit形式のテスト結果xmlを認識してくれるようなのでその設定もする。
1 2 3 4 |
|
xmlは環境変数 CI_REPORTS
から探されるので、ScalaTestのオプションとしてxmlの出力先を適切に指定してやる。
CircleCI。 ビルド結果の”Artifacts”からカバレッジレポートのhtmlが見られる。
COVERALLS。結果が取れていてよかったですね。
以上、ご査収の程お願いしたく。
]]>1 2 3 4 5 6 7 8 |
|
基本機能使うならこれだけでよし。注意点としては、surround.vimとはキーストロークが変わる。
具体的には、surround.vimにおいて囲みの種類を変更するキーストロークcs'(
は、operator-surroundではcsa'(
になります。
削除も同様。
囲みを追加するysaw"
等については、変更なしでそのまま通る。
新しいsurround text objを定義したいときは g:operator#surround#blocks
を設定します。
1 2 3 4 5 |
|
block
に囲み開始と終了のパターン、motionwise
は選択モード(文字、行、ブロック)、keys
は囲みを追加するときのキー。
囲みの追加は、パターンが正規表現だとうまく動きません。
正規表現を使用する場合、\V
前提なので注意。
surround.vimと比較してカスタマイズは大幅に楽になったので、乗り換える価値はあった。
]]>match
式のパターンとしてunapply
/unapplySeq
が定義されたオブジェクトを指定することで、動作をカスタマイズできる。
参考資料は例によってScala Language Specification Version 2.9(pdf)。ちょっと古いけどこのへんのルールは今も変わってないと思われる。Chapter 8あたり。
引数 | メソッド |
---|---|
() |
unapply(a:A):Boolean |
(p1) |
unapply(a:A):Option[T1] |
(p1, ..., pn) |
unapply(a:A):Option[(T1, ..., Tn)] |
(p1, ..., _*) |
unapplySeq(a:A):Seq[T] |
for
は構文糖衣なんだけど、書き方に応じてmap
やflatMap
やforEach
に変換されてよくわからないので、ルールをまとめた。
参考資料: Scala Language Specification Version 2.9(pdf)。ちょっと古いけどこのへんのルールは今も変わってないと思われる。
出現する全てのnot irrefutableなパターン部(※)を持つジェネレータp <- e
を以下の形に変形する
p <- e.withFilter { case p => true; case _ => false }
※not irrefutable: 必ずマッチするとは限らないようなパターンの意。
すべてのfor内包表記が消滅するまで、以下のルールを繰り返し適用する
p <- e; if g
p <- e.withFilter((x1, ..., xn) => g )
、ただしx1, …, xn はpの自由変数
p1 <- e1; p2 = e2
(p1, p2) <- for(x1@p1 <- e1) yield { val x2@p2 = e2; (x1, x2) }
for(p <- e) yield ee
e.map { case p => ee }
for(p1 <- e1; p2 <- e2 ...) yield ee
e1.flatMap { case p1 => for(p2 <- e2 ...) yield ee }
for(p <- e) ee
e.foreach { case p => ee }
for(p1 <- e1; p2 <- e2 ...) ee
e1.foreach { case p1 => for(p2 <- e2 ...) ee }
generatorが複数ある場合は外側から順に、以下のルールで展開する:
generator | yield? | メソッド |
---|---|---|
1 | yes | map |
>1 | yes | flatMap |
>0 | no | foreach |
RubyはScalaに比べてクソとかいう話ではなく、Scalaから見たRubyの興味深い点のご紹介みたいな趣旨の発表です。発表資料が見にくくて申し訳ございません。
なぜかトリに発表することになった結果、Scalaのイベントで延々とRubyの話をしてる異常者みたいな印象が強化されたけど、私はただ、言語の多様性について皆さんに考えていただこうと……
RubyとScalaの印象についてですが、動的でアジリティとハック性に優れるRubyと、静的で記述性が高くアカデミック要素の強いScalaという感じですね。エコシステムの変化が激しくて、関連フレームワークのアップデートを怠るとすぐ死ぬのはどちらにも共通した特性(そういうのがつらい人はジャバエイトをやるとよい)。 私はJava出身といってもmavenエコシステムに関する知識に乏しかったので、mavenの上に載ってるsbtの依存性管理には悩まされました。
あと広告システムに関する話は全然しなかったけど、遅いことをやると遅いのでふつうに速いコード書こうくらいしか言うことはないですね。プロダクトを高速に保つというのは、高度な知識よりも絶え間ない実践に関する問題であることが多いので、とにかく各位やっていけ(以上です)
あとScalaの人は事あるごとにモナドモナド言ってて、いっぽうRubyの人は技術よりもエモい話のほうが好きそうだみたいな偏見があるという話をした。
]]>group_by
等のメソッドで「その要素自身」を返すブロックを渡したいことはたまにあるので、{|x| x}
のかわりに&:itself
って書けばいいのは便利ですね。
という記事を読んで、以前同じ動機でgemを作ったことを思い出した。
名前そのままなんだけど、なんと!! &1
で {|x| x}
相当です。便利。
1 2 3 |
|
itselfなげえ……
ちなみになぜ&1
かというと、
圏論ではidentityを表現するのに1
を使う風習があって
かっこよかったからです