<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
 xmlns:atom="http://www.w3.org/2005/Atom"
>
<channel rdf:about="https://tattyamm.blog.jp/">
<title>えんたつの記録</title>
<link>https://tattyamm.blog.jp/</link>
<description>
</description>
<dc:language>ja</dc:language>
<admin:generatorAgent rdf:resource="http://blog.livedoor.com/?v=2.0" />
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com" />
<items>
 <rdf:Seq>
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5873756.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5847200.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5847199.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5845813.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5813463.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5810471.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5800362.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5772728.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5761686.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5761308.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5758588.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5752610.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5751276.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5729397.html" />
  <rdf:li rdf:resource="https://tattyamm.blog.jp/archives/5723112.html" />
 </rdf:Seq>
</items>
</channel>
<item rdf:about="https://tattyamm.blog.jp/archives/5873756.html">
<title>AndroidアプリのGoogle Playでの公開を終了します</title>
<link>https://tattyamm.blog.jp/archives/5873756.html</link>
<description>　先日のGoogle Play Androidアプリストア側の仕様変更により、収益化を選択している場合は住所等の公開が必須となりました。この収益化の選択は過去選んだものがそのまま適用されるため、私も該当してしまったようです。
Android Developers Japan Blog: Google Play の信頼...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2024-08-05T00:00:38+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[　先日のGoogle Play Androidアプリストア側の仕様変更により、収益化を選択している場合は住所等の公開が必須となりました。この収益化の選択は過去選んだものがそのまま適用されるため、私も該当してしまったようです。
<br><a href="https://android-developers-jp.googleblog.com/2023/07/boosting-trust-and-transparency-in-google-play.html" title="Android Developers Japan Blog: Google Play の信頼性と透明性を向上させるための新たなポリシー アップデート">Android Developers Japan Blog: Google Play の信頼性と透明性を向上させるための新たなポリシー アップデート</a>
<br>
<br>　そのため残念ながらGoogle Playでのアプリの公開は終了とします。Google側の追加の必須入力事項が未入力状態のため、そのうち公開停止される見込みです。
<br>　今後はgithubの方にapkファイルは置いて、Amazon アプリストア、AppleのApp Storeでの公開とします。
<br>・<a href="https://www.amazon.co.jp/dp/B019VRYCD8" title="チェックトレンド-Amazonアプリストアのアプリ">Amazonアプリストア</a>
<br>・<a href="https://apps.apple.com/jp/app/checktrend-%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%88%E3%83%AC%E3%83%B3%E3%83%89/id397153166" title="「CheckTrend - チェックトレンド」をApp Storeで">Apple App Storeで</a>
<br>・<a href="https://github.com/tattyamm/checktrend_android/blob/master/app/build/outputs/apk/no-signature/app-no-signature-unsigned.apk">Github apk</a>
<br>
<br>　現在新しくGoogle Playアカウントを作るにはハードルが高いのもありますし、これまでずっと使ってきたアカウントのため手放したくはなかったのですが仕方ありません。今後ともよろしくお願いします。
<br><a href="https://support.google.com/googleplay/android-developer/answer/14151465?hl=ja" title="新しい個人用デベロッパー アカウント向けのアプリテスト要件 - Play Console ヘルプ">新しい個人用デベロッパー アカウント向けのアプリテスト要件 - Play Console ヘルプ</a>
<br>
<br>
<br>


<a href="https://livedoor.blogimg.jp/tattyamm/imgs/3/d/3d07b876.png" title="screencapture-play-google-store-apps-details-2024-08-04-23_33_30" target="_blank"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/3/d/3d07b876-s.png" width="480" height="759" border="0" alt="screencapture-play-google-store-apps-details-2024-08-04-23_33_30" hspace="5" class="pict" /></a>

<a href="https://livedoor.blogimg.jp/tattyamm/imgs/e/6/e6bc1998.png" title="screencapture-play-google-store-apps-details-2024-08-04-23_33_57" target="_blank"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/e/6/e6bc1998-s.png" width="480" height="789" border="0" alt="screencapture-play-google-store-apps-details-2024-08-04-23_33_57" hspace="5" class="pict" /></a>

<a href="https://livedoor.blogimg.jp/tattyamm/imgs/a/a/aabe497c.png" title="screencapture-play-google-store-apps-details-2024-08-04-23_34_10" target="_blank"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/a/a/aabe497c-s.png" width="480" height="1055" border="0" alt="screencapture-play-google-store-apps-details-2024-08-04-23_34_10" hspace="5" class="pict" /></a>

<a href="https://livedoor.blogimg.jp/tattyamm/imgs/f/b/fbe47464.png" title="screencapture-play-google-store-apps-details-2024-08-04-23_34_24" target="_blank"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/f/b/fbe47464-s.png" width="480" height="905" border="0" alt="screencapture-play-google-store-apps-details-2024-08-04-23_34_24" hspace="5" class="pict" /></a>


]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5847200.html">
<title>Amazonアプリストア向けアプリを更新しました</title>
<link>https://tattyamm.blog.jp/archives/5847200.html</link>
<description>Amazon Appstore向けのアプリを久しぶりに更新しました。

チェックトレンド:Amazon.co.jp:Appstore for Android

配信するのに必要なAABファイルの署名は何でも良いらしく、Amazon側で署名し直されるようです。
スクリーンショットのサイズが固定なのでGoogle Playストアか...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2023-11-15T19:51:28+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[Amazon Appstore向けのアプリを久しぶりに更新しました。
<br>
<br><a href="https://www.amazon.co.jp/dp/B019VRYCD8" title="チェックトレンド:Amazon.co.jp:Appstore for Android">チェックトレンド:Amazon.co.jp:Appstore for Android</a>
<br>
<br>配信するのに必要なAABファイルの署名は何でも良いらしく、Amazon側で署名し直されるようです。
<br>スクリーンショットのサイズが固定なのでGoogle Playストアからの流用は難しいかもしれません、その点以外はシンプルなアプリならファイル提出のみで提出可能な内容です。
<br>



]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5847199.html">
<title>aceビジネスリュックの「ガジェタブル」シリーズについてのメモ</title>
<link>https://tattyamm.blog.jp/archives/5847199.html</link>
<description>ビジネスリュックについて調べる上でaceのも含めてチェックしたところ、サイズやシリーズについていまいち分からなかったので整理したメモです。

シリーズ一覧はここ
https://store.ace.jp/shop/c/c40044/
もしくはここ
https://www.ace-dot.com/series/gadgetable_SP.php

