二つのファイルの共通行(または共通しない行)を得る

例えば、サービスAでは登録されているけれどもサービスBには登録されていないユーザの一覧を得たい、という様な場合。もちろんdiffでよしなにやることもできますが、commも便利です。 例えば次の様にリストがあるとします。 サービスAのユーザーリスト(users_a.txt): alice bob charlie dave oscar サービスBのユーザーリスト(users_b.txt): charlie isaac justin mallory oscar これらに対してcommを使うと次の出力が得られます: $ comm users_a.txt users_b.txt alice bob charlie dave isaac justin mallory oscar TABで揃えられた列がそれぞれ左から、Aにだけ存在する行、Bにだけ存在する行、Cにだけ存在する行、となっています。これだけだと別にそれほど便利ではないんですが、commはそれぞれの行を非表示にする事もできます。それぞれ、非表示にしたい行を-1 -2 -3で指定します。 Aだけに存在する行を表示する: $ comm -23 users_a.txt users_b.txt alice bob dave 両方に存在する行を表示する: $ comm -12 users_a.txt users_b.txt charlie oscar diffだとdiffの後にgrepやらなんやらして必要な物を抜き出す必要があるでしょうから、これは楽ですね。 もちろん、diffの様に他のコマンドの標準出力を取ることもできます。 例えばhttps://example.com/api/users_b.txtが先ほどのusers_b.txtと同じ内容を返すとするとしてAだけに登録しているユーザーを取得したい場合 $ curl -s https://example.com/api | comm -23 users_a.txt - alice bob dave とできますし、2つのユーザーリストを返すAPIが有ったとして、共通のユーザーを一覧にしたい場合、次の様にできます: $ curl https://example1.com/users | jq . [ { "username": "alice" }, { "username": "bob" }, { "username": "charlie" }, { "username": "dave" }, { "username": "oscar" } ] $ curl https://example2....

2022-09-28 · nasa9084

RenovateでGitHub Actionsで使っているHugoを更新する

