世紀末の墓

お気持ち.log

IT系寄りの雑記

Linux MintをThinkPad13にデュアルブートした話

タイトル通り、ThinkPad13にLinuxMintをデュアルブートしてみようと思い立ったのでやった話です。

既にVirtualBoxでLinuxMintの環境は用意しているのですが、比較も兼ねてやってみました。

VM記事はこちら↓
silmin.hatenablog.com

デュアルブートってなんぞ

デュアル(2つ)のブート(起動)です。
起動時に、つかうOSを選ぶことができます。

例:同一マシンにwindowsLinuxを入れてある場合
今日は、Microsoft Officeや動画編集とかめちゃくちゃしたい→Windows
今日は、プログラム書くのとかLinuxでやったほうが効率いいことしたい→Linux

てな感じで、同じPCでつかうOSを起動時に選べるということですね。

どちらかだけしか使わないよ!ならいいんですが、
windowsも使うけどLinuxも使いたい!同一マシンで!という方なら嬉しいですね。

一応、起動時にOSを選択するので、VMのように共有フォルダが標準でついてるってことは無いです。
まあでも、windowsのC:が標準でマウントされていると思うので無問題かな?


注意書き

私は↓の記事を参考にやりました。めちゃ丁寧に説明されています。
www.iandprogram.net

こちらの記事を見れば大して困ること無く成功すると思います。
UbuntuのところをLinuxMintに置き換えれば大丈夫だと思う。

この記事は説明記事というより、やった感想とか使い心地とかを書くものになりそうです。
ご了承ください。


用意するもの

人それぞれ違うと思うので僕の場合もついでに。

くらいかな。


手順

参考にさせていただいた記事にまんま乗ってるので簡単に

  1. パーティションいじいじ
  2. LinuxMint(isoファイル)入手
  3. LiveCD作成(LiveUSB?)
  4. BIOSで起動優先度変更
  5. インストール

って感じです。


感想

パーティションいじったりBIOS開いたりするから、初心者の方とかめちゃ怖いだろうなと思いました。
僕は怖くなかったもんね!最近買ったばかりのThinkPadだから慎重に...とか思ってないからね!!

まあ終わってみれば簡単でやってる間、意味がわからなかった操作も「ああなるほど。」と理解できると思います。

仮想マシンよりも(当然ですが)軽くストレスフリーで、何よりかっこいいです。

そのうち比較とか設定についての記事も書きたいですね。

Windows10と仮想マシン上のLinux Mintの共有フォルダの話

今回は共有フォルダについて設定したので色々。

仮想マシン上にLinux Mintを入れる

この記事参照してください。
silmin.hatenablog.com


共有フォルダとは

その名の通り、共有フォルダです。

windows10からもLinux Mintからもアクセスできるフォルダのことですね。

コレは上記の記事の段階(デフォルト)では設定されていません。


設定方法

windows

  1. 仮想マシンの設定を開く
  2. 共有フォルダーを選択
  3. 右上の+マークを選択
  4. 共有フォルダのパスと共有フォルダ名を設定

Linux Mint

/media/ に sf_[フォルダ名]/ というディレクトリが作られている、はず。

そのディレクトリ内が、windows側で指定したフォルダと共有されている。
(例:Mint側でtest.txtを共有ディレクトリ内に入れると、windows側の指定したフォルダに入っている)


まとめ(仮)

一応、コレで共有フォルダは作ることができた。
/media/sf_[フォルダ名]/ 以外に共有ディレクトリを作りたければ、さらにいろいろやることがある。

今回は面倒だったのでやりませんでした。

でも毎回 /media/sf_[フォルダ名]/ ってタイプするのが面倒ですよね。
僕も面倒です。


そこで代替案として、シンボリックリンクをホームディレクトリに貼っておこうかと思います。


シンボリックリンクとは

.............................リンクです。

ウンウン......エッ



簡単に言うと、デスクトップにあるショートカットみたいなイメージです。

↓/hoge/hoge2/.../hoge3/tempのシンボリックリンクをホームディレクトリに貼った場合
f:id:silmin:20170816171731p:plain


