2021年をふりかえってみるメモです。
今までの振り返り
2016年から振り返っています。
ブログの記事数
なんと、100 記事を越えてしまいまして、2020年をふりかえってみるメモ で使った仕組みが、100件以内の抽出に特化していたので、今回は仕組みを変えました。
Node-RED で作った、このような仕組みです。
最初に、1月初日~最終日、2月初日~最終日、、、、12月初日~最終日と、1~12月の範囲を配列に入れています。
change ノードの中で
JSONata で値を作っています。
くわしい作り方は、先日の記事でまとめました。
この配列を split ノードで分解して、1か月ごとの日付範囲指定をして WordPress の API にアクセスします。各月の投稿された記事を配列として取得してきます。
そのうえで、こちらの change ノードで各月データ取得後に、投稿数をカウントし、このあと CSV データとして書きだすために 2021-01
のような年月の記述も作っておきます。
{ "date":$fromMillis($toMillis(payload[0].date),"[Y0001]-[M01]") , "count":$count(payload) }
こんな感じで JSONata で書いています。便利。
split ノードで分解された各月のデータは join ノードでまとまってこのようになりました。
まとめたあとに、最後に12か月分の配列を、以下の JSONata で合算し CSV で書き出すための配列に append で加えます。
$append( payload, { "date":"all", "count":$sum(payload.count) } )
ここの合算している $sum(payload.count)
は、payload の配下の配列の中から count という数値を全部合算するという指示をしています。やりやすかったです。これを function ノード内で for 構文でがんばるとなると、少々手間がかかるところです。
そして、最後に CSV に書き出して完了です。
このように書き出されました。
108 記事書いていた
なるほど、108 記事書いていたようです。
Google スプレッドシートでグラフを出力してみました。「1ヵ月に5記事は書こう」と考えていましたが、12 月はアドベントカレンダーとして、2 月と 9 月が突出してますね。
今年の中ごろから AirTable にデータを貯めてもいて 9 月をみているとベースの 5 記事だけでなく、Node-RED とフロントエンドの記事を書きまくっていたので上乗せがあったようです。もともと、およそ 80 記事くらいの地力があるので、 20 記事細そういった上乗せ記事が書けたということですかね。
こういう風に、技術への新しい試したい方向性が出てくると記事は自然に増えるので、2022 年もこのあたりを心掛けてやっていこうと思います。いろいろ試したいこと導入したいことあるなーーーー。やっていこう。
JSON フロー
今回のNode-RED フローのJSONデータも置いておきます。
[{"id":"24650d3cc8ba1f55","type":"inject","z":"a14fbb208a64ec21","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":280,"y":100,"wires":[["9c4d2ba76001cc22"]]},{"id":"dbd0395f97cfa659","type":"http request","z":"a14fbb208a64ec21","name":"","method":"GET","ret":"obj","paytoqs":"query","url":"","tls":"","persist":false,"proxy":"","authType":"","x":990,"y":220,"wires":[["b0d1c454a85fef1a"]]},{"id":"9c4d2ba76001cc22","type":"change","z":"a14fbb208a64ec21","name":"1~12月の範囲を配列に","rules":[{"t":"set","p":"payload","pt":"msg","to":"[\t [\t $fromMillis($millis(),'[Y0001]') & \"-01-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $fromMillis($millis(),'[Y0001]') & \"-02-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t ,\t [\t $fromMillis($millis(),'[Y0001]') & \"-02-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $fromMillis($millis(),'[Y0001]') & \"-03-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t ,\t [\t $fromMillis($millis(),'[Y0001]') & \"-03-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $fromMillis($millis(),'[Y0001]') & \"-04-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t ,\t [\t $fromMillis($millis(),'[Y0001]') & \"-04-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $fromMillis($millis(),'[Y0001]') & \"-05-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t \t ,\t [\t $fromMillis($millis(),'[Y0001]') & \"-05-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $fromMillis($millis(),'[Y0001]') & \"-06-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t \t ,\t [\t $fromMillis($millis(),'[Y0001]') & \"-06-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $fromMillis($millis(),'[Y0001]') & \"-07-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t \t ,\t [\t $fromMillis($millis(),'[Y0001]') & \"-07-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $fromMillis($millis(),'[Y0001]') & \"-08-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t \t ,\t [\t $fromMillis($millis(),'[Y0001]') & \"-08-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $fromMillis($millis(),'[Y0001]') & \"-09-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t \t ,\t [\t $fromMillis($millis(),'[Y0001]') & \"-09-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $fromMillis($millis(),'[Y0001]') & \"-10-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t \t ,\t [\t $fromMillis($millis(),'[Y0001]') & \"-10-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $fromMillis($millis(),'[Y0001]') & \"-11-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t \t ,\t [\t $fromMillis($millis(),'[Y0001]') & \"-11-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $fromMillis($millis(),'[Y0001]') & \"-12-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t \t ,\t [\t $fromMillis($millis(),'[Y0001]') & \"-12-01T00:00:00\",\t $fromMillis(\t $toMillis(\t $string($number($fromMillis($millis(),'[Y0001]')) + 1) & \"-01-01T00:00:00\"\t ) - 1000,\t '[Y0001]-[M01]-[D01]T[H01]:[m01]:[s01]',\t '+0900'\t )\t ]\t]","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":490,"y":100,"wires":[["e6213fbf64d384ca","a0e07aa0ee46f96a"]]},{"id":"e6213fbf64d384ca","type":"split","z":"a14fbb208a64ec21","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":240,"y":220,"wires":[["c1c78c718036767a"]]},{"id":"c1c78c718036767a","type":"change","z":"a14fbb208a64ec21","name":"WP REST API パラメータ設定","rules":[{"t":"set","p":"payloadBefore","pt":"msg","to":"payload","tot":"msg"},{"t":"set","p":"payload","pt":"msg","to":"{}","tot":"json"},{"t":"set","p":"payload.page","pt":"msg","to":"1","tot":"str"},{"t":"set","p":"payload.per_page","pt":"msg","to":"100","tot":"str"},{"t":"set","p":"payload.after","pt":"msg","to":"payloadBefore[0]","tot":"jsonata"},{"t":"set","p":"payload.before","pt":"msg","to":"payloadBefore[1]","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":450,"y":220,"wires":[["89df6bce4df898cd"]]},{"id":"2209a3d41ae9e772","type":"join","z":"a14fbb208a64ec21","name":"","mode":"auto","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":"false","timeout":"","count":"","reduceRight":false,"x":870,"y":320,"wires":[["09424bbb77a6e644","f23d1a51ac3628ce"]]},{"id":"b0d1c454a85fef1a","type":"change","z":"a14fbb208a64ec21","name":"各月の合計算出","rules":[{"t":"set","p":"payload","pt":"msg","to":"{\t \"date\":$fromMillis($toMillis(payload[0].date),\"[Y0001]-[M01]\")\t ,\t \"count\":$count(payload)\t}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":320,"wires":[["2209a3d41ae9e772"]]},{"id":"aa19ef5b89c5e276","type":"comment","z":"a14fbb208a64ec21","name":"WordPress アクセス(各月取得)","info":"","x":460,"y":260,"wires":[]},{"id":"d5dfa7e9c37236ee","type":"file","z":"a14fbb208a64ec21","name":"","filename":"blog-report.txt","appendNewline":true,"createDir":false,"overwriteFile":"true","encoding":"none","x":660,"y":460,"wires":[["6e22b662e8c7b2ca"]]},{"id":"6e22b662e8c7b2ca","type":"debug","z":"a14fbb208a64ec21","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":870,"y":460,"wires":[]},{"id":"5296053090b7cd8a","type":"csv","z":"a14fbb208a64ec21","name":"","sep":"\\t","hdrin":"","hdrout":"none","multi":"one","ret":"\\n","temp":"date,count","skip":"0","strings":true,"include_empty_strings":"","include_null_values":"","x":470,"y":460,"wires":[["d5dfa7e9c37236ee"]]},{"id":"09424bbb77a6e644","type":"change","z":"a14fbb208a64ec21","name":"今年の合計","rules":[{"t":"set","p":"payload","pt":"msg","to":"$append(\t payload,\t {\t \"date\":\"all\",\t \"count\":$sum(payload.count)\t }\t)","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":290,"y":460,"wires":[["5296053090b7cd8a"]]},{"id":"f23d1a51ac3628ce","type":"debug","z":"a14fbb208a64ec21","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1050,"y":320,"wires":[]},{"id":"a0e07aa0ee46f96a","type":"debug","z":"a14fbb208a64ec21","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":730,"y":100,"wires":[]},{"id":"89df6bce4df898cd","type":"change","z":"a14fbb208a64ec21","name":"WP REST API URL 設定","rules":[{"t":"set","p":"url","pt":"msg","to":"https://<YOUR WordPress URL>/wp-json/wp/v2/posts","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":750,"y":220,"wires":[["dbd0395f97cfa659"]]}]
以上です。
設定値は <YOUR WordPress URL>
としてあるので、もし使う方は自分の環境に置き換えて使ってください。
アドベントカレンダー
書いたアドベントカレンダーまとめ記事を書いていないので、こちらでまとめておきます。今年は 12 記事を書きました。
今年は Qiita のアドベントカレンダーに 12 個参加しました。
- Node-RED Advent Calendar 2021 の 1 日目の記事
- IoTLT Advent Calendar 2021 の 3 日目の記事
- DevRel Advent Calendar 2021 の 9 日目の記事
- SORACOM Advent Calendar 2021 の 9 日目の記事
- Seeed UG Advent Calendar 2021 の 10 日目の記事
- IBM Cloud Advent Calendar 2021 の 10 日目の記事
- OutSystems Advent Calendar 2021 の 13 日目の記事
- obniz Advent Calendar 2021 の 23 日目の記事
- プロトアウトスタジオ Advent Calendar 2021 の 24 日目の記事
- Node-RED Advent Calendar 2021 の 5 日目の記事
- Node-RED Advent Calendar 2021 の 19 日目の記事
今回もコミュニティ主催やかかわりの深いアドベントカレンダーをはじめに参加しつつ、そこのスケジュールは死守。しかしながら、新たにアドベントカレンダーに参加して記事を書く余力は、ほとんどなかったように思います。
ふりかえり
今年も引き続きコロナ禍が続いていますが、ワクチン接種が自分のところにもやってきて、年の後半は少し安心感があった 1 年でした。そして、息子も保育園に通いはじめて生活のリズムも変化していきつつも、平日はほぼ毎日息子のお迎えに行きつつ、休日も家族で散歩に出かける時間が作れたりと、何とかバランスは取れたかなと思っています。
仕事についても新たなリズムに対して、定例ミーティングを特定の曜日に集中させることで、ミーティングの無い没頭するタイプのタスクをしやすくしたり、タスク管理ツールを活用しながらちょいちょい調整して進むことができました。
たとえば 1 日の最後にやれなかったタスクが貯まった場合。息子が生まれる前であれば、夜にあと 3 時間集中すればさばけるという大技が使えましたが、最近は変わりました。よほどヤバいタスクを残していなければ強制的にその日は一区切りにして、明日や他の日の通常営業な時間にやれるだけやる。うまく再設計して組み込むというのを大切にしています。ここでいう、よほどヤバいタスクというのも年に1回あるかないか、と気づけました。実際にやるときよりも、準備と段取りでだいぶ変わりますね。
私の大好きな遅効性SFな漫画ワールドトリガーでいうなら、主人公の地域では継戦能力重視のスタイルを採っているのですが、まさにこれで。スキルの大技や徹夜のような過負荷でパワーを前借ることでバランスを崩ししながらも短期的には良くても続かない、ということはなるべく避けて、通常の能力の維持をうまくやりくりして日々対応するという感じでしょうか。
まあキレイに言ってますけど、日々地味なやりくりをして泥臭い感じ。引き続き、臨機応変に対応して進むところはありますが、それはそれで楽しんでですね!
また、Microsoft MVP と IBM Champion も無事更新することができました。ただ更新できたというよりは、なんとかアウトプットを自分なりに意識して進める中で、ちゃんと提出する実績が作れていたという感じです。
コロナがあるので、強みである IoT や HoloLens など対面でインパクトがあるコンテンツの攻め方がうまく使えないところはありますが、それでもオンラインでの見せ方を改めて向き合ったり、この reTerminal の登壇のように、ライブデモだけでなくライブコーディングにも挑戦することで、まだまだ良く伝えていく幅はあるなと感じています。
そんな中で、私の Speaker Deck にあるスライドデータをみてみましょう。非公開も含めると 21 登壇していたようです。昨年と、ほぼ同じ登壇数だったようです。月に1~2回程度登壇している感じですね。
コミュニティ運営で言うと、Node-RED User Group では Node-RED Con Tokyo 2021 を 115 に開催できました。オンラインイベントも2回目、無事に終えることができました。
Adobe XD で絵素材を作りつつ StreamYard 有料版 (Basic) での1イベント単位の設定する初動メモ
今回は StreamYard を使った配信を行いましたが、良い配信ができたと思っています。もちろん、運営のみんなで流れを整えられましたし、登壇者の皆さんにもポジティブに協力いただいたおかげです!
講師面では、やはりデジタルハリウッド大学大学院 プロダクトプロトタイピング II の講師をしてきたことが大きなイベントです。年初回なので、授業と授業の間もブラッシュアップしながら対応していて、生徒からも良い反応をいただきました。 10 ~ 11 月がとんでもない高負荷になったのはいい思い出です。そして、東海大学での講義もつづいていて、講義において継続と新規両方の側面が体験できているのは、とても楽しいです。
高負荷と言えば 5 ~ 6 月もかなりのものでしたが、ギリギリのところでやりきれましたし、子育て中の自分の活動力のキャパシティを実感できました。このあたりで、ちゃんとタスクの取り組み方や組み立て方をいろいろ模索してみようと思えたことが、いまにつながっていると思います。
そして、英語登壇は今年もすることができました、登壇後のパネルディスカッションのほうが自分にとっては緊張しましたが、みなさんのサポートもあってなんとか対応できました。上達はなかなか実感できませんが、そうはいっても、英語の会話ややり取りする機会があっても、スッと勇気を出して向かっていけるようになっているので、コミュニケーションツールとして少しずつ力が馴染んでいるはずです!
それでは、また来年もよろしくお願いします。