ダリアメモ@ブログ

日々思ったことや自分用のメモも含めプログラムの技術を淡々と書いていきます

SlackをBitbucket Cloudと連携する際に全てのブランチからのプッシュを通知したかった話

概要

SourceTreeでコミットした内容をSlackに通知したいという要望があったため、Bitbucket Cloudを使ってSlackに通知できるようにしてみました。

導入時に参考にしたサイトはこちらです。
murimuri.hateblo.jp


導入して色々やってみて、Slackに通知するにはBitbucket上でブランチ名を入力して通知設定の登録する工程があります。
f:id:daria_sieben:20190721173840p:plain

たくさんのブランチで運用していく際に全てのブランチ分名前と通知設定を設定するのはめんどくさかったため、どうにか同じ設定を全てのブランチで使い回せないかと思って調べて、うまく行ったやり方を書こうと思います。

やりかた

通知設定の登録の際にブランチ名を直書きだけでなく、特定の記法を用いることによって柔軟に通知をしてもらうようになります。
特定のパターンを用いるためにはBitbucket Cloud Supportの「Branch patterns for notifications」という項目に色々書いてあります。
confluence.atlassian.com

が、ここに書いてる'*'や'**'をやると全てのブランチや階層付きのブランチにも通知が行くようにできるかなと思っていたのですが、やってみるとプッシュしてもSlackの方に通知が来なかったです。