GitHub ActionsとHugoを使用して静的サイト生成を行う場合、peaceiris/actions-hugo を使用するか、自分で適当にHugoをインストールするかのいずれかが一般的だと思います。このブログでは、セットアップ当初はpeaceiris/actions-hugoを使っていたのですが、最近debパッケージを自分でインストールする方式に切り替えました。 gohugoio/hugoのreleases から直接debパッケージを持ってきているので、peaceiris/actions-hugoとは違いlatest指定をする事ができず、Hugoの更新を手動で行う必要があり、ちょっと面倒だな〜と感じていました(しかもHugoは結構開発が活発で、更新もはやいんですよね)。 仕事のリポジトリでは最近renovateがどんどん導入されているので、これを機にrenovateを導入することにしました。 HugoのバージョンはGitHub ActionsのWorkflowファイル内にenvで指定されていて 、もちろん標準状態のrenovateはこれを検知・更新してくれません。これに対応するには、regexManagers を使用します。 regexManagersは正規表現でバージョン番号を引っかけて更新してくれるmanager で、fileMatchとmatchStringsという二つの正規表現を書くことで使う事ができます。 fileMatchはその名の通り、どのファイルを監視するかを指定する正規表現で、今回はGitHub Actionsの設定ファイルを監視して欲しいので、デフォルトのgithub-actions managerが監視する正規表現をそのままコピーしてきて使用しました。 "fileMatch": [ "^(workflow-templates|\.github\/workflows)\/[^/]+\.ya?ml$", "(^|\/)action\.ya?ml$" ] matchStringsはバージョンを引っかけるための正規表現で、datasource、depName、currentValueの三つの値をキャプチャするか、datasourceTemplate、depNameTemplate、currentValueTemplateで値を指定する必要があります。datasource(datasourceTemplate)とdepName(depNameTemplate)はバージョンを比較するためのデータソースと依存の名称で、今回はGitHub上にあるgohugoio/hugoリポジトリのリリースと比較をしたいため、datasourceTemplateにgithub-releasesを、depNameTemplateにgohugoio/hugoを指定しました。currentValue(currentValueTemplate)は現在のバージョン番号を表す値で、これはGitHub Actionsの設定ファイルに書かれている値なので、matchStringsで引っかけてキャプチャします。 "matchStrings": [ "HUGO_VERSION: (?<currentValue>.*)" ], "datasourceTemplate": "github-releases", "depNameTemplate": "gohugoio/hugo" 設定ファイル全体としては次の様になります: { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:base" ], "regexManagers": [ { "fileMatch": [ "^(workflow-templates|\.github\/workflows)\/[^/]+\.ya?ml$", "(^|\/)action\.ya?ml$" ], "matchStrings": [ "HUGO_VERSION: (?<currentValue>.*)" ], "datasourceTemplate": "github-releases", "depNameTemplate": "gohugoio/hugo" } ] } これで無事renovateがHugoのバージョンをチェックしてくれる 様になりました。めでたしめでたし。

2022-09-27 · nasa9084

GitHub PagesをActionsからデプロイする形式に変更した

2022年9月1日現在、このブログはmarkdownファイルからHugoを使って静的サイトを生成し、GitHub Pagesで公開しています。元々GitHub Pagesにページをデプロイするには、生成済みページを入れた専用のブランチ(一般にgh-pages)を用意するか、生成済みページを入れたディレクトリを用意するか、という二択で、いずれにせよページを生成してから生成されたページをGitHubにpushする必要がありました。前者の場合gh-pagesブランチはmainないしmasterブランチとは一切関係の無いコミット履歴となり、ぱっと見よく分からないですし、後者の場合gitのcommit logにサイト生成のコミットが入ってしまいきれいではありませんし、CIでbuild/pushをしている場合ローカルに毎回pullする必要も発生します。当サイトでもgh-pagesブランチに生成済みページをpushする運用となっていました。 ところが最近、GitHub Actionsから直接GitHub Pagesにページをデプロイできる様になった というではないですか。これは試してみるしかない、ということで設定を変更してみました。 まず、リポジトリのSettings > Pagesから、SourceをGitHub Actionsに変更します。 次に、GitHub Actionsのworkflow設定をactions/starter-workflows を参考に書き換えます。重要なのは2点で、actions/upload-pages-artifactを使って生成済みページをartifactとしてアップロードする点と、actions/deploy-pagesを使ってGitHub Pagesにデプロイをすることです。 steps: - name: Upload artifact uses: actions/upload-pages-artifact@v1 with: path: ./public # Grant GITHUB_TOKEN the permissions required to make a Pages deployment permissions: pages: write # to deploy to Pages id-token: write # to verify the deployment originates from an appropriate source environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v1 多分artifactのアップロードとページのデプロイは同じJob内で実施しても問題無く動くとは思いますが、actions/deploy-pagesのREADME によると専用のJobに分けることが推奨されているようです。...

2022-09-01 · nasa9084

梅仕事2022

皆さん、6月です。6月と言えば、そう、梅の季節ですね。今年も近所の西友で梅やらでかい瓶やらが店頭に並んでいたので買ってきました。このブログでは2020年からしか記録をつけていないのですが、成人してから毎年梅酒と梅シロップを漬けており、梅酒はほぼ手を付けていないので4L瓶が実家にも現在の家にも並んでいます。そろそろ一升瓶を入手して瓶詰めでもしようか、などと考えています。 扨、もちろん今年も梅酒/梅シロップを漬けましたので記録しておきます。今年のレシピはこちらです: 梅: 近所の西友で購入した青梅一袋。多分1kgくらい(で売ってるのが普通のはず?) 砂糖: 西表島産黒糖1kg 酒: ホワイトタカラ 果実酒の季節 1.8L 昨年はかねてからやってみたかった、梅酒用の日本酒を手に入れて日本酒梅酒を漬ける、ということをやりましたので、今年は砂糖の方で変化を入れてみました。酒はこの季節どこにでも売っている果実酒用ホワイトリカーの定番、果実酒の季節です。度数は35%です。適当な焼酎で漬けても良いんですが、黒糖を使うこともあり度数が高めのモノを使った方が良いだろうと考え果実酒の季節を選びました。 梅を洗って、 水分を拭き取りながらへたを取り、砂糖と交互に積み、 酒を注ぎます 余談ですがこの黒糖、カレールゥにしか見えないのは私だけでしょうか 巷にあふれるレシピを見ると、へたのところに水分が残りやすいので注意とか、傷があったらそこから腐るので除けた方が良いとか書いてありますが、多少へたのところに水分が残ってたり傷があっても多分大丈夫です。大きな傷があるモノとか、傷のところが柔らかくなっているモノは除けておきましょう。今回は一袋の内1つだけ傷のところがすこし柔らかかったため除けました。 梅は金気を嫌う、という話が有るので私はへた取りは爪楊枝でやっています。ボウルもプラかなんかの奴で、金属製じゃない奴です。まぁ金属のボウルに入れたところでどれだけ影響があるのか分からないですが。 黒糖特有だと思うんですが、アクのようなモノが浮いてきました。 最後に、瓶に付属していたラベルに年月日とレシピを記録して貼り付けておきます あとはしばらく数日ごとに瓶を揺すって、砂糖が溶けたら放置して3ヶ月くらい経ったら飲むことができます。1年くらい置くとなお良いでしょう。私は永遠に放置します。 続いて梅シロップを漬けます。レシピはこちら: 梅: 近所の西友で購入した青梅一袋。多分1kgだろうという想定。 砂糖: カップ印の三温糖1kg こちらも氷砂糖のレシピが一般的だと思いますが、今年は三温糖にしてみました。店頭で今年は三温糖にしようかな、と思って買ってきたのですが、昨年も三温糖を使ったよう です。まぁ良いでしょう。 酢を入れるレシピもありますが、今年は酢を入れないでやってみることにしました。 以上です。

2022-06-05 · nasa9084

N-ONEを買いました

標題のとおりです。N-ONEを買いました。現行の新型N-ONEではなく、前期型のN-ONEです。グレードはツアラーで、ターボ、パドルシフト、クルーズコントロールなどがついています。納車時走行距離は46,710kmでした。 5月21日(土)に納車、今日車祓をしてもらってきました。 以上。

2022-05-28 · nasa9084

Kustomizeのimages transformerをCustomResourceでも使う

皆さんはKustomizeのimages transformerは使っていますか?kustomization.yamlに書く、こういうやつです: apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - deployment.yaml images: - name: old-image newName: new-image newTag: v1.0.0 kustomization.yamlにこのimages:というブロックを書くと、deployment.yamlでimage: old-imageと書かれている部分がimage: new-image:v1.0.0に置き換えられます。これがimages transformerと呼ばれるもので、kustomizeのドキュメントではImageTagTransformer のところとか、exampleのimages transformer のところとかに説明が書いてあります。 扨、Kubernetesの大きな強みの一つとして、CustomResourceDefinitionを使用して独自のリソースを作成することができる、というものがあります。世の中にはいろいろなOSS CRDがありますが、今回話題にしたいのはDeploymentなどのようにコンテナイメージを指定するタイプのCustomResourceです。例えば、Argo WorkflowsのWorkflowリソースでは次の様にイメージを指定します: apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: name: batchjob spec: entrypoint: main templates: - name: main container: image: old-image しかしこの場合、kustomization.yamlでイメージを指定しても、old-imageを置き換えてくれません。 が、置き換えて欲しいですよね? それ、images transformer configurationを書くことで実現できます。 上書きしたいリソースのkindと、イメージを指定するpathを書いた設定ファイルを用意するだけです。この例の場合、kindはWorkflowで、pathはspec/templates/container/imageです。リストのインデックスとかは書く必要は無いです。設定ファイルは次の様になります: images: - path: spec/templates/container/image kind: Workflow これを例えば、images_transformer_configuration.yamlに保存したとすると、kustomization.yamlには次の様な記述を追加します: configurations: - images_transformer_configuration.yaml あとはDeploymentの時と同様にimages:ブロックを記述するだけです。 今回の例の全体としては次の様になります: kustomization.yaml: resources: - workflow.yaml configurations: - images_transformer_configuration.yaml images: - name: old-image newName: new-image newTag: v1....

2022-05-25 · nasa9084

BlogカードShortcodeを実装した

例えば、はてなブログだとブログカードと呼ばれるこういうの: が有ったり、wordpressだとプラグインでこういうの: が有り、リンクをなんだか良い感じに表示してくれます。このブログでつい先日まで使っていたGhostでも、こういうの: が有りました。 一方、現在使っているHugoには標準機能でこういったものを表示する機能はありません(twitterとかYoutubeはあるんですけど・・・)。しかし、無ければ作れば良いじゃない、ができるのがHugoの良いところです。 Hugoにはshortcode という機能があり、例えば標準のtwitter shortcodeだと、 {{< tweet user="nasa9084" id="1519598305554362370" >}} と書くと 牛乳はさ、牛乳-like飲物よりうまいんだよな — nasa9084@某某某某(0x1d) (@nasa9084) April 28, 2022 の様に展開されます。なので今回は {{< web-embed url="https://example.com" >}} というshortcodeを作ってみようと思います。調べてみると同様の実装をしている人もいましたので、それを参考にしつつ実装していきます。 まず、URLからデータを取得してくるにはHugoのgetJSON を使うと良さそうです。残念ながらOGP情報などを取得する方法は用意されていないようなので、指定したURLからOGP情報をとってきてJSONとして返す様なプロキシ的なサーバが必要そうです。cloud functions for firebase + javascript で実装している人もいれば、Netlify Functions + javascript でやっている人もいるという感じでしたが、やはり個人的にはGoがシュッと読み書きできて早いし、Cloud Functionsなどで常時稼働させておくには認証とかのことも考える必要がありありそう(まぁ無くてもいいっちゃいいけど、よくわからん踏み台にされても面白くない)で面倒だな、ということでちょっと困ったんですが、OGPプロキシサーバは特に状態を持っておらず、hugo buildする間だけ存在してくれればいいので、GitHub Actionsのサービスコンテナとしてプロキシを動かすことにしました。ローカルでテストビルドするときもdocker runすれば良いだけなので簡単です。 ハンドラの実装は次の通りです: url := r.URL.Query().Get("url") if url == "" { http.Error(w, `{"message": "url parameter is required"}`, http.StatusBadRequest) return } log.Printf("request URL: %s", url) ogp, err := opengraph.Fetch(url) if err !...

2022-04-29 · nasa9084

Migrate Ghost to Hugo

いつの頃からだったか、もう記憶もあやふやではあるけれど、ブログプラットフォームとしてGhost を使っていた。twitter を見る限り、2017年の11月頃には既にGhostを使っていて、確かこの時はDockerでセットアップしていた様な記憶がある。 Ghost、すごい勢いでアップデートされてってて結構アプデが手間 — nasa9084@某某某某(0x1d) (@nasa9084) November 9, 2017 Ghostは結構更新が頻繁で、特にdocker-composeとかも使わずに運用していたので(使っても良かったんだけど、当時はDBもsqliteを使っていてコンテナ一つと永続ボリューム一つ、という単純な構成だったので使わなくて良いか、と思っていた)微妙にイメージの更新が面倒で、container-up というツールを書いてみたりもした。 その後自宅にKubernetesクラスタをセットアップしてKubernetes管理になり、データベースもMySQLに切り替え、最終的にはGCPのfree tierを使ってon VMで運用していた。 Ghostを使い始めた頃はバージョンもまだ1系だったけど、今となっては4系になって、相も変わらず活発に開発され、admin UIも大分変化した。 時代の流れとしては当然といえば当然なのだけれど、Ghost 5.0ではMySQL 8が必須となるということで、最近MySQLの更新をしたところ、頻繁に外形監視がfailする様になった。どうやらリソース不足でレスポンスを返せなくなっていたようだった。free tierのVMなのでe2-microインスタンスを使っているため、さもありなんといった感じ。 もちろん多少のお金を払ってもう少し良いVMにしても良いのだけれど、それほど頻繁に書いているわけでもないブログを運用するためだけに月数千円の出費はいかがなものか、大して書いてもいないのだから静的ページ生成でも良いのではないか、静的ページ生成ならデータベースもいらないしGitHub pagesで配信できて無料ではないか、などと思い、k8s.io でも使っているHugo に乗り換えることにした。 参考にしたのはこのページ 。多少古い記事だけど多少調整すればなんとかなるだろう、と思い見切り発車した。結果なんとか移行はうまくいき、このページが表示されています。 移行手順 まず、ghostToHugo をダウンロードして、Ghostから出力したjsonファイルをHugoにインポート。(ghostToHugoはDarwin_x86_64のバイナリを使ったけど、apple siliconのmacOSでもrosettaで普通に問題無く動いた) $ ./ghostToHugo -p blog.web-apps.tech something-tech.ghost.2022-04-22-02-57-56.json Google Cloud Storageにアップロードしていたバックアップから画像ファイルを取り出してimagesディレクトリに配置した。 $ cp ${PATH_TO_BACKUP}/content/images ./blog.web-apps.tech/images イメージのパスをちょっと調整。 $ find . -name '*.md' | xargs sed -ie 's/__GHOST_URL__//g' $ find . -name '*.md' | xargs sed -ie 's/\/content\/images\//\/images\//g' front-matterをYAMLに変更。 $ cd blog.web-apps.tech $ hugo convert toYAML $ cd ....

2022-04-23 · nasa9084

GitHubがgit://を無効にした件

TL;DR GitHubからgitプロトコル(git://github.comで始まるURL)でgit cloneする設定になっている人が居たらSSHプロトコル(git@github.comで始まるURL)を使うように設定変更しましょう wez/weztermという端末エミュレータを知って、使ってみようかと思い、ドキュメントに従ってbrew tapしたときのことでした。次の様なエラーが発生して、tapできません。 $ brew tap wez/wezterm ==> Tapping wez/wezterm Cloning into '/opt/homebrew/Library/Taps/wez/homebrew-wezterm'... fatal: remote error: The unauthenticated git protocol on port 9418 is no longer supported. Please see https://github.blog/2021-09-01-improving-git-protocol-security-github/ for more information. Error: Failure while executing; `git clone https://github.com/wez/homebrew-wezterm /opt/homebrew/Library/Taps/wez/homebrew-wezterm --origin=origin --template=` exited with 128. 指定された記事 を見てみると、git://で始まるURLでのアクセス==gitプロトコルでのアクセスを無効化したようです。 自分の<code>.gitconfig</code>を見てみると 、確かに https://github.com の代わりに git://github.com を使うという設定がされています。 [url "git@github.com:"] pushInsteadOf = git://github.com/ pushInsteadOf = https://github.com/ [url "git://github.com/"] insteadOf = https://github.com/ GitHubによるとこれまでもgitプロトコルでのアクセスは読み取り専用だったようですが、ご丁寧にpushInsteadOfで git@github....

2022-03-20 · nasa9084

Retrospective: 2021

1月 動画編集がちょっと楽しくなってきた頃で、毎日AmongUsの動画を作って上げてた。AmongUsやるDiscord鯖を作ったのもこのあたり。DaVinci Resolveでモーショングラフィックスやり始めてみてめっちゃ楽しかった。 案外それっぽいモーショングラフィックスとか作れるもんだなーと思うなど https://t.co/mhuQFVErv4 — nasa9084@某某某某(0x1b) (@nasa9084) January 23, 2021 この時期に買ったコミックスでまどろみバーメイド が面白いです。kindle unlimited加入者は5巻まで読めるので読んでください。特にお酒が好きな人。 nasa9084/broadcast-memo リポジトリを作った。 2月 Switchbot APIを発見したのでnasa9084/go-switchbot を作った。相変わらず動画は毎日アップしてた。 それ以外はまぁ特になし 3月 オフィス移転して、新宿から四谷になった。まぁ、目下リモートワークであんまり影響はなし。 異動乃至転職をしよう、と割と真剣に考え始めた。チーム内で真面目にやろうとしてる人を見て面倒だなって感じてしまったので、チームから心が離れてるな、と強く自覚したのが理由。 ergodash2台目(bluetooth化)を作った。今も使ってます。 nasa9084/switchbot-exporter を書いたけど、あんまり見てない。 この辺で動画投稿ペースは落ちてきた。 4月 笑顔のたえない職場です というコミックスが面白いです。 スピーカーを買い、モニタを増設し、大体今のデスク環境が整ったのがこの辺。 5月 バイオリンを買った。結局練習は続いていません。Ankerの新製品であるところのwebカメラを買って、最近のwebカメラってこんなに画質いいんだ!と驚いたり。 社でやったゴールデンウィーク自由研究発表会で良かった発表ランキング1位を獲得した。なお内容は各社の牛乳でヨーグルトを作って比較してみたという内容でした。 LINE MOBILEからLINEMOに乗り換えた。メイン回線は変わらずiij mio。 6月 UNDERTALEめっちゃ面白かった。 7月 1回目の新型コロナウイルスワクチンを接種した。 8月 2回目の新型コロナウイルスワクチンを接種した。 異世界失格 が面白いです。 Huawei Band 6を買って、割と満足はしてた。が、今はapple watchに乗り換えてしまったので使ってない。南無。プール行ったときだけ使ってます。 なんだかんだ真面目に仕事をしてました。 9月 iPhone 13 miniとiPad miniを買いました。iPhoneは9年ぶりです。 10月 Engineering Infrastructure室からLINE Platform Developmentセンター1 Communication and Service Integration室のSREチームに異動しました。使ってる技術も、業務知識もガラッと変わったので何も分からなくなりました。今も何も分からん。 社内のエンジニアレベルも上がり、昇給し、異動前にやってた業務がきちんと評価してもらえた事がわかりめでたしめでたし。 あとはapple watch買いました。 11月 LINEスタンプを作り始めた。iPad Proはこのために買った(が1年放置してた)。皆さんスタンプ買って下さい。...

2021-12-30 · nasa9084