Calendar.getInstanceについて勘違いをしていた


これも小さいことなのですが、
Calendar.getInstanceで入手できるインスタンスてSingletonだよな、
値を変更しても大丈夫か?という話になって
ちょっとGoogle先生に聞いてみたら、
どうやらSingletonパターンではなくFactoryパターンだったとのこと。


詳しくはこちらを参照↓
http://d.hatena.ne.jp/kuidaored/20110621/1308670418


getInstanceというメソッド名なので何も考えずにSingletonだと思ってました。
少しは調べないと駄目だねえ。


(ていうか、これくらい自分で調べろよと突っ込まれそう(汗。)

今更ながら拡張for文について


cero-tさんのはてなを何気なく見ていたら、
ArrayListでの拡張for文は通常のfor文より遅いという記述が。


あれ?そうだっけ?と思い、
後輩に聞いてみたら
昔自分からそのようなことを聞いたという証言が。


・・・全然覚えてない(汗


で、軽く試してみた。
普通にIntegerのListを回しながら足しこんでいく処理なので、
ソースの記述はなしで(^^;;


うん、確かに拡張for文の方が遅い。


で、ついでにJava SE 7だと拡張for文の方が早いとのことなので、
そちらも試してみた。


まあ、簡単な処理なので大した違いは出なかったが、
少なくとも通常for文と同じ速度が出てる。


Java SE 7ではより拡張for文を使ったほうがいいと。


ちい、覚えた!!!

やさしいdeviseの使い方


rails 2系までは認証プラグインとしてrestful_authenticationを使用していましたが、
残念ながらrestful_authenticationはrails 3系に対応していないということで、
新しい認証方式を探さなければいけません。


で、今はdeviseというのが流行りらしいので早速使ってみます。


基本的には次のページを参考に(というかほぼそのまんま)しています。

http://d.hatena.ne.jp/next49/20100905/p1
http://d.hatena.ne.jp/babie/20100729/1280381392

インストール


インストールは簡単で次のコマンドでOK。

gem install devise


railsプロジェクトを予めつくっておきます。


プロジェクト直下のGemfileに以下を追加します。

gem 'devise', '1.4.2'


その後次のコマンドを叩きます。

rails generate devise:install

app/views/layouts/application.html.erbに以下を追加。

<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>


config/environments/development.rbに以下を追加。

config.action_mailer.default_url_options = { :host => 'localhost:3000' }

使い方

まずはuserモデルを作成します。

rails g devise user

このあと、migrateファイルとmodelをいじって、
どういう形の認証をおこなうかを設定するのですが今回は省略。


deviseは認証画面などを簡単に作れて、次のコマンドでひと通りの画面を作って
くれます。

rails g devise:views


ログインしているかどうかのチェックをおこなうため、
app/controllers/application_controller.rbに次を追加します。

before_filter :authenticate_user!


適当にscaffoldしてからサーバ起動しアクセスすると、きちんと認証画面が表示
されます。
サインアップすると、ちゃんとscaffoldの画面が表示されます。


初めて触りましたが、結構細かい設定ができるようで、
かなりの好印象。今後はこれになるのかなあ。

rubyからLDAPでアクセスしてみる


お前は最近何をやっているんだとツッコまれそうなポストの統一感の無さですが、
今回はrubyLDAPを利用する方法を調べてみたのでメモ。



rubyを使ってLDAPにアクセスする場合にはいくつか方法があるのですが、
今回は環境がすぐ整えやすかったNet::LDAPを使用した方法を。


いつものごとく、他のページまんまです(^^;;

http://d.hatena.ne.jp/yotaropg/20100201/1265002090


インストール


インストールはgemで一発です。これが今回利用してみた理由。

gem install  ruby-net-ldap
使い方


まず、サーバへの接続は次の方法でアクセスします。

SERVER = 'ホスト名'    # ADサーバーのホスト名 or IPアドレス
PORT = 389             # ADサーバーのポート番号 (default 389)
BASE = 'ou=トップレベルOU, dc=hoge, dc=local'    # ou=トップレベルOU、
dc=ADドメイン名1, dc=ADドメイン名2, ...
DOMAIN = 'hoge.local'  # 「ADアカウント名@ADドメイン名」形式のドメイン
名部分

#LDAPサーバーに接続
conn = Net::LDAP.new :host => SERVER, :port => PORT, :base => BASE,
                    :auth => { :username => "#{account}@#{DOMAIN}",
                               :password => pass, :method => :simple }

その後バインドして成功すれば値を取得となります。

#認証処理
if conn.bind
 #属性取得
 entries = Hash.new
 conn.open do |ldap|
   filter = Net::LDAP::Filter.eq("cn", account)
   ldap.search(:filter => filter, :return_result => false ) do |entry|
     entry.each do |attr_name, values|
       entries[attr_name] = values
     end
  end
 end
end


こんな感じにやればLDAPを利用できます。
ソース自体はそんなに難しくないので、結構すんなりできそう。
問題は、自分がLDAP自体をよくわかっていないことだが・・・。

Java7のFork/Joinフレームワークを試してみたが


Java7のFork/Joinフレームワークを試そうと
ひとまずここに書いてあるのをやってみた。


http://www.javacodegeeks.com/2011/02/java-forkjoin-parallel-programming.html


実は英語をちゃんと読んでなかったのですがw
ここに書いてあるサンプルとそんなにずれていないのかなと。


http://d.hatena.ne.jp/nobeans/20100929/1285748043


ただ、このサンプルだとなぜかFork/Joinしたほうが遅くなる・・・。
きしださんのCallableでは早くなるんだけどな・・・。
これはJoinのオーバーヘッドが相当ということなのか?


誰か解説求む。

JDK7のプレビュー版が出たので早速触ってみた

ということで、JDK7のプレビュー版を触ってみた・・・
けど、そもそもJDK7にどんな機能があったのがかなり忘れていたので(^^;;
(LambdaもJigsawもJDK 8だったよな・・・)
skrbさんのProject Coinの部分を丸コピーで(汗


まずは簡単なところからダイヤモンド記法。
Genericsの<>の中をnewの部分は省略できるというもの。

       List<Integer> list = new ArrayList<>();

特にこれといったものは無いですね(^^;;


続いては数値のリテラル記法の追加。
数値を表すとき"_"で区切りを入れられるようになりました。
例えば"10000"を次のように書くことが可能。

       for (int i= 0; i<10_000; i++){
           list.add(i);
       }
       System.out.println(list.size());


このとき次のように実行されます。

10000
構築成功 (合計時間: 0 秒)


これだけだと、へーって感じですが、
次のようにやってみてもエラーとなりません。

       for (int i= 0; i<1_0_0_0_0; i++){
           list.add(i);
       }
       System.out.println(list.size());

しかも実行結果が一緒です。

10000
構築成功 (合計時間: 0 秒)

これに関しては古いシステムとか
数値を"_"でくっつけて扱っているシステムとか
あるんじゃないかなという気がしていて
意外にバグの温床になるんじゃないかなと思ってたりします。


次はcase文でStringが使えるようになった点。
こんなことができるようになりました。

       String str = "str";

       switch(str){
           case "Str":
               System.out.println("Str");
               break;
           case "str":
               System.out.println("str");
               break;
       }

実行結果はこんな感じ。

str
構築成功 (合計時間: 0 秒)

これは、意外に使いどころが難しいような気がします。


次はcatch文でのマルチキャッチ。
複数の例外を同じ場所でcatchできるようになりました。

       try{
               ・・・

       }catch(NullPointerException | ArrayIndexOutOfBoundsException e){
               ・・・
       }

catchの括弧の中が長くなるのが欠点ですが、地味に使えるかも。



最後はストリームを自動的にcloseしてくれる書き方。
次の書き方をするとfinally句でcloseしなくても
自動的にcloseしてくれるようです。

       try (InputStream in = new FileInputStream("C:\\test.txt");
            OutputStream out = new FileOutputStream("C:\\testA.txt")) {

           byte[] buf = new byte[1024];
           int n;

           while((n = in.read(buf)) >= 0) {
               out.write(buf, 0, n);
           }
       } catch (IOException ex) {
           ex.printStackTrace();
       }

ちょっと特殊な書き方をしないとcloseしてくれないのか。
この場合、当たり前ですけど、
in、outのスコープはtry句の中だけになりますが、
意外にすっとぼけて微妙にはまりそうな気がちょっとします。
(私のことです・・・Javaを最近触っていなかったからなあ・・・)


他にも機能があるのですが、それはまた機会があればということで。
(というか調べている余裕が・・・)


P.S.
これらの実行はほとんどRuby専用機となっていたNetBeansで試したのですが、
最近のNetBeansはprintStackTraceを書いたら怒られるんですね。
知りませんでした・・・。