プログラマになる

組み込みエンジニアで主にC言語、時々C#をやっている人の技術メモです。

C# BeginInvokeとInvokeの違い

はじめに

WPFアプリ作成中にBeginInvokeとInvokeを使い分ける必要があったのでメモる。

Dispatcher.BeginInvoke

スレッドでデリゲートを非同期的に実行、 Dispatcher に関連付けられています。

Dipatcher.Invoke

指定したデリゲートをスレッドで同期的に実行、 Dispatcher に関連付けられています。

まとめ

BeginInvokeは非同期のためRace Conditionなど引き起こす可能性がある。
処理によってはBeginInvokeとInvokeを意識して使い分けしないければならない。
BeginInvokeを無意識で使っていたら複数から処理が実行されていたので注意する。

Android ADB 使い方

ADBコマンドの初歩的な使い方をメモります。

Emulatorの一覧を確認する

adb devices

シェルを起動する

adb shell

ファイルを送信する

adb push local_file remote_path

ファイルを受信する

adb pull remote_file local_path

アプリケーションをインストールする

adb install apk_file

アプリケーションをアンインストールする

adb uninstall package_name
※package_nameはAndroidManifest.xmlに記載されているものを指定する。

C# WPFでミュージックプレイヤーを作った話

はじめに

C# WPFを用いてミュージックプレイヤーを作成したので紹介します。
AndroidiOSのアプリのUIをそのまま継承したようなアプリケーションです。

f:id:kaleidot725:20171028220645p:plain

できること

  • ライブラリ機能
  • 再生、停止、一時停止、リピート
  • flacとmp3とwaveファイルの再生

作ろうと思ったきっかけ

  • 自身の開発能力アップ、取り敢えずオブジェクト指向の基本を理解したかった。
  • Groove Music」とか「iTunes」とか全画面でないとまともに表示できない
    なのでコンパクトなミュージックプレイヤーが欲しいと思ったから。

作って思ったこと

  • オブジェクト指向がわかってくると楽しい、基本は取り敢えず抑えることができた
  • 休日に作っていると思ったより進まない、Minimum Viable Productを心がける
  • Groove Musicと同じ機能・品質を目指すとなると技術と時間が必要(Groove Musicわりとすげーなと思った)

さいごに

手を動かして作ると技術力が向上することをしみじみ感じたので
何かまた課題を見つけてコツコツ作ろうと思う。
ちなみにソースコードこちらです。

デザインパターン 遅延読み込み(LazyLoading)

定義

Wikipedia 遅延読み込みによると以下の意味らしい。

遅延読み込み(ちえんよみこみ、英語: Lazy loading)とは実際にオブジェクトが  
必要とされたときに後から初期化を行うソフトウェアデザインパターンの一つである。

Lazy Initialization

遅延読み込みだけでもデザインパターンが複数あるらしい、
遅延初期化(英語: lazy initialization)を以下にまとめる。

MARTINFOWLER.COMを参考して特徴をまとめる。

  • Lazy initializationは最適化するためのテクニックである。
  • 遅延させることで初期化を早くし利用者が望む
    タイミングで初期化処理を開始できるようになる。
  • パフォーマンス改善のテクニックなので
    問題がない限りLazy initializationは使わないほうがよい
  • このテクニックを利用するとデバッグに苦労する
    初期化が遅延されるためシステム上で存在しない状態が一時的に生まれるため

まとめ

このデザインパターンは最終手段的なものなのかなと思う。
むやみやたらに使うものではないことはわかった。

備考

C#だと.NET4.0以降は遅延初期化を実現するLazyとLazyInitializerというのがあるらしい
[C#] 遅延初期化を実現する3つのパターンと2つのクラス...

C# structとobjectをマッピングする

概要

C#からC言語で記述されたDLLを呼び出す機会が少なからずある。
その時に必ずstruct定義を引数としてデータ設定・取得を行う。

組み込み系だと1バイトのビットフィールドに情報を詰め込むことがあり、
これをそのままアプリケーション側に渡すと使いづらいし面倒だしやっかいになる。
なのでDLLから取得した時点でobjectにマッピングし、アプリケーション側で使いまわしやすくしてやる。

ソースコード

struct MainteStruct
{
    public byte status1;
    public byte status2;
    public byte status3;
}

class MainteObject
{
    bool error1;
    bool error2;
    bool error3;
    bool error4;

    public MainteObject(MainteStruct mainteStruct)
    {
        error1 = ((mainteStruct.status1 & 0x01) == 0x01) ? (true) : (false);
        error2 = ((mainteStruct.status1 & 0x02) == 0x02) ? (true) : (false);
        error3 = ((mainteStruct.status1 & 0x04) == 0x04) ? (true) : (false);
        error4 = ((mainteStruct.status1 & 0x08) == 0x08) ? (true) : (false);
    }
}

C# Visibilityとは

Visibilityを制御する必要があるUIを作成した際に調べたのでメモる。

Visibility列挙型

Collapsed

要素を表示しない、レイアウトの領域も確保しない

Hidden

要素を表示しない、レイアウトの領域を確保する

Visible

要素を表示する、レイアウトの領域を確保する

まとめ

実際に表示してみると以下のような感じになる

<Window x:Class=\"WpfNavigationService.View.Window\"
        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"
        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"
        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\"
        xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"
        xmlns:local=\"clr-namespace:WpfNavigationService.View\"
        mc:Ignorable=\"d\"
        Title=\"Window\" Height=\"200\" Width=\"200\">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width=\"1*\"/>
            <ColumnDefinition Width=\"1*\"/>
        </Grid.ColumnDefinitions>
        <StackPanel Background=\"White\" Grid.Column=\"0\" Grid.ColumnSpan=\"1\">
            <TextBlock Text=\"Visibility\" Visibility=\"Visible\" Background=\"Red\" Foreground=\"White\"/>
            <TextBlock Text=\"Collapsed\" Visibility=\"Visible\" Background=\"Green\" Foreground=\"White\"/>
            <TextBlock Text=\"Hidden\" Visibility=\"Visible\" Background=\"Blue\" Foreground=\"White\"/>
            <TextBlock Text=\"Visibility\" Visibility=\"Visible\" Background=\"Red\" Foreground=\"White\"/>
        </StackPanel>
        <StackPanel Background=\"White\" Grid.Column=\"1\" Grid.ColumnSpan=\"1\">
            <TextBlock Text=\"Visibility\" Visibility=\"Visible\" Background=\"Red\" Foreground=\"White\"/>
            <TextBlock Text=\"Collapsed\" Visibility=\"Collapsed\" Background=\"Green\" Foreground=\"White\"/>
            <TextBlock Text=\"Hidden\" Visibility=\"Hidden\" Background=\"Blue\" Foreground=\"White\"/>
            <TextBlock Text=\"Visibility\" Visibility=\"Visible\" Background=\"Red\" Foreground=\"White\"/>
        </StackPanel>
    </Grid>
</Window> 

f:id:kaleidot725:20170423202810p:plain