コマンドはこちら

# ln -s /hoge/hoge2/.../hoge3/temp templink

lnコマンドの-sオプションがシンボリックリンクを貼るオプションです。

# ln -s [リンク先] [リンク名] //管理者権限必要です

って感じです。

// /hoge/hoge2/.../hoge3/temp/ に hello.c をコピー
cp hello.c templink 

共有フォルダにアクセス出来ない場合

共有フォルダへのアクセス権が無くて操作できない場合があります。

その場合は以下のコマンドを実行してください。

# gpasswd -a [ユーザ名] vboxsf //管理者権限必要です

vboxsfというグループに追加するコマンドですが、そのグループに追加されたユーザのみ共有フォルダにアクセスできるようです。


まとめ

今回はシンボリックリンクの話メインだったかな?(???)

デフォルトの/media/sf_hoge/で、面倒という人は、別の所に作るかシンボリックリンクを貼ると良さそうです。


シンボリックリンクLinuxシステム上でたくさん使われてますし、よく使う(使える)ものなので覚えておいて損はないかな・・・?

雑談 2017/08/15

救急車に乗った話

今日人生初、救急車に同乗しました。


同乗ですよ同乗。
僕が運ばれたわけじゃありません。



誰がどうしてって言う話は控えますが、意外と冷静でいる自分に驚きました。


その人のことをどうでもいいと思っていたわけではなく、むしろ超心配していました。
どうでもいいとか思ってたら同乗なんてしないよね。



人間めっちゃ動揺すると逆に冷静になるのか、それとも僕のメンタルが超鉄鋼だったのかわかりませんが、自分でもびっくりしました。




車内はピッピッって音と隊員さんの話とか質問とかの音とサイレンの音がしていました。結構怖かったといえば怖かった・・・のか・・・・・?

まあ焦ってもしょうがない局面ではあるのですが、人生初なのにこんなもんなのかとそっちに動揺したくらいです。


今日はそれ関係のゴタゴタに見舞われて、何もできませんでした。
とりあえずめちゃくそ疲れたので、早めに寝たいと思います。

明日も色々あると思いますが、絶対記事あげます。






にしても、車に横向きに座るの辛いね(電車は大丈夫)

まだその救急車に揺れる感覚が残ってるくらいです。

VirtualBoxにLinux Mintを入れた話

CTF用の環境を作るためにLinuxMintをVirtualBoxに入れました。
その手順メモ?的なもの。

VirtualBoxとは

VirtualBoxというのは仮想環境を提供してくれるフリーソフトです。


???


簡単に言うと、PCのOS上に仮想のPC(マシン)を用意してそこにOSを入れることで、物理的な実体はないけどそこにそのOSが入ったPCを再現できるということです。





こういうこと
f:id:silmin:20170812144254p:plain

物理マシンは、仮想マシンを入れるPCのこと。


僕だったら↓でちょっと紹介したThikpad(windows10)ちゃんです。
silmin.hatenablog.com

ゲストOSは、Linux系それぞれの公式サイトで無料でイメージファイルが入手できます。








VirtualBoxのインストール

Oracle VM VirtualBox

こちらの公式サイトからインストーラーをダウンロードしてインストールします。

特に設定しなきゃいけないところもないので省略


OSのイメージファイルの入手

OSをインストールするにはイメージファイルというものが必要になります。

イメージファイルとは、記憶装置に記録されたデータを、ファイルやフォルダ構造を保ったまま複製・保存したデータのことである。

イメージファイルは、ハードディスクなどに記録されたデータ構造を仮想的に再現(エミュレート)することで、ファイルシステムのファイル構造を保ったままデータを記録している。これによって、複製した元のデータと全く同じようにファイルやフォルダにアクセスすることができる。イメージファイルはバックアップの作成などの目的で、ハードディスクの内容をそのCD-Rに複製するような場合によく用いられている。

Weblio 辞書 > コンピュータ > IT用語辞典 > イメージファイルの意味・解説  より

ですね。

今回は Linux Mint をインストールします。
Linux MintUbuntuから派生したディストリビューションになります。

