読者です 読者をやめる 読者になる 読者になる

ベスパライフ

日記・備忘録。ベスパもってないです。

VB6.0でWebBrowserを使用してセレクトボックスを操作する

VB6.0

まえがき

あまりにもレガシー過ぎてググってもリファレンスもドキュメントもそんなに残っていない。
適当にVBAのコードを書いたら動いた。

本題

htmlのソース

<select id="Contact" name="Insw" >
<option value=0 selected >入力0</option>
<option value=1 >入力1</option>
</select>

やりたいことは、selectedされているoptionを取得し、他方のoptionを選択する。
上の例では、入力0がselectedされているので、入力1を選択したい。

VB6.0のコード

Dim elem As Object
Dim elem2 As Object
Dim obj_select As Object
Dim i As Long
'-------------------------
'--------------------------------------------------------
'セレクトボックスを変更する処理
'--------------------------------------------------------
For Each elem In WebBrowser_AutoConnect.Document.All.tags("select")
    If elem.getAttribute("name") = "Insw" Then    
        For Each elem2 In WebBrowser_AutoConnect.Document.All.tags("option")
            If elem2.getAttribute("selected") = True Then    
                If elem2.getAttribute("value") = 0 Then
                    '入力0が選択されているならば、入力1に切り替える
                    Set obj_select = WebBrowser_AutoConnect.Document.getElementsByName("Insw")(0)
                    'セレクトボックス(入力1)を選択
                    obj_select.selectedIndex = 1
                    Exit For
                Else
                    '入力1が選択されているならば、入力0に切り替える
                    Set obj_select = WebBrowser_AutoConnect.Document.getElementsByName("Insw")(0)
                    'セレクトボックス(入力0)を選択
                    obj_select.selectedIndex = 0
                    Exit For
                End If
            End If
        Next
        Exit For
    End If
Next

間接演算子のインクリメント

C言語

以下の様な処理で、予期しない動作をしてかなり悩んだ

func(char* hoge){
*hoge ++;
}

実際にはもっと処理は長いのだが、どこが原因かを突き止めること自体に悩んだ。

上記の意図としては、hogeのアドレスが指し示す値をインクリメントして欲しくて記述したものだった。つまり次のような意図で記述した

(*hoge) ++;

しかしそうはならず、次のように動作した

*(hoge ++);

演算子の結合性の優先度云々の話なのだが、まさかここでつまずくとは思わなかった。
たしか優先度はコンパイラにも言語にも依存するので曖昧な記述をした自分が悪いのだが、あまりにも直感に反した動作をされてショックを受けた。

また似たような話で、ポインタ変数を宣言するときに

char* hoge;

とするのは、結合性の観点から見るとやめておいたほうがよい。推奨は次のような記述である。

char *hoge;

char* hogeのほうが「charのポインタ変数なんだな」感がでて良いと思うかもしれないが(というか自分はそう思うのだが)、次のような書き方をしたときには注意が必要である。

char* hoge, piyo;

これはchar型のポインタ変数hogeと、char型の変数piyoが宣言されている。
見た目による直感的な動作とは異なるし、全てをポインタ変数にするならば全てに*をつけなければならないので、char *hogeと書いたほうが良い。
曖昧な記述は避けるべきという考え方からすると、見た目による直感に反した動作をする書き方は避けるべきだろう。

間接演算子*を使用するときは、カッコ付きで記述するようにしたほうがわかりやすい。だって

*hoge += 10;

上記が どのような動作をするか、自信をもって答えられないんだもん(だもん)。

after resolving the conflicts, mark the corrected paths with 'git add <paths>' or 'git rm <paths>' and commit the result with 'git commit'

git

(他ブランチの)特定コミットをmasterブランチにコミットする。

git checkout master
git cherry-pick [コミットID]

当たり前のようにエラーが出る。

hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'

コンフリクトを解消した後、git addかgit rmして正しいパス(ファイル)をマークして、そしてgit commitしてください(マークってなんだよ)。

マージされていないファイルを見る。

git ls-files -u

ls-filesの詳細は以下のサイトが詳しい。
http://transitive.info/article/git/command/ls-files/

現在の状態を見てみる。

git status
...(略)
Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   hogehoge.c
        both modified:   fugafuga.c

hogehoge.cとfugafuga.cを手作業でコンフリクトを解消してやるのが普通のやり方。
でも多くの場合、マージ先かマージ元を優先してコミットをしている。そのときはcheckout --oursまたはcheckout --theirsを使えば一発。
詳細は以下のサイトが詳しい。
http://blog.digital-squad.net/article/151034635.html

今回はマージ元(develop)を優先してマージ先(master)にコミットしたいので、--theirsを使う

git checkout --theirs hogehoge.c
git checkout --theirs fugafuga.c

git statusを見る。

...(略)
Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   hogehoge.c
        both modified:   fugafuga.c

