Hope is a Dream. Dream is a Hope.

非公開ブログは再開しました。

OS屋になるための一路

OSをつくる

ずっと前からOSを作りたくて作りたくて やっと参考書を購入して手を動かし始めました

参考書はモチロン

30日でできる!OS自作入門

30日でできる! OS自作入門

30日でできる! OS自作入門

(1日目) PCの仕組みからアセンブラまで

概要

バイナリを写経して、VirtualBOXにてHello Worldを表示できた!!!

詳細

バイナリエディタの準備

freesoft100で「バイナリエディタ」と調べてみると結構でてきた。

ひとまず全部ダウンロード

f:id:hope_is_dream:20190104090952p:plain

書籍に準じてBzEditorを使う。

f:id:hope_is_dream:20190104091555p:plain

参考書に従い、バイナリを書き込んでいく。 ほとんど0ではある。 先頭部分の数値を無心で写経していく。 意味は分からない。。しかし、右側の部分にHELLO的な文字列解釈されている部分もある。FAT32もある。

そんななか5分後。

適当な名前.imgで保存し、VirtualBoxでフロッピーとしてマウント.

f:id:hope_is_dream:20190104090847p:plain

できた?????

もしや、はじめてのバイナリ!!!

思った以上に感動!!!

これはうれしい!!!!!!

本にもあるが、ただのコピペだが手打ちしたほうが良いとあった。 手打ちしたかいがありました。

これはOSらしい。 (これをOSと認めてもらえれば)

これはやらないとわからない。

感動!

ことしもがんばるぞー

スクレイピングアプリの設計について考える

 

前回からC#Seleniumを使って、webスクレイピングするアプリを作っている。

 

どのようなアプリかというと。

 

例えばFacebookでイイねしたり、操作したいとする。どのサービスも似たような感じで、まずトップページへとアクセスして、ユーザー情報を入力してログインする。そして目的のページまで遷移し、データを入れたり取ったりする。

狙っているページのURLを直接指定できれば簡単だが、シングルページで色々やってたり、JSでモーダル表示させてたりとした場合、静的ページだけで構成されている場合とは違い、実際は少し大変である。

例えば、Facebookで友人の投稿にイイね!を押す操作を自動化しようとする。そうするとログイン後のURLは変わらず、ずっと同じ場所にいるのだが、ページ内の要素は常に変化するのが想像できる。各投稿も、常に全ては表示されない。そう見えるけど。下にスクロールしてくと、その度に読み込まれて表示される。なので、スクレイピングする場合も、ページをわざとスクロールしたり、読み込まれるまで待機したりと、人間っぽく操作する必要がある。

 

 

監視

 

自動で動かしてると、Facebook側に見つかってしまう事もある。Facebook側も自動化されたプログラムが人間のフリをして存在するのは嬉しくない。ので。人間ではなくプログラムが動かしていることを、検知するプログラム、が常に監視している。AIという言葉を使うなら。つまり、人間かプログラムかを監視するAIがFacebookに雇われている。

 

 

擬態

 

そこでFacebookのAIにプログラムと見破られないように、僕のプログラムも人間風に振る舞わす事を考えたくなる。例えば、なにも考えずにプログラムを書いて動かすと、すごい速さで動いちゃう。どれくらいかというと、そっちのボタンとこっちのボタンをクリックするのに、瞬きよりも短い時間でできちゃう。なので、Facebookでイイねを押そうとすると、一瞬で何個もイイねを押せる。作った側としては、見ているのは楽しいけども、人間には不可能なので、一瞬で監視に見つかってしまう。

また、人間は寝たり、仕事したり、ご飯を食べたりするので、四六時中イイネすることはできない。そこらへんも監視されていて、一日中、プログラムを動かしていると見つかってしまった経験がある。なので、数分に一回とか、一時間に何回とかして、スマホ依存に見せかけたりする必要がある。

 

 

なりすまし

 

もちろん、人間になりすますアカウントは一つではない。もし、複数のアカウントをもっているなら、交互に複数のアカウントにログインする必要がある。それにより、例えば僕のプログラム同士で会話をしているフリをするかもしれない。だれかが記事をあげると、みんなでシェアされているように見えるかもしれない。これで、イイねを押してくれる友達がいっぱいにみせきれる。

 