なんでMintかというと.....好きだからです。かわいい。は?



Releases - Linux Mint
より、ダウンロードしてきます。

[注意] ここでは32bitOSを用います。詳細は後ほど。


OSのインストール

いよいよ、OSのインストールです。

  1. VirtualBoxを起動します
  2. 左上の[新規]をクリック
  3. 名前は任意、タイプはLinux、バージョンはUbuntu(32bit)を選択
  4. メモリとかストレージの設定とかする
  5. 終わったらその[設定]を開いて、ディスクイメージを設定
  6. [起動]を押して、後は指示通りにすすめて終了

f:id:silmin:20170812153752p:plain

ストレージ>光学ドライブ>右のディスクアイコンからイメージファイルを選択
f:id:silmin:20170812153756p:plain




こんな感じ


64bitOSを用いたい方は
did2memo.net
を参考にするといいでしょう。

今回はめんどくさいのでしません。


Dockerとかおもしろそうだけどやったこと無いのでやったら記事にします。

どこか違ってる所あったら言ってほしいです><


共有フォルダの話

silmin.hatenablog.com

見た目をちょっと変えた話

このページの見た目、初期設定のままでもシンプルで好きだけど、ちょっとはいじるか。ってことでいじった話。


ブログの見た目変更

テーマ変えたり、html/css使って見た目ちょこっといじったりしたよ。

どうだろうか、まだまだ改善の余地はあるけどまあ一応完成ということで。

現在のテーマ
moonnote.hateblo.jp

このテーマが綺麗だったので使わせてもらう。

結構これ人気みたいだね。

知識さえあれば作れるみたいだから、とりあえず暇になったら作ってみようかな?



にしてもあれだね。

はてブの見た目変えるの結構面倒だね。


僕はある程度、JavaScript,html,css は一通りやれる人だけれども、面倒だった。

ググったら「◯◯する方法!!!」とか「これをコピペするだけ!!」とかあったけど、僕はそういうの嫌いな人なので自分でソース読んでやりました。

※どうでもいいところで損するタイプの人間です。


F12押してどこがどれに対応してるか調べて、cssちまちま書いてく作業は楽しいっちゃ楽しいけども、やっぱり面倒だった。

人のソース読むのはやっぱり大変だ。これなら自分で1から作ったほうがいいってレベルで面倒なんだよね。(cssに関しては)

まあこんなこと言ってるけど、自分でwebサーバ立ち上げるリソースを持っていないので無理なんだけども。


記事のネタが切れたら気が向いたらブラウザの開発者ツールの話もしようかなぁ

あ、あとプログラムの初心者向けの記事とかも積極的に書いていこうと思うよ。(初心者()だから初心者の気持ちがわかる的な目線で行こうと思う)

雑談 2017/08/06

雑談。

そう、雑談。


決して書く内容無いからとかじゃないんだからねっ!!!

作業用BGMについて

皆さん、「作業用BGM」って聴きますか?

作業しないって人も居るだろうし、BGM聞かず無音でやるって人、友達とskypeしながらやるって人、色々居ると思います。


とりあえず。


作業用BGMいいぞ^~~~~



理由は特にないです。

僕自身は、作業中にBGMをめちゃ聴く人、というかそれがないと作業辛いっていう人です。



一口に「作業用BGM」と言ったって、色々ありますよね。

ヒーリング系、自然音系、ジャズ、クラシック、アニソン、等々・・・・・・・





ここで僕はバイノーラル(耳かき)音声を強くおすすめしたい!!


なぜかって?

気持ちいいし女の子と喋ってる気がしてうれしいからです!!!!!

キモいね

コード書いたりしてると寂しくなるからねしょうがないね。


まあバイノーラル音声は好き嫌いが大きく分かれる分野でもあるのであれですが。

僕はここでは四の五の言わない。
とにかく聴いてみて、そして感じて。

バイノーラル音声って何?

バイノーラル音声っていうのは、簡単に言うと「立体音響」の音声のことです。

音楽って両方のイヤホンないしヘッドホンから聴こえますよね?


ですが、立体音響というのは、喋ってる場所からしか聴こえません。
音の発生源に立体感があります。

