タグ

ブックマーク / gfx.hatenadiary.org (14)

  • AndroidエンジニアとJavaの関係 - Islands in the byte stream (legacy)

    Androidエンジニアは初心者に対して「Javaくらいできるよね、さてそれではAndroidについて学ぼうか」みたいな態度をとってしまうことがよくあります。しかし実際にはAndroidアプリケーションを書くにはJavaの知識が必要不可欠で、Javaについては学ばなければならなくて、これがわりと奥が深くて大変だったりするのですよね。 自分はどうやって学んだのだったかなと振り返ると、発展的な内容はだいたい「Javaメモ」で学んだと思います。デザインは古いですが内容はアップデートされているし、細かな点までよく説明していて、読み物としても面白いのでおすすめです。 http://www.ne.jp/asahi/hishidama/home/tech/java/ そういうわけで、AndroidエンジニアJavaの関係を考える機会が最近いくつかあって、 DroidKaigiでそういうネタがないかなと

    AndroidエンジニアとJavaの関係 - Islands in the byte stream (legacy)
    moznion
    moznion 2015/02/24
  • Template Engine Nightで「Xslate振り返り」をしました - Islands in the byte stream (legacy)

    このあたりで一度まとめておこうと思ったのでいい機会でした。@moznionさん、ありがとうございました。 なお、スライド中の「arity」は、この直前のトークで「ASTのnodeの種類を表すのにarityという単語を使っているのは意味が違うのではないか」と質問されたので急遽いれたものです。これは、『ビューティフル・コード』でDouglas Crockfordが演算子優先順位構文解析法によってJavaScriptのparserを実装しており、その中でtokenの種類を表すのにarityという単語を使っていたからなのでした。Xslateはそのparserをもとにしているのでarityという言葉を使っています。 ビューティフルコード (THEORY/IN/PRACTICE) 作者: Brian Kernighan,Jon Bentley,まつもとゆきひろ,Andy Oram,Greg Wilso

    Template Engine Nightで「Xslate振り返り」をしました - Islands in the byte stream (legacy)
    moznion
    moznion 2014/10/20
    めっちゃ参考になる発表でした,ありがとうございました!
  • WEB+DB PRESS Vol.81にAndroidの記事を書きました - Islands in the byte stream (legacy)

    Google I/O 2014が来週に迫った今日このごろですが、I/Oの前日に発売されるWEB+DB Vol.81に同僚たちとAndroidの特集記事を寄稿しました。私の担当はAndroid Studio+Gradleについてです。 とにかく変化の早いAndroid開発環境ですが、この一年で開発環境周りは格段に良くなってきています。また、いまから開発を始めるアプリなら2.x系のサポートも必須ではないでしょう。今回の記事ではそのあたりを踏まえて、Android開発の知見をまとめました。Androidの特集記事は以下の様な構成です。どうぞよろしく! Androidアプリ開発最前線 設計,実装,デザインの新定石! 第1章:最新Android開発環境構築ガイド Android StudioとGradleの基礎知識……藤 吾郎 第2章:あとで苦労しないための設計と実装 簡単なルールの導入で,可読性,

    WEB+DB PRESS Vol.81にAndroidの記事を書きました - Islands in the byte stream (legacy)
    moznion
    moznion 2014/06/24
    この記事参考になりました,あと3ヶ月早く知りたかった!!
  • Q. JavaのREPLってないの? A. あります! - Islands in the byte stream (legacy)

    GroovyはJavaの上位互換言語であり、インタラクティブシェルがあります。なので実質JavaのREPLとして使えます。 $ brew install groovy $ groovysh Groovy Shell (2.2.1, JVM: 1.7.0_45) Type 'help' or '\h' for help. --------------------------------------------------------- groovy:000> System.out.println("Hello") Hello ===> null groovy:000> import java.util.concurrent.*; ===> [import java.concurrent.util.*;] groovy:000> a = new CountDownLatch(10) ===>

    Q. JavaのREPLってないの? A. あります! - Islands in the byte stream (legacy)
    moznion
    moznion 2014/02/19
    これふつうに便利なんですよね
  • Gradleの共通ルーチンをライブラリ化してテストもする - Islands in the byte stream (legacy)

    https://github.com/gfx/gradle-android-utils (see .travis.yml, build.gradle, test/test.gradle) Android Studioで開発していてGradleを書いていると共通ルーチンをライブラリ化したくなるわけですが、そうなると当然テストしたりCIしたりしたいですよね。そこでちょっとやってみました。build.gradleに目的のコードをかき、 test/test.gradle にテストを書くのでいけます。 テストは gradlew で DEFAULT_JVM_OPTS="-ea" したうえで、 ./gradlew -b test/test.gradle check で実行します。原始的ですが、 taskのなかに assert をならべるとそれなりのテストになります。テスト自体は Groovy の pow

    Gradleの共通ルーチンをライブラリ化してテストもする - Islands in the byte stream (legacy)
    moznion
    moznion 2014/01/10
    cool!
  • Dart 1.0 を触ってみた。 - Islands in the byte stream (legacy)

    Dart 1.0 がリリースされて、ECMAでの標準化作業が始まったようです。 Chromium Blog: Ecma forms TC52 for Dart Standardization DartJavaScriptと比較してずっと使いやすいので、いずれ標準化されたDartが様々なブラウザで実行できるようになれば*1、JavaScriptに付随する問題の多くが解消され altJS も使われなくなるかもしれませんね。 Dartのメリットとしては、JSのしがらみにとらわれないぶん奇妙なイディオムに支配されることがないことや、それゆえ言語仕様やListやMapなどのコレクション型を含む標準ライブラリが独自に設計されており高機能ということ。デメリットとしては、JSの常識が通じない分学習コストが高いことと実行時のオーバーヘッドが高い*2ことなどでしょうか。 というわけで、以前作ったDartプロ

    Dart 1.0 を触ってみた。 - Islands in the byte stream (legacy)
    moznion
    moznion 2013/12/15
  • chomp() は $/ に依存していると知れ! - Islands in the byte stream

    perldocにあるように、chomp()の挙動は $/ に依存します。ということは、うっかり local $/ したスコープで chomp() を行うと、何もおきません。 この結果起きる現象がきわめて不可解なので、readlineの直後以外の場面ではchomp()を使わず s/\r?\n\z//xms するのが無難でしょう*1。 use strict; use warnings; local $/; my $s = "Hello\n"; chomp $s; print "[$s]\n"; # => #[Hello #] Xslateがまさにこれにはまっていたので修正しました。 https://github.com/xslate/p5-Text-Xslate/commit/92c7387b0f0ebdad5761c420a54564b9e8d2f635 [追記] *1:はてブのコメントをう

    chomp() は $/ に依存していると知れ! - Islands in the byte stream
    moznion
    moznion 2013/11/17
    s/\n\z//xmsすると特に「Cygwin」でハマるケースが多いので\rも加えたりするものであります
  • ISUCON用にNYTProf+Prefork PSGI serverのベストプラクティスをコマンドにまとめた - Islands in the byte stream (legacy)

    これが価値を発揮するような出題ではなかったので結局つかいませんでしたが。あとでCPANizeはするつもりです。 てきとうなところで ^C でとめると結果を自動的に集計してreportをつくるところまでやってくれます。あくまでも開発用で、番用ではありません。 なおこれを使う場合、アプリ側で DB::enable_profile() / DB::disable_profile() を行う必要があります。tokuhiromのエントリも参照のこと。 #!/usr/bin/env perl # usage: plackup-nytprof --port 1982 app.psgi use 5.10.0; use strict; use warnings; use Cwd qw(getcwd); use File::Path qw(rmtree); sub run { my(@args) = @_;

    ISUCON用にNYTProf+Prefork PSGI serverのベストプラクティスをコマンドにまとめた - Islands in the byte stream (legacy)
    moznion
    moznion 2013/11/11
    Cool!
  • visual_widthというgemを書いた - Islands in the byte stream (legacy)

    UnicodeのEast Asian Width (東アジアの文字幅)特性を扱うgemを書いた。CPANの Unicode::EastAsianWidth, Text::VisualWIdth::PP, Text::UnicodeTable::Simpleの機能をマージしたようなものになってる。文字特性のデータはUnicode仕様書から自動生成している。 https://rubygems.org/gems/visual_width ターミナルにさくっとテーブルを書きたいときは日語でもくずれないので便利かも。 # VisualWidth::Table require 'visual_width/table' t = VisualWidth::Table.new( style: [ { align: :center, width: 10 }, { align: :center, width:

    visual_widthというgemを書いた - Islands in the byte stream (legacy)
    moznion
    moznion 2013/10/28
    便利そう!
  • Perlでコールスタック上のサブルーチンの引数を得る - Islands in the byte stream (legacy)

    @DB::args でできます。 use strict; use warnings; use Data::Dumper; sub foo { bar(1, 2, 3) } sub bar { package DB { our @args; my $i = 0; while (() = caller $i) { print "$i: ", ::Dumper \@args; $i++; } } } foo('a', 'b', 'c'); outout: 0: $VAR1 = [ 1, 2, 3 ]; 1: $VAR1 = [ 'a', 'b', 'c' ]; もともとデバッガAPIの一部なので使い方はかなりマジカルで、DBパッケージ内でcaller()に引数を与えてかつリストコンテキストで評価すると@DB::argsにそのコールスタックでの引数がセットされるというものになっています。 以下pe

    Perlでコールスタック上のサブルーチンの引数を得る - Islands in the byte stream (legacy)
    moznion
    moznion 2013/09/30
  • PerlでWebAppの開発に必要なN個のこと - Islands in the byte stream (legacy)

    あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずPerlについて知っていることを書いた。 パッケージマネージャ まずライブラリの管理。モジュールをインストールし、可能であればバージョンを固定し、適切にロードする機能が必要だ。Perlの場合は cpanm というCPANクライアントでライブラリをインストールする。バージョンの固定とライブラリパスの設定は carton で行う。 https://github.com/miyagawa/cpanminus https://github.com/miyagawa/carton アプリケーションサーバ Webサーバへのインターフェイスとしては、PSGIという仕様がある。PSGIに準拠したツールキットとしてPlack

    PerlでWebAppの開発に必要なN個のこと - Islands in the byte stream (legacy)
    moznion
    moznion 2013/09/10
    モダァン
  • test-travis(1)というコマンドを書いた - Islands in the byte stream (legacy)

    https://github.com/gfx/App-test-travis Travis-CI は CPAN Testers のない言語だとライフチェンジングなサービスだし、 CPAN Testers のある Perl においてもpushごとにCIを走らせたりちょっと変わった設定でテストを走らせたりできる大変便利なサービスですが、設定ファイルを正しく書くのがわりと面倒で、うまく動かすために.travis.ymlを少し変更してcommit & pushというのを何度もするはめになったりします。なので、ローカルで.travis.ymlを読んで実行するコマンドがあれば便利だろうというのがこれを作った動機です。 まだ作りはかなり適当で、before_install, install, before_script, scriptセクションを順番に実行するだけのもので、envやversionsをよし

    test-travis(1)というコマンドを書いた - Islands in the byte stream (legacy)
    moznion
    moznion 2013/08/13
    更にライフチェンジング案件
  • each()は遅い上に微妙な問題も起きやすい - Islands in the byte stream (legacy)

    特別な条件がないかぎり、each()は使うべきではありません。代わりにkeys()/values()を使うべきです。その理由は2つあります。 each()は遅い each()でハッシュ全体をループするのは遅いです。これは、keys()/values()がその内部の値をそのまま参照する*1のに対し、each()は代入しないとその値を使えないからです。 ベンチマーク: #!perl use strict; use warnings; use Benchmark qw(cmpthese); my %hash = map { $_ => $_ } ( 1 .. 10000 ); cmpthese -1, { each_k => sub { while(my $key = each %hash) { } }, each_kv => sub { while(my($key, $value) = eac

    each()は遅い上に微妙な問題も起きやすい - Islands in the byte stream (legacy)
    moznion
    moznion 2013/07/19
  • Data::Dumper が壊れているという惨事 - Islands in the byte stream (legacy)

    あるいは PERL_CPANM_OPT=-n は危険だという話。 それはこのtweetから始まった。 結局これは Data::Dumper 2.143 が壊れていたからなのだが、そこに至るまでがちょっと大変だったので記録しておく。 まず、再現スクリプトは以下のものだった。 # executed in perl 5.10.1 use strict; use warnings; use Data::Dumper; use Text::Xslate; my $tx = Text::Xslate->new({ syntax => 'TTerse' }); my $template = <<TMPL; [% value | dump %] TMPL my $value = +{ 'ab' => 'c', }; print Dumper($value); my $ret = $tx->render_s

    Data::Dumper が壊れているという惨事 - Islands in the byte stream (legacy)
  • 1