ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

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

まえがき

あまりにもレガシー過ぎてググってもリファレンスもドキュメントもそんなに残っていない。
適当に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

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

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

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'

(他ブランチの)特定コミットを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の設定

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に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文が回せなかった話

環境は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!

間違い探しかよ。

「お使いのパソコンの性能が低下しています」的な広告表示を消した(多分)

概要

以前の記事の方法でも消えなかったアドウェア。それが解消したっぽいので追記。

症状

勝手にブラウザが立ち上がって、「最新のJavaにUpdateできます」とか表示され、絶対僕の知ってるJavaじゃない何かをインストールさせようとする怖いサイトが表示される。しかも2窓。

解決方法

「AdwCleaner」というアドウェア削除のフリーソフトを使用した。そもそもなぜ勝手にアドウェアがインストールされたかというと、信頼のできないリンクからソフトウェアやツールをダウンロードしてインストールした際に、アドウェアも追加でインストールされたことが原因だと思われる。信頼できそうなサイト以外からはソフトウェア等をダウンロードしないことが肝要。具体的にはVectorとか窓の杜とか。よって、このサイトからも「AdwCleaner」のダウンロード先リンクを貼らないことにする。その理由は、「AdwCleaner」が安全なソフトウェアか絶対的な確信が持てないことと、自己責任で使ってほしいこと、安全なダウンロード先を自身で探して見つけてほしい等の理由からである。ちなみに私はVectorからダウンロードしました。
使い方なども自己責任でお願いします。多分レジストリとかもいじってるはずなので、怖くて適当なこと書けないです。