ベスパリブ

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

Shift-JISのC言語のソースをコンパイルすると「warning: multi-line comment」が出る

謎バグで悩まされたソースコード

// アナログ値のテーブル表
sprintf((char*)tmp_str, ",アナログ値,合計"); //なぜかこれがないと以前のtmp_strが出力される
sprintf((char*)tmp_str, ",アナログ値,合計");
tcp_send_writeline( SmtpSocket, (BYTE*)tmp_str, 1 );
...(略)

C言語でこんなコードを書いてる人がいました。僕ですけど。
問題なのは、コメントアウト行。
Shift-JISで書かれたCのソースは、『表』で終わらせてはダメ。

SHIFT-JISのダメ文字

検索したらでてくるでてくる。時代を超えてる感ある。

C言語コンパイル時『warning: multi-line comment』に注意すること - 日々情報収集...

時代はUTF-8なので、良い子はUTF-8使おうね。

Please move or remove them before you can switch branches.

branchにcheckoutできない。

git checkout .

作業を取り消すにはこれ。実行する。
しかしまだ同じエラーが出る。

git clean -f

http://qiita.com/konweb/items/061475d6376db957b3c4
これをするといいらしいので、実行。
しかしまだ同じエラーが出る。

Please move or remove them before you can switch branches.

エラーメッセージの「branch切り替える前にファイルを削除して」という言葉を実行する。

rm folder1/folder2/folder3/* -r //フォルダ内を再帰的に削除

エラーが消えてbranchが切り替えられるようになった。

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することで、公開鍵はいつでも確認できる。なので秘密鍵は無くさないように大事にすること。