自由気ままに働きたい

とあるエンジニアの雑記帳

【TASCAM US-100】オーディオインターフェースを買い替えたいという話

私はオーディオインターフェースを使っています。
買ったのはだいぶ昔、私がまだ義務教育を受けていた頃です。
ネットが徐々に普及しだしていたあの頃、ネット上ではニコニコが最盛期を迎え、
たくさんの歌い手やたくさんのボカロ曲が盛んに投稿されていたあの頃です。
当時から楽器屋さんもその流行に便乗するためか、歌い手、実況キットなるものを
売り出していていました。(今もやってますよね笑)
さて、当時は幼く、当然ながら自分も歌い手や実況主にあこがれていました。
ネットでそのようなものが売られていたら、、、当然買っちゃいますよね。
ということで、その時買ったキットに含まれていたのがこれです。
成人してからもディスプレイ元においてずっと使っていました。

f:id:dareka-labo:20210710002415j:plain
こんな感じで使ってます

こちら、TASCAMのUS-100です。
現在は生産が終了しており、
後継としてUS-2x2というモデルが出ているようです。
前面と背面はこんな感じ。

f:id:dareka-labo:20210710002428j:plain
ぜんめん~

前面はGUITER INとノブ3つ、それからミニジャック出力です。
GUITER INは使ったことない。。。
ノブは左から入力、バランス、出力が調整できまます。
ミニジャック出力は普通の市販のイヤホンとか安いヘッドホンが刺さるので
結構助かる。

f:id:dareka-labo:20210710002440j:plain
はいめん~

背面は左からマイク入力(XLR)、マイク入力(ジャック入力)、グランド、MIC/LINE/PHONO入力切替スイッチ、LINE IN(RCA)、LINE OUT(RCA)
USBです。
MICはXLRも刺さりますが、ファンタム電源は無いので
ファンタム電源が必要なコンデンサマイクは使えません。
あとPHONO入力に対応してるのが地味にすごい。
レコード持ってないから意味ないけど。
LINE OUTは前面のミニジャック出力端子に
なにか刺さってたら音が出なくなります。
自分はこれしか持ってないからわからないのだけれど、そんなものなの?

さて、ここまで読んでいただいたあなたならお気づきでしょうが、
こいつ、相当ボロボロです。。。10年も無茶しやがって。。。
なんたって、出力調整用のノブが完全に外れちゃってます。
生き残ってる入力調整用のノブもプラスチックがだいぶ劣化していて、
結構ベタついています。。。
あと、なんかミニジャックの接触が悪いですね。
ほんとに時々ですが音抜けします。
まあそもそも10年近くお世話になっているということもあるんで、
流石に変えたい。。。
結局買ってから一回も実況なんてすることはなかったけど、
歌ってみたを投稿しようとしたら親に止められて結局投稿しなかったけど。

でもね、あったら便利なんです。
自分はPCを机の下においてるんですけど、そこからヘッドフォンをつなげるって
考えてみてください。ケーブルが煩わしいでしょう!
ディスプレイの下においたらそこにヘッドフォンつなげて、
更にそこで音量調整もできて、
テレワークで会議とか出席した時、そこで嫌なことがあった時、
なかなか終わらずにイライラした時、
そんなときに手元の音量を切ると、 その場で、大声で
「○長のクソやろおおおおおおオオォォォぉぉぉぉ」とか 叫んじゃっても、
ぜんぜん大丈夫なんです。流石にそれはやったこと無いけど。
(ミュートにすると気を使われるのですが、これだとミュートにする必要もないので問題なし)

というわけで兎にも角にも買い替えたいという話でした。次は何にしようかなぁ。

LINQであるList型の任意プロパティ(列)に対して複数の任意文字列を検索する

悩み

Zennでも同様の記事を書きましたが。。。
LINQはList型などのEnumableな型へのアクセスを非常に楽に書けるようになるので
結構強力なツールです。
ただ、条件式内でターゲットとするプロパティ(テーブルだと列)も固定され、
任意のプロパティをターゲットにできません。
また、検索条件もソースコードに記述した数だけしか検索できない為、
数が変化するような複数文字列の検索もできません。
これによって、SQLで言うところのFROM句やWHERE句を動的に変えることができないのです。
なんだか汎用性には欠けているように感じます。(個人の感想)

    var searchWord = "AnyString"
    var list = new List<Hoge>();
    //Whereメソッドで検索
    var query = list.Where(h => h.OneProp.Contains(searchWord));
    //↑検索はHoge.OnePropに対してしか検索しか行えない
    // また、そのプロパティはsearchWordを含むかどうかしか検索できず、  
    // 複数語句の検索はできない。
    // やるにしてもforeachなどを活用するにしかなく、冗長になってしまう。  

なんとか、プロパティ部分を動的に変化させることができないものでしょうか。
もしできたとしたらその都度処理を書く必要も無いのですが。。。

できた処理

