kakakakakku blog

Weekly Tech Blog: Keep on Learning!

習慣化 振り返り(2024年1-6月)

2024年から Habitify を使って個人的な習慣化管理を楽しんでいる❗️

2024年前半(1-6月)の習慣化を振り返ろうと思う \( 'ω')/

www.habitify.me

朝活🌅

2023年2月から1年半ほど「朝活」を続けていて,Google Sheets に記録していた朝活メモを2024年から Habitify に移行した.2023年の朝活に関しては以下の記事にまとめてある☕

kakakakakku.hatenablog.com

2024年前半(1-6月)で朝活を「176日」継続できたー👏

以下の Habitify ログは 7/9 に取得したため,9日間は差し引いてある.

朝活メトリクス

ちなみに朝活を skip して OK という条件として「飲み会の翌朝」「体調不良の日」の2つを決めていて,半年間で6日は skip した.言い換えると「今日は朝活したくないな〜」という気持ちの弱さが出た場合に限って不達成となる運用にしている😇とは言えそういう日はなくて僕自身にとって朝活はとにかく貴重な時間になっている🕐

朝活で取り組んだこと

Habitify API を使って Habitify メモを集計してみた.176日間コツコツとインプットできた❗️

  25 LocalStack
  22 Python 実践レシピ
  17 Start building with Next.js
  16 位置情報エンジニア養成講座
  16 dbt
  14 AWS コンピュータービジョン開発の教科書
  10 runn
   9 Web API テスト技法
   8 Terraform の教科書
   8 Microsoft Learn GitHub Actions
   8 Bedrock ワークショップ
   4 SageMaker Examples
   4 React-Admin Tutorial
   4 Amazon Verified Permissions workshop
   2 amazon-s3-multipart-upload-transfer-acceleration
   2 Terraform イベント準備
   2 PyTorch
   1 ソフトウェアアーキテクチャメトリクス
   1 Hasura Tutorial PostgreSQL
   1 CDK x EventBridge Pipes
   1 Bedrock デジタルトレーニング
   1 AWS What's New

そして朝活でインプットしたことをテックブログにアウトプットする流れも強く意識している.以下に一部の記事を貼っておく📝 他にもたくさんアウトプットできた〜

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

10分間読書📕

2024年2月12日から「10分間読書」という習慣化を追加した.今まで本を読みたくてもまとまった時間が取れたら読もうというマインドセット(優先順位)になっていて積読になってしまうという課題があった.毎日ガッツリ読む必要はなくてコツコツで良いじゃん📕と考えて「10分間」に決めた.

結果的に積読を減らせていて最高だし,書籍からインプットする機会も増えた.そして,時間に関しては忙しい日は10分間で終わればよく,もっと読みたいな〜と思う日はキリが良いところまで読めばよく,ハードルをできる限り下げた「10分間」という軽さが背中を押してくれている感じがする😀

2024年前半(2-6月)で10分間読書を「140日」継続できたー👏

以下の Habitify ログは 7/9 に取得したため,9日間は差し引いてある.

10分間読書メトリクス

10分間読書で読んだ本

Habitify API を使って Habitify メモを集計してみた.本を読むのは遅いけど毎日楽しくコツコツ読めて本当に良かった \( 'ω')/

  18 データエンジニアリングの基礎
  17 認証と認可 Keycloak 入門
  17 Team Guide to Software Testability
  17 Good Code, Bad Code
  16 AWS コスト最適化ガイドブック
  14 組織を変える5つの対話
  14 テスト駆動 Python 第2版
  12 ソフトウェアアーキテクチャメトリクス
   8 スモール・リーダーシップ
   7 Terraform の教科書

その他

他に3つ習慣化を管理している💪

  • ビタミンを摂る(毎日)
  • プランク(毎日)
  • 1週間を振り返る(毎週)

習慣化に悩む人におすすめの一冊

僕自身は興味のあることを習慣化するのが得意だとは思うけど,もし習慣化に悩む人がいたら「小さな習慣」をおすすめしたい📕

kakakakakku.hatenablog.com

まとめ

2024年後半(7-12月)も Habitify を使って習慣化を楽しむぞー❗️

関連記事

Habitify API に関しては以下にまとめてある.

kakakakakku.hatenablog.com

Grand: Apache Ant の依存関係を可視化する

