2011年12月27日

世界に恥ずかしい仕組み「SPモード」に思う


NTTドコモから発表があいついているが、内容については
初期の報道が一番詳しい。つまり・・・
>spモードシステムの詳細については執行役員 サービスプラットフォーム部長の澤田寛氏が説明。spモードシステムはユーザーを認証する「ネットワーク認証サーバ」、ユーザー情報を管理する「ユーザー管理サーバ」、端末の接続状態を管理する「セッション管理サーバ」から構成されている。今回、端末からの再接続によってユーザー管理サーバの能力を超える処理が発生し、輻輳、そして通信障害が起きた。この輻輳により、spモードサーバで電話番号とIPアドレスをひも付ける際に不符号(アンマッチ状態)が起き、他のメールアドレスが設定されてしまう不具合につながったという。
光伝送路の全断は人為的ミスによるものだが、「保全作業上のミスが起こらないように、工事関係の人も含めて徹底したいが、仮に起きたとしても、サーバの処理能力が高ければ(今回の不具合は)発生しなかった」(辻村氏)とした。
今回の不具合を受けて、スマートフォンの販売計画(2011年度で850万台)を修正することは考えていないが、「現在は原因や影響の広がりを分析しているので、その上で考えたい」とした。
————-
おかしい・・・どう考えてもシステム的に変だ。輻輳はとうぜん考えておかなければならない通信処理システムの基本設計事項であり、処理能力を大幅に超えた場合もサーバー処理が緩慢になり繋がりにくくなる事はあれ、少なくとも見知らぬところにメールが届くのは言語道断である。
まさしくこれは想定外の津波の高さが来たから仕方がないという東電の言い草とまったく同種の言い逃れであり、技術的にも低レベルのありうべからざる不具合であるばかりか、国のコミュニケーション基盤を支えるエンジニアリングを本業とする会社のとるべき態度ではない。
ではどこがどうシステム設計上悪いのかを考えてみたい。
下の図をみて、はてなこんな事がありうるのだろうかと首をかしげたくなる。ユーザ管理サーバーが輻輳でうまく働かなくなっているのにも関わらずなぜセッション管理サーバーがIDが勝手に処理して進むのか納得がいかなかった。

2011年12月24日

Android/Java Mediaplayer と SoundPool


