Secret Staircase

Twitter: @akr
GitHub: akr4

ChatGPTプラグイン開発の実践:さけのわの事例紹介

ChatGPTプラグイン開発の実践:さけのわの事例紹介 さけのわChatGPTプラグインを公開しました。さけのわのデータを使って日本酒の銘柄について詳細情報を教えてもらったり、おすすめを相談できるプラグインです。 この記事ではChatGPTプラグイン開発において困ったところ、勘所などを開発者...

Tauri製アプリでネイティブ感を出す8つのTips

先日Tauriで作ったJomaiをリリースしました。Markdownに特化したデスクトップサーチアプリです。 Tauri製のアプリはもちろんネイティブアプリなのですが、UI部分がWebViewで動作するため使用感がWebアプリっぽくなりがちです。Jomaiではなるべくネイティブアプリらしく振る舞える...

モノレポで変更のあったプロジェクトにだけ git のフックを適用する

モノレポでを変更のあったプロジェクトだけに git のフックを適用するツールを作りました。 https://github.com/akr4/git-hooks-dispatch モノレポで git のフックを使うのはなかなかやっかいです。フックは git リポジトリ単位で設定するため、フックに複...

CloudFrontとLambdaを使ったサーバーレス画像最適化

CloudFrontとLambdaを使ったサーバーレス画像最適化 とあるシステムで、CloudFrontとLambdaを使ってサーバーレスで画像最適化処理を実現しました。ここで言う画像最適化処理とは、主に元画像をリサイズして最適なフォーマットに変換する処理です。 Webで同じ画像をサイズを変えて...

og:image用画像を生成するGatsbyプラグインを作った

og:image用画像を生成するGatsbyプラグインを作りました。Qiitaの記事がTwitterでシェアされるときに使われる画像みたいなのを簡単に作れます。こういうのですね。 https://github.com/akr4/gatsby-plugin-og-image 実はこのブログは最...

静的サイトをs3にデプロイするツールを作った

静的サイトを s3 にデプロイするツールを作りました。aws s3 sync は便利なのですがContent-TypeやCache-Controlなどのメタデータをファイル個別に設定できない(よね?)ので似たようなものを作りました。直接 S3 から或いは CloudFront から配信するときにこれ...

Lambda@Edgeプロジェクトのテンプレートを作った

Lambda@Edge プロジェクト用のテンプレートを作りました。 https://github.com/akr4/lambda-edge-template 構成はこういったところです。 TypeScript webpack Jest Lambda@Edge は環境変数が使えないので少し...

SPA+ダイナミックレンダリングのサイトをCloudFrontで配信して高速化する

SPA の高速化のために CDN で配信する とある SPA を高速化のために CDN(CloudFront)で配信するようにしました。この作業を通じて様々なノウハウを得たので書き残しておきたいと思います。 CDN での配信の目的は次の 3 つです。 高速化によるユーザー体験の改善 ユーザー体...

iOS13とNFCタグでぬか床カレンダーを作る

iOS13.1 のショートカットアプリは NFC タグをトリガーにしてアクションを実行することができるようになりました。SUICA みたいに iPhone でタッチするだけで簡単にアクションを実行できます。 バックグラウンドで NFC タグを読みとる機能がある機種のみこの機能が使えるようです。 ...

CodePipelineの開始と終了時にSlackに通知する

CodePipeline の開始と終了時に Slack に通知する機能を Rust と Terraform で作りました。この手の話はググるとたくさん出てきますが、Rust で Lambda 関数を試してみたかったので作ってみました。 GitHub のリポジトリはこちらです。 akr4/codep...

create-react-app利用時にservice workerをカスタマイズする

\--2021年10月21日追記-- 本記事は create-react-app v3 での方法を述べています。v4 から仕組みが変わり service-worker.js は生成されるものではなくデフォルトの実装が提供され自分で管理するようになりました。本記事で述べるようなパッチの必要はありませ...

React で loading="lazy" な <img> のロードに時間がかかる場合だけアニメーション効果をつける

