Loading [MathJax]/extensions/tex2jax.js

2013-05-28

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

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

//Listにクラスを代入
foreach (var item in blobs) {
markList.Add(new Marker(item.X,item.Y));
}
//ソート実行(Yをソート対象とする場合)
markList.Sort(sortByY);
//出力例
foreach (Marker mk in markList) {
Console.WriteLine(mk.X + "," + mk.Y);
}
//Xでソート
private int sortByX(Marker a, Marker b) {
return a.X - b.X;
}
//Yでソート
private int sortByY(Marker a, Marker b) {
return a.Y - b.Y;
}
view raw _sampleSort.cs hosted with ❤ by GitHub


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

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

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

class Mark{
private int x;
private int y;
public int X {
set {
this.x = value;
}
get {
return this.x;
}
}
public int Y {
set {
this.y = value;
}
get {
return this.y;
}
}
}


2013-05-27

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

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

// Bitmap to IplImage
IplImage iplOriginal = (OpenCvSharp.IplImage)BitmapConverter.ToIplImage(beforeBitmap);
// IplImage to Bitmap
Bitmap afterBitmap = BitmapConverter.ToBitmap(iplOriginal);


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-05-18

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

Gistのコード埋め込みURLを利用した場合、BLOGのスタイルによってはフォントサイズが若干大きかったりして違和感を感じることがあります。その際は、CSSで設定できます。
/* Better styles for embedding GitHub Gists */
.gist{font-size:13px;line-height:18px;margin-bottom:20px;width:100%}
.gist pre{font-family:Menlo,Monaco,'Bitstream Vera Sans Mono','Courier New',monospace !important}
.gist-meta{font-family:Helvetica,Arial,sans-serif;font-size:13px !important}
.gist-meta a{color:#26a !important;text-decoration:none}
.gist-meta a:hover{color:#0e4071 !important}
こんな感じです。これで本BLOGでもいい感じに埋め込めます。

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

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

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


2013-05-17

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

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

まずQuery関数はArrayで結果を返してくれるんですが、これをシート内で呼び出した場合、結果が複数あるとシートに複数行にわけて出力されます。これが大きなお世話な機能なんですが、この結果を1つのセルにおさめることができたらよくて、ここで独自の関数を組み合わせれば解決します。例えば、下記のようにArrayをCSVに変換する関数を用意します。
function ArrayToCSV(array){
var csv="";
for(var i=0;i<array.length;i++){
csv+=array[i]+",";
}
csv=csv.slice(0,-1);
return csv;
}
view raw ArrayToCSV.js hosted with ❤ by GitHub
このQuery関数の結果をこの関数に渡すようにシートの式の記述をすればOKなわけです。例えば下記のようにします。
var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
var documentSheet = spreadSheet.getSheetByName("Words");
var range =documentSheet.getRange("F8");
var query = '=ArrayToCSV(query(E12:F27,"select F where E > ' +"'cc'"+'"))';
range.setFormula(query);
Browser.msgBox(range.getValue());
range.setFormula("");
上記では、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の場合は
function doGet(e)
var json; //jsonのデータを格納しておく
var output = ContentService.createTextOutput();
output.setMimeType(ContentService.MimeType.JSON);
output.setContent(jsonp);
return output;
というように、出力のMimeTypeを設定しておく必要があります。XMLの場合はMimeType.XMLです。このタイプには、
  • ATOM
  • JSON
  • CSV
  • ICAL
  • RSS
  • VCARD
  • XML
といったフォーマットを指定することができるので、いろいろなタイプのウェブサービスが実装できると思います。


2013-05-14

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

Google はGSONと呼ばれるJSONのJavaライブラリを公開しています。これは、
  • JavaのデータクラスをJSON形式にして出力する
  • JSON形式のデータをJavaのデータクラスに格納する
という使い方が中心ですが、JSONのデータ構造とJavaのデータ構造が異なる時は、直接的にJSON形式でデータを書き出すことも可能です。下記は、サーブレットでの出力の例です。
JsonWriter writer;
try {
writer = new JsonWriter(response.getWriter());
writer.beginObject();
writer.name("user");
writer.beginArray();
for (App app: applist) {
writer.beginObject();
writer.name("name").value(app.user);
writer.name("id").value(app.userid);
writer.endObject();
}
writer.endArray();
writer.endObject();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
わざわざJavaのデータクラスに一旦書き込むよりも上記のようにWriterに対して直接的に書きだすほうが手間がかからないでしょう。なお、書き方については、beginObjectとendObjectで囲まれた範囲が1つのオブジェクト(データ)に相当し、配列の箇所はbeginArrayとendArrayで囲まれた部分になります。

2013-05-11

GASとGWTの面白い関係

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

  • GAS(JavaScript)→GWT変換→ JavaScript

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

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

2013-05-08

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-05-02

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なども同じディレクトリにないといけないので注意してください。