Quantcast
Channel: プラネット NetBeans
Viewing all 4643 articles
Browse latest View live

Happy my life: ノマドワーキングで気をつけていること

$
0
0

最近は喫茶店などで仕事することが多くなってきた。

決まった場所にこもってモクモクと進めるのもいいのだが、ずっと同じ環境で続けて、進行が煮詰まってきた時にはもうやる気が起きなくなる。そんな時にノマドワーキング(喫茶店などでPCを広げて仕事)すると非常に捗ったりする(そういう意味では、1つよりは2つの仕事を平行して抱えている方が精神衛生上よい)

そんな風に外で仕事するにあたって、いくつかポイントが見えてきたのでここでまとめておく。

混んでない時間、店舗を選ぶ

これは、第一に仕事に集中するというのがある。

やはり混んでいる店は仕事に集中できない。一度座席を確保するのも困難なくらい混んでいる喫茶店で仕事してみたことがあったが、人の出入りが多い、話し声が嫌でも入ってくるということで1回で凝りた。

あと、混んでない時間を選ぶのは私なりの店側への配慮もある。

私が1つの座席で数時間居続けるという”店にとってありがたくない客”であることには間違いない。そして、これからもお世話になる店でもあるので、店の迷惑にならないよう、ランチタイムなどを外して行くことにしている。

これなら落ち着いて仕事もできるし、店にも迷惑かけない(はず)。あとは、店員さんに顔を覚えてもらえるというオマケつき。また、ちょっと座席を立つにしても、そのまま広げて立つことができるというのもある。

予備バッテリ持参

このようなノマドワーキングでネックになる問題の一つが電源の問題。

ルノアールのような電源完備の喫茶店があれば最高なのだが、近所でそのような店舗は稀だし、電源確保という理由だけで行ける店が限定されてしまうのももったいない。あとは、電源が利用できる席に常に座れるとも限らない。

なので、予備バッテリを持って行くようにしている。これなら、どの店舗、どの席でも問題ない。途中バッテリを交換して続けておこなう。とはいっても、最大5時間ぐらいが限界なので、その程度使えればいいや、という判断で持ち歩いている。

自分のネットワーク通信環境は必須

仕事に集中したいときは、基本的にネットに接続してない方がなにかと捗ることが多い。

ただ、調べものをしたりメールチェック(そして返信)したり少しは必要となるので、WiMAXで接続するネットワーク通信環境はやはり必要。店によってWifiを完備している店もあるが、これも先ほどのバッテリと同じ理由で、それによって店を限定したくないという気持ちがある。

このような通信環境は、接続しっぱなしだとPCの電池消耗が激しくなるので、接続時間は最低限に抑える必要があるのだが。

ノイズキャンセリング付きヘッドフォン必須

基本的に多くの人が出入りする環境で仕事するのでノイズは多い。なので、そのような場所でも集中して仕事ができるように、ノイズキャンセリング付きヘッドフォンはほぼ必須となる。

普段は、SONY ウォークマン Sシリーズ <メモリータイプ> 8GB NW-S754/Lを利用している。

仕事中は、ずっと何らかの音楽をかけながらすることで、他の音が気にならなくなる(ゼロになるわけではない)。あとは、席に着席したあとに音楽をかけると、一種に儀式のようになるので、やる気スイッチが入るようになる、というメリットもある。一度再生すると、いつもの音楽が流れてくるので、仕事にすっと集中しやすくなる。

など、メリットは多い。というか、私はこのwalkmanを必須にしている。無いことに気付いたら取りに戻るぐらいに。いくら静かな店舗でも、これ無しでは仕事はできない…。

こんな感じで

外出先での仕事は、だいたいこんな感じ、やはり仕事中の気分転換の方法はいくつか持っておくべきだなーと思った次第で。



きしだのはてな: Igoという形態素解析器をつかって圧縮新聞っぽいものを作ってみる

$
0
0

うどんのこんぶだしが取れるまで時間があったので、ちょっと試しにつくってみました。

簡単なプログラムだけど、それっぽい結果がでてます。登録する文章しだいで結構おもしろくなりそう。


Igoはこれです。

Igo - a morphological analyzer

ここに書いてある手順で辞書バイナリを作ってください。

あとは、ソース中でその位置を指定します。


で、上側のテキストエリアに新聞記事をはりつけて「登録」ボタンを押します。

f:id:nowokay:20110602182124p:image


いくつか新聞記事を登録して「生成」ボタンを押すと、なんかそれっぽい文章が生成されます。

f:id:nowokay:20110602182125p:image

文章の生成自体は、簡単なプログラムでそれっぽいものができることがわかりました。

まあ、文章のクロールと、あとは記号なんかの処理が大事そうです。違う分野の文章をまぜたほうがおもしろい文章が生成されそう。


追記--

うどんおいしくできあがりました。

f:id:nowokay:20110602184820j:image

--追記ここまで


めんどいので、NetBeansの生成したそのままのソース。Java7でコンパイルするか、<>オペレータを適当に修正してください。

