2013年12月28日土曜日

C#:PInvokeStackImbalance が検出されました

C#のプログラムからC++で書かれたライブラリ(DLL)の関数を使う時に、表題のように、
PInvokeStackImbalance が検出されました
というエラーが出ることがあります。これは、C++とC#間での関数の互換性に問題があるようで、.NETのバージョンが新しくなると出てきます。解決策ですが、エラーがでた関数に対して、
  • [DllImport("xxxxx.dll", CallingConvention = CallingConvention.Cdecl)]
というように、関数の定義をしている箇所に青字の記述を追記してください。これは全ての呼び出し関数に必要というわけではないので、、、


2013年12月16日月曜日

言語処理学会の年次大会PDF

言語処理学会の過去の年次大会PDFが公開されたようです。

学会などはスケジュールが合わなくていけないことがよくあるので、こういうのは嬉しいですね。年次大会レベルで埋もれている研究とかあるので、要チェクです。


2013年12月12日木曜日

XNA Game Studio 4.0をWindows8で使う

新しいマシンにXNA Game Studio をインストールする際に問題が生じたので注意事項を幾つか。
  • Visual Studio 2010に対応(2012以降はダメ、2013/12/12現在)
  • Games for Windows マーケットプレース クライアントをインストールしておく
新しい開発環境が使えないのは辛いですね。早く対応してほしいものです。

2013年12月10日火曜日

Eclipse:Android SDK Managerや Android Virtual Device Managerのメニューない場合の対処法

Android関係のSDKやプラグインを入れたのにも関わらず、メニューにそれ関係の項目が表示されていない場合があります。別にインストールに失敗したわけではありません。表示されていないだけです。
  • Windowメニューの Customize Perspectiveを選択
  • Command Groups AvailavilityからAndoroid関係の項目を選択
とすることで、表示されます。



2013年12月6日金曜日

Android:メインスレッドからはネットワークアクセスできない ~android.os.NetworkOnMainThreadException~

公知のことかもしれませんが、個人的にめちゃめちゃハマってしまったトラブルなので、メモ書きです。
Androidのアプリから、クラウドのデータベースに接続しようとしてエラーが発生。なぜか?SDKの問題?エミュレータの設定か何か????と試行錯誤した結果、
  • Android3.0以降では、メインスレッド(UIスレッド)でネットワーク処理ができない
という仕様が問題だったことが判明。解決方法は、
  • StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());を追記する
  • AsyncTaskにより別スレッドで処理をする
ということらしい。後者のほうがオススメらしいですが、そのやり方は後日。


2013年11月29日金曜日

Kinect2ファーストインプレッション(3)〜Depthカメラを試してみる〜

Kinect2で一番気になるのは、Depthカメラの精度でしょう。深度の取り方がTOFに変わりましたので、精度は格段に良くなることが期待できますのでね。。早速試してみました。参考までに、現Kinectと比較してみます。



違いは明らか、、、???と言いたいところですが、どちらがKinect2かわかりますか?実は、前者がKinect2。近距離については意外と現Kinectも頑張っているようです。ただ、実際に目にすると、Kinect2の方が明らかに精細です。両写真の撮影場所(背景)は違うんですが、Kinect2のほうが後ろにある本棚の各本の境界(エッジ)が、明らかにわかると思います。
それと、現Kinectの仕様上存在する深度の死角(影)については、Kinect2のほうでは完全に消えていますね。これは嬉しいです。

実はKinectの処理については、ソフトウェアの部分で結構改善・改良されているところがあるようで、マイクロソフトの人も、現行のKinectでもKinect2と同じことができると言ってます(精度は違うでしょうけど)。

以上で、ファーストインプレッションは終わりです。今後は、実装する上で、どこが変わったのかなど、調査していきたいと思います。

注意書き
This is preliminary software and/or hardware and APIs are preliminary and subject to change. (この記事は、暫定的なソフトウェアやハードウェア、APIについて述べており、今後変更される可能性があります)


Kinect2 ファーストインプレッション(2) ~初期設定~

前回に続いて、Kinect2 Dev版についての続きです。α版だからかもしれませんが、セットアップが意外と面倒でした。


マシンの準備
下記の仕様を満たすPCが必要です。
  • Windows 8.1
  • メモリ4GB以上
  • i7@ 2.5GHz以上
  • USB 3.0 port (Intel or Renesas chipset)
  • DX11 capable graphics adapter
これは事前にメールで書かれていたので候補のマシンを確保していたのですが、うっかりしていて、Windows8.1にするのを忘れてました。OSアップデートに時間を費やしてしまいました。

Microsoft Connectの認証を受けておく
SDK関係は同梱されていません。Microsoft Connectからダウンロードする必要があるのですが、ユーザは限定されていますので、認証されたアカウントからしかダウンロードできません。認証方法は、既にメールで届いているはずです。ボクはうっかり見逃してました。注意しましょう。

SDKダウンロード&インストール
認証を受けた後、Microsoft Connectにアクセスしダウンロードしてインストールしましょう。サンプルプログラムも入ってます。

初期設定
現Kinectなら、SDKインストールして接続すればすぐ動くはずですが、実はそうはいきません。おかしいなぁ、、、ドライバが認識できてないのかな、、もしかして初期不良?ってよくマニュアルを読むと、
  • ファームウェアの更新
  • Kinect Serviceの起動
という2つのおまじないが必要です。ファームウェア更新は、もちろんKinectを接続してからです。更新中は絶対に本体から抜かないで下さい。で、最後に、Kinect Serviceというのを起動しておく必要があります。これはスタートメニューから実行できます。

以上の作業が終わり、晴れてKinect2が利用できます。まあ製品版ではもっとラクになるかとは思います。

注意書き
This is preliminary software and/or hardware and APIs are preliminary and subject to change. (この記事は、暫定的なソフトウェアやハードウェア、APIについて述べており、今後変更される可能性があります)



2013年11月28日木曜日

Kinect2 ファーストインプレッション(1) 

BLOGでは書いてなかったですが、7月にマイクロソフトが募集していた次世代Kinect(Kinext2)の先行取得プログラムに申し込んでいて、昨日、本体(アルファ版)が届きましたので、ファーストインプレッションの報告です。


怪しげなカラーリングがポイントです。

ちょっと図体がでかい?
現バージョンのKinectと比べるとちょっと本体が大きい??かと思いきや、意外とそうでもないです。




横幅は以前より短いかも?


高さは低いです。角度調整はできます(ソフト的にできるかは未確認)




縦幅はほぼ同じ。




背面にはなんとファンがあります(いつも動いているわけではないです)。

電源周り



バカでかくて面倒なことになってます。右がACアダプター、左がUSB変換コネクタです。まあ、正式版では改良されるのではないでしょうか?


注意書き
This is preliminary software and/or hardware and APIs are preliminary and subject to change. (この記事は、暫定的なソフトウェアやハードウェア、APIについて述べており、今後変更される可能­性があります)







コンピュータに MSVCR110.dll がないため、プログラムを開始できません

Windowsでソフトを動かそうとした時、
コンピュータに MSVCR110.dll がないため、プログラムを開始できません
みたいなメッセージがでて起動できない時があります。

これは、Visual Studio 2012(C++)でで作られたアプリのライブラリがないということなので、下記の公式サイトからダウンロードして下さい。



2013年11月2日土曜日

BackGroundWorkerによる別スレッドからUIクラスにアクセスする

過去記事にて、C#でマルチスレッドを実現するBackGroundWorkerというコンポーネントを紹介しました。スレッドクラスを利用した処理に比べてシンプルなコードになる利点がありましたが、実際に使ってみてさらなる利点に気づきました。

マルチスレッド処理のUIアクセスの制約
マルチスレッド処理をする際の困難さの1つに、プロセス間通信の制約があります。つまり、スレッドが異なる処理のデータの授受には制約があるということです。この制約の影響をモロに受けるのが、UIコンポーネントです。起動したスレッドから呼び出しものにあるUIコンポーネントにデータを渡す、、例えば、ラベルに値を表示するなどの処理は原則できません。Invorker経由でメソッドを呼び出さないといけません。これでなんら問題なければいいんですが、先日、某サードパーティ製のUIクラスを利用する時に、うまく呼び出すことができませんでした。正確に言うと、Invorker経由で呼び出すと動作が異常に遅くなるのです。もともとthreadクラスを利用していたのでその時は問題なかったのですが、今回、BackgroundWorkerを利用するとダメという、、、意味不明なことに。。。

ProgressChangedイベントが肝!
で、ネットをいろいろ調べてみると、ProgressChangedイベント内ではInvokerが不要であるということが判明しました。正直理屈のわからない話ですが、実際に試してみると、InvorkerなしでUIクラス(Labelクラス)にアクセスすることができました。ProgressChangedイベントを呼び出すためには、
  • WorkerReportsProgressプロパティをtrueにしておく
  • ReportProgressメソッドを呼び出す
という手順が必要です。この方法により、Invorkerを使わなくてよく、さらにUIへの処理を分離できるので、コード的にスッキリします。


2013年10月31日木曜日

C#:UIコンポーネントの作成(既存UIコンポーネントを継承する)

C#(.NET系言語)では、UIコンポーネントは使うだけでなく作ることも可能です。今回は、一番簡単な既存UIコンポーネントを継承する場合の話です。

既存のUIコンポーネントをちょっとだけカスタマイズしたり、使いやすくするためにラップしたい場合は、UIコンポーネントを継承するのが効果的です。その方法ですが、まさにそのままで、
クラスを新規に作成し、(カスタマイズしたい)UIコンポーネントのクラスを継承する
だけでOKです。作成した後、ソリューションをコンパイルすれば、ツールボックスにUIコンポーネントとしてクラスが追加されていると思います。プロパティを追記すれば、プロパティウィンドウにも表示されます。

2013年10月22日火曜日

C#: Amazon S3を操作する(put,get,delete,list)

AmazonのストレージサービスであるAmazon S3に対するオブジェクト(ファイル)の基本操作についてです。いろいろオプション設定する項目はあるようです。

登録(put) 検索(get) 削除(delete) リスト(list)

2013年10月18日金曜日

GAE:文字化けが起きないようにするための設定

サーバーをGAEにして楽天WebサービスからJSONでデータをとってきたところ文字化けが発生。
文字化け問題はJavaでプログラムを組んでいればよくある話であるが、今回厄介だったのは、
  • ローカル環境なら文字化けをしないのに、本番環境で稼働すると文字化けを起こす
という点。本番で動かすまで全く気づかず、試しにデプロイしたらURLクラスでとってきたJSONデータだけ文字化けを起こしていたという。。。日本語が全て文字化けをするわけではないので、URLクラスの処理の部分で日本語をうまく扱えてないんだろう。。。と推測。

