備忘録

Githubの履歴から特定ファイルを完全削除

影響範囲: 全ての履歴から完全削除(ファイルの痕跡も消える)
使うケース: 機密情報(APIキー、パスワード)を含むファイルを誤ってコミットした場合

手順

# 過去の履歴からファイルを完全削除
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch <削除したいファイル>" \
  --prune-empty --tag-name-filter cat -- --all
# ローカルリポジトリをクリーンアップ
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now --aggressive
# GitHubに強制プッシュ(**注意**: これまでの履歴が書き換わる)
git push origin --force --all

注意: --force でプッシュするため、他のメンバーがいる場合は基本的に実施しない

AWS StepfunctionsのMapステートで、あるプロパティをmapで渡しながら、別のプロパティも全ての子に渡す

課題

  • 配列の長さが 1 の場合、JSONata 式 $map の評価結果が オブジェクトとして扱われる
  • Map ステートでは、Items配列形式 が必須であるため、エラーが発生。

解決策

次の JSONata 式を使用することで、$map の結果が 常に配列形式 で返されるようにした

"Items": "{% $type($map($states.input.hoges, function($hoge) { $merge([$hoge, {\"fuga\": $states.input.fuga}]) })) = 'array' ? $map($states.input.hoges, function($hoge) { $merge([$hoge, {\"fuga\": $states.input.fuga}]) }) : [$map($states.input.hoges, function($hoge) { $merge([$hoge, {\"fuga\": $states.input.fuga}]) })] %}"

具体的な対応手順

  1. $type を使用して配列形式をチェック

    • $type($map(...)) で結果が 'array' かどうかを判定。
  2. 配列でない場合は明示的にラップ

    • オブジェクトで評価された場合は、[...] を使って配列化。
  3. $merge を使用して追加フィールドを統合

    • 各要素に fuga フィールドを追加するために $merge を使用。

最終的なステートマシンの設定例

{
  "Comment": "A description of my state machine",
  "StartAt": "Lambda Invoke",
  "States": {
    "Lambda Invoke": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Output": "{% $states.result.Payload %}",
      "Arguments": {
        "FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:test-lambda1:$LATEST",
        "Payload": "{% $states.input %}"
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 1,
          "MaxAttempts": 3,
          "BackoffRate": 2,
          "JitterStrategy": "FULL"
        }
      ],
      "Next": "Map"
    },
    "Map": {
      "Type": "Map",
      "ItemProcessor": {
        "ProcessorConfig": {
          "Mode": "INLINE"
        },
        "StartAt": "Lambda Invoke (1)",
        "States": {
          "Lambda Invoke (1)": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "Output": "{% $states.result.Payload %}",
            "Arguments": {
              "FunctionName": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:test-lambda2:$LATEST",
              "Payload": "{% $states.input %}"
            },
            "Retry": [
              {
                "ErrorEquals": [
                  "Lambda.ServiceException",
                  "Lambda.AWSLambdaException",
                  "Lambda.SdkClientException",
                  "Lambda.TooManyRequestsException"
                ],
                "IntervalSeconds": 1,
                "MaxAttempts": 3,
                "BackoffRate": 2,
                "JitterStrategy": "FULL"
              }
            ],
            "End": true
          }
        }
      },
      "End": true,
      "Items": "{% $type($map($states.input.hoges, function($hoge) { $merge([$hoge, {\"fuga\": $states.input.fuga}]) })) = 'array' ? $map($states.input.hoges, function($hoge) { $merge([$hoge, {\"fuga\": $states.input.fuga}]) }) : [$map($states.input.hoges, function($hoge) { $merge([$hoge, {\"fuga\": $states.input.fuga}]) })] %}"
    }
  },
  "QueryLanguage": "JSONata"
}

動作確認

以下の入力データで動作を確認済み:

  1. hoges が複数要素の配列の場合
   {
     "hoges": [
       { "id": 1, "name": "Hoge A" },
       { "id": 2, "name": "Hoge B" }
     ],
     "fuga": "example_fuga"
   }

出力

   [
     { "id": 1, "name": "Hoge A", "fuga": "example_fuga" },
     { "id": 2, "name": "Hoge B", "fuga": "example_fuga" }
   ]
  1. hoges が単一オブジェクトの場合
   {
     "hoges": { "id": 1, "name": "Hoge A" },
     "fuga": "example_fuga"
   }

出力

   [
     { "id": 1, "name": "Hoge A", "fuga": "example_fuga" }
   ]

まとめ

素数1でも、2~でも対応可能になった。

AWS StepFucntionsのMapステートを使う時、fugaをそのまま次に渡し、hogesをmapで処理したい

内容

以下のように入力する

項目を提供 - オプション

Specify the array that the Map state will iterate over. If unspecified, Map uses the state input as is. 情報

{% $states.input.hoges %}
出力

情報 状態出力は、ワークフローの次の状態に渡されます。

{
  "fuga": "{% $states.input.fuga %}",
  "hoges": "{% $states.result %}"
}

WF800HPを中継機として使えなかった

やりたかった事

  • 自室の電波が悪く、よく3DプリンタとPCの接続が切れたのでルーターを使っていた。
  • ネットワークが分かれているとインターネットに接続できず不便

確認結果

  • ブリッジモードにした時、wanポートにLANケーブルを接続しなければ宅内のネットワークに参加させられなかった(宅内機器のIPをスマホアプリで確認)
  • メーカーHPにて以下の根拠となる記述を確認。製品使用上不可だった。

※ WF800HPのWANポート側に接続されているインターネット接続機器[プロバイダ提供のONU(回線終端装置)/モデム/ひかり電話対応ルータ/ホームゲートウェイなど]は、インターネットに接続されている必要があります。

www.aterm.jp