import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import
      java.util.Random; import java.util.Set; import net.reduls.igo.Morpheme; import net.reduls.igo.Tagger; /**  * @author naoki  */ public class AsshukuFrame extends javax.swing.JFrame { Tagger tagger; /** Creates new form AsshukuFrame */ public AsshukuFrame() { try { tagger = new Tagger("path to dic");//辞書バイナリへのパス } catch (IOException ex) { ex.printStackTrace(); } noSeparate.addAll(Arrays.asList("「", "」", "(", ")","、", "・")); initComponents(); } /** This method is called from within the constructor to  * initialize the form.  * WARNING: Do NOT modify this code. The content of this method is  * always regenerated by the Form Editor.  */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jScrollPane1 = new javax.swing.JScrollPane(); taArticle = new javax.swing.JTextArea(); jScrollPane2 = new javax.swing.JScrollPane(); taLog = new javax.swing.JTextArea(); btnRegister = new javax.swing.JButton(); btnGenerate = new javax.swing.JButton();
      setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); taArticle.setColumns(20); taArticle.setRows(5); jScrollPane1.setViewportView(taArticle); taLog.setColumns(20); taLog.setRows(5); jScrollPane2.setViewportView(taLog); btnRegister.setText("登録");
      btnRegister.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnRegisterActionPerformed(evt); } }); btnGenerate.setText("生成"); btnGenerate.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnGenerateActionPerformed(evt); } }); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap()
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 470, Short.MAX_VALUE) .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 470, Short.MAX_VALUE) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addComponent(btnGenerate)
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(btnRegister))) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 112, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnRegister) .addComponent(btnGenerate)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 270, Short.MAX_VALUE) .addContainerGap()) ); pack(); }// </editor-fold> static
      Set<String> noSeparate = new HashSet<>(); private static class Morph{ String word; String element; int nextCount = 0; public Morph() { } public Morph(Morpheme m) { word = m.surface; element = m.feature; } Map<Morph, Integer> counter = new HashMap<>(); void add(Morph m){ int count = 0; if(counter.containsKey(m)){ count =
      counter.get(m); } counter.put(m, count + 1); ++nextCount; } boolean isSeparator(){ if(!element.startsWith("記号,")){ return false; } return !noSeparate.contains(word); } @Override public int hashCode() { return getKey().hashCode(); } @Override public boolean equals(Object obj) { if(obj == null)
      return false; if(!(obj instanceof Morph)) return false;//継承したオブジェクトも受け入れてみる。 return ((Morph)obj).getKey().equals(getKey()); } public String getKey(){ return element; } } private static class StartMorphs extends Morph{ } private static class Endmorph extends Morph{ @Override boolean isSeparator() { return true; } } Morph start = new StartMorphs(); Morph end = new Endmorph(); Map<Morph, Morph> morphs = new HashMap<>();//比較キーを試しに切り替えるためにこんなことに。 private Morph createMorph(Morpheme m){ Morph key = new Morph(m); if(morphs.containsKey(key)){ return morphs.get(key); }else{ morphs.put(key, key); return key; } } private void btnRegisterActionPerformed(java.awt.event.ActionEvent evt) { String str = taArticle.getText(); str = str.trim(); if(str.isEmpty()) return; //形態素解析
      List<Morpheme> morphList = tagger.parse(str); Morph preMorph = start; for(Morpheme m : morphList){ Morph mm = createMorph(m); preMorph.add(mm); if(mm.isSeparator()){ preMorph = start; }else{ preMorph = mm; } } if(preMorph != start){ preMorph.add(end); } taLog.append(morphList.size() + "単語を登録\n"); } Random rand = new Random(); private void btnGenerateActionPerformed(java.awt.event.ActionEvent evt) { Morph pre = start;  WORD: for(int i = 0; i < 100; ++i){ int next = rand.nextInt(pre.nextCount); int c = 0; for(Map.Entry<Morph, Integer> ent : pre.counter.entrySet()){ c += ent.getValue(); if(next < c){ pre = ent.getKey(); if(pre instanceof Endmorph) break WORD; taLog.append(pre.word); if(pre.isSeparator()) break WORD;
      break; } } } taLog.append("\n"); } /**  * @param args the command line arguments  */ public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new AsshukuFrame().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton btnGenerate; private javax.swing.JButton btnRegister; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTextArea taArticle; private javax.swing.JTextArea taLog; // End of variables declaration } 

Happy my life: IdeaPad s10-3にUbuntuをインストール

$
0
0

USからの個人輸入して利用しているので、プリインストールされているのは、Windows7Start(英語版)。しかし最初から利用する気もなく、速攻削除して、UbuntuDesktopをインストールをはじめた。が、ここでワナが待っていた…

Ubuntu 11.04 をインストール

最初にUbuntu11.04をインストール。OSそのものの動きは非常に快適なのだが、問題は、サスペンド/レジュームから復帰しないこと。復帰しないので強制再起動するしかないという。

気軽にサスペンド/レジュームができないとNetBookのよい点を殺すことになる。これは致命的。そしてググってみたところ、バグとして報告されていた…。

Ubuntu 10.04LTSをインストール

ということで、結論としてはUbuntu 10.04LTSをインストールして解決した。Ubuntu11.04という最新版OSだと、こういったトラブルがすべて解決されているかと思いきや、そうでもないらしい。

こういったトラブルが発生すると、”MacOS XはOSとしてできているよなあ”と思う。まあ当り前の話なのだが。Ubuntuをハードメーカが公式サポートしてくれたら、こういったトラブルが減るとは思うけど、そういう認知はもう少し先の話になりそうだ。

その他インストールしたもの

  • LibreOffice
  • xim-skk
  • Emacs + ddskk
  • DropBox
  • JDK6 + Eclipse

今のところはこんな感じ。基本Emacs + SKKがあればやっていける(笑)

役割からいうとWeb,プレゼン,文章書きができればOKな環境なので。それ以上入れたところで、あまり意味がない気もする。マシンスペックもそんなに高くないし。これで、どこでも仕事ができるぞー。

Lenovo IdeaPad S10-3シリーズ 10.1型TFT液晶 ネットブック 0647AQJ
Lenovo (2010-10-27)
売り上げランキング: 2783


torutkの日記: [Java][NetBeans]NetBeansのモジュールファイルをハック

$
0
0
NetBeansのSQEプラグインに含まれるCheckstyleのバージョンが古い(5.0-beta1)ので、新しいバージョン(5.3)にどうやって置き換えられるかを追い求めてみました。 (2011/06/20に更新されたSQEではCheckstyle 5.3対応したようです) SQEプラグインのソースを入手して修正する プラグインインストール後のファイルをいじる SQEプラグインのバイナリに手をいれる SQEプラグインのソースを入手して修正する(王道編) SQE - Softw ...

Happy my life: Amazon EC2でAndroid(gingerbread)をビルドする(設定編)

$
0
0

巷というかWeb界隈ではよく話題にあがるAmazon EC2。では、Androidのソースコード(gingerbread)をビルドすると、どの程度の時間でビルドが完了するのかなーと試してみたくなったので、やってみた。

Amazon EC2はインターネットサービスに限定せずに、ネットワーク接続されているPCとも考えられるので、リモートのLinuxマシンに見立てて、そこでAndroidのソースコードをビルドすることも勿論可能。EC2を利用することで、場所やマシンを限定せずにビルドできるようになるという。どこでもビルドできるって素敵だね(棒)

ってことでビルド環境を仕立てたが、私はEC2自体よく知らない状況から始めたので、試行錯誤しながら進めていった。このエントリーが参考になればいいな、ということで。

基本的にUbuntu 10.04LTS Server(64bit)をEC2上に構築して、そこにビルド環境を整える手順となる。そういった意味では、Androidに限らずEC2でUbuntu使いたい人には参考になるかと。

EC2の契約

何はともあれまずは契約。契約方法については、ここでは省略。契約編:Amazon クラウド- AWS/EC2でSAP環境構築(1/10)|Realtech Japan(リアルテックジャパン)が参考になるかと。一つ注意する点があるとすれば、AWSのユーザ登録の際、携帯番号の登録が必須となっており、その過程で海外から自動音声による電話の着信による確認がある。着信を取ると、英語の自動音声アナウンスが流れて、最後に4ケタの暗唱番号を入力するようアナウンスがある。

あとはブラウザには4ケタの数字が表示されているので、それを入力する。英語でいきなりしゃべるので少しビビるが相手は機械だ、あせるな、ということを言いたかっただけで(笑)

Ubuntuのイメージとか、リージョンとか

登録完了後は、まずは自分が利用するUbuntuのインスタンス(実行イメージ)を作成する必要がある。一番お手軽なのが、公式配布されているAMI(設定済OSのマシンイメージ)を自分のインスタンスとしてコピーする方法。

この手順は、Ubuntuの公式サイトであるEC2StartersGuide – Community Ubuntu Documentationに書かれている。今回は、Ubuntu10.04LTS(64bit)を利用した。

あとAMIは、リージョンごとに決められている。リージョンとは、インスタンスを設置する地域のこと。EC2のサーバは、アメリカ(us-northeast, us-west)、EU、シンガポール、東京にあるので。

本当は東京で作成したかったのだが、公式のUbuntuのイメージが、us-northeast, us-westにしか用意されていなかったので、日本に近いus-westで。まあ、us-westから東京に移転させる事も可能なのだが、今回はそのままで。

http://uec-images.ubuntu.com/releases/10.04/release/ には、AMIとして用意されているUbuntu 10.04LTSが多数紹介が紹介されていて、どれを選択してよいか分からず面喰らうかもしれない。今回は”us-west-1″、”64bit”、”ebs”(イメージが停止しても設定ファイルが消えないファイル)ということで、”ami-8d1d4fc8″を利用した。

環境設定

インスタンス生成や起動などといったEC2の環境をリモート操作する方法は2通りあって、1つはブラウザから操作する方法、もうひとつは”Amazon EC2 API Tools”というCUIツール群を利用する方法がある。

今回は、EC2StartersGuide – Community Ubuntu Documentationに従ってAmazon EC2 API Toolsを利用する。実行するには、Javaの実行環境が必要となる(JDK、OpenJDKどちらでもOK)。以下、EC2StartersGuide – Community Ubuntu Documentationを参考に作成していく。

Amazon EC2 API Toolsのインストール

Ubuntuでは、パッケージも用意されているが、最新版を利用した方が無難だろう、ということで、Amazon EC2 API Tools : Developer Tools : Amazon Web Servicesからダウンロードした。展開するとreadmeファイルとか、binディレクトリ、libディレクトリなどが生成されているが、それらをまるごと$HOME/ec2toolsディレクトリにコピー。

秘密鍵、X.509証明書の取得

EC2のインスタンスにアクセスするには、X.509の証明書が必要となるので、秘密鍵、X.509証明書の2つのファイルをダウンロードしておく。

X.509証明書は、ログイン後、「セキュリティ証明書」「アクセス証明書」で、”新しい証明書を作成する”から秘密鍵、X.509証明書が取得できる。

取得した2つのファイルは、.ec2ディレクトリに移動

mv *.pem $HOME/.ec2

環境変数の設定

あとは環境変数の設定を ~/.bashrcに追加する。

export JAVA_HOME=/usr/lib/jvm/java-6-sun export EC2_HOME=$HOME/ec2tools export EC2_CERT=$HOME/.ec2/cert-xxxxxxx.pem export EC2_PRIVATE_KEY=$HOME/.ec2/pk-xxxxxx.pem export PATH=$EC2_HOME/bin:$PATH

そして設定を有効化。

source ~/.bashrc

つぎに公開されているAMIを利用するために、sshの鍵を生成して保存する必要がある。今回は、us-west-1を利用しているので、リージョンの設定を忘れないこと(リージョンの指定を忘れると、us-northeastを設定したことになる)

あとは秘密鍵なのでアクセス権限も600にしておく。

ec2-add-keypair ec2-keypair --region us-west-1 > ec2-keypair.pem mv ec2-keypair.pem $HOME/.ec2 cd $HOME/.ec2 chmod 600 ec2-keypair.pem

インスタンスの設定

ここでようやくインスタンスが設定できる。マイクロインスタンスで動作させる場合は以下のようになる。これで起動する。

ec2-run-instances ami-8d1d4fc8 -k ec2-keypair -t t1.micro --region us-west-1

インスタンスが起動しているか確認する(AWS マネージメントコンソール から確認することもできる)

ec2-describe-instances --region us-west-1

あとは、port22(ssh)を開ける。

ec2-authorize default -p 22 --region uw-west-1

sshにてログインする。

ssh -i $HOME/.ec2/ec2-keypair.pem ubuntu@<external-host-name>

このときのexternal-host-nameは、インスタンス生成後に割り当てられるPublic DNSを指定すること(ec2-(数字)-(数字)-(数字)-(数字).us-west-1.compute.amazonaws.com みたいなアドレス) ec2-describe-instancesで確認することができる。

ec2-describe-instances --region us-west-1

あとは

ここまできたら、Ubuntu10.04LTS(64bit)にアクセスする環境が整った。あとは通常のgingerbreadのビルド環境を構築するだけの話。次回は、これを利用してベンチマークしてみる。

Amazon Web Services ガイドブック クラウドでWebサービスを作ろう!
Jeff Barr
インプレスジャパン
売り上げランキング: 52506


Happy my life: Amazon EC2でAndroid(gingerbread)をビルドする(ベンチマーク編)

$
0
0

前回のエントリーの続き。ということで、実際にrowboatのgingerbreadをビルドして時間を計測してみた。ちなみに、インスタンスは64bitOSが利用できるものしか試していない。

測定方法

同一AMIを利用して、起動するインスタンスを切り替えて測定した。本来なら何度も測定してその平均を取るべきなんだろうけど、今回は1回のみの測定。マイクロインスタンスで時間がかかりすぎて、力尽きたというのが大きな理由…。

マイクロ インスタンス

最初は、一番安いマイクロインスタンスから。

  • 613 MB メモリ
  • 最大2 EC2 Compute Units (短期の定期的なバースト)
  • EBS ストレージのみ
  • 32 ビットまたは 64 ビットのプラットフォーム
  • I/O 性能: 高
  • API 名: t1.micro

ビルド中、メモリ不足によるOOM Killerが発生するのでSwapファイルの設定が必須となる。

実際にビルドしてみたが結論としては使いものにならない。どの程度使いものにならないかというと、6時間近くビルドしてもまだ終わらない…。いい加減疲れたので中断した。

エクストララージ インスタンス

インスタンスの使用は以下の通り

  • 15 GB メモリ
  • 8 EC2 Compute Unit (2 EC2 Compute Unitを有する4仮想コア)
  • 1,690 GB インスタンスストレージ
  • 64-ビット プラットフォーム
  • I/O 性能:高
  • API 名: m1.xlarge
make TARGET_PRODUCT=beagleboard
      OMAPES=5.x -j4 9158.92s user 767.41s system 409% cpu 40:21.50 total

40分21秒かかった。まあこんなものかな、という感じ。

ハイCPU エクストララージ インスタンス

インスタンスの仕様は以下の通り

  • 7 GB メモリ
  • 20 EC2 Compute Unit (2.5 EC2 Compute Unitを有する8仮想コア)
  • 1690 GB インスタンスストレージ
  • 64-ビット プラットフォーム
  • I/O 性能:高
  • API 名: c1.xlarge
make TARGET_PRODUCT=beagleboard OMAPES=5.x -j8 7185.23s user 891.93s system 713% cpu 18:52.28 total

ビルド時間は、18分52秒となった。 このレベルになると、i7-860マシンとほぼ同等の速度でビルドしていることになる。ちょとした休みの間にAndroidのビルドが完了している感覚なので、気軽にフルビルドできる。

ハイメモリ クアドラプル エクストララージ インスタンス

インスタンスの仕様は以下の通り

  • 68.4 GB メモリ
  • 26 EC2 Compute Unit (3.25 EC2 Compute Unitを有する8仮想コア)
  • 1690 GB インスタンスストレージ
  • 64-ビット プラットフォーム
  • I/O 性能:高
  • API 名: m2.4xlarge
make TARGET_PRODUCT=beagleboard OMAPES=5.x -j8 5916.11s user 626.15s system 749% cpu 14:32.59 total

ビルド時間は14分32秒となった。

これまでのインスタンスで一番はやくビルドが終了した。先のハイCPU エクストララージと比較すると4分の差なので、これをどう見るか次第でないかと。

料金は?

EC2のインスタンスでは時間単位で料金が発生するので、今度は料金も比較対象に含んで比較してみる。

今回はマイクロインスタンス以外はすべて1時間以内でビルドが完了した。EC2では1時間未満のインスタンスは1時間分の料金が発生する。価格はus-westを適応し、$1=83円換算した。

インスタンス名 時間 料金 日本円
エクストララージ 40:21 $0.76/h 約63円
ハイCPU エクストララージ 18:52 $0.76/h 約63円
ハイメモリ クアドラプル エクストララージ 14:32 $2.28/h 約190円

という事で、コストも考慮するとパフォーマンスがよいのは、ハイCPU エクストララージインスタンスとなる。

ハイCPU エクストララージインスタンスを1ヶ月(1日8時間 x 20日)利用すると、$121.60(約10092円)となる。

まとめ

ちなみに、ハイCPU エクストララージレベルのPCは、今だとだいたいi7 E2600と同じ性能かと思われる。このクラスのPCは、約8〜10万円程度のクラスなので、毎日フルビルドするような人はEC2を利用するよりPCを購入した方がよいだろう。

ただ、数ヶ月限定など一時的にマシンスペックが必要なときは、EC2も十分選択肢に入るかと。

基礎から学ぶ 組み込みAndroid
坂本 俊之 出村 成和 渡邊 昌之
シーアンドアール研究所
売り上げランキング: 15397


ひたすらプログラミング日記: [Java]Lombok すげー

$
0
0

面白いライブラリを見つけたのでメモ。

lombokというライブラリで、こいつが何をするかというとアノテーションを付けるとアクセサ(getter,setter)やhashCode、equalsやtoStringがバイナリレベルで自動生成される(ソースコード上には現れない)というもの。Stream系のclose処理も自動でやってくれちゃう優れもの!

Project Lombok

Java の冗長性を排除する手軽な方法

NetBeansでlombokを使う - Sacrificed & Exploited

環境に関してですが、NetBeans7+Mavenの場合はlombokの依存性をpomに追加するだけで簡単に使えるようになりました。

pom.xml

<dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>0.9.3</version> <scope>provided</scope> </dependency> </dependencies> 

例えば下記Employeeクラスがあったとして

public class Employee { private String name; private int age; } 

上記を使うクライアントクラスが下記だとするとgetNameメソッドとか呼び出しちゃったりした日にはコンパイラーに怒られちゃうのがJavaであって、そこらへん(アクセサとか書かないといけない)とかが「Javaダセーw」とか言われちゃう原因の一つだったりするわけです><

public class App { public
      static void main(String[] args) { Employee e = new Employee(); e.getName(); //こんぱいるえらー } } 

しかし、lombokを使えば上記Employeeを下記のように修正すると上記コンパイルエラーから開放されるわけですね。

import lombok.Data; public
      @Data class Employee { //@Dataを付けるだけ private String name; private int age; } 
public class App { public static void main(String[] args) { Employee e = new Employee(); e.getName(); //エラーにはなりません。 } } 

(もちろんEmployeeを保存するだけでApp側では認識されるようになります。)

@Dataはgetter、setter、hashCode、equqals、toStringを生成し、final定義したフィールドはそのフィールドを引数にとるコンストラクタの生成を行います。

ちなみにgetterのみやsetterのみもあり、アクセスレベルの指定も可能だったります。

 private @Getter @Setter int customerId; //getter setterが生成される。 private @Setter(AccessLevel.PROTECTED)
      String customerName; //protectedなsetterが生成される。 

ちなみにJPA2.0(eclipselink2.2)を使って対象のエンティティのgetterとかsetterとかを削除してfindとかpersistとかやってみましたが問題ありませんでした。

JPAのエンティティをDDDにおけるエンティティとかバリューオブジェクトに適用する際に可読性上において邪魔くさいsetterとかgetterとかを無くすという使い道もあるかもです。

「別にJPAのエンティティとかツール使って自動生成するし、getterとかsetterとかもIDEから生成するから意味なくね?」とか「アクセサが嫌ならScalaとかRubyやれYO!」という意見は今回は無しの方向でお願いしますw。


最後にリソースの自動開放はこんな感じです。

 @Cleanup FileReader reader=new FileReader("src/main/java/com/mycompany/lomboksample/App.java"); char buf[]=new char[32]; while(reader.read(buf)!=-1){ System.out.print(buf); } 

ちなみにJava7での新文法はこんな感じ。

 try(FileReader reader=new FileReader("src/main/java/com/mycompany/lomboksample/App.java")){
      char buf[]=new char[32]; while(reader.read(buf)!=-1){ System.out.print(buf); } } 

また、@Dataとかつけてるけどgetter自分で定義した場合は当然ながら自分で定義したgetterが呼ばれます。また、@Dataが付いてるクラス内にブレークポイント張ってデバッグかけたら変な所で止まったりしないかなぁとか思いましたが綺麗に止まりました。lombokは結構面白いライブラリーだと思います。

逆コンパイルとかかけてみたいなぁ〜。とか思ったところで今日は終了します。

Happy my life: 名古屋GeekBarでの発表

$
0
0

先日、名古屋GeekBarに参加してきた。10年ぶりぐらいの名古屋でした。

昼間の勉強会とはまた違った雰囲気なのがなんともよかった。やっぱ、お酒飲みながらスライド見せてしゃべるってのは結構気持ちがよい。ネタとかもいろいろ入れやすいし、普段よりネタのウケがよい(気がする)。

あと、あいかわらず @noritsuna 氏は笑いをガンガン取ってくるし、@magoroku15先生の説明は分かりやすい…。

ってことで、おいらが発表した内容を、ここにUPしておきます。

このスライドは、この本を参考に書きました(棒読み)

基礎から学ぶ 組み込みAndroid
坂本 俊之 出村 成和 渡邊 昌之
シーアンドアール研究所
売り上げランキング: 13744



きしだのはてな: [NetBeans]NetBeansでCoverturaを使うときの設定

$
0
0

カバレッジ計測用のCoverturaをNetBeansで使うときの設定メモ

気の利いたプラグインはないので、antをいじくる。

元ネタはここなんだけど、ちょっと「NetBeans的」ではないので、修正。NetBeansのwikiなのに。

CoberturaAnt - NetBeans Wiki


Coverturaはここから。今回は1.9.4.1というバージョンをダウンロード。

Cobertura


まずは、PROJECT/nbproject/private/private.propertiesでCoverturaのパスを指定しておく。最後あたりに追加。

covertura.dir=C:\\java\\tool\\cobertura-1.9.4.1 

つぎに、PROJECT/nbproject/project.propertiesにクラスパスなどの設定。run.test.classpathあたりを変更。

covertura.lib=\ ${covertura.dir}/lib/asm-3.0.jar:\ ${covertura.dir}/lib/asm-tree-3.0.jar:\ ${covertura.dir}/cobertura.jar:\
      ${covertura.dir}/lib/jakarta-oro-2.0.8.jar:\ ${covertura.dir}/lib/log4j-1.2.9.jar run.test.classpath=\ ${covertura.lib}:\ ${build.instrumented.dir}:\ ${javac.test.classpath}:\ ${build.test.classes.dir} 

あと、末尾にこんな感じの設定を追加。

build.instrumented.dir=${build.dir}/instrumented build.report.dir=${build.dir}/report build.report.cobertura.dir=${build.report.dir}/cobertura 

最後にPROJECT/build.xmlに追加。<import .../>のあとあたりに。

 <target name="-post-init"> <taskdef classpath="${covertura.lib}"
      resource="tasks.properties"/> </target> <target name="-pre-compile-test"> <delete dir="${build.instrumented.dir}" /> <delete dir="${build.report.cobertura.dir}" /> <mkdir dir="${build.instrumented.dir}" /> <mkdir dir="${build.report.cobertura.dir}" /> <cobertura-instrument todir="${build.instrumented.dir}"> <fileset dir="${build.classes.dir}"> <include name="**/*.class"/> </fileset> </cobertura-instrument> </target> <target name="-post-test-run"> <cobertura-report format="html" srcdir="${src.dir}" destdir="${build.report.cobertura.dir}"/> <cobertura-report format="xml" srcdir="${src.dir}" destdir="${build.report.cobertura.dir}"/> <delete file="cobertura.ser" /> </target> 

これで、「プロジェクトをテスト」したときなどにPROJECT/build/report/coberturaにカバレッジ結果が生成される。

Happy my life: ABC2011Summerで講演します

$
0
0

7/17(日)に早稲田大学で開催されるAndroid Bazzer and Conference 2011にて、開発トラック2の部屋で、京都マイクロコンピュータ 小林さんの後に話します。

タイトルは「Linuxカーネルから紐解くAndroid」ということで、Linuxカーネルに施されたAndroid特有の拡張についての話。このあたりは、”通常のLinuxとは違うAndroidならでは”を決めている箇所の一つなので、理解しておくことで、より深くAndroidの動きについて理解できます。

「Linuxカーネルから〜」というタイトルなのでアプリ開発者には無縁な話かと思いきや、実は深い関係があったりするのですが(この話も関係ある話の一つ)。内容は当日までのお楽しみということで。


Masaki Katakai's Weblog: NetBeans 7.1 リリースプランが公開 - メインは JavaFX 2.0 のサポート

$
0
0
6月16日はJavaFX ユーザグループ 第 5 回勉強会「JavaFX 2.0 ベータ公開記念!!」に参加してきました。勉強会&懇談会と楽しい時間を過ごせました。参加された皆様、お疲れ様でした。

What's New Java FX 2.0

櫻庭さんの「What's new JavaFX 2.0」、とても面白かったです。カスタムブラウザが簡単にできてしまうんです ね!私は JavaFX Script が苦手でしたので ^^;) Java で書けたほうが正直うれしいです。

その後に少しお時間をいただき NetBeans の今後の JavaFX サポートについて話をさせていただきました。NetBeans 7.0 用の JavaFX 2.0 Beta のプラグインが出た後、またちょうどその週の初めに NetBeans 7.1 のプランが出てきたところでしたのでよいタイミングでした。


NetBeans の次の大きなバージョンは 7.1 ですが以下にプランが公開されています。
まだまだ詳細はわかっていませんが、簡単にまとめてみるとこうなります。
  • メインは JavaFX 2.0 のサポート
  • UIのビジュアルデバッグ機能を用意
  • JavaFX の UI デザイン用に別のスタンドアロンツールを提供予定
他にもエディタやGUIビルダーなどでいくつかプランが出ていますので参照してください。とっても気になるところのスタンドアロンツールについてはまだ私のほうでも詳細はわかっていません。

Beta は9月30日、正式リリースは11月30日に予定されています。

Masaki Katakai's Weblog: NetBeans 7.1 リリースプランが公開 - メインは JavaFX 2.0 のサポート

$
0
0
6月16日はJavaFX ユーザグループ 第 5 回勉強会「JavaFX 2.0 ベータ公開記念!!」に参加してきました。勉強会&懇談会と楽しい時間を過ごせました。参加された皆様、お疲れ様でした。

What's New Java FX 2.0

櫻庭さんの「What's new JavaFX 2.0」、とても面白かったです。カスタムブラウザが簡単にできてしまうんです ね!私は JavaFX Script が苦手でしたので ^^;) Java で書けたほうが正直うれしいです。

その後に少しお時間をいただき NetBeans の今後の JavaFX サポートについて話をさせていただきました。NetBeans 7.0 用の JavaFX 2.0 Beta のプラグインが出た後、またちょうどその週の初めに NetBeans 7.1 のプランが出てきたところでしたのでよいタイミングでした。


NetBeans の次の大きなバージョンは 7.1 ですが以下にプランが公開されています。
まだまだ詳細はわかっていませんが、簡単にまとめてみるとこうなります。
  • メインは JavaFX 2.0 のサポート
  • UIのビジュアルデバッグ機能を用意
  • JavaFX の UI デザイン用に別のスタンドアロンツールを提供予定
他にもエディタやGUIビルダーなどでいくつかプランが出ていますので参照してください。とっても気になるところのスタンドアロンツールについてはまだ私のほうでも詳細はわかっていません。

Beta は9月30日、正式リリースは11月30日に予定されています。

Masaki Katakai's Weblog: 「Java SE 7 リリース記念 特別イベント」のご案内

$
0
0
7月7日(木)14:00~日本オラクル本社セミナールームにて「Java SE 7 リリース記念 特別イベント」が開催されます。NetBeans のセッションも用意していただきました。7.0 の話を中心に JDK7 のサポートについて紹介させていただく予定です。お時間のある方はぜひご参加ください。

Java SE 7 リリース記念 特別イベント
 日時:2011年7月7日(木)14:00 ~19:00
 場所: 日本オラクル本社13Fセミナールーム
 内容:
  1. 開会の挨拶 + 今後の Java に期待する事(丸山 不二夫 氏)
  2. Java SE 7 + 8 の概要(寺田 佳央)
  3. HotRockit +Java の New ライセンスの紹介(杉 達也)
  4. NetBeans 7.0 + Project Coin の紹介(片貝 正紀)
  5. InvokeDynamic の紹介(戸島 義徳)
  6. Fork/Join Framework。そしてLambdaへ。(櫻庭 祐一 氏)
  7. もっとNew I/O(櫻庭 祐一 氏)
参加は無料ですが登録が必要です。セッションの内容、登録は上記のページからお願いいたします。

Masaki Katakai's Weblog: 「Java SE 7 リリース記念 特別イベント」のご案内

$
0
0
7月7日(木)14:00~日本オラクル本社セミナールームにて「Java SE 7 リリース記念 特別イベント」が開催されます。NetBeans のセッションも用意していただきました。7.0 の話を中心に JDK7 のサポートについて紹介させていただく予定です。お時間のある方はぜひご参加ください。

Java SE 7 リリース記念 特別イベント
 日時:2011年7月7日(木)14:00 ~19:00
 場所: 日本オラクル本社13Fセミナールーム
 内容:
  1. 開会の挨拶 + 今後の Java に期待する事(丸山 不二夫 氏)
  2. Java SE 7 + 8 の概要(寺田 佳央)
  3. HotRockit +Java の New ライセンスの紹介(杉 達也)
  4. NetBeans 7.0 + Project Coin の紹介(片貝 正紀)
  5. InvokeDynamic の紹介(戸島 義徳)
  6. Fork/Join Framework。そしてLambdaへ。(櫻庭 祐一 氏)
  7. もっとNew I/O(櫻庭 祐一 氏)
参加は無料ですが登録が必要です。セッションの内容、登録は上記のページからお願いいたします。

Masaki Katakai's Weblog: NetBeans 7.0.1 RC1 を公開しました

$
0
0
NetBeans 7.0.1 のリリース候補ビルドが公開されました。もちろん日本語を含むマルチリンガル版です。
7.0.1 は JDK 7 を完全にサポート、 GlassFish をバージョン 3.1.1 に、またいくつかのバグ修正が含まれています。リリースロードマップにもありますが JDK 7 と同じ7月の終わりに公開を予定しています。

また JDK7 のスナップショットも 6/27 に b147 というのが出ています。こちらと併せてぜひお試し下さい。
動作や日本語訳に関して何か問題ありましたら以下までお願いいたします。

Masaki Katakai's Weblog: NetBeans 7.0.1 RC1 を公開しました

$
0
0
NetBeans 7.0.1 のリリース候補ビルドが公開されました。もちろん日本語を含むマルチリンガル版です。
7.0.1 は JDK 7 を完全にサポート、 GlassFish をバージョン 3.1.1 に、またいくつかのバグ修正が含まれています。リリースロードマップにもありますが JDK 7 と同じ7月の終わりに公開を予定しています。

また JDK7 のスナップショットも 6/27 に b147 というのが出ています。こちらと併せてぜひお試し下さい。
動作や日本語訳に関して何か問題ありましたら以下までお願いいたします。

Happy my life: EclipseからAndroid NDKのコードをビルドする

$
0
0

Android NDKとJavaを併用した開発をしていると、どうしてもTerminalとEclipseをいったりきたりする必要がある。しかも、C/C++のコードを修正、ビルドしても、Eclipseで”実行”をクリックしただけでは、新しく作成したモジュールはapkファイルに含まれないという(Javaのコードは修正してないから、Eclipseは新しくパッケージングする必要なしと判断する)

とまあ、標準環境のままではとにかくNDKとJavaの開発はしにくい。ということで、NDKのビルドコマンドであるndk-buildをeclipseからさせちゃおうという趣旨。

事前にEclipse, Android SDK, Android NDKr5がインストール済であること。Android NDKは、今回は/Developer/SDKs/android-ndk-r5cにインストールされているとする。

プロジェクト作成

まずは通常通りにプロジェクトを作成する。今回は、Android NDKのサンプルにあるHello-jniを利用した。

ファイル構成はこんな感じ。

ndk-buildを設定する

プロジェクト(今回はhello-jni)を右クリックしてプロパティを表示。 左のメニューからBuildersを選択して、「new」を押す。

作成するタイプを聞いてくるので、「Program」を選択して押す。

NameとMainタブの設定

Buildersに表示する名前とndk-buildコマンドのパスと、ビルド対象となるプロジェクトを指定する。

Name : 何でもよいが、ここでは「NDK Builder」と指定。

Location : ビルドに利用するndk-buildコマンドを指定する。「Browse File Systems」から選択すると楽。

Working Directory : ビルドするプロジェクトを指定。「Browse workspace…」から選択すると楽。

Refreshタブの設定

Refresh resources upon completionにチェックを入れ、「Specific resources」を選択し、「Specify Resources…」ボタンを押す。

先ほどのプロジェクトから、libsフォルダを選択。libsフォルダは、ndk-buildコマンドを実行した際に自動生成されるフォルダなので見つからないときは、設定を一時中断して、ターミナルからndk-buildを実行したあと、再度設定するとよい。

Build Optionsタブの設定

ここで「Specify working set of relevant resources」にチェックを入れ「Specify Resources」ボタンを押す

jniフォルダを選択する。これで全ての設定が完了。

これによってJNIフォルダ内のソースコードのみ書き替えても、ちゃんとビルド、実行されるようになる。

元ネタはこちら

Android SDK逆引きハンドブック
中西葵 内村祐之 高橋良司
シーアンドアール研究所
売り上げランキング: 902


forest of netBeans: Netbeans Ide 7 Cookbook

forest of netBeans: JavaFX2.0Bataをプラグインしてみた。

$
0
0

片貝さんのblogを見てJavaFX2.0をプラグインしてみた。

? SDKとNetbeansプラグインをdawnload&展開

? SDKをインストール

? プラグインモジュールをNetBeansに取り込む。

サンプルを動かしてみたらなかなかカッコイー!

また、プロジェクトの新規作成をやって基本ソースをながめて

みました。

JavaFXってJavaの一部と理解してよいのだろうか?

追記

片貝さんのblogの桜庭さんのメント見て、プラグインだけでOKだった

ことをしりました。

torutkの日記: [Java][NetBeans]NetBeans上からプロジェクトのJavadoc生成時、パッケージドキュメントへの画像貼り付けとoverview.htmlの指定

$
0
0
NetBeansではプロジェクト単位でjavadoc生成を行うことができますが、パッケージドキュメント(のHTML)に画像ファイル(のリンク)を書きたいときの方法、overview.htmlをどこに置いてどう指定するかの方法を紹介している記事(英語)がありました。 http://www.milagrosoft.com/JavaJavaDocs.pdf この記事ではパッケージドキュメントがpackage.htmlの場合について紹介しているので、package-info.javaの場合について試して ...
Viewing all 4643 articles
Browse latest View live