ハッキング8946の機能説明

遂に本日ハッキングチャレンジサイト8946をリニューアルオープン致しました。

http://www.hackerschool.jp/hack/

これまで、会員登録せずにプレー出来ないのか?などの御声が多かったのですが、その声にこたえるべく会員登録無しで学習頂けるように致しました!
また、これも要望が多かった事なのですが、ハッキングを学ぶモノの集まりとしてコミュニティ的なモノを用意してほしいと言う声も多かったので、ご要望にお応えしております。
迫りくる未知の勢力に立ち向かう為に、愛する人を守る為、年収アップして豊かな人生を歩む為にも、技術力向上のお手伝いが出来れば幸いにございます!

楽しいHackライフを!

尚、新着問題の提案も随時受け付けております。提案して頂いた問題は選考させて頂き、見事採用されれば企画料として1万円をお支払いたします。
皆様の協力のもと日本一のハッキング学習サイトを目指して参りますのでドシドシご応募お待ちしております。

応募はinfo@whitehackerz.jpの問題採用係までお願い致します。

リニューアルTOPページ8946003

新掲示板(コミュニティスペース)8946004

問題採用についてno18946005

問題採用についてno28946006

各種SNSへ対応したリンクボタン(どしどし拡散して下さい!)8946007

 

武雄市遂に最先端事業ホワイトハッカー養成に参入か!?

賛否両論あるのもの様々なイノベーションにより話題満点の佐賀県武雄市。

我々はその市長である、 樋渡啓祐市長との直接的なやり取りの中で市長の並々ならぬ決意を目の当たりにした。国の方針でもある様に最先端の産業を徹底的に伸ばさねばこの国の未来はない!また、先日から大手メディアで取り上げられている様に、善玉ハッカーの育成や公的機関とホワイトハッカーとの連携は急務になっている。

にも、関わらずこの様に騒がれだしてから1年強。一向に動き出す気配もなく、また我々の再三の助成金申請もこの間無残な結果となっていたのである。

その間、世間では遠隔操作ウイルスによる誤認逮捕事件など、IT技術を悪用する事に関して国家・行政は全く付いていけてないのが実情である。

先日の当グログでも紹介したが、

2012年7月に米ラスベガスで開催されたハッカーの世界最大の祭典デフコンでは、米国家安全保障局(NSA)長官でサイバーコマンド司令官のキース・アレキサンダー大将はこの様に述べている。
「我々はインターネットを作った当事者の1人だ。そして今、我々はそれを守る立場にあり、あなた方が力となってくれると思う君たちの助けを求めに来た。そんなに給料は出せないが楽しいぞ。一緒に働けばいろんな問題が解決できる。サイバー空間には脆弱な部分がとてつもなくある。安全にするツールを作り、よくわかっていない私のような年長者を助け米国を訓練する手助けをしてほしい。」

と述べ、同じくNASAはデフコンのために人員募集用の特別サイトを用意。
そこには政府が募集する際には通常使わないような文言があった。

「もしあなたが、過去に多少の『無分別な行為』をしたことがあっても、心配しないで」

と、犯罪者でも構いません!ともとれる発言まで繰り広げているのだ。確かに極端な例であるかも知れないが、正義のハッカーやセキュリティのスペシャリスト育成はどんな理由があろうとも急がねばならないのである。

確かに国家・行政の事業であればきちんとした体制が必要になるのは承知しているが、知っての様に今日・明日でいきなり優秀なハッキング技術を身につけれるものではない。半年・一年程度では済まない長い長い時間がかかるのであり、長期的な受講者サポート体制がなければホワイトハッカーの育成など夢のまた夢であろう。

しかし、一方受講者側の意見ではホワイトハッカーになりたい!やITスペシャリストになりたいと言う声は日に日に増しており資金に乏しい彼らは何から学んだらいいのか?さえ分からずただ独学で細々と学んでいるのである。これを逃す手はあるだろうか?何をやっても続かない若者が多い時代でしかも基礎知識さえあれば就業経験のない人材ですら勉強しだいでは活躍の場を広める事が出来る。この様な分野に資金を投じず何に投じる必要があるのか?

我々は、冒頭述べた様に様々な機関や行政に助成金の申し出をさせて頂いているのだが、我々から言わせれば、基金訓練など訳のわからない事には助成金は出すのに何故高度プログラミングには出さないのか?と怒りが込み上げてくる。今時HP作成で誰が飯が食えるのか?下手したら小学生でもHP作成が出来る時代にいい年したおっさんが今更HP作成?はぁ?馬鹿か?でも担当者は「誰でも出来る分野でないと受講の対象にならないんですよ。あとは就職率ですね。実績を持ってきてくれないと・・・」と返してくる始末である。

馬鹿馬鹿しいにも程がある。

誰でも出来るから?それで飯が食えるんかい?万が一食えたとしても有効需要に乗っ取り人様の役に立って飯が食えとるんか?それから就職率?あんたテレビ・新聞みとるんか?もう話になりません。