あれ?変わってないじゃん。

とりあえずhogehoge.cの中身をエディタで見てみよう。<<<<<<< HEADがなくなっていることがおかわりだろうか。世界は修正されたのである。

ということでaddしてcommitする。

git add .
git commit

おわりだが、ついでにpushしてリモートリポジトリに反映しておこう。
pushのやり方を忘れた?以下のサイトが詳しい。
http://shoma2da.hatenablog.com/entry/2014/03/08/234523
origin masterよりもorigin master:masterのほうがわかりやすい。省略系って嫌いなんだよね。

git push origin master:master

RaspberryPi2 ModelBの無線LANの設定

RaspberryPi

RasberryPi2 ModelBを購入。無線で接続したかったので、Amazon.co.jp: PLANEX 無線LAN子機 (USBアダプター型) 11n/g/b 150Mbps MacOS X10.10対応 GW-USNANO2A (FFP): パソコン・周辺機器を購入。
しかしなかなか繋がらない。かなり苦戦したので設定の備忘録。

/etc/network/interfacesの設定

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
#iface wlan0 inet static
iface wlan0 inet dhcp
address 192.168.**.** #*は任意の数字
netmask 255.255.**.**
gateway 192.168.**.**
wpa-conf /etc/wpa-supplicant/wpa-supplicant.conf
iface default inet dhcp

auto wlan0はラズパイを起動した時に自動的に立ち上がる設定
allow-hotplug wlan0はホットプラグイベントを拾う設定。ホットプラグイベントとはUSBを挿したら発生する。

/etc/wpa_supplicant/wpa_supplicant.confの設定

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid ="***"
        psk="***"
        key_mgmt=WPA-PSK
        #prot=#WPA2
        #pairwise=CCMP
        #GROUP=CCMP
        #priority=2
}

色々試した結果、prot以下をコメントアウトしたら接続できた。

DHCPで設定しているが、本当は静的に設定したかった。
【追記】
静的にするには、/etc/network/interfacesの設定を以下のように変更する

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet manual

auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
#iface wlan0 inet dhcp
address 192.168.**.** #*は任意の数字
netmask 255.255.**.**
gateway 192.168.**.**
wpa-conf /etc/wpa-supplicant/wpa-supplicant.conf
#iface default inet dhcp

auto wlan0はラズパイを起動した時に自動的に立ち上がる設定
allow-hotplug wlan0はホットプラグイベントを拾う設定。ホットプラグイベントとはUSBを挿したら発生する。

/etc/wpa_supplicant/wpa_supplicant.confの設定

iface wlan0 inet dhcpとiface default inet dhcpをコメントアウト。代わりにiface wlan0 inet staticを有効にする。


上記の設定を反映させるには、ラズパイを再起動するか、
sudo /etc/init.d/networking restart

BitbucketのSSHキー登録の方法

Bitbucket git SSH

BitbucketにSSH用の公開鍵を登録する

まずBitbuketにアクセス。
右上の人型のアイコンをクリック>「アカウントの管理」
すると管理ページが開くので、左の「セキュリティ」メニューから「SSHキー」をクリック>「鍵を追加」

f:id:takeg:20151027104544p:plain
Labelは適当に「RepositoryName_KEY」とかにする。
Keyの部分に公開鍵を貼り付けるのだ。

秘密鍵と公開鍵の生成

Putty Key Generatorで両方生成できる。
このとき注意なのが、Bitbucketに公開鍵を貼り付けるとき、Putty Key Generatorで表示されているやつをコピペしないとうまく認識されない(「無効なSSHキーです」とか言われる)。
f:id:takeg:20151027103430p:plain
画像赤部分をコピペ
Putty Key Generatorから秘密鍵をLoadすることで、公開鍵はいつでも確認できる。なので秘密鍵は無くさないように大事にすること。

シェルスクリプトでfor文が回せなかった話

シェルスクリプト bash Ubuntu

環境はUbuntu14.04LTS。

問題

シェルスクリプトで次のようなfor文を記述した。

#!/bin/sh
for i in {1..10}
do
	echo " $i 回目のループです."
done

その結果が以下である。

{1..10} 回目のループです.

どうやら、変数iの中にリスト{1..10}がまんま代入されたらしい。意味分からん。

なぜ?

他サイトのシェルスクリプトの記述例を見ても、何がおかしいのかわからない。基本的なfor文を回せないことにショックを受けつつググりまくっていると、以下のサイトを見つけた。sechiro.hatenablog.com

bashとshは違うらしい。曰く、

sh という名前で bash を起動すると、 bash は古くからある sh の起動動作をできるだけ真似しようとします。

らしい。bashもshも同じだと思ってました。というかshはbashの省略系かと思ってました。
そんなこんなで調べていると、以下のようなサイトも。
Ubuntuの/bin/shはbashではなくdashsiguniang.wordpress.com

dashなんてものもあるらしい。まったく知らなかった。