上で喋ってるなら上から、左で喋ってるなら左から、聴こえます。



とにかく聴いてみようって人は
「バイノーラル音声」
って検索してもらえればたくさん出てくるのでそれを試しにどうぞ。

Youtubeには無断転載がたくさんあったりするので、是非好きな声優さんを見つけて、DLsite等で買ってみてもいいかもしれません。
www.dlsite.com

コレの耳かきが最高なのです・・・・・。

paizaのキャンペーンについて

これです
paiza.jp

すごいね、やるしかないね。


paizaってなに?って人はこちら
paiza.jp

まあ簡単に言うと、プログラミングに関する、就職・転職・学習・・・等々色々やっているところです。
E~Sランクまであり、各ランクごとに競プロの問題が用意されていて、それで自分のランクがわかるって言う感じです。
競プロ問題目当てでも全然OKですので興味あったら登録してみるのもいいかもしれません。

僕は競プロあーじゃありませんが、一応Sランク獲れているので、ちょっと勉強すれば初心者の方でも狙えるところかと思います。



本題です。

この問題自体は難しくありませんが、重要なのは経路長を短くすることです。
まだ、キャンペーン期間中なので喋りませんが、終わったら記事にします。


すごいね。このキャンペーンはやるしかないね(二回目)

webブラウザを自作したい!(4)

はい。
今回は前回言ったように、戻る・進む・再読込ボタンを作ろうぜ、っていう回です。

SS↓
最初は、「戻る」も「進む」もできないので暗い。
f:id:silmin:20170807220603p:plain:w300

helloと検索して進んだので「戻る」ができるようになった
f:id:silmin:20170807220613p:plain:w300

戻ったら逆に「進む」ができるようになった
f:id:silmin:20170807220621p:plain:w300

しっかり再読込もできるよ!!!



やることはめちゃ簡単です....................が、めちゃ大変でした。(は?)



今日の荒ぶり度合い(詳しくは余談で)↓

そう、実装内容とは全くと言っていいほど関係ない所で躓いていました^^;;;;;

そんなこんなで見ていきましょう。

戻る・進む・再読込ボタンの実装

はい、やることは簡単です。

ボタン配置して、それにClickイベント乗っけて、GoBack()なりGoForward()なりRefresh()なりをするだけです。(ホントに)

実際には画像貼るとか枠線消すとかしましたが、メインは↑のことするだけです。

ソースコード

ボタン達初期化
urlBox = new TextBox()
{
    Location = new Point( 90, 2 ),
    Size = new Size( 1000, 20 ),
    Font = new Font( "meiryo", 10 )
};
backButton = new Button()
{
    Location = new Point( 0, 0 ),
    Size = new Size( 30, 30 ),
    BackgroundImage = Image.FromFile( @"img\back_clear.png" ),
    BackgroundImageLayout = ImageLayout.Stretch,
    FlatStyle = FlatStyle.Flat
};
forwardButton = new Button()
{
    Location = new Point( 30, 0 ),
    Size = new Size( 30, 30 ),
    BackgroundImage = Image.FromFile( @"img\forward_clear.png" ),
    BackgroundImageLayout = ImageLayout.Stretch,
    FlatStyle = FlatStyle.Flat
};
refreshButton = new Button()
{
    Location = new Point( 60, 0 ),
    Size = new Size( 30, 30 ),
    BackgroundImage = Image.FromFile( @"img\refresh.png" ),
    BackgroundImageLayout = ImageLayout.Stretch,
    FlatStyle = FlatStyle.Flat
};

backButton.FlatAppearance.BorderSize = 0;
forwardButton.FlatAppearance.BorderSize = 0;
refreshButton.FlatAppearance.BorderSize = 0;

各ボタンの初期化を行っています。

backButton・・・戻るボタン
forwardButton・・・進むボタン
refreshButton・・・再読込ボタン

おそらく新要素はここ?

BackgroundImage = Image.FromFile( @"img\forward_clear.png" ),  //名前の通り背景画像設定
BackgroundImageLayout = ImageLayout.Stretch,                   //画像のスタイル?を変更(並べるとかフィットさせるとか中央とか)←ここではフィットさせてる
FlatStyle = FlatStyle.Flat                                     //ボタンのスタイルを変更