...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2023-11-13T21:47:11+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[ビジネスリュックについて調べる上でaceのも含めてチェックしたところ、サイズやシリーズについていまいち分からなかったので整理したメモです。
<br>
<br>シリーズ一覧はここ
<br><a href="https://store.ace.jp/shop/c/c40044/" title="ガジェタブルシリーズ｜ace. GENE LABEL(ジーンレーベル)｜エース公式通販">https://store.ace.jp/shop/c/c40044/</a>
<br>もしくはここ
<br><a href="https://www.ace-dot.com/series/gadgetable_SP.php" title="ガジェタブルシリーズ [GADGETABLE] #前持ちリュック｜ace.（エース）公式サイト ［エース株式会社の総合バッグブランド］">https://www.ace-dot.com/series/gadgetable_SP.php</a>
<br>
<br>
<br>シリーズについて分かったこと
<br>・最初のシリーズ名は「ガジェタブル」、2018年から発売されている、当時の一番のポイントは電車の中で邪魔にならないこと
<br><a href="https://prtimes.jp/main/html/rd/p/000000055.000015319.html" title="リュックの持ち方マナーに着目！電車内で邪魔にならないリュック | エース株式会社のプレスリリース">プレスリリース</a>
<br>・その後のシリーズは大きく分けると4通りあり「ガジェタブルの中の種類違い」「ガジェタブルから布やパーツが大きく違うなどの派生モデル」「ガジェタブルの改良版のガジェタブルR」「ガジェタブルRの派生モデル」がある
<br>・「ガジェタブルR」が従来品からユーザーの声をうけて改良を加えたもの、このバージョンは布の質感は１通り、2023年3月に発売された
<br><a href="https://prtimes.jp/main/html/rd/p/000000434.000015319.html" title="29万個販売の大人気モデルがユーザーの声を元にアップデート！体型に合わせて選べるジェンダーレスビジネスリュック「ガジェタブルR」登場｜エース株式会社のプレスリリース">プレスリリース</a>
<br>・既に販売していない限定バージョンがある。2021年に「<a href="https://www.watch.impress.co.jp/docs/news/1351222.html" title="エース、貴重品ポケット装備のビジネスリュック「ガジェタブルHG」 - Impress Watch">ガジェタブルHG</a>」があったはずなのだが公式サイトから見つからない。同様に2022年の限定モデル「<a href="https://store.ace.jp/shop/c/c40132/" title="ガジェタブル EF｜ace. GENE LABEL(ジーンレーベル)｜エース公式通販">ガジェタブルEF</a>」が出ておりはサイトで確認できるがシリーズ一覧にはのってない。
<br>・ムービングとか書いてあったら腰のところに特殊なサポーターのようなパーツがついており、このシリーズはかなり違うリュックになっている
<br>
<br>ガジェタブルRでの更新点
<br>・肩ひもが2タイプあり細いタイプは女性をメインで想定、実際かなり細め
<br>・肩ひもが太い方にのみチェストベルト付き
<br>・ファスナー引手が揺れたときにカチャカチャ音が出づらくなった
<br>・背面ポケットが両側から使えるようになった、内部は独立
<br>・リュックと腰が接する部分がメッシュからツルツルの素材に代わり摩擦軽減されたらしい
<br>
<br>選ぶときに考えること
<br>・まずは改良版の「ガジェタブルR」から検討するのが良い感じがする
<br>・他のシリーズは布の質感や特徴的な機能が魅力的な場合に選択肢に入る、例えば耐水性能の高い「ガジェタブルWR」など
<br>・どのサイズが良いか選ぶとき、サイズにA4と書いてあっても2通りあったりするし、PCのインチ数が同じでも容量が違う場合もある、シリーズによりサイズのラインナップは異なる
<br>
<br>リンク
<br>※PRリンクあり
<br>・使用感のある写真は<a href="https://jp.mercari.com/search?keyword=%E3%82%AC%E3%82%B8%E3%82%A7%E3%82%BF%E3%83%96%E3%83%AB&item_condition_id=3%2C4%2C5%2C6&afid=4710872125">メルカリにあり</a>参考になる
<br>・<a href="https://hb.afl.rakuten.co.jp/hgc/36ee2283.59b55ba8.36ee2284.46e40e3c/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Face-store%2Fc%2F0000001013%2F&link_type=hybrid_url&ut=eyJwYWdlIjoidXJsIiwidHlwZSI6Imh5YnJpZF91cmwiLCJjb2wiOjF9">楽天の公式ストア</a>
<br>・<a href="https://www.amazon.co.jp/stores/page/9F03409D-414D-4185-9D71-4B84D2D71E69?&linkCode=ll2&tag=tattyamm-22&linkId=6f4acf5ccf52240fcd0b6499efbbf012&language=ja_JP&ref_=as_li_ss_tl">Amazonの公式ストア</a>
<br>・<a href="https://store.ace.jp/shop/c/c40044/">aceオンラインストア</a>
<br>・ガジェタブルR
<br><a href="https://hb.afl.rakuten.co.jp/hgc/36ee2283.59b55ba8.36ee2284.46e40e3c/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Face-store%2Fc%2F0000001717%2F&link_type=text&ut=eyJwYWdlIjoidXJsIiwidHlwZSI6InRleHQiLCJjb2wiOjF9">楽天</a>、<a href="https://www.amazon.co.jp/%E3%82%A8%E3%83%BC%E3%82%B9%E3%82%B8%E3%83%BC%E3%83%B3-%E3%83%93%E3%82%B8%E3%83%8D%E3%82%B9%E3%83%AA%E3%83%A5%E3%83%83%E3%82%AF-%E3%82%AC%E3%82%B8%E3%82%A7%E3%82%BF%E3%83%96%E3%83%AB-R-14-0%E3%82%A4%E3%83%B3%E3%83%81PC%E5%8F%8E%E7%B4%8D%E5%8F%AF-%E3%83%AA%E3%82%B5%E3%82%A4%E3%82%AF%E3%83%AB%E3%83%8A%E3%82%A4%E3%83%AD%E3%83%B3%E4%BD%BF%E7%94%A8/dp/B0BWDJ64NR?keywords=ace%2B%E3%82%AC%E3%82%B8%E3%82%A7%E3%82%BF%E3%83%96%E3%83%ABr&qid=1699864535&sr=8-1&th=1&linkCode=ll1&tag=tattyamm-22&linkId=966d35ef8cd1cbe9896509ed2164d35e&language=ja_JP&ref_=as_li_ss_tl">Amazon</a>
<br><a href="https://hb.afl.rakuten.co.jp/hgc/36ee2283.59b55ba8.36ee2284.46e40e3c/?pc=https%3A%2F%2Fitem.rakuten.co.jp%2Face-store%2Fc%2F0000001717%2F&link_type=text&ut=eyJwYWdlIjoidXJsIiwidHlwZSI6InRleHQiLCJjb2wiOjF9" title="ガジェタブルR"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/1/e/1e0fd3cb-s.jpg" width="160" height="204" border="0" alt="ガジェタブルR" hspace="5" class="pict" align="left"  /></a>
<br>
]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5845813.html">
<title>AndroidアプリをJetpack Composeで刷新しました</title>
<link>https://tattyamm.blog.jp/archives/5845813.html</link>
<description>チェックトレンドアプリのAndroid版について、従来のJavaから全面的にKotlinに書き直し、Jetpack Composeで全体を作成し直しました。
元々Android版はシンプルな内容にしており今回もそれを引き継いでいます。またデザイン周りはMaterial Theme Builderで色を決め自分で配置...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2023-10-30T19:35:18+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[チェックトレンドアプリのAndroid版について、従来のJavaから全面的にKotlinに書き直し、Jetpack Composeで全体を作成し直しました。
元々Android版はシンプルな内容にしており今回もそれを引き継いでいます。またデザイン周りは<a href="https://m3.material.io/theme-builder#/custom" title="Material Design">Material Theme Builder</a>で色を決め自分で配置しています。そのため標準的Androidアプリに従っているかわかりませんがとりあえず出します。
<br>
<br><a href="https://play.google.com/store/apps/details?hl=ja&id=jp.tattyamm.android.checktrend">Google PlayでチェックトレンドをDL</a>
<br><a href="https://github.com/tattyamm/checktrend_android">ソースコード</a>
<br>
]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5813463.html">
<title>iPhoneアプリをSwiftUIで刷新しました</title>
<link>https://tattyamm.blog.jp/archives/5813463.html</link>
<description>従来のObjective-Cから全面的にSwiftに書き直し、SwiftUIで全体を作成しました。
このアプリは中でやっていることがシンプルなこともあり、非同期処理含めてコンパクトにしました。