Grand を使うと Apache Ant ターゲットの依存関係を dot ファイルとして可視化できる.そもそも可視化したくなるほど依存関係が複雑なことが課題ではあると思うけど,既存の build.xml を解析したり,新しく build.xml を読むメンバーのために README.md に図を貼っておいたりという用途はありそう👌

特に新しいツールではなく,また GitHub を見ると2020年頃からメンテナンスは止まってそうだけど,試す機会があってメモとして残しておく❗️

ant-grand.github.io

セットアップ

Grand は Grand 自身を Ant ターゲットとして実行できる.まずは GitHub の Releases から grand-1.9.7.jar をダウンロードしておく.今回は lib/ ディレクトリに置いた.

github.com

Grand を実行するターゲットは可視化対象となる build.xml に直接追加することもできるし,Grand 専用の build.xml を作ることもできる.今回は後者のアイデアを採用して grand.xml を以下のように設定した.

<project name="Grand">
    <target name="grand">
        <typedef resource="net/ggtools/grand/antlib.xml" classpath="lib/grand-1.9.7.jar"/>
        <grand output="build.dot" buildfile="build.xml" />
    </target>
</project>

最終的に以下のようなディレクトリ構成になった👀

.
├── README.md
├── build.xml
├── grand.xml
└── lib
    └── grand-1.9.7.jar

お試し1

まずは Apache Ant のドキュメント Writing a Simple Buildfile に載っている build.xml を使う.

ant.apache.org

<project name="MyProject" default="dist" basedir=".">
  <description>
    simple example build file
  </description>
  <!-- set global properties for this build -->
  <property name="src" location="src"/>
  <property name="build" location="build"/>
  <property name="dist" location="dist"/>

  <target name="init">
    <!-- Create the time stamp -->
    <tstamp/>
    <!-- Create the build directory structure used by compile -->
    <mkdir dir="${build}"/>
  </target>

  <target name="compile" depends="init"
        description="compile the source">
    <!-- Compile the Java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}"/>
  </target>

  <target name="dist" depends="compile"
        description="generate the distribution">
    <!-- Create the distribution directory -->
    <mkdir dir="${dist}/lib"/>

    <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
    <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/>
  </target>

  <target name="clean"
        description="clean up">
    <!-- Delete the ${build} and ${dist} directory trees -->
    <delete dir="${build}"/>
    <delete dir="${dist}"/>
  </target>
</project>

そして ant -f grand.xml grand コマンドを実行すると依存関係を可視化できた❗️

お試し2

次に Apache Ant のドキュメント Tutorial: Hello World with Apache Ant に載っている build.xml を使う.

ant.apache.org

<project name="HelloWorld" basedir="." default="main">
    <property name="src.dir" value="src"/>
    <property name="build.dir" value="build"/>
    <property name="classes.dir" value="${build.dir}/classes"/>
    <property name="jar.dir" value="${build.dir}/jar"/>
    <property name="main-class" value="oata.HelloWorld"/>

    <target name="clean">
        <delete dir="${build.dir}"/>
    </target>

    <target name="compile">
        <mkdir dir="${classes.dir}"/>
        <javac srcdir="${src.dir}" destdir="${classes.dir}"/>
    </target>

    <target name="jar" depends="compile">
        <mkdir dir="${jar.dir}"/>
        <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
            <manifest>
                <attribute name="Main-Class" value="${main-class}"/>
            </manifest>
        </jar>
    </target>

    <target name="run" depends="jar">
        <java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>
    </target>

    <target name="clean-build" depends="clean,jar"/>

    <target name="main" depends="clean,run"/>
</project>

そして ant -f grand.xml grand コマンドを実行すると依存関係を可視化できた❗️

カスタマイズ用プロパティファイル

可視化した依存関係の色は以下のように決まっている🎨

  • 黄色: デフォルトターゲット
  • 緑色: description ありターゲット
  • 白色: description なしターゲット

カスタマイズ用プロパティファイルを使うと一部の設定を変更できる.今回は以下の設定で grand.properties を作った.各ノードのフォントサイズを大きくして,description ありターゲットも 白色(楕円形) にしてみた.正直 description は書かないこともあって,デフォルトの 緑色白色 は同じで良いかな〜と思った.

dot.node.attributes=fontsize="20"
dot.mainnode.attributes=fillcolor="white"

