Windows」カテゴリーアーカイブ

Console Twitter を公開しました。

image

ておくれてない、まだ、まだだっ!!
ということでみむらです。

先日の OAuth の記事 を書いた後、やっぱりクライアントを作りましょうということで。

ttytter っぽいものを意識しましたが、自分が使いやすいように作ってみました。

 

Microsoft .NET Framework 3.5 がある環境であれば実行可能です。
(Windows 7 では標準搭載)

 

http://mimumimu.net/software/#ConsoleTwitter
上記URL よりダウンロード可能です。

 

ただつぶやくだけではなく、下記のコマンドを使うことで様々な操作も可能です。

/rep リプライ一覧を表示
/rep (番号) (ツイート) リプライを送ります。

ex) /rep 01 ておくれてない!

/fav お気に入りに登録したツイートを表示します。
/fav (番号) お気に入りに登録します。
/unfav (番号) お気に入りを解除します。
/rt (番号) リツイートします。
/find (テキスト) 指定したテキストで Twitter 上のツイートを検索して表示します。

 

コンソールで表示されて、全部がキーで行うということで、
シンプルでかつ、操作も覚えやすいのでは無いでしょうか。

 

ということで、よろしくお願いします-。


追記:ソースコード公開しました。

https://github.com/mimura1133/Console-Twitter

NuGet で簡単にパッケージを導入する。

案外知られていない気がする。

Ruby や Python では、パッケージを簡単にインストールして利用する方法があって、

Ruby では gem
Python では easy_install

がこれに該当しますかね。

 

.NET にも NuGet という同様の仕掛けが存在し、
利用することが出来ます。

.NET開発の新標準「NuGet」入門(前編) - @IT
詳細な解説についてはここのあたりを見ておくと良いかと思います。

 

注:対象は Visual Studio 2010 以降の Visual Studio に限ります。


分からない人向け:

たとえば、今から Twitter の機能を利用したソフトウェアを作ろうとあなたが思ったとき、
以下の選択肢から一つ選ぶことになると思います。

1.自分で OAuth の認証書いて、アクセスするライブラリを作る。
2.インターネットから既存のライブラリをとってくる。

現代においては、教育目的を除いて 1 を選ぶことは殆ど無いかと思います。
(気に入る形に出来ない場合や、そもそも無い場合は作ることにはなりますが。)

 

となると、現実的な回答としては、2となりますが、
インターネットから探してきて、インストールして・・っていうのは面倒で、
カタカタっと名前を打ったりして、簡単にインストール出来た方がいいわけです。

インストーラが面倒くさいということも考えられるでしょうし、
そもそも、インストーラが無くて、自分で組み込まなければならない場合は面倒になりますし、
友人に教えながら作業するという場合や、雑誌にやり方を載せる場合などにおいては、
友人や読者にファイルのありかを教えなければなりませんし、
複数台に組み込む時なども・・・・ とまぁ、非常にナンセンスな訳です。

 

そんなわけで、 Python の easy_install や Ruby の gem
そして、この記事で触れる .NET の NuGet などのパッケージ管理ソフトウェアを用いることにより、
単純明快でかつ高速に、ライブラリを用意して使い始めることが出来ます。

また、ライブラリに更新があった場合、手動で入れた場合はまたインストールをしなければなりませんが、
大抵こういうパッケージ管理ソフトでは、アップデートも簡単に行える仕様が備わっています。

 

という感じで、長文になりましたが、
導入~更新 まで、ライブラリの利用に関するあらゆることを簡単に使えるようにした物。
それが、パッケージ管理ソフトウェア ということになります。


というわけで本題。

 

1.導入

http://visualstudiogallery.msdn.microsoft.com/27077b70-9dad-4c64-adcf-c7cf6bc9970c
上記URL より、 Download をクリックしてダウンロード、インストーラを起動します。

 

image

上のような画面が出ますので、インストールをクリックし、導入を完了させます。

 

2.開発を始める。

image

いつものように、ソリューションを開きます。

 

3.パッケージを導入する。

image

メニューバーの 「ツール」 → 「Library Package Manager」 → 「Package Manager Console」 をクリックします。

image

コンソールが立ち上がった。

 

今回は例として、