また、従来は更新のたびにライブラリ導入周りが進化したり変わったりしており環境維持にコ...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2022-11-20T18:36:00+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[従来のObjective-Cから全面的にSwiftに書き直し、SwiftUIで全体を作成しました。
このアプリは中でやっていることがシンプルなこともあり、非同期処理含めてコンパクトにしました。
<br>
<br>また、従来は更新のたびにライブラリ導入周りが進化したり変わったりしており環境維持にコストがかかっていました。今回はライブラリを使わずに実装しています。個人開発ではこの方が本体に集中できて良いですね。
<br>
<br><a href="https://itunes.apple.com/jp/app/id397153166?mt=8">AppStoreでチェックトレンドをDL</a>
<br><a href="https://github.com/tattyamm/checktrend_ios">ソースコード</a>
<br>
]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5810471.html">
<title>railsアプリをherokuからfly.ioに移動</title>
<link>https://tattyamm.blog.jp/archives/5810471.html</link>
<description>自作のwebアプリを動かすのに気軽な場所としてherokuを使っていました。このherokuの無料枠が今度から無くなるのに合わせて環境を移動します。今回はいくつか試した結果、fly.ioへ移動しています。

選定理由
今回移動したwebアプリはDBを使わないシンプルなrailsアプリです...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2022-10-23T22:54:50+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[自作のwebアプリを動かすのに気軽な場所としてherokuを使っていました。このherokuの無料枠が今度から無くなるのに合わせて環境を移動します。今回はいくつか試した結果、fly.ioへ移動しています。

<h3>選定理由</h3>
今回移動したwebアプリはDBを使わないシンプルなrailsアプリです。そのためDBに関しては評価していません。その中でいくつか試した結果、デプロイがCLIで完結していること、tokyoリージョンがあること、などを理由にfly.ioを使うこととしました。
<br>例えばrender.comはgithub連動が前提になるなどの扱いづらさがあります。そういった点もfly.io採用理由です。(fly.io良さそうだったのでrailwayは試してません。)

<h3>fly.io向け対応</h3>
これまでherokuではdockerではなく直接railsアプリを動かしていました。この場合、fly.ioにデプロイする前にDockerfileが自動的に生成されます。ここから多少の調整は必要で、自分の場合は以下のことを行いました。
<br>・Dockerfileにnodejs追加(<a href="https://github.com/tattyamm/atodeyomo/blob/738751af67108f78a91b63779fe7a3ed3d7c38e1/Dockerfile#L76">追加箇所</a>)
<br>・環境変数はfly.ioだとコマンドラインから登録になるので追加
<br>
<br>fly.ioにはクレカ登録があらかじめ必要だったり無料登録できるアプリ数に制限があるなど注意点はあるため、アプリが増えたら課金することにはなるでしょう。そこは注意しておく必要があります。


<h3>リンク</h3>
fly.io <a href="https://fly.io/">fly.io</a>
<br>今回移動したwebサービス <a href="https://github.com/tattyamm/atodeyomo" title="tattyamm/atodeyomo: Webページを保存するサービス">tattyamm/atodeyomo: Webページを保存するサービス</a>
]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5800362.html">
<title>phpでApp Store Server Notifications v2のJWSを検証する</title>
<link>https://tattyamm.blog.jp/archives/5800362.html</link>
<description>StoreKit2が発表されたのと同じタイミングで、App Store Server Notifications v2が発表されました。
App Store Server Notifications | Apple Developer Documentation
この通知ではAppleから様々な情報を受け取ることができます。利用する際には通知が本当にAppleから来た...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2022-07-18T20:57:36+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[StoreKit2が発表されたのと同じタイミングで、App Store Server Notifications v2が発表されました。
<br><a href="https://developer.apple.com/documentation/appstoreservernotifications" title="App Store Server Notifications | Apple Developer Documentation">App Store Server Notifications | Apple Developer Documentation</a>
<br>この通知ではAppleから様々な情報を受け取ることができます。利用する際には通知が本当にAppleから来たものか確認するためにJWSの検証を行う必要があります。
<br>ここではphpでどのように検証を行うかについて整理します。内容に間違いがありましたらコメントお願いします。


<h3>テスト通知送信</h3>
通知の内容をv1にするかv2にするかはApp Store Connectで切り替えることが可能です。テスト課金を行って通知を飛ばす場合、あらかじめ切り替えておきましょう。
<br>また、App Store Connectの設定をv1にしたままでもRequest a Test Notification APIにより通知を飛ばすとv2仕様で通知が飛ぶようです。まずはこれを実行することでテスト通知を送信しつつ検証をすすめるのも良いでしょう。
<br><a href="https://developer.apple.com/documentation/appstoreserverapi/request_a_test_notification" title="Request a Test Notification | Apple Developer Documentation">Request a Test Notification | Apple Developer Documentation</a>


<h3>手順</h3>

通知が送信されるとこのようなデータを受信できます。
<pre class="prettyprint">
{ "signedPayload": "eyJh ..."}
</pre>
<a href="https://developer.apple.com/documentation/appstoreservernotifications/signedpayload" title="signedPayload | Apple Developer Documentation">signedPayload | Apple Developer Documentation</a>
<br>signedPayloadの中身をドットで区切り、それぞれbase64 decodeするとで先頭から順にheader, payload, signatureを得ます。
<pre class="prettyprint">
$contents = '{"signedPayload":"eyJh ... ";
$signedPayload = json_decode($contents, true)['signedPayload'];
list($jws_header, $jws_body, $jws_signature) = explode(".", $signedPayload);
$header = json_decode(base64_decode($jws_header), true);
$payload = json_decode(base64_decode($jws_body), true);
$signature = base64_decode($jws_signature);
</pre>

まずheaderから証明書を取り出し、その証明書を変換しておきます。
<pre class="prettyprint">
$chain_array = $header['x5c'];
$pem_from_x5c_cert_list = array();
foreach ($chain_array as $key => $chain_array_item) {
    $pem_from_x5c_cert = (
        "-----BEGIN CERTIFICATE-----\n" .
        chunk_split($chain_array_item, 64, "\n") .
        "-----END CERTIFICATE-----\n"
    );
    $pem_from_x5c_cert_list[] = $pem_from_x5c_cert;
    //証明書の内容を確認する場合
    $chain_cert = openssl_x509_parse(openssl_x509_read($pem_from_x5c_cert));
    echo('証明書の内容 : ' . PHP_EOL);
    echo ('name : ' . $chain_cert['name'] . PHP_EOL);
}
</pre>

データの中身はpayloadに入っています。
そのデータについてまずsignatureで検証します。ここではfirebase/php-jwtを使いました。
<br><a href="https://github.com/firebase/php-jwt/blob/018dfc4e1da92ad8a1b90adc4893f476a3b41cb8/src/JWT.php#L90" title="php-jwt/JWT.php at 018dfc4e1da92ad8a1b90adc4893f476a3b41cb8 · firebase/php-jwt">php-jwt/JWT.php at 018dfc4e1da92ad8a1b90adc4893f476a3b41cb8 · firebase/php-jwt</a>
<pre class="prettyprint">
(あらかじめ)
use \Firebase\JWT\JWT;
(コード)
$jwt_decode_result = JWT::decode($signedPayload, new \Firebase\JWT\Key($pem_from_x5c_cert_list[0], 'ES256'));
var_dump($jwt_decode_result);
</pre>

<br>
次に証明書チェーンの検証を行います。
<br>まずAppleのルート証明書を用意します。ダウンロードして.cerを.pemに変換します。Appleのルート証明書が更新される可能性があるのでそこに注意する必要がありますが、このコードのように毎回ダウンロードする必要は無いはずなのであくまでサンプルです。
<pre class="prettyprint">
$apple_cert_url = 'https://www.apple.com/certificateauthority/AppleRootCA-G3.cer';
$apple_cert_content = file_get_contents($apple_cert_url);
$apple_pem =  '-----BEGIN CERTIFICATE-----'.PHP_EOL
    .chunk_split(base64_encode($apple_cert_content), 64, PHP_EOL)
    .'-----END CERTIFICATE-----'.PHP_EOL;
</pre>

得られたAppleのルート証明書を含め、これらの証明書を順番に検証していきます。
まずappleの証明書を追加しておきます。
<pre class="prettyprint">
$pem_from_x5c_cert_list[] = $apple_pem;
</pre>

<br>
php7.4以上ではopenssl_x509_verify()が使えるため、以下のように検証できます。
<br><a href="https://www.php.net/manual/ja/function.openssl-x509-verify.php" title="PHP: openssl_x509_verify - Manual">PHP: openssl_x509_verify - Manual</a>
<pre class="prettyprint">
//検証
foreach ($chain_array as $key => $chain_array_item) {
    $result = openssl_x509_verify($pem_from_x5c_cert_list[$key + 1], openssl_get_publickey($pem_from_x5c_cert));
    var_dump($result);
    echo $result ? 'valid'.PHP_EOL : 'invalid'.PHP_EOL;
}
</pre>

php7.4未満のバージョンの場合、phpseclibのv3を使い以下のように書けます。
<pre class="prettyprint">
(あらかじめ)
use phpseclib\File\X509;
(コード)
for($i = 0; $i < (count($pem_from_x5c_cert_list) - 1); $i++) {
    $cert = $pem_from_x5c_cert_list[$i];
    $x509 = new X509();
    $x509->loadCA($pem_from_x5c_cert_list[$i+1]);
    $cert = $x509->loadX509($cert);
    var_dump($x509->validateSignature());
    echo $x509->validateSignature() ? 'valid'.PHP_EOL : 'invalid'.PHP_EOL;
}
</pre>

これらの検証が全部okになる必要があります。


<h3>まとめ</h3>
App Store Server Notificationsの通知のJWT検証をphpで行いました。これらの手順を行ってから通知の中身に入る必要があります。Appleからはv1廃止時期はアナウンスされていませんが今後はv2が必須になりそうなため、早めに対応しておきましょう。


<h3>参考文献</h3>
<a href="https://mixi-developers.mixi.co.jp/verify-app-store-server-notification-version-2-22f6cb88add1" title="App Store Server Notifications Version 2（StoreKit 2）の JWS を検証する | by Taiga ASANO | mixi developers">App Store Server Notifications Version 2（StoreKit 2）の JWS を検証する | by Taiga ASANO | mixi developers</a>
<br><a href="https://developer.apple.com/forums/thread/691464" title="Validate StoreKit2 in-app purchase… | Apple Developer Forums">Validate StoreKit2 in-app purchase… | Apple Developer Forums</a>
<br><a href="https://tech.griphone.co.jp/2020/06/30/php-safetynet-api/" title="phpでSafetyNet APIのレスポンスの証明書を検証する | GRIPHONE ENGINEER'S BLOG">phpでSafetyNet APIのレスポンスの証明書を検証する | GRIPHONE ENGINEER'S BLOG</a>
]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5772728.html">
<title>PythonでCSA形式の棋譜データを読み込む</title>
<link>https://tattyamm.blog.jp/archives/5772728.html</link>
<description>pythonで棋譜データを扱う
棋譜データをpythonで読み込む方法についてのメモです。こちらのライブラリを使用させて頂いています。
GitHub - gunyarakun/python-shogi: A pure Python shogi library with move generation and validation and handling of common formats.

