[{"content":"","date":"2026-10-03","externalUrl":null,"permalink":"/tags/information/","section":"🏷️ Tags","summary":"","title":"Information","type":"tags"},{"content":"","date":"2026-10-03","externalUrl":null,"permalink":"/tags/privacy/","section":"🏷️ Tags","summary":"","title":"Privacy","type":"tags"},{"content":"🇯🇵 日本語版\n🔒 Privacy Policy # This policy describes how this site (https://tamada.github.io/) handles information about visitors.\nInformation we collect # This site does not ask visitors for personal information, and it has no registration or comment features.\nAccess analysis # This site uses Google Analytics 4 (GA4), provided by Google LLC, to understand how the site is used. GA4 uses cookies and similar technologies to collect traffic data such as pages viewed, referrers, approximate location, browser, and device information. The data is collected anonymously and does not identify individual visitors.\nThe collected data is used only to improve the site. It is processed by Google under Google\u0026rsquo;s Privacy Policy. See also How Google uses information from sites or apps that use our services.\nGA4 cookies are used only if you accept them in the cookie banner shown on your first visit. Until you accept, GA4 receives only anonymous pings without cookies. Your choice is stored in your browser and can be changed at any time from \u0026ldquo;Cookie Settings\u0026rdquo; in the footer.\nYou can also opt out of GA4 by disabling cookies in your browser settings or by installing the Google Analytics opt-out browser add-on.\nThird-party services # This site is hosted on GitHub Pages, and GitHub may collect access logs such as IP addresses. See the GitHub Privacy Statement for details. Links to external sites are governed by the privacy policies of those sites.\nChanges to this policy # This policy may be revised without prior notice. The latest version is always published on this page.\nContact # For questions about this policy, please see the contact page.\n","date":"2026-10-03","externalUrl":null,"permalink":"/privacy-policy/","section":"🏡 Home","summary":"🇯🇵 日本語版\n🔒 Privacy Policy # This policy describes how this site (https://tamada.github.io/) handles information about visitors.\nInformation we collect # This site does not ask visitors for personal information, and it has no registration or comment features.\nAccess analysis # This site uses Google Analytics 4 (GA4), provided by Google LLC, to understand how the site is used. GA4 uses cookies and similar technologies to collect traffic data such as pages viewed, referrers, approximate location, browser, and device information. The data is collected anonymously and does not identify individual visitors.\n","title":"Privacy Policy","type":"page"},{"content":"","date":"2026-10-03","externalUrl":null,"permalink":"/tags/site/","section":"🏷️ Tags","summary":"","title":"Site","type":"tags"},{"content":"🇬🇧 English\n🔒 プライバシーポリシー # 本ポリシーは、本サイト (https://tamada.github.io/) における訪問者の情報の取り扱いについて定めるものです。\n取得する情報 # 本サイトは、訪問者に個人情報の入力を求めません。会員登録機能やコメント機能もありません。\nアクセス解析 # 本サイトでは、利用状況を把握するために、Google LLC が提供する Google アナリティクス 4 (GA4)を使用しています。 GA4 は Cookie などの技術を用いて、閲覧したページ、参照元、おおまかな地域、ブラウザやデバイスの情報といったトラフィックデータを収集します。 これらのデータは匿名で収集されるもので、個人を特定するものではありません。\n収集したデータは、本サイトの改善の目的にのみ利用します。 データは Google により、Google のプライバシーポリシーに従って処理されます。 詳しくはGoogle のサービスを使用するサイトやアプリから収集した情報の Google による使用もご覧ください。\nGA4 の Cookie は、初回訪問時に表示される Cookie バナーで同意した場合にのみ使用されます。 同意するまでの間、GA4 には Cookie を使わない匿名の通信のみが送信されます。 選択内容はお使いのブラウザに保存され、フッタの「Cookie Settings」からいつでも変更できます。\nまた、ブラウザの設定で Cookie を無効にするか、Google アナリティクス オプトアウト アドオンを導入することで、GA4 による収集を拒否できます。\n第三者サービス # 本サイトは GitHub Pages でホストされており、GitHub が IP アドレスなどのアクセスログを取得する場合があります。 詳細は GitHub のプライバシーに関する声明をご覧ください。 外部サイトへのリンク先での情報の取り扱いは、各サイトのプライバシーポリシーに従います。\n本ポリシーの変更 # 本ポリシーは、予告なく改定することがあります。 最新の内容は、常に本ページに掲載します。\nお問い合わせ # 本ポリシーに関するお問い合わせは、連絡先ページをご覧ください。\n","date":"2026-10-03","externalUrl":null,"permalink":"/privacy-policy.ja/","section":"🏡 Home","summary":"🇬🇧 English\n🔒 プライバシーポリシー # 本ポリシーは、本サイト (https://tamada.github.io/) における訪問者の情報の取り扱いについて定めるものです。\n取得する情報 # 本サイトは、訪問者に個人情報の入力を求めません。会員登録機能やコメント機能もありません。\nアクセス解析 # 本サイトでは、利用状況を把握するために、Google LLC が提供する Google アナリティクス 4 (GA4)を使用しています。 GA4 は Cookie などの技術を用いて、閲覧したページ、参照元、おおまかな地域、ブラウザやデバイスの情報といったトラフィックデータを収集します。 これらのデータは匿名で収集されるもので、個人を特定するものではありません。\n収集したデータは、本サイトの改善の目的にのみ利用します。 データは Google により、Google のプライバシーポリシーに従って処理されます。 詳しくはGoogle のサービスを使用するサイトやアプリから収集した情報の Google による使用もご覧ください。\n","title":"プライバシーポリシー","type":"page"},{"content":"","date":"2026-10-03","externalUrl":null,"permalink":"/tags/","section":"🏷️ Tags","summary":"","title":"🏷️ Tags","type":"tags"},{"content":"I created those projects written by Java, Rust, and Go languages. Formaly, Java language was my main language, however, currently, I use almost Rust language for my research and development. The cards below are built at site build time from the products API. Every card links out to whatever that product offers, so hover an icon to see where it goes.\ntamada/homebrew-tapMy home-brew recipes.\nCC0-1.0Calendar 2026-09-30 RubyRusttamada/oinkieDetects software theft by comparing birthmarks extracted from binaries\nMITCalendar 2026-09-30 v0.7.02026-09-30 RustShell\u003c?xml version=\"1.0\" encoding=\"iso-8859-1\"?\u003e\r\u003c!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"\u003e\rPythonJustbirthmark-toolkitbirthmarksplagiarism-detectionsoftware-theft-detectionghidra-pcodetamada/mostyMou Seiseki Teisei ha Yadayo.\nMITCalendar 2026-09-26 v0.1.02026-09-25 DockerfileJustRustexcelreference-verificationtamada/jj-cheat-sheetThe cheat sheet of Jujutsu.\nMITCalendar 2026-09-13 JavaScriptCSScheatsheetjujutsutamada/totebagA tool for extracting/archiving files and directories in several formats.\nPackage MITCalendar 2026-08-12 v0.9.02026-08-12 RustDockerfileJustarchivercommand-line-utilitiescompressordecompressorunarchivertamada/gixorGit Ignore Managenement System for Multiple Repositories.\nPackage MITCalendar 2026-08-08 v0.5.22026-08-08 RustDockerfileJustHTMLgitignoregitignore-generatorclicommand-line-toolgittamada/siblingget next/previous sibling directory name.\nPackage WTFPLCalendar 2026-08-07 v3.0.02026-08-07 ShellRustJustAppleScriptElvishdirectory-traversalutilityshelltamada/fauxrestPseudo-REST static API generator\nPackage MITCalendar 2026-08-05 v0.0.52026-08-05 DockerfileJustElvishShellPowerShellrest-apistatic-apistatic-api-generatortamada/heatmanHeatmap generator.\nPackage MITCalendar 2026-07-25 v0.1.12026-06-19 ShellDockerfileRustcommand-line-utilitiescsvdata-visualizationheatmaptamada/lisMinimal and alternative ls implementation in Rust.\nCC0-1.0Calendar 2026-07-25 v0.0.112026-06-19 RustDockerfileJustfilesystemlist-filestamada/9rulesSmall Object Programming Checker.\nAPACHE-2.0Calendar 2026-07-20 v1.1.12020-09-23 \u003c?xml version=\"1.0\" encoding=\"iso-8859-1\"?\u003e\r\u003c!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"\u003e\rHTMLShellMakefileDockerfilejava8code-analysiscode-reviewcode-qualitytamada/btmeisterDetecting the build tools in use.\nPackage MITCalendar 2026-07-20 v0.7.42025-01-31 RustDockerfileHTMLCSSPklbuild-toolproject-analysistamada/wildcatanother implementation of wc (word count) accepting archives, directories, and file lists.\nAPACHE-2.0Calendar 2026-07-20 v1.2.02021-04-28 MakefileGoDockerfileShellword-countgolangrest-apidockercli-apptamada/pochiJava birthmark toolkit, detecting the software theft by native characteristics of the programs.\nAPACHE-2.0Calendar 2026-05-08 v2.6.02021-12-13 \u003c?xml version=\"1.0\" encoding=\"iso-8859-1\"?\u003e\r\u003c!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"\u003e\rHTMLJavaScriptCSSDockerfilebirthmarksplagiarism-detectionsoftware-theft-detectionjava9modulebirthmark-toolkittamada/spelloutA phonetic code encoder/decoder written in Rust\nPackage MITCalendar 2026-02-20 v0.1.12026-02-20 ShellRustDockerfileencoder-decoderphonetic-codetamada/pick-a-booSimple options picker in CLI.\nPackage MITCalendar 2026-02-09 v0.1.62026-02-09 Rustlibraryselect-optionsterminalyes-or-notamada/peripheralsperipheral utility commands for the shell.\nMITCalendar 2023-08-05 v1.0.12023-08-05 DockerfileMakefileGoHTMLCSS ","date":"2026-09-30","externalUrl":null,"permalink":"/products/","section":"🚀 Products","summary":"A compact card view of my software products, generated from the products API. Each card packs the repository, web site, documentation, registry, container and SBOM links, plus languages, license, last update and the latest release.","title":"🚀 Products","type":"products"},{"content":"","date":"2026-09-30","externalUrl":null,"permalink":"/tags/cli/","section":"🏷️ Tags","summary":"","title":"Cli","type":"tags"},{"content":"","date":"2026-09-30","externalUrl":null,"permalink":"/tags/libraries/","section":"🏷️ Tags","summary":"","title":"Libraries","type":"tags"},{"content":"","date":"2026-09-30","externalUrl":null,"permalink":"/tags/products/","section":"🏷️ Tags","summary":"","title":"Products","type":"tags"},{"content":"","date":"2026-09-30","externalUrl":null,"permalink":"/tags/research-tools/","section":"🏷️ Tags","summary":"","title":"Research Tools","type":"tags"},{"content":"","date":"2026-08-13","externalUrl":null,"permalink":"/tags/blog/","section":"🏷️ Tags","summary":"","title":"Blog","type":"tags"},{"content":"","date":"2026-08-13","externalUrl":null,"permalink":"/tags/github-actions/","section":"🏷️ Tags","summary":"","title":"Github-Actions","type":"tags"},{"content":"","date":"2026-08-13","externalUrl":null,"permalink":"/tags/pseudo-rest-api/","section":"🏷️ Tags","summary":"","title":"Pseudo-Rest-Api","type":"tags"},{"content":" 🗣️ 背景 # 色々な CLI アプリケーションを作っている。十数個ある。そのリリース作業で、ずっと以下の3つに困っていた。\n1. 1回のリリースで触る場所が多い。 昨今の CLI アプリケーションは、バイナリを置いて終わりではない。macOS と Linux、arm64 と amd64 の組み合わせでバイナリを用意し、コンテナイメージを公開し、crates.io などのレジストリに登録し、Homebrew🍺 のレシピを更新し、プロダクトのホームページも作る。1回のリリースに対して、公開先がいくつもある。\n2. 同じ情報を何箇所にも手で書き写していた。 バージョン、リリース日、説明、ライセンス。同じ内容を、プロダクトのリポジトリ、Homebrew のレシピ、自分のホームページに、それぞれ別々に書いていた。二重、三重の管理である。当然、情報の齟齬が様々なところで生じるし、更新忘れも結構あった。\n3. プロダクトの一覧が、機械可読な形でどこにもない。 どんなプロダクトがあるのか、それぞれいつリリースしたのか。ホームページに載せたくても、プログラムから読める形で集約された場所がないので、結局また手で書くことになる。2の原因でもある。\nこのうち 1 は、後述するように既存のツールでもそれなりに何とかなる。厄介なのは 2 と 3 で、これは第1次情報がどこにあるのかを決めていないことが原因である。裏を返せば、正となる情報を1箇所に決めて、他はすべてそこから取ってくるようにすればよい。\nこのようなことを自動化したいなと、これまでずっと思っていたのだが、この度、ようやく目処が立ったので、内容をまとめておく。\n🌊 Workflow # 最初に行うべきは、マシンリーダブルなものを第１次情報とすることである。これを tamada/api として作成した。そして、プロダクトの情報は基本的に GitHub で管理し、GitHub 上で管理できない情報のみを tamada/api に置くことにした。加えて、GitHub Pagesで、擬似REST APIとして、さまざまな情報を公開することにした。基本的に情報を取得させるだけであるため、GET メソッドのみ対応として、JSON を様々な場所においておくことで対応した。具体的な内容は、https://tamada.github.io/api/ を参照されたい。ホームページの更新や Homebrew なども、すべてこのリポジトリの GitHub Pages から情報を取得することにする。\nそこで、以下の手続きで更新処理を行うことにした。\nプロダクトのリリース処理を完了させる。 プロダクトのリポジトリから、tamada/api へ更新のリクエストを送る（GitHub Actions）。 tamada/api の GitHub Actions で、リクエスト元のプロダクトの最新リリース情報を取得する。 公開しているJSONを更新する。 tamada/apiから、tamada/homebrew-tap リポジトリへの更新リクエストを送る（必要があれば）。 tamada/homebrew-tap は gh コマンドや tamada/api などをもとにレシピを更新する。 3が終われば、tamada.github.io へ更新リクエストを送る（4と並列で実行する）。 tamada/apiの情報をもとに内容を更新する。 これで、背景で挙げた2と3が片付いた。バージョンやリリース日を書く場所は tamada/api の1箇所だけになり、ホームページも Homebrew もそこから取ってくる。プロダクトのリリースさえ済ませれば、あとは勝手にホームページまで更新されているので、とりあえず満足である。\n🎈 リリース # リリースでは以下のことを行っている。なお、immutable release を使用している。\n各種プラットフォーム向けのバイナリを作成する。 quay.io でコンテナイメージを公開する。 crates.io などでバイナリを公開する。 プロダクトのホームページを作成し、GitHub Pagesで公開する。 Goであれば各種プラットフォーム向けのバイナリを用意するのは簡単である。Rust だと zigbuild や GitHub Actions の各種ランナーを駆使して頑張れ。C/C++やZigは知らない。スクリプト言語だと気にしなくて良いのかな？　スクリプト言語をあまり書かないのでわからない。\nコンテナイメージは、最近は quay.io で公開するようにしている。少し前までは ghcr.io で公開していたものの、ghcr.io は単純な利用にもログインが必要など、使い勝手に少し難があるように思う。これは個人の好みに依るところが大きいので、Docker Hubや Google Artifact Registry、ghcr.io、JFrog Artifactory など好きなものを使えば良いと思う。\ncrates.io などへの公開も GitHub Actions で自動化すべきだろう。npmもcrates.io も Trusted Publishing に対応している。Go は GitHub などで公開すればOKなので楽ですね。Java は個人的にはもう新規で書くことはない言語かなと思うのでいいや。他のレジストリは知らない。\nプロダクトのホームページは、基本的に Hugo を利用している。テーマによって見栄えが変更できるため、利用するテーマを決めて（Blowfish）、必要な追加を行なったのちに、自分独自のテーマとして公開している。\nGitHub Pages の公開方法を gh-pages ブランチから、GitHub Actions による方法へと変更している。\nリリースにファイルをアップロードし、draft を false にすることで、immutable なリリースの完成となる。この順序は守らないといけない。immutable release は publish した時点でタグもアセットも差し替えられなくなるため、アセットを全てアップロードしてから draft を外す必要がある。逆にすると、後からファイルを追加できずにリリースを作り直す羽目になる。\n🧠 バッドノウハウ # ただ、この一連の更新作業はバッドノウハウの塊である。Claude Code に教えてもらいながら進めた。\n📣 プロダクトのリポジトリから tamada/api への更新リクエスト # notify-publish.yaml という GitHub Actions スクリプトを .github/workflows に置くことで、GitHub 上でのリリースが publish されたのをトリガーに起動するようにした。この notify-publish.yaml はプロダクトのリポジトリから tamada/api に通知するためのもので、すべてのリポジトリで同じものを利用できるようにしている。\n通知といっても特別なことはしておらず、repository_dispatch ではなく gh workflow run で tamada/api の workflow を直接呼び出しているだけである。通知元も通知先も固定だからこれで足りる。\ngh workflow run \u0026#34;deploy.yml\u0026#34; --repo \u0026#34;tamada/api\u0026#34; -f repo=... -f update_brew=... ただ、リポジトリ間の通知は、GITHUB_TOKEN は使えない。GITHUB_TOKENはそのリポジトリのみにしか権限がないため、他のリポジトリのWorkflowを呼び出せないためである。その代わりに以下のどちらかを利用することになる。\n事前に GitHub Personal Access Token (PAT) を生成し、リポジトリに登録し、PAT を利用して通知する。 GitHub Apps を作成し、更新リクエストを送りたいときに短時間の PAT を生成し、これを利用する。 ここでは、後者（GitHub Apps）を採用した。PAT には期限を設定する。無期限にもできるが、fine-grained PAT だと最長でも1年である。期限が切れれば、PAT を再生成し、リポジトリに登録し直さないといけない。そんな数ヶ月から1年ごとに作業が発生するような面倒なことはしたくない。\nGitHub Apps # ただ、GitHub Appsも初回時に色々と行わないといけないことがある。まず、最初にこの GitHub Apps を作成する必要がある。続いて、以下のことを行う必要がある。\nGitHub Apps を対象リポジトリにインストールし、書き込み権限を与える。 この通知を利用するすべてのリポジトリに対して、GitHub Apps の CLIENT_ID と秘密鍵を登録する。 面倒であるものの、各リポジトリに対して、初回１回だけの作業である。\nなお、インストールを忘れて秘密鍵だけ登録しても動かない。トークンの生成自体が失敗するので、そこで気づくことになる。\nclient_id.txtと秘密鍵（secret.pem）を用意しておけば、以下のようなシェルスクリプトで対象のリポジトリ全てで登録が可能である。\nfor i in productA productB do gh secret set APP_CLIENT_ID -R tamada/$i \u0026lt; client_id.txt gh secret set APP_PRIVATE_KEY -R tamada/$i \u0026lt; secret.pem done あとは workflow の中で actions/create-github-app-token に渡せば、その場限りのトークンが手に入る。有効期限は1時間で、自動的に失効するため、こちらで管理する必要はない。これが PAT を手で回すのを避けたかった理由である。\n🛑 notify-publish.yamlが起動しない # GITHUB_TOKEN を使って発火させたイベントは、新しい workflow を実行できない。すなわち、続く notify-publish.yaml が起動しない。 再帰呼び出しを防ぐためらしいけど、これも、GitHub Apps で PAT を生成し、リリースすることで回避できる。 そのための GitHub Actions スクリプトを書き、tamada/.github リポジトリに置いた。そして、そのワークフローを uses で呼び出すようにした。\ntamada/api で擬似 REST API を更新する。 # このために FauxREST というツールを作成した。元となる JSON を適切な場所に配置して REST API のごとく振る舞わせるものである。 プロダクトの情報は先に述べたとおり、GitHub から gh api を通じて取得して JSON を構築している。\ntamada/api から homebrew-tap の更新リクエスト # これは通知元、通知先の両方でリポジトリは固定であるため、gh workflow run で直接 workflow を呼び出す。やっぱりこれも GitHub Apps で生成した PAT を利用する。\n実物は tamada/api の deploy.yml を参照（リンク先は執筆時点のコミットに固定してある）。\nなお、homebrew-tap への通知は update_brew 入力が真のときだけ実行される。レシピの更新が不要なリリースでは飛ばしたいためである。tamada.github.io への通知とは依存関係がなく、どちらも JSON の更新が終わった時点から並列に走る。\ntamada.github.io 側で API を読む # ホームページ側は、Hugo のショートコードから resources.GetRemote で擬似 REST API を叩き、ビルド時にカードを組み立てている。プロダクト一覧のページには、もう個々のプロダクトのページを置いていない。\nここで一つハマった。Hugo は resources.GetRemote の結果をキャッシュするため、API を更新してもローカルのビルドには反映されないことがある。プロダクトが増えているのに一覧に出てこない、並び順が合わない、といった形で表れる。ローカルで確認するときは --ignoreCache を付ける。\nhugo --gc --minify --ignoreCache CI は毎回まっさらなランナーなのでキャッシュは効かず、常に最新を取得する。ローカルだけで起きるので、かえって気づきにくい。\n🌌 代替手段 # 最初に検討したのは GoReleaser である。名前から Go 専用だと勘違いしやすいが、今は Rust, Zig, Node.js, Deno, Bun, Python 向けのビルダーも用意されていて、ビルド済みバイナリを取り込むこともできる。やれることも広く、クロスコンパイル、アーカイブとチェックサムの生成、GitHub リリースの作成とアセットのアップロード、コンテナイメージのビルドと push、そして Homebrew の formula/cask を別リポジトリの tap に送るところまで面倒を見てくれる。つまり、この記事でいう手順1（リリース）はほぼ丸ごと置き換えられる。\nそれでも採用しなかったのは、いちばん困っていたのが背景の1ではなく、2と3だったからである。十数個のリポジトリに散らばった情報を一箇所に集めて、それをホームページや Homebrew から参照できる形にすること。そこが解けないと、リリース部分だけ楽になっても手作業は残る。GoReleaser はあくまで「1つのリポジトリのリリースを完遂する」ツールなので、リポジトリを横断して情報を集約する層は守備範囲の外にある。手順2から5がそっくり残るなら、リリース部分だけ載せ替える動機は薄かった。\n各プロダクトのリリース部分だけを見れば、他にも選択肢はある。\nJReleaser — 名前に反して Java 専用ではなく、Go, Rust, Node, Python, C/C++ など言語を問わない。リリース作成、Homebrew や Scoop などのパッケージマネージャ、コンテナイメージ、各種 SNS への告知まで一通り揃っている。Rust と Go と Java が混在している自分のような構成には、GoReleaser より素直に嵌まるかもしれない。 dist（旧 cargo-dist） — Rust 寄り。ビルドに加えてインストーラや Homebrew formula まで生成する。 release-plz — Rust 向けに、バージョン更新、変更履歴の生成、crates.io への公開を Release PR の形で回す。 release-please や semantic-release — 言語非依存で、コミットメッセージからバージョンと変更履歴を決めてリリースまで作る。これらはリリースの「作り方」を自動化するもので、ここまで挙げたものと競合するというより組み合わせる対象である。 一方、集約する層のほうは、既製品というより設計の選択肢になる。\nホームページのビルド時に GitHub API を直接叩く。 一番手軽で、中間のリポジトリが要らない。ただし、レート制限を踏まないようビルド時にトークンが必要になるし、GitHub で管理できない情報（退役したプロダクトの扱いなど）を混ぜる場所がない。加えて Homebrew 側など利用者ごとに同じ問い合わせを実装し直すことになる。 定期実行で JSON をホームページのリポジトリにコミットする。 以前やっていた方法。動きはするが、情報が複数箇所に複製され、結局どれが正なのか分からなくなる。今回それをやめたかった。 擬似 REST API を挟む（今回の方式）。第1次情報が1箇所に決まり、利用者は GET するだけでよい。GitHub Pages なので CDN に載って速く、トークンも要らない。代償として、リポジトリと通知の連鎖が1段増える。 要するに、GoReleaser や JReleaser は手順1を、擬似 REST API は手順2以降を担当する。競合ではないので、リリース部分が面倒になってきたら GoReleaser か JReleaser を後から載せることはできると思っている。\n終わりに # 背景で挙げた3つのうち、2（同じ情報の二重管理）と3（機械可読な一覧がない）は片付いた。第1次情報を tamada/api の1箇所に決めて、ホームページも Homebrew もそこから取ってくる形にしたからである。リリースしたあとに、どこかへ書き写す作業はなくなった。\n残っているのは1である。各プロダクトのリリース処理そのものは、いまだにリポジトリごとに workflow を書いている。ここは GoReleaser や JReleaser を載せれば楽になるはずで、今回作った仕組みとは階層が違うので後から差し替えられる。面倒になってきたら手を出すと思う。\nやってみて思ったのは、難しかったのは個々の技術ではなく、どこを正とするかを決めることだった、ということである。決めてしまえば、あとは通知を繋ぐだけの話になる。逆に、決めないまま自動化しようとしていた頃は、どのスクリプトがどこを更新するのか自分でも把握できなくなっていた。\n弱点もある。リリース1回でリポジトリを3つまたいで処理が走るので、途中で失敗すると静かに止まる。今は気づけるうちに気づいているが、そのうち何か考えたい。\n","date":"2026-08-13","externalUrl":null,"permalink":"/blog/20260813-workflow_of_product_release/","section":"🤔 Blog","summary":"🗣️ 背景 # 色々な CLI アプリケーションを作っている。十数個ある。そのリリース作業で、ずっと以下の3つに困っていた。\n1. 1回のリリースで触る場所が多い。 昨今の CLI アプリケーションは、バイナリを置いて終わりではない。macOS と Linux、arm64 と amd64 の組み合わせでバイナリを用意し、コンテナイメージを公開し、crates.io などのレジストリに登録し、Homebrew🍺 のレシピを更新し、プロダクトのホームページも作る。1回のリリースに対して、公開先がいくつもある。\n2. 同じ情報を何箇所にも手で書き写していた。 バージョン、リリース日、説明、ライセンス。同じ内容を、プロダクトのリポジトリ、Homebrew のレシピ、自分のホームページに、それぞれ別々に書いていた。二重、三重の管理である。当然、情報の齟齬が様々なところで生じるし、更新忘れも結構あった。\n3. プロダクトの一覧が、機械可読な形でどこにもない。 どんなプロダクトがあるのか、それぞれいつリリースしたのか。ホームページに載せたくても、プログラムから読める形で集約された場所がないので、結局また手で書くことになる。2の原因でもある。\nこのうち 1 は、後述するように既存のツールでもそれなりに何とかなる。厄介なのは 2 と 3 で、これは第1次情報がどこにあるのかを決めていないことが原因である。裏を返せば、正となる情報を1箇所に決めて、他はすべてそこから取ってくるようにすればよい。\nこのようなことを自動化したいなと、これまでずっと思っていたのだが、この度、ようやく目処が立ったので、内容をまとめておく。\n🌊 Workflow # 最初に行うべきは、マシンリーダブルなものを第１次情報とすることである。これを tamada/api として作成した。そして、プロダクトの情報は基本的に GitHub で管理し、GitHub 上で管理できない情報のみを tamada/api に置くことにした。加えて、GitHub Pagesで、擬似REST APIとして、さまざまな情報を公開することにした。基本的に情報を取得させるだけであるため、GET メソッドのみ対応として、JSON を様々な場所においておくことで対応した。具体的な内容は、https://tamada.github.io/api/ を参照されたい。ホームページの更新や Homebrew なども、すべてこのリポジトリの GitHub Pages から情報を取得することにする。\n","title":"自作ツールの公開ワークフローを整えた","type":"blog"},{"content":"たまにっき TamaNikki (means diary of TAMADA) The page of this category are almost written in Japanese 🇯🇵.\n","date":"2026-08-13","externalUrl":null,"permalink":"/blog/","section":"🤔 Blog","summary":"This is my blog page which named たまにっき TamaNikki (means diary of TAMADA). The pages of this category are almost written in Japanese 🇯🇵.","title":"🤔 Blog","type":"blog"},{"content":"","date":"2026-07-19","externalUrl":null,"permalink":"/tags/rest-api/","section":"🏷️ Tags","summary":"","title":"Rest-Api","type":"tags"},{"content":"","date":"2026-07-19","externalUrl":null,"permalink":"/tags/zenn.dev/","section":"🏷️ Tags","summary":"","title":"Zenn.dev","type":"tags"},{"content":" 背景 # ホームページ上にさまざまな情報を載せるようになると、掲載すべき情報がさまざまな場所に点在するようになる。 それを一つの場所で管理するためには、REST APIやGraphQLなどのCMSとは異なるサービスが必要になる。 REST APIやGraphQLサーバを構築するには、費用がかかる。\n費用をゼロに近づけるためには、自分でサービスを運営するか、格安のサービスを探すしかない。 自分で運営するには、運営コストが無視できないし、格安のサービスも昨今の事情からいつ値上がりするかがわからない。\n一方で、主に行いたいことは情報の取得のみである。 RESTの GET、GraphQL であれば query のみであり、POSTや mutations は行わなくても問題はない。\nGET のみであれば、HTTP サーバにファイルを置いておくだけで REST API として扱えるようになる。 データを JSON で用意しておき、必要な JSON の内容を適切な場所に index.json として配置する。 そのディレクトリをエンドポイントとして公開しておけば、擬似 REST API の完成である。\nFauxREST # 擬似REST APIを作成するツールである FauxREST を作成した。 このツールは、与えられたディレクトリ内の JSON ファイルを特定のルールに従って分割し、 所定の場所に置くことで、擬似REST APIのファイルを出力する。 このツールを使って、API を構成し、そのAPIから情報を取得して必要な情報を取得するよう変更すれば、 データと表示を分割できる。\nメリット # 堅牢である。 純粋な HTTP サーバのみで済むため、APサーバに比べて堅牢である。 また、データの更新はサーバ外で行うため、外部からの攻撃もあまり心配する必要がない。 コスト/メンテナンスフリーである。 無料で HTTP サーバを利用できるサービスはいくつかあり、どのサービスも歴史が長い。 また、1つのディレクトリ以下を擬似RESTに対応させれば良いため、 すでに公開しているWebページに追加するコストも高くないと言える。 専門のツールである。 従来、SSG (Static Site Generator)を用いて、擬似REST APIを構築する方法が取られていた。FauxREST は擬似REST APIを構築する専門のツールであり、できるだけ覚えることが少なくなるよう設計されている。 競合として、static-api-generator もある。 デメリット # 動的なリクエストへの対応に限界がある。 ページ遷移やフィルタリングについては対応を考えていない。結局のところ、ファイルであるため、ページ遷移が必要なほど大量のデータがある場合は、このツールの対象外であろう。 大量ファイル時のファイルシステムのオーバーヘッドが無視できない。 数千以上のエンドポイントがある場合は、それに対応する数千以上の細かいファイルが存在することになる。この場合、チェックアウトやデプロイ時に必要になるオーバーヘッドが大きくなることが予想される。 リアルタイムでの更新は対象外である。 元々の出発点が GET のみで良いから簡易で堅牢な REST API を構成したいということであるため、データの更新は対象外である。擬似 REST API としては利用できるものの、更新も含めた REST API としては動作しない。データの更新は、背後のGitコミットやCI/CDのパイプラインを回すことで、安全なタイミングで行うと割り切っている。 Pseudo REST API of Myself # https://tamada.github.io/api/\nこのURLにアクセスすると、エンドポイント一覧が表示される。 それぞれのエンドポイントに GET アクセスすると、JSONファイルが返される。 これが実現することで、以下のようなことが可能になった。\nツールを作成したり更新すると、tamada/api の GitHub Actions に更新のリクエストが飛ぶ。 tamada/api はツールの情報を取得し、REST API を更新する。 続けて、tamada/api は tamada/homebrew-tap や　tamada/tamada.github.io への更新のリクエストを飛ばす。\ntamada/tamada.github.io は、必要な情報を上記エンドポイントから取得して、ページを更新する。\n","date":"2026-07-19","externalUrl":"https://zenn.dev/tamada/articles/build-pseudo-rest-api-for-centrization","permalink":"/blog/20260719-psuedo_api/","section":"🤔 Blog","summary":"背景 # ホームページ上にさまざまな情報を載せるようになると、掲載すべき情報がさまざまな場所に点在するようになる。 それを一つの場所で管理するためには、REST APIやGraphQLなどのCMSとは異なるサービスが必要になる。 REST APIやGraphQLサーバを構築するには、費用がかかる。\n費用をゼロに近づけるためには、自分でサービスを運営するか、格安のサービスを探すしかない。 自分で運営するには、運営コストが無視できないし、格安のサービスも昨今の事情からいつ値上がりするかがわからない。\n一方で、主に行いたいことは情報の取得のみである。 RESTの GET、GraphQL であれば query のみであり、POSTや mutations は行わなくても問題はない。\nGET のみであれば、HTTP サーバにファイルを置いておくだけで REST API として扱えるようになる。 データを JSON で用意しておき、必要な JSON の内容を適切な場所に index.json として配置する。 そのディレクトリをエンドポイントとして公開しておけば、擬似 REST API の完成である。\nFauxREST # 擬似REST APIを作成するツールである FauxREST を作成した。 このツールは、与えられたディレクトリ内の JSON ファイルを特定のルールに従って分割し、 所定の場所に置くことで、擬似REST APIのファイルを出力する。 このツールを使って、API を構成し、そのAPIから情報を取得して必要な情報を取得するよう変更すれば、 データと表示を分割できる。\n","title":"情報の一元化のために、擬似REST APIを構築した","type":"blog"},{"content":"I created those projects, almost projects wrote by Rust Rust, and Go Go languages. Formaly, Java \u003c?xml version=\"1.0\" encoding=\"iso-8859-1\"?\u003e\r\u003c!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"\u003e\rlanguage was my main language, however, currently, I use almost Rust language for my research and development.\n","date":"2026-07-06","externalUrl":null,"permalink":"/products2/","section":"🚀 Products (per-product pages)","summary":"The previous, per-product layout. /products/ is now the canonical list; this section is kept only until that page has been running without trouble, then it goes away.","title":"🚀 Products (per-product pages)","type":"products2"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/cheat-sheet/","section":"🏷️ Tags","summary":"","title":"Cheat-Sheet","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/claude/","section":"🏷️ Tags","summary":"","title":"Claude","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/github-flow/","section":"🏷️ Tags","summary":"","title":"Github Flow","type":"tags"},{"content":"","date":"2026-07-06","externalUrl":"https://tamada.github.io/jj-cheat-sheet","permalink":"/products2/jj-cheat-sheet/","section":"🚀 Products (per-product pages)","summary":"Jujutsu cheat sheet for GitHub flow users build by Claude Code","title":"jj-cheat-sheet","type":"products2"},{"content":"","date":"2026-07-06","externalUrl":null,"permalink":"/tags/jujutsu/","section":"🏷️ Tags","summary":"","title":"Jujutsu","type":"tags"},{"content":"","date":"2026-06-30","externalUrl":null,"permalink":"/tags/command-line/","section":"🏷️ Tags","summary":"","title":"Command-Line","type":"tags"},{"content":"","date":"2026-06-30","externalUrl":"https://tamada.github.io/fauxrest","permalink":"/products2/fauxrest/","section":"🚀 Products (per-product pages)","summary":"A CLI tool for generating static JSON APIs from local data files","title":"FauxREST","type":"products2"},{"content":"","date":"2026-06-30","externalUrl":null,"permalink":"/tags/generator/","section":"🏷️ Tags","summary":"","title":"Generator","type":"tags"},{"content":"","date":"2026-06-19","externalUrl":null,"permalink":"/tags/csv/","section":"🏷️ Tags","summary":"","title":"Csv","type":"tags"},{"content":"","date":"2026-06-19","externalUrl":null,"permalink":"/tags/data-visualization/","section":"🏷️ Tags","summary":"","title":"Data-Visualization","type":"tags"},{"content":"","date":"2026-06-19","externalUrl":null,"permalink":"/tags/filesystem/","section":"🏷️ Tags","summary":"","title":"Filesystem","type":"tags"},{"content":"","date":"2026-06-19","externalUrl":"https://tamada.github.io/heatman","permalink":"/products2/heatman/","section":"🚀 Products (per-product pages)","summary":"Create heat map image from given csv file.","title":"heatman","type":"products2"},{"content":"","date":"2026-06-19","externalUrl":null,"permalink":"/tags/heatmap/","section":"🏷️ Tags","summary":"","title":"Heatmap","type":"tags"},{"content":"","date":"2026-06-19","externalUrl":"https://tamada.github.io/lis","permalink":"/products2/lis/","section":"🚀 Products (per-product pages)","summary":"Minimal and alternative ls implementation in Rust.","title":"lis","type":"products2"},{"content":"","date":"2026-06-19","externalUrl":null,"permalink":"/tags/list-files/","section":"🏷️ Tags","summary":"","title":"List-Files","type":"tags"},{"content":"","date":"2026-06-19","externalUrl":null,"permalink":"/tags/rust/","section":"🏷️ Tags","summary":"","title":"Rust","type":"tags"},{"content":"","date":"2026-06-16","externalUrl":null,"permalink":"/tags/birthmark-toolkit/","section":"🏷️ Tags","summary":"","title":"Birthmark Toolkit","type":"tags"},{"content":"","date":"2026-06-16","externalUrl":null,"permalink":"/tags/ghidra-p-code/","section":"🏷️ Tags","summary":"","title":"Ghidra P-Code","type":"tags"},{"content":"","date":"2026-06-16","externalUrl":null,"permalink":"/tags/llvm-ir/bc/","section":"🏷️ Tags","summary":"","title":"Llvm-Ir/Bc","type":"tags"},{"content":"","date":"2026-06-16","externalUrl":"https://tamada.github.io/oinkie/","permalink":"/products2/oinkie/","section":"🚀 Products (per-product pages)","summary":"The software birthmark toolkit for Ghidra P-code.","title":"oinkie","type":"products2"},{"content":"","date":"2026-06-16","externalUrl":null,"permalink":"/tags/plagiarism-detection/","section":"🏷️ Tags","summary":"","title":"Plagiarism Detection","type":"tags"},{"content":"","date":"2026-06-16","externalUrl":null,"permalink":"/tags/software-birthmarks/","section":"🏷️ Tags","summary":"","title":"Software Birthmarks","type":"tags"},{"content":"","date":"2026-06-16","externalUrl":null,"permalink":"/tags/software-theft-detection/","section":"🏷️ Tags","summary":"","title":"Software Theft Detection","type":"tags"},{"content":"My research areas are: empirical software engineering 📈, software security 🔒, software obfuscation, software birthmarks, and software watermarks. My research topics are as follows. Note that my achievements is listed on my laboratory page.\n","date":"2026-04-01","externalUrl":null,"permalink":"/research/","section":"💡 Researches","summary":"Introduces my research works. The main research areas are: empirical software engineering, software security (software theft detection, software obfuscation), and program education.","title":"💡 Researches","type":"research"},{"content":" 🗣️ Overview # This research topic proposes a cross-architecture software birthmarks that targets the real-world executables such as Linux ELF, Windows PE, and macOS Mach-O. The birthmarks are extracted from the intermediate representation of the executables throughGhidra\u0026rsquo;s p-code.\n📚 Publications # Nikolay Fedorov,Akito Monden,Hiroki Inayoshi,Haruaki Tamada,Masateru Tsunoda, \u0026lsquo;\u0026lsquo;Detection of LLM-assisted Code Plagiarism Using \\(k\\)-gram Software Birthmarks\u0026rsquo;\u0026rsquo;, Proc. 8th World Symposium on Software Engineering (WSSE 2026), October 2026 (Nara, Japan; submitted). Haruaki Tamada, \u0026ldquo;Cross-Platform Software Birthmarking for Real-World Binaries via Intermediate Representation,\u0026rdquo; 34th IEEE/ACIS International Conference on Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing (SNPD2026), August 2026 (Okayama, Japan, submitted). 🔎 Related Research Topics # Concept of Software Birthmarks Fast comparisons of the birthmarks 🤝 Collaborators # Y. Kanzaki@Kumamoto National College of Technology ","date":"2026-04-01","externalUrl":null,"permalink":"/research/cross_architecture_birthmarks/","section":"💡 Researches","summary":"🗣️ Overview # This research topic proposes a cross-architecture software birthmarks that targets the real-world executables such as Linux ELF, Windows PE, and macOS Mach-O. The birthmarks are extracted from the intermediate representation of the executables throughGhidra’s p-code.\n📚 Publications # Nikolay Fedorov,Akito Monden,Hiroki Inayoshi,Haruaki Tamada,Masateru Tsunoda, ‘‘Detection of LLM-assisted Code Plagiarism Using \\(k\\)-gram Software Birthmarks’’, Proc. 8th World Symposium on Software Engineering (WSSE 2026), October 2026 (Nara, Japan; submitted). Haruaki Tamada, “Cross-Platform Software Birthmarking for Real-World Binaries via Intermediate Representation,” 34th IEEE/ACIS International Conference on Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing (SNPD2026), August 2026 (Okayama, Japan, submitted). 🔎 Related Research Topics # Concept of Software Birthmarks Fast comparisons of the birthmarks 🤝 Collaborators # Y. Kanzaki@Kumamoto National College of Technology ","title":"Cross architecture birthmarks","type":"research"},{"content":"","date":"2026-04-01","externalUrl":null,"permalink":"/tags/cross-architecture/","section":"🏷️ Tags","summary":"","title":"Cross-Architecture","type":"tags"},{"content":"","date":"2026-04-01","externalUrl":null,"permalink":"/tags/program-education/","section":"🏷️ Tags","summary":"","title":"Program Education","type":"tags"},{"content":"","date":"2026-04-01","externalUrl":null,"permalink":"/tags/research/","section":"🏷️ Tags","summary":"","title":"Research","type":"tags"},{"content":"","date":"2026-04-01","externalUrl":null,"permalink":"/tags/software-obfuscation/","section":"🏷️ Tags","summary":"","title":"Software Obfuscation","type":"tags"},{"content":"","date":"2026-04-01","externalUrl":null,"permalink":"/tags/theft-detection/","section":"🏷️ Tags","summary":"","title":"Theft-Detection","type":"tags"},{"content":"","date":"2026-03-27","externalUrl":null,"permalink":"/tags/homebrew/","section":"🏷️ Tags","summary":"","title":"Homebrew","type":"tags"},{"content":"","date":"2026-03-27","externalUrl":"https://github.com/tamada/homebrew-tap","permalink":"/products2/homebrew-tap/","section":"🚀 Products (per-product pages)","summary":"My homebrew recipes.","title":"homebrew-tap","type":"products2"},{"content":"","date":"2026-03-27","externalUrl":null,"permalink":"/tags/package-manager/","section":"🏷️ Tags","summary":"","title":"Package-Manager","type":"tags"},{"content":"","date":"2026-03-27","externalUrl":null,"permalink":"/tags/recipes/","section":"🏷️ Tags","summary":"","title":"Recipes","type":"tags"},{"content":"","date":"2026-03-27","externalUrl":null,"permalink":"/tags/ruby/","section":"🏷️ Tags","summary":"","title":"Ruby","type":"tags"},{"content":"","date":"2026-02-20","externalUrl":null,"permalink":"/tags/encoder-decoder/","section":"🏷️ Tags","summary":"","title":"Encoder-Decoder","type":"tags"},{"content":"","date":"2026-02-20","externalUrl":null,"permalink":"/tags/phonetic-code/","section":"🏷️ Tags","summary":"","title":"Phonetic-Code","type":"tags"},{"content":"","date":"2026-02-20","externalUrl":"https://tamada.github.io/spellout","permalink":"/products2/spellout/","section":"🚀 Products (per-product pages)","summary":"A phonetic code encoder/decoder written in Rust.","title":"spellout","type":"products2"},{"content":"","date":"2026-02-09","externalUrl":null,"permalink":"/tags/library/","section":"🏷️ Tags","summary":"","title":"Library","type":"tags"},{"content":"","date":"2026-02-09","externalUrl":"https://crates.io/crates/pick-a-boo","permalink":"/products2/pick-a-boo/","section":"🚀 Products (per-product pages)","summary":"Simple options picker in CLI.","title":"pick-a-boo","type":"products2"},{"content":"","date":"2026-02-09","externalUrl":null,"permalink":"/tags/select-options/","section":"🏷️ Tags","summary":"","title":"Select-Options","type":"tags"},{"content":"","date":"2026-02-09","externalUrl":null,"permalink":"/tags/terminal/","section":"🏷️ Tags","summary":"","title":"Terminal","type":"tags"},{"content":"","date":"2026-02-09","externalUrl":null,"permalink":"/tags/yes-or-no/","section":"🏷️ Tags","summary":"","title":"Yes-or-No","type":"tags"},{"content":"","date":"2026-02-07","externalUrl":null,"permalink":"/tags/about/","section":"🏷️ Tags","summary":"","title":"About","type":"tags"},{"content":" 📣 Copyright Notice # I have the copyrights for the contents in this site. You can use the contents in this site obey the CC BY 4.0. Note that, some products introduced in this site may have different licenses, so please check the licenses of each product before using them.\n🔧 Technologies used to build this site # The contents of this site are written in Markdown, and The site is built with Hugo static site generator, using the Blowfish theme, and hosted on GitHub Pages.\nThe source code for this site is available on GitHub . If you find any issues on this site, please feel free to post an issue or pull request to the repository.\nAlso, the site is built and deployed automatically by GitHub Actions. Also, the site is built and deployed automatically by GitHub Actions.\nThe following updates are automatically update:\nfinal release dates of products, and activities of committee. ","date":"2026-02-07","externalUrl":null,"permalink":"/about/","section":"🏡 Home","summary":"📣 Copyright Notice # I have the copyrights for the contents in this site. You can use the contents in this site obey the CC BY 4.0. Note that, some products introduced in this site may have different licenses, so please check the licenses of each product before using them.\n🔧 Technologies used to build this site # The contents of this site are written in Markdown, and The site is built with Hugo static site generator, using the Blowfish theme, and hosted on GitHub Pages.\n","title":"About this site","type":"page"},{"content":"","date":"2026-02-07","externalUrl":null,"permalink":"/tags/blowfish/","section":"🏷️ Tags","summary":"","title":"Blowfish","type":"tags"},{"content":"","date":"2026-02-07","externalUrl":null,"permalink":"/tags/hugo/","section":"🏷️ Tags","summary":"","title":"Hugo","type":"tags"},{"content":" ホームページのデザインを更新した． # 以前使っていた cayman-hugo-theme はそれなりに気に入っていたものの、 2023-01-03 にアーカイブされた。 それ以降、新しいデザインにするために色々と試行錯誤したものの、なかなかしっくりくるデザインが見つからなかった。 Astro を試したり、Zola も試したりもしたものの、最終的には Hugo に戻ってきた。 で、Hugo のテーマの中で、Blowfish を採用することにした。 とあるサイトで使っているテーマであり、色々な設定項目もあるので、まあ良いかなと思って使ってみると、それなりに良いかなと言う感じ。 カード状にブログ記事やプロダクトを表示できるのも良い。\n次にやりたいこと # Hugo mod を使って、このサイトをモジュール化したい。 これで、各プロダクトからも同じテーマを使えるようになる。 partial の一部を書き換えたりもしているし、、テーマのアップデートがあったときに、各プロダクトのサイトに反映させやすくなる。 プロダクトのリリースにより、自動的にプロダクトの日付を更新するようにしたい。 GitHub Actions でこのサイトを更新しているなら、プロダクトのリリース時に、そのプロダクトのページの日付を更新するようにしたい。 ","date":"2026-02-07","externalUrl":null,"permalink":"/blog/20260207_new_design/","section":"🤔 Blog","summary":"ホームページのデザインを更新した． # 以前使っていた cayman-hugo-theme はそれなりに気に入っていたものの、 2023-01-03 にアーカイブされた。 それ以降、新しいデザインにするために色々と試行錯誤したものの、なかなかしっくりくるデザインが見つからなかった。 Astro を試したり、Zola も試したりもしたものの、最終的には Hugo に戻ってきた。 で、Hugo のテーマの中で、Blowfish を採用することにした。 とあるサイトで使っているテーマであり、色々な設定項目もあるので、まあ良いかなと思って使ってみると、それなりに良いかなと言う感じ。 カード状にブログ記事やプロダクトを表示できるのも良い。\n次にやりたいこと # Hugo mod を使って、このサイトをモジュール化したい。 これで、各プロダクトからも同じテーマを使えるようになる。 partial の一部を書き換えたりもしているし、、テーマのアップデートがあったときに、各プロダクトのサイトに反映させやすくなる。 プロダクトのリリースにより、自動的にプロダクトの日付を更新するようにしたい。 GitHub Actions でこのサイトを更新しているなら、プロダクトのリリース時に、そのプロダクトのページの日付を更新するようにしたい。 ","title":"Renewed my web site with blowfish.","type":"blog"},{"content":"","date":"2026-02-07","externalUrl":null,"permalink":"/tags/web-design/","section":"🏷️ Tags","summary":"","title":"Web-Design","type":"tags"},{"content":"","date":"2026-02-07","externalUrl":null,"permalink":"/tags/website-redesign/","section":"🏷️ Tags","summary":"","title":"Website-Redesign","type":"tags"},{"content":" 🪪 General Information # Professor, Faculty of Information Science and Engineering, Kyoto Sangyo University. Doctor of Engineering (Nara Institute of Science and Technology, 2006) Motoyama, Kamigamo, Kita-ku, Kyoto-pref, Kyoto, Japan, Postal Code 603-8555. Programmer/Software Engineer 🎓 Research Topics # Software Birthmarks Software Obfuscation Evaluating Obfuscation Developer Analysis Project Analysis Program Readability Analysis Git/GitHub Operation Support Empirical Software Engineering 💪 Skills # 🏃‍♂️ Activities # Committees # WSSE 2026 SNPD 2026-I ICIS 2026 SERA 2026 ICEIS 2026 SNPD 2025 Winter SNPD 2025 Summer-I BCD 2025-Winter WSSE 2025 SERA 2025 ICEIS 2025 SNPD 2024-Winter ICIS 2024 BCD 2024-Summer SNPD 2024-Summer SERA 2024 ICEIS 2024 BCD 2023 SNPD 2023 Winter ICEIS 2023 SNPD 2023 Summer ICIS 2023 SERA 2023 SNPD 2022 Winter APSEC 2022 (Software Engineering Education) ICEIS 2022 ICIS 2022 SNPD 2022 Summer SERA 2022 ICSIM 2022 ICIS 2021-Fall ICIS 2021-Summer BCD 2021 SNPD 2021 Winter SNPD 2020 ICIS 2020 AI 2020 ICIS 2019 BCD 2019 ICIS 2018 BCD 2018 SISS 2017 BCD 2017 ICIS 2017 ICIS 2016 MENSURA 2011 SNSs # General SNS # Developers\u0026rsquo; SNS # Researchers\u0026rsquo; SNS # Misc # My histories # 👔 Job histories # \u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rProfessor April 2023 to Present Faculty of Information Science and Engineering, Kyoto Sangyo University. # promoted!\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rAssociate Professor April 2018 to March 2023 Faculty of Information Science and Engineering, Kyoto Sangyo University. # reorganized faculty.\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer July 2021 Graduate School of System Informatics, Kobe University. # ITスペシャリスト養成コース（Kobe Spiral 2021）\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer April 2017 to March 2021 School of Engineering science, Osaka University. # AiBiC Spiral\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer 2016 to Present Faculty of Engineering, Okayama University. # Talk about UML, Design Pattern, Software Architecture, MVC and etc. in software design class (The third semester).\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rGuest Associate Professor April 2017 to March 2018 Graduate school of information science and technology, Osaka University. # Cloud Spiral\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rAssociate Professor April 2013 to March 2018 Faculty of Computer Science and Engineering, Kyoto Sangyo University. # promoted\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer April 2013 to March 2018 Graduate School of Information Science and Technology, Osaka University. # Cloud Spiral\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rAssistant Professor April 2008 to March 2013 Faculty of Computer Science and Engineering, Kyoto Sangyo University. # %!s()\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer April 2008 to March 2010 Faculty of Science and Engineering, Kindai University. # Talk about Design Patterns.\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rResearcher/Assistant Professor April 2006 to March 2008 Nara Institute of Science and Technology (NAIST). # EASE Project\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer April 2004 to March 2006 Faculty of Science and Engineering, Kindai University. # Talk about Design Patterns.\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rSoftware Engineer April 2001 to March 2003 Sumisho Electronics co. ltd. # Developing backend of Web application with the J2EE platform.\n🏫 Degrees # Doctor (Engineering) March 2006 Dissertation: Software Protection by Birthmark and Dynamic Name Resolution. (🇯🇵) School: Graduate School of Information Science, Nara Institute of Science and Technology (NAIST) Enrolled: April 2003 to March 2006 Master (Information and Communication Engineering) March 2001 School: Graduate School of Kyoto Sangyo University. Enrolled: April 1999 to March 2001 Bachelor (Information and Communication Engineering) March 1999 School: Faculty of Information and Communication Engineering, Kyoto Sangyo University. Enrolled: April 1995 to March 1999 ","date":"2026-02-06","externalUrl":null,"permalink":"/profile/","section":"🏡 Home","summary":"🪪 General Information # Professor, Faculty of Information Science and Engineering, Kyoto Sangyo University. Doctor of Engineering (Nara Institute of Science and Technology, 2006) Motoyama, Kamigamo, Kita-ku, Kyoto-pref, Kyoto, Japan, Postal Code 603-8555. Programmer/Software Engineer 🎓 Research Topics # Software Birthmarks Software Obfuscation Evaluating Obfuscation Developer Analysis Project Analysis Program Readability Analysis Git/GitHub Operation Support Empirical Software Engineering 💪 Skills # 🏃‍♂️ Activities # Committees # WSSE 2026 SNPD 2026-I ICIS 2026 SERA 2026 ICEIS 2026 SNPD 2025 Winter SNPD 2025 Summer-I BCD 2025-Winter WSSE 2025 SERA 2025 ICEIS 2025 SNPD 2024-Winter ICIS 2024 BCD 2024-Summer SNPD 2024-Summer SERA 2024 ICEIS 2024 BCD 2023 SNPD 2023 Winter ICEIS 2023 SNPD 2023 Summer ICIS 2023 SERA 2023 SNPD 2022 Winter APSEC 2022 (Software Engineering Education) ICEIS 2022 ICIS 2022 SNPD 2022 Summer SERA 2022 ICSIM 2022 ICIS 2021-Fall ICIS 2021-Summer BCD 2021 SNPD 2021 Winter SNPD 2020 ICIS 2020 AI 2020 ICIS 2019 BCD 2019 ICIS 2018 BCD 2018 SISS 2017 BCD 2017 ICIS 2017 ICIS 2016 MENSURA 2011 SNSs # General SNS # Developers’ SNS # Researchers’ SNS # Misc # My histories # 👔 Job histories # \u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rProfessor April 2023 to Present Faculty of Information Science and Engineering, Kyoto Sangyo University. # promoted!\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rAssociate Professor April 2018 to March 2023 Faculty of Information Science and Engineering, Kyoto Sangyo University. # reorganized faculty.\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer July 2021 Graduate School of System Informatics, Kobe University. # ITスペシャリスト養成コース（Kobe Spiral 2021）\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer April 2017 to March 2021 School of Engineering science, Osaka University. # AiBiC Spiral\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer 2016 to Present Faculty of Engineering, Okayama University. # Talk about UML, Design Pattern, Software Architecture, MVC and etc. in software design class (The third semester).\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rGuest Associate Professor April 2017 to March 2018 Graduate school of information science and technology, Osaka University. # Cloud Spiral\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rAssociate Professor April 2013 to March 2018 Faculty of Computer Science and Engineering, Kyoto Sangyo University. # promoted\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer April 2013 to March 2018 Graduate School of Information Science and Technology, Osaka University. # Cloud Spiral\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rAssistant Professor April 2008 to March 2013 Faculty of Computer Science and Engineering, Kyoto Sangyo University. # %!s()\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer April 2008 to March 2010 Faculty of Science and Engineering, Kindai University. # Talk about Design Patterns.\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rResearcher/Assistant Professor April 2006 to March 2008 Nara Institute of Science and Technology (NAIST). # EASE Project\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rPart-time Lecturer April 2004 to March 2006 Faculty of Science and Engineering, Kindai University. # Talk about Design Patterns.\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\rSoftware Engineer April 2001 to March 2003 Sumisho Electronics co. ltd. # Developing backend of Web application with the J2EE platform.\n","title":"👤 Profile","type":"page"},{"content":"","date":"2026-02-06","externalUrl":null,"permalink":"/tags/about-me/","section":"🏷️ Tags","summary":"","title":"About-Me","type":"tags"},{"content":"","date":"2026-02-06","externalUrl":null,"permalink":"/tags/profile/","section":"🏷️ Tags","summary":"","title":"Profile","type":"tags"},{"content":"","date":"2026-01-26","externalUrl":null,"permalink":"/tags/bash/","section":"🏷️ Tags","summary":"","title":"Bash","type":"tags"},{"content":"","date":"2026-01-26","externalUrl":null,"permalink":"/tags/command-line-utility/","section":"🏷️ Tags","summary":"","title":"Command-Line-Utility","type":"tags"},{"content":"","date":"2026-01-26","externalUrl":null,"permalink":"/tags/directory-traversal/","section":"🏷️ Tags","summary":"","title":"Directory-Traversal","type":"tags"},{"content":"","date":"2026-01-26","externalUrl":"https://tamada.github.io/sibling","permalink":"/products2/sibling/","section":"🚀 Products (per-product pages)","summary":"get next/previous sibling directory name.","title":"sibling","type":"products2"},{"content":"","date":"2026-01-25","externalUrl":null,"permalink":"/tags/archiver/","section":"🏷️ Tags","summary":"","title":"Archiver","type":"tags"},{"content":"","date":"2026-01-25","externalUrl":null,"permalink":"/tags/compressor/","section":"🏷️ Tags","summary":"","title":"Compressor","type":"tags"},{"content":"","date":"2026-01-25","externalUrl":null,"permalink":"/tags/decompressor/","section":"🏷️ Tags","summary":"","title":"Decompressor","type":"tags"},{"content":"","date":"2026-01-25","externalUrl":"https://tamada.github.io/totebag/","permalink":"/products2/totebag/","section":"🚀 Products (per-product pages)","summary":"A tool for extracting/archiving files and directories in several formats.","title":"Totebag","type":"products2"},{"content":"","date":"2026-01-25","externalUrl":null,"permalink":"/tags/unarchiver/","section":"🏷️ Tags","summary":"","title":"Unarchiver","type":"tags"},{"content":"","date":"2026-01-11","externalUrl":null,"permalink":"/tags/git/","section":"🏷️ Tags","summary":"","title":"Git","type":"tags"},{"content":"","date":"2026-01-11","externalUrl":null,"permalink":"/tags/gitignore/","section":"🏷️ Tags","summary":"","title":"Gitignore","type":"tags"},{"content":"","date":"2026-01-11","externalUrl":null,"permalink":"/tags/gitignore-file/","section":"🏷️ Tags","summary":"","title":"Gitignore-File","type":"tags"},{"content":"","date":"2026-01-11","externalUrl":null,"permalink":"/tags/gitignore-generator/","section":"🏷️ Tags","summary":"","title":"Gitignore-Generator","type":"tags"},{"content":"","date":"2026-01-11","externalUrl":null,"permalink":"/tags/gitignore-template/","section":"🏷️ Tags","summary":"","title":"Gitignore-Template","type":"tags"},{"content":"","date":"2026-01-11","externalUrl":"https://tamada.github.io/gixor","permalink":"/products2/gixor/","section":"🚀 Products (per-product pages)","summary":"Git Ignore Managenement System for Multiple Repositories.","title":"gixor","type":"products2"},{"content":"","date":"2026-01-11","externalUrl":null,"permalink":"/tags/shell/","section":"🏷️ Tags","summary":"","title":"Shell","type":"tags"},{"content":"These products are currently developed. The products will graduate from incubation by publishing the releases.\n","date":"2025-11-15","externalUrl":null,"permalink":"/products/incubations/","section":"🚀 Products","summary":"These projects are currently under development.","title":"🐣 Incubation Projects","type":"products"},{"content":"These products are currently developed. The products will graduate from incubation by publishing the releases.\n","date":"2025-11-15","externalUrl":null,"permalink":"/products2/incubations/","section":"🚀 Products (per-product pages)","summary":"These projects are currently under development.","title":"🐣 Incubation Projects","type":"products2"},{"content":"","date":"2025-11-15","externalUrl":null,"permalink":"/tags/incubation/","section":"🏷️ Tags","summary":"","title":"Incubation","type":"tags"},{"content":"","date":"2025-11-15","externalUrl":null,"permalink":"/tags/lecture-assignments/","section":"🏷️ Tags","summary":"","title":"Lecture-Assignments","type":"tags"},{"content":"","date":"2025-11-15","externalUrl":null,"permalink":"/tags/moodle/","section":"🏷️ Tags","summary":"","title":"Moodle","type":"tags"},{"content":"","date":"2025-11-15","externalUrl":"https://github.com/tamada/moodler","permalink":"/products/incubations/moodler/","section":"🚀 Products","summary":"Operations for submitted files through Moodle.","title":"moodler","type":"products"},{"content":"","date":"2025-11-15","externalUrl":"https://github.com/tamada/moodler","permalink":"/products2/incubations/moodler/","section":"🚀 Products (per-product pages)","summary":"Operations for submitted files through Moodle.","title":"moodler","type":"products2"},{"content":"","date":"2025-10-14","externalUrl":null,"permalink":"/tags/build-tools/","section":"🏷️ Tags","summary":"","title":"Build-Tools","type":"tags"},{"content":"","date":"2025-10-14","externalUrl":"https://github.com/tamada/jolly","permalink":"/products/incubations/jolly/","section":"🚀 Products","summary":"A build tool wrapper for running almost all build tools/task runners.","title":"jolly","type":"products"},{"content":"","date":"2025-10-14","externalUrl":"https://github.com/tamada/jolly","permalink":"/products2/incubations/jolly/","section":"🚀 Products (per-product pages)","summary":"A build tool wrapper for running almost all build tools/task runners.","title":"jolly","type":"products2"},{"content":"","date":"2025-10-14","externalUrl":null,"permalink":"/tags/task-runners/","section":"🏷️ Tags","summary":"","title":"Task-Runners","type":"tags"},{"content":"","date":"2025-01-31","externalUrl":"https://tamada.github.io/btmeister","permalink":"/products2/btmeister/","section":"🚀 Products (per-product pages)","summary":"Detecting the build tools in use.","title":"btmeister","type":"products2"},{"content":"","date":"2025-01-31","externalUrl":null,"permalink":"/tags/build-tool/","section":"🏷️ Tags","summary":"","title":"Build-Tool","type":"tags"},{"content":"","date":"2025-01-31","externalUrl":null,"permalink":"/tags/docker/","section":"🏷️ Tags","summary":"","title":"Docker","type":"tags"},{"content":"","date":"2025-01-31","externalUrl":null,"permalink":"/tags/project-analysis/","section":"🏷️ Tags","summary":"","title":"Project-Analysis","type":"tags"},{"content":" ☎️ Contact me 📧 # If you have some requests, proposal, and/or comments, do not hesitate to contact me!\nPost on discussoin on GitHub , 📧 Email me by replacing fake into atmark, or Visit contact page of my laboratory site 🔗. ","date":"2024-06-10","externalUrl":null,"permalink":"/contact/","section":"🏡 Home","summary":"☎️ Contact me 📧 # If you have some requests, proposal, and/or comments, do not hesitate to contact me!\nPost on discussoin on GitHub , 📧 Email me by replacing fake into atmark, or Visit contact page of my laboratory site 🔗. ","title":"Contact","type":"page"},{"content":"","date":"2024-06-10","externalUrl":null,"permalink":"/tags/contact/","section":"🏷️ Tags","summary":"","title":"Contact","type":"tags"},{"content":"","date":"2024-06-10","externalUrl":null,"permalink":"/tags/get-in-touch/","section":"🏷️ Tags","summary":"","title":"Get-in-Touch","type":"tags"},{"content":"","date":"2021-12-13","externalUrl":"https://tamada.github.io/pochi","permalink":"/products2/pochi/","section":"🚀 Products (per-product pages)","summary":"Java birthmark toolkit, detecting the software theft by native characteristics of the programs.","title":"🐶 pochi","type":"products2"},{"content":"","date":"2021-12-13","externalUrl":null,"permalink":"/tags/java9module/","section":"🏷️ Tags","summary":"","title":"Java9module","type":"tags"},{"content":"","date":"2021-11-04","externalUrl":null,"permalink":"/tags/examine/","section":"🏷️ Tags","summary":"","title":"Examine","type":"tags"},{"content":" Getting ways of the version defined in pom.xml Constant Property Package Module What the case in the use of native-image? Result of Measurements Summary References Getting ways of the version defined in pom.xml # Java 17が出たことだし，いい加減に Java のモジュールシステムを本格的に使いだそうとしている． 最近のJavaの自作ツールは一応モジュール対応にしたつもり（pochi，vhcなど）．\nで，ビルドツールは Maven を使うことが多いのだけど，pom.xml で設定したバージョン情報をアプリケーションからどんな情報で取得できるかを確認してみた．\n次の4つの方法に分類できる．\nConstant: 自分でバージョンの文字列をString型リテラルとしてソースコードに書き込む． Property: src/main/resourcesにプロパティファイルとしてバージョン情報を置いておく． Package: MANIFEST.MFに書かれている Implementation-VersionやSpecification-Versionのいずれかを利用する． Module: ModuleDescriptorのversionメソッドから利用する． それぞれの分類を独断と偏見で４段階で評価してみた（1が良くて，４が悪い）．\nConstant Property Package Module わかりやすさ 1 2 3 4 取得のしやすさ 1 2 2 2 自動化 3 2 1 3 分かりやすさはバージョン番号取得ルーチンをみたときのわかりやすさ．Constantは単なる変数参照なので一番わかりやすいであろう．Propertyはプロパティファイルを探し，読み込み，エントリを取得する，という３段階が必要となる．\nPackageはバージョン番号取得の処理自体はそれほど難しくはない．ただし，なぜそのように取得できるのか，どうやればそのように取得できるようにするのかに対して，jarファイル，MANIFESTファイルなどの知識が必要になるため Propertyよりも難しいと判断している．\n同様にModuleもバージョン番号取得の処理自体はPackageと同様であるが，やはりモジュールシステムに対する理解が多少なりとも必要であるため，Packageよりも難しいと判断した．\nConstant # public class VersionProvider { public static final String VERSION = \u0026#34;1.0.0\u0026#34;; public String version() { return VERSION; } } みたいな感じ．設定は分かりやすいし，参照もしやすい．けれど自動化のためには別途スクリプトなどが必要となろう．Mavenのtemplating-maven-pluginを使う方法もあろう．\nProperty # public class VersionProvider { public String version() { URL url = getClass().getResource(\u0026#34;/resources/version.properties\u0026#34;); try(InputStream in = url.openStream()) { Properties p = new Properties(); p.load(in); return p.getProperty(\u0026#34;someapp.version\u0026#34;); } catch(IOException e) { throw new InternalError(e); // IOExceptionが発生するということはプログラムの何かがおかしいため， // アプリケーション自体を終了させる． } } } src/main/resources/resources/version.properties # someapp.version=${project.version} こんな感じ．pom.xml に次のようなエントリを入れておくと上記の${project.version}を自動的にversionタグの内容に置き換えてくれる．\n一度設定すると取得できなくなることはあまり考えられないが，万が一バージョン情報が取得できなくなった場合，速やかに対応しないといけないため，取得できなかった場合にInternalErrorで終了するようにしている．\npom.xml # ... \u0026lt;build\u0026gt; ... \u0026lt;resources\u0026gt; \u0026lt;resource\u0026gt; \u0026lt;directory\u0026gt;src/main/resources\u0026lt;/directory\u0026gt; \u0026lt;filtering\u0026gt;true\u0026lt;/filtering\u0026gt; \u0026lt;/resource\u0026gt; \u0026lt;/resources\u0026gt; ... \u0026lt;/build\u0026gt; ... Package # public class VersionProvider { public String version() { return getClass().getPackage() .getImplementationVersion(); } } これはjarファイル内のMETA-INF/MANIFEST.MFに書かれているエントリを読んで出力している．このエントリを追加するには，pom.xmlに次のようなエントリを入れておくと良い．\n... \u0026lt;build\u0026gt; ... \u0026lt;plugins\u0026gt; ... \u0026lt;plugin\u0026gt; \u0026lt;groupId\u0026gt;org.apache.maven.plugins\u0026lt;/groupId\u0026gt; \u0026lt;artifactId\u0026gt;maven-jar-plugin\u0026lt;/artifactId\u0026gt; \u0026lt;version\u0026gt;3.1.2\u0026lt;/version\u0026gt; \u0026lt;configuration\u0026gt; \u0026lt;archive\u0026gt; \u0026lt;manifest\u0026gt; \u0026lt;addDefaultImplementationEntries\u0026gt;true\u0026lt;/addDefaultImplementationEntries\u0026gt; \u0026lt;/manifest\u0026gt; \u0026lt;/archive\u0026gt; \u0026lt;/configuration\u0026gt; \u0026lt;/plugin\u0026gt; ... \u0026lt;/plugins\u0026gt; ... \u0026lt;/build\u0026gt; ... Module # public class VersionProvider { public String version() { return getClass().getModule() .getDescriptor() .version().toString(); } } これで取得できるはず．module-info.javaでバージョンを設定する箇所はないため，jarファイルでは設定できないと思われる．\njmodファイルを作成するjmodコマンドに--module-versionオプションがあるため，これを利用して指定するのであろう．\nWhat the case in the use of native-image? # で，ここからが本番．GraalVM を使ってネイティブイメージを作成したときにバージョン情報を取得できなくなっているのはいただけない．\nということで，次のプログラムを用意した．プログラムの全貌は tamada/version_from_pomにあるので参照されたい．なお，どれくらい差が出るかはわからないが時間も計測してみた．\npublic interface VersionProvider extends Supplier\u0026lt;Pair\u0026lt;Version, String\u0026gt;\u0026gt; { // 読み込んだバージョン番号とどこから読み込んだかを返す． Pair\u0026lt;Version, String\u0026gt; get(); } public void perform() { Stream.of(new ConstantVersionProvider(), new PropertyVersionProvider(), new PackageVersionProvider(), new ModuleVersionProvider()) .forEach(provider -\u0026gt; printResult(provider)); } private void printResult(VersionProvider provider) { var result = measure(() -\u0026gt; provider.get()); Pair\u0026lt;Version, String\u0026gt; pair = result.right(); String version = String.valueOf(pair.left()); long time = result.left(); System.out.printf(\u0026#34;%5s,%10d nano sec,%s%n\u0026#34;, version, time, pair.right()); } private \u0026lt;R\u0026gt; Pair\u0026lt;Long, R\u0026gt; measure(Supplier\u0026lt;R\u0026gt; supplier) { long from = System.nanoTime(); R result = supplier.get(); return Pair.of(System.nanoTime() - from, result); } public static class ConstantVersionProvider implements VersionProvider { ... // 上記の Constant とほぼ同じ } public static class PropertyVersionProvider implements VersionProvider { ... // 上記の Property とほぼ同じ } public static class PackageVersionProvider implements VersionProvider { ... // 上記の Package とほぼ同じ } public static class ModuleVersionProvider implements VersionProvider { ... // 上記の Module とほぼ同じ } このプログラムを次の5つの方法で実行した結果を示す．\nPlain: java -cp target/classes jp.cafebabe.vfp.Main jarにまとめないまま実行する方法． Jar: java -jar target/mods/vfp-1.0.0.jar Java 8以前の普通の実行方法， Module: java --module-path target/mods --module jp.cafebabe.vfp/jp.cafebabe.vfp.Main Modular jar として実行する． Native-Jar: native-image -jar target/mods/vfp-1.0.0.jar vfp-jar native-image でjarを渡して実行ファイルを作成して，作成された実行ファイルを実行する． Native-Module: native-image --module-path target/mods --module jp.cafebabe.vfp/jp.cafebabe.vfp.Main vfp-module native-imageにmodular jar を指定して実行ファイルを作成する．そして，作成された実行ファイルを実行する． jmodコマンドで作成された jmod ファイルは実行できない．ただし，jmodコマンドではバージョンの指定が行える（--module-versionオプションで指定できる）．では，jmodコマンドで作成された jmod ファイルの中から module-info.class を取り出し，元のmodule-info.class を置き換えてclasses2に置く．そして，classes2から新たにjarファイルを作成してみた．mods2/vfp2-1.0.0.jar とする．これでも実行してみる．\nPlain2: java -cp classes2 jp.cafebabe.vfp.Main Jar2: java -jar target/mods2/vfp2-1.0.0.jar Native-Jar2: native-image -jar target/mods2/vfp2-1.0.0.jar vfp2-jar Native-Module2: native-image --module-path target/mods2 --module jp.cafebabe.vfp/jp.cafebabe.vfp.Main vfp2-module Result of Measurements # 結果を以下に示す．列がバージョン番号の取得方法，行が実行方法を表している．実行環境は macOS Big Sur (11.6)，チップ Apple M1, メモリ 16GB，graalvm64-17.0.1である．\nConstant Property Package Module Plain 563,500 nsec 7,336,375 nsec null Exception Jar 3,145,250 nsec 29,883,833 nsec 25,667 nsec Exception Module 179,583 nsec 9,867,208 nsec null null Native-Jar 35,791 nsec Exception 1,442,458 nsec Exception Native-Module 113,875 nsec Exception null null Plain2 396,000 nsec 12,512,417 nsec null Exception Jar2 556,750 nsec 40,243,417 nsec 57,875 nsec Exception Module2 145,708 nsec 19,945,375 nsec null 38,522,208 nsec Native-Jar2 41,583 nsec Exception 1,448,750 nsec Exception Native-Module2 94,125 nsec Exception null 193,166 nsec 表からわかるように，一番簡単で高速なのはConstant であるが，自動化しておかなければ実際のバージョンと表示されるバージョンに差が出る可能性がある．\nネイティブコードでない場合は，Property が安定して取得できるものの，遅い．実行方法によって，Package，Moduleで取得できるか否かが決められる．て言うかなんでネイティブコードにすると取得できなくなるんだよう．\nなお，Moduleからバージョンを取得するためには，module-info.classにバージョン情報を加える必要がある．そのためには，jmodコマンドでバージョンを指定したjmodファイルを作成し，そこからmodule-info.classをコピーしてjarファイルなどを作成し直す必要がある（めんどくせ．．．）．\n加えて，native-imageの実行オプションで取得できる情報が異なるのは注意が必要であろう．\n一番安定して取得できるのがConstantなのは意外でもなんでもなくその通りなのだが，あまり面白くない結果だな．\nModule でバージョン番号を取得できるのは良いとして，準備が大変．もっと簡易にできる方法はないのかな？？？\nネイティブコードを作成するときのオプション（-jarと-module）で変数の参照の実行時間に大きな差が出るのはなんでだろう．\nSummary # 結局のところ，バージョン番号は定数として扱うのが簡単で，どのような形態で実行されようが同様に取得できる．このことから定数として扱うのが一番良いように思う．ただし，定数として扱う場合，バージョン番号を更新したときに自動的に定数の値も更新されるような仕組みを導入しておかなければ定義と出力に差異が生じる．\n次にPackageもしくはModuleで取得するのが良いが，native-image でビルドするときのオプションに注意しないといけない．注意しないといけないと書いている次点でダメだけど．\nPropertyはネイティブイメージにする必要がない場合はOKだが，そうでない場合やめた方が良い．予想外のエラーで悩まされる可能性があるためである．\n実行時間はいずれの方法でも誤差の範囲であろう．バージョン番号取得のみの時間で見るとそれぞれが大きな差のように思えるが，実際のアプリケーションの場合，バージョン番号取得以外にも様々な処理が行われる．そのような様々な処理の中から見るとバージョン番号取得の時間短縮に気を配るよりも他の処理の短縮に気を配る方が建設的であるためである．\nReferences # Java JMODファイルとは、JARファイルとの違い。 ","date":"2021-11-04","externalUrl":null,"permalink":"/blog/20211104-vfp/","section":"🤔 Blog","summary":" Getting ways of the version defined in pom.xml Constant Property Package Module What the case in the use of native-image? Result of Measurements Summary References Getting ways of the version defined in pom.xml # Java 17が出たことだし，いい加減に Java のモジュールシステムを本格的に使いだそうとしている． 最近のJavaの自作ツールは一応モジュール対応にしたつもり（pochi，vhcなど）．\nで，ビルドツールは Maven を使うことが多いのだけど，pom.xml で設定したバージョン情報をアプリケーションからどんな情報で取得できるかを確認してみた．\n次の4つの方法に分類できる．\nConstant: 自分でバージョンの文字列をString型リテラルとしてソースコードに書き込む． Property: src/main/resourcesにプロパティファイルとしてバージョン情報を置いておく． Package: MANIFEST.MFに書かれている Implementation-VersionやSpecification-Versionのいずれかを利用する． Module: ModuleDescriptorのversionメソッドから利用する． それぞれの分類を独断と偏見で４段階で評価してみた（1が良くて，４が悪い）．\n","title":"How to get version defined in pom.xml","type":"blog"},{"content":"","date":"2021-11-04","externalUrl":null,"permalink":"/tags/java/","section":"🏷️ Tags","summary":"","title":"Java","type":"tags"},{"content":"","date":"2021-11-04","externalUrl":null,"permalink":"/tags/jpms/","section":"🏷️ Tags","summary":"","title":"Jpms","type":"tags"},{"content":"","date":"2021-11-04","externalUrl":null,"permalink":"/tags/native-image/","section":"🏷️ Tags","summary":"","title":"Native-Image","type":"tags"},{"content":"","date":"2021-11-04","externalUrl":null,"permalink":"/tags/program/","section":"🏷️ Tags","summary":"","title":"Program","type":"tags"},{"content":"","date":"2021-10-21","externalUrl":null,"permalink":"/tags/languages/","section":"🏷️ Tags","summary":"","title":"Languages","type":"tags"},{"content":"とあるユーティリティプログラムを作成しようと思ったものの，どのような言語で作成しようかと悩み中． 希望としては，ワンバイナリが生成可能，ジェネリクスあり，ストリーム処理，あたりが扱えると嬉しい． また，クロスコンパイルしたいし，書きやすい（EtoW; Easy to Write）言語であると嬉しい．\nで，まとめてみた．\nLanguage One Binary Generics Stream Cross Compile EtoW Java GraalVM OK OK Hard OK Go OK 1.17- No OK OK Rust OK? OK ??? OK? No Node.js ??? ??? OK N/A OK Python ??? OK? ??? ??? OK Kotlin OK? OK OK OK ??? Java は GraalVM を使うとバイナリを作成できるけど，面倒． GraalVM を使ってもクロスコンパイルは難しいんじゃないかな． GitHub Actions などを使えばクロスコンパイルはできそうだけど，面倒だなぁ．\nGo は概ね良いのだけど，ストリーム処理が行えないのが悩みどころ． ジェネリクスも出たばかりであまり書き慣れていない． 例外処理はなくてもいいや．\nRust も良いのだけど，コンパイルを通すのに一苦労な点で，簡単なユーティリティを書くのにはそぐわない気がする．\nNode.js，Python はよく知らない．\nちょっと調べてみると Kotlin がネイティブコードを生成できるらしい Kotlin も結局は Java バイトコードに変換するはずだから， GraalVM と何が違うのかはよく分からないし，これまでに書いたことないけど，書いてみようかな．\n参考資料 # Kotlin/Native の標準ライブラリの実装を追いかける (2018-12-24) ","date":"2021-10-21","externalUrl":null,"permalink":"/blog/20211021_programming_languages/","section":"🤔 Blog","summary":"とあるユーティリティプログラムを作成しようと思ったものの，どのような言語で作成しようかと悩み中． 希望としては，ワンバイナリが生成可能，ジェネリクスあり，ストリーム処理，あたりが扱えると嬉しい． また，クロスコンパイルしたいし，書きやすい（EtoW; Easy to Write）言語であると嬉しい．\nで，まとめてみた．\nLanguage One Binary Generics Stream Cross Compile EtoW Java GraalVM OK OK Hard OK Go OK 1.17- No OK OK Rust OK? OK ??? OK? No Node.js ??? ??? OK N/A OK Python ??? OK? ??? ??? OK Kotlin OK? OK OK OK ??? Java は GraalVM を使うとバイナリを作成できるけど，面倒． GraalVM を使ってもクロスコンパイルは難しいんじゃないかな． GitHub Actions などを使えばクロスコンパイルはできそうだけど，面倒だなぁ．\nGo は概ね良いのだけど，ストリーム処理が行えないのが悩みどころ． ジェネリクスも出たばかりであまり書き慣れていない． 例外処理はなくてもいいや．\nRust も良いのだけど，コンパイルを通すのに一苦労な点で，簡単なユーティリティを書くのにはそぐわない気がする．\nNode.js，Python はよく知らない．\nちょっと調べてみると Kotlin がネイティブコードを生成できるらしい Kotlin も結局は Java バイトコードに変換するはずだから， GraalVM と何が違うのかはよく分からないし，これまでに書いたことないけど，書いてみようかな．\n","title":"Programming Languages","type":"blog"},{"content":" 🗣 Overview # Learning the git and GitHub operation is difficult for novice programmers. Since even programming is a pretty complicated task, it becomes challenging to consider various kinds of operation except programming, for example, good commit, pull requests, and etc. However, the recent development process ordinary manages product versions with SCM such as git. Therefore, it requires the novices should learn them as soon as possible.\nThen, we focus on the commits\u0026rsquo; timing, and the proposed system recommends commit at the suitable timing. Also, the recommendation text contains a simple help message for git. From above two manners, we expect the novices accustomed git.\nThe proposed system, named kani, records the terminal\u0026rsquo;s executed commands and runs the recommendation engine by each recoding. The recommendation engine analyzes the histories of the executed commands with their status codes and statuses of git.\n(Overview from kani)\n📚 Publications # 玉田 春昭, \u0026lsquo;\u0026lsquo;プログラミング初学者向けのGit/GitHub操作支援手法・データ収集方法\u0026rsquo;\u0026rsquo;, ソフトウェアシンポジウム2021 ワークショップ 討論テーマ（4）ソフトウェア工学教育支援に向けた開発者の活動ログの収集，分析および共有, September, 2021（オンライン）． 増田 亜里紗, 玉田 春昭, \u0026lsquo;\u0026lsquo;プログラミング初学者向けGit/GitHub 操作支援フレームワークの設計と実装\u0026rsquo;\u0026rsquo;, 第20回情報科学技術フォーラム（Forum on Information Technology 2021）(FIT 2021)（講演番号 B-013）, pp. 153\u0026ndash;158, August, 2021（オンライン）. 玉田 春昭, \u0026lsquo;\u0026lsquo;初学者向けGitHub flow学習支援\u0026rsquo;\u0026rsquo;, ソフトウェアシンポジウム2019 ワークショップ 討論テーマ（2）実証的ソフトウェア工学によるプログラミング教育とソフトウェア工学教育, August, 2019（東京）. 🔎 Related Research Topics # Development support bot 🤝 Collaborators # ","date":"2021-08-27","externalUrl":null,"permalink":"/research/git_operation_supports/","section":"💡 Researches","summary":"🗣 Overview # Learning the git and GitHub operation is difficult for novice programmers. Since even programming is a pretty complicated task, it becomes challenging to consider various kinds of operation except programming, for example, good commit, pull requests, and etc. However, the recent development process ordinary manages product versions with SCM such as git. Therefore, it requires the novices should learn them as soon as possible.\n","title":"Git/GitHub Operation Support for Novice Programmers","type":"research"},{"content":"","date":"2021-08-27","externalUrl":null,"permalink":"/tags/github/","section":"🏷️ Tags","summary":"","title":"Github","type":"tags"},{"content":"","date":"2021-08-27","externalUrl":null,"permalink":"/tags/novices/","section":"🏷️ Tags","summary":"","title":"Novices","type":"tags"},{"content":"","date":"2021-08-27","externalUrl":null,"permalink":"/tags/operation-recommendation/","section":"🏷️ Tags","summary":"","title":"Operation Recommendation","type":"tags"},{"content":"","date":"2021-08-27","externalUrl":null,"permalink":"/tags/operation-supports/","section":"🏷️ Tags","summary":"","title":"Operation Supports","type":"tags"},{"content":"","date":"2021-04-28","externalUrl":null,"permalink":"/tags/golang/","section":"🏷️ Tags","summary":"","title":"Golang","type":"tags"},{"content":"","date":"2021-04-28","externalUrl":"https://tamada.github.io/wildcat","permalink":"/products2/wildcat/","section":"🚀 Products (per-product pages)","summary":"another implementation of wc (word count) accepting archives, directories, and file lists","title":"wildcat","type":"products2"},{"content":"","date":"2021-02-27","externalUrl":null,"permalink":"/tags/code-analyzer/","section":"🏷️ Tags","summary":"","title":"Code Analyzer","type":"tags"},{"content":"","date":"2021-02-27","externalUrl":null,"permalink":"/tags/code-quality/","section":"🏷️ Tags","summary":"","title":"Code Quality","type":"tags"},{"content":"","date":"2021-02-27","externalUrl":"https://github.com/tamada/fritter","permalink":"/products/retired/fritter/","section":"🚀 Products","summary":"Small object programming/Object-oriented programming exercise checker.","title":"fritter","type":"products"},{"content":"","date":"2021-02-27","externalUrl":"https://github.com/tamada/fritter","permalink":"/products2/retired/fritter/","section":"🚀 Products (per-product pages)","summary":"Small object programming/Object-oriented programming exercise checker.","title":"fritter","type":"products2"},{"content":"","date":"2021-02-27","externalUrl":null,"permalink":"/tags/java11/","section":"🏷️ Tags","summary":"","title":"Java11","type":"tags"},{"content":"","date":"2021-02-27","externalUrl":null,"permalink":"/tags/object-oriented-programming/","section":"🏷️ Tags","summary":"","title":"Object Oriented Programming","type":"tags"},{"content":"","date":"2021-02-27","externalUrl":null,"permalink":"/tags/retired/","section":"🏷️ Tags","summary":"","title":"Retired","type":"tags"},{"content":"","date":"2021-02-27","externalUrl":null,"permalink":"/tags/small-object-programming/","section":"🏷️ Tags","summary":"","title":"Small Object Programming","type":"tags"},{"content":"","date":"2020-11-10","externalUrl":null,"permalink":"/tags/cayman-hugo-theme/","section":"🏷️ Tags","summary":"","title":"Cayman-Hugo-Theme","type":"tags"},{"content":" ホームページのデザインを更新した． # ふと思い立って，ホームページのデザインを更新してみた． 作成したプロダクトのデザインは cayman-hugo-theme に統一していたので，個人ページも同じテーマを採用してみた．\n雑感 # 以前使っていたHugo Swiftに対して思っていた要望が解消されたかな？\nトップのサイン波のアニメーションを変えたい． -\u0026gt; なくなった． ハンバーガーメニューが気に入らない． -\u0026gt; なくなった． ","date":"2020-11-10","externalUrl":null,"permalink":"/blog/20201110_new_design/","section":"🤔 Blog","summary":"ホームページのデザインを更新した． # ふと思い立って，ホームページのデザインを更新してみた． 作成したプロダクトのデザインは cayman-hugo-theme に統一していたので，個人ページも同じテーマを採用してみた．\n雑感 # 以前使っていたHugo Swiftに対して思っていた要望が解消されたかな？\nトップのサイン波のアニメーションを変えたい． -\u003e なくなった． ハンバーガーメニューが気に入らない． -\u003e なくなった． ","title":"Renewed my web site with cayman-hugo-theme.","type":"blog"},{"content":"The following products have not been released and are not being maintained:\nflaver What: Obtaining Project Information via GitHub API. vhc What: Obtaining git histories (date, size, creator, \u0026hellip;) from the specified repositories. extide What: Extracting Identifier from Java source and class files. no longer necessary. ","date":"2020-11-03","externalUrl":null,"permalink":"/products/retired/","section":"🚀 Products","summary":"These projects are no longer maintained.","title":"🚮 Retiered Projects","type":"products"},{"content":"The following products have not been released and are not being maintained:\nflaver What: Obtaining Project Information via GitHub API. vhc What: Obtaining git histories (date, size, creator, \u0026hellip;) from the specified repositories. extide What: Extracting Identifier from Java source and class files. no longer necessary. ","date":"2020-11-03","externalUrl":null,"permalink":"/products2/retired/","section":"🚀 Products (per-product pages)","summary":"These projects are no longer maintained.","title":"🚮 Retiered Projects","type":"products2"},{"content":"","date":"2020-11-03","externalUrl":"https://github.com/tamada/stigmata","permalink":"/products/retired/stigmata/","section":"🚀 Products","summary":"Java Birthmarking Toolkit. It instead of using tamada/pochi.","title":"Stigmata","type":"products"},{"content":"","date":"2020-11-03","externalUrl":"https://github.com/tamada/stigmata","permalink":"/products2/retired/stigmata/","section":"🚀 Products (per-product pages)","summary":"Java Birthmarking Toolkit. It instead of using tamada/pochi.","title":"Stigmata","type":"products2"},{"content":"","date":"2020-10-31","externalUrl":null,"permalink":"/tags/license-identification/","section":"🏷️ Tags","summary":"","title":"License-Identification","type":"tags"},{"content":"","date":"2020-10-31","externalUrl":"https://github.com/tamada/lioss","permalink":"/products/retired/lioss/","section":"🚀 Products","summary":"License Identification tool for OSS. Use licensee, and pivotal/LicenseFinder.","title":"lioss","type":"products"},{"content":"","date":"2020-10-31","externalUrl":"https://github.com/tamada/lioss","permalink":"/products2/retired/lioss/","section":"🚀 Products (per-product pages)","summary":"License Identification tool for OSS. Use licensee, and pivotal/LicenseFinder.","title":"lioss","type":"products2"},{"content":"","date":"2020-10-31","externalUrl":null,"permalink":"/tags/oss/","section":"🏷️ Tags","summary":"","title":"Oss","type":"tags"},{"content":"","date":"2020-09-23","externalUrl":"https://tamada.github.io/9rules/","permalink":"/products2/9rules/","section":"🚀 Products (per-product pages)","summary":"Small Object Programming Checker.","title":"9rules","type":"products2"},{"content":"","date":"2020-09-23","externalUrl":null,"permalink":"/tags/code-analysis/","section":"🏷️ Tags","summary":"","title":"Code-Analysis","type":"tags"},{"content":"","date":"2020-09-23","externalUrl":null,"permalink":"/tags/code-review/","section":"🏷️ Tags","summary":"","title":"Code-Review","type":"tags"},{"content":"","date":"2020-09-23","externalUrl":null,"permalink":"/tags/java8/","section":"🏷️ Tags","summary":"","title":"Java8","type":"tags"},{"content":"","date":"2020-07-13","externalUrl":null,"permalink":"/tags/coverage/","section":"🏷️ Tags","summary":"","title":"Coverage","type":"tags"},{"content":"","date":"2020-07-13","externalUrl":null,"permalink":"/tags/jacoco/","section":"🏷️ Tags","summary":"","title":"Jacoco","type":"tags"},{"content":"","date":"2020-07-13","externalUrl":null,"permalink":"/tags/junit4/","section":"🏷️ Tags","summary":"","title":"Junit4","type":"tags"},{"content":"","date":"2020-07-13","externalUrl":"https://github.com/tamada/omelette","permalink":"/products/retired/omelette/","section":"🚀 Products","summary":"Unit tests runner/coverage calculator on the CLI environment for the Java platform.","title":"omelette","type":"products"},{"content":"","date":"2020-07-13","externalUrl":"https://github.com/tamada/omelette","permalink":"/products2/retired/omelette/","section":"🚀 Products (per-product pages)","summary":"Unit tests runner/coverage calculator on the CLI environment for the Java platform.","title":"omelette","type":"products2"},{"content":"","date":"2020-07-13","externalUrl":null,"permalink":"/tags/research-tool/","section":"🏷️ Tags","summary":"","title":"Research Tool","type":"tags"},{"content":"","date":"2020-07-13","externalUrl":null,"permalink":"/tags/unittest/","section":"🏷️ Tags","summary":"","title":"Unittest","type":"tags"},{"content":"","date":"2020-04-24","externalUrl":null,"permalink":"/tags/repository-management/","section":"🏷️ Tags","summary":"","title":"Repository-Management","type":"tags"},{"content":"","date":"2020-04-24","externalUrl":"https://github.com/tamada/rrh","permalink":"/products/retired/rrh/","section":"🚀 Products","summary":"Remote Repositories Head/Repositories Ready to Hack.","title":"rrh","type":"products"},{"content":"","date":"2020-04-24","externalUrl":"https://github.com/tamada/rrh","permalink":"/products2/retired/rrh/","section":"🚀 Products (per-product pages)","summary":"Remote Repositories Head/Repositories Ready to Hack.","title":"rrh","type":"products2"},{"content":" ホームページのデザインを更新した． # ふと思い立って，ホームページのデザインを更新してみた． 今までは，hugo-cards を使っていたのをHugo Swift を使うことにした．\n欲しかった要件 # config.tomlにごちゃごちゃと書かない． dataでの記述は最小限に． shortcodesにあまり依存しない． この要件はあくまで好みである．\n困ったこと # Hugo などの静的サイトジェネレータでコメント投稿をサポートするために，Staticmanがリリースされている． Hugo SwiftはこのStaticmanを標準でサポートしている． しかし，設定方法にあるように設定して，コメントを投稿しても，500 Internal Server Errorになる． どうも，https://staticman3.herokuapp.com/v3/entry/github/tamada/tamada.github.io/master/comments に投稿しても，Staticman の中から GitHub へのリクエスト URL でリポジトリの情報が失われているっぽい． 設定項目は飛ばしていないつもりだけど，なぜだろう．．．\nHugo のレイアウトのコツ # いくつかのサイトを Hugo で構築して，レイアウトのコツのようなものがわかった．\n生成されたHTML と themes/XXXXXX/layouts/{_default,partials} 以下の内容を確認し，変更したい内容をトップのlayoutsにコピーして編集すると良い．\n雑感 # Hugo Swiftには概ね満足なのだが，次の2つの項目を変えたい．\nサイン波のアニメーション # トップのサイン波のアニメーションを変更するのが難しい． 変更自体は簡単なんだけど，変更してしまうと，サイトとしてイケてない． かといってそのままだと，デザインそのままな感じがする． とりあえず放置．\nハンバーガーメニューが気に入らない． # 個人的にハンバーガーメニューが気に入らない． 世間的にもハンバーガーメニューはダメだという意見があるようだ．\n君たちはそんなにハンバーガーメニューが好きなのかね？ The Hamburger Menu Doesn\u0026rsquo;t Work これもとりあえずは放置．\nというところでリリースした． Staticmanについてはまた今度挑戦してみる．\n","date":"2020-03-20","externalUrl":null,"permalink":"/blog/20200320_new_design/","section":"🤔 Blog","summary":"ホームページのデザインを更新した． # ふと思い立って，ホームページのデザインを更新してみた． 今までは，hugo-cards を使っていたのをHugo Swift を使うことにした．\n欲しかった要件 # config.tomlにごちゃごちゃと書かない． dataでの記述は最小限に． shortcodesにあまり依存しない． この要件はあくまで好みである．\n困ったこと # Hugo などの静的サイトジェネレータでコメント投稿をサポートするために，Staticmanがリリースされている． Hugo SwiftはこのStaticmanを標準でサポートしている． しかし，設定方法にあるように設定して，コメントを投稿しても，500 Internal Server Errorになる． どうも，https://staticman3.herokuapp.com/v3/entry/github/tamada/tamada.github.io/master/comments に投稿しても，Staticman の中から GitHub へのリクエスト URL でリポジトリの情報が失われているっぽい． 設定項目は飛ばしていないつもりだけど，なぜだろう．．．\nHugo のレイアウトのコツ # いくつかのサイトを Hugo で構築して，レイアウトのコツのようなものがわかった．\n","title":"Renewed my web site with hugo-theme-swift.","type":"blog"},{"content":"","date":"2020-03-20","externalUrl":null,"permalink":"/tags/theme-swift/","section":"🏷️ Tags","summary":"","title":"Theme-Swift","type":"tags"},{"content":"","date":"2020-02-15","externalUrl":null,"permalink":"/tags/automation/","section":"🏷️ Tags","summary":"","title":"Automation","type":"tags"},{"content":" 🗣 Overview # The software birthmarks were proposed for detecting the software theft from a large number of suspected programs. The birthmark is a technique to compare the extracted characteristics as the software birthmarks, and compute similarities between two birthmarks. The conventional birthmarks require a much time by increasing the target programs for comparison. Therefore, it is the bottleneck of the conventional birthmarking technique. In this paper, we propose a method for reducing total processing time by introducing the narrowing phase between conventional extracting and comparison phases. The narrowing phase employs the fast but rough comparison algorithm in order to eliminate unrelated programs.\nWe developed the narrowing system for the birthmark, named \\mituba, then conducted the experimental evaluation with \\mituba. The evaluation points are required time, narrowing rate, false negatives, false positives, accuracy, and preservation property of the birthmarks. The results are, in the threshold for deciding the theft is $0.2$, the required time reduced to 20%, the system successfully narrowed 80% programs. The false negatives in the rest of the programs are about 80%, it was quite high. However, the false positives were 0%, and the accuracies were over 70%. Additionally, the proposed method satisfied the preservation property by 80% in the strongest obfuscation method in the experiments. The results were totally quite well. From the results of the experimental evaluations, we discussed the suitable threshold. In ordinal case, the suitable threshold is $0.6$, however, the proposed method is acceptable in the threshold is $0.2$ in the user\u0026rsquo;s discretion.\n(Abstract from IPSJ journal 2019)\n📚 Publications # 中村 潤，玉田 春昭，”大量のソフトウェアを対象にしたソフトウェアバースマークによる盗用検出 〜全文検索システムを用いた検査対象の絞り込み手法〜”，情報処理学会論文誌，Vol.61, No.2, Feburary 2020. Link id.nii.ac.jp Jun Nakamura, Haruaki Tamada, “mituba: Scaling up Software Theft Detection with the Search Engine,” Proc. International Conference on Software Engineering and Information Management (ICSIM 2018), pp.6–10, January 2018 (Casablanca, Morocco). Link dl.acm.org 中村 潤，玉田 春昭，”検索エンジンを用いたソフトウェアバースマークによる検査対象の絞り込み手法”，第24回ソフトウェア工学の基礎ワークショップ（FOSE2017），pp.99–104, November 2017（福井）. Takehiro Tsuzaki, Teruaki Yamamoto, Haruaki Tamada, and Akito Monden, “Scaling Up Software Birthmarks Using Fuzzy Hashing,” International Journal of Software Innovation (IJSI), Volume 5, Issue 3, pp.89–102, June 2017. Link www.igi-global.com Jun Nakamura, and Haruaki Tamada, “Fast Comparison of Software Birthmarks for Detecting the Theft with the Search Engine,” In Proc. of the 4th International Conference on Applied Computing \u0026amp; Information Technology (ACIT 2016), pp.152–157, December 2016 (UNLV, Las Vegas, NV, USA). Link ieeexplore.ieee.org 山本 照明，玉田 春昭，門田 暁人，”大量のプログラムを対象としたファジーハッシュを用いたバースマーク手法”，2015年暗号と情報セキュリティシンポジウム予稿集（SCIS2015），3B4-4，January 2015（福岡，小倉）. 🔎 Related Research Topics # Concept of Software Birthmarks ","date":"2020-02-15","externalUrl":null,"permalink":"/research/birthmark_fast_comparison/","section":"💡 Researches","summary":"🗣 Overview # The software birthmarks were proposed for detecting the software theft from a large number of suspected programs. The birthmark is a technique to compare the extracted characteristics as the software birthmarks, and compute similarities between two birthmarks. The conventional birthmarks require a much time by increasing the target programs for comparison. Therefore, it is the bottleneck of the conventional birthmarking technique. In this paper, we propose a method for reducing total processing time by introducing the narrowing phase between conventional extracting and comparison phases. The narrowing phase employs the fast but rough comparison algorithm in order to eliminate unrelated programs.\n","title":"Fast comparisons of the birthmarks","type":"research"},{"content":"","date":"2020-01-27","externalUrl":null,"permalink":"/tags/evaluating-obfuscation/","section":"🏷️ Tags","summary":"","title":"Evaluating Obfuscation","type":"tags"},{"content":"","date":"2020-01-27","externalUrl":null,"permalink":"/tags/identifiers/","section":"🏷️ Tags","summary":"","title":"Identifiers","type":"tags"},{"content":" 🗣 Overview # Recently, to prevent cracking, the various protection methods have been proposed. One of the protection methods is the obfuscation method. Obfuscation method changes the program into hard to understand for hiding secret information in the program.\nOn the other hand, de-obfuscation is an interesting research topic for protecting the software. Since, though vulnerable protection methods are dangerous, measuring the robustness of the method was not discussed.\nIn this paper, we tackle to identify the applied obfuscation methods towards de-obfuscation. To perform de-obfuscation requires a suitable method for each obfuscation method. For this, we obfuscated programs by two practical tools and three algorithms from one academic tool. Then, we analyzed the programs and extracted characteristics from them based on opcodes. By using the proposed method, we could identify the applied obfuscation method.\n(Abstract from ICIS 2016)\n📚 Publications # 大槻 成輝，玉田 春昭，神崎 雄一郎，\u0026ldquo;JVM環境におけるオペコード列と名前に着目した適用難読化ツールの特定\u0026rdquo;，2020年暗号と情報セキュリティシンポジウム予稿集（SCIS 2020），January 2020. 玉田 春昭，神崎 雄一郎，Javaバイトコードを対象とした命令の頻度解析による適用難読化ツールの特定”，コンピュータセキュリティシンポジウム2019予稿集（CSS 2019），1C1-3，October 2019. 玉田 春昭，神崎 雄一郎，”オペコードの編集距離を用いたJVM向け難読化ツールの難読化性能の評価”，2019年暗号と情報セキュリティシンポジウム予稿集 (SCIS 2019)，3D2-1，January 2019.（大津，滋賀） Hayato Sagisaka, and Haruaki Tamada, “Identifying the Applied Obfuscation Method towards De-obfuscation,” In Proc. 15th IEEE/ACIS International Conference on Computer and Information Science (ICIS 2016), pp.873–878, July 2016 (Oakayama, Japan). Link ieeexplore.ieee.org 匂坂 勇仁，玉田 春昭，”適用保護手法特定の試み −不自然さ評価方法を用いて−”，信学技報, Vol. 115, No. 153, SS2015-21, pp. 63-68, July 2015 (札幌). 🔎 Related Research Topics # De-obfuscate IRM (identifier renaming method) Artificiality evaluation Evaluating obfuscation method by Kolmogorov complexity Unreadability evaluation of obfuscated programs 🤝 Collaborators # Y. Kanzaki@Kumamoto National College of Technology ","date":"2020-01-27","externalUrl":null,"permalink":"/research/identifying_applied_obfuscator/","section":"💡 Researches","summary":"🗣 Overview # Recently, to prevent cracking, the various protection methods have been proposed. One of the protection methods is the obfuscation method. Obfuscation method changes the program into hard to understand for hiding secret information in the program.\nOn the other hand, de-obfuscation is an interesting research topic for protecting the software. Since, though vulnerable protection methods are dangerous, measuring the robustness of the method was not discussed.\n","title":"Identifying the applied obfuscator","type":"research"},{"content":"","date":"2020-01-27","externalUrl":null,"permalink":"/tags/opcodes/","section":"🏷️ Tags","summary":"","title":"Opcodes","type":"tags"},{"content":" 🗣 Overview # This research topic aims to build a helpful bot for the software development. Also, the topic focuses on the bot on the Social Coding Platform in the social network services. The one goal of the topic is to build a bot for gently helping GitHub flow.\n📚 Publications # 宮崎 光，玉田 春昭，CUIツールの開発支援サービスとしての再構築手順の提案”，信学技法，Vol.119，No.246, SS2019-14, pp.7–12, October 2019（熊本）. 玉田 春昭，”初学者向けGitHub flow学習支援”，ソフトウェアシンポジウム2019 ワークショップ 討論テーマ（2）実証的ソフトウェア工学によるプログラミング教育とソフトウェア工学教育，August 2019.（東京） Ko Miyazaki, Haruaki Tamada, “Identifying Users in the Bridging Service between Two Different Chat Services using User Icons,” In Proc. HCI International 2019, Digital Human Modeling and Applications in Health, Safety, Ergonomics and Risk Management. Healthcare Applications, (HCII2019), Lecture Notes in Computer Science, vol 11582, 24-31 July 2009. (Orlando, FL, USA). 柳川 龍太郎，西尾 泰介，玉田 春昭，”システム開発初心者のためのGitHub flow学習支援システム”，第25回ソフトウェア工学の基礎ワークショップ（FOSE2018），November 2018（函館，ポスター発表） 宮崎 光，玉田 春昭，”異なるチャットシステム間でメッセージ送信可能なシステムの構築”，第17回情報科学技術フォーラム（Forum on Information Technology 2018）(FIT 2018)，September 2018.（福岡） 西尾 泰介，柳川 龍太郎，玉田 春昭，”初学者を対象としたGitHub flow支援ボット”，ソフトウェアシンポジウム2018 ワークショップ 討論テーマ（4）ソーシャルコーディングのための実証的ソフトウェア工学，September 2018.（東京） 玉田 春昭，”ソーシャルコーディングプラットフォーム上のサービス連携のためのメタボット’‘，ウィンターワークショップ2018，January 2018.（広島） 🔎 Related Research Topics # Project as a City Mining Software Repository Characteristics of the developers 🤝 Collaborators # K. Matsumoto@NAIST ","date":"2019-10-20","externalUrl":null,"permalink":"/research/development_support_bot/","section":"💡 Researches","summary":"🗣 Overview # This research topic aims to build a helpful bot for the software development. Also, the topic focuses on the bot on the Social Coding Platform in the social network services. The one goal of the topic is to build a bot for gently helping GitHub flow.\n📚 Publications # 宮崎 光，玉田 春昭，CUIツールの開発支援サービスとしての再構築手順の提案”，信学技法，Vol.119，No.246, SS2019-14, pp.7–12, October 2019（熊本）. 玉田 春昭，”初学者向けGitHub flow学習支援”，ソフトウェアシンポジウム2019 ワークショップ 討論テーマ（2）実証的ソフトウェア工学によるプログラミング教育とソフトウェア工学教育，August 2019.（東京） Ko Miyazaki, Haruaki Tamada, “Identifying Users in the Bridging Service between Two Different Chat Services using User Icons,” In Proc. HCI International 2019, Digital Human Modeling and Applications in Health, Safety, Ergonomics and Risk Management. Healthcare Applications, (HCII2019), Lecture Notes in Computer Science, vol 11582, 24-31 July 2009. (Orlando, FL, USA). 柳川 龍太郎，西尾 泰介，玉田 春昭，”システム開発初心者のためのGitHub flow学習支援システム”，第25回ソフトウェア工学の基礎ワークショップ（FOSE2018），November 2018（函館，ポスター発表） 宮崎 光，玉田 春昭，”異なるチャットシステム間でメッセージ送信可能なシステムの構築”，第17回情報科学技術フォーラム（Forum on Information Technology 2018）(FIT 2018)，September 2018.（福岡） 西尾 泰介，柳川 龍太郎，玉田 春昭，”初学者を対象としたGitHub flow支援ボット”，ソフトウェアシンポジウム2018 ワークショップ 討論テーマ（4）ソーシャルコーディングのための実証的ソフトウェア工学，September 2018.（東京） 玉田 春昭，”ソーシャルコーディングプラットフォーム上のサービス連携のためのメタボット’‘，ウィンターワークショップ2018，January 2018.（広島） 🔎 Related Research Topics # Project as a City Mining Software Repository Characteristics of the developers 🤝 Collaborators # K. Matsumoto@NAIST ","title":"Development support bot","type":"research"},{"content":"","date":"2019-10-20","externalUrl":null,"permalink":"/tags/msr/","section":"🏷️ Tags","summary":"","title":"MSR","type":"tags"},{"content":" 🗣 Overview # Social coding platforms (SCPs) have realized spontaneous software evolution, where new source code and ideas are spontaneously proposed by altruistic developers. Although there are many projects operated by active communities performing spontaneous evolution, it is yet unclear that how such successful projects and communities have been formed and governed. In this paper, we propose a method that can investigate the history of every project in the SCP. Introducing the concept of project as a city, we consider every project in the SCP as a city, where a government and citizens develop a city through collaborative activities. We then identify essential attributes that characterize a state of a city. For each attribute, we develop metrics that quantify the state $S(p,t)$ of a project $p$ at time $t$. An experimental evaluation investigating GitHub projects of famous code editors shows that the proposed metrics well visualize the history of the projects from essential perspectives of a city.\n(Abstract from SNPD 2019)\n📚 Publications # Koji Toda, Haruaki Tamada, Masahide Nakamura, Kenichi Matsumoto, \u0026lsquo;\u0026lsquo;Capturing Spotaneous Software Evolution in a Social Coding Platform With Project-as-a-City Concept\u0026rsquo;\u0026rsquo;, International Journal of Software Innovation, Vol. 8, Issue. 3, pp. pp.35\u0026ndash;50, June, 2020. Link www.igi-global.com 中村 匡秀，戸田 航史，玉田 春昭，松本 健一，”自発的ソフトウェア進化を促すプロジェクト状態の推定”，日本機械学会 第29回設計工学・システム部門講演会，September 2019.（仙台） Koji Toda, Haruaki Tamada, Masahide Nakamura, and Kenichi Matsumoto, “Characterizing Project Evolution on a Social Coding Platform,” In Proc. 20th ACIS International Conference on Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing (SNPD 2019), pp.525–532, July 2019 (Toyama, Japan). Link ieeexplore.ieee.org 🔎 Related Research Topics # Development support bot Mining Software Repositories Characteristics of the developers 🤝 Collaborators # K. Matsumoto@NAIST SE Lab. M. Nakamura@Kobe University K. Toda@Fukuoka Institute of Technology. ","date":"2019-09-20","externalUrl":null,"permalink":"/research/project_as_a_city/","section":"💡 Researches","summary":"🗣 Overview # Social coding platforms (SCPs) have realized spontaneous software evolution, where new source code and ideas are spontaneously proposed by altruistic developers. Although there are many projects operated by active communities performing spontaneous evolution, it is yet unclear that how such successful projects and communities have been formed and governed. In this paper, we propose a method that can investigate the history of every project in the SCP. Introducing the concept of project as a city, we consider every project in the SCP as a city, where a government and citizens develop a city through collaborative activities. We then identify essential attributes that characterize a state of a city. For each attribute, we develop metrics that quantify the state $S(p,t)$ of a project $p$ at time $t$. An experimental evaluation investigating GitHub projects of famous code editors shows that the proposed metrics well visualize the history of the projects from essential perspectives of a city.\n","title":"Project as a City","type":"research"},{"content":"","date":"2019-07-15","externalUrl":null,"permalink":"/tags/aspect-oriented-programming/","section":"🏷️ Tags","summary":"","title":"Aspect Oriented Programming","type":"tags"},{"content":" 🗣 Overview # The software birthmark methods are proposed to find the stolen software from the huge number of suspects. The software birthmark methods are classified into two manners, static and dynamic manners. Different from the static birthmarks, dynamic birthmarks require inputs since they base on runtime behaviors. Also, the dynamic birthmark varies depending on the inputs, therefore, it is difficult to extract beforehand. Hence the extraction cost of the dynamic birthmarks is generally high than the static birthmarks. This paper focuses on unit test codes in a project in order to extract the dynamic birthmarks beforehand, and reduce the extraction cost. The experiments evaluated the credibility and resilience performance of the birthmarks. The performance evaluation showed good results, the similarities were greater than 0.8 between most recent two versions of the same products, and were under 0.355 among different projects. In the cost evaluation, the proposed method can reduce the extraction cost of dynamic birthmarks.\n(Abstract from SNPD 2018)\n📚 Publications # 横井 昂典，玉田 春昭，\u0026ldquo;単体テストコードとアスペクト指向を用いた動的バースマークの抽出コストの削減\u0026rdquo;，情報処理学会論文誌，Vol.60, No.7，pp.1247–1259，July 2019. Link id.nii.ac.jp Takanori Yokoi, and Haruaki Tamada, \u0026ldquo;A Beforehand Extraction Method for Dynamic Software Birthmarks using Unit Test Codes,\u0026rdquo; In Proc. 19th ACIS International Conference on Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing (SNPD 2018), July 2018 (Busan, Korea). Link ieeexplore.ieee.org 横井 昂典，玉田 春昭，\u0026ldquo;単体テストコードを利用した動的バースマークの抽出\u0026rdquo;，コンピュータセキュリティシンポジウム2017（CSS 2017），pp.1288–1294 (3C3-4)，October 2017（山形）. 🔎 Related Research Topics # Concept of Software Birthmarks Dynamic Software Birthmarks ","date":"2019-07-15","externalUrl":null,"permalink":"/research/automatic_extraction_of_dynamic_birthmarks/","section":"💡 Researches","summary":"🗣 Overview # The software birthmark methods are proposed to find the stolen software from the huge number of suspects. The software birthmark methods are classified into two manners, static and dynamic manners. Different from the static birthmarks, dynamic birthmarks require inputs since they base on runtime behaviors. Also, the dynamic birthmark varies depending on the inputs, therefore, it is difficult to extract beforehand. Hence the extraction cost of the dynamic birthmarks is generally high than the static birthmarks. This paper focuses on unit test codes in a project in order to extract the dynamic birthmarks beforehand, and reduce the extraction cost. The experiments evaluated the credibility and resilience performance of the birthmarks. The performance evaluation showed good results, the similarities were greater than 0.8 between most recent two versions of the same products, and were under 0.355 among different projects. In the cost evaluation, the proposed method can reduce the extraction cost of dynamic birthmarks.\n","title":"Auto-extraction of Dynamic Birthmarks","type":"research"},{"content":"This is my personal web site. This site introduces my research works, software products, blog articles, and so on.\n💡 Researches 2026-04-01\u0026middot;34 words Research Software Obfuscation Software Birthmarks Program Education Introduces my research works. The main research areas are: empirical software engineering, software security (software theft detection, software obfuscation), and program education. 🚀 Products 2026-09-30\u0026middot;259 words Products Cli Libraries Research Tools A compact card view of my software products, generated from the products API. Each card packs the repository, web site, documentation, registry, container and SBOM links, plus languages, license, last update and the latest release. 🤔 Blog 2026-08-13\u0026middot;17 words Blog This is my blog page which named たまにっき TamaNikki (means diary of TAMADA). The pages of this category are almost written in Japanese 🇯🇵. 📣 Copyright notice # I have the copyrights for the contents in this site. You can use the contents in this site obey the CC BY 4.0.\n","date":"2019-07-13","externalUrl":null,"permalink":"/","section":"🏡 Home","summary":"This is my personal web site. This site introduces my research works, software products, blog articles, and so on.\n💡 Researches 2026-04-01·34 words Research Software Obfuscation Software Birthmarks Program Education Introduces my research works. The main research areas are: empirical software engineering, software security (software theft detection, software obfuscation), and program education. 🚀 Products 2026-09-30·259 words Products Cli Libraries Research Tools A compact card view of my software products, generated from the products API. Each card packs the repository, web site, documentation, registry, container and SBOM links, plus languages, license, last update and the latest release. 🤔 Blog 2026-08-13·17 words Blog This is my blog page which named たまにっき TamaNikki (means diary of TAMADA). The pages of this category are almost written in Japanese 🇯🇵. 📣 Copyright notice # I have the copyrights for the contents in this site. You can use the contents in this site obey the CC BY 4.0.\n","title":"🏡 Home","type":"page"},{"content":" 🗣 Overview # The obfuscation methods are often used to hide sensitive information in software. Especially, an identifier renaming method (IRM) is well used because it is easy to implement. IRM is one of the obfuscation methods, and to change the names of function, and variables into meaningless one. However, if we can restore the identifiers to the original names, IRM is invalidated. One of the serious problems about IRM is that the tolerance against de-obfuscation is not discussed. This paper tries to de-obfuscate IRMed programs. Thereby, this paper evaluates the tolerance and effectiveness of IRM. From the experimental evaluation, the proposed method can restore the 49.71 % of method names to the original verbs. Furthermore, focusing on the meanings of verbs, the proposed method recommends the verbs of similar meanings to the original verbs in 57.01 % of methods.\n(Abstract from SNPD 2018)\n📚 Publications # 磯部 陽介，玉田 春昭，”ランダムフォレストを用いた名前難読化の耐タンパ化性能の評価”，情報処理学会論文誌，Vol.60, No.4, pp. 1063–1074, April 2019. Yosuke Isobe, and Haruaki Tamada, “Are Identifier Renaming Methods Secure? –An Evaluation Focuses on Opcodes using Random Forest–,” In Proc. 19th ACIS International Conference on Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing (SNPD 2018), July 2018 (Busan, Korea). Link ieeexplore.ieee.org 磯部 陽介，玉田 春昭，”ランダムフォレストによる名前難読化の逆変換”，第24回ソフトウェア工学の基礎ワークショップ（FOSE2017），pp. 93–98, November 2017（福井）. 匂坂 勇仁，玉田 春昭，”命令列に着目した名前難読化の逆変換手法”，2017年暗号と情報セキュリティシンポジウム予稿集 (SCIS 2017)，3D1-5，January 2017. （沖縄，那覇） Paper3 BibTeX Like0 磯部 陽介，玉田 春昭，”協調フィルタリングを利用した名前難読化の逆変換”，2017年暗号と情報セキュリティシンポジウム予稿集 (SCIS 2017)，3D1-3，January 2017.（沖縄，那覇） 🔎 Related Research Topics # Identifying the applied obfuscator Artificiality evaluation Evaluating obfuscation method by Kolmogorov complexity Unreadability evaluation of obfuscated programs ","date":"2019-04-15","externalUrl":null,"permalink":"/research/deobfuscating_identifier_renaming/","section":"💡 Researches","summary":"🗣 Overview # The obfuscation methods are often used to hide sensitive information in software. Especially, an identifier renaming method (IRM) is well used because it is easy to implement. IRM is one of the obfuscation methods, and to change the names of function, and variables into meaningless one. However, if we can restore the identifiers to the original names, IRM is invalidated. One of the serious problems about IRM is that the tolerance against de-obfuscation is not discussed. This paper tries to de-obfuscate IRMed programs. Thereby, this paper evaluates the tolerance and effectiveness of IRM. From the experimental evaluation, the proposed method can restore the 49.71 % of method names to the original verbs. Furthermore, focusing on the meanings of verbs, the proposed method recommends the verbs of similar meanings to the original verbs in 57.01 % of methods.\n","title":"De-obfuscate IRM","type":"research"},{"content":"","date":"2018-01-15","externalUrl":null,"permalink":"/tags/education/","section":"🏷️ Tags","summary":"","title":"Education","type":"tags"},{"content":" 🗣 Overview # It is crucial for educators to understand pitfalls for novice programmers in programming education at computer science course. By giving well-timed advice to students who fall into a pitfall, educators are able to achieve efficient teaching and keep up their students\u0026rsquo; motivation. However, so far, it is less well-understood how novice students edit source code and why they fall into a pitfall. In this paper, we analyzed coding patterns of novice students empirically. We collected programming activities by students on exercises of programming course, and then performed qualitative and quantitative analysis. In qualitative analysis, experienced programmers analyzed patterns of the novice programmers manually. In quantitative analysis, we focused on transtions of the edit distance between a source code of each student under development and a correct source code in a programming class. As a result, we confirmed coding patterns of novice programmers in case of falling into pitfalls, and the characteristics of transitions of edit distance metric in the case that novice students had faced difficulty in understanding the exercise.\n(Abstract from IWESEP 2012)\n📚 Publications # 藤原 賢二，上村 恭平，井垣 宏，吉田 則裕，伏田 享平，玉田 春昭，楠本 真二，飯田 元，”スナップショットを用いたプログラミング演習における行き詰まり箇所の特定”，コンピュータ ソフトウェア, Vol. 35, No. 1, pp.1_3-1_13, January 2018. 藤原 賢二，上村 恭平，井垣 宏，伏田 享平，玉田 春昭，楠本 真二，飯田 元，”スナップショットを用いたプログラミング演習における行き詰まり箇所の特定”，第3回実践的IT教育シンポジウム（rePiT2017）論文集，pp.17–26, January 2017.（大阪，最優秀論文賞） Kenji Fujiwara, Kyohei Fushida, Haruaki Tamada, Hiroshi Igaki, and Norihiro Yoshida, “Why Novice Programmers Fall into a Pitfall?: Coding Pattern Analysis in Programming Exercise,” In Proc. 4th International Workshop on Empirical Software Engineering in Practice (IWESEP 2012), pp.46-51, October 2012. (Osaka, Japan) [Best Student Paper Award] Link ieeexplore.ieee.org 伏田 享平, 玉田 春昭，井垣 宏，藤原 賢二，吉田 則裕，”プログラミング演習における初学者を対象としたコーディング傾向の分析”, 信学技報 ソフトウェアサイエンス研究会, Vol.2012-03-SS, pp.67-72, March 2012. Haruaki Tamada, Akihiro Ogino, and Hirotada Ueda, “A Framework for Programming Process Measurement and Compile Error Interpretation for Novice Programmers,” In Proc. The Joint Conference of the 21th International Workshop on Software Measurement (IWSM) and the 6th International Conference on Software Process and Product Measurement (Mensura) (IWSM/MENSURA 2011), pp.233-238, 3-4 November 2011. (Nara, Japan) Akihiro Ogino, Haruaki Tamada, and Hirotada Ueda, “Phynocation: A prototyping of a teaching assistant robot for C language class,” In Proc. HCI International 2011 (HCI2011), 9-14 July 2011. (Orlando, Florida, USA) 荻野 晃大，玉田 春昭，上田 博唯，”ロボットをアシスタントとして利用する教育支援システムの研究”，京都産業大学総合学術研究所所報，第6号，pp.45–54, July 2011. 玉田 春昭，荻野 晃大，上田 博唯，”アシスタントロボットを用いたプログラミング教育支援システムの構築”, 信学技報 マルチメディア・仮想環境基礎研究会, Vol.MVE2010-48, pp.143-148, June 2010. Haruaki Tamada, Akihiro Ogino, and Hirotada Ueda, “Robot Helps Teachers for Education of the C Language Beginners,” In Proc. HCI International 2009 (HCII2009), DVD, 19-24 July 2009. (San Diego, CA, USA). 🔎 Related Research Topics # Characteristics of the developers 🤝 Collaborators # K. Fuijwara@National Institute of Technology, Toyota College H. Igaki@Osaka Institute of Technology N. Yoshida@Nagoya University K. Fishida ","date":"2018-01-15","externalUrl":null,"permalink":"/research/evaluation_programming_course/","section":"💡 Researches","summary":"🗣 Overview # It is crucial for educators to understand pitfalls for novice programmers in programming education at computer science course. By giving well-timed advice to students who fall into a pitfall, educators are able to achieve efficient teaching and keep up their students’ motivation. However, so far, it is less well-understood how novice students edit source code and why they fall into a pitfall. In this paper, we analyzed coding patterns of novice students empirically. We collected programming activities by students on exercises of programming course, and then performed qualitative and quantitative analysis. In qualitative analysis, experienced programmers analyzed patterns of the novice programmers manually. In quantitative analysis, we focused on transtions of the edit distance between a source code of each student under development and a correct source code in a programming class. As a result, we confirmed coding patterns of novice programmers in case of falling into pitfalls, and the characteristics of transitions of edit distance metric in the case that novice students had faced difficulty in understanding the exercise.\n","title":"Evaluating students in programming courses","type":"research"},{"content":"","date":"2018-01-15","externalUrl":null,"permalink":"/tags/source-code-analysis/","section":"🏷️ Tags","summary":"","title":"Source Code Analysis","type":"tags"},{"content":" 🗣 Overview # This topic is for mining software repositories. The following surveys were done.\nwhy do the developers update the build files in the project, and how to build the obliging bots for supporting next action. 📚 Publications # 鐘ヶ江 由佳，玉田 春昭，畑 秀明，”GitHubにおける言語ごとのビルドファイルの更新理由調査”， 研究報告ソフトウェア工学（SE）, Vol. 2017-SE-196, No.28, July 2017. Akira Inokuchi, Haruaki Tamada, Hideaki Hata, and Masateru Tsunoda, \u0026ldquo;Toward Obliging Bots for Supporting Next Actions,\u0026rdquo; In Proc. of the 4th International Conference on Applied Computing \u0026amp; Information Technology (ACIT 2016), pp. 183–188, December 2016 (UNLV, Las Vegas, NV, USA). 🔎 Related Research Topics # Project as a City Characteristics of the developers 🤝 Collaborators # H. Hata@NAIST SE Lab. M. Tsunoda@Kindai University. ","date":"2017-07-14","externalUrl":null,"permalink":"/research/software_development_with_ai/","section":"💡 Researches","summary":"🗣 Overview # This topic is for mining software repositories. The following surveys were done.\nwhy do the developers update the build files in the project, and how to build the obliging bots for supporting next action. 📚 Publications # 鐘ヶ江 由佳，玉田 春昭，畑 秀明，”GitHubにおける言語ごとのビルドファイルの更新理由調査”， 研究報告ソフトウェア工学（SE）, Vol. 2017-SE-196, No.28, July 2017. Akira Inokuchi, Haruaki Tamada, Hideaki Hata, and Masateru Tsunoda, “Toward Obliging Bots for Supporting Next Actions,” In Proc. of the 4th International Conference on Applied Computing \u0026 Information Technology (ACIT 2016), pp. 183–188, December 2016 (UNLV, Las Vegas, NV, USA). 🔎 Related Research Topics # Project as a City Characteristics of the developers 🤝 Collaborators # H. Hata@NAIST SE Lab. M. Tsunoda@Kindai University. ","title":"Mining Software Repository","type":"research"},{"content":" 🗣 Overview # This research topic tries to evaluate the artificialities of the obfuscated programs. We believe that the obfuscation changes the programs into unordinal ones. This topics evaluates the artificialities by tf-idf and perplexities.\n📚 Publications # 横井 昂典，玉田 春昭，”使用クラスに基づいたTF-IDFによる難読化の不自然さ評価”，2017年暗号と情報セキュリティシンポジウム予稿集 (SCIS 2017)，3D1-4，January 2017.（沖縄，那覇） 大滝 隆貴，大堂 哲也，玉田 春昭，神崎 雄一郎，門田 暁人，”Javaバイトコード命令のオペコード、オペランドを用いた難読化手法のステルシネス評価”，2014年暗号と情報セキュリティシンポジウム予稿集 (SCIS2014), 2D2-2, January 2014. 🔎 Related Research Topics # Identifying the applied obfuscator De-obfuscate IRM (identifier renaming method) Evaluating obfuscation method by Kolmogorov complexity Unreadability evaluation of obfuscated programs 🤝 Collaborators # Y. Kanzaki@Kumamoto National College of Technology ","date":"2017-01-23","externalUrl":null,"permalink":"/research/artificiality_evaluation/","section":"💡 Researches","summary":"🗣 Overview # This research topic tries to evaluate the artificialities of the obfuscated programs. We believe that the obfuscation changes the programs into unordinal ones. This topics evaluates the artificialities by tf-idf and perplexities.\n📚 Publications # 横井 昂典，玉田 春昭，”使用クラスに基づいたTF-IDFによる難読化の不自然さ評価”，2017年暗号と情報セキュリティシンポジウム予稿集 (SCIS 2017)，3D1-4，January 2017.（沖縄，那覇） 大滝 隆貴，大堂 哲也，玉田 春昭，神崎 雄一郎，門田 暁人，”Javaバイトコード命令のオペコード、オペランドを用いた難読化手法のステルシネス評価”，2014年暗号と情報セキュリティシンポジウム予稿集 (SCIS2014), 2D2-2, January 2014. 🔎 Related Research Topics # Identifying the applied obfuscator De-obfuscate IRM (identifier renaming method) Evaluating obfuscation method by Kolmogorov complexity Unreadability evaluation of obfuscated programs 🤝 Collaborators # Y. Kanzaki@Kumamoto National College of Technology ","title":"Artificiality evaluation of obfuscations","type":"research"},{"content":"","date":"2015-08-01","externalUrl":null,"permalink":"/tags/invokedynamic/","section":"🏷️ Tags","summary":"","title":"Invokedynamic","type":"tags"},{"content":" 🗣 Overview # This paper proposes an obfuscation method against illegal analysis. The proposed method tries to build a fake call flow graph from debugging tools. The call flow graph represents relations among methods and helps understanding of a program. The fake call flow graph leads misunderstanding of the program. We focus on a hook mechanism of the method call for changing a callee. We conduct two experiments to evaluate the proposed method. First experiment simulates attacks by existing tools: Soot, jad, Procyon, and Krakatau. The Procyon only succeeded decompilation, the others crashed. Second experiment evaluates understandability of the obfuscated program by the hand. Only one subject in the nine subjects answered the correct value. The experiments shows the proposed method has good tolerance against existing tools, and high difficulty of understanding even if the target program is tiny and simple program. (Abstract from IJSI 2015)\n📚 Publications # Kazumasa Fukuda and Haruaki Tamada, “To Prevent Reverse-Engineering Tools by Shuffling the Stack Status with Hook Mechanism,” International Journal of Software Innovation (IJSI), Volume 3, Issue 3, pp.14-25, 2015. Link www.igi-global.com 福田 收真，稲垣 賢一，玉田 春昭，”メタプログラミング技法を用いた偽装難読化手法”，2015年暗号と情報セキュリティシンポジウム予稿集（SCIS2015），3B4-3，January 2015（福岡，小倉）. 稲垣 賢一，福田 收真，玉田 春昭，”メソッド呼び出しのフックを用いた動的コールフローグラフ偽装の試み”，2015年暗号と情報セキュリティシンポジウム予稿集（SCIS2015），3B4-2，January 2015（福岡，小倉）. 福田 收真，玉田 春昭，”フックを用いた変数アクセス偽装難読化に向けて”，ソフトウェア工学の基礎XXI，日本ソフトウェア科学会 FOSE2014 (FOSE2014), pp.81–86, December 2014. 福田 收真，玉田 春昭，”メソッド呼び出し関係隠蔽のための引数順序の入れ替えによる難読化”，2014年暗号と情報セキュリティシンポジウム予稿集 (SCIS2014), 2D2-3, January 2014. 福田 收真，玉田 春昭，”Java 7におけるAPI名隠ぺいのためのinvokedynamic命令を用いた難読化の試み”，コンピュータセキュリティシンポジウム 2013 (CSS 2013), pp.1050-1057，No.3D4-2，October 2013. Kazumasa Fukuda, and Haruaki Tamada, “A Dynamic Birthmark from Analyzing Operand Stack Runtime Behavior to Detect Copied Software,” In Proc. 13th ACIS International Conference on Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing (SNPD 2013), pp.505-510, 1-3 July 2013 (Honolulu, Hawaii, U.S.A.). Link ieeexplore.ieee.org 玉田 春昭，神崎 雄一郎，門田 暁人，”Java言語を対象とした実行時多様化の試み”, 2012年暗号と情報セキュリティシンポジウム予稿集 (SCIS2012), 4E2-3, January 2012. 🔎 Related Research Topics # Instruction folding obfuscation method Obfuscation by dynamic name resolution ","date":"2015-08-01","externalUrl":null,"permalink":"/research/obfuscation_by_invokedynamic/","section":"💡 Researches","summary":"🗣 Overview # This paper proposes an obfuscation method against illegal analysis. The proposed method tries to build a fake call flow graph from debugging tools. The call flow graph represents relations among methods and helps understanding of a program. The fake call flow graph leads misunderstanding of the program. We focus on a hook mechanism of the method call for changing a callee. We conduct two experiments to evaluate the proposed method. First experiment simulates attacks by existing tools: Soot, jad, Procyon, and Krakatau. The Procyon only succeeded decompilation, the others crashed. Second experiment evaluates understandability of the obfuscated program by the hand. Only one subject in the nine subjects answered the correct value. The experiments shows the proposed method has good tolerance against existing tools, and high difficulty of understanding even if the target program is tiny and simple program. (Abstract from IJSI 2015)\n","title":"Obfuscation by invokedynamic","type":"research"},{"content":" 🗣 Overview # In software development, multiple developers compose a team, and perform a development process. To succeed the development, understanding developers\u0026rsquo; characteristics are needed. However, there is no way to measure the characteristics of the developer by quantitative analysis. Therefore, a project manager often assigns team members based on his/her own sense, considering experience year of them.\nThis paper proposes a measurement framework for developers\u0026rsquo; characteristics using quantitative historical data. The proposed framework is useful for measuring developers\u0026rsquo; characteristics and building a team based on quantitative analysis.\nWe collected historical data from a PBL project for graduate students, and applied our framework to the collected data. As a result, our framework measured developers\u0026rsquo; characteristics suitability in our subjective view.\n(Abstract from ACIT 2015)\n📚 Publications # 山崎 尚，五田 篤志，玉田 春昭，畑 秀明，角田 雅照，井垣 宏，”ゲーム理論による開発者特性を考慮したチームビルディング”, 研究報告ソフトウェア工学（SE）, Vol.2015-SE-187, No.6, March 2015. 五田 篤志，山崎 尚，玉田 春昭，畑 秀明，角田 雅照，井垣 宏，”開発履歴による開発者特性とアンケートによる特性の自己診断の関連分析”, 研究報告ソフトウェア工学（SE）, Vol.2015-SE-187, No.5, March 2015. 角田 雅照，玉田 春昭，畑 秀明，井垣 宏，”ソフトウェア開発者の特性計測のための尺度作成に向けて”，ウィンターワークショップ 2015 in 宜野湾 (WWS 2015)，pp.13–14, January 2015. 五田 篤志，山崎 尚，玉田 春昭，畑 秀明，角田 雅照，井垣 宏，”開発履歴による開発者特性とアンケートによる特性の自己診断の関連分析”, 研究報告ソフトウェア工学（SE）, Vol.2015-SE-187, No.5, March 2015. 山崎 尚，五田 篤志，玉田 春昭，畑 秀明，角田 雅照，井垣 宏，”ゲーム理論による開発者特性を考慮したチームビルディング”, 研究報告ソフトウェア工学（SE）, Vol.2015-SE-187, No.6, March 2015. Atsushi Itsuda, Shin Fujiwara, Nao Yamasaki, Haruaki Tamada, Hideaki Hata, Masateru Tsunoda, and Hiroshi Igaki, “Fu-Rin-Ka-Zan: Quantitative Analysis of Developers’ Characteristics based on Project Historical Data,” In Proc. of the 3rd International Conference on Applied Computing \u0026amp; Information Technology (ACIT 2015), pp.15-20, July 2015 (Okayama, Japan). Link ieeexplore.ieee.org 五田 篤志, 山崎 尚, 玉田 春昭, 畑 秀明, 角田 雅照, 井垣 宏, “開発履歴を利用した風林火山モデルに基づく開発者特性の分析”, 研究報告ソフトウェア工学（SE）, volume 2014-SE-185, number 9, July 2014. Masateru Tsunoda, Haruaki Tamada, and Hideaki Hata, “How to Classify Personalities of Team Members on Project-Based Learning,” In Proc. Software Engineering Education Workshop (SEEW 2014), December 2014 (Jeju, Korea). 藤原 新，五田 篤志，玉田 春昭，角田 雅照，畑 秀明，”ソフトウェア開発履歴を利用した風林火山モデルによる開発者の特性診断の試み”，ソフトウェア工学の基礎XX，日本ソフトウェア科学会 FOSE2013 (FOSE2013), pp.295-296, November 2013. 🔎 Related Research Topics # Development support bot 🤝 Collaborators # H. Hata@NAIST SE Lab. M. Tsunoda@Kindai University. ","date":"2015-03-20","externalUrl":null,"permalink":"/research/characteristics_of_developers/","section":"💡 Researches","summary":"🗣 Overview # In software development, multiple developers compose a team, and perform a development process. To succeed the development, understanding developers’ characteristics are needed. However, there is no way to measure the characteristics of the developer by quantitative analysis. Therefore, a project manager often assigns team members based on his/her own sense, considering experience year of them.\n","title":"Characteristics of the developers","type":"research"},{"content":"","date":"2015-03-20","externalUrl":null,"permalink":"/tags/developer-analysis/","section":"🏷️ Tags","summary":"","title":"Developer Analysis","type":"tags"},{"content":" 🗣 Overview # This paper quantifies the diffuculty of program analysis based on the information theory. The basic idea is to consider that a program ultimately obscated if instructions appear at random; that is (1) all instructions has an equal frequency of appearance, and (2) there is no pattern observed in the instruction sequence. We quantified (1) based on the entropy and (2) based on the Kolmogorov complexity. We evaluated the feasibility of our proposal through a case study.\n(Abstract from Computer Software, Vol.30, No. 3)\n📚 Publications # 二村 阿美，門田 暁人，玉田 春昭，神崎 雄一郎，中村 匡秀，松本 健一，\u0026ldquo;命令のランダム性に基づくプログラム難読化の評価\u0026rdquo;，コンピュータソフトウェア, Vol. 30, No. 3, pp. 18-24, September 2013. 二村 阿美，門田 暁人，玉田 春昭，神崎 雄一郎，中村 匡秀，松本 健一，\u0026ldquo;命令の乱雑さに基づくプログラム理解性の評価\u0026rdquo;，ソフトウェア工学の基礎XIX，日本ソフトウェア科学会 FOSE2012 (FOSE2012), pp.151–160, December 2012 (Reviewed). 🔎 Related Research Topics # Artificiality evaluation of obfuscations De-obfuscate IRM (identifier renaming method) Unreadability evaluation of obfuscated programs 🤝 Collaborators # A. Monden@Software mesurement and analytics laboratory, Okayama University M. Nakamura@Kobe University Y. Kanzaki@Kumamoto National College of Technology ","date":"2013-09-01","externalUrl":null,"permalink":"/research/evaluation_obfuscation_kolmogorov/","section":"💡 Researches","summary":"🗣 Overview # This paper quantifies the diffuculty of program analysis based on the information theory. The basic idea is to consider that a program ultimately obscated if instructions appear at random; that is (1) all instructions has an equal frequency of appearance, and (2) there is no pattern observed in the instruction sequence. We quantified (1) based on the entropy and (2) based on the Kolmogorov complexity. We evaluated the feasibility of our proposal through a case study.\n","title":"Evaluating obfuscation method by Kolmogorov complexity","type":"research"},{"content":"","date":"2013-09-01","externalUrl":null,"permalink":"/tags/kolmogorov-complexity/","section":"🏷️ Tags","summary":"","title":"Kolmogorov Complexity","type":"tags"},{"content":"","date":"2013-07-01","externalUrl":null,"permalink":"/tags/method-folding/","section":"🏷️ Tags","summary":"","title":"Method Folding","type":"tags"},{"content":" 🗣 Overview # To improve tamper resistance of programs against illegal modification, this paper proposes instruction folding applicable to Java platform.\nIn the proposed method, at first, similar methods are selected in a Java program. Next, these methods are merged into one method and diffs among these methods are stored in the program. Then, at runtime, when one of the merged methods is executed, diffs are restored by self-modification, which is realized by the Java instrumentation mechanism. The proposed method is resilient against tampering of folded method. Even if an adversary modifies the folded method, the program goes crash because the method is repeatedly modified at runtime.\n(Abstract from SNPD 2013)\n📚 Publications # Tetsuya Ohdo, Haruaki Tamada, Yuichiro Kanzaki, and Akito Monden, “An Instruction Folding Method to Prevent Reverse Engineering in Java Platform,” In Proc. 13th ACIS International Conference on Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing (SNPD 2013), pp.517-522, 1-3 July 2013 (Honolulu, Hawaii, U.S.A.). Link ieeexplore.ieee.org 大堂 哲也，玉田 春昭，”Javaを対象とした畳込み手法による耐タンパ化の試み”，2013年暗号と情報セキュリティシンポジウム予稿集 (SCIS2013), 2C4-3, January 2013. 玉田 春昭，神崎 雄一郎，門田 暁人，”Java言語を対象とした実行時多様化の試み”, 2012年暗号と情報セキュリティシンポジウム予稿集 (SCIS2012), 4E2-3, January 2012. 🔎 Related Research Topics # Obfuscation by invokedynamic Obfuscation by dynamic name resolution 🤝 Collaborators # A. Monden@Software mesurement and analytics laboratory, Okayama University Y. Kanzaki@Kumamoto National College of Technology ","date":"2013-07-01","externalUrl":null,"permalink":"/research/obfuscation_by_method_folding/","section":"💡 Researches","summary":"🗣 Overview # To improve tamper resistance of programs against illegal modification, this paper proposes instruction folding applicable to Java platform.\nIn the proposed method, at first, similar methods are selected in a Java program. Next, these methods are merged into one method and diffs among these methods are stored in the program. Then, at runtime, when one of the merged methods is executed, diffs are restored by self-modification, which is realized by the Java instrumentation mechanism. The proposed method is resilient against tampering of folded method. Even if an adversary modifies the folded method, the program goes crash because the method is repeatedly modified at runtime.\n","title":"Method folding obfuscation","type":"research"},{"content":"","date":"2012-09-24","externalUrl":null,"permalink":"/tags/readability/","section":"🏷️ Tags","summary":"","title":"Readability","type":"tags"},{"content":" 🗣 Overview # Obfuscation methods were proposed for protecting programs from cracking. These methods convert program into incomprehensible one, such as change symbol names from meaningful to meaningless. As a result, secret information in the program can be hidden. However, obfuscation methods are not evaluated sufficiently. This paper evaluates incomprehensibility of the obfuscated programs using queue based virtual mental simulation model (VMSM) which is focused on short term memory in program comprehension. An experimental evaluation showed that VMSM was able to evaluate the incomprehensibility of data and control flow obfuscation methods.\n(Abstract from SNPD 2012)\n📚 Publications # 吉岡 智哉，福田 收真，玉田 春昭，”メンタルシミュレーションモデルに基づいたプログラムの読みやすさ評価”，情報処理学会関西支部支部大会(B-02)，September 2012. Haruaki Tamada, Kazumasa Fukuda, and Tomoya Yoshioka, “Program Incomprehensibility Evaluation for Obfuscation Methods with Queue-based Mental Simulation Model,” In Proc. 13th ACIS International Conference on Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing (SNPD 2012), pp. 498–503, 8-10 August 2012 (Kyoto, Japan). 玉田 春昭, 福田 收真, 吉岡 智哉, 岩間 文也, 小畠 良太, 片岡 明範, “メンタルシミュレーションモデルを利用した動的名前解決難読化手法の読みにくさ評価”, 電子情報通信学会 2012年総合大会 D-3-3, March 2012. 🔎 Related Research Topics # Artificiality evaluation of obfuscations De-obfuscate IRM (identifier renaming method) Evaluating obfuscation method by Kolmogorov complexity ","date":"2012-09-24","externalUrl":null,"permalink":"/research/unreadability_evaluation/","section":"💡 Researches","summary":"🗣 Overview # Obfuscation methods were proposed for protecting programs from cracking. These methods convert program into incomprehensible one, such as change symbol names from meaningful to meaningless. As a result, secret information in the program can be hidden. However, obfuscation methods are not evaluated sufficiently. This paper evaluates incomprehensibility of the obfuscated programs using queue based virtual mental simulation model (VMSM) which is focused on short term memory in program comprehension. An experimental evaluation showed that VMSM was able to evaluate the incomprehensibility of data and control flow obfuscation methods.\n","title":"Unreadability evaluation by mental simulation model","type":"research"},{"content":" 🗣 Overview # This research topics shows applications of software birthmarks. In our publications, we try to classify the programs using extracted software birthmarks. Because, we believe that the birthmarks shows the functionalities of the programs.\n📚 Publications # 牛窓 朋義, 門田 暁人, 玉田 春昭, 松本 健一, “使用クラスに基づくソフトウェアの機能面からの分類”, 信学技報 ソフトウェアサイエンス研究会, Vol.SS2009-17, pp.31-36, August 2009. 玉田 春昭，森崎 修司，門田 暁人，松本 健一，”バースマークを用いたソフトウェア拡張開発での流用度合いの測定”，情報処理学会第70回全国大会，pp.5-399-400, March 2008. Takesi Kakimoto, Akito Monden, Yasutaka Kamei, Haruaki Tamada, Masateru Tsunoda, and Ken-ichi Matsumoto, “Using Software Birthmarks to Identify Similar Classes and Major Functionalities,” In Proc. the 3rd International Workshop on Mining Software Repositories (MSR 2006), pp.171-172, May 2006. (Shanghai, China) Link dl.acm.org 🔎 Related Research Topics # Concept of Software Birthmarks Dynamic Software Birthmarks Fast comparisons of the birthmarks 🤝 Collaborators # A. Monden@Software mesurement and analytics laboratory, Okayama University ","date":"2009-08-15","externalUrl":null,"permalink":"/research/birthmark_applications/","section":"💡 Researches","summary":"🗣 Overview # This research topics shows applications of software birthmarks. In our publications, we try to classify the programs using extracted software birthmarks. Because, we believe that the birthmarks shows the functionalities of the programs.\n📚 Publications # 牛窓 朋義, 門田 暁人, 玉田 春昭, 松本 健一, “使用クラスに基づくソフトウェアの機能面からの分類”, 信学技報 ソフトウェアサイエンス研究会, Vol.SS2009-17, pp.31-36, August 2009. 玉田 春昭，森崎 修司，門田 暁人，松本 健一，”バースマークを用いたソフトウェア拡張開発での流用度合いの測定”，情報処理学会第70回全国大会，pp.5-399-400, March 2008. Takesi Kakimoto, Akito Monden, Yasutaka Kamei, Haruaki Tamada, Masateru Tsunoda, and Ken-ichi Matsumoto, “Using Software Birthmarks to Identify Similar Classes and Major Functionalities,” In Proc. the 3rd International Workshop on Mining Software Repositories (MSR 2006), pp.171-172, May 2006. (Shanghai, China) Link dl.acm.org 🔎 Related Research Topics # Concept of Software Birthmarks Dynamic Software Birthmarks Fast comparisons of the birthmarks 🤝 Collaborators # A. Monden@Software mesurement and analytics laboratory, Okayama University ","title":"Applications of software birthmarks","type":"research"},{"content":"","date":"2008-02-12","externalUrl":null,"permalink":"/tags/dynamic-name-resolution/","section":"🏷️ Tags","summary":"","title":"Dynamic Name Resolution","type":"tags"},{"content":" 🗣 Overview # Name obfuscation is a software protection technique, which renames identifiers in a given program, to protect the program from illegal cracking. The conventional methods replace names appearing in the declaration part with the meaningless ones. Therefore, the methods cannot be used to obfuscate names declared in system libraries, since changing such system-defined names significantly deteriorates the program portability.\nThis paper presents a new name obfuscation method, which can hide appearance of the system-defined names. In the proposed method, the system-defined names are statically encrypted, and the original names are resolved during run time using the reflection.\nAn experimental evaluation on the Java platform showed that the run-time overhead for the obfuscated program was 1.74 times larger than the one for the original.\n(Abstract from IASTED SE 2008)\n📚 Publications # Haruaki Tamada, Masahide Nakamura, Akito Monden, and Ken-ichi Matsumoto, “Introducing Dynamic Name Resolution Mechanism for Obfuscating System-Defined Names in Programs,” In Proc. IASTED International Conference on Software Engineering (IASTED SE 2008), 598-074, pp. 125-130, 12-14 February 2008. (Innsbruck, Austria) 玉田 春昭, 中村 匡秀, 門田 暁人, 松本 健一, “APIライブラリ名隠ぺいのための動的名前解決を用いた名前難読化”, 電子情報通信学会論文誌, Vol.J90-D, No.10, pp.2723–2735, October 2007. 玉田 春昭, 中村 匡秀, 門田 暁人, 松本 健一 “C言語におけるライブラリ呼び出し隠蔽のための名前難読化手法”, 2007年暗号と情報セキュリティシンポジウム予稿集 (SCIS2007), January 2007. 🔎 Related Research Topics # Obfuscation by invokedynamic Instruction folding obfuscation method 🤝 Collaborators # A. Monden@Software mesurement and analytics laboratory, Okayama University M. Nakamura@Kobe University K. Matsumoto@NAIST SE Lab. ","date":"2008-02-12","externalUrl":null,"permalink":"/research/obfuscation_by_dnr/","section":"💡 Researches","summary":"🗣 Overview # Name obfuscation is a software protection technique, which renames identifiers in a given program, to protect the program from illegal cracking. The conventional methods replace names appearing in the declaration part with the meaningless ones. Therefore, the methods cannot be used to obfuscate names declared in system libraries, since changing such system-defined names significantly deteriorates the program portability.\n","title":"Obfuscation by dynamic name resolution","type":"research"},{"content":" 🗣 Overview # This paper presents a technique of dynamic software birthmarks to support efficient detection of software theft. A dynamic birthmark $f(p, I)$ is a set of unique and native characteristics of a program $p$, obtained by executing $p$ with a given input $I$. For a pair of software $p$ and $q$, if $f(p, I) = f(q, I)$ holds, $q$ is suspected as a copy of $p$. In this paper, we propose two kinds of dynamic birthmarks, EXESEQ and EXEFREQ which use execution order and frequency distribution of runtime API Calls. In the first experiment, we applied the proposed birthmarks to the same-purpose applications. As a result, it was shown that an application and its extended version have quite similar birthmarks, and that the applications that are independently implemented possess significantly different birthmarks. The second experiment showed that the proposed birthmarks achieve the strong resilience against the usage of different compilers and optimizations.\n(Abstract from IEICE Transaction 2006)\n📚 Publications # 岡本 圭司, 玉田 春昭, 中村 匡秀, 門田 暁人, 松本 健一, “API呼び出しを用いた動的バースマーク”, 電子情報通信学会論文誌, Vol.J89-D, No.8, pp.1751-1763, August 2006. 岡本 圭司, 玉田 春昭, 中村 匡秀, 門田 暁人, 松本 健一, “ソフトウェア実行時のAPI呼び出し履歴に基づく動的バースマークの実験的評価”, 第46回プログラミング・シンポジウム報告集, pp. 41-50, January 2005. 岡本 圭司, 玉田 春昭, 中村 匡秀, 門田 暁人, 松本 健一, “ソフトウェア実行時のAPI呼び出し履歴に基づく動的バースマークの提案”, ソフトウェア工学の基礎XI, 日本ソフトウェア科学会 FOSE2004 (FOSE2004), pp.85-88, November 2004. Haruaki Tamada, Keiji Okamoto, Masahide Nakamura, Akito Monden, and Ken-ichi Matsumoto, “Dynamic Software Birthmarks to Detect the Theft of Windows Applications,” In Proc. International Symposium on Future Software Technology 2004 (ISFST 2004), CD-ROM, 20-22 October 2004. (Xi’an, China) 🔎 Related Research Topics # Concept of Software Birthmarks 🤝 Collaborators # A. Monden@Software mesurement and analytics laboratory, Okayama University M. Nakamura@Kobe University K. Matsumoto@NAIST SE Lab. ","date":"2006-08-01","externalUrl":null,"permalink":"/research/dynamic_birthmarks/","section":"💡 Researches","summary":"🗣 Overview # This paper presents a technique of dynamic software birthmarks to support efficient detection of software theft. A dynamic birthmark $f(p, I)$ is a set of unique and native characteristics of a program $p$, obtained by executing $p$ with a given input $I$. For a pair of software $p$ and $q$, if $f(p, I) = f(q, I)$ holds, $q$ is suspected as a copy of $p$. In this paper, we propose two kinds of dynamic birthmarks, EXESEQ and EXEFREQ which use execution order and frequency distribution of runtime API Calls. In the first experiment, we applied the proposed birthmarks to the same-purpose applications. As a result, it was shown that an application and its extended version have quite similar birthmarks, and that the applications that are independently implemented possess significantly different birthmarks. The second experiment showed that the proposed birthmarks achieve the strong resilience against the usage of different compilers and optimizations.\n","title":"Dynamic birthmarks","type":"research"},{"content":" 🗣 Overview # To detect the theft of Java class files efficiently, we propose a concept of Java birthmarks, which are unique and native characteristics of every class file. For a pair of class files $p$ and $q$, if $q$ has the same birthmark as $p$\u0026rsquo;s, $q$ is suspected as a copy of $p$. Ideally, the birthmarks should satisfy the following properties: (a) preservation \u0026ndash; the birthmarks should be preserved even if the original class file is tampered with, and (b) distinction \u0026ndash; independent class files must be distinguished by completely different birthmarks. Taking (a) and (b) into account, we propose four types of birthmarks for Java class files.\nTo show the effectiveness of the proposed birthmarks, we conduct three experiments. In the first experiment, we demonstrate that the proposed birthmarks are sufficiently robust against automatic program transformation (93.3876% of the birthmarks were preserved). The second experiment shows that the proposed birthmarks successfully distinguish non-copied files in a practical Java application (97.8005% of given class files were distinguished). In the third experiment, we exploit different Java compilers to confirm that the proposed Java birthmarks are core characteristics independent of compiler-specific issues.\n(Abstract from IEICE 2005)\n📚 Publications # Haruaki Tamada, Masahide Nakamura, Akito Monden, and Ken-ichi Matsumoto, “Java Birthmarks –Detecting the Software Theft–,” IEICE Transactions on Information and Systems, Vol. E88-D, No. 9, pp. 2148–2158, September 2005. Link search.ieice.org Haruaki Tamada, Masahide Nakamura, Akito Monden, and Kenichi Matsumoto, “Design and Evaluation of Birthmarks for Detecting Theft of Java Programs,” In Proc. IASTED International Conference on Software Engineering (IASTED SE 2004), pp. 569-575, 17-19 February 2004. (Innsbruck, Austria) Haruaki Tamada, Masahide Nakamura, Akito Monden, and Kenichi Matsumoto, “Detecting the Theft of Programs Using Birthmarks,” Information Science Technical Report, number NAIST-IS-TR2003014, Graduate School of Information Science, November 2003. Link isw3.naist.jp 玉田 春昭, 神崎 雄一郎, 中村 匡秀, 門田 暁人, 松本 健一, “Java クラスファイルからプログラム指紋を抽出する方法の提案”, 信学技報 情報セキュリティ研究会, Vol. ISEC2003-29, pp.127-133, July 2003. 🔎 Related Research Topics # Dynamic Birthmarks 🤝 Collaborators # A. Monden@Software mesurement and analytics laboratory, Okayama University M. Nakamura@Kobe University K. Matsumoto@NAIST SE Lab. ","date":"2005-09-01","externalUrl":null,"permalink":"/research/birthmark_concept/","section":"💡 Researches","summary":"🗣 Overview # To detect the theft of Java class files efficiently, we propose a concept of Java birthmarks, which are unique and native characteristics of every class file. For a pair of class files $p$ and $q$, if $q$ has the same birthmark as $p$’s, $q$ is suspected as a copy of $p$. Ideally, the birthmarks should satisfy the following properties: (a) preservation – the birthmarks should be preserved even if the original class file is tampered with, and (b) distinction – independent class files must be distinguished by completely different birthmarks. Taking (a) and (b) into account, we propose four types of birthmarks for Java class files.\n","title":"Concept of Birthmarks","type":"research"},{"content":"","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"}]