解決策

結局、どうすればいいのか?次のように記述して解決した。

#!/bin/bash
for i in {1..10}
do
	echo " $i 回目のループです."
done

その結果が以下である。

 1 回目のループです.
 2 回目のループです.
 3 回目のループです.
 4 回目のループです.
 5 回目のループです.
 6 回目のループです.
 7 回目のループです.
 8 回目のループです.
 9 回目のループです.
 10 回目のループです.

なにを変えたかおかわりだろうか。
最初の

#!/bin/sh

#!/bin/bash

に変えたのだ。分かり辛いよシェルスクリプト。半角スペース付けただけでエラー起こしたりするところもな。

badworld.sh

#!/bin/bash
str = "Hello World!"
echo $str

実行結果

./badworld.sh: 行 2: str: コマンドが見つかりません

goodworld.sh

#!/bin/bash
str="Hello World!"
echo $str

実行結果

Hello World!

間違い探しかよ。

検定とはなんぞや

検定 備忘録

検定についての備忘録。「Excelでできる統計解析」という本を参考にした。

検定とは

ある農園では、収穫したりんごの平均の重さが250gであった。もっと大きいりんごを収穫したいと考え、肥料Aを使って栽培した。翌年、収穫したりんごの平均の重さは255gになった。
前年とくらべてりんごの重さが平均5g増加したが、これは肥料Aの効果と言っていいのか?
「肥料Aには効果があった」という仮説と、「肥料Aには効果がなかった」という二つの仮説を立てて、どちらが正しいか統計的に検証する。それが検定。

帰無仮説と対立仮説

肥料Aを与えたことによってりんごの平均の重さがμになったとする。
肥料Aに効果があればμ>250となる。
肥料Aに効果がなければμ=250となる。
前者を対立仮説(H_0)、後者を帰無仮説(H_1)と呼ぶ。
また別の対立仮説として、μ≠250とも書ける。
どうやら「>」や「≠」で記述する仮説を対立仮説、「=」で記述すると帰無仮説になるらしい。

両側検定と片側検定

上記のように対立仮説は状況によって書き方が変わる。書き方が変われば、検定の方法も変わる。大きく分けて「両側検定」と「片側検定」がある。

従来のりんごの平均の重さをμ_0、肥料Aを与えた後のりんごの平均の重さをμとすると、「肥料Aはりんごに影響を与えたか」を調べるための帰無仮説H_0と対立仮説H_1は次のように書ける。

H_0:μ=μ_0H_1:μ≠μ_0

また、「肥料Aはりんごの成長を促進したか」を調べるための帰無仮説H_0と対立仮説H_1は次のように書ける。

H_0:μ=μ_0H_1:μ>μ_0

このように、対立仮説H_1が「≠」で記述されるときを両側検定と呼び、「>」で記述するときを片側検定と呼ぶ。

検定の手順

仮説をたてる

帰無仮説と対立仮説を立てる。対立仮説は両側検定か片側検定のどちらを使うかも考慮する。

両側検定を使うシーンとしては、「影響があったか」や、「変化があったか」といった、2つの値に差があるかどうかを調べるときに使う。

片側検定を使うシーンとしては、「値が大きく(小さく)なったか」といった、影響によって大きくなったのか小さくなったのかを調べるときに使う。

検定統計量を求める。

どの値を検定に使うかを決める。りんごの例で言うと平均値を使っている。ここで使われる統計量のことを検定統計量と呼ぶ。

検定統計量から採択/棄却を判断する

検定統計量は標本から計算されるので、確率変数になっている。よって検定統計量は何らかの確率分布に従っている。

標本から検定統計量を計算した結果、その値が確率分布の中央らへんになっていれば、「十分に起こりえる」として、帰無仮説は棄却されない。
りんごの例で言うと、帰無仮説が棄却されない場合、「肥料Aを与えたあとも平均の重さが変化したとは言えない」ということが示される。

一方、値が確率分布の端っこにある場合、「別の集団からの検定統計量がありそう」ということで、帰無仮説は棄却される。
りんごの例で言うと、「肥料Aを与えた後は、平均の重さに変化がないとはいえない」ということが示される。

有意水準

検定では検定統計量を算出して、その値が確率分布のどの位置にあるかで帰無仮説が棄却されるかされないかを決定する。
この「確立分布のどの位置にあるか」というのを判断するラインを有意水準と呼ぶ。
「検定統計量が端から2.5%以内の確率の範囲に位置したら、帰無仮説を棄却する」というように決められる。有意水準を境目として、帰無仮説が棄却される領域を棄却域、採択する領域を採択域と呼ぶ。

有意水準5%で両側検定をする場合、確立分布の両側2.5%ずつを境目とする。
有意水準5%で片側検定をする場合、確立分布の片側5%を境目とする。

だいたい有意水準は5%だが、1%でする場合もあるらしい。