引用符なしの*や*/*だとうまく行ったのでとりあえずそれだと成功しました。(何故か**を登録しようとすると既に登録されていると怒られたので階層付きのブランチは/で代用しています)

f:id:daria_sieben:20190721171423p:plain

f:id:daria_sieben:20190721172605p:plain

最後に

若干力技でしたがやりたいことは出来ました。
このやり方のほうがいいよ!などがあれば教えていただけると幸いです

Unity2017 Game Optimization Tactical Tips and Tricks Editor Editor UI Tips 部分を翻訳かけながら読んだのでまとめてみた①

前回に引き続き翻訳した部分をまとめます。

daria-sieben.hatenablog.com


今回の部分は長かったので、何回かに分割して記事を書こうと思います。
前回と同じくgoogle翻訳かけて自分なりの解釈を混ぜているので、誤りがありましたら指摘していただけると助かります。

1.Script Execution Order

◯UpdateとFixedUpdateを持つスクリプトの優先順位を変更できます。
Edit→Project Settings →Script Execution Orderでウィンドウが開きます。


この機能を使うことで複雑な問題を解決できます(オーディオ処理など時間に敏感なシステムを除く)
ただし、これを使うのはコンポーネント間で脆弱で緊密な結合をしようとしていることを意味します。
ソフトウェア設計の観点から言えば、この機能を使う以外に別の解決策があるかもしれないという警告でもあります。
ですが、問題を素早く試す際にはとても便利です。

2.Editor Files

◯Unityのプロジェクトをバージョン管理システムと統合するのは難解です。最初にすることは、アセット毎に生成されるmetaファイルを含めることです。
これを行わないと、ローカルのUnityプロジェクトにデータを持ってくる人は、自分の環境でmetaファイルを再生性し、競合を引き起こす可能性があるため、誰もが同じバージョンを使用することが出来なくなります。
これを有効にするにはEdit→Project Settings→Editor Version Control→Mode→Visible Meta Fileを行う必要があります。


◯特定のアセットデータをバイナリデータではなくテキスト形式に変換して、データファイルを手作業で確認できるようにすると便利です。
例えば、スクリプタブルオブジェクトを使用してカスタムデータを保存する場合、
Unityエディタ及びシリアライズシステムを使わずにテキストエディタを使用して、検索及び編集することが可能となります。
これにより、特定のデータを検索する場合や、複数のテキストエディタを用いて編集を行う場合に、多くの時間を節約できます。
このオプションを有効にするには、Edit→Project Settings→Editor→Asset Serialization→Force Textに変更する必要があります。


◯エディタにはログファイルがあり、コンソールウィンドウを開き、右上の三本線のアイコン(本にはハンバーグアイコンと書いてあります)を左クリックで開き、Open Editor Logで開くことが出来ます。
これによりビルドが失敗した際の詳細な情報を知ることが出来ます。
また、プロジェクトが正常に構築された場合、exeファイルにまとめられた全てのアセットの圧縮ファイルサイズの内訳を見ることが出来ます。
これは、アプリケーションの大部分で使われているアセットと、予想されるよりも多くのファイルを占めるファイルを把握することが出来ます。


◯既存のウィンドウのタイトルを右クリックし、AddTabを選択するとエディタにウィンドウを追加できます。
これにより一度に複数のプロジェクトウィンドウやインスペクターウィンドウを開くなど、同じウィンドウを追加することが出来ます。
ウィンドウのロックを使用する一般的な手法は次のものがあります。

・同じオブジェクトを選択したら同じ情報が表示されるので、ロックアイコンを使用することで同じオブジェクトを並べて比較したり、あるオブジェクトから別のオブジェクトにデータを簡単にコピーしたりすることも出来ます。
・プレイモード中にオブジェクトに変更があった場合、どの様に変更されたか監視します。
・プロジェクトウィンドウで複数のオブジェクトを選択し、元の選択を失うことなくインスペクターウィンドウでシリアライズされた配列にドラッグ&ドロップします。

Unity2017 Game Optimization Tactical Tips and Tricks Editor HotKey Tips 部分を翻訳かけながら読んだのでまとめ

Unityの最適化周りの知見がまったくなかったため、Unity2017 Game OptimizationをKindleで購入しました。

Unity 2017 Game Optimization - Second Edition: Optimize all aspects of Unity performance

Unity 2017 Game Optimization - Second Edition: Optimize all aspects of Unity performance


今回は自分が興味あるエディタ周りのtipsのところを翻訳かけながら学んだことを書こうと思います。
google翻訳かけて自分なりの解釈を混ぜているので、誤りがありましたら指摘していただけると助かります。

1.GameObject

ヒエラルキーウィンドウでCtrl+Dを押した時に選択しているゲームオブジェクトの複製をすることが出来ます。
・Ctrl+Shift+Nで選択中の階層に新しい空のゲームオブジェクトを追加します。
・Ctrl+Shift+AでAddComponentメニューを素早く開くことが出来ます。

2.Scene Window

・シーンウィンドウが開いて表示されている状態で「Sfhit+Fキー」か「Fキー」を押すとヒエラルキーで選択しているゲームオブジェクトにカメラが追跡してくれます。
これは動きが早いオブジェクトや見つけるのが困難なオブジェクトを見つけるのに役に立ちます。
本にはFキーを2回押すと書いてありましたがFキー1回でもカメラが追跡してくれました。

・Alt+左ドラッグで現在選択しているゲームオブジェクトの周りをマウスが移動した方向にシーンウィンドウのカメラが回転してくれます。
また、Alt+右ドラッグでシーンウィンドウのカメラのズームイン/ズームアウトをしてくれます。

・シーンウィンドウで右クリックを押しながらWとSで前後、SとDで左右、EとQで上下にカメラを移動できる。(何故かArraysの項目に入っていたので本来はこっちだと思われます)

3.Arrays

・インスペクターウィンドウに表示されている配列要素選択し、Ctrl+Dを押すことでその要素を複製することが出来ます。
これは要素をコピーし、現在の選択している要素の次の要素の所に挿入します。
・Shift+Deleteを押すと、一連の参照(例えばゲームオブジェクトの配列)から要素を要素ごと削除出来ます。
要素がある場合は初期化(Null)になり、その後再び押すと要素ごと削除されます。
プリミティブ型(intやfloatなど)の配列で要素を削除するにはShiftを押さずにDeleteを押すだけで済みます。

4.Interface

・Shift+Spaceキーで現在アクティブになっているウィンドウが全画面表示され、もう一度Shift+Spaceを押すと全画面表示が解除され、ウィンドウは元の位置に戻ります。
・Ctrl+Shift+Pで一時停止になり、もう一度押すと解除される。
急いで止めたいのに3つのキーを同時に押すのは大変なので、以下のように自作ホットキーを使うことをおすすめします。

void Update() {
    if (Input.GetKeyDown(KeyCode.P)) {
        Debug.Break();
    }

WPFで便利だなと思ったものまとめ

なんだかんだWPFを触って4ヶ月経ちました。
今回はこれ便利だなと思ったものや手間取って時間を取られたたものをまとめようと思います。

◯ComboBoxのバインディング

やることはComboBoxにあるItemsSourceにコレクション変数を渡すだけ。

・サンプル

List<string> testList = new List<string>{“test”,”test2”};
comboBox.ItemsSource = testList;

これでComboBoxのリストにtest,test2が追加される
バインディングしているのでこのtestListに要素を増やしたり減らしたりすればちゃんとComboBoxにも反映されるようになっています。
これだとstringなのでそのまま表示されるようになりますが、クラスのメンバ変数で表示するようにしたかったら
ComboboxのDisplayMemberPathにメンバ変数名を入れれば反映されるようになります。


◯ObservableCollectionに要素を追加したり削除したりする時にイベントを呼ぶ

ObservableCollectionは要素を追加したり削除したりするときにイベントを呼ぶ事が出来ます。
これを使えば追加したタイミングに別の処理を入れるといった使い方もできます。
最近作ったツールの例だと、追加された要素に対してTypeのGetTypeで型を調べ、
それに応じて追加するUIを変えStackPanelやListBoxに動的生成して追加するといったことをしました。

・サンプル

private void AddRemoveEvent(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    //追加処理
    if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
    {
    //型取得
        string typeName =e.NewItems[0].GetType().Name;
        var objectType = Type.GetType(typeName );
        //インスタンス生成                
        var objectInstance = Activator.CreateInstance(objectType);
        UserControl control = (UserControl)objectInstance;
        //要素追加
        stackpanel.Children.Add(control);
    }
    //削除処理
    else if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Remove)
    {
    //最初の要素を消す
        stackpanel.Children.RemoveAt(0)
    }
}


◯画像ファイルを別の場所にコピー

Imageなど表示してる画像ファイルを他のディレクトリにコピーしたい場合、画像ファイルをFile.Copy関数でコピーしようとします。
するとImageクラスSourceプロパティがそのままだとそのファイルがアプリケーション側で占用されていて、コピーや削除などファイルに対しての操作が出来ません。
なので画像の生成方法を変えるようにする必要があります。

・サンプル

//カレントディレクトリにあるtest.pngを元に生成
Uri uri = new Uri("test.png", UriKind.Relative));

//==================駄目な方法=================================================

//Uriをもとにビットマップ生成
BitmapImage bitmap = new BitmapImage(uri);

//生成したBitmapインスタンスをそのまま渡す
image.Source = bitmap;
//===============================================================================


//==================良い方法===================================================

//ビットマップ生成
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.UriSource = uri;
bitmap.EndInit();
//Imageクラスに別の方法で生成したBitmapのインスタンスを渡す
image.Source = bitmap;
//===============================================================================
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.UriSource = uri;
bitmap.EndInit();

この4つを使うことによってアプリケーションにファイルを占有されない方法で生成することが出来ます。
他にも方法はありますが今回は自分が使ってるこの方法で(こっちのほうがいいよとかあったら教えてくださると嬉しいです)

◯ファイルやディレクトリ以外のドラッグ&ドロップ

よくドラッグ&ドロップで取得したファイルやディレクトリを使ってやり取りしているのですが、これは別にファイルやディレクトリじゃなくても出来るようです。
最近作ったツールだとStackPanelに表示しているUIのDataContextをDragするデータとして渡して、
ドロップ先でデータをキャストして成功したら挙動を変えるといった使い方をしました。

・サンプル

//ドラッグ側
private void TestDrag(object sender, MouseButtonEventArgs e)
{
      //Imageクラス
      Image img = sender as Image;
      //ImageのDataContext(仮にNameというstringのプロパティを持ったTestクラスとする)をドラッグするデータとして渡す
   DataObject dataObj = new DataObject(typeof(Test), img.DataContext);
      DragDrop.DoDragDrop(img , dataObj, DragDropEffects.All);
}
//ドロップ側
private void TestDrop(object sender, DragEventArgs e)
{
      //受け取ったデータがTestクラスかどうかキャストする
      Test test = e.Data.GetData(typeof(Test)) as Test;
      if(test != null)
      {
     //成功したことを書き込む
          test.Name = "ドラッグ成功";
      }
}

以上です。
また何か便利なものがあったら書きます。

WPF Styleまとめ

WPFのStyleを使ってみたのでまとめ。

Styleを使うと選択した物によって文字の色を変えたり
f:id:daria_sieben:20160924221249p:plain:w300


Triggerというプロパティやバインディングの状態によって値を変えることによって、
テキストの上にマウスが乗ったら文字の透明度をあげたり、
クリックするたびに画像を切り替えるなど、色々とできます。
f:id:daria_sieben:20160925104239p:plain
f:id:daria_sieben:20160925104242p:plain


○画像の切り替え

<Image>
   <Image.Style>
      <Style TargetType="{x:Type Image}">
         <Style.Triggers>
            <DataTrigger Binding="{Binding IsPlay}" Value="False">
	       <Setter Property="Source" Value="play.png"/>
	     </DataTrigger>
	     <DataTrigger Binding="{Binding IsPlay}" Value="True">
	       <Setter Property="Source" Value="Stop.png"/>
	     </DataTrigger>
	 </Style.Triggers>
      </Style>
   </Image.Style>
</Image>


:解説
DataTriggerはバインディングで使われる。
今回はボタンがクリックされるたびにフラグを切り替えるプロパティを用意し、
その値がTrueだったらStop、されてなかったらPlayの画像を読み込むといったことをしている。
今回はクリック毎に画像を変えるのがXAML上では出来なくてそうしてる(調べが甘いだけでほんとは出来るのかもしれない)が、
マウスが上に乗ったら(IsMouseOverプロパティ)を使えば透明度を上げたりして強調するなども出来る。


○選択した物によって文字の色を変える

<Style TargetType="TextBlock" x:Key="EventItem">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Category}" Value="0">
            <Setter Property="Foreground" Value="{StaticResource RedBrushColor}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Category}" Value="1">
            <Setter Property="Foreground" Value="{StaticResource GreenBrushColor}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Category}" Value="2">
            <Setter Property="Foreground" Value="{StaticResource BlueBrushColor}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>


:解説
上と同じようにDataTriggerを使って文字色を切り替えをしている。
使われてるプロパティは↓(ReactivePropertyを使っているのでINofityPropertyを継承せずに自動実装プロパティを使ってます)

public class EventAnimation
{
    public string Name
    {
        get;
        set;
    }
    public uint Category
    {
        get;
        set;
    }
}
    


このCategoryプロパティはコンボボックスにもバインディングされているので、
コンボボックスで値が変わったら自動的に文字色が変わる仕組みになっています。
また、上記と違ってListBoxのItemに使われているのでStaticResource化しているのも特徴です。

<ListBox.ItemTemplate>
    <DataTemplate>
        <StackPanel>
            <TextBlock Text="{Binding Name}" Style="{StaticResource EventItem}" />
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>


今回は以上です。
また何か触ったら書こうと思います。

C#で生成した実行ファイルのアイコンの変え方

タイトル通りです。
簡単すぎて記事にすることでもないような気がしましたが一応メモ代わりに。

まずアイコンを変えたいプロジェクトを右クリック、もしくは上のメニューバーのプロジェクトクリックし、○○(プロジェクト名が入る)のプロパティを選択。
自分はRenderiaってプロジェクトなのでRenderiaのプロパティを開きます。

右クリックの場合:
f:id:daria_sieben:20160902002809p:plain:w300:h300


メニューバーの場合:
f:id:daria_sieben:20160902002914p:plain:w300:h300


そうしたら設定画面が出るので、右下の赤い矢印部分をクリック。
f:id:daria_sieben:20160902003701p:plain:w400:h300


ダイアログが出るので、拡張子が.icoのファイルを選択して開きます。
f:id:daria_sieben:20160902010346p:plain:w400:h300


後は設定を保存してビルドするとこんな感じにexeのアイコンが変わります。
f:id:daria_sieben:20160902005416p:plain

以上です。
アイコン変わるだけでモチベーションも変わると思うのでおすすめです。

C#のクラスは参照型、構造体は値型

タイトル通りです。

クラスのインスタンスを別のクラスのインスタンスで代入したら
値がうまくいかなくてあれ?って思ったら、
C#のクラスは参照型なので代入したら別のクラスのインスタンスと共有されてしまったというわけですね。

参考にしたサイト:
ufcpp.net

なのでC++と違って構造体とクラスは全く別物みたいですね。
下手にいじられても困るし、構造体に乗り換えようかなと思って使ってみましたがまた罠が…。

構造体の要素にアクセスする際に、一回ローカルで構造体を作ってそこに代入していじる形にしないとコンパイルエラーが出るみたいですね。

List<myStruct> list = {…};
MyStruct ms = list[0];
ms.Name = "MyStruct42";
list[0] = ms;

参考にしたサイト:
https://msdn.microsoft.com/ja-jp/library/wydkhw2c.aspx

リファクタリングしてる最中だったので、これはこれでめんどくさいなと思って結局クラスを使うことにしました。
何かいい方法がないのだろうか…。