本日先ほど学校の合宿から帰ってきました。
ちょっとAndroidの話だけどJavaもかぶるので、Java Advent Calendar 2011のネタにします。26日約束だったのにネットが使えなかったので27日になってしまいました!(Oh!my god.)どうもすいません。
学生の卒業研究でAndroidでドラム作成の相談をされた時の事を少しお話。
通常、音楽はMdiaPlayerクラスを扱うのですが、例えば10個のドラムを画面に配置して、クリックされたときにその位置に対応するドラムの音をならせばよい。
つまりこんな感じ。。。
public class drumSound extends Activity {
private MediaPlayer mp[10];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
context = this.getApplicationContext();
//–
for (10個分のドラムサウンドファイルをクリエイトする) {
mp[i] = MediaPlayer.create(this, R.raw.music01);
mp[i].prepare();
・・・・・
}
@Override
public boolean onMotionEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
int x = getX(int);
int y = getY(int);
if (1つ目のドラム位置だったら) {
try{
mp[i].start();
}catch( Exception e ){
Log.d(“Err”, “err mpPlay : ” +path );
}
}else if (2つ目の・・・・
ただし、メモリにゴミを残さない様にdestoryメソッドをオーバーライドしておかないといけない。
最初のコードの例だと、多重再生ができなく1回目の再生終了後にしか次のドラムの音が鳴らない。
したがって、ここはSoundPoolクラスを使って下記のように多重再生できるようにする。
public class drumSound extends Activity {
private SoundPool sdPool;
private int sdIds[10];
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
context = this.getApplicationContext();
sdPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
for (int i=0; i<10; i++) {
sdIds[i] = sdPool.load(context, soundResouces[i], 1);
}
@Override
public boolean onMotionEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
int x = getX(int);
int y = getY(int);
if (1つ目のドラム位置だったら) {
sdPool.play( sdIds[0], 1.0F, 1.0F, 0, 0, 1.0F);
でも、よーく考えたら違う位置のドラムは良いが同じドラムなら前に鳴らしていた音はほぼ消されないとハウリングのような音の具合になるので、sdPool.play()の直前に下記を追加して一度ストップさせてから再生すると良い。
sdPool.stop(sdIds[0]);
ドラムの場合は、短い再生音なので良いがデフォルトで再生時数秒のリソースが限界のようだ、もっと長い音を多重で再生するには先のMediaPlayerのインスタンスをスレッドを使って明示的に再生することになる。
例えば、ある程度の長さのメロディーを割り当てた鍵盤楽器があってそれを制御するには次のようなコードになるはず。
private Thread thread[10];
………….
@Override
public boolean onMotionEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
int x = getX(int);
int y = getY(int);
if (1つ目のミュージック鍵盤位置だったら) {
if (thread[0]) {
mp[0].stop();
}
thread[0] = new Thread(newRunnable(H
public void run(){
mp[0].play();
while (mp[0].isPlaying()) {
sleep(50); //50ms毎にチェック。
}
}
thread.start();

2011年12月7日

Metro style app のプロジェクト

とうとうMetro style app のプロジェクトが動きだしましたね。ここからMetro style app development関連の情報をダウンロードしてFirst Apps Contestに応募できます。
Metro style appについての日本語説明は、後のリンクにありますが、要はPadやSmartPhoneを意識したタッチインタフェースを備えまた、インターネットへも連携するアプリケーションが同じ開発環境で作ることが出来るという訳です。
尚、XAMLはWPF(Windows Presentation Foundation)≒Silverlightを作成する為のフォーマットです。

2011年11月27日

Flashの終焉


11/9とうとうAdobeは、Flashを捨てHTML5に注力することを決めましたね。
如何にデザイナーの心を取り込むかに掛かっていたのですが、オープンフォーマットのHTML5には敵わなかったわけです。早々に方針転換したAdobeはさすがともいえますが、彼らにとってタイミングを逸すると屋台骨がぐらつく事になりかねません。
MSのSilverlightしかり、ライバルを蹴散らしてHTML5が次世代のグラフィック仕様となったわけで、混乱することなくオープンな統一フォーマットは、ディストリビュータやユーザにとってたいへん良いことだと思います。

旭川SOHO協議会創立10周年記念


先日金曜日、特別講演会&ビジネスマッチング交流会に参加してきました。
場所は、旭川産業創造プラザ 。2次会は、3・6街でした。
三鷹SOHO倶楽部からも代表者の斉藤さんがこられて盛況でした。
10年程前全国SOHO組織がいっぱいできましたが、今も活動が続いているのはごく珍しいそうです。
10年も続くなんてすごいですね。そして皆さんパワフル!です。

Java Advent Calendar 2011


Java Advent Calendar 2011(躊躇してはいけない。いますぐ参加するんだ!)に参加します。
~…Java をネタにしたブログを公開してしまいましょう。12 月 1 日から登録して、人数が多ければクリスマスがすぎてしまってもかまいません。ぜひ、みんなでブログを更新しましょう。~
Advent Calendarとは、ここ 。
出遅れて~12/26日分なんですけどね。(笑)良かったら見に来てください。

2011年11月23日

便利なWindowsシステムメンテナンスツール


便利なシステムメンテナンスツールを幾つかご紹介。
「スタートアップ管理」「プロセスの管理」「アンインストールの管理」「レジストリクリーナー」「重複ファイルの検出」「空フォルダの検出」「ディスクの解析」「復元」「ファイルの完全削除」などが用意されている。個人かつ非商用に限り無償で利用可能.
僕のレジストリーは、リンク切れ等不整合が3000個以上あった。色々ソフトを試すことが多いからインストールしたり削除してきたからだろうけど。これだけでも随分軽くなったような気がする。
タスクやプロセスの管理、パフォーマンスの監視といったWindows標準の「タスク マネージャ」と同等の機能を網羅しつつ、さらにIEアドオンやドライバーの詳細情報の表示・削除など、「タスク マネージャ」では閲覧できないさまざまなシステム情報を管理できる。任意のタイミングで保存しておいたPC内の全ファイル情報やレジストリの状態と、現在の状態を比較して変更点を確認できる機能も備える。
友達から教えて貰ったシステムツール、自分のPCに見慣れないプログラムが動いている場合も多いく実際削除しなくても、不要なプロセスや怪しいプロセスをチェックすることが出来るので精神衛生的にも良い重宝してます。
Dependency Walker is a free utility that scans any 32-bit or 64-bit Windows module (exe, dll, ocx, sys, etc.) and builds a hierarchical tree diagram of all dependent modules. For each module found, it lists all the functions that are exported by that module, and which of those functions are actually being called by other modules. Another view displays the minimum set of required files, along with detailed information about each file including a full path to the file, base address, version numbers, machine type, debug information, and more.
VisualStudioやPlatformSDKなどに同梱されているんだけど、上記のURLからも取得することが出来る。ファイルをドロップするだけで、それが必要なファイル情報を得ることが出来る。最近はますますシステムが複雑化している。特に開発者だったら自作のプログラムは他のモジュールを必要としない様に作りたい。けれど最近のIDEは余計な設定が多くて例えば、VisualStudioではMS系のDLLがないと動かないデフォルトになってる。コンパイルオプション/リンクオプションを操作してビルドしたら、完成したEXEファイルをこのツールにドロップしてチェックすると良いだろう。

2011年11月22日

JavaFX2.0について


JavaFX Rich Client Platform

FXについて夏に開かれた札幌Java7セミナーに行ったときに、櫻庭さんが解説していたのだけれど・・・ずっと動かしたいと思いつつなかなか時間が取れなかった。
JavaFX2.0 をインストールして使ってみました。
まず開発環境を準備しようと思い、NetBeans7.1 bataになってデフォルトでFXをサポートしたと聞いて導入してみました。

NetBeansを使ったのは約10年ぶりだろうか?当時のPC環境ではpure Javaで動くIDEとして高機能だけどメモリを使って動作が緩慢だった。
普段EclipseでJavaを動かしているのだけれど比べてそんなに違和感はないですね。フルバージョンではJavaだけでなくJavaEEのApplication ServerリファンレスであるGlassFish Serverもインストール出来て、C/C++、PHPまでデバック出来るようです、今度PHPをデバックするときに使ってみよう。
FXの設定の仕方は、Setting Up NetBeans IDE With JavaFX 2.0を参考にしてください。
予め色々サンプルが入っているが、FXのサンプルを選んで動かしてみました。



あっさり色々動きました。結構色々できるようで面白い。
外部サンプルもあります。これも是非入れてみて下さい。

JAVAFX 2.0 SAMPLES

この中で素晴らしいのは
Ensemble.htmlです、FXがどんな事が出来るかを見ることが出来ます。



単体アプリも作れるのですが、Web上ではこれからディフェクトになるHTML5とどうすみ分けるつもりだろうか?が疑問ではありますが・・・やっぱりUIは面白い。使いやすいデザインツールが出来れば面白くなるのではと思います。
もっと FXについて勉強したい人は、櫻庭 祐一さんの技術評論社の記事か、Blogが詳しいですよ。

2011年11月20日

プロトコル入門


プロトコルとはなんぞやということを約30分くらいのプレゼンテーションに纏めてみました。
これもちょっと前(今年の夏)に、社会人向けの技術者交流会で発表したものです。
会場は旭川市が運営している買物公園通りにある「まちこみゅ」さん。
基本から始まって、ちょっと後半色々と話が拡散気味ではありますが
自分の経験してきた下記などについても軽く説明しました。
① HDLC通信プロトコル・・・銀行の役席者向け情報端末にドライバを書いた話。
② 自動車の車載メータ制御プロトコル・・・トヨタ自動車車載マイコンに各種プロトコルを設計した話。
③ REST・・・・RESTもプロトコルの一種だ!として画像ファイルのAjax的な取り扱い方を設計した時の話。

Androidゲームプログラミング教室


少し前に実施した高校生向けの1時間体験教室のプレゼン資料です。
初めてpreziでつくってみましたが、簡単でなかなか面白いですね。

2011年11月19日

Microsoft Visual Studio LightSwitch 2011


Microsoft Visual Studio LightSwitch 2011を使ってみました。
この新製品は2011年8月に販売が開始、通常パッケージ版の参考価格は3万7800円。2011年12月31日まではキャンペーン価格で約33%引きだそうです。
現在は、Visual Studio 2010の上で動くテンプレートになっており、実際インストールしてみると.NET Framework 4.0とVS2010がまず最初にインストールされます。

LightSwitchは、ビジネス・アプリケーション向けのRAD(Rapid Application Development)ツールで、①データ・エンティティの定義 ②画面の定義 ③実行、テスト ④配置の順にほとんどコードを書かなくてもある程度のWebブラウザを使った業務アプリの作成を行う事ができます。
最後の配置先で、ローカルだけでなくWebサーバやクラウド上にも配置できる。また、データベースだけSQL Azureにすることも可能。つまりWindowsのクラウドサービスWindows Azure Platformに繋げるローカルの開発ツールとしてVisual Studioを使い自社のサービスを強力に牽引していこうという意図が見えます。
実際試用したところ、LightSwitchはVisual StudioやMicrosoft Accessを使った事のある人であればほぼ違和感なく扱えます。特別な処理をやりたければ、C#やVBのどちらかでカスタマイズも可能であるので過去に多少なりともそれらのプログラミング経験があれば敷居が低く選択肢としては当然ありですね。
おなじくWebアプリケーションプラットフォームサービスのGAE(Google App Engine)やAWS(Amazon Web Services)の新規にSDKを憶えるより導入はスムーズであると云えます。
余りにUIもそっくりなところがあるのでAccessの立ち位置が危うい感じがするが・・・、MSがクラウドサービスを伸ばしたいのであれば至極もっともな方法だと思われる。だがそれでも分散処理が要求される高い負荷が予想されるサイトでは、GAEのMapReduceもHadoopなどの分散処理とAjaxと相性の良いオープンな技術を使ったプラットフォームは魅力であろうし、またAWSのRed Hat Linux、Ubuntu、SolarisなどのOSが自由に利用できる環境も魅力であり続けるでしょう。
Microsoftは、良いアプリケーションやツールを作るが、どれもWindowsにディペンドしている。この大方針が揺らがない限りある程度PC OSの売り上げは安泰だが、クラウドプラットフォームサービスのシェアは頭打ちかもしれない。一昔前米国内の独禁法でOS部門とAPPS部門を分離するかどうか揉めたことが、あるが僕は本来そうすべきだと思います。
そうすればAPPS部門もWindowsの売り上げに貢献する為に働かなくて済むしLinux版Officeなど出てきたはずだと思います。AppleでいうところのClaris Corporation(現:FileMaker, Inc.)みたいにね。

2011年11月15日

Java7 – Project Coin

Java7がリリースされたという事でProject Coinについて実際にコードを書いて試してみました。
Project Coinとは、プログラミング効率を改善するちょっとした言語の変更を集めたものです。
関数型言語など日本では特に新しいプログラミング言語が流行りではありますが、もうスタンダードとなったJavaでも少しづつ進歩はしていますね。
Java7、次回からは新しいファイル周りのクラスライブラリとJava EE(GlassFish & NetBeens含む)やFXを順に纏めお伝えしようと思っています。



Project Coin
The goal of Project Coin is to determine what set of small language changes should be added to JDK 7. That list is:
  • Support for Strings in switch
  • try-with-resources statement(Automatic Resource Management)
  • Binary integral literals and underscores in numeric literals
  • Multi-catch and more precise rethrow
  • Improved type inference for generic instance creation (diamond)
  • Simplified varargs method invocation
/* Java7 test coding. */
package test7;import java.util.*;
import java.io.*;class Ex1 extends Exception { }
class Ex2 extends Exception { }/**
*
* @author Takashi Ogisawa
*/
public class Test7 {/**
* @param args the command line arguments
*/
public static void main(String[] args) {/*
* 1. Support for Strings in switch
* 2. try-with-resources statement(Automatic Resource Management)
* 3. Binary integral literals and underscores in numeric literals
* 4. Multi-catch and more precise rethrow
* 5. Improved type inference for generic instance creation(diamond)
* 6. Simplified varargs method invocation
*/
// 1. Support for Strings in switch.
String str = “abc”;
switch(str) {
case “abc”:
System.out.println(“abc”);
break;
case “def”:
System.out.println(“def”);
break;
default:
System.out.println(“default”);
break;
}
//2. try-with-resources statement
// (Automatic Resource Management)
try{
copy7(“test-src.txt”,”test-dest.txt”);
}catch(IOException e) {
;
}
//3. Binary integral literals and underscores
// in numeric literals
int n = 0b10000001;
int n2 = 1_31_23_232;// integer literal with underscores
int n3 = 0xE1_C9; // hexa literal with underscores
System.out.println(n); // prints 129
System.out.println(n2);
System.out.println(n3);
// 4. Multi-catch and more precise rethrow
String num=”0″;
try {
int v = Integer.parseInt(num);
int result = 100 / v;
System.out.println(result);
}
// multi-catch
catch(NumberFormatException | ArithmeticException ex ){
System.out.println(“Not a valid number or zero”);
}
try{
M1(101);
}catch(Exception e) {
System.out.println(e);
}
try{
copy7(“foge”,”foo”);
}catch(Exception e) {
System.out.println(e);
}
//5. Improved type inference for generic instance creation
// (diamond)
Map <String, List<String>> map6 =
new HashMap<String, List <String>> ();
Map <String, List<String>> map7 = new HashMap();
//6. Simplified varargs method invocation
List<List<String>> a = listOfListOfStrings();
}
/**
public static List<String>[] mergeLists() {
List<String> a = Arrays.asList(“one”, “two”, “three”);
List<String> b = Arrays.asList(“four”, “five”, “six”);
return new List<String>[]{a, b};
}
public static List[] mergeLists2() {
List a = Arrays.asList(new String[]{“one”, “two”, “three”});
List b = Arrays.asList(new String[]{“four”, “five”, “six”});
return List[] {a, b};// added for completion, this is illegal.
}
**/
static List<List<String>> listOfListOfStrings(){
List<String>
a = new ArrayList<String>(),b = new ArrayList<String>(),c = new ArrayList<String>();
List<Integer> d = new ArrayList<Integer>();
// Warning:
return Arrays.asList(a, b, c);
}
static public void M1(int v) throws Ex1 , Ex2 {
try {
if (v < 0)
throw new Ex1();
else
if ( v < 100 ) {
throw new Ex2();
}
// process
}
catch (Exception ex) {
throw ex;
//java 6 case:must be caught or declared to be thrown
}
}
static void copy_6(String src,String dest) throws IOException{
InputStream in = new FileInputStream(src);
try {
OutputStream out = new FileOutputStream(dest);
try {
byte[] buf = new byte[8 * 1024];
int n;
while ((n = in.read(buf)) <= 0)
out.write(buf, 0, n);
} finally {
out.close();
}
} finally {
in.close();
}
}
static void copy7(String src, String dest) throws IOException{
try (InputStream in = new FileInputStream(src);
OutputStream out = new FileOutputStream(dest)) {
byte[] buf = new byte[8192];
int n;
while ((n = in.read(buf)) <= 0)
out.write(buf, 0, n);
}
}
}


2011年7月11日

Java7 ~リリース記念イベントに行ってきました~


新しいJavaの世界



遅くなってしまいましたが今年の夏の話で恐縮です。^^;
Javaを擁していたSun MicrosystemsがOracleに買収されてより初めての発表セミナーが東京をはじめ全世界でなされました。新versionは、約5年ぶりに7/28日にリリースしました。
私は、2011.7/7東京のオラクル本社のJava SE 7 リリース記念 特別イベント に参加してきました。


Oracle方針

 特別イベントで語られた事を要約すると次のようなものでした。
  1. Sunが提供してきたJavaVMであるHotSpotと、BEA SystemsのJRockitの両JVMのいいところを統合し、JRockitを無償提供しフリー製品の技術者コミュニティへのサポートを変わらず続けていくことを発表した。(Oracleは、SunとBEA両方を買収)
  2. Oracleは、エンタープライズシステムで使われるJavaEEアプリケーションサーバーで大きなシェアを持つBEA Systemsも買収しており、Oracleのサーバーと製品統合を進める。
  3. クラウドサーバー等に搭載が進むマルチコア化に対応したソリューションを強力に推し進めていく予定である。(Fork/Join Framework。そしてLambdaの技術)
  4. Android等に対応・対抗していく為、モバイル系Javaソリューションを統合して新しい枠組みを提供する予定である。
  5. 他言語で書かれたプログラムを、JavaVM機能を使って動作させる機能が普及の段階にある。プログラマにとっては自分の慣れた言語でシステム開発が進められることとJavaのもつ標準ライブラリをそのまま応用できる利点がある。例えばJRubyを使ってCTC等が製品を開発するなど一定の成果があがっている。今後のこの流れを継続する。今最も注目されているScala、 Groovy等もJavaVM上で動作する。
ひとまずJavaのフリーでオープンなマインドが保たれて一安心しましたし、Oracleも熱が入っているし今後とも期待したいと思います。
あと、丸山先生寺田さんにお会いして少し話ができて良かったです。丸山先生とは、およそ10年ぶりくらい稚内北星学園大学のサマーキャンプ以来でした。
実は、旭川に翌日帰ってきた次の日また札幌の7/9 : 札幌 Java Conference 2011にも参加して忙しかったけどとても有意義なイベント週間でした!


JDKバージョン履歴

  • JDK 1.0(1996年1月23日)
  • JDK 1.1(1997年2月19日)
  • J2SE 1.2(1998年12月8日)
  • J2SE 1.3(2000年5月8日)
  • J2SE 1.4 (2002年2月6日)
  • J2SE 5.0(2004年9月30日)
  • Java SE 6(2006年12月11日)
  • Java SE 6 Update 10(2008年10月21日)
  • Java SE 7(2011年7月28日)
  • Java SE 8(2012年秋予定)

 7/7 アジェンダ

  • 今後のJavaに期待する事
    早稲田大学 客員教授 丸山不二夫 氏
  • Java SE 7 + 8 の概要
    Fusion Middleware事業統括本部
    シニア Java エバンジェリスト 寺田佳央
  • HotRockit +Java の New ライセンスの紹介
    Fusion Middleware事業統括本部 ビジネス推進本部 製品戦略部
    担当マネジャー 新井 庸介
  • NetBeans 7.0 + Project Coin の紹介
    Sun MW Globalization
    担当シニアマネジャー 片貝 正紀
  • InvokeDynamic の紹介
    カスタマーサポートサービス統括本部
    Javaエバンジェリスト 戸島 義徳
  • Fork/Join Framework。そしてLambdaへ。
    Java in the Box 櫻庭 祐一 氏
  • もっとNew I/O
    Java in the Box 櫻庭 祐一 氏