世紀末の墓

お気持ち.log

IT系寄りの雑記

JOI夏季セミナー2017に参加してきた話

8/26(土)~30(水)で情報オリンピック日本委員会さんが主催する夏季セミナーに参加してきました。

はじめに

これは僕目線の記事になるため、プロ目線を期待している方はご遠慮ください。

場所

公益財団法人 大学セミナーハウス 公式ホームページ
f:id:silmin:20181021020300j:plain
↑こんな感じの辺境
↓宿泊棟の中はこんな感じ
f:id:silmin:20181021020345j:plain

概要

JOI summer seminar 2017

合宿形式の勉強会で、色んな人と交流して知見を高め合おう。
セミナーとして情報科学等の本をみんなで読んで強くなろう。
みたいな感じです。

春合宿に参加していたメンバーは自動参加で、残りは応募制で作文を書いてメールで送る。
僕は応募勢で、作文が通ったので参加可能となった。

セミナー一覧

それぞれ教科書となる本があって、チューターさん1人がついてくれる。
25人が5人ずつに分かれてグループでやる感じ。

日程

全体としては
Day1~4がセミナー&スライド作成
Day5が発表
という感じでした。

Day1

~15:30集合開始だった。
僕はJOI常連マンではなく、JOI系イベ初参加だったので皆知らない人ばかり。
とても緊張した。一応知り合いが何人か参加していたためボッチにはならずに済んだ。
周りの人たちがみんなプロに見えた(実際そう)
そして、全員集まって自己紹介が始まる。
ここで僕、持ってきた環境に色々と入っていないことに気がつき、慌てて環境構築()
自己紹介で、Twitterで見たことある人が結構居るなぁってお気持ちになった。

僕は「純粋関数型データ構造」のセミナーを選んだ。
言語は Haskell を使うらしい。僕は初めて Haskell をやる。

宿泊施設もまあまあ良くて、5日間生きていけそうである。

Day2

この日はセミナーの他に、講義があった。
JOIのOBらしいがよく知らない。
プロそうな話をしていたが、僕は意識が飛んでしまっていたらしい(ごめんなし)

Day3

この日はセミナーオンリー。
ずっとセミナーで気が狂いそうになったが、これはこれで楽しかった。

Day4

この日も講義があった。
筑波大学の教授さんらしく、プラレール(レール)と折り紙が大好きらしい。
この講義は僕好みで面白く、意識が保たれていたらしい。

Day5

発表の日。
今までのセミナーの部屋とは別の講堂というところで発表会をした。
僕は Haskell Introduction というタイトルでHaskellとは...みたいな話を適当にした。
f:id:silmin:20181021020408j:plain
15:00頃に解散した。

全体の雰囲気

情報界隈特有の雰囲気があるのは確か。
僕もその界隈の人なので気にはならなかった。
ピリピリした感じは無く、むしろゆる~い感じだった。

感想

最初は「競プロ界隈でグループができていてボッチ確定ですわ・・・」とか「周りプロ過ぎて喋れる気がしない・・・」とか思っていた。でもプロなのは間違いないが、普通に喋ってくれる人たちばかりで嬉しかった。テトリスプロ勢が多くてビビった。交流の時間もあって助かった。
Haskellは神言語で心を綺麗にしてくれると分かった。Haskellは普通に勉強したい。
ご飯のたびに登山下山をせねばならず、足腰がヤバだった。
それともやし先輩というプロの影響でルービックキューブを買った。

まとめ

参加してみてわかったことは、Twitter上でプロっていてヤバな人たちでも会ってみると普通。
ある程度の意識の高さと前提知識がほんの少しあればついていけると思う。

Linux Mint 仮想マシンとデュアルブート比較

今回は、Linux Mint仮想マシンデュアルブート両方の環境を建ててちょっと使ってみての感想というかなんというかそういうものを書いていくよ。

あくまで僕個人の感想ですし、まだ両方共に使いこなせてない感があるので適当に読んでください。

それぞれの良い点悪い点

仮想マシンの良い点

  • ファイル共有が楽。VirtualBoxで共有フォルダを作成します。
  • 複数環境構築するのが楽。
  • ホストOS(windows10等)を起動しながら動かせる。

仮想マシンの悪い点

  • ホストマシンのスペックにもよるけど、動作が重くなる。
  • リソースをある程度までしか使えない。
  • 設定とかデバイス周りが面倒。前に認識してくれなかったことがあった

デュアルブートの良い点

  • 動作が速い。
  • リソースをフルで使える。
  • windowsのC:が標準でマウントされているので共有が楽。
  • 設定、デバイス周りがめんどくさくない。
  • なんかかっこいい。

デュアルブートの悪い点

  • ホストOSと同時に動かせないから、並列してどうこうはできない。
  • 初めてだと構築にめちゃくちゃ緊張する。

まとめ

どちらも長所短所を持っているので、自分に合った方を選ぶといいと思います。
その人がどう使うかにもよるので、正直どっちがいいとかわからないです。

僕自身としてはデュアルブートの方がいいと感じましたね。
僕はLinuxを触るとき基本windows触らないし、メインPCがwindowsだから全然不便はないです。
今回比較対象にしたマシンがThinkPad13というノートPCだったので、こういう結果になったのかもしれないです。

個人的に

仮想マシン

  • ハイスペックPC
  • 同時に使いたい
  • いろんな環境建てて楽しみたい

という方

デュアルブート

  • スペック低めで用途が限られている
  • 設定面倒
  • 重いの面倒

という方


におすすめって感じになるかと思います。


正直、ノートPCで仮想マシンはストレスマッハでした。

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

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



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