<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on ゲンゾウ用ポストイット</title><link>https://genzouw.com/posts/</link><description>Recent content in Posts on ゲンゾウ用ポストイット</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Tue, 02 Jan 2024 08:20:13 +0900</lastBuildDate><atom:link href="https://genzouw.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Bashの組み込みコマンド "bc" を使ってみる</title><link>https://genzouw.com/entry/2023/12/30/091144/3607/</link><pubDate>Sat, 30 Dec 2023 09:11:44 +0900</pubDate><guid>https://genzouw.com/entry/2023/12/30/091144/3607/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bash でコマンドを実行しているときにコマンドをうち間違えたことは何度もありますよね。&lt;/p&gt;&#10;&lt;p&gt;間違えただけではなく、過去に実行したコマンドのスペルを忘れてしまったり、引数やオプションを忘れてしまったりも一度ならず何度もあるはずです。&lt;/p&gt;&#10;&lt;p&gt;Bash にはヒストリ機能があるため上矢印キーや下矢印キーで過去に実行されたコマンドの履歴をたどることができますが、 &lt;code&gt;fc&lt;/code&gt; コマンドを利用することで過去に実行したコマンドの再利用が更にはかどります。&lt;/p&gt;&#10;&lt;p&gt;今回は &lt;code&gt;fc&lt;/code&gt; コマンドの使い方について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu 22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="fc-コマンドの概要"&gt;&amp;ldquo;fc&amp;rdquo; コマンドの概要&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;fc&lt;/code&gt; コマンドは、Bash の組み込みコマンドの 1 つです。&#10;&lt;strong&gt;&amp;ldquo;fix command&amp;rdquo;&lt;/strong&gt; の 2 つの単語の頭文字をとって &lt;code&gt;fc&lt;/code&gt; コマンドと名付けられているようです。&#10;具体的には、次のような機能を持っています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;過去に実行したコマンドを一覧表示&lt;/li&gt;&#10;&lt;li&gt;直前に実行したコマンドをエディタで編集し実行&lt;/li&gt;&#10;&lt;li&gt;過去に実行した任意のコマンドをエディタで編集し実行&lt;/li&gt;&#10;&lt;li&gt;過去に実行した複数のコマンドをひとまとめに実行&lt;/li&gt;&#10;&lt;li&gt;直前に実行したコマンドを編集せずに実行&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;fc&lt;/code&gt; コマンドは Bash だけでなく、Zsh でも使用できます。&#10;Mac OS ユーザーでも学習しておいて損はありません。&lt;/p&gt;&#10;&lt;h2 id="過去に実行したコマンドを一覧表示"&gt;過去に実行したコマンドを一覧表示&lt;/h2&gt;&#10;&lt;p&gt;ターミナル上の作業から一時的に離れたのち戻ってきたら何をしていたか忘れていました、なんてことがあります。&#10;複数のコマンドを順番に 1 つ 1 つ実行していたが、どこまで実行したか忘れてしまったといったこともあります。&lt;/p&gt;</description></item><item><title>シェルスクリプトで標準出力と標準エラー出力を入れ替える</title><link>https://genzouw.com/entry/2023/12/29/083812/3595/</link><pubDate>Fri, 29 Dec 2023 08:38:12 +0900</pubDate><guid>https://genzouw.com/entry/2023/12/29/083812/3595/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;あまり利用する機会はありませんが、今回はシェルスクリプトを使って、標準出力と標準エラー出力を入れ替える方法についてお話しします。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="解答"&gt;解答&lt;/h2&gt;&#10;&lt;p&gt;珍しく解答を掲載した後、ブログ記事を書きます。&lt;/p&gt;&#10;&lt;p&gt;次のコマンドはどちらを使っても標準出力、標準エラー出力を入れ替えることができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt; 3&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; 1&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt; 3&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; 1&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="解説"&gt;解説&lt;/h2&gt;&#10;&lt;h3 id="ファイル記述子--ファイルディスクリプタ--について"&gt;ファイル記述子 ( ファイルディスクリプタ ) について&lt;/h3&gt;&#10;&lt;p&gt;ファイル記述子 ( ファイルディスクリプタ ) とは、プログラムがファイルやデバイスとやり取りするために使用する識別子のことです。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;ファイル記述子について当ブログで紹介したこともあるので、よけれご参考ください&lt;/em&gt; 。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/05/28/090021/1556/"&gt;オープンできるファイル数上限を管理する「ファイルディスクリプタ」について( &lt;code&gt;Too many open files&lt;/code&gt; エラーを理解する ) | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Bash シェルにおけるファイル記述子には、次の 3 種類があります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;標準入力 ( stdin )&#10;標準入力は、プログラムにデータを入力するファイル記述子です。&#10;通常、キーボードからの入力が標準入力として扱われます。&#10;パイプを使用することで、標準入力にキーボードからの入力ではなく、別のプロセスからの出力を渡すことができます。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;標準出力 ( stdout )&#10;標準出力は、プログラムから出力されるデータを受け取るファイル記述子です。&#10;通常、コンソールに出力されます。&#10;プログラムが標準出力を使用すると、コンソールにデータを表示できます。&lt;/p&gt;</description></item><item><title>Github Copilot in the CLI を使ってみる</title><link>https://genzouw.com/entry/2023/12/20/110833/3592/</link><pubDate>Wed, 20 Dec 2023 11:08:33 +0900</pubDate><guid>https://genzouw.com/entry/2023/12/20/110833/3592/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;先日Githubからメールが届きました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;You have been granted access to GitHub Copilot in the CLI.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ようやく &lt;strong&gt;Github Copilot in the CLI&lt;/strong&gt; が利用できるようになりました。&lt;/p&gt;&#10;&lt;p&gt;今までは Vim 環境でだけGithub Copilot を使うことができましたが、コマンドライン環境からCopilotの力を利用できることになるのでしょうか？と思い早速試してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="作業の流れ--作業ログ-"&gt;作業の流れ ( 作業ログ )&lt;/h2&gt;&#10;&lt;p&gt;まずはメールのリンクに書かれていたドキュメントページから概要や使い方を学んでいくことにしました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.github.com/en/copilot/github-copilot-in-the-cli/about-github-copilot-in-the-cli"&gt;About GitHub Copilot in the CLI - GitHub Docs&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="github-copilot-in-the-cli-の概要"&gt;Github Copilot in the CLI の概要&lt;/h3&gt;&#10;&lt;p&gt;Github Copilot in the CLI を使うと、ターミナル操作中にコマンドの候補を提示してくれたり、コマンドの説明を提示してくれたりするそうです。&lt;/p&gt;&#10;&lt;p&gt;_2023-12-19現在はパブリックベータとして提供されているサービスですので、まだまだ基本機能や使い方が変わっていくかもしれません。&#10;_&lt;/p&gt;&#10;&lt;p&gt;以降、Copilot CLI と省略します。&lt;/p&gt;</description></item><item><title>生物の進化から学ぶシステムの進化 - Timee Advent Calendar 2023</title><link>https://genzouw.com/entry/2023/12/08/000027/3572/</link><pubDate>Fri, 08 Dec 2023 00:00:27 +0900</pubDate><guid>https://genzouw.com/entry/2023/12/08/000027/3572/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今の組織には話がうまいエンジニアばかりです。&#10;僕は自分のことを語るのが苦手です。&lt;/p&gt;&#10;&lt;p&gt;そんな僕にも「アドベントカレンダーの記事を書いてほしい」というお願いがありました。&#10;記事を書かなければならないということで、今までエンジニアという仕事を通じて僕が感じてきた「システムの進化」と「生物の進化」の似ている点について書いてみることにしました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;お断りしておくと、このエントリで述べる内容は多分に自分の体験・主観に基づいたものとなっており、現職の組織を代表するものではありません&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;p&gt;「生物の進化とシステムの進化を同じように考えるのは短絡的だ」という意見が上がるだろうということは予想されますが少しでも興味があればお付き合いください。&lt;/p&gt;&#10;&lt;h2 id="収斂進化--どれを選んでも結局同じような仕組みになる"&gt;収斂進化 : どれを選んでも結局同じような仕組みになる&lt;/h2&gt;&#10;&lt;p&gt;アプリケーションの初期開発時やリプレイス時に「どの言語でシステムを開発するか」の議論になります。&#10;各社ごとにメインとするプログラミング言語を決定しています。&#10;僕も今まで Java、C#、PHP、JavaScript、Go、 Python、 Ruby といろいろな言語の使用を決定した組織でWebシステムの開発に携わりました。&#10;言語ごとに言語仕様に違いはありますが、俯瞰してみるとシステム構成の要素は似たようなものが必要となります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;データベース接続&lt;/li&gt;&#10;&lt;li&gt;ログイン認証・認可・ACL&lt;/li&gt;&#10;&lt;li&gt;ロギング&lt;/li&gt;&#10;&lt;li&gt;キャッシュ&lt;/li&gt;&#10;&lt;li&gt;モジュール・プラグインによる拡張&lt;/li&gt;&#10;&lt;li&gt;ライブラリ・パッケージ管理ツール&lt;/li&gt;&#10;&lt;li&gt;Linter ( コードの静的解析ツール )&lt;/li&gt;&#10;&lt;li&gt;Formatter ( コードの整形ツール )&lt;/li&gt;&#10;&lt;li&gt;ビルドツール&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;上記のような機構やツールは、いずれの言語にもフレームワークなりOSSなりSDKなりで提供されており、言語前提の選定基準にはならないと考えています。&#10;処理性能はプログラミング言語ごとに差はありますが、実際言語選定時に重要視しているケースは多くないのではないかと思います。&#10;( 処理性能が重要視されているなら、いくつかの言語は選定外から外れるはずですよね )&#10;これらの問題も、キャッシュを上手に利用するなど工夫すれば解決可能なためと考えています。&lt;/p&gt;&#10;&lt;p&gt;どの言語でも必要な周辺システム ( エコシステム ) が必ず出来上がっていくことに不思議さを覚えます。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;僕は生物学の中でもよく知られている現象である「収斂進化」を連想します。&lt;/p&gt;&#10;&lt;p&gt;異なるグループの生物が、環境に適応するために同じような形質 ( 見た目、機能 ) を獲得するという現象です。&lt;/p&gt;&#10;&lt;p&gt;具体例を見ていきましょう。&lt;/p&gt;&#10;&lt;p&gt;サメとイルカはどちらも海の生物です。&#10;海の中を上手に泳ぎながら生活しています。&#10;見た目はどちらも魚のようであり、背びれ、尾びれ、胸びれがあります。&#10;ところがサメは軟骨魚類、イルカは哺乳類であり、両者は別の生物群として分類されます。&#10;御存知の通りイルカの祖先は陸上で四本足で生活していたと言われていますから、独自の進化を経て、ひれを手に入れたことになります。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2023/12/Untitled.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;哺乳類であるもぐらと昆虫のケラも収斂進化の例としてあげられます。&#10;両者とも地中で土を掘りながら生活している生物ですが、土を掘り進むために鍬のような前足と細長くでっぱりが無い体を持っています。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2023/12/Untitled-1.png" alt=""&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;僕は生物もシステムも同じ圧力が加えられれば同じような形質を獲得すると考えています。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;生物&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;システム&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;圧力&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;環境圧&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;要件&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;具体例&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;土の中、水の中、樹上、極寒&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Web系、組込系、基幹系、デスクトップアプリ、0.1s以外のレスポンス&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;言語の選定に影響を与えるのは、非技術的要因のほうが大きいと思います。&#10;( エンジニアメンバーのスキル、声の大きなメンバーの好み、対外的な視点・採用戦略など )&lt;/p&gt;</description></item><item><title>OIDCを使ってGithub ActionsからAWSにアクセスする仕組みについて理解を整理してみた</title><link>https://genzouw.com/entry/2023/08/16/174745/3549/</link><pubDate>Wed, 16 Aug 2023 17:47:45 +0900</pubDate><guid>https://genzouw.com/entry/2023/08/16/174745/3549/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Github Actions から AWS クラウドリソースを操作するために&lt;code&gt;ACCESS_KEY&lt;/code&gt;、&lt;code&gt;SECRET_ACCESS_KEY&lt;/code&gt;を使う方法はもう古い、OIDCを使うのが一般的といわれましたが理解していなかったため整理しました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;今回取り上げる &lt;strong&gt;CI/CD ( ビルド ) パイプライン&lt;/strong&gt; は &lt;strong&gt;Github Actions&lt;/strong&gt; に限定しています。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;クラウドプロバイダー&lt;/strong&gt; に関しても、 &lt;strong&gt;AWS&lt;/strong&gt; に限定しています。&lt;/p&gt;&#10;&lt;p&gt;ただしアーキテクチャはCI/CDパイプラインがCircleCIやCloudBuild、クラウドプロバイダーがGCPやAzureに置き換えられたとしても適用可能なものと考えられます。&lt;/p&gt;&#10;&lt;h2 id="パスワードやアクセストークンを使ってgithub-actionsからクラウドへ認証する方法の問題点"&gt;パスワードやアクセストークンを使ってGithub Actionsからクラウドへ認証する方法の問題点&lt;/h2&gt;&#10;&lt;p&gt;Github ActionsのようなCI/CDパイプラインから、クラウド環境 ( AWS、Azure、GCP&amp;hellip; ) にアクセスするケースは多いはずです。&lt;/p&gt;&#10;&lt;p&gt;ビルドされたソフトウェアやコンテナイメージはいずれデプロイされますし、デプロイ環境としてクラウド環境 ( ex: AWS ) が利用されることが多いからです。&lt;/p&gt;&#10;&lt;p&gt;Github Actionsがクラウド上のリソースにアクセスするために、事前にパスワードやアクセストークンといった認証情報を取得しておく必要があります。&lt;/p&gt;&#10;&lt;p&gt;これらの認証情報はGithubの &lt;strong&gt;secrets&lt;/strong&gt; に保存することが多いでしょう。&#10;Github Actionsワークフローは実行のたびに &lt;strong&gt;secrets&lt;/strong&gt; から認証情報を取り出し、これを使ってクラウド環境へのアクセスを可能にします。&lt;/p&gt;&#10;&lt;p&gt;しかし、このような &lt;strong&gt;secrets&lt;/strong&gt; を使う方法には問題があります。&#10;以下のような手間が発生します。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;クラウド上のIAMサービスで認証情報を生成する&lt;/li&gt;&#10;&lt;li&gt;生成した認証情報をGithubのsecretsに登録する&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;つまり、認証情報が二重管理されることになります&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;h2 id="oidc--openid-connect--を使うメリット"&gt;OIDC ( OpenID Connect ) を使うメリット&lt;/h2&gt;&#10;&lt;p&gt;そこで登場するのがOIDC ( OpenID Connect ) です。&lt;/p&gt;&#10;&lt;p&gt;OIDCを使うと、Github Actionsワークフローがクラウドプロバイダーに対して要求するアクセストークンは、有効期限の短いものとなります。&lt;/p&gt;&#10;&lt;p&gt;もちろんOIDC認証による認証をサポートされているクラウドプロバイダーでしか利用できない方式ではありますが、現在はほとんどのクラウドプロバイダー ( AWS、Azune、GCP、HashiCorp Vault&amp;hellip; ) がOIDCをサポートしています。&lt;/p&gt;</description></item><item><title>Github Actions入門その5-式と関数</title><link>https://genzouw.com/entry/2023/05/07/081025/3519/</link><pubDate>Sun, 07 May 2023 08:10:25 +0900</pubDate><guid>https://genzouw.com/entry/2023/05/07/081025/3519/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;以下のエントリに引き続き、Github Actions を学習して学んだことをまとめて見ました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/04/22/082900/3490/"&gt;Github Actions 入門その 1-概要と用語の整理 | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/04/26/062946/3498/"&gt;Github Actions 入門その 2-簡単なワークフローを作成してみる | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/04/27/104439/3501/"&gt;Github Actions 入門その 3-アクションを探す・使う・自作する | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/04/30/082333/3508/"&gt;Github Actions 入門その 4-環境変数/スクリプト/Artifacts を使う | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;今回は Github Actions の学習シリーズの第 5 弾として、ワークフローの YAML 設定ファイル内で使用可能な式について解説します。&#10;その後、式の種類や使い方について説明していきます。&lt;/p&gt;&#10;&lt;h2 id="式について"&gt;式について&lt;/h2&gt;&#10;&lt;p&gt;環境変数の設定や実行中のワークフローの状態を取得するために「式」を利用できます。&lt;/p&gt;&#10;&lt;p&gt;式を使うと、以下のようなことができます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;リテラルの結合&lt;/li&gt;&#10;&lt;li&gt;実行中の環境情報の取得 ( 実行者、仮想マシン、等 )&lt;/li&gt;&#10;&lt;li&gt;関数呼び出し ( 値の加工等 )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;算術計算のために演算子を使うこともできます。&lt;/p&gt;&#10;&lt;p&gt;式は &lt;code&gt;if&lt;/code&gt; キーワードと一緒に利用されることが多いです。&#10;プログラミング言語のように、 &lt;code&gt;if&lt;/code&gt; で指定した式の値が &lt;code&gt;true&lt;/code&gt; となったときに、該当のステップが実行されます。&lt;/p&gt;&#10;&lt;p&gt;「文字列」ではなく「式」であると Github Actions に認識させるためには、以下の構文を使います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;${{ &amp;lt;式&amp;gt; }}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;if&lt;/code&gt; キーワードの値として式を使用した場合は、 &lt;code&gt;${{ ... }}&lt;/code&gt; の構文を指定しないこともあります。&#10;というのも、Github Actions は &lt;code&gt;if: &lt;/code&gt; 以降に指定した記述を「式」として評価・処理するためです。&#10;&lt;code&gt;if: &lt;/code&gt; 以降の記述に関しては、冗長かもしれませんが &lt;code&gt;${{ ... }}&lt;/code&gt; の形式で記述しておくのが間違いないでしょうし、チームメンバにとってもわかりやすいでしょう。&lt;/p&gt;</description></item><item><title>ローカルPC内でGithub Actionsを実行する - 'nekos/act'</title><link>https://genzouw.com/entry/2023/05/02/083434/3510/</link><pubDate>Tue, 02 May 2023 08:34:34 +0900</pubDate><guid>https://genzouw.com/entry/2023/05/02/083434/3510/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Github Actions の設定ファイルを記述した後、正しく動作するかを確認するために毎回リモートリポジトリにプッシュするのが面倒だなと思ったので良い方法が無いかと調べてみました。&#10;すると、ローカルで Github Actions の実行が可能なツールが見つかったので、検証してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="見つけたツール--nektosact"&gt;見つけたツール : &lt;code&gt;nektos/act&lt;/code&gt;&lt;/h2&gt;&#10;&lt;p&gt;利用するツールは以下になります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/nektos/act"&gt;GitHub - nektos/act: Run your GitHub Actions locally ?&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;概要を見る限りは自分の目的にフィットしています。&lt;/p&gt;&#10;&lt;h2 id="nektosact-ってどんなツール"&gt;&lt;code&gt;nektos/act&lt;/code&gt; ってどんなツール？&lt;/h2&gt;&#10;&lt;p&gt;Github Actions をローカルで実行するためのツールとのことです。&lt;/p&gt;&#10;&lt;p&gt;このツールを導入するメリットは以下となります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;.github/workflows&lt;/code&gt; ディレクトリ配下に設定ファイルを作成、変更した後、 commit/push しなくてもテストできるため開発効率が上がる&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Makefile&lt;/code&gt; でタスクを管理することもできますが、 &lt;code&gt;.github/worflows&lt;/code&gt; とタスクが重複し DRY ではなくなります。&#10;ローカルで実行できれば &lt;code&gt;Makefile&lt;/code&gt; が不要となります。&#10;&lt;ul&gt;&#10;&lt;li&gt;(この点については、 Github Actions から &lt;code&gt;make&lt;/code&gt; を呼ぶことで回避できると思いますが公式ページのメリットとして書かれていました )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="nektosact-って何をしてくれるに"&gt;&lt;code&gt;nektos/act&lt;/code&gt; って何をしてくれるに？&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;act&lt;/code&gt; コマンドが提供されます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;act&lt;/code&gt; コマンドを実行すると、 &lt;code&gt;.github/workflows/&lt;/code&gt; ディレクトリから設定ファイルを読み込み、実行すべきアクションのセットを決定します。&#10;実行されるアクションを決定するためには「イベント」 ( &lt;code&gt;push&lt;/code&gt;、&lt;code&gt;branch&lt;/code&gt;作成など ) を指定しなければいけませんが、明示しなければ &lt;code&gt;push&lt;/code&gt; イベントが発生したものとして解釈されます。&#10;ワークフローファイルで定義されているように、Docker API を使用して必要なイメージをプルまたはビルドし、定義された依存関係に基づいて実行パスを最終的に決定します。&lt;/p&gt;</description></item><item><title>Github Actions入門その4-環境変数/スクリプト/Artifactsを使う</title><link>https://genzouw.com/entry/2023/04/30/082333/3508/</link><pubDate>Sun, 30 Apr 2023 08:23:33 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/30/082333/3508/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;以下のエントリに引き続き、Github Actions を学習して学んだことをまとめて見ました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/04/22/082900/3490/"&gt;Github Actions 入門その 1-概要と用語の整理 | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/04/26/062946/3498/"&gt;Github Actions 入門その 2-簡単なワークフローを作成してみる | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/04/27/104439/3501/"&gt;Github Actions 入門その 3-アクションを探す・使う・自作する | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;このエントリでは、カスタマイズのテクニックについて触れていきます。&#10;変数の使用方法、スクリプトの実行方法、ジョブとジョブの間をつなぐための方法により、カスタマイズが可能です。&lt;/p&gt;&#10;&lt;h2 id="ワークフローの中で変数を使う"&gt;ワークフローの中で変数を使う&lt;/h2&gt;&#10;&lt;p&gt;Github Actions では、ワークフローが実行されるたびに &lt;a href="https://docs.github.com/en/actions/learn-github-actions/variables#default-environment-variables"&gt;割り当てられるデフォルトの環境変数&lt;/a&gt; があります。&#10;デフォルトの環境変数だけで不十分であれば、独自に環境変数を追加することも可能です。&#10;ワークフローの YAML 設定ファイルに定義することでこれを実現できます。&lt;/p&gt;&#10;&lt;p&gt;サンプルコードを見ていきましょう。&#10;以下のサンプルコードでは、 &lt;code&gt;POSTGRES_HOST&lt;/code&gt; と &lt;code&gt;POSTGRES_PORT&lt;/code&gt; という 2 つの環境変数を作成しています。&#10;環境変数は &lt;code&gt;node client.js&lt;/code&gt; の中で参照可能です( Github Actions のなかでは、 Node.js はデフォルトで利用可能みたいです )。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;use-environment-variables&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;run-name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;use-environment-variables&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;push&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;use-environment-variables&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;runs-on&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ubuntu-22.04&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;uses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;actions/checkout@v3&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;node .github/scripts/use_environment_variables.js&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;env&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;POSTGRES_HOST&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;postgres_host&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;POSTGRES_PORT&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;5432&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;呼び出している JavaScript のコードは以下のようになっています。&lt;/p&gt;</description></item><item><title>Github Actions入門その3-アクションを探す・使う・自作する</title><link>https://genzouw.com/entry/2023/04/27/104439/3501/</link><pubDate>Thu, 27 Apr 2023 10:44:39 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/27/104439/3501/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;前々回、前回と Github Actions に登場する用語の整理した後、実際の YAML 設定ファイルの各項目と用語の対応を見てきました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/04/22/082900/3490/"&gt;Github Actions 入門その 1-概要と用語の整理 | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/04/26/062946/3498/"&gt;Github Actions 入門その 2-簡単なワークフローを作成してみる | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;アクション ( Action ) は１つ以上のステップで構成されたブロックです。&lt;/p&gt;&#10;&lt;p&gt;ワークフローは、１つ以上のジョブを持ち、ジョブは１つ以上のステップを持ちます。&#10;( 詳細は以下を参照 )&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/04/22/082900/3490/"&gt;Github Actions 入門その 1 ( 概要と用語の整理 ) | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ステップは独自のシェルコマンドを記述しても良いのですが、アクションを指定できます。&#10;アクションは Github で公開されているものを指定したり、自作したものを利用することもできます。&lt;/p&gt;&#10;&lt;p&gt;今回はアクションの探し方、使い方、自作方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="概要"&gt;概要&lt;/h2&gt;&#10;&lt;p&gt;ワークフローの中で利用するアクションは以下のいずれかの方法で提供されます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ワークフローが実行される Github リポジトリ内(当然、 &lt;code&gt;git commit &amp;amp;&amp;amp; git push&lt;/code&gt; されています)&lt;/li&gt;&#10;&lt;li&gt;Github の公開リポジトリ&lt;/li&gt;&#10;&lt;li&gt;Docker Hub 上の公開 Docker イメージ&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="公開されているアクションの探し方"&gt;公開されているアクションの探し方&lt;/h2&gt;&#10;&lt;p&gt;Github コミュニティで作成されたアクションを探す場合は、 &lt;a href="https://github.com/marketplace?type=actions"&gt;Github Marketplace&lt;/a&gt; というサイトを利用するのが良いでしょう。&#10;キーワード検索もできますし、カテゴリ分類されているので役割の観点から探すこともできます。&lt;/p&gt;&#10;&lt;h2 id="github-marketplace-で見つけたアクションを追加"&gt;Github Marketplace で見つけたアクションを追加&lt;/h2&gt;&#10;&lt;p&gt;実際に &lt;a href="https://github.com/marketplace?type=actions"&gt;Github Marketplace&lt;/a&gt; から検索したアクションを使ってみましょう。&lt;/p&gt;</description></item><item><title>Github Actions入門その2-簡単なワークフローを作成してみる</title><link>https://genzouw.com/entry/2023/04/26/062946/3498/</link><pubDate>Wed, 26 Apr 2023 06:29:46 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/26/062946/3498/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;前回は Github Actions の概要と用語の整理をしました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/04/22/082900/3490/"&gt;Github Actions 入門その 1-概要と用語の整理 | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Github 上で実行できるワークフローを構築するためのサービスです。&#10;Github 上でのソースコードの変更をトリガーにして、自動的にビルドやテストなどのワークフローを実行できます。&#10;Unbutu、Windows、macOS などの環境で実行でき、必要なリソースを設定することで、ビルドなどのタスクを実行できます。&lt;/p&gt;&#10;&lt;p&gt;今回は、サンプルコードを触って Github Actions を実際に操作してみます。&lt;/p&gt;&#10;&lt;h2 id="簡単なワークフローを作成してみる"&gt;簡単なワークフローを作成してみる&lt;/h2&gt;&#10;&lt;p&gt;Github Actions では、ワークフローの設定を YAML 形式で記述します。&lt;/p&gt;&#10;&lt;p&gt;それぞれのワークフローは YAML 形式のファイル 1 つで表現されます。&#10;その YAML をワークフローを実行させたい Github リポジトリの &lt;code&gt;.github/workflows&lt;/code&gt; というディレクトリに配置します。&lt;/p&gt;&#10;&lt;p&gt;ワークフローは、トリガーとなるイベント ( 例えば git push ) が発生したタイミングで実行されます。&lt;/p&gt;&#10;&lt;p&gt;ここからは実際にワークフロー設定ファイルを見ていきます。&lt;/p&gt;&#10;&lt;p&gt;以下のようなワークフローを作成してみます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;プッシュのタイミングで実行される&lt;/li&gt;&#10;&lt;li&gt;Node.js のツールである &lt;code&gt;bats&lt;/code&gt; をインストールする&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;bats -v&lt;/code&gt; コマンドを実行する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;まずはローカルに Git ワークスペースを作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir learning-github-actions&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; learning-github-actions&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git init&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;対応する Git リモートリポジトリを作成します。&#10;ここでは Github CLI ( &lt;code&gt;gh&lt;/code&gt; コマンド) を使って作成しますが、もちろんブラウザ経由で作成しても構いません。&lt;/p&gt;</description></item><item><title>Github Actions入門その1-概要と用語の整理</title><link>https://genzouw.com/entry/2023/04/22/082900/3490/</link><pubDate>Sat, 22 Apr 2023 08:29:00 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/22/082900/3490/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今の組織で CICD のプラットフォームとして &lt;strong&gt;Github Actions&lt;/strong&gt; メインに切り替えています。&lt;/p&gt;&#10;&lt;p&gt;今後更にこの流れが進みそうなので Github Actions について一から学びなおしてみようと思いました。&lt;/p&gt;&#10;&lt;h2 id="github-actions-とは"&gt;Github Actions とは&lt;/h2&gt;&#10;&lt;p&gt;Github が提供している CI ( continuous integration ) と CD ( continuous delivery ) を実現するためのプラットフォームです。&lt;/p&gt;&#10;&lt;h3 id="cicd-パイプラインとは"&gt;CI/CD パイプラインとは&lt;/h3&gt;&#10;&lt;p&gt;CI とはビルド、テスト、静的解析などの開発パイプラインを示します。&#10;過去には各作業者の PC 内で実行していましたが、環境差異による実行結果の違いや実行忘れなどの問題があることから、現在のほぼすべての開発組織で導入されている仕組みです。&lt;/p&gt;&#10;&lt;p&gt;CD とは CI に加えてアプリケーションのデプロイの流れまでを含めた用語となっています。&lt;/p&gt;&#10;&lt;h3 id="github-actions-が実行されるタイミング--イベント-"&gt;Github Actions が実行されるタイミング ( イベント )&lt;/h3&gt;&#10;&lt;p&gt;実行のトリガは「Git ブランチに対して push されたタイミング」「プルリクが作成されたタイミング」「プルリクが &lt;code&gt;main&lt;/code&gt; ブランチにマージされたタイミング」など任意のタイミングが指定できます。&lt;/p&gt;&#10;&lt;p&gt;具体的な例として、「誰かが Github リポジトリに新しい Issue を作成したタイミングで、ラベルを付与する」ことができます。&lt;/p&gt;&#10;&lt;h3 id="実行環境"&gt;実行環境&lt;/h3&gt;&#10;&lt;p&gt;Linxu、Windows、macOS の仮想マシンが用意されています。&lt;/p&gt;&#10;&lt;p&gt;Github 上のマネージド環境だけでなく、オンプレ環境や他のクラウドを実行環境とすることもできます。&lt;/p&gt;&#10;&lt;p&gt;また、仮想マシンではなくコンテナ環境を利用することもできます。&lt;/p&gt;&#10;&lt;h2 id="概要"&gt;概要&lt;/h2&gt;&#10;&lt;p&gt;Github Actions の構成要素について、概要を掴んでおきます。&lt;/p&gt;&#10;&lt;p&gt;「ワークフロー」と呼ばれるものを設定します。&#10;ワークフローは Github リポジトリの中で何らかの「イベント」が発生 ( トリガー ) したときに実行されます。&#10;例えば「プルリクエストの作成」や「Issue の作成」といったイベントがあります。&lt;/p&gt;</description></item><item><title>Gitでいろいろな形式、方法でタグの一覧を出力する</title><link>https://genzouw.com/entry/2023/04/21/081007/3488/</link><pubDate>Fri, 21 Apr 2023 08:10:07 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/21/081007/3488/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Git のローカルワークスペース内でタグの一覧を出力するいろいろな方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.40.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;利用する Git リポジトリは新規に自作するのが面倒だったので、程よい数のタグを保有している適当なリポジトリを利用させていただきました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/sstephenson/bats"&gt;GitHub - sstephenson/bats: Bash Automated Testing System&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="シンプルにタグを一覧出力"&gt;シンプルにタグを一覧出力&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git clone&lt;/code&gt; したディレクトリ内でタグの一覧を出力する最もシンプルな方法は、 &lt;code&gt;git tag&lt;/code&gt; コマンドを実行することです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.2.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.3.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.3.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.4.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;⚠ 事前に以下のコマンドを実行し、ローカルのワークスペース内にリモートリポジトリ上にある最新のタグ情報を取得していることを確認しておきましょう&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git fetch --all --tags&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="コミットハッシュと一緒にタグを一覧出力"&gt;コミットハッシュと一緒にタグを一覧出力&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git show ref&lt;/code&gt; コマンドを使うことで、タグと一緒にコミットハッシュを一覧出力できます。&#10;( 正しくはコミットハッシュの一覧の後方にタグをつけて出力しているんですけどね )&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git show-ref --tags -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2f192ebffa8f8f8d1a5882e74188d6f67b295950 refs/tags/v0.1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5030f53eccc66ba9a041d1a4a28f73286de50449 refs/tags/v0.2.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0e5e44572844ce8fd027d96a5001125c33abd822 refs/tags/v0.3.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2e2477881bc52791f7bc0321599064b9daf7c6bf refs/tags/v0.3.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7b032e4b232666ee24f150338bad73de65c7b99d refs/tags/v0.4.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="名前をパターン指定してタグを一覧出力"&gt;名前をパターン指定してタグを一覧出力&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;-l&lt;/code&gt; オプション(&lt;code&gt;--list&lt;/code&gt;)を使って、指定されたパターンにマッチしたタグ名のものだけを一覧出力できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# メジャーバージョンとパッチバージョンが0となっているもののみ出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag --list &lt;span class="s1"&gt;&amp;#39;v0.*.0&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.2.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.3.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.4.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# マイナーバージョンが1または3のものののみ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag --list &lt;span class="s1"&gt;&amp;#39;v0.[13].*&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.3.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v0.3.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# これでは何もヒットしないです。部分を指定するのではなく、全体を指定しなければならない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag --list &lt;span class="s1"&gt;&amp;#39;v0.*.&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="説明文付きでタグを一覧出力"&gt;説明文付きでタグを一覧出力&lt;/h2&gt;&#10;&lt;p&gt;アノテーションメッセージ付きでタグを一覧出力するには、 &lt;code&gt;-n&lt;/code&gt; オプションを使います。&lt;/p&gt;</description></item><item><title>Gitで最新のタグを取得する方法</title><link>https://genzouw.com/entry/2023/04/21/073819/3486/</link><pubDate>Fri, 21 Apr 2023 07:38:19 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/21/073819/3486/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Git のローカルワークスペース内で最新のタグを取得するコマンドを紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.40.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="git-describe---tags-コマンドを使う"&gt;&lt;code&gt;git describe --tags&lt;/code&gt; コマンドを使う&lt;/h2&gt;&#10;&lt;p&gt;結論からいうと、 &lt;code&gt;git describe --tags&lt;/code&gt; コマンドを使うことで最新のタグを取得できます。&lt;/p&gt;&#10;&lt;h2 id="実際に試してみる"&gt;実際に試してみる&lt;/h2&gt;&#10;&lt;p&gt;ローカルに Git のローカルワークスペースを作成し動作を確認してみます。&lt;/p&gt;&#10;&lt;p&gt;まずは &lt;code&gt;git init&lt;/code&gt; でワークスペースを作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git init&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Initialized empty Git repository in /Users/genzouw/work/.git/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;適当なファイル(ここでは&lt;code&gt;test.txt&lt;/code&gt;)を作成し、内容を編集した後、コミットします。&lt;/p&gt;&#10;&lt;p&gt;それぞれのコミットタイミングでタグを付与しておきます。&#10;( それぞれ &lt;strong&gt;1&lt;/strong&gt; 、 &lt;strong&gt;2&lt;/strong&gt; 、 &lt;strong&gt;2.1&lt;/strong&gt; というタグを付与 )&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &amp;gt;&amp;gt; test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git add test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git commit -m &lt;span class="s2"&gt;&amp;#34;commit 1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &amp;gt;&amp;gt; test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git add test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git commit -m &lt;span class="s2"&gt;&amp;#34;commit 2&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag &lt;span class="m"&gt;2&lt;/span&gt; -m &lt;span class="s2"&gt;&amp;#34;Tag 2&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &amp;gt;&amp;gt; test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git add test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git commit -m &lt;span class="s2"&gt;&amp;#34;commit 3&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git tag 2.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;git log&lt;/code&gt; で確認してみると、3 つのコミットとともにタグが付与されていることがわかります。&lt;/p&gt;</description></item><item><title>docker-compose.yamlのentrypoint/commandフィールドで環境変数を使いたい</title><link>https://genzouw.com/entry/2023/04/18/083045/3484/</link><pubDate>Tue, 18 Apr 2023 08:30:45 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/18/083045/3484/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;docker-compose.yaml&lt;/code&gt; 内で環境変数を記述する際には、その展開時期に注意しましょう。&#10;&lt;code&gt;entrypoint&lt;/code&gt; や &lt;code&gt;command&lt;/code&gt; フィールドに環境変数を記述する場合には、&lt;code&gt;environment&lt;/code&gt; フィールドでの環境変数定義を参照できないため、別途工夫が必要です。&#10;また、&lt;code&gt;docker-compose up&lt;/code&gt; 実行時に、環境変数が「置換」される挙動については、使い方次第では不便な場合もあるため、注意が必要です。&lt;/p&gt;&#10;&lt;p&gt;問題点について、具体的なコードをあげて説明した後、対処法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-compose --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker Compose version v2.15.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-composeyaml-に環境変数-var-を記述した時の挙動"&gt;&lt;code&gt;docker-compose.yaml&lt;/code&gt; に環境変数 &lt;code&gt;$VAR&lt;/code&gt; を記述した時の挙動&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;docker-compose.yaml&lt;/code&gt; には &lt;code&gt;$VAR&lt;/code&gt; あるいは &lt;code&gt;${VAR}&lt;/code&gt; の形式で環境変数を記述できます。&lt;/p&gt;&#10;&lt;p&gt;環境変数の展開の挙動を確認しておきます。&lt;/p&gt;&#10;&lt;p&gt;以下のような &lt;code&gt;docker-compose.yaml&lt;/code&gt; ファイルを用意します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;bash&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;Z&amp;#34;: &lt;/span&gt;&lt;span class="l"&gt;genzouw&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entrypoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;echo &amp;#34;$X&amp;#34;,&amp;#39;$Y&amp;#39;,&amp;#34;$Z&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;YAML ファイルを配置しているディレクトリで、以下のコマンドを実行することで Docker Compose 内に記述されているイメージを使ってコンテナが立ち上がります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-compose up&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで、環境変数 &lt;code&gt;X&lt;/code&gt; 、 &lt;code&gt;Y&lt;/code&gt; を渡して起動してみます。&#10;&lt;code&gt;Z&lt;/code&gt; は &lt;code&gt;docker-compose.yaml&lt;/code&gt; 内の &lt;code&gt;environment&lt;/code&gt; フィールドで定義したものを参照してみます。&lt;/p&gt;</description></item><item><title>"2&gt;&amp;1"を使わずに標準出力と標準エラー出力を同じファイルに出力する</title><link>https://genzouw.com/entry/2023/04/16/084729/3481/</link><pubDate>Sun, 16 Apr 2023 08:47:29 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/16/084729/3481/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;標準出力と標準エラー出力を同じファイルに出力する方法について、標準的な方法である「2&amp;gt;&amp;amp;1」を使わずに簡潔に記述する方法を紹介します。&#10;この記事では、その方法を解説します。&#10;また、実際に検証した結果も紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu 22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実際に検証したスクリプト"&gt;実際に検証したスクリプト&lt;/h2&gt;&#10;&lt;p&gt;次のようなスクリプトを用意しました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello World to stdout&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello World to stderr&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行すると次のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./main.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello World to stdout&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello World to stderr&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;見ただけではわかりにくいですが、 &lt;strong&gt;&amp;ldquo;Hello World to stdout&amp;rdquo;&lt;/strong&gt; は標準出力、 &lt;strong&gt;&amp;ldquo;Hello World to stderr&amp;rdquo;&lt;/strong&gt; は標準エラー出力となっています。&lt;/p&gt;&#10;&lt;h2 id="-で標準出力をファイルに出力する方法"&gt;&amp;ldquo;&amp;gt;&amp;rdquo; で標準出力をファイルに出力する方法&lt;/h2&gt;&#10;&lt;p&gt;標準出力をファイルに出力する方法として、「&amp;gt;」を使う方法があります。&lt;/p&gt;&#10;&lt;p&gt;次のように記述します。&#10;実行した結果、標準エラー出力のみが出力されています。&lt;/p&gt;</description></item><item><title>AWS CodeWhispererを使うためにセットアップを進めたがVimから利用できないことがわかり諦める</title><link>https://genzouw.com/entry/2023/04/16/072320/3477/</link><pubDate>Sun, 16 Apr 2023 07:23:20 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/16/072320/3477/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;きっかけは以下の記事を見たことです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;[AWS 版 GitHub Copilot となる「Amazon CodeWhisperer」が正式版に。&#10;個人ユーザーは無料、VSCode に対応 － Publickey] ( &lt;a href="https://www.publickey1.jp/blog/23/awsgithub_copilotamazon_codewhisperervscode.html"&gt;https://www.publickey1.jp/blog/23/awsgithub_copilotamazon_codewhisperervscode.html&lt;/a&gt; )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;正式版となった上に、個人ユーザーは無料。&#10;OpenAI 様にはそこそこのお金を払っているわけですが、無料のものが利用できるとなれば乗っかりたいところです。&#10;またビジネス版でも $19 とまあまあ許容範囲かと思いました。&#10;Github Copilot との違いも把握しておきたいです。&lt;/p&gt;&#10;&lt;p&gt;となれば早速使ってみなければ。&lt;/p&gt;&#10;&lt;h2 id="作業の流れ--作業ログ-"&gt;作業の流れ ( 作業ログ )&lt;/h2&gt;&#10;&lt;p&gt;いつものように AWS Console にログインし、上部の検索エリアから検索してみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;whisper&lt;/strong&gt; と入力しようとしたらすでに候補が上がってきました。&#10;見つかったページをクリックしました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=15EztqI9_DRQcmpumJNxXgf8AYQ6qrw-v" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;メニューをクリックすると以下のようなページが表示されました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1nKfubSRazSX8j7ppPp5f6t5in-UIjLdP" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Get started&lt;/strong&gt; をクリック。&lt;/p&gt;&#10;&lt;p&gt;残念。&#10;利用のためには事前準備が必要とのこと。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1lAIap2CRKM97sqXzHKBEOR9tACsCvG-u" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;IAM Identity Center&lt;/strong&gt; が有効になっていないので、事前に有効にしなければなりません。&lt;/p&gt;&#10;&lt;h3 id="iam-identity-center-有効化"&gt;IAM Identity Center 有効化&lt;/h3&gt;&#10;&lt;p&gt;以下のページを参考に、 &lt;strong&gt;IAM Identity Center&lt;/strong&gt; を有効にします。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/getting-started.html"&gt;はじめに - AWS IAM Identity Center ( successor to AWS Single Sign-On )&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Active Directory のような LDAP データベースとつないで ID 管理を容易にするサービスのようです。&#10;自分個人で利用するので当然そんな DB は持ち合わせていませんが、必要だということなので有効化しておきましょう。&lt;/p&gt;</description></item><item><title>ChatGPTをVimから利用するためのプラグイン"vim-chatgpt"を触ってみる</title><link>https://genzouw.com/entry/2023/04/07/173908/3472/</link><pubDate>Fri, 07 Apr 2023 17:39:08 +0900</pubDate><guid>https://genzouw.com/entry/2023/04/07/173908/3472/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Vim から ChatGTP の恩恵を受けたいと思ったので、良さそうなプラグインを探してみたところ以下のようなプラグインを見つけたので、検証を兼ねて調べてみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/CoderCookE/vim-chatgpt"&gt;GitHub - CoderCookE/vim-chatgpt: Vim Plugin For ChatGPT&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvim --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NVIM v0.9.0-dev-3548+gaa04efcf5-dirty&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Build type: Release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;LuaJIT 2.1.0-beta3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Features: +acl +tui&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;See &lt;span class="s2"&gt;&amp;#34;:help feature-compile&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; システム vimrc: &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$VIM&lt;/span&gt;&lt;span class="s2"&gt;/sysinit.vim&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 省略時の &lt;span class="nv"&gt;$VIM&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;/opt/homebrew/Cellar/neovim/HEAD-aa04efc/share/nvim&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Run :checkhealth &lt;span class="k"&gt;for&lt;/span&gt; more info&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="chatgpt-vim-plugin-vim-chatgpt-とは"&gt;ChatGPT Vim Plugin &amp;ldquo;vim-chatgpt&amp;rdquo; とは？&lt;/h2&gt;&#10;&lt;p&gt;OpenAI 者が提供するサービス ChatGPT の API を使って Vim 上での編集作業を効率化するためのプラグインです。&lt;/p&gt;&#10;&lt;p&gt;コードロジックに関する「説明」や「改善」について尋ねることができます。&lt;/p&gt;&#10;&lt;p&gt;プラグインを使うと、ChatGPT に説明を求めたり、レビューしてもらったり、修正してもらったコード部分をハイライトすることができます。&lt;/p&gt;&#10;&lt;h2 id="利用の前提条件"&gt;利用の前提条件&lt;/h2&gt;&#10;&lt;p&gt;以下のものが必要となります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Python3 がサポートされた Vim 環境&lt;/li&gt;&#10;&lt;li&gt;OpenAI の ChatGPT API Key&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;OpenAI 　社の以下のページから、自分の ChatGPT API Key を取得しておきます。&lt;/p&gt;</description></item><item><title>Koyebを使ってWebサービスをコマンドラインから立ち上げる(そして失敗)</title><link>https://genzouw.com/entry/2023/03/31/190045/3457/</link><pubDate>Fri, 31 Mar 2023 19:00:45 +0900</pubDate><guid>https://genzouw.com/entry/2023/03/31/190045/3457/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Heroku を使おうと思った矢先、有料になったということを知りました。&lt;/p&gt;&#10;&lt;p&gt;代替えサービスがないか探したところ、Gin という Go 言語のフレームワークのドキュメントページで Koyeb について紹介されていました。&lt;/p&gt;&#10;&lt;p&gt;インスタンスタイプ &lt;strong&gt;nano&lt;/strong&gt; ( CPUx1、MEMOx256GB ) が 2 インスタンスまで無料ということで、AWS EC2 の毎月の無料枠を使い切っている現状を解決してくれそうだったので早速使ってみます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ zsh --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zsh 5.9 &lt;span class="o"&gt;(&lt;/span&gt;arm-apple-darwin21.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="koyeb-のアカウント作成"&gt;Koyeb のアカウント作成&lt;/h2&gt;&#10;&lt;p&gt;アカウントの開設についてはここでは説明しません。&lt;/p&gt;&#10;&lt;p&gt;一般的な Web サービス同様の手順でアカウントの作成は完了します。&lt;/p&gt;&#10;&lt;h2 id="koyeb-cli-のインストール"&gt;&amp;ldquo;koyeb-cli&amp;rdquo; のインストール&lt;/h2&gt;&#10;&lt;p&gt;Koyeb のサービスはコマンドラインから操作可能なようです。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/koyeb/koyeb-cli"&gt;koyeb/koyeb-cli: Koyeb cli&lt;/a&gt; というツールを見つけたので早速試してみます。&lt;/p&gt;&#10;&lt;p&gt;ただし、macOS 版の Homebrew モジュールを使うとどうもコマンド実行のたびに以下のようなエラーが発生してしまう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 例えば、 apps list コマンドを実行する&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;i$ koyeb apps list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GET https://api.github.com/repos/koyeb/koyeb-cli/releases: &lt;span class="m"&gt;401&lt;/span&gt; Bad credentials &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;バージョンの問題の可能性もあるが深堀りせず、 &lt;code&gt;go install&lt;/code&gt; で導入してみました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go install github.com/koyeb/koyeb-cli/cmd/koyeb@latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こちらを使えば先のエラーが発生しなくなった。&lt;/p&gt;</description></item><item><title>findコマンドを実行した結果、ファイルが 1 つも見つからなかった場合の判定</title><link>https://genzouw.com/entry/2023/03/28/083055/3348/</link><pubDate>Tue, 28 Mar 2023 08:30:55 +0900</pubDate><guid>https://genzouw.com/entry/2023/03/28/083055/3348/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今回は、&lt;code&gt;find&lt;/code&gt;コマンドを使ってファイルが見つからなかった場合の処理について紹介します。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;find&lt;/code&gt;コマンドは Unix 系 OS でファイルを検索するために使われます。ただファイルを検索するだけではなく、パイプでつなぐことで見つかったファイルに対して 1 つずつ何かの処理をすることもできます。&lt;/p&gt;&#10;&lt;p&gt;さて、&lt;code&gt;find&lt;/code&gt; コマンドで検索した結果、該当のファイルが 1 つも見つからなかった場合の処理はどう書いたら良いのでしょうか？&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ find --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find &lt;span class="o"&gt;(&lt;/span&gt;GNU findutils&lt;span class="o"&gt;)&lt;/span&gt; 4.9.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2022&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep &lt;span class="o"&gt;(&lt;/span&gt;GNU grep&lt;span class="o"&gt;)&lt;/span&gt; 3.7&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2021&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="find-を-grep-をパイプでつなぎファイルの検出を判定"&gt;&lt;code&gt;find&lt;/code&gt; を &lt;code&gt;grep&lt;/code&gt; をパイプでつなぎ、ファイルの検出を判定&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;find&lt;/code&gt; の実行結果を &lt;code&gt;grep -q .&lt;/code&gt; コマンドにパイプで渡します。&lt;/p&gt;</description></item><item><title>"tail -f"でログファイルを監視しながら"grep"すると出力が遅延する問題への対応</title><link>https://genzouw.com/entry/2023/03/27/083029/3341/</link><pubDate>Mon, 27 Mar 2023 08:30:29 +0900</pubDate><guid>https://genzouw.com/entry/2023/03/27/083029/3341/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;稼働中の Web サーバーのアクセスログを &lt;code&gt;tail -f&lt;/code&gt; で監視しながら、特定のログのみを探したことはあるでしょうか？&lt;/p&gt;&#10;&lt;p&gt;アクセス数の多いサービスの場合、&lt;code&gt;tail -f access.log&lt;/code&gt; といった単純なコマンドではとても注視したい情報を見つけることはできません。&#10;そのため &lt;code&gt;tail -f access.log | grep xxx | awk {...}&lt;/code&gt; のような形で監視対象のログレコードを減らしながら、任意のカラム情報のみ切り出し監視を行います。&lt;/p&gt;&#10;&lt;p&gt;しかし、この際に遭遇する問題があります。それは &lt;code&gt;grep&lt;/code&gt; で絞り込むと出力が遅延する、という現象です。&lt;/p&gt;&#10;&lt;p&gt;問題の原因と対処法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep &lt;span class="o"&gt;(&lt;/span&gt;GNU grep&lt;span class="o"&gt;)&lt;/span&gt; 3.7&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2021&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tail --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tail &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.32&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2020&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="grep-で絞り込むと出力が遅延するとは"&gt;「&lt;code&gt;grep&lt;/code&gt; で絞り込むと出力が遅延する」とは？&lt;/h2&gt;&#10;&lt;p&gt;「&lt;code&gt;grep&lt;/code&gt; で絞り込むと出力が遅延する」とはどのような現象でしょうか？&lt;/p&gt;</description></item><item><title>Bashシェルでtypeコマンドを使ってコマンドの存在チェックを行う際の注意</title><link>https://genzouw.com/entry/2023/03/25/083012/3335/</link><pubDate>Sat, 25 Mar 2023 08:30:12 +0900</pubDate><guid>https://genzouw.com/entry/2023/03/25/083012/3335/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;昔から、Linux 上で任意のコマンドがどこにあるかを確認するために &lt;code&gt;which&lt;/code&gt; コマンドを使っていました。&lt;/p&gt;&#10;&lt;p&gt;最近では &lt;code&gt;type&lt;/code&gt; コマンドを使ってコマンドがインストールされているかを確認することが増えてきました。&#10;ところがつい最近、注意しないといけないことに気がつきました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="type-コマンドとは"&gt;&lt;code&gt;type&lt;/code&gt; コマンドとは&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;type&lt;/code&gt; を使うと、引数の文字列に一致するコマンドの情報を表示できます。&#10;ここで「コマンド」と呼んでいるものは以下のようなものになります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;実行可能ファイル ( シェル、Python、Ruby、Perl などのスクリプトやコードからコンパイルされた実行可能なバイナリファイル )&lt;/li&gt;&#10;&lt;li&gt;予約語 ( keyword )&lt;/li&gt;&#10;&lt;li&gt;ビルトインコマンド ( builtin )&lt;/li&gt;&#10;&lt;li&gt;エイリアス ( alias )&lt;/li&gt;&#10;&lt;li&gt;関数 ( function )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;以下の例は &lt;code&gt;rm&lt;/code&gt; コマンドに関する情報を表示しています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;type&lt;/span&gt; rm&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm は /usr/bin/rm です&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;「実行可能ファイル」だけは、 &lt;code&gt;$PATH&lt;/code&gt; 環境変数に設定されているパスのリスト ( Linux 環境では &lt;code&gt;:&lt;/code&gt; が区切り文字として使われます) から検索されます。&lt;/p&gt;</description></item><item><title>永遠に終了せず何もしないDockerコンテナを立ち上げる方法</title><link>https://genzouw.com/entry/2023/03/24/083011/3332/</link><pubDate>Fri, 24 Mar 2023 08:30:11 +0900</pubDate><guid>https://genzouw.com/entry/2023/03/24/083011/3332/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Docker コンテナを運用する際、仮想化された環境内で動作するコンテナプロセスを最小限に抑えることで無駄なサーバーリソースの消費を抑え、コストダウンにつなげることができます。&lt;/p&gt;&#10;&lt;p&gt;しかし、場合によっては何もしないコンテナを起動しておき、そのままにしたいというケースがあります。&#10;具体的には AWS ECS 環境や CKE 、Kubernetes 環境でコンテナを立ち上げ、アタッチ ( 接続 ) して運用作業を行いたい、といった場合です。&#10;そんなときに役立つのが「永遠に終了せず何もしない」コンテナです。&lt;/p&gt;&#10;&lt;p&gt;毎回起動コマンドをどうしたらよいか悩むので、選択肢を整理するためにまとめてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 20.10.21, build baeda1f&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="どんなときに永遠に終了せず何もしないコンテナが必要"&gt;どんなときに「永遠に終了せず何もしない」コンテナが必要？&lt;/h2&gt;&#10;&lt;p&gt;冒頭でも紹介したように、AWS ECS 環境や CKE 、Kubernetes 環境でコンテナを立ち上げ、アタッチ ( 接続 ) して運用作業を行うときに役立つのが「永遠に終了せず何もしない」コンテナです。&lt;/p&gt;&#10;&lt;p&gt;例えば、コンテナを立ち上げてアタッチしてから、コンテナ内で作業するときです。&lt;/p&gt;&#10;&lt;h2 id="永遠に終了せず何もしないコンテナを立ち上げる方法"&gt;永遠に終了せず何もしないコンテナを立ち上げる方法&lt;/h2&gt;&#10;&lt;p&gt;以下の方法で「永遠に終了せず何もしない」コンテナを立ち上げることができます。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&amp;ldquo;tail -F /dev/null&amp;rdquo; を使う&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;sleep infinity&amp;rdquo; を使う&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;while true; do sleep 1; done&amp;rdquo; を使う&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;以下でそれぞれの方法を詳しく見ていきます。&lt;/p&gt;</description></item><item><title>Docker ComposeでMySQLがスタンバイになる前に他コンテナが接続しエラーとなってしまう場合の対処</title><link>https://genzouw.com/entry/2023/03/23/083027/3325/</link><pubDate>Thu, 23 Mar 2023 08:30:27 +0900</pubDate><guid>https://genzouw.com/entry/2023/03/23/083027/3325/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Web アプリケーションでは全てと言っていいほど Web サーバーと DB サーバーを利用することとなります。&lt;/p&gt;&#10;&lt;p&gt;単一の物理サーバーに Web サーバー、DB サーバーの機能を同居していたのも今は昔。&lt;/p&gt;&#10;&lt;p&gt;最近では Docker を使った環境構築が主流となっています。&lt;/p&gt;&#10;&lt;p&gt;物理的には従来同様単一の物理サーバー上で稼働していたとしても、仮想的には複数のコンテナが稼働しているというイメージです。&lt;/p&gt;&#10;&lt;p&gt;そのような環境では、Docker Compose を使って両サービスを稼働させることがあります。&lt;/p&gt;&#10;&lt;p&gt;しかし、DB サーバー、例えば MySQL がスタンバイとなる前に他コンテナが接続しようとしてエラーとなってしまう場合があります。&lt;/p&gt;&#10;&lt;p&gt;このような場合の対処法を説明します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-compose version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker Compose version v2.13.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-compose-を使って-db-コンテナと-db-クライアントを立ち上げた場合に遭遇する問題"&gt;Docker Compose を使って DB コンテナと DB クライアントを立ち上げた場合に遭遇する問題&lt;/h2&gt;&#10;&lt;h3 id="再現方法"&gt;再現方法&lt;/h3&gt;&#10;&lt;p&gt;Docker Compose を使って DB コンテナと DB クライアントを立ち上げた場合、DB クライアントから DB コンテナに接続できない場合があります。&lt;/p&gt;&#10;&lt;p&gt;例えば、以下のような MySQL コンテナとそれを利用するクライアントコンテナを立ち上げる &lt;code&gt;docker-compose.yaml&lt;/code&gt; を用意したとします。&lt;/p&gt;</description></item><item><title>再ログインせずにログイン中ユーザの所属グループの変更を反映する方法</title><link>https://genzouw.com/entry/2023/03/22/175455/3323/</link><pubDate>Wed, 22 Mar 2023 17:54:55 +0900</pubDate><guid>https://genzouw.com/entry/2023/03/22/175455/3323/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;UNIX 系の OS では、ログイン中のユーザの所属グループを変更した場合、一度ログアウトしなければ変更が反映されません。&lt;/p&gt;&#10;&lt;p&gt;しかし、あるコマンドを使えば再ログインせずにログイン中のユーザの所属グループを変更し、その変更を反映させる方法があります。&lt;/p&gt;&#10;&lt;p&gt;この記事では、その方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ログイン中のユーザの所属グループを変更しても直ちに設定が反映されない"&gt;ログイン中のユーザの所属グループを変更しても直ちに設定が反映されない&lt;/h2&gt;&#10;&lt;p&gt;実際に Linux 環境を使って検証してみます。&lt;/p&gt;&#10;&lt;h3 id="準備--sudo-実行可能なテストユーザーを作成"&gt;準備 : &lt;code&gt;sudo&lt;/code&gt; 実行可能なテストユーザーを作成&lt;/h3&gt;&#10;&lt;p&gt;最終的に以下のようなユーザー&lt;code&gt;genzouw&lt;/code&gt;を作成します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ユーザー : &lt;code&gt;genzouw&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;グループ : &lt;code&gt;genzouw&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;セカンダリグループ : &lt;code&gt;sudo&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;以下のコマンドを順番に実行していきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在操作中のユーザーはroot&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="o"&gt;(&lt;/span&gt;root&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="o"&gt;(&lt;/span&gt;root&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0&lt;span class="o"&gt;(&lt;/span&gt;root&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ユーザーを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ useradd -m -s /bin/bash genzouw&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ユーザーを sudo グループに追加&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ usermod -a -G sudo genzouw&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 適当なユーザーを作成しておく (何でもよいが、ここではhelloとしました)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ passwd genzouw&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;新しい パスワード:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;新しい パスワードを再入力してください:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;passwd: パスワードは正しく更新されました&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ユーザーの設定を確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ id genzouw&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000&lt;span class="o"&gt;(&lt;/span&gt;genzouw&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000&lt;span class="o"&gt;(&lt;/span&gt;genzouw&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1000&lt;span class="o"&gt;(&lt;/span&gt;genzouw&lt;span class="o"&gt;)&lt;/span&gt;,27&lt;span class="o"&gt;(&lt;/span&gt;sudo&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のコマンドを実行すると、&lt;code&gt;genzouw&lt;/code&gt;ユーザーが作成されました。&lt;/p&gt;</description></item><item><title>ChatGPT(+Shell GPT)を使って簡単な計算を行う電卓シェルスクリプトを生成してみた</title><link>https://genzouw.com/entry/2023/03/21/092030/3313/</link><pubDate>Tue, 21 Mar 2023 09:20:30 +0900</pubDate><guid>https://genzouw.com/entry/2023/03/21/092030/3313/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Linux では、シェルスクリプトを使って簡単な計算ができます。&lt;/p&gt;&#10;&lt;p&gt;今回は、シェルスクリプトを使って 2 つの数値を入力し、指定された演算子を使って計算するプログラムを作成しました。&#10;&lt;strong&gt;ただし、自分ではロジックを一切書かず、ChatGPT に生成してもらうことにしました&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;p&gt;ChatGPT API 呼び出し方法として、 &lt;strong&gt;&lt;a href="https://genzouw.com/entry/2023/03/21/085328/3308/"&gt;前回紹介した Shell GPT&lt;/a&gt;&lt;/strong&gt; を使います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ zsh --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zsh 5.9 &lt;span class="o"&gt;(&lt;/span&gt;arm-apple-darwin21.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ python --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Python 3.11.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;ChatGPT API はトライアル版のものを利用しました&lt;/strong&gt; 。&#10;言語モデルは GPT-3.5 です。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2023/03/Account-OpenAI-API-2023-03-22-07-53-59-300x52.jpg" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="shell-gpt-さんと僕のやり取り"&gt;Shell GPT さんと僕のやり取り&lt;/h2&gt;&#10;&lt;p&gt;ここからは、 電卓シェルスクリプトを作成するまでの &lt;strong&gt;Shell GPT&lt;/strong&gt; さんと僕のやりとり ( シェル操作 ) をなるべく加工無しでそのまま紹介します。&lt;/p&gt;&#10;&lt;h3 id="1-回目のやりとり"&gt;1 回目のやりとり&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sgpt --chat &lt;span class="s2"&gt;&amp;#34;calculator&amp;#34;&lt;/span&gt; --shell &lt;span class="s2"&gt;&amp;#34;電卓プログラムを生成して&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sorry, I cannot fulfill this request as it is in Japanese and it is not clear what is being asked. Please provide a request in English with clear details on what needs to be &lt;span class="k"&gt;done&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;何言ってるかわからん、と言われてしまった。&lt;/p&gt;</description></item><item><title>Shell GPTでコマンドラインからChatGPTを呼び出す</title><link>https://genzouw.com/entry/2023/03/21/085328/3308/</link><pubDate>Tue, 21 Mar 2023 08:53:28 +0900</pubDate><guid>https://genzouw.com/entry/2023/03/21/085328/3308/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;AI 技術の進歩、とくに ChatGPT に注目が集まっています。&#10;これに伴い、ChatGPT を使った自動生成ツールが登場してきています。&#10;これらのツールを活用することで、プログラミングの効率性を高めることができます。&lt;/p&gt;&#10;&lt;p&gt;AI を利用した自動生成ツールの 1 つ、 &lt;strong&gt;&lt;a href="https://pypi.org/project/shell-gpt/"&gt;Shell GPT&lt;/a&gt;&lt;/strong&gt; について紹介します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Shell GPT&lt;/strong&gt; を利用するためには Python が必要ですので、事前にインストールしておきましょう。ここでは Python のインストールについては取り扱いません。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ python --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Python 3.11.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pip --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip 23.0.1 from /Users/genzouw/.anyenv/envs/pyenv/versions/3.11.2/lib/python3.11/site-packages/pip &lt;span class="o"&gt;(&lt;/span&gt;python 3.11&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;ChatGPT API はトライアル版のものを利用しました&lt;/strong&gt; 。&#10;言語モデルは GPT-3.5 です。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2023/03/Account-OpenAI-API-2023-03-22-07-53-59-300x52.jpg" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="shell-gpt-とは"&gt;Shell GPT とは？&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://pypi.org/project/shell-gpt/"&gt;Shell GPT&lt;/a&gt;&lt;/strong&gt; は、ChatGPT を活用したコマンドラインツールです。&#10;コマンドラインから ChatGPT に対して質問を投げ、回答を受け取ることができます。&#10;シェルコマンドの生成機能もあり、ユーザーの入力に応じて最適なスクリプトを自動生成してくれます。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで"while read"ループ内で"read"コマンドを使う方法</title><link>https://genzouw.com/entry/2023/02/18/084531/3300/</link><pubDate>Sat, 18 Feb 2023 08:45:31 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/18/084531/3300/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;決して多くないケースですが、 &lt;code&gt;while read&lt;/code&gt;　ループ中で &lt;code&gt;read&lt;/code&gt; コマンドを利用したいという場合に起きる問題と、その対処法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="while-read-ループ中で-read-コマンドを利用するとどうなるか"&gt;&lt;code&gt;while read&lt;/code&gt; ループ中で &lt;code&gt;read&lt;/code&gt; コマンドを利用するとどうなるか？&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;while read&lt;/code&gt; ループ中で &lt;code&gt;read&lt;/code&gt; コマンドを利用するとどうなるか。&#10;具体例をもとに見ていきます。&lt;/p&gt;&#10;&lt;p&gt;例えば、簡単な英単語の暗記スクリプトを作ってみます。&lt;/p&gt;&#10;&lt;p&gt;仕様は単純で、単語を１つ表示しては ENTER キーの入力を待つ、を繰り返します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;words.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;one&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;two&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;three&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat words.txt &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; -r WORD&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;WORD: &lt;/span&gt;&lt;span class="nv"&gt;$WORD&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;---&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;read&lt;/span&gt; -r -p &lt;span class="s2"&gt;&amp;#34;次に進むには ENTER を押してね &amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;---&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は以下のようになります。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで月の最初の日、最後の日を算出する</title><link>https://genzouw.com/entry/2023/02/17/084541/3282/</link><pubDate>Fri, 17 Feb 2023 08:45:41 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/17/084541/3282/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;他の方が作成したシェルスクリプトを見ていたときに月初め、月末の値がリテラル表記されていました。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;date&lt;/code&gt; コマンドを使って算出する方法を紹介すると面白いと思いまとめました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前提"&gt;前提&lt;/h2&gt;&#10;&lt;p&gt;今回紹介する日の出力フォーマットは &lt;code&gt;YYYY-MM-DD&lt;/code&gt; 形式としています。&lt;/p&gt;&#10;&lt;p&gt;けれども少しコマンドを触れば任意のフォーマットで出力可能な内容となっています。&lt;/p&gt;&#10;&lt;h2 id="月の最初の日--月初め--を算出"&gt;月の最初の日 ( 月初め ) を算出&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2ヶ月前&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d &lt;span class="s2"&gt;&amp;#34;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;month&amp;#34;&lt;/span&gt; +%Y-%m-01&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2022-12-01&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1ヶ月前 / 前月&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d &lt;span class="s2"&gt;&amp;#34;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;month&amp;#34;&lt;/span&gt; +%Y-%m-01&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2023-01-01&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 0ヶ月前 / 今月&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d &lt;span class="s2"&gt;&amp;#34;-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;month&amp;#34;&lt;/span&gt; +%Y-%m-01&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2023-02-01&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="月の最後の日--月末--を算出"&gt;月の最後の日 ( 月末 ) を算出&lt;/h2&gt;&#10;&lt;h3 id="今月"&gt;今月&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2ヶ月前&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;N+1&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;month&amp;#34;&lt;/span&gt; +%Y-%m-01&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; -1day&amp;#34;&lt;/span&gt; +%Y-%m-%d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2022-12-31&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1ヶ月前 / 前月&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;N+1&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;month&amp;#34;&lt;/span&gt; +%Y-%m-01&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; -1day&amp;#34;&lt;/span&gt; +%Y-%m-%d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2023-01-31&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 0ヶ月前 / 今月&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;N+1&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;month&amp;#34;&lt;/span&gt; +%Y-%m-01&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; -1day&amp;#34;&lt;/span&gt; +%Y-%m-%d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2023-02-28&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-簡易版--今月の月初め"&gt;( 簡易版 ) 今月の月初め&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d &lt;span class="s2"&gt;&amp;#34;-&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; days + 1 days&amp;#34;&lt;/span&gt; +%Y-%m-%d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2023-02-01&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d &lt;span class="s2"&gt;&amp;#34;-&lt;/span&gt;&lt;span class="k"&gt;$(($(&lt;/span&gt;date +%d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt; days&amp;#34;&lt;/span&gt; +%Y-%m-%d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2023-02-01&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-簡易版--前月の月末"&gt;( 簡易版 ) 前月の月末&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d &lt;span class="s2"&gt;&amp;#34;-&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; days&amp;#34;&lt;/span&gt; +%Y-%m-%d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2023-01-31&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;まずは月初めを算出する。&lt;/p&gt;</description></item><item><title>fzfを使って現在起動中のDockerコンテナプロセスに簡単に接続するスクリプト</title><link>https://genzouw.com/entry/2023/02/16/084506/3279/</link><pubDate>Thu, 16 Feb 2023 08:45:06 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/16/084506/3279/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;ローカルで Docker を触ることが多いので、かんたんにコンテナプロセスの中にアタッチ ( 接続 ) できるようにスクリプトを作ってみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ fzf --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.37.0 &lt;span class="o"&gt;(&lt;/span&gt;brew&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="スクリプト"&gt;スクリプト&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;docker-sh&lt;/code&gt; というスクリプト名で保存してください。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bash&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;type&lt;/span&gt; docker &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;docker not found&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;type&lt;/span&gt; fzf &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fzf not found&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HASH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; docker &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ps &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --format &lt;span class="s1"&gt;&amp;#39;table {{ .ID }}\t{{ .Image }}\t{{ .Command }}&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; fzf --header-lines&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; --select-1 --query&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ print $1 }&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[[&lt;/span&gt; -z &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HASH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exec&lt;/span&gt; -i -t &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;HASH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SH&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="必要なもの--ツール-"&gt;必要なもの ( ツール )&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.docker.com/get-started/"&gt;Docker&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/junegunn/fzf"&gt;fzf&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="使い方機能"&gt;使い方・機能&lt;/h2&gt;&#10;&lt;h3 id="引数なしで実行"&gt;引数なしで実行&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;fzf&lt;/code&gt; を使って、現在実行中のコンテナプロセスをインタラクティブに絞り込みできます。&#10;任意のものに特定できたら ENTER を押します。&#10;コンテナに対して &lt;code&gt;docker exec -it&lt;/code&gt; が行われ、アタッチします。コンテナ内に接続します。&lt;/p&gt;</description></item><item><title>(有料になったが) Heroku CLI を使ってコマンドラインから Heroku を操作</title><link>https://genzouw.com/entry/2023/02/15/220029/3293/</link><pubDate>Wed, 15 Feb 2023 22:00:29 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/15/220029/3293/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今更ながら、 Heroku CLI を使う必要が出てきたので開発環境を整備しはじめました。&#10;Heroku の操作をいつものコマンドラインから行いたいと思い、CLI ツールを導入することにしました。&lt;/p&gt;&#10;&lt;p&gt;ちなみに、話題になりだしてからもほぼ触ることが有りませんでしたが、いつの間にか無料プランが無くなってしまったんですね。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="インストールに必要なもの"&gt;インストールに必要なもの&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Git&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;多くのエンジニアの開発環境には導入済みでしょう。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;Mac 環境 の場合には、 みんな大好き Homebrew を使用するのがかんたんです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew tap heroku/brew &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew install heroku&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Windows 環境の場合にはインストーラーが提供されています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://devcenter.heroku.com/articles/heroku-cli"&gt;https://devcenter.heroku.com/articles/heroku-cli&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;その他の環境、例えば Linux 環境向けに tar 形式の実行ファイルや &lt;code&gt;apt-get&lt;/code&gt; で導入できるものも提供されています。&lt;/p&gt;&#10;&lt;h2 id="動作確認"&gt;動作確認&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ heroku --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;heroku/7.68.0 darwin-x64 node-v14.19.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ログイン"&gt;ログイン&lt;/h2&gt;&#10;&lt;p&gt;まずはログインを行います。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;heroku login&lt;/code&gt; コマンドを実行します。&lt;/p&gt;&#10;&lt;p&gt;実行後、キーを押すように求められ、押すとブラウザが起動します。&#10;Heroku へのログインすれば、操作は終了です。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;事前に Heroku のアカウントは作成しておきましょう&lt;/strong&gt; 。&lt;/p&gt;</description></item><item><title>.netrcファイルについて知らなかったので調べてみました</title><link>https://genzouw.com/entry/2023/02/15/091254/3270/</link><pubDate>Wed, 15 Feb 2023 09:12:54 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/15/091254/3270/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://devcenter.heroku.com/articles/heroku-cli"&gt;Heroku CLI&lt;/a&gt; のセットアップ中に作成された &lt;code&gt;~/.netrc&lt;/code&gt; というファイルについて。&lt;/p&gt;&#10;&lt;p&gt;これは一体どういったものなのか、いつ使われるものなのかを調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 20.10.21, build baeda1f&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="man-ページを参照"&gt;Man ページを参照&lt;/h2&gt;&#10;&lt;p&gt;以下のページを見つけました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://linuxjm.osdn.jp/html/netkit/man5/netrc.5.html"&gt;Man page of NETRC&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;netrc, .netrc - ftp のためのユーザー設定ファイル&#10;&amp;hellip;&#10;このファイルには、ファイル転送プロトコル ( File Transfer Protocol ) クライアント ftp ( 1 ) のための、設定情報と自動ログイン情報が書かれている。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;FTP サーバに接続する際の認証情報を保存しておくファイルということです。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;curl&lt;/code&gt; 関連の情報を調べているときにも &lt;code&gt;.netrc&lt;/code&gt; の名前を見た記憶があるので、登場背景の FTP 以外でも使われるようになっているということでしょうか。&lt;/p&gt;&#10;&lt;h2 id="netrc-の有無による動作の違いを確認"&gt;&lt;code&gt;~/.netrc&lt;/code&gt; の有無による動作の違いを確認&lt;/h2&gt;&#10;&lt;h3 id="検証準備--ftp-サーバコンテナを起動-"&gt;検証準備 ( FTP サーバコンテナを起動 )&lt;/h3&gt;&#10;&lt;p&gt;FTP サーバを構築し、接続時に &lt;code&gt;~/.netrc&lt;/code&gt; が利用されるかを確認してみます。&lt;/p&gt;</description></item><item><title>Semantic Versioning形式のGitタグをインクリメントしてpushするスクリプト</title><link>https://genzouw.com/entry/2023/02/13/100724/3264/</link><pubDate>Mon, 13 Feb 2023 10:07:24 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/13/100724/3264/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;先日ネット上で見つけたエントリを見て書こうと思ったエントリです。&lt;/p&gt;&#10;&lt;p&gt;Git のタグとして Semantic Versioning 形式を採用している事例でした。&#10;そのエントリでは、パッチバージョン ( vXXX.YYY.ZZZ の ZZZ 部分 ) をインクリメントするのが面倒なのでスクリプト化してみたと書かれていました。&lt;/p&gt;&#10;&lt;p&gt;それをみて、僕も同じようにスクリプト化してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前提"&gt;前提&lt;/h2&gt;&#10;&lt;p&gt;前提として、 バージョニングのフォーマットは &lt;code&gt;vXXX.YYY.ZZZ&lt;/code&gt; としました。&lt;/p&gt;&#10;&lt;p&gt;タグの先頭に固定の文字として &lt;code&gt;v&lt;/code&gt; という文字列を付与しています。&lt;/p&gt;&#10;&lt;p&gt;その後に数値が続き、 &lt;strong&gt;メジャーパージョン&lt;/strong&gt; + &lt;code&gt;.&lt;/code&gt; + &lt;strong&gt;マイナーバージョン&lt;/strong&gt; + &lt;code&gt;.&lt;/code&gt; + &lt;strong&gt;パッチバージョン&lt;/strong&gt; の形式で続くものとしました。&lt;/p&gt;&#10;&lt;p&gt;ただし、 &lt;code&gt;v&lt;/code&gt; を不要にしたり、 ドットを 4 つにしたりは容易にできる作りとなっています。&lt;/p&gt;&#10;&lt;h2 id="スクリプト"&gt;スクリプト&lt;/h2&gt;&#10;&lt;p&gt;スクリプト名は何でも良いですが、 &lt;code&gt;git-tag-inc&lt;/code&gt; として保存しました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o noclobber&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; &lt;span class="nv"&gt;TAG_FORMAT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;v[0-9]+.[0-9]+.[0-9]+&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[CAUTION] The tag format is &amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TAG_FORMAT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;.&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;. &lt;span class="nb"&gt;read&lt;/span&gt; -r MAJOR MINOR PATCH &amp;lt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git tag &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -E &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TAG_FORMAT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort -t &lt;span class="s2"&gt;&amp;#34;.&amp;#34;&lt;/span&gt; -k1,1n -k2,2n -k3,3n &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -n &lt;span class="s1"&gt;&amp;#39;$s/^v//p&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TAG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;v&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MAJOR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MINOR&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATCH&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt; -1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git tag &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TAG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TAG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push --tags&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;p&gt;Git のローカルワークスペースで、 &lt;code&gt;git-tag-inc&lt;/code&gt; コマンドを実行してください。&lt;/p&gt;</description></item><item><title>コマンドの出力結果からANSIエスケープシーケンスのカラーリングを取り除く方法</title><link>https://genzouw.com/entry/2023/02/09/090044/3229/</link><pubDate>Thu, 09 Feb 2023 09:00:44 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/09/090044/3229/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;ターミナル操作時、コマンドの実行結果が色付けされていることがあります。&lt;/p&gt;&#10;&lt;p&gt;僕がプログラミングを始めた頃はもう少し淡白なコマンドの出力結果ばかりだったのですが、最近のツールは出力結果がカラフルなものも多いです。&lt;/p&gt;&#10;&lt;p&gt;ターミナル上の出力結果をカラフルに色付けしてくれるための制御文字は ANSI エスケープシーケンス と呼ばれます。&#10;( 厳密に言うと、ANSI エスケープシーケンス には色付けだけでなく、カーソル位置、フォントスタイル、その他のオプションなどの制御文字が含まれているそうです。 )&lt;/p&gt;&#10;&lt;p&gt;コマンドによっては、出力結果をパイプで繋いだ場合にカラーリングの ANSI エスケープシーケンスを除去してくれ、パイプ先で文字列操作する際に大変便利です。&lt;/p&gt;&#10;&lt;p&gt;例えば、 &lt;code&gt;ls&lt;/code&gt; コマンドは &lt;code&gt;ls -l&lt;/code&gt; を実行すると色付けされますが、 &lt;code&gt;ls -l | cat&lt;/code&gt; のようにパイプでつなぐと制御文字が除去されます。&#10;&lt;code&gt;cut&lt;/code&gt; で切り取る場合は制御文字が邪魔になるので大変便利な挙動です。&#10;しかし、コマンドによってはこのような色付けの制御文字を除去しません。&lt;/p&gt;&#10;&lt;p&gt;そんなときに ANSI エスケープシーケンスのカラーリング制御文字を取り除く方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed &lt;span class="o"&gt;(&lt;/span&gt;GNU sed&lt;span class="o"&gt;)&lt;/span&gt; 4.8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;パッケージ作成者: Debian&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-で囲まれた部分の文字列だけを取り出したいが-ansi-エスケープシーケンスが邪魔をする場合"&gt;&lt;code&gt;[...]&lt;/code&gt; で囲まれた部分の文字列だけを取り出したいが ANSI エスケープシーケンスが邪魔をする場合&lt;/h2&gt;&#10;&lt;p&gt;JavaScript 関連のツールを起動した際の文言として、以下のようなものがあります。&lt;/p&gt;</description></item><item><title>docker psコマンドで出力される情報をカスタマイズする( --format オプション )</title><link>https://genzouw.com/entry/2023/02/07/093453/3218/</link><pubDate>Tue, 07 Feb 2023 09:34:53 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/07/093453/3218/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;docker ps&lt;/code&gt; コマンドで現在稼働中の Docker コンテナを確認できます。&lt;/p&gt;&#10;&lt;p&gt;デフォルトでは以下のような情報が出力されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker ps&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;05d7ee2a983c genzouw/ubuntu-sandbox &lt;span class="s2"&gt;&amp;#34;/bin/bash&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; second ago Up &lt;span class="m"&gt;1&lt;/span&gt; second adoring_bassi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;78c24e86b192 genzouw/ubuntu-sandbox &lt;span class="s2"&gt;&amp;#34;/bin/bash&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;34&lt;/span&gt; seconds ago Up &lt;span class="m"&gt;33&lt;/span&gt; seconds tender_carson&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでは 2 つのコンテナが実行されています。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;CONTAINER ID&lt;/code&gt; や &lt;code&gt;IMAGE&lt;/code&gt; の情報を取り出して、パイプで別の処理に引き渡したい（例えば、実行中プロセスをすべて停止したい）場合は、 &lt;code&gt;cut&lt;/code&gt; や &lt;code&gt;awk&lt;/code&gt; を使って処理する方法が考えられます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2行目以降を出力し、1列目のみを取り出す&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker ps &lt;span class="p"&gt;|&lt;/span&gt; tail -n +2 &lt;span class="p"&gt;|&lt;/span&gt; cut -d &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6965cb418c29&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7ff433dc6fb0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2行目以降を出力し、2列目のみを取り出す&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker ps &lt;span class="p"&gt;|&lt;/span&gt; tail -n +2 &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ print $2 }&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/ubuntu-sandbox&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/ubuntu-sandbox&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ヘッダーの除去するための &lt;code&gt;tail&lt;/code&gt; や、 任意の列だけを取り出すための &lt;code&gt;cut&lt;/code&gt; 、 &lt;code&gt;awk&lt;/code&gt; を使わずに &lt;code&gt;--format&lt;/code&gt; オプションを使用する方法があります。また&lt;code&gt;--format&lt;/code&gt; オプションには少し変わった使い方もあります。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで配列の全要素を連結(join)し文字列を生成する</title><link>https://genzouw.com/entry/2023/02/05/090017/3209/</link><pubDate>Sun, 05 Feb 2023 09:00:17 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/05/090017/3209/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;紹介してそうで紹介していなかった、Bash シェルスクリプトで配列の全要素を連結して文字列を生成する方法について。&lt;/p&gt;&#10;&lt;p&gt;多くのプログラミング言語では、 &lt;code&gt;join&lt;/code&gt; や &lt;code&gt;implode&lt;/code&gt; といった関数で提供されている機能になります。&lt;/p&gt;&#10;&lt;p&gt;Bash の場合にはこのような機能はどのように実現したら良いでしょうか。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="環境変数-ifs--internal-field-separator--を変更する"&gt;環境変数 &lt;code&gt;IFS&lt;/code&gt; ( Internal Field Separator ) を変更する&lt;/h2&gt;&#10;&lt;p&gt;配列を指定した区切り文字 ( デリミタ ) で連結し、文字列を生成するには環境変数 &lt;code&gt;IFS&lt;/code&gt; の値を一時的に変更してやります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配列を定義&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -a &lt;span class="nv"&gt;LIST&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;world&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;your name&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;!&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;特に工夫せずに配列の要素を出力すると以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変数名のみを指定し出力した場合&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LIST&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配列の要素を指定して出力した場合&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LIST&lt;/span&gt;&lt;span class="p"&gt;[*]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello world your name !&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LIST&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello world your name !&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配列変数は &lt;code&gt;${L[*]}&lt;/code&gt; あるいは &lt;code&gt;${L[@]}&lt;/code&gt; の形式で参照しなければ、最初の要素だけしか出力されない点に注意です。&lt;/p&gt;</description></item><item><title>MySQLのMAX_EXECUTION_TIMEを使って長時間実行中のクエリを強制的に中断させる</title><link>https://genzouw.com/entry/2023/02/04/090007/3201/</link><pubDate>Sat, 04 Feb 2023 09:00:07 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/04/090007/3201/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;多くのサービスでは、MySQL データベースを利用しています。&lt;/p&gt;&#10;&lt;p&gt;まれに実行時間の長いクエリが発生します。&#10;いくつか上がった対策の 1 つに実行時間の長い SELECT クエリを強制的に終了させるという案がありました。&#10;案を実現するために &lt;code&gt;MAX_EXECUTION_TIME&lt;/code&gt; の設定を利用できます。&lt;/p&gt;&#10;&lt;p&gt;ここで挙がった &lt;code&gt;MAX_EXECUTION_TIME&lt;/code&gt; とはどのような設定であり、どのように変更するのがよいかを紹介します。&lt;/p&gt;&#10;&lt;h2 id="mysql-の-max_execution_time-とはなにか"&gt;MySQL の &lt;code&gt;MAX_EXECUTION_TIME&lt;/code&gt; とはなにか？&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;MAX_EXECUTION_TIME&lt;/code&gt; とはどんな設定項目なのでしょうか。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_execution_time"&gt;MySQL 5.7 の公式ドキュメント&lt;/a&gt; には以下のように書かれています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;MySQL 5.7 から利用できる設定項目である&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;読み取り専用の SELECT 文にだけ適用される&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;読み取り専用じゃない SELECT 文とは、更新を行うファンクションを呼び出している SELECT 文のこと ( ex: &lt;code&gt;select my_stored_func_to update&lt;/code&gt; )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ファンクションの中の SELECT 文には適用されない&lt;/li&gt;&#10;&lt;li&gt;デフォルト値は &lt;strong&gt;0&lt;/strong&gt; であり、この状態では実行タイムアウトは無効 ( 結果が取得できるまで実行される )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;検証は Docker Compose を使って行います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-compose --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 20.10.21, build baeda1f&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;利用する MySQL の Docker イメージは &lt;code&gt;MAX_EXECUTION_TIME&lt;/code&gt; の設定が利用できる MySQL 5.7 を使用します。&lt;/p&gt;</description></item><item><title>パスワード付きzipファイルがどのぐらいでクラック(パスワード解析)できるか試してみる</title><link>https://genzouw.com/entry/2023/02/03/084016/3198/</link><pubDate>Fri, 03 Feb 2023 08:40:16 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/03/084016/3198/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;前回のエントリで zip ファイルにパスワードを設定する方法について紹介しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2023/02/02/195555/3177/"&gt;zip コマンドでパスワード付き圧縮ファイルを生成する | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;標準的な zip ファイルは比較的容易にパスワード解析できるということなので、実際に突破できるか試してみることにしました。&lt;/p&gt;&#10;&lt;p&gt;総当りでクラック ( パスワードの解析 ) を行うスクリプトを適当に見繕って、試してみます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go version go1.19.2 darwin/arm64&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="zip-クラック用のスクリプトを探す"&gt;zip クラック用のスクリプトを探す&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com"&gt;Github&lt;/a&gt; には、 zip ファイルのパスワードを解析するためのスクリプトがいくつも存在しています。&lt;/p&gt;&#10;&lt;p&gt;いくつかスクリプトを見て、適当なものを採用しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/henriksb/ZipCrack"&gt;henriksb/ZipCrack: Crack password protected zip files&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="zip-クラック環境セットアップ"&gt;zip クラック環境セットアップ&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/henriksb/ZipCrack"&gt;henriksb/ZipCrack&lt;/a&gt; は Go 言語で実装されていたため、Go 実行環境が必要です。&lt;/p&gt;&#10;&lt;p&gt;ここでは Go の実行環境構築の手順は割愛します。&lt;/p&gt;&#10;&lt;p&gt;Go で書かれたコードから実行可能ファイルを生成しておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go mod init henriksb/ZipCrack.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go: creating new go.mod: module henriksb/ZipCrack.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go: to add module requirements and sums:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; go mod tidy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go mod tidy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go: finding module &lt;span class="k"&gt;for&lt;/span&gt; package github.com/yeka/zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go: downloading github.com/yeka/zip v0.0.0-20180914125537-d046722c6feb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go: found github.com/yeka/zip in github.com/yeka/zip v0.0.0-20180914125537-d046722c6feb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go: finding module &lt;span class="k"&gt;for&lt;/span&gt; package golang.org/x/crypto/pbkdf2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go: downloading golang.org/x/crypto v0.5.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go: found golang.org/x/crypto/pbkdf2 in golang.org/x/crypto v0.5.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go build -o ZipCrack&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="クラック対象のパスワード付き-zip-ファイルを作成"&gt;クラック対象のパスワード付き zip ファイルを作成&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2023/02/02/195555/3177/"&gt;zip コマンドでパスワード付き圧縮ファイルを生成する | ゲンゾウ用ポストイット&lt;/a&gt; で紹介した方法でパスワード付き zip ファイルを生成します。&lt;/p&gt;</description></item><item><title>zipコマンドでパスワード付き圧縮ファイルを生成する</title><link>https://genzouw.com/entry/2023/02/02/195555/3177/</link><pubDate>Thu, 02 Feb 2023 19:55:55 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/02/195555/3177/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;最近はめっきり使わなくなった &lt;strong&gt;zip&lt;/strong&gt; ファイル形式。&lt;/p&gt;&#10;&lt;p&gt;圧縮率は &lt;strong&gt;gzip&lt;/strong&gt; 、 &lt;strong&gt;bz&lt;/strong&gt; 、 &lt;strong&gt;7z&lt;/strong&gt; や &lt;strong&gt;Zsrtandard&lt;/strong&gt; という圧縮アルゴリズムも登場していますが、未だに &lt;strong&gt;zip&lt;/strong&gt; でファイルを公開してるサービスもあります。&lt;/p&gt;&#10;&lt;p&gt;そんな zip 形式の圧縮ファイルを生成するためのコマンド &lt;code&gt;zip&lt;/code&gt; を使って「パスワード付き zip ファイル」を生成する方法について紹介します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※「パスワード付き zip ファイル」というネタを扱うと、炎上しそうでドキドキします※&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;今回の検証環境は &lt;strong&gt;Ubuntu 22.10&lt;/strong&gt; を利用しますが、他の Linux ディストリビューションであれば大きな違いはないと思っています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ zip --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; 1990-2008 Info-ZIP - Type &lt;span class="s1"&gt;&amp;#39;zip &amp;#34;-L&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; software license.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is Zip 3.0 &lt;span class="o"&gt;(&lt;/span&gt;July 5th 2008&lt;span class="o"&gt;)&lt;/span&gt;, by Info-ZIP.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="zip-コマンドのインストール"&gt;&lt;code&gt;zip&lt;/code&gt; コマンドのインストール&lt;/h2&gt;&#10;&lt;p&gt;もし &lt;code&gt;zip&lt;/code&gt; コマンドがインストールされていない場合には、 &lt;code&gt;apt&lt;/code&gt; コマンドでインストールしましょう。&lt;/p&gt;</description></item><item><title>Gitリポジトリに誤ってAWSアクセスキーなどをコミットしないようにgit-secretsを導入</title><link>https://genzouw.com/entry/2023/02/01/114351/3174/</link><pubDate>Wed, 01 Feb 2023 11:43:51 +0900</pubDate><guid>https://genzouw.com/entry/2023/02/01/114351/3174/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;サービスの事項環境として AWS を利用していた場合に特に気をつけなければ行けないのが、AWS のアクセスキーのような「API キー」の類をコミットしてしまうことです。&lt;/p&gt;&#10;&lt;p&gt;コードに記述しないように気をつけていたとしても、ひょんな事でコミットしてしまうことがあります。&lt;/p&gt;&#10;&lt;p&gt;このようなミスに気付けるように &lt;a href="https://github.com/awslabs/git-secrets"&gt;git-secrets&lt;/a&gt; を導入してみましょう。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.15&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin22.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="git-secrets-とは"&gt;git-secrets とは&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/awslabs/git-secrets"&gt;git-secrets&lt;/a&gt; は、「API キー」だけでなく、パスワードやその他のセンシティブ情報のコミットを防ぐためのツールです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/awslabs/git-secrets"&gt;GitHub - awslabs/git-secrets: Prevents you from committing secrets and credentials into git repositories&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Git リポジトリに秘匿情報が含まれないように、次のものを監視します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;コミット&lt;/li&gt;&#10;&lt;li&gt;コミットメッセージ&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--no-ff&lt;/code&gt; マージ&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;上記のいずれかに秘匿情報が含まれていた場合には、 コミットが拒否されるようにできます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;git commit&lt;/code&gt; のタイミングでチェックが実行されるということです&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;PATH&lt;/code&gt; 環境変数に設定されているいずれかのディレクトリ ( &lt;code&gt;echo &amp;quot;$PATH&amp;quot; | sed 's/:/\n/g'&lt;/code&gt; で確認できる ) に配置しておきましょう。&lt;/p&gt;&#10;&lt;p&gt;Mac OS 環境で &lt;strong&gt;Homebrew&lt;/strong&gt; が使える場合はかんたんにインストールできます。&lt;/p&gt;</description></item><item><title>sedのcコマンドを使って条件に合致した行を別の文字列で置き換える</title><link>https://genzouw.com/entry/2022/10/15/080018/3139/</link><pubDate>Sat, 15 Oct 2022 08:00:18 +0900</pubDate><guid>https://genzouw.com/entry/2022/10/15/080018/3139/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;個人的に &lt;code&gt;sed&lt;/code&gt; で最もよく使われる内部コマンドは &lt;code&gt;s&lt;/code&gt; コマンドです。&lt;/p&gt;&#10;&lt;p&gt;例えば、出力された文字列の中の &lt;code&gt;1&lt;/code&gt; を &lt;code&gt;@&lt;/code&gt; に置換する場合は以下のように記述できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;12&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;14&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;15&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/1/@/g&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@@&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@5&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あまり使う機会がありませんが、同じように「置き換え」を行う &lt;code&gt;sed&lt;/code&gt; の内部コマンドとして &lt;code&gt;c&lt;/code&gt; コマンドがあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;c&lt;/code&gt; コマンドについて紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="c-コマンドは条件に合致した行を別の文字列で置き換える"&gt;&lt;code&gt;c&lt;/code&gt; コマンドは条件に合致した行を別の文字列で置き換える&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;c&lt;/code&gt; コマンドは条件に合致した行を別の文字列で置き換えるコマンドになります。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;s&lt;/code&gt; コマンドとの違いは、置き換えの単位にあります。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで配列要素を 1 つ 1 つ置換する</title><link>https://genzouw.com/entry/2022/10/14/080050/3136/</link><pubDate>Fri, 14 Oct 2022 08:00:50 +0900</pubDate><guid>https://genzouw.com/entry/2022/10/14/080050/3136/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bash では、配列を作成し、変数に代入できます。&lt;/p&gt;&#10;&lt;p&gt;例えば、1〜3 の要素を持つ配列変数は以下のように定義できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 以下のいずれかで定義できる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -a &lt;span class="nv"&gt;NUMS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt; 13&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;typeset&lt;/span&gt; -a &lt;span class="nv"&gt;NUMS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt; 13&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;NUMS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt; 13&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで、 変数 &lt;code&gt;NUMS&lt;/code&gt; の各要素の &lt;code&gt;1&lt;/code&gt; という文字列を &lt;code&gt;x&lt;/code&gt; に置換したいとします。&lt;/p&gt;&#10;&lt;p&gt;ループで置換していけばよいのですが、ループを記述子なくても置換できます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="変数の置換記法を使う"&gt;変数の置換記法を使う&lt;/h2&gt;&#10;&lt;p&gt;Bash には 変数を参照する際にパターンマッチで置換する機能があります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変数 HELLO を定義&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; &lt;span class="nv"&gt;HELLO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;My name is genzouw&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで作成した変数 &lt;code&gt;HELLO&lt;/code&gt; を、参照するタイミングで置換できます。&lt;/p&gt;</description></item><item><title>anyenvで管理しているバージョン管理ツールを一括でアップデートする方法</title><link>https://genzouw.com/entry/2022/10/13/120054/3133/</link><pubDate>Thu, 13 Oct 2022 12:00:54 +0900</pubDate><guid>https://genzouw.com/entry/2022/10/13/120054/3133/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/anyenv/anyenv"&gt;anyenv&lt;/a&gt; を使うと、 &lt;code&gt;xxxenv&lt;/code&gt; 系のツールを管理できます。&lt;/p&gt;&#10;&lt;p&gt;ここで、 &lt;code&gt; xxxenv&lt;/code&gt; 系のツールとは、例えば **pyenv ** や **goenv ** や &lt;strong&gt;nodeenv&lt;/strong&gt; といったツールを指しています。&lt;/p&gt;&#10;&lt;p&gt;導入することで、1 台の作業用 PC 内に複数バージョンのプログラム言語実行・ビルド環境を構築できます。&lt;/p&gt;&#10;&lt;p&gt;最近は Docker の登場、普及により &lt;code&gt;xxxenv&lt;/code&gt; 系ツールの需要も下がっています。&#10;しかし、Docker による仮想化の進んでいないコードベースもあるため、僕の PC 内では現役で活躍してくれています。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/anyenv/anyenv"&gt;anyenv&lt;/a&gt; は、これら &lt;code&gt;xxxenv&lt;/code&gt; 系のツールを一元管理するための上位のツールとなっています。&lt;/p&gt;&#10;&lt;p&gt;便利ですが &lt;strong&gt;anyenv&lt;/strong&gt; でインストールされた &lt;code&gt;xxxenv&lt;/code&gt; 系ツールで、最新バージョンがインストールできないときがあります。&lt;/p&gt;&#10;&lt;p&gt;具体的には &lt;code&gt;anyenv&lt;/code&gt; を使ってインストールした &lt;code&gt;goenv&lt;/code&gt; を使っていたときに、Go の最新バージョンをインストールできない時がありました。&lt;/p&gt;&#10;&lt;p&gt;この問題に対処します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin21.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ anyenv --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;anyenv 1.1.5&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="anyenv-について"&gt;anyenv について&lt;/h2&gt;&#10;&lt;p&gt;anyenv について、サラッと触れておきます。&lt;/p&gt;</description></item><item><title>シェルでsedを使ってパス文字列からディレクトリ名,ファイル名,拡張子を抽出する</title><link>https://genzouw.com/entry/2022/10/12/120005/3131/</link><pubDate>Wed, 12 Oct 2022 12:00:05 +0900</pubDate><guid>https://genzouw.com/entry/2022/10/12/120005/3131/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;ネタが無いのでありふれたネタを取り上げてみました。&lt;/p&gt;&#10;&lt;p&gt;シェルでパス文字列をディレクトリ名、ファイル名、拡張子に分割する方法はいくつかあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2020/10/14/233709/2088/"&gt;過去に投稿した Bash 組み込みの正規表現機能&lt;/a&gt; を使ったり、Bash の変数を使ったり、　&lt;code&gt;dirname&lt;/code&gt; + &lt;code&gt;basename&lt;/code&gt; コマンドを使ったり、 &lt;code&gt;grep&lt;/code&gt; を使ったり。&lt;/p&gt;&#10;&lt;p&gt;今回は &lt;code&gt;sed&lt;/code&gt; のみで実現してみます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed &lt;span class="o"&gt;(&lt;/span&gt;GNU sed&lt;span class="o"&gt;)&lt;/span&gt; 4.8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;パッケージ作成者: Debian&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sed-を使ったパス文字列分割の正規表現"&gt;&lt;code&gt;sed&lt;/code&gt; を使ったパス文字列分割の正規表現&lt;/h2&gt;&#10;&lt;p&gt;以下のような &lt;code&gt;sed&lt;/code&gt; を使った正規表現を用いて、パス文字列を分割できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed -E &lt;span class="s1"&gt;&amp;#39;s@^(.*/)(([^.]+)\.?(.*))$@\1 \2 \3 \4@&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行すると、スペース区切りで 4 つの情報が出力されます。&lt;/p&gt;</description></item><item><title>Dockerコンテナ内でcronを実行し実行ログを出力する方法</title><link>https://genzouw.com/entry/2022/10/11/201931/3116/</link><pubDate>Tue, 11 Oct 2022 20:19:31 +0900</pubDate><guid>https://genzouw.com/entry/2022/10/11/201931/3116/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Docker Compose を使って構築している環境にスケジューリングされたジョブ実行の仕組みがほしいという相談をいただきました。&lt;/p&gt;&#10;&lt;p&gt;AWS や GCP といったクラウドサービスを利用している場合は CloudWatch Events や Google Scheduler の利用も選択肢に入ります。&#10;しかし今回の環境は Linux サーバに Docker デーモンが用意されているだけでしたので、cron を利用することにしました。&lt;/p&gt;&#10;&lt;p&gt;このときに構築した Docker 内で cron を実行する方法と、cron 実行結果を標準出力、標準エラー出力に流して &lt;code&gt;docker logs&lt;/code&gt; コマンドで確認する方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin21.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 20.10.17, build 100c701&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="今回利用した-docker-ベースイメージ"&gt;今回利用した Docker ベースイメージ&lt;/h2&gt;&#10;&lt;p&gt;今回の検証で利用した Docker のベースイメージは Alpine です。&lt;/p&gt;&#10;&lt;p&gt;以下のタグの Alpine イメージを利用しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;alpine:3.16.2&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;まずは cron の本体である&lt;code&gt;crond&lt;/code&gt;が実行可能な Docker イメージを用意します。&lt;/p&gt;</description></item><item><title>Gitの作業ディレクトリからコマンドでデフォルトブランチ名を取得する</title><link>https://genzouw.com/entry/2022/08/06/080046/3071/</link><pubDate>Sat, 06 Aug 2022 08:00:46 +0900</pubDate><guid>https://genzouw.com/entry/2022/08/06/080046/3071/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git clone&lt;/code&gt; した作業ディレクトリで作業中しているとき、デフォルトブランチに切り替えたいのですが、デフォルトブランチ名を取得する方法がわかりませんでした。&lt;/p&gt;&#10;&lt;p&gt;以前は &lt;code&gt;master&lt;/code&gt; ブランチをデフォルトブランチとしているケースがほとんどでしたが、最近では &lt;code&gt;main&lt;/code&gt; ブランチや 中には &lt;code&gt;develop&lt;/code&gt; ブランチをデフォルトブランチに設定しているリポジトリにも出会うようになりました。&lt;/p&gt;&#10;&lt;p&gt;なんとか取得できないかと調べて、取得する方法が見つかったのでメモを残しておきます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.37.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="github-cli-を使う"&gt;GitHub CLI を使う&lt;/h2&gt;&#10;&lt;p&gt;GitHub を使っていることが前提となりますが、 Git の作業ディレクトリに対応するリモートリポジトリからデフォルトブランチ名を取得します。&lt;/p&gt;&#10;&lt;p&gt;GitHub リポジトリの情報にアクセスするため &lt;strong&gt;GitHub CLI&lt;/strong&gt; を使います。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;&lt;em&gt;GitHub CLI については、インストール方法や使い方を過去のエントリで紹介しています。&lt;/em&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2020/04/03/225419/1952/"&gt;GitHub CLI を使ってコマンドラインからイシュー、プルリクを検索、表示してみる | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;GitHub CLI でインストールされた &lt;code&gt;gh&lt;/code&gt; コマンドを使えば、作業ディレクトリに対応する GitHub 上のリポジトリの設定情報を取得する事ができます。&lt;/p&gt;&#10;&lt;p&gt;以下のようなコマンドを実行することで、デフォルトブランチ名が取得できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gh repo view --json &lt;span class="s2"&gt;&amp;#34;defaultBranchRef&amp;#34;&lt;/span&gt; --jq &lt;span class="s2"&gt;&amp;#34;.defaultBranchRef.name&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;master&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;変数に代入して利用したい場合には以下のようにかけます。&lt;/p&gt;</description></item><item><title>ipcalcコマンドでIPアドレスからネットマスク、ネットワークアドレス、ブロードキャストアドレス、ホスト数を算出する</title><link>https://genzouw.com/entry/2022/08/05/080041/3064/</link><pubDate>Fri, 05 Aug 2022 08:00:41 +0900</pubDate><guid>https://genzouw.com/entry/2022/08/05/080041/3064/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;IPアドレス/CIDR&lt;/code&gt; ( ex: &lt;code&gt;192.168.1.16/27&lt;/code&gt; ) のパターンから、特定のサブネットに所属するかを１つずつ確認する作業を行いました。&lt;/p&gt;&#10;&lt;p&gt;目視で１つずつ計算していたのですが、効率が悪いし何より疲れるため、かんたんにサブネットの計算ができないかと思っていたときに見つけたツールを紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ip-アドレスと-cidr-からネットワークに関する情報を算出する-ipcalc-コマンド"&gt;IP アドレスと CIDR からネットワークに関する情報を算出する &lt;code&gt;ipcalc&lt;/code&gt; コマンド&lt;/h2&gt;&#10;&lt;p&gt;見つけたツールは、 IP アドレスと CIDR 表記の組み合わせ ( ex: &lt;code&gt;192.168.1.16/27&lt;/code&gt; ) からネットワークに関する情報を算出してくれる &lt;code&gt;ipcalc&lt;/code&gt; と言うものです。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;macOS の場合、 Homebrew でかんたんにインストールできました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew install ipcalc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ubuntu 22.10 環境でも APT を使ってかんたんにインストールできました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt install ipcalc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;ipcalc&lt;/code&gt; コマンドの引数に IP アドレス (+CIDR) を指定すると、IP アドレスが存在するネットワークの情報を逆算してくれます。&lt;/p&gt;</description></item><item><title>シェルスクリプトを使ってmacOS上で有効になっている物理ネットワークデバイス名を取得する</title><link>https://genzouw.com/entry/2022/08/04/093338/3062/</link><pubDate>Thu, 04 Aug 2022 09:33:38 +0900</pubDate><guid>https://genzouw.com/entry/2022/08/04/093338/3062/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;非常に限定されたシチュエーションに関する内容です。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt; プラットフォームに限定ですが、現在接続中の無線/有線ネットワークデバイスを抽出したいという相談がありました。&lt;/p&gt;&#10;&lt;p&gt;「なるほどそういう要件もあるのだな」と思うと同時に興味深かったため、対応方法を考えてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Darwin Kernel Version 21.6.0: Sat Jun &lt;span class="m"&gt;18&lt;/span&gt; 17:07:22 PDT 2022&lt;span class="p"&gt;;&lt;/span&gt; root:xnu-8020.140.41~1/RELEASE_ARM64_T6000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="networksetup-コマンドを利用する"&gt;&lt;code&gt;networksetup&lt;/code&gt; コマンドを利用する&lt;/h2&gt;&#10;&lt;p&gt;macOS 上のネットワークインタフェースを操作するためのコマンドとして、 &lt;code&gt;networksetup&lt;/code&gt; があります。&lt;/p&gt;&#10;&lt;p&gt;こちらのコマンドには様々なオプションが用意されています。&lt;/p&gt;&#10;&lt;p&gt;まずは &lt;code&gt;networksetup --listallhardwareports&lt;/code&gt; を使って、ネットワークインタフェースハードウェアを一覧出力できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ networksetup -listallhardwareports&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware Port: Ethernet Adapter &lt;span class="o"&gt;(&lt;/span&gt;en4&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: en4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ethernet Address: d2:d6:53:14:xx:xx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware Port: Ethernet Adapter &lt;span class="o"&gt;(&lt;/span&gt;en5&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: en5&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ethernet Address: d2:d6:53:14:xx:xx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware Port: Ethernet Adapter &lt;span class="o"&gt;(&lt;/span&gt;en6&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: en6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ethernet Address: d2:d6:53:14:xx:xx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware Port: Wi-Fi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: en0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ethernet Address: bc:d0:74:1a:xx:xx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware Port: Thunderbolt &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: en1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ethernet Address: 36:dd:b7:8d:xx:xx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware Port: Thunderbolt &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: en2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ethernet Address: 36:dd:b7:8d:xx:xx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware Port: Thunderbolt &lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: en3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ethernet Address: 36:dd:b7:8d:xx:xx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hardware Port: Thunderbolt Bridge&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Device: bridge0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ethernet Address: 36:dd:b7:8d:xx:xx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VLAN &lt;span class="nv"&gt;Configurations&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;===================&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;それぞれのネットワークハードウェアが 3 行のまとまりで出力されています。&lt;/p&gt;</description></item><item><title>nodemonを使ってGo製Ginサーバをホットリロードしようとしたらハマった話</title><link>https://genzouw.com/entry/2022/08/02/080018/3054/</link><pubDate>Tue, 02 Aug 2022 08:00:18 +0900</pubDate><guid>https://genzouw.com/entry/2022/08/02/080018/3054/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;事前にお伝えすると、Go 言語アプリケーションの開発を効率化するためにホットリロードを導入しようとした場合、最適なのは &lt;a href="https://github.com/cosmtrek/air"&gt;Air&lt;/a&gt; と呼ばれるライブリロードツールを利用するのが良いでしょう&lt;/em&gt;。&#10;&lt;em&gt;Air も Go 製ですので、Go の実行環境が整っていれば利用できます&lt;/em&gt;。&lt;/p&gt;&#10;&lt;p&gt;という前提をおいた上で今回のエントリへ。&lt;/p&gt;&#10;&lt;p&gt;ホットリロード ( ライブリロード ) を導入し、コードが変更されたことを自動検知して実行プロセスを再起動させると開発がスムーズに進められます。&lt;/p&gt;&#10;&lt;p&gt;今までいくつかのツールを遷移してきましたが、ここ数年は &lt;a href="https://github.com/remy/nodemon"&gt;nodemon&lt;/a&gt; がお気に入りです。&lt;/p&gt;&#10;&lt;p&gt;アプリケーション開発時だけでなく、シェルスクリプト作成時にも利用でき、かつコマンド＋オプション指定で利用できるところが気に入っています。過去にも以下のようなエントリを投稿しています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2021/04/09/084541/2536/"&gt;シェルにも使える！nodemon を使ってコードに変更があった場合にホットリロード ( 自動再起動 ) させる&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;前置きが長くなりましたが、Go 言語+Gin Web Framework を使った開発中をしていてホットリロードを導入するために &lt;strong&gt;nodemon&lt;/strong&gt; 経由で &lt;code&gt;go run&lt;/code&gt; したところ、うまくリロードされないという事象にあいました。&lt;/p&gt;&#10;&lt;p&gt;どのような問題が発生したのかと、どのように解決したかを紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nodemon --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2.0.19&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go version go1.18 darwin/arm64&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まずは-gin-のチュートリアルどおりにかんたんな-web-api-を作成"&gt;まずは Gin のチュートリアルどおりにかんたんな Web API を作成&lt;/h2&gt;&#10;&lt;p&gt;このあたりは足早に流していきます。&lt;/p&gt;</description></item><item><title>sqlite3コマンドを実行したら"-- Loading resources from ~/.sqliterc"というメッセージが表示され困った話</title><link>https://genzouw.com/entry/2022/08/01/080021/3048/</link><pubDate>Mon, 01 Aug 2022 08:00:21 +0900</pubDate><guid>https://genzouw.com/entry/2022/08/01/080021/3048/</guid><description>&lt;h1 id="sqlite3-コマンドを実行したら--loading-resources-from-sqliterc-というメッセージが表示され困った話"&gt;sqlite3 コマンドを実行したら &amp;ldquo;&amp;ndash; Loading resources from ~/.sqliterc&amp;rdquo; というメッセージが表示され困った話&lt;/h1&gt;&#10;&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;最近、なぜだか急に SQLite 周りの話題で盛り上がり始めましたね。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;過去にマーケティングの効果測定サービスの設計/開発/運用をしていたときには、ストレージ層(MySQL クラスタ)の冗長化の一環として、SQLite を各 Web サーバに定期的にばらまく、といったキャッシュ機構を導入したいた事がありました&lt;/em&gt;。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;その時のことを思い出して、懐かしさを感じています&lt;/em&gt;。&lt;/p&gt;&#10;&lt;p&gt;今回は自分の作業用 PC で &lt;code&gt;sqlite3&lt;/code&gt; コマンドを実行したところ、 &lt;code&gt;-- Loading resources from ~/.sqliterc&lt;/code&gt; というメッセージが出力されました。&lt;/p&gt;&#10;&lt;p&gt;こちらのメッセージが邪魔なのでなんとか除外したいなぁと悩んで対処したことをエントリにまとめてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sqlite3 --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3.37.0 2021-12-09 01:34:53 9ff244ce0739f8ee52a3e9671adb4ee54c83c640b02e3f9d185fd2f9a179aapl&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="問題"&gt;問題&lt;/h2&gt;&#10;&lt;p&gt;とある SQLite データベースファイル &lt;code&gt;test.db&lt;/code&gt; があり、こちらにはテーブル &lt;code&gt;t1&lt;/code&gt; が含まれています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sqlite3 ./test.db&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Enter &lt;span class="s2"&gt;&amp;#34;.help&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; usage hints.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sqlite&amp;gt; .schema t1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CREATE TABLE t1 &lt;span class="o"&gt;(&lt;/span&gt;c1 int, c2 text&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;t1&lt;/code&gt; テーブルデータを全て閲覧したかったので、 &lt;code&gt;sqlite3&lt;/code&gt; コマンドの引数に SQL を指定し実行してみました。&lt;/p&gt;</description></item><item><title>Bashで読み込んだファイルに対して、リダイレクトで上書きするとファイルが空になる問題への対処</title><link>https://genzouw.com/entry/2022/07/30/080038/3043/</link><pubDate>Sat, 30 Jul 2022 08:00:38 +0900</pubDate><guid>https://genzouw.com/entry/2022/07/30/080038/3043/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bash に限らずシェルスクリプトでも発生する事象ですが、 &lt;code&gt;cat&lt;/code&gt; や &lt;code&gt;&amp;lt;&lt;/code&gt; で読み込んだファイルに対して &lt;code&gt;&amp;gt;&lt;/code&gt; (リダイレクト) で上書きを行ったにも関わらず、ファイルが空になってしまうという事象に一度は遭遇したことがある方も多いでしょう。&lt;/p&gt;&#10;&lt;p&gt;シェル操作を行うことが多い貴兄にはよくある話ですが、この問題への対処法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="リダイレクトで上書きするとファイルが空になる問題とは"&gt;「リダイレクトで上書きするとファイルが空になる」問題とは？&lt;/h2&gt;&#10;&lt;p&gt;対処法の話をする前に、「リダイレクトで上書きするとファイルが空になる」問題とは何かについて説明しておきます。&lt;/p&gt;&#10;&lt;p&gt;例えば、以下のようなファイルがあるとします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &amp;gt; data.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat data.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;1~10 の数値が書かれている &lt;code&gt;data.txt&lt;/code&gt; というファイルを用意しました。&#10;このファイルにから、 &lt;code&gt;2&lt;/code&gt; と &lt;code&gt;5&lt;/code&gt; の数値が登場する行を除外し、 &lt;code&gt;data.txt&lt;/code&gt; に上書きします。&lt;/p&gt;&#10;&lt;p&gt;以下のようなコマンドを実行すれば、 &lt;code&gt;2&lt;/code&gt; と &lt;code&gt;5&lt;/code&gt; の数値を含む行が除外されることを確認できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; grep -v -e &lt;span class="m"&gt;2&lt;/span&gt; -e &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果を &lt;code&gt;data.txt&lt;/code&gt; に書き込みます。&lt;/p&gt;</description></item><item><title>Bashの特殊な変数$_を使って直前に実行されたコマンドの引数を取得する</title><link>https://genzouw.com/entry/2022/07/29/080048/3041/</link><pubDate>Fri, 29 Jul 2022 08:00:48 +0900</pubDate><guid>https://genzouw.com/entry/2022/07/29/080048/3041/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;先日、他の方が作成されたスクリプトを拝見していたときに見つけた特殊変数 &lt;code&gt;$_&lt;/code&gt; があまり見慣れないものだったので、調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="スクリプトで使われていた-_-特殊変数について"&gt;スクリプトで使われていた &lt;code&gt;$_&lt;/code&gt; 特殊変数について&lt;/h2&gt;&#10;&lt;p&gt;Bash では &lt;strong&gt;全ての引数を表す &lt;code&gt;$@&lt;/code&gt;&lt;/strong&gt; や &lt;strong&gt;引数の数を表す &lt;code&gt;$#&lt;/code&gt;&lt;/strong&gt; 　、 &lt;strong&gt;実行中のプロセス ID を表す &lt;code&gt;$$&lt;/code&gt;&lt;/strong&gt; など、いくつか組み込み機能として提供されている変数があります。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;$_&lt;/code&gt; はそういった変数のうちの 1 つになります。&lt;/p&gt;&#10;&lt;p&gt;では、 &lt;code&gt;$_&lt;/code&gt; はどのような変数なのでしょうか。&lt;/p&gt;&#10;&lt;h2 id="_-変数は直前に実行されたコマンドの最後の引数を表す"&gt;&lt;code&gt;$_&lt;/code&gt; 　変数は「直前に実行されたコマンドの最後の引数」を表す&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;$_&lt;/code&gt; 　変数は「直前に実行されたコマンドの最後の引数」を表します。&lt;/p&gt;&#10;&lt;p&gt;早速具体的な例を見ていきましょう。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;$_&lt;/code&gt; 変数が利用されていたコードは以下のようなものになっていました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir hoge &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こちらの命令を実際に実行してみたいと思います。&lt;/p&gt;&#10;&lt;p&gt;実行前、実行後にカレントディレクトリを出力してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;pwd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/workdir&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# hoge/ ディレクトリを作成し、 `$_` の指し示すディレクトリに移動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir hoge &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$_&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;pwd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/workdir/hoge&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こちらのコードからわかるのは、 &lt;code&gt;$_&lt;/code&gt; が &lt;code&gt;hoge&lt;/code&gt; を示しているということです。&#10;値を出力してみましょう。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで数値(小数を含む)かどうかを判定する方法</title><link>https://genzouw.com/entry/2022/07/28/140829/3039/</link><pubDate>Thu, 28 Jul 2022 14:08:29 +0900</pubDate><guid>https://genzouw.com/entry/2022/07/28/140829/3039/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;関連したエントリは今まで何度もしていますが、特定のケースに限定した「こんなときどうする？」集の１つとしてまとめてみました。&lt;/p&gt;&#10;&lt;p&gt;今回は &lt;strong&gt;変数&lt;/strong&gt; や &lt;strong&gt;ファイルのコンテンツ&lt;/strong&gt; などが数字以外が含まれていないことを判定する方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep &lt;span class="o"&gt;(&lt;/span&gt;GNU grep&lt;span class="o"&gt;)&lt;/span&gt; 3.7&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="grep-を用いた正規表現で判定する"&gt;&lt;code&gt;grep&lt;/code&gt; を用いた正規表現で判定する&lt;/h2&gt;&#10;&lt;p&gt;小数を考慮した実数を判定するための正規表現を利用するのが最もかんたんです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;VAR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;123&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep -Eq &lt;span class="s1"&gt;&amp;#39;^-?[1-9]*[0-9](\.[0-9]+)?$&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$VAR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値ですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値ですよ&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;-q&lt;/code&gt; オプションについては過去のエントリでも紹介しています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2020/02/10/090005/1922/"&gt;シェルスクリプトでファイルに特定の文字が含まれているかどうかを高速に判定する方法 | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;-E&lt;/code&gt; オプションはエスケープ文字列 &lt;code&gt;\\&lt;/code&gt; が大量に登場しそうな場合に完結に記述するための拡張表現有効化オプションです。&lt;/p&gt;&#10;&lt;p&gt;いろいろな数値文字列で動作を確認してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -Eq &lt;span class="s1"&gt;&amp;#39;^-?[1-9]*[0-9](\.[0-9]+)?$&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値ですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値ですよ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -Eq &lt;span class="s1"&gt;&amp;#39;^-?[1-9]*[0-9](\.[0-9]+)?$&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;123&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値ですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値ですよ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -Eq &lt;span class="s1"&gt;&amp;#39;^-?[1-9]*[0-9](\.[0-9]+)?$&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-123&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値ですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値ですよ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -Eq &lt;span class="s1"&gt;&amp;#39;^-?[1-9]*[0-9](\.[0-9]+)?$&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;123.4&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値ですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値ですよ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -Eq &lt;span class="s1"&gt;&amp;#39;^-?[1-9]*[0-9](\.[0-9]+)?$&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0.5&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値ですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値ですよ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -Eq &lt;span class="s1"&gt;&amp;#39;^-?[1-9]*[0-9](\.[0-9]+)?$&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;-0.0102&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値ですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値ですよ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 何も出力されない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -Eq &lt;span class="s1"&gt;&amp;#39;^-?[1-9]*[0-9](\.[0-9]+)?$&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1x23&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値ですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -Eq &lt;span class="s1"&gt;&amp;#39;^-?[1-9]*[0-9](\.[0-9]+)?$&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;12+3&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値ですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -Eq &lt;span class="s1"&gt;&amp;#39;^-?[1-9]*[0-9](\.[0-9]+)?$&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;123-&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値ですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -Eq &lt;span class="s1"&gt;&amp;#39;^-?[1-9]*[0-9](\.[0-9]+)?$&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1.2.3&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値ですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;grep&lt;/code&gt; を利用しない方法ももちろんあるでしょうが、今回はかんたんな方法だけ紹介するにとどめます。&lt;/p&gt;</description></item><item><title>Gitでローカルブランチ、リモートブランチの名前を変更(リネーム)する方法</title><link>https://genzouw.com/entry/2022/07/19/171240/3027/</link><pubDate>Tue, 19 Jul 2022 17:12:40 +0900</pubDate><guid>https://genzouw.com/entry/2022/07/19/171240/3027/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今更のエントリではありますが、Git でブランチ名を変更する方法を毎回忘れてわざわざ以下のステップを実行しているのでいいかげん整理しておこうと思いました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 間違ったブランチ ブランチが現在のブランチ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* 間違ったブランチ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 正しいブランチ ブランチを新規作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git checkout -b 正しいブランチ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Switched to a new branch &lt;span class="s1"&gt;&amp;#39;正しいブランチ&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 正しいブランチ ブランチが現在のブランチ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* 正しいブランチ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 間違ったブランチ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 間違ったブランチ ブランチは不要なため削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch -d 間違ったブランチ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Deleted branch 間違ったブランチ &lt;span class="o"&gt;(&lt;/span&gt;was 3c3b0a1&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ブランチを確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git branch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;* 正しいブランチ&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この方法でブランチはリネーム出来ますが、面倒であることや &lt;strong&gt;&lt;code&gt;git push&lt;/code&gt; しリモートブランチとして反映されてしまった場合に対応でき&lt;/strong&gt; ません。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;21.04 (Hirsute Hippo)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.4&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.30.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;今回の学習のために、シンプルな Git ローカル環境を作成しておきます。&lt;/p&gt;</description></item><item><title>"rails console"でもBashのvi 編集モードと同じキーバインドを使う方法</title><link>https://genzouw.com/entry/2022/06/17/153706/3012/</link><pubDate>Fri, 17 Jun 2022 15:37:06 +0900</pubDate><guid>https://genzouw.com/entry/2022/06/17/153706/3012/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今回は完全に「誰得」な記事です。&lt;/p&gt;&#10;&lt;p&gt;僕は普段から Zsh あるは Bash の vi キーバインディングモードを有効にして仕事をしています。&lt;/p&gt;&#10;&lt;p&gt;それぞれ、以下の command を実行することで有効になります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Zsh&lt;/strong&gt; : &lt;code&gt;bindkey -v&lt;/code&gt; ( 実際には zplug でもう少しカスタマイズしている )&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Bash&lt;/strong&gt; : &lt;code&gt;set -o vi&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ところで最近は新しい職場で Ruby on Rails の開発をするようになりました。&#10;毎日チームメンバに指摘をいただきつつ、新卒エンジニアの頃のような挫折感と戦いながら仕事をしています。&#10;( 一日が終わると涙でそうなぐらい凹んている&amp;hellip; )&lt;/p&gt;&#10;&lt;p&gt;話を戻して本題に。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;rails console&lt;/code&gt; を使ってデバッグや本番環境のデータ確認をするタイミングがあるのですが、&#10;そんなときに Zsh や Bash のような vi キーバインドが使えないと生産性が半減してしまいます。&lt;/p&gt;&#10;&lt;p&gt;どうしたら有効になるか調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 unknown Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bin/rails console&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Loading development environment &lt;span class="o"&gt;(&lt;/span&gt;Rails 6.1.6&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="inputrc-ファイルに設定を記述するだけ"&gt;&lt;code&gt;~/.inputrc&lt;/code&gt; ファイルに設定を記述するだけ&lt;/h2&gt;&#10;&lt;p&gt;設定は &lt;code&gt;~/.inputrc&lt;/code&gt; に以下の一文を追記するだけです。&lt;/p&gt;</description></item><item><title>BashのGlob パターンマッチ使用時に該当ファイルが見つからなかった場合の挙動を理解する</title><link>https://genzouw.com/entry/2022/05/18/210932/2985/</link><pubDate>Wed, 18 May 2022 21:09:32 +0900</pubDate><guid>https://genzouw.com/entry/2022/05/18/210932/2985/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bash で該当ディレクトリ内にあるファイルを一括でコマンドの引数として渡したい場合は、 &lt;code&gt;*&lt;/code&gt; を使った Glob 機能が便利です。&lt;/p&gt;&#10;&lt;p&gt;さて、この &lt;code&gt;*&lt;/code&gt; を使ったワイルドカードによるコマンドライン引数の展開ですが、「パターンにマッチするファイルが無かった場合」に想定しない挙動をしてしまうことがあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「パターンにマッチするファイルが無かった場合」にどんな問題が起きるか&lt;/strong&gt; と &lt;strong&gt;その対処法&lt;/strong&gt; を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;21.04 (Hirsute Hippo)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.4&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="作業の流れ作業ログ"&gt;作業の流れ（作業ログ）&lt;/h2&gt;&#10;&lt;p&gt;Glob によるパラーんマッチの挙動を確認するために、&#10;事前にカレントディレクトリに数ファイル作成しておきます。&lt;/p&gt;&#10;&lt;p&gt;名前は単純に以下のような数字の連番としておきます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;10.txt&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;11.txt&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;12.txt&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch 10.txt 11.txt 12.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="glob-によるパターンマッチを試してみる"&gt;Glob によるパターンマッチを試してみる&lt;/h2&gt;&#10;&lt;p&gt;それでは Bash Glob によるパターンマッチの機能を使ってみます。&lt;/p&gt;&#10;&lt;p&gt;Glob 機能ではパターンにマッチした部分がコマンドライン引数として展開されます。 &lt;em&gt;( 厳密には引数以外の部分にも適用されますが、引数として利用するケースがほとんどのはずです。 )&lt;/em&gt;&lt;/p&gt;&#10;&lt;h3 id="パターンが-1-ファイル以上にマッチした場合"&gt;パターンが 1 ファイル以上にマッチした場合&lt;/h3&gt;&#10;&lt;p&gt;まずはファイル名が &lt;code&gt;.txt&lt;/code&gt; で終わるファイルを検出し、コマンドライン引数として展開された場合の挙動をみてみましょう。&lt;/p&gt;</description></item><item><title>jqコマンドで存在しないキーを指定した場合にnullという文字列が取得されることへの対処</title><link>https://genzouw.com/entry/2022/04/04/173254/2970/</link><pubDate>Mon, 04 Apr 2022 17:32:54 +0900</pubDate><guid>https://genzouw.com/entry/2022/04/04/173254/2970/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;AWS、GCP といったクラウドサービスや、&#10;SaaS サービスの利用が進むにつれて、 外部 API を呼び出してレスポンスされた JSON を処理するケースが多くなってきています。&lt;/p&gt;&#10;&lt;p&gt;JSON を処理するためのコマンドラインツールといえば &lt;strong&gt;jq&lt;/strong&gt; コマンドがデファクトスタンダードかと思います。&lt;/p&gt;&#10;&lt;p&gt;そんな jq コマンドをつかってシェルスクリプトを作成していたときのことです。&lt;/p&gt;&#10;&lt;p&gt;JSON データから jq コマンドで必要な属性だけを取得しましたが、たまに JSON データに想定した情報が存在せず、 &lt;code&gt;jq&lt;/code&gt; 実行結果が null となっていまい、&#10;後続処理で null という文字を使って処理を行う用になってしまっていました。&lt;/p&gt;&#10;&lt;p&gt;これをなんとかしたというのが今回の主旨です。&lt;/p&gt;&#10;&lt;p&gt;（説明がわかりにくいですね）&lt;/p&gt;&#10;&lt;p&gt;具体例をあげながら対処方法を記載していきます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 MacBookPro18,3 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="問題"&gt;問題&lt;/h2&gt;&#10;&lt;p&gt;まずはかんたんな JSON を &lt;code&gt;echo&lt;/code&gt;で出力してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{&amp;#34;x&amp;#34;:&amp;#34;hello&amp;#34;}&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;jq&lt;/code&gt; を使って、上記の出力結果から &lt;strong&gt;x&lt;/strong&gt; の値だけを抽出してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;{&amp;#34;x&amp;#34;:&amp;#34;hello&amp;#34;}&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq .x&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;抽出できましたが、ダブルクォートが不要なのでこれを出力しないようにします。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;jq&lt;/code&gt; コマンドに &lt;code&gt;-r&lt;/code&gt; オプションを付与するだけです。&lt;/p&gt;</description></item><item><title>Bashでテスト用に1GiBの大容量ファイル(バイナリ/テキスト)を作成する方法いろいろ</title><link>https://genzouw.com/entry/2022/03/08/091833/2960/</link><pubDate>Tue, 08 Mar 2022 09:18:33 +0900</pubDate><guid>https://genzouw.com/entry/2022/03/08/091833/2960/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;アップロード・ダウンロード速度、通信速度を確認するために、サイズの大きなファイルを作成したいときがあります。&lt;/p&gt;&#10;&lt;p&gt;よく知られた方法ばかりですが、1GB の大容量のファイルを作成する方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;21.04 (Hirsute Hippo)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.4&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="null-文字0x00で埋められたバイナリファイルを作成"&gt;NULL 文字（0x00）で埋められた「バイナリファイル」を作成&lt;/h2&gt;&#10;&lt;p&gt;最もかんたんかつ高速なのは、 &lt;code&gt;dd&lt;/code&gt; コマンドを使って &lt;strong&gt;NULL 文字（0x00）で埋められたバイナリファイルを作成する方法&lt;/strong&gt; です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ dd &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/dev/zero &lt;span class="nv"&gt;of&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1Gi &lt;span class="nv"&gt;bs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1024&lt;/span&gt; &lt;span class="nv"&gt;count&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="m"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1048576+0 レコード入力&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1048576+0 レコード出力&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1073741824&lt;/span&gt; bytes &lt;span class="o"&gt;(&lt;/span&gt;1.1 GB, 1.0 GiB&lt;span class="o"&gt;)&lt;/span&gt; copied, 2.45573 s, &lt;span class="m"&gt;437&lt;/span&gt; MB/s&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;bs&lt;/strong&gt; でブロックサイズ 1024bytes を指定しています。&#10;このブロックを、&lt;strong&gt;count&lt;/strong&gt; の回数分、つまり &lt;code&gt;1024**2&lt;/code&gt; 回書き込みます。&lt;/p&gt;&#10;&lt;p&gt;合計サイズは &lt;code&gt;1024**3 = 1073741824&lt;/code&gt; となります。&lt;/p&gt;&#10;&lt;p&gt;作成されたファイルの容量を確認してみます。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;$ ls -l 1Gi&#10;-rw-r--r-- 1 root root 1073741824 3月 8 08:43 1Gi&#10;&#10;$ stat 1Gi&#10; File: 1Gi&#10; Size: 1073741824 Blocks: 2097160 IO Block: 4096 通常ファイル&#10;Device: 40h/64d Inode: 7086333 Links: 1&#10;Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)&#10;Access: 2022-03-08 08:43:17.848731009 +0900&#10;Modify: 2022-03-08 08:43:20.304731010 +0900&#10;Change: 2022-03-08 08:43:20.304731010 +0900&#10; Birth: 2022-03-08 08:43:17.848731009 +0900&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;サイズは &lt;code&gt;1024 ** 3 = 1073741824 bytes&lt;/code&gt; となりました。&lt;/p&gt;</description></item><item><title>"GitHub CLI"でOrganization内のリポジトリを一覧表示する方法</title><link>https://genzouw.com/entry/2022/03/04/105932/2948/</link><pubDate>Fri, 04 Mar 2022 10:59:32 +0900</pubDate><guid>https://genzouw.com/entry/2022/03/04/105932/2948/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;GitHub CLI&lt;/strong&gt; が便利で愛用しています。&#10;&lt;strong&gt;GitHub CLI&lt;/strong&gt; をインストールすると使えるようになる &lt;code&gt;gh&lt;/code&gt; コマンドと、 別ツールである &lt;code&gt;ghq&lt;/code&gt; コマンドを組み合わせるとコマンドラインライフ（？）がとても快適になります。&lt;/p&gt;&#10;&lt;p&gt;さて、GitHub にて新しい組織（Organizations）に所属したとき、この組織が所有するリポジトリの一覧を取得したかったのですが、 ほんの少しハマったのでやり方を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;arm64 MacBookPro18,3 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gh --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh version 2.5.2 &lt;span class="o"&gt;(&lt;/span&gt;2022-03-01&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/cli/cli/releases/tag/v2.5.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="gh-コマンドで普通にリポジトリを一覧"&gt;&lt;code&gt;gh&lt;/code&gt; コマンドで普通にリポジトリを一覧&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;gh&lt;/code&gt; コマンドで普通にリポジトリを一覧出力してみましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gh repo list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Showing &lt;span class="m"&gt;30&lt;/span&gt; of &lt;span class="m"&gt;200&lt;/span&gt; repositories in @genzouw&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/docker-minecraft-server Docker image that provides a Minecraft Server that will automatical... public, fork 1d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/bin private 1d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/setup_scripts private 3d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/myconfig private 4d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/kanji private 4d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/golly private 4d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/haldata-apollo-client private 4d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/backend private 4d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/hyakuninissyu private 4d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/aws-cognito-example-custom-page public 5d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw/ubuntu-sandbox Dockerfile &lt;span class="k"&gt;for&lt;/span&gt; Ubuntu public 6d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;自分の所有するリポジトリが一覧表示されます。&#10;&lt;strong&gt;200 リポジトリも所有しているんですね。びっくりしました。&lt;/strong&gt; 掃除しないと。&lt;/p&gt;</description></item><item><title>Gitに大容量ファイルをプッシュするときには"Git LFS"を利用しよう</title><link>https://genzouw.com/entry/2022/02/09/112150/2934/</link><pubDate>Wed, 09 Feb 2022 11:21:50 +0900</pubDate><guid>https://genzouw.com/entry/2022/02/09/112150/2934/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Git の利用目的として、「ソースコード」の配置だけでなく、「テストデータ」や画像や音声、動画といった「メディアファイル」の配置にも使われるようになってきている。&lt;/p&gt;&#10;&lt;p&gt;ところが、&#10;Git は大容量のファイルをうまく処理できず、リポジトリがすぐに肥大化してしまう。&lt;/p&gt;&#10;&lt;p&gt;そこで登場したのが &lt;a href="https://github.com/git-lfs/git-lfs"&gt;Git LFS&lt;/a&gt; という機能です。&lt;/p&gt;&#10;&lt;p&gt;今回は &lt;strong&gt;Git LFS&lt;/strong&gt; のメリットや、&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="git-lfs-がない時"&gt;&amp;ldquo;Git LFS&amp;rdquo; がない時&lt;/h2&gt;&#10;&lt;p&gt;もともとソースコード用に最適化されていた。&#10;テキストファイルですので、マージしたり、圧縮することで容量を劇的に小さくできます。&lt;/p&gt;&#10;&lt;p&gt;ところが、&#10;大きなバイナリファイルを履歴管理したり、圧縮したりするととたんに非効率となり、速度も劣化しました。&#10;特にバイナリファイルは圧縮率が低く（画像や動画はもともと圧縮済みということもあり）ほぼそのままのサイズで履歴保存されてしまいます。&lt;/p&gt;&#10;&lt;p&gt;10MB のファイルを 10 回コミットすれば履歴はあっという間に 100MB、100 回コミットすれば 1GB となってしまいます。&lt;/p&gt;&#10;&lt;h2 id="git-lfs-がある時"&gt;&amp;ldquo;Git LFS&amp;rdquo; がある時&lt;/h2&gt;&#10;&lt;p&gt;この問題に対して、 &amp;ldquo;Git LFS&amp;rdquo; では大容量のファイル（主にバイナリファイルとなる）を Git の外部にあるストレージ ( &lt;strong&gt;LFS&lt;/strong&gt; = Large File Storage )に保存するという方法を取ります。&lt;/p&gt;&#10;&lt;p&gt;バイナリファイルの実体（実ファイル）は外部ストレージに保存し、これに対する「参照（リンク）」だけを Git で履歴として保存、操作します。&lt;/p&gt;&#10;&lt;h2 id="github-ではgit-lfsを無料で利用できる"&gt;Github では&amp;quot;Git LFS&amp;quot;を無料で利用できる&lt;/h2&gt;&#10;&lt;p&gt;Github では巨大なファイルの取り扱いに制限を設けています。&lt;/p&gt;</description></item><item><title>Linux ファイルシステムにおけるタイムスタンプ(mtime、atime、ctime)の違い、確認方法、変更方法</title><link>https://genzouw.com/entry/2022/02/07/211051/2928/</link><pubDate>Mon, 07 Feb 2022 21:10:51 +0900</pubDate><guid>https://genzouw.com/entry/2022/02/07/211051/2928/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Linux OS 上で行う操作はほぼ全て「ファイル」に対して行われます。&lt;/p&gt;&#10;&lt;p&gt;ファイルには「作成された時」や「更新された時」の「日時」の情報が付与されています。&lt;/p&gt;&#10;&lt;p&gt;タイトルにある &lt;strong&gt;mtime&lt;/strong&gt; 、 &lt;strong&gt;atime&lt;/strong&gt; 、 &lt;strong&gt;ctime&lt;/strong&gt; というのはファイルに関する日時情報にあたりますが、 &lt;strong&gt;なぜ 3 つあるのか？&lt;/strong&gt; 、 &lt;strong&gt;それぞれどういった情報なのか?&lt;/strong&gt; は即答が難しいです。&lt;/p&gt;&#10;&lt;p&gt;これら 3 つの「日時」情報を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;21.04 (Hirsute Hippo)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.4&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="タイムスタンプはファイル操作したときの日時情報"&gt;「タイムスタンプ」はファイル操作したときの日時情報&lt;/h2&gt;&#10;&lt;p&gt;Linux ファイルシステムにおける日時情報のことを &lt;strong&gt;タイムスタンプ&lt;/strong&gt; と呼びます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;タイムスタンプ&lt;/strong&gt; はファイルに対して何らかの操作したときに記録されます。&lt;/p&gt;&#10;&lt;p&gt;ファイルが作られたタイミングでもタイムスタンプが記録されるので、「タイムスタンプが存在しない」ということはありえません。&lt;/p&gt;&#10;&lt;h2 id="タイムスタンプはいくつかの種類がある"&gt;「タイムスタンプ」はいくつかの種類がある&lt;/h2&gt;&#10;&lt;p&gt;一口に「日時情報」といっても、Linux ファイルシステムには以下の 3 つの「タイムスタンプ」があり、 更新されるタイミングが異なります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;mtime&lt;/strong&gt; : 中身(コンテンツ)が変更された日時&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;atime&lt;/strong&gt; : アクセスされた日時&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ctime&lt;/strong&gt; : 属性が変更された日時&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;mtime&lt;/strong&gt; は比較的わかりやすいですが、他のものがわかりにくいです。&lt;/p&gt;</description></item><item><title>Google Container Registry (GCR) にDockerイメージをプッシュしようとしてエラーが出たときの対応</title><link>https://genzouw.com/entry/2022/02/05/080015/2918/</link><pubDate>Sat, 05 Feb 2022 08:00:15 +0900</pubDate><guid>https://genzouw.com/entry/2022/02/05/080015/2918/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;独自にビルドした Docker イメージは、Docker Repository に配置して初めて自分以外も利用できるようになります。&#10;パブリックな Docker Repository としては &lt;strong&gt;Docker Hub&lt;/strong&gt; が有名です。&#10;プライベートな Docker Repository として、僕は &lt;strong&gt;Google Container Registry (GCR)&lt;/strong&gt; を利用することが多いです。&lt;/p&gt;&#10;&lt;p&gt;先日、他の方から 「Google Container Registry にビルドイメージをプッシュしようとしてエラーが出てハマっている」という相談がありましたので、こちらの解消方法について解説しようと思いました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;vagrant@localhost ~&lt;span class="o"&gt;]&lt;/span&gt;$ cat /etc/os-release &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;centos&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ID_LIKE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rhel fedora&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux 7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ANSI_COLOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0;31&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="作業の流れ"&gt;作業の流れ&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;gcloud&lt;/code&gt; + &lt;code&gt;docker&lt;/code&gt; コマンドのインストール&lt;/li&gt;&#10;&lt;li&gt;Docker イメージを作成&lt;/li&gt;&#10;&lt;li&gt;GCR に対する認証を設定&lt;/li&gt;&#10;&lt;li&gt;Docker イメージをプッシュ&lt;/li&gt;&#10;&lt;li&gt;Docker イメージをプル ＋ 実行&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="1-gcloud--docker-コマンドのインストール"&gt;1. &lt;code&gt;gcloud&lt;/code&gt; + &lt;code&gt;docker&lt;/code&gt; コマンドのインストール&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;gcloud&lt;/code&gt; は &amp;ldquo;Google Container Registry (GCR)&amp;rdquo; に対して「認証」を行うために利用します。&lt;/p&gt;</description></item><item><title>コマンドラインで "Docker Hub" にアップロード済みのDocker Repositoryを削除する方法</title><link>https://genzouw.com/entry/2022/02/04/203606/2915/</link><pubDate>Fri, 04 Feb 2022 20:36:06 +0900</pubDate><guid>https://genzouw.com/entry/2022/02/04/203606/2915/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;無料でDockerイメージを公開できるサービス &lt;strong&gt;Docker Hub&lt;/strong&gt; はなくてはならないサービスですね。&lt;/p&gt;&#10;&lt;p&gt;昨年 &lt;a href="https://www.docker.com/blog/changes-to-docker-hub-autobuilds/"&gt;自動ビルド機能が暗号通貨マイニングに悪用され廃止&lt;/a&gt; となってしまったにもかかわらず、&#10;無料でDockerイメージを公開するリポジトリとしての地位はゆるぎません。&lt;/p&gt;&#10;&lt;p&gt;&amp;ldquo;Github Action&amp;rdquo; なり &amp;ldquo;CircleCI&amp;rdquo; なり &amp;ldquo;GCP Cloud Build&amp;rdquo; なりを使ってビルドしたイメージを打ち上げる先として未だに使い続けています。&lt;/p&gt;&#10;&lt;p&gt;自分のPCでビルドしたイメージをアップロードするためにも利用していますが、不要になったDocker リポジトリを削除したいと思いました。&lt;/p&gt;&#10;&lt;p&gt;その際に実行した、コマンドラインから削除するための方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-hub-のdocker-repository-を操作するためのツール-hub-tool"&gt;&amp;ldquo;Docker Hub&amp;rdquo; のDocker Repository を操作するためのツール &amp;ldquo;hub-tool&amp;rdquo;&lt;/h2&gt;&#10;&lt;p&gt;&amp;ldquo;Docker Hub&amp;rdquo; のDocker Repository をコマンドラインから操作する場合は、 &lt;strong&gt;&amp;ldquo;hub-tool&amp;rdquo;&lt;/strong&gt; というツールを利用します。&lt;/p&gt;&#10;&lt;p&gt;過去のエントリ (&lt;a href="https://genzouw.com/entry/2021/02/02/193242/2158/"&gt;“hub-tool”を使って”Docker Hub”上のイメージタグを一覧表示する&lt;/a&gt;) でも紹介しました。&lt;/p&gt;&#10;&lt;p&gt;今回のエントリも、 &lt;code&gt;hub-tool&lt;/code&gt; コマンドがすでにインストールされていることを前提とします。&lt;/p&gt;&#10;&lt;p&gt;インストールされていない場合は、インストールしておきましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# インストールされているかを確認 ( メッセージが気持ち悪い )&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ hub-tool --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker Hub Tool unknown, build unknown&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="hub-tool-を使って-docker-hub-上の-docker-repository-を削除"&gt;&lt;code&gt;hub-tool&lt;/code&gt; を使って &amp;ldquo;Docker Hub&amp;rdquo; 上の Docker Repository を削除&lt;/h2&gt;&#10;&lt;p&gt;それでは &lt;code&gt;hub-tool&lt;/code&gt; を使って、不要な Docker Repository を削除してみましょう。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで1〜999の数字をあてるゲームを作ってみる</title><link>https://genzouw.com/entry/2022/02/01/080450/2906/</link><pubDate>Tue, 01 Feb 2022 08:04:50 +0900</pubDate><guid>https://genzouw.com/entry/2022/02/01/080450/2906/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;「子供と遊ぶ」＋「プログラミングの学習」のために、1〜999の数字をあてるゲームを作ってみました。&lt;/p&gt;&#10;&lt;p&gt;過去に別の言語で作ったことはありましたが、最近プログラミングをしていなかったせいで衰えを感じたため、&#10;どのぐらい衰えたか心配になり試してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;21.04 (Hirsute Hippo)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.4&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ソースコード"&gt;ソースコード&lt;/h2&gt;&#10;&lt;p&gt;ここで掲載しているスクリプトはGithubにもプッシュしておきました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/genzouw/game-of-guess"&gt;&lt;img src="https://gh-card.dev/repos/genzouw/game-of-guess.svg" alt="genzouw/game-of-guess - GitHub"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="game_of_guesssh"&gt;&lt;code&gt;game_of_guess.sh&lt;/code&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ANS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;RANDOM &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="m"&gt;999&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MAX_RETRY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 0&lt;span class="p"&gt;;&lt;/span&gt; i &amp;lt; MAX_RETRY&lt;span class="p"&gt;;&lt;/span&gt; i++&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;read&lt;/span&gt; -r -p &lt;span class="s2"&gt;&amp;#34;数値(0〜999)を入力してください: &amp;#34;&lt;/span&gt; GUESS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$GUESS&lt;/span&gt; -eq &lt;span class="nv"&gt;$ANS&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;あなたの勝ち!&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$GUESS&lt;/span&gt; -gt &lt;span class="nv"&gt;$ANS&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;大きすぎ! (残り &lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;MAX_RETRY &lt;span class="o"&gt;-&lt;/span&gt; i &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;小さすぎ! (残り &lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;MAX_RETRY &lt;span class="o"&gt;-&lt;/span&gt; i &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;あなたの負け! 答えは &lt;/span&gt;&lt;span class="nv"&gt;$ANS&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行"&gt;実行&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./game_of_guess.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値&lt;span class="o"&gt;(&lt;/span&gt;0〜999&lt;span class="o"&gt;)&lt;/span&gt;を入力してください: &lt;span class="m"&gt;500&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;大きすぎ! &lt;span class="o"&gt;(&lt;/span&gt;残り 9&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値&lt;span class="o"&gt;(&lt;/span&gt;0〜999&lt;span class="o"&gt;)&lt;/span&gt;を入力してください: &lt;span class="m"&gt;251&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;小さすぎ! &lt;span class="o"&gt;(&lt;/span&gt;残り 8&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値&lt;span class="o"&gt;(&lt;/span&gt;0〜999&lt;span class="o"&gt;)&lt;/span&gt;を入力してください: &lt;span class="m"&gt;375&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;小さすぎ! &lt;span class="o"&gt;(&lt;/span&gt;残り 7&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値&lt;span class="o"&gt;(&lt;/span&gt;0〜999&lt;span class="o"&gt;)&lt;/span&gt;を入力してください: &lt;span class="m"&gt;437&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;小さすぎ! &lt;span class="o"&gt;(&lt;/span&gt;残り 6&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値&lt;span class="o"&gt;(&lt;/span&gt;0〜999&lt;span class="o"&gt;)&lt;/span&gt;を入力してください: &lt;span class="m"&gt;468&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;小さすぎ! &lt;span class="o"&gt;(&lt;/span&gt;残り 5&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値&lt;span class="o"&gt;(&lt;/span&gt;0〜999&lt;span class="o"&gt;)&lt;/span&gt;を入力してください: &lt;span class="m"&gt;484&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;小さすぎ! &lt;span class="o"&gt;(&lt;/span&gt;残り 4&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;数値&lt;span class="o"&gt;(&lt;/span&gt;0〜999&lt;span class="o"&gt;)&lt;/span&gt;を入力してください: &lt;span class="m"&gt;497&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;あなたの勝ち!&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="おまけ答えを自動的に求めるスクリプト"&gt;おまけ：答えを自動的に求めるスクリプト&lt;/h2&gt;&#10;&lt;h3 id="game_of_guess_autosh"&gt;&lt;code&gt;game_of_guess_auto.sh&lt;/code&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ANS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;RANDOM &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="m"&gt;999&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MAX_RETRY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TOP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1000&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;BOTTOM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 0&lt;span class="p"&gt;;&lt;/span&gt; i &amp;lt; MAX_RETRY&lt;span class="p"&gt;;&lt;/span&gt; i++&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;GUESS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;TOP &lt;span class="o"&gt;+&lt;/span&gt; BOTTOM&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;数値(0〜999)を入力してください: &amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$GUESS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$GUESS&lt;/span&gt; -eq &lt;span class="nv"&gt;$ANS&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;あなたの勝ち!&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$GUESS&lt;/span&gt; -gt &lt;span class="nv"&gt;$ANS&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;大きすぎ! (残り &lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;MAX_RETRY &lt;span class="o"&gt;-&lt;/span&gt; i &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;TOP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$GUESS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;小さすぎ! (残り &lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;MAX_RETRY &lt;span class="o"&gt;-&lt;/span&gt; i &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&lt;span class="s2"&gt;)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;BOTTOM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$GUESS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;あなたの負け! 答えは &lt;/span&gt;&lt;span class="nv"&gt;$ANS&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;実はコードの大部分は &lt;a href="https://copilot.github.com/"&gt;GitHub Copilot&lt;/a&gt; が作成してくれました。&lt;/p&gt;</description></item><item><title>trコマンドとsed(y)コマンドの動作の同じところ、違うところ</title><link>https://genzouw.com/entry/2022/01/31/080019/2900/</link><pubDate>Mon, 31 Jan 2022 08:00:19 +0900</pubDate><guid>https://genzouw.com/entry/2022/01/31/080019/2900/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;tr&lt;/code&gt; コマンドは、「文字」を別の「文字」に置き換えるコマンドです。&lt;/p&gt;&#10;&lt;p&gt;同じようなコマンドとして、 &lt;code&gt;sed&lt;/code&gt; コマンドの &lt;strong&gt;y&lt;/strong&gt; 内部コマンドがあります。&lt;/p&gt;&#10;&lt;p&gt;両方のコマンドの挙動を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;21.04 (Hirsute Hippo)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.4&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tr-コマンド"&gt;&lt;code&gt;tr&lt;/code&gt; コマンド&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;tr&lt;/code&gt; コマンドを使って、 &lt;strong&gt;&amp;ldquo;my name is test.&amp;rdquo;&lt;/strong&gt; という文字を変換してみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;tr&lt;/code&gt; コマンドは指定された複数の文字を、別の文字に変換するコマンドです。&lt;/p&gt;&#10;&lt;p&gt;具体例をもとに挙動を見ていきましょう。&lt;/p&gt;&#10;&lt;h3 id="例1"&gt;例1&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;tr&lt;/code&gt; コマンドの第1引数と第2引数の文字数が同じ場合には、それぞれの文字位置が変換ルールとして対応します。&#10;以下のルールで変換されます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;t&lt;/code&gt; =&amp;gt; &lt;code&gt;a&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;e&lt;/code&gt; =&amp;gt; &lt;code&gt;b&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;s&lt;/code&gt; =&amp;gt; &lt;code&gt;c&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;my name is test.&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;tes&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;abc&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;my namb ic dbcd.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="例2"&gt;例2&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;tr&lt;/code&gt; コマンドの第2引数が第1引数の文字数よりも小さい場合は、&#10;以下のルールで変換されます。&lt;/p&gt;</description></item><item><title>Bashで"while read"ループ内で変更した変数がループ外に反映されないときの対処</title><link>https://genzouw.com/entry/2022/01/29/080031/2898/</link><pubDate>Sat, 29 Jan 2022 08:00:31 +0900</pubDate><guid>https://genzouw.com/entry/2022/01/29/080031/2898/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;よく知られていることですが、&#10;あるコマンドの実行結果をパイプで渡し、&#10;&lt;code&gt;while read&lt;/code&gt; 命令で 1 行ずつ読み込んで処理する場合に&#10;注意しないといけないことがあります。&lt;/p&gt;&#10;&lt;p&gt;多くのエンジニアが一度はハマったことがあるはずです。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;while read&lt;/code&gt; ループ内で変更した変数の内容がループ外でうまく参照できない、という事象です。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「注意事項」&lt;/strong&gt; と &lt;strong&gt;「解決方法」&lt;/strong&gt; を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;21.04 (Hirsute Hippo)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.4&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="seq-1-5-の実行結果を合計してみる"&gt;&lt;code&gt;seq 1 5&lt;/code&gt; の実行結果を合計してみる&lt;/h2&gt;&#10;&lt;p&gt;1〜5 の数の中から、 &lt;strong&gt;3 の倍数&lt;/strong&gt; を求めてみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;SUM&lt;/code&gt; という変数を用意し、1〜5の値を加算します。&lt;/p&gt;&#10;&lt;p&gt;最後に &lt;code&gt;SUM&lt;/code&gt; 変数を出力すれば、 1〜5の合計値がわかります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;SUM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; -r NUM&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;SUM&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="nv"&gt;$NUM&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$SUM&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は &lt;strong&gt;0&lt;/strong&gt; となってしまいました。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでランダムな数値(乱数)を生成する</title><link>https://genzouw.com/entry/2022/01/28/120029/2895/</link><pubDate>Fri, 28 Jan 2022 12:00:29 +0900</pubDate><guid>https://genzouw.com/entry/2022/01/28/120029/2895/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;意外にも、初歩的な「乱数」に関するエントリを書いたことがなかった( &lt;em&gt;&lt;a href="https://genzouw.com/entry/2014/07/10/014035/19/#toc_id_3"&gt;過去にサラリと触れていぐらいた&lt;/a&gt;&lt;/em&gt; )ようなので、今回ネタにすることにしました。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;「ランダム」というキーワードを取り上げたエントリも参考に紹介します。&lt;/em&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2015/11/12/073000/16/"&gt;Bash シェルスクリプトでランダムな文字列を生成する&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2014/07/10/014035/19/"&gt;Bash シェルスクリプトで 1〜100 までの数からランダムに 10 個を重複なしで取り出す方法&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2021/03/07/082456/2405/"&gt;シェルで shuf コマンドを使って入力情報をいろんな方法でシャッフルしてみる(組み合わせにも使える)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;21.04 (Hirsute Hippo)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.4&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="乱数を取得するための組み込み変数randomを使う"&gt;乱数を取得するための組み込み変数「RANDOM」を使う&lt;/h2&gt;&#10;&lt;p&gt;Bash には、乱数を取得するための組み込み変数として &lt;strong&gt;RANDOM&lt;/strong&gt; というものが用意されています。&lt;/p&gt;&#10;&lt;p&gt;試しに &lt;code&gt;$RANDOM&lt;/code&gt; を出力してみましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$RANDOM&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;458&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$RANDOM&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11854&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;echo $RANDOM&lt;/code&gt; を実行するたびに、出力される数値が異なります。&lt;/p&gt;&#10;&lt;h2 id="random-変数の最大値は最小値は"&gt;&amp;ldquo;RANDOM&amp;rdquo; 変数の最大値は？最小値は？&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;RANDOM&lt;/strong&gt; 変数は参照するたびにランダムな値を返しますが、値の範囲はどうなっているでしょうか？&lt;/p&gt;&#10;&lt;p&gt;試しに &lt;code&gt;$RANDOM&lt;/code&gt; を 1,000,000 回 出力した結果を集計してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1,000,000回 ループして、 RANDOM 変数を参照する。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 結果を ソート → 重複除去 してファイルに書き出す。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;for&lt;/span&gt; i in &lt;span class="o"&gt;{&lt;/span&gt;0..1000000&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;RANDOM&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort -n &lt;span class="p"&gt;|&lt;/span&gt; uniq &amp;gt; result.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイルの行数は 32,768 行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wc -l result.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;32768&lt;/span&gt; result.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 先頭5行を確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;5&lt;/span&gt; result.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 末尾5行を確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tail -n &lt;span class="m"&gt;5&lt;/span&gt; result.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;32763&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;32764&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;32765&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;32766&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;32767&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このように、 &lt;strong&gt;&amp;ldquo;RANDOM&amp;rdquo; 変数は 0 〜 32767 の間でランダムな数値を返却します&lt;/strong&gt; 。&lt;/p&gt;</description></item><item><title>13年前の投稿で解いたプログラミング問題をシェルで解いてみる</title><link>https://genzouw.com/entry/2022/01/27/141857/2879/</link><pubDate>Thu, 27 Jan 2022 14:18:57 +0900</pubDate><guid>https://genzouw.com/entry/2022/01/27/141857/2879/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;もう13年も前になる記事がふと目に入って、今だったらどう解くかな？とやってみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2009/06/05/152000/322/"&gt;topcoderの道１をといてみる | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="問題"&gt;問題&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;（難易度　超簡単, 目標時間　１０分以内）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;与えられた英語の大文字で構成された文字列の中の文字を、与えられた数字の分だけ左にシフトさせなさい。たとえば、’C’を２つ左にシフトさせると’A’、’Z’を２つ左にシフトさせると’X’。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;与えられる英語の文字列はAからZで、Aの次はZにシフトさせるものとする。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;例1)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;VQREQFGT&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Returns: &amp;#34;TOPCODER&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;例2)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;10&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Returns: &amp;#34;QRSTUVWXYZABCDEFGHIJKLMNOP&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;例3)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;TOPCODER&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Returns: &amp;#34;TOPCODER&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;例4)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;#34;LIPPSASVPH&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Returns: &amp;#34;HELLOWORLD&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="解答"&gt;解答&lt;/h2&gt;&#10;&lt;p&gt;シェルで解いてみました。&lt;/p&gt;&#10;&lt;h3 id="mainsh"&gt;&lt;code&gt;main.sh&lt;/code&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ABCDEFGHIJKLMNOPQRSTUVWXYZ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -E &lt;span class="s2"&gt;&amp;#34;s/^(.*)(.{&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;})&lt;/span&gt;$&lt;span class="s2"&gt;/\2\1/&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="実行"&gt;実行&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./main.sh &lt;span class="s2"&gt;&amp;#34;VQREQFGT&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TOPCODER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./main.sh &lt;span class="s2"&gt;&amp;#34;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;QRSTUVWXYZABCDEFGHIJKLMNOP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./main.sh &lt;span class="s2"&gt;&amp;#34;TOPCODER&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;TOPCODER&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./main.sh &lt;span class="s2"&gt;&amp;#34;LIPPSASVPH&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HELLOWORLD&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;日々コーディングを横着しているから、だんだんシェルしかかけない頭になってきている気がしています。&lt;/p&gt;</description></item><item><title>シェルスクリプト(awk)でCSVデータの行合計、列合計を算出する</title><link>https://genzouw.com/entry/2022/01/26/210043/2860/</link><pubDate>Wed, 26 Jan 2022 21:00:43 +0900</pubDate><guid>https://genzouw.com/entry/2022/01/26/210043/2860/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;あまり &lt;strong&gt;AWK&lt;/strong&gt; が得意ではないのでエントリで取り扱うことがありませんでしたが、csvファイルの行合計、列合計を求める作業をしたためエントリにまとめました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備テスト用のcsvデータ"&gt;準備：テスト用のcsvデータ&lt;/h2&gt;&#10;&lt;p&gt;今回は &lt;code&gt;awk&lt;/code&gt; を使って行の合計、列の合計を算出してみようと思います。&lt;/p&gt;&#10;&lt;p&gt;算出操作を紹介する際に利用するテストデータを事前に準備します。&lt;/p&gt;&#10;&lt;p&gt;適当なデータファイルとして &lt;strong&gt;data.csv&lt;/strong&gt; を作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs -n &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/ \+/,/g&amp;#39;&lt;/span&gt; &amp;gt;data.csv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;作成された &lt;strong&gt;data.csv&lt;/strong&gt; のデータは以下のようになっています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat data.csv&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1,2,3,4,5&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6,7,8,9,10&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;11,12,13,14,15&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;16,17,18,19,20&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;21,22,23,24,25&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;26,27,28,29,30&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="awk-で各行の合計を算出する方法"&gt;&lt;code&gt;awk&lt;/code&gt; で各行の合計を算出する方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;awk&lt;/code&gt; コマンドを使い、各行に対して、5列の値を合計し出力してみたいと思います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ awk &amp;lt;data.csv -F, &lt;span class="s1"&gt;&amp;#39;{ sum=0; for (i=1; i&amp;lt;=NF; i++) { sum+=$i } print sum; }&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;15&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;40&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;65&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;90&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;115&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;140&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;各列の区切り文字として「カンマ ( &lt;code&gt;,&lt;/code&gt; )」を利用したい場合には、 &lt;code&gt;-F,&lt;/code&gt; というオプションを指定します。&lt;/p&gt;</description></item><item><title>2つのコマンドをパイプで繋いだときのパイプバッファをエディタで編集する方法</title><link>https://genzouw.com/entry/2022/01/25/201041/2855/</link><pubDate>Tue, 25 Jan 2022 20:10:41 +0900</pubDate><guid>https://genzouw.com/entry/2022/01/25/201041/2855/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;以前 &lt;a href="https://genzouw.com/entry/2022/01/22/081052/2844/"&gt;コマンド実行結果を Vim や Visual Studio Code で開く方法&lt;/a&gt; というエントリで、あるコマンドの実行結果をエディタにわたすための方法を紹介しました。&lt;/p&gt;&#10;&lt;p&gt;今回はそれに関連したエントリです。&lt;/p&gt;&#10;&lt;p&gt;Linux には、「あるコマンドの ( 標準 ) 出力」を「別のコマンドの ( 標準 ) 入力」として渡すための方法として &lt;strong&gt;「パイプ」&lt;/strong&gt; が用意されています。&lt;/p&gt;&#10;&lt;p&gt;例えば、 &lt;code&gt;seq&lt;/code&gt; コマンドの実行結果を 2 行だけ抽出したい場合には、 &lt;code&gt;head&lt;/code&gt; コマンドをパイプ (&lt;code&gt;|&lt;/code&gt;)でつないで実行してやります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1から5まで5行出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# seq 5 の実行結果から先頭2行を出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで &lt;code&gt;seq 5&lt;/code&gt; の実行結果が、 &lt;code&gt;head -n 2&lt;/code&gt; に渡る前にエディタで加工する方法があります。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="vipe-コマンドでパイプバッファをエディタで編集する"&gt;&lt;code&gt;vipe&lt;/code&gt; コマンドでパイプバッファをエディタで編集する&lt;/h2&gt;&#10;&lt;p&gt;パイプバッファをエディタで編集するツールとして、 &lt;code&gt;vipe&lt;/code&gt; というツールがあります。&lt;/p&gt;</description></item><item><title>コマンド実行結果をVimやVisual Studio Codeで開く方法</title><link>https://genzouw.com/entry/2022/01/22/081052/2844/</link><pubDate>Sat, 22 Jan 2022 08:10:52 +0900</pubDate><guid>https://genzouw.com/entry/2022/01/22/081052/2844/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;先日、会社の後輩からターミナルでコマンドを実行した結果をエディタで開く方法がないか質問があったときに回答した内容を紹介します。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;暗号化されているファイルを復号化した結果をエディタで開いて触りたいが、コマンド実行結果をクリップボードに貼り付けて、という操作が面倒というのが発端です。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Vim&lt;/strong&gt; でのやり方を知っていましたが、後輩は &lt;strong&gt;Visual Code Studio&lt;/strong&gt; 使いだったために「さあどうしようか」と思いました。&#10;ダメ元で &lt;strong&gt;Vim&lt;/strong&gt; と同じ方法を実行してみたところ、うまく行けてびっくりしました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin21.1.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="コマンド実行結果をvimやvisual-studio-codeで開く方法"&gt;コマンド実行結果をVimやVisual Studio Codeで開く方法&lt;/h2&gt;&#10;&lt;h3 id="vim-の場合"&gt;&amp;ldquo;Vim&amp;rdquo; の場合&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Vim&lt;/strong&gt; では、パイプで渡された文字列を開くことができます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;vim -&lt;/code&gt; というコマンドを利用します。&lt;/p&gt;&#10;&lt;p&gt;多くのコマンドで、 &lt;code&gt;-&lt;/code&gt; という引数は &lt;strong&gt;「標準入力」&lt;/strong&gt; を表します。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;vim -&lt;/code&gt; とは &lt;strong&gt;「標準入力の内容をファイルに見立ててエディタで開く」&lt;/strong&gt; という命令になります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 100 から 105 までの連番を出力するコマンド&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;100&lt;/span&gt; &lt;span class="m"&gt;105&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;100&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;101&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;102&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;103&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;104&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;105&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# seq コマンド実行結果をVimにパイプで渡す&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;100&lt;/span&gt; &lt;span class="m"&gt;105&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; vim -&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1wJdzQCB3XAHmctcLOQNjj-tks9kRumYm" alt=""&gt;&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで2つのディレクトリ内のファイル名のみを比較する(ファイルの内容の違いは許容)</title><link>https://genzouw.com/entry/2022/01/21/212411/2840/</link><pubDate>Fri, 21 Jan 2022 21:24:11 +0900</pubDate><guid>https://genzouw.com/entry/2022/01/21/212411/2840/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;過去に以下のようなエントリを投稿しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2021/04/27/211354/2559/"&gt;Bashシェルスクリプトで2つのディレクトリを比較し内容に差異があったファイルを一覧表示する | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;今回は似ていますが、&#10;&lt;strong&gt;存在するファイル名の違いを出力してみたいと思います。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ファイルの中身に違いがあっても差分として検出しません。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="検証のための事前準備"&gt;検証のための事前準備&lt;/h2&gt;&#10;&lt;p&gt;比較するための2つのディレクトリ &lt;code&gt;dir1&lt;/code&gt; と &lt;code&gt;dir2&lt;/code&gt; を作成し、いくつかのファイルを作成しておきます。&lt;/p&gt;&#10;&lt;p&gt;後ほどこの2つのディレクトリに含まれているファイル名を比較します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# dir1 とそのサブディレクトリ、含まれるファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p dir1/a dir1/b dir1/c/d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date &amp;gt;dir1/a/1.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date &amp;gt;dir1/b/2.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date &amp;gt;dir1/c/3.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date &amp;gt;dir1/c/4.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date &amp;gt;dir1/c/d/5.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# dir2 とそのサブディレクトリ、含まれるファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p dir2/a dir2/b dir2/c/d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date &amp;gt;dir2/a/1.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date &amp;gt;dir2/c/3.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date &amp;gt;dir2/c/5.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date &amp;gt;dir2/c/d/5.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;tree&lt;/code&gt; コマンドでそれぞれのディレクトリの階層構造を確認してみましょう。&lt;/p&gt;</description></item><item><title>実行中のBashシェルスクリプトを書き換えると挙動が変わる問題とその対処法</title><link>https://genzouw.com/entry/2022/01/18/080007/2826/</link><pubDate>Tue, 18 Jan 2022 08:00:07 +0900</pubDate><guid>https://genzouw.com/entry/2022/01/18/080007/2826/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;時事ネタに乗り遅れましたが、昨年末にTwitterで話題になっていた内容について、かんたんなスクリプトを取り上げながら理解を整理してみたいと思います。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;bashは、&#10;シェルスクリプトの実行中に適時シェルスクリプトを読み込みます。&#10;この挙動による副作用を認識できておらず、&#10;実行中のスクリプトが存在している状態でスクリプトの上書きによりリリースしてしまったことで、&#10;途中から修正したシェルスクリプトの再読み込みが発生し、&#10;結果的に未定義の変数を含むfindコマンドが実行されてしまいました。&lt;/p&gt;&#10;&lt;p&gt;この結果、&#10;本来のログディレクトリに保存されたファイルの削除をする処理ではなく、&#10;/LARGE0のファイルを削除してしまいました&lt;/p&gt;&#10;&lt;p&gt;引用 : 「https://www.iimc.kyoto-u.ac.jp/services/comp/pdf/file_loss_insident_20211228.pdf」&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;僕もよくお世話になっている企業様ですし、&#10;お詫びの文面を公開し紳士に対応する姿勢、素晴らしいと思います。&#10;（被害を受けた側は災難だったと思いますが。）&lt;/p&gt;&#10;&lt;p&gt;そして、こちらの問題、決して他人事にできないと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ケース1永遠に終了しない"&gt;ケース1：永遠に終了しない&lt;/h2&gt;&#10;&lt;p&gt;障害の原因は「Bashシェルスクリプトの実行中に適時シェルスクリプトを読み込む」という特性によるものということでした。&lt;/p&gt;&#10;&lt;p&gt;実験して特性を確認してみます。&lt;/p&gt;&#10;&lt;p&gt;シェルスクリプトで、自身の末尾に処理を追記する処理を実行し続けたらどうなるでしょう？&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;test1.sh&lt;/code&gt; を作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; hello&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; hello実行中&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;hello&lt;/code&gt; 関数は以下のような動作をします。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;自身のシェルスクリプトの末尾に &lt;code&gt;hello&lt;/code&gt; 関数呼び出し処理を追記&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;hello実行中&amp;rdquo; と出力&lt;/li&gt;&#10;&lt;li&gt;1秒待つ&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;この &lt;code&gt;test1.sh&lt;/code&gt; スクリプトを実行してみます。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプト(コマンドライン)でファイル名の一括置換を行う(ファイル名にスペースあり)</title><link>https://genzouw.com/entry/2022/01/17/145639/2823/</link><pubDate>Mon, 17 Jan 2022 14:56:39 +0900</pubDate><guid>https://genzouw.com/entry/2022/01/17/145639/2823/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;昨年後半から仕事が忙しく、ブログ投稿を行っていました。&#10;些細なネタでもいいので毎日続けることが大事だと反省しました。&lt;/p&gt;&#10;&lt;p&gt;というのも、投稿を怠っていた間もブログを見てくれた方、訪問数、いいねの数が伸び続け、&#10;&lt;strong&gt;月間の訪問者数もついに 5万PV/月 となっていたためです&lt;/strong&gt; ！&lt;/p&gt;&#10;&lt;p&gt;ありがとうございます。&lt;/p&gt;&#10;&lt;p&gt;今年一発目の投稿は多くの人がご存知の一発ネタですね。&#10;Bashで特定のフォルダ配下にあるファイルの名前を一括置換する方法です。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;----------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;----------&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;適当なファイルとフォルダを作ります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 適当なディレクトリを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p dir1/ dir2/dir2-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 適当なファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch dir1/file-001.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch dir2/file-002.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch dir2/dir2-1/file-003.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch dir3/dir3-1/file-004.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch &lt;span class="s2"&gt;&amp;#34;dir3/dir3-1/file- -005.txt&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&amp;ldquo;file- -005.txt&amp;quot;だけ、ファイル名にスペースを含んでいることに注意です。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;フォルダ構成を確認してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tree -f&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;-- ./dir1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- ./dir1/file-001.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;-- ./dir2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;-- ./dir2/dir2-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- ./dir2/dir2-1/file-003.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- ./dir2/file-002.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;`&lt;/span&gt;-- ./dir3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- ./dir3/dir3-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt;-- ./dir3/dir3-1/file-&lt;span class="se"&gt;\ &lt;/span&gt;-005.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- ./dir3/dir3-1/file-004.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt; directories, &lt;span class="m"&gt;5&lt;/span&gt; files&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="一括置換を行う"&gt;一括置換を行う&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;find&lt;/code&gt; コマンドで実行した結果をループで読み込み &lt;code&gt;mv&lt;/code&gt; しましょう。&lt;/p&gt;</description></item><item><title>意外と知られていない？シェルスクリプトで1秒未満のsleep(wait)が使える</title><link>https://genzouw.com/entry/2021/09/18/091022/2791/</link><pubDate>Sat, 18 Sep 2021 09:10:22 +0900</pubDate><guid>https://genzouw.com/entry/2021/09/18/091022/2791/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今回紹介する機能が利用できる環境、利用できない環境があるかと思います。&#10;（逆に利用できる環境のほうが少ないかもしれないです ^^;）&lt;/p&gt;&#10;&lt;p&gt;シェルスクリプトで1秒未満のsleep (wait処理といったほうがよい？) を行う方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.22&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2013&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sleep-に小数を指定するだけ"&gt;sleep に小数を指定するだけ&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;ブログネタがなかったのでひねり出したというのが正直なところですね。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;1秒未満の &lt;code&gt;sleep&lt;/code&gt; 処理を行う方法、それは &lt;strong&gt;「&lt;code&gt;sleep&lt;/code&gt; コマンドの引数に小数を指定する」&lt;/strong&gt; だけです。&lt;/p&gt;&#10;&lt;p&gt;なんか昔は小数指定できなかった気がしたんですけどね。&#10;数年前に0.1秒ごとにポーリングする機能を実現する際に使ってみたらいけました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sleep 0.5&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; ok&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ok&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のコマンドは 「0.5秒待ってから &amp;ldquo;ok&amp;rdquo; という文字を出力する処理」ですが、本当に0.5秒waitしたのかわからないですね。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;開始時間と終了時間の差&lt;/strong&gt; を出力して確認してみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;date +%s%3N&lt;/code&gt; というコマンドでミリ秒を取得できる&lt;/strong&gt; ので、これを利用します。&lt;/p&gt;</description></item><item><title>シェルスクリプトが二重起動されないように flock で排他制御を行う</title><link>https://genzouw.com/entry/2021/09/14/140315/2788/</link><pubDate>Tue, 14 Sep 2021 14:03:15 +0900</pubDate><guid>https://genzouw.com/entry/2021/09/14/140315/2788/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;最近ではすっかり &lt;strong&gt;Docker&lt;/strong&gt; を使うようになり、 Linux サーバの Daemon に触れることがなくなりました。&lt;/p&gt;&#10;&lt;p&gt;久しぶりに Daemon 設定を触る機会がありました。&lt;/p&gt;&#10;&lt;p&gt;起動スクリプトにシェルスクリプトを設定しましたが、Daemon 起動中に万が一に二重起動してしまったら、あるいは手動実行されてしまったらといった場合に備えて、二重起動を抑制する仕組みを入れておきたいと思いました。&lt;/p&gt;&#10;&lt;p&gt;シェルスクリプトが二重起動されないように方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ flock --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flock from util-linux 2.23.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="flock-コマンドを利用する"&gt;&lt;code&gt;flock&lt;/code&gt; コマンドを利用する&lt;/h2&gt;&#10;&lt;p&gt;Linux に用意されている &lt;code&gt;flock&lt;/code&gt; コマンドを使うことで二重起動を抑制することができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;type&lt;/span&gt; flock&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;flock is hashed &lt;span class="o"&gt;(&lt;/span&gt;/usr/bin/flock&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;flock&lt;/code&gt; は &lt;strong&gt;ファイルディスクリプタ&lt;/strong&gt; を指定することで、対象ファイルをロックするコマンドです。&lt;/p&gt;&#10;&lt;p&gt;( &lt;strong&gt;ファイルディスクリプタ&lt;/strong&gt; とは、「ファイル」を操作するための別名、番号です。 )&lt;/p&gt;&#10;&lt;p&gt;過去に少しだけ「ファイルディスクリプタ」に触れた記事もありますので、参考にどうぞ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/05/28/090021/1556/"&gt;オープンできるファイル数上限を管理する「ファイルディスクリプタ」について（ &lt;code&gt;Too many open files&lt;/code&gt; エラーを理解する ） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="サンプルスクリプト"&gt;サンプルスクリプト&lt;/h3&gt;&#10;&lt;p&gt;二重起動を抑制するためのサンプルスクリプトを掲載します。&lt;/p&gt;</description></item><item><title>AWSの設定(プロファイル)をコマンドで簡単に切り替える方法</title><link>https://genzouw.com/entry/2021/09/03/212610/2769/</link><pubDate>Fri, 03 Sep 2021 21:26:10 +0900</pubDate><guid>https://genzouw.com/entry/2021/09/03/212610/2769/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;管理するクラウド上のシステムが増えてくると、AWS の設定(プロファイル)の切り替えが頻発してきます。&lt;/p&gt;&#10;&lt;p&gt;aws では、設定情報+認証情報をそれぞれ以下のファイルで管理しています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;`~/.aws/config&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;~/.aws/credentials&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;僕の Mac の設定ファイルはそれぞれ以下のようになっています。 ( &lt;em&gt;セキュアな情報のため、一部マスキング OR 変換しています。&lt;/em&gt; )&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat ~/.aws/config&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;default&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ap-southeast-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;profile project-production&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ap-northeast-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;profile project-staging&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ap-northeast-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;profile project-development&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;region&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ap-northeast-1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat ~/.aws/credentials&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;default&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_access_key_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ********************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_secret_access_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ****************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;project-production&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_access_key_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ********************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_secret_access_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ****************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;project-staging&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_access_key_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ********************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_secret_access_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ****************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;project-development&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_access_key_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ********************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;aws_secret_access_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; ****************************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;僕の Mac には AWS 接続用のプロファイルが &lt;strong&gt;4 つ&lt;/strong&gt; 存在していることになります。&lt;/p&gt;</description></item><item><title>"docker diff"を使って"pip install"のライブラリインストール先を調べる</title><link>https://genzouw.com/entry/2021/09/03/092437/2765/</link><pubDate>Fri, 03 Sep 2021 09:24:37 +0900</pubDate><guid>https://genzouw.com/entry/2021/09/03/092437/2765/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;クラウド化、コンテナ化、マイクロサービス化が進み、システムを &lt;strong&gt;複数の言語で作られたサブシステム&lt;/strong&gt; で構成することが増えてきました。&#10;どんどん学習も大変になって来ています。&#10;Python、Go、TypeScript、Ruby といろんな言語を学習する必要に迫られているわけですが、それぞれの &lt;strong&gt;ライブラリ管理ツール&lt;/strong&gt; ( PIP、BUNDLER、NPM、&amp;hellip; ) がライブラリをどこにインストールするのか調べたいと思いました。&lt;/p&gt;&#10;&lt;p&gt;Linux のファイル寿司テム全体で &lt;code&gt;diff&lt;/code&gt; を使って変更されたファイルを確認できれば便利ですね。&lt;/p&gt;&#10;&lt;p&gt;そんなときに便利なのが &lt;code&gt;docker diff&lt;/code&gt; コマンドです。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 20.10.7, build f0df350&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-diff-を使って-pip-コマンドでライブラリがインストールされる場所を調べる"&gt;&lt;code&gt;docker diff&lt;/code&gt; を使って &lt;code&gt;pip&lt;/code&gt; コマンドでライブラリがインストールされる場所を調べる&lt;/h2&gt;&#10;&lt;p&gt;それでは &lt;code&gt;docker diff&lt;/code&gt; コマンドを使って &lt;code&gt;pip install&lt;/code&gt; でライブラリがどこにインストールされるのかを調べてみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;pip&lt;/code&gt; は Python のコマンドですので、Python の Docker イメージを使用します。&lt;/p&gt;&#10;&lt;h3 id="1-docker-コンテナの起動"&gt;1. Docker コンテナの起動&lt;/h3&gt;&#10;&lt;p&gt;Docker コンテナを起動します。&#10;起動する際に &lt;strong&gt;わかりやすい名前を付けておきます&lt;/strong&gt; 。&lt;/p&gt;</description></item><item><title>コマンドラインから新しいウィンドウで Chrome ブラウザを開きたい</title><link>https://genzouw.com/entry/2021/08/29/081919/2762/</link><pubDate>Sun, 29 Aug 2021 08:19:19 +0900</pubDate><guid>https://genzouw.com/entry/2021/08/29/081919/2762/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Mac の &lt;code&gt;open&lt;/code&gt; コマンド、便利ですね。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ open &lt;span class="s2"&gt;&amp;#34;ファイルやURL&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;というコマンドを実行すれば、テキストファイルであれば簡易なエディタが、URL であれば Chrome ブラウザが起動します。&lt;/p&gt;&#10;&lt;p&gt;ここで起動する Chrome ブラウザですが、すでに起動している Chrome ブラウザのウィンドウが存在していた場合、ページは新しい &lt;strong&gt;タブ&lt;/strong&gt; として表示されます。&lt;/p&gt;&#10;&lt;p&gt;しかし、タブではなく &lt;strong&gt;ウィンドウ&lt;/strong&gt; として起動したい場合にはどうしたら良いでしょうか？&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="s2"&gt;&amp;#34;/Applications/Google Chrome.app/Contents/MacOS/Google Chrome&amp;#34;&lt;/span&gt; --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Google Chrome 92.0.4515.159&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="open-url-で起動するアプリケーションの実態"&gt;&lt;code&gt;open &amp;quot;URL&amp;quot;&lt;/code&gt; で起動するアプリケーションの実態&lt;/h2&gt;&#10;&lt;p&gt;例えば &lt;code&gt;open &amp;quot;https://google.jp&amp;quot;&lt;/code&gt; コマンドが実行されたときに起動する Chrome ブラウザアプリケーションの実態はどこにあるでしょうか？&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Mac 環境に限って言えばこれは &lt;code&gt;&amp;quot;/Applications/Google Chrome.app/Contents/MacOS/Google Chrome&amp;quot;&lt;/code&gt; というアプリケーションになります。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;ですので、以下のコマンドを実行しても同じ結果となります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="s2"&gt;&amp;#34;/Applications/Google Chrome.app/Contents/MacOS/Google Chrome&amp;#34;&lt;/span&gt; https://google.jp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="chrome-アプリケーション起動時の新規ウィンドウ起動オプション"&gt;Chrome アプリケーション起動時の新規ウィンドウ起動オプション&lt;/h2&gt;&#10;&lt;p&gt;Chorme アプリケーション起動の際に &lt;code&gt;--new-window&lt;/code&gt; オプションを指定し、新規ウィンドウの起動を強制することができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="s2"&gt;&amp;#34;/Applications/Google Chrome.app/Contents/MacOS/Google Chrome&amp;#34;&lt;/span&gt; --new-window https://google.jp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="open-コマンドを使う場合も---new-window-オプションを使う"&gt;&lt;code&gt;open&lt;/code&gt; コマンドを使う場合も &lt;code&gt;--new-window&lt;/code&gt; オプションを使う&lt;/h2&gt;&#10;&lt;p&gt;Chrome アプリケーションを &lt;code&gt;--new-window&lt;/code&gt; オプション付きで呼び出すことでタブではなくウィンドウで起動することができました。&lt;/p&gt;</description></item><item><title>最近のtarコマンドは展開時だけでなく、圧縮時もフォーマットを自動判定してくれる</title><link>https://genzouw.com/entry/2021/08/24/120019/2760/</link><pubDate>Tue, 24 Aug 2021 12:00:19 +0900</pubDate><guid>https://genzouw.com/entry/2021/08/24/120019/2760/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;随分眺めの夏休みでした。ブログ投稿も二週間空いてしまいました。&#10;一度途絶えた習慣をもう一度体に染み込ませるのは骨が折れます。&#10;早くも頭が抵抗して「面倒くさい」気持ちが生まれてしまいました。&#10;気を取り直して。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;こちらのエントリを書くきっかけは以前投稿した以下のエントリです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2021/07/18/075116/2728/"&gt;tar コマンドで”z フラグを付ける”、”ハイフンを付けない”のはおっさんだそうです | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;tarball&lt;/strong&gt; ファイルを &lt;strong&gt;展開する&lt;/strong&gt; 際に、&#10;最近は圧縮フォーマットが自動判定されるため、&#10;&lt;code&gt;z&lt;/code&gt; (gzip ファイル展開時) やら &lt;code&gt;j&lt;/code&gt; (bzip2 ファイル展開時) やら &lt;code&gt;J&lt;/code&gt; (xz ファイル展開時)のオプションは指定不要ということでした。&lt;/p&gt;&#10;&lt;p&gt;追加で調べてみると、展開時だけでなく &lt;strong&gt;圧縮時&lt;/strong&gt; もフォーマット指定が不要ということがわかりました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tar --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar &lt;span class="o"&gt;(&lt;/span&gt;GNU tar&lt;span class="o"&gt;)&lt;/span&gt; 1.26&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2011&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;License GPLv3+: GNU GPL version &lt;span class="m"&gt;3&lt;/span&gt; or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is free software: you are free to change and redistribute it.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;There is NO WARRANTY, to the extent permitted by law.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Written by John Gilmore and Jay Fenlason.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-a-オプションを使う"&gt;&lt;code&gt;-a&lt;/code&gt; オプションを使う&lt;/h2&gt;&#10;&lt;p&gt;いろんな圧縮フォーマットのファイルを圧縮する際に、 &lt;code&gt;z&lt;/code&gt; / &lt;code&gt;j&lt;/code&gt; / &lt;code&gt;J&lt;/code&gt; その他と使い分けるのは面倒です。&#10;忘れてしまっていたらいちいち調べないといけないのも手間ですね。&lt;/p&gt;</description></item><item><title>シェルでfindコマンドの実行結果を `ls -l` のようなフォーマットで出力する</title><link>https://genzouw.com/entry/2021/08/08/085930/2756/</link><pubDate>Sun, 08 Aug 2021 08:59:30 +0900</pubDate><guid>https://genzouw.com/entry/2021/08/08/085930/2756/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;find&lt;/code&gt; コマンドを実行するとファイルの一覧が出力されます。&lt;/p&gt;&#10;&lt;p&gt;例えば、以下は &lt;code&gt;/etc&lt;/code&gt; ディレクトリの中から、拡張子 &lt;code&gt;sh&lt;/code&gt; を持つファイルを検索し一覧表示した結果となります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ find /etc -name &lt;span class="s1"&gt;&amp;#39;*.sh&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/bash_completion.d/mercurial.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/profile.d/colorgrep.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/profile.d/colorls.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/profile.d/less.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに一番最初に見つかったファイルを &lt;code&gt;ls -l&lt;/code&gt; コマンドの引数として実行すると、以下のようにファイルのパーミッションや所有者、グループ、サイズが確認できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -l /etc/bash_completion.d/mercurial.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;11736&lt;/span&gt; Apr &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;2020&lt;/span&gt; /etc/bash_completion.d/mercurial.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;find&lt;/code&gt; の実行結果を &lt;code&gt;ls -l&lt;/code&gt; のようなフォーマットで出力する方法はないでしょうか？&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="方法1---ls-オプションを使用する"&gt;方法1 : &lt;code&gt;-ls&lt;/code&gt; オプションを使用する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;find&lt;/code&gt; コマンドには、 &lt;code&gt;-ls&lt;/code&gt; オプションというものがあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;-ls&lt;/code&gt; オプションを付与すると、 &lt;code&gt;find&lt;/code&gt; の実行結果が &lt;code&gt;-ls&lt;/code&gt; のようになります。 ( 厳密には &lt;code&gt;ls -dils&lt;/code&gt; の実行結果と同様の表示のされ方となります。 )&lt;/p&gt;</description></item><item><title>direnvと環境変数を使ってGitのユーザ名、メールアドレス、SSH KEYをリポジトリ毎に切り替える</title><link>https://genzouw.com/entry/2021/08/04/153026/2750/</link><pubDate>Wed, 04 Aug 2021 15:30:26 +0900</pubDate><guid>https://genzouw.com/entry/2021/08/04/153026/2750/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Github を使って複数のプロジェクトを兼任していると、Git の複数アカウントを切り替えて使う必要がある場合があります。&lt;/p&gt;&#10;&lt;p&gt;僕は諸事情により Github アカウントを仕事用 x2、個人用 x1 を所有しています。&lt;/p&gt;&#10;&lt;p&gt;よく知られている方法としては、&#10;以下のように &lt;code&gt;git config --local&lt;/code&gt; コマンドで切り替えるやり方があります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config --local user.name &lt;span class="s2"&gt;&amp;#34;アカウント&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config --local user.email &lt;span class="s2"&gt;&amp;#34;メールアドレス&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config --local core.sshCommand&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ssh -i ~/.ssh/ANOTHER_ID_RSA&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こういったマルチアカウント利用ケースにて、 環境変数を使って Git の &lt;strong&gt;ユーザ名(username)&lt;/strong&gt; 、 &lt;strong&gt;e-mail(email)&lt;/strong&gt; 、 &lt;strong&gt;SSH KEY&lt;/strong&gt; の切り替え作業を効率化するための方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.32.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前提条件必要なツール"&gt;前提条件（必要なツール）&lt;/h2&gt;&#10;&lt;p&gt;今回は &lt;a href="https://github.com/direnv/direnv"&gt;direnv&lt;/a&gt; というツールを利用することを前提としています。&lt;/p&gt;</description></item><item><title>"git prune"コマンドが何をしてくれるものなのかを操作しながら理解する</title><link>https://genzouw.com/entry/2021/07/21/093334/2734/</link><pubDate>Wed, 21 Jul 2021 09:33:34 +0900</pubDate><guid>https://genzouw.com/entry/2021/07/21/093334/2734/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git prune&lt;/code&gt; コマンドは掃除用の Git サブコマンドです。&lt;/p&gt;&#10;&lt;p&gt;Git のコミット履歴の実体はハッシュ値を一意キーとする &lt;strong&gt;&amp;ldquo;Git オブジェクト&amp;rdquo;&lt;/strong&gt; の集合体です。&#10;Git オブジェクトのうち、到達不能(不要)になったものを掃除するために使用するのが &lt;code&gt;git prune&lt;/code&gt; コマンドです。&lt;/p&gt;&#10;&lt;p&gt;ブランチ名やタグ名を起点として、コミットツリーからたどることができなくなった要素を &lt;strong&gt;到達不能となった Git オブジェクト&lt;/strong&gt; と呼びます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git prune&lt;/code&gt;は基本的に直接実行しません。&lt;/p&gt;&#10;&lt;p&gt;「ゴミ掃除コマンド」であり、&lt;code&gt;git gc&lt;/code&gt; コマンドの &lt;em&gt;子コマンド&lt;/em&gt; ( &lt;code&gt;git gc&lt;/code&gt; コマンドの中で実行されるコマング群の 1 つ ) です。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Impish Indri (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.31.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="git-prune-コマンドのお掃除機能について"&gt;&lt;code&gt;git prune&lt;/code&gt; コマンドの「お掃除機能」について&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git prune&lt;/code&gt;コマンドが実行されたときにどんなことが起きるかを理解するために、&#10;実際に到達不能なコミットを作った後、実行してみましょう。&lt;/p&gt;</description></item><item><title>"git commit --amend" コマンド実行時にコミットログの入力を省略する方法</title><link>https://genzouw.com/entry/2021/07/20/141706/2732/</link><pubDate>Tue, 20 Jul 2021 14:17:06 +0900</pubDate><guid>https://genzouw.com/entry/2021/07/20/141706/2732/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;CI/CD パイプラインの動作確認をしていました。&#10;Github へのプッシュを契機にうまく動作するかを見ていました。&lt;/p&gt;&#10;&lt;p&gt;何度か &lt;code&gt;git commit --amend&lt;/code&gt; コマンドを実行しては &lt;code&gt;git push origin --force-with-lease&lt;/code&gt; を実行していたのですが、&#10;&lt;code&gt;git commit --amend&lt;/code&gt; するたびにコミットログの入力のためのエディタが起動するのが煩わしくどうにかならないかと思って調べてみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;別ブランチを作る、別リポジトリを作るなどするべきなのかもしれません。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 1.8.3.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-c-オプションを指定する"&gt;&lt;code&gt;-C&lt;/code&gt; オプションを指定する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;-C&lt;/code&gt; オプションを指定し、どのコミットのログを採用するかを指定してやればよいです。&lt;/p&gt;&#10;&lt;p&gt;最終コミットのログをそのまま採用したいので、 &lt;code&gt;-C HEAD&lt;/code&gt; のように指定してやります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git commit --amend -C HEAD&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これは便利です。&lt;/p&gt;</description></item><item><title>Terraformでstateのロックを解除する方法、ロックを手動で行う方法</title><link>https://genzouw.com/entry/2021/07/19/142312/2730/</link><pubDate>Mon, 19 Jul 2021 14:23:12 +0900</pubDate><guid>https://genzouw.com/entry/2021/07/19/142312/2730/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Terraform には自動的にステートをロックする機能があります。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;terraform plan&lt;/code&gt; や &lt;code&gt;terraform apply&lt;/code&gt; コマンドを実行したときに自動的にロックされるので、 普段意識して操作する事はありません。&lt;/p&gt;&#10;&lt;p&gt;チーム開発する際には &lt;strong&gt;Terraform&lt;/strong&gt; のステートをクラウドサービス(AWS S3、GCP Cloud Storage、AWS DynamoDB など)を使って管理することが多いでしょう。&lt;/p&gt;&#10;&lt;p&gt;この場合、 &lt;code&gt;terraform plan&lt;/code&gt; コマンド実行中に &lt;strong&gt;Ctrl + C&lt;/strong&gt; などで強制停止してしまうと、クラウドサービス上にロックデータが残ってしまいます。&#10;結果、以降の &lt;code&gt;terraform plan&lt;/code&gt; や &lt;code&gt;terraform apply&lt;/code&gt; コマンドを実行できなくなってしまいます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;これを解消する方法&lt;/strong&gt; と &lt;strong&gt;逆に明示的にロックを行い、チームメンバーに対して排他する方法&lt;/strong&gt; について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ terraform --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Terraform v0.13.7&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ステートのロックを解除する方法"&gt;ステートのロックを解除する方法&lt;/h2&gt;&#10;&lt;p&gt;僕は GCP の Cloud Storage を使うことが多いのですが、中途半端にステートのロックが残ってしまった場合には &lt;code&gt;gs://XXXXX&lt;/code&gt; といったステート管理バケット上にロックファイルが残ってしまいます。&#10;こちらを直接削除してもいいのですが、 &lt;code&gt;terraform&lt;/code&gt; コマンドにロック解除コマンドが提供されているのでこれを利用するのが良いでしょう。&lt;/p&gt;</description></item><item><title>tarコマンドで"zフラグを付ける"、"ハイフンを付けない"のはおっさんだそうです</title><link>https://genzouw.com/entry/2021/07/18/075116/2728/</link><pubDate>Sun, 18 Jul 2021 07:51:16 +0900</pubDate><guid>https://genzouw.com/entry/2021/07/18/075116/2728/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今日は小ネタで。&lt;/p&gt;&#10;&lt;p&gt;一時期Twitterでも話題に上がっていたそうですが、 &lt;code&gt;tar&lt;/code&gt; コマンドの使い方でおっさんかどうか分かるそうです。&lt;/p&gt;&#10;&lt;p&gt;きっかけは2年ぐらい前に同僚と雑談をしていたときに言われたことでした。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;tarコマンドでアーカイブを展開するとき、zフラグやjフラグを付与するのはおっさんだけだよ&#10;&amp;hellip;って、Twitterで言われてた&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;いつか突っ込んで調べようと思っていたのですが、そのまま置きっぱなしになってはや2年。&#10;時間ができたので調べてみることにしました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Impish Indri (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tar --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar &lt;span class="o"&gt;(&lt;/span&gt;GNU tar&lt;span class="o"&gt;)&lt;/span&gt; 1.34&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2021&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tarコマンドでgzip圧縮済みファイルを展開してみる"&gt;tarコマンドでgzip圧縮済みファイルを展開してみる&lt;/h2&gt;&#10;&lt;p&gt;圧縮形式で一番使われるのは &lt;strong&gt;gzip&lt;/strong&gt; でしょう。&#10;速度、圧縮率のいずれのバランスもよく、デファクトスタンダードだと思っています。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;tar&lt;/code&gt; コマンドで &lt;strong&gt;gzip&lt;/strong&gt; 圧縮を使ったアーカイブ、展開を行う際には &lt;code&gt;z&lt;/code&gt; オプションを使用します。&lt;/p&gt;&#10;&lt;p&gt;まずはtarコマンドでgzip圧縮済みのファイルを作成します。&#10;その後、そのファイルをいくつかの方法で展開してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ディレクトリを作成し&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir &lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 適当なファイルを2つ突っ込む&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; hello &amp;gt; test/1.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; world &amp;gt; test/2.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# test.tar.gz ファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tar zcf test.tar.gz &lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ゴミ掃除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rm -rf &lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;total &lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;174&lt;/span&gt; Jul &lt;span class="m"&gt;17&lt;/span&gt; 22:35 test.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;さて、ここから展開をしてみたいと思います。&lt;/p&gt;</description></item><item><title>イメージのビルド高速化機構 Docker BuildKit、BuildX を理解していなかったので調べてみました</title><link>https://genzouw.com/entry/2021/07/17/100615/2724/</link><pubDate>Sat, 17 Jul 2021 10:06:15 +0900</pubDate><guid>https://genzouw.com/entry/2021/07/17/100615/2724/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;Dockerfile&lt;/code&gt; を作成した後は &lt;code&gt;docker build&lt;/code&gt; コマンドを使って Docker イメージをビルドします。&lt;/p&gt;&#10;&lt;p&gt;ある日を境に &lt;code&gt;docker build&lt;/code&gt; コマンド実行時のコンソールメッセージの表示が様変わりしたのですが、&#10;これは &lt;strong&gt;Docker (正確には僕のローカル PC で利用している Docker for Mac)&lt;/strong&gt; に &lt;strong&gt;BuildKit&lt;/strong&gt; と言われるものが導入されたためのようです。&lt;/p&gt;&#10;&lt;p&gt;この &lt;strong&gt;BuildKit&lt;/strong&gt; について理解していませんでしたので、調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 20.10.7, build f0df350&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="buildkit-とは"&gt;BuildKit とは？&lt;/h2&gt;&#10;&lt;p&gt;BuildKit は、 Docker の 18.06 から試験的に導入され、18.09 以降で正式に導入された機構になります。&lt;/p&gt;&#10;&lt;p&gt;ビルド処理時にバックグラウンドで実行されます。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;環境変数を使って有効化することができる&lt;/em&gt; という記事を拝見しましたが、&#10;僕の PC では特に環境変数を設定していない状態でいつの間にかビルド時の表示が変わっていたので、&#10;もう正式導入しているようです。&lt;/p&gt;&#10;&lt;p&gt;従来の &lt;code&gt;docker build&lt;/code&gt; コマンドでは、&lt;code&gt;Dockerfile&lt;/code&gt; の各命令（ &lt;code&gt;FROM&lt;/code&gt; とか &lt;code&gt;RUN&lt;/code&gt; とか )を順番に実行していきます。&lt;/p&gt;</description></item><item><title>GCPのVPC(Virtual Private Cloud)に入門する</title><link>https://genzouw.com/entry/2021/07/08/095627/2711/</link><pubDate>Thu, 08 Jul 2021 09:56:27 +0900</pubDate><guid>https://genzouw.com/entry/2021/07/08/095627/2711/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今まで、GCP の VPC についてあまり意識せずに通信ができていました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Terraform&lt;/strong&gt; 化を進めていくタイミングで気がついたのですが、&#10;GCP プロジェクト作成時に &lt;strong&gt;自動的に作成された 「VPC ネットワーク」&lt;/strong&gt; をそのまま使っていることがわかりました。&lt;/p&gt;&#10;&lt;p&gt;GCP ではこの &lt;strong&gt;自動的に作成された VCP ネットワーク&lt;/strong&gt; を本番運用で利用することを推奨していないようでしたので、&#10;理解を含めてどうするべきかを考えたいと思いました。&lt;/p&gt;&#10;&lt;h2 id="vpc-ネットワークと構成要素を理解する"&gt;「VPC ネットワーク」と構成要素を理解する&lt;/h2&gt;&#10;&lt;p&gt;かんたんではありますが、&lt;strong&gt;VCP ネットワーク&lt;/strong&gt; の構成要素を図示しました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+- vpc network ---------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; +-----------------+ &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;Routing &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; +-----------------+ &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; +-----------------+ &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;Firewall rule &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; +-----------------+ &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; +- region us-west --------------+ &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +- subnet1 -+ +- subnet2 -+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +-------+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;GCE &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +-------+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +-------+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;内部LB &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +-------+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +-------+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;内部 &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;静的IP &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +-------+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +-------+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;Subnet &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;routing&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +-------+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +-----------+ +-----------+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; +-------------------------------+ &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; +- region us-eas--t ------------+ &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +- subnet3 -+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; +-----------+ &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; +-------------------------------+ &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+-----------------------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GCP のドキュメントには、 &lt;strong&gt;「ネットワーク = 「VPC ネットワーク」」&lt;/strong&gt; と書かれているフシがあります。&#10;&lt;strong&gt;VPC&lt;/strong&gt; というプレフィックスが記載されていなかったとしても、両者は同じものを指しています。&lt;/p&gt;</description></item><item><title>自作したシェルスクリプトをLinuxのsystemdサービスとして起動する方法</title><link>https://genzouw.com/entry/2021/07/05/154156/2701/</link><pubDate>Mon, 05 Jul 2021 15:41:56 +0900</pubDate><guid>https://genzouw.com/entry/2021/07/05/154156/2701/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;最近は &lt;strong&gt;Kubernetes&lt;/strong&gt; や &lt;strong&gt;サーバレス&lt;/strong&gt; なしくみを用いたサービス運用が進んでいるため、Linux の &lt;strong&gt;Systemd&lt;/strong&gt; を触る機会はほぼありません。&lt;/p&gt;&#10;&lt;p&gt;利用機会は今後どんどん減ってでしょう。&lt;/p&gt;&#10;&lt;p&gt;しかし、 担当しているサービスの一部で &lt;strong&gt;Google Compute Engine&lt;/strong&gt; を利用しており、 &lt;strong&gt;Systemd&lt;/strong&gt; を使ってシェルスクリプトをサービス化しています。&lt;/p&gt;&#10;&lt;p&gt;AWS EC2 を使ったサーバー構築の可能性もあり、 &lt;strong&gt;Systemd&lt;/strong&gt; を使ったサーバーを構築する機会はまだ残り続けるでしょう。&lt;/p&gt;&#10;&lt;p&gt;そこで &lt;strong&gt;Systemd&lt;/strong&gt; を使ってシェルをサービス化する方法をまとめておきます。&lt;/p&gt;&#10;&lt;h2 id="概要"&gt;概要&lt;/h2&gt;&#10;&lt;p&gt;当エントリでは &lt;strong&gt;Linux サーバー上が起動してたタイミングで、Systemd からシェルスクリプトを自動的に実行する方法&lt;/strong&gt; について紹介します。&lt;/p&gt;&#10;&lt;h2 id="systemd-とは"&gt;&amp;ldquo;Systemd&amp;rdquo; とは？&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Systemd&lt;/strong&gt; は、LinuxOS の起動、管理、および終了に関するサービス管理システムです。&#10;従来は &lt;strong&gt;SysVinit&lt;/strong&gt; という仕組みが使われていました。&#10;今は &lt;strong&gt;SysVinit&lt;/strong&gt; が &lt;strong&gt;Systemd&lt;/strong&gt; に置き換わり、OS の起動とサービスの管理を行う仕組みとなりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Systemd&lt;/strong&gt; は、LinuxOS の初期化プロセスとして起動し、サービスの管理、ネットワークの設定、ログの管理などを主に担当しています。&lt;/p&gt;&#10;&lt;p&gt;管理者は簡単にシステムの状態を監視し、サービスの状態をコントロールできます。&#10;以下は、管理者が利用する &lt;strong&gt;Systemd&lt;/strong&gt; の基本的なコマンドの例です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;systemctl start [サービス名]&lt;/code&gt; : サービスを開始します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;systemctl stop [サービス名]&lt;/code&gt; : サービスを停止します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;systemctl enable [サービス名]&lt;/code&gt; : システムの起動時にサービスを自動的に起動します。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;systemctl disable [サービス名]&lt;/code&gt; : システムの起動時にサービスを自動的に起動しないようにします。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;systemctl status [サービス名]&lt;/code&gt; : サービスの状態を確認します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="systemd-の実行プロセス"&gt;&amp;ldquo;Systemd&amp;rdquo; の実行プロセス&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Systemd&lt;/strong&gt; の実行プロセスは以下のような性質を持っています。&lt;/p&gt;</description></item><item><title>Unix上で利用できるパスワード生成コマンドmkpasswdの使い方を紹介</title><link>https://genzouw.com/entry/2021/07/04/083700/2695/</link><pubDate>Sun, 04 Jul 2021 08:37:00 +0900</pubDate><guid>https://genzouw.com/entry/2021/07/04/083700/2695/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;過去に &lt;a href="https://genzouw.com/entry/2015/11/12/073000/16/"&gt;Bash シェルスクリプトでランダムな文字列を作成する方法&lt;/a&gt; について投稿しましたが、&#10;もし Linux のパッケージマネージャでツールをインストールできる環境であれば、 &lt;code&gt;mkpasswd&lt;/code&gt; を使うのがより柔軟かつかんたんです。&lt;/p&gt;&#10;&lt;p&gt;ランダムな文字列の生成だけでなく、パスワード生成ももちろん可能なコマンドです。&lt;/p&gt;&#10;&lt;p&gt;( &lt;em&gt;コマンド名からわかるように、本来はパスワード生成を目的としたものですよね。&lt;/em&gt; )&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mkpasswd-コマンドとは"&gt;&lt;code&gt;mkpasswd&lt;/code&gt; コマンドとは？&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;mkpasswd&lt;/code&gt; コマンドは、パスワードを生成するためのコマンドです。&lt;/p&gt;&#10;&lt;p&gt;デフォルトでは &lt;strong&gt;9 文字のランダムなパスワード&lt;/strong&gt; が生成されますが、&#10;&lt;strong&gt;オプションを指定することで生成されるパスワードの長さや文字種などを調整できます。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;RedHat 系の OS の場合、 &lt;code&gt;YUM&lt;/code&gt; を使って &lt;strong&gt;expect&lt;/strong&gt; というパッケージをインストールします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yum install expect -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インストールされたかを確認してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;type&lt;/span&gt; mkpasswd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkpasswd is hashed &lt;span class="o"&gt;(&lt;/span&gt;/usr/bin/mkpasswd&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;ちなみに、ヘルプを表示しようとすると、いきなり謎の文言が表示されます。&lt;/em&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkpasswd --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zy&lt;span class="nv"&gt;$6&lt;/span&gt;aO2nb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;--help&lt;/code&gt; オプションは利用できないようですね。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Git でやってしまった！そんなときに変更を取り消す便利なツール "git-branchless"</title><link>https://genzouw.com/entry/2021/07/01/172945/2688/</link><pubDate>Thu, 01 Jul 2021 17:29:45 +0900</pubDate><guid>https://genzouw.com/entry/2021/07/01/172945/2688/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Git で誤って &lt;code&gt;git reset&lt;/code&gt; 、 &lt;code&gt;git rebase&lt;/code&gt; をしてしまって冷や汗が出たことがある方は少なくないはずです。&lt;/p&gt;&#10;&lt;p&gt;僕も何度自分のローカルブランチでやってしまったことか。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;焦りながらも &lt;code&gt;git reflog&lt;/code&gt; で最後の変更を見つけ出し、なんとかもとに戻せた！&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;という場合もあれば、&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;うまく戻せずに結局最初から開発やり直し&amp;hellip;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;となったこともあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;code&gt;git reflog&lt;/code&gt; の操作が難しいですよね。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;変更がもっとかんたんにもとに戻せたら、と常々思っていましたが、そんな問題にぴったりのツールを見つけました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ zsh --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zsh 5.8 &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.32.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="git-branchless"&gt;git-branchless&lt;/h2&gt;&#10;&lt;p&gt;見つけたのは &lt;a href="https://github.com/arxanas/git-branchless"&gt;arxanas/git-branchless&lt;/a&gt; というツールになります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;git-branchless&lt;/strong&gt; はツールのセットになります。&#10;コミット履歴を &lt;strong&gt;視覚化&lt;/strong&gt; 、 &lt;strong&gt;ナビゲーション&lt;/strong&gt; 、 &lt;strong&gt;操作の支援&lt;/strong&gt; 、 &lt;strong&gt;修復&lt;/strong&gt; するのを手助けしてくれます。&lt;/p&gt;&#10;&lt;p&gt;&amp;ldquo;Google&amp;rdquo; や &amp;ldquo;Facebook&amp;rdquo; といった大企業で利用されている &lt;strong&gt;branchless Mercurial worlflows&lt;/strong&gt; と呼ばれる開発フロー（？）に基づいているそうです。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Rust&lt;/strong&gt; がインストールされていることが前提となっているようです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew install rust&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Rust をインストールすると、Rust のビルド、パッケージマネージャーである &lt;code&gt;cargo&lt;/code&gt; というコマンドが使えるうようになります。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでコマンドライン引数を後方から参照する</title><link>https://genzouw.com/entry/2021/06/30/120014/2685/</link><pubDate>Wed, 30 Jun 2021 12:00:14 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/30/120014/2685/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bash シェルスクリプトでは、 &lt;strong&gt;コマンドライン引数は &lt;code&gt;&amp;quot;${1}&amp;quot;&lt;/code&gt;、 &lt;code&gt;&amp;quot;${2}&amp;quot;&lt;/code&gt;、&lt;code&gt;&amp;quot;${3}&amp;quot;&lt;/code&gt; といった特殊な変数で参照&lt;/strong&gt; できます。&lt;/p&gt;&#10;&lt;p&gt;さてここで、配列の要素を先頭ではなく &lt;strong&gt;末尾から参照したい&lt;/strong&gt; としましょう。&lt;/p&gt;&#10;&lt;p&gt;コマンドライン引数の個数がわかっている場合、例えば 3 個である場合には &lt;code&gt;&amp;quot;${3}&amp;quot;&lt;/code&gt; を参照すれば良いですね。&lt;/p&gt;&#10;&lt;p&gt;しかしコマンドライン引数の個数が可変であった場合には、どうしたら良いでしょうか。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="--1-と記述すれば-ok-スペースに注意"&gt;&lt;code&gt;${@: -1}&lt;/code&gt; と記述すれば OK (スペースに注意！)&lt;/h2&gt;&#10;&lt;p&gt;Twitter 上でかんたんに記述できることを教えていただきました。&#10;ありがとうございます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1hIU9NNGFv_pHJs6p-0TOr4UUtf4o-ljV" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;main.sh&lt;/code&gt; というスクリプトを作って実行してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# スクリプトを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;main.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;echo &amp;#34;${@: -1}&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;700&lt;/span&gt; main.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 実行( 一番最後の引数が出力されます )&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./main.sh &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt; &lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一見わかりにくい記述ですので段階を追って説明しましょう。&lt;/p&gt;</description></item><item><title>シェルスクリプトで数値をN進数に変換する方法</title><link>https://genzouw.com/entry/2021/06/29/210958/2683/</link><pubDate>Tue, 29 Jun 2021 21:09:58 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/29/210958/2683/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;競技プログラミングで問題を解いているときによく出題される問題として、 &lt;strong&gt;数値を N 進数表記に変換する&lt;/strong&gt; というものがあります。&#10;プログラミング言語だとかんたんなのですが、シェルスクリプトでやろうとすると普段やらないためやり方が分からずハマってしまいます。&lt;/p&gt;&#10;&lt;p&gt;変換方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bash-組み込みの算術演算を利用する"&gt;Bash 組み込みの算術演算を利用する&lt;/h2&gt;&#10;&lt;p&gt;これが最もかんたんです。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;10101&lt;/code&gt; を変換してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 10101 を変換 ( 2進数→10進数 )&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="m"&gt;2#10101&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;21&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 10101 を変換 ( 8進数→10進数 )&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="m"&gt;8#10101&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4161&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 10101 を変換 ( 16進数→10進数 )&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="m"&gt;16#10101&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;65793&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ポイントは数値の前に &lt;code&gt;N#&lt;/code&gt; のように基数を指定する点です。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ただし、N進数から10進数への変換しかできません。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="bc-コマンドを利用する"&gt;&lt;code&gt;bc&lt;/code&gt; コマンドを利用する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;bc&lt;/code&gt; コマンドに標準入力で計算式を渡してやります。&#10;その際に、インプット時の基数、アウトプット時の基数を指定してやります。&#10;(obase、ibaseの記述順序に注意！)&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで空ディレクトリを再帰的に検索し削除する</title><link>https://genzouw.com/entry/2021/06/28/202044/2678/</link><pubDate>Mon, 28 Jun 2021 20:20:44 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/28/202044/2678/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;開発が進むと、アプリケーション内に不要な空ディレクトリが誕生することがあります。&#10;そのまま残り続けていると、本当に必要なディレクトリなのかわからなくなることがあります。&#10;あるいはサーバのデータディレクトリ、ワークディレクトリも削除処理が実装されていない場合に不要な空ディレクトリが残ってしまう場合があります。&lt;/p&gt;&#10;&lt;p&gt;そんなときな空ディレクトリを再帰的に検索して一気に削除してしまいましょう。&lt;/p&gt;&#10;&lt;p&gt;シェルで実現するためのかんたんなワンライナーを紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ find --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find &lt;span class="o"&gt;(&lt;/span&gt;GNU findutils&lt;span class="o"&gt;)&lt;/span&gt; 4.5.11&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2012&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="動作確認のための準備"&gt;動作確認のための準備&lt;/h2&gt;&#10;&lt;p&gt;動作確認のために適当なディレクトリツリーを作成しておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 適当な作業ディレクトリを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir work/ &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; work/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ディレクトリとファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p a/d/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p b/e/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p b/f/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p b/g/h/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p b/g/i/j/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p &lt;span class="s2"&gt;&amp;#34;c c/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch a/d/hoge.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch b/f/hoge.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;tree&lt;/code&gt; コマンドで、作成されたディレクトリツリーを確認してみます。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで非インタラクティブにパスワードを設定する</title><link>https://genzouw.com/entry/2021/06/25/205353/2672/</link><pubDate>Fri, 25 Jun 2021 20:53:53 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/25/205353/2672/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Unix 上で &lt;strong&gt;ユーザを作成する場合は &lt;code&gt;useradd&lt;/code&gt; コマンド&lt;/strong&gt; 、 &lt;strong&gt;ユーザを変更する場合は &lt;code&gt;usermod&lt;/code&gt; コマンド&lt;/strong&gt; を利用します。&lt;/p&gt;&#10;&lt;p&gt;( &lt;code&gt;adduser&lt;/code&gt; の利用を推奨するような記載を多くの Web ページで拝見しますので、そちらのほうが良いのかもしれません。 &lt;code&gt;moduser&lt;/code&gt; コマンドは有りません。)&lt;/p&gt;&#10;&lt;p&gt;アプリケーションのデーモンプロセスで利用されるようなユーザはパスワードは不要ですが、オペレーションユーザの場合には &lt;strong&gt;パスワードが必要&lt;/strong&gt; となります。&lt;/p&gt;&#10;&lt;p&gt;パスワードは &lt;code&gt;chpasswd&lt;/code&gt; コマンドを使って変更できますが、このコマンドを利用するとインタラクティブな操作を要求されるためスクリプトが組みにくいという問題があります。&lt;/p&gt;&#10;&lt;p&gt;どうやってパスワードを設定したら良いでしょう？&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="useradd--usermod-コマンドの---password-オプションを利用する"&gt;&lt;code&gt;useradd&lt;/code&gt; / &lt;code&gt;usermod&lt;/code&gt; コマンドの &lt;code&gt;--password&lt;/code&gt; オプションを利用する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;useradd&lt;/code&gt; コマンド、 &lt;code&gt;usermod&lt;/code&gt; コマンドのヘルプを引くと使えそうなオプションがすぐに見つかります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ useradd --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Usage: useradd &lt;span class="o"&gt;[&lt;/span&gt;options&lt;span class="o"&gt;]&lt;/span&gt; LOGIN&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; useradd -D&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; useradd -D &lt;span class="o"&gt;[&lt;/span&gt;options&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Options:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p, --password PASSWORD encrypted password of the new account&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ usermod --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Usage: usermod &lt;span class="o"&gt;[&lt;/span&gt;options&lt;span class="o"&gt;]&lt;/span&gt; LOGIN&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Options:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -p, --password PASSWORD use encrypted password &lt;span class="k"&gt;for&lt;/span&gt; the new password&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いずれのコマンドにもズバリのオプションが見つかりました。&#10;&lt;code&gt;--password&lt;/code&gt; オプションを利用してインタラクティブにパスワードを設定できます。&lt;/p&gt;</description></item><item><title>trコマンドで改行をカンマに変換すると","とだけ表示されてびっくりした話</title><link>https://genzouw.com/entry/2021/06/24/190227/2670/</link><pubDate>Thu, 24 Jun 2021 19:02:27 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/24/190227/2670/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;わかってしまえばなんてことないですし、 &lt;code&gt;tr&lt;/code&gt; コマンドに明るい方にとっては「よくあることだね」という程度の話だと思います。&lt;/p&gt;&#10;&lt;p&gt;先日 &lt;a href="https://menta.work/user/14625"&gt;MENTA&lt;/a&gt; でシェルスクリプトについて支援をさせていただきました。&#10;支援内容の一部に、テキストファイルの各行をカンマで連結して一行にして出力したい、という要望があったので「それならかんたん！」とやり方を提示させていただきました。&#10;ところが、うまくいかずにかっこ悪いところを見られてしまいました。&lt;/p&gt;&#10;&lt;p&gt;その時のお話をしたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="テキストファイルの改行コードを任意の文字に置換するには-tr-コマンドを使う"&gt;テキストファイルの改行コードを任意の文字に置換するには &lt;code&gt;tr&lt;/code&gt; コマンドを使う&lt;/h2&gt;&#10;&lt;p&gt;改行コードを置換する方法はいくつかあります。&#10;&lt;code&gt;sed&lt;/code&gt; を使う、 &lt;code&gt;awk&lt;/code&gt; を使う、などありますが、一番かんたんなのは &lt;code&gt;tr&lt;/code&gt; コマンドを利用する方法です。&lt;/p&gt;&#10;&lt;p&gt;早速試してみたいと思います。&lt;/p&gt;&#10;&lt;p&gt;テスト用にかんたんなテキストファイルを作成します。&#10;各行に 1〜5 の数値が書かれています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="c1"&gt;# ファイルを用意&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &amp;gt; data.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイルの中身を確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat data.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;それではこのファイルの改行をカンマ&lt;code&gt;,&lt;/code&gt;に置換して見たいと思います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tr &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;,&amp;#34;&lt;/span&gt; &amp;lt; data.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1,2,3,4,5,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;各行の改行コードがカンマに変換されました。&#10;&lt;code&gt;5&lt;/code&gt; の行の末尾にも改行コードが含まれているため、 &lt;code&gt;1,2,3,4,5,&lt;/code&gt; のように一番うしろにも改行が入っています。&lt;/p&gt;&#10;&lt;p&gt;*これを除去したい場合には &lt;code&gt;$ tr &amp;quot;\n&amp;quot; &amp;quot;,&amp;quot; &amp;lt; data.txt | sed 's/,$//'&lt;/code&gt; のようにしてやればよいでしょう。&lt;/p&gt;</description></item><item><title>シェルスクリプトで引数でループする処理を書くときは "${@}" は不要だった</title><link>https://genzouw.com/entry/2021/06/21/080007/2665/</link><pubDate>Mon, 21 Jun 2021 08:00:07 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/21/080007/2665/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;個人的にはシェルスクリプトでループ処理を書くと速度が出ず、また記載が冗長となるためあまり使いません。&lt;/p&gt;&#10;&lt;p&gt;それでも分岐処理を含めて繰り返し処理したい場合にはループを書くことがあります。&lt;/p&gt;&#10;&lt;p&gt;シェルスクリプト実行時に渡される「コマンドライン引数」でループを回すこともありますが、先日今まで書いていた処理がもっとかんたんに書けることを知りました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="今まで記述してたコマンドライン引数を使ったループ処理"&gt;今まで記述してた「コマンドライン引数」を使ったループ処理&lt;/h2&gt;&#10;&lt;p&gt;今までコマンドライン引数を使ったループ処理を記述したい場合には、 &lt;code&gt;for&lt;/code&gt; と &lt;code&gt;&amp;quot;${@}&amp;quot;&lt;/code&gt; 変数を使って記述していました。&lt;/p&gt;&#10;&lt;p&gt;以下がそのコードになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o noclobber&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; I in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$I&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;test1.sh&lt;/code&gt; という名前で保存し、実行してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 実行権限を与えてあげましょう&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;700&lt;/span&gt; test1.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 実行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./test1.sh a b &lt;span class="s2"&gt;&amp;#34;c d&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; e &amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;b&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;c d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; e&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;第 3 引数、第 4 引数にはスペースを含んでいるため、ダブルクォート(&lt;code&gt;&amp;quot;&lt;/code&gt;)で囲んでやる必要があります。&#10;また、参照する際にも &lt;code&gt;&amp;quot;${@}&amp;quot;&lt;/code&gt; という形式で &lt;code&gt;for&lt;/code&gt; 構文に渡してやる必要があります。&lt;/p&gt;</description></item><item><title>Vimでファイル編集中にスペルミス(typo)を検出するためにvim-codespellを導入してみた</title><link>https://genzouw.com/entry/2021/06/20/093317/2668/</link><pubDate>Sun, 20 Jun 2021 09:33:17 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/20/093317/2668/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Vim でブログのエントリを作成したり、技術ドキュメントを作成したりしています。&lt;/p&gt;&#10;&lt;p&gt;技術系の内容をまとめていると、アルファベットの単語の登場頻度が多いわけですが、ちょっとしたスペルミスをすることがちらほらあります。&lt;/p&gt;&#10;&lt;p&gt;エントリやドキュメントであれば、スペルミスを舌としてもまだマシなのですが、ソースコードにスペルミスがあると（例えばクラス名やメソッド名）それが使われてしまって後戻りできない、ということも時々あります。&lt;/p&gt;&#10;&lt;p&gt;これはイカンということで英語のスペルミスを検出するためのプラグインを探して導入してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvim --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NVIM v0.4.4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Build type: Release&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="shinglyuvim-codespellを導入する"&gt;&lt;a href="https://github.com/shinglyu/vim-codespell"&gt;shinglyu/vim-codespell&lt;/a&gt;を導入する&lt;/h2&gt;&#10;&lt;p&gt;Google 検索して最初に見つかった Github 上の Vim プラグインが以下でした。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/shinglyu/vim-codespell"&gt;shinglyu/vim-codespell&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;したがってこれを導入し使ってみることにしました。&lt;/p&gt;&#10;&lt;h2 id="shinglyuvim-codespellのインストール"&gt;&lt;a href="https://github.com/shinglyu/vim-codespell"&gt;shinglyu/vim-codespell&lt;/a&gt;のインストール&lt;/h2&gt;&#10;&lt;p&gt;Github の &lt;a href="https://github.com/shinglyu/vim-codespell#installation"&gt;Install&lt;/a&gt; の説明を見るのが一番確実です。&lt;/p&gt;&#10;&lt;p&gt;2021-06-20 時点だと、以下の工程を踏むと書かれています。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;[aspell][http://aspell.net/] というツールの導入&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Mac なら &lt;code&gt;brew install aspell&lt;/code&gt; を実行&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol start="2"&gt;&#10;&lt;li&gt;Vim プラグインとして、 &lt;code&gt;shinglyu/vim-codespell&lt;/code&gt; を導入&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;プラグインのインストール方法についてはここでは省略します。&lt;/p&gt;&#10;&lt;p&gt;Vim のプラグインは &lt;code&gt;Vundle&lt;/code&gt; / &lt;code&gt;vim-pathogen&lt;/code&gt; / &lt;code&gt;vim-plug&lt;/code&gt; / &lt;code&gt;NeoBundle&lt;/code&gt; / &lt;code&gt;dein.vim&lt;/code&gt; など色々ありますので導入していない場合には検討ください。&lt;/p&gt;&#10;&lt;h2 id="shinglyuvim-codespellを使ってみる"&gt;&lt;a href="https://github.com/shinglyu/vim-codespell"&gt;shinglyu/vim-codespell&lt;/a&gt;を使ってみる&lt;/h2&gt;&#10;&lt;p&gt;早速使ってみました。&#10;前回のブログエントリのもととなる Markdown を NeoVim で開きます。&lt;/p&gt;</description></item><item><title>YAMLの重複記述を減らしDRYを保つためにエイリアス機能を使う</title><link>https://genzouw.com/entry/2021/06/19/082626/2661/</link><pubDate>Sat, 19 Jun 2021 08:26:26 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/19/082626/2661/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;僕が YAML ファイルを触りだしたのは、Ansible を使い始めてからでした。&lt;/p&gt;&#10;&lt;p&gt;そこから &lt;strong&gt;Docker Composes&lt;/strong&gt; 、 &lt;strong&gt;Kubernetes&lt;/strong&gt; ともはや YAML を触ることがないシステムはない状況となりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS&lt;/strong&gt; や &lt;strong&gt;GCP&lt;/strong&gt; 、 &lt;strong&gt;Azure&lt;/strong&gt; といったクラウド環境でも YAML ファイルで設定するリソースは非常に多いですし、Rest API のインターフェイス定義として &lt;strong&gt;OpenAPI&lt;/strong&gt; を YAML で記述します。&lt;/p&gt;&#10;&lt;p&gt;YAML ファイルの重要性が高まるにつれて、ファイルの内容はどんどん肥大化する傾向にあります。&#10;同時に 1 つの YAML ファイルの中に記述する内容が重複することも多く（Kubernetes マニフェストのラベル名など）、なんとか &lt;strong&gt;DRY&lt;/strong&gt; に記述できないかと悩むことがあります。&lt;/p&gt;&#10;&lt;h2 id="重複記述を回避するために-エイリアス-を使う"&gt;重複記述を回避するために &amp;ldquo;エイリアス&amp;rdquo; を使う&lt;/h2&gt;&#10;&lt;p&gt;そこで有効なのが YAML の標準機能として提供されている &lt;strong&gt;エイリアス&lt;/strong&gt; 機能です。&lt;/p&gt;&#10;&lt;p&gt;現在担当してるシステムのローカル開発環境は &lt;strong&gt;Docker Compose&lt;/strong&gt; を使って構築していますが、エイリアス機能を使って &lt;code&gt;docker-compose.yaml&lt;/code&gt; ファイルの簡素化を行っています。&lt;/p&gt;&#10;&lt;p&gt;それでは、エイリアス機能について見ていきましょう。&lt;/p&gt;&#10;&lt;h2 id="エイリアス別名機能とは"&gt;エイリアス(別名)機能とは？&lt;/h2&gt;&#10;&lt;p&gt;YAML のエイリアス機能とは、 &lt;strong&gt;単一の値&lt;/strong&gt; か &lt;strong&gt;ブロック(YAML のツリー構造)&lt;/strong&gt; のどちらかに名前をつけて、あとから参照するための仕組みになります。&lt;/p&gt;&#10;&lt;h2 id="エイリアス機能を利用した例"&gt;エイリアス機能を利用した例&lt;/h2&gt;&#10;&lt;h3 id="値にエイリアスを設定し参照する"&gt;値にエイリアスを設定し、参照する&lt;/h3&gt;&#10;&lt;p&gt;値に名前をつけるというのが最もシンプルな使い方です。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;&amp;amp;エイリアス名&lt;/code&gt; で名前をつけ、 &lt;code&gt;*エイリアス名&lt;/code&gt; で値を参照します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;&amp;amp;hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;world&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;#39;hello&amp;#39; という文字列となります&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;new_greeting&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;audience&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;room&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;*hello&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# &amp;#39;hello&amp;#39; という文字列となります&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正しく値が参照できているかを確認するために、 &lt;a href="https://github.com/mikefarah/yq"&gt;yq&lt;/a&gt; というコマンドラインから YAML ファイルを操作するツールを使ってみます。&lt;/p&gt;</description></item><item><title>Docker Container Registryサーバーを自前で作成してみる</title><link>https://genzouw.com/entry/2021/06/14/072906/2656/</link><pubDate>Mon, 14 Jun 2021 07:29:06 +0900</pubDate><guid>https://genzouw.com/entry/2021/06/14/072906/2656/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;&amp;ldquo;Docker Hub&amp;rdquo;&lt;/strong&gt; や &lt;strong&gt;GCR&lt;/strong&gt; 、 &lt;strong&gt;ECR&lt;/strong&gt; といったサービスがあるなか、&#10;わざわざ自前で &amp;ldquo;Docker Registry&amp;rdquo; を構築して Docker イメージを管理する必要性は少ないとは思いますが、仕組みを理解する目的で、自作の Docker Registry 環境を構築してみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="作業の流れ作業ログ"&gt;作業の流れ（作業ログ）&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Docker Registry サーバを立ち上げ&lt;/li&gt;&#10;&lt;li&gt;Docker Registry サーバに外部から接続するための設定を追加&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;前提として、今回は最もかんたんな方法で Docker Registry サーバを立ち上げたいと思います。&lt;/p&gt;&#10;&lt;p&gt;その方法とは、 「すでに公開されている Docker Registry サーバ用の Docker イメージを利用する」というものです。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Docker イメージを管理するためのサーバを Docker で立ち上げる、というのが面白いですね。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;そんなわけで、Docker を事前にインストールしておきましょう。&#10;Windows や Mac で動作させる最もかんたんな方法は以下のツールを導入することです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.docker.com/products/docker-desktop"&gt;Docker Desktop for Mac and Windows | Docker&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="1-docker-registry-サーバを立ち上げ"&gt;1. Docker Registry サーバを立ち上げ&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;registry:2.7.1&lt;/strong&gt; というイメージを利用したいと思います。&lt;/p&gt;</description></item><item><title>"git diff"コマンドの実行結果をGithub風に表示できる"git-split-diffs"</title><link>https://genzouw.com/entry/2021/05/24/104932/2640/</link><pubDate>Mon, 24 May 2021 10:49:32 +0900</pubDate><guid>https://genzouw.com/entry/2021/05/24/104932/2640/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git diff&lt;/code&gt; コマンドの実行結果を Github の diff 表示のようなスタイルに変更できる &lt;strong&gt;「&lt;a href="https://github.com/banga/git-split-diffs"&gt;git-split-diffs&lt;/a&gt;」&lt;/strong&gt; というツールを見つけたので紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v15.12.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yarn --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1.22.10&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="git-split-diffs-とはなに"&gt;git-split-diffs とはなに？&lt;/h2&gt;&#10;&lt;p&gt;ターミナル上で &lt;code&gt;git diff&lt;/code&gt; したときに、実行結果を &lt;strong&gt;Github&lt;/strong&gt; 風に表示してくれるツールです。&lt;/p&gt;&#10;&lt;p&gt;はじめはターミナル上で実行するのに Github 風にとは一体？と思いましたが、実際に使ってみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="前提環境"&gt;前提環境&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;node 1.12&lt;/strong&gt; 以上がインストールされている必要があります。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;npm&lt;/code&gt; コマンドまたは &lt;code&gt;yarn&lt;/code&gt; コマンドが使えれば、以下のコマンドでインストール可能です。&#10;どちらかお好きな方をどうぞ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# NPMを使う場合&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm install -g git-split-diffs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# YARNを使う場合&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yarn global add git-split-diffs&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行したあとは &lt;code&gt;git config&lt;/code&gt; コマンドを使って、 &lt;code&gt;diff&lt;/code&gt; の実行結果の表示に &lt;code&gt;git-split-diffs&lt;/code&gt; が使われるようにしてやります。&lt;/p&gt;</description></item><item><title>Gitリポジトリ作成時のデフォルトブランチ名がmainとなるように設定する</title><link>https://genzouw.com/entry/2021/05/23/082707/2636/</link><pubDate>Sun, 23 May 2021 08:27:07 +0900</pubDate><guid>https://genzouw.com/entry/2021/05/23/082707/2636/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;こちらもいずれやらないとなぁと思ったままお座なりになっていたローカル環境の設定です。&lt;/p&gt;&#10;&lt;p&gt;「 &lt;a href="https://genzouw.com/entry/2021/05/22/090213/2631/"&gt;シェルで Github リポジトリの master ブランチの名前を main ブランチに変更する&lt;/a&gt;」というエントリでもお話しましたが、&#10;Github リポジトリを新規に作成した場合のデフォルトブランチ名が &lt;code&gt;master&lt;/code&gt; から &lt;code&gt;main&lt;/code&gt; に変更となっています。（もう随分前の話ですね。）&lt;/p&gt;&#10;&lt;p&gt;そんな時代の流れとは裏腹に、自分の PC で &lt;code&gt;git init&lt;/code&gt; し Git リポジトリを新規作成した際のデフォルトブランチ名が未だに &lt;code&gt;master&lt;/code&gt; となっています。&lt;/p&gt;&#10;&lt;p&gt;少しでもおっさん化の流れに抵抗する必要があるということで、 &lt;code&gt;git init&lt;/code&gt; したときに作られるデフォルトブランチ名を &lt;code&gt;main&lt;/code&gt; にするための設定をしようと思いました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.31.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="今回の作業の前提"&gt;今回の作業の前提&lt;/h2&gt;&#10;&lt;p&gt;当然のことながら &lt;code&gt;git&lt;/code&gt; コマンドが使えるようになっている必要があります。&lt;/p&gt;&#10;&lt;p&gt;加えて、 Git のバージョンが &lt;strong&gt;2.28&lt;/strong&gt; 以降でなければいけません。&lt;/p&gt;&#10;&lt;p&gt;僕の環境は以下の通り、 &lt;strong&gt;2.28&lt;/strong&gt; 以降でした。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.31.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="git-の新しい設定として-initdefaultbranch-が追加されています"&gt;Git の新しい設定として &lt;code&gt;init.defaultBranch&lt;/code&gt; が追加されています&lt;/h2&gt;&#10;&lt;p&gt;Git 2.28 より前のバージョンでは、 &lt;code&gt;git init&lt;/code&gt; コマンドでリポジトリを新規作成した場合、常に &lt;code&gt;master&lt;/code&gt; というブランチがデフォルトで作成されていました。&lt;/p&gt;</description></item><item><title>シェルでGithubリポジトリのmasterブランチの名前をmainブランチに変更する</title><link>https://genzouw.com/entry/2021/05/22/090213/2631/</link><pubDate>Sat, 22 May 2021 09:02:13 +0900</pubDate><guid>https://genzouw.com/entry/2021/05/22/090213/2631/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;随分前のことですが、新規に作成される Github リポジトリのデフォルトブランチ名が &lt;code&gt;master&lt;/code&gt; から &lt;code&gt;main&lt;/code&gt; に変更となりました。&lt;/p&gt;&#10;&lt;p&gt;ところが既存の Github リポジトリは当然 &lt;code&gt;master&lt;/code&gt; というブランチ名のままです。&lt;/p&gt;&#10;&lt;p&gt;機会があれば昨今の風潮にのって一括修正しようかなぁ、と思っていましたが、ブログネタについでにシェルでブランチ名の変更を行ってみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;大量に Github リポジトリを持っている組織などでも利用できるのではないでしょうか。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.31.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gh --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh version 1.10.2 &lt;span class="o"&gt;(&lt;/span&gt;2021-05-19&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/cli/cli/releases/tag/v1.10.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="今回利用するツール"&gt;今回利用するツール&lt;/h2&gt;&#10;&lt;p&gt;今回は以下のツールを利用します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;git&lt;/code&gt; : &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;gh&lt;/code&gt; : &lt;a href="https://cli.github.com/"&gt;GitHub CLI&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="作成したシェルスクリプト"&gt;作成したシェルスクリプト&lt;/h2&gt;&#10;&lt;p&gt;コマンドを 1 つ 1 つ解説していこうかと思いましたが、作ってしまってそれをお見せしたほうが良いかと思いました。&#10;作成したシェルスクリプトを掲載します。&lt;/p&gt;&#10;&lt;h3 id="master2mainsh"&gt;&lt;code&gt;master2main.sh&lt;/code&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# おまじない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# スクリプトを実行しているディレクトリが.git管理されていることが前提&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[[&lt;/span&gt; -d ./.git &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[ERROR] Gitのワークディレクトリでスクリプトを実行してください。&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== START ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;REPO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;git remote get-url origin &lt;span class="p"&gt;|&lt;/span&gt; grep -o &lt;span class="s1"&gt;&amp;#39;[^/:]\+/[^/:]\+$&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/\.git$//&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# upstreamリポジトリかどうかは適宜変更してください&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;REMOTE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;origin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# まずはGitのリモートリポジトリの最新master情報を取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git fetch &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; master&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# masterブランチからmainブランチを分岐させる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git checkout -b main &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/master&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --no-track&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# mainブランチをリモートにプッシュ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push -u &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# リポジトリのHEADをmainブランチに切り替え&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git remote set-head &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REMOTE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Github上のデフォルトブランチをmainブランチに切り替え&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh api -XPATCH &lt;span class="s2"&gt;&amp;#34;repos/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -f &lt;span class="nv"&gt;default_branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;main &amp;gt;/dev/null&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Github上の全プルリクのbaseもmainブランチに切り替え&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; NUM in &lt;span class="k"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gh pr list -B master -L999 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -f &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gh api -XPATCH &lt;span class="s2"&gt;&amp;#34;repos/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/pulls/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NUM&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -f &lt;span class="nv"&gt;base&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;main &amp;gt;/dev/null&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Githのリモートリポジトリからmasterブランチを削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --delete origin master&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ローカルのmasterブランチは必要があれば消してください&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# git branch -D master&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認のためにGithubリポジトリのWebページを開くこともできます&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# gh repo view --web&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=== FINISH ===&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;p&gt;使い方は簡単です。&lt;/p&gt;</description></item><item><title>"Prevent Public Repos"を導入してPublicなGithubリポジトリが作成されたら通知させる</title><link>https://genzouw.com/entry/2021/05/21/164152/2625/</link><pubDate>Fri, 21 May 2021 16:41:52 +0900</pubDate><guid>https://genzouw.com/entry/2021/05/21/164152/2625/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;お恥ずかしながら、Github 上の Organization 内にメンバーが意図せず Public なリポジトリを作成してしまい、それに気づけなかったことがありました。&lt;/p&gt;&#10;&lt;p&gt;プロダクトコードをガシガシコミットされる前に気づけたのですが、「これは危ないな」と思い良い方法を探していたところ、 &lt;strong&gt;Github Apps&lt;/strong&gt; に良さそうなアプリがあったので導入してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gh --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh version 1.10.2 &lt;span class="o"&gt;(&lt;/span&gt;2021-05-19&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/cli/cli/releases/tag/v1.10.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="prevent-public-repos-を利用する"&gt;&amp;ldquo;Prevent Public Repos&amp;rdquo; を利用する&lt;/h2&gt;&#10;&lt;p&gt;以下の Github Apps が今回の用途にピッタリでした。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://probot.github.io/apps/prevent-public-repos/"&gt;Prevent Public Repos | Probot&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Public な Github リポジトリが作成されたタイミングで、Critical な Issue を作成してくれます。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;Issue が作成されたことで気付けるのか？というのも含めて試してみます。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="prevent-public-repos-導入方法"&gt;&amp;ldquo;Prevent Public Repos&amp;rdquo; 導入方法&lt;/h2&gt;&#10;&lt;h3 id="1-github-apps-を追加"&gt;1. Github Apps を追加&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://probot.github.io/apps/prevent-public-repos/"&gt;Prevent Public Repos&lt;/a&gt; のページ右上にある &lt;strong&gt;Add to Github&lt;/strong&gt; ボタンをクリックします。&lt;/p&gt;</description></item><item><title>GKEのNEG(Network Endpoint Group)とIG(Instance Group)との違い、メリットを整理しました</title><link>https://genzouw.com/entry/2021/05/20/160245/2613/</link><pubDate>Thu, 20 May 2021 16:02:45 +0900</pubDate><guid>https://genzouw.com/entry/2021/05/20/160245/2613/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;GCP の Cloud Armor について調べていたところ、ドキュメントに出てきた &lt;strong&gt;NEG&lt;/strong&gt; という単語。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;「VM インスタンスや NEG に対して WAF 機能を提供する」&lt;/em&gt;、とありましたが、&lt;strong&gt;NEG&lt;/strong&gt; とはなんだろう？となってしまったため、 &lt;strong&gt;NEG&lt;/strong&gt; について調べました。&lt;/p&gt;&#10;&lt;h2 id="neg-とは"&gt;NEG とは？&lt;/h2&gt;&#10;&lt;p&gt;NEG についての記載があるページを参考にさせていただきました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://medium.com/google-cloud-jp/neg-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B-cc1e2bbc979e"&gt;NEG とは何か. はじめに | by Yuki Furuyama | google-cloud-jp | Medium&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Network Endpoint ( &lt;strong&gt;NE&lt;/strong&gt; ) は Kubernetes の &lt;strong&gt;Pod&lt;/strong&gt; に相当する&lt;/li&gt;&#10;&lt;li&gt;Network Endpoint を複数まとめたグループが Network Endpoint Group ( &lt;strong&gt;NEG&lt;/strong&gt; ) であり、Kubernetes の &lt;strong&gt;Service&lt;/strong&gt; に相当する&lt;/li&gt;&#10;&lt;li&gt;NEG を使うことで Kubernetes の Pod と Service を GCP 側で第一級市民として扱えるようになる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;視覚化すると以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= GCP =====================================&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------+ +-------+ +---+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |Load Balancer| ----&amp;gt; |NEG | ----&amp;gt; |NE |+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------+ +-------+ +---+|+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ^ ^ +---+|&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | +---+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | ^&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;= GKE =|===================|=============|=&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +------------------+ +-------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |Ingress Controller| |NEG Controller |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +------------------+ +-------------------+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; | | |&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------+ +-------+ +---+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; |Ingress | ----&amp;gt; |Service| ----&amp;gt; |Pod|+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +-------------+ +-------+ +---+|+&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---+|&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; +---+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;GKE&lt;/strong&gt; 上のリソースとして &lt;strong&gt;Ingress&lt;/strong&gt; 、 &lt;strong&gt;Service&lt;/strong&gt; 、 &lt;strong&gt;Pod&lt;/strong&gt; がありますが、 GCP 上にも対になるリソースが生成されます。&#10;&lt;strong&gt;NE&lt;/strong&gt; は　 Pod に割り当てられている &lt;strong&gt;IP + Port&lt;/strong&gt; のセットで一意となる GCP リソースです。&lt;/p&gt;</description></item><item><title>GCPの"Cloud Domains"を使ってドメインを取得、管理する</title><link>https://genzouw.com/entry/2021/05/18/181955/2599/</link><pubDate>Tue, 18 May 2021 18:19:55 +0900</pubDate><guid>https://genzouw.com/entry/2021/05/18/181955/2599/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;ドメインを取得するためのサービス &lt;strong&gt;&amp;ldquo;Google Domains&amp;rdquo;&lt;/strong&gt; とごっちゃになってしまいそうですが、 GCP 上の &lt;strong&gt;&amp;ldquo;Cloud Domains&amp;rdquo;&lt;/strong&gt; というサービスでドメイン取得ができるようでしたので試してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;GCP ( Google Cloud Platform )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="概要"&gt;概要&lt;/h2&gt;&#10;&lt;p&gt;冒頭でも触れましたが、ドメインを &lt;strong&gt;登録&lt;/strong&gt; し、 &lt;strong&gt;管理&lt;/strong&gt; するためのサービスとのことです。&lt;/p&gt;&#10;&lt;p&gt;以下のサービスと名前が似ていますので、違いを整理しながら作業を進めていきます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Google Domains&lt;/li&gt;&#10;&lt;li&gt;Cloud DNS&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="前提条件"&gt;前提条件&lt;/h2&gt;&#10;&lt;p&gt;当然のことながら &lt;strong&gt;&amp;ldquo;GCP&amp;rdquo; のアカウント作成が完了している&lt;/strong&gt; 必要があります。&lt;/p&gt;&#10;&lt;p&gt;事前に作成しておきましょう。&lt;/p&gt;&#10;&lt;h2 id="ドメインの登録方法"&gt;ドメインの登録方法&lt;/h2&gt;&#10;&lt;p&gt;ドメインの登録までの作業を順次進めていきましょう。&lt;/p&gt;&#10;&lt;h3 id="0-まずは-cloud-domains-の有効化"&gt;0. まずは &amp;ldquo;Cloud Domains&amp;rdquo; の有効化&lt;/h3&gt;&#10;&lt;p&gt;すでに &amp;ldquo;GCP&amp;rdquo; のコンソールページが開ける状態であるはずです。&lt;/p&gt;&#10;&lt;p&gt;コンソールページにて &lt;a href="https://console.cloud.google.com/apis/library/domains.googleapis.com?authuser=1&amp;amp;hl=ja&amp;amp;_ga=2.18399932.428837190.1621318869-765240018.1621318869"&gt;&amp;ldquo;Cloud Domains API&amp;rdquo; を有効にするためのページ&lt;/a&gt; を開き、有効化します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1uRZgOIlmHSIO-_5k3RGtnWbE3Y7LCRfc" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="1-登録したいドメインを検索"&gt;1. 登録したいドメインを検索&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://console.cloud.google.com/net-services/domains/registrations/list?_ga=2.44674530.734215462.1621326357-296491316.1621326357"&gt;Cloud Doamins の管理ページ&lt;/a&gt; を開きます。&lt;/p&gt;&#10;&lt;p&gt;その後、 &lt;strong&gt;「ドメインを登録」&lt;/strong&gt; ボタンを押します。&lt;/p&gt;&#10;&lt;p&gt;購入したいドメインを検索します。結果、いくつかのドメインが、登録価格と一緒に表示されます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1JhfXnGST1ejP43mtnN3XugybcrQQZBvA" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;購入したいものを見つけたら、一覧右列の &lt;strong&gt;「カートボタン」&lt;/strong&gt; を押します。 ( 同時に複数ドメインを購入することができます。その場合には購入したいカートボタンをすべてクリックします。 )&lt;/p&gt;&#10;&lt;p&gt;ページ右側に選択された全「ドメイン」を購入するための料金合計が計算され、表示されます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=14cXOx5pdxii-ubYXAlgykXkHhLeMtiF2" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;選択に問題がなければ、「続行」ボタンを押します。&lt;/p&gt;&#10;&lt;h3 id="2-ドメインに対する-dns-を設定"&gt;2. ドメインに対する DNS を設定&lt;/h3&gt;&#10;&lt;p&gt;DNS プロバイダ ( DNS サーバの提供元 ) をどこにするかを選択します。 ( 冒頭で取り上げたサービスが絡んできましたね。 )&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで数値計算を行うとスクリプトが強制終了される問題でハマった話</title><link>https://genzouw.com/entry/2021/05/17/203142/2595/</link><pubDate>Mon, 17 May 2021 20:31:42 +0900</pubDate><guid>https://genzouw.com/entry/2021/05/17/203142/2595/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Web 上の競技プログラミングや 100 本ノックの問題をシェルで問いているときにハマってしまいました。&lt;/p&gt;&#10;&lt;p&gt;原因がわかれば「ああなるほど」と思いました。&lt;/p&gt;&#10;&lt;p&gt;ぱっと見、問題がないのですが、なぜだかスクリプトが強制終了してしまいます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="問題の発生したスクリプト"&gt;問題の発生したスクリプト&lt;/h2&gt;&#10;&lt;p&gt;実際のスクリプトとは異なりますが、同じ問題を孕んだスクリプトを掲載します。&lt;/p&gt;&#10;&lt;p&gt;以下のスクリプトを &lt;strong&gt;test.sh&lt;/strong&gt; という名前で保存しておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SUM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;I&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 0&lt;span class="p"&gt;;&lt;/span&gt; I &amp;lt; 5&lt;span class="p"&gt;;&lt;/span&gt; I++&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;SUM&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; I&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$SUM&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;set -o errexit&lt;/code&gt; は &lt;code&gt;set -e&lt;/code&gt; と同義です。&#10;スクリプトのいずれかの行でエラーが発生した場に処理を中断するオプションになります。&lt;/p&gt;&#10;&lt;p&gt;スクリプトは単純です。&#10;ループカウンタ &lt;code&gt;I&lt;/code&gt; は 0〜4 までカウントしていきます。&#10;その値をすべて &lt;code&gt;SUM&lt;/code&gt; という変数に加算していきます。&lt;/p&gt;</description></item><item><title>Google製のJavaScript Shellラッパー"zx"を触ってみたYO！</title><link>https://genzouw.com/entry/2021/05/14/224238/2575/</link><pubDate>Fri, 14 May 2021 22:42:38 +0900</pubDate><guid>https://genzouw.com/entry/2021/05/14/224238/2575/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Twitter で少し前に盛り上がっていた、 &lt;a href="https://github.com/google/zx"&gt;google/zx&lt;/a&gt; という NPM ライブラリに触れてました。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;新しいツールを触る機会は家の手伝いや子守をしていてここ数年全く取れていなかったのですが、今日はたまたま時間が作れました。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v15.12.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yarn --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1.22.10&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ツールの紹介"&gt;ツールの紹介&lt;/h2&gt;&#10;&lt;p&gt;Bash は偉大だけと、多くのケースでスクリプトを書こうとするともっと高級な言語が選択されます。&#10;文法や型に制約が強いほうがチーム開発には向いていますよね。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;ちょっとした処理を Bash で書こうものなら、他のエンジニアから風当たりが強いです&lt;/em&gt; 。&lt;/p&gt;&#10;&lt;p&gt;JavaScript も良い選択肢ですが、JavaScript から Bash コマンドを呼び出す手間が面倒です。&lt;/p&gt;&#10;&lt;p&gt;そんな手間を違和感なく解決してくれるのが &lt;code&gt;zx&lt;/code&gt; とのことです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/google/zx"&gt;GitHub - google/zx: A tool for writing better scripts&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;npm と yarn のそれぞれの方法を紹介していますが、どちらにしてもグローバルインストールすることが推奨されているようです。&lt;/p&gt;&#10;&lt;h3 id="npm-の場合"&gt;npm の場合&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -g zx&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="yarn-の場合"&gt;yarn の場合&lt;/h3&gt;&#10;&lt;p&gt;僕はこちらでインストールしました。&lt;/p&gt;</description></item><item><title>GCP上の2つのK8Sクラスタの設定差異をdiffで確認する</title><link>https://genzouw.com/entry/2021/05/13/194939/2573/</link><pubDate>Thu, 13 May 2021 19:49:39 +0900</pubDate><guid>https://genzouw.com/entry/2021/05/13/194939/2573/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;既存の GKE ( Google Kubernetes Engine )クラスタが 2 つありました。&lt;/p&gt;&#10;&lt;p&gt;両者とも前任者が手作業で作成していましたが、すでに設定に乖離があることが想定されていました。&lt;br&gt;&#10;乖離を埋めるために、両者にどれだけの違いがあるのか確認しておきたいと思いました。&lt;/p&gt;&#10;&lt;p&gt;差異を確認するために工夫した方法を掲載します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ diff --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;diff &lt;span class="o"&gt;(&lt;/span&gt;GNU diffutils&lt;span class="o"&gt;)&lt;/span&gt; 2.8.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2002&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="gcp-上の-k8s-クラスタの設定を抜き出す"&gt;GCP 上の K8S クラスタの設定を抜き出す&lt;/h2&gt;&#10;&lt;p&gt;GCP 上の Kubernetes クラスタの設定を抜き出すために、 &lt;code&gt;gcloud&lt;/code&gt; コマンドが利用できます。&lt;/p&gt;&#10;&lt;p&gt;例えば以下のような環境に Kubernetes クラスタが作成されていたとします。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;プロジェクト ID : &lt;code&gt;GCP_MY_PROJECT_ID&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;ゾーン名 : &lt;code&gt;asia_northeast1_b&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Kubernetes クラスタ名 : &lt;code&gt;GCP_MY_CLUSTER_NAME&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;この Kubernetes クラスタの設定を抜き出すには、以下のコマンドを実行します。&lt;/p&gt;</description></item><item><title>Goole Cloud Build上でシェルを実行した結果、エラーが発生しても正常終了してしまう問題に対処</title><link>https://genzouw.com/entry/2021/05/12/120554/2570/</link><pubDate>Wed, 12 May 2021 12:05:54 +0900</pubDate><guid>https://genzouw.com/entry/2021/05/12/120554/2570/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;開発効率化、品質向上のために現在のシステム開発に &lt;strong&gt;CI/CD&lt;/strong&gt; パイプラインの構築は必須だと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Github Action&lt;/strong&gt; / &lt;strong&gt;CircleCI&lt;/strong&gt; / &lt;strong&gt;Cloud Build&lt;/strong&gt; など、CI/CD を構築するためのサービスがありますが、Cloud Build を多用させていただいています。&lt;/p&gt;&#10;&lt;p&gt;その &amp;ldquo;Cloud Build&amp;rdquo; でシェルコマンドを実行したところ、エラーが発生したにもかかわらずなぜか正常終了してしまい原因特定までに多少時間がかかってしまいました。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;わかってしまえば当然なのですが、ついつい「シェルを実行している」ことを忘れてしまったことが原因でした。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Google Cloud Platform ( GCP )&lt;/strong&gt; の &lt;strong&gt;Cloud Build&lt;/strong&gt; を利用しました。&lt;/p&gt;&#10;&lt;h2 id="再現方法"&gt;再現方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Cloud Build&lt;/strong&gt; でビルドステップを構築する方法として、ちょっと複雑なものを構築しようとした場合は Git リポジトリに &lt;code&gt;cloudbuild.yaml&lt;/code&gt; という YAML ファイルを配置してやります。&lt;/p&gt;&#10;&lt;p&gt;ここで、以下のような &lt;code&gt;cloudbuild.yaml&lt;/code&gt; というファイルを用意としましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;steps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bash&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entrypoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;bash&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;begin&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; ls -la /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; ls -la /nothing&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; echo &amp;#34;end&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;処理概要は以下のとおりです。&lt;/p&gt;</description></item><item><title>Docker Composeで初回起動時のみyarn installを実行させる方法</title><link>https://genzouw.com/entry/2021/04/28/215832/2563/</link><pubDate>Wed, 28 Apr 2021 21:58:32 +0900</pubDate><guid>https://genzouw.com/entry/2021/04/28/215832/2563/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Docker Compose の初回起動時のみ、ライブラリのインストールを実行したい場合があります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;NodeJS の場合 &lt;code&gt;yarn install&lt;/code&gt; や &lt;code&gt;npm install&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;PHP の場合 &lt;code&gt;composer install&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Ruby on Rails の場合 &lt;code&gt;bundle install&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;いい方法が無いか考えた末、 &lt;code&gt;docker-compose.yaml&lt;/code&gt; の &lt;strong&gt;command&lt;/strong&gt; 属性に工夫して解決させてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-compose --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-compose version 1.29.0, build &lt;span class="m"&gt;07737305&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-compose-初回起動時にライブラリをインストールしておかないとどうなる"&gt;Docker Compose 初回起動時にライブラリをインストールしておかないとどうなる？&lt;/h2&gt;&#10;&lt;p&gt;例えば、以下のような NodeJS の Web アプリケーションを起動させたいと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;yarn start&lt;/code&gt; というコマンドでサーバが起動します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;3.4&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nodejs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;node:15.13.0-alpine&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;.:/app:cached&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;working_dir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/app&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;entrypoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;sh&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- -&lt;span class="l"&gt;c&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; yarn start&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;entrypoint&lt;/code&gt; 、 &lt;code&gt;command&lt;/code&gt; の設定情報から、起動時に以下のコマンドが実行されます。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで2つのディレクトリを比較し内容に差異があったファイル名を一覧表示する</title><link>https://genzouw.com/entry/2021/04/27/211354/2559/</link><pubDate>Tue, 27 Apr 2021 21:13:54 +0900</pubDate><guid>https://genzouw.com/entry/2021/04/27/211354/2559/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;diff&lt;/code&gt; コマンドを使えば 2 つのファイルの内容の差分を確認することができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &amp;gt; 1.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &amp;gt; 2.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ diff 1.txt 2.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;--- 1.txt 2021-04-26 21:35:52.000000000 +0900&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+++ 2.txt 2021-04-26 21:35:58.000000000 +0900&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;@&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ diff 1.txt 2.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1d0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3a3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;diff&lt;/code&gt; コマンドには、2 つのファイルだけではなく、2 つのディレクトリの中にあるすべてのファイルに対して差分を確認する機能もあります。 ( ex: &lt;code&gt;diff -r dir1/ dir2&lt;/code&gt; )&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;diff -r&lt;/code&gt;&#10;ではファイルのコンテンツ差分がすべて表示されますが、&#10;&lt;strong&gt;差分のあったファイルの名前だけが欲しい&lt;/strong&gt; 場合はどうしたら良いでしょうか？&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="diff--r-を使ってディレクトリ間のファイルの差分を出力"&gt;&lt;code&gt;diff -r&lt;/code&gt; を使ってディレクトリ間のファイルの差分を出力&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;diff -r&lt;/code&gt; コマンドについておさらいです。&lt;/p&gt;</description></item><item><title>シェルスクリプトでコマンドを制限時間(タイムアウト)付きで実行させる</title><link>https://genzouw.com/entry/2021/04/22/190909/2556/</link><pubDate>Thu, 22 Apr 2021 19:09:09 +0900</pubDate><guid>https://genzouw.com/entry/2021/04/22/190909/2556/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;コマンドやシェルスクリプトを制限時間付きで実行させ、制限時間を超えたらタイムアウトさせたい場合があります。&lt;/p&gt;&#10;&lt;p&gt;例えば、特定のファイルが作成されるまで待ち続けますが、そのファイルを作成する別プロセスがエラー終了してしまい永遠に待ち続けてしまう、といったようなケースに利用できます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.1.4&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ timeout --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;timeout &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.22&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2013&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="timeout-コマンドを利用する"&gt;&lt;code&gt;timeout&lt;/code&gt; コマンドを利用する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;timeout&lt;/code&gt; コマンドを利用することでコマンド実行にタイムアウトの設定をすることができます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;timeout&lt;/code&gt; コマンドを通して &lt;code&gt;sleep&lt;/code&gt; コマンドを実行し、挙動を見ていきましょう。&lt;/p&gt;&#10;&lt;h3 id="制限時間3-秒内に終了する場合"&gt;制限時間(3 秒)内に終了する場合&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;timeout&lt;/code&gt; コマンドは、第 1 引数に制限時間（デフォルトの単位は秒）、第 2 引数に実行するコマンドを指定します。&lt;/p&gt;&#10;&lt;p&gt;3 秒の制限時間を指定する場合には、 &lt;code&gt;timeout 3 &amp;lt;COMMAND&amp;gt;&lt;/code&gt; のように指定します。&lt;/p&gt;&#10;&lt;p&gt;ここでは、 &lt;code&gt;sleep 2&lt;/code&gt; コマンドを実行し、2 秒間だけ待った後終了するコマンドを実行させてみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ timeout &lt;span class="m"&gt;3&lt;/span&gt; sleep &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;timeout&lt;/code&gt; コマンドの制限時間に引っかからずにコマンドが終了した場合には、実行後ステータスを示す変数 &lt;code&gt;$?&lt;/code&gt; は 0 (正常終了) となります。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでディレクトリを作成してから移動する処理を最も簡潔に記述する方法</title><link>https://genzouw.com/entry/2021/04/19/201151/2550/</link><pubDate>Mon, 19 Apr 2021 20:11:51 +0900</pubDate><guid>https://genzouw.com/entry/2021/04/19/201151/2550/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;小ネタです。&lt;/p&gt;&#10;&lt;p&gt;いろんな言語やツールのチュートリアルを読み進めていると、&#10;必ずと言っていいほど書かれているコマンドのセットがあります。&lt;/p&gt;&#10;&lt;p&gt;それが &lt;code&gt;mkdir&lt;/code&gt; と &lt;code&gt;cd&lt;/code&gt; 。&lt;/p&gt;&#10;&lt;p&gt;例えば「チュートリアル用の作業ディレクトリを使って」といった処理の場合に以下のように 2 つのコマンドがセットで記述されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ホームディレクトリ配下の &amp;#34;sample-app&amp;#34; ディレクトリを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir /home/genzouw/sample-app&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ホームディレクトリ配下の &amp;#34;sample-app&amp;#34; ディレクトリに移動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /home/genzouw/sample-app&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;毎度のことながらこのような処理をスクリプトに起こした場合、気になってしまうこと。&#10;それは &lt;strong&gt;DRY&lt;/strong&gt; ( &lt;em&gt;繰り返しを避ける&lt;/em&gt; ) ではないという点。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;/home/genzouw/sample-app&lt;/code&gt; というディレクトリ名が 2 回登場しています。&lt;/p&gt;&#10;&lt;p&gt;これを回避するために &lt;strong&gt;変数&lt;/strong&gt; を利用する事もできます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ホームディレクトリ配下の &amp;#34;sample-app&amp;#34; ディレクトリを変数にセット&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;SAMPLE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/home/genzouw/sample-app&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ディレクトリ作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$SAMPLE_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ディレクトリ移動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$SAMPLE_DIR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;より簡潔な記述方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ディレクトリ作成--移動を行う-dry-なワンライナー"&gt;「ディレクトリ作成 → 移動」を行う DRY なワンライナー&lt;/h2&gt;&#10;&lt;p&gt;結論から言います。&lt;/p&gt;</description></item><item><title>yml-sorterを使ってYAMLファイルの属性情報をソートする</title><link>https://genzouw.com/entry/2021/04/10/081159/2538/</link><pubDate>Sat, 10 Apr 2021 08:11:59 +0900</pubDate><guid>https://genzouw.com/entry/2021/04/10/081159/2538/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;最近 &lt;strong&gt;Kubernetes&lt;/strong&gt; 、 &lt;strong&gt;Docker Compose&lt;/strong&gt; 、 &lt;strong&gt;OpenAPI&lt;/strong&gt; といったツールで YAML ファイルを触ることが多いです。&lt;/p&gt;&#10;&lt;p&gt;参加したプロジェクトでは、この設定ファイルが環境別に管理されていました。&#10;環境は以下のものがあり、それぞれに YAML ファイルが用意されています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;本番環境&lt;/li&gt;&#10;&lt;li&gt;ステージング環境&lt;/li&gt;&#10;&lt;li&gt;開発環境&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;設定ファイルが多重管理されているという問題に対処するために、&#10;まずはそれぞれの環境の設定ファイルの違いを &lt;code&gt;diff&lt;/code&gt; で確認しようと思いました。&lt;/p&gt;&#10;&lt;p&gt;しかし、そもそもそれらの設定ファイルの属性がきれいに並べられておらず、 &lt;code&gt;diff&lt;/code&gt; が大変です。&lt;/p&gt;&#10;&lt;p&gt;なんとかならないものでしょうか？&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v15.14.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yarn --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1.22.5&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="yaml-ファイルの各フィールドをソートするために-yml-sorter-を使う"&gt;YAML ファイルの各フィールドをソートするために &lt;code&gt;yml-sorter&lt;/code&gt; を使う&lt;/h2&gt;&#10;&lt;p&gt;これに対処するために YAML の内容を属性名でソートさせてから &lt;code&gt;diff&lt;/code&gt; すれば良さそうです。&lt;/p&gt;&#10;&lt;p&gt;探してみたところ、YAML ファイルの各フィールド名でソートするためのツールを見つけました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.npmjs.com/package/yml-sorter"&gt;yml-sorter&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;こちらのツールは、 &lt;strong&gt;js-yaml&lt;/strong&gt; という別のツールのラッパーということです。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;npm なら以下の通り。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm i -g yml-sorter&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;yarn なら以下の通り。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yarn global add yml-sorter&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;p&gt;YAML ファイルを引数に指定して実行するだけです。&lt;/p&gt;&#10;&lt;p&gt;適当な &lt;code&gt;docker-compose.yaml&lt;/code&gt; サンプルがほしかったので、以下の Github リポジトリのものを拝借します。&lt;/p&gt;</description></item><item><title>シェルにも使える！nodemon を使ってコードに変更があった場合にホットリロード(自動再起動)させる</title><link>https://genzouw.com/entry/2021/04/09/084541/2536/</link><pubDate>Fri, 09 Apr 2021 08:45:41 +0900</pubDate><guid>https://genzouw.com/entry/2021/04/09/084541/2536/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Node.js でアプリケーション開発をしている際に、コード変更が行われたら自動的に再起動したいと思いました。&#10;ちょうど GraphQL を使ってアプリケーションを開発していたのですが、 GraphQL のスキーマ変更は（ &lt;strong&gt;Apollo Server&lt;/strong&gt; の) 再起動を行わないと変更が反映されません。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://nodemon.io/"&gt;nodemon&lt;/a&gt; というツールを使うことで簡単に実現できました。&lt;/p&gt;&#10;&lt;h2 id="作業環境"&gt;作業環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v15.12.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nodemon-ってなに"&gt;「nodemon」 ってなに？&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;2021-04-09 現在で 1500 万を超えるプロジェクトで利用されているツール&lt;/li&gt;&#10;&lt;li&gt;ソースコードの変更を監視している&lt;/li&gt;&#10;&lt;li&gt;変更があったら自動定期にサーバプロセスを再起動してくれる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="nodemon-の使い方は"&gt;「nodemon」 の使い方は？&lt;/h2&gt;&#10;&lt;p&gt;とても簡単です。&#10;&lt;code&gt;node&lt;/code&gt; コマンドの代わりに &lt;code&gt;nodemon&lt;/code&gt; コマンドを使います。ただそれだけ。&#10;それだけで、コードの変更を検知したら自動的に再起動してくれます。&lt;/p&gt;&#10;&lt;h2 id="nodemon-コマンドの特徴"&gt;「nodemon」 コマンドの特徴&lt;/h2&gt;&#10;&lt;p&gt;ほぼこれを使えば困ることがないぐらい、機能豊富です。&#10;特徴を上げてみます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;アプリケーションを自動的に再起動してくれます&lt;/li&gt;&#10;&lt;li&gt;いくつかの拡張子に該当するファイルを自動的に探して監視してくれます&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;.js&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;.mjs&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;.coffee&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;.litcoffee&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;.json&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;デフォルト挙動では &lt;strong&gt;&lt;code&gt;node&lt;/code&gt; コマンド + 監視機能&lt;/strong&gt; として動作しますが、 &lt;strong&gt;&lt;code&gt;python&lt;/code&gt; コマンド + 監視機能&lt;/strong&gt; や、 &lt;code&gt;ruby&lt;/code&gt; コマンド、 &lt;code&gt;make&lt;/code&gt; など、任意のコマンド実行に切替可能です&lt;/li&gt;&#10;&lt;li&gt;指定したファイルやディレクトリを監視対象から外すこともできます&lt;/li&gt;&#10;&lt;li&gt;指定したディレクトリだけを監視させることができます&lt;/li&gt;&#10;&lt;li&gt;自作のスクリプトから呼びだあすことも可能&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="インストール方法"&gt;インストール方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;npm&lt;/code&gt; コマンドが使えれば簡単にインストールできます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm install -g nodemon&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;「システムのグローバル領域にインストールしたくない！」、「バージョン依存の問題を回避するためプロジェクトディレクトリにインストールしたい」といった場合は以下のコマンドでも OK。&lt;/p&gt;</description></item><item><title>Bashシェルで「1000 以下の回文素数で最大のものを示せ」を問いてみる</title><link>https://genzouw.com/entry/2021/03/29/212845/2528/</link><pubDate>Mon, 29 Mar 2021 21:28:45 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/29/212845/2528/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2021/03/25/120024/2521/"&gt;前回のエントリ&lt;/a&gt;で &lt;strong&gt;素数をワンライナーで求める&lt;/strong&gt; というネタをやりました。&lt;/p&gt;&#10;&lt;p&gt;もともと、今日のエントリを解くための前置きだったのでした。&#10;課題は&lt;a href="https://kumappus.hatenadiary.org/entries/2011/06/14"&gt;こちらのサイト&lt;/a&gt;から拝借しました。&lt;/p&gt;&#10;&lt;p&gt;今日問いてみようと思っている内容は、タイトル通りなのですが、ちょっとわかりにくいので解説しておきます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;回文数&lt;/strong&gt; ： 逆さに読んでも内容が変わらない数。( 例 1、 11、 121 ）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;回文素数&lt;/strong&gt; ： 回文数であり、かつ素数。 ( 例 2、 11、 101 ）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;1000 以下&lt;/strong&gt; の &lt;strong&gt;回文&lt;/strong&gt; &lt;strong&gt;素数&lt;/strong&gt; で最大のものを求めてみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前回のおさらい--素数を求めるワンライナー"&gt;前回のおさらい : 素数を求めるワンライナー&lt;/h2&gt;&#10;&lt;p&gt;1 から 1000 までの素数をワンライナーで列挙してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ factor &lt;span class="o"&gt;{&lt;/span&gt;1..1000&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;NF==2 { print $2 }&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt;省略&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;971&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;977&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;983&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;991&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;997&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解説は&lt;a href="https://genzouw.com/entry/2021/03/25/120024/2521/"&gt;前回のエントリを参照&lt;/a&gt;ください。シェルなら簡単ですね。&lt;/p&gt;</description></item><item><title>【衝撃】シェルスクリプトなら素数を列挙する問題が１行(ワンライナー)で書ける！</title><link>https://genzouw.com/entry/2021/03/25/120024/2521/</link><pubDate>Thu, 25 Mar 2021 12:00:24 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/25/120024/2521/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/07/05/082014/1651/"&gt;シェルスクリプトだと FizzBuzz が１行(ワンライナー)で書ける&lt;/a&gt; と同じようにワンライナーネタです。&lt;/p&gt;&#10;&lt;p&gt;最近は &lt;strong&gt;Go 言語&lt;/strong&gt; を少しずつ勉強しています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://go.genzouw.com/"&gt;Go 言語用ポストイット | Go 言語の学習メモをポストイットのように貼り付けていきます&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;その中で素数を求める問題を説いてみよう！と思ったのですが、すぐに脇道にそれて &lt;strong&gt;「Bash 上でシェルを使って得ならどう書くか？」&lt;/strong&gt; に頭を使っているうちにエントリを書くことにしました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ぜひ、「孤独な数値」を数えて落ち着きたい方にどうぞ。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2021/03/Image-2021-03-25-10-07-23-294x300.jpg" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.4&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="動画解説"&gt;動画解説&lt;/h2&gt;&#10;&lt;p&gt;動画でも解説しています。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ただし、1 は素数と言ったり、素因数のことを約数と言ってみたり、数学をかじった人たちからマサカリが飛んできそうな内容になっています。。。。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/r-q_dIYAc7M" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;&#10;&lt;h2 id="素因数分解をしてくれるコマンド-factor-を活用"&gt;素因数分解をしてくれるコマンド &lt;code&gt;factor&lt;/code&gt; を活用&lt;/h2&gt;&#10;&lt;p&gt;素数を求めるために、 &lt;code&gt;factor&lt;/code&gt; コマンドを活用します。&#10;( &lt;em&gt;もしインストールされていないなら &lt;code&gt;yum install coreutil&lt;/code&gt; あるいは &lt;code&gt;apt install coreutil&lt;/code&gt; をどうぞ&lt;/em&gt; )&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;factor&lt;/code&gt; コマンドは引数で指定した数値を &lt;strong&gt;素因数分解&lt;/strong&gt; してくれるコマンドです。&lt;/p&gt;</description></item><item><title>ログを "tail -f" で監視している時にログローテートや "mv" されると何も表示されなくなってしまうことに対処</title><link>https://genzouw.com/entry/2021/03/24/120010/2518/</link><pubDate>Wed, 24 Mar 2021 12:00:10 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/24/120010/2518/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;サーバの運用作業を行っているとき、リリース作業を行っているときにログを監視するために &lt;code&gt;tail -f&lt;/code&gt; コマンドを利用します。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;tail -f&lt;/code&gt; でログを監視している時にログが急に止まってしまい、「ドキッ」としたことはないでしょうか。&#10;実際にはログローテートされていたり、ログファイルがリネームされただけだった、というケースがあります。&lt;/p&gt;&#10;&lt;p&gt;さて、この &lt;strong&gt;ログファイルがリネームされた時に &lt;code&gt;tail -f&lt;/code&gt; で監視していたログ出力が止まってドキッとしてしまう問題&lt;/strong&gt; をなんとかできないものでしょうか。&lt;/p&gt;&#10;&lt;p&gt;今回はこの問題に対する対処法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="動画解説"&gt;動画解説&lt;/h2&gt;&#10;&lt;p&gt;動画でも解説しています。&lt;/p&gt;&#10;&lt;iframe width="560" height="315" src="https://www.youtube.com/embed/zWE4FDyPx3Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen&gt;&lt;/iframe&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tail --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tail &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.32&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2020&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="問題の再現方法"&gt;問題の再現方法&lt;/h2&gt;&#10;&lt;p&gt;説明文だけではわかりにくいので、実際に問題を発生させてみます。&lt;/p&gt;&#10;&lt;p&gt;今回はターミナルを 3 つ立ち上げる必要があります。&lt;/p&gt;&#10;&lt;h3 id="1-つ目のターミナル---ログファイルを監視"&gt;1 つ目のターミナル - ログファイルを監視&lt;/h3&gt;&#10;&lt;p&gt;1 つ目のターミナルではログファイルを監視します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 監視対象のログファイルを作成しておきましょう。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch one.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# tail -fコマンドでログファイルを監視&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tail -f one.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;何も表示されません。まだログファイルに何も書き込んでいないためです。&lt;/p&gt;</description></item><item><title>Linux、シェルに関するYoutubeチャンネルを開設しました！</title><link>https://genzouw.com/entry/2021/03/22/093100/2494/</link><pubDate>Mon, 22 Mar 2021 09:31:00 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/22/093100/2494/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;突然ですが、Linuxやシェルに関する情報をブログ以外でも発信してみたいと思い、 &lt;a href="https://studio.youtube.com/channel/UCl5cKDURfDAZKJLySyAepQg"&gt;Youtubeチャンネルを解説しました&lt;/a&gt; ！&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;script src="https://apis.google.com/js/platform.js"&gt;&lt;/script&gt;&#10;&lt;div class="g-ytsubscribe" data-channelid="UCl5cKDURfDAZKJLySyAepQg" data-layout="full" data-theme="dark" data-count="default"&gt;&lt;/div&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;もう少し大きなバーを貼りたいけど、 &lt;strong&gt;貼り方がわからず、こんな小さなバーになりました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="正直しゃべるのが苦手なのでとても恥ずかしいです"&gt;正直しゃべるのが苦手なのでとても恥ずかしいです&lt;/h2&gt;&#10;&lt;p&gt;自分はしゃべるのが苦手なのでとても恥ずかしいです。&lt;/p&gt;&#10;&lt;p&gt;普段からあまり喋らない方ですし、滑舌も悪い。&lt;/p&gt;&#10;&lt;p&gt;皆さんには何を言っているのか聞き取りづらいとおもいます。&lt;/p&gt;&#10;&lt;p&gt;ではなぜ始めたのか？&lt;/p&gt;&#10;&lt;h2 id="このままではまずいという焦り"&gt;このままではまずい、という焦り&lt;/h2&gt;&#10;&lt;p&gt;このブログを始めた理由にも関係すると思います。&#10;僕は他の人より秀でたものがないというのがずっとコンプレックスとしてありました。&#10;そんな中、IT勉強会に参加するたびに聞く、「技術ブログ」というものを僕も始めてみようと思いました。&#10;自分のブログで情報を発信していないエンジニアが周りに1人もいなかったというのもあります。&lt;/p&gt;&#10;&lt;p&gt;始めた当初も現在も、このブログではお世辞にも技術的に高いものを公開しているとは言えません。&lt;/p&gt;&#10;&lt;p&gt;それでも何かを始め、続けないとただでさえ人に勝てるものがない自分がだめになっていくという焦りから行動し続けています。&lt;/p&gt;&#10;&lt;p&gt;Youtubeを初めて見ようと思ったきっかけも同じです。&#10;いい年齢になって、体も少しずつガタがきはじめています。頭の回転も昔ほど早くなくなってきました。&#10;5人の子どもと妻を養うためにも、更に新しい &lt;strong&gt;武器&lt;/strong&gt; をてにいれないといけない！という思いから重い腰が動いたというわけです。&lt;/p&gt;&#10;&lt;h2 id="当ブログの内容もどんどん変わってきている僕自身も変わり続ける"&gt;当ブログの内容もどんどん変わってきている、僕自身も変わり続ける&lt;/h2&gt;&#10;&lt;p&gt;それにいつの間にか &lt;strong&gt;Linux&lt;/strong&gt; や &lt;strong&gt;シェルスクリプト&lt;/strong&gt; の内容が多くなっていますが、もともとは &lt;strong&gt;Java&lt;/strong&gt; 、 &lt;strong&gt;Groovy&lt;/strong&gt; 、 &lt;strong&gt;JavaScript&lt;/strong&gt; といったプログラミング言語の習得を目的に始めたものでした。&#10;数年間は全くアクセスが来ませんでした。ある日、Linuxの設定に関するエントリのアクセス数が他よりも若干多いことに気づきました。そのあたりから &lt;strong&gt;「自分がやりたいこと、学びたいこと」&lt;/strong&gt; から &lt;strong&gt;「人が求めていること」&lt;/strong&gt; に公開内容を少しずつシフトしていきました。 &lt;strong&gt;人に必要とされていることを楽しむようになっていきました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;ブログの開設場所も変わり続けています。&#10;はじめは &lt;strong&gt;Google Blogger&lt;/strong&gt; でした。 周りのエンジニアが &lt;strong&gt;Hatena Blog&lt;/strong&gt; を使っているのを見て、僕も引っ越ししました。そこから &lt;strong&gt;「自分で運営するなにかを持ちたい。運営というのもブログを書くだけじゃなく、サーバーを構築し、インストールし、ドメイン契約やHTTPSの設定を行い、アクセス数の増加に対応するように運用したい。」&lt;/strong&gt; という気持ちから、現在は自分でサーバを立ち上げ運営し、 &lt;strong&gt;WordPress&lt;/strong&gt; を使った今のスタイルに落ち着いています。&lt;/p&gt;&#10;&lt;h2 id="というわけで"&gt;というわけで&lt;/h2&gt;&#10;&lt;p&gt;というわけで振り返ると焦りに突き動かされて、その中で少しずつ自分の立ち位置やキャラ作りをしていったわけです。&lt;/p&gt;&#10;&lt;p&gt;その延長線上としてまた新しいことを始めてみました。&lt;/p&gt;&#10;&lt;script src="https://apis.google.com/js/platform.js"&gt;&lt;/script&gt;&#10;&lt;div class="g-ytsubscribe" data-channelid="UCl5cKDURfDAZKJLySyAepQg" data-layout="full" data-count="default"&gt;&lt;/div&gt;&#10;&lt;p&gt;↑少しでも当エントリで参考になった！面白かったよ！という方がいらっしゃれば、チャンネル登録よろしくおねがいします。 &lt;strong&gt;励みになります！&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;金曜日に「Youtube始められましたね」と声をかけてもらいました。&lt;/p&gt;&#10;&lt;p&gt;嬉しいですが同時にめっちゃはずかしい。。。&lt;/p&gt;</description></item><item><title>シェルスクリプトで名前にスペース(空白)を含むファイルがxargsでうまく処理できない場合の対処</title><link>https://genzouw.com/entry/2021/03/14/080059/2457/</link><pubDate>Sun, 14 Mar 2021 08:00:59 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/14/080059/2457/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;チームメンバから「名前にスペースを含むファイルをxargsでうまく取り扱えない」という相談を受けました。&lt;/p&gt;&#10;&lt;p&gt;調べたらすぐに解決する &lt;strong&gt;あれ&lt;/strong&gt; だと思ったのですが、 &lt;code&gt;find&lt;/code&gt; ではなく &lt;code&gt;grep&lt;/code&gt; の実行結果を &lt;code&gt;xargs&lt;/code&gt; に渡していたので、なるほどあまり見ないケースだなと思ったついでにエントリをまとめました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep &lt;span class="o"&gt;(&lt;/span&gt;BSD grep&lt;span class="o"&gt;)&lt;/span&gt; 2.5.1-FreeBSD&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ find --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;find &lt;span class="o"&gt;(&lt;/span&gt;GNU findutils&lt;span class="o"&gt;)&lt;/span&gt; 4.7.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="名前にスペース空白を含むファイルがxargsでうまく処理できない-とはどんな問題"&gt;&amp;ldquo;名前にスペース(空白)を含むファイルがxargsでうまく処理できない&amp;rdquo; とはどんな問題？&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;シェルあるあるではありますが&lt;/strong&gt; 、実際にどんな問題なのか見ていきます。&lt;/p&gt;&#10;&lt;p&gt;まずは、ファイルを3つ作成します。それぞれ以下の名前とします。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;hello1.txt&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;hello 2.txt&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;hello 3.txt&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch &lt;span class="s2"&gt;&amp;#34;hello1.txt&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch &lt;span class="s2"&gt;&amp;#34;hello 2.txt&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch &lt;span class="s2"&gt;&amp;#34;hello 3.txt&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで &lt;code&gt;find&lt;/code&gt; コマンドを使ってファイルの一覧を &lt;code&gt;xargs&lt;/code&gt; に渡して &lt;code&gt;echo&lt;/code&gt; を実行させてみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;-n 1&lt;/code&gt; は標準入力の内容を1つずつ処理するオプションです。&lt;/p&gt;</description></item><item><title>TerraformでGCPのPub/Subを作成する②-Pub/Sub の作成</title><link>https://genzouw.com/entry/2021/03/13/080051/2453/</link><pubDate>Sat, 13 Mar 2021 08:00:51 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/13/080051/2453/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2021/03/12/080016/2447/"&gt;Terraform で GCP の Pub/Sub を作成する ①-Terraform をインストール&lt;/a&gt; からの続きです。&lt;/p&gt;&#10;&lt;p&gt;前回のエントリでは、 &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt; を MacBookPro にインストールするところまでを行いました。&#10;僕の MacBookPro では、インストール時にエラーが多数発生して解決までにいくつもの工程を踏む必要がありました。&lt;/p&gt;&#10;&lt;p&gt;今回のエントリでは、 &lt;strong&gt;GCP&lt;/strong&gt; 上に &lt;strong&gt;Pub/Sub&lt;/strong&gt; の　&lt;strong&gt;Topic(トピック)&lt;/strong&gt; と &lt;strong&gt;Subscription(サブスクリプション)&lt;/strong&gt; を構築していきます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;用語が不明な方は以下を参照ください。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2021/02/09/184018/2167/"&gt;Google Cloud Pub/Sub について学習中（非同期メッセージングを図示してみました） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2021/02/10/080020/2179/"&gt;Google Cloud Pub/Sub の登場人物と役割を整理してみました | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ terraform -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Terraform v0.14.8&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="事前準備前提条件"&gt;事前準備、前提条件&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;gcloud auth login&lt;/code&gt; 済みであること&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;gcloud&lt;/code&gt; コマンドを実行して &lt;strong&gt;GCP&lt;/strong&gt; プロジェクト内に &lt;strong&gt;Pub/Sub&lt;/strong&gt; リソースを作成する権限を持っていること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;em&gt;今回は権限ではまりたくないため、GCP プロジェクト内に登録されている自分の権限を利用します。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>TerraformでGCPのPub/Subを作成する①-Terraformをインストール</title><link>https://genzouw.com/entry/2021/03/12/080016/2447/</link><pubDate>Fri, 12 Mar 2021 08:00:16 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/12/080016/2447/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今まで GCP のリソースをシェルスクリプトで作成していましたが、いい加減クラウド環境構築のデファクトスタンダードである &lt;strong&gt;&lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt;&lt;/strong&gt; に移行しようと思っていました。&lt;/p&gt;&#10;&lt;p&gt;時間ができたので、ようやく重い腰をあげました。&lt;/p&gt;&#10;&lt;p&gt;とはいえ、想定外に時間がかかってしまったので、今日は Terraform を自分の MacBookPro にインストールするところまでにしておきます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Homebrew 3.0.5-12-g94431ce&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Homebrew/homebrew-core &lt;span class="o"&gt;(&lt;/span&gt;git revision e6ce0b2835&lt;span class="p"&gt;;&lt;/span&gt; last commit 2021-03-10&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Homebrew/homebrew-cask &lt;span class="o"&gt;(&lt;/span&gt;git revision cdab18c620&lt;span class="p"&gt;;&lt;/span&gt; last commit 2021-03-10&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="terraform-ってなに"&gt;Terraform ってなに？&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://www.terraform.io/"&gt;Terraform by HashiCorp&lt;/a&gt; から抜粋します （ 2021-03-10 現在 ）。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Terraform is an open-source infrastructure as code software tool&#10;that provides a consistent CLI workflow to manage hundreds of cloud services.&#10;Terraform codifies cloud APIs into declarative configuration files.&lt;/p&gt;</description></item><item><title>Dockerイメージのうちlatestタグがついているものをすべて最新に更新する</title><link>https://genzouw.com/entry/2021/03/11/080004/2445/</link><pubDate>Thu, 11 Mar 2021 08:00:04 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/11/080004/2445/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; イメージを取得する際にタグを指定しなかった場合には &lt;strong&gt;latest&lt;/strong&gt; タグが自動的に利用されます。&lt;/p&gt;&#10;&lt;p&gt;例えば以下の二つのコマンドは両方とも同じ意味を示します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# latestタグなし&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker pull bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# latestタグ有り&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker pull bash:latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;latest&lt;/strong&gt; タグ付きのイメージは &lt;strong&gt;Docker&lt;/strong&gt; のイメージリポジトリ(DockerHub が利用されることが多いですね)が更新されてもローカルのキャッシュが利用されるため差異が発生する可能性があります。&lt;/p&gt;&#10;&lt;p&gt;これを避けるためにローカル PC 内にある &lt;strong&gt;Docker&lt;/strong&gt; イメージを、&lt;strong&gt;Docker&lt;/strong&gt; Repository の最新のイメージから一括で更新するためのコマンドを紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前提条件"&gt;前提条件&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;作業用 PC で &lt;code&gt;docker&lt;/code&gt; コマンドが利用できること。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="イメージ一括更新コマンド"&gt;イメージ一括更新コマンド&lt;/h2&gt;&#10;&lt;p&gt;以下のコマンドを作業用 PC で実行するだけです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker images --format &lt;span class="s2"&gt;&amp;#34;{{.Repository}}:{{.Tag}}&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;:latest&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs -L1 docker pull&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ローカル PC にある Docker イメージの中から &lt;strong&gt;latest&lt;/strong&gt; というタグが付与されているものを一覧取得してひとつずつ &lt;code&gt;docker pull&lt;/code&gt; します。&lt;/p&gt;</description></item><item><title>mapfile(readarray)コマンドを使ってファイルや標準入力の内容を配列変数に読み込む</title><link>https://genzouw.com/entry/2021/03/10/080041/2441/</link><pubDate>Wed, 10 Mar 2021 08:00:41 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/10/080041/2441/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/02/06/081505/765/#toc_id_7"&gt;Bash シェルスクリプトで標準入力からの情報を取り扱う &lt;code&gt;read&lt;/code&gt; コマンドと &lt;code&gt;declare&lt;/code&gt; コマンドを組み合わせると便利 | ゲンゾウ用ポストイット&lt;/a&gt; で取り上げましたが、 &lt;code&gt;read -a 変数名&lt;/code&gt; とすることで標準入力から文字列を読み込み &lt;strong&gt;空白で分割し変数に配列として代入することができます&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;read&lt;/span&gt; -a VARS &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1 3 5&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VARS&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VARS&lt;/span&gt;&lt;span class="p"&gt;[1]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VARS&lt;/span&gt;&lt;span class="p"&gt;[2]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;read -a&lt;/code&gt; は &amp;ldquo;列で区切って変数に入れる&amp;rdquo; ためのコマンドです。&lt;/p&gt;&#10;&lt;p&gt;今回は &amp;ldquo;行で区切って変数に入れる&amp;rdquo; ためのコマンドである &lt;code&gt;mapfiles&lt;/code&gt; ( エイリアスとして &lt;code&gt;readarray&lt;/code&gt; が用意されている ) を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mapfile-コマンドの使い方"&gt;&lt;code&gt;mapfile&lt;/code&gt; コマンドの使い方&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;mapfile&lt;/code&gt; コマンドの使い方を見ていきますが、 挙動を確認するため適当なデータファイル &lt;strong&gt;data.txt&lt;/strong&gt; を作成しておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs -n &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &amp;gt; data.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat data.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt; &lt;span class="m"&gt;9&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt; &lt;span class="m"&gt;13&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="m"&gt;17&lt;/span&gt; &lt;span class="m"&gt;18&lt;/span&gt; &lt;span class="m"&gt;19&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="配列変数に代入"&gt;配列変数に代入&lt;/h3&gt;&#10;&lt;p&gt;まずはオプション無しで使う場合について。&lt;/p&gt;</description></item><item><title>シェルスクリプトで配列変数を参照する際は "${変数名}" と記述する癖をつけたほうが良い</title><link>https://genzouw.com/entry/2021/03/09/192644/2438/</link><pubDate>Tue, 09 Mar 2021 19:26:44 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/09/192644/2438/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;チームメンバがシェルスクリプトを書いていました。&#10;変数を参照する際のちょっとした不備ではまりました。&lt;/p&gt;&#10;&lt;p&gt;変数をダブルクォートで囲んでいなかったことが原因だったのですが、どんなケースだったかを紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="配列変数を利用してループ処理を行うケースで問題が発生"&gt;配列変数を利用してループ処理を行うケースで問題が発生&lt;/h2&gt;&#10;&lt;p&gt;問題が発生していたのは配列変数を受け取り、ループ処理するロジックでした。&lt;/p&gt;&#10;&lt;p&gt;ここでは &lt;strong&gt;test.sh&lt;/strong&gt; というファイル名で保存されていたとしましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LIST&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;111&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;22 22 22&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;333&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; TXT in &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LIST&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ***実際にはこの部分にロジックが記述されていました***&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TXT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;想定では、このループ処理は 3 行の文字列を出力する想定でした。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;111&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;22 22 22&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;333&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;ところが実行結果は以下のようになりました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./test.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;111&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;22&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;22&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;22&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;333&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これは &lt;code&gt;LIST&lt;/code&gt; という配列変数の参照の仕方に問題があったためです。&lt;/p&gt;&#10;&lt;h2 id="正しく-list-で参照する"&gt;正しく &lt;code&gt;&amp;quot;${LIST[@]}&amp;quot;&lt;/code&gt; で参照する&lt;/h2&gt;&#10;&lt;p&gt;先の &lt;strong&gt;test.sh&lt;/strong&gt; スクリプトは以下のように修正すれば想定通りの挙動をします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LIST&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;111&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;22 22 22&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;333&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# **先ほどとの違いはここ！ダブルクォートで囲んでいます。**&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; TXT in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LIST&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TXT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は以下のようになります。&lt;/p&gt;</description></item><item><title>jqコマンドを使って改行エスケープ文字列を含むワンライナーを改行させて出力する</title><link>https://genzouw.com/entry/2021/03/09/154458/2436/</link><pubDate>Tue, 09 Mar 2021 15:44:58 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/09/154458/2436/</guid><description>&lt;p&gt;最近はデータファイルやロギングデータとして JSON フォーマットが一般化しました。&#10;僕のまだ若い頃にはタブ区切りカンマ区切りといたほうが後が一般的だったのが懐かしいです。（こんな発言していると老害なんて言われてしまいますね。）&lt;/p&gt;&#10;&lt;p&gt;さてそんな JSON フォーマット。スキーマレスでさっとアプリケーションを作る際のデータフォーマットとして非常に便利。&#10;しかし、複数行にまたがる文字列を格納する際は改行を &lt;strong&gt;“¥n”&lt;/strong&gt; (Macだと &lt;strong&gt;&amp;quot;\n&amp;quot;&lt;/strong&gt; ) のような改行エスケープシーケンス使って変換し清掃内に格納します。当然のことながら人間には非常に読みにくいです。&lt;/p&gt;&#10;&lt;p&gt;チームメンバから &lt;code&gt;jq&lt;/code&gt; コマンドを使って JSON のデータをパースして確認する際に、見やすくする方法がないか質問されました。&lt;/p&gt;&#10;&lt;p&gt;お答えしたいと思います。&lt;/p&gt;&#10;&lt;h2 id="特にオプションを指定せずに-jq-コマンドを使った場合"&gt;特にオプションを指定せずに &lt;code&gt;jq&lt;/code&gt; コマンドを使った場合&lt;/h2&gt;&#10;&lt;p&gt;まずはサンプルの JSON データを用意します&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; test.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;subject&amp;#34;: &amp;#34;sample json data&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;body&amp;#34;: &amp;#34;# Greetings\n\n## English\n\nhello world!\n\n## Japanese\n\nこんにちわ世界！&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat test.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;subject&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;sample json data&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;body&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;# Greetings\n\n## English\n\nhello world!\n\n## Japanese\n\nこんにちわ世界！&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に、&lt;code&gt;jq&lt;/code&gt;コマンドを使って作成した &lt;strong&gt;test.json&lt;/strong&gt; ファイルの subject、body 属性を出力してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat test.json &lt;span class="p"&gt;|&lt;/span&gt; jq .subject&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;sample json data&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat test.json &lt;span class="p"&gt;|&lt;/span&gt; jq .body&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;# Greetings\n\n## English\n\nhello world!\n\n## Japanese\n\nこんにちわ世界！&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;subject 属性はもともと改行が含まれていないため見やすいです。&#10;打って変わって body 属性は改行が複数含まれているため元々どんなテキストだったのかはぱっとみ分かりません。&lt;/p&gt;</description></item><item><title>gitやsshコマンドを使うと "dyld: Library not loaded: /usr/local/opt/ldns/lib/libldns.3.dylib" というエラーが発生したので対処しました。</title><link>https://genzouw.com/entry/2021/03/08/075137/2409/</link><pubDate>Mon, 08 Mar 2021 07:51:37 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/08/075137/2409/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;おはようございます。&lt;/p&gt;&#10;&lt;p&gt;僕の毎日の業務はすべてのリポジトリをシェルスクリプトで &lt;code&gt;git fetch&lt;/code&gt; して回ることから始まります。&lt;/p&gt;&#10;&lt;p&gt;今朝もルーチンを実行したところ、 &lt;code&gt;dyld: Library not loaded: /usr/local/opt/ldns/lib/libldns.3.dylib&lt;/code&gt; というエラーメッセージが表示され &lt;code&gt;git fetch&lt;/code&gt; ができませんでした。&lt;code&gt;ssh&lt;/code&gt; コマンドも利用できないようです。&lt;/p&gt;&#10;&lt;p&gt;対処できたので共有します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.29.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ssh -V&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenSSH_8.5p1, OpenSSL 1.1.1j &lt;span class="m"&gt;16&lt;/span&gt; Feb &lt;span class="m"&gt;2021&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Homebrew 3.0.4-50-ga930e2b&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Homebrew/homebrew-core &lt;span class="o"&gt;(&lt;/span&gt;git revision f7c3c5df5a&lt;span class="p"&gt;;&lt;/span&gt; last commit 2021-03-06&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Homebrew/homebrew-cask &lt;span class="o"&gt;(&lt;/span&gt;git revision 580e78f8f1&lt;span class="p"&gt;;&lt;/span&gt; last commit 2021-03-06&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="発生していた現象"&gt;発生していた現象&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;git fetch&lt;/code&gt; や &lt;code&gt;ssh&lt;/code&gt; コマンドを実行すると、エラーが発生。&lt;/p&gt;</description></item><item><title>シェルでshufコマンドを使って入力情報をいろんな方法でシャッフルしてみる(組み合わせにも使える)</title><link>https://genzouw.com/entry/2021/03/07/082456/2405/</link><pubDate>Sun, 07 Mar 2021 08:24:56 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/07/082456/2405/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;過去のブログエントリで何度か取り上げていた &lt;code&gt;shuf&lt;/code&gt; コマンドですが、 オプションを組み合わせることでいろいろなシャッフル方法を実現できるので紹介します。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;ちなみに &lt;code&gt;shuf&lt;/code&gt; コマンドを取り上げていた過去のエントリは以下になります。参考にどうぞ。&lt;/em&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2012/12/10/131646/147/"&gt;Bashシェルスクリプトでランダムな数列を生成する２つの方法&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2014/07/10/014035/19/#toc_id_4"&gt;Bashシェルスクリプトで1〜100までの数からランダムに10個を重複なしで取り出す方法&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2021/03/cardgame_syakapachi-275x300.png" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="shufコマンドとは"&gt;shufコマンドとは&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;標準入力&lt;/strong&gt; あるいは &lt;strong&gt;引数に指定したファイル&lt;/strong&gt; の各行を &lt;strong&gt;入れ替え（シャッフル)&lt;/strong&gt; して、出力するコマンドです。&lt;/p&gt;&#10;&lt;p&gt;「標準入力」、「引数でファイル指定」のそれぞれの方法で &lt;code&gt;shuf&lt;/code&gt; コマンドを使った後、 便利なオプションについて触れてみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="標準入力から読み込ませる"&gt;標準入力から読み込ませる&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;標準入力&lt;/strong&gt; から情報を読み込ませる場合、パイプを使って &lt;code&gt;shuf&lt;/code&gt; コマンドに引き渡すのがほとんどです。&lt;/p&gt;&#10;&lt;p&gt;1から5までの数値を &lt;code&gt;shuf&lt;/code&gt; コマンドに食わせて、各行を入れかせてみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="c1"&gt;# seqコマンドを使うことで指定した数値を列挙することができます&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="c1"&gt;# seqコマンドの出力内容をshufコマンドに渡します。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; shuf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="c1"&gt;# ２回目の実行。1回目と異なる出力となっていることがわかります。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; shuf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ファイルを指定して読み込ませる"&gt;ファイルを指定して読み込ませる&lt;/h2&gt;&#10;&lt;p&gt;すでにシャッフルしたいデータファイルが存在する場合には、そちらを利用することも可能です。&lt;/p&gt;</description></item><item><title>Slackを起動したら"Slack Connect"という新しい機能のメニューが追加されていたので調べてみた</title><link>https://genzouw.com/entry/2021/03/05/075757/2401/</link><pubDate>Fri, 05 Mar 2021 07:57:57 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/05/075757/2401/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;明日も朝から仕事を開始しようと机に座って Slack を開いたところ、 &lt;strong&gt;Slack Connect&lt;/strong&gt; という新しいメニューが表示されていました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2021/03/Slack-pj_harutaka_dev-ZENKIGEN-2-new-items-2021-03-05-07-12-25-2021-03-05-07-56-04.jpg" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;新しいサービスですが、どんな機能かわからなかったので調べてみました。&lt;/p&gt;&#10;&lt;h2 id="自分のチームの-ワークスペース-と相手のチームの-ワークスペース-をつなげる機能"&gt;自分のチームの &lt;strong&gt;ワークスペース&lt;/strong&gt; と相手のチームの &lt;strong&gt;ワークスペース&lt;/strong&gt; をつなげる機能&lt;/h2&gt;&#10;&lt;p&gt;チームで仕事をしている場合、Slack の &lt;strong&gt;ワークスペース&lt;/strong&gt; はそのチーム内のメンバーしか入れないことが多いと思います。&#10;ビジネス上、オープンにできない会話内容が多いためです。&lt;/p&gt;&#10;&lt;p&gt;このプライベートなワークスペースという特性には問題があって、業務提供している他会社の方々と密に連携したい場合には面倒です。&#10;もっと密に連携しあって開発力、製品力、スピードUPすることが求められています。&lt;/p&gt;&#10;&lt;p&gt;対処法としてプライベートなチャンネルを作成して、そのチャンネルにだけパートナーチームの方々を招待する、という方法を取っていました。&lt;/p&gt;&#10;&lt;p&gt;チャンネルがひとつだけになれば問題ないのですが、このようなチャンネル増えてくると毎回この作業が面倒。&#10;また、このチャンネルはどちらか一方のチームのワークスペース上にしか存在しないので、他方のチームは自分のワークスペース、他のワークスペースをいったりきたりしなければなりません。&lt;/p&gt;&#10;&lt;p&gt;これを解決するための仕組みとして、複数のワークスペースをコネクトするための機能が &lt;strong&gt;Slack Connect&lt;/strong&gt; だと僕は解釈しました。&lt;/p&gt;&#10;&lt;h2 id="slack-connect-におけるダイレクトメッセージの扱いは"&gt;「Slack Connect」 におけるダイレクトメッセージの扱いは？&lt;/h2&gt;&#10;&lt;p&gt;チャンネルを作成しなくてもダイレクトメッセージを送信することはできるような内容が書かれています。&#10;&lt;em&gt;試していないのでなんともです。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="slack-connect-を始める方法"&gt;「Slack Connect」 を始める方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Slack Connect&lt;/strong&gt; を始めるための手続きですか、&lt;strong&gt;Slack Connect&lt;/strong&gt; メニューをクリックしたら表示されたダイアログにかかれていました。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&amp;ldquo;チャネルを作成する&amp;rdquo; ケースについてのようです。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h3 id="1-チャンネルを作成する"&gt;1. チャンネルを作成する&lt;/h3&gt;&#10;&lt;p&gt;まずはサイドバーのチャンネルの横にある+ボタンをクリックし、特定の人と会話するためのチャンネルを作成します。&lt;/p&gt;&#10;&lt;h3 id="2-招待を送る"&gt;2. 招待を送る&lt;/h3&gt;&#10;&lt;p&gt;Slackから相手チームに招待を送ります。招待はメールアドレスを指定します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1ytTQyiQb-xiZTyUND7uTmcBMWXw8Hqg_" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="3-招待者を待つ"&gt;3. 招待者を待つ&lt;/h3&gt;&#10;&lt;p&gt;相手チームがメールに記載されているリンクをクリックすると Slack に移動して招待を承認できます。&lt;/p&gt;&#10;&lt;h3 id="4-チャンネルの管理は双方のチームで設定可能"&gt;4. チャンネルの管理は双方のチームで設定可能&lt;/h3&gt;&#10;&lt;p&gt;チャンネルの拒否、許可は双方のチームで実施可能なようです。&#10;メンバ管理も双方のチームのワークスペース管理者が実施できるのでしょう。&lt;/p&gt;&#10;&lt;h2 id="slack-connect-はtwitter-上では不評"&gt;「Slack Connect」 はTwitter 上では不評？&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Slack Connect&lt;/strong&gt; は Twitter 上では不評のようです。&lt;/p&gt;&#10;&lt;p&gt;早くも「Slack Connect 消す」「Slack Connect 下に移動」といったキーワードで検索されていたりすつぶやかれたりしています。&lt;/p&gt;</description></item><item><title>Linux シェル上でgrepコマンドを使ってOR条件検索する</title><link>https://genzouw.com/entry/2021/03/04/080012/2398/</link><pubDate>Thu, 04 Mar 2021 08:00:12 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/04/080012/2398/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Linux のシェル操作用シェルスクリプト上で &lt;code&gt;grep&lt;/code&gt; コマンドを使って検索することはよくあります。&#10;多くの場合は &lt;code&gt;grep&lt;/code&gt; コマンドでキーワードをひとつだけ指定して検索しますが、検索キーワードを複数指定し OR 条件検索をしたい場合はどのようにするのでしょうか？&lt;/p&gt;&#10;&lt;p&gt;OR 条件検索する方法はいくつかあるためご紹介いたします。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="動作確認を行うため簡単なテキストファイルを用意"&gt;動作確認を行うため簡単なテキストファイルを用意&lt;/h2&gt;&#10;&lt;p&gt;動作を確認するため、&lt;code&gt;grep&lt;/code&gt; コマンドで絞り込みを行う対象となるテキストファイルを用意します。&#10;どんなデータでも良いのですが動物の名前でも列挙しておくことにします。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;テキストファイルはこの先の説明で利用します。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;animals.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;dog&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;rabbit&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;cow&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;horse&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;wolf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;kangaroo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;fox&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;giraffe&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -l animals.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;47&lt;/span&gt; Mar &lt;span class="m"&gt;3&lt;/span&gt; 11:18 animals.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="方法-1--e-オプションを指定する"&gt;方法 1. &lt;code&gt;-e&lt;/code&gt; オプションを指定する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;-e &amp;lt;キーワード&amp;gt;&lt;/code&gt; オプションを使い、キーワードを複数指定して &lt;strong&gt;OR 条件検索&lt;/strong&gt; を行うことが可能です。&#10;&lt;code&gt;-e&lt;/code&gt; オプションは複数指定可能です。&lt;/p&gt;&#10;&lt;p&gt;ここでは、 &lt;strong&gt;rabbit&lt;/strong&gt; 、 &lt;strong&gt;horse&lt;/strong&gt; 、 &lt;strong&gt;wolf&lt;/strong&gt; の 3 つを検索してみます。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでcsvの行と列を入れ替えるために csvtool を使う</title><link>https://genzouw.com/entry/2021/03/03/080057/2390/</link><pubDate>Wed, 03 Mar 2021 08:00:57 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/03/080057/2390/</guid><description>&lt;p&gt;シェルスクリプトで csv の行と列を入れ替える必要がありました。&lt;/p&gt;&#10;&lt;p&gt;Web を探してみると &lt;code&gt;awk&lt;/code&gt; を使って変換する例がいくつか見つかりましたが、&#10;もっと簡単に実現する方法はないか調べてみたところ、 &lt;code&gt;csvtool&lt;/code&gt; という面白そうなツールがありました。&lt;/p&gt;&#10;&lt;p&gt;今日はこのツールを紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.17&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;まずは &lt;code&gt;csvtool&lt;/code&gt; をインストールします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ apt update -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ apt install csvtool -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ csvtool --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;csvtool - Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; 2005-2006 Richard W.M. Jones, Merjis Ltd.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; 2007- Richard W.M. Jones &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; Christophe Troestler&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;簡単にインストールできました。&lt;/p&gt;&#10;&lt;h2 id="csvtool-の使い方"&gt;csvtool の使い方&lt;/h2&gt;&#10;&lt;p&gt;使い方を説明するために、簡単な csv ファイルを作成します。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで終了前に後始末をさせたい時はtrapコマンドを活用しよう</title><link>https://genzouw.com/entry/2021/03/02/080000/2381/</link><pubDate>Tue, 02 Mar 2021 08:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/02/080000/2381/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bash シェルスクリプトの終了時に、 &lt;strong&gt;必ず後処理をさせたい&lt;/strong&gt; 場合があります。&#10;例えばスクリプト内で作成した &lt;strong&gt;一時ファイルを削除する&lt;/strong&gt; といった場合です。&lt;/p&gt;&#10;&lt;p&gt;そんな時に使えるコマンドとして、Bash ビルトインコマンドである &lt;code&gt;trap&lt;/code&gt; コマンドがあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2021/03/wana_money_man-300x245.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;trap&lt;/code&gt; コマンドを使ってスクリプト終了前に後処理をさせる方法について紹介してみたいと思います。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;関連記事 : &lt;a href="https://genzouw.com/entry/2019/01/25/084559/639/"&gt;Linux サーバからログアウトしたタイミングで処理を実行させる方法 ( 例えばメールを飛ばす ) | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="trap-コマンドの使い方"&gt;&lt;code&gt;trap&lt;/code&gt; コマンドの使い方&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;trap&lt;/code&gt; コマンドの主な引数は以下の 2 つになります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;実行させたいシェルスクリプトコマンド&lt;/li&gt;&#10;&lt;li&gt;トラップを仕掛けたい &lt;strong&gt;シグナル&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;突然出てきましたが &lt;strong&gt;シグナル&lt;/strong&gt; とは何でしょう？&lt;/p&gt;&#10;&lt;h2 id="シグナルとは"&gt;シグナルとは？&lt;/h2&gt;&#10;&lt;p&gt;シグナルとは、 &lt;strong&gt;プロセスとプロセスの間で通信を行う際に使用される信号&lt;/strong&gt; のことです。&lt;/p&gt;&#10;&lt;p&gt;ターミナル上で実行中のコマンドを &lt;code&gt;{ctrl}&lt;/code&gt; + &lt;code&gt;{C}&lt;/code&gt; で停止させた、といった場合を例に上げましょう。&#10;この場合も「一方のプロセス」に対して「他方のプロセス」がシグナルを送った結果、実行中のコマンドが停止されます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;一方&lt;/strong&gt; は実行中のコマンドプロセス&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;他方&lt;/strong&gt; はユーザーにより実行されるショートカットキー操作 ( &lt;code&gt;{ctrl}&lt;/code&gt; + &lt;code&gt;{C}&lt;/code&gt;)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;このように、シグナルを受け取ったプロセスの状態は、通常の処理実行から変化します。&lt;/p&gt;&#10;&lt;p&gt;文面だけではわかりにくいため、 &lt;code&gt;trap&lt;/code&gt; コマンドを使った具体的な例をみながらシグナルについても理解していきましょう。&lt;/p&gt;&#10;&lt;h2 id="trap-コマンドでシグナルをトラップする"&gt;&lt;code&gt;trap&lt;/code&gt; コマンドでシグナルをトラップする&lt;/h2&gt;&#10;&lt;p&gt;まずは以下のような簡単なスクリプトを作成します。&lt;/p&gt;&#10;&lt;h3 id="testsh"&gt;&lt;code&gt;test.sh&lt;/code&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;trap&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;echo &amp;#34;trap SIGINT&amp;#34;&amp;#39;&lt;/span&gt; SIGINT&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;trap&lt;/code&gt; コマンドは 2 つの引数を受け取っています。&#10;第 2 引数で指定した &lt;strong&gt;SIGINT&lt;/strong&gt; ( &lt;strong&gt;後述&lt;/strong&gt; ) というシグナルをトラップします。&#10;トラップに成功すると、第 1 引数のコマンドを実行します。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで2つの日付の間の日数を求める方法</title><link>https://genzouw.com/entry/2021/03/01/111616/2372/</link><pubDate>Mon, 01 Mar 2021 11:16:16 +0900</pubDate><guid>https://genzouw.com/entry/2021/03/01/111616/2372/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;つい先日、今年の 1 月 1 日から今日まででどのぐらいの日数が経過した日を算出したいと思いました。&lt;/p&gt;&#10;&lt;p&gt;例えば 1 月 1 日から 1 月 10 日までの間の日数は &lt;strong&gt;9 日&lt;/strong&gt; になります。&lt;/p&gt;&#10;&lt;p&gt;シェルスクリプトで 2 つの日付の間の日数を算出する方法を紹介したいと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;ちなみに間の全日付を一覧表示したい場合の方法については、過去のエントリをご参考ください。&lt;/em&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/07/01/083003/1637/"&gt;シェルスクリプトで開始日から終了日までの日付を YYYYMMDD 形式で一覧出力する | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="シェルスクリプトで日付から-unixtimeunix-時間を取得する"&gt;シェルスクリプトで日付から UnixTime(Unix 時間)を取得する&lt;/h2&gt;&#10;&lt;p&gt;2 つの日付の間の時間を算出するには UnixTime を利用します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://ja.wikipedia.org/wiki/UNIX%E6%99%82%E9%96%93"&gt;UNIX 時間 - Wikipedia&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;すなわち協定世界時 (UTC) での 1970 年 1 月 1 日午前 0 時 0 分 0 秒から形式的な経過秒数（すなわち、実質的な経過秒数から、その間に挿入された閏秒を引き、削除された閏秒を加えたもの）として表される。&lt;/p&gt;</description></item><item><title>"less +F" は "tail -f" の上位互換機能として利用できる</title><link>https://genzouw.com/entry/2021/02/24/222852/2347/</link><pubDate>Wed, 24 Feb 2021 22:28:52 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/24/222852/2347/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;例えば、ログファイルから最新の情報を閲覧するための方法として &lt;code&gt;tail&lt;/code&gt; コマンドが利用できます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;tail -f&lt;/code&gt; のようにオプションを指定することでログファイルを監視し、コンテンツが追加されたときに自動的にターミナル上に出力させることができます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;tail&lt;/code&gt; コマンドを使わず、 &lt;code&gt;less&lt;/code&gt; コマンドでも同じような機能が提供されており、若干高機能です。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;less&lt;/code&gt; コマンドの意外と知られていない機能を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ less --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;less &lt;span class="m"&gt;458&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;POSIX regular expressions&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; 1984-2012 Mark Nudelman&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="テキストファイルを-less-コマンドで監視してみる"&gt;テキストファイルを &lt;code&gt;less&lt;/code&gt; コマンドで監視してみる&lt;/h2&gt;&#10;&lt;p&gt;早速、適当なファイルを作成し、 &lt;code&gt;less&lt;/code&gt; コマンドで開いてみます。&lt;/p&gt;&#10;&lt;p&gt;開く際に &lt;code&gt;-F&lt;/code&gt; というオプションを付与しておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# まずはファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &amp;gt; test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイルを監視します。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ less +F test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで別のターミナルを開き、ファイル末尾にコンテンツを追記します。&lt;/p&gt;</description></item><item><title>BashシェルやZshシェルでスターウォーズが見られる</title><link>https://genzouw.com/entry/2021/02/22/213331/2282/</link><pubDate>Mon, 22 Feb 2021 21:33:31 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/22/213331/2282/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今日はネタ記事ということで。&lt;/p&gt;&#10;&lt;p&gt;昨年の年末から、長男を囲んで家族でスターウォーズ9作をみました。( &lt;strong&gt;長男がハマりました。&lt;/strong&gt; )&#10;毎週土曜か日曜のいずれかをスターウォーズにあてて、少しずつ見ていました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2021/02/kandou_movie_eigakan-300x254.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;そんなわけで我が家では「オビワンがかっこいい！」「ダースベーダーがかっこいい！」「ベン・ソロはちょっとなぁ」など各自の意見が飛び交い楽しく会話していました。「ヨーダ」はかわいいそうです。&lt;/p&gt;&#10;&lt;p&gt;さて、そんなスターウォーズ熱の中で見つけたとあるコマンドについて紹介します。&lt;/p&gt;&#10;&lt;div style="display: flex;"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B082N332HB&amp;linkId=ef0cf04d90b08c59fb0ae61efd31ba9c"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B00O7CI3CO&amp;linkId=5659aad70995507ff47b0d5a69ee6d6c"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B07NDB4Q7S&amp;linkId=b1cca128c8f466f90e2300a2b0664aad"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bashでスターウォーズが見れます"&gt;Bashでスターウォーズが見れます。&lt;/h2&gt;&#10;&lt;p&gt;なんと、暗黒面の力（Bashの黒いコンソール画面）を使えば、スター・ウォーズを見ることができます。&#10;暗黒面に落ちるのはいとも簡単です。&lt;/p&gt;&#10;&lt;h2 id="telnet-towelblinkenlightsnl"&gt;&lt;code&gt;telnet towel.blinkenlights.nl&lt;/code&gt;&lt;/h2&gt;&#10;&lt;p&gt;ただ、以下のコマンドを実行するだけです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ telnet towel.blinkenlights.nl&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;早速実行してみましょう。&lt;/p&gt;&#10;&lt;h2 id="スクリーンショット"&gt;スクリーンショット&lt;/h2&gt;&#10;&lt;p&gt;実行すると以下のようなAAの動画を見ることができます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;本当に長い時間動画（？）が進んでいくので、僕は途中で見るのをやめました。&lt;/strong&gt;&#10;( &lt;em&gt;だって、やることあるんだもの。&lt;/em&gt; )&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1x5gZ3GmQnz5wGuiLOnagLH6EUJzCCh9u" alt=""&gt;&#10;&lt;img src="https://docs.google.com/uc?id=1oDIId1FQm6EvESVYl7VXWYMv51rVatYa" alt=""&gt;&#10;&lt;img src="https://docs.google.com/uc?id=1lyu5yRrzq_clfxKY-CJIj1o-3ljypE0A" alt=""&gt;&#10;&lt;img src="https://docs.google.com/uc?id=1Bz9CiJB5dusNatz_Jv98dDH0UkWcxWYS" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="一度暗黒面に落ちると抜け出せない"&gt;一度「暗黒面」に落ちると抜け出せない&lt;/h2&gt;&#10;&lt;p&gt;一度「暗黒面」に落ちると、なかなか抜け出せません。&lt;/p&gt;&#10;&lt;p&gt;なんとしても強い心で抜け出すためには方法は唯一つ。&#10;以下の手順を踏みます。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;ctrl&lt;/code&gt; + &lt;code&gt;]&lt;/code&gt; を押す。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;quit&lt;/code&gt; コマンドを実行。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;意外にもエピソード4、エピソード５，エピソード6が面白かったです。&lt;/p&gt;&#10;&lt;p&gt;僕は「オビワン・ケノービ」派です。&lt;/p&gt;&#10;&lt;h2 id="参考"&gt;参考&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://www.commandlinefu.com/commands/view/1713/watch-star-wars-via-telnet"&gt;Watch Star Wars via telnet Using telnet&lt;/a&gt;&lt;/p&gt;</description></item><item><title>AndroidカメラでOCIで読み取った文字列をパソコンのクリップボードに送る機能が便利</title><link>https://genzouw.com/entry/2021/02/19/203316/2276/</link><pubDate>Fri, 19 Feb 2021 20:33:16 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/19/203316/2276/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;うちの子供たちはフリック入力がとても早いです。&#10;本当かどうか分かりませんが大学生でもスマートフォンで論文を書く方もいらっしゃるそうです。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2021/02/smartphone_woman_laugh-225x300.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;うってかわって初老な僕はスマートフォンのフリック入力が非常に遅いです。&#10;スマートフォンへの文字を見る雲音声入力が圧倒的に楽で便利だと思っています。&#10;Androidスマートフォンを使っていますが、カメラの文字読み取り精度も高く気に入っています。&lt;/p&gt;&#10;&lt;p&gt;さて今日はプログラミングの話ではありません。&#10;&lt;strong&gt;Androidスマートフォンの文字列読み込み後にクリップボードに送信する機能が非常に便利だった&lt;/strong&gt; という話です。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1zFQZt23fLD7iqnIQI0ti_YFGuZGYmnMn" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="androidスマートフォンpc"&gt;Androidスマートフォン、PC&lt;/h2&gt;&#10;&lt;p&gt;僕の利用しているAndroidスマートフォン、PCはそれぞれ以下の通りです。&lt;/p&gt;&#10;&lt;h3 id="androidスマートフォン"&gt;Androidスマートフォン&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Google Pixel5 128GB&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a target="_blank" href="https://www.amazon.co.jp/gp/product/B08LK8XHVN/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B08LK8XHVN&amp;linkCode=as2&amp;tag=verywealthyda-22&amp;linkId=603727c91c02db8c70286314e5e12b86" rel="noopener"&gt;&lt;img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B08LK8XHVN&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL320_&amp;tag=verywealthyda-22" &gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="pc"&gt;PC&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;MacBook Pro&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a target="_blank" href="https://www.amazon.co.jp/gp/product/B081GFF19Y/ref=as_li_tl?ie=UTF8&amp;camp=247&amp;creative=1211&amp;creativeASIN=B081GFF19Y&amp;linkCode=as2&amp;tag=verywealthyda-22&amp;linkId=412bc632cf8e69edb9f743db1ad1de3f" rel="noopener"&gt;&lt;img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;MarketPlace=JP&amp;ASIN=B081GFF19Y&amp;ServiceVersion=20070822&amp;ID=AsinImage&amp;WS=1&amp;Format=_SL375_&amp;tag=verywealthyda-22" &gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="androidカメラで文字列を読み取りパソコンのクリップボードに送る方法"&gt;Androidカメラで文字列を読み取り、パソコンのクリップボードに送る方法&lt;/h2&gt;&#10;&lt;p&gt;この方法は間違いなく公式に公開されているし、知っている方もたくさんいらっしゃるでしょうが、僕はたまたま見つけました。&lt;/p&gt;&#10;&lt;h3 id="1-androidスマートフォンでカメラを起動する"&gt;1. Androidスマートフォンでカメラを起動する&lt;/h3&gt;&#10;&lt;p&gt;まずはAndroidスマートフォンでカメラを起動します。&lt;/p&gt;&#10;&lt;h3 id="2-起動したカメラで文字列を読み取る"&gt;2. 起動したカメラで文字列を読み取る&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;今回は手書きの文字列を読み込んでみたいと思います。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;手書きで &lt;em&gt;ABdcefG&lt;/em&gt; と書いています。&lt;/p&gt;&#10;&lt;p&gt;文字列がカメラに映るようにしてスマートフォンのディスプレイを長押しタップます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1KvbpkqW-IaqSsmyZXah2Jhg7mJCI5dyJ" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="3-文字列の読み取られたことを確認する"&gt;3. 文字列の読み取られたことを確認する&lt;/h3&gt;&#10;&lt;p&gt;文字列が読み取られたことを確認します。&lt;/p&gt;&#10;&lt;p&gt;正しく読み取られていれば文字列の部分がハイライトされます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1RqFB-D-67S2hpBn8yKG2LFLXsC9dOmcV" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="4-文字列を選択する"&gt;4. 文字列を選択する&lt;/h3&gt;&#10;&lt;p&gt;ハイライトされた文字列を選択します。&lt;/p&gt;&#10;&lt;p&gt;正しく選択されれば、スクリーン下部に読み取られた文字列が表示されます。&lt;/p&gt;&#10;&lt;p&gt;同時にいくつかのメニューが表示され、 &lt;strong&gt;「パソコンにコピー」&lt;/strong&gt; という選択肢が見つかるはずです。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1HW7LcZ-pmfqF4qrVsgD0jbFSr3EnV5oJ" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="5-どのpcのクリップボードに送信するかを選択する"&gt;5. どのPCのクリップボードに送信するかを選択する&lt;/h3&gt;&#10;&lt;p&gt;どのPCのクリップボードに選択された文字列を送信するか選択します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1zja338NAm-wvuZsLMS8dNMlc5XHSaOrl" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="6-pcでクリップボードの内容を貼り付けてみる"&gt;6. PCでクリップボードの内容を貼り付けてみる&lt;/h3&gt;&#10;&lt;p&gt;正しく送信されたかどうか確認してみましょう。&lt;/p&gt;&#10;&lt;p&gt;先ほどスマートフォンで選択したPCでクリップボードの内容を貼り付けてみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=13eXBRVfly81ZGiOW_ZuxUr-lZ9ljhGtU" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;クリップボードの内容が正しく連携されたことがわかると思います。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;郵送物に書かれていた文字列をPCに送りたかったんですが、何とか良い方法ないか悩んでいた時に見つけました。&#10;非常に気に入りました。&lt;/p&gt;&#10;&lt;p&gt;Windowsでも同様の機能は利用できるのでしょうか？&lt;/p&gt;&#10;&lt;p&gt;Chromeはもはやブラウザの枠を超えていますね。&lt;/p&gt;</description></item><item><title>Githubリポジトリにコミットしたら、自動的に"Docker Hub"でDockerイメージを作成させる</title><link>https://genzouw.com/entry/2021/02/17/210458/2265/</link><pubDate>Wed, 17 Feb 2021 21:04:58 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/17/210458/2265/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;僕は &lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt; 上で Docker イメージをいくつも公開しています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://hub.docker.com/r/genzouw/mkr"&gt;genzouw/mkr&lt;/a&gt; : &lt;em&gt;mkr - Command Line Tool For Mackerel written in Go.&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://hub.docker.com/r/genzouw/gpg"&gt;genzouw/gpg&lt;/a&gt; : &lt;em&gt;Docker image that give gpg command.&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://hub.docker.com/r/genzouw/td"&gt;genzouw/td&lt;/a&gt; : &lt;em&gt;This is a Docker image wrapping the command line client tool td of&amp;quot; Treasure Data &amp;ldquo;. Ruby installation, Gem installation, authentication information, etc. can all be managed by Docker container.&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://hub.docker.com/r/genzouw/jq"&gt;genzouw/jq&lt;/a&gt; : &lt;em&gt;This is Dockerfile repository that wrap jq command.&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://hub.docker.com/r/genzouw/trim-text"&gt;genzouw/trim-text&lt;/a&gt; : &lt;em&gt;This Docker image is intended to provide a UI that integrates command line text cut operations.&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://hub.docker.com/r/genzouw/ansize"&gt;genzouw/ansize&lt;/a&gt; : &lt;em&gt;Convert image to text ( ascii art ) .&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;いずれも自分の公開 Github リポジトリコミットしたタイミングで、 &amp;ldquo;Docker Hub&amp;quot;でイメージを自動的に作成するようにしています。&lt;/p&gt;</description></item><item><title>JPEGファイルからfavicon.icoを作成するためのコマンド</title><link>https://genzouw.com/entry/2021/02/16/215426/2261/</link><pubDate>Tue, 16 Feb 2021 21:54:26 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/16/215426/2261/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;SNS でいつも使っている僕のプロフィール用 JPEG 画像( &lt;a href="https://ja.gravatar.com/"&gt;Gravatar&lt;/a&gt; でも使っています。 )から &lt;strong&gt;favicon.ico&lt;/strong&gt; ファイルを作成し、作成途中のサイトのブックマークアイコンとして利用したいと思いました。&lt;/p&gt;&#10;&lt;p&gt;自動化も見据えて、コマンドで作成できないか調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="image-to-icon-を使う"&gt;image-to-icon を使う&lt;/h2&gt;&#10;&lt;p&gt;Github を漁ってみたところ、ちょうど良さそうなコマンドが見つかりました。&#10;ワン・コマンドで変換でき、オプションもない、というシンプルさ。 &lt;strong&gt;UNIX という思想&lt;/strong&gt; を体現していて大好きです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/koenpunt/image-to-icon"&gt;koenpunt/image-to-icon&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="インストール"&gt;インストール&lt;/h3&gt;&#10;&lt;p&gt;今回動作を確認した環境は CentOS の Docker コンテナなのですが、いくつか必要となるコマンドがあったため、 &lt;strong&gt;yum&lt;/strong&gt; でインストールしてから利用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# このあたりはDockerを使う必要は全くありません。Mac環境を汚したくなかっただけです。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --rm -v &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$PWD&lt;/span&gt;&lt;span class="s2"&gt;:/workdir&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --workdir /workdir genzouw/centos-sandbox&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;依存ライブラリとして、 &lt;strong&gt;ImageMagick&lt;/strong&gt; をインストールする必要がありました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum install ImageMagick which -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとはコマンドを Github から clone するだけ。&lt;/p&gt;</description></item><item><title>Google Search ConsoleのAMP解析結果が根こそぎ無効となっていたため対処しました</title><link>https://genzouw.com/entry/2021/02/15/102933/2232/</link><pubDate>Mon, 15 Feb 2021 10:29:33 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/15/102933/2232/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;ブログのアクセス数がついに &lt;strong&gt;月間30,000万PV&lt;/strong&gt; となりました！&lt;/p&gt;&#10;&lt;p&gt;10年以上続けていたブログです。&#10;全くアクセス数伸びませんでしたが、ここ数年で急にアクセス数が増えました。&#10;ITエンジニアの需要が増えたことが関係しているのかな？&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;さて、昨日久しぶりに &lt;strong&gt;Google Search Console&lt;/strong&gt; を覗いたところ、AMPページについてエラーが発声していました。&lt;/p&gt;&#10;&lt;p&gt;今日はどのような問題が発生していたのかと、対処法を取り上げたいと思います。&lt;/p&gt;&#10;&lt;h2 id="wordpress環境バージョンテーマ"&gt;WordPress環境（バージョン、テーマ）&lt;/h2&gt;&#10;&lt;p&gt;WordPress &lt;strong&gt;5.6.1&lt;/strong&gt; (Luxeritas Child Theme テーマ)&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1sMAraSZCynSQBl37KQEWk3vaaGqfjtzl" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="google-search-console-のampページクローリングでエラーが発生していた"&gt;&amp;ldquo;Google Search Console&amp;rdquo; のAMPページクローリングでエラーが発生していた&lt;/h2&gt;&#10;&lt;p&gt;冒頭でも触れましたが、久しぶりに &lt;strong&gt;Google Search Console&lt;/strong&gt; を覗いてみました。&lt;/p&gt;&#10;&lt;p&gt;左メニューからいくつかの内容を流し見していたところ、 &lt;strong&gt;「AMP」&lt;/strong&gt; ページを開いてびっくり。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1U13G0-svPLUMb3GJqC2oB4Km96Ug2NxP" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「せっかくAMP対応していたページが根こそぎエラーになっている！」&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="なぜampページのクローリングでエラーが発生していたのか"&gt;なぜAMPページのクローリングでエラーが発生していたのか？&lt;/h2&gt;&#10;&lt;p&gt;エラーとなっているページを1つ選んで詳細を確認してみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1ceQAdOXpNZaYyiqpjPwIH31oTvu1NXk3" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;amp-img&gt;&lt;/strong&gt; タグ内に、 &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt; というHTML属性が設定されていることが原因でした。&lt;/p&gt;&#10;&lt;p&gt;ただ、僕はこのような設定を行った記憶がありません。&lt;/p&gt;&#10;&lt;h2 id="wordpress55から導入された画像の遅延ローディング機能が原因"&gt;WordPress5.5から導入された「画像の遅延ローディング機能」が原因&lt;/h2&gt;&#10;&lt;p&gt;Web上で調べてみると、 &lt;strong&gt;Wordpress5.5&lt;/strong&gt; から &lt;strong&gt;「画像の遅延ローディング機能」&lt;/strong&gt; が導入されたようです。&lt;/p&gt;&#10;&lt;p&gt;デフォルトの動作として、エントリの中に埋め込まれている画像には &lt;code&gt;loading=&amp;quot;lazy&amp;quot;&lt;/code&gt; が自動的に設定されるようです。&lt;/p&gt;&#10;&lt;h2 id="対処法1--wp-includesfunctionsphp-に遅延ローディングの無効ロジックを追記"&gt;対処法1 ： &lt;code&gt;wp-includes/functions.php&lt;/code&gt; に「遅延ローディング」の無効ロジックを追記&lt;/h2&gt;&#10;&lt;p&gt;「遅延ローディング」を無効化するためには以下のようにWordPressのコードを書き換えます。&lt;/p&gt;&#10;&lt;p&gt;&lt;del&gt;（注意：次にアップグレードした際に、また変更内容が消えてしまう可能性はあるので、様子を見たいと思います。）&lt;/del&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;2021-02-25追記：やはりWordPressのアップグレードで変更内容が戻ってしまいました。後述する対処法2を参考ください。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;WordPressのソースコードを開きます。 ( &lt;code&gt;wp-includes/functions.php&lt;/code&gt; )&lt;/li&gt;&#10;&lt;li&gt;一番下に以下の1行を追記します。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;add_filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;wp_lazy_loading_enabled&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__return_false&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実際に変更されたコードは以下のようになります。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1kl_jYkhQdXJFFytffPm59iqoPjpwRxCN" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="対処法2--wp-contentthemes-ディレクトリ配下の-functionsphp-に遅延ローディングの無効ロジックを追記"&gt;対処法2 ： &lt;code&gt;wp-content/themes&lt;/code&gt; ディレクトリ配下の &lt;code&gt;functions.php&lt;/code&gt; に「遅延ローディング」の無効ロジックを追記&lt;/h2&gt;&#10;&lt;p&gt;WordPressのアップグレードを考慮するとこちらの方法が勧めです。&lt;/p&gt;</description></item><item><title>GCPにSpinnakerをインストールするための手順を整理しました</title><link>https://genzouw.com/entry/2021/02/12/214915/2199/</link><pubDate>Fri, 12 Feb 2021 21:49:15 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/12/214915/2199/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;前回でようやくSpinnakerが生まれてきた背景やできることを大まかにつかめました。&lt;/p&gt;&#10;&lt;p&gt;ここからは実際にインストールしてみたいと思います。&lt;/p&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B084ZCYL4V&amp;linkId=a13517124ec4a6224d2c89648f7aa9e3"&gt;&lt;/iframe&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;項目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;選定&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;クラウド&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GCP ( Google Cloud Platform )&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;デプロイ環境&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GKE ( Google Kubernetes Engine )&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Spinnakerインストール環境&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GCE ( Google Compute Engine )&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1zeebpQSAd7s7ZsKqENPx5VXGtjsOVkF3" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="前提条件"&gt;前提条件&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;作業用PCで &lt;code&gt;gcloud&lt;/code&gt; コマンド ( &lt;strong&gt;Google Cloud SDK&lt;/strong&gt; ) が実行できること&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;GCP&lt;/strong&gt; 上に &lt;strong&gt;GKEクラスタ&lt;/strong&gt; が構築済みであること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="作業用pc-での作業"&gt;&lt;strong&gt;作業用PC&lt;/strong&gt; での作業&lt;/h2&gt;&#10;&lt;p&gt;まずは自分の作業用PCで作業を行います。&lt;/p&gt;&#10;&lt;h3 id="1-コマンドラインから各種作業を実行するための準備"&gt;1. コマンドラインから各種作業を実行するための準備&lt;/h3&gt;&#10;&lt;p&gt;コマンドラインで作業を進めていくに当たり、いくつかのAPIを &lt;strong&gt;有効化&lt;/strong&gt; します。&lt;/p&gt;&#10;&lt;p&gt;以下の2つの Google APIを有効にします。&#10;&lt;strong&gt;Google Cloud Console&lt;/strong&gt; Webページから有効にしても良いですが、ここでは &lt;code&gt;gcloud&lt;/code&gt; コマンドで有効化します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://console.developers.google.com/apis/api/iam.googleapis.com/overview?pli=1"&gt;Google Identity and Access Management (IAM) API&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://console.developers.google.com/apis/library/cloudresourcemanager.googleapis.com?project=genzouw-com&amp;amp;folder=&amp;amp;organizationId="&gt;Google Cloud Resource Manager API&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gcloud services &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; iam.googleapis.com &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cloudresourcemanager.googleapis.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-halyardをインストールする-compute-engine-インスタンスを作成"&gt;2. Halyardをインストールする &lt;strong&gt;Compute Engine&lt;/strong&gt; インスタンスを作成&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Halyard&lt;/strong&gt; をインストールする &lt;strong&gt;Compute Engineインスタンス&lt;/strong&gt; を作成します。&lt;/p&gt;</description></item><item><title>本番環境で環境依存の問題が散見されたのでSpinnakerの導入を検討してみました</title><link>https://genzouw.com/entry/2021/02/11/080037/2187/</link><pubDate>Thu, 11 Feb 2021 08:00:37 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/11/080037/2187/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;会社で、 &lt;strong&gt;検証環境&lt;/strong&gt; では障害が発生しないが &lt;strong&gt;本番環境&lt;/strong&gt; では障害が発生する、といったことが何度か続きました。&lt;/p&gt;&#10;&lt;p&gt;原因は &lt;strong&gt;検証環境&lt;/strong&gt; と &lt;strong&gt;本番環境&lt;/strong&gt; のクラウドサービスの設定の差異でした。&#10;再現性のある方法でクラウド上の環境を構築してこなかったことが原因ではありますが、できてしまっているものはしょうがないです。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「カナリアデプロイ」&lt;/strong&gt; と呼ばれる、 &lt;strong&gt;本番環境&lt;/strong&gt; に部分的にデプロイして動作確認し、問題なければ全展開するデプロイ方法があります。&#10;これはぜひ導入したい！そこで見つけた名前が &lt;strong&gt;Spinnaker&lt;/strong&gt; でした。&lt;/p&gt;&#10;&lt;p&gt;Spinnakerを使って「カナリアデプロイ」が実現できる、という話を耳にしたので調べてみました。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-mermaid" data-lang="mermaid"&gt;graph LR;&#10; load_balancer--&amp;gt;|95% Traffics| web_server(Web Server);&#10; load_balancer--&amp;gt;|5% Traffics| new_web_server(Web Server); subgraph Old&#10; web_server--&amp;gt;applicacion_server(Application Server)&#10; applicacion_server(Application Server)--&amp;gt;database(Database);&#10; end &#10; subgraph New&#10; new_web_server--&amp;gt;new_applicacion_server(Application Server)&#10; new_applicacion_server(Application Server)--&amp;gt;new_database(Database);&#10; end &#10;&lt;/code&gt;&lt;/pre&gt;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=B084ZCYL4V&amp;linkId=a13517124ec4a6224d2c89648f7aa9e3"&gt;&lt;/iframe&gt;&#10;&lt;h2 id="継続的インテグレーション-ci-"&gt;継続的インテグレーション( &lt;strong&gt;CI&lt;/strong&gt; )&lt;/h2&gt;&#10;&lt;p&gt;素早いソフトウェアの改善・改良や新機能追加が求められる時代がありました。（当時は僕もJavaばっかり触っていました。）&lt;/p&gt;&#10;&lt;p&gt;当時、開発された分割モジュールを統合してビルドすると、、、&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ビルドに失敗する！&lt;/li&gt;&#10;&lt;li&gt;正常に動作しない！&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;なんてことはよくありました。&lt;/p&gt;&#10;&lt;p&gt;そこで偉い人？が「開発の早い段階から継続的に以下のステップを実施すればいいんじゃね？」と考えました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;コードチェック&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ビルド&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ユニットテスト&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;こうして、継続的インテグレーション(CI)が誕生しました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="継続的デリバリ-cd-"&gt;継続的デリバリ( &lt;strong&gt;CD&lt;/strong&gt; )&lt;/h2&gt;&#10;&lt;p&gt;更に時が過ぎ、「継続的インテグレーション」を更に推し進める思想が生まれました。&lt;/p&gt;&#10;&lt;p&gt;偉い人？が「ソフトウェアのデプロイも継続的に、自動的に行ったらいいんじゃね？」と考えました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;こうして、継続的デリバリ(CD)が誕生しました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;ちなみに、 &lt;strong&gt;「継続的デリバリ」&lt;/strong&gt; を行うためには、以下の2つが必要となります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ビルドされたパッケージ&lt;/li&gt;&#10;&lt;li&gt;パッケージを運用環境にデプロイする手段&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;それを踏まえて、昨今の状況の話に移ります。&lt;/p&gt;</description></item><item><title>Google Cloud Pub/Subの登場人物と役割を整理してみました</title><link>https://genzouw.com/entry/2021/02/10/080020/2179/</link><pubDate>Wed, 10 Feb 2021 08:00:20 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/10/080020/2179/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2021/02/09/184018/2167/"&gt;前回のエントリ&lt;/a&gt; に引き続き、 &lt;strong&gt;Google Cloud Pub/Sub&lt;/strong&gt; の学習を進めてわかった登場人物とその役割について整理してみました。&lt;/p&gt;&#10;&lt;h2 id="参考ページ"&gt;参考ページ&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;[公式ページ)[https://cloud.google.com/pubsub/docs/overview]&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="登場人物"&gt;登場人物&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Publisher（パブリッシャー）&lt;/li&gt;&#10;&lt;li&gt;Topic（トピック）&lt;/li&gt;&#10;&lt;li&gt;Subscription（サブスクリプション）&lt;/li&gt;&#10;&lt;li&gt;Subscriber（サブスクライバー）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;そして、上記4つの登場人物たちの間を流れていくものとして &lt;strong&gt;Message（メッセージ）&lt;/strong&gt; があります。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://cloud.google.com/pubsub/images/many-to-many.svg" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="publisherパブリッシャー"&gt;Publisher(パブリッシャー)&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;メッセージの送信元&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="topicトピック"&gt;Topic（トピック）&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&amp;ldquo;Cloud Pub/Sub&amp;rdquo; サービスの内部要素です。&lt;/li&gt;&#10;&lt;li&gt;メッセージの送信元である &lt;strong&gt;Publisher&lt;/strong&gt; に対する &lt;strong&gt;コネクター&lt;/strong&gt; として理解しました。&lt;/li&gt;&#10;&lt;li&gt;TopicとPublisherは必ず &lt;strong&gt;1:1&lt;/strong&gt; となります。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="subscriptionサブスクリプション"&gt;Subscription（サブスクリプション）&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&amp;ldquo;Cloud Pub/Sub&amp;rdquo; サービスの内部要素です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;メッセージの受信先である &lt;strong&gt;Subscriber&lt;/strong&gt; に対する &lt;strong&gt;コネクター&lt;/strong&gt; として理解しました。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="subscriberサブスクライバー"&gt;Subscriber(サブスクライバー)&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;メッセージの受信先&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="メッセージ伝達のイベントキューはどの単位"&gt;メッセージ伝達のイベントキューはどの単位？&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://cloud.google.com/pubsub/images/pub_sub_flow.svg" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;公式サイトの上記の図だけでは、 メッセージイベントは &lt;strong&gt;Tppic&lt;/strong&gt; 単位にキューイングされるのか？&lt;/p&gt;&#10;&lt;p&gt;と思いましたが、よくよく文章を読んでみると &lt;strong&gt;Subscription&lt;/strong&gt; 単位にキューイングされているようです。&#10;当然ですよね。そうしないとそれぞれのSubscriberにイベントが伝達されませんもんね。&lt;/p&gt;&#10;&lt;h2 id="subscriptionからsubscriberへのメッセージ伝達の方法は2つ"&gt;SubscriptionからSubscriberへのメッセージ伝達の方法は2つ&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Push&lt;/strong&gt; 方式と &lt;strong&gt;Pull&lt;/strong&gt; 方式が利用できます。&lt;/p&gt;&#10;&lt;h3 id="push-方式--subscription-からみて-push-を行う"&gt;&lt;strong&gt;Push&lt;/strong&gt; 方式 : &lt;strong&gt;Subscription&lt;/strong&gt; からみて &lt;strong&gt;Push&lt;/strong&gt; を行う&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-seq" data-lang="seq"&gt;Publisher -&amp;gt;Topic: Message&#10;Topic-&amp;gt;Subscription: Message&#10;Subscription-&amp;gt;Subscriber: POST(Message)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="pull-方式--subscriber-からみて-pull-を行う"&gt;&lt;strong&gt;Pull&lt;/strong&gt; 方式 : &lt;strong&gt;Subscriber&lt;/strong&gt; からみて &lt;strong&gt;Pull&lt;/strong&gt; を行う&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-seq" data-lang="seq"&gt;Publisher -&amp;gt;Topic: Message&#10;Topic-&amp;gt;Subscription: Message&#10;Subscriber-&amp;gt;Subscription: GET(Message)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;効率が良いのは &lt;strong&gt;Push&lt;/strong&gt; 方式でしょうが、 &lt;strong&gt;Subscriber&lt;/strong&gt; がオンプレ環境にいる、外部からのInboundな通信が許可されていない、Webサービスとして公開する実装になれていないといった場合は、 &lt;strong&gt;Pull&lt;/strong&gt; 方式を選択するしかないかと思います。&lt;/p&gt;</description></item><item><title>Google Cloud Pub/Subについて学習中（非同期メッセージングを図示してみました）</title><link>https://genzouw.com/entry/2021/02/09/184018/2167/</link><pubDate>Tue, 09 Feb 2021 18:40:18 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/09/184018/2167/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Google Cloud Pub/Sub&lt;/strong&gt; を使っていましたが、あまり理論や背景を理解せず使っていたため復習しています。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://cloud.google.com/pubsub/docs/overview"&gt;公式ページ&lt;/a&gt; より&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;「GCP（Google Cloud Platform)上で提供されている、 &lt;strong&gt;非同期メッセージングサービス&lt;/strong&gt; です。」&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;と書かれていましたが、「非同期メッセージングサービス」とはそもそもなんだろう？ということでアウトプットしながら整理しました。&lt;/p&gt;&#10;&lt;h2 id="同期メッセージング-とは"&gt;同期メッセージング とは&lt;/h2&gt;&#10;&lt;p&gt;メッセージ（何かの要求) の送信側 &lt;strong&gt;publisher&lt;/strong&gt; と 受信側 &lt;strong&gt;subscriber&lt;/strong&gt; は両方とも同時に活動状態（ &lt;strong&gt;Active&lt;/strong&gt; )でなければ、やりとりできない仕組みです。&lt;/p&gt;&#10;&lt;p&gt;Webページ閲覧の例だと、ブラウザが &lt;strong&gt;publisher&lt;/strong&gt; 、 Webサーバが &lt;strong&gt;subscriber&lt;/strong&gt; となります。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-seq" data-lang="seq"&gt;publisher-&amp;gt;subscriber: message&#10;subscriber-&amp;gt;publisher: result&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;電話のイメージですね。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1U_SAemSF1cu1TV2PI67sRk6AM9UMtmVI" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="非同期メッセージング-とは"&gt;非同期メッセージング とは&lt;/h2&gt;&#10;&lt;p&gt;メッセージの送信側 &lt;strong&gt;publisher&lt;/strong&gt; と 受信側 &lt;strong&gt;subscriber&lt;/strong&gt; の間に仲介者 &lt;strong&gt;broker&lt;/strong&gt; が挟まります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;publisher&lt;/strong&gt; は &lt;strong&gt;subscriber&lt;/strong&gt; の存在や状態を意識することなく、メッセージの送信を終了することができます。&lt;/p&gt;&#10;&lt;h3 id="非同期メッセージングその1"&gt;非同期メッセージングその1&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-seq" data-lang="seq"&gt;publisher-&amp;gt;broker: message&#10;broker-&amp;gt;publisher: result&#10;&#10;broker-&amp;gt;subscriber: message&#10;subscriber-&amp;gt;broker: result&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;こちらはeメールのイメージですね。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1uHtwwjA_H5O9A1kMVPpW2GTHmKZYvnC_" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;当然、 &lt;strong&gt;broker&lt;/strong&gt; には安定性が求めらますね。&lt;/p&gt;&#10;&lt;p&gt;また、以下のように仲介者を挟んだとしても &lt;strong&gt;subscriber&lt;/strong&gt; のレスポンスに依存している場合は非同期メッセージング方式とはなりません。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-seq" data-lang="seq"&gt;publisher-&amp;gt;broker: message&#10;&#10;broker-&amp;gt;subscriber: message&#10;subscriber-&amp;gt;broker: result&#10;&#10;broker-&amp;gt;publisher: result&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="非同期メッセージングその2"&gt;非同期メッセージングその2&lt;/h3&gt;&#10;&lt;p&gt;さらに、 &lt;strong&gt;subscriber&lt;/strong&gt; は1つである必要はありません。&#10;&lt;strong&gt;publisher&lt;/strong&gt; は &lt;strong&gt;broker&lt;/strong&gt; １人に対してメッセージを送信することだけに注力します。&lt;/p&gt;</description></item><item><title>"hub-tool"を使って"Docker Hub"上のイメージタグを一覧表示する</title><link>https://genzouw.com/entry/2021/02/02/193242/2158/</link><pubDate>Tue, 02 Feb 2021 19:32:42 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/02/193242/2158/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/07/23/084033/1687/"&gt;シェルでDockerHubリポジトリからイメージとタグを取得する方法 | ゲンゾウ用ポストイット&lt;/a&gt; で、&#10;&lt;strong&gt;Docker Hub&lt;/strong&gt; 上のイメージで利用できるタグを一覧表示するための方法を紹介しましたが、&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;hub-tool&lt;/code&gt; という便利なツールを導入することでタグの一覧表示が容易に実現できるようになりましたので紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 20.10.2, build 2291f61&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="hub-tool-コマンド--docker-hub-tool"&gt;&lt;code&gt;hub-tool&lt;/code&gt; コマンド : Docker Hub Tool&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/docker/hub-tool"&gt;Docker Hub Tool&lt;/a&gt; とは、 コマンドラインから &amp;ldquo;Docker Hub&amp;rdquo; で自分が作成したリポジトリを操作するためのコマンドラインツールになります。&lt;/p&gt;&#10;&lt;p&gt;「自分が作成したリポジトリ」のみですが、例外として他のエンジニアが提供しているDockerイメージのタグを一覧表示するための機能が提供されています。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;h3 id="go-get-コマンドを使ってインストール"&gt;&lt;code&gt;go get&lt;/code&gt; コマンドを使ってインストール&lt;/h3&gt;&#10;&lt;p&gt;Go言語の実行環境が用意されている場合は &lt;code&gt;go get&lt;/code&gt; コマンドが利用できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;GO111MODULE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;on go get github.com/docker/hub-tool&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Go言語の実行環境が用意されていない場合には後述の方法をお試しください。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="tar-パッケージを使ってインストール"&gt;tar パッケージを使ってインストール&lt;/h3&gt;&#10;&lt;p&gt;パッケージが提供されていたためそちらをダウンロードすればすぐに利用できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 作業ディレクトリへ移動（どこでもよい）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ダウンロード&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -L -O https://github.com/docker/hub-tool/releases/download/v0.3.0/hub-tool-darwin-amd64.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 展開&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tar xf hub-tool-darwin-amd64.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# パスの通っているディレクトリへ移動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mv hub-tool/hub-tool /usr/local/bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正しくインストールされているか確認してみます。&lt;/p&gt;</description></item><item><title>gcloudとfzfを組み合わせてGCPプロジェクトを簡単に切り替える</title><link>https://genzouw.com/entry/2021/02/01/200923/2154/</link><pubDate>Mon, 01 Feb 2021 20:09:23 +0900</pubDate><guid>https://genzouw.com/entry/2021/02/01/200923/2154/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;現職ではAWSよりも&lt;strong&gt;GCP&lt;/strong&gt;にインフラリソースを多く配置しています。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;gcloud&lt;/code&gt; コマンドを使って作業をする事が多いですが、更に最近ではGCPプロジェクトも複数またがって作業する事が増えてきました。&lt;/p&gt;&#10;&lt;p&gt;かんたんにGCPプロジェクトを切り替えられるかが作業の効率化のために重要です。&lt;/p&gt;&#10;&lt;p&gt;かんたんにGCPプロジェクトをスイッチし、Compute Engineインスタンスにssh接続するためのaliasを作成したので紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gcloud --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Google Cloud SDK 307.0.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Updates are available &lt;span class="k"&gt;for&lt;/span&gt; some Cloud SDK components. To install them,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;please run:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ fzf --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0.25.0 &lt;span class="o"&gt;(&lt;/span&gt;brew&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;h3 id="fzfコマンドのインストール"&gt;fzfコマンドのインストール&lt;/h3&gt;&#10;&lt;p&gt;今回紹介するaliasを利用するためには、 &lt;a href="https://github.com/junegunn/fzf"&gt;fzf&lt;/a&gt;のインストールが必要です。&#10;インストールしましょう。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;MacOS&lt;/strong&gt; + &lt;strong&gt;Homebrew&lt;/strong&gt; をインストール済みの場合には導入が容易です。&#10;インストール手順をGithubリポジトリページから抜粋します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew install fzf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# To install useful key bindings and fuzzy completion:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;$(&lt;/span&gt;brew --prefix&lt;span class="k"&gt;)&lt;/span&gt;/opt/fzf/install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;*その他の環境でも、以下のコマンドでインストールできると書かれています。&lt;/p&gt;</description></item><item><title>GitHub CLIでIssue(イシュー)やPull-Request(プルリクエスト)にコメントがつけられるようになりました。</title><link>https://genzouw.com/entry/2021/01/29/192636/2153/</link><pubDate>Fri, 29 Jan 2021 19:26:36 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/29/192636/2153/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;GitHubに対する操作をコマンドラインから実行するためのコマンドとして、 &lt;strong&gt;GitHub CLI&lt;/strong&gt; を愛用しています。&lt;/p&gt;&#10;&lt;p&gt;昔は &lt;a href="https://github.com/github/hub"&gt;hub&lt;/a&gt; コマンドを使っていましたが、 &lt;strong&gt;GitHub CLI&lt;/strong&gt; がリリースされてからはこちらを使っています。&lt;/p&gt;&#10;&lt;p&gt;つい先日、GitHub CLIでIssue(イシュー)やプルリクエストにコメントがつけられるようになりました。&lt;/p&gt;&#10;&lt;p&gt;早速使ってみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Homebrew 2.7.7-32-gebcd56c&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Homebrew/homebrew-core &lt;span class="o"&gt;(&lt;/span&gt;git revision ce8c6c&lt;span class="p"&gt;;&lt;/span&gt; last commit 2021-01-29&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="github-cliのインストール-or-アップグレード"&gt;Github CLIのインストール or アップグレード&lt;/h2&gt;&#10;&lt;h3 id="まだインストールされていない場合"&gt;まだインストールされていない場合&lt;/h3&gt;&#10;&lt;p&gt;インストールされていない場合には、以下のコマンドを実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew install gh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="すでにインストールされている場合"&gt;すでにインストールされている場合&lt;/h3&gt;&#10;&lt;p&gt;インストール済みでバージョンが古い場合はアップグレードしましょう。&lt;/p&gt;&#10;&lt;p&gt;バージョンを確認してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gh --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gh version 1.3.1 &lt;span class="o"&gt;(&lt;/span&gt;2020-12-03&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/cli/cli/releases/latest&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最新版は &lt;strong&gt;1.5&lt;/strong&gt; であり、このバージョンでないとIssueやPull Requestにコメントを付けられない。&#10;そこでアップグレードを行います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew upgrade gh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正常に終了したら、再度バージョンを確認してみます。&lt;/p&gt;</description></item><item><title>sudoでシェルスクリプトを実行した際にPATHが正しく引き継がれない場合の対処</title><link>https://genzouw.com/entry/2021/01/27/213700/2152/</link><pubDate>Wed, 27 Jan 2021 21:37:00 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/27/213700/2152/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;sudo&lt;/strong&gt; コマンドを使ってシェルスクリプトを実行した際に、実行ユーザの &lt;strong&gt;PATH&lt;/strong&gt; 環境変数の設定が引き継がれずに困ってしまうことがあります。&lt;/p&gt;&#10;&lt;p&gt;セキュリティを考慮しての仕組みですが、引き繋がれない原因と対処について解説します。&lt;/p&gt;&#10;&lt;p&gt;最近の sudo はデフォルトでは PATH は引き継がれません。&#10;sudo の &lt;code&gt;-E&lt;/code&gt; オプションが必要です。この解決方法として Web 上でよく見かけます。&#10;ただし、これだけで解消しない場合もあるため、今回のエントリを書こうと思いました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /etc/os-release &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sudo version 1.8.23&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="問題の事象を確認"&gt;問題の事象を確認&lt;/h2&gt;&#10;&lt;p&gt;まずは今回取り上げる事象がどんなものか具体的にコマンドを実行しながら見ていきたいと思います。&#10;いくつか準備をした後、再現させて見たいと思います。&lt;/p&gt;&#10;&lt;h3 id="準備その-1-adm-ユーザの設定"&gt;準備その 1: &lt;code&gt;adm&lt;/code&gt; ユーザの設定&lt;/h3&gt;&#10;&lt;p&gt;事前に作成しておいた &lt;code&gt;adm&lt;/code&gt; ユーザ( &lt;code&gt;wheel&lt;/code&gt; グループに所属 )を使います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3&lt;span class="o"&gt;(&lt;/span&gt;adm&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4&lt;span class="o"&gt;(&lt;/span&gt;adm&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4&lt;span class="o"&gt;(&lt;/span&gt;adm&lt;span class="o"&gt;)&lt;/span&gt;,10&lt;span class="o"&gt;(&lt;/span&gt;wheel&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="準備その-2-sudo-の設定"&gt;準備その 2: &amp;ldquo;sudo&amp;rdquo; の設定&lt;/h3&gt;&#10;&lt;p&gt;次に、 &lt;strong&gt;sudo&lt;/strong&gt; の設定ファイルである &lt;code&gt;/etc/sudoers&lt;/code&gt; は以下のような設定になっています。&lt;/p&gt;</description></item><item><title>BashシェルスクリプトでCloud Loggingへのログ出力をシンプルに実装する方法</title><link>https://genzouw.com/entry/2021/01/25/213005/2150/</link><pubDate>Mon, 25 Jan 2021 21:30:05 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/25/213005/2150/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;既存のシェルスクリプトから &lt;strong&gt;GCP&lt;/strong&gt; の &lt;strong&gt;Cloud Logging&lt;/strong&gt; にログ出力させる必要がありました。&#10;時間をかけずに実装できないか考え、 &lt;a href="https://genzouw.com/entry/2020/01/06/120027/1845/"&gt;Bashシェルスクリプトでログ出力をシンプルに実現する方法&lt;/a&gt; に多少手を加えて実現できたので紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="事前準備gcp上の設定"&gt;事前準備（GCP上の設定）&lt;/h2&gt;&#10;&lt;p&gt;今回は &lt;strong&gt;Cloud Run&lt;/strong&gt; 上でシェルスクリプトを実行させましたが、 &lt;strong&gt;Compute Engine&lt;/strong&gt; や &lt;strong&gt;GKE&lt;/strong&gt; 上でも同じ方法で容易に実現できました。&lt;/p&gt;&#10;&lt;p&gt;事前に1つだけ必要な設定があります。&#10;&lt;strong&gt;サービスアカウント&lt;/strong&gt; に &lt;strong&gt;Logging&lt;/strong&gt; に書き込みを行う権限を設定する必要があります。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;&lt;strong&gt;Cloud Runのサービスアカウント&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1UuMYODkz_kRXguspmK7MaQatsJ2zPpBJ" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Compute Engineのサービスアカウント&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1q5hA4DrwVWGaHX2HebeozriAMviwX0hu" alt=""&gt;&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;上記に記載されている &lt;strong&gt;サービスアカウント&lt;/strong&gt; （ &lt;strong&gt;@&lt;/strong&gt; で区切られていて、メールアドレスのようになっています。）をメモし、IAM設定ページから見つけましょう。&#10;見つけたら、そちらのサービスアカウントに &lt;strong&gt;Logging&lt;/strong&gt; 書き込みの権限を付与しておきます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=19rFx4VoTQuD38vTM3wbF7JWa5VneUsNm" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="スクリプトでログを出力"&gt;スクリプトでログを出力&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2020/01/06/120027/1845/"&gt;Bashシェルスクリプトでログ出力をシンプルに実現する方法&lt;/a&gt; を事前に一読しておくと良いです。&lt;/p&gt;&#10;&lt;p&gt;シェルスクリプト全体の標準出力、標準エラー出力をすべてGCPの &lt;strong&gt;Logging&lt;/strong&gt; に流し込むためには、以下のような記述を行います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 標準出力、標準エラー出力をログ送信&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ***こちらはご自分が書き出しを行いたいロギング名に書き換えてください！***&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GCP_LOGGING_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR-LOGGING-NAME&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exec&lt;/span&gt; 1&amp;gt; &amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; -r LOG&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gcloud logging write &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GCP_LOGGING_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; --payload-type&lt;span class="o"&gt;=&lt;/span&gt;text --severity&lt;span class="o"&gt;=&lt;/span&gt;INFO &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LOG&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 標準エラー出力をログ送信&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;exec&lt;/span&gt; 2&amp;gt; &amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; -r LOG&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gcloud logging write &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GCP_LOGGING_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; --payload-type&lt;span class="o"&gt;=&lt;/span&gt;text --severity&lt;span class="o"&gt;=&lt;/span&gt;ERROR &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$LOG&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ...(以下省略)...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;exec 1&amp;gt; &amp;gt;(...)&lt;/code&gt; の中の処理には、スクリプト全体の標準出力が流れて来ます。&lt;/p&gt;</description></item><item><title>xargsにパイプで渡した標準入力が空だった場合におかしな動きをしないようにする</title><link>https://genzouw.com/entry/2021/01/23/100053/2149/</link><pubDate>Sat, 23 Jan 2021 10:00:53 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/23/100053/2149/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;xargs&lt;/strong&gt; コマンドは非常に便利です。&lt;/p&gt;&#10;&lt;p&gt;パイプでつなぎ、前のコマンドを1つずつ(あるいはいくつかの束ずつ)処理していくときに&#10;簡潔に記述できかつ高速です。&lt;/p&gt;&#10;&lt;p&gt;ただ、パイプの前のコマンドの実行結果が空になると想定しない挙動をする場合があります。&#10;問題と対処について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ xargs --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xargs &lt;span class="o"&gt;(&lt;/span&gt;GNU findutils&lt;span class="o"&gt;)&lt;/span&gt; 4.5.11&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="何も考慮せず-xargs-を使ってみる"&gt;何も考慮せず &amp;ldquo;xargs&amp;rdquo; を使ってみる。&lt;/h2&gt;&#10;&lt;p&gt;なにか具体的な例を考えたいので、 &lt;code&gt;seq&lt;/code&gt; コマンドで生成した数列を &lt;code&gt;xargs&lt;/code&gt; に渡し、 Markdown記法で &lt;code&gt;-&lt;/code&gt; を先頭に付与してみたいと思います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# `seq 1 5` の実行結果（1 2 3 4 5）を1つずつ取り出し、 `echo &amp;#39;-&amp;#39; 1` のように実行していく&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs -n &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正しく動作しました。&lt;/p&gt;&#10;&lt;p&gt;ここでちょっと意地悪をしてみます。&#10;&lt;code&gt;seq 6 5&lt;/code&gt; と言うコマンドを実行し、 &lt;code&gt;xargs&lt;/code&gt; に実行結果を渡すようにしてみます。&lt;/p&gt;</description></item><item><title>シェル上で実行したコマンドをヒストリに残したくない場合（悪用厳禁）</title><link>https://genzouw.com/entry/2021/01/22/130033/2148/</link><pubDate>Fri, 22 Jan 2021 13:00:33 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/22/130033/2148/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2021/01/21/213858/2147/"&gt;ユーザ名とパスワードを引数で受け取りLinuxユーザを作成するスクリプト | ゲンゾウ用ポストイット&lt;/a&gt; でも書きましたが、&#10;シェルのヒストリ（コマンド実行履歴）についつい残してはいけない情報を残してしまうことがあります。&#10;（ ex: &lt;code&gt;mysql -pxxxx mysql&lt;/code&gt; みたいなパスワード情報をついつい貼り付けてしまったり ）&lt;/p&gt;&#10;&lt;p&gt;一時的に残らないようにして作業することもできますので、その方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="コマンドをヒストリに残さないようにする"&gt;コマンドをヒストリに残さないようにする&lt;/h2&gt;&#10;&lt;p&gt;すべてのコマンドをヒストリに残さないようにするには、 &lt;strong&gt;HISTIGNORE&lt;/strong&gt; 環境変数にワイルドカードを設定してやります。&lt;/p&gt;&#10;&lt;p&gt;その後、 &lt;strong&gt;HISTIGNORE&lt;/strong&gt; 環境変数を触った履歴を &lt;code&gt;history -d&lt;/code&gt; で削除します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# これ以降、すべてのコマンドをヒストリに残さないようにする&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;HISTIGNORE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 直前に実行した `HISTIGNORE=&amp;#34;*&amp;#34;` だけは残ってしまうため、ヒストリの最終履歴を１つ削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;history&lt;/span&gt; -d &lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;history&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -n &lt;span class="s1"&gt;&amp;#39;s/^\s\+//; s/\s\+.*$//; $p&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="コマンドをヒストリに残すようにする"&gt;コマンドをヒストリに残すようにする&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;HISTIGNORE&lt;/strong&gt; を解除してやればもとに戻ります。&#10;（ &lt;strong&gt;HISTIGNORE&lt;/strong&gt; にもともと値が設定されている場合には注意が必要です。 ）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;unset&lt;/span&gt; HISTIGNORE&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;自分がどんな操作をしたのかを追えますし、シェルのヒストリは非常に便利です。&#10;しかし、 &lt;strong&gt;どうしてもリスクを犯してでも進まないといけない場合&lt;/strong&gt; にお使いください。&lt;/p&gt;</description></item><item><title>ユーザ名とパスワードを引数で受け取りLinuxユーザを作成するスクリプト</title><link>https://genzouw.com/entry/2021/01/21/213858/2147/</link><pubDate>Thu, 21 Jan 2021 21:38:58 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/21/213858/2147/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;コマンドライン引数で &lt;strong&gt;ユーザ名&lt;/strong&gt; と &lt;strong&gt;パスワード&lt;/strong&gt; を受け取り、Linuxユーザを作成する非インタラクティブなスクリプトをかけないかを思い試してみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;※複数人がログインするようなサーバ環境で実行した場合、実行されたコマンドがhistoryに残ってしまうためご注意ください。パスワードがバレてしまいます。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="スクリプト"&gt;スクリプト&lt;/h2&gt;&#10;&lt;p&gt;スクリプト名は &lt;code&gt;create_ops_user.sh&lt;/code&gt; とでもしておきましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Create a passwordless user&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;useradd &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Set password&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PASSWORD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; passwd --stdin &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;passwd&lt;/code&gt; コマンドは、ログインユーザあるいは指定したユーザのパスワードを変更するコマンドです。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;--stdin&lt;/code&gt; オプションを指定してやることで、パイプ経由で標準入力に渡された文字列をパスワードとして設定することができます。&lt;/p&gt;&#10;&lt;h2 id="実行方法"&gt;実行方法&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo create_ops_user.sh genzouw five_children&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 指定したパスワードでログインできる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ su genzouw&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Password:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;取り急ぎ環境構築手順をスクリプト化する必要がありましたが、&#10;AnsibleやTerraform、Dockerfile、Kubernetesマニフェストなどにする時間すらないほど急いでいたのでシェルでやってしまいました。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;負の遺産になってしまったらごめんなさい。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Dockerコンテナ環境でmanコマンドを使えない問題を解決する方法</title><link>https://genzouw.com/entry/2021/01/20/200939/2133/</link><pubDate>Wed, 20 Jan 2021 20:09:39 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/20/200939/2133/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;飽きずに毎日Bashやシェルスクリプト関連の記事を書いているわけですが、&#10;記事の内容が本当に正しいのかを確認するためにDockerコンテナ環境内で動作を確認しています。&lt;/p&gt;&#10;&lt;p&gt;僕のMac環境は随分汚れてしまっているので、正しい動作を確認するためにはクリーンな環境が必要なわけです。&lt;/p&gt;&#10;&lt;p&gt;執筆の合間にBashの正しい挙動はどう定義されているのかを書くにするために &lt;code&gt;man&lt;/code&gt; コマンドを実行したくなることもあるのですが、Dockerコンテナ内で &lt;code&gt;man bash&lt;/code&gt; を実行してもマニュアルが確認できません。&lt;/p&gt;&#10;&lt;p&gt;コンテナイメージのサイズが大きくなってしまいますが、事前にインストールしておこうと思いました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;いつも執筆の際に利用しているディストリビューションは &lt;strong&gt;CentOS&lt;/strong&gt; です。 ( 未だにCentOS なので、いい加減Ubuntuあたりに移行したい。 )&#10;大体 &lt;code&gt;docker run --rm -it centos:centos7 bash&lt;/code&gt; を実行して、検証環境を立ち上げています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /etc/os-release &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="man-コマンドをインストールしてはみるが"&gt;&lt;code&gt;man&lt;/code&gt; コマンドをインストールしてはみるが&amp;hellip;&lt;/h2&gt;&#10;&lt;p&gt;CentOSのパッケージ管理ツールといえば &lt;strong&gt;YUM&lt;/strong&gt; です。&#10;&lt;code&gt;yum&lt;/code&gt; コマンドで &lt;code&gt;man&lt;/code&gt; をインストールします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yum install man -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;type&lt;/span&gt; man&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;man is /usr/bin/man&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正しくインストールされたのを確認し、次のステップへ。&lt;/p&gt;</description></item><item><title>Kubernetes Podの"command"や"args"で環境変数を参照する方法いろいろ</title><link>https://genzouw.com/entry/2021/01/19/213038/2118/</link><pubDate>Tue, 19 Jan 2021 21:30:38 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/19/213038/2118/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;KubernetesでPod（もしくはReplicaSet、Deployment）のマニフェストにて、 &lt;strong&gt;command&lt;/strong&gt; や &lt;strong&gt;args&lt;/strong&gt; 属性を使って実行コマンドを指定する事ができます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;command&lt;/strong&gt; や &lt;strong&gt;args&lt;/strong&gt; に指定する実行コマンドで環境変数を利用する場合の注意点と対処法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Client Version: version.Info&lt;span class="o"&gt;{&lt;/span&gt;Major:&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, Minor:&lt;span class="s2"&gt;&amp;#34;19&amp;#34;&lt;/span&gt;, GitVersion:&lt;span class="s2"&gt;&amp;#34;v1.19.4&amp;#34;&lt;/span&gt;, GitCommit:&lt;span class="s2"&gt;&amp;#34;d360454c9bcd1634cf4cc52d1867af5491dc9c5f&amp;#34;&lt;/span&gt;, GitTreeState:&lt;span class="s2"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;, BuildDate:&lt;span class="s2"&gt;&amp;#34;2020-11-12T01:09:16Z&amp;#34;&lt;/span&gt;, GoVersion:&lt;span class="s2"&gt;&amp;#34;go1.15.4&amp;#34;&lt;/span&gt;, Compiler:&lt;span class="s2"&gt;&amp;#34;gc&amp;#34;&lt;/span&gt;, Platform:&lt;span class="s2"&gt;&amp;#34;darwin/amd64&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server Version: version.Info&lt;span class="o"&gt;{&lt;/span&gt;Major:&lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;, Minor:&lt;span class="s2"&gt;&amp;#34;16+&amp;#34;&lt;/span&gt;, GitVersion:&lt;span class="s2"&gt;&amp;#34;v1.16.15-gke.4300&amp;#34;&lt;/span&gt;, GitCommit:&lt;span class="s2"&gt;&amp;#34;7ed5ddc0e67cb68296994f0b754cec45450d6a64&amp;#34;&lt;/span&gt;, GitTreeState:&lt;span class="s2"&gt;&amp;#34;clean&amp;#34;&lt;/span&gt;, BuildDate:&lt;span class="s2"&gt;&amp;#34;2020-10-28T09:23:22Z&amp;#34;&lt;/span&gt;, GoVersion:&lt;span class="s2"&gt;&amp;#34;go1.13.15b4&amp;#34;&lt;/span&gt;, Compiler:&lt;span class="s2"&gt;&amp;#34;gc&amp;#34;&lt;/span&gt;, Platform:&lt;span class="s2"&gt;&amp;#34;linux/amd64&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="command-や-args-に環境変数をベタ書きした場合うまく参照できない"&gt;command や args に環境変数をベタ書きした場合、うまく参照できない&lt;/h2&gt;&#10;&lt;p&gt;環境変数を出力するだけのPodを作成してみます。&#10;まずはPodのマニフェストファイルを作成します。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;env&lt;/code&gt; 属性で &lt;code&gt;NAME&lt;/code&gt; という環境変数を設定し、それを出力させてみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# test-pod.yaml というマニフェストファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;test-pod.yaml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;apiVersion: v1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;kind: Pod&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;metadata:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; name: test-pod&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;spec:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; containers:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; - name: test-pod&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; image: bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; command: [&amp;#34;echo&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; args:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; - &amp;#34;${NAME}&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; env:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; - name: NAME&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; value: &amp;#34;genzouw&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;マニフェストファイルを元にPodを作成します。&lt;/p&gt;</description></item><item><title>envsubstを使ってテキストファイルをテンプレートエンジンとして使う</title><link>https://genzouw.com/entry/2021/01/14/220134/2113/</link><pubDate>Thu, 14 Jan 2021 22:01:34 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/14/220134/2113/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Kubernetes のマニフェストファイル内に環境変数を埋め込み、出力内容を動的に変更したい場合がありました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/kubernetes-sigs/kustomize"&gt;kustomize&lt;/a&gt; や &lt;a href="https://helm.sh/"&gt;helm&lt;/a&gt; といったツールを利用することで Kubernetes のマニフェストファイルに変数を埋め込むことはできます。&#10;しかし、そこまで大層な仕組みを導入するような手間を掛けたくありません。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; を使う方法もありますが、可読性は低くなります。&lt;/p&gt;&#10;&lt;p&gt;そんな場合、 &lt;code&gt;enｖsubst&lt;/code&gt; コマンドを利用することで実現できました。&lt;/p&gt;&#10;&lt;p&gt;テキストファイルをテンプレートエンジンのとして利用できるシンプルで便利なコマンドです。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="envsubst-コマンドとは"&gt;&lt;code&gt;envsubst&lt;/code&gt; コマンドとは&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;envsubst&lt;/code&gt; コマンドを使うと，変数展開など「テンプレートエンジン」のような仕組みを実現できます。&lt;/p&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;僕の環境 ( CentOS ) には最初にインストールされていなかったため、まずはインストールから行いました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yum install -y gettext&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ which envsubst&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/bin/envsubst&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mac 環境の場合は &lt;strong&gt;Homebrew&lt;/strong&gt; でインストールできます ( 僕の Mac には気がついたらインストールされていました ) 。&#10;&lt;code&gt;apt&lt;/code&gt; でもきっと用意にインストールできるでしょう。&lt;/p&gt;&#10;&lt;p&gt;バージョンを確認します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ envsubst --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;envsubst &lt;span class="o"&gt;(&lt;/span&gt;GNU gettext-runtime&lt;span class="o"&gt;)&lt;/span&gt; 0.19.8.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; 2003-2007 Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;License GPLv3+: GNU GPL version &lt;span class="m"&gt;3&lt;/span&gt; or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is free software: you are free to change and redistribute it.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;There is NO WARRANTY, to the extent permitted by law.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Written by Bruno Haible.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="envsubst-コマンドでテキストファイルに変数を埋め込んで見る"&gt;&lt;code&gt;envsubst&lt;/code&gt; コマンドでテキストファイルに変数を埋め込んで見る&lt;/h2&gt;&#10;&lt;p&gt;早速使ってみましょう。&lt;/p&gt;</description></item><item><title>"bash -c"コマンド実行で子プロセスが作られる時、作られない時</title><link>https://genzouw.com/entry/2021/01/08/202800/2109/</link><pubDate>Fri, 08 Jan 2021 20:28:00 +0900</pubDate><guid>https://genzouw.com/entry/2021/01/08/202800/2109/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;KubernetesのマニフェストファイルやDockerのビルドファイル、Docker Composeの設定ファイルを閲覧、編集することが増えてきました。&lt;/p&gt;&#10;&lt;p&gt;それらのファイルの中で &lt;code&gt;bash -c&lt;/code&gt; というコマンドが実行されていることがあります。&#10;&lt;code&gt;bash&lt;/code&gt; の新しいプロセスを立ち上げ、 &lt;code&gt;-c&lt;/code&gt; オプションで渡されたコマンドを実行する命令になります。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;ps&lt;/code&gt; コマンドを使い、実行中の &lt;code&gt;bash -c&lt;/code&gt; プロセスを見ていたところ、プロセスツリーの表示が時々で異なっていたため不思議に思い調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="改めて-bash--c-って何"&gt;改めて、 &lt;code&gt;bash -c&lt;/code&gt; って何？&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;bash -c &amp;quot;echo hello&amp;quot;&lt;/code&gt; といったように、 &lt;code&gt;-c&lt;/code&gt; コマンドに文字列を渡すことで、文字列をコマンドとして実行させることができます。&#10;多くの言語系で実装されている &lt;code&gt;eval&lt;/code&gt; 関数のようなものですね。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 10秒待ってからhelloが表示される&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -c &lt;span class="s2"&gt;&amp;#34;echo hogehoge&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hogehoge&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンドは &lt;code&gt;;&lt;/code&gt; で区切って複数実行させることもできます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 10秒待ってからhelloが表示される&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -c &lt;span class="s2"&gt;&amp;#34;sleep 10; echo hello;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bash--c-sleep-10-echo-hello-を実行したときのプロセスツリー"&gt;&lt;code&gt;bash -c &amp;quot;sleep 10; echo hello;&amp;quot;&lt;/code&gt; を実行したときのプロセスツリー&lt;/h2&gt;&#10;&lt;p&gt;ここで、 &lt;code&gt;bash -c &amp;quot;sleep 10; echo hello;&amp;quot;&lt;/code&gt; というコマンドを実行します。&lt;/p&gt;</description></item><item><title>Gitでmasterブランチにマージ済みのローカルブランチを一括削除する</title><link>https://genzouw.com/entry/2020/11/19/083007/2101/</link><pubDate>Thu, 19 Nov 2020 08:30:07 +0900</pubDate><guid>https://genzouw.com/entry/2020/11/19/083007/2101/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Gitでは容易にブランチを作成し、切り替えることができます。&#10;ただ、容易にブランチを作成できるがゆえに、不要なブランチがわかりにくく、残ってしまうことがあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;strong&gt;すでにmasterブランチにマージされているが、ローカルに残ってしまったブランチ&lt;/strong&gt;&lt;/em&gt; を掃除するためのコマンドを紹介します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※実行前には、実行結果を確認してください！自己責任でお願いします！&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 1.8.3.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="masterブランチマージ済みのローカルブランチを削除"&gt;masterブランチマージ済みのローカルブランチを削除&lt;/h2&gt;&#10;&lt;p&gt;まずはローカルブランチを対象とした掃除の方法について。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git branch --merged master&lt;/code&gt; コマンドでmasterブランチにマージ済みのローカルブランチを出力できます。&#10;ここから &lt;strong&gt;カレントブランチ&lt;/strong&gt; 、 &lt;strong&gt;masterブランチ&lt;/strong&gt; 、 &lt;strong&gt;developブランチ&lt;/strong&gt; を除外します。&lt;/p&gt;&#10;&lt;p&gt;最後に該当のブランチ名を &lt;code&gt;git branch -d&lt;/code&gt; で1つずつ削除していきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git branch --merged master &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -n &lt;span class="s1"&gt;&amp;#39;s@^\s*@@p&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -v -e &lt;span class="s1"&gt;&amp;#39;^\*&amp;#39;&lt;/span&gt; -e &lt;span class="s1"&gt;&amp;#39;^\(master\|develop\)$&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs -n &lt;span class="m"&gt;1&lt;/span&gt; git branch -d&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="masterブランチマージ済みのoriginリモートブランチを削除"&gt;masterブランチマージ済みのoriginリモートブランチを削除&lt;/h2&gt;&#10;&lt;p&gt;すでにpush済みのリモートブランチを対象とした掃除の方法について。&lt;/p&gt;&#10;&lt;p&gt;今度は &lt;code&gt;git branch --remotes --merged master&lt;/code&gt; でマージ済みのリモートブランチを出力しますが、 &lt;strong&gt;origin&lt;/strong&gt; ブランチ飲みに絞り込みます。&#10;最後に &lt;code&gt;git push --delete origin &amp;lt;branch_name&amp;gt;&lt;/code&gt; コマンドで削除を行います。&lt;/p&gt;</description></item><item><title>Bashでコマンドライン上にタブ文字をはりつけると消える問題に対応</title><link>https://genzouw.com/entry/2020/11/18/081335/2100/</link><pubDate>Wed, 18 Nov 2020 08:13:35 +0900</pubDate><guid>https://genzouw.com/entry/2020/11/18/081335/2100/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;MacのデフォルトシェルもZshになったこともあり、最近インタラクティブな操作目的でBashを起動する機会は徐々に減っています。&#10;とはいえ、やはりサーバのログインシェルに利用されているのは未だBashが多く、今後もこの状況が続くでしょう。&lt;/p&gt;&#10;&lt;p&gt;Bashのコマンドライン上にタブ文字を含む文字列を貼り付けた場合、タブ文字が消えてしまうことがないでしょうか？&#10;このタブ文字が消える問題への対処法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="タブ文字が消える問題について"&gt;タブ文字が消える問題について&lt;/h2&gt;&#10;&lt;p&gt;ここで、Bashのヒアドキュメント機能を利用して文字列を出力させたい、というケースを考えてみます。&#10;出力させない内容は、タブ区切り文字列である &lt;strong&gt;TSV&lt;/strong&gt; 形式となっています。&lt;/p&gt;&#10;&lt;p&gt;以下のような3行からなるTSVです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aa&#9;bb&#9;cc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aa&#9;bb&#9;cc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aa&#9;bb&#9;cc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;cat&lt;/code&gt; コマンドと &lt;strong&gt;ヒアドキュメント&lt;/strong&gt; を使って出力してみます。&#10;以下の内容をコピーして、Bashシェル上に貼り付けてみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;aa&#9;bb&#9;cc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;aa&#9;bb&#9;cc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;aa&#9;bb&#9;cc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;うまくいく環境もあるでしょうが、僕の環境ではタブが消えてしまいます。&lt;/p&gt;&#10;&lt;p&gt;これはなぜでしょう？&lt;/p&gt;&#10;&lt;h2 id="原因はbashの補完機能"&gt;原因はBashの補完機能&lt;/h2&gt;&#10;&lt;p&gt;原因はBashの補完機能によるものです。&#10;実は、タブが貼り付けられたタイミングで補完が実行されていますが、 &lt;strong&gt;aa&lt;/strong&gt; 、 &lt;strong&gt;bb&lt;/strong&gt; 、 &lt;strong&gt;cc&lt;/strong&gt; といった文字列で前方一致するファイルがないため、補完対象が見つかっていないだけなのです。&lt;/p&gt;&#10;&lt;p&gt;貼り付ける文字列を以下のようなものに変更するとより挙動がはっきりします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ホームディレクトリに移動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# カレントディレクトリのファイルを確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls .bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# .bashrcが補完される&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;.bashr&#9;bb&#9;ccc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;おそらく、以下のような文字列が表示されることでしょう。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで任意の文字を繰り返し出力する方法</title><link>https://genzouw.com/entry/2020/10/29/211143/2094/</link><pubDate>Thu, 29 Oct 2020 21:11:43 +0900</pubDate><guid>https://genzouw.com/entry/2020/10/29/211143/2094/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;検証のために特定の文字列を繰り返し出力したかったのですが、どうするのがよいか悩んだため思いついた方法をいくつか共有します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ここでは、任意の文字列として &lt;code&gt;=&lt;/code&gt; を使用し、10 文字出力してみます&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="方法-1-printf-コマンドを使う方法"&gt;方法 1. &lt;code&gt;printf&lt;/code&gt; コマンドを使う方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;printf&lt;/code&gt; を使ってこれを実現できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=%0.s&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;0..9&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==========&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いきなり見ただけでは少々わかりにくいです。&#10;以下のように置き直すとわかりやすいです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=%0.s&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt; &lt;span class="nv"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==========&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;printf&lt;/code&gt; のオプションを変えたコマンドの実行結果と比較するとよりわかりやすいでしょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=%s&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;0..9&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;5&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;6&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;7&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;8&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;printf&lt;/code&gt; の引数が &lt;code&gt;&amp;quot;=%s&amp;quot;&lt;/code&gt; コマンドを実行した結果は、&lt;code&gt;=&lt;/code&gt; と第 2 引数以降の値が繰り返し出力されています。&#10;&lt;code&gt;printf&lt;/code&gt; の引数が &lt;code&gt;&amp;quot;=%.0s&amp;quot;&lt;/code&gt; コマンドを実行した結果は、&lt;code&gt;=&lt;/code&gt; だけが繰り返し出力され、第 2 引数そのものは出力されません。&#10;この仕組を利用した文字列の繰り返し出力方法となっています。&lt;/p&gt;&#10;&lt;p&gt;応用して、 &lt;code&gt;Hello&lt;/code&gt; という文字列を 5 回出力してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello%.0s&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;0..4&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HelloHelloHelloHelloHello&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="方法-2-yes-コマンドを使う方法"&gt;方法 2. &lt;code&gt;yes&lt;/code&gt; コマンドを使う方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;printf&lt;/code&gt; コマンドを使う方法よりもコマンドが面倒になりますが、僕はこの方法のほうが直感的でわかりやすいので好きです。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;yes&lt;/code&gt; コマンドを使った方法です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;yes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr -d &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==========&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;yes&lt;/code&gt; コマンドは、引数で渡された文字列を浸すら出力し続けるコマンドです。&#10;挙動を知りたければ、 &lt;code&gt;yes =&lt;/code&gt; だけを実行してみると良いでしょう。( 止めたいときは &lt;code&gt;CTRL+C&lt;/code&gt; を押してください。 )&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで簡易なプログレスバーを実装する</title><link>https://genzouw.com/entry/2020/10/27/200026/2092/</link><pubDate>Tue, 27 Oct 2020 20:00:26 +0900</pubDate><guid>https://genzouw.com/entry/2020/10/27/200026/2092/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;printf&lt;/code&gt; コマンドとエスケープシーケンスを組み合わせてかんたんなプログレスバーを実装する方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.18&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="プログレスバーを実装したい"&gt;プログレスバーを実装したい&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトを組む場合、多くは作業の自動化を目的としていて、なるべくインタラクティブな手続きが介入しないようにすると思います。&lt;/p&gt;&#10;&lt;p&gt;対して、時間のかかる処理を実行しておき、その間にのんびりお茶を飲む、といった場合にシェルスクリプトが活躍する場合もあります。&lt;/p&gt;&#10;&lt;p&gt;時間がかかる処理をシェルスクリプトで実装した場合、どこまで処理が進行したのかわかるようにかんたんなプログレスバーを実装してみましょう。&lt;/p&gt;&#10;&lt;h2 id="必要なもの"&gt;必要なもの&lt;/h2&gt;&#10;&lt;p&gt;準備するようなものは特に入りません。&#10;BashとLinuxのいくつかのコマンドが利用できれば実現可能です。&lt;/p&gt;&#10;&lt;h2 id="早速実装してみる"&gt;早速実装してみる&lt;/h2&gt;&#10;&lt;p&gt;1秒ごとにスリープし、これを10回繰り返すようなかんたんな繰り返し処理を実装し、プログレスバーを表示させてみます。&lt;/p&gt;&#10;&lt;p&gt;実際のコードを見ながら解説していきます。&lt;/p&gt;&#10;&lt;h3 id="ソースコード--show_progress_barsh-"&gt;ソースコード ( &lt;code&gt;show_progress_bar.sh&lt;/code&gt; )&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; I in &lt;span class="o"&gt;{&lt;/span&gt;1..10&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 進捗10%あたりドットを２つ &amp;#34;..&amp;#34; を出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;BAR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;yes . &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;I&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr -d &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\r[%3d/100] %s&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;I &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BAR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="実行結果"&gt;実行結果&lt;/h3&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1lTshLwcXDqg8PI5_qo35eILhyM5Ld3c3" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="解説"&gt;解説&lt;/h2&gt;&#10;&lt;p&gt;ループ処理は &lt;strong&gt;3行目から8行目&lt;/strong&gt; となります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;3行目&lt;/strong&gt; はループ開始です。&#10;ここではループカウンタ &lt;code&gt;I&lt;/code&gt; を1から10まで1ずつインクリメントして10回ループします。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;4行目&lt;/strong&gt; は1秒ずつスリープさせるためのコマンドです。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;5行目&lt;/strong&gt; はちょっと分かりにくいですね。これはプログレスバーをドット( &lt;code&gt;.&lt;/code&gt; )を使って視覚化させるために &lt;code&gt;.&lt;/code&gt; を &lt;code&gt;I&lt;/code&gt; 個連結した文字列を生成します。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで2つの配列を連結する</title><link>https://genzouw.com/entry/2020/10/17/004134/2089/</link><pubDate>Sat, 17 Oct 2020 00:41:34 +0900</pubDate><guid>https://genzouw.com/entry/2020/10/17/004134/2089/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトで変数を頻繁に使用することは多くはないが、それでも利用することはあります。&#10;配列同士を連結する方法と注意事項についてまとめてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.17&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.4.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="配列変数の定義方法"&gt;配列変数の定義方法&lt;/h2&gt;&#10;&lt;p&gt;昔、以下のエントリで取り上げたことがありますが、 &lt;code&gt;declare -a&lt;/code&gt; というビルトインコマンドを使って、配列変数を定義することができます。（ &lt;code&gt;declare -a&lt;/code&gt; は省略可能 ）&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/30/081600/688/#toc_id_2_2"&gt;Bashのビルトインコマンド “declare” の使い方紹介（その１） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配列を定義&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -a ARRAY&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 要素を代入&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ARRAY&lt;span class="o"&gt;[&lt;/span&gt;0&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ARRAY&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 追加する場合&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;ARRAY&lt;/span&gt;&lt;span class="o"&gt;+=(&lt;/span&gt;33&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配列の末尾に要素を追加する方法は &lt;code&gt;ARRAY+=(33)&lt;/code&gt; のように記述することで追加可能です。&lt;/p&gt;&#10;&lt;h2 id="複数の配列変数を連結する"&gt;複数の配列変数を連結する&lt;/h2&gt;&#10;&lt;p&gt;今回のエントリの本題にはいります。&#10;サンプルコードを掲載します。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;SUBLIST1&lt;/code&gt; 、 &lt;code&gt;SUBLIST2&lt;/code&gt; という２つの配列変数を用意し、それらを連結し &lt;code&gt;MAINLIST&lt;/code&gt; という変数に代入してみます。&lt;/p&gt;&#10;&lt;h3 id="testsh"&gt;test.sh&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配列の要素は4つ。2つ目の要素にはスペースを含んだ文字列が格納されている。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -a &lt;span class="nv"&gt;SUBLIST1&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;a b&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配列の要素は3つ。3つ目の要素にはスペースを含んだ文字列が格納されている。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -a &lt;span class="nv"&gt;SUBLIST2&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;d e f&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MAINLIST&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SUBLIST1&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SUBLIST2&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一行ずつ出力してみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; I in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MAINLIST&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;I&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行権限を付与し実行してみます。&lt;/p&gt;</description></item><item><title>Bash組み込みの正規表現機能を利用してファイルパスを要素に分割してみる</title><link>https://genzouw.com/entry/2020/10/14/233709/2088/</link><pubDate>Wed, 14 Oct 2020 23:37:09 +0900</pubDate><guid>https://genzouw.com/entry/2020/10/14/233709/2088/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bash には正規表現を使ったマッチ判定機能やマッチグループ文字列を取得する機能が組み込まれています。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;grep&lt;/code&gt; や &lt;code&gt;sed&lt;/code&gt; を利用すれば同様の機能は実現できるため、あまりお目にかかる機会は少ないですが、触ってみます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aarch64 aarch64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu Kinetic Kudu (development branch)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.10&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.2.0&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;aarch64-unknown-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="拡張子付きのファイルフルパスを受け取り分割してみる"&gt;拡張子付きのファイルフルパスを受け取り分割してみる&lt;/h2&gt;&#10;&lt;p&gt;早速 Bash 組み込みの正規表現機能を利用してみます。&#10;サンプルプログラムを作り動作を見ていきます。&lt;/p&gt;&#10;&lt;p&gt;ここでは「拡張子付きのファイル」のフルパスを引数で受け取ると、以下の情報に分割して出力する処理を記述します。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;フルパス&lt;/li&gt;&#10;&lt;li&gt;親ディレクトリパス&lt;/li&gt;&#10;&lt;li&gt;ファイル名&lt;/li&gt;&#10;&lt;li&gt;拡張子なしファイル名&lt;/li&gt;&#10;&lt;li&gt;拡張子&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;出来上がったコードは以下になります。&lt;/p&gt;&#10;&lt;h2 id="正規表現を使った-bash-サンプルコード-regexp_samplesh"&gt;正規表現を使った Bash サンプルコード regexp_sample.sh&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o noclobber&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 正規表現を利用した関数&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; analyze_filepath&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ ^&lt;span class="o"&gt;(&lt;/span&gt;.*/&lt;span class="o"&gt;)(([&lt;/span&gt;^.&lt;span class="o"&gt;]&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="se"&gt;\.&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;.*&lt;span class="o"&gt;))&lt;/span&gt;$ &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[ERROR] The file path does not contain an extension.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BASH_REMATCH&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# いくつかのパラメータで動作確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;analyze_filepath &lt;span class="s2"&gt;&amp;#34;/a/b/c/xxx.txt&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;analyze_filepath &lt;span class="s2"&gt;&amp;#34;/yyy.sh&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;analyze_filepath &lt;span class="s2"&gt;&amp;#34;/a/b/c/zzz.1.2.js&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;analyze_filepath &lt;span class="s2"&gt;&amp;#34;/a/b/c/Dockerfile&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;regexp_sample.sh&lt;/code&gt; というファイルを作成し、上記の内容を記述し保存します(&lt;code&gt;chmod +x regexp_sample.sh&lt;/code&gt; を実行し、権限を付与しておくことを忘れないこと)。&lt;/p&gt;</description></item><item><title>DockerfileでENTRYPOINT、CMDを指定した時のベースイメージの挙動はどう変わるか</title><link>https://genzouw.com/entry/2020/10/06/223058/2077/</link><pubDate>Tue, 06 Oct 2020 22:30:58 +0900</pubDate><guid>https://genzouw.com/entry/2020/10/06/223058/2077/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;先日投稿した以下のエントリは、今回のエントリを投稿するための前提知識になっています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2020/10/02/000810/2075/"&gt;DockerfileでENTRYPOINT、CMDの挙動を動かしながら理解する | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;em&gt;前提知識を整理しておきたかったためにまとめたものになっています。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;僕らが &lt;code&gt;Dockerfile&lt;/code&gt; を記述するときには、一行目に &lt;strong&gt;FROM&lt;/strong&gt; というコマンドを記述します。&#10;これは、Dockerイメージを作成する際に利用する &lt;strong&gt;ベースイメージ&lt;/strong&gt; を指定するための命令となります。&lt;/p&gt;&#10;&lt;p&gt;ベースイメージも &lt;strong&gt;Dockerfile&lt;/strong&gt; からビルドされたDockerイメージであり、 &lt;strong&gt;ENTRYPOINT&lt;/strong&gt; や &lt;strong&gt;CMD&lt;/strong&gt; コマンドが &lt;strong&gt;Dcokerfile&lt;/strong&gt; 内に記述されている場合があるわけです。&lt;/p&gt;&#10;&lt;p&gt;自分で作成するDockerfileに &lt;strong&gt;ENTRYPOINT&lt;/strong&gt; や &lt;strong&gt;CMD&lt;/strong&gt; コマンドを記述した場合、それらはベースイメージの &lt;strong&gt;ENTRYOPTION&lt;/strong&gt; や &lt;strong&gt;CMD&lt;/strong&gt; とどう連携して動作するのでしょうか？&lt;/p&gt;&#10;&lt;p&gt;実験してみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 19.03.13, build 4484c46d9d&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実験の流れ"&gt;実験の流れ&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;ENTRYPOINT&lt;/strong&gt; ／ &lt;strong&gt;CMD&lt;/strong&gt; コマンドをそれぞれ設定した &lt;strong&gt;Dockerfile&lt;/strong&gt; を作成・ビルドし、作成されたDockerイメージを実行してみる&lt;/li&gt;&#10;&lt;li&gt;(1)で作成したDockerイメージを「ベースイメージ」とした &lt;strong&gt;Dockerfile&lt;/strong&gt; を作成・ビルドし、作成されたDockerイメージを実行してみる。作成するDockerfileは以下の4つのパターンとする&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;ENTRYPOINT&lt;/strong&gt;、&lt;strong&gt;CMD&lt;/strong&gt; の両方を設定しない&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ENTRYPOINT&lt;/strong&gt;、&lt;strong&gt;CMD&lt;/strong&gt; の両方を設定する&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ENTRYPOINT&lt;/strong&gt; だけ設定する&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;CMD&lt;/strong&gt; だけ設定する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="親となるdockerfileの作成ビルド実行"&gt;親となるDockerfileの作成・ビルド・実行&lt;/h2&gt;&#10;&lt;p&gt;まずは &lt;strong&gt;親&lt;/strong&gt; となるDockerfileを作成します。&lt;/p&gt;</description></item><item><title>DockerfileでENTRYPOINT、CMDの挙動を動かしながら理解する</title><link>https://genzouw.com/entry/2020/10/02/000810/2075/</link><pubDate>Fri, 02 Oct 2020 00:08:10 +0900</pubDate><guid>https://genzouw.com/entry/2020/10/02/000810/2075/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Dockerfile内で指定可能なコマンドはいくつかありますが、 &lt;strong&gt;ENTRYPOINT&lt;/strong&gt; コマンドと &lt;strong&gt;CMD&lt;/strong&gt; コマンドは初見ではわかりくいコマンドとなっています。&lt;/p&gt;&#10;&lt;p&gt;この2つのコマンドが、Dockerコンテナの実行にどのように影響するか、実行させながら理解していきたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 19.03.13-beta2, build ff3fbc9d55&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="dockerイメージ実行時の実行コマンドの組み立てロジック"&gt;Dockerイメージ実行時の実行コマンドの組み立てロジック&lt;/h2&gt;&#10;&lt;p&gt;今回は結論から入ります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Dockerイメージ内で実行されるコマンド&lt;/strong&gt; は、以下の3つの要素を使って組み立てられます。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Dockerfile内の &lt;strong&gt;ENTRYPOINTの設定値&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;docker run IMAGE_NAME&lt;/code&gt; コマンド実行時の &lt;strong&gt;コマンドライン引数&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Dockerfile内の &lt;strong&gt;CMDの設定値&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;2と3の両方が設定されている場合は、 &lt;strong&gt;2が優先され、3は無視&lt;/strong&gt; されます。&lt;/p&gt;&#10;&lt;p&gt;結果、 &lt;strong&gt;Dockerイメージ内で実行されるコマンド&lt;/strong&gt; は以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;ENTRYPOINTの設定値&amp;gt; &amp;lt;コマンドライン引数&lt;span class="p"&gt;|&lt;/span&gt;CMDの設定値&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;具体的な例を見ていきたいと思います。&lt;/p&gt;&#10;&lt;h2 id="dockerfileに-entrypoint-と-cmd-の両方が指定されている場合"&gt;Dockerfileに &lt;strong&gt;ENTRYPOINT&lt;/strong&gt; と &lt;strong&gt;CMD&lt;/strong&gt; の両方が指定されている場合&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;ENTRYPOINT&lt;/strong&gt; と &lt;strong&gt;CMD&lt;/strong&gt; の両方が指定されたDockerfileから、Dockerイメージを作成してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Dockerfileを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;Dockerfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;FROM alpine:3.11.3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ENTRYPOINT [&amp;#34;seq&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;CMD [&amp;#34;1&amp;#34;, &amp;#34;5&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# my_docker_image_01 という名前のDockerイメージを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker build -t my_docker_image_01 .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="dockerイメージを実行-コマンドライン引数なし"&gt;Dockerイメージを実行 (コマンドライン引数なし)&lt;/h3&gt;&#10;&lt;p&gt;まずは作成されたDockerイメージを、イメージ名の後方に引数をつけずに実行してみます。&lt;/p&gt;</description></item><item><title>.bashrcや.zshrcに定義した関数を他のシェルスクリプトから呼び出す</title><link>https://genzouw.com/entry/2020/09/30/233433/2074/</link><pubDate>Wed, 30 Sep 2020 23:34:33 +0900</pubDate><guid>https://genzouw.com/entry/2020/09/30/233433/2074/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Unix系OSで日頃よく使うコマンドは、 &lt;code&gt;.bashrc&lt;/code&gt; や &lt;code&gt;.zshrc&lt;/code&gt; に &lt;strong&gt;alias&lt;/strong&gt; や &lt;strong&gt;function&lt;/strong&gt; を定義しておき、コマンドラインから呼び出すことだと思います。&lt;/p&gt;&#10;&lt;p&gt;僕も &lt;code&gt;.bashrc&lt;/code&gt; や &lt;code&gt;.bashrc&lt;/code&gt; に自分のお気に入りのエイリアスや関数を定義していますが、この関数を別のシェルスクリプトから呼び出したいというシーンが有りました。&lt;/p&gt;&#10;&lt;p&gt;ちょっと工夫をしないと呼び出せなかったこともあり、やり方を掲載したいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まずは-bashrc-に関数を定義してみる"&gt;まずは &lt;code&gt;.bashrc&lt;/code&gt; に関数を定義してみる&lt;/h2&gt;&#10;&lt;p&gt;まずは自分の &lt;code&gt;.bashrc&lt;/code&gt; に関数を定義してみます。&#10;ただ渡された引数を出力するだけの &lt;strong&gt;print_params&lt;/strong&gt; という、関数です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;&amp;gt;~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;print_params() {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo &amp;#34;parms are ${@}.&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;.bashrc&lt;/code&gt; に追加した関数は以下のいずれかの方法で反映できます。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ログインし直す&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;bash&lt;/code&gt; コマンドを実行し、シェルを新しいプロセスで立ち上げる&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;. ~/.bashrc&lt;/code&gt; コマンドを実行し、現在事項中プロセスのシェルに関数を反映させる&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;今回は3つめの方法で反映させます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ . ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;関数が作成されたかどうか確認してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 指定された名前が関数かどうかを確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;type&lt;/span&gt; print_params&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print_params is a &lt;span class="k"&gt;function&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;print_params &lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;parms are &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 関数を実行してみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ print_params &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;parms are &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; 3.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正しく関数が作成されました。&#10;ここからは、作成された関数を他のシェルから呼び出してみます。&lt;/p&gt;</description></item><item><title>シェルスクリプトのシバン(Shebang)にシェル以外のコマンドを記述したらどうなるのか？</title><link>https://genzouw.com/entry/2020/09/27/231631/2073/</link><pubDate>Sun, 27 Sep 2020 23:16:31 +0900</pubDate><guid>https://genzouw.com/entry/2020/09/27/231631/2073/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;UNIX 上で動作するスクリプトは、1 行目に &lt;code&gt;#!&lt;/code&gt; から始まる 1 行を記述します。&#10;これによりスクリプトの実行系を認識させることができます。&lt;/p&gt;&#10;&lt;p&gt;シェルスクリプトの場合は &lt;code&gt;#!/bin/sh&lt;/code&gt; 、 &lt;code&gt;#!/usr/bin/bash&lt;/code&gt; 、 &lt;code&gt;#!/usr/bin/env bash&lt;/code&gt; と記述します。&lt;/p&gt;&#10;&lt;p&gt;Ruby スクリプトの場合は &lt;code&gt;#!/usr/bin/ruby&lt;/code&gt; 、 &lt;code&gt;#!/usr/bin/env ruby&lt;/code&gt; と記述することが多いでしょう。&lt;/p&gt;&#10;&lt;p&gt;この 1 行目の記述のことを「 &lt;strong&gt;シバン&lt;/strong&gt; 」とか「 &lt;strong&gt;Shebang&lt;/strong&gt; 」と呼びますが、今ひとつこのあたりの仕組が理解できてなかったため、シバンでいろいろ遊んでみることにしました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.17&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.4.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実験-1-binrm-と記述し実行してみる"&gt;(実験 1) &lt;code&gt;#!/bin/rm&lt;/code&gt; と記述し実行してみる&lt;/h2&gt;&#10;&lt;p&gt;突然ですが、 &lt;strong&gt;シバン&lt;/strong&gt; の挙動を理解するために実験をしてみます。&lt;/p&gt;&#10;&lt;p&gt;一行目に &lt;code&gt;#!/bin/rm&lt;/code&gt; とだけ記述されたシェルスクリプトを作成してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; test.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/bin/rm&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 内容が正しいかを確認してみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat test.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#!/bin/rm&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 実行権限を付与&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod +x test.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# カレントディレクトリを確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -la&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;total &lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;3&lt;/span&gt; root root &lt;span class="m"&gt;96&lt;/span&gt; Sep &lt;span class="m"&gt;27&lt;/span&gt; 13:46 .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;4096&lt;/span&gt; Sep &lt;span class="m"&gt;27&lt;/span&gt; 13:34 ..&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rwx--x--x &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;10&lt;/span&gt; Sep &lt;span class="m"&gt;27&lt;/span&gt; 13:47 test.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;作成したスクリプトを以下のように実行してみます。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで連想配列をJSONに変換し出力する方法</title><link>https://genzouw.com/entry/2020/09/25/080010/2071/</link><pubDate>Fri, 25 Sep 2020 08:00:10 +0900</pubDate><guid>https://genzouw.com/entry/2020/09/25/080010/2071/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bashでは、 &lt;code&gt;declare&lt;/code&gt; コマンドを利用して連想配列変数を宣言することが可能です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;参考 : &lt;a href="https://genzouw.com/entry/2019/01/30/081600/688/#toc_id_2_1"&gt;Bashのビルトインコマンド “declare” の使い方紹介（その１） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;シェル内で定義した連想配列をJSONに変換し出力したいと思いましたが、どのように記述したらよいか悩んだためまとめました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="事前準備"&gt;事前準備&lt;/h2&gt;&#10;&lt;p&gt;今回は、 &lt;code&gt;jq&lt;/code&gt; コマンドを利用してJSON変換を実現してみたいと思います。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/stedolan/jq"&gt;GitHub - stedolan/jq: Command-line JSON processor&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;事前にインストールしておきましょう。&lt;/p&gt;&#10;&lt;h2 id="コードサンプル"&gt;コードサンプル&lt;/h2&gt;&#10;&lt;p&gt;事前に &lt;code&gt;declare -A&lt;/code&gt; コマンドで宣言した連想配列に値を詰め込んでおき、 &lt;code&gt;jq&lt;/code&gt; を使ってJSONオブジェクトに変換してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 返送配列変数を定義&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -A MAP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 連想配列に値をセット&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ MAP&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;key1&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ MAP&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;key2&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ MAP&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;key3&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;hoge&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ MAP&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;key4&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# JSON変換&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;for&lt;/span&gt; i in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;!MAP[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 奇数行にキーを、偶数行に値を出力し、jqコマンドに食わせる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MAP&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -c -n -R &lt;span class="s1"&gt;&amp;#39;reduce inputs as $i ({}; . + { ($i): (input|(tonumber? // .)) })&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は以下のようになります。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで連番付きファイル名の次の連番を算出する</title><link>https://genzouw.com/entry/2020/09/24/221756/2070/</link><pubDate>Thu, 24 Sep 2020 22:17:56 +0900</pubDate><guid>https://genzouw.com/entry/2020/09/24/221756/2070/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;特定のフォルダにファイルが配置されており、これら全てに通し連番が付与されているとします。&lt;/p&gt;&#10;&lt;p&gt;例えば、以下のようにゼロフィルされた3桁の通し連番が付与されているようなファイルが可能されている場合などが考えられます。&#10;（ファイル名でソートできるため、このようなケースはよくあるケースかと思います。）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;001_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;002_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;003_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;004_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;005_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;006_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;007_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;008_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;009_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;010_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;011_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;012_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;013_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;014_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;015_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;さて、ここで新しいファイルを作成する場合は &lt;code&gt;016_xxx.txt&lt;/code&gt; というファイル名を算出しなければなりませんが、シェルで次の通し連番を算出する方法について考えてみます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;まずはテスト環境を用意してみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;003_xxx.txt&lt;/code&gt; から &lt;code&gt;013_xxx.txt&lt;/code&gt; までの11ファイルを作成し、次の通し連番プレフィックスを持つファイルを作成してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch &lt;span class="o"&gt;{&lt;/span&gt;003..013&lt;span class="o"&gt;}&lt;/span&gt;_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -la&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;total &lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;13&lt;/span&gt; root root &lt;span class="m"&gt;416&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;4096&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 ..&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 003_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 004_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 005_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 006_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 007_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 008_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 009_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 010_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 011_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 012_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Sep &lt;span class="m"&gt;24&lt;/span&gt; 12:59 013_xxx.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に作成したいファイル名は &lt;code&gt;014_xxx.txt&lt;/code&gt; となります。&lt;/p&gt;</description></item><item><title>GCPのGoogle Container Registryのイメージを一括削除する方法</title><link>https://genzouw.com/entry/2020/08/13/123526/2057/</link><pubDate>Thu, 13 Aug 2020 12:35:26 +0900</pubDate><guid>https://genzouw.com/entry/2020/08/13/123526/2057/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;GCP上の &lt;strong&gt;Google Container Registry&lt;/strong&gt; 内に不要なDockerイメージがあるため、削除したいと思いました。&lt;/p&gt;&#10;&lt;p&gt;Dockerイメージを削除するためには、すべてのタグ（というかハッシュ。ビルド履歴）を削除する必要がありmさう。&lt;/p&gt;&#10;&lt;p&gt;対象のDockerイメージに4000以上のタグが付与されているため、できる限り一括かつ並列で削除擦る方法を探してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.17&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.4.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ xargs --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xargs &lt;span class="o"&gt;(&lt;/span&gt;GNU findutils&lt;span class="o"&gt;)&lt;/span&gt; 4.7.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;GCP上のリソースをコマンドラインから操作するためのツールとして &lt;code&gt;gcloud&lt;/code&gt; コマンドがあります。&#10;事前にこちらのコマンドをインストールし、 &lt;code&gt;gcloud auth login&lt;/code&gt; などで認証を完了しておきましょう。&lt;/p&gt;&#10;&lt;p&gt;正しく準備ができていれば、以下のコマンドが動作するはずです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Google Container Registryからイメージの一覧を取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gcloud container images list&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="結果"&gt;結果&lt;/h2&gt;&#10;&lt;p&gt;準備ができれば、後は以下のコマンドを実行するだけです。&#10;以下の2つの環境変数はご自分のGCP設定に合わせて書き換えてください。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;GCP_PROJECT_ID&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;GCP_DOCKER_IMAGE_NAME&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;GCP_PROJECT_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;YOUR_GCP_PROJECT_ID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;GCP_DOCKER_IMAGE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;gcr.io/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GCP_PROJECT_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/YOUR_DOCKER_IMAGE_NAME&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gcloud &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; container images list-tags &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GCP_DOCKER_IMAGE_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed 1d &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ print $1 }&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs -P4 -n &lt;span class="m"&gt;1&lt;/span&gt; -I&lt;span class="o"&gt;{}&lt;/span&gt; gcloud container images delete &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GCP_DOCKER_IMAGE_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;@sha256:&lt;span class="o"&gt;{}&lt;/span&gt; --quiet --force-delete-tags&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでは、 &lt;code&gt;xargs&lt;/code&gt; の &lt;code&gt;-P&lt;/code&gt; パラメータで &lt;strong&gt;4並列実行しています&lt;/strong&gt; 。&#10;マシンリソースに自身があるなら &lt;code&gt;-P0&lt;/code&gt; として、CPUを目一杯使うことができます。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプト上での"[..]"と"[[..]]"の違い</title><link>https://genzouw.com/entry/2020/06/09/083836/2041/</link><pubDate>Tue, 09 Jun 2020 08:38:36 +0900</pubDate><guid>https://genzouw.com/entry/2020/06/09/083836/2041/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bash上で作業を行ったり、Bashのシェルスクリプトを書いたりする場合に条件分岐を使うケースがあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;if [ -f $FILE ]; then&lt;/code&gt; と記述する場合もあれば、 &lt;code&gt;if [[ -f $FILE ]]; then&lt;/code&gt; のように &lt;strong&gt;[&lt;/strong&gt; を2つ続けて記述する場合もあります。&#10;両者の違いについて、知っている範囲でまとめました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="かんたんな文字列比較処理を書いてみる"&gt;かんたんな文字列比較処理を書いてみる&lt;/h2&gt;&#10;&lt;p&gt;変数 &lt;code&gt;X&lt;/code&gt; の値が想定通りの場合に &lt;code&gt;ok&lt;/code&gt; と出力するだけのかんたんな条件分岐を記述してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変数を作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1223&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# [...] を使用するケース&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1223&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; ok&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ok&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# [[...]] を使用するケース&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1223&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; ok&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ok&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに、上記の処理は以下と同義です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1223&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; ok&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;[...]&lt;/code&gt; を使用した場合も &lt;code&gt;[[...]]&lt;/code&gt; を使用した場合もこの場合には結果は変わりません。&lt;/p&gt;&#10;&lt;p&gt;限られた条件における挙動の違い( &lt;strong&gt;後述&lt;/strong&gt; )はありますが、基本的に同じように利用できます。&lt;/p&gt;</description></item><item><title>Crontabにシステム起動時に1度だけコマンドが実行されるように設定する方法</title><link>https://genzouw.com/entry/2020/06/05/084536/2040/</link><pubDate>Fri, 05 Jun 2020 08:45:36 +0900</pubDate><guid>https://genzouw.com/entry/2020/06/05/084536/2040/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;man 5 crontab&lt;/code&gt; を読んでいてたまたま見つけたので紹介。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;crontab&lt;/strong&gt; の実装の違いにより使える、使えないがあるが、システム起動時に 1 度だけコマンドが実行されるような設定をかんたんに追加できます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 unknown GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="man-ページに書かれている"&gt;man ページに書かれている&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;man 5 crontab&lt;/code&gt; をしたところ以下のように記述されています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; string meaning&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ------ -------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @reboot Run once, at startup.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @yearly Run once a year, &amp;#34;0 0 1 1 *&amp;#34;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @annually (same as @yearly)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @monthly Run once a month, &amp;#34;0 0 1 * *&amp;#34;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @weekly Run once a week, &amp;#34;0 0 * * 0&amp;#34;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @daily Run once a day, &amp;#34;0 0 * * *&amp;#34;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @midnight (same as @daily)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; @hourly Run once an hour, &amp;#34;0 * * * *&amp;#34;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Please note that startup, as far as @reboot is concerned, is the time when the cron(8) daemon startup. In particular, it may be before some system&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; daemons, or other facilities, were startup. This is due to the boot order sequence of the machine.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;crontab&lt;/code&gt; の各行の左 5 列は時間指定のために使われますが（ ex: &lt;code&gt;0 12 * * * echo hoge&lt;/code&gt; で「毎日 12:00 に echo hoge を実行」 ）、この部分に &lt;code&gt;@reboot&lt;/code&gt; と記述することでサーバ再起動時に 1 回だけ実行されるような設定ができます。&lt;/p&gt;</description></item><item><title>`rbenv install` / `nodenv install` だけで適切なバージョンがインストールされる</title><link>https://genzouw.com/entry/2020/06/02/161539/2031/</link><pubDate>Tue, 02 Jun 2020 16:15:39 +0900</pubDate><guid>https://genzouw.com/entry/2020/06/02/161539/2031/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;プロジェクトディレクトリ直下に &lt;code&gt;.ruby-version&lt;/code&gt; / &lt;code&gt;.node-version&lt;/code&gt; を配置することで、 自動的に &lt;code&gt;rbenv&lt;/code&gt; や &lt;code&gt;nodeenv&lt;/code&gt; コマンドが適切なバージョンの &lt;code&gt;ruby&lt;/code&gt; / &lt;code&gt;node&lt;/code&gt; を利用するように切り替えてくれます。&lt;/p&gt;&#10;&lt;p&gt;ただし、環境セットアップドキュメントに &lt;code&gt;rbenv install 2.7.1&lt;/code&gt; / &lt;code&gt;nodenv install 12.13.11&lt;/code&gt; のようにバージョンが記載されていた場合、ドットファイルとの乖離が生まれてしまいます。&lt;/p&gt;&#10;&lt;p&gt;さてどうしたものか、 &lt;code&gt;rbenv install $(cat .ruby-version)&lt;/code&gt; とでも書いておこうと思いましたがもっとかんたんな方法がありました。&#10;（おそらくRuby使いには初歩的なことなのでしょうね）&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.17&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin19.4.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前提"&gt;前提&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;rbenv&lt;/code&gt; がインストールされていること&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;nodenv&lt;/code&gt; がインストールされていること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="rbenv-install--nodenv-install-だけでよい"&gt;&lt;code&gt;rbenv install&lt;/code&gt; / &lt;code&gt;nodenv install&lt;/code&gt; だけでよい&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbenv install &lt;span class="k"&gt;$(&lt;/span&gt;cat .ruby-version&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;というややこしい構文を書こうとしていましたが、試してみると以下のコマンドでもドットファイルを読み込んで適当なバージョンをインストールしてくれるようでした。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rbenv install &lt;span class="c1"&gt;# バージョン指定はどうやら不要&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;rbenv&lt;/code&gt; 同様、 &lt;code&gt;nodenv&lt;/code&gt; も以下のコマンドで正しいバージョンがインストールされました。&lt;/p&gt;</description></item><item><title>Chromeの開発者ツールのコンソールタブで`$`が使える（jQueryがインストールされていないのに）</title><link>https://genzouw.com/entry/2020/05/26/130429/2028/</link><pubDate>Tue, 26 May 2020 13:04:29 +0900</pubDate><guid>https://genzouw.com/entry/2020/05/26/130429/2028/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;ChromeでjQueryを使用していないページを開デバッグしている時の話です。&#10;開発者ツールの「コンソール」パネルを開きながら &lt;code&gt;$&lt;/code&gt; を入力すると、何やらオートコンプリート機能により候補がでてきます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1u2OXnDq_ClSrrtMUY16w-79L7j3bgc5H" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;$(&amp;quot;body&amp;quot;)&lt;/code&gt; と入力するとオブジェクトが取得できています。&lt;/p&gt;&#10;&lt;p&gt;ずっと不思議に思ってはいたのですが、調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Version 81.0.4044.138 &lt;span class="o"&gt;(&lt;/span&gt;Official Build&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;64-bit&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1UU9ZzbMOsmLwZzIkWC-oTIZk11HI8Nii" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="chromeの開発者ツール独自の機能だった"&gt;Chromeの開発者ツール独自の機能だった&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://developers.google.com/web/tools/chrome-devtools/console/utilities?hl=ja"&gt;Chromeの開発者ツール、特にコンソールページに関するドキュメントサイト&lt;/a&gt;にかかれていました。&lt;/p&gt;&#10;&lt;p&gt;上記のサイトを参考に &lt;code&gt;$&lt;/code&gt; に関わる機能を見ていきます。&lt;/p&gt;&#10;&lt;h2 id="_"&gt;$_&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;$_&lt;/code&gt; は最後に評価された式の値を返却する変数です。&lt;/p&gt;&#10;&lt;p&gt;「コンソール」パネルに &lt;code&gt;2+2&lt;/code&gt; と入力し、Enterキーを押しましょう。&#10;式が &lt;strong&gt;4&lt;/strong&gt; と評価されていることがわかります。&lt;/p&gt;&#10;&lt;p&gt;この直後に &lt;code&gt;$_&lt;/code&gt; と入力し、Enterキーを押しましょう。&#10;&lt;code&gt;$_&lt;/code&gt; 入力直前の式の実行結果である &lt;strong&gt;4&lt;/strong&gt; が表示されます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=13pJqSQs-JdOUf3pf5JujyYEavVIKxJl2" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;2*3&lt;/code&gt; と入力し、Enterキーを押しましょう。 &lt;strong&gt;6&lt;/strong&gt; と評価されます。&#10;&lt;code&gt;$_&lt;/code&gt; の評価結果は先程の &lt;strong&gt;4&lt;/strong&gt; から &lt;strong&gt;6&lt;/strong&gt; に変わっていることがわかります。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1biL_eonhkcKuUxEkG05amCrkPZALnSaH" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;ただの数値に対して利用した場合には便利さがわかりませんが、例えば事前に配列を取得した結果、その長さを確認するといった場合に便利です。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1HXQF7JFlD7H3vXKWZ4bGGEgNsBRIiTd0" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="0---4"&gt;$0 - $4&lt;/h2&gt;&#10;&lt;p&gt;「要素」パネル上でDOM要素が選択できますが、このDOM要素の選択履歴を5つまでさかのぼって参照することができる変数です。&lt;/p&gt;&#10;&lt;p&gt;例えば、事前に「要素」パネルを開き、任意の要素を選択（クリック）します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1PjgQ_xKYOTrRF4WQDimA6TY1bmayN8fn" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;その後「コンソール」パネルを開き、 &lt;code&gt;$0&lt;/code&gt; 変数を参照すると、先程クリックしたDOM要素のHTMLが格納されていることがわかります。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=15Q8M6375-weQPPTXhLnunjwB86Zi2FJR" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;ちなみに、 &lt;code&gt;$1&lt;/code&gt; を参照すると &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; 要素が格納されています。僕が事前に &lt;code&gt;&amp;lt;body&amp;gt;&lt;/code&gt; 要素をクリックしていたためにこのような結果となっています。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;$0 - $4&lt;/code&gt; に対して、プロパティの参照( &lt;em&gt;ex&lt;/em&gt; &lt;code&gt;$0.id&lt;/code&gt; 、 &lt;code&gt;$0.style&lt;/code&gt; )を行うこともできます。&lt;/p&gt;</description></item><item><title>シェルを使って、Gitワークスペース内でリモートリポジトリのURLのみを抽出する</title><link>https://genzouw.com/entry/2020/05/25/141647/2026/</link><pubDate>Mon, 25 May 2020 14:16:47 +0900</pubDate><guid>https://genzouw.com/entry/2020/05/25/141647/2026/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;github.com上のソースコードに対して何らかの作業を実施する際には、まず &lt;code&gt;git clone&lt;/code&gt; を行います。&#10;&lt;code&gt;git clone&lt;/code&gt; したGitワークスペース上でソースを閲覧したりコードを改変します。&#10;この時点で、 &lt;code&gt;origin&lt;/code&gt; リモートリポジトリにプッシュ先のURL情報などが格納されます。&lt;/p&gt;&#10;&lt;p&gt;今回、このGitワークスペースと紐付けられている &lt;code&gt;origin&lt;/code&gt; リモートリポジトリのURL部分を抽出したいと思いました。&lt;/p&gt;&#10;&lt;p&gt;抽出する方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.17&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.7.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="リモートリポジトリの情報をurl部分も含め出力"&gt;リモートリポジトリの情報をURL部分も含め出力&lt;/h2&gt;&#10;&lt;p&gt;リモートリポジトリの情報を一式表示するには以下のコマンドを利用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git remote -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;origin git@github.com:genzouw/ec-cube.git &lt;span class="o"&gt;(&lt;/span&gt;fetch&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;origin git@github.com:genzouw/ec-cube.git &lt;span class="o"&gt;(&lt;/span&gt;push&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;upstream git@github.com:EC-CUBE/ec-cube.git &lt;span class="o"&gt;(&lt;/span&gt;fetch&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;upstream git@github.com:EC-CUBE/ec-cube.git &lt;span class="o"&gt;(&lt;/span&gt;push&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでは、 &lt;code&gt;origin&lt;/code&gt; リモートリポジトリに加えて、 &lt;code&gt;upstream&lt;/code&gt; リモートリポジトリも紐付けられていることがわかります。&lt;/p&gt;&#10;&lt;p&gt;また、URL部分以外も出力されているため、 **URLだけが欲しい場合は余分を除去する必要があります。&lt;/p&gt;&#10;&lt;p&gt;また、便利なコマンドではありますがリモートリポジトリへの通信が発生します。&lt;/p&gt;&#10;&lt;h2 id="リモートリポジトリのurl部分のみを出力"&gt;リモートリポジトリのURL部分のみを出力&lt;/h2&gt;&#10;&lt;p&gt;URL部分だけが欲しい場合には以下のコマンドが利用できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# originリモートリポジトリのURLを出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git remote get-url origin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git@github.com:genzouw/ec-cube.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のコマンドでも同様の結果が取得できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# originリモートリポジトリのURLを出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git config --get remote.origin.url&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git@github.com:genzouw/ec-cube.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを変数に格納し、後の処理で利用したい場合は以下のようにします。&lt;/p&gt;</description></item><item><title>sedを使って条件に一致した行をテンプレートファイルの内容で置き直す</title><link>https://genzouw.com/entry/2020/05/12/080045/1993/</link><pubDate>Tue, 12 May 2020 08:00:45 +0900</pubDate><guid>https://genzouw.com/entry/2020/05/12/080045/1993/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;あまり使うことがない機能ですが、 &lt;code&gt;sed&lt;/code&gt; で特定条件に合致した場合に、テキストファイルの内容を差し込むことができます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;10から30までの数値を行ごとに出力します。&#10;以下のコマンドを利用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;12&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;14&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;15&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;16&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;17&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;18&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;19&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;21&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;22&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;23&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;24&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;25&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;26&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;27&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;28&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;29&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この出力内容のうち、 &lt;code&gt;3&lt;/code&gt; が含まれている行の後ろに任意のテキストファイルの内容を差し込んでみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat template.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;「さん」がふくまれています！&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sed-コマンドの-r-内部コマンドを利用する"&gt;&lt;code&gt;sed&lt;/code&gt; コマンドの &lt;code&gt;r&lt;/code&gt; 内部コマンドを利用する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; コマンドには &lt;code&gt;r&lt;/code&gt; という内部コマンドがあります。&#10;&lt;code&gt;r&lt;/code&gt; の後ろに指定したファイルから内容を読み込んで差し込みます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;/3/r template.txt&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;12&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;「さん」がふくまれています！&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;14&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;15&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;16&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;17&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;18&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;19&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;21&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;22&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;23&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;「さん」がふくまれています！&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;24&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;25&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;26&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;27&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;28&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;29&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;30&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;「さん」がふくまれています！&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;3&lt;/code&gt; が含まれている行の後ろに &lt;code&gt;「さん」がふくまれています！&lt;/code&gt; というテキストが表示されていることがわかります。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで文字列を右(左)からN文字取り出す</title><link>https://genzouw.com/entry/2020/05/11/085323/1992/</link><pubDate>Mon, 11 May 2020 08:53:23 +0900</pubDate><guid>https://genzouw.com/entry/2020/05/11/085323/1992/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトで右からN文字、あるいは左からN文字切り取る方法。&lt;/p&gt;&#10;&lt;p&gt;多くの言語でStringクラスの &lt;code&gt;right()&lt;/code&gt; メソッド、 &lt;code&gt;left()&lt;/code&gt; メソッドとして提供されている機能になります。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cut --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cut &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.32&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed &lt;span class="o"&gt;(&lt;/span&gt;GNU sed&lt;span class="o"&gt;)&lt;/span&gt; 4.8&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cut-を使う方法"&gt;&lt;code&gt;cut&lt;/code&gt; を使う方法&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 左から3文字取り出す&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="m"&gt;0123456789&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -c -3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;012&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 右から3文字取り出す&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="m"&gt;0123456789&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; rev &lt;span class="p"&gt;|&lt;/span&gt; cut -c -3 &lt;span class="p"&gt;|&lt;/span&gt; rev&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;左から切り取る場合は &lt;code&gt;rev&lt;/code&gt; コマンドで一度左右を反転させるのがポイントです。&lt;/p&gt;&#10;&lt;h2 id="head--tail-コマンドを利用する"&gt;&lt;code&gt;head&lt;/code&gt; / &lt;code&gt;tail&lt;/code&gt; コマンドを利用する&lt;/h2&gt;&#10;&lt;p&gt;文字列が改行を含んだ場合、 &lt;code&gt;cut&lt;/code&gt; コマンドでは想定外の挙動をするときがあります。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで数値配列の合計値を算出する</title><link>https://genzouw.com/entry/2020/05/07/102250/1991/</link><pubDate>Thu, 07 May 2020 10:22:50 +0900</pubDate><guid>https://genzouw.com/entry/2020/05/07/102250/1991/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bash シェルスクリプトでは &lt;code&gt;type&lt;/code&gt; または &lt;code&gt;declare&lt;/code&gt; コマンドを利用することで配列変数を宣言できます。&lt;/p&gt;&#10;&lt;p&gt;この「配列変数」の合計値を算出する簡単な方法は無いか考えたことを公開します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="方法-1---ループする方法"&gt;方法 1 - ループする方法&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -a &lt;span class="nv"&gt;NUMS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;SUM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;for&lt;/span&gt; N in &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NUMS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;SUM&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;N&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$SUM&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;15&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は &lt;strong&gt;15&lt;/strong&gt; となります。&lt;/p&gt;&#10;&lt;h2 id="方法-2---awk-を使う"&gt;方法 2 - &lt;code&gt;awk&lt;/code&gt; を使う&lt;/h2&gt;&#10;&lt;p&gt;合計、件数、平均といった計算に汎用的に利用できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -a &lt;span class="nv"&gt;NUMS&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;NUMS&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ for (i=1; i&amp;lt;=NF; i++) { sum+=$i } } END { print sum }&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;15&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;列単位のループが嫌な場合には、 &lt;code&gt;awk&lt;/code&gt; のデフォルトの行区切り文字 &lt;code&gt;RS = &amp;quot;\n&amp;quot;&lt;/code&gt; をスペースに変更します。&lt;/p&gt;</description></item><item><title>Dockerを使ってRailsアプリケーションの作成・起動を行う</title><link>https://genzouw.com/entry/2020/05/05/223722/1983/</link><pubDate>Tue, 05 May 2020 22:37:22 +0900</pubDate><guid>https://genzouw.com/entry/2020/05/05/223722/1983/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;いままで &lt;strong&gt;Ruby on Rails&lt;/strong&gt; については触れたことはなかったのですが、習得の必要性が生まれたためチュートリアルをはじめました。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;rails&lt;/code&gt; コマンドを実行するための環境セットアップに随分時間がかかってしまったため、&#10;整備して次回からはまらないようにしたいと思いエントリを投稿しました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 19.03.8, build afacb8b&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;タイトル通り、今回は &lt;strong&gt;Docker&lt;/strong&gt; を利用してアプリケーションの新規作成や起動を行うため、 &lt;strong&gt;Docker&lt;/strong&gt; をインストールしておきましょう。（ここではDockerのインストール方法は取り上げません。）&lt;/p&gt;&#10;&lt;h2 id="rails-コマンド実行用のdockerイメージ"&gt;&lt;code&gt;rails&lt;/code&gt; コマンド実行用のDockerイメージ&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;rails&lt;/code&gt; コマンドを簡単に実行するためのDockerイメージを自作し公開しています。&#10;こちらを利用したいと思います。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://hub.docker.com/r/genzouw/rails"&gt;Docker Hub - genzouw/rails&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;以下のコマンドを実行し、バージョンが表示されればDockerイメージを利用する準備は完了です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Railsバージョンは5.2.3としています。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 別のバージョンを利用したい場合はDockerイメージタグの値を変更してください。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm genzouw/rails:5.2.3 rails --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Rails 5.2.3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アプリケーションの作成"&gt;アプリケーションの作成&lt;/h2&gt;&#10;&lt;p&gt;アプリケーションを作成するには &lt;code&gt;rails new&lt;/code&gt; コマンドを実行します。&#10;先程のDockerイメージを使って、 &lt;code&gt;rails new&lt;/code&gt; コマンドを実行します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;rails-tutorial&lt;/strong&gt; というアプリケーション名で作成します。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;docker run&lt;/code&gt; コマンドのオプションについて補足しておきます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;--rm&lt;/code&gt; オプションは実行後にDockerコンテナ内のファイル変更内容を残さないオプションです。&#10;&lt;ul&gt;&#10;&lt;li&gt;あってもなくても良いのですが、PCの不要なディスク消費を抑えるために付与。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-v $PWD:/app:cached&lt;/code&gt; オプションで、カレントディレクトリをコンテナの &lt;code&gt;/app&lt;/code&gt; ディレクトリにマウントします。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;--workdir /app&lt;/code&gt; オプションで、コンテナ内のカレントディレクトリを &lt;code&gt;/app&lt;/code&gt; ディレクトリとします。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm -v &lt;span class="nv"&gt;$PWD&lt;/span&gt;:/app:cached --workdir /app &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; genzouw/rails:5.2.3 &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; rails new rails-tutorial&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;問題なくアプリケーションを作成できたら、カレントディレクトリを変更しておきます。&lt;/p&gt;</description></item><item><title>シェルスクリプトで`while read`ループすると最終行が読み込まれない場合への対処</title><link>https://genzouw.com/entry/2020/04/15/140408/1972/</link><pubDate>Wed, 15 Apr 2020 14:04:08 +0900</pubDate><guid>https://genzouw.com/entry/2020/04/15/140408/1972/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトでファイルの各行に対して複雑なロジックを書かざるを得ない場合、&#10;&lt;code&gt;while read&lt;/code&gt; を使って一行ずつ読み込む処理を騎獣します。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;echo&lt;/code&gt; や &lt;code&gt;cat&lt;/code&gt; を使ってファイルを作成した場合はファイルの末尾に必ず改行コード（LF）が付与されますが、&#10;少々変わったファイルの作り方をすると改行コードが付与されないことがあります。&#10;（どきどきチームで開発しているソースコードにもこういうファイルが紛れ込むケースもありますね。）&lt;/p&gt;&#10;&lt;p&gt;そんなファイルを &lt;code&gt;while read&lt;/code&gt; する場合に最終行がループ処理の対象にならない、とハマりがちなので対処法をまとめます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.7.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="普通に作成したファイルを-while-read-して一行ずつ読み込んでみる"&gt;普通に作成したファイルを &lt;code&gt;while read&lt;/code&gt; して一行ずつ読み込んでみる&lt;/h2&gt;&#10;&lt;p&gt;普通に作成したファイルを &lt;code&gt;while read&lt;/code&gt; して一行ずつ読み込む場合、&#10;以下のようなコードになるかと思います。&lt;/p&gt;&#10;&lt;p&gt;( &lt;code&gt;IFS=&lt;/code&gt; を付与しないと、 &lt;code&gt;read&lt;/code&gt; 時に行頭・行末のスペースが除去されてしまいます。 &lt;code&gt;-r&lt;/code&gt; オプションがないと各行末に &lt;code&gt;\&lt;/code&gt; があった場合におかしな挙動をしてしまいます。 )&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 後述するケースにつながるため、あえてちょっと変わった書き方で echo しています。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; bbb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;ccc&amp;#34;&lt;/span&gt; &amp;gt;test1.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイルの中身は3行となっています。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat test1.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bbb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ccc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一行ずつ読み込んでみます&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat test1.txt &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; -r LINE&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LINE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bbb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ccc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;問題なく3行とも読み込めました。&lt;/p&gt;</description></item><item><title>DockerでPostgreSQL公式イメージを起動する際にスロークエリ出力を有効にする</title><link>https://genzouw.com/entry/2020/04/09/080039/1964/</link><pubDate>Thu, 09 Apr 2020 08:00:39 +0900</pubDate><guid>https://genzouw.com/entry/2020/04/09/080039/1964/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;特にDocker ComposeでPostgreSQL公式イメージを利用しようと思った場合に、&lt;code&gt;postgresql.conf&lt;/code&gt; を編集せずにスロークエリログの出力を有効にする方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 19.03.8, build afacb8b&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-compose --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-compose version 1.25.4, build 8d51620a&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="普通にpostgresqlを起動した場合"&gt;普通にPostgreSQLを起動した場合&lt;/h2&gt;&#10;&lt;h3 id="起動"&gt;起動&lt;/h3&gt;&#10;&lt;p&gt;まずは普通にPostgreSQLを起動してみます。&lt;/p&gt;&#10;&lt;p&gt;PostgreSQLを起動する場合、通常は &lt;code&gt;docker run -d&lt;/code&gt; というように &lt;code&gt;-d&lt;/code&gt; オプションを付与してデーモン起動させます。&lt;/p&gt;&#10;&lt;p&gt;ただし、今回はログを意図的に表示させたいこともあり &lt;code&gt;-d&lt;/code&gt; オプションを付けずに起動します。&#10;PostgreSQLイメージでは以下の環境変数3つは起動に必須です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;POSTGRES_PASSWORD&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;POSTGRES_USER&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;POSTGRES_DB&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm --name&lt;span class="o"&gt;=&lt;/span&gt;postgres_test &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;testpass &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;POSTGRES_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;testuser &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -e &lt;span class="nv"&gt;POSTGRES_DB&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;testdb &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; postgres:9.6.17&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="アクセスして設定を確認"&gt;アクセスして設定を確認&lt;/h3&gt;&#10;&lt;p&gt;起動したコンテナ上のPostgreSQLデータベースに &lt;code&gt;psql&lt;/code&gt; コマンドを使ってログインしてみます。&#10;&lt;code&gt;docker run&lt;/code&gt; したターミナルとは別に、ターミナルを立ち上げます。（WindowsならコマンドプロンプトあるいはPowerShellになるのかな？）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exec&lt;/span&gt; -i -t postgres_test &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; psql -h localhost -U testuser testdb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;psql &lt;span class="o"&gt;(&lt;/span&gt;9.6.17&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Type &lt;span class="s2"&gt;&amp;#34;help&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; help.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;testdb&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="c1"&gt;# show all;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; name &lt;span class="p"&gt;|&lt;/span&gt; setting &lt;span class="p"&gt;|&lt;/span&gt; description&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&lt;span class="o"&gt;(&lt;/span&gt;一部抜粋&lt;span class="o"&gt;)&lt;/span&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; log_min_duration_statement &lt;span class="p"&gt;|&lt;/span&gt; -1 &lt;span class="p"&gt;|&lt;/span&gt; Sets the minimum execution &lt;span class="nb"&gt;time&lt;/span&gt; above which statements will be logged.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&lt;span class="o"&gt;(&lt;/span&gt;一部抜粋&lt;span class="o"&gt;)&lt;/span&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;psql&lt;/code&gt; 上で &lt;code&gt;show all;&lt;/code&gt; コマンドを実行するとデータベースの設定情報が出力されます。&#10;&lt;strong&gt;log_min_duration_statement&lt;/strong&gt; という設定パラメータの値が、スロークエリログ出力対象の設定値となります。&#10;SQLの実行に &lt;strong&gt;log_min_duration_statement&lt;/strong&gt; の設定値以上の時間がかかった場合、ログ出力されます。&#10;ただし &lt;code&gt;-1&lt;/code&gt; の場合にはスロークエリログは出力されません。&lt;/p&gt;</description></item><item><title>「too many levels of symbolic links」というエラーメッセージについて</title><link>https://genzouw.com/entry/2020/04/08/080021/1963/</link><pubDate>Wed, 08 Apr 2020 08:00:21 +0900</pubDate><guid>https://genzouw.com/entry/2020/04/08/080021/1963/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;僕は出会ったことはないのですが、 &lt;strong&gt;「too many levels of symbolic links」&lt;/strong&gt; というエラーメッセージに遭遇したという話を聞いて再現方法を調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.7.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="エラーを再現させてみる"&gt;エラーを再現させてみる&lt;/h2&gt;&#10;&lt;p&gt;早速再現させてみます。&#10;通常はこんなことは起きないとは思いますが、 &lt;strong&gt;自分自身を参照するシンボリックリンク&lt;/strong&gt; &lt;code&gt;hoge&lt;/code&gt; を作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ln -s hoge hoge&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;total &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lrwxrwxrwx &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;4&lt;/span&gt; Apr &lt;span class="m"&gt;7&lt;/span&gt; 14:33 hoge -&amp;gt; hoge&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このシンボリックリンク &lt;code&gt;hoge&lt;/code&gt; をフォルダとみなして、 &lt;code&gt;hoge/x&lt;/code&gt; というファイルを作成してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch hoge/x&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;touch: cannot touch &lt;span class="s1"&gt;&amp;#39;hoge/x&amp;#39;&lt;/span&gt;: Too many levels of symbolic links&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エラーが再現しました。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;touch&lt;/code&gt; コマンドでなくても同じエラーメッセージが発生します。&lt;/p&gt;</description></item><item><title>treeコマンドでフォルダ構成をツリー表示しつつ所有者・パーミッションを表示</title><link>https://genzouw.com/entry/2020/04/07/232737/1957/</link><pubDate>Tue, 07 Apr 2020 23:27:37 +0900</pubDate><guid>https://genzouw.com/entry/2020/04/07/232737/1957/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Linuxにおける &lt;code&gt;tree&lt;/code&gt; コマンドは、フォルダ構成を視覚的に確認するために便利なコマンドです。&#10;僕は特にドキュメントの作成時に &lt;code&gt;tree&lt;/code&gt; コマンドを利用しフォルダ構成を図示します。&lt;/p&gt;&#10;&lt;p&gt;特定のアプリケーションのセットアップドキュメントを作成する際に、&#10;ツリー構造を表示しつつ想定するパーミッションを表示したい場合がありました。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;tree&lt;/code&gt; コマンドのオプションを付与することでかんたんに実現できました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tree --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tree v1.6.0 &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;1996&lt;/span&gt; - &lt;span class="m"&gt;2011&lt;/span&gt; by Steve Baker, Thomas Moore, Francesc Rocher, Kyosuke Tokoro&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="かんたんなフォルダ構成を作成"&gt;かんたんなフォルダ構成を作成&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;tree&lt;/code&gt; コマンドの動作を見るためにかんたんなフォルダ構成を用意します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 適当にディレクトリを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p aaa bbb ccc/ddd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 適当にファイルも配置&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch aaa/1.txt bbb/2.txt ccc/ddd/3.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果、以下のようなファイルツリーが作成されました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tree&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;-- aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- 1.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt;-- bbb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- 2.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sb"&gt;`&lt;/span&gt;-- ccc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- ddd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- 3.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt; directories, &lt;span class="m"&gt;3&lt;/span&gt; files&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# `ls` コマンドで所有者、パーミッションを確認してみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ find . &lt;span class="p"&gt;|&lt;/span&gt; xargs ls -ld&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxrwxr-x &lt;span class="m"&gt;5&lt;/span&gt; root root &lt;span class="m"&gt;160&lt;/span&gt; Apr &lt;span class="m"&gt;7&lt;/span&gt; 13:39 .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;3&lt;/span&gt; root root &lt;span class="m"&gt;96&lt;/span&gt; Apr &lt;span class="m"&gt;7&lt;/span&gt; 13:40 ./aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Apr &lt;span class="m"&gt;7&lt;/span&gt; 13:40 ./aaa/1.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;3&lt;/span&gt; root root &lt;span class="m"&gt;96&lt;/span&gt; Apr &lt;span class="m"&gt;7&lt;/span&gt; 13:40 ./bbb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Apr &lt;span class="m"&gt;7&lt;/span&gt; 13:40 ./bbb/2.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;3&lt;/span&gt; root root &lt;span class="m"&gt;96&lt;/span&gt; Apr &lt;span class="m"&gt;7&lt;/span&gt; 13:39 ./ccc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;3&lt;/span&gt; root root &lt;span class="m"&gt;96&lt;/span&gt; Apr &lt;span class="m"&gt;7&lt;/span&gt; 13:40 ./ccc/ddd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; root root &lt;span class="m"&gt;0&lt;/span&gt; Apr &lt;span class="m"&gt;7&lt;/span&gt; 13:40 ./ccc/ddd/3.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tree-コマンドの--u-オプション"&gt;&lt;code&gt;tree&lt;/code&gt; コマンドの &lt;code&gt;-u&lt;/code&gt; オプション&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;tree -u&lt;/code&gt; コマンドを利用することで、構造とともに &lt;strong&gt;所有者&lt;/strong&gt; を表示させることができます。&lt;/p&gt;</description></item><item><title>sedで置換処理が行われなかった場合に終了ステータスを0以外にする方法</title><link>https://genzouw.com/entry/2020/04/05/215409/1954/</link><pubDate>Sun, 05 Apr 2020 21:54:09 +0900</pubDate><guid>https://genzouw.com/entry/2020/04/05/215409/1954/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; コマンドで &lt;code&gt;s&lt;/code&gt; 内部コマンドを使って置換処理を行った場合、&#10;条件に該当する文字列が見つからず置換が行われなかったとしても、終了ステータス &lt;code&gt;$?&lt;/code&gt; は &lt;strong&gt;0&lt;/strong&gt; になります。&lt;/p&gt;&#10;&lt;p&gt;実際に置換されたのか？置換されなかったのか？を終了ステータス &lt;code&gt;$?&lt;/code&gt; で判定する方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed &lt;span class="o"&gt;(&lt;/span&gt;GNU sed&lt;span class="o"&gt;)&lt;/span&gt; 4.8&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;h3 id="サンプルテキストデータ"&gt;サンプルテキストデータ&lt;/h3&gt;&#10;&lt;p&gt;動作確認のために置換処理に利用するテキストファイル ( &lt;code&gt;test.txt&lt;/code&gt; ) を作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="sedで置換が行われた場合行われなかった場合の終了コードを確認"&gt;sedで置換が行われた場合、行われなかった場合の終了コードを確認&lt;/h3&gt;&#10;&lt;p&gt;sedで &lt;strong&gt;置換が行われた場合&lt;/strong&gt; の終了ステータスを確認してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed &lt;span class="s1"&gt;&amp;#39;s/ダミー//&amp;#39;&lt;/span&gt; test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;この文章はです。文字の大きさ、量、字間、行間等を確認するために入れています。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;sedで &lt;strong&gt;置換が行われなかった場合&lt;/strong&gt; の終了ステータスを確認してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed &lt;span class="s1"&gt;&amp;#39;s/ジミー//&amp;#39;&lt;/span&gt; test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;この文章はダミーです。文字の大きさ、量、字間、行間等を確認するために入れています。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いずれの場合も、終了コード &lt;code&gt;$?&lt;/code&gt; は &lt;strong&gt;0&lt;/strong&gt; となっています。&lt;/p&gt;&#10;&lt;h2 id="sedで置換が行われたなかった場合の終了コードを-0-以外にする"&gt;sedで置換が行われたなかった場合の終了コードを &lt;strong&gt;0&lt;/strong&gt; 以外にする&lt;/h2&gt;&#10;&lt;p&gt;先程の &lt;code&gt;sed&lt;/code&gt; コマンドを多少変更することで、終了コードを &lt;strong&gt;0&lt;/strong&gt; 以外に変更できます。&lt;br&gt;&#10;ポイントは先程の &lt;code&gt;sed&lt;/code&gt; コマンドの後方に &lt;code&gt;t; q100;&lt;/code&gt; というコマンドが追加されている点です。&#10;これにより、置換処理が行われなかった場合は終了ステータス &lt;code&gt;$?&lt;/code&gt; が &lt;strong&gt;100&lt;/strong&gt; となります。&lt;/p&gt;</description></item><item><title>GitHub CLIを使ってコマンドラインからイシュー、プルリクを検索、表示してみる</title><link>https://genzouw.com/entry/2020/04/03/225419/1952/</link><pubDate>Fri, 03 Apr 2020 22:54:19 +0900</pubDate><guid>https://genzouw.com/entry/2020/04/03/225419/1952/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今年の 2 月に公開されたばかりの &lt;strong&gt;GitHub CLI&lt;/strong&gt; というコマンドラインツールについて使ってみたので紹介してみます。&lt;/p&gt;&#10;&lt;p&gt;今までは &lt;a href="https://github.com/github/hub"&gt;hub&lt;/a&gt;コマンド を使っていましたが、話題になっているぐらいなので比較して有用性が高いはず、と思って使ってみました。&lt;/p&gt;&#10;&lt;p&gt;EC-CUBE の GitHub リポジトリのイシューを覗き見することが最近何度かあったため、イシューを検索、表示してみます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ zsh --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zsh 5.8 &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.7.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;Mac はかんたんですね。&lt;/p&gt;&#10;&lt;p&gt;今日現在、&lt;a href="https://cli.github.com/"&gt;公式ページ&lt;/a&gt;には以下のコマンドでインストールできるとありました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew install github/gh/gh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gh issue list&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;初めてコマンドを実行する場合は、 &lt;strong&gt;GitHub CLI&lt;/strong&gt; が GitHubAPI を呼び出すための権限を付与する必要があるようです。&#10;以下のメッセージが表示されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Notice: authentication required&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Press Enter to open github.com in your browser...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;Enter&lt;/em&gt; キーを押すとブラウザが起動し、以下のようなページが表示されます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1zaiABbtmbjEpvP7wAsDr2k-WE08WT45X" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;GitHub CLI&lt;/strong&gt; のアクセスを許可します。&lt;/p&gt;&#10;&lt;p&gt;実行結果はというと、自分用のプライベートリポジトリに対して実行したため、そもそも &lt;strong&gt;issude&lt;/strong&gt; が存在せず何も表示されませんでした。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;There are no open issues in genzouw/bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;改めて別のリポジトリで実行してみることにします。&lt;/p&gt;</description></item><item><title>ダウンロードしたファイルのハッシュ値を確認するスクリプト</title><link>https://genzouw.com/entry/2020/03/31/090239/1950/</link><pubDate>Tue, 31 Mar 2020 09:02:39 +0900</pubDate><guid>https://genzouw.com/entry/2020/03/31/090239/1950/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;他の方のエントリで、ダウンロードしたファイルのハッシュ値のチェック処理をシェルスクリプトで書かれていたので勉強がてら読んでみました。&#10;自分だったらこう書くかな？という違いが合ったので、良い勉強になりました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.7.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="参考にしたスクリプト"&gt;参考にしたスクリプト&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/tyru/config/blob/bc6679f9f3c273ba756d1da6b45640c9f08967f5/home/bin/check-hash"&gt;config/check-hash at bc6679f9f3c273ba756d1da6b45640c9f08967f5 · tyru/config · GitHub&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;script src="http://gist-it.appspot.com/https://github.com/tyru/config/blob/bc6679f9f3c273ba756d1da6b45640c9f08967f5/home/bin/check-hash"&gt;&lt;/script&gt;&#10;&lt;h2 id="自分だったらこう書くかなという部分を書き換えてました"&gt;自分だったらこう書くかな？という部分を書き換えてました。&lt;/h2&gt;&#10;&lt;p&gt;ファイル名は &lt;code&gt;check-hash&lt;/code&gt; 。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o noclobber&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usage&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;progname&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;basename &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOM&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Usage:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ${progname} hash file&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOM&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;normalize_hash&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sed &lt;span class="s1"&gt;&amp;#39;s/ //g&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;[:lower:]&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[:upper:]&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;detect_algo&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;declare&lt;/span&gt; &lt;span class="nv"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;~ &lt;span class="o"&gt;[&lt;/span&gt;^0-9A-F&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error: hash contains invalid character: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${#&lt;/span&gt;&lt;span class="nv"&gt;hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; in&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 32&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MD5 md5sum&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 40&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;SHA1 sha1sum&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 56&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;SHA224 sha224sum&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 64&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;SHA256 sha256sum&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 96&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;SHA384 sha384sum&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 128&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;SHA512 sha512sum&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; *&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;error: could not detect hash algorithm: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;esac&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;main&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$#&lt;/span&gt; -ne &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; usage&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;declare&lt;/span&gt; &lt;span class="nv"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; normalize_hash&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;declare&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; - &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; /dev/stdin&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;read&lt;/span&gt; algo cmd &amp;lt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;detect_algo &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;declare&lt;/span&gt; &lt;span class="nv"&gt;hash_from_file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;cmd&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;lt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ print $1 }&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; normalize_hash&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;hash_from_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[Error] The hashes are different! (hash: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;hash&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, file: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;hash_from_file&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, algo: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;algo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[Success] The hashes are same (algo: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;algo&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;main &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;人のソースコードは、新しい書き方がたくさん見つかって面白い。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプト内でaliasコマンドを使う方法</title><link>https://genzouw.com/entry/2020/03/16/090918/1947/</link><pubDate>Mon, 16 Mar 2020 09:09:18 +0900</pubDate><guid>https://genzouw.com/entry/2020/03/16/090918/1947/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bashシェルスクリプト内で &lt;code&gt;alias&lt;/code&gt; コマンドを使ってエイリアス設定しようとしてもデフォルトのままでは設定できません。&lt;/p&gt;&#10;&lt;p&gt;設定する方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.7.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="シェルスクリプト内でaliasコマンドを使ってみる"&gt;シェルスクリプト内で&lt;code&gt;alias&lt;/code&gt;コマンドを使ってみる&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;ls -l&lt;/code&gt; コマンドをかんたんに扱うための &lt;code&gt;ll&lt;/code&gt; というエイリアスを作成し、実行するスクリプトを用意してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt; test.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;alias ll=&amp;#39;ls -l&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ll /tmp/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 実行権限を付与&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;700&lt;/span&gt; test.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを実行してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./test.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./test.sh: 行 5: ll: コマンドが見つかりません&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;alias&lt;/code&gt; コマンドで用意した &lt;code&gt;ll&lt;/code&gt; というエイリアスコマンドが認識されていない事がわかります。&lt;/p&gt;&#10;&lt;h2 id="bashのドキュメントを確認してみる"&gt;Bashのドキュメントを確認してみる&lt;/h2&gt;&#10;&lt;p&gt;Bashのドキュメントを引くと理由がわかります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ man bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;&#10;&lt;p&gt;Aliases are not expanded when the shell is not interactive, unless the&#10;expand_aliases shell option is set using shopt (see the description of shopt under&#10;SHELL BUILTIN COMMANDS below).&lt;/p&gt;</description></item><item><title>シェルスクリプトでマルチバイト文字の文字数を確認する際の注意事項（おまけでJSTなど）</title><link>https://genzouw.com/entry/2020/03/04/085851/1941/</link><pubDate>Wed, 04 Mar 2020 08:58:51 +0900</pubDate><guid>https://genzouw.com/entry/2020/03/04/085851/1941/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bashシェルスクリプトで日本語の全角文字（ex: あいう）の文字数を取得したかったのですが環境の設定に注意しないといけないことがありました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="マルチバイト文字のを含む文字列のバイト数文字数を取得"&gt;マルチバイト文字のを含む文字列の「バイト数」「文字数」を取得&lt;/h2&gt;&#10;&lt;p&gt;マルチバイト文字のを含む文字列の「バイト数」「文字数」をそれぞれ取得してみたいと思いました。&lt;/p&gt;&#10;&lt;p&gt;クリーンな環境が欲しかったので、 &lt;code&gt;docker run&lt;/code&gt; で &lt;strong&gt;CentOS7&lt;/strong&gt; 環境を利用してみました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 以下のコマンドでCentOS7上のログインシェルが起動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm -it centos:7&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@fbdeab6f7982 /&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;#&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで、 &lt;strong&gt;あいう&lt;/strong&gt; という全角3文字のバイト数、文字数を取得してみます。&#10;それぞれ &lt;code&gt;wc -c&lt;/code&gt; 、 &lt;code&gt;wc -m&lt;/code&gt; というコマンドに対してパイプ経由で文字列を渡してやります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -nオプション無しでechoすると改行文字が含まれてしまうことに注意！&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; あいう &lt;span class="p"&gt;|&lt;/span&gt; wc -c&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# これで改行が除外される（プロンプトがおかしな場所に出力されていることからわかる）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; -n あいう&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;あいう$&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# wc -c でバイト数を取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; -n あいう &lt;span class="p"&gt;|&lt;/span&gt; wc -c&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# wc -c で文字数を取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; -n あいう &lt;span class="p"&gt;|&lt;/span&gt; wc -m&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変数に代入して、変数の文字列長を取得する命令を利用してみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;あいう&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${#&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;「バイト数」は想定通りでしたが、「文字数」が正しく取得できません。（バイト数と同じ値になってしまいました。）&lt;/p&gt;</description></item><item><title>シェルスクリプトでクリップボードの監視をしてみる</title><link>https://genzouw.com/entry/2020/02/14/083053/1928/</link><pubDate>Fri, 14 Feb 2020 08:30:53 +0900</pubDate><guid>https://genzouw.com/entry/2020/02/14/083053/1928/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;技術調査のためにひたすら参考になるキーワードをコピペしていましたが、自動的にテキストファイルに吐き出したかったのでスクリプトを書いてみました。&lt;/p&gt;&#10;&lt;p&gt;デフォルト状態ではMacで用意されている&lt;code&gt;pbcopy&lt;/code&gt;/&lt;code&gt;pbpaste&lt;/code&gt;コマンドで動作しますが、同等のコマンド名を引数で渡してやればLinuxやCygwinでも動作します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="スクリプト"&gt;スクリプト&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;watch_cb.sh&lt;/code&gt; という名前で作成しました。&lt;/p&gt;&#10;&lt;p&gt;クリップボードの内容が変わったタイミングで出力が行われます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o noclobber&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;COMMAND_TO_COPY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;pbcopy&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;COMMAND_TO_PASTE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;pbpaste&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;COMMAND_TO_COPY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRE_CLIP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; :&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;CLIP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;COMMAND_TO_PASTE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PRE_CLIP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CLIP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# ---- Event occurs ----&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;PRE_CLIP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CLIP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PRE_CLIP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行方法"&gt;実行方法&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# コンソール上に表示するだけ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./watch_cb.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイルにも保存したい&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./watch_cb.sh &lt;span class="p"&gt;|&lt;/span&gt; tee memo.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 追記&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./watch_cb.sh &lt;span class="p"&gt;|&lt;/span&gt; tee -a memo.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 特定の条件に合致したものだけに絞り込む&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./watch_cb.sh &lt;span class="p"&gt;|&lt;/span&gt; grep https &lt;span class="p"&gt;|&lt;/span&gt; tee memo.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;イベント発生部分を汎用化させれば、もっと色々できそう。&lt;/p&gt;</description></item><item><title>シェルスクリプトでデータを文字列の長い行順にソートする方法</title><link>https://genzouw.com/entry/2020/02/13/083220/1927/</link><pubDate>Thu, 13 Feb 2020 08:32:20 +0900</pubDate><guid>https://genzouw.com/entry/2020/02/13/083220/1927/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;データを文字列の長い行順（あるいは短い行順）に並び替えする方法について説明します。&lt;/p&gt;&#10;&lt;p&gt;もともとのきっかけは、&lt;code&gt;find&lt;/code&gt;コマンドで検出したディレクトリを階層の深い順に削除しないとエラーメッセージが表示される問題を解消したいということでした。&#10;「階層が深いディレクトリ＝パスの文字列が長いディレクトリ」をどうやってソートしようかなと考えて当エントリをまとめることにしました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;適当にディレクトリを作成して試してみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;スペースを含んでも正しく動作するかを確認したかったので、ここではあえてスペースを含むディレクトリも作ってみました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 適当なディレクトリを作成する&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p aaa/bbb/ccc &lt;span class="s1"&gt;&amp;#39;aaa/d ddd/ee&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# treeコマンドでディレクトリ構成を確認してみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tree&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└── aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ├── bbb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │   └── ccc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── d ddd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; └── ee&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt; directories, &lt;span class="m"&gt;0&lt;/span&gt; files&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="単純にfindで出力してみる"&gt;単純に&lt;code&gt;find&lt;/code&gt;で出力してみる&lt;/h2&gt;&#10;&lt;p&gt;まずは単純に&lt;code&gt;find&lt;/code&gt;でディレクトリのみを出力してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ find . -type d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./aaa/bbb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./aaa/bbb/ccc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./aaa/d ddd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./aaa/d ddd/ee&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ディレクトリ構造を単純に探索していった結果に見えます。&lt;/p&gt;</description></item><item><title>ターミナルからTreasureDataにcsvファイルをアップロードする方法</title><link>https://genzouw.com/entry/2020/02/11/080053/1923/</link><pubDate>Tue, 11 Feb 2020 08:00:53 +0900</pubDate><guid>https://genzouw.com/entry/2020/02/11/080053/1923/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今までビックデータを扱う仕事をしてきたのに&lt;a href="https://www.treasuredata.com/"&gt;Treasure Data&lt;/a&gt;を触ったことがありませんでした。&#10;csvファイルをアップロードするだけでも悩んでしまいました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アップロードの手順について"&gt;アップロードの手順について&lt;/h2&gt;&#10;&lt;p&gt;以下のサイトが参考になりました。&#10;&lt;a href="https://github.com/embulk/embulk"&gt;Embulk&lt;/a&gt;を使ってデータをインポートする方法です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://support.treasuredata.com/hc/en-us/articles/360001495428-Bulk-Import-from-CSV-files"&gt;Bulk Import from CSV files – Arm Treasure Data&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;データのインポートのためにいくつか準備しないといけないようですので、順番に設定していきます。&lt;/p&gt;&#10;&lt;h3 id="1embulkのインストール"&gt;1.Embulkのインストール&lt;/h3&gt;&#10;&lt;p&gt;パット見た感じ、&lt;strong&gt;JRE 1.8&lt;/strong&gt;が必要であり、セットアップが面相くさそうでした。&lt;/p&gt;&#10;&lt;p&gt;せっかくなのでDockerイメージを作成して公開してみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;したがって、以下のDockerイメージを利用していただければインストールを省略できます。次へ進みましょう。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h4 id="genzouwembulk-output-td"&gt;&lt;code&gt;genzouw/embulk-output-td&lt;/code&gt;&lt;/h4&gt;&#10;&lt;p&gt;&lt;a href="https://hub.docker.com/r/genzouw/embulk-output-td/"&gt;&lt;img src="https://img.shields.io/docker/cloud/build/genzouw/embulk-output-td?style=for-the-badge" alt="Docker Cloud build status"&gt;&lt;/a&gt;&#10;&lt;a href="https://hub.docker.com/r/genzouw/embulk-output-td/"&gt;&lt;img src="https://img.shields.io/docker/pulls/genzouw/embulk-output-td.svg?style=for-the-badge" alt="Docker Pulls"&gt;&lt;/a&gt;&#10;&lt;a href="https://hub.docker.com/r/genzouw/embulk-output-td/"&gt;&lt;img src="https://img.shields.io/docker/cloud/automated/genzouw/embulk-output-td.svg?style=for-the-badge" alt="Docker Cloud Automated build"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://hub.docker.com/r/genzouw/embulk-output-td"&gt;&lt;img src="https://dockeri.co/image/genzouw/embulk-output-td" alt="dockeri.co"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h3 id="2seed構成ファイルを作成"&gt;2.seed構成ファイルを作成&lt;/h3&gt;&#10;&lt;p&gt;Treasure Dataへデータをインポートするための設定ファイルは、&amp;ldquo;seed configuration file&amp;quot;と呼ばれるファイルから自動生成させることができます。&lt;/p&gt;&#10;&lt;p&gt;まずは&amp;quot;seed configuration file&amp;quot;を作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;in&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;file&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;path_prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/workdir/your_data.csv&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;out&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;td&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;apikey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="cp"&gt;**************your_td_apk_key****************&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;api.treasuredata.com&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;database&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;your_db_name&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;table&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;your_table_name&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;replace&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;default_timestamp_format&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;%Y-%m-%d %H:%M:%S&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;seed.ymlの細かい設定についてはここでは取り上げません。&lt;/p&gt;</description></item><item><title>シェルスクリプトでファイルに特定の文字が含まれているかどうかを高速に判定する方法</title><link>https://genzouw.com/entry/2020/02/10/090005/1922/</link><pubDate>Mon, 10 Feb 2020 09:00:05 +0900</pubDate><guid>https://genzouw.com/entry/2020/02/10/090005/1922/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;ファイルに特定の文字が含まれていたら処理を行う、という分岐を書くときに&lt;code&gt;grep&lt;/code&gt;の実行結果を&lt;code&gt;&amp;gt;/dev/null&lt;/code&gt;に捨てる、という方法をとっていましたが、&lt;code&gt;&amp;gt;/dev/null&lt;/code&gt;を使わなくても良いということを知りました。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;&amp;gt;/dev/null&lt;/code&gt;を使う場合と比べてのメリットについても取り上げます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep &lt;span class="o"&gt;(&lt;/span&gt;GNU grep&lt;span class="o"&gt;)&lt;/span&gt; 2.20&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="devnullを使ったやり方"&gt;&lt;code&gt;&amp;gt;/dev/null&lt;/code&gt;を使ったやり方&lt;/h2&gt;&#10;&lt;p&gt;今までは標準出力を無効化するために&lt;code&gt;&amp;gt;/dev/null&lt;/code&gt;を使っていました。&lt;/p&gt;&#10;&lt;p&gt;1から100まで書かれている100行のテキストファイル&lt;code&gt;test.txt&lt;/code&gt;について、&lt;code&gt;grep&lt;/code&gt;を行い分岐処理を行ってみます。&#10;まずはテストに使用するテキストファイルを作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# `seq` コマンドでファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt; &amp;gt;test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認。最初の3行を出力してみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;3&lt;/span&gt; test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認。最後の3行を出力してみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tail -n &lt;span class="m"&gt;3&lt;/span&gt; test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;98&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;99&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;100&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このファイルを使ってファイル内の文字列存在チェックを行ってみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ----- 99を検索 -----&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;amp;&amp;amp;を使う方法&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep &lt;span class="m"&gt;99&lt;/span&gt; test.txt &amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; EXIST.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EXIST.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# if文を使う方法&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;if&lt;/span&gt; grep &lt;span class="m"&gt;99&lt;/span&gt; test.txt &amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; EXIST.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EXIST.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ----- 199を検索 -----&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;amp;&amp;amp;を使う方法 （何も出力されない）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep &lt;span class="m"&gt;199&lt;/span&gt; test.txt &amp;gt;/dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; EXIST.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# if文を使う方法（何も出力されない）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;if&lt;/span&gt; grep &lt;span class="m"&gt;199&lt;/span&gt; test.txt &amp;gt;/dev/null&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; EXIST.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実現できました。&lt;/p&gt;</description></item><item><title>DockerfileのVOLUME命令とはなにか？どのように利用すると便利か？</title><link>https://genzouw.com/entry/2020/02/08/225825/1921/</link><pubDate>Sat, 08 Feb 2020 22:58:25 +0900</pubDate><guid>https://genzouw.com/entry/2020/02/08/225825/1921/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; を使うに当たり &lt;strong&gt;Dockerfile&lt;/strong&gt; の各種命令の理解は必須です。 &lt;strong&gt;FROM&lt;/strong&gt; や &lt;strong&gt;RUN&lt;/strong&gt; などは確実に登場します。&lt;/p&gt;&#10;&lt;p&gt;ただ、 &lt;strong&gt;VOLUME&lt;/strong&gt; という命令を使う機会が多くなかったため、改めて理解を整理してみます。&#10;また、どういうときに便利に利用できるのかについても取り上げてみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 19.03.5, build 633a0ea&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="volume-命令の記述方法"&gt;VOLUME 命令の記述方法&lt;/h2&gt;&#10;&lt;p&gt;まずは動作確認のために、VOLUME 命令を使用したかんたんな &lt;strong&gt;Dockerfile&lt;/strong&gt; を作成してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;Dockerfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;FROM alpine:3.11.3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;RUN mkdir -p /hoge /fuga&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;VOLUME [&amp;#34;/hoge&amp;#34;]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;記述している内容は 3 命令しかありません。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;FROM&lt;/code&gt; : ベースとして利用するコンテナイメージ。何でも良いがここでは &lt;strong&gt;Alpine Linux&lt;/strong&gt; を利用しています。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;RUN&lt;/code&gt; : ルートディレクトリ直下に２つのディレクトリを作成しています。( &lt;code&gt;/hoge&lt;/code&gt;, &lt;code&gt;/fuga&lt;/code&gt;)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;VOLUME&lt;/code&gt; : 配列で複数指定可能。ボリュームとしたいパスを指定。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ここでは、 &lt;code&gt;/hoge&lt;/code&gt; というディレクトリを &lt;strong&gt;ボリューム&lt;/strong&gt; として定義しています。&lt;/p&gt;</description></item><item><title>インデントされたファイルを "while read" コマンドでループさせるとインデントが消えてしまう問題に対処</title><link>https://genzouw.com/entry/2020/02/07/201814/1919/</link><pubDate>Fri, 07 Feb 2020 20:18:14 +0900</pubDate><guid>https://genzouw.com/entry/2020/02/07/201814/1919/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトで、インデントされたテキストファイルを &lt;code&gt;while read&lt;/code&gt; 構文で読み込み処理したいが、インデントされている行の行頭のスペースが消えてしまうのでなんとかしたいという質問がありました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="問題"&gt;問題&lt;/h2&gt;&#10;&lt;p&gt;以下のようなファイルがあります。2行目がスペースでインデントされています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat a.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;111&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;222&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;333&lt;/span&gt; &lt;span class="m"&gt;444&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを &lt;code&gt;while read&lt;/code&gt; 構文で読み込みループさせたいが、2行目の行頭のスペースが消えてしまうということでした。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; -r line&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt; &amp;lt;a.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;111&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;222&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;333&lt;/span&gt; &lt;span class="m"&gt;444&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="解決方法は-ifs-環境変数のクリア"&gt;解決方法は &lt;code&gt;IFS&lt;/code&gt; 環境変数のクリア&lt;/h2&gt;&#10;&lt;p&gt;解決方法は非常に単純で、 &lt;code&gt;IFS&lt;/code&gt; 環境変数をクリア（空）にしてやることで対処できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; -r line&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt; &amp;lt;a.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;111&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;222&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;333&lt;/span&gt; &lt;span class="m"&gt;444&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;IFS&lt;/code&gt; 環境変数は&lt;strong&gt;internal fieled separator&lt;/strong&gt;の省略で、 &lt;strong&gt;情報を分離するために利用される文字&lt;/strong&gt; が格納されています。&#10;&lt;code&gt;read&lt;/code&gt; コマンドはシェルのビルドインコマンドです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;read&lt;/span&gt; is a shell &lt;span class="nb"&gt;builtin&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;標準入力で受け取った情報を &lt;code&gt;IFS&lt;/code&gt; 環境変数に設定されている文字列で自動的に分割した後、引数で与えられた変数名（ここでは&lt;code&gt;line&lt;/code&gt;）に格納します。&lt;/p&gt;</description></item><item><title>シェルで全角/半角/大文字/小文字/ひらがな/カタカナ/英字の変換を行うためにuconvを使う</title><link>https://genzouw.com/entry/2020/02/05/194537/1913/</link><pubDate>Wed, 05 Feb 2020 19:45:37 +0900</pubDate><guid>https://genzouw.com/entry/2020/02/05/194537/1913/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;コマンドラインから全角/半角/大文字/小文字/ひらがな/カタカナ/英字の変換を行うために便利そうな &lt;code&gt;uconv&lt;/code&gt; というツールを見つけたので紹介します。&#10;サイトには以下のように書かれていました。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;iconv(1) に加えて、Unicode 用の国際化コンポーネント (ICU) ツールセットの一部である uconv(1) コマンドも、1 つのエンコーディングから別のエンコーディングへの変換に使用できます。uconv は、229 のエンコーディングと、1000 を超える別名をサポートしています。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;簡単にいうと &lt;code&gt;iconv&lt;/code&gt; の上位互換ですね。&#10;もうこれがあったら文字列変換の多くが実現できるんじゃないかと思いました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uconv --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uconv v2.1 ICU 64.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;uconv&lt;/code&gt; コマンドは &lt;code&gt;icu&lt;/code&gt; というパッケージに含まれています。&#10;RedHat系ディストリビューションとDebian系ディストリビューションでインストール方法に違いがあるので注意。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;RedHat系&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum install icu&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uconv --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Debian系(Ubuntu)&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install icu-devtools&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uconv --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;※手前味噌ですが、Dockerイメージも公開しました。インストールは不要です。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="github-card" data-github="genzouw/uconv" data-width="400" data-height="" data-theme="default"&gt;&lt;/div&gt;&#10;&lt;script src="//cdn.jsdelivr.net/github-cards/latest/widget.js"&gt;&lt;/script&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -i --rm genzouw/uconv --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uconv v2.1 ICU 64.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ~/.bashrcや~/.zshrcにエイリアス設定しておくと便利&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;uconv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;docker run -i --rm genzouw/uconv&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="色々変換してみる"&gt;色々変換してみる&lt;/h2&gt;&#10;&lt;p&gt;早速いろいろ変換してみます。&lt;/p&gt;</description></item><item><title>シェルスクリプトで数値を3桁ごとにカンマ区切りで表示する（Number Format）</title><link>https://genzouw.com/entry/2020/02/04/140039/1912/</link><pubDate>Tue, 04 Feb 2020 14:00:39 +0900</pubDate><guid>https://genzouw.com/entry/2020/02/04/140039/1912/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;桁数の多い数値を見やすくするために、3 桁ごとにカンマ区切りで表示することがあります。&#10;昔の現場では「カンマ編集」と言われていました。&#10;また、多くのプログラミング言語に組み込み関数として用意されています。&lt;/p&gt;&#10;&lt;p&gt;金額をページ内に表示するとき利用されますね。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ex) &lt;code&gt;1,234,567&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;シェルスクリプトで実現する方法について取り上げます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="printfコマンドを使う--シェルがbash-5系である場合-"&gt;&lt;code&gt;printf&lt;/code&gt;コマンドを使う ( シェルが&lt;code&gt;Bash 5系&lt;/code&gt;である場合 )&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;printf&lt;/code&gt; コマンドを利用すれば OK。&lt;/p&gt;&#10;&lt;p&gt;シェルが&lt;code&gt;Bash 5系&lt;/code&gt;以上である場合は、組み込みコマンドである&lt;code&gt;printf&lt;/code&gt;が利用できます。&#10;数値を出力するためのフォーマットは&lt;code&gt;%d&lt;/code&gt;ですが、&lt;code&gt;%&lt;/code&gt;と&lt;code&gt;d&lt;/code&gt;の間に&lt;code&gt;'&lt;/code&gt;（シングルクォート）を挿入するとカンマ区切りで表示されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 普通にprintfで数値を出力する場合&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%d\n&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;1234567890&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1234567890&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# カンマ区切りのフォーマッタを使って出力する場合&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%&amp;#39;d\n&amp;#34;&lt;/span&gt; &lt;span class="m"&gt;1234567890&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1,234,567,890&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sedコマンドを使う--シェルがbash-5系でない場合-"&gt;&lt;code&gt;sed&lt;/code&gt;コマンドを使う ( シェルが&lt;code&gt;Bash 5系&lt;/code&gt;でない場合 )&lt;/h2&gt;&#10;&lt;p&gt;Bash が利用できなかったり、バージョンが古い場合には&lt;code&gt;sed&lt;/code&gt;で頑張ってみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="m"&gt;1234567890&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -E &lt;span class="s1"&gt;&amp;#39;:l; s/^([0-9]+)([0-9]{3})/\1,\2/; t l;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1,234,567,890&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;簡単に解説すると、以下のような処理を&lt;code&gt;sed&lt;/code&gt;で行っています。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;:&lt;/code&gt;コマンドで&lt;code&gt;l&lt;/code&gt;という文字列でラベル付けする（&lt;strong&gt;goto 文のような機能&lt;/strong&gt;）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;s&lt;/code&gt;コマンドで置換する&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;t&lt;/code&gt;コマンドで&lt;code&gt;l&lt;/code&gt;ラベルまで移動する。&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;※ただし&lt;code&gt;t&lt;/code&gt;コマンドは直前の&lt;code&gt;s&lt;/code&gt;コマンドで置換が行われなかった場合は移動しない&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Bash&lt;/strong&gt;5 系でしかつかえない便利機能、ちょいちょいありますね。&#10;地味に便利な機能が多い。&lt;/p&gt;</description></item><item><title>docker-compose.ymlのcommandプロパティに複数コマンドを設定する方法</title><link>https://genzouw.com/entry/2020/01/28/120014/1910/</link><pubDate>Tue, 28 Jan 2020 12:00:14 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/28/120014/1910/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt; は非常に便利ですね。&lt;/p&gt;&#10;&lt;p&gt;3 層構造 ( クライアント、Web、DB ) のアプリケーションを作る際には、最低限 Web のコンテナ、DB のコンテナの 2 つを同時に立ち上げる必要があります。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://docs.docker.com/compose/"&gt;Docker Compose&lt;/a&gt; なら簡単に環境を構築できます。&lt;/p&gt;&#10;&lt;p&gt;これらのコンテナを立ち上げる前の準備処理を行ってきたい場合があります。&#10;( init コンテナとでも呼びましょうか。例えば設定ファイルを作ったり。 )&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; の &lt;code&gt;command&lt;/code&gt; プロパティにこれらの初期処理を設定したかったのですが、シェルを複数コマンド記述したり、リダイレクトさせたりで少々ハマったので共有します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-compose --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-compose version 1.25.2, build 698e2846&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="どんなことがしたかったか"&gt;どんなことがしたかったか？&lt;/h2&gt;&#10;&lt;p&gt;初期処理として、以下のような 2 行のコマンドを実行してファイルを作成したいとします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Konnichiwa!&amp;#34;&lt;/span&gt; &amp;gt; /shared_dir/hello.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;600&lt;/span&gt; /shared_dir/hello.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;シェルで記述すると非常に簡単です。&#10;ワンライナーだと以下のように記述できますね。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Konnichiwa!&amp;#34;&lt;/span&gt; &amp;gt; /shared_dir/hello.txt&lt;span class="p"&gt;;&lt;/span&gt; chmod &lt;span class="m"&gt;600&lt;/span&gt; /shared_dir/hello.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;改行で区切る代わりに &lt;code&gt;;&lt;/code&gt; を指定しています。&lt;/p&gt;&#10;&lt;p&gt;さて、このような処理をさせる &lt;code&gt;docker-compose.yml&lt;/code&gt; を記述してみます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Konnichiwa! という文字列を hello.txt に出力&lt;/li&gt;&#10;&lt;li&gt;ついでにパーミッションも変更する&lt;/li&gt;&#10;&lt;li&gt;hello.txt は共有フォルダに配置しているので、ローカルから見える&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version: &lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;services:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; init:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; image: bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; volumes:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; - &lt;span class="nv"&gt;$PWD&lt;/span&gt;:/shared_dir&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; command:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Konnichiwa!&amp;#34;&lt;/span&gt; &amp;gt; /shared_dir/hello.txt&lt;span class="p"&gt;;&lt;/span&gt; chmod &lt;span class="m"&gt;600&lt;/span&gt; /shared_dir/hello.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この定義ファイルを使って &lt;code&gt;docker-compose up&lt;/code&gt; してみます。&lt;/p&gt;</description></item><item><title>スタンドアロンKubernetesクラスタにIngressを設定しWebサーバを公開する</title><link>https://genzouw.com/entry/2020/01/26/234702/1909/</link><pubDate>Sun, 26 Jan 2020 23:47:02 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/26/234702/1909/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2020/01/25/001110"&gt;余ったPC1台を使ってKubernetesクラスタを構築してみる&lt;/a&gt;でKubernetesの検証環境を構築できました。&lt;/p&gt;&#10;&lt;p&gt;せっかくできたこの環境を使って外部からアクセス可能なWebサーバを構築し、公開してみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="ingressとは"&gt;Ingressとは&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Ingress&lt;/strong&gt;とは、&lt;strong&gt;Kubernetes&lt;/strong&gt;で利用できる&lt;strong&gt;L7(HTTP/HTTPS)ロードバランサ&lt;/strong&gt;です。&#10;クラスタ内のコンテナ(正確にはPod)を外部に公開できます。&lt;/p&gt;&#10;&lt;p&gt;似たようなものとして&lt;strong&gt;Load Balancer Service&lt;/strong&gt;というものがあります。&#10;こちらは&lt;strong&gt;L4(TCP/UDP)ロードバランサ&lt;/strong&gt;です。&#10;後々やってみたいと思っている&lt;em&gt;TLSターミネーション&lt;/em&gt;や&lt;em&gt;URLマップ&lt;/em&gt;ができません。&lt;/p&gt;&#10;&lt;p&gt;したがって、&lt;strong&gt;Ingress&lt;/strong&gt;を使ってみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;&#10;&lt;h3 id="検証環境"&gt;検証環境&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2020/01/25/001110"&gt;前回のエントリ&lt;/a&gt;の続きのため、Ubuntu環境を利用しました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;40~18.04.1-Ubuntu SMP Thu Nov &lt;span class="m"&gt;14&lt;/span&gt; 12:06:39 UTC &lt;span class="m"&gt;2019&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ingress-nginx-controller"&gt;Ingress Nginx Controller&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Ingress&lt;/strong&gt;とは先程触れたとおり、&lt;strong&gt;Kubernetes&lt;/strong&gt;で利用できる&lt;strong&gt;L7(HTTP/HTTPS)ロードバランサ&lt;/strong&gt;です。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Ingress&lt;/strong&gt;の内部実装は&lt;strong&gt;Ingress Controller&lt;/strong&gt;と呼ばれており、GCPで動作するもの、AWSで動作するものなど色々あります。&lt;/p&gt;&#10;&lt;p&gt;ここではオンプレミス環境でも利用できる&lt;strong&gt;Ingress Nginx Controller&lt;/strong&gt;をインストールします。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Ingress Nginx Controller&lt;/strong&gt;を&lt;a href="https://helm.sh/"&gt;Helm&lt;/a&gt;というツールを使ってセットアップを行います。&#10;*Helm**を利用する理由は、クラスタ外からアクセスするためのIPアドレス（&lt;code&gt;external_ip&lt;/code&gt;）の設定が容易なためです。&lt;/p&gt;&#10;&lt;h4 id="helmのインストール"&gt;Helmのインストール&lt;/h4&gt;&#10;&lt;p&gt;&lt;a href="https://helm.sh/"&gt;公式ページ&lt;/a&gt;に記載されている方法でインストールします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Install&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;700&lt;/span&gt; get_helm.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./get_helm.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Initialize&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ helm repo add stable https://kubernetes-charts.storage.googleapis.com/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に外部からアクセスする際のクラスタのIPについて確認します。&#10;スタンドアローンのクラスタなので、 &lt;strong&gt;マスタサーバ&lt;/strong&gt; で &lt;code&gt;ip addr&lt;/code&gt; を実行した結果のIPアドレスを利用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ip addr&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu &lt;span class="m"&gt;65536&lt;/span&gt; qdisc noqueue state UNKNOWN group default qlen &lt;span class="m"&gt;1000&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; inet 127.0.0.1/8 scope host lo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; valid_lft forever preferred_lft forever&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; inet6 ::1/128 scope host&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; valid_lft forever preferred_lft forever&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2: enp4s0: &amp;lt;NO-CARRIER,BROADCAST,MULTICAST,UP&amp;gt; mtu &lt;span class="m"&gt;1500&lt;/span&gt; qdisc fq_codel state DOWN group default qlen &lt;span class="m"&gt;1000&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; link/ether 50:e5:49:c3:03:57 brd ff:ff:ff:ff:ff:ff&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3: wlx0024a54f427c: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu &lt;span class="m"&gt;1500&lt;/span&gt; qdisc mq state UP group default qlen &lt;span class="m"&gt;1000&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; link/ether 00:24:a5:4f:42:7c brd ff:ff:ff:ff:ff:ff&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; inet 192.168.0.201/24 brd 192.168.0.255 scope global noprefixroute wlx0024a54f427c&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&lt;span class="o"&gt;(&lt;/span&gt;省略&lt;span class="o"&gt;)&lt;/span&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今回構築したサーバは &lt;code&gt;wifi&lt;/code&gt; 環境に接続させているため（サーバなのにwifi）、上記の一番下に表示されている &lt;code&gt;192.168.0.201&lt;/code&gt; のIPアドレスを利用することになります。&lt;/p&gt;</description></item><item><title>余ったPC1台を使ってオンプレKubernetesクラスタを構築してみる</title><link>https://genzouw.com/entry/2020/01/25/001110/1905/</link><pubDate>Sat, 25 Jan 2020 00:11:10 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/25/001110/1905/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;仕事では&lt;a href="https://cloud.google.com/kubernetes-engine/"&gt;Google Kubernetes Engine (GKE)&lt;/a&gt;を使っての&lt;a href="https://kubernetes.io/"&gt;Kubernetes&lt;/a&gt;クラスタ構築をしています。&lt;/p&gt;&#10;&lt;p&gt;仕事以外の時間でもKubernetesクラスタをゴリゴリ触ってみたいと思いました。&#10;そこで、家の使っていない古いPCを使ってKubernetesクラスタをいちから作成してみることにしました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;(2020-01-26 追記)&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;当エントリでまとめたセットアップ手順をシンプルなシェルスクリプトにまとめ、公開しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/genzouw/standalone_kubernetes_cluster"&gt;GitHub - genzouw/standalone_kubernetes_cluster: This simple shell script helps build a &amp;quot;standalone&amp;quot; Kubernetes cluster on an extra (eg, old) PC.&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="クラスタを構成するマスタサーバとノードの２つの役割はどうするの"&gt;クラスタを構成する「マスタサーバ」と「ノード」の２つの役割はどうするの？&lt;/h2&gt;&#10;&lt;p&gt;Kubernetesクラスタには、&lt;strong&gt;マスターサーバ&lt;/strong&gt;と&lt;strong&gt;ノード&lt;/strong&gt;と言われるサーバが必要になります。&lt;/p&gt;&#10;&lt;p&gt;ざっくりいうと、 &lt;strong&gt;マスターサーバ&lt;/strong&gt;は管理者からの要求に答えて&lt;strong&gt;ノード&lt;/strong&gt;(後述)にコンテナを立ち上げたり、&lt;strong&gt;ノード&lt;/strong&gt;に存在するコンテナの状況を監視します。&#10;&lt;strong&gt;ノード&lt;/strong&gt;はコンテナそのものを動かすサーバです。&lt;/p&gt;&#10;&lt;p&gt;「Hadoop HDFS」における&lt;strong&gt;マスタノード&lt;/strong&gt;と&lt;strong&gt;スレーブノード&lt;/strong&gt;に似ていますね。&lt;/p&gt;&#10;&lt;p&gt;したがって、できる限り&lt;strong&gt;マスターサーバ&lt;/strong&gt;は余裕のある状況が望ましいです。&lt;/p&gt;&#10;&lt;p&gt;ただし今回は検証環境である、またお金をかけたくないなどの理由から、&#10;「マスタサーバ」x1台と「ノード」x1台を物理サーバx1台に共存させたいと思います。&lt;/p&gt;&#10;&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;&#10;&lt;p&gt;Kubernetesクラスタを構築していきます。&lt;/p&gt;&#10;&lt;h3 id="osのディストリビューションバージョンを確認"&gt;OSのディストリビューション・バージョンを確認&lt;/h3&gt;&#10;&lt;p&gt;さて、今回余っていた古いPCには &lt;code&gt;Ubuntu18.04&lt;/code&gt; がインストールされていたため、その環境をそのまま利用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;40~18.04.1-Ubuntu SMP Thu Nov &lt;span class="m"&gt;14&lt;/span&gt; 12:06:39 UTC &lt;span class="m"&gt;2019&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="docker-のインストール"&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; のインストール&lt;/h3&gt;&#10;&lt;p&gt;セットアップ後は以下のコマンドを実行し、OSリブート時にもサービスが自動起動するようにしておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install -y docker.io&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; docker.service&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在ログインしているユーザが `docker` コマンドを実行できるようにしておく&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gpasswd -a &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 上記で設定したdockerグループへの所属は、一度ログインしないと反映されない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;exit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正常にセットアップされたか配下のコマンドを実行すれば確認できます。&lt;/p&gt;</description></item><item><title>JavaScriptで数値をカンマ区切り（カンマ編集）の文字列とする方法</title><link>https://genzouw.com/entry/2020/01/22/073040/1899/</link><pubDate>Wed, 22 Jan 2020 07:30:40 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/22/073040/1899/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;簡単にできる、できないなどの意見が昔からあるが、&#10;2020年現在は各種ブラウザやNode.jsも進化し、いずれも統一した方法で実現できるようです。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="s2"&gt;&amp;#34;/Applications/Google Chrome.app/Contents/MacOS/Google Chrome&amp;#34;&lt;/span&gt; --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Google Chrome 79.0.3945.130&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v13.6.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="カンマ区切りカンマ編集する方法"&gt;カンマ区切り（カンマ編集）する方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;Number#toLocaleString()&lt;/code&gt; メソッドを使えば実現できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Welcome to Node.js v13.6.0.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Type &lt;span class="s2"&gt;&amp;#34;.help&amp;#34;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; more information.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="nb"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1234567&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;undefined&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; console.log&lt;span class="o"&gt;(&lt;/span&gt;n.toLocaleString&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1,234,567&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;undefined&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;JavaScriptの部分の処理を取り出すと以下のようになっています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1234567&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toLocaleString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ChromeやSafari、Firefoxの開発者ツールに上記スクリプトを貼り付けても、やはり正常に動作することを確認できました。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;数年前は &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; や &lt;a href="https://www.apple.com/safari/"&gt;Safari&lt;/a&gt; では未実装だったメソッドでした。&#10;時代は進化しました。&lt;/p&gt;</description></item><item><title>セットアップスクリプトなどでmkdir,cp,chown,chgrp,chmodが頻発するときにシンプルに記述する方法</title><link>https://genzouw.com/entry/2020/01/21/120017/1897/</link><pubDate>Tue, 21 Jan 2020 12:00:17 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/21/120017/1897/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;アプリケーションのセットアップスクリプト&lt;/strong&gt; や &lt;strong&gt;Dockerfile&lt;/strong&gt; 、 &lt;strong&gt;Vagrantfile&lt;/strong&gt; を記述しているときに、以下のようなコマンドが乱立することがあります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;mkdir&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;cp&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;chown&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;chgrp&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;chmod&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;mkdir&lt;/code&gt; でコピー先のディレクトリを作成し、 &lt;code&gt;cp&lt;/code&gt; でファイルをコピー、 &lt;code&gt;chown&lt;/code&gt; / &lt;code&gt;chgrp&lt;/code&gt; で所有者を変更し、 &lt;code&gt;chmod&lt;/code&gt; でパーミッションを変更、といった記述をしだすと、4コマンドは実行することになります。&lt;/p&gt;&#10;&lt;p&gt;これを1コマンドでやってしまおうというのが今回のエントリです。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;今回は非常に軽量なDcokerイメージである &lt;code&gt;alpine&lt;/code&gt; でも使えることを確認したいため、以下の環境を利用しました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 unknown Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sh --help 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BusyBox v1.30.1 &lt;span class="o"&gt;(&lt;/span&gt;2019-06-12 17:51:55 UTC&lt;span class="o"&gt;)&lt;/span&gt; multi-call binary.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに「Alpine Linux」は &lt;code&gt;docker&lt;/code&gt; コマンドが利用できれば簡単に起動できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -i -t --rm alpine&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4つのコマンドを1コマンドで実現するためのコマンド-install"&gt;4つのコマンドを1コマンドで実現するためのコマンド &lt;code&gt;install&lt;/code&gt;&lt;/h2&gt;&#10;&lt;p&gt;答えとしては非常に簡単で、 &lt;code&gt;install&lt;/code&gt; コマンドを利用します。&lt;/p&gt;&#10;&lt;h3 id="利用できるディストリビューション"&gt;利用できるディストリビューション&lt;/h3&gt;&#10;&lt;p&gt;いくつかのディストリビューションを確認しましたが、いずれもインストールされているようでした。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CentOS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -i -t --rm centos&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@6742f69c602b /&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;# install --version | head -n 1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;install &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.22&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Ubuntu&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -i -t --rm ubuntu&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@854017b7cc5f:/# install --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;install &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.28&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Debian&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -i -t --rm debian&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@4c81dcfa3f3f:/# install --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;install &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.30&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Alpine&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -i -t --rm alpine&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/# install 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;BusyBox v1.30.1 &lt;span class="o"&gt;(&lt;/span&gt;2019-06-12 17:51:55 UTC&lt;span class="o"&gt;)&lt;/span&gt; multi-call binary.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Macの場合は &lt;code&gt;brew install gnutls&lt;/code&gt; あたりでインストールできると思います。（僕の環境はすでにインストールされていた。）&lt;/p&gt;</description></item><item><title>シェルである文章内からある単語の登場回数を調べる</title><link>https://genzouw.com/entry/2020/01/19/073052/1895/</link><pubDate>Sun, 19 Jan 2020 07:30:52 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/19/073052/1895/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;文章内から特定の単語の登場回数を調べる方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="サンプル文章の用意"&gt;サンプル文章の用意&lt;/h2&gt;&#10;&lt;p&gt;サンプル文章を用意します。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.wikipedia.org/"&gt;Wikipedia&lt;/a&gt; の「ONE_PIECE」のページをサンプルとして利用したいと思います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -s https://ja.wikipedia.org/wiki/ONE_PIECE &amp;gt; one_piece.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTMLのタグが混ざり込んでいますが、特定の検索キーワードを探す分には問題ないでしょう。&lt;/p&gt;&#10;&lt;h2 id="grep-を使って特定の単語の登場回数を調べる方法"&gt;&lt;code&gt;grep&lt;/code&gt; を使って「特定の単語」の登場回数を調べる方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;はじめに断っておくと、 &lt;code&gt;grep -c&lt;/code&gt; を使う方法はおすすめしません。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;grep -c&lt;/code&gt; で検索対象の単語の登場回数を調べることができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep -c ワンピース one_piece.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;138&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ただし、注意が必要です。 &lt;code&gt;grep -c&lt;/code&gt; の検索結果数は、 &lt;strong&gt;「単語の登場回数」&lt;/strong&gt; ではなく &lt;strong&gt;「単語が1文字以上見つかった行数」&lt;/strong&gt; になっています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3行の中に &amp;#34;ワンピース&amp;#34; の文字が6回登場している&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep ワンピース one_piece.html &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;td&amp;gt;この項目では、尾田栄一郎の漫画について説明しています。アニメ版については「&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/wiki/ONE_PIECE_(%E3%82%A2%E3%83%8B%E3%83%A1)&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ONE PIECE (アニメ)&amp;#34;&lt;/span&gt;&amp;gt;ONE PIECE &lt;span class="o"&gt;(&lt;/span&gt;アニメ&lt;span class="o"&gt;)&lt;/span&gt;&amp;lt;/a&amp;gt;」を、その他の「ワンピース」については「&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/wiki/%E3%83%AF%E3%83%B3%E3%83%94%E3%83%BC%E3%82%B9_(%E6%9B%96%E6%98%A7%E3%81%95%E5%9B%9E%E9%81%BF)&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mw-disambig&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ワンピース (曖昧さ回避)&amp;#34;&lt;/span&gt;&amp;gt;ワンピース &lt;span class="o"&gt;(&lt;/span&gt;曖昧さ回避&lt;span class="o"&gt;)&lt;/span&gt;&amp;lt;/a&amp;gt;」をご覧ください。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;p&amp;gt;『&amp;lt;b&amp;gt;ONE PIECE&amp;lt;/b&amp;gt;』（ワンピース）は、&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/wiki/%E5%B0%BE%E7%94%B0%E6%A0%84%E4%B8%80%E9%83%8E&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;尾田栄一郎&amp;#34;&lt;/span&gt;&amp;gt;尾田栄一郎&amp;lt;/a&amp;gt;による&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/wiki/%E6%97%A5%E6%9C%AC&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;日本&amp;#34;&lt;/span&gt;&amp;gt;日本&amp;lt;/a&amp;gt;の&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/wiki/%E5%B0%91%E5%B9%B4%E6%BC%AB%E7%94%BB&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;少年漫画&amp;#34;&lt;/span&gt;&amp;gt;少年漫画&amp;lt;/a&amp;gt;作品。『&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/wiki/%E9%80%B1%E5%88%8A%E5%B0%91%E5%B9%B4%E3%82%B8%E3%83%A3%E3%83%B3%E3%83%97&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;週刊少年ジャンプ&amp;#34;&lt;/span&gt;&amp;gt; 週刊少年ジャンプ&amp;lt;/a&amp;gt;』（&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/wiki/%E9%9B%86%E8%8B%B1%E7%A4%BE&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;集英社&amp;#34;&lt;/span&gt;&amp;gt;集英社&amp;lt;/a&amp;gt;）にて&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/wiki/1997%E5%B9%B4&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;1997年&amp;#34;&lt;/span&gt;&amp;gt;1997年&amp;lt;/a&amp;gt;34号より連載中。略称は「&amp;lt;b&amp;gt;ワンピ&amp;lt;/b&amp;gt;」。&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;li &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;toclevel-2 tocsection-60&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;a &lt;span class="nv"&gt;href&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;#ワンピース・プレミア・サマー&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;span &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tocnumber&amp;#34;&lt;/span&gt;&amp;gt;12.2&amp;lt;/span&amp;gt; &amp;lt;span &lt;span class="nv"&gt;class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;toctext&amp;#34;&lt;/span&gt;&amp;gt;ワンピース・プレミア・サマー&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# この結果を `grep -c` で検索すると、 6ではなく3という結果が帰ってくる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep ワンピース one_piece.html &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep -c ワンピース&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="grep--o---wc--l-を使う方法"&gt;&lt;code&gt;grep -o ... | wc -l&lt;/code&gt; を使う方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;行数&lt;/strong&gt;ではなく&lt;strong&gt;単語の登場回数&lt;/strong&gt;を知りたい場合には、 &lt;code&gt;grep -o&lt;/code&gt; の結果を &lt;code&gt;wc -l&lt;/code&gt; にパイプで繋いでやるほうが良いでしょう。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで文字列変数を部分的に切り出す（substring）</title><link>https://genzouw.com/entry/2020/01/18/113034/1894/</link><pubDate>Sat, 18 Jan 2020 11:30:34 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/18/113034/1894/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bash シェルスクリプトで &lt;em&gt;変数&lt;/em&gt; に格納されている文字列を部分的に切り出す方法について。&lt;/p&gt;&#10;&lt;p&gt;サンプルコードを掲載しますが、 &lt;strong&gt;GNU Bash&lt;/strong&gt; でのみ動作する機能もありますので、ご注意ください。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="先頭左から数文字切り出す"&gt;先頭（左）から数文字切り出す&lt;/h2&gt;&#10;&lt;p&gt;文字列が格納された変数に対して、 &lt;strong&gt;先頭（左）から数文字切り出す&lt;/strong&gt; には、以下のようなコマンドを利用します。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;※先頭から 4 文字を切り出してみます&lt;/em&gt; 。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;STR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;STR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hell&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Bash の変数は、 &lt;code&gt;${STR:offset:length}&lt;/code&gt; の形式で参照すれば文字列の一部を切り出すことができます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;offset&lt;/code&gt; : 切り出し開始位置(先頭から切り取りたい場合は &lt;code&gt;0&lt;/code&gt; を指定)&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;length&lt;/code&gt; : 切り出し文字数&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;また、 &lt;code&gt;0&lt;/code&gt; は省略可能です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# echo ${STR:0:4} と同じ結果となります&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;STR&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hell&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="末尾右から数文字切り出す"&gt;末尾（右）から数文字切り出す&lt;/h2&gt;&#10;&lt;p&gt;先程と同じ変数参照の機能を利用します。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;※末尾から 4 文字を切り出してみます&lt;/em&gt; 。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;STR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;STR&lt;/span&gt;&lt;span class="p"&gt;: -4:&lt;/span&gt;&lt;span class="nv"&gt;4&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;orld&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;offset&lt;/code&gt; にはマイナスが指定可能です。 &lt;code&gt;-4&lt;/code&gt; としているので、末尾から 4 文字目の切り取りの開始位置としてします。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで数値の絶対値を算出する方法</title><link>https://genzouw.com/entry/2020/01/15/123053/1884/</link><pubDate>Wed, 15 Jan 2020 12:30:53 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/15/123053/1884/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;以前もエントリを書きましたが、簡単な計算であればBash上で計算できます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/30/081600#toc_id_2_3"&gt;Bashのビルトインコマンド “declare” の使い方紹介（その１） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/02/18/122158"&gt;Bashシェルスクリプトで浮動小数点計算（答えが小数となる除算） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;整数のみの計算であれば、以下のように実現できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今回は絶対値を計算する方法について考えてみます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="1計算結果が正か負かの判定を行う方法"&gt;1.計算結果が正か負かの判定を行う方法&lt;/h2&gt;&#10;&lt;p&gt;判定処理を行い大きい方から小さい方を引き算する方法です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;15&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 普通に計算するとマイナスになる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;A-B&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-5&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 三項演算子を使って演算を反転してやる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;A &amp;gt; B ? A &lt;span class="o"&gt;-&lt;/span&gt; B : B &lt;span class="o"&gt;-&lt;/span&gt; A&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2マイナスを削り取る方法"&gt;2.マイナスを削り取る方法&lt;/h2&gt;&#10;&lt;p&gt;単純に計算結果の先頭１文字が &lt;code&gt;-&lt;/code&gt; だった場合には削り取ります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 普通に計算するとマイナスになる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;A-B&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-5&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 先頭１文字が `-` であれば削り取る&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;A-B&lt;span class="k"&gt;))&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/^-//&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;変数に代入されていれば変数参照の構文として削り取ることもできます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$((&lt;/span&gt;A-B&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;#-&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;変数に代入されていれば、「マイナスを削り取る方法」がコード量は少なく楽ちんです。&lt;/p&gt;</description></item><item><title>WordPressのLuxeritasテーマでpreタグSyntaxHighlightを無効にしてもCopyボタンが有効になってしまう問題に対処</title><link>https://genzouw.com/entry/2020/01/12/070003/1870/</link><pubDate>Sun, 12 Jan 2020 07:00:03 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/12/070003/1870/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2020/01/09/000250"&gt;WordPressのLuxeritasテーマでpreタグ内の空行が消えてしまう問題に対処&lt;/a&gt; でも触れましたが、 当ブログは &lt;a href="https://wordpress.com/"&gt;WordPress&lt;/a&gt; で構築されており、 &lt;a href="https://thk.kanzae.net/wp/"&gt;Luxeritas&lt;/a&gt; という非常にSEO効果の高い無料のテーマを利用しています。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;pre&lt;/code&gt; タグの &lt;strong&gt;Syntax Highlight&lt;/strong&gt; は &lt;a href="https://github.com/terrylinooo/githuber-md/"&gt;WP Githuber MD&lt;/a&gt; プラグインで実現したいため、Luxeritasテーマで提供されている &lt;strong&gt;Syntax Highlight&lt;/strong&gt; 機能を無効にしてみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=17kXDBuswQcT0vd4n_cdxSJ6Gc8-UqDUp" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;ところが、Copyボタンが残ってしまいました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=12NokjhO3iuPuXCnMxC6Ilay2ni_8Kf_o" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;この問題を解決させてみたいと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※こちらの対処法はLuxeritasテーマのAMP機能を利用している場合は推奨しません。AMP機能利用時は、Luxeritasテーマのシンタックスハイライトを利用したほうがうまくいくようです。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;WordPress&lt;/strong&gt; : バージョン &lt;code&gt;5.3.2&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Luxeritas&lt;/strong&gt; : バージョン &lt;code&gt;3.7.5.1&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="luxeritasテーマのファイルを編集する"&gt;Luxeritasテーマのファイルを編集する&lt;/h2&gt;&#10;&lt;p&gt;前回、変更を行っているので多少ソースコードのあたりはつけやすくなりました。&#10;以下のファイルを1行だけ変更します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;wp-content/themes/luxeritas/inc/load-inline.php&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;以下のスクリーンショットのようにコードを変更します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1TBj3ybephPsydKUlvIsNuU-h8fMoLxPr" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;これで無事、不要な文字とCopyボタンが表示されなくなりました。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;Luxeritasテーマで最近困っていたことは一通り解決でき、すっきりしました。&lt;/p&gt;</description></item><item><title>「WP Githuber MD」を使ってWordPressのエントリを開き直すとMarkdownがHTMLになってしまう問題に対応</title><link>https://genzouw.com/entry/2020/01/11/143234/1864/</link><pubDate>Sat, 11 Jan 2020 14:32:34 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/11/143234/1864/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;僕は仕事でもプライベート（！？）でも、 &lt;strong&gt;Markdown&lt;/strong&gt; を使ってドキュメントを残すことが多いです。&lt;/p&gt;&#10;&lt;p&gt;もはや &lt;strong&gt;Markdown&lt;/strong&gt; はなくてはならないツールとなりました。&lt;/p&gt;&#10;&lt;p&gt;当ブログのエントリも、 &lt;a href="https://wordpress.org/plugins/wp-githuber-md/"&gt;WP Githuber MD&lt;/a&gt; という &lt;strong&gt;WordPress&lt;/strong&gt; のプラグインを使い、 &lt;strong&gt;Markdown&lt;/strong&gt; で記述したものを &lt;strong&gt;HTML&lt;/strong&gt; に変換してページ表示させるという方法で執筆しています。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1UMSmWHvyyahhkhd14lRFJ9kyq-0Myy4a" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;ところがWordPressの設定変更を繰り返したあたりから投稿内容をWordPressの編集画面で開き直すと &lt;strong&gt;Markdown&lt;/strong&gt; ではなく &lt;strong&gt;HTML&lt;/strong&gt; になってしまうようになってしまいました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1xrvuun51z3SZlQjWRIPbh7zUNYHE1LC8" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;こちらの原因と対処についてまとめてみます。&lt;/p&gt;&#10;&lt;h2 id="導入しているwordpressのプラグイン一部抜粋"&gt;導入しているWordPressのプラグイン（一部抜粋）&lt;/h2&gt;&#10;&lt;p&gt;僕が導入しているWordPressのプラグインはいくつかあります。&#10;一部抜粋(2つだけですが&amp;hellip;)すると以下のようなものがインストールされています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://wordpress.org/plugins/jetpack/"&gt;Jetpack by WordPress.com&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://wordpress.org/plugins/wp-githuber-md/"&gt;WP Githuber MD&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;今回の問題に関わっているのは上記の２つのプラグインでした。&lt;/p&gt;&#10;&lt;h2 id="原因はjetpackの設定"&gt;原因はJetPack（の設定）&lt;/h2&gt;&#10;&lt;p&gt;原因は &lt;strong&gt;Jetpack&lt;/strong&gt; （の設定）でした。&#10;&lt;strong&gt;WP Githuber MD&lt;/strong&gt; プラグインを有効にした状態で、 &lt;strong&gt;Jetpack&lt;/strong&gt; の設定ページの「執筆」タブを開くと、Markdownに関する設定が以下のようになっています。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1qAeivwtvbzR8MApEvyLbLDKfoPUX9Dyx" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;これは、エントリの編集ページでMarkdown構文を利用できるようにするための設定です。&#10;設定上は &lt;strong&gt;無効&lt;/strong&gt; になっています。&lt;/p&gt;&#10;&lt;p&gt;ただし、 &lt;strong&gt;WP Githuber MD&lt;/strong&gt; プラグインを一時的に &lt;strong&gt;無効&lt;/strong&gt; にした状態で、再度こちらの設定ページを開いてみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=15lv7_s6_iDG8fQP5JFfcXgDcm3p1O8bI" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Jetpack&lt;/strong&gt; のMarkdown構文の利用が&lt;strong&gt;有効&lt;/strong&gt; となっています。&lt;/p&gt;&#10;&lt;h2 id="一度wp-githuber-mdを無効にしてjetpackの設定を確認してみることをおすすめします"&gt;一度「WP Githuber MD」を無効にしてJetpackの設定を確認してみることをおすすめします&lt;/h2&gt;&#10;&lt;p&gt;もし同様の問題に悩んでいる方がいれば、一度 &lt;strong&gt;WP Githuber MD&lt;/strong&gt; プラグインを無効にした状態で &lt;strong&gt;Jetpack&lt;/strong&gt; の設定を確認してみてください。&lt;/p&gt;</description></item><item><title>Chrome79以降からは、ステータスコード401を返すページにBasic認証を設定するとアクセスできなくなる</title><link>https://genzouw.com/entry/2020/01/09/120048/1857/</link><pubDate>Thu, 09 Jan 2020 12:00:48 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/09/120048/1857/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今までBasic認証をかけていて閲覧はできていたページが、Chrome79から急に閲覧できなくなるという問題が発生しました。&lt;/p&gt;&#10;&lt;p&gt;StackOverflowやTwitterなどを調べてみてもそのような問題で悩んでいる方はいません。&lt;/p&gt;&#10;&lt;p&gt;ちなみに対象のページはやや特殊で、Basic認証をかける以前から、サービスにログインせずにアクセスした場合は &lt;code&gt;ステータスコード = 401&lt;/code&gt; を返却しつつ、ページコンテンツを返却します。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.chromium.org/"&gt;Chromium&lt;/a&gt; のソースコードを読んでみましたが、なかなかリーディングができず。（これは僕のスキルの問題です）&lt;/p&gt;&#10;&lt;p&gt;そこで実際に問題を再現させた後、「原因」の調査と「対策」を検討してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;h3 id="サーバサイド"&gt;サーバサイド&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ apachectl -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server version: Apache/2.4.38 &lt;span class="o"&gt;(&lt;/span&gt;Debian&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server built: 2019-08-18T13:34:20&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ php -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PHP 7.2.23 &lt;span class="o"&gt;(&lt;/span&gt;cli&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;built: Oct &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="m"&gt;2019&lt;/span&gt; 00:23:19&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt; NTS &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; 1997-2018 The PHP Group&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zend Engine v3.2.0, Copyright &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; 1998-2018 Zend Technologies&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="クライアントサイド"&gt;クライアントサイド&lt;/h2&gt;&#10;&lt;h3 id="プラットフォーム"&gt;プラットフォーム&lt;/h3&gt;&#10;&lt;p&gt;PC&lt;/p&gt;&#10;&lt;h3 id="ブラウザ"&gt;ブラウザ&lt;/h3&gt;&#10;&lt;p&gt;2020-01-08現在、確認した環境は以下の２つです。 &lt;code&gt;version 81&lt;/code&gt; は &lt;strong&gt;Chrome Canary&lt;/strong&gt; を利用しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;Version 79.0.3945.88 (Official Build) (64-bit)&lt;/code&gt; ( &lt;strong&gt;Chrome&lt;/strong&gt; )&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Version 81.0.4020.0 (Official Build) canary (64-bit)&lt;/code&gt; ( &lt;strong&gt;Chrome Canary&lt;/strong&gt; )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;*&lt;em&gt;※いずれの環境でも問題が発生することを確認済みです。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>WordPressのLuxeritasテーマでpreタグ内の空行が消えてしまう問題に対処</title><link>https://genzouw.com/entry/2020/01/09/000250/1855/</link><pubDate>Thu, 09 Jan 2020 00:02:50 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/09/000250/1855/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;当ブログは &lt;a href="https://wordpress.com/"&gt;WordPress&lt;/a&gt; で構築しています。&#10;WordPressのテーマは &lt;a href="https://thk.kanzae.net/wp/"&gt;Luxeritas&lt;/a&gt; という「無料」で「SEO最適化」された「高機能」のテーマを利用しており、大変重宝しています。&lt;/p&gt;&#10;&lt;p&gt;時々バージョンアップを行っていたのですが、ある時からエントリの &lt;code&gt;pre&lt;/code&gt; タグ内のコンテンツから空白行が消えてしまうという現象が発生してしまいました。&#10;以下のイメージは &lt;strong&gt;問題解消後&lt;/strong&gt; のものになります。 &lt;strong&gt;空行&lt;/strong&gt; が2行ありますが、この行が消えてしまうという問題でした。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1ZSzh40wTiMTmBlF9yTKpZhbPmILTM1rw" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;WordPressのコードは愚か、テーマなど触ったこともなかったのですが、最終的には自分で修正してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;WordPress&lt;/strong&gt; : バージョン &lt;code&gt;5.3.2&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Luxeritas&lt;/strong&gt; : バージョン &lt;code&gt;3.7.5.1&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="1googleで調べてみる"&gt;1.Googleで調べてみる&lt;/h2&gt;&#10;&lt;p&gt;まずはGoogleで同様の現象に悩んでいる方がいないか調べてみました。&#10;同じような問題で悩んでいる方はいないようでした。&lt;/p&gt;&#10;&lt;h2 id="2公式サイトで調べてみる"&gt;2.公式サイトで調べてみる&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://thk.kanzae.net/wp/"&gt;Luxeritas&lt;/a&gt; の公式ページから調べてみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://thk.kanzae.net/wp/page-3176/"&gt;Q&amp;amp;A よくある質問 | Luxeritas Theme&lt;/a&gt; のページも見てみましたが、特に記載はありません。&lt;/p&gt;&#10;&lt;h2 id="3最新版にバージョンアップしてみる"&gt;3.最新版にバージョンアップしてみる&lt;/h2&gt;&#10;&lt;p&gt;もしかしたら最新バージョンでは修正されている問題かもしれません。&#10;試しにバージョンアップしてみましたが、やはり問題は解消されませんでした。&lt;/p&gt;&#10;&lt;h2 id="4twitterで聞いてみる"&gt;4.Twitterで聞いてみる&lt;/h2&gt;&#10;&lt;p&gt;製作者の方に恐縮ですが、Twitterのアカウントを見つけたので相談してみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1NnulzvSXF7Z_HAP29qkTvfxyxI-P2LJ5" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;ご丁寧に「公式ページ」で質問などを受け付けてくれているという回答をいただきました。&lt;/p&gt;&#10;&lt;h2 id="5公式ページで問い合わせしてみる"&gt;5.「公式ページ」で問い合わせしてみる&lt;/h2&gt;&#10;&lt;p&gt;問い合わせページを探して問い合わせしようと思いましたが、こちらでは &lt;strong&gt;Luxeritas&lt;/strong&gt; に関する問い合わせは受け付けていらっしゃらないようでした。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1UFqcZRdIsx1q2N_7XOk5HehciJqBJjGD" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="自分で頑張ってみることにする"&gt;自分で頑張ってみることにする&lt;/h2&gt;&#10;&lt;p&gt;自分で頑張って修正してみることにしました。&lt;br&gt;&#10;ここでは最終的にどこを修正したかだけまとめておくことにします。&lt;/p&gt;&#10;&lt;h3 id="修正したファイル"&gt;修正したファイル&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;wp-content/themes/luxeritas/inc/filters.php&lt;/code&gt;&lt;/p&gt;&#10;&lt;h3 id="修正箇所"&gt;修正箇所&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;以下のスクリーンショットの行をコメントアウトします。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1b5DgHpIURAZ4-_r3GXsEEAL5sEaUpNqM" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="結果"&gt;結果&lt;/h2&gt;&#10;&lt;p&gt;これで無事、 &lt;code&gt;pre&lt;/code&gt; タグ内の空行が正しく表示されるようになりました。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;コード量も結構あり、これで正しい修正なのかという思いはありますが、今のところ正常に動作しているようですので様子を見たいと思います。&lt;/p&gt;&#10;&lt;p&gt;問題が見つかった場合、当エントリに追記したいと思います。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでログ出力をシンプルに実現する方法</title><link>https://genzouw.com/entry/2020/01/06/120027/1845/</link><pubDate>Mon, 06 Jan 2020 12:00:27 +0900</pubDate><guid>https://genzouw.com/entry/2020/01/06/120027/1845/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトはお世辞にも読みやすいコードとは言えません。&#10;なのでできる限りシンプルに、短く記述したいのですが、工夫をしないと &lt;strong&gt;ログ出力&lt;/strong&gt; 処理がごちゃごちゃしてしまいます。&lt;/p&gt;&#10;&lt;p&gt;例えば、すべての出力、エラー出力をログとして保存しようとすると以下のような記述ができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LOG_OUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/stdout.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;LOG_ERR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp/stderr.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 標準出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; foo1 &amp;gt;&amp;gt;&lt;span class="nv"&gt;$LOG_OUT&lt;/span&gt; 2&amp;gt;&amp;gt;&lt;span class="nv"&gt;$LOG_ERR&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; foo2 &amp;gt;&amp;gt;&lt;span class="nv"&gt;$LOG_OUT&lt;/span&gt; 2&amp;gt;&amp;gt;&lt;span class="nv"&gt;$LOG_ERR&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; foo3 &amp;gt;&amp;gt;&lt;span class="nv"&gt;$LOG_OUT&lt;/span&gt; 2&amp;gt;&amp;gt;&lt;span class="nv"&gt;$LOG_ERR&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 標準エラー出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls /foo &amp;gt;&amp;gt;&lt;span class="nv"&gt;$LOG_OUT&lt;/span&gt; 2&amp;gt;&amp;gt;&lt;span class="nv"&gt;$LOG_ERR&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm /foo &amp;gt;&amp;gt;&lt;span class="nv"&gt;$LOG_OUT&lt;/span&gt; 2&amp;gt;&amp;gt;&lt;span class="nv"&gt;$LOG_ERR&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./test.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /tmp/stdout.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;foo1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;foo2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;foo3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /tmp/stderr.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls: cannot access &lt;span class="s1"&gt;&amp;#39;/foo&amp;#39;&lt;/span&gt;: No such file or directory&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm: cannot remove &lt;span class="s1"&gt;&amp;#39;/foo&amp;#39;&lt;/span&gt;: No such file or directory&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;スクリプトが小さな間は良いのですが、大きくなってきた場合、このような記述が乱立していると非常に見にくいです。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;もっと見やすくするための記述方法があります。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="1-exec-コマンドを利用する"&gt;1. &lt;code&gt;exec&lt;/code&gt; コマンドを利用する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;exec&lt;/code&gt; コマンドを利用することで、上記のようなログ出力処理をシンプルに記述できます。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでiniファイルを読み、環境変数を定義する</title><link>https://genzouw.com/entry/2019/12/23/150005/1842/</link><pubDate>Mon, 23 Dec 2019 15:00:05 +0900</pubDate><guid>https://genzouw.com/entry/2019/12/23/150005/1842/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;$HOME/.bitbucket&lt;/code&gt; という &lt;code&gt;INI&lt;/code&gt; ファイル形式のファイルを読み込み、 &lt;code&gt;... = ...&lt;/code&gt; 形式で書かれている行から環境変数を定義したくなりました。&#10;簡単なコードで実現してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sed-を使う"&gt;&lt;code&gt;sed&lt;/code&gt; を使う&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; を使って、 &lt;code&gt;... = ...&lt;/code&gt; というフォーマットの行だけを抽出して &lt;code&gt;source&lt;/code&gt; コマンドに食わせます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# iniファイルのファイルパスを定義&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;INI_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/.bitbucket&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ... = ... 形式の行のみを抽出して、 source コマンドに食わせる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;source&lt;/span&gt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;sed -n -E &lt;span class="s1"&gt;&amp;#39;s/^\s*(\S+)\s*=\s*(.+)$/\1=\2/p&amp;#39;&lt;/span&gt; &amp;lt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INI_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに、特定のセクション ( &lt;code&gt;[ ... ]&lt;/code&gt; )以降に書かれている設定のみを読み込むには以下のように記述します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat test.ini&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;section0&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;z&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;333&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;section1&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;section2&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;xxx&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# iniファイルのファイルパスを定義&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;INI_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;test.ini&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# sectionを指定&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;SECTION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;section1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ... = ... 形式の行のみを抽出して、 source コマンドに食わせる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;source&lt;/span&gt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;sed -n -E &lt;span class="s1"&gt;&amp;#39;/^\[&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SECTION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;\]/,/^\[\S+\]/s/^\s*(\S+)\s*=\s*(.+)$/\1=\2/p&amp;#39;&lt;/span&gt; &amp;lt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INI_FILE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;^[abc]=&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;a&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;b&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;もう少し簡潔に書きたい。ちょっとごちゃごちゃしたワンライナーになってますね。&lt;/p&gt;</description></item><item><title>fzfを使ってghqで取得したリポジトリ一覧を検索しcdするためのコマンドを作成</title><link>https://genzouw.com/entry/2019/12/20/155122/1834/</link><pubDate>Fri, 20 Dec 2019 15:51:22 +0900</pubDate><guid>https://genzouw.com/entry/2019/12/20/155122/1834/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/12/08/225719"&gt;既存のすべてのBitbucketリポジトリをGithubに移行するためのシェルコマンド&lt;/a&gt; で、 &lt;a href="https://github.com/"&gt;Github&lt;/a&gt; や &lt;a href="https://bitbucket.org/product"&gt;Bitbucket&lt;/a&gt; のリポジトリの取得方法、取得したソースコードの配置場所を統合できましたが、これらのリポジトリの検索や移動がもっと楽にするために検索・移動コマンドを作成してみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="必要なもの"&gt;必要なもの&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/junegunn/fzf"&gt;fzf&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/motemen/ghq"&gt;ghq&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="作成したコマンド関数"&gt;作成したコマンド（関数）&lt;/h2&gt;&#10;&lt;p&gt;以下の関数を定義します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ fgh&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;REPO_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;ghq list &amp;gt;/dev/null &lt;span class="p"&gt;|&lt;/span&gt; fzf-tmux --reverse +m&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[[&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;ghq root&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;REPO_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ghq&lt;/code&gt; で取得したリポジトリを検索したい場合はこの関数を実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ fgh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下に今回作成した関数を実行した動画を共有します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/12/2019-12-20-09-42-30-2.gif" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;~/.bashrc&lt;/code&gt; や &lt;code&gt;~/.zshrc&lt;/code&gt; に追記しておくと良いですね。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;各ネタが付きたので軽めのエントリでした。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで文字列を分割(split)する方法いろいろ</title><link>https://genzouw.com/entry/2019/12/17/120057/1831/</link><pubDate>Tue, 17 Dec 2019 12:00:57 +0900</pubDate><guid>https://genzouw.com/entry/2019/12/17/120057/1831/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;最近、Bash で特定の文字 ( あるいは文字列 ) で連結されている文字列を分割して配列に代入したい場合の方法について聞かれることがあったのでまとめました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="大きく-2-つのケースを考えてみる"&gt;大きく 2 つのケースを考えてみる&lt;/h2&gt;&#10;&lt;p&gt;文字列の分割 ( split ) について、大きく 2 つのケースを考えてみます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;単一の文字で分割&lt;/li&gt;&#10;&lt;li&gt;複数の文字 ( 文字列 ) で分割&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="単一の文字で分割する方法"&gt;単一の文字で分割する方法&lt;/h2&gt;&#10;&lt;h3 id="1変数参照時に置換する"&gt;1.変数参照時に置換する&lt;/h3&gt;&#10;&lt;p&gt;Bash では、スペースを区切り文字として取り扱います。&#10;したがって、区切り文字をスペースに置換し、 &lt;code&gt;(..)&lt;/code&gt; で囲んで配列にします。&#10;最も簡潔に実現できます ( &lt;strong&gt;問題点については後述&lt;/strong&gt; ) 。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;STR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;I,am,a,pen&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# split&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;ARR&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;STR&lt;/span&gt;&lt;span class="p"&gt;//,/ &lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配列の1番目の要素&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ARR&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配列の2番目の要素&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ARR&lt;/span&gt;&lt;span class="p"&gt;[1]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;am&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ループで1要素ずつ出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;for&lt;/span&gt; S in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;ARR&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$S&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;am&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pen&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;※ただし、この方法には問題があります。本来区切り文字でないスペースが含まれている場合、スペースで区切られてしまいます。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでは、関数の中に関数がかける</title><link>https://genzouw.com/entry/2019/12/16/120058/1829/</link><pubDate>Mon, 16 Dec 2019 12:00:58 +0900</pubDate><guid>https://genzouw.com/entry/2019/12/16/120058/1829/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; 上のシェルスクリプトを見ていたときに面白そうな機能を見つけたので投稿しておきます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="関数の中に関数がかける"&gt;関数の中に関数がかける&lt;/h2&gt;&#10;&lt;p&gt;スクリプトを見ながら確認してみましょう。&lt;/p&gt;&#10;&lt;p&gt;まずは関数を定義します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ func1 &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello world&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;定義した関数を呼び出してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ func1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello world&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここから、 &lt;code&gt;func1&lt;/code&gt; の定義を変更します。&#10;&lt;code&gt;func1&lt;/code&gt; の中で &lt;code&gt;func2&lt;/code&gt; という関数を定義し、さら呼び出してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 関数を定義する&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ func1 &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 関数func2を定義する&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; func2 &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;I am sub function.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello world&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# func2を呼び出す&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; func2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;関数 &lt;code&gt;func1&lt;/code&gt; を実行した結果は以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ func1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello world&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;I am sub &lt;span class="k"&gt;function&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;関数の中で関数が定義でき、かつそれを呼び出せることがわかります。&lt;/p&gt;</description></item><item><title>lessコマンドで文字列検索したときに大文字小文字を無視させる設定方法</title><link>https://genzouw.com/entry/2019/12/14/155631/1825/</link><pubDate>Sat, 14 Dec 2019 15:56:31 +0900</pubDate><guid>https://genzouw.com/entry/2019/12/14/155631/1825/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;古いサーバー環境では less の検索機能で大文字小文字を区別していなかったのに、&#10;新しく構築したサーバで大文字小文字を区別するようになって使いづらかったため、設定方法について書こうと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ less --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;less &lt;span class="m"&gt;458&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;POSIX regular expressions&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; 1984-2012 Mark Nudelman&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="大文字小文字を無視するオプション--i"&gt;大文字小文字を無視するオプション &lt;code&gt;-i&lt;/code&gt;&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;less&lt;/code&gt; コマンド実行時に、 &lt;code&gt;-i&lt;/code&gt; オプションを指定することで、 &lt;code&gt;less&lt;/code&gt; コマンド起動後の検索で大文字小文字を無視させることができます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;/etc/passwd&lt;/code&gt; ファイルを &lt;code&gt;less&lt;/code&gt; で開いて検索する例を取り上げます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /etc/passwd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root:x:0:0:root:/root:/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bin:x:1:1:bin:/bin:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;daemon:x:2:2:daemon:/sbin:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;adm:x:3:4:adm:/var/adm:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sync:x:5:0:sync:/sbin:/bin/sync&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;halt:x:7:0:halt:/sbin:/sbin/halt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mail:x:8:12:mail:/var/spool/mail:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;operator:x:11:0:operator:/root:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;games:x:12:100:games:/usr/games:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nobody:x:99:99:Nobody:/:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dbus:x:81:81:System message bus:/:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のように &lt;code&gt;less&lt;/code&gt; コマンドをパイプで繋いで起動してみます。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで変数の値を変数名として別の変数を参照する方法</title><link>https://genzouw.com/entry/2019/12/13/120003/1821/</link><pubDate>Fri, 13 Dec 2019 12:00:03 +0900</pubDate><guid>https://genzouw.com/entry/2019/12/13/120003/1821/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bash で変数の値を使って、別の変数を参照するにはどう書けばよいでしょう？&lt;/p&gt;&#10;&lt;p&gt;少々説明がくどいですが、PHP や他の言語では普通にできるコードを書けるか？というお話です。&lt;/p&gt;&#10;&lt;p&gt;実際に PHP で書く場合と Bash で書く場合を見ていきます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="php-のコードサンプル"&gt;PHP のコードサンプル&lt;/h2&gt;&#10;&lt;p&gt;以下のように &lt;code&gt;$var1&lt;/code&gt; , &lt;code&gt;$var2&lt;/code&gt; , &lt;code&gt;$var3&lt;/code&gt; の 3 つの変数を、ループを使って参照する場合には以下のようなコードで実現できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$var1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;111&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$var2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;222&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$var3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;333&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;$varName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;var&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;$i&lt;/span&gt;&lt;span class="s2"&gt; = &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;$varName&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nx"&gt;PHP_EOL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ php test.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;111&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;222&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;333&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bash-のコードサンプル"&gt;Bash のコードサンプル&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;方法は 2 つあります。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="1-変数名の前に--を記述する"&gt;1. 変数名の前に &lt;code&gt;!&lt;/code&gt; を記述する&lt;/h3&gt;&#10;&lt;p&gt;先の PHP のサンプルコードと同じように、 &lt;code&gt;var1&lt;/code&gt; , &lt;code&gt;var2&lt;/code&gt; , &lt;code&gt;var3&lt;/code&gt; の 3 つの変数を、ループを使って参照する場合には以下のようなコードで実現できます。&lt;/p&gt;</description></item><item><title>既存のすべてのBitbucketリポジトリをGithubに移行するためのシェルコマンド</title><link>https://genzouw.com/entry/2019/12/08/225719/1815/</link><pubDate>Sun, 08 Dec 2019 22:57:19 +0900</pubDate><guid>https://genzouw.com/entry/2019/12/08/225719/1815/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/"&gt;GitHub&lt;/a&gt; で無制限にプライベートリポジトリを作成できるようになったため、今まで &lt;a href="https://bitbucket.org/product"&gt;Bitbucket&lt;/a&gt; で管理していた自分のリポジトリを &lt;strong&gt;Github&lt;/strong&gt; に移行しました。&lt;/p&gt;&#10;&lt;p&gt;大したコマンドではないのですが、移行のために実行したコマンドを共有します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ hub --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git version 2.24.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hub version 2.13.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前提条件"&gt;前提条件&lt;/h2&gt;&#10;&lt;p&gt;コマンドラインから &lt;strong&gt;Github&lt;/strong&gt; を操作するためのコマンドである &lt;a href="https://github.com/github/hub"&gt;github/hub&lt;/a&gt; がインストールされていることが前提となります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;hub&lt;/code&gt; コマンドについては以前、別のエントリで紹介しています。よかったらご参考ください。&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/08/20/084857"&gt;コマンドラインから”Docker Hub”からDockerイメージを検索し詳細ページを開く | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="実行コマンド"&gt;実行コマンド&lt;/h2&gt;&#10;&lt;p&gt;以下のコマンドを、 &lt;code&gt;git clone&lt;/code&gt; した作業ディレクトリが配置されているディレクトリ配下で実行します。&#10;&lt;code&gt;.git&lt;/code&gt; ディレクトリを探し出し、自動的に &lt;strong&gt;Github&lt;/strong&gt; 上にリポジトリを作成していきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ find . -type d -name .git &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; GIT_DIR&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# .gitディレクトリが置かれているディレクトリに移動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;dirname &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;GIT_DIR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 設定済みのリモートブランチを一度削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git remote rm origin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# github上にプライベートリポジトリを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; hub create -p&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 早すぎると作成したばかりのgithubリポジトリにpushできないことがあるので気持ち待つ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sleep &lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# push&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git push -u&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;このあと、 &lt;code&gt;ghq&lt;/code&gt; コマンドを使ってすべてのリポジトリを取得してきましたがまた機会を見てそのコマンドも掲載します。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで「.」や「source」コマンド経由で呼び出されていないかをチェックする方法</title><link>https://genzouw.com/entry/2019/12/05/080006/1810/</link><pubDate>Thu, 05 Dec 2019 08:00:06 +0900</pubDate><guid>https://genzouw.com/entry/2019/12/05/080006/1810/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/12/04/212515"&gt;Bashシェルスクリプトで関数のコールスタックを取得・出力する&lt;/a&gt; の続きです。&#10;続きというよりも、当エントリを書きたかったための前振りが上記のエントリです。&lt;/p&gt;&#10;&lt;p&gt;実行するシェルスクリプトが、 &lt;code&gt;.&lt;/code&gt; や &lt;code&gt;source&lt;/code&gt; コマンド経由で呼び出された場合には、内部で定義されている &lt;em&gt;変数&lt;/em&gt; や &lt;em&gt;関数&lt;/em&gt; がカレントプロセス上に展開されることになります。&#10;スクリプトのファイル内に書かれている &lt;em&gt;変数&lt;/em&gt; や &lt;em&gt;関数&lt;/em&gt; が漏れてしまうのを避けるための方法を共有します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="funcname-変数をハックする"&gt;&lt;code&gt;$FUNCNAME&lt;/code&gt; 変数をハックする&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/12/04/212515"&gt;Bashシェルスクリプトで関数のコールスタックを取得・出力する&lt;/a&gt; で見たとおり、 &lt;code&gt;.&lt;/code&gt; または &lt;code&gt;source&lt;/code&gt; コマンドを使って呼び出されたスクリプトは、 &lt;code&gt;$FUNCNAME&lt;/code&gt; 変数のスタックトレース上に &lt;code&gt;source&lt;/code&gt; という関数スタックが積まれます。&lt;/p&gt;&#10;&lt;p&gt;この仕組みを利用し、 &lt;code&gt;is_sourced&lt;/code&gt; という関数を作成し、判定を行います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; is_sourced&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FUNCNAME&lt;/span&gt;&lt;span class="p"&gt;[1]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;source&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 真の場合は0となり、 `&amp;amp;&amp;amp;` の後ろのコマンドが実行される。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 偽の場合は1となり、 `&amp;amp;&amp;amp;` の後ろのコマンドは実行されない。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;is_sourced &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;. や source コマンドを使って呼び出してはだめだよ！！&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;.&lt;/code&gt; または &lt;code&gt;source&lt;/code&gt; コマンドを使って呼び出されることを期待する場合には以下のように記述すればOKですね。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで関数のコールスタックを取得・出力する</title><link>https://genzouw.com/entry/2019/12/04/212515/1806/</link><pubDate>Wed, 04 Dec 2019 21:25:15 +0900</pubDate><guid>https://genzouw.com/entry/2019/12/04/212515/1806/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bashシェルスクリプトでログを出力する際などに以下のような情報が欲しい場合がありました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;「現在実行中の関数」の名前&lt;/li&gt;&#10;&lt;li&gt;「現在実行中の関数」の呼び出し元&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これらの情報を取得する方法を説明します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="funcname-変数を使ってコールスタックを参照する"&gt;&lt;code&gt;$FUNCNAME&lt;/code&gt; 変数を使って「コールスタック」を参照する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;$FUNCNAME&lt;/code&gt; という配列の変数を参照することで、関数の「コールスタック」情報が取得できます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;サンプルスクリプトを通して、使い方を見ていきましょう。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="サンプルスクリプトで確認してみる"&gt;サンプルスクリプトで確認してみる&lt;/h3&gt;&#10;&lt;p&gt;以下のような2つのスクリプトを作成して動作を確認してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;script_main.sh script_sub.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat script_main.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#!/usr/bin/env bash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./script_sub.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. ./script_sub.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat script_sub.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#!/usr/bin/env bash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;f1 &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;declare&lt;/span&gt; -p FUNCNAME&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FUNCNAME&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0 = &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FUNCNAME&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1 = &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FUNCNAME&lt;/span&gt;&lt;span class="p"&gt;[1]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2 = &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FUNCNAME&lt;/span&gt;&lt;span class="p"&gt;[2]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3 = &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FUNCNAME&lt;/span&gt;&lt;span class="p"&gt;[3]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;f2 &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; f1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;f2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;f1&lt;/code&gt; 関数を呼び出すまでの流れは大きく以下のようになっています。&lt;/p&gt;</description></item><item><title>Alpine Linuxのapkコマンドでインストール可能なパッケージを検索する方法</title><link>https://genzouw.com/entry/2019/11/28/173400/1795/</link><pubDate>Thu, 28 Nov 2019 17:34:00 +0900</pubDate><guid>https://genzouw.com/entry/2019/11/28/173400/1795/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;dig&lt;/code&gt; コマンドや &lt;code&gt;nmap&lt;/code&gt; をつかって、サーバの外部からの見え方を調査する必要がありました。&#10;軽量でクリーンなLinux環境がほしかったので、 &lt;a href="https://ja.wikipedia.org/wiki/Alpine_Linux"&gt;Alpine Linux&lt;/a&gt; を使ってみたのですが、パッケージの探し方について &lt;code&gt;yum&lt;/code&gt; や &lt;code&gt;apt&lt;/code&gt; との違いが理解できていませんでした。&lt;/p&gt;&#10;&lt;p&gt;特に導入したいコマンドを含むパッケージをどうやって探すかについて知らなかったので調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.8&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin20.3.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まずは-alpine-linux-の起動"&gt;まずは &amp;ldquo;Alpine Linux&amp;rdquo; の起動&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;docker&lt;/code&gt; コマンドを使って、 &amp;ldquo;Alpine Linux&amp;rdquo; を起動します。&#10;以下のコマンドを実行すれば初回実行時のみ、 &amp;ldquo;Docker Hub&amp;rdquo; からイメージファイルがダウンロードされます。&#10;ダウンロードが完了していれば、直ちに &amp;ldquo;Alpine Linux&amp;rdquo; コンテナが起動し、ログイン済み状態となります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -i -t --rm alpine&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/ &lt;span class="c1"&gt;#&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="1-インストール可能なパッケージをwebから検索する方法"&gt;1. 「インストール可能なパッケージ」をWebから検索する方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;&amp;ldquo;Alpine Linux&amp;rdquo;&lt;/strong&gt; で使えるパッケージは &lt;a href="https://pkgs.alpinelinux.org/contents"&gt;Alpine Linux packages&lt;/a&gt; というサイトから検索できる。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&amp;ldquo;File&amp;rdquo;&lt;/em&gt; という入力エリアに &lt;code&gt;dig&lt;/code&gt; を入力して &lt;em&gt;&amp;ldquo;Search&amp;rdquo; ボタン&lt;/em&gt; を押します。&lt;/p&gt;</description></item><item><title>シェルスクリプトでラーメンを食べたい思いをワンライナー</title><link>https://genzouw.com/entry/2019/10/09/182532/1783/</link><pubDate>Wed, 09 Oct 2019 18:25:32 +0900</pubDate><guid>https://genzouw.com/entry/2019/10/09/182532/1783/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今日はラーメン食べにいくぞ！という思いをワンライナーで。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;for&lt;/span&gt; i in &lt;span class="o"&gt;{&lt;/span&gt;1..30&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; j in &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;..30&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;\U1F35C&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; echo&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tac&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;折り返すと以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;for&lt;/span&gt; i in &lt;span class="o"&gt;{&lt;/span&gt;1..30&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; j in &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;$i&lt;/span&gt;..30&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;\U1F35C&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; tac&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1MnT1wWlgzYHCT8pXny2FS_JdEHjG_6un" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;今からラーメン食べにいきます。&lt;/p&gt;</description></item><item><title>シェルスクリプトで上下左右から何文字か切り取る方法(行列の操作)</title><link>https://genzouw.com/entry/2019/10/08/093253/1773/</link><pubDate>Tue, 08 Oct 2019 09:32:53 +0900</pubDate><guid>https://genzouw.com/entry/2019/10/08/093253/1773/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトで上下左右から文字列を切り取る方法について。&#10;共通したコマンドがないため、いくつかのコマンドを組み合わせて実現することになります。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;以下のコマンドを実行し、操作対象のテキストファイルを作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2重ループさせる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; i in &lt;span class="o"&gt;{&lt;/span&gt;0..9&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="nv"&gt;$i&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; j in &lt;span class="o"&gt;{&lt;/span&gt;1..9&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="nv"&gt;$j&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt; &amp;gt;sample.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一番左の列に0から始まる行番号が出力されている&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat sample.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="いろいろな切り取り方法"&gt;いろいろな切り取り方法&lt;/h2&gt;&#10;&lt;h3 id="上から2行切り取り"&gt;上から2行切り取り&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; コマンドを利用する方法があります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat sample.txt &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;1,2d&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9123456789&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;tail&lt;/code&gt; コマンドを利用する方法もあります。&#10;( プラス &lt;strong&gt;+&lt;/strong&gt; 記号をつけるのがポイントです。 )&lt;/p&gt;</description></item><item><title>イメージファイルをターミナル用の色付アスキーアートに変換するWebAPIを公開しました。</title><link>https://genzouw.com/entry/2019/09/27/131222/1770/</link><pubDate>Fri, 27 Sep 2019 13:12:22 +0900</pubDate><guid>https://genzouw.com/entry/2019/09/27/131222/1770/</guid><description>&lt;h2&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;ANSI エスケープシーケンス&lt;/strong&gt; といって、Unix系のターミナル上に色付きの文字列を出力することができます。&lt;/p&gt;&#10;&lt;p&gt;例えば、 &lt;code&gt;echo&lt;/code&gt; コマンドでは出力したい文字列の前に &lt;code&gt;\e[35m&lt;/code&gt; （数値部分は任意。）といった制御文字を出力させることでターミナルに出力される文字列に色を付けることができます。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-bash"&gt;$ echo '\e[35mHello\e[0m! \e[31mWorld\e[0m!'&#10;Hello! World!&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://docs.google.com/uc?id=1K2JPHpDOLFKHlG0c4_PsZ31vBBgIpko9" alt="" /&gt;&#10;&lt;p&gt;イメージファイルを指定して、色付アスキーアート文字列を出力できたらと思いWebAPIを作成してみました。&lt;/p&gt;&#10;&lt;h2&gt;img2txt&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://img2txt.genzouw.com/"&gt;img2txt&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3&gt;機能&lt;/h3&gt;&#10;&lt;p&gt;イメージファイルのURLを指定すると、Unixターミナル用の色付アスキーアートを取得できます。&lt;/p&gt;&#10;&lt;h3&gt;WebAPIのエンドポイントURL&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;https://img2txt.genzouw.com&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3&gt;使い方&lt;/h3&gt;&#10;&lt;h4&gt;基本&lt;/h4&gt;&#10;&lt;p&gt;&lt;code&gt;curl&lt;/code&gt; コマンドを利用するのが簡単です。&#10;&lt;code&gt;curl&lt;/code&gt; コマンドでWebAPIを呼び出します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;urlパラメータ&lt;/strong&gt; ： イメージファイルのURLを指定します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code class="language-bash"&gt;# 右記のイメージファイルURLをWebAPIに渡します → https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png &#10;$ curl -sS 'https://img2txt.genzouw.com?url=https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;ターミナルに以下のようなアスキーアートが表示されるはずです。&lt;/p&gt;&#10;&lt;img src="https://docs.google.com/uc?id=1Misiy7lJKYOvnFI4i6GG4x6vmvtlpgBy" alt="" /&gt;&#10;&lt;h4&gt;応用&lt;/h4&gt;&#10;&lt;p&gt;出力内容をトリミングすることもできます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;tlパラメータ&lt;/strong&gt; ： &lt;em&gt;数値を指定します。&lt;/em&gt; 左からN列を除去します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;trパラメータ&lt;/strong&gt; ： &lt;em&gt;数値を指定します。&lt;/em&gt; 右からN列を除去します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ttパラメータ&lt;/strong&gt; ： &lt;em&gt;数値を指定します。&lt;/em&gt; 上からN行を除去します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;tbパラメータ&lt;/strong&gt; ： &lt;em&gt;数値を指定します。&lt;/em&gt; 下からN行を除去します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;pre&gt;&lt;code class="language-bash"&gt;# 左から10列を削除&#10;$ curl -sS 'https://img2txt.genzouw.com?url=https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png&amp;amp;tl=10'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://docs.google.com/uc?id=1oFwCTTGZ9gOotgKsa2G7Zaw66marw4x7" alt="" /&gt;&#10;&lt;pre&gt;&lt;code class="language-bash"&gt;# 上下左右10行、10列を削除&#10;$ curl -sS 'https://img2txt.genzouw.com?url=https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png&amp;amp;tl=10&amp;amp;tr=10&amp;amp;tt=10&amp;amp;tb=10'&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;img src="https://docs.google.com/uc?id=1ellnvstcGR1xQ6TT-bICVi9KCQXFx4JN" alt="" /&gt;&#10;&lt;h2&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;感想をお待ちしております。&lt;/p&gt;</description></item><item><title>sedで複数行にまたがった文字列を置換する方法</title><link>https://genzouw.com/entry/2019/09/09/085746/1722/</link><pubDate>Mon, 09 Sep 2019 08:57:46 +0900</pubDate><guid>https://genzouw.com/entry/2019/09/09/085746/1722/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; コマンドで置換する場合、 複数行にまたがった文字列も置換対象としたい場合があります。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed &lt;span class="o"&gt;(&lt;/span&gt;GNU sed&lt;span class="o"&gt;)&lt;/span&gt; 4.2.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="置換対象の文字列が複数行にまたがる場合とは"&gt;置換対象の文字列が複数行にまたがる場合とは？&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; はラインエディタの思想を受け継いでいるため、 &lt;strong&gt;基本的に入力情報を１行ずつ受け取って処理を行&lt;/strong&gt; います。&lt;/p&gt;&#10;&lt;p&gt;例えば、 &lt;code&gt;%&lt;/code&gt; で囲まれた部分を空文字に置換するといった場合、合致パターンが 1 行で収まるため容易に置換できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;xx%aaa%yyy&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xx%aaa%yyy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;xx%aaa%yyy&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/%.*%//&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxyyy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ところが、 &lt;strong&gt;合致パターンが複数行にまたがったときにはうまく置換してくれません&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2つの%の間に改行が含まれている&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;xxx%aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;bbb%yyy&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxx%aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bbb%yyy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 置換されない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;xxx%aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;bbb%yyy&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/%.*%//&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxx%aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bbb%yyy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2 つの対処法を取り上げます。&lt;/p&gt;&#10;&lt;h2 id="1gnu-版-sed-が利用できる場合"&gt;1.GNU 版 sed が利用できる場合&lt;/h2&gt;&#10;&lt;p&gt;GNU 版の sed が利用できる場合、 &lt;code&gt;-z&lt;/code&gt; オプションを利用することで、簡単に対処できます。&#10;これは &lt;code&gt;sed&lt;/code&gt; のデフォルトの挙動である「行単位の処理」から「ヌル文字単位の処理」に挙動を切り替える、というオプションになります。&lt;/p&gt;</description></item><item><title>Dockerのイメージビルド中でapt-getを高速化するたった1つの方法</title><link>https://genzouw.com/entry/2019/09/04/085135/1718/</link><pubDate>Wed, 04 Sep 2019 08:51:35 +0900</pubDate><guid>https://genzouw.com/entry/2019/09/04/085135/1718/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;(追記)煽りタイトルが思っていたより反響があるのだなと思いました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;Dockerのイメージビルド処理は少しでも速い方が、試行錯誤にかかる時間を減らすことができます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;apt-get&lt;/code&gt; にかかる時間が全体のそこそこの時間を占めているのでなんとかできないかと思いました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="何も対処しない場合の処理時間"&gt;何も対処しない場合の処理時間&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;curl&lt;/code&gt; と &lt;code&gt;postgresql-client&lt;/code&gt; が必要だったので、この２つをインストールしただけのイメージを作成してみます。&lt;/p&gt;&#10;&lt;p&gt;以下のような &lt;code&gt;Dockerfile&lt;/code&gt; を作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM ubuntu:19.10&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RUN apt-get update &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get install --no-install-recommends -y &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; postgresql-client &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt-get clean &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; rm -r /var/lib/apt/lists/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この &lt;code&gt;Dockerfile&lt;/code&gt; を使ってイメージをビルドしてみます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;3回実行します。&lt;/li&gt;&#10;&lt;li&gt;ログが大量に出力されるため、 &lt;code&gt;before.log&lt;/code&gt; というファイルにリダイレクトし捨てておきます。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;time&lt;/code&gt; コマンドでどのぐらいの処理時間がかかるのかを確認してみます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 0&lt;span class="p"&gt;;&lt;/span&gt; i &amp;lt; 3&lt;span class="p"&gt;;&lt;/span&gt; i++&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;time&lt;/span&gt; docker build --no-cache -t genzouw/test . 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &amp;gt;&amp;gt;before.log&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build --no-cache -t genzouw/test . 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &amp;gt;&amp;gt; before.log 1.86s user 1.22s system 3% cpu 1:24.17 total&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build --no-cache -t genzouw/test . 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &amp;gt;&amp;gt; before.log 1.81s user 1.28s system 4% cpu 1:14.72 total&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker build --no-cache -t genzouw/test . 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &amp;gt;&amp;gt; before.log 1.92s user 1.38s system 2% cpu 1:51.64 total&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ブレは大きいですが、平均すると &lt;strong&gt;90.18s&lt;/strong&gt; ほどの処理時間がかかっています。&lt;/p&gt;</description></item><item><title>curl+pup+Dockerを使ってシェルスクリプトでスクレイピング</title><link>https://genzouw.com/entry/2019/09/02/085401/1714/</link><pubDate>Mon, 02 Sep 2019 08:54:01 +0900</pubDate><guid>https://genzouw.com/entry/2019/09/02/085401/1714/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;コマンドラインあるいはシェルスクリプトでスクレイピングするときに &lt;code&gt;pup&lt;/code&gt; というツールを使っていましたが、１から環境構築する場合を考え &lt;strong&gt;Docker&lt;/strong&gt; を利用する方法を整理してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.11&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前提"&gt;前提&lt;/h2&gt;&#10;&lt;p&gt;以下のツールがインストールされていること&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://curl.haxx.se"&gt;curl&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="早速試してみる"&gt;早速試してみる&lt;/h2&gt;&#10;&lt;p&gt;ちょうど良さそうなサイトを探したところ、以下のサイトを見つけました。&#10;表示されているイメージを収集してみます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://itstudio.co/sample/flex-gallery/"&gt;GO ON A JOURNEY&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;まずはページのHTMLを取得してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -s https://itstudio.co/sample/flex-gallery/index.html&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを &lt;code&gt;pup&lt;/code&gt; ツールに食わせてパースしたいのですが、今回はローカルPCに &lt;code&gt;pup&lt;/code&gt; をインストールせず、 &lt;code&gt;pup&lt;/code&gt; インストール済みの &lt;code&gt;Docker&lt;/code&gt; イメージを利用してみます。&#10;( &lt;strong&gt;※初回はDockerイメージを取得するため遅いです。&lt;/strong&gt; )&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -s https://itstudio.co/sample/flex-gallery/index.html &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; docker run -i --rm sheogorath/pup-docker &lt;span class="s2"&gt;&amp;#34;.gallery-img img attr{src}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/gallery_1.jpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/gallery_2.jpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/gallery_3.jpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/gallery_4.jpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/gallery_5.jpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/gallery_6.jpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/gallery_7.jpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/gallery_8.jpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/gallery_9.jpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;images/gallery_10.jpg&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もし &lt;code&gt;pup&lt;/code&gt; がインストールされている場合は、以下のコマンドと同義です。&lt;/p&gt;</description></item><item><title>"mkdir"コマンドでディレクトリを作成する際には存在チェックはしなくても良い</title><link>https://genzouw.com/entry/2019/08/23/080036/1710/</link><pubDate>Fri, 23 Aug 2019 08:00:36 +0900</pubDate><guid>https://genzouw.com/entry/2019/08/23/080036/1710/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトでディレクトリを作成し、 &lt;code&gt;cd&lt;/code&gt; コマンドで移動します、というようなロジックを書くことがあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;mkdir&lt;/code&gt; コマンドを単純に実行してしまうと、すでにディレクトリが存在しているときにエラーを吐いてしまうため、ディレクトリ存在チェックを行う必要がありますが面倒です。&lt;/p&gt;&#10;&lt;p&gt;これは簡単に解決できます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ディレクトリの存在チェックロジックを実装する方法"&gt;ディレクトリの存在チェックロジックを実装する方法&lt;/h2&gt;&#10;&lt;p&gt;よく記述していたのは次のようなコードでした。&#10;事前にディレクトリの存在チェックを行い、見つからなかった場合のみディレクトリを作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; ! -d &lt;span class="s2"&gt;&amp;#34;/tmp/of/work&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir -p &lt;span class="s2"&gt;&amp;#34;/tmp/of/work&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/tmp/of/work&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="mkdir--p-コマンドを使ってディレクトリを作成する場合は存在チェックは不要"&gt;&lt;code&gt;mkdir -p&lt;/code&gt; コマンドを使ってディレクトリを作成する場合は存在チェックは不要&lt;/h2&gt;&#10;&lt;p&gt;実はディレクトリの存在チェックを行わなくても先のスクリプトは問題なく動作します。&#10;&lt;code&gt;mkdir -p&lt;/code&gt; コマンドは次のような挙動をします。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;作成対象ディレクトリの親ディレクトリが存在しない場合&lt;/strong&gt; はすべての親ディレクトリを作成する&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;作成対象ディレクトリがすでに存在している場合&lt;/strong&gt; は何も行わず、エラーもはかない&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;試してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一旦ディレクトリを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p /tmp/of/work&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -l -d /tmp/of/work/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxr-xr-x &lt;span class="m"&gt;2&lt;/span&gt; root root &lt;span class="m"&gt;64&lt;/span&gt; Aug &lt;span class="m"&gt;22&lt;/span&gt; 08:26 /tmp/of/work/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# オプション無しですでに存在しているディレクトリを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir /tmp/of/work&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir: cannot create directory &lt;span class="s1"&gt;&amp;#39;/tmp/of/work&amp;#39;&lt;/span&gt;: File exists&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -pオプション有りだとエラーを吐かない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p /tmp/of/work&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$?&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;したがって、先のスクリプトは次のようにかけます。&lt;/p&gt;</description></item><item><title>"ls"コマンドで隠しファイルは出力したいが "." と ".." は出力させない</title><link>https://genzouw.com/entry/2019/08/22/081926/1708/</link><pubDate>Thu, 22 Aug 2019 08:19:26 +0900</pubDate><guid>https://genzouw.com/entry/2019/08/22/081926/1708/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;man&lt;/code&gt; や &lt;code&gt;--help&lt;/code&gt; を調べればすぐわかりますが、使えると思いましたので投稿します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ls-コマンド"&gt;&lt;code&gt;ls&lt;/code&gt; コマンド&lt;/h2&gt;&#10;&lt;h3 id="オプション無しで実行"&gt;オプション無しで実行&lt;/h3&gt;&#10;&lt;p&gt;隠しファイルは見つかりません。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;pwd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls &lt;span class="p"&gt;|&lt;/span&gt; wc -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;anaconda-ks.cfg&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="-a-オプション付きで実行"&gt;&lt;code&gt;-a&lt;/code&gt; オプション付きで実行&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;-a&lt;/code&gt; オプション付きで実行すると、隠しファイル(ディレクトリを含む)を含めてファイルが一覧表示されます。&#10;ただし、カレントディレクトリを表す &amp;ldquo;.&amp;rdquo; と 親ディレクトリを表す &amp;ldquo;..&amp;rdquo; が出力されてしまいます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;pwd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/root&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -a &lt;span class="p"&gt;|&lt;/span&gt; wc -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. .. .bash_logout .bash_profile .bashrc .cshrc .lesshst .pki .tcshrc anaconda-ks.cfg&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="-a-オプション付きで実行-1"&gt;&lt;code&gt;-A&lt;/code&gt; オプション付きで実行&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;-a&lt;/code&gt; オプションの代わりに &lt;code&gt;-A&lt;/code&gt; オプションを使うと、隠しファイル(ディレクトリを含む)が表示されますが、 &lt;code&gt;.&lt;/code&gt; や &lt;code&gt;..&lt;/code&gt; が対象から除外されます。対象は &lt;code&gt;-a&lt;/code&gt; オプション付きのときより2ファイル少ない、8ファイルとなっています。&lt;/p&gt;</description></item><item><title>コマンドラインから"Docker Hub"のDockerイメージを検索し詳細ページを開くスクリプト</title><link>https://genzouw.com/entry/2019/08/20/084857/1703/</link><pubDate>Tue, 20 Aug 2019 08:48:57 +0900</pubDate><guid>https://genzouw.com/entry/2019/08/20/084857/1703/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt; からDockerイメージを検索するためのコマンドとして、 &lt;code&gt;docker search&lt;/code&gt; コマンドが利用できます。&#10;ただ、実際に便利なイメージが見つかったとしても利用する際には詳細ページを閲覧し、カスタマイズするための環境変数を確認したり、エントリポイントとなるコマンドのオプションを確認したりすることが多いです。&lt;/p&gt;&#10;&lt;p&gt;そこで、 &lt;code&gt;docker search&lt;/code&gt; を実行しつつ、検索上位リポジトリの詳細ページをブラウザで開くようにしてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.9&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.6.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="必要なもの"&gt;必要なもの&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Docker（ &lt;code&gt;docker search&lt;/code&gt; コマンドを使いたいため）&lt;/li&gt;&#10;&lt;li&gt;Chromeブラウザ&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="作成したスクリプト"&gt;作成したスクリプト&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;&amp;ldquo;dockerhub&amp;rdquo;&lt;/strong&gt; というスクリプトファイル名で保存します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;KEYWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;SELECTED_ROW_COUNT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;TMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 標準出力と同時に一時ファイルにヘッダ行を除去して書き出しておく&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker search &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;KEYWORD&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; tee &amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;sed &lt;span class="s1"&gt;&amp;#39;1d&amp;#39;&lt;/span&gt; &amp;gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 指定された数分、検索上位のリポジトリをブラウザで開く&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;cat &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; wc -l&lt;span class="k"&gt;)&lt;/span&gt; -ge &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SELECTED_ROW_COUNT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;TMP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -n &lt;span class="s2"&gt;&amp;#34;1,&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SELECTED_ROW_COUNT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;p&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{ print $1 }&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s@^[^/]\+$@library/\0@&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs -n &lt;span class="m"&gt;1&lt;/span&gt; -I&lt;span class="o"&gt;{}&lt;/span&gt; open &lt;span class="s2"&gt;&amp;#34;https://hub.docker.com/r/{}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;以下はGistのコード（AMPページに対応できないので、GistのScriptは使っていません）&lt;/em&gt;&lt;/p&gt;</description></item><item><title>インタラクティブなシェルでバックグランドジョブの完了メッセージを表示させない方法</title><link>https://genzouw.com/entry/2019/08/09/115417/1700/</link><pubDate>Fri, 09 Aug 2019 11:54:17 +0900</pubDate><guid>https://genzouw.com/entry/2019/08/09/115417/1700/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;インタラクティブなシェルでバックグランドジョブを実行させると、ジョブ完了のメッセージが表示されますが、 &lt;code&gt;.bashrc&lt;/code&gt; あるいは &lt;code&gt;.zshrc&lt;/code&gt; でバックグラウンドジョブ実行した場合にこれが煩わしいのでなんとかしたいと思いました。&lt;/p&gt;&#10;&lt;p&gt;解決方法を共有します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="問題の確認"&gt;問題の確認&lt;/h2&gt;&#10;&lt;p&gt;バックグランドジョブ実行を使うと、時間のかかる処理を実行中に別の操作を行うことができます。&#10;便利なのですが、ジョブ完了のメッセージが煩わしい場合があります。&#10;( ex: 調査をしていて、コンソール出力内容をログとして残している )&lt;/p&gt;&#10;&lt;p&gt;ここでいう「ジョブ完了メッセージ」とは以下のようなコマンドを実行した際に出力される内容です。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&amp;lt;実行コマンド&amp;gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; /dev/null &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="c1"&gt;# バックグラウンドジョブ実行（何でも良い）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sleep &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# バックグラウンドジョブの完了を待つ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &amp;gt; /dev/null &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="c1"&gt;# バックグラウンドジョブ実行（何でも良い）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="m"&gt;118&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sleep &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# バックグラウンドジョブの完了を待つ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;+ Done &amp;gt; /dev/null&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Done&lt;/code&gt; の行を出力したくない場合にどうしたらよいでしょう？&lt;/p&gt;&#10;&lt;h2 id="対処法"&gt;対処法&lt;/h2&gt;&#10;&lt;p&gt;バックグラウンド実行させるジョブを &lt;code&gt;(...)&lt;/code&gt; のようにカッコで囲んであげるだけで解決できます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&amp;lt;実行コマンド&amp;gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt; &amp;gt; /dev/null &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# バックグラウンドジョブ実行（何でも良い）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sleep &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# バックグラウンドジョブの完了を待つ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は以下の通り。ジョブ完了メッセージが表示されなくなりました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="o"&gt;(&lt;/span&gt; &amp;gt; /dev/null &lt;span class="p"&gt;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# バックグラウンドジョブ実行（何でも良い）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sleep &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c1"&gt;# バックグラウンドジョブの完了を待つ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;.bashrc&lt;/code&gt; や &lt;code&gt;.zshrc&lt;/code&gt; で &lt;code&gt;source&lt;/code&gt; コマンド経由でなにか処理を呼び出さないといけない場合などにこの方法が使えます。&lt;/p&gt;</description></item><item><title>Docker Hubのイメージを利用してSMTP認証＋メール送信のテストを実施</title><link>https://genzouw.com/entry/2019/08/07/083017/1697/</link><pubDate>Wed, 07 Aug 2019 08:30:17 +0900</pubDate><guid>https://genzouw.com/entry/2019/08/07/083017/1697/</guid><description>&lt;h2 id="久々のエントリです"&gt;久々のエントリです&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;9日間も夏休みをいただき、実家の青森に帰省していました。&lt;/em&gt;&#10;&lt;em&gt;奥入瀬、十和田湖、八甲田山、酸ヶ湯・浅虫温泉、海と自然に目いっぱい触れていると永住したくなってきました。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;新たに利用するSMTPサーバに対して、認証した後メール送信ができるかを検証したかったので、コマンドラインから認証＋メール送信してみました。&lt;/p&gt;&#10;&lt;p&gt;アプリをインストールしたくなかったので &lt;code&gt;Docker&lt;/code&gt; イメージを利用することにしました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 19.03.1, build 74b1e89&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;docker&lt;/code&gt; コマンドが利用できればOKです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ which docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/local/bin/docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="やり方"&gt;やり方&lt;/h2&gt;&#10;&lt;p&gt;以下のように「SMTP」認証に関わる情報の作成とメール情報を設定し、 &lt;code&gt;docker&lt;/code&gt; コマンドを実行するだけです。&lt;/p&gt;&#10;&lt;p&gt;「Docker Hub」上の &lt;code&gt;harobed/docker-heirloom-mailx&lt;/code&gt; というイメージを利用させていただき、 &lt;code&gt;mailx&lt;/code&gt; コマンドを実行しているだけです。&#10;したがって &lt;code&gt;mailx&lt;/code&gt; コマンドをインストールしていればDockerは不要です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 情報を設定（適宜変更してください）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SMTP_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;smtp.example.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SMTP_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_user&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;SMTP_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_password&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MAIL_SUBJECT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;This is SUBJECT&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MAIL_BODY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;This is BODY&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MAIL_FROM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SMTP_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;MAIL_TO&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;anyone@example.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 認証＋メール送信&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MAIL_BODY&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; docker run -i --rm harobed/docker-heirloom-mailx &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mailx &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -v &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -S smtp-use-starttls &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -S smtp-auth&lt;span class="o"&gt;=&lt;/span&gt;login &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -S ssl-verify&lt;span class="o"&gt;=&lt;/span&gt;ignore &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -S &lt;span class="nv"&gt;smtp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SMTP_HOST&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -S smtp-auth-user&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SMTP_USER&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -S smtp-auth-password&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SMTP_PASS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -S &lt;span class="nv"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MAIL_FROM&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -r &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MAIL_FROM&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -s &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MAIL_SUBJECT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MAIL_TO&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="問題点"&gt;問題点&lt;/h2&gt;&#10;&lt;p&gt;自分で解決できなかった問題があります。&lt;/p&gt;</description></item><item><title>パイプではまらないためにdockerコマンド実行時の「-it」オプションの挙動を確認してみた</title><link>https://genzouw.com/entry/2019/07/24/143749/1691/</link><pubDate>Wed, 24 Jul 2019 14:37:49 +0900</pubDate><guid>https://genzouw.com/entry/2019/07/24/143749/1691/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;docker run&lt;/code&gt; コマンドや &lt;code&gt;docker exec&lt;/code&gt; コマンドを実行する際に &lt;code&gt;-i&lt;/code&gt; オプションと &lt;code&gt;-t&lt;/code&gt; オプションを付与することが多いですが、&#10;理解をしていないとパイプとつなぐ際に思わぬ挙動をするので整理しました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 18.09.2, build &lt;span class="m"&gt;6247962&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="各種オプションの有無での挙動の違い"&gt;各種オプションの有無での挙動の違い&lt;/h2&gt;&#10;&lt;h3 id="-i-オプション有り--t-オプション有り"&gt;&lt;code&gt;-i&lt;/code&gt; オプション有り、 &lt;code&gt;-t&lt;/code&gt; オプション有り&lt;/h3&gt;&#10;&lt;p&gt;まずは &lt;code&gt;-it&lt;/code&gt; オプションつきでDockerコンテナを起動し &lt;code&gt;bash&lt;/code&gt; を起動してみます。&#10;接続したコンテナ内でLinuxコマンドを実行でき、結果をターミナルで確認できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run -it ubuntu:19.10 bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@5ba28223ab82:/# ls&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bin dev home lib32 libx32 mnt proc run srv tmp var&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;boot etc lib lib64 media opt root sbin sys usr&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root@5ba28223ab82:/# &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="-i-オプション無し--t-オプション無し"&gt;&lt;code&gt;-i&lt;/code&gt; オプション無し、 &lt;code&gt;-t&lt;/code&gt; オプション無し&lt;/h3&gt;&#10;&lt;p&gt;両方のオプションを外した場合はどうでしょう？&lt;/p&gt;</description></item><item><title>シェルでDockerHubリポジトリからイメージとタグを取得する方法</title><link>https://genzouw.com/entry/2019/07/23/084033/1687/</link><pubDate>Tue, 23 Jul 2019 08:40:33 +0900</pubDate><guid>https://genzouw.com/entry/2019/07/23/084033/1687/</guid><description>&lt;h2 id="2021-02-02追記"&gt;【2021-02-02追記】&lt;/h2&gt;&#10;&lt;p&gt;もしコマンドをインストール可能な環境である場合は、後日リリースされた &lt;strong&gt;hub-tool&lt;/strong&gt; の利用をおすすめします。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2021/02/02/193242/2158/"&gt;&amp;ldquo;hub-tool&amp;quot;を使って&amp;quot;Docker Hub&amp;quot;上のイメージタグを一覧表示する&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;DockerHubのようなイメージリポジトリからイメージを検索する際には &lt;code&gt;docker search&lt;/code&gt; コマンドが利用できます。&#10;このコマンドで「イメージ名」は検索できるのですが「タグ」が検索できず、例えば「MySQLイメージの5.6バージョンのタグを知りたいんだけど、どうしよう？」となることがよくあります。&lt;/p&gt;&#10;&lt;p&gt;コマンドラインでなんとかしてみます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 18.09.2, build &lt;span class="m"&gt;6247962&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ jq --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jq-1.6&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-search-コマンドとは"&gt;&lt;code&gt;docker search&lt;/code&gt; コマンドとは&lt;/h2&gt;&#10;&lt;p&gt;Docker Hubでコンテナイメージをを検索するためのコマンドです。&lt;/p&gt;&#10;&lt;p&gt;例えば、 &amp;ldquo;mysql&amp;rdquo; 用のコンテナイメージを検索する場合には以下のようなコマンドを実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker search mysql&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME DESCRIPTION STARS FFICIAL AUTOMATED&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysql MySQL is a widely used, open-source relation… &lt;span class="m"&gt;8417&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;OK&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mariadb MariaDB is a community-developed fork of MyS… &lt;span class="m"&gt;2895&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;OK&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysql/mysql-server Optimized MySQL Server Docker images. Create… &lt;span class="m"&gt;624&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;OK&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;percona Percona Server is a fork of the MySQL relati… &lt;span class="m"&gt;440&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;OK&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;centurylink/mysql Image containing mysql. Optimized to be link… &lt;span class="m"&gt;60&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;OK&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ラベルを見ると分かる通り、1列目にイメージ名が出力されています。&lt;/p&gt;</description></item><item><title>DockerのMySQLイメージで接続元ホスト名によるアクセス制御ができない（ `skip-name-resolve`）</title><link>https://genzouw.com/entry/2019/07/21/173309/1682/</link><pubDate>Sun, 21 Jul 2019 17:33:09 +0900</pubDate><guid>https://genzouw.com/entry/2019/07/21/173309/1682/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;MySQL では、接続元ホスト名ごとに「接続できる」「接続できない」の制御が可能ですが、設定方法を正しく把握していなかったので Docker 環境を使って検証したところハマってしまいました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 18.09.2, build &lt;span class="m"&gt;6247962&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker-compose --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker-compose version 1.23.2, build 1110ad01&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;p&gt;「Docker」と「Docker Compose」を使って以下のような環境を構築し検証したいと思いました。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;サーバは 2 台。&#10;&lt;ul&gt;&#10;&lt;li&gt;「MySQL サーバ」である &lt;code&gt;db-server&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;「Apache+PHP サーバ」である &lt;code&gt;web-server&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;「MySQL サーバ」には「Apache+PHP サーバ」からアクセス可能なユーザー &lt;code&gt;app_user&lt;/code&gt; を用意する。&lt;/li&gt;&#10;&lt;li&gt;「MySQL サーバ」には「Apache+PHP サーバ」から &lt;strong&gt;のみ&lt;/strong&gt; アクセス可能な追加のユーザー &lt;code&gt;app_user_additional&lt;/code&gt; を用意する。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1wQAziW9pcKrEOFN3k_X-uTR369fsI5AY" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境の用意"&gt;検証環境の用意&lt;/h2&gt;&#10;&lt;p&gt;「Web サーバ」用の Docker コンテナ、「MySQL サーバ」用の Docker コンテナを立ち上げるために、「Docker Compose」を利用しました。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt;の設定は以下のようになりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;docker-compose.yml&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;services&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;db-server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;mysql:latest&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="l"&gt;default-authentication-plugin=mysql_native_password&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;restart&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;always&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;MYSQL_ROOT_PASSWORD=testpass&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;MYSQL_DATABASE=testdb&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;MYSQL_USER=app_user&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="l"&gt;MYSQL_PASSWORD=app_p@ssw0rd&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;$PWD:/docker-entrypoint-initdb.d&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;web-server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;php:7.3-apache&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;volumes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;- &lt;span class="s2"&gt;&amp;#34;$PWD:/var/www/html&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の YAML ファイルから Docker Compose を起動すれば、以下のユーザーで接続できます。&lt;/p&gt;</description></item><item><title>シェルスクリプトで任意のプロセスの終了を待って、別のコマンドを実行させる方法(ループ無し)</title><link>https://genzouw.com/entry/2019/07/17/125108/1679/</link><pubDate>Wed, 17 Jul 2019 12:51:08 +0900</pubDate><guid>https://genzouw.com/entry/2019/07/17/125108/1679/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;プロセスIDが特定できているが、このプロセスが終了したことを確認して次の処理を実行させたい場合にどうするのがよいでしょう？&lt;/p&gt;&#10;&lt;p&gt;プロセス終了を持って、Macの通知バーにメッセージを表示させたかったのですが、 &lt;code&gt;while&lt;/code&gt; ループと &lt;code&gt;sleep&lt;/code&gt; コマンドでプロセス終了を監視する以外にうまい方法がないかを調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tail --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tail &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.31&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="tailコマンドに便利なオプションがあった"&gt;tailコマンドに便利なオプションがあった！&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;tail&lt;/code&gt; コマンドのマニュアルにぴったりなオプションがありました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --pid&lt;span class="o"&gt;=&lt;/span&gt;PID&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; with -f, terminate after process ID, PID dies&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;該当のプロセスIDの処理が終了するまで &lt;code&gt;tail -f&lt;/code&gt; を続けてくれるオプションになります。&lt;/p&gt;&#10;&lt;p&gt;ただし、今回は &lt;code&gt;tail&lt;/code&gt; したいファイルはありませんので、ちょっとしたコツが必要です。&lt;/p&gt;&#10;&lt;h2 id="試してみる"&gt;試してみる&lt;/h2&gt;&#10;&lt;p&gt;まずはターミナルを開き、以下のようなファイルを作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;test.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;set -o errexit&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;set -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;set -o noclobber&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;while true; do&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; echo .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; sleep 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;done&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;700&lt;/span&gt; test.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行します。1秒おきに &lt;code&gt;.&lt;/code&gt; が出力されるはずです。&lt;/p&gt;</description></item><item><title>Auth0（クラウド統合認証プラットフォーム）について調査</title><link>https://genzouw.com/entry/2019/07/09/234703/1668/</link><pubDate>Tue, 09 Jul 2019 23:47:03 +0900</pubDate><guid>https://genzouw.com/entry/2019/07/09/234703/1668/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;「AWS Cognito」、「Firebase」と調査をしていたが、かゆいところに手がとどかない感じだったがようやく至れり尽くせりのサービスを発見。&#10;（とはいえ、価格帯を考慮に入れた場合は「Firebase」が良さそう。「AWS Cognito」はUIがわかりにくいわ、ドキュメントはわかりにくいわでイマイチな印象。）&lt;/p&gt;&#10;&lt;h2 id="auth0-クラウド統合認証プラットフォーム-とは"&gt;Auth0 (クラウド統合認証プラットフォーム) とは&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;以下のような形態のアプリケーションに対して、認証・認可のサービスをクラウドで提供している&#10;&lt;ul&gt;&#10;&lt;li&gt;Webアプリ&lt;/li&gt;&#10;&lt;li&gt;モバイル&lt;/li&gt;&#10;&lt;li&gt;API&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;いわゆるIDaaS (Identity as a Service)ベンダー&lt;/li&gt;&#10;&lt;li&gt;ユーザー認証/認可/セキュリティを用意に実現することが可能&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="auth0が提供するログインページの種類"&gt;Auth0が提供するログインページの種類&lt;/h2&gt;&#10;&lt;p&gt;大きく2つの形態が選択できる&lt;/p&gt;&#10;&lt;h3 id="classicログインページ"&gt;Classicログインページ&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&amp;ldquo;Lock.js&amp;rdquo; と呼ばれる JavaScriptライブラリベースのログインページ&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;自分のサービス提供ドメイン&lt;/strong&gt; 内からログインページを提供&lt;/li&gt;&#10;&lt;li&gt;以下の方法で利用可能&#10;&lt;ul&gt;&#10;&lt;li&gt;Githubからダウンロード&lt;/li&gt;&#10;&lt;li&gt;NPMやYARNでインストール&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="newログインページ"&gt;Newログインページ&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;JavaScriptを使用してはいない&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Auth0の管理ドメイン&lt;/strong&gt; 内からログインページを提供&#10;&lt;ul&gt;&#10;&lt;li&gt;ただし、手を加えれば &lt;strong&gt;自分のサービス提供ドメイン&lt;/strong&gt; 内から提供するようにカスタマイズすることは可能&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;HTMLで提供されており、軽量で速い&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ログインページのカスタマイズについて"&gt;ログインページのカスタマイズについて&lt;/h2&gt;&#10;&lt;h3 id="軽微なログインページのカスタマイズ"&gt;軽微なログインページのカスタマイズ&lt;/h3&gt;&#10;&lt;p&gt;簡単なデザイン変更はダッシュボードページから即座に可能。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ログ&lt;/li&gt;&#10;&lt;li&gt;文字色&lt;/li&gt;&#10;&lt;li&gt;背景色&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1cE9-1tmc5fK2632khzPjFUr29NkaQ3Iw" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="大幅なログインページのカスタマイズ"&gt;大幅なログインページのカスタマイズ&lt;/h3&gt;&#10;&lt;p&gt;デフォルトで提供されているログインページのHTMLを直接書き換えることも可能&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;一応重要度を理解して触ってもらうためか、「トグルボタン」をスイッチさせないとHTML編集ができないUIとなっている&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=17chTZg1AO0S7MvAklZn2LkCq6w1--neW" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="ログインページの表示言語のカスタマイズ"&gt;ログインページの表示言語のカスタマイズ&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;Newログインページ&lt;/strong&gt; に関しては、適切な言語設定表示に切替可能。&#10;切替可能な言語の一覧は、こちらのページで公開されている。 ( &lt;a href="https://auth0.com/docs/universal-login/i18n"&gt;https://auth0.com/docs/universal-login/i18n&lt;/a&gt; )&lt;/p&gt;&#10;&lt;p&gt;ログインページの言語切替の仕組みは以下のルールに基づいて行われる。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;「設定ページ」からサポートする言語設定を複数選択可能。&#10;&lt;ul&gt;&#10;&lt;li&gt;複数選択したサポート言語のうち、いずれか1つがデフォルトサポート言語となる&lt;/li&gt;&#10;&lt;li&gt;デフォルトでは英語のみサポートする設定となっている&lt;/li&gt;&#10;&lt;li&gt;「日本語」だけを提供したい場合は「日本語」のみをサポートする言語として選択すればよい&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ブラウザがアクセスしてきた際に上記のサポート言語のいずれかから適切な言語を選択する。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ログインページURLへのリダイレクト時に付与された &lt;code&gt;ui_locales&lt;/code&gt; クエリ文字列を条件に検索。（ &lt;strong&gt;ex&lt;/strong&gt; : &lt;code&gt;ui_locales=ja&lt;/code&gt;）&lt;/li&gt;&#10;&lt;li&gt;ブラウザが送信する &lt;code&gt;Accept-Language&lt;/code&gt; リクエストヘッダ情報を条件に検索。&lt;/li&gt;&#10;&lt;li&gt;上記いずれを使ってもサポート言語が見つからない場合はデフォルトサポート言語を利用。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="認証フロー既存のレガシーwebアプリケーションが認証状態に至るまでの流れ"&gt;認証フロー（既存のレガシーWebアプリケーションが認証状態に至るまでの流れ）&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1nwOIN1HmjKGpPf4ylZNcknxGevlQmjCd" alt=""&gt;&lt;/p&gt;</description></item><item><title>`sed` で検索文字列を含む行の行番号だけを出力する方法</title><link>https://genzouw.com/entry/2019/07/08/084532/1663/</link><pubDate>Mon, 08 Jul 2019 08:45:32 +0900</pubDate><guid>https://genzouw.com/entry/2019/07/08/084532/1663/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;検索文字列を含む行の &lt;strong&gt;「行番号」&lt;/strong&gt; だけを出力させたいときの方法について。&#10;&lt;code&gt;sed&lt;/code&gt; を使って実現できます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sed-の-内部コマンド-を利用する"&gt;&lt;code&gt;sed&lt;/code&gt; の &lt;code&gt;=内部コマンド&lt;/code&gt; を利用する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; の &lt;code&gt;=&lt;/code&gt; というコマンドを利用します。&lt;/p&gt;&#10;&lt;p&gt;このコマンドは非常にシンプルなものであまり使いみちがないと思っていたのですが、検索した結果の「行番号」を取得したいケースがあり、その時だけ活用できました。&lt;/p&gt;&#10;&lt;p&gt;早速試してみます。&#10;百人一首のなかから特定も文字列を含む行の行番号だけをピックアップしてみます。&lt;/p&gt;&#10;&lt;p&gt;以下のコマンドでひらがなだけの百人一首データをダウンロードします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# データファイルをダウンロード&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -s -O /wp-content/uploads/2023/01/hyakuninissyu.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 先頭の数件を確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head hyakuninissyu.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;あきのたのかりほのいほのとまをあらみわがころもではつゆにぬれつつ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;はるすぎてなつきにけらししろたへのころもほすてふあまのかぐやま&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;あしびきのやまどりのをのしだりをのながながしよをひとりかもねむ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;たごのうらにうちいでてみればしろたへのふじのたかねにゆきはふりつつ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;おくやまにもみぢふみわけなくしかのこゑきくときぞあきはかなしき&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;かささぎのわたせるはしにおくしものしろきをみればよぞふけにける&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;あまのはらふりさけみればかすがなるみかさのやまにいでしつきかも&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;わがいほはみやこのたつみしかぞすむよをうぢやまとひとはいふなり&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;はなのいろはうつりにけりないたづらにわがみよにふるながめせしまに&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;これやこのゆくもかへるもわかれてはしるもしらぬもあふさかのせき&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wc -l hyakuninissyu.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;100&lt;/span&gt; hyakuninissyu.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;昔からこどもたちと一緒に遊んでいました。&#10;なんとなく「なには」の文字の登場比率が多いと思っていました。&#10;これを含む行を調べてみます。&lt;/p&gt;</description></item><item><title>シェルスクリプトだとFizzBuzzが１行(ワンライナー)で書ける</title><link>https://genzouw.com/entry/2019/07/05/082014/1651/</link><pubDate>Fri, 05 Jul 2019 08:20:14 +0900</pubDate><guid>https://genzouw.com/entry/2019/07/05/082014/1651/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;小ネタ。&#10;シェルスクリプトでFizzBuzzを書いたらどんなふうにかけるかを試してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed &lt;span class="o"&gt;(&lt;/span&gt;GNU sed&lt;span class="o"&gt;)&lt;/span&gt; 4.7&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="結果"&gt;結果&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;0~3s/[0-9]*$/Fizz/&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;0~5s/[0-9]*$/Buzz/&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は以下の通り。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Fizz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Buzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Fizz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Fizz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Buzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Fizz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;14&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FizzBuzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;16&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;17&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Fizz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;19&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Buzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Fizz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;22&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;23&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Fizz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Buzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;26&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Fizz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;28&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;29&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FizzBuzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="解説"&gt;解説&lt;/h2&gt;&#10;&lt;p&gt;はじめの &lt;code&gt;seq&lt;/code&gt; は数字を列挙するために利用しています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1から5までを出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;30までの出力内容を後続する &lt;code&gt;sed&lt;/code&gt; コマンドに引き渡しています。&lt;/p&gt;</description></item><item><title>JavaScriptで連想配列を利用する際にObjectではなくMapを使うメリット</title><link>https://genzouw.com/entry/2019/07/04/120033/1648/</link><pubDate>Thu, 04 Jul 2019 12:00:33 +0900</pubDate><guid>https://genzouw.com/entry/2019/07/04/120033/1648/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/07/03/094011"&gt;JavaScriptで値のユニークな配列を利用する方法(Set)&lt;/a&gt; のエントリに関連して。&lt;/p&gt;&#10;&lt;p&gt;「ES2015」で新たに用意された便利なコレクションオブジェクトとして &lt;code&gt;Map&lt;/code&gt; があります。&#10;他言語だと、例えばJavaのMapのように組み込みの連想配列機能が用意されています。&#10;&lt;code&gt;Map&lt;/code&gt; を利用すると、それまでは &lt;code&gt;Object&lt;/code&gt; で代用してきた連想配列機能を実現することができます。&lt;/p&gt;&#10;&lt;p&gt;とはいえ今まで &lt;code&gt;Object&lt;/code&gt; で実現できていたのならそれで良いのではないか？という疑問が浮かびました。&#10;そこで &lt;code&gt;Object&lt;/code&gt; ではなく &lt;code&gt;Map&lt;/code&gt; を使う際の違いやメリットを調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v12.5.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="従来のobjectを使った場合の連想配列の作り方"&gt;従来のObjectを使った場合の連想配列の作り方&lt;/h2&gt;&#10;&lt;p&gt;従来のObjectを使っての連想配列の作り方は以下のようなコードになります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;(example1.js)&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hello&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;array&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;node&lt;/code&gt; コマンドを使ってコマンドラインから実行した結果は以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node example.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt; string: &lt;span class="s1"&gt;&amp;#39;hello&amp;#39;&lt;/span&gt;, array: &lt;span class="o"&gt;[]&lt;/span&gt;, number: 2, object: &lt;span class="o"&gt;{}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="objectを使った場合のキーは暗黙に変換される"&gt;Objectを使った場合のキーは暗黙に変換される&lt;/h2&gt;&#10;&lt;p&gt;Objectを利用した場合には、キーの取扱に注意しなければいけません。&#10;実際にソースコードを見ていきましょう。&lt;/p&gt;&#10;&lt;p&gt;以下の例ではObjectに対して、Numberの &lt;code&gt;2&lt;/code&gt; と Stringの &lt;code&gt;&amp;quot;2&amp;quot;&lt;/code&gt; をキーとして値をセットしています。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;(example2.js)&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;二&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;に&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// { &amp;#39;2&amp;#39;: &amp;#39;に&amp;#39; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;obj&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行すると以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node example2.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;: &lt;span class="s1"&gt;&amp;#39;に&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2つの値を別のキーでセットしたにもかかわらず、キーは1つしか保存されていません。&#10;Objectのキーは、自動的に文字列に変換されることがわかります。&lt;/p&gt;</description></item><item><title>JavaScriptで値のユニークな配列を利用する方法(Set)</title><link>https://genzouw.com/entry/2019/07/03/094011/1639/</link><pubDate>Wed, 03 Jul 2019 09:40:11 +0900</pubDate><guid>https://genzouw.com/entry/2019/07/03/094011/1639/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;「Vue.js」や「Nuxt.js」を使って開発をする機会が増えてきました。&#10;しばらくコマンドラインと戯れる年月が長かったで、浦島太郎状態です。&#10;&lt;strong&gt;ES2015～2018&lt;/strong&gt; で提供された新しい言語使用が便利で改めて学習し直しているところです。&lt;/p&gt;&#10;&lt;h2 id="javascriptの-array-は重複を許してしまう"&gt;JavaScriptの &lt;code&gt;Array&lt;/code&gt; は重複を許してしまう&lt;/h2&gt;&#10;&lt;p&gt;本題に貼ります。&#10;JavaScriptの &lt;code&gt;Array&lt;/code&gt; は値の重複を許してしまいます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;=== first ===&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 要素を追加&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;=== first ===&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// すでに格納されている同値を追加&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;=== third ===&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は以下の通り。&#10;&lt;code&gt;3&lt;/code&gt; の値が重複していることがわかります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nv"&gt;first&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 1, 2, &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nv"&gt;first&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; 1, 2, 3, 4, &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nv"&gt;third&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1, 2, 3, 4,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5, 3, &lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="javascriptの-set-は重複を許さない"&gt;JavaScriptの &lt;code&gt;Set&lt;/code&gt; は重複を許さない&lt;/h2&gt;&#10;&lt;p&gt;「ES2015」で提供された新しいオブジェクト「Set」を利用すれば、値の重複が発生しません。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;=== first ===&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 要素を追加&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;=== first ===&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// すでに格納されている同値を追加&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;=== third ===&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は以下のようになります。&#10;あとから追加された &lt;code&gt;3&lt;/code&gt; が重複せずに1つだけとなっていることがわかります。&lt;/p&gt;</description></item><item><title>シェルスクリプトで開始日から終了日までの日付をYYYYMMDD形式で一覧出力する</title><link>https://genzouw.com/entry/2019/07/01/083003/1637/</link><pubDate>Mon, 01 Jul 2019 08:30:03 +0900</pubDate><guid>https://genzouw.com/entry/2019/07/01/083003/1637/</guid><description>&lt;p&gt;今日は小ネタ。&#10;何度か記述することがあったので、整理しました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="コマンド"&gt;コマンド&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;START_DATE&lt;/code&gt; には 「YYYYMMDD」 形式で開始日を、&#10;&lt;code&gt;END_DATE&lt;/code&gt; には 「YYYYMMDD」 形式で終了日を指定します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;START_DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;20190125&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;END_DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;20190201&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; START_DATE&lt;span class="p"&gt;;&lt;/span&gt; D &amp;lt;&lt;span class="o"&gt;=&lt;/span&gt; END_DATE&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nv"&gt;D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;$(&lt;/span&gt;date -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; + 1days&amp;#34;&lt;/span&gt; +%Y%m%d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の環境変数設定で実行した結果は以下の通り。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20190125&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20190126&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20190127&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20190128&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20190129&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20190130&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20190131&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20190201&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;ホント小ネタ。&lt;/p&gt;</description></item><item><title>xargsを使う際には`echo`は書かなくてもよいことをmanページから知った</title><link>https://genzouw.com/entry/2019/06/28/140010/1634/</link><pubDate>Fri, 28 Jun 2019 14:00:10 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/28/140010/1634/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;小さなことですが、 &lt;code&gt;xargs&lt;/code&gt; の &lt;code&gt;man&lt;/code&gt; ページを見ていて気づいたことが &lt;strong&gt;2つ&lt;/strong&gt; ありました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ xargs --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xargs &lt;span class="o"&gt;(&lt;/span&gt;GNU findutils&lt;span class="o"&gt;)&lt;/span&gt; 4.5.11&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="man-ページの一部抜粋"&gt;&lt;code&gt;man&lt;/code&gt; ページの一部抜粋&lt;/h2&gt;&#10;&lt;p&gt;一部抜粋します。&#10;以下のようなことが書いてありました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or newlines,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;and executes the command (default is /bin/echo) one or more times with any initial-arguments followed by items read from standard input.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今回学んだことは2点。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトのヒアドキュメントとは一体何か？</title><link>https://genzouw.com/entry/2019/06/27/120048/1632/</link><pubDate>Thu, 27 Jun 2019 12:00:48 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/27/120048/1632/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトを書いていてよく利用する記法として「ヒアドキュメント」があります。&lt;/p&gt;&#10;&lt;p&gt;Wikipediaには「文字列リテラルをソースコード中に埋め込む方法のひとつ」という記載がありますが、&#10;「文字列リテラル」という認識でいると &lt;code&gt;echo&lt;/code&gt; しようとして何も表示されないというミスをすることもあります。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ヒアドキュメントを使って文字列を出力する"&gt;ヒアドキュメントを使って文字列を出力する&lt;/h2&gt;&#10;&lt;p&gt;文字列を出力したい場合、ヒアドキュメントを使って出力させる方法があります。&#10;複数行にまたがるような長い文字列を出力したい場合に利用されることが多いです。&lt;/p&gt;&#10;&lt;p&gt;以下は &lt;code&gt;cat&lt;/code&gt; コマンドを利用してヒアドキュメントを出力させる例です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Hello World!&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;My name is ${USER}.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は以下のようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Hello World!&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;My name is genzouw.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ヒアドキュメントに埋め込まれた「変数」は展開されます。&lt;/p&gt;&#10;&lt;h2 id="echo-では出力できない"&gt;&lt;code&gt;echo&lt;/code&gt; では出力できない&lt;/h2&gt;&#10;&lt;p&gt;文字列を出力するというイメージからついつい &lt;code&gt;echo&lt;/code&gt; を使ってしまうことがありますが、これはNGです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Hello World!&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;My name is ${USER}.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記のコマンドを実行しても何も出力されません。&lt;/p&gt;&#10;&lt;h2 id="ヒアドキュメントとは一体何か"&gt;ヒアドキュメントとは一体何か？&lt;/h2&gt;&#10;&lt;p&gt;本題にはいります。 &lt;code&gt;cat&lt;/code&gt; で表示できたことから「ファイル」または「標準入力」のいずれかの扱いになるかと思いますが、以下のようなPHPスクリプトを作成してヒアドキュメントを食わせてみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;test.php&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;?php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# test.php というファイル名で作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;== ARGS&amp;#39;&lt;/span&gt;, PHP_EOL&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;var_dump&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$argv&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;== STDIN&amp;#39;&lt;/span&gt;, PHP_EOL&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; fgets&lt;span class="o"&gt;(&lt;/span&gt;STDIN&lt;span class="o"&gt;))&lt;/span&gt; !&lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;大きく以下の２つの情報を出力しています。&lt;/p&gt;</description></item><item><title>grepで単語単位で検索("is"は対象とするが"this"は対象にしたくない)</title><link>https://genzouw.com/entry/2019/06/25/083016/1623/</link><pubDate>Tue, 25 Jun 2019 08:30:16 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/25/083016/1623/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;英単語一覧データが &lt;strong&gt;CSV&lt;/strong&gt; ファイルとして提供されている場合に &amp;ldquo;is&amp;rdquo; を検索したいが、 &amp;ldquo;this&amp;rdquo; や &amp;ldquo;English&amp;rdquo; は対象から外したい、&#10;といったことを &lt;code&gt;grep&lt;/code&gt; コマンドで実現する方法です。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="検索対象の英文サンプルを用意"&gt;検索対象の英文サンプルを用意&lt;/h2&gt;&#10;&lt;p&gt;今回処理させたい英文のサンプルを用意します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt; sartre.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Man is condemned to be free.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;Because once thrown into the world,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;he is responsible for everything he does.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;実存主義思想で有名なサルトルの言葉です。&lt;/em&gt;&#10;&lt;em&gt;余談ですが『存在と無』という書籍では「人間は自由という刑に処せられている」 という思想を主張しているように、自由（自分で決められること）は責任を伴います。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;上記の英文に対して、 &lt;code&gt;to&lt;/code&gt; とう文字で検索してみることにします。&lt;/p&gt;&#10;&lt;h2 id="普通に-grep-コマンドを利用した場合"&gt;普通に &lt;code&gt;grep&lt;/code&gt; コマンドを利用した場合&lt;/h2&gt;&#10;&lt;p&gt;普通に &lt;code&gt;grep to&lt;/code&gt; してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep &lt;span class="s1"&gt;&amp;#39;to&amp;#39;&lt;/span&gt; sartre.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Man is condemned to be free.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Because once thrown into the world,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;本来調べたかった &amp;ldquo;to&amp;rdquo; という文字以外に、 &amp;ldquo;into&amp;rdquo; という文字も見つかってしまいます。&lt;/p&gt;</description></item><item><title>シェルでファイルにリダイレクトしたときに"Permission denied"と怒られたときの対処</title><link>https://genzouw.com/entry/2019/06/23/102944/1617/</link><pubDate>Sun, 23 Jun 2019 10:29:44 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/23/102944/1617/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;定期的に質問される問題について。&lt;/p&gt;&#10;&lt;p&gt;「パイプで繋いで処理した情報を別ファイルにリダイレクトしたいが、実行ユーザの書き込み権限がないために &lt;code&gt;Permission denied &lt;/code&gt; が発生してしまい良い方法がないか？」&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="具体例"&gt;具体例&lt;/h2&gt;&#10;&lt;h3 id="前提"&gt;前提&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;処理実行ユーザは &lt;code&gt;root&lt;/code&gt; のような &lt;code&gt;/etc&lt;/code&gt; ディレクトリ配下を編集する権限はない&lt;/li&gt;&#10;&lt;li&gt;ただし、 &lt;code&gt;sudo&lt;/code&gt; を使えば変更が可能 + &lt;code&gt;/etc&lt;/code&gt; 配下にファイルを書き込みたい&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="実行したい内容"&gt;実行したい内容&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;/etc/passwd&lt;/code&gt; ファイルをフィルタリングして、 &lt;code&gt;/etc/passwd.bk&lt;/code&gt; を作りたいとします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;#34;genzouw&amp;#34; さんのユーザだけをバックアップしておきたい&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep genzouw /etc/passwd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw:x:1000:1000::/home/genzouw:/bin/zsh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;gt; で書き出ししたいが権限がないと怒られる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep genzouw /etc/passwd &amp;gt; /etc/passwd.bk&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash: /etc/passwd.bk: Permission denied&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;余談ですが、上記メッセージは以下の言語設定のときのメッセージです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ expr &lt;span class="nv"&gt;$LC_ALL&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;en_US.UTF-8&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;言語設定を日本語に変更されている場合は以下のようなメッセージが表示されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ja_JP.UTF-8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep genzouw /etc/passwd &amp;gt; /etc/passwd.bk&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash: /etc/passwd.bk: 許可がありません&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sudo-grep-では解決しない"&gt;&lt;code&gt;sudo grep&lt;/code&gt; では解決しない&lt;/h2&gt;&#10;&lt;p&gt;すぐに思いつくのは &lt;code&gt;sudo&lt;/code&gt; を使う方法です。&lt;/p&gt;</description></item><item><title>シェルスクリプトで実行中のプロセスの終了を待機する方法(waitコマンド以外)</title><link>https://genzouw.com/entry/2019/06/19/083053/1613/</link><pubDate>Wed, 19 Jun 2019 08:30:53 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/19/083053/1613/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトで実行中のプロセスが終了を待機する方法について取り上げます。&lt;/p&gt;&#10;&lt;p&gt;簡単な方法として、 &lt;code&gt;wait&lt;/code&gt; コマンドを利用する方法がありますが &lt;code&gt;wait&lt;/code&gt; コマンドでは対応できないケースへの対処法についても取り上げます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="wait-コマンドを利用する方法"&gt;&lt;code&gt;wait&lt;/code&gt; コマンドを利用する方法&lt;/h2&gt;&#10;&lt;h2 id="まずは実行中のプロセスを作成"&gt;まずは実行中のプロセスを作成&lt;/h2&gt;&#10;&lt;p&gt;実行中のプロセスを以下のコマンドで作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -c &lt;span class="s1"&gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;for i in {0..19}; do&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; echo &amp;#34;execute($i).&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; sleep 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;done&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &amp;gt; log.txt &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;急いで標準出力をリダイレクトした &lt;code&gt;log.txt&lt;/code&gt; の内容を確認します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tail -f log.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;0&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;3&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;4&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;5&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;6&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;7&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;8&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;9&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;10&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;11&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;12&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;13&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;14&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;15&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;16&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;17&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;18&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;execute&lt;span class="o"&gt;(&lt;/span&gt;19&lt;span class="o"&gt;)&lt;/span&gt;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;20回出力されて処理が終了します。&lt;/p&gt;</description></item><item><title>「grep」を使って稼働中のプロセスを確認する際に「grep」自身が引っかからないようにする方法いろいろ</title><link>https://genzouw.com/entry/2019/06/13/090034/1605/</link><pubDate>Thu, 13 Jun 2019 09:00:34 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/13/090034/1605/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;現在稼働中のプロセスを確認するときに、 &lt;code&gt;ps aux&lt;/code&gt; コマンドを利用すると思います。&#10;Linux上では多数のプロセスが常時動作しているため、流石にコマンドの表示内容から該当のプロセスを目視で探すのは至難の業です。&#10;したがって &lt;code&gt;grep&lt;/code&gt; を使って絞り込むわけですが、よく遭遇する問題とこれを解決する方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ps-aux-を-grep-で絞り込んで見る"&gt;&lt;code&gt;ps aux&lt;/code&gt; を &lt;code&gt;grep&lt;/code&gt; で絞り込んで見る&lt;/h2&gt;&#10;&lt;p&gt;絞り込み対象のプロセスを作成します。&#10;&lt;code&gt;yes&lt;/code&gt; コマンドは &lt;code&gt;y&lt;/code&gt; という文字列をエンドレスで標準出力に出力するコマンドですが、これをバックグラウンド実行します。&#10;単純に実行するとターミナルが &lt;code&gt;y&lt;/code&gt; でいっぱいになってしまうので、 &lt;code&gt;/dev/null&lt;/code&gt; （ &lt;strong&gt;余談ですが、これをビットバケットと呼びます。&lt;/strong&gt; ）に流します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yes &amp;gt; /dev/null &lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ps aux&lt;/code&gt; コマンドの実行結果を &lt;code&gt;grep&lt;/code&gt; で絞り込んでみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ps aux &lt;span class="p"&gt;|&lt;/span&gt; grep yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root &lt;span class="m"&gt;20&lt;/span&gt; 99.9 0.0 &lt;span class="m"&gt;4372&lt;/span&gt; &lt;span class="m"&gt;728&lt;/span&gt; pts/0 R 22:59 4:57 yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;root &lt;span class="m"&gt;25&lt;/span&gt; 0.0 0.0 &lt;span class="m"&gt;9096&lt;/span&gt; &lt;span class="m"&gt;836&lt;/span&gt; pts/0 S+ 23:04 0:00 grep yes&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;悲しいことに2行出力されてしまいます。&#10;&lt;code&gt;grep&lt;/code&gt; を実行した結果、自分自身も対象として見つかってしまいました。&lt;/p&gt;</description></item><item><title>Linuxシェルのパイプはメモリに優しい仕組みだった(バッファリングを学ぶ)</title><link>https://genzouw.com/entry/2019/06/12/170055/1602/</link><pubDate>Wed, 12 Jun 2019 17:00:55 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/12/170055/1602/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;先日、メンバからLinuxシェルにおけるパイプ機能について質問がありました。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;パイプで繋いだ前後のプロセスは同時に起動する？&lt;/li&gt;&#10;&lt;li&gt;パイプで繋いだ前後のプロセスで、データのやり取りのためにどのぐらいのメモリを消費するのか？( &lt;em&gt;大量のデータを流した場合を懸念&lt;/em&gt; )&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;回答したあとに、自分で言っていたことに少し自信がなかったので調べてみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;特にメモリがどの程度使われるのか？について触れることがなかったので、実際にコマンドを実行しながら学習しました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -smoi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Darwin x86_64 MacBookPro16,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.1.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;seq &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.32&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2020&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="linux-のパイプ処理の特徴についておさらい"&gt;Linux のパイプ処理の特徴についておさらい&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;command1 | command2&lt;/code&gt; のようなパイプでつないだ処理の特徴をあげてみます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;command1&lt;/code&gt; と &lt;code&gt;command2&lt;/code&gt; の両プロセスは同時に立ち上がる&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;command1&lt;/code&gt; はメモリバッファに随時出力を書きだす&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;command2&lt;/code&gt; はメモリバッファから随時入力を読み取る&lt;/li&gt;&#10;&lt;li&gt;カーネルで設定されているパイプのバッファサイズ分しかメモリを消費しない&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;command2&lt;/code&gt; がバッファからデータを読み取り、バッファに空きができるまで &lt;code&gt;command1&lt;/code&gt; は書き出しを待機する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;パイプのバッファサイズは、Linux 2.6.11以降デフォルトで &lt;strong&gt;65536 bytes&lt;/strong&gt; ( &lt;code&gt;4096 bytes/page * 16 pages&lt;/code&gt; ) となっています。&lt;/p&gt;</description></item><item><title>シェルスクリプトでファイルの最後からN行目に行を追加する</title><link>https://genzouw.com/entry/2019/06/10/083049/1599/</link><pubDate>Mon, 10 Jun 2019 08:30:49 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/10/083049/1599/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトで&#10;「ファイルの先頭行からN行目に行を追加する」&#10;のは簡単ですが、&#10;「ファイルの最終行からN行目に行を追加する」&#10;方法についてうまいやり方がないかについて質問されたのでワンライナーで実現できる方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ファイルの先頭行からn行目に行を追加する"&gt;ファイルの先頭行からN行目に行を追加する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; を利用します。 &lt;code&gt;i&lt;/code&gt; という内部コマンドを利用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 検証用のテストファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &amp;gt; seq.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat seq.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 先頭行から5行目に行を追加&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat seq.txt&lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;5i test&amp;#39;&lt;/span&gt; &amp;gt; seq2.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat seq2.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ファイルの最終行からn行目に行を追加する"&gt;ファイルの最終行からN行目に行を追加する&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; に加えて &lt;code&gt;tac&lt;/code&gt; コマンドを利用します。&#10;仕組みは単純で、一度ファイルを逆順にしてから、先頭行からN行目に差し込んだ後、再度逆順にします。&lt;/p&gt;</description></item><item><title>「Amazon Cognito」で提供するログインページを自作してみる（`aws-cli`で構築）</title><link>https://genzouw.com/entry/2019/06/06/234117/1594/</link><pubDate>Thu, 06 Jun 2019 23:41:17 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/06/234117/1594/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;「Amazon Cognito」を使って既存のWebサービスのログイン認証機能を一部置き直す方法について、何パターンか検討してみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/04/21/085627"&gt;「Amazon Cognito」を使ってログイン機能を作成する（SNS認証あり） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/05/22/163232"&gt;既存のWebアプリで「Amazon Cognito」認証を利用する（その１:処理フローの整理） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/05/24/012926"&gt;既存のWebアプリで「Amazon Cognito」認証を利用する（その２:PHPのサンプルプログラムの実装） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;今まで検討してみた方法ですが、いずれも「Amazon Cognito」が提供するログインページをそのまま利用する、というものでした。&lt;/p&gt;&#10;&lt;p&gt;どうしてもログインページを既存のWebシステムのデザインに合わせたい、という場合にはログインページも既存のWebページのものを使う方法もあります。&#10;既存のWebページのものを流用する方法についてまとめてみました。&lt;/p&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;今回はなるべくAWSの「マネージメントコンソール」からの操作を行わずに「Cognito」を使ったログイン機能を実装してみます。&lt;/p&gt;&#10;&lt;p&gt;そのため、以下のコマンドを利用することを前提としています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://github.com/aws/aws-cli"&gt;aws&lt;/a&gt; コマンド&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://stedolan.github.io/jq/"&gt;jq&lt;/a&gt; コマンド&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://www.npmjs.com/"&gt;npm&lt;/a&gt; コマンド&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.170 Python/3.7.3 Darwin/18.6.0 botocore/1.12.160&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ jq --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jq-1.6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6.9.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="作業開始"&gt;作業開始&lt;/h2&gt;&#10;&lt;p&gt;今回作成したプログラムは以下のGithubリポジトリにコミット済みです。&#10;試行錯誤した結果作成されたプログラムを負いながら手順を説明します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/genzouw/aws-cognito-example-custom-page"&gt;GitHub - genzouw/aws-cognito-example-custom-page&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;圧縮されたソースファイルをダウンロードするか、 &lt;code&gt;git&lt;/code&gt; コマンドで &lt;code&gt;clone&lt;/code&gt; しておいてください。&#10;（Githubリポジトリページのソースコードを見ても良いです。）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone git@github.com:genzouw/aws-cognito-example-custom-page.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;※(2019-06-06) 便宜上、当エントリにGithubリポジトリ上のコードと同じ内容を貼り付けておきますが、メンテナンスはGithubリポジトリの方だけとする予定です。乖離する可能性があることをご了承ください。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="ユーザープールidプールの作成"&gt;ユーザープール・IDプールの作成&lt;/h3&gt;&#10;&lt;p&gt;「Cognito」のユーザープール・IDプールを作成していきましょう。&#10;以下のシェルスクリプトを実行すれば、ユーザープール・IDプールの設定はほぼ完了します。&lt;/p&gt;&#10;&lt;p&gt;ただし、ソースコード内の以下の3つの環境変数はご自分で構築したい「ユーザープール」「アプリクライアント」「IDプール」の名前に変更しておきましょう。（何でも構いません）&#10;「リージョン」はご自分で環境を構築したい対象リージョンを設定ください。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※注意点として、いくつかの名前はハイフン &lt;code&gt;-&lt;/code&gt; を利用するとエラーとなるため、 アンダースコア &lt;code&gt;_&lt;/code&gt; を利用することをおすすめします。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>シェルスクリプトでsedを使いカッコやダブルクォートで囲まれた部分のみ一括置換したい</title><link>https://genzouw.com/entry/2019/06/05/090018/1584/</link><pubDate>Wed, 05 Jun 2019 09:00:18 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/05/090018/1584/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;タイトルで説明しにくいのが辛い(-_-;)&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;僕も常々 &lt;code&gt;sed&lt;/code&gt; で シングルクォートやダブルクォートで囲まれた部分のみ置換したいが、なんとかできないものか？と思っていましたので、紹介したいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed &lt;span class="o"&gt;(&lt;/span&gt;GNU sed&lt;span class="o"&gt;)&lt;/span&gt; 4.7&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="やりたいこと"&gt;やりたいこと&lt;/h2&gt;&#10;&lt;p&gt;以下のような文字列があるとします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;私は、いろいろな国（日本、中国、韓国）に行ったことがあります。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを以下のように置換したいと思います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;私は、いろいろな国（日本&lt;span class="p"&gt;|&lt;/span&gt;中国&lt;span class="p"&gt;|&lt;/span&gt;韓国）に行ったことがあります。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;括弧の中の &lt;code&gt;、&lt;/code&gt; だけを &lt;code&gt;|&lt;/code&gt; に置換したいわけです。&lt;/p&gt;&#10;&lt;h2 id="sed-の-s-内部コマンドだけでは実現は難しい"&gt;&lt;code&gt;sed&lt;/code&gt; の &lt;code&gt;s&lt;/code&gt; 内部コマンドだけでは実現は難しい&amp;hellip;&lt;/h2&gt;&#10;&lt;p&gt;ぱっと思いつくのが &lt;code&gt;sed 's/、/|/g'&lt;/code&gt; ですね。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;私は、いろいろな国（日本、中国、韓国）に行ったことがあります。&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/、/|/g&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;私は&lt;span class="p"&gt;|&lt;/span&gt;いろいろな国（日本&lt;span class="p"&gt;|&lt;/span&gt;中国&lt;span class="p"&gt;|&lt;/span&gt;韓国）に行ったことがあります。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これだと &lt;strong&gt;括弧の内側以外も置換されて&lt;/strong&gt; しまいます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;私は、いろいろな国（日本、中国、韓国）に行ったことがあります。&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/（\([^、）]*\)、\([^）]*\)）/（\1|\2\）/g&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;私は、いろいろな国（日本&lt;span class="p"&gt;|&lt;/span&gt;中国、韓国）に行ったことがあります。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これだと、カッコ内の1つ目の &lt;code&gt;、&lt;/code&gt; しか置換できません。&lt;/p&gt;&#10;&lt;h2 id="sed-の-s-内部コマンドとほかの内部コマンドを組み合わせる"&gt;&lt;code&gt;sed&lt;/code&gt; の &lt;code&gt;s&lt;/code&gt; 内部コマンドとほかの内部コマンドを組み合わせる&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;:&lt;/code&gt; 内部コマンドと &lt;code&gt;t&lt;/code&gt; 内部コマンドを組み合わせると、標準出力から受け取った文字列に &lt;code&gt;s&lt;/code&gt; 内部コマンドの置換処理が適用できなくなるまで処理を繰り返すことができます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;:&lt;/code&gt; 内部コマンド → ラベルを作成&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;t&lt;/code&gt; 内部コマンド → &lt;code&gt;s&lt;/code&gt; 内部コマンドが成功していたら、 &lt;code&gt;:&lt;/code&gt; で付与したラベルまで遡る&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;私は、いろいろな国（日本、中国、韓国）に行ったことがあります。&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;:q; s/（\([^、）]*\)、\([^）]*\)）/（\1|\2）/g; t q&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;私は、いろいろな国（日本&lt;span class="p"&gt;|&lt;/span&gt;中国&lt;span class="p"&gt;|&lt;/span&gt;韓国）に行ったことがあります。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;括弧だけでなく、 &lt;strong&gt;ダブルクォートで囲まれた部分のみ一括置換したい&lt;/strong&gt; 、 &lt;strong&gt;シングルクォーテーションで囲まれた部分のみ一括置換したい&lt;/strong&gt; といったケースはよくあります。&lt;/p&gt;</description></item><item><title>Vue.jsを使ってこどもたちのために百人一首学習アプリを作ってみた</title><link>https://genzouw.com/entry/2019/06/04/075925/1581/</link><pubDate>Tue, 04 Jun 2019 07:59:25 +0900</pubDate><guid>https://genzouw.com/entry/2019/06/04/075925/1581/</guid><description>&lt;p&gt;「Vue.jsでなにか作りたい」という思いと、子どもたちの「なにかゲーム作って欲しい」という思いから簡単なWebアプリを作ってみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://hyakuninissyu.genzouw.com/"&gt;ひゃくにんいっしゅをおぼえよう&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;数ヶ月前に作成したものですが、 &lt;code&gt;index.html&lt;/code&gt; に &lt;strong&gt;「Vue.js」&lt;/strong&gt; をCDNサーバ経由で読み込むだけの単純な作りでした。&#10;勉強のために以下の点を改良しました。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;プロジェクトは &lt;code&gt;vue init&lt;/code&gt; で生成&lt;/li&gt;&#10;&lt;li&gt;開発時は &lt;code&gt;npm run dev&lt;/code&gt; でライブリローディング&lt;/li&gt;&#10;&lt;li&gt;外部のライブラリはすべて &lt;code&gt;npm&lt;/code&gt; で管理&#10;&lt;ul&gt;&#10;&lt;li&gt;axios&lt;/li&gt;&#10;&lt;li&gt;bootstrap&lt;/li&gt;&#10;&lt;li&gt;moment&lt;/li&gt;&#10;&lt;li&gt;underscore&lt;/li&gt;&#10;&lt;li&gt;vue&lt;/li&gt;&#10;&lt;li&gt;vue-analytics&lt;/li&gt;&#10;&lt;li&gt;vue-meta&lt;/li&gt;&#10;&lt;li&gt;vuex&lt;/li&gt;&#10;&lt;li&gt;firebase ( &lt;em&gt;まだ使っていないが使いたい&lt;/em&gt; )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;気になっているのは「SEO」の対策についてです。&#10;今回、HTMLの &lt;code&gt;head&lt;/code&gt; タグ無いのメタ情報についても、「Vue.js」から埋め込むという荒業を行ってみました。&#10;GoogleのクローラがJavaScriptをどの程度解釈してくれるのか？というのを一ヶ月ぐらいかけてみていこうと思います。&lt;/p&gt;&#10;&lt;p&gt;ちなみに、「Twitter」や「Facebook」にリンクを張った場合にはJavaScriptの動作はしてくれないようでアイキャッチ画像などは表示されません。&#10;SNSでのシェアを考えた場合にはSSRを検討したほうが良さそうですね。&lt;/p&gt;</description></item><item><title>RAMに収まらない大容量ファイルを`sort`コマンドでソートする</title><link>https://genzouw.com/entry/2019/05/30/085440/1565/</link><pubDate>Thu, 30 May 2019 08:54:40 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/30/085440/1565/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;仕事で非常に大きなファイル(&lt;code&gt;10GB&lt;/code&gt;)をソートする必要がありました。&lt;/p&gt;&#10;&lt;p&gt;ただし、データ容量が大きいためRAMに乗らず、 &lt;code&gt;/tmp&lt;/code&gt; に大量の一時ファイルが配置されてしまい、ディスク不足で何度もハングしてしまいました。&#10;ハングしなかったとしても処理時間が大量にかかってしまっていました。&lt;/p&gt;&#10;&lt;p&gt;うまい方法がないかを試した結果を共有します。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;※大量データを &lt;code&gt;sort&lt;/code&gt; コマンドでソートするという方針がそもそも、という意見もありますがリソース不足（金、モノ、時間）でこの方法を取ることになりました。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sort --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sort &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.22&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;ソート対象となるデータファイルを作成します。&#10;業務で問題になったファイルサイズ（10GB）と比べると可愛いサイズとなっています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;for&lt;/span&gt; i in &lt;span class="k"&gt;$(&lt;/span&gt;seq &lt;span class="m"&gt;1&lt;/span&gt; 50000000&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$RANDOM&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt; &amp;gt;target.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ du -hs target.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;512M target.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wc -l target.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;50000000&lt;/span&gt; target.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="単純にソートしてみる"&gt;単純にソートしてみる&lt;/h2&gt;&#10;&lt;p&gt;単純にソートしてみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;3回試行してみることにします。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;データ容量が大きすぎる場合には処理が終わらない、Swap領域不足になる、メモリ不足で落ちるなどが起こりえますが、今回はソート可能な容量ですね。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;time&lt;/span&gt; bash -c &lt;span class="s2"&gt;&amp;#34;cat target.txt | sort &amp;gt; 1-1.txt&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;real 1m58.322s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;user 1m57.123s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys 0m1.321s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;time&lt;/span&gt; bash -c &lt;span class="s2"&gt;&amp;#34;cat target.txt | sort &amp;gt; 1-2.txt&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;real 1m57.561s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;user 1m56.348s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys 0m1.333s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;time&lt;/span&gt; bash -c &lt;span class="s2"&gt;&amp;#34;cat target.txt | sort &amp;gt; 1-3.txt&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;real 1m57.741s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;user 1m56.614s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sys 0m1.248s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 念の為出力されたファイルに差分がないことを確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ diff 1-1.txt 1-2.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ diff 1-2.txt 1-3.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="分割してソートしてみる"&gt;分割してソートしてみる&lt;/h2&gt;&#10;&lt;p&gt;こちらが大量データをソートするときに利用した方法です。&lt;/p&gt;</description></item><item><title>オープンできるファイル数上限を管理する「ファイルディスクリプタ」について（ `Too many open files` エラーを理解する ）</title><link>https://genzouw.com/entry/2019/05/28/090021/1556/</link><pubDate>Tue, 28 May 2019 09:00:21 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/28/090021/1556/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;プロジェクトで大量のファイルを扱う必要があり、&#10;ファイルディスクリプタの話が出てきたので整理してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;centos&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ID_LIKE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rhel fedora&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux 7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ANSI_COLOR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;0;31&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CPE_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cpe:/o:centos:centos:7&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;HOME_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://www.centos.org/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;BUG_REPORT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://bugs.centos.org/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CENTOS_MANTISBT_PROJECT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS-7&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;CENTOS_MANTISBT_PROJECT_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;REDHAT_SUPPORT_PRODUCT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;centos&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;REDHAT_SUPPORT_PRODUCT_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ファイルディスクリプタとは"&gt;ファイルディスクリプタとは&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;OSが以下のようなものにアクセスする場合に用いる識別子（ニックネームのようなもの）を &lt;strong&gt;「ファイルディスクリプタ」&lt;/strong&gt; といいます。&#10;&lt;ul&gt;&#10;&lt;li&gt;ファイル&lt;/li&gt;&#10;&lt;li&gt;標準入出力など&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;0から順番に整数の値が割り当てられますが、&#10;通常、以下の3つはOS（シェル）が最初に用意します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;0：標準入力（stdin）&lt;/li&gt;&#10;&lt;li&gt;1：標準出力（stdout）&lt;/li&gt;&#10;&lt;li&gt;2：標準エラー出力（stderr）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;そのため、プログラムがファイルをオープンすると「3」から順番にファイルディスクリプタが割り当てられます。&lt;/p&gt;&#10;&lt;h2 id="作成できるファイルディスクリプタの上限数"&gt;作成できるファイルディスクリプタの上限数&lt;/h2&gt;&#10;&lt;p&gt;ファイルディスクリプタは無限に使えるわけではありません。&#10;&lt;strong&gt;プロセスごと&lt;/strong&gt; に使える上限が設定されています。&lt;/p&gt;&#10;&lt;h2 id="作成できるファイルディスクリプタの上限数エラーを発生させてみる"&gt;作成できるファイルディスクリプタの上限数エラーを発生させてみる&lt;/h2&gt;&#10;&lt;p&gt;作成できるファイルディスクリプタの上限数を確認してみます。&#10;&lt;code&gt;PHP&lt;/code&gt; を使った例を挙げます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ php -r &lt;span class="s1"&gt;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;$fd = array();&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;# 1022ファイルをオープンします&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;for ($i = 0; $i &amp;lt; 1022; ++$i) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; $fd[] = fopen(&amp;#34;${i}.txt&amp;#34;, &amp;#34;w&amp;#34;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; fwrite($fd[$i], &amp;#34;hoge&amp;#34;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記スクリプトは以下のような特徴があります。&lt;/p&gt;</description></item><item><title>「macOS Mojave」のダークモードをコマンドラインから切り替える方法</title><link>https://genzouw.com/entry/2019/05/25/105104/1543/</link><pubDate>Sat, 25 May 2019 10:51:04 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/25/105104/1543/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;コマンドラインでなんでもやりたいgenzouwです。&#10;会社のMacと自宅のMacの環境構築はすべてスクリプト化して、いずれも同じ設定になるようにしています。&lt;/p&gt;&#10;&lt;p&gt;さて、「macOS Mojave」で利用可能なDarkMode（ダークモード）ですが、こちらを有効にすると「省電力稼働となる」、「目が疲れにくい」といった効果があるということで有効にしていました。&lt;/p&gt;&#10;&lt;p&gt;久々に自宅のMacを開いたところこちらの環境だけDarkModeが有効になっていませんでした。&lt;/p&gt;&#10;&lt;p&gt;これは良くない、原因はGUIから設定したことにあるな、ということでコマンドラインから有効にする方法を模索してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="osascript-コマンドを使う"&gt;&lt;code&gt;osascript&lt;/code&gt; コマンドを使う&lt;/h2&gt;&#10;&lt;p&gt;Macに搭載されている &lt;strong&gt;AppleScript&lt;/strong&gt; というOS操作用のスクリプトを利用します。&#10;スクリプトを実行するためのコマンドは &lt;code&gt;osascript&lt;/code&gt; です。&lt;/p&gt;&#10;&lt;h3 id="ダークモードを有効にする"&gt;ダークモードを有効にする&lt;/h3&gt;&#10;&lt;p&gt;以下のワンライナーコマンドをセットアップスクリプトにでも追記してやればOKです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ osascript -e &lt;span class="s1"&gt;&amp;#39;tell application &amp;#34;System Events&amp;#34; to tell appearance preferences to set dark mode to true&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ダークモードを無効にする"&gt;ダークモードを無効にする&lt;/h3&gt;&#10;&lt;p&gt;「真偽値」部分を反転させるだけです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ osascript -e &lt;span class="s1"&gt;&amp;#39;tell application &amp;#34;System Events&amp;#34; to tell appearance preferences to set dark mode to false&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;AppleScriptってあんまり知らなかったのですが、以下のGithubリポジトリのソースコード覗いていたら上記の方法が書かれていました。勉強になりました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/sindresorhus/dark-mode"&gt;GitHub - sindresorhus/dark-mode: Control the macOS dark mode from the command-line&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>既存のWebアプリで「Amazon Cognito」認証を利用する（その２:PHPのサンプルプログラムの実装）</title><link>https://genzouw.com/entry/2019/05/24/012926/1532/</link><pubDate>Fri, 24 May 2019 01:29:26 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/24/012926/1532/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/05/22/163232"&gt;既存の Web アプリで「Amazon Cognito」認証を利用する（その１:処理フローの整理） | ゲンゾウ用ポストイット&lt;/a&gt; で「Cognito」の認証の流れを整理しました。&lt;/p&gt;&#10;&lt;p&gt;ここからは、PHP のサンプルプログラムを実装してより具体的に理解を深めていきたいと思います。&lt;/p&gt;&#10;&lt;p&gt;早速進めて行こうと思います。&lt;/p&gt;&#10;&lt;p&gt;ちなみに、 PHPのサンプルプログラムはGithubで公開しているので、参考にしていただければと思います。&lt;/p&gt;&#10;&lt;p&gt;( &lt;em&gt;実行するだけであれば、 &lt;strong&gt;「Docker Compose」&lt;/strong&gt; がインストールされていれば動きます。&lt;/em&gt; )&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/genzouw/aws-cognito-example"&gt;GitHub - genzouw/aws-cognito-example&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="aws-cognito-の作成設定"&gt;AWS Cognito の作成、設定&lt;/h2&gt;&#10;&lt;p&gt;まずは &lt;strong&gt;AWS&lt;/strong&gt; 側の設定を行っていきたいと思います。&lt;/p&gt;&#10;&lt;h3 id="1-cognitoのユーザープールの作成"&gt;1. 「Cognito」のユーザープールの作成&lt;/h3&gt;&#10;&lt;p&gt;初めて &lt;strong&gt;Cognito&lt;/strong&gt; にアクセスした場合、以下のようなページが表示されるはずです。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1Uk0iZi5oqj7BNogwtBN256DWOitzcFDr" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ユーザープールの管理&lt;/strong&gt; を選択して先に進みます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1G1Yp-Yf2Bxb8HT5mI6Le-p5uUFqoTWBN" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ユーザープールを作成する&lt;/strong&gt; をクリックします。&lt;/p&gt;&#10;&lt;p&gt;作成するユーザープール名を入力し、次に進みます。&lt;/p&gt;&#10;&lt;p&gt;ここでは &lt;code&gt;g-user-pool&lt;/code&gt; というユーザープール名にしました。&lt;/p&gt;&#10;&lt;p&gt;後は次へ次へと進むだけです。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=17sDPr_g6SebBCKuNoDTMimLNMx6wNTQR" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="2cognitoに新しいアプリクライアントの登録"&gt;2.「Cognito」に新しい「アプリクライアント」の登録&lt;/h3&gt;&#10;&lt;p&gt;「Cognito」のユーザープール設定ページから &lt;strong&gt;アプリクライアントの追加&lt;/strong&gt; をクリックします。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=157Kc7VEShH-rmvQdFKYF04knfY9mi-Y8" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;以下のように設定します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;アプリクライアント名 : &lt;code&gt;aws-cognito-example&lt;/code&gt; ( ※こちらは好きな名前をつけましょう )&lt;/li&gt;&#10;&lt;li&gt;トークンの有効期限を更新 (日) : &lt;code&gt;1&lt;/code&gt; ( 特にこだわりは有りませんでした。デフォルトの30日のままでも構いません。 )&lt;/li&gt;&#10;&lt;li&gt;クライアントシークレットを生成 : &lt;code&gt;チェックを外す&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1Kd0EKVhO9VjjSVb0fwuLkrkC7etM3On9" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="3アプリクライアントの設定"&gt;3.「アプリクライアントの設定」&lt;/h3&gt;&#10;&lt;p&gt;今度は左のタブから「アプリクライアントの設定」を開きます。&#10;以下のように設定します。&lt;/p&gt;</description></item><item><title>既存のWebアプリで「Amazon Cognito」認証を利用する（その１:処理フローの整理）</title><link>https://genzouw.com/entry/2019/05/22/163232/1515/</link><pubDate>Wed, 22 May 2019 16:32:32 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/22/163232/1515/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;以前、 &lt;a href="https://genzouw.com/entry/2019/04/21/085627"&gt;「Amazon Cognito」を使ってログイン機能を作成する（SNS 認証あり） | ゲンゾウ用ポストイット&lt;/a&gt; で「Amazon Cognito」のユーザ認証機能を利用してログインページを構築しました。&lt;/p&gt;&#10;&lt;p&gt;しかし、やりたかったことは既存の Web アプリケーションのログイン機能を「Cognito」を利用した仕組みに置き直すということだったため、完全ではありませんでした。&lt;/p&gt;&#10;&lt;p&gt;「Cognito」のユーザ認証が完了した後、既存のアプリケーションでそれを引き継ぐための仕組みを構築すべく、追加で調査をしました。&#10;（今回は整理にとどめて次回のエントリでサンプルコードの実装・公開をしたいと思います。）&lt;/p&gt;&#10;&lt;h2 id="改めて-oauth2-または-openid-connect-の処理フローについて"&gt;改めて OAuth2 または OpenID Connect の処理フローについて&lt;/h2&gt;&#10;&lt;p&gt;「Congito」を使ったユーザ認証は「OpenID Connect」という方式になります。「OAuth2」方式をベースとした後発の認証方式です。したがって「OAuth2」の理解を深めることが「OpenID Connect」の理解を深めることにつながると思いました。&lt;/p&gt;&#10;&lt;p&gt;僕が説明するより以下の記事を読むほうが圧倒的にわかりやすいです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be"&gt;一番分かりやすい OAuth の説明 - Qiita&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://qiita.com/TakahikoKawasaki/items/498ca08bbfcc341691fe"&gt;一番分かりやすい OpenID Connect の説明 - Qiita&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;とはいえ、自分の頭の中を整理するため、自分なりにまとめてみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;めっちゃ汚い&lt;/strong&gt;ですが、手書きの処理フローになります。（一部字が潰れたり上塗りされていたりしていますが（汗））&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1k54a3o3cKfS9xG2xCHDKZHO-NZZRPBoM" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="処理フローを箇条書きで文字起こし"&gt;処理フローを箇条書きで文字起こし&lt;/h3&gt;&#10;&lt;p&gt;登場人物は 3 つ、 &amp;ldquo;Browser&amp;rdquo; / &amp;ldquo;AppServer&amp;rdquo; / &lt;strong&gt;&amp;ldquo;Cognito&amp;rdquo;&lt;/strong&gt; です。（&amp;ldquo;Browser&amp;quot;は人の形で表現しています。）&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&amp;ldquo;Browser&amp;rdquo; は &amp;ldquo;AppServer&amp;rdquo; にアクセス&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;AppServer&amp;rdquo; はログイン済みかを判定します。未ログイン状態の場合には &lt;strong&gt;&amp;ldquo;Cognito&amp;rdquo;&lt;/strong&gt; に &amp;ldquo;redirect&amp;rdquo;（&amp;ldquo;redirect&amp;quot;の URL に対して事前に「Cognito」から払い出された「アプリケーション ID」などを付与）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&amp;ldquo;Cognito&amp;rdquo;&lt;/strong&gt; は &amp;ldquo;login page&amp;rdquo; を返却&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;Browser&amp;rdquo; は &amp;ldquo;login&amp;rdquo; を行う&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&amp;ldquo;Cognito&amp;rdquo;&lt;/strong&gt; は受け取った認証情報が正しければ &amp;ldquo;redirect&amp;rdquo; 。 &amp;ldquo;redirect&amp;rdquo; の URL の後方にはクエリ文字列形式で &lt;strong&gt;Authentication code&lt;/strong&gt; と呼ばれるものを付与 （ex: &lt;code&gt;https://hoge.com/callback.html&amp;amp;code=xxxx&lt;/code&gt; ）&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;AppServer&amp;rdquo; は受け取った &lt;strong&gt;Authentication code&lt;/strong&gt; を使って &lt;strong&gt;Cognito&lt;/strong&gt; にリクエスト&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ID Token&lt;/strong&gt; を取得&lt;/li&gt;&#10;&lt;li&gt;JavaScript では、ページの URL からフラグメントを切り出し、(5)で受け取った &lt;strong&gt;ID Token&lt;/strong&gt; を抜き出すロジックが書かれている。&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;AppServer&amp;rdquo; は HTML/JavaScript/ &lt;strong&gt;ID Token&lt;/strong&gt; を返却。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;取得できた &lt;strong&gt;「ID Token」&lt;/strong&gt; ですが、「SPA」の場合は &amp;ldquo;Broser&amp;rdquo; の &lt;strong&gt;「LocalStorage」&lt;/strong&gt; 機能を使って保存しておき、以降の通信時に「HTTP Header」に付与して &amp;ldquo;AppServer&amp;rdquo; と通信を行うことで認証済みであることを証明します。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでcolumnコマンドを使って出力内容を表として整形する</title><link>https://genzouw.com/entry/2019/05/20/150054/1511/</link><pubDate>Mon, 20 May 2019 15:00:54 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/20/150054/1511/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;先日 &lt;a href="https://github.com/simonwhitaker/gibo"&gt;Gibo&lt;/a&gt; のソースコードを見ていたときに出力内容を表形式で表示させる方法が参考になったので整理しました。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;column&lt;/code&gt; というコマンドを利用します。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;column&lt;/code&gt; コマンドはよく使っていたのですが、知らなかったオプションを知ることができたので紹介しておきます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ column --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;column from util-linux 2.23.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="標準入力の列の位置を揃える"&gt;標準入力の列の位置を揃える&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;column -t&lt;/code&gt; のように、 &lt;code&gt;-t&lt;/code&gt; オプションを追加することで列の位置を揃えた表として出力できます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「4行x3列」&lt;/strong&gt; の簡単なデータファイルを作成し、これを操作してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;input.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$RANDOM $RANDOM $RANDOM&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$RANDOM $RANDOM $RANDOM&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$RANDOM $RANDOM $RANDOM&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;$RANDOM $RANDOM $RANDOM&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat input.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;30378&lt;/span&gt; &lt;span class="m"&gt;11629&lt;/span&gt; &lt;span class="m"&gt;2969&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;210&lt;/span&gt; &lt;span class="m"&gt;23946&lt;/span&gt; &lt;span class="m"&gt;10935&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;27622&lt;/span&gt; &lt;span class="m"&gt;25085&lt;/span&gt; &lt;span class="m"&gt;14115&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;31836&lt;/span&gt; &lt;span class="m"&gt;1141&lt;/span&gt; &lt;span class="m"&gt;14077&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ランダムな大小の数値が不規則に並んでいます。&lt;/p&gt;&#10;&lt;p&gt;このファイルに対して &lt;code&gt;column -t&lt;/code&gt; コマンドを実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat input.txt &lt;span class="p"&gt;|&lt;/span&gt; column -t&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;30378&lt;/span&gt; &lt;span class="m"&gt;11629&lt;/span&gt; &lt;span class="m"&gt;2969&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;210&lt;/span&gt; &lt;span class="m"&gt;23946&lt;/span&gt; &lt;span class="m"&gt;10935&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;27622&lt;/span&gt; &lt;span class="m"&gt;25085&lt;/span&gt; &lt;span class="m"&gt;14115&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;31836&lt;/span&gt; &lt;span class="m"&gt;1141&lt;/span&gt; &lt;span class="m"&gt;14077&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;きれいに整形されました。&lt;/p&gt;</description></item><item><title>シェルスクリプトでunixtimeへ変換・unixtimeから変換をしてみる</title><link>https://genzouw.com/entry/2019/05/16/082057/1499/</link><pubDate>Thu, 16 May 2019 08:20:57 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/16/082057/1499/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;プロジェクトのテストフェーズでunixtimeの値が妥当かどうかを確認したかったのでコマンドライン上で確認した際に使ったコマンドを共有します。&#10;せっかくなのでunixtimeへ変換・unixtimeから変換の両方についてまとめてみました。&lt;/p&gt;&#10;&lt;p&gt;両方とも &lt;code&gt;date&lt;/code&gt; コマンドを使って実現できます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;date &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.31&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="unixtimeから変換"&gt;unixtimeから変換&lt;/h2&gt;&#10;&lt;p&gt;unixtimeから日時表記の文字列に変換するには、 &lt;code&gt;-d&lt;/code&gt; オプションの引数として &lt;code&gt;@ + unixtime&lt;/code&gt; の形式で文字列を指定します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d @1557961216&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;木 &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt; 08:00:16 JST &lt;span class="m"&gt;2019&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d @1557961216 +&lt;span class="s2"&gt;&amp;#34;%Y-%m-%d %H:%M:%S&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-05-15 23:00:16&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="unixtimeへ変換"&gt;unixtimeへ変換&lt;/h2&gt;&#10;&lt;p&gt;-d オプションに渡す文字列として、数字の前に @ を付けると、 UNIX時間での指定になる。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;現在日時から算出&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date +%s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1557961791&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;指定した日時から算出&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ date -d &lt;span class="s2"&gt;&amp;#34;1979-09-30 12:34:56&amp;#34;&lt;/span&gt; +%s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;307542896&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="余談unixtimeの始まりの値と戯れる"&gt;余談：unixtimeの始まりの値と戯れる&lt;/h2&gt;&#10;&lt;p&gt;余談ですが、 unixtimeは「1970-01-01 00:00:00」から始まります。&lt;/p&gt;</description></item><item><title>「markdownlint」を使ってMarkdown記法の構文チェックを行う（Vimのaleプラグインと組み合わせるともっと便利に）</title><link>https://genzouw.com/entry/2019/05/14/085456/1491/</link><pubDate>Tue, 14 May 2019 08:54:56 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/14/085456/1491/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;手に馴染むエディタを使いコードを書きながら、同じぐらいドキュメントを書いてます。&lt;/p&gt;&#10;&lt;p&gt;アプリケーションの概要、報告書、ブログからメールに至るまで、最近はMarkdown形式で記載してそれぞれのビューアあるいはコンバータで変換して文字を起こすことが多くなっています。&lt;/p&gt;&#10;&lt;h2 id="markdown記法を利用することのメリット"&gt;Markdown記法を利用することのメリット&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;執筆効率がよい&#10;&lt;ul&gt;&#10;&lt;li&gt;HTMLのようにタグを書かなくて良いためタイピング量が減る&lt;/li&gt;&#10;&lt;li&gt;簡単なメモでも早く綺麗に書ける&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;統一したドキュメント形式を保てる&lt;/li&gt;&#10;&lt;li&gt;汎用性が高い&#10;&lt;ul&gt;&#10;&lt;li&gt;関連ツールや利用できるサービスが多い&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;段落など見た目が統一される&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;h1&lt;/code&gt; / &lt;code&gt;h2&lt;/code&gt; / &lt;code&gt;h3&lt;/code&gt; / &lt;code&gt;pre&lt;/code&gt; / &lt;code&gt;li&lt;/code&gt; / &lt;code&gt;bold&lt;/code&gt; &amp;hellip;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="markdown記法は自由が多い"&gt;Markdown記法は自由が多い&lt;/h2&gt;&#10;&lt;p&gt;Markdown記法の習得は非常に容易です。&#10;実際僕も一日ほど使ったぐらいで移行することができました。&#10;理由の一つとして規約の少なさがあげられます。&lt;/p&gt;&#10;&lt;h2 id="markdown記法は自由度を構文チェックで補う"&gt;Markdown記法は自由度を構文チェックで補う&lt;/h2&gt;&#10;&lt;p&gt;自由度が高いがゆえに、統一感のないドキュメントが出来上がりがちです。&#10;例えばHTMLの文書構造として、 &lt;code&gt;h1&lt;/code&gt; タグの次には &lt;code&gt;h2&lt;/code&gt; タグが登場するべきであり、 &lt;code&gt;h3&lt;/code&gt; タグが登場してはおかしいですね。&#10;同様に &lt;code&gt;#&lt;/code&gt; でタイトルを記載したあとに &lt;code&gt;###&lt;/code&gt; タイトルが来るとおかしいわけです。 &lt;code&gt;#&lt;/code&gt; タイトルがないというのもやはり同様におかしいですね。&lt;/p&gt;&#10;&lt;p&gt;自由度の高いMarkdown記法ですが、&#10;構文チェックを行うことで、弱点を補うことができます。&lt;/p&gt;&#10;&lt;h2 id="markdown記法の構文チェックツールmarkdownlintを使う"&gt;Markdown記法の構文チェックツール「markdownlint」を使う&lt;/h2&gt;&#10;&lt;p&gt;僕は &lt;strong&gt;「markdownlint」&lt;/strong&gt; というLintツールを利用しています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/DavidAnson/markdownlint"&gt;GitHub - DavidAnson/markdownlint: A Node.js style checker and lint tool for Markdown/CommonMark files.&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="導入手順"&gt;導入手順&lt;/h2&gt;&#10;&lt;h3 id="事前準備"&gt;事前準備&lt;/h3&gt;&#10;&lt;p&gt;Node.js製のツールとして提供されているため、Node.jsのインストールが必要です。&#10;以下のエントリを参照すればすぐにインストールが可能です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/03/01/203455#toc_id_3"&gt;Node.jsのインストール方法&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="markdownlintのインストール"&gt;markdownlintのインストール&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;npm&lt;/code&gt; コマンドでインストールします。&lt;/p&gt;</description></item><item><title>sedのe内部コマンドで指定された文字列をシェルコマンドとして実行させる</title><link>https://genzouw.com/entry/2019/05/13/083634/1482/</link><pubDate>Mon, 13 May 2019 08:36:34 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/13/083634/1482/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; コマンドの &lt;code&gt;e&lt;/code&gt; 内部コマンドで指定された「文字列」をシェルコマンドと見直して実行させることができます。&#10;文章だけではわかりにくいので例を上げて説明したいと思います。&lt;/p&gt;&#10;&lt;p&gt;僕はこちらの機能をほとんど利用したことはありませんが、こういう機能もあるということで取り上げてみます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed &lt;span class="o"&gt;(&lt;/span&gt;GNU sed&lt;span class="o"&gt;)&lt;/span&gt; 4.2.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;テストデータを用意します。&#10;各行に1から20の値を出力したファイルになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt; &amp;gt; test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 最後の10行を表示&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tail test.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;12&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;14&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;15&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;16&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;17&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;18&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;19&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="0がつく文字列のときだけ時刻を表示させる"&gt;0がつく文字列のときだけ時刻を表示させる&lt;/h2&gt;&#10;&lt;p&gt;0がつく文字列のときだけ、 &lt;code&gt;date&lt;/code&gt; コマンドで時刻を表示させてみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat test.txt &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;/0/e date;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sun May &lt;span class="m"&gt;12&lt;/span&gt; 23:28:00 UTC &lt;span class="m"&gt;2019&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;12&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;14&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;15&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;16&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;17&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;18&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;19&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Sun May &lt;span class="m"&gt;12&lt;/span&gt; 23:28:00 UTC &lt;span class="m"&gt;2019&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;20&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もともとの数値（ &lt;code&gt;10&lt;/code&gt; / &lt;code&gt;20&lt;/code&gt;）も表示させてしまっているため、削除ロジックも追加してみます。&lt;/p&gt;</description></item><item><title>DockerでクリーンなVue.js開発環境を構築してみる</title><link>https://genzouw.com/entry/2019/05/10/125907/1460/</link><pubDate>Fri, 10 May 2019 12:59:07 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/10/125907/1460/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Vue.jsの開発のためのクリーンな環境を構築するためにDockerを使った場合の流れをまとめてみました。&lt;/p&gt;&#10;&lt;h2 id="開発用ディレクトリの作成とgit初期化"&gt;開発用ディレクトリの作成とGit初期化&lt;/h2&gt;&#10;&lt;p&gt;今回作成するVueのプロジェクト名は &lt;strong&gt;my-app&lt;/strong&gt; としたいと思います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p my-app&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# カレントディレクトリを変更しておきます&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; my-app&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker環境起動"&gt;Docker環境起動&lt;/h2&gt;&#10;&lt;h3 id="dockerイメージを作成"&gt;Dockerイメージを作成&lt;/h3&gt;&#10;&lt;p&gt;Vue開発に必要なライブラリをGlobalインストールしたDockerイメージを作成します。&lt;/p&gt;&#10;&lt;p&gt;まずは、以下のような &lt;strong&gt;Dockerfile&lt;/strong&gt; を作成します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &amp;lt;&amp;lt;&lt;span class="s1"&gt;&amp;#39;EOF&amp;#39;&lt;/span&gt; &amp;gt;Dockerfile&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;node:13.7.0-alpine3.10&lt;/span&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;RUN&lt;/span&gt; npm install -g vue-cli &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm install -g @vue/cli-service-global&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EOF&lt;span class="err"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Build&lt;/strong&gt;します。作成するDockerイメージ名は&lt;strong&gt;docker-vue&lt;/strong&gt;としています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker build -t docker-vue .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;問題なくイメージが作成できれば、次に進みましょう。&lt;/p&gt;&#10;&lt;h2 id="vueアプリケーションの初期化"&gt;Vueアプリケーションの初期化&lt;/h2&gt;&#10;&lt;p&gt;以下のコマンドを実行してプロジェクトを作成します。&#10;何度か選択肢を聞かれますが、はデフォルトのままで問題ありませんので&lt;strong&gt;Enter&lt;/strong&gt;キーを連打します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 以降のコマンドで利用している ${PWD##*/} は、カレントディレクトリ名となっている&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="p"&gt;##*/&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;my-app&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm -v &lt;span class="nv"&gt;$PWD&lt;/span&gt;:/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="p"&gt;##*/&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; --workdir /&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PWD&lt;/span&gt;&lt;span class="p"&gt;##*/&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; -it docker-vue &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; vue init webpack .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;うまく行けば以下のようなメッセージが表示されます。&#10;（数分かかりますのでのんびり待ちましょう。）&lt;/p&gt;</description></item><item><title>Github上のOSSにプルリクエストをあげるための手順をまとめました</title><link>https://genzouw.com/entry/2019/05/08/233820/1442/</link><pubDate>Wed, 08 May 2019 23:38:20 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/08/233820/1442/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;以下のOSSに対して、プルリクエストを上げたいと思ったのですが、「この作業以前もやっていたよな？」と思いました。&#10;いい機会なのでプルリクエストの上げ方を整理してみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/simonwhitaker/gibo"&gt;GitHub - simonwhitaker/gibo: Easy access to gitignore boilerplates&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="手順"&gt;手順&lt;/h2&gt;&#10;&lt;h3 id="1-リポジトリをforkします"&gt;1. リポジトリをForkします&lt;/h3&gt;&#10;&lt;p&gt;ターゲットとなるリポジトリのトップページを開き、ページ右上の &lt;strong&gt;「Fork」&lt;/strong&gt; のボタンを押します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1_DXcyOtq7nM1g6a2g--AlYy7Aon3Ixkj" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;以下のようなダイアログが表示された場合はフォーク後のリポジトリの所有者となる「ユーザ」 or 「チーム」を選択してください。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1_UT5UyZy_Kv-hM3ubG39ZJSkmeGEahmO" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;Forkが始まったらしばし待ちましょう。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1pNN9I8s7ppuhwyAtkISguMcZ0R-itXBH" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;Forkが完了すれば、以下のようなページが表示されるはずです。（リポジトリ名のスラッシュの前、所有者名が &lt;strong&gt;genzouw&lt;/strong&gt; という僕のアカウント名に変わっていますね。）&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1cCIbchWCLNCs34ezkHAr36W8pFELU2XQ" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="2-リポジトリをクローンします"&gt;2. リポジトリをクローンします&lt;/h3&gt;&#10;&lt;p&gt;ここからはブラウザ上の操作から変わって、コンソールの作業となります。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;git&lt;/code&gt; コマンドを使ってプロジェクトをクローンします。&lt;/p&gt;&#10;&lt;p&gt;リポジトリのURLは、先程の「Fork済みリポジトリページ」の右上にある「Clone or download」というボタンからクリップボードにコピーできます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1xFlgV-cTWKB96l_kC4bxX8r-vJvxoaVE" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1DviGh3o5SxG-3ojhEMOAaqfvN4NyCLc3" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;今回のリポジトリは以下のようなURLになりました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git@github.com:genzouw/gibo.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;git&lt;/code&gt; コマンドでクローンし、フォルダに移動します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone git@github.com:genzouw/gibo.git &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; gibo&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-変更内容をコミットするためのブランチを作成します"&gt;3. 「変更内容をコミットするためのブランチ」を作成します&lt;/h3&gt;&#10;&lt;p&gt;「変更内容をコミットするためのブランチ」を作成します。&lt;/p&gt;&#10;&lt;p&gt;今回は「GitFlow」を参考に &lt;code&gt;feature/find_files_in_subdirectories&lt;/code&gt; というブランチ名にしています。&#10;&lt;code&gt;find_files_in_subdirectories&lt;/code&gt; の部分には改修内容がわかるようにスネークケースで名前をつけています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git checkout -b feature/find_files_in_subdirectories&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-ファイルの編集追加を行う"&gt;4. ファイルの編集・追加を行う&lt;/h3&gt;&#10;&lt;p&gt;適宜変更しましょう。&#10;省略します。&lt;/p&gt;&#10;&lt;h3 id="5-ファイルの編集追加をローカルリポジトリに反映させる"&gt;5. ファイルの編集・追加をローカルリポジトリに反映させる&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;git add&lt;/code&gt; コマンドを使って変更対象のファイルをローカルリポジトリに反映させます。&lt;/p&gt;</description></item><item><title>AWS-CLIを実行したら `CERTIFICATE_VERIFY_FAILED` というエラーメッセージが表示されてハマってしまった</title><link>https://genzouw.com/entry/2019/05/07/085327/1437/</link><pubDate>Tue, 07 May 2019 08:53:27 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/07/085327/1437/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;GWの10連休に入る直前に実行したところ、突然エラーメッセージが表示され正常に動作しなくなってしまいました。&lt;/p&gt;&#10;&lt;h2 id="どのようなエラーメッセージが表示された"&gt;どのようなエラーメッセージが表示された？&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SSL validation failed &lt;span class="k"&gt;for&lt;/span&gt; https://ec2.ap-southeast-1.amazonaws.com/ &lt;span class="o"&gt;[&lt;/span&gt;SSL: CERTIFICATE_VERIFY_FAILED&lt;span class="o"&gt;]&lt;/span&gt; certificate verify failed&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行環境"&gt;実行環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.140 Python/3.7.3 Darwin/18.5.0 botocore/1.12.130&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="どのように-aws-cl-を利用していたか"&gt;どのように &lt;code&gt;aws-cl&lt;/code&gt; を利用していたか？&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;EC2&lt;/strong&gt; 環境を構築するための簡易なシェルスクリプトを作成し、その中で何度か &lt;code&gt;aws&lt;/code&gt; コマンドを実行していました。&lt;/li&gt;&#10;&lt;li&gt;シェルスクリプトは &lt;code&gt;Bash&lt;/code&gt; で動作するようにシバンを設定していました。&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;#!/usr/bin/env bash&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="試してみたこと"&gt;試してみたこと&lt;/h2&gt;&#10;&lt;h3 id="aws-コマンドのバージョンアップ"&gt;&lt;code&gt;aws&lt;/code&gt; コマンドのバージョンアップ&lt;/h3&gt;&#10;&lt;p&gt;はじめは &lt;code&gt;aws-cli&lt;/code&gt; のバージョンアップが原因かと思い、バージョンアップしてみたが、問題は解決しませんでした。&lt;/p&gt;&#10;&lt;h3 id="aws-コマンドのオプション追加"&gt;&lt;code&gt;aws&lt;/code&gt; コマンドのオプション追加&lt;/h3&gt;&#10;&lt;p&gt;以下のエントリを見つけました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://hatunina.hatenablog.com/entry/2018/09/10/221223"&gt;aws-cliでCERTIFICATE_VERIFY_FAILEDが出た時の対処 - hatunina’s blog&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;aws&lt;/code&gt; コマンドに &lt;code&gt;--no-verify&lt;/code&gt; というオプションを付与すればエラーを無視できるということですが、、以下の理由により他の方法で対処することにしました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;aws&lt;/code&gt; コマンドを実行するたびにこのオプションを付与しないといけないのが煩わしい&lt;/li&gt;&#10;&lt;li&gt;原因の根治となっていない&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="根治できないので他の作業をしていたところやはりハマる"&gt;根治できないので他の作業をしていたところやはりハマる&lt;/h2&gt;&#10;&lt;p&gt;根治できないので他の作業して時間のある時に調査しよう、と思ったのですがGithubから&lt;code&gt;git clone&lt;/code&gt;しようとしたタイミングで関係ありそうなエラーでハマりました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone https://github.com/kward/shunit2.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Cloning into &lt;span class="s1"&gt;&amp;#39;shunit2&amp;#39;&lt;/span&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;fatal: unable to access &lt;span class="s1"&gt;&amp;#39;https://github.com/kward/shunit2.git&amp;#39;&lt;/span&gt;: LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTTPSによる通信全般がエラーとなっているのでは？と思ったので以下のコマンドを試してみましたが、案の定同じ問題が発生しました。&lt;/p&gt;</description></item><item><title>シェルスクリプトで標準入力から1文字ずつ取り出して処理したい</title><link>https://genzouw.com/entry/2019/05/01/062956/1432/</link><pubDate>Wed, 01 May 2019 06:29:56 +0900</pubDate><guid>https://genzouw.com/entry/2019/05/01/062956/1432/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;標準入力から1文字ずつ取り出して処理したい場合にどのように書いたらよいかについて。&#10;今まで使っていた &lt;code&gt;fold&lt;/code&gt; では問題があったのでもう一度勉強し直した。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="foldを使う"&gt;&lt;code&gt;fold&lt;/code&gt;を使う&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;fold&lt;/code&gt; コマンドは、テキストファイルなどを読み込み、指定した幅で改行して出力するコマンドです。&#10;改行文字を「挟み込む」とイメージするとよいでしょう。&lt;/p&gt;&#10;&lt;p&gt;これと &lt;code&gt;-w 1&lt;/code&gt; オプションを使って標準入力の内容を1文字ずつに分割できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;abcdefg&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;abcdefg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;abcdefg&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; fold -w &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; c&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;]&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;a&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;b&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;c&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;d&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;e&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;f&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;g&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="foldでは全角文字に対応できない"&gt;&lt;code&gt;fold&lt;/code&gt;では全角文字に対応できない&lt;/h2&gt;&#10;&lt;p&gt;今まで&lt;code&gt;fold&lt;/code&gt;を使っていたのですが、こちら全角文字に対応できないようです。&#10;（幸い全角文字を取り扱うケースがあまりなかったようです。）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;abcあいeう fg&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; fold -w &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; c&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;c&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;a&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;b&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;c&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;e&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;f&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;g&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="grepを使う"&gt;&lt;code&gt;grep&lt;/code&gt;を使う&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;grep&lt;/code&gt; に &lt;code&gt;-o&lt;/code&gt; オプションというものがあります。&#10;&lt;code&gt;grep&lt;/code&gt; は通常条件にマッチした行を出力しますが、 &lt;code&gt;-o&lt;/code&gt; オプションを付けると条件にマッチした &lt;strong&gt;部分&lt;/strong&gt; だけを出力することができます。&lt;/p&gt;</description></item><item><title>Amazon DynamoDBのプライマリーキーの２つのタイプについて理解できたことをまとめました</title><link>https://genzouw.com/entry/2019/04/28/103524/1416/</link><pubDate>Sun, 28 Apr 2019 10:35:24 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/28/103524/1416/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/04/27/231011"&gt;Amazon DynamoDBの構成要素について理解できたことをまとめました | ゲンゾウ用ポストイット&lt;/a&gt; で「テーブル」、「項目」、「属性」、「プライマリーキー」について整理しましたが、今回は「プライマリーキー」についてもう少しわかったことをまとめてみました。&lt;/p&gt;&#10;&lt;h2 id="プライマリーキーのタイプとデータの保存方法"&gt;プライマリーキーのタイプとデータの保存方法&lt;/h2&gt;&#10;&lt;p&gt;プライマリーキーを構成する「属性」の数が1つか複数かで用途や考えないといけないことが異なるようです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;単一「属性」で構成されるプライマリーキー : 「&lt;strong&gt;パーティションキー&lt;/strong&gt;」 タイプ&lt;/li&gt;&#10;&lt;li&gt;複数「属性」で構成されるプライマリーキー : 「&lt;strong&gt;パーティションキー+ソートキー&lt;/strong&gt;」 タイプ&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;データの保存方法にも違いがあります。&#10;両者はどう違うのでしょう？&lt;/p&gt;&#10;&lt;h2 id="パーティションキータイプ"&gt;「パーティションキー」タイプ&lt;/h2&gt;&#10;&lt;p&gt;1つの属性で構成されたシンプルなプライマリーキーとなっています。&lt;/p&gt;&#10;&lt;p&gt;キーの値を「ハッシュ関数」という特殊な関数を使って変換します。&#10;変換後の値で、「項目」を配置するデータ格納場所がきまります。&#10;つまり「ハッシュ関数」とは、データ置き場を決めるための関数なのです。&lt;/p&gt;&#10;&lt;p&gt;「ハッシュ関数」を使ったデータ配置のメリットは、データの検索が高速であることです。&#10;データが一箇所に集まってしまうと検索が遅くなってしまいます。データが整理されないまま入れ物にごった煮にされている状態を想像してください。&#10;「ハッシュ関数」を使ってデータの配置場所を決められれば、データの検索が高速にできるわけです。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/04/2019-04-27-001.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;「ハッシュ関数」の結果はできる限りバラバラになるように考えられています。（このあたりはハッシュ関数の実装次第なのでおそらくそうなっているはずです。）&#10;もしバラバラにならなかったとすると、特定のデータ配置場所にだけデータが集まってしまい、やはり検索が遅くなってしまうからです。&lt;/p&gt;&#10;&lt;h2 id="パーティションキーソートキータイプ"&gt;「パーティションキー+ソートキー」タイプ&lt;/h2&gt;&#10;&lt;p&gt;2つの属性で構成されたプライマリーキーは、 属性のうち一つが&lt;strong&gt;パーティションキー&lt;/strong&gt;となり他方が&lt;strong&gt;ソートキー&lt;/strong&gt;となります。&#10;( 複合プライマリーキーと呼ばれたりもします。 )&lt;/p&gt;&#10;&lt;p&gt;パーティションキーのメリットはデータ配置場所が分散することでスキャンが高速になることでした。&#10;プライマリーキーが2つの属性で構成された場合、当然のことながら1つの属性でしか構成できないパーティションキーの値は重複する可能性があります。&lt;/p&gt;&#10;&lt;p&gt;これではハッシュ関数を利用したデータ分散のメリットが薄れてしまいます。&#10;ハッシュ関数で計算したデータ配置場所にデータが集まる傾向が高くなるためフルスキャンの問題と同様のことが発生します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/04/2019-04-27-002.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;そこでソートキーです。&#10;データがバラバラに並んでいる場合にはフルスキャンを行わなければデータを見つけることができません。&#10;しかし、データがソートされていれば高速な探索アルゴリズムを使うことができます。&#10;( 僕は高速な探索アルゴリズムを知っているわけじゃないのですが二分探索の速さぐらいはイメージできます。 )&lt;/p&gt;&#10;&lt;p&gt;図鑑で探しものをする場合を例に上げましょう。&#10;分からない単語は一番後ろの索引を使って掲載ページを特定します。掲載ページが特定できたら、ページをペラペラ送りながら該当ページを探していきます。&#10;該当ページを用意に探す事が出来るのも ページ番号が小さい値から大きな値に正しく並んでくれてるからこそです。&lt;/p&gt;&#10;&lt;p&gt;パーティションキーは1つしか設定できず、他方はソートキーになることにはメリットもあります。&#10;ソートキーを構成する「属性」は範囲を指定して検索することができます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※ユーザのアクセス履歴情報(未ソート)に対して&lt;code&gt;12:00〜14:00&lt;/code&gt;のデータを検索する場合&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/04/2019-04-28-003.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※ユーザのアクセス履歴情報(ソート済)に対して&lt;code&gt;12:00〜14:00&lt;/code&gt;のデータを検索する場合&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/04/2019-04-28-004.png" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="パーティションキーソートキータイプの注意点"&gt;「パーティションキー+ソートキー」タイプの注意点&lt;/h2&gt;&#10;&lt;p&gt;「パーティション+ソートキー」タイプを利用場合には、注意しないといけないケースがあります。&#10;&lt;strong&gt;ホットパーティション問題&lt;/strong&gt; と呼ばれる事象です。&lt;/p&gt;&#10;&lt;p&gt;パーティションキーの偏りにより発生する問題です。&lt;/p&gt;&#10;&lt;p&gt;以下の手書きのメモを例に取り上げます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/04/2019-04-28-005.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;プライマリーキーは2つの属性から構成されているものとします。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;パーティションキー&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;ソートキー&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;ハッシュ関数で算出されたデータ配置場所&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;001&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;x&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;001&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;y&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;001&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;z&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;001&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;a&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;001&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;b&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;A&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;002&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;x&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;B&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;003&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;y&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;C&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;このとき、パーティションキー属性の値が &lt;code&gt;001&lt;/code&gt; であるデータが非常に多いため、&lt;code&gt;A&lt;/code&gt; のパーティションのみデータ量が増加することとなります。当然アクセス数もこのパーティションだけ多くなることでしょう。&lt;/p&gt;</description></item><item><title>Amazon DynamoDBの構成要素について理解できたことをまとめました</title><link>https://genzouw.com/entry/2019/04/27/231011/1411/</link><pubDate>Sat, 27 Apr 2019 23:10:11 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/27/231011/1411/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/04/27/001837"&gt;AWS-CLIを使ってDynamoDBを操作してみる&lt;/a&gt; で「AWS CLI」から「DynamoDB」を操作してみました。&lt;/p&gt;&#10;&lt;p&gt;ただし、しっかり「DynamoDB」の仕組みについて理解できていなかったので、改めてドキュメントを読み進めて理解できたことを整理したいと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※誤りが多分にあるかと思いますので指摘を喜んでお待ちしております。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;ちなみに、プライマリーキーについて更に整理した内容は以下のエントリにまとめています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/04/28/103524"&gt;Amazon DynamoDBのプライマリーキーの２つのタイプについて理解できたことをまとめました | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="参考資料"&gt;参考資料&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html"&gt;DynamoDB コアコンポーネント - Amazon DynamoDB&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="dynamodbの構成要素"&gt;DynamoDBの構成要素&lt;/h2&gt;&#10;&lt;p&gt;DynamoDBの構成要素は多くの点でリレーショナルデータベース（以下RDB）によく似ています。&#10;RDBを理解していれば理解しやすいと思います。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;概念&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;説明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;テーブル&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RDBでいうテーブル。「項目」の集合。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;項目&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RDBでいうレコード（行）。「属性」の集合。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;属性&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RDSでいうカラム（列）。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;プライマリーキー&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;RDSでいうプライマリーキー。1つあるいは2つの属性の組み合わせでテーブルの全「項目」で一意でなければならない。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1TRN33RU-a4K9clRU41uzZGPdlnjj5WB3" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;AWSのマニュアルでは、具体例として &lt;code&gt;People&lt;/code&gt; というテーブルとそのデータ構造について触れています。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1qecZbi88gjm-cxw9BR0xnKTNoFThZ4SX" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;先に触れた構成要素と上記のサンプルデータの対応は以下のようになります。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;概念&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;説明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;テーブル&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;People&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;項目&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;3項目。&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;属性&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PersonId, LastName, FirstName, Phone(1項目目のみ), Address(2項目目のみ), FavoriteColor(3項目目のみ)&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;プライマリーキー&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;PersonId だけで構成される単一プライマリーキー&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="プライマリーキーの属性の特徴制約"&gt;プライマリーキーの「属性」の特徴・制約&lt;/h2&gt;&#10;&lt;h3 id="プライマリーキーは1つ以上の属性で構成しなければならない"&gt;プライマリーキーは1つ以上の「属性」で構成しなければならない&lt;/h3&gt;&#10;&lt;p&gt;先に触れたとおり、プライマリーキーは単一の属性だけで構築しても良いですし、複数の属性で構成することもできます。&lt;/p&gt;&#10;&lt;p&gt;具体的な例を上げると、以下のようになります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;単一「属性」で構成されるプライマリーキー : 銀行テーブルに対する&lt;strong&gt;銀行コード&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;複数「属性」で構成されるプライマリーキー : 銀行支店テーブルに対する&lt;strong&gt;銀行コード+支店コード&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;「テーブル」にはプライマリーキーは必須となりますので、当然「テーブル」内の「項目」は最低でも1つの「属性」を持つことになります。&lt;/p&gt;&#10;&lt;h3 id="プライマリーキーは一意な値でなければならない"&gt;プライマリーキーは一意な値でなければならない&lt;/h3&gt;&#10;&lt;p&gt;DynamoDBのプライマリーキー属性値は重複を許しません。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;銀行テーブルには&lt;strong&gt;銀行コード&lt;/strong&gt;の重複はありえません&lt;/li&gt;&#10;&lt;li&gt;銀行支店テーブルには&lt;strong&gt;銀行コード+支店コード&lt;/strong&gt;の重複はありえません&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1yOafa096UFAn9s0lO_lYkjnGgzSd7qry" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="プライマリーキーはスカラー値でなければならない"&gt;プライマリーキーはスカラー値でなければならない&lt;/h3&gt;&#10;&lt;p&gt;プライマリーキーはスカラー値でなければいけません。&#10;以下のいずれかでなければなりません。&lt;/p&gt;</description></item><item><title>AWS-CLIを使ってDynamoDBを操作してみる</title><link>https://genzouw.com/entry/2019/04/27/001837/1406/</link><pubDate>Sat, 27 Apr 2019 00:18:37 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/27/001837/1406/</guid><description>&lt;p&gt;LambdaからDynamoDBを操作する必要があったのだけれども、&#10;DynamoDBにあまり触れる機会もなく今まで来ました。&lt;/p&gt;&#10;&lt;p&gt;コマンドラインからテーブルの作成やデータ投入を行ってみることにしました。&lt;/p&gt;&#10;&lt;p&gt;操作するためのツールとして &lt;a href="https://aws.amazon.com/jp/cli/"&gt;AWS CLI&lt;/a&gt; を使ってみます。&lt;/p&gt;&#10;&lt;p&gt;ちなみに、DynamoDBの構成要素や概念を整理した内容は以下のエントリにまとめました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/04/27/231011"&gt;Amazon DynamoDBの構成要素について理解できたことをまとめました | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.140 Python/3.7.3 Darwin/18.5.0 botocore/1.12.130&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="dynamodbの概念コンセプトを整理してみる"&gt;DynamoDBの概念・コンセプトを整理してみる&lt;/h2&gt;&#10;&lt;h3 id="amazon-dynamodbの構成要素コンセプト"&gt;Amazon DynamoDBの構成要素・コンセプト&lt;/h3&gt;&#10;&lt;p&gt;「Amazon DynamoDB」を構成する要素については、別のエントリで整理しておきました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/04/27/231011"&gt;Amazon DynamoDBの構成要素について理解できたことをまとめました | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;上記エントリでまとめましたが、抑えておく用語は以下の４つです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;テーブル&lt;/li&gt;&#10;&lt;li&gt;項目&lt;/li&gt;&#10;&lt;li&gt;属性&lt;/li&gt;&#10;&lt;li&gt;プライマリーキー&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="コンセプト"&gt;コンセプト&lt;/h3&gt;&#10;&lt;p&gt;DynamoDBではデータを抽出する方法は大きく２つとなります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;プライマリーキー&lt;/strong&gt; で検索し項目を受け取る&lt;/li&gt;&#10;&lt;li&gt;全項目を受け取りプログラムで絞り込む&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;データ量が増えた場合は &lt;strong&gt;(2)&lt;/strong&gt; の方法は現実的ではなくなるため、 &lt;strong&gt;(1)&lt;/strong&gt; でデータを取得できるように設計する必要があります。&lt;/p&gt;&#10;&lt;h2 id="検証用のテーブル定義"&gt;検証用のテーブル定義&lt;/h2&gt;&#10;&lt;p&gt;上記の概念やコンセプトを理解した上で、今回検証用に作成したいテーブルの定義を整理しておきます。&lt;/p&gt;&#10;&lt;h3 id="検証用のtable名"&gt;検証用のtable名&lt;/h3&gt;&#10;&lt;p&gt;ユーザ情報を管理する &lt;code&gt;users&lt;/code&gt; というtableを作成します。&lt;/p&gt;&#10;&lt;h3 id="検証用の属性名"&gt;検証用の属性名&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;users&lt;/code&gt; テーブルは以下のような属性（RDSでいうところの列情報）を保持します。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Name&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Type&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;プライマリーキー?&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;email&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;String&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Y&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;first_name&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;String&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;last_name&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;String&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;age&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Number&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;「属性」には型を設定する必要があります。&#10;連想配列や配列などを指定できますが、最もよく利用するのは「文字列」と「数値」となるでしょう。&lt;/p&gt;</description></item><item><title>sortコマンドでCSVファイルをソートする場合はソート列の指定方法に注意</title><link>https://genzouw.com/entry/2019/04/24/083709/1399/</link><pubDate>Wed, 24 Apr 2019 08:37:09 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/24/083709/1399/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sort&lt;/code&gt;コマンドを使ってソートを行うとき、「CSVファイル」や「TSVファイル」を対象とすることがあります。&lt;/p&gt;&#10;&lt;p&gt;ただし、意外と知られていないのがソートの条件として任意の列を指定する方法について。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;-k&lt;/code&gt;オプションを使えば可能なのですがひと癖あるオプションなので取り上げました。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;sort&lt;/code&gt;コマンドの挙動でハマった方の手助けになれば幸いです。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.7&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sort --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sort &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.31&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/03/01/203455"&gt;CSVをJSONに変換するためのNode.jsライブラリ「csv2json」 | ゲンゾウ用ポストイット&lt;/a&gt; でも使ったダミーデータ生成サービスを利用してCSVデータを取得します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;test.csv&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ヘッダー行は次のようになっています。（今回はさほど重要ではありません）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 連番,氏名,氏名（カタカナ）,性別,年齢,取得ポイント&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat test.csv&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1,小出里歩,オデリホ,女,27,85&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2,吉野里紗,ヨシノリサ,女,38,894&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3,本郷末治,ホンゴウスエジ,男,56,252&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4,谷村千代乃,タニムラチヨノ,女,44,556&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5,内野響子,ウチノキョウコ,女,44,170&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6,塩谷貢,シオタニミツグ,男,34,494&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7,児島愛子,コジマアイコ,女,39,675&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8,白木俊史,シラキトシフミ,男,57,245&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;9,飯塚遥佳,イイヅカハルカ,女,20,974&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;10,阿久津清蔵,アクツセイゾウ,男,9,120&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;整形すると以下のようなデータとなります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat test.csv &lt;span class="p"&gt;|&lt;/span&gt; column -t -s,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt; 小出里歩 オデリホ 女 &lt;span class="m"&gt;27&lt;/span&gt; &lt;span class="m"&gt;85&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt; 吉野里紗 ヨシノリサ 女 &lt;span class="m"&gt;38&lt;/span&gt; &lt;span class="m"&gt;894&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt; 本郷末治 ホンゴウスエジ 男 &lt;span class="m"&gt;56&lt;/span&gt; &lt;span class="m"&gt;252&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt; 谷村千代乃 タニムラチヨノ 女 &lt;span class="m"&gt;44&lt;/span&gt; &lt;span class="m"&gt;556&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt; 内野響子 ウチノキョウコ 女 &lt;span class="m"&gt;44&lt;/span&gt; &lt;span class="m"&gt;170&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6&lt;/span&gt; 塩谷貢 シオタニミツグ 男 &lt;span class="m"&gt;34&lt;/span&gt; &lt;span class="m"&gt;494&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt; 児島愛子 コジマアイコ 女 &lt;span class="m"&gt;39&lt;/span&gt; &lt;span class="m"&gt;675&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt; 白木俊史 シラキトシフミ 男 &lt;span class="m"&gt;57&lt;/span&gt; &lt;span class="m"&gt;245&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt; 飯塚遥佳 イイヅカハルカ 女 &lt;span class="m"&gt;20&lt;/span&gt; &lt;span class="m"&gt;974&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt; 阿久津清蔵 アクツセイゾウ 男 &lt;span class="m"&gt;9&lt;/span&gt; &lt;span class="m"&gt;120&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="csvやtsvのソートに使われるオプションは２つ"&gt;CSVやTSVのソートに使われるオプションは２つ&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sort&lt;/code&gt;コマンドでCSVデータを取り扱う際には、「列の区切り文字」と「ソートに利用する列」を指定する必要があります。&lt;/p&gt;</description></item><item><title>sortコマンドで複数のソート済みファイルを連結して１つのソート済みファイルを高速に作成する</title><link>https://genzouw.com/entry/2019/04/22/175208/1393/</link><pubDate>Mon, 22 Apr 2019 17:52:08 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/22/175208/1393/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;巨大なソート済みファイルを連結して１つのソート済みファイルにしたかったが、巨大すぎて処理に時間がかかって困ってしまいました。&lt;/p&gt;&#10;&lt;p&gt;連結元のファイルはソート済みなので、うまいことマージすれば高速に処理できそうな気もします。&lt;/p&gt;&#10;&lt;p&gt;うまい方法が無いか調べてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.3&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sort --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sort &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.31&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="検証準備"&gt;検証準備&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;1〜1000000&lt;/em&gt; までの数値が格納されている2つのファイル &lt;code&gt;a.txt&lt;/code&gt; 、 &lt;code&gt;b.txt&lt;/code&gt; を用意します。&lt;/p&gt;&#10;&lt;p&gt;これを連結し、全体としてソートされているファイルを作成したいと思います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;1000000&lt;/span&gt; &amp;gt; a.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;1000000&lt;/span&gt; &amp;gt; b.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wc -l a.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1000000&lt;/span&gt; a.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wc -l b.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1000000&lt;/span&gt; b.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sortコマンドで普通にソート"&gt;&lt;code&gt;sort&lt;/code&gt;コマンドで普通にソート&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sort&lt;/code&gt;コマンドに複数のファイル名を渡すことで、連結し全体としてソートすることができます。&#10;&lt;code&gt;time&lt;/code&gt;コマンドと一緒に実行し実行速度や負荷を計測してみます。&lt;/p&gt;&#10;&lt;p&gt;3回計測します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;time&lt;/span&gt; sort -n a.txt b.txt &amp;gt; c&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sort -n a.txt b.txt &amp;gt; c 1.31s user 0.25s system 269% cpu 0.579 total&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;time&lt;/span&gt; sort -n a.txt b.txt &amp;gt; c&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sort -n a.txt b.txt &amp;gt; c 1.27s user 0.23s system 278% cpu 0.540 total&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;time&lt;/span&gt; sort -n a.txt b.txt &amp;gt; c&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sort -n a.txt b.txt &amp;gt; c 1.26s user 0.22s system 287% cpu 0.512 total&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: right"&gt;ユーザーCPU時間&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: right"&gt;システムCPU時間&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: right"&gt;CPU使用率&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: right"&gt;処理時間(経過時間)&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;1.31s user&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;0.25s system&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;269% cpu&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;0.579 total&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;1.27s user&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;0.23s system&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;278% cpu&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;0.540 total&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;1.26s user&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;0.22s system&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;287% cpu&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: right"&gt;0.512 total&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;CPUが複数格納されているPCですので、並列処理してくれたみたいですね。&#10;頑張ってくれました。&lt;/p&gt;</description></item><item><title>「Amazon Cognito」を使ってログイン機能を作成する（SNS認証あり）</title><link>https://genzouw.com/entry/2019/04/21/085627/1386/</link><pubDate>Sun, 21 Apr 2019 08:56:27 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/21/085627/1386/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;ログイン認証機能を実装するための方法をいくつか調査中。&lt;/p&gt;&#10;&lt;p&gt;候補として上がっているのは大きく２つ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&amp;ldquo;Amazon Cognito&amp;rdquo;&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;&amp;ldquo;Firebase&amp;rdquo;&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;まずは &lt;strong&gt;Cognito&lt;/strong&gt; の調査からすることにしました。&lt;/p&gt;&#10;&lt;p&gt;マニュアルを読みながら設定を進めて見ましたが、文章が多く初見殺しのイメージがあったので、設定時のスクリーンショットを残しておきました。&#10;そちらを共有したいと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Cognito&lt;/strong&gt; の設定で躓いた方の参考になれば幸いです。&lt;/p&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;僕はさっと AWS のマニュアルを読みました。&#10;実際に行った作業も以下のマニュアルを元に進めました。&lt;/p&gt;&#10;&lt;p&gt;( 書かれている内容通りに進められる方は当エントリを参考にする必要はないかと思います。 )&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-getting-started.html"&gt;Amazon Cognito の使用開始 - Amazon Cognito&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="cognito-アーキテクチャ"&gt;Cognito アーキテクチャ&lt;/h3&gt;&#10;&lt;p&gt;概念として認証・認可情報を管理する &lt;strong&gt;&amp;ldquo;ユーザープール&amp;rdquo;&lt;/strong&gt; と &lt;strong&gt;&amp;ldquo;ID プール&amp;rdquo;&lt;/strong&gt; というものを理解する必要があります。&lt;/p&gt;&#10;&lt;p&gt;いずれの概念もまだ掴みきれていないのですが、 マニュアルを読みつつ、触りつつ理解していこうと思います。&#10;今回触るのは &lt;strong&gt;&amp;ldquo;ユーザープール&amp;rdquo;&lt;/strong&gt; のみになります。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/images/scenario-cup-cib2.png" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="設定方法"&gt;設定方法&lt;/h2&gt;&#10;&lt;p&gt;早速設定を進めていきましょう。&lt;/p&gt;&#10;&lt;p&gt;先にも述べたとおり、 &lt;strong&gt;AWS&lt;/strong&gt; が提供してくれているマニュアル通りに進めていきます。&lt;/p&gt;&#10;&lt;h3 id="ステップ-1ユーザープールを使用してユーザーディレクトリを作成する"&gt;ステップ 1.ユーザープールを使用してユーザーディレクトリを作成する&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/cognito-user-pool-as-user-directory.html"&gt;ステップ 1.ユーザープールを使用してユーザーディレクトリを作成する - Amazon Cognito&lt;/a&gt; を参考に作業を進めます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="amazon-cognito-コンソール-を開きます"&gt;&lt;a href="https://console.aws.amazon.com/cognito/home"&gt;Amazon Cognito コンソール&lt;/a&gt; を開きます。&lt;/h4&gt;&#10;&lt;p&gt;[ユーザープールの管理] を選択します。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1yRJq1smof-dvIq_h383e68xRNEQe4HeF" alt=""&gt;&lt;/p&gt;&#10;&lt;h4 id="ページの右上にある-ユーザープールを作成する-を選択します"&gt;ページの右上にある [ユーザープールを作成する] を選択します。&lt;/h4&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1ijIP2QKpgqAw6SRtK1P2pkcFJ9Xdg6pc" alt=""&gt;&lt;/p&gt;&#10;&lt;h4 id="ユーザープールの名前を入力しデフォルトを確認する-を選択して名前を保存します"&gt;ユーザープールの名前を入力し、[デフォルトを確認する] を選択して、名前を保存します。&lt;/h4&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=11nz2WuEjZQ5d3QMD7WpohLNXzKiYi6Df" alt=""&gt;&lt;/p&gt;&#10;&lt;h4 id="属性-ページでe-メールアドレスおよび電話番号-および-e-メールアドレスを許可-を選択します"&gt;[属性] ページで、[E メールアドレスおよび電話番号] および [E メールアドレスを許可] を選択します。&lt;/h4&gt;&#10;&lt;p&gt;設定ができたら、ページの下部にある [次のステップ] を選択して属性を保存します。&lt;/p&gt;</description></item><item><title>Dockerfileで複数行を改行付きでechoする際にハマったので共有しておきます</title><link>https://genzouw.com/entry/2019/04/17/080500/1383/</link><pubDate>Wed, 17 Apr 2019 08:05:00 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/17/080500/1383/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;最近Dockerfileを作成したときに、 &lt;code&gt;RUN&lt;/code&gt; コマンド内で改行付き情報を &lt;code&gt;echo&lt;/code&gt; したかったのですが、多少ハマってしまったので共有します。&lt;/p&gt;&#10;&lt;h2 id="2019-07-17-追記コメント欄より"&gt;「2019-07-17 追記」コメント欄より&lt;/h2&gt;&#10;&lt;p&gt;コメントを下さった &lt;strong&gt;Nig&lt;/strong&gt; さん、ありがとうございます。勉強になりました。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;以下のような構文を利用する際に、シングルクォーテーション( &lt;code&gt;'&lt;/code&gt; )で記述しないといけない部分がダブルクォーテーション( &lt;code&gt;&amp;quot;&lt;/code&gt; )になっていたことが原因とのことでした。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;*&lt;em&gt;※debian系のLinuxOSを利用している場合、シングルクォーテーションの前の &lt;code&gt;$&lt;/code&gt; を削除しないといけないようです。不要な &lt;code&gt;$&lt;/code&gt; が出力されてしまいました。&lt;/em&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM centos:centos7&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RUN &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;$&amp;#39;\n\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;alias ll=&amp;#34;ls -l&amp;#34;\n\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;alias la=&amp;#34;ls -a&amp;#34;\n\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;alias lla=&amp;#34;ls -l -a&amp;#34;\n\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; /root/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;※上記のスタイル以外で記述したい方は、当エントリを読み進めいただく意義はあるかと思います。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 18.09.2, build &lt;span class="m"&gt;6247962&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="経緯失敗例"&gt;経緯（失敗例）&lt;/h2&gt;&#10;&lt;p&gt;Dockerイメージ作成のために「Dockerfile」を作成しました。&lt;/p&gt;&#10;&lt;p&gt;その際に、&lt;code&gt;.bashrc&lt;/code&gt;ファイルに&lt;code&gt;alias&lt;/code&gt;を追加したかったので、 &lt;strong&gt;ネット上に転がっている情報を参考に&lt;/strong&gt; 以下のように記述しました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;FROM centos:centos7&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;RUN &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;$&amp;#34;\n\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;alias ll=&amp;#39;ls -l&amp;#39;\n\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;alias la=&amp;#39;ls -a&amp;#39;\n\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;alias lla=&amp;#39;ls -l -a&amp;#39;\n\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; /root/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;echo&lt;/code&gt; コマンドの引数として渡す情報の各行末に &lt;code&gt;\n\&lt;/code&gt; と記述することで、以下の命令と同等の出力が行われるとのことでした。&lt;/p&gt;</description></item><item><title>PostgreSQLサーバの全データベース名を取得し配列に格納するシェルスクリプト</title><link>https://genzouw.com/entry/2019/04/15/081351/1376/</link><pubDate>Mon, 15 Apr 2019 08:13:51 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/15/081351/1376/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;QiitaでPostgreSQLのデータベースの名称をシェルスクリプトのリスト変数にセットする方法という記事を見つけたので、僕もやってみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://qiita.com/m-dove/items/01f2012f4573f31f00ef"&gt;データベースの名前を配列として取得するシェルスクリプト&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.3&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;h3 id="db_listsh"&gt;&lt;code&gt;db_list.sh&lt;/code&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;DB_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;DB_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;DB_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -a &lt;span class="nv"&gt;DB_NAME_LIST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;PGPASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB_PASS&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; psql &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --tuples-only &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --no-align &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --username &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DB_USER&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -h &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DB_HOST&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -c &lt;span class="s1"&gt;&amp;#39;SELECT datname FROM pg_database&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 動作確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; DB_NAME in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DB_NAME_LIST&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$DB_NAME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="解説"&gt;解説&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;psql -l&lt;/code&gt; を使えば、DBの一覧は取得できるんですが、一部扱いにくい出力箇所があります。&#10;（ &lt;code&gt;template0&lt;/code&gt; / &lt;code&gt;template1&lt;/code&gt; / &lt;code&gt;postgres&lt;/code&gt; の３つの組み込みDB）&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;例&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxxxxxx &lt;span class="p"&gt;|&lt;/span&gt; postgres &lt;span class="p"&gt;|&lt;/span&gt; UTF8 &lt;span class="p"&gt;|&lt;/span&gt; ja_JP.UTF-8 &lt;span class="p"&gt;|&lt;/span&gt; ja_JP.UTF-8 &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;template0 &lt;span class="p"&gt;|&lt;/span&gt; postgres &lt;span class="p"&gt;|&lt;/span&gt; UTF8 &lt;span class="p"&gt;|&lt;/span&gt; ja_JP.UTF-8 &lt;span class="p"&gt;|&lt;/span&gt; ja_JP.UTF-8 &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;c/postgres +&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;CTc/postgres&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;template1 &lt;span class="p"&gt;|&lt;/span&gt; postgres &lt;span class="p"&gt;|&lt;/span&gt; UTF8 &lt;span class="p"&gt;|&lt;/span&gt; ja_JP.UTF-8 &lt;span class="p"&gt;|&lt;/span&gt; ja_JP.UTF-8 &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;c/postgres +&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;postgres&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;CTc/postgres&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yyyyyyy &lt;span class="p"&gt;|&lt;/span&gt; postgres &lt;span class="p"&gt;|&lt;/span&gt; UTF8 &lt;span class="p"&gt;|&lt;/span&gt; ja_JP.UTF-8 &lt;span class="p"&gt;|&lt;/span&gt; ja_JP.UTF-8 &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zzzzzzz &lt;span class="p"&gt;|&lt;/span&gt; postgres &lt;span class="p"&gt;|&lt;/span&gt; UTF8 &lt;span class="p"&gt;|&lt;/span&gt; ja_JP.UTF-8 &lt;span class="p"&gt;|&lt;/span&gt; ja_JP.UTF-8 &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これに対応するためにカテゴリテーブルを直接見に行っています。&lt;/p&gt;</description></item><item><title>シェルスクリプトでスクレイピングするために`pup`を使う</title><link>https://genzouw.com/entry/2019/04/14/123201/1366/</link><pubDate>Sun, 14 Apr 2019 12:32:01 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/14/123201/1366/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;以前、シェルスクリプトからhtmlのスクレイピングをしたときの方法を共有します。&lt;/p&gt;&#10;&lt;p&gt;Go言語で作られた&lt;a href="https://github.com/ericchiang/pup"&gt;pup&lt;/a&gt;というツールを使いました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="pup-とは"&gt;pup とは&lt;/h2&gt;&#10;&lt;p&gt;コマンドラインの HTML 解析ツールです。&lt;/p&gt;&#10;&lt;p&gt;標準入力から情報を読み込み、標準出力に結果を出力します。&lt;/p&gt;&#10;&lt;p&gt;それだけだと &lt;code&gt;cat&lt;/code&gt; と同じなのですが、 HTML の要素をフィルタリングすることができます。フィルタリングのための HTML 要素指定方法として、一般的に利用されている &lt;a href="https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Selectors"&gt;CSS Selectors&lt;/a&gt; が利用できます。&lt;/p&gt;&#10;&lt;h2 id="pup-ツール開発の背景"&gt;pup ツール開発の背景&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://stedolan.github.io/jq/"&gt;jq&lt;/a&gt; コマンドにインスパイアされたようです。&lt;/p&gt;&#10;&lt;p&gt;jq といえばコマンドライン上で JSON データを操作するためのツールですが、HTML データをターゲットとしたものとして開発されたようです。&lt;/p&gt;&#10;&lt;h2 id="pup-インストール"&gt;pup インストール&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;a href="https://genzouw.com/entry/2019/09/02/085401/1714/"&gt;別のエントリで、環境を汚さずにDockerを使ってpubを使うための方法を投稿しています。&lt;/a&gt; Dockerが使い慣れている方はこちらもどうぞ。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;以下のツールを利用します。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/ericchiang/pup"&gt;GitHub - ericchiang/pup: Parsing HTML at the command line&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;go get&lt;/code&gt; コマンドを使ってインストールするため、事前に &lt;code&gt;go&lt;/code&gt; のインストールが必要です。&lt;/p&gt;&#10;&lt;h3 id="goのインストール"&gt;Goのインストール&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 何はともあれパッケージをアップデート&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum update -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# epelリポジトリを追加して、Goをインストールできるようにする&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum install epel-release -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum install golang -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のコマンドが正しく実行できていればGoのインストールは完了です。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでファイルや標準入力の先頭N行、末尾N行を除去する方法</title><link>https://genzouw.com/entry/2019/04/11/075523/1334/</link><pubDate>Thu, 11 Apr 2019 07:55:23 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/11/075523/1334/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトで標準入力で受け取った情報の先頭N行、末尾N行を削る方法について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.3&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;head &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.22&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tail --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tail &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.22&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="標準入力として渡すデータ"&gt;標準入力として渡すデータ&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;seq&lt;/code&gt; コマンドを使って、 &lt;strong&gt;1〜10&lt;/strong&gt; の数値を渡して、先頭の &lt;strong&gt;2行&lt;/strong&gt; と 末尾の &lt;strong&gt;2行&lt;/strong&gt; を削ってみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt; &amp;lt;&amp;lt; ※ここを削除&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt; &amp;lt;&amp;lt; ※ここを削除&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;9&lt;/span&gt; &amp;lt;&amp;lt; ※ここを削除&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;10&lt;/span&gt; &amp;lt;&amp;lt; ※ここを削除&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="head--tail-を使う"&gt;&lt;code&gt;head&lt;/code&gt; , &lt;code&gt;tail&lt;/code&gt; を使う&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;head&lt;/code&gt; はファイルや標準入力の先頭から何行を出力（デフォルトでは10行）というように使うケースが多いですが、 &lt;strong&gt;「ファイル末尾から数えて何行目より前をすべて出力」&lt;/strong&gt; という場合にも利用できます。&lt;code&gt;-n -&lt;/code&gt; という変わったオプションを利用します。&lt;/p&gt;</description></item><item><title>sedを使ってキャメルケース、スネークケースの相互変換を行う</title><link>https://genzouw.com/entry/2019/04/10/080016/1330/</link><pubDate>Wed, 10 Apr 2019 08:00:16 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/10/080016/1330/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;プロジェクトのソースコードの中のスネークケース文字列をキャメルケース文字列に変換する必要があったので &lt;code&gt;sed&lt;/code&gt; で変換できるか試してみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed &lt;span class="o"&gt;(&lt;/span&gt;GNU sed&lt;span class="o"&gt;)&lt;/span&gt; 4.2.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="スネークケース-から-キャメルケース-への変換"&gt;スネークケース から キャメルケース への変換&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;ロジック解説&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;全て小文字に変換&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;_?&lt;/code&gt; （アンダースコアと何かの文字）の組合せを探し置換&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;_&lt;/code&gt; （アンダースコア）は除去&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;_&lt;/code&gt; に続く文字を大文字に変換&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 4つのテストケースを実行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF | sed -r &amp;#39;s/.*/\L\0/g; s/_([a-z0-9])/\U\1/g;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;xxx_yyy_zzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;XXX_YYY_ZZZ&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;xYz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;XYz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxxYyyZzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxxYyyZzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xyz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xyz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="キャメルケース-から-スネークケース-への変換"&gt;キャメルケース から スネークケース への変換&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;ロジック解説&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;先頭1文字を小文字に変換&lt;/li&gt;&#10;&lt;li&gt;大文字を探し置換&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;_&lt;/code&gt; （アンダースコア）を前に付与&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;全て小文字(あるいは大文字)に変換&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="変換小文字のみ"&gt;変換（小文字のみ）&lt;/h3&gt;&#10;&lt;p&gt;小文字のスネークケースに変換&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3つのテストケースを実行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF | sed -r &amp;#39;s/^./\L\0/; s/([A-Z])/_\1/g; s/.*/\L\0/g;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;xxxYyyZzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;XxxYyyZzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;XyZ&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxx_yyy_zzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxx_yyy_zzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xy_z&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="変換大文字のみ"&gt;変換（大文字のみ）&lt;/h3&gt;&#10;&lt;p&gt;大文字のスネークケースに変換&lt;/p&gt;</description></item><item><title>"pstree"を使ってあるプロセスの子プロセス・孫プロセスを確認する</title><link>https://genzouw.com/entry/2019/04/09/091427/1327/</link><pubDate>Tue, 09 Apr 2019 09:14:27 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/09/091427/1327/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;子プロセスをバックグラウンド起動して並列処理行うシェルスクリプトを作成したが以下の点を確認したいと思いました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;子プロセスが正しく立ち上がっているのか？&lt;/li&gt;&#10;&lt;li&gt;子プロセスが過剰に立ち上がっていないか？&lt;/li&gt;&#10;&lt;li&gt;子プロセスはどのぐらいの期間生存しているのか？&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;確認する方法を以下にまとめます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;今回も検証環境として &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt; を使いました。&#10;&lt;em&gt;もちろんDockerを使う必要はないのですが、クリーンな環境が欲しかったので利用しました。&lt;/em&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm -v &lt;span class="nv"&gt;$PWD&lt;/span&gt;:/mnt -it genzouw/centos-sandbox bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux 0869a1789807 4.9.125-linuxkit &lt;span class="c1"&gt;#1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="pstreeコマンド"&gt;pstreeコマンド&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;pstree&lt;/code&gt;は、現在動作しているプロセスをツリー形式で表示するコマンドです。&lt;/p&gt;&#10;&lt;p&gt;コマンド名のとおり、「どのプロセスからどのプロセスが起動しているのか」という &lt;strong&gt;ツリー構造&lt;/strong&gt; が分かりやすく表示されるので、プロセスの実行状況を確認するのに便利です。&lt;/p&gt;&#10;&lt;h2 id="pstreeコマンドのインストール"&gt;&lt;code&gt;pstree&lt;/code&gt;コマンドのインストール&lt;/h2&gt;&#10;&lt;p&gt;早速実行してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pstree&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash: pstree: &lt;span class="nb"&gt;command&lt;/span&gt; not found&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いきなりですが、「コマンドが見つからない」というエラーが発生しました。&#10;普通にCD/DVDからインストールしたLinuxディストリビューションにはインストール済みかと思いますが、 &lt;strong&gt;Docker&lt;/strong&gt; 環境は軽量化のために必要最低限のコマンドしかインストールされていないことが多いです。&lt;/p&gt;&#10;&lt;p&gt;インストールする場合は以下のコマンドを実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yum install -y psmisc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="出力される内容を見てみる"&gt;出力される内容を見てみる&lt;/h2&gt;&#10;&lt;p&gt;早速実行してみます。&#10;いくつかの環境で試してみます。&lt;/p&gt;</description></item><item><title>Let's Encrypt でワイルドカード証明書を発行してすべてのサブドメインにhttpsを適用</title><link>https://genzouw.com/entry/2019/04/06/165110/1315/</link><pubDate>Sat, 06 Apr 2019 16:51:10 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/06/165110/1315/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;僕のブログやその他検証プログラムを配置しているラボページなどはいずれも「Let&amp;rsquo;s Encrypt」を使ってSSLを実現しています。&lt;/p&gt;&#10;&lt;p&gt;「Let&amp;rsquo;s Encrypt」のワイルドカード証明書の更新を行っていて、再度新たに設定し直したのですがやり方を忘れないように「ポストイット」にして貼り付けておきます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ apachectl -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Server version: Apache/2.4.6 &lt;span class="o"&gt;(&lt;/span&gt;CentOS&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="事前作業"&gt;事前作業&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;ドメイン&lt;/strong&gt; が必須なので、事前に取得しておきましょう。&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;※今回のブログ用に &lt;code&gt;spinosaurus.work&lt;/code&gt; というドメインを取得し手順を整理しました。&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;DNSレコードとして、ワイルドカードのAレコードを作成しておくとこのあとの確認がしやすいです。&#10;&lt;ul&gt;&#10;&lt;li&gt;例えば &lt;code&gt;*.spinosaurus.work&lt;/code&gt; のようなレコード&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="作業手順"&gt;作業手順&lt;/h2&gt;&#10;&lt;p&gt;「Let&amp;rsquo;s Encryt」用のワイルドカード証明書を作成し、認証局・Webサーバに設定するために &lt;a href="https://certbot.eff.org/"&gt;Certbot&lt;/a&gt; というツールを利用します。&lt;/p&gt;&#10;&lt;p&gt;インストールしたあとは &lt;a href="https://certbot.eff.org/"&gt;Certbot&lt;/a&gt; を使えばあっという間にSSLによる通信ができ当たります。&lt;/p&gt;&#10;&lt;h3 id="certbotのインストール"&gt;「Certbot」のインストール&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;yum&lt;/code&gt; でインストールができるのですが、最新バージョンでない場合に正常に動作しないことがあってハマりした。&#10;はまらないように最新バージョンを使うことをおすすめします。&#10;( &lt;code&gt;yum&lt;/code&gt; でインストールしたものでも問題が起きないときのほうが多いのですが、ときどきできなかったりするので。。。)&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# まずはルートになります&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo -i&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 古いものがあると正常に動作しない場合があるため、念の為削除コマンドを実行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yum remove -y certbot python2-certbot-apache&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 以下のディレクトリに&amp;#34;Certbot&amp;#34;を配置しておきます&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /usr/local/src&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone https://github.com/certbot/certbot.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 多くの場合は &amp;#34;/usr/local/bin&amp;#34; にパスが通っているので、シンボリックリンクを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ln -s /usr/local/src/certbot/certbot-auto /usr/local/bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# バージョンを確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ /usr/local/bin/certbot-auto --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;certbot 0.33.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正しくインストールされました。&lt;/p&gt;</description></item><item><title>iタウンページの企業情報を収集（スクレイピング）するPHPスクリプト</title><link>https://genzouw.com/entry/2019/04/03/220254/1309/</link><pubDate>Wed, 03 Apr 2019 22:02:54 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/03/220254/1309/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;随分前に頼まれて作成した &lt;a href="https://itp.ne.jp/?rf=1"&gt;iダウンページ&lt;/a&gt; の一覧情報をかき集めてくるスクリプトです。&#10;&lt;a href="https://github.com/guzzle/guzzle"&gt;Guzzle&lt;/a&gt; の使い方の勉強も兼ねて作ったものです。&lt;/p&gt;&#10;&lt;p&gt;せっかく作って眠らせておいたので公開します。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;※ソースコードは決してきれいではないです。一枚物のPHPです。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="email_picker_from_townpage"&gt;「email_picker_from_townpage」&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;説明文が長いですね。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;アプリ名に &lt;em&gt;&amp;ldquo;email&amp;rdquo;&lt;/em&gt; とありますが、メールアドレス以外も収集します。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/genzouw/email_picker_from_townpage"&gt;&lt;img src="https://gh-card.dev/repos/genzouw/email_picker_from_townpage.svg?fullname" alt="genzouw/email_picker_from_townpage - GitHub"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="機能"&gt;機能&lt;/h2&gt;&#10;&lt;p&gt;収集してくれる情報は以下のとおりです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;会社名&lt;/li&gt;&#10;&lt;li&gt;メールアドレス&lt;/li&gt;&#10;&lt;li&gt;電話番号&lt;/li&gt;&#10;&lt;li&gt;住所&lt;/li&gt;&#10;&lt;li&gt;都道府県ID&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="インストール方法"&gt;インストール方法&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone git@github.com:genzouw/email_picker_from_townpage.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; email_picker_from_townpage&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ composer install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;p&gt;のいずれか好きなものをどうぞ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ php ./index.php &lt;span class="p"&gt;|&lt;/span&gt; tee addresses.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ php ./index.php &amp;gt; addresses.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./index.php &lt;span class="p"&gt;|&lt;/span&gt; tee addresses.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./index.php &amp;gt; addresses.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一応、&lt;strong&gt;2秒おきにアクセス&lt;/strong&gt; するようにして負荷がかかりにくくはしていますが、以前図書館サイトに負荷をかけて捕まった方の事例もありますのでご注意を。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;最近Bashでもスクレイピングしました。&#10;DOM要素をパースするツールがあったので、ソッチのほうが便利でした。また紹介します。&lt;/p&gt;</description></item><item><title>Vimの&amp;lt;C-a&amp;gt;で各行の数値に行番号を加算する方法（Markdownの数字付きリスト作成にぴったり）</title><link>https://genzouw.com/entry/2019/04/02/081448/1297/</link><pubDate>Tue, 02 Apr 2019 08:14:48 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/02/081448/1297/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Vim には、数字の上で &lt;code&gt;CTRL-a&lt;/code&gt; ( &lt;code&gt;&amp;lt;C-a&amp;gt;&lt;/code&gt; ) や &lt;code&gt;CTRL-x&lt;/code&gt; ( &lt;code&gt;&amp;lt;C-x&amp;gt;&lt;/code&gt; ) を押すとインクリメント/デクリメントする機能があります。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1FrCyHUA6tIsvSYDzGeNy87JwSYe4T5w7" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;前回、 &lt;a href="https://genzouw.com/entry/2019/04/01/221119"&gt;シェルスクリプトでファイルや標準出力の行頭に連番を付与する「nl」コマンド&lt;/a&gt; で取り上げたようなMarkdownの「数字付きリスト」をVimの &lt;code&gt;&amp;lt;C-a&amp;gt;&lt;/code&gt; 機能を使って生成する方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vim --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VIM - Vi IMproved 8.1 &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2018&lt;/span&gt; May 18, compiled Mar &lt;span class="m"&gt;26&lt;/span&gt; &lt;span class="m"&gt;2019&lt;/span&gt; 01:54:18&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="やり方"&gt;やり方&lt;/h2&gt;&#10;&lt;p&gt;以下のような内容がVimエディタ上に記述されているとします。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# リスト&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0. aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0. bbb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0. ccc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0. ddd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;0. eee&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで、Visualモードになり、エディタの内容を選択します。（リスト部分でも全体でもどちらでも構いません。）&lt;/p&gt;&#10;&lt;p&gt;選択後、 &lt;code&gt;g&amp;lt;C-a&amp;gt;&lt;/code&gt; と入力すると、以下のように表示されるはずです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# リスト&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. aaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. bbb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. ccc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. ddd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. eee&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1pChPvqVTwaqY5kxZQCDAUu7sIi3p9gBC" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;地味ですが、「数字付きリスト」形式はMarkdownでよく使う記法なので覚えておくと便利です。&lt;/p&gt;</description></item><item><title>シェルスクリプトでファイルや標準出力の行頭に連番を付与する「nl」コマンド</title><link>https://genzouw.com/entry/2019/04/01/221119/1295/</link><pubDate>Mon, 01 Apr 2019 22:11:19 +0900</pubDate><guid>https://genzouw.com/entry/2019/04/01/221119/1295/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Markdownでドキュメントを記述していると「箇条書きリスト」や「数字付きリスト」記法や度々使用します。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;例）「箇条書きリスト」記法&lt;/em&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;*&lt;/span&gt; あ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;*&lt;/span&gt; い&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;*&lt;/span&gt; う&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;*&lt;/span&gt; え&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;*&lt;/span&gt; お&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;例）「数字付きリスト」記法&lt;/em&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; あ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; い&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; う&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;4.&lt;/span&gt; え&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;5.&lt;/span&gt; お&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;さて、この「数字付きリスト」記法と同様のものをシェルで簡単に生成できないか？というのが今回のお話です。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;nl&lt;/code&gt; コマンドを利用します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nl --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;nl &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.22&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="nl-コマンドの使い方"&gt;&lt;code&gt;nl&lt;/code&gt; コマンドの使い方&lt;/h2&gt;&#10;&lt;p&gt;テストデータを出力させます。&#10;&lt;code&gt;yes&lt;/code&gt; コマンドを使って &lt;code&gt;xxx&lt;/code&gt; という文字を5行出力させます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yes xxx &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これにMarkdownの「数字付きリスト」のような連番を付与するには以下のようなコマンドを実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yes xxx &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; nl -w &lt;span class="m"&gt;1&lt;/span&gt; -s &lt;span class="s1"&gt;&amp;#39;. &amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1. xxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2. xxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3. xxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4. xxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5. xxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;できましたね。&#10;&lt;code&gt;nl&lt;/code&gt; コマンドについて少々解説していきます。&lt;/p&gt;</description></item><item><title>シェルスクリプトでファイルや標準出力を最終行から逆順に出力する「tac」コマンド</title><link>https://genzouw.com/entry/2019/03/31/223240/1292/</link><pubDate>Sun, 31 Mar 2019 22:32:40 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/31/223240/1292/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://www.codingame.com/multiplayer/clashofcode"&gt;Coding Games&lt;/a&gt; で遊んでいたときに標準入力で受け取った内容を逆に処理しないといけないことがありました。&#10;めったに使うことはないのですが「tac」コマンドを使ったので、取り上げてみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.3&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ tac --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tac &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.31&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;Linux環境であれば、おそらくすでにインストール済みです。&lt;/p&gt;&#10;&lt;p&gt;Mac環境の場合、デフォルトではインストールされていないそうです。&#10;僕の環境にはインストールされていましたが、おそらく以下のコマンドでインストールされたと思われます。&lt;/p&gt;&#10;&lt;p&gt;以下のコマンドで、 &lt;strong&gt;GNU&lt;/strong&gt; のコアコマンドを一式インストールしてくれます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew install coreutils &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --with-default-names&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;p&gt;はじめに触れましたが、ファイルや標準出力を最終行から逆順に出力できます。&lt;/p&gt;&#10;&lt;p&gt;例を上げてみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 実行すると1〜5までの数値が出力される&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# `tac` コマンドを使ってみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tac&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# でも、これだけであれば `sort` コマンドで十分では？&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort -nr&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;seq&lt;/code&gt; の実行結果が逆に出力されました。めでたしめでたし。。。とはならないですね。&#10;この例だと &lt;code&gt;sort -nr&lt;/code&gt; でも十分ではないか？と思われてしまいます。&lt;/p&gt;</description></item><item><title>「direnv」を使ってプロジェクトディレクトリごとに環境変数が自動的に設定されるようにする</title><link>https://genzouw.com/entry/2019/03/29/083754/1272/</link><pubDate>Fri, 29 Mar 2019 08:37:54 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/29/083754/1272/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;AWSの環境構築系のツール（ &lt;a href="https://aws.amazon.com/jp/cli/"&gt;aws-cli&lt;/a&gt; とか &lt;a href="https://www.terraform.io/"&gt;Terraform&lt;/a&gt; ）を使って複数のAWSアカウントを使い分けていると、&#10;「環境変数はどっちのアカウントのものを利用していたっけ？」となることが多くなってきました。&lt;/p&gt;&#10;&lt;p&gt;アプリケーション毎に利用するアカウントが決まっている場合、アプリケーションディレクトリに &lt;code&gt;cd&lt;/code&gt; コマンドで移動したタイミングで環境変数が自動的にセットされるととても便利です。&lt;/p&gt;&#10;&lt;p&gt;ぴったりなツールとして &lt;a href="https://github.com/direnv/direnv"&gt;direnv&lt;/a&gt; というものがありましたので紹介します。&lt;/p&gt;&#10;&lt;h2 id="direnvとは"&gt;direnvとは？&lt;/h2&gt;&#10;&lt;p&gt;ディレクトリ毎に環境変数を定義して、そのディレクトリがカレントになった時だけ環境変数を有効/無効にしてくれるツール。開発中のアプリ毎に環境変数を変えたい時に重宝します。&lt;/p&gt;&#10;&lt;p&gt;リポジトリは以下になります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/direnv/direnv"&gt;https://github.com/direnv/direnv&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;direnvはシェル用の環境切り替えツールです。&lt;/p&gt;&#10;&lt;p&gt;これにより、 &lt;code&gt;~/.bashrc&lt;/code&gt; や &lt;code&gt;~/.profile&lt;/code&gt; ファイルのようなグローバルな設定ファイルにアプリケーション個別の環境設定情報を記載する必要がなくなります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;プロジェクトディレクトリ配下の設定ファイルから環境変数をロードされる。&lt;/li&gt;&#10;&lt;li&gt;プロジェクトディレクトリ内のどのディレクトリにいても、これが適用される。&lt;/li&gt;&#10;&lt;li&gt;プロジェクトディレクトリ内から抜けた場合は環境変数をアンロードされる。&lt;/li&gt;&#10;&lt;li&gt;「bash」、「zsh」、「tcsh」、「fish」、および「elvish」に対応。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;direnvは最近あちこちで導入され始めている &lt;strong&gt;&lt;a href="https://golang.org/"&gt;Go言語&lt;/a&gt;&lt;/strong&gt; で作成されています。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;すでに僕のmacOS上にインストールされていたため、&lt;a href="https://github.com/docker/docker-ce"&gt;Docker&lt;/a&gt;で検証用のクリーンな環境を用意して検証を行いました。&#10;（Dockerがなくても利用には全く問題がありません。）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# CentOS7環境をDockerで立ち上げる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm -it centos:centos7 bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;利用したCentOS7環境は以下の通り。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前提条件"&gt;前提条件&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; Gitが利用できる環境であること&#10;&lt;ul&gt;&#10;&lt;li&gt;インストール時に必要&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="インストール方法"&gt;インストール方法&lt;/h2&gt;&#10;&lt;h3 id="unix系osの場合"&gt;Unix系OSの場合&lt;/h3&gt;&#10;&lt;p&gt;まずは事前に「Go言語」を使えるようにしておきましょう。&#10;( もちろんすでにインストール済みの場合は不要です。 )&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum install epel-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yum install -y golang&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt; がインストールできたら、「direnv」のコードを取得してビルドします。&lt;/p&gt;</description></item><item><title>CentOS7の検証用環境をDockerイメージとして作成し「Docker Hub」へプッシュする</title><link>https://genzouw.com/entry/2019/03/28/150056/1269/</link><pubDate>Thu, 28 Mar 2019 15:00:56 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/28/150056/1269/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;検証環境としてクリーンなCentOS7環境が必要なことが多いですが、とはいえほぼ必要になるツールが決まっていることが多いです。&lt;/p&gt;&#10;&lt;p&gt;アプリケーションのインストール方法として &lt;code&gt;git&lt;/code&gt; が必須ということが多いですし、 データ編集用や確認用に &lt;code&gt;vim&lt;/code&gt; や &lt;code&gt;view&lt;/code&gt; コマンドがあると便利です。&lt;/p&gt;&#10;&lt;p&gt;API呼び出し後のJSONデータ検証のために &lt;code&gt;jq&lt;/code&gt; が必要だったりもしますね。&lt;/p&gt;&#10;&lt;p&gt;そのような頻繁に使われるツールがインストール済みの薄いCentOS7環境が予めあると助かります。&#10;Dockerのイメージ作成の復習も兼ねてイメージ作成から「&lt;a href="https://hub.docker.com/"&gt;Docker Hub&lt;/a&gt;」での公開までの流れをまとめてみました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker version 18.09.2, build &lt;span class="m"&gt;6247962&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前提条件"&gt;前提条件&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;がインストールされていること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="作業開始"&gt;作業開始&lt;/h2&gt;&#10;&lt;h3 id="作業用ディレクトリのディレクトリ作成"&gt;作業用ディレクトリのディレクトリ作成&lt;/h3&gt;&#10;&lt;p&gt;作業用のディレクトリを作成しましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir centos-sandbox&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; centos-sandbox&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="dockerfiledockerイメージを作成するためのレシピを作成する"&gt;Dockerfile（Dockerイメージを作成するためのレシピ）を作成する&lt;/h3&gt;&#10;&lt;p&gt;Dockerイメージを作成するための「レシピ」となる &lt;strong&gt;Dockerfile&lt;/strong&gt; を作成します。&lt;/p&gt;&#10;&lt;p&gt;ここでは、 &lt;code&gt;git&lt;/code&gt; と &lt;code&gt;vim&lt;/code&gt; コマンドを使えるようにしています。&#10;また &lt;code&gt;yum&lt;/code&gt; を使ったあとはキャッシュ情報がローカルディスクに残ってしまいますが、ディスク使用領域が増えるとDockerイメージが大きくなり、立ち上げや「Docker Hub」のアップロードが遅くなりますので削除しておきます。&lt;/p&gt;&#10;&lt;p&gt;実施した内容をブログやWikiに転記することも多いので、プロンプトはシンプルなもの( &lt;code&gt;$&lt;/code&gt; のみ )にしておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;FROM centos:centos7&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;RUN yum install -y git vim \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;amp;&amp;amp; rm -rf /var/cache/yum/* \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;amp;&amp;amp; yum clean all \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;ENV PS1 &amp;#39;$ &amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;内容を確認します。&lt;/p&gt;</description></item><item><title>プロジェクトに最適な .gitignore をコマンドラインから簡単に生成するためのツール「gibo」</title><link>https://genzouw.com/entry/2019/03/27/140005/1264/</link><pubDate>Wed, 27 Mar 2019 14:00:05 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/27/140005/1264/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;プロジェクトに最適な&lt;code&gt;.gitignore&lt;/code&gt; をどうやって作ろうかなと思っていたところ、 &lt;a href="https://github.com/simonwhitaker/gibo"&gt;gibo&lt;/a&gt; という便利ツールを発見したのでメモ。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;gibo&lt;/strong&gt; は、プロジェクトに最適な &lt;code&gt;.gitignore&lt;/code&gt; ファイルを作成してくれるツールです。&#10;様々な言語、フレームワーク、ツールに対応していて、大抵のメジャーなものについては、簡単に &lt;code&gt;.gitignore&lt;/code&gt; を生成できます。&lt;/p&gt;&#10;&lt;p&gt;ソースコードを読んでみましたが、簡潔で見やすく、シェルスクリプトの勉強に良いと感じました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.3&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;プラットフォームことに最適なインストール方法が異なりますが、実際 1 ファイルのシェルスクリプトなのでダウンロードしてきて &lt;code&gt;$PATH&lt;/code&gt; 環境変数の通っているディレクトリに配置すれば動作します。&lt;/p&gt;&#10;&lt;h3 id="macos"&gt;macOS&lt;/h3&gt;&#10;&lt;p&gt;Homebrew で一発でインストールできます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew install gibo &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; gibo update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="unix-系-os"&gt;Unix 系 OS&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -L https://raw.github.com/simonwhitaker/gibo/master/gibo &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -so ~/bin/gibo &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; chmod +x ~/bin/gibo &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; gibo update&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="動作確認"&gt;動作確認&lt;/h2&gt;&#10;&lt;p&gt;インストールができたか確認してみましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ gibo --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gibo 2.1.2 by Simon Whitaker &amp;lt;sw@netcetera.org&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;https://github.com/simonwhitaker/gibo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Fetches gitignore boilerplates from https://github.com/github/gitignore&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Usage:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gibo &lt;span class="o"&gt;[&lt;/span&gt;command&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Example:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gibo dump Swift Xcode &amp;gt;&amp;gt; .gitignore&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Commands:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dump BOILERPLATE... Write boilerplate&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; to STDOUT&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;help&lt;/span&gt; Display this &lt;span class="nb"&gt;help&lt;/span&gt; text&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; list List available boilerplates&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; search STR Search &lt;span class="k"&gt;for&lt;/span&gt; boilerplates with STR in the name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; update Update list of available boilerplates&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; version Display current script version&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;p&gt;それではツールにふれていきましょう。&lt;/p&gt;</description></item><item><title>VimをRESTクライアントとして使えるプラグイン「roast.vim」を試してみた</title><link>https://genzouw.com/entry/2019/03/25/115936/1254/</link><pubDate>Mon, 25 Mar 2019 11:59:36 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/25/115936/1254/</guid><description>&lt;h2&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://aws.amazon.com/jp/api-gateway/"&gt;Amazon API Gateway&lt;/a&gt; を触りだすと、RESTクライアントアプリが欲しくなってきました。&lt;/p&gt;&#10;&lt;p&gt;今までは &lt;code&gt;curl&lt;/code&gt; で実行していましたが、コマンドだと何度も実行するときに面倒だし、だからといって &lt;a href="https://www.getpostman.com/"&gt;Postman&lt;/a&gt; のようなツールを使って &lt;strong&gt;CUIの世界から飛び出す&lt;/strong&gt; のもなぁと思っていたところ良さそうなプラグインを見つけました。&lt;/p&gt;&#10;&lt;h2&gt;roast.vim プラグイン&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/sharat87/roast.vim"&gt;GitHub - sharat87/roast.vim&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;RESTクライアントとしても使用できるVim用のHTTPクライアント&lt;/em&gt; です。&lt;/p&gt;&#10;&lt;img src="https://github.com/sharat87/roast.vim/raw/master/roast-demo.gif" alt="vim-roast" style="max-width:100%;"&gt;&#10;&lt;p&gt;ViMエディタプラグインとしてのHTTPクライアントということです。&lt;/p&gt;&#10;&lt;p&gt;丁寧に&lt;a href="https://youtu.be/W2QKvJvR3dY"&gt;動画のデモ&lt;/a&gt;も用意されています。&lt;/p&gt;&#10;&lt;h2&gt;必要なもの&lt;/h2&gt;&#10;&lt;p&gt;利用するために必要なものは以下のものとのことです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;+python3環境&lt;/li&gt;&#10;&lt;li&gt;ViM 8.1で動作確認済み&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2&gt;検証環境&lt;/h2&gt;&#10;&lt;pre&gt;&lt;code class="language-bash"&gt;$ uname -moi&#10;x86_64 MacBookPro11,4 Darwin&#10;&lt;p&gt;$ vim &amp;ndash;version| head -n 1&#10;VIM - Vi IMproved 8.1 (2018 May 18, compiled Mar 11 2019 08:36:40)&lt;/p&gt;&#10;&lt;p&gt;$ vim &amp;ndash;version| grep python&#10;+comments +libcall -python +visualextra&#10;+conceal +linebreak +python3 +viminfo&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&#10;&lt;h2&gt;試してみる&lt;/h2&gt;&#10;&lt;p&gt;早速試してみます。&lt;br /&gt;&#10;( &lt;em&gt;ここではすでにプラグインのインストールが終わっているものとします。&lt;/em&gt; )&lt;/p&gt;&#10;&lt;p&gt;RESTクライアント機能を有効にするには、以下のいずれかの拡張子を持つファイルを開きます。&lt;/p&gt;</description></item><item><title>S3にファイルが作成されたことを検知してLambda関数でファイルを読み込む( `aws-cli` で構築)</title><link>https://genzouw.com/entry/2019/03/23/092512/1224/</link><pubDate>Sat, 23 Mar 2019 09:25:12 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/23/092512/1224/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;「&lt;a href="https://genzouw.com/entry/2019/02/28/082940"&gt;S3にファイルがSFTPアップロードされたことを検知してLambdaを起動する（ &lt;code&gt;aws-cli&lt;/code&gt; で構築）&lt;/a&gt;」で、S3にファイルがアップロードされたことをフック条件にしてLambdaファンクションを実行させてみました。&lt;/p&gt;&#10;&lt;p&gt;ただ、上記のエントリではLambdaファンクションがCloudWatchLogにログを出力させるまでの実装にとどまっていました。&#10;フック条件となったS3のファイルを読み込むロジックは作成していません。&lt;/p&gt;&#10;&lt;p&gt;そこで、今回はフック条件となったS3内のファイル読み込みを試してみました。&lt;/p&gt;&#10;&lt;h2 id="ゴールとする構成"&gt;ゴールとする構成&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=13TTO-65zShudTTkcTl3s_zE99L26a7vM" alt=""&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ファイルがアップロードされる&lt;/li&gt;&#10;&lt;li&gt;アップロードを検知してLambdaファンクションを呼び出し&lt;/li&gt;&#10;&lt;li&gt;S3のファイルを読み込む&lt;/li&gt;&#10;&lt;li&gt;CloudWatchLogにログ出力&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="必要なもの"&gt;必要なもの&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://github.com/aws/aws-cli"&gt;aws&lt;/a&gt; コマンドが使えること&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://stedolan.github.io/jq/"&gt;jq&lt;/a&gt; コマンドが使えること&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://www.npmjs.com/"&gt;npm&lt;/a&gt; コマンドが使えること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.3&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.120 Python/3.7.2 Darwin/18.2.0 botocore/1.12.110&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ npm --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6.7.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="作業開始"&gt;作業開始&lt;/h2&gt;&#10;&lt;p&gt;以下のエントリから今回必要な部分のみピックアップして検証していきます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/02/28/082940"&gt;S3にファイルがSFTPアップロードされたことを検知してLambdaを起動する（ &lt;code&gt;aws-cli&lt;/code&gt; で構築）&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="設定パラメータの整理"&gt;設定パラメータの整理&lt;/h3&gt;&#10;&lt;p&gt;今回は以下の3つのパラメータ設定が必要です。&#10;以下のような名前で設定しておきます。コマンドラインに流し込み、変数を作成しておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# S3のバケット名&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;S3_BUCKET_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;g-trigger-and-read-bucket&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Lambdaに設定するロール名&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;IAM_ROLE_NAME_LAMBDA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;g-trigger-and-read-lambda-role&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Lambdaのファンクション名&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LAMBDA_FUNCTION_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;g-trigger-and-read-lambda-function&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="s3バケットの作成"&gt;「S3バケット」の作成&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws s3 mb s3://&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;S3_BUCKET_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="lambdaファンクションに割り当てるiamロールの作成"&gt;「Lambdaファンクションに割り当てるIAMロール」の作成&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# まずは初期ポリシーファイルを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;&amp;#34;/tmp/${IAM_ROLE_NAME_LAMBDA}-policy.json&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Version&amp;#34;: &amp;#34;2012-10-17&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Statement&amp;#34;: [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Effect&amp;#34;: &amp;#34;Allow&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Principal&amp;#34;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Service&amp;#34;: &amp;#34;lambda.amazonaws.com&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Action&amp;#34;: &amp;#34;sts:AssumeRole&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;IAM_ROLE_ARN_LAMBDA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws iam create-role &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --role-name &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IAM_ROLE_NAME_LAMBDA&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --assume-role-policy-document file:///tmp/&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IAM_ROLE_NAME_LAMBDA&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;-policy.json &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.Role.Arn&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 正常に作成できたか確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;IAM_ROLE_ARN_LAMBDA&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;作成されたLambdaファンクション用のロールにポリシー（権限）を追加で割り当てます。&#10;今回はLambdaファンクションから「CloudWatchLog」、「S3」にアクセスするため、2つのポリシーを追加しています。&lt;/p&gt;</description></item><item><title>シェルスクリプトで任意のオーナーが所有するGithubリポジトリを一覧表示する（ワンライナー）</title><link>https://genzouw.com/entry/2019/03/20/075915/1216/</link><pubDate>Wed, 20 Mar 2019 07:59:15 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/20/075915/1216/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Githubで任意のオーナーが所有するリポジトリを全て確認したいのですが、Githubのリポジトリ一覧ページに到達するまで面倒ですよね。&#10;（ 僕がGithub不慣れなだけなのでしょうか？ )&lt;/p&gt;&#10;&lt;p&gt;そこで、シェルスクリプト化していつでも一覧を表示できるようにしてみました。&lt;/p&gt;&#10;&lt;h2 id="スクリプト"&gt;スクリプト&lt;/h2&gt;&#10;&lt;h3 id="hub-repossh"&gt;&lt;code&gt;hub-repos.sh&lt;/code&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o noclobber&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl &lt;span class="s2"&gt;&amp;#34;https://api.github.com/users/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;SNS_USERNAME&lt;/span&gt;&lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;/repos?per_page=100&amp;#34;&lt;/span&gt; 2&amp;gt;/dev/null &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.[].name&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="必要なもの"&gt;必要なもの&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;a href="https://stedolan.github.io/jq/"&gt;jq&lt;/a&gt; コマンドが使えること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="使い方"&gt;使い方&lt;/h3&gt;&#10;&lt;p&gt;以下のいずれかで所有者を設定できます。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;環境変数 &lt;code&gt;SNS_USERNAME&lt;/code&gt; を設定する。 ( ex : &lt;code&gt;export SNS_USERNAME=genzouw&lt;/code&gt; )&lt;/li&gt;&#10;&lt;li&gt;スクリプトの第一引数を指定する ( ex : &lt;code&gt;hub-repos.sh genzouw&lt;/code&gt; )&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;パスの通っている場所に配置してあげてください。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;ずいぶん昔に作ったスクリプトの整理をしていて見つけました。&#10;当時のスクリプトは、 &lt;code&gt;jq&lt;/code&gt; を使っている部分に &lt;code&gt;ruby -rjson -e 'JSON.parse(STDIN.read).each{|r|puts r[&amp;quot;name&amp;quot;]}'&lt;/code&gt; と記述されていました。&#10;ruby触っていた記憶なんてほとんど無いんですけどね。&lt;/p&gt;</description></item><item><title>sedコマンドの内部コマンドの適用範囲を指定する際には終了条件に注意！(最終行まで適用されてしまう場合)</title><link>https://genzouw.com/entry/2019/03/19/083223/1211/</link><pubDate>Tue, 19 Mar 2019 08:32:23 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/19/083223/1211/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;前回( &lt;a href="https://genzouw.com/entry/2019/03/13/083221"&gt;sedコマンドを全行に実行させたくない場合は内部コマンドの適用範囲を指定しよう（含む、含まない、特定の行のみ、数行毎に、など）&lt;/a&gt; ) みた &lt;code&gt;sed&lt;/code&gt; コマンドの範囲指定方法について、振り返ります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;sed&lt;/code&gt; の内部コマンド適用範囲は &lt;strong&gt;「アドレス」&lt;/strong&gt; というもので設定できる&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;「アドレス」&lt;/strong&gt; は 0個か1個か2個を指定できる。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;「アドレス」&lt;/strong&gt; にはパターンを表す正規表現か行番号が使える&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;「アドレス」&lt;/strong&gt; の指定方法は &lt;strong&gt;行アドレス&lt;/strong&gt; と &lt;strong&gt;パターンアドレス&lt;/strong&gt; がある&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;「アドレス」&lt;/strong&gt; については、以下の5つの大原則がありました。&lt;/p&gt;&#10;&lt;p&gt;*「アドレス」が指定されていなければ、コマンドは全ての行に適用される&#10;*「アドレス」が一個だけ指定されると、コマンドはその「アドレス」にマッチする全ての行に適用される&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;カンマで区切られた2個の「アドレス」が指定されると最初の「アドレス」にマッチしたから2番目の「アドレス」にマッチするまでその行も含むすべての行にコマンドが適用される&#10;*「アドレス」の後ろにエクスクラメーションマークをつけると「アドレス」にマッチしない全ての行にコマンドが適用される&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="行アドレス例"&gt;「行アドレス」例&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5行目を削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat any-file.txt &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;5d&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 5行目から10行目を削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat any-file.txt &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;5,10d&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="パターンアドレス例"&gt;「パターンアドレス」例&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# コメント行を削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat any-file.txt &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;/^\s*\#/d&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;#39;---&amp;#39; から 次の &amp;#39;---&amp;#39; まで削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat any-file.txt &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;/---/,/---/d&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="カンマの後ろの条件指定に注意しないと予期しない挙動をする"&gt;カンマの後ろの条件指定に注意しないと予期しない挙動をする！&lt;/h2&gt;&#10;&lt;p&gt;前回さらっと流してしまったが、sedコマンドのアドレス指定範囲で意外とハマってしまうケースがあります。&#10;「範囲指定がうまく動作しない！」という方の参考になれば幸いです。&lt;/p&gt;&#10;&lt;h2 id="範囲指定がうまく動かないケース"&gt;範囲指定がうまく動かないケース&lt;/h2&gt;&#10;&lt;p&gt;テストデータを元にカンマの後ろの条件に該当しない場合にどうなるかを見ていきましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt; testdata.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;2014&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;2015&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;2017&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;2018&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;2019&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記は2014年から2019年のデータとします。ここで注意したいのは、2018年だけが抜けている点です。&lt;/p&gt;</description></item><item><title>「名前付きパイプ」（FIFO/Named Pipe）を使ってプロセス間通信を試してみる</title><link>https://genzouw.com/entry/2019/03/18/120025/1209/</link><pubDate>Mon, 18 Mar 2019 12:00:25 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/18/120025/1209/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/01/26/094210/644/"&gt;Bash のストリーム/パイプ処理を視覚的に理解する&lt;/a&gt; のエントリで触れましたが、「名前付きパイプ」というものがあって今のプロジェクトで使う可能性が出てきたので取り上げてみました。&lt;/p&gt;&#10;&lt;p&gt;本稼働するシステムで使うことは初めてになりそうなので、楽しみです。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="通常のパイプ"&gt;通常のパイプ&lt;/h2&gt;&#10;&lt;p&gt;「通常のパイプ」は「無名」です。&#10;使用しているプロセスが動作中の間だけ存在します&#10;プロセスが終了するとともに消えてしまいます。&lt;/p&gt;&#10;&lt;p&gt;パイプを挟んで前後にプロセスが 1 つずつ存在します。&#10;一方は「パイプ」へ出力、他方は「パイプ」からの入力を待ちます。&lt;/p&gt;&#10;&lt;h3 id="例"&gt;(例)&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# `seq` で 1から10 の数値を出力し、 `tail` で入力を受け付ける。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tail -f&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="名前付きパイプ-とは"&gt;&amp;ldquo;名前付きパイプ&amp;rdquo; とは？&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;「名前付きパイプ」&lt;/strong&gt; は「ファイル名」を持ちます。&lt;/li&gt;&#10;&lt;li&gt;プロセスが消滅しても存在し続けます。(そのため、使わなくなったら削除する必要があります。)&lt;/li&gt;&#10;&lt;li&gt;プロセス間通信 (IPC) を行うためにプロセスがオープンして使用します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="試してみる"&gt;試してみる&lt;/h2&gt;&#10;&lt;p&gt;簡単な例を上げます。&lt;/p&gt;&#10;&lt;h3 id="名前付きパイプの作成"&gt;名前付きパイプの作成&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;mkfifo&lt;/code&gt; というコマンドを実行すると、 &lt;strong&gt;「名前付きパイプ」&lt;/strong&gt; ファイルが作成できます。&#10;ここでは &lt;strong&gt;Named Pipe&lt;/strong&gt; の頭文字をとって &lt;code&gt;np&lt;/code&gt; としています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkfifo np&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ls -l&lt;/code&gt; コマンドでファイルができたか確認すると、&#10;ファイルタイプ（一番左の文字）を見ると、 &lt;code&gt;p&lt;/code&gt; となっていますが、このファイルが名前付きパイプであることを示しています。&lt;/p&gt;</description></item><item><title>「Amazon API Gateway」から「Lambda」を通さずに「S3」へアクセスできるようにしてみる（ `aws-cli` で構築）</title><link>https://genzouw.com/entry/2019/03/15/165949/1189/</link><pubDate>Fri, 15 Mar 2019 16:59:49 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/15/165949/1189/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;AWSを利用したサーバレスな事例が増えてきました。&#10;例えば以下のような構成の事例がWeb上で掲載されています。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1pbHEz0suFdiUpRMRYR6k-E-UcSlsfEb_" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「API Gateway」&lt;/strong&gt; から &lt;strong&gt;「Lambda」&lt;/strong&gt; を経由して &lt;strong&gt;「DynamoDB」あるいは「S3」&lt;/strong&gt; にアクセスする例は、様々な方がWeb上に掲載しています。&#10;&lt;strong&gt;「API Gateway」&lt;/strong&gt; から &lt;strong&gt;「S3」&lt;/strong&gt; へ直接アクセスするための例はあまり見つからず、またあったとしても &lt;strong&gt;AWS-CLI&lt;/strong&gt; を使って設定している例が見つからなかったため、整理してみました。&lt;/p&gt;&#10;&lt;p&gt;ちなみに設定した内容はAmazonが提供している以下のドキュメントを参考にしています。こちらのドキュメントは「AWS マネージメントコンソール」からポチポチ操作していく内容となっています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/integrating-api-with-aws-services-s3.html"&gt;API Gateway で Amazon S3 プロキシとして REST API を作成する - Amazon API Gateway&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="作成するapi概要"&gt;作成する「API」概要&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;S3にアクセスできる。（今回は読み取りのみ）&lt;/li&gt;&#10;&lt;li&gt;アクセス用URLは &lt;code&gt;https://&amp;lt;host&amp;gt;/&amp;lt;S3-BUCKET-NAME&amp;gt;/&amp;lt;S3-OBJECT-KEY&amp;gt;&lt;/code&gt; の形式とする。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;aws-cli&lt;/code&gt; コマンドが利用できる&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;jq&lt;/code&gt; コマンドが利用できる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;code&gt;ja&lt;/code&gt; はなくてもよいのですが、今回各AWS構成要素を作成した際のJSONレスポンスをパースしてできる限りコマンドラインのみの操作としたかったので利用してみました。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.120 Python/3.7.2 Darwin/18.2.0 botocore/1.12.110&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ jq --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;jq-1.6&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="手順"&gt;手順&lt;/h2&gt;&#10;&lt;p&gt;デプロイ直前までの流れは以下の通り。&#10;（デプロイは次回実施してみる。）&lt;/p&gt;</description></item><item><title>AWS-CLIでhelpを入力するのが煩わしい場合の対処としてスクリプトを作ってみた。</title><link>https://genzouw.com/entry/2019/03/14/124024/1182/</link><pubDate>Thu, 14 Mar 2019 12:40:24 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/14/124024/1182/</guid><description>&lt;p&gt;&lt;strong&gt;AWS-CLI&lt;/strong&gt; を叩きながら &lt;strong&gt;AWS&lt;/strong&gt; の各種サービスを構築する上で必要な情報を学習中です。&lt;/p&gt;&#10;&lt;p&gt;僕は画面を見ていくよりもコマンドのヘルプを見ながら試行錯誤していくほうが理解が進めやすいようです。&lt;/p&gt;&#10;&lt;h2 id="aws-cliのヘルプを引くのが面倒"&gt;「AWS-CLI」のヘルプを引くのが面倒&lt;/h2&gt;&#10;&lt;p&gt;ただ、ヘルプを引くのが面倒なのです。&#10;具体的に言うと &lt;code&gt;help&lt;/code&gt; コマンドを入力するのが面倒。&lt;/p&gt;&#10;&lt;p&gt;例えば作業中に以下のような状況になることが多い。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# どんなコマンドがあったっけ？&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# コマンド間違えた&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws &lt;span class="nb"&gt;help&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 内容を確認したので実行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws s3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ヘルプを見るか&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws s3 --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# くっ...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws s3 &lt;span class="nb"&gt;help&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# わかった！実行する！&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws s3 mb my-butket-name&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# なんかエラー出るし！&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws s3 mb &lt;span class="nb"&gt;help&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ちょっとした改善としてhelpを打ち込まなくてもhelpが表示されるようにしてみた"&gt;ちょっとした改善として、helpを打ち込まなくてもhelpが表示されるようにしてみた&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;help&lt;/code&gt; と入力する手間だけでも減らそうと思って短いスクリプトを作ってみた。&#10;&lt;code&gt;aws&lt;/code&gt; コマンドは多くのコマンドが &lt;code&gt;aws &amp;lt;サブコマンド&amp;gt; &amp;lt;オプション&amp;gt;&lt;/code&gt; といった構成となるので、2つの引数が必要になります。&#10;引数が1つ以下の場合は、自動的に &lt;code&gt;help&lt;/code&gt; というオプション付きで呼び出すようにしています。&lt;/p&gt;&#10;&lt;h2 id="スクリプト"&gt;スクリプト&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;aws&lt;/strong&gt; という名前でスクリプトを作って、普段はこちらのファイルを見るようにしてやります。&#10;（&lt;code&gt;pip install&lt;/code&gt; した &lt;code&gt;aws&lt;/code&gt; コマンドのパスについては、ここでは &lt;code&gt;/usr/local/bin/aws&lt;/code&gt; となっていますが、環境毎に異なるかと思いますので、適宜変更してください。）&lt;/p&gt;</description></item><item><title>sedコマンドを全行に実行させたくない場合は内部コマンドの適用範囲を指定しよう（含む、含まない、特定の行のみ、数行毎に、など）</title><link>https://genzouw.com/entry/2019/03/13/083221/1170/</link><pubDate>Wed, 13 Mar 2019 08:32:21 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/13/083221/1170/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/03/11/080255"&gt;シェルスクリプトでデータを絞り込む方法いろいろ（grep、sed、awk）&lt;/a&gt; で &lt;code&gt;sed&lt;/code&gt; コマンドを使った絞り込み方法について触れたので、 &lt;code&gt;sed&lt;/code&gt; コマンドに関してのみもう少し深掘りしてみたいと思います。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sed --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sed &lt;span class="o"&gt;(&lt;/span&gt;GNU sed&lt;span class="o"&gt;)&lt;/span&gt; 4.7&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sedの内部コマンド"&gt;sedの内部コマンド&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; コマンドは標準入力あるいはファイルに対して、 &lt;strong&gt;内部コマンド&lt;/strong&gt; を指定しその結果を出力する、というコマンドです。&#10;ややこしいですが、 &lt;code&gt;sed&lt;/code&gt; の中だけで使えるコマンド、という意味です。&#10;&lt;strong&gt;内部コマンド&lt;/strong&gt; は全行に対して、行単位に実行されます。&lt;/p&gt;&#10;&lt;p&gt;内部コマンドの例をいくつか上げます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;i&lt;/code&gt; : 行の前に一行追加し、引数として指定した文字列を追加&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;a&lt;/code&gt; : 行の後に一行追加し、引数として指定した文字列を追加&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;d&lt;/code&gt; : 削除する&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;p&lt;/code&gt; : 出力する&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;s&lt;/code&gt; : 正規表現で置換処理する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="sedの内部コマンドは全ての行に適用される"&gt;sedの内部コマンドは全ての行に適用される&lt;/h2&gt;&#10;&lt;p&gt;先述したとおり、適用範囲の指定がない &lt;code&gt;sed&lt;/code&gt; のコマンドは、全ての行に対して適用されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# seq で 3行出力させる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# seq 実行結果を sed に適用&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; 3&lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;a test&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 数値をxに置換&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; 3&lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/[0-9]/x/&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 行を削除（何も出力されない）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; 3&lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;「すべての行を置換する」といった操作の場合には想定通りですが、「行を削除する」といった操作の場合は範囲指定ができなければ意味がありません。&lt;/p&gt;</description></item><item><title>シェルスクリプトでデータを絞り込む方法いろいろ（grep、sed、awk）</title><link>https://genzouw.com/entry/2019/03/11/080255/1166/</link><pubDate>Mon, 11 Mar 2019 08:02:55 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/11/080255/1166/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプトやコンソールでデータを絞り込むための方法をいくつか紹介します。&#10;基本どれか一つを使えればいいと思いますが、例えば特定の今度がない！（ &lt;code&gt;grep&lt;/code&gt; コマンドを消してしまった！ ）なんてときに使えるかもしれません。（そんなケースあるのか？）&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;検証用のデータ（csv）を作成。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/03/01/203455"&gt;CSVをJSONに変換するためのNode.jsライブラリ「csv2json」 | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;&amp;gt; personal_infomation.csv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;連番,氏名,氏名（カタカナ）,性別,電話番号,生年月日&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;1,浜崎陽治,ハマザキヨウジ,男,0238930217,1974/11/03&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;2,奥山隆雄,オクヤマタカオ,男,0888070241,1997/08/04&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;3,船越瑠奈,フナコシルナ,女,0986044637,1966/04/16&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;4,玉置忠治,タマキタダハル,男,0779869154,1995/07/19&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;5,出口美香,デクチミカ,女,0289679894,1991/10/18&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;6,西本良之,ニシモトヨシユキ,男,0855699116,1988/03/29&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;7,湯川麗奈,ユカワレナ,女,0997770517,1996/03/05&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;8,荻野莉沙,オギノリサ,女,073800935,1987/06/20&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;9,海野博明,ウミノヒロアキ,男,0888070499,1998/05/23&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;10,高崎淳一,タカサキジュンイチ,男,0559462109,1982/05/10&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="grep-を使った絞り込み"&gt;&lt;code&gt;grep&lt;/code&gt; を使った絞り込み&lt;/h2&gt;&#10;&lt;p&gt;最もよく使われる方法。&#10;この方法を知っていたら十分ではある。&lt;/p&gt;&#10;&lt;p&gt;絞り込み結果を必要に応じてバイプで次のコマンドに渡してやれば、更に可能できる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grep 女 personal_infomation.csv&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3,船越瑠奈,フナコシルナ,女,0986044637,1966/04/16&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5,出口美香,デクチミカ,女,0289679894,1991/10/18&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7,湯川麗奈,ユカワレナ,女,0997770517,1996/03/05&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;8,荻野莉沙,オギノリサ,女,073800935,1987/06/20&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sed-を使った絞り込み"&gt;&lt;code&gt;sed&lt;/code&gt; を使った絞り込み&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; でも絞り込みができる。&#10;&lt;code&gt;sed&lt;/code&gt; も &lt;code&gt;grep&lt;/code&gt; も、後述する &lt;code&gt;awk&lt;/code&gt; もいずれも &lt;code&gt;ed&lt;/code&gt; という過去にあったライン志向のエディタから派生している。&#10;&lt;code&gt;grep&lt;/code&gt; は基本動作としてフィルタ結果を &lt;strong&gt;出力しない&lt;/strong&gt; が、 &lt;code&gt;sed&lt;/code&gt; は基本動作としてフィルタ結果を &lt;strong&gt;常に出力する&lt;/strong&gt; 。&lt;/p&gt;</description></item><item><title>Python3環境で `pip install` したコマンドラインツールが動作しない場合の対処</title><link>https://genzouw.com/entry/2019/03/09/151214/1129/</link><pubDate>Sat, 09 Mar 2019 15:12:14 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/09/151214/1129/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;先日投稿した以下のエントリにて、 &lt;strong&gt;「自分のMacBookPro環境をPython2からPython3環境にバージョンアップしたら正常に動作しない」&lt;/strong&gt; という問題が発生していたが、解消方法がわかったのでまとめてみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/03/08/084402"&gt;コマンドラインからBitbucketのリポジトリを操作するためのツール「bitbucket-cli」でリポジトリを作成してみる&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;なんとか問題解決まで至りましたが、 &lt;strong&gt;Pythonに詳しいエンジニアならすぐにわかることなのでしょう&lt;/strong&gt; 。Python素人がハマった内容を共有します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="調査開始"&gt;調査開始&lt;/h2&gt;&#10;&lt;h3 id="pythonのバージョンを確認する"&gt;Pythonのバージョンを確認する&lt;/h3&gt;&#10;&lt;p&gt;まず僕のMac環境のPythonのバージョンを確認します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ python --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Python 3.7.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="エラーの内容を確認する"&gt;エラーの内容を確認する&lt;/h3&gt;&#10;&lt;p&gt;先日もお話したとおり、 &lt;code&gt;bitbucket-cli&lt;/code&gt; が &lt;strong&gt;python2系&lt;/strong&gt; 環境では正常に動作していましたが、 &lt;strong&gt;python3系&lt;/strong&gt; 環境では正しく動いていません。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bb &lt;span class="nb"&gt;help&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Traceback &lt;span class="o"&gt;(&lt;/span&gt;most recent call last&lt;span class="o"&gt;)&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &lt;span class="s2"&gt;&amp;#34;/usr/local/bin/bb&amp;#34;&lt;/span&gt;, line 6, in &amp;lt;module&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; from bitbucket.cli import run&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &lt;span class="s2"&gt;&amp;#34;/usr/local/lib/python3.7/site-packages/bitbucket/__init__.py&amp;#34;&lt;/span&gt;, line 1, in &amp;lt;module&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; from .repositories import *&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; File &lt;span class="s2"&gt;&amp;#34;/usr/local/lib/python3.7/site-packages/bitbucket/repositories.py&amp;#34;&lt;/span&gt;, line &lt;span class="m"&gt;25&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; print r.content&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ^&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SyntaxError: Missing parentheses in call to &lt;span class="s1"&gt;&amp;#39;print&amp;#39;&lt;/span&gt;. Did you mean print&lt;span class="o"&gt;(&lt;/span&gt;r.content&lt;span class="o"&gt;)&lt;/span&gt;?&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="bb-コマンドのスクリプトを確認する"&gt;&lt;code&gt;bb&lt;/code&gt; コマンドのスクリプトを確認する&lt;/h3&gt;&#10;&lt;p&gt;ふと &lt;code&gt;bb&lt;/code&gt; コマンドは一体どんなスクリプトなのだろうを思いコードを覗いてみました。&lt;/p&gt;</description></item><item><title>コマンドラインからBitbucketのリポジトリを操作するためのツール「bitbucket-cli」でリポジトリを作成してみる</title><link>https://genzouw.com/entry/2019/03/08/084402/1099/</link><pubDate>Fri, 08 Mar 2019 08:44:02 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/08/084402/1099/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;会社で利用しているGitのホスティングサービスは &lt;a href="https://bitbucket.org/"&gt;Bitbucket logo&lt;/a&gt; ですが、コマンドラインからリポジトリ作成やプルリクエストを投げられると便利です。&lt;/p&gt;&#10;&lt;p&gt;自分のPCに導入している &lt;a href="https://bitbucket.org/zhemao/bitbucket-cli/src/master/"&gt;bitbucket-cli&lt;/a&gt; を紹介します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※ちなみにGithub用のコマンドラインツールは &lt;a href="https://genzouw.com/entry/2019/01/22/085412"&gt;Githubの無料アカウントユーザにもPrivateリポジトリ作成が無制限になったのでコマンド一発でどんどん作成するための環境を作ってみる&lt;/a&gt; を参照ください。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux 8f10b748d929 4.9.125-linuxkit &lt;span class="c1"&gt;#1 SMP Fri Sep 7 08:20:28 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ python --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Python 2.7.5&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="必要なもの"&gt;必要なもの&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;strong&gt;Python（2.7.9以上のバージョン）&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;h3 id="pip-のインストール"&gt;&lt;strong&gt;pip&lt;/strong&gt; のインストール&lt;/h3&gt;&#10;&lt;p&gt;Pythonで動作するツールということで、 &lt;strong&gt;pip&lt;/strong&gt; のインストールが必要。&lt;/p&gt;&#10;&lt;p&gt;以下のコマンドを実行し、バージョンが表示されていればすでにインストール済みなので、 &lt;strong&gt;pip&lt;/strong&gt; のセットアップは不要。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ pip --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip 19.0.3 from /usr/lib/python2.7/site-packages/pip &lt;span class="o"&gt;(&lt;/span&gt;python 2.7&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;インストールは簡単。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://pip.pypa.io/en/stable/installing/"&gt;pipのインストール方法&lt;/a&gt; ページにある通り、実行するだけ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ python get-pip.py&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;t be maintained after that date. A future version of pip will drop support &lt;span class="k"&gt;for&lt;/span&gt; Python 2.7.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Collecting pip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Downloading https://files.pythonhosted.org/packages/d8/f3/413bab4ff08e1fc4828dfc59996d721917df8e8583ea85385d51125dceff/pip-19.0.3-py2.py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;1.4MB&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 100% &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;################################| 1.4MB 3.6MB/s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Collecting setuptools&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Downloading https://files.pythonhosted.org/packages/d1/6a/4b2fcefd2ea0868810e92d519dacac1ddc64a2e53ba9e3422c3b62b378a6/setuptools-40.8.0-py2.py3-none-any.whl &lt;span class="o"&gt;(&lt;/span&gt;575kB&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 100% &lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="c1"&gt;################################| 583kB 7.5MB/s&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Collecting wheel&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Downloading https://files.pythonhosted.org/packages/96/ba/a4702cbb6a3a485239fbe9525443446203f00771af9ac000fa3ef2788201/wheel-0.33.1-py2.py3-none-any.whl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Installing collected packages: pip, setuptools, wheel&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Successfully installed pip-19.0.3 setuptools-40.8.0 wheel-0.33.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="bitbucket-cliのインストール"&gt;bitbucket-cliのインストール&lt;/h3&gt;&#10;&lt;p&gt;以下のコマンドを実行するだけです。&lt;/p&gt;</description></item><item><title>goofysを使ってEC2上のLinuxにS3をマウントする</title><link>https://genzouw.com/entry/2019/03/07/080500/1091/</link><pubDate>Thu, 07 Mar 2019 08:05:00 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/07/080500/1091/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;S3をファイルシステムとしてマウントするための方法を整理してみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;AWSを利用していて、S3をサーバーマウントする技術として &lt;strong&gt;s3fs&lt;/strong&gt; が有名&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;s3fs&lt;/strong&gt; は遅い&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;代替策として &lt;strong&gt;goofys&lt;/strong&gt; がある&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;goofys&lt;/strong&gt; は速い&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;goofys&lt;/strong&gt; の方が評判が良いようなのでgoofysを検証しました。&lt;/p&gt;&#10;&lt;p&gt;ちなみに &lt;strong&gt;goofys&lt;/strong&gt; のGithubページに&lt;a href="https://github.com/kahing/goofys#benchmark"&gt;ベンチマーク&lt;/a&gt;が掲載されています。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;(引用)&#10;Using &amp;ndash;stat-cache-ttl 1s &amp;ndash;type-cache-ttl 1s for goofys -ostat_cache_expire=1 for s3fs to simulate cold runs. Detail for the benchmark can be found in bench.sh. Raw data is available as well. The test was run on an EC2 m4.16xlarge in us-west-2a connected to a bucket in us-west-2. Units are seconds.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1q-8dXVRCCZ017FGoRzuGI7soy59WsmKj" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="今回のゴール"&gt;今回のゴール&lt;/h2&gt;&#10;&lt;p&gt;起動時にS3バケットが所定のディレクトリに自動マウントされるようになるまで設定します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※ちなみに、Dockerが利用できる場合にはgoofysを手軽に利用できるDockerイメージを公開していますのでお使いください。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでゼロ埋め（ゼロパディング）文字列を生成する方法いろいろ</title><link>https://genzouw.com/entry/2019/03/06/080354/1087/</link><pubDate>Wed, 06 Mar 2019 08:03:54 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/06/080354/1087/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;シェルスクリプト（Bash）で &lt;strong&gt;数字の頭を 0 で詰めて、桁数を調整&lt;/strong&gt; したいことがよくあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ゼロ埋め&lt;/strong&gt;、&lt;strong&gt;ゼロパディング&lt;/strong&gt;、&lt;strong&gt;ゼロフィル&lt;/strong&gt;、&lt;strong&gt;ゼロ詰め&lt;/strong&gt;などいろいろな呼び方をされます。&#10;シェルスクリプトで実現する場合のいくつかの方法と使用例をまとめてみます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="printf-コマンドを使う"&gt;&lt;code&gt;printf&lt;/code&gt; コマンドを使う&lt;/h2&gt;&#10;&lt;p&gt;セオリーというか、多くのプログラミング言語に搭載されている機能。&lt;br&gt;&#10;Bash組み込みコマンドの &lt;code&gt;printf&lt;/code&gt; を使う方法があります。&#10;出力フォーマットを指定することで、何桁の数値文字列として出力するか制御できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 普通に表示&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# printfを使うとゼロ埋めされるが、改行が出力されないことに注意。プロンプトかお尻にくっついちゃう&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%03d&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;008$&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 改行がほしい場合はこうする&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%03d\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;008&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変数に代入して後々利用したい場合は以下の通り&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;S&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%03d\n&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;S&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;008&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bashの変数参照機能を使う"&gt;Bashの変数参照機能を使う&lt;/h2&gt;&#10;&lt;p&gt;Bashの変数参照時に、不要な箇所を切り取ることができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# わざと0を3つ付与&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;000&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 参照時に後ろから3文字だけを取り出す&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="p"&gt;: -3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;008&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;※一度変数に代入しないといけないのが残念です。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="連続したゼロ埋め数値を生成したい場合"&gt;連続したゼロ埋め数値を生成したい場合&lt;/h2&gt;&#10;&lt;p&gt;ゼロ埋めした数値文字列は多くの場合、連続した値を処理するときに利用されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ex&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;↓&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;001&lt;/span&gt; &lt;span class="m"&gt;002&lt;/span&gt; &lt;span class="m"&gt;003&lt;/span&gt; &lt;span class="m"&gt;004&lt;/span&gt; &lt;span class="m"&gt;005&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;連続したゼロ埋め数値を生成する方法もいくつかあります。&lt;/p&gt;</description></item><item><title>`aws-cli` を使ってコマンドラインからAWS EC2とVPCを構築する</title><link>https://genzouw.com/entry/2019/03/04/123533/1077/</link><pubDate>Mon, 04 Mar 2019 12:35:33 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/04/123533/1077/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Transfer for SFTP&lt;/strong&gt; の価格があまりにも高すぎたため、 &lt;strong&gt;EC2&lt;/strong&gt; 上に &lt;strong&gt;SFTP&lt;/strong&gt; サーバを構築することにしました。&lt;/p&gt;&#10;&lt;p&gt;今までは &lt;strong&gt;VPC&lt;/strong&gt; や &lt;strong&gt;インターネットゲートウェイ&lt;/strong&gt; を使わずに &lt;strong&gt;EC2&lt;/strong&gt; 作成をしていたため、これらを導入した場合の手順を整理してみました。&lt;/p&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;aws-cli&lt;/code&gt; コマンドが利用できること&lt;/li&gt;&#10;&lt;li&gt;&lt;input disabled="" type="checkbox"&gt; &lt;code&gt;jq&lt;/code&gt; コマンドが利用できること&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;code&gt;ja&lt;/code&gt; はなくてもいいが、今回各AWS構成要素を作成した際のJSONレスポンスをパースしてできる限りコマンドラインのみの操作としたかったので利用しました。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aws-cli/1.16.110 Python/3.7.2 Darwin/18.2.0 botocore/1.12.100&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ネットワーク周りの設定"&gt;ネットワーク周りの設定&lt;/h2&gt;&#10;&lt;h3 id="vpcの作成"&gt;VPCの作成&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# VPCの新規作成 =&amp;gt; 作成されたVPCのIDを保存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;EC2_VPC_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws ec2 create-vpc &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cidr-block &lt;span class="s1"&gt;&amp;#39;172.20.0.0/16&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.Vpc.VpcId&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_VPC_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="subnetの作成"&gt;Subnetの作成&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Subnetの新規作成 =&amp;gt; 作成されたSubnetのIDを保存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;EC2_SUBNET_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws ec2 create-subnet &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cidr-block &lt;span class="s1"&gt;&amp;#39;172.20.0.0/16&amp;#39;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --vpc-id &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_VPC_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.Subnet.SubnetId&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_SUBNET_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="インターネットゲートウェイの作成"&gt;インターネットゲートウェイの作成&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# インターネットゲートウェイの新規作成 =&amp;gt; 作成されたインターネットゲートウェイのIDを保存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;EC2_INTERNET_GATEWAY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; aws ec2 create-internet-gateway &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r &lt;span class="s1"&gt;&amp;#39;.InternetGateway.InternetGatewayId&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_INTERNET_GATEWAY_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="vpcへインターネットゲートウェイを割り当てる"&gt;VPCへインターネットゲートウェイを割り当てる&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws ec2 attach-internet-gateway &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --internet-gateway-id &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_INTERNET_GATEWAY_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --vpc-id &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;EC2_VPC_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="ルートテーブルの設定"&gt;ルートテーブルの設定&lt;/h3&gt;&#10;&lt;p&gt;インターネットゲートウェイ経由でVPCへアクセスできるようにします。&lt;/p&gt;</description></item><item><title>CSVをJSONに変換するためのNode.jsライブラリ「csv2json」</title><link>https://genzouw.com/entry/2019/03/01/203455/1045/</link><pubDate>Fri, 01 Mar 2019 20:34:55 +0900</pubDate><guid>https://genzouw.com/entry/2019/03/01/203455/1045/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;JSON&lt;/strong&gt; データをinputとして処理するテストコードを書きたかったが、参考にするテストデータが &lt;strong&gt;CSV&lt;/strong&gt; フォーマットだったために簡単に変換できないかと探していたところ良いものを見つけました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.npmjs.com/package/csv2json"&gt;csv2json&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="必要なもの"&gt;必要なもの&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;npm&lt;/strong&gt; でインストールするツール&amp;amp;ライブラリのため、 &lt;strong&gt;Node.js&lt;/strong&gt; の実行環境が必要です。&lt;/p&gt;&#10;&lt;p&gt;実行環境がない場合は &lt;strong&gt;Node Version Manager&lt;/strong&gt; で &lt;strong&gt;Node.js&lt;/strong&gt; がインストールできます。&#10;( Redhut/Fedora/CentOSなら &lt;code&gt;yum&lt;/code&gt; 、 Ubuntu/Debianなら &lt;code&gt;apt-get&lt;/code&gt; 、 Macなら &lt;code&gt;brew&lt;/code&gt; を使ってインストールすることもできるが、以下の方法ならどの環境でもセットアップ可能。 )&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# **Node Version Manager** ( 複数のアクティブなnode.jsバージョンを管理するためのシンプルなbashスクリプト ) を利用&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh &lt;span class="p"&gt;|&lt;/span&gt; bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;&amp;gt;~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;export NVM_DIR=&amp;#34;$HOME/.nvm&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[ -s &amp;#34;$NVM_DIR/nvm.sh&amp;#34; ] &amp;amp;&amp;amp; \. &amp;#34;$NVM_DIR/nvm.sh&amp;#34; # This loads nvm&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[ -s &amp;#34;$NVM_DIR/bash_completion&amp;#34; ] &amp;amp;&amp;amp; \. &amp;#34;$NVM_DIR/bash_completion&amp;#34; # This loads nvm bash_completion&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ . ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ nvm install --latest-npm&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ node --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;v11.10.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="csv2json-のインストール"&gt;&lt;code&gt;csv2json&lt;/code&gt; のインストール&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;npm&lt;/code&gt; コマンドが使えるようになっていれば以下のコマンドでインストールが可能です。&lt;/p&gt;</description></item><item><title>S3にファイルがSFTPアップロードされたことを検知してLambdaを起動する（ `aws-cli` で構築）</title><link>https://genzouw.com/entry/2019/02/28/082940/1011/</link><pubDate>Thu, 28 Feb 2019 08:29:40 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/28/082940/1011/</guid><description>&lt;p&gt;以下のような仕組みを作る必要がありました。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ユーザにSFTPプロトコルを使って、S3にファイルをアップロードしてもらう。&lt;/li&gt;&#10;&lt;li&gt;S3にファイルがアップロードされたことを検知して、何らかの処理を行う。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;AWSのサービスを組みわせて、かつできる限り &lt;code&gt;aws-cli&lt;/code&gt; のみを使ってコマンドラインで仕組みを構築してみました。&lt;/p&gt;&#10;&lt;p&gt;今回は、 &lt;strong&gt;「何らかの処理」&lt;/strong&gt; として &lt;strong&gt;Lambdaファンクションを使ってCloudWatchLogにログを書き出させてみます&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※注意：IAM周りの設定はかなり大雑把に設定しているので、参考する場合にはもっと考慮が必要！&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="簡易構成図"&gt;簡易構成図&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1MiJM_T8fe2u3IhCebS54ZuhWUjJCl3uf" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="設定パラメータを整理"&gt;設定パラメータを整理&lt;/h2&gt;&#10;&lt;p&gt;AWSの各種サービス設定時に必要となる情報を事前にまとめておきました。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;設定項目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;設定値&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AWS Transfer 実行ユーザ名(SFTPログインユーザ)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-bucket-transfer-user&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AWS Transfer 実行ロール名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-bucket-transfer-role&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;S3 バケット名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-bucket&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;S3 バケット イベント名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-bucket-event&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Lambda ファンクション名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-function&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Lambda 実行ロール名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;g-trigger-function-role&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="事前準備"&gt;事前準備&lt;/h2&gt;&#10;&lt;h3 id="aws-cli-awsコマンドの利用可能な環境づくり"&gt;&lt;code&gt;aws-cli&lt;/code&gt; (AWSコマンドの利用可能な環境づくり)&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;aws-cli&lt;/code&gt; の利用可能環境は、以下のエントリを参考に構築済み。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/02/23/133626"&gt;AWSコマンドを使うための環境をDockerを使って構築(Mac/Linux/WindowsでもPythonなしで動くよ) | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="awsサービスの設定開始"&gt;AWSサービスの設定開始&lt;/h2&gt;&#10;&lt;h3 id="aws-s3バケットの作成"&gt;AWS S3バケットの作成&lt;/h3&gt;&#10;&lt;p&gt;S3バケットの作成やファイルのアップロードをコマンドラインから操作する方法は、 以下のエントリで整理済み。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/02/24/100022"&gt;AWSのS3バケットの作成、削除、タグ付与、ポリシー設定をコマンドラインから実行する | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;参考にしながら設定を進める。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# バケットを作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws s3 mb s3://g-trigger-bucket&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# バケットができたかを確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws s3 ls&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2019-02-25 07:32:57 g-trigger-bucket&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="aws-lambdaファンクションの作成"&gt;AWS Lambdaファンクションの作成&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt; ファンクションの作成や呼び出しをコマンドラインから操作する方法は、 以下のエントリで整理済み。&lt;/p&gt;</description></item><item><title>Redhat系Linux（CentOS7）にVim8をインストールする方法いろいろ</title><link>https://genzouw.com/entry/2019/02/27/075021/1006/</link><pubDate>Wed, 27 Feb 2019 07:50:21 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/27/075021/1006/</guid><description>&lt;p&gt;Vim8のインストール方法について。&lt;/p&gt;&#10;&lt;p&gt;未だにCentOS7系でデフォルトインストールされるVimが7系なので、8系のインストール方法についてまとめてみました。&#10;是非Vim8と、8系でしか使えないプラグインを使ってみてほしいです。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;クリーンな検証環境を構築するために、 &lt;strong&gt;Docker&lt;/strong&gt; を使いました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※もちろんクリーンなCentOS環境を再構築できるなら別の方法でもよいが、これが一番手軽かつ安価なんですよね。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ docker run --rm -it centos:centos7 bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="yumをそのまま使うvim7がインストールされてしまう"&gt;YUMをそのまま使う（Vim7がインストールされてしまう）&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yum install -y vim&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vim --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VIM - Vi IMproved 7.4 &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2013&lt;/span&gt; Aug 10, compiled Oct &lt;span class="m"&gt;30&lt;/span&gt; &lt;span class="m"&gt;2018&lt;/span&gt; 19:56:57&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Included patches: 1-160, 399, 402-403, &lt;span class="m"&gt;1099&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Modified by &amp;lt;bugzilla@redhat.com&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Compiled by &amp;lt;bugzilla@redhat.com&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Huge version without GUI. Features included &lt;span class="o"&gt;(&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt; or not &lt;span class="o"&gt;(&lt;/span&gt;-&lt;span class="o"&gt;)&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ソースコードをビルドvim8"&gt;ソースコードをビルド(Vim8)&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yum install -y &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; git &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; make &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; gcc &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ncurses-devel&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="o"&gt;[&lt;/span&gt; ! -d &lt;span class="s2"&gt;&amp;#34;/usr/local/src&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir -p &lt;span class="s2"&gt;&amp;#34;/usr/local/src&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/usr/local/src&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone https://github.com/vim/vim.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /usr/local/src/vim&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./configure &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --disable-selinux &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --enable-cscope &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --enable-fontset &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --enable-gpm &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --enable-multibyte &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --enable-rubyinterp &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --enable-xim&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ make&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ make install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;バージョン確認&lt;/p&gt;</description></item><item><title>AWSのLambdaファンクションの作成、実行、削除をコマンドラインから操作する</title><link>https://genzouw.com/entry/2019/02/26/075959/1004/</link><pubDate>Tue, 26 Feb 2019 07:59:59 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/26/075959/1004/</guid><description>&lt;p&gt;&lt;strong&gt;S3にファイルがアップロードされたことを検知して、処理を行うような仕組みを作り必要がありました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;処理の部分のロジックはまだ未決定事項が多いため、とりあえずは&#10;&lt;strong&gt;Lambdaファンクション呼び出しからCloudWatchLogへログを吐き出すところまでの仕組みを作成してみることにしました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;※作成したLambdaファンクションをS3へのファイルアップロードのつなぎこみは次回調査&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="aws-cli-awsコマンドの利用可能な環境づくり"&gt;&lt;code&gt;aws-cli&lt;/code&gt; (AWSコマンドの利用可能な環境づくり)&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/02/23/133626"&gt;AWSコマンドを使うための環境をDockerを使って構築(Mac/Linux/WindowsでもPythonなしで動くよ) | ゲンゾウ用ポストイット&lt;/a&gt; で環境構築済み。&lt;/p&gt;&#10;&lt;h2 id="aws-lambdaファンクションの作成"&gt;AWS Lambdaファンクションの作成&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;AWS Lambda&lt;/strong&gt; については以下の記事がわかりやすかった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://codezine.jp/article/detail/8446"&gt;初めてのAWS Lambda　～AWS Lambdaで始めるイベントドリブンアプリケーション (1/5)：CodeZine（コードジン）&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Lambda作成にあたってやらないといけないことは以下の2つ。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Lambdaファンクションの実行ロールを作成する&lt;/li&gt;&#10;&lt;li&gt;Lambdaファンクションを作成する&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="実行ロールの作成"&gt;実行ロールの作成&lt;/h3&gt;&#10;&lt;p&gt;まずは初期ポリシーファイルを作成します。&#10;Lambdaファンクションの実行に関するフル権限を与えました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイル名は何でも良い&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;logging-function-role-policy.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Version&amp;#34;: &amp;#34;2012-10-17&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Statement&amp;#34;: [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Effect&amp;#34;: &amp;#34;Allow&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Principal&amp;#34;: {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Service&amp;#34;: &amp;#34;lambda.amazonaws.com&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; },&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;Action&amp;#34;: &amp;#34;sts:AssumeRole&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;作成したポリシーファイルを元に、ロールを作成。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;--role-name&lt;/code&gt; オプションに今回作成するロール名を指定します。&#10;&lt;code&gt;--assume-role-policy-document&lt;/code&gt; オプションに先ほど作成したポリシーファイルを指定します。 &lt;code&gt;file://&lt;/code&gt; プロトコルの指定は必須。これなしだとエラーになってしまうので注意しましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws iam create-role &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --role-name logging-function-role &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --assume-role-policy-document file://logging-function-role-policy.json&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Role&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Path&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;RoleName&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;logging-function-role&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;RoleId&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;AROAI5BO3KLUTIOT4H4A4&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Arn&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;arn:aws:iam::642942901536:role/logging-function-role&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;CreateDate&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;2019-02-25T03:49:50Z&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;AssumeRolePolicyDocument&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Version&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;2012-10-17&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Statement&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Effect&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;Allow&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Principal&amp;#34;&lt;/span&gt;: &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Service&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;lambda.amazonaws.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Action&amp;#34;&lt;/span&gt;: &lt;span class="s2"&gt;&amp;#34;sts:AssumeRole&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行時に出力されたJSONメッセージのうち、 &lt;strong&gt;&lt;code&gt;Arn&lt;/code&gt; の部分 ( &lt;code&gt;arn:aws:iam::642942901536:role/logging-function-role&lt;/code&gt; ) は後々必要となるためメモしておきます&lt;/strong&gt; 。&lt;/p&gt;</description></item><item><title>VimからWordPressのエントリを投稿する方法</title><link>https://genzouw.com/entry/2019/02/25/202445/992/</link><pubDate>Mon, 25 Feb 2019 20:24:45 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/25/202445/992/</guid><description>&lt;p&gt;僕がエントリを投稿するときはいつも &lt;strong&gt;Vim&lt;/strong&gt; で下書きした内容をクリップボードに貼り付け、WordPress の新規投稿ページに貼り付ける、という流れで投稿していますが、 これを &lt;strong&gt;Vim&lt;/strong&gt; の世界だけで完結できないかと思い調べてみました。&lt;/p&gt;&#10;&lt;h2 id="wordpressvim"&gt;WordPress.vim&lt;/h2&gt;&#10;&lt;p&gt;便利そうな Vim のプラグインを発見&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/vim-scripts/VimRepress"&gt;GitHub - vim-scripts/VimRepress: Plugin for managing wordpress blog from Vim.&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="機能概要"&gt;機能概要&lt;/h2&gt;&#10;&lt;p&gt;一部抜粋。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;This is a mirror of &lt;a href="http://www.vim.org/scripts/script.php?script_id=3510"&gt;http://www.vim.org/scripts/script.php?script_id=3510&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;VimRepress is a plugin for managing wordpress blog from Vim, a rewritten of vimscript #1953 , which is broken for years.&lt;/p&gt;&#10;&lt;p&gt;Now VimRepress lives with more powerful again.&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;REQUIREMENT&lt;/em&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Vim 7.3+ with python 2.6/2.7 support&lt;/li&gt;&#10;&lt;li&gt;Python Environment matched wtih Vim&amp;rsquo;s support&lt;/li&gt;&#10;&lt;li&gt;python-markdown/python-markdown2 installed&lt;/li&gt;&#10;&lt;li&gt;wordpress 3.0.0 +&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;翻訳してみました。&lt;/p&gt;</description></item><item><title>AWSのS3バケットの作成、削除、タグ付与、ポリシー設定をコマンドラインから操作する</title><link>https://genzouw.com/entry/2019/02/24/100022/968/</link><pubDate>Sun, 24 Feb 2019 10:00:22 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/24/100022/968/</guid><description>&lt;p&gt;S3のバケット作成、削除、ポリシー設定をWeb上から操作することが多いです。&#10;Web操作の解説も多いです。&lt;/p&gt;&#10;&lt;p&gt;でも、コマンドラインからの実行を解説しているケースはさほど多くないですね。。&lt;/p&gt;&#10;&lt;p&gt;S3はバックアップデータ置き場、ログ置き場として使うことが多いが、特に検証時に作っては消し、また作るを繰り返す&amp;hellip;&#10;繰り返しが疲れてきたのでコマンドラインでのやり方をまとめてみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ここではよく使用される &lt;code&gt;aws s3&lt;/code&gt; コマンドではなく &lt;code&gt;aws s3api&lt;/code&gt; コマンドについてできるだけ触れてみます。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="aws-cli-awsコマンドの利用可能な環境づくり"&gt;&lt;code&gt;aws-cli&lt;/code&gt; (AWSコマンドの利用可能な環境づくり)&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/02/23/133626"&gt;AWSコマンドを使うための環境をDockerを使って構築(Mac/Linux/WindowsでもPythonなしで動くよ) | ゲンゾウ用ポストイット&lt;/a&gt; を参照。&lt;/p&gt;&#10;&lt;p&gt;上記記事では Mac、Linux、Windowsの環境の差異を無視できるよう、またPythonなしでも動作するように &lt;strong&gt;Docker&lt;/strong&gt; を利用しました。&lt;/p&gt;&#10;&lt;h2 id="s3バケットの作成--aws-s3api-create-bucket--aws-s3-mb-"&gt;S3バケットの作成 ( &lt;code&gt;aws s3api create-bucket&lt;/code&gt; / &lt;code&gt;aws s3 mb&lt;/code&gt; )&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;aws s3api create-bucket&lt;/code&gt; コマンドを使う。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/cli/latest/reference/s3api/create-bucket.html"&gt;create-bucket — AWS CLI 1.16.111 Command Reference&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ここでは &lt;strong&gt;genzouw-test-bucket&lt;/strong&gt; というバケット名で作成してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ aws s3api create-bucket &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --bucket genzouw-test-bucket &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --create-bucket-configuration &lt;span class="s2"&gt;&amp;#34;LocationConstraint=ap-northeast-1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 環境変数 AWS_DEFAULT_REGION が設定されていれば、以下のコマンドでも良い。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## aws s3api create-bucket \&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## --bucket genzouw-test-bucket \&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## --create-bucket-configuration &amp;#34;LocationConstraint=${AWS_DEFAULT_REGION}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;何度か &lt;code&gt;--create-bucket-configuration&lt;/code&gt; オプション無しで実行してみたが、以下のようなエラーが発生しました。&lt;br&gt;&#10;&lt;code&gt;AWS_DEFAULT_REGION&lt;/code&gt; の設定があったとしても指定が必要な模様。&lt;/p&gt;</description></item><item><title>AWSコマンドを使うための環境をDockerを使って構築(Mac/Linux/WindowsでもPythonなしで動くよ)</title><link>https://genzouw.com/entry/2019/02/23/133626/963/</link><pubDate>Sat, 23 Feb 2019 13:36:26 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/23/133626/963/</guid><description>&lt;p&gt;AWSコマンドを実行するための環境づくりをしたいが、自前のMac環境だけでなく、Windows環境のことも考慮して構築したいですよね。&lt;/p&gt;&#10;&lt;p&gt;Dcokerを作って実現するための手順をまとめてみました。&lt;/p&gt;&#10;&lt;p&gt;Dockerを使えれば、MacだろうがWindowsだろうがLinuxだろうが同じ手順で &lt;code&gt;aws-cli&lt;/code&gt; 実行の環境が構築可能です。&lt;/p&gt;&#10;&lt;h2 id="事前にdockerのインストールが必要"&gt;事前にDockerのインストールが必要&lt;/h2&gt;&#10;&lt;p&gt;こめんなさい。事前にDockerのインストールはされていることが前提です。&lt;br&gt;&#10;こちらはネット上に情報が転がっているので独力で頑張ってみてください。&lt;/p&gt;&#10;&lt;h2 id="docker-hubから適当なコンテナを探す"&gt;&amp;ldquo;Docker Hub&amp;quot;から適当なコンテナを探す&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://hub.docker.com"&gt;Docker Hub&lt;/a&gt; から適当な既存のコンテナを探しました。&lt;/p&gt;&#10;&lt;p&gt;以下のコンテナがダンロード数も多く、比較的頻繁に更新されてそうでした。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://hub.docker.com/r/mesosphere/aws-cli/"&gt;mesosphere/aws-cli&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="dockerを使った-aws-cli-を早速試してみる"&gt;Dockerを使った &lt;code&gt;aws-cli&lt;/code&gt; を早速試してみる&lt;/h2&gt;&#10;&lt;p&gt;実行のためには、以下の３つの情報が必要。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;id&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;key&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_DEFAULT_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;region&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;環境変数として定義して &lt;code&gt;export&lt;/code&gt; すれば利用可能ということで早速試してみます。&lt;/p&gt;&#10;&lt;h3 id="iam管理コンソールページからキー情報を取得"&gt;IAM管理コンソールページから、キー情報を取得&lt;/h3&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://console.aws.amazon.com/iam/home?#/users"&gt;IAM Management Console&lt;/a&gt; のページを開く。&lt;/li&gt;&#10;&lt;li&gt;左サイドのメニューから「ユーザー」を選択すれば、現在登録されているIAMユーザの一覧が表示されます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;既存のものを使いたい&lt;/strong&gt; 場合はそれをクリック。 &lt;strong&gt;新しいものを使いたい&lt;/strong&gt; 場合は「ユーザーを追加」ボタンをクリック。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;今回は既存のものを利用したいので、クリックしました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1iW4-BUksg2tsFRCbfj0nKqDjd8iU6LhQ" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「アクセスキー」&lt;/strong&gt; は最大2つまで登録できます。今回は既存のものがすでに登録してあったが &lt;strong&gt;忘れてしまったため&lt;/strong&gt; 新しく作成。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1Hjwi-Jq8TgpzKQ5QSaKOjPx2xzzmtWqj" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;ボタンを押すと即座に新しいアクセスキーが作成されます。&#10;このタイミングでしっかりメモしておかないと2度と &lt;strong&gt;シークレットアクセスキー&lt;/strong&gt; は確認できないので、メモしておきます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1nGF_SZAyif8LFDaoVGAyy4RPPGEAkWQ8" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="環境変数を設定"&gt;環境変数を設定&lt;/h3&gt;&#10;&lt;p&gt;Bash（ Windowsの方はコマンドプロンプトかPowerShell ）を開いて、以下の環境変数を設定します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_ACCESS_KEY_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;先程のページのアクセスキーID&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_SECRET_ACCESS_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;先程のページのシークレットアクセスキー&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;AWS_DEFAULT_REGION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ap-northeast-1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;AWS_DEFAULT_REGION&lt;/code&gt; は一番良く使うデフォルトのリージョンを指定する必要があります。（ &lt;strong&gt;僕の場合は東京リージョン&lt;/strong&gt; ）&#10;AWSの以下のページから自分がよく使うものを１つ選んで設定すればよいです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html"&gt;https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Bash起動時に自動的に環境変数が設定されるように、 &lt;code&gt;~/.bashrc&lt;/code&gt; ファイルに追記しておくとよいでしょう。&lt;/p&gt;&#10;&lt;h2 id="ようやく-aws-cli-の実行"&gt;ようやく &lt;code&gt;aws-cli&lt;/code&gt; の実行&lt;/h2&gt;&#10;&lt;p&gt;早速 Docker を使った &lt;code&gt;aws-cli&lt;/code&gt; の実行。&lt;/p&gt;</description></item><item><title>シェルを使ってMySQLの全`table create statement`を出力する方法</title><link>https://genzouw.com/entry/2019/02/22/080511/951/</link><pubDate>Fri, 22 Feb 2019 08:05:11 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/22/080511/951/</guid><description>&lt;p&gt;&lt;a href="https://qiita.com/HAZI/items/fac6d0b081f9a793e386"&gt;Qiita&lt;/a&gt; の記事に興味があったので。&lt;/p&gt;&#10;&lt;p&gt;MySQLに接続し、 &lt;code&gt;show create table colors;&lt;/code&gt; というコマンドを実行すると &lt;strong&gt;colors&lt;/strong&gt; テーブルの &lt;code&gt;create table&lt;/code&gt; 文が出力されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# USER=testuser / password=test9ass / DB=testdb で接続&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mysql -u testuser -ptest9ass testdb -e &lt;span class="s2"&gt;&amp;#34;show create table colors \G&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Warning: Using a password on the &lt;span class="nb"&gt;command&lt;/span&gt; line interface can be insecure.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*************************** 1. row ***************************&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Table: colors&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Create Table: CREATE TABLE &lt;span class="sb"&gt;`&lt;/span&gt;colors&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;code&lt;span class="sb"&gt;`&lt;/span&gt; varchar&lt;span class="o"&gt;(&lt;/span&gt;255&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;name&lt;span class="sb"&gt;`&lt;/span&gt; varchar&lt;span class="o"&gt;(&lt;/span&gt;255&lt;span class="o"&gt;)&lt;/span&gt; NOT NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;created_at&lt;span class="sb"&gt;`&lt;/span&gt; datetime DEFAULT NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;updated_at&lt;span class="sb"&gt;`&lt;/span&gt; datetime DEFAULT NULL,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; PRIMARY KEY &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;code&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; UNIQUE KEY &lt;span class="sb"&gt;`&lt;/span&gt;uq_colors_code&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;code&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; UNIQUE KEY &lt;span class="sb"&gt;`&lt;/span&gt;uq_colors_name&lt;span class="sb"&gt;`&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;name&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;ENGINE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;InnoDB DEFAULT &lt;span class="nv"&gt;CHARSET&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;utf8&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;僕だったらどうやるかなと思ってシェルスクリプトを書いてみました。&lt;/p&gt;</description></item><item><title>シェルスクリプトでディレクトリ配下を検索した結果を、フォルダ階層を保ったまま別ディレクトリにコピーする</title><link>https://genzouw.com/entry/2019/02/20/231809/927/</link><pubDate>Wed, 20 Feb 2019 23:18:09 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/20/231809/927/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;タイトルがわかりにくいので、早速、具体的な例を上げて説明します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;EC-CUBEのソースコードを拝借し、 &lt;code&gt;Tag&lt;/code&gt; という文字を名前に含むファイルを、階層構造を保ったまま別のフォルダ ( &lt;code&gt;/tmp/ec-cube&lt;/code&gt; ) にコピーしてみます。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2019&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ライセンス GPLv3+: GNU GPL バージョン &lt;span class="m"&gt;3&lt;/span&gt; またはそれ以降 &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone https://github.com/EC-CUBE/ec-cube.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxrwx--- &lt;span class="m"&gt;40&lt;/span&gt; genzouw staff &lt;span class="m"&gt;1280&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt; 22:43 ec-cube/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="やりかた"&gt;やりかた&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;Tag&lt;/code&gt; という文字を名前に含むファイルは以下のコマンドで見つけられます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一部のファイルだけに絞り込まれて出力されている&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## -type f =&amp;gt; ファイルのみを対象。ディレクトリは非対称。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## -name =&amp;gt; Tagという文字を含むもののみを対象&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ find ec-cube -type f -name &lt;span class="s1"&gt;&amp;#39;*Tag*&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ec-cube/tests/Eccube/Tests/Web/Admin/Product/TagContorllerTest.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ec-cube/tests/Eccube/Tests/DependencyInjection/Compiler/AutoConfigurationTagPassTest.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ec-cube/src/Eccube/Form/Type/Admin/ProductTag.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ec-cube/src/Eccube/Form/Type/Admin/TagType.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ec-cube/src/Eccube/Repository/ProductTagRepository.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ec-cube/src/Eccube/Repository/TagRepository.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ec-cube/src/Eccube/Entity/ProductTag.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ec-cube/src/Eccube/Entity/Tag.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ec-cube/src/Eccube/Controller/Admin/Product/TagController.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ec-cube/src/Eccube/DependencyInjection/Compiler/AutoConfigurationTagPass.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これを階層構造を保ったまま &lt;code&gt;/tmp/ec-cube&lt;/code&gt; にコピーするには、 &lt;code&gt;tar&lt;/code&gt; コマンドを使います。&lt;/p&gt;</description></item><item><title>気象庁の過去の時間帯別天気情報をスクレイピングするプログラム</title><link>https://genzouw.com/entry/2019/02/19/205338/914/</link><pubDate>Tue, 19 Feb 2019 20:53:38 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/19/205338/914/</guid><description>&lt;p&gt;ずいぶん昔に作ったものだけどどうぞ。&#10;csvで出力されるんだったと思います。&lt;/p&gt;&#10;&lt;p&gt;*　https://github.com/genzouw/collect_weather_data&lt;/p&gt;&#10;&lt;p&gt;githubトップページの内容を抜粋。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h1 id="collect_weather_data"&gt;collect_weather_data&lt;/h1&gt;&#10;&lt;p&gt;気象庁の過去の時間帯別天気情報をスクレイピングするプログラムです。&lt;/p&gt;&#10;&lt;h2 id="set-up"&gt;Set up&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone https://github.com/genzouw/collect_weather_data.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; collect_weather_data/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ composer install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="execution"&gt;Execution&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# from 1980-01-01 to yesterday&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./main.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# from 1990-12-31 to yesterday&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./main.php &lt;span class="s1"&gt;&amp;#39;1990-12-31&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# from 1990-12-31 to 1991-01-02&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./main.php &lt;span class="s1"&gt;&amp;#39;1990-12-31&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1991-01-02&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Bashシェルスクリプトで浮動小数点計算（答えが小数となる除算）</title><link>https://genzouw.com/entry/2019/02/18/122158/889/</link><pubDate>Mon, 18 Feb 2019 12:21:58 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/18/122158/889/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Bashの組み込みの数値演算機能では、少数が取り扱えません。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;Z&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# こちらは問題ない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;X/Y&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# これでも結果はおなじ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;&lt;span class="nv"&gt;$X&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$Y&lt;/span&gt;&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# こちらの結果がおかしい&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;X/Z&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;echo $((X/Z))&lt;/code&gt; の実行結果は &lt;strong&gt;2.5&lt;/strong&gt; となってほしいが、小数点以下が切り捨てられてしまいます。&lt;/p&gt;&#10;&lt;p&gt;対処方法はいくつかあります。&lt;/p&gt;&#10;&lt;h2 id="bc-コマンド-を使う"&gt;&lt;code&gt;bc&lt;/code&gt; コマンド を使う&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# このままだと変わりなし&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bc &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$X&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$Z&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 少数第何位まで計算するかを指定&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bc &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;scale=4; &lt;/span&gt;&lt;span class="nv"&gt;$X&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$Z&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2.5000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="c1"&gt;# 無限循環小数&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bc &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;scale=4; &lt;/span&gt;&lt;span class="nv"&gt;$X&lt;/span&gt;&lt;span class="s2"&gt;/3&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3.3333&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;問題は &lt;code&gt;scale&lt;/code&gt; の値をいくつにするかを予め知っておかないといけないこと。&#10;&lt;em&gt;卵が先か、鶏が先か。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;bc -l&lt;/code&gt; でもっとよしなにしてくれるようです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bc -l &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$X&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$Z&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2.50000000000000000000&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bc -l &lt;span class="o"&gt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$X&lt;/span&gt;&lt;span class="s2"&gt;/3&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3.33333333333333333333&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;割り切れたのかよくわかりませんね。&lt;/p&gt;&#10;&lt;h2 id="awk-コマンドを使う"&gt;&lt;code&gt;awk&lt;/code&gt; コマンドを使う&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;awk&lt;/code&gt; 最強？&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ awk &lt;span class="s2"&gt;&amp;#34;BEGIN { print &lt;/span&gt;&lt;span class="nv"&gt;$X&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;$Z&lt;/span&gt;&lt;span class="s2"&gt; }&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2.5&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 循環小数が何故切れたのかは不明&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ awk &lt;span class="s2"&gt;&amp;#34;BEGIN { print 10/3 }&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3.33333&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;循環小数はなぜ切れた。&lt;/p&gt;</description></item><item><title>AWS Transfer for SFTP - Amazon S3と連携したマネージドなSFTPサービス</title><link>https://genzouw.com/entry/2019/02/16/225318/877/</link><pubDate>Sat, 16 Feb 2019 22:53:18 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/16/225318/877/</guid><description>&lt;p&gt;SFTPへのPOST機能しか持ち合わせていないようなサービスをどうしても使いたい場合に利用できそうなので、調べてみました。&lt;/p&gt;&#10;&lt;h2 id="概要"&gt;概要&lt;/h2&gt;&#10;&lt;p&gt;AWSのブログサイトより引用&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://aws.amazon.com/jp/blogs/news/new-aws-transfer-for-sftp-fully-managed-sftp-service-for-amazon-s3/"&gt;新発表 – AWS Transfer for SFTP – Amazon S3と連携したマネージドなSFTPサービス | Amazon Web Services ブログ&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;SFTP（Secure File Transfer Protocol） は、長年に渡って使用されてきたデータ処理やパートナー連携の一部として、現在でも多くの組織で利用されています。&#10;このようなシステムを「レガシー」という言葉で片付けてしまうのは簡単ですが、現実には、今後も長期間に渡ってSFTPは利用され続けるでしょう。&#10;そこで私達は、このようなワークフローを持つお客様が、スムーズかつ、大きな変更を伴わずにクラウド環境に移行できるようなお手伝いをしたいと思います。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;SFTP 経由で Amazon S3 と直接ファイル転送できます。&lt;/p&gt;&#10;&lt;p&gt;( &lt;strong&gt;SFTP&lt;/strong&gt; = &lt;em&gt;Secure Shell File Transfer Protocol の略称で、インターネット経由の安全なデータ転送に使用されるネットワークプロトコル。&lt;/em&gt; )&lt;/p&gt;&#10;&lt;p&gt;こちらのサービスを利用しない場合、既存サービスとS3の間にSFTPサーバを立てて、転送する仕組みを構築しないといけない。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;[既存サービス(SFTP POSTのみ可能)] ===&amp;gt; 【AWS Transfer for SFTP】 ===&amp;gt; [AWS S3]&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="利用するための大まかな手順"&gt;利用するための大まかな手順&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;サーバーを作成&lt;/li&gt;&#10;&lt;li&gt;SFTP接続用のユーザアカウントをセットアップ&#10;&lt;ul&gt;&#10;&lt;li&gt;ひとつまたは複数のAmazon Simple Storage Service（S3）バケットと関連付ける&lt;/li&gt;&#10;&lt;li&gt;ssh接続用の公開鍵を作成し、アップロードする&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="作業開始"&gt;作業開始&lt;/h2&gt;&#10;&lt;h3 id="サービスページを開く"&gt;サービスページを開く&lt;/h3&gt;&#10;&lt;p&gt;マネージメントコンソールの「サービスを検索する」の欄に &lt;strong&gt;transfer&lt;/strong&gt; と入力すれば見つかる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://drive.google.com/uc?usp=sharing&amp;amp;export=view&amp;amp;id=1mXRiFXxyCEkTAs94vb7wIOZxcM7T9nHN" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;早速開いてみます。&lt;/p&gt;&#10;&lt;h3 id="iamユーザで-aws-transfer-コンソールページが開けない"&gt;IAMユーザで &amp;ldquo;AWS Transfer&amp;rdquo; コンソールページが開けない。&lt;/h3&gt;&#10;&lt;p&gt;パーミッションの設定がまずいのか、新規に作成した &lt;strong&gt;IAMユーザ&lt;/strong&gt; では &amp;ldquo;AWS Transfer&amp;rdquo; コンソールページが開けない。&lt;/p&gt;</description></item><item><title>シェルスクリプトのコードを整形してくれるツール `shfmt`</title><link>https://genzouw.com/entry/2019/02/15/085003/874/</link><pubDate>Fri, 15 Feb 2019 08:50:03 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/15/085003/874/</guid><description>&lt;p&gt;シェルスクリプトでコーディングする際に使っているツールを紹介。&#10;( とりあえず殴り書きして、コードフォーマットツールに食わせて整形します。 )&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/mvdan/sh"&gt;GitHub - mvdan/sh: A shell parser, formatter, and interpreter (POSIX/Bash/mksh)&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="必要なもの"&gt;必要なもの&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://golang.org/"&gt;Go&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Macなら &lt;code&gt;brew install golang&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;CentOSなら &lt;code&gt;yum install golang&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="インストール方法"&gt;インストール方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/mvdan/sh#shfmt"&gt;Gihtubのshfmtトップページ&lt;/a&gt; にインストール方法が書かれています。&lt;/p&gt;&#10;&lt;p&gt;2019-02-15現在、 &lt;code&gt;go&lt;/code&gt; コマンドが使えれば、以下のコマンドだけでインストールされます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ go get -u github.com/mvdan/sh/cmd/shfmt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正常にインストールされていれば、以下のフォルダにコマンドがインストールされています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 僕の環境&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# HOMEディレクトリ配下にコマンドがインストールされている&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls .go/bin/shfmt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.go/bin/shfmt*&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 頻繁に使うので、 `$HOME/.go/bin` にパスを通しておく&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;export PATH=&amp;#34;$PATH:$HOME/.go/bin&amp;#34;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# コマンドが実行できるか確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ shfmt --help&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;※ちなみに、CentOS7系サーバでセットアップを行うと、 &lt;code&gt;$HOME/.go&lt;/code&gt; ではなく &lt;code&gt;$HOME/go&lt;/code&gt; ディレクトリにコマンドがインストールされます。なぜパスが違う？？&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>シェルスクリプトで変数の先頭・末尾のtrim処理いろいろ</title><link>https://genzouw.com/entry/2019/02/14/081819/850/</link><pubDate>Thu, 14 Feb 2019 08:18:19 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/14/081819/850/</guid><description>&lt;p&gt;ユーザの入力情報を取り扱うときには、誤ってスペースを入力されたことを考慮した対策が必要です。&#10;入力情報を変数に代入していた場合は先頭・末尾のtrim処理を行っておくと良いです。&lt;/p&gt;&#10;&lt;p&gt;Bashシェルスクリプトでtrimを実行する方法はいくつかあるので取り上げてみました。&lt;/p&gt;&#10;&lt;h2 id="前提"&gt;前提&lt;/h2&gt;&#10;&lt;p&gt;入力情報は &lt;code&gt;INPUT&lt;/code&gt; という変数に格納しておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; genzouw postit &amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# スペースがあることがわかるようにカッコを付与しています&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;]&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; genzouw postit &lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;変数の前後から不要なスペースを除去し、以下のように出力されるようにしたいと思います。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;genzouw postit&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="trimの方法1sed"&gt;trimの方法1：sed&lt;/h2&gt;&#10;&lt;p&gt;僕の中ではセオリー。&lt;/p&gt;&#10;&lt;p&gt;余談ですが、 &lt;code&gt;sed&lt;/code&gt; が使えると &lt;code&gt;head&lt;/code&gt; や &lt;code&gt;tail&lt;/code&gt; や &lt;code&gt;tr&lt;/code&gt; も代用できるし非常に便利です。万能ナイフ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/^ *\| *$//&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw postit&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;変数に代入して使うこともできます。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;$ X=&amp;#34;$(echo &amp;#34;${INPUT}&amp;#34; | sed &amp;#39;s/^ *\| *$//&amp;#39;)&amp;#34;&#10;&#10;$ echo &amp;#34;${X}&amp;#34;&#10;genzouw postit&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="trimの方法2単純にechoする"&gt;trimの方法2：単純にechoする&lt;/h2&gt;&#10;&lt;p&gt;ただechoに食わせるだけ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw postit&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;簡単でよいが、問題はあります。&#10;中央部分のスペースが1つにマージされてしまいます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;INPUT2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; xxx yyy &amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INPUT2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxx yyy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="trimの方法3xargsに食わせる"&gt;trimの方法3：xargsに食わせる&lt;/h2&gt;&#10;&lt;p&gt;実は、 &lt;strong&gt;方法2&lt;/strong&gt; と大きな違いはない。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INPUT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; xargs &lt;span class="nb"&gt;echo&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw postit&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="trimの方法4bash組み込みの変数参照機能を使う"&gt;trimの方法4：Bash組み込みの変数参照機能を使う&lt;/h2&gt;&#10;&lt;p&gt;Bashの組み込み機能として、変数参照時に先頭あるいは末尾から特定の文字を除去する機能があります。&#10;ただし、1スペースずつしか除外できません。&lt;/p&gt;</description></item><item><title>CSVデータに対してSQLのwhere、order by、group by、joinができる "q" コマンド（活用編）</title><link>https://genzouw.com/entry/2019/02/13/083930/824/</link><pubDate>Wed, 13 Feb 2019 08:39:30 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/13/083930/824/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;以下のエントリの続き。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/02/12/083034/798/"&gt;CSV データに対して SQL の where、order by、group by、join ができる &amp;ldquo;q&amp;rdquo; コマンド（導入編） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;前回は &lt;code&gt;q&lt;/code&gt; コマンドの導入とテストデータ作成（ &lt;em&gt;年次別にみた出生数・率（人口千対）・出生性比及び合計特殊出生率&lt;/em&gt; ）まで。&lt;/p&gt;&#10;&lt;p&gt;今回は実際に &lt;code&gt;q&lt;/code&gt; コマンドでデータを操作してみます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.17&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2019&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /etc/os-release &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;20.04.3 LTS (Focal Fossa)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ q --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;q version 3.1.6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Python: 3.8.11 &lt;span class="o"&gt;(&lt;/span&gt;default, Jul &lt;span class="m"&gt;24&lt;/span&gt; 2021, 23:08:48&lt;span class="o"&gt;)&lt;/span&gt; // &lt;span class="o"&gt;[&lt;/span&gt;Clang 12.0.1 &lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; 2012-2021 Harel Ben-Attia &lt;span class="o"&gt;(&lt;/span&gt;harelba@gmail.com, @harelba on twitter&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://harelba.github.io/q/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="単純なデータの出力"&gt;単純なデータの出力&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;CSV ファイルを DB のテーブルと見直したクエリを実行することができます。&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;from&lt;/code&gt; 句に CSV ファイルを指定&lt;/li&gt;&#10;&lt;li&gt;今回は各列がカンマ ( &lt;strong&gt;,&lt;/strong&gt; ) で区切られているので、デリミタとして &lt;strong&gt;,&lt;/strong&gt; を指定します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ q -d , &lt;span class="s2"&gt;&amp;#34;select * from mb010000-utf8.csv&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1899,1386981,713442,673539,32.0,105.9,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1900,1420534,727916,692618,32.4,105.1,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1901,1501591,769494,732097,33.9,105.1,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1902,1510835,773296,737539,33.6,104.8,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1903,1489816,763806,726010,32.7,105.2,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1904,1440371,738230,702141,31.2,105.1,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1905,1452770,735948,716822,31.2,102.7,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1906,1394295,726155,668140,29.6,108.7,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1907,1614472,818114,796358,34.0,102.7,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1908,1662815,850209,812606,34.7,104.6,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1909,1693850,863855,829995,34.9,104.1,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1910,1712857,872779,840078,34.8,103.9,...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...&lt;span class="o"&gt;(&lt;/span&gt;省略&lt;span class="o"&gt;)&lt;/span&gt;...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ダウンロードしてきたデータの最終列がよくわからない。なぜドット。。。&#10;もともとのデータの 1〜9 行目を見る限り、列情報の意味は左から以下のようになっているようです。&lt;/p&gt;</description></item><item><title>CSVデータに対してSQLのwhere、order by、group by、joinができる `q` コマンド（導入編）</title><link>https://genzouw.com/entry/2019/02/12/083034/798/</link><pubDate>Tue, 12 Feb 2019 08:30:34 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/12/083034/798/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;年度末が近づいてきて、仕事でも CSV データをこねくり回す機会が増えてきました。&#10;（ログデータ集計、デバッグだけでなく、確定申告の金額計算など）&lt;/p&gt;&#10;&lt;p&gt;CUI 好きの自分も &lt;code&gt;grep&lt;/code&gt; / &lt;code&gt;sed&lt;/code&gt; / &lt;code&gt;sort&lt;/code&gt; / &lt;code&gt;uniq&lt;/code&gt; / &lt;code&gt;join&lt;/code&gt; / &lt;code&gt;paste&lt;/code&gt; のコマンドを毎回毎回パイプラインでつないでいるのは多少面倒になる。&lt;/p&gt;&#10;&lt;p&gt;CSV データを SQL で操作できればいいのに、と思う人も少なくないはずです。&#10;僕も SQL でデータ操作するほうがなれている人間のひとりです。&lt;/p&gt;&#10;&lt;p&gt;そんな方におすすめなのが、 &lt;a href="https://github.com/harelba/q"&gt;q コマンド&lt;/a&gt; 。名前のせいで &lt;a href="https://www.wdic.org/w/TECH/%E3%82%B0%E3%82%B0%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3"&gt;ググラビリティ&lt;/a&gt; が低いのが難点だがとっても便利。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&lt;a href="https://genzouw.com/entry/2019/02/13/083930/824/"&gt;今回は主に導入方法について紹介し、次回で使い方に触れたいと思います。&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.0.17&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2019&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /etc/os-release &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;20.04.3 LTS (Focal Fossa)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="インストール方法"&gt;インストール方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/harelba/q/blob/master/README.markdown"&gt;Github&lt;/a&gt; の以下のページを参照。OS ごとにインストール方法が記載されています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://harelba.github.io/q/#installation"&gt;Download and Install&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;RedHat 系 OS、Debian 系 OS 向けにそれぞれのインストールパッケージも用意されています。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで大文字&lt;=&gt;小文字の変換方法いろいろ</title><link>https://genzouw.com/entry/2019/02/08/080904/788/</link><pubDate>Fri, 08 Feb 2019 08:09:04 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/08/080904/788/</guid><description>&lt;p&gt;前回 &lt;strong&gt;大文字あるいは小文字専用の変数を作成する方法について&lt;/strong&gt; 触れたので、 &lt;strong&gt;文字列の大文字&amp;lt;=&amp;gt;小文字の変換方法&lt;/strong&gt; について紹介します。&lt;/p&gt;&#10;&lt;h2 id="tr-コマンドを使う方法"&gt;&lt;code&gt;tr&lt;/code&gt; コマンドを使う方法&lt;/h2&gt;&#10;&lt;p&gt;おそらく最も古典的かつベーシックな方法です。&lt;/p&gt;&#10;&lt;h3 id="全文を変換"&gt;全文を変換&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 大文字→小文字&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;[:upper:]&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[:lower:]&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello world!&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 小文字→大文字&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;[:lower:]&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;[:upper:]&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HELLO WORLD!&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="一部変換"&gt;一部変換&lt;/h3&gt;&#10;&lt;p&gt;おそらく &lt;code&gt;tr&lt;/code&gt; を使う方法ではできないのでは？&lt;/p&gt;&#10;&lt;h2 id="sed-コマンドを使う方法"&gt;&lt;code&gt;sed&lt;/code&gt; コマンドを使う方法&lt;/h2&gt;&#10;&lt;p&gt;こちらも比較的よく見る方法です。&#10;ポイントは &lt;code&gt;\L&lt;/code&gt; と &lt;code&gt;\U&lt;/code&gt; 。&#10;置換したい文字列を指定する箇所の先頭に付与すると、 &lt;code&gt;L&lt;/code&gt; の場合には小文字に、 &lt;code&gt;U&lt;/code&gt; の場合には大文字に変換されます。&lt;/p&gt;&#10;&lt;h3 id="全文を変換-1"&gt;全文を変換&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 大文字→小文字&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/.\+/\L\0/&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello world!&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 小文字→大文字&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/.\+/\U\0/&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HELLO WORLD!&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="一部を変換"&gt;一部を変換&lt;/h3&gt;&#10;&lt;p&gt;最初の単語のみに適用。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 大文字→小文字&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/^\(\w\+\)\+/\L\1/&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello world!&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 見にくい場合は拡張正規表現オプションを付けるとよい&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -E &lt;span class="s1"&gt;&amp;#39;s/^(\w+)+/\U\1/&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello World!&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 小文字→大文字&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/^\(\w\+\)\+/\U\1/&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HELLO World!&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## 見にくい場合は拡張正規表現オプションを付けるとよい&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Hello World!&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed -E &lt;span class="s1"&gt;&amp;#39;s/^(\w+)+/\U\1/&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HELLO World!&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="bash-の変数の展開機能を使う"&gt;Bash の変数の展開機能を使う&lt;/h2&gt;&#10;&lt;p&gt;Bash 4.0 以降では、構文として変数の値参照時に大文字&amp;lt;=&amp;gt;小文字の変換が可能です。&#10;デメリットは変数として使うため、一度代入しておかないといけないこと。&#10;&lt;code&gt;while read&lt;/code&gt; ループと組み合わせて使う場合に便利です。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプト上での `read` コマンドの便利な使い方いろいろ</title><link>https://genzouw.com/entry/2019/02/07/080311/775/</link><pubDate>Thu, 07 Feb 2019 08:03:11 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/07/080311/775/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/02/06/081505"&gt;Bashシェルスクリプトで標準入力からの情報を取り扱う &lt;code&gt;read&lt;/code&gt; コマンドと &lt;code&gt;declare&lt;/code&gt; コマンドを組み合わせると便利&lt;/a&gt; で &lt;code&gt;read&lt;/code&gt; コマンドについて触れたついでに、 &lt;code&gt;read&lt;/code&gt; コマンドの便利な使い方にも触れておきます。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2019&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ライセンス GPLv3+: GNU GPL バージョン &lt;span class="m"&gt;3&lt;/span&gt; またはそれ以降 &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="変数をバラす"&gt;変数をバラす&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;read&lt;/code&gt; コマンドは &lt;strong&gt;区切り文字を元に標準入力からのデータをばらして変数に投入してくれる&lt;/strong&gt; という機能があるので、それを上手に使うと変数をバラすのが楽になります。&lt;/p&gt;&#10;&lt;h3 id="例年月日を別の変数に代入する"&gt;例)年、月、日を別の変数に代入する&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;date&lt;/code&gt; コマンドを3回実行すれば取得できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 年、月、日を取得&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;Y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;M&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%m&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認してみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$Y&lt;/span&gt;&lt;span class="s2"&gt; と &lt;/span&gt;&lt;span class="nv"&gt;$M&lt;/span&gt;&lt;span class="s2"&gt; と &lt;/span&gt;&lt;span class="nv"&gt;$D&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2019&lt;/span&gt; と &lt;span class="m"&gt;02&lt;/span&gt; と &lt;span class="m"&gt;07&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;date&lt;/code&gt; コマンドの実行結果を &lt;code&gt;read&lt;/code&gt; コマンドに 食わせることで同じことができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# dateの実行結果を標準入力として渡す&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;read&lt;/span&gt; Y M D &amp;lt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;date +&lt;span class="s1"&gt;&amp;#39;%Y %m %d&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認してみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$Y&lt;/span&gt;&lt;span class="s2"&gt; と &lt;/span&gt;&lt;span class="nv"&gt;$M&lt;/span&gt;&lt;span class="s2"&gt; と &lt;/span&gt;&lt;span class="nv"&gt;$D&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2019&lt;/span&gt; と &lt;span class="m"&gt;02&lt;/span&gt; と &lt;span class="m"&gt;07&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに以下のコマンドではうまくいきません。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで標準入力から配列を生成する "read -a" コマンドが便利</title><link>https://genzouw.com/entry/2019/02/06/081505/765/</link><pubDate>Wed, 06 Feb 2019 08:15:05 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/06/081505/765/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/01/30/081600"&gt;Bash のビルトインコマンド “declare” の使い方紹介 ( その１ )&lt;/a&gt; で &lt;strong&gt;配列型の変数&lt;/strong&gt; について触れました。&lt;/p&gt;&#10;&lt;p&gt;その後 &lt;a href="https://genzouw.com/entry/2019/01/31/080016"&gt;Bash のビルトインコマンド “declare” の使い方紹介(その２)&lt;/a&gt; で &lt;strong&gt;大文字専用の変数&lt;/strong&gt; あるいは &lt;strong&gt;小文字専用の変数&lt;/strong&gt; について取り扱ったので、少しだけ関係する &lt;code&gt;read&lt;/code&gt; ビルトインコマンドについても触れておきます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;read&lt;/code&gt; を使うと、標準入力から読み込んだデータの取り扱いが用意になる場合があります。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="read-ビルトインコマンドとは"&gt;&lt;code&gt;read&lt;/code&gt; ビルトインコマンドとは？&lt;/h2&gt;&#10;&lt;p&gt;特徴を簡単に列挙してみます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;標準入力を読み、一行ずつ読み込む&lt;/li&gt;&#10;&lt;li&gt;終了コードは、行を読み込めたときは &lt;strong&gt;0&lt;/strong&gt; 、 読み込めなかったとき ( EOF も含む ) は &lt;strong&gt;1&lt;/strong&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ループの終了判定に使うことができる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;引数にシェル変数名が指定し、読み込んだ行を変数に格納する&#10;&lt;ul&gt;&#10;&lt;li&gt;行末の改行は削除される&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ベーシックな使い方として、ファイルの内容を１行ずつ読み込む処理として使われます。&#10;&lt;code&gt;while&lt;/code&gt; コマンドと一緒にループ処理を記述する際に使われます。&lt;/p&gt;&#10;&lt;h2 id="事前準備--サンプルデータ作成-"&gt;事前準備 ( サンプルデータ作成 )&lt;/h2&gt;&#10;&lt;p&gt;動作を見ていくために、適当なデータを作成しておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;EOF &amp;gt;&amp;gt; data.csv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;a,b,c&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;d,E,F&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;G,h,i&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;1,2,3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;4,5,X&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイルができたか確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat data.csv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="1-行ずつ読み込み変数に代入"&gt;1 行ずつ読み込み、変数に代入&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;cat&lt;/code&gt; でいいよね、というぐらいに簡単な処理。&lt;/p&gt;</description></item><item><title>Bashのビルトインコマンド"declare"の使い方紹介（変数の global スコープ/参照渡し）</title><link>https://genzouw.com/entry/2019/02/05/075831/756/</link><pubDate>Tue, 05 Feb 2019 07:58:31 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/05/075831/756/</guid><description>&lt;p&gt;またまた以下の内容の続きです。&#10;まだまだ書き足りないけど今回で小休止を入れたいと思います。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/29/081926/668/"&gt;シェルスクリプトサンプルコードでよく見かける typeset や declare ってなに？ | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/30/081600/688/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その１） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/31/080016/694/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その２:大文字小文字の自動変換） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/02/01/081707/733/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その３:読み取り専用） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/02/04/080746/739/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（変数の local スコープ） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/02/04/080746"&gt;前回&lt;/a&gt; 関数内で &lt;code&gt;declare&lt;/code&gt; コマンドを使って定義した変数は、自動的に &lt;strong&gt;local&lt;/strong&gt; スコープになるというところで終わりました。&#10;では、関数内の &lt;strong&gt;local&lt;/strong&gt; スコープ変数をもっと広いスコープにするにはどうしたらよいでしょう？&lt;/p&gt;&#10;&lt;h2 id="-g-オプション"&gt;&lt;code&gt;-g&lt;/code&gt; オプション&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;declare&lt;/code&gt; コマンドのオプションに &lt;code&gt;-g&lt;/code&gt; と言うものがあります。&#10;デフォルトの &lt;code&gt;local&lt;/code&gt; スコープよりさらに広い &lt;code&gt;global&lt;/code&gt; スコープを設定してやることができます。&#10;関数の内部で定義した変数を関数の外部でも利用できるようになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 関数を定義&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;f &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# -gオプションを付与して、globalスコープとする&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;declare&lt;/span&gt; -g -i &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;f: N=&lt;/span&gt;&lt;span class="nv"&gt;$N&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 関数呼び出し前なので空&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;N=&lt;/span&gt;&lt;span class="nv"&gt;$N&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 関数呼び出し。関数内の変数は当然見れる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ f&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;f: &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 関数呼び出し後はglobal変数が関数の外からも見れる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;N=&lt;/span&gt;&lt;span class="nv"&gt;$N&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変数を表示するだけの関数を作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ show_var &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;show_var : N=&lt;/span&gt;&lt;span class="nv"&gt;$N&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 表示させてみる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ show_var&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;show_var : &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 再度定義し直したらどうなるの？&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ f2 &lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;declare&lt;/span&gt; -g -i &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;f2: N=&lt;/span&gt;&lt;span class="nv"&gt;$N&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 上書きできちゃう&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ f2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;f2: &lt;span class="nv"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;関数の外で参照できるだけでなく、他の関数からも参照できるようになります。&#10;けれども、あんまり広いスコープの変数を使うことはないと思います。&lt;/p&gt;</description></item><item><title>Bashのビルトインコマンド `declare` の使い方紹介（変数のlocalスコープ）</title><link>https://genzouw.com/entry/2019/02/04/080746/739/</link><pubDate>Mon, 04 Feb 2019 08:07:46 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/04/080746/739/</guid><description>&lt;p&gt;またまた、以下のエントリの続き。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/29/081926/668/"&gt;シェルスクリプトサンプルコードでよく見かける typeset や declare ってなに？&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/30/081600/688/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その１）&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/31/080016/694/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その２:大文字小文字の自動変換）&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/02/01/081707/733/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その３:読み取り専用）&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;※だんだんシリーズみたいになってきました（笑）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;今回は &lt;a href="https://genzouw.com/entry/2019/02/01/081707/733/"&gt;前回&lt;/a&gt; の続きで、Bash における変数のスコープ（参照可能な範囲）について。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="declare-コマンドで定義した変数は関数の中だけのいのち"&gt;&lt;code&gt;declare&lt;/code&gt; コマンドで定義した変数は関数の中だけのいのち&lt;/h2&gt;&#10;&lt;p&gt;読み取り専用の変数を定義するためには、&lt;code&gt;declare -p&lt;/code&gt; を使っても &lt;code&gt;readonly&lt;/code&gt; を使っても違いはなさそうというところまで確認しました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;a1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;b1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# `-p` オプションで変数がどのように定義されたものかを確認できます。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変数名を複数指定して、いっぺんに出力することもできます。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -p A B&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;A&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;a1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;B&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;b1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/02/01/081707/733/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その３）&lt;/a&gt; の終わりでも話したとおり、これは &lt;strong&gt;関数の外部で変数が定義された場合&lt;/strong&gt; のみの話。&#10;関数の内部で定義された変数の場合には事情が異なります。&#10;関数の内部で定義された場合の両者の違いを見ていきましょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 関数を作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="k"&gt;function&lt;/span&gt; f&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;c1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;readonly&lt;/span&gt; &lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;d1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;f: C=&lt;/span&gt;&lt;span class="nv"&gt;$C&lt;/span&gt;&lt;span class="s2"&gt; D=&lt;/span&gt;&lt;span class="nv"&gt;$D&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 関数の呼び出しを行っていないため、いずれの変数も値は空&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C=&lt;/span&gt;&lt;span class="nv"&gt;$C&lt;/span&gt;&lt;span class="s2"&gt; D=&lt;/span&gt;&lt;span class="nv"&gt;$D&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 関数を呼び出して、関数内の変数値を出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ f&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;f: &lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;c1 &lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;d1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 関数の内部で代入したDの値は参照可能&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C=&lt;/span&gt;&lt;span class="nv"&gt;$C&lt;/span&gt;&lt;span class="s2"&gt; D=&lt;/span&gt;&lt;span class="nv"&gt;$D&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;C&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;d1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変数は見つからない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -p C&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash: declare: C: 見つかりません&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 変数が見つかる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -p D&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -r &lt;span class="nv"&gt;D&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;d1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;declare&lt;/code&gt; で定義した変数は、関数の内部でしか参照できません。&lt;/p&gt;</description></item><item><title>Bash のビルトインコマンド "declare" の使い方紹介（その３:読み取り専用）</title><link>https://genzouw.com/entry/2019/02/01/081707/733/</link><pubDate>Fri, 01 Feb 2019 08:17:07 +0900</pubDate><guid>https://genzouw.com/entry/2019/02/01/081707/733/</guid><description>&lt;p&gt;以下のエントリの続き。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/29/081926/668/"&gt;シェルスクリプトサンプルコードでよく見かける typeset や declare ってなに？ | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/30/081600/688/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その１） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/31/080016/694/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その２） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;今回は &lt;strong&gt;変数に型以外の情報を付与する機能&lt;/strong&gt; について。&#10;他の言語で言う &lt;code&gt;public&lt;/code&gt; とか &lt;code&gt;final&lt;/code&gt; の &lt;strong&gt;キーワード&lt;/strong&gt; をイメージしてもらえばよいです。&lt;/p&gt;&#10;&lt;p&gt;別の表現をすると、以下の属性を付与する機能と言えますね。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;変数のスコープ&lt;/li&gt;&#10;&lt;li&gt;変数の読み取り専用(書き込み禁止)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;declare&lt;/code&gt; コマンド以外でも設定できる内容であり、以下のキーワードとも絡めて話をしたいと思います。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;readonly&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;export&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;local&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2019&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ライセンス GPLv3+: GNU GPL バージョン &lt;span class="m"&gt;3&lt;/span&gt; またはそれ以降 &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is free software&lt;span class="p"&gt;;&lt;/span&gt; you are free to change and redistribute it.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;There is NO WARRANTY, to the extent permitted by law.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="declare-オプション変数の利用を制限開放するもの"&gt;declare オプション（変数の利用を制限・開放するもの）&lt;/h2&gt;&#10;&lt;h3 id="-r-オプション"&gt;&lt;code&gt;-r&lt;/code&gt; オプション&lt;/h3&gt;&#10;&lt;p&gt;読込専用な変数を定義。 &lt;strong&gt;値を代入&lt;/strong&gt; したりや &lt;strong&gt;unset&lt;/strong&gt; をできなくなる。&lt;/p&gt;</description></item><item><title>Bash のビルトインコマンド "declare" の使い方紹介（その２:大文字小文字の自動変換）</title><link>https://genzouw.com/entry/2019/01/31/080016/694/</link><pubDate>Thu, 31 Jan 2019 08:00:16 +0900</pubDate><guid>https://genzouw.com/entry/2019/01/31/080016/694/</guid><description>&lt;p&gt;以下のエントリの続き。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/29/081926/668/"&gt;シェルスクリプトサンプルコードでよく見かける typeset や declare ってなに？&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/30/081600/688/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その１）&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;前回まで見てきたオプションは、 変数の定義時に &lt;strong&gt;型を指定&lt;/strong&gt; し、 &lt;strong&gt;想定通りの値が格納されていることを担保する&lt;/strong&gt; ためのものです。&#10;他の言語で言う &lt;strong&gt;連想配列&lt;/strong&gt; 、 &lt;strong&gt;配列&lt;/strong&gt; 、 &lt;strong&gt;整数&lt;/strong&gt; の３つの型について取り扱いました。&lt;/p&gt;&#10;&lt;p&gt;今回紹介するのは &lt;strong&gt;文字列型&lt;/strong&gt; の &lt;strong&gt;機能&lt;/strong&gt; について。&lt;/p&gt;&#10;&lt;p&gt;文字列型の変数に格納されている値が全て大文字であること、あるいは全て小文字であることを担保するためのオプションです。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="declare-オプション変数の型を定義するもの"&gt;declare オプション（変数の型を定義するもの）&lt;/h2&gt;&#10;&lt;h3 id="-l-オプション"&gt;&lt;code&gt;-l&lt;/code&gt; オプション&lt;/h3&gt;&#10;&lt;p&gt;大文字を自動的に小文字に変換する変数を定義。&#10;LowerCase の頭文字からとっているのだろう。&lt;/p&gt;&#10;&lt;p&gt;変数への値には必ず小文字の英字しか格納されていないことが担保されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 全て小文字は当然何も起こらない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -l &lt;span class="nv"&gt;LSTR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;abcde&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LSTR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;abcde&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 大文字の値を代入しても変換される&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;LSTR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Hello World&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LSTR&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello world&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 大文字を含むと変換される&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -l &lt;span class="nv"&gt;LSTR2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ABCDE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LSTR2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;abcde&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 他の文字が混ざっていても大文字は小文字に変換される&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -l &lt;span class="nv"&gt;LSTR3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;aB1C3DE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LSTR3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ab1c3de&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 全角英大文字を混ぜてみたところ...なんということでしょう！&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -l &lt;span class="nv"&gt;LSTR4&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;abCＡＢＣ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LSTR4&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;abcａｂｃ&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;驚いたのは全角英大文字もしっかり小文字に変換されていたことです。&#10;Bash のバージョンによるのでしょうか？&lt;/p&gt;</description></item><item><title>Bashのビルトインコマンド"declare"の使い方紹介（その１）</title><link>https://genzouw.com/entry/2019/01/30/081600/688/</link><pubDate>Wed, 30 Jan 2019 08:16:00 +0900</pubDate><guid>https://genzouw.com/entry/2019/01/30/081600/688/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2019/01/29/081926"&gt;シェルスクリプトサンプルコードでよく見かけるtypesetやdeclareってなに？&lt;/a&gt; の続きです。&#10;( &lt;code&gt;declare&lt;/code&gt; や &lt;code&gt;typedef&lt;/code&gt; について知りたい方は前回のエントリのほうが参考になるかもしれません。 )&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Bash&lt;/strong&gt; のビルトインコマンドである &lt;strong&gt;declare&lt;/strong&gt; を使って変数を定義できますが、 &lt;strong&gt;オプションを指定することで真価を発揮します&lt;/strong&gt; 。&#10;declareオプションを見ていきましょう。&lt;/p&gt;&#10;&lt;p&gt;オプションは３つに分類できます。（僕が勝手に分類した）&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;変数の型を定義するもの&lt;/li&gt;&#10;&lt;li&gt;変数の利用を制限・開放するもの&lt;/li&gt;&#10;&lt;li&gt;その他&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="declareオプション変数の型を定義するもの"&gt;declareオプション（変数の型を定義するもの）&lt;/h2&gt;&#10;&lt;h3 id="-a-オプション"&gt;&lt;code&gt;-A&lt;/code&gt; オプション&lt;/h3&gt;&#10;&lt;p&gt;連想配列として変数を定義できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 連想配列を定義&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -A MAP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 要素を代入&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ MAP&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="m"&gt;11&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ MAP&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ MAP&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="m"&gt;33&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 単純にechoしても何も出力されない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$MAP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 添字を指定すればOK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MAP&lt;/span&gt;&lt;span class="p"&gt;[a]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MAP&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# カッコが足りないと正しく出力されない(T_T)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$MAP&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;a&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;a&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$MAP&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;a&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ちょっと特殊な書き方をしてやると出力できるが、値の一覧だけしか出力されない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;MAP&lt;/span&gt;&lt;span class="p"&gt;[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;11&lt;/span&gt; &lt;span class="m"&gt;22&lt;/span&gt; &lt;span class="m"&gt;33&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# &amp;#34;!&amp;#34; をつけてやると連想配列のキーも取得できます。（ここまで来るといよいよ意味不明。呪文じみてくる）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ただ、この方法を使えばキーでループさせることが可能。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="p"&gt;!MAP[@]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;a b c&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -p オプションを使うとデバッグしやすい（後述）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; -p MAP&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;declare&lt;/span&gt; -A &lt;span class="nv"&gt;MAP&lt;/span&gt;&lt;span class="o"&gt;=([&lt;/span&gt;c&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;33&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;b&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;a&lt;span class="o"&gt;]=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;11&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちなみに、変数の定義タイミングで値を代入するリテラル記述も存在します。&lt;/p&gt;</description></item><item><title>MacにOpenJDK11をインストールし、JITを試す</title><link>https://genzouw.com/entry/2019/01/30/080037/678/</link><pubDate>Wed, 30 Jan 2019 08:00:37 +0900</pubDate><guid>https://genzouw.com/entry/2019/01/30/080037/678/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;プロジェクトで利用する &lt;strong&gt;OpenJDK&lt;/strong&gt; のバージョンが &lt;strong&gt;11&lt;/strong&gt; に決まったので、バージョンアップしようと思いました。&lt;/p&gt;&#10;&lt;p&gt;ちなみにローカルPCにインストールされている &lt;strong&gt;Java&lt;/strong&gt; のバージョンは &lt;strong&gt;1.8&lt;/strong&gt; でした。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ java -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java version &lt;span class="s2"&gt;&amp;#34;1.8.0_181&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Java&lt;span class="o"&gt;(&lt;/span&gt;TM&lt;span class="o"&gt;)&lt;/span&gt; SE Runtime Environment &lt;span class="o"&gt;(&lt;/span&gt;build 1.8.0_181-b13&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Java HotSpot&lt;span class="o"&gt;(&lt;/span&gt;TM&lt;span class="o"&gt;)&lt;/span&gt; 64-Bit Server VM &lt;span class="o"&gt;(&lt;/span&gt;build 25.181-b13, mixed mode&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="インストール方法"&gt;インストール方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Homebrew&lt;/strong&gt; を使ってインストールするためには、 以下のリポジトリを &lt;strong&gt;tap&lt;/strong&gt; すればよいです。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/AdoptOpenJDK/homebrew-openjdk"&gt;GitHub - AdoptOpenJDK/homebrew-openjdk: AdoptOpenJDK HomeBrew Tap&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;上記ページに記載されている通り、以下のコマンドでインストール可能。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;brew cask install adoptopenjdk&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="テスト"&gt;テスト&lt;/h2&gt;&#10;&lt;p&gt;バージョンを確認。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ java -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java version &lt;span class="s2"&gt;&amp;#34;1.8.0_181&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Java&lt;span class="o"&gt;(&lt;/span&gt;TM&lt;span class="o"&gt;)&lt;/span&gt; SE Runtime Environment &lt;span class="o"&gt;(&lt;/span&gt;build 1.8.0_181-b13&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Java HotSpot&lt;span class="o"&gt;(&lt;/span&gt;TM&lt;span class="o"&gt;)&lt;/span&gt; 64-Bit Server VM &lt;span class="o"&gt;(&lt;/span&gt;build 25.181-b13, mixed mode&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;一度ターミナルをexitしないと反映されませんでしました。古いバージョンが出力される方はご注意。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>シェルスクリプトサンプルコードでよく見かける typeset や declare ってなに？</title><link>https://genzouw.com/entry/2019/01/29/081926/668/</link><pubDate>Tue, 29 Jan 2019 08:19:26 +0900</pubDate><guid>https://genzouw.com/entry/2019/01/29/081926/668/</guid><description>&lt;p&gt;後日投稿したエントリで、サンプルコードとともに検証をしてみました。&#10;興味があればそちらも御覧ください。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/30/081600/688/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その１）&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2019/01/31/080016/694/"&gt;Bash のビルトインコマンド &amp;ldquo;declare&amp;rdquo; の使い方紹介（その２:大文字小文字の自動変換 ）&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;古いシェルスクリプトコードでは、以下のような命令で変数を定義する方法が取られていることが多いです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 定義&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;VAR1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;123&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 出力&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$VAR1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;123&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一方、Github で公開されているシェルスクリプトを見ていると、&#10;&lt;code&gt;typeset&lt;/code&gt; や &lt;code&gt;declare&lt;/code&gt; を使って変数を定義している例をよく見かけます。&lt;/p&gt;&#10;&lt;p&gt;それぞれの違いと使い方について調べてみました。&lt;/p&gt;&#10;&lt;h2 id="変数定義の方法は３つ"&gt;変数定義の方法は３つ&lt;/h2&gt;&#10;&lt;p&gt;改めて &lt;strong&gt;Bash&lt;/strong&gt; の変数定義方法を列挙してみます。&lt;/p&gt;&#10;&lt;p&gt;Bash では &lt;strong&gt;定義なしに変数を生成&lt;/strong&gt; することができるが、 &lt;strong&gt;明示的に定義して変数を生成&lt;/strong&gt; することもできます。&lt;br&gt;&#10;変数の生成方法は以下の 3 つ。（だと思っている）&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;VAR1=123&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;declare VAR1=123&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;typeset VAR1=123&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;それぞれの違いは何？便利な機能もありそうなので調べてみました。&lt;/p&gt;&#10;&lt;h3 id="1-declare--typeset-なしの変数定義"&gt;1. &lt;code&gt;declare&lt;/code&gt; / &lt;code&gt;typeset&lt;/code&gt; なしの変数定義&lt;/h3&gt;&#10;&lt;p&gt;最もよく見る変数定義方法。&#10;記述もシンプルで流れるようにコーディングしているときにはよく記述します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$X&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-declare-を使った変数定義"&gt;2. &lt;code&gt;declare&lt;/code&gt; を使った変数定義&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;declare&lt;/span&gt; &lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$X&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一緒に見えますね。&lt;/p&gt;&#10;&lt;h3 id="3-typeset-を使った変数定義"&gt;3. &lt;code&gt;typeset&lt;/code&gt; を使った変数定義&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;typeset&lt;/span&gt; &lt;span class="nv"&gt;X&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$X&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これも一緒！？&#10;困ったので &lt;code&gt;man&lt;/code&gt; ページを見る！&lt;/p&gt;</description></item><item><title>ブログのエントリにコメント投稿できない謎のエラー「画像認証が間違っています」</title><link>https://genzouw.com/entry/2019/01/28/213315/661/</link><pubDate>Mon, 28 Jan 2019 21:33:15 +0900</pubDate><guid>https://genzouw.com/entry/2019/01/28/213315/661/</guid><description>&lt;p&gt;最近はてなブログからWordpressに移行してみました。きっかけは同僚が比較的簡単にはてなブログからWordpressに移行できたという話を聞いたことと、仕事で移行を担当したためです。&lt;/p&gt;&#10;&lt;h2 id="ブログのエントリにコメント投稿できない謎のエラー画像認証が間違っています"&gt;ブログのエントリにコメント投稿できない謎のエラー「画像認証が間違っています」&lt;/h2&gt;&#10;&lt;p&gt;移行したあとのはじめてのコメントが楽しみなのですが、コメント入力はどんな感じなのだろうと思いました。試しに自分でコメントしてみる。すると、意味不明なエラーが発生。「 &lt;strong&gt;エラー:画像認証が間違っています。&lt;/strong&gt; 」&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/01/a496835cf93ac7e07acfe084fc00a17c-028514537308066004318.jpeg" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="原因はsiteguardとjetpackプラグインの併用"&gt;原因は「SiteGuard」と「Jetpack」プラグインの併用&lt;/h2&gt;&#10;&lt;p&gt;セキュリティ対策として「SiteGuard」というWordPressのプラグインをインストールしています。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;SiteGuard&lt;/strong&gt; には、Wordpressのデフォルトのコメント入力欄に対してボットによるスパムコメント投稿をさせないようにする仕組みが用意されています。コメント入力時に &lt;strong&gt;reCAPTCHA（リキャプチャ）&lt;/strong&gt; に要求する仕組みでその名の通り「 &lt;strong&gt;画像認証&lt;/strong&gt; 」です。&lt;/p&gt;&#10;&lt;p&gt;ボットからの攻撃を守ってくれるのはありがたいのですが、コメント投稿できないのではコメント欄を表示している意味もないので、これを解除しました。&lt;/p&gt;&#10;&lt;h2 id="最後に"&gt;最後に&lt;/h2&gt;&#10;&lt;p&gt;ということでコメント投稿できるようになりましたよ！些細なことでも良いのでコメント待ってます。&lt;/p&gt;</description></item><item><title>Bashのストリーム/パイプ処理を視覚的に理解する</title><link>https://genzouw.com/entry/2019/01/26/094210/644/</link><pubDate>Sat, 26 Jan 2019 09:42:10 +0900</pubDate><guid>https://genzouw.com/entry/2019/01/26/094210/644/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;今日、サーバOSとしてLinuxが占める割合は非常に多いです。&#10;Linuxサーバへログインして作業をすすめるにあたり、 &lt;strong&gt;Bash&lt;/strong&gt; に上手に仕事を依頼できるかで生産性に大きな違いが出てきます。なぜなら、多くのLinuxサーバに標準搭載されているUIは、&lt;strong&gt;Bash&lt;/strong&gt;だからです。&lt;/p&gt;&#10;&lt;p&gt;現在携わっているサービスのサーバも例に漏れずLinuxが利用されています。&lt;/p&gt;&#10;&lt;h2 id="ストリームパイプを理解すればbashが理解できる"&gt;&amp;ldquo;ストリーム/パイプ&amp;quot;を理解すれば&amp;quot;Bash&amp;quot;が理解できる&lt;/h2&gt;&#10;&lt;p&gt;&amp;ldquo;ストリーム/パイプ&amp;quot;を理解すれば&amp;quot;Bash&amp;quot;が、そして&amp;quot;Bash&amp;quot;の &lt;strong&gt;便利さ&lt;/strong&gt; が理解できます。&lt;/p&gt;&#10;&lt;p&gt;ですが、&amp;ldquo;Bash&amp;rdquo; のコマンドは処理の複雑さの割に短く、理解が進むまでは非常に敷居の高い仕組みになっています。&#10;そこで、 &lt;strong&gt;&amp;ldquo;ストリーム/パイプ芸&amp;rdquo;&lt;/strong&gt; 達を視覚化してみることにしました。&lt;/p&gt;&#10;&lt;p&gt;以降、 &lt;strong&gt;&amp;ldquo;ストリーム/パイプ芸&amp;rdquo;&lt;/strong&gt; たちをサンプルコードとともに掲載します。&#10;サンプルコードの意味は説明を最小限にしますが、替わりに視覚化していきます。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;当エントリの最後に&amp;quot;ストリーム/パイプ芸&amp;quot;を大変わかりやすく紹介しているページのURLを紹介しておきます。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="図の見方"&gt;図の見方&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;登場人物&lt;/strong&gt; は以下のものたちです。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://drive.google.com/uc?usp=sharing&amp;amp;export=view&amp;amp;id=16U9tmRajAyv9T07x1wzgyD-cn-Tz_12M" alt=""&gt;&lt;/p&gt;&#10;&lt;h2 id="ストリームパイプ-パターン紹介"&gt;&amp;ldquo;ストリーム/パイプ&amp;rdquo; パターン紹介&lt;/h2&gt;&#10;&lt;h3 id="1単純に実行非ストリームパイプ"&gt;1.単純に実行（非ストリーム/パイプ）&lt;/h3&gt;&#10;&lt;p&gt;まずはじめに &lt;strong&gt;ストリーム/パイプを利用していない例&lt;/strong&gt; から。&#10;出力結果を次のコマンドに渡すためには、一時的にファイルに書き出す必要があります。&lt;/p&gt;&#10;&lt;h4 id="サンプルコード"&gt;サンプルコード&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ C1 &amp;gt; S12.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ C2 &amp;lt; S12.txt &amp;gt; S23.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ C3 &amp;lt; S23.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="具体例"&gt;具体例&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt; &amp;gt; S12.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sort -rn &amp;lt; S12.txt &amp;gt; S13.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat -n &amp;lt; S13.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="視覚化してみました"&gt;視覚化してみました&lt;/h4&gt;&#10;&lt;p&gt;&lt;img src="https://drive.google.com/uc?usp=sharing&amp;amp;export=view&amp;amp;id=1TghuG09BDE53Q84v6Nezs_Jw1lYtvnV-" alt=""&gt;&lt;/p&gt;&#10;&lt;h3 id="2単純なパイプ"&gt;2.単純なパイプ&lt;/h3&gt;&#10;&lt;p&gt;比較的よく実行するタイプです。&#10;データも左から右へと流れるため、直感的に理解し易いです。&lt;/p&gt;&#10;&lt;h4 id="サンプルコード-1"&gt;サンプルコード&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ C1 &lt;span class="p"&gt;|&lt;/span&gt; C2 &lt;span class="p"&gt;|&lt;/span&gt; C3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="具体例-1"&gt;具体例&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; 100&lt;span class="p"&gt;|&lt;/span&gt; sort -rn&lt;span class="p"&gt;|&lt;/span&gt; cat -n&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="視覚化してみました-1"&gt;視覚化してみました&lt;/h4&gt;&#10;&lt;p&gt;&lt;img src="https://drive.google.com/uc?usp=sharing&amp;amp;export=view&amp;amp;id=1j0lVwQ1CtqtjYoQkaF7ZqMoVORQwA-bJ" alt=""&gt;&lt;/p&gt;</description></item><item><title>Linuxサーバからログアウトしたタイミングで処理を実行させる方法（例えばメールを飛ばす）</title><link>https://genzouw.com/entry/2019/01/25/084559/639/</link><pubDate>Fri, 25 Jan 2019 08:45:59 +0900</pubDate><guid>https://genzouw.com/entry/2019/01/25/084559/639/</guid><description>&lt;p&gt;職場の踏み台サーバを経由してオペレーションを実行すると、オペレーションログが１ファイル作成されます。&#10;このファイルのフルパスをログアウトごとに記録しておく必要があったのだが面倒なので自動化してみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;追記 : 後日、Bash の trap 機能について追加のエントリを書きました。trap コマンドの詳細を知りたい方はどうぞ&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2021/03/02/080000/2381/"&gt;Bash シェルスクリプトで終了前に後始末をさせたい時は trap コマンドを活用しよう | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="前提"&gt;前提&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ログファイルは以下のフォルダに配置される。&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;/var/log/script&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;ファイル名にはログインユーザ名が付与されている。&lt;/li&gt;&#10;&lt;li&gt;ファイル名にはタイムスタンプがが付与されている。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;具体的には以下のようなファイル形式となります。&lt;/p&gt;&#10;&lt;p&gt;/var/log/script/genzouw_20190125_082914.log&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2011&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ライセンス GPLv3+: GNU GPL バージョン &lt;span class="m"&gt;3&lt;/span&gt; またはそれ以降 &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is free software&lt;span class="p"&gt;;&lt;/span&gt; you are free to change and redistribute it.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;There is NO WARRANTY, to the extent permitted by law.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ログアウトタイミングに処理を実行させるための方法"&gt;ログアウトタイミングに処理を実行させるための方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Bash&lt;/strong&gt; の &lt;strong&gt;trap コマンド&lt;/strong&gt; を使って実現しました。&lt;/p&gt;</description></item><item><title>Bitbucket上で個人、あるいは組織で所有するリポジトリを一覧表示するためのシェルスクリプト</title><link>https://genzouw.com/entry/2019/01/24/081819/631/</link><pubDate>Thu, 24 Jan 2019 08:18:19 +0900</pubDate><guid>https://genzouw.com/entry/2019/01/24/081819/631/</guid><description>&lt;h1 id="bitbucket上で個人あるいは組織で所有するリポジトリを一覧表示するためのシェルスクリプト"&gt;Bitbucket上で個人、あるいは組織で所有するリポジトリを一覧表示するためのシェルスクリプト&lt;/h1&gt;&#10;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;仕事で自分の組織が所有する&lt;a href="https://bitbucket.org"&gt;Bitbucket&lt;/a&gt;のリポジトリを全て取得し、grep検索したい場合がありましたが、&lt;a href="https://bitbucket.org"&gt;Bitbucket&lt;/a&gt;のWebページの一覧性はよくありません。（特にページングされているので、全てを一覧表示できない。）&lt;/p&gt;&#10;&lt;p&gt;また、&lt;a href="https://www.vim.org/"&gt;Vim&lt;/a&gt;で編集しやすいように、 &lt;strong&gt;コマンドラインから一覧表示するためのシェルスクリプト&lt;/strong&gt; を作成しました。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Darwin NP178 18.2.0 Darwin Kernel Version 18.2.0: Mon Nov &lt;span class="m"&gt;12&lt;/span&gt; 20:24:46 PST 2018&lt;span class="p"&gt;;&lt;/span&gt; root:xnu-4903.231.4~2/RELEASE_X86_64 x86_64 i386 MacBookPro11,4 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 5.0.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin18.2.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2019&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ライセンス GPLv3+: GNU GPL バージョン &lt;span class="m"&gt;3&lt;/span&gt; またはそれ以降 &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is free software&lt;span class="p"&gt;;&lt;/span&gt; you are free to change and redistribute it.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;There is NO WARRANTY, to the extent permitted by law.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ zsh --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zsh 5.6.2 &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin17.7.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="前提条件"&gt;前提条件&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://stedolan.github.io/jq/"&gt;jq&lt;/a&gt;という、jsonデータを操作するためのツール&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="スクリプト"&gt;スクリプト&lt;/h2&gt;&#10;&lt;h3 id="show-bitbucket-repositoriessh"&gt;show-bitbucket-repositories.sh&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o errexit &lt;span class="c1"&gt;# エラーが発生した場合はシェルを終了&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; -o nounset &lt;span class="c1"&gt;# 未定義の変数を利用禁止&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hu:p:o:&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usage&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/\([a-z]\)/ -\1/g&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/\-\([a-z]\):/-\1 \U\1\E/g&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;type&lt;/span&gt; jq &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;jqコマンドがありません。停止します。&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;101&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;getopts&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;:&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opts&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; opt&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;opt&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; in&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; u&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;BITBUCKET_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OPTARG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; p&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;BITBUCKET_PASSWORD&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OPTARG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; o&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;BITBUCKET_ORG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;OPTARG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; h &lt;span class="p"&gt;|&lt;/span&gt; : &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="se"&gt;\?&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; usage&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;exit&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;esac&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;API_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://api.bitbucket.org/2.0/repositories/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BITBUCKET_ORG&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BITBUCKET_USER&lt;/span&gt;&lt;span class="si"&gt;}}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$API_URL&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;null&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;tmp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; curl &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --silent &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --user &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$BITBUCKET_USER&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="nv"&gt;$BITBUCKET_PASSWORD&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;API_URL&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &amp;gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tmp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# API実行結果がページングされて返却されるため、次ページ情報が存在するかを確認（ない場合にはnullという値が取得される）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;API_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;cat &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tmp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r .next&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cat &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;tmp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq -r -c &lt;span class="s2"&gt;&amp;#34;.values[].links.clone[].href&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;https://&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="設置方法"&gt;設置方法&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;環境変数 &lt;code&gt;$PATH&lt;/code&gt; が設定されているディレクトリにファイルを配置してください。&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;em&gt;ex)&lt;/em&gt; &lt;code&gt;~/bin&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vi show-bitbucket-repositories.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;700&lt;/span&gt; show-bitbucket-repositories.sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行方法"&gt;実行方法&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;-u&lt;/code&gt; : ユーザID ( &lt;strong&gt;必須&lt;/strong&gt; )&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-p&lt;/code&gt; : パスワード ( &lt;strong&gt;必須&lt;/strong&gt; )&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;-o&lt;/code&gt; : 組織情報 ( 任意：後述 )&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 個人のリポジトリ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./show-bitbucket-repositories.sh -u genzouw -p password-dayo&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# `-o` オプション付きで、組織で所有するものの一覧表示が可能&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./show-bitbucket-repositories.sh -u genzouw -p password-dayo -o my_organize&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ちなみに"&gt;ちなみに&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;こちらのpythonのツールでも同じようなことはできます。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>【TMUX】新しいWindowを開いたときに、直前のカレントディレクトリを引き継ぐ設定</title><link>https://genzouw.com/entry/2019/01/23/221837/627/</link><pubDate>Wed, 23 Jan 2019 22:18:37 +0900</pubDate><guid>https://genzouw.com/entry/2019/01/23/221837/627/</guid><description>&lt;p&gt;TMUXでWindowを開くたびに直前のカレントディレクトリに &lt;code&gt;cd&lt;/code&gt; することが多く、面倒だったので調べてみました。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;p&gt;自分のTMUX環境を確認&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# tmux -V&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux 2.8&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="設定"&gt;設定&lt;/h2&gt;&#10;&lt;p&gt;以下の設定を &lt;code&gt;~/.tmux.conf&lt;/code&gt; に追記すればOK。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vi ~/.tmux.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 新しいPaneを開く場合&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;bind&lt;/span&gt; c new-window -c &lt;span class="s1"&gt;&amp;#39;#{pane_current_path}&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在のPaneを水平分割してWindowを開く&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;bind&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;%&amp;#39;&lt;/span&gt; split-window -h -c &lt;span class="s1"&gt;&amp;#39;#{pane_current_path}&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 現在のPaneを垂直分割してWindowを開く&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;bind&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; split-window -v -c &lt;span class="s1"&gt;&amp;#39;#{pane_current_path}&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;TMUX&lt;/strong&gt; のトリガとなるキーを入力後、 &lt;code&gt;%&lt;/code&gt; キーで水平に分割、 &lt;code&gt;&amp;quot;&lt;/code&gt; キーで垂直に分割されるようにショートカットを設定していますが、分割後の &lt;strong&gt;ペイン&lt;/strong&gt; ではもとのカレントディレクトリが引き継がれています。&lt;/p&gt;&#10;&lt;p&gt;すでにTMUXプロセスが起動中の場合は、以下のコマンドを実行しないと正しく反映されないことに注意！&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tmux source-file ~/.tmux.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Githubで無料アカウントでもPrivateリポジトリ作成が無制限になったのでコマンドで操作するための環境を整える</title><link>https://genzouw.com/entry/2019/01/22/085412/565/</link><pubDate>Tue, 22 Jan 2019 08:54:12 +0900</pubDate><guid>https://genzouw.com/entry/2019/01/22/085412/565/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Githubの無料アカウントユーザにもPrivateリポジトリ作成が無制限となりましたね。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://thenextweb.com/dd/2019/01/05/github-now-gives-free-users-unlimited-private-repositories/"&gt;GitHub now gives free users unlimited private repositories&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;今まで &lt;a href="https://bitbucket.org/"&gt;Bitbucket&lt;/a&gt; を利用し横目で &lt;strong&gt;Githubユーザいいなぁ&lt;/strong&gt; と思っていたが、Githubどんどん使っていこうかなと思った次第です。&lt;br&gt;&#10;とはいえ、今まで使っていた &lt;a href="https://bitbucket.org/zhemao/bitbucket-cli"&gt;bitbucket-cli&lt;/a&gt; の &lt;code&gt;bb&lt;/code&gt; コマンドのように、CUIで &lt;strong&gt;リポジトリを作成し&lt;/strong&gt; たり &lt;strong&gt;プルリクエストあげ&lt;/strong&gt; たり &lt;strong&gt;削除し&lt;/strong&gt; たりはできるようにしたいです。&lt;/p&gt;&#10;&lt;p&gt;以下のツールを導入してみます。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/github/hub"&gt;GitHub - github/hub: hub helps you win at git.&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="特徴"&gt;特徴&lt;/h2&gt;&#10;&lt;p&gt;一部抜粋&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;hub is a command line tool that wraps git in order to extend it with extra features and commands that make working with GitHub easier.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;日本語訳すると以下のようになります。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;hubはGitHubでの作業を容易にする追加機能やコマンドでgitを拡張するためにgitをラップするコマンドラインツールです。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;ラッパーツールということで &lt;strong&gt;Git&lt;/strong&gt; は必須。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ zsh --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zsh 5.6.2 &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin17.7.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;以下を参照&lt;/p&gt;</description></item><item><title>Amazonの書籍詳細ページからタイトルを抜き出し大阪市立図書館の蔵書検索を行うJavaScript</title><link>https://genzouw.com/entry/2016/04/16/215819/7/</link><pubDate>Sat, 16 Apr 2016 21:58:19 +0900</pubDate><guid>https://genzouw.com/entry/2016/04/16/215819/7/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;新人教育の一環として、部内でオススメの書籍を募ったところ、自分が読んでみたいと思った書籍がたくさんありました。&#10;で一つ一つ検索し &lt;strong&gt;ほしい物リスト&lt;/strong&gt; に登録していったがすべて購入すると随分な費用となるため、 &lt;a href="http://www.oml.city.osaka.lg.jp/"&gt;大阪市立図書館の蔵書検索&lt;/a&gt; で検索し予約することにしました。&#10;その作業を少しでも容易にすべく、JavaScriptでブックマークレットを作成してみました。&lt;/p&gt;&#10;&lt;h2 id="スクリプト"&gt;スクリプト&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;productTitle&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/―/mgi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://www.oml.city.osaka.lg.jp/index.php?action=pages_view_main&amp;amp;active_action=v3search_view_main_init&amp;amp;block_id=552&amp;amp;tab_num=0&amp;amp;op_param=&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nb"&gt;encodeURIComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;words=&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;前提&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;僕の利用しているブラウザはhrome&lt;/em&gt; です&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ブックマークに次のスクリプトを登録します。（ブックマークレットとなります）&lt;/li&gt;&#10;&lt;li&gt;Amazonの商品ページ（ &lt;a href="http://www.amazon.co.jp/dp/4862760856/ref=wl_it_dp_o_pC_nS_ttl?_encoding=UTF8&amp;amp;colid=13GI05LZIZI4L&amp;amp;coliid=I2BX9IYSDWN5P3"&gt;ex&lt;/a&gt; ）を開き、先のブックマークレットをクリックします。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;マウスで選択されている文字列から検索、なども容易に実現できますね。&#10;&lt;strong&gt;スクリプトとは関係ないですが、&lt;a href="https://www.oml.city.osaka.lg.jp/"&gt;大阪市立図書館のページ&lt;/a&gt;重たいです。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Chocolateyを使ってEclipse + ERMasterをインストールしてみる</title><link>https://genzouw.com/entry/2016/01/07/124515/8/</link><pubDate>Thu, 07 Jan 2016 12:45:15 +0900</pubDate><guid>https://genzouw.com/entry/2016/01/07/124515/8/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;プロジェクトのER図作成ツール として&lt;a href="http://ermaster.sourceforge.net/content/manual/ja/index.html"&gt;ERMaster&lt;/a&gt;を利用するケースが多いが、 セットアップ手順をまとめるのが面倒ですよね。&lt;/p&gt;&#10;&lt;p&gt;なるべくコマンドラインで完結できるような仕組みにすれば、 テキストベースの &lt;strong&gt;動くドキュメント&lt;/strong&gt; にできます。&lt;/p&gt;&#10;&lt;p&gt;会社では &lt;strong&gt;Windows&lt;/strong&gt; OSを使っているため、LinuxやMacのようにコマンドラインに強くないためなんとかならないものかと調べていたところ、&lt;a href="https://chocolatey.org/"&gt;Chocolatey&lt;/a&gt;というツールを発見しました。&#10;早速、&lt;a href="https://chocolatey.org/"&gt;Chocolatey&lt;/a&gt;を使って &lt;strong&gt;動くドキュメント&lt;/strong&gt; を作ってみました。&lt;/p&gt;&#10;&lt;h2 id="手順"&gt;手順&lt;/h2&gt;&#10;&lt;h3 id="1chocolateyのインストール"&gt;1.Chocolateyのインストール&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://chocolatey.org/"&gt;https://chocolatey.org/&lt;/a&gt; にアクセスします。&lt;/p&gt;&#10;&lt;p&gt;ページ中央辺りに、 Windowsのコマンドプロンプトからのインストール方法が記載されています。 実行してみます。( 2016-01-07 現在 )&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※注意：コマンドプロンプト実行の際には「管理者として実行」を選択してください！&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-dos" data-lang="dos"&gt;C: \&amp;gt; @powershell -NoProfile -ExecutionPolicy Bypass -Command &amp;#34;iex ((new-object net.webclient).DownloadString(&amp;#39;https://chocolatey.org/install.ps1&amp;#39;))&amp;#34; &amp;amp;&amp;amp; SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="2パッケージを探す"&gt;2.パッケージを探す&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://chocolatey.org/"&gt;https://chocolatey.org/&lt;/a&gt; のページ &lt;strong&gt;右上&lt;/strong&gt; には、Chocolateyでインストール可能なアプリを検索するための検索エリアがあります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;eclipse&lt;/strong&gt; と入力し検索してみましょう。&lt;/p&gt;&#10;&lt;h3 id="3eclipseのインストール"&gt;3.Eclipseのインストール&lt;/h3&gt;&#10;&lt;p&gt;表示されたページには、パッケージのインストールを行うためのコマンドが表示されています。 これを Windowsのコマンドプロンプトに貼り付けます。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ありがたいことに JDK まで勝手にインストールしてくれます。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;※注意：コマンドプロンプト実行の際には「管理者として実行」を選択してください！&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-dos" data-lang="dos"&gt;C: \&amp;gt; choco install eclipse&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="4ermasterのインストール"&gt;4.ERMasterのインストール&lt;/h3&gt;&#10;&lt;p&gt;Eclipseに対して、 &lt;a href="http://ermaster.sourceforge.net/"&gt;ERMaster&lt;/a&gt;プラグインをインストールします。&lt;/p&gt;&#10;&lt;p&gt;まずは以下のコマンドを実行し、feature名というものを確認します。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code class="language-dos" data-lang="dos"&gt;C: \&amp;gt; &amp;#34;C:\Program Files\Eclipse Foundation\4.5.1\eclipse\eclipsec.exe&amp;#34;&#10; -clean -purgeHistory&#10; -application org.eclipse.equinox.p2.director&#10; -noSplash&#10; -repository http://ermaster.sourceforge.net/update-site/&#10; -list&#10; org.insightech.er=1.0.0.v20150619-0219&#10; org.insightech.er.feature.feature.group=1.0.0.v20150619-0219&#10; org.insightech.er.feature.feature.jar=1.0.0.v20150619-0219&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;表示されたものから &lt;strong&gt;=以降を削除し、,で連結&lt;/strong&gt; します。&lt;/p&gt;</description></item><item><title>phpQueryを使って、commandlinefu.comからCommandLine Tipsを取得してみる</title><link>https://genzouw.com/entry/2015/12/17/012204/10/</link><pubDate>Thu, 17 Dec 2015 01:22:04 +0900</pubDate><guid>https://genzouw.com/entry/2015/12/17/012204/10/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;コマンドラインからWebサイトのスクレイピングを行う必要がありました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/FriendsOfPHP/Goutte"&gt;Goutte&lt;/a&gt; を使ってスクレイピングを行ったことがありました。&#10;けれどもあまり直感的に実装できずハマった思いがあるため、もう少し使いやすいライブラリはないものかと探してみました。&#10;代わりに良さそうなライブラリを見つけたのでこちら ( &lt;a href="https://github.com/electrolinux/phpquery"&gt;electrolinux/phpquery · GitHub&lt;/a&gt; ) を使ってみることにしました。&lt;/p&gt;&#10;&lt;p&gt;検証を兼ねて、 &lt;a href="http://www.commandlinefu.com/commands/browse/25"&gt;commandlinefu.com&lt;/a&gt; から &lt;strong&gt;CommandLine Tips&lt;/strong&gt; を抜き出してみることにしました。&lt;/p&gt;&#10;&lt;h3 id="2019-02-07-追記"&gt;2019-02-07 追記&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://www.commandlinefu.com/commands/browse/25"&gt;commandlinefu.com&lt;/a&gt; のHTMLの構成が変更されているみたいです。ご注意ください。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 4.3.42&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin14.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2013&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ライセンス GPLv3+: GNU GPL バージョン &lt;span class="m"&gt;3&lt;/span&gt; またはそれ以降 &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is free software&lt;span class="p"&gt;;&lt;/span&gt; you are free to change and redistribute it.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;There is NO WARRANTY, to the extent permitted by law.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ php -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PHP 5.5.28 &lt;span class="o"&gt;(&lt;/span&gt;cli&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;built: Aug &lt;span class="m"&gt;31&lt;/span&gt; &lt;span class="m"&gt;2015&lt;/span&gt; 12:17:07&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; 1997-2015 The PHP Group&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Zend Engine v2.5.0, Copyright &lt;span class="o"&gt;(&lt;/span&gt;c&lt;span class="o"&gt;)&lt;/span&gt; 1998-2015 Zend Technologies&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;h3 id="事前準備"&gt;事前準備&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://getcomposer.org/"&gt;Composer&lt;/a&gt; がインストールされていることが前提となります。&#10;インストールされていない場合はすぐにインストールしましょう！&lt;/p&gt;</description></item><item><title>Bashでリダイレクトにより誤って既存ファイルを上書きしてしまわないようにする</title><link>https://genzouw.com/entry/2015/12/16/021214/11/</link><pubDate>Wed, 16 Dec 2015 02:12:14 +0900</pubDate><guid>https://genzouw.com/entry/2015/12/16/021214/11/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;bash クックブック&lt;/strong&gt; を読み進めています。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://www.amazon.co.jp/dp/4873113768?&amp;linkCode=li3&amp;tag=&amp;linkId=c9fd587875cc623c8c1c63d19037434e&amp;language=ja_JP&amp;ref_=as_li_ss_il" target="_blank" rel="noopener"&gt;&lt;img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&amp;ASIN=4873113768&amp;Format=_SL250_&amp;ID=AsinImage&amp;MarketPlace=JP&amp;ServiceVersion=20070822&amp;WS=1&amp;tag=&amp;language=ja_JP" &gt;&lt;/a&gt;&lt;img src="https://ir-jp.amazon-adsystem.com/e/ir?t=&amp;language=ja_JP&amp;l=li3&amp;o=9&amp;a=4873113768" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&#10;標準で &lt;strong&gt;ON&lt;/strong&gt; にしておくと良さそうな設定がありました。&#10;&lt;strong&gt;Bash&lt;/strong&gt; でリダイレクトにより誤って既存ファイルを上書きしてしまわないようにする設定です。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Darwin genzouw-MacBook-Pro.local 15.2.0 Darwin Kernel Version 15.2.0: Fri Nov &lt;span class="m"&gt;13&lt;/span&gt; 19:56:56 PST 2015&lt;span class="p"&gt;;&lt;/span&gt; root:xnu-3248.20.55~2/RELEASE_X86_64 x86_64 i386 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 4.3.42&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin14.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2013&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ライセンス GPLv3+: GNU GPL バージョン &lt;span class="m"&gt;3&lt;/span&gt; またはそれ以降 &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;This is free software&lt;span class="p"&gt;;&lt;/span&gt; you are free to change and redistribute it.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;There is NO WARRANTY, to the extent permitted by law.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;set -o noclobber&lt;/code&gt; を実行すると、すでに存在しているファイルをリダイレクトにより上書きできなくなります。&#10;ファイルが存在しない場合は問題なく新規作成されます。&#10;追記も問題なくできます。&lt;/p&gt;</description></item><item><title>ssh-copy-idを使ってssh公開鍵を対象サーバーに配置する</title><link>https://genzouw.com/entry/2015/12/09/212903/12/</link><pubDate>Wed, 09 Dec 2015 21:29:03 +0900</pubDate><guid>https://genzouw.com/entry/2015/12/09/212903/12/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;ssh-copy-id&lt;/strong&gt; という、操作中のユーザーのSSH公開鍵を対象サーバーに簡単に配置するためのコマンドを知ったので使ってみた。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Darwin genzouw-MacBook-Pro.local 15.0.0 Darwin Kernel Version 15.0.0: Sat Sep &lt;span class="m"&gt;19&lt;/span&gt; 15:53:46 PDT 2015&lt;span class="p"&gt;;&lt;/span&gt; root:xnu-3247.10.11~1/RELEASE_X86_64 x86_64 i386 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, バージョン 4.3.42&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin14.5.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ zsh --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zsh 5.1.1 &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin15.0.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="検証"&gt;検証&lt;/h2&gt;&#10;&lt;h3 id="vagrantで新しいlinuxサーバーを立てる"&gt;Vagrantで新しいLinuxサーバーを立てる&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vagrant init&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ここではすでにBoxを追加していたため、Vagrantfileを編集して利用するBoxを設定した&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vi Vagrantfile&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vagrant up&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ログイン&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vagrant ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;vagrant@vagrant-centos65 ~&lt;span class="o"&gt;]&lt;/span&gt;$ sudo useradd genzouw&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;vagrant@vagrant-centos65 ~&lt;span class="o"&gt;]&lt;/span&gt;$ sudo su - genzouw&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# sshの鍵の設定はない状態&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;genzouw@vagrant-centos65 ~&lt;span class="o"&gt;]&lt;/span&gt;$ mkdir .ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;genzouw@vagrant-centos65 ~&lt;span class="o"&gt;]&lt;/span&gt;$ chmod &lt;span class="m"&gt;700&lt;/span&gt; .ssh/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;genzouw@vagrant-centos65 ~&lt;span class="o"&gt;]&lt;/span&gt;$ &lt;span class="nb"&gt;exit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;logout&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 初期パスワードを設定&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;vagrant@vagrant-centos65 ~&lt;span class="o"&gt;]&lt;/span&gt;$ sudo passwd genzouw&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;vagrant@vagrant-centos65 ~&lt;span class="o"&gt;]&lt;/span&gt;$ &lt;span class="nb"&gt;exit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;logout&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Connection to 127.0.0.1 closed.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="mac上に-ssh-copy-id-がインストールされていなかったのでインストール"&gt;Mac上に ssh-copy-id がインストールされていなかったのでインストール&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ brew install ssh-copy-id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==&lt;/span&gt;&amp;gt; Downloading https://homebrew.bintray.com/bottles/ssh-copy-id-6.8p1.el_capitan.bottle.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;####################################################################### 100.0%&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;==&lt;/span&gt;&amp;gt; Pouring ssh-copy-id-6.8p1.el_capitan.bottle.tar.gz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;? /usr/local/Cellar/ssh-copy-id/6.8p1: &lt;span class="m"&gt;7&lt;/span&gt; files, 344K&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 試しに実行&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ssh-copy-id&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Usage: /usr/local/bin/ssh-copy-id &lt;span class="o"&gt;[&lt;/span&gt;-h&lt;span class="p"&gt;|&lt;/span&gt;-?&lt;span class="p"&gt;|&lt;/span&gt;-n&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-i &lt;span class="o"&gt;[&lt;/span&gt;identity_file&lt;span class="o"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-p port&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt;-o &amp;lt;ssh -o options&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt; ...&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;user@&lt;span class="o"&gt;]&lt;/span&gt;hostname&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="早速鍵の設定"&gt;早速鍵の設定&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ssh-copy-id genzouw@127.0.0.1 -p2222&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="結果"&gt;結果&lt;/h2&gt;&#10;&lt;p&gt;おもむろにVagrant環境に接続してみる&lt;/p&gt;</description></item><item><title>calendar.vimで、VimからGoogleカレンダーを編集してみる</title><link>https://genzouw.com/entry/2015/11/19/234441/13/</link><pubDate>Thu, 19 Nov 2015 23:44:41 +0900</pubDate><guid>https://genzouw.com/entry/2015/11/19/234441/13/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;Vimから &lt;a href="https://mail.google.com/tasks/canvas?pli=1"&gt;Google Task&lt;/a&gt; を閲覧・編集するためのVimプラグインがないかな？と探していて面白いものが見つかったので紹介。&lt;/p&gt;&#10;&lt;p&gt;結果的に僕が求めている &lt;strong&gt;Google Task&lt;/strong&gt; 編集機能は使いやすいとはいえないものだったが、&#10;&lt;a href="https://calendar.google.com/calendar/render#main_7"&gt;Google Calendar&lt;/a&gt; の閲覧・編集機能が非常に強力で面白かった。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Darwin genzouw-no-MacBook-Pro.local 15.0.0 Darwin Kernel Version 15.0.0: Sat Sep &lt;span class="m"&gt;19&lt;/span&gt; 15:53:46 PDT 2015&lt;span class="p"&gt;;&lt;/span&gt; root:xnu-3247.10.11~1/RELEASE_X86_64 x86_64 i386 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vim --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VIM - Vi IMproved 7.4 &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2013&lt;/span&gt; Aug 10, compiled Oct &lt;span class="m"&gt;11&lt;/span&gt; &lt;span class="m"&gt;2015&lt;/span&gt; 07:48:23&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MacOS X &lt;span class="o"&gt;(&lt;/span&gt;unix&lt;span class="o"&gt;)&lt;/span&gt; version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Included patches: 1-889&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Compiled by Homebrew&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;h3 id="必要なもの"&gt;必要なもの&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="https://github.com/Shougo/neobundle.vim"&gt;Shougo/neobundle.vim · GitHub&lt;/a&gt; がインストールされていることを前提に話を進めます。&#10;&lt;strong&gt;プラグイン管理ツール&lt;/strong&gt; なら何でも良いと思います。&lt;/p&gt;&#10;&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# vimを開く&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vim ~/.vimrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下の行を追記&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;NeoBundle &amp;#39;itchyny/calendar.vim&amp;#39;&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;追加後、vimで以下のコマンドを実行&lt;/p&gt;</description></item><item><title>Cygwinでkillがうまく動かない場合の対処</title><link>https://genzouw.com/entry/2015/11/15/013724/14/</link><pubDate>Sun, 15 Nov 2015 01:37:24 +0900</pubDate><guid>https://genzouw.com/entry/2015/11/15/013724/14/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;家ではMacBookProを使っていますが、会社のPCがWindowsのためやむなく &lt;strong&gt;Cygwin&lt;/strong&gt; を使っています。&lt;/p&gt;&#10;&lt;p&gt;ただ、Vimなどのプロセスが残ってしまった場合にうまくkillできないことがあります。&lt;/p&gt;&#10;&lt;p&gt;そんな場合に参考になるかと思います。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;Windows7&lt;/code&gt; + &lt;code&gt;Cygwin&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="対処"&gt;対処&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# シェルの組み込みコマンドであるkillであるというメッセージが表示されていれば、以下の対処をおこなう&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ which &lt;span class="nb"&gt;kill&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 組み込みコマンドが呼び出されないようにする&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;alias kill=&amp;#39;/usr/bin/kill&amp;#39;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;不要なプロセスがすぐ残ってしまうようなおかしな状態が発生しないようにできればよいのですが。&#10;あるいは &lt;strong&gt;MacBookPro&lt;/strong&gt; で開発ができればよいのですけどね。&lt;/p&gt;</description></item><item><title>Slackでのハイライトされたソースコードの投稿方法</title><link>https://genzouw.com/entry/2015/11/12/233556/15/</link><pubDate>Thu, 12 Nov 2015 23:35:56 +0900</pubDate><guid>https://genzouw.com/entry/2015/11/12/233556/15/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://slack.com"&gt;Slack&lt;/a&gt; を遅ればせながらようやく使い始めました。&lt;/p&gt;&#10;&lt;p&gt;使ってみてわかったのですが、シンプルかつプロジェクトメンバ全員でやり取りした内容が横串検索できるのが非常に便利です。&#10;これは他のチャットツールでは有料だったりそもそも機能としてなかったりするので便利です。&#10;加えて、エンジニア向けのハイライトされたソースコードの投稿機能が搭載されています。&#10;Slackではこれを &lt;strong&gt;スニペット&lt;/strong&gt; とよんでいるようです。&lt;/p&gt;&#10;&lt;h2 id="投稿方法"&gt;投稿方法&lt;/h2&gt;&#10;&lt;p&gt;スクリーンショットで手順をまとめて見ました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://lh3.googleusercontent.com/-f1gg_BZZNN8/VkSkbgt8MpI/AAAAAAAE_SU/qJf2YC8BWe4/s1024/slack%25E3%2581%25A6%25E3%2582%2599%25E3%2581%25AE%25E3%2582%25B3%25E3%2583%25BC%25E3%2583%2588%25E3%2582%2599%25E3%2582%25B9%25E3%2583%258B%25E3%2583%2598%25E3%2582%259A%25E3%2583%2583%25E3%2583%2588%25E3%2581%25AE%25E6%258A%2595%25E7%25A8%25BF%25E6%2596%25B9%25E6%25B3%2595.gif" alt=""&gt;&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでランダムな文字列を生成する</title><link>https://genzouw.com/entry/2015/11/12/073000/16/</link><pubDate>Thu, 12 Nov 2015 07:30:00 +0900</pubDate><guid>https://genzouw.com/entry/2015/11/12/073000/16/</guid><description/></item><item><title>Neosnippetでシェルコマンド呼び出し結果をスニペットに差し込む</title><link>https://genzouw.com/entry/2015/11/12/005626/17/</link><pubDate>Thu, 12 Nov 2015 00:56:26 +0900</pubDate><guid>https://genzouw.com/entry/2015/11/12/005626/17/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;vimデコーディングするう上で、もはや無くてはならないプラグインの一つである &lt;a href="https://github.com/Shougo/neosnippet.vim"&gt;Shougo/neosnippet.vim&lt;/a&gt; 。&#10;非常に便利です。&lt;/p&gt;&#10;&lt;p&gt;更に便利に使うために、以下の情報をスニペット展開時に自動的に差し込めるようにしてみよう。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;今利用している環境の情報&lt;/li&gt;&#10;&lt;li&gt;ディスク容量&lt;/li&gt;&#10;&lt;li&gt;ユーザー名&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;p&gt;今利用している環境は以下のとおり。このブログを編集中に利用したスニペットが自動で出力してくれています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Darwin genzouw-MacBook-Pro.local 15.0.0 Darwin Kernel Version 15.0.0: Sat Sep &lt;span class="m"&gt;19&lt;/span&gt; 15:53:46 PDT 2015&lt;span class="p"&gt;;&lt;/span&gt; root:xnu-3247.10.11~1/RELEASE_X86_64 x86_64 i386 MacBookPro10,1 Darwin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ zsh --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zsh 5.1.1 &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin15.0.0&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$USER&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzouw&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="設定方法"&gt;設定方法&lt;/h2&gt;&#10;&lt;h2 id="1-neosnippetのインストール"&gt;1. Neosnippetのインストール&lt;/h2&gt;&#10;&lt;p&gt;ここでは割愛します。以下のページを参照下さい。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/Shougo/neosnippet.vim"&gt;Shougo/neosnippet.vim&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="2snippetsを開く"&gt;2.snippetsを開く&lt;/h2&gt;&#10;&lt;p&gt;snippetsファイルの配置場所や書き方についても割愛します。&lt;/p&gt;&#10;&lt;p&gt;僕はブログ等を各ときには &lt;code&gt;filetype=markdown&lt;/code&gt; となるように設定していることもあり、 &lt;strong&gt;markdown.snip&lt;/strong&gt; というファイルに設定を追記しました。&lt;/p&gt;&#10;&lt;h2 id="3スニペットを追加"&gt;3.スニペットを追加&lt;/h2&gt;&#10;&lt;p&gt;以下のスニペットを追加。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;snippet blog&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;options head&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;prev_word &amp;#39;^&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;## 検証環境&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;\`\`\`bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;`system(&amp;#34;uname -a&amp;#34;)`&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;`system(&amp;#34;bash -version&amp;#34;)`&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#9;\`\`\`&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ポイントは以下の部分。&lt;/p&gt;</description></item><item><title>CentOS6.5サーバーに日本語環境を構築する</title><link>https://genzouw.com/entry/2014/07/11/222301/18/</link><pubDate>Fri, 11 Jul 2014 22:23:01 +0900</pubDate><guid>https://genzouw.com/entry/2014/07/11/222301/18/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;ロケールの設定に関する情報を探して、ブログに辿り着く方が多かったので整理してみました。&lt;/p&gt;&#10;&lt;p&gt;特に、以下の様に環境変数を適切に設定しているにもかかわらず、日本語表示されないとお困りの方が多いようです。&#10;&lt;em&gt;Vagrantにて、CentOS6.5のBoxをダウンロードしてきた直後はこのような状態になっています。&lt;/em&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ja_JP.UTF-8&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="調査環境"&gt;調査環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;vagrant@vagrant-centos65 ~&lt;span class="o"&gt;]&lt;/span&gt;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux vagrant-centos65.vagrantup.com 2.6.32-431.3.1.el6.x86_64 &lt;span class="c1"&gt;#1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;vagrant@vagrant-centos65 ~&lt;span class="o"&gt;]&lt;/span&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.1.2&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2009&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;License GPLv3+: GNU GPL version &lt;span class="m"&gt;3&lt;/span&gt; or later &amp;lt;http://gnu.org/licenses/gpl.html&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="対応方法"&gt;対応方法&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# rootへ切り替え&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo -s&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# これらをインストール（man-pages-jaは特に不要）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yum install -y man-pages-ja&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ yum -y groupinstall &lt;span class="s2"&gt;&amp;#34;Japanese Support&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /etc/sysconfig/i18n を既存のものを一度全てコメントアウトする&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /etc/sysconfig/i18n &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/^#\? */# /g&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;mv /etc/sysconfig/i18n&lt;span class="o"&gt;{&lt;/span&gt;,.bk&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; tee /etc/sysconfig/i18n &amp;gt; /dev/null&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# /etc/sysconfig/i18n に設定追加&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;LANG=&amp;#34;ja_JP.UTF-8&amp;#34;&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tee -a /etc/sysconfig/i18n &amp;gt; /dev/null&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;644&lt;/span&gt; /etc/sysconfig/i18n&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ reboot now&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;再起動後は全てのパッケージをアップデートする。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Vimからはてなブログのエントリを登録・編集・削除してみる</title><link>https://genzouw.com/entry/2014/07/10/015257/20/</link><pubDate>Thu, 10 Jul 2014 01:52:57 +0900</pubDate><guid>https://genzouw.com/entry/2014/07/10/015257/20/</guid><description>&lt;h2 id="背景"&gt;背景&lt;/h2&gt;&#10;&lt;p&gt;最近めっきりブログを書いていなかった。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Google アナリティクス&lt;/strong&gt; から &lt;a href="https://developers.google.com/analytics/devguides/collection/upgrade/guide?hl=ja"&gt;ユニバーサル アナリティクス&lt;/a&gt; にアップグレードが出来るようになった。&#10;しかし、当ブログはノータッチだった。&lt;/p&gt;&#10;&lt;p&gt;久々にはてなブログを開き、設定しようとしたところ脇道にそれ、昔の記事を見ていたら自分にとっては有意義なメモが多いなぁと感じた。結果、再開しようと思い立った。&lt;/p&gt;&#10;&lt;p&gt;形から入る立ちなので、vimではてなブログのエントリを操作する環境を作って効率化してから！ということで、探してみた。&lt;/p&gt;&#10;&lt;h2 id="調査"&gt;調査&lt;/h2&gt;&#10;&lt;p&gt;早速良さそうなものが見つかった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://github.com/moznion/hateblo.vim"&gt;moznion/hateblo.vim · GitHub&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;導入方法は &lt;strong&gt;&lt;a href="https://github.com/moznion/hateblo.vim#hateblovim"&gt;Getting started&lt;/a&gt;&lt;/strong&gt; としてわかりやすくまとめてくれている。&lt;/p&gt;&#10;&lt;h2 id="ex-hateblovim-のスケルトン"&gt;ex) ~/.hateblo.vim のスケルトン&lt;/h2&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/02/b001.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;api_key&lt;/strong&gt; の設定がどこかが少しわかりにくかった。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ブログの管理ページから &lt;strong&gt;設定&lt;/strong&gt; を選んで…&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/02/b003.png" alt=""&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;AtomPub&lt;/strong&gt; の項目の &lt;strong&gt;APIキー&lt;/strong&gt; がそれ。（&lt;em&gt;ルートエンドポイント&lt;/em&gt; も必要）&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/02/b002.png" alt=""&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="結果"&gt;結果&lt;/h2&gt;&#10;&lt;p&gt;結果、当エントリは &lt;strong&gt;vim&lt;/strong&gt; + &lt;strong&gt;hateblo.vim&lt;/strong&gt; プラグインで無事投稿できました！&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;三日坊主治るかな。&lt;/p&gt;&#10;&lt;h2 id="20140710-追記"&gt;2014/07/10 追記&lt;/h2&gt;&#10;&lt;p&gt;少し使ってみて分かったこと。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;:HatebloCreate&lt;/code&gt; コマンド&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;こちらは編集中のvimバッファの内容を即座に投稿する場合に利用。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;:HatebloCreateDraft&lt;/code&gt; コマンド&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;こちらを探していた！vimバッファの内容を &lt;strong&gt;下書き&lt;/strong&gt; として投稿する。一般ユーザーからは見えない。&lt;/p&gt;&#10;&lt;p&gt;後日はてなブログの管理ページより、下書きの内容を投稿することが可能。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで1〜100までの数からランダムに10個を重複なしで取り出す方法</title><link>https://genzouw.com/entry/2014/07/10/014035/19/</link><pubDate>Thu, 10 Jul 2014 01:40:35 +0900</pubDate><guid>https://genzouw.com/entry/2014/07/10/014035/19/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;テストデータの中からランダムにデータを &lt;strong&gt;n件&lt;/strong&gt; （例えば10件）、取り出そうと思いました。&lt;/p&gt;&#10;&lt;p&gt;ランダムに抽出する方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 3.2.51&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-apple-darwin13&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2007&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ shuf --version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;shuf &lt;span class="o"&gt;(&lt;/span&gt;GNU coreutils&lt;span class="o"&gt;)&lt;/span&gt; 8.32&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Copyright &lt;span class="o"&gt;(&lt;/span&gt;C&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="m"&gt;2020&lt;/span&gt; Free Software Foundation, Inc.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="random-環境変数を使った方法"&gt;&lt;code&gt;$RANDOM&lt;/code&gt; 環境変数を使った方法&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;$RANDOM&lt;/code&gt; 環境変数を使う方法が思いつきましたが、問題がありました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="k"&gt;$((&lt;/span&gt;RANDOM%100+1&lt;span class="k"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記方法では、1から100までのランダムな値が取得はできますが、同じものが取得されることがあります。 （ ex: &lt;code&gt;1 99 3 53 1 5 20 19 80 100&lt;/code&gt; で、 &lt;strong&gt;1&lt;/strong&gt; が重複している ）&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;同じデータを重複して取得しないようにするにはどうしたらよいでしょう？&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="shuf-コマンドとパイプを使った方法"&gt;&lt;code&gt;shuf&lt;/code&gt; コマンドとパイプを使った方法&lt;/h2&gt;&#10;&lt;p&gt;以下のワンライナーで実現できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; 100&lt;span class="p"&gt;|&lt;/span&gt; shuf&lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol&gt;&#10;&lt;li&gt;データを用意（ここでは1〜100にしています。）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;shuf&lt;/code&gt; コマンドでデータ全体をシャッフル（行の順番を入れ替えるコマンドです）&lt;/li&gt;&#10;&lt;li&gt;最初の10件を取得&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;code&gt;head&lt;/code&gt; コマンドを使わない方法もあります。&#10;&lt;code&gt;shuf&lt;/code&gt; コマンドには &lt;code&gt;-n&lt;/code&gt; オプションがあります。&#10;これを使うとシャッフルした結果のうち、数件のみを出力させることができます。&lt;/p&gt;</description></item><item><title>boot2dockerを最も簡単に利用するには</title><link>https://genzouw.com/entry/2014/05/09/220837/21/</link><pubDate>Fri, 09 May 2014 22:08:37 +0900</pubDate><guid>https://genzouw.com/entry/2014/05/09/220837/21/</guid><description>&lt;p&gt;最近話題の &lt;a href="https://www.docker.io/"&gt;Docker&lt;/a&gt; を勉強し始めました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;CentOS&lt;/strong&gt; サーバーや &lt;strong&gt;Ubuntu&lt;/strong&gt; サーバーと言ったCUI環境では、なかなか &lt;a href="http://www.vagrantup.com/"&gt;Vagnat&lt;/a&gt; を動かすまでの準備が面倒です。&#10;特に &lt;strong&gt;Virtualbox&lt;/strong&gt; のインストールが面倒です。&#10;&lt;em&gt;（僕に至っては一度もVirtualBoxが正常にインストールできたことはありません）&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;それに比べてDockerは、VirtualboxやVMWareのような仮想化ツールは不要です。これ単体で動作します。&#10;また、 &lt;strong&gt;Vagrant&lt;/strong&gt; を利用する場合に比べて軽量です。&lt;/p&gt;&#10;&lt;p&gt;さて、Dockerを利用するとホストOSとなるホスト環境には、ほとんどツールやライブラリ入りません。軽量であればあるほどよいです。&#10;そのような背景で生まれてきたのが &lt;a href="https://github.com/boot2docker/boot2docker"&gt;boot2docker&lt;/a&gt; という軽量Linuxディストリビューションです。&#10;これを最も簡単に利用するためのコマンドを以下に載せておきます。&lt;/p&gt;&#10;&lt;h2 id="前提条件"&gt;前提条件&lt;/h2&gt;&#10;&lt;p&gt;以下のツールがインストールされており利用できる&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;em&gt;Virtualbox&lt;/em&gt;*&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;Vagrant&lt;/em&gt;*&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="コマンド"&gt;コマンド&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="o"&gt;[&lt;/span&gt; ! -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/vagrant/boot2docker&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/vagrant/boot2docker&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/vagrant/boot2docker&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vagrant init boot2docker https://github.com/mitchellh/boot2docker-vagrant-box/releases/download/v0.3.0/boot2docker.box&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vagrant up&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vagrant ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="2014-05-16-追記"&gt;2014-05-16 追記&lt;/h2&gt;&#10;&lt;p&gt;もっと簡単に行ける模様。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="o"&gt;[&lt;/span&gt; ! -d &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/vagrant/boot2docker&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir -p &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/vagrant/boot2docker&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$HOME&lt;/span&gt;&lt;span class="s2"&gt;/vagrant/boot2docker&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vagrant init mitchellh/boot2docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vagrant up&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vagrant ssh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>各データベース別のorder by実行時のNULLの扱い</title><link>https://genzouw.com/entry/2013/11/10/115609/22/</link><pubDate>Sun, 10 Nov 2013 11:56:09 +0900</pubDate><guid>https://genzouw.com/entry/2013/11/10/115609/22/</guid><description>&lt;p&gt;新人の頃のメモ書きを見返していたら、Oracleでは &lt;em&gt;NULL&lt;/em&gt; が常に最大値扱いとなるとあったので、他のDBについてどのような挙動になるか調べてみた。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Oracle&lt;/li&gt;&#10;&lt;li&gt;PostgreSQL&lt;/li&gt;&#10;&lt;li&gt;MySQL&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mysql -V&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mysql Ver 14.14 Distrib 5.6.13, &lt;span class="k"&gt;for&lt;/span&gt; osx10.8 &lt;span class="o"&gt;(&lt;/span&gt;x86_64&lt;span class="o"&gt;)&lt;/span&gt; using EditLine wrapper&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ psql -V&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;psql &lt;span class="o"&gt;(&lt;/span&gt;PostgreSQL&lt;span class="o"&gt;)&lt;/span&gt; 9.3.1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="調査"&gt;調査&lt;/h2&gt;&#10;&lt;p&gt;以下の様なテーブルとデータを作成してみた。&lt;/p&gt;&#10;&lt;h2 id="mysql"&gt;MySQL&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;auto_increment&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;primary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="postgresql"&gt;PostgreSQL&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;create&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;serial&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;primary&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;INTO&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mytable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;column1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;VALUES&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;それぞれソートしてみる。&lt;/p&gt;</description></item><item><title>Redmineで新規登録する際に便利なブックマークを作成するためのブックマークレット</title><link>https://genzouw.com/entry/2013/10/23/223302/23/</link><pubDate>Wed, 23 Oct 2013 22:33:02 +0900</pubDate><guid>https://genzouw.com/entry/2013/10/23/223302/23/</guid><description>&lt;p&gt;作ってみた。&lt;/p&gt;&#10;&lt;h2 id="登録方法"&gt;登録方法&lt;/h2&gt;&#10;&lt;p&gt;Chromeで試した。&lt;/p&gt;&#10;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;h3 id="1以下のソースコードをコピーする"&gt;1.以下のソースコードをコピーする。&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;input&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;text&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;checkbox&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;checked&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;inputs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementsByTagName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;select&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;inputs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;=&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;?&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}());&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2ブックマークに登録する"&gt;2.ブックマークに登録する。&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;ticket_template_maker&lt;/strong&gt; などで登録。&lt;/p&gt;&#10;&lt;h3 id="3redmineの新しいチケットページを開きテンプレート登録したい内容を入力"&gt;3.Redmineの新しいチケットページを開き、テンプレート登録したい内容を入力&lt;/h3&gt;&#10;&lt;h3 id="4tiket_template_makerを呼び出す"&gt;4.tiket_template_makerを呼び出す。&lt;/h3&gt;&#10;&lt;h3 id="5新しいチケットページが再表示されるのでこちらをブックマーク登録する"&gt;5.新しいチケットページが再表示されるので、こちらをブックマーク登録する。&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;hoge_project_template&lt;/strong&gt; などで登録する。&lt;/p&gt;&#10;&lt;p&gt;後は、新しいチケットを登録する際に &lt;strong&gt;hoge_project_template&lt;/strong&gt; ブックマークを呼び出せばOK。&lt;/p&gt;</description></item><item><title>Macでgit-svnを使ってプロジェクトドキュメントをダウンロードするとファイルが管理対象外として扱われる</title><link>https://genzouw.com/entry/2013/10/16/231339/24/</link><pubDate>Wed, 16 Oct 2013 23:13:39 +0900</pubDate><guid>https://genzouw.com/entry/2013/10/16/231339/24/</guid><description>Macでgit-svnを使ってプロジェクトドキュメントをダウンロードするとダウンロードされたファイルが管理対象外として扱われる 事象 Macでプロジェクトドキュメントを以下のコマンドでcloneした。 git clone -s http://hoge-server/path/to/the/project/ clone下ばかりのクリーンなフォルダのはずなのに、 何故か日本語ディレクトリの幾つかが管理対象外扱いとなっている。 どうも濁点、半濁点を含む日本語名フォルダがおかしくなる模様。 対処法 どうもMacは一般的なUTF-8とは異なる文字コードを利用しているようだ。 簡単に説明すると、ファイル名…</description></item><item><title>jQuery Mobileでヘッダー右端にほんの少し余白が表示されてしまう場合の対処</title><link>https://genzouw.com/entry/2013/06/17/235646/25/</link><pubDate>Mon, 17 Jun 2013 23:56:46 +0900</pubDate><guid>https://genzouw.com/entry/2013/06/17/235646/25/</guid><description>&lt;h2 id="問題"&gt;問題&lt;/h2&gt;&#10;&lt;p&gt;ヘッダー右端にほんの少し白い余白が表示されてしまう場合の対処について。以下のようなページを作成すると発生。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2019/02/20130617234530.png" alt=""&gt;&lt;/p&gt;&#10;&lt;script src="https://gist.github.com/anonymous/f7f6a7c5a31a1fce17e0.js"&gt;&lt;/script&gt;&#10;&lt;h2 id="対処"&gt;対処&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;div[data-role=page]&lt;/code&gt; から以下の要素を除去&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;data-fullscreen=&amp;quot;true&amp;quot;&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;div[data-role=head]&lt;/code&gt; に以下の要素を追加&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;data-position=&amp;quot;fixed&amp;quot;&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;script src="https://gist.github.com/genzouw/35f29224a32c13b7178c.js"&gt;&lt;/script&gt;</description></item><item><title>MySQLでクエリ実行結果を横一列から縦一列に表示させる</title><link>https://genzouw.com/entry/2013/06/07/152608/31/</link><pubDate>Fri, 07 Jun 2013 15:26:08 +0900</pubDate><guid>https://genzouw.com/entry/2013/06/07/152608/31/</guid><description>&lt;p&gt;Select句の最後に &lt;strong&gt;\G&lt;/strong&gt; を付与し実行する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;select&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hoge_table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="k"&gt;G&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とても見やすい。&lt;/p&gt;</description></item><item><title>2013年06月07日のツイート</title><link>https://genzouw.com/entry/2013/06/07/000442/32/</link><pubDate>Fri, 07 Jun 2013 00:04:42 +0900</pubDate><guid>https://genzouw.com/entry/2013/06/07/000442/32/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;speediとかいらないし / 福井の原発事故で琵琶湖汚染裏付け　滋賀県がＳＰＥＥＤＩの拡散予測結果公表 - MSN産経ニュース &lt;a class="twitter-tweet-url" href="http://t.co/OI1AHSNH7Y" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/342836284043182080" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-06-07&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;11:51:54&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;"Amazonのクラウド・データベースRDSからベータが外れる―月間アップタイム99.95%を保証するSLAを提供" &lt;a class="twitter-tweet-url" href="http://t.co/nsqBV9BCeS" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/342789837717393408" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-06-07&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:47:20&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.feedly.com" rel="nofollow"&gt;feedly&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;アマゾンともあろう会社が直訳ｗ&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/342667106988486656" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-06-07&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:39:39&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;AWSのドキュメント（pdf）読んでたんだが、いきなり「アマゾンマシン画像」なる単語がサーバーの図やサーバー説明とともに出現し、「ああ、このサーバーの図がアマゾンマシン画像なんだな」と思って読み進めてたら、どうやらAMI（アマゾンマシンイメージ？）のことらしい事がわかった。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/342667033655263233" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-06-07&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:39:21&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年06月06日のツイート</title><link>https://genzouw.com/entry/2013/06/06/001025/33/</link><pubDate>Thu, 06 Jun 2013 00:10:25 +0900</pubDate><guid>https://genzouw.com/entry/2013/06/06/001025/33/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;aws無料版を使おうと頑張って、昨日からはまっていたけどようやく抜けた。Security Groupの設定が問題だったようです。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/342642791219855363" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-06-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:03:02&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&amp;ldquo;内部から見たVert.xとNode.jsとの比較&amp;rdquo; good read &lt;a href="http://t.co/CJDfndCLRe" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/342429551680442369" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-06-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:55:41&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://itunes.apple.com/us/app/feedly/id396069556?mt=8&amp;amp;uo=4" rel="nofollow"&gt;feedly on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;すごい顔 &lt;a href="http://t.co/FLENcwcbhK" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/342418658800320512" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-06-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:12:24&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>UbuntuやCentOSでBashログイン後に「warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)」が表示された場合の対処</title><link>https://genzouw.com/entry/2013/06/04/223158/36/</link><pubDate>Tue, 04 Jun 2013 22:31:58 +0900</pubDate><guid>https://genzouw.com/entry/2013/06/04/223158/36/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;新しく導入したばかりの Linux サーバーに Bash でログインしたところ、次の様なメッセージが表示されるようになりました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bash: warning: setlocale: LC_ALL: cannot change locale &lt;span class="o"&gt;(&lt;/span&gt;ja_JP.UTF-8&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原因を解消すべく、対応したときのメモです。&lt;/p&gt;&#10;&lt;h2 id="実行環境"&gt;実行環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$1&lt;/span&gt; SMP PREEMPT Thu May &lt;span class="m"&gt;25&lt;/span&gt; 07:27:39 UTC &lt;span class="m"&gt;2023&lt;/span&gt; x86_64 x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 5.1.16&lt;span class="o"&gt;(&lt;/span&gt;1&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-pc-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;PRETTY_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu 22.04.3 LTS&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Ubuntu&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.04&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;22.04.3 LTS (Jammy Jellyfish)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION_CODENAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;jammy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;ubuntu&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="直前に行ったこと"&gt;直前に行ったこと&lt;/h2&gt;&#10;&lt;p&gt;直前に行なっていたことは、 &lt;code&gt;.bashrc&lt;/code&gt; に環境変数を幾つか追加したことでした。&#10;次の２行を追加していました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ja_JP.UTF-8&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ロケールとは"&gt;ロケールとは&lt;/h2&gt;&#10;&lt;p&gt;ロケール ( locale ) とは、コンピューター上で使用される言語や地域に関する設定のことを指します。&#10;具体的には、言語、文字コード、通貨、日付や時刻の書式などが含まれます。&#10;ロケールは、ユーザーが使用する言語や地域に合わせて設定することで、コンピューター上で表示されるテキストや日付などが適切な形式で表示されるようになります。&#10;Linux では、ロケールを設定するためのコマンドや設定ファイルが用意されており、ユーザーが自由に設定できます。&lt;/p&gt;</description></item><item><title>2013年05月29日のツイート</title><link>https://genzouw.com/entry/2013/05/29/001033/43/</link><pubDate>Wed, 29 May 2013 00:10:33 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/29/001033/43/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;html5の一部、使って見たけどこりゃ便利だね。geolocation、localstorage。ちょっとしたところでnumberコントロールやplaceholderなんかも。bootstrapも。楽しいなぁ。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/339412837082464257" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-29&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;01:08:21&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;twitterのツイートボタン、フォローボタンを追加してみた。 / Friends Map &lt;a class="twitter-tweet-url" href="http://t.co/pPBGOsPBaS" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; &lt;a href="http://twitter.com/search?q=%23friends_map" target="_top"&gt;#friends_map&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/339399899625963520" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-29&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:16:56&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月28日のツイート</title><link>https://genzouw.com/entry/2013/05/28/001145/44/</link><pubDate>Tue, 28 May 2013 00:11:45 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/28/001145/44/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;google maps apiで２地点間の距離取得できた！意外と簡単だな。computeDistanceBetweenを利用する。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/339390292333568001" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-28&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:38:45&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;たった一行実装するだけなのに利用するapi検索するのに30分ぐらいかかってしまう。検索する力大事よなぁ。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/339389920152023040" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-28&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:37:17&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月27日のツイート</title><link>https://genzouw.com/entry/2013/05/27/000428/45/</link><pubDate>Mon, 27 May 2013 00:04:28 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/27/000428/45/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;なるほど。Polylineで二点間の距離が取れると。帰ったらやってみる。 &lt;a href="http://t.co/HCpIAvDKyn" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/338805884132147200" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-27&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:56:32&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="https://itunes.apple.com/us/app/chrome/id535886823?mt=8&amp;amp;uo=4" rel="nofollow"&gt;Chrome on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;少しそれっぽくなってきた。bootstrap適用して、circleつけてみた。 &lt;a href="http://t.co/SFrJrbDJrJ" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/338773854203813888" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-27&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;06:49:15&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月25日のツイート</title><link>https://genzouw.com/entry/2013/05/25/000438/46/</link><pubDate>Sat, 25 May 2013 00:04:38 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/25/000438/46/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;今、googleの検索結果ページでjキー押したら、検索結果が１つ１つ下に下がっていった。いつの間にこんな機能が。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/338115879055286272" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-25&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;11:14:42&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月23日のツイート</title><link>https://genzouw.com/entry/2013/05/23/001051/47/</link><pubDate>Thu, 23 May 2013 00:10:51 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/23/001051/47/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;眠たい波着てる・・・・&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/337578037631676416" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:37:30&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;瀬戸内海の海の上から僕のサイトみた奇特な方いるんだなw &lt;a href="http://t.co/SFrJrbDJrJ" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/337561870133248000" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:33:16&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;定期的に同期するたびに地図の中央に戻るので直した。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/337556830727315456" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:13:14&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;またちょっとだけ直した。また走るはめに。 &lt;a href="http://t.co/SFrJrbDJrJ" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/337334833023959040" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:31:06&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;眠い…&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/337253104636555265" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;02:06:20&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;眠たいのはいいとして（良くないが）GPSを使って、自分の近辺でアプリを起動した人を探しだすサービスを作ってみた。僕の住所バレるなｗ &lt;a href="http://t.co/SFrJrbDJrJ" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/337251243535765504" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;01:58:56&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;眠たい感じ。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/337250992301170689" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;01:57:57&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月22日のツイート</title><link>https://genzouw.com/entry/2013/05/22/000554/48/</link><pubDate>Wed, 22 May 2013 00:05:54 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/22/000554/48/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;スマホ所持者の現在地は表示されるようになった。指定した時間間隔でリフレッシュ。 &lt;a class="twitter-tweet-url" href="http://t.co/bKjBm7t1ww" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/337188155964932096" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:48:15&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;すげー便利！ドメイン別にスタイルシート（CSS）を当てる方法。 &lt;a class="twitter-tweet-url" href="http://t.co/8F1FE7PR3o" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/337163804540559361" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:11:29&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ここ見るとmaps api v3からはキーは要らないと書かれてるな。 / Google Maps APIを使ったページの基本構成 - Google Maps APIの基本 - Google Maps入門 &lt;a class="twitter-tweet-url" href="http://t.co/5UA1gkLhMN" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336981485775101952" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:07:01&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/eye1103" target="_top"&gt;eye1103&lt;/a&gt; はしる！&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336978360582426624" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:54:36&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/eye1103/status/336978080788783105" class="twitter-user-screen-name"&gt;eye1103&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;google maps apiはそうなるといらないね。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336978142084337665" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:53:44&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;結構gps位置情報正しく取れそうだな。例えばある会場内の画像に対して、現在地をプロットしたりできそうだ。事前に会場の四隅の位置情報とっておく必要はあるけど。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336978021837852672" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:53:15&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;google maps api使うにはキーの発行手続きが必要みたいだな。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336976160380559365" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:45:52&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;やばい遅刻する&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336974205360955393" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:38:05&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;自動リフレッシュでgps位置情報取得しようとするとgoogleに怒られる件。 &lt;a class="twitter-tweet-url" href="http://t.co/bKjBm7t1ww" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336973898438553602" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:36:52&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月21日のツイート</title><link>https://genzouw.com/entry/2013/05/21/000451/49/</link><pubDate>Tue, 21 May 2013 00:04:51 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/21/000451/49/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;勉強会を企画すべきかなぁどうか。 / 4年後、『プレイングマネージャ』の君へ: 続かなかった社内勉強会 &lt;a class="twitter-tweet-url" href="http://t.co/IVzMEcNSsQ" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336853959547424769" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-21&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:40:17&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;正直なところあまりメンバー乗り気でないみたい。なにか作りたい！という気持ちが先行して、どのようなものを作りたいかが曖昧なままの発車。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336852519189897216" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-21&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:34:33&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;言い出しっぺは多分に僕なので、積極的に動く必要があるな。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336852033711792129" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-21&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:32:37&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;社内メンバーでなにかアプリを開発して公開してみようということになった。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336851891902369792" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-21&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:32:04&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;200人まで無料で使えるグループウェア「サイボウズLive」を使い始めました。 &lt;a class="twitter-tweet-url" href="https://t.co/iUNAroEWs7" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336813427097993216" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-21&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:59:13&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://live.cybozu.co.jp" rel="nofollow"&gt;サイボウズLive&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;マジがよ！これ青森にしか無かったの？！美味いのに / 【画像】青森のソウルフード「イギリストースト」が話題に 【画像】青森のソウルフード「イギリストースト」が話題に&lt;a class="twitter-tweet-url" href="http://t.co/EqSGtuxl90" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/336565434532888576" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-21&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;04:33:47&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月20日のツイート</title><link>https://genzouw.com/entry/2013/05/20/000502/50/</link><pubDate>Mon, 20 May 2013 00:05:02 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/20/000502/50/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;アクション映画のシーンを「銃→親指」に変えたらメッチャポジティブになったでござる　Thumbs and Ammo &lt;a href="http://t.co/zTUv2XXvIK" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/336463748195815426" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-20&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:49:43&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月19日のツイート</title><link>https://genzouw.com/entry/2013/05/19/000520/51/</link><pubDate>Sun, 19 May 2013 00:05:20 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/19/000520/51/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;本屋きたので次回購入したい本をピックアップしておく / プログラミングPHP 第2版 &lt;a class="twitter-tweet-url" href="http://t.co/G3FW7SG9s6" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; @&lt;a class="twitter-user-screen-name" href="http://twitter.com/AmazonJP" target="_top"&gt;AmazonJP&lt;/a&gt;さんから&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/335963010185195520" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-19&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;12:39:58&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月18日のツイート</title><link>https://genzouw.com/entry/2013/05/18/000519/52/</link><pubDate>Sat, 18 May 2013 00:05:19 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/18/000519/52/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;Gradleで特定のテストだけを実行させる方法。 / Gradle Goodness: Running a Single Test Gradle Goodness: Running a Single Test&lt;a href="http://t.co/AJo4XI6LrB" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/335424885864161280" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-18&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;01:01:39&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;apt-getから乗り換えるか / aptitude の検索結果のあれ aptitude の検索結果のあれ&lt;a href="http://t.co/gizC4fSVC5" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/335424880088592385" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-18&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;01:01:37&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月16日のツイート</title><link>https://genzouw.com/entry/2013/05/16/000443/53/</link><pubDate>Thu, 16 May 2013 00:04:43 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/16/000443/53/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;TDLの方に迷惑というのもあるが、子ども目線でも見てあげてほしい。不安やったやろに。 / 『迷子センター』を託児所がわりに使ったことで…主人と義母からメチャ罵倒されまし... &lt;a class="twitter-tweet-url" href="http://t.co/8a5Y2O17q8" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; #知恵袋_&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/334808802807394304" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:13:33&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;それでも彼、ちゃんと説明してくれるからありがたい。プログラム組める、設計できるも大事だけどそれを消化して伝える、他の事例に流用するっていう能力もプログラマに大事ね。その辺りの力、多分に自分に足りないと思う。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/334696240057053184" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:46:16&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;それはともかくとして、こちらの質問についても仕組みをわかりやすく噛み砕いて説明してくれる。多分俺が余計な質問しなければもっと作業進められるんだろうと思ったりする。こっちもステークホルダに説明する義務があるからそうも言ってられないのだが。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/334695887383171072" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:44:52&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;4月から一緒に仕事させてもらってる子が非常に良くできて、仕事が楽しい。いろいろ知ってるので教えてもらってばかり。今まで「先輩こんなことも〜」な感じだったけど、逆の立場になると受け流してくれてた先輩方、本当にごめんなさい。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/334695471194980352" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:43:13&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;以下にお客様にプログラムの動作、仕様を理解していただくように説明できるか…ここ数ヶ月の課題。ドキュメント書くのはきらいじゃないけどそれに見合う時間の使い方かと考えるとうーんとなるんだよね。でもやり取りの形を残さないと言った言わないになる。どのプロジェクトに関わってこ毎回課題。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/334694913709047809" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:41:00&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月14日のツイート</title><link>https://genzouw.com/entry/2013/05/14/001123/55/</link><pubDate>Tue, 14 May 2013 00:11:23 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/14/001123/55/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/hebayour" class="twitter-user-screen-name" target="_top"&gt;hebayour&lt;/a&gt; まじでか！&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/334268226500452352" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-14&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:25:30&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/hebayour/status/334208107557294080" class="twitter-user-screen-name"&gt;hebayour&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;★ 【要約】夢をかなえるゾウ B! &lt;a href="http://t.co/pFCbHzfZyW" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/334145852056674306" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-14&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;12:19:13&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://ifttt.com" rel="nofollow"&gt;IFTTT&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月13日のツイート</title><link>https://genzouw.com/entry/2013/05/13/000532/56/</link><pubDate>Mon, 13 May 2013 00:05:32 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/13/000532/56/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/eye1103" target="_top"&gt;eye1103&lt;/a&gt; @&lt;a class="twitter-user-screen-name" href="http://twitter.com/butaminton" target="_top"&gt;butaminton&lt;/a&gt; 24以外なら調整できるかと。土日は娘らがまとわりついてくるので。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/333952149270691841" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:29:31&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/eye1103/status/333951901907431427" class="twitter-user-screen-name"&gt;eye1103&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/butaminton" target="_top"&gt;butaminton&lt;/a&gt; @&lt;a class="twitter-user-screen-name" href="http://twitter.com/eye1103" target="_top"&gt;eye1103&lt;/a&gt; mintoさんわかりました。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/333951412251803648" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:26:35&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/butaminton/status/333951321541586945" class="twitter-user-screen-name"&gt;butaminton&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/butaminton" target="_top"&gt;butaminton&lt;/a&gt; @&lt;a class="twitter-user-screen-name" href="http://twitter.com/eye1103" target="_top"&gt;eye1103&lt;/a&gt; 失礼。暇だと思ったわけではないよ。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/333951315891851266" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:26:12&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/butaminton/status/333951050614726656" class="twitter-user-screen-name"&gt;butaminton&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/butaminton" target="_top"&gt;butaminton&lt;/a&gt; @&lt;a class="twitter-user-screen-name" href="http://twitter.com/eye1103" target="_top"&gt;eye1103&lt;/a&gt; 結構あいてるなと思ってワラタ&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/333951230583906305" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:25:52&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/butaminton/status/333951050614726656" class="twitter-user-screen-name"&gt;butaminton&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/hebayour" target="_top"&gt;hebayour&lt;/a&gt; よし、じゃあ飲みに行こう！&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/333949322360156160" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:18:17&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/hebayour/status/333949006566813696" class="twitter-user-screen-name"&gt;hebayour&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;結構非難が多いけど僕はものすごく納得。プログラミングの能力と同時にそれを同業者だけでなく、ユーザーにも噛み砕いて説明できるメンバーはとても格好良く、仕事を楽しんでるように思える。 &lt;a class="twitter-tweet-url" href="http://t.co/q8OK14qXWi" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/333948911469334529" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:16:39&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/butaminton" target="_top"&gt;butaminton&lt;/a&gt; @&lt;a class="twitter-user-screen-name" href="http://twitter.com/eye1103" target="_top"&gt;eye1103&lt;/a&gt; じゃ来週以降で。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/333947470121943041" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:10:55&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/butaminton/status/333946865315901440" class="twitter-user-screen-name"&gt;butaminton&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/eye1103" target="_top"&gt;eye1103&lt;/a&gt; @&lt;a class="twitter-user-screen-name" href="http://twitter.com/butaminton" target="_top"&gt;butaminton&lt;/a&gt; ああリア充のbutaさんよろしくお願いします。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/333945524581462017" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:03:12&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/eye1103/status/333945210876862464" class="twitter-user-screen-name"&gt;eye1103&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/eye1103" target="_top"&gt;eye1103&lt;/a&gt; @&lt;a class="twitter-user-screen-name" href="http://twitter.com/butaminton" target="_top"&gt;butaminton&lt;/a&gt; 行くか。割り勘で良ければ。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/333944450596343808" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:58:56&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/eye1103/status/333943949393788929" class="twitter-user-screen-name"&gt;eye1103&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;最近酒で寝るようになってきてる。嫁さんが一言。「アル中の第一歩やな」&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/333941934928326656" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:48:56&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;秦基博いいなぁ。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/333939855706951682" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:40:40&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年05月09日のツイート</title><link>https://genzouw.com/entry/2013/05/09/001121/58/</link><pubDate>Thu, 09 May 2013 00:11:21 +0900</pubDate><guid>https://genzouw.com/entry/2013/05/09/001121/58/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;★ [&lt;a href="http://d.hatena.ne.jp/keyword/twitter" class="keyword"&gt;twitter&lt;/a&gt;]2013/05/01のツイート B! &lt;a href="http://t.co/rwrpDZpNaL" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/332454747133071360" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:19:23&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://ifttt.com" rel="nofollow"&gt;IFTTT&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;★ &lt;a href="http://d.hatena.ne.jp/keyword/Ruby" class="keyword"&gt;Ruby&lt;/a&gt;ライクにGroovyを書く B! &lt;a href="http://t.co/GxidzpObzL" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/332288751575392256" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;09:19:46&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://ifttt.com" rel="nofollow"&gt;IFTTT&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;[Mac] Finderでフォルダのパスを表示する [Mac] Finderでフォルダのパスを表示する&lt;a href="http://t.co/rieGZPZrx3" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/332280918381322240" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:48:39&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;死ぬべきは言い過ぎとしてもいつもながらどきりとさせられる / 企業が求めるストレスに強い人材像に関する矛盾 企業が求めるストレスに強い人材像に関する矛盾&lt;a href="http://t.co/8rfzeS2hq5" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/332264487262511105" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-05-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:43:21&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年04月26日のツイート</title><link>https://genzouw.com/entry/2013/04/26/000548/62/</link><pubDate>Fri, 26 Apr 2013 00:05:48 +0900</pubDate><guid>https://genzouw.com/entry/2013/04/26/000548/62/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;これはいい！&lt;a href="http://d.hatena.ne.jp/keyword/JavaScript" class="keyword"&gt;JavaScript&lt;/a&gt; のthis、よく分からなかったけどわかった。 / &lt;a href="http://d.hatena.ne.jp/keyword/JavaScript" class="keyword"&gt;JavaScript&lt;/a&gt;の「this」は「４つ」だけ！ &lt;a href="http://twitter.com/search?q=%23JavaScript" target="_top"&gt;#JavaScript&lt;/a&gt; &lt;a href="http://t.co/vhwPueOTUN" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/327568413448888322" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-26&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:42:50&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;サイトに使われている技術が丸裸になる&lt;a href="http://d.hatena.ne.jp/keyword/Chrome" class="keyword"&gt;Chrome&lt;/a&gt;拡張「BuiltWith」 &lt;a href="http://t.co/JnABYlHNlX" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/327568408692539393" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-26&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:42:49&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;何文字までを前方一致と判定するんだろ。 / Groovy Goodness: Partial Matches &lt;a href="http://t.co/OYsh9WFHWq" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/327568401415434242" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-26&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:42:47&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年04月24日のツイート</title><link>https://genzouw.com/entry/2013/04/24/000454/63/</link><pubDate>Wed, 24 Apr 2013 00:04:54 +0900</pubDate><guid>https://genzouw.com/entry/2013/04/24/000454/63/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;似たような言語あったなあ / &lt;a href="http://d.hatena.ne.jp/keyword/scala" class="keyword"&gt;scala&lt;/a&gt;では、val宣言を利用し値を全て定数として扱い再代入を抑制する事で、変数の状態変化を覚えておく必要が無くなると言うことです。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/326840911088738304" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-24&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:32:00&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年04月23日のツイート</title><link>https://genzouw.com/entry/2013/04/23/001042/64/</link><pubDate>Tue, 23 Apr 2013 00:10:42 +0900</pubDate><guid>https://genzouw.com/entry/2013/04/23/001042/64/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;子育てなんかそういう場面ある。子どもが他の友達におもちゃかさない、対応がつめたい。 ダメよとついいってしまう。背景も理解せずに。なぜ、を理解するのに焦ってはいけないよね。なるべくしてciや&lt;a href="http://d.hatena.ne.jp/keyword/%A5%E6%A5%CB%A5%C3%A5%C8%A5%C6%A5%B9%A5%C8" class="keyword"&gt;ユニットテスト&lt;/a&gt;の文化がないのかもしれない。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/326670214513172480" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:13:43&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;これっていろんな場合に当てはまるよね。後輩、子ども、嫁とか。年配の方に食事に誘っていただいて、結果を焦ったらこうなりやすいと指摘をいただいた。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/326669372489859072" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:10:22&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;出先の会社のやり方が今までやって来た自分のやり方と違った場合つい否定したくなるけど、なぜそういうやり方になったかを理解せずひていしてるさいきんにはんせい。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/326668696116408320" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:07:41&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/jQuery" class="keyword"&gt;jQuery&lt;/a&gt;グラフ描画ライブラリjqplotで折れ線グラフを描く &lt;a href="http://t.co/dvSuggeKr5" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/326659433407078401" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:30:52&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Bashシェルスクリプトでファイルやディレクトリを".yyyymmdd"付きでバックアップする</title><link>https://genzouw.com/entry/2013/04/20/111538/65/</link><pubDate>Sat, 20 Apr 2013 11:15:38 +0900</pubDate><guid>https://genzouw.com/entry/2013/04/20/111538/65/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;Unix上のファイルやディレクトリを変更する前に、バックアップするために日付つきファイル名としてコピーしておくことがありますね。&lt;/p&gt;&#10;&lt;p&gt;「今日は何年何月何日だったっけ？」と悩む必要がないように、現在日時を &lt;code&gt;.YYYYMMDD&lt;/code&gt; で取得し、コピー先ファイル名のサフィックスとして付与するコマンドを紹介します。&lt;/p&gt;&#10;&lt;h2 id="yyyymmdd-サフィックス付きでバックアップファイルを作成するコマンド"&gt;&amp;ldquo;.YYYYMMDD&amp;rdquo; サフィックス付きでバックアップファイルを作成するコマンド&lt;/h2&gt;&#10;&lt;p&gt;以下のように、 &lt;code&gt;{,.$(date +%Y%m%d)}&lt;/code&gt; という記述を使用します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# file_to_backupというファイルが存在&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file_to_backup&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# -a オプション付きでコピー&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cp -a file_to_backup&lt;span class="o"&gt;{&lt;/span&gt;,.&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 年月日付きでファイルがバックアップされている&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;file_to_backup file_to_backup.20130420&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="簡単な解説"&gt;簡単な解説&lt;/h2&gt;&#10;&lt;p&gt;実行されたコマンドは以下のように解釈されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cp -a file_to_backup file_to_backup.&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y%m%d&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;cp&lt;/code&gt; コマンドの &lt;code&gt;-a&lt;/code&gt; オプションは、所有者、パーミッションをそのまま保持するためのオプションです。また、 &lt;code&gt;-R&lt;/code&gt; オプションと同様、ディレクトリの場合には階層構造を保持したまま再帰的にコピーします。&lt;/p&gt;</description></item><item><title>2013年04月18日のツイート</title><link>https://genzouw.com/entry/2013/04/18/000440/66/</link><pubDate>Thu, 18 Apr 2013 00:04:40 +0900</pubDate><guid>https://genzouw.com/entry/2013/04/18/000440/66/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;笑ったけど可愛い &lt;a href="http://t.co/C7pOCBjbc8" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/324648306917654529" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-18&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:19:22&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="https://itunes.apple.com/us/app/chrome/id535886823?mt=8&amp;amp;uo=4" rel="nofollow"&gt;Chrome on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Bashシェルスクリプトで年、月、日を1コマンドでそれぞれの変数に分割</title><link>https://genzouw.com/entry/2013/04/16/125957/67/</link><pubDate>Tue, 16 Apr 2013 12:59:57 +0900</pubDate><guid>https://genzouw.com/entry/2013/04/16/125957/67/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;プログラミングで年月日の値を利用することは多いです。&#10;僕も何度日時を操作するプログラムを記述したか。&lt;/p&gt;&#10;&lt;p&gt;Bashシェルスクリプトで年月日を分割取得するちょっとかわった方法を紹介します。&lt;/p&gt;&#10;&lt;h2 id="方法その1--愚直に-date-コマンドを3回実行"&gt;方法その1 : 愚直に &lt;code&gt;date&lt;/code&gt; コマンドを3回実行&lt;/h2&gt;&#10;&lt;p&gt;すぐに思いつくのは、 &lt;code&gt;date&lt;/code&gt; コマンドを3回叩いて年、月、日の値をそれぞれ別の変数に代入するという方法です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;YEAR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%Y&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;MONTH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%m&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;DATE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;date +%d&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$YEAR&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2013&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$MONTH&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;04&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$DATE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;16&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="方法その2--set-コマンドで分割"&gt;方法その2 : &lt;code&gt;set&lt;/code&gt; コマンドで分割&lt;/h2&gt;&#10;&lt;p&gt;別の方法として、 &lt;code&gt;set&lt;/code&gt; コマンドを使って一度に分割し、それぞれの変数を用意することができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;set&lt;/span&gt; -- &lt;span class="k"&gt;$(&lt;/span&gt;date &lt;span class="s1"&gt;&amp;#39;+%Y %m %d&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 年を表示&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2013&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 月を表示&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;04&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 日を表示&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;16&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="方法その3--一度配列として変数代入"&gt;方法その3 : 一度、配列として変数代入&lt;/h2&gt;&#10;&lt;p&gt;&lt;em&gt;コメントで「こんな方法もあるよ！」と連絡いただきました！ありがとうございます。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;一度 &lt;code&gt;date&lt;/code&gt; コマンドの実行結果を配列に代入し、添字を使って年、月、日を参照していきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 配列として代入&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;YMD&lt;/span&gt;&lt;span class="o"&gt;=(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;$(&lt;/span&gt;date +&lt;span class="s1"&gt;&amp;#39;%Y %m %d&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 年を表示&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;YMD&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2013&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 月を表示&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;YMD&lt;/span&gt;&lt;span class="p"&gt;[1]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;04&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 日を表示&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;YMD&lt;/span&gt;&lt;span class="p"&gt;[2]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;16&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;1コマンドで別変数に代入する方法は簡潔ではありますが、注意が必要です。&lt;/p&gt;</description></item><item><title>yumでインストールしたパッケージのバージョンを確認</title><link>https://genzouw.com/entry/2013/04/15/100506/69/</link><pubDate>Mon, 15 Apr 2013 10:05:06 +0900</pubDate><guid>https://genzouw.com/entry/2013/04/15/100506/69/</guid><description>&lt;p&gt;phpで利用するmcryptのバージョンを確認したかった。以下のコマンドで確認できた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo yum list installed &lt;span class="p"&gt;|&lt;/span&gt; grep -i mcrypt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cryptsetup-luks.x86_64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cryptsetup-luks-libs.x86_64&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;libmcrypt.x86_64 2.5.8-9.el6 @epel&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;php-mcrypt.x86_64 5.4.14-1.el6.remi @remi&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>2013年04月09日のツイート</title><link>https://genzouw.com/entry/2013/04/09/000523/74/</link><pubDate>Tue, 09 Apr 2013 00:05:23 +0900</pubDate><guid>https://genzouw.com/entry/2013/04/09/000523/74/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;RT @&lt;a class="twitter-user-screen-name" href="http://twitter.com/tarareba722" target="_top" rel="noopener noreferrer"&gt;tarareba722&lt;/a&gt;: 日本人と結婚したアメリカ人女性が以前、「日本人はあまり“愛してる”と言わないし、すぐ謝罪すると思われているが、少し違う。彼らは“愛してる”という意味を込めて“ありがとう”と言うことが多く、また“ありがとう”という意味を込めて“すいません” ...&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/321606213102080000" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:51:11&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via Silver Bird&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;同一サーバーなら、&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/MySQL"&gt;MySQL&lt;/a&gt;の複数DBに対する同一コネクション内更新は１&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%C8%A5%E9%A5%F3%A5%B6%A5%AF%A5%B7%A5%E7%A5%F3"&gt;トランザクション&lt;/a&gt;となると。なるほど。 / &lt;a class="twitter-tweet-url" href="http://t.co/DEPQhGdi6r" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/321593016282398720" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:58:44&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via Silver Bird&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年04月08日のツイート</title><link>https://genzouw.com/entry/2013/04/08/001158/75/</link><pubDate>Mon, 08 Apr 2013 00:11:58 +0900</pubDate><guid>https://genzouw.com/entry/2013/04/08/001158/75/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;想像以上に&lt;a href="http://d.hatena.ne.jp/keyword/chrome" class="keyword"&gt;chrome&lt;/a&gt;すごいな！ / &lt;a href="http://twitter.com/search?q=%2310" target="_top"&gt;#10&lt;/a&gt; Consoleパネルを使ってみよう | &lt;a href="http://d.hatena.ne.jp/keyword/Chrome" class="keyword"&gt;Chrome&lt;/a&gt; Developer Tools入門 - プログラミングならドットインストール &lt;a href="http://twitter.com/search?q=%23dotinstall" target="_top"&gt;#dotinstall&lt;/a&gt; &lt;a href="http://t.co/GusvsV7wAj" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/321242795467755520" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-08&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:47:05&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;★ 第10回 組織化とは「交換可能にする」ということ?個性の喪失は止められない? B! &lt;a href="http://t.co/swtfMoeV6Q" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/321100009384857601" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-08&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;12:19:42&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://ifttt.com" rel="nofollow"&gt;IFTTT&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;そういう魅力のある人はいるよな。弱さをさらけ出せるひとなんだろう。 / 「それがリーダーってもんだよ」 &lt;a href="http://t.co/NLNcLotMc6" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/321036911068205056" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-08&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:08:58&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年04月06日のツイート</title><link>https://genzouw.com/entry/2013/04/06/000445/76/</link><pubDate>Sat, 06 Apr 2013 00:04:45 +0900</pubDate><guid>https://genzouw.com/entry/2013/04/06/000445/76/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;壊れたパソコンのモバイルディスクの端子の部分だけ取り出してUSB接続したら仕えた。要らないアルミの部分だけ切り取って使うか… &lt;a href="http://t.co/wrPjmxujpc" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/320432853089398784" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;16:08:40&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;衣替えのついでにクローゼット掃除していると色んな物がでてくるなぁ。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/320342727202058240" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;10:10:32&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;こちらも不要なので、もしよければお譲りします。ほしい方いませんか？ &lt;a href="http://t.co/XCHFI9KBwj" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/320342612391362561" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;10:10:05&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com" rel="nofollow"&gt;Camera on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ただで提供します &lt;a href="http://t.co/2B7akDlfgs" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/320342233201127424" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;10:08:34&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com" rel="nofollow"&gt;Photos on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;どなたか入りませんか？多分昔の携帯電話とパソコンつなぐケーブル。 &lt;a href="http://t.co/LslBgp5VuY" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/320342176649342977" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;10:08:21&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com" rel="nofollow"&gt;Photos on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年04月03日のツイート</title><link>https://genzouw.com/entry/2013/04/03/000454/77/</link><pubDate>Wed, 03 Apr 2013 00:04:54 +0900</pubDate><guid>https://genzouw.com/entry/2013/04/03/000454/77/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/twitter" class="keyword"&gt;twitter&lt;/a&gt;でurlつぶやくと短縮されて厄介ｗ&lt;a href="http://t.co/oP2kokF1Fp" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/319442104625557505" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:31:47&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;こっちがjsonで返す&lt;a href="http://d.hatena.ne.jp/keyword/api" class="keyword"&gt;api&lt;/a&gt;。&lt;a href="http://t.co/xayPiKL5TH" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;彦根&amp;amp;to=京都&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/319440856295817218" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:26:49&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;交通費計算システム。&lt;a href="http://t.co/GRf2CRKSZR" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/319439759359483906" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:22:28&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;jenkinsで静的チェックを考えているのでツール探し &lt;a href="http://t.co/JAQTukUi4P" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/319213226636218368" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-04-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:22:18&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="https://itunes.apple.com/us/app/chrome/id535886823?mt=8&amp;amp;uo=4" rel="nofollow"&gt;Chrome on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年03月29日のツイート</title><link>https://genzouw.com/entry/2013/03/29/000457/79/</link><pubDate>Fri, 29 Mar 2013 00:04:57 +0900</pubDate><guid>https://genzouw.com/entry/2013/03/29/000457/79/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://t.co/TaZNHpd5mI" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/317636450193657856" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-29&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:56:45&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="https://itunes.apple.com/us/app/chrome/id535886823?mt=8&amp;amp;uo=4" rel="nofollow"&gt;Chrome on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;vib,dibでもいけるって。 . / &lt;a href="http://d.hatena.ne.jp/keyword/vim" class="keyword"&gt;vim&lt;/a&gt;でカッコの内側を選択する &lt;a href="http://twitter.com/search?q=%23Vim" target="_top"&gt;#Vim&lt;/a&gt; - Qiita &lt;a href="http://t.co/zxXtDVeGCl" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/317409421951111168" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-29&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:54:38&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年03月27日のツイート</title><link>https://genzouw.com/entry/2013/03/27/001158/80/</link><pubDate>Wed, 27 Mar 2013 00:11:58 +0900</pubDate><guid>https://genzouw.com/entry/2013/03/27/001158/80/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;Quickfixを知ってからfugitiveを使うと捗る &lt;a href="http://twitter.com/search?q=%23Vim" target="_top"&gt;#Vim&lt;/a&gt; - Qiita by @&lt;a href="http://twitter.com/joker1007" class="twitter-user-screen-name" target="_top"&gt;joker1007&lt;/a&gt; on @&lt;a href="http://twitter.com/Qiita_jp" class="twitter-user-screen-name" target="_top"&gt;Qiita_jp&lt;/a&gt; &lt;a href="http://t.co/37Yhr795OL" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/316892816410288128" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-27&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:41:49&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年03月25日のツイート</title><link>https://genzouw.com/entry/2013/03/25/000501/82/</link><pubDate>Mon, 25 Mar 2013 00:05:01 +0900</pubDate><guid>https://genzouw.com/entry/2013/03/25/000501/82/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;[&lt;a href="http://d.hatena.ne.jp/keyword/Oracle" class="keyword"&gt;Oracle&lt;/a&gt;]&lt;a href="http://d.hatena.ne.jp/keyword/Oracle" class="keyword"&gt;Oracle&lt;/a&gt;で&lt;a href="http://d.hatena.ne.jp/keyword/SQL" class="keyword"&gt;SQL&lt;/a&gt;の実行時間を計測する方法&lt;a href="http://t.co/0tzvMUqb1Z" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/316196761544822784" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-25&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:35:57&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年03月23日のツイート</title><link>https://genzouw.com/entry/2013/03/23/001317/84/</link><pubDate>Sat, 23 Mar 2013 00:13:17 +0900</pubDate><guid>https://genzouw.com/entry/2013/03/23/001317/84/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://t.co/du8xAxNO8D" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; 郵便番号検索作ってみた。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/315295110805987328" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;11:53:06&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年03月22日のツイート</title><link>https://genzouw.com/entry/2013/03/22/000456/85/</link><pubDate>Fri, 22 Mar 2013 00:04:56 +0900</pubDate><guid>https://genzouw.com/entry/2013/03/22/000456/85/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;菅ちゃん結婚したんだ…ダメージでかい…&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/315072363052032001" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:07:59&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年03月20日のツイート</title><link>https://genzouw.com/entry/2013/03/20/000504/86/</link><pubDate>Wed, 20 Mar 2013 00:05:04 +0900</pubDate><guid>https://genzouw.com/entry/2013/03/20/000504/86/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/Java" class="keyword"&gt;Java&lt;/a&gt;、&lt;a href="http://d.hatena.ne.jp/keyword/C%23" class="keyword"&gt;C#&lt;/a&gt;、&lt;a href="http://d.hatena.ne.jp/keyword/VB" class="keyword"&gt;VB&lt;/a&gt;での開発が多かったが、最近仕事で&lt;a href="http://d.hatena.ne.jp/keyword/PHP" class="keyword"&gt;PHP&lt;/a&gt;をずっと触っていて、&lt;a href="http://d.hatena.ne.jp/keyword/PHP" class="keyword"&gt;PHP&lt;/a&gt;を舐めてたなぁと感じた。interface、classは作れるわクロージャというか無名関数作れるし?:&lt;a href="http://d.hatena.ne.jp/keyword/%B1%E9%BB%BB%BB%D2" class="keyword"&gt;演算子&lt;/a&gt;使えるし。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/314358627764944896" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-20&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:51:52&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年03月08日のツイート</title><link>https://genzouw.com/entry/2013/03/08/001148/87/</link><pubDate>Fri, 08 Mar 2013 00:11:48 +0900</pubDate><guid>https://genzouw.com/entry/2013/03/08/001148/87/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ここ数日花粉症がひどく、鼻が詰まってあんまり眠れない。早く５月ぐらいにならないかな。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/309789826260033537" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-08&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:17:04&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年03月03日のツイート</title><link>https://genzouw.com/entry/2013/03/03/000541/88/</link><pubDate>Sun, 03 Mar 2013 00:05:41 +0900</pubDate><guid>https://genzouw.com/entry/2013/03/03/000541/88/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/butaminton" target="_top" rel="noopener noreferrer"&gt;butaminton&lt;/a&gt; そうやろ！自慢の嫁。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/308064958116159488" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;13:03:04&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt; to @&lt;a href="http://twitter.com/butaminton/status/308064828726075392" class="twitter-user-screen-name"&gt;butaminton&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/ferrari_f2003ga" target="_top" rel="noopener noreferrer"&gt;ferrari_f2003ga&lt;/a&gt; ありがとう！&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/308053928522678272" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;12:19:14&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/ferrari_f2003ga/status/308051113519747072" class="twitter-user-screen-name"&gt;ferrari_f2003ga&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;嫁さんやるな〜。勉強の休憩にリビングいったら！ &lt;a class="twitter-tweet-url" href="http://t.co/ra52zNBsgW" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/308048420503953408" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;11:57:21&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/cakephp"&gt;cakephp&lt;/a&gt;の&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/api"&gt;api&lt;/a&gt;サイトを活用しましょう！ということなので簡単に&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/vim"&gt;vim&lt;/a&gt;から&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/api"&gt;api&lt;/a&gt;サイトを閲覧できるようにする。&lt;a class="twitter-tweet-url" href="http://t.co/UKnocxAfVw" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; ,docと打ち込むと&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/api"&gt;api&lt;/a&gt;サイトが開く。 &lt;a href="http://twitter.com/search?q=%23study_cakephp" target="_top" rel="noopener noreferrer"&gt;#study_cakephp&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/308025603586674688" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;10:26:41&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.vim.org/scripts/script.php?script_id=2204" rel="nofollow"&gt;TwitVim&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;RT @&lt;a class="twitter-user-screen-name" href="http://twitter.com/fshin2000" target="_top" rel="noopener noreferrer"&gt;fshin2000&lt;/a&gt;: 例えばさ、ラーメン屋で自分の実績に自信がないから100円で売りますってのはありえないわけよ。やっぱり定価で勝負するのが本来の在り方で。100円で勝負する場合は、知名度を買うとか意味がちゃんとあるわけで。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/308018486054121473" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;09:58:24&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ページ下部に実行した&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/SQL"&gt;SQL&lt;/a&gt;のログなどが表示されるが、ログのレベルを制御するには app/Config/core.&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/php"&gt;php&lt;/a&gt; のConfigure::write('debug', 2);を1や0に変更する &lt;a href="http://twitter.com/search?q=%23study_cakephp" target="_top" rel="noopener noreferrer"&gt;#study_cakephp&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/308008265558659072" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;09:17:47&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;今日も朝から昨日の続き開始。今週は長女次女とあまり遊べないけどごめんね。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/308007955419242496" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;09:16:33&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.tweetdeck.com" rel="nofollow"&gt;TweetDeck&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;"DebugKit is not installed. It will help you inspect and debug different aspects of your application." このメッセージは簡単に解消できた。 &lt;a href="http://twitter.com/search?q=%23study_cakephp" target="_top" rel="noopener noreferrer"&gt;#study_cakephp&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/307873762789949440" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-03-03&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:23:19&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via Silver Bird&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年02月28日のツイート</title><link>https://genzouw.com/entry/2013/02/28/001141/90/</link><pubDate>Thu, 28 Feb 2013 00:11:41 +0900</pubDate><guid>https://genzouw.com/entry/2013/02/28/001141/90/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/JQuery" class="keyword"&gt;JQuery&lt;/a&gt; Mobileで数当てゲーム作ってみた。&lt;a href="http://t.co/S0TdLE4Lxe" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/307002313107730432" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-28&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;14:40:29&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/JQuery" class="keyword"&gt;JQuery&lt;/a&gt; Mobileの勉強に計算機作ってみた &lt;a href="http://t.co/E3z22qQlHZ" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/306955114499960832" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-28&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;11:32:56&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="https://itunes.apple.com/us/app/chrome/id535886823?mt=8&amp;amp;uo=4" rel="nofollow"&gt;Chrome on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;工数が増えてしまった場合の余裕分を追加する。これをリスク分とかコンティンジェンシー／コンテンジェンシーと呼んでいる。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/306935162787229696" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-28&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;10:13:40&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年02月25日のツイート</title><link>https://genzouw.com/entry/2013/02/25/000727/91/</link><pubDate>Mon, 25 Feb 2013 00:07:27 +0900</pubDate><guid>https://genzouw.com/entry/2013/02/25/000727/91/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;[Twittet]2013年02月23日のツイート &lt;a href="http://t.co/WvyGI3XxLF" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/306051717240340482" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-25&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:43:10&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.hatena.ne.jp/guide/twitter" rel="nofollow"&gt;Hatena&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年02月23日のツイート</title><link>https://genzouw.com/entry/2013/02/23/000730/92/</link><pubDate>Sat, 23 Feb 2013 00:07:30 +0900</pubDate><guid>https://genzouw.com/entry/2013/02/23/000730/92/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%B8%A5%E3%A5%A4%A5%EB" class="keyword"&gt;アジャイル&lt;/a&gt;開発している割合って、日本ではどのぐらいなんだろう？ &lt;a href="http://t.co/i8IN5MdEb5" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/305270116466188289" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;19:57:22&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="https://itunes.apple.com/us/app/chrome/id535886823?mt=8&amp;amp;uo=4" rel="nofollow"&gt;Chrome on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年02月18日のツイート</title><link>https://genzouw.com/entry/2013/02/18/000714/94/</link><pubDate>Mon, 18 Feb 2013 00:07:14 +0900</pubDate><guid>https://genzouw.com/entry/2013/02/18/000714/94/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;Guardでファイル変更を監視して作業を自動化する Guardでファイル変更を監視して作業を自動化する&lt;a href="http://t.co/ViRfo5lX" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/303289112495013889" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-18&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:45:33&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;[&lt;a href="http://d.hatena.ne.jp/keyword/java" class="keyword"&gt;java&lt;/a&gt;][&lt;a href="http://d.hatena.ne.jp/keyword/jpa" class="keyword"&gt;jpa&lt;/a&gt;][&lt;a href="http://d.hatena.ne.jp/keyword/mysql" class="keyword"&gt;mysql&lt;/a&gt;]&lt;a href="http://d.hatena.ne.jp/keyword/JPA" class="keyword"&gt;JPA&lt;/a&gt;+&lt;a href="http://d.hatena.ne.jp/keyword/MySQL" class="keyword"&gt;MySQL&lt;/a&gt;での文字化けにはまった件 [&lt;a href="http://d.hatena.ne.jp/keyword/java" class="keyword"&gt;java&lt;/a&gt;][&lt;a href="http://d.hatena.ne.jp/keyword/jpa" class="keyword"&gt;jpa&lt;/a&gt;][&lt;a href="http://d.hatena.ne.jp/keyword/mysql" class="keyword"&gt;mysql&lt;/a&gt;]&lt;a href="http://d.hatena.ne.jp/keyword/JPA" class="keyword"&gt;JPA&lt;/a&gt;+&lt;a href="http://d.hatena.ne.jp/keyword/MySQL" class="keyword"&gt;MySQL&lt;/a&gt;での文字化けにはまった件&lt;a href="http://t.co/112Dy1ik" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/303289103313686529" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-18&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:45:31&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年02月17日のツイート</title><link>https://genzouw.com/entry/2013/02/17/000750/95/</link><pubDate>Sun, 17 Feb 2013 00:07:50 +0900</pubDate><guid>https://genzouw.com/entry/2013/02/17/000750/95/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/chrome" class="keyword"&gt;chrome&lt;/a&gt;版作ってみるか / [&lt;a href="http://d.hatena.ne.jp/keyword/Greasemonkey" class="keyword"&gt;Greasemonkey&lt;/a&gt;]&lt;a href="http://d.hatena.ne.jp/keyword/Google" class="keyword"&gt;Google&lt;/a&gt;のパーソナライズド検索を無効にする&lt;a href="http://d.hatena.ne.jp/keyword/Greasemonkey" class="keyword"&gt;Greasemonkey&lt;/a&gt;スクリプト書いたよ。 [&lt;a href="http://d.hatena.ne.jp/keyword/Greasemonkey" class="keyword"&gt;Greasemonkey&lt;/a&gt;]&lt;a href="http://d.hatena.ne.jp/keyword/Google" class="keyword"&gt;Google&lt;/a&gt;のパーソナライズド検索を無効にする&lt;a href="http://d.hatena.ne.jp/keyword/Greasemonkey" class="keyword"&gt;Greasemonkey&lt;/a&gt;スクリプト書いたよ。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/302965273579892736" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-17&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;11:18:44&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年02月15日のツイート</title><link>https://genzouw.com/entry/2013/02/15/000328/96/</link><pubDate>Fri, 15 Feb 2013 00:03:28 +0900</pubDate><guid>https://genzouw.com/entry/2013/02/15/000328/96/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ブラウザにファイルをドロップしてはいけない &lt;a href="http://t.co/xFjbfSx7" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/302405406611869696" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-15&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:14:02&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;なぜ&lt;a href="http://d.hatena.ne.jp/keyword/Unix" class="keyword"&gt;Unix&lt;/a&gt;&amp;amp;&lt;a href="http://d.hatena.ne.jp/keyword/Linux" class="keyword"&gt;Linux&lt;/a&gt;ではホームディレクトリを「~」文字で表現するのか。 &lt;a href="http://t.co/2uGlPyjw" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/302372429429350400" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-15&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:02:59&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/javascript" class="keyword"&gt;javascript&lt;/a&gt;を理解するためのたった2つの大切なこと &lt;a href="http://t.co/FIIkjOey" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/302372409548361728" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-15&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:02:54&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;varで宣言された変数のスコープの意味がよくわかった。 / &lt;a href="http://d.hatena.ne.jp/keyword/javascript" class="keyword"&gt;javascript&lt;/a&gt;を理解するためのたった2つの大切なこと &lt;a href="http://t.co/FIIkjOey" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/302372387758948352" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-15&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:02:49&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;[Twittet]2013年02月14日のツイート &lt;a href="http://t.co/d98ByP8A" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/302211459432194049" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-15&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;09:23:21&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.hatena.ne.jp/guide/twitter" rel="nofollow"&gt;Hatena&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;何かそうでもなかった。時間帯なんだな。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/302204677104230400" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-15&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:56:24&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;東京の&lt;a href="http://d.hatena.ne.jp/keyword/%C2%E7%B9%BE%B8%CD%C0%FE" class="keyword"&gt;大江戸線&lt;/a&gt;の満員電車はじめてみたがすごいんだね。おしくらまんじゅう?&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/302200303003004928" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-15&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:39:01&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年02月13日のツイート</title><link>https://genzouw.com/entry/2013/02/13/000323/98/</link><pubDate>Wed, 13 Feb 2013 00:03:23 +0900</pubDate><guid>https://genzouw.com/entry/2013/02/13/000323/98/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ポート22でどこかにコネクションはれれば社内ブロキシ意味無ってこと？ [&lt;a href="http://d.hatena.ne.jp/keyword/linux" class="keyword"&gt;linux&lt;/a&gt;][メモ]&lt;a href="http://d.hatena.ne.jp/keyword/ssh" class="keyword"&gt;ssh&lt;/a&gt;でダイナミックに転送してなんか&lt;a href="http://d.hatena.ne.jp/keyword/VPN" class="keyword"&gt;VPN&lt;/a&gt;みたいなことをする [&lt;a href="http://d.hatena.ne.jp/keyword/linux" class="keyword"&gt;linux&lt;/a&gt;][メモ]&lt;a href="http://d.hatena.ne.jp/keyword/ssh" class="keyword"&gt;ssh&lt;/a&gt;でダイナミックに転送してなんか&lt;a href="http://d.hatena.ne.jp/keyword/VPN" class="keyword"&gt;VPN&lt;/a&gt;みたいなことをする&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/301656698316288001" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:38:56&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ちょっとした手間の削減だけど積み重なると大きいよね。 / &lt;a href="http://d.hatena.ne.jp/keyword/Dropbox" class="keyword"&gt;Dropbox&lt;/a&gt;へWEBページからダイレクトにファイル保存できる&lt;a href="http://d.hatena.ne.jp/keyword/Chrome" class="keyword"&gt;Chrome&lt;/a&gt;&lt;a href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD" class="keyword"&gt;拡張機能&lt;/a&gt;「Download to &lt;a href="http://d.hatena.ne.jp/keyword/Dropbox" class="keyword"&gt;Dropbox&lt;/a&gt;」 &lt;a href="http://d.hatena.ne.jp/keyword/Dropbox" class="keyword"&gt;Dropbox&lt;/a&gt;へWEBページからダイレクトにファイル保存できる&lt;a href="http://d.hatena.ne.jp/keyword/Chrome" class="keyword"&gt;Chrome&lt;/a&gt;&lt;a href="http://d.hatena.ne.jp/keyword/%B3%C8%C4%A5%B5%A1%C7%BD" class="keyword"&gt;拡張機能&lt;/a&gt;「Down&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/301633754420609024" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;19:07:45&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/MySQL" class="keyword"&gt;MySQL&lt;/a&gt;の&lt;a href="http://d.hatena.ne.jp/keyword/UTF-8" class="keyword"&gt;UTF-8&lt;/a&gt;で文字化けにハマった &lt;a href="http://d.hatena.ne.jp/keyword/MySQL" class="keyword"&gt;MySQL&lt;/a&gt;の&lt;a href="http://d.hatena.ne.jp/keyword/UTF-8" class="keyword"&gt;UTF-8&lt;/a&gt;で文字化けにハマった&lt;a href="http://t.co/vU7jUI44" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/301633118543155201" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;19:05:14&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;わかりやすい。 / Shitf_JISとCP932とMS932と&lt;a href="http://d.hatena.ne.jp/keyword/Windows-31J" class="keyword"&gt;Windows-31J&lt;/a&gt;を昔話風に語ってみた : 凶悪&lt;a href="http://d.hatena.ne.jp/keyword/%A5%E2%A5%CA%A5%C9" class="keyword"&gt;モナド&lt;/a&gt; &lt;a href="http://t.co/8a4MLgdN" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/301633108510396416" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;19:05:11&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;GroovyインストールされていなくてもGrape使って依存ライブラリダウンロード出来るけど、どうもGrabResolver使って任意の&lt;a href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA" class="keyword"&gt;リポジトリ&lt;/a&gt;追加している場合うまく動かない。 &lt;a href="http://t.co/Fi90HrPy" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/301508649468178432" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;10:50:38&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.vim.org/scripts/script.php?script_id=2204" rel="nofollow"&gt;TwitVim&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;vichromeの設定 &lt;a href="https://t.co/ShQzLfgW" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/301489500247445504" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;09:34:32&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.vim.org/scripts/script.php?script_id=2204" rel="nofollow"&gt;TwitVim&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年02月09日のツイート</title><link>https://genzouw.com/entry/2013/02/09/000719/100/</link><pubDate>Sat, 09 Feb 2013 00:07:19 +0900</pubDate><guid>https://genzouw.com/entry/2013/02/09/000719/100/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ポジティブでいようとするほど自信を失うメカニズム?ネガティブシンキング＜１＞ ポジティブでいようとするほど自信を失うメカニズム?ネガティブシンキング＜１＞&lt;a href="http://t.co/YgOdOfTq" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/300192707047981056" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;19:41:33&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年02月06日のツイート</title><link>https://genzouw.com/entry/2013/02/06/000339/101/</link><pubDate>Wed, 06 Feb 2013 00:03:39 +0900</pubDate><guid>https://genzouw.com/entry/2013/02/06/000339/101/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;我が家の子どもも嫁も&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt;使えるぐらいなんだから、Microsoft Officeやゲームの必要性がないなら十分だと思う。&lt;a href="http://d.hatena.ne.jp/keyword/Chrome" class="keyword"&gt;Chrome&lt;/a&gt;（&lt;a href="http://d.hatena.ne.jp/keyword/Chromium" class="keyword"&gt;Chromium&lt;/a&gt;）も動くし&lt;a href="http://d.hatena.ne.jp/keyword/Google" class="keyword"&gt;Google&lt;/a&gt;日本語入力(Mozc）も動くし。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/299158392918925312" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:11:33&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;多分に&lt;a href="http://d.hatena.ne.jp/keyword/Linux" class="keyword"&gt;Linux&lt;/a&gt;、&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt;よりの記事だが、Windows、Mac、&lt;a href="http://d.hatena.ne.jp/keyword/Linux" class="keyword"&gt;Linux&lt;/a&gt;使ってみて今の&lt;a href="http://d.hatena.ne.jp/keyword/Linux" class="keyword"&gt;Linux&lt;/a&gt;が一番使いやすい。 / &lt;a href="http://d.hatena.ne.jp/keyword/%A5%AA%A1%BC%A5%D7%A5%F3%A5%BD%A1%BC%A5%B9" class="keyword"&gt;オープンソース&lt;/a&gt;分野は今後どうなる？&amp;ndash;2013年の10大予想 &lt;a href="http://t.co/9blDe6Ac" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; @&lt;a href="http://twitter.com/zdnet_japan" class="twitter-user-screen-name" target="_top"&gt;zdnet_japan&lt;/a&gt;さんから&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/299157808606220289" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:09:14&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ついに1.5ヶ月の修理期間を経てNexus7が明日帰ってくる。ネットで見てても故障のはなしあまり聞かないし、初期不良とかではないようだ。修理で問い合わせたら、なんでも静電気なんかで比較的容易に故障するといってた。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/299151049455988736" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:42:22&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;★ git-&lt;a href="http://d.hatena.ne.jp/keyword/svn" class="keyword"&gt;svn&lt;/a&gt;で空ディレクトリを削除 B! &lt;a href="http://t.co/t6YLGNpC" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/298957188834160641" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-06&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;09:52:02&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://ifttt.com" rel="nofollow"&gt;IFTTT&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Groovyスクリプトでソースコードステップをカウントする</title><link>https://genzouw.com/entry/2013/02/05/101910/102/</link><pubDate>Tue, 05 Feb 2013 10:19:10 +0900</pubDate><guid>https://genzouw.com/entry/2013/02/05/101910/102/</guid><description>&lt;p&gt;会社の方がソースコードの行数をカウントする方法として、 &lt;strong&gt;Amateras StepCounter&lt;/strong&gt; を利用する方法を紹介している。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/igapyon/20130121"&gt;メモ: Amateras StepCounter を Ant で利用する - いがぴょんの日記＠はてな&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;僕もプロジェクトでは同じ方法を利用していた。&#10;紹介されている方法はセオリーとして、僕はGroovyを使った方法を紹介したい。&lt;/p&gt;&#10;&lt;h2 id="実行環境"&gt;実行環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -vs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;CYGWIN_NT-6.1 2012-07-20 22:55&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Groovy Version: 2.1.0 JVM: 1.7.0_05 Vendor: Oracle Corporation OS: Windows &lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ステップ数を計測する方法"&gt;ステップ数を計測する方法&lt;/h2&gt;&#10;&lt;p&gt;以下のコマンドを実行するだけ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;実行後、コマンド実行時のカレントディレクトリに &lt;strong&gt;stepcounter_report.csv&lt;/strong&gt; というファイルを出力する。&lt;/li&gt;&#10;&lt;li&gt;第一パラメータを指定しなかった場合、 &lt;strong&gt;カレントディレクトリをソースコード配置ディレクトリと解釈して処理&lt;/strong&gt; する。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy /sandbox/stepcounter.groovy &amp;lt;ソースコード配置ディレクトリ&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="補足"&gt;補足&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;curl /sandbox/stepcounter.groovy&lt;/code&gt; してもらえばわかるが、 &lt;strong&gt;Amateras StepCounter&lt;/strong&gt; に頑張ってもらっている。&#10;というかただのラッパー。&#10;&lt;strong&gt;Groovy 2.1.0&lt;/strong&gt; でしか動作しないので注意。&lt;/p&gt;</description></item><item><title>2013年02月04日のツイート</title><link>https://genzouw.com/entry/2013/02/04/000325/104/</link><pubDate>Mon, 04 Feb 2013 00:03:25 +0900</pubDate><guid>https://genzouw.com/entry/2013/02/04/000325/104/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;改めて今から&lt;a href="http://d.hatena.ne.jp/keyword/brew" class="keyword"&gt;brew&lt;/a&gt;で&lt;a href="http://d.hatena.ne.jp/keyword/pear" class="keyword"&gt;pear&lt;/a&gt;インストール開始するぞ。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/298442375196463104" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-04&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:46:21&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/brew" class="keyword"&gt;brew&lt;/a&gt;でphp53をインストールするまでの手順としてはここが一番正しかった。 / &amp;ldquo;Mountain Lion に&lt;a href="http://d.hatena.ne.jp/keyword/PHP" class="keyword"&gt;PHP&lt;/a&gt;開発環境をつくった - massat.jp&amp;rdquo; &lt;a href="http://t.co/YONlVeP7" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/298442207269093377" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-04&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:45:41&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/brew" class="keyword"&gt;brew&lt;/a&gt; install php53するには、これをインストールする必要があるって。opensslがどうのこうのエラーが出るから、opensslインストールされてないのが問題とか思っていた。 / &amp;ldquo;XQuartz&amp;rdquo; &lt;a href="http://t.co/vrZ3PnST" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/298428610895831041" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-04&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:51:40&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;確かになぜか引き当ててくるんだがなぜだ？ipとか抜かれてるのか？ / 偽名&lt;a href="http://d.hatena.ne.jp/keyword/%BC%CE%A4%C6%A5%A2%A5%C9" class="keyword"&gt;捨てアド&lt;/a&gt;でも&lt;a href="http://d.hatena.ne.jp/keyword/Facebook" class="keyword"&gt;Facebook&lt;/a&gt;にリアル知り合いズラズラ出てきてビビったわ&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/298378961669464064" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-04&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;19:34:22&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;面接希望者にももちろん原因がある場合はあるだろうが、こういう気持ちで仕事をしたい &lt;a href="http://t.co/8fVO5mYG" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/298218363908411392" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-04&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:56:13&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="https://itunes.apple.com/us/app/chrome/id535886823?mt=8&amp;amp;uo=4" rel="nofollow"&gt;Chrome on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;macで&lt;a href="http://d.hatena.ne.jp/keyword/PEAR" class="keyword"&gt;PEAR&lt;/a&gt;するためのセットアップ手順。&lt;a href="http://d.hatena.ne.jp/keyword/Linux" class="keyword"&gt;Linux&lt;/a&gt;ならセットアップ楽なのに? &lt;a href="http://t.co/xI4pK4y6" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/298214812469563393" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-02-04&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:42:06&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="https://itunes.apple.com/us/app/chrome/id535886823?mt=8&amp;amp;uo=4" rel="nofollow"&gt;Chrome on iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月30日のツイート</title><link>https://genzouw.com/entry/2013/01/30/000613/105/</link><pubDate>Wed, 30 Jan 2013 00:06:13 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/30/000613/105/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;これを探していた / &lt;a href="http://d.hatena.ne.jp/keyword/Vim" class="keyword"&gt;Vim&lt;/a&gt;: neosnippetで手前に文字があると変換できないときの対処 &lt;a href="http://twitter.com/search?q=%23Vim" target="_top"&gt;#Vim&lt;/a&gt; &lt;a href="http://twitter.com/search?q=%23neosnippet" target="_top"&gt;#neosnippet&lt;/a&gt; &lt;a href="http://twitter.com/search?q=%23PHP" target="_top"&gt;#PHP&lt;/a&gt; - Qiita by @&lt;a href="http://twitter.com/livejam_db" class="twitter-user-screen-name" target="_top"&gt;livejam_db&lt;/a&gt; on @&lt;a href="http://twitter.com/Qiita_jp" class="twitter-user-screen-name" target="_top"&gt;Qiita_jp&lt;/a&gt; &lt;a href="http://t.co/NDUPNXlA" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/296398015390949376" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-30&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:22:48&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/css" class="keyword"&gt;css&lt;/a&gt;-builderが、デザイン周りの解決策になるかなと思ったが、startupでデザイン割り当てするので、ウィンドウ表示直後は背景色とかついておらず素っ気ない。一秒ぐらいしてからデザインが割り当てられる。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/296397182649638912" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-30&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:19:29&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;Griffonアプリなんだけど、Mac環境でcssbuilderの一部機能が正しく動かない。パネルへの背景色は適用されるけどボタンへの背景色が適用されない。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/296396547762049024" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-30&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:16:58&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/Dropbox" class="keyword"&gt;Dropbox&lt;/a&gt;、有線時とWi-Fi時でアップロードの速度が全く違う。&lt;a href="http://d.hatena.ne.jp/keyword/Dropbox" class="keyword"&gt;Dropbox&lt;/a&gt;の問題なのかWi-Fiは上りが遅いとかあったりするのか？&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/296389286666854400" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-30&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:48:07&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;それでもどうしても他の会社の方々のスピード感を見ていると、あぐらをかいて仕事をしている今の状態はどうかなという思いもあり、結局踏み切った。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/296301455403524097" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-30&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;01:59:06&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;退職するにあたり心残りなのは非常に信頼している同僚と離れること。僕は彼のことを尊敬しているし、彼も少なからず僕のことをよく思ってくれているようで。戦友だと思ってる。それだけが最後まで踏ん切りつかない理由になった。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/296300295842058242" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-30&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;01:54:30&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月29日のツイート</title><link>https://genzouw.com/entry/2013/01/29/000330/106/</link><pubDate>Tue, 29 Jan 2013 00:03:30 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/29/000330/106/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/ittoku0107" class="twitter-user-screen-name" target="_top"&gt;ittoku0107&lt;/a&gt; ありがとうございます。先輩、知人の大部分は「やめておけ、後悔する」といっていました。僕も不安はあるのですが、自分を試してみたい気持ちもあり、退職の願いを出してきた次第です。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/296260326104629248" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-29&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:15:40&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt; to @&lt;a href="http://twitter.com/ittoku0107/status/296259972210257920" class="twitter-user-screen-name"&gt;ittoku0107&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;少し早いが、２月いっぱいで在職中の会社をやめることになった。安定性という点では全く不満はなかったが、やはり開発の現場にまだまだどっぷり使っていたい気持ちに嘘は付けなかった。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/296248118184398849" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-29&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:27:10&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月28日のツイート</title><link>https://genzouw.com/entry/2013/01/28/000812/107/</link><pubDate>Mon, 28 Jan 2013 00:08:12 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/28/000812/107/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/macbook" class="keyword"&gt;macbook&lt;/a&gt;使ってみたけどどうにも&lt;a href="http://d.hatena.ne.jp/keyword/ubuntu" class="keyword"&gt;ubuntu&lt;/a&gt;のほうがしっくりくるなあ。時間が解決してくれるかな。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/295897096920387584" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-28&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:12:20&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com/" rel="nofollow"&gt;OS X&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&amp;quot;&lt;a href="http://d.hatena.ne.jp/keyword/MacPorts" class="keyword"&gt;MacPorts&lt;/a&gt;より使いやすい！？パッケージ管理システムHomebrewの使い方 | Macとかの雑記帳&amp;quot; &lt;a href="http://t.co/k9LCstf3" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/295896624117473282" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-28&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:10:27&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月25日のツイート</title><link>https://genzouw.com/entry/2013/01/25/000806/108/</link><pubDate>Fri, 25 Jan 2013 00:08:06 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/25/000806/108/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/aalmiray" class="twitter-user-screen-name" target="_top"&gt;aalmiray&lt;/a&gt; thank you!&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/294595191896154112" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-25&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:59:01&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/aalmiray/status/294553851728637953" class="twitter-user-screen-name"&gt;aalmiray&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月24日のツイート</title><link>https://genzouw.com/entry/2013/01/24/000334/109/</link><pubDate>Thu, 24 Jan 2013 00:03:34 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/24/000334/109/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;このレベルもめっきり減ったよね。いい世の中だ。 / “@&lt;a href="http://twitter.com/mrgchr" class="twitter-user-screen-name" target="_top"&gt;mrgchr&lt;/a&gt;: 「仕様はソース」なんてのはまだいい方で、もうちょいレベルが高くなると「仕様はバイナリ」とかになる。&lt;a href="http://d.hatena.ne.jp/keyword/%A5%BD%A1%BC%A5%B9%A5%B3%A1%BC%A5%C9" class="keyword"&gt;ソースコード&lt;/a&gt;すら残ってなくて実行ファイルから仕様を推定する作業が超エキサイティン！！！！”&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/294227667941732353" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-24&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:38:37&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月23日のツイート</title><link>https://genzouw.com/entry/2013/01/23/000337/110/</link><pubDate>Wed, 23 Jan 2013 00:03:37 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/23/000337/110/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/Twitter" class="keyword"&gt;Twitter&lt;/a&gt;のフォロワー数に敏感に反応するかたもいるし、日々のフォロワー数のグラフ化なんてのも面白いかな。もうあるかも。 &lt;a href="http://twitter.com/search?q=%23twitterdev" target="_top"&gt;#twitterdev&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/294012284781617152" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;18:22:45&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/twitter" class="keyword"&gt;twitter&lt;/a&gt;でアプリ作る際には過去に使ったタグが残った方が良いな。 &lt;a href="http://twitter.com/search?q=%23twitterdev" target="_top"&gt;#twitterdev&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/294009566105067520" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;18:11:57&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;twilogを使うと、つぶやきのログが残り、クローラにインデックスされる。 &lt;a href="http://twitter.com/search?q=%23twittertips" target="_top"&gt;#twittertips&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/294007985993297920" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;18:05:40&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;こどもにきいてみた。 / &lt;a href="http://t.co/ZyoWdyj5" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/293916882640175105" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;12:03:40&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/ittoku0107" class="twitter-user-screen-name" target="_top"&gt;ittoku0107&lt;/a&gt; 昔体育教師にあったような根性論（練習中は水を飲むな！のような）は最近では否定的ですものね。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/293893806745583616" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;10:31:58&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/ittoku0107/status/293872212585365504" class="twitter-user-screen-name"&gt;ittoku0107&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;気合いは不要。「やりぬく人」になるために身につけたいこと : ライフハッカー［日本版］ &lt;a href="http://t.co/ZbjK4Iu6" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/293869199019868161" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:54:11&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月22日のツイート</title><link>https://genzouw.com/entry/2013/01/22/001439/111/</link><pubDate>Tue, 22 Jan 2013 00:14:39 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/22/001439/111/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;12月後半に修理に出したnexus7、結局まだ修理から戻ってこず。。。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/293696097694658561" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:26:20&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.hootsuite.com" rel="nofollow"&gt;HootSuite&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;こういう会社に以前務めていました(笑) / “@&lt;a href="http://twitter.com/STAR_ZERO" class="twitter-user-screen-name" target="_top"&gt;STAR_ZERO&lt;/a&gt;: 目的が分からん / “中国のFirewallがGithubをブロック中・・・ | IDEA*IDEA” &lt;a href="http://t.co/8UOVkqgB" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;”&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/293507699130372096" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:57:43&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;確かに横並び見にくい &lt;a href="http://t.co/Mbb4a9kN" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/293499472300896257" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:25:01&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com" rel="nofollow"&gt;iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;結局購入してすぐにゴーストで修理扱いになったnexus7がまだ修理から帰ってこない。毎晩仕事から帰ってきて今日こそは届いたかな？と楽しみにしているんだが。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/293381565701058560" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-22&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:36:30&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.hootsuite.com" rel="nofollow"&gt;HootSuite&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月19日のツイート</title><link>https://genzouw.com/entry/2013/01/19/000854/114/</link><pubDate>Sat, 19 Jan 2013 00:08:54 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/19/000854/114/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://t.co/oxvUGEpR" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/292594110320222209" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-19&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:27:26&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com" rel="nofollow"&gt;iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>GriffonでControllerにメソッドを作る際の注意</title><link>https://genzouw.com/entry/2013/01/17/084343/116/</link><pubDate>Thu, 17 Jan 2013 08:43:43 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/17/084343/116/</guid><description>&lt;p&gt;最近はGriffonでアプリを作る機会が多いですが、ハマったことを載せておきます。&lt;/p&gt;&#10;&lt;p&gt;とある、非常に簡単な画面があるとします。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ボタン１つ、テキストフィールド２つ。&lt;/li&gt;&#10;&lt;li&gt;ボタンを押すと、テキストフィールドに値をセットする。&lt;/li&gt;&#10;&lt;li&gt;セットする値は、それぞれfunc1メソッド、func2メソッドの実行結果。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="実行環境"&gt;実行環境&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -vs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux &lt;span class="c1"&gt;#32-Ubuntu SMP Tue Dec 11 18:51:59 UTC 2012&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ griffon -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Griffon 1.0.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Build: 04-Jun-2012 08:53 PM&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Groovy: 1.8.6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ant: 1.8.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Slf4j: 1.6.4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Spring: 3.1.1.RELEASE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;JVM: 1.7.0_09 &lt;span class="o"&gt;(&lt;/span&gt;Oracle Corporation 23.2-b09&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OS: Linux 3.5.0-21-generic amd64&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="controller"&gt;Controller&lt;/h3&gt;&#10;&lt;p&gt;※View、Modelのソースコードは省略します。今回ハマった点はControllerの組み方です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="n"&gt;testpj&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;groovy.util.logging.Slf4j&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestpjController&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// these will be injected by Griffon&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;clicked&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;evt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;clicked - start.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;doOutside&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;doLater&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func1&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;func2&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;error&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;clicked - exception.&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;clicked - end.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;func1&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;てすとですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;func2&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;てすとですよ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ごちゃごちゃ書いていますが、model.text1、model.text2にセットしているあたりが注意です。&lt;/p&gt;</description></item><item><title>2013年01月16日のツイート</title><link>https://genzouw.com/entry/2013/01/16/004026/118/</link><pubDate>Wed, 16 Jan 2013 00:40:26 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/16/004026/118/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ソフトニュース　怖いですね　「アプリ福袋」、実態は不正アプリの詰め合わせ！？ &lt;a class="twitter-tweet-url" href="http://t.co/OPGZLZCM" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/291365340267548673" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;11:04:45&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via iReadG&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a class="twitter-tweet-url" href="http://t.co/XGVIhSha" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/291330680422531072" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:47:01&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;groovyの可能性: &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE"&gt;プログラマ&lt;/a&gt;の思索 &lt;a class="twitter-tweet-url" href="http://t.co/rFedwUpA" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/291325070058590210" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:24:43&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via iReadG&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/uri"&gt;uri&lt;/a&gt;指定でプログラム実行できるよ、っていうのは面白そう。さらにスクリプトの配布が楽になるね / jar://, file://, http:// prefix support for launching Groovy scripts from the command line&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/291324574962962432" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:22:45&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via iReadG&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;rc版出たんだ / &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Release%20Candidate"&gt;Release Candidate&lt;/a&gt; for Groovy 2.1 &lt;a class="twitter-tweet-url" href="http://t.co/WJ2Pd3nZ" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/291323839332380672" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:19:50&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via iReadG&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ここ数ヶ月日勤、面接、夜勤のローテーションだったがようやく終わりが見えて来た。また勉強会参加したい。&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/291318846390943744" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:00:00&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;行動力を見習いたい。まずは人見知りを / 「自分の勉強会遍歴」について &lt;a class="twitter-tweet-url" href="http://t.co/1lczOcNs" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/291318199801237504" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-16&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:57:25&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via iReadG&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月15日のツイート</title><link>https://genzouw.com/entry/2013/01/15/000319/119/</link><pubDate>Tue, 15 Jan 2013 00:03:19 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/15/000319/119/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;何をいってるのか。 &lt;a href="http://t.co/sFijGMgd" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/291156674658586625" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-15&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:15:35&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com" rel="nofollow"&gt;iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;にちゃんから引用 / ↓が米&lt;a href="http://d.hatena.ne.jp/keyword/%CF%A2%CB%AE%C0%AF%C9%DC" class="keyword"&gt;連邦政府&lt;/a&gt;の発表な&lt;a href="http://t.co/zMrUABMG" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;要は、Java7の貧弱性が指摘される中で、オラクルがブラウザのプラグイン無効化してってお願いしているからおまいら、自分の使っているブラウザの設定確認して、プラグイン無効化してやれって言ってい&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/290968866899783682" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-15&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:49:18&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月14日のツイート</title><link>https://genzouw.com/entry/2013/01/14/000348/120/</link><pubDate>Mon, 14 Jan 2013 00:03:48 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/14/000348/120/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://d.hatena.ne.jp/keyword/Oracle" class="keyword"&gt;Oracle&lt;/a&gt;が導入したJava7の機能の周辺でセキュリティ問題が発生している模様 / &amp;ldquo;問題になっている &lt;a href="http://d.hatena.ne.jp/keyword/Java" class="keyword"&gt;Java&lt;/a&gt;の脆弱性は &lt;a href="http://d.hatena.ne.jp/keyword/Java" class="keyword"&gt;Java&lt;/a&gt; 6では問題ないか - &lt;a href="http://d.hatena.ne.jp/keyword/Windows%202000" class="keyword"&gt;Windows 2000&lt;/a&gt; Blog&amp;rdquo; &lt;a href="http://t.co/CBkPe5LT" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/290722453070696448" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-14&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;16:30:08&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;テレビで言ってた。びっくりした / RT @&lt;a href="http://twitter.com/hatebu_walker" class="twitter-user-screen-name" target="_top"&gt;hatebu_walker&lt;/a&gt;: &lt;a href="http://d.hatena.ne.jp/keyword/%C0%F5%C5%C4%C9%F1" class="keyword"&gt;浅田舞&lt;/a&gt; 「&lt;a href="http://d.hatena.ne.jp/keyword/%A5%AD%A5%E0%A1%A6%A5%E8%A5%CA" class="keyword"&gt;キム・ヨナ&lt;/a&gt;の点数についてはノーコメントにしたほうが良い」 &lt;a href="http://t.co/T24mogZR" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/290494381327269890" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-14&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;01:23:52&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;オーケストラに詳しくはないけど本番は毎日するものなのかな。 / RT @&lt;a href="http://twitter.com/_kobachi" class="twitter-user-screen-name" target="_top"&gt;_kobachi&lt;/a&gt;: オーケストラには「練習」があって、演奏会はその成果を発表する場だからなあ。会社で実践する場合は、同じプロセスがあるか考えるべきかも。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/290493209195446273" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-14&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;01:19:12&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月11日のツイート</title><link>https://genzouw.com/entry/2013/01/11/000809/121/</link><pubDate>Fri, 11 Jan 2013 00:08:09 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/11/000809/121/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;今個人で一緒にアプリの開発をしている方がいる。アイデアはその方がどんどん出してくれる。そんなのうまくいくわけないよ、と思う僕の考えの檻をどんどん壊してワクワク感を与えてくれる。そのうち成功されるのでは？という気がする。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/289602409100099584" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-11&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;14:19:29&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/orange_clover" class="twitter-user-screen-name" target="_top"&gt;orange_clover&lt;/a&gt; つぶやきありがとうございます。あまり知らないかもしれません。転職活動中の方なら知っているかも。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/289404295160418304" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-11&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;01:12:15&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt; to @&lt;a href="http://twitter.com/orange_clover/status/289374172017209347" class="twitter-user-screen-name"&gt;orange_clover&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>知っている方は知っている問題</title><link>https://genzouw.com/entry/2013/01/09/130950/122/</link><pubDate>Wed, 09 Jan 2013 13:09:50 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/09/130950/122/</guid><description>&lt;p&gt;Groovyで解いてみた。&lt;/p&gt;&#10;&lt;h2 id="answergroovy"&gt;answer.groovy&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;life&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;chars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;life&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;life&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Integer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseInt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;[-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;life&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toLong&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toInteger&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;&lt;span class="n"&gt;mod&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行"&gt;実行&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./answer.groovy &lt;span class="m"&gt;500001&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;b&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>2013年01月09日のツイート</title><link>https://genzouw.com/entry/2013/01/09/000709/123/</link><pubDate>Wed, 09 Jan 2013 00:07:09 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/09/000709/123/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;単純に技術が好きなんだ！というのにマイナスなイメージがあって最近はあまり人前で口に出せない / 何故&lt;a href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE" class="keyword"&gt;プログラマ&lt;/a&gt;やってるのか - 偏見&lt;a href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE" class="keyword"&gt;プログラマ&lt;/a&gt;の語り！ (&lt;a href="http://d.hatena.ne.jp/kura-replace/"&gt;id:kura-replace&lt;/a&gt; / @&lt;a href="http://twitter.com/PG_kura" class="twitter-user-screen-name" target="_top"&gt;PG_kura&lt;/a&gt;) &lt;a href="http://t.co/DSKiXlPU" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/288845852594806784" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;12:13:12&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;かっこよ過ぎ / “@&lt;a href="http://twitter.com/masason" class="twitter-user-screen-name" target="_top"&gt;masason&lt;/a&gt;: 髪の毛が後退しているのではない。私が前進しているのである。 RT @&lt;a href="http://twitter.com/kingfisher0423" class="twitter-user-screen-name" target="_top"&gt;kingfisher0423&lt;/a&gt;: 髪の毛の後退度がハゲしい。”&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/288786907289243648" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:18:58&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;チャレンジ精神は素晴らしい / &lt;a href="http://d.hatena.ne.jp/keyword/%A5%B5%A5%E0%A5%B9%A5%F3" class="keyword"&gt;サムスン&lt;/a&gt;、Evernoteアプリ内蔵の4ドア冷蔵庫を発表 &lt;a href="http://t.co/tQyze5tX" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; @&lt;a href="http://twitter.com/engadgetjp" class="twitter-user-screen-name" target="_top"&gt;engadgetjp&lt;/a&gt;さんから&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/288785895941890051" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:14:57&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月08日のツイート</title><link>https://genzouw.com/entry/2013/01/08/001618/124/</link><pubDate>Tue, 08 Jan 2013 00:16:18 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/08/001618/124/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;鬼から電話がかかってくるしつけサポートアプリ #鬼から電話 &lt;a class="twitter-tweet-url" href="http://t.co/dz2wGCbq" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/288616502465294337" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-08&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:01:51&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.apple.com" rel="nofollow"&gt;iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;Groovy 2.1の初回βがリリースされました(翻訳) &lt;a class="twitter-tweet-url" href="http://t.co/TnNCgjO1" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/288605905614942208" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-08&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:19:44&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via iReadG&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2013年01月07日のツイート</title><link>https://genzouw.com/entry/2013/01/07/000646/125/</link><pubDate>Mon, 07 Jan 2013 00:06:46 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/07/000646/125/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;★ スギちゃん、去年稼いだ金は3億7,000万円…浅草に2億円の豪邸を購入 B! &lt;a href="http://t.co/8aNEoxrP" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/288231188110389248" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-07&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;19:30:44&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://ifttt.com" rel="nofollow"&gt;IFTTT&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;&lt;a href="http://t.co/8BRfugb1" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/288131870435184640" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-07&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;12:56:05&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;本町&lt;a href="http://d.hatena.ne.jp/keyword/%B5%AA%B0%CB%B9%F1" class="keyword"&gt;紀伊国&lt;/a&gt;屋でツイッターの&lt;a href="http://d.hatena.ne.jp/keyword/api" class="keyword"&gt;api&lt;/a&gt;本を探し中&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/288125546162970624" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2013-01-07&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;12:30:57&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Groovyで、クラスにInterceptor（AOP）を適用する</title><link>https://genzouw.com/entry/2013/01/06/143510/126/</link><pubDate>Sun, 06 Jan 2013 14:35:10 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/06/143510/126/</guid><description>&lt;p&gt;Springなどを利用せずにGroovy単体でInterceptorできないものかを調べてみた。&#10;きっかけはGriffonアプリを作成しているのだが、全アクションに同じようなログ出力処理が散らばってしまっているため一元管理したかったこと。&lt;/p&gt;&#10;&lt;p&gt;以下の２点にさえ注意すれば実現できる。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;GroovyInterceptable&lt;/strong&gt; というインターフェイスを実装する&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;invokeMethod&lt;/strong&gt; メソッドを実装する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;いろいろ試して作成したログ出力サンプルコードは以下の通り。（ひとまずはLog4jなどを利用せず、printlnを利用している）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;X&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;GroovyInterceptable&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;invokeMethod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${name} - start.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&amp;amp;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${name} - exception.&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${name} - end.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;m1&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;m2&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;m3&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Exception&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m1&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m2&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bbb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;m3&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;注意が必要なのは、invokeMethod内で自身のクラスのメソッドを呼び出すとき。&lt;/p&gt;&#10;&lt;p&gt;無限ループに陥ってしまうことがある。&#10;あえてprintlnという変数を作成しているが、これをやらないと &lt;strong&gt;Object#println&lt;/strong&gt; を呼び出して無限ループする。&#10;Griffonにも適用してみる。&lt;/p&gt;</description></item><item><title>NERDTreeを利用しているVim環境でエラーが出始めた時の解決法</title><link>https://genzouw.com/entry/2013/01/01/232530/127/</link><pubDate>Tue, 01 Jan 2013 23:25:30 +0900</pubDate><guid>https://genzouw.com/entry/2013/01/01/232530/127/</guid><description>&lt;p&gt;以下のようなエラーが出た時の解決法。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NERDTree: &lt;span class="m"&gt;1&lt;/span&gt; invalid bookmarks were read. See :help NERDTreeInvalidBookmarks &lt;span class="k"&gt;for&lt;/span&gt; info.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="対処法"&gt;対処法&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rm -rf ~/.NERDTreeBookmarks&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>php5の学習を進めるための環境構築</title><link>https://genzouw.com/entry/2012/12/28/144321/130/</link><pubDate>Fri, 28 Dec 2012 14:43:21 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/28/144321/130/</guid><description>&lt;p&gt;仕事帰りにO&amp;rsquo;rellyのPHP本を買ってきたので、早速学習準備を行う。今までは作成済みの環境を借りることが多かったので、今回は自分で環境構築からやってみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install apache2 libapache2-mod-php5&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今回は、自分のHomeディレクトリの &lt;strong&gt;public_html&lt;/strong&gt; にてphpスクリプトを実行したいので、userdirモジュールの導入も行う。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; ~&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir public_html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;?php echo &amp;#39;test&amp;#39;; ?&amp;gt;&amp;#34;&lt;/span&gt; &amp;gt; public_html/index.php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;777&lt;/span&gt; -R public_html&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo a2enmod userdir&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo service apache2 restart&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;自分のユーザー名はgenzouwだけど、ブラウザから以下のURLにアクセスしてみても見れなかった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://localhost/~genzouw/index.php"&gt;http://localhost/~genzouw/index.php&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;以下のファイルに、userdir上ではphpを動かさないようにするよ、という設定がかかれているのでコメントアウトする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo vim /etc/apache2/mods-enabled/php5.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;IfModule&lt;/span&gt; &lt;span class="err"&gt;mod_php5.c&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;FilesMatch&lt;/span&gt; &lt;span class="err"&gt;&amp;#34;\.ph(p3?|tml)$&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SetHandler application/x-httpd-php&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/FilesMatch&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;FilesMatch&lt;/span&gt; &lt;span class="err"&gt;&amp;#34;\.phps$&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;SetHandler application/x-httpd-php-source&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/FilesMatch&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# To re-enable php in user directories comment the following lines&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# (from &lt;span class="nt"&gt;&amp;lt;IfModule&lt;/span&gt; &lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt; to &lt;span class="nt"&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;.) Do NOT set it to On as it&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# prevents .htaccess files from disabling it.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# &lt;span class="nt"&gt;&amp;lt;IfModule&lt;/span&gt; &lt;span class="err"&gt;mod_userdir.c&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# &lt;span class="nt"&gt;&amp;lt;Directory&lt;/span&gt; &lt;span class="err"&gt;/home/*/public_html&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# php_admin_value engine Off&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# &lt;span class="nt"&gt;&amp;lt;/Directory&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;# &lt;span class="nt"&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/IfModule&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;無事動作確認完了。&lt;/p&gt;</description></item><item><title>2012年12月27日のツイート</title><link>https://genzouw.com/entry/2012/12/27/000806/132/</link><pubDate>Thu, 27 Dec 2012 00:08:06 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/27/000806/132/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;★ 意外と知られてない、自分を飛躍的に成長させる読書テクニック B! &lt;a href="http://t.co/FSzADA0H" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/284087710069706752" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-27&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;09:06:02&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://ifttt.com" rel="nofollow"&gt;IFTTT&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/shin1x1" class="twitter-user-screen-name" target="_top"&gt;shin1x1&lt;/a&gt; すみません。なんだかうまく言ったようです。。。&lt;a href="http://d.hatena.ne.jp/keyword/twitter" class="keyword"&gt;twitter&lt;/a&gt;へのつぶやきをしないようにチェックを外したらうまく行けました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/283962743151804416" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-27&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:49:28&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt; to @&lt;a href="http://twitter.com/shin1x1/" class="twitter-user-screen-name"&gt;shin1x1&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/shin1x1" class="twitter-user-screen-name" target="_top"&gt;shin1x1&lt;/a&gt; すみません。「第5回関西&lt;a href="http://d.hatena.ne.jp/keyword/PHP" class="keyword"&gt;PHP&lt;/a&gt;勉強会」こちら、もう店員オーバーですか？&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/283962362308984836" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-27&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:47:57&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt; to @&lt;a href="http://twitter.com/shin1x1/" class="twitter-user-screen-name"&gt;shin1x1&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2012年12月23日のツイート</title><link>https://genzouw.com/entry/2012/12/23/002943/134/</link><pubDate>Sun, 23 Dec 2012 00:29:43 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/23/002943/134/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ミスチルの my sweet heart 聞くたびに、ああここに僕がいるわと思う。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/282505081910341633" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-23&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;00:17:14&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via web&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2012年12月20日のツイート</title><link>https://genzouw.com/entry/2012/12/20/000606/135/</link><pubDate>Thu, 20 Dec 2012 00:06:06 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/20/000606/135/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;linkedinやってみるか。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/281606786153328640" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-20&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;12:47:44&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;もうちょいGriffonの&lt;a href="http://d.hatena.ne.jp/keyword/GUI" class="keyword"&gt;GUI&lt;/a&gt;を簡単に作れないものかなと悩み中。Swingpad以外で。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/281605812986707968" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-20&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;12:43:52&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2012年12月19日のツイート</title><link>https://genzouw.com/entry/2012/12/19/000832/136/</link><pubDate>Wed, 19 Dec 2012 00:08:32 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/19/000832/136/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/ittoku0107" class="twitter-user-screen-name" target="_top"&gt;ittoku0107&lt;/a&gt; そうですね。仕事の調整して言ってこようかと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/281182446156931072" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-19&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:41:33&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/ittoku0107/status/281179562795208705" class="twitter-user-screen-name"&gt;ittoku0107&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;委任状を出しました。紙面でも弁護士費用と万が一敗訴の場合でも保険会社が負担することの確証を頂きました。ひと安心かな？&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/281180133447065600" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-19&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:32:22&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;嫁がつわりはノロが数ヶ月続く苦しみと言っていて怖くなった。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/281172904174039040" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-19&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;08:03:38&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ノロで倒れてたけど、吐き気より強烈なめまいと時々心臓がばぐんってなる症状があるんだけどノロだよね？&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/281171957809041408" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-19&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;07:59:53&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2012年12月18日のツイート</title><link>https://genzouw.com/entry/2012/12/18/001253/137/</link><pubDate>Tue, 18 Dec 2012 00:12:53 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/18/001253/137/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ブラウザから&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%E0%A5%B7%A5%C6%A5%A3"&gt;シムシティ&lt;/a&gt;が遊べると聞いて、これは！と思ってプレイをクリックしてみたら… / &lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/SimCity4"&gt;SimCity4&lt;/a&gt; - &lt;a class="twitter-tweet-url" href="http://t.co/Pyz1fGLz" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/281034287745220608" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-18&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:52:50&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via Silver Bird&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&lt;p class="twitter-tweet-text"&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a class="twitter-user-screen-name" href="http://twitter.com/genzouw"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;もし全国１区&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%E6%CE%E3%C2%E5%C9%BD"&gt;比例代表&lt;/a&gt;ドント方式なら議席配分はどうだったか - what_a_dudeの日記 - &lt;a class="twitter-tweet-url" href="http://t.co/4UREaLuB" target="_top" rel="noopener noreferrer"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p class="twitter-tweet-info"&gt;&lt;a href="http://twitter.com/genzouw/status/280924257691766784" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-18&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;15:35:37&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via Silver Bird&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Ubuntuの各種メディア配置のデフォルトディレクトリ名を日本語から英語にする</title><link>https://genzouw.com/entry/2012/12/16/144431/138/</link><pubDate>Sun, 16 Dec 2012 14:44:31 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/16/144431/138/</guid><description>&lt;p&gt;コマンドラインから操作することが多いと、ディレクトリ名は日本語表記よりも英語表記のほうが操作しやすい。Ubuntuのデスクトップ、ダウンロード、ピクチャなどのディレクトリ名を英語表記に変更する方法をまとめる。&lt;/p&gt;&#10;&lt;p&gt;簡単だった。以下のファイルを編集するだけ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vi ~/.config/user-dirs.dirs&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;僕の環境では以下のようになっていた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# This file is written by xdg-user-dirs-update&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# If you want to change or add directories, just edit the line you&amp;#39;re&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# interested in. All local changes will be retained on the next run&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Format is XDG_xxx_DIR=&amp;#34;$HOME/yyy&amp;#34;, where yyy is a shell-escaped&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# homedir-relative path, or XDG_xxx_DIR=&amp;#34;/yyy&amp;#34;, where /yyy is an&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# absolute path. No other format is supported.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;XDG_DESKTOP_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;$HOME/デスクトップ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;XDG_DOWNLOAD_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;$HOME/ダウンロード&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;XDG_TEMPLATES_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;$HOME/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;XDG_PUBLICSHARE_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;$HOME/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;XDG_DOCUMENTS_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;$HOME/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;XDG_MUSIC_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;$HOME/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;XDG_PICTURES_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;$HOME/ピクチャ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;XDG_VIDEOS_DIR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;$HOME/ビデオ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;例えばピクチャディレクトリの名前を変更したい場合は以下のように設定。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトで変数からパターンに合致した文字列を除去する(dirname、basenameの代替として利用可能)</title><link>https://genzouw.com/entry/2012/12/14/124910/140/</link><pubDate>Fri, 14 Dec 2012 12:49:10 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/14/124910/140/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;いつも前方から除去するのか、後方から除去するのかごっちゃになっています ^^;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;たとえばファイルのフルパスからファイル名だけを取得する場合。 &lt;code&gt;basename&lt;/code&gt; コマンドや &lt;code&gt;dirname&lt;/code&gt; コマンドを使えば解決なのだが、これらを使わない場合について紹介します。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -moi&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;x86_64 x86_64 GNU/Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ head -n &lt;span class="m"&gt;2&lt;/span&gt; /etc/os-release&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CentOS Linux&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;7 (Core)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ bash -version &lt;span class="p"&gt;|&lt;/span&gt; head -n &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;GNU bash, version 4.2.46&lt;span class="o"&gt;(&lt;/span&gt;2&lt;span class="o"&gt;)&lt;/span&gt;-release &lt;span class="o"&gt;(&lt;/span&gt;x86_64-redhat-linux-gnu&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="コマンド"&gt;コマンド&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;FILEPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt/groovy/bin/groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILEPATH&lt;/span&gt;&lt;span class="p"&gt;#*/&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;opt/groovy/bin/groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# === basenameと一緒 ===&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILEPATH&lt;/span&gt;&lt;span class="p"&gt;##*/&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# === dirnameと一緒 ===&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILEPATH&lt;/span&gt;&lt;span class="p"&gt;%/*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/opt/groovy/bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 何も表示されない&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;FILEPATH&lt;/span&gt;&lt;span class="p"&gt;%%/*&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;${変数名##pattern}&lt;/code&gt; で、 &lt;strong&gt;前方一致&lt;/strong&gt; でパターンにマッチした文字列を除去した結果を取得できる。 &lt;code&gt;#&lt;/code&gt; だと貪欲でない(最短一致)検索、 &lt;code&gt;##&lt;/code&gt; だと貪欲な検索が行われる。&#10;&lt;code&gt;${変数名%%pattern}&lt;/code&gt; で、 &lt;strong&gt;後方一致&lt;/strong&gt; になる。 &lt;code&gt;%&lt;/code&gt; だと貪欲でない(最短一致)検索、 &lt;code&gt;%%&lt;/code&gt; だと貪欲な検索が行われる。&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトのおける関数の定義方法（ `function` キーワードは必須ではなかった。 ）</title><link>https://genzouw.com/entry/2012/12/13/124047/141/</link><pubDate>Thu, 13 Dec 2012 12:40:47 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/13/124047/141/</guid><description>&lt;p&gt;いつも、 &lt;strong&gt;function&lt;/strong&gt; というキーワードを利用して以下のように定義していた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;function&lt;/span&gt; xxx&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;キーワードを利用しなくても、関数名の後ろに &lt;code&gt;()&lt;/code&gt; を追記すれば関数扱いになる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;xxx&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;xxx&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>2012年12月13日のツイート</title><link>https://genzouw.com/entry/2012/12/13/000857/142/</link><pubDate>Thu, 13 Dec 2012 00:08:57 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/13/000857/142/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;★ [Groovy][&lt;a href="http://d.hatena.ne.jp/keyword/JUnit" class="keyword"&gt;JUnit&lt;/a&gt;]Groovyで&lt;a href="http://d.hatena.ne.jp/keyword/JUnit" class="keyword"&gt;JUnit&lt;/a&gt;なテストを書くときの注意点……なんて無かった &lt;a href="http://twitter.com/search?q=%23gadvent2012" target="_top"&gt;#gadvent2012&lt;/a&gt; B! &lt;a href="http://t.co/4kgHyLZm" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/279218382446923776" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:37:04&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://ifttt.com" rel="nofollow"&gt;IFTTT&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;[思ったこと]手段とか目的とか [思ったこと]手段とか目的とか&lt;a href="http://t.co/vLBbLoDJ" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/279217937716502528" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:35:18&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;非常に良いエントリ / [思ったこと]変なルールも何かのために作られた（はず） [思ったこと]変なルールも何かのために作られた（はず）&lt;a href="http://t.co/Z2uoS2gX" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/279217929688584193" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:35:16&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;各種&lt;a href="http://d.hatena.ne.jp/keyword/API" class="keyword"&gt;API&lt;/a&gt;を公開して、独自に開発した受注/在庫管理機能と連動させたい &lt;a href="http://t.co/u2OtDTnH" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; via @&lt;a href="http://twitter.com/colormeshop" class="twitter-user-screen-name" target="_top"&gt;colormeshop&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/278893050930032642" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-13&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;01:04:19&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>readコマンドで読み込んだ行からカラムを取り出す方法</title><link>https://genzouw.com/entry/2012/12/12/100707/143/</link><pubDate>Wed, 12 Dec 2012 10:07:07 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/12/100707/143/</guid><description>&lt;p&gt;今迄、 &lt;strong&gt;read コマンド&lt;/strong&gt; を一行ずつで読み込んでくりかえし処理する用途でしか使用していませんでした。&#10;ほんのちょっとだけ突っ込んだ使い方を学んだ。&lt;/p&gt;&#10;&lt;h2 id="行をカラム分割する"&gt;行をカラム分割する&lt;/h2&gt;&#10;&lt;p&gt;たとえば以下のような csv から 2 列目と 3 列目の情報を取り出す。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1,2,3,4,5&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2,3,4,5,6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3,4,5,6,7&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4,5,6,7,8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5,6,7,8,9&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="今迄のやり方"&gt;今迄のやり方&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat report.csv &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nb"&gt;read&lt;/span&gt; line&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;c2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -d, -f 2&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;c3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$line&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; cut -d, -f 3&lt;span class="k"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$c2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$c3&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果は以下の通り&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-txt" data-lang="txt"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;5&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;7&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;もう何が何やら&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="今回見つけたやり方"&gt;今回見つけたやり方&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat report.csv &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nv"&gt;IFS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;, &lt;span class="nb"&gt;read&lt;/span&gt; -r c1 c2 c3 _&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$c2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$c3&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;read&lt;/code&gt; コマンドに列の区切り文字を渡す（ &lt;code&gt;IFS=,&lt;/code&gt; )&lt;/li&gt;&#10;&lt;li&gt;列のポジションに該当する変数を列挙する&lt;/li&gt;&#10;&lt;li&gt;不要な列位置には &lt;code&gt;_&lt;/code&gt; という変数を指定するのが一般的なようだ。（ &lt;em&gt;意味のない変数&lt;/em&gt; ）&lt;/li&gt;&#10;&lt;li&gt;変数には各列の値がセットされる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;-r&lt;/code&gt; オプションをつけないと、ファイルの行末にバックスラッシュが入っていた場合、改行が無視されてしまう。（なかなか無いケースとは思うが、ハマりたくないので念の為付与しておく。）&lt;/p&gt;</description></item><item><title>Bashシェルスクリプトでファイルを空にする4つの方法</title><link>https://genzouw.com/entry/2012/12/11/164037/145/</link><pubDate>Tue, 11 Dec 2012 16:40:37 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/11/164037/145/</guid><description>&lt;p&gt;ファイルを予め用意しておきたいが、ファイルの中身は空にしたい。&#10;そんなときに使える方法を4つ紹介します。&lt;/p&gt;&#10;&lt;p&gt;以下の方法のいずれもファイルの中身を空にできます。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;ちなみに、ここで空にしたい対象ファイルは &lt;strong&gt;file.txt&lt;/strong&gt; とします。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="方法1--echo-コマンドを使う"&gt;方法1 : &lt;code&gt;echo&lt;/code&gt; コマンドを使う&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;echo&lt;/code&gt; コマンドを引数なし、末尾の改行無しオプション付きで実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &amp;gt; file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="方法2--cat-コマンドを使う"&gt;方法2 : &lt;code&gt;cat&lt;/code&gt; コマンドを使う&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;/dev/null&lt;/code&gt; デバイスと組み合わせて、空文字を出力させます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /dev/null &amp;gt; file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="方法3--touch-コマンドを使う"&gt;方法3 : &lt;code&gt;touch&lt;/code&gt; コマンドを使う&lt;/h2&gt;&#10;&lt;p&gt;思い切って、一度削除してしまうという方法です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rm -f file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ touch file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;**ただし、こちらの方法は問題があります。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;tail -f&lt;/code&gt; コマンドのようなファイルを監視する仕組みを利用している場合に、新しく作成されたファイルの存在が検知できない場合があります。&lt;/p&gt;&#10;&lt;h2 id="方法4--おすすめリダイレクトのみ行う"&gt;方法4 : (おすすめ)リダイレクトのみ行う&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;もっともタイプ量が少ない方法です。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &amp;gt; file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;圧倒的な短さですね。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;特に成約がなければ **4つめの方法で良いと思います。 **&lt;/p&gt;</description></item><item><title>2012年12月11日のツイート</title><link>https://genzouw.com/entry/2012/12/11/001238/146/</link><pubDate>Tue, 11 Dec 2012 00:12:38 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/11/001238/146/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/iida001" class="twitter-user-screen-name" target="_top"&gt;iida001&lt;/a&gt; ありがとうございます。どうやら父が保険を使わずにすまずと生前に言っていた点が問題になっていたようでした。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/278461096497643521" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-11&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:27:53&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/iida001/status/278449025328480256" class="twitter-user-screen-name"&gt;iida001&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/iidada" class="twitter-user-screen-name" target="_top"&gt;iidada&lt;/a&gt; ありがとうございます。どうやら父が保険を使わずにすまずと生前に言っていた点が問題になっていたようでした。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/278460468912332801" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-11&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:25:23&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/IIDADA/" class="twitter-user-screen-name"&gt;IIDADA&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;また状況報告します。繰り返しになりますが助けてくださった方々、ありがとうございました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/278444186708094976" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-11&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;19:20:42&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;僕は相続放棄手続きしていたのでそれほど不安はなかったのですが、姉と兄悪い事にはならなそうになってきました。弁護士を立てられれば出廷も不要なので時間、費用面も安心かなと。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/278443628618203136" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-11&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;19:18:28&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;姉、兄、僕は保険会社の方で手配した弁護士の方に一任する、という委任状、その他必要書類の用意だけで済むようになりそうです。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/278442333295476736" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-11&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;19:13:20&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Bashシェルスクリプトでランダムな重複なしの数列を生成する方法</title><link>https://genzouw.com/entry/2012/12/10/131646/147/</link><pubDate>Mon, 10 Dec 2012 13:16:46 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/10/131646/147/</guid><description>&lt;p&gt;Bash でランダムな重複なしの数列を生成する方法について。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ちなみに、重複が許される場合には以下のエントリを参考ください。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2015/11/12/073000/16/"&gt;Bash シェルスクリプトでランダムな文字列を作成する&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ここでは、２つの方法を紹介します。&lt;/p&gt;&#10;&lt;p&gt;例として、 &lt;strong&gt;1 から 8 までの数値を 1 つだけ含んだ&lt;/strong&gt; ランダムな数列を生成してみます。&lt;/p&gt;&#10;&lt;h2 id="shuf-コマンドを利用する方法"&gt;shuf コマンドを利用する方法&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; shuf&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;shuf&lt;/code&gt; コマンドが便利な使い方がたくさんあるので、&lt;a href="https://genzouw.com/entry/2021/03/07/082456/2405/"&gt;別エントリで詳しく紹介しています&lt;/a&gt; 。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="sort-コマンドを利用する方法"&gt;sort コマンドを利用する方法&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ seq &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sort -R &lt;span class="c1"&gt;# オプションは大文字であることに注意!&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もちろん、コマンドラインに限らず、Vim を利用しているときに行をランダムに入れ替えるときにも使えます。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;やっていることは標準入力から受けとった行をランダムに入れ替えているだけなので、数列以外にも利用できます。&lt;/p&gt;</description></item><item><title>2012年12月10日のツイート</title><link>https://genzouw.com/entry/2012/12/10/001236/148/</link><pubDate>Mon, 10 Dec 2012 00:12:36 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/10/001236/148/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ああ、こんなエントリ書いてる人の前でJenkins語ってた自分はずかしい・・・ / Jenkins がもっと便利になるおすすめプラグイン 8 つ &lt;a href="http://t.co/O8q5CL5W" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; @&lt;a href="http://twitter.com/fenrir_official" class="twitter-user-screen-name" target="_top"&gt;fenrir_official&lt;/a&gt;さんから&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/278141620703096832" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-10&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:18:24&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/masanobuimai" class="twitter-user-screen-name" target="_top"&gt;masanobuimai&lt;/a&gt; 痛い(笑)&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/278099890884706304" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-10&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:32:35&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/masanobuimai/status/277931448508489729" class="twitter-user-screen-name"&gt;masanobuimai&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;後輩がリーダーやりたいいってるので上司に相談しやらせてもらえるように調整した。頑張ってる。僕よりも(笑)。やりたいっていってるメンバーにやらせることによる開発効率化っていうのもあるかな。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/278099372384854016" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-10&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:30:31&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;本日&lt;a href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A7%A5%F3%A5%EA%A5%EB" class="keyword"&gt;フェンリル&lt;/a&gt;さんにお邪魔してきた。非常に物腰柔らかで話しやすい。開発環境や窓から景色見えた時興奮してしまった！！！素敵な職場だな〜&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/278092138489737216" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-10&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:01:47&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;ネットみると原告は勝てる見込み無しでは告訴しないとのことなので、こちらもなんとかする必要ありそう。大阪は木曜日に無料相談やってるみたいなので、嫁がいくとのこと。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277979193898307584" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-10&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;12:32:59&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2012年12月09日のツイート</title><link>https://genzouw.com/entry/2012/12/09/001354/149/</link><pubDate>Sun, 09 Dec 2012 00:13:54 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/09/001354/149/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;[Twittet]2012年12月08日のツイート &lt;a href="http://t.co/ZiVijaFY" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277760990093930497" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;22:05:55&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://www.hatena.ne.jp/guide/twitter" rel="nofollow"&gt;Hatena&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;1/8に青森の裁判所に来てくださいと。お休みいただかないといけないな。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277750442019127296" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:24:00&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;てか戸籍の分厚さにびびった。それからオヤジガ二人目の奥さんと結婚した日が9/25で、親父の誕生日だったのがなんだかほっこりした。ほっこりしてる場合じゃないんだけど。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277749063074578432" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:18:31&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;家帰ったら確かに手紙来てた。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277748679476125696" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:17:00&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/iida001" class="twitter-user-screen-name" target="_top"&gt;iida001&lt;/a&gt; 無料相談あるんですね。探してみます。ありがとうございます！&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277692409763205120" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;17:33:24&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/iida001/status/277685794842480642" class="twitter-user-screen-name"&gt;iida001&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;連れ子の場合、親が離婚したら子どもではなくなるか、か。ぐぐってみるか。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277679428065173504" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;16:41:49&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/tt4cs" class="twitter-user-screen-name" target="_top"&gt;tt4cs&lt;/a&gt; なるほど。兄も自分では手続きできないはずなので、母がどのような手続きをしているか次第ですね。意外と家族全員無傷でいけるような気がして来ました。ありがとうございます。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277678967501230081" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;16:39:59&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/tt4cs/status/277678479556878336" class="twitter-user-screen-name"&gt;tt4cs&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/tt4cs" class="twitter-user-screen-name" target="_top"&gt;tt4cs&lt;/a&gt; ありがとうございます！参考になりました。つまり僕以外の兄弟はややこしそうという事ですね。母は離婚していたために相手は子ども三人を相手として訴えを起こしています。母とはここ数年連絡が取れないので姉と相談してみます。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277678122592256000" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;16:36:38&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/tt4cs/status/277677452195672064" class="twitter-user-screen-name"&gt;tt4cs&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;考えるのつかれたし少し寝る！&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277675513324118016" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;16:26:15&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;@&lt;a href="http://twitter.com/tt4cs" class="twitter-user-screen-name" target="_top"&gt;tt4cs&lt;/a&gt; ありがとうございます。もしよろしければ教えていただきたいのですが、母が離婚しており、僕は放棄完了、兄は知的障害、姉は異父兄弟で別の家に嫁いでいる。この場合に親父が事故した際の責任は、誰にどれだけなのかわかりますか？&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277673910055624704" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;16:19:53&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/tt4cs/status/277673116858212352" class="twitter-user-screen-name"&gt;tt4cs&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;もうすぐ帰りのバス。相続放棄で交通事故の際の責任までちゃんと放棄されるか調べてみる&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277663802542133250" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;15:39:43&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;呪いというものがあるなら、親父の残した最後の呪いなのかもと思う。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277658410131009536" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;15:18:18&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;今名古屋なので今晩家に帰ってから資料みていろいろ調べてみる。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277655809696083969" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-09&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;15:07:58&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;相続放棄の効力がどこまで行くのかわからないな。僕は手続きしたけど兄貴、姉はやっていたんだろうか？何千万も払えないしな〜。嫁はパニクってるけど僕は負ける事はないと思ってる。&lt;/p&gt;</description></item><item><title>2012年12月08日のツイート</title><link>https://genzouw.com/entry/2012/12/08/001229/150/</link><pubDate>Sat, 08 Dec 2012 00:12:29 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/08/001229/150/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;怖いので出来れば成り行きをここに記しておく。さっき再送お願いしたので後で届くはず。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277347554876874752" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-08&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;18:43:04&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;いえ帰ったら&lt;a href="http://d.hatena.ne.jp/keyword/%C0%C4%BF%B9%C3%CF%BA%DB" class="keyword"&gt;青森地裁&lt;/a&gt;から特別送達の不在連絡票はいってた。僕何かしたのか？&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/277347323401617408" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-08&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;18:42:09&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://tapbots.com/tweetbot" rel="nofollow"&gt;Tweetbot for iOS&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>2012年12月07日のツイート</title><link>https://genzouw.com/entry/2012/12/07/040815/151/</link><pubDate>Fri, 07 Dec 2012 04:08:15 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/07/040815/151/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;httpと&lt;a href="http://d.hatena.ne.jp/keyword/ftp" class="keyword"&gt;ftp&lt;/a&gt;で同じオプション使ってたりとか、プロトコルの区別をあまりしなくて良いのがいいね。 / &lt;a href="http://d.hatena.ne.jp/keyword/curl" class="keyword"&gt;curl&lt;/a&gt;コマンドの情報は意外と少ないが &lt;a href="http://t.co/WaGjh0eX" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/276993651714949120" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-07&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;19:16:47&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>シェルでユーザの所属グループを設定するコマンドusermodとgpasswdの違い</title><link>https://genzouw.com/entry/2012/12/06/234939/152/</link><pubDate>Thu, 06 Dec 2012 23:49:39 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/06/234939/152/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;以下のサイトでさくら VPS をセットアップしています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://dotinstall.com/lessons/basic_sakura_vps"&gt;さくらの VPS 入門 (全 21 回) - プログラミングならドットインストール&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;新規作成したユーザーを特定のグループに所属させる場合に &lt;strong&gt;usermod&lt;/strong&gt; コマンドを使ったり、 &lt;strong&gt;gpasswd&lt;/strong&gt; を使ったりとそれぞれのケースが有ったのですが、どう違うのか調べてみました。&lt;/p&gt;&#10;&lt;p&gt;※ここでは &lt;strong&gt;group1 グループ&lt;/strong&gt; 、 &lt;strong&gt;group2 グループ&lt;/strong&gt; がすでに存在しているものとします。&lt;/p&gt;&#10;&lt;h2 id="usermod-を利用"&gt;usermod を利用&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo useradd xxxxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# group1を設定&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo usermod -G group1 xxxxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ id xxxxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt;,1003&lt;span class="o"&gt;(&lt;/span&gt;group1&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# group2を設定&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo usermod -G group2 xxxxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ id xxxxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt;,1004&lt;span class="o"&gt;(&lt;/span&gt;group2&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="gpasswd-を利用"&gt;gpasswd を利用&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo useradd xxxxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# group1を設定&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gpasswd -a xxxxx group1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Adding user xxxxx to group group1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ id xxxxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt;,1003&lt;span class="o"&gt;(&lt;/span&gt;group1&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# group2を設定&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo gpasswd -a xxxxx group2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Adding user xxxxx to group group2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ id xxxxx&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1002&lt;span class="o"&gt;(&lt;/span&gt;xxxxx&lt;span class="o"&gt;)&lt;/span&gt;,1003&lt;span class="o"&gt;(&lt;/span&gt;group1&lt;span class="o"&gt;)&lt;/span&gt;,1004&lt;span class="o"&gt;(&lt;/span&gt;group2&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;usermod&lt;/strong&gt; は &lt;strong&gt;Bash&lt;/strong&gt; でいうリダイレクト &amp;ldquo;&amp;gt;&amp;rdquo; のようにセカンドグループを上書き、 &lt;strong&gt;gpasswd&lt;/strong&gt; は &amp;ldquo;&amp;raquo;&amp;rdquo; のようにセカンドグループを追加する。&#10;&lt;code&gt;gpasswd&lt;/code&gt; の方が使いやすいです。&lt;/p&gt;</description></item><item><title>Ubuntu Serverの言語設定</title><link>https://genzouw.com/entry/2012/12/05/230551/153/</link><pubDate>Wed, 05 Dec 2012 23:05:51 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/05/230551/153/</guid><description>&lt;p&gt;さくらのVPS設定を週末から進めている。&lt;br&gt;&#10;以下のサイトがさくらのVPS設定を行う際にとても参考になる。&lt;br&gt;&#10;&lt;a href="http://dotinstall.com/lessons/basic_sakura_vps"&gt;さくらのVPS入門 (全21回) - プログラミングならドットインストール&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;\&lt;/p&gt;&#10;&lt;p&gt;以下の節について設定を進めていたところ、**&lt;a href="http://d.hatena.ne.jp/keyword/CentOS" class="keyword"&gt;CentOS&lt;/a&gt;**の場合の言語設定は&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/sysconfig/i18n&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;というファイルで変更できるよとのこと。&lt;br&gt;&#10;&lt;a href="http://dotinstall.com/lessons/basic_sakura_vps/8004"&gt;#04 さくらのVPSへ接続してみよう | さくらのVPS入門 - プログラミングならドットインストール&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;では**&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt;**の場合はというと以下のファイルを触る。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/default/local&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>2012年12月05日のツイート</title><link>https://genzouw.com/entry/2012/12/05/015219/154/</link><pubDate>Wed, 05 Dec 2012 01:52:19 +0900</pubDate><guid>https://genzouw.com/entry/2012/12/05/015219/154/</guid><description>&lt;div class="twitter-tweet-wrapper"&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;よし、あいつに&lt;a href="http://d.hatena.ne.jp/keyword/%A5%CA%A5%C4%A5%E1%A5%B0" class="keyword"&gt;ナツメグ&lt;/a&gt;を・・・・ / 【注意喚起】&lt;a href="http://d.hatena.ne.jp/keyword/%A5%CA%A5%C4%A5%E1%A5%B0" class="keyword"&gt;ナツメグ&lt;/a&gt;を大量摂取すると恐ろしいことが起こります &lt;a href="http://t.co/aCzKqTHq" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; @&lt;a href="http://twitter.com/youpouch" class="twitter-user-screen-name" target="_top"&gt;youpouch&lt;/a&gt;さんから&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/276330983677104128" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-05&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:23:35&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;どういう仕組み？？スゴイ / 線の中になにかが隠れています/さて、なにが見えたかな？ &lt;a href="http://t.co/8R0U745k" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; @&lt;a href="http://twitter.com/youpouch" class="twitter-user-screen-name" target="_top"&gt;youpouch&lt;/a&gt;さんから&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/276330755968360448" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-05&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;23:22:40&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twitter.com/tweetbutton" rel="nofollow"&gt;Tweet Button&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;★ [&lt;a href="http://d.hatena.ne.jp/keyword/jQuery" class="keyword"&gt;jQuery&lt;/a&gt;][ゲーム][小ネタ]あなたが，勝つことも引き分けることもできない○×ゲーム　（&lt;a href="http://d.hatena.ne.jp/keyword/jQuery" class="keyword"&gt;jQuery&lt;/a&gt;プラグイン「&lt;a href="http://d.hatena.ne.jp/keyword/jQuery" class="keyword"&gt;jQuery&lt;/a&gt;.fakeTicTacToe.js」の紹介） B! &lt;a href="http://t.co/pEmNggOO" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/276307953286541312" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-05&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;21:52:04&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://ifttt.com" rel="nofollow"&gt;IFTTT&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;[&lt;a href="http://d.hatena.ne.jp/keyword/jQuery" class="keyword"&gt;jQuery&lt;/a&gt;][ゲーム][小ネタ]あなたが，勝つことも引き分けることもできない○×ゲーム　（&lt;a href="http://d.hatena.ne.jp/keyword/jQuery" class="keyword"&gt;jQuery&lt;/a&gt;プラグイン「&lt;a href="http://d.hatena.ne.jp/keyword/jQuery" class="keyword"&gt;jQuery&lt;/a&gt;.fakeTicTacToe.js」の紹介） [&lt;a href="http://d.hatena.ne.jp/keyword/jQuery" class="keyword"&gt;jQuery&lt;/a&gt;][ゲーム][小ネタ]あなたが，勝つことも引き分け&lt;a href="http://t.co/ahqHNaK7" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/276287245743423488" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-05&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:29:47&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-tweet"&gt;&#10;&lt;p&gt;&lt;span class="twitter-tweet-text-user"&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;: &lt;/span&gt;これすごいな。サイトの高速化のためにシコシコ改修する時間別なことに使える / 連載編集長ブログ―安田英久 インストールするだけ! お手軽サイト高速化ツール&lt;a href="http://d.hatena.ne.jp/keyword/Google" class="keyword"&gt;Google&lt;/a&gt; mod_pagespeedはスゴかった &lt;a href="http://t.co/AkI1owYP" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/genzouw/status/276287220401455105" class="twitter-tweet-info-permalink"&gt;&lt;span class="twitter-tweet-info-date"&gt;2012-12-05&lt;/span&gt; &lt;span class="twitter-tweet-info-time"&gt;20:29:41&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-tweet-info-source"&gt;via &lt;a href="http://twicca.r246.jp/" rel="nofollow"&gt;twicca&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>【注意】Viewにクロージャを引数とするbindメソッドでenable、visible設定をバインドした際の注意</title><link>https://genzouw.com/entry/2012/10/07/230955/156/</link><pubDate>Sun, 07 Oct 2012 23:09:55 +0900</pubDate><guid>https://genzouw.com/entry/2012/10/07/230955/156/</guid><description>&lt;p&gt;タイトルのままです。&lt;br&gt;&#10;絶対ハマると思います。&lt;br&gt;&#10;View内のボタンの活性・非活性制御にbindメソッドを使った場合注意が必要。&lt;br&gt;&#10;通常のbindメソッドなら良いのですが、クロージャを引数に受けとるタイプで注意が必要。&lt;/p&gt;&#10;&lt;p&gt;例えば、保存するボタンがあるとする。&lt;br&gt;&#10;保存するボタンはModelのisInsertModeプロパティかisUpdateModeプロパティがtrueの場合のみ、押せるようにしたい。&lt;br&gt;&#10;この２つの設定は、Model内で@Bindable&lt;a href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%CE%A5%C6%A1%BC%A5%B7%A5%E7%A5%F3" class="keyword"&gt;アノテーション&lt;/a&gt;付きで宣言されている。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;text:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;保存する&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;actionPerformed:&lt;/span&gt;&lt;span class="n"&gt;confirmAndExecute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mainFrame&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;設定を保存します。\nよろしいですか？&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;はい&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;updateTwitterAccount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;visible:&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isInsertMode&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isUpdateMode&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここで、Controllerにてmodel.isInsertMode、model.isUpdateModeを色々変更してみるのだが、&lt;br&gt;&#10;変更内容がうまく反映されない。&lt;br&gt;&#10;どうもmodel.isUpdateModeを変更した場合にうまく変更が反映されてくれない。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="解決策"&gt;解決策&lt;/h3&gt;&#10;&lt;p&gt;いろいろもがいているうちに、２行追加することで問題が解決した。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;text:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;保存する&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;actionPerformed:&lt;/span&gt;&lt;span class="n"&gt;confirmAndExecute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mainFrame&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;設定を保存します。\nよろしいですか？&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;はい&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;updateTwitterAccount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;visible:&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isInsertMode&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;=ここ&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isUpdateMode&lt;/span&gt; &lt;span class="c1"&gt;// &amp;lt;=ここ&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isInsertMode&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isUpdateMode&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;どうもクロージャの最終行の値評価が行われる前に一度プロパティの呼び出しをしておく必要があるようだ。&lt;br&gt;&#10;解決方法としてはかなりかっこ悪いがこれで対応できる。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="追記"&gt;追記&lt;/h3&gt;&#10;&lt;p&gt;例えば既存処理で一度別変数にセットしてから評価しているようなプログラムでは当然問題がでないので本当にハマった。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="ex"&gt;ex&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;text:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;保存する&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;actionPerformed:&lt;/span&gt;&lt;span class="n"&gt;confirmAndExecute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mainFrame&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;設定を保存します。\nよろしいですか？&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;はい&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;controller&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;updateTwitterAccount&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;visible:&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 一度プロパティの呼び出しをしているため問題は発生しない。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;insert&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isInsertMode&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isUpdateMode&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;insert&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="実行環境"&gt;実行環境&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -vs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux &lt;span class="c1"&gt;#50-Ubuntu SMP Fri Sep 7 16:16:45 UTC 2012&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Groovy Version: 2.0.0 JVM: 1.7.0_07 Vendor: Oracle Corporation OS: Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ griffon -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Griffon 1.0.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Build: 04-Jun-2012 08:53 PM&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Groovy: 1.8.6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Ant: 1.8.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Slf4j: 1.6.4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Spring: 3.1.1.RELEASE&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;JVM: 1.7.0_07 &lt;span class="o"&gt;(&lt;/span&gt;Oracle Corporation 23.2-b09&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OS: Linux 3.2.0-31-generic amd64&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description></item><item><title>GroovyのList#takeメソッドが便利</title><link>https://genzouw.com/entry/2012/10/05/122243/157/</link><pubDate>Fri, 05 Oct 2012 12:22:43 +0900</pubDate><guid>https://genzouw.com/entry/2012/10/05/122243/157/</guid><description>&lt;p&gt;よく組むロジックだが、いつもしこしこコーディングしていた処理が組み込みメソッドで用意されてた。&#10;とあるリストから、前方3件だけ取得したい。ただしリストが2件以下の場合はすべて返却。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bbb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ccc&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ddd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eee&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;headEx&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;empty&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;head&lt;/span&gt;&lt;span class="o"&gt;()]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;headEx&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tail&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bbb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ccc&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ddd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eee&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;headEx&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bbb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ccc&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ddd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eee&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;headEx&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bbb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ccc&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;headEx&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bbb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;headEx&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;headEx&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;headEx&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;finish!&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;List#take&lt;/code&gt; 使うと簡単に実現可能。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bbb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ccc&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ddd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eee&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bbb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ccc&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ddd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eee&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bbb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ccc&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ddd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eee&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bbb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ccc&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;bbb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;aaa&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;take&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;finish!&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Groovy(Java)でランダムな半角英数字を作成</title><link>https://genzouw.com/entry/2012/09/24/150726/158/</link><pubDate>Mon, 24 Sep 2012 15:07:26 +0900</pubDate><guid>https://genzouw.com/entry/2012/09/24/150726/158/</guid><description>&lt;p&gt;CakePHP勉強中。&lt;/p&gt;&#10;&lt;p&gt;初期セットアップ手順に設定ファイル内の &lt;strong&gt;Security.salt&lt;/strong&gt; っていうランダム文字列の値(40文字)を書き直しなさいってあったので、なんかいいコマンドないか探してみた。&#10;ググると、Linuxなら &lt;strong&gt;&lt;a href="https://genzouw.com/entry/2021/07/04/083700/2695/"&gt;mkpasswd&lt;/a&gt;&lt;/strong&gt; というコマンドで生成できるよ、とあった。&lt;/p&gt;&#10;&lt;p&gt;Cygwin環境で試したところ、うまく動かなかったため（パッケージをインストールしていないだけかも）Groovyで作ってみた。Apacheのcommons-langライブラリにちょうど良いメソッドがあったためそれを呼び出しただけ。&lt;/p&gt;&#10;&lt;h2 id="mkrandomtxtgroovy"&gt;mkrandomtxt.groovy&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;commons-lang:commons-lang:2.2&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;commons&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;RandomStringUtils&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;CliBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;usage:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${this.class.name} [-a] [-n] arg&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="nl"&gt;longOpt:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;alpha&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;args:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;use alphabet chars.&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;required:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt; &lt;span class="nl"&gt;longOpt:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;num&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;args:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;use number chars.&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;required:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;isNumber&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;usage&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exit&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="nf"&gt;randomAlphanumeric&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;toInteger&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="nf"&gt;randomAlphabetic&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;toInteger&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="nf"&gt;randomNumeric&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;toInteger&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./mkrandomtxt.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usage: &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-a&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-n&lt;span class="o"&gt;]&lt;/span&gt; arg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-a,--alpha use alphabet chars.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-n,--num use number chars.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./mkrandomtxt.groovy -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usage: &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-a&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-n&lt;span class="o"&gt;]&lt;/span&gt; arg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-a,--alpha use alphabet chars.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-n,--num use number chars.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./mkrandomtxt.groovy -n&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usage: &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-a&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;-n&lt;span class="o"&gt;]&lt;/span&gt; arg&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-a,--alpha use alphabet chars.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-n,--num use number chars.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./mkrandomtxt.groovy -a &lt;span class="m"&gt;40&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;YigbOgZPxHVbykasJjfBXooaRvrZfpriDFNtBhDv&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./mkrandomtxt.groovy -n &lt;span class="m"&gt;40&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;3426318853025788662162725592943221571994&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./mkrandomtxt.groovy -a -n &lt;span class="m"&gt;40&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EEBZyK8BwAoyCriTJUJ8N2eHOUSAhHv41EDLtfmt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./mkrandomtxt.groovy -an &lt;span class="m"&gt;40&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lPckdxen3LBLrJddAZUBTRctIFChPBRmwYC0nxau&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>griffon-1.0.1で -version オプション付きでコマンド実行するとエラーが出る。</title><link>https://genzouw.com/entry/2012/08/09/003540/160/</link><pubDate>Thu, 09 Aug 2012 00:35:40 +0900</pubDate><guid>https://genzouw.com/entry/2012/08/09/003540/160/</guid><description>&lt;p&gt;以下のようなエラーが出て困った。&lt;br&gt;&#10;僕の環境だけなのか不明。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;/opt/griffon/bin/griffon: 140: /opt/griffon/bin/startGriffon: [[: not found&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;griffon 1.0.1は、以下のようにインストールしている。&lt;/p&gt;&#10;&lt;p&gt;\&lt;/p&gt;&#10;&lt;p&gt;opt&lt;br&gt;&#10;├─griff n-&amp;lt;= griffon-1.0.&lt;a href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%DC%A5%EA%A5%C3%A5%AF%A5%EA%A5%F3%A5%AF" class="keyword"&gt;シンボリックリンク&lt;/a&gt;&lt;br&gt;&#10;├─griffon-0.9.5&lt;br&gt;&#10;├─griffon-1.0.0&lt;br&gt;&#10;├─griffon-1.0.1&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="該当箇所の変更に関するチケット"&gt;該当箇所の変更に関するチケット&lt;/h3&gt;&#10;&lt;p&gt;@kimukou2628さん(&lt;a href="https://twitter.com/kimukou2628"&gt;https://twitter.com/kimukou2628&lt;/a&gt;)が見つけてきてくれた。&lt;/p&gt;&#10;&lt;div class="twitter-detail twitter-detail-left"&gt;&#10;&lt;div class="twitter-detail-user"&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/kimukou2628" class="twitter-user-screen-name"&gt;&lt;img src="http://a0.twimg.com/profile_images/2457500780/52421a9h9mxy5zjnsl8e_normal.png" width="48" height="48" alt="kimukou2628" /&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="twitter-detail-tweet"&gt;&#10;&lt;p&gt;@&lt;a href="http://twitter.com/genzouw" class="twitter-user-screen-name" target="_top"&gt;genzouw&lt;/a&gt; リリースノートのJava7対応 522のチケット対応で入った処理のようです &lt;a href="http://t.co/clpw7DOo" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt; &lt;a href="http://t.co/2FGFDkl8" class="twitter-tweet-url" target="_top"&gt;&lt;span&gt;URL&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://twitter.com/kimukou2628/status/233194846574219265" class="twitter-detail-info-permalink"&gt;&lt;span class="twitter-detail-info-date"&gt;2012-08-08&lt;/span&gt; &lt;span class="twitter-detail-info-time"&gt;22:35:58&lt;/span&gt;&lt;/a&gt; &lt;span class="twitter-detail-info-source"&gt;via &lt;a href="http://www.tweenapp.org/" rel="nofollow"&gt;Tween&lt;/a&gt;&lt;/span&gt; to @&lt;a href="http://twitter.com/genzouw/status/233193712589631488" class="twitter-user-screen-name"&gt;genzouw&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;&lt;a href="http://jira.codehaus.org/browse/GRIFFON-522"&gt;[#GRIFFON-522] Griffon command cannot be executed if JAVA_HOME is set in a non-standard way - jira.codehaus.org&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;変更してから随分経つし、問題は僕だけなのかな。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="対処法"&gt;対処法&lt;/h3&gt;&#10;&lt;p&gt;$GRIFFON_HOME/bin/griffon ファイルの１行目の &lt;a href="http://www.google.com/search?q=%E3%82%B7%E3%82%A7%E3%83%90%E3%83%B3%E3%82%B0&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;google:シェバング&lt;/a&gt; 部分を書き換えたらエラーは出なくなった。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;--- griffon&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+++ griffon&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;@@ -1,4 +1,4 @@&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;-#!/bin/sh&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DIRNAME=`dirname &amp;#34;$0&amp;#34;`&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;. &amp;#34;$DIRNAME/startGriffon&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="実行環境"&gt;実行環境&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;$ uname -vs&#10;Linux #43-Ubuntu SMP Fri Jul 6 14:25:57 UTC 2012&#10;$ java -version&#10;java version &amp;#34;1.7.0_03&amp;#34;&#10;OpenJDK Runtime Environment (IcedTea7 2.1.1pre) (7~u3-2.1.1~pre1-1ubuntu3)&#10;OpenJDK 64-Bit Server VM (build 22.0-b10, mixed mode)&#10;$ groovy -version&#10;Groovy Version: 2.0.0 JVM: 1.7.0_03 Vendor: Oracle Corporation OS: Linux&#10;$ griffon -version&#10;/opt/griffon/bin/griffon: 140: /opt/griffon/bin/startGriffon: [[: not found&#10;------------------------------------------------------------&#10;Griffon 1.0.1&#10;------------------------------------------------------------&#10;Build: 09-Jul-2012 10:21 AM&#10;Groovy: 1.8.6&#10;Ant: 1.8.2&#10;Slf4j: 1.6.4&#10;Spring: 3.1.1.RELEASE&#10;JVM: 1.7.0_03 (Oracle Corporation 22.0-b10)&#10;OS: Linux 3.2.0-27-generic amd64&#10;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>CloudBees上でGrailsにてDBにアクセス</title><link>https://genzouw.com/entry/2012/08/02/002258/161/</link><pubDate>Thu, 02 Aug 2012 00:22:58 +0900</pubDate><guid>https://genzouw.com/entry/2012/08/02/002258/161/</guid><description>&lt;p&gt;&lt;a href="http://www.google.com/search?q=CloudBees&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;CloudBees&lt;/a&gt; にGrailsアプリをアップできたので、DBにアクセスしてみた。&lt;/p&gt;&#10;&lt;h2&gt;設定&lt;/h2&gt;&#10;&lt;p&gt;以下にアクセスして、Databaseの新規追加を行う。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://grandcentral.cloudbees.com/"&gt;https://grandcentral.cloudbees.com/&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;CloudBees上での各種設定方法は、僕自身も四苦八苦しているうちに登録方法をみにつけたので省略する。&#10;デフォルトではMySQLデータベースとして登録される。&lt;/p&gt;&#10;&lt;h2&gt;Grailsアプリ上の設定&lt;/h2&gt;&#10;&lt;p&gt;以下のサイトの &lt;strong&gt;Configuring CloudBees DataSources&lt;/strong&gt; の内容を利用した。 CloudBees RUN@cloud Documentation &lt;/p&gt;&#10;&lt;p&gt;そのままコピペした。コピペした上で、以下の３文字列を置換した。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;BEES_DB&lt;/li&gt;&#10;&lt;li&gt;BEES_DB_USER&lt;/li&gt;&#10;&lt;li&gt;BEES_DB_PASS&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;設定後は以下のコマンドを実行し、warファイルをデプロイする。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-bash"&gt;# ${app_name}は適切に書き換えること&#10;$ grails prod war&#10;$ grails bees-app-deploy ${app_name}&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2&gt;結果を確認してみる&lt;/h2&gt;&#10;&lt;p&gt;ざんねんながら自分のアプリケーションにアクセスしてみても &lt;strong&gt;404エラー&lt;/strong&gt; となっている。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-bash"&gt;`http://${app_name}.${account_name}.cloudbees.net/`&#10;&lt;p&gt;exception is org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class &amp;lsquo;com.cloudbees.jdbc.Driver&amp;rsquo; for connect URL &amp;lsquo;[[jdbc:cloudbees://${app_name_db}]]&amp;rsquo;&#10;at org&amp;hellip;.&#10;&amp;hellip;&#10;&amp;hellip;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;com.cloudbees.jdbc.Driver&lt;/code&gt;を生成できませんでした、と。&lt;/p&gt;&#10;&lt;h2&gt;解決方法&lt;/h2&gt;&#10;&lt;p&gt;２つある。&lt;/p&gt;&#10;&lt;h2&gt;解決方法その１&lt;/h2&gt;&#10;&lt;p&gt;CloudBeesの提供していると思われるJDBC機能を利用しない方法。DataSource.groovyを書き換える。&lt;/p&gt;&#10;&lt;h4&gt;DataSource.groovy&lt;/h4&gt;&#10;&lt;pre&gt;&lt;code class="language-groovy"&gt;dataSource {&#10; pooled = true&#10; // driverClassName = &amp;quot;com.cloudbees.jdbc.Driver&amp;quot;&#10; driverClassName = &amp;quot;com.mysql.jdbc.Driver&amp;quot;&#10;}&#10;environments {&#10; // ...&#10; production {&#10; dataSource {&#10; dbCreate = &amp;quot;update&amp;quot;&#10; // url = &amp;quot;[[jdbc:cloudbees://${app_name_db}]]&amp;quot;&#10; url = &amp;quot;jdbc:mysql://ec2-75-xxx-xxx-xxx.compute-1.amazonaws.com/${app_name_db}&amp;quot; // 適宜書き換える必要がある箇所&#10; // mysqlサーバー名も僕の環境のものを一部掲載しておく。&#10; username = &amp;quot;${db_user}&amp;quot; // 適宜書き換える必要がある箇所&#10; password = &amp;quot;${db_password}&amp;quot; // 適宜書き換える必要がある箇所&#10; }&#10; }&#10;}&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3&gt;解決方法その２&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;url属性情報&lt;/strong&gt; を一部直さないといけないぽい。&lt;/p&gt;</description></item><item><title>作成したGroovyスクリプトをGroovy未インストール環境で使ってもらう</title><link>https://genzouw.com/entry/2012/08/01/005503/162/</link><pubDate>Wed, 01 Aug 2012 00:55:03 +0900</pubDate><guid>https://genzouw.com/entry/2012/08/01/005503/162/</guid><description>&lt;p&gt;作成したGroovyスクリプトをチームメンバーに利用してもらいたいが、普通のメンバーはGroovyはインストールしていない。知名度はまだまだのようだ。&lt;/p&gt;&#10;&lt;p&gt;そこでGroovyをインストールしていないメンバー環境でもGroovyを実行できるようにするにはどうしたらよいかを試行錯誤してみた。&lt;/p&gt;&#10;&lt;p&gt;結果うまくいった方法を残しておく。&lt;/p&gt;&#10;&lt;h3 id="経緯"&gt;経緯&lt;/h3&gt;&#10;&lt;p&gt;複数エクセルファイルの内容をまとめ、１ファイルにして提出する必要があった。これをGroovy + POIで実現しようとした。&lt;br /&gt;&#10;Groovyスクリプトで難なくできたわけだがこれをほかメンバーに公開したい。&lt;/p&gt;&#10;&lt;p&gt;もちろん &lt;strong&gt;fat jar化&lt;/strong&gt; する方法もあるが、編集のたびにビルドするのが面倒なために今回は他の方法を検討。&lt;/p&gt;&#10;&lt;h3 id="実行環境"&gt;実行環境&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -vs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux &lt;span class="c1"&gt;#41-Ubuntu SMP Thu Jun 14 17:49:24 UTC 2012&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ java -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java version &lt;span class="s2"&gt;&amp;#34;1.7.0_03&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenJDK Runtime Environment &lt;span class="o"&gt;(&lt;/span&gt;IcedTea7 2.1.1pre&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;7~u3-2.1.1~pre1-1ubuntu3&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenJDK 64-Bit Server VM &lt;span class="o"&gt;(&lt;/span&gt;build 22.0-b10, mixed mode&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Groovy Version: 2.0.0 JVM: 1.7.0_03 Vendor: Oracle Corporation OS: Linux&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="作成したスクリプト"&gt;作成したスクリプト&lt;/h3&gt;&#10;&lt;p&gt;実際のものと異なるが、 &lt;a href="http://blog.kanemu.net/2009/09/groovypoiexcel.html"&gt;カネムーメモ: groovyとpoiでExcelファイルを出力する&lt;/a&gt; から拝借し一部変更したものを記載。&lt;/p&gt;&#10;&lt;h4 id="testgr"&gt;test.gr&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.poi:poi:3.8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.poi:poi-ooxml:3.8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.poi:poi-scratchpad:3.8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.poi.hssf.usermodel.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;myVal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;あああ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;いいい&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ううう&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;かかか&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ききき&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;くくく&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;さささ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ししし&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;すすす&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;test.xls&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withOutputStream&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HSSFWorkbook&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createSheet&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;myVal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//新規行作成&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;HSSFRow&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createRow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;myVal&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//新規セル作成&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;HSSFCell&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createCell&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HSSFCell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ENCODING_UTF_16&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;setCellValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;myVal&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;poiのライブラリがなくても、Grape機能で自動的に依存性を解決してくれる。&lt;/p&gt;</description></item><item><title>CloudBeesにGrailsアプリをデプロイしてみる</title><link>https://genzouw.com/entry/2012/07/30/001114/163/</link><pubDate>Mon, 30 Jul 2012 00:11:14 +0900</pubDate><guid>https://genzouw.com/entry/2012/07/30/001114/163/</guid><description>&lt;p&gt;GrailsでWebアプリを作る際には &lt;strong&gt;CloudBees&lt;/strong&gt; が良さそうだなと思い、無料版でアプリ検証してみました。&#10;アプリケーションの構築などはいろんな方が紹介しているので、今回はデプロイのみ行ってみます。&#10;次回はデータベースの利用を取り上げてみるつもりです。&lt;/p&gt;&#10;&lt;h2 id="マシン環境"&gt;マシン環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -vs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux &lt;span class="c1"&gt;#41-Ubuntu SMP Thu Jun 14 17:49:24 UTC 2012&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ java -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java version &lt;span class="s2"&gt;&amp;#34;1.7.0_03&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenJDK Runtime Environment &lt;span class="o"&gt;(&lt;/span&gt;IcedTea7 2.1.1pre&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;7~u3-2.1.1~pre1-1ubuntu3&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenJDK 64-Bit Server VM &lt;span class="o"&gt;(&lt;/span&gt;build 22.0-b10, mixed mode&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Grails version: 2.1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="アプリケーションの作成デプロイ"&gt;アプリケーションの作成、デプロイ&lt;/h2&gt;&#10;&lt;p&gt;正式なデプロイ方法があるが、 以下のGrailsプラグインを使うのが最も簡単なようです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Grails Plugin: CloudBees&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;手順をピックアップする以下のようになります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;プラグインをインストール&lt;/li&gt;&#10;&lt;li&gt;プロパティを４つ設定&lt;/li&gt;&#10;&lt;li&gt;ビルド→デプロイを実行 &lt;em&gt;もちろん事前にアカウントを取得しておく必要がある。&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;strong&gt;また、開発中のGrailsプロジェクトと同名でCloudBees上にアプリケーションを新規登録しておく必要もあります。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="プラグインインストール"&gt;プラグインインストール&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails install-plugin cloud-bees&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="プロパティ設定"&gt;プロパティ設定&lt;/h2&gt;&#10;&lt;p&gt;プロジェクト内のBuildConfig.groovyに以下の設定を追加。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cloudbees.account&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CLOUD_BEES_ACCOUNT&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cloudbees.api.key&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CLOUD_BEES_API_KEY&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cloudbees.api.secret&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;CLOUD_BEES_API_SECRET&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cloudbees.permgensize &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;128&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;CLOUD_BEES_ACCOUNT&lt;/code&gt;, &lt;code&gt;CLOUD_BEES_API_KEY&lt;/code&gt;, &lt;code&gt;CLOUD_BEES_API_SECRET&lt;/code&gt; のうち、アカウントは簡単ですが残りの情報がどこから取得できるかわからずに詰まってしまいました。&#10;CloudBeesにログインし以下のURLにアクセスすることで APIキー、APIシークレットを取得できます。&lt;/p&gt;</description></item><item><title>Bash上でGrailsコマンドのオプションを保管</title><link>https://genzouw.com/entry/2012/07/28/160928/164/</link><pubDate>Sat, 28 Jul 2012 16:09:28 +0900</pubDate><guid>https://genzouw.com/entry/2012/07/28/160928/164/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uehaj/20090606/1244259752"&gt;Bash completion for Grails 1.1 - uehaj&amp;rsquo;s blog&lt;/a&gt; を見てからずっと設定を試してみたいと思っていたが &lt;a href="http://www.google.com/search?q=Grails&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;google:Grails&lt;/a&gt; を触る機会がなかったもので試せていなかったが、Webの案件が入りそうなのでGrailsの最習得を目指して環境周りを整備しだした。&lt;/p&gt;&#10;&lt;h2 id="マシン環境"&gt;マシン環境&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -vs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux &lt;span class="c1"&gt;#41-Ubuntu SMP Thu Jun 14 17:49:24 UTC 2012&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ java -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java version &lt;span class="s2"&gt;&amp;#34;1.7.0_03&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenJDK Runtime Environment &lt;span class="o"&gt;(&lt;/span&gt;IcedTea7 2.1.1pre&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;7~u3-2.1.1~pre1-1ubuntu3&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenJDK 64-Bit Server VM &lt;span class="o"&gt;(&lt;/span&gt;build 22.0-b10, mixed mode&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Grails version: 2.1.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="スクリプトダウンロード"&gt;スクリプトダウンロード&lt;/h2&gt;&#10;&lt;p&gt;Bash Completionの仕組みは勉強不足だが、Grailsコマンドにこの機能を組み込むためにはスクリプトが必要という事でダウンロード。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://www.google.com/search?q=github&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;google:github&lt;/a&gt; に上がっていた。（ &lt;a href="https://github.com/podollb/grails-autocomplete"&gt;https://github.com/podollb/grails-autocomplete&lt;/a&gt; ）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; ~&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git clone git://github.com/podollb/grails-autocomplete.git grails-autocomplete&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次に.bashrcにスクリプト読み込み処理を追加。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ vi ~/.bashrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 一番下に以下のコードを追加&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt; -r &lt;span class="nv"&gt;$HOME&lt;/span&gt;/grails-autocomplete/grails_autocomplete &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/grails-autocomplete/grails_autocomplete&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一度ログアウトするか、 &lt;code&gt;source ~/.bashrc&lt;/code&gt; してやる。&lt;/p&gt;</description></item><item><title>GriffonのJsmoothプラグインで作ったexeが正常に動かない</title><link>https://genzouw.com/entry/2012/07/26/235154/165/</link><pubDate>Thu, 26 Jul 2012 23:51:54 +0900</pubDate><guid>https://genzouw.com/entry/2012/07/26/235154/165/</guid><description>&lt;p&gt;今まで動いていたexeが急に動かなくなってものすごく躓いた。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="なぜjavaアプリなのにexeが必要"&gt;なぜ&lt;a href="http://d.hatena.ne.jp/keyword/Java" class="keyword"&gt;Java&lt;/a&gt;アプリなのにexeが必要？&lt;/h3&gt;&#10;&lt;p&gt;お客様とお話ししてはっとした。&lt;br&gt;&#10;展開系のツールがインストールされている場合、実行可能jarファイルをダブルクリックしてもjarが展開されるだけの環境があるとのこと。&lt;br&gt;&#10;だから、jarをexeに変換してリリースして欲しいということだった。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="自分のマシン環境"&gt;自分のマシン環境&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -vs&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux &lt;span class="c1"&gt;#41-Ubuntu SMP Thu Jun 14 17:49:24 UTC 2012&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ java -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java version &lt;span class="s2"&gt;&amp;#34;1.7.0_03&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenJDK Runtime Environment &lt;span class="o"&gt;(&lt;/span&gt;IcedTea7 2.1.1pre&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;7~u3-2.1.1~pre1-1ubuntu3&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenJDK 64-Bit Server VM &lt;span class="o"&gt;(&lt;/span&gt;build 22.0-b10, mixed mode&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ griffon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Welcome to Griffon 1.0.0 - http://griffon-framework.org/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Licensed under Apache Standard License 2.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Griffon home is &lt;span class="nb"&gt;set&lt;/span&gt; to: /opt/griffon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No script name specified. Use &lt;span class="s1"&gt;&amp;#39;griffon help&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; more info or &lt;span class="s1"&gt;&amp;#39;griffonsh&amp;#39;&lt;/span&gt; to enter interactive mode&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;pwd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/genzou/testapp&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="exeを作る"&gt;exeを作る&lt;/h3&gt;&#10;&lt;p&gt;プロジェクトディレクトリで以下のコマンドを実行するだけ。&lt;/p&gt;</description></item><item><title>GriffonでHibernateのアノテーションを使いたい時に躓いた</title><link>https://genzouw.com/entry/2012/02/08/225910/166/</link><pubDate>Wed, 08 Feb 2012 22:59:10 +0900</pubDate><guid>https://genzouw.com/entry/2012/02/08/225910/166/</guid><description>&lt;p&gt;Griffonでアプリケーションを作成する機会が増えてきた。&lt;br&gt;&#10;&lt;a href="http://d.hatena.ne.jp/keyword/SQlite" class="keyword"&gt;SQlite&lt;/a&gt;が気に入っていてよく使っていたが&lt;a href="http://d.hatena.ne.jp/keyword/Hibernate" class="keyword"&gt;Hibernate&lt;/a&gt;を利用したかったため実績のある&lt;a href="http://d.hatena.ne.jp/keyword/Hsqldb" class="keyword"&gt;Hsqldb&lt;/a&gt;に切り替えた。&lt;/p&gt;&#10;&lt;p&gt;griffon-app/conf/Config.groovyに以下の記載を追加すればすぐに使えるものと思っていた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;compile&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.hibernate:hibernate-annotations:3.5.6-Final&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;runtime&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.slf4j:slf4j-simple:1.4.2&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;runtime&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hsqldb:hsqldb:1.8.0.7&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;runtime&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;javassist:javassist:3.4.GA&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;runtime&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.hibernate:hibernate-validator:4.2.0.Final&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;が、どうもよくわからないエラーが発生。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;java.lang.LinkageError: loader constraint violation: when resolving overridden method &amp;#34;org.apache.tools.ant.helper.ProjectHelper2$RootHandler.setDocumentLocator(Lorg/xml/sax/Locator;)V&amp;#34; the class loader (instance of org/codehaus/griffon/cli/support/GriffonRootLoader) of the current class, org/apache/tools/ant/helper/ProjectHelper2$RootHandler, and its superclass loader (instance of &amp;lt;bootloader&amp;gt;), have different Class objects for the type andler.setDocumentLocator(Lorg/xml/sax/Locator;)V used in the signature&#10;at org.apache.tools.ant.helper.ProjectHelper2.parseUnknownElement(ProjectHelper2.java:130)&#10;at org.apache.tools.ant.helper.ProjectHelper2.parseAntlibDescriptor(ProjectHelper2.java:110)&#10;at org.apache.tools.ant.taskdefs.Antlib.createAntlib(Antlib.java:91)&#10;at org.apache.tools.ant.taskdefs.Definer.loadAntlib(Definer.java:440)&#10;at org.apache.tools.ant.taskdefs.Definer.execute(Definer.java:292)&#10;at org.apache.tools.ant.ComponentHelper.checkNamespace(ComponentHelper.java:869)&#10;at org.apache.tools.ant.ComponentHelper.getDefinition(ComponentHelper.java:308)&#10;at org.apache.tools.ant.ComponentHelper.createComponent(ComponentHelper.java:285)&#10;at org.apache.tools.ant.ComponentHelper.createComponent(ComponentHelper.java:264)&#10;at org.apache.tools.ant.UnknownElement.makeObject(UnknownElement.java:417)&#10;at org.apache.tools.ant.UnknownElement.maybeConfigure(UnknownElement.java:163)&#10;at org.codehaus.griffon.cli.GriffonScriptRunner.callPluginOrGriffonScript(GriffonScriptRunner.java:435)&#10;at org.codehaus.griffon.cli.GriffonScriptRunner.executeCommand(GriffonScriptRunner.java:300)&#10;at org.codehaus.griffon.cli.GriffonScriptRunner.main(GriffonScriptRunner.java:116)&#10;at org.codehaus.griffon.cli.support.GriffonStarter.rootLoader(GriffonStarter.java:198)&#10;at org.codehaus.griffon.cli.support.GriffonStarter.main(GriffonStarter.java:223)&#10;Error executing script RunApp: loader constraint violation: when resolving overridden method &amp;#34;org.apache.tools.ant.helper.ProjectHelper2$RootHandler.setDocumentLocator(Lorg/xml/sax/Locator;)V&amp;#34; the class loader (instance of org/codehaus/griffon/cli/support/GriffonRootLoader) of the current class, org/apache/tools/ant/helper/ProjectHelper2$RootHandler, and its superclass loader (instance of &amp;lt;bootloader&amp;gt;), have different Class objects for the type andler.setDocumentLocator(Lorg/xml/sax/Locator;)V used in the signature&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;いろいろ試してみた結果、&lt;strong&gt;&lt;a href="http://d.hatena.ne.jp/keyword/hibernate" class="keyword"&gt;hibernate&lt;/a&gt;-annotasions&lt;/strong&gt;ライブラリ内の&lt;a href="http://d.hatena.ne.jp/keyword/xml" class="keyword"&gt;xml&lt;/a&gt;-&lt;a href="http://d.hatena.ne.jp/keyword/api" class="keyword"&gt;api&lt;/a&gt;を以下のように除外してやる必要があった。&lt;/p&gt;</description></item><item><title>MacのOpenコマンドをLinuxで</title><link>https://genzouw.com/entry/2012/02/06/071737/167/</link><pubDate>Mon, 06 Feb 2012 07:17:37 +0900</pubDate><guid>https://genzouw.com/entry/2012/02/06/071737/167/</guid><description>&lt;p&gt;以下のエントリを見て、Macの &lt;code&gt;open&lt;/code&gt; コマンドが便利そうだなと思いました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://takuya-1st.hatenablog.jp/entry/20120117/1326823409"&gt;MacのOpenコマンドのすすめ - それマグで！&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;open&lt;/code&gt; コマンドで、関連付けされた適切なアプリケーションが起動するようです。&#10;Linuxにも同様なコマンドがないか？と探していたらありました。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;gnome-open&lt;/code&gt; コマンドというらしい。&lt;/p&gt;&#10;&lt;p&gt;長くて打ち込みにくいのでエイリアスをつけることをおすすめ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;alias&lt;/span&gt; &lt;span class="nv"&gt;open&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;gnome-open&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>DraftPadからRemember The Milkにタスク追加</title><link>https://genzouw.com/entry/2012/01/13/011006/168/</link><pubDate>Fri, 13 Jan 2012 01:10:06 +0900</pubDate><guid>https://genzouw.com/entry/2012/01/13/011006/168/</guid><description>&lt;p&gt;最近&lt;a href="http://www.google.com/search?q=DraftPad&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;google:DraftPad&lt;/a&gt;の存在を知って、メール送信からブログ投稿からメモからなにからなにまでこれでやれるんじゃないかと思ってきていた。&lt;br&gt;&#10;DraftPadのみそであるアシスト機能を自分でつくってみたいなと思い、&lt;a href="http://www.google.com/search?q=Remember%20The%20Milk&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;google:Remember The Milk&lt;/a&gt;にタスクを登録するためのアシストを作ってみた。&lt;br&gt;&#10;&lt;strong&gt;以降、&lt;a href="http://www.google.com/search?q=Remember%20The%20Milk&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;google:Remember The Milk&lt;/a&gt;を&lt;a href="http://d.hatena.ne.jp/keyword/rtm" class="keyword"&gt;rtm&lt;/a&gt;と省略する&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="サンプル画面"&gt;サンプル画面&lt;/h3&gt;&#10;&lt;p&gt;&lt;span itemscope="" itemtype="http://schema.org/Photograph"&gt;&lt;a href="http://f.hatena.ne.jp/genzouw/20120113003152" class="hatena-fotolife" itemprop="url"&gt;&lt;img src="http://cdn-ak.f.st-hatena.com/images/fotolife/g/genzouw/20120113/20120113003152.png" title="f:id:genzouw:20120113003152p:image:w240" class="hatena-fotolife" style="width:240px" itemprop="image" alt="f:id:genzouw:20120113003152p:image:w240" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;以下のアシストを順番に実行すればタスクの追加が可能&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/keyword/rtm" class="keyword"&gt;rtm&lt;/a&gt; &amp;gt; new&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/keyword/rtm" class="keyword"&gt;rtm&lt;/a&gt; &amp;gt; insert&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="タスクの作成rtm--new"&gt;タスクの作成「&lt;a href="http://d.hatena.ne.jp/keyword/rtm" class="keyword"&gt;rtm&lt;/a&gt; &amp;gt; new」&lt;/h3&gt;&#10;&lt;p&gt;以下のようなアシストを登録する。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;タイトル&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;「&lt;a href="http://d.hatena.ne.jp/keyword/rtm" class="keyword"&gt;rtm&lt;/a&gt; &amp;gt; new」&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;URL&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;draftpad://self/urldecode?text=%0AList%3A%0ATags%3A%0ADue%3A%0APriority%3A%0AURL%3A%0ARepeat%3A%0AEstimate%3A&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Option&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Clean All&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;span itemscope="" itemtype="http://schema.org/Photograph"&gt;&lt;a href="http://f.hatena.ne.jp/genzouw/20120113003153" class="hatena-fotolife" itemprop="url"&gt;&lt;img src="http://cdn-ak.f.st-hatena.com/images/fotolife/g/genzouw/20120113/20120113003153.png" title="f:id:genzouw:20120113003153p:image:w240" class="hatena-fotolife" style="width:240px" itemprop="image" alt="f:id:genzouw:20120113003153p:image:w240" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;これを実行すると、&lt;a href="http://d.hatena.ne.jp/keyword/rtm" class="keyword"&gt;rtm&lt;/a&gt;で登録するタスクのプロパティ一覧が表示される。&lt;br&gt;&#10;一行目は空になっているが、ここにはタスク名を入力。それ以外はタスクのプロパティを設定する。&lt;br&gt;&#10;プロパティ一覧の詳細は以下のサイトの&lt;strong&gt;メール記述方法&lt;/strong&gt;を参照&lt;br&gt;&#10;&lt;a href="http://gihyo.jp/lifestyle/serial/01/rtm/0007?page=2"&gt;第7回 いろんな方法でタスクを登録する：これなら毎日できるタスク管理 1から学ぶRemember The Milk｜gihyo.jp … 技術評論社&lt;/a&gt;&lt;br&gt;&#10;&lt;span itemscope="" itemtype="http://schema.org/Photograph"&gt;&lt;a href="http://f.hatena.ne.jp/genzouw/20120113003154" class="hatena-fotolife" itemprop="url"&gt;&lt;img src="http://cdn-ak.f.st-hatena.com/images/fotolife/g/genzouw/20120113/20120113003154.png" title="f:id:genzouw:20120113003154p:image:w240" class="hatena-fotolife" style="width:240px" itemprop="image" alt="f:id:genzouw:20120113003154p:image:w240" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;タスクの作成後は、そのまま次のアシストを実行する。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="タスクの登録rtm--insert"&gt;タスクの登録「&lt;a href="http://d.hatena.ne.jp/keyword/rtm" class="keyword"&gt;rtm&lt;/a&gt; &amp;gt; insert」&lt;/h3&gt;&#10;&lt;p&gt;以下のようなアシストを登録する。&lt;br&gt;&#10;&lt;strong&gt;xxxxx、yyyyyは、各自の&lt;a href="http://d.hatena.ne.jp/keyword/rtm" class="keyword"&gt;rtm&lt;/a&gt;の設定をもとに書き換えてください。&lt;a href="http://d.hatena.ne.jp/keyword/rtm" class="keyword"&gt;rtm&lt;/a&gt;のタスクをメールで登録する方法を参照。&lt;/strong&gt;&lt;br&gt;&#10;&lt;a href="http://kengo.preston-net.com/archives/002759.shtml"&gt;Going My Way: メールでタスクリストをRemember The Milkに追加する方法&lt;/a&gt;&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;タイトル&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;「&lt;a href="http://d.hatena.ne.jp/keyword/rtm" class="keyword"&gt;rtm&lt;/a&gt; &amp;gt; insert」&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;URL&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;mailto:?to=xxxxx+yyyyy@rmilk.com&amp;amp;subject=&amp;lt;@L1&amp;gt;&amp;amp;body=&amp;lt;@L2~&amp;gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Option&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;None&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;span itemscope="" itemtype="http://schema.org/Photograph"&gt;&lt;a href="http://f.hatena.ne.jp/genzouw/20120113003155" class="hatena-fotolife" itemprop="url"&gt;&lt;img src="http://cdn-ak.f.st-hatena.com/images/fotolife/g/genzouw/20120113/20120113003155.jpg" title="f:id:genzouw:20120113003155j:image:w240" class="hatena-fotolife" style="width:240px" itemprop="image" alt="f:id:genzouw:20120113003155j:image:w240" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;これを実行すれば、&lt;a href="http://d.hatena.ne.jp/keyword/rtm" class="keyword"&gt;rtm&lt;/a&gt;にタスクが登録される。&lt;br&gt;&#10;URLは不要なプロパティを消してみたり、固定の値を埋め込んだりすればより迅速にタスクの追加が可能になる。&lt;/p&gt;&#10;&lt;/div&gt;</description></item><item><title>リニューアル</title><link>https://genzouw.com/entry/2012/01/12/014152/169/</link><pubDate>Thu, 12 Jan 2012 01:41:52 +0900</pubDate><guid>https://genzouw.com/entry/2012/01/12/014152/169/</guid><description>&lt;p&gt;リニューアルしました。&lt;br&gt;&#10;といっても多少デザインを変えただけですが。&lt;br&gt;&#10;今後共よろしくお願い致します。&lt;/p&gt;</description></item><item><title>fat jar作成後にInvalidsignaturefileがどうのこうの言われる時の対処</title><link>https://genzouw.com/entry/2012/01/11/014957/170/</link><pubDate>Wed, 11 Jan 2012 01:49:57 +0900</pubDate><guid>https://genzouw.com/entry/2012/01/11/014957/170/</guid><description>&lt;p&gt;既存の&lt;a href="http://d.hatena.ne.jp/keyword/Java" class="keyword"&gt;Java&lt;/a&gt;プロジェクトから、&lt;a href="http://www.google.com/search?q=Gradle%5D%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%A6%5Bgoogle%3Afat%20jar&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;google:Gradle]を利用して[google:fat jar&lt;/a&gt;を作成してみた。&lt;br&gt;&#10;&lt;a href="http://docs.codehaus.org/display/GRADLE/Cookbook#Cookbook-Creatingafatjar"&gt;Cookbook - Gradle - Codehaus&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;ただし、&lt;a href="http://d.hatena.ne.jp/keyword/swt" class="keyword"&gt;swt&lt;/a&gt;関連のjarを含めたfat jarを実行すると以下のようなエラーが発生する場合がある。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Exception in thread &amp;#34;main&amp;#34; java.lang.SecurityException: Invalid signature file d&#10;igest for Manifest main attributes&#10;at sun.security.util.SignatureFileVerifier.processImpl(Unknown Source)&#10;at sun.security.util.SignatureFileVerifier.process(Unknown Source)&#10;at java.util.jar.JarVerifier.processEntry(Unknown Source)&#10;at java.util.jar.JarVerifier.update(Unknown Source)&#10;at java.util.jar.JarFile.initializeVerifier(Unknown Source)&#10;at java.util.jar.JarFile.getInputStream(Unknown Source)&#10;at sun.misc.URLClassPath$JarLoader$2.getInputStream(Unknown Source)&#10;at sun.misc.Resource.cachedInputStream(Unknown Source)&#10;at sun.misc.Resource.getByteBuffer(Unknown Source)&#10;at java.net.URLClassLoader.defineClass(Unknown Source)&#10;at java.net.URLClassLoader.access$000(Unknown Source)&#10;at java.net.URLClassLoader$1.run(Unknown Source)&#10;at java.security.AccessController.doPrivileged(Native Method)&#10;at java.net.URLClassLoader.findClass(Unknown Source)&#10;at java.lang.ClassLoader.loadClass(Unknown Source)&#10;at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)&#10;at java.lang.ClassLoader.loadClass(Unknown Source)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;以下のようにbuild.gradleの一部に不要ファイルを除去する設定を追記することで解決する。&lt;/p&gt;</description></item><item><title>Groovyでもよくコマンド作るよね？（え？起動が遅い？）</title><link>https://genzouw.com/entry/2012/01/05/235515/171/</link><pubDate>Thu, 05 Jan 2012 23:55:15 +0900</pubDate><guid>https://genzouw.com/entry/2012/01/05/235515/171/</guid><description>&lt;p&gt;以下のサイトでは&lt;a href="http://d.hatena.ne.jp/keyword/ruby" class="keyword"&gt;ruby&lt;/a&gt;でやっていたが、Groovyで同じことをしてみる。&lt;br&gt;&#10;&lt;a href="http://d.hatena.ne.jp/takuya_1st/20111224/1324752960"&gt;URIのエンコードをコマンドにしていつでも呼べるようにしておくと便利だと思う。 - それマグで！&lt;/a&gt;&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="encodeuri"&gt;encodeuri&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;URLEncoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="decodeuri"&gt;decodeuri&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;URLDecoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="使い方"&gt;使い方&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;genzou@genzou--desktop-work:/tmp/work$ echo http://java.sun.com/javase/ja/6/docs/ja/api/java/net/URLEncoder.html | ./encodeuri&#10;http%3A%2F%2Fjava.sun.com%2Fjavase%2Fja%2F6%2Fdocs%2Fja%2Fapi%2Fjava%2Fnet%2FURLEncoder.html%0A&#10;genzou@genzou--desktop-work:/tmp/work$ echo http://java.sun.com/javase/ja/6/docs/ja/api/java/net/URLEncoder.html | ./encodeuri | ./decodeuri&#10;http://java.sun.com/javase/ja/6/docs/ja/api/java/net/URLEncoder.html&#10;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>FC2ブログのユーザー情報を取得（GroovyでXML-RPC）</title><link>https://genzouw.com/entry/2011/12/27/004254/172/</link><pubDate>Tue, 27 Dec 2011 00:42:54 +0900</pubDate><guid>https://genzouw.com/entry/2011/12/27/004254/172/</guid><description>&lt;p&gt;以下のエントリで一生懸命 &lt;strong&gt;XML-RPC&lt;/strong&gt; による通信方法を実現してみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2011/12/25/002616"&gt;FC2ブログへの投稿を行う&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ところが、実は &lt;strong&gt;「Groovy」&lt;/strong&gt; に便利なライブラリがあり、それを使うともっと簡単に実装できることがわかりました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://groovy.codehaus.org/XMLRPC"&gt;Groovy - XMLRPC&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;FC2ブログのユーザー情報を取得するサンプルコードは以下の通りです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;groovy:groovy-xmlrpc:0.3&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;groovy.net.xmlrpc.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XMLRPCServerProxy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://blog.fc2.com/xmlrpc.php&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// FC2ブログでは、tokenは特に必要がないためブランク&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;てきとうなユーザーIDにかえてください&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;てきとうなパスワードにかえてください&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blogger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getUserInfo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すごいと思ったのは &lt;code&gt;client&lt;/code&gt; 変数に対して、 &lt;strong&gt;XML-RPC&lt;/strong&gt; の &lt;strong&gt;blogger.getUserInfo&lt;/strong&gt; というAPIをあたかもメソッドのように呼び出せるところ。&lt;/p&gt;&#10;&lt;p&gt;ちなみに &lt;strong&gt;XML-RPC&lt;/strong&gt; というのはFC2だけではなく、あのMovable Typeでも利用されている通信方法のようですね。&lt;/p&gt;</description></item><item><title>FC2ブログへの投稿を行う</title><link>https://genzouw.com/entry/2011/12/25/002616/173/</link><pubDate>Sun, 25 Dec 2011 00:26:16 +0900</pubDate><guid>https://genzouw.com/entry/2011/12/25/002616/173/</guid><description>&lt;p&gt;以下のサイトを参考にさせていただきました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://morado106.blog106.fc2.com/?mode=m&amp;amp;no=65"&gt;公開日誌 [Java] XML-RPCを使ってFC2にブログを投稿&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="fc2samplegroovy"&gt;Fc2Sample.groovy&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.xmlrpc:xmlrpc-client:*&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.xmlrpc.client.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;XmlRpcClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XmlRpcClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XmlRpcClientConfigImpl&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;serverURL:&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://blog.fc2.com/xmlrpc.php&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;userId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;てきとうなユーザーIDにかえてください&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;てきとうなパスワードにかえてください&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// blogId&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;タイトルです&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;本文です&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 本文中の改行をbrタグで反映&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mt_convert_breaks&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// コメントを受け付けるか&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mt_allow_comments&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// トラックバックを受け付けるか&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mt_allow_pings&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;mt_text_more&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;続きを読むの部分です&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// publish(trueで公開, falseで下書)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;metaWeblog.newPost&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 新規投稿した記事番号が返る&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;記事番号：&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;です。&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Grab&lt;/strong&gt; を使って、実行時に自動的に依存ライブラリ(Jarファイル群)を取得してくれるようになっています。&#10;そのため、当スクリプトファイルだけで完結して動作します。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;FC2ブログ&lt;/strong&gt; や &lt;strong&gt;MovableType&lt;/strong&gt; では、&lt;a href="https://ja.wikipedia.org/wiki/XML-RPC"&gt;XML-RPC&lt;/a&gt; という方式で記事の投稿が可能となっています。&lt;/p&gt;</description></item><item><title>GroovyでSQLiteを使ってみる</title><link>https://genzouw.com/entry/2011/11/23/015516/174/</link><pubDate>Wed, 23 Nov 2011 01:55:16 +0900</pubDate><guid>https://genzouw.com/entry/2011/11/23/015516/174/</guid><description>&lt;p&gt;クライアントアプリやjettyで動かすようなローカルアプリの場合には、軽量で小さなDBが欲しくなる。SQLiteが使えるとかなり便利。&lt;/p&gt;&#10;&lt;p&gt;GroovyでSQLiteを使うサンプルを作成してみた。emailテーブルを作成し、データを３レコードセット。&lt;/p&gt;&#10;&lt;p&gt;それを出力する例。&lt;/p&gt;&#10;&lt;h2 id="sqlitegroovy"&gt;sqlite.groovy&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@GrabConfig&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;systemClassLoader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.xerial:sqlite-jdbc:3.7.2&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;groovy.sql.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;dbfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./sqlite.db&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;jdbc:sqlite:${dbfile.name}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.sqlite.JDBC&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;gsql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;url&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dbfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gsql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;create table mails (&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; id integer primary key, subject text,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; body text&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;times&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gsql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;insert into mails (id, subject, body)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;values&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; (&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; ${i + 1}, &amp;#39;件名${i + 1}&amp;#39;, &amp;#39;本文${i + 1}&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; )&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;gsql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;eachRow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;SELECT&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; id,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; subject,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; body&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;FROM&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; mails&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;ORDER BY&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; id&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;id:${row.id}, subject:${row.subject}, body:${row.body}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Groovy(Java)でブラウザ起動を自動化する</title><link>https://genzouw.com/entry/2011/11/21/000346/175/</link><pubDate>Mon, 21 Nov 2011 00:03:46 +0900</pubDate><guid>https://genzouw.com/entry/2011/11/21/000346/175/</guid><description>&lt;p&gt;前回OAuth実装のエントリでこねくり回して頑張ってブラウザ起動していたけど、起動したブラウザを停止する必要さ得なければ以下の方法で実現可能みたい。（あんまり使わないので、かなり前にチラ見していたけど頭から抜けていた）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;awt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Desktop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;desktop&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;browse&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://google.com&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>Groovy(Java)でアプリケーションの二重起動を禁止する方法</title><link>https://genzouw.com/entry/2011/11/19/173827/176/</link><pubDate>Sat, 19 Nov 2011 17:38:27 +0900</pubDate><guid>https://genzouw.com/entry/2011/11/19/173827/176/</guid><description>&lt;p&gt;Groovyに限ったことではないが、アプリケーションの二重起動を防止する方法をメモ。&lt;/p&gt;&#10;&lt;p&gt;以下のように、ファイルチャネルからロック取得が成功するかどうかで二重起動を防止できる。&lt;/p&gt;&#10;&lt;p&gt;Attach &lt;a href="http://d.hatena.ne.jp/keyword/API"&gt;API&lt;/a&gt;( &lt;a href="http://java.sun.com/javase/ja/6/docs/ja/jdk/api/attach/spec/overview-summary.html"&gt;Oracle Technology Network for Java Developers&lt;/a&gt; )というのを利用しても実現できるらしいが、IcedTea、&lt;a href="http://d.hatena.ne.jp/keyword/Linux"&gt;Linux&lt;/a&gt;の&lt;a href="http://d.hatena.ne.jp/keyword/jdk"&gt;jdk&lt;/a&gt;のいずれにも標準装備されていないようなので断念した。（ClassNotFountExceptionが発生）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.nio.channels.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Lock&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;getLock&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;FileOutputStream&lt;/span&gt; &lt;span class="n"&gt;fos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FileOutputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;lock&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;FileChannel&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;channel&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;FileLock&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tryLock&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addShutdownHook&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;valid&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;release&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fos&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Thread&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ここからはLockクラスを利用した二重起動チェック処理&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;Lock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getLock&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;end&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exit&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 安心して処理を実行♪&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;Lock#getLock()&lt;/code&gt; メソッド実行結果が &lt;strong&gt;true&lt;/strong&gt; ならロック取得成功、 &lt;strong&gt;false&lt;/strong&gt; ならロック取得失敗となる。&#10;上記スクリプトを２つ以上起動させようとしても後で起動した方が異常終了するようになる。&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>textArea(JTextArea)で、タブによるフォーカス移動を実現したいとき</title><link>https://genzouw.com/entry/2011/11/18/231123/177/</link><pubDate>Fri, 18 Nov 2011 23:11:23 +0900</pubDate><guid>https://genzouw.com/entry/2011/11/18/231123/177/</guid><description>&lt;p&gt;以下のようにkeyPressedイベントを設定する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;text:&lt;/span&gt;&lt;span class="n"&gt;bind&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;statusMessageBody&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;target:&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;mutual:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;rows:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;dragEnabled:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;keyPressed:&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keyCode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;KeyEvent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;VK_TAB&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;modifiers&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;transferFocusBackward&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;transferFocus&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;consume&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SwingのJTextAreaは、タブによるフォーカス移動をしたい場合には&lt;strong&gt;Ctrl+Tab&lt;/strong&gt;、&lt;strong&gt;Ctrl+Shift+Tab&lt;/strong&gt;を入力しなければならない。&lt;/p&gt;&#10;&lt;p&gt;UI上では&lt;strong&gt;Tab&lt;/strong&gt;、&lt;strong&gt;Shift+Tab&lt;/strong&gt;でタブ移動可能な先入観があるが、これはおそらくブラウザ上での操作性に基づいているのだと思う。&lt;br&gt;&#10;それだけ近年のブラウザの操作性が普及している証拠なのだ。&lt;/p&gt;</description></item><item><title>windows用の実行ファイル（exe）を簡単に作成</title><link>https://genzouw.com/entry/2011/11/17/014718/178/</link><pubDate>Thu, 17 Nov 2011 01:47:18 +0900</pubDate><guid>https://genzouw.com/entry/2011/11/17/014718/178/</guid><description>&lt;p&gt;実行可能jarや&lt;a href="http://d.hatena.ne.jp/keyword/jnlp" class="keyword"&gt;jnlp&lt;/a&gt;で配布、というのでよい気がするが、ウィンドウズを使っている方々の中にはlhacaなんかでjarファイルを展開対象ファイルとして関連付けしている方もいるようだ。なのでexe形式にできると便利。&lt;/p&gt;&#10;&lt;p&gt;griffonではプラグインで簡単に実現できた。&lt;/p&gt;&#10;&lt;p&gt;仮に&lt;strong&gt;winapp&lt;/strong&gt;というプロジェクトで試してみる。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="プロジェクト作成"&gt;プロジェクト作成&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# プロジェクト作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ griffon create-app winapp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; winapp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# installerプラグインをインストール&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ griffon install-plugin installer&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 準備&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ griffon prepare-windows&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# exe化&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ griffon create-windows&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ll dist/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxrwx--- &lt;span class="m"&gt;5&lt;/span&gt; genzou 4.0K 2011-11-17 01:45 windows/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ll dist/windows&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxrwx--- &lt;span class="m"&gt;2&lt;/span&gt; genzou 4.0K 2011-11-17 01:45 bin/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxrwx--- &lt;span class="m"&gt;2&lt;/span&gt; genzou 4.0K 2011-11-17 01:45 icons/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;drwxrwx--- &lt;span class="m"&gt;3&lt;/span&gt; genzou 4.0K 2011-11-17 01:45 lib/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-rw---- &lt;span class="m"&gt;1&lt;/span&gt; genzou 340K 2011-11-17 01:45 msvcr71.dll&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-rw---- &lt;span class="m"&gt;1&lt;/span&gt; genzou 603K 2011-11-17 01:45 winapp.exe&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-rw---- &lt;span class="m"&gt;1&lt;/span&gt; genzou 195K 2011-11-17 01:45 griffon.icns&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-rw---- &lt;span class="m"&gt;1&lt;/span&gt; genzou 195K 2011-11-17 01:45 winapp.icns&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;-rw-rw---- &lt;span class="m"&gt;1&lt;/span&gt; genzou 13M 2011-11-17 01:45 winapp-windows-0.1.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;winapp.exeを実行すれば&lt;a href="http://d.hatena.ne.jp/keyword/GUI" class="keyword"&gt;GUI&lt;/a&gt;アプリが起動する。&lt;br&gt;&#10;簡単にできた。&lt;/p&gt;</description></item><item><title>ルパンっぽいもの</title><link>https://genzouw.com/entry/2011/11/11/223752/179/</link><pubDate>Fri, 11 Nov 2011 22:37:52 +0900</pubDate><guid>https://genzouw.com/entry/2011/11/11/223752/179/</guid><description>&lt;p&gt;コマンドラインでルパンっぽいもの。&lt;br&gt;&#10;ふっと頭に浮かんだので息抜きで作ってみた。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="lupangroovy"&gt;lupan.groovy&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;z&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;\b&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のように実行すれば、ちょっとだけ幸せになれます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy ./lupan.groovy &lt;span class="s2"&gt;&amp;#34;genzouw&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./lupan.groovy &lt;span class="s2"&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description></item><item><title>JsonSlurperを使ってfacebook内のいいね！をクリック</title><link>https://genzouw.com/entry/2011/11/11/011535/180/</link><pubDate>Fri, 11 Nov 2011 01:15:35 +0900</pubDate><guid>https://genzouw.com/entry/2011/11/11/011535/180/</guid><description>&lt;p&gt;悪用厳禁で。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;groovy.json.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;facebookApi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;baseurl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://graph.facebook.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;jsonSlurper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JsonSlurper&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[:]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;jsonSlurper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;baseurl&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;?&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;([&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;post&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[:]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baseurl&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;baseurl&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;openConnection&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;doOutput&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;setRequestProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;JsonSlurper&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;setRequestProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Accept-Language&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ja&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;outputStream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withWriter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;([&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;inputStream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withReader&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;result&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;nameKeyword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;me&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;facebookApi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/me&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;facebookApi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/me/friends&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nameKeyword&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;feeds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;facebookApi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/${id}/feed&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;feeds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;likes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;facebookApi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/${it.id}/likes&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;likes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;created_time&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;()-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;yyyy-MM-dd&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;created_time&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;facebookApi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/${feed.id}/likes&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--------------------------------------------------&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&#10;第一引数にフレンドの名前を指定。&lt;br&gt;&#10;それを含むフレンドの２日前までのフィードに一括で**いいね！&lt;strong&gt;します。&lt;br&gt;&#10;すでに&lt;/strong&gt;いいね！**しているものにはなにもしません。&lt;br&gt;&#10;最後のpostでいいね！している。&lt;/p&gt;&#10;&lt;p&gt;\&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/facebook" class="keyword"&gt;facebook&lt;/a&gt;や&lt;a href="http://d.hatena.ne.jp/keyword/twitter" class="keyword"&gt;twitter&lt;/a&gt;はkeyword:restな作りになってるんだね。&lt;br&gt;&#10;取得=get、登録・更新=post、削除=deleteにてHTTPのリクエスト投げると。&lt;/p&gt;&#10;&lt;p&gt;\&lt;/p&gt;&#10;&lt;p&gt;urlの形式は、オブジェクト#メソッドの関係に似ている。&lt;br&gt;&#10;getリクエストで me/friends にアクセスすれば、自分のフレンド情報を取得。（パラメータでidはいる。）&lt;br&gt;&#10;deleteリクエストで ${feedId}/likes にアクセスすれば、${feedId}に関するいいね！を取り消せる。&lt;/p&gt;</description></item><item><title>JsonSlurperを使ってfacebook内のいいね！してないフィードを一覧表示</title><link>https://genzouw.com/entry/2011/11/09/011706/181/</link><pubDate>Wed, 09 Nov 2011 01:17:06 +0900</pubDate><guid>https://genzouw.com/entry/2011/11/09/011706/181/</guid><description>&lt;p&gt;JsonSlurperかなりいい！調子にのっていろいろやってみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;groovy.json.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;slurper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JsonSlurper&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;slurper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;define&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;baseurl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://graph.facebook.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;getJson&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;baseurl&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;?&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;([&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;me&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;slurper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getJson&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/me&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;friends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;slurper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getJson&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/me/friends&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;friends&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;feeds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;slurper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getJson&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/${id}/feed&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;feeds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;likes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;slurper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getJson&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/${it.id}/likes&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;likes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;photo&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;message&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;created_time&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;println&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;actions&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Like&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;}?.&lt;/span&gt;&lt;span class="na"&gt;link&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;--------------------------------------------------&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ミソは&lt;a href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9" class="keyword"&gt;インスタンス&lt;/a&gt;にdefineしてメソッド追加している点ぐらいかな。&lt;br&gt;&#10;あとは JsonSlurper 使ってる点。&lt;/p&gt;</description></item><item><title>JsonSlurperを使ってFacebook APIを呼び出す</title><link>https://genzouw.com/entry/2011/11/09/000740/182/</link><pubDate>Wed, 09 Nov 2011 00:07:40 +0900</pubDate><guid>https://genzouw.com/entry/2011/11/09/000740/182/</guid><description>&lt;p&gt;restfb( &lt;a href="http://restfb.com/javadoc/index.html"&gt;RestFB&lt;/a&gt; )を使ってのFacebook API呼び出しをいろいろ調べたが、先日Groovyの合宿Twitterにリモート接続しているときにJsonSluperなるものの存在を知って、これを利用したほうが簡単なんじゃないかと思ったので試してみた。&lt;/p&gt;&#10;&lt;p&gt;フレンド名一覧を取得してみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;baseurl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://graph.facebook.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;slurper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;JsonSlurper&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;slurper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baseurl&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/me/friends?&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;accessToken&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)).&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${it.name} (id:${it.id})&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;毎度のことながら、accessToken変数部分にはfacebookから取得した自分の正しいアクセストークン値を設定。&lt;/p&gt;&#10;&lt;p&gt;結果は以下のとおり。（取得された名前のアルファベットやidはマスキングしています）&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Aaaaaaaaa Aaaaaa (id:999999999)&#10;Aaaaaaaa Aaa (id:999999999)&#10;Aaaaaaaa Aaaaaaaaa (id:9999999999)&#10;Aaaaa Aaaa (id:9999999999)&#10;Aaaaaa Aaaaaa (id:9999999999)&#10;Aaaa Aaaaaa (id:999999999999999)&#10;Aaaaaa Aaaaaaa (id:999999999999999)&#10;Aaaaaa Aaaaaa (id:999999999999999)&#10;Aaaaaaaa Aaaaaaa (id:999999999999999)&#10;Aaaaaaaa Aaa (id:999999999999999)&#10;Aaaaaaaaa Aaaaaa (id:999999999999999)&#10;Aaaaaaaa Aaaaaa (id:999999999999999)&#10;Aaa Aaaaaa (id:999999999999999)&#10;Aaaaa Aaaa (id:999999999999999)&#10;Aaaa Aa (id:999999999999999)&#10;Aaaaaa Aaaaaa (id:999999999999999)&#10;Aaaaaa Aaaaaa (id:999999999999999)&#10;Aaaaaa Aaaaaa (id:999999999999999)&#10;Aaaaaa Aaaa (id:999999999999999)&#10;Aaa-aaaa Aaaaaaaa (id:999999999999999)&#10;Aaaaaa Aaaaaaaa (id:999999999999999)&#10;Aaaaa Aaaa (id:999999999999999)&#10;Aaaaaa Aaaaaaaa (id:999999999999999)&#10;Aaaaa Aaaaaaa (id:999999999999999)&#10;Aaaaaaa Aaaaaaaa (id:999999999999999)&#10;Aaaa Aaaaaa (id:999999999999999)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;なんかJsonSlurper使った方が簡単な気がした。&lt;/p&gt;</description></item><item><title>Groovyでfacebookへ近況書き込み</title><link>https://genzouw.com/entry/2011/11/02/005817/183/</link><pubDate>Wed, 02 Nov 2011 00:58:17 +0900</pubDate><guid>https://genzouw.com/entry/2011/11/02/005817/183/</guid><description>&lt;p&gt;先日成功した&lt;a href="http://d.hatena.ne.jp/keyword/facebook" class="keyword"&gt;facebook&lt;/a&gt;のOAuth2.0認証方式をクラス化した。&lt;/p&gt;&#10;&lt;p&gt;クラスと使用例をあげる。&lt;br&gt;&#10;&lt;strong&gt;OAuth2.0認証にて取得したアクセストークンさえあれば、restfbライブラリを利用して&lt;a href="http://d.hatena.ne.jp/keyword/facebook" class="keyword"&gt;facebook&lt;/a&gt;に自由にアクセスできる。&lt;/strong&gt;&lt;br&gt;&#10;&lt;a href="http://restfb.com/"&gt;RestFB - A Lightweight Java Facebook Graph API and Old REST API Client&lt;/a&gt;&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="facebookoauthgroovy"&gt;FacebookOauth.Groovy&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.mortbay.jetty:jetty-embedded:6.1.26&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.lang.reflect.InvocationTargetException&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.lang.reflect.Method&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.servlet.http.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.servlet.ServletException&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Connector&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Handler&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.handler.AbstractHandler&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Request&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Server&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FacebookOauth&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;appId&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;localHost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;localPort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9999&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;scopeList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;expiresIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;accessTokenFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;access_token.txt&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;accessTokenFile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;accessTokenFile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;accessTokenFile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accessToken&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;appId&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;localHost&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;localPort&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;accessToken&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;expiresIn&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;scopeList&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;scopeList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;empty&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;urltext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://www.facebook.com/dialog/oauth?&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;client_id=${appId}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;redirect_uri=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;URLEncoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://${localHost}:${localPort}/login_success.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;scope=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;URLEncoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scopeList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;response_type=token&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;os.name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="s"&gt;/^Mac OS/&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Class&lt;/span&gt; &lt;span class="n"&gt;fileMgr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;com.apple.eio.FileManager&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Method&lt;/span&gt; &lt;span class="n"&gt;openURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fileMgr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDeclaredMethod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;openURL&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;openURL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;invoke&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="s"&gt;/^Windows/&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rundll32 url.dll,FileProtocolHandler &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;enableBrowser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;firefox&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;opera&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;konqueror&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;epiphany&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mozilla&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;netscape&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;which&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]).&lt;/span&gt;&lt;span class="na"&gt;waitFor&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;enableBrowser&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NoSuchMethodException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Could not find web browser&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;enableBrowser&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; ${url}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}(&lt;/span&gt;&lt;span class="n"&gt;urltext&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;localPort&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;connectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${localHost}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;handle:&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpServletRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpServletResponse&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;dispatch&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/login_success.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HttpServletResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SC_OK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withWriter&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;html&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;head&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;script type=&amp;#39;text/javascript&amp;#39;&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;function init() {&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; window.location = &amp;#39;http://localhost:9999/access_token.html?&amp;#39; + window.location.toString().split(&amp;#39;#&amp;#39;)[1];&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;/script&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;/head&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;body onload=\&amp;#34;init();\&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;/body&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;/html&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/access_token.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;synchronized&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getParameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;expiresIn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getParameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;expires_in&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;handled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HttpServletResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SC_NOT_FOUND&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;AbstractHandler&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;destroy&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accessToken&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="examplegroovy"&gt;Example.groovy&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;com.restfb:restfb:1.6.9&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.restfb.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.restfb.types.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FacebookOauth&lt;/span&gt; &lt;span class="n"&gt;oauth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FacebookOauth&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;appId:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;XXXXXXXXXX&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// acebookに登録したアプリケーションのIDを設定&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;scopeList:&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="c1"&gt;// スコープの設定を配列で列挙。必要なら権限を追加する。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;read_stream&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;friends_about_me&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;read_friendlists&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;user_about_me&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;publish_stream&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;offline_access&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;create_event&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// その他、認証開始のためのローカルサーバー用設定値（localHost、localPort）や&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// アクセストークン保存ファイル（accessTokenFile）などのプロパティも設定可能&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 今回はデフォルトのまま使用。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// loadすれば、以前取得したトークンがあればそれを利用しfacebookと通信する。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;oauth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// loadしてもトークンがからだった場合（=初めての認証）、認証手続きにてアクセストークン取得&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FacebookClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultFacebookClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oauth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="n"&gt;oauth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 今後も利用したい場合、アクセストークンを保存&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;oauth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;times&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FacebookType&lt;/span&gt; &lt;span class="n"&gt;publishMessageResponse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;publish&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;me/feed&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;FacebookType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Parameter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ゲンゾウ時計：&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;yyyy/MM/dd HH:mm:ss&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&#10;近況報告を５秒ごとに登録してみた。&lt;/p&gt;</description></item><item><title>FacebookにGroovyでログイン（その４）</title><link>https://genzouw.com/entry/2011/11/01/002610/184/</link><pubDate>Tue, 01 Nov 2011 00:26:10 +0900</pubDate><guid>https://genzouw.com/entry/2011/11/01/002610/184/</guid><description>&lt;p&gt;以下のエントリのさらに続きです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2011/10/31/001944"&gt;FacebookにGroovyでログイン（その３）&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;結局、&lt;a href="https://genzouw.com/entry/2011/10/31/001944"&gt;昨日の方式&lt;/a&gt;を採用しました。&#10;リダイレクト後の &lt;code&gt;http://localhost:9999/#access_token=...&lt;/code&gt; の &lt;code&gt;#&lt;/code&gt; 以降をサーバーで取得できないため、画面描画後にJavaScriptで &lt;strong&gt;?&lt;/strong&gt; に置き換え再リクエストするようにしてみました。&lt;/p&gt;&#10;&lt;p&gt;結果、アクセストークンが取得できました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.mortbay.jetty:jetty-embedded:6.1.26&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.lang.reflect.InvocationTargetException&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.lang.reflect.Method&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.servlet.http.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.servlet.ServletException&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Connector&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Handler&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.handler.AbstractHandler&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Request&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Server&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;appId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;XXXXXXXXXXXXXXX&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;localHost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;localPort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9999&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;urlText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://www.facebook.com/dialog/oauth?&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;client_id=${appId}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;redirect_uri=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;URLEncoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://${localHost}:${localPort}/login_success.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;scope=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;URLEncoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;email,read_stream,friends_about_me,user_about_me&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;response_type=token&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;browse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urlText&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;localPort&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;connectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${localHost}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;handle:&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpServletRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpServletResponse&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;dispatch&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/login_success.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HttpServletResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SC_OK&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;contentType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text/html&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withWriter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;html&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;head&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;script type=&amp;#39;text/javascript&amp;#39;&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;function init() {&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; window.location = &amp;#39;http://localhost:9999/access_token.html?&amp;#39; + window.location.toString().split(&amp;#39;#&amp;#39;)[1];&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;/script&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;/head&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;body onload=\&amp;#34;init();\&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;/body&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;lt;/html&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;handled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/access_token.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getParameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getParameter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;expires_in&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;handled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;destroy&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HttpServletResponse&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SC_NOT_FOUND&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;AbstractHandler&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;browse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;ClassNotFoundException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IllegalAccessException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterruptedException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InvocationTargetException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;NoSuchMethodException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;osName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;os.name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;osName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mac OS&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Class&lt;/span&gt; &lt;span class="n"&gt;fileMgr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;com.apple.eio.FileManager&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Method&lt;/span&gt; &lt;span class="n"&gt;openURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fileMgr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDeclaredMethod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;openURL&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;openURL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;invoke&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;osName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Windows&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rundll32 url.dll,FileProtocolHandler &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;firefox&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;opera&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;konqueror&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;epiphany&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mozilla&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;netscape&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;which&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]).&lt;/span&gt;&lt;span class="na"&gt;waitFor&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NoSuchMethodException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Could not find web browser&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; ${url}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Facebookのアプリケーション設定画面の &lt;strong&gt;サイトURL&lt;/strong&gt; 入力欄には、昨日の設定から以下の入力に変更しました。&lt;/p&gt;</description></item><item><title>FacebookにGroovyでログイン（その３）</title><link>https://genzouw.com/entry/2011/10/31/001944/185/</link><pubDate>Mon, 31 Oct 2011 00:19:44 +0900</pubDate><guid>https://genzouw.com/entry/2011/10/31/001944/185/</guid><description>&lt;p&gt;以下のエントリのさらに続き。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2011/10/29/011857"&gt;FacebookにGroovyでログイン（その２）&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;結局、以下の流れでアクセスキーを取得してみることにしました。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Jettyを起動&lt;/li&gt;&#10;&lt;li&gt;ブラウザを起動&lt;/li&gt;&#10;&lt;li&gt;ブラウザでFacebookに手動でログイン&lt;/li&gt;&#10;&lt;li&gt;リダイレクト結果より、アクセスキー取得&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.mortbay.jetty:jetty-embedded:6.1.26&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.lang.reflect.InvocationTargetException&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.lang.reflect.Method&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.servlet.ServletException&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.servlet.http.HttpServletRequest&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.servlet.http.HttpServletResponse&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Connector&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Handler&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Request&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.Server&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mortbay.jetty.handler.AbstractHandler&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;appId&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;XXXXXXXXXXXXXXX&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;localHost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;localhost&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;localPort&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9999&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;urlText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://www.facebook.com/dialog/oauth?&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;client_id=${appId}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;redirect_uri=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;URLEncoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://${localHost}:${localPort}/&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;scope=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;URLEncoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;email,read_stream,friends_about_me,user_about_me&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;response_type=token&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;browserProcess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;browse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urlText&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;localPort&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connectors&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${localHost}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Callback&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;browserProcess:&lt;/span&gt; &lt;span class="n"&gt;browserProcess&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;serverThread&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;browse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;ClassNotFoundException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IllegalAccessException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;IllegalArgumentException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InterruptedException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;InvocationTargetException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;NoSuchMethodException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;osName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;os.name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;osName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Mac OS&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Class&lt;/span&gt; &lt;span class="n"&gt;fileMgr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;com.apple.eio.FileManager&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Method&lt;/span&gt; &lt;span class="n"&gt;openURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fileMgr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDeclaredMethod&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;openURL&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;openURL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;invoke&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;osName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Windows&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rundll32 url.dll,FileProtocolHandler &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;firefox&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;opera&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;konqueror&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;epiphany&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mozilla&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;netscape&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;which&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]).&lt;/span&gt;&lt;span class="na"&gt;waitFor&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;NoSuchMethodException&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Could not find web browser&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;Runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;browser&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; ${url}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Callback&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;AbstractHandler&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;browserProcess&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;handle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpServletRequest&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;HttpServletResponse&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;dispatch&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;IOException&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ServletException&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestURL&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;handled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;browserProcess&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;destroy&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行前にはあらかじめFacebookのアプリケーション設定画面の &lt;strong&gt;サイトURL&lt;/strong&gt; 入力欄に以下の入力をしておく必要があります。&lt;/p&gt;</description></item><item><title>FacebookにGroovyでログイン（その２）</title><link>https://genzouw.com/entry/2011/10/29/011857/186/</link><pubDate>Sat, 29 Oct 2011 01:18:57 +0900</pubDate><guid>https://genzouw.com/entry/2011/10/29/011857/186/</guid><description>&lt;p&gt;以下のエントリの誤りを修正。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2011/10/28/021014"&gt;FacebookにGroovyでログイン | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;以下のようなhttpアクセスを実装した。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Facebookのログイン画面へアクセス&lt;/li&gt;&#10;&lt;li&gt;ユーザー名、パスワードを指定しFacebookへログイン&lt;/li&gt;&#10;&lt;li&gt;ログイン完了後、OAuth認証用のURLへ所定のパラメータを指定しGetアクセス&lt;/li&gt;&#10;&lt;li&gt;Facebookアプリを認証を許可する画面が表示されるため、ログインボタンを押す&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;em&gt;ちなみに上記の最後の処理がうまく動作していない。&lt;/em&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.httpcomponents:httpclient:4.1.2&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.client.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.client.entity.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.client.methods.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.client.params.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.impl.client.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.message.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.protocol.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.util.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;HttpClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultHttpClient&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HttpGet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://www.facebook.com/login.php&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;nextAction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;/(?msi).+&amp;lt;form method=&amp;#34;post&amp;#34;.+?action=&amp;#34;(.+?)&amp;#34;[^&amp;gt;]*&amp;gt;.+/&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\$1&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EntityUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;consume&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;HttpPost&lt;/span&gt; &lt;span class="n"&gt;post2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HttpPost&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nextAction&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;post2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;UrlEncodedFormEntity&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BasicNameValuePair&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;genzouw@gmail.com&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BasicNameValuePair&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pass&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;XXXXXXXXXX&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UTF_8&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EntityUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;consume&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;urltext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://www.facebook.com/dialog/oauth?&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;client_id=XXXXXXXXXXXXXXXXXXXX&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;redirect_uri=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;URLEncoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://www.facebook.com/connect/login_success.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;scope=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;URLEncoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;email,read_stream,friends_about_me,user_about_me&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;response_type=token&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HttpGet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urltext&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EntityUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;consume&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;HttpPost&lt;/span&gt; &lt;span class="n"&gt;postLast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HttpPost&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://www.facebook.com/dialog/permissions.request&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;postLast&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;UrlEncodedFormEntity&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;BasicNameValuePair&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;grant_required_cliked&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UTF_8&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;postLast&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statusLine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statusCode&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;locations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getHeaders&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;location&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EntityUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;consume&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connectionManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;shutdown&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のGrab定義部分で利用しているhttpcomponentsライブラリの使い方に多くの誤りがあった。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.httpcomponents:httpclient:4.1.2&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;まず、HttpClientインスタンスは毎回生成する必要がない。&lt;/p&gt;&#10;&lt;p&gt;毎回インスタンス生成をしないとエラーとなっていたが、それはHttpResponse#getEntityで取得したHttpEntityインスタンスのabortをしていなかったことが原因。&lt;/p&gt;&#10;&lt;p&gt;以下のようにEntityUtils#comsumeメソッドを利用してクローズすることで問題が発生しなくなった。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;EntityUtils&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;consume&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;res&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;加えて、毎回HttpClientインスタンスを生成しなくなったため、cookieStoreインスタンスをセットする必要もなくなった。（HttpClientインスタンス内で保持してくれている模様。HttpClientインスタンス生成時に空のそれを内部に保持しているようだ。）&lt;/p&gt;&#10;&lt;p&gt;というか、OAuth2.0の認証をブラウザなしで利用するのはかなりしんどい。accessToken取得までの流れは、Jettyなどのサーバーを一時的に起動して、フィルタで処理するようにしようと考えている。&lt;/p&gt;</description></item><item><title>FacebookにGroovyでログイン</title><link>https://genzouw.com/entry/2011/10/28/021014/187/</link><pubDate>Fri, 28 Oct 2011 02:10:14 +0900</pubDate><guid>https://genzouw.com/entry/2011/10/28/021014/187/</guid><description>&lt;p&gt;FacebookにGroovyでログインする、というのを必死でやろうとしているがうまくいかない。とりあえず現時点でできているところまでアップする。&lt;/p&gt;&#10;&lt;p&gt;やりたいことは、FacebookにOAuth2.0方式でアクセスするようなデスクトップアプリケーションを作りたいということ。Facebook内のデータにアクセスする方法は以下にかかれている。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://developers.facebook.com/docs/authentication/"&gt;Facebook Login - Facebook開発者&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;英語なので何分辛かったが、 &lt;strong&gt;Client-side Flow&lt;/strong&gt; のセクションにかかれている認証手順をブラウザなしで実現したい。ログインしていない場合、初回のアクセスでパスワード入力画面に遷移するために、ユーザー名パスワードをPost方式で渡してみたがパスワードが不正と言われてしまう。&lt;/p&gt;&#10;&lt;h2 id="注意"&gt;&lt;em&gt;（注意）&lt;/em&gt;&lt;/h2&gt;&#10;&lt;p&gt;2011/10/28現在、以下のコードは &lt;code&gt;HttpComponents&lt;/code&gt; の使い方として誤りが多いです。&#10;以下のエントリで修正版を載せているのでそちらを参照してください。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2011/10/29/011857"&gt;FacebookにGroovyでログイン（その２） | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ソースコード"&gt;ソースコード&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.httpcomponents:httpclient:4.1.2&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.client.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.client.params.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.client.methods.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.http.impl.client.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;urltext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://graph.facebook.com/oauth/authorize?&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;client_id=OAUTH2.0_APP_ID&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;redirect_uri=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;URLEncoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;https://www.facebook.com/connect/login_success.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;scope=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;URLEncoder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;email,read_stream,friends_about_me,user_about_me&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;response_type=token&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;amp;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;CookieStore&lt;/span&gt; &lt;span class="n"&gt;cookieStore&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BasicCookieStore&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;HttpClient&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultHttpClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;cookieStore:&lt;/span&gt; &lt;span class="n"&gt;cookieStore&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;HttpGet&lt;/span&gt; &lt;span class="n"&gt;get1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HttpGet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;urltext&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;response1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;get1:&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;response1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statusLine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statusCode&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;nextAction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;/(?msi).+&amp;lt;form method=&amp;#34;post&amp;#34;.+?action=&amp;#34;(.+?)&amp;#34;[^&amp;gt;]*&amp;gt;.+/&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\$1&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;nextAction&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connectionManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;shutdown&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultHttpClient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;cookieStore:&lt;/span&gt; &lt;span class="n"&gt;cookieStore&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;HttpPost&lt;/span&gt; &lt;span class="n"&gt;post2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HttpPost&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nextAction&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ここが怪しい。addParameterを利用するのが正しい？&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;post2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addHeader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;email&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;XXXXX@gmail.com&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;post2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addHeader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pass&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;XXXXX&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;response2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;post2:&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;response2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statusLine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;statusCode&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;response2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connectionManager&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;shutdown&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;続きは明日。&lt;/p&gt;</description></item><item><title>XmlSlurperで取得したノードをxmlとして出力する</title><link>https://genzouw.com/entry/2011/10/15/025215/188/</link><pubDate>Sat, 15 Oct 2011 02:52:15 +0900</pubDate><guid>https://genzouw.com/entry/2011/10/15/025215/188/</guid><description>&lt;p&gt;&lt;a href="http://www.google.com/search?q=XmlSlurper&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;google:XmlSlurper&lt;/a&gt;でノードを取得した場合、&lt;strong&gt;GPathResult&lt;/strong&gt;というクラスの&lt;a href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%F3%A5%B9%A5%BF%A5%F3%A5%B9" class="keyword"&gt;インスタンス&lt;/a&gt;が取得される。&lt;br&gt;&#10;&lt;a href="http://www.google.com/search?q=NodeChild&amp;amp;ie=utf-8&amp;amp;oe=utf-8"&gt;google:NodeChild&lt;/a&gt;というインターフェイスを実装していることから分かるとおり、&lt;a href="http://d.hatena.ne.jp/keyword/xml" class="keyword"&gt;xml&lt;/a&gt;のノードを表している。&lt;/p&gt;&#10;&lt;p&gt;取得したノードの&lt;a href="http://d.hatena.ne.jp/keyword/xml" class="keyword"&gt;xml&lt;/a&gt;構造を見たいときは以下のように出力してやるとかなりおかしな出力の仕方がされる。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="testxml"&gt;test.&lt;a href="http://d.hatena.ne.jp/keyword/xml" class="keyword"&gt;xml&lt;/a&gt;&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;users&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;user&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;genzou&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;family&amp;gt;&lt;/span&gt;yu&lt;span class="nt"&gt;&amp;lt;/family&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;family&amp;gt;&lt;/span&gt;ki&lt;span class="nt"&gt;&amp;lt;/family&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/user&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;user&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;yasu&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;family&amp;gt;&lt;/span&gt;megumi&lt;span class="nt"&gt;&amp;lt;/family&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/user&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;user&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;taro&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;family&amp;gt;&lt;/span&gt;hanako&lt;span class="nt"&gt;&amp;lt;/family&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;family&amp;gt;&lt;/span&gt;shinji&lt;span class="nt"&gt;&amp;lt;/family&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/user&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/users&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="testgroovy"&gt;test.groovy&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.text.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XmlSlurper&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;parseText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test.xml&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="na"&gt;user&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;genzou@genzou-desktop:~/$ ./test.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;yukimegumihanakoshinji&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;どうやらテキストノードを保持するすべての子ノードをたどり、GPathResult#text()メソッドを呼び出しているようだ。&lt;br&gt;&#10;この場合、以下のように記述するのが正しい。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="testgroovy新"&gt;test.groovy（新）&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.text.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XmlSlurper&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;parseText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test.xml&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="o"&gt;*.&lt;/span&gt;&lt;span class="na"&gt;user&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;XmlUtil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;serialize&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]).&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;出力される情報は一行になっているため、必要があれば自分で綺麗に整形・インデントしなければならないが。&lt;/p&gt;&#10;&lt;/div&gt;</description></item><item><title>サイトのhtmlをXmlSlurperで処理する</title><link>https://genzouw.com/entry/2011/10/14/020759/189/</link><pubDate>Fri, 14 Oct 2011 02:07:59 +0900</pubDate><guid>https://genzouw.com/entry/2011/10/14/020759/189/</guid><description>&lt;p&gt;最近ではxhtmlでかかれたサイトが多くなったが、サイトのhtmlがxhtmlであることを前提にXmlSlurperで処理しようとすると時々固まってしまう。正しいxhtmlでかかれていない箇所があったりするからだ。&#10;また、DTD定義を探しにいくが、見つからずにエラー、といったこともある。&lt;/p&gt;&#10;&lt;p&gt;そこで xhtmlを読み込む前に事前処理を行うことで、サイトのxhtmlを XmlSlurper で処理できる。&lt;/p&gt;&#10;&lt;h2 id="ソースコード"&gt;ソースコード&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grapes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;net.sourceforge.htmlcleaner&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;htmlcleaner&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2.2&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.htmlcleaner.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;http://groovy.codehaus.org/&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;cleaner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HtmlCleaner&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cleaner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;address&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toURL&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// htmlをxmlに変換&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cleaner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProperties&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;serializer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SimpleXmlSerializer&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;props&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;xml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;serializer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getXmlAsString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// DTDの妥当性検証を実施しない設定&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XmlSlurper&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;parseText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// (以下省略)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;ここから先は以下のサイトを参考に page 変数に対して好き勝手にごにょごにょしてあげればOK。(僕はXmlSlurperの使い方になれず）&lt;/p&gt;&#10;&lt;h2 id="参考"&gt;参考&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://groovy-lang.org/processing-xml.html"&gt;The Apache Groovy programming language - Processing XML&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://grails.asia/groovy-xmlslurper-examples-for-parsing-xml"&gt;Groovy XmlSlurper Examples for Parsing XML - Grails Cookbook&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Ubuntuでログイン後、.Xmodmapが読み込まれずに困っている場合</title><link>https://genzouw.com/entry/2011/10/14/015436/190/</link><pubDate>Fri, 14 Oct 2011 01:54:36 +0900</pubDate><guid>https://genzouw.com/entry/2011/10/14/015436/190/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;家にはUbuntuマシンが３台あるのだが、１台だけxdmでログイン後、&lt;code&gt;.Xmodmap&lt;/code&gt; が自動的に読み込まれずに困っていた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ll .Xmodmap&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 僕のLinux環境では、~/myconfigで各種設定ファイルを一元管理しシンボリックリンクを貼っています&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;lrwxrwxrwx &lt;span class="m"&gt;1&lt;/span&gt; genzou &lt;span class="m"&gt;26&lt;/span&gt; 2011-09-12 23:39 .Xmodmap -&amp;gt; myconfig/.Xmodmap&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="しばらくは暫定対処していた"&gt;しばらくは暫定対処していた&lt;/h2&gt;&#10;&lt;p&gt;しかたがないのでログイン後毎回以下のコマンドを叩いていた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ xmodmap .Xmodmap &lt;span class="c1"&gt;#.Xmodmapを読み込み&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="対処方法ありました"&gt;対処方法ありました&lt;/h2&gt;&#10;&lt;p&gt;ちょっとググったら、ずばりの対応方法がかかれていた。&#10;&lt;a href="http://d.hatena.ne.jp/inouetakuya/touch/20090917/1253158013"&gt;Ubuntu 9.04 でキー割り当て（キーボード配列）を変更 - 起動時に .Xmodmap が自動で読み込まれないときは？ - 彼女からは、おいちゃんと呼ばれています&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="所感"&gt;所感&lt;/h2&gt;&#10;&lt;p&gt;ちょいちょいこの&lt;strong&gt;gconf-editor&lt;/strong&gt;なるものを触って設定を書き換える機会が発生するが、Linux的じゃないような気がしてならない。&lt;/p&gt;</description></item><item><title>Cygwinでカレントディレクトリにスペースを含む場合にShellbang付きGroovyが動かせない件のパッチを送ってみた</title><link>https://genzouw.com/entry/2011/10/10/225357/191/</link><pubDate>Mon, 10 Oct 2011 22:53:57 +0900</pubDate><guid>https://genzouw.com/entry/2011/10/10/225357/191/</guid><description>&lt;p&gt;Groovyの開発リポジトリが &lt;a href="https://github.com/"&gt;GitHub · Build software better, together.&lt;/a&gt; に以降されたので、パッチなども容易に連絡できるようになった。&lt;/p&gt;&#10;&lt;p&gt;ようやくかなり以前のエントリであげていたcygwin上のカレントディレクトリに半角スペースを含む場合にエラーが発生する件( &lt;a href="https://genzouw.com/entry/2009/11/26/080311"&gt;CygwinでWindows環境にLinuxと同様のGroovy環境を構築するための設定&lt;/a&gt; )のパッチを連絡してみた。&lt;/p&gt;</description></item><item><title>ubuntuでimeの辞書登録的なことを行う</title><link>https://genzouw.com/entry/2011/10/09/231702/192/</link><pubDate>Sun, 09 Oct 2011 23:17:02 +0900</pubDate><guid>https://genzouw.com/entry/2011/10/09/231702/192/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux genzou-desktop 2.6.38-11-generic &lt;span class="c1"&gt;#50-Ubuntu SMP Mon Sep 12 21:18:14 UTC 2011 i686 i686 i386 GNU/Linux&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ anthy-agent --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;anthy-agent 9100h&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ anthy-dic-tool --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Anthy-dic-util 9100h.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;日本語入力には&lt;a href="http://d.hatena.ne.jp/keyword/anthy" class="keyword"&gt;anthy&lt;/a&gt;を利用しているが、&lt;a href="http://d.hatena.ne.jp/keyword/anthy" class="keyword"&gt;anthy&lt;/a&gt;に&lt;a href="http://d.hatena.ne.jp/keyword/ime" class="keyword"&gt;ime&lt;/a&gt;でいう単語の辞書登録を行う方法を調べてみた。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="辞書に単語を登録"&gt;辞書に単語を登録&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;kasumi&lt;/strong&gt;っていうコマンドを使える&lt;br&gt;&#10;&lt;a href="http://www.kotodama.jp/blog/index.php/2008/01/08/ubuntu"&gt;KotoDama | Welcome to KotoDama&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="辞書をバックアップ"&gt;辞書をバックアップ&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;~/.&lt;a href="http://d.hatena.ne.jp/keyword/anthy" class="keyword"&gt;anthy&lt;/a&gt;/private_words_default&lt;/strong&gt;をバックアップすればよい&lt;br&gt;&#10;&lt;a href="https://forums.ubuntulinux.jp/viewtopic.php?id=3701"&gt;Ubuntu日本語フォーラム / 日本語変換の辞書登録分のバックアップ&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;</description></item><item><title>hatena.vimが動かなくなっていた</title><link>https://genzouw.com/entry/2011/10/09/230419/193/</link><pubDate>Sun, 09 Oct 2011 23:04:19 +0900</pubDate><guid>https://genzouw.com/entry/2011/10/09/230419/193/</guid><description>&lt;p&gt;理由は簡単。&lt;a href="http://d.hatena.ne.jp/keyword/ubuntu" class="keyword"&gt;ubuntu&lt;/a&gt;バージョンアップの度に新しくインストールしなおしているが、その際に**&lt;a href="http://d.hatena.ne.jp/keyword/curl" class="keyword"&gt;curl&lt;/a&gt;コマンド**がなくなってしまっていたため。&lt;br&gt;&#10;以下のサイトを参考に設定を見直して発覚。&lt;br&gt;&#10;&lt;a href="http://d.hatena.ne.jp/snaka72/20090124/1232801656"&gt;hatena.vimを導入してvimからはてなダイアリーを更新したメモ - 今日もスミマセン。&lt;/a&gt;&lt;/p&gt;</description></item><item><title>コマンド一発で、あるPostgreSQLサーバから別のPostgreSQLサーバにデータをコピーする</title><link>https://genzouw.com/entry/2011/05/27/001502/194/</link><pubDate>Fri, 27 May 2011 00:15:02 +0900</pubDate><guid>https://genzouw.com/entry/2011/05/27/001502/194/</guid><description>&lt;p&gt;トイレに行く前にターミナルから一発実行したコマンド。&lt;/p&gt;&#10;&lt;p&gt;PostgreSQLデータベースのデータをあるサーバから別のサーバに持っていきたいときに便利なコマンド。&lt;/p&gt;&#10;&lt;p&gt;これだとゴミファイルも残らない。&lt;/p&gt;&#10;&lt;p&gt;以下の部分には適当に書き換えて使ってください。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;文字列&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;説明&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;from_user&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;コピー元&lt;/strong&gt; サーバーユーザ&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;from_server&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;コピー元&lt;/strong&gt; サーバーホスト&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;from_dbuser&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;コピー元&lt;/strong&gt; DBユーザ&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;from_dbpass&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;コピー元&lt;/strong&gt; DBパスワード&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;from_dbname&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;コピー元&lt;/strong&gt; DB名&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;-&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;ndash;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;to_user&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;コピー先&lt;/strong&gt; サーバーユーザ&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;to_server&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;コピー先&lt;/strong&gt; サーバーホスト&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;to_dbuser&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;コピー先&lt;/strong&gt; DBユーザ&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;to_dbpass&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;コピー先&lt;/strong&gt; DBパスワード&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;to_dbname&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;コピー先&lt;/strong&gt; DB名&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="コマンド"&gt;コマンド&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ssh from_user@from_server &lt;span class="s2"&gt;&amp;#34;PGPASSWORD=from_dbpass pg_dump -c -U from_dbuser from_dbname | gzip -c&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;|&lt;/span&gt; ssh to_user@to_server &lt;span class="s2"&gt;&amp;#34;gunzip -c | PGPASSWORD=to_dbpass psql -U to_dbuser to_dbname&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="事前に設定しておくと良い設定"&gt;事前に設定しておくと良い設定&lt;/h2&gt;&#10;&lt;p&gt;ssh-keygenで秘密鍵を作っておくと &lt;code&gt;ssh&lt;/code&gt; コマンド実行時のパスワード入力に悩まされない。&lt;/p&gt;</description></item><item><title>Gebを試してみる（再再々）</title><link>https://genzouw.com/entry/2011/05/25/070404/195/</link><pubDate>Wed, 25 May 2011 07:04:04 +0900</pubDate><guid>https://genzouw.com/entry/2011/05/25/070404/195/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/20110525/1306273892"&gt;Gebを試してみる（再々） | ページ 1306273892 | ゲンゾウ用ポストイット&lt;/a&gt; の続き。&lt;/p&gt;&#10;&lt;p&gt;またまた &lt;a href="https://twitter.com/kiy0taka"&gt;kiy0taka&lt;/a&gt; さんがコメントをくれていた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@GrabConfig&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;systemClassLoader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grapes&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.codehaus.geb:geb-core:latest.release&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;org.seleniumhq.selenium:selenium-chrome-driver:latest.release&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;geb.Browser&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drive&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://google.com/ncr&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Google&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// enter wikipedia into the search field&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;q&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;wikipedia&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// wait for the change to results page to happen&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// (google updates the page without a new request)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;waitFor&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Google Search&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// is the first link to wikipedia?&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;firstLink&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;li.g&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;a.l&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;firstLink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Wikipedia&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// click the link&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;firstLink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// wait for Google&amp;#39;s javascript to redirect&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// us to Wikipedia&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;waitFor&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Wikipedia&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このコードを実行すると以下のようなエラーが。&lt;/p&gt;</description></item><item><title>Gebを試してみる（再々）</title><link>https://genzouw.com/entry/2011/05/25/065132/196/</link><pubDate>Wed, 25 May 2011 06:51:32 +0900</pubDate><guid>https://genzouw.com/entry/2011/05/25/065132/196/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2011/05/23/234023"&gt;Gebを試してみる（引き続き） | ゲンゾウ用ポストイット&lt;/a&gt; の続き。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://twitter.com/kiy0taka"&gt;kiy0taka&lt;/a&gt; さんがコメントをくれていた。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;@Grab(&amp;lsquo;org.seleniumhq.selenium:selenium-chrome-driver:latest.release&amp;rsquo;)&#10;をつけたらいいよ。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;ダメモトでやったらやっぱりだめだった。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@GrabConfig&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;systemClassLoader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grapes&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;org.seleniumhq.selenium:selenium-chrome-driver:latest.release&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.codehaus.geb:geb-core:latest.release&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;geb.Browser&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Browser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drive&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://google.com/ncr&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Google&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// enter wikipedia into the search field&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;q&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;wikipedia&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// wait for the change to results page to happen&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// (google updates the page without a new request)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;waitFor&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Google Search&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// is the first link to wikipedia?&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;firstLink&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;li.g&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;a.l&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;firstLink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Wikipedia&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// click the link&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;firstLink&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;click&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// wait for Google&amp;#39;s javascript to redirect&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// us to Wikipedia&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;waitFor&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Wikipedia&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Caught: java.lang.IncompatibleClassChangeError: Implementing class&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at geb.driver.PropertyBasedDriverFactory.getDriver&lt;span class="o"&gt;(&lt;/span&gt;PropertyBasedDriverFactory.groovy:59&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at geb.driver.CachingDriverFactory.getDriver&lt;span class="o"&gt;(&lt;/span&gt;CachingDriverFactory.groovy:36&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at geb.Browser.getDefaultDriver&lt;span class="o"&gt;(&lt;/span&gt;Browser.groovy:61&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at geb.Browser.&amp;lt;init&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;Browser.groovy:48&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at geb.Browser.&amp;lt;init&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;Browser.groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at geb.Browser.&amp;lt;init&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;Browser.groovy:44&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at geb.Browser.&amp;lt;init&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;Browser.groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at geb.Browser.drive&lt;span class="o"&gt;(&lt;/span&gt;Browser.groovy:239&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at GebExamples.run&lt;span class="o"&gt;(&lt;/span&gt;GebExamples.groovy:9&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;僕にはまだ早い技術ということで諦める。Linuxという環境がまずいのかもしれない。&lt;/p&gt;</description></item><item><title>Gebを試してみる（引き続き）</title><link>https://genzouw.com/entry/2011/05/23/234023/197/</link><pubDate>Mon, 23 May 2011 23:40:23 +0900</pubDate><guid>https://genzouw.com/entry/2011/05/23/234023/197/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2011/05/22/000326"&gt;Gebを試してみる&lt;/a&gt; の続き。&lt;/p&gt;&#10;&lt;p&gt;いろいろ試してみました。まずは &lt;a href="http://blog.hatena.ne.jp/nobusue/"&gt;id:nobusue&lt;/a&gt; さんが教えてくれたヒントを元に攻めてみます。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;@GrabConfigで解決できませんかね。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://groovy.codehaus.org/api/groovy/lang/GrabConfig.html"&gt;http://groovy.codehaus.org/api/groovy/lang/GrabConfig.html&lt;/a&gt;&#10;(from @nobusue)&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;&lt;code&gt;@GrabConfig&lt;/code&gt; でサンプルソースで設定されていることが多い &lt;code&gt;systemClassLoader&lt;/code&gt; を設定してみます。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-groovy"&gt;@GrabConfig(systemClassLoader = true)&#10;@Grapes([&#10; @Grab("org.codehaus.geb:geb-core:latest.release"),&#10; @Grab("org.seleniumhq.selenium:selenium-firefox-driver:latest.release")&#10;])&#10;import geb.Browser&#10;&lt;p&gt;Browser.drive(&amp;ldquo;&lt;a href="http://google.com/ncr%22"&gt;http://google.com/ncr&amp;quot;&lt;/a&gt;) {&#10;assert title == &amp;ldquo;Google&amp;rdquo;&#10;// enter wikipedia into the search field&#10;$(&amp;ldquo;input&amp;rdquo;, name: &amp;ldquo;q&amp;rdquo;).value(&amp;ldquo;wikipedia&amp;rdquo;)&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;// wait for the change to results page to happen&#10;// (google updates the page without a new request)&#10;waitFor { title.endsWith(&amp;quot;Google Search&amp;quot;) }&#10;&#10;// is the first link to wikipedia?&#10;def firstLink = $(&amp;quot;li.g&amp;quot;, 0).find(&amp;quot;a.l&amp;quot;)&#10;assert firstLink.text() == &amp;quot;Wikipedia&amp;quot;&#10;&#10;// click the link&#10;firstLink.click()&#10;&#10;// wait for Google's javascript to redirect&#10;// us to Wikipedia&#10;waitFor { title == &amp;quot;Wikipedia&amp;quot; }&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;</description></item><item><title>関西Javaエンジニアの会（関ジャバ）5月に参加</title><link>https://genzouw.com/entry/2011/05/22/232345/198/</link><pubDate>Sun, 22 May 2011 23:23:45 +0900</pubDate><guid>https://genzouw.com/entry/2011/05/22/232345/198/</guid><description>&lt;p&gt;5/18(水)に、関西&lt;a href="http://d.hatena.ne.jp/keyword/Java" class="keyword"&gt;Java&lt;/a&gt;エンジニアの会に参加してきた。&lt;br&gt;&#10;前回は仕事が忙しく参加できずじまいだったが、今回は仕事の都合もつき参加できた。&lt;br&gt;&#10;懇親会は今回も参加できず。&lt;br&gt;&#10;今までよりも参加者は減ったかな。&lt;/p&gt;&#10;&lt;p&gt;関西&lt;a href="http://d.hatena.ne.jp/keyword/Java" class="keyword"&gt;Java&lt;/a&gt;エンジニアの会（関ジャバ）のサイトができたよとのこと。&lt;br&gt;&#10;&lt;a href="http://www.kanjava.com/"&gt;home&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;LTの内容は省略。&lt;a href="http://d.hatena.ne.jp/keyword/Twitter" class="keyword"&gt;Twitter&lt;/a&gt;でつぶやきまくったのでwww。&lt;br&gt;&#10;&lt;a href="http://twitter.com/search?q=%23kanjava"&gt;Twitter / Search - #kanjava&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/Google%A5%AB%A5%EC%A5%F3%A5%C0%A1%BC" class="keyword"&gt;Googleカレンダー&lt;/a&gt;みて知ったけど、読書会なんかもやってるんだね。都合つけて参加してみたい！\&lt;/p&gt;</description></item><item><title>Gebを試してみる</title><link>https://genzouw.com/entry/2011/05/22/000326/199/</link><pubDate>Sun, 22 May 2011 00:03:26 +0900</pubDate><guid>https://genzouw.com/entry/2011/05/22/000326/199/</guid><description>&lt;p&gt;&lt;a href="http://www.kanjava.com/"&gt;関西Javaエンジニアの会&lt;/a&gt; で id:kiy0taka さんが話されていたGebを試してみた。その場で理解した限りでは、GroovyなSelenium的FW。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;サイト： &lt;a href="http://geb.codehaus.org/latest/index.html"&gt;http://geb.codehaus.org/latest/index.html&lt;/a&gt; &lt;/li&gt;&#10;&lt;li&gt;マニュアル： &lt;a href="http://geb.codehaus.org/latest/manual/"&gt;http://geb.codehaus.org/latest/manual/&lt;/a&gt; &lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3&gt;早速試してみる&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="http://geb.codehaus.org/latest/manual/intro.html#installation__usage"&gt;http://geb.codehaus.org/latest/manual/intro.html#installation__usage&lt;/a&gt; にもあるとおり、インストールは不要。なぜならGroovyにはGrabがあるからね！だって。&lt;/p&gt;&#10;&lt;p&gt;以下のコードをスクリプト先頭に記述すればOKとのこと。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-groovy"&gt;@Grapes([&#10;@Grab(&amp;lt;span class="synConstant"&amp;gt;"org.codehaus.geb:geb-core:latest.release"&amp;lt;/span&amp;gt;),&#10;@Grab(&amp;lt;span class="synConstant"&amp;gt;"org.seleniumhq.selenium:selenium-firefox-driver:latest.release"&amp;lt;/span&amp;gt;)&#10;])&#10;import geb.Browser&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;ということで以下のサンプルコードと組み合わせてスクリプトを作成し、実行。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://geb.codehaus.org/latest/manual/intro.html#examples"&gt;http://geb.codehaus.org/latest/manual/intro.html#examples&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4&gt;サンプルコード（GebExample.groovy）&lt;/h4&gt;&#10;&lt;pre&gt;&lt;code class="language-groovy"&gt;#!/usr/bin/env groovy&#10;@Grapes([&#10; @Grab("org.codehaus.geb:geb-core:latest.release"),&#10; @Grab("org.seleniumhq.selenium:selenium-firefox-driver:latest.release")&#10;])&#10;import geb.Browser&#10;&lt;p&gt;Browser.drive(&amp;ldquo;&lt;a href="http://google.com/ncr%22"&gt;http://google.com/ncr&amp;quot;&lt;/a&gt;) {&#10;assert title == &amp;ldquo;Google&amp;rdquo;&lt;/p&gt;&#10;&lt;pre&gt;&lt;code&gt;// enter wikipedia into the search field&#10;$(&amp;quot;input&amp;quot;, name: &amp;quot;q&amp;quot;).value(&amp;quot;wikipedia&amp;quot;)&#10;&#10;// wait for the change to results page to happen&#10;// (google updates the page without a new request)&#10;waitFor { title.endsWith(&amp;quot;Google Search&amp;quot;) }&#10;&#10;// is the first link to wikipedia?&#10;def firstLink = $(&amp;quot;li.g&amp;quot;, 0).find(&amp;quot;a.l&amp;quot;)&#10;assert firstLink.text() == &amp;quot;Wikipedia&amp;quot;&#10;&#10;// click the link&#10;firstLink.click()&#10;&#10;// wait for Google's javascript to redirect&#10;// us to Wikipedia&#10;waitFor { title == &amp;quot;Wikipedia&amp;quot; }&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;</description></item><item><title>「Java使いをGroovyに引き込むサンプル集」がおもしろかった</title><link>https://genzouw.com/entry/2011/03/02/221942/200/</link><pubDate>Wed, 02 Mar 2011 22:19:42 +0900</pubDate><guid>https://genzouw.com/entry/2011/03/02/221942/200/</guid><description>&lt;p&gt;&lt;a href="http://blog.hatena.ne.jp/fumokmm/"&gt;id:fumokmm&lt;/a&gt;さんが「&lt;a href="http://d.hatena.ne.jp/keyword/Java" class="keyword"&gt;Java&lt;/a&gt;使いをGroovyに引き込むサンプル集」というエントリをかかれていておもしろかったのではっておく。&lt;br&gt;&#10;&lt;a href="http://d.hatena.ne.jp/fumokmm/20110213/1297616436"&gt;Java使いをGroovyに引き込むサンプル集 - No Programming, No Life&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;最近プロジェクト内でのちょっとしたツールなどをGroovyで作成することが多くなってきた。&lt;/p&gt;</description></item><item><title>Windowsクライアントで作成した資材をLinuxサーバー上に配置するときに結構よくやる失敗</title><link>https://genzouw.com/entry/2011/02/18/020949/201/</link><pubDate>Fri, 18 Feb 2011 02:09:49 +0900</pubDate><guid>https://genzouw.com/entry/2011/02/18/020949/201/</guid><description>&lt;p&gt;LinuxクライアントからLinuxサーバー、WindowsクライアントからWindowsサーバーでは発生しないが、Windowsクライアントで作成したシェルスクリプトなどをLinuxサーバーに持っていったりするときによくやる失敗について。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「改行コードが CRLF となっている」&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;これは非常によくやる失敗ですよね。&#10;単純だが意外と目立たないです。&lt;/p&gt;&#10;&lt;p&gt;まったく動かない場合もありますが、微妙に動いたりする場合もあるのでさらに分かりにくい。&lt;/p&gt;&#10;&lt;p&gt;数日間もこれに費やしてしまいました。。。&lt;/p&gt;</description></item><item><title>surround.vimの使い方</title><link>https://genzouw.com/entry/2011/02/18/020209/202/</link><pubDate>Fri, 18 Feb 2011 02:02:09 +0900</pubDate><guid>https://genzouw.com/entry/2011/02/18/020209/202/</guid><description>&lt;p&gt;[text-object:keyword]をいくらか習得してきたらsurround.&lt;a href="http://d.hatena.ne.jp/keyword/vim" class="keyword"&gt;vim&lt;/a&gt;を導入することでさらに生産性があげられそう。&lt;br&gt;&#10;（まだ習得にはいたっていない。&lt;strong&gt;ds&lt;/strong&gt;、&lt;strong&gt;cs&lt;/strong&gt;は比較的容易だが、&lt;strong&gt;ys&lt;/strong&gt;が直感的でない気がする。）&lt;/p&gt;&#10;&lt;p&gt;以下のサイトの内容がわかりやすい。&lt;br&gt;&#10;&lt;a href="http://d.hatena.ne.jp/secondlife/20061225/1167032528"&gt;vim の text-object をより便利に使えるプラグイン - surround.vim - 2nd life&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;覚えて便利なのは &lt;strong&gt;ys&lt;/strong&gt; の機能だとはおもうが、長いし覚えにくい。&lt;/p&gt;</description></item><item><title>windows + cygwin + shebang 利用時にうまくスクリプトが動かない場合の対処</title><link>https://genzouw.com/entry/2010/12/21/122346/204/</link><pubDate>Tue, 21 Dec 2010 12:23:46 +0900</pubDate><guid>https://genzouw.com/entry/2010/12/21/122346/204/</guid><description>&lt;p&gt;windows + &lt;a href="http://d.hatena.ne.jp/keyword/cygwin" class="keyword"&gt;cygwin&lt;/a&gt;で、たとえばデスクトップに以下のスクリプトを配置して実行すると動かない。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="testgroovy"&gt;test.groovy&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="s"&gt;/usr/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="n"&gt;groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;prnltn&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="cygwinで実行"&gt;&lt;a href="http://d.hatena.ne.jp/keyword/cygwin" class="keyword"&gt;cygwin&lt;/a&gt;で実行&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; デスクトップ&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./test.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&#10;$GROOVY_HOME/bin/startGroovy を以下のように修正する。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;--- startGroovy.orig 2010-12-21 12:17:33.431960400 +0900&#10;+++ startGroovy 2010-12-21 12:16:57.730434900 +0900&#10;@@ -223,7 +223,8 @@&#10;for arg in &amp;#34;$@&amp;#34; ; do&#10;CHECK=`echo &amp;#34;$arg&amp;#34;|egrep -c &amp;#34;$OURCYGPATTERN&amp;#34; -`&#10;if [ $CHECK -ne 0 ] ; then&#10;- eval `echo args$i`=`cygpath --path --ignore --mixed &amp;#34;$arg&amp;#34;`&#10;+# eval `echo args$i`=`cygpath --path --ignore --mixed &amp;#34;$arg&amp;#34;`&#10;+ eval `echo args$i`=&amp;#34;\&amp;#34;`cygpath --path --ignore --mixed &amp;#34;$arg&amp;#34;`\&amp;#34;&amp;#34;&#10;else&#10;eval `echo args$i`=&amp;#34;\&amp;#34;$arg\&amp;#34;&amp;#34;&#10;fi&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;1.7.6でもまだ修正しないといけないみたい。&lt;br&gt;&#10;誰も問題になっていないのかな？&lt;/p&gt;</description></item><item><title>StringのEnumへの変換</title><link>https://genzouw.com/entry/2010/12/17/123648/205/</link><pubDate>Fri, 17 Dec 2010 12:36:48 +0900</pubDate><guid>https://genzouw.com/entry/2010/12/17/123648/205/</guid><description>&lt;p&gt;以下も面白い。&lt;br&gt;&#10;&lt;a href="http://feedproxy.google.com/~r/mrhaki/~3/zzJVz7-kEFU/groovy-goodness-transform-string-into.html"&gt;Groovy Goodness: Transform String into Enum - Messages from mrhaki&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;String型オブジェクトを自動的に&lt;a href="http://d.hatena.ne.jp/keyword/Enum" class="keyword"&gt;Enum&lt;/a&gt;の同名に変換してくれるそうだ。&lt;/p&gt;</description></item><item><title>DateからCalendarへの変換</title><link>https://genzouw.com/entry/2010/12/17/122740/206/</link><pubDate>Fri, 17 Dec 2010 12:27:40 +0900</pubDate><guid>https://genzouw.com/entry/2010/12/17/122740/206/</guid><description>&lt;p&gt;以下のエントリが面白かった。&lt;br&gt;&#10;&lt;a href="http://feedproxy.google.com/~r/mrhaki/~3/V9ipWXXWPjo/groovy-goodness-convert-date-to.html"&gt;Groovy Goodness: Convert Date to Calendar - Messages from mrhaki&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/Java" class="keyword"&gt;Java&lt;/a&gt;ではDateとCalendar周りの&lt;a href="http://d.hatena.ne.jp/keyword/api" class="keyword"&gt;api&lt;/a&gt;が非常に使いにくい。&lt;br&gt;&#10;Groovyではかなり便利になったけど1.7.6からはさらに便利になったんだね。&lt;br&gt;&#10;知らなかった。&lt;/p&gt;</description></item><item><title>h2console.groovyがめちゃくちゃ便利</title><link>https://genzouw.com/entry/2010/12/08/092401/207/</link><pubDate>Wed, 08 Dec 2010 09:24:01 +0900</pubDate><guid>https://genzouw.com/entry/2010/12/08/092401/207/</guid><description>&lt;p&gt;久しぶりにゆっくりとブログを流し読みしていたら、 id:kiy0taka さんの作成した &lt;strong&gt;h2console.groovy&lt;/strong&gt; というスクリプトがすごかった。 &lt;a href="http://d.hatena.ne.jp/kiy0taka/20101127/1290869045"&gt;H2 Database&amp;#x306E;WebServlet&amp;#x304C;&amp;#x4FBF;&amp;#x5229; - blog4j 2.0&lt;/a&gt; &lt;/p&gt;&#10;&lt;p&gt;Groovyスクリプトをダウンロードしてきて実行するだけ。本当にすごい。現在のプロジェクトではPostgreSQLデータベースを使用しているため、 &lt;code&gt;$HOME/.groovy/lib&lt;/code&gt; フォルダに &lt;code&gt;postgresql-8.4-702.jdbc4.jar&lt;/code&gt; を配置してから実行する必要があったが、MySQLならその作業すら不要ということ。&lt;/p&gt;&#10;&lt;p&gt;スクリプト実行後にブラウザで &lt;code&gt;http://localhost:8080/&lt;/code&gt; にアクセスするだけでDBの内容を閲覧できました。&lt;/p&gt;</description></item><item><title>日本語ファイル名をgit statusなどで文字化けさせずに表示する方法</title><link>https://genzouw.com/entry/2010/11/18/144605/208/</link><pubDate>Thu, 18 Nov 2010 14:46:05 +0900</pubDate><guid>https://genzouw.com/entry/2010/11/18/144605/208/</guid><description>&lt;p&gt;会社のCygwin + Git環境だと、半角のみのファイルに関しては問題はないのだが、全角を含むファイル名を管理している場合に以下のコマンドで文字化けする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ git status&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; create mode &lt;span class="m"&gt;100644&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;\345\217\226\346\211\261\350\252\254\346\230\216\346\233\270.txt&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;解決方法がようやくわかった。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;git config &amp;ndash;global core.quotepath false&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://tobysoft.net/wiki/index.php?git%2F%C6%FC%CB%DC%B8%EC%A5%D5%A5%A1%A5%A4%A5%EB%CC%BE%A4%F2git%20status%A4%CA%A4%C9%A4%C7%C9%BD%BC%A8%A4%B9%A4%EB%CA%FD%CB%A1"&gt;http://tobysoft.net/wiki/index.php?git%2F%C6%FC%CB%DC%B8%EC%A5%D5%A5%A1%A5%A4%A5%EB%CC%BE%A4%F2git%20status%A4%CA%A4%C9%A4%C7%C9%BD%BC%A8%A4%B9%A4%EB%CA%FD%CB%A1&lt;/a&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;Cygwin環境では必須ですね。&lt;/p&gt;</description></item><item><title>Windowsでファイル結合</title><link>https://genzouw.com/entry/2010/09/28/141938/209/</link><pubDate>Tue, 28 Sep 2010 14:19:38 +0900</pubDate><guid>https://genzouw.com/entry/2010/09/28/141938/209/</guid><description>&lt;p&gt;意外と詰まった。&lt;br&gt;&#10;&lt;a href="http://d.hatena.ne.jp/keyword/Linux" class="keyword"&gt;Linux&lt;/a&gt;ならcatコマンドだが、Windowsではどうするか？&lt;br&gt;&#10;copyというコマンドを使えというwebの書き込みがいくつかあったが、正解は&lt;strong&gt;type&lt;/strong&gt;コマンドだった。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/noosphere/20090421/1240325679"&gt;Windows で cat コマンド - homesteading the noosphere&lt;/a&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;type file.1 file.2 &amp;gt; file.org&#10;&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Subversionのリポジトリ上から２つのリビジョンの差分ファイルをピックアップするスクリプト</title><link>https://genzouw.com/entry/2010/08/31/181342/210/</link><pubDate>Tue, 31 Aug 2010 18:13:42 +0900</pubDate><guid>https://genzouw.com/entry/2010/08/31/181342/210/</guid><description>&lt;div class="section"&gt;&#10;&lt;h3 id="svndiffexp"&gt;svndiffexp&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;svn info &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s1"&gt;&amp;#39;URL: &amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/URL: //g&amp;#39;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;r1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;r2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;todir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; f in &lt;span class="sb"&gt;`&lt;/span&gt;svn diff &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; -r &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;r1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;:&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;r2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; --summarize &lt;span class="p"&gt;|&lt;/span&gt; grep -v ^D &lt;span class="p"&gt;|&lt;/span&gt; sed -e &lt;span class="s2"&gt;&amp;#34;s@^. *&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;target&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/@@g&amp;#34;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; -f &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;list&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$list&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="nv"&gt;$f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar cf - &lt;span class="nv"&gt;$list&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;todir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; tar xvf -&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="使い方"&gt;使い方&lt;/h3&gt;&#10;&lt;p&gt;your_&lt;a href="http://d.hatena.ne.jp/keyword/svn" class="keyword"&gt;svn&lt;/a&gt;_work_dirという&lt;a href="http://d.hatena.ne.jp/keyword/svn" class="keyword"&gt;svn&lt;/a&gt;の作業コピーディレクトリから、リビジョン10~12で変更されたファイルをピックアップする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; your_svn_work_dir&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ svndiffexp &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;12&lt;/span&gt; ~/modfiles/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</description></item><item><title>試用版ソフトを試用期間を超えて使用するための起動用バッチ（悪用禁止）</title><link>https://genzouw.com/entry/2010/08/26/190440/211/</link><pubDate>Thu, 26 Aug 2010 19:04:40 +0900</pubDate><guid>https://genzouw.com/entry/2010/08/26/190440/211/</guid><description>&lt;p&gt;発想が単純だけど、なるほどと思った。職場の方が教えてくれた。悪用厳禁。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;@ECHO OFF&#10;set D=%DATE%&#10;date = 2009-10-01&#10;start &amp;#34;&amp;#34; &amp;#34;C:\Program Files\xxx\yyy.exe&amp;#34;&#10;ping localhost -n 5&#10;date = %D%&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;てか、&lt;a href="http://d.hatena.ne.jp/keyword/Linux" class="keyword"&gt;Linux&lt;/a&gt;じゃなくてWindowsでもシステム日時を変更するのに &amp;ldquo;date&amp;rdquo; コマンド使えるんだ、と思った。&lt;br&gt;&#10;あと&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;ping localhost -n 5&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;のあたりに芸の細かさを感じた。&lt;/p&gt;</description></item><item><title>JVMを複数インストールしているPCにてEclipseが起動しない</title><link>https://genzouw.com/entry/2010/08/26/182726/212/</link><pubDate>Thu, 26 Aug 2010 18:27:26 +0900</pubDate><guid>https://genzouw.com/entry/2010/08/26/182726/212/</guid><description>&lt;p&gt;Eclipseのバージョンによって起動したりしなかったりということがあった。3.1や3.2は起動するが3.4、3.5は起動しない。原因がわからずに放置していたがどうしてもEclipseを使用する案件があり、Google先生に問い合わせしながらようやく解決。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;jdk1.4&lt;/strong&gt; のjavaw.exeを参照していたことが原因だった。いまだに &lt;strong&gt;jdk1.4&lt;/strong&gt; を使用しているシステムを担当しているため、開発用ＰＣに &lt;strong&gt;jdk1.4&lt;/strong&gt; と &lt;strong&gt;jdk1.6&lt;/strong&gt; がインストールされている。&#10;僕のPCでは、Eclipse起動時に &lt;strong&gt;jdk1.4&lt;/strong&gt; を使用しているようで、古いEclipseは起動するが新しいEclipseは &lt;strong&gt;jdk1.4&lt;/strong&gt; では起動できない。&lt;/p&gt;&#10;&lt;h2 id="解決方法"&gt;解決方法&lt;/h2&gt;&#10;&lt;p&gt;以下のサイトが参考になった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://myprojectbrog.blog54.fc2.com/blog-entry-4.html"&gt;開発メモ Eclipse 起動しない&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;-vm&lt;/code&gt; オプションで、任意のjdk(jre)を使用するように指定できる。&lt;/p&gt;</description></item><item><title>Gradleを使ってTomcatサーバーへのデプロイ作業を自動化</title><link>https://genzouw.com/entry/2010/08/24/125339/213/</link><pubDate>Tue, 24 Aug 2010 12:53:39 +0900</pubDate><guid>https://genzouw.com/entry/2010/08/24/125339/213/</guid><description>&lt;p&gt;AntやMavenを使い倒した人には何でもないことなんだろうけれども便利だと思ったのでメモ。Tomcat7を使用。&lt;/p&gt;&#10;&lt;h2 id="事前準備"&gt;事前準備&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;$TOMCAT_HOME/conf/tomcat-users.xml&lt;/code&gt; を編集して、適当な &lt;strong&gt;ロール&lt;/strong&gt; と &lt;strong&gt;ユーザー&lt;/strong&gt; を追加する。&lt;/p&gt;&#10;&lt;p&gt;以下のような設定を追記した。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ロール： &lt;code&gt;manager&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;ユーザー名・パスワード： &lt;code&gt;manager-script&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="tomcat-usersxml"&gt;&lt;code&gt;tomcat-users.xml&lt;/code&gt;&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;&amp;lt;?xml version=&amp;#39;1.0&amp;#39; encoding=&amp;#39;utf-8&amp;#39;?&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;tomcat-users&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;role&lt;/span&gt; &lt;span class="na"&gt;rolename=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;manager&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;user&lt;/span&gt; &lt;span class="na"&gt;username=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;manager-script&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;password=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;manager-script&amp;#34;&lt;/span&gt; &lt;span class="na"&gt;roles=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;manager&amp;#34;&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/tomcat-users&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;設定後、Tomcatサーバーを起動(すでに起動していた場合は再起動)して以下のURLでログインできることを確認する。&#10;（Tomcatサーバーのホスト名は &amp;ldquo;testserver&amp;rdquo; とする。）&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;http://testserver:8080/manager&lt;/code&gt;&lt;/p&gt;&#10;&lt;h2 id="gradleのビルドファイルを作成"&gt;Gradleのビルドファイルを作成&lt;/h2&gt;&#10;&lt;p&gt;次にbuild.gradleを作成する。&#10;以下のような設定を追記する。 &lt;strong&gt;xxxxxxの部分には、デプロイ対象のアプリケーション名を指定する。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="buildgradle"&gt;build.gradle&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;groovy&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;war&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1.0.0&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;configurations&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;catalinaAnt&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;catalinaAnt&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.apache.tomcat:tomcat-catalina-ant:7.0.0&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 以下省略&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 先程ログインの動作確認をしたサーバのURL&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://testserver:8080/manager&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// デプロイ対象のアプリケーション名&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/xxxxxx&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;user&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="n"&gt;tomcatStop&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;taskdef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;stop&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classname&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.catalina.ant.StopTask&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classpath&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;configurations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;catalinaAnt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asPath&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="n"&gt;tomcatStart&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;taskdef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;start&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classname&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.catalina.ant.StartTask&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classpath&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;configurations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;catalinaAnt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asPath&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="nf"&gt;tomcatReload&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;dependsOn:&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;war&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;taskdef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;reload&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classname&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.catalina.ant.ReloadTask&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classpath&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;configurations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;catalinaAnt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asPath&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;reload&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="n"&gt;tomcatList&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;taskdef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;list&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classname&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.catalina.ant.ListTask&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classpath&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;configurations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;catalinaAnt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asPath&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;list&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="nf"&gt;tomcatDeploy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;dependsOn:&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;clean&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;war&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;taskdef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;deploy&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classname&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.catalina.ant.DeployTask&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classpath&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;configurations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;catalinaAnt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asPath&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deploy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;war&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$rootDir/build/libs/xxxxxx-1.0.0.war&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="n"&gt;tomcatUndeploy&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;taskdef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;undeploy&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classname&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.apache.catalina.ant.UndeployTask&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;classpath&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;configurations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;catalinaAnt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;asPath&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;undeploy&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;username&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;password&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;url&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="デプロイのテスト"&gt;デプロイのテスト&lt;/h2&gt;&#10;&lt;p&gt;build.gradleが用意できたらデプロイを試してみる。&lt;/p&gt;</description></item><item><title>Gradleでのプラグイン使用のための記述が変更された</title><link>https://genzouw.com/entry/2010/08/16/100511/214/</link><pubDate>Mon, 16 Aug 2010 10:05:11 +0900</pubDate><guid>https://genzouw.com/entry/2010/08/16/100511/214/</guid><description>&lt;p&gt;Gradle 0.9 から、build.gradleに記述するプラグイン使用のための設定形式が変更されている。&lt;/p&gt;&#10;&lt;p&gt;0.9より前のバージョン&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;usePlugin&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;groovy&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;usePlugin&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;war&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;0.9から&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;groovy&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;apply&lt;/span&gt; &lt;span class="nl"&gt;plugin:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;war&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Gradleで依存しているjarファイルも含めて１つのjarファイルにしてリリースする</title><link>https://genzouw.com/entry/2010/08/07/225432/215/</link><pubDate>Sat, 07 Aug 2010 22:54:32 +0900</pubDate><guid>https://genzouw.com/entry/2010/08/07/225432/215/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/maven" class="keyword"&gt;maven&lt;/a&gt;&lt;a href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA" class="keyword"&gt;リポジトリ&lt;/a&gt;に配置されているjarファイルを含める方法は分からなかったが、以下のようなローカルプロジェクト内の特定フォルダにすべてのjarファイルが配置されている場合に対応できる。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="ローカルプロジェクトの状態"&gt;ローカルプロジェクトの状態&lt;/h3&gt;&#10;&lt;p&gt;ここでは、プロジェクトホーム直下の lib フォルダにjarファイルがいくつか配置されているものとする。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;myproject&#10;├build&#10;├─lib &amp;lt;=ここにjarファイルがいくつか存在している。&#10;└─src&#10;├─main&#10;│ ├─groovy&#10;│ └─java&#10;└─test&#10;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="buildgradleの設定追記"&gt;build.gradleの設定追記&lt;/h3&gt;&#10;&lt;p&gt;以下のようなタスクを追加。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="nf"&gt;jarWithZipFileSet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Jar&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;zipFileSet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;dir:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$rootDir/lib&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$rootDir/build/classes&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;listFiles&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;directory&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;zipFileSet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;dir:&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ほいでjarファイルを作成。その際に以下のコマンドを使用する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gradle clean jarWithZipFileSet&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;clean&lt;/strong&gt;は特に不要だが、一応念のためにプロジェクトを綺麗にしてからjarファイルを作成する。&lt;/p&gt;&#10;&lt;/div&gt;</description></item><item><title>git diffで文字化けが発生する場合の対処法</title><link>https://genzouw.com/entry/2010/08/07/224648/216/</link><pubDate>Sat, 07 Aug 2010 22:46:48 +0900</pubDate><guid>https://genzouw.com/entry/2010/08/07/224648/216/</guid><description>&lt;p&gt;職場のWindowsにCygwinをインストールして作業している。&#10;以下のコマンドを実行すると文字化けしてしまう問題に遭遇。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git diff .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;diffが文字化けすると日本語のコメント部分が読めなかったり、Markdownのドキュメントの変更点が追えず不便。&lt;/p&gt;&#10;&lt;p&gt;Gitに対して、以下の設定を行うことで文字化け対処できた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global core.pager &lt;span class="s1"&gt;&amp;#39;lv -c&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lvをページャーに指定するだけだと文字化け解決できなかったので &lt;code&gt;-c&lt;/code&gt; オプションを追加した。&lt;/p&gt;</description></item><item><title>GradleでGoogleCodeプロジェクトを作ってみる - その３</title><link>https://genzouw.com/entry/2010/08/01/212757/217/</link><pubDate>Sun, 01 Aug 2010 21:27:57 +0900</pubDate><guid>https://genzouw.com/entry/2010/08/01/212757/217/</guid><description>&lt;p&gt;Gradleには&lt;a href="http://d.hatena.ne.jp/keyword/Maven" class="keyword"&gt;Maven&lt;/a&gt;&lt;a href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA" class="keyword"&gt;リポジトリ&lt;/a&gt;公開のためのプラグインが用意されている。&lt;/p&gt;&#10;&lt;p&gt;今現在のbuild.gradleが以下のようになっているはず。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="buildgradle"&gt;build.gradle&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;usePlugin&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;groovy&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sourceCompatibility&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.6&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0.1.0&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;archivesBaseName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;gconv&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;repositories&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;flatDir&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;dirs:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$rootDir/lib&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;mavenCentral&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;groovy&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;org.codehaus.groovy:groovy:1.7.4&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;testCompile&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;junit:junit:4.8.1&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これに以下の記述を追加する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;@@ -1,4 +1,5 @@&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;usePlugin(&amp;#34;groovy&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+usePlugin(&amp;#34;maven&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sourceCompatibility = 1.6&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;version = &amp;#34;0.1.0&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;@@ -13,3 +14,16 @@&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;groovy &amp;#34;org.codehaus.groovy:groovy:1.7.4&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;testCompile &amp;#34;junit:junit:4.8.1&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+uploadArchives {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ repositories{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ mavenDeployer {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ repository(url: &amp;#34;file://localhost/tmp/gconv/svn/maven_repository/&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ pom{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ version = &amp;#34;0.1.0&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ groupId = &amp;#34;com.gmail.genzouw&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ artifactId = &amp;#34;gconv&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このあたりは&lt;a href="http://d.hatena.ne.jp/keyword/Maven" class="keyword"&gt;Maven&lt;/a&gt;をまったく使ってこなかったためによく分からない。いろんなサイトからかき集めてきた。&lt;/p&gt;</description></item><item><title>GradleでGoogleCodeプロジェクトを作ってみる - その２</title><link>https://genzouw.com/entry/2010/08/01/092916/218/</link><pubDate>Sun, 01 Aug 2010 09:29:16 +0900</pubDate><guid>https://genzouw.com/entry/2010/08/01/092916/218/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;前回に引き続き、空のプロジェクトができたところからスタート。文字コード変換用のライブラリだが、判定ロジックなど僕のスキルでは書くことができないので以下のプロジェクトのリソースを拝借した。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://code.google.com/p/juniversalchardet/"&gt;juniversalchardet - Java port of universalchardet - Google Project Hosting&lt;/a&gt; &lt;br /&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;こちらを、javaフォルダに配置。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gconv&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- src&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- java&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;次にjuniversalchardetのクラスのラッパーを作成。これでいかにも自分が作成したっぽくなる。バイト配列をもらって、それがどの文字コードであるかを自動判定する。（ただし、半角英数字のみの場合、うまく判定ができない。juniversalchardetの仕様の模様）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;gconv&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- src&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- gmail&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- genzouw&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- gconv&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="sb"&gt;`&lt;/span&gt;-- Gconv.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="コーディング"&gt;コーディング&lt;/h2&gt;&#10;&lt;h3 id="gconvgroovy"&gt;Gconv.groovy&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gmail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;genzouw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gconv&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.mozilla.universalchardet.Constants&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Gconv&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="n"&gt;detector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nullclass&lt;/span&gt; &lt;span class="n"&gt;Charset&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;Charset&lt;/span&gt;&lt;span class="o"&gt;(){}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ISO_2022_JP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_ISO_2022_JP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ISO_2022_CN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_ISO_2022_CN&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ISO_2022_KR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_ISO_2022_KR&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ISO_8859_5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_ISO_8859_5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ISO_8859_7&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_ISO_8859_7&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ISO_8859_8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_ISO_8859_8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;BIG5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_BIG5&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;GB18030&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_GB18030&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;EUC_JP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_EUC_JP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;EUC_KR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_EUC_KR&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;EUC_TW&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_EUC_TW&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;SHIFT_JIS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_SHIFT_JIS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;IBM855&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_IBM855&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;IBM866&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_IBM866&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;KOI8_R&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_KOI8_R&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;MACCYRILLIC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_MACCYRILLIC&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;WINDOWS_1251&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_WINDOWS_1251&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;WINDOWS_1252&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_WINDOWS_1252&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;WINDOWS_1253&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_WINDOWS_1253&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;WINDOWS_1255&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_WINDOWS_1255&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;UTF_8&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_UTF_8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;UTF_16BE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_UTF_16BE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;UTF_16LE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_UTF_16LE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;UTF_32BE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_UTF_32BE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;UTF_32LE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CHARSET_UTF_32LE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Gconv&lt;/span&gt; &lt;span class="n"&gt;SELF&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Gconv&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nf"&gt;Gconv&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;detector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mozilla&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;universalchardet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UniversalDetector&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;Gconv&lt;/span&gt; &lt;span class="nf"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;SELF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;guess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;handleData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dataEnd&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;detectedCharset&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;gconv&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;outCode&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inCode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;inCode&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;inCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;guess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;inCode&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;inCode&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outCode&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;toEuc&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gconv&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Charset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EUC_JP&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;toSjis&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gconv&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Charset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SHIFT_JIS&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="nf"&gt;toUtf8&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gconv&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Charset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UTF_8&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isEuc&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;guess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Charset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EUC_JP&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isSjis&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;guess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Charset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SHIFT_JIS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;boolean&lt;/span&gt; &lt;span class="nf"&gt;isUtf8&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;guess&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;Charset&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UTF_8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="テスト"&gt;テスト&lt;/h2&gt;&#10;&lt;p&gt;testフォルダ以下にテストコードとテストに使用するリソースファイルを配置。&lt;/p&gt;</description></item><item><title>GradleでGoogle Codeプロジェクトを作ってみる</title><link>https://genzouw.com/entry/2010/07/30/213504/219/</link><pubDate>Fri, 30 Jul 2010 21:35:04 +0900</pubDate><guid>https://genzouw.com/entry/2010/07/30/213504/219/</guid><description>&lt;p&gt;近頃仕事で扱う言語はjavascriptとC#が多くなってきた。ツール作成はrubyを使うことも多くなりJava、Groovyを触っていなかった。忘れないように久々に使ってみた。&lt;/p&gt;&#10;&lt;p&gt;私事だが家に妻と子供がいない日々が続いているので（離婚ではない）、久々に何か作ってみようと思い立った。Groovy、Gradleを使って作ってみることにする。リソースはGoogle Codeを利用。Google Codeで利用できるバージョン管理はSubversionとMercurialだが、あえて最近話題 &lt;strong&gt;Git&lt;/strong&gt; をどうにかして使ってみることにする。&lt;/p&gt;&#10;&lt;h2 id="何をつくろう"&gt;何をつくろう？&lt;/h2&gt;&#10;&lt;p&gt;職場で既存プロジェクトを元に新規プロジェクトを作成することが多いのだが、プロジェクト内のファイルのエンコードが統一されていない。これを自動判別して置換したりエンコード変換したりしたい！ということでそんな観じのものをつくってみる。Linuxのiconvっぽい名前で「gconv」にする。&lt;/p&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;以下のものを準備する。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Groovy&lt;/li&gt;&#10;&lt;li&gt;Gradle&lt;/li&gt;&#10;&lt;li&gt;Git&lt;/li&gt;&#10;&lt;li&gt;Google Codeのプロジェクト&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;なんだかGばっかりだ。今は &lt;strong&gt;G&lt;/strong&gt;* が熱いんだ。&lt;/p&gt;&#10;&lt;h2 id="groovy"&gt;Groovy&lt;/h2&gt;&#10;&lt;p&gt;Groovy-1.7.4を使ってみる。&lt;code&gt;/opt/groovy-1.7.4&lt;/code&gt; にセットアップ。 &lt;code&gt;/opt/groovy&lt;/code&gt; にシンボリックリンク。&lt;/p&gt;&#10;&lt;p&gt;以下のようなインストールスクリプトを作ってみた。&lt;/p&gt;&#10;&lt;h3 id="groovy-174sh"&gt;groovy-1.7.4.sh&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;INSTALL_DIR_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.7.4&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -d /tmp &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mkdir /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget http://dist.groovy.codehaus.org/distributions/groovy-binary-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip groovy-binary-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv groovy-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/ &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INSTALL_DIR_HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INSTALL_DIR_HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo unlink groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown root.root -R &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INSTALL_DIR_HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/groovy-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ln -s groovy-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod &lt;span class="m"&gt;755&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INSTALL_DIR_HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/groovy-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/bin/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="gradle"&gt;Gradle&lt;/h2&gt;&#10;&lt;p&gt;Gradle-0.8を使ってみる。 &lt;code&gt;/opt/gradle-0.8&lt;/code&gt; にセットアップ。 &lt;code&gt;/opt/gradle&lt;/code&gt; にシンボリックリンク。&lt;/p&gt;&#10;&lt;p&gt;以下のようなインストールスクリプトを作ってみた。&lt;/p&gt;&#10;&lt;h3 id="gradle-08sh"&gt;gradle-0.8.sh&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;install_dir_home&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -d /tmp &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mkdir /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget http://dist.codehaus.org/gradle/gradle-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;-bin.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip gradle-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;-bin.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown -R root.root gradle-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv gradle-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;install_dir_home&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;install_dir_home&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo unlink gradle&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ln -s gradle-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/ gradle&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/bin/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ln -s &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;install_dir_home&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/gradle/bin/gradle&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="git"&gt;Git&lt;/h2&gt;&#10;&lt;p&gt;僕のマシン環境について触れておくと以下のようになっている。&lt;/p&gt;</description></item><item><title>GroovyServにながーい引数を渡すとエラーが発生する</title><link>https://genzouw.com/entry/2010/07/17/174854/220/</link><pubDate>Sat, 17 Jul 2010 17:48:54 +0900</pubDate><guid>https://genzouw.com/entry/2010/07/17/174854/220/</guid><description>&lt;p&gt;GroovyServ-0.2を使うとGroovyスクリプトの起動がものすごく早くなって便利。だけど、問題が発生している。長い引数を幾つか渡すとエラーが発生してしまうのだ。&lt;/p&gt;&#10;&lt;p&gt;自分の環境は以下のとおり。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovyclient -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Groovy Version: 1.7.3 JVM: 1.6.0_18&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$GROOVYSERV_HOME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/opt/groovyserv&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat /tmp/test.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;args.each&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;println it&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ /opt/groovyserv/bin/groovyclient /tmp/test.groovy aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Segmentation fault&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&#10;GroovyServを使用せずにgroovyコマンドを直接だとエラーは発生しない。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$GROOVY_HOME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/opt/groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ /opt/groovy/bin/groovy /tmp/test.groovy aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddda&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンドラインで**groovyclient /tmp/test.groovy `ls ~/`**みたいな感じのことをやりたかったのだが難しいようだ。&lt;/p&gt;</description></item><item><title>iPhone OS4にアップグレードしたら、Gmail連絡先の同期が取れなくなった</title><link>https://genzouw.com/entry/2010/07/16/125105/221/</link><pubDate>Fri, 16 Jul 2010 12:51:05 +0900</pubDate><guid>https://genzouw.com/entry/2010/07/16/125105/221/</guid><description>&lt;p&gt;しばらくは様子見ということでOS4にアップグレードをせずにいた。&lt;br&gt;&#10;結局次のOSバージョンアップを待たずに、昨日アップグレード。&lt;/p&gt;&#10;&lt;p&gt;3時間もかかって&lt;a href="http://d.hatena.ne.jp/keyword/iPhone" class="keyword"&gt;iPhone&lt;/a&gt;を一通り触ってみて、連絡先がからっぽになっていることに気づいた。&lt;br&gt;&#10;そういえば&lt;a href="http://d.hatena.ne.jp/keyword/Gmail" class="keyword"&gt;Gmail&lt;/a&gt;連絡先と同期をとる設定になっていたが、それが正常に動作していない。&lt;/p&gt;&#10;&lt;p&gt;以前は確か&lt;a href="http://d.hatena.ne.jp/keyword/iPhone" class="keyword"&gt;iPhone&lt;/a&gt;のMicrosoft Exchangeを利用していたと思うので、設定方法をwebで探す。以下のサイトを発見。&lt;br&gt;&#10;&lt;a href="http://www.appbank.net/2009/06/24/iphone-news/33309.php"&gt;iPhone標準のカレンダーとgoogleカレンダーを同期させる一番便利で簡単な方法（複数のカレンダーのアカウント共有可） - たのしいiPhone！ AppBank&lt;/a&gt;&lt;br&gt;&#10;これで連絡先が同期できるはず・・・だったがうまくいかない。連絡先を開くと毎回Exchangeのパスワード入力ダイアログが表示される。&lt;/p&gt;&#10;&lt;p&gt;もう一息調べてみたところ、「ドメイン」の欄は以前は空でよかったのだが、「&lt;a href="http://d.hatena.ne.jp/keyword/gmail" class="keyword"&gt;gmail&lt;/a&gt;.com」の文字列を入力しなければならないようだ。これを設定することで無事連絡先が同期できるようになった。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;&#10;+-----------------------------+&#10;|サーバ m.google.com |&#10;+-----------------------------+&#10;+-----------------------------+&#10;|ドメイン gmail.com |&#10;+-----------------------------+&#10;|ユーザ名 xxxxx@gmail.com |&#10;| |&#10;&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>aptでsun-6-javaがインストールできなくなったね。</title><link>https://genzouw.com/entry/2010/07/05/223820/222/</link><pubDate>Mon, 05 Jul 2010 22:38:20 +0900</pubDate><guid>https://genzouw.com/entry/2010/07/05/223820/222/</guid><description>&lt;p&gt;いつからなんだろう…、彼(sun-6-&lt;a href="http://d.hatena.ne.jp/keyword/java" class="keyword"&gt;java&lt;/a&gt;)が思い出(apt&lt;a href="http://d.hatena.ne.jp/keyword/%A5%EA%A5%DD%A5%B8%A5%C8%A5%EA" class="keyword"&gt;リポジトリ&lt;/a&gt;)から消えてしまったのは…。&lt;br&gt;&#10;ということでしばらくはopenjdkを使用していた。ずいぶん前にopenjdkを使ったときは何だか不思議なエラーばっかりでて使えなかったような気がするが今使っていて別に問題はない。快適だ。特に遅いとも感じない。&lt;/p&gt;&#10;&lt;p&gt;ただし、Swingアプリにて文字化け発生。日本語フォントを設定することにした。&lt;/p&gt;&#10;&lt;p&gt;毎度のことながら&lt;a href="http://d.hatena.ne.jp/keyword/Linux" class="keyword"&gt;Linux&lt;/a&gt;上で&lt;a href="http://d.hatena.ne.jp/keyword/JRE" class="keyword"&gt;JRE&lt;/a&gt;にフォントを認識させる方法を忘れるのでメモ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;参考：&lt;a href="http://blog.goo.ne.jp/makoto8002/e/64910cfd330c0a2538309cf62cefeaca"&gt;LinuxのJava J2SEでの日本語フォントの設定 - 開発覚え書き&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4" class="keyword"&gt;環境変数&lt;/a&gt; &lt;a href="http://d.hatena.ne.jp/keyword/JAVA" class="keyword"&gt;JAVA&lt;/a&gt;_HOME が設定されている前提で。&lt;br&gt;&#10;$&lt;a href="http://d.hatena.ne.jp/keyword/JAVA" class="keyword"&gt;JAVA&lt;/a&gt;_HOME/&lt;a href="http://d.hatena.ne.jp/keyword/jre" class="keyword"&gt;jre&lt;/a&gt;/lib/fonts フォルダ以下に&lt;strong&gt;fallback&lt;/strong&gt;という名前で&lt;a href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%DC%A5%EA%A5%C3%A5%AF%A5%EA%A5%F3%A5%AF" class="keyword"&gt;シンボリックリンク&lt;/a&gt;を作るだけ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="c1"&gt;# ipa mona フォントを認識させることにする。&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install ttf-ipamonafont&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="c1"&gt;# インストール直後はfontsフォルダがなかったため作成&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir &lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;/jre/lib/fonts&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;/jre/lib/fonts&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="c1"&gt;# ipa mona フォントは/usr/share/fonts/truetype/ttf-ipamonafontにインストールされていた&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo ln -s /usr/share/fonts/truetype/ttf-ipamonafont fallback&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;おしまい。&lt;/p&gt;</description></item><item><title>GroovyServ-0.2 インストールでちょっとだけつまった。</title><link>https://genzouw.com/entry/2010/07/04/230356/223/</link><pubDate>Sun, 04 Jul 2010 23:03:56 +0900</pubDate><guid>https://genzouw.com/entry/2010/07/04/230356/223/</guid><description>&lt;p&gt;タイトルどおり。ちょっとだけつまったのでメモ。僕の環境が特殊だった可能性大。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="環境"&gt;環境&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ java -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java version &lt;span class="s2"&gt;&amp;#34;1.6.0_18&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenJDK Runtime Environment &lt;span class="o"&gt;(&lt;/span&gt;IcedTea6 1.8&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;6b18-1.8-0ubuntu1&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;OpenJDK Client VM &lt;span class="o"&gt;(&lt;/span&gt;build 14.0-b16, mixed mode, sharing&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Groovy Version: 1.7.3 JVM: 1.6.0_18&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ uname -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Linux genzou-desktop 2.6.32-23-generic &lt;span class="c1"&gt;#37-Ubuntu SMP Fri Jun 11 07:54:58 UTC 2010 i686 GNU/Linux&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="インストール"&gt;インストール&lt;/h3&gt;&#10;&lt;p&gt;以下のコマンドを実行。&lt;br&gt;&#10;これで/opt以下にgroovyserv-0.2をセットアップした。&lt;br&gt;&#10;現在、GROOVYSERV_HOME=/opt/groovyservとなっているのでここを変更しなくてもいいように&lt;a href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%DC%A5%EA%A5%C3%A5%AF%A5%EA%A5%F3%A5%AF" class="keyword"&gt;シンボリックリンク&lt;/a&gt;を張り替えている。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;install_dir_home&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/opt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wget http://github.com/downloads/kobo/groovyserv/groovyserv-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;-linux-i386-bin.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ unzip groovyserv-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;-linux-i386-bin.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo mv groovyserv-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/ &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;install_dir_home&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;install_dir_home&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo ln -s groovyserv-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; groovyserv&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そうしたら以下のようなメッセージが。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Segmentation fault&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="解決方法"&gt;解決方法&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="http://blog.hatena.ne.jp/nobeans/"&gt;id:nobeans&lt;/a&gt;さんからつぶやいてもらったとおり、&lt;a href="http://github.com/downloads/kobo/groovyserv/groovyserv-0.2-src.zip"&gt;http://github.com/downloads/kobo/groovyserv/groovyserv-0.2-src.zip&lt;/a&gt;をダウンロードして、&lt;a href="http://kobo.github.com/groovyserv/README.ja.txt"&gt;http://kobo.github.com/groovyserv/README.ja.txt&lt;/a&gt;の手順通りにビルド&amp;amp;セットアップ。&lt;br&gt;&#10;&lt;a href="http://d.hatena.ne.jp/keyword/maven2" class="keyword"&gt;maven2&lt;/a&gt;がセットアップされていなかったのでセットアップの手間が発生したけれども、ソースからビルドしたパッケージを利用して無事動作確認。よかった。&lt;/p&gt;</description></item><item><title>今更ruby勉強中</title><link>https://genzouw.com/entry/2010/07/02/225258/224/</link><pubDate>Fri, 02 Jul 2010 22:52:58 +0900</pubDate><guid>https://genzouw.com/entry/2010/07/02/225258/224/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/Java" class="keyword"&gt;Java&lt;/a&gt;のライブラリを知っているし、クロージャ定義も個人的にはしっくりくるためにGroovyの方が好きなのだが、どうにも&lt;a href="http://d.hatena.ne.jp/keyword/JVM" class="keyword"&gt;JVM&lt;/a&gt;の起動の遅さにイライラすることがある。（Groovyservは置いていくとする）&lt;br&gt;&#10;まだしょぼしょぼのスクリプトしか組めないけどね。&lt;/p&gt;&#10;&lt;p&gt;会社でメモメモしたテキストをExcelに変換するスクリプトを組んでみた。以下のとおり。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env ruby&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# coding: UTF-8&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;rubygems&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;win32ole_pp&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;nkf&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;tosjis&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="no"&gt;NKF&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nkf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-sxm0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;xls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;WIN32OLE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Excel.Application&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fso&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;WIN32OLE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Scripting.FileSystemObject&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;application&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;screenUpdating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#WIN32OLE.const_load xls, self.class&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;workbooks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;begin&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;xlsfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;ARGV&lt;/span&gt;&lt;span class="o"&gt;[-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="no"&gt;ARGV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each_with_index&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;txtfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet_index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 過剰なシートの削除&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;worksheets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sheet_index&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;worksheets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sheet_index&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;worksheets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;sheet_index&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;worksheets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;After&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;worksheets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sheet_index&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;worksheets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sheet_index&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;select&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cells&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;columnWidth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;txtfile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/.w+$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tosjis&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;xls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;activeWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;displayGridlines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;xls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;activeWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zoom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;85&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pageSetup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rightHeader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;amp;F&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pageSetup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;centerHeader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;amp;A&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pageSetup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;centerFooter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;amp;P / &amp;amp;N ページ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tosjis&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;txtfile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gets&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;A&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;notabline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/n/u&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;notabline&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;include?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;notabline&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsub!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^([^t]*)t/u&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#$1 + (&amp;#34; &amp;#34; * (4 - $1.length%4))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="vg"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="vg"&gt;$1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tosjis&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;length&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;notabline&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;/[.+s*参照]/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;imgFileMs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fso&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getAbsolutePathName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;notabline&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^s*[|参照]s*/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tosjis&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pictures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;imgFileMs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;A&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;top&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_i&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;notabline&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tosjis&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;font&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ＭＳ　ゴシック&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tosjis&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;/^s*$/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bold&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;/^s**/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;font&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 改ページ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pageSetup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printArea&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$A$1:$y$&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;xls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;activeWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vPageBreaks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;location&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;y1&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pageSetup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;printArea&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$A$1:$x$&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;xls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;activeWindow&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;worksheets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;activate&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readOnlyRecommended&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Titile&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builtinDocumentProperties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;basename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xlsfile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/.w+$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tosjis&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Sub Titile&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builtinDocumentProperties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 作成者&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builtinDocumentProperties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;！！ここは社名&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tosjis&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 最終更新者&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builtinDocumentProperties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;！！ここは社名&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tosjis&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 管理者&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builtinDocumentProperties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 会社名&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;builtinDocumentProperties&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;！！ここは社名&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tosjis&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;displayAlerts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;saveAs&lt;/span&gt; &lt;span class="n"&gt;fso&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getAbsolutePathName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xlsfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tosjis&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;displayAlerts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ensure&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;screenUpdating&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;xls&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;end&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;非常に簡単。以下のようなテキストファイルをほんの少しそれっぽいエクセルにしてくれます。画像も貼り付けてくれます。（Wordで出力したほうがいいって？職場では基本Excel提出なのです。Excelが好きな会社なのです。）&lt;/p&gt;</description></item><item><title>firestarterは使うな</title><link>https://genzouw.com/entry/2010/06/11/092310/225/</link><pubDate>Fri, 11 Jun 2010 09:23:10 +0900</pubDate><guid>https://genzouw.com/entry/2010/06/11/092310/225/</guid><description>&lt;p&gt;いきなりわけのわからないタイトルですが、数ヶ月間の不具合が解消されたので。&lt;/p&gt;&#10;&lt;p&gt;ファイアフォールを用意するために&lt;a href="http://d.hatena.ne.jp/keyword/iptables" class="keyword"&gt;iptables&lt;/a&gt;を使用したくなかったため（設定方法がよくわからないため）、**&lt;a href="http://d.hatena.ne.jp/keyword/firestarter" class="keyword"&gt;firestarter&lt;/a&gt;**を使用していた。&lt;br&gt;&#10;簡単にホスト、ポート単位でInput、Outputの制御が設定できて満足していたのだが少なくとも以下の２アプリの動作に影響を与えていることがわかった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;mt-daap&lt;/li&gt;&#10;&lt;li&gt;hplip&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;mt-daapのほうは、rhythmboxから3689ポートのサーバーが自動的に検出されないという不具合。&lt;a href="http://d.hatena.ne.jp/keyword/firestarter" class="keyword"&gt;firestarter&lt;/a&gt;をとめると検出される。&lt;br&gt;&#10;hplipのほうは、&lt;a href="http://d.hatena.ne.jp/keyword/firestarter" class="keyword"&gt;firestarter&lt;/a&gt;を起動しているとHP PSC2550プリンタが検出できなくなる。当然印刷ができない。&lt;a href="http://d.hatena.ne.jp/keyword/firestarter" class="keyword"&gt;firestarter&lt;/a&gt;をとめると検出され、印刷もできる。&lt;/p&gt;&#10;&lt;p&gt;原因はよくわかっていないが**&lt;a href="http://d.hatena.ne.jp/keyword/firestarter" class="keyword"&gt;firestarter&lt;/a&gt;**をとめると動作する。はじめは単純にファイアフォールの設定方法の誤りかと思ったがどうやらそうではなさそう。&lt;/p&gt;&#10;&lt;p&gt;結局、&lt;a href="http://d.hatena.ne.jp/keyword/ubuntu" class="keyword"&gt;ubuntu&lt;/a&gt;では**&lt;a href="http://d.hatena.ne.jp/keyword/ufw" class="keyword"&gt;ufw&lt;/a&gt;**というコマンドにて、比較的簡単にファイアフォールの設定が行えることがわかったのでそちらを使用することにした。&lt;/p&gt;</description></item><item><title>無料版Oracle Databaseを試す</title><link>https://genzouw.com/entry/2010/06/08/061849/226/</link><pubDate>Tue, 08 Jun 2010 06:18:49 +0900</pubDate><guid>https://genzouw.com/entry/2010/06/08/061849/226/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/Oracle" class="keyword"&gt;Oracle&lt;/a&gt; Databaseに関して技術検証の必要があった。&lt;br&gt;&#10;大量にユーザーを作成する必要があるため、社内開発用DBサーバーを利用するのはさけ、無料版&lt;a href="http://d.hatena.ne.jp/keyword/Oracle" class="keyword"&gt;Oracle&lt;/a&gt; Databaseである**&lt;a href="http://d.hatena.ne.jp/keyword/Oracle" class="keyword"&gt;Oracle&lt;/a&gt; XE**を試してみた。&lt;/p&gt;&#10;&lt;p&gt;以下のサイトが参考になった。&lt;br&gt;&#10;&lt;a href="http://www.fourmeisters.com/blog/kimada/2007/12/vmware_player_ubuntu_linux_ora_1.html"&gt;404 Not Found&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;\&lt;/p&gt;&#10;&lt;p&gt;手順を箇条書きしてみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# http://oss.oracle.com/debian unstable main non-free の一行を追加&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo vi /etc/apt/sources.list&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ wget http://oss.oracle.com/el4/RPM-GPG-KEY-oracle -O- &lt;span class="p"&gt;|&lt;/span&gt; sudo apt-key add -&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2010/06/08現在、10.2.0.1-1.1 がインストールされた&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install oracle-xe-universal&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo /etc/init.d/oracle-xe configure&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>DenyHostsいいね！</title><link>https://genzouw.com/entry/2010/05/26/141944/227/</link><pubDate>Wed, 26 May 2010 14:19:44 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/26/141944/227/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2010/05/12/061718/1273612638"&gt;セキュリティ対策のためのssh設定 | ページ 1273612638 | ゲンゾウ用ポストイット&lt;/a&gt; に引き続きセキュリティ対策中に見つけた。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/con_mame/20080126"&gt;まめ畑&lt;/a&gt; を見て、 &lt;a href="http://denyhosts.sourceforge.net/"&gt;DenyHosts&lt;/a&gt; というアプリを導入。&lt;/p&gt;&#10;&lt;h2 id="denyhostsの機能"&gt;DenyHostsの機能&lt;/h2&gt;&#10;&lt;p&gt;引用します。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;DenyHostsは不正な攻撃を察知して防御するためのツールです。&#10;設定した回数不成功ログインが繰り返された場合に、そのIPアドレスを/etc/hosts.denyに記録し接続を拒否します。&#10;また、怪しい活動をしているIPアドレスを集めている専用サーバからIPアドレスをダウンロードして予防したり、こちらからアップロードすることも出来ます。&#10;不成功ログイン回数の設定、一定時間後の解除までの時間、レポートメールなどの設定が可能です。&#10;ここでは基本的な設定を説明します。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;Ubuntuなら以下のコマンドでインストール可能だった。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install denyhosts&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;先のサイトを参考に、設定ファイルを開いて適当に書き換える。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo vi /etc/denyhosts.conf&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="効果のほどは"&gt;効果のほどは？&lt;/h2&gt;&#10;&lt;p&gt;設定後は &lt;code&gt;/var/log/auth.log&lt;/code&gt; に不正なアクセスがまったくなくなった。ある日の22:00ぐらいにしかけ、翌朝見ると06:00ぐらいに /etc/hosts.&lt;code&gt;deny&lt;/code&gt; にIPアドレスのリストが追加されていた。WEBに公開されている不正なIPアドレスリストが自動的に追加される模様。これはよい。&lt;/p&gt;</description></item><item><title>apt-get install gitに注意</title><link>https://genzouw.com/entry/2010/05/24/095050/228/</link><pubDate>Mon, 24 May 2010 09:50:50 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/24/095050/228/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install git&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とやっても、git関連のコマンドはインストールされない様子。意外とはまる。 （&lt;a href="http://d.hatena.ne.jp/Artisan/20080624/1214291999"&gt;apt-getで入るgit - 屑プログラマの憂鬱&lt;/a&gt;）&lt;/p&gt;</description></item><item><title>Ubuntu 10.04インストール後、何度ログインしてもユーザー選択画面に戻ってしまう</title><link>https://genzouw.com/entry/2010/05/24/094737/229/</link><pubDate>Mon, 24 May 2010 09:47:37 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/24/094737/229/</guid><description>&lt;p&gt;先日、&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt; 9.10 から 10.04 にアップグレードし問題なく使用していた。思うところがあり&lt;a href="http://d.hatena.ne.jp/keyword/%A5%AF%A5%EA%A1%BC%A5%F3%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB" class="keyword"&gt;クリーンインストール&lt;/a&gt;してみたらタイトルのような現象となりかなり苦しんだ。&lt;/p&gt;&#10;&lt;p&gt;経緯を説明すると&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;アップグレード時は問題なく動いていた&lt;/li&gt;&#10;&lt;li&gt;ダウンロードしたisoをCD-Rに焼き、新規インストール&lt;/li&gt;&#10;&lt;li&gt;インストールは正常に終了し、再起動がかかる。ログイン画面までは表示。&lt;/li&gt;&#10;&lt;li&gt;ログイン画面でユーザー選択、パスワード入力。&lt;/li&gt;&#10;&lt;li&gt;画面がちらっとしてログイン完了かと思いきや、再度ログイン画面が表示される。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ただ、**&lt;a href="http://d.hatena.ne.jp/keyword/Gnome" class="keyword"&gt;Gnome&lt;/a&gt;&lt;strong&gt;ではなく&lt;/strong&gt;Failsafe &lt;a href="http://d.hatena.ne.jp/keyword/Gnome" class="keyword"&gt;Gnome&lt;/a&gt;**を選択するとログインができる。&lt;/p&gt;&#10;&lt;p&gt;結局原因は&lt;strong&gt;compiz&lt;/strong&gt;関連のモジュールのようだった。compizと名のつくものを片っ端から&lt;strong&gt;suod apt-get purge&lt;/strong&gt;してやることで問題が発生しなくなった。&lt;/p&gt;</description></item><item><title>UbuntuのデフォルトのランレベルがRedhadと違っていてハマった話</title><link>https://genzouw.com/entry/2010/05/15/204553/230/</link><pubDate>Sat, 15 May 2010 20:45:53 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/15/204553/230/</guid><description>&lt;p&gt;過去にほんの少し「Redhat」をいじっていたときの知識では、ランレベルの定義は以下のようになっていました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;3:テキストログインモード&lt;/li&gt;&#10;&lt;li&gt;5:GUIログインモード&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;当然「Ubuntu」もずっとそうだと思っていた。&#10;正しくは「Ubuntu」のデフォルトランレベルは &lt;strong&gt;2&lt;/strong&gt; らしいです。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;sysv-rc-conf&lt;/code&gt; (Redhat系でいう &lt;code&gt;chkconfig&lt;/code&gt;)コマンドで起動するサービスの追加、削除を設定する際も、必死にランレベル &lt;strong&gt;5&lt;/strong&gt; をいじりつつ反映されないなぁなんて悩んでいました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ runlevel&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;N &lt;span class="m"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とコマンド実行して確認すればよかったです。&lt;/p&gt;</description></item><item><title>セキュリティ対策のためのssh設定</title><link>https://genzouw.com/entry/2010/05/12/061718/231/</link><pubDate>Wed, 12 May 2010 06:17:18 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/12/061718/231/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2010/05/01/234833"&gt;sshポートにブルートフォースアタックされています。 | ゲンゾウ用ポストイット&lt;/a&gt; に引き続き。&lt;/p&gt;&#10;&lt;p&gt;ちょうど &lt;a href="http://blog.hatena.ne.jp/jyukutyo/"&gt;id:jyukutyo&lt;/a&gt; さんのところでsshの設定についてのエントリがあった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.sakatakoichi.com/entry/20100509/1273482214"&gt;SSHの鍵を作成してパスワードログインを無効にする - Fight the Future&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;参考にして &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; の設定を変更。&lt;/p&gt;</description></item><item><title>Groovyスクリプトを実行可能jarに間単にまとめることができるって</title><link>https://genzouw.com/entry/2010/05/11/221900/232/</link><pubDate>Tue, 11 May 2010 22:19:00 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/11/221900/232/</guid><description>&lt;p&gt;&lt;a href="http://blog.hatena.ne.jp/fumokmm/"&gt;id:fumokmm&lt;/a&gt;さんのところで紹介されていたGroovyスクリプトを実行可能jarにまとめられるというスクリプトが紹介されていた。&lt;br&gt;&#10;&lt;a href="http://d.hatena.ne.jp/fumokmm/20100510/1273505280"&gt;No Programming, No Life&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;セットアップ方法は非常に簡単。使用してみると確かにスクリプトとGroovyの実行に必要なjarが実行可能jarにひとまとめになった。&lt;/p&gt;&#10;&lt;p&gt;生成された実行可能jarはダブルクリックするなりコマンドラインから&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java -jar hoge.jar&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;にて実行できるので、Groovyがインストールされていない環境でも実行できる。これが何より大きい。&lt;/p&gt;&#10;&lt;p&gt;動作時の僕の環境は以下のとおり。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy -version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Groovy Version: 1.7.2 JVM: 1.6.0_20&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="section"&gt;&#10;&lt;h3 id="swingもいけるのか"&gt;Swingもいけるのか？&lt;/h3&gt;&#10;&lt;p&gt;Swingアプリもいけるかと思って試してみた。&lt;br&gt;&#10;こちら（&lt;a href="http://groovy.codehaus.org/Swing+Builder"&gt;Groovy - Swing Builder&lt;/a&gt;)のSwingBuilderサンプルコードを拝借。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="hellogroovy"&gt;hello.Groovy&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;groovy.swing.SwingBuilder&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.BorderLayout&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;BL&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;SwingBuilder&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;edt&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Frame&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;size:&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="nl"&gt;show:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;borderLayout&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;textlabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;text:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Click the button!&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;constraints:&lt;/span&gt; &lt;span class="n"&gt;BL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NORTH&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;text:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Click Me&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;actionPerformed:&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++;&lt;/span&gt; &lt;span class="n"&gt;textlabel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Clicked ${count} time(s).&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;clicked&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;constraints:&lt;/span&gt;&lt;span class="n"&gt;BL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SOUTH&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記hello.groovyを/tmpフォルダに作成。&lt;br&gt;&#10;ほいで実行可能jarを作成。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;groovy GroovyWrapper.groovy -c -m hello&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java -jar hello.jar&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Swingアプリも問題なく起動を確認。ちょっとしたスクリプトを開発メンバーに公開するときに重宝しそうだ。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;</description></item><item><title>Gmailの下書き機能が便利だって。</title><link>https://genzouw.com/entry/2010/05/10/061951/233/</link><pubDate>Mon, 10 May 2010 06:19:51 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/10/061951/233/</guid><description>&lt;p&gt;ほんとに些細な&lt;a href="http://d.hatena.ne.jp/keyword/Gmail" class="keyword"&gt;Gmail&lt;/a&gt;下書き機能のHackだけど、重要なメールの返信を忘れてしまうことがあるので便利だと思った。&lt;br&gt;&#10;&lt;a href="http://kzworks.at.webry.info/201004/article_13.html"&gt;Gmail の下書き機能が何気に便利 民芸的プログラミング 〜ソフトウェア開発日記〜/ウェブリブログ&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Ubuntu 10.04にアップグレード</title><link>https://genzouw.com/entry/2010/05/07/124838/234/</link><pubDate>Fri, 07 May 2010 12:48:38 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/07/124838/234/</guid><description>&lt;p&gt;4/29に&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt; 10.04がリリースされました。アップグレードしたいけどいきなりは危険かなと思ったので、一週間待ってみた。&lt;br&gt;&#10;昨日、日本語版の&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt; 10.04 isoファイルもダウンロード可能になったことだし思い切ってアップグレードしてみた。&lt;/p&gt;&#10;&lt;p&gt;今まで&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt; 9.10 &amp;amp; &lt;a href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0" class="keyword"&gt;ファイルシステム&lt;/a&gt;タイプext3だったが、&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt; 10.04 &amp;amp; &lt;a href="http://d.hatena.ne.jp/keyword/%A5%D5%A5%A1%A5%A4%A5%EB%A5%B7%A5%B9%A5%C6%A5%E0" class="keyword"&gt;ファイルシステム&lt;/a&gt;タイプ&lt;a href="http://d.hatena.ne.jp/keyword/ext4" class="keyword"&gt;ext4&lt;/a&gt;に。さっと動かしてみた感じではかなりさくさく動く。メモリは食うが動作が速くなった気がする。それに引き換え職場のWindows PCはもたっとしてるなぁ。&lt;/p&gt;</description></item><item><title>firefly(mt-daap)からiPhone、iPod nanoに音楽をコピーする（iTuneは使わないよ）</title><link>https://genzouw.com/entry/2010/05/05/224211/235/</link><pubDate>Wed, 05 May 2010 22:42:11 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/05/224211/235/</guid><description>&lt;p&gt;自宅&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt;サーバーでは、firefly(mt-daap)を使用してiTuneサーバーを構築している。もちろん個人(家族)利用目的で。&lt;br&gt;&#10;&lt;a href="http://d.hatena.ne.jp/keyword/Linux" class="keyword"&gt;Linux&lt;/a&gt;であればRhythmbox、Windows・MacであればiTuneからiTuneサーバーにアクセスして音楽を再生することができる。音楽を一元管理できるので家庭に複数PCがある場合に便利。&lt;/p&gt;&#10;&lt;p&gt;かなり前に以下のサイトを参考にしながらセットアップしていた。&lt;br&gt;&#10;&lt;a href="http://web2web.eek.jp/sb/log/eid264.html"&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;うちの嫁も本格的にWindowsから&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt;へ移行し出したのだが、現在所有している&lt;a href="http://d.hatena.ne.jp/keyword/iPod%20nano" class="keyword"&gt;iPod nano&lt;/a&gt;にデータを入れるにはどうしたらよいかという問題が浮上。どうにかこうにかRhythmboxからデータをコピーできるようになった。以下がその手順の殴り書き。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="ubuntuにipod-nanoを認識させる"&gt;&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt;に&lt;a href="http://d.hatena.ne.jp/keyword/iPod%20nano" class="keyword"&gt;iPod nano&lt;/a&gt;を認識させる&lt;/h3&gt;&#10;&lt;p&gt;まずは&lt;a href="http://d.hatena.ne.jp/keyword/Ubuntu" class="keyword"&gt;Ubuntu&lt;/a&gt;に&lt;a href="http://d.hatena.ne.jp/keyword/iPod%20nano" class="keyword"&gt;iPod nano&lt;/a&gt;を認識さるためのライブラリをインストール。所定のライブラリをインストールすれば認識されるという情報がいろんなサイトで見つかった。面倒なので以下のコマンドをぶち込み関連ライブラリはすべてインストール。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install &lt;span class="s1"&gt;&amp;#39;.*ipod.*&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="rhythmboxにituneサーバーを認識させる"&gt;RhythmboxにiTuneサーバーを認識させる&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;1.Rhythmboxを起動する&lt;/li&gt;&#10;&lt;li&gt;2.左側のバーの空いている場所を右クリック&lt;/li&gt;&#10;&lt;li&gt;3.「daap共有に接続する」を選択&lt;/li&gt;&#10;&lt;li&gt;4.ダイアログに&amp;quot;&lt;a href="http://d.hatena.ne.jp/keyword/localhost" class="keyword"&gt;localhost&lt;/a&gt;:3689&amp;quot;と入力&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="ipod-nanoを接続"&gt;&lt;a href="http://d.hatena.ne.jp/keyword/iPod%20nano" class="keyword"&gt;iPod nano&lt;/a&gt;を接続&lt;/h3&gt;&#10;&lt;p&gt;接続すると、起動中のRhythmboxの左側のバーに接続した&lt;a href="http://d.hatena.ne.jp/keyword/iPod%20nano" class="keyword"&gt;iPod nano&lt;/a&gt;がアイコンで追加される。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="ituneサーバーから音楽を選択してipod-nanoアイコンにコピー"&gt;iTuneサーバーから音楽を選択して&lt;a href="http://d.hatena.ne.jp/keyword/iPod%20nano" class="keyword"&gt;iPod nano&lt;/a&gt;アイコンにコピー&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/%A5%C9%A5%E9%A5%C3%A5%B0%A5%A2%A5%F3%A5%C9%A5%C9%A5%ED%A5%C3%A5%D7" class="keyword"&gt;ドラッグアンドドロップ&lt;/a&gt;で操作できる。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="ipod-nanoアイコンを右クリックして取り外し"&gt;&lt;a href="http://d.hatena.ne.jp/keyword/iPod%20nano" class="keyword"&gt;iPod nano&lt;/a&gt;アイコンを右クリックして「取り外し」&lt;/h3&gt;&#10;&lt;p&gt;これをちゃんとやらないと、せっかく時間をかけてコピーしても無駄になる。&lt;/p&gt;&#10;&lt;p&gt;\&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/iPod%20nano" class="keyword"&gt;iPod nano&lt;/a&gt;と&lt;a href="http://d.hatena.ne.jp/keyword/iPhone" class="keyword"&gt;iPhone&lt;/a&gt;で動作確認ずみ。重たいiTuneを開く機会をまた減らすことができた。&lt;/p&gt;&#10;&lt;/div&gt;</description></item><item><title>Gaelyk勉強中。学習の際に参考にしたドキュメントについて。</title><link>https://genzouw.com/entry/2010/05/03/162928/236/</link><pubDate>Mon, 03 May 2010 16:29:28 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/03/162928/236/</guid><description>&lt;p&gt;現在進行形で勉強中。昨日のセットアップ作業とテンプレートプロジェクト作成スクリプトの作成が終わっているので、以下のコマンドをぶち込むだけでとりあえずはGaelyk Webアプリが動作することをブラウザで確認できて簡単さに興奮。&lt;/p&gt;&#10;&lt;pre class="code lang-sh" data-lang="sh" data-unlink&gt;gaelyk-setup.sh samplepj&#10;&lt;span class="synStatement"&gt;cd&lt;/span&gt; samplepj&#10;dev_appsever.sh war&#10;&lt;/pre&gt;&lt;p&gt;引き続き簡単なアプリを作ってみる。学習の際に参考にしたドキュメントについてあげておく。&lt;/p&gt;&lt;p&gt;&lt;a href="http://dl.dropbox.com/u/132573/Gaelyk-Tutorial.html"&gt;Gaelyk - Google App Engine Java&amp;#x7528;&amp;#x8EFD;&amp;#x91CF;Groovy&amp;#x30C4;&amp;#x30FC;&amp;#x30EB;&amp;#x30AD;&amp;#x30C3;&amp;#x30C8;&lt;/a&gt;&lt;br /&gt;&#10;&amp;#x7B2C;4&amp;#x56DE;&amp;#x300C;Groovy&amp;#x30A4;&amp;#x30F3;&amp;#x30FB;&amp;#x30A2;&amp;#x30AF;&amp;#x30B7;&amp;#x30E7;&amp;#x30F3;&amp;#x300D;&amp;#x8AAD;&amp;#x66F8;&amp;#x4F1A; IN &amp;#x95A2;&amp;#x897F;&amp;#x3067;Gaelyk&amp;#x306E;&amp;#x8A71;&amp;#x3092;&amp;#x3057;&amp;#x307E;&amp;#x3057;&amp;#x305F;&amp;#x3002; - blog4j 2.0&lt;/p&gt;</description></item><item><title>今更ながらGaelyk始める</title><link>https://genzouw.com/entry/2010/05/02/233323/237/</link><pubDate>Sun, 02 May 2010 23:33:23 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/02/233323/237/</guid><description>&lt;p&gt;Groovy関西支部の読書会でid:kiy0takaさんが説明してくれていたがまったく試していなかったので試す。最近最新版のGAE開発環境も刷新したし。&lt;/p&gt;&lt;p&gt;以下のサイトにEclipse3.5用のGaelykテンプレートプロジェクトを作成するためのスクリプトが置かれていた。&lt;br /&gt;&#10;&lt;a href="http://d.hatena.ne.jp/mottsnite/20091024/1256376332"&gt;Gaelyk&amp;#x304A;&amp;#x3082;&amp;#x3057;&amp;#x308D;&amp;#x3044;&amp;#x306E;&amp;#x306B;&amp;#x30FB;&amp;#x30FB;&amp;#x30FB;&amp;#x30FB;&amp;#x3002; - leftovers...&lt;/a&gt;&lt;/p&gt;&lt;p&gt;僕は&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Eclipse"&gt;Eclipse&lt;/a&gt;いらないので、拝借してちょっとだけ触らせてもらった。&lt;/p&gt;&#10;&lt;pre class="code lang-sh" data-lang="sh" data-unlink&gt;&lt;span class="synComment"&gt;#!/bin/bash&lt;/span&gt;&#10;&lt;span class="synComment"&gt;# カレントディレクトリに指定された名前のGaelykプロジェクトフォルダを作成します。&lt;/span&gt;&#10;&lt;span class="synIdentifier"&gt;version&lt;/span&gt;=&lt;span class="synStatement"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synConstant"&gt;0.3.3&lt;/span&gt;&lt;span class="synStatement"&gt;&amp;quot;&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;echo&lt;/span&gt;&lt;span class="synConstant"&gt; &lt;/span&gt;&lt;span class="synStatement"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synConstant"&gt;creating my gaelyk app base&lt;/span&gt;&lt;span class="synStatement"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synConstant"&gt; &lt;/span&gt;&lt;span class="synPreProc"&gt;$1&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;if [&lt;/span&gt; &lt;span class="synStatement"&gt;!&lt;/span&gt; &lt;span class="synStatement"&gt;-f&lt;/span&gt; /tmp/gaelyk-template-project-&lt;span class="synPreProc"&gt;${version}&lt;/span&gt;.zip &lt;span class="synStatement"&gt;]&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;then&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;cd&lt;/span&gt; /tmp&#10;wget http://cloud.github.com/downloads/glaforge/gaelyk/gaelyk-template-project-&lt;span class="synPreProc"&gt;${version}&lt;/span&gt;.zip&#10;&lt;span class="synStatement"&gt;cd&lt;/span&gt; -&#10;&lt;span class="synStatement"&gt;fi&lt;/span&gt;&#10;unzip /tmp/gaelyk-template-project-&lt;span class="synPreProc"&gt;${version}&lt;/span&gt;.zip &lt;span class="synSpecial"&gt;-d&lt;/span&gt; &lt;span class="synPreProc"&gt;$1&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;sed&lt;/span&gt; &lt;span class="synSpecial"&gt;-i&lt;/span&gt; &lt;span class="synSpecial"&gt;-e&lt;/span&gt; &lt;span class="synStatement"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synConstant"&gt;s/myappid/&lt;/span&gt;&lt;span class="synPreProc"&gt;$1&lt;/span&gt;&lt;span class="synConstant"&gt;/g&lt;/span&gt;&lt;span class="synStatement"&gt;&amp;quot;&lt;/span&gt; war/WEB-INF/appengine-web.xml&#10;&lt;/pre&gt;&lt;p&gt;とりあえず今日は遅いのでここまで。今日 &lt;a href="http://dl.dropbox.com/u/132573/Gaelyk-Tutorial.html"&gt;Gaelyk - Google App Engine Java&amp;#x7528;&amp;#x8EFD;&amp;#x91CF;Groovy&amp;#x30C4;&amp;#x30FC;&amp;#x30EB;&amp;#x30AD;&amp;#x30C3;&amp;#x30C8;&lt;/a&gt; を途中までだけどばっちり読み進めたので明日の空き時間でアプリを作成してGAEにのせてみる。&lt;/p&gt;</description></item><item><title>sshポートにブルートフォースアタックされています。</title><link>https://genzouw.com/entry/2010/05/01/234833/238/</link><pubDate>Sat, 01 May 2010 23:48:33 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/01/234833/238/</guid><description>&lt;p&gt;少し前から家のサーバーをインターネット上に公開している。&#10;職場から必要なコードを抜けるようということもあるし、出先でノートPCからアクセスできるようにというのもある。&lt;/p&gt;&#10;&lt;p&gt;ただし、セキュリティにはやはり気をつけなければいけなかった。&#10;iptablesでsshポートのみを公開しているのだが、そのsshポート(ポート番号22)に対して5秒に一度外部からアクセスされていた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grep -i invalid /var/log/auth.log &lt;span class="p"&gt;|&lt;/span&gt; more&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こんなちっぽけなPCへアタックをかけにくる人間などいないだろうと軽く考えていた。まさかこれほどとは。このような闇雲にパスワード総当たりでアクセスしにくるアタックをブルートフォースアタックと言うそうだ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://www.atmarkit.co.jp/ait/articles/0401/01/news048.html"&gt;「ブルートフォースアタック」（総当たり攻撃）とは - ＠IT&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;現時点で想定されているアクセス元となるPCは特定されているし、パスワード打ち込むのが面倒というだけの理由で公開鍵認証方式にてアクセスしている。したがって、sshサーバーで公開鍵認証によるアクセスのみを許可するようにできればいい。&lt;/p&gt;&#10;&lt;p&gt;/etc/ssh/sshd_configに以下の追加。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;PasswordAuthentication no&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;早急にアタックに対するセキュリティについて勉強が必要そうだ。&lt;/p&gt;</description></item><item><title>firefoxをvimのようにキーボードのみで操作するためのアドオン「Vimperator」</title><link>https://genzouw.com/entry/2010/05/01/051405/239/</link><pubDate>Sat, 01 May 2010 05:14:05 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/01/051405/239/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/vim" class="keyword"&gt;vim&lt;/a&gt;の変態&lt;a href="http://d.hatena.ne.jp/keyword/%A5%AD%A1%BC%A5%D0%A5%A4%A5%F3%A5%C9" class="keyword"&gt;キーバインド&lt;/a&gt;になれてくると頻繁に使用するブラウザに対してもこれを摘要したくなってくる。&lt;br&gt;&#10;ということでそんなアドオンがないかと探してみると、ぴったりのものがあった。&lt;br&gt;&#10;&lt;a href="https://addons.mozilla.org/ja/firefox/addon/4891"&gt;Vimperator :: Add-ons for Firefox&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;設定や使い方については&lt;a href="http://d.hatena.ne.jp/keyword/Google" class="keyword"&gt;Google&lt;/a&gt;で検索すると見つかる他サイトが参考になる。&lt;br&gt;&#10;&lt;a href="http://www.google.co.jp/search?q=vimperator&amp;amp;ie=utf-8&amp;amp;oe=utf-8&amp;amp;aq=t&amp;amp;rls=com.ubuntu:ja:official&amp;amp;client=firefox-a"&gt;vimperator - Google 検索&lt;/a&gt;&lt;/p&gt;</description></item><item><title>VimからTwitterへの投稿、閲覧</title><link>https://genzouw.com/entry/2010/05/01/001551/240/</link><pubDate>Sat, 01 May 2010 00:15:51 +0900</pubDate><guid>https://genzouw.com/entry/2010/05/01/001551/240/</guid><description>&lt;p&gt;ちょっと前のエントリでも、職場の先輩が&lt;a href="http://d.hatena.ne.jp/keyword/Vim" class="keyword"&gt;Vim&lt;/a&gt;を使えるようになりましょうと勧められるので&lt;a href="http://d.hatena.ne.jp/keyword/Vim" class="keyword"&gt;Vim&lt;/a&gt;習得中。&lt;br&gt;&#10;結構指がなれてきた。なれてきたところでプラグインを幾つかインストールし出している。&lt;/p&gt;&#10;&lt;p&gt;その一つがTwiVim(&lt;a href="http://www.vim.org/scripts/script.php?script_id=2204"&gt;TwitVim - Twitter client for Vim : vim online&lt;/a&gt;)というもの。&lt;a href="http://d.hatena.ne.jp/keyword/Vim" class="keyword"&gt;Vim&lt;/a&gt;から&lt;a href="http://d.hatena.ne.jp/keyword/Twitter" class="keyword"&gt;Twitter&lt;/a&gt;への投稿、閲覧をしてしまおうというもの。&lt;/p&gt;&#10;&lt;p&gt;セットアップは&lt;a href="http://d.hatena.ne.jp/pcmaster/20090506/p1"&gt;VimからTwitterの投稿、閲覧ができるTwitVim - 理想未来はどうなった？&lt;/a&gt;を参考にさせてもらった。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="インストール"&gt;インストール&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget -O twitvim-0.4.1.vba http://www.vim.org/scripts/download_script.php?src_id&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;10325&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;vim -c &lt;span class="s1"&gt;&amp;#39;so %&amp;#39;&lt;/span&gt; twitvim-0.4.1.vba&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="セットアップ"&gt;セットアップ&lt;/h3&gt;&#10;&lt;p&gt;Ubuntu9.10環境で、&lt;a href="http://d.hatena.ne.jp/keyword/firefox" class="keyword"&gt;firefox&lt;/a&gt;インストール時の設定。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;twitvim_login&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;user:pass&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;twitvim_browser_cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/usr/bin/firefox&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;twitvim_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="使ってみる"&gt;使ってみる&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/vim" class="keyword"&gt;vim&lt;/a&gt;起動後に、&lt;br&gt;&#10;:FriendsTwitter&lt;br&gt;&#10;と入力すれば閲覧、&lt;br&gt;&#10;:PosttoTwitter&lt;br&gt;&#10;と入力すれば投稿できます。&lt;/p&gt;&#10;&lt;p&gt;誤っておかしな投稿してしまったw&lt;/p&gt;&#10;&lt;/div&gt;</description></item><item><title>GroovyServを使用したスクリプト実行</title><link>https://genzouw.com/entry/2010/04/23/011422/241/</link><pubDate>Fri, 23 Apr 2010 01:14:22 +0900</pubDate><guid>https://genzouw.com/entry/2010/04/23/011422/241/</guid><description>&lt;p&gt;最近 Groovy を実行するには &lt;a href="https://kobo.github.io/groovyserv/"&gt;GroovyServ&lt;/a&gt; が手放せなくなりました。&lt;/p&gt;&#10;&lt;p&gt;動作が早い。&#10;スクリプトってコーディングと実行までの繰り返しのスピーディーさが命なので、 &lt;a href="https://kobo.github.io/groovyserv/"&gt;GroovyServ&lt;/a&gt; は Groovy の悪い点を補ってくれてます。&lt;/p&gt;&#10;&lt;p&gt;以下のようなスクリプトを実行すれば簡単にインストールも可能です。（Bash が使える環境で）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# インストールフォルダ&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;INSTALL_DIR_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ダウンロード＆インストール&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget http://github.com/downloads/kobo/groovyserv/groovyserv-0.1-Linux-i386-bin.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip groovyserv-0.1-Linux-i386-bin.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv groovyserv-0.1/ &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INSTALL_DIR_HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;環境変数 PATH に bin フォルダを通します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# INSTALL_DIR_HOME は先程設定した変数を利用&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;INSTALL_DIR_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;INSTALL_DIR_HOME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;/groovyserv-0.1/bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;動作確認のために、以下のコマンドを実行し、正常に Groovy のバージョンが表示されれば OK。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovyclient -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Groovy Version: 1.7.2 JVM: 1.6.0_18&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここまでは GroovyServ のサイトにかかれているとおり。ここまでできれば、以下のようなスクリプトを作成して GroovyServ 経由で実行させることができます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovyclient&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;println &lt;span class="s2"&gt;&amp;#34;test&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通常はシェバングを&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とするところを&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovyclient&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とすれば OK。&lt;/p&gt;&#10;&lt;p&gt;Bash や Ruby スクリプトを実行したかのように結果が一瞬で返ってきます。&#10;ちょっとだけ手を加えてやって、Cygwin でもほぼ同様の方法で GroovyServ 経由のスクリプト実行が可能。&lt;/p&gt;</description></item><item><title>こういう小ネタをたくさん書きたい</title><link>https://genzouw.com/entry/2010/04/20/235432/242/</link><pubDate>Tue, 20 Apr 2010 23:54:32 +0900</pubDate><guid>https://genzouw.com/entry/2010/04/20/235432/242/</guid><description>&lt;p&gt;以下のサイトを最近欲覗かせてもらっている。Groovyでいろいろやる小ネタがかかれている。ひとつひとつのエントリも短く、読みやすい。&lt;br&gt;&#10;&lt;a href="http://groovyarekore.blogspot.com/"&gt;groovyあれこれ&lt;/a&gt;&lt;br&gt;&#10;僕もこういうの書きたい。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="追記"&gt;追記&lt;/h3&gt;&#10;&lt;p&gt;プロフィール参照させていただいたら、&lt;a href="http://kyle-in-jp.blogspot.com/"&gt;画像処理についてあれこれ&lt;/a&gt;のブログをかかれている方だった。こちらもよく覗かせてもらっている。Groovyで画像処理をするっていうエントリがおもしろい。実際趣味の画像加工に利用させていただいたスクリプトもある。&lt;/p&gt;&#10;&lt;/div&gt;</description></item><item><title>Windows・Cygwinからの実行時のコマンドライン引数の数に限界がある</title><link>https://genzouw.com/entry/2010/04/20/234300/243/</link><pubDate>Tue, 20 Apr 2010 23:43:00 +0900</pubDate><guid>https://genzouw.com/entry/2010/04/20/234300/243/</guid><description>&lt;p&gt;GroovyスクリプトをCygwinからコマンドライン実行するとき、どうもうまく動かないときがあった。どんな時に問題が発生するのかいまいち切り分けができていなかった。&lt;/p&gt;&#10;&lt;h2 id="実行環境"&gt;実行環境&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Groovy-1.7.2&lt;/li&gt;&#10;&lt;li&gt;いずれの場合もシェバングを利用してGroovyスクリプトを実行している。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="clibuilderを使用したgroovyスクリプト"&gt;CliBuilderを使用したGroovyスクリプト&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;&amp;quot;-d&amp;quot;&lt;/strong&gt; や &lt;strong&gt;&amp;quot;-e&amp;quot;&lt;/strong&gt; などのオプションを用意したりするとあっという間にコマンドライン引数が10ぐらいになる場合がある。この場合正常に動作しない。&lt;/p&gt;&#10;&lt;h3 id="txt-のような複数ファイルを引数で指定可能なgroovyスクリプト"&gt;&lt;code&gt;&amp;quot;*.txt&amp;quot;&lt;/code&gt; のような複数ファイルを引数で指定可能なGroovyスクリプト&lt;/h3&gt;&#10;&lt;p&gt;こちらも正常に動作しない場合がある。これもファイル数が少ない場合にはうまく動作するようだが、ファイル数が一定数を越えるとスクリプトエラーとなってしまう。&lt;/p&gt;&#10;&lt;h3 id="startgroovy-を除いてみると"&gt;&lt;code&gt;startGroovy&lt;/code&gt; を除いてみると・・・&lt;/h3&gt;&#10;&lt;p&gt;Groovyスクリプト実行時に実行されるBashの一部、startGroovyにそれっぽい処理がかかれている。&lt;/p&gt;&#10;&lt;p&gt;201行目辺りからの処理を除いてみたら、以下のようになっていた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~~~一部抜粋~~~&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# For Cygwin, switch paths to Windows format before running java&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nv"&gt;$cygwin&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;GROOVY_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;cygpath --mixed &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$GROOVY_HOME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;JAVA_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;cygpath --mixed &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$JAVA_HOME&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;GROOVY_CONF&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;cygpath --mixed &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$GROOVY_CONF&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;CP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;cygpath --path --mixed &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$CP&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;TOOLS_JAR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;cygpath --mixed &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$TOOLS_JAR&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;STARTER_CLASSPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;cygpath --path --mixed &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$STARTER_CLASSPATH&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# We build the pattern for arguments to be converted via cygpath&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;ROOTDIRSRAW&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;find -L / -maxdepth &lt;span class="m"&gt;1&lt;/span&gt; -mindepth &lt;span class="m"&gt;1&lt;/span&gt; -type d 2&amp;gt;/dev/null&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;SEP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; dir in &lt;span class="nv"&gt;$ROOTDIRSRAW&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;ROOTDIRS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ROOTDIRS$SEP$dir&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;SEP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;|&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;OURCYGPATTERN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;(^(&lt;/span&gt;&lt;span class="nv"&gt;$ROOTDIRS&lt;/span&gt;&lt;span class="s2"&gt;))&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Add a user-defined pattern to the cygpath arguments&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$GROOVY_CYGPATTERN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; !&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;OURCYGPATTERN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$OURCYGPATTERN&lt;/span&gt;&lt;span class="s2"&gt;|(&lt;/span&gt;&lt;span class="nv"&gt;$GROOVY_CYGPATTERN&lt;/span&gt;&lt;span class="s2"&gt;)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Now convert the arguments - kludge to limit ourselves to /bin/sh&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; arg in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;CHECK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$arg&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;egrep -c &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$OURCYGPATTERN&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; -&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nv"&gt;$CHECK&lt;/span&gt; -ne &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; args&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;cygpath --path --ignore --mixed &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$arg&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;else&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; args&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$arg&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nv"&gt;i&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;expr &lt;span class="nv"&gt;$i&lt;/span&gt; + 1&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;done&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nv"&gt;$i&lt;/span&gt; in&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 0&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; -- &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 1&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 2&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 3&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 4&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args3&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 5&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args3&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args4&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 6&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args3&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args4&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args5&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 7&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args3&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args4&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args5&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args6&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 8&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args3&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args4&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args5&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args6&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args7&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; 9&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; -- &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args0&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args2&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args3&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args4&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args5&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args6&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args7&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$args8&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;esac&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;~~~一部抜粋~~~&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cygwinの場合は、引数が最大9つまでしか受け取れないということなのかな？&#10;それなら今までCygwin上で動作させていたときにエラーとなっていたのがわかる。もちろんLinux上で動作させていたときはこんな問題は発生していない。&lt;/p&gt;</description></item><item><title>Grails-1.2.2になってて浦島太郎</title><link>https://genzouw.com/entry/2010/04/19/232443/244/</link><pubDate>Mon, 19 Apr 2010 23:24:43 +0900</pubDate><guid>https://genzouw.com/entry/2010/04/19/232443/244/</guid><description>&lt;p&gt;仕事が落ち着いているといろんなことが試せて楽しい。&lt;br&gt;&#10;ご飯を食べて風呂にはいってもまだこんな時間帯というのが幸せ。&lt;/p&gt;&#10;&lt;p&gt;ひさびさに&lt;a href="http://d.hatena.ne.jp/keyword/Grails" class="keyword"&gt;Grails&lt;/a&gt;で遊んで見ようと思ったので、まずは最新の&lt;a href="http://d.hatena.ne.jp/keyword/Grails" class="keyword"&gt;Grails&lt;/a&gt;をダウンロードする。いつのまにか1.2.2にまでなっていた。&lt;/p&gt;&#10;&lt;p&gt;以下のようなスクリプトを実行して、/usr/shareフォルダにインストール。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.2.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; ! -d /tmp &lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;then&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget http://dist.codehaus.org/grails/grails-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip grails-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mv grails-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/ /opt/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /opt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo unlink grails&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chown root.root -R /opt/grails-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ln -s grails-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; grails&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo chmod &lt;span class="m"&gt;755&lt;/span&gt; /opt/grails-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;version&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;/bin/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;パスも通しておく。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;GRAILS_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share/grails&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:&lt;span class="nv"&gt;$GRAILS_HOME&lt;/span&gt;/bin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/Grails" class="keyword"&gt;Grails&lt;/a&gt;インストール完了。&lt;br&gt;&#10;&lt;a href="http://d.hatena.ne.jp/keyword/grails" class="keyword"&gt;grails&lt;/a&gt; helpを実行してみたが、なんかコマンド実行結果が怪しい。$&lt;a href="http://d.hatena.ne.jp/keyword/GRAILS" class="keyword"&gt;GRAILS&lt;/a&gt;_HOME/bin/startGrailsスクリプトの一部が何だか怪しい。&lt;br&gt;&#10;231行目を以下のように変更してみたら解決。（いずれ治るのかな？）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;231c231&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;&amp;lt; if [[ -n $GRAILS_OPTS ]]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gs"&gt;---&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;&amp;gt; if [ -n $GRAILS_OPTS ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;明日からまた&lt;a href="http://d.hatena.ne.jp/keyword/Grails" class="keyword"&gt;Grails&lt;/a&gt;で遊び倒そう。&lt;/p&gt;</description></item><item><title>hatena.vimが便利</title><link>https://genzouw.com/entry/2010/04/19/214933/245/</link><pubDate>Mon, 19 Apr 2010 21:49:33 +0900</pubDate><guid>https://genzouw.com/entry/2010/04/19/214933/245/</guid><description>&lt;p&gt;会社の先輩に&lt;a href="http://d.hatena.ne.jp/keyword/Unix" class="keyword"&gt;Unix&lt;/a&gt;系に詳しい方がいる。最近はその方からちょこちょこ&lt;a href="http://d.hatena.ne.jp/keyword/Unix" class="keyword"&gt;Unix&lt;/a&gt;の技術を教えてもらっている。&lt;/p&gt;&#10;&lt;p&gt;その方が「&lt;a href="http://d.hatena.ne.jp/keyword/vim" class="keyword"&gt;vim&lt;/a&gt;を使えないと&lt;a href="http://d.hatena.ne.jp/keyword/Unix" class="keyword"&gt;Unix&lt;/a&gt;使えてるとはいえないよね」ということを話していたのでできるだけ業務でも&lt;a href="http://d.hatena.ne.jp/keyword/vim" class="keyword"&gt;vim&lt;/a&gt;を使うように心がけている。&lt;/p&gt;&#10;&lt;p&gt;初めの一週間は苦痛以外のなにものでもない。なんだよこのわけのわからない&lt;a href="http://d.hatena.ne.jp/keyword/%A5%AD%A1%BC%A5%D0%A5%A4%A5%F3%A5%C9" class="keyword"&gt;キーバインド&lt;/a&gt;は！！とか思いながらも使う。&lt;br&gt;&#10;今二週間目だが、なんだか急にこの変態バインドに慣れ始めてきた。まだスムーズとは程遠いがなかなか悪くないと思えてきた。&lt;/p&gt;&#10;&lt;p&gt;ひさびさにはてな日記を書こうと思ったのだがこれを&lt;a href="http://d.hatena.ne.jp/keyword/vim" class="keyword"&gt;vim&lt;/a&gt;のプラグインでできないかと探したところ、ちょうど良いものを見つけた。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://tokyoenvious.xrea.jp/b/vim/hatena_vim.html"&gt;1 - VALUE DOMAIN:バリュードメイン&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これはいい！セットアップ手順は以下のサイトの方がわかりやすい。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/snaka72/20090124/1232801656"&gt;hatena.vimを導入してvimからはてなダイアリーを更新したメモ - 今日もスミマセン。&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;セットアップ後は&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;\he と入力すると、日付（YYYYMMDD形式）入力プロンプト起動&lt;/li&gt;&#10;&lt;li&gt;ここで指定した日時の&lt;a href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%C0%A5%A4%A5%A2%A5%EA%A1%BC" class="keyword"&gt;はてなダイアリー&lt;/a&gt;のエントリが&lt;a href="http://d.hatena.ne.jp/keyword/vim" class="keyword"&gt;vim&lt;/a&gt;で開かれる（なければ新規）&lt;/li&gt;&#10;&lt;li&gt;記述終わったら :w で保存すれば投稿される。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;これはいい！！！&lt;/p&gt;</description></item><item><title>hatena.vimの設定方法</title><link>https://genzouw.com/entry/2010/04/19/001112/246/</link><pubDate>Mon, 19 Apr 2010 00:11:12 +0900</pubDate><guid>https://genzouw.com/entry/2010/04/19/001112/246/</guid><description>&lt;p&gt;せっかくなのでインストール手順を&lt;a href="http://d.hatena.ne.jp/keyword/bash" class="keyword"&gt;bash&lt;/a&gt;スクリプト化してみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mkdir -p ~/.vim/hatena&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone git://github.com/motemen/hatena-vim.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp -r hatena-vim/* ~/.vim/hatena/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#34; for Hatena.vim&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;set runtimepath+=~/.vim/hatena&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;let g:hatena_user=\&amp;#39;&lt;/span&gt;genzouw&lt;span class="se"&gt;\&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt; &amp;gt;&amp;gt; ~/.vimrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;ldquo;genzouw&amp;quot;の部分には、自分のはてなアカウントを指定すればOK。&lt;/p&gt;</description></item><item><title>Ubuntuの「自動起動するアプリ」で記憶してしまった設定のクリアに毎度ハマる</title><link>https://genzouw.com/entry/2010/02/14/215228/247/</link><pubDate>Sun, 14 Feb 2010 21:52:28 +0900</pubDate><guid>https://genzouw.com/entry/2010/02/14/215228/247/</guid><description>&lt;p&gt;タイトルどおり。ちゃんとメモしておかないのでこういうことになる。&lt;/p&gt;&#10;&lt;p&gt;Ubuntu9.10にて。メニューの「システム」-&amp;gt;「設定」-&amp;gt;「自動起動するアプリ」にて、現在使用中のアプリの記憶や、ログアウト時に記憶を設定してしまったときの対処。&lt;/p&gt;&#10;&lt;p&gt;以下のコマンドを実行してやればOK。 &lt;strong&gt;（設定の有効化はGUIでできて、設定の無効化はGUIでできないっていうのがどうなのか。）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rm -rf ~/.config/gnome-session/saved-session/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>junit.swingui.TestRunnerはとっくになくなっていた。</title><link>https://genzouw.com/entry/2010/02/14/164019/248/</link><pubDate>Sun, 14 Feb 2010 16:40:19 +0900</pubDate><guid>https://genzouw.com/entry/2010/02/14/164019/248/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/keyword/junit" class="keyword"&gt;junit&lt;/a&gt;.swingui.TestRunnerを使用して&lt;a href="http://d.hatena.ne.jp/keyword/JUnit" class="keyword"&gt;JUnit&lt;/a&gt;のテストクラスを実行しようとしてハマる。&lt;/p&gt;&#10;&lt;p&gt;こちらに書いてあるとおり（&lt;a href="http://junit.sourceforge.net/"&gt;JUnit&lt;/a&gt;）、JUnit4.xからは&lt;a href="http://d.hatena.ne.jp/keyword/GUI" class="keyword"&gt;GUI&lt;/a&gt;版のTestRunnerはなくなりました。&lt;/p&gt;</description></item><item><title>Rhino実行環境構築からJavaのcommons-langライブラリを呼び出してみる</title><link>https://genzouw.com/entry/2010/02/08/004409/249/</link><pubDate>Mon, 08 Feb 2010 00:44:09 +0900</pubDate><guid>https://genzouw.com/entry/2010/02/08/004409/249/</guid><description>&lt;p&gt;以下のフレームワークを使用した開発が一段落した。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://www.igapyon.jp/blanco/blanco.ja.html"&gt;blanco Framework&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;次の案件の調査開始。&lt;br&gt;&#10;&lt;a href="http://www.intra-mart.jp/"&gt;intra-mart&lt;/a&gt; というサーバサイドJavaScriptのパッケージカスタマイズ。&lt;/p&gt;&#10;&lt;p&gt;クライアントサイドもJavaScriptでゴリゴリコーディング。&#10;いっそ開発支援用のスクリプトもJavaScriptで書いてしまおうとRhinoをセットアップ。&lt;/p&gt;&#10;&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://www.mozilla-japan.org/Rhino/download.html"&gt;Rhino のダウンロード&lt;/a&gt; から、Rhinoのパッケージをダウンロード。&#10;解凍したフォルダ内のjs.jarを適当な場所に置くのだが、Groovyに似せて &lt;code&gt;~/.rhino/lib&lt;/code&gt; に配置してみた。&lt;/p&gt;&#10;&lt;p&gt;加えてパスの通った場所に以下のようなBashスクリプトを配置。&lt;/p&gt;&#10;&lt;h3 id="rhino"&gt;rhino&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;rhino&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;libs=&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;for f in $(\ls ~/.rhino/lib/*.jar); do&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; libs=$libs:$f&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;done&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;java -cp $libs org.mozilla.javascript.tools.shell.Main &amp;#34;${@}&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;755&lt;/span&gt; rhino&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行"&gt;実行&lt;/h2&gt;&#10;&lt;p&gt;早速実行してみる。&lt;/p&gt;&#10;&lt;h3 id="test1js"&gt;test1.js&lt;/h3&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#!/usr/bin/env rhino&#10;print(&amp;#39;test&amp;#39;)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 先程作成した `rhino` スクリプトの引数にJavaScriptファイルを渡すと実行可能&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rhino test1.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 実行権限を付与すれば、ファイルを指定して実行可能&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;700&lt;/span&gt; ./test1.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./test1.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;おお！思った以上に実行速度が早くてびっくりした。&lt;/p&gt;&#10;&lt;h2 id="commons-lang-を呼んでみる"&gt;&lt;code&gt;commons-lang&lt;/code&gt; を呼んでみる。&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;commons-lang&lt;/code&gt; も呼んでみる。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;まずはjarをダウンロード&lt;/li&gt;&#10;&lt;li&gt;ゲットした &lt;code&gt;commons-lang-2.4.jar&lt;/code&gt; を &lt;code&gt;~/.rhino/lib&lt;/code&gt; ディレクトリに配置&lt;/li&gt;&#10;&lt;li&gt;以下のようなスクリプトを作成し、実行してみる。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="test2js"&gt;test2.js&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env rhino&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;importPackage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;Packages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;org&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;apache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;commons&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;3&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;StringUtils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rhino test2.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1:2:3&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;700&lt;/span&gt; ./test2.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./test2.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;1:2:3&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あ、結構いいかも。気に入ってきた。&lt;/p&gt;</description></item><item><title>commons-emailって便利だね</title><link>https://genzouw.com/entry/2010/02/01/225423/250/</link><pubDate>Mon, 01 Feb 2010 22:54:23 +0900</pubDate><guid>https://genzouw.com/entry/2010/02/01/225423/250/</guid><description>&lt;p&gt;勉強不足で知らなかった。以前の&lt;strong&gt;関西Groovy勉強会で&lt;/strong&gt;id:kiy0takaさんがcommons-&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/vfs"&gt;vfs&lt;/a&gt;を利用したプログラムを書いているという話をしてくれた。commonsについて勉強不足だったので、今日時間ができたので調べてみる。&lt;/p&gt;&#10;&lt;p&gt;便利なクラスいっぱいだ。メール管理クラスがあったので、Groovyでラッピングして&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Gmail"&gt;Gmail&lt;/a&gt;専用クラスを作成してみた。&lt;/p&gt;&#10;&lt;p&gt;Grape使用なのでjarファイルは不要。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3&gt;使い方&lt;/h3&gt;&#10;&lt;p&gt;下記のいずれかで。&lt;/p&gt;&#10;&lt;ol&gt;&lt;li&gt;&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%B4%C4%B6%AD%CA%D1%BF%F4"&gt;環境変数&lt;/a&gt;&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/CLASSPATH"&gt;CLASSPATH&lt;/a&gt;の通ったディレクトリに&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Gmail"&gt;Gmail&lt;/a&gt;.groovyを配置する。&lt;/li&gt;&#10;&lt;li&gt;groovyコマンドのcpオプションで&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Gmail"&gt;Gmail&lt;/a&gt;.groovy配置フォルダを指定する。&lt;/li&gt;&#10;&lt;/ol&gt;&lt;div class="section"&gt;&#10;&lt;h4&gt;&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Gmail"&gt;Gmail&lt;/a&gt;.groovy&lt;/h4&gt;&#10;&lt;pre class="code lang-groovy" data-lang="groovy" data-unlink&gt;&lt;span class="synComment"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;span class="synPreProc"&gt;import&lt;/span&gt; org.apache.commons.mail.*&#10;&lt;span class="synPreProc"&gt;import&lt;/span&gt; javax.mail.*&#10;&lt;span class="synPreProc"&gt;import&lt;/span&gt; javax.mail.internet.*&#10;@Grab(group=&lt;span class="synConstant"&gt;'org.apache.commons'&lt;/span&gt;, module=&lt;span class="synConstant"&gt;'commons-email'&lt;/span&gt;, version=&lt;span class="synConstant"&gt;'1.2'&lt;/span&gt;)&#10;&lt;span class="synType"&gt;class&lt;/span&gt; Gmail{&#10;&lt;span class="synType"&gt;String&lt;/span&gt; acount&#10;&lt;span class="synType"&gt;String&lt;/span&gt; password&#10;&lt;span class="synType"&gt;String&lt;/span&gt; charset = &lt;span class="synConstant"&gt;"UTF-8"&lt;/span&gt;&#10;&lt;span class="synSpecial"&gt;def&lt;/span&gt; send( &lt;span class="synType"&gt;String&lt;/span&gt; subject, &lt;span class="synType"&gt;String&lt;/span&gt; message, &lt;span class="synType"&gt;List&lt;/span&gt;&amp;lt;&lt;span class="synType"&gt;String&lt;/span&gt;&amp;gt; to, &lt;span class="synType"&gt;List&lt;/span&gt;&amp;lt;&lt;span class="synType"&gt;String&lt;/span&gt;&amp;gt; cc = [], &lt;span class="synType"&gt;List&lt;/span&gt;&amp;lt;&lt;span class="synType"&gt;String&lt;/span&gt;&amp;gt; bcc = [] ){&#10;&lt;span class="synSpecial"&gt;def&lt;/span&gt; email = &lt;span class="synStatement"&gt;new&lt;/span&gt; SimpleEmail(&#10;&lt;span class="synStatement"&gt; subject&lt;/span&gt;:subject,&#10;&lt;span class="synStatement"&gt; msg&lt;/span&gt;:message,&#10;&lt;span class="synStatement"&gt; from&lt;/span&gt;:&lt;span class="synType"&gt;this&lt;/span&gt;.acount,&#10;&lt;span class="synStatement"&gt; to&lt;/span&gt;:to.&lt;span class="synIdentifier"&gt;collect&lt;/span&gt;{ &lt;span class="synStatement"&gt;new&lt;/span&gt; InternetAddress(it) },&#10;&lt;span class="synStatement"&gt; ssl&lt;/span&gt;:&lt;span class="synConstant"&gt;true&lt;/span&gt;,&#10;&lt;span class="synStatement"&gt; hostName&lt;/span&gt;:&lt;span class="synConstant"&gt;"smtp.gmail.com"&lt;/span&gt;,&#10;&lt;span class="synStatement"&gt; sslSmtpPort&lt;/span&gt;:&lt;span class="synConstant"&gt;465&lt;/span&gt;,&#10;&lt;span class="synStatement"&gt; charset&lt;/span&gt;:&lt;span class="synType"&gt;this&lt;/span&gt;.charset&#10;)&#10;&lt;span class="synStatement"&gt;if&lt;/span&gt;( cc )&#10;email.cc = cc.&lt;span class="synIdentifier"&gt;collect&lt;/span&gt;{ &lt;span class="synStatement"&gt;new&lt;/span&gt; InternetAddress(it) }&#10;&lt;span class="synStatement"&gt;if&lt;/span&gt;( bcc )&#10;email.bcc = bcc.&lt;span class="synIdentifier"&gt;collect&lt;/span&gt;{ &lt;span class="synStatement"&gt;new&lt;/span&gt; InternetAddress(it) }&#10;email.setAuthentication(&lt;span class="synType"&gt;this&lt;/span&gt;.acount, &lt;span class="synType"&gt;this&lt;/span&gt;.password)&#10;email.send()&#10;}&#10;}&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4&gt;Sample.groovy&lt;/h4&gt;&#10;&lt;pre class="code lang-groovy" data-lang="groovy" data-unlink&gt;&lt;span class="synComment"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; Gmail(&#10;&lt;span class="synStatement"&gt; acount&lt;/span&gt;:&lt;span class="synConstant"&gt;"xxxxx@gmail.com"&lt;/span&gt;,&#10;&lt;span class="synStatement"&gt; password&lt;/span&gt;:&lt;span class="synConstant"&gt;"yyyyy"&lt;/span&gt;,&#10;).send(&#10;&lt;span class="synConstant"&gt;"件名"&lt;/span&gt;,&#10;&lt;span class="synConstant"&gt;"本文"&lt;/span&gt;,&#10;[&lt;span class="synConstant"&gt;"zzzzz@softbank.ne.jp"&lt;/span&gt;],&#10;)&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4&gt;補足&lt;/h4&gt;&#10;&lt;p&gt;&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%CA%B8%BB%FA%A5%B3%A1%BC%A5%C9"&gt;文字コード&lt;/a&gt;をかえたい場合には、&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Gmail"&gt;Gmail&lt;/a&gt;クラスの&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%B9%A5%C8%A5%E9%A5%AF%A5%BF"&gt;コンストラクタ&lt;/a&gt;に「charset:"変更したいコード"」の引数を追加すればOK。&lt;/p&gt;</description></item><item><title>BashのTab補完機能で大文字小文字を区別させなくする方法</title><link>https://genzouw.com/entry/2010/02/01/203836/251/</link><pubDate>Mon, 01 Feb 2010 20:38:36 +0900</pubDate><guid>https://genzouw.com/entry/2010/02/01/203836/251/</guid><description>&lt;p&gt;もっと早く知っていればよかったです。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;$HOME/.inputrc&lt;/code&gt; に以下の一行を追加すると、Bash操作中にTabを押した場合の補完で大文字小文字を区別なくなります。&lt;/p&gt;&#10;&lt;h2 id="homeinputrc"&gt;&lt;code&gt;$HOME/.inputrc&lt;/code&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;set&lt;/span&gt; completion-ignore-case on&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のコマンドをターミナルに貼り付けて実行すればすぐに追記できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cat &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39; &amp;gt;~/.inputrc&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;set completion-ignore-case on&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>素数を求める</title><link>https://genzouw.com/entry/2010/02/01/145203/252/</link><pubDate>Mon, 01 Feb 2010 14:52:03 +0900</pubDate><guid>https://genzouw.com/entry/2010/02/01/145203/252/</guid><description>&lt;p&gt;&lt;a href="http://hisasann.com/housetect/2010/01/_-_javascript.html"&gt;エラトステネスの篩 - JavaScript版 at HouseTect, JavaScriptな情報をあなたに&lt;/a&gt; をGroovyで。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;findAllPrime&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;primeList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;primeList&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;primeList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="o"&gt;()**&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;checkNum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;primeList&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;checkNum&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;checkNum&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;primeList&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;findAllPrime&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;findAllPrime&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;findAllPrime&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今日は仕事休み。長い間たまった振替休日を消化。&lt;/p&gt;</description></item><item><title>Grails1.2のテスト実行用サーバーがTomcat</title><link>https://genzouw.com/entry/2010/02/01/135929/253/</link><pubDate>Mon, 01 Feb 2010 13:59:29 +0900</pubDate><guid>https://genzouw.com/entry/2010/02/01/135929/253/</guid><description>&lt;p&gt;&lt;a href="http://www.matsuaz.com/matsumotojs/2010/01/20/1263920819063.html"&gt;Matsumoto.JS - Grails: サーバ環境（Tomcatプラグイン）&lt;/a&gt;より。&lt;br&gt;&#10;jettyから&lt;a href="http://d.hatena.ne.jp/keyword/Tomcat" class="keyword"&gt;Tomcat&lt;/a&gt;に変わったんですね。起動が重くなっていないかだけ心配。&lt;/p&gt;</description></item><item><title>Gradle勉強中</title><link>https://genzouw.com/entry/2010/01/30/223823/254/</link><pubDate>Sat, 30 Jan 2010 22:38:23 +0900</pubDate><guid>https://genzouw.com/entry/2010/01/30/223823/254/</guid><description>&lt;p&gt;最近Gradle勉強中です。&lt;br /&gt;&#10;僕はそもそも&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/Maven"&gt;Maven&lt;/a&gt;やIvyもよく分かっていないのですが、無理やり飛び級してみました。&lt;br /&gt;&#10;今はドキュメント読み進め中です。英語不得意なのでなかなか進まない。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3&gt;Gradleのセットアップ&lt;/h3&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/nobeans/20091104/1257344374"&gt;Groovy&amp;#x30D9;&amp;#x30FC;&amp;#x30B9;&amp;#x306E;&amp;#x30D3;&amp;#x30EB;&amp;#x30C9;&amp;#x7BA1;&amp;#x7406;&amp;#x30C4;&amp;#x30FC;&amp;#x30EB;Gradle&amp;#x3092;&amp;#x4F7F;&amp;#x3063;&amp;#x3066;&amp;#x307F;&amp;#x308B; - &amp;#x8C46;&amp;#x7121;&amp;#x65E5;&amp;#x8A18;&lt;/a&gt;がとてもわかりやすい。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3&gt;Gradleのプロジェクト作成スクリプト&lt;/h3&gt;&#10;&lt;p&gt;$GRADLE_HOME/samples/groovy/quickstart&lt;br /&gt;&#10;のフォルダをどこかにコピーして、リネームするとGroovyのプロジェクトが完成。&lt;br /&gt;&#10;この方法でもよいが、Groovyプロジェクト作成スクリプトも作成してみた。&lt;br /&gt;&#10;PATHの通った場所において、&lt;/p&gt;&#10;&lt;pre class="code lang-" data-lang="" data-unlink&gt;groovy mkpjGradle.groovy testproject&lt;/pre&gt;&lt;p&gt;でOK。（testprojectの部分には、自分のプロジェクト名を入力。）&lt;br /&gt;&#10;カレントディレクトリ以下にプロジェクトフォルダが作成される。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4&gt;mkpjGradle.groovy&lt;/h4&gt;&#10;&lt;pre class="code lang-groovy" data-lang="groovy" data-unlink&gt;&lt;span class="synComment"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;span class="synSpecial"&gt;def&lt;/span&gt; error = &lt;span class="synConstant"&gt;null&lt;/span&gt;;&#10;&lt;span class="synStatement"&gt;try&lt;/span&gt;{&#10;&lt;span class="synStatement"&gt;if&lt;/span&gt;( args.&lt;span class="synIdentifier"&gt;size&lt;/span&gt;() &amp;lt;= &lt;span class="synConstant"&gt;0&lt;/span&gt; ){&#10;error = &lt;span class="synConstant"&gt;1&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;throw&lt;/span&gt; &lt;span class="synStatement"&gt;new&lt;/span&gt; &lt;span class="synStatement"&gt;Exception&lt;/span&gt;(&lt;span class="synConstant"&gt;&amp;quot;Parameter args[0] is not set.&amp;quot;&lt;/span&gt;);&#10;}&#10;&lt;span class="synSpecial"&gt;def&lt;/span&gt; projectHome = &lt;span class="synStatement"&gt;new&lt;/span&gt; File(args[&lt;span class="synConstant"&gt;0&lt;/span&gt;])&#10;&lt;span class="synStatement"&gt;if&lt;/span&gt;( projectHome.exists() ){&#10;error = &lt;span class="synConstant"&gt;2&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;throw&lt;/span&gt; &lt;span class="synStatement"&gt;new&lt;/span&gt; &lt;span class="synStatement"&gt;Exception&lt;/span&gt;(&lt;span class="synConstant"&gt;&amp;quot;Directory is exists.&amp;quot;&lt;/span&gt;);&#10;}&#10;&lt;span class="synIdentifier"&gt;print&lt;/span&gt; &lt;span class="synConstant"&gt;&amp;quot;Please input Groovy Version to want to use(default &lt;/span&gt;&lt;span class="synIdentifier"&gt;${GroovySystem.version}&lt;/span&gt;&lt;span class="synConstant"&gt;):&amp;quot;&lt;/span&gt;&#10;&lt;span class="synSpecial"&gt;def&lt;/span&gt; groovyVersion = System.&lt;span class="synSpecial"&gt;in&lt;/span&gt;.&lt;span class="synIdentifier"&gt;newReader&lt;/span&gt;().readLine()?:GroovySystem.version&#10;&lt;span class="synStatement"&gt;if&lt;/span&gt;( !(groovyVersion ==~ /^\d\.\d\.\d$/) ){&#10;error = &lt;span class="synConstant"&gt;3&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;throw&lt;/span&gt; &lt;span class="synStatement"&gt;new&lt;/span&gt; &lt;span class="synStatement"&gt;Exception&lt;/span&gt;(&lt;span class="synConstant"&gt;&amp;quot;Groovy Version is invalid.&amp;quot;&lt;/span&gt;);&#10;}&#10;&lt;span class="synIdentifier"&gt;print&lt;/span&gt; &lt;span class="synConstant"&gt;&amp;quot;Please input Project Version(default 1.0.0):&amp;quot;&lt;/span&gt;&#10;&lt;span class="synSpecial"&gt;def&lt;/span&gt; projectVersion = System.&lt;span class="synSpecial"&gt;in&lt;/span&gt;.&lt;span class="synIdentifier"&gt;newReader&lt;/span&gt;().readLine()?:&lt;span class="synConstant"&gt;&amp;quot;1.0.0&amp;quot;&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;if&lt;/span&gt;( !(projectVersion ==~ /^\d\.\d\.\d$/) ){&#10;error = &lt;span class="synConstant"&gt;4&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;throw&lt;/span&gt; &lt;span class="synStatement"&gt;new&lt;/span&gt; &lt;span class="synStatement"&gt;Exception&lt;/span&gt;(&lt;span class="synConstant"&gt;&amp;quot;Project Version is invalid.&amp;quot;&lt;/span&gt;);&#10;}&#10;projectHome.mkdirs()&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; File(&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;${projectHome}&lt;/span&gt;&lt;span class="synConstant"&gt;/build.gradle&amp;quot;&lt;/span&gt;).&lt;span class="synIdentifier"&gt;write&lt;/span&gt; &lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&amp;quot;\&lt;/span&gt;&#10;usePlugin(&lt;span class="synConstant"&gt;&amp;quot;groovy&amp;quot;&lt;/span&gt;)&#10;sourceCompatibility = &lt;span class="synConstant"&gt;1.6&lt;/span&gt;&#10;version = &lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;${projectVersion}&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&#10;repositories {&#10;flatDir(dirs: &lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synError"&gt;\$&lt;/span&gt;&lt;span class="synConstant"&gt;rootDir/lib&amp;quot;&lt;/span&gt;)&#10;mavenCentral()&#10;}&#10;dependencies {&#10;groovy &lt;span class="synConstant"&gt;&amp;quot;org.codehaus.groovy:groovy:&lt;/span&gt;&lt;span class="synIdentifier"&gt;${groovyVersion}&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&#10;testCompile &lt;span class="synConstant"&gt;&amp;quot;junit:junit:4.8.1&amp;quot;&lt;/span&gt;&#10;}&#10;task jarWithZipFileSet(type : Jar){&#10;zipFileSet(dir: &lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synError"&gt;\$&lt;/span&gt;&lt;span class="synConstant"&gt;rootDir/lib&amp;quot;&lt;/span&gt;)&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; File(&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synError"&gt;\$&lt;/span&gt;&lt;span class="synConstant"&gt;rootDir/build/classes&amp;quot;&lt;/span&gt;).listFiles().&lt;span class="synIdentifier"&gt;findAll&lt;/span&gt;{ it.directory }.&lt;span class="synIdentifier"&gt;each&lt;/span&gt;{&#10;zipFileSet(dir: it.path)&#10;}&#10;}&#10;&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; File(&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;${projectHome}&lt;/span&gt;&lt;span class="synConstant"&gt;/src/main/java&amp;quot;&lt;/span&gt;).mkdirs()&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; File(&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;${projectHome}&lt;/span&gt;&lt;span class="synConstant"&gt;/src/main/groovy&amp;quot;&lt;/span&gt;).mkdirs()&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; File(&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;${projectHome}&lt;/span&gt;&lt;span class="synConstant"&gt;/src/main/resources&amp;quot;&lt;/span&gt;).mkdirs()&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; File(&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;${projectHome}&lt;/span&gt;&lt;span class="synConstant"&gt;/src/test/java&amp;quot;&lt;/span&gt;).mkdirs()&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; File(&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;${projectHome}&lt;/span&gt;&lt;span class="synConstant"&gt;/src/test/groovy&amp;quot;&lt;/span&gt;).mkdirs()&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; File(&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;${projectHome}&lt;/span&gt;&lt;span class="synConstant"&gt;/src/test/resources&amp;quot;&lt;/span&gt;).mkdirs()&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; File(&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;${projectHome}&lt;/span&gt;&lt;span class="synConstant"&gt;/lib&amp;quot;&lt;/span&gt;).mkdirs()&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; File(&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;${projectHome}&lt;/span&gt;&lt;span class="synConstant"&gt;/bin&amp;quot;&lt;/span&gt;).mkdirs()&#10;showreports = &lt;span class="synStatement"&gt;new&lt;/span&gt; File(&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&lt;span class="synIdentifier"&gt;${projectHome}&lt;/span&gt;&lt;span class="synConstant"&gt;/bin/showreports&amp;quot;&lt;/span&gt;)&#10;showreports.&lt;span class="synIdentifier"&gt;write&lt;/span&gt; &lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&amp;quot;\&lt;/span&gt;&#10;&lt;span class="synComment"&gt;#!/bin/bash&lt;/span&gt;&#10;firefox build/reports/tests/index.html &amp;amp;&#10;&lt;span class="synConstant"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&#10;showreports.executable = &lt;span class="synConstant"&gt;true&lt;/span&gt;&#10;&lt;span class="synIdentifier"&gt;println&lt;/span&gt; &lt;span class="synConstant"&gt;&amp;quot;SUCCESSFUL&amp;quot;&lt;/span&gt;&#10;} &lt;span class="synStatement"&gt;catch&lt;/span&gt; (&lt;span class="synStatement"&gt;Exception&lt;/span&gt; e){&#10;&lt;span class="synIdentifier"&gt;println&lt;/span&gt; &lt;span class="synConstant"&gt;&amp;quot;FAILURE:&lt;/span&gt;&lt;span class="synIdentifier"&gt;${e.message}&lt;/span&gt;&lt;span class="synConstant"&gt;&amp;quot;&lt;/span&gt;&#10;System.exit(error?:&lt;span class="synConstant"&gt;99&lt;/span&gt;)&#10;}&#10;&lt;/pre&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3&gt;使ってみた感想&lt;/h3&gt;&#10;&lt;p&gt;作成したGroovyスクリプトをプロジェクトメンバーに公開するのは、実行環境のセットアップなどの問題で難しかったりする。でもGradleで&lt;a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%CB%A5%D5%A5%A7%A5%B9%A5%C8"&gt;マニフェスト&lt;/a&gt;付jarで提供できるとそういう問題も解決かな？と思ってみている。&lt;/p&gt;</description></item><item><title>Power Assertを試してみる</title><link>https://genzouw.com/entry/2010/01/21/222525/255/</link><pubDate>Thu, 21 Jan 2010 22:25:25 +0900</pubDate><guid>https://genzouw.com/entry/2010/01/21/222525/255/</guid><description>&lt;p&gt;Groovy1.7から導入された&lt;strong&gt;Power Assert&lt;/strong&gt;を試してみた。&lt;/p&gt;&#10;&lt;p&gt;これによりassertによる検証エラーが発生した場合の式の状態が詳細に表示され、問題の原因を素早く特定できる。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="まずは実行"&gt;まずは実行&lt;/h3&gt;&#10;&lt;p&gt;assertを利用した簡単なコードを記述する。&lt;/p&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h4 id="testgroovy"&gt;test.groovy&lt;/h4&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;#!/usr/bin/env groovy&#10;def list = [1, 3, 4, 5, 2]&#10;assert 5 == list.max() - 1&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ほいで実行。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;750&lt;/span&gt; test.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./test.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Caught: Assertion failed:&#10;assert 5 == list.max() - 1&#10;| | | |&#10;| | 5 4&#10;| [1, 3, 4, 5, 2]&#10;false&#10;at test.run(test.groovy:3)&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これはわかりやすい。ただ、いくつか疑問点が浮かんできた。&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&#10;&lt;div class="section"&gt;&#10;&lt;h3 id="javaコマンドから実行した場合は"&gt;&lt;a href="http://d.hatena.ne.jp/keyword/java" class="keyword"&gt;java&lt;/a&gt;コマンドから実行した場合は？&lt;/h3&gt;&#10;&lt;p&gt;groovycでコンパイルしたクラスファイルを&lt;a href="http://d.hatena.ne.jp/keyword/java" class="keyword"&gt;java&lt;/a&gt;コマンドで呼び出してもちゃんと表示されるのか？&lt;br&gt;&#10;と思ったので試してみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovyc test.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ java -cp &lt;span class="nv"&gt;$GROOVY_HOME&lt;/span&gt;/embeddable/groovy-all-1.7.0.jar:. &lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Exception in thread &lt;span class="s2"&gt;&amp;#34;main&amp;#34;&lt;/span&gt; Assertion failed:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;assert &lt;span class="nv"&gt;5&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; list.max&lt;span class="o"&gt;()&lt;/span&gt; - &lt;span class="m"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;1, 3, 4, 5, 2&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at org.codehaus.groovy.runtime.InvokerHelper.assertFailed&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:378&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.assertFailed&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:662&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at test.run&lt;span class="o"&gt;(&lt;/span&gt;test.groovy:3&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:88&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:233&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:1058&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:886&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:743&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:726&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at org.codehaus.groovy.runtime.InvokerHelper.runScript&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:386&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at org.codehaus.groovy.runtime.InvokerHelper&lt;span class="nv"&gt;$runScript&lt;/span&gt;.call&lt;span class="o"&gt;(&lt;/span&gt;Unknown Source&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall&lt;span class="o"&gt;(&lt;/span&gt;CallSiteArray.java:40&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call&lt;span class="o"&gt;(&lt;/span&gt;AbstractCallSite.java:117&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call&lt;span class="o"&gt;(&lt;/span&gt;AbstractCallSite.java:129&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at test.main&lt;span class="o"&gt;(&lt;/span&gt;test.groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;groovyコマンドで実行した場合と表示される例外文の量に違いはあるが、Power Assertの解析結果はちゃんと表示されている。&lt;a href="http://d.hatena.ne.jp/keyword/java" class="keyword"&gt;java&lt;/a&gt;にも欲しい。&lt;/p&gt;</description></item><item><title>GroovyやるならこのRSSは重要</title><link>https://genzouw.com/entry/2010/01/21/215143/256/</link><pubDate>Thu, 21 Jan 2010 21:51:43 +0900</pubDate><guid>https://genzouw.com/entry/2010/01/21/215143/256/</guid><description>&lt;p&gt;いつもちょっとしたひとことばっかりだけど、かなりためになる情報多し。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://friendfeed.com/nobeans"&gt;nobeans - FriendFeed&lt;/a&gt;&lt;/p&gt;</description></item><item><title>blancoValueObject セットアップと実行用Groovyスクリプト</title><link>https://genzouw.com/entry/2010/01/18/071822/257/</link><pubDate>Mon, 18 Jan 2010 07:18:22 +0900</pubDate><guid>https://genzouw.com/entry/2010/01/18/071822/257/</guid><description>&lt;p&gt;プロジェクトで &lt;a href="https://ja.osdn.net/projects/blancofw/"&gt;blancoValueObject&lt;/a&gt; というコード自動生成のフレームワークを使用することとなった。&#10;セットアップ手順と実行を用意にするためのGroovyスクリプトを作成した。&lt;/p&gt;&#10;&lt;h2 id="前提"&gt;前提&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;以下の実行環境が必要&#10;&lt;ul&gt;&#10;&lt;li&gt;Bash実行可能&lt;/li&gt;&#10;&lt;li&gt;Ant実行可能&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;&#10;&lt;p&gt;以下のコマンドを実行（ここではsvnリポジトリのコードを~/projects/blancoValueObjectにチェックアウト）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;svn checkout &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; http://svn.sourceforge.jp/svnroot/blancofw/blancoValueObject/trunk &lt;span class="se"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ~/projects/blancoValueObject&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/blancoValueObject&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ant&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp lib/*.jar ~/.groovy/lib/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp lib.ant/*.jar ~/.groovy/lib/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行用groovyスクリプト"&gt;実行用Groovyスクリプト&lt;/h2&gt;&#10;&lt;p&gt;以下のスクリプトをどこか環境変数 &lt;code&gt;PATH&lt;/code&gt; の通った場所に配置。&lt;/p&gt;&#10;&lt;p&gt;実行する際には&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ blancovalueobject.groovy &amp;lt;エクセル配置ディレクトリ&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;または&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ blancovalueobject.groovy &amp;lt;エクセル配置ディレクトリ&amp;gt; &amp;lt;文字コード&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;で実行すると、OSごとの一時フォルダのtargetディレクトリ内にBeanのコードが生成される。&#10;エクセルのBean定義書テンプレートはmeta/templateディレクトリ下にあるようなのでこれを適当に記述して &lt;code&gt;&amp;lt;エクセル配置ディレクトリ&amp;gt;&lt;/code&gt; に突っ込んで実行。&lt;/p&gt;&#10;&lt;h3 id="blancovalueobjectgroovy"&gt;blancovalueobject.groovy&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;ant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AntBuilder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;taskdef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blancovalueobject&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;classname:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;blanco.valueobject.task.BlancoValueObjectTask&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;TMP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;java.io.tmpdir&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;targetdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${TMP}/blancovalueobject/target&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;targetdir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mkdir&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;dir:&lt;/span&gt; &lt;span class="n"&gt;targetdir&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;tmpdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${TMP}/blancovalueobject/tmp&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;tmpdir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mkdir&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;dir:&lt;/span&gt; &lt;span class="n"&gt;tmpdir&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;blancovalueobject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;metadir:&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./meta&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;encoding:&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;file.encoding&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;targetdir:&lt;/span&gt; &lt;span class="n"&gt;targetdir&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;tmpdir:&lt;/span&gt; &lt;span class="n"&gt;tmpdir&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;こちらのフレームワーク、ちょっと苦手。エクセルからBeanを生成することで、必ずドキュメントが残るというものだが、エクセルに情報を記述するのが面倒です。コード読めない人はそもそもBean情報を定義されているエクセル読まないだろうし。Groovyなら、フィールド記述とjavadocで20行程度で収まるんだろうなぁ。javadoc生成したらドキュメント二重になるし。&lt;/p&gt;</description></item><item><title>groovy-1.7に置き換えたらいきなり最適解を見つけ出してあせった</title><link>https://genzouw.com/entry/2010/01/13/213844/258/</link><pubDate>Wed, 13 Jan 2010 21:38:44 +0900</pubDate><guid>https://genzouw.com/entry/2010/01/13/213844/258/</guid><description>&lt;p&gt;groovy-1.7がリリースされてしばらく立ちました。&lt;br&gt;&#10;仕事でばたばたしていたので数日前に置き換えたのだけは覚えている。windows、&lt;a href="http://d.hatena.ne.jp/keyword/linux" class="keyword"&gt;linux&lt;/a&gt;いずれも/usr/share/groovyに&lt;a href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%DC%A5%EA%A5%C3%A5%AF%A5%EA%A5%F3%A5%AF" class="keyword"&gt;シンボリックリンク&lt;/a&gt;なひとなので、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;wget http://dist.groovy.codehaus.org/distributions/groovy-binary-1.7.0.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unzip groovy-binary-1.7.0.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mv groovy-1.7.0/ /usr/share/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /usr/share&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;unlink groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ln -s groovy-1.7.0 groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chmod &lt;span class="m"&gt;755&lt;/span&gt; /usr/share/groovy-1.7.0/bin/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;はい、セットアップ完了。早速試してみる。すると・・・あれ？なんか今までとエラーメッセージが違う。&lt;br&gt;&#10;例えば以下のようなコードを実行すると&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;abc&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;substrin&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今まではsubstrinってメソッドはないよ、といわれて終わっていた気がするが、以下のようなメッセージが。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Caught: groovy.lang.MissingMethodException: No signature of method: java.lang.String.substrin&lt;span class="o"&gt;()&lt;/span&gt; is applicable &lt;span class="k"&gt;for&lt;/span&gt; argument types: &lt;span class="o"&gt;(&lt;/span&gt;java.lang.Integer, java.lang.Integer&lt;span class="o"&gt;)&lt;/span&gt; values: &lt;span class="o"&gt;[&lt;/span&gt;2, 1&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Possible solutions: substring&lt;span class="o"&gt;(&lt;/span&gt;int, int&lt;span class="o"&gt;)&lt;/span&gt;, substring&lt;span class="o"&gt;(&lt;/span&gt;int&lt;span class="o"&gt;)&lt;/span&gt;, toString&lt;span class="o"&gt;()&lt;/span&gt;, toString&lt;span class="o"&gt;()&lt;/span&gt;, toString&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at test.run&lt;span class="o"&gt;(&lt;/span&gt;test.groovy:3&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;おお！！！なんか最適解っぽいの出してる！！！&lt;br&gt;&#10;substringの間違いじゃね？？とかいってくれてる！！！！&lt;br&gt;&#10;すごいぞ、1.7！&lt;/p&gt;</description></item><item><title>blancoPdfを使う</title><link>https://genzouw.com/entry/2010/01/06/005433/259/</link><pubDate>Wed, 06 Jan 2010 00:54:33 +0900</pubDate><guid>https://genzouw.com/entry/2010/01/06/005433/259/</guid><description>&lt;p&gt;仕事上、 &lt;a href="http://www.igapyon.jp/blanco/blancopdf.html"&gt;blancoPdf&lt;/a&gt; というpdf作成ライブラリを使用することになった。ようはiTextのラッパーライブラリなのであるが、基盤の偉い人がこれを使ってねということなので勉強してみる。&lt;/p&gt;&#10;&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://www.igapyon.jp/blanco/blancodownload.html#blancoPdf"&gt;blanco Framework: Download / ダウンロード&lt;/a&gt; からダウンロード。（antタスクというリンクをクリック。）&lt;/p&gt;&#10;&lt;p&gt;ダウンロード後、展開。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 展開&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ unzip blancoPdf-0.0.6-src.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; blancoPdf/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイルが存在するか確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ find . -type f -name *.jar&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;lib.antディレクトリにblancoPdfのjarが入っているっぽい。動作検証にgroovyでコードを書こうと思うので、$HOME/.groovy/libにコピー。&lt;/p&gt;&#10;&lt;p&gt;libディレクトリには関連jarファイル入っているっぽいのでここのjarファイルはすべてコピー。。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cp lib.ant/blancopdf-0.0.6.jar ~/.groovy/lib&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cp lib/*.jar ~/.groovy/lib&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="試してみる"&gt;試してみる&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;./test/src/blanco/pdf&lt;/code&gt; にサンプルコード( &lt;strong&gt;BlancoPdfReportTest.java&lt;/strong&gt; )があったので、拡張子を変え内容を若干変更して実行してみる。confフォルダがないと動かない作りになっているので、実行環境以下にtest/confフォルダを作成（別の場所から持ってきた）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cp BlancoPdfWriterTest.java BlancoPdfWriterTest.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir &lt;span class="nb"&gt;test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ cp -R ../../../../conf test/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="n"&gt;blanco&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pdf&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;blanco.pdf.font.BlancoPdfFontUtil&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;blanco.pdf.page.valueobject.BlancoPdfPageDef&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;blanco.pdf.valueobject.BlancoPdfMetrix&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.lowagie.text.pdf.BaseFont&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.lowagie.text.pdf.PdfContentByte&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;junit.framework.TestCase&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BlancoPdfWriterTest&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;TestCase&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;testBlancoPdfWriter&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tmp&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;mkdirs&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;BlancoPdfPageDef&lt;/span&gt; &lt;span class="n"&gt;pageDef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BlancoPdfPageDef&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;BlancoPdfWriter&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BlancoPdfWriter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pageDef&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FileOutputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;tmp/abc.pdf&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pdfSetting&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setConfPath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;test/conf/pdf&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;BaseFont&lt;/span&gt; &lt;span class="n"&gt;bf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;BlancoPdfFontUtil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFont&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pdfSetting&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;gothic&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;BlancoPdfMetrix&lt;/span&gt; &lt;span class="n"&gt;metrix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BlancoPdfMetrix&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;metrix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;colorText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;RED&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PdfContentByte&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ALIGN_LEFT&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;うそうそ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bf&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metrix&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;metrix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setLineDash&lt;/span&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kt"&gt;float&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;metrix&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;colorStroke&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;YELLOW&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawLine&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metrix&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newPage&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;drawText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PdfContentByte&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ALIGN_LEFT&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;うそうそ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bf&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metrix&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行。&lt;/p&gt;</description></item><item><title>cygwin 1.7.1リリース！UTF-8が使用可能に！</title><link>https://genzouw.com/entry/2010/01/05/124702/260/</link><pubDate>Tue, 05 Jan 2010 12:47:02 +0900</pubDate><guid>https://genzouw.com/entry/2010/01/05/124702/260/</guid><description>&lt;p&gt;タイトルのとおり、&lt;a href="http://d.hatena.ne.jp/keyword/cygwin" class="keyword"&gt;cygwin&lt;/a&gt; 1.7.1がリリースされました。2009/12/23付けなのですでに二週間もたっているが、早速会社のマシンにインストールして動作させてみた。&lt;/p&gt;&#10;&lt;p&gt;激しく感激！日本語のフォルダやファイルの表示に文字化けしない！&lt;br&gt;&#10;&lt;a href="http://d.hatena.ne.jp/keyword/svn" class="keyword"&gt;svn&lt;/a&gt;も&lt;a href="http://d.hatena.ne.jp/keyword/cygwin" class="keyword"&gt;cygwin&lt;/a&gt;組み込みのものがそのまま使える！（今まではSlikSvnを使用していた）&lt;/p&gt;&#10;&lt;p&gt;なんか日本語を含むファイルやフォルダへの&lt;a href="http://d.hatena.ne.jp/keyword/%A5%B7%A5%F3%A5%DC%A5%EA%A5%C3%A5%AF%A5%EA%A5%F3%A5%AF" class="keyword"&gt;シンボリックリンク&lt;/a&gt;作成の仕様がちょっと変わったみたい。&lt;br&gt;&#10;いままではwindowsのショートカットが作成されていたが、バイナリファイルになっている。こちらも&lt;a href="http://d.hatena.ne.jp/keyword/UTF-8" class="keyword"&gt;UTF-8&lt;/a&gt;対応のひとつなのかな。&lt;/p&gt;</description></item><item><title>cygwinでgroovyshを動かすためのオプション</title><link>https://genzouw.com/entry/2009/11/30/020214/261/</link><pubDate>Mon, 30 Nov 2009 02:02:14 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/30/020214/261/</guid><description>&lt;p&gt;何度かCygwin環境でGroovyshを動かそうと奮闘していたが、ようやく設定方法がわかった。&#10;今日Google先生に尋ねてみると、一番上に対応方法が記載したサイトが見つかった。Google アラートでも仕掛けておけばよかったかな。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://jira.codehaus.org/browse/GROOVY-2584"&gt;[#GROOVY-2584] Can&amp;rsquo;t get groovysh to run in a cygwin xterm under Windows XP. - jira.codehaus.org&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;以下のいずれかのコマンドにて起動すればＯＫみたい。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovysh --terminal&lt;span class="o"&gt;=&lt;/span&gt;unix&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovysh --terminal&lt;span class="o"&gt;=&lt;/span&gt;none&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そのうち遊んでみる。&lt;/p&gt;</description></item><item><title>CygwinでWindows環境にLinuxと同様のGroovy環境を構築するための設定</title><link>https://genzouw.com/entry/2009/11/26/080311/262/</link><pubDate>Thu, 26 Nov 2009 08:03:11 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/26/080311/262/</guid><description>&lt;p&gt;会社にてCygwinを使っているが、 「&lt;strong&gt;Groovy&lt;/strong&gt;」 が正常に動作しない。「Groovy」自体は &lt;code&gt;c:\Program Files\Groovy-1.6.5&lt;/code&gt; にインストールされているが、 &lt;code&gt;/usr/share/groovy&lt;/code&gt; にシンボリックリンクをはっている。&lt;/p&gt;&#10;&lt;p&gt;このままの状態で&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;あいう&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のようなUTF-8エンコードのファイルは実行できない。&lt;/p&gt;&#10;&lt;p&gt;以下の箇所を変更することで実行可能になる。&lt;/p&gt;&#10;&lt;h3 id="groovyファイル"&gt;groovyファイル&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="n"&gt;c20&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;startGroovy&lt;/span&gt; &lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ui&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;GroovyMain&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$@&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;---&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;startGroovy&lt;/span&gt; &lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ui&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;GroovyMain&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;UTF8&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$@&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="startgroovyファイル"&gt;startGroovyファイル&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;227c227&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt; &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; args&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;cygpath --path --ignore --mixed &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$arg&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt; &lt;span class="nb"&gt;eval&lt;/span&gt; &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; args&lt;span class="nv"&gt;$i&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;\&amp;#34;`cygpath --path --ignore --mixed &amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$arg&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;`\&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;後者はCygwin使用時の特有の現象（バグ？）&lt;/p&gt;</description></item><item><title>HudsonのGriffonプラグイン</title><link>https://genzouw.com/entry/2009/11/26/020214/263/</link><pubDate>Thu, 26 Nov 2009 02:02:14 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/26/020214/263/</guid><description>&lt;p&gt;HudsonでGriffonをビルドしようと奮闘しているところで、JUGGUG関西支部長id:kiy0takaさんが作ってくれました。&lt;/p&gt;&lt;br /&gt;&lt;/p&gt;&#10;&lt;p&gt;勝手に転載させてもらいます。（いいかな？）&lt;/p&gt;</description></item><item><title>HudsonでのGriffonプロジェクトのビルドがうまくいかない</title><link>https://genzouw.com/entry/2009/11/24/205159/264/</link><pubDate>Tue, 24 Nov 2009 20:51:59 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/24/205159/264/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2009/11/23/234928"&gt;GriffonのUnitTest、ビルド用のジョブを作成　その１ | ゲンゾウ用ポストイット&lt;/a&gt; のプロジェクトに以下のようにシェルスクリプトを記述した。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$WORKSPACE&lt;/span&gt;/griffon-test&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;$GRIFFON_HOME&lt;/span&gt;/bin/griffon package&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;昨日はダメだったが今度はうまくいくはず。で、ダメでした。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;+ /usr/share/griffon/bin/griffon package&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Welcome to Griffon 0.2 - http://griffon.codehaus.org/&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Licensed under Apache Standard License 2.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Griffon home is &lt;span class="nb"&gt;set&lt;/span&gt; to: /usr/share/griffon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Base Directory: /var/lib/hudson/jobs/griffon-test/workspace/griffon-test&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Running script /usr/share/griffon/scripts/Package.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Environment &lt;span class="nb"&gt;set&lt;/span&gt; to production&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Found events script in plugin css-builder-0.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; groovy.lang.MissingMethodException: No signature of method: groovy.util.ConfigObject.minus&lt;span class="o"&gt;()&lt;/span&gt; is applicable &lt;span class="k"&gt;for&lt;/span&gt; argument types: &lt;span class="o"&gt;(&lt;/span&gt;null&lt;span class="o"&gt;)&lt;/span&gt; values: &lt;span class="o"&gt;[&lt;/span&gt;null&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Application&lt;span class="nv"&gt;$_run_closure2&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;Application.groovy:7&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Application&lt;span class="nv"&gt;$_run_closure2&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;Application.groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Application.run&lt;span class="o"&gt;(&lt;/span&gt;Application.groovy:6&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at _GriffonPackage_groovy&lt;span class="nv"&gt;$_run_closure1&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;_GriffonPackage_groovy:72&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at _GriffonPackage_groovy&lt;span class="nv"&gt;$_run_closure1&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;_GriffonPackage_groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Package&lt;span class="nv"&gt;$_run_closure2&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;Package:55&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Package&lt;span class="nv"&gt;$_run_closure2&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;Package&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Package&lt;span class="nv"&gt;$_run_closure3&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;Package:71&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Package&lt;span class="nv"&gt;$_run_closure3&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;Package&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Package&lt;span class="nv"&gt;$_run_closure1&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;Package:33&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Package&lt;span class="nv"&gt;$_run_closure1&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;Package&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at gant.Gant&lt;span class="nv"&gt;$_dispatch_closure4&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;Gant.groovy:306&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at gant.Gant.dispatch&lt;span class="o"&gt;(&lt;/span&gt;Gant.groovy:316&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at gant.Gant.this&lt;span class="nv"&gt;$2$dispatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Gant.groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at gant.Gant.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;Gant.groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at gant.Gant.processTargets&lt;span class="o"&gt;(&lt;/span&gt;Gant.groovy:446&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at gant.Gant.processTargets&lt;span class="o"&gt;(&lt;/span&gt;Gant.groovy:430&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Failed to compile Application configuration file: No signature of method: groovy.util.ConfigObject.minus&lt;span class="o"&gt;()&lt;/span&gt; is applicable &lt;span class="k"&gt;for&lt;/span&gt; argument types: &lt;span class="o"&gt;(&lt;/span&gt;null&lt;span class="o"&gt;)&lt;/span&gt; values: &lt;span class="o"&gt;[&lt;/span&gt;null&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なかなか衝撃の結末。該当箇所( &lt;code&gt;Application.groovy:7&lt;/code&gt; )を見てみると、&lt;code&gt;griffon-test&lt;/code&gt; とかかれていた。プロジェクト作成直後から問題があったのね。プロジェクト名にハイフンいれるなってことか。どないしよ。&lt;/p&gt;</description></item><item><title>Hudsonのビルド通知にメールを設定</title><link>https://genzouw.com/entry/2009/11/24/204419/265/</link><pubDate>Tue, 24 Nov 2009 20:44:19 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/24/204419/265/</guid><description>&lt;p&gt;件名のとおり。&lt;/p&gt;&#10;&lt;p&gt;昨晩、以下のように設定しておいた。&lt;/p&gt;&#10;&lt;h2 id="設定"&gt;設定&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;Hudsonの管理 -&amp;gt; システムの設定 -&amp;gt; E-mail 通知&lt;/strong&gt;&#10;の欄を開く。Gmailを使用すれば自分でSMTPサーバーを立てる必要がない。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;項目&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;設定値&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SMTPサーバー&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;smtp.gmail.com&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SMTP認証&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;チェック有り&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;ユーザー名&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;gmailのメールアドレス&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;パスワード&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;gmailのパスワード&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SSL&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;チェック有り&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;SMTPポート&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;465&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="結果"&gt;結果&lt;/h2&gt;&#10;&lt;p&gt;上記のように設定してお休みした。今朝起きるとメールが7通ぐらい来ていた。&#10;一時間に一回メールが送られている。&#10;ビルド間隔は短すぎても問題だ。&lt;/p&gt;</description></item><item><title>GriffonのUnitTest、ビルド用のジョブを作成　その１</title><link>https://genzouw.com/entry/2009/11/23/234928/266/</link><pubDate>Mon, 23 Nov 2009 23:49:28 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/23/234928/266/</guid><description>&lt;p&gt;とりあえずはセットアップが完了したので、Griffonでのテスト、ビルド用ジョブを作ってみることにした。&lt;/p&gt;&#10;&lt;h2 id="新規ジョブ作成"&gt;新規ジョブ作成&lt;/h2&gt;&#10;&lt;p&gt;とりあえずgriffon-testというプロジェクトを作成。種類として「フリースタイル・プロジェクトのビルド」を選択した。&lt;/p&gt;&#10;&lt;h2 id="ソースコード管理システム"&gt;ソースコード管理システム&lt;/h2&gt;&#10;&lt;p&gt;Subversionサーバーがあるのでそちらからリソースを抜き出してビルドする仕組みにしてみたい。Subversionを選択して、適当なURLを設定。&lt;/p&gt;&#10;&lt;h2 id="ビルドトリガ"&gt;ビルドトリガ&lt;/h2&gt;&#10;&lt;p&gt;SCMをポーリングを選択。一時間にいっぺんぐらいにしておく。（ &lt;code&gt;0 * * * *&lt;/code&gt; ）&lt;/p&gt;&#10;&lt;h2 id="ビルド"&gt;ビルド&lt;/h2&gt;&#10;&lt;p&gt;以下のコマンドを実行してビルドする。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$WORKSPACE&lt;/span&gt;/griffon-test&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;$GRIFFON_HOME&lt;/span&gt;/bin/griffon prod package&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行"&gt;実行&lt;/h2&gt;&#10;&lt;p&gt;保存後、実行してみる。 &lt;strong&gt;「griffonコマンドがないです」&lt;/strong&gt; 、と怒られた。&#10;そりゃそうだ。~/.bashrcには設定しているけどシステム環境変数としては定義していない。&#10;まずはここからか。先は長い。&lt;/p&gt;</description></item><item><title>Hudsonにチャレンジ</title><link>https://genzouw.com/entry/2009/11/23/234037/267/</link><pubDate>Mon, 23 Nov 2009 23:40:37 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/23/234037/267/</guid><description>&lt;p&gt;前からHudsonを触ってみたいと思っていたのだが、重い腰が動かず。ようやくおもいこしを動かして触ってみることにした。&#10;家のマシンにインストール。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Ubuntu 9.10&lt;/li&gt;&#10;&lt;li&gt;Java 1.6.0_16&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="手順"&gt;手順&lt;/h2&gt;&#10;&lt;p&gt;ubuntuマシンにHudsonをインストールするのは非常に簡単だった。以下のコマンドを実行。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get intall hudson&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上。だれでもできる。&lt;/p&gt;&#10;&lt;p&gt;設定ファイルは &lt;code&gt;/etc/default/hudson&lt;/code&gt; にできる。設定ファイルを除いてみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ini" data-lang="ini"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# defaults for hudson continuous integration server&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# pulled in from the init script; makes things easier.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;hudson&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# location of java&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;JAVA&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/java&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# arguments to pass to java&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;JAVA_ARGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;-Xmx256m&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;PIDFILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/run/hudson/hudson.pid&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# user id to be invoked as (otherwise will run as root; not wise!)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;HUDSON_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;hudson&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# location of the hudson war file&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;HUDSON_WAR&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/share/hudson/hudson.war&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# hudson home location&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;HUDSON_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/lib/hudson&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# set this to false if you don&amp;#39;t want Hudson to run by itself&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# in this set up, you are expected to provide a servlet containr&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# to host hudson.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;RUN_STANDALONE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# log location. this may be a syslog facility.priority&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;HUDSON_LOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/log/hudson/$NAME.log&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#HUDSON_LOG=daemon.info&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# arguments to pass to hudson.&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --javahome=$JAVA_HOME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --httpPort=$HTTP_PORT (default 8080; disable with -1)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --httpsPort=$HTTP_PORT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --argumentsRealm.passwd.$ADMIN_USER=[password]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --argumentsRealm.$ADMIN_USER=admin&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# --webroot=~/.hudson/war&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;HUDSON_ARGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;--webroot=/var/run/hudson/war --httpPort=8100&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;初期設定では &lt;strong&gt;port=8100&lt;/strong&gt; が使用される。したがって &lt;a href="http://localhost:8100/"&gt;http://localhost:8100/&lt;/a&gt; にアクセス。&lt;/p&gt;</description></item><item><title>Ubuntu9.10でのシステム環境変数定義</title><link>https://genzouw.com/entry/2009/11/23/000002/268/</link><pubDate>Mon, 23 Nov 2009 00:00:02 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/23/000002/268/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2009/11/23/234928"&gt;GriffonのUnitTest、ビルド用のジョブを作成　その１ | ゲンゾウ用ポストイット&lt;/a&gt; にて、環境変数が必要なので定義することに。Ubuntuはグローバルな環境変数は/etc/environmentに記述するとのこと。&lt;/p&gt;&#10;&lt;p&gt;Groovy、Griffon、Grailsは僕の中で３本柱なので、こいつらのホームディレクトリを設定することにする。以下のように設定。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GRIFFON_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share/griffon&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GROOVY_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share/groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;GRAILS_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/share/grails&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一回きりの設定だろうな。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;/usr/share/groovy-1.6.3&lt;/li&gt;&#10;&lt;li&gt;/usr/share/groovy-1.6.4&lt;/li&gt;&#10;&lt;li&gt;/usr/share/groovy-1.6.5&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;みたいに複数バージョンを配置できるようにしておき、使用するものに &lt;code&gt;/usr/share/groovy&lt;/code&gt; としてシンボリックリンクさせることにする。&lt;/p&gt;&#10;&lt;p&gt;ついでにパスも通しておく。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;export PATH=$PATH:$GRIFFON_HOME/bin:$GROOVY_HOME/bin:$GRAILS_HOME/bin&lt;/code&gt;&#10;とやったのだが、これは &lt;strong&gt;絶対にやってはいけない&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;p&gt;設定に問題はない！と思って再起動してみると &lt;strong&gt;ログインできなくなった&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;p&gt;Kernel選択画面を起動し、recovery modeで起動して一番下に追記したばかりのPATH設定を削除。これで起動した。よかった！&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;/etc/environment&lt;/code&gt; には &lt;code&gt;$&lt;/code&gt; とか使用したらだめとかなんかな？ひとまずこれで環境設定終わり。&#10;ここまでで今日が終わってしまった。続きはまた明日。&lt;/p&gt;</description></item><item><title>なんでもかんでもGroovy病</title><link>https://genzouw.com/entry/2009/11/06/004244/269/</link><pubDate>Fri, 06 Nov 2009 00:42:44 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/06/004244/269/</guid><description>&lt;p&gt;Groovyでなんでもかんでもやる病気が。&lt;/p&gt;&#10;&lt;p&gt;最近、.NETの開発プロジェクトに参加している。クラスのテストはNunitを使用しているが、バッチexeの作成担当になってからはJUnit＋Groovyで単体テストをしている。&lt;/p&gt;&#10;&lt;p&gt;例をあげると以下のような感じ。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Test&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;GroovyTestCase&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;parameter&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;initvalue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;jdbc:oracle:thin:172.20.70.xxx:1521:projectsdb&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;projects&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;projects&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;oracle.jdbc.driver.OracleDriver&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setUp&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;execParameter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;initvalue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;初期値&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;initSql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;UPDATE result_table SET init_value = &amp;#39;${initvalue} where id = ${result_id}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;executeUpdate&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;initSql&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;cmd.exe /C APPLICATION.exe ${parameter}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;test_success&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;result_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exitValue&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;firstRow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;select * from result_table where id = ${result_id}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;このJUnitの使い方には、きっと問題はたくさんあるのだろうが、とりあえずこのテストコードのおかげで回帰テストが楽になってはいる。&lt;/p&gt;&#10;&lt;p&gt;最近勉強中のTestNGも使いたい。&lt;/p&gt;</description></item><item><title>GroovyでTestNG３</title><link>https://genzouw.com/entry/2009/11/05/064620/270/</link><pubDate>Thu, 05 Nov 2009 06:46:20 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/05/064620/270/</guid><description>&lt;p&gt;Twitterで @kiy0taka さんが早速回答してくれた。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;grabアノテーションにclassifierを指定したらいけました。 &lt;a href="http://gist.github.com/226148"&gt;http://gist.github.com/226148&lt;/a&gt;&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;丁寧にgistにサンプルコードまで。でもこれでGroovyがインストールされていればスクリプトだけでテスト可能か！&#10;すばらしい！&lt;/p&gt;&#10;&lt;p&gt;ちなみに社内でプロキシ経由だから使えない、と言う人はこの設定をしてみたら幸せになれるかも。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;JAVA_OPTS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$JAVA_OPTS&lt;/span&gt;&lt;span class="s2"&gt; -Dhttp.proxyHost=172.20.XXX.XXX -Dhttp.proxyPort=XXXX -Dhttp.proxyUser=username -Dhttp.proxyPassword=password -Djava.net.useSystemProxies=true&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ホスト名、ポート、ユーザー名、パスワードは適宜変更で。exportもwindowsの場合は環境変数に追加で。&lt;/p&gt;</description></item><item><title>Ubuntu9.10でGroovyインストール手順</title><link>https://genzouw.com/entry/2009/11/05/012042/271/</link><pubDate>Thu, 05 Nov 2009 01:20:42 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/05/012042/271/</guid><description>&lt;p&gt;Ubuntu9.10 がリリースされました。もちろん早速インストール。JavaとGroovyもインストール。&#10;インストール手順は何度かブログでも書いたが、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;でお終い。&lt;/p&gt;&#10;&lt;p&gt;最新版ではないですが、 &lt;strong&gt;Groovy 1.6.3&lt;/strong&gt; がインストールされます。これだけで実行環境が構築できるのはすごい。&lt;/p&gt;</description></item><item><title>関ジャバの集いに参加してきた</title><link>https://genzouw.com/entry/2009/11/04/234623/272/</link><pubDate>Wed, 04 Nov 2009 23:46:23 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/04/234623/272/</guid><description>&lt;p&gt;Groovy勉強会の感覚で望んだら、想像以上の人数でびっくりした。クロノスさんの貸してくれた部屋がぎゅうぎゅうだった。&lt;/p&gt;&#10;&lt;p&gt;今日のセッションは三つ。&lt;/p&gt;&#10;&lt;h2&gt;一つめ&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://blog.hatena.ne.jp/cero-t/"&gt;id:cero-t&lt;/a&gt; さんによるJava7の機能について。Javaもかなり変わってきたなあと感じる。アノーション導入だけで戸惑っていた頃が懐かしい。&lt;/p&gt;&#10;&lt;p&gt;ListとMapのリテラル表記はかなり嬉しい。どちらも初期化するだけで十行近くコードを書かないといけないというのは正直どうかと感じていたし。特にGroovy使うようになってから。&#10;ジェネリクスインスタンスの生成の記述簡略化も地味にいい。&#10;&lt;strong&gt;invokedynamic&lt;/strong&gt; とかいう、インボークメソッドの高速化仕様はGroovyに直結しそうだ。&lt;/p&gt;&#10;&lt;h2&gt;二つめ&lt;/h2&gt;&#10;&lt;p&gt;われらのJUGGUG関西支部長、 id:kiy0taka による *&lt;em&gt;G&lt;/em&gt; in Action** セッション。&lt;/p&gt;&#10;&lt;p&gt;id:kiy0taka さんはプレゼン上手だけどGroovyのよさ、うまく伝わったかな。&#10;帰り際に参加者の方と少しお話できたけど、次回の11/21のGroovy勉強会参加してみようかなと言っていてくれたのがうれしい！&lt;/p&gt;&#10;&lt;h2&gt;三つめ&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://blog.hatena.ne.jp/jyukutyo/"&gt;id:jyukutyo&lt;/a&gt; さんのTestNGについてのセッション。JUnitから別のツールへの移行になかなか踏み出せずにいたが、これはおもしろそう。&#10;JUnitよりも確かに記述が簡潔だし、Groovyと織り交ぜるとかなりの生産性が見込めそうだ。&#10;懇親会は参加できずだったが次回が楽しみ。会社の他のメンバーにも声をかけよう。&lt;/p&gt;&#10;&lt;p&gt;でもうちの会社のメンバー、技術系の勉強会に時間をつかいたがらないしだめかな。&lt;/p&gt;</description></item><item><title>GroovyでTestNG２</title><link>https://genzouw.com/entry/2009/11/04/004453/273/</link><pubDate>Wed, 04 Nov 2009 00:44:53 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/04/004453/273/</guid><description>&lt;p&gt;ということで、おとなしく&lt;a href="http://testng.org/doc/download.html"&gt;TestNG - Download Current Release and Beta Versions&lt;/a&gt;からjarをダウンロードしてくる。&lt;/p&gt;&#10;&lt;p&gt;ダウンロードしたjarは、$HOME/.groovy/libに配置。&lt;/p&gt;&#10;&lt;p&gt;以下のGroovyスクリプトを実行。&lt;br&gt;&#10;このスクリプトは&lt;a href="http://blog.hatena.ne.jp/jyukutyo/"&gt;id:jyukutyo&lt;/a&gt;さんが&lt;a href="http://www.atmarkit.co.jp/fjava/rensai4/testng01/testng01_1.html"&gt;&lt;/a&gt;にて掲載されていた記事を利用。&lt;br&gt;&#10;また、僕の環境はGroovy-1.6.5を使用。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;testng&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Assert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;assertEquals&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.testng.annotations.BeforeMethod&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.testng.annotations.Test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestNGSample&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;TestNGSample&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;★TestNGSampleのコンストラクタを呼び出した★&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;verifyAdd1&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;★★★verifyAdd1()を呼び出した★★★&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;verifyAdd2&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;★★★verifyAdd2()を呼び出した★★★&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;assertEquals&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@BeforeMethod&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;★★init()を呼び出した★★&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;add:&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Test&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;expectedExceptions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;RuntimeException&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;exceptionTest&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;★★★exceptionTest()を呼び出した★★★&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;throwException&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;[Parser] Running:&#10;Command line suite&#10;★TestNGSampleのコンストラクタを呼び出した★&#10;★★init()を呼び出した★★&#10;★★★exceptionTest()を呼び出した★★★&#10;★★init()を呼び出した★★&#10;★★★verifyAdd1()を呼び出した★★★&#10;★★init()を呼び出した★★&#10;★★★verifyAdd2()を呼び出した★★★&#10;===============================================&#10;Command line suite&#10;Total tests run: 3, Failures: 0, Skips: 0&#10;===============================================&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;おー、なんか一応それっぽく動いているっぽい。&lt;/p&gt;</description></item><item><title>GroovyでTestNG１</title><link>https://genzouw.com/entry/2009/11/04/003430/274/</link><pubDate>Wed, 04 Nov 2009 00:34:30 +0900</pubDate><guid>https://genzouw.com/entry/2009/11/04/003430/274/</guid><description>&lt;p&gt;Easyb使ったらいいのだが、あえて学んだばかりの&lt;a href="http://d.hatena.ne.jp/keyword/TestNG" class="keyword"&gt;TestNG&lt;/a&gt;で。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Grape使うともしかしてjarファイルの配置不要じゃね？？&lt;/strong&gt;&lt;br&gt;&#10;という発想のもの、&lt;a href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%CE%A5%C6%A1%BC%A5%B7%A5%E7%A5%F3" class="keyword"&gt;アノテーション&lt;/a&gt;を使ったスクリプトを書いたが動かない。&lt;/p&gt;&#10;&lt;p&gt;当方、Groovy-1.6.5を使用。&lt;/p&gt;&#10;&lt;p&gt;かなり削って以下のようなコードにしてみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;testng&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Assert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;assertEquals&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.testng.annotations.BeforeMethod&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.testng.annotations.Test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;org.testng&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;testng&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;5.7&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dummy&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでもしぬ。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;java.lang.RuntimeException: Error grabbing Grapes -- [download failed:org.testng#testng;5.7!testng.jar]&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ちなみに以下のコードはいける。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;testng&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Assert&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;assertEquals&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.testng.annotations.BeforeMethod&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.testng.annotations.Test&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//@Grab(group=&amp;#39;ant&amp;#39;, module=&amp;#39;ant-commons-logging&amp;#39;, version=&amp;#39;1.6.5&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;org.testng&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;testng&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;5.7&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dummy&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;success&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;どうやら&lt;a href="http://d.hatena.ne.jp/keyword/TestNG" class="keyword"&gt;TestNG&lt;/a&gt;をGrapeでモジュール解決しようとすると落ちるみたい。&lt;/p&gt;</description></item><item><title>Groovydocコマンド</title><link>https://genzouw.com/entry/2009/10/08/231746/275/</link><pubDate>Thu, 08 Oct 2009 23:17:46 +0900</pubDate><guid>https://genzouw.com/entry/2009/10/08/231746/275/</guid><description>&lt;p&gt;keyword:&lt;a href="http://d.hatena.ne.jp/keyword/javadoc" class="keyword"&gt;javadoc&lt;/a&gt;のように、groovydocコマンドがあるかどうか探したが見つけられなかった。&lt;br&gt;&#10;ただし、Antタスクを見つけることができた。&lt;br&gt;&#10;&lt;a href="http://groovy.codehaus.org/The+groovydoc+Ant+task"&gt;Groovy - The groovydoc Ant task&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;簡単にコマンドラインから実行したかったので、これをラッピングして作ってみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// コマンドライン引数を定義&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;CliBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;usage:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;groovydoc.groovy -s sourcepath -d destdir [-p packagenames] [-u use] [-w windowtitle]&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ソースフォルダ、ドキュメント出力フォルダの指定は必須&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;s&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;longOpt:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;sourcepath&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;args:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;input source directory&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;required:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;d&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;longOpt:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;destdir&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;args:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;output documents directory&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;required:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;p&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;longOpt:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;packagenames&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;args:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;packagenames&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;required:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;u&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;longOpt:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;use&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;args:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;use&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;required:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;w&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;longOpt:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;windowtitle&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;args:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;document title&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;required:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;opt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;opt&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exit&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;AntBuilder&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;taskdef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;name:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;groovydoc&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;classname:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.codehaus.groovy.ant.Groovydoc&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;groovydoc&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;destdir:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${opt.d}/gapi&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;sourcepath:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${opt.s}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;packagenames:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${opt.packagenames?:&amp;#39;**.*&amp;#39;}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;use:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${opt.use?:&amp;#39;true&amp;#39;}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;windowtitle:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${opt.windowtitle?:&amp;#39;groovydoc&amp;#39;}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;private&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;br&gt;&#10;ラッピングしただけなので、&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;packagename&lt;/li&gt;&#10;&lt;li&gt;use&lt;/li&gt;&#10;&lt;li&gt;windowtitle&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;のオプションの意味は何かは先に挙げたGroovydocのサイトを参照してください。&lt;br&gt;&#10;丸投げですみません。&lt;/p&gt;</description></item><item><title>Ubuntu（Debian系？）PCでのGroovy導入手順</title><link>https://genzouw.com/entry/2009/10/07/223812/276/</link><pubDate>Wed, 07 Oct 2009 22:38:12 +0900</pubDate><guid>https://genzouw.com/entry/2009/10/07/223812/276/</guid><description>&lt;p&gt;まとめてみた。と言ってもまとめるほどの手順もない。&lt;/p&gt;&#10;&lt;h2 id="jdkのインストール"&gt;JDKのインストール&lt;/h2&gt;&#10;&lt;p&gt;コマンドラインから以下のコマンドを実行&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install sun-java6-jdk&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでJDKのインストール完了。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;2009/10/07現在、jdk1.6_16がインストールされる。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="groovyのインストール"&gt;Groovyのインストール&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでGroovyのインストール完了。&#10;&lt;em&gt;2009/10/07現在、1.5.7がインストールされる。&lt;/em&gt;&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;Groovyのバージョンはかなり古いが、セットアップが面倒なときにはこれだけでGroovy実行環境が完了するので楽。誰かが配布したGroovyスクリプトをLinux環境で実行する際に簡単に実行で来そうです。&lt;/p&gt;</description></item><item><title>GroovyのMetaClassを使用したクラスの拡張の謎が解決</title><link>https://genzouw.com/entry/2009/10/07/212909/277/</link><pubDate>Wed, 07 Oct 2009 21:29:09 +0900</pubDate><guid>https://genzouw.com/entry/2009/10/07/212909/277/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2009/10/06/073217/1254781937"&gt;MetaClassを使用したクラスの拡張は、インスタンス生成前に行わないといけない？？ | ページ 1254781937 | ゲンゾウ用ポストイット&lt;/a&gt; の内容があっという間に解決。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://blog.hatena.ne.jp/uehaj/"&gt;id:uehaj&lt;/a&gt; さんのブログで早速かかれていた。すごい。この人にGroovyのことでしらないことはないのかwww&lt;/p&gt;&#10;&lt;p&gt;詳細は以下の記事を参照。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/uehaj/20091006/1254820813"&gt;ExpandoMetaClass.enableGlobally()について一言いっておくか - uehaj's blog&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;確かに僕の場合、StringクラスやFileクラスなどの拡張はしていたがGroovy内で定義したクラスの拡張はしていなかった&#10;。そもそもGroovy内で定義しているならfinal外したりして継承可能にはできるだろうし。&lt;/p&gt;&#10;&lt;p&gt;ちょうど最近&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://uokumura.hatenablog.com/entry/20090925/1253902069"&gt;Closureにメソッド足すにはExpandoMetaClass.enableGlobally()が必要 - uokumura’s diary&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;の内容をよんで「？？？」な状態だったのですが、ピースがぴったり埋まった気分です。&lt;/p&gt;</description></item><item><title>関係ないが</title><link>https://genzouw.com/entry/2009/10/06/073357/278/</link><pubDate>Tue, 06 Oct 2009 07:33:57 +0900</pubDate><guid>https://genzouw.com/entry/2009/10/06/073357/278/</guid><description>&lt;p&gt;はてなダイアリーに引っ越してきてソースコードをアップするのがものすごい楽と感じています。ただ一点だけ残念。&lt;/p&gt;&#10;&lt;p&gt;投稿したソースコードに行数は付加されないんですね。&#10;ちょっと残念。&#10;自分で手で行数打ち込んで投稿っていうのもバカらしいし。&lt;/p&gt;</description></item><item><title>MetaClassを使用したクラスの拡張は、インスタンス生成前に行わないといけない？？</title><link>https://genzouw.com/entry/2009/10/06/073217/279/</link><pubDate>Tue, 06 Oct 2009 07:32:17 +0900</pubDate><guid>https://genzouw.com/entry/2009/10/06/073217/279/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/odashinsuke/20091003/1254553781"&gt;型に対するメタクラスとインスタンスに対するメタクラスで遊んでたら例外がでた - お だ のスペース&lt;/a&gt; にて知りました。&lt;/p&gt;&#10;&lt;p&gt;以下のようにあるクラスのインスタンス生成後に、メタクラスによるメソッドを追加を行ってみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Test&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;methodA&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Print&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;methodA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Class Custom Print&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;methodA&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Test&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;methodA&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;methodA&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;適用されるのは拡張後にインスタンス生成された10行目の処理のみになる。おださんは、8行目のクラス拡張後にインスタンスの拡張も実施してみたみたいです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Test&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;methodA&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Print&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Test&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;methodA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Class Custom Print&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;methodA&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Test&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;methodA&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;methodA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Instance Custom Print&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;methodA&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;たしかに11行目のインスタンス拡張処理部分で落ちます。なぜ？？？&#10;ただしこれも7行目、8行目の処理を入れ替えると動作します。&lt;/p&gt;&#10;&lt;pre class="code lang-groovy" data-lang="groovy" data-unlink&gt;&lt;span class="synType"&gt;class&lt;/span&gt; Test {&#10;&lt;span class="synType"&gt;void&lt;/span&gt; methodA() {&#10;&lt;span class="synIdentifier"&gt;println&lt;/span&gt; &lt;span class="synConstant"&gt;'Print'&lt;/span&gt;&#10;}&#10;}&#10;Test.metaClass.methodA = { &lt;span class="synIdentifier"&gt;println&lt;/span&gt; &lt;span class="synConstant"&gt;'Class Custom Print'&lt;/span&gt; }&#10;&lt;span class="synSpecial"&gt;def&lt;/span&gt; t = &lt;span class="synStatement"&gt;new&lt;/span&gt; Test()&#10;t.methodA()&#10;&lt;span class="synStatement"&gt;new&lt;/span&gt; Test().methodA()&#10;t.metaClass.methodA = { &lt;span class="synIdentifier"&gt;println&lt;/span&gt; &lt;span class="synConstant"&gt;'Instance Custom Print'&lt;/span&gt; }&#10;t.methodA()&#10;&lt;/pre&gt;&#10;&lt;p&gt;あるインスタンスに対して拡張を行なった後に（上の例では変数 &lt;code&gt;t&lt;/code&gt; ）、クラス拡張を行ってはダメみたいです。これは仕様なのかな？？&lt;/p&gt;</description></item><item><title>Groovy普及の一番の壁？</title><link>https://genzouw.com/entry/2009/10/05/075747/280/</link><pubDate>Mon, 05 Oct 2009 07:57:47 +0900</pubDate><guid>https://genzouw.com/entry/2009/10/05/075747/280/</guid><description>&lt;p&gt;会社の同僚にGroovyを進める機会が何度かあります。その度に必ずいわれること。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;IDEは何を使ってコーディングしたらいいの？&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;必ずこれを聞かれます。&lt;/p&gt;&#10;&lt;p&gt;Eclipseのプラグインもあることはあるけど、&#10;補完機能はmetaClassに追加されたメソッドなんかは引っ張って来てくれないし、&#10;やはりお気に入りのエディタでゴリゴリ書くわけになります。&lt;/p&gt;&#10;&lt;p&gt;そのあたりが嫌というか、とっつきにくいという人が多いです。&#10;コード量自体が減るのでそれほどネックではない気がするのですが、IDEが使えないというのは精神衛生上よろしくないと感じる人が多いようでした。&lt;/p&gt;</description></item><item><title>METHINKS IT IS A WEASEL - どう書く？org</title><link>https://genzouw.com/entry/2009/10/05/075038/282/</link><pubDate>Mon, 05 Oct 2009 07:50:38 +0900</pubDate><guid>https://genzouw.com/entry/2009/10/05/075038/282/</guid><description>&lt;p&gt;METHINKS IT IS A WEASEL どう書く？org &amp;lt; &lt;a href="http://ja.doukaku.org/177/"&gt;http://ja.doukaku.org/177/&lt;/a&gt; &amp;gt;をといてみた。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;どう書く？org 9614 genzou: 作ってはみたものの、metaClassを...(METHINKS IT IS A WEASEL) - 投稿の詳細 &amp;lt; http://ja.doukaku.org/comment/9614/ &amp;gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;かなり速度が遅い…ロジックが悪いんだろうなぁ。 &lt;strong&gt;他の方がJavaで作成されたもの&lt;/strong&gt; を動かすとそこまで遅くないし。&lt;/p&gt;</description></item><item><title>一部のHTMLタグを通すフィルタ - どう書く？org</title><link>https://genzouw.com/entry/2009/10/05/074909/283/</link><pubDate>Mon, 05 Oct 2009 07:49:09 +0900</pubDate><guid>https://genzouw.com/entry/2009/10/05/074909/283/</guid><description>&lt;p&gt;一部のHTMLタグを通すフィルタ どう書く？org をといてみた。&lt;/p&gt;&#10;&lt;ul&gt;&lt;li&gt;どう書く？org 9613 genzou: たぶんこれでできているのではないかな？(一部のHTMLタグを通すフィルタ) - 投稿の詳細&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;最近全然日記をかけていなかった。外部での仕事かつタイトなスケジュールだったが、残り二週間を残してかなり安定してきた。&lt;br /&gt;&#10;ちゃんと日記をつけたい。&lt;/p&gt;</description></item><item><title>Groovyで既存のクラス（java.io.File）にプロパティを追加</title><link>https://genzouw.com/entry/2009/08/25/064446/284/</link><pubDate>Tue, 25 Aug 2009 06:44:46 +0900</pubDate><guid>https://genzouw.com/entry/2009/08/25/064446/284/</guid><description>&lt;p&gt;既存のクラスにプロパティを追加するには、metaClass.defineメソッドを使用すればよい。&lt;/p&gt;&#10;&lt;p&gt;以下の例では、 &lt;code&gt;java.lang.Object&lt;/code&gt; にメソッドを追加している。&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-groovy"&gt;#!/usr/bin/env groovy&#10;Object.metaClass.define {&#10; testprop = null&#10;}&#10;def x = new Object()&#10;def y = new Object()&#10;x.testprop = "aaa"&#10;assert x.testprop == "aaa"&#10;y.testprop = "bbb"&#10;assert x.testprop == "aaa"&#10;assert y.testprop == "bbb"&#10;def z = new Object(testprop: "ccc")&#10;assert z.testprop == "ccc"&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;&lt;code&gt;java.io.File&lt;/code&gt; クラスにプロパティを追加するにはどうしたらよいか分からなかったのでメモ。&lt;/p&gt;&#10;&lt;p&gt;これで、 &lt;strong&gt;Rails&lt;/strong&gt; の黒魔術のようにJavaの組み込みクラスにメソッドを追加することができる。&#10;&lt;code&gt;java.lang.String&lt;/code&gt; にもメソッド追加できる。&lt;/p&gt;</description></item><item><title>Groovyのコマンドライン実行を拡張</title><link>https://genzouw.com/entry/2009/08/19/072918/285/</link><pubDate>Wed, 19 Aug 2009 07:29:18 +0900</pubDate><guid>https://genzouw.com/entry/2009/08/19/072918/285/</guid><description>&lt;p&gt;何度か書いているけれども、家でLinux、会社でCygwinという環境で少しずつなれてきました。ファイル名や中身の置換もコマンドラインから実行することも多いのですが、&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;groovy -e &amp;quot;...&amp;quot;&lt;/code&gt; にて実行する場合はやはりタイプ量が多い気がします。これを減らすべく、groovyコマンドを拡張してみた。&lt;/p&gt;&#10;&lt;h2 id="まずは新しいコマンド-groovyx-作成"&gt;まずは新しいコマンド &lt;code&gt;groovyx&lt;/code&gt; 作成&lt;/h2&gt;&#10;&lt;p&gt;新しい &lt;code&gt;groovyx&lt;/code&gt; というコマンドを作成してみる。内容は非常に簡単。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/bin/bash&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;groovy -cp ~/bin -e &lt;span class="s2"&gt;&amp;#34;Extensions.main(args);&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;~/bin&lt;/code&gt; フォルダに配置されている &lt;code&gt;Extensions.groovy&lt;/code&gt; を実行した後で、コマンドラインで指定されたスクリプトを実行するというもの。もちろん &lt;code&gt;~/bin&lt;/code&gt; フォルダである必要はありません。 &lt;code&gt;Extensions.groovy&lt;/code&gt; というファイル名である必要もなしです。&lt;/p&gt;&#10;&lt;p&gt;では、 &lt;code&gt;Extensions.groovy&lt;/code&gt; というファイルの役割は？&lt;/p&gt;&#10;&lt;p&gt;こちらのソースコードでいくつかの既存クラスを拡張し、メソッドを追加します。&lt;/p&gt;&#10;&lt;h2 id="extensionsgroovyを作成"&gt;Extensions.groovyを作成&lt;/h2&gt;&#10;&lt;p&gt;一番よく使うFileクラスを拡張してみる。僕は以下のような内容の拡張を行った。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;define&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ls&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listFiles&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;move&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;dirpath&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;renameTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dirpath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;separator&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;copy&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;dirpath&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dirpath&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;separator&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readBytes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rename&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;newname&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;renameTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;separator&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;newname&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;eachNormalFileRecurse&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;closure&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ignoreDotFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;eachFileRecurse&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;file&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;!(&lt;/span&gt;&lt;span class="n"&gt;ignoreDotFile&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;separator&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;closure&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;getLastModifiedDate&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lastModified&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;static&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;static&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getCurrent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;詳細は省略です。&lt;/p&gt;&#10;&lt;h2 id="実行してみる"&gt;実行してみる&lt;/h2&gt;&#10;&lt;p&gt;以下のようにして実行します。&lt;/p&gt;&#10;&lt;h3 id="その１"&gt;その１&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovyx.sh &lt;span class="s2"&gt;&amp;#34;File.current.eachNormalFileRecurse{ println it }&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00010.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00013.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00009.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00016.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00004.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00008.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00002.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00014.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00011.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00003.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00007.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00017.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00015.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00018.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00006.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00005.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00012.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00000.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./00019.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="その２"&gt;その２&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovyx.sh &lt;span class="s2"&gt;&amp;#34;File.current.eachNormalFileRecurse{ println it.name + &amp;#39; &amp;#39; + it.lastModifiedDate.format(&amp;#39;yyyy/MM/dd hh:mm:ss&amp;#39;) }&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00010.MTS 2009/07/30 07:25:48&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00013.MTS 2009/08/04 08:25:02&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00009.MTS 2009/07/25 05:38:14&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00016.MTS 2009/08/09 12:49:08&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00004.MTS 2009/07/01 09:27:04&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00008.MTS 2009/07/21 06:51:20&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00002.MTS 2009/06/13 10:57:46&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00014.MTS 2009/08/05 08:31:18&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00011.MTS 2009/07/30 08:00:56&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00003.MTS 2009/06/13 11:00:02&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00007.MTS 2009/07/20 06:32:04&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00017.MTS 2009/08/15 11:07:04&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00015.MTS 2009/08/07 01:10:24&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00018.MTS 2009/08/15 11:14:22&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00006.MTS 2009/07/06 02:23:02&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00005.MTS 2009/07/01 07:20:56&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00012.MTS 2009/08/02 08:18:28&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00000.MTS 2009/05/26 09:03:22&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00019.MTS 2009/08/15 11:56:18&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="その３"&gt;その３&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovyx.sh &lt;span class="s2"&gt;&amp;#34;File.current.eachNormalFileRecurse{ it.rename(it.lastModifiedDate.format(&amp;#39;yyyy_MM_dd-hh_mm&amp;#39;) + &amp;#39;.MTS&amp;#39;) }&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls -l&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_05_26-09_03.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_06_13-10_57.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_06_13-11_00.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_07_01-07_20.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_07_01-09_27.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_07_06-02_23.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_07_20-06_32.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_07_21-06_51.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_07_25-05_38.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_07_30-07_25.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_07_30-08_00.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_08_02-08_18.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_08_04-08_25.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_08_05-08_31.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_08_07-01_10.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_08_09-12_49.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_08_15-11_07.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_08_15-11_14.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;2009_08_15-11_56.MTS&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>指定したフォルダの画像を、作成日時別のフォルダに割り振り</title><link>https://genzouw.com/entry/2009/08/18/075634/286/</link><pubDate>Tue, 18 Aug 2009 07:56:34 +0900</pubDate><guid>https://genzouw.com/entry/2009/08/18/075634/286/</guid><description>&lt;p&gt;お盆休み中結構外出して、家族のデジカメ写真がたまっていた。&lt;br&gt;&#10;これらを作成日時別のフォルダ（yyyy_MM_dd形式）に割り振りする処理をスクリプトで書いてみた。&lt;br&gt;&#10;ただ割り振るだけでなく、割り振った写真のファイル名も変更してみた。（yyyy_MM_dd_NNN.jpg、NNNは連番）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listFiles&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;file&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;groupBy&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lastModified&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;yyyy_MM_dd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;newdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;newdir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mkdirs&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;renameTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newdir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;newdir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;_&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++).&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;padLeft&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.jpg&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>ようやく終わった・・・ぐちらせて・・・</title><link>https://genzouw.com/entry/2009/08/12/223223/287/</link><pubDate>Wed, 12 Aug 2009 22:32:23 +0900</pubDate><guid>https://genzouw.com/entry/2009/08/12/223223/287/</guid><description>&lt;p&gt;Twitterでつぶやいたけど、先週は出向先での作業完了後に本社に戻り、終電まで自分の担当外のプロジェクトの手伝い。今週はまるまる年休申請していたけど、祝日である月曜日、火曜日の支援要請があったので集金。&#10;&lt;strong&gt;結果的に与えられたタスクはちゃんとできたし、自分の担当外のプロジェクトの分を加味すれば、それ以上のタスクをこなせたはずだ。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;自分の担当外のプロジェクトについて、上司に進捗報告を行った。&#10;祝日開けに「終わらなかった分については、他の方への引き継ぎが必要です」ということを告げた。&lt;/p&gt;&#10;&lt;p&gt;上司は「お前、与えられたタスクこなさなあかんやん！できひんのかぁ？」と言うとともに、周囲のメンバーに「あいつ、結局作業こなせなさそうやわ。他の人員用意せないかんかもな。」とか言っていた。&lt;/p&gt;&#10;&lt;p&gt;なんだか悲しくなった。&lt;/p&gt;</description></item><item><title>Subversion管理プロジェクトフォルダをコピーする際に.svnを除去する</title><link>https://genzouw.com/entry/2009/08/12/222544/288/</link><pubDate>Wed, 12 Aug 2009 22:25:44 +0900</pubDate><guid>https://genzouw.com/entry/2009/08/12/222544/288/</guid><description>&lt;p&gt;書くネタがないのでとりあえず。一行で無理やりやってみた。&lt;/p&gt;&#10;&lt;p&gt;対象プロジェクト名を &lt;strong&gt;testproject&lt;/strong&gt; とする。&#10;コマンドラインから以下のようなコマンドをぶち込むと、Groovyのスクリプトが実行される。&#10;( &lt;code&gt;find&lt;/code&gt; コマンドの使い方をしっかり理解していればそちらで十分なんですけどね。 )&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy -e &lt;span class="s2"&gt;&amp;#34;new AntBuilder().copy(todir: System.properties.&amp;#39;user.home&amp;#39; + &amp;#39;/デスクトップ/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;) { fileset(dir: &amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;) { exclude(name: &amp;#39;**/.svn&amp;#39;) } }&amp;#34;&lt;/span&gt; testproject&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ワンライナーにする必要はないので改行、インデントしてやると以下のようになる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy -e &lt;span class="s2"&gt;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;new AntBuilder().copy(todir: System.properties.&amp;#39;user.home&amp;#39; + &amp;#39;/デスクトップ/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; fileset(dir: &amp;#39;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[0]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#39;) { exclude(name: &amp;#39;**/.svn&amp;#39;) }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; testproject&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>groovyshがWindowsで正常に動作しない？？</title><link>https://genzouw.com/entry/2009/07/30/211216/289/</link><pubDate>Thu, 30 Jul 2009 21:12:16 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/30/211216/289/</guid><description>&lt;p&gt;&lt;a href="http://blog.hatena.ne.jp/fumokmm/"&gt;id:fumokmm&lt;/a&gt; さんからまたしてもいいことを教えてもらった。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;groovysh&lt;/strong&gt; って、あんまり使えないよね、と言うつぶやきを &lt;strong&gt;Twitter&lt;/strong&gt; でしていたら、そんなことないよ、時々使っているよ、とのこと。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;groovysh --help&lt;/code&gt; を頼りに使い方を調べつつ、使ってみると意外とおもしろい。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;$HOME/.groovy/lib&lt;/code&gt; に配置しているjarファイルを参照してくれるのも便利。Javaのコード（Groovy だけど）をシェルチックに扱うというのは意外と新鮮だった。&lt;/p&gt;&#10;&lt;p&gt;会社でも早速使ってみようと思い、今日使い始めた。が、うまく動かない。 &lt;strong&gt;println&lt;/strong&gt; をぶち込んでも、「printlnなんてない」と怒られてしまう。&lt;/p&gt;&#10;&lt;p&gt;Google先生に聞いてみるとCygwinではgroovyshが正常動作しないという海外のエントリがいくつか見つかった。さすがにWindows上でdos窓でコマンド叩くのは面倒くさい。家だけで使う気も起きないので &lt;strong&gt;groovysh&lt;/strong&gt; の使用は諦める。&lt;/p&gt;</description></item><item><title>指定フォルダ以下のファイルの文字コード一括変換</title><link>https://genzouw.com/entry/2009/07/24/003410/290/</link><pubDate>Fri, 24 Jul 2009 00:34:10 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/24/003410/290/</guid><description>&lt;p&gt;&lt;a href="http://blog.hatena.ne.jp/fumokmm/"&gt;id:fumokmm&lt;/a&gt; さんからいいネタをいただいたので、はてなでの初めての日記の練習もかねて。&#10;ファイルの文字コードを一括変換するツールを探していたので勉強にちょうど良いと作ってみた。実行方法は以下のとおり。&lt;/p&gt;&#10;&lt;h2 id="1juniversalchardet自動文字コード判定用ライブラリ"&gt;1.juniversalchardet（自動文字コード判定用ライブラリ）&lt;/h2&gt;&#10;&lt;p&gt;google codeのプロジェクト( &lt;a href="http://juniversalchardet.googlecode.com"&gt;http://juniversalchardet.googlecode.com&lt;/a&gt; ) からjarファイルを落としてきて、&lt;code&gt;$HOME/.groovy/lib&lt;/code&gt; に配置。&lt;/p&gt;&#10;&lt;h2 id="2以下のスクリプトを実行"&gt;2.以下のスクリプトを実行&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;CharsetConvertor.groovy&lt;/strong&gt; のようなファイル名で以下のスクリプトを作成。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;destenc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;detector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mozilla&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;universalchardet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;UniversalDetector&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;eachFileRecurse&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;file&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;==~&lt;/span&gt; &lt;span class="s"&gt;/[^.].+/&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bytes&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;handleData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="kt"&gt;byte&lt;/span&gt;&lt;span class="o"&gt;[],&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dataEnd&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;encoding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;detectedCharset&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt; &lt;span class="n"&gt;destenc&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;finish&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="補足"&gt;補足&lt;/h2&gt;&#10;&lt;p&gt;実行時のパラメータは以下のとおり&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;第一引数：実行対象フォルダ&lt;/li&gt;&#10;&lt;li&gt;第二引数：置換後エンコード&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ドットファイルは対象外にしています。&lt;/p&gt;</description></item><item><title>Grails App Engine Plugin + Gorm JPA Pluginでリレーションを定義してみる</title><link>https://genzouw.com/entry/2009/07/23/230600/307/</link><pubDate>Thu, 23 Jul 2009 23:06:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/23/230600/307/</guid><description>&lt;p&gt;&lt;strong&gt;Grails App Engine Plugin + Gorm JPA Plugin&lt;/strong&gt; で、ひとまずリレーションのないドメインクラスを用意した場合の動作は確認できました。&#10;次はリレーションを追加してみることにしました。が、うまくいかない。&#10;とりあえず試してみたことを列挙してみる。&lt;/p&gt;&#10;&lt;h2 id="環境"&gt;環境&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;grails-1.1.1&lt;/li&gt;&#10;&lt;li&gt;groovy-1.6.3&lt;/li&gt;&#10;&lt;li&gt;java-1.6.0.14&lt;/li&gt;&#10;&lt;li&gt;app-engine-plugin-0.8.3&lt;/li&gt;&#10;&lt;li&gt;gorm-jpa-0.3&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="まずは単純に動くところまで"&gt;まずは単純に動くところまで&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2009/07/15/231700"&gt;Grails AppEngine PluginでJPAを使用する（成功） | ゲンゾウ用ポストイット&lt;/a&gt; にて、リレーションのないドメインが動くところまで。&lt;/p&gt;&#10;&lt;h2 id="リレーションを追加"&gt;リレーションを追加&lt;/h2&gt;&#10;&lt;p&gt;ここからがおかしいのだろうと思う。まずは以下の２つのドメインを作成した。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;com.sample.Book&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;com.sample.Category&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;コードは以下のとおり。&lt;/p&gt;&#10;&lt;h3 id="bookgroovy"&gt;Book.groovy&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sample&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Entity&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Book&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;Serializable&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@Id&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GenerationType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IDENTITY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;isbn&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@ManyToOne&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Category&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;constraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nl"&gt;visible:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="categorygroovy"&gt;Category.groovy&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sample&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.persistence.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Entity&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Category&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;Serializable&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@Id&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@GeneratedValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;GenerationType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IDENTITY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Long&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@OneToMany&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;List&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;books&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;constraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nl"&gt;visible:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あとはcontroller、viewを作成して実行。&lt;/p&gt;</description></item><item><title>Grails In GAEのローカル動作がおかしくなったら</title><link>https://genzouw.com/entry/2009/07/22/075000/308/</link><pubDate>Wed, 22 Jul 2009 07:50:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/22/075000/308/</guid><description>&lt;p&gt;&lt;strong&gt;grails&lt;/strong&gt;に&lt;strong&gt;grails app engine plugin&lt;/strong&gt;を入れていろいろ試しているのだが、前日に動作していたアプリをドメインクラス１つ追加したぐらいの変更で動作しなくなってしまった。&lt;/p&gt;&#10;&lt;p&gt;一度プロジェクトを削除して、再度&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails create-app&lt;/strong&gt;&lt;/span&gt;を実行するも、事態は改善に向かわず。&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails app-engine&lt;/strong&gt;&lt;/span&gt;コマンド実行時に以下のようなエラーが出ていた。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;&#10;Caused by: : The following error occurred while executing this line:&#10;/usr/share/appengine-java-sdk-1.2.2/config/user/ant-macros.xml:94: Java returned: 1&#10; at org.apache.tools.ant.ProjectHelper.addLocationToBuildException(ProjectHelper.java:541)&#10; at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:394)&#10; at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)&#10; at org.apache.tools.ant.Task.perform(Task.java:348)&#10; at _Events$_run_closure1.doCall(_Events.groovy:54)&#10; at _GrailsEvents_groovy$_run_closure5.doCall(_GrailsEvents_groovy:59)&#10; at _GrailsEvents_groovy$_run_closure5.call(_GrailsEvents_groovy)&#10; at _GrailsWar_groovy$_run_closure4.doCall(_GrailsWar_groovy:240)&#10; at AppEngine$_run_closure2.doCall(AppEngine:26)&#10; at gant.Gant$_dispatch_closure4.doCall(Gant.groovy:324)&#10; ... 10 more&#10;Caused by: /usr/share/appengine-java-sdk-1.2.2/config/user/ant-macros.xml:94: Java returned: 1&#10; at org.apache.tools.ant.taskdefs.Java.execute(Java.java:107)&#10; at com.google.appengine.tools.enhancer.EnhancerTask.execute(EnhancerTask.java:99)&#10; at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)&#10; at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)&#10; at org.apache.tools.ant.Task.perform(Task.java:348)&#10; at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:62)&#10; at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:288)&#10; at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:105)&#10; at org.apache.tools.ant.Task.perform(Task.java:348)&#10; at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:391)&#10; ... 18 more&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;grails clean;grails app-engine&lt;/strong&gt;&lt;/span&gt;とコマンド実行して、一度クリーンしてもダメ。&lt;/p&gt;</description></item><item><title>Grails in GAEの課題</title><link>https://genzouw.com/entry/2009/07/16/225300/309/</link><pubDate>Thu, 16 Jul 2009 22:53:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/16/225300/309/</guid><description>&lt;p&gt;ようやく&lt;strong&gt;Google App Engine&lt;/strong&gt;で&lt;strong&gt;Grails + GORM&lt;/strong&gt;が動いた。&lt;/p&gt;&#10;&lt;p&gt;けれどもいくつか気になる点が。&lt;/p&gt;&#10;&lt;h4&gt;前提&lt;/h4&gt;&#10;&lt;p&gt;あくまで以下のプラグインを使った僕の環境での課題です。&lt;/p&gt;&#10;&lt;ul&gt;&#10; &lt;li&gt;grails appengine plugin&lt;/li&gt;&#10; &lt;li&gt;grails gorm-jpa plugi&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;アプリのURLはこちら。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://genzouw.appspot.com/book/list"&gt;Book List&lt;/a&gt;&lt;/p&gt;&#10;&lt;h4&gt;Grailsでのメッセージ表示&lt;/h4&gt;&#10;&lt;p&gt;&lt;strong&gt;Grails&lt;/strong&gt;で生成される&lt;strong&gt;Controller&lt;/strong&gt;クラスを見てみると、以下の処理終了後にメッセージを出力するようになっている。&lt;/p&gt;&#10;&lt;ul&gt;&#10; &lt;li&gt;登録（save）&lt;/li&gt;&#10; &lt;li&gt;更新(update）&lt;/li&gt;&#10; &lt;li&gt;削除（delete）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;Grailsにはいくつかのスコープが存在していて一般的なリクエスト、セッションの他に&lt;strong&gt;フラッシュ&lt;/strong&gt;なんてのもある。&lt;/p&gt;&#10;&lt;p&gt;Japanese Controllers - Grails - Codehaus&lt;/p&gt;&#10;&lt;p&gt;上記の更新処理実行後は、&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;flash.message = &amp;quot;~なんかメッセージ~&amp;quot;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;と言う風に表示したいメッセージをセットしている。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;View&lt;/strong&gt;ではこの&lt;strong&gt;flash.message&lt;/strong&gt;が空でない場合のみ表示するようになっている。&lt;/p&gt;&#10;&lt;h4&gt;GAE上だとメッセージがずっと残ってしまう（Grails AppEngine Pluginの問題？）&lt;/h4&gt;&#10;&lt;p&gt;通常は画面表示後に&lt;strong&gt;flash&lt;/strong&gt;スコープの内容がクリアされる。&lt;/p&gt;&#10;&lt;p&gt;GrailsプロジェクトにGrails AppEngine Plugin、Gorm-JPA Pluginを入れてもこれは同様。&lt;/p&gt;&#10;&lt;p&gt;ただし、&lt;strong&gt;GAE上にアップするとなぜかflashスコープの値がクリアされなくなってしまう。&lt;/strong&gt;更新後に表示されたメッセージが、たとえば一覧画面を飛び回っている間も表示され続けたりする。挙句の果て、次の更新、削除を行ってもメッセージが切り替わらない。&lt;/p&gt;&#10;&lt;h4&gt;[HOME]のリンクおかしい&lt;/h4&gt;&#10;&lt;p&gt;&amp;nbsp;こちらはローカルでも出るので、&lt;strong&gt;Grails AppEngine Plugin&lt;/strong&gt;が原因の可能性が大きい。&lt;/p&gt;&#10;&lt;p&gt;画面の左上の[HOME]のリンクを押しても、現在表示中のページがリロードされるだけ。サイトのトップへ移動してくれなくなってしまった。&lt;/p&gt;&#10;&lt;p&gt;暇があったら原因を調べてみたい。&lt;/p&gt;</description></item><item><title>Grails AppEngine PluginでJPAを使用する（成功）</title><link>https://genzouw.com/entry/2009/07/15/231700/310/</link><pubDate>Wed, 15 Jul 2009 23:17:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/15/231700/310/</guid><description>&lt;p&gt;&lt;strong&gt;Grails&lt;/strong&gt; + Grails AppEngine Plugin + JPA でようやく簡単なアプリが動作確認できたので整理。&lt;/p&gt;&#10;&lt;h2 id="動作確認時の環境"&gt;動作確認時の環境&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Groovy 1.6.3&lt;/li&gt;&#10;&lt;li&gt;Grails 1.1.1&lt;/li&gt;&#10;&lt;li&gt;Google App Engine sdk for java 1.2.1&lt;/li&gt;&#10;&lt;li&gt;Grails Appengine Plugin 0.8.3&lt;/li&gt;&#10;&lt;li&gt;Grails gorm-jpa plugin 0.3&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="資料"&gt;資料&lt;/h2&gt;&#10;&lt;p&gt;何度もブログで掲載している以下の資料を再度整理しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://docs.google.com/present/edit?hl=ja&amp;amp;id=dgkcctp6_2123s6h5tc7"&gt;Google App Engine で Grails! - &amp;ldquo;Google Docs&amp;rdquo;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="お願い"&gt;お願い&lt;/h2&gt;&#10;&lt;p&gt;誤りなどありましたらお知らせください。できるだけ早く直します。資料みれないんじゃーとかも教えてください。&lt;/p&gt;&#10;&lt;p&gt;ちなみに動いたやつはこれ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://genzouw.appspot.com/book/list"&gt;Book List&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;非常にシンプル。&lt;/p&gt;</description></item><item><title>google app engine sdk 1.2.2リリース</title><link>https://genzouw.com/entry/2009/07/15/220300/311/</link><pubDate>Wed, 15 Jul 2009 22:03:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/15/220300/311/</guid><description>&lt;p&gt;今日、何気なく&lt;strong&gt;Google App Engine&lt;/strong&gt; &lt;strong&gt;SDK&lt;/strong&gt;のサイトを除いたら、バージョンが1.2.1から1.2.2になっていた。&lt;/p&gt;&#10;&lt;p&gt;リリースは&lt;strong&gt;2009/07/13&lt;/strong&gt;となっていたので、二日前にリリースされたんですね。&lt;/p&gt;&#10;&lt;p&gt;最近Google App Engineにリトライ中なのであまりバージョンの異なるものに入れ替えはよくないかなーと思いつつ、やはり使うなら最新版だろ！ということで早速入れ替え。&lt;/p&gt;</description></item><item><title>Grails AppEngine PluginでJPAを使用する（失敗）</title><link>https://genzouw.com/entry/2009/07/14/070400/312/</link><pubDate>Tue, 14 Jul 2009 07:04:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/14/070400/312/</guid><description>&lt;h2 id="grails-appengine-pluginでjpaを使用するには"&gt;Grails AppEngine pluginでJPAを使用するには&lt;/h2&gt;&#10;&lt;p&gt;前日、以下のページにてJPAを使用する場合には追加でプラグイン入れないといけないという記述を見つけたので、再度 &lt;strong&gt;Google App Engine&lt;/strong&gt; 開発の手順を整理してみる。 &lt;a href="http://www.grails.org/plugin/app-engine"&gt;Grails - Plugin: Grails AppEngine plugin&lt;/a&gt;&lt;/p&gt;&#10;&lt;h2 id="開発環境構築からgrails-app-engine-pluginインストールまでの流れ"&gt;開発環境構築から、Grails App Engine Pluginインストールまでの流れ&lt;/h2&gt;&#10;&lt;p&gt;以前投稿したとおり。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2009/07/13/233000"&gt;勉強会に向けてGrails AppEngine Pluginについて調査 | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;grails install-plugin app-engine&lt;/code&gt; コマンドを実行した後は、 &lt;code&gt;grails install-plugin gorm-jpa&lt;/code&gt; コマンドを実行。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;grails create-domain-class com.Book&lt;/code&gt; で適当なドメインクラス作成後、 &lt;code&gt;grails generate-all com.Book&lt;/code&gt; でview、controller作成。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;grails app-engine run&lt;/code&gt; コマンドで動作確認。&lt;/p&gt;&#10;&lt;h2 id="booklist-にアクセス"&gt;book/list にアクセス&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;http://localhost:8080/&lt;/code&gt; にアクセス。ちゃんと動作するようになった。&#10;&lt;code&gt;http://localhost:8080/book/list&lt;/code&gt; にアクセスすれば、ちゃんと本の一覧画面が表示される。&#10;&lt;code&gt;http://localhost:8080/book/create&lt;/code&gt; で新規登録画面へ。ただここで登録しようとするとエラーとなってしまう。&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;org.codehaus.groovy.runtime.InvokerInvocationException: java.lang.NullPointerException&#10; at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)&#10; at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)&#10; at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)&#10; at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)&#10;Caused by: java.lang.NullPointerException&#10; at org.datanucleus.jpa.EntityManagerImpl.find(EntityManagerImpl.java:204)&#10; at org.datanucleus.store.appengine.jpa.DatastoreEntityManager.find(DatastoreEntityManager.java:48)&#10; at org.grails.jpa.JpaPluginSupport$__clinit__closure3_closure6_closure11_closure19.doCall(JpaPluginSupport.groovy:253)&#10; at com.BookController$_closure3.doCall(BookController.groovy:18)&#10; at com.BookController$_closure3.doCall(BookController.groovy)&#10; ... 4 more&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;プラグインの説明サイトを見ていると、 &lt;code&gt;grails generate-all com.Book&lt;/code&gt; にて作成したcontrollerでは正常に動作せず、手を加える必要があるようだ。&lt;/p&gt;</description></item><item><title>勉強会に向けてGrails AppEngine Pluginについて調査</title><link>https://genzouw.com/entry/2009/07/13/233000/313/</link><pubDate>Mon, 13 Jul 2009 23:30:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/13/233000/313/</guid><description>&lt;h2 id="環境設定プラグインインストールまでの流れ"&gt;環境設定(プラグインインストールまでの流れ)&lt;/h2&gt;&#10;&lt;p&gt;以前紹介した資料どおりです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://docs.google.com/present/edit?id=dgkcctp6_2123s6h5tc7"&gt;Google App EngineでGrails! - &amp;ldquo;Google Docs&amp;rdquo;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;code&gt;grails appengine plugin&lt;/code&gt; インストール後に、JPAかJDOかどちらを使用するか聞かれるが、 &lt;strong&gt;JPAを選びました。&lt;/strong&gt;&#10;理由は特にありません。&lt;/p&gt;&#10;&lt;p&gt;ちなみに、 &lt;code&gt;grails appengine plugin&lt;/code&gt; のversionは0.8.3になっていました。着実にバージョンアップしています。&lt;/p&gt;&#10;&lt;h2 id="ドメインクラスの作成"&gt;ドメインクラスの作成&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://docs.google.com/present/edit?id=dgkcctp6_2123s6h5tc7"&gt;Google App EngineでGrails! - &amp;ldquo;Google Docs&amp;rdquo;&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;上記の資料ではドメインクラスを使用しない例しか記載していないかったので、ここでドメインクラスを作成。 &lt;code&gt;grails-app/domain&lt;/code&gt; 直下にクラスを配置すると動かないということなので、適当にパッケージを作成しました。ありきたりだが本の情報を管理するBookクラスを作成。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;grails create-domain-class com.Book&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;Bookドメイン作成&lt;/p&gt;&#10;&lt;p&gt;作成後、カラムを追加。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;String name&lt;/li&gt;&#10;&lt;li&gt;String isbn&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ビューコントローラーも作成"&gt;ビュー、コントローラーも作成&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grails generate-all com.Book&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ViewとControllerも作成。&lt;/p&gt;&#10;&lt;h2 id="アプリケーション起動"&gt;アプリケーション起動&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grails app-engine run&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行してからなかなか起動しない。かなりあせる。問題があるのか&amp;hellip;と思ったら &lt;code&gt;localhoat&lt;/code&gt; になっていました。そりゃ起動しない。&lt;/p&gt;&#10;&lt;p&gt;起動はするようになったけれども、com.BookControllerへアクセスでエラー発生。以下のとおり。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;org.codehaus.groovy.runtime.InvokerInvocationException: groovy.lang.MissingMethodException: No signature of method: static com.Book.list&lt;span class="o"&gt;()&lt;/span&gt; is applicable &lt;span class="k"&gt;for&lt;/span&gt; argument types: &lt;span class="o"&gt;(&lt;/span&gt;org.codehaus.groovy.grails.web.servlet.mvc.GrailsParameterMap&lt;span class="o"&gt;)&lt;/span&gt; values: &lt;span class="o"&gt;[[&lt;/span&gt;max:10, action:list, controller:book&lt;span class="o"&gt;]]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle&lt;span class="o"&gt;(&lt;/span&gt;DevAppEngineWebAppContext.java:54&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter&lt;span class="o"&gt;(&lt;/span&gt;TransactionCleanupFilter.java:43&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle&lt;span class="o"&gt;(&lt;/span&gt;DevAppEngineWebAppContext.java:54&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at com.google.appengine.tools.development.JettyContainerService&lt;span class="nv"&gt;$ApiProxyHandler&lt;/span&gt;.handle&lt;span class="o"&gt;(&lt;/span&gt;JettyContainerService.java:306&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Caused by: groovy.lang.MissingMethodException: No signature of method: static com.Book.list&lt;span class="o"&gt;()&lt;/span&gt; is applicable &lt;span class="k"&gt;for&lt;/span&gt; argument types: &lt;span class="o"&gt;(&lt;/span&gt;org.codehaus.groovy.grails.web.servlet.mvc.GrailsParameterMap&lt;span class="o"&gt;)&lt;/span&gt; values: &lt;span class="o"&gt;[[&lt;/span&gt;max:10, action:list, controller:book&lt;span class="o"&gt;]]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at com.BookController&lt;span class="nv"&gt;$_closure2&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;BookController.groovy:14&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;at com.BookController&lt;span class="nv"&gt;$_closure2&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;BookController.groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;... &lt;span class="m"&gt;4&lt;/span&gt; more&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;com.Book&lt;/code&gt; に &lt;code&gt;listメソッドがない&lt;/code&gt; と言われる。ローカルで動作させるのは無理？？&lt;/p&gt;</description></item><item><title>Groovyユーザーグループ・第三回関西支部のアナウンスが</title><link>https://genzouw.com/entry/2009/07/13/221000/314/</link><pubDate>Mon, 13 Jul 2009 22:10:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/13/221000/314/</guid><description>&lt;p&gt;Groovyユーザーグループ・第三回関西支部のアナウンスが、こんなところにも掲載されていた。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://www.atmarkit.co.jp/event/calendar/detail.php?event_id=21124"&gt;＠ITイベントカレンダー：日本Grails/Groovyユーザーグループ 第3回関西支部「Grails on GAE/J 勉強会」 − ＠IT&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;kiyOtakaさんは企画まで奮闘してくれて感謝しています。&lt;/p&gt;&#10;&lt;p&gt;会場にはおかしやドリンクまで用意してくれていますし。（無線も使えて非常に快適）&lt;/p&gt;&#10;&lt;p&gt;自分なりのGroovy、関西支部長への恩返しとしてGroovyのブログ続けよう。&lt;/p&gt;&#10;&lt;p&gt;（放置ぎみだった・・・、いや、仕事が忙しかったんだよ、いいわけじゃないよ・・・）&lt;/p&gt;</description></item><item><title>Google App EngineでGrailsの資料（第2回 「Groovyイン・アクション」読書会IN関西で使用）</title><link>https://genzouw.com/entry/2009/07/13/220600/315/</link><pubDate>Mon, 13 Jul 2009 22:06:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/13/220600/315/</guid><description>&lt;p&gt;&lt;a href="http://www.jggug.org/news/dai2kai%E3%80%8Cgroovyin%E3%83%BBakushon%E3%80%8Ddokushokaiinkansaikaisai"&gt;第2回 「Groovyイン・アクション」読書会IN関西 開催 ‎(main)‎&lt;/a&gt;での資料、全然アップできていなかった・・・&lt;/p&gt;&#10;&lt;p&gt;5/30(土)に使った資料であり、かつメンテナンスできていないけれども。&lt;/p&gt;&#10;&lt;p&gt;加えて同じような、しかももっとわかりやすい資料がアップされているけれども、自分が作成した資料もアップしておく。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://docs.google.com/present/edit?hl=ja&amp;amp;id=dgkcctp6_2123s6h5tc7"&gt;Google App EngineでGrails! - &amp;ldquo;Google Docs&amp;rdquo;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;他の方も見れるのかな？公開しているはずなんだけど。&lt;/p&gt;</description></item><item><title>Twitter API の使用制限について</title><link>https://genzouw.com/entry/2009/07/06/070000/316/</link><pubDate>Mon, 06 Jul 2009 07:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/07/06/070000/316/</guid><description>&lt;p&gt;最近、&lt;strong&gt;Groovy&lt;/strong&gt;を使って&lt;strong&gt;Twitter API&lt;/strong&gt;を操作しようとしています。&lt;/p&gt;&#10;&lt;p&gt;ただ、色々作ってみているのですが時々プログラムがうまく動かなくなることがありました。&lt;/p&gt;&#10;&lt;p&gt;勉強不足だったのですが、以下のページを見るとどうやら &lt;strong&gt;APIに対して一時間に150アクセス以上するな&lt;/strong&gt; とかかれていました。&#10;アクセスに限界があるんですね。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://twitterapi.pbworks.com/Rate-limiting"&gt;Twitter API Wiki / Rate limiting&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;以下のURLにアクセスすることで残りの &lt;strong&gt;API呼出可能&lt;/strong&gt; &lt;strong&gt;回数&lt;/strong&gt; と &lt;strong&gt;リセットされる時間&lt;/strong&gt; が分かります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://twitter.com/account/rate_limit_status.xml"&gt;http://twitter.com/account/rate_limit_status.xml&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ただ、これだと不便もあるので特別措置も用意しているみたい。それがホワイトリスト。&lt;/p&gt;&#10;&lt;p&gt;以下の入力フォームにipアドレス（アカウントも？）と利用目的を入力すると後日返答があるみたい。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://twitter.com/help/request_whitelisting"&gt;request whitelisting&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;もっともまだ何を作ろうか決まってないけど。&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>まだ会いたいって思っている人いるんだなぁ</title><link>https://genzouw.com/entry/2009/06/20/094000/318/</link><pubDate>Sat, 20 Jun 2009 09:40:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/06/20/094000/318/</guid><description>&lt;p&gt;子供が生まれてから、知人と会うことがめっきり減りました。土日は毎週のようにみんなでバドミントンをしていたのですが、結婚し、嫁が妊娠し、子供が生まれてからはまったく参加できず。飲みに誘われることもなくなり（気を遣ってくれてるんだろうなぁ）、みんな僕のことをわすれてしまったかな、と思ってた。&lt;/p&gt;&#10;&lt;p&gt;今日知人の誕生日会に誘われ、ひさびさにみんなに会えると思っていたのだが今週仕事が忙しかったので嫁に子供を預けきり。僕一人で誕生日会に参加で嫁だけ家で子供の面倒というわけにもいかないのでキャンセルした。&lt;/p&gt;&#10;&lt;p&gt;監事のやつが「しょうがないね、でもみんなゲンゾウ君に会いたがってたのだけは知っておいて」って。&lt;/p&gt;&#10;&lt;p&gt;なんだかうるっと来たし、申し訳なくなった。俺だけじゃなかったんだなぁ。&lt;/p&gt;&#10;&lt;p&gt;ちょっと独り言。&lt;em&gt;&lt;strong&gt;技術ネタ調べてないのでなんかエントリ書こうと思って&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>groovyでsvn操作ツール作ったよ</title><link>https://genzouw.com/entry/2009/06/09/214300/319/</link><pubDate>Tue, 09 Jun 2009 21:43:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/06/09/214300/319/</guid><description>&lt;h2 id="愛機は-ubuntu"&gt;愛機は &lt;strong&gt;Ubuntu&lt;/strong&gt;&lt;/h2&gt;&#10;&lt;p&gt;なんどかエントリに投稿しているけれども僕の家のマシンはubuntuです。&lt;/p&gt;&#10;&lt;p&gt;理由は&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Windows系OSは &lt;strong&gt;CUI&lt;/strong&gt; 機能が弱い&lt;/li&gt;&#10;&lt;li&gt;Mac系OSは 費用が高い&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;結果として、かなり古めのNotebookに &lt;a href="https://www.ubuntulinux.jp/"&gt;Ubuntu&lt;/a&gt; OSをインストールして使っています。意外と軽くて良い。&lt;/p&gt;&#10;&lt;h2 id="逆にguiの弱さで苦しむ時がある"&gt;逆にGUIの弱さで苦しむ時がある&lt;/h2&gt;&#10;&lt;p&gt;Windows系だと &lt;strong&gt;TortoiseSVN&lt;/strong&gt; なんかがあるんだろうけど、基本的に &lt;strong&gt;Terminal&lt;/strong&gt; で充分なのでなくてもあまり気にしない。&lt;/p&gt;&#10;&lt;p&gt;ただし、&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;svn add&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;svn remove&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;svn commit -m 〜&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;の操作についてはコミット前に何度か叩かないといけないので面倒くさい。&lt;/p&gt;&#10;&lt;h2 id="guiなsvn操作ツールを作ってしまおう"&gt;GUIなSVN操作ツールを作ってしまおう！&lt;/h2&gt;&#10;&lt;p&gt;そこで簡単なSVN操作ツール作ってみた。&lt;/p&gt;&#10;&lt;p&gt;SwingBuilderそのまま使っていて、Event Dispatch Threadとか考慮できていないのでそこは許してください。&lt;/p&gt;&#10;&lt;h4 id="スクリーンショット"&gt;スクリーンショット&lt;/h4&gt;&#10;&lt;p&gt;&lt;img src="https://drive.google.com/uc?usp=sharing&amp;amp;export=view&amp;amp;id=1Lfw1WHNNMI4sLLEtVxjId6sZeDzy4pb5" alt=""&gt;&lt;/p&gt;&#10;&lt;h4 id="使い方"&gt;使い方&lt;/h4&gt;&#10;&lt;p&gt;SVN管理フォルダに移動して、&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;svntool.groovy&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;と叩けばOK。&lt;/p&gt;&#10;&lt;h4 id="セットアップ"&gt;セットアップ&lt;/h4&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;どこかに以下のコードを &lt;strong&gt;svntool.groovy&lt;/strong&gt; という名前で保存。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;svn&lt;/strong&gt; コマンドにパスは通しておこう。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;tkdiff&lt;/strong&gt; コマンドが使えると多少幸せになれる（これは、Linux限定です）&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;&lt;strong&gt;windows&lt;/strong&gt; の場合には、すべての &lt;strong&gt;&amp;ldquo;svn 〜&amp;rdquo;&lt;/strong&gt; の部分を &lt;strong&gt;&amp;ldquo;cmd.exe /c svn 〜&amp;rdquo;&lt;/strong&gt; に書き直してね。&lt;/em&gt;(WindowsにはTortoiseSVNあるかw)*&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;&lt;strong&gt;windows&lt;/strong&gt; でも、Cygwin上ならそのまま使える（windowsで試してみた）&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h4 id="コード"&gt;コード&lt;/h4&gt;&#10;&lt;p&gt;&lt;strong&gt;svntool.groovy&lt;/strong&gt; を作成&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ポイントは &lt;code&gt;SwingBuilder&lt;/code&gt; を使っている点。これならWindows/Linux/Macのどの環境でも動作しますね。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;javax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JOptionPane&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;groovy.swing.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.swing.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;getDiffList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;svn status&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLines&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;/s+/&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;status:&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="nl"&gt;path:&lt;/span&gt;&lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;getSelectedDiffList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedRows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;rowsModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;refreshScreen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;svn info&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;rowsModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getDiffList&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;resizeAndRepaint&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;swing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SwingBuilder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;title:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;svn操作ツール&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;defaultCloseOperation:&lt;/span&gt;&lt;span class="n"&gt;JFrame&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;EXIT_ON_CLOSE&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;show:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;pack:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;id:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frame&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;vbox&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;svn info&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;size:&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="nl"&gt;id:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;info&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;scrollPane&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;id:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;table&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;selectionMode:&lt;/span&gt;&lt;span class="n"&gt;ListSelectionModel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MULTIPLE_INTERVAL_SELECTION&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tableModel&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;list:&lt;/span&gt;&lt;span class="n"&gt;getDiffList&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;propertyColumn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;header:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;状態&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;propertyName:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;status&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;propertyColumn&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;header:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ファイル名&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;propertyName:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;path&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;hbox&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;? &amp;gt; add&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;actionPerformed:&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;evt&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;selectedPaths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getSelectedDiffList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;?&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}*.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;selectedPaths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;svn add ${it}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;refreshScreen&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;})&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;! &amp;gt; del&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;actionPerformed:&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;evt&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;selectedPaths&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getSelectedDiffList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;!&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}*.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;selectedPaths&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;svn remove ${it}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;refreshScreen&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;})&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;diff&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;actionPerformed:&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;evt&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;selectedPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getSelectedDiffList&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;M&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}*.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;svn diff --diff-cmd tkdiff ${selectedPath}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;})&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;hbox&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;commit&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;actionPerformed:&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;evt&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;comment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;showInputDialog&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;コメントを入力&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;comment&lt;/span&gt; &lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;svn commit -m &amp;#34;&lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&lt;span class="n"&gt;comment&lt;/span&gt;&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;showMessageDialog&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;refreshScreen&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;})&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;update&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;actionPerformed:&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;evt&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;svn update&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;showMessageDialog&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;frame&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;refreshScreen&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;})&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="最後に"&gt;最後に&lt;/h4&gt;&#10;&lt;p&gt;Groovyよ・・・最高だ。&lt;/p&gt;</description></item><item><title>GStringは場合により遅延評価される</title><link>https://genzouw.com/entry/2009/06/09/000000/320/</link><pubDate>Tue, 09 Jun 2009 00:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/06/09/000000/320/</guid><description>&lt;p&gt;&lt;strong&gt;Groovyインアクション読書会 IN 関西&lt;/strong&gt;でちょっとだけ話に上がったこと。&lt;/p&gt;&#10;&lt;p&gt;僕が「GroovyのGStringは遅延評価されるよ」という発言に皆さんが「遅延評価ではないよ」といっていた。&lt;/p&gt;&#10;&lt;p&gt;確かに&lt;strong&gt;Groovyインアクション&lt;/strong&gt;にも遅延評価ではないととれるような記述があった。&lt;/p&gt;&#10;&lt;p&gt;僕はううーーん、と思ってしまったのだが、それを証明してくれるエントリが。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/r_ikeda/20090523/gstring"&gt;Groovy の文字列リテラル GString は遅延評価される - 集中力なら売り切れたよ&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;そうそう、こういうこと。&lt;/p&gt;&#10;&lt;p&gt;&lt;del&gt;まぁ、&lt;strong&gt;GString&lt;/strong&gt;の変数を使うかといわれると使うことはないのでこういうことは滅多にないのかもしれないけど。&lt;/del&gt;&lt;/p&gt;&#10;&lt;h4 id="20090610追記"&gt;2009/06/10追記&lt;/h4&gt;&#10;&lt;p&gt;&lt;strong&gt;自分で書いていて勘違い。場合によりではなく、常に遅延評価ですねw&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;綺麗にまとめてくれいるので、こちらを未他方がいいかな&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/odashinsuke/20090609/1244546891"&gt;GString の評価について誤解してた… - お だ のスペース&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/ksky/20090609"&gt;2009-06-09 - Groovyラボ @Reloaded&lt;/a&gt;&lt;/p&gt;</description></item><item><title>続・topcoderの道１をといてみる</title><link>https://genzouw.com/entry/2009/06/06/144400/321/</link><pubDate>Sat, 06 Jun 2009 14:44:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/06/06/144400/321/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2009/06/05/152000"&gt;topcoderの道１をといてみる | ゲンゾウ用ポストイット&lt;/a&gt; の続き。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uehaj/20090605/1244216656"&gt;Groovyで文字処理を書くときの心得 - Grな日々(uehajの日記)&lt;/a&gt; で以下のようなエントリが。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;先のエントリと、ほかにいくつかGroovyでパズルっぽいコードを書いてみたんだけど、あれだね。Groovyで文字の絡む処理はC言語的にやったら負けだね。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;たしかに。効率もだけど、それ以上により簡潔に書きたい。&lt;/p&gt;&#10;&lt;p&gt;ちょっと直してみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CCipher&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;ALPHA_LIST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ciphertest&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ciphertest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ALPHA_LIST&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;ALPHA_LIST&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;indexOf&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CCipher&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;VQREQFGT&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt; &lt;span class="o"&gt;;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;TOPCODER&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;ABCDEFGHIJKLMNOPQRSTUVWXYZ&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt; &lt;span class="o"&gt;;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;QRSTUVWXYZABCDEFGHIJKLMNOP&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;TOPCODER&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt; &lt;span class="o"&gt;;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;TOPCODER&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;quot&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一行しか変わってないけどwもっとうまい書き方ないかな。&lt;/p&gt;</description></item><item><title>topcoderの道１をといてみる</title><link>https://genzouw.com/entry/2009/06/05/152000/322/</link><pubDate>Fri, 05 Jun 2009 15:20:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/06/05/152000/322/</guid><description>&lt;p&gt;&lt;a href="http://ameblo.jp/programming/entry-10001699519.html"&gt;topcoderの道１ | プログラミングに自信があるやつこい！！&lt;/a&gt; を説いてみた。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Groovy&lt;/strong&gt;は本当にプログラム組むのも実行するのも楽。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CCipher&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;ALPHA_LIST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ciphertest&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ciphertest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ALPHA_LIST&lt;/span&gt;&lt;span class="o"&gt;[(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;char&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;shift&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;CCipher&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;VQREQFGT&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;TOPCODER&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;QRSTUVWXYZABCDEFGHIJKLMNOP&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;TOPCODER&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;TOPCODER&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>１０分でコーディング｜プログラミングに自信があるやつこい！！ だって。</title><link>https://genzouw.com/entry/2009/06/05/054700/323/</link><pubDate>Fri, 05 Jun 2009 05:47:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/06/05/054700/323/</guid><description>&lt;p&gt;&lt;a href="http://ameblo.jp/programming/entry-10001721422.html"&gt;１０分でコーディング｜プログラミングに自信があるやつこい！！&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;をやってみた。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;&#10;あまりに簡単なので制限時間を１０分としてやってみてください。&#10;これ以上かかった人は&#10;自分はかなりプログラミングができない。&#10;とつらい事実を認識しましょう。&#10;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&#10;&lt;p&gt;はい、がんばります&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Cards&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;deal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;numPlayers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;deck&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cardCount&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;deck&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;numPlayers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;deck&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toList&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;groupBy&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++%&lt;/span&gt;&lt;span class="n"&gt;numPlayers&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cards&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;012345012345012345&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;000&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;111&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;222&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;333&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;444&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;555&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;111122223333&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;123&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;123&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;123&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;123&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;012345012345012345&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;012345012345012345&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>手作業Grep どう書く？org</title><link>https://genzouw.com/entry/2009/06/04/081000/324/</link><pubDate>Thu, 04 Jun 2009 08:10:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/06/04/081000/324/</guid><description>&lt;p&gt;手作業Grep どう書く？orgをといてみた。&lt;/p&gt;&#10;&lt;p&gt;どう書く？org 9043 genzou: swingで。(手作業Grep) - 投稿の詳細&lt;/p&gt;&#10;&lt;pre language="java" name="code"&gt;&#10;#!/usr/bin/env groovy&#10;import groovy.swing.*&#10;import javax.swing.*&#10;&lt;p&gt;def swing = new SwingBuilder()&#10;def frame = swing.frame(title:&amp;lsquo;Frame&amp;rsquo;, defaultCloseOperation:JFrame.EXIT_ON_CLOSE, show:true, pack:true, id:&amp;ldquo;frame&amp;rdquo;){&#10;panel{&#10;vbox{&#10;list(listData:System.in.readLines() as Vector, id:&amp;ldquo;list&amp;rdquo;, selectionMode:ListSelectionModel.MULTIPLE_INTERVAL_SELECTION){&#10;}&#10;button(&amp;ldquo;出力！&amp;rdquo;, actionPerformed:{ evt -&amp;gt;&#10;println swing.list.selectedValues.join(&amp;ldquo;n&amp;rdquo;)&#10;System.exit(0)&#10;})&#10;}&#10;}&#10;}&#10;&lt;/pre&gt;&lt;/p&gt;&#10;&lt;p&gt;標準出力の内容によってサイズが変わるので出力内容が多いと高さが&amp;hellip;&lt;/p&gt;</description></item><item><title>Groovyイン・アクション読書会IN関西 第２回</title><link>https://genzouw.com/entry/2009/06/01/064100/325/</link><pubDate>Mon, 01 Jun 2009 06:41:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/06/01/064100/325/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2009/04/26/093700"&gt;Groovyイン・アクション読書会IN関西 いってきたよ | ゲンゾウ用ポストイット&lt;/a&gt; に引き続き、第２回に参加してきた。&lt;/p&gt;&#10;&lt;p&gt;利用できる人はSkypeのオープンチャットを利用したのだけれども、僕のUbuntuでのSkypeはオープンチャットできなかった。LinuxのSkypeはv2.0で止まっているみたい。v2.6ぐらいからオープンチャット可能ということなので。残念。気づいたことをアップしてきたかった。&lt;/p&gt;&#10;&lt;p&gt;読書会で一番しれてよかったのはクロージャの再帰呼び出しの方法かな。&lt;/p&gt;&#10;&lt;p&gt;今まで再帰呼び出ししたいと思った場合には、&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;メソッドを定義して再帰&lt;/li&gt;&#10;&lt;li&gt;一度空の変数を作成してから、再帰呼び出しクロージャの定義&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;といずれかを行っていた。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;１の例&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;２の例&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;x&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;クロージャで再帰呼び出しすることはできないと思ってたのデスが、以下のようにcallメソッドを使えば可能。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;それから、クロージャの &lt;code&gt;asWritable&lt;/code&gt; メソッドが正常に動かない。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;asWritable&lt;/code&gt; メソッドを使用して作成したクロージャのクローンは、実行後に結果を出力する設定が可能な &lt;code&gt;writeTo&lt;/code&gt; メソッドがつかされるということなので試してみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;asWritable&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withWriter&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;writeTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;lt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果では &lt;strong&gt;3a&lt;/strong&gt; と出力されると思ったけど &lt;strong&gt;a&lt;/strong&gt; しか出力されない。しかもコード実行後には &lt;code&gt;println&lt;/code&gt; メソッド使用できなくなるし。使い方が間違っているのだろうか。うーん。&lt;/p&gt;&#10;&lt;p&gt;なんにせよ今回も楽しかった。読書会終了後の懇談会が飲みながらコーディングでなんだかわけがわからないコード書いていた。&lt;/p&gt;</description></item><item><title>SwingPadを改良</title><link>https://genzouw.com/entry/2009/06/01/064000/326/</link><pubDate>Mon, 01 Jun 2009 06:40:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/06/01/064000/326/</guid><description>&lt;p&gt;&lt;strong&gt;griffon&lt;/strong&gt;でアプリを作成する際に、簡単に画面周りの&lt;strong&gt;変更→確認&lt;/strong&gt;をしたければ、インストールフォルダの&lt;strong&gt;examples/SwingPad&lt;/strong&gt;を利用するのがよい。&lt;/p&gt;&#10;&lt;p&gt;でも、このアプリも若干気になる所があって、&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;viewからmodelへの入力値反映のためにbindメソッドを使用しているコードを実行するとエラー&lt;/li&gt;&#10;&lt;li&gt;viewのgroovyコードをそのまま張り付けてもだめで、application(){ &amp;hellip; } の内側とimport文のみのこして後はコメントアウトさせて実行しないとだめ&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;解決できるように、SwingPadのコードをほんの少し修正してみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * Copyright 2007-2008 the original author or authors.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * Licensed under the Apache License, Version 2.0 (the &amp;#34;License&amp;#34;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * you may not use this file except in compliance with the License.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * You may obtain a copy of the License at&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * http://www.apache.org/licenses/LICENSE-2.0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * Unless required by applicable law or agreed to in writing, software&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * distributed under the License is distributed on an &amp;#34;AS IS&amp;#34; BASIS,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * See the License for the specific language governing permissions and&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.awt.Color&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.awt.Font&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.awt.Robot&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.awt.FlowLayout&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.awt.event.ActionEvent&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;javax.swing.JComponent&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;javax.swing.JFileChooser&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;javax.swing.JOptionPane&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;javax.swing.SwingConstants&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;javax.swing.JSplitPane.*&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;javax.imageio.ImageIO&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.util.prefs.Preferences&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;groovy.ui.text.FindReplaceUtility&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;org.codehaus.groovy.runtime.StackTraceUtils&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SwingPadController&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prefs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Preferences&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;userNodeForPackage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SwingPadController&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentFileChooserDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;currentFileChooserDir&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentClasspathJarDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;currentClasspathJarDir&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentClasspathDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;currentClasspathDir&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentSnapshotDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;currentSnapshotDir&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;runThread&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GroovyClassLoader&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groovyClassLoader&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;scriptCounter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;factorySet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TreeSet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;mvcGroupInit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groovyClassLoader&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GroovyClassLoader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;classLoader&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;updateTitle&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// TODO handle undo!&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dirty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34; *&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34; - SwingPad&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SwingPad&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;newScript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;askToSaveFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dirty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestFocus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;open&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;selectFilename&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doOutside&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;scriptText&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLines&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;n&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doLater&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;scriptText&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// need 2-way binding!&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;scriptText&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dirty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;caretPosition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestFocus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;saveAs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dirty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;saveAs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;selectFilename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Save&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dirty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;askToSaveFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FindReplaceUtility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dispose&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;shutdown&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;snapshot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentSnapshotDir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fileSelectionMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FILES_ONLY&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acceptAllFileFilterUsed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Snapshot&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPROVE_OPTION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentSnapshotDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentDirectory&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;currentSnapshotDir&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentSnapshotDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;frameBounds&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bounds&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;capture&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Robot&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;createScreenCapture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frameBounds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedFile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lastIndexOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;png&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dot&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.$ext&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentSnapshotDir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ImageIO&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pane&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;optionPane&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Successfully saved snapshot tonn${target.absolutePath}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;Snapshot&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;invokeTextAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;closure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;closure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;invokeTextAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cut&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;copy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;invokeTextAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;paste&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;invokeTextAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;paste&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;selectAll&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;invokeTextAction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectAll&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// TODO yet unconnected!!&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;find&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FindReplaceUtility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showDialog&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;findNext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FindReplaceUtility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FIND_ACTION&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;actionPerformed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;findPrevious&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reverseEvt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ActionEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;iD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;actionCommand&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;when&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ActionEvent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SHIFT_MASK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;//reverse&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FindReplaceUtility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FIND_ACTION&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;actionPerformed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reverseEvt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;FindReplaceUtility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;largerFont&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;modifyFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;40&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;modifyFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;40&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;smallerFont&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;modifyFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;modifyFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;packComponents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;newLayout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flowLayout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alignment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;FlowLayout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;LEFT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hgap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;vgap&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;borderLayout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;newLayout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isAssignableFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;layout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;newLayout&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;successfulScript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;runScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;showRulers&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;rowHeader&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;emptyRowHeader&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;columnHeader&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;emptyColumnHeader&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scroller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;rowHeader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scroller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;rowHeaderView&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rh&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scroller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;columnHeaderView&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scroller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;repaint&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;runScript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedIndex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// sourceTab&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;runThread&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doLater&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Running Script ...&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;caretPosition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;showDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;runWaitDialog&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;applications&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(.&lt;/span&gt;&lt;span class="o"&gt;+?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;{)(.&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;)(}&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;p3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLines&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;// &amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;p3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLines&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;// &amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;edt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;inputArea&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;executeScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Throwable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doLater&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;finishWithException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doLater&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hideDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;runWaitDialog&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;runThread&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;runSampleScript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentSample&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentSample&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Enabling ${model.builders[builder].type} ...&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;${builder}Menu&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doOutside&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toggleBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;${builder}Menu&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doLater&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Loading Script ...&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;samples&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentSample&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;caretPosition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runAction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;runScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Loading Script ...&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;samples&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentSample&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;caretPosition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;runAction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;runScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;about&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pane&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;optionPane&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// work around GROOVY-1048&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;Welcome&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SwingPad&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;createDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;About&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SwingPad&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;confirmRunInterrupt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showConfirmDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Attempt to interrupt script?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SwingPad&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;YES_NO_OPTION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;YES_OPTION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;runThread&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;runThread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;interrupt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// the folowing 4 actions taken from groovy.ui.Console&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;addClasspathJar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentClasspathJarDir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fileSelectionMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FILES_ONLY&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acceptAllFileFilterUsed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Add&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPROVE_OPTION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentClasspathJarDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentDirectory&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;currentClasspathJarDir&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentClasspathJarDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groovyClassLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedFile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toURL&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;addClasspathDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentClasspathDir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fileSelectionMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DIRECTORIES_ONLY&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acceptAllFileFilterUsed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Add&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPROVE_OPTION&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentClasspathDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentDirectory&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;currentClasspathDir&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentClasspathDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groovyClassLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedFile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toURL&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;showToolbar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;showToolbar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selected&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;putBoolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;showToolbar&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;showToolbar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toolbar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;visible&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;showToolbar&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;suggestNodeName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;caret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;caretPosition&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;caret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;document&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;caret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;zA&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Z&lt;/span&gt;&lt;span class="o"&gt;]/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;caret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;caret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;caret&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;factorySet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;populateFactorySet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;suggestions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;factorySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;suggestions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;suggestions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suggestion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;caret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;caret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;suggestions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;iterator&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;writeSuggestion&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suggestion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;caret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;caret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suggestions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suggestions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;suggestions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;popup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showPopup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SwingConstants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CENTER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suggestionList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedIndex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;codeComplete&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suggestion&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suggestions&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suggestionList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedIndex&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;popup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hidePopup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;writeSuggestion&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toggleFlamingoBuilder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doOutside&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toggleBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;flamingo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flamingo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toggleTrayBuilder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doOutside&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toggleBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;tray&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tray&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toggleMacwidgetsBuilder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doOutside&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toggleBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;macwidgets&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;macwidgets&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toggleLayout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;horizontalLayout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;horizontalLayout&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;splitPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;orientation&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;horizontalLayout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HORIZONTAL_SPLIT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;VERTICAL_SPLIT&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toggleLayoutAction&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;putValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SmallIcon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;horizontalLayout&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;verticalLayoutIcon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;horizontalLayoutIcon&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;writeSuggestion&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suggestion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;textEditor&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;document&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suggestion&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;substring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;insertString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;offset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;requestFocus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// clear it!&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;suggestion&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;finishNormal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;successfulScript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doLater&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;Execution&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;removeAll&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;repaint&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;instanceof&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JComponent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;The script did not return a JComponent!&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;finishWithException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Throwable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;successfulScript&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;Execution&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;terminated&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;exception&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;StackTraceUtils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deepSanitize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;baos&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ByteArrayOutputStream&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PrintStream&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;baos&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doLater&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;removeAll&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;repaint&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tabs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedIndex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// errorsTab&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;errors&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;baos&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;caretPosition&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;showAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doLater&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showMessageDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;WARNING_MESSAGE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;showMessage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doLater&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showMessageDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;INFORMATION_MESSAGE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;showDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialogName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;$dialogName&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pack&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setLocation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;hideDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialogName&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;$dialogName&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dialog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hide&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;selectFilename&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Open&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// should use builder.fileChooser() ?&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentFileChooserDir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fileSelectionMode&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FILES_ONLY&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;acceptAllFileFilterUsed&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JFileChooser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPROVE_OPTION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentFileChooserDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;currentDirectory&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;prefs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;currentFileChooserDir&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentFileChooserDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedFile&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;boolean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;askToSaveFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;||&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dirty&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;switch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showConfirmDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;appFrames&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Save changes to &amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;scriptFile&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SwingPad&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;YES_NO_CANCEL_OPTION&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;YES_OPTION&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;case&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NO_OPTION&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;executeScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;codeSource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;codeSource&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;codeSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;binds&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;[^&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;]+?&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groovyClassLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseClass&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;codeSource&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;getScriptName&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Script&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;edt&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;)}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// if( !(component instanceof JComponent) ) {&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// throw new IllegalArgumentException(&amp;#34;The script did not return a JComponent!&amp;#34;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// }&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doLater&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;finishNormal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;component&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Throwable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;doLater&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;finishWithException&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getScriptName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;SwingPad_script&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;scriptCounter&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;modifyFont&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sizeFilter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sizeMod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentFont&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;font&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sizeFilter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;currentFont&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;font&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Font&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;Monospaced&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentFont&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;currentFont&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sizeMod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;populateFactorySet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// TODO filter factories coming from SwingXBuilder that have jxclassicSwing: on their name&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Script&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;factorySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ub&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builderRegistration&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ubr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ubr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oldProxy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;proxyBuilder&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;proxyBuilder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;factorySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ubr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;factories&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keySet&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ubr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;prefixString&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;proxyBuilder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oldProxy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;factorySet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;factorySet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;grep&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;jxclassicSwing:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;toggleBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;cname&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selected&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builderConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;$builder&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;view&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;*&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builderConfig&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// With no current way to unload an URL from the rootLoader&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// we have to keep track if an URL has already been added to it&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loaded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProperty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;griffon.start.dir&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;startDir&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jarDir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;startDir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;lib/$name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jarDir&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;eachFileMatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;.jar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;jar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// groovyClassLoader.addURL(jar.toURI().toURL())&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;classLoader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toURI&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toURL&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loaded&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;binding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Binding&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setVariable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;controller&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;def (m, v, c) = controller.createMVCGroup(&amp;#34;&lt;/span&gt;&lt;span class="n"&gt;Script&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;&lt;span class="n"&gt;Script&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;,[:])&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; return v&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Script&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;GroovyShell&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;groovyClassLoader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;binding&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;StackTraceUtils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;deepSanitize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ex&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selected&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selected&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;showAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Enable $cname&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Couldn&amp;#39;t enable $cname:nn$ex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;populateFactorySet&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;builders&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enabled&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;長々とコード載せたが、元ソースからl194〜199、l453〜455を変えただけ。&lt;/p&gt;</description></item><item><title>SwingのEvent Dispatch ThreadとGriffonのedt</title><link>https://genzouw.com/entry/2009/05/29/231400/328/</link><pubDate>Fri, 29 May 2009 23:14:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/05/29/231400/328/</guid><description>&lt;p&gt;今更ながら、Griffon登場後にSwingの本やサイトを見ては勉強しています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://groovetube.org/rsd.php?itemid=517"&gt;Swing EDT(Event Dispatch Thread)関係おさらい - Groove Tube&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://groovetube.org/index.php?itemid=502&amp;amp;catid=7"&gt;またEDTにやられる… - Groove Tube&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/Kazzz/20080104/p1"&gt;Swingとスレッドと再描画 - Kazzzの日記&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="event-dispatch-thread"&gt;Event Dispatch Thread?&lt;/h2&gt;&#10;&lt;p&gt;Swingでボタン押下後の処理などを書きたい場合には、Swing GUIを管理しているスレッドとは別のスレッドを起動して実行する必要がある。&#10;このGUIを管理しているスレッドを &lt;strong&gt;Event Dispatch Thread&lt;/strong&gt; って呼ぶらしい。&lt;/p&gt;&#10;&lt;p&gt;このスレッド内で重たい処理を実行させると、処理完了までに以下のような問題が発生する。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;GUIのリサイズできない&lt;/li&gt;&#10;&lt;li&gt;GUIの移動できない&lt;/li&gt;&#10;&lt;li&gt;コントロールに入力したりフォーカス合わせたりできない&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;「Swingっていけてないじゃん、重たいじゃん」と勘違いしてしまう。つい最近そんなことをしてしまっていた。&lt;/p&gt;&#10;&lt;p&gt;別スレッドを生成して実行させても、その処理を実行後にまた &lt;strong&gt;EDT&lt;/strong&gt; に制御を戻して描画を行ったり・・・めんどいきがする。&lt;/p&gt;&#10;&lt;h2 id="griffonのedtメソッドdooutsideメソッド"&gt;Griffonのedtメソッド、doOutsideメソッド&lt;/h2&gt;&#10;&lt;p&gt;そこで &lt;strong&gt;Groovy&lt;/strong&gt; の &lt;strong&gt;Griffon&lt;/strong&gt; フレームワークが生きてくる。&lt;/p&gt;&#10;&lt;p&gt;コントローラクラス内では&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;edt&lt;/li&gt;&#10;&lt;li&gt;doOutsite&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;の二つのメソッドが使用できる。こいつらにクロージャーを渡すことで、edt、doOutsideブロック内に記述した処理はそれぞれ &lt;strong&gt;Event Dispatch Thread&lt;/strong&gt; の処理、あるいは別スレッドの処理として実行させることができる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;search&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ボタンを使用不可に&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;searchEnbled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 別スレッド処理&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;doOutside&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 検索処理&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ボタンを使用可能に&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;edt&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;searchEnabled&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最初 &lt;strong&gt;Griffon&lt;/strong&gt; のサイトの説明読んだときにはさっぱりだったけど、 &lt;strong&gt;Swing&lt;/strong&gt; について勉強していってようやくわかってきた。&lt;/p&gt;</description></item><item><title>Groovy 1.6のBindable</title><link>https://genzouw.com/entry/2009/05/29/075300/329/</link><pubDate>Fri, 29 May 2009 07:53:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/05/29/075300/329/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/fujwara/20090527#c"&gt;groovy1.6の紹介記事 - おっさんの手習い&lt;/a&gt;にgroovy1.6の新機能についての説明が日本語で出ているよとかかれていたので読んでみた。&lt;/p&gt;&#10;&lt;p&gt;1.6の新機能がよく分かっていなかったけど、分かってきた。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;groovyConsole&lt;/strong&gt;の実行結果がJTableで表示可能とか、おもしろい。&lt;/p&gt;&#10;&lt;p&gt;特におもしろいと思ったのは&lt;strong&gt;Bindableアノテーション&lt;/strong&gt;の機能。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;PropertyCangeSupport&lt;/strong&gt;の機能自体しらなかったからこそですが。&lt;/p&gt;&#10;&lt;p&gt;以下のコードにて。&lt;/p&gt;&#10;&lt;p&gt;MyBeanオブジェクトに&lt;strong&gt;PropertyChangeListener&lt;/strong&gt;を追加することで、プロパティ変更時に処理を行うことが可能。&lt;/p&gt;&#10;&lt;p&gt;複数渡せば複数の処理が可能。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;!/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.beans.PropertyChangeSupport&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.beans.PropertyChangeListener&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.beans.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PropertyChangeEvent&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyBean&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;たろう&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PropertyChangeSupport&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PropertyChangeSupport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;addPropertyChangeListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PropertyChangeListener&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addPropertyChangeListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;removePropertyChangeListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;PropertyChangeListener&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;removePropertyChangeListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;setName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pcs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;firePropertyChange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bean1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyBean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;bean1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addPropertyChangeListener&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;old:${evt.oldValue}, new:${evt.newValue}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PropertyChangeListener&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;bean1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addPropertyChangeListener&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;evt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;別途追加したListner&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PropertyChangeListener&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bean2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyBean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;bean1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;はなこー&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;bean2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;さぶろー&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同様の処理を**@Bindableアノテーション**を利用すると非常に簡単になる。&lt;strong&gt;addPropertyCangeListener&lt;/strong&gt;メソッドは勝手に追加されてる。&lt;/p&gt;</description></item><item><title>クリップボード操作コマンドxsel、putclip</title><link>https://genzouw.com/entry/2009/05/28/080700/330/</link><pubDate>Thu, 28 May 2009 08:07:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/05/28/080700/330/</guid><description>&lt;p&gt;最近ちゃんと投稿できていなかったので反省。&lt;/p&gt;&#10;&lt;p&gt;linux上でクリップボードを定期的にチェックしたかったので、groovyで。&lt;/p&gt;&#10;&lt;p&gt;動作確認はしてないけど、windowsにcygwinはいっていたら動くかも。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;!/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import static&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;javax.swing.JOptionPane.*&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oldclip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;COMMAND&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;os.name&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;xsel -b -o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;cmd.exe /c getclip&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oldclip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;COMMAND&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;COMMAND&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oldclip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;showMessageDialog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;groovy関連の情報をコピペした？&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;oldclip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clip&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Runnable&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>ついにGoogle App EngineでGrails動いた！！</title><link>https://genzouw.com/entry/2009/05/19/211700/331/</link><pubDate>Tue, 19 May 2009 21:17:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/05/19/211700/331/</guid><description>&lt;p&gt;大興奮です！！&lt;/p&gt;&#10;&lt;p&gt;たった今、 &lt;strong&gt;Google App Engine&lt;/strong&gt; 上で &lt;strong&gt;Grails&lt;/strong&gt; が動きました！昨日設定した内容で問題なかったようです。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2009/05/18/212600"&gt;Grails 1.1.1で、Google App Engineに再チャレンジ！ | ゲンゾウ用ポストイット&lt;/a&gt; から以降のいきさつは以下のとおり。&lt;/p&gt;&#10;&lt;h2 id="気持ちを切り替えてgoogle先生に尋ねる"&gt;気持ちを切り替えてGoogle先生に尋ねる&lt;/h2&gt;&#10;&lt;p&gt;昨日はすべて止めてしまったけど、娘が寝てから再度チャレンジしてみた。&lt;/p&gt;&#10;&lt;p&gt;google先生に &lt;strong&gt;datastore-indexes.xml&lt;/strong&gt; について質問してみると、関係がありそうなエントリが。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://blog.livedoor.jp/cbnanashi/archives/818468.html"&gt;CB NANASHI管理人ブログ : GAE/J、SDK 1.2.1が公開、バージョンアップ時の注意&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;また修正されたログ取得を試すためにappcfg.cmdを実行するとdatastore-indexes.xml がスキーマに合致しない旨の出ました。xmlの「xmlns=&amp;ldquo;&lt;a href="http://appengine.google.com/ns/datastore-indexes/1.0%22"&gt;http://appengine.google.com/ns/datastore-indexes/1.0&amp;quot;&lt;/a&gt;」を削除したところ動作しました。&lt;/p&gt;&#10;&lt;h2 id="そしてデプロイ再実行"&gt;そしてデプロイ再実行&lt;/h2&gt;&#10;&lt;p&gt;ということで、以下のファイルから上記に該当する箇所を削除。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ emacs target/war/WEB-INF/datastore-indexes.xml&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;再度実行。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;$APPENGINE_HOME&lt;/span&gt;/bin/appcfg.sh update ./target/war&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;おおお！！！いけた！！いけたよ！！！&#10;念願のGrailsがフリー環境のサーバーで動くよ！！！！！&#10;Google様、一生ついていきます！&lt;/p&gt;&#10;&lt;h2 id="そして"&gt;そして&lt;/h2&gt;&#10;&lt;p&gt;これを整理して、今月末の &lt;a href="http://www.jggug.org/news/dai2kai%E3%80%8Cgroovyin%E3%83%BBakushon%E3%80%8Ddokushokaiinkansaikaisai"&gt;第2回 「Groovyイン・アクション」読書会IN関西&lt;/a&gt; での &lt;strong&gt;LTネタ&lt;/strong&gt; としよう。&lt;/p&gt;</description></item><item><title>ケブンッリジ関数 どう書く？org</title><link>https://genzouw.com/entry/2009/05/18/221900/332/</link><pubDate>Mon, 18 May 2009 22:19:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/05/18/221900/332/</guid><description>&lt;p&gt;ケブンッリジ関数 どう書く？org&lt;/p&gt;&#10;&lt;p&gt;をといてみた。&lt;/p&gt;&#10;&lt;p&gt;ちょっと話題になってたみたいだけど、乗り遅れてしまった。(&lt;em&gt;一回コピペミスして誤ったコードアップしてしまった！！！くぅぅ恥ずかしい）&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;どう書く？org 8942 genzou:(ケブンッリジ関数) - 投稿の詳細&lt;/p&gt;&#10;&lt;p&gt;どすうで？ いいがと うまくかけょてるしで？&lt;/p&gt;&#10;&lt;p&gt;ちゃんと よめたら コンメト よくろし！&lt;/p&gt;</description></item><item><title>今更だけどGrailsの意味</title><link>https://genzouw.com/entry/2009/05/18/213000/333/</link><pubDate>Mon, 18 May 2009 21:30:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/05/18/213000/333/</guid><description>&lt;p&gt;今更だけどGrailsの名前の由来が分かった。&lt;/p&gt;&#10;&lt;p&gt;railsとかけているというのは分かっていたけどそれ以外にも意味があったんだね。&lt;/p&gt;&#10;&lt;p&gt;というか後付けなのかもしれないけど、ずっとGrailsのサイトのトップページに杯の絵がかかれているのがなんでだろう？？と思ってた。&lt;/p&gt;&#10;&lt;p&gt;土曜日にテレビのロードショーで「ダヴィンチコード」をやっていたのだけど、そこで&lt;strong&gt;イエスキリストの聖杯&lt;/strong&gt;について語るシーンが登場。それでその時の英語アップのシーンで「grail」の文字が。&lt;/p&gt;&#10;&lt;p&gt;知らなかった。grailって&lt;strong&gt;聖杯&lt;/strong&gt;って意味なんだね。&lt;/p&gt;</description></item><item><title>Grails 1.1.1で、Google App Engineに再チャレンジ！</title><link>https://genzouw.com/entry/2009/05/18/212600/334/</link><pubDate>Mon, 18 May 2009 21:26:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/05/18/212600/334/</guid><description>&lt;p&gt;pGrails 1.1.1がリリースされました。今回の目玉は &lt;strong&gt;Google App Engine&lt;/strong&gt; に対応したプラグインが使えること。以前試して挫折したので再度チャレンジしてみました。&lt;/p&gt;&#10;&lt;p&gt;ちなみにほとんど以下のサイトを参考にセットアップすればよいです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://www.grails.org/plugin/app-engine#comment_357"&gt;Grails - Plugin: Grails AppEngine plugin&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;注意点だけメモしておきます。&lt;/p&gt;&#10;&lt;h2 id="実行環境"&gt;実行環境&lt;/h2&gt;&#10;&lt;h3 id="java"&gt;Java&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;java.version: 1.6.0_13&lt;/code&gt;&lt;/p&gt;&#10;&lt;h3 id="groovy"&gt;GROOVY&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;Groovy Version: 1.6.3&lt;/code&gt;&lt;/p&gt;&#10;&lt;h3 id="grails"&gt;Grails&lt;/h3&gt;&#10;&lt;p&gt;&lt;code&gt;Grails 1.1.1&lt;/code&gt;&lt;/p&gt;&#10;&lt;h2 id="環境変数の設定"&gt;環境変数の設定&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;google app engine sdk&lt;/strong&gt; のセットアップフォルダパスを環境変数に設定する必要がある。linuxの場合、&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;export APPENGINE_HOME=〜〜〜&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;としておく。&lt;/p&gt;&#10;&lt;h2 id="configgroovyの設定"&gt;Config.groovyの設定&lt;/h2&gt;&#10;&lt;p&gt;以下のアプリ名はすべて揃える。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;grails create-app&lt;/li&gt;&#10;&lt;li&gt;Config.groovyのgoogle.appengine.applicationの値&lt;/li&gt;&#10;&lt;li&gt;google app engine&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="アプリは動いたのか"&gt;アプリは動いたのか？&lt;/h2&gt;&#10;&lt;p&gt;で、結局動いたのかというと・・・動きませんでした。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;grails app-engine run&lt;/code&gt; を実行すると &lt;strong&gt;http://localhost:8080/&lt;/strong&gt; でアプリが起動するところまでは確認できました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;em&gt;grails set-version 1&lt;/em&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;grails app-engine package&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;も正常に動作したので、後は配置するだけ、というところまでいけたのですが、&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;em&gt;$APPENGINE_HOME/bin/appcfg.sh update ./target/war&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;を実行すると &lt;a href="http://www.grails.org/plugin/app-engine#comment_357"&gt;ここにかかれている内容&lt;/a&gt; とまったく同じエラーとなります。&lt;/p&gt;&#10;&lt;p&gt;しばらくはこちらの回答を定期的にチェックしてみます。&lt;/p&gt;</description></item><item><title>ubuntu9.0.4で、HP PSC2550プリンタを使用する</title><link>https://genzouw.com/entry/2009/05/10/212800/335/</link><pubDate>Sun, 10 May 2009 21:28:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/05/10/212800/335/</guid><description>&lt;p&gt;ubuntuでプリンタを使えず（というか、多分ダメだろうなーと諦めていただけ）困っていたのですがさっき必要に迫られて調べてみた。&lt;/p&gt;&#10;&lt;p&gt;するとずばりで情報発見。以下のページでPSC2550が使えたよという書き込みが。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://72.14.235.132/search?q=cache:bh05OJ5RBT4J:pc11.2ch.net/test/read.cgi/printer/1133548494/l50+ubuntu+%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF+psc+2550&amp;amp;cd=4&amp;amp;hl=ja&amp;amp;ct=clnk&amp;amp;gl=jp"&gt;Linuxで使えるプリンタ／スキャナ&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;ページにはfedora6での設定例がかかれていました。僕のマシンはubuntu9.0.4ですがほとんど同じ。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;synapticsを起動する。&lt;/li&gt;&#10;&lt;li&gt;hplipをインストール&lt;/li&gt;&#10;&lt;li&gt;hplip-guiをインストール&lt;/li&gt;&#10;&lt;li&gt;コマンドラインから&amp;quot;sudo hp-setup&amp;quot;を実行する&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;あとはGUIのウィザードが表示されるので、そのとおりに。僕の家の環境ではネットワークプリンタを自動検出までして、テストページが無事に印刷完了。&lt;/p&gt;&#10;&lt;p&gt;プリンタまで簡単に設定できるようになった。さらにWindowsが必要なくなってきたぞ！&lt;/p&gt;</description></item><item><title>Ubuntu環境でSwingアプリケーションのキー入力ができなくなることがある</title><link>https://genzouw.com/entry/2009/05/08/210600/336/</link><pubDate>Fri, 08 May 2009 21:06:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/05/08/210600/336/</guid><description>&lt;p&gt;Ubuntu &amp;amp; jEditで開発中、たまにキーボード入力を受け付けなくなることがありました。jEditだけが受け付けなくなり、他のアプリケーションは大丈夫のようで、そうなってしまったらしょうがないのでjEditを再起動していました。&lt;/p&gt;&#10;&lt;p&gt;そんなおり、たまたまUbuntuフォーラムで以下の書き込みを見つけた。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://forums.ubuntulinux.jp/viewtopic.php?pid=30684#p30684"&gt;Ubuntu日本語フォーラム / JAVAアプリのキーボードが効かなくなる件&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;『英語以外の環境で起こっているJAVAのバグだそうで、2年以上FIXされていず、かなり怒っているユーザさんもいるようです』&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;だそうです。そういえばGriffonで作ったアプリでも同じようにキーボード入力を受け付けなくなったことがあったなぁ。&#10;早く直ってくれるといいな。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;『賛否両論ですが、export AWT_TOOLKIT=XToolkitを用いた解決法が載っているので試してみます』&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;なるほど！・・・ていうか、この解決方法ってどうやるんだろ？？( &lt;code&gt;AWT_TOOLKIT&lt;/code&gt; ってなに？ )&lt;/p&gt;&#10;&lt;p&gt;いろいろためしてみるしかないか。&lt;/p&gt;</description></item><item><title>Groovyスクレイピング &amp; Grape</title><link>https://genzouw.com/entry/2009/05/07/093400/337/</link><pubDate>Thu, 07 May 2009 09:34:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/05/07/093400/337/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/fumokmm/20090428/1240929966"&gt;Groovyでスクレイピングしてみる(NekoHTML編) - No Programming, No Life&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/kslash/20090502/1241263751"&gt;理系のための恋愛論をGroovyでスクレイピングする！ - すらすら はてな&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;の記事が面白かった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;XmlSlurper&lt;/li&gt;&#10;&lt;li&gt;XmlParser&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;を使用するとXMLを厳密にチェックするため、HTMlの解析ができなかったけれども、 &lt;strong&gt;nekohtml&lt;/strong&gt; っていうライブラリを利用するとあいまいなHTMlを解釈してパースしてくれるのでいろいろできるよ、っていうエントリ。&lt;/p&gt;&#10;&lt;p&gt;最近、いまさらながら&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/uehaj/20090118/1232288458"&gt;GCR #16 「Groovy　なう＆ふゅーちゃー、それからのGroovy」 - Grな日々(uehajの日記)&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;を見て、 &lt;strong&gt;grape&lt;/strong&gt; の機能が便利だな、と思ったのと &lt;strong&gt;kiy0taka&lt;/strong&gt; さんが &lt;strong&gt;Grape&lt;/strong&gt; ライブラリ探すには &lt;a href="http://www.mvnrepository.com/"&gt;Maven Repository: Search/Browse/Explore&lt;/a&gt; を利用するといいよと教えてくれたので（いずれもいまさらですが･･･）ちょっとスクレイピングのエントリに書き加えてみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.cyberneko.html.parsers.SAXParser&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// over proxy ..&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http.proxyUser&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http.proxyPassword&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;pw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PasswordAuthentication&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http.proxyUser&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http.proxyPassword&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toCharArray&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Authenticator&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;getPasswordAuthentication:&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;pw&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Authenticator&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// grape&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;nekohtml&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;nekohtml&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;latest.integration&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Dummy&lt;/span&gt;&lt;span class="o"&gt;{}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//--------------------MAIN LOGIC--------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;MYCOM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://journal.mycom.co.jp/&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;allPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[];&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XmlSlurper&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SAXParser&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;indexPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${MYCOM}column/rikei/index.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;indexPage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;**&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;TD&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;eachWithIndex&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${td.size() - index}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;padLeft&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;allPage&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;title:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;第${number}回_&amp;#34;&lt;/span&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;A&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;?&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;？&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;”&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;／&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;url:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${MYCOM}${it.A.@href}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rikei&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;mkdir&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;allPage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;page&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;downlaoding... ${page.title} ${page.url}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;contentPage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parser&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;page&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;contentPage&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;**&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;()==&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;DIV&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@class&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;articleContent&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;P&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;n&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;n&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;rikei/${page.title}.txt&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;newOutputStream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;content&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;//--------------------MAIN LOGIC--------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;6行目から12行目はただ単に社内のfirewallを超えたいがための設定。（ &lt;em&gt;家でやれよ、という突っ込みはなしで&lt;/em&gt; ）&lt;/p&gt;</description></item><item><title>Groovy＋Xml（その４：XmlParserのサンプルの謎）</title><link>https://genzouw.com/entry/2009/05/02/063800/338/</link><pubDate>Sat, 02 May 2009 06:38:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/05/02/063800/338/</guid><description>&lt;p&gt;XmlParserのサンプルコードとして以下のページが参考になる。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://docs.codehaus.org/display/GROOVY/Updating+XML+with+XmlParser"&gt;Updating XML with XmlParser - Groovy - Codehaus&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;さて、このコードの中でずっと疑問だった箇所がある。コードの41行めからを取り上げて話をしたい。&lt;/p&gt;&#10;&lt;p&gt;以下のコードを実行すると&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;Luxury&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なぜか&lt;strong&gt;groceries.each()の処理が２回実行される。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;すぐ上の処理で**&amp;hellip;item[0]&lt;strong&gt;としているので、item要素の１つ目が取得されるので&lt;/strong&gt;each**は１回しか実行されないはずなのに。なんど読んでもこのコードがわからなかった。&lt;/p&gt;&#10;&lt;p&gt;さっき散歩している間にふっと気づいた。先のコードは以下のように書き換えられる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;Luxury&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;Luxury&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// これはかなり苦し紛れ&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;groceries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;Luxury&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;最後に添字指定するのは誤解を生む表現で、サンプルとして適切じゃないんじゃないかなと思ったよ。&lt;strong&gt;配列に対して配列自身のメソッド以外を実行しようと場合には、配列内の全要素に対して実行された結果が返ってくることに注意。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Groovy＋Xml（その３：XmlSlurperとXmlParserの大きな違い）</title><link>https://genzouw.com/entry/2009/04/30/125500/340/</link><pubDate>Thu, 30 Apr 2009 12:55:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/30/125500/340/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2009/04/30/073000"&gt;Groovy＋Xml（その２：XmlSlurperで検索）&lt;/a&gt; で書いたのですが、 &lt;code&gt;XmlSlurper&lt;/code&gt; を使用してXMLを操作すると、親ノードの指定に注意が必要でした。&lt;/p&gt;&#10;&lt;h2 id="デスクトップ上のjp_zipcodexml"&gt;デスクトップ上のjp_zipcode.xml&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;Prefecture&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;PrefectureName&amp;gt;&lt;/span&gt;XXX&lt;span class="nt"&gt;&amp;lt;/PrefectureName&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;City&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;CityName&amp;gt;&lt;/span&gt;XXX&lt;span class="nt"&gt;&amp;lt;/CityName&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Area&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;AreaName&amp;gt;&lt;/span&gt;XXX&lt;span class="nt"&gt;&amp;lt;/AreaName&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ･･･&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/Area&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Area&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;AreaName&amp;gt;&lt;/span&gt;XXX&lt;span class="nt"&gt;&amp;lt;/AreaName&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ･･･&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/Area&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/City&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;City&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;CityName&amp;gt;&lt;/span&gt;XXX&lt;span class="nt"&gt;&amp;lt;/CityName&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;Area&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;AreaName&amp;gt;&lt;/span&gt;XXX&lt;span class="nt"&gt;&amp;lt;/AreaName&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ･･･&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/Area&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;lt;/City&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;/Prefecture&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;USER_HOME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;user.home&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;DESKTOP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${USER_HOME}/デスクトップ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XmlSlurper&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${DESKTOP}/jp_zipcode.xml&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prefecture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;City&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Area&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AreaName&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// City要素が全て取得されてしまう&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;..&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CityName&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これがXPathの仕様なのかわからないですが、 &lt;strong&gt;親ノードを&amp;quot;..&amp;ldquo;で指定した場合&lt;/strong&gt; 、City要素が全て返却されてしまいます。&lt;/p&gt;&#10;&lt;p&gt;これを &lt;strong&gt;XmlParser&lt;/strong&gt; を使用したコードに書き直してみました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;USER_HOME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;user.home&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;DESKTOP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${USER_HOME}/デスクトップ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XmlParser&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${DESKTOP}/jp_zipcode.xml&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prefecture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;City&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Area&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;AreaName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// City要素はarea変数を内包している１ノードのみ取得できる&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;..&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CityName&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今度は&amp;rdquo;..&amp;ldquo;で親ノードを指定した場合には１ノードのみ返却されました。&lt;/p&gt;&#10;&lt;p&gt;そのほかの部分にも注意が必要です。XmlSlurperでは &lt;strong&gt;ある要素ノード内のテキストノード&lt;/strong&gt; は要素ノードのtoString()で出力可能のようです。&#10;XmlParserでは &lt;strong&gt;ある要素ノード内のテキストノード&lt;/strong&gt; はtext()メソッドを指定しないと正しく出力されません。&lt;/p&gt;</description></item><item><title>Groovy＋Xml（その２：XmlSlurperで検索）</title><link>https://genzouw.com/entry/2009/04/30/073000/341/</link><pubDate>Thu, 30 Apr 2009 07:30:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/30/073000/341/</guid><description>&lt;p&gt;XmlSlurper の勉強がてら、なにかつくってみました。&lt;/p&gt;&#10;&lt;p&gt;以下のサイトで公開されていた郵便番号 XML データを利用させていただきました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://blog.majide.com/2009/03/jp-post-zipcode-xml/"&gt;全国郵便番号 XML データ | イイ!! プログラミング Blog&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;ダウンロードしたファイルを展開し、デスクトップに置き、以下のプログラムを実行しました。&#10;コマンドラインから第一引数に郵便番号７桁を入力すると住所が表示されます（入力値のチェックを省略しています）。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==~&lt;/span&gt; &lt;span class="s"&gt;/d+/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;USER_HOME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;user.home&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;DESKTOP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${USER_HOME}/デスクトップ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XmlSlurper&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${DESKTOP}/jp_zipcode.xml&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;prefecture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Prefecture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;City&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Area&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ZipCode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prefecture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;City&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Area&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ZipCode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Area&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ZipCode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ZipCode&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;prefecture&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PrefectureName&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CityName&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${area.AreaName}(${area.AreaKana})&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同じような記述が複数登場している点が気にはなりますが。&lt;/p&gt;&#10;&lt;p&gt;本当は &lt;strong&gt;area&lt;/strong&gt; を最初に検索して、残りの &lt;strong&gt;city&lt;/strong&gt; 、 &lt;strong&gt;prefecture&lt;/strong&gt; は &lt;strong&gt;parent()&lt;/strong&gt; または &lt;strong&gt;.&amp;quot;..&amp;quot;&lt;/strong&gt; を使用して参照したかったのですが、 &lt;strong&gt;これを利用すると同一の親要素がすべて取得されてしまう&lt;/strong&gt; のでやむなく同じような記述をのこしました。&lt;/p&gt;&#10;&lt;p&gt;もうちょっとスマートにかければいいのですが。&lt;/p&gt;</description></item><item><title>Groovy＋Xml（その１：XmlSlurperとXmlParserの違い：追記）</title><link>https://genzouw.com/entry/2009/04/30/071100/342/</link><pubDate>Thu, 30 Apr 2009 07:11:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/30/071100/342/</guid><description>&lt;p&gt;せっかく&lt;strong&gt;XmlParser&lt;/strong&gt;と&lt;strong&gt;XmlSlurper&lt;/strong&gt;の違いを調べたが、「&lt;strong&gt;Groovy イン・アクション&lt;/strong&gt;」のP.357にちゃんとかかれていた。&lt;/p&gt;&#10;&lt;p&gt;なるほど。やっぱり読み取り操作ならXmlSlurperの方が負荷が少ないみたいだ。&lt;/p&gt;&#10;&lt;p&gt;「&lt;strong&gt;Groovy イン・アクション&lt;/strong&gt;」もしっかり全部よまないとね。といいつつ昨日図書館から&lt;strong&gt;Restful&lt;/strong&gt;の本借りてきてたりw。&lt;/p&gt;</description></item><item><title>Groovy＋Xml（その１：XmlSlurperとXmlParserの違い）</title><link>https://genzouw.com/entry/2009/04/27/215400/343/</link><pubDate>Mon, 27 Apr 2009 21:54:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/27/215400/343/</guid><description>&lt;p&gt;XmlSlurperとXmlParser、両者はいずれもxmlをパースするクラスですがなにが違うのかなとおもい調べてみた。&lt;/p&gt;&#10;&lt;p&gt;大きな違いは以下のようになっている（参考：&lt;a href="http://docs.codehaus.org/display/GROOVY/Processing+XML"&gt;Processing XML - Groovy - Codehaus&lt;/a&gt;）&lt;/p&gt;&#10;&lt;table data-border="1" style="width: 574px; height: 127px;"&gt;&#10;&lt;colgroup&gt;&#10;&lt;col style="width: 50%" /&gt;&#10;&lt;col style="width: 50%" /&gt;&#10;&lt;/colgroup&gt;&#10;&lt;tbody&gt;&#10;&lt;tr&gt;&#10;&lt;th data-bgcolor="#ffffcc" scope="row"&gt;&lt;a href="http://docs.codehaus.org/display/GROOVY/Reading+XML+using+Groovy%27s+XmlParser" title="Reading XML using Groovy&amp;#39;s XmlParser"&gt;XmlParser&lt;/a&gt;&lt;/th&gt;&#10;&lt;td&gt;&lt;p&gt;supports GPath expressions for XML documents and allows updating&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;xml文書のGPath表現をサポートしているし、文書の更新も可能だよ&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;tr&gt;&#10;&lt;th data-bgcolor="#ffffcc" scope="row"&gt;&lt;a href="http://docs.codehaus.org/display/GROOVY/Reading+XML+using+Groovy%27s+XmlSlurper" title="Reading XML using Groovy&amp;#39;s XmlSlurper"&gt;XmlSlurper&lt;/a&gt;&lt;/th&gt;&#10;&lt;td&gt;&lt;p&gt;lower overheads than XmlParser due to lazy evaluation but only supports read operations&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;遅延処理を利用してXmlParserよりもオーバーヘッドが少ないが、読み込み処理しかサポートしてないよ&lt;/em&gt;&lt;/p&gt;&lt;/td&gt;&#10;&lt;/tr&gt;&#10;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;xmlで記述した初期設定を読み込むような書き込みのない処理には&lt;strong&gt;XmlSlurper&lt;/strong&gt;が向いているようです。&lt;/p&gt;&#10;&lt;p&gt;逆にxmlをよみこんで要素を修正し、出力する、といった場合には&lt;strong&gt;XmlParser&lt;/strong&gt;の方がよいみたい。&lt;/p&gt;</description></item><item><title>Map使用の際にはgetterメソッドの動きに注意</title><link>https://genzouw.com/entry/2009/04/26/202200/345/</link><pubDate>Sun, 26 Apr 2009 20:22:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/26/202200/345/</guid><description>&lt;p&gt;GIA読書会in関西で知った事その二。&lt;/p&gt;&#10;&lt;p&gt;Mapを使用する際には、getterメソッドの動作に注意。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;groovy&lt;/strong&gt;では、オブジェクトaのgetXxx()メソッドを呼び出す際に&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;a.getXxx()&lt;/li&gt;&#10;&lt;li&gt;a.xxx&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;のいずれの方法でも値を取得できます。&lt;/p&gt;&#10;&lt;p&gt;が、オブジェクトaがMapの際には注意が必要。&lt;strong&gt;a.xxx&lt;/strong&gt;の方法では&lt;strong&gt;常にnull&lt;/strong&gt;がかえってくるんだって。しらなかった。&lt;/p&gt;&#10;&lt;p&gt;具体的には以下のソースを参考に。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;abc&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;200&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getClass&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;util&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;LinkedHashMap&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMetaClass&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;400&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;400&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMetaClass&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;define&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getA&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;200&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;100&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getMetaClass&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;define&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;getC&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;400&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;c&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Groovyで文字列から「正規表現のパターン」を減算してみるとどうなるか？</title><link>https://genzouw.com/entry/2009/04/26/173200/346/</link><pubDate>Sun, 26 Apr 2009 17:32:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/26/173200/346/</guid><description>&lt;p&gt;「Groovy In Action」読書会in関西で勉強になったことの一つ。&lt;/p&gt;&#10;&lt;p&gt;文字列から正規表現パターンを減算したらどうなるかという話になった。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hellohello&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;(~&lt;/span&gt;&lt;span class="s"&gt;/[lo]+/&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;結果：hehello&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;正規表現を加算したら、文字列から最初にマッチした箇所が除外される。これは知らなかった。もちろん &lt;strong&gt;replaceFirst&lt;/strong&gt; 使ったらいいんだけど、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hellohello&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceFirst&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;/[lo]+/&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;っていうのよりもコード量少ないし、見通しがよくなるかも。記述方法の一つとしてメモ。&lt;/p&gt;</description></item><item><title>Groovyイン・アクション読書会IN関西 いってきたよ</title><link>https://genzouw.com/entry/2009/04/26/093700/347/</link><pubDate>Sun, 26 Apr 2009 09:37:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/26/093700/347/</guid><description>&lt;p&gt;&lt;strong&gt;Groovyイン・アクション読書会IN関西&lt;/strong&gt;に参加してきました。&lt;/p&gt;&#10;&lt;p&gt;一度いってみたかった&lt;a href="http://www.kronos-jp.net/"&gt;株式会社クロノス&lt;/a&gt;さんのところでの読書会ということもあり、また大好きな&lt;strong&gt;groovy&lt;/strong&gt;の勉強会ということもあり、ドキドキしながら会場へ。地図をもつ手もふるえました（笑）&lt;/p&gt;&#10;&lt;p&gt;東京、名古屋の勉強会に参加してはどうかというお誘いも名んどかしていただいたのですが、お小遣い一万円ではちょっと難しかったので大阪開催は助かります。&lt;/p&gt;&#10;&lt;p&gt;進め方は時間を細かく区切り、&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;セクションを読む&lt;/li&gt;&#10;&lt;li&gt;読んだ部分で分からないこと、注意しておくこと、その他気づいたことなどを発言&lt;/li&gt;&#10;&lt;li&gt;コードを買いて検証&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;という感じの流れで。&lt;/p&gt;&#10;&lt;p&gt;第三章まで何とか終わりました。いくつか発見があったので次回掲載したい。&lt;/p&gt;&#10;&lt;p&gt;夜はオフ会。お店の手羽先がうまかったー一人でかなり食べてしまった。&lt;/p&gt;&#10;&lt;p&gt;今回はみなさん緊張していた感があるので、次回はもっと打ち解けてるんだろうなぁ。一緒に勉強するかたが近くにいるのがうれしいですね。やる気が出てきた！&lt;/p&gt;&#10;&lt;p&gt;興味のある関西の方、次回はぜひきてくださいね。&lt;/p&gt;</description></item><item><title>Google App Engineでgrails（成功事例が！！）</title><link>https://genzouw.com/entry/2009/04/20/091900/348/</link><pubDate>Mon, 20 Apr 2009 09:19:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/20/091900/348/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/mottsnite/20090418/1240039964"&gt;Google App EngineでGrails - leftovers&amp;hellip;&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uehaj/20090419/1240150227"&gt;Grails on GAE/Jを試してみた - Grな日々(uehajの日記)&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;にて、すでに&lt;strong&gt;Goole App Engine&lt;/strong&gt;にてGrailsを動作させた事例が挙がっています。&lt;/p&gt;&#10;&lt;p&gt;すごい！おめでとう！！&lt;/p&gt;&#10;&lt;p&gt;どうやら&lt;strong&gt;Grails-1.1.1&lt;/strong&gt;を取得して実行させないといけないみたい。まずは&lt;strong&gt;git&lt;/strong&gt;の勉強からか・・・&lt;/p&gt;&#10;&lt;p&gt;（一応&lt;a href="http://d.hatena.ne.jp/uehaj/20090419/1240150227"&gt;Grな日々(uehajの日記)&lt;/a&gt;にgitコマンドの例まであげてくれているのですが、今晩試してだめそうなら正式版まで待つ方向で。）&lt;/p&gt;</description></item><item><title>Google App EngineでGrails（その２）</title><link>https://genzouw.com/entry/2009/04/17/215600/349/</link><pubDate>Fri, 17 Apr 2009 21:56:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/17/215600/349/</guid><description>&lt;h2 id="ドメインを作ってアップロード"&gt;ドメインを作ってアップロード&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2009/04/17/101700/351/"&gt;Google App EngineでGrails（その１） | ゲンゾウ用ポストイット&lt;/a&gt; の続き。&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails create-domain-class book &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のようなドメインを作成。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Book&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;constraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;関連物を一括生成&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails generate-all book &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ほんで&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails war &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然これでは &lt;code&gt;app engine&lt;/code&gt; で動作しない。&lt;/p&gt;&#10;&lt;p&gt;ドメインはアノテーションを追記することで、 &lt;code&gt;app engine&lt;/code&gt; の両方で動作可能みたい。なのでアノテーションを追加。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.jdo.annotations.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.google.appengine.api.datastore.Key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@PersistenceCapable&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;identityType&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IdentityType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;APPLICATION&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;detachable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Book&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;constraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="nl"&gt;nullable:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@PrimaryKey&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@Persistent&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valueStrategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;IdGeneratorStrategy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IDENTITY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@Persistent&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@Persistent&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;price&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;試しにこの状態でwarファイル作成してみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails war &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今度は&amp;quot; &lt;strong&gt;@Persistent&lt;/strong&gt; &amp;ldquo;なんてアノテーションないっていわれるので、libフォルダに &lt;strong&gt;$APPENGINE_HOME&lt;/strong&gt; &lt;strong&gt;/lib/impl&lt;/strong&gt; 以下のjarファイルを全てコピーして再実行。&lt;/p&gt;&#10;&lt;p&gt;今度は正常にwarファイルが作成できた。controller、viewも作成しておく。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails generate-all &#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="いよいよgoogle-app-engineにアップ"&gt;いよいよgoogle app engineにアップ&lt;/h2&gt;&#10;&lt;p&gt;なんだか動くような気がしてきた！俄然はりきる。&lt;/p&gt;</description></item><item><title>Google App EngineでGroovletをクライアント実行するとエラー出るよね？</title><link>https://genzouw.com/entry/2009/04/17/111200/350/</link><pubDate>Fri, 17 Apr 2009 11:12:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/17/111200/350/</guid><description>&lt;p&gt;&lt;strong&gt;Groovy&lt;/strong&gt; の &lt;strong&gt;Groovlet&lt;/strong&gt; を使ったアプリを &lt;strong&gt;Google App Engine&lt;/strong&gt; にアップすると正常に動作する。&lt;/p&gt;&#10;&lt;p&gt;けれども、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ APPENGINE_HOME/bin/dev_appserver.sh deploy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のようにローカル実行すると、 &lt;strong&gt;Permission&lt;/strong&gt; エラーが発生する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;groovy.util.ScriptException: Could not parse scriptName: /executor.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java.lang.RuntimeException: groovy.util.ScriptException: Could not parse scriptName: /executor.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.servlet.GroovyServlet&lt;span class="nv"&gt;$1&lt;/span&gt;.call&lt;span class="o"&gt;(&lt;/span&gt;GroovyServlet.java:123&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.GroovyCategorySupport&lt;span class="nv"&gt;$ThreadCategoryInfo&lt;/span&gt;.use&lt;span class="o"&gt;(&lt;/span&gt;GroovyCategorySupport.java:92&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.GroovyCategorySupport&lt;span class="nv"&gt;$ThreadCategoryInfo&lt;/span&gt;.access&lt;span class="nv"&gt;$200&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;GroovyCategorySupport.java:60&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.GroovyCategorySupport.use&lt;span class="o"&gt;(&lt;/span&gt;GroovyCategorySupport.java:202&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.servlet.GroovyServlet.service&lt;span class="o"&gt;(&lt;/span&gt;GroovyServlet.java:128&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at javax.servlet.http.HttpServlet.service&lt;span class="o"&gt;(&lt;/span&gt;HttpServlet.java:806&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.servlet.ServletHolder.handle&lt;span class="o"&gt;(&lt;/span&gt;ServletHolder.java:487&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.servlet.ServletHandler&lt;span class="nv"&gt;$CachedChain&lt;/span&gt;.doFilter&lt;span class="o"&gt;(&lt;/span&gt;ServletHandler.java:1093&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter&lt;span class="o"&gt;(&lt;/span&gt;TransactionCleanupFilter.java:43&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.servlet.ServletHandler&lt;span class="nv"&gt;$CachedChain&lt;/span&gt;.doFilter&lt;span class="o"&gt;(&lt;/span&gt;ServletHandler.java:1084&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.servlet.ServletHandler.handle&lt;span class="o"&gt;(&lt;/span&gt;ServletHandler.java:360&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.security.SecurityHandler.handle&lt;span class="o"&gt;(&lt;/span&gt;SecurityHandler.java:216&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.servlet.SessionHandler.handle&lt;span class="o"&gt;(&lt;/span&gt;SessionHandler.java:181&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.handler.ContextHandler.handle&lt;span class="o"&gt;(&lt;/span&gt;ContextHandler.java:712&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.webapp.WebAppContext.handle&lt;span class="o"&gt;(&lt;/span&gt;WebAppContext.java:405&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle&lt;span class="o"&gt;(&lt;/span&gt;DevAppEngineWebAppContext.java:54&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.handler.HandlerWrapper.handle&lt;span class="o"&gt;(&lt;/span&gt;HandlerWrapper.java:139&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at com.google.appengine.tools.development.JettyContainerService&lt;span class="nv"&gt;$ApiProxyHandler&lt;/span&gt;.handle&lt;span class="o"&gt;(&lt;/span&gt;JettyContainerService.jav&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;a:306&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.handler.HandlerWrapper.handle&lt;span class="o"&gt;(&lt;/span&gt;HandlerWrapper.java:139&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.Server.handle&lt;span class="o"&gt;(&lt;/span&gt;Server.java:313&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.HttpConnection.handleRequest&lt;span class="o"&gt;(&lt;/span&gt;HttpConnection.java:506&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.HttpConnection&lt;span class="nv"&gt;$RequestHandler&lt;/span&gt;.content&lt;span class="o"&gt;(&lt;/span&gt;HttpConnection.java:844&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.HttpParser.parseNext&lt;span class="o"&gt;(&lt;/span&gt;HttpParser.java:644&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.HttpParser.parseAvailable&lt;span class="o"&gt;(&lt;/span&gt;HttpParser.java:211&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.jetty.HttpConnection.handle&lt;span class="o"&gt;(&lt;/span&gt;HttpConnection.java:381&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.io.nio.SelectChannelEndPoint.run&lt;span class="o"&gt;(&lt;/span&gt;SelectChannelEndPoint.java:396&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.mortbay.thread.BoundedThreadPool&lt;span class="nv"&gt;$PoolThread&lt;/span&gt;.run&lt;span class="o"&gt;(&lt;/span&gt;BoundedThreadPool.java:442&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Caused by: groovy.util.ScriptException: Could not parse scriptName: /executor.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.util.GroovyScriptEngine.updateCacheEntry&lt;span class="o"&gt;(&lt;/span&gt;GroovyScriptEngine.java:335&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.util.GroovyScriptEngine.createScript&lt;span class="o"&gt;(&lt;/span&gt;GroovyScriptEngine.java:415&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.util.GroovyScriptEngine.run&lt;span class="o"&gt;(&lt;/span&gt;GroovyScriptEngine.java:402&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.servlet.GroovyServlet&lt;span class="nv"&gt;$1&lt;/span&gt;.call&lt;span class="o"&gt;(&lt;/span&gt;GroovyServlet.java:119&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ... &lt;span class="m"&gt;26&lt;/span&gt; more&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Caused by: java.security.AccessControlException: access denied &lt;span class="o"&gt;(&lt;/span&gt;groovy.security.GroovyCodeSourcePermission /groovy/script&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.security.AccessControlContext.checkPermission&lt;span class="o"&gt;(&lt;/span&gt;AccessControlContext.java:323&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.security.AccessController.checkPermission&lt;span class="o"&gt;(&lt;/span&gt;AccessController.java:546&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.SecurityManager.checkPermission&lt;span class="o"&gt;(&lt;/span&gt;SecurityManager.java:532&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at com.google.appengine.tools.development.DevAppServerFactory&lt;span class="nv"&gt;$CustomSecurityManager&lt;/span&gt;.checkPermission&lt;span class="o"&gt;(&lt;/span&gt;DevAppServerFactory.java:76&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.GroovyCodeSource.&amp;lt;init&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;GroovyCodeSource.java:79&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.GroovyClassLoader&lt;span class="nv"&gt;$2&lt;/span&gt;.run&lt;span class="o"&gt;(&lt;/span&gt;GroovyClassLoader.java:241&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.security.AccessController.doPrivileged&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.GroovyClassLoader.parseClass&lt;span class="o"&gt;(&lt;/span&gt;GroovyClassLoader.java:239&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.util.GroovyScriptEngine.updateCacheEntry&lt;span class="o"&gt;(&lt;/span&gt;GroovyScriptEngine.java:333&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ... &lt;span class="m"&gt;29&lt;/span&gt; more&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;原因わからず。&lt;/p&gt;</description></item><item><title>Google App EngineでGrails（その１）</title><link>https://genzouw.com/entry/2009/04/17/101700/351/</link><pubDate>Fri, 17 Apr 2009 10:17:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/17/101700/351/</guid><description>&lt;p&gt;&lt;strong&gt;Google App Engine&lt;/strong&gt; でGrailsが使えるようになったらしいので、早速試してみる。&#10;（といっても、 &lt;a href="http://www.grails.org/plugin/app-engine#comment_158"&gt;Grails1.1.1から保障っぽいことが書かれている&lt;/a&gt; ので、なんとなく触って手触りを。&lt;/p&gt;&#10;&lt;h2 id="入手方法"&gt;入手方法&lt;/h2&gt;&#10;&lt;p&gt;以下のサイトに &lt;strong&gt;Download&lt;/strong&gt; のリンクがあるのでそこから &lt;strong&gt;grails-app-engine-0.4.zip&lt;/strong&gt; をダウンロードする。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://www.grails.org/plugin/app-engine"&gt;Grails - Plugin: Grails AppEngine plugin&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="サンプルアプリ作成"&gt;サンプルアプリ作成&lt;/h2&gt;&#10;&lt;p&gt;適当なフォルダで&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails create-app test-app&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; test-app&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails install-plugin &amp;lt;DOWNLOAD_DIR&amp;gt;/grails-app-engine-0.4.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;・・・なんだかエラーが発生した。&lt;/p&gt;&#10;&lt;p&gt;どうやら &lt;strong&gt;Grails&lt;/strong&gt; のバージョンが1.0.3なのが原因みたい。&lt;/p&gt;&#10;&lt;p&gt;Grails1.1以上で動かさないといけないらしいので、最新Grailsをダウンロードしてインストール。&lt;/p&gt;&#10;&lt;p&gt;今度はうまくいったぽい。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Installed JDO config to est-app/grails-app/confPlugin app-engine-0.4 installed&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Plug-in provides the following new scripts:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grails app-engine&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Found events script in plugin app-engine&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No Google AppEngine SDK specified. Either &lt;span class="nb"&gt;set&lt;/span&gt; APPENGINE_HOME in your environment or specify google.appengine.sdk in your&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;grails-app/conf/BuildConfig.groovy file&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="設定"&gt;設定&lt;/h2&gt;&#10;&lt;p&gt;いわれたとおり、 &lt;strong&gt;grails-app/conf/BuildConfig.groovy file&lt;/strong&gt; にapp-engine-sdkのﾊﾟｽを設定。&lt;/p&gt;</description></item><item><title>Grailsのプロジェクト、かなり増えたなぁ</title><link>https://genzouw.com/entry/2009/04/15/230700/352/</link><pubDate>Wed, 15 Apr 2009 23:07:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/15/230700/352/</guid><description>&lt;p&gt;grailsの勉強にと&lt;strong&gt;google code&lt;/strong&gt;でプロジェクト探していたときのこと。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://code.google.com/hosting/search?q=grails&amp;amp;projectsearch=Search+projects"&gt;検索結果&lt;/a&gt;が173件になっていた。&lt;/p&gt;&#10;&lt;p&gt;数ヶ月前まで数十件ぐらいだったような気がします。&lt;/p&gt;&#10;&lt;p&gt;なんだか一気に増えた。&lt;/p&gt;</description></item><item><title>Blogger Syntax Highliterがgroovyに対応してるらしい</title><link>https://genzouw.com/entry/2009/04/06/060900/353/</link><pubDate>Mon, 06 Apr 2009 06:09:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/06/060900/353/</guid><description>&lt;p&gt;hatenaを利用してブログをかかれている人が多いですが、僕のブログではbloggerを利用しています。&lt;/p&gt;&#10;&lt;p&gt;理由は得にないのですが。gmail、google readerを使っているので、そのあたりの連動に期待して使い始めたといったところでしょうか。&lt;/p&gt;&#10;&lt;p&gt;コードを掲載するのに、bloggerの&lt;strong&gt;syntax highlighte&lt;/strong&gt;というプラグインを利用しています。（grailsのプラグインにもありますね）今までこれをjavaのコードとして掲載していましたが、groovyに対応したということで試してみました。といってもjavaとgroovyでそれほどコードに違いがないため、どこがかわったのかわかりませんが。&lt;/p&gt;&#10;&lt;h4 id="java版"&gt;java版&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Greet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;Greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;who&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;who&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;who&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;salute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello $name!&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Greet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;world&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// オブジェクトを作成&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;salute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// &amp;#34;Hello World!&amp;#34; をアウトプット&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="groovy版"&gt;groovy版&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Greet&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;Greet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;who&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;who&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;toUpperCase&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;who&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;salute&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Hello $name!&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Greet&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;world&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// オブジェクトを作成&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;salute&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// &amp;#34;Hello World!&amp;#34; をアウトプット&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;・・・対応してないし・・・&lt;/p&gt;</description></item><item><title>grails-morph-plugin久々に修正</title><link>https://genzouw.com/entry/2009/04/03/071000/354/</link><pubDate>Fri, 03 Apr 2009 07:10:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/04/03/071000/354/</guid><description>&lt;p&gt;grails-morph-plugin久々に修正。&lt;/p&gt;&#10;&lt;p&gt;morphにwarファイルアップするときには、もうパスワードは不要になってるんですね。サイトから&lt;strong&gt;morph_deploy.properties&lt;/strong&gt;をダウンロードすると、そこにキー情報がかかれているのでパスワード不要になっているみたい。&lt;/p&gt;&#10;&lt;p&gt;以前はアップロードの際にユーザーID、パスワードを入力しなければならなかったと思ったけれど。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;grails-morph-plugin入れる&lt;/li&gt;&#10;&lt;li&gt;grails war-and-deploy-morph実行&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;だけでアップロードできた。&lt;/p&gt;</description></item><item><title>緩くてすみません</title><link>https://genzouw.com/entry/2009/03/30/222000/355/</link><pubDate>Mon, 30 Mar 2009 22:20:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/30/222000/355/</guid><description>&lt;p&gt;今日のエントリは緩くてすみません。&lt;/p&gt;&#10;&lt;p&gt;3月いっぱいで堂島での作業が終了、チームメンバーで飲んできました。&lt;/p&gt;&#10;&lt;p&gt;口下手な自分ですが飲むとそこそこ話できます。お酒は好きだし強いので。楽しかったー。&lt;/p&gt;&#10;&lt;p&gt;今日は調べ物＋エントリはまともにできなさそうなので寝ます。&lt;/p&gt;</description></item><item><title>groovy-twitter使ってみる</title><link>https://genzouw.com/entry/2009/03/29/212700/357/</link><pubDate>Sun, 29 Mar 2009 21:27:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/29/212700/357/</guid><description>&lt;p&gt;遅ればせながらTwitter始めたので、Twitterを「Groovy」で使うためのライブラリを探してみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://code.google.com/p/groovy-twitter/"&gt;groovy-twitter - Google Code&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;svnからチェックアウト&lt;/li&gt;&#10;&lt;li&gt;プロジェクトルートで &lt;code&gt;gant package&lt;/code&gt; コマンドを実行&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;上記の手順ででjarファイル完成のはずでしたが、どうもうまくいかず、ちょっとだけソース直しました。&lt;/p&gt;&#10;&lt;p&gt;以下 &lt;code&gt;svn diff&lt;/code&gt; コマンドで出力した簡単なパッチです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-diff" data-lang="diff"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;属性に変更があったパス: .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;___________________________________________________________________&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;追加: svn:ignore&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; + build&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;Index: src/main/groovy/groovyx/twitter/TwitterException.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;===================================================================&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;--- src/main/groovy/groovyx/twitter/TwitterException.groovy (リビジョン 0)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+++ src/main/groovy/groovyx/twitter/TwitterException.groovy (リビジョン 0)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;@@ -0,0 +1,7 @@&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+package groovyx.twitter&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+class TwitterException extends Exception {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ TwitterException( params ){&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ super(params)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;Index: build.gant&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gh"&gt;===================================================================&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;--- build.gant (リビジョン 32)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+++ build.gant (作業コピー)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;@@ -2,6 +2,7 @@&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; buildDirectory = &amp;#39;build&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; distDirectory = &amp;#39;dist&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; groovyTwitterVersion = &amp;#39;0.1&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+jarfile = distDirectory + &amp;#34;/groovy-twitter-${groovyTwitterVersion}.jar&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; includeTargets &amp;lt;&amp;lt; gant.targets.Clean&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cleanPattern &amp;lt;&amp;lt; &amp;#39;**/*~&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;@@ -28,7 +29,16 @@&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ant.mkdir(dir:distDirectory)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; depends(compile)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; makeManifest()&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gd"&gt;- jar(destfile:distDirectory + &amp;#34;/groovy-twitter-${groovyTwitterVersion}.jar&amp;#34;, basedir:buildDirectory, manifest:buildDirectory+&amp;#39;/MANIFEST.MF&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ jar(destfile:jarfile, basedir:buildDirectory, manifest:buildDirectory+&amp;#39;/MANIFEST.MF&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+target(&amp;#39;update&amp;#39;:&amp;#39;update to $USER_HOME/.goory/lib&amp;#39;) {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ ant.delete(dir:buildDirectory)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ depends(&amp;#34;package&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ ant.copy(&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ todir:System.properties[&amp;#34;user.home&amp;#34;] + &amp;#34;/.groovy/lib&amp;#34;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ file:jarfile,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+ )&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gi"&gt;+&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; setDefaultTarget (compile)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;クラスファイルの不足以外にも &lt;code&gt;build.gant&lt;/code&gt; に少し手を加えた。 &lt;code&gt;gant update&lt;/code&gt; って打ち込んだら、クラスパス通さなくてもGroovyで使えるようになります。&lt;/p&gt;</description></item><item><title>ライブラリ化したクラス拡張コードを呼び出すスマートな方法は？</title><link>https://genzouw.com/entry/2009/03/29/142000/358/</link><pubDate>Sun, 29 Mar 2009 14:20:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/29/142000/358/</guid><description>&lt;p&gt;metaClassを使用してクラスを拡張する場合、拡張処理をどんな風に一元管理しようかいつも迷う。&lt;/p&gt;&#10;&lt;p&gt;いつもやっている方法は以下のとおり。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Extention.classというクラスを作成&lt;/li&gt;&#10;&lt;li&gt;拡張処理を記述&lt;/li&gt;&#10;&lt;li&gt;利用したいコードの先頭で拡張処理の呼び出し。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;具体的に例を。&lt;/p&gt;&#10;&lt;h4 id="extentiongroovy"&gt;Extention.groovy&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;define&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toFile&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="testgroovy"&gt;Test.groovy&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;!/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;Extention&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Extention&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/home/genzou&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFile&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/home/dummy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;呼び出したい拡張処理を記述したクラスのmainメソッドを呼び出す。&lt;/p&gt;&#10;&lt;p&gt;使用する側のコードをもうちょっと短くするなら、以下のとおり。&lt;/p&gt;&#10;&lt;h4 id="extentiongroovy-1"&gt;Extention.groovy&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Extention&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;static&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;define&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;toFile&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="testgroovy-1"&gt;Test.groovy&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;!/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;Extention&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Extention&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Class.forName(&amp;#34;Extention&amp;#34;) でも同じ&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/home/genzou&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFile&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;parent&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/home/dummy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ほんのちょっとしか変わらないけど。いきなりクラス名を記述されてもなにがなんだかっていうのもある。&lt;/p&gt;</description></item><item><title>groovy1.6のdefineメソッドについて</title><link>https://genzouw.com/entry/2009/03/27/232000/359/</link><pubDate>Fri, 27 Mar 2009 23:20:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/27/232000/359/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uokumura/mobile?date=20090115"&gt;metaClass.defineが凄い！&lt;/a&gt; より。&lt;/p&gt;&#10;&lt;p&gt;Groovy1.6から、 &lt;strong&gt;metaClass.define&lt;/strong&gt; という記述で、既存クラスにメソッドを追加出きるそうです。試しにjavaでは継承不可能なStringクラスにメソッドを追加してみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;define&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;toFile&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;half&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;round&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="s"&gt;/ 2) - 1&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; delegate[0..end]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;def path = &amp;#34;/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="s"&gt;/genzou&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;println path.toFile()&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;println path.half()&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;def path2 = &amp;#34;home_genzou_bin&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;path2.metaClass.define {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; camelize {&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; delegate.toLowerCase().replaceAll(&amp;#34;_[^_]&amp;#34;) { it[1].toUpperCase() }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;println path2.half()&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;println path2.camelize()&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;// これはエラー&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;camelize&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#10;&lt;li&gt;クラス.metaClassに対して指定したメソッド（クロージャ？）は当然すべてのインスタンスに適用された。&lt;/li&gt;&#10;&lt;li&gt;インスタンス.metaClassに対して指定したメソッド（クロージャ？）は、そのインスタンスにしか適用されない。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;確かにこれは定義がしやすい。通常のclass定義の構造によく似ている。&lt;/p&gt;&#10;&lt;p&gt;define内で定義するメソッドに引数が必要な場合には、以下のように定義する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;define&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// メソッドのように定義&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;searchExt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listFiles&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="s"&gt;/^.+.${ext}$/&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// クロージャのように定義&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;searchName&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listFiles&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/genzou&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;searchExt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;groovy&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>正の整数mの4乗を5倍したものの下2桁として現れる数をすべて求めよ</title><link>https://genzouw.com/entry/2009/03/27/231700/360/</link><pubDate>Fri, 27 Mar 2009 23:17:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/27/231700/360/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uokumura/mobile?date=20090211&amp;amp;section=1234368887"&gt;正の整数mの4乗を5倍したものの下2桁として現れる数をすべて求めよ&lt;/a&gt;というエントリがあったので、といてみた。&lt;/p&gt;&#10;&lt;p&gt;と言っても掲載されている内容とほとんど同じだけど。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;10&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="n"&gt;100&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>今更ながらTwitter</title><link>https://genzouw.com/entry/2009/03/27/073800/361/</link><pubDate>Fri, 27 Mar 2009 07:38:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/27/073800/361/</guid><description>&lt;p&gt;今更ながらtwitter始めました。&lt;/p&gt;&#10;&lt;p&gt;どんな風に活用したらいいのかさっぱりですが、食わず嫌いしていたので・・・。&lt;/p&gt;&#10;&lt;p&gt;ついでに &lt;a href="http://yusuke.homeip.net/twitter4j/ja/index.html"&gt;Twitter4J&lt;/a&gt; というライブラリを使用してJavaからTwitterにアクセス可能ということで試してみた。&lt;/p&gt;&#10;&lt;p&gt;多少変えたら動くけどまたjEditマクロにしちゃった。開いているテキスト（選択されていれば選択されている部分）の内容をまるごと送信します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;javax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;swing&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JOptionPane&lt;/span&gt;&lt;span class="o"&gt;.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;twitter4j.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;てきとうに&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;へんこうしてね&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedText&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;以下の文言で状態を更新します。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;よろしいですか？&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;-----------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;${text}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;showConfirmDialog&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;YES_OPTION&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;twitter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Twitter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;twitter&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;update&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;showMessageDialog&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;登録が完了しました。&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;さっき間違えてパスワード送信してしまった・・・&lt;/p&gt;</description></item><item><title>Groovyで文字列をCamel形式、Pascal形式に変換（二番煎じ）</title><link>https://genzouw.com/entry/2009/03/26/130700/362/</link><pubDate>Thu, 26 Mar 2009 13:07:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/26/130700/362/</guid><description>&lt;p&gt;以下のエントリを見つけて、自分でも書いてみた。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/r_ikeda/20090319/camelize"&gt;Groovy で文字列を Camel 形式、Pascal 形式に変換する - 集中力なら売り切れたよ&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/r_ikeda/20090325/java"&gt;Java で書いても大して行数変わらなかった - 集中力なら売り切れたよ&lt;/a&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;camelize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;_[^_]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;pascalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;camelize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/^&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toUpperCase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;camelize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;RESIDENT_EVIL_5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;pascalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;RESIDENT_EVIL_5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;正規表現使いすぎかな？結構シンプルになった気がする。&lt;/p&gt;</description></item><item><title>GroovyスクリプトでGroovyスクリプトを整形してみる。</title><link>https://genzouw.com/entry/2009/03/23/172500/363/</link><pubDate>Mon, 23 Mar 2009 17:25:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/23/172500/363/</guid><description>&lt;p&gt;また &lt;a href="http://www.google.co.jp/search?q=jedit"&gt;jEdit&lt;/a&gt; ネタで。結構便利なのではないかと思ったので。&lt;/p&gt;&#10;&lt;p&gt;Groovyのソースコードフォーマットマクロを作ってみた。といってもエディタの先頭行から末尾行まで以下の処理を繰り返すだけ。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;行の末尾に移動&lt;/li&gt;&#10;&lt;li&gt;改行を削除&lt;/li&gt;&#10;&lt;li&gt;改行をはさむ&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;改行するとエディタが自動インデントしてくれるので、結果整形されます。&lt;/p&gt;&#10;&lt;p&gt;もちろん &lt;a href="http://www.google.co.jp/search?q=jedit"&gt;jEdit&lt;/a&gt; のインデント機能が完全であるわけではないので制限はあるのですが、かなりきれいになります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;goToBufferStart&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;getText&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;readLines&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;times&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;goToEndOfWhiteSpace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;insertEnterAndIndent&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;もちろん、事前に &lt;a href="https://genzouw.com/entry/2009/03/04/070000"&gt;jEditエディタマクロをGroovyで組むための設定&lt;/a&gt; が必要です。&lt;/p&gt;</description></item><item><title>GroovyでjEditマクロを組む際のjEditクラス取得方法</title><link>https://genzouw.com/entry/2009/03/23/104500/364/</link><pubDate>Mon, 23 Mar 2009 10:45:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/23/104500/364/</guid><description>&lt;p&gt;Groovyを使用してjEditマクロを組む際に悩んでしまった箇所があったのでメモ。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;組み込み型のクラス&lt;/strong&gt; （java.lang.Dateなど）は&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="o"&gt;(...)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のようにstaticメソッドを呼び出し可能だが、&lt;/p&gt;&#10;&lt;p&gt;外部ライブラリのクラス（&lt;code&gt;org.gjt.sp.jedit.jEdit&lt;/code&gt; など）は&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;gjt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jedit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jEdit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newFile&lt;/span&gt;&lt;span class="o"&gt;(...)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のようにstaticメソッドを呼び出そうとしてエラーとなってしまう。ただし、jEditのマクロとして呼び出さず、コマンドラインから通常通り呼び出す場合にはエラーとならない。&lt;/p&gt;&#10;&lt;p&gt;jEditマクロをGroovyで記述する際には、以下のように指定してstaticメソッドを呼び出さなければいけないみたい。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.gjt.sp.jedit.jEdit&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;newFile&lt;/span&gt;&lt;span class="o"&gt;(...)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;jEditのbshマクロで、新しいバッファを作成する処理として&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;jEdit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newFile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;という記述がされていたが、Groovyではこの命令は以下のようになる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;forName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;org.gjt.sp.jedit.jEdit&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;newFile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;説明がわかりにくいかも。&lt;/p&gt;</description></item><item><title>Griffonにはテンプレートのviewを作る機能はないのね</title><link>https://genzouw.com/entry/2009/03/19/234700/365/</link><pubDate>Thu, 19 Mar 2009 23:47:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/19/234700/365/</guid><description>&lt;p&gt;&lt;a href="http://www.grails.org/"&gt;Grails&lt;/a&gt; と &lt;a href="http://groovy.codehaus.org/Griffon"&gt;Griffon&lt;/a&gt; はよくにた作りになっているけれども、やっぱり違う。&lt;/p&gt;&#10;&lt;p&gt;一番違いを感じるのが&lt;strong&gt;MVC&lt;/strong&gt;のセットを作成したとき。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Grailsは&lt;strong&gt;Model&lt;/strong&gt;（Domainクラス）作成後に雛形としての&lt;strong&gt;View&lt;/strong&gt;、&lt;strong&gt;Controller&lt;/strong&gt;を作成してくれる。&lt;/li&gt;&#10;&lt;li&gt;Griffonは&lt;strong&gt;Model&lt;/strong&gt;、&lt;strong&gt;View&lt;/strong&gt;、&lt;strong&gt;Controller&lt;/strong&gt;いずれも空っぽのソースのみが作られ、後はどうぞっていうスタンス。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;もっとも、「Griffon 0.1.0」でプロジェクト作成すればControllerには&lt;strong&gt;mvcGroupInit&lt;/strong&gt;っていうクロージャのみが作成されているけど。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Grails&lt;/strong&gt;がとっつきやすかった点の一つにこの雛形の作成があって、雛形を眺めているだけでGrailsでアプリを作る際にどんな風に作ったらいいかが見えてきていた。&lt;strong&gt;Griffon&lt;/strong&gt;にもこの点があったらいいのに。まだ&lt;strong&gt;Griffon&lt;/strong&gt;は雛形を作れるほどの標準的な作成方法が確立されていない？それともクライアントアプリは千差万別だからかな？&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>groovyで画像処理</title><link>https://genzouw.com/entry/2009/03/19/233500/366/</link><pubDate>Thu, 19 Mar 2009 23:35:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/19/233500/366/</guid><description>&lt;p&gt;うちの嫁が&lt;strong&gt;料理＋懸賞ブログ&lt;/strong&gt;を書いている。&lt;/p&gt;&#10;&lt;p&gt;いずれも携帯カメラで撮影した画像をアップしているのだが、&lt;span style="color: rgb(255, 153, 0);"&gt;&lt;strong&gt;毎回編集ソフトを起動し、その画像に書名（ニックネーム）を入力&lt;/strong&gt;&lt;/span&gt;している。&lt;/p&gt;&#10;&lt;p&gt;意外と手間そうなので、groovyでスクリプト化しようとおもってGoogle先生に尋ねるとぴったりのサイトが。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://kyle-in-jp.blogspot.com/"&gt;画像処理についてあれこれ&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;このサイトすごい。groovyでいろんな画像処理を行ってみています。サンプルソースも短くて見やすい。&lt;/p&gt;&#10;&lt;p&gt;早速これを利用してスクリプト組んであげよう♪&lt;/p&gt;</description></item><item><title>花粉症に効く（んだとおもう）飲み物</title><link>https://genzouw.com/entry/2009/03/19/095000/367/</link><pubDate>Thu, 19 Mar 2009 09:50:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/19/095000/367/</guid><description>&lt;p&gt;僕は花粉症だが、今年は比較的まし。理由に心当たりはある。&lt;/p&gt;&#10;&lt;p&gt;ある日仕事から帰ると、嫁がうれしそうに話してくれた。懸賞サイトに応募したところ、あったとのことでポン酢の瓶のようなものを見せてくれた。&lt;/p&gt;&#10;&lt;p&gt;それは「&lt;strong&gt;じゃばら&lt;/strong&gt;」というもので、何でも花粉症に効くらしいので俺のために応募してくれたそうだ。僕は花粉症にきく、なんてものは信じていないがせっかく嫁が手に入れてくれたものなのでそれを飲み続けた。&lt;/p&gt;&#10;&lt;p&gt;今日でちょうど一ヶ月ぐらいかな？気がつくと職場の花粉症のかたがたが苦しそうにしているにもかかわらず、僕はへいき。正直花粉症の季節終わったんじゃないかぐらいに生活していたので、気がつかなかった。&lt;/p&gt;&#10;&lt;p&gt;うそのようだが本当の話。ほんとうに「&lt;strong&gt;じゃばら&lt;/strong&gt;」が効いたのかはわからないけどね。&lt;/p&gt;</description></item><item><title>ダブルクリックの取得 どう書く？orgをgroovyでといてみた</title><link>https://genzouw.com/entry/2009/03/16/132400/369/</link><pubDate>Mon, 16 Mar 2009 13:24:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/16/132400/369/</guid><description>&lt;p&gt;ダブルクリックの取得 どう書く？orgを&lt;span style="font-weight: bold;"&gt;g&lt;/span&gt;&lt;strong&gt;roovy&lt;/strong&gt;でといてみた。&lt;/p&gt;&#10;&lt;p&gt;どう書く？org 8663 genzou&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://groovy.codehaus.org/Swing+Builder"&gt;Swing Builder&lt;/a&gt;を使用しただけの非常に簡単なコードです。&lt;/p&gt;</description></item><item><title>SwingPadに再挑戦してみた</title><link>https://genzouw.com/entry/2009/03/11/155600/371/</link><pubDate>Wed, 11 Mar 2009 15:56:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/11/155600/371/</guid><description>&lt;p&gt;今日、最新版の &lt;a href="http://griffon-framework.org/"&gt;Griffon&lt;/a&gt; を自分のマシンにインストールした。versionは &lt;strong&gt;griffon-0.1.0&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;p&gt;そしたら、&lt;code&gt;$GRIFFON_HOME/samples&lt;/code&gt;フォルダに &lt;strong&gt;SwingPad&lt;/strong&gt; がすでに用意されていた。以前Ubuntuで動かしたときには正常に動かなかったけど、会社のマシンはWindowsマシンなので試してみる。&lt;/p&gt;&#10;&lt;p&gt;これは確かにイイ！&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/masanobuimai/20081226#1230295348"&gt;SwingPadで遊ぶ-2008-12-26 - marsのメモ&lt;/a&gt;に書かれているとおりだ。 &lt;strong&gt;Griffon&lt;/strong&gt; 版の &lt;strong&gt;GroovyConsole&lt;/strong&gt; って感じ。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;GUI&lt;/strong&gt; アプリ作るが楽しくなりそう。&lt;/p&gt;&#10;&lt;h2 id="詰まったところ"&gt;詰まったところ&lt;/h2&gt;&#10;&lt;p&gt;Griffonのviewコードって、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.swing.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;application&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hoge&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;size:&lt;/span&gt;&lt;span class="n"&gt;huge&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;panel&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;...&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;みたいな感じなんだが、これをそのまま &lt;strong&gt;SwingPad&lt;/strong&gt; に貼り付けてもうまく動かない。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;application{&lt;/code&gt; , &lt;code&gt;}&lt;/code&gt; の部分をコメントアウトして、panel要素のみで実行させないとエラーになる。また、modelからのbindの記述なんかが残ってても動かないみたい。&lt;/p&gt;&#10;&lt;p&gt;結構詰まった。&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>日本 Grails/Groovy ユーザーグループ ‎に参加してみた</title><link>https://genzouw.com/entry/2009/03/10/125700/372/</link><pubDate>Tue, 10 Mar 2009 12:57:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/10/125700/372/</guid><description>&lt;p&gt;&lt;a href="http://www.jggug.org/"&gt;日本 Grails/Groovy ユーザーグループ ‎(main)‎&lt;/a&gt;に参加してたつもりが参加できていなかったみたいなので、参加登録してみる。&lt;/p&gt;&#10;&lt;p&gt;限りなくヒッキーな自分にとって、こういうのの登録とかかなり手が震える。でも関西での勉強会、とても楽しみなので勇気をだして登録ボタンクリックしてみた。&lt;/p&gt;&#10;&lt;p&gt;家帰ったらメール届いてるかな。&lt;/p&gt;</description></item><item><title>関西でもGroovyの読書会が開催されるらしい！</title><link>https://genzouw.com/entry/2009/03/09/122000/373/</link><pubDate>Mon, 09 Mar 2009 12:20:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/09/122000/373/</guid><description>&lt;ul&gt;&#10;&lt;li&gt;Groovyイン・アクション読書会IN関西!!! - blog4j 2.0 より。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ついに関西でもGroovyの読書会が！！！&#10;これはぜひ参加せねば！！！！&lt;/p&gt;</description></item><item><title>jEditマクロでSwing Guiを呼び出し</title><link>https://genzouw.com/entry/2009/03/09/095900/374/</link><pubDate>Mon, 09 Mar 2009 09:59:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/09/095900/374/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2009/03/05/134400"&gt;選択中の文字列中の全角文字をすべて半角に変換するマクロ | ゲンゾウ用ポストイット&lt;/a&gt; に引き続き、またまた &lt;strong&gt;jEdit&lt;/strong&gt; のマクロで遊んでみた。&lt;/p&gt;&#10;&lt;p&gt;Swingのダイアログ表示を起動してみる。とっても短いコード。&lt;/p&gt;&#10;&lt;h2 id="スクリプト"&gt;スクリプト&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.swing.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showMessageDialog&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;JOptionPane&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;showConfirmDialog&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;当然、 &lt;strong&gt;はい&lt;/strong&gt; と &lt;strong&gt;いいえ&lt;/strong&gt; 、 &lt;strong&gt;取り消し&lt;/strong&gt; の３つのボタンを持つダイアログがちゃんと表示される。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;jEdit&lt;/strong&gt; と &lt;strong&gt;Groovy&lt;/strong&gt; の組み合わせ、かなり気に入ってきた。&lt;/p&gt;</description></item><item><title>Groovyで選択中の文字列中の全角文字を半角文字に変換するjEditマクロを実装</title><link>https://genzouw.com/entry/2009/03/05/134400/375/</link><pubDate>Thu, 05 Mar 2009 13:44:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/05/134400/375/</guid><description>&lt;p&gt;&lt;strong&gt;jEdit &amp;amp; Groovy&lt;/strong&gt; ネタ。&lt;/p&gt;&#10;&lt;p&gt;エディタで選択中の文字列中の全角文字をすべて半角に変換するマクロです。対応表は &lt;a href="http://www.dennou-sedai.jp/index.html"&gt;電脳世代.jp&lt;/a&gt; のサイトを参考にしました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;力技です！&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedText&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;０&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;１&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;２&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;3&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;３&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;4&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;４&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;５&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;6&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;６&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;7&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;７&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;８&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;9&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;９&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;a&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ａ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;b&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｂ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;c&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｃ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;d&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｄ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;e&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｅ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;f&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｆ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;g&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｇ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;h&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｈ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;i&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｉ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;j&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｊ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;k&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｋ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;l&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｌ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;m&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｍ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｎ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;o&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｏ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;p&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｐ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;q&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｑ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｒ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;s&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｓ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｔ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;u&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｕ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;v&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｖ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;w&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｗ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｘ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｙ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;z&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｚ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ａ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｂ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｃ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;D&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｄ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;E&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｅ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;F&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｆ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;G&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｇ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;H&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｈ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;I&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｉ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;J&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｊ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;K&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｋ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;L&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｌ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;M&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｍ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;N&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｎ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;O&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｏ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;P&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｐ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Q&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｑ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;R&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｒ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;S&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｓ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;T&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｔ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;U&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｕ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;V&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｖ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;W&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｗ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;X&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｘ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Y&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｙ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Z&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Ｚ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｱ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ア&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｲ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;イ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｳ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ウ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｴ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;エ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｵ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;オ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｶ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;カ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｷ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;キ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｸ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ク&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｹ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ケ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｺ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;コ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｻ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;サ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｼ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;シ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｽ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ス&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｾ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;セ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｿ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ソ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾀ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;タ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾁ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;チ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾂ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ツ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾃ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;テ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾄ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ト&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾅ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ナ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾆ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ニ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾇ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ヌ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾈ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ネ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾉ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ノ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾊ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ハ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾋ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ヒ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾌ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;フ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾍ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ヘ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾎ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ホ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾏ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;マ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾐ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ミ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾑ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ム&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾒ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;メ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾓ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;モ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾔ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ヤ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾕ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ユ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾖ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ヨ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾗ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ラ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾘ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;リ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾙ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ル&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾚ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;レ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾛ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ロ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾜ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ワ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｦ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ヲ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾝ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ン&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｧ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ァ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｨ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ィ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｩ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ゥ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｪ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ェ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｫ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ォ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｯ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ッ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｬ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ャ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｭ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ュ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｮ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ョ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｰ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ー&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;｡&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;。&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;､&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;、&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;･&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;・&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;｢&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;「&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;｣&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;」&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;゛&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾟ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;゜&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｳﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ヴ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｶﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ガ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｷﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ギ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｸﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;グ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｹﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ゲ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｺﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ゴ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｻﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ザ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｼﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ジ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｽﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ズ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｾﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ゼ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ｿﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ゾ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾀﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ダ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾁﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ヂ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾂﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ヅ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾃﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;デ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾄﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ド&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾊﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;バ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾋﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ビ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾌﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ブ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾍﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ベ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾎﾞ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ボ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾊﾟ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;パ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾋﾟ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ピ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾌﾟ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;プ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾍﾟ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ペ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;n:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ﾎﾟ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;w:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ポ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;w&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;selectedText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;いつものようにこれを &lt;code&gt;$HOME/.jedit/macros&lt;/code&gt; に配置してメニューからマクロを実行します。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;w&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;n&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;w&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とすれば、半角から全角への変換もできます。&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>syntax-highlighter pluginのインストール時のバグが修正されたみたい</title><link>https://genzouw.com/entry/2009/03/05/093200/376/</link><pubDate>Thu, 05 Mar 2009 09:32:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/05/093200/376/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2009/01/15/075600"&gt;ブログアプリをつくろう（しかしsyntax-highlighterがインストールできず） | ゲンゾウ用ポストイット&lt;/a&gt; で、 &lt;a href="http://www.grails.org/SyntaxHighlighter+Plugin"&gt;SyntaxHighlighter Plugin&lt;/a&gt; がインストールに失敗するという投稿をしました。修正方法なども一緒に連絡しておいたのですぐ直るかなーと思ってたのですが返事がないまま・・・&lt;/p&gt;&#10;&lt;p&gt;1/15に作成者にメールで連絡したのですが、昨日返事がありました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「もう直ったので、またつかったね♪」&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;忙しい中、修正ありがとうございます！&lt;/p&gt;</description></item><item><title>GroovyでSQL整形jEditマクロを作ってみた</title><link>https://genzouw.com/entry/2009/03/04/095700/377/</link><pubDate>Wed, 04 Mar 2009 09:57:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/04/095700/377/</guid><description>&lt;p&gt;Groovyで、SQL整形用の &lt;strong&gt;jEdit&lt;/strong&gt; マクロを作ってみた。&lt;/p&gt;&#10;&lt;p&gt;設定方法は以下のとおり。&lt;/p&gt;&#10;&lt;p&gt;（ 事前に、 &lt;a href="https://genzouw.com/entry/2009/03/04/070000"&gt;jEditエディタマクロをGroovyで組むための設定 | ゲンゾウ用ポストイット&lt;/a&gt; にて紹介した設定が必要。 ）&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="http://homepage2.nifty.com/igat/igapyon/diary/2005/ig050704.html"&gt;blancoSqlFormatte&lt;/a&gt; （SQL整形用ライブラリ）をダウンロードし、 &lt;code&gt;$USER_HOME/.jedit/jars&lt;/code&gt; に配置&lt;/li&gt;&#10;&lt;li&gt;jEditを起動し、メニューから &lt;strong&gt;plugins -&amp;gt; plugins manager&lt;/strong&gt; を選ぶ。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;managerタブ&lt;/strong&gt; から &lt;em&gt;&lt;em&gt;blancoSqlfomatter&lt;/em&gt;.jar&lt;/em&gt;* をチェックし、 &lt;strong&gt;jEdit&lt;/strong&gt; にjarファイルを認識させる。&lt;/li&gt;&#10;&lt;li&gt;以下のようなスクリプトを &lt;code&gt;$USER_HOME/.jedit/macros&lt;/code&gt; に配置する（拡張子は.groovy）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;blanco.commons.sql.format.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BlancoSqlFormatter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BlancoSqlRule&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SQL文を編集中にマクロを実行すると、SQLが整形されます。便利！&lt;/p&gt;</description></item><item><title>jEditエディタマクロをGroovyで組むための設定</title><link>https://genzouw.com/entry/2009/03/04/070000/378/</link><pubDate>Wed, 04 Mar 2009 07:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/04/070000/378/</guid><description>&lt;p&gt;ようやく見つけました。jEditマクロを &lt;strong&gt;Groovy&lt;/strong&gt; で組むための設定を。以下のサイトを参考にしました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://markmail.org/message/lz4zyeqdgovk6cds"&gt;RE: [groovy-user] Groovy and Jedit plugin - Steven Buroff - org.codehaus.groovy.user - MarkMail&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;かかれている内容にそってやってみた。&lt;/p&gt;&#10;&lt;p&gt;前提条件としては以下の過去エントリの設定を事前に行っておく必要がある。（多分）&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2009/03/02/150500"&gt;jEditでGroovyコーディングするための各種設定 | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="設定開始"&gt;設定開始！&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;jEditを起動&#10;&lt;ul&gt;&#10;&lt;li&gt;メニューから **plugins -&amp;gt; plugin manager ** を選択&lt;/li&gt;&#10;&lt;li&gt;installタブから &lt;strong&gt;SuperScript&lt;/strong&gt; というプラグインを探しインストール&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;jEditを一度終了する。&#10;&lt;ul&gt;&#10;&lt;li&gt;メニューから &lt;strong&gt;plugins -&amp;gt; plugin options&lt;/strong&gt; を選択&lt;/li&gt;&#10;&lt;li&gt;左のツリーから &lt;strong&gt;SuperScript&lt;/strong&gt; を選択して、Groovyをマクロ対象言語とする。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;これでOK。&lt;/p&gt;&#10;&lt;h2 id="実行してみる"&gt;実行してみる&lt;/h2&gt;&#10;&lt;p&gt;適当なスクリプトを組んでみる。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;jEdit&lt;/strong&gt; マクロではいくつかの組み込み変数が定義されているようで、その一つが &lt;code&gt;textArea&lt;/code&gt; という変数みたい。これは現在開いているエディタのコード表示部分のようだ。&lt;/p&gt;&#10;&lt;p&gt;以下のようなコードを &lt;code&gt;testx.groovy&lt;/code&gt; というファイル名で &lt;code&gt;&amp;lt;USER_HOME&amp;gt;/.jedit/macros&lt;/code&gt; に配置する。（Windows、Linuxいずれも同じ。Macは分かりません。）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;textArea&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;n最後尾に追加されます。&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;メニューから &lt;strong&gt;macros =&amp;gt; rescan macros&lt;/strong&gt; を選択すると、 &lt;code&gt;&amp;lt;USER_HOME&amp;gt;/.jedit/macros&lt;/code&gt; のソースをチェックしてくれる。&lt;br&gt;&#10;&lt;strong&gt;macros =&amp;gt; testx.gro&lt;/strong&gt; （なぜか途中で切れてるw）が追加されているので実行すると、マクロが動作するはず。&lt;/p&gt;&#10;&lt;h2 id="感想"&gt;感想&lt;/h2&gt;&#10;&lt;p&gt;こういうのが欲しかった！マクロ実行までに一秒ぐらいまたないといけないけど、十分。&lt;/p&gt;</description></item><item><title>jEditエディタマクロをGroovyで組めるとか組めないとか</title><link>https://genzouw.com/entry/2009/03/03/092500/379/</link><pubDate>Tue, 03 Mar 2009 09:25:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/03/092500/379/</guid><description>&lt;p&gt;またまたjEditネタで。&lt;/p&gt;&#10;&lt;p&gt;jEditには強力なエディタマクロ機能が用意されています。マクロは &lt;a href="http://www.beanshell.org/"&gt;BeanShell&lt;/a&gt; で命令を記述する仕組みとなっているのですが、ネット上の某掲示板の書き込みでは &lt;strong&gt;Groovy&lt;/strong&gt; を使用した命令の記述も可能ということ。&lt;/p&gt;&#10;&lt;p&gt;いろいろ試してみてもできないのですが、今度じっくり探してみたい。 &lt;strong&gt;Groovy&lt;/strong&gt; でマクロ書けたらかなりうれしい。&lt;/p&gt;</description></item><item><title>jEditで開いているGroovyソースをショートカットで実行する</title><link>https://genzouw.com/entry/2009/03/03/092100/380/</link><pubDate>Tue, 03 Mar 2009 09:21:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/03/092100/380/</guid><description>&lt;p&gt;jEditネタ。開いているGroovyソースをショートカットで実行する方法について。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;メニューから &lt;strong&gt;Utilities &amp;gt; Global Options&lt;/strong&gt; を実行。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;jEdit -&amp;gt; Shortcuts&lt;/strong&gt; を選択。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Command&lt;/strong&gt; から &lt;strong&gt;Run Current Buffer&lt;/strong&gt; を探し、クリック。&lt;/li&gt;&#10;&lt;li&gt;ショートカット設定画面が表示されるので、 &lt;strong&gt;F5&lt;/strong&gt; を押してＯＫ&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;これだけ。&lt;/p&gt;&#10;&lt;p&gt;あとは適当な &lt;strong&gt;Groovyスクリプト&lt;/strong&gt; を編集中に &lt;strong&gt;F5&lt;/strong&gt; ボタンを押せばＯＫ。 &lt;strong&gt;Groovy&lt;/strong&gt; &lt;strong&gt;Console&lt;/strong&gt; なイメージで使用できる。&lt;/p&gt;</description></item><item><title>杉花粉のばかやろぉー</title><link>https://genzouw.com/entry/2009/03/02/161500/381/</link><pubDate>Mon, 02 Mar 2009 16:15:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/02/161500/381/</guid><description>&lt;p&gt;もはや地獄・・・２月の中旬を過ぎたあたりから&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;目が異常にかゆい&lt;/li&gt;&#10;&lt;li&gt;鼻水が大量にでて、呼吸困難&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;に陥っている。花粉症だ。&lt;/p&gt;&#10;&lt;p&gt;昼間よりも夜がしんどい。布団が花粉に汚染されているようで、布団に入るととたんに呼吸が苦しくなる。鼻先にこんにちわしていた鼻水さんたちも、僕がお休みすると同時におくに引っ込むので必然的に口呼吸となる。&lt;/p&gt;&#10;&lt;p&gt;嫁いわく&lt;strong&gt;ベイダー卿&lt;/strong&gt;のように一晩中「&lt;strong&gt;コー、コー&lt;/strong&gt;」といっているらしい。&lt;/p&gt;&#10;&lt;p&gt;二ヶ月近く慢性寝不足状態を耐えなければ・・・&lt;/p&gt;</description></item><item><title>jEditでGroovyコーディングするための各種設定</title><link>https://genzouw.com/entry/2009/03/02/150500/382/</link><pubDate>Mon, 02 Mar 2009 15:05:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/02/150500/382/</guid><description>&lt;p&gt;&lt;a href="http://www.jedit.org/"&gt;jEdit&lt;/a&gt; で &lt;strong&gt;Groovy&lt;/strong&gt; のソースをコーディングするための各種設定について、 Groovy - JEdit Plugin に書かれていたので設定してみた。&lt;/p&gt;&#10;&lt;p&gt;基本的にはこの英文を解釈して進めていけばいいのだが、&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「Console Commando Plugin」&lt;/strong&gt; の設定内容について、一点詰まってしまったのでメモしておく。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Instructions:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Install Console plugin in jEdit.&lt;/li&gt;&#10;&lt;li&gt;Copy the attachment on this wiki: groovy.xml into your $HOME/.jedit/console/commando/groovy.xml&#10;(NOTE: I hardcoded my groovy path. Change it if it doesn't match yours.)&lt;/li&gt;&#10;&lt;li&gt;jEdit Menu: Plugins&amp;gt;Console&amp;gt;Regen menu.&lt;/li&gt;&#10;&lt;li&gt;jEdit Menu: Plugins&amp;gt;Plugin Options..., On left pick&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;とある。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt; の「 &lt;strong&gt;このwikiのgroovy.xml&lt;/strong&gt; を、 &lt;code&gt;$HOME/.jedit/console/commando/groovy.xml&lt;/code&gt; にコピーしてね」が曲者で、 &lt;strong&gt;このwikiのgroovy.xml&lt;/strong&gt; ていうのがどこにもない。&lt;/p&gt;&#10;&lt;p&gt;いろいろ探し回って、以下のサイトのxmlの内容を元に &lt;strong&gt;groovy.xml&lt;/strong&gt; を作成すればＯＫ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://snipplr.com/view/2788/jedits-plugin-commamdo-config-for-groovy/"&gt;jEdit's Plugin: Commamdo config for groovy - XML - Snipplr&lt;/a&gt; &lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;Groovyのサイトの内容って、本当はどこか別のサイトの内容を引用しているのかな？？？&lt;/p&gt;</description></item><item><title>メインエディタをjEditに切り替える</title><link>https://genzouw.com/entry/2009/03/02/141300/383/</link><pubDate>Mon, 02 Mar 2009 14:13:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/03/02/141300/383/</guid><description>&lt;p&gt;職場は &lt;strong&gt;Windows&lt;/strong&gt; だが家は &lt;strong&gt;Ubuntu&lt;/strong&gt; を使用している。&lt;/p&gt;&#10;&lt;p&gt;職場のWindowsマシンではメインのエディタとしてサクラエディタを使用しているが、家のUbuntuマシンではwindowsのエディタは動かない。がんばってEmacsやmousepad、GEditを使用していたのだが、どうもしっくりこない。わざわざ &lt;strong&gt;Eclipse&lt;/strong&gt; 、 &lt;strong&gt;NetBean&lt;/strong&gt; を立ち上げるのも馬鹿らしい。&lt;/p&gt;&#10;&lt;p&gt;そこで &lt;strong&gt;Java&lt;/strong&gt; で作られたどこでも動くエディタを調べてみた。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://www.jedit.org/"&gt;jEdit - Programmer&amp;rsquo;s Text Editor&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;一度触ったことがあったのだが、ちょっと触ってやめてしまった。いい機会なので、使い込んでみる。当然Windows環境のサクラエディタは削除し、自分を追い込む。&lt;/p&gt;</description></item><item><title>groovyでstruts-config.xmlをhtml変換</title><link>https://genzouw.com/entry/2009/02/24/130800/386/</link><pubDate>Tue, 24 Feb 2009 13:08:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/02/24/130800/386/</guid><description>&lt;p&gt;struts-config.xmlの内容のうち、特に&lt;strong&gt;action-mappings&lt;/strong&gt;についてはチェックする機会が多い。もうちょっと見やすくならないかな、ということで、htmlに変換してみた。（xslt使うのが本来のやり方なのかもしれないけれども、そこはGroovy中毒患者。）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;groovy.xml.MarkupBuilder&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;org.custommonkey.xmlunit.*&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;final&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;xmlSlurper&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;XmlSlurper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;xmlSlurper&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceFirst&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&amp;lt;!&lt;/span&gt;&lt;span class="n"&gt;DOCTYPE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;[^&amp;gt;]+&amp;gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;action-mappings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MarkupBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rel&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;text/css&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;href&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;style.css&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;style&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@path&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;yieldUnescaped&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;.${it}{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; background-color: #${(1..6).collect{(&amp;#34;A&amp;#34;..&amp;#34;F&amp;#34;)[(int)(Math.random()*6)]}.join(&amp;#34;&amp;#34;)};&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;caption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;action-mappings&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;thead&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;forward&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;th&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;scope&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tbody&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt;&lt;span class="err"&gt;:&amp;#34;&lt;/span&gt;&lt;span class="nc"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;@path.toString&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;){&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; td(action.@path)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; td(action.@type)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; td(style:&amp;#34;&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;){&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ul{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; action.forward.each{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; li(it.@name)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; td(action.@scope)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これに、適当なcssファイルを付け加えてみる。&lt;/p&gt;</description></item><item><title>クリップボードのパイプ操作スクリプトを作成してみる</title><link>https://genzouw.com/entry/2009/02/19/094500/387/</link><pubDate>Thu, 19 Feb 2009 09:45:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/02/19/094500/387/</guid><description>&lt;p&gt;クリップボードのパイプ操作スクリプトを作成してみる。（もちろんwindowsでも動作するが、僕の家のubuntu用に作ってみた）&lt;/p&gt;&#10;&lt;h2 id="クリップボード操作クラス作成"&gt;クリップボード操作クラス作成&lt;/h2&gt;&#10;&lt;p&gt;まずはクリップボードの情報を操作するクラスを作成し、クラスパスの通る場所に配置する。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="o"&gt;!/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.awt.datatransfer.DataFlavor&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;java.awt.datatransfer.StringSelection&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GClipBoard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clipboard&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;awt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;defaultToolkit&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;systemClipboard&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;setText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;StringSelection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clipboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;clipboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getTransferData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DataFlavor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stringFlavor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="コマンドラインスクリプト作成"&gt;コマンドラインスクリプト作成&lt;/h2&gt;&#10;&lt;p&gt;次に、~/binに以下の２つのファイルを配置（ &lt;strong&gt;パスの通る場所と言う意味&lt;/strong&gt; ）&lt;/p&gt;</description></item><item><title>Groovy(Java)でCSVレコードの分解 - opencsvライブラリを使用</title><link>https://genzouw.com/entry/2009/02/17/152500/388/</link><pubDate>Tue, 17 Feb 2009 15:25:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/02/17/152500/388/</guid><description>&lt;p&gt;&lt;a href="http://ja.doukaku.org/33/"&gt;RFC 4180対応版 CSVレコードの分解 どう書く？org&lt;/a&gt;をといてみた。 &lt;strong&gt;=&amp;gt;&lt;/strong&gt; &lt;em&gt;どう書く？org 8517 genzou: (RFC 4180対応版 CSVレコードの分解) - 投稿の詳細&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;fumokmmさんがすでに回答済みでしたので、別解で。というか、ただライブラリを使用しただけです。&lt;/p&gt;&#10;&lt;p&gt;ご存知の方も多いと思いますが、javaには&lt;a href="http://opencsv.sourceforge.net/"&gt;opencsv&lt;/a&gt;というcsvファイルの読み書き用ライブラリが存在します。そちらを利用しました。&lt;/p&gt;&#10;&lt;p&gt;お題にもあるように、&lt;/p&gt;&#10;&lt;ul&gt;&#10; &lt;li&gt;カンマ(,)区切りに対応&lt;/li&gt;&#10; &lt;li&gt;設定によりtab区切りにも対応&lt;/li&gt;&#10; &lt;li&gt;ダブルクォート(&amp;quot;)による要素の囲みに対応&lt;/li&gt;&#10; &lt;li&gt;ダブルクォート内のダブルクォートの入れ子に対応（&amp;quot;&amp;quot;で表現)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;をすべて満たしており、大変使いやすいです。&lt;/p&gt;&#10;&lt;h4&gt;追記&lt;/h4&gt;&#10;&lt;p&gt;いよいよ花粉症の季節到来です。&lt;/p&gt;&#10;&lt;p&gt;この時期は慢性的に睡眠不足になってしまいます。昨日も今日も睡眠不足。&lt;/p&gt;</description></item><item><title>GroovyでOS独自のコマンドをパイプしてみる。</title><link>https://genzouw.com/entry/2009/02/10/140300/389/</link><pubDate>Tue, 10 Feb 2009 14:03:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/02/10/140300/389/</guid><description>&lt;h2 id="groovyスクリプトjava内でパイプしてみようとふと思った"&gt;Groovyスクリプト(Java)内でパイプしてみようとふと思った&lt;/h2&gt;&#10;&lt;p&gt;Groovyスクリプト(Java)の中でネイティブコマンドからの出力をを &lt;strong&gt;パイプ&lt;/strong&gt; し別のネイティブコマンドで受け取ってみる。&lt;/p&gt;&#10;&lt;p&gt;ホームディレクトリの中のテキストファイルをピックアップしてみる。&#10;僕のWindowsPCには &lt;strong&gt;Cygwin&lt;/strong&gt; がインストールされているので、 &lt;strong&gt;Cygwin&lt;/strong&gt; のコマンドを実行してみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;C:/cygwin/bin&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${bin}/ls.exe -lta ~/&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${bin}/grep.exe txt&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;execute&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="この程度の処理にパイプが必要か"&gt;この程度の処理にパイプが必要か？&lt;/h2&gt;&#10;&lt;p&gt;これはお遊びの範囲なのは重々承知&lt;/p&gt;&#10;&lt;p&gt;このぐらいであれば&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;listFiles&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="s"&gt;/.+.txt/&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;と記述したほうがはるかにいいだろうし、そもそも &lt;strong&gt;Cygwin&lt;/strong&gt; がインストールされているなら&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ls.exe -lta ~/ &lt;span class="p"&gt;|&lt;/span&gt; grep.exe txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;でいいのではないかというツッコミは認める。&lt;/p&gt;&#10;&lt;h2 id="とはいえjavaプログラム内で標準出力標準入力の連携ができるのは面白い"&gt;とはいえ、Javaプログラム内で標準出力＋標準入力の連携ができるのは面白い&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;diff実行→差分を整形してレポートへ&lt;/strong&gt; 、とかできるのは魅力的。&lt;/p&gt;&#10;&lt;p&gt;面白いのは、Groovyスクリプト（Javaプログラム）内で&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Processクラスインスタンス | Processクラスインスタンス&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;にて、標準出力の受け渡しができるということ。&#10;どうしてもJava上ですべてのロジックを組まないといけない場合でも、外部コマンドを組み合わせて車輪の再発明を避けることができる。&#10;これは面白い。&lt;/p&gt;</description></item><item><title>GroovyConsoleにて、staticな変数が生き残る</title><link>https://genzouw.com/entry/2009/02/09/232200/390/</link><pubDate>Mon, 09 Feb 2009 23:22:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/02/09/232200/390/</guid><description>&lt;p&gt;ちょっとだけ引っかかってしまったのでメモ。&lt;/p&gt;&#10;&lt;p&gt;仕事などでも、WEBに掲載されているJavaサンプルコードは&lt;strong&gt;GroovyConsole&lt;/strong&gt;で実行することが多い。Javaのソースコードでも修正せずにある程度動くため、Groovy以外でもかなり重宝している。&lt;/p&gt;&#10;&lt;p&gt;ただし、staticな変数の使用には注意が必要。たとえば以下のようなコードをGroovyConsoleで順番に実行してみる。&lt;/p&gt;&#10;&lt;h5 id="コード１を実行"&gt;コード１を実行&lt;/h5&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;300&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h5 id="コード２を実行"&gt;コード２を実行&lt;/h5&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;あら不思議。xの値が表示できてしまう。GroovyConsoleを朝から晩まで落とさずに使用していると、以前実行したstatic変数値が残り続ける。&lt;/p&gt;</description></item><item><title>確かに、日本語だと違いを聞き取れないけど</title><link>https://genzouw.com/entry/2009/02/05/130300/392/</link><pubDate>Thu, 05 Feb 2009 13:03:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/02/05/130300/392/</guid><description>&lt;p&gt;既存コードの解析をしていたところ、&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;obj2str()&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;というメソッドがあった。&lt;/p&gt;&#10;&lt;p&gt;「NullPointerException回避処理を追加したtoString()実行メソッドなんだろなー」とコードを見ていた。&lt;/p&gt;&#10;&lt;p&gt;そのすぐ直下に&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;obj1str()&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;というメソッドがあった。&lt;/p&gt;&#10;&lt;p&gt;・・・・・はぁ？？&lt;/p&gt;</description></item><item><title>Groovyでファイルコピーを行うための簡単な方法</title><link>https://genzouw.com/entry/2009/02/04/133500/393/</link><pubDate>Wed, 04 Feb 2009 13:35:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/02/04/133500/393/</guid><description>&lt;p&gt;Groovyでファイルコピーを行うための非常に簡単な方法がわかったのでメモしておきます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;hoge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;hoge&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fuge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;fuge&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;hoge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;fuge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readBytes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;簡潔だと思う。&lt;/p&gt;</description></item><item><title>自作java2groovy</title><link>https://genzouw.com/entry/2009/02/04/075200/394/</link><pubDate>Wed, 04 Feb 2009 07:52:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/02/04/075200/394/</guid><description>&lt;p&gt;Groovyインストール後は &lt;strong&gt;java2groovy&lt;/strong&gt; というJavaのコードをGroovyのコードに変換してくれるコマンドが用意されている。けれども結構気にくわない点が多い（不要な改行が追加される、setter、getterへの参照をプロパティ参照形式にしてほしいがしてくれない、など）&lt;/p&gt;&#10;&lt;p&gt;再発明になるかもしれないが、自作してみる。&lt;/p&gt;&#10;&lt;h2 id="ソースコード"&gt;ソースコード&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]).&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;/t/&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;/.get([a-zA-Z0-9_]+)s*(s*)/&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;/System.out./&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;/.set(w+)s*(([ja-zA-Z0-9_ &amp;#34;&amp;#39;]+))/&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;property&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;property&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;toLowerCase&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;property&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; = &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;},&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;/ +$/&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;/;$/&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;/(?&amp;lt;=^s*)(publics+)?(String|int|float|double|byte|boolean)s+/&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;def &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="機能"&gt;機能&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;各行の末尾の&amp;quot;;&amp;ldquo;を除去&lt;/li&gt;&#10;&lt;li&gt;&amp;ldquo;System.out.〜&amp;ldquo;の記述から、&lt;code&gt;System.out.&lt;/code&gt; を除去&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;o.getXxx()&lt;/code&gt; 、&lt;code&gt;o.setYyy(b)&lt;/code&gt;の記述は、o.xxx、o.yyy = bに&lt;/li&gt;&#10;&lt;li&gt;基本データ型の宣言部分は、Groovyっぽく &lt;strong&gt;def&lt;/strong&gt; を使用&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="その他のマイアレンジ"&gt;その他のマイアレンジ&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;仕事で他の人の長いソース見るときに使うが、コメント見て何かいているかよく分からないソースが多いため（笑）、コメント除去&lt;/li&gt;&#10;&lt;li&gt;タブ文字を半角文字に&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ノイズが少ないのでソース解析によい"&gt;ノイズが少ないので、ソース解析によい&lt;/h2&gt;&#10;&lt;p&gt;JavaのコードとGroovyのコードの違いの一つとして、 &lt;strong&gt;ノイズ量&lt;/strong&gt; がある。&lt;/p&gt;&#10;&lt;p&gt;コードの読みやすさって、どれだけそのコードが無駄な処理をしていないかというのがものすごく大きい。Groovyコードに変換すると、わずかながらソースの文字数がへるので解析しやすくなる。&lt;/p&gt;&#10;&lt;p&gt;でも、他のソースへ飛んだりは &lt;strong&gt;Eclipse&lt;/strong&gt; や &lt;strong&gt;Netbeans&lt;/strong&gt; つかった方が見やすいんだよなぁ。&lt;/p&gt;</description></item><item><title>今年もやっぱり風邪ひいた。風邪ひき続け記録更新中。</title><link>https://genzouw.com/entry/2009/02/03/111400/395/</link><pubDate>Tue, 03 Feb 2009 11:14:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/02/03/111400/395/</guid><description>&lt;p&gt;先週金曜日、定時直後から体の調子が悪かった。どうやら風邪を引いたらしい。堂島ビルで作業しているが、ビル内でもみな咳き込んでいる状態。ビルの中は密閉空間なので風邪も広がるだろうなぁ。&lt;/p&gt;&#10;&lt;p&gt;土日はゆっくり休養し、月曜日は仕事へ向かったのだが午前中でリタイヤ。&lt;/p&gt;&#10;&lt;p&gt;今回の風邪はせきがほとんど出ず、土日は痰が、月曜日は割れそうなほどのすさまじい頭痛という症状だった。昨晩はプールにつかったんじゃないかというほどの大量の汗をかき、今はまずまずの体調。&lt;/p&gt;&#10;&lt;p&gt;僕は比較的からだがよわい。しかし嫁は何年も風邪をひいたことがなく、風邪をひいたことを覚えていないぐらい。&lt;/p&gt;</description></item><item><title>作業予定表から週単位で作業量を積み上げる どう書く？orgをといてみた。</title><link>https://genzouw.com/entry/2009/01/30/160900/396/</link><pubDate>Fri, 30 Jan 2009 16:09:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/30/160900/396/</guid><description>&lt;p&gt;&lt;a href="http://ja.doukaku.org/227/"&gt;作業予定表から週単位で作業量を積み上げる どう書く？org&lt;/a&gt;をといてみた。&lt;/p&gt;&#10;&lt;p&gt;かなりスパゲッティになってしまっている。&lt;/p&gt;&#10;&lt;p&gt;独力で解こうとしたが弱いおつむがヒートしそうなので、fumokmmさんの解答を参考に。&lt;/p&gt;&#10;&lt;pre language="java" name="code"&gt;&#10;import static java.util.Calendar.*&#10;&lt;p&gt;def initTasks = [&#10;[start:&amp;quot;2009/1/10&amp;quot;, days:21, mark:&amp;quot;＃&amp;quot;],&#10;[start:&amp;quot;2009/1/15&amp;quot;, days: 6, mark:&amp;quot;＠&amp;quot;],&#10;[start:&amp;quot;2009/1/10&amp;quot;, days: 8, mark:&amp;quot;＊&amp;quot;],&#10;[start:&amp;quot;2009/1/16&amp;quot;, days: 1, mark:&amp;quot;＝&amp;quot;],&#10;[start:&amp;quot;2009/1/16&amp;quot;, days: 3, mark:&amp;quot;％&amp;quot;],&#10;[start:&amp;quot;2009/1/30&amp;quot;, days: 4, mark:&amp;quot;＝&amp;quot;],&#10;]&lt;/p&gt;&#10;&lt;p&gt;// 日別のタスクテーブル作成&#10;def eachDayTasks = [:]&#10;(new Date(&amp;quot;2009/1/1&amp;quot;)..new Date(&amp;quot;2009/1/31&amp;quot;)).each{ date -&amp;gt;&#10;eachDayTasks[date] = initTasks.collect{&#10;def start = new Date(it.start)&#10;(date in start..&amp;lt;(start+it.days))?it.mark:[]&#10;}.flatten()&#10;}&lt;/p&gt;&#10;&lt;p&gt;// 週別のタスクテーブル&#10;def eachWeekTasks = [:]&#10;eachDayTasks.groupBy{ key, value -&amp;gt;&#10;key[WEEK_OF_YEAR] - (key[DAY_OF_WEEK]==SUNDAY?1:0)&#10;}.each{ groupKey, task -&amp;gt;&#10;eachWeekTasks[task*.key.min().format(&amp;lsquo;MM/dd&amp;rsquo;)] = task*.value.flatten().sort()&#10;}&lt;/p&gt;</description></item><item><title>配列リテラルの記述が、カンマが一個多くても正常に動作するよ</title><link>https://genzouw.com/entry/2009/01/28/185600/397/</link><pubDate>Wed, 28 Jan 2009 18:56:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/28/185600/397/</guid><description>&lt;p&gt;いつものことですが、人のソースを見ているととても勉強になる。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://ja.doukaku.org/227/lang/groovy/"&gt;作業予定表から週単位で作業量を積み上げる Groovyで どう書く？org&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;をのんびり見ているときのこと。&lt;/p&gt;&#10;&lt;p&gt;以下のようなソースの記述を見つけ、「&lt;strong&gt;あれ？カンマ一個多いな。&lt;/strong&gt;」と思った。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ワークプランリスト&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;workPlanList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;2009&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;＃&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;2009&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;15&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;＠&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;2009&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;＊&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;2009&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;16&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;＝&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;2009&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;16&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;％&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;2009&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;30&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;＝&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;しかし、不思議なことに、これは正常に動作する。&lt;/p&gt;&#10;&lt;p&gt;もしやと思って以下のコードを実行してみると・・・&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;&amp;gt;&amp;gt; [1, 2, 3, 4, 5, ]&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>IPv6アドレスの短縮 どう書く？org</title><link>https://genzouw.com/entry/2009/01/28/131900/398/</link><pubDate>Wed, 28 Jan 2009 13:19:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/28/131900/398/</guid><description>&lt;p&gt;&lt;a href="http://ja.doukaku.org/226/"&gt;IPv6アドレスの短縮 どう書く？org&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;の問題をといてみたが難しいので他の方の解答を見てみた。&lt;/p&gt;&#10;&lt;p&gt;どう書く？org 8349 horiuchi: Javaには、IPv6のアドレスも標準で...(IPv6アドレスの短縮) - 投稿の詳細&lt;/p&gt;&#10;&lt;p&gt;を見ると・・・あらら、こんなに簡単にかけるんだね。&lt;/p&gt;&#10;&lt;p&gt;ほんとJavaの標準ライブラリ知っているのと知らないのでは生産性ぜんぜん違うね。職場でも必死に半角英数字ふくむ、ふくまないをループで一文字ずつ処理している後輩を見ると悲しくなる。&lt;/p&gt;&#10;&lt;p&gt;Groovyで実装した解答を載せます。&lt;em&gt;ああ、実質３行だｗ&lt;/em&gt;&lt;/p&gt;&#10;&lt;pre name="code" language="java"&gt;def compressIpv6(address){&#10;&amp;nbsp;&amp;nbsp;&amp;nbsp; return java.net.InetAddress.getByName(address).hostAddress.replaceFirst(&amp;quot;(^|:)(0:){2,}&amp;quot;, &amp;quot;::&amp;quot;)&#10;}&#10;println compressIpv6(&amp;quot;1230:5670:0000:0000:0123:0000:0000:00ab&amp;quot;)&#10;println compressIpv6(&amp;quot;0000:0000:0000:0000:0000:0000:0000:0001&amp;quot;)&lt;/pre&gt;</description></item><item><title>Re：Re:ファイルの添え番号の桁を3桁に揃えるGroovyスクリプト</title><link>https://genzouw.com/entry/2009/01/26/130500/399/</link><pubDate>Mon, 26 Jan 2009 13:05:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/26/130500/399/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/fumokmm/20090120/1232465055"&gt;Re:ファイルの添え番号の桁を3桁に揃えるGroovyスクリプト - No Programming, No Life&lt;/a&gt;というGroovyを利用してファイル名のリネームを行うコードがあったので、記載されていたものを拝借して僕なりにコーディングしてみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;hoge&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jpg&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;hoge&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;11&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jpg&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;hoge&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jpg&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;hoge&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;10111&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jpg&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;hoge&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;10&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jpg&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;hoge&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;100&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jpg&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 最大桁数を求めて&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;maxDigit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/^[^&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;]*|[^&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;]*&lt;/span&gt;&lt;span class="n"&gt;$&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 変換して&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;repList&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;padNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;maxDigit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ソートして出力する&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;repList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;padNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;digit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="o"&gt;+/&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;padLeft&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;digit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sc"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;最大桁数を求める部分&lt;/strong&gt;を記述して気づいたけど、こういうコード記述する機会は決して少なくはないと思う。&lt;/p&gt;&#10;&lt;p&gt;文字列の配列から特定のパターンの文字列のみを取り出したい場合は、こんな記述もできるということを始めて知った未熟者。&lt;/p&gt;&#10;&lt;p&gt;javascriptなら、**&amp;quot;  文字列 &amp;ldquo;.replace(/^ *| *$/g, &amp;ldquo;&amp;rdquo;)**みたいにしてtrimするコード書くことよくありますね。&lt;/p&gt;&#10;&lt;h4 id="追記20090127"&gt;追記：2009/01/27&lt;/h4&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/fumokmm/20090120/1232465055"&gt;fumokmm&lt;/a&gt;さんが、以下のような方法も教えてくれました。(MessageFormatを利用する例)&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MessageFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;maxDigit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;MessageFormatっていうクラスあるんですね（恥&lt;/em&gt;&lt;/p&gt;</description></item><item><title>社会人バドミントン大会で初めて３位</title><link>https://genzouw.com/entry/2009/01/26/094700/400/</link><pubDate>Mon, 26 Jan 2009 09:47:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/26/094700/400/</guid><description>&lt;p&gt;日曜日、&lt;strong&gt;バドミントン&lt;/strong&gt;の試合に出場してきた。&lt;/p&gt;&#10;&lt;p&gt;金曜、土曜と試合前の調整をしたがあまり調子がよくなく、不安があった。日曜日はまずまずの調子で、社会人の大会で初めて予選を通ることができ、準決勝へ。けれども&lt;strong&gt;東南アジア系のダブルスペア&lt;/strong&gt;に負けてしまった。勝てなくもない試合だったのになぁ。&lt;/p&gt;&#10;&lt;p&gt;結局そこのベアが優勝し、僕らは&lt;strong&gt;３位&lt;/strong&gt;という結果に終わった。でも社会人の大会で初めて３位をとり、賞状までいただいたのでうれしかった。&lt;/p&gt;&#10;&lt;p&gt;嫁も喜んでくれたし。&lt;em&gt;&lt;span style="font-size: larger;"&gt;丸一日外で遊んできててごめんね&lt;/span&gt;&lt;/em&gt;。&lt;/p&gt;</description></item><item><title>なくした財布が・・・</title><link>https://genzouw.com/entry/2009/01/21/113700/401/</link><pubDate>Wed, 21 Jan 2009 11:37:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/21/113700/401/</guid><description>&lt;p&gt;先週末に財布をなくした件の続き。&lt;/p&gt;&#10;&lt;p&gt;昨日仕事中に、突然覚えのない電話番号から電話。&lt;/p&gt;&#10;&lt;p&gt;電話に出てみると、天王寺警察署からだった。まさかと思ったが、どうやら財布が見つかったとのこと。&lt;/p&gt;&#10;&lt;p&gt;「よかったー、免許証や保険証の再発行だけでも5000円近く費用が浮くからなーお金なくてもよかった」と思っていたのですが、&lt;strong&gt;金品は一切盗まれていないということだった。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;どうしても届けてくれた方にお礼をしたいと告げたのですが、&lt;strong&gt;拾ってくださった方が匿名でお願いしたい&lt;/strong&gt;ということのよう。&lt;/p&gt;&#10;&lt;p&gt;嫁にとりにいってきてもらい、中身を見たのですが本当になにも盗られていない。なんか歳をとるにしたがって考え方が汚くなってきたのかなと思った。自分、当たり前のことができなくなっているんじゃないのかな。&lt;/p&gt;&#10;&lt;p&gt;いただいた恩を自分も同じように返したいと思った。&lt;/p&gt;</description></item><item><title>Help Balloons PluginでGUIにヘルプ機能を追加</title><link>https://genzouw.com/entry/2009/01/20/130000/402/</link><pubDate>Tue, 20 Jan 2009 13:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/20/130000/402/</guid><description>&lt;p&gt;&lt;a href="http://www.grails.org/HelpBalloons+Plugin"&gt;HelpBalloons Plugin&lt;/a&gt;というプラグインを使用して、画面の操作に関するヘルプ機能を追加できるようです。いつものように早速試してみる。&lt;/p&gt;&#10;&lt;h4 id="料理名"&gt;料理名&lt;/h4&gt;&#10;&lt;p&gt;&lt;a href="http://www.grails.org/HelpBalloons+Plugin"&gt;HelpBalloons Plugin&lt;/a&gt;&lt;/p&gt;&#10;&lt;h4 id="材料"&gt;材料&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;grails&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="作り方"&gt;作り方&lt;/h4&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;プロジェクトを作成する**（省略！）**&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://www.grails.org/HelpBalloons+Plugin"&gt;HelpBalloons Plugin&lt;/a&gt;をインストールする&lt;/li&gt;&#10;&lt;li&gt;適当な画面を作成**（省略！）**&lt;/li&gt;&#10;&lt;li&gt;gspに、 &lt;a href="http://www.grails.org/HelpBalloons+Plugin"&gt;HelpBalloons Plugin&lt;/a&gt;を組み込む&lt;/li&gt;&#10;&lt;li&gt;起動！&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h4 id="手順２"&gt;手順２&lt;/h4&gt;&#10;&lt;p&gt;&lt;span style="color: teal;"&gt;&lt;strong&gt;grails install-plugin help-balloons&lt;/strong&gt;&lt;/span&gt;を実行する。&lt;/p&gt;&#10;&lt;h4 id="手順４"&gt;手順４&lt;/h4&gt;&#10;&lt;p&gt;gspの&lt;strong&gt;ヘッダータグ&lt;/strong&gt;内に、以下の内容を追記する。（help ballooonsを使用する際のおまじない）&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&amp;lt;g:helpBalloons/&amp;gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;バルーンを表示したい箇所に、以下のようにタグを記述する。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;&amp;lt;g:helpBalloon title=&amp;ldquo;こんにちわ&amp;rdquo; content=&amp;ldquo;てすとですよ&amp;rdquo;/&amp;gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color: teal;"&gt; &lt;/span&gt; 文字通り、title属性はバルーンのタイトル（ウィンドウタイトルみたいなもの）、content属性は本文部分の内容をそれぞれ記述する。&lt;/p&gt;&#10;&lt;h4 id="手順５"&gt;手順５&lt;/h4&gt;&#10;&lt;p&gt;表示。 ここではタイトル部分（&lt;strong&gt;todo&lt;/strong&gt;）の右側に&lt;span style="color: rgb(153, 51, 0);"&gt;&lt;strong&gt;&amp;lt;g:helpBalloon title=&amp;ldquo;こんにちわ&amp;rdquo; content=&amp;ldquo;てすとですよ&amp;rdquo;/&amp;gt;&lt;/strong&gt;&lt;/span&gt;を記述してみた例。&lt;/p&gt;&#10;&lt;div style="clear: both; text-align: center;"&gt;&#10;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_c1sAJym_hc4/SXVQT9p5SwI/AAAAAAAAAUw/SGVKBxW7Hek/s1600-h/00000.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://4.bp.blogspot.com/_c1sAJym_hc4/SXVQT9p5SwI/AAAAAAAAAUw/SGVKBxW7Hek/s320/00000.png" data-border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div style="clear: both; text-align: center;"&gt;&#10;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_c1sAJym_hc4/SXVQZJMbIxI/AAAAAAAAAU4/CLe4GJjRBgA/s1600-h/00001.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://3.bp.blogspot.com/_c1sAJym_hc4/SXVQZJMbIxI/AAAAAAAAAU4/CLe4GJjRBgA/s320/00001.png" data-border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;div style="clear: both; text-align: center;"&gt;&#10;&lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_c1sAJym_hc4/SXVQdURX6fI/AAAAAAAAAVA/DYQTTYAKUs8/s1600-h/00002.png" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://4.bp.blogspot.com/_c1sAJym_hc4/SXVQdURX6fI/AAAAAAAAAVA/DYQTTYAKUs8/s320/00002.png" data-border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;なんだかかっこいい！！ちょっとかっこいいサイトっぽくみえる！よりわかりやすいGUIとしていいかもしれません。&lt;/p&gt;</description></item><item><title>財布をなくしてゆかいなゲンゾウさん</title><link>https://genzouw.com/entry/2009/01/20/100400/403/</link><pubDate>Tue, 20 Jan 2009 10:04:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/20/100400/403/</guid><description>&lt;p&gt;先週金曜日に財布をなくしてしまった。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;結婚前&lt;/li&gt;&#10;&lt;li&gt;長女誕生前&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;は毎週２回はバドミントンをしていたのですが、家事・子育てをする必要があり*（もっともどちらも嫁にまかせきりですがｗ）*あまり参加できずにいた。&lt;/p&gt;&#10;&lt;p&gt;それでも嫁にわがままをいい、週一回程度は参加するようにしていました。&lt;/p&gt;&#10;&lt;p&gt;球技は視力低下にとてもいいうえに、運動するとその週の仕事が不思議とはかどります（血流よくなるからかな）。&lt;/p&gt;&#10;&lt;p&gt;先週土曜日もバドミントンをしに行ってきたのですが、あまりに楽しみで心が浮ついていたのだろう。自転車をこいでいる間に財布をおとしてしまった。&lt;/p&gt;&#10;&lt;p&gt;気づいたのは次の日の夜20:00ぐらい。「あれ？いつもの場所に財布がない？？」&lt;/p&gt;&#10;&lt;h4 id="意外と面倒なクレジットカード停止手続き"&gt;意外と面倒なクレジットカード停止手続き&lt;/h4&gt;&#10;&lt;p&gt;今回財布をなくして初めて知ったが、クレジットカード停止手続きは非常にめんどくさい。&lt;/p&gt;&#10;&lt;p&gt;自分が持っているクレジットカードの会社がわからなかったため、手当たり次第にクレジットカード会社に電話して、登録がないかを確認し、停止した。&lt;/p&gt;&#10;&lt;p&gt;８会社ぐらい電話したと思う。自分の持っているクレジットカードの会社ぐらい把握しておかなければならないと思った。&lt;/p&gt;</description></item><item><title>Grails ModalBox Pluginでモーダルなウィンドウを表示</title><link>https://genzouw.com/entry/2009/01/16/070500/404/</link><pubDate>Fri, 16 Jan 2009 07:05:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/16/070500/404/</guid><description>&lt;h2 id="今回の料理名"&gt;今回の料理名&lt;/h2&gt;&#10;&lt;p&gt;モーダルなウィンドウ&lt;/p&gt;&#10;&lt;h2 id="材料"&gt;材料&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Grails&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="作り方"&gt;作り方&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;プロジェクトを作成する&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://www.grails.org/ModalBox+Plugin"&gt;ModalBox Plugin&lt;/a&gt; をインストールする&lt;/li&gt;&#10;&lt;li&gt;Domainクラス作成&lt;/li&gt;&#10;&lt;li&gt;適当な画面を作成&lt;/li&gt;&#10;&lt;li&gt;gspに、 &lt;a href="http://www.grails.org/ModalBox+Plugin"&gt;ModalBox Plugin&lt;/a&gt; を組み込む&lt;/li&gt;&#10;&lt;li&gt;起動！&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="手順１"&gt;手順１&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;grails create-app gstudy&lt;/code&gt;を作成してみました。&lt;/p&gt;&#10;&lt;h2 id="手順２"&gt;手順２&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;grails install-plugin modalbox&lt;/code&gt;を実行する。&lt;/p&gt;&#10;&lt;h2 id="手順３"&gt;手順３&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;grails create-domain-class entry&lt;/code&gt;でドメイン作成。以下のようなソースを記述&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Entry&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; static hasMany = [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; static belongsTo = [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Date&lt;/span&gt; &lt;span class="n"&gt;dateCreated&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Date&lt;/span&gt; &lt;span class="n"&gt;lastUpdated&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;constraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;size:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dateCreated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;editable:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lastUpdated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;editable:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// for select-box, link etc..&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; String toString(){&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="手順４"&gt;手順４&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;grails generate-all entry&lt;/code&gt;を実行する。&lt;/p&gt;</description></item><item><title>ブログアプリをつくろう（しかし `syntax-highlighter` がインストールできず）</title><link>https://genzouw.com/entry/2009/01/15/075600/405/</link><pubDate>Thu, 15 Jan 2009 07:56:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/15/075600/405/</guid><description>&lt;p&gt;ということで、久しぶりにGrailsを使って何かを作ってみる。&#10;ブログアプリを作ってみることにする。&lt;/p&gt;&#10;&lt;h2 id="まずはプラグインインストールしかし"&gt;まずはプラグインインストール、しかし&lt;/h2&gt;&#10;&lt;p&gt;今までエントリにも書いた&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;richui&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;syntax-highlighter&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;i18n-template&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;を&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;grails install-plugin 〜&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;でインストール、で問題ないはずが、 &lt;code&gt;syntax-highlighter&lt;/code&gt; だけインストールが失敗。&#10;最新版が &lt;strong&gt;0.1.2&lt;/strong&gt; だが、 &lt;strong&gt;0.1.1&lt;/strong&gt; のフォルダがないと起こられてしまう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Reading &lt;span class="o"&gt;[&lt;/span&gt;triggers&lt;span class="o"&gt;]&lt;/span&gt; plug-in info ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;mkdir&lt;span class="o"&gt;]&lt;/span&gt; Created dir: /home/genzou/.grails/1.0.4/plugins/syntax-highlighter&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;get&lt;span class="o"&gt;]&lt;/span&gt; Getting:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;http://plugins.grails.org/grails-syntax-highlighter/tags/RELEASE_0_1_2/grails-syntax-highlighter-0.1.2.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;get&lt;span class="o"&gt;]&lt;/span&gt; To:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/genzou/.grails/1.0.4/plugins/syntax-highlighter/grails-syntax-highlighter-0.1.2.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...............&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;copy&lt;span class="o"&gt;]&lt;/span&gt; Copying &lt;span class="m"&gt;1&lt;/span&gt; file to&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/genzou/20_developments/scripts/grails/giki/plugins&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;mkdir&lt;span class="o"&gt;]&lt;/span&gt; Created dir:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/genzou/20_developments/scripts/grails/giki/plugins/syntax-highlighter-0.1.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;unzip&lt;span class="o"&gt;]&lt;/span&gt; Expanding:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/genzou/20_developments/scripts/grails/giki/plugins/grails-syntax-highlighter-0.1.2.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;into /home/genzou/20_developments/scripts/grails/giki/plugins/syntax-highlighter-0.1.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Compiling plugin syntax-highlighter-0.1.2 ... ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;groovyc&lt;span class="o"&gt;]&lt;/span&gt; Compiling &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; file to&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/genzou/.grails/1.0.4/projects/giki/classes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;mkdir&lt;span class="o"&gt;]&lt;/span&gt; Created dir:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/genzou/20_developments/scripts/grails/giki/web-app/plugins/syntax-highlighter-0.1.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;copy&lt;span class="o"&gt;]&lt;/span&gt; Copying &lt;span class="m"&gt;16&lt;/span&gt; files to&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/genzou/20_developments/scripts/grails/giki/web-app/plugins/syntax-highlighter-0.1.2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Loading with installed plug-ins: &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;syntaxHighlighter&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;developmentUtilities&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;richui&amp;#34;&lt;/span&gt;, &lt;span class="s2"&gt;&amp;#34;i18nTemplates&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Executing syntax-highlighter-0.1.2 plugin post-install script ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;mkdir&lt;span class="o"&gt;]&lt;/span&gt; Created dir:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/genzou/20_developments/scripts/grails/giki/web-app/js/syntaxhighlighter&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/home/genzou/20_developments/scripts/grails/giki/web-app/plugins/syntax-highlighter-0.1.1/js/syntaxhighlighter&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;not found.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;: /home/genzou/20_developments/scripts/grails/giki/web-app/plugins/syntax-highlighter-0.1.1/js/syntaxhighlighter&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;not found.&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.apache.tools.ant.types.AbstractFileSet.getDirectoryScanner&lt;span class="o"&gt;(&lt;/span&gt;AbstractFileSet.java:422&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.apache.tools.ant.taskdefs.Copy.execute&lt;span class="o"&gt;(&lt;/span&gt;Copy.java:453&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.apache.tools.ant.UnknownElement.execute&lt;span class="o"&gt;(&lt;/span&gt;UnknownElement.java:288&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.apache.tools.ant.dispatch.DispatchUtils.execute&lt;span class="o"&gt;(&lt;/span&gt;DispatchUtils.java:105&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.apache.tools.ant.Task.perform&lt;span class="o"&gt;(&lt;/span&gt;Task.java:348&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.apache.tools.ant.taskdefs.Sequential.execute&lt;span class="o"&gt;(&lt;/span&gt;Sequential.java:62&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.apache.tools.ant.dispatch.DispatchUtils.execute&lt;span class="o"&gt;(&lt;/span&gt;DispatchUtils.java:105&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.apache.tools.ant.Task.perform&lt;span class="o"&gt;(&lt;/span&gt;Task.java:348&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.util.AntBuilder.nodeCompleted&lt;span class="o"&gt;(&lt;/span&gt;AntBuilder.java:199&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.util.BuilderSupport.doInvokeMethod&lt;span class="o"&gt;(&lt;/span&gt;BuilderSupport.java:153&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.util.AntBuilder.doInvokeMethod&lt;span class="o"&gt;(&lt;/span&gt;AntBuilder.java:149&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.util.BuilderSupport.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;BuilderSupport.java:64&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.gant.GantBuilder.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;GantBuilder.java:52&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:784&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:758&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:170&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at Script1.run&lt;span class="o"&gt;(&lt;/span&gt;Script1.groovy:18&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.GroovyShell.evaluate&lt;span class="o"&gt;(&lt;/span&gt;GroovyShell.java:543&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.GroovyShell.evaluate&lt;span class="o"&gt;(&lt;/span&gt;GroovyShell.java:518&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:756&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:778&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:758&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:170&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.gant.IncludeTargets.leftShift&lt;span class="o"&gt;(&lt;/span&gt;IncludeTargets.groovy:49&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:756&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:778&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:758&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:170&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at InstallPlugin_groovy&lt;span class="nv"&gt;$_run_closure3&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;InstallPlugin_groovy:189&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:756&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.DelegatingMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMetaClass.java:142&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.gant.GantMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;GantMetaClass.java:79&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.gant.GantMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;GantMetaClass.java:94&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrentN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:78&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at InstallPlugin_groovy&lt;span class="nv"&gt;$_run_closure3&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;InstallPlugin_groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:756&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.DelegatingMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMetaClass.java:142&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.gant.GantMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;GantMetaClass.java:79&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.Closure.call&lt;span class="o"&gt;(&lt;/span&gt;Closure.java:292&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.Script.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;Script.java:87&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethodOnGroovyObject&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:947&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:894&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:756&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.DelegatingMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMetaClass.java:142&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.gant.GantMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;GantMetaClass.java:79&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.gant.GantMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;GantMetaClass.java:94&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrentN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:78&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrent0&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:112&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at InstallPlugin_groovy&lt;span class="nv"&gt;$_run_closure1&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;InstallPlugin_groovy:50&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:756&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.DelegatingMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMetaClass.java:142&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.gant.GantMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;GantMetaClass.java:79&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.gant.GantMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;GantMetaClass.java:94&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrentN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:78&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at InstallPlugin_groovy&lt;span class="nv"&gt;$_run_closure1&lt;/span&gt;.doCall&lt;span class="o"&gt;(&lt;/span&gt;InstallPlugin_groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:756&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.DelegatingMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMetaClass.java:142&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.gant.GantMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;GantMetaClass.java:79&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.Closure.call&lt;span class="o"&gt;(&lt;/span&gt;Closure.java:292&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.Closure.call&lt;span class="o"&gt;(&lt;/span&gt;Closure.java:287&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.Closure.run&lt;span class="o"&gt;(&lt;/span&gt;Closure.java:368&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:756&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.DelegatingMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMetaClass.java:142&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.gant.GantMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;GantMetaClass.java:79&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:778&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:758&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:170&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethod0&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:198&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at gant.Gant.dispatch&lt;span class="o"&gt;(&lt;/span&gt;Gant.groovy:271&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at gant.Gant.this&lt;span class="nv"&gt;$2$dispatch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;Gant.groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:756&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:674&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.GeneratedMethodAccessor7.invoke&lt;span class="o"&gt;(&lt;/span&gt;Unknown Source&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:756&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:778&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:758&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:170&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at gant.Gant.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;Gant.groovy&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrentN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:78&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at gant.Gant.processTargets&lt;span class="o"&gt;(&lt;/span&gt;Gant.groovy:436&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnCurrentN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:78&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at gant.Gant.processArgs&lt;span class="o"&gt;(&lt;/span&gt;Gant.groovy:372&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:912&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:946&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:756&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokePogoMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:778&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokeMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:758&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:170&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.grails.cli.GrailsScriptRunner.callPluginOrGrailsScript&lt;span class="o"&gt;(&lt;/span&gt;GrailsScriptRunner.groovy:261&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.reflection.CachedMethod.invoke&lt;span class="o"&gt;(&lt;/span&gt;CachedMethod.java:86&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaMethod.doMethodInvoke&lt;span class="o"&gt;(&lt;/span&gt;MetaMethod.java:230&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.MetaClassImpl.invokeStaticMethod&lt;span class="o"&gt;(&lt;/span&gt;MetaClassImpl.java:1105&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at groovy.lang.ExpandoMetaClass.invokeStaticMethod&lt;span class="o"&gt;(&lt;/span&gt;ExpandoMetaClass.java:957&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.InvokerHelper.invokeStaticMethod&lt;span class="o"&gt;(&lt;/span&gt;InvokerHelper.java:804&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeStaticMethodN&lt;span class="o"&gt;(&lt;/span&gt;ScriptBytecodeAdapter.java:215&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.grails.cli.GrailsScriptRunner.main&lt;span class="o"&gt;(&lt;/span&gt;GrailsScriptRunner.groovy:121&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke0&lt;span class="o"&gt;(&lt;/span&gt;Native Method&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.NativeMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;NativeMethodAccessorImpl.java:39&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at sun.reflect.DelegatingMethodAccessorImpl.invoke&lt;span class="o"&gt;(&lt;/span&gt;DelegatingMethodAccessorImpl.java:25&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at java.lang.reflect.Method.invoke&lt;span class="o"&gt;(&lt;/span&gt;Method.java:597&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.grails.cli.support.GrailsStarter.rootLoader&lt;span class="o"&gt;(&lt;/span&gt;GrailsStarter.java:193&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at org.codehaus.groovy.grails.cli.support.GrailsStarter.main&lt;span class="o"&gt;(&lt;/span&gt;GrailsStarter.java:218&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;------------------------------------------------------------------&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;web-app/plugins/syntax-hihlighter-0.1.1&lt;/code&gt; 以下に &lt;code&gt;css/syntaxhighlighter&lt;/code&gt; 、&lt;code&gt;js/syntaxhighlighter&lt;/code&gt; というフォルダを作成したらインストールは成功した。&lt;/p&gt;</description></item><item><title>HTTPBuilderを使ってみる</title><link>https://genzouw.com/entry/2009/01/10/121400/406/</link><pubDate>Sat, 10 Jan 2009 12:14:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/10/121400/406/</guid><description>&lt;p&gt;uehajさんのところでHTTPBuilderのエントリを見てから、ずっとHTTPBuilder使ってみたいと思っていたのですが、ようやく試すことができました。&lt;/p&gt;&#10;&lt;p&gt;同じGroovyであるGrails＋Acegiプラグインで作成したサイトにログインできるかどうか試してみることにします。&lt;/p&gt;&#10;&lt;p&gt;早速環境構築。&lt;/p&gt;&#10;&lt;h2 id="入手"&gt;入手&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://groovy.codehaus.org/modules/http-builder/download.html"&gt;HTTP Builder - Download&lt;/a&gt; より、以下のファイルをダウンロード。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;http-builder-0.3.0-all.zip&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="環境構築"&gt;環境構築&lt;/h2&gt;&#10;&lt;p&gt;ダウンロード後、上記ファイルを解凍する。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;target&lt;/code&gt; フォルダに含まれている以下のファイルを、 &lt;code&gt;${USER_HOME}/.groovy/lib&lt;/code&gt; フォルダに配置する。&lt;/p&gt;&#10;&lt;p&gt;（&lt;code&gt;${USER_HOME}&lt;/code&gt; は、Windowsの場合には &lt;code&gt;C:\Documents And Settings\${ユーザー名}&lt;/code&gt; ）&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;http-builder-0.3.0.jar&lt;/li&gt;&#10;&lt;li&gt;dependenciesフォルダ内のすべてのjarファイル&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="実行"&gt;実行&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;groovyx.net.http.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;groovyx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Method&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;GET&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;static&lt;/span&gt; &lt;span class="n"&gt;groovyx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;net&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ContentType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TEXT&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test-server.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;appName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;grails-test&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test-user&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;test-password&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HTTPBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://${host}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;post&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/${appName}/j_spring_security_check&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;contentType:&lt;/span&gt; &lt;span class="n"&gt;TEXT&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;params:&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nl"&gt;j_username:&lt;/span&gt; &lt;span class="n"&gt;username&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;j_password:&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;response status: ${resp.statusLine}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Response data: -----&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;n--------------------&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;path:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/${appName}/item/index&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;contentType:&lt;/span&gt; &lt;span class="n"&gt;TEXT&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;response status: ${resp.statusLine}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Response data: -----&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;n--------------------&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ここでは、&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;サーバー名：&lt;code&gt;test-server.com&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;Grailsアプリ名：&lt;code&gt;grails-test&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;ユーザー名：&lt;code&gt;test-user&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;パスワード：&lt;code&gt;test-password&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;として、環境を作成したWEBアプリにログインしてみた。&lt;/p&gt;&#10;&lt;p&gt;GrailsにAcegiプラグインを入れた場合、ユーザー名(j_username)、パスワード(j_password)を入力し &lt;code&gt;http://test-server.com/grails-test/j_spring_security_check&lt;/code&gt; にPOSTするとログインできます。&lt;/p&gt;&#10;&lt;p&gt;ログインして、その後にアプリの別ページの情報が表示できるか試してみたところ、ちゃんと表示できました。&lt;/p&gt;&#10;&lt;p&gt;スクリプトの処理中は、ログイン後のセッション情報がちゃんと残るみたいですね。&lt;/p&gt;</description></item><item><title>セットアップしなくてもちょちょいとGroovy動かしたい方は</title><link>https://genzouw.com/entry/2009/01/08/235900/407/</link><pubDate>Thu, 08 Jan 2009 23:59:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/08/235900/407/</guid><description>&lt;p&gt;&lt;a href="http://programamemo2.blogspot.com/"&gt;プログラマメモ2&lt;/a&gt;こちらのブログのサイト右上にある機能が素敵。&lt;/p&gt;&#10;&lt;p&gt;始めて見たときに「この手があった」と思いました。やろうと思ってたら、すでにやっている方いました。&lt;/p&gt;&#10;&lt;p&gt;Java Web Startが実行可能ならどのマシンでも動くはず。&lt;/p&gt;&#10;&lt;p&gt;ちょっとGroovy試してみたい人によいですね。&lt;/p&gt;</description></item><item><title>道順を数えるどう書く？org ２番煎じ</title><link>https://genzouw.com/entry/2009/01/08/125800/408/</link><pubDate>Thu, 08 Jan 2009 12:58:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/08/125800/408/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/fumokmm/20090104/1231049099"&gt;Re:道順を数える - No Programming, No Life&lt;/a&gt;を見て、僕もこの問題を解いてみた。&lt;/p&gt;&#10;&lt;p&gt;・・・で、早速挫折。文字列ではあるけれど、図形の解析、難しいですね。&lt;/p&gt;&#10;&lt;p&gt;問題文に「パターン数が分かれば、データ構造は何でもいいよ」とあるので木構造でといてみました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;3&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LEFT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DOWN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="na"&gt;times&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;LEFT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DOWN&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;combinations&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEFT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEFT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DOWN&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;3&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEFT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LEFT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;0&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="na"&gt;3&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LEFT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;4&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;LEFT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでいいのだ。&lt;/p&gt;</description></item><item><title>勝手にGroovy関連サイトをピックアップして載せてみた</title><link>https://genzouw.com/entry/2009/01/08/074900/409/</link><pubDate>Thu, 08 Jan 2009 07:49:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/08/074900/409/</guid><description>&lt;p&gt;許可もとらず、勝手にGroovy関連の記事が多くかかれているなぁと思ったサイトをピックアップして、右側のコンテンツエリアに載せてみた。&lt;/p&gt;&#10;&lt;p&gt;他にも見つけていったら増やしていこう。&lt;/p&gt;</description></item><item><title>SwingPadを試してみる</title><link>https://genzouw.com/entry/2009/01/08/071600/410/</link><pubDate>Thu, 08 Jan 2009 07:16:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/08/071600/410/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/masanobuimai/20081226#1230295348"&gt;■[groovy] SwingPadで遊ぶ-2008-12-26 - marsのメモ&lt;/a&gt;を見て、これはGroovyでGUIプログラムを組むのに最適と思い、インストールしてみた。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://www.jroller.com/aalmiray/entry/swingpad_0_1"&gt;Andres Almiray&amp;rsquo;s Weblog : Weblog&lt;/a&gt;からdownloadのリンクをクリックすると&lt;strong&gt;SwingPad-0.1-installer.jar&lt;/strong&gt;をダウンロードできた。これをダブルクリックするとインストール開始。&lt;/p&gt;&#10;&lt;p&gt;僕の家のPCはubuntuマシンだが、インストールは問題なく完了。&lt;/p&gt;&#10;&lt;h4 id="実行"&gt;実行！&lt;/h4&gt;&#10;&lt;p&gt;&lt;strong&gt;SWINGPAD_HOME&lt;/strong&gt;がインストールされたフォルダとする。&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;$SWINGPAD_HOME/bin/SwingPad&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;をコマンドから実行してみたが、どうやらうまくいかない。&lt;/p&gt;&#10;&lt;p&gt;引数で実行中のスクリプトのパスを渡すようになっている（のかな？）ので、&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;$SWINGPAD_HOME/bin/SwingPad&lt;/strong&gt;&lt;/span&gt; &lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;$SWINGPAD_HOME/bin/SwingPad&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;を実行してみたけどやっぱりダメ。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;startApp&lt;/strong&gt;というコマンドを実行するだけぽいので、&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;strong&gt;$SWINGPAD_HOME/bin/startApp&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;を実行してみてもやはりだめ。&lt;/p&gt;&#10;&lt;p&gt;今はWindows限定なのかな。諦めます…。&lt;/p&gt;</description></item><item><title>ubuntuでgroovyにてAntBuilderが使えなくて一瞬焦った</title><link>https://genzouw.com/entry/2009/01/07/074700/411/</link><pubDate>Wed, 07 Jan 2009 07:47:00 +0900</pubDate><guid>https://genzouw.com/entry/2009/01/07/074700/411/</guid><description>&lt;p&gt;あけましておめでとうございます。年末からブログを書かず、結局2週間以上あいてしまいました。気持ちを引き締めてまたネタを書きたい。&lt;/p&gt;&#10;&lt;p&gt;４ヶ月前にubuntuをインストールしてから、職場以外では一切windousマシンを使用していません。本当にubuntuはすごい。windowsに十分取ってかわることができます。&lt;/p&gt;&#10;&lt;p&gt;groovyのインストールも簡単で、ダウンロードの作業なども必要なくただコンソールから&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;em&gt;&lt;strong&gt;sudo apt-get install groovy&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;と打ち込むだけという手軽さは、職場のwindowsマシンにも欲しい。アップデートされたら知らせてくれるのも便利。&lt;/p&gt;&#10;&lt;p&gt;話はかわり、&lt;strong&gt;groovy&lt;/strong&gt;のzipファイルをダウンロードして解答し、パスを通した場合では動くgroovyスクリプトも、上記の方法でインストールした場合には正常に動作しない場合がありました。特に&lt;strong&gt;AntBuilder&lt;/strong&gt;を使用したスクリプト。&lt;/p&gt;&#10;&lt;p&gt;原因は単純で、上記の方法でインストールした場合にはantははインストールされないから。以下のコマンドを実行するだけで解決。&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;&lt;em&gt;&lt;strong&gt;sudo apt-get install ant&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&#10;&lt;p&gt;apt-getにてインストールした場合には、関連するライブラリが用意されていない可能性を考えないといけない。&lt;/p&gt;</description></item><item><title>ひさびさの日記更新</title><link>https://genzouw.com/entry/2008/12/26/080100/412/</link><pubDate>Fri, 26 Dec 2008 08:01:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/26/080100/412/</guid><description>&lt;p&gt;ひさしぶりの日記更新です。&lt;/p&gt;&#10;&lt;p&gt;仕事やプライベートでGroovy、Grailsを使い、ツールを作成しているのですが、仕事に直結するものはさすがに載せられないし、年末ということでばたばたしており、全然更新できていません。&lt;/p&gt;&#10;&lt;p&gt;今日も技術ネタは書けず…&lt;/p&gt;&#10;&lt;p&gt;話はかわり。昔からMr.childrenが大好きでしたが、最近新しいアルバムがでて、以下の曲がお気に入り。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://music.goo.ne.jp/lyric/LYRUTND72819/index.html"&gt;終末のコンフィデンスソング&lt;/a&gt; - Mr.Children&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;strong&gt;街中にゴシップが散撒かれてる&lt;br&gt;&#10;面白がって誰もがそれに火をつける&lt;br&gt;&#10;自分より劣ってる　マヌケをあぶりだし&lt;br&gt;&#10;ホッと胸撫で下ろしてる&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;最近謙虚さを忘れているなと反省。嫌な先輩にされていたことを気がつくと後輩にしてしまっている気がする。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;strong&gt;すごく欲しかった物から　そうでもないモンまで&lt;br&gt;&#10;クリック　ドラッグ　R&amp;amp;R　何だって手に入る&lt;br&gt;&#10;さぁ　油断して渡ろう　慢心して進もう&lt;br&gt;&#10;文明の恩恵の上を&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;&#10;&lt;em&gt;&lt;strong&gt;たまに不吉な夢見るんだよ&lt;br&gt;&#10;走っているのに進まない&lt;br&gt;&#10;ひょっとしたら実際に起きてることを夢の中で知らせるメタファーかも&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;仕事しててもふと思ってしまうことある。必死で勉強して、それで何の意味があるのかな、なんて。&lt;/p&gt;&#10;&lt;p&gt;ちょっとマイナス思考ぎみかな。気を取り直して今年最後の仕事に望むぞ！&lt;/p&gt;</description></item><item><title>Groovyで、テーブル一覧、テーブル定義をHTML出力してみる２</title><link>https://genzouw.com/entry/2008/12/20/223300/413/</link><pubDate>Sat, 20 Dec 2008 22:33:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/20/223300/413/</guid><description>&lt;p&gt;前回作成した &lt;a href="https://genzouw.com/entry/2008/12/19/091000"&gt;Groovyで、テーブル一覧、テーブル定義をHTML出力してみる&lt;/a&gt; の改良版。&lt;/p&gt;&#10;&lt;p&gt;もう少しテーブル定義を見やすくしてみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;左側にテーブル一覧が表示される&lt;/li&gt;&#10;&lt;li&gt;右側にテーブル定義が表示される&lt;/li&gt;&#10;&lt;li&gt;テーブル一覧、テーブル定義それぞれ日本語名称を表示できる&lt;/li&gt;&#10;&lt;li&gt;簡単なSelect SQLを作ってくれる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ソースは以下のとおり。&lt;/p&gt;&#10;&lt;h2 id="markupbuilder拡張クラス"&gt;MarkupBuilder拡張クラス&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * @author genzou&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;XhtmlBuilder&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MarkupBuilder&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;charset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;UTF8&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;lang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ja&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;cssList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;style.css&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;XhtmlBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;super&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keySet&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$it&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$it&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;closure&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;print&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;n&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;print&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;n&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;lang:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${this.lang}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;xml:lang&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${this.lang}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http-equiv&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;content:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text/html;charset=${this.charset}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http-equiv&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Content-Style-Type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;content:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text/css;charset=${this.charset}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${this.title}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cssList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;rel:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;href:&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="n"&gt;closure&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="日本語名称マッパークラス"&gt;日本語名称マッパークラス&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * @author genzou&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Mapper&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// テーブルID（大文字）と日本語名称の対応を記述（IDがキー）&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;tables&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[:]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// カラムID（大文字）と日本語名称の対応を記述（IDがキー）&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[:]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="メイン処理"&gt;メイン処理&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ゆーざーめい！&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;password:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ぱすわーど！&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Properties&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;JDBCのURL!&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;てきとうなどらいば！&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;entities&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;file&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mkdirs&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;gsql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gsql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;url&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getColumns&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toRowResult&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;entities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groupBy&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TABLE_NAME&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;!(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="s"&gt;/.*BIN$.*/&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;entities&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 出力処理&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$dir/index.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;withWriter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;UTF8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;XhtmlBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;テーブル定義&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;class:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;class:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;テーブル一覧&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ＩＤ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;名称&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;entities&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keySet&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;tableName&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;odd&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;href:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${tableName}.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tableName&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="n"&gt;Mapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tables&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tableName&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;class:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;entities&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$dir/${entity.key}.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;withWriter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;UTF8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;XhtmlBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;title:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;テーブル定義 - ${entity.key}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;class:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;container&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;class:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;left&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;h2&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;テーブル一覧&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ＩＤ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;名称&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;entities&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keySet&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;tableName&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;odd&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;href:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${tableName}.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tableName&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="n"&gt;Mapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tables&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tableName&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;div&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;class:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;h1&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;テーブル定義&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;h2&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ＩＤ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${entity.key}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;h2&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;名称&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${Mapper.tables[entity.key]}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;h2&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;カラム情報&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ＩＤ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;名称&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;型&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;サイズ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;NOT NULL&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;odd&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;COLUMN_NAME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;td&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;COLUMN_NAME&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TYPE_NAME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;td&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;class:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;num&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;COLUMN_SIZE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IS_NULLABLE&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;h2&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;sql&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; SELECT&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; FROM&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; ${entity.key}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;-- WHERE&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;n-- &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;COLUMN_NAME&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; = &amp;#39;&amp;#39; &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AND&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;textarea&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gsql&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$dir/style.css&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;div.container&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; width:99%;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;h2&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; border:2px solid gray;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; border-left:10px solid gray;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; padding-left:20px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;body&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; background-color:#fbfbfb;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;div.left&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; float:left;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; width:30%;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; border-right:2px double gray;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; padding-right:0;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; margin-right:5px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; height:800px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; overflow:scroll;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;div.left table&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; font-size:75%;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;div.right&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; width: 65%;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; float:left;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;div.right p&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; padding-left:40px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;div.left td&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; word-break:break-all;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; word-wrap:break-word;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;div.right th,div.right td&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; white-space:nowrap;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;table&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; width:90%;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; border:2px solid gray;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; border-collapse:collapse;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; margin:1px auto;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;tr th&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; background:#d7dbff;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;th,td&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; border-bottom:1px solid #c5cfc8;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; border-left:1px solid #e5eff8;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; padding:1px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;tr.odd td&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; background:#f7fbe0;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;textarea{&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; width: 450px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; height:200px;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;} &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;UTF8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結構長くなってしまった。&lt;/p&gt;</description></item><item><title>Groovyで、テーブル一覧、テーブル定義をHTML出力してみる</title><link>https://genzouw.com/entry/2008/12/19/091000/414/</link><pubDate>Fri, 19 Dec 2008 09:10:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/19/091000/414/</guid><description>&lt;p&gt;最近参入したプロジェクトでテーブル定義がない（！？）ため、さっと作ってみました。&lt;/p&gt;&#10;&lt;p&gt;出力された内容はまだ見にくいし、Not Null 制約の出力結果がなんだか怪しいけど、ないよりましでしょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;groovy.sql.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.sql.ResultSet&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;user:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;てきとうに&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;password:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;にゅうりょく&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Properties&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;してね&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;driver&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;oracle.jdbc.driver.OracleDriver&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;outputEacchRow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;closure&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&amp;lt;!DOCTYPE html PUBLIC &amp;#34;-//W3C//DTD XHTML 1.0 Strict//EN&amp;#34; &amp;#34;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;#34;&amp;gt;n&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;n&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;groovy&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;MarkupBuilder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;html&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http-equiv&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;content:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;text/html;charset=UTF8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;meta&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;http-equiv&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Content-Style-Type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;content:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;text/css;charset=UTF8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;rel:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;stylesheet&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;href:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;style.css&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="n"&gt;closure&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;gsql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gsql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;url&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;props&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connection&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getColumns&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="o"&gt;()){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toRowResult&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;entities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groupBy&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TABLE_NAME&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;!(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="s"&gt;/.*BIN$.*/&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 出力処理&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;entities&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;file&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mkdirs&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$dir/index.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;withWriter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;UTF8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;outputEacchRow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ＩＤ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;名称&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;entities&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;keySet&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;tableName&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++%&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)?&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;odd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;href:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${tableName}.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tableName&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="n"&gt;Mapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tables&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;tableName&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;entities&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;entity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;$dir/${entity.key}.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;withWriter&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;UTF8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;outputEacchRow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;(){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ＩＤ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;名称&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;型&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;サイズ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;th&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;NOT NULL&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;class&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;:(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++%&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)?&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;odd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;COLUMN_NAME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;td&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Mapper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;COLUMN_NAME&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TYPE_NAME&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;td&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;COLUMN_SIZE&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;td&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;IS_NULLABLE&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gsql&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>「嫌われるタイプのプログラマ」のエントリに共感したい（自分のため）</title><link>https://genzouw.com/entry/2008/12/18/063700/415/</link><pubDate>Thu, 18 Dec 2008 06:37:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/18/063700/415/</guid><description>&lt;p&gt;&lt;a href="http://kzworks.at.webry.info/200812/article_21.html"&gt;嫌われるタイプのプログラマ&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;のエントリにちょっと癒された（？）。&lt;/p&gt;&#10;&lt;p&gt;*- 自分の好きな事しかやろうとしない人\&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;気に入らないことをさせると手を抜く人\&lt;/li&gt;&#10;&lt;li&gt;やりたいことはスケジュールを無視してもやり出す人\&lt;/li&gt;&#10;&lt;li&gt;このプロジェクトには向かないとわかっていても新しい技術や言語を使いたがる人*&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;僕もかなり当てはまっているんじゃないかな？と思ってしまう・・・。&lt;/p&gt;&#10;&lt;p&gt;仕事中に常にプログラム組みます。以下のような場合に。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;コードの改変要望、運用系DBデータの改変要望などの影響調査&lt;/li&gt;&#10;&lt;li&gt;日々行うルーチンワーク（メール送信、報告書作成、勤怠）&lt;/li&gt;&#10;&lt;li&gt;設計書作成（大抵プログラムの画面項目列挙して項目一覧作ったりしてるから）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;はたから見ると、「あいつまたプログラムばっかりやってるわー」と思われているでしょう。&lt;/p&gt;&#10;&lt;p&gt;でもやっぱり&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;せっかくやるなら、好きなことと結びつけてやったほうが効率よい？&lt;/li&gt;&#10;&lt;li&gt;２度も同じ単純作業はやりたくない&lt;/li&gt;&#10;&lt;li&gt;10分かかる作業をやるなら、同じ時間でプログラムくんで実行するというやり方をして少しでも経験を積みたい&lt;/li&gt;&#10;&lt;li&gt;なるべく新しい技術や言語を使って少しでも経験を積みたい&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;と思ってしまう。&lt;/p&gt;&#10;&lt;p&gt;そういう意味では、好きな事ばかりやり、（目の前の）スケジュールを無視し、新しい技術や言語を使いたがっているのかも。&lt;/p&gt;&#10;&lt;p&gt;でも結果的にスケジュール通りに作業をこなして、成果物も上げているので、問題はないのではないかな。&lt;/p&gt;</description></item><item><title>avast!がエラー検知（マルウェア）？</title><link>https://genzouw.com/entry/2008/12/16/064400/416/</link><pubDate>Tue, 16 Dec 2008 06:44:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/16/064400/416/</guid><description>&lt;p&gt;うちの嫁さんがWindows XPノートPCを使い、僕がubuntu Linux デスクトップマシンを使う我が家の環境。&lt;/p&gt;&#10;&lt;p&gt;昨日の21:00頃、娘が眠ったので二人でのんびりネットしているときのこと。&lt;/p&gt;&#10;&lt;p&gt;突然嫁が「なんかでてきた！」と言った。ノートPCを見てみると、「ウイルスを発見しました。（違うメッセージかも）」的なメッセージが表示されている。対象ファイルは「C:WINDOWSsystem32ils.dl」とかかれていた。ちなみに嫁のノートPCには、フリーのアンチウイルスソフト「avast!」がインストールされていた。&lt;/p&gt;&#10;&lt;p&gt;最近家のファイルサーバー　兼　ウェブサーバーがアタックを受けており、セキュリティ面に敏感になっていた矢先のコトだったので「我が家は標的にされてるのか！！」とかなり泣きそうにww&lt;/p&gt;&#10;&lt;p&gt;取り急ぎノートPCをネットから切り離し、全スキャンをかけたら、やはりそのファイルが問題に。取り合えず削除して再起動。でも、再起動後、avastさんにまたそのファイルが問題だと言われてしまった。&lt;/p&gt;&#10;&lt;p&gt;結局ネットで調べてたどり付いたのがここ-&amp;gt;&lt;a href="http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1221445752"&gt;C:WINDOWSsystem32ils.dl&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;どうやらavast!の誤作動の可能性があるんじゃないかとのことです。同じぐらいの時間に同時多発してますね。仕事が一つ増えたよ…&lt;/p&gt;</description></item><item><title>Oracle以外のDBからでも簡単にテーブル一覧取得できるんだ</title><link>https://genzouw.com/entry/2008/12/12/171600/417/</link><pubDate>Fri, 12 Dec 2008 17:16:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/12/171600/417/</guid><description>&lt;p&gt;今までDB内のテーブルを一覧取得するのはOracleでsql投げるぐらいしか方法がないと思ってました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Java&lt;/strong&gt; の &lt;strong&gt;JDBC&lt;/strong&gt; 関連クラス、メソッドを利用して取得することができます。&lt;/p&gt;&#10;&lt;p&gt;ここではOracleデータベースへの接続方法として &lt;strong&gt;thin接続&lt;/strong&gt; ではなく &lt;strong&gt;oci接続&lt;/strong&gt; を利用しています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;groovy.sql.Sql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;user:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ゆーざめい&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;password:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;ぱすわーど&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Properties&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;gsql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gsql&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;jdbc:oracle:oci8:@せっていち&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="n"&gt;props&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;oracle.jdbc.driver.OracleDriver&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gsql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connection&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTables&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;props&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;%&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;next&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;rs&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getString&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;TABLE_NAME&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gsql&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これは便利！スクリプト用意しておけば、Oracle以外のプロジェクトでも使える♪いいね。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;これでclose処理正しいのかな・・・&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>groovyでフィボナッチ数列表示ロジック</title><link>https://genzouw.com/entry/2008/12/11/065100/418/</link><pubDate>Thu, 11 Dec 2008 06:51:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/11/065100/418/</guid><description>&lt;p&gt;&lt;a href="http://groovybargrill.wordpress.com/2008/12/09/fibonaccigroovy/"&gt;Fibonacci.groovy « Groovy Bar &amp;amp; Grill&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;これはすごいなぁ。コード量が全然違う。&lt;/p&gt;&#10;&lt;p&gt;いつも他の方のgroovyコード見てると「ああ、こういう書き方もあるんだなぁ」とびっくりする。書く人が書くとコード量が驚くほどすくない。&lt;/p&gt;</description></item><item><title>GroovyのisCaseで正規表現がマッチしない？らしい の続き</title><link>https://genzouw.com/entry/2008/12/09/061500/419/</link><pubDate>Tue, 09 Dec 2008 06:15:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/09/061500/419/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2008/12/04/063600"&gt;GroovyのisCaseで正規表現がマッチしない？らしい | ゲンゾウ用ポストイット&lt;/a&gt; の続き。&lt;/p&gt;&#10;&lt;h2 id="ヒントをいただく"&gt;ヒントをいただく&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uehaj/"&gt;id:uehaj&lt;/a&gt; さんに教えていただきました。いつも教えていただきありがとうございます！&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;switch (s) {&#10;case c:&#10;}&#10;のとき、分岐の判断時にc.isCase(s) メソッドが呼び出され、その結果が真のときにそのcase&#10;節が実行されます&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;な、なるほど。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;switch&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;a:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;b:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;c:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;は、&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;x.isCase(a)&lt;/code&gt;、&lt;code&gt;x.isCase(b)&lt;/code&gt;、&lt;code&gt;x.isCase(c)&lt;/code&gt; と評価されていくんじゃなく、&#10;&lt;code&gt;a.isCase(x)&lt;/code&gt;、&lt;code&gt;b.isCase(x)&lt;/code&gt;、&lt;code&gt;c.isCase(x)&lt;/code&gt;と評価されていくんだ。&lt;/p&gt;&#10;&lt;h2 id="コード"&gt;コード&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;zipCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;123-4567&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zipCode&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="s"&gt;/d{3}-d{4}/&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;郵便番号&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;他の何か&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;((~&lt;/span&gt;&lt;span class="s"&gt;/d{3}-d{4}/&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;isCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zipCode&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行結果"&gt;実行結果&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;郵便番号&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;よかった〜&lt;/p&gt;</description></item><item><title>Groovyは、NullPointerException発生しにくいかな？</title><link>https://genzouw.com/entry/2008/12/08/075500/420/</link><pubDate>Mon, 08 Dec 2008 07:55:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/08/075500/420/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/hayassh/20081126/1227715969"&gt;改良？ - ひたすらプログラミング日記&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;こちらのブログをうけ、各所でNullPointerExceptionを回避するコーディングのどれがよいのかの議論が行われているようです。&lt;/p&gt;&#10;&lt;p&gt;見ていると「ああ、僕もこれやってるなぁ」と思ってしまうことが多数。特に以下の意見。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;strong&gt;そもそも、&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;strong&gt;if( x != null &amp;amp;&amp;amp; x.equals(&amp;quot;&amp;quot;) ){ … }&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;&lt;strong&gt;って、問題を先延ばしにしてね？そもそもxにnullがセットされているのに処理が続行されるの、おかしくね？？&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;ああ、胸が痛い。僕です。このコードをメソッドの終了まで書きつづけたことも。今度から、&amp;ldquo;&amp;ldquo;でいいStringはメソッド開始時にnullを弾くように考えてみよう。&lt;/p&gt;&#10;&lt;p&gt;同じブログだけど、&lt;a href="http://d.hatena.ne.jp/hayassh/20081206/1228595180"&gt;Groovy勉強中 - ひたすらプログラミング日記&lt;/a&gt;でかかれているように&lt;strong&gt;Groovy&lt;/strong&gt;は自動的にこのNullPointerException問題を回避できるから楽ちん。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color: rgb(0, 128, 128);"&gt;*&lt;em&gt;false&lt;br&gt;&#10;false&lt;br&gt;&#10;true&lt;br&gt;&#10;true&lt;br&gt;&#10;false&lt;br&gt;&#10;false&lt;br&gt;&#10;*&lt;/em&gt;&#10;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>Groovy In Actionにもあったね - Groovyの起源</title><link>https://genzouw.com/entry/2008/12/04/070400/421/</link><pubDate>Thu, 04 Dec 2008 07:04:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/04/070400/421/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/kinneko/20081203/p13"&gt;Groovyの起源 - kinneko@転職先募集中の日記&lt;/a&gt;に、Groovyが生まれたきっかけについてかかれていた。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Groovy In Action&lt;/strong&gt;の冒頭にかかれていましたね、このエピソード。&lt;/p&gt;&#10;&lt;p&gt;ただ、僕も同じことを。&lt;/p&gt;&#10;&lt;p&gt;&lt;span style="font-size: large;"&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;「なぜ蛇使いにならなかったの？」&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>GroovyのisCaseで正規表現がマッチしない？らしい</title><link>https://genzouw.com/entry/2008/12/04/063600/422/</link><pubDate>Thu, 04 Dec 2008 06:36:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/04/063600/422/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/fumokmm/20080808"&gt;GroovyのisCaseで正規表現がマッチしない？ - No Programming, No Life&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;という投稿を見つけ、早速試してみる。ちょっとソースを修正して実行してみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;zipCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;123-4567&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zipCode&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="s"&gt;/d{3}-d{4}/&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;郵便番号&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;他の何か&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;zipCode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isCase&lt;/span&gt;&lt;span class="o"&gt;(~&lt;/span&gt;&lt;span class="s"&gt;/d{3}-d{4}/&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;郵便番号&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ほんとだ。isCaseが聞いてない。Groovyがバグっているのかな？&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;println zipCode.isCase(/d{3}-d{4}/)&lt;/code&gt; でも&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;println zipCode.isCase(&amp;quot;\d{3}-\d{4}&amp;quot;)&lt;/code&gt; でも&lt;/p&gt;&#10;&lt;p&gt;だめっぽい。&lt;/p&gt;&#10;&lt;p&gt;もうちょっと色々出力してみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;zipCode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Pattern&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;/d{3}-d{4}/&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;regex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Pattern&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;compile&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;/d{3}-d{4}/&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;isCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zipCode&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="o"&gt;(~&lt;/span&gt;&lt;span class="s"&gt;/d{3}-d{4}/&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;isCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zipCode&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="o"&gt;(~&lt;/span&gt;&lt;span class="s"&gt;/d{3}-d{4}/&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果はそれぞれ&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;d&lt;span class="o"&gt;{&lt;/span&gt;3&lt;span class="o"&gt;}&lt;/span&gt;-d&lt;span class="o"&gt;{&lt;/span&gt;4&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;java.util.regex.Pattern&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ううーん。 &lt;strong&gt;なぜswitch文だとうまく判定してくれるんだ。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;こりゃ時間を見つけてGroovy本体のソースにぶつかるしか。そのうちね、そのうち・・・。&lt;/p&gt;</description></item><item><title>Grails 1.1 Beta1 リリースなんだって</title><link>https://genzouw.com/entry/2008/12/04/060000/423/</link><pubDate>Thu, 04 Dec 2008 06:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/04/060000/423/</guid><description>&lt;p&gt;&lt;a href="http://xmldo.blogspot.com/2008/11/grails-11-beta1.html"&gt;xmlDo.net - Grails Web Development: Grails 1.1 Beta1 リリース！&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;おーまた最新のGrailsがリリースされるんですね。&lt;/p&gt;&#10;&lt;p&gt;勝手に脳内で変換されていたため、最新版が1.4と思っていました。なぜ退化？？と思っていたのですが、そりゃそうです。退化するわけがないです。&lt;/p&gt;&#10;&lt;p&gt;オープンソースのままでいてね。&lt;/p&gt;</description></item><item><title>apache common cliをせっかくゴリゴリコーディングしてたのに…</title><link>https://genzouw.com/entry/2008/12/03/065600/424/</link><pubDate>Wed, 03 Dec 2008 06:56:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/03/065600/424/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uehaj/20081125/1227586017"&gt;これはCliBuilderの良い使用例 - Grな日々(uehajの日記)&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;これは・・・ちょうど&lt;strong&gt;apache common cli&lt;/strong&gt;でゴリゴリコーディングしている時に見つけたときはショックでした。めちゃくちゃ簡単に&lt;strong&gt;cli&lt;/strong&gt;のパースが出きるんだもの。うそです。ショックじゃなくうれしいです。&lt;/p&gt;&#10;&lt;p&gt;ていうか、groovyほんとに恐るべし。どこまで機能を取り込むんだ。&lt;strong&gt;junit&lt;/strong&gt;の機能も取り込んでたし。&lt;strong&gt;ant&lt;/strong&gt;、&lt;strong&gt;javascript&lt;/strong&gt;や&lt;strong&gt;ruby&lt;/strong&gt;。&lt;strong&gt;これだけ取り込んでも言語として美しくて直感的&lt;/strong&gt;というのが一番すごい。&lt;/p&gt;</description></item><item><title>Grails Code Reading　第１５回　めっちゃおもしろそう</title><link>https://genzouw.com/entry/2008/12/03/064900/425/</link><pubDate>Wed, 03 Dec 2008 06:49:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/03/064900/425/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/kawaoso/20081201/1228105376"&gt;http://d.hatena.ne.jp/kawaoso/20081201/1228105376&lt;/a&gt;これは・・・やばい、おもしろそう。&lt;/p&gt;&#10;&lt;p&gt;**Groat（古い銀貨）**にかなり興味あり。&lt;/p&gt;&#10;&lt;p&gt;位置ファイルで、しかも550行程度でサーバーって。すごすぎ。ソース一読の必要ありですね。&lt;/p&gt;</description></item><item><title>Expandoを試してみたよ。</title><link>https://genzouw.com/entry/2008/12/03/061700/426/</link><pubDate>Wed, 03 Dec 2008 06:17:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/03/061700/426/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/morchin/20081130"&gt;2008-11-30 - プログラミング日記&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/uehaj/20080323/1206242516"&gt;Expandoとは何か - Grな日々(uehajの日記)&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;を参考に、Expandoを使ってみた。&lt;/p&gt;&#10;&lt;p&gt;なるほど。Groovyのオブジェクトをjavascriptっぽく使えると。これはちょっとうれしいかも。&lt;/p&gt;&#10;&lt;p&gt;javascript使ってると、Groovyにもオブジェクトへの動的なメソッド追加が欲しかったり感じてた。（そんなケースは滅多にないのかもしれませんが。ロジックおかしい？w）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;HANAKO&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/* &#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; これはエラーになる。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; y.greet = { you -&amp;gt; println &amp;#34;HELLO ${you.toUpperCase()}, MY NAME IS ${delegate.name}&amp;#34; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; y.greet &amp;#34;taizo&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;HELLO ${you.toUpperCase()}, MY NAME IS ${name}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;greet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;taizo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コメントアウトした部分は実行できません。&lt;strong&gt;delegate&lt;/strong&gt;は実行中のスクリプト自体を参照する模様。ここでは、&lt;strong&gt;ExpandoTest.groovy&lt;/strong&gt;というファイル名でスクリプトを書いていたので、&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;No such property: name for class: workspace.blog.ExpandoTest&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;なんていうエラーになってしまう。&lt;/p&gt;&#10;&lt;p&gt;動的にメソッド追加したい場合には&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Expando&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;taro&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;greet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;hello $you, my name is ${delegate.name}&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;greet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;genzou&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;HANAKO&amp;#34;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;実行結果：hello genzou, my name is taro&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>なぜ再三GroovyからJavaScriptを呼ぼうとしたか</title><link>https://genzouw.com/entry/2008/12/02/065800/427/</link><pubDate>Tue, 02 Dec 2008 06:58:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/02/065800/427/</guid><description>&lt;p&gt;なぜ何度もJavaScriptを呼ぼうと頑張ったかというと、以下のjavascriptテストフレームワークを使用したかったから。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://jstester.sourceforge.net/"&gt;Maven - JsTester&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;テストケースを書くために、Groovyに特化したクラスも用意されている。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://jstester.sourceforge.net/faq.html#groovy"&gt;Maven - Frequently Asked Questions&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;掲載されていたものを抜粋し、若干バグっている部分を修正。（このサイトのソース、あちこちにタイプミス、変数定義漏れなどがあり、若干バグっているがw）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;net&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;jstester&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GroovyJsTestCase&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;class&lt;/span&gt; &lt;span class="nx"&gt;GroovyJsTesCaseTest&lt;/span&gt; &lt;span class="kr"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;GroovyJsTestCase&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;void&lt;/span&gt; &lt;span class="nx"&gt;testScript&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nx"&gt;groovyVar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;10&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;def&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; var counter = 0;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; function count(){&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; counter++;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; for( i = 0; i &amp;lt; $groovyVar; i++ ){&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; count();&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; }&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;script&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;assertExpressionEquals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$groovyVar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;counter&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結構おもしろいなぁと思った。最後の&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;assertExpressionEquals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;$groovyVar&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;counter&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;の部分は、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;assertExpressionEquals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;groovyVar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;counter&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;&#10;でも比較可能。（というか、なぜサンプルで文字列にしてあるのか不明）第二引数がテストケース内でevalを実行した結果定義された変数、関数を表す。&#10;&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>GroovyでJavaScriptソースをコールしてみる３</title><link>https://genzouw.com/entry/2008/12/02/061100/428/</link><pubDate>Tue, 02 Dec 2008 06:11:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/02/061100/428/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2008/12/01/064100"&gt;GroovyでJavaScriptソースをコールしてみる２&lt;/a&gt; の続き。&lt;/p&gt;&#10;&lt;p&gt;今回は、以下のようにしてJavaScriptのオブジェクト内に格納されている関数を取り出してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;genzou&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;sex&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;man&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;greet&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;こんにちわ世界&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上記の例では、 &lt;code&gt;greet&lt;/code&gt; プロパティの関数が今回のターゲットです。&lt;/p&gt;&#10;&lt;h2 id="groovyからjavascriptをパースして関数プロパティを抜き出してみる"&gt;GroovyからJavaScriptをパースして関数プロパティを抜き出してみる&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.script.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sun.org.mozilla.javascript.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ScriptEngineManager&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getEngineByName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;JavaScript&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;var genzou = {age:29, sex:&amp;#39;man&amp;#39;, greet:function(){ return &amp;#39;こんにちわ世界&amp;#39;; } };&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;getClosure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sun&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mozilla&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;javascript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;internal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NativeObject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getClosure&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;genzou&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// ***何が取れるかな？***&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;greet&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sun.org.mozilla.javascript.internal.InterpretedFunction@1549ceb&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;どうやら関数を取得できている模様。&lt;/p&gt;&#10;&lt;p&gt;さらに、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;greet&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;の部分を&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;greet&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;properties&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とすると、 &lt;code&gt;call&lt;/code&gt; メソッドを保持しているので、JavaScriptの関数のように見えます。&#10;多分これで関数の実行ができるのかな。試してみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.script.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sun.org.mozilla.javascript.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ScriptEngineManager&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getEngineByName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;JavaScript&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;var genzou = {age:29, sex:&amp;#39;man&amp;#39;, greet:function(){ return &amp;#39;こんにちわ世界&amp;#39;; } };&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;getClosure&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sun&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mozilla&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;javascript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;internal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;NativeObject&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getClosure&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;genzou&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;greet&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;call&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mozilla&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;javascript&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;enter&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;[])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果、まったく動きません！！（引数にnullを渡しているのは &lt;strong&gt;NullPointerException&lt;/strong&gt; がでる想定で試してみたから。）callメソッドがないといわれます。引数に誤りがあるんだろうけれども、Googleで検索してもjavadocも見つからず。うーん。&lt;/p&gt;</description></item><item><title>GroovyでJavaScriptソースをコールしてみる２</title><link>https://genzouw.com/entry/2008/12/01/064100/429/</link><pubDate>Mon, 01 Dec 2008 06:41:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/01/064100/429/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2008/12/01/061200"&gt;GroovyでJavaScriptソースをコールしてみる&lt;/a&gt; の続きです。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;obj.get(&amp;quot;age&amp;quot;, obj)&lt;/code&gt; のように、1回のメソッド呼び出しのために2回もオブジェクトインスタンスを記述するのが面倒です。&#10;これをなんとかしたいと思います。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;metaClass&lt;/code&gt; を使って、プロパティにもっと簡単にアクセスできるようにしてみます。&lt;/p&gt;&#10;&lt;h2 id="metaclass-を使ってプロパティにもっと簡単にアクセスできるようにしてみる"&gt;&lt;code&gt;metaClass&lt;/code&gt; を使って、プロパティにもっと簡単にアクセスできるようにしてみる&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;metaClass.getAt()&lt;/code&gt; メソッドを実装してやることで、Groovy内のオブジェクトに対して以下のようにプロパティアクセス可能となります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getAt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="cm"&gt;/* any logic */&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;X&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;X&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;some-field&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;obj.get(&amp;quot;age&amp;quot;, obj)&lt;/code&gt; という記述を &lt;code&gt;metaClass.getAt()&lt;/code&gt; でくるんでやることで、 &lt;code&gt;obj[&amp;quot;age&amp;quot;]&lt;/code&gt; のようにアクセスできるようにしてやろうと思います。&lt;/p&gt;&#10;&lt;h3 id="その前に寄り道取得できたjavascriptのオブジェクトってどんなjavaクラスなの"&gt;その前に寄り道。取得できたJavaScriptのオブジェクトってどんなJavaクラスなの？&lt;/h3&gt;&#10;&lt;p&gt;これを知らなくても &lt;code&gt;metaClass.getAt&lt;/code&gt; に設定するクロージャ処理は実装可能ですが、&#10;寄り道して、JavaScript実行結果から取得されたオブジェクトのクラスを調べてどのようにプロパティ情報が格納されているのかを調べてみることにしました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.script.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ScriptEngineManager&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getEngineByName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;JavaScript&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;var genzou = {age:29, sex:&amp;#39;man&amp;#39;};&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;genzou&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;properties&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;プロパティをすべて舐めて出力してみました。&#10;結果、以下のように。&lt;/p&gt;&#10;&lt;p&gt;[&amp;ldquo;allIds&amp;rdquo;:[&amp;ldquo;age&amp;rdquo;, &amp;ldquo;sex&amp;rdquo;], &amp;ldquo;parentScope&amp;rdquo;:com.sun.script.javascript.RhinoTopLevel@1feaf06, &amp;ldquo;ids&amp;rdquo;:[&amp;ldquo;age&amp;rdquo;, &amp;ldquo;sex&amp;rdquo;], &amp;ldquo;sealed&amp;rdquo;:false, &amp;ldquo;class&amp;rdquo;:class sun.org.mozilla.javascript.internal.NativeObject, &amp;ldquo;className&amp;rdquo;:&amp;ldquo;Object&amp;rdquo;, &amp;ldquo;maxInstanceId&amp;rdquo;:0, &amp;ldquo;prototype&amp;rdquo;:[object Object]]&lt;/p&gt;&#10;&lt;p&gt;なんか難しそうだw。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;allIds&lt;/code&gt; って何だ？？&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;ids&lt;/code&gt; との違いは分からないが、多分一緒かな。&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;class&lt;/code&gt; が &lt;code&gt;sun.org.mozilla.javascript.internal.NativeObject&lt;/code&gt; であることだけははっきりしました。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;sun&lt;/strong&gt; と &lt;strong&gt;mozilla&lt;/strong&gt; ってどっちなんだろう（笑）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="本題に戻って-metaclassgetat-に設定するクロージャ処理を実装"&gt;本題に戻って、 &lt;code&gt;metaClass.getAt&lt;/code&gt; に設定するクロージャ処理を実装&lt;/h3&gt;&#10;&lt;p&gt;本題に戻ります。 &lt;code&gt;NativeObject&lt;/code&gt; クラスの &lt;code&gt;metaClass&lt;/code&gt; プロパティに &lt;code&gt;getAt&lt;/code&gt; メソッドを追加してみる。&lt;/p&gt;</description></item><item><title>GroovyでJavaScriptソースをコールしてみる</title><link>https://genzouw.com/entry/2008/12/01/061200/430/</link><pubDate>Mon, 01 Dec 2008 06:12:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/12/01/061200/430/</guid><description>&lt;p&gt;先週まで、「サーバサイトJavaScript」を使用したシステムに携わっていました。&lt;/p&gt;&#10;&lt;p&gt;その時に「JUnit」を使ってテストをできないかといろいろ調べていたときのメモです。&lt;/p&gt;&#10;&lt;p&gt;（最近ではTestNGなるものが話題のようですが、ろくすっぽJUnitも使っていないのに次のテストフレームワークを試す気もなく、まずはJUnitを使い倒すべく勉強中です。）&lt;/p&gt;&#10;&lt;p&gt;JavaScriptなので、jsUnit的なものを使用したら解決なのでしょうが、やはりそこはGroovy中毒としては引けません。&lt;/p&gt;&#10;&lt;p&gt;まずはGroovy（もちろんJavaでできる）でJavaScriptソースをコールしてみます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.script.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ScriptEngineManager&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getEngineByName&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;JavaScript&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;engine&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;with&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;var genzou = {age:29, sex:&amp;#39;man&amp;#39;};&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;genzou&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;age&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;JavaScriptを文字列として引き渡し、実行します。&#10;その後実行結果を取得します。意外と簡単ですね。&lt;/p&gt;&#10;&lt;p&gt;ただ、オブジェクトのプロパティ参照がやや面倒くさい。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://www.mozilla.org/rhino/apidocs/"&gt;Scriptable (Rhino)&lt;/a&gt; のgetメソッドを実行しているようなのですが、第二引数に毎回自分自身を引き渡してやる必要があるようです。（ &lt;strong&gt;Python&lt;/strong&gt; の &lt;code&gt;self&lt;/code&gt; キーワードをメソッドの第一引数に渡す、というルールに似ていますね。）&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://genzouw.com/entry/2008/12/01/064100"&gt;次回&lt;/a&gt;は、 &lt;code&gt;metaClass&lt;/code&gt; に &lt;code&gt;getAt&lt;/code&gt; メソッドを追加して、ちょっとだけ簡単にしてみたいと思います。&lt;/p&gt;</description></item><item><title>Groovyでjunitする場合には、GroovyTestCaseを継承するのか</title><link>https://genzouw.com/entry/2008/11/28/120500/431/</link><pubDate>Fri, 28 Nov 2008 12:05:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/28/120500/431/</guid><description>&lt;p&gt;がんばれ自分！&lt;/p&gt;&#10;&lt;p&gt;最近は家に着くのが11時近く。このプロジェクトも今日で終わり。&lt;/p&gt;&#10;&lt;p&gt;家帰ったらかわいい嫁と娘が寝てしまっているし、さびしい・・・&lt;/p&gt;&#10;&lt;p&gt;話は変わりgroovyでJunitのテストケースを記述する際に気づいたこと。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://groovy.codehaus.org/Unit+Testing"&gt;Groovy - Unit Testing&lt;/a&gt;でも書かれているのですが、どうやら継承するクラスは&lt;strong&gt;TestCase&lt;/strong&gt;ではなく&lt;strong&gt;GroovyTestCase&lt;/strong&gt;のほうがよさげ？？かも知れません。&lt;/p&gt;&#10;&lt;p&gt;こちらのほうが、従来の&lt;strong&gt;TestCase&lt;/strong&gt;クラスを継承したクラスであり、機能が豊富（のはず）なので。&lt;strong&gt;impor&lt;/strong&gt;tしなくても使えるしね。&lt;/p&gt;&#10;&lt;p&gt;地味に**&lt;a href="http://groovy.codehaus.org/api/groovy/util/GroovyTestCase.html#getMethodName%28%29"&gt;&lt;code&gt;getMethodName&lt;/code&gt;&lt;/a&gt;**&lt;code&gt;()&lt;/code&gt;とかほしかった。配列を比較っていうのもほしかったので便利♪&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://groovy.codehaus.org/api/groovy/util/GroovyTestCase.html"&gt;GroovyTestCase (Groovy (1.6-beta-2))&lt;/a&gt;&lt;/p&gt;</description></item><item><title>かなり笑った（今日の愚痴 - しんさんの出張所）</title><link>https://genzouw.com/entry/2008/11/26/122600/432/</link><pubDate>Wed, 26 Nov 2008 12:26:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/26/122600/432/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/shin/20081125/p3#c"&gt;今日の愚痴 - しんさんの出張所　はてな編&lt;/a&gt;にかなり笑ってしまった。&lt;/p&gt;&#10;&lt;p&gt;世の中には想像もしないことがあるんだなぁｗ&lt;/p&gt;</description></item><item><title>島の数をカウントする どう書く？org</title><link>https://genzouw.com/entry/2008/11/25/190000/433/</link><pubDate>Tue, 25 Nov 2008 19:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/25/190000/433/</guid><description>&lt;blockquote&gt;&#10;&lt;p&gt;m×nの長方形のマス目のうちいくつかを黒く塗りつぶします。&#10;このとき、白の島、黒の島がそれぞれいくつあるかをカウントしてください。&lt;/p&gt;&#10;&lt;p&gt;ただし、2つのマスは、同色マスの上下左右の移動で移れるとき、&#10;同じ島にあると定義します。&lt;/p&gt;&#10;&lt;p&gt;例：&#10;□■■□&#10;□□■□&#10;□■□□&#10;□■■□&#10;白の島は2つ&#10;黒の島は2つ&lt;/p&gt;&#10;&lt;p&gt;例：&#10;□□□□&#10;■□■□&#10;□■□□&#10;□□□□&#10;白の島は1つ&#10;黒の島は3つ&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;□■■□&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;■□□■&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;□□■□&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;□■■□&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;■&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;□&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;board&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLines&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;XMAX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;YMAX&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;eat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;×&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 周辺もいただきます♪&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;y&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]].&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="na"&gt;XMAX&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="na"&gt;YMAX&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;amp&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;mark&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;eat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="na"&gt;XMAX&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="na"&gt;YMAX&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;mark&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;board&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;][&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;×&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="o"&gt;]++&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;eat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mark&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;誤った投稿をして、サイトを汚しまくってしまった・・・&lt;/p&gt;</description></item><item><title>Groovyで「立方根の計算 どう書く？org」を解いてみた</title><link>https://genzouw.com/entry/2008/11/25/071800/434/</link><pubDate>Tue, 25 Nov 2008 07:18:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/25/071800/434/</guid><description>&lt;p&gt;立方根の計算 どう書く？org をといてみました。（今更ですね。かなり昔の問題です。）&lt;/p&gt;&#10;&lt;h2 id="問題"&gt;問題&lt;/h2&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;xは0以上1000未満の実数です。 &lt;code&gt;y * y * y = x&lt;/code&gt; になるような実数y(立方根)を小数点以下12桁以上の正確さで 求める関数cube_rootを作って下さい。&lt;/p&gt;&#10;&lt;p&gt;ただし、このお題の趣旨は実数区間での探索なので、 立方根関数があっても使ってはいけません。 指数関数と対数関数も禁止します。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;pythonで表現した入出力の例：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cube_root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;10.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;2.1544346900318834&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;9.9999999999999947&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cube_root&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;100.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;4.6415888336127793&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mf"&gt;100.00000000000003&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="答え"&gt;答え&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;cubeRoot&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;right&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;left&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;downto&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;right&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;rank&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;findnum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;))**&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;findnum&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;rank&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ans&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="nf"&gt;cubeRoot&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="nf"&gt;cubeRoot&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;怠け癖があるので、毎日こうやって少しずつ課題を解いていけるようにしたいです。&lt;/p&gt;&#10;&lt;p&gt;それにしても解法（数学的なものなど）を知っているのと知らないのでは、コードが大きく違います。いろんな知識を身につけておくのが大事ということですね。&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>Groovy（Java?）の正規表現が便利（カネムーメモ: 正規表現、先読みと後読み より）</title><link>https://genzouw.com/entry/2008/11/24/172400/435/</link><pubDate>Mon, 24 Nov 2008 17:24:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/24/172400/435/</guid><description>&lt;p&gt;今まで無駄な正規表現処理をコーディングしていたことに気づきました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://kanemu1117nc.blogspot.com/2008/11/blog-post.html"&gt;カネムーメモ: 正規表現、先読みと後読み&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="学習前の正規表現"&gt;学習前の正規表現&lt;/h2&gt;&#10;&lt;p&gt;以下のような文字列から、数字２桁の文字を置換する場合について。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;あいうえお012かきく34けこなに56ぬね789の&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;いつも以下のようなソースを書いていました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;あいうえお012かきく34けこなに56ぬね789の&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;/([^d])(dd)([^d])/&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$1$3&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果は &lt;code&gt;あいうえお012かきくけこなにぬね789の&lt;/code&gt; 。&lt;/p&gt;&#10;&lt;p&gt;どうしても前方の数値でない部分と、後方の数値でない部分が置換対象に入り込んでしまうので、しょうがなく置換後文字列を &lt;code&gt;$1$3&lt;/code&gt; として処理していました。&lt;/p&gt;&#10;&lt;h2 id="学習後の正規表現"&gt;学習後の正規表現&lt;/h2&gt;&#10;&lt;p&gt;以下のようにしたら、この問題が解決できるようになりました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;あいうえお012かきく34けこなに56ぬね789の&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;/(?&amp;lt;=[^d])(dd)(?=[^d])/&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;結果は同様に &lt;code&gt;あいうえお 012 かきくけこなにぬね 789 の&lt;/code&gt; となりました。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;いや、知りませんでした。&#10;Java の正規表現なのか Groovy 限定の正規表現なのかは分かりませんが、いずれにしても強力。勉強になりました。&lt;/p&gt;</description></item><item><title>いい投稿だなぁ。前向きに！！</title><link>https://genzouw.com/entry/2008/11/24/083400/436/</link><pubDate>Mon, 24 Nov 2008 08:34:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/24/083400/436/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/t_yano/20081118/1227030231"&gt;ネガティブ思考に陥るくらいならポジティブ教に入信する方を選ぶね。 - 矢野勉のはてな日記&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;ちょうどいい書き込みに出会った。もともとブログをかきはじめたのだって、会社以外でも自分の出きることを残していきたいって思ってやったこと。&lt;/p&gt;&#10;&lt;p&gt;恥ずかしいロジックのソースをできる限り公開して叩いてもらおうと思ったから始めたこと。&lt;/p&gt;&#10;&lt;p&gt;ブログ始めたからこそ他の人たちがどんなことを考え、書いているのか積極的にみるため余計に人のブログを見るようになり、情報収集できるようになった。&lt;/p&gt;&#10;&lt;p&gt;今日も一日頑張るぞ！早速netbeansをダウンロード中。groovyのエディタ操作感を試してみたい。&lt;/p&gt;</description></item><item><title>あぁぁぁ・・・</title><link>https://genzouw.com/entry/2008/11/23/225500/437/</link><pubDate>Sun, 23 Nov 2008 22:55:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/23/225500/437/</guid><description>&lt;p&gt;メーリングリストとの付き合いかたが分からず、かなり不快な思いをさせてしまった模様。&lt;/p&gt;&#10;&lt;p&gt;俺ダメだ・・・・・・鬱。&lt;/p&gt;&#10;&lt;p&gt;やはり一人で勉強頑張ろう・・・&lt;/p&gt;&#10;&lt;p&gt; &lt;/p&gt;&#10;&lt;p&gt;関係ないけど３連休はできるだけ家で家族と過ごす。&lt;/p&gt;&#10;&lt;p&gt;いつも嫁に任せっきりの子育て、家事を少しでも手伝わないとね。&lt;/p&gt;</description></item><item><title>Groovyでチャット</title><link>https://genzouw.com/entry/2008/11/21/080400/439/</link><pubDate>Fri, 21 Nov 2008 08:04:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/21/080400/439/</guid><description>&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/beyondseeker/20081118/1226862286" id="1226862286"&gt;Groovyでsmackを使ってGoogleTalkとjabberに接続してみた。&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;のビックリ。こんなに簡単にチャットにアクセスできるんですね。&lt;/p&gt;&#10;&lt;p&gt;こちらではメッセージの送信方法がサンプルとしてかかれておりましたので、家のパソコン2台で試してみたところ確かに送信成功！！本当に簡単！！！&lt;/p&gt;&#10;&lt;p&gt; &lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;org.jivesoftware.smack.*&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 認証情報の設定&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// GmailのID&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// Gmailのパスワード&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// 相手のID&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Google Talk に接続＆ログイン&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;XMPPConnection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ConnectionConfiguration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;talk.google.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;5222&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gmail.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;login&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// メッセージを送信&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getChatManager&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="na"&gt;createChat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MessageListener&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 相手からのメッセージ送信を定期的に待つ&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;おお！！一秒ごとにメッセージがコンソール表示される！！！&lt;/p&gt;&#10;&lt;p&gt;これをGrailsで作ったら、WEBチャットができるんじゃないか？？すごい！！！（感嘆詞多し）&lt;/p&gt;</description></item><item><title>GroovyのJunitって実行が便利</title><link>https://genzouw.com/entry/2008/11/20/080600/440/</link><pubDate>Thu, 20 Nov 2008 08:06:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/20/080600/440/</guid><description>&lt;p&gt;現在仕事で開発・テスト工程にはいっています。&lt;/p&gt;&#10;&lt;p&gt;単体テストにJUnitを使用したいとおもい、Groovyで記述。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestString&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;extends&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;setup&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;// 省略！&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;testTrim&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// ここに検証用処理を記述&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;さて、こいつを実行するのに&lt;strong&gt;junit&lt;/strong&gt;の場合には&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;java -jar &amp;hellip;（コマンド忘れた）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;とコマンドから打ち込むわけですが、&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;strong&gt;コマンド忘れてしまいました&lt;/strong&gt;&lt;/span&gt;。&lt;/p&gt;&#10;&lt;p&gt;そこでこのまま実行したらどうなるだろ？？ということで実行。すると、何とJunitが実行され、テスト結果がコンソールに表示されてました。&lt;/p&gt;&#10;&lt;p&gt;Groovyでは&lt;strong&gt;TestCaseを継承したスクリプトは、実行時にJUnit上で実行される&lt;/strong&gt;んですね。これは便利！！&lt;/p&gt;&#10;&lt;p&gt; &lt;/p&gt;&#10;&lt;p&gt;&lt;span style="color: rgb(255, 153, 204);"&gt;&lt;em&gt;&lt;strong&gt;＊殴り書きなのでかなり分かりにくいと思います。さて仕事へ。&lt;/strong&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;</description></item><item><title>grails-jaのメーリングリストをみてていつも悶々としてる（泣きそう）</title><link>https://genzouw.com/entry/2008/11/20/064200/441/</link><pubDate>Thu, 20 Nov 2008 06:42:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/20/064200/441/</guid><description>&lt;p&gt;Code Reading・・・いつもメーリングリストで見ているんですが、行きたい！でも、関東はきついなぁ。今住んでいる大阪からいくのは。&lt;/p&gt;&#10;&lt;p&gt;実家の青森からでもやっぱり辛い。&lt;/p&gt;&#10;&lt;p&gt;名古屋あたりでやるようなことがあれば、何とか参加できなくもない。&lt;/p&gt;&#10;&lt;p&gt;関西圏でのGroovy、Grailsの勉強会みたいなものの情報があれば。&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>Groovy勉強したら、prototype.js使えるようになってた</title><link>https://genzouw.com/entry/2008/11/18/065000/442/</link><pubDate>Tue, 18 Nov 2008 06:50:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/18/065000/442/</guid><description>&lt;p&gt;今更ですが、prototype.jsのネタを。&lt;/p&gt;&#10;&lt;p&gt;一年以上も前のプロジェクトで&lt;a href="http://www.prototypejs.org/"&gt;prototype.js&lt;/a&gt;を使用したWEBシステムを構築しました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://www.s2factory.co.jp/tech/prototype/prototype.js.html"&gt;prototype.js v1.5.0 の使い方&lt;/a&gt;を参考に、勉強がてら調べながらシステム構築しました。その時には**$()&lt;strong&gt;や&lt;/strong&gt;$F()**の利用方法を学ぶ程度、Event.observeを利用する程度までしか本質を理解できませんでした。&lt;/p&gt;&#10;&lt;p&gt;Groovyを勉強した現在、上記システムの改修作業に携わっているのですが、prototype.jsの見方がかなりかわってきています。特にArrayまわり。&lt;/p&gt;&#10;&lt;p&gt;GroovyのListには&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;find&lt;/li&gt;&#10;&lt;li&gt;findAll&lt;/li&gt;&#10;&lt;li&gt;collect&lt;/li&gt;&#10;&lt;li&gt;each&lt;/li&gt;&#10;&lt;li&gt;any&lt;/li&gt;&#10;&lt;li&gt;all&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;といった便利なメソッドが用意されており、ループ処理を簡単に記述できます。&lt;/p&gt;&#10;&lt;p&gt;prototype.jsを利用すると同様のことがjavascriptでも実現できるようです。（ちなみにprototype.jsを使用するにはサイトからダウンロードしてきたjsファイルをhtmlにインポートするだけです。）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// これで、&amp;#34;[taro]&amp;#34;, &amp;#34;[hanako]&amp;#34;, &amp;#34;[jiro]&amp;#34;という文字配列がセットされる&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;newlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;taro&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hanako&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;jiro&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;[&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;適用前は&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// これで、&amp;#34;[taro]&amp;#34;, &amp;#34;[hanako]&amp;#34;, &amp;#34;[jiro]&amp;#34;という文字配列がセットされる&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;taro&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hanako&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;jiro&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;newlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;names&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;newlist&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;[&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;少しだけコードが減って見やすくなっています（かな？）&lt;/p&gt;&#10;&lt;p&gt;これが生きてくるのは&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;list.findAll(…).collect(…).each(…);&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;などのように、連想的にメソッドを呼び出す場合でしょう。その場合には確かにソースコードは減るし、見やすくなるように感じます。&lt;/p&gt;&#10;&lt;p&gt;これと比べるとgroovyの同メソッドなどの構文がいかにシンプルかが分かります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// これで、&amp;#34;[taro]&amp;#34;, &amp;#34;[hanako]&amp;#34;, &amp;#34;[jiro]&amp;#34;という文字配列がセットされる&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;newlist&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;taro&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;hanako&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;jiro&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;[&amp;#34;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;groovyと比較して、prototype.js(javascript)を利用した場合の面倒さとしては以下のように感じました。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;クロージャの記述の際に、毎回functionの記述が必要。&lt;/li&gt;&#10;&lt;li&gt;クロージャの返却値として必ずreturnの記述が必要。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;特にgrovyの癖で２番を忘れるため、何度やっても返却値の配列が空になってしまうことがよくありました。&lt;/p&gt;&#10;&lt;p&gt; &lt;/p&gt;&#10;&lt;p&gt;javascriptエンジン&lt;strong&gt;Rhino&lt;/strong&gt;上でprototype.jsを利用することもできるようです。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/mzp/20070801/prototype"&gt;Rhinoでprotoype.js - みずぴー日記&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;試してみたら確かに動いた♪&lt;/p&gt;</description></item><item><title>なるほど・・・with文って自分で作れるんだ…</title><link>https://genzouw.com/entry/2008/11/18/064200/443/</link><pubDate>Tue, 18 Nov 2008 06:42:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/18/064200/443/</guid><description>&lt;p&gt;なるほど・・・こんな風に実装されているのかな。&lt;/p&gt;&#10;&lt;p&gt;僕はまだGroovyの言語仕様をうまく活用するアイデアがパッと閃きません。まだまだ修行がたりないな。&lt;/p&gt;&#10;&lt;p&gt;特にビルダーまわりの便利さについてはあまりピンときていません。正確には、既存のビルダーを使用する分には非常に便利と感じるのですが、自分がビルダーを使用してソースを綺麗にあるいはコーディングを楽に、という観点でビルダーを扱う能力が非常に低いと感じます。&lt;/p&gt;&#10;&lt;p&gt;もっといろんな人のブログみて勉強しよう。&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>Groovyのwithステートメント</title><link>https://genzouw.com/entry/2008/11/17/070100/444/</link><pubDate>Mon, 17 Nov 2008 07:01:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/17/070100/444/</guid><description>&lt;p&gt;僕も知らなかった・・・&lt;/p&gt;&#10;&lt;p&gt;正確には、半年ぐらい前にどこかのソースで見た記憶があったのですが、with(・・・)とか書いてみても動かないのでやっぱりないのかなぁってた。&lt;/p&gt;&#10;&lt;p&gt;変数列挙していくと汚くなるし、こんなのかけないかなぁって思っていました。&lt;/p&gt;&#10;&lt;p&gt;やっぱりGroovy素敵。&lt;/p&gt;</description></item><item><title>GroovyでGmailを一時ファイルの保存場所として使ってみる</title><link>https://genzouw.com/entry/2008/11/12/121000/445/</link><pubDate>Wed, 12 Nov 2008 12:10:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/12/121000/445/</guid><description>&lt;p&gt;Gmailは僕の生活のなかでとても重要な位置を占めています。もはやGmailなしでは仕事や生活が成り立たないぐらいです。&lt;/p&gt;&#10;&lt;p&gt;仕事やネットカフェ、友人の家などでPCにて作業した際にも、一時ファイルのアップロード先として自分に送信し、家で添付ファイルをダウンロード、ということをしていたのですが、 &lt;strong&gt;手動で&lt;/strong&gt; &lt;strong&gt;ダウンロードした後に展開した後に展開し、指定フォルダに展開し、そのメールを削除&lt;/strong&gt; という単純作業が面倒くさいと感じました。&lt;/p&gt;&#10;&lt;p&gt;そこで、 &lt;strong&gt;IMAPにてファイルを受信、メールの削除をスクリプト化&lt;/strong&gt; してみた。&lt;/p&gt;&#10;&lt;p&gt;以下のメソッドが、メールの削除とファイルの受信を行ってくれる。対象のメールを絞り込むためには &lt;strong&gt;findLogic&lt;/strong&gt; にクロージャを引き渡します。引数は１つで、 &lt;a href="http://sdc.sun.co.jp/java/docs/j2ee/sdk_1.3/ja/techdocs/api/javax/mail/Message.html"&gt;Message&lt;/a&gt; クラスのインスタンスが引き渡されます。結果としてbooleanを返せばOK。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.mail.Folder&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.mail.Message&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.mail.Session&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.mail.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.mail.internet.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getGmailAttachedFiles&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;findLogic&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getStore&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;imaps&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;connect&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;imap.gmail.com&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;993&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;folder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getFolder&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;INBOX&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Folder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;READ_ONLY&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;find&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;findLogic&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exit&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="nl"&gt;String:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Multipart&lt;/span&gt; &lt;span class="n"&gt;multiPart&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;multiPart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;multiPart&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBodyPart&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fileName&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;tmpdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;java.io.tmpdir&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${tmpdir}/${part.fileName}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;withOutputStream&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;part&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setFlag&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Flags&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;DELETED&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;files&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のように使用。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;getGmailAttachedFiles&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;username@gmail.com&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;password&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;in net coffee&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;renemeTo&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/genzou&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Groovy Eclipse PluginでGroovyのコードフォーマッターが動いたよ</title><link>https://genzouw.com/entry/2008/11/12/070400/446/</link><pubDate>Wed, 12 Nov 2008 07:04:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/12/070400/446/</guid><description>&lt;p&gt;最新の&lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;Groovy - Eclipse Plugin&lt;/a&gt;をインストールして使って見ました。&lt;/p&gt;&#10;&lt;p&gt;変数名が置換される場合と置換されない場合がありますし、メソッドの補完機能もまだまだかなと思いますが、&lt;strong&gt;コードがハイライトで表示される&lt;/strong&gt;のとなにより&lt;strong&gt;コードフォーマッタ&lt;/strong&gt;が動作するようになっていたのがうれしい。&lt;/p&gt;&#10;&lt;p&gt;スクリプトだと結構殴り書きでコーディングしてそのままになりやすいので、&lt;strong&gt;コードフォーマッタ&lt;/strong&gt;は助かります。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;IntelliJ&lt;/strong&gt;を使えない貧乏人のために、&lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;Groovy - Eclipse Plugin&lt;/a&gt;の今後に期待！&lt;/p&gt;&#10;&lt;h4 id="ちなみに"&gt;ちなみに&lt;/h4&gt;&#10;&lt;p&gt;英語版のeclipseを使用してるため、日本語版が提供されているかは分かりません。コードに日本語のコメントなどが逢った場合にはフォーマットが正常に動作しないようです。&lt;/p&gt;&#10;&lt;p&gt;コードにデスクトップへのパスがかけない・・・&lt;/p&gt;</description></item><item><title>疑似並行処理 どう書く？org</title><link>https://genzouw.com/entry/2008/11/10/233500/447/</link><pubDate>Mon, 10 Nov 2008 23:35:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/10/233500/447/</guid><description>&lt;p&gt;&lt;a href="http://ja.doukaku.org/215/"&gt;疑似並行処理 どう書く？org&lt;/a&gt; をやってみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sleep&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;curry&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;z&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;curry&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;shimakumaさんの解答が短い！！！&lt;/p&gt;&#10;&lt;p&gt;Groovyで、 &lt;code&gt;yeild()&lt;/code&gt; ってはじめてみた。他の言語でなら見たことあるのに。勉強不足です。&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>JavaScriptの `replace` メソッドで条件に合致した最初のパターンしか置換されない</title><link>https://genzouw.com/entry/2008/11/10/075800/448/</link><pubDate>Mon, 10 Nov 2008 07:58:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/10/075800/448/</guid><description>&lt;p&gt;誰もが通る道なのでしょう。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;abcdabc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ab&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とやっても、前方の一ヶ所しか置換されないので、ずっと&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;abcdabc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ab&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とやっていました。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;p&gt;前回紹介したjavascriptの本を読むと、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;abcdabc&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/ab/g&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;で解決できるそうです。なるほど、正規表現ね。&lt;/p&gt;</description></item><item><title>LinuxでコマンドラインからJavaScriptを呼び出す方法</title><link>https://genzouw.com/entry/2008/11/09/080000/449/</link><pubDate>Sun, 09 Nov 2008 08:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/09/080000/449/</guid><description>&lt;p&gt;LinuxでJavaScriptを利用してファイル操作等を行うことが可能。前回も書いたとおり、 &lt;strong&gt;Rhino&lt;/strong&gt; を使用する。&#10;ここでは &lt;strong&gt;ubuntu&lt;/strong&gt; での動作まで説明してみます。&lt;/p&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo apt-get install rhino&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;で、 &lt;strong&gt;Rhino&lt;/strong&gt; をインストール。パスも勝手に通るようです。&lt;/p&gt;&#10;&lt;h2 id="確認"&gt;確認&lt;/h2&gt;&#10;&lt;p&gt;試しに動かしてみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ rhino&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以下のようなプロンプトが表示されればOK。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;js &amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="テストスクリプト作成"&gt;テストスクリプト作成&lt;/h2&gt;&#10;&lt;p&gt;以下の内容を既述。(test.jsとしておく)&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env rhino&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;てすとじっこうできた！&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ファイルのパーミッションを変更しておく。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ chmod &lt;span class="m"&gt;755&lt;/span&gt; test.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行"&gt;実行&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ./test.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;を実行。問題なければ、「 &lt;strong&gt;てすとじっこうできた！&lt;/strong&gt; 」と表示されるはず。&lt;/p&gt;&#10;&lt;p&gt;以上&lt;/p&gt;</description></item><item><title>JavaScriptも捨てがたい・・・</title><link>https://genzouw.com/entry/2008/11/09/074500/450/</link><pubDate>Sun, 09 Nov 2008 07:45:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/09/074500/450/</guid><description>&lt;p&gt;現在参入中のプロジェクトでは&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;クライアントサイド&lt;/li&gt;&#10;&lt;li&gt;サーバーサイド&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;がともにJavaScriptでかかれています。&lt;/p&gt;&#10;&lt;p&gt;クライアントサイドがJavaScript、というのはweb系のシステムならブラウザを使用する以上当然かもしれません。&#10;サーバーサードがJavaScriptとはどういうことかというと、 &lt;a href="http://oss.intra-mart.org/projects/im-jssp/"&gt;im-jssp framework&lt;/a&gt; を利用しています。あまり知られていないかもしれません。&#10;仕組みとしては &lt;strong&gt;java servlet container&lt;/strong&gt; が、 &lt;strong&gt;Rhino&lt;/strong&gt; を利用してサーバーに配置された &lt;strong&gt;JavaScript&lt;/strong&gt; ファイルを実行してレスポンスを返す、というもの。これが簡単そうで意外と奥が深い。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;mixin&lt;/li&gt;&#10;&lt;li&gt;クロージャ&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;のような機能はJavaScriptに既に存在していたんですね。&lt;/p&gt;&#10;&lt;p&gt;そういえば現在使用中の &lt;strong&gt;Ubuntu&lt;/strong&gt; でも、&lt;code&gt;apt-get install rhino&lt;/code&gt; を実行すると &lt;strong&gt;Rhino&lt;/strong&gt; がインストールされます。&#10;コマンドから &lt;code&gt;rhino -f file&lt;/code&gt; と打ち込むとクライアント処理をJavaScriptで記述したスクリプトを実行できます。&lt;/p&gt;&#10;&lt;p&gt;会社で &lt;a href="http://www.amazon.co.jp/JavaScript-%E3%83%87%E3%82%A4%E3%83%93%E3%83%83%E3%83%89-%E3%83%95%E3%83%A9%E3%83%8A%E3%82%AC%E3%83%B3/dp/4873110270"&gt;JavaScript&lt;/a&gt; の本を見つけて読んだら、いかに &lt;strong&gt;JavaScript&lt;/strong&gt; を誤解していたかよく分かりました。 &lt;strong&gt;Groovy&lt;/strong&gt; なければ、絶対JavaScriptでスクリプト組んでいたでしょう。&lt;/p&gt;</description></item><item><title>Groovy、Grailsに興味を持っていた人が</title><link>https://genzouw.com/entry/2008/11/09/073700/451/</link><pubDate>Sun, 09 Nov 2008 07:37:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/09/073700/451/</guid><description>&lt;p&gt;先日、12月から新しいプロジェクトに参入のため親会社の方と顔合わせしてきました。&#10;うちの会社からは僕の履歴書、経歴書を持っていったのですが、使える言語にさりげなく&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Grails&lt;/li&gt;&#10;&lt;li&gt;Groovy&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;の記述を。&lt;/p&gt;&#10;&lt;p&gt;使える言語欄を少しでも増やしておこうと思ったのもあるんですがw&lt;/p&gt;&#10;&lt;p&gt;そうしたら、顔合わせ時に「そういえば、僕はこのGroovy、Grailsにかなり目が引かれてねぇ」と言ってくれた方が！&#10;それまでの声のトーンを忘れて、興奮気味にGroovyについて語ってしまいました。なんだかうれしかった！&lt;/p&gt;</description></item><item><title>ほんとだ、Groovyでprivateフィールドにアクセスできる</title><link>https://genzouw.com/entry/2008/11/06/061500/452/</link><pubDate>Thu, 06 Nov 2008 06:15:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/06/061500/452/</guid><description>&lt;p&gt;&lt;strong&gt;クラスのprivateフィールドにアクセスできてしまうよ。&lt;/strong&gt; という記事があったので、 &lt;strong&gt;「そんなことはないだろー」&lt;/strong&gt; と思って試してみると、ほんとだ、書き込めちゃった。&lt;/p&gt;&#10;&lt;p&gt;意外と単純なところに落とし穴があったんですね。&lt;/p&gt;&#10;&lt;p&gt;どうやら、finalキーワードをつけたフィールドにアクセスした場合には、 &lt;code&gt;groovy.lang.ReadOnlyPropertyException&lt;/code&gt; 例外が発生するにはなっているようです。&lt;/p&gt;&#10;&lt;p&gt;ちなみに試したGroovyのバージョンは &lt;strong&gt;1.5.7&lt;/strong&gt; です。&lt;/p&gt;</description></item><item><title>Linuxでyum、apt-getでインストールしたTomcatが正常動作した</title><link>https://genzouw.com/entry/2008/11/05/080300/453/</link><pubDate>Wed, 05 Nov 2008 08:03:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/05/080300/453/</guid><description>&lt;p&gt;母のショッピングサイト管理アプリをmorph appspaceに配置していたのですが、&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;動作が重たい&lt;/li&gt;&#10;&lt;li&gt;30日ごとに再デプロイが必要&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;と、いくつか不満がありました。結局自宅のPCをサーバーにして、管理WEBアプリを立ち上げることに。（もちろんGrails）&lt;/p&gt;&#10;&lt;p&gt;今まで何度かLinux上で &lt;strong&gt;Tomcat&lt;/strong&gt; を動作させようと試みたのですが、 &lt;strong&gt;yum&lt;/strong&gt; や &lt;strong&gt;apt-get&lt;/strong&gt; でインストールした場合にはどうしても正常動作しませんでした。ちなみに &lt;strong&gt;apache&lt;/strong&gt; のサイトからzipをダウンロードしてきて配備下場合には、startup.sh、shutdown.shでアプリが正常動作していました。&lt;/p&gt;&#10;&lt;p&gt;昨日久々にリトライし、ようやく &lt;strong&gt;apt-get&lt;/strong&gt; でインストールしたTomcatが動作しました。対応方法は以下のとおり。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;エディタで/etc/init.d/tomcat6を開く&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;TOMCAT6_SECURITY=yes&lt;/strong&gt; の記述を &lt;strong&gt;no&lt;/strong&gt; に書き換え&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;詳細は分からないですが、 &lt;strong&gt;Tomcat&lt;/strong&gt; がアプリに対して、実行クラスファイルやローカルファイルのアクセスの制御を行っている模様。&#10;これを止めれば取り合えず動作。 &lt;strong&gt;Tomcat&lt;/strong&gt; のこともっと勉強する必要があるなと改めて実感。&lt;/p&gt;&#10;&lt;p&gt;僕と母しか使わないPCだし、これで特に問題はないかな、と思いました。&lt;/p&gt;&#10;&lt;h2 id="追記"&gt;追記&lt;/h2&gt;&#10;&lt;p&gt;実は同時に &lt;strong&gt;OpenJdk&lt;/strong&gt; を使用するようになっていたので、 &lt;strong&gt;sunのjdk&lt;/strong&gt; を使用するようにも書き換えました。こちらのおかげで正常動作するようになった、ということはないと思うのですが、一応メモ。&lt;/p&gt;</description></item><item><title>全然更新で来てない・・・</title><link>https://genzouw.com/entry/2008/11/04/081100/454/</link><pubDate>Tue, 04 Nov 2008 08:11:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/11/04/081100/454/</guid><description>&lt;p&gt;連休中はばたばたしていました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;土曜：千葉からの知人の訪問&lt;/li&gt;&#10;&lt;li&gt;日曜：バドミントンの試合&lt;/li&gt;&#10;&lt;li&gt;月曜：家族サービス&lt;/li&gt;&#10;&lt;li&gt;うちの母親のウェブショップの手伝い&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;結局ブログが全然更新できていません。&lt;/p&gt;&#10;&lt;p&gt;最近仕事で使っているサーバーサイドjavascriptについて書きたかった。&#10;（ &lt;em&gt;出回っているフレームワークがそんなに無いので、何のはなしかは絞り込まれてしまいますね。知っている人は知っているフレームワークだと思います。&lt;/em&gt; ）&lt;/p&gt;</description></item><item><title>Mapのgetメソッドが便利</title><link>https://genzouw.com/entry/2008/10/28/121000/455/</link><pubDate>Tue, 28 Oct 2008 12:10:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/28/121000/455/</guid><description>&lt;p&gt;最近のお昼休みの日課は、近くの紀伊國屋で &lt;strong&gt;Groovy In Action&lt;/strong&gt; を立読みすることです。（購入を検討中）&lt;/p&gt;&#10;&lt;p&gt;読んでて知った。 &lt;strong&gt;Map.get&lt;/strong&gt; メソッドがオーバーロードされているようですが、引数を２つ受け取るタイプのメソッドが便利♪&lt;/p&gt;&#10;&lt;p&gt;例えば&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;てのが&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とかける。こりゃ便利。&lt;/p&gt;&#10;&lt;p&gt;もっとも、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;ret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;と書けばそんなに変わらないかもしれないけどw&lt;/p&gt;</description></item><item><title>Groovy(Java)の正規表現って、前方参照で来たんだね</title><link>https://genzouw.com/entry/2008/10/28/054300/456/</link><pubDate>Tue, 28 Oct 2008 05:43:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/28/054300/456/</guid><description>&lt;p&gt;当然ですが、Groovy(Java)の正規表現も、 &lt;strong&gt;前方参照&lt;/strong&gt; の機能があるんですね。最近、 &lt;strong&gt;String&lt;/strong&gt; の &lt;strong&gt;replaceAll&lt;/strong&gt; メソッドを使用して気づいた。&lt;/p&gt;&#10;&lt;p&gt;例えば、こんなコードがあった場合&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;こんにちわせかいにちげつか&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.((&lt;/span&gt;&lt;span class="n"&gt;にち&lt;/span&gt;&lt;span class="p"&gt;).)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;$1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は &lt;code&gt;こにちわせかにちげつか&lt;/code&gt; となります。&#10;置換対象文字列の括弧の中身は、置換後文字列内から左から$1、$2、&amp;hellip;のように参照可能。&lt;/p&gt;&#10;&lt;p&gt;したがって、以下のコードを実行すると、カッコの中のカッコを参照できます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;こんにちわせかいにちげつか&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.((&lt;/span&gt;&lt;span class="n"&gt;にち&lt;/span&gt;&lt;span class="p"&gt;).)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;$2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行結果は &lt;code&gt;こにちせかにちつか&lt;/code&gt; となります。&lt;/p&gt;&#10;&lt;p&gt;括弧が入れ子になった場合には、開き括弧の出現順に$1、$2と参照可能。&lt;/p&gt;&#10;&lt;p&gt;Groovyの場合はreplaceAllメソッドの第二引数にクロージャ渡すことも可能なので、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.((&lt;/span&gt;&lt;span class="n"&gt;にち&lt;/span&gt;&lt;span class="p"&gt;).)&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;なんてのももちろん出きるけど、簡単な置換は前述の記述の方がスマートかなと思う。&#10;最近、オライリーの正規表現（別名、ふくろう本を読んで知った.。正規表現を一度知ると、何でも正規表現使いたくなってしまう。&lt;/p&gt;&#10;&lt;p&gt;例えば&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groovy&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// any logics&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とかも&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groovy&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;// any logics&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;とか書いてしまう。&lt;/p&gt;</description></item><item><title>僕もどう書く？</title><link>https://genzouw.com/entry/2008/10/24/223400/457/</link><pubDate>Fri, 24 Oct 2008 22:34:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/24/223400/457/</guid><description>&lt;p&gt;以下のエントリに感化されてやってみた。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://ja.doukaku.org/212/"&gt;漢数字で九九の表 どう書く？org&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/nbqx69/20081024#p1"&gt;今日のどう書く - ものすごいハイウエスト日記&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;既にコードが逢ったので、多分に参考にさせてもらいました。&lt;/p&gt;&#10;&lt;p&gt;発見もあっておもしろかった。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Stringオブジェクト&lt;/strong&gt; に &lt;strong&gt;eachメソッド&lt;/strong&gt; あったんだね。配列、マップにしか適用されないと思ってた。勉強になった。&lt;/p&gt;</description></item><item><title>Ubuntu(Linux)上で、Groovyシェルスクリプト</title><link>https://genzouw.com/entry/2008/10/24/063700/458/</link><pubDate>Fri, 24 Oct 2008 06:37:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/24/063700/458/</guid><description>&lt;p&gt;WindowsにGroovyをインストールした場合、自動的に関連付けを行ってくれて端末から&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;groovy Hoge.groovy&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;Hoge.groovy&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;のいずれのコマンドでもHoge.groovyを実行可能です。&lt;/p&gt;&#10;&lt;p&gt;Ubuntu(Linux)では、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy Hoge.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;でしか実行できないのかな？と思っていたのですが、ソースの一行目に以下の一文を書き加えると可能のようです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env /usr/share/groovy/bin/groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;/usr/share/groovy/bin/groovyの部分は自分のgroovyインストールフォルダになります。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;/usr/share/groovy/bin/groovy&lt;/code&gt; に別にシンボリックリンクを張って、そちらを指定してみたのですがそれでは正常に動作しないみたい。（Linuxだと当然なのかな?初心者なので）&lt;/p&gt;&#10;&lt;h2 id="2008-11-09-追記"&gt;&lt;strong&gt;2008-11-09 追記&lt;/strong&gt;&lt;/h2&gt;&#10;&lt;p&gt;どうやら環境変数 &lt;strong&gt;PATH&lt;/strong&gt; が正しく通っていなかったのが原因のようです。&#10;以下の記述でも動作しました。&lt;/p&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cp"&gt;#!/usr/bin/env groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;シェルスクリプトもGroovyでかけるよって感じですね。&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;うろ覚えですが、Windows上で同じスクリプトを実行してみても無視され、問題なく動作するみたいです。&lt;/em&gt;&lt;/p&gt;</description></item><item><title>GroovyでHTMLを整形する・その２</title><link>https://genzouw.com/entry/2008/10/23/121000/459/</link><pubDate>Thu, 23 Oct 2008 12:10:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/23/121000/459/</guid><description>&lt;p&gt;HTML整形スクリプトを改修。 &lt;strong&gt;format&lt;/strong&gt; メソッド（クロージャだけど）にFileオブジェクトを渡すと、フォーマットされたHTMLを返します。&#10;ただし、 &lt;strong&gt;XmlSluper&lt;/strong&gt; は厳密にXMLをチェックするので、正確にはXHTMLしかチェック出来ません。XML整形スクリプトにすればよかったかな。&#10;それから、&lt;code&gt;$nbsp;&lt;/code&gt; などの文字が含まれていた場合にも正常に動作しないようです・・・。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;NO_INNER_TAG_LIST&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;input&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;br&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;link&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;meta&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;hr&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;SPACES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;xmlSlurper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XmlSlurper&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;formatNode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hierarchyNum&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;hierarchyNum&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;SPACES&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;startTag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attributes&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${it.key}=&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;$&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;startTag&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;formatNode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hierarchyNum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;parts&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parts&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NO_INNER_TAG_LIST&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;startTag&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; /&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;startTag&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;trim&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;htmlText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;xmldefText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;htmlStartText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// xml定義やdoctypeを抜いておかないとエラーになるので&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// また、html内部のxmlns設定が消えてしまうので、保存&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;UTF8&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="s"&gt;/((?ms).*)((]*&amp;gt;)(?ms).+)(?ms).*/&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xmldef&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;htmldef&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;htmlstart&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xmldefText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xmldef&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;htmlText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;htmldef&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;htmlStartText&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;htmlstart&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xmlSlurper&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parseText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;htmlText&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xmldefText&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;formatNode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;/]*&amp;gt;/&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;htmlStartText&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/home/genzou/test.html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;今のプロジェクトのHTMLは整形できたので、自分の中でOKとします。&lt;/p&gt;</description></item><item><title>java1.6.0_10が正式リリースされた</title><link>https://genzouw.com/entry/2008/10/22/201500/460/</link><pubDate>Wed, 22 Oct 2008 20:15:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/22/201500/460/</guid><description>&lt;p&gt;java1.6.0_10で頑張って日本語化までさせたのに・・・日本語版はまだリリースされていなかったんですね。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://www.junglejava.jp/archives/2008/10/entry_845.html"&gt;Jungle Java - Java SE 6 Update 10 がリリース&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;ようやく正式リリース。&#10;念のため、もう一度上書きインストールしておいたほうがいいかな。&lt;/p&gt;</description></item><item><title>GroovyでHTMLを整形する…つもりだったけど</title><link>https://genzouw.com/entry/2008/10/22/080500/461/</link><pubDate>Wed, 22 Oct 2008 08:05:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/22/080500/461/</guid><description>&lt;p&gt;仕事でお客様に提示するHTMLを作成中。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;入力不可にしてほしい&lt;/li&gt;&#10;&lt;li&gt;色は緑に&lt;/li&gt;&#10;&lt;li&gt;もうすこし幅を・・・&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;などの要件を盛り込んでいるうちに、HTMLがめちゃくちゃ汚くなってきた。（インデントはない、タグの属性は順序がばらばら。変更が積み重なるうちに、xmlに準拠してなくなってきている気も・・・）&#10;ちょっとだけ &lt;strong&gt;HTML整形スクリプト&lt;/strong&gt; を作ってみた。（正確にはxmlです。&lt;code&gt;XmlSlurper&lt;/code&gt; を使っているので。）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;xmltext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;records&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;car name=&amp;#39;HSV Maloo&amp;#39; make=&amp;#39;Holden&amp;#39; year=&amp;#39;2006&amp;#39;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;lt;country&amp;gt;Australia&amp;lt;/country&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;lt;record type=&amp;#39;speed&amp;#39;&amp;gt;Production Pickup Truck with speed of 271kph&amp;lt;/record&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;/car&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;car name=&amp;#39;P50&amp;#39; make=&amp;#39;Peel&amp;#39; year=&amp;#39;1962&amp;#39;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;lt;country&amp;gt;Isle of Man&amp;lt;/country&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;lt;record type=&amp;#39;size&amp;#39;&amp;gt;Smallest Street-Legal Car at 99cm wide and 59 kg in weight&amp;lt;/record&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;lt;/car&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;lt;car name=&amp;#39;Royale&amp;#39; make=&amp;#39;Bugatti&amp;#39; year=&amp;#39;1931&amp;#39;&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;lt;country&amp;gt;France&amp;lt;/country&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;lt;record type=&amp;#39;price&amp;#39;&amp;gt;Most Valuable Car at $15 million&amp;lt;/record&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;/car&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;lt;/records&amp;gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;spaces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;output&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;attributes&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${it.key}=&amp;#34;&lt;/span&gt; &lt;span class="n"&gt;$&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;()).&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;children&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isEmpty&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;center&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;children&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;spaces&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;/$name&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;center&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt; &amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;/$name&amp;gt;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;node&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;XmlSlurper&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;parseText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xmltext&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="nf"&gt;output&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;自動的にインデントづけ&lt;/li&gt;&#10;&lt;li&gt;タグの属性は、辞書順でソート（これは直した方がよかったかも）&lt;/li&gt;&#10;&lt;li&gt;当然、xmlに準拠しない構造の場合にはエラー&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;面倒くさいけど、 &lt;strong&gt;xmltextの変数部分にbodyをコピペして&lt;/strong&gt; 動かしていました。(ファイル全体を取り込むと、xmlのチェックに引っかかって動かない…)これで正常に動くかと思っていたのですが、正常に整形されるbodyとエラーで整形できないbodyが発生しています。うーーん・・・&lt;/p&gt;</description></item><item><title>jdk1.6.0_10でのGUIアプリ文字化け解消方法</title><link>https://genzouw.com/entry/2008/10/18/182200/462/</link><pubDate>Sat, 18 Oct 2008 18:22:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/18/182200/462/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2008/10/17/120000"&gt;Ubuntuで、Groovyを使って常駐アプリ作る・その２ | ゲンゾウ用ポストイット&lt;/a&gt; で、 &lt;strong&gt;Ubuntu&lt;/strong&gt; 上で &lt;strong&gt;AWT&lt;/strong&gt; 上の文字列が化ける（豆腐：□になってしまう）問題がありました。&lt;/p&gt;&#10;&lt;p&gt;試しに &lt;strong&gt;Windows&lt;/strong&gt; + &lt;strong&gt;jdk1.6.0_10&lt;/strong&gt; で同様のプログラムを動かして見たところ、問題なく動作していました。&lt;/p&gt;&#10;&lt;p&gt;そこで文字化けする原因をもう少し調査してみました。&lt;/p&gt;&#10;&lt;h2 id="swingも化ける"&gt;Swingも化ける？？&lt;/h2&gt;&#10;&lt;p&gt;試しにjdk1.6.0_07で文字化けせずに表示で来ていた &lt;strong&gt;Swing&lt;/strong&gt; をコンパイルして実行。&#10;すると、 &lt;strong&gt;Swing&lt;/strong&gt; アプリも文字化けしていました。&#10;どうやらjdk1.6.0_10の設定（？）がまずそう。&#10;Googleでもう少し調べてみた。&lt;/p&gt;&#10;&lt;h2 id="jdk160_10が怪しい"&gt;Jdk1.6.0_10が怪しい？&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/nekora/20081017/p2"&gt;JDK 1.6.0 u10 - ねこら対策研究要塞日誌＠はてな&lt;/a&gt; ←たまたま、こちらのサイトをRSS購読していて、たまたまわかりました。&lt;/p&gt;&#10;&lt;p&gt;jdk1.6.0_10は最近リリースされた（正式リリースはまだ？）jdkのようです。もしかして、正式に日本語対応ができていない、あるいは不具合の一つなのかな??&#10;&lt;strong&gt;jdk1.6.0_7&lt;/strong&gt; では日本語のフォント設定が正常にできていたのですが、 &lt;strong&gt;jdk1.6.0_10&lt;/strong&gt; でできていないので、もしかしたら &lt;strong&gt;jdk1.6.0_7&lt;/strong&gt; のフォント設定をコピーしたらうまく動くのでは？ということで試してみた。&lt;/p&gt;&#10;&lt;h2 id="jdk160_10で日本語フォント設定"&gt;Jdk1.6.0_10で日本語フォント設定&lt;/h2&gt;&#10;&lt;p&gt;実は設定方法がよくわからなかったので、以下の方法で &lt;strong&gt;1.6.0_7&lt;/strong&gt; から &lt;strong&gt;1.6.0_10&lt;/strong&gt; にフォント設定をコピーしてみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo cp jdk1.6.0_10/jre/lib/fontconfig.properties.src jdk1.6.0_10/jre/lib/fontconfig.properties.src.back&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo cp java-6-sun-1.6.0.07/jre/lib/fontconfig.properties* jdk1.6.0_10/jre/lib/&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行後、Swing、AWTアプリを実行すると・・・できた！&#10;よかった♪&lt;/p&gt;</description></item><item><title>エンティティ設計について僕の意見が少数派だったので意見を述べておきたい</title><link>https://genzouw.com/entry/2008/10/18/120000/463/</link><pubDate>Sat, 18 Oct 2008 12:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/18/120000/463/</guid><description>&lt;h2 id="主キーに業務キー複数キーを利用する設計について"&gt;主キーに業務キー（複数キー）を利用する設計について&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/shin/mobile?date=20081014&amp;amp;section=p1"&gt;しんさん&lt;/a&gt; のブログを見て、ものすごく共感したので一言。&lt;/p&gt;&#10;&lt;p&gt;おそらく、これはHibernate、Rails、Grailsなどを学んだ多くの方が感じていることではないかとおもいます。&#10;僕も、今の職場でデリゲートキーを考慮したエンティティ設計を提案するとかなり叩かれます。「その設計、わかりにくい」とか、「主キーは業務キーにした方が早いのは当然」とか、「項目が多いと保守が大変」とか。&#10;しんさんと言う通り、デリゲートキー（ID）導入するとエンティティ洗い出しやリレーション設計時には、エンティティの詳細情報を後回しに出来ます。抽象的な設計と具体的な設計が綺麗にわけれます。基本設計といわれる工程ですべき作業に注力できます。&lt;/p&gt;&#10;&lt;h2 id="業務キーを主キーにした場合の最悪なケース"&gt;業務キーを主キーにした場合の最悪なケース&lt;/h2&gt;&#10;&lt;p&gt;子テーブルが親テーブルの主キーを引き継ぐ設計で苦しんだことがあります。&lt;/p&gt;&#10;&lt;p&gt;実際にプロジェクトであった話を。&#10;以下のようなテーブルがあります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;テーブルAの主キー : &lt;code&gt;x&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;テーブルBの主キー : &lt;code&gt;x,y&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;テーブルCの主キー : &lt;code&gt;x,y,z&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;テーブルA&lt;/strong&gt; と &lt;strong&gt;テーブルB&lt;/strong&gt; は1:n、 &lt;strong&gt;テーブルB&lt;/strong&gt; と &lt;strong&gt;テーブルC&lt;/strong&gt; は1:nの関係です。&lt;/p&gt;&#10;&lt;p&gt;ここで &lt;strong&gt;テーブルA&lt;/strong&gt; にキー項目aが追加になった場合には、 &lt;strong&gt;テーブルB&lt;/strong&gt; 、 &lt;strong&gt;テーブルC&lt;/strong&gt; にもキー項目aを追加する必要がでてきます。つまり、 &lt;strong&gt;変更に弱い設計になります&lt;/strong&gt; 。&#10;デリゲートキーを使用した設計の場合には &lt;strong&gt;テーブルA&lt;/strong&gt; にキー項目aを追加して終了です。&#10;また別のプロジェクトでは、同様の設計により以下のようになっていました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;テーブルAの主キー : &lt;code&gt;x1, x2, x3, x4&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;テーブルBの主キー : &lt;code&gt;x1, x2, x3, x4,x5&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;テーブルCの主キー : &lt;code&gt;x1, x2, x3, x4,x5,x6&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;キーを何個もつのかと。このように &lt;strong&gt;主キーが無駄に肥大化していく傾向もあります。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="参照整合性制約は張らない設計もあるけどアレはなに"&gt;参照整合性制約は張らない設計もあるけどアレはなに？&lt;/h2&gt;&#10;&lt;p&gt;こちらもよくあるのですが、「参照整合性制約ははらないでください。」という方針。なぜかを尋ねると、「開発が大変だから。」だそうです。あとは考慮することが増えていろいろ面倒だ、とか。&#10;僕には &lt;strong&gt;参照整合性制約&lt;/strong&gt; を張らないほうが考慮することが増える気がするのですが・・・&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;トランデータで参照しようとするマスタがデータが存在しない場合はどうするの？参照されているマスタが削除された場合は？&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;職場のほとんどの方が僕の経験不足を指摘しますが、そういうものなのでしょうか？&lt;/p&gt;</description></item><item><title>Ubuntuで、Groovyを使って常駐アプリ作る・その２</title><link>https://genzouw.com/entry/2008/10/17/120000/464/</link><pubDate>Fri, 17 Oct 2008 12:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/17/120000/464/</guid><description>&lt;p&gt;昨日に引き続き、Ubuntuでクリップボード監視プログラムを作ってみています。&lt;/p&gt;&#10;&lt;p&gt;システムトレイ、クリップボード操作、そもそもGUI(AWT)の実装。分からないことだらけです。&lt;/p&gt;&#10;&lt;p&gt;なんとかクリップボードを常時監視し、コピーorカットされた文字列をアプリのhistory項目に追加出きるようにはなリました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.DataFlavor&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.FlavorListener&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.event.ActionListener&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;SystemTray&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isSupported&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;SystemTray is not supported!&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;toolkit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultToolkit&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SystemTray&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;systemTray&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getImage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;icon.png&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// &amp;lt;&amp;lt;でadd実行可能に。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;menuAdd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;MenuItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;leftShift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;menuAdd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Menu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;leftShift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;menuAdd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PopupMenu&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;leftShift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;menuAdd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SystemTray&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;leftShift&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;menuAdd&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;popup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PopupMenu&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;item1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Menu&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;history&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;item1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addActionListener&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;実装途中&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ActionListener&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;popup&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;item1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;item2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;MenuItem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;setting&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;item2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addActionListener&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;popup action&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ActionListener&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;popup&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;item2&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;popup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addSeparator&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;item3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;MenuItem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;exit&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;item3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addActionListener&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exit&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ActionListener&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;popup&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;item3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;clip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;toolkit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSystemClipboard&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;clip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addFlavorListener&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;recive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContents&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;recive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTransferData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DataFlavor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stringFlavor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;MenuItem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;item1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;FlavorListener&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;TrayIcon&lt;/span&gt; &lt;span class="n"&gt;trayIcon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;TrayIcon&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Clipboard Manager&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;popup&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tray&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;trayIcon&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="問題"&gt;問題&lt;/h2&gt;&#10;&lt;p&gt;MenuItemに日本語を利用すると文字化けしてしまいます…同様にコピーしたときにも日本語が含まれていた場合には履歴情報が文字化けしてしまいます。（GUI上のみ）&lt;/p&gt;</description></item><item><title>Ubuntuで、Groovyを使って常駐アプリ作る・その１</title><link>https://genzouw.com/entry/2008/10/16/234700/465/</link><pubDate>Thu, 16 Oct 2008 23:47:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/16/234700/465/</guid><description>&lt;p&gt;以前も書いたとおり、windowsからubuntuに移行してきたばかりです。&#10;以前しようしていたクリップボード管理アプリが動かないので &lt;strong&gt;gcliper&lt;/strong&gt; を入れてみたのですが、マシン起動時に毎回エラーで落ちてしまいます。&#10;勉強がてら自分で作ってみることにしました。&lt;/p&gt;&#10;&lt;h2 id="system-trayという難易度高めの機能を利用してみる"&gt;System Trayという難易度高め？の機能を利用してみる&lt;/h2&gt;&#10;&lt;p&gt;jdk1.6からは、javaでもSystemTrayという標準クラスを利用して常駐アプリを作成可能のようです。したがってSystemTrayの簡単なアプリから作成してみました。&lt;/p&gt;&#10;&lt;h2 id="早速難題にぶち当たる"&gt;早速難題にぶち当たる&lt;/h2&gt;&#10;&lt;p&gt;簡単なアプリを作成。僕のスキルでは一人で一からは無理なので、 &lt;a href="http://www.02.246.ne.jp/~torutk/javahow2/systemtray.html"&gt;SystemTrayを使う&lt;/a&gt; を参考にさせていただきました。&#10;以下、ソース。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.event.ActionEvent&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.event.ActionListener&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;SystemTray&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isSupported&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;SystemTray is not supported!&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;SystemTray&lt;/span&gt; &lt;span class="n"&gt;tray&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;SystemTray&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSystemTray&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Image&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultToolkit&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getImage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;PopupMenu&lt;/span&gt; &lt;span class="n"&gt;popup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;PopupMenu&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;MenuItem&lt;/span&gt; &lt;span class="n"&gt;defaultItem&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;MenuItem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mustang&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;defaultItem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addActionListener&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="n"&gt;ActionEvent&lt;/span&gt; &lt;span class="n"&gt;ev&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;popup action&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ActionListener&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;popup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;defaultItem&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;TrayIcon&lt;/span&gt; &lt;span class="n"&gt;trayIcon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;TrayIcon&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Tray Demo&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;popup&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;trayIcon&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addActionListener&lt;/span&gt;&lt;span class="o"&gt;({&lt;/span&gt; &lt;span class="n"&gt;ActionEvent&lt;/span&gt; &lt;span class="n"&gt;ev&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;trayIcon action&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ActionListener&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tray&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trayIcon&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;おお、結構簡単じゃん！いける・・・と思ってたのですが・・・まったく動きません。&#10;&lt;strong&gt;SystemTray is not supported!&lt;/strong&gt; と表示されてしまい、どうやら動きません。やはりUbuntuじゃ無理？？&lt;/p&gt;&#10;&lt;h2 id="希望の光"&gt;希望の光&lt;/h2&gt;&#10;&lt;p&gt;もしかしてUbuntu（Linux？）では動かないのかな？？と思って諦めながら調べてみると、 &lt;a href="https://bugs.launchpad.net/ubuntu/+bug/139177"&gt;Bug #139177 is not in Ubuntu: “Java 6 system tray not working in Gutsy Tribe 6”&lt;/a&gt; というサイトにたどり着く。&#10;Java1.6でも、Ubuntuでは動作しないのね。・・・でも最後の書き込みに、「俺は1.6.0_10で動作確認したら動いたよー」という書き込みがありました。&lt;/p&gt;&#10;&lt;p&gt;早速1.6.0_10をインストール、パスを通すと・・・いけた！！&#10;なんかそれっぽいの動きました。すごいよ！！！これでクリップボード管理アプリの第一歩踏み出せたよ！！&lt;/p&gt;</description></item><item><title>grails morph plugin最新版（しばらく動かなくてすみません）</title><link>https://genzouw.com/entry/2008/10/15/073900/466/</link><pubDate>Wed, 15 Oct 2008 07:39:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/15/073900/466/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2008/09/21/214200"&gt;Morph開発専用のプラグインを作ってみよう | ゲンゾウ用ポストイット&lt;/a&gt; で作りかけだった &lt;a href="http://www.morphexchange.com/"&gt;Morph Appspace&lt;/a&gt; を利用したgrailsアプリ開発プラグインを修正しました。&lt;/p&gt;&#10;&lt;p&gt;誰も使ってないだろうなぁと思ってそのままだったのですが、動くように直してほしい、と言う声をありまして、修正した次第です。こんなしょーもないやつが作ったものでも使ってくれる人がいるんだなと思い、感謝です。&#10;僕のPCがふっとんでしまったことを考慮、またソースの指摘事項をいただけるように、 &lt;strong&gt;Google Code プロジェクト&lt;/strong&gt; に配置してみました。情報は以下のとおり。&lt;/p&gt;&#10;&lt;h2 id="プロジェクト"&gt;プロジェクト&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://code.google.com/p/grails-morph-plugin/"&gt;grails-morph-plugin - Google Code&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="プラグインのソース"&gt;プラグインのソース&lt;/h2&gt;&#10;&lt;p&gt;SVNで管理。 以下のコマンドでチェックアウト可能（のはず？）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ svn checkout http://grails-morph-plugin.googlecode.com/svn/trunk/ grails-morph-plugin-read-only&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="プラグインのインストール方法"&gt;プラグインのインストール方法&lt;/h2&gt;&#10;&lt;p&gt;対象プロジェクトで以下のコマンドを実行。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails install-plugin http://grails-morph-plugin.googlecode.com/files/grails-morph-plugin-0.1.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="プラグインの機能について"&gt;プラグインの機能について&lt;/h2&gt;&#10;&lt;p&gt;以下のコマンドを追加&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;grails deploy-morph&lt;/code&gt;（warファイルを &lt;strong&gt;morph appspace&lt;/strong&gt; に配置）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;grails war-and-deploy-morph&lt;/code&gt;（warファイルを作成し、warファイルを &lt;strong&gt;morph appspace&lt;/strong&gt; に配置）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;また、warファイル作成時（ローカルでのアプリ実行時は対象外）には以下の処理を行う。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;web.xmlにmorph appspaceで必要な設定の書き込み&lt;/li&gt;&#10;&lt;li&gt;morph appspace上でメール送信機能を利用するためのbean定義&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;&lt;code&gt;mailSender(org.springframework.mail.javamail.JavaMailSenderImpl)&lt;/code&gt; を利用することが可能。 &lt;strong&gt;morph appspace&lt;/strong&gt; 上ではこれ以外のメール送信操作を許可していないようです。&lt;/p&gt;&#10;&lt;h2 id="必要な設定"&gt;必要な設定&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;プロジェクトルートにmorph_deploy.propertiesを配置（詳しくは &lt;strong&gt;morph appspace&lt;/strong&gt; のマニュアルなどを参照）&lt;/li&gt;&#10;&lt;li&gt;application.properties（morph_deploy.propertiesでも動くとおもいます。）に以下のmorphアカウント設定情報を追加&#10;&lt;ul&gt;&#10;&lt;li&gt;morph.username&lt;/li&gt;&#10;&lt;li&gt;morph.password&lt;/li&gt;&#10;&lt;li&gt;morph.proxyHost &lt;strong&gt;（proxyを使用しないネットワーク環境の場合には不要）&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;morph.proxyPort &lt;strong&gt;（proxyを使用しないネットワーク環境の場合には不要）&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;問題や動かないなどありましたら、ぜひ教えてください。ソースなどの指摘事項も待ってます。&lt;/p&gt;</description></item><item><title>Groovyでどう書く.org</title><link>https://genzouw.com/entry/2008/10/14/121000/467/</link><pubDate>Tue, 14 Oct 2008 12:10:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/14/121000/467/</guid><description>&lt;p&gt;&lt;a href="http://ja.doukaku.org/209/"&gt;タブ区切りデータの処理 どう書く？org&lt;/a&gt; の問題を解いてみた。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;test.csv&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;titles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;split&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 第1カラムの値でデータを昇順にソートする。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 第2カラムと第3カラムをヘッダを含めて入れ替える。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;change&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;titles&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;change&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 第4カラムの値にそれぞれ1を加える。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;gt&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="na"&gt;toInteger&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="n"&gt;titles&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ちょっと汚い。&lt;/p&gt;</description></item><item><title>Groovyで数学問題１</title><link>https://genzouw.com/entry/2008/10/14/055400/468/</link><pubDate>Tue, 14 Oct 2008 05:54:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/14/055400/468/</guid><description>&lt;p&gt;&lt;a href="http://www-section.cocolog-nifty.com/blog/2008/10/project-euler-p.html"&gt;こちらのサイト&lt;/a&gt; で見つけた数学問題をGroovyで解いてみた。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://odz.sakura.ne.jp/projecteuler/index.php?Problem%201"&gt;Problem1 - PukiWiki&lt;/a&gt; の出題内容を参考にしているみたい。&lt;/p&gt;&#10;&lt;h4 id="プログラム"&gt;プログラム&lt;/h4&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;999&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;sum&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="答え"&gt;答え&lt;/h4&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;233168&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Groovy、ちょっとしたプログラム組むにはやっぱり最高。&lt;/p&gt;</description></item><item><title>Griffonで作ったファイル一括置換プログラム公開</title><link>https://genzouw.com/entry/2008/10/13/125600/469/</link><pubDate>Mon, 13 Oct 2008 12:56:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/13/125600/469/</guid><description>&lt;p&gt;&lt;em&gt;まだまだ正式に公開できるほどのものではないので、使用時に問題が発生しても、保証できませんが。&lt;/em&gt;&lt;/p&gt;&#10;&lt;p&gt;ファイルの一括置換プログラムをGriffonで作成しました。&lt;/p&gt;&#10;&lt;p&gt;現時点では &lt;strong&gt;java web start&lt;/strong&gt; で起動可能です。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;プログラムは &lt;a href="http://griffon-replacer.googlecode.com/files/application.jnlp"&gt;こちら&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;ソースは &lt;a href="http://code.google.com/p/griffon-replacer/"&gt;こちら&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;クリック後にGUIプログラムが起動する場合もありますが、起動しない場合には &lt;strong&gt;application.jnlp&lt;/strong&gt; というファイルをダウンロードして、ダブルクリックしてください。それで動くはず。&lt;/p&gt;&#10;&lt;p&gt;もちろん、 &lt;strong&gt;JRE（1.5以上）&lt;/strong&gt; がインストールされていないと動作しません。&lt;/p&gt;&#10;&lt;h2 id="今日のgriffon使用の感想"&gt;今日のGriffon使用の感想&lt;/h2&gt;&#10;&lt;p&gt;やはりまだSwingプログラミングにはなれません。レイアウト調整するだけで &lt;strong&gt;Pane&lt;/strong&gt; ってどうやって使うんだろう？？程度の疑問が発生して作業がとまります。swingの本を図書館から借りて基礎から勉強します。&lt;/p&gt;&#10;&lt;p&gt;もちろんSwingXBuilderの知識も。&lt;/p&gt;</description></item><item><title>子供が生まれると大変なんですね</title><link>https://genzouw.com/entry/2008/10/12/102400/470/</link><pubDate>Sun, 12 Oct 2008 10:24:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/12/102400/470/</guid><description>&lt;p&gt;プライベートなことですが、以前も書いたとおり今月 &lt;strong&gt;長女が生まれました&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;p&gt;嫁が実家に帰っているので、仕事終わりで実家にいって嫁の顔を見たり、長女の面倒を見たりしています。家に帰ってきてはご飯、風呂。朝起きては洗濯、掃除。&#10;一人暮らしの時は当然のようにやっていたことなのに、すっかり嫁に任せっ切りになっていたのだな、と痛感する毎日です。&#10;徐々にリズムがとれてきたら、もう少し毎日の生活も落ち着いてくるのかなとおもいます。&#10;もっとも大変なのは僕よりも嫁の方のはずなので。毎晩、２時間置きにおきてはおちちをあげているそうです。&lt;/p&gt;&#10;&lt;p&gt;恥ずかしいのでこの場を借りて。 &lt;strong&gt;いつもおつかれさま。ありがとう&lt;/strong&gt; 。&lt;/p&gt;</description></item><item><title>Griffonで複数ファイル一括置換GUIアプリ作ってみる</title><link>https://genzouw.com/entry/2008/10/08/080500/471/</link><pubDate>Wed, 08 Oct 2008 08:05:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/08/080500/471/</guid><description>&lt;p&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt; での開発環境もようやく一通りできました。&#10;やはり &lt;strong&gt;Groovy、Grails plugin&lt;/strong&gt; を入れたEclipseで開発していこうと思います。&#10;補完機能は弱いけど、色分けとエラー表示できればOK。&lt;/p&gt;&#10;&lt;h2 id="さっそくアプリを作成する準備"&gt;さっそくアプリを作成する準備&lt;/h2&gt;&#10;&lt;p&gt;Ubuntuを使ってみた感想としては、今までのLinuxディストリビューションよりもはるかにGUIが強いなぁって感じです。&#10;僕みたいなCUI操作苦手な人間には大変使いやすい。&lt;/p&gt;&#10;&lt;p&gt;でも、WindowsほどGUIアプリ多くないのかなともいます。なので、自分が必要なものは人も必要、勉強がてら作ってみよう、という気持ちで、Griffonアプリを作ることにしてみた。&lt;/p&gt;&#10;&lt;h2 id="google-codeにプロジェクト作った"&gt;Google Codeにプロジェクト作った&lt;/h2&gt;&#10;&lt;p&gt;取り急ぎ。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://code.google.com/p/griffon-replacer/"&gt;griffon-replacer&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;もうそのまま。griffonのファイル一括置換ツールです。&lt;/p&gt;&#10;&lt;h2 id="機能"&gt;機能&lt;/h2&gt;&#10;&lt;p&gt;今はフォルダパス、置換前文字列、置換後文字列、エンコードを指定して置換実行する程度。&lt;/p&gt;&#10;&lt;p&gt;エンコードとか、コンボボックスにしたいのだが、swingに不慣れ（webばかりやっていたため・・・）で、コンボボックスひとつ配置するのに右往左往する状態です。&lt;/p&gt;&#10;&lt;p&gt;とりあえずはテキストボックスで配置。&lt;/p&gt;&#10;&lt;p&gt;一応フォルダ内置換はできた！&lt;/p&gt;&#10;&lt;h2 id="今後やりたいこと"&gt;今後やりたいこと&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;サブフォルダを対称にするかどうかを指定可能&lt;/li&gt;&#10;&lt;li&gt;正規表現を使用するかを指定可能&lt;/li&gt;&#10;&lt;li&gt;大文字小文字を区別するかを指定可能&lt;/li&gt;&#10;&lt;li&gt;ファイル名を対称にするかを指定可能&lt;/li&gt;&#10;&lt;li&gt;ファイル名のワイルドカード&lt;/li&gt;&#10;&lt;li&gt;Excel、Word、Ods、Pdfなども処理対象に&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Groovy Eclipse Pluginをもう少し使ってみたよ</title><link>https://genzouw.com/entry/2008/10/06/074400/472/</link><pubDate>Mon, 06 Oct 2008 07:44:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/06/074400/472/</guid><description>&lt;p&gt;&lt;strong&gt;Groovy Eclipse Plugin&lt;/strong&gt; を入れて、数日たちました。全然使い込めていませんが、使用した感想を。&lt;/p&gt;&#10;&lt;h2 id="補完機能について"&gt;補完機能について&lt;/h2&gt;&#10;&lt;p&gt;会社では &lt;strong&gt;Windows&lt;/strong&gt; 、家では &lt;strong&gt;Ubuntu&lt;/strong&gt; を使っております。両者ともおそらくそれほど動作に相違はないはず。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Ubuntu&lt;/strong&gt; で使った感想を。&lt;/p&gt;&#10;&lt;p&gt;補完機能は &lt;strong&gt;変数&lt;/strong&gt; に対しては効きません。例えば &lt;strong&gt;dropTarget&lt;/strong&gt; という変数があったとして、dropまで入力して &lt;code&gt;ctrl&lt;/code&gt;+ &lt;code&gt;space&lt;/code&gt; を押しても候補は表示されません。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1pbnJhAshAzQOGWkbfHtlByPQ7k9lIvV1" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;その代わり、変数名やインスタンスに対して &lt;strong&gt;&amp;quot;.&amp;quot;(ドット)&lt;/strong&gt; を入力した場合にはメソッドの候補が表示されます。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1mwcNHYMVW0jEwuRnCquPUci9yK0J4OoU" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;よくできてるなぁと持ったのは、変数を &lt;strong&gt;クラス名&lt;/strong&gt; または &lt;strong&gt;def&lt;/strong&gt; キーワードのいずれで定義しても、直前に代入されたインスタンスからメソッド候補を表示してくれています。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://docs.google.com/uc?id=1tfQDTSvyIBPg1uxPRIMpkLxsppFGo0u_" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;例えば、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;に対してはFileクラスのメソッド候補を表示してくれますし、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;についてはDateクラスのメソッド候補を表示してくれます。&lt;/p&gt;&#10;&lt;p&gt;また、メソッドとして &lt;strong&gt;getHoge&lt;/strong&gt; 、 &lt;strong&gt;setFoo&lt;/strong&gt; を保持する場合には、このget、setを除外した &lt;strong&gt;hoge&lt;/strong&gt; 、 &lt;strong&gt;foo&lt;/strong&gt; も候補として表示されます。&lt;/p&gt;&#10;&lt;p&gt;難点は&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;やたら重たい。ドットを打ち込んだあとはしばらく時が止まる&lt;/li&gt;&#10;&lt;li&gt;ドットを打ち込んだときにしか補完が走らない&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;2は我慢できるとしても、1はもう少し何とかならないかな。&lt;/p&gt;&#10;&lt;p&gt;Ubuntu環境で僕が使えそうなものはEclipseぐらいなので、もうすこしこれで頑張ってみます。&lt;/p&gt;</description></item><item><title>Groovy Eclipse Pluginを試してみた</title><link>https://genzouw.com/entry/2008/10/02/074100/473/</link><pubDate>Thu, 02 Oct 2008 07:41:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/10/02/074100/473/</guid><description>&lt;p&gt;以前もブログに書きましたが、家のOSを &lt;a href="http://www.ubuntulinux.jp/"&gt;Ubuntu&lt;/a&gt; に変えました。いくつか使用感として気になるところはありましたが、アプリをいくつか追加インストールして今のところは使用しています。&lt;/p&gt;&#10;&lt;p&gt;さて、今まで &lt;strong&gt;Groovy&lt;/strong&gt; 、 &lt;strong&gt;Grails&lt;/strong&gt; はサクラエディタを使って開発していたのですが、当然 &lt;strong&gt;Ubuntu&lt;/strong&gt; では使えません。したがって新しいエディタなり、開発環境を作らなければなりません。&lt;/p&gt;&#10;&lt;h2 id="geditを使ってみる"&gt;geditを使ってみる&lt;/h2&gt;&#10;&lt;p&gt;まずは標準で組み込まれているテキストエディタ &lt;strong&gt;gedit&lt;/strong&gt; を試してみました。&lt;/p&gt;&#10;&lt;p&gt;結果、キーワードがハイライト表示されない。 &lt;strong&gt;html&lt;/strong&gt; や &lt;strong&gt;Java&lt;/strong&gt; などはハイライト表示される。設定方法が不明なので・・・却下。&lt;/p&gt;&#10;&lt;h2 id="emacsを使ってみる"&gt;Emacsを使ってみる&lt;/h2&gt;&#10;&lt;p&gt;Emacs使ってみた。&#10;・・・いいんです。ハイライト表示も &lt;strong&gt;Groovy&lt;/strong&gt; の &lt;strong&gt;emacs&lt;/strong&gt; 設定サイトを見たら、簡単にできました。&lt;/p&gt;&#10;&lt;p&gt;でも・・・キーボード操作がなぁ。コピペとかリドゥとか細かいところがどうしてもなれないし、小指が痛いw。Windowsからの移行では多分に違和感があります。却下。&lt;/p&gt;&#10;&lt;h2 id="eclipse-pluginを使ってみる"&gt;Eclipse Pluginを使ってみる&lt;/h2&gt;&#10;&lt;p&gt;軽いエディタを諦め、Eclipseを使うことにしました。&lt;/p&gt;&#10;&lt;p&gt;まずは &lt;strong&gt;Synaptic&lt;/strong&gt; から、Eclipse追加。問題なくEclipse起動。&lt;/p&gt;&#10;&lt;p&gt;次に、「 &lt;strong&gt;ヘルプ-&amp;gt;ソフトウェア更新-&amp;gt;検索およびインストール&lt;/strong&gt; 」と選択する。ポップアップ画面で、「インストールする新規フィーチャーを検索」を選び、「 &lt;strong&gt;次へ&lt;/strong&gt; 」ボタン。&lt;/p&gt;&#10;&lt;p&gt;「 &lt;strong&gt;新規リモートサイト&lt;/strong&gt; 」ボタンを押して &lt;strong&gt;名前&lt;/strong&gt; に適当に（Groovyとしておいた）、 &lt;strong&gt;url&lt;/strong&gt; には &lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;Groovy - Eclipse Plugin&lt;/a&gt; サイトにかかれているアップデートサイトurlを記述（ &lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;http://dist.codehaus.org/groovy/distributions/update/&lt;/a&gt; ）。「 &lt;strong&gt;次へ&lt;/strong&gt; 」ボタン。&lt;/p&gt;&#10;&lt;p&gt;あとは流れに身を任せていけば（？）インストール完了。&lt;/p&gt;&#10;&lt;h2 id="感想"&gt;感想&lt;/h2&gt;&#10;&lt;p&gt;Grailsプロジェクトが新規作成できるようになっています。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2008/10/eclipse-plugin-01-1024x819.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;でも &lt;strong&gt;新規プロジェクト作成&lt;/strong&gt; はあとで。&#10;&lt;strong&gt;既存のGrailsプロジェクト&lt;/strong&gt; を取り込んでみる。&lt;/p&gt;&#10;&lt;p&gt;&lt;img src="https://genzouw.com/wp-content/uploads/2008/10/eclipse-plugin-02-1024x819.png" alt=""&gt;&lt;/p&gt;&#10;&lt;p&gt;うわ、めちゃ簡単。Eclipse上にエラーも出ませんでした。簡単に動かした感じでは、補完も効きそうです。&lt;/p&gt;</description></item><item><title>長女が生まれました。</title><link>https://genzouw.com/entry/2008/09/30/074200/474/</link><pubDate>Tue, 30 Sep 2008 07:42:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/30/074200/474/</guid><description>&lt;p&gt;先週土曜日、ようやく &lt;strong&gt;長女が生まれました&lt;/strong&gt; 。&lt;/p&gt;&#10;&lt;p&gt;先のブログでも書いたとおり、嫁の祖父がなくなりバタバタが続いていた状態でさらに忙しくなっています。&#10;朝に陣痛がきて、病院にいったところ、 &lt;strong&gt;「今晩あたりまではおそらく出産はないと思う」&lt;/strong&gt; とのことだったので、僕だけ家に戻り、やり残しの仕事を片付けようと奮闘していましたら・・・病院から電話。&#10;「容体が急変しました。もう生まれそうです！！」・・・えっ！話がちがう！立会いがーということで病院まで頑張って走り、 &lt;strong&gt;心臓こわれそうな状態&lt;/strong&gt; で部屋に向かったのですが、既に出産後でした。母子ともに無事だったからよかったんですけどね。&lt;/p&gt;&#10;&lt;p&gt;昨日も仕事終わりにお見舞いに行ってきて、帰って家事をやるともう10時。ふぅ。 &lt;strong&gt;groovy&lt;/strong&gt; や &lt;strong&gt;grails&lt;/strong&gt; 、 &lt;strong&gt;griffon&lt;/strong&gt; のレビュー、もっと書きたい。&lt;/p&gt;</description></item><item><title>Morph AppSpace利用時には、jdkのバージョンに注意</title><link>https://genzouw.com/entry/2008/09/27/130000/475/</link><pubDate>Sat, 27 Sep 2008 13:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/27/130000/475/</guid><description>&lt;p&gt;最近ほんとにmorphのネタしか書いてないですが。かなり前に引っかかったので、メモ。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://panel.mor.ph/"&gt;Morph Appspace&lt;/a&gt;サーバーを利用する際には、&lt;span style="color: #0000ff;"&gt;&lt;strong&gt;jdkのバージョン&lt;/strong&gt;&lt;/span&gt;に注意。&lt;/p&gt;&#10;&lt;p&gt;具体的には、どうやらサーバー上は&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;java1.5バージョン&lt;/strong&gt;&lt;/span&gt;で動作している模様。したがって&lt;span style="color: #ff6600;"&gt;&lt;strong&gt;java1.6バージョン&lt;/strong&gt;&lt;/span&gt;を使用したりしていた場合には、バージョン違いのエラーが発生してしまうことがある。&lt;/p&gt;&#10;&lt;p&gt;どうやら以下のケースで発生する模様。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;java1.6の構文を利用している。&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;他pluginを使用している。（i18n-templatesは大丈夫っぽい。acegiやquartzはだめだった）&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/blockquote&gt;&#10;&lt;p&gt;プラグインを使用していた場合でも、&lt;strong&gt;jdk1.5&lt;/strong&gt;で&lt;strong&gt;コンパイル-&amp;gt;war作成-&amp;gt;アップ&lt;/strong&gt;すると、問題なく動作しました。&lt;/p&gt;</description></item><item><title>morph-pluginのレビューするよ</title><link>https://genzouw.com/entry/2008/09/27/000600/476/</link><pubDate>Sat, 27 Sep 2008 00:06:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/27/000600/476/</guid><description>&lt;p&gt;ようやく &lt;a href="http://code.google.com/p/morphplugin/"&gt;morphplugin - Google Code&lt;/a&gt; のソースレビューをしました。&#10;教えていただいてから開始するまでに時間がかかってしまった。&lt;/p&gt;&#10;&lt;p&gt;ソースを見たところ・・・意外に機能が少ない。&lt;/p&gt;&#10;&lt;p&gt;どうやら、このプラグインは &lt;code&gt;grails war&lt;/code&gt; コマンド実行時に、 &lt;code&gt;web.xml&lt;/code&gt; の要素としてメールセッション情報を追加するだけのようでした。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MorphGrailsPlugin&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;dependsOn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[:]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Daniel Latorre&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;authorEmail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;danilat83@gmail.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;doWithWebDescriptor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;xml&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;grails.env&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;production&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;resourceRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;resource-ref&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;resourceRef&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;description&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Morphlabs Datasource&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;res-ref-name&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;jdbc/morph-ds&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;res-type&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;javax.sql.DataSource&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;res-auth&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Container&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;意外と &lt;a href="https://genzouw.com/entry/2008/09/21/214200"&gt;Morph開発専用のプラグインを作ってみよう | ゲンゾウ用ポストイット&lt;/a&gt; でやろうとしている機能のほうが機能的に豊富かも。やっぱりプラグイン開発してみようかな。&lt;/p&gt;</description></item><item><title>ばたばたした数日間</title><link>https://genzouw.com/entry/2008/09/26/235000/477/</link><pubDate>Fri, 26 Sep 2008 23:50:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/26/235000/477/</guid><description>&lt;p&gt;&lt;strong&gt;ばたばたしていて、ブログを書けずにいました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;私事ですが、嫁が妊娠しており、ただし出産予定日を二週間以上すぎていました。いつくるか、いつくるかと思って待っていました。&lt;/p&gt;&#10;&lt;p&gt;水曜日、仕事中に嫁から電話。 &lt;strong&gt;「お！！ついに！！」&lt;/strong&gt; と電話にでたところ、陣痛ではなく嫁の祖父がなくなったとのことでした。&lt;/p&gt;&#10;&lt;p&gt;水曜日の晩から木曜の朝にかけてはPC修理（結局、 &lt;strong&gt;Ubuntu&lt;/strong&gt; をインストールしました。めちゃくちゃ使いやすい！）、木曜日はお通夜などでばたばたしており、金曜は葬儀に出席予定だったのですが、夜中の２時ぐらいから嫁の陣痛・・・病院へ（結局、 &lt;em&gt;前駆陣痛&lt;/em&gt; ということで出産はまだ）。&lt;/p&gt;&#10;&lt;p&gt;帰ってきて、ようやくPCセットアップの残りを終えて一息ついたところです。今から &lt;strong&gt;morph-plugin&lt;/strong&gt; のレビューを書きます。&lt;/p&gt;</description></item><item><title>パソコンが　こわれてしまって　Fedora８</title><link>https://genzouw.com/entry/2008/09/23/201400/479/</link><pubDate>Tue, 23 Sep 2008 20:14:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/23/201400/479/</guid><description>&lt;p&gt;&lt;strong&gt;パソコン&lt;/strong&gt; が壊れてしまいました。&lt;/p&gt;&#10;&lt;p&gt;正確にいうと &lt;strong&gt;うちの母のパソコン&lt;/strong&gt; が壊れてしまいました。うちの母は実家でアンティークショップを経営しているのですが、オークションやウェブショップでも販売しているため、パソコンがこわれてはお客さんにも連絡がとれず、一大事。&lt;/p&gt;&#10;&lt;p&gt;昨日は仕事を午前中で終わることができたので、急いで日本橋にいき、代用品を購入してきました。色々あり、僕の家でのパソコンも購入してきました。&lt;/p&gt;&#10;&lt;h2 id="意外と時間がかかった"&gt;意外と時間がかかった&amp;hellip;&lt;/h2&gt;&#10;&lt;p&gt;さて、早速OSインストール。母さんのPCはライセンスが一つだけ残っていたため &lt;strong&gt;Windows XP&lt;/strong&gt; をインストール。僕のは…あ、OS残ってない。家にあったOSは &lt;strong&gt;Fedora6&lt;/strong&gt; がたまたまあったので、こちらで代用することにしました。（本当は &lt;a href="http://www.ubuntulinux.jp/"&gt;Ubuntu&lt;/a&gt; を使いたかったんですが、何分急ぎということで。）&#10;母さんのPCセットアップは終了。実家が青森なので電話できるように &lt;a href="http://www.skype.com/intl/ja/welcomeback/"&gt;Skype&lt;/a&gt; 、テレビ電話できるようにウェブカメ、トラブルが起こったときに遠隔地で習性できるように &lt;a href="http://www.tightvnc.com/"&gt;TightVNC&lt;/a&gt; など、いろいろセットアップしておきました。&lt;/p&gt;&#10;&lt;p&gt;問題は僕のPCの方ですが、あまりLinuxは使ったことがないし、ましてや家のメインマシンにするなど始めてなので不安がいっぱいでした。インストール後は &lt;strong&gt;yum update&lt;/strong&gt; を地道に繰り返し、なんとか &lt;strong&gt;Fedora8&lt;/strong&gt; がXwindowで動作するようになりました。&lt;/p&gt;&#10;&lt;p&gt;せっかく教えていただいた &lt;strong&gt;grails-morphプラグイン&lt;/strong&gt; を試してみたかったのに。&lt;/p&gt;&#10;&lt;h2 id="一言"&gt;一言&lt;/h2&gt;&#10;&lt;p&gt;ブログは以前作成したgrails版HTMLエディタで何とかしていくとしても、Windowsで主として使っていた桜エディタが使えないのが痛い…手に馴染んでいるだけに。いい機会なので &lt;strong&gt;NetBean&lt;/strong&gt; つかってみようと思っている。&lt;/p&gt;</description></item><item><title>なんかわからないけどMorphのアプリがエラー</title><link>https://genzouw.com/entry/2008/09/22/213700/480/</link><pubDate>Mon, 22 Sep 2008 21:37:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/22/213700/480/</guid><description>&lt;p&gt;今日の朝に &lt;a href="http://www.morphexchange.com/"&gt;Morph eXchange&lt;/a&gt; 上&#10;のアプリを開こうとしたら・・・エラーが出て開けませんでした。どうやらシステ&#10;ムが落ちてしまっている模様。 &lt;strong&gt;なせ？？&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;１つのアカウント上に &lt;strong&gt;４つのアプリ（４つのwarファイル）&lt;/strong&gt; を配置して使用しているのですが、負荷をかけすぎたためなのでしょうか？&lt;/p&gt;&#10;&lt;p&gt;不思議なのは、４つのアプリのうち、１つだけは問題なく動作し続けていたこと。&#10;３つはWEB上で公開しているため、もしかしたら外部からのアクセス負荷により落ちてしまったのかな？&#10;&lt;a href="http://www.morphexchange.com/"&gt;Morph eXchange&lt;/a&gt; は便利なので、有料版を使用したら落ちたりしなくなるのかな。&lt;/p&gt;&#10;&lt;h2 id="追記"&gt;追記&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;21:30現在、なぜか何もしていないのに復活しました。Morph側の問題なのかな？？原因は不明・・・&lt;/li&gt;&#10;&lt;li&gt;それから、 &lt;a href="http://www.blogger.com/profile/16588768365952458259"&gt;Yamamoto&lt;/a&gt; さんが &lt;a href="http://code.google.com/p/morphplugin/"&gt;Morphを使用した開発支援用のプラグイン&lt;/a&gt; について教えてくれました。危うく車輪の再発明をしてしまうところでした。明日あたり早速レビューしてみます！！&lt;/li&gt;&#10;&lt;/ul&gt;</description></item><item><title>Morph開発専用のプラグインを作ってみよう</title><link>https://genzouw.com/entry/2008/09/21/214200/481/</link><pubDate>Sun, 21 Sep 2008 21:42:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/21/214200/481/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2008/09/18/221900"&gt;Grails開発用に、開発支援プラグイン作ってみたよ | ゲンゾウ用ポストイット&lt;/a&gt; で取り上げた開発支援用のプラグインですが、 &lt;a href="http://www.morphexchange.com/"&gt;Morph eXchange&lt;/a&gt; を使用した開発のニーズが増えてきているようなので、専用プラグインとして作成して見ようと思っています。&lt;/p&gt;&#10;&lt;h2 id="機能"&gt;機能&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;grails deploy-morph&lt;/code&gt; コマンド以外は、今回作ってみたものです。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;grails deploy-morph&lt;/code&gt; コマンド（ &lt;a href="http://www.morphexchange.com/"&gt;Morph eXchange&lt;/a&gt; にアップロード、デプロイ）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;grails war&lt;/code&gt; コマンド強化機能&#10;&lt;ul&gt;&#10;&lt;li&gt;war作成時に、 &lt;strong&gt;web.xml&lt;/strong&gt; にメールセッション情報を追加&lt;/li&gt;&#10;&lt;li&gt;war作成時に、spring管理beanとして &lt;strong&gt;mailSession、mailSender&lt;/strong&gt; ビーンを追加&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;h4 id="プラグイン名"&gt;&lt;strong&gt;プラグイン名&lt;/strong&gt;&lt;/h4&gt;&#10;&lt;p&gt;&lt;del&gt;morph-utilities&lt;/del&gt;&#10;&lt;strong&gt;morph-plugin&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h4 id="コーディング"&gt;コーディング&lt;/h4&gt;&#10;&lt;p&gt;&lt;code&gt;DeployMorph.groovy&lt;/code&gt; ファイルは、以前のブログで作ったものを利用しました。&lt;/p&gt;&#10;&lt;p&gt;&lt;del&gt;&lt;code&gt;MorphUtilitiesGrailsPlugin.groovy&lt;/code&gt;&lt;/del&gt; &lt;code&gt;MorphPluginGrailsPlugin.groovy&lt;/code&gt; ファイルには、以下のように記述しました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;grails.util.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.codehaus.groovy.grails.commons.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.springframework.mail.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MorphPluginGrailsPlugin&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;dependsOn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[:]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;author&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;genzou&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;authorEmail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;genzouw@gmail.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Plugin summary/headline&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;This plugin help you to develop the application on the morph appspace.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// URL to the plugin&amp;#39;s documentation&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;documentation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;http://code.google.com/p/grails-morph-plugin/&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;doWithSpring&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GrailsUtil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GrailsApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ENV_PRODUCTION&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mailSession&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;springframework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;jndi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JndiObjectFactoryBean&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;jndiName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;java:/comp/env/mail/Session&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mailSender&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;springframework&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;javamail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;JavaMailSenderImpl&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mailSession&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;doWithApplicationContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;applicationContext&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// TODO Implement post initialization spring config (optional)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;doWithWebDescriptor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;xml&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GrailsUtil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;GrailsApplication&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ENV_PRODUCTION&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;servlets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xml&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;servlet&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;servlets&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;servlets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;resource-ref&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Morphlabs Mail Session&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;res-ref-name&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mail/Session&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;res-type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;javax.mail.Session&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;res-auth&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Container&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;doWithDynamicMethods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// TODO Implement registering dynamic methods to classes (optional)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;onChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// TODO Implement code that is executed when any artefact that this plugin is&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// watching is modified and reloaded. The event contains: event.source,&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// event.application, event.manager, event.ctx, and event.plugin.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;onConfigChange&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;event&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// TODO Implement code that is executed when the project configuration changes.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// The event is the same as for &amp;#39;onChange&amp;#39;.&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;実行時のパラメータによって、web.xml、springに情報を設定するかしないかを判断しています。&#10;これにより、warファイル作成時にのみ実行されるようになります。&lt;/p&gt;</description></item><item><title>Grails SyntaxHighlighter Pluginで、コードをhtml化するアプリを作ったよ</title><link>https://genzouw.com/entry/2008/09/20/071600/483/</link><pubDate>Sat, 20 Sep 2008 07:16:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/20/071600/483/</guid><description>&lt;p&gt;今日も &lt;strong&gt;Grails&lt;/strong&gt; です。&lt;/p&gt;&#10;&lt;h2 id="余談"&gt;余談&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;griffon&lt;/strong&gt; についてもいろいろ試してみたりしたいのですが、家のCPU:1.6GHz、メモリ：512MBマシンでは、 &lt;strong&gt;Griffon&lt;/strong&gt; のコンパイルなどで悲鳴が聞こえてきます。世界がとまります。&lt;/p&gt;&#10;&lt;p&gt;したがって同じぐらいのスペックのlinuxマシン上で、ssh経由で &lt;code&gt;grails war&lt;/code&gt; や &lt;code&gt;grails run-app&lt;/code&gt; しています。これだともうちょっと低スペックマシンでも快適に開発できそう。&lt;/p&gt;&#10;&lt;h4 id="今回の料理名"&gt;今回の料理名&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://gstudy.morphexchange.com/sourceCode/create"&gt;ソースコードをハイライト化するアプリ&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="材料"&gt;材料&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Grails&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="作り方"&gt;作り方&lt;/h4&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;a href="http://docs.codehaus.org/display/GRAILS/SyntaxHighlighter+Plugin"&gt;SyntaxHighlighter Plugin&lt;/a&gt; をインストール&lt;/li&gt;&#10;&lt;li&gt;必須ではないけど、日本語化させるなら &lt;a href="http://grails.org/I18n+Templates+Plugin"&gt;I18n Templates Plugin&lt;/a&gt; （これについては説明を省く）&lt;/li&gt;&#10;&lt;li&gt;Domainクラス作成&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;grails generate-all&lt;/code&gt; でview、controller作成&lt;/li&gt;&#10;&lt;li&gt;viewをちょこっと触る。&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://docs.codehaus.org/display/GRAILS/SyntaxHighlighter+Plugin"&gt;SyntaxHighlighter Plugin&lt;/a&gt; のjs、cssをｺﾋﾟｰ&lt;/li&gt;&#10;&lt;li&gt;起動！&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h4 id="手順１"&gt;手順１&lt;/h4&gt;&#10;&lt;p&gt;&lt;code&gt;grails install-plugin syntax-highlighter&lt;/code&gt; しろと書かれているので、実行。プラグインが追加される。&lt;/p&gt;&#10;&lt;h4 id="手順２"&gt;手順２&lt;/h4&gt;&#10;&lt;p&gt;省略します。&lt;/p&gt;&#10;&lt;h4 id="手順３"&gt;手順３&lt;/h4&gt;&#10;&lt;p&gt;２つ作ってみた。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;ProgramingLanguage.groovy&lt;/li&gt;&#10;&lt;li&gt;SourceCode.groovy&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ProgramingLanguage&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; static hasMany = [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; static belongsTo = [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;jsCode&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Date&lt;/span&gt; &lt;span class="n"&gt;dateCreated&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Date&lt;/span&gt; &lt;span class="n"&gt;lastUpdated&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;constraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;blank:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;unique:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;jsCode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;blank:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;unique:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dateCreated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;editable:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lastUpdated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;editable:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SourceCode&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; static hasMany = [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;belongsTo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;language:&lt;/span&gt; &lt;span class="n"&gt;ProgramingLanguage&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Boolean&lt;/span&gt; &lt;span class="n"&gt;gutter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Boolean&lt;/span&gt; &lt;span class="n"&gt;controls&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Boolean&lt;/span&gt; &lt;span class="n"&gt;collapse&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Integer&lt;/span&gt; &lt;span class="n"&gt;firstLine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Boolean&lt;/span&gt; &lt;span class="n"&gt;showColumns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Boolean&lt;/span&gt; &lt;span class="n"&gt;escapeXml&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Date&lt;/span&gt; &lt;span class="n"&gt;dateCreated&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Date&lt;/span&gt; &lt;span class="n"&gt;lastUpdated&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;constraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;language&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;blank:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;maxSize:&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;gutter&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;controls&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;collapse&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;firstLine&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;showColumns&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;escapeXml&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dateCreated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;display:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lastUpdated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;display:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="手順４"&gt;手順４&lt;/h4&gt;&#10;&lt;p&gt;省略します。そのまま。&lt;/p&gt;</description></item><item><title>Grails RichUIがすばらしすぎる件について</title><link>https://genzouw.com/entry/2008/09/19/120500/484/</link><pubDate>Fri, 19 Sep 2008 12:05:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/19/120500/484/</guid><description>&lt;p&gt;なんというか・・・もう悲しくなります。&lt;/p&gt;&#10;&lt;p&gt;今まで僕が一生懸命作ってきた&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;autoComplete機能&lt;/li&gt;&#10;&lt;li&gt;タブ機能&lt;/li&gt;&#10;&lt;li&gt;HTMLエディタ機能&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;っていったいなんだったんだよ！！という気分。&lt;/p&gt;&#10;&lt;p&gt;いつものMorph Appspaceに配置した &lt;a href="http://gstudy.morphexchange.com/blogEntry/create"&gt;こちらのアプリ&lt;/a&gt; を見てください。これ、15分程度で完成しました・・・・。別に僕がすごいわけでも何でもなく、 &lt;strong&gt;Grails&lt;/strong&gt; と &lt;a href="http://docs.codehaus.org/display/GRAILS/RichUI+Plugin#RichUIPlugin-RichTextEditor"&gt;RichUI Plugin&lt;/a&gt; がすごすぎなわけです。&lt;/p&gt;&#10;&lt;h2 id="その１"&gt;その１&lt;/h2&gt;&#10;&lt;p&gt;まずはDomainクラスを作成。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;class BlogEntry &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /*&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; static &lt;span class="nv"&gt;hasMany&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; /*&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; static &lt;span class="nv"&gt;belongsTo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; */&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; String title&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; String content&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Date dateCreated&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Date lastUpdated&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; static &lt;span class="nv"&gt;constraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; title&lt;span class="o"&gt;(&lt;/span&gt;blank:false&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; content&lt;span class="o"&gt;(&lt;/span&gt;blank:false, maxSize:8000&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; dateCreated&lt;span class="o"&gt;(&lt;/span&gt;editable:false&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lastUpdated&lt;span class="o"&gt;(&lt;/span&gt;editable:false&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="その２"&gt;その２&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;grails install-plugin richui&lt;/code&gt; コマンドで、プラグインをインストール&lt;/p&gt;&#10;&lt;h2 id="その３"&gt;その３&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;grails generate-all blogEntry&lt;/code&gt; コマンドで、controller、viewを作成&lt;/p&gt;&#10;&lt;p&gt;（余談ですが、 &lt;strong&gt;i18n-template&lt;/strong&gt; プラグインも使用しているため、生成された画面などは日本語となっています。）&lt;/p&gt;</description></item><item><title>mkawa.xmldo: GrailsアプリをMorph AppSpaceで動かしてみる</title><link>https://genzouw.com/entry/2008/09/19/064300/485/</link><pubDate>Fri, 19 Sep 2008 06:43:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/19/064300/485/</guid><description>&lt;p&gt;&lt;a href="http://mkawablog.blogspot.com/2008/09/grailsmorph-appspace.html#links"&gt;mkawaさんのブログ&lt;/a&gt; を見て、Morph AppSpaceサーバーの利用方法が &lt;a href="http://www.atmarkit.co.jp/index.html"&gt;＠IT - アットマーク・アイティ&lt;/a&gt; に掲載されていることを知りました。&lt;/p&gt;&#10;&lt;p&gt;なるほど。わざわざ英語読んで踏ん張らなくてもよかったんだ・・・くやしぃ。&lt;/p&gt;&#10;&lt;h2 id="追記"&gt;追記&lt;/h2&gt;&#10;&lt;p&gt;最近、上記の記事を書かれている &lt;a href="http://www.kronos-jp.net/"&gt;株式会社クロノス&lt;/a&gt; さんのもと社員の方とご飯を食べにいってきました。びしっとした雰囲気の方でした。&#10;宣伝じゃないですが &lt;a href="http://www.kronos-jp.net/"&gt;株式会社クロノス&lt;/a&gt; さんはよく@ITで記事を拝見させてもらっていました。&#10;&lt;strong&gt;あの豆蔵を超える！東の豆蔵、西のクロノス！&lt;/strong&gt; と呼ばれるべく日々上を目指していく会社とのことでした。関西の会社だったとは。&lt;/p&gt;&#10;&lt;p&gt;定期的に勉強会を開いているということなので、一度お邪魔してみようかな。働いてみたいかも。&lt;/p&gt;</description></item><item><title>Grails開発用に、開発支援プラグイン作ってみたよ</title><link>https://genzouw.com/entry/2008/09/18/221900/486/</link><pubDate>Thu, 18 Sep 2008 22:19:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/18/221900/486/</guid><description>&lt;p&gt;こちらの記事に感化され、Grailsで自分用プラグインを作成してみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://d.hatena.ne.jp/fits/20080703/1215107047"&gt;Grails プラグインの作り方 - シンプルな easyb 実行プラグインを作成 - なんとなくな Developer のメモ&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="機能"&gt;機能&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;graisl create-domain-class&lt;/code&gt; コマンドで作成されるDomainクラス（毎回記述する固定プロパティを追加）&lt;/li&gt;&#10;&lt;li&gt;&lt;a href="http://www.morphexchange.com/"&gt;Morph eXchange&lt;/a&gt; にアップロード、デプロイするための &lt;code&gt;grails deploy-morph&lt;/code&gt; コマンド&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;grails generate-all&lt;/code&gt; コマンド実行時に、すでにcontroller、viewが存在した場合上書きをするかを聞かれるが、面倒なので強制生成する &lt;code&gt;graisl generate-all-force&lt;/code&gt; コマンド&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="インストール"&gt;インストール&lt;/h2&gt;&#10;&lt;p&gt;対象プロジェクトで、以下のコマンドを実行。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ grails install-plugin http://genzouw.googlepages.com/grails-development-utilities-0.1.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="機能１について"&gt;機能１について&lt;/h2&gt;&#10;&lt;p&gt;通常は空のDomainクラスが作成されますが、いくつかプロパティが追加されたソースが生成されます。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@artifact.package@class&lt;/span&gt; &lt;span class="nd"&gt;@artifact.name&lt;/span&gt;&lt;span class="err"&gt;@&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; static hasMany = [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; static belongsTo = [&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Date&lt;/span&gt; &lt;span class="n"&gt;dateCreated&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Date&lt;/span&gt; &lt;span class="n"&gt;lastUpdated&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;constraints&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dateCreated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;editable:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lastUpdated&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;editable:&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;僕がGrailsアプリを作成しているときは大抵以下のプロパティは必須としています。したがって、それらを出力内容に追加しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;dateCreated&lt;/li&gt;&#10;&lt;li&gt;lastUpdated&lt;/li&gt;&#10;&lt;li&gt;hasMany&lt;/li&gt;&#10;&lt;li&gt;belongTo&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="機能２について"&gt;機能２について&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://www.morphexchange.com/"&gt;Morph eXchange&lt;/a&gt; サーバーは無料でGrailsアプリを配置できるサーバーですが、ここでは導入方法は割愛します。（要望があれば投稿しますね・・・）&#10;実行するためには、 &lt;code&gt;application.properties&lt;/code&gt; ファイルに以下の２つの設定を追記します。（それぞれ、morphで使用するユーザー名、パスワードです。）&lt;/p&gt;</description></item><item><title>関西でも、Groovy、Grailsの勉強会をしませんか！？</title><link>https://genzouw.com/entry/2008/09/18/121500/487/</link><pubDate>Thu, 18 Sep 2008 12:15:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/18/121500/487/</guid><description>&lt;p&gt;&lt;em&gt;関東圏&lt;/em&gt;* では、Groovy、Grailsの勉強会、結構あるみたいですね。&#10;&lt;strong&gt;関西圏&lt;/strong&gt; ではぜんぜんありません。&lt;/p&gt;&#10;&lt;p&gt;この状況を打破すべく？？ &lt;strong&gt;関西でもGroovy、Grailsの勉強をしたい&lt;/strong&gt; と思っています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;どこでやるのか？？&lt;/li&gt;&#10;&lt;li&gt;どんな内容をやるのか？？&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;は一切決まっていませんが、ぜひやりたいです。&lt;/p&gt;&#10;&lt;p&gt;興味がある方は、ゲンゾウに連絡ください！！&lt;/p&gt;&#10;&lt;p&gt;&lt;em&gt;人が集まらずに流れるかなー…&lt;/em&gt;&lt;/p&gt;</description></item><item><title>プログラムの勉強には、どう書く？orgでモノを作ってみるとよいよ</title><link>https://genzouw.com/entry/2008/09/18/072800/488/</link><pubDate>Thu, 18 Sep 2008 07:28:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/18/072800/488/</guid><description>&lt;p&gt;最近は投稿をサボっていますが、ちょっと前まではこちらのサイトでプログラム作りの練習を常にしていました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://ja.doukaku.org/"&gt;どう書く？org&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;とても勉強になります。&#10;他の方のソースを見ると、目からうろこです。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;「僕は30行もがりがり書いたのに、3行かよ・・・」みたいな感覚になります。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;（もちろん言語ごとの特性もありますけれどね。）&lt;/p&gt;&#10;&lt;p&gt;業務などで作っているプログラムも、同じようにいかに簡潔に書くか、ということに注意したいですね。&lt;/p&gt;</description></item><item><title>Griffonのwebstartでは、やっぱり絶対パス指定が必要</title><link>https://genzouw.com/entry/2008/09/17/072900/489/</link><pubDate>Wed, 17 Sep 2008 07:29:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/17/072900/489/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2008/09/16/230400"&gt;Griffonでは、作成直後のプロジェクトはサーバー配置しても動かないよ | ゲンゾウ用ポストイット&lt;/a&gt; でも書いたのですが、 &lt;strong&gt;Config.groovy&lt;/strong&gt; の &lt;strong&gt;codebase&lt;/strong&gt; に相対パス設定が可能か？？ ということで、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;codebase&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;で動作させてみた。&lt;/p&gt;&#10;&lt;p&gt;結果、 &lt;code&gt;griffon package&lt;/code&gt; したプログラムは一切動かなかった(笑)&#10;ここはwebの配置場所を必ず絶対パスで指定する必要があるみたい。&lt;/p&gt;&#10;&lt;h2 id="今後の課題"&gt;今後の課題&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;java web start&lt;/strong&gt; についても勉強不足なので、また勉強する必要がある。&lt;/p&gt;&#10;&lt;p&gt;でもJavaのデスクトップアプリ設計、開発案件があまりないので、投資しただけのリターンがあるかどうか不安で、今まで別の勉強に時間を割いてきた。&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>Griffonでは、作成直後のプロジェクトはサーバー配置しても動かないよ</title><link>https://genzouw.com/entry/2008/09/16/230400/490/</link><pubDate>Tue, 16 Sep 2008 23:04:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/16/230400/490/</guid><description>&lt;p&gt;&lt;strong&gt;Griffon&lt;/strong&gt; で実行したアプリが動作しない原因についてわかりました。&#10;やはり &lt;strong&gt;griffon create-app&lt;/strong&gt; コマンド実行直後のプロジェクトは、各種設定が絶対パスで設定されていました。&lt;/p&gt;&#10;&lt;p&gt;設定は &lt;strong&gt;%PROJECT_HOME%/griffon-app/conf/Config.groovy&lt;/strong&gt; に設定されています。&lt;/p&gt;&#10;&lt;p&gt;ファイル内の&#10;&lt;em&gt;griffon&lt;/em&gt; → &lt;em&gt;webstart&lt;/em&gt; → &lt;em&gt;codebase&lt;/em&gt; の設定が、&#10;デフォルトでは&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;codebase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${new File(griffon.jars.destDir).toURI().toASCIIString()}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;となっていますがここを適宜変更すればＯＫのようです。&#10;とりあえずサーバーの配置絶対パスを指定したところ、問題なく動作しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://genzouw.googlepages.com/application.jnlp"&gt;設定変更後に正常動作したGriffonサンプル&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="今後の課題"&gt;今後の課題&lt;/h2&gt;&#10;&lt;p&gt;相対パス指定時にも動作するか、また試してみる。&#10;たとえば、 &lt;code&gt;codebase = &amp;quot;.&amp;quot;&lt;/code&gt; で動作するか？？&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;</description></item><item><title>Griffon（GrailsライクのJavaデスクトップアプリフレームワーク）</title><link>https://genzouw.com/entry/2008/09/15/225500/491/</link><pubDate>Mon, 15 Sep 2008 22:55:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/09/15/225500/491/</guid><description>&lt;p&gt;ずっとGroovyのサブプロジェクトを見てきたのですが、興味を持って待っていたプロジェクトの成果物がようやく公開されました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://docs.codehaus.org/display/GROOVY/Griffon"&gt;Griffon&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;p&gt;実際に &lt;a href="http://docs.codehaus.org/display/GROOVY/Griffon+Quick+Start"&gt;Griffon Quick Start&lt;/a&gt; を参考に、デスクトップアプリを作成してみました。&lt;/p&gt;&#10;&lt;h2 id="griffonのインストール"&gt;&lt;a href="http://docs.codehaus.org/display/GROOVY/Installing+Griffon"&gt;Griffonのインストール&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Griffonをダウンロード&lt;/li&gt;&#10;&lt;li&gt;Griffonを適当な場所に解凍&lt;/li&gt;&#10;&lt;li&gt;環境変数 &lt;strong&gt;&amp;ldquo;GRIFFON_HOME&amp;rdquo;&lt;/strong&gt; にGriffonの解凍先パスを設定&lt;/li&gt;&#10;&lt;li&gt;環境変数 &lt;strong&gt;&amp;ldquo;PATH&amp;rdquo;&lt;/strong&gt; に &lt;code&gt;$GRIFFON_HOME/bin&lt;/code&gt; を設定&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="griffonでサンプルアプリケーションを作成"&gt;&lt;a href="http://docs.codehaus.org/display/GROOVY/Griffon+Quick+Start"&gt;Griffonでサンプルアプリケーションを作成&lt;/a&gt;&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;code&gt;griffon run-app DemoConsole&lt;/code&gt; を実行&lt;/li&gt;&#10;&lt;li&gt;作成された &lt;strong&gt;DemoConsole&lt;/strong&gt; に移動（&lt;code&gt;cd DemoConsole&lt;/code&gt;）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;./griffon-app/models/DemoConsoleModel.groovy&lt;/code&gt; を編集（上記サイトを参照）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;./griffon-app/controllers/DemoConsoleController.groovy&lt;/code&gt; を編集（上記サイトを参照）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;./griffon-app/vies/DemoConsoleView.groovy&lt;/code&gt; を編集を編集（上記サイトを参照）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;griffon run-app&lt;/code&gt; を実行&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;これで、簡単な計算機デスクトップアプリが起動されます。&#10;（テキストエリアに計算式を入力し、Executeボタンを押下すると結果が表示される）&lt;/p&gt;&#10;&lt;p&gt;使ってみた感想としては、&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;必然的にMVCモデル準拠なつくりになる&lt;/li&gt;&#10;&lt;li&gt;Swingアプリケーションが間単に作成できる&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Java Web Start&lt;/strong&gt; や &lt;strong&gt;Applet&lt;/strong&gt; で公開可能なパッケージが自動生成される （&lt;code&gt;griffon package&lt;/code&gt; を実行）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;など、作成が大変楽。&#10;とくに &lt;strong&gt;3つ目が僕にとっては大きなメリット&lt;/strong&gt; に感じた。&#10;&lt;strong&gt;Groovyで作成できる&lt;/strong&gt; というのも魅力。&lt;/p&gt;&#10;&lt;p&gt;今後、Griffonのことも書いていきたい。&lt;/p&gt;&#10;&lt;h2 id="今後の課題"&gt;今後の課題&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;grails package&lt;/strong&gt; コマンドにて、targetフォルダにjnlpやappletが作成されるがtargetフォルダごと別の場所に移動させた場合に&lt;i&gt;アプリが正常に起動しない&lt;/i&gt;。&#10;もしかするとproject作成直後は各種設定が絶対パスにて設定されている可能性あり。もうちょっと調べてみよう。&lt;/p&gt;</description></item><item><title>"Morph Exchange" を使って、無料でGrailsアプリ作成</title><link>https://genzouw.com/entry/2008/08/30/222600/492/</link><pubDate>Sat, 30 Aug 2008 22:26:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/08/30/222600/492/</guid><description>&lt;h2 id="作ってみた"&gt;作ってみた！&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://grails-test.morphexchange.com/entry/list"&gt;Grailsリアルタイム掲示板&lt;/a&gt; を作ってみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Grails&lt;/strong&gt; は生産性がいいです。&#10;1.5時間程度でできました。&lt;/p&gt;&#10;&lt;h2 id="morph-exchange-について"&gt;&lt;a href="http://www.morphexchange.com/"&gt;Morph Exchange&lt;/a&gt; について&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://www.morphexchange.com/"&gt;Morph Exchange&lt;/a&gt; というホスティングサービスを利用すると、無料でGrailsアプリを動作させるためのスペースが作れます。&#10;データベースも使用可能です。&#10;僕は &lt;strong&gt;PostgreSql&lt;/strong&gt; を使用して作ってみました。&lt;/p&gt;&#10;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;時間があればソースコードも公開します。&lt;/p&gt;</description></item><item><title>java2groovy で、インデントがおかしくなる原因を発見</title><link>https://genzouw.com/entry/2008/08/20/125900/493/</link><pubDate>Wed, 20 Aug 2008 12:59:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/08/20/125900/493/</guid><description>&lt;p&gt;Groovyをインストール後に、 &lt;strong&gt;java2groovy&lt;/strong&gt; というコマンドが使えるようになります。&#10;これを使用することでJavaソースをGroovy形式のソースに変換できます。&lt;/p&gt;&#10;&lt;p&gt;ただ、変換されたソースに何点かおかしな箇所があります。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;不要な空白行が大量に出力される&lt;/li&gt;&#10;&lt;li&gt;閉じ中括弧(})がインデントされない&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;いい勉強になると思って&#10;Groovyのサイトからソースをダウンロードし、解析してみました。&lt;/p&gt;&#10;&lt;h2 id="不具合を見つけた"&gt;不具合を見つけた！&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;org.codehaus.groovy.antlr.treewalker.SourcePrinter.java&lt;/code&gt; というソースに不具合がありました。&#10;&lt;code&gt;printNewlineAndIndent()&lt;/code&gt; メソッドのなかで&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visit&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;OPENING_VISIT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visit&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;CLOSING_VISIT&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;lastLinePrinted&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;currentLine&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;という判定処理があるのですが、&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;visit&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;OPENING_VISIT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;visit&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;CLOSING_VISIT&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;と書き直すことで閉じ中括弧のインデント問題は解決できました。&lt;/p&gt;&#10;&lt;h2 id="オープンソースアプリケーションのコア部分のソースを解析できた"&gt;オープンソースアプリケーションのコア部分のソースを解析できた！&lt;/h2&gt;&#10;&lt;p&gt;残念なことに、不要な空白行が大量に出力される原因は見つけることができませんでした。&#10;スクリプトを作って不要な改行を除去することにします。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;Groovyコア部分のソースコード解析ができたのはいい経験でした。&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>GroovyでExcelファイルの印刷フッター設定を変更する</title><link>https://genzouw.com/entry/2008/08/12/062300/494/</link><pubDate>Tue, 12 Aug 2008 06:23:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/08/12/062300/494/</guid><description>&lt;p&gt;前回に引き続き、今回もエクセルねたです。&lt;/p&gt;&#10;&lt;p&gt;すべての単体テスト仕様書に対して、以下の箇所を変更してほしいという要望がありました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;表紙タイトル&lt;/li&gt;&#10;&lt;li&gt;表紙シート以外の印刷フッター設定&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;もちろん手作業ではしんどいので、 &lt;strong&gt;Groovy&lt;/strong&gt; でやってしまうことに。&#10;VBAで組んだらいいのかもしれませんが、やはり使い慣れた言語のほうがループやif文といったちょっとしたことや、ライブラリも頭に入っているためスピーティに作れます。&lt;/p&gt;&#10;&lt;p&gt;ちょっとした作業を自動化する際には馬鹿にできないですよね。&lt;/p&gt;&#10;&lt;p&gt;「06.単体テスト」というフォルダ以下のすべてのファイルを対象にしています。&#10;（対象のファイルは先頭が&amp;quot;PT_&amp;ldquo;ではじまり、最後が&amp;rdquo;.xls&amp;quot;となっているものに絞っています。これが単体テスト仕様書。）&lt;/p&gt;&#10;&lt;h2 id="setallexcelgroovy"&gt;setAllExcel.groovy&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.codehaus.groovy.scriptom.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.codehaus.groovy.scriptom.tlb.office.MsoAutomationSecurity&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.codehaus.groovy.scriptom.tlb.office.MsoFeatureInstall&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.codehaus.groovy.scriptom.tlb.office2003.excel.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Scriptom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;inApartment&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// おまじない&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ActiveXObject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Excel.Application&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;displayAlerts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;automationSecurity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MsoAutomationSecurity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;msoAutomationSecurityForceDisable&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;alertBeforeOverwriting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;askToUpdateLinks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;featureInstall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MsoFeatureInstall&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;msoFeatureInstallNone&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;filelist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;/C:tempproject06.単体試験/&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;eachFileRecurse&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="s"&gt;/^PT_.+?.xls$/&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;filelist&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;filelist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;workbook&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;workbooks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;workbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sheets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;表紙&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;range&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;BY&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;execDateList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PageSetup&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CenterFooter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;amp;P-1 / &amp;amp;N-1 &amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;workbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;names&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;名前定義１&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;workbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;names&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;名前定義２&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;例外発生&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//workbook.SaveAs(file.path + &amp;#34;.xls&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//workbook.SaveAs(file.path)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;workbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;save&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;workbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>GroovyでExcelファイルに画像ファイルを貼り付ける</title><link>https://genzouw.com/entry/2008/08/04/230200/495/</link><pubDate>Mon, 04 Aug 2008 23:02:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/08/04/230200/495/</guid><description>&lt;p&gt;仕事で、テストのエビデンスとしてとったjpgファイルをすべてエクセルに貼り付けて提出してほしいと言われた。&lt;/p&gt;&#10;&lt;p&gt;僕はindex.htmlにjpgをimgタグで挟み込んで&#10;エビデンスとして残しておこうと思ったんだけれど、&#10;それではまずいとのこと。&#10;（どこのSI企業でも、Excelによるテスト結果の保存が好きですね）&lt;/p&gt;&#10;&lt;p&gt;そこで作ったのが以下のスクリプト。&#10;&lt;strong&gt;windows installer&lt;/strong&gt; を使用してGroovyをインストールすると、 &lt;strong&gt;scriptom&lt;/strong&gt; もインストールされます。&#10;&lt;strong&gt;scriptom&lt;/strong&gt; を使用することでgroovyからcomを操作することが可能になります。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.codehaus.groovy.scriptom.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.codehaus.groovy.scriptom.tlb.office.MsoAutomationSecurity&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.codehaus.groovy.scriptom.tlb.office.MsoFeatureInstall&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.codehaus.groovy.scriptom.tlb.office2003.excel.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Scriptom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;inApartment&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;user.home&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/デスクトップ&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// おまじない&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ActiveXObject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Excel.Application&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;displayAlerts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;automationSecurity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MsoAutomationSecurity&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;msoAutomationSecurityForceDisable&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;alertBeforeOverwriting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;askToUpdateLinks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;featureInstall&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MsoFeatureInstall&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;msoFeatureInstallNone&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 新規ワークブック作成&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;workbook&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;workbooks&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Add&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;worksheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;workbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sheets&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;worksheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;新しいシート&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listFiles&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;endsWith&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;.jpg&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;picture&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;worksheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;pictures&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;insert&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/*&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * pictureオブジェクトに対して、top、left、width、heightを&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * 指定することが可能。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;workbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;SaveAs&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/result.xls&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xlApp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;visible&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>簡易掲示板作ったよ</title><link>https://genzouw.com/entry/2008/07/01/062100/497/</link><pubDate>Tue, 01 Jul 2008 06:21:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/07/01/062100/497/</guid><description>&lt;p&gt;先週、仕事が早く終わった日があった。リーダーが「二時間ぐらい好きなことしててよいよ」と言ってくれたので、簡易掲示板つくってみた。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;制限はたくさんあるけど二時間かからずにできた。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://genzou-server.selfip.com/gstudy-0.1/entry/list"&gt;■簡易掲示板■&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;特筆すべきてんと言うほどでもないけど&#10;10秒間隔で自動的に最新表示します。&lt;/p&gt;&#10;&lt;p&gt;一度似たようなの作ったけどIEだと最新表示されないらしい・・・キャッシュ無効にしないと。&lt;/p&gt;&#10;&lt;h2 id="今後追加したら面白いかもと思っている機能"&gt;今後追加したら面白いかもと思っている機能&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;現在サイトにいる人数、人の表示&lt;/li&gt;&#10;&lt;li&gt;ファイルアップロード&lt;/li&gt;&#10;&lt;li&gt;お気に入りの人がログインしたら携帯メールで知らせてくれる&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;なんかmixiぽいな&lt;/p&gt;&#10;&lt;p&gt;なんかこんなん出来たらすごい！みたいなのないかな？アイデアに乏しい&lt;/p&gt;</description></item><item><title>最近さぼっています(Groovy、Grailsはサボっていません)</title><link>https://genzouw.com/entry/2008/06/06/080100/498/</link><pubDate>Fri, 06 Jun 2008 08:01:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/06/06/080100/498/</guid><description>&lt;p&gt;最近日記をサボっています。&lt;/p&gt;&#10;&lt;p&gt;GrailsやGroovyはかなり使っているのですが･･･&lt;/p&gt;&#10;&lt;p&gt;最近はテスターとしてのプロジェクト参加が多いです。&#10;作業は全て &lt;strong&gt;Groovy&lt;/strong&gt; でスクリプト化しています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;エビデンス(テスト結果)を残す&lt;/li&gt;&#10;&lt;li&gt;更新前と更新後のＤＢを比較する&lt;/li&gt;&#10;&lt;li&gt;エビデンスを所定のパスに配置する&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Java&lt;/strong&gt; で組んでたらかなり時間がかかるけど、 &lt;strong&gt;Groovy&lt;/strong&gt; ならほんとちょちょいのちょいです。&lt;/p&gt;&#10;&lt;p&gt;30分かかる作業なら、29分でgroovyで作って1分で実行、という仕事スタイルをとるようにしています。&#10;同じ時間でも少しでも経験を積むためにね。&lt;/p&gt;&#10;&lt;p&gt;同じようなことをされている方、いらっしゃいますよね？&lt;/p&gt;</description></item><item><title>Grailsでボードゲームを作ってみる：その１</title><link>https://genzouw.com/entry/2008/05/08/062500/499/</link><pubDate>Thu, 08 May 2008 06:25:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/05/08/062500/499/</guid><description>&lt;p&gt;しばらく実務、家族サービス、 &lt;a href="https://grails.org/"&gt;Grails&lt;/a&gt; の勉強に力をそそいていたので、更新をかなりさぼってしまっていました。&#10;久々の更新です。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="https://grails.org/"&gt;Grails&lt;/a&gt; を勉強中ですが、かなり生産性がよいです。&#10;仕事でのプロトタイプ作成も30分程度でできるので、ものを見ながら要件を聞きだすというフローに変わってきています。&lt;/p&gt;&#10;&lt;p&gt;ただ、 &lt;strong&gt;Grails&lt;/strong&gt; をWebページを見て勉強では身になりにくいと思い、簡単なボードゲームを作成してみました。&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://genzou-server.selfip.com/angelAndDevil-0.1/board/list"&gt;■プログラム&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a href="http://tenkuban.jp/www/rule.html"&gt;■ルール&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;ログイン機能としてacegiプラグインを利用しています。あまりたいそうなスペックをつんだサーバーではないので、アタックなどはやめてねｗ&lt;/p&gt;</description></item><item><title>Groovyでささっと書いたSQLを簡単に整形（クリップボード連携機能付き）</title><link>https://genzouw.com/entry/2008/03/03/080100/500/</link><pubDate>Mon, 03 Mar 2008 08:01:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/03/03/080100/500/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;コーディングしたSQLを整形するツールはたくさんありますが、今回はフリーのJavaライブラリを使用して整形してみました。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="前提情報"&gt;前提情報&lt;/h2&gt;&#10;&lt;p&gt;以下のJavaライブラリを利用しました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://www.igapyon.jp/blanco/blancosqlformatter.html"&gt;blancoSqlFormatter - SQL整形ライブラリ&lt;/a&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;こちらのサイトの作者さん、 &lt;strong&gt;同じ職場の方&lt;/strong&gt; です。&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;向こうは僕のこと見たことあるだろうけど、覚えてないんだろうなぁ。&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="機能"&gt;機能&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;クリップボードからSQLを抜き出します。&lt;/li&gt;&#10;&lt;li&gt;抜き出したSQLを整形します。&lt;/li&gt;&#10;&lt;li&gt;再度クリップボードに反映します。&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="ソースコード"&gt;ソースコード&lt;/h2&gt;&#10;&lt;h3 id="gclipboardgroovy"&gt;GClipBoard.groovy&lt;/h3&gt;&#10;&lt;p&gt;クリップボード操作用のクラスを作りました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.Toolkit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.Clipboard&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.DataFlavor&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.StringSelection&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.Transferable&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.UnsupportedFlavorException&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.IOException&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * @author genzou&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * クリップボード情報を管理するクラスです。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GClipBoard&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/** クリップボード */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;clipboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultToolkit&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getSystemClipboard&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * クリップボードに、文字列をセットします。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * @param sendStr&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * セットする文字列&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sendStr&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;StringSelection&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sendStr&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;clipboard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContents&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="cm"&gt;/**&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * クリップボードに含まれている文字列を取り出します。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; *&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; * @return String 取得した文字列&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="cm"&gt; */&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Transferable&lt;/span&gt; &lt;span class="n"&gt;recive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clipboard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContents&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;recive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTransferData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DataFlavor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stringFlavor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;UnsupportedFlavorException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IOException&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="arraignmentsqlgroovy"&gt;arraignmentSql.groovy&lt;/h3&gt;&#10;&lt;p&gt;こちらがコマンドラインから叩くフックポイント用のスクリプト。&lt;/p&gt;</description></item><item><title>Groovyで、Stringクラス、Fileクラスを拡張してみる（その２）</title><link>https://genzouw.com/entry/2008/02/29/075400/501/</link><pubDate>Fri, 29 Feb 2008 07:54:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/02/29/075400/501/</guid><description>&lt;p&gt;&lt;a href="https://genzouw.com/entry/2008/02/28/075900"&gt;昨日の続き&lt;/a&gt; 。&lt;/p&gt;&#10;&lt;h2 id="追加メソッド"&gt;追加メソッド&lt;/h2&gt;&#10;&lt;h3 id="orgapachepoihssfusermodelhssfworkbookloadstatic"&gt;&lt;code&gt;org.apache.poi.hssf.usermodel.HSSFWorkbook.load(static)&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;jakarta poiを通してエクセルを操作する際に使用します。&#10;仕事ではエクセルを使用する機会が非常に多いです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;HSSFWorkbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;text.xls&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のようにしてやるだけで、簡単にWorkbookインスタンスを作れます。&lt;/p&gt;&#10;&lt;h3 id="orgapachepoihssfusermodelhssfworkbookgetsheets"&gt;&lt;code&gt;org.apache.poi.hssf.usermodel.HSSFWorkbook.getSheets&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;シートの配列を取得します。groovyだと、eachメソッドでまわすことが多いので作りました。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sheets&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cellValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のように使用します。&lt;/p&gt;&#10;&lt;h3 id="orgapachepoihssfusermodelhssfsheetmetaclasscell"&gt;&lt;code&gt;org.apache.poi.hssf.usermodel.HSSFSheet.metaClass.cell&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;&lt;em&gt;後述（直下を参照）&lt;/em&gt;&lt;/p&gt;&#10;&lt;h3 id="orgapachepoihssfusermodelhssfsheetmetaclasscellvalue"&gt;&lt;code&gt;org.apache.poi.hssf.usermodel.HSSFSheet.metaClass.cellValue&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;自分の中ではとても使いやすいと思っています。&#10;上記の「getSheets」のサンプルでも使用しています。&lt;/p&gt;&#10;&lt;p&gt;セルから値を取得する際には、本来であれば&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSheetAt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getRow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getCell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;stringCellValue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のように書かなければいけないのですが、（正しくは、cellTypeごとに値を取得するメソッドを切り替える必要がある。）&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSheetAt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;cellValue&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;のように取得できます。&#10;楽チンですよね！&lt;/p&gt;&#10;&lt;h3 id="javautilpropertyresourcebundleloadstatic"&gt;&lt;code&gt;java.util.PropertyResourceBundle.load(static)&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;このあたりも、プロパティファイルを簡単に読み込めますよ、という程度。&lt;/p&gt;&#10;&lt;h3 id="ひとこと"&gt;ひとこと&lt;/h3&gt;&#10;&lt;p&gt;コメントに感想ください！&lt;/p&gt;</description></item><item><title>Groovyで、Stringクラス、Fileクラスを拡張してみる</title><link>https://genzouw.com/entry/2008/02/28/075900/502/</link><pubDate>Thu, 28 Feb 2008 07:59:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/02/28/075900/502/</guid><description>&lt;p&gt;出前味噌ですが、意外と便利です。&lt;/p&gt;&#10;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;クラスパスの通っている場所に、 &lt;code&gt;Extentions.groovy&lt;/code&gt; をおく&lt;/li&gt;&#10;&lt;li&gt;後は使用したいgroovyソースの先頭で、 &lt;code&gt;Extentions.init()&lt;/code&gt; メソッド(static)を実行する&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;読み込ませ方などの詳細は明日説明します･･･仕事が･･･&lt;/p&gt;&#10;&lt;h2 id="追加メソッド"&gt;追加メソッド&lt;/h2&gt;&#10;&lt;h3 id="filelostfilesdir"&gt;&lt;code&gt;File.lostFiles(dir)&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;自分自身のディレクトリと引数のディレクトリを比較し、自分自身に存在しないファイルをリストで返します。&lt;/p&gt;&#10;&lt;h3 id="filelistemptydirs"&gt;&lt;code&gt;File.listEmptyDirs()&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;空のディレクトリをリストで返します。&lt;/p&gt;&#10;&lt;h3 id="stringpadrightbytescount"&gt;&lt;code&gt;String.padRightBytes(count)&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;文字列の右側をスペース詰めします。groovyのpadRightとの違いは、バイト数を計算してスペース詰めすることです。padRightは文字数でスペース詰めするため、日本語を使用した場合に問題がありました。&lt;/p&gt;&#10;&lt;h3 id="stringpadleftbytescount"&gt;&lt;code&gt;String.padLeftBytes(count)&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;文字列の左側をスペース詰めします。&lt;/p&gt;&#10;&lt;h3 id="stringtonarrowcase"&gt;&lt;code&gt;String.toNarrowCase()&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;全角文字を半角に変換します。全角文字以外はそのままです。（一部対象外。理由は特になし）&lt;/p&gt;&#10;&lt;h3 id="stringtowidecase"&gt;&lt;code&gt;String.toWideCase()&lt;/code&gt;&lt;/h3&gt;&#10;&lt;p&gt;半角文字を全角に変換します。半角文字以外はそのままです。（一部対象外。希望があれば連絡ください）&lt;/p&gt;&#10;&lt;h2 id="ソースコード"&gt;ソースコード&lt;/h2&gt;&#10;&lt;p&gt;**こちらのライブ&lt;/p&gt;&#10;&lt;h3 id="extentionsgroovy"&gt;Extentions.groovy&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.poi.hssf.usermodel.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.poi.poifs.filesystem.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Extentions&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;lostFiles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;newdir&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;thislist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;olddir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;olddir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;eachFileRecurse&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;thislist&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;newlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;newdir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;eachFileRecurse&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;newlist&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;newlist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newlist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;collect&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newdir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;thislist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;newlist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;olddir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listEmptyDirs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;eachFileRecurse&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isDirectory&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listFiles&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;list&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;padRightBytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;padRight&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;padLeftBytes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;padLeft&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;bytes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toNarrowCase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;wideChars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Ａ&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Ｚ&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ａ&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ｚ&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;０&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;９&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;?&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ー&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;＊&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;＝&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;！&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;”&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;＄&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;％&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;＆&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;（&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;）&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;narrowChars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;9&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ｰ&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;!&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;(&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;wideChars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;narrowChars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="na"&gt;wideChars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;wideChars&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;narrowChars&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toWideCase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;wideChars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Ａ&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Ｚ&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ａ&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ｚ&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;０&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;９&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;?&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ー&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;＊&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;＝&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;！&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;”&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;＄&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;％&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;＆&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;（&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;）&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;narrowChars&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;A&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Z&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;9&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;ｰ&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;=&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;!&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;$&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;%&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;amp;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;(&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;)&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;wideChars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;narrowChars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="na"&gt;narrowChars&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replace&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;narrowChars&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;wideChars&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;HSSFWorkbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;static&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;HSSFWorkbook&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;POIFSFileSystem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FileInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;)));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;HSSFWorkbook&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSheets&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="na"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNumberOfSheets&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSheetAt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;list&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;poi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hssf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;usermodel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;HSSFSheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;getCell&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;poi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hssf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;usermodel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;HSSFSheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cellValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//assert delegate.getRow(row):&amp;#34;行${row}がnullです。&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;delegate&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;getCell&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;cellType&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;poi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hssf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;usermodel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;HSSFCell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CELL_TYPE_NUMERIC&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;numericCellValue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;poi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hssf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;usermodel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;HSSFCell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CELL_TYPE_STRING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;stringCellValue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;poi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hssf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;usermodel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;HSSFCell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CELL_TYPE_BOOLEAN&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;booleanCellValue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;apache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;poi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;hssf&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;usermodel&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;HSSFCell&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;CELL_TYPE_FORMULA&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;cellFormula&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//assert false:&amp;#34;${row}, ${col}が不正&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;result&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PropertyResourceBundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;static&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PropertyResourceBundle&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;io&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;FileInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PropertyResourceBundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;metaClass&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;static&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;loadProject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;java&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;util&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PropertyResourceBundle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;load&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;project-ascii.properties&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Groovyでエンティティ定義書からデータ抜き出し</title><link>https://genzouw.com/entry/2008/02/13/063000/503/</link><pubDate>Wed, 13 Feb 2008 06:30:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/02/13/063000/503/</guid><description>&lt;p&gt;今のプロジェクトでは &lt;em&gt;ER図&lt;/em&gt; を &lt;em&gt;専用ソフト&lt;/em&gt; で作っています。&lt;/p&gt;&#10;&lt;h2 id="今回のテーマ"&gt;今回のテーマ&lt;/h2&gt;&#10;&lt;p&gt;それでもわざわざ、ソフトが出力するフォーマットとは異なるエクセルファイルに書き出さないといけないということが多々あるのが &lt;em&gt;この業界の常&lt;/em&gt; （？）。&lt;/p&gt;&#10;&lt;p&gt;javaでエクセルファイルを操作するためのライブラリとして有名なのが &lt;strong&gt;Apache POI&lt;/strong&gt; です。&#10;これをgroovyから使ってみようというのが今回のテーマ。&lt;/p&gt;&#10;&lt;p&gt;下がそのサンプルです。&lt;/p&gt;&#10;&lt;h2 id="検証環境"&gt;検証環境&lt;/h2&gt;&#10;&lt;p&gt;スクリプトの上段のあたりを見ていただければ分かる通り、Windowsです。&#10;（ &amp;ldquo;c:/&amp;rdquo; というCドライブ指定のパスが分かりますね。 ）&lt;/p&gt;&#10;&lt;h2 id="作成したスクリプト"&gt;作成したスクリプト&lt;/h2&gt;&#10;&lt;h3 id="createcolumndictionarygroovy"&gt;createColumnDictionary.groovy&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.poi.hssf.usermodel.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;org.apache.poi.poifs.filesystem.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;workdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;c:/&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;tables&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;workdir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;listFiles&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;エンティティ定義書_&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Table&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;POIFSFileSystem&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FileInputStream&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;book&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;HSSFWorkbook&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fs&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;book&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSheetAt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sheet&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getRow&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;getCell&lt;/span&gt;&lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="kt"&gt;short&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;physicalName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;stringCellValue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toUpperCase&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!(!&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;stringCellValue&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//自動的な折り返しの設定&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;logicalName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;stringCellValue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;physicalName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;stringCellValue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;stringCellValue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;numericCellValue&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;numericCellValue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;intValue&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toString&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;seido&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;numericCellValue&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;numericCellValue&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;intValue&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;equalsIgnoreCase&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;NUMBER&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;,&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;seido&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;notNull&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;stringCellValue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;primaryKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cell&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="o"&gt;)?.&lt;/span&gt;&lt;span class="na"&gt;numericCellValue&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;intValue&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;column&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tables&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;tables&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;physicalKeys&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${workdir}/columns.txt&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;write&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lines&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;join&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;n&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Table&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;columns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;physicalName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;logicalName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getPhysicalKeys&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;columns&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;keys&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;${this.physicalName}|${it.physicalKey}&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;keys&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Column&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;groovy&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Column&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;physicalName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;logicalName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;length&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;notNull&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;primaryKey&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getPhysicalKey&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;${this.physicalName}|${this.type}|${this.length}|${this.notNull}|${this.primaryKey}&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;指定されたフォルダのエンティティ定義書（エクセル）をすべて読み込んでテキストに出力しています。&#10;クロージャの使い方がポイント。&#10;&lt;strong&gt;metaClass&lt;/strong&gt; を使用して、 &lt;strong&gt;Apache POI&lt;/strong&gt; 自体のworkbookオブジェクトにcellメソッド追加とかしても面白いかもしれないです。&lt;/p&gt;</description></item><item><title>Groovyで（会社の）Proxyを飛び越えてみる</title><link>https://genzouw.com/entry/2008/01/19/111700/504/</link><pubDate>Sat, 19 Jan 2008 11:17:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/01/19/111700/504/</guid><description>&lt;p&gt;会社で休憩時間に プロキシを超えて通信できないか試してみた。&#10;Sunのテクニカルコミュニティを見て作った。&#10;&lt;strong&gt;Proxyクラス&lt;/strong&gt; には値を設定せず、 &lt;strong&gt;Systemクラス&lt;/strong&gt; に設定している。&lt;/p&gt;&#10;&lt;h2 id="overproxygroovy"&gt;&lt;code&gt;overProxy.groovy&lt;/code&gt;&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.net.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.*&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;URLReader&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;throws&lt;/span&gt; &lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Configure proxy ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http.proxySet&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http.proxyHost&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;172.20.1.XXX&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http.proxyPort&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;8080&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http.proxyType&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;4&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;proxyUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;USER_NAME&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;proxyPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PASSWORD&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Open URL ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;URL&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;http://www.google.com/&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;URLConnection&lt;/span&gt; &lt;span class="n"&gt;con&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;openConnection&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;//proxy user and pass&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setRequestProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Proxy-Authorization&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;Basic &amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;sun&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;misc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;BASE64Encoder&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;encode&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;proxyUser&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;:&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;proxyPassword&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;BufferedReader&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BufferedReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;InputStreamReader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;con&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInputStream&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Read it ...&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;inputLine&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;((&lt;/span&gt;&lt;span class="n"&gt;inputLine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;readLine&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inputLine&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;close&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Groovyでzipファイルを暗号化してみる</title><link>https://genzouw.com/entry/2008/01/15/230000/505/</link><pubDate>Tue, 15 Jan 2008 23:00:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/01/15/230000/505/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;社内で外部に資料をメール送信する際には、 必ず以下のようなルールがあります。&#10;（ &lt;strong&gt;ここではこのルール自体の是非については触れません！！&lt;/strong&gt; ）&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;ファイルをzip圧縮する&lt;/li&gt;&#10;&lt;li&gt;zipファイルを暗号化する&lt;/li&gt;&#10;&lt;li&gt;zipファイルはお客様が &lt;strong&gt;Windows&lt;/strong&gt; PCを利用しているため、 &lt;strong&gt;Windows&lt;/strong&gt; 上の一般的なツールで展開できるようにする&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;毎回手作業でやっていたので、 Groovyスクリプト化してみました。&#10;以下がスクリプトの一部。&#10;ここでは、 &lt;a href="http://www.ne.jp/asahi/hishidama/home/soft/java/zip.html"&gt;Zipユーティリティークラス&lt;/a&gt; というライブラリを利用させていただきました。 これは便利！ありがとう！&lt;/p&gt;&#10;&lt;h2 id="機能"&gt;機能&lt;/h2&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;利用環境&lt;/strong&gt; は &lt;strong&gt;Windows&lt;/strong&gt; を想定しています。&#10;&lt;ul&gt;&#10;&lt;li&gt;少し変更すればLinuxやmacOS上でももちろん動作します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;圧縮対象となるディレクトリ&lt;/strong&gt; は &lt;strong&gt;&amp;ldquo;デスクトップ&amp;rdquo;&lt;/strong&gt; 上の &amp;ldquo;src/&amp;rdquo; ディレクトリに配置します。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;圧縮済みファイル&lt;/strong&gt; は &lt;strong&gt;&amp;ldquo;デスクトップ&amp;rdquo;&lt;/strong&gt; 上に &amp;ldquo;encrypt-xxxx.zip&amp;rdquo; というファイル名で作成されます。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;パスワード&lt;/strong&gt; は &lt;strong&gt;実行日時(YYYYMMDD)&lt;/strong&gt; となります。&#10;&lt;ul&gt;&#10;&lt;li&gt;こちらも少し変更すれば別のルールに変更可能です。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="ziptheattachedfilesgroovy"&gt;zipTheAttachedFiles.groovy&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Grab&lt;/strong&gt; 機能を使って、実行時にZipユーティリティライブラリを自動的にダウンロードしてきます。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grapes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;com.astamuse&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hishidama-hmzip&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1.6&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;jp.hishidama.zip.ZipCloak&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.File&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.text.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// LinuxやmacOSでは、こちらのデスクトップ該当パスを適切に変更すれば動作します&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;desktop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getProperty&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;user.home&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/デスクトップ&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;srcdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${desktop}/src&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;distdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;desktop&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="n"&gt;srcdir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;srcdir&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mkdir&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${srcdir.name}フォルダにファイルを入れてください。(準備ができたらEnterを押してください)&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;read&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;dateStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;SimpleDateFormat&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;yyyyMMdd&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;GregorianCalendar&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${dateStr}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;zipfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${distdir}/${srcdir.name}.zip&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AntBuilder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;file:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${distdir}/${srcdir.name}.zip&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;zip&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;destfile:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${zipfile.path}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;basedir:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${srcdir}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;update:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;encZipfile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;${desktop}/encrypt-${zipfile.name}&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;file:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${encZipfile.path}&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ZipCloak&lt;/span&gt; &lt;span class="n"&gt;zip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ZipCloak&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;zipfile&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;zip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encrypt&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encZipfile&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getBytes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;MS932&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;file:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;${distdir}/${srcdir.name}.zip&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;※※処理完了！※※&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行例"&gt;実行例&lt;/h2&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;groovy zipTheAttachedFiles.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>なつかしい数あてゲームを勉強で作ってみた</title><link>https://genzouw.com/entry/2008/01/08/064700/506/</link><pubDate>Tue, 08 Jan 2008 06:47:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/01/08/064700/506/</guid><description>&lt;h2 id="きっかけ"&gt;きっかけ&lt;/h2&gt;&#10;&lt;p&gt;プログラムの勉強を始めた頃に作った勉強用の数あてゲームを Groovy で作ってみました。&lt;/p&gt;&#10;&lt;p&gt;通常版と、プログラムロジックで勝手に回答を求める版を作ってみました。&lt;/p&gt;&#10;&lt;p&gt;( &lt;strong&gt;何度も思いますが、プログラムを簡単に書けるのはやっぱりすごい、Groovy。&lt;/strong&gt; )&lt;/p&gt;&#10;&lt;h3 id="追記"&gt;【追記】&lt;/h3&gt;&#10;&lt;p&gt;後日、Bashシェルスクリプトでも作ってみました。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="https://genzouw.com/entry/2022/02/01/080450/2906/"&gt;Bashシェルスクリプトで1〜999の数字をあてるゲームを作ってみる | ゲンゾウ用ポストイット&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="通常版"&gt;通常版&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;kazuate.groovy&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;random&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;resCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;※※※数あてゲーム※※&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="na"&gt;resCount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;===あと ${11-i} 回解答できます==&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0～999の数値を入力してください:&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;inputNum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;newReader&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;readLine&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;toInteger&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;inputNum&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;正解です&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exit&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;inputNum&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; ${inputNum} より大きな数値です&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; ${inputNum} より小さな数値です&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;正解は ${ans} です&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンドラインから実行&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy kazuate.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="勝手に回答を求める版"&gt;勝手に回答を求める版&lt;/h2&gt;&#10;&lt;p&gt;&lt;strong&gt;kazuateSimulator.groovy&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;random&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;resCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;999&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;※※※数あてゲーム※※&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="na"&gt;resCount&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;===あと ${i} 回解答できます==&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;0～999の数値を入力してください:&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;inputNum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="o"&gt;[(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;)(&lt;/span&gt;&lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;size&lt;/span&gt;&lt;span class="o"&gt;()/&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;)]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;inputNum&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;inputNum&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;正解です&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;exit&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ans&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;inputNum&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; ${inputNum} より大きな数値です&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;range&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;inputNum&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34; ${inputNum} より小さな数値です&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;range&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;range&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findAll&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;inputNum&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;正解は ${ans} です&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コマンドラインから実行&lt;/p&gt;</description></item><item><title>Groovyスクリプトから、別のGroovyスクリプトを呼び出す方法</title><link>https://genzouw.com/entry/2008/01/01/200200/507/</link><pubDate>Tue, 01 Jan 2008 20:02:00 +0900</pubDate><guid>https://genzouw.com/entry/2008/01/01/200200/507/</guid><description>&lt;p&gt;&lt;strong&gt;2ちゃんねる&lt;/strong&gt; や、 &lt;strong&gt;他のGroovyに関するブログ&lt;/strong&gt; でも、&#10;&lt;strong&gt;別のスクリプトファイルをimportするにはどうしたらよいのか？&lt;/strong&gt; という疑問が多いようです。&lt;/p&gt;&#10;&lt;h2 id="手段その1--classファイル化して読み込む方法"&gt;手段その1 : classファイル化して読み込む方法&lt;/h2&gt;&#10;&lt;p&gt;簡単に思いつく方法として以下の流れでimportする方法があります。&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Groovyファイルをgroovycコマンドでコンパイルする&lt;/li&gt;&#10;&lt;li&gt;コンパイルして出来たclassファイルをimportする&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="手段その2--groovyスクリプトファイルをそのままimportする方法"&gt;手段その2 : Groovyスクリプトファイルをそのままimportする方法&lt;/h2&gt;&#10;&lt;p&gt;では、コンパイルせずにGroovyスクリプトのクラスを利用できないか？&lt;/p&gt;&#10;&lt;p&gt;いろいろ試した結果、非常に簡単なことが分かりました。&#10;例を挙げます。&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;Main.groovy&lt;/code&gt; ファイルから &lt;code&gt;Printer.groovy&lt;/code&gt; ファイル内のクラスを利用するケースを想定します。&lt;/p&gt;&#10;&lt;h3 id="printergroovy"&gt;Printer.groovy&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Printer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;出力しました&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="maingroovy"&gt;Main.groovy&lt;/h3&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;printer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Printer&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;printer&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;print&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;問題は実行時のオプション。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ファイルが有るかを確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls *.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Main.groovy Printer.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 実行！&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy -c UTF8 -cp . Main.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;出力しました&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="注意点"&gt;注意点&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;-cp&lt;/code&gt; オプションは &lt;code&gt;groovy&lt;/code&gt; コマンド実行時に指定するクラスパスになります。&lt;/li&gt;&#10;&lt;li&gt;２つのスクリプトは同じディレクトリに配置します。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;要は、呼び出し対象のスクリプト配置ディレクトリにクラスパスを通してあげればいい、ということです。&lt;/p&gt;&#10;&lt;p&gt;以下のように、OSの &lt;strong&gt;CLASSPATH環境変数&lt;/strong&gt; に設定されているディレクトリに &lt;code&gt;Printer.groovy&lt;/code&gt; スクリプトを配置してもしてもOKです。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 別ディレクトリに移動させる&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mv Printer.groovy /tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 環境変数だけ設定しておく&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;CLASSPATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/tmp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy Main.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;出力しました&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Groovyでメール送信用クラス作成</title><link>https://genzouw.com/entry/2007/12/26/080400/508/</link><pubDate>Wed, 26 Dec 2007 08:04:00 +0900</pubDate><guid>https://genzouw.com/entry/2007/12/26/080400/508/</guid><description>&lt;p&gt;Javaではよく知られる、&lt;a href="http://java.sun.com/products/javamail/"&gt;JavaMail&lt;/a&gt;を使ったメール送信のためのクラスをGroovyで作成してみる。&lt;/p&gt;&#10;&lt;p&gt;通常は1つのSMTPサーバーしか使用しないと思うので、 このクラスの設定項目を変更して配置すれば、 システム内でのメール送信はカバーできると思います。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="注意-2019-01-23"&gt;※注意！ (2019-01-23)&lt;/h2&gt;&#10;&lt;p&gt;久しぶりにこちらのコードを実行してみたところ、以下のようなエラーが発生しました。&#10;Googleのセキュリティが厳しくなったためにログインできなくなっているように見えます。&#10;&lt;strong&gt;XOAUTH2&lt;/strong&gt; という文言が見えるので、 &lt;strong&gt;OAUTH2&lt;/strong&gt; による認証が必要なようですね。&#10;( トークンを取得して一緒に送信しないといけない？？ )&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;ご存知の方がいらっしゃいましたら &lt;a href="https://twitter.com/genzouw"&gt;@genzouw&lt;/a&gt; まで連絡ください。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG: setDebug: JavaMail version 1.4.7&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: useEhlo true, useAuth true&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: useEhlo true, useAuth true&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: trying to connect to host &amp;#34;smtp.gmail.com&amp;#34;, port 465, isSSL false&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;220 smtp.gmail.com ESMTP 202sm21577506pfy.87 - gsmtp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: connected to host &amp;#34;smtp.gmail.com&amp;#34;, port: 465&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;EHLO 192.168.25.251&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;250-smtp.gmail.com at your service, [221.250.87.66]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;250-SIZE 35882577&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;250-8BITMIME&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;250-ENHANCEDSTATUSCODES&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;250-PIPELINING&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;250-CHUNKING&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;250 SMTPUTF8&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: Found extension &amp;#34;SIZE&amp;#34;, arg &amp;#34;35882577&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: Found extension &amp;#34;8BITMIME&amp;#34;, arg &amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: Found extension &amp;#34;AUTH&amp;#34;, arg &amp;#34;LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: Found extension &amp;#34;ENHANCEDSTATUSCODES&amp;#34;, arg &amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: Found extension &amp;#34;PIPELINING&amp;#34;, arg &amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: Found extension &amp;#34;CHUNKING&amp;#34;, arg &amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: Found extension &amp;#34;SMTPUTF8&amp;#34;, arg &amp;#34;&amp;#34;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: STARTTLS requested but already using SSL&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: AUTH LOGIN command trace suppressed&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;DEBUG SMTP: AUTH LOGIN failed&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;javax.mail.AuthenticationFailedException: 534-5.7.9 Application-specific password required. Learn more at&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;534 5.7.9 https://support.google.com/mail/?p=InvalidSecondFactor 202sm21577506pfy.87 - gsmtp&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:826)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:761)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:685)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at javax.mail.Service.connect(Service.java:317)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at javax.mail.Service.connect(Service.java:176)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at javax.mail.Service.connect(Service.java:125)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at javax.mail.Transport.send0(Transport.java:194)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at javax.mail.Transport.send(Transport.java:124)&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; at javax.mail.Transport$send.call(Unknown Source)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="必要なライブラリ"&gt;必要なライブラリ&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://java.sun.com/products/javamail/"&gt;JavaMail&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="groovyソースコード"&gt;Groovyソースコード&lt;/h2&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;GenzouwServerMail.groovy&lt;/strong&gt; としてファイルを作成します。&lt;/li&gt;&#10;&lt;li&gt;必要ならライブラリは &lt;strong&gt;Grab&lt;/strong&gt; 機能を使って、実行時に自動的にダウンロードします。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@Grapes&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nd"&gt;@Grab&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;javax.mail&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;mail&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;1.4.7&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.util.Properties&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.mail.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.mail.internet.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;javax.activation.*&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GenzouwServerMail&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;UTF-8&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;smtpUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;※ここに送信者メールアドレスを記入※&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;smtpHost&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;※ここにサーバー名/IPを記入※&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;smtpPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;※ここにパスワードを記入※&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;fromAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;※ここにメールアドレスを記入※&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;senderName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;※ここに送信者名を記入※&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toAddress&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filepath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Properties&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Properties&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mail.smtp.user&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;smtpUser&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mail.smtp.host&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;smtpHost&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mail.smtp.port&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;465&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mail.smtp.starttls.enable&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mail.smtp.auth&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mail.smtp.debug&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mail.smtp.socketFactory.port&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;465&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mail.smtp.socketFactory.class&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;javax.net.ssl.SSLSocketFactory&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;mail.smtp.socketFactory.fallback&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;false&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;SecurityManager&lt;/span&gt; &lt;span class="n"&gt;security&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getSecurityManager&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Authenticator&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;javax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;mail&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;Authenticator&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;PasswordAuthentication&lt;/span&gt; &lt;span class="nf"&gt;getPasswordAuthentication&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;PasswordAuthentication&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;smtpUser&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;smtpPassword&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Session&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getInstance&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;debug&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;MimeMessage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;subject&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subject&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;from&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;InternetAddress&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fromAddress&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;senderName&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setHeader&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;text/plain charset=&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;charset&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addRecipient&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Message&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;RecipientType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TO&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;InternetAddress&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;toAddress&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;mbp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;MimeBodyPart&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;fds&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;FileDataSource&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mbp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;dataHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DataHandler&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fds&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mbp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fileName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;MimeUtility&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;encodeWord&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fds&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getName&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 複数のボディを格納するマルチパートオブジェクトを生成&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;mp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;MimeMultipart&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;addBodyPart&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mbp&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// マルチパートオブジェクトをメッセージに設定&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mp&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Transport&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;send&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;mex&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;mex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;printStackTrace&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="使い方"&gt;使い方&lt;/h2&gt;&#10;&lt;p&gt;利用先のGroovyスクリプトは以下のような感じ。&lt;/p&gt;</description></item><item><title>JavaやGroovyのソースコードをHTMLに変換するスクリプトを作りました</title><link>https://genzouw.com/entry/2007/12/18/081900/509/</link><pubDate>Tue, 18 Dec 2007 08:19:00 +0900</pubDate><guid>https://genzouw.com/entry/2007/12/18/081900/509/</guid><description>&lt;p&gt;昔書いていたブログ(Blogger)に Groovy や Java のソースコードを掲載する際に使用している Groovy スクリプトです。&#10;ソースを HTML に変換しているだけですが、意外と便利でした。&lt;/p&gt;&#10;&lt;h2 id="前提条件"&gt;前提条件&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://www.java2html.de"&gt;Java2Html&lt;/a&gt; という、 &lt;strong&gt;Ant&lt;/strong&gt; タスクを使用しています。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a href="http://www.java2html.de/docs/anttask/index.html"&gt;こちらのサイト&lt;/a&gt;で、Java2Html の Ant タスク用 jar ファイルをダウンロードする必要があります。&lt;/li&gt;&#10;&lt;li&gt;フォルダ構成は適宜変更してください。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="準備"&gt;準備&lt;/h2&gt;&#10;&lt;p&gt;ブラウザからダウンロードしてきてもいいですが、ターミナルからコマンドを叩けるなら以下の手順が楽です。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 作業用ディレクトリを作成し、移動&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ mkdir -p /tmp/work &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; /tmp/work&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ダウンロード&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ curl -O http://www.java2html.de/java2html_50.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 展開&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ unzip java2html_50.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# jarファイルが配置されていることを確認&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ ls&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;design/ docs/ java2html.jar java2html_50.zip java2html_src.zip&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="スクリプト作成"&gt;スクリプト作成&lt;/h2&gt;&#10;&lt;p&gt;&lt;code&gt;main.groovy&lt;/code&gt; というファイルを作成&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// =====設定内容=====&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ソースコード配置ディレクトリ&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;srcdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;c:/groovy/src&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// HTML出力ディレクトリ&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;destdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;c:/groovy/out&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;destdir&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;exists&lt;/span&gt;&lt;span class="o"&gt;())&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;destdir&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;mkdir&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;ant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AntBuilder&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;taskdef&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;java2html&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;classname:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;de.java2html.anttasks.Java2HtmlTask&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;delete&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;fileset&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;dir:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${destdir}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;**/*&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ant&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;java2html&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;srcdir:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${srcdir}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;destdir:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;${destdir}&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;includes:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;*.groovy&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;outputFormat:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;xhtml11&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;tabs:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;style:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;eclipse&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;showLineNumbers:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;showFileName:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;useShortFileName:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;showTableBorder:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;includeDocumentHeader:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nl"&gt;includeDocumentFooter:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行"&gt;実行&lt;/h2&gt;&#10;&lt;p&gt;HTML 化したい Groovy スクリプトファイル(Java ファイルでももちろん OK)を &lt;code&gt;src/&lt;/code&gt; ディレクトリに配置し、 &lt;code&gt;groovy&lt;/code&gt; コマンドで実行すると、 HTML ファイルが &lt;code&gt;out/&lt;/code&gt; ディレクトリに作成されます。&lt;/p&gt;</description></item><item><title>Groovy(Java)でクリップボードを操作する</title><link>https://genzouw.com/entry/2007/12/07/073600/510/</link><pubDate>Fri, 07 Dec 2007 07:36:00 +0900</pubDate><guid>https://genzouw.com/entry/2007/12/07/073600/510/</guid><description>&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://groovy-lang.org/"&gt;Groovy Language&lt;/a&gt; でしかできないわけではないのですが、 クリップボードを操作するためのスクリプト（クラス）を作成してみました。&lt;/p&gt;&#10;&lt;div style="display: flex"&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4839927278&amp;linkId=3d716414447febcb42a8120971b1e1a5"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=ja_JP&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=1935182447&amp;linkId=febf5ca3f7b734e24c6cac0cf185bde4"&gt;&lt;/iframe&gt;&#10;&lt;iframe style="width:120px;height:240px;" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" src="//rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&amp;bc1=000000&amp;IS2=1&amp;bg1=FFFFFF&amp;fc1=000000&amp;lc1=0000FF&amp;t=verywealthyda-22&amp;language=en_US&amp;o=9&amp;p=8&amp;l=as4&amp;m=amazon&amp;f=ifr&amp;ref=as_ss_li_til&amp;asins=4798117366&amp;linkId=3e184ae7f555efa38cc4dacef87b88cc"&gt;&lt;/iframe&gt;&#10;&lt;/div&gt;&#10;&lt;h2 id="前提条件"&gt;前提条件&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="http://groovy-lang.org/"&gt;Groovy&lt;/a&gt; がインストールされていることを確認&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 以下のコマンドでバージョンが表示されればインストールされている&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="手順"&gt;手順&lt;/h2&gt;&#10;&lt;h3 id="１クリップボード操作クラスを作成"&gt;１．クリップボード操作クラスを作成&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;カレントディレクトリに &lt;code&gt;GClipBoard.groovy&lt;/code&gt; を作成&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.Toolkit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.Clipboard&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.DataFlavor&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.StringSelection&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.Transferable&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.awt.datatransfer.UnsupportedFlavorException&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;java.io.IOException&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GClipBoard&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;clipboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getDefaultToolkit&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;getSystemClipboard&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sendStr&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;StringSelection&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sendStr&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;clipboard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setContents&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;getText&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Transferable&lt;/span&gt; &lt;span class="n"&gt;recive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clipboard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getContents&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;recive&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getTransferData&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DataFlavor&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stringFlavor&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Exception&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;recieveStr&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="２gclipboard-クラスを利用するメイン処理を作成"&gt;２．&lt;code&gt;GClipBoard&lt;/code&gt; クラスを利用するメイン処理を作成&lt;/h3&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;カレントディレクトリに &lt;code&gt;main.groovy&lt;/code&gt; を作成&#10;&lt;ul&gt;&#10;&lt;li&gt;ポイントは先程作った &lt;code&gt;GClipBoard.groovy&lt;/code&gt; ファイルと同じディレクトリに作成&lt;/li&gt;&#10;&lt;li&gt;&lt;em&gt;余談ですが、GroovyのスクリプトはJavaのようにクラスを定義する必要はなく、したがってクラス名に合わせたファイル名にする必要もありません。&lt;/em&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;clipboard&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;GClipBoard&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;clipboard&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;クリップの内容は・・・[${text}] でした。&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="実行"&gt;実行&lt;/h2&gt;&#10;&lt;p&gt;コマンドラインから実行してみる。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ groovy main.groovy&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;クリップの内容は・・・&lt;span class="o"&gt;[&lt;/span&gt;ゲンゾウ&lt;span class="o"&gt;]&lt;/span&gt; でした。&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ひとこと"&gt;ひとこと&lt;/h2&gt;&#10;&lt;p&gt;意外と簡単にクリップボード操作が可能です。&lt;/p&gt;</description></item><item><title>Groovyで新パッケージ内で新規に追加されたjarファイルを見つける</title><link>https://genzouw.com/entry/2007/12/06/072500/511/</link><pubDate>Thu, 06 Dec 2007 07:25:00 +0900</pubDate><guid>https://genzouw.com/entry/2007/12/06/072500/511/</guid><description>&lt;p&gt;こんな感じ。&#10;ここではWindowsに &lt;code&gt;c:¥21_runtime&lt;/code&gt; というディレクトリを配置し、 &lt;strong&gt;Groovy&lt;/strong&gt; のランタイムを配置しているケースを想定しています。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-groovy" data-lang="groovy"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;oldPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;c:/21_runtime/groovy-20071127/lib&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;def&lt;/span&gt; &lt;span class="n"&gt;newPath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;c:/21_runtime/groovy/lib&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;newJarList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newPath&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;eachFile&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;newJarList&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;\-[0-9a-zA-Z\.]+\.jar&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.jar&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;newJarList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;newJarList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;oldJarList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;File&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oldPath&lt;/span&gt;&lt;span class="o"&gt;).&lt;/span&gt;&lt;span class="na"&gt;eachFile&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;oldJarList&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;file&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;replaceAll&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;\-[0-9a-zA-Z\.]+\.jar&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;.jar&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;oldJarList&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;oldJarList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;oldJarList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;().&lt;/span&gt;&lt;span class="na"&gt;each&lt;/span&gt;&lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="n"&gt;oldjar&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;newJarList&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;contains&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;oldjar&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;){&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;println&lt;/span&gt; &lt;span class="n"&gt;oldjar&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item></channel></rss>