元...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2021-11-01T00:22:26+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[<h3>pythonで棋譜データを扱う</h3>
棋譜データをpythonで読み込む方法についてのメモです。こちらのライブラリを使用させて頂いています。
<br><a href="https://github.com/gunyarakun/python-shogi" title="GitHub - gunyarakun/python-shogi: A pure Python shogi library with move generation and validation and handling of common formats.">GitHub - gunyarakun/python-shogi: A pure Python shogi library with move generation and validation and handling of common formats.</a>
<br>
<br>元となる棋譜データはCSA形式を想定しています。サンプルデータには「将棋DB2」のCSA形式ファイルを使用しました。
<br>例 <a href="https://shogidb2.com/games/e9929b1b5bcc76d04a6b8fb84402525be1be9431" title="羽生善治 vs. 藤井猛 順位戦 - 無料の棋譜サービス 将棋DB2">羽生善治 vs. 藤井猛 順位戦 - 無料の棋譜サービス 将棋DB2</a>

<h3>サンプルコード</h3>
<pre class="prettyprint">
import shogi.CSA

kif = shogi.CSA.Parser.parse_file('test.csa')[0]

board = shogi.Board()
for move in kif['moves']:
    # どこからどこに移動したか USIプロトコル形式
    print(move)
    # 移動
    board.push_usi(move)

    # 盤面表示
    print(board) # テキスト形式(ASCII文字)
    print(board.kif_str()) # テキスト形式(KIFスタイル)

    # 占有している駒の位置 右下から左に移動という方向で表記されている
    print('{:0=81b}'.format(board.occupied[shogi.BLACK]))# 先手
    print('{:0=81b}'.format(board.occupied[shogi.WHITE]))# 後手
    
    # 先手の持ち駒 参考 : https://tadaoyamaoka.hatenablog.com/entry/2017/04/08/165742
    hand = board.pieces_in_hand
    hand_b = hand[shogi.BLACK]
    for p in hand_b.keys():
        print("piece: {0}, num: {1}".format(shogi.Piece(p, shogi.BLACK).symbol(), hand_b[p]))
        print("piece: {0}, num: {1}".format(shogi.Piece(p, shogi.BLACK).japanese_symbol(), hand_b[p]))

    print('-'*100)
</pre>

<h3>USI形式について</h3>
駒の表記法、位置の表記法についてはこちらをご覧ください
<br><a href="http://shogidokoro.starfree.jp/usi.html" title="将棋所：USIプロトコルとは">将棋所：USIプロトコルとは</a>
<h4>駒の表記法</h4>
<blockquote>
盤面を表記するとき、１段目の左側（９筋側）から駒の種類を書いていきます。空白の升は、空白が続く個数の数字を書きます。
<br>平手初期局面の場合、１段目は、左から後手の駒が香桂銀金玉金銀桂香と並んでいるので、lnsgkgsnlとなります。２段目は、空白が１升、後手の飛車、空白が５升、後手の角、空白が１升というように並んでいるので、1r5b1となります。
</blockquote>

<h4>位置の表記法</h4>
<blockquote>
指し手に関しては、駒の移動元の位置と移動先の位置を並べて書きます。７七の駒が７六に移動したのであれば、7g7fと表記します。（駒の種類を表記する必要はありません。）
<br>駒が成るときは、最後に+を追加します。８八の駒が２二に移動して成るなら8h2b+と表記します。
<br>持ち駒を打つときは、最初に駒の種類を大文字で書き、それに*を追加し、さらに打った場所を追加します。金を５二に打つ場合はG*5bとなります
</blockquote>

]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5761686.html">
<title>Python MidoでのMIDIファイル生成方法メモ</title>
<link>https://tattyamm.blog.jp/archives/5761686.html</link>
<description>Mido