画像のパスの@は「\をエスケープ文字じゃなく階層区切りとしてみる」という意味があります。
@がない状態だと\はエスケープ文字と捉えられてしまい、\を使うには\\と記述する必要がありますが、先頭に@をつけることで、普通につかえてうれしいですね。
画像のスタイル?についてはここ↓
コントロールやフォームに画像を表示する: .NET Tips: C#, VB.NET
これはあくまで背景をいじってるだけなのでButton.Imageプロパティとは違います。
今回は文字も表示しないので変わりないと思い、これを採用。

ボタンのスタイルについてはここ↓
01.フラットスタイルの外観を変更する < Button Tips < コントロール Tips メニュー < C# 2005 Tips HOME < HIRO's.NET
昔の記事ですが全然問題ないかと。
今回はフラットにしてます。(かっちょいいので)

backButton.FlatAppearance.BorderSize = 0;
forwardButton.FlatAppearance.BorderSize = 0;
refreshButton.FlatAppearance.BorderSize = 0;

これはボタンの枠線の太さを変更しています。
0に設定しているので実質枠無し、にしています。(かっちょいいので)

新しいメソッド群
private void Browser_CanGoBackChanged( object sender, EventArgs e )
{
    backButton.Enabled = browser.CanGoBack;
    if( backButton.Enabled ) backButton.BackgroundImage = Image.FromFile( @"img\back.png" );
    else backButton.BackgroundImage = Image.FromFile( @"img\back_clear.png" );
}

private void Browser_CanGoForwardChanged( object sender, EventArgs e )
{
    forwardButton.Enabled = browser.CanGoForward;
    if( forwardButton.Enabled ) forwardButton.BackgroundImage = Image.FromFile( @"img\forward.png" );
    else forwardButton.BackgroundImage = Image.FromFile( @"img\forward_clear.png" );
}

private void backButton_Click( object sender, EventArgs e )
{
    browser.GoBack();
    this.ActiveControl = null; 
}

private void forwardButton_Click( object sender, EventArgs e )
{
    browser.GoForward();
    this.ActiveControl = null; 
}

private void refreshButton_Click( object sender, EventArgs e )
{
    browser.Refresh();
    this.ActiveControl = null; 
}

CanGo....Changedというイベントは、「戻る」または「進む」の可不可が変更されると、発火します。
CanGoBackやCanGoForwardはboolで、戻れるかどうか、進めるかどうか、を持っています。

可能か不可能かで画像を変更したかったので書きました。

...Button_Clickというイベントは、文字通りそのボタンがクリックされたら発火します。
GoBack()やGoForward()、Refresh()はそれぞれ戻る・進む・再読込を行うメソッドです。

this.ActiveControl = null;

これは移動した時に、何らかのボタンを選択してしまっていることがあるので、ちょっとかっこ悪いかなぁと思って書きました。
これはデフォルトなのでしょうか。コードの意味は文字通りです。

余談

最初に言った躓いたところについてです。
僕は普段、自分用フォームアプリケーション作るだけならVisualStudioは使わずvimで書いて、付属のcscコンパイルしています。
VSは嫌いなのでね
UWPとかやるなら話は別だよ。

そのコンパイルオプションで /target:winexe というものがあるのですが、これを付けると実行したときにコンソールが開かないので嬉しいです。
というか、実行時にコンソールいちいち開かれても邪魔なのでね・・・^^;
それで、そのオプションを付けると.exeファイルが作られた直後に消失するという現象がおきまして。(は?????)
これには名前があるのかどうかわかりませんが、かなり焦りました。
なんか、色々デバッグした感じ、イベント貼ってないButtonがあって、そのボタンについて

Button.FlatAppearance.BorderSize = 0;

をするとその現象が起きるということがわかりました。

なにを言ってるのかわからないと思います。
僕もわかりませんので。(だれか早く教えて)

今日はこれにて。
明日時間があればお気に入り機能つけたいと思います。ノシ