さて、それらを踏まえてアプリの設計をする。実はアプリ開発の経験がないので上手い設計がわからない。

ザックリと整理すると、

 

  1. UI
  2. スケジューラー
  3. タスク(イイねクリック)

 

こんな感じかな。アプリ設定やアカウント情報とかあるけど。それはUIに任せることにする。

 

もう少し考える。UIと内部のプログラムの境界を考えてみる。実際UIはWebやWindowsアプリのようなGUIでも、黒い画面のCUIでも、良い。UIを通して、設定等が内部のプログラムに渡されタスクが実行される。

 

そう考えると

  1. UI
  2. 内部プログラム

 

webでいうとフロントエンドとバックエンドかな。ただMVCみたいな感じとは違う。。どっちかというとバッチ処理?みたいなものか?(閃いた)

 

バッチ処理を調べてみると、JavaやらPythonやらでフレームワークが沢山でてきた涙

 

 

まだまだ勉強が、必要そうですね。

次回、バッチ処理を調べます。

 

 

 

 

 

C# Seleniumの例外処理

背景

前回C#Seleniumを使う方法についてまとめた。 今回は実際に使う上での注意点をまとめる.

hope-is-dream.hatenablog.com

概要

Seleniumの例外がややややこしかったので整理する.

サンプルコードで説明

ついでに非同期処理のスニペットとなっている。

async void button_Click(object sender, EventArgs e)
{

    await Task.Run(() =>
    {
        using (IWebDriver driver = new ChromeDriver())
        {
            // 終了判定
            bool NonError = true;

            while (NonError)
            {

                try
                {
                
                    driver.Url = "https://google.com";
                    
                    // エラー発生させる
                    IWebElement element = driver.FindElement(By.Id("unknowns"));
                    
                    // 下のように要素を探すとエラーはでない。(メモ)
                    var elements = driver.FindElements(By.Id("gsr"));
                    if ( elements.Count > 0)
                    {
                        elements[0].Click();
                    }
                }
                catch (OpenQA.Selenium.NoSuchElementException ex)
                {
                    Console.WriteLine($"[ERROR] HTML要素が存在しない場合のエラー");
                    Console.WriteLine(ex.Message);
                }
                catch (OpenQA.Selenium.NoSuchWindowException ex)
                {
                    Console.WriteLine($"[ERROR] ブラウザが閉じられた場合のエラー");
                    Console.WriteLine(ex.Message);
                    NonError = false;
                }
                catch (OpenQA.Selenium.WebDriverException ex)
                {
                    Console.WriteLine($"[ERROR] WebDriverのエラー. WebDriverが閉じられた場合のエラー");
                    Console.WriteLine(ex.Message);
                    NonError = false;

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    NonError = false;
                }


                // 一時待機
                //System.Threading.Thread.Sleep(100);
                driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(1);

            }
        }

        Console.WriteLine("[while] end..");

    });

}

動作の概要としては、SeleniumWebDriverからブラウザを操作する. 例えば、C#Seleniumを起動させると黒い画面とブラウザが立ち上がる.

f:id:hope_is_dream:20181211202630p:plain

黒い画面を閉じると、WebDriverException が投げられる. ブラウザを閉じると、NoSuchWindowException が投げられる.

これまでは良く分かってなかったが、 WebDriverからSocket通信をしてブラウザを操作しているよう.

要素の検索としては、driver.FindElement()だと、要素が存在しない場合にNoSuchElementException が投げられる. 似たようなメソッドだが、driver.FindElements()を利用すると、要素が存在しない場合は、コレクションのlenghtが0になるので、それで判断すると良い.

まとめ

seleniumの例外処理について整理した。 例外処理をキチンとしていないと、アプリを動作させていると、WebDriverの操作から外れた幽霊ブラウザが発生するので注意が必要

参考

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)

Selenium実践入門 ―― 自動化による継続的なブラウザテスト (WEB+DB PRESS plus)