タグ

ブックマーク / blog.64p.org (85)

  • Java でちょっとしたパーサーを実装するときは ANTLR4 が便利 - tokuhirom's blog

    Java でちょっとしたDSLパーサーを実装するときはANTLR4 が最近もデファクトスタンダードなのかなあ。と思っています。 ANTLR4 はパーサージェネレーターです。BNF っぽい記法で書いたらいい感じに生成してくれます。手書きパーサーとかに比べると管理しやすい気がします。 gradle はコアプラグインに antlr プラグインがあるので簡単に利用できます。 https://docs.gradle.org/current/userguide/antlr_plugin.html group 'com.example' apply plugin: 'java' apply plugin: 'antlr' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { antlr "org.antlr:an

    yuiseki
    yuiseki 2017/05/23
  • LL から Java に移行した人がはまりがちなこと - tokuhirom's blog

    こんにちは。Java 初心者です。 Java 初心者、得に LL から Java に来た人にありがちな問題について社内向けに書いたものをオープンアンドシェアさせていただきます。 前提として、我々は Java 8 でガンガン攻めているということをご承知おきください。 また、自分がこの数ヶ月で「うわー。こうしとくべきだったのかー」と気づいたやつをドヤ顔で語っているということにもご注意ください。 【追記】 対象は中規模 B2C の場合です(中規模というのは facebook より小さいという程度の意味です) 例外を握りつぶさないようにしよう Eclipse が生成する以下のようなコードをそのまま残しているケース。 これは言うまでもなく良くないですね。デバッグが困難になります。 try { } catch (IOException e) { e.printStackTrace(); } Perl

    yuiseki
    yuiseki 2014/10/01
  • Content-Security-Policy と nonce の話 - tokuhirom's blog

    Content-Security-Policy の nonce を利用すると、XSS の脅威をかなり軽減できます。 そこで、Web Application Framework ではデフォルトで対応したほうがよいのではないか、という旨を @hasegawayosuke さんから教えて頂いたので、実装について考えてみました。 とりあえず CSP の nonce はどういうものなのかを考慮するために、コード例を探していたのですが、実際に動くサンプルというものが nonce 関連のもので見当たりませんでした。 そこで、実際に動くサンプルを用意しました。 https://github.com/tokuhirom/csp-nonce-sample 以下は Sinatra で書かれたサンプルコードです。 require 'sinatra' require 'securerandom' get '/' d

    yuiseki
    yuiseki 2014/09/26
  • ngResource はどうやって値を埋めているのか - tokuhirom's blog

    ngResource は AngularJS で RESTful API を call する際につかえるクライアントライブラリだが、これがなかなかマジカルな動きをする。 具体的には、以下のようなコードがなぜか動く。HTTP リクエストが実行された後で $scope.entries にいい感じにレスポンスがうまっているのだ。 $scope.entries = $resource(‘/entry’).query(); 通常なら動かなそうなコードだ。なぜこれが動いてしまうのか。 なぜ動くのか $scope.entries = $resource(‘/entry').query(); のとき、ngResource の内部では以下のようなことが起きている。 $scope.foo = (function () { // 空の配列を作る var value = [ ]; $http.get(‘/foo’

    yuiseki
    yuiseki 2013/11/05
  • PhantomJS + Selenium::Remote::Driver でスクレイピングをこころみる - tokuhirom's blog

    PhantomJS といえば、WebKit を headless でうごかせて便利なやつですが、PhantomJS 1.8 から Ghost Driver がくみこまれるようになりました。 わかる人むけにかくと「JSONWire Protocol をサポートする httpd が phantomjs にくみこまれた」ということです。 GhostDriver は WebDriver Wire Protocol の1実装です。で、そのクライアントライブラリとして Selenium::Remote::Driver が CPAN にあがっていますから、これをつかって簡単に phantomjs とやりとりができます。 Selenium::Remote::Driver という名前のとおり、Selenium もつかえますんで、selenium をつかって、対応しているブラウザでのテストもできるのがいいかん

  • Node.js で重い処理をしてしまったときにタイムアウトするの法 - tokuhirom's blog

    (この記事は Node.js アドベントカレンダー不参加記事です) チャットサーバー的な使い方とか意外とみんな興味なくて、普通のウェブアプリケーションなどをかく、という用途にちょっと node.js がつかえたらいいのにな、とおもっている人がおおいようにかんじています。Node.js が人気なのは、v8 をうまくパッケージングしているのが node.js ぐらいで、そして v8 をうまくパッケージングするのが結構めんどくさいから、というところが大きいのです。ぶっちゃけ node.js が〜 とさわいでる人のうち8割は I/O multiplexing だからとかそういう理由で支持しているわけではなかったりするのです(偏見)。 さて、普通の web application のようなものを書こうとしたときに Node.js って基シングルスレッドだし、なんかうっかり重い処理したときにどうした

    yuiseki
    yuiseki 2013/06/19
  • Hasegawa方式の CSRF対策を試してみた - tokuhirom's blog

    Amon2 での実装例です。 使用感としては、 実装はそれほどむずかしくないトークンの保存をサーバー側でやらなくていいので楽といったかんじ。 管理画面とかでつかってみたらよいかもしれぬ。 use strict; use warnings; use utf8; use File::Spec; use File::Basename; use lib File::Spec->catdir(dirname(__FILE__), 'extlib', 'lib', 'perl5'); use lib File::Spec->catdir(dirname(__FILE__), 'lib'); use Amon2::Lite; { package Amon2::Plugin::Web::Hsegawa; use constant { REDIRECT => 10001, VALIDATION_ERROR

  • 汎用データフォーマットにたいする雑感 - tokuhirom's blog

    フォーマットの変更は、ユーザーに対して基的に不利益をあたえる バージョン情報が含まれているフォーマットならば問題はすくないユーザーはなにも考えたくないから汎用フォーマットをつかう できるだけなにも考えたくないゆるふわプログラマーがほとんどなのですYAML をみよ バージョンの差異と、プラットフォームごとの実装の非互換によってわけわかめである初期の時点でまともに実装できている処理系がすくなかったバージョン2を現在まともに処理できているのは libyaml ぐらいではないか? これはフォーマットの複雑さによるところが大きい1のライブラリと2のライブラリ、ユーザーには見分けがつかない状況 YAML::XS が2 で YAML.pm が 1 とどうしてわかる?非互換や、ユーザーのプログラムがこわれる変更は、まあなしね。Data::MessagePack2 とかがでたときに、たとえば AnyEve

    yuiseki
    yuiseki 2013/02/25
  • httpstatus コマンドで、HTTP のステータスコードをすばやくしらべる! - tokuhirom's blog

    一般的な Web Programmer ならば、HTTP Status code はすべて暗記していると聞きました。 しかし、僕は初心者なので、なかなか覚えきれていないので、HTTPのステータスコードをさがすのに便利なツールを用意しました。App::httpstatus です。インストール方法は cpanm App::httpstatus です。というか依存とかないのでhttp://api.metacpan.org/source/TOKUHIROM/App-httpstatus-v1.0.0/httpstatus をコピーしてくればうごきます。 使い方は以下のとおりです。 4xx なコードを列挙する。 % httpstatus 4 400 Bad Request 401 Unauthorized 402 Payment Required 403 Forbidden 404 Not Foun

  • MacRuby でメニューバーのステータスメニューに常駐するアプリを作るための雛形をつくりました! - tokuhirom's blog.

    MacRuby でささっとメニューバーのステータスメニューに常駐するアプリケーションをつくれたら便利だと思いませんか? メニューバーのステータスメニューとは↓のような領域のことです。 これができると daemontools で常駐とかさせなくても app を start up にいれるだけでいいし、管理が楽です。 この分野では mynu というライブラリが有名なのだが、これはコードが複雑でとりあつかいづらい上に、ドキュメントをよんでも macruby コマンドで走らせようという話しかでてこなくて不安になる。僕がほしいのは .app だ! という気持になるのだ。 というわけで、通常のアプリ開発フローでステータスバーに常駐するアプリをつくるための雛形を作成した。以下のコードを Xcode で生成した雛形の AppDelegate.rb におきかえ、適当な画像(たとえば このへん など)を ic

    yuiseki
    yuiseki 2013/01/08
  • ちょっとした GUI アプリケーションをつくるのに MacRuby はよい選択肢となりうる - tokuhirom's blog

    ちょっとした GUI アプリをつくるのに MacRuby をつかってみた。結論からいうと MacRuby はよくできているなあ、という印象をえた。 昔、RubyCocoa をさわってみたことはあったのだけど RubyCocoa は 「なんか正直 Objective-C の方がむしろ楽な気がする。。」 という感じだった。なにしろめんどくさいという印象しかのこらなかったのである。 一方、 MacRuby はいいな。 Syntax をカスタマイズすることにより無理矢理実現している変態的な感じもよい。実用的。 ちょっとした自分用ツールをかくときに今までは web application としてかいていたのだけど、MacRuby の方が楽だな、そんな気分になったのであった。 (というか、最初 Web Application としてかいてつかっていたツールを MacRuby に移植したのである) VB

    yuiseki
    yuiseki 2013/01/04
  • Sinatra っぽく簡単に JS で Dispatch できる micro_dispatcher.js のご紹介 - tokuhirom's blog

    https://github.com/tokuhirom/micro_dispatcher.js javascript 用のシンプルな Dispatcher にはいくつかあるが、どうも満足いくシンプルな実装がなかったのでつくった(というか Caym というオレオレ JS Framework の中にうまっていたものをとりだした)。 特徴としては、 Dispatcher だけのシンプルな実装(体はやや冗長にかいていて、40行程度)sinatra 的なシンプルな記法といったところでしょうか。 使い方は以下のとおり。 var dispatcher = new MicroDispatcher() dispatcher.register('/', function () { }) dispatcher.register('/member/:name', function (name) { alert

  • cron でうごかしているコマンドをタイムアウトさせる - tokuhirom's blog

    coreutils の timeout(1) をつかえば OK です。 http://www.gnu.org/software/coreutils/manual/html_node/timeout-invocation.html softlimit -t 60 foobar という手もあるけど、CPU時間だから sleep してるとかだと死ねないという説もあるようです。

    yuiseki
    yuiseki 2012/12/20
  • markdown をみるのに便利なやつつくった - tokuhirom's blog

    意識、高まってますか? 先日、 Plack::App::Directory::Markdownの記事をみてて、 ちなみに、使われているCSSやJS、画像等はPlack::App::Directory::Markdown::StaticというファイルのDataSectioにpackされており、それをPATHに応じて返する作りになっています。こういうちょっとしたアプリケーションを配布するときにこの仕組みは便利なんじゃないかと思って、もうちょっと汎用化してからまたCPANに上げるかもしれません。 的なことがかいてあったんで、いろいろかんがえてたんですが、node.js だったらディレクトリ構造をきりきざんだりしないので、こういうユーティリティ的なウェブアプリケーションも npm にガンガンあげるという意識の高い行為が可能なのではないか、ということに思い至りました。 というわけでつくってみました。

    yuiseki
    yuiseki 2012/09/05
  • かわいい分類 - tokuhirom's blog

    http://d.hatena.ne.jp/echizen_tm/20110721/1311253494 自分で手をうごかしてみないとよくわからないタイプな僕は、簡単分類ツール futaba の動作がなんかむずかしかったので、ソースを1ファイルにまとめてみて、実際の挙動を理解することにつとめたのであった。 この手のツールは、なんかこうデータの入出力の部分がやたらおおくて煩雑なので、オンメモリで適当にやる版をかくことで理解の助けになる気がした。 #!/usr/bin/env perl use strict; use warnings; use utf8; use 5.010000; use autodie; use Data::Dumper; my %data = ( # feature_key { class_key => score, ... } 'warm:red' => { R =>

    yuiseki
    yuiseki 2012/08/23
  • shell script を書くときの tips 2つ(初心者向け) - tokuhirom's blog

    shell script は普段さけて通りたいと願ってやまないわけですが、たまには書かないといけないことがあるので、そういうときは覚えておくと便利な tips を2つ。 autodie っぽくするset -eとすると、コマンドの実行に失敗したときにそこで実行がとまるので便利。 #!/bin/sh set -e perl -e 'die' echo SHOULD NOT REACH HEREとすると % ./hoge.sh Died at -e line 1. % echo $? 255となって、最後までいかずに死にます。 複数のコマンドを順番に実行するときに便利。 なお、以下のような挙動をするんだそうです。 ただし失敗したコマンドが until または while ループの一部である、 if 文の一部である、 && または || リストの一部である、 コマンドの返り値が ! で反転されてい

  • micro-location.js がいかす - tokuhirom's blog

    https://github.com/cho45/micro-location.js URL のクエリをいいかんじに書きかえる処理を JS でするためにいいかんじのライブラリをさがしていたのだが、URI.js はなんか大仰なかんじなので micro-location.js をつかってみた。 jQuery#extend と組みあわせることで、目的の処理は達成された模様。 l = Location.parse("http://example.com/?foo=bar&baz=boz"); # → Location l = l.params($.extend(l.params(), {lat: 4, foo: "hoge"})) # → Location l.href # → "http://example.com/?foo=hoge&baz=boz&lat=4"

    yuiseki
    yuiseki 2012/07/25
  • linux のコマンドラインから、wi-fi の情報をつかって位置情報を得る - tokuhirom's blog

    表題の件につきまして、解説します。 firefox などの web browser は geo location API を提供していますが、この位置情報のデータをコマンドラインからとる方法というのが、すんなりとした方法で提供されているものがちょっとみあたりませんでした。 これができると、自分の note pc の中で cron をうごかしておいて、何時から何時までのあいだにどこにいたかを記録するとかできておもしろそう。ライフログ!!! というわけでやってみようとおもったのだが、存外情報がすくなくてこまった。 結論からもうしますと、iwlist コマンドをつかうと wi-fi のアクセスポイントを scan してくれるので、この出力をつかいましょう。 iwlist wlan0 scanとかうつといいですね。 で、これでえた mac address をもとに、 http://ks0608.h

  • cron の実行ログをすてさせないライフハックできたよー - tokuhirom's blog

    昨今、cron のログにかんする話がちょいちょいありますが、問題点をまとめると stdout or stderr に1バイトでも書くとメールがとぶインタープリタのだす warnings や printf デバッグの名残りなどでもメールがいちいちとんでめんどくさいめんどくさいから出力を /dev/null にほうむりがちログを /dev/null にすてると運用にさしつかえるといったところかとおもいます。 これにたいする一般的なソリューションとして、かずほさんの cronlog というのがあって、これは exit status をみて stdout/stderr の出力を /dev/null または任意のファイルにおくってメールをとばさせないというソリューションです。 cronlog は便利なのだけど、毎行設定するのだるいという問題があるので、設定が簡単なように cron に以下のようなパッ

    yuiseki
    yuiseki 2012/06/15
  • 行頭をみて処理フローがわかるコードをかく - tokuhirom's blog

    MyProj::Exception::Foo->throw unless $res->is_success;という処理は、上から順番にコードをみてると、どうなるかわからない。 unless ($res->is_success) { MyProj::Exception::Foo->throw(); }とかの方がベターか。 die "Nantoka" unless $res->is_success;みたいな場合だと、ぬけることが行頭をみて明確なので末尾になにかついてるなーとおもうので、これでもいいとおもう。

    yuiseki
    yuiseki 2012/03/11