家族の誕生日には

昨日、なぜかこの曲が頭にこびりついて離れませんでした。 難儀ですね。唐突に"I'm a perfect human"って言って遊んだり、歌詞を調べてみたら"na, ka, ta, nakata"って歌っててマジかよと思ったりしました。 そんなことしていたら、妻が急に「レディー・ガガ…

XcodeGenの導入でつまずいたところ

今私の中でちょっとアツいのがXcodeGenで、まあアツいんでアツいうちに導入するか〜って昨日ぐらいに重い腰を上げました。 結構スムーズに書けたんですが、いくつかつまずいたので、その点をピックアップ。ちなみに書くときに参考にしたのは XcodeGen/Projec…

OpenCVのDescriptorMatcherの話

特徴量の検出(detect)と記述(compute)については割愛。これはその後の特徴量を比較するときに使うDescriptorMatcherについての話。 まずDescriptorMatcherの使い方 コードはScalaです。 import org.opencv.core.MatOfDMatch import org.opencv.features2…

OpenCVをJavaから使うぞ〜〜〜完全インストールマニュアル

まあJavaというかScalaから使いたかったんですが、同じことなんでとりあえずJavaから使うぞ〜〜〜という話です。 (macOSの話だけど)Homebrewで入れていいの?Mavenのリポジトリにあるの使っていいの?とまあいろいろ躓いたんで、まとめときます。 OpenCV(…

ObjectOutputStreamでシリアライズしたオブジェクトを永続化したら、serialVersionUIDが変わっちゃって破滅するやつ

題名のことやったやつおる? ここにおる。こういう例外が投げられる。 InvalidClassException: local class incompatible: stream classdesc serialVersionUID = 1083041391519420705, local class serialVersionUID = -8102506628468650634 シリアライズし…

JSR-310のDateTimeFormatterに気を付けろ

JSR-310に限った話ではないかもしれませんが。 JSR-310で日時なりを文字列にするときは、fomratメソッドにDateTimeFormatterクラスのインスタンスを渡してやる。んー分かりやすい。ちなみにtoStringメソッドでもOK。この場合はISO 8601の形式でフォーマット…

ELBを介したSSEを行う場合の設定や気を付けるところ

aws

SSE(Content-Type: text/event-stream)便利ですよね。フレームワークがサポートしていることも多いですし、その通りやれば結構サクッと動作します。 しかし、ローカルで試した場合にサクッと動作しても、ELBを介した場合に結構ハマったりしたので、その場…

Akka StreamsのalsoToを使うとSourceが停止しない

結論から言うと下記のコードには問題がある。rediscalaでRedis pub/subに繋いで、subscribeで受け取った内容をAkka HTTPでのSSEで返すコードの例です。 import java.nio.charset.Charset import akka.actor.ActorSystem import akka.stream._ import akka.st…

sealed abstract case classがすごい

sealed abstract case classなるものがある。別のことを調べてたらこちらの記事(のコメント欄)で見掛けて感動してしまった。 軽く触れると、newできなくなり、case classによって自動で生成されるcopyメソッド、そしてコンパニオンオブジェクトのapplyメソ…

Scalaマクロのerrorとabortの違い

Scalaのマクロで、コンパイルエラーにしてしまうときは Context.error を使う。 def someMethod_impl(c: Context)(arg: c.Expr[String]): c.Expr[Unit] = { // ... if (cond) { c.error(c.enclosingPosition, "a message") } // ... } でもこれが微妙に使い…

Scala dynamics + macros

Type Dynamic Scalaはメソッドなどの有無をコンパイルの時点で解決しますが、Dynamic traitを使うことによって動的にすることが出来ます。 // Dynamic traitを使うために必要。コンパイラオプションに `-language:dynamics` を渡してもOK import scala.langu…

パッケージの依存を単方向にするための拡張メソッド

DDDの話をするとしよう*1。 IDDD 第9章 モジュールにおいて、モジュール(Scalaだとパッケージ)の依存は極力減らせ。現実的には難しいが、単方向にしたり、親子関係にあるならば双方向を許可する、ということが述べられている。 しかしこれめっちゃ難しい。…

Y8 2017 spring in Shibuyaでお話した #y8spring

久し振りに登壇しました。 内容はメディロムで開発しているウェブAPI*1を、どんな風にScalaで書いているか、どんな判断を下しているか、などといったものです。今の仕組みもそろそろこなれてきたし、次(イベントソーシング、CQRSとかな!)に行く前にいっち…

ScalaのJSONライブラリcirceの使い方

ScalaのJSONライブラリと言うと、json4sあたりが有名なのかと思います(私感)。 が、json4sはリフレクションを使うので、何かと避けたい方も多いかと思う。 ということで、circeを使ってみましょう。 circe概要 circeはScalaのJSONライブラリです。 読み方 …

Akka HTTPを使ってみる。Akka Streamsにもちょっと触れるよ

Akka HTTPとはAkkaの上でHTTPサーバーを実現したものです。HTTPクライアントとしての機能を持っていたり、WebSocketのサポートもしています。 sprayという似たものもありますが、spray/sprayには「長らくメンテしてないよ。Akka HTTPに置き換えらているよ」…

型推論ふりかえり

型推論、よく聞きますね。よく聞くのでWikipediaにも型推論のページがあります。 この仕組みの恩恵は案外自然と享受しているものですが、機能を提供することライブラリの開発においては知らないと始まらない前提のようなものであると最近思います。が、自然…

YAP(achimon)C::Asia Hachioji 2016 mid in Shinagawaに行ってきた

7月2日(土)、3日(日)の2日間開催されたYAP(achimon)C::Asia Hachioji 2016 mid in Shinagawa(以下ヤパチー)に行ってきました。 yapcasia8oji-2016mid.hachiojipm.org トークした 実はこういうイベントに参加するの初めてで、まートークしたことも当然…

PlayStation 3が欲しかったのでその欲望を満たしてみたら想像以上に満たされた

「PlayStation 3とか買ってもやりたいタイトルあるの?」と言っていたのは何年前か。多分PlayStation 3が発売された直後とかだと思います。今ではタイトルの本数もかなりの数に上るんじゃないでしょうか。だってPlayStation 4の時代ですもんね。しかもBlu-ra…

Capistrano 3への手引き

Capistrano、便利ですよね。capistrano/capistrano最近メジャーバージョンアップがあったのですが、使い方、というかスクリプトの書き方やお作法が変わり、「Capistrano 3にアップデートしたはいいけど全然動かなくてどうなってんだ」という流れはもはやお約…

EmacsからVimに乗り換えた

vim

ちょっと前にEmacs + markdown-modeでドキュメントを書いていたのですが、Markdownって改行を入れると、ウェブブラウザ上では改行されていなくとも、HTML上で改行(単にCRが入ってる、という意味)されるじゃないですか? そういうときってウェブブラウザ上…

MeCabのメモリ管理はどうなっているのか

以前mecab-rubyを用いた下記のコードがコケる場合がありました。 node = MeCab::Tagger.new.parse(text) これはparseメソッドを呼び出している最中にMeCab::TaggerのインスタンスがGCによって解放されてしまい、メモリ違反を起こすためです(昔のことなので…

Rubyにpackage_privateを導入しようとしたら

Rubyのメソッドの可視性はpublic, protected, privateの3種類です。そこに同一パッケージ(イコール同一gem?)からのみ呼べるpackage_privateを導入してみましょう。結論から言うと断念しました。以下のような場合は簡単です。 class String def nya "#{sel…

Rubyで任意のメソッドの呼び出しを記録するgemを作った

タイトルの通り。 takkkun/peeek · GitHub インストールは: $ gem install peeek で。処理としては対象のメソッドを呼び出し記録用のメソッドで包んでいるだけです。使い方はREADME.mdなりをご覧ください。が、一部書き漏らしていることがあり、それをここに…

httpstatusコマンドで、HTTPのステータスコード(

一般的なWeb Programmerならば、HTTP Status codeはすべて暗記していると聞きました。しかし、僕は初心者なので、なかなか覚えきれていないので、HTTPのステータスコードをさがすのに便利なツールを用意しました。httpstatus.erlです。インストール方法は: $…

最近のMeCabの使い方

MeCabはC/C++で書かれた形態素解析を行うライブラリなのですが、ちょっと疑問に思うところがあって、以下のようなコードを書きました。 require 'MeCab' mecab_options = '-Owakati' 1000.times do |n| begin tagger = MeCab::Tagger.new(mecab_options) # d…

ErlangでTwitterのUserStreamを受け取る

以前もErlangでTwitter Streaming APIを使うといったエントリを書いたのですが、いかんせん情報が古すぎます。UserStreamではなく、素のStreaming APIなのはともかく、認証がベーシック認証だったりします。その割にはどうやら最近参照されているらしい。htt…

autotest-twitterでブヒる

最近とあるgemを書きながら付随するgemを書いてて優先すべきそれが中々進まない昨今ですこんばんは。で、恥ずかしながらテストファーストってあんまりやったことなくて、今それを実践しながらの開発をしています。使っているツールはRSpecなんですが、コマン…

Exporterでエクスポートされる関数の挙動を変更する

ひょんなところにこんなモジュールがあRuby。 package Hoge; use strict; use warnings; use base qw/Exporter/; our @EXPORT = qw/hoge/; sub hoge { print "Hoge::hoge called\n"; } 1; このHogeモジュールのhoge関数を呼び出すためにこんなコードを書Chro…

単数形/複数形の変換ルールを独自に定義する

必要に迫られたので探してました. 案の定用意されたメソッドで好き勝手できるようになってました.Rails御用達のActiveSupportの場合. require 'active_support' require 'active_support/inflector' # Railsは自動で取り込んでくれるだろうけど, ActiveSuppo…

Emacsからrakeを呼び出してみた

最近「プログラミングしてないなぁ……」とか思っちゃったので, 試しにTwitterのUser Streamsを使ったプログラムを書こうとしたのですが, ErlangからUser Streamsが使えなかったので*1別のプログラムに逃避した次第です, こんにちは. id:siritoriごめん.で, 何…