#49: 2022-01-15 やったこと

GAKKOU の 6 文字を並べ替えてできる 360 個の文字列を辞書式に並べるとき、100 番目の文字列を求めよ。

  • 答えはすでに見てしまったのですが、この問題を解くには F# でどう書いたらいいのだろうか、と興味が湧いたのでやってみます。

まず文字列を 1 文字ずつのリストに変換します。

let splitString str =     
    let rec split (s:string) lst =  
        if s.Length > 0 then split s.[1..] (s.[0] :: lst)  
        else List.rev lst  
    split str []

こういう感じでしょうか。

もしかしたら、もっとスマートに書けるのかもしれません。

#48: GAS で列名で index を取得する

  • Google Spreadsheet & GAS でテーブル形式のデータを扱う際に列を指定する場面が出てきます。
  • 単純なものであれば const fooColIndex = 3; と変数名に受けて書いていましたが、途中で列を追加したりするとメンテナンス&デバッグに時間がかかる場合がありました。
  • 今後は以下のように列名で引いてくるようにしようと思います。
// 1 行目は列名
const columnLabels = sourceSheet.getDataRange().getValues()[0];

/**
 * 指定した列名の array index を取得する。
 * シートのデータを getValues() で 2 次元配列として処理する場合に使用する。
 * @param {Array} labels
 * @param {String} label
 * @returns {Number}
 */
function getColIndex(labels, label) {
  const i = labels.indexOf(label);
  if (i < 0) {
    Browser.msgBox(`label: "${label}" が見つかりません。シートの列名が変更されていないか確認して下さい。`);
  } else {
    return i;
  }
}

#47: 2022-01-13 やったこと

  • 昨日に続いて C#スクレイピングの処理を書いていました。
  • async/await の書き方で少しハマりましたが、何とかなりました。
var resultLines = sourceLines.Select(async x =>  
{  
 var mailAddress = x.Split('\t')[1];  
 var checkResult = await CheckMailAddressAsync(mailAddress);  
 return string.Join('\t', x, checkResult);  
}).ToArray();

これで resultLines の型は Task<string>[] になって、使うときにどうしたらいいのか悩みました。

ひとまず以下のようにして Task.WhenAll で全ての処理が完了するのを待って、await でそれを待つ(?)という形で書けば大丈夫でした。

await Task.WhenAll(resultLines))
  • kekyo さんの記事を読み直そうと思います。

  • それにしても優秀な IDE が支援してくれるので、楽しくプログラムを書くことができていてありがたい限りですね。

  • C#/F# を使って、いろいろな処理を書けるようになりたいです。

#46: 2022-01-12 やったこと