IDEA Note

  • GitHub Actions で requesting ‘id-token: write’, but is only allowed ‘id-token: none’. の対処

    repository の settings を変更する

    デフォルトで

    Read repository contents permission

    になっているが、

    Read and write permissions

    に変更して Save する

  • n日以降に ECR に push された image を調べる

    今後もつかそうなのでメモ

    aws ecr describe-images --repository-name $REPOSITORY  --query "reverse(sort_by(imageDetails[*], &imagePushedAt))" | jq '.[] | select(.imagePushedAt > "2022-12-01T00:00:00+09:00")'
    

    REPOSITORY に pushされた image を取得することができる

  • ECR の全リポジトリ名を取得する

    よく使うので tips として書き留めておく。

    以下のコマンドで取得可能

    aws ecr describe-repositories --output json | jq -re ".repositories[].repositoryName"
    

    結果は、ECR のリポジトリが表示される

    ecr-test-repo1
    ecr-test-repo2
    
  • Office365-REST-Python-Clientを使用したSharePointへの1GBファイルのアップロード方法

    概要

    sharepoint に 大容量(1G)のファイルをアップロードする方法を紹介

     

    CURL コマンドでやると、以下の記事で紹介のあるように認証周りに骨が折れる。

    https://rougeref.hatenablog.com/entry/2020/04/15/000000

    そこで、認証周りを包括しつつ非常に簡単にアップロードできるライブラリを紹介。

    インストール方法

    pip install Office365-REST-Python-Client

     

    サンプルコード

    以下のコードはサンプルとしてユーザー認証をしている。

    アプリケーションを登録して利用することが望ましい。

    sharepoint_url と、UserCredential の部分を適宜修正することでそのまま利用可能。

    from office365.runtime.auth.user_credential import UserCredential
    from office365.sharepoint.client_context import ClientContext
    from office365.sharepoint.files.creation_information import FileCreationInformation
    import os
    
    def get_sharepoint_context_using_user():
    
    sharepoint_url = 'https://xxxxxxxxxx.sharepoint.com/sites/upload-test'
    user_credentials = UserCredential('xxxxxxxxxx@sumito.jp', 'password')
    ctx = ClientContext(sharepoint_url).with_credentials(user_credentials)
    return ctx
    
    def create_sharepoint_directory(dir_name: str):
    """
    Creates a folder in the sharepoint directory.
    """
    if dir_name:
    
    ctx = get_sharepoint_context_using_user()
    
    result = ctx.web.folders.add(f'Shared Documents/{dir_name}').execute_query()
    
    if result:
    # documents is titled as Shared Documents for relative URL in SP
    relative_url = f'Shared Documents/{dir_name}'
    return relative_url
    
    
    target_url = "/sites/upload-test/Shared Documents/test-tsukada-dir-hoge"
    ctx = get_sharepoint_context_using_user()
    target_folder = ctx.web.get_folder_by_server_relative_url(target_url)
    size_chunk = 1000000
    local_path = "1G.csv"
    
    def print_upload_progress(offset):
    file_size = os.path.getsize(local_path)
    print("Uploaded '{0}' bytes from '{1}'...[{2}%]".format(offset, file_size, round(offset / file_size * 100, 2)))
    
    create_sharepoint_directory('test-tsukada-dir-hoge')
    
    with open(local_path, 'rb') as f:
    uploaded_file = target_folder.files.create_upload_session(f, size_chunk,print_upload_progress).execute_query()

     

    動作確認

     

     

     

     

  • File is not `goimports`-ed with -local github.com/xxx/xxx (goimports)

    golangci-lint run ./...
    

    実行時、

    File is not `goimports`-ed with -local github.com/xxx/xxx (goimports)
    

    というエラーが発生することがあったのでその対処法を紹介

    (さらに…)
  • Powershell の [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is “Y”): をスキップする

    何かと

    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):
    

    と確認されることがあるが、 -Confirm:$false オプション を使うことでこの確認をスキップすることが可能だ

    例えばデフォルトでは

     Remove-DistributionGroup 'tsukada@sumito.jp' -BypassSecurityGroupManagerCheck
    
    Confirm
    Are you sure you want to perform this action?
    Removing distribution group Identity:"tsukada@sumito.jp" will remove the Active Directory group object.
    [Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):
    

    以下のようにすることで確認を飛ばして削除することが可能

    Remove-DistributionGroup 'tsukada@sumito.jp' -BypassSecurityGroupManagerCheck -Confirm:$false
    
  • SA1019: “io/ioutil” has been deprecated since Go 1.16: As of Go 1.16

    SA1019: "io/ioutil" has been deprecated since Go 1.16: As of Go 1.16
    

    と引っかかるようになった場合の対処として、旧Version (左)で記載していた書き方を、現時点での推奨(右)に書き換える必要がある。

    非推奨(deprecated)推奨
    ioutil.Discardio.Discard
    ioutil.NopCloser()io.NopCloser()
    ioutil.ReadAll()io.ReadAll()
    ioutil.ReadDir()os.ReadDir()
    ioutil.ReadFile()os.ReadFile()
    ioutil.TempDir()os.MkdirTemp()
    ioutil.TempFile()os.CreateTemp()
    ioutil.WriteFile()os.WriteFile()

    参考情報

    https://text.baldanders.info/golang/deprecation-of-ioutil/

  • システムを作らせる技術 を読んだ

    概要

    人にお願いしてシステムを作ってもらう事があるが、お願いした事と微妙に違うものができあがってしまう事があった。このような体験があってから、依頼の仕方が悪かったのかと仮説を立て本書を読むことにした。

    プロジェクトが失敗するパターン

    さまざまなパターンがある事がわかった

    • ゴールがバラバラ
      「関係者ごとに目指すゴールがバラバラ」よくある話だと思う

    • 現場の声を聞きすぎてコストが膨らむ
      経営者にインタビューすると「現場の声を聞いて、使いやすいシステムを」となるが、実際に現場の声を聞きすぎると、投資額が増える割にビジネスにとって役に立たないシステムになる

      痛いほどよくわかる。

    これの解決策として、Why -> How -> What の順番で考えよ

    ということがあった。これは、The Golden Circle で有名なこの話と同じだ

    https://www.smartinsights.com/digital-marketing-strategy/online-value-proposition/start-with-why-creating-a-value-proposition-with-the-golden-circle-model/

    つまりは解きたいゴールを明らかにする。ゴールが明確でなければ稼働まで辿り着けない。

    Why

    • このプロジェクトはなぜやるのか
    • 本当に今のままでは事業を継続できないのか
    • 最低限達成すべきことは何か

    を明確にする。問題になるのは、現場が理解しない(できない)のではなく、各関係部署が共に目指せるプロジェクトゴールを明確にする必要がある。

    プロジェクトが共有できてないと気づいた時には、手を止めて共有することが先決となる。

    良いプロジェクトゴール作りにするためには

    1. 以降の工程で使えるゴールにする
      プロジェクトを進める上での判断の価値基準になる。
    2. 地に足のついたゴールにする
      華々しいゴールを設定したがりがちだが、実情にあったゴールにしないと困難を乗り越える事ができない。
    3. 何のためのプロジェクトか(Why)をゴールに込める
      プロジェクトのゴールがしっかりしていないと、あれもこれもとごった煮になる。
    4. ゴールのわかりやすさにこだわる
      途中から参画するメンバーにとってもわかりやすいゴールにする
      ストーリー仕立てだとコンセプトを誰でも理解できる

    How

    システム機能を具体化する前に「システムが変わったらどういう絵姿になっているか」という将来像を描く

    業務フローを中心に書くのがポイント

    1. 変化点を必ず書き出す
      どのような意図で、何を変えるのかを意識する
    2. 正常系(メインフロー)を決め、その後に異常系(イレギュラーケース)を考える
      このフェーズではメインフローを書き切ることが重要
    3. 詳細まで詰めない
      フローを書いているとさまざまな疑問が湧いてくるが、そこはTODOとして管理して
      全てのフローを書き切ったあとでTODOを整理する
    4. 一人で作らず、人を巻き込む
      このフェーズで人を巻き込まないと「自分達で作った」とものとしてメンバーは認知せず、非協力的になってしまう可能性がある

    What

    要求定義、要件定義と同義。特に機能要求定義。

    まずは言葉の整理

    要求定義とは、「システムはこんな風であって欲しい」とシステムに求めることを明確にする作業

    利害関係者の意見をまとめて、実現すること・実現しないことを揺るぎなく決めること

    要件定義とはシステムを作る人が、システムに必要な性能や実装すべき機能などを明確にする作業

    システム要求を作る上での障壁

    1. 完璧なリストアップができない
      できあがったシステムを使った具体的なイメージしきれない
    2. 予算オーバー
      リストアップされた機能に優先順位をつけ、作る機能と諦める機能を取捨選択する必要がある
    3. 立場が変わればシステムに求めるものが違う
      関係者全員の同意が必要だが、必ず関係者間で思惑が食い違いが発生する。

    What まで出し切った後のポイント

    必要な要求を見極め、納得と合意を得られる優先順位を決める

    絞り込みには説得ずくめのコンセンサスが必要不可欠

    システムを使いこなし業務を良くして利益を出さなければ構築する意味がない。

    どれも大事に見える、比較できないということに陥りがち。

    もっとミクロで観ていくと「今回のゴールに必要」「現場のITスキルだと使いこなせない」「先進的すぎて本当に実現できるのか」という項目も出てくる。

    以下の3つの基準を、3段階評価する(あくまでも一例)

    • ビジネスベネフィット
      投資効果につながる
      売り上げ向上、原価削減、プロジェクトゴールへの貢献など
    • 組織受け入れ態勢
      増員が必要
      トレーニングが必要
    • 技術的容易性
      作るのは難しくないか
      不確実性を抱えてないか

    これらの基準は関係者を巻き込んで決める。自分達で基準を決めてもらうことで、プロジェクトの見方になってもらう。

    本書は 400ページ弱ほどの本なので、ごっそり自分に最も関係しそうなところだけ雑にまとめるとこんな感じだ。

  • mach-o file, but is an incompatible architecture (have ‘x86_64’, need ‘arm64e’

    Overview

    M2 mac に移行した後、今まで動いていたアプリケーションで以下のようなエラーが出るようになった

    xcrun: error: unable to load libxcrun (dlopen(/Library/Developer/CommandLineTools/usr/lib/libxcrun.dylib, 0x0005): tried: '/Library/Developer/CommandLineTools/usr/lib/libxcrun.dylib' (mach-o file, but is an incompatible architecture (have 'x86_64', need 'arm64e'))).
    

    原因は 今まで使っていたコマンドラインが intel版のまま移行されてしまったため、これが動かないためにエラーになってしまっているようだ。

    対処法としては以下の通り

    sudo mv /Library/Developer/CommandLineTools /tmp/.
    

    上記コマンドでとりあえず退避

    その後、再度実行すると、自動で ComamndLinetTools をインストールしてくる

    xcode-select: note: no developer tools were found at '/Applications/Xcode.app', requesting install. Choose an option in the dialog to download the command line developer tools.
    
  • Error: rpc error: code = Unavailable desc = transport is closing

    概要

    m1 mac で terraform を動かすと、

    Error: rpc error: code = Unavailable desc = transport is closing
    

    というエラーが出ることがある。

    その際の対処法を紹介

    解決方法

    以下の環境変数を追加するだけ

    export GODEBUG=asyncpreemptoff=1
    

    ~/.zshrc などに追記するなど行う。

    参考情報

    https://yaleman.org/post/2021/2021-01-01-apple-m1-terraform-and-golang/