midoはMIDIを扱うことができるpythonライブラリです。
このライブラリを使うことでMIDIファイルの読み書きが可能です。今回はpython3で音を指定してMIDIファイルを作成するmidoの使い方についてメモしていきます。


基本形

まずはこのドキュメント通りに出力して、no...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2021-07-27T19:28:53+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[<h3>Mido</h3>

midoはMIDIを扱うことができるpythonライブラリです。
<br>このライブラリを使うことでMIDIファイルの読み書きが可能です。今回はpython3で音を指定してMIDIファイルを作成するmidoの使い方についてメモしていきます。


<h3>基本形</h3>

まずはこのドキュメント通りに出力して、noteの値を変えて音が変わることを確認してみましょう。
<br><a href="https://mido.readthedocs.io/en/latest/midi_files.html" title="MIDI Files — Mido 1.2.10 documentation">MIDI Files — Mido 1.2.10 documentation</a>

<pre class="prettyprint">
import mido
from mido import Message, MidiFile, MidiTrack

mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)

# MIDIの音色を指定
track.append(Message('program_change', program=12, time=0))
# C3(note=60, ド)の音を、指定の音量と時間で再生
track.append(Message('note_on', note=60, velocity=64, time=32))
track.append(Message('note_off', note=60, velocity=127, time=32))

mid.save('new_song.mid')
</pre>

※Messageに指定する値と範囲はこちらのドキュメントを参照してください。
<br><a href="https://mido.readthedocs.io/en/latest/message_types.html" title="Message Types — Mido 1.2.10 documentation">Message Types — Mido 1.2.10 documentation</a>
<br>
<br>テンポを指定するにはset_tempoを使います。4分音符の長さを480tickとして、tick数により長さを指定します。
<br>テンポを指定しつつ、いくつかの音を出してみましょう。

<pre class="prettyprint">
import mido
from mido import Message, MidiFile, MidiTrack, MetaMessage

mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)
track.append(MetaMessage('set_tempo', tempo=mido.bpm2tempo(120)))