/// <summary>
/// 動的要素検索ラムダ式の定義
/// (row => row.col.Contains(word1) || row.col.Contains(word2) || ...という式や
/// (row => row.col.Contains(word1) && row.col.Contains(word2) && ...という式を動的に作成
/// </summary>
/// <typeparam name="T">検索対象のエンティティクラス</typeparam>
/// <param name="columnName">要素名、列名など</param>
/// <param name="searchWord">検索語句</param>
/// <param name="isOr">Or検索かどうか(FalseでAnd検索)</param>
/// <returns>検索ラムダ</returns>
public Expression<Func<T, bool>> DynamicContains<T>(string columnName, string[] searchWord, bool isOr)
    where T : class
{
    try
    {
        //[1]引数の準備
        var type = typeof(T);                               //クラスの特定
        var property = type.GetProperty(columnName);        //クラスのプロパティ一覧取得
        var parameter = Expression.Parameter(type, "p");    //あるパラメータ"p"の定義
        Expression body;                                    //ラムダ式用変数定義
        var nodes = new List<Expression>();                 //各ノード処理格納用

        //[2] p.Nameの形式を作成
        var propertyAccess = Expression.MakeMemberAccess(parameter, property);

        //[3]Containsメソッドの定義
        MethodInfo Contains = typeof(string).GetMethod("Contains", new[] { typeof(string) });

        //[4]各要素のメソッド定義
        foreach (var w in searchWord)
        {
            nodes.Add(Expression.Call(propertyAccess, Contains, Expression.Constant(w)));
        }

        //[5]各要素同士の短絡評価
        if (isOr)
        {
            body = nodes.Aggregate((l, r) => Expression.MakeBinary(ExpressionType.OrElse, l, r));
        }
        else
        {
            body = nodes.Aggregate((l, r) => Expression.MakeBinary(ExpressionType.AndAlso, l, r));
        }

        //[6] 戻る
        return Expression.Lambda<Func<T, bool>>(body, parameter);
    }
    catch
    {
        throw;
    }
}

/// <summary>
/// こんなクラスがあったとする
/// </summary>
public class Idol
{
    /// <summary>
    /// 名前
    /// </summary>
    public string Name { get; set; }
    /// <summary>
    /// 性格
    /// </summary>
     public string Personality { get; set; }
    /// <summary>
    /// 年齢?
    /// </summary>
    public int Age { get { return 17; } }
}

/// <summary>
/// 呼び出し例
/// </summary>
public main()
{
    //[1] 例えばこんなListがあったとします(値はテキトーに設定)
    var idol_dic = new List<Idol>(){
        new Idol() { Name = "Shiburin", Personality = "Cool and Childish(Japanese CHUNI)" }, // 1.
        new Idol() { Name = "Arin", Personality = "Cute and Gullible(Japanese Tyoroi)" },    // 2.
        new Idol() { Name = "Furin", Personality = "Cute and Childish(Japanese CHUNI)" },    // 3.
    };

    //[2] 検索を行ないます
    //[2-1] クールで中二な性格のアイドルを検索
    //      生成されるラムダ式 → p => p.Personality.Contains("Cool") && p.Personality.Contains("Childish")
    //      結果:1.が取得できる
    var CoolAndChildish = idol_dic.Where(DynamicContains<T>("Personality", new string[] {"Cool", "Childish"}, ture));
    //[2-2] キュートでちょろい性格のアイドルを検索
    //      生成されるラムダ式 → p => p.Personality.Contains("Cute") && p.Personality.Contains("Gullible")
    //      結果:3が取得できる
    var CuteAndGullible = idol_dic.Where(DynamicContains<T>("Personality", new string[] {"Cute", "Gullible"}, ture));
    //[2-3] 名前に"u"と"rin"が含まれるアイドルを検索
    //      生成されるラムダ式 → p => p.Name.Contains("u") && p.Name.Contains("rin")
    //      結果:1.と3.が取得できる
    var UAndRin = idol_dic.Where(DynamicContains<T>("Name", new string[] {"u", "rin"}, ture));

    //(以下略)
}

改善点

任意テーブルで且つ、複数カラムに対して操作できるように実装したい。。。
あと、処理速度的にこれって遅いですよね?(未検証)

参考

Expression クラス
式木(Expression Trees)
【C#】Expression Treeでラムダ式を動的生成する
急に動的コード生成に興味がわいたので

なんとなく、なんとなく

これまでも何度かブログをはじめたいとは思っていた。
ただ、なんとなくめんどくさい、なんとなくこわい、というような
なんともいえないような感情が邪魔をして、はじめられなかった。

ただただ、なんとなく自分の楽しいことばかりやって、
だらだら過ごしていたら、社会人も5年目となっていた。

自分はITエンジニアをやっているが、なかなか「なんとなく」では
進められない仕事だった。

何もやらないより、何かやっていたい、という感情もあったが、
とはいえ、そんな簡単に始められるようなこともないと思っていたところ、
「そういえば」と、改めてブログをはじめたいと考えるようになった。
なんとなく、何かをやりたい、じゃあなんとなくブログでもはじめてみるか、と、

社会人5年目にもなり行動力がついたのかもしれない。
少なくとも、「なんとなくやらない」から「なんとなくやる」に
なるくらいには、、、

と、いうような心境で始めて見ました。
WordPressも考えたけど、まずは気楽に始めたい、ということで、
これからHatenaBlogでだらだらと、主に技術的な備忘や復習用として
書き連ねていってみようと思います。
それでは、今後ともよろしくお願いします。