で、対処法ですが、GAE自体が扱う文字コードをUTF-8であると明示的に設定する必要があり、下記の通り、文字コードを指定することで解決。ローカル環境だと気づかないので、もう基本的にこの記述を書くようにした方がいいですね。



C#:App.configファイルがないときの対処法

ない場合。。。。。作って下さい。それだけです。とりあえずウィザードはあります。

1.プロジェクトの上で右クリック!




2.アプリケーション構成ファイルを選択して下さい。










2013年10月7日月曜日

AWS ExploreでSimpleDBを操作する

おちラボではSimpleDBをラボの研究用データベースの1つとして利用していますが、SimpleDBはAWS Management Consoleで操作ができないなど、後発のDynamoDBよりも冷遇されている感じで、管理がやりにくい雰囲気があります。しかし、SDKに付随しているAWS Exploreを利用するといろいろできます(Eclipse、Visual Studio等)。下記は、Eclipseの例です。

ドメインの作成、削除
AWS Exploerを開くとドメインの一覧が出てきます。ここで右クリックすれば、ドメインの作成・削除ができます。



アイテムの操作
ドメインをクリックするとドメインの中身が見れます。クエリーを入力することで検索することもできます。Excelみたいに直接値を修正することもできます。



2013年10月6日日曜日

GWT: 楽天トラベルの検索結果(JSON)をParseするサンプル

GWTで楽天トラベルの検索結果(JSON)をParseするサンプルです。APIへのアクセスはサーバー側で行っていて、GWT-RPCでJSONデータを受け取ったという前提です。



GWT: 楽天市場APIの検索結果(JSON)をParseするサンプル

GWTで楽天市場の検索結果(JSON)をParseするサンプルです。APIへのアクセスはサーバー側で行っていて、GWT-RPCでJSONデータを受け取ったという前提です。



GWT:HTTPリクエストパラメータのためのエンコーディング処理

GWTで他サイトのAPIを利用する時に、サーバーサイドでHTTPアクセスをする場合があると思います。その際、日本語の文字列がリクエストに含まれている場合は、URLエンコーディングをする必要があります。そのエンコーディングは、GWTのメソッドを使うと簡単に行えます。
String encStr = com.google.gwt.http.client.URL.encode("もみじまんじゅう");
サーバに送る前にクライアント側で事前に変換しておきましょう。


2013年10月2日水曜日

C#:対象のフレームワークに注意

C#のプロジェクトにおいて
「.NET Framework 4 Client Profile」 (".NETFramework,Version=v4.0,Profile=Client") となっているため、 XXXXXXXXを参照することができません。
というエラーが出る時があります。これは、利用する(参照する)クラスライブラリとプロジェクトの対象としているフレームワークにズレがあることが多いです。C#では様々な環境で動くようにライブラリが用意されていますが、デフォルトでは、
  • .NET Framework 4 Client Profile
というようにWindowsのデスクトップ環境で動くことを前提としたプロファイルが選択されています。これはサブセットですので、
  • .NET Framework 4
を選ぶ(フルセットを選ぶ)ことで、問題は解決するはずです。

2013年9月27日金曜日

C#:Bitmap画像の扱う際にはピクセル形式に注意する

Bitmap画像といっても内部的に色情報を扱う方法は様々です。この事を無視してプログラミングをすると、思わぬエラーに遭遇する時があります。ラボでもOpenCVを利用したテンプレートマッチングをしている時に、意味不明のエラーが出てうまく動かない事象がおきました。これは、異なるピクセル形式の画像をマッチングしようとしたからです。画像を内部的に変換するときに、ピクセル形式が変更されることがあるので注意が必要です。例えば、下記のような違いがあります。
  • Format24bppRgb ・・・1ピクセル当たり、赤、青、緑の各色8ビット、合計24ビット
  • Format32bppPArgb ・・・1ピクセル当たり赤、青、緑の各色8ビットと、8ビットのアルファ・チャネル
  • Format32bppRgb ・・・1ピクセル当たり、赤、青、緑の各色8ビット、合計24ビット。残りの8ビットは使わない。
Bitmapクラスのインスタンスを生成する時にはコンストラクタでピクセル形式を指定することができます。C#のPixelFormat列挙型には、たくさんの種類のピクセル形式が定義されています。確認してみましょう。


C#:BackGroundWorkerコンポーネントを利用したマルチスレッド処理

C#には、マルチスレッドを実現する方法として、BackGroundWorkerというコンポーネントが用意されています。このコンポーネントをフォームに貼り付けることで、容易にマルチスレッドなプログラムを実現できます。以下、サンプルコードを載せますが、ポイントを挙げておきます。

1.フォームにBackGroundWorkerを貼り付ける
タイマーコントロールと同じような感覚で貼りつけてください。1つのコントロールで1スレッドです。

2.開始と終了
  • 開始 ・・・ RunWorkerAsync()
  • 終了 ・・・ CancelAsync();
のメソッドを呼ぶだけです。

3.スレッド関数
コンポーネント変数名_DoWorkで終わる関数が実行されます。CancellationPendingの値を条件としたスレッドループを記述するのがベターなやり方でしょう。

4.途中と終了の処理
_RunWorkerCompletedと_ProgressChangedというメソッドが用意されていて、それぞれ終了時と途中の任意のタイミングで呼び出されます。呼び出しは明示的にしないとダメです。ReportProgressメソッドは引数がint型で進行状態を表す数値を渡すことが正しい使い方です(下記サンプルは違います)。なお、これらのメソッドを使えるようにするには、これらの処理を有効(true)にしておく必要があります。デフォルトはfalseなので注意して下さい。