webブラウザを自作したい!(3)

今回は前回言ってたように戻る進む再読込とかとか





ではなく、「サイトのアイコンを適用する」です。

サイトのアイコンを適用する

え?それだけ?

はいそれだけです(それ以外にもちょっとあるよ)


コレがわりと苦労しました。

簡単そうに見えてこれ持ってるプロパティとかなさそうで、html内部からURL探して持ってくる必要がありました。

もっといい方法ありそうですが、とりあえずぶん殴る形式になっちゃいました。知ってる人おしえてください・・・><

それではSSから
f:id:silmin:20170806094419p:plainf:id:silmin:20170806094435p:plain

まあこんな感じで変わってますね。

ソースコード

private void Browser_Navigated( object sender, WebBrowserNavigatedEventArgs e )
{
    //this.Text = browser.DocumentTitle;
    this.urlBox.Text = browser.Url.ToString();

    string iconUrl = getIconUrl( e );
    this.Icon = getIcon( iconUrl );
}

private string getIconUrl( WebBrowserNavigatedEventArgs e )
{
    foreach( HtmlElement linkTag in this.browser.Document.GetElementsByTagName("link") )
    {
        string relAttribute = linkTag.GetAttribute("rel");
        string iconUrl;

        if( relAttribute == "shortcut icon" || relAttribute == "icon" )
        {
            iconUrl = linkTag.GetAttribute("href");
            if( iconUrl.StartsWith("http") ) return iconUrl; 
            else if( iconUrl.StartsWith("/") ) return "http://" + e.Url.Host + iconUrl;
            else return e.Url.ToString() + iconUrl;
        }
    }
    return "http://" + e.Url.Host + "/favicon.ico";
}

//url -> Icon
private Icon getIcon( string url )
{
    WebClient webClient = new WebClient();
    using( MemoryStream stream = new MemoryStream( webClient.DownloadData( url ) ) )
    {
        Icon icon = new Icon( stream );
        return icon;
    }
}

private void Browser_DocumentCompleted( object sender, WebBrowserDocumentCompletedEventArgs e )
{
    this.Text = browser.DocumentTitle;
}

ざっくりいじった所だけ貼りました。

getIconUrl()でアイコンのURLを引っぱってきて、getIcon()でURLからアイコンを取得する感じです。

private string getIconUrl( WebBrowserNavigatedEventArgs e )
{
    foreach( HtmlElement linkTag in this.browser.Document.GetElementsByTagName("link") )
    {
        string relAttribute = linkTag.GetAttribute("rel");
        string iconUrl;

        if( relAttribute == "shortcut icon" || relAttribute == "icon" )
        {
            iconUrl = linkTag.GetAttribute("href");
            if( iconUrl.StartsWith("http") ) return iconUrl; 
            else if( iconUrl.StartsWith("/") ) return "http://" + e.Url.Host + iconUrl;
            else return e.Url.ToString() + iconUrl;
        }
    }
    return "http://" + e.Url.Host + "/favicon.ico";
}

ホントにぶん殴りコードですね・・・^^;
とりあえずlinkタグのやつを全部抽出してその中のrel探してきて、その属性がicon系なら引っ張るって感じですね。
それでも無かったらfavicon.icoにあるんじゃねってことで最後です。

C#スクレイピングしたこと無かったので苦戦しました・・・。
でも完成してみたら、割りと読みやすいというかわかりやすいコードになりました。

