2023年はこんな年でした

  • 今年はnoteを書いたぞ

note.com

  • Facebookを見返してたら、「何故」と聞きづらい問題については2015年にも書いていた

www.facebook.com

  • 相変わらず基本在宅で仕事をしている
  • 相変わらずRubyとかJavaScriptとかを書いている
  • モブプロやペアプロをする時間は減った
  • 今年はAIが面白かったなあ

  • 来年は「ラーメン赤猫」や「姫様“拷問”の時間です」のアニメが決まっているので楽しみ
もっと前はこんな年でした

2022年はこんな年でした

  • 今年初めての日記だ(2年連続)
  • 相変わらず基本在宅で仕事をしている
  • 相変わらずRubyとかJavaScriptとかを書いている。SQLについても今年いろいろ学んだ
  • 毎年この時期、Twitterとかを見て振り返るんだけど、今となってはパンデミックの始まりのころの雰囲気がずいぶん昔のことのように感じる
  • Base Breadのサブスクをはじめた
  • 9月に洞爺湖万世閣レイクサイドテラスというところに行ってきた。とても良いところだった

とにかく今年言いたいこととしては、ジャンププラスの正反対の君と僕という漫画が面白いということだ

あとスラムダンクも面白かった。

神域リーグも面白かったなあ。

www.youtube.com

黛、、、すごい奴だった。

www.youtube.com

もっと前はこんな年でした

2021年はこんな年でした

  • 今年初めての日記だ
  • キャリア変更と同時に初めてiPhoneを買った。なんだけど何かしら手続きに問題が発生し一週間くらい回線が使えなかった
  • 相変わらず基本ずっと在宅勤務をしている
  • 一昨年からずっと、ほとんどの時間をモブかペアで仕事をした
  • 会社員になった
  • 今年もAbemaTVトーナメントが面白かった。特に女流棋士トーナメントは振り飛車がいっぱいでよかった

後適当に。最近コクヨのソフトリングノートがお気に入り。

今年面白かったものといえば、ローションカーリング

あと、鳩。

もっと前はこんな年でした

2020年はこんな年でした

  • 当たり前だと思っていたことがある日突然当たり前ではなくなる、ということは今までも何度か経験したけれど、今年もそんな年だった
  • 4月ごろから基本ずっと在宅勤務をしている
  • 去年に続き一年間のほとんどをモブかペアで仕事をした
  • 将棋界は藤井二冠の誕生という大きなニュースがあったんだけど、それ以外にも個人的にはAbemaTVトーナメントと叡王戦がめっちゃ面白かった。
  • また多くのプロ棋士女流棋士YouTubeチャネルを開設された。嫁Pの初勝利は感動した

後適当に今年面白かったもの

もっと前はこんな年でした

Amplify SNS Workshopをやってみた

GW期間中にAmplify SNS Workshopをやってみた。とても面白い内容だったが、ちょっとおかしな挙動をする部分もあった。

本ワークショップのゴール :: Amplify SNS Workshop

ここの図にある通り、AppSync / Cognito / Lambda / DynamoDB等々様々なAWSのサービスをAmplify CLIを使ってTwitterっぽいものを作るチュートリアル。最終的にはgithubにpushするとCIでE2Eテストが動いてその動画をAWSコンソールからダウンロードできる。すごい。 CognitoやLambdaは単体では使ったことがあるので、これ単体でもいろいろノウハウがあって動かすの大変なのに、うまくインテグレートされてるなあと感心した。

ボリュームとしては多くはない。ただデプロイするのに結構時間がかかるので、その間に別のこと始めちゃったりしてだらだらやっていたら3日くらいかかりました。

Timeline上のPostが重複する

Timelineを表示しながらPostすると、Postが重複してしまうという現象が発生した。

f:id:iakio:20200510152925p:plain

PostはLambdaによって

  1. PostTableにSaveされる
  2. 自分と自分のFollowerのTimelineに保存される

この2の処理が意図せず複数回呼び出されているようだ。ただし保存している内容は同じなので結果的には上書きされているだけなんだけど、クライアント側ではこれをsubscribeしてTimelineを表示しているため重複して表示してしまう。その後リロードするとTimelineを読み直すので重複は解消される。

f:id:iakio:20200510161005p:plain

CloudWatchでLambdaのログを見るとこのようになっていた。