InvokerとDelegate
マルチスレッドプログラムにおいては、プロセス間のデータの授受が厄介な問題となります。BackGroundWorkerを利用する方法でも、この問題を避ける事ができません。具体的に言うと、異なるプロセス間の変数には直接アクセスすることができないということです。下記の例では、別スレッドでカウントしている値をラベルコンポーネントに表示する際に、直接ラベルに値を代入できないということです。メソッドを用意してそれをDelegateに渡し、Delegateを介してInvoke(起動)する必要があります。(もっとよい方法が見つかりましたので、くわしくは続編を!



2013年9月25日水曜日

GWTClientUtilリリースしました

GWTClientUtilリリースしました。名前が少し大きいですが、とりあえず作ったのは、GWT-RPCを逐次的に呼び出すためのクラスです。
今後、色々便利なクラスを公開したいと考えています。


GWTで呼び出し可能なライブラリの作成方法

GWTでは外部のライブラリを利用する時には、~.gwt.xmlファイルに inheritsタグにより追記(定義)が必要であるということはGWTの基本中の基本ですね。
では、自分で作成したGWT用のライブラリを第3者にも使えるようにするにはどうすればいいのでしょうか?実は、1点だけ注意点が必要です。

inheritsタグとは何なのか?
inheritsタグには、自分が作成したクラスのクラス名(パッケージ名含む)をかけばいいというものではありません。実はこのタグは、そこに記述されたGWTモジュールを呼びだそうとします。つまり、inheritsタグはクラスを呼び出しているのではなく、GWTモジュール(~gwt.xmlファイル)を呼び出しているのです。

~.gwt.xmlファイルを用意する
自作したライブラリに、.gwt.xmlファイルを用意しましょう。
このファイルを下記のようにおきます。


上記の例では、org.ochilab.gwt.client.util パッケージに SRMC.gwt.xmlというファイルを置いてます。これにより、呼び出し元のGWTモジュールにおいては、
< inherits name='org.ochilab.gwt.client.util.Gwttool'/>
というように呼び出すことができます。

2013年9月20日金曜日

OSimpleMapperCS リリースしました

AWSが提供するデータベースの1つであるSimpleDBのO/Rマッパーもどきのライブラリ(C#版)として
をGitHubにリリースしました。おちラボでは、Javaアプリケーション開発においてSimpleDBの利用を進めていましたが、本ライブラリを利用することでC#アプリケーションからのSimpleDB利用が容易になるかと思います。


2013年9月13日金曜日

Scientific LinuxにGlassfishサーバをインストールする

久しぶり?にGlassfishサーバを立ち上げることにしたのでそのメモ書き。サーバOSはScientific Linuxです。以下、作業メモ。

0. JDKのインストール
JDKは入っていることが前提ですので、、、、ここでは省略します。

1.GlassFishのダウンロード
からダウンロードします。Opensource Editionが自由に使えてフリーです。通常はこれでいいと思います。

2.インストール
解凍して、任意の場所に移動させるだけです。

3.起動と初期設定
管理者権限で、起動させます。ドメイン名はなんでもいいと思います。最初は、管理者パスワードを設定しておく必要があります。

4.管理画面にアクセス
設定をし、再起動したら管理画面にアクセスしましょう。ブラウザから
  • localhost:4848
  • XXX.XXX.XXX.XXX:4848
とアクセスすれば反応があるはずです。もし反応がない場合、Linuxのファイアウォール設定を確認しましょう。閉じられている可能性がるのでアクセスを許可します。なお、最初にアクセスした時はログイン後に時間がかかることがあります。気長に待ってみましょう。

5.サーバにアクセス
通常のアクセスのポートは8080 です。他のアプリケーションと重複している可能性があるので、確認し、重複していれば管理画面で変更します。なお、ここでもファイアウォール設定には注意しましょう。



2013年8月23日金曜日

Kinect + OpenCV(OpenCVSharp)は32bitでの実装が無難?

64bitでも問題なく動くので、この記事は古く無視して下さい。

KinectとOpenCVを利用したシステムのデモ準備をするためにノートPCで準備をしていたところ、他のマシンで動いていたはずのプログラムが動かないという事象が発生。具体的には、起動はするのだが、途中で固まってしまうという状況。スペックにはさほど違いはなく、スペック不足の可能性は低い。ちなみに、OpenCV(OpenCVSharp)は64bitでも単体では動いている環境です。

で、結論は表題にもあるように、
Kinect + OpenCV(OpenCVSharp)を動かす時は、32bitの環境にしておく
ということで、とりあえず解決。プロジェクト、OpenCV, OpenCVSharpはいずれも32bit版を利用するのが無難でしょう。





C#:間違ったフォーマットのプログラムを読み込もうとしました

C#のプロジェクトで、プログラムを実行した時、
間違ったフォーマットのプログラムを読み込もうとしました
というエラーが出る時があります。これは、コンパイルターゲットのプラットフォームと利用しているライブラリが、64bitと32bitと不一致している時におきます。どちらのモードで動かすのか決めて統一しましょう。



2013年7月25日木曜日

RMeCab on RServe で頻度情報の抽出方法(複数ファイルを対象)

RMeCab on RServe で複数のファイルを対象にした場合の頻度情報の抽出方法についてです。結果として出力される単語は属性、頻度はデータとして出力されますが、やっかいなのはそれらは全て1次元となっている点です。つまり、抽出された単語数がx、文書数がyであれば、x*yの大きさの1次元配列が出てきます。これらは多次元配列として扱うのが得策でしょう(データクラスを定義するのが一番クールだと思います)



2013年7月24日水曜日

C#:プロパティを理解する(2) ~インクリメント演算と制御~

プロパティについての紹介(2)です。(初心者向け記事です)
前記事(C#:プロパティを理解する)で書いたように、C#には、プロパティと呼ばれるメソッドと変数の中間のものがあります。
int型のプロパティは、通常のint型変数のようにインクリメント演算が使えます。また、set時に値の上限下限の制限を与えることで、予期せぬ値の変更に対応することができます。



2013年7月20日土曜日

RMeCab on RServe で頻度情報を抽出する

RMeCab on RServe で頻度情報を抽出してみました。注意事項ですが、Rの出力と行列の関係が異なっています。つまり、結果が列毎に文字列配列として格納されていますので注意して下さい。



2013年7月19日金曜日

RMecab on RServeで簡単な形態素解析をしてみた

RMecabで簡単な形態素解析をして、それをRServe経由で結果を取得してみました。あっさり書いてますが、かなり苦労しました。RMecabの出力結果に応じて変えていく必要がありそうなので、要注意です。



2013年7月17日水曜日

MeCabとRMeCabをインストールした(Scientific Linux)

Rで言語解析をしようかと思い、RMeCabを利用することになりました。Scientific Linuxにインストールしたメモ書きです。コマンドは下記に載せてますので、ポイントをピックアップします。

Mecabのインストール
Mecabの公式サイトからtarボールをダウンロードして、make してインストールしましょう。特に問題はないと思います。

辞書のインストール
辞書はいろいろあるようですが、IPADICがオススメらしいのでそれをダウンロードし、make してインストールしましょう。ファイルは、Mecabの公式サイトに載ってます。これもインストールにはとくに問題はないと思います。

RMeCabのインストール
公式サイトがいまいちわかりにくいんですが(失礼  ^^; )、ファイルは32bit版と64bit版の2種類があります。ファイル本体は、作者所属の徳島大に置いてあります。
ここでの注意点は、Rのバージョンとbit(32bitか64bitか)です。これが合ってないとインストールできませんインスールはできますが、Rで呼び出せません。自分がいれたRを確認しましょう。確認方法は、コンソールでRを起動し、メッセージを確認すればいいです。



2013年7月11日木曜日

C++: IntelliSense: PCH 警告: 適切なヘッダー停止位置が見つかりません。

Visual C++の開発で、関数のプロトタイプ宣言がないまま関数定義をしようと
IntelliSense: PCH 警告: 適切なヘッダー停止位置が見つかりません。Intellisense PCH ファイルは生成されませんでした。
というエラーが出ます。C言語は、C#やJavaと違って、関数本体の記述の前に引数や戻り値を定義したプロトタイプ宣言が必要ですので、注意して下さい。


2013年7月8日月曜日

MacにインストールしたEclipseが起動しない場合の対処法 ~Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception~

MacにEclipseをインストールし、さあ起動!とクリックすると、
予期せぬエラー
みたいな感じで、Eclipseが全く起動しない状況が発生。エラー詳細をみると、
Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception
というエラーで、正直意味不明。。。で、解決策ですが、
  • ダウンロードしたEclipseのtarボールをダブルクリック解凍するのではなく、tarコマンドを利用して解凍する。。( tar -zxvf eclipse-XXXXXX.tar.gz )
という方法でOK。騙されたと思ってやってみて下さい。


2013年7月6日土曜日

Google Apps Script勉強会に参加&発表してきました


先日、GDG京都と京都GASとの共催のGoogle Apps Script勉強会(GAS勉強会)に参加してきました。私はGDG京都の運営スタッフ兼発表者として参加しました。

GAS概要(私)
ここは私が担当しました。。。が、このBLOGでも書いているとおり、GASについては最近はじめたばかりで、何か特別なことを話せるというネタはなかったのですが、自分自身の勉強のきっかけも兼ねて、GASの概要を調べて説明しました。正直、資料を作る時間が思ったよりもとれず自分でも未確認のところが多かったので、見当違いのことを話してるんじゃないかと柄になくめちゃめちゃ緊張しました。あと、個人的に時間オーバーする傾向があるので、ちょっと早めに喋ってたら思った以上に早く終わってしまい、ちょっとプレゼン的には失敗したかなという反省。ただ、ポイントは抑えたつもりで、後の発表の前知識としてはまずますだったかなと思います。あえて言えば、もう少しソースコードを見せてもよかったですね。

Google Apps ScriptとクラウドBPMとの連携(日下さん@クエステトラ)
自社のクラウドサービスにGASを連携させている事例の発表でした。GASによって既存のシステムを補完するというスタンスで、大変興味深い内容だったと思います。

Google Apps Scriptの業務での活用事例(佐藤さん@らしく)
SpreadSheetをサーバ的に利用する事例について報告されてました。また、GASをプログラミング教育のツールとしてとらえて活動をはじめていくようです。

Google Apps Scriptの新機能(小川さん@トップゲート)
最後は、本勉強会のメインディシュでもあるGoogle Expertの小川さんに今年のGoogleIOで紹介されたGASの新機能についてお話がありました。ライブコーディングで新機能を説明されるのは圧巻です(個人的にネット経由で小川さんのライブコーディングを背景したことはありますが、生で見るのは初めてです)。個人的に一番気になったのはGASによるFormsプログラミングですね。

自分ならびに他の3名の話を聞いて共通して感じたことは、GASは
  • とてもお手軽
  • しかもいろいろなことができてしまう
という点ですね。特に私は、佐藤さんも話していたのですがプログラミング教育の言語としての可能性をビリビリと感じました。商品などでの実利用は確かにまだリスクはありますが、ゼミでの卒研等でも使えそうですし、教育の場で利用してもいいかなと思ってます。

GAS関連のイベントがあれば、積極的に参加するつもりです。





2013年7月4日木曜日

XNA と RADEON系グラフィックボードの相性が悪いかもしれない話

ラボでは、XNAライブラリを利用したシステム開発プロジェクトが1つあるのですが、先日、マシンを変更した時に今まで動いていたプログラムが正常に動かなくなりました、、、正確に言うと
コンパイルは通って実行できるのに描画内容が違う
というトラブルが発生しました。

(1)スペック不足?
 最新型に乗り換えたのでそれはないですね。
(2)ソフトウェアのライブラリのバージョン違い?
XNA, Visual Studio, Win7, DirectX いずれもバージョンが同じであることを確認。
(3)ディスプレイ関係
以前と同じ。グラフィックカードのスペックも高性能になっているし、ドライバの最新版にアップデートしても状況変わらず。
(4)機種依存の実装をしている?
別のノートPCで動いた実績ありなので、これも却下

という感じで、もう、何が起こってるのか、わけがわからないよ!とお手上げ状態だったのですが、1点グラフィックボードの種類に問題があるのではという事に気づきました。

グラフィックカードには、
  • RADEON系
  • GeForce系
の2大勢力があるのですが、トラブルが起こったマシンはRADEON系。今まで動いていたマシンはGeForce系です。で、ネットをぐぐってみると、RADEON系ボードでXNAのプログラムが正しく動かないという事例があることがわかりました。おそらくこれが原因でしょう。別途ボードを用意して確認したいと思います。

そういえば以前、RADEON系ドライバとVistaの相性が悪い事例がありました。RADEONは要注意ですかね?



2013年7月1日月曜日

RServeでJavaからRを呼び出す

RServeを利用してJavaからRを呼び出すサンプルです。

(1)ライブラリのダウンロードとクラスパス追加
http://www.rforge.net/Rserve/files/ から、
  • REngine.jar
  • RserveEngine.jar
の両方をダウンロードして、クラスパスに追加して下さい。

(2)サンプルコード
下記、サンプルではリモートマシンにあるRを呼び出していますが、ローカルの場合はアドレス指定なしでOKです。



RServeのインストールと起動コマンド

JavaからRを呼び出すには、RServeが便利そうなのでRServeインストールしてみました。

(1)RServeのダウンロード
http://www.rforge.net/Rserve/files/ からSource package(tar.gz形式のファイル)をダウンロードして下さい。

(2)RServeのインストール
R のインストールコマンドを利用します(下記参照)。

(3)リモート接続許可のための設定記述
/etc/Rserv.conf に
remote enable
と記述します。このファイルは初期状態ではありませんので、自分で作る必要があります。このファイルで設定できることは、マニュアルに書いてます。

(4)ファイヤウォール設定
リモートからのアクセスを許可するには、
  • 6311ポートを公開
してください。

(5)RServeの起動
Rのコマンドで起動します(下記参照)。

これで、各クライアント毎にRをインストールしなくても容易にRを呼び出すことができそうです。

2013年6月28日金曜日

Scientific LinuxにRをインストールする

Scientific LinuxにRをインストールしようとしたのですが、最初にちょっと手間取りました。実は簡単にインストールできるコツがあるのでメモ書き。ポイントは2つです。
(1)EPELリポジトリの追加
Rは実はyumで一発でインストールすることができます。しかし標準のリポジトリではだめで、EPELレポジトリを指定する必要があります。

(2)EPELを指定したyumの実行
yumでEPELを指定するだけです。あっという間にインストールは完了です。
それでは、快適なR生活をお楽しみ下さい。

2013年6月26日水曜日

Kinect Interactionsのグリップ情報(HandEventType)を検知する

Kinect for Windows SDK1.7には、
  • Kinect Fusion ・・・リアルタイム3Dモデリング
  • Kinect Interactions
という2大新機能が実装されました。今日は後者の話です。Kinect Interactionsでは、手のひらの状態を検出できるようになりました。具体的にはグー(Grip)とパー(GripRelease)の状態を検知できます。そのために、stream_InteractionFrameReadyというイベントメソッドが新たに用意され、この中で手の状態(HandEventType)を調べることで、状態を検出できます。具体的には下記のような記述になります。



OpenCVにてUSBカメラの映像を表示する(OpenCVSharp利用)

OpenCVSharpを利用して、USBカメラの映像を取ってくるサンプルです。



2013年6月22日土曜日

GitHubで一時的にアカウント停止状態になったしまってわかったこと

昨日、GitHubのアカウントが一時的に停止状態になってしまったので、その件について、、、

突如アカウント停止に
最近、GistにハマっているのでいつものようにGistにコードを流し込んでいたところ、突然、アップした結果が見れなくなり、下記のようなメッセージも出てくるようになりました。


“our trusty robot, Hubot, seems to think you are not a human.”って、特に変なアップをしたわけでもなく、アカウント情報にも特に不備はなく、、、何かの間違いだろうと思ったのですが。

アカウント停止になるとどうなるか?
(1)第3者がGistにアクセスした場合
以下の様なメッセージが出ます。これは、「存在しないgistのURLにアクセスした場合」と同じ意味です。
(2)第3者がGithubにアクセスした場合
以下の様なメッセージが出ます。これは、「存在しないGithubのURLにアクセスした場合」と同じ意味です。


(3)BLOGへの埋め込みはどうなるか?
コードの部分は全く表示されません。

データが消えてしまうのか?
結論から言うと、データは残ってます。アカウント停止と言いましたが、実際には以下の状態になります。
(1)ログインは可能
(2)パスワードの変更も可能
(3)GistへのコードのアップロードもOK
(4)自分のGithubのレポジトリーは見ることができる(アップは試してません)
(5)アップした自分のGistのコードを見ることはできない(上記のWhoopsメッセージがでる)
つまり、上記のように第3者からは全く見ることはできなくなりますが、中身は生きているということになります。

解決方法
サポートへ「私は人間です」とメールをするだけです(笑)。問い合わせサイトからもできますが、念のためメールにも送りました(もちろんちゃんとした文章は書きましょう。もちろん英語で)。
今回については、アカウント停止が発覚した夕方にサイトを経由して問い合わせをしたのですが、なかなか返事が来ないので、夜の23時頃にメールで問い合わせをしました。そうすると、よく朝の8時にメールに対して返事が来ていて、無事回復していたようです。

クラウドサービスの以外な盲点
この手のクラウドのサービスが利用できなくなった場合の怖さをちょっと感じました。この手の世界的なサービスが突然終わるということはまずないと思ってますが、こういう形で使えなくなるとは、、、今回はちょっと盲点でした。
個人的には、
  • サーバ類を自前で管理する
  • サーバ類をクラウドサービスに任せる
ということの双方の利点と欠点を考えた上で、後者を選んでます。その考えは今回の件があっても変わらないです。ただ、100%頼るのもよくないなとあらためて思いました。

Github/Gistはこれからも使い続けますよ
こういうことがありましたが、Github、とくにGistについてはこれからもガンガン使い続けるつもりです。ラボの学生へのサンプルコードを示すときにGistはとてもいい媒体になりますし、BLOGにも反映できますしね。暇な時は、おちラボのGistを覗いてみて下さい。




2013年6月20日木曜日

C#:DynamoDBにMapperを利用してデータを保存するサンプル

C#でもDynamoDBを操作することになりそうなのでそのサンプルです。Javaの場合は高レベルAPIであるMapper系のクラスが用意されていましたが、C#でも同様にありました。データクラスにアノテーションを書いて、クライアントクラスで利用するといった感じで、使い方もほぼ同じだと思われます。

本家チュートリアル(Using Amazon DynamoDB Object Persistence Framework - An Introduction)を参考にしました。

2013年6月16日日曜日

Goolge Apps Script勉強会

2013年7月5日(金)に、京都リサーチパークにて、KyotoGASとGDG京都主催のGoogle Apps Script勉強会を開催します。

私は、GDG京都スタッフとしてGoogle Apps Script(GAS) 概要について最初に話しますが、他にもGASをビジネスで利用されている方の事例紹介や、Google Developer Expertの方のHangout等の予定されています。

GASについては、本BLOGでも最近取り上げていますが、教育システムへの利用も含め、いろいろなポテンシャルを秘めていると思っています。
興味のある方は下記を御覧ください。
KyotoGASさんとGDG京都のGoolge Apps Script共催勉強会




2013年5月28日火曜日

C#: リストに格納されているクラスを任意の変数でソートする

C#でリストに格納されておりクラスをクラスの任意の変数でソートする方法です。Comparetorに相当するメソッドを定義して、Sortメソッドで指定すればOKです。



C#:プロパティを理解する

C#にはプロパティと呼ばれる枠組みがあるので、その紹介です。(初心者向けです)

オブジェクト指向言語においては、変数の隠蔽化などはよく利用される手法ですが、一般的には?というかJavaでは、getter/setterメソッドを実装した制御が一般的です。しかしこの方法は、実質メソッドが増えることになり、美しくないです。C#には(マイクロソフト系言語には)、
  • プロパティと呼ばれる関数と変数の中間的なもの
が存在します。これは、
  • 内部的にはメソッドのように処理が可能
  • 外部からは変数のように扱われる
という特徴があります。つまり、外部からは「値を代入」すればいいわけです。積極的に活用しましょう。記述方法は下記のとおりです。



2013年5月27日月曜日

【C#】OpenCVSharpでのBitmapとIplImageへの相互変換

C#だと思いのほか簡単です。



OpenCV2.4.5をWindowsで利用する

以前の記事、OpenCV2.1をWindowsで利用するの続編です。

OpenCVは年々進化し、かつ便利になっています。で、インストール方法も若干変わってきてるので、さらにその更新です。

ダウンロード&展開
公式サイトよりダウンロードします。Windows版の場合はOpenCV for Windowsというのがトップページからリンクされているはずです。それ以外のバージョンは、ダウンロードのリンクからたどってください。exeファイルですが、これは単なる圧縮ファイルです。インストーラーではありません。

ディレクトリに移動する
展開したファイルは適当な場所に移動させましょう。個人的には、
c:\OpenCV\<バージョン>\
とするのが好きです。

中身を確認してみる
buildディレクトリの中に必要なDLLファイルは既に出来上がっています。x64(64bit)とx86(32bit)とディレクトリが分けられています。どちらを使うのかは決めておきましょう。32bit版にしておくのが無難、、という声も耳にしますが、どうなんでしょうね?

Pathを設定する
OSの環境変数設定で、Pathに利用するバージョンに合わせて
;C:\OpenCV\2.4.5\build\x64\vc10\bin
を加えておきましょう。上記は64bit版でVisual Studio2010を想定しています。





OpenCVSharpをインストールする

※ 2016/08/04 記事内容が古かったので廃棄しました

下記記事を読んで下さい。



2013年5月18日土曜日

Gist:BLOGにコードを埋めこむ際のスタイル設定

Gistのコード埋め込みURLを利用した場合、BLOGのスタイルによってはフォントサイズが若干大きかったりして違和感を感じることがあります。その際は、CSSで設定できます。
こんな感じです。これで本BLOGでもいい感じに埋め込めます。

Github:Gistでソースコードを管理・公開する

すごく今更なネタですが、、GitHubにはGistと呼ばれるサイトがあり、ここは
  • 断片的なプログラムのソースコードを管理する
というのを目的としているようです。GitHubはオープンソースのソフトウェアやライブラリを公開するのに適していますが、ちょっとそれは大げさで、公開するにしてもそれほどまでのものではない、、、という類のコードなどが個人的にはあったのですが、このGistはもっとお手軽に公開できます。

しかも他のサイトへのコードの埋め込みもアシストしてくれます。これが一番うれしい。今までここのBLOGでは、SyntaxHighlighterというのを使ってコードの埋め込みをしていたのですが(Bloggerにてソースコードを載せる方法)、この必要もなくなります。今後は、
  • 本BLOGでのプログラムコード
  • ラボのサイトでのプログラムコード(講義とかラボ講座とか)
をGistにアップしようかと企んでます。


2013年5月17日金曜日

GAS:GASでSpreadSheetの組み込み関数(Query関数)を使う

GASは、私の勘違いでなければ
  • SpreadSheetでGASで書いた独自の関数を呼び出すことができる
  • SpreadSheetの組み込み関数をGASのスクリプトで呼び出すことができない(シート内だけで呼び出せる)
という仕様になっているようです(ちょっと信じられないんですが。勘違いかもしれません)。つまりシートの検索で使ってみたいQuery関数などは直接呼び出せないということになっているようです。で、その回避方法を思いついたので、、、

まずQuery関数はArrayで結果を返してくれるんですが、これをシート内で呼び出した場合、結果が複数あるとシートに複数行にわけて出力されます。これが大きなお世話な機能なんですが、この結果を1つのセルにおさめることができたらよくて、ここで独自の関数を組み合わせれば解決します。例えば、下記のようにArrayをCSVに変換する関数を用意します。
このQuery関数の結果をこの関数に渡すようにシートの式の記述をすればOKなわけです。例えば下記のようにします。 上記では、setFormulaを利用して一時的にあるセルにToCSVとqueryを組みあせた式を登録してます。(検索クエリの書き方が変なのは許してください。)こうすることで、シートの見た目が変わることなくquery関数を利用できます。 この方法を利用すれば、GASで直接SpreadSheetをデータベース的に使うことができます。まあ、GASにはDB機能もありますので、こういう使い方は今更かもしれませんが、、、、お試しあれ。

GWT: GWTでmoment.jsを使う

JavaScript界隈では、moment.js という時間関係のライブラリがちょくちょく話題になっています。というのも、JavaScripでは標準では時間関係のメソッドが弱いんようなんですよね。ふだんJavaScriptを使わない私ですが、この問題は無視できません。なぜならGWTはJavaScriptに最終的になるわけですから、JavaScriptでできないことはGWTでもできないわけです。本BLOGでも時間のフォーマットについて記事を書いたことがあります。
このmoment.jsをGWTで使うことができないか?当然そういうことを思っている人はいるわけで、
というプロジェクトがGitHubにありました。GWTユーザは必須のライブラリでしょう。


GAS: GASでウェブサービスAPIを実装する

GASは、GASでGoogle Driveがウェブサービスサーバになる? の記事でも書きましたが、ちょっとしたウェブサービスを実装することができます。ウェブサービスの場合は、普通のHTMLのレスポンスを返すのではなく、JSONやXMLといった形式で出力することになりますが、その記述をしておかないといけません。その方法ですがJSONの場合は
というように、出力のMimeTypeを設定しておく必要があります。XMLの場合はMimeType.XMLです。このタイプには、
  • ATOM
  • JSON
  • CSV
  • ICAL
  • RSS
  • VCARD
  • XML
といったフォーマットを指定することができるので、いろいろなタイプのウェブサービスが実装できると思います。


2013年5月14日火曜日

GSON:GSONを使ってJSON形式の出力を直接書きだしてみる

Google はGSONと呼ばれるJSONのJavaライブラリを公開しています。これは、
  • JavaのデータクラスをJSON形式にして出力する
  • JSON形式のデータをJavaのデータクラスに格納する
という使い方が中心ですが、JSONのデータ構造とJavaのデータ構造が異なる時は、直接的にJSON形式でデータを書き出すことも可能です。下記は、サーブレットでの出力の例です。
わざわざJavaのデータクラスに一旦書き込むよりも上記のようにWriterに対して直接的に書きだすほうが手間がかからないでしょう。なお、書き方については、beginObjectとendObjectで囲まれた範囲が1つのオブジェクト(データ)に相当し、配列の箇所はbeginArrayとendArrayで囲まれた部分になります。

2013年5月11日土曜日

GASとGWTの面白い関係

GASで記述するコードは、基本的にはサーバーサイドで動かすことを前提にしています。しかし、GASには「UiApp」と呼ばれるクラスがあり、これを利用することでHTMLのUIを作成することができます。
このUiAppを利用して作成されたHTMLページ(画面)は、実はGWTの形式で出力されていることが、ページのソースを見ることでわかります。つまり、

  • GAS(JavaScript)→GWT変換→ JavaScript

という、ある意味よくわからないことを内部処理でやっていることになります。
もちろんこれは、UI回りの変換だけです。AJax的な記述はGASの範疇ではないです。GASで作成できるウェブアプリは、基本的にHTTPリクエストによるページ遷移をベースにした従来型のウェブアプリケーションですので。

ただ、もしかすると将来的にAJax的な処理をかけるようになるのではないかなぁという気がしてます。

2013年5月8日水曜日

GWT(クライアント)+GAS(サーバ)というソリューション

先日からGASが気になってしょうがないので、その使いドコロについて考えているのだが、表題のように
  • GWT(クライアント)+GAS(サーバ)
というのは魅力的なソリューションとしてOKかもしれない。その利点は下記の通り。

クライアント>サーバというニーズ
昨今のAJaxとかGAEの実装などの流れをみると、サーバではあんまりガリガリやらなくてクライアントで処理をやるというのがトレンド。とすれば、GWTでリッチクライアントを実装してGASのフロントエンドとするのは不自然ではないでしょう。

GWTとGAS間の処理はJSONPで
GWTはJavaScriptと性能は同じなので、クロスドメイン通信禁止の制約は当然もってます。しかし、JavaScriptと同様、JSONPによるクロスドメイン通信は可能なわけです。試しにGASでJSONを吐き出す簡易サーバを作成して、GWTのJsonpRequestBuilderを利用してアクセスすると無事、成功しました。

GoogleDrive(SpreadSheet)の操作が容易に
GASを利用する際に一番良く使いそうなのは、SpreadSheet。SpreadSheetをデータベース的に使うのはあまり現実的ではないですが、ログ環境的なデータの保存場所として利用するのはアリ!システム利用履歴とか記録など、あとから分析したいデータなどは、別にデータベースに入れておかなくてもSpreadSheetに直接入れておくほうが、閲覧もラクですしね。

ローコスト
GASの料金は基本的に無料。意外とGASでできることは豊富で、GAEよりも制約は低い感じ。GWTもサーバサイド処理を使わなければ、静的コンテンツとして場所はどこでもOK。DropBoxでもGoogle Driveでも置いておけばいいのです。


個人的には、JavaScriptが嫌いでGWTにハマっているわけで、正直、GASには若干抵抗があります。しかし、ちょっと触ってみて思うのが、JavaScriptって意外とクライアントサイドよりサーバサイドにあっているのかな、、ということ。Node.jsが流行っているのもその点かもしれません。

2013年5月2日木曜日

Linuxでtar.gz圧縮したファイルをWindowsで解凍すると日本語ファイル名が文字化けた時の対処法

SAMBAのファイルサーバにしていたLinuxマシンから、保存してあるファイルをtar.gz圧縮してWindowsマシンに持ってきて解凍すると、日本語のファイル名が文字化けしている事象が発生。文字コードの違いだということはわかるのだが、どうすればいいか。。

minitar.exeを使う
Windows版のtarコマンド(tar32.dll)には、--convert-charset なるオプションがあるらしく、ここで文字コード(UTF-8)を指定すると、文字化けせずに解凍できる模様。同梱の
minitar.exeで下記のコマンドを打てばOK
minitar.exe -x --convert-charset=utf8 hogehoge.tar.gz
minitar.exeの入手については、
から、TAR32.DLL for windows32 をダウンロードすればついてきます。実行する際には、実行ファイル本体のほか、同ディレクトリにあるdllなども同じディレクトリにないといけないので注意してください。



2013年4月28日日曜日

JavaScript:Mapを実装する

(個人的にはJavaScriptは嫌いなのだが、GASで使う必要が出てきたのでメモ書き)
JavaScriptには、Mapというクラスはないが、配列の引数に任意の文字列を渡すことで、Map的なものとして使えるらしい。以下、サンプル。
ちなみに上記は、単語が格納されている配列を読み取って、頻度をMap(wordsMap)で管理するというプログラムです。

2013年4月27日土曜日

GWTアプリケーションをGoogleガジェット化する

これもネタは古いですが、GWTアプリのGoogleガジェット化について。

Googleガジェットとは
Googleガジェットは、Googleが提供する以下のサービスで稼働するガジェットです。
  • Google Desktop
  • iGoogle
  • Google Site
この手のガジェットは、Windowsガジェットも存在したように一昔前は流行ってたんですが、今は上記サービスのうちiGoogleもGoogle Desktopも終了する(している)わけで、今更なフレームワークという気もします。ただ、Google Siteは健在ですし、それなりにGoogle Gadgetは公開されいるので、いまさらなくならないだろうという気もします。

GWTアプリの公開手段とする
おちラボではGoogle Siteでラボのサイトを構築していますし、その上でいろいろウェブアプリを公開していけたらなと思っていたので、ふと、この古いフレームワークに目が止まったわけです。そのガジェット化の方法ですが、

というように、GWTのベースのHTMLファイルを呼び出すだけです。
前記事のDropBoxと組み合わせれば、簡単にガジェットとして公開できるかなと考えています。
なお、GWTのGadget化については、
というのもあるように、いろいろできることがありそうです。本記事の情報はあくまでも既存のGWTアプリをそのままGadget化しただけなので、興味がある人は上記リンクをみてみるとよいでしょう。


GWTアプリをDropBoxで公開する

ネタ的にはたいしたことないのですが、意外と便利な話。

DropBoxのPublicフォルダ
DropBoxにはPublicフォルダと呼ばれる特別なフォルダが有り、ここはHTMLファイルを置くことで、通常のウェブサーバ的にHTMLページを公開することができます。
このPublicフォルダは2012/10以降の新規ユーザにはないらしいですが、
https://www.dropbox.com/enable_public_folder にアクセスすれば有効になる模様 

DropBoxでGWTアプリを公開する
GWTのアプリの公開といえば、Google App Engineや他のウェブサーバが無難ですが、上記のPublicフォルダにGWTのアプリケーションファイルを置くことで、アプリケーションを公開することができます。GWTアプリの実体はJavaScriptなんですから、HTMLファイルにアクセスできたら動くはずです。もちろん、サーバ部分の処理はできませんので、あくまでもサーバ処理のないGWTクライアント限定になります。このことにより以下のメリットがあります。
(1)低価格
Publicフォルダ機能を利用するのに特に追加料金は不要です。また、アクセスが多くなったからといって追加料金が払われることもありません。
(2)簡単なデプロイ
GWTプロジェクトをコンパイルして、warフォルダの中身をPublicフォルダにコピーするだけです。


DropBoxの無料ユーザでももちろん可能ですから、ちょっとしたGWTアプリの公開ならばDropBoxでいいのでないでしょうか。


2013年4月22日月曜日

GASでGoogle Driveがウェブサービスサーバになる?

GAS(Google Apps Script)については、このBLOGで取り上げるのは初めてかと思います。GASはGoogle Doc(現在はGoogle Driveですが)で動くスクリプト言語で、雰囲気的にMicrosoftOfficeのVBAみたいなものと、軽く考えていましたがそうでもないようです。
GASを利用することでちょっとしたウェブアプリケーションを作成できることは書籍やネットをみれば気づくことです。しかしそれだけでなく、実はHTTPリクエストを受け取ってデータを返す、、といったように通常のウェブサービスのような振る舞いをさせることが可能のようです。
具体的には下記のような記述です。
といった感じで、doGetメソッドでリクエストを受け取り(この名前はname)、それを返すような処理が書けます。これって、サーブレットでやることとほとんど変わらないですよね?
詳細はまた後日書きますが、GASからはHTTPのリクエストや各種Googleのサービスを呼び出すことができます。ということは、GoogleDriveをサーバー化してサービスを提供することでできるということになります。それも無料で!!動作速度は期待はできませんが、ちょっと興味深いところです。

以後、いろいろ調べてみようと思います。

2013年4月20日土曜日

DynamoDB: ローカルセカンダリインデックスを使ってみた(DynamoDBMapper利用編)

早速話題のDynamoDBのローカルセカンダリインデックスを、高レベルAPIであるDynamoDBMapperクラスから利用してみました。以下はJavaDocを見ながら試行錯誤で試してみた速報的なものですので、若干勘違いもあるかもしれません。

なお、ローカルセカンダリインデックスを使うためには、ライブラリのパッケージは
com.amazonaws.services.dynamodbv2.*
以下を使用することになるので注意してください。

ローカルセカンダリインデックスを持つテーブルの作成
テーブル作成時にローカルセカンダリインデックスを定義する必要があります。事後にインデックスを追加することはできないので要注意ですね。


Index Name名というのがよくわからないので、Attributeの名前を同じにしました。

データクラスにアノテーションを記述する
アノテーションの記述方法ですが、ローカルセカンダリインデックスに相当するAttributeについては、
@DynamoDBIndexRangeKey(localSecondaryIndexName ="age")
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
というようにします。

ローカルセカンダリインデックスで検索をかける
従来のRangeKeyに対する検索の方法と同じです。
上記は、年齢(age)をセカンダリインデックスとして20才のデータを探している例です。

ローカルセカンダリインデックスの特徴
個人的にポイントと思っているのは下記の点です。
  • テーブル毎に最大5つのローカルセカンダリインデックスを作成可能
  • あくまでも従来のレンジキーに対する代替 
  • 複数のローカルセカンダリインデックスを組み合わせた検索は不可
  • 従来のレンジキーとの組み合わせも不可
  • 紐付けるAttributeによってコストが増える?
従来よりも便利になることは間違いないですが、どういった検索をするかを考えた上でインデックスを定義しておかないといけないわけで、意外と設計の難易度が高いという印象です。

APIの仕様が若干変化している点に注意
パッケージがcom.amazonaws.services.dynamodbv2に変わるとともに、微妙にAPIの仕様が変わってます。今までのコードが動かなくなる可能性が高いので注意が必要でしょう。現状すでにDynamoDBで運用している場合は、移行の際は注意した方がいいです。

DynamoDBのmapperクラス関係がdeprecatedになっている件

DynamoDBにsecondaryインデックスが定義できるようになったというニュースを聞いて、ではちょっと試してみようかと、久しぶりにDynamoDBのプロジェクトを起動してみると、mapper系のクラスやメソッドがdeprecatedになっている。これは焦るわけですが、とりあえず、
//旧
import com.amazonaws.services.dynamodb.datamodeling.DynamoDBMapper;
//新
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
とすればいいらしいですが、なんだかなぁ。

まだあんまり話題になっていないのが気になるところ。

2013年4月16日火曜日

WordPressのadminアカウント名の変更

WordPressは知られたBLOGソフトウェアの1つですが、当然、いろいろ狙われるわけで、下記のようなことが起きることがあります。
デフォルトユーザー名の変更やパスワード強化を推奨:標的は「admin」のユーザー名、WordPressを狙う攻撃激化
デフォルトの管理者アカウントは admin ということは、周知の事実。この事は、アカウントアクセスの第一の壁がないということに久しく、上記の記事のようにブルートフォース(総当り)攻撃をされて、ログインされてしまうという危険性が出てくるわけです。

Adminのアカウント名を変える
Adminのアカウント名を変えることが、こういった攻撃を防ぐ1つの方法ですが、WordPressでは下記の点を理解しておくと良いでしょう。

  • adminのアカウント名を変更することはできない。
  • 新規の管理者アカウントを作成し、そのアカウントでログインした後、adminのアカウントを削除する。
  • adminで作成されたコンテンツの権限は、新管理者アカウントに譲渡する(adminのパスワードを削除するときに聞いてきます)

つまり、新規に作成してadminは消せってことです。以上。

2013年4月5日金曜日

KVM:ネットワークのブリッジ設定

KVMで仮想環境を実現し、各種サーバー類をゲストOSで動かす時に必要なのがネットワークのブリッジ設定です。で、この設定でハマったのでメモ書き。環境はScientific Linux 6.4です。

NetworkManagerをOFFにする
これが動いているとうまく動かないらしいです。サービスで無効化にしておきましょう。

ブリッジ用ネットワークインタフェース(br0)の追加
/etc/sysconfig/network-scriptsディレクトリには、ifcfg- で始まるファイルがあります。これらがネットワークインタフェースです。br0を追加するというのは、ifcfg-br0というファイルを作成し下記のような記述にします。
DEVICE=br0
TYPE=Bridge
IPADD=192.168.0.20    
NETMASK=255.255.255.0
GATEWAY=192.168.0.1       
ONBOOT=yes DELAY=0
デフォルトネットワークインタフェース(eth0)の修正
eth0というネットワークインタフェースが元々あると思います。これをブリッジ対応にします。
DEVICE=br0
TYPE=Bridge
ONBOOT=yes
DELAY=0

以上の設定で、ブリッジインタフェースは出来上がりました。あとは、ゲストOS側からもbr0にたいしてBridge接続をすればOK。その手順は、
  1. KVMのNICの設定で br0(Bridge)を選択 ←その項目が挙がっているはずです。
  2. ゲストOSの音とワーク設定は従来通り
という感じです。

以上でネットワークに繋がるはずですが、iptablesの設定が必要な場合もあるようです。


2013年4月4日木曜日

WordPress:URLを変更する

WordPressの小ネタです。
WordPressの稼働しているサーバを新マシン等に移行をする際、いきなり移行するのではなくて仮のサーバを動かして動作検証したいものです。例えば、www.hogehoge.org という本番サイトが動いている状況で、とりあえず新サーバをwww2.hogehoge.org で動かしておいて、動作検証の後、ドメイン名を変更するという方法です。WordPressには稼働しているサーバのURL情報が記述されていますから、その情報を変更する必要があります。で、その方法ですが、WordPressの場合はURL情報がデータベースに書かれているので、すこし厄介です。方法は2つあります。

(方法1)WordPressの一般設定画面で変える
この方法が一番確実ですが、ミスは許されません。というのも、設定画面でURLを変更するとその瞬間から新しいURLにアクセスできる環境にマシンを設置しないかぎりWordPressにアクセスできなくなりますので。


(方法2)データベースを書き換える
WordPressが利用しているデータベースに直接アクセスし、

  • siteurl
  • home
の値に書かれているURLを変更するという方法です。ちょっと専門知識が必要そうですが、phpMyAdminを使って、検索をかければ意外と簡単にできます。

どちらも結局データベースを書き換えるわけで、個人的には方法1でいいと思います。ただ、万一ミスしたりうまくいかない場合、方法2のやり方を知っておくと直せますから、方法2を理解した上で方法1でやるのがオススメです。




Moodle:URLを変更する

Moodleの小ネタです。
Moodleの稼働しているサーバを新マシン等に移行をする際、いきなり移行するのではなくて仮のサーバを動かして動作検証したいものです。例えば、www.hogehoge.org という本番サイトが動いている状況で、とりあえず新サーバをwww2.hogehoge.org で動かしておいて、動作検証の後、ドメイン名を変更するという方法です。Moodleには稼働しているサーバのURL情報が記述されていますから、その情報を変更する必要があります。で、その方法ですが、
Moodle ディレクトリ内で、「config.php」ファイルの $CFG->wwwroot 変数をサーバに合わせて変更
とするだけでOKです。

2013年3月27日水曜日

GWT-Bootstrap: アイコンをFlexTable内で動的に生成する

前記事では、UiBinderで宣言しておいたDivタグに対して、動的にアイコンを埋め込む方法を紹介しました。今度はちょっと応用技です。
  • 動的に生成されるFlexTableの各行にアイコンを埋め込む
というのをお題にします。方法は以下の通り。
Element div = DOM.createDiv();
div.setClassName("icon-bookmark-empty");
fTable.setHTML(0, 0, div.toString());
上記のコードでは、div要素を動的に生成し、それをtoStringでHTMLとしてテーブルに埋め込む、、、という1行目と3行目がポイントです。

GWT-Bootstrap: アイコンを利用する

GWT-Bootstrapには、本家と同様にいくつかのアイコンが用意されています。この使い方は、以下の通り。
<i class="icon-asterisk"></i>
<div class="icon-asterisk"></div>
上記のように、UiBinderでiタグやdivタグにアイコンのclass指定をすることで、アイコンが埋め込まれます。spanタグでもいいでしょう。

ただ、アイコンを静的に埋め込んでおくのは芸がなく、やはり動的に埋め込みたいものです。その際は、空の要素のdivタグ等を用意して、それをJava側から制御すればOK。その記述方法は下記の通り。
@UiField
DivElement dd;

dd.setClassName("icon-angle-right");


2013年3月25日月曜日

DynamoDB:DynamoDBのプロビジョニングされたスループットを探ってみた

おちラボでは、昨年度からDynamoDBをバックエンドとするDBについて密かに?試作しているんですが、実はDynamoDB のキモとなる
プロビジョニングされたスループット
なるものについては、よくわからずに使っていました(つまり、そんなに本格的に使ってないということなんですけどね ^^; )。

で、最近、ネット界隈で、
DynamoDBにおけるスループット超過対策 〜 Fallback-Queueingパターン
なる記事が話題になっているようで、 DynamoDBの正体とその解決策に、なるほどーっと感心していたわけですが、、、

DynamoDBってそんなめんどくさいサービスなのか???
記事を読んでみて素朴な疑問が出てきたわけです。というか、1年間ちょこっと触ってみて個人的に感じたDynamoDBの欠点は、
  • テーブル毎に課金されるということはテーブルいっぱい作れない!!
ってことがまず1点。課金をケチろうと思ったら従来のRDBみたいな考え方ではアカンのですよね。で、今回の話題で発覚したのが、
  • リクエストスループットは、プロビジョニングされた容量を超えるとリクエストが失敗する
というさらなる欠点が、、、失敗したらどーなるの?データは反映されない?そんなのデータベースって使い物にならんだろう。と思うのは僕だけでしょうか?
で、その解決策として、上記のBLOGの解決策は秀作なんですが、これって元々のDynamoDBが奨励している使い方ではないですよね。いわゆる高等テクニックなわけで、ちょこっとプロトタイプ作ってみましたーみたいなレベルの我がラボのようなところではちょっと敷居が高すぎます。

例外処理で条件ワケするってのはどーも気持ち悪い
上記、BLOGを見ると「ProvisionedThroughputExceededException」というのが、プロビジョニングされた容量を超えた場合に発生するということがわかりました。(へぇ!へぇ!へぇ!へぇ!)
しかし、例外処理を条件分岐のように使うってのは、オブジェクト指向的に美しくないって習いませんでしたか?いや私も習ってませんが、どこかの本にそんなこと書いていた気がします。もっと、スマートなやり方ってないのかな?

getUnprocessedItemsメソッドというのがあるらしい!
ちょっといろいろぐぐってみると、getUnprocessedItemsというメソッドがあり、簡単にいうとBatchWriteItemのような処理で書き込みできなかったアイテムのリストを取り出すことができるということ。これを使えば、書き込みの再試行ができるというわけです!サンプルプログラムは下記のようになります。
do {
 batchWriteItemRequest.withRequestItems(requestItems);
 result = client.batchWriteItem(batchWriteItemRequest);
 requestItems = result.getUnprocessedItems();
} while (result.getUnprocessedItems().size() > 0);
ごらんのように、最初にrequestItemsを渡してバッチ実行したあと、getUnprocessedItemsメソッドでrequestItemsで取り残されたアイテムに更新し、もし取り残しがあれば再度バッチ実行するということです。この方法により、ループが回り続ける限り、登録は行われることになります。

ちょっと試してみた
getUnprocessedItemsメソッドで出力されるリストの中身を確認すれば、どんな感じに処理が失敗していくのかがわかります。空であれば、一発でバッチ登録は成功、そうでなければ失敗したということになります。条件として、
  • プロビジョニングスループットを1にしたテーブルを用意
  • batchWriteItemメソッドで、リミットの25件分のitemを一括登録する処理を20回繰り返す
というのを試してみました。挙動は予測するのはちょっと難しくて、最初の試行ではスムーズに登録完了しました。が、一度、中身を全て消して再度試行すると、途中のターンからリストに失敗したitemが残るようになりました。これはどういうことかというと、
  • 実際にリクエストしたスループット(Average Consumed Write Capactiy)の計算方法が単位時間によるもの
ということが想像出来ます、つまり単発的にデータを200件ほど追加するだけだと、プロビジョニングスループットを1にしていても問題なし。しかし、追加や削除などを繰り返すと、スループット平均値が上がってしまい、登録が失敗するということです。

上の図は、今回試した時のスループットのログです。赤線はプロビジョニングスループットの1です。青線の最大値は1.5です。
ちなみに、書き込みが失敗している場合、whileループが継続されてbatchwriteが行われるわけですが、ループを回るたびにitemのリストは1つずつ減って行きました。つまり、1item分しか処理されていないわけで、これってつまり、プロビジョニングスループットが1であるということなんですよね。

低レベルAPIでしかできないようだが、実は、、、、
getUnprocessedItemsメソッドを使えば、ループにより再処理ができ、漏れ無くデータを登録できることがわかりました。ただ、これが使えるのは、DynamoDBのSDKの低レベルAPIだけ。おちラボでは、高レベルAPIのmapperを使ってたんですが、これだとgetUnprocessedItemsメソッドが使えない模様です。もしかして、低レベルAPIで作り直し??
ちょっと気になって、高レベルAPIで同様の一括処理を試してみました。すると、データベースの中身を見てみましたが、時間はかかりますけどちゃんと入っているようです。どうやら高レベルAPIでは内部で同様の処理をしている模様(ソースを覗いたらはっきりするんでしょうけど)。つまり、、、再試行してくれててデータはちゃんとはいってるということ??

うーん、結局、気にしなくてもよかったのかなぁ。。。



2013年3月22日金曜日

2012年度大学院修了生を送り出して


2日連続で似たような話ですが、今日が大学院の修了式でラボからも1名が終了するので、、、、

修了生へ贈る言葉
研究科長の祝辞(3つのアドバイス)がいい話でしたのでそれをネタにして個人的なアドバイスを書いてみます。
(1)自分の専門にプライドを持て
院卒ならまあ当然ですよね。院卒というのは、ただたんに年を重ねて「院卒」という肩書きをもらうものではなく、研究活動で専門性や研究・開発力を高めたという証であるはず。修了後の仕事内容に関わらず、大学院で学んだことはいろいろな面で活かされるでしょう。それに気づかない人は残念な2年間を過ごしたということになるでしょうね。
(2)リーダーとして誠実な人間になれ
院卒=リーダーとは言い切れませんが、まあいずれは部下を持ったり、人を動かす立場になるでしょう。その時に求められるリーダーシップ、、、リーダーシップってなんだろう?いろいろな側面はあると思いますが、大切なのはリーダーたる魅力を持つことなんですよね。その1つに「誠実さ」という一見するとリーダーシップとは異なるようで重要な要素があるかと思います。リーダーになるというのは偉そうにすることではありません。責任をもって決断をし、集団を引っ張っていく必要があります。しかし、完璧なリーダーというのは存在しないわけで、何かミスやトラブルが起きた時にどうするか?その時、皆が支えてくれるリーダーであるかどうか?良い部下あっての良いリーダーであり、良いリーダーあっての良い部下なのです。
(3)幸せは勝ち取れ
「♪幸せは〜歩いてこない」ってことです。待っているだけでは何も始まらないし、進まない。幸せになりたい!のであれば、どうすればいいか?誰かが持ってきてくれるものではなく、まずは行動せよということですね。この話は実は奥が深いと思ってます。昨今の日本の産業の停滞感、、、今は冬の時代だがここを我慢すればまた春(バブル)がやってくる、、と思ってませんか?我慢する=待つのであれば、永遠に春は来ません。動く=変えていく必要があるのです。院卒の修了生はそういう人材になってほしいと思ってます。

以上、、、修了、おめでとうございます。

2013年3月21日木曜日

2012年度卒業生を送り出して


卒業おめでとうございます!今年は学部生11名、院生1名が巣立ちます。昨年度が少なかったせいか今年はいろんな意味で卒論指導に疲れました。残念ながら就職が決まっていない学生もいますが、いずれにしても卒業はゴールではありません。新しい人生の始まりです。

卒業生へ贈る言葉
今年も学科長の祝辞の内容(3つのアドバイス)をベースに書いてみようかと思いますが、共感すること多々あり。。。というか、今年のゼミ生の印象を一言で表現するとすれば、
みんなマイペースだったなぁ
という感じ。まあこれはいい意味であり、悪い意味でもあり。。。だからこそ、3つのアドバイスはしっくりきました。

(1)失敗を恐れずチャレンジする
失敗できるのは若者の特権、学生の特権です。ではこの4年間、あるいは卒論を振り返ってチャレンジしたことはあったでしょうか?仕事というのは時には、難しいこと、リスクの高いことをしなければいけない時もあります。マイペースでのらりくらりとできるものではないのです。20代の失敗は失敗じゃない、、、というのが私の持論です。いろいろなことにチャレンジしてください。

(2)危機管理をしっかり。想像力を持って。
仕事は一人ではできません。社会というのはたくさんの人が関わりあっています。そして皆の考えや価値観は十人十色です。その中で予期せぬことが出てくるはずです。他人に干渉されずマイペースに生きるというのは現実として難しいでしょう。
また、ゼミ指導では、「締切り間際に相談するな。事前にホウレンソウをしろ。締切当日にわかりませんでした、できませんでしたというのは認められないよ」ということを言ってきましたが、よい結果を出す、悪い結果をださないようにするにはどうすればいいか?ということを想像してほしいですね。

(3)目標をうまく設定する
仕事は成果が求められ、そしてそのために消費できるリソース(時間、お金)は無限ではありません。有限のリソースの中で目標を達成するためににどうすればよいか?ゼミのプログラミングの指導でよく言ってきたことですが、大きすぎる目標(課題)、曖昧な目標(課題)というのはなかなかそれに向かって動きにくいです。また、それがうまくいかない時、なぜうまくいかないのか? 目標向かって進めてないのか?の分析もしにくいです。長期的な目標を持つことはもちろん大切ですが、それに向かってどうすすんでいくかというサブゴール(目標、課題)をいかにうまく設定できるか?が重要です。ただ、サブゴールに目を奪われすぎて、長期的な大きな目標を見失うのも問題です。目標をうまく設定する、、、これは簡単なようで難しいですね。

以上、思いつくことを書いてみました。マイペースな皆さんに幸あれ!


2013年3月11日月曜日

GWT4NBはまだ生きているようです

おちラボでは、開発環境をNetbeansからEclipseへ移行しましたが、その理由は、GWTやGAEの対応がEclipseのほうが公式に対応しているからということであり、個人的にはNetbeansは好きだったので、今、どうなってるんだろう?と気になってました。
ふと、ググってみますと、GWT4NBプロジェクトはまだ生きているようですね。
gwt4nb(GitHub)
ごらんのように、GitHubにリポジトリを移動して現在もバージョンアップが進んでいるようです。最新バージョンでGWT2.5に対応してます。
 一方、GAEの対応状況は進んでないようです。もし、GWTには関心があるがGAEには興味が無いというのであれば、Netbeansを使うという選択肢はありだと思います。GWTはあくまでもクライアントサイドの技術ですし、GWTーRPCもただServletをラップしているだけですから、コンテナは選びませんしね。

2013年2月27日水曜日

PHP: It is not safe to rely on the system's timezone settings

PHPのアプリをインストールしようとしたとき、表題のように
 It is not safe to rely on the system's timezone settings
というメッセージが出ることがあります。これは、PHPでのタイムゾーンの設定ができてないからです。

その際は、/etc/php.ini を開いて
  • date.timezone = Asia/Tokyo を追記
  • Apacheを再起動(しなくてもいいかな?
とすればOK。

GAE:Java7に対応へ

ようやく、Google App EngineがJava7対応になるようです。
Java 7 Considerations
現在は試験運用のようです。Java6のコードが動かなくなるという意味ではないと思いますが、ただ、「Java 6ベースのアプリがJava7で動くかどうか試しとけ、、」みたいなことは書いてますので、移行に向けて確認をしておくほうがいいでしょう。
この件はGAEのサーバの話ですし、将来的にJava6のサポートを廃止するようですので、我々開発者には「Java7に移行しない」という選択肢はないと考えたほうがいいでしょう。

ちなみに移行時にはいきなりどーんと変わるんでしょうかね?スイッチみたいなのを用意するのでしょうか?気になるところです。






2013年2月26日火曜日

2012年度教育システム情報学会関西支部学生研究発表会

今年も下記の学生研究会で発表します。おちラボからはM1の5名が発表します。
昨年度優秀ポスター賞を得たタブレットシステムも、バージョンアップして今回もポスター発表となります。

発表会 日時・場所
 日時:2013年3月9日(土)13時から
 会場:関西学院大学 大阪梅田キャンパス 14階
    http://www.kwansei.ac.jp/kg_hub/

発表会のスケジュール、プログラムなどは関西支部のサイトをご覧ください。

参加費は無料です。


2013年2月25日月曜日

GWT: 標準ライブラリのHTML5Canvasを利用する ~UiBinder編~

GWTでHTML5Canvasを利用するのであれば、UiBinderを利用するとラクになります。

Inheritsの設定
<inherits name="com.google.gwt.canvas.Canvas">
と書きます。

UiBinderの書き方
xmlns:c="urn:import:com.google.gwt.canvas.client"
 <c:Canvas ui:field="canvas"/>
と書きます。

Javaファイルの書き方
ここはいくつか注意事項があります。
@UiField(provided = true)
Canvas canvas;
public MyCanvas() {
 canvas = Canvas.createIfSupported();
 initWidget(uiBinder.createAndBindUi(this));

 canvas.setWidth("800px");
 canvas.setHeight("800px"); 
 canvas.setCoordinateSpaceWidth(400);
 canvas.setCoordinateSpaceHeight(600);
}
上記を見てもらうとわかりますが、
  • @UifFieldのところに、(provided = true)が必要
  • canvas = Canvas.createIfSupported()の処理が必要で、さらにそれは initWidgetの前にしなければならない
ということです。

以上で、普通にCanvasを利用できます。イベント処理も楽になるのではないでしょうか。

GWT: 標準ライブラリのHTML5Canvasを利用する

GWTでHTMLCanvasを利用するには、過去にはサードパーティ製のライブラリ、例えば、
などがありましたが、今では 「com.google.gwt.canvas」の中に取り込まれています。以下、簡単な使い方です。
  Canvas canvas = Canvas.createIfSupported();
  canvas.setWidth("400px");
  canvas.setHeight("400px"); 
  canvas.setCoordinateSpaceWidth(400);
  canvas.setCoordinateSpaceHeight(400);
 Context2d context = canvas1.getContext2d();
上記には少しポイントがありまして、Canvas領域のサイズを変更するには、
setCoordinateSpace****();
というのを使わないといけないということ(これを理解するのに苦労しました)。

あとは、Context2dに対して描画のメソッドを呼ぶだけです。例えば下記のようにです。
context.fillRect(x,y,w,h);//塗りつぶした四角形を描く。尚、塗りつぶす色の指定はfillStyleプロパティで設定する。
context.strokeRect(x,y,w,h);//線だけの四角形を描く。尚、線の色の指定はstrokeStyleプロパティで設定する。
context.clearRect(x,y,w,h);//四角形の内容を消去する。
context.rect(x,y,w,h);//他のパスと組み合わせて四角形を描く。
context.fillText(text,x,y,[maxWidth]);//塗りつぶしのテキストを指定座標に描画する。
context.strokeText(text,x,y,[maxWidth]);//線だけのテキストを指定座標に描画する。
context.moveTo(x,y);//パスを作成する際に指定座標に移動させる。
context.lineTo(x,y);//直線を描画する。
context.stroke();//lineToメソッドなどで描画したパスを表示する。
その他にも、図形の回転、イメージ・映像の描画、描画した内容の保存などができるメソッドがあり、様々な表現がCanvas上で実現できるようになっています。

P.S
後記事の
のほうがオススメです。


MSWord:ワードでソースコードを書く方法


おちラボでは、卒論や修論の執筆にワードを利用してます。(理系ならTexだろ?という意見はとりあえずおいといて、、)
論文中にソースコードを一部を掲載して説明するような場合が少なからずありますが、ふつうにソースコードを貼り付けるとかっこ悪いわるくなりますので、フォーマットに工夫が必要となります。
その工夫は以下の通り。
(1)ソースコードの部分は表にする
(2)表内の行間を狭くする
ここは、段落設定にて行間を「固定値」に変えて間隔を好みに応じて変えてみるといいでしょう。なお、固定値にするだけで良い感じの行間になります。



(3)好みに応じてフォントを変えてみる
ソースコードに適したフォントなどもあるようですが、日本語のフォントとのバランスが注意です。
(4)好みに応じて背景色を変えてみる
灰色っぽい色にするとかっこ良く見えたりします。

下記は、ワードの例です(クリックで拡大)。ちなみに、表全体を右方向に1段階インデントかけてます(表全体を選んで右インデント1回)。なかなか良い感じではないかと。。。

1つでもソースコード用の表を作っておけば、後は表ごとコペ-&ペーストで貼り付ければフォーマットを再利用できます。



2013年2月22日金曜日

GWT:GWT-BootStrapはじめの一歩

ちょっと巷で流行ってる?BootstrapのGWT版があります。
GWT-Bootstrap
これを使うためのはじめの一歩は以下のとおり。

(1)GWT-Bootstrap.jarをダウンロード

(2)jarをクラスパスに追加

(3)gwt.xmlでのinheritは以下のように書く
<inherits name='com.github.gwtbootstrap.Bootstrap' />
<set-property name="bootstrap.responsiveDesign" value="true"/>
 (4)UiBinderでのXMLNamespaceの書き方
xmlns:b="urn:import:com.github.gwtbootstrap.client.ui"
この記述をuiタグに追加してください。これで利用できるようになります。




GAE:本番環境かどうか判断する方法

GAE用のサーバサイドプログラムが動いている環境が、本番環境(appspot)かローカル環境なのかを判断するには、下記のコードでOKです。
String env = System.getProperty("com.google.appengine.runtime.environment");
開発環境ではDevelopmentという文字列が返ってきます。

EclipseのソースファイルをDropBoxで共有 ~Google Web Application編~

自宅と職場・大学で開発を継続させるには、DropBoxを利用して共有するのが一番です。しかし、Eclipseの場合、WorkspaceにPC固有の環境情報まで入ってしまうので、Workspace毎共有してもで動かないということが多々あります。そこで、DropBoxでEclipseのファイルを共有するには、
  • ソースファイルだけ共有する
というのが、無難なやり方となります。具体的に言えば、プロジェクト(Workspace)内にソースコードはおかず、DropBox内のディレクトリにソースをおいて、プロジェクトに紐付け(リンク)させればOK。
ただしWeb Applicationの場合、Javaソースフォルダだけでなく、warフォルダ(Webフォルダ)も共有しないといけないので、ちょっと面倒。以下、その方法を述べる。

0.共有フォルダの作成
ここでは、次の3つのフォルダを共有する。自分の環境で何を共有するのかはお好みで。
  • src  ・・・ Javaのソースファイルを置く場所
  • war ・・・ Webディレクトリとなる場所
  • lib ・・・ このプロジェクトで利用するライブラリ(jarファイル)の置き場
1.Javaソースの共有
(1)Java Build Path(Source)でDropboxに作ったsrcフォルダをソースとしてリンク追加
(2)元のソースディレクトリは削除してよい

2.Warフォルダの共有設定
こちらがちょっとやっかい。warフォルダだけでなく、classesの設定もしないといけないので。

(1)Java Build Path(Source)でDropboxに作ったwarフォルダをソースとしてリンク追加(例えばwar2と名付ける)
(2)Packege Exploreでwarフォルダ内の内容をwar2にコピーしておく

(3)Java Build Path(Source)でdefault output folderの設定をwar2フォルダ内のclassesに変更

(4)ここでエラーが出てOKボタンが押せないので、ソースフォルダ(Java Build Path内)からwar2を削除


war2/WEB-INF/classesをoutputフォルダにすると、上記のようなエラーが出ます。どうすればいいかというと、先ほど、ソースフォルダとして追加したwar2フォルダをパスから削除すればいいんです。


そうすると、なぜかうまくいくんですよね。。。。

(5)Google Web Application の設定で WARディレクトリ設定を war2にする。


以上の処理でOKです。(4)の処理がクセモノですね。ちなみに、(3)の処理をしておかないとデフォルトのwarフォルダが消せませんし、おそらくアプリも動かないでしょう。




2013年2月19日火曜日

GWT:HTML5Canvas用ライブラリ”Lienzo”

GWT関係のライブラリ紹介です。

現在、GWTではHTML5対応が進んでいて、HTML5Canvasをデフォルトで使うことができます。ネイティブのCanvasの仕様に準拠しているため、ある意味ガリガリとコードを書いていく必要があります。

で、emitorom社がLienzoと呼ぶオープンソースのHTML5Canvas対応ライブラリを公開しています。
Lienzo:An open source cross-platform structured graphics toolkit.
詳細説明は省きますが、個人的に気に入っているのは、
  • ViewPortによるCanvas描画イメージの管理(JSon形式でシリアライズ出力可能)
  • タブレットも含めた各種マウス・タッチイベントへの対応
  • アニメーション処理、画像処理の実装
などが挙げられます。個人的には、ViewPortに一番関心がありますね。描画データを別に管理できるわけですから、ここがキモだと思ってます。

このライブラリは、Apache License Version 2.0で公開されていおり、おちラボでも正式採用の可能性大です!


2013年1月29日火曜日

C#: SetParent関数

新しい親ウィンドウを設定するWin32APIです。
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

SetParent(thisHandle, ParentHandle);
何かの時に役に立つかもしれない関数です。

C#:HWNDをIntPtrに変換する

C#で、HWNDをC++で書かれたDLL関係を操作する際には、C#のポインタ変数IntPtrに変換する必要があります。その方法ですが、、、いたって簡単です。
  IntPtr wptr = (IntPtr)(XXXX.HWND);
のようにキャストするだけでOKです。簡単ですね。

2013年1月24日木曜日

GWT: Field xxx has no corresponding field in template file

GWTのUiBinderで定義したUIコンポーネントに対してUiFieldを記述してjavaクラスから呼びだそうとしたら、赤いアンダーラインの警告が出て
Field xxx has no corresponding field in template file
みたいなエラーが。。。。記述方法は間違いないのにどういうことか?

結論は、原因はわかりませんが
  • とりあえずコンパイル(F11)してみることで解決
ということに。たんなるバグのようですが、どういう状況でなるのかがちょっと不明。


2013年1月16日水曜日

Failed to load the JNI shared library "jvm.dll"

JavaのAuto Updateを実行した後にEclipseを起動したら、
Failed to load the JNI shared library "C:\......jvm.dll"
みたいなエラーが出た。これはどうやら、64bit環境に32bitのものが間違って入ってしまった時に起きるらしい。 というわけで、JREの再インストール。。。。

2013年1月14日月曜日

Java Pluginの脆弱性問題と動作確認の方法

新聞やネットなどで報道されているように、Oracle Java 7 に脆弱性が確認されました。具体的には、
  • ウェブブラウザ上で動作するJava Pluginに脆弱性がある
ということです。(詳細は、JVNサイトへ

これは、Java Appletと呼ばれるブラウザ上で動作するJavaのソフトウェアが対象です。Javaが世間に出た当初は流行りましたが、昨今ではあまり使われていない古い技術(ソフトウェアの種類)です。しかし、Java Appletが使われているサイトも存在し、いつの間にかブラウザのプラグインとしてインストールされている可能性はあります。
この問題を回避するには、「Javaをアンインストールすること」が一番確実ですが、Javaを利用したシステム開発をしている者にとっては、Javaのアンインストールなどは考えられないことです。また、Javaで動作しているアプリケーションも存在しますし、それらには何の害もありません。
この脆弱性の問題はあくまでのJava Appletに対してのものであり、Javaというプログラミング言語やJavaで動いている全てのソフトウェア、システム、サーバに問題があるわけではありません。

プラグインの無効化方法
Javaをアンインストールできない環境の人は、とりあえず下記のサイトを参考にしてプラグインを無効にして下さい。
Pluginの動作確認
ブラウザでJava Pluginが有効であるかどうかは
で、確認することができます。ただし、このサイトにアクセスする際は下記のことに注意して下さい
  • インストールされていない場合 → インストールするようなメッセージが出るのでそれは無視する(ここで入れたら意味が無い)
  • インストールされている場合(マシン情報等が表示された場合) → プラグインが動いているので無効にする
ちなみに、上記サイト自体が正しく動くのかもちょっと微妙なので、いずれにせよPluginをOFFになっているか確認したほうがいいでしょう。

Javaの今後が心配
Java Pluginの脆弱性の問題は実は今回が初めてということではなく、昨年度の夏頃から同様の脆弱性が指摘され続けてきました。気になるのは、日本のメディアが
プログラム言語「Java(ジャバ)」に情報セキュリティー上の弱点があることがわかり、米国土安全保障省などが使用を控えるよう警告を出した。(朝日新聞
という類の報道をしていること。「Javaというプログラム言語を使うな」とは、CERTも言ってないです。Javaは、サーバ系、組み込み系、Android等、いろいろな用途で使われており、それを使用禁止にするなんてことは現実的にはありえないですし、またその必要もありません(問題があるのはAppletだけですから)。

今後の流れとして、Appletというのは廃止になるかもしれませんね。今はFlashやHTML5もありますし。個人的にはAppletにはちょっとした期待感を持っていたので、そうなると少し残念です。