http://www.twitterizer.net/
上記URL にて公開している、「Twitterizer」を導入してみます。

 

image

Install-Package twitterizer

と打って、Enter で実行。

 

image

自動的に依存関係が解決された状態で、参照にライブラリが加わり、使えるようになる。

 

3.コード書いて動かす。

 

image

 

とりあえずこんな感じ。

 


というわけで、適当に超基本的なコマンドだけ、対応表にするとこんな感じなのかなぁ。

コマンド

NuGet

gem

easy_install

hoge をインストール Install-Package hoge gem install hoge easy_install hoge
hoge を更新 Update-Package hoge gem update hoge easy_install –U hoge
全部更新 Update-Package gem update easy_install –U
hoge を削除 Uninstall-Package hoge gem uninstall hoge  

NuGet のコマンドについては、

http://www.atmarkit.co.jp/fdotnet/chushin/nuget_01/nuget_01_02.html
上記URL に大体まとまっているかと思います。

 

そんな感じで。であであ。

IronRuby で gem

案外知られていなさそうなのでメモメモ。

image

コマンドプロンプトを管理者権限で起動。

 

(IronRuby の bin ディレクトリにパスを通していない方は、

32bit : [ cd %ProgramFiles%\IronRuby*\bin ]
64bit : [ cd %ProgramFiles(x86)%\IronRuby*\bin ]

上記のコマンドでインストールされたディレクトリ以下の bin ディレクトリにあらかじめ移動しておきます。

 

igem コマンド

image

ということで、 gem と同等の機能については、
igem コマンド で実行可能です。

また、インストールされたパッケージについては、
バッチファイルが作成され、直接呼び出せるようになります。

 

ではでは。

Cコード中にマシン語を埋め込んで実行する。

なんだろう、何百番煎じな気がする。もうお茶も出なくなってお湯ですよ、お湯。

フォロワーの @pasberth さんが、「JIT ってどういう仕掛けになってるの!」といっていたので、
メモリ上にバイトコードを置いて実行する方法ということでちょろっと書いたものです。

とりあえず、ピタゴラスの定理をアセンブラで書いて、
C でぺけぺけ。

ひとまず、私の作業環境である Windows での動作確認。

440411299

そいでもって、x86 なら、どのプラットフォームでもバイナリ部分は変えなくても走るよ! ってのを示すために、
Mac を立ち上げて実行。

440460787

 


ソースコードは下記のような感じです。@pasberth さん用に書いたので、Mac 向けソースになってます
Windows で動かすには、先頭の vm_protect を VirtualProtect の形式に書き換えれば動きます。

 

#include <mach/mach.h>
#include <stdio.h>

/************************************************
 とりあえず、中のデータは16進で記録してあって、

リトルエンディアンですから、
 0x01020304 は、メモリ上に 0x04,0x03,0x02,0x01 の順で格納されます。
要は逆順です。

また、命令のオーダーについては、必ずしも何バイトということはありませんが、
最長命令は 32bit アーキテクチャですんで 4 バイト ( 32 bit / 8 = 4 byte. )

見やすくするために、2バイトや1バイト命令に関しては、
0x90 (NOP) [NOP = なにもしない] を挿入して、アライメント(区切り)を合わせてあります。

まー、適当に見てもらえれば。

************************************************/

int main(){
	unsigned long d;
	int a = 0,b = 0,c = 0;
	unsigned long code[32] = {0};
	
	printf("vm_protect : %s\n\n",vm_protect(
		mach_task_self(),
		(vm_address_t)code,32 * sizeof(long),
		FALSE,
			VM_PROT_READ | 
			VM_PROT_WRITE | 
			VM_PROT_EXECUTE
		) == KERN_SUCCESS ? "[OK]" : "[FALSE]");

	printf("INPUT [a,b,c] : ");
	scanf("%d,%d,%d",&a,&b,&c);

	code[0]  = 0x0424448B;	// MOV EAX,DWORD PTR SS:[ESP+4]
	code[1]  = 0x08244C8B;	// MOV ECX,DWORD PTR SS:[ESP+8]
	code[2]  = 0x9090C13B;	// CMP EAX,ECX
	code[3]  = 0x9090047E;	// JLE SHORT ; EIP+4
	code[4]  = 0x9090C88B;	// MOV ECX,EAX
	code[5]  = 0x0C24548B;	// MOV EDX,DWORD PTR SS:[ESP+C]
	code[6]  = 0x9090CA3B;	// CMP ECX,EDX
	code[7]  = 0x9090147E;	// JLE SHORT ; EIP+C
	code[8]  = 0x90909056;	// PUSH ESI
	code[9]  = 0x9090F28B;	// MOV ESI,EDX
	code[10] = 0x9090D18B;	// MOV EDX,ECX
	code[11] = 0x9090CE8B;	// MOV ECX,ESI
	code[12] = 0x9090905E;	// POP ESI
	code[13] = 0x90C0AF0F;	// IMUL EAX,EAX
	code[14] = 0x90C9AF0F;	// IMUL ECX,ECX
	code[15] = 0x90D2AF0F;	// IMUL EDX,EDX
	code[16] = 0x9090C103;	// ADD EAX,ECX
	code[17] = 0x9090C22B;	// SUB EAX,EDX
	code[18] = 0x9090D8F7;	// NEG EAX
	code[19] = 0x9090C01B;	// SBB EAX,EAX
	code[20] = 0x90909040;	// INC EAX
	code[21] = 0x909090C3;	// RETN
	
	printf("\nRETURN : %s\n",
		((int(*)(int,int,int))code)(a,b,c) == 0 ? "[FALSE]" : "[OK]");
	
	return 0;
}

 

中のバイトコード部分は、ソースコード中のコメントを見てもらえれば。

本来、こういうページ領域上にバイトコードを置いて、それを呼び出そうとしても、
実行できないように設定されています。

(実行できるようになっていると、プロセスに脆弱性があったとき、悪意のあるコードを攻撃者から送信されて、実行されてしまう危険性が格段に上がる)

ですが、さすがに完全に実行できないと、Java VM をはじめとしたソフトウェアが稼働できなくなってしまうため、
OSから実行可能にフラグを書き換えるAPIが提供されています。

OS

関数

Windows VirtualProtect
MSDN : http://msdn.microsoft.com/ja-jp/library/cc430214.aspx
Mac OS X vm_protect
The GNU Mach Reference Manual :
http://www.gnu.org/software/hurd/gnumach-doc/Memory-Attributes.html
Darwin :
http://web.mit.edu/darwin/src/modules/xnu/osfmk/man/vm_protect.html
Linux mprotect
Man page of MPROTECT :
http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/mprotect.2.html

実行可能なバイトコードは、x86 プロセッサ共通なので、同じプロセッサならどれでも動きますが、
各オペレーティングシステムに合わせて、上記に挙げた関数を利用して、実行可能に設定する必要があります。

 

実際の JIT コンパイラなどでは、各プラットフォームごとのライブラリや、
APIの差異の吸収が必要になって、結構面倒なことになりますが、

今回の例はきわめて単純な例を使って、 x86 プロセッサ上なら同じコードが動くということを示すのと同時に、
Java などでは、こういう感じでたぶんコードを実行しているということで。

(mono はこれ使ってる感濃厚。 ソースコードを眺めていた感じでは。

IronRuby から .net を触る。

こっちはもっと簡単。
Python でのやり方は : IronPython で .net を触る を参照してください。

require "System"
require "System.Windows.Forms"

form = System::Windows::Forms::Form.new
form.Show()

IronPython の時のように、 clr を読み込んで参照を追加して・・とやらずに、

require で要求したときに参照の追加なども自動的にやってくれるので結構楽ちんです。

加えて、IronPython との決定的な違いは、

private や protected のクラスもちゃんと読み込んでくれること。

ということで、内部的に private な class を持っていて、それを使うっていう構造であっても、

IronPython ではダメでも、IronRuby では実行してくれるということが結構あります。

 

そのため結構いろいろなことが、IronRuby では手軽に実行でき、

314929_246558552063419_100001278294483_763093_1178767918_n

こんなように、IronRuby から IronPython を読み出し、

Python コードを Ruby 上で実行するということも可能です。

 

これも協調動作という面では一つのおもしろい所なのではないかな、と思います。