そして grand.xmlproperty タグの設定と grand タグに outputconfigfile オプションを追加すれば OK👌

<project name="Grand">
    <target name="grand">
        <property file="grand.properties"/>
        <typedef resource="net/ggtools/grand/antlib.xml" classpath="lib/grand-1.9.7.jar"/>
        <grand output="build.dot" buildfile="build.xml" outputconfigfile="grand.properties"/>
    </target>
</project>

お試し1で使った build.xml に対して ant -f grand.xml grand コマンドを実行すると,ちゃんとフォントサイズが大きくなって,緑色(長方形) もなくなっていた❗️

Amazon S3 署名付き URL 経由のアップロードでオブジェクトメタデータを設定する

Amazon S3 署名付き URL を発行してオブジェクトをアップロードするときに「オブジェクトメタデータ」も設定できる👌できるのかな〜と気になって試してみたらできた.署名付き URL 経由でアップロードされたオブジェクトに対して付加情報を設定しておくという活用ができそう \( 'ω')/

👾 main.py

今回は Python (boto3) で試した.generate_presigned_url() を実行するときに ParamsMetadata を設定すれば OK👌ようするに署名付き URL を "発行するときに" オブジェクトメタデータを指定しておくことになる.

以下の main.py を実行して署名付き URL を発行すると,署名付き URL 自体に x-amz-meta-key1=value1&x-amz-meta-key2=value2&x-amz-meta-key3=value3 というクエリパラメータが追加された.

import os

import boto3

s3 = boto3.client('s3')

url = s3.generate_presigned_url(
    'put_object',
    Params={
        'Bucket': os.environ['BUCKET'],
        'Key': 'sample.png',
        'Metadata': {
            'key1': 'value1',
            'key2': 'value2',
            'key3': 'value3',
        },
    },
    ExpiresIn=600,
)

print(url)

動作確認

次に適当なファイルとして sample.png を署名付き URL 経由でアップロードする👌

$ PRESIGNED_URL=xxx
$ curl -X PUT --upload-file sample.png ${PRESIGNED_URL}

AWS CLI でオブジェクトメタデータを確認すると,期待通りに設定できていた❗️

$ aws s3api head-object --bucket ${BUCKET} --key sample.png --query 'Metadata' | jq .
{
  "key1": "value1",
  "key2": "value2",
  "key3": "value3"
}

カックマイクラ実況 YouTube 振り返り(開設1年🎉)

2023年7月1日に開設した YouTube チャンネル「カックマイクラ実況」を1年間続けてみた❗️簡単に振り返ろうと思う.

www.youtube.com

ちなみに「6ヶ月間」の振り返りは以下の記事にまとめてある📝機材などは特に変化なし.

kakakakakku.hatenablog.com

Stats (~2024/06/30) 👾

  • 動画: 71本(2023年12月から+46本)
  • チャンネル登録者数: 61人(2023年12月から+45人)
    • チャンネル登録者数「50人」達成 🎉
  • 視聴回数: 22,306回(2023年12月から+21,089回)
    • YouTube ショート「AI に家を建築してもらおう」「5000回再生」達成 🎉

www.youtube.com

YouTube ショート 👾

2024年3月頃から YouTube ショートを作り始めた.計31本も作った❗️最初は今まで作った動画のダイジェストとして作っていて,2024年5月頃からは完全に YouTube ショートのみ作ることにして,マインクラフトのアップデート紹介・Tips 紹介・AI 建築シリーズなどの企画を考えてコツコツと作った.

YouTube ショートを作って驚いたのは「ショートフィード」経由の新規流入が多いことだった.今まで YouTube 動画を作っても誰にも見られず,動画自体に流入してもらうことへのハードルが高いという課題があった.YouTube ショートだとアルゴリズムはわからないけど,チャンネル登録者以外にリーチできて,数名でも興味を持ってもらえる人に見てもらうことができた💡視聴回数の増加・チャンネル登録者数の増加はまさに YouTube ショートの結果と言える.

テクノロジーネタ 👾

2024年1月の振り返り記事に「2024年は "マインクラフト x テクノロジー" な動画も作りたい」という目標を書いた通り,コマンド紹介・Mod 紹介・スナップショットアップデート紹介・AI 建築などの動画を多く作った.Wiki を見ながらコマンドのオプションを調べたり,GitHub リポジトリを見ながら Mod の実装を調べたりする作業は普段の技術調査と同じ流れで特に苦労することなく楽しめた💡僕自身の強みを活かせていると思う \( 'ω')/