この様な行政と受講希望者の間に壁がある以上難しいと半ば諦めていたのですが、武雄市長とのやり取りから一変、本当に素晴らしい話になりそうなので期待に胸を膨らませております。

インターネット設備さえあれば都会である必要はありませんし、学ぶ間の生活費の安くて済みます。また、空気は綺麗で人間らしい生活も期待できます。また、今後のプログラムによっては常に緊急事態でホワイトハッカーとなった受講生が駆り出される事もないでしょうから、Itに弱い一次産業の方々のIT化にも貢献出来ます。若者離れが著しい場所こそ相応しい教育事業だと思います。

長期支援体制の企画書を持参するつもりではありますが、いい方向に向かいますよう皆様のますますのご理解ご支援宜しくお願い致します。

 

Metasploit世界最強ツールのインストール方法

寒い日が続いていますが皆様如何お過ごしでしょうか?そんな寒さを吹き飛ばす激熱世界最強ツールをご紹介します。

その世界最強ツールの名はMetasploitmetasploit001

サーバーだろうが、クライアントだろうが攻撃ツールとしては破壊力抜群で世界最強。
Metasploitを使えば、ターゲットを調査⇒脆弱性発見⇒攻撃⇒権限取得までのかなりの部分を自動化出来、あとは情報を抜いたり自由に操作したり・・・。脳内沸騰間違いなしのツールなのです。

wikipediaでは

exploitコードの作成や実行を行うためのフレームワークである。セキュリティ業界ではよく知られたツールであり、ペネトレーションテスト目的で使用可能な1DVDタイプのLinuxであるBackTrackに収録されている。
どの脆弱性を用いるか、攻撃成功時にどのようなペイロードを適用するか、ペイロードが侵入防止システムに検出されるのを妨害するためにどのような
エンコード技術を用いるか、ペイロードによってリモートシェルやVNCサーバーなどをどのポート番号で起動するかなどの、exploitを成立させる各種要素を選択肢から選んで組み合わせて実行するといったように、簡単な方法で攻撃実行可能となっている。
また、初期のフレームワークはキャラクタユーザインタフェース(コマンドラインインタフェース/対話型コマンドラインインタフェース)であったが、
後のバージョンおよび第三者によって、Webインターフェイス(但しバージョン3.3でサポート打ち切り)やGUIインターフェースなども作られている。

と紹介されている。
さぁそれではMetasploitをインストールしていきましょう!