track.append(Message('note_on', note=60, velocity=64, time=0))
track.append(Message('note_off', note=60, time=480))
track.append(Message('note_on', note=60+4, velocity=64, time=0))
track.append(Message('note_off', note=60+4, time=480))
track.append(Message('note_on', note=60+7, velocity=64, time=0))
track.append(Message('note_off', note=60+7, time=480))

mid.save('new_song.mid')
</pre>

このような内容のmidiが出力されます。
<br><a href="https://livedoor.blogimg.jp/tattyamm/imgs/8/7/87c16629.png"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/8/7/87c16629.png" width="195" height="208" border="0" alt="sample2_midi" hspace="5" class="pict"  /></a>
<br>


<h3>和音の出し方</h3>

音を重ねるにはこのように指定します。

<pre class="prettyprint">
import mido
from mido import Message, MidiFile, MidiTrack, MetaMessage

mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)
track.append(MetaMessage('set_tempo', tempo=mido.bpm2tempo(120)))

track.append(Message('note_on', note=64, velocity=60, time=0))
track.append(Message('note_on', note=64+4, velocity=60, time=0))
track.append(Message('note_on', note=64+7, velocity=60, time=0))
track.append(Message('note_off', note=64, time=480))
track.append(Message('note_off', note=64+4, time=0))
track.append(Message('note_off', note=64+7, time=0))

mid.save('new_song.mid')
</pre>

<a href="https://livedoor.blogimg.jp/tattyamm/imgs/5/8/580e1253.png"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/5/8/580e1253.png" width="190" height="193" border="0" alt="sample3_midi" hspace="5" class="pict"  /></a>
<br>


<h3>複数のトラックの作成</h3>

トラックを複数用意し、それぞれに音を入れていきましょう。

<pre class="prettyprint">
import mido
from mido import Message, MidiFile, MidiTrack, MetaMessage

mid = MidiFile()
track1 = MidiTrack()
track2 = MidiTrack()
mid.tracks.append(track1)
mid.tracks.append(track2)
track1.append(MetaMessage('set_tempo', tempo=mido.bpm2tempo(120)))
track2.append(MetaMessage('set_tempo', tempo=mido.bpm2tempo(120)))

track1.append(Message('note_on', note=64, velocity=60, time=0))
track1.append(Message('note_on', note=64+7, velocity=60, time=0))
track1.append(Message('note_off', note=64, time=480))
track1.append(Message('note_off', note=64+7, time=0))

track2.append(Message('note_on', note=64+4, velocity=60, time=40))
track2.append(Message('note_off', note=64+4, time=480))

mid.save('new_song.mid')
</pre>
<br>

<h3>複雑な音階</h3>

midoはプログラムの中で扱えるので、このように適当に変数を使いつつ組み立てていくことになるでしょう。今回はバッハ 平均律クラヴィーア曲集 第1巻 みたいな音を作ります。
<br>ただしコードを見て分かるように、読みやすいものを作るのは難易度が高そうです。

<pre class="prettyprint">
import mido
from mido import Message, MidiFile, MidiTrack, MetaMessage

mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)
track.append(MetaMessage('set_tempo', tempo=mido.bpm2tempo(120)))

node_time = 480 * 2
node_pos = 60
node_16 = int(node_time/8)

track.append(Message('note_on', note=node_pos, velocity=60, time=0))
track.append(Message('note_on', note=node_pos+4, velocity=60, time=node_16 ))
track.append(Message('note_on', note=node_pos+7, velocity=60, time=node_16 ))
track.append(Message('note_off', note=node_pos+7, velocity=60, time=node_16 ))
track.append(Message('note_on', note=node_pos+12, velocity=60, time=0 ))
track.append(Message('note_off', note=node_pos+12, velocity=60, time=node_16 ))
track.append(Message('note_on', note=node_pos+16, velocity=60, time=0 ))
track.append(Message('note_off', note=node_pos+16, velocity=60, time=node_16 ))
track.append(Message('note_on', note=node_pos+7, velocity=60, time=0 ))
track.append(Message('note_off', note=node_pos+7, velocity=60, time=node_16 ))
track.append(Message('note_on', note=node_pos+12, velocity=60, time=0 ))
track.append(Message('note_off', note=node_pos+12, velocity=60, time=node_16 ))
track.append(Message('note_on', note=node_pos+16, velocity=60, time=0 ))
track.append(Message('note_off', note=node_pos+16, velocity=60, time=node_16 ))
track.append(Message('note_off', note=node_pos+4, velocity=60, time=0 ))
track.append(Message('note_off', note=node_pos, velocity=60, time=0))

mid.save('new_song.mid')
</pre>

このような内容が出力されます。
<br><a href="https://livedoor.blogimg.jp/tattyamm/imgs/5/6/56cc1e9c.png"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/5/6/56cc1e9c.png" width="165" height="192" border="0" alt="sample4_midi" hspace="5" class="pict"  /></a>


<br>これを使った作例がこちらです。
<br><a href="https://tattyamm.blog.jp/archives/5761308.html" title="バッハの平均律クラヴィーアみたいのをランダム生成する - えんたつの記録">バッハの平均律クラヴィーアみたいのをランダム生成する - えんたつの記録</a>
<br>
<br>このようにMidoはプログラムでMidi生成することにも活用できます。
<br>


]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5761308.html">
<title>バッハの平均律クラヴィーアみたいのをランダム生成する</title>
<link>https://tattyamm.blog.jp/archives/5761308.html</link>
<description>　バッハの「平均律クラヴィーア曲集 第1巻 第1番 ハ長調」の冒頭のパターンをランダムに繰り返したらどうなるか？という発想で音楽を生成しました。

・音のパターンは、冒頭に出てくる3パターンの音の動きをランダムに使用しています。
・そのパターンを再生する際の基準と...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2021-07-23T22:07:44+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[　バッハの「平均律クラヴィーア曲集 第1巻 第1番 ハ長調」の冒頭のパターンをランダムに繰り返したらどうなるか？という発想で音楽を生成しました。
<br>
<br>・音のパターンは、冒頭に出てくる3パターンの音の動きをランダムに使用しています。
<br>・そのパターンを再生する際の基準となる音は一定範囲内でランダムに生成しています。
<br>
<br>　今回の生成結果はこちらです。

<iframe width="560" height="315" src="https://www.youtube.com/embed/zfRvADK19ms" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<br>　映像はMIDITrailにより生成しています。繋がりの部分は、パターンをもっと都合よく選べばより自然にな流かもしれません。

]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5758588.html">
<title>棋譜クラッピング</title>
<link>https://tattyamm.blog.jp/archives/5758588.html</link>
<description>棋譜クラッピング
棋譜音楽の1つとして、クラッピング(拍手)で棋譜を表現した作品を公開しました。左右から違う音が出るためヘッドフォン推奨です。


