Noriaki Horiuchi Tech Blog
http://noriaki.dev/feed.xml
2024-01-08T14:22:07.167000Z
Werkzeug
Install AWS CLI via asdf
http://noriaki.dev/post/install-aws-cli-via-asdf
2023-05-15T17:03:22.620000Z
2023-05-15T17:00:50Z
Noriaki Horiuchi
<div><br/></div><pre><div>asdf plugin add awscli</div></pre><div><br/></div><pre><div>asdf install awscli latest</div>
<div>asdf-awscli 2.11.20 installation was successful!</div></pre><div><br/></div><pre><div>asdf global awscli latest</div></pre><div><br/></div><pre><div>aws --version</div>
<div>aws-cli/2.11.20 Python/3.11.3 Darwin/22.4.0 exe/x86_64 prompt/off</div></pre><div><br/></div>
Install sbt via asdf
http://noriaki.dev/post/install-sbt-via-asdf
2023-05-15T17:00:51.420000Z
2023-05-15T16:59:39Z
Noriaki Horiuchi
<div><br/></div><pre><div>asdf plugin add sbt</div></pre><div><br/></div><pre><div>asdf install sbt latest</div></pre><div><br/></div><pre><div>asdf global sbt latest</div></pre><div><br/></div>
Install Scala 2.13.10 via asdf
http://noriaki.dev/post/install-scala-2-13-10-via-asdf
2023-05-15T16:57:18.892000Z
2023-05-15T16:56:02Z
Noriaki Horiuchi
<div><br/></div><pre><div>asdf plugin add scala</div></pre><div><br/></div><pre><div>asdf install scala 2.13.10</div></pre><div><br/></div><pre><div>asdf global scala 2.13.10</div></pre><div><br/></div>
Install JDK 17 via asdf
http://noriaki.dev/post/install-jdk-17-via-asdf
2023-05-15T16:57:46.914000Z
2023-05-15T16:51:35Z
Noriaki Horiuchi
<div><br/></div><pre><div>asdf plugin add java</div></pre><div><br/></div><pre><div>asdf install java temurin-17.0.4+101</div></pre><div><br/></div><pre><div>asdf global java temurin-17.0.4+101</div></pre><div><br/></div>
<div>restart terminal and check the version</div><pre><div>java -version</div></pre><div><br/></div>
Install Helmfile via asdf
http://noriaki.dev/post/install-helmfile
2023-05-15T16:52:03.626000Z
2023-05-15T16:47:17Z
Noriaki Horiuchi
<div><a href="https://github.com/helmfile/helmfile" rev="en_rl_none">helmfile/helmfile: Declaratively deploy your Kubernetes manifests, Kustomize configs, and Charts as Helm releases. Generate all-in-one manifests for use with ArgoCD.</a></div>
<div><br/></div><pre><div>asdf plugin add helmfile</div></pre><div><br/></div><pre><div>asdf install helmfile latest</div></pre><div><br/></div><pre><div>asdf global helmfile latest</div></pre><div><br/></div>
<div>Installed successfully.</div>
<div><br/></div>
Install stern via asdf
http://noriaki.dev/post/install-stern
2023-05-15T16:51:57.134000Z
2023-05-15T16:41:39Z
Noriaki Horiuchi
<div><a href="https://github.com/stern/stern" rev="en_rl_none">stern/stern: ⎈ Multi pod and container log tailing for Kubernetes -- Friendly fork of https://github.com/wercker/stern</a></div>
<div><br/></div><hr/><div><br/></div><pre><div>asdf plugin-add stern</div></pre><div><br/></div><pre><div>asdf install stern latest</div></pre><div><br/></div><pre><div>asdf global stern latest</div></pre><div><br/></div>
Install Helm via asdf
http://noriaki.dev/post/install-helm
2023-05-15T16:52:00.326000Z
2023-05-15T16:34:09Z
Noriaki Horiuchi
<div><a href="https://helm.sh/" rev="en_rl_none">Helm</a></div>
<div><br/></div><hr/><div><br/></div>
<div>Run commands below.</div><pre><div>asdf plugin add helm</div></pre><div><br/></div><pre><div>asdf install helm 3.12.0</div></pre><div><br/></div><pre><div>asdf global helm 3.12.0</div></pre><div><br/></div><pre><div>which helm</div>
<div>/Users/noriaki/.asdf/shims/helm</div></pre><div><br/></div>
<div>Helm was installed successfully.</div>
<div><br/></div><hr/><div><br/></div>
<div><a href="https://github.com/databus23/helm-diff" rev="en_rl_none">databus23/helm-diff: A helm plugin that shows a diff explaining what a helm upgrade would change</a></div>
<div><br/></div><hr/><div><br/></div>
<div>Run this command.</div><pre><div>helm plugin install https://github.com/databus23/helm-diff</div></pre><div><br/></div>
<div>Helm Diff Plugin was installed successfully.</div>
Install kubectl via asdf
http://noriaki.dev/post/install-kubectl-via-asdf
2023-05-15T16:58:17.745000Z
2023-05-15T15:54:24Z
Noriaki Horiuchi
<div>Install asdf kubectl plugin</div>
<div><a href="https://github.com/asdf-community/asdf-kubectl" rev="en_rl_none">https://github.com/asdf-community/asdf-kubectl</a></div>
<div><br/></div><pre><div>asdf plugin-add kubectl https://github.com/asdf-community/asdf-kubectl.git</div></pre><div><br/></div><pre><div>asdf install kubectl 1.21.13</div></pre><div><br/></div><pre><div>asdf global kubectl 1.21.13</div></pre><div><br/></div>
Install asdf
http://noriaki.dev/post/install-asdf
2023-05-15T16:58:30.634000Z
2023-05-15T15:22:00Z
Noriaki Horiuchi
<div><a href="https://asdf-vm.com/" rev="en_rl_none">Home | asdf</a></div>
<div><br/></div><hr/><div><br/></div><pre><div>brew install asdf</div></pre><div><br/></div><pre><div>which asdf</div>
<div>/opt/homebrew/bin/asdf</div></pre><div><br/></div><pre><div>echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc</div></pre><div><br/></div>
<div>installed successfully.</div>
<div><br/></div>
Install Variant CLI build tool
http://noriaki.dev/post/install-variant-cli-build-tool
2023-05-15T13:21:05.476000Z
2023-05-12T06:51:23Z
Noriaki Horiuchi
<div><a href="https://github.com/mumoshu/variant" rev="en_rl_none">mumoshu/variant: Wrap up your bash scripts into a modern CLI today. Graduate to a full-blown golang app tomorrow.</a></div>
<div><br/></div><hr/><div><br/></div>
<div>Run this script in terminal.</div><pre><div>curl -sL https://raw.githubusercontent.com/variantdev/get/master/get | INSTALL_TO=/usr/local/bin sh</div></pre><div><br/></div>
<div>Unfortunately I got a "Permission denied" error.</div><pre><div>Installing variant to /usr/local/bin...</div>
<div>mv: rename /var/folders/f7/n_x35v9j219df_25bv9q6fbm0000gn/T/variant to /usr/local/bin/variant: Permission denied</div>
<div>noriaki@Noriakis-Mac-Studio ~ %</div></pre><div><br/></div>
<div>It's because I use macOS.</div>
<div><br/></div>
<div>Prepare other directory to install Variant. Use <code>/Users/noriaki/Documents/bin</code> instead of <code>/usr/local/bin</code>.</div>
<div><br/></div><pre><div>curl -sL https://raw.githubusercontent.com/variantdev/get/master/get | INSTALL_TO=/Users/noriaki/Ducuments/bin sh</div></pre><div><br/></div>
<div>Unfortunately I got a "No such file or directory" error.</div><pre><div>Installing variant to /Users/noriaki/Ducuments/bin...</div>
<div>mv: rename /var/folders/f7/n_x35v9j219df_25bv9q6fbm0000gn/T/variant to /Users/noriaki/Ducuments/bin: No such file or directory</div></pre><div><br/></div>
<div>Use <code>sudo</code> command.</div><pre><div>sudo curl -sL https://raw.githubusercontent.com/variantdev/get/master/get | INSTALL_TO=/usr/local/bin sh</div></pre><div><br/></div>
<div>Unfortunately I got a "Permission denied" error again.</div><pre><div>Installing variant to /usr/local/bin...</div>
<div>mv: rename /var/folders/f7/n_x35v9j219df_25bv9q6fbm0000gn/T/variant to /usr/local/bin/variant: Permission denied</div></pre><div><br/></div><hr/><div><br/></div>
<div>Restart terminal and try again</div>
<div><br/></div><pre><div>curl -sL https://raw.githubusercontent.com/variantdev/get/master/get | INSTALL_TO=/Users/noriaki/Downloads/bin sh</div>
<div>Installing variant to /Users/noriaki/Downloads/bin...</div>
<div>Done!</div></pre><div><br/></div>
<div>...🤔</div>
<div><br/></div>
<div>Recreate terminal tab and check if it is installed true.</div><pre><div>which variant</div>
<div>variant not found</div></pre><div><br/></div>
<div>...🤔🤔🤔</div>
<div>There is no variant command...</div>
<div><br/></div><hr/><div><br/></div>
<div>I see the content of this url</div>
<div><a href="https://raw.githubusercontent.com/variantdev/get/master/get">https://raw.githubusercontent.com/variantdev/get/master/get</a></div>
<div><br/></div>
<div>the script downloaded something into <code>${TMPDIR}</code>.</div>
<div><br/></div>
<div>Check the content of <code>TMPDIR</code>.</div>
<div><br/></div><pre><div>ls $TMPDIR</div>
<div>...</div>
<div>...</div>
<div>...</div>
<div>variant</div></pre><div><br/></div>
<div>Oh, there is <code>variant</code> 🤔</div>
<div><br/></div>
<div>Try moving it manually.</div><pre><div>mv ${TMPDIR}variant ~/Documents/bin/</div></pre><div><br/></div>
<div>No error.</div>
<div>Restart terminal and check if it is installed again</div>
<div><br/></div><pre><div>which variant</div>
<div>/Users/noriaki/Documents/bin/variant</div></pre><div><br/></div>
<div>OK.</div>
<div>I didn't understand why mv command failed, but Anyway, I installed Variant successfully.</div>
<div><br/></div>
OpenAI公式オススメ!プロンプトエンジニアリングの8つのコツ
http://noriaki.dev/post/openaigong-shi-osusume-puronputoenziniaringuno8tunokotu
2023-05-15T17:03:42.241000Z
2023-04-12T02:34:55Z
Noriaki Horiuchi
<div>元記事:Best practices for prompt engineering with OpenAI API</div>
<div><a href="https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api" rev="en_rl_none">https://help.openai.com/en/articles/6654000-best-practices-for-prompt-engineering-with-openai-api</a></div>
<div><br /></div>
<div><br /></div>
<div>OpenAIは、APIでプロンプトエンジニアリングを行う際に役立つベストプラクティスをまとめています。「APIを使う場合」についての解説ですが、一般のプロンプトエンジニアリングにも参考になります。</div>
<div><br /></div>
<div>早速、OpenAIが公式におすすめする「プロンプトエンジニアリングの8つのコツ」を見てみましょう。</div>
<div><br /></div>
<div><br /></div><h2><b>プロンプトエンジニアリングの8つのコツ</b></h2><div><br /></div><ol><li><div>最新のモデルを使用する</div></li><li><div>プロンプトの先頭に指示を入れ、##や"""で指示と文脈を区切る</div></li><li><div>望ましい文脈、成果、長さ、形式、スタイルなどについて、具体的かつ説明的で、できるだけ詳細に説明する</div></li><li><div>望ましい出力形式を明確にする</div></li><li><div>ゼロショットから始め、次にフューショット、それでもうまくいない場合にはファインチューン</div></li><li><div>"ふわっと"した曖昧な記述を減らす</div></li><li><div>やってはいけないことを言うのではなく、代わりに何をすべきかを伝える</div></li><li><div>(コード生成の場合)モデルを特定のパターンに誘導するための「リーディングワード」を使用する</div></li></ol><div><br /></div>
<div><br /></div>
<div><br /></div><h2><b><span style="color:rgb(58, 60, 76);">1. 最新のモデルを使用する</span></b></h2><div><span style="color:rgb(0, 0, 0);">当然ですが、まずは最新のモデルを使用しているか確認しましょう。</span></div>
<div><br /></div>
<div><span style="color:rgb(0, 0, 0);">ChatGPTであればGPT-4が最新です。</span></div>
<div><br /></div>
<div><span style="color:rgb(0, 0, 0);">APIであれば既に使用許可が出ていればGPT-4、まだであればGPT-3.5です。</span></div>
<div><br /></div>
<div><span style="color:rgb(0, 0, 0);">APIでGPT-4を使用できるよう申請するにはこちら</span></div>
<div><span style="color:rgb(0, 0, 0);"><span style="--en-markholder:true;"><br /></span></span></div>
<div><a href="https://openai.com/waitlist/gpt-4-api" rev="en_rl_none">GPT-4 API waitlist</a></div>
<div>https://openai.com/waitlist/gpt-4-api</div>
<div><span style="color:rgb(0, 0, 0);"><span style="--en-markholder:true;"><br /></span></span></div>
<div><span style="color:rgb(0, 0, 0);">出力の品質についてGPT-3系とGPT-4との間には雲泥の差がありますので、必ず最新のモデルを使用しましょう。</span></div>
<div><span style="color:rgb(0, 0, 0);"><span style="--en-markholder:true;"><br /></span></span></div><h2><b><span style="color:rgb(58, 60, 76);">2. プロンプトの先頭に指示を入れ、##や"""で指示と文脈を区切る</span></b></h2><div><br /></div>
<div><span style="color:rgb(0, 0, 0);">イマイチ❌:</span></div><pre><div>以下の文章を、最も重要な点を箇条書きにして要約してください。</div>
<div><br /></div>
<div>{ここにテキストを入力}</div></pre><div><span style="color:rgb(0, 0, 0);">Good✅:</span></div><pre><div>以下の文章を、最も重要な点を箇条書きにして要約してください。</div>
<div><br /></div>
<div>テキスト: """</div>
<div>{ここにテキストを入力}</div>
<div>"""</div></pre><h2><b><span style="color:rgb(58, 60, 76);">3. 望ましい文脈、成果、長さ、形式、スタイルなどについて、具体的かつ説明的で、できるだけ詳細に</span></b><span style="color:rgb(58, 60, 76);">説明する</span></h2><div><span style="color:rgb(0, 0, 0);">文脈、成果、長さ、形式、スタイルなどについて、具体的に説明してください。</span></div>
<div><span style="color:rgb(0, 0, 0);">イマイチ❌:</span></div><pre><div>OpenAIについて詩を書いてください。</div></pre><div><span style="color:rgb(0, 0, 0);">Good✅:</span></div><pre><div>OpenAIについて、最近のDALL-E(DALL-Eはテキストから画像へのMLモデル)の製品発表に焦点を当て、{有名な詩人}のスタイルでインスピレーションを与える短い詩を書いてください。</div></pre><h2><b><span style="color:rgb(58, 60, 76);">4. 望ましい出力形式を明確にする</span></b></h2><div><span style="color:rgb(0, 0, 0);">イマイチ❌:</span></div><pre><div>以下のテキストに記載されている要素を抽出してください。会社名、人名、特定の話題、テーマの4種類の要素を抽出してください。</div>
<div><br /></div>
<div>テキスト: {テキスト}</div></pre><div><span style="color:rgb(0, 0, 0);">見せる、そして伝える - 特定のフォーマット要件を示すと、モデルはよりよく反応します。また、プログラムによって複数の出力を確実に解析することが容易になります。</span></div>
<div><span style="color:rgb(0, 0, 0);">Good✅:</span></div><pre><div>以下のテキストに記載されている重要なエンティティを抽出してください。まずすべての会社名を抽出し、次にすべての人名を抽出し、次に内容に合った特定のテーマを抽出し、最後に一般的な包括的テーマを抽出してください。</div>
<div><br /></div>
<div>希望する形式</div>
<div>会社名:<コンマで区切られた会社名のリスト>。</div>
<div>人名: -||-</div>
<div>具体的なトピック-||-</div>
<div>一般的なテーマ: -||-</div>
<div><br /></div>
<div>テキスト: {テキスト}。</div></pre><h2><b><span style="color:rgb(58, 60, 76);">5. </span>ゼロショットから始め、次にフューショット、それでもうまくいない場合にはファインチューン</b></h2><div><span style="color:rgb(0, 0, 0);">✅ ゼロショット </span></div><pre><div>以下のテキストからキーワードを抽出してください。</div>
<div><br /></div>
<div>テキスト: {テキスト}</div>
<div><br /></div>
<div>キーワードは</div></pre><div><span style="color:rgb(0, 0, 0);">✅ フューショット(Few-shot) 参考としていくつかの例を提供します</span></div><pre><div>以下の対応するテキストからキーワードを抽出してください。</div>
<div><br /></div>
<div>テキスト1:Stripeは、Web開発者がWebサイトやモバイルアプリケーションに決済処理を組み込むために使用できるAPIを提供している。</div>
<div>キーワード1:Stripe、決済処理、API、Webデベロッパー、Webサイト、モバイルアプリケーション</div>
<div>##</div>
<div>テキスト2:OpenAIは、テキストの理解と生成に非常に優れた最先端の言語モデルを訓練している。私たちのAPIはこれらのモデルへのアクセスを提供し、言語処理を伴うほぼすべてのタスクを解決するために使用することができる。</div>
<div>キーワード2:OpenAI, 言語モデル, テキスト処理, API.</div>
<div>##</div>
<div>テキスト3:{text}。</div>
<div>キーワード 3:</div></pre><div><span style="color:rgb(0, 0, 0);">✅ ファインチューン:ファインチューンのベストプラクティスを</span><a href="https://docs.google.com/document/d/1h-GTjNDDKPKU_Rsd0t1lXCAnHltaXTAzQ8K2HRhQf9U/edit#" rel="nofollow noopener noreferrer" rev="en_rl_none"><span style="color:rgb(0, 0, 0);"><u>こちらで</u></span></a><span style="color:rgb(0, 0, 0);">ご覧ください。</span></div><h2><b><span style="color:rgb(58, 60, 76);">6. "ふわっと "した不正確な記述を減らす</span></b></h2><div><span style="color:rgb(0, 0, 0);">イマイチ❌:</span></div><pre><div>この製品の説明文は、かなり短く、数文のみで、それ以上にはならないようにします。</div></pre><div><span style="color:rgb(0, 0, 0);">Good✅:</span></div><pre><div>この製品について、3~5文の段落で説明してください。</div></pre><h2><b><span style="color:rgb(58, 60, 76);">7. やってはいけないことを言うのではなく、代わりに何をすべきかを伝える</span></b></h2><div><span style="color:rgb(0, 0, 0);">イマイチ❌:</span></div><pre><div>以下は、エージェントとお客様との会話です。ユーザー名やパスワードを尋ねないでください。繰り返さないでください。</div>
<div><br /></div>
<div>お客様: 自分のアカウントにログインできないのですが。</div>
<div><br /></div>
<div>エージェント:</div></pre><div><span style="color:rgb(0, 0, 0);">Good✅:</span></div><pre><div>以下は、エージェントとお客様との会話です。エージェントは、問題の診断と解決策の提示を試みますが、個人情報に関連する質問は控えてください。ユーザー名やパスワードなどの個人情報を尋ねる代わりに、ヘルプ記事(www.samplewebsite.com/help/faq)を紹介してください。</div>
<div><br /></div>
<div>お客様: 自分のアカウントにログインできないのですが。</div>
<div><br /></div>
<div>エージェント:</div></pre><h2><b><span style="color:rgb(58, 60, 76);">8. (コード生成の場合)モデルを特定のパターンに誘導するための「リーディングワード」を使用する</span></b></h2><div><span style="color:rgb(0, 0, 0);">イマイチ❌:</span></div><pre><div># 以下のようなシンプルなpython関数を書きます。</div>
<div># 1.マイルで数字を聞いてみる</div>
<div># 2.マイルをキロメートルに変換してくれる</div></pre><div><span style="color:rgb(0, 0, 0);">以下のコード例では、"</span><i><span style="color:rgb(0, 0, 0);">import</span></i><span style="color:rgb(0, 0, 0);">"を追加することで、モデルがPythonで記述し始めることを示唆しています。(同様に "</span><i><span style="color:rgb(0, 0, 0);">SELECT</span></i><span style="color:rgb(0, 0, 0);"> "はSQL文の開始を示す良いヒントとなります)。 </span></div>
<div><span style="color:rgb(0, 0, 0);">Good✅:</span></div><pre><div># 以下のようなシンプルなpython関数を書きます。</div>
<div># 1.マイルで数字を聞いてみる</div>
<div># 2.マイルをキロメートルに変換してくれる</div>
<div><br /></div>
<div>import</div></pre><div><b><span style="color:rgb(58, 60, 76);"><span style="--en-markholder:true;"><br /></span></span></b></div>
<div><br /></div>
<div><br /></div>
ChatGPTの対話に最新のWebを反映させようというChrome拡張「WebChatGPT」
http://noriaki.dev/post/chatgptnodui-hua-nizui-xin-nowebwofan-ying-saseyoutoiuchromekuo-zhang-webchatgpt
2023-04-10T07:48:49.104000Z
2023-04-09T22:42:09Z
Noriaki Horiuchi
<p><strong>WebChatGPT</strong><br />
https://chrome.google.com/webstore/detail/webchatgpt-chatgpt-with-i/lpfemeioodjbpieminkklglpmhlngfcn/related?hl=ja</p>
<p>ChatGPTの対話に最新のWebを反映させようというChrome拡張</p>
<p>おすすめ度:△</p>
<h2>概要と特長</h2>
<p>仕組みとしては、ユーザーが投入した検索文字列を一旦WebChatGPTで受けて検索し、その検索結果を含むプロンプトを生成してChatGPTに渡すというものです。</p>
<p>検索エンジンはDuckDuckGo(!)を使用します。</p>
<p>スタンドアロンで動きプライバシーを侵害しないのがウリであると謳っています。</p>
<p>また、本家ChatGPTのサイト上で動作するChrome拡張なので、ProアカウントならGPT-4が使えます。</p>
<p>また使用するかどうかをその都度切り替えたり、プロンプトに含める検索結果の数、地域、時期を変更することができます。</p>
<p>ChatGPTに投入するプロンプト自体をカスタマイズすることもできます。</p>
<p>履歴がChatGPT本体で管理されるのも嬉しいですね。</p>
<p>Webアクセスをオフにすることもできるので、不要な場合にはオフにしたり、必要なときだけオンにしたりといった使い方ができます。</p>
<h2>使用を特におすすめしない理由</h2>
<ul>
<li>検索結果の品質が高くない</li>
<li>これは使用する検索エンジンに由来するので酷ではあります</li>
<li>検索結果の是非について検討があまりなく、その内容に引きずられがち</li>
<li>検索結果を要約する仕組みになっているのが理由。</li>
<li>プロンプトのカスタマイズで幾分改善する可能性はあります</li>
<li>Bingで似たようなことはできる</li>
</ul>
<p>まだまだ荒削りではありますが、アイデアは面白いChrome拡張だなと思います。</p>
<p><img src="https://cdn-images.postach.io/ce30bbdf-40c6-4a7b-9fbc-75ad41d0b272/ea8eaa96-af13-5396-d278-b579dd457ee7/5535069f-dcc0-268c-50be-24b60ce41348.png" style="--en-naturalWidth:1810; --en-naturalHeight:2332;"/></p>
外部ディスプレイの明るさをキーボードで調節できない(Karabiner-Elements)
http://noriaki.dev/post/wai-bu-deisupureinoming-rusawokibododediao-jie-dekinai-karabiner-elements
2024-01-08T14:20:27.647000Z
2023-02-01T12:13:18Z
Noriaki Horiuchi
<div><b><u>環境</u></b></div>
<div>ソフト</div><ul><li><div>Karabiner-Elements</div></li></ul><div>ハード</div><ul><li><div>Mac Studio</div></li><li><div>Studio Display</div></li><li><div>Magic Keyboard</div></li></ul><div><br /></div>
<div><b><u>状況</u></b></div>
<div>通常、MacであればF1, F2キーで明るさ調整ができるが、できない</div>
<div>Karabiner-Elementsを使わない場合には調整可能</div>
<div><br /></div>
<div><b><u>対処</u></b></div>
<div>Karabiner-Elementsの設定を調整する</div>
<div><br /></div>
<div><b><u>詳細</u></b></div>
<div>display_brightnes_increment/decrement になっているのを</div>
<div>brightness_down/brightness_up にする</div>
<div><br /></div>
<div><b><u>備考</u></b></div>
<div>謎にbrightness_down(2)/brightness_up(2) という選択肢もあった。場合によってはこれが正解になるのかもしれない。</div>
<div><br /></div><img src="https://cdn-images.postach.io/ce30bbdf-40c6-4a7b-9fbc-75ad41d0b272/ed02bf93-6a16-3276-b32a-b7c3775de852/4ac90ddf-87d2-ea67-6a52-e391c01acfde.png" style="--en-naturalWidth:2200; --en-naturalHeight:1416;"/><div><br /></div>
<div><a href="https://github.com/pqrs-org/Karabiner-Elements/issues/2505" rev="en_rl_none">https://github.com/pqrs-org/Karabiner-Elements/issues/2505</a></div>
<div><br /></div>
bad object refs/stash, repository did not send all necessary objects
http://noriaki.dev/post/bad-object-refs-stash-repository-did-not-send-all-necessary-objects
2024-01-08T14:20:48.799000Z
2022-09-01T11:25:13Z
Noriaki Horiuchi
<p><code>git fetch</code>や<code>pull</code>ができません。<code>--prune</code> オプションを付けても以下のようなエラーメッセージが出て何もできませんでした。</p>
<pre><code>fatal: bad object refs/stash
error: github.com:organization/repository.git did not send all necessary objects
</code></pre>
<p>以下のコードを実行すると解決しました</p>
<pre><code>git rm .git/refs/stash
</code></pre>
<p>参考:<a href="https://qiita.com/takemaru_shuna/items/0090486d05a48c42e7ca">git fetchしようとしたら fatal: bad object refs/heads/master 2 - Qiita</a></p>
DDD in Scala に関するメモ
http://noriaki.dev/post/ddd-in-scala-niguan-surumemo
2022-08-03T23:57:56.132000Z
2022-08-03T23:55:58Z
Noriaki Horiuchi
<div><ul><li></div>
<div>マイクロサービス化するならScalaでなくてもよい</div></li><ul><li><div>型を共有できない、共有するのが大変なのでScalaのメリットがあまりない</div></li></ul><li><div>Scalaやるならモジュラーモノリス</div></li><ul><li><div>sbtのサブプロジェクト機能が便利</div></li></ul></ul>
TDDに関する所感
http://noriaki.dev/post/tddniguan-surusuo-gan
2022-08-03T23:36:02.398000Z
2022-08-03T23:06:55Z
Noriaki Horiuchi
<div><ul><li></div>
<div>静的型付け言語との相性について</div></li><ul><li><div>そこまでではない</div></li><li><div>解決しようとしている問題領域が多少重なっている気がする</div></li><ul><li><div>特定の時点における整合性(コミット時点の整合性)</div></li><ul><li><div>静的型はこちらに強い</div></li><li><div>テストはこちらに弱い</div></li></ul><li><div>変化に対する整合性(コミット前後の整合性)</div></li><ul><li><div>静的型はこちらに弱い</div></li><li><div>テストはこちらに強い</div></li></ul></ul><li><div>思考・開発フローとの折り合いがそれほど良くない</div></li><ul><li><div>差分ごとに型を変えるのが手間</div></li></ul></ul><li><div>最小手数で書いて通すので局所最適に陥りそう</div></li><ul><li><div>bad practiceルートに入りそう</div></li></ul><li><div>時間不足や割り込み作業などでblush upが足りないままマージされる恐れ</div></li><li><div>手作業が多い</div></li><li><div>先に要求に関するテストを書き、実装に関しては静的型で検査するのがよさそう</div></li></ul><div><br /></div>
org.scalatest.concurrent.ScalaFutures について
http://noriaki.dev/post/org-scalatest-concurrent-scalafutures-nituite
2022-07-29T04:39:01.482000Z
2022-07-28T01:58:38Z
Noriaki Horiuchi
<div><b><u>ScalaFuturesとは</u></b></div><ul><li><div>お手軽にAwaitしてくれるやつ</div></li><ul><li><div>Await.ready(scalaFuture, Duration.fromNanos(config.timeout.totalNanos)).eitherValue.get</div></li></ul><li><div>implicit conversion用メソッド</div></li></ul><div><br /></div>
<div><b><u>AsyncTestSuite とは</u></b></div><ul><li><div>Future.map 内での評価も有効にしてくれるやつ</div></li><li><div>executionContextを提供してくれるやつ</div></li></ul><div><br /></div>
<div><b><u>AsyncTestSuiteとScalaFuturesとの関係</u></b></div><ul><li><div>AsyncTestSuiteを使っている限りはScalaFuturesに頼る必要はない</div></li><li><div>AsyncTestSuiteを使っている場合にScalaFuturesを併用するべきでないか?</div></li><ul><li><div>一般的には問題ない</div></li></ul></ul><div><br /></div>
CircleCIからHerokuにデプロイできない
http://noriaki.dev/post/circlecikaraherokunidepuroidekinai
2022-07-11T16:26:25.925000Z
2022-07-11T15:41:42Z
Noriaki Horiuchi
<div><ul><li></div>
<div>CircleCIからHerokuへのデプロイが失敗してしまう。</div></li><ul><li><div>"Invalid credentials provided." と言われる</div></li></ul></ul><div><br /></div>
<div>エラーメッセージは以下。</div>
<div><br /></div>
<div style="padding-left:40px;">(Compile / deployHeroku) com.heroku.api.exception.RequestFailedException: Unable to list config failed. statuscode:401 responseBody:{"id":"unauthorized","message":"Invalid credentials provided."}</div>
<div><br /></div>
<div>原因は Credentials、つまりHerokuから取得したAPI Keyが古かった。おそらくはHeroku側の都合でパスワードがリセットされたのか、一旦ログインできなくなっていたのでその影響か。</div>
<div><br /></div>
<div>アカウント設定ページ(<a href="https://dashboard.heroku.com/account" rev="en_rl_none">https://dashboard.heroku.com/account</a>)からAPI Keyを再取得し、CircleCIの環境変数に設定して完了。デプロイできるようになりました。</div>
ScalaTestのAsyncTestSuiteとAkkaのTestKitとの相性が悪い
http://noriaki.dev/post/scalatestnoasynctestsuitetoakkanotestkittonoxiang-xing-gae-i
2022-07-11T15:00:11.360000Z
2022-07-06T16:12:40Z
Noriaki Horiuchi
<div>要旨</div><ul><li><div>ScalaTestは非同期でのテスト用にExecutionContextを提供するAsyncTestSuiteが用意されている</div></li><ul><li><div>AsyncFunSpecなど</div></li><li><div>org.scalatest.concurrent.SerialExecutionContext</div></li></ul><li><div>Akka TestKitにはテスト用のExecutionContextが供給されている</div></li><ul><li><div>akka.testkit.CallingThreadDispatcher</div></li></ul><li><div>SerialExecutionContextからCallingThreadDispatcherを呼ぶとデッドロックする(逆も然り)</div></li></ul>
IntelliJ IDEAのScalaプラグインのsbtシェルのヒープサイズを設定する
http://noriaki.dev/post/intellij-ideanoscalapuraguinnosbtsierunohipusaizuwoshe-ding-suru
2022-06-08T03:17:13.960000Z
2022-06-08T02:25:58Z
Noriaki Horiuchi
<div>sbtシェルは便利ですが、ヒープサイズが小さくてOutOfMemoryErrorが出てしまう場合があります。</div>
<div><br /></div>
<div>そのようなときはIntelliJの設定画面からsbtの設定を開き、最大ヒープサイズを適切な値に設定します。</div>
<div><br /></div>
<div>これによってsbtの起動時に-Xmxが指定した値に設定されるので、メモリ不足が解消します。</div>
<div><br /></div><img src="https://cdn-images.postach.io/ce30bbdf-40c6-4a7b-9fbc-75ad41d0b272/21668f0d-3ae0-1b7c-4bda-e5e50be47515/0e6ec2c5-3049-15fd-36c1-838b25b8f9ff.png" style="--en-naturalWidth:1994; --en-naturalHeight:1416;"/><div><br /></div>
scalafixでMissingSemanticdbErrorが出たら、当該プロジェクトをcleanするとよい
http://noriaki.dev/post/scalafixdemissingsemanticdberrorgachu-taradang-gai-puroziekutowocleansurutoyoi
2022-06-06T07:03:07.997000Z
2022-06-06T06:51:49Z
Noriaki Horiuchi
<p>コンパイル時に</p>
<pre><code>
[error] (projectName / Compile / scalafix) scalafix.sbt.ScalafixFailed: MissingSemanticdbError
</code></pre>
<p>などとエラーが出たら、 <code>projectName/clean</code> したうえで再度コンパイルすると成功します。</p>
Scalaで明示的インポートなしにtap・pipeを使えるようにしたかった
http://noriaki.dev/post/scalademing-shi-de-inpotonasinitap-pipewoshi-eruyounisitakatuta
2023-09-30T07:29:35.878000Z
2021-11-04T08:47:07Z
Noriaki Horiuchi
<div>Scala 2.13.6で <code>scalacOptions</code> に <code>-Yimports scala.util.chaining.scalaUtilChainingOps</code> を設定しようとした。</div>
<div><br/></div>
<div>しかしうまくいかないのと、<a href="https://docs.scala-lang.org/scala3/guides/migration/options-lookup.html" rev="en_rl_none">Scala 3ではまだ対応していない</a>ようなので、今回は諦めた。</div>
<div><br/></div>
Lightsail インスタンスにSSHで接続する
http://noriaki.dev/post/lightsail-insutansunisshdejie-sok-suru
2021-10-04T15:54:21.868000Z
2021-10-04T15:26:28Z
Noriaki Horiuchi
<div><h2>キーを取得する</h2></div>
<div><br /></div>
<div>デフォルトキーで作成している場合には以下のページからダウンロードできます。</div>
<div><br /></div>
<div><a href="https://lightsail.aws.amazon.com/ls/webapp/account/keys">https://lightsail.aws.amazon.com/ls/webapp/account/keys</a></div>
<div><br /></div>
<div>キーをダウンロードして <span style="--en-fontfamily: monospace; font-family: "Source Code Pro",monospace">~/.ssh</span> ディレクトリに保存します。</div><h2>キーのアクセス権限を変更する</h2><div><br /></div><pre><div>chmod 600 ~/.ssh/LightsailDefaultKey-ap-northeast-1.pem</div></pre><h2>インスタンスに接続する</h2><div><br /></div><pre><div>ssh -i ~/.ssh/LightsailDefaultKey-ap-northeast-1.pem bitnami@<hostname></div></pre><div><br /></div>
macOSにおけるnode.js環境構築手順 2020
http://noriaki.dev/post/macosniokerunode-jshuan-jing-gou-zhu-shou-shun-2020
2020-11-12T05:58:45.891000Z
2020-11-12T02:50:14Z
Noriaki Horiuchi
<p>2020年11月12日時点での、macOSにおけるnode.js環境の構築方法について記録しておきます。</p>
<p>インストールするもの</p>
<ul>
<li>homebrew</li>
<li>anyenv<ul>
<li>公式リポジトリ:<a href="https://github.com/anyenv/anyenv">anyenv/anyenv: All in one for **env</a></li>
</ul>
</li>
<li>nodenv<ul>
<li>公式リポジトリ:<a href="https://github.com/nodenv/nodenv">nodenv/nodenv: Manage multiple NodeJS versions.</a></li>
</ul>
</li>
</ul>
<p>homebrew、nodenvはわかりますがanyenvというのは見慣れないですね。</p>
<p>どうやら *env といった環境管理ツールを管理してくれるというメタなツールのようです。</p>
<p>言語やツールごとに増えがちで管理も難しいので嬉しいです。</p>
<p>実はjenvとかも管理できるようなので、Java/Scala使いにも嬉しい可能性があります(未検証)。</p>
<h2>Homebrew</h2>
<p>Homebrewをインストールする方法はScalapediaにて解説済みなのでそちらをご覧ください</p>
<p><a href="https://scalapedia.com/articles/13/macOS%E3%81%ABsbt%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95#Homebrew%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B">macOSにsbtをインストールする方法|Scalapedia</a></p>
<h2>anyenv</h2>
<pre><code>brew install anyenv
</code></pre>
<h2>nodenv</h2>
<pre><code>anyenv install nodenv
nodenv init
</code></pre>
<p>以下のようなコマンドをどこかに記述する必要があります。</p>
<pre><code>eval "$(nodenv init -)"
</code></pre>
<p><code>nodenv init</code>の実行時の出力に、どこに記述すればよいのかが明らかにされます。<br />
これを参考に追記しましょう。</p>
<p>今は一般的には <code>~/.zshrc</code> に追記することになるんですかね。</p>
<h2>node.js</h2>
<p>nodeの一覧を最新に更新します(インストールしたては不要)</p>
<pre><code>brew upgrade nodenv node-build
</code></pre>
<p>一覧を表示します。</p>
<pre><code>nodenv install --list
</code></pre>
<p>表示した中で必要なnodeをインストールします。</p>
<pre><code>nodenv install 14.15.0
nodenv global 14.15.0
</code></pre>
<p>installだけではまだ全体に反映されません。<br />
<code>global</code> コマンドを使用すると、バージョンが固定されます。</p>
<p>特定のディレクトリのnodeを固定するには <code>local</code> コマンドを使用します。</p>
<pre><code>nodenv local 14.15.0
</code></pre>
Reactのサンプルアプリケーションの作り方 2020
http://noriaki.dev/post/reactnosanpuruapurikesiyonnozuo-rifang-2020
2020-11-12T06:22:55.212000Z
2020-11-04T08:00:24Z
Noriaki Horiuchi
<p>2020年11月12日現在のReactのサンプルアプリケーションの作り方について記録しておきます。</p>
<h2>Reactでサンプルアプリケーションをつくる</h2>
<p>Reactでサンプルアプリケーションをつくるには日本語公式のチュートリアルを使用するといいです。</p>
<ul>
<li><a href="https://ja.reactjs.org/docs/create-a-new-react-app.html">新しい React アプリを作る – React</a></li>
</ul>
<h2>ReactとTypeScriptでサンプルアプリケーションをつくる</h2>
<p>JavaScriptでなくTypeScriptで書きたいという場合は、TypeScript Deep Dive日本語版を見ましょう。</p>
<p>これは上述の公式ReactサンプルをTypeScriptで記述したものです。</p>
<ul>
<li><a href="https://typescript-jp.gitbook.io/deep-dive/tsx/react">React - TypeScript Deep Dive 日本語版</a></li>
</ul>
git-new-workdir の有効化手順
http://noriaki.dev/post/git-new-workdir-noyou-xiao-hua-shou-shun
2020-07-02T12:22:54.475000Z
2020-07-02T08:35:06Z
Noriaki Horiuchi
<h2>「git-new-workdir の有効化」とは</h2>
<p>git-new-workdir の有効化とは、パスの通ったディレクトリにgit-new-workdirコマンドへのシンボリックリンクを貼ること。</p>
<h2>有効化手順</h2>
<p>実際に「パスの通ったディレクトリ」に「git-new-workdirコマンド」への「シンボリックリンクを貼」っていきます。</p>
<h3>「パスの通ったディレクトリ」</h3>
<p>「パスの通ったディレクトリ」として適当なのは <code>/usr/local/bin</code> です。</p>
<h3>「git-new-workdirコマンド」</h3>
<p>次に「git-new-workdirコマンド」のあるディレクトリを特定していきます。</p>
<p>gitインストールディレクトリの中の <code>share/git-core/contrib/workdir</code> の中に <code>git-new-workdir</code> があります。</p>
<p>homebrewでgitをインストールしているので、gitのインストールディレクトリを特定するには、<code>brew info git</code> を実行するとわかります。</p>
<p>私の場合は <code>/usr/local/Cellar/git/2.27.0</code> でした。</p>
<p>したがって <code>git-new-workdir</code>のフルパスは <code>/usr/local/Cellar/git/2.27.0/share/git-core/contrib/workdir/git-new-workdir</code> と判明しました。</p>
<h3>「シンボリックリンクを貼る」</h3>
<p>ということで、以下のコマンドを実行すればOKです。</p>
<pre><code> ln -s /usr/local/Cellar/git/2.27.0/share/git-core/contrib/workdir/git-new-workdir /usr/local/bin/git-new-workdir
</code></pre>
<h2>うまくできたか確認</h2>
<pre><code>$ which git-new-workdir
/usr/local/bin/git-new-workdir
</code></pre>
<p>のように返ってくればOK。何も返ってこないとなると失敗です。</p>
<h2>参考</h2>
<p><a href="https://tonaise.hatenablog.jp/entry/2019/02/04/063000"><br />
Gitで同時に複数ブランチを利用する場合は、やっぱり git-new-workdir だね! - 都内SEのプログラミング勉強と雑記<br />
</a><br />
<a href="https://qiita.com/valzer0/items/67a4c8bf2b1be0fc825a"><br />
/bin, /usr/bin, /usr/sbin, /usr/local/bin の違いとは? - Qiita<br />
</a></p>
JavaとScalaのStringBuilder・StringBuffer事情
http://noriaki.dev/post/javatoscalanostringbuilder-stringbuffershi-qing
2023-09-30T07:29:57.657000Z
2019-09-14T06:11:19Z
Noriaki Horiuchi
<div>2020年7月30日 追記:こちらで詳しく解説しています</div>
<div><a href="https://scalapedia.com/articles/115" rev="en_rl_none">https://scalapedia.com/articles/115</a></div>
<div><br/></div><hr/><div><br/></div>
<div>上級(歴史的経緯についての理解が必要)</div>
<div><br/></div>
<div>scala.collection.mutable.StringBuilder, java.lang.StringBuilder, java.lang.StringBuffer の使い分けについて</div><ul><li><div>java.lang.StringBuilderはsynchronizedされてない。その分速い。Java 5から追加。</div></li><li><div>java.lang.StringBufferはsynchronizedされてる。その分遅い。最初からある。</div></li><li><div>Javaであれば、内容を変更可能な文字列を扱う際、基本的にはjava.lang.StringBuilderクラスを使う。</div></li><ul><li><div>文字列の変更を繰り返す場合はStringよりもStringBuilerの方が効率的</div></li></ul><li><div>スレッドセーフを確保したい場面であれば、java.lang.StringBufferを使うとAPI Docsには書かれている。</div></li><li><div>ただし、同期化の問題はStringBufferにすればたちまち解決するというものではないので、結局のところはStringBuilderを使いつつも同期化は手ずから愚直に実装すべきである。</div></li><li><div>したがってStringBufferは基本的に使用すべきではなく、現在存在しているのは専ら後方互換の目的である。</div></li><li><div>これを踏まえ、Scalaでは内容を変更可能な文字列を扱うにはscala.collection.mutable.StringBuilderクラスを使えばよい</div></li><ul><li><div>scala.collection.mutable.StringBuilderは内部実装がStringBuilderである</div></li><li><div>scala.collection.mutable.StringBuilderはjava.lang.StringBuilderと機能的に互換性がある。</div></li><li><div>さらにScalaっぽい使い方ができるようになっている(要出典)</div></li><li><div>長い文字列</div></li></ul></ul><div><br/></div>
<div>参考</div>
<div><br/></div><img src="https://cdn-images.postach.io/ce30bbdf-40c6-4a7b-9fbc-75ad41d0b272/09daf7f9-6e22-4569-8e07-889c2fd98aa1/2f28f4b8-75fa-4f4b-a968-9457cb48edd7.png" style="--en-naturalWidth:1206; --en-naturalHeight:1636;"/><div><br/></div>
<div><a href="https://twitter.com/gakuzzzz/status/1172904115640258560" rev="en_rl_none">https://twitter.com/gakuzzzz/status/1172904115640258560</a></div>
<div><br/></div>
<div>追記</div>
<div><br/></div>
<div>まだ読んでいないがこちらの記事も参考になりそう</div>
<div><a href="https://dzone.com/articles/why-synchronized-stringbuffer" rev="en_rl_none">https://dzone.com/articles/why-synchronized-stringbuffer</a></div>
<div><br/></div>
<div><br/></div>
<div><br/></div>
How to run shell in the Docker container
http://noriaki.dev/post/how-to-ssh-into-the-docker-container
2019-04-05T06:48:06.229000Z
2019-04-05T05:23:48Z
Noriaki Horiuchi
<div>You can run bash without SSH connection to the Docker container.</div>
<div><br /></div>
<div>TODO</div>
<div><br /></div><ul><li><div>fetch the container ID</div></li><ul><li><div>docker ps -qf "name=[the name of container]" </div></li></ul><li><div>run bash on the docker instance</div></li><ul><li><div>docker exec -it [container ID] bash</div></li></ul></ul><div><br /></div>
<div>e.g.,</div>
<div><br /></div><pre><div>docker exec -it $(docker ps -qf "name=[the container name]") bash</div></pre><div><br /></div>
"Permission denied" in "brew install python"
http://noriaki.dev/post/permission-denied-in-brew-install-python
2024-01-08T14:22:07.167000Z
2018-11-30T06:41:24Z
Noriaki Horiuchi
<p>When executed <code>brew install python</code>, I got "Error: Permission denied @ dir_s_mkdir" below.</p>
<pre><code>
$ brew install python
...
==> Installing python
==> Downloading
https://homebrew.bintray.com/bottles/python-3.7.1.mojave.bottle.8.tar.gz
######################################################################## 100.0%
==> Pouring python-3.7.1.mojave.bottle.8.tar.gz
Error: An unexpected error occurred during the `brew link` step
The formula built, but is not symlinked into /usr/local
Permission denied @ dir_s_mkdir - /usr/local/Frameworks
Error: Permission denied @ dir_s_mkdir - /usr/local/Frameworks
</code></pre>
<h2>Cause</h2>
<p>https://qiita.com/Jung0/items/d4012814e6fb1b694208</p>
<p>There was no directory named "/usr/local/Frameworks".</p>
<h2>Solution</h2>
<p>The solution was the same to the article above.<br />
I created a directory "/usr/local/Frameworks", and gave permissions.</p>
<pre><code>sudo mkdir /usr/local/Frameworks
sudo chown $(whoami):admin /usr/local/Frameworks
</code></pre>
Show database list at Redshift
http://noriaki.dev/post/show-database-list-at-redshift
2018-11-11T14:57:51.916000Z
2018-11-09T23:01:35Z
Noriaki Horiuchi
<p>If you want to show the list of databases, you can use <code>pg_database</code> or <code>pg_database_info</code> table, which are included the standard PostgreSQL catalog tables.</p>
<p>SELECT * FROM pg_database;</p>
<p>select datname, datdba, datconnlimit from pg_database_info where datdba > 1;</p>
<p>pg_database_extended</p>
<hr />
<p>References<br />
System Catalog Table / Amazon Redshift Docs<br />
https://docs.aws.amazon.com/redshift/latest/dg/c_intro_catalog_views.html<br />
https://docs.aws.amazon.com/ja_jp/redshift/latest/dg/c_intro_catalog_views.html</p>
<p>System Catalogs</p>
<p>https://www.postgresql.org/docs/8/catalogs.html</p>
<p>https://www.postgresql.org/docs/8/catalog-pg-database.html</p>
ScalaMatsuri 2016 A1 Refactoring in Scala
http://noriaki.dev/post/scalamatsuri-2016-a1-refactoring-in-scala
2016-02-03T09:33:51.516000Z
2016-02-03T06:28:10Z
Noriaki Horiuchi
<div>ScalaMatsuri 2016は大盛況のうちに幕を閉じました。私もスタッフとして参加しておりました。</div>
<div><br/></div>
<div>さて、ScalaMatsuri2016のA会場で行われた、基調講演たるがくぞさんのセッションの内容を簡単にまとめたので共有します。</div>
<div><br/></div>
<div>スライドはこちら:<a href="http://gakuzzzz.github.io/slides/refactoring_in_scala/">http://gakuzzzz.github.io/slides/refactoring_in_scala</a></div>
<div><br/></div>
<div>
<hr/></div>
<div><br/></div>
<div>【値オブジェクトに使える値の型4選】</div>
<div><br/></div>
<ol>
<li>Type Alias(簡単、意味が明確にできる。だが型安全でない)</li>
<li>Tagged Type(型安全だ。しかし数値型だとboxing/unboxingが発生してしまう)</li>
<li>Value Class(boxing/unboxing発生しない。しかし定義するのが面倒)</li>
<li>Phantom Type(<a href="http://gakuzzzz.github.io/slides/refactoring_in_scala/#27">http://gakuzzzz.github.io/slides/refactoring_in_scala/#27</a>)</li>
</ol>
<div><br/></div>
<div>【Phantom Typeはちょっとコツがいる。導入のための手順は以下のとおり】</div>
<div><br/></div>
<ul>
<li>DBの取り扱い可能な値型との相互変換が問題となる</li>
<li>したがってPrismまたはIsoを導入する(相互変換のためのパターン)
<ul>
<li>DB側でPrismの扱いを定義する</li>
<li>それぞれの値オブジェクトでPrismを継承する
<ul>
<li>ボイラープレートだ</li>
<li>experimentalだがmacroを使えればボイラープレートがなくなる</li>
</ul>
</li>
</ul>
</li>
</ul>
<div><br/></div>
<div>
<hr/></div>
<div><br/></div>
<div>といったトークがあり、(独断と偏見で)まとめると以下の表のようになります</div>
<div><br/></div>
<table style="-evernote-table:true;border-collapse:collapse;margin-left:0px;table-layout:fixed;width:100%;">
<tr>
<td style="border: 1px solid rgb(219, 219, 219); padding: 10px; margin: 0px;width:13.5%;">
<div><br/></div>
</td>
<td style="border: 1px solid rgb(219, 219, 219); padding: 10px; margin: 0px;width:12.3%;">
<div>Type Alias</div>
</td>
<td style="border: 1px solid rgb(219, 219, 219); padding: 10px; margin: 0px;width:14.2%;">
<div>Tagged Type</div>
</td>
<td style="border: 1px solid rgb(219, 219, 219); padding: 10px; margin: 0px;width:15.5%;">
<div>Value Class</div>
</td>
<td style="border: 1px solid rgb(219, 219, 219); padding: 10px; margin: 0px;width:13.700000000000001%;">
<div>Phantom Type</div>
</td>
<td style="border: 1px solid rgb(219, 219, 219); padding: 10px; margin: 0px;width:30.7%;">
<div>Phantom Type & Prism & macro</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>導入コスト</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>◎:他のロジックに影響ない</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>×:定義が面倒</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>△</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>△:macroはまだExperimental</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>型安全</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>×</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>◯</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>コンテナ型へのキャスト</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>×</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>×</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>◯</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>追加のメソッド定義</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>×</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>×</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>◯</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>boxing/unboxing</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>×:AnyValだとアカン</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>◯</div>
</td>
</tr>
<tr>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>レイヤー境界での変換が不要(DBなどとの互換性)</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>◯</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>×</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:20%;">
<div>×</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>×</div>
</td>
<td style="border-style:solid;border-width:1px;border-color:rgb(219,219,219);padding:10px;margin:0px;width:10%;">
<div>◯</div>
</td>
</tr>
</table>
<div><br/></div>
<div><br/></div>
<div>こんなにわかりやすい発表資料もなかなかないと思います。</div>
<div><br/></div>
<div>急いで作ったのでミスあると思いますが、その際はどうぞお知らせください。-> <a href="https://twitter.com/NoriakiHoriuchi">https://twitter.com/NoriakiHoriuchi</a></div>
java.lang.IllegalArgumentException
http://noriaki.dev/post/java-lang-illegalargumentexception
2015-10-21T03:42:03.898000Z
2015-10-21T03:30:17Z
Noriaki Horiuchi
<p>以下のエラーと長いStacktraceが出力されてどうしたものかと思ったが、ここで示されているList内にパッケージ内のどこでエラーが出ているのかが書いてあったおかげで救われました。</p>
<pre><code>
[error] (compile:compileIncremental) java.lang.IllegalArgumentException: Could not find proxy for model: models.MyModel in List(value model, method apply, <$anon: Function1>, method myMethod, class MyClass, package myPackage, package services, package <root>) (currentOwner= value x$11 )
</code></pre>
<p><code>List(value model, method apply, <$anon: Function1>, method myMethod, class MyClass, package myPackage, package services, package <root>)</code> とあるので、末尾から逆に辿って <code>_root_.services.myPackage.MyClass</code> に定義されているmyMethod内の引数一つの無名関数のどこかにおかしいところがあります。</p>
<p>原因は <code>myMethod</code> 内で使用していた <code>Option</code> の <code>fold[B](ifEmpty: => B)(f: A => B)</code> について、第一引数 <code>ifEmpty</code> を指定し忘れていたからでした。</p>
<p>改行して中にコメントを追加していたのでIDEも検知できなかったようです(?)。</p>
<p><code>foreach</code> するなり、 <code>for</code> 内包表記で処理するという対処法があります。また、Unitを返すべき場面では <code>()</code> を追加するという方法もあります。</p>
Scalaのクラスのコンストラクタに、空の括弧(Empty Parentheses)をつけて定義すべきかどうか?結論:どちらでもいい
http://noriaki.dev/post/empty-parentheses-of-class-constructor-of-scala
2015-09-11T12:30:13.451000Z
2015-09-11T08:56:21Z
Noriaki Horiuchi
<p>「引数を取らないメソッドに対して、空の括弧(empty paren)をつけて定義するか?それともつけずに定義するか?」は、副作用があるかどうかで決めるのがScalaの流儀であります。これと同様に、クラスのコンストラクタも引数を取らないときには括弧をつけるパターンとつけないパターン、いずれの方法でも定義することができます。そうなると果たしてどうやって括弧をつけるかどうか判断すべきなのか?というのが今回のテーマです。</p>
<p>じっさい公式のスタイルガイドにはそのような項目がないので、どうするかは各人に任されているようなのですが、StackOverflowにはドンピシャな質問があります。</p>
<p><a href="http://stackoverflow.com/questions/7903587/scala-style-for-empty-class-parameter-lists">Scala style for empty class parameter lists</a></p>
<p>ベストアンサーの方の回答を要約すると</p>
<ol>
<li>
<p>Javaでクラス(括弧あり)とインターフェースを見分けるために使っているように、Scalaでもクラス(空の括弧あり)とトレイトで使い分けてもいい</p>
</li>
<li>
<p>メソッドと同様に、副作用があるならつける、ないならつけないということもできる</p>
<ul>
<li>でもコンストラクタでは副作用が発生しないのが理想だよな…</li>
</ul>
</li>
<li>
<p>状態を持つオブジェクト、ミュータブルなオブジェクト(空の括弧つける)とイミュータブルなオブジェクト(括弧つけない)で使い分けるということもできる</p>
<ul>
<li>でもケースクラスはイミュータブルであるべきだが、空の括弧をつけずに定義するのは非推奨だし…</li>
</ul>
</li>
<li>
<p>個人的にはない方が見やすいから付けてないよ</p>
</li>
</ol>
<p>ということです。</p>
<p>個人的にも、わざわざ付ける必要はないと思っています。</p>
Scalaのcase classの第二パラメータリストに外からアクセスできなくて困った件
http://noriaki.dev/post/scala-visibility-of-constructor-arguments-of-class-case-class
2015-09-09T16:02:13.716000Z
2015-09-08T13:30:46Z
Noriaki Horiuchi
<p>ケースクラスの2つ目の引数が外から見えない、なぜだろう?ということが発端となり、いろいろと調べたりGitterで質問してみました。その結果、コンストラクタ引数の定義のしかたによって見え方(アクセス修飾子の状態)が異なるということがわかりました。</p>
<pre><code>
scala> case class A(x: Int)(y: Int){
| def printY() = println(y)
| }
defined class A
scala> val a = A(10)(20)
a: A = A(10)
scala> a.x
res22: Int = 10
scala> a.y
<console>:19: error: value y is not a member of A
a.y
^
scala> a.printY()
20
</code></pre>
<p>クラスののデフォルトコンストラクタ引数はprivateです。したがって、下の例ではprivateなフィールドxにアクセスしようとしてエラーが出ています。</p>
<pre><code>
scala> class A(x: Int)
defined class A
scala> new A(10)
res0: A = A@af23093
scala> res0.x
<console>:13: error: value x is not a member of A
res0.x
^
scala>
</code></pre>
<p>私は普段case classをよく使う一方、クラスのフィールドに外からアクセスすることはあまりないので、すっかり頭のなかから抜け落ちていました。</p>
<p>このフィールドをpublicなものとするには、 <code>val</code> または <code>var</code> を明示的に付けてあげる必要があります。</p>
<pre><code>
scala> class A(val x: Int)
defined class A
scala> new A(10)
res0: A = A@6deaf732
scala> res0.x
res1: Int = 10
</code></pre>
<p>あるいは、case classとすると、valやvarを付加しなくても自動生成されたゲッターメソッドによってフィールドにアクセスできます。</p>
<pre><code>
scala> case class A(x: Int)
defined class A
scala> A(10)
res0: A = A(10)
scala> res0.x
res1: Int = 10
</code></pre>
<p>しかしながら、case classは万能ではありません。case classに複数のパラメータリストが存在する場合、2つ目以降のパラメータリストにはゲッターメソッドを生成してくれません。</p>
<pre><code>
scala> case class B(x: Int)(y: Int)(z: Int)
defined class B
scala> B(10)(20)(30)
res0: B = B(10)
scala> res0.x
res1: Int = 10
scala> res0.y
<console>:14: error: value y is not a member of B
res0.y
^
scala> res0.z
<console>:14: error: value z is not a member of B
res0.z
^
</code></pre>
<p>それどころか、case classはequals()やhashCode()についても2つ目以降のパラメータリストを無視してくれるので、以下のように「第一パラメータだけで比較する」「ハッシュコードが同一になる」といった現象が起こります。 <a href="https://gitter.im/scalajp/public"><br />
https://gitter.im/scalajp/public</a></p>
<pre><code>
scala> case class C(x: Int)(y: Int)
defined class C
scala> C(10)(20)
res0: C = C(10)
scala> C(10)(30)
res1: C = C(10)
scala> res0 == res1
res2: Boolean = true
scala> res0.hashCode
res3: Int = -2008924253
scala> res1.hashCode
res4: Int = -2008924253
</code></pre>
<p>結論:気をつけます。</p>
<p>参考</p>
<p><a href="http://www.ne.jp/asahi/hishidama/home/tech/scala/class.html#h_construntor"><br />
http://www.ne.jp/asahi/hishidama/home/tech/scala/class.html#h_construntor</a></p>
<p><a href="http://www.ne.jp/asahi/hishidama/home/tech/scala/class.html#h_case_class"><br />
http://www.ne.jp/asahi/hishidama/home/tech/scala/class.html#h_case_class</a></p>
Scalaをちょろっと書く方法
http://noriaki.dev/post/scalawochiyorotsutoshu-kufang-fa
2015-09-05T12:00:21.857000Z
2015-09-05T11:20:12Z
Noriaki Horiuchi
<p>ちゃんとしたScalaプロジェクトを書くなら、相当に腕の立つ方でない限りIDEを使って書いたほうがいいですが、簡単なプログラムを動かしたいという時には小回りがきかずやや面倒です。</p>
<p>ここでは、テキストのサンプルコードをちょっと動かしてみたいときに使える方法を挙げます。</p>
<h3>REPLで動かす</h3>
<ul>
<li>
<p>scalaにパスが通っている場合: <code>scala</code> と入力して実行</p>
</li>
<li>
<p>activatorにパスが通っている場合: <code>activator</code> と打ってから <code>console</code> と入力、または <code>activator console</code> と入力して実行</p>
</li>
<li>
<p>sbtにパスが通っている場合: <code>sbt</code> と打ってから <code>console</code> と入力、または <code>sbt console</code> と入力して実行</p>
</li>
</ul>
<p>このあと好きなように入力します。</p>
<h3>REPLでファイルを指定して実行する</h3>
<p>script.scala という名前で以下のような内容のファイルを作成する。</p>
<pre><code>
object HelloWorld extends App {
println("Hello, world!")
}
HelloWorld.main(args)
</code></pre>
<p>そしてREPLを起動して、 <code>script.scala</code> と入力して実行する。</p>
<h3>シェルスクリプトとして動かす</h3>
<p>scalaがインストールされているのを前提。</p>
<p><code>script.sh</code> という名前で以下のような内容のファイルを作成する。</p>
<pre><code>
#!/bin/sh
exec scala "$0" "$@"
!#
object HelloWorld extends App {
println("Hello, world!")
}
HelloWorld.main(args)
</code></pre>
<p>そして <code>chmod +x script.sh</code> と実行権限を付加した後、 <code>./script.sh</code> と入力して実行。</p>
<h3>paiza.ioで動かす</h3>
<p><a href="https://paiza.io/projects/new">paiza.io</a>ならばWebブラウザ上でScalaのコードを動かすことができる。</p>
<p>以上です。</p>
<h3>環境</h3>
<p>Macのターミナル</p>
Someにタプルを渡したら「Adapting argument list by creating a 4-tuple: this may not be what you want」という警告を受けた
http://noriaki.dev/post/xlint-warns-some-passed-a-tuple
2015-08-31T08:12:41.375000Z
2015-08-31T07:34:59Z
Noriaki Horiuchi
<p>Optionにタプルを包もうと考え、以下の例のように書きました。</p>
<pre><code class="scala">
Some(userId, None, Some(itemId), item)
</code></pre>
<p>すると <code>-Xlint</code> オプションのお陰で、以下のように警告されました。</p>
<pre><code>
Adapting argument list by creating a 4-tuple: this may not be what you want.
[warn] signature: Some.apply[A](x: A): Some[A]
[warn] given arguments: userId, None, Some(itemId), item
[warn] after adaptation: Some((userId, None, Some(itemId), item))
[warn] Some(userId, None, Some(itemId), item)
</code></pre>
<p>「はて、うまく渡っているようだが、どういうことだろう」と考え、その前で <code>@unchecked</code> アノテーションを付けるなどしてみたがうまくいかず。</p>
<p>この警告の意味は要するに、</p>
<p>「Someの引数はひとつなのに、与えられた引数は4つもある。仕方がないからタプルに変換して渡してやったが、これはアンタの考えている挙動と異なるかもしれないから、よく確認しろ!」</p>
<p>ということです。</p>
<p>以下のように、タプルを明示的に渡してあげると、警告はなくなりました。ちゃんとタプルとして渡せているのかどうか、注意しなければなりませんね。</p>
<pre><code class="scala">
Some((orderDetail.sellerId, None, Some(orderDetailComment.orderDetailId), orderDetail))
</code></pre>
<p>安易に警告を抑制(@suppressWarnings)できなくてよかったです。</p>
<p>参考</p>
<p><a href="http://qiita.com/ryoppy/items/de9d2de59e5d78b5f9cf">引数の数間違えたと思ったらタプルになってた</a></p>
iPhoneアプリの開発者名を変更する
http://noriaki.dev/post/change-ios-app-developer-name
2015-08-31T07:49:49.944000Z
2015-08-28T05:56:19Z
Noriaki Horiuchi
<h3>要旨</h3>
<p>アプリ開発者名が、テストで作成したアプリで設定したダミー名(devtest)となっていたので、これを変更するために電話した。</p>
<h3>必要なもの</h3>
<p>デベロッパーサポートへの電話番号</p>
<p>https://developer.apple.com/contact/phone.php</p>
<h3>推移</h3>
<p>電話してiPhoneアプリ開発者名を変更したい旨を述べる。</p>
<p>アカウント確認(氏名とメールアドレス)のあと、該当箇所についてApp Storeを見ながら確認。</p>
<p>二箇所ある開発者名欄のうち、正しい方(iTunesConnectで設定できる方)に合わせる。あらかじめiTunesConnectを確認しておくと吉。</p>
<p>24時間以内に反映されるとのこと。</p>
<p>9桁のケース番号を貰って終了。最後までスムーズだった。</p>
<h3>備考</h3>
<p>もし反映されなかった場合は、再度問い合わせてケース番号を伝えれば良い。</p>
<p>iTunesConnectで設定できる開発者名と揃えたくない場合、どうなるかは疑問。</p>
<h3>参考</h3>
<p>http://matsutsune.hatenablog.com/entry/2013/08/13/142837</p>
<p>http://takasa.blogspot.jp/2012/11/itunes-app-store_29.html</p>
<p>http://www.qeq.jp/it/iphone/2013/03/itunes.html</p>
MySQL says "Cannot add foreign key constraint" when execute sql generated with MySQL Workbench
http://noriaki.dev/post/mysql-says-cannot-add-foreign-key-constraint-when-execute-sql-generated-with-mysql-workbench
2015-07-04T03:30:41.036000Z
2015-07-04T03:21:51Z
Noriaki Horiuchi
<p>MySQL Workbenchで生成したSQLがなぜか実行時に"Cannot add foreign key constraint"と言われてしまい失敗するという話です。</p>
<p>ER図上で、外部キー制約を付けた二つのカラムの型が異なっていたために生じていました。例えば、 <code>INT</code> と <code>VARCHAR(45)</code> といった形です。</p>
<p>修正したら首尾よく実行されました。</p>
<p>参考:<a href="http://stackoverflow.com/questions/22904930/mysql-workbench-forward-engineer-error-1215-cannot-add-foreign-key-constraint">MySQL Workbench Forward Engineer Error 1215: Cannot add foreign key constraint</a></p>
CreationException: Unable to create injector
http://noriaki.dev/post/creationexception-unable-to-create-injector
2015-07-03T03:01:17.921000Z
2015-07-03T02:57:15Z
Noriaki Horiuchi
<p>原因:jdbcとplay-slickが依存性に含まれていると、それぞれがplay.api.db.DBApiを使用するので、競合してエラーとなる。</p>
<p>対策:jdbcの除去</p>
<p>参考:<a href="https://groups.google.com/forum/#!topic/play-framework/CrJhJ8glPI8">play-framework > [play 2.4.0-RC5 Scala] evolutions and injector error with play-slick</a></p>
<pre><code>! @6mk485065 - Internal server error, for (GET) [/] ->
play.api.UnexpectedException: Unexpected exception[CreationException: Unable to create injector, see the following errors:
1) A binding to play.api.db.DBApi was already configured at play.api.db.slick.evolutions.EvolutionsModule.bindings(EvolutionsModule.scala:14):
Binding(interface play.api.db.DBApi to ConstructionTarget(class play.api.db.slick.evolutions.internal.DBApiAdapter) in interface javax.inject.Singleton) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1).
at play.api.db.DBModule.bindings(DBModule.scala:25):
Binding(interface play.api.db.DBApi to ProviderConstructionTarget(class play.api.db.DBApiProvider)) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
1 error]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:165) ~[play-server_2.11-2.4.1.jar:2.4.1]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:121) ~[play-server_2.11-2.4.1.jar:2.4.1]
at scala.Option.map(Option.scala:146) ~[scala-library-2.11.6.jar:na]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:121) ~[play-server_2.11-2.4.1.jar:2.4.1]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1.apply(DevServerStart.scala:119) ~[play-server_2.11-2.4.1.jar:2.4.1]
at scala.util.Success.flatMap(Try.scala:230) ~[scala-library-2.11.6.jar:na]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:119) ~[play-server_2.11-2.4.1.jar:2.4.1]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1.apply(DevServerStart.scala:111) ~[play-server_2.11-2.4.1.jar:2.4.1]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) ~[scala-library-2.11.6.jar:na]
at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) ~[scala-library-2.11.6.jar:na]
at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1423) ~[na:1.8.0_05]
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289) ~[na:1.8.0_05]
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:902) ~[na:1.8.0_05]
at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1689) ~[na:1.8.0_05]
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1644) ~[na:1.8.0_05]
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157) ~[na:1.8.0_05]
Caused by: com.google.inject.CreationException: Unable to create injector, see the following errors:
1) A binding to play.api.db.DBApi was already configured at play.api.db.slick.evolutions.EvolutionsModule.bindings(EvolutionsModule.scala:14):
Binding(interface play.api.db.DBApi to ConstructionTarget(class play.api.db.slick.evolutions.internal.DBApiAdapter) in interface javax.inject.Singleton) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1).
at play.api.db.DBModule.bindings(DBModule.scala:25):
Binding(interface play.api.db.DBApi to ProviderConstructionTarget(class play.api.db.DBApiProvider)) (via modules: com.google.inject.util.Modules$OverrideModule -> play.api.inject.guice.GuiceableModuleConversions$$anon$1)
1 error
at com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:466) ~[guice-4.0.jar:na]
at com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:155) ~[guice-4.0.jar:na]
at com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:107) ~[guice-4.0.jar:na]
at com.google.inject.Guice.createInjector(Guice.java:96) ~[guice-4.0.jar:na]
at com.google.inject.Guice.createInjector(Guice.java:73) ~[guice-4.0.jar:na]
at com.google.inject.Guice.createInjector(Guice.java:62) ~[guice-4.0.jar:na]
at play.api.inject.guice.GuiceBuilder.injector(GuiceInjectorBuilder.scala:126) ~[play_2.11-2.4.1.jar:2.4.1]
at play.api.inject.guice.GuiceApplicationBuilder.build(GuiceApplicationBuilder.scala:93) ~[play_2.11-2.4.1.jar:2.4.1]
at play.api.inject.guice.GuiceApplicationLoader.load(GuiceApplicationLoader.scala:21) ~[play_2.11-2.4.1.jar:2.4.1]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:153) ~[play-server_2.11-2.4.1.jar:2.4.1]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1$$anonfun$2.apply(DevServerStart.scala:150) ~[play-server_2.11-2.4.1.jar:2.4.1]
at play.utils.Threads$.withContextClassLoader(Threads.scala:21) ~[play_2.11-2.4.1.jar:2.4.1]
at play.core.server.DevServerStart$$anonfun$mainDev$1$$anon$1$$anonfun$get$1$$anonfun$apply$1$$anonfun$1.apply(DevServerStart.scala:150) ~[play-server_2.11-2.4.1.jar:2.4.1]
... 15 common frames omitted
</code></pre>
Testflight、新しいビルドがアップロードされているのに端末に反映されない問題
http://noriaki.dev/post/testflight-app-fails-to-fetch-new-build
2015-05-25T15:06:53.241000Z
2015-05-25T15:04:31Z
Noriaki Horiuchi
<p>Testflight、新しいビルドがアップロードされているのに端末に反映されない問題がありましたが、一旦"TestFlight Beta Testing"のスイッチをオフにして再度オンにしてみたら直りました。</p>
Crashlytics Invocation Error
http://noriaki.dev/post/crashlytics-invocation-error
2015-05-24T12:45:08.686000Z
2015-05-24T10:17:39Z
Noriaki Horiuchi
<p>チームメンバーがCrashlyticsをインストールしてくれたのだが、ビルドに失敗したので、どうすればいいのか調べた。</p>
<p>エラーメッセージはこちら</p>
<pre><code>Shell Script Invocation Error
Command /bin/sh failed with exit code 1
</code></pre>
<pre><code>Crashlytics: You must install Crashlytics to continue. https://api.crashlytics.com/api/v1/******************/confirm/jp.app.appName
If this machine is a build server please remove Crashlytics.app if present and use xcodebuild so that ukissAlarm.app.dSYM is uploaded.
</code></pre>
<p>解決方法は単純で、Crashlyticsのビルドツールをインストールしていなかったことが原因であった。</p>
<p>https://crashlytics.com/downloads</p>
<p>Crashlyticsはなかなか良いツールだけれど、導入方法の説明ページを見つけづらくて参った。Qiita等を見てやっと解決に辿り着いた。</p>
<hr />
<p><a href="http://qiita.com/asakahara/items/cfa404267ed60fb21927">Crash Report解析サービスのCrashlyticsを試してみた</a></p>
<p>今回の不正解ルート<br />
パーミッションの変更:<a href="http://stackoverflow.com/questions/19077727/ios-xcode-5-crashlytics-error-shell-script-invocation-error-crashlytics-fr">iOS xcode 5 crashlytics error - Shell Script Invocation Error - ./Crashlytics.framework/run: Permission denied</a></p>
<p>試していないもの<br />
Crashlytics.appを一旦削除:<a href="http://stackoverflow.com/questions/20017043/crashlytics-build-script-fails-on-xcode-server-ci">Crashlytics build script fails on Xcode Server CI</a></p>
Scala: ファイルの内容を一行ずつ処理したい
http://noriaki.dev/post/scala-process-lines-with-nio
2015-05-11T09:52:37.595000Z
2015-05-11T08:37:35Z
Noriaki Horiuchi
<p>java.nio.file.Filesで一行ごとに処理(ただしScala)</p>
<p><a href="http://d.hatena.ne.jp/nowokay/20110707">Java SE 7のjava.nio.file.Filesがとても便利な件</a></p>
<p>ファイルの内容を一行ずつ読み込んで処理したい場合に、今までは<a href="http://www.mwsoft.jp/programming/scala/fileread.html">こちらのページ:(Fileの読み込み - Scala覚書</a>)を参考に実装していましたが、nioを使えば簡単だったので、メモしておきます。</p>
<pre><code>val file = Paths.get(path)
Files.readAllLines(file, Charset.defaultCharset())
.foreach(println)
</code></pre>
<p><code>Charset.defaultCharset()</code>が鬱陶しいですがそれに目を瞑ればシンプルです。 <code>scala.io.Source</code> や <code>java.io.BufferedReader</code> 、 <code>commons.io.FileUtils</code> だといずれもバッファをクローズする必要があるので、それに比べればだいぶ良いのではないでしょうか。</p>
<h4>巨大なファイルのとき</h4>
<p>これは、scala.io.Sourceを利用するのがよさそう。構造的部分型を利用したローンパターンを使わなければならないので、そのぶんコードが膨らみますが、そのぶん使用箇所はシンプルにまとまります。</p>
<pre><code>using(Source.fromFile("file.txt")) {
_.getLines().foreach(println)
}
def using[A <% { def close():Unit }](s: A)(f: A=>Any) {
try f(s) finally s.close()
}
</code></pre>
<p>また、using内でSourceのもつメソッドを十分に活用したい場合は、構造的部分型での一般化を諦める必要があります。<br />
参考:<a href="http://www.ne.jp/asahi/hishidama/home/tech/scala/sample/using.html">Scala using(ローンパターン)-Hishidama's Scala Memo-</a></p>
Logbackで設定ファイルを読み込む
http://noriaki.dev/post/logback-configuration-initialization-steps
2015-05-11T06:20:21.652000Z
2015-05-11T02:17:56Z
Noriaki Horiuchi
<p>Logbackで設定ファイルが意図したとおりに読み込まれないという現象に遭遇したので、改めてまとめる。</p>
<h4>読み込み順序</h4>
<p>優先順位の高いものから順に読み込まれる。上位の条件にヒットした場合は、次の条件へは進まない。</p>
<ol>
<li>クラスパスから <code>logback.groovy</code> を検索する。</li>
<li>クラスパスから <code>logback-test.xml</code> を検索する。</li>
<li>クラスパスから <code>logback.xml</code> を検索する。 </li>
<li>JVMが <code>ServiceLoader</code> (JDK 6 and above) を実行している場合、ServiceLoaderは、インターフェース <code>com.qos.logback.classic.spi.Configurator</code> の実装のうち、最初に発見されたものを使用する。</li>
<li>以上がいずれも存在しなかった場合、 <code>BasicConfigurator</code> を使用する。</li>
</ol>
<p>クラスパスは、起動オプション <code>-classpath</code> (推奨)または環境変数 <code>${CLASSPATH}</code> で指定する。クラスパスで指定したディレクトリ直下のみを読み込む。</p>
<p><code>BasicConfigrator</code> を使用する場合、ログの出力先は標準出力に向けられる。</p>
<p>参考: <a href="http://logback.qos.ch/manual/configuration.html#auto_configuration">公式</a></p>
<h4>xmlファイルをjarに含めない場合</h4>
<p>設定が変わるたびに毎度ビルドするのは面倒なので、起動オプションで指定する方法。<br />
あらかじめjarファイルの生成時にlogback.xmlを除外したうえで、以下のオプションを指定しつつ起動すればよい。</p>
<pre><code>-Dlogback.configurationFile=./logback.xml
</code></pre>
<p><a href="http://blog.diffkit.org/2010/08/controlling-logback-configuration-in.html">controlling logback configuration in standalone app</a><br />
<a href="http://www.mkyong.com/maven/maven-exclude-logback-xml-in-jar-file/">Exclude logback.xml in Jar file</a></p>
Scala.jsでNode.jsのモジュールを呼び出したい
http://noriaki.dev/post/invoke-node-js-module-from-scala-js-code
2015-05-09T08:13:56.664000Z
2015-05-08T09:16:23Z
Noriaki Horiuchi
<p>Scala.jsでNode.jsのモジュールを呼び出したい</p>
<pre><code>import scala.scalajs.js
import js.Dynamic.{global => g}
import js.DynamicImplicits._
val app = js.Dynamic.global.require("app")
</code></pre>
<p>参考1にあるように <code>require("app")</code> だけを指定しても、Predefのrequireしか見つからずコンパイルエラーとなったので、参考2のように明示的に指定しています。</p>
<p>参考1:<a href="http://stackoverflow.com/questions/28656343/how-to-invoke-nodejs-modules-from-scala-js">How to invoke nodejs modules from scala.js? -stackoverflow-</a><br />
参考2:<a href="https://gitter.im/scala-js/scala-js/archives/2015/03/02">scala-js/scala-js - Gitter - 2015/03/02</a></p>
Electronまとめ
http://noriaki.dev/post/electron
2015-05-08T07:19:21.616000Z
2015-05-08T06:51:17Z
Noriaki Horiuchi
<p><a href="https://github.com/atom/electron">公式</a> / <a href="https://twitter.com/electronjs">@electronjs</a> / <a href="https://github.com/atom/electron/tree/master/docs">ドキュメント</a></p>
<h4>Electronとは</h4>
<p>JS, HTML, CSSだけでクロスプラットフォームアプリケーションを作るためのフレームワークである。</p>
<p>技術的にはio.js、Chromium、Atom Editorに依拠している。</p>
<p>まずはこれ:<a href="http://www.slideshare.net/mainya/electronatom-shell">「Electron基礎+入門」by @mainyaa</a></p>
<p>主な特徴(<a href="http://atom-shell.connpass.com/event/13304/">Electron勉強会イベントページ</a>より引用)</p>
<ul>
<li>Mac/WindowsネイティブアプリをJavaScriptで作れるよ</li>
<li>rendererはnodeで動くよ!その下のwindow以下のブラウザはchromiumで動くよ</li>
<li>rendererはwin/macの機能を使えるよ。CocoaAPIも使えるよ</li>
<li>ブラウザでnodeのmoduleが使えるよ</li>
<li>ブラウザとrendererが通信できるよ</li>
<li>ランタイムであるchromium内蔵だからchromeなしで動くよ</li>
<li>ブラウザはchromiumオンリーだから楽だよ。devtools使えるよ。エッジな機能使いたい放題だよ</li>
</ul>
<h4>海外コミュニティ</h4>
<ul>
<li><a href="https://discuss.atom.io/c/electron">フォーラム</a></li>
<li>Freenodeの#atom-shellチャネル</li>
</ul>
<h4>国内コミュニティ</h4>
<ul>
<li>Electron勉強会(本郷)<ul>
<li><a href="http://atom-shell.connpass.com/">connpass</a> 20名規模</li>
</ul>
</li>
<li>Electronもくもく会(茅場町)<a href="https://twitter.com/unok">@unok</a><ul>
<li><a href="https://electron-mokumoku.doorkeeper.jp/events/24464">Doorkeeper</a> 15名規模、第3回まで開催決定</li>
<li><a href="https://gitter.im/electronMokumoku/public">Gitterチャット</a></li>
</ul>
</li>
</ul>
<p>アクティブな人</p>
<ul>
<li>
<p><a href="https://twitter.com/kara_d">@kara_d</a></p>
</li>
<li>
<p><a href="https://twitter.com/mizchi">@mizchi</a></p>
</li>
<li><a href="https://twitter.com/mainyaa">@mainyaa</a></li>
<li>
<p><a href="https://twitter.com/kjunichi">@kjunichi</a></p>
</li>
<li>
<p><a href="https://twitter.com/toru_inoue">@toru_inoue</a></p>
</li>
<li><a href="https://twitter.com/tomato360">@tomato360</a></li>
<li><a href="https://twitter.com/tanaka51">@tanaka51</a></li>
<li><a href="https://twitter.com/Misumi_Rize">@misumi_rize</a></li>
<li><a href="https://twitter.com/yymm6666">@yymm6666</a></li>
<li><a href="https://twitter.com/NoriakiHoriuchi">@NoriakiHoriuchi</a></li>
</ul>
<h4>導入事例</h4>
<ul>
<li>Github: <a href="https://atom.io/">Atom Editor</a>(本家)</li>
<li>Microsoft: <a href="https://code.visualstudio.com/">Visual Studio Code</a></li>
<li><a href="https://slack.com/">Slack</a></li>
<li><a href="https://github.com/kitematic/kitematic">Kitematic -Docker container manager-</a></li>
</ul>
<h4>参考ページ</h4>
<ul>
<li>Qiita<ul>
<li><a href="https://qiita.com/tags/electron">Electronタグ</a></li>
<li><a href="http://qiita.com/tags/atom-shell">Atom-Shellタグ</a></li>
</ul>
</li>
</ul>
<h4>始める</h4>
<p>ダウンロード</p>
<ul>
<li>
<p>ビルド済みのバイナリ、デバッグシンボル(Linux, Windows, Mac用)</p>
<ul>
<li><a href="https://github.com/atom/electron/releases">releases</a>ページからダウンロードできる。</li>
<li><a href="https://npm.taobao.org/mirrors/atom-shell">中国のミラー</a></li>
</ul>
</li>
<li>
<p>npmを用いてインストールすることもできる。</p>
</li>
</ul>
<pre><code># Install the `electron` command globally in your $PATH
npm install electron-prebuilt -g
# Install as a development dependency
npm install electron-prebuilt --save-dev
</code></pre>
Xcodeのツールバーのキーボードショートカットを視覚化する
http://noriaki.dev/post/xcodenotsurubanokibodoshiyotokatsutowoshi-jue-hua-suru
2015-04-10T08:46:22.920000Z
2015-04-10T08:33:37Z
Noriaki Horiuchi
<p>よく忘れるのでスクリーンショット撮ってメモ。</p>
<p>エディタは「スタンダードエディタ」と「アシスタントエディタ」。<br />
左側のバーは「ナビゲータ」。<br />
右側のバーは「ユーティリティ」。「インスペクタ」と「ライブラリ」が含まれます。<br />
下側のバーは「デバッグエリア」。</p>
<p>バーの名前も覚えて忘れないようにします。</p>
<p><img src="https://cdn-images.postach.io/ce30bbdf-40c6-4a7b-9fbc-75ad41d0b272/5e4b7197-88b8-4314-a19f-3245bf05d08b/b83dc6ce-28ab-4027-989a-ba2b91787f20.png" style="width: 1680px; height: auto;"/></p>
シェルがたくさんありすぎていまいち掴めなかったので関係性を整理してみた
http://noriaki.dev/post/shierugatakusanarisugiteimaichiguo-menakatsutanodeguan-xi-xing-wozheng-li-shitemita
2015-04-08T16:05:17.087000Z
2015-04-08T15:05:01Z
Noriaki Horiuchi
<p>シェルといえばbashですよね。笑</p>
<p>shebangはしっかり指定しましょうとか各所で言わていますが、今まではサボって適当に <code>!/bin/sh</code> とか指定していました。<br />
きょうは時間ができたので、有名ドコロのシェルが何からどう派生してきたのか一念発起して調べてみました。</p>
<p>参考文献はWikipediaです(キリッ</p>
<p>僕と同じく <code>sh</code> を適当に設定している人は多いと思いますが、たんなる <code>sh</code> は今では他のシェルへのエイリアスなので、その先が何なのかを確認しなければなりません。bashは <code>sh</code> をさらに高機能にしたもので、もっとも普及しています。大抵のLinuxディストリビューションや、Mac OSのターミナルで標準に指定されているシェルです。</p>
<p>dashは、ubuntuを含むdebian系Linuxディストリビューションで標準に指定されているシェルです。親のashは、多くのBSD系で標準のシェルです。また、kshを親に持つzshもあります。kshやzshはそれほど標準のシェルに採用されているわけではありませんが、zshはbashのように振る舞う互換モードを備えていて、その便利さからファンも多いです。</p>
<p>bashとdashとzshはそれぞれ祖先に <code>sh</code> をもっており、 <code>sh</code> の機能については互換性があります。これに対して、祖先が <code>sh</code> でないものもあり、その一つがcshです。cshはC言語風に書けるシェルで、いまではcshから派生したtcshが多く利用されます。cshはshと同じthompson shellを親に持っており、そのためcshとshとは互換性がありません。</p>
<p>そんなややこしい関係性があるシェルの世界ですが、この図さえあればもうshebangに困りませんね。ご査収ください。</p>
<p><img src="https://cdn-images.postach.io/ce30bbdf-40c6-4a7b-9fbc-75ad41d0b272/2a8cb115-fd5a-4bb6-b796-5c1505dcfe6f/bdba4c8d-1b90-4fc6-bdc9-3da772df6e87.png" style="width: 1197px; height: auto;"/></p>
<p>参考:Wikipedia <a href="http://ja.wikipedia.org/wiki/%E3%82%B7%E3%82%A7%E3%83%AB">シェル</a>, <a href="http://ja.wikipedia.org/wiki/Bourne_Shell">Bourne Shell</a>, <a href="http://ja.wikipedia.org/wiki/Bash">bash</a> など</p>
javaでファイルのタイムスタンプを更新する
http://noriaki.dev/post/javadehuairunotaimusutanpuwogeng-xin-suru
2015-04-06T07:57:42.990000Z
2015-04-06T07:52:37Z
Noriaki Horiuchi
<p>linuxでいう <code>touch</code> コマンドのようなことをするには、<a href="http://docs.oracle.com/javase/7/docs/api/java/io/File.html#setLastModified%28long%29">File#setLastModified</a>にて可能です。</p>
<pre><code>File file = new File("path")
file.setLastModified(System.currentTimeMillis)
</code></pre>
Xcodeのプロジェクトナビゲータで、ファイル名の右側に表示されるMはどういう意味?
http://noriaki.dev/post/xcodenopuroziekutonabigetade-huairuming-noyou-ce-nibiao-shi-sarerumhadouiuyi-wei
2015-03-14T08:47:22.391000Z
2015-03-14T08:39:38Z
Noriaki Horiuchi
<p>Xcodeの左ペイン、プロジェクトナビゲータ(⌘1)で、ファイル名の右側に表示されるMやAはどういう意味かわからなかったので調べました。</p>
<p>これは、Gitリポジトリ上でのソースコードの状態を表すアイコンです。実はXcodeではgitが使えます。考えてみればモダンなIDEですのでまぁ当たり前なのですが、言われるまでわかりませんよね。</p>
<p>意味は以下のとおりです。</p>
<ul>
<li>M<ul>
<li>変更された</li>
</ul>
</li>
<li>A <ul>
<li>追加された</li>
</ul>
</li>
<li>? <ul>
<li>追跡されていない</li>
</ul>
</li>
</ul>
<hr />
<p>参考: <a href="http://objc-lovers.com/archives/154">Xcodeで使われている文字アイコンの意味まとめ</a></p>
XcodeでコメントにTODOとかFIXMEを使うには
http://noriaki.dev/post/xcodedekomentonitodotokafixmewoshi-uniha
2015-03-14T09:12:40.483000Z
2015-03-14T08:30:32Z
Noriaki Horiuchi
<p>あとで取り組むときに付けたいコメント内タグですが、Xcodeではタグだけ抽出して一覧表示することができないみたいでガッカリ…</p>
<p>追記: プラグインがあるらしい<br />
<a href="http://www.iosjp.com/dev/archives/1012">Xcodeプラグイン XToDo <code>TODO</code>など特殊タグの一覧管理用Xcodeプラグイン</a></p>
<p>ジャンプバー(上部のパンくずリスト)に表示したり、コンパイラに警告させることはできるみたいので、一応紹介しておきます。</p>
<p>デフォルトでは以下の5種類があります。適宜使い分けてください。</p>
<p>// MARK:</p>
<p>// TODO:<br />
// FIXME:<br />
// !!!:<br />
// ???:</p>
<p>一覧させたければcmd+shift+Fのプロジェクト内検索で。</p>
<hr />
<p><a href="http://d.hatena.ne.jp/h_mori/20110720/1311190752">Xcode4のTODOタグを警告に出力する</a></p>
<p><a href="http://iosdevelopertips.com/xcode/swift-replacement-pragma.html">Swift’s Answer to #pragma mark, FIXME and TODO</a></p>
<p><a href="http://blog.f60k.com/xcode-todo-fixme-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/">Xcode TODO FIXME の使い方</a></p>