loading="lazy" な \<img> でロードに時間がかかるときだけアニメーション効果をつける方法を検討しました。 \<img> をロードするときにフェードインなどのアニメーション効果をつける場合に、キャッシュにあるなどの理由で時間がかからない場合はアニメーション効果をつけないようにする...

HomeKit+Hue motion sensorでしばらくの間動きがなかったらライトを消す

自分の環境の問題なのかもしれないけれど、HomeKit と Hue motion sensor の組み合わせは確実には動作しないので Hue アプリを使う が正解。 それでも動きの検知をトリガーとして Hue 管理外のデバイスを動作させたい場合には HomeKit でなんとかする必要があります。 ...

SwitchBot操作の信頼性を向上させる

\[こちらの記事]\({{< ref "turn-on-light-by-switchbot.md" >}})で SwitchBot を使って玄関ライトをオンオフしました。 でもときどきうまく動いてくれないんですよね。帰ってきて真っ暗だと暗いのもあるけどなんで動かないんだって気持ちが落ち込みます。...

人を感知して玄関のライトを自動的に点ける (Hue Motion Sensor+SwitchBot)

人が来たら玄関(外側)のライトを自動的に点灯させるようにしました。SwitchBot を使ってスイッチを押します。SwitchBot は HomeKit に対応していないので Homebridge を使って対応させました。 構成 こういう構成です。 Hue Motion Sensor: 人感セ...

Raspberry Piセットアップ

Raspberry Pi セットアップ スマートホーム用途で Raspberry Pi をセットアップしました。 初 Raspberry Pi であまり勝手がわからないので全部入りのこちらを購入しました。 Raspberry Pi3 B +コンプリートスターターキット(Basic 16G) \...

スーヴィードでつくる湯豆腐 - 実践編

最近やたらと湯豆腐食べています。 \[スーヴィードでつくる湯豆腐 - 実験編]\({% post\_url 2017-01-30-sous-vide-tofu %}) で湯豆腐に最適な温度と時間を検証し、65 ℃ 30 分が良さそうなことがわかりました。 実験のときは 1 切れずつ調理していたの...

スーヴィードでつくる湯豆腐 - 実験編