仕組み
棋譜の三,七,五行目を1手ずつ9音の拍手で表現しました。例えば三行目なら三1〜三9にかけて駒が存在するなら手拍子...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2021-07-02T21:45:59+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[<h3>棋譜クラッピング</h3>
棋譜音楽の1つとして、クラッピング(拍手)で棋譜を表現した作品を公開しました。左右から違う音が出るためヘッドフォン推奨です。
<iframe width="560" height="315" src="https://www.youtube.com/embed/OhnLqbTmCF8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<h3>仕組み</h3>
棋譜の三,七,五行目を1手ずつ9音の拍手で表現しました。例えば三行目なら三1〜三9にかけて駒が存在するなら手拍子を叩き、駒が存在しなければ音を出しません。
<br>出力しているのは三,五,七行目で、それぞれ以下の場所から聞こえるようになっています。
<br>右耳 ... 三行目
<br>左耳 ... 七行目
<br>中央 ... 五行目
<br>
<br>三,五,七行目を選んだのは、三と七はゲーム開始時には整列しているが勝負のために動き続けるのが面白く、五はどちらのプレイヤーにも属さない領域として選択しています。
<br>それぞれの音を区別して感じるため、三行目と五行目は左右それぞれ片方の耳から音が出るようにし、五行目は拍手の音を少し変えて中央から出るようにしています。

<h3>音について</h3>
音としては手拍子を採用しました。
<br>今回は棋譜の1手から9個の音が出ます。そして次の小節では1つもしくは2つだけ音が変わっていきます。このように少しづつ音が変わっていくのはミニマルミュージックだったので音はシンプルにしました。
<br>このあたりはスティーヴ・ライヒのClapping Musicに影響を受けています。
<br>
<br>音の作り方はタモリ倶楽部でやってた偶然日常音楽の影響を強く受けています。対象データへの考え方が異なりますが表現方法はほぼ同一です。情報から見えるパターンを楽譜として読み取ることで音楽を作っています。
<br><a href="https://twitter.com/nsmrnoak/status/1390861922052964353" title="西村直晃 Nishimura NaoakiさんはTwitterを使っています 「譜面です。 https://t.co/v5HXkPfxoj」 / Twitter">西村直晃 Nishimura NaoakiさんはTwitterを使っています 「譜面です。 https://t.co/v5HXkPfxoj」 / Twitter</a>

<h3>動画について</h3>
記譜データを1手ずつ読み取り、駒の場所を1、駒がない場所を0としてヒートマップとして解釈することで、画像を作成しています。画像の作成にはPythonのseabornを使っています。
<br>アニメーションが細かくなったため、画像は1584枚使っています。これらをffmpegで動画にし、そこに別に作成した音声を結合しています。




]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5752610.html">
<title>将棋の棋譜からのヒートマップアニメーションの生成</title>
<link>https://tattyamm.blog.jp/archives/5752610.html</link>
<description>前回からの改良点
　前回、棋譜から音楽の生成を行いました。この際対局全体のヒートマップも表示しましたが、それだと最終的な結果は分かりますが、途中の状態を把握することができませんでした。

