2011-10-28

[C#]スレッドプログラミング

C#でマルチスレッドプログラミングをする方法です。記述自体は特になにも難しいことはありません。 なお記述は簡単ですが、マルチスレッドのプログラミング自体は難しいです。安易に考えていると予期しない動作をすることがあるので注意してください。 また、スレッドにデータを渡す方法ですが別スレッドで呼び出すメソッドに引数などを定義することはできません。一番簡単な方法は同一のクラス内でマルチスレッドのメソッドを定義しているのであれば、クラス変数を利用してデータの授受をすることは可能です。 本格的にプロセス間通信をする場合はちょっとひと工夫必要ですので、それは後日取り上げたいと思います。

2011-10-27

ActiveDirectoryでユーザアカウントの設定

毎年この時期になると研究室のゼミ生新配属が行われ、ゼミの準備としてユーザアカウントの作成と登録を行います。おちラボでは昨年度よりWindows2008サーバを利用したアクティブディレクトリのドメインを構築していますが、そこにユーザを登録するための処理をメモ書きしておきます。いちおう、要求仕様は以下のとおりです。
  • サーバはWindows2008サーバ。クライアントはWindows
  • アクティブディレクトリによりユーザアカウントを管理
  • サーバ側にあるフォルダをユーザのホームディレクトリに設定
まず最初に、ユーザのホームディレクトリを作っておきます。
mkdir user1
続いて、ユーザを作成します。以下では、ユーザ名、パスワード、ユーザのホームディレクトリをサーバのある場所に指定しています。実はこの記事での一番のポイントはここで、サーバ側にある共有フォルダをホームディレクトリを設定する際、アクティブディレクトリのGUI管理画面ではできなかったというのが元々の問題としてありました。下記のようにコマンド内で設定するとうまくいくというのがミソです。
net user user1 password /homedir:\\server\user1
最後に、ユーザのホームディレクトリを共有します。
net share user1=d:\home\user1 /grant:user1,FULL

以上はコマンドとして書いていますが、実際にはbatファイルで一括します。もうちょっと細かい設定もコマンドでできますが、とりあえずはこの変で十分というところです。


2011-10-26

[C#]BadImageFormatExceptionのエラーに対応する

C#のプログラムで各種ライブラリを利用する際、
BadImageFormatException
というエラーが出てくる時がある。これは、64bit環境に起因する問題で、プロジェクトのターゲットCPUを32bitつまりx86に設定することで解決する。64bitネイティブにしたい気持ちはあるかもしれないが、.NET系のライブラリは64bitに完全対応しているわけではなさそうなのでその変は諦めよう。なお、デフォルトのターゲットCPUはanyになっているはずです。

2011-10-25

[C#] JSONを利用する

C#には標準でJSONデータを読み書きするクラスが用意されています。このクラスを利用することでJSONデータをC#のクラスにマッピングすることができます。.NET4.0以降での対応のような気がしますので、プロジェクトの対象プラットフォームを確認しておきましょう(そうしないとライブラリを見つけることができませんので)。あとは以下のとおりです。

前準備
  • プロジェクトのプロパティにて対象プラットフォームが「.NET4.0Framework」となっているのを確認 
  • 参照設定(.NET)にて、System.Runtime.Serialization を追加
データクラスの作成
まず、jsonのデータを格納するためのデータクラスが必要です。今回は先日記事にしたgoo.glの短縮URLサービスが返すJSONを受け取るようにします。下記のようにデータコンストラクトを記述する所がポイントです。漏れのないように書いてください。
[DataContract]
    public class UrlInfo
    {
        [DataMember(Name = "kind")]
        public string Kind { get; set; }
        [DataMember(Name = "id")]
        public string ShortUrl { get; set; }
        [DataMember(Name = "longUrl")]
        public string LongUrl { get; set; }
    }
C#コード
関連するライブラリをインポート(using)するのは忘れないようにしてください。var宣言のところは実際のクラス宣言に置き換えてもいいかもしれません(未確認)。
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;

var serializer = new DataContractJsonSerializer(typeof(UrlInfo));
var jsonBytes = Encoding.Unicode.GetBytes(surl);
var ms = new MemoryStream(jsonBytes);
var gURL = (UrlInfo)serializer.ReadObject(ms);
以上で、gURLにはjsonのデータが対応する各プロパティに入っていますので、gURL.ShortUrl等で呼び出すことができます。

[C#] Googleの短縮URLサービス(goo.gl)のAPIを利用する

TwitterにURLを投稿する時には、文字数の制限から短縮URLサービスを利用するのが常識となっています。Twitterクライアントを開発する時には当然そのAPIとの連携を実装しておく必要がありますが、今回はGoogleの短縮URLサービスである「goo.gl」を利用します。

やり方はいたって簡単です。特に登録処理をする必要もなく、以下のコードで呼び出すことができます。 なお下記のコードでは、変数url(stringクラス)に短縮したいURLが格納されているとします。
public string getShorURL(string url){ 
 string serviceURL = "https://www.googleapis.com/urlshortener/v1/url";
 string jsonRequest = "{\"longUrl\": \"" + url + "\"}";
 WebClient client = new WebClient { Encoding = Encoding.UTF8 };
 client.Headers["Content-Type"] = "application/json";
 return client.UploadString(serviceURL, jsonRequest);
}
結果は、JSON形式で以下のように返ってきます。

{"kind": "urlshortener#url","id": "http://goo.gl/stTXr","longUrl": "http://www.ochi-lab.org/"}

2011-10-22

マイニングツールの統合と活用&情報編纂研究会に参加してきました

先日、東京大学で開催された情報編纂研究会に参加してきました。個人的にこの研究会に参加するのは2回目です。別に「情報編纂」をテーマにしているわけではありませんが、関連技術として関心がありまた研究アプローチも含めて勉強したいというのもあって参加しています。

TETDMプロジェクト
今回、特に気になったのは、TETDMというプロジェクト。人工知能学会の近未来チェレンジで選ばれたプロジェクトのようですが、簡単にいえばテキストマイニングのツールやプラットフォームを提供するというものです。まず、実際、このプラットフォームを利用すれば開発がラクになると発表が何件かあり、このプラットフォームに強い関心を持ちました。
また、このプロジェクト自体のアプローチもとても魅力に感じました。現在情報工学関係の研究では扱うデータ(扱うことができるデータ)が大幅に増えており、またそれを扱うシステム開発も容易になりました。しかし、逆にそれは似たようなシステムの乱立につながってきますし、似たようなシステムが各地で繰り返し作られていくという、学術的には無駄なことが起きていると思います。このような問題を学会がイニシアティブをとって解消しようとするのはとても面白い試みだと思います。

データマイニング系のJavaライブラリも充実してきた?
マイニングの研究を一旦止めていたのでちょっと浦島状態なんですが、rjavaとかwekaとかマイニング系ツールのライブラリがかなり使えるようですね。rjavaは数年前に使ったときはいまいちだった気がしますが、バージョンも上がってだいぶ使えるようになってきたようです。再調査が必要ですね。


オレオレフレームワークを排除しよう
今回の発表の中で、TETDMに対応したシステム開発の問題点として、このTETDMを使う敷居の高さについて話題が上がってました。マニュアル環境が不十分というのもあるようですが、この点について学生のモチベーションが上がらない、、特にデキる学生からは「自分でゼロから作ったほうが早い」という意見が出てくる、、、という興味深い話がありました。
このような問題は、TETDMだけの問題ではなく、各種フレームワークを導入する際に出てくる問題ですが、このことについては私見を持っています。私のラボでは、既存のフレームワークを積極的に導入していますが、それは
「フレームワークの理解のコスト<フレームワーク導入による利点」
だからです。最初の学習には時間がかかりますが、理解できたらそれ以降の開発効率は飛躍的に向上します。そして、もっと大切なことは、ある統一したフレームワークに載せることで、技術・リソースの継承が容易になります。「自分で作ったほうが早い」って作られたのはいわゆるオレオレフレームワーク。その場限りのものです。そのフレームワークは本人しかわからないわけで、その本人がずっと研究室にい続けるのであればいいですがそうでないことが多い。卒業後、技術継承されず理解不能なシステムが残っているというケースが多々あるはずです。
研究とはその場限りで終わるようなものではなく、その後も形を変えながら継続されていきます。ソースコードもそうです。学生の卒論・修論は学生のためだけのものではなく、研究室のものでもあるということ。卒業後も自分の研究が生き続けていく、、、それをアシストするのがフレームワークなわけで、TETDMもその1つになると思います。
だから、「自分で作ったほうが早い」なんていう学生がいたら、一喝しますけどね(笑)。もちろん、学生のモチベーションというのは大切な要因ですから無視するわけにはいきませんが、上述の利点を理解してもらえれば十分だと思いますけどね。

「お前はその場限りで捨てられるコードを書きたいのか?研究室に後世に伝えられるコードを残したいと思わないのか?」

P.S
こんなこと書いたら、おちラボではさぞかし技術継承がスムーズにいっているんでしょうな?と思われるかもしれませんが、残念ながらそんなことはないです。ただ、その効果が徐々に出つつある気配がしています。



2011-10-19

[C#]System.Web アセンブリ参照が見つからない場合の対処法

ネットワーク関係のライブラリを利用する場合、時々、
System.Webアセンブリ参照がない
みたいなエラーが発生する時がある。これは、System.Webを参照に追加すればいいわけなのだが、時々、[参照の追加]ダイアログの一覧に「System.Web」が出てこないという事象が発生する。これはVisual Studio2010以降によくおきる問題のようで、
プロジェクトのプロパティで設定するプロジェクト既定の「対象のフレームワーク」が「.NET Framework 4 Client Profile」になっている
ということが原因のようだ。 「.NET Framework 4 Client Profile」というのはデスクトップクライアントの最低限のフレームワークの単位らしく、これを「.NET Framework 4」に変更することで参照することができるようになるようだ。

2011-10-18

イベント紹介:2011年 第22回教育システム若手の会(shinshin2011)

以下、イベント紹介です。


###


このたび信州松本におきまして,第22回「教育システム若手の会」を開催致します.

今回は学生・教員の意見の相違を共有し,若手ならではの発想や悩みについて議論したいと企画しております.
また,会場には美ヶ原温泉の旅館を貸し切っており,24時間天然温泉を満喫していただくことができます.
この機会に天然温泉で心身を癒しつつ,他の若手研究者の皆様と交流を深めてみるのはいかがでしょうか.

ご参加のお申し込みは第22回「教育システム若手の会」専用ウェブサイトにて受け付けております.

  申込受付期限:2011年11月4日(金)まで

施設の収容人数に限りがございますので,参加される皆様はお早めにお申し込みください.なお,詳細は下記の
フライヤーをご覧ください.

お忙しいことと存じますが,ぜひ多くの学生・若手教員の皆様のご参加をお待ちしております.また,広く周知
にご協力いただきますようよろしくお願い申し上げます.


=========================
2011年 第22回教育システム若手の会(shinshin2011)
=========================

テーマ:『教育システム研究を研究する!』


内容:
 今年で22回目の開催となる「教育システム若手の会」では,教育実践や教育システム研究を進める過程で生じ
る若手研究者や学生が直面している問題を明らかにし,自身で解決すべき点とその解決方法,教育システム研究
という学問分野の発展に向けて本当に必要とする支援のあり方を考察することを予定しております.
 メインセッションでは,若手の会に参加する年齢層を考慮し,学生を中心とした「ヤング」と,教員を中心と
した「シニア」の意見の相違を共有できるように議論することを考えております.また,初日の午後には若手研
究者による研究発表・討論する場を設け,若手ならではの発想や悩みについてじっくり議論できる研究討論セッ
ションも企画する予定です.

日時:2011年11月25日(金)~27日(日)

教育システム若手の会ウェブページ:
 http://www.seclab.shinshu-u.ac.jp/shinshin2011/

場所:信州松本美ヶ原温泉 富田屋別館
   (長野県松本市里山辺489-3)
   http://tomitayabekkan-hp.web.infoseek.co.jp/

対象者:教育システム関連の若手研究者(自称も含む)
    及び学生

スケジュール概要(予定):

11月25日(金)
 15:00 - 17:30  研究討論セッション
         (研究発表&議論)
 19:30 -     夕食
 21:00 -     オープニングセッション
         (開式のあいさつ&自己紹介)

11月26日(土)
  9:00 - 10:30 ライトニングトークセッション
         (参加者の研究紹介)
 10:45 - 12:30 メインセッション(1)
   『ヤング・シニアグループに分割して議論』
    ・ヤング:自身の研究の動機や進め方,その過
        程で生じる問題点や解決手段などを議
        論・整理
    ・シニア:教育システム研究の進め方や学生指
        導の仕方における問題点を議論・整理
 12:30 - 13:30 昼食
 13:30 - 16:15 メインセッション(2)
   『ヤング・シニアグループを合同して議論』
    ・教育システム研究を進める上でヤング/シニ
     アが抱える問題点の共有
    ・教育システム研究の発展に向けた研究支援シ
     ステム・環境を議論
 16:30 - 18:00 メインセッション(3)
   『各グループの成果発表&議論』
 19:30 -    夕食
 21:00 -    ナイトセッション・
        エンドレスセッション

11月27日(日)
 9:30 - 10:00 クロージングセッション


後援:人工知能学会先進的学習科学と工学研究会(予定)
   電子情報通信学会 教育工学研究会(予定)
   日本教育工学会


幹事:名古屋工業大学 立岩 佑一郎
   名古屋大学   林 佑樹
   信州大学    國宗 永佳
   信州大学    森下 孟

問い合わせ先:
  shinshin2011@seclab.shinshu-u.ac.jp

2011-10-13

書籍紹介:ひと目でわかるVisualC#2010アプリケーション開発

今年度、3年生のゼミで利用する書籍を紹介します。
ひと目でわかるMicrosoft Visual C# 2010アプリケーション開発入門 (MSDNプログラミングシリーズ) [単行本]
例年、「ひと目でわかるシリーズ」を利用していて、昨年からC#を言語としています。この本の特徴は
  • 初歩的なC言語程度のプログラムを組んだことがある人を対象
  • C#というプログラム言語の説明はほとんどない 
  • システム開発・設計の流れや考え方がわかる
  • オブジェクト指向にも言及
というように「システム開発」を意識させるにはよいいい本だと思ってます。昨年度は2008版でちょっとわかりにくい感じでしたが、2010版はそのあたりが修正されているような気がします。WPF周りもおさえていてGoodです。ゼミ配属された3年生には全員これを買ってもらいます。


GWT-RPCでsessionを利用する

GWTはAjaxアプリなので、基本的に画面遷移は存在せず一般的なウェブアプリケーションで求められるサーバ側でのsession管理というものを意識しなくてよい。 しかし、別のアプリケーション(モジュール)への移動といった処理が必要となった場合、サーバ側でのsessionを利用したくなるケースが出てくる。以下はGWT-RPCにおけるsession利用について。

GWT-RPCにおけるサーバ側の処理クラス(~implクラス)の実体はdoGet,doPostといった記述がないだけで、実はServletそのもの。Servletで利用されるHttpServletRequestとかHTTPServletResponseなどは表面上見えないだけで以下のようにして呼び出すことができる。あとは通常のServletと同様の使い方ができると考えてよい。
HttpServletRequest request = this.getThreadLocalRequest();
HTTPSession session = request.getSession();


2011-10-07

Javaにてパスワード情報をMD5で暗号化する

パスワードによりユーザ管理をするシステムを開発する場合、ユーザ名とパスワードはデータベースで管理しますが、パスワードをそのままデータベースに格納するのは愚の骨頂です。通常は
  • 不可逆な暗号でパスワードを暗号化し、データベースに保存
  • 認証をする際は入力されたパスワードを同じ方式で暗号化し、その結果を元にデータベース参照する
という方法をとります。そこで、Javaでパスワードを暗号化する方法を紹介します。今回はできるだけJavaの標準のライブラリを利用する方法を採用し、MD5で暗号化する方法を紹介します。

下記のプログラムは2つのメソッドがありますが、上記が今回の本題です。MessageDigiestクラスを利用して、MD5形式で暗号化しています。ここで問題なのは、digestメソッドで生成されるのがbyte型配列であるということ。2つの目のメソッドはbyte型を16進表記のStringに変えるメソッドです。これを利用することで扱いやすくなります。
なお、掲載しているサンプルコードは下記のサイトのコードを引用させてもらいました。
参考サイト: [Java]MD5、DESで暗号化する(Creative Gear とあるWebエンジニアの活動記録)


[C#] Twitterizerでユーザプロファイルデータを取ってくる

Twitterrizerでユーザのプロファイル情報を取ってくる方法です。特に何か難しいことはなく、TwitterUserクラスを利用して、任意のユーザの名前を指定して情報を得ることができます。
 TwitterResponse showUserResponse = TwitterUser.Show("oyouji");
 TwitterUser user = showUserResponse.ResponseObject;
 userPicBox.ImageLocation = user.ProfileImageLocation;
 lbUserName.Text = user.ScreenName;
これを実行すると下記のようになります。

あっけないですね。

2011-10-04

Twitter4Jを利用する(2)

Twitter4Jで、OAuth認証を行なってrequestTokenを取ってきた後にどうすればいいかという話です。
おさらいですが、Twitterでは一度OAuth認証を行えばあとは、「AccessToken 」と「TokenSecret」を利用することでTwitterにアクセスできます。その保存と再利用についてです。

保存方法
下記は、OAuth認証が終わりコールバックされたところでの処理です。
 AccessToken accToken = twitter.getOAuthAccessToken(requestToken, oauth_verifier);
 String aToken = accToken.getToken(); 
 String tokenSecret = accToken.getTokenSecret();
この方法で、AccessTokenとTokenSecretがStringの形で個別に扱えますのでこれをどこかに保存すればよいでしょう。AccessTokenクラスをシリアライズして保存というのもありかもしれません。

再利用
再利用する際は、下記のようになります。AccessTokenクラスを作成してそれを元にTwitterクラスのインスタンスを作成することになります。
 String aToken="AccessTokenを格納";
 String tokenSecret="TokenSecretを格納"; 
 AccessToken newToken = new AccessToken(aToken,tokenSecret);
  TwitterFactory factory = new TwitterFactory();
  Twitter twitter = factory.getInstance(newToken);
  twitter.updateStatus("またまたTOkenテスト");


2011-10-03

久しぶりにTexのインストール(Windows編)

久しぶりにTexのインストール。。。 最近すっかりWordのお世話になってるし、大抵のフォーマットにWordがあったりしているのだが、世の中にはTexしか用意してませんというところがあったりする。そんなわけで、Windowsへのインストールの覚書です。 

Texのダウンロード 昔はいろんなところから関連ファイルをダウンロードしていたりしたが、最近はインストーラーというのが存在する(もちろん有志の方が作ってくださっているのだが)。で、今のところ一番お手軽なのは、
というやつのようです。これを何も考えずに実行していけば、関連するすべてのファイルをダウンロードしてくれます。

なお、最初にウィザードを進めていったときに、エラーがでてログを見たときに
W32TeXの情報取得開始
情報ファイルの発見に失敗.
というメッセージが出ているのであれば、それはまさにそのとおりで、Win32Texのダウンロードサイトがデフォルトのままではないということなので、その部分を別のURLに選択しないそう。あ、あとはDVIOUTとかGSのチェックも忘れずに。