\[スーヴィードでつくる湯豆腐]\({% post\_url 2017-01-24-sous-vide-tofu %}) では 70 ℃ 30 分で調理して美味しい湯豆腐ができました。 ためしてガッテンによれば 50 ℃ で甘味が、70 ℃ で食感がそれぞれ最高になるとのこと (http://ww...

スーヴィードでつくる湯豆腐

湯豆腐は基本豆腐を火にかけるだけのとてもシンプルなものですが案外火加減が難しいんですよね。 しっかり熱の入った豆腐はとてもやわらかくてスムースで美味しい、でも温度が高くなりすぎると豆腐が固くざらざらしてしまい食感が損われます。ためしてガッテンによれば表面が 70 ℃、中が 50 ℃ がベストとのこ...

スーヴィードでつくるおつまみチャーシューの最適解を探る

年末に Anova を買いましてスーヴィードにハマっています。 先日スーヴィードでおつまみ用のチャーシューを作ってみました。 チャーシューには一般的に肩ロースを使うことが多いようですが以前に作ったときは脂身が多くて食べにくかったんですよね。そこでおつまみとしてそのまま食べてもあっさりと美味しいチャ...

ニトリの和紙テーブルランプ + Hue ライト

Hue 用のテーブルランプを探していてなかなかいいのが見つからなかったのですが、ニトリに安くてよさそうなのがあったので購入してみました。 和紙テーブルランプ https://www.nitori-net.jp/store/ja/ec/8320466s 952 円。骨格のワイヤーと和紙のシンプルな...

Philips Hue Tap スイッチ

Hue はスマートフォンアプリでコントロールできるのだけれど、さっとオンオフしたいときはやっぱりスイッチがあった方がいいです。Hue には Tap スイッチと Dimmer スイッチの 2 種類の製品があり、うちでは日本で販売しているこちらの Tap スイッチを使っています。 Philips Hu...

MacBook Pro のカバーに風呂敷を使う

MacBook Pro を鞄に入れて持ち歩く時用のカバーとして風呂敷を使っているのですが、最近お客さんとミーティングしたときにそのことを褒められてうれしかったのでブログに書いてみます。 MacBook Pro を鞄に入れるときむき出しだと心もとないような気がするし、かといって市販のカバーだと大仰な...

Philips Hue のセットアップ

今の部屋 (賃貸) は照明が天井直付けだったのですが管理会社さんと交渉して自費で引っ掛けシーリングに変更することができました。これでずっと欲しかった Philips Hue を導入できました! Hue にはこちらのスポットライトを合わせています。 NEC 配線ダクト用スポットライト E26 口金...

Gradle を使ってサーバ起動時にバージョン番号を出力する

Git の最新のタグをバージョンとしてサーバ起動時に出力する、ということを Gradle を使って実現しました。gradle-release-plugin あたりがこのへんも面倒見てくれるかなと思ったのだけれど、たいした手間でもないので自前で。 Gradle でビルド時に最新のタグ名を app-v...

iPhone の実機でテスト環境に接続する

API サーバと通信するタイプの iPhone アプリ開発において、実機を使う必要があったので環境を構築しました。iPhone 実機上のアプリと Vagrant のゲスト OS 上で動作している API サーバを通信させます。 実現したいこと Vagrant のゲスト OS で動いている API...

AppCode Night に行ってきました

2013/12/17 に開催された AppCode Night に参加してきました。僕からは「AppCode の基本」と題して発表しました。 AppCode の基本 実際に AppCode を使って、UIViewController とビューを作って表示する作業を通して、補完やナビゲーション...

「さけのわ」でできたある日本酒との出会い

私が運営している「さけのわ」という日本酒体験共有サービスを使ってできたある日本酒との出会いについて書きます。 この記事は日本酒 Advent Calendar 2013の 11 日目の記事です。 「さけのわ」とは 飲んだ日本酒を記録してみんなと共有して楽しむためのサービスです。iPhone 版...

シングルタブスタイル IntelliJ

IntelliJ 使ってるとタブがどんどん増えていって (上限があるけど)、どのファイルがどのタブで表示されているか把握できなくなって探すのに少し時間がかかってしまうことがよくある。 結局のところ、タブから探すのではなく IntelliJ の強力な Navigate 機能で探した方が速いと思う。だ...

iTerm2 でファイル名をドラッグ & ドロップして他のアプリケーションに渡す

こんな機能があるんですね、全然知らなかった! ls の結果のファイル名上で command (⌘) を押しながらドラッグを開始して command (⌘) を離して Finder にドロップすると ファイルがコピーされます。 command (⌘) を離すのがポイントです。 ちなみ...

iTS で開発者名のファーストネームが漢字になってたのを直してもらった

先日、iPhone アプリ Sakenowa をリリースしました。 無事 iTS に登場しましたが開発者名がなぜか "明良, Ueda" に... もちろんこんな登録はしていないのでファーストネームとラストネームを別々のところからひっぱってきているのかな。そういえば Apple Store ...

日本酒体験共有アプリ Sakenowa をリリースしました

日本酒体験共有 iPhone アプリ Sakenowa (http://www.sakenowa.com) をリリースしました。 飲んだ日本酒を記録して後から見返したり、他の人が飲んだお酒にコメントしたりできるアプリです。 日本酒には銘柄が多くあり、また同じ銘柄でも純米、吟醸、山廃、ひやおろし、...

Jekyll + S3 に引越しました

ブログを S3 に引越しました。いままでは Heroku で動かしていました (\[Jekyll と nginx 用の Heroku buildpack]\({% post\_url 2013-05-27-jekyll-on-heroku %}))。 jekyll-s3 で超簡単でした。

Vagrant + Chef で Java Web アプリケーション開発環境を作る

とあるプロジェクトのために Vagrant + Chef で Java Web アプリケーションの開発環境を作った。 実現すること git clone -> vagrant up -> gradle war により、ゲスト OS でアプリケーションが動く状態にします。 vagrant up 時...

Gradle で JsTestDriver を使う

Gradle のタスクで JsTestDriver を実行する。 eriwen/gradle-js-plugin の issue を参考にして、ここでは JsTestDriver.jar を maven central repository からダウンロードして使うように変更してみた。 buil...

Gradle で JSHint を使う

Gradle のソースコードに JSHint プラグインが含まれているのだけれど、公式ドキュメントには出ていない。フォーラムのコメントによれば eriwen/gradle-js-plugin を使うのがおすすめだそうだ。 こんな build.gradle を用意する。 gradle jshi...

Gradle を使って Scala REPL を開く

Gradle を使って依存ライブラリをクラスパスに設定した Scala REPL を開く。Gradle タスクで開くことはできる (後述) のだけれど補完が効かないので普通に scala コマンドを使って開く。 scala コマンドで開く (おすすめ) クラスパスを出力をするタスクを定義して、 ...

Maven から Gradle への移行

既存の Maven プロジェクトを Gradle に移行してみる。 対象のプロジェクトは shibainu。SpringMVC と spring-data、QueryDSL を使った Web アプリケーションのテンプレートプロジェクト。このような pom.xml を使っている。 Maven でや...

Gradle で Scala プロジェクトをビルドする

ふと思いたって Gradle で Scala プロジェクトをビルドしてみた。 こんな build.gradle を使う。 sbt が恋しくなる点 %% 記法がないので artifact ID に Scala のバージョン番号を含める必要がある (上の例の unfiltered-netty-...

Jekyll と nginx 用の Heroku buildpack

Heroku で Jekyll を使ってサイトを生成して nginx で動かすための buildpack を作りました。 https://github.com/akr4/heroku-buildpack-jekyll-nginx 作ったといっても nbudin/heroku-buildpack-...

ブログを Jekyll に移行

ブログを Jekyll に移行しました。 決め手は Markdown ファイルをローカルマシンで管理できること。 ひとまずは Heroku にデプロイしてある。レンタルサーバでも借りようかな。

Java テンプレートエンジンの比較

これまでにいくつかの Java 用のテンプレートエンジンを見てきました。今回はそれらを比較します。 対象 JSP (非 JSF) Velocity FreeMarker Handlebars.java Scalate (SSP) 評価軸 評価軸として優先度の高いものから順に以下を考え...

某勉強会向け Scala スクリプト制作メモ

scala スクリプトでライブラリの依存性を解決して XML API を呼び出すということをやったのでメモ。 某勉強会の日程調整のために調整さん用の候補日を出力するスクリプトを作った。こんなのを出力する。 scalas スクリプトでライブラリの依存性を解決するために scalas を使う。...

Tumblr の markdown を再編集するとリンクが消える

Tumblr の markdown 記法でリンクを と書くと再編集したときに消えてしまって困ってたけど にしたら大丈夫だった。

Handlebars.java を使う

Handlebars.java は Handlebars の Java 実装です。 ここでは Template Inheritance 機能とデフォルト HTML エスケープの動きを中心に見てゆきます。 セットアップ方法 Handlebars.java のページが詳しいです。Spring MVC...

Scalate を Java から使う

Scalate は Scala で書かれたテンプレートエンジン。Java から利用することも可能です。 Spring MVC から利用する Spring MVC 用の ViewResolver が提供されています。依存ライブラリを pom.xml に書きます。 次に ViewResolve...

FreeMarker でデフォルト HTML エスケープ

デフォルト HTML エスケープシリーズ。今回は FreeMarker。 デフォルトエスケープの設定 FreeMarker では <#escape> タグで囲った部分を自動でエスケープすることができます。こんな風にファイルの最初と最後にセットしてやればそのファイルではデフォルトでエスケープされま...

Velocity でデフォルト HTML エスケープ

前回 は JSP でのデフォルト HTML エスケープを検証しました。今回は Velocity を見てみます。 デフォルトエスケープの設定 Velocity では ReferenceInsertionEventHandler を使ってデフォルトでの HTML エスケープを実現できます。このクラス...

JSP でデフォルト HTML エスケープ

JSP で HTML エスケープするには \<c:out> や \<fn:escapeXml> を使うわけですが、いちいち書くの面倒だし付け忘れるもありがちです。付け忘れがないことを確認するにはコードを全部見たり、静的解析ツールを使ったり、サイトに対して XSS 検出ツールを使ったり、とても大変です...

grep で前後の行も表示する

grep -B <前の行数> とか -A <後ろの行数> とか -C <前後の行数> とか。 知らなかった!

Flyway Java で書かれたシンプルな DB マイグレーションフレームワーク

Flyway は Java で書かれたシンプルな DB マイグレーションフレームワーク。 クラスパスに /db/migration/V1\_\_\_Create\_book\_table.sql などと V\_\_.sql なファイルを置いておけば様々な方法で実行できる。maven プロジェクトだ...

MakeLeaps User Meetup に参加してきました

2013/4/18 に開催された 史上初 ☆MakeLeaps User Meetup に参加してきました。MakeLeaps を作っている方々、使っている方々と楽しく刺激的な時間を過せました。 去年はじめてフリーランスとして仕事をして請求書の書き方で悩んでいるときに MakeLeaps に出会い...

logback の設定ファイルを環境ごとに動的に変更する

\[logback の設定ファイル内で条件分岐]\({% post\_url 2013-04-15-logback-conditional-configuration %}) では設定ファイル内で環境ごとに分岐したけれど、差異が大きい場合はファイルをごっそり分けた方がよいでしょう。logback で...

logback の設定ファイル内で条件分岐

環境に応じて設定をちょこっと変えたいなら logback.groovy で条件分岐してしまうのがお手軽。 システムプロパティに log.highlight=true があったときだけ \[logback の出力を色付けする]\({% post\_url 2013-04-14-logback-hig...

logback の出力を色付けする

logback は ANSI エスケープシーケンスを使った色付き出力をサポートしています。 http://logback.qos.ch/manual/layouts.html#coloring ファイルに出力するときはジャマだけど、開発中にコンソールを色付けするのは楽しいんじゃないだろうか。 l...

Jetty の起動速度を改善する

Jetty の起動が遅い! Jetty は起動の速さが売りのひとつですが、構成によっては起動時に次のメッセージをログ出力してしばらく固まります。数秒から十数秒、ググったら 45 秒なんて例もありました。 このとき Jetty は Servlet 3.0 のアノテーションのついたクラスを探した...

バーンダウンチャートを git 上のテキストファイルから作成する

git 管理のシンプルなテキストファイルからバーンダウンチャートを作る CUI ツールを書きました。 https://github.com/akr4/burndown 超シンプルなテキストファイルにタスクを記録して git にコミットしておくだけなので、エンジニアには楽なんじゃないかな (だったら...

apiary.io を使ってみた

簡単な DSL で REST API のドキュメントを書ける。手軽にキレイなドキュメントが作れて便利でした。 こんな ↓ DSL で作ったドキュメントがこちら。 http://docs.test159.apiary.io/ プレビュー見ながら書けるのでわかりやすい。公開したくない場合はプライ...

IntelliJ IDEA が起動途中でハングする場合の解決方法

ここのところ、スプラッシュスクリーンの途中で止まってしまって起動しないことが増えてきました。強制終了してやり直したらだいたいうまくいくんだけど、ついに全く起動しなくなってしまった。 Web で調べてみると、キャッシュを消すと良いとのこと。 これで起動するようになりました。 起動時以外にもリフ...

backbone-cellar-play2

Backbone.js ワインセラーチュートリアル を Play2 プロジェクトにしてみました。 https://github.com/akr4/backbone-cellar-play2 Play2.1 RC1 + Slick です。

OSX ターミナルから IntelliJ IDEA を開く

alias ij="open -b com.jetbrains.intellij" ってしておいて ij で開く。 プロジェクト開きたいときは ij で OK。 複数プロジェクト開いてるときはアクティブなとこで開くようです。これは仕方ないか。 ※ いろんなバージョンの IntelliJ インス...

Play2 でのアセット最適化方法を考える

Play2 で CSS、JavaScript、画像などアセットに対して以下の最適化を実現する方法を考えます。 URL にバージョンを付与する 長いキャッシュ期間を設定する CSS や JavaScript ファイルを結合する CSS や JavaScript を minify する URL...

jetty-maven-plugin が css や JavaScript をロックする場合の対策

Windows 限定ですが jetty で SelectChannelConnector を使うと css や JavaScript がロックされてしまって更新できなくなる問題、 useFileMappedBuffer 設定で回避するのが一般的だと思います。ただこの方法は jetty-webapp....

App.net ユーザーリコメンドサービス Osusume! ADN を公開しました

App.net ユーザーをリコメンドする Osusume! ADN を公開しました。フォローしているユーザー情報を元にして協調フィルタリングにより App.net ユーザーをおすすめします。Twitter の who to follow みたいな感じですね。 自分で使った感じだと、いままでのように...

iCloud ブックマーク増殖の解決策

iCloud でブックマークを同期したら大量に複製されたときの対応方法 Windows の Safari でブックマークを削除すればよいです。 Windows Mac 版ともに Safari はブックマークを複数選択できませんが、Mac 版でブックマークの削除が大変遅い (ブックマークが 25,...

レーベンシュタイン距離を計算する

スタンフォードのフリーオンライン講義の Natural Language Processing をはじめました。 第 1 週の講義で出てきたレーベンシュタイン距離が興味深かったので距離を計算するプログラムを書いてみました。(※ 課題じゃないですよ) レーベンシュタイン距離は 2 つの文字列が異な...

zip ファイルの diff を取る

zip ファイルの diff を取るプログラムを Scala で書きました。github にあります。 使用例: Ant -> Maven や Maven1 -> Maven2/3 移行時に同じ war が作成されることの確認に使うと便利かも。 まとめ 実行可能なスタンドアローン jar...

Unfiltered と Scalate を Servlet で使う

Unfiltered と Scalate を組み合わせる方法として unfiltered-scalate があります。簡単に使えて便利ですがサーブレット環境に依存しないように作られているために ServletRenderContext を使うのがなかなか難しいんですよね。 ※ ServletRen...

ワンクリック勉強会@横浜

3/5 に横浜で開催されたワンクリック勉強会に参加してきました。 品川のときの資料だけどだいたい同じみたい。資料 仮想化技術やクラウドを有効活用 Jenkins 大活躍ですね Chef や Capistrano で環境構築も自動化 などなど印象的でした。あと拍手がすごかったなあ。 完全自...

南禅寺の水路閣

この前行ってきた南禅寺の水路閣。ここ好きなんだよね。

Scala 用 StopWatch ライブラリ作りました

Scala 用の StopWatch ライブラリを作りました。 https://github.com/akr4/stopwatch 処理にかかった時間を記録する、とてもシンプルなライブラリです。 StopWatch パフォーマンスを測定するためのライブラリ はじめに built.sbt ...

Sphinx on MBP チュートリアル

ちょいと需要があったので、Sphinx を使ったことのない人が MacBookPro に Sphinx 環境を構築してとりあえずドキュメントをビルドできるまでのチュートリアルを書きました。 Sphinx 公式にチュートリアルがあるけどこちらは自分が知りたかったことだけにフォーカスしてみました。 ち...

Sphinx と Twitter Bootstrap を組み合わせる

ちょっとしたドキュメントを Sphinx で書くのがよさそうだと思ったけどデフォルトのテーマがあまりかっこよくないんですよね。そこで今風な Twitter Bootstrap を組み合わせる方法を検索したら、ありました。 https://github.com/ryan-roemer/sphinx-...

xsbt-start-script-plugin の簡単な使い方

xsbt-start-script-plugin は main クラスの起動スクリプトを作ってくれる sbt プラグインです。 sbt run を使っても実行することができますが、main クラスが複数あるときにキー入力が必要なのが困るんですよね。 まず設定です。(sbt 0.11.2 で試しまし...

ブログ引越しました

はてなから Tumblr に引越しました 旧: http://d.hatena.ne.jp/akr4/ これからよろしくおねがいします