タグ

ブックマーク / unageanu.hatenablog.com (19)

  • React.js + Webpack + ContainerJSでTODOリストを作ってみた - うなの日記

    React.js + Webpack + ContainerJS でTODOリストを作ってみたので、手順をまとめます。 以前書いた、Knockout + ContainerJS でテスタブルにToDoリストを作るチュートリアル - うなの日記の改訂版。 最近流行ってるライブラリのお試しも兼ねて、いろいろ組み合わせて使ってみようという試みです。 ソース全体はこちらで公開しているので、あわせて参照ください。 ポイント モジュールローダーを require.js → Webpack に ソースはクラス単位で分割管理して、Webpackで1ファイルにまとめてリリースします。 WebpackだとAMDもCommonJSも両方扱えるので、npmのライブラリが使いやすくなるのは大きいかな。 あと、Loaderも便利ですね。 Viewモジュールを Knockout.js → React.js に 流行って

  • モジュールで定義された定数名の一覧を取得したい - うなの日記

    Module.constantsでモジュールで定義された定数名の一覧を取得できます。 module Test FOO = 0 VAR = 1 # 定数: ねこID KITTEN_MII = 0 KITTEN_TORA = 1 KITTEN_SHIRO = 2 KITTEN_KURO = 3 end puts Test.constants 実行結果です。 KITTEN_SHIRO KITTEN_TORA FOO KITTEN_MII KITTEN_KURO VAR定数値をわかりやすい文字列にさくっと変換したいときに使えます。次のような関数を定義してやればOK。 module Test module_function # ねこIDをわかりやすい名前に変換する。 def to_kitten_name(value) return Test.constants.find {|name| name =

    モジュールで定義された定数名の一覧を取得したい - うなの日記
  • 2010-01-17

    JavaClassを使って指定メソッドの呼び出し元を探索しツリー表示するスクリプトを書いてみました。 引数で指定されたパス以下の*.class,および*.jarに含まれるクラスファイルを解析し、 メソッドの呼び出しコードを収集。 収集した情報を再帰的に探索し、呼び出し元メソッドをツリー形式で出力します。 使い方 $ ./caller.rb <クラスが置かれたディレクトリorJarファイル> <呼び出し元を探すメソッド> 呼び出し元を探すメソッドは「<メソッドが定義されたクラスのFQCN>#<メソッドのディスクリプタ表記>」で指定します。具体的には以下のような形になります。 java.Util.ArrayList#indexOf(Ljava/lang/Object;)I クラスが置かれたディレクトリ or Jarファイルは、「;」区切りで複数指定可能です。 具体例 ↓のようなクラスがあったと

    2010-01-17
  • 呼び出しもとの関数名を取得する - うなの日記

    組み込み関数「caller」の結果を解析すれば可能です。 # 呼び出しもとの関数名を取得する関数 def function_name # 正規表現は、Rubyのリファレンスのものを拝借してます。 if /^(.+?):(\d+)(?::in `(.*)')?/ =~ caller.first return $3 end end # テスト用クラス。 class Test def foo function_name end end puts Test.new.foo puts function_name 実行結果です。 foo nilちなみにJavaだとこんな感じでできます。

    呼び出しもとの関数名を取得する - うなの日記
  • Javaでcallee - うなの日記

    メソッド内の処理でそのメソッド自身への参照を簡単に得る方法。Java5.0以降のみですが、JavaScriptで使えるarguments.calleeみたいなのが簡単に実現できます。 ...まぁ、Class#getMahod()でとれるっちゃーとれるんですが、これだとメソッド名を指定する必要があります。以下の方法はメソッド名を知らなくても現在のメソッドを取得できるのがメリットかな。 メソッド自身への参照を得る 関数にしました。1.5より、無名クラスからそれを定義したMethodの参照がとれるようになったのでそれを使います。 /** * メソッド自身を取得する。 * @param o メソッド内で作成した無名クラス * @return メソッド自身 */ static Method callee( Object o ) { return o.getClass().getEnclosingMe

    Javaでcallee - うなの日記
  • GMailのSMTPサーバーを使ってメールを送信するサンプル - うなの日記

    GMailのSMTPサーバーに接続し、メールを送信するサンプルです。 TMail利用してメールを作成。 これを使うと、日語メールや添付ファイル付きメールもさくっと作成できるみたいです。 メールの送信はRuby付属のNet::SMTPで。 GMailのsmtpサーバーでは、TLSによる暗号化が必要なので「tlsmail」を利用して対応します。 あと、認証も必須です。 require 'rubygems' require 'tmail' require "tlsmail" # tmailでメールを作成 mail = TMail::Mail.new mail.to = 'foo@var.com' mail.from = 'foo@gmail.com' mail.subject = 'test mail' mail.date = Time.now mail.mime_version = '1.0

    GMailのSMTPサーバーを使ってメールを送信するサンプル - うなの日記
  • 指定フォルダ以下のjarをCLASSPATHに入れる。 - うなの日記

    シェルスクリプトでJavaのラッパーを書くハメになったときによく使います。 #!/bin/sh CLASSPATH= for name in `ls lib/*.jar`; do CLASSPATH="${CLASSPATH}:$name" done echo ${CLASSPATH} 「ls」した一覧をループして追加していく仕組み。「lib」以下に「a.jar」,「b.jar」があるとすると、以下が出力されます。 :lib/a.jar:lib/b.jar

    指定フォルダ以下のjarをCLASSPATHに入れる。 - うなの日記
  • XSSの攻撃手法いろいろ - うなの日記

    html5securityのサイトに、XSSの各種攻撃手法がまとめられているのを発見せり!ということで、個人的に「お!」と思った攻撃をサンプルつきでご紹介します。 1. CSS Expression IE7以前には「CSS Expressions」という拡張機能があり、CSS内でJavaScriptを実行できたりします。 <div style="color:expression(alert('XSS'));">a</div> 確認 @IT -[柔軟すぎる]IEのCSS解釈で起こるXSS で詳しく解説されていますが、CSSの解釈が柔軟なことともあいまって自前で無害化するのはなかなか困難。以下のようなコードでもスクリプトが実行されてしまいます。 <div style="color:expr/* コメントの挿入 */ession(alert('XSS'));">a</div> 確認 <div s

    XSSの攻撃手法いろいろ - うなの日記
  • EnumMapがどれだけ早いか性能を測ってみた。 - うなの日記

    EnumMapとかいうEnumのみをキーにできるMapがあって、これがEnumの連番を使って高速に動作するらしい。(→Java プログラミング言語 - 列挙型) ということでとりあえず性能を測ってみた。 計測方法 EnumをキーとしたMapのインスタンスをいろいろ作成し、 get、putをそれぞれ500000*26回実行した場合の所要時間を計測。 それぞれ5回試行し、平均を取る。 結果 get put EnumMap 312ms 490ms HashMap 593ms 921ms TreeMap 334ms 1490ms LinkedHashMap 497ms 690ms うん、まぁ、早いかな。> EnumMap。 なお、計測環境のCPUは Pentium D 2.79GHz, JDKは1.6.0_07です。 計測で使用したコード 計測で使用したコードは以下の通り。 // テスト用の列挙型

    EnumMapがどれだけ早いか性能を測ってみた。 - うなの日記
  • データストアの単体テストを書く手順 for 1.3.3 - うなの日記

    GAEのSDKを1.3.3にバージョンアップしたら、データストアの単体テストがコンパイルエラーに! ドキュメントを見ると、どうやらテストケースの書き方が変わったらしい。(1.3.1 - 1.3.2はスルーしていたので、実はずっと前からかもですが) ということで、SDK1.3.0の頃に書いたテストケース作成手順を1.3.3での手順に更新しておきます。ユーティリティクラスが用意されて、以前より少ないコードで済むようになってますよ。 単体テストとは? 単体テストでは、 ローカルでGoogle App Engineのサーバーを起動することなしに、 データストアにアクセスするモジュールのテストを記述できます。 公式なドキュメントはこちら。日語のドキュメントはまだ更新されていない(2010-05-01 現在)ようなのでご注意。 概要 必要なモジュールをプロジェクトに追加 テストケース内でLocalS

    データストアの単体テストを書く手順 for 1.3.3 - うなの日記
  • Javaクラス解析機を作る 10日目 - うなの日記

    メソッドのコード属性の読み込みに対応。コード属性の属性として付与される、ローカル変数属性、行番号属性、例外テーブル属性もまとめて実装しました。 ここまでの解析コード →Javaクラス解析機 080421 動作サンプル 解析対象クラス(のソース)。 public class HelloWorld { public static void main ( String[] args ) { String str = "Hello World!"; System.out.println( str ); } } 解析! require "javaclass" [ "./java_class/HelloWorld.class" ].each { |c| open( c, "r+b" ) {|io| jc = JavaClass.from io puts jc.to_s puts "" } } 実行結果

    Javaクラス解析機を作る 10日目 - うなの日記
  • javaclassでCode属性とStackMapTable属性の解析をサポート - うなの日記

    javaclassにCode属性とStackMapTable属性の解析機能を実装してコミットしましたよ。 →GitHub - unageanu/javaclass 以下はjavaclassを使ってクラスの解析結果を表示する例です。Code属性の解析をサポートしたので(昔と違って)javapに近い結果が得られるようになっています。 require "javaclass" open( "./java_class/HelloWorld.class", "r+b" ) {|io| jc = JavaClass.from io puts jc.to_s } 解析対象のクラスは次のとおり。 public class HelloWorld { public static void main ( String[] args ) { String str = "Hello World!"; System.o

    javaclassでCode属性とStackMapTable属性の解析をサポート - うなの日記
  • Basic認証を行う簡単なサンプル - うなの日記

    SinatraのFAQにBasic認証を行うサンプルがあったので試してみます。といっても、「set Rack::Auth::Basic」を呼び出すだけ。 require 'rubygems' require 'sinatra' # 認証を設定。 # ユーザー名が「foo」,「var」の場合のみアクセスを許可する。 use Rack::Auth::Basic do |username, password| username =~ /(foo|var)/ end # 後は普通にrouteを登録すればOK get( "/" ) { 'Hello world!' } スクリプトを実行し、 http://127.0.0.1:4567/にアクセスすれば、Basic認証のダイアログが表示されます。 特定のパスでのみ認証を有効化する 上の例では、サーバーのすべてのパスで認証が必要になります。特定のパスにア

    Basic認証を行う簡単なサンプル - うなの日記
  • HttpClientでの通信内容を表示する。 - うなの日記

    HttpClient#debug_devにSTDOUTなどを設定しておくと、通信内容を出力してくれます。 require 'rubygems' require 'httpclient' client = HTTPClient.new client.debug_dev=STDOUT #デバックデータの出力先として「STDOUT」を設定 client.get_content( "http://d.hatena.ne.jp/unageanu/" ) 実行結果です。 = Request ! CONNECT TO d.hatena.ne.jp:80 ! CONNECTION ESTABLISHED GET /unageanu/ HTTP/1.1 Date: Sun, 08 Feb 2009 08:00:21 GMT Content-Length: 0 Host: d.hatena.ne.jp = R

    HttpClientでの通信内容を表示する。 - うなの日記
  • 可変長引数 - うなの日記

    可変長引数の使い方。Javaのとだいたい同じ感じです。 引数に「*」をつけると可変長引数となります。 可変長引数とされた場合、関数呼び出し時に指定された引数のうち、普通のをのぞいた残りの引数が配列に格納されて関数に渡されます。 関数内では可変長引数は配列として扱えます。[index]で値を参照したり、sizeで要素数を取得したりできます。 引数が余らなかった場合は、空の配列が渡されます。 関数が受けつける引数のうち、最後の引数のみ、可変長引数にできます。 # 可変長引数の関数。 def foo( *args ) puts "--" puts args.class # 引数が配列で渡される。 puts args.join(",") puts args.length # 配列なので配列のメソッドが使える。 end foo( "a", "b", "c" ) foo("a") # 引数がひとつでも

    可変長引数 - うなの日記
  • Sinatraで遊んでみる - うなの日記

    Sinatraは、Rubyで簡単にWebApplicationを作成できるDSL(ドメイン特化言語)です。 インストール $ gem install sinatra シンプルなサンプル 以下は、"/"にGETでアクセスされた場合、"Hello World"を返すWebサーバーを起動するだけの単純なサンプルです。 require 'rubygems' require 'sinatra' # "/"にGETでアクセスされた場合、"Hello World"を返す。 get( "/" ) { 'Hello world!' } 起動して、以下のURLにアクセスすれば http://127.0.0.1:4567/「Hello world!」が返されてくるはず。ログをみる限りでは、内部的にはWebrickを利用しているみたい。また、デフォルトでは、Daemonにはならないようです。 portを指定する

    Sinatraで遊んでみる - うなの日記
  • method_missingでインターセプト - うなの日記

    インスタンスにメソッドが定義されていない場合、method_missing が実行されます。これを利用して簡単なインターセプタが作れます。 サンプル: class EchoInterceptor def initialize(delegate) @delegate = delegate end def method_missing( name, *args ) begin # メソッド呼び出しの前に実行する処理 print "method " << name.to_s << " start.\n" return @delegate.send(name, *args) ensure # メソッド呼び出しの後に実行する処理 print "method " << name.to_s << " end.\n" end end end class Tora def meow print "meow!

    method_missingでインターセプト - うなの日記
  • define_methodを使ったインターセプタ - うなの日記

    前に作ったmethod_missingを使ったインターセプタですが、これには「インターセプタ適用対象のオブジェクト内で呼び出した自身のメソッドにインターセプタが適用されない」という問題があります。まぁ、わかっていたことですが、それだと困る状況に陥ったため、define_methodを使ってインターセプタを織り込む奴を作ってみました。 インターセプタ適用対象のメソッドに上書きして、インターセプタ織り込み済みメソッドを定義します。 define_methodを利用 これにより、インターセプタ適用対象のオブジェクト内から自身のメソッドを呼び出した場合にもインターセプタが適用されるようになります。 もともとのメソッドは別名をつけて保存しておきます。 MethodInvocationのproceed()ではこいつを実行します。 オブジェクトの特異メソッドを任意の名前で定義する方法がわからなかったので

    define_methodを使ったインターセプタ - うなの日記
  • プログラムをdaemonにする。 - うなの日記

    rubyプログラムをdaemonとして実行する方法について。 deamon化の手順 deamon化の手順については「PC覚え書き-プログラムのデーモン化」の解説が詳しい。ポイントは次の通りです。 子プロセスの生成 fork関数を実行して子プロセスを生成し、親プロセスを終了させる。 これにより、プロセスはinitプロセスグループに属するプロセスになる。 次に行うsetsidは、プロセスグループリーダーで行うと失敗するので、この処理を行ってプロセスリーダーでない状態にしておく。 セッションの新規作成と割り当て Process.setsid関数を実行し、新規にセッションを開始して割り当てる。 子プロセスの再生成 fork関数を再度実行して、initプロセスグループに属するプロセスにする。 こうすると制御端末を設定することができなくなってよいらしい。 デバッグモード等で制御端末が必要な場合は実行し

    プログラムをdaemonにする。 - うなの日記
  • 1