2020-05-10T06:27:49.322Z d130970d-d15d-496c-9344-42c58f5c40ad    INFO    [ { followerId: 'iakio' },
  { followerId: 'iakio' },
  { followerId: 'iakio' },
  { followerId: 'iakio' } ]

followerに自分自身が複数入っている。しかしDynamoDBのFollowRelationshipには何も入っていない。どうもLambdaの中で何かが起きているようだ。

   const listFollowRelationshipsResult = await graphqlClient.query({
        query: gql(listFollowRelationships),
        fetchPolicy: 'network-only',
        variables: queryInput,
    });
    console.log(listFollowRelationshipsResult);
    const followers = listFollowRelationshipsResult.data.listFollowRelationships.items;
    console.log(followers);

    //post to timeline
    followers.push({
        followerId: post.owner,
    })
    const results = await Promise.all(followers.map((follower)=> createTimelineForAUser({follower: follower, post: post})));

Timeline機能: @function :: Amplify SNS Workshop

LabmdaやAppSyncについて詳しくないのだが、どうも

  • graphqlClient.query()の戻り値の中のfollwersにpushで破壊的変更をしたら、次にgraphqlClient.queryした時の結果に影響する?
  • しかもそれが次のLamdaの呼び出しにも影響している? graphqlClientがglobalスコープなんだけど、Lambdaでglobalスコープってどうなるんだっけ

という感じがしている。ちなみにpushをやめたら現象は発生しなくなった。

    const followersAndI = followers.concat({
        followerId: post.owner,
    });
    const results = await Promise.all(followersAndI.map((follower)=> createTimelineForAUser({follower: follower, post: post})));

Amplify SNS Workshop :: Amplify SNS Workshop

2019年はこんな年でした

今年いいねしたツイートはだいたい猫

もっと前はこんな年でした

PostgreSQLに接続するときに使える小技の補足

この記事はマニア向けの補足記事です。

psql service=prod

みたいな接続先の指定方法があるという話を書きました。

note.mu

ところでこれこれどう実装されているんでしょう。psqlのコードの中に、service=prodみたいなコマンドライン引数を解釈するコードがあるんだろうかと思ったけど全然そんなのは見当たらないのです。

psqlのヘルプを見てみましょう。

Usage:
 psql [OPTION]... [DBNAME [USERNAME]]

もし、psqlに適当な引数を渡すと、それはDBNAMEとして解釈されます。

$ psql hello
psql: FATAL:  database "hello" does not exist

同様に、service=prodのような文字列をコマンドライン引数として渡した場合も、psql的にはDBNAMEとして扱われます。そしてこれを解釈するのはlibpqです。libpqにはデータベースに接続するための関数がいくつかありますが、psqlでは8.3の頃はPQsetdbLogin()を使っていました(今はPQconnectdbParams()を使っていますが大体似たような話なので省略します)。

https://www.postgresql.jp/document/11/html/libpq-connect.html#LIBPQ-PQSETDBLOGIN

PGconn *PQsetdbLogin(const char *pghost,
                     const char *pgport,
                     const char *pgoptions,
                     const char *pgtty,
                     const char *dbName,
                     const char *login,
                     const char *pwd);

dbName内に=記号が含まれる場合、または有効な接続URI接頭辞を持つ場合、PQconnectdbに渡された場合とまったく同じ扱いでconninfo文字列として扱われます。 その後残りのパラメータがPQconnectdbParamsの指定のように適用されます。

つまり、PQsetdbLogin()の第五引数dbnameにservice=prodみたいな文字列をわたすことができるということです。そして8.3.0のリリースノートにはこの変更について、psqlの変更としてではなくlibpqの変更として以下のように書いてあります。

PostgreSQL: Release Notes

E.147.3.16. libpq

Interpret the dbName parameter of PQsetdbLogin() as a conninfo string if it contains an equals sign (Andrew)

  • This allows use of conninfo strings in client programs that still use PQsetdbLogin().

いかがでしたか?

今回は8.3.0からpsqlのコマンドのコマンドライン引数にconninfo文字列を渡すことができるようになった変更について調べてみました。そしてその変更はpsqlではなくlibpq側で行われたものだということがわかりました。

最後までお読みいただきありがとうございました!もし気に入っていただけたら5000兆円ください!(テンプレあまりよくわかってない)