例えば ride コマンドを使った以下の動画は個人的におすすめ❗️(全然見られてないけどーw)

www.youtube.com

www.youtube.com

AI 建築シリーズ 👾

2024年6月から個人的に「AI 建築シリーズ」と呼んでいるけど,ChatGPT などの LLM に生成してもらったコードを使ってマインクラフトの建築をするというネタで YouTube ショートを作り始めた💡

www.youtube.com

www.youtube.com

Raspberry Jam Mod (raspberryjammod) を使うと,マインクラフトのバージョンは古めだけど Python から直接マインクラフトを操作できる.プロンプトを工夫すれば,LLM で Raspberry Jam Mod のコードを生成できる👌技術的な勘所がないと環境構築が大変そうではあるけど,特にハマるところはなかった.

github.com

今後 👾

仕事(本業)も増えてきてて YouTube に使える自由時間は減っていく傾向にあるけど,今後も趣味としてコツコツ YouTube 活動は続けていこうと思う❗️チャンネル登録をしてもらえると本当に嬉しいのでもし良かったらポチッとお願いしまーす🙏

www.youtube.com

Apache Ivy の configurations でテストに必要な依存関係を取得する

Apache Ivy を使って Maven Repository からライブラリを取得するときに,例えば CI 環境では JUnit や Mockito などの「テストに必要な依存関係」も取得したいという場面がある.Apache Ivy では configurations(コンフィグレーション) を使って柔軟に依存関係を管理できる👌

サンプルコード

Apache Ivy の ivy.xml を以下のように書いた.ポイントは configurations タグで,今回は compile(コンパイルに必要な依存関係)と test(テストに必要な依存関係)という2種類のコンフィグレーションを設定した.Apache Ivy のドキュメントを見ると,アプリケーション単位の依存関係などさらに柔軟に設定している例もあった💡そして dependency タグを書くときに conf="compile->default"conf="test->default" のようにコンフィグレーションを紐付ければ OK ✅

<ivy-module version="2.0">
    <info organisation="sandbox" module="module"/>

    <configurations>
        <conf name="compile" />
        <conf name="test" />
    </configurations>

    <dependencies>
        <!-- compile -->
        <dependency org="com.google.code.gson" name="gson" rev="2.11.0" conf="compile->default"/>
        <!-- test -->
        <dependency org="org.junit.jupiter" name="junit-jupiter-api" rev="5.10.3" conf="test->default"/>
        <dependency org="org.mockito" name="mockito-core" rev="5.12.0" conf="test->default"/>
        <dependency org="org.mockito" name="mockito-junit-jupiter" rev="5.12.0" conf="test->default"/>
    </dependencies>
</ivy-module>

そして Apache Ant の build.xml には resolve ターゲットと resolve-test ターゲットを書いておく.

<project xmlns:ivy="antlib:org.apache.ivy.ant">
    <target name="resolve">
        <ivy:retrieve type="jar" conf="compile"/>
    </target>
    <target name="resolve-test" depends="resolve">
        <ivy:retrieve type="jar" conf="test"/>
    </target>
</project>

動作確認

ant resolve コマンドを実行すると,コンパイルに必要な Gson とその依存関係を取得できる👌

error_prone_annotations-2.27.0.jar
gson-2.11.0.jar

ant resolve-test コマンドを実行すると,テストに必要な JUnit / Mockito とその依存関係を取得できる👌 そして resolve-test ターゲットには resolve ターゲットへの依存も設定しているため,コンパイルに必要な依存関係も取得できている \( 'ω')/

apiguardian-api-1.1.2.jar
byte-buddy-1.14.15.jar
byte-buddy-agent-1.14.15.jar
error_prone_annotations-2.27.0.jar
gson-2.11.0.jar
junit-jupiter-api-5.10.3.jar
junit-platform-commons-1.10.3.jar
mockito-core-5.12.0.jar
mockito-junit-jupiter-5.12.0.jar
objenesis-3.3.jar
opentest4j-1.3.0.jar

ドキュメント

以下に Apache Ivy の configurations に関連するドキュメントを載せておく🔗

ant.apache.org

ant.apache.org

ant.apache.org

関連記事

kakakakakku.hatenablog.com