もっといい方法ないかなぁ(ボソッ

private Icon getIcon( string url )
{
    WebClient webClient = new WebClient();
    using( MemoryStream stream = new MemoryStream( webClient.DownloadData( url ) ) )
    {
        Icon icon = new Icon( stream );
        return icon;
    }
}

getIcon()はurlからアイコンを持ってくるメソッドです。
urlの示すデータを読み込んで、それをアイコンとして読み出す、ってイメージでしょうか。


んでそれらを↓でまとめるって感じになってます。

private void Browser_Navigated( object sender, WebBrowserNavigatedEventArgs e )
{
    //this.Text = browser.DocumentTitle;
    this.urlBox.Text = browser.Url.ToString();

    string iconUrl = getIconUrl( e );   //url持ってきて
    this.Icon = getIcon( iconUrl );     //アイコンにする
}


ここで気がついた人もいるかもですが、タイトルを取得するイベントを

WebBrowser.Navigated()

WebBrowser.DocumentCompleted()

に変更しました。

Navigatedだとまだサイトに案内できただけで、中身をすべてロードできていない(?)状態らしいです。
実際に、Navigatedだとタイトルを取得できないサイトが複数ありました。(←これはタイミングの問題でもあるかも)

DocumentCompletedは、サイトの中身のロードが完了すると発生するイベントなので、これを利用しようという結論になりました。これだと全部タイトルがしっかり適用されました。

大した変更じゃないけど、結構重要なのでやっておきました。



それでは今回はここまで。
次回こそは、戻る進む再読込つくろう!(全然難しくないんだけどね())

webブラウザを自作したい!(2)

URLボックスの実装

見た目
f:id:silmin:20170803212614p:plain:w250f:id:silmin:20170803212617p:plain:w250

↑こんな風にしっかり変わります。

ちゃんと入力してEnterキーで飛ぶこともできるよ!
これがめちゃめちゃ時間かかったんだよなぁ(なんで)

あとちゃっかりタイトルもサイトによって変わるようにいじってます。

ソースコード

using System;
using System.Drawing;
using System.Windows.Forms;

//mainは割愛

class Browser : Form
{
    WebBrowser browser;
    TextBox urlBox;

    public Browser()
    {
        //item
        browser = new WebBrowser()
        {
            Location = new Point( 0, 30 ),
            Size = new Size( 1200, 800 )
        };
        urlBox = new TextBox()
        {
            Location = new Point( 30, 2 ),
            Size = new Size( 1000, 20 ),
            Font = new Font( "meiryo", 10 )
        };
        this.Controls.Add( browser );
        this.Controls.Add( urlBox );

        //event handler
        this.Shown += new EventHandler( this.Browser_Load );
        this.SizeChanged += new EventHandler( this.ReSized );
    }
    
    private void Browser_Load( object sender, EventArgs e )
    {
        this.ClientSize = new Size( 1200, 830 );
        this.Text = "My Browser";

        //script error block
        browser.ScriptErrorsSuppressed = true;

        //event handler
        browser.Navigated += new WebBrowserNavigatedEventHandler( this.Browser_Navigated );
        urlBox.KeyDown += new KeyEventHandler( this.urlBox_KeyDown );

        //first page
        string url = "http://www.google.co.jp";
        browser.Navigate( url );
    }

    private void urlBox_KeyDown( object sender, KeyEventArgs e )
    {
        if( e.KeyCode == Keys.Enter )  
        {
            if( urlBox.Text != string.Empty )
            {
                browser.Navigate( urlBox.Text );
            }
        }
    }

    private void Browser_Navigated( object sender, WebBrowserNavigatedEventArgs e )
    {
        this.Text = browser.DocumentTitle;
        this.urlBox.Text = browser.Url.ToString();
    }

    private void ReSized( object sender, EventArgs e )
    {
        int width = this.ClientSize.Width;
        int height = this.ClientSize.Height;
        this.browser.Size = new Size( width, height - 30 );
    }
}

前回に比べてちょっと増えましたね(当たり前)

urlBox = new TextBox()                //URLいれるやつ
{
    Location = new Point( 30, 2 ),
    Size = new Size( 1000, 20 ),
    Font = new Font( "meiryo", 10 )
};

TextBoxは結局フォントの大きさでheightが決まるみたいなので適当に目分量で決めました。
ゆるしてくださいなんでもしません。(しません。)
フォントがメイリオなのに深い意味はありません。思いついたのがメイリオだっただけです。

private void Browser_Navigated( object sender, WebBrowserNavigatedEventArgs e )
{
    this.Text = browser.DocumentTitle;            //タイトルを変更
    this.urlBox.Text = browser.Url.ToString();    //URLボックスに今のページのURLを格納
}

WebBrowser.Navigatedイベントはページ移動したときに発生するイベントらしいです。(雑)
だったらそこでタイトルとURL更新すればいいじゃないということで更新。

private void urlBox_KeyDown( object sender, KeyEventArgs e )
{
    if( e.KeyCode == Keys.Enter )              //押されたキーがEnterキーだったら
    {
        if( urlBox.Text != string.Empty )      //URLボックスが空じゃなかったら
        {
            browser.Navigate( urlBox.Text );   //そのURL先に移動
        }
    }
}

TextBox(Control).KeyDownイベントはキーが押下されたときに発生するイベントらしいです。
それ利用して移動させちゃいます。

先程言った時間のかかったポイントは e,KeyCode の部分です。


は?
普通じゃん。



そう今思えば普通なんですね。

ですが僕は Ctrl, Shift, Alt のような修飾キーの押されたモノを持つ Control.ModifierKeys と一生懸命比較していたためできなかった。
雑魚確定ですねorz


ここまでで一応今回の目標(?)は達成なんですが、1つやることがあります。

//script error block
browser.ScriptErrorsSuppressed = true;

これです。
これはスクリプトエラーを表示しないというフラグです。
trueで表示しないとなります。(デフォルト:false)

これしないとスクリプトエラー出まくってまともにブラウジングできなかったのでしておきます。

次回は戻る・進む・再読込機能とお気に入り機能付けたいなぁ・・・・(時間をくれ)

webブラウザを自作したい!(1)

今回はC#を用いてwebブラウザを作りたいと思います。
進捗があがり次第記事を書いていく形になると思いますし、完成形は考えて無いので(n)まで続きます。(どこまで続くかわからない)

それと、何故作るかというと...........作りたいからです。(理由はいらないですね)

基盤を作る

(1)なのでとりあえずは基盤というか、そんな感じのモノを作る。

今回作ったのは、実行したらgoogleに繋がるだけの代物。
UIなんて気にするな。↓の感じで。

f:id:silmin:20170801212856p:plain

タイトルバーの下のスペースはアドレスバーとか入れようかなって思って空けた。

ソースコード

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Webbrowser
{
    class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run( new Browser() );
        }
    }

    class Browser : Form
    {
        WebBrowser browser;

        public Browser()
        {
            browser = new WebBrowser()
            {
                Location = new Point( 0, 30 ),
                Size = new Size( 1200, 800 )                  
            };
            this.Controls.Add( browser );

            this.Shown += new EventHandler( this.Browser_Load );
            this.SizeChanged += new EventHandler( this.ReSized );

            string url = "http://www.google.co.jp";
            browser.Navigate( url );
        }

        private void Browser_Load( object sender, EventArgs e )
        {
            this.ClientSize = new Size( 1200, 830 );
            this.Text = "My Browser";
        }

        private void ReSized( object sender, EventArgs e )
        {
            int width = this.ClientSize.Width;
            int height = this.ClientSize.Height;
            this.browser.Size = new Size( width, height - 30 );
        }
    }
}

こんな感じになった。クソコードっていうな

はい。
後々改造していくし、まだハリボテなので許して。

WebBrowser browser;

こいつはwebブラウザに必要な事(低レイヤの部分?)を全部まるっとやってくれるすごいやつだ!
これをAddするだけで表示ができちゃう!正直びっくりした。
コレに頼ればできちゃうけど、中身もちゃんと理解できるようになりたいですね.....。
まあ今は使えるものは使いましょっと^^

string url = "http://www.google.co.jp";  //urlをstring型変数に格納
browser.Navigate( url );                 //urlをNavigateメソッドに渡す

WebBrowser.Navigate()は指定したURLに飛んでくれるメソッド。
圧倒的便利感。

//ウインドウのサイズが変更されたときに発火するメソッド
private void ReSized( object sender, EventArgs e )
{
    int width = this.ClientSize.Width;                   //現在のウインドウの横幅を格納
    int height = this.ClientSize.Height;                 //現在のウインドウの縦幅を格納
    this.browser.Size = new Size( width, height - 30 );  //表示領域を現在のモノに更新
}

一応リサイズにも対応できるようにしたよ。