まず、Metasploitサイトのダウンロードページ(http://www.metasploit.com/download/)で赤印で囲ったMetasploit Community EditionのWindows版をダウンロードしましょう!metasploit002

ダウンロードしたmetasploit-latest-windows-installer.exeを実行すると最初にこの画面のお出ましです。ウイルスソフトが動いているとインストールに失敗したり、Exploitが作動しなくなる事がありますので十分注意して下さい!という旨です。metasploit003

OKをクリックして進むとまたまた警告文が出現します。頭が痛くなってくる所でしょうがここは辛抱です。これはファイアウォールを無効にして下さい!と言う警告ですが、インストール時点では関係がありますん。Metasploitを使う時には必須ですので後ほど確認しましょう!metasploit004

またOKするとインストールウィザードが始まります!metasploit006

使用許諾契約に続きます。metasploit007

インストール先フォルダの設定です。NEXT!NEXTでいいのじゃないでしょうか?metasploit008

次にMetasploitサービスが使用するポートを聞かれる事になります。デフォルトでまぁ問題はないでしょうが、既にこのポートを使用している場合は適当に設定して下さい!metasploit009

完全粉飾ドメインを入れて下さいと出て来ますが私達はwhitehackerzとしました!貴方は何hackerz??metasploit010

そしていよいよ準備はいいですか?と聞いてきますので満を持して勢いよくNEXTしましょう!metasploit011

するといよいよ始まりました!!!metasploit012

ここで前半に述べた様にウイルスソフトをそのままにしておくとこの様に全身をつんざく怪音と共にウイルスソフトが大活躍してしまいますので十分ご注意ください!metasploit013metasploit014

そしてついにインストール完了です!一気にFinishと行きたい所ですが、Web UIを使用するのにユーザー登録の必要がでてきますので煩わしかったり、ConsoleやArmitageしか使わないのであればサクッとチェックボックスからチェックをハズしてしまいましょう!metasploit015

最強ツールを使う為の準備如何でしたか?最強ツールを使用するにはまず己自身に磨きをかけて使用するに値する人間であるかどうか?慎重に判断してください!むやみやたらなMetasploitの使用は不幸な結末が控えていると言っても過言ではありません。

それではMetasploit快適ライフをお楽しみくださいませ!今後使用方法等も順次公開していきます。

BackTrackリニューアルリリース!その名もKALI(カーリー)

日時は未定ですが BackTrackリニューアルリリースされるようです!kali01

もともと、BackTrackのLinuxは、私たちの個人的な使用のために開発されましたが、過去数年間で、それは我々が想像するよりもはるかに大きな人気が成長してきました。私たちは毎日それを使用するため、我々はまだ、自分のためにバックトラックを開発しています。しかし、成長と巨大なユーザーベースで、我々は、我々のユーザーが自分自身への義務を有しており、オープンソースコミュニティは、我々はおそらく可能な限り最高のディストリビューションを作成する。

これを念頭に置いて、約一年前で私たちの束攻勢セキュリティはについて考え始めたバックトラックの将来、我々は次のと今後の改正で見てみたい特徴と機能についてブレインストーミングを行った。会話の私たちの主なトピックの一つは、本格的なDebianの準拠パッケージとリポジトリシステムのための私達のカスタム開発環境のスワップアウトのオプションでした。

これは一度に良いアイデアのように思えたが、少し我々はに自分自身を得ていた傷や痛みの世界を知っていた。バックトラックの将来経路に関するこの単一の意思決定には、それにそれが私たちの流通の顔を変更したことをそんなにパワーと柔軟性をもたらした。

この一年間で何が起こったの?私たちは静かに必要なインフラを開発し、当社の最新の侵入テストの配布のための基盤を築くだけでなく、8つの異なる言語で300以上のDebian準拠パッケージと宣誓を構築してきました。これらの変化は、彼らとの仕事、研究と学習の信じられないほどの量を持ってきただけでなく、我々が今まで作った中で最高の、そして最も柔軟性の高い、ペネトレーションテストディストリビューションを作成することへのパスを私たちをリードしている、 “カーリー”と呼ばれる。

 

Kali Linux – A Teaser into the Future.

 

正しい9999999999999^99999999999の計算方法(関数電卓)

今回は超巨大な数の計算方法を実践してみる事にします。

通常での電卓では計算出来ませんし、かといって手計算であれば大変な事になります。そこで今回はwindowsに標準搭載されている関数電卓を使用して検証してみます。dentaku01
念の為表示の仕方を書いておきます。

メニューボタン⇒全てのプログラム⇒アクセサリ⇒電卓

では、実際に999999999999999999999999を計算していきましょう!

目標は大きな数の指数表記

S×10n(1≦S<10)

の形式に直す事です。(Sの事を仮数significandと呼びます)
999999999999999999999999は以下の様に直すことが出来ます。

999999999999999999999999=(10000000000000-1)100000000000-1

つまり、≒10000000000000100000000000と言う事になりますので試しにこれを計算してみます。

そうすると10000000000000100000000000=101300000000000(10の1兆3000億乗)と言う事になります。では、1000000000000099999999999=101300000000000-13=101299999999987となりますね?それでは、最終的に(10000000000000-1)99999999999を割り出せばいいのですから、-1すれば良いだけです。

では、(x-1)nを使用すればよいですね!

でも待って下さい。

(x-1)2=x2-2x+1
(x-1)3=x3-3x2+3x-1 となりだんだんややこしくなっていきます・・・そしてついに(x-1)99999999999など計算しようものならもう無理ですねwww
=x999…999-999…999x999…998+….~…+999…999x-1(笑)(笑)(笑)

はい。完全絶望的です。で、結局コンピューターを使用する事になるんですが、デカ過ぎる計算をするとエラーが帰ってくるだけなので、コンピュータを使うにしても工夫が必要ですね!

そこで、冒頭の秘密兵器の登場です!関数電卓モードにして下さい!dentaku02
そして

対数 LOG

を使用していきます。対数(log)とは何乗すればその値になるかを表している。
x=bpで成り立っている時、p=log pxとなる。つまりx=blog pxと変形する事が出来る。
この時、bを底数と呼ぶ。具体例をあげると、
16=2?でしょうか?????4ですね。つまりこの4はこの様に表す事ができる。?=4=log2 16
では、log10 1000は?=4なぜなら10000=104このようにlog10は10進法との親和性が非常に良く、常用対数と呼ばれる。
そこでwindowsのlogボタンを使います。dentaku03
何故logかと言うと、今回みたいな巨大な指数演算に非常に威力を発揮するからです!例えば、log xpはp×log xと変形させる事ができてしまうのだ。では改めて999999999999999999999999を計算してみましょう!
999999999999999999999999=(10log 9999999999999)99999999999となるので指数を変形して=1099999999999×9999999999999となる!!!!!
では電卓でlog9999999999999を計算するとdentaku04
12.999999999999956570551809672646とでてくる!!!

次にこの数に99999999999を掛けると、dentaku05
1299999999986.995657055181010694がでてくる!
ここまでできればあとはこれを指数にして、101299999999986.995657055181010694で元丸!

結論、512GBのHDが取りうる全状態数に近いぐらいの数字である!

最新ソーシャルハック手口!skypeとfacebookを使えば個人情報ダダ漏れ状態!

タイトルにある様に、驚くべき情報が入ってきました。最新のソーシャルハッキングの手口で、skypeとfacebookを使って個人情報ダダ漏れになっていると言うのです。

取得できる情報は、氏名・メールアドレスからetc・・・

調べたい相手がskypeにさえ登録してあれば、メールアドレスが解かってしまい、更に相手がfacebookにも登録してあれば、本名を始めとして様々な個人情報を把握する事が出来るのです!

今回は啓発の意味も含めてその対策方法まで公開致します。

尚、この手順テストを行なう方は、facebook及びskypeの登録が必要になります。

手順

まず、この手順を開始する前に一つ注意点を述べます。

この手順を開始すれば、SkypeIDがFacebookで表示されるようになるので、それが嫌な方は非公開設定にしてください。非公開設定の仕方は、

  1. 基本データを編集
  2. 連絡先情報
  3. 編集
  4. IMスクリーンネーム
  5. 人のマーク▼
  6. 鍵「自分のみ」に設定

それでは、手順説明に入ります。

手順は、FaceBookにログインした状態で、

  1. SkypeのIDとパスワードを入力して検索ボタンを押す
  2. 【スキップ】を押す
  3. 警告が出るが【スキップ】を押す
  4. 【いいえ】を押す
  5. 【スキップ】を押す

※この手順通りに行なわないと、「友だちを検索」をした時に入力したSkypeアカウント名で、連絡先に入れている人に対して『招待』が行く事になります。ご注意下さい。

それでは、まず

https://www.facebook.com/find-friends/

にアクセス!!!

fb_1

自分のSkypeネームとパスワードを入力して、「友達検索」をクリック。

すでに、Skypeに登録されている友人がFaceBookを利用している場合は、以下のように表示されます。

fb_2
「スキップ」をクリックします。

警告がでますが、「スキップ」をクリックします。

fb_3 - コピー

最後に、リクエストを送るか聞いてきますので、「いいえ」をクリックします。

fb_4

Skypeのリストが取り込まれ、一覧が表示されます。

fb_5

「スキップ」をクリックします。

最初の画面に戻りますので、「インポートした連絡先を管理」のリンクをクリックします。

fb_6

取り込んだリストが表示されますので、メールアドレスを表示したい個所のリンクをクリックします。

fb_7

メールアドレスをクリックすると、セキュリティーチェック画面が表示されます。
画面上に表示されている文字を入力して、「送信」をクリックします。

fb_8

画面が閉じて、最初の画面上にメールアドレスが表示されます。

fb_9

如何でしょうか?上手く表示されましたか?

この手順を行うことにより、私に対して本名とメールアドレスを明かしていなかったAさんは、メールアドレスに本名を使用していたこともあり、本名とメールアドレスを私に知られてしまいました。問題は下記にあるのではないでしょうか。

■Facebookの友達検索でSkype側からFacebookに提供されるデータに、Skypeに登録されているメールアドレスが含まれる。

■それを受け取ったFacebookは、Facebookユーザーに対し、各連絡先のメールアドレスを(CAPTCHA認証をかましてるとは言え)開示してしまっている。

■メールアドレスを漏洩させられる被害者側は、自身がFacebookを使用しているか否かにかかわらず、Skypeに登録した「プライベートな」メールアドレスを、何の断りもなくコンタクトしているというだけの他人に知られてしまう。

何故か?

Facebookがやっている作業は、おそらくSkypeの連絡先に居るアカウントのメールアドレスが、Facebookに登録していたらこの人は友達かもしれないよって表示する仕組みなんですが、この作業をFacebook側は連絡先のインポートと呼んでいて連絡先を、Facebookのアカウント情報と照合していると思います。Facebooには「インポートした連絡先を管理」という機能があってFacebookに登録していないか調べた、「メールアドレス」が一覧表示されます。つまり、Facebookに登録してもいなくてもSkypeの連絡先のアカウントのメールアドレスがまず照合されるので、それがFacebook側の「ミス」だと言う事になります。

これから更に検証が必要ではありますが、対策としては、

SkypeとFacebookのアドレスを別にすること!

これにて対応するしかなさそうです。特にネットとリアルを分けてる人にとっては面倒な問題だと思いますので、一日も早い対策が必要では無いかと考える次第にございます。

JavaScriptとは何なのか?

JavaScriptとは何なのか?基本的な特徴

JavaScriptは非常にシンプルな言語であり、インタプリンタ言語として設計されている。プログラミング言語JavaはJavaScriptとは別物である。特徴としては次の様になものがあげられる。

  • ポインタ演算を除き、何となくCから影響を受けている構文
  • シンプルなクラスレスのオブジェクトモデル(Self言語の影響)
  • 自動的なガベージコレクション
  • 動的で弱い型付け

通常のウェブブラウザの実装におけるXMLHttpRequestやインラインフレームを使った通信では、セキュリティ上の制限から他のドメインのリソースにアクセスすることができない。
JavaScript自体には組み込みのI/O機構はない。ブラウザ内では、あらかじめ定義されている一連のメソッドやプロパティを介して、そのホスト環境とやり取りする程度の事は可能であるが、他の多くのプログラミング言語とは異なり、これらのインターフェイスは限定的で特化した機能しか持ち合わせていなのである。簡単なJavaScriptのプログラムは以下参照。

[javascript]

var text = "何処かでお会いしましたか?";
function display_string(str) {
alert(str);
return 0;
}

//"何処かでお会いしましたか?" を表示
display_str(text);

[/javascript]

さて、基本的な事に関しては他のサイトに譲るとして以降はセキュリティ関連の特性を説明しよう。

スプリクト処理モデル

ブラウザに表示される全てのHTMLドキュメントには、独りしたJavaScript実行環境のインスタンスが付与される。この実行環境には、読み込んだスクリプトで作成されるグローバル変数や関数が保存される単一の名前空間が備わっている。特定のドキュメントのコンテキストで実行される全てのスクリプトが、この共通サンドボックスを共有している事になり、またスクリプトはブラウザが提供するAPIを使用して他のコンテキストとのインタラクションを行なう事も可能なのである。このようなドキュメント間でのインタラクションは明示的に行なう必要があり、インタラクションを明示的に行なう事によりドキュメント間で無意識に相互に干渉してしまう可能性を低くする事が出来るのである。

特定の実行コンテキスト内ではそのコンテキストに含まれる全てのJavaScriptブロックは個別に実行される事となります。各ブロックは以下の3つでである。

  1. パース
  2. 関数の解決
  3. コードの実行

各コードブロックは任意の自己完結型で適切な構文を持った構文単位をその構文要素とする必要がある。以下個別に見て行く事にしよう。

1.パース

パースステージでは、スクリプトブロックの構文が検証されると共に、通常はスクリプトブロックから中間的なバイナリ表現への返還も行なわれる。コードがグローバルに影響を及ぼす事は皆無だが構文エラーが発生した場合には、問題を起こしたブロック全体がバッサリと棄て去られ、パーサーはコード内で次に処理可能なチャンクへと処理を進める事となる。

では、JavaScriptがパーサーがどんなもんか見て行くことにしよう。

[html]

<script> //ブロック1
var my_variable1 = 1;
var my_variable2 =
</script>

<script>
2; //ブロック2
</script>

[/html]

C言語をマイン言語として習得した人にとっては、上のコードシーケンスと下のコードシーケンスが等価だと感じるだろう。

[html]

<script>
var my_variable1 = 1;
var my_variable2 = 2;
</script>

[/html]

しかし、全く異なるものであり別次元のものなのである。等価とならないのは、パースの前にあらかじめ<script>ブロックが連結されていないからである。その為最初のスクリプトブロックは単に構文エラーを発生し、結果ブロック全体はその存在を一切無視される事となり実行ステージへとたどり着けなくなってしまうのである。グローバルな副作用が発生する前にブロック全体が切り捨てられると言う事は以下のコードとも等価でないと言う事である。

[html]

<script>
var my_variable1 = 1;
</script>

<script>
2;
</script>

[/html]

これがBashなど他の多くのスクリプト言語との大きな大きな違いでるのだ。では、最初に記述したサンプルコードのパースで何が起こるのかというと、最初のブロックは無視されるのだが、2つ目のブロック(<script>2;</script>)は適切にパースされるのだ。ただし、実行時にno-opとみなされ、コードステージメントとして数値だけが記述される形となることは申し添えておく。

2.関数の解決

パースステージが完了すると次のステップではパーサーが現在処理を行なっているブロック内で発見した、名前を持つグローバル関数全ての登録を行なうこととなり、登録が行なわれると、パーサーが発見した各関数はその後のコード実行で利用できるようになるのである。実行前にこのステップが入る事により、以下の構文が正しく実行出来るようになる。

[html]

<script>
hello_japanese_p();

function hello_japanese_p() {
alert(‘何処かでお会いしましたか?’);
}
</script>

[/html]

逆にこれをいじってしまった以下のコードは思った通りに作動できない。

[html]

<script>
hello_japanese_p();
</script>

function hello_japanese_p() {
alert(‘何処かでお会いしましたか?’);
}
</script>

[/html]

実行エラーとなるのだが、何故かと言うと、個々のコードブロックは同時に処理されずに、JavaScriptエンジンでの処理が可能になった順列に従って処理するからに他ならない。一つ目のブロックを実行する準備が整った段階においては、hello_japanese_p()を定義しているブロックのパースはまだ行なわれていないのである。

ここで見たグローバル名解決は関数だけに適用され、変数宣言には適用されない為に、難解になってしまう要因であろう。変数は、実行時に連続して登録され、この点に関しては他のインタプリンタ型のスクリプト言語と似ているといえるであろう。この為、以下のサンプルコードは思ったように動いてはくれない。(グローバルなhello_japanese_p()を、グローバル変数に代入されている無名関数に置き換えてみた)

[html]

<script>
hello_japanese_p();

var hello_japanese_p = function() {
alert(‘何処かでお会いしましたか?’);
}
</script>

[/html]

この場合、hello_japanese_p()を呼びだそうとしているタイミングでは、まだhello_japanese_p()変数への代入が行なわれていない

3.コードの実行

関数の解決が終了したら、JavaScriptエンジンは通常、関数ブロックに含まれていないステートメント全てを順次実行していくことになるが、この段階では、未処理の例外によって、あるいはよくわからない原因でスクリプトの実行が失敗する事がある。ただし、エラーが発生してもエラーを起こしたコードブロック内にある解決済みの関数は依然として呼び出し可能な状態におかれており、また、それまでに実行されたコードによりもさらされた状態変化も現在のスクリプト実行コンテキストの中でその状態を保つこととなる。

以下に示すサンプルコードは非常に興味深い点があり、JavaScriptにおける例外処理と実行特性が見える濃縮度の高いサンプルコードと言えるだろう。

[html]

<script>

↓この関数は何処からも呼び出されないので実行されない。

function not_called() {
return 72;
}

↓この関数は呼び出された時のみ実行される。ダイアルログ
の表示は行なうが、do_stuff()という名前の関数への参照が
解決されていないので例外を吐き出す。

function hello_japanese_p() {
alert(‘何処かでお会いしましたか?’);
do_stuff();
}

↓このステートメントからプログラムが実行される。

alert(‘はじめまして。名刺交換宜しいですか?’);

↓それから「何処かでお会い~」メッセージが表示される。

hello_japanese_p();

↓未処理の例外がhello_japanese_p()で吐き出された為
ここまでは届かない。

alert("一枚でよかったでしょうか?");
</script>

↓これは独立したブロックなので上で例外が発生しても、この
実行が妨げられる事無く実行される。

<script>
alert("私になんでも聞いて下さいね。");
</script>

[/html]

この例からも分かる通り、予期せぬ例外が発生した際にきちんと処理を行なわないと、どの様な結果が待ち受けているか想像もできない。例外によって、アプリケーションの状態が不安定になるかもしれないし、その状態でも何とかこうとか実行出来るかもしれない。例外とは、予想外のエラーが発生した際にそれが伝達していく事を避ける為の手段であり、それゆえにgotoステージメントの禁止などの関連から、JavaScriptはより原理主義的な姿勢を貫き通すのであった。

それでは、次回のJavaScriptシリーズでは実行順序の制御より更に理解を深めていきましょう。

Twitter image Downloader

特定ユーザーのTwitterのすべての写真をダウンロード

Twitter image Downloadertwitterdownloader

Twitter image Downloaderダウンロードはこちら

ソースコードはこちらです。

Form1.cs

[html]
<div id="sourceContentPlaceHolder">
<div id="sourceBrowserContainer">
<div id="splitView">
<div id="rightPane">
<div id="FileContentView">
<div id="FileView">
<div id="FileViewContainer">
<div>
<div id="fileContent">
<div>
<pre>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Xml;
using System.Security.Cryptography;
using System.IO;
using System.Text.RegularExpressions;
using System.Threading;

namespace TwitterImageDownloader
{
public partial class Form1 : Form
{
delegate void AddImageHandler(Image image);//The delegate

public Form1()
{
InitializeComponent();
listView1.View = View.LargeIcon;
imageList1.ImageSize = new Size(150, 150);
listView1.LargeImageList = this.imageList1;
}

private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(new ThreadStart(getImages));
t.Start();
}

private void getImages()
{
String userTimelineUrl = @"http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=" + tbScreenName.Text + @"&count=200&trim_user=1&exclude_replies=1&include_rts=0";
//String tweetUrl = @"http://api.twitter.com/1/statuses/show.xml?trim_user=1&include_entities=1&id=";

////First lets get the users tweets
WebClient webClient = new WebClient();
String userTimeLine = webClient.DownloadString(userTimelineUrl);
XmlDocument doc = new XmlDocument();
doc.LoadXml(userTimeLine);
XmlNodeList tweetList = doc.SelectNodes("//status");
foreach (XmlNode tweet in tweetList)
{
String tweetID = tweet.SelectSingleNode("id").InnerText;
String TweetText = tweet.SelectSingleNode("text").InnerText;

Match m = Regex.Match(TweetText, @"(?<twitterURL>t.co)/(?<subdir>[^\s]*)");
if (m.Success)
{
try
{
var request = (HttpWebRequest)WebRequest.Create(new Uri(@"http://t.co/" + m.Groups["subdir"].Value));
request.Method = "HEAD";
request.AllowAutoRedirect = false;

string location;
using (var response = request.GetResponse() as HttpWebResponse)
{
location = response.GetResponseHeader("Location");
}
string imageURL = String.Empty;

request = (HttpWebRequest)WebRequest.Create(location);

using (var response = request.GetResponse() as HttpWebResponse)
{
using (StreamReader sr = new StreamReader(response.GetResponseStream()))
{
List<ImgTag> images = GetImageTags(sr.ReadToEnd());
sr.Close();
foreach (ImgTag image in images)
{

if (location.StartsWith("http:/") && location.IndexOf("/photo/") > -1)
{
//For twitter.com look for media-slideshow-image
if (image.classAtt == "large media-slideshow-image")
{
imageURL = image.src;
}
}
if (location.StartsWith("http://instagr.am"))
{
//For instagram look for for the image tag
if (image.classAtt == "photo")
{
imageURL = image.src;
}

}
}
}
}
if (imageURL != String.Empty)
{
//found an Image
Image img = LoadImage(imageURL, tweetID);
listView1.Invoke(new AddImageHandler(ImageThread),new object[]{img});
}
}
catch (Exception ex)
{
//skip tweet
Console.WriteLine(ex.Message);
}
}

}
MessageBox.Show("Done.");
}

private void ImageThread(Image img)
{
imageList1.Images.Add(img);
ListViewItem item = new ListViewItem();
item.ImageIndex = listView1.Items.Count + 1;
listView1.Items.Add(item);
listView1.Refresh();
}

private List<ImgTag> GetImageTags(String html)
{
List<ImgTag> imgTags = new List<ImgTag>();
MatchCollection m1 = Regex.Matches(html, @"(<img.*?>.*?>)", RegexOptions.Singleline);
foreach (Match m in m1)
{
string value = m.Groups[1].Value;
ImgTag imgTag = new ImgTag();
Match m2 = Regex.Match(value, @"src=\""(.*?)\""", RegexOptions.Singleline);
if (m2.Success)
{
imgTag.src = m2.Groups[1].Value;
}
m2 = Regex.Match(value, @"class=\""(.*?)\""", RegexOptions.Singleline);
if (m2.Success)
{
imgTag.classAtt = m2.Groups[1].Value;
}
imgTags.Add(imgTag);
}
return imgTags;
}

private class ImgTag {
public String src = String.Empty;
public String classAtt = String.Empty;
}

private Image LoadImage(string url,string tweetID)
{
System.IO.Directory.CreateDirectory(System.IO.Path.Combine(Environment.CurrentDirectory.ToString(), tbScreenName.Text));
String fileLocation = System.IO.Path.Combine(Environment.CurrentDirectory.ToString(), tbScreenName.Text, tweetID + ".jpg");
using (var wc = new System.Net.WebClient())
{
wc.DownloadFile(url, fileLocation);
}
Bitmap bmp = new Bitmap(fileLocation);

return bmp;
}
}
}</pre>
</div>
</div>
</div>
</div>
</div>
</div>
<div></div>
</div>
</div>
<div></div>
</div>
</div>
<div></div>
<div id="footer"></div>
[/html]

Form1.Designer.cs

[html]namespace TwitterImageDownloader { partial class Form1 { /// <summary> /// Required designer variable. /// </summary> private System.ComponentModel.IContainer components = null; /// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// <summary> /// Required method for Designer support – do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.tbScreenName = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.listView1 = new System.Windows.Forms.ListView(); this.imageList1 = new System.Windows.Forms.ImageList(this.components); this.SuspendLayout(); // // tbScreenName // this.tbScreenName.Location = new System.Drawing.Point(97, 12); this.tbScreenName.Name = "tbScreenName"; this.tbScreenName.Size = new System.Drawing.Size(216, 20); this.tbScreenName.TabIndex = 0; // // label1 // this.label1.AutoSize = true; this.label1.Location = new System.Drawing.Point(13, 13); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(72, 13); this.label1.TabIndex = 1; this.label1.Text = "Screen Name"; // // button1 // this.button1.Location = new System.Drawing.Point(367, 10); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(75, 23); this.button1.TabIndex = 2; this.button1.Text = "Download"; this.button1.UseVisualStyleBackColor = true; this.button1.Click += new System.EventHandler(this.button1_Click); // // listView1 // this.listView1.Location = new System.Drawing.Point(12, 39); this.listView1.Name = "listView1"; this.listView1.Size = new System.Drawing.Size(638, 555); this.listView1.TabIndex = 8; this.listView1.UseCompatibleStateImageBehavior = false; // // imageList1 // this.imageList1.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; this.imageList1.ImageSize = new System.Drawing.Size(16, 16); this.imageList1.TransparentColor = System.Drawing.Color.Transparent; // // Form1 // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(670, 604); this.Controls.Add(this.listView1); this.Controls.Add(this.button1); this.Controls.Add(this.label1); this.Controls.Add(this.tbScreenName); this.Name = "Form1"; this.Text = "TwitterDownloader – CodeBetweenTheLines.com"; this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TextBox tbScreenName; private System.Windows.Forms.Label label1; private System.Windows.Forms.Button button1; private System.Windows.Forms.ListView listView1; private System.Windows.Forms.ImageList imageList1; } }[/html]

Form1.resx

[html]
<div id="sourceContentPlaceHolder">
<div id="sourceBrowserContainer">
<div id="splitView">
<div id="rightPane">
<div id="FileContentView">
<div id="FileView">
<div id="FileViewContainer">
<div>
<div id="fileContent">
<div>
<pre><?xml version="1.0" encoding="utf-8"?>
<root>
<!–
Microsoft ResX Schema

Version 2.0

The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.

Example:

… ado.net/XML headers & schema …
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, …</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, …</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>

There are any number of "resheader" rows that contain simple
name/value pairs.

Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don’t support this are serialized and stored with the
mimetype set.

The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:

Note – application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.

mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.

mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
–>
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="imageList1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
</root></pre>
</div>
&nbsp;
<pre></pre>
&nbsp;

</div>
</div>
</div>
</div>
</div>
<div></div>
</div>
</div>
<div></div>
</div>
</div>
<div></div>
<div id="footer"></div>
[/html]

Program.cs

[html]using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace TwitterImageDownloader { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } }[/html]

TwitterImageDownloader.csproj

[html]<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <PropertyGroup> <Configuration Condition=" ‘$(Configuration)’ == ” ">Debug</Configuration> <Platform Condition=" ‘$(Platform)’ == ” ">x86</Platform> <ProductVersion>8.0.30703</ProductVersion> <SchemaVersion>2.0</SchemaVersion> <ProjectGuid>{41AD11AE-D2B5-48DC-BE79-13062E82C6C5}</ProjectGuid> <OutputType>WinExe</OutputType> <AppDesignerFolder>Properties</AppDesignerFolder> <RootNamespace>TwitterImageDownloader</RootNamespace> <AssemblyName>TwitterImageDownloader</AssemblyName> <TargetFrameworkVersion>v4.0</TargetFrameworkVersion> <TargetFrameworkProfile>Client</TargetFrameworkProfile> <FileAlignment>512</FileAlignment> <SccProjectName>SAK</SccProjectName> <SccLocalPath>SAK</SccLocalPath> <SccAuxPath>SAK</SccAuxPath> <SccProvider>SAK</SccProvider> </PropertyGroup> <PropertyGroup Condition=" ‘$(Configuration)|$(Platform)’ == ‘Debug|x86’ "> <PlatformTarget>x86</PlatformTarget> <DebugSymbols>true</DebugSymbols> <DebugType>full</DebugType> <Optimize>false</Optimize> <OutputPath>bin\Debug\</OutputPath> <DefineConstants>DEBUG;TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> <PropertyGroup Condition=" ‘$(Configuration)|$(Platform)’ == ‘Release|x86’ "> <PlatformTarget>x86</PlatformTarget> <DebugType>pdbonly</DebugType> <Optimize>true</Optimize> <OutputPath>bin\Release\</OutputPath> <DefineConstants>TRACE</DefineConstants> <ErrorReport>prompt</ErrorReport> <WarningLevel>4</WarningLevel> </PropertyGroup> <ItemGroup> <Reference Include="System" /> <Reference Include="System.Core" /> <Reference Include="System.Xml.Linq" /> <Reference Include="System.Data.DataSetExtensions" /> <Reference Include="Microsoft.CSharp" /> <Reference Include="System.Data" /> <Reference Include="System.Deployment" /> <Reference Include="System.Drawing" /> <Reference Include="System.Windows.Forms" /> <Reference Include="System.Xml" /> </ItemGroup> <ItemGroup> <Compile Include="Form1.cs"> <SubType>Form</SubType> </Compile> <Compile Include="Form1.Designer.cs"> <DependentUpon>Form1.cs</DependentUpon> </Compile> <Compile Include="Program.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <EmbeddedResource Include="Form1.resx"> <DependentUpon>Form1.cs</DependentUpon> </EmbeddedResource> <EmbeddedResource Include="Properties\Resources.resx"> <Generator>ResXFileCodeGenerator</Generator> <LastGenOutput>Resources.Designer.cs</LastGenOutput> <SubType>Designer</SubType> </EmbeddedResource> <Compile Include="Properties\Resources.Designer.cs"> <AutoGen>True</AutoGen> <DependentUpon>Resources.resx</DependentUpon> </Compile> <None Include="Properties\Settings.settings"> <Generator>SettingsSingleFileGenerator</Generator> <LastGenOutput>Settings.Designer.cs</LastGenOutput> </None> <Compile Include="Properties\Settings.Designer.cs"> <AutoGen>True</AutoGen> <DependentUpon>Settings.settings</DependentUpon> <DesignTimeSharedInput>True</DesignTimeSharedInput> </Compile> </ItemGroup> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <!– To modify your build process, add your task inside one of the targets below and uncomment it. Other similar extension points exist, see Microsoft.Common.targets. <Target Name="BeforeBuild"> </Target> <Target Name="AfterBuild"> </Target> –> </Project>[/html]

TwitterImageDownloader.csproj.vspscc

[html]""
{
"FILE_VERSION" = "9237"
"ENLISTMENT_CHOICE" = "NEVER"
"PROJECT_FILE_RELATIVE_PATH" = ""
"NUMBER_OF_EXCLUDED_FILES" = "0"
"ORIGINAL_PROJECT_FILE_PATH" = ""
"NUMBER_OF_NESTED_PROJECTS" = "0"
"SOURCE_CONTROL_SETTINGS_PROVIDER" = "PROVIDER"
}[/html]