棋譜ヒートマップアニメーション
　そこで今回は音と合わせて途中の状態の...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2021-05-13T22:11:49+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[<h3>前回からの改良点</h3>
　<a href="https://tattyamm.blog.jp/archives/5751276.html">前回</a>、棋譜から音楽の生成を行いました。この際対局全体のヒートマップも表示しましたが、それだと最終的な結果は分かりますが、途中の状態を把握することができませんでした。

<h3>棋譜ヒートマップアニメーション</h3>
　そこで今回は音と合わせて途中の状態のヒートマップも表示することで、経過が視覚的に分かるようにしました。
<iframe width="560" height="315" src="https://www.youtube.com/embed/NgSCLL8lxPA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

<h3>考察</h3>
　情報量が増えたが分かりやすくなったとは言い難い。しかし音を目で確認できるので曲を聞きやすくなった。

<h3>アニメーション生成方法について</h3>
　棋譜をpython3で読み込みseabornでヒートマップを生成する際に、手順ごとにヒートマップを都度生成するようにしました。それらから大量に生成した画像をffmpegを使い、動画にまとめています。


]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5751276.html">
<title>将棋の棋譜からの音楽生成とヒートマップによる可視化</title>
<link>https://tattyamm.blog.jp/archives/5751276.html</link>
<description>棋譜音楽について
　将棋の対戦内容を記録したものは棋譜と呼ばれます。棋譜を見れば、後から対戦を再生することができます。棋譜をデータ化したものにはいくつかの形式があり、これらはツールで再生したり、そのまま読むこともできます。
　普通、棋譜は一手一手検討しつつ...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2021-05-04T01:16:16+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[<h3>棋譜音楽について</h3>
　将棋の対戦内容を記録したものは棋譜と呼ばれます。棋譜を見れば、後から対戦を再生することができます。棋譜をデータ化したものにはいくつかの形式があり、これらはツールで再生したり、そのまま読むこともできます。
<br>　普通、棋譜は一手一手検討しつつ読みます。しかしそうではなく、棋譜をより直感的に把握する手段を考えてみます。棋譜を読む前に全体像をイメージしておくことで理解の助けになるのではないでしょうか。
<br>
<br>　今回は二つのアプローチを試します。
<br>・どこで駒の動きがあったのかヒートマップで画像にする視覚からの影響アプローチ
<br>・どう駒が動いたのか音として表現する聴覚からのアプローチ
<br>このように視覚と聴覚を使い感覚的に理解できるようにしていきます。

<h3>棋譜からのヒートマップ生成</h3>
　今回のヒートマップは、どこに駒が打ち込まれたかをカウントしました。これによりどこで競り合いがあったのかが可視化できます。
<br><a href="https://livedoor.blogimg.jp/tattyamm/imgs/f/d/fd98d992.png" title="heatmap_640" target="_blank"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/f/d/fd98d992-s.png" width="480" height="480" border="0" alt="heatmap_640" hspace="5" class="pict"  /></a><br />

<h3>棋譜からの音楽生成</h3>
　横一列ごとに音を当てはまる、縦に移動するとオクターブ音が変わるようにします。横一列の音は白鍵だけを使うようにしました。ですので盤上に同じ音が出る場所がありますがそのまま出力しています。
<br>　横一列の当てはめ方は色々試しました。単純に半音ずつずらしたり、ヨナ抜き音階を使ったりしてみました。その中でしっくり来たものを採用しています。
<br>　将棋盤で表現するとこうなります。
<br><a href="https://livedoor.blogimg.jp/tattyamm/imgs/b/a/ba4a48fc.png" title="kihu-ban-node" target="_blank"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/b/a/ba4a48fc-s.png" width="480" height="404" border="0" alt="kihu-ban-node" hspace="5" class="pict"  /></a><br>
<br>　鍵盤で表現するとこうなっています。
<br><a href="https://livedoor.blogimg.jp/tattyamm/imgs/1/1/11d09d48.png" title="shogi_kenban_position" target="_blank"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/1/1/11d09d48-s.png" width="480" height="173" border="0" alt="shogi_kenban_position" hspace="5" class="pict"  /></a><br>
<br>　これを基本形とした上で、音全体をずらすことで、midiで表現できる音の枠内に収まるようにしています。
<br>
<br>　生成する音は、バッハの「平均律クラヴィーア曲集　第1巻 BWV 846‐869」の音を参考にしたものと、単に和音を鳴らしたものを用意しました。

<h3>結果</h3>
　こちらから再生できます。
<iframe width="560" height="315" src="https://www.youtube.com/embed/x8j75QkE_x0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<br><iframe width="560" height="315" src="https://www.youtube.com/embed/z9w9agz6tjU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
<br>
<br>・基本形
<br><a href="https://youtu.be/x8j75QkE_x0">棋譜音楽 (AlphaZero vs. elmo No.81 2018-12-03)</a>
<br><a href="https://youtu.be/z9w9agz6tjU">棋譜音楽 (AlphaZero vs. elmo No.18 2018-12-03)</a>
<br>・和音版
<br><a href="https://youtu.be/fr3goALElyY">棋譜音楽 (AlphaZero vs. elmo No.81 2018-12-03)</a>
<br><a href="https://youtu.be/XtQLCvdUmdI">棋譜音楽 (AlphaZero vs. elmo No.18 2018-12-03)</a>

<h3>使用データ</h3>
<a href="https://deepmind.com/research/open-source/alphazero-resources" title="AlphaZero Resources | DeepMind">AlphaZero Resources | DeepMind</a>
<br>「100 AlphaZero-Elmo games (.zip file).」より。

<h3>考察</h3>
　今回の結果からは、いくつかの点で理解を助ける要素が現れました。
<br>・上下方向の移動がオクターブで表現され、耳で理解できる
<br>・置いた駒が即座に取られた場合には、同じ音の連続として表現される
<br>・激しいやりとりがあった場所はヒートマップに表現される
　しかし一方で当然ながら一貫性が無い曲調であり、全体を通じて印象を持つのは困難な曲です。

<h3>コメント</h3>
　この取り組みにより直感的な理解ができそうかというとそうでもありません。とはいえこのような取り組みから何かを掴むことができるかもしれません。さらにより自然な表現も検討する必要があります。

<h3>(参考)使用ツールとフロー</h3>
　主に使用したツール
<br>Python3　<a href="https://mido.readthedocs.io/en/latest/">mido</a>, <a href="https://github.com/gunyarakun/python-shogi">python-shogi</a>, <a href="https://seaborn.pydata.org/">seaborn</a>
<br><a href="https://www.ffmpeg.org/">ffmpeg</a>
<br><a href="https://livedoor.blogimg.jp/tattyamm/imgs/5/c/5c73ee59.png" title="kihu_music_dataflow" target="_blank"><img src="https://livedoor.blogimg.jp/tattyamm/imgs/5/c/5c73ee59-s.png" width="480" height="360" border="0" alt="kihu_music_dataflow" hspace="5" class="pict"  /></a><br />
]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5729397.html">
<title>Androidアプリを更新しました(Androd11対応)</title>
<link>https://tattyamm.blog.jp/archives/5729397.html</link>
<description>チェックトレンド - Google Play のアプリ

　以前から時間が経過しすぎて1から書き直しました。Android Studioがアプリを作る上で非常にスムーズになっていました。アプリに審査が開始されたので即公開はできないようになっていましたが、それでも非常にやりやすくなってい...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2020-11-08T18:21:24+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[<a href="https://play.google.com/store/apps/details?id=jp.tattyamm.android.checktrend" title="チェックトレンド - Google Play のアプリ">チェックトレンド - Google Play のアプリ</a><br>
<br>
　以前から時間が経過しすぎて1から書き直しました。Android Studioがアプリを作る上で非常にスムーズになっていました。アプリに審査が開始されたので即公開はできないようになっていましたが、それでも非常にやりやすくなっています。<br>
<a href="https://github.com/tattyamm/checktrend_android" title="tattyamm/checktrend_android: checktrend for android">tattyamm/checktrend_android: checktrend for android</a><br>
<br>






]]>
</content:encoded>
</item>
<item rdf:about="https://tattyamm.blog.jp/archives/5723112.html">
<title>技術書典9にサークルとして参加しました</title>
<link>https://tattyamm.blog.jp/archives/5723112.html</link>
<description>　技術書典9にサークル側で参加しました。自分が書いたのは合同誌にアプリ定期課金についてです。定期課金については総合的な話は既に多くの人が語っているので、今回はReal-time developer notificationsについての事例紹介をメインにしました。これで技術書典7,8ではアプリ...</description>
<dc:creator>tattyamm</dc:creator>
<dc:date>2020-09-22T21:03:16+09:00</dc:date>
<dc:subject></dc:subject>
<content:encoded><![CDATA[　<a href="https://techbookfest.org/event/tbf09" >技術書典9</a>にサークル側で参加しました。自分が書いたのは合同誌にアプリ定期課金についてです。定期課金については総合的な話は既に多くの人が語っているので、今回はReal-time developer notificationsについての事例紹介をメインにしました。これで技術書典7,8ではアプリ課金周りと海外課金、9では定期課金について書いたことになります。<br>
　今回は技術書典8に引き続きオンラインイベントだったためあまり実感はありませんが、サークル一覧の表紙から分かるテーマの自由さが見ていて楽しいです。

]]>
</content:encoded>
</item>

</rdf:RDF>
