ベスパリブ

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

.gitignoreで、あるディレクトリの中身すべてを無視しない

次のようなディレクトリ構成があるとします。

├hoge2.txt
├hoge1.txt
├.gitignore
└main/
 ├ taskA/
 │ └ taskAA/
 │   └ taskaa.py
 └ test1.py
 └ test2.py

main/ディレクトリの中すべてのみをgitで管理したかったので、次のように書きました。

.gitignoreの中身

*         # すべて無視する
!/main/*  # ただしmain/ディレクトリ以下のファイルすべては除く

しかしこれではうまくいきませんでした。
この状態で git add . しても、なにもステージングされません。
この状態でステージングできるのは、main/ディレクトリのみです。しかし、gitは空のディレクトリのみは管理できないらしいので、実際は何もステージングされないということ(らしい)です。

main/ディレクトリ以下のファイルをステージングしたいならば、まずmain/ディレクトリ自体を除外する必要があります。

.gitignoreの中身

*         # すべて無視する
!/main/   # ただしmain/ディレクトリは除く
!/main/*  # ただしmain/ディレクトリ以下のファイルすべても除く

これでもまだダメです。
この状態でgit add .したら、次のファイルがステージングされます。

  • main/test1.py
  • main/test2.py

どうやら、ステージングされるのはmain/ディレクトリ直下のファイルのみのようです。
main/ディレクトリ直下のディレクトリも含めたすべてをステージングしたいならば、次のようにします。

.gitignoreの中身

*           # すべて無視する
!/main/     # ただしmain/ディレクトリは除く
!/main/**   # ただしmain/ディレクトリ以下のファイルもディレクトリすべても除く

これでOKです。
git add .すると、次のファイルがステージングされます。

  • main/test1.py
  • main/test2.py
  • main/taskA/taskAA/taskaa.py

難しいですね。

参考URL
http://qiita.com/anqooqie/items/110957797b3d5280c44f

ユーザコントロールから自身のWindowを取得する。それとLoadedイベント

Visual Studio 2010のWPFでアプリを開発中。
Windowにユーザコントロールを設置してあり、そのユーザコントロールのボタンが押された時にWindowのコントロール(ボタンとか)を制御したい。

ユーザコントロールから自身のWindowを取得するのは簡単。

(Window1) win = (Window1)Window.GetWindow(this);

ただ、このコードをユーザコントロールのコンストラクタに書いたらNullReferenseのエラーが発生する。
Loadedイベントとかに置いたらエラーは発生しない。
というわけでxamlにLoadedイベントを作ろう。

Control_MyControl1.xaml

<UserControl x:Class="MyProject1.Control_MyControl1"
                      xmlns="http://schemas.microsoft.com/womfx/2006/xaml/presentation"
                      (略)
                      Loaded="Control_MyControl1_Loaded" > <!-- Loadedを追加 -->

xaml.csにLoadedイベントハンドラを追加する

Control_MyControl1.xaml.cs

using System;
(略)
namespace MyProject1{
   public partial class Control_MyControl1: UserControl
   {
      (略)
      private void Control_MyControl1_Loaded(object sender, RoutedEventArgs e){
         (Window1) win = (Window1)Window.GetWindow(this);  
      }
   }
}

本当にLoadedイベントで良いのか?という疑問は残る。

似たような機能の関数を区別しやすいような関数名をつける

「左側のメニューにある複数のボタンのそれぞれについて、クリック可能/不可能を更新する」みたいな関数名をつけるとき、次の2種類を考えた。
・UpdateLeftSideMenuClickable
・UpdateClickableOfLeftSideMenu

どちらがよいか悩んだ時の方針として、とりあえず似たような機能の関数をつくってみる。

・UpdateLeftSideMenuClickable
・UpdateRightSideMenuClickable
・UpdateTopMenuClickable
・UpdateBottomMenuClickable

・UpdateClickableOfLeftSideMenu
・UpdateClickableOfRightSideMenu
・UpdateClickableOfTopMenu
・UpdateClickableOfBottomMenu

下側のほうが「UpdateClickableOf」まで共通なので、ぱっと見て区別がつくし、整理されている。
下のほうが良いよね、という話。

C# 16進数文字列を数値に変換する

数値を16進数文字列に変換するのはWEBを探せばよくあるが、その逆は見かけなかったので。

using System;
using System.Globalization;

public class Test
{
    public static void Main()
    {
    // your code goes here
    string str = "FF";
    int ans = int.Parse(str, NumberStyles.AllowHexSpecifier);

    Console.WriteLine("str:" + str);
    Console.WriteLine("ans:" + ans);
    }
}

↓結果

str:FF
ans:255

NumberStylesを使うためにはusing System.Globalizationが必要。

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