Pandora Pocket

IT系と日常系の備忘録。三日坊主。

DelegateでLINQのWhere条件を外から渡す

たまに使おうと思って度忘れしているのでメモ。

LINQを使ってデータを抽出する際にWHERE句を用いますが、同じデータソースに対してWHERE句の中身だけが異なるなんてことがあるかと思います。

それぞれメソッドを分けると冗長ですので、WHERE句だけ外部から渡したい。

こういう時はDelegateを使えば外部からラムダ式を渡せます。

ex)

var numbers = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9 };

Func<int, bool> filter = f => (f % 2 == 0) && (f > 5);

var result = numbers.Where(filter);

f:id:Ovis:20210607223638p:plain

参考

NuGetパッケージの名前空間コンフリクト対策でextern aliasを利用する

業務アプリで利用しているSDKを更新していてはまったので覚書。

問題

今回 Microsoft.Azure.CosmosMicrosoft.Azure.Cosmos.Table をそれぞれ用いる構成なのですが、単純にNuGetパッケージをインストールすると、名前空間が衝突する箇所があり、

f:id:Ovis:20210524121125p:plain

エラー CS0433 型 'IndexingMode' が 'Microsoft.Azure.Cosmos.Client, Version=3.18.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' と 'Microsoft.Azure.Cosmos.Table, Version=1.0.8.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' の両方に存在します

このようにエラーとなります。

解決策

.NETではこのように名前空間が衝突してしまう場合に、 externエイリアスという機能を利用して解決することができます。

DLLファイルだったら各DLLのプロパティでエイリアスを指定するらしいのですが、NuGetパッケージの場合はそういうことはできません。

この場合、csprojファイルに下記のように記載することで対応できます。

 <Target Name="ChangeAliasesOfAzureTables" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
        <ItemGroup>
            <ReferencePath Condition="'%(FileName)' == 'Microsoft.Azure.Cosmos.Table(エイリアス指定したいNuGetパッケージ名)'">
                <Aliases>AzureTable(エイリアス名)</Aliases>
            </ReferencePath>
        </ItemGroup>
    </Target>

あとは通常通り、

extern alias AzureTable;
using AzureTable::Microsoft.Azure.Cosmos.Table;

こんな感じでusingを記載してやれば、うまく回避することができます。

参考

YouTube Musicに自動で音楽ファイルをアップロードしてくれるアプリ「YT Music Uploader」

Google Play MusicのころはGoogle Play Music Managerを利用してローカルの音楽ファイルをアップロード可能でした。

しかしYouTube Musicに移行してからは現時点でアップロードソフトウェアが公開されておらず、ブラウザから手動でアップロードするしかありません。

ブラウザでやれるなら非公式APIなりでやれるだろうし、同じようなことを考えている人はいるだろうと思って調べたところ、ytmusicapi なるものを発見。

これはこれで要件を満たせそうではあるものの、Pythonを使い慣れてないこと、自動アップロードもしてほしいこともありほかのソフトウェアを探したところ、こちらを発見。

f:id:Ovis:20210303003326p:plain

Windows向けアプリなのでLinuxやMacでは(Wineでも使わない限り)使えませんが、私はWindows環境なので問題なし。
Watch Folders に音楽ファイルがあるフォルダを指定しておけば、あとは勝手にアップロードしてくれます。

Connected Standby(InstantGo)によるディスプレイ電源OFF時のスリープを回避したい

普段デスクトップパソコンで作業をしているのですが、Twitterや音楽を流すために別途タブレットを用意して、そちらを24時間稼働させています。

24時間とはいっても寝ている間もディスプレイの電源をつけっぱなしにしておくのはもったいない。なので指定した時間になったらディスプレイの電源をオンオフするアプリを作って使っているのですが、表題の通りConnected Standbyが有効になっているとディスプレイの電源が切られるとスリープになってしまいます。

これまでは下記の記事のようにレジストリをいじって回避していたのですが、Windows 10 May 2020 Update あたりからこの設定が使われなくなってしまい、スリープされるようになってしまいました。

仕方がないのでフィードバックハブで要望を投げつつディスプレイをつけっぱなしにしていたのですが、フィードバックハブでほかのユーザーの方から情報をいただきました。

続きを読む