tag:blogger.com,1999:blog-27893250126970366392024-03-14T00:08:53.860+09:00Yusuke-Memoo310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.comBlogger63125tag:blogger.com,1999:blog-2789325012697036639.post-61376441133972180012019-09-07T14:41:00.001+09:002019-09-07T14:44:47.740+09:00VSCodeのSTSでハマったことSpringBootを使ったWebアプリのビルドで手順書を作ることとなった。<br />
サンプルのプロジェクトを見ながら手順書を作りたかったので、メンバーが使っているIDEAであるSTS(Spring Tool Suite)の環境を準備することにした。<br />
<a href="https://spring.io/tools">STSダウンロード場所</a><br />
環境構築時に困ったことをまとめる。<br />
結論としては、VSCodeとOracleJDKの最新版(jdk1.8.0_202)で環境構築できた。<br />
<h2 id="win環境に展開できない">
Win環境に展開できない</h2>
会社で環境構築したときの困りごと。<br />
<ul>
<li>会社のPCの環境
<ul>
<li>OS:WIn10 64bit</li>
<li>JDK:Oracle JDK 1.8.0_xxx ※再確認</li>
</ul>
</li>
<li>導入しようとしたSTS
<ul>
<li>Spring Tools 4 for Eclipse Windows 64-bit</li>
</ul>
</li>
<li>困ったこと
<ul>
<li>ZIPファイルを展開すると、ファイル名が長くて展開できないというエラーが発生し、展開が完了できない</li>
</ul>
</li>
<li>対応策
<ul>
<li>Spring Tools 4 for Eclipse を利用することを諦めた</li>
<li>Spring Tools 4 for Visual Studio Code に切り替えた
<ul>
<li>下記サイトを参考に動作確認をして、うまく行った!
<ul>
<li><a href="https://qiita.com/keb/items/c039d00c85fd99c2cee1">SpringBootでアプリを作りたいので、Spring Initializrを試してみた</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="vscodeのextensionの「language-support-for-java-by-red-hat」が動かない">
VSCodeのExtensionの「Language Support for Java by Red Hat」が動かない</h2>
自宅で環境構築したときの困りごと。<br />
<ul>
<li>自宅のPCの環境
<ul>
<li>OS:Mac High Sierra 10.13.6</li>
<li>JDK:Oracle JDK 1.8.0_05</li>
</ul>
</li>
<li>発生したエラー
<ul>
<li>VSCodeのダイアログ
<blockquote>
The Language Support for Java server crashed 5 times in the last 3 minutes. The server will not be restarted.</blockquote>
</li>
<li>Extentionのサイトに行ってみると、JDKの設定が必要と記載があった
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=redhat.java">VSCodeのMarketplace:Language Support for Java™ by Red Hat</a></li>
</ul>
</li>
<li>記載されている内容を実施してみる
<ul>
<li>VSCodeの設定に「java.home」を追加して、JDKのパスを設定<pre class=" language-json"><code class="prism language-json"><span class="token comment">// Spring Boot Development</span>
<span class="token string">"java.home"</span> <span class="token punctuation">:</span> <span class="token string">"/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home"</span>
</code></pre>
</li>
<li>JAVA_HOMEを環境変数に追加し、PATHにも追加<pre class=" language-bash"><code class="prism language-bash">$ <span class="token function">vi</span> ~/.bash_profile
<span class="token comment">## JAVA_HOME</span>
<span class="token function">export</span> JAVA_HOME<span class="token operator">=</span>/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home
<span class="token function">export</span> PATH<span class="token operator">=</span><span class="token variable">$PATH</span><span class="token keyword">:</span><span class="token variable">$JAVA_HOME</span>
$ <span class="token function">source</span> ~/.bash_profile
</code></pre>
</li>
<li>変更内容を反映<pre class=" language-bash"><code class="prism language-bash">$ <span class="token function">source</span> ~/.bash_profile
</code></pre>
</li>
<li>反映内容を確認<pre class=" language-bash"><code class="prism language-bash">$ <span class="token function">printenv</span> JAVA_HOME
$ <span class="token function">printenv</span> PATH
$ java -version
$ javac -version
</code></pre>
</li>
<li>VSCodeを再起動</li>
<li>VSCodeのダイアログの内容は変わらないが、エラーを見てと言われた
<ul>
<li>エラーログ<pre class=" language-json"><code class="prism language-json"><span class="token punctuation">{</span> message<span class="token punctuation">:</span>
'Starting Java server <span class="token keyword">with</span><span class="token punctuation">:</span> <span class="token operator">/</span>Library<span class="token operator">/</span>Java<span class="token operator">/</span>JavaVirtualMachines<span class="token operator">/</span>jdk1<span class="token number">.8</span><span class="token punctuation">.</span>0_05<span class="token punctuation">.</span>jdk<span class="token operator">/</span>Contents<span class="token operator">/</span>Home<span class="token operator">/</span>bin<span class="token operator">/</span>java ※※省略※※<span class="token punctuation">,</span>
level<span class="token punctuation">:</span> <span class="token string">'info'</span><span class="token punctuation">,</span>
timestamp<span class="token punctuation">:</span> <span class="token string">'2019-09-07 12:04:46.072'</span> <span class="token punctuation">}</span>
<span class="token punctuation">{</span> message<span class="token punctuation">:</span>
<span class="token string">'Unrecognized VM option \'UseStringDeduplication\'\nError: Could not create the Java Virtual Machine.\nError: A fatal exception has occurred. Program will exit.\n'</span><span class="token punctuation">,</span>
level<span class="token punctuation">:</span> <span class="token string">'info'</span><span class="token punctuation">,</span>
timestamp<span class="token punctuation">:</span> <span class="token string">'2019-09-07 12:04:46.165'</span> <span class="token punctuation">}</span>
<span class="token punctuation">{</span> message<span class="token punctuation">:</span>
<span class="token string">'The Language Support for Java server crashed and will restart.'</span><span class="token punctuation">,</span>
level<span class="token punctuation">:</span> <span class="token string">'error'</span><span class="token punctuation">,</span>
timestamp<span class="token punctuation">:</span> <span class="token string">'2019-09-07 12:04:46.171'</span> <span class="token punctuation">}</span>
</code></pre>
</li>
</ul>
</li>
<li>2つめのログを見ると、設定は反映されているけど、JVMが起動できていない感じ</li>
<li>Quick Startの2つ目に下記の記載があって、JDK1.8であれば良いと思ったけど・・・
<blockquote>
<ul>
<li>Download and install a recent Java Development Kit (latest Java 8 is the minimum requirement).</li>
</ul>
</blockquote>
</li>
<li>試しに、Oracle JDKの最新版(jdk1.8.0_202)をインストールし、再設定
<ul>
<li>環境変数<pre class=" language-bash"><code class="prism language-bash">$ <span class="token function">vi</span> ~/.bash_profile
<span class="token comment">## JAVA_HOME</span>
<span class="token function">export</span> JAVA_HOME<span class="token operator">=</span>/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home
<span class="token comment">#export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home</span>
$ <span class="token function">source</span> ~/.bash_profile
$ java -version
$ javac -version
</code></pre>
</li>
<li>VSCodeの設定(更新・保存すると、再起動のポップアップあり)<pre class=" language-json"><code class="prism language-json"><span class="token comment">// Spring Boot Development</span>
<span class="token string">"java.home"</span><span class="token punctuation">:</span> <span class="token string">"/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home"</span>
<span class="token comment">//"java.home" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_05.jdk/Contents/Home"</span>
</code></pre>
</li>
<li>再起動すると、バックグラウンドで処理が実行され、エラーは表示されなくなった!
<ul>
<li>"recent Java Development Kit"とあっただけあって、マイナーバージョンを上げる必要があった</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="vscodeでspringbootの開発を行うために">
VSCodeでSpringBootの開発を行うために</h2>
あとは、下記の記事を参考に開発をしていくと良さそう。<br />
<ul>
<li><a href="https://qiita.com/chakimar/items/39937cf39d2069758c83">VSCodeでSpring Bootのプロジェクトを実行する</a></li>
<li><a href="https://qiita.com/keb/items/c039d00c85fd99c2cee1">SpringBootでアプリを作りたいので、Spring Initializrを試してみた</a></li>
</ul>
o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-32088467778347568812019-08-16T23:25:00.000+09:002019-08-16T23:26:28.929+09:00APIの設計書をMarkdownで書いてみたい<h2 id="なんでやろうと思ったのか">
なんでやろうと思ったのか</h2>
会社で基本設計書といえば、ExcelとかWordとかPPTとか、Office系のアプリを使って作成することが多い。<br />
その場合、下記の点でいつも悩ましい状態になる。<br />
<ul>
<li>バージョン管理</li>
<li>バージョン間の差分管理
<ul>
<li>レビュー指摘票と行数のマッピングのズレ(指摘が複数ある場合に行数や連番がずれて、どこの指摘の修正がどこに行ったのかわからなくなる)</li>
</ul>
</li>
<li>レビューのクローズ状況の追跡</li>
</ul>
最近はMarkdownとPlantUMLを組み合わせて、シーケンス図やシステムコンテキスト図の概要を作ってみている。<br />
(最終的には画像化してPPTに貼っているけど。。。)<br />
なので、上記の悩ましい状態の解決方法として、最近慣れてきているMarkdownでの基本設計書の作成をしていきたいと考えていた。<br />
ということで、試してみたので、その備忘録です。<br />
<h3 id="で、どうだった?">
で、どうだった?</h3>
記述ルールは簡単で、モックサーバをローカルに立てみて、<br />
<ul>
<li>設計と実装意図があっているか確認できる</li>
<li>実コードが無くてもローカルでAPIを利用して、利用者側の実装ができそう</li>
</ul>
というところまで確認できたので、かなりいい感じ、という印象でした。<br />
HTML出力したレイアウトも結構きれいで、好みでした。<br />
ただし、レビュー指摘票の行数のマッピングのズレについては、GithubのPullRequestを利用しないと解決できないので、今後の課題ということで。。。<br />
あれ?VSCodeに入れたExtentionを使っていない。<br />
ま、いっか〜<br />
<h3 id="実装内容の公開">
実装内容の公開</h3>
今回作成したMarkdownのファイルは下記のGithubで公開します。<br />
不備などありましたら、ご指摘いただけますと幸いです。<br />
<a href="https://github.com/o310yusuke/APIBlueprint_Tutorial">o310yusuke/APIBlueprint_Tutorial</a><br />
<h2 id="何を使うのか">
何を使うのか</h2>
<ul>
<li>テキストエディタ:VSCode
<ul>
<li>理由:使い慣れてきたし、軽いし。</li>
</ul>
</li>
<li>エディタ拡張機能:vscode-apielements
<ul>
<li>理由:公式サイト<a href="https://apiblueprint.org/">apiblueprint</a>に乗っていたから</li>
</ul>
</li>
<li>設計書記述方法:API Blueprint
<ul>
<li>理由:参考サイトを参考に(記述ルールがシンプルそうだったから)</li>
</ul>
</li>
<li>レンダリング:Aglio
<ul>
<li>理由:参考サイトを参考に(node.jsでnpmで導入できるから)</li>
</ul>
</li>
<li>モックサーバ:Drakov
<ul>
<li>理由:参考サイトを参考に(node.jsでnpmで導入できるから)</li>
</ul>
</li>
</ul>
<h2 id="参考サイト">
参考サイト</h2>
<ul>
<li><a href="https://kahoo.blog/api-specification-markdown-with-apiblueprint/">API仕様書はMarkdownで書いてhtml出力がベスト(API Blueprint) by タカフ@柏のWeb屋さん</a>
<ul>
<li>「webapi markdown」とGoogle先生に質問したときに見つけたサイトで、本記事のメインの参考サイト</li>
</ul>
</li>
<li><a href="https://qiita.com/the40san/items/0f673a9fe8b72c4b0225">開発効率を上げるWebAPIドキュメントの書き方</a>
<ul>
<li>上記のサイトからリンクされていたサイト</li>
<li>API Blueprintの詳しい書き方</li>
</ul>
</li>
<li><a href="https://apiblueprint.org/">apiblueprint公式サイト(もちろん英語)</a></li>
<li><a href="https://dackdive.hateblo.jp/entry/2015/08/07/181723">aglioでAPI Blueprintを使ったドキュメント作成環境をローカルに構築する</a></li>
<li><a href="https://arui.tech/why-locally-install-is-much-better-than-globally-in-npm/">npm installするときはどのパッケージもローカルインストールで十分</a>
<ul>
<li>グローバルインストールしなかったら、コマンドが使えなかったので、調べた結果</li>
</ul>
</li>
</ul>
<h2 id="やったこと(環境構築)">
やったこと(環境構築)</h2>
実施したOSはMacです。<br />
Node.jsは7.10.0です(古かった。。。)。<br />
<h3 id="vscodeに拡張機能をインストール">
VSCodeに拡張機能をインストール</h3>
<ul>
<li>apielementで検索してインストール</li>
<li>workspaceとして、「apiblueprint_trial」のディレクトリ作成</li>
</ul>
<h3 id="npmのインストール状況を確認">
npmのインストール状況を確認</h3>
<pre class=" language-bash"><code class="prism language-bash">$ <span class="token function">npm</span> <span class="token function">ls</span> --depth<span class="token operator">=</span>0 -g
/usr/local/lib
├── generator-code@1.2.0
├── npm@4.2.0
└── yo@3.1.0
</code></pre>
generator-codeとyoは、VSCodeのExtensionを作ってみたくていらたものなので、関係無し。<br />
<h3 id="aglioをインストール">
Aglioをインストール</h3>
参考サイトではグローバルにインストールしていたけど、今回はローカルのみにインストールを行う。<br />
<pre class=" language-bash"><code class="prism language-bash"><span class="token comment"># node.jsのグローバルにインストールする場合</span>
<span class="token function">npm</span> <span class="token function">install</span> -g aglio
<span class="token comment"># 特定ディレクトリにインストールする場合</span>
<span class="token function">cd</span> 特定ディレクトリまで移動
<span class="token function">npm</span> <span class="token function">install</span> aglio
<span class="token comment"># インストール確認(直下のものだけ)</span>
<span class="token function">npm</span> <span class="token function">ls</span> --depth<span class="token operator">=</span>0
<span class="token function">npm</span> <span class="token function">ls</span> -g --depth<span class="token operator">=</span>0
</code></pre>
結果<br />
<pre class=" language-bash"><code class="prism language-bash">$ <span class="token function">npm</span> <span class="token function">ls</span> --depth<span class="token operator">=</span>0
/apiblueprint_trial
└── aglio@2.3.0
$ <span class="token function">npm</span> <span class="token function">ls</span> --depth<span class="token operator">=</span>0 -g
/usr/local/lib
├── generator-code@1.2.0
├── npm@4.2.0
└── yo@3.1.0
</code></pre>
<h3 id="drakovをインストール">
Drakovをインストール</h3>
こちらもローカルのみにインストール<br />
<pre class=" language-bash"><code class="prism language-bash"><span class="token function">npm</span> <span class="token function">install</span> drakov
</code></pre>
結果<br />
<pre class=" language-bash"><code class="prism language-bash">$ <span class="token function">npm</span> <span class="token function">ls</span> --depth<span class="token operator">=</span>0
/apiblueprint_trial
├── aglio@2.3.0
└── drakov@1.0.4
$ <span class="token function">npm</span> <span class="token function">ls</span> --depth<span class="token operator">=</span>0 -g
/usr/local/lib
├── generator-code@1.2.0
├── npm@4.2.0
└── yo@3.1.0
</code></pre>
<h2 id="やったこと">
やったこと</h2>
<a href="https://apiblueprint.org/documentation/tutorial.html">API Blueprintの公式サイトにチュートリアル</a>があったので、そちらを参考に実施。<br />
<h3 id="markdownで書いてみる">
Markdownで書いてみる</h3>
<ul>
<li>tutorial.mdを作成する。</li>
<li>まず、API名とメタデータを決める。<pre><code>FORMAT: 1A ←Blueprintのバージョン
# Polls ←API名
サンプルAPIの名前を「Polls」にします。 ←APIの説明
</code></pre>
</li>
<li>リソースグループを「# Group」で記載する。
<ul>
<li>チュートリアルでは、「質問」に関する複数のAPIの章立てのイメージみたい。</li>
</ul>
<pre><code># Group 質問 ←グループ名
「質問」に関するAPIのリソースを集約する。 ←グループの説明
</code></pre>
</li>
<li>リリースを定義する。<pre><code>## 質問コレクション [/questions] ←「質問」のリソースグループ内の質問のリスト。[]内にURLテンプレートを記述可能。
</code></pre>
</li>
<li>アクションを定義する。
<ul>
<li>1つのリソースに必ず1つのアクションを定義すること。</li>
</ul>
<pre><code>### 一覧取得 [GET] ←リソース内の1つのメソッド。[]内にHTTPメソッドを記載する。
- Response 200 (application/json)
[
{
"question": "Favourite programming language?",
"published_at": "2014-11-11T08:40:51.620Z",
"url": "/questions/1",
"choices": [
{
"choice": "Swift",
"url": "/questions/1/choices/1",
"votes": 2048
},{
"choice": "Python",
"url": "/questions/1/choices/2",
"votes": 1024
}
]
}
]
</code></pre>
※チュートリアルでは、2つめのアクションを記載しているが割愛<br />
※チュートリアルでは、2つめのリソースを記載しているが割愛</li>
</ul>
<h3 id="markdown→html変換してみる">
Markdown→HTML変換してみる</h3>
<ul>
<li>作成したtutorial.mdから、aglioを使ってHTMLを作成する
<ul>
<li>aglioをローカルインストールしたので、下記のコマンドでは実行できなかった。<pre class=" language-bash"><code class="prism language-bash">$ aglio -o tutorial.md -o tutorial.html
</code></pre>
</li>
<li>下記のコマンドを実行し、npxをグローバルインストールし、npmの初期化を実施した(デフォルト値で実行した)。<pre class=" language-bash"><code class="prism language-bash">$ <span class="token function">npm</span> <span class="token function">install</span> -g npx
<span class="token comment"># 結果</span>
$ <span class="token function">npm</span> <span class="token function">ls</span> --depth<span class="token operator">=</span>0 -g
/usr/local/lib
├── generator-code@1.2.0
├── npm@4.2.0
├── npx@10.2.0
└── yo@3.1.0
<span class="token comment"># 初期化</span>
$ <span class="token function">npm</span> init
</code></pre>
</li>
<li>npxを利用することで、ローカルインストールしたパッケージも利用可能にできた。<pre class=" language-bash"><code class="prism language-bash">$ npx aglio -i tutorial.md -o tutorial.html
</code></pre>
</li>
<li>表記のエラーがあると、コンパイルエラーとなり、修正方法も提示してくれる。それに合わせて修正することで、コンパイルしてくれる。</li>
</ul>
</li>
<li>下記コマンドを実行しておけば、mdファイルを保存したタイミングでリアルタイムで変換してくれる。<pre class=" language-bash"><code class="prism language-bash">npx aglio -i tutorial.md --server
<span class="token comment"># 結果</span>
Server started on http://127.0.0.1:3000/
Rendering tutorial.md
<span class="token comment"># 終了方法</span>
Ctrl + C
</code></pre>
</li>
</ul>
<h3 id="mockサーバを試してみる">
Mockサーバを試してみる</h3>
<ul>
<li>drakovでMockサーバを起動する。<pre class=" language-bash"><code class="prism language-bash">npx drakov -f tutorial.md --watch
<span class="token comment"># 結果</span>
<span class="token punctuation">[</span>INFO<span class="token punctuation">]</span> No configuration files found
<span class="token punctuation">[</span>INFO<span class="token punctuation">]</span> Loading configuration from CLI
DRAKOV STARTED
<span class="token punctuation">[</span>LOG<span class="token punctuation">]</span> Setup Route: GET /questions 一覧取得
<span class="token punctuation">[</span>LOG<span class="token punctuation">]</span> Setup Route: POST /questions 新規投稿
<span class="token punctuation">[</span>LOG<span class="token punctuation">]</span> Setup Route: GET /questions/:question_id 質問詳細取得
<span class="token punctuation">[</span>LOG<span class="token punctuation">]</span> Setup Route: DELETE /questions/:question_id 削除
Drakov 1.0.4 Listening on port 3000
FILE SPY ACTIVE
<span class="token comment"># 終了方法</span>
Ctrl + C
</code></pre>
</li>
<li>ブラウザで、一覧を取得してみる。
<ul>
<li>URL: <a href="http://localhost:3000/questions">http://localhost:3000/questions</a></li>
<li>結果(コンソール)<pre class=" language-bash"><code class="prism language-bash"><span class="token punctuation">[</span>LOG<span class="token punctuation">]</span> GET /questions
<span class="token punctuation">[</span>MATCHING<span class="token punctuation">]</span> by url pattern: /questions/:question_id NOT_MATCHED
<span class="token punctuation">[</span>MATCHING<span class="token punctuation">]</span> by url pattern: /questions MATCHED
<span class="token punctuation">[</span>DRAKOV<span class="token punctuation">]</span> GET /questions 一覧取得
</code></pre>
</li>
<li>結果(ブラウザ)<pre class=" language-json"><code class="prism language-json"><span class="token punctuation">[</span>
<span class="token punctuation">{</span>
<span class="token string">"question"</span><span class="token punctuation">:</span> <span class="token string">"好きな開発言語はなんですか?"</span><span class="token punctuation">,</span>
<span class="token string">"published_at"</span><span class="token punctuation">:</span> <span class="token string">"2014-11-11T08:40:51.620Z"</span><span class="token punctuation">,</span>
<span class="token string">"url"</span><span class="token punctuation">:</span> <span class="token string">"/questions/1"</span><span class="token punctuation">,</span>
<span class="token string">"choices"</span><span class="token punctuation">:</span> <span class="token punctuation">[</span>
<span class="token punctuation">{</span>
<span class="token string">"choice"</span><span class="token punctuation">:</span> <span class="token string">"Swift"</span><span class="token punctuation">,</span>
<span class="token string">"url"</span><span class="token punctuation">:</span> <span class="token string">"/questions/1/choices/1"</span><span class="token punctuation">,</span>
<span class="token string">"votes"</span><span class="token punctuation">:</span> <span class="token number">2048</span>
<span class="token punctuation">}</span><span class="token punctuation">,</span><span class="token punctuation">{</span>
<span class="token string">"choice"</span><span class="token punctuation">:</span> <span class="token string">"Python"</span><span class="token punctuation">,</span>
<span class="token string">"url"</span><span class="token punctuation">:</span> <span class="token string">"/questions/1/choices/2"</span><span class="token punctuation">,</span>
<span class="token string">"votes"</span><span class="token punctuation">:</span> <span class="token number">1024</span>
<span class="token punctuation">}</span>
<span class="token punctuation">]</span>
<span class="token punctuation">}</span>
<span class="token punctuation">]</span>
</code></pre>
</li>
</ul>
</li>
<li>cURLを使った確認
<ul>
<li>入力画面<pre class=" language-bash"><code class="prism language-bash"><span class="token comment"># 一覧取得(HeaderとBodyを表示するため「-i」を付与)</span>
$ curl -i http://localhost:3000/questions
<span class="token comment"># 新規登録</span>
$ curl -i -X POST -H <span class="token string">"Content-type: application/json"</span> -d <span class="token string">'{"question":"好きな開発言語はなんですか?","choices":["Swift","Python"]}'</span> http://localhost:3000/questions
<span class="token comment"># 削除</span>
curl -i -X DELETE http://localhost:3000/questions/1
</code></pre>
</li>
<li>ウォッチ画面(Drakovを起動したコマンドプロンプト)<pre class=" language-bash"><code class="prism language-bash"><span class="token comment"># 一覧取得</span>
<span class="token punctuation">[</span>LOG<span class="token punctuation">]</span> GET /questions
<span class="token punctuation">[</span>MATCHING<span class="token punctuation">]</span> by url pattern: /questions/:question_id NOT_MATCHED
<span class="token punctuation">[</span>MATCHING<span class="token punctuation">]</span> by url pattern: /questions MATCHED
<span class="token punctuation">[</span>DRAKOV<span class="token punctuation">]</span> GET /questions 一覧取得
<span class="token comment"># 新規登録</span>
<span class="token punctuation">[</span>LOG<span class="token punctuation">]</span> POST /questions
<span class="token punctuation">[</span>MATCHING<span class="token punctuation">]</span> by url pattern: /questions/:question_id NOT_MATCHED
<span class="token punctuation">[</span>MATCHING<span class="token punctuation">]</span> by url pattern: /questions MATCHED
<span class="token punctuation">[</span>MATCHING<span class="token punctuation">]</span> by request content type: application/json actual: application/json MATCHED
<span class="token punctuation">[</span>MATCHING<span class="token punctuation">]</span> by request body content MATCHED
<span class="token punctuation">[</span>DRAKOV<span class="token punctuation">]</span> POST /questions 新規投稿
<span class="token comment"># 削除</span>
<span class="token punctuation">[</span>LOG<span class="token punctuation">]</span> DELETE /questions/1
<span class="token punctuation">[</span>MATCHING<span class="token punctuation">]</span> by url pattern: /questions/:question_id MATCHED
<span class="token punctuation">[</span>DRAKOV<span class="token punctuation">]</span> DELETE /questions/<span class="token punctuation">{</span>question_id<span class="token punctuation">}</span> 削除
</code></pre>
</li>
</ul>
</li>
</ul>
o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-42045568719866121362019-06-30T17:22:00.001+09:002019-06-30T17:23:04.037+09:00VSCode環境構築:設定変更<p>VSCodeをインストールしてから行っている設定変更の内容をまとめる。</p>
<p>随時更新予定。</p>
<h2 id="テキストファイルを開くときの文字コード">テキストファイルを開くときの文字コード</h2>
<h3 id="設定理由">設定理由</h3>
<p>デフォルト設定では、テキストファイルの文字コードによらず、UTF-8で開こうとする。<br>
そのため、Shift-JISのテキストファイルは、ちゃんと文字化けされて開かれる。<br>
文字コードを指定して開き直せばよいが、毎回は面倒。</p>
<h3 id="文字コードを変更して開き直す方法">文字コードを変更して開き直す方法</h3>
<ul>
<li>コントロールパネルを開く</li>
<li>Change File Encodingを選択</li>
<li>Reopen with Encodingを選択</li>
<li>文字コードを選択</li>
</ul>
<h3 id="設定方法">設定方法</h3>
<ul>
<li>設定画面を開く
<ul>
<li>Win: Ctrl + ,</li>
<li>Mac: Command + ,</li>
</ul>
</li>
<li>検索窓で「encoding」を検索</li>
<li>Files: Auto Guess Encoding にチェックを入れる</li>
</ul>
<h2 id="ターミナルからvscodeを起動する">ターミナルからVSCodeを起動する</h2>
<h3 id="設定理由-1">設定理由</h3>
<p>GitとかをCUIで使っていて、lessコマンドとかで見るのではなく、テキストエディタでみたい。<br>
※Winも同じように設定可能?</p>
<h3 id="設定方法-1">設定方法</h3>
<ul>
<li>コマンドパレットを開く
<ul>
<li>Win: Ctrl + Shift + P</li>
<li>Mac: Command + Shift + P</li>
</ul>
</li>
<li>検索窓で「shell」を検索</li>
<li>Shell Command: Install ‘code’ command in PATH を実行</li>
<li>ターミナルで下記を入力するとVSCodeが起動できる
<ul>
<li>$ code → 通常起動</li>
<li>$ code . → 現在のディレクトリをルートとして起動</li>
</ul>
</li>
</ul>
o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-35711951143657192382019-06-29T16:30:00.000+09:002019-06-29T16:31:50.424+09:00VSCode環境構築:いつも入れているプラグイン2017年ごろはAtomを使っていたのだけれども、いろいろとプラグイン(拡張機能)をどんどん入れすぎたせいか、どんどん重くなってしまった。<br />
そのころ、VSCodeが無料で使える、という情報がTwitterで流れてきた。<br />
入れてみると、、、<br />
<ul>
<li>軽い!</li>
<li>今となっては、Atomと負けないくらいプラグインが豊富</li>
</ul>
ということで、最初はちょこちょこ困惑はしたものの、完全に引っ越ししてしまった。<br />
(今となっては何に困惑したのか、覚えていないけど。。。)<br />
いつも初期導入時に入れているプラグインを備忘録として記録する。<br />
※適宜更新はしておこうと思います。<br />
なお、URLは「作成者」ピリオド「ツール名」で表現される。<br />
<h2 id="markdownのため">
Markdownのため</h2>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml">jebbs.plantuml</a>
<ul>
<li>UMLやシーケンス図をテキストベースで作成できる</li>
<li>ただし、UMLの描画にGraphvizが必要
<ul>
<li><a href="http://www.graphviz.org/">Graphviz</a></li>
</ul>
</li>
<li><a href="http://plantuml.com/ja/">PlantUMLの公式サイト(日本語)</a></li>
</ul>
</li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=shd101wyy.markdown-preview-enhanced">shd101wyy.markdown-preview-enhanced</a>
<ul>
<li>Markdownをプレビュー・HTML化ができる</li>
<li>Markdown内にPlantUMLを記述してプレビューが可能</li>
</ul>
</li>
</ul>
<h2 id="ideなしでのソースコードレビューのため">
IDEなしでのソースコードレビューのため</h2>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=dracula-theme.theme-dracula">dracula-theme.theme-dracula</a>
<ul>
<li>全体的な色味をいい感じにしてくれる</li>
<li>各開発言語の関数とそれ以外の色を分けて表示してくれる</li>
</ul>
</li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=davidhouchin.whitespace-plus">davidhouchin.whitespace-plus</a>
<ul>
<li>空白(whitespace)を表示してくれる</li>
</ul>
</li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=shardulm94.trailing-spaces">shardulm94.trailing-spaces</a>
<ul>
<li>行末にある空白(Whitespace)を赤く表示してくれる</li>
</ul>
</li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode.PowerShell">ms-vscode.PowerShell</a>
<ul>
<li>Powershellのプログラミング用</li>
</ul>
</li>
</ul>
<h2 id="何かと便利">
何かと便利</h2>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=eriklynd.json-tools">eriklynd.json-tools</a>
<ul>
<li>名前の通り、JSONを整形してくれるツール</li>
</ul>
</li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=flesler.url-encode">flesler.url-encode</a>
<ul>
<li>URLエンコード・デコードしてくれるツール</li>
</ul>
</li>
</ul>
<h2 id="vscodeのデザイン関連">
VSCodeのデザイン関連</h2>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme">PKief.material-icon-theme</a>
<ul>
<li>ファイルアイコンをいい感じのものにしてくれる</li>
</ul>
</li>
</ul>
<h3 id="編集後記">
編集後記</h3>
便利な使い方とか説明する記事を別に書こうかなと思っていますが、いつになるかな。。。o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-66638719530394477892019-01-27T14:36:00.000+09:002019-01-27T15:30:47.653+09:00FusionTablesからFirebaseCloudFireStoreへ<h1 id="fusiontables---firebase">
FusionTables -> Firebase</h1>
GoogleのDriveのアプリのFusionTablesを使ったアプリを個人利用で作ってみた。<br />
しかし、FusionTablesのサービスがクローズする事となったため、下記のTweetをしたら、Googleの「Firebase Realtime Database」というものを友人が教えてくれた。<br />
その備忘録である。<br />
<a href="https://twitter.com/o310yusuke/status/1078644337422913536">https://twitter.com/o310yusuke/status/1078644337422913536</a><br />
<h2 id="firebaseとは">
Firebaseとは</h2>
いろいろな方が説明されているので、割愛させていただき、私が個人的に抑えておきたい特徴は下記の通り。<br />
<ul>
<li>Googleが運営しているmBaaSである
<ul>
<li>mBaaS(mobile backend as a service ):モバイルアプリ向けに汎用的な機能を提供するバックエンドのサービス、ってところ</li>
</ul>
</li>
<li>無料でも使える</li>
<li>データの同期を自動でやってくれる</li>
<li>Googleの認証を使える</li>
<li>Android/iOS/Webサービスのいずれでも利用できる</li>
</ul>
<h3 id="firebaseのデータベースの種類">
Firebaseのデータベースの種類</h3>
利用できるデータベースには、現時点では2種類ある。<br />
比較の詳細については、<a href="https://firebase.google.com/docs/firestore/rtdb-vs-firestore?hl=ja">公式サイト</a>を参照のこと。<br />
下記には、個人的は要約を記載する。<br />
今回は「Cloud Firestore」を利用してみる。<br />
<h4 id="realtime-database">
Realtime Database</h4>
<ul>
<li>従来からあるFirebaseのデータベース</li>
<li>リアルタイムのクライアント間の同期が必要なモバイルアプリ向け</li>
<li>1つの大きな保存領域(CloudFirestoreのドキュメントに相当)があり、JSON型でデータを保存する(1つの大きなJSONツリーとして保存)</li>
</ul>
<h4 id="cloud-firestore">
Cloud Firestore</h4>
<ul>
<li>2019/01/26時点ではベータ版</li>
<li>Realtime Databaseより効果的らしい</li>
<li>複数の保存領域(ドキュメント)をまとめて(コレクション)、そこにデータを保存する
<ul>
<li>コレクション:フォルダのようなもの</li>
<li>ドキュメント:一つのファイルのようなもの</li>
<li>データ:ドキュメントにかかれている情報</li>
</ul>
</li>
</ul>
<h2 id="設定手順">
設定手順</h2>
基本的には、<a href="https://firebase.google.com/docs/firestore/quickstart?hl=ja">Cloud Firestoreのスタートガイドのサイド</a>に従って設定を行った。<br />
下記には、私が行った設定内容を備忘録代わりに記載する。<br />
<h3 id="プロジェクトを追加">
プロジェクトを追加</h3>
<h4 id="プロジェクトの追加">
プロジェクトの追加</h4>
<ul>
<li>プロジェクト名
<ul>
<li>自分が管理しやすい名称をつけるのが良さそう</li>
<li>firebase用のプロジェクトとわかる名前を設定</li>
</ul>
</li>
<li>プロジェクトID
<ul>
<li>URLとして公開されるとのことなので、注意が必要そう</li>
<li>プロジェクト名を入力すると自動入力されるが、アプリの名称に変更</li>
</ul>
</li>
<li>地域/ロケーション
<ul>
<li>アナリティクス:日本</li>
<li>ロケーション:asia-northeast1</li>
</ul>
</li>
<li>Firebase向けGoogleアナリティクスのデータ共有にデフォルトの設定を使用する:チェックOn</li>
<li>アプリでFirebaseサービスを使用することに・・・:チェックOn</li>
</ul>
上記の設定を行い「次へ」ボタンを押下すると、プロジェクトが作成される。<br />
プロジェクトが作成されると、プロジェクトのページへ自動遷移する。<br />
なお、作成されるプランは、「Spark」で無料$0/月である。<br />
<h3 id="databaseの設定">
Databaseの設定</h3>
開発タブの中から「Database」を選択し、設定を行う。<br />
Cloud Firestoreを作成するボタンを押下する。<br />
<h4 id="cloud-firestore-セキュリティルール">
Cloud Firestore セキュリティルール</h4>
<ul>
<li>テストモードで開始を選択
<ul>
<li>本来であれば、認証必須にすべき</li>
<li>今回はテスト開発のため、テストモード(参照権限を有するユーザは読み書き可)を選択</li>
</ul>
</li>
<li>作成が完了したら、ルールタブを選択し、ルールを変更
<ul>
<li>下記のように<a href="https://firebase.google.com/docs/firestore/security/get-started?authuser=0">認証必須</a>の設定に変更し、公開ボタンを押下</li>
<li>if ~の部分を追加<pre><code>// Allow read/write access on all documents to any user signed in to the application
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if request.auth.uid != null;
}
}
}
</code></pre>
</li>
</ul>
</li>
</ul>
<h2 id="開発環境の設定">
開発環境の設定</h2>
Cloud Firestoreを利用するAndroidアプリを開発するための設定を記載する<br />
<h3 id="必要な依存関係とクライアントのライブラリを追加する">
必要な依存関係とクライアントのライブラリを追加する</h3>
<ul>
<li>AndroidStudioでFirebase用のプロジェクト(カラのActivity)を作成する</li>
<li>作成したAndroidアプリのプロジェクトに、<a href="https://firebase.google.com/docs/android/setup?hl=ja">Android アプリに Firebase を追加する</a>に従って、Firebase Assistantを使用して、設定を追加する
<ul>
<li>Firestoreを探して、「Read and write documents with Cloud Firestore」のリンクを押下</li>
<li>表示された手順に従い、先程作成したプロジェクトを選択</li>
<li>接続したら、Cloud Firestoreを利用するためのGradleの設定変更を取り込む
<ul>
<li>下記のwarningがapp/build.gradlenに対して出たが一旦は無視(implementationになっているから)</li>
</ul>
<blockquote>
Configuration ‘compile’ is obsolete and has been replaced with ‘implementation’ and ‘api’.<br />
It will be removed at the end of 2018. For more information see: <a href="http://d.android.com/r/tools/update-dependency-configurations.html">http://d.android.com/r/tools/update-dependency-configurations.html</a></blockquote>
</li>
</ul>
</li>
<li>Firebase Assistantで設定したGradleのバージョンが古いので変更
<ul>
<li>変更前: 11.8.0</li>
<li>変更後: 15.0.0</li>
</ul>
</li>
<li>Cloud Firestore を初期化する</li>
</ul>
<h2 id="まだまだ先は長い・・・">
まだまだ先は長い・・・</h2>
文量が多くなってきたので、今回はここまで。<br />
次回は、Cloud FirestoreをAndroidアプリで利用するための具体的な実装を行っていく。<br />
<h2 id="ハマったこと">
ハマったこと</h2>
<h3 id="プロジェクトの再利用はしないほうが良さそう">
プロジェクトの再利用はしないほうが良さそう</h3>
FusionTablesを利用する際に作成したプロジェクトを利用して、Firebaseを利用しようとした。<br />
スタートガイドのページに、下記のように記載されている通り、FusionTablesのために作成したプロジェクトは、Firestoreのプロジェクトとして利用できないそうな。<br />
<blockquote>
<strong>Cloud Firestore と App Engine:</strong> 同じプロジェクトで Cloud Firestore と Cloud Datastore の両方を使用することはできません。両方を使用すると、App Engine を使用するアプリが影響を受ける可能性があります。別のプロジェクトで Cloud Firestore を使用してみてください。</blockquote>
※Firebaseでのプロジェクトの作成のタイミングでエラーを出してくれればいいのに。。。<br />
データベースを作成しようとしたさいに、エラーを出すなんて。。。<br />
<h2 id="関連サイト">
関連サイト</h2>
<ul>
<li><a href="https://firebase.google.com/?hl=ja">Firebase</a></li>
<li><a href="https://firebase.google.com/docs/firestore/quickstart?hl=ja">Firebase - Cloud Firestore スタートガイド</a></li>
<li><a href="https://www.topgate.co.jp/firebase01-what-is-firebase">TopGate - 【第1回】 Google の mBaaS 「 Firebase 」とは?【はじめてみよう Firebase】</a></li>
<li><a href="https://qiita.com/owen/items/c51c6ec27c9e2f5804b0">Firebaseを使い始めたら人生が変わった(ような気がした)</a></li>
<li><a href="https://firebase.google.com/docs/android/setup?hl=ja">Android アプリに Firebase を追加する</a></li>
</ul>
o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-81441121646653962972019-01-02T14:38:00.001+09:002019-01-02T14:38:17.180+09:002018年を振り返って<h1 id="年を振り返って">2018年を振り返って</h1>
<p>あけましておめでとうございます。<br>
2019年(平成31年)になりました。<br>
2018年で、自分がどのくらい成長できたのか、振り返ってみたいと思います。<br>
一部2017年の出来事も振り返りたいと思います。</p>
<h2 id="あったこと">あったこと</h2>
<ul>
<li>2017年9月:グループ会社への出向から自社への帰任
<ul>
<li>出向開始は2013年4月(岡山→東京転勤)</li>
<li>帰任理由
<ul>
<li>2014年度から特定のサービスの開発・運用を継続しており、新しいことをやりたいと思ったから</li>
<li>2017年8月の夏休み前に、自社の部長面談でその旨を伝え、夏休み明けたら「帰任決まったから」と部長からいきなり言われた</li>
</ul>
</li>
</ul>
</li>
<li>2017年12月:部署異動(東京→岡山転勤)
<ul>
<li>異動理由
<ul>
<li>担当案件の主幹部門が岡山拠点の部門だったから</li>
<li>帰任の面談のときにも言われていたからOK</li>
<li>該当案件が終了したら東京に転勤させてほしいとは伝え、聞き入れてくれたのでOK</li>
</ul>
</li>
<li>対応案件
<ul>
<li>出向中に対応していたサービスのサーバ移行開発支援(あれ?w)</li>
<li>出向中に対応していたサービスが利用するためのAPI新規開発(あれれ??ww)</li>
<li>Androidアプリ・MDM開発支援(あれ?特定サービスで使っていたタブレットと同じ??ww)</li>
</ul>
</li>
</ul>
</li>
<li>2018年4月:担当案件変更(岡山勤務)
<ul>
<li>終了案件
<ul>
<li>サーバ移行開発支援:チームから離脱</li>
<li>API新規開発:2018年3月にリリース済み</li>
</ul>
</li>
<li>対応案件
<ul>
<li>Androidアプリ・MDM開発支援(メンバーからリーダへ。。。)</li>
</ul>
</li>
</ul>
</li>
<li>2018年8月:部署異動(岡山→東京転勤)
<ul>
<li>異動理由
<ul>
<li>担当案件の客先が東京部門のため</li>
</ul>
</li>
<li>対応案件
<ul>
<li>Androidアプリ・MDM開発支援</li>
</ul>
</li>
</ul>
</li>
<li>2018年9月:担当案件変更(東京勤務)
<ul>
<li>対応案件
<ul>
<li>Androidアプリ・MDM開発支援(リーダからメンバーへ!)</li>
<li>サーバ移行 業務要件定義支援(リーダ)</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="やったこと・できるようになったこと">やったこと・できるようになったこと</h2>
<ul>
<li>サーバ移行開発支援を通して
<ul>
<li>対象サービスや仕様のナレッジの共有</li>
<li>Azure SQL Databaseでのパーティション設計・実装</li>
</ul>
</li>
<li>API開発を通して
<ul>
<li>Markdownを用いた設計書作成(atomを真面目に使った)</li>
<li>RESTfulなAPIの設計・開発</li>
<li>データストレージとしてAzure Table Storageを使用(ローカル開発環境構築が大変だった。。。)</li>
<li>SpringBootでのサーバアプリ開発(仕事で)</li>
<li>Gitを使ったソース管理(仕事で)</li>
</ul>
</li>
<li>Androidアプリ・MDM開発支援を通して
<ul>
<li>Androidアプリのデコンパイルからの変更箇所の特定</li>
<li>PHPのソースを読み込み、設計書を作成(PHPを初めてちゃんと触った)</li>
<li>PlantUMLを使ったシーケンス図の作成(atomを入れててよかった)</li>
<li>MS Projectを使ったWBS作成・管理</li>
<li>Androidアプリの要件の実現性検証のためのサンプルアプリ実装
<ul>
<li>QRコードのリーダ</li>
<li>音声レコーダ</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="思ったこと">思ったこと</h2>
<ul>
<li>サーバ移行開発支援を通して
<ul>
<li>サービスに対する関与の仕方は変わったから良かった(実開発をするチームだし)</li>
<li>経験したことのない技術を利用した開発だったから良かった(アーキを考えたり)</li>
</ul>
</li>
<li>Androidアプリ・MDM開発支援を通して
<ul>
<li>良かれと思ってネゴをしたつもりが、”開発ベンダに利用される”ということがあり、がっかり。。。</li>
</ul>
</li>
<li>サーバ移行 業務要件定義支援(リーダ)
<ul>
<li>Twitterとかでも誰かがつぶやいていたけど、「進捗どうですか?」という聞き方ではなく、「困りごとありますか?」という聞き方をすると、聞き出したい進捗が確認できる気がする</li>
</ul>
</li>
<li>全体を通して
<ul>
<li>これまでの経験が強みとなり、自分への仕事となることを実感</li>
<li>一方で、これまでに技術にトンガッた仕事をしていないし、年齢も上がっているため、技術をトンガラせれるような仕事ではなく、管理や育成の仕事を求められる</li>
<li>技術をトンガラせておくためには自分で勉強・実装する時間を設ける必要がある</li>
<li>やっぱり設計・実装は楽しい。</li>
<li>けど、スケジュールも大事。。。</li>
<li>そして、タスクの優先順位を理解することも大事。。。</li>
<li>タスクの優先順位を伝えて、スケジュールを作らせることが大事</li>
</ul>
</li>
</ul>
<h2 id="もうひと踏ん張りなこと">もうひと踏ん張りなこと</h2>
<ul>
<li>チームのタスク管理と進捗管理(WBS作成と更新)
<ul>
<li>「議論できたから良かった」となりがちだけど、「次に何をするのかをその場で明確にする」ということが大事と思ったから</li>
</ul>
</li>
<li>チーム内外のコミュニケーション
<ul>
<li>自分ひとりでは限界があるから、誰かにやってもらう必要があるので、やってもらうためのコミュニケーションが大事と思ったから</li>
<li>チームメンバが迷走しないために、WBSを作って理解してもらってから動いてもらうことが大事と思ったから(相手の年齢に関係なく)</li>
</ul>
</li>
<li>上長への報連相の仕方(上司の使い方)
<ul>
<li>コミュニケーションにも関連するけど、他の誰かに動いてもらうためには、相手に応じたコミュニケーションの仕方があると思ったから</li>
</ul>
</li>
<li>Android技術者認定試験の勉強
<ul>
<li>やろうと思って全然できていないから。。。</li>
</ul>
</li>
</ul>
<h2 id="年に向けて">2019年に向けて</h2>
<p>2018年を振り返ってみると、普段は「何もできていない」とかって考えやすいけど、仕事として新しくできるようになったことが、思っていたよりあったな、と思えた。「反省」ではなく「振り返り」をすることで、ダメだった点もポジティブに考えられるような気がしています。<br>
そして、2019年は下記のことをやってみたいな・頑張らないとかな、と思っています。特に自分の強みを明確にするためにもOutputとか資格取得が大事と思ったので、そのことを意識して動きたいと思います。</p>
<ul>
<li>Androidアプリをちゃんと作ってみる</li>
<li>ソースコード・設計書をGithubで公開する</li>
<li>実装時に調査したことを、Blogとかで発信する</li>
<li>k8sも勉強してみたいな</li>
<li>Android技術者認定試験の勉強をちゃんとする</li>
<li>PMBOK的な勉強もしなきゃ。。。得意じゃないけど。</li>
<li>悩み事・困りごとをもっと周りに伝える(特に上司に)</li>
<li>仕事でもプライベートでも相方を作る</li>
<li>チームメンバとのコミュニケーションのときは、「困りごと」「悩みごと」をまずは聞くようにしてみる
<ul>
<li>進捗確認ができる</li>
<li>リスクも確認できそう</li>
<li>スケジュールを本人に決めてもらえそう</li>
</ul>
</li>
<li>自分の売り込みポイントを探す(ヒアリングする)</li>
<li>履歴書を作る
<ul>
<li>自分の強みを明確にするために(自分を好きになるために)</li>
</ul>
</li>
</ul>
o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-24877002650414460782018-12-02T17:01:00.002+09:002018-12-15T16:17:33.050+09:00AndroidアプリでGoogleDriceのFucionTablesをAPIで使ってみる<div>
<span style="font-family: inherit;">////////// 20181215追記ここから</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">12/12にGoogleさんからメールが届いていた。</span><br />
<span style="background-color: white; color: #202124; font-variant-ligatures: no-contextual;"><span style="font-family: inherit;">Notice: Google Fusion Tables Turndown というタイトルで。</span></span><br />
<span style="background-color: white; color: #202124; font-variant-ligatures: no-contextual;"><span style="font-family: inherit;">2019/12/3にサービス終了する、とのこと。</span></span><br />
<br />
自作アプリのデータ保管先として利用していこうと思ったところだったのに、残念・・・<br />
<span style="background-color: white; color: #202124; font-variant-ligatures: no-contextual;"><span style="font-family: inherit;"><br /></span></span>
<span style="background-color: white; color: #202124; font-variant-ligatures: no-contextual;"><span style="font-family: inherit;">公式サイトはこちら。</span></span><br />
<span style="background-color: white; font-variant-ligatures: no-contextual;"><span style="color: #202124;">https://support.google.com/fusiontables/answer/9185417?hl=en</span></span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">////////// 20181215追記ここまで</span><br />
<br />
# なんでやってみた?</div>
GoogleDrive上のスプレッドシートに日々の体重とかを記録している。<br />
<div>
最初は件数が少なかったから良かったけど、気づけば4年も記録していて、</div>
<div>
比較のグラフなんて見たいと思っても、なかなか大変。</div>
<div>
<br /></div>
<div>
ということで、アプリでその辺をうまくカスタムして、既存のデータはそのまま流用したいと思い、うまいことできないかと調査。</div>
<div>
そしたら、GoogleDriveにも簡単なDBを再現したFution Tablesというものがあると判明。</div>
<div>
<br /></div>
<div>
ということで、試してみる。</div>
<div>
<br /></div>
<div>
# やったこと</div>
<div>
## Fusion Tables を有効にする</div>
<div>
(1)のサイトを参考に、Fusion Tablesを有効にし、空のテーブルを作成。</div>
<div>
カラムを想定した内容に変更。<br />
また、「リンクの共有」をOnにし、「リンクを知っている全員」がアクセス</div>
<div>
参考サイトでは、スクリプトエディタでデータの操作方法を紹介しているが、今回は割愛。</div>
<div>
<br /></div>
<div>
## Google Drive APIが利用できるようにする</div>
<div>
- プロジェクトの作成</div>
<div>
(2)のサイトを参考に、プロジェクトを作成。<br />
具体的には下記のサイトにアクセスして作成。<br />
<a href="https://code.google.com/apis/console/">https://code.google.com/apis/console/</a><br />
<br /></div>
<div>
<br /></div>
<div>
- API登録</div>
<div>
API登録を行おうとしたが、管理画面が更新されたようで、参考サイトの内容とは異なっていた。</div>
<div>
「Identity-Aware Proxy」からAPIの登録ができそう。</div>
<div>
画面遷移をすると、「IPAを使用するには、OAuth同意画面を構成する必要があります。」とのことなので、「同意画面を構成」してみる。<br />
<br /></div>
<div>
すると、「APIとサービス」という画面の「認証情報」の画面に遷移。</div>
<div>
左メニューの「ダッシュボード」をクリック。</div>
<div>
画面上部の「APIとサービスの有効化」ボタンをクリック。</div>
<div>
検索窓に「Fusion」を入力して「Fustion Tables API」が表示されるので、</div>
<div>
クリックして「有効にする」をクリック。</div>
<div>
これでAPIの登録は完了。</div>
<div>
<br /></div>
<div>
- 認証情報の登録</div>
<div>
APIの登録が完了すると、画面が自動遷移し、Fusion Tablesの設定画面に自動遷移。</div>
<div>
認証情報を作成する必要がある旨のメッセージが表示されるので、作成してみる。</div>
<div>
画面に従って、下記を設定。</div>
<div>
<br /></div>
<div>
1.必要な認証情報の種類を調べる</div>
<div>
- 使用するAPI: Fusion Tables API</div>
<div>
- APIを呼び出す場所: Android(今回はAndroidアプリから呼びたいので)</div>
<div>
- アクセスするデータの種類: ユーザーデータ(なんとなく)</div>
<div>
2.OAuth2.0クライアントIDを作成する</div>
<div>
- 名前:適当に設定(Fusion Tablesで作成したTable名に合わせた)</div>
<div>
- フィンガープリント</div>
<div>
※デバッグ用のフィンガープリントを取得したいので、下記のコマンドを実行する<br />
※PW入力を求められるので、デバッグ用証明書のPW「android」を入力する<br />
※実行結果のSHA-1 署名証明書フィンガープリントをコピペ<br />
> keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v</div>
<div>
- パッケージ名:利用対象のAndroidアプリのパッケージ名</div>
<div>
※Androidアプリのパッケージ名を記入</div>
<div>
→「OAuthクライアントIDを作成」ボタンをクリック<br />
3.OAuth2.0同意画面を設定する<br />
- メールアドレス:プロジェクトの管理者のアドレスを選択する<br />
- ユーザーに表示するサービス名:[ProjectName]-Fusion<br />
※どのプロジェクトのどのサービスかがわかるようにしたら良さそう<br />
→「次へ」ボタンをクリック<br />
4.認証情報をダウンロードする<br />
※必要に応じてダウンロード<br />
→「完了」ボタンをクリック<br />
<br />
完了すると、APIとサービスの画面の認証情報が選択された画面に戻る<br />
作成した認証情報が表示されていればOK。<br />
<br />
## APIを利用するAndroidアプリを作っていく<br />
AndroidStudioを起動し、プロジェクトを作成する<br />
特に注意するのはパッケージ名だけで、他は通常のAndroidアプリを作るときと同じ<br />
<br />
- Create Android Project<br />
- Application name<br />
OAuth2.0クライアントIDを作成した際に設定した「名前」を入力する<br />
- Company domain<br />
OAuth2.0クライアントIDを作成した際に設定したパッケージ名を入力する(アプリ名を除いた部分)<br />
- Project location<br />
適宜<br />
- Package name<br />
OAuth2.0クライアントIDを作成した際に設定したパッケージ名になっていることを確認する<br />
- Inclode XXXX<br />
適宜<br />
- Target Android Devices<br />
今回はスマホでの利用を想定するので、「Phone and Tablet」を選択する<br />
対象APIバージョンは、自分のスマホに合わせて選択する<br />
- Add an Activity to Mobile<br />
自分で画面を頑張って作るので「Empty Activity」を選択する<br />
- Configure Activity<br />
デフォルトの内容のまま<br />
<br />
## 作成したプロジェクトの設定を変更していく<br />
- ライブラリ追加<br />
API利用のためにGoogleアカウント認証を利用できるようにする<br />
<br />
ファイル: app/build.gradle<br />
内容:<br />
dependencies {<br />
...<br />
compile 'com.google.android.gms:play-services-auth:16.0.1'<br />
compile 'com.google.android.gms:play-services-drive:16.0.0'<br />
}<br />
<br />
- パーミッション追加<br />
インターネット接続のパーミッションを追加する<br />
<br />
ファイル: AndroidManifest.xml<br />
内容:<br />
<uses-permission android:name="android.permission.INTERNET" /></div>
<div>
<br />
- 認証処理の実装<br />
(5)のサイトの「認証処理」の内容を実装する<br />
<br />
- データ取得の実装<br />
(5)のサイトの「テーブル情報の取得」に記載の内容を実装する。<br />
selectの結果は、JSON形式だが、InputStreamに格納される。<br />
そのため、InputStreamからString、そしてJSONオブジェクトに変換が必要。<br />
なお、FusionTablesのレコードは、"rows"に配列で格納されているので、JSONArrayで取得する。<br />
詳細は(9)のサイトを参照。<br />
<br />
なお、Androidの場合、APIを呼び出すときには非同期で処理する必要がある。<br />
そして、非同期処理にてUIの変更は禁止されている。<br />
なので、AsyncTaskクラスを使って非同期で呼び出し&呼び出し後にUI更新を行う。<br />
具体的には、下記の通り。<br />
<br />
- AsyncTask#doInBackgroundで非同期(別スレッド)でAPIを呼び出す。<br />
取得した結果をメインスレッドに返却するために、AsyncTaskの第三引数をVoidではなく、返却するオブジェクトの型(例:ListやString)を指定する。<br />
- AsyncTask#onPostExecuteでdoInBackgroundの処理結果を受け取り、UIを更新する(メインスレッド)<br />
<br />
これでハマって取得したデータを表示できなかった。。。<br />
また、非同期処理の結果を返却するためのAsyncTaskクラスの宣言にハマった。<br />
取得したデータは、TableLayoutとTableRowを利用して、表形式で表示した。<br />
<br />
- データ登録の実装<br />
(5)のサイトの「テーブル行追加処理」に記載の内容を実装する。<br />
取得時と同様に、例外処理は割愛されている。<br />
Insertの結果もInputStreamで取得可能。内容は、登録した際のrowIDが得られる。<br />
<br />
# 感想<br />
FusionTablesを利用したSelectとInsertをAndroidアプリとして実行できるようになった。<br />
また、Androidアプリで表形式でのデータ表示もできるようになった。<br />
ただ、(5)のサイトに紹介されている方法は、SQLを直接実行するようになっている。<br />
FusionTablesはAPI化されているのに、SQL直接実装は格好が悪いように感じた。<br />
なので、もう少し格好良い実装ができないか、追加調査をしてみる。<br />
また、Select/Insertの他にUpdate/Deleteも実装してみたいと思う。<br />
それは別の記事として投稿させていただく。<br />
<br />
※なお、作成したソースはGithubで公開したいけど、パスワードとか入っているので、キレイにしてから公開したいと思う。<br />
<br />
<br />
# 参考サイト</div>
<div>
1)GoogleDriveでデータベースを使ったみた</div>
<div>
https://sitest.jp/blog/?p=8701</div>
<div>
2)Google APIからGoogle Fusion Tablesに触れる</div>
<div>
http://schima.hatenablog.com/entry/2013/11/28/005648</div>
<div>
3)AndroidアプリでGoogle Drive APIを使う</div>
<div>
http://vividcode.hatenablog.com/entry/20130908/1378613811<br />
4)Google Drive APIの有効化とクライアントID、クライアントシークレットの取得方法<br />
https://www.virment.com/google-drive-api-activate/<br />
5)AndroidからFution Tablesを操作する<br />
https://qiita.com/kassy_kz/items/4c0ca6571fa3f5004ec1<br />
6)Google Play Serviceのバージョン確認<br />
https://developers.google.com/android/guides/setup<br />
7)AndroidからAPIを叩いてJSON取って中身を表示させるまで<br />
https://qiita.com/minme31/items/a9636cb0453524c64e67<br />
8)Google Table Fusions リファレンス(英語)<br />
https://developers.google.com/fusiontables/docs/v2/reference/<br />
9)Fusion Tables REST API : Query<br />
https://developers.google.com/fusiontables/docs/v2/reference/query/sql</div>
<div>
<br /></div>
<div>
<br /></div>
o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-18500017435571206912018-01-19T01:45:00.001+09:002018-01-19T01:46:50.769+09:00XXPayでできるスマホ決済とは<p dir="ltr">久々の投稿です。<br>
自分向けのメモとして。</p>
<p dir="ltr">モバイルSuicaが登場してから、Suicaと楽天Edyの電子マネーを使っていました。<br>
ここ最近はnanacoも使うようになりました。<br>
一方で、ここ数年でXXPayが出てきました。試しにAndroidPayを入れてみましたが、何だか分からず、特に勉強せずに利用しないでいました。</p>
<p dir="ltr">今日、ふと、何のことか、知りたくなりいくつかのサイトを調べてみました。<br>
お店で支払いをする方法で比較したら分かりやすかったです。</p>
<p dir="ltr">・電子マネー<br>
これまでは、お財布に入れていたお金から支払いをしていた。<br>
それに代わり、スマホに入金しておいたお金で支払いをする。<br>
電子マネーは現金での支払いを電子化(スマホでできるように)した。</p>
<p dir="ltr">・XXPay<br>
これまでは、お財布に入れていたクレジットカードを店員に渡してスキャンして支払いをしていた。<br>
それに代わり、スマホに登録したクレジットカードをスキャナにかざすなどして、支払いをする。<br>
XXPayはクレジットカードでの支払いを電子化(スマホでできるように)した。</p>
<p dir="ltr">と、こんな理解で良さそうな気がします。<br>
クレジットカードを店員に渡してスキャナに通す訳ではないので、より安全だ、ということなんだろうな。<br><br></p>
o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-35841417837848424772012-12-03T01:22:00.001+09:002012-12-03T01:22:24.543+09:00GAE/Jのアノテーション@Modelでの注意点実際に経験して、しばらく解決ができなかった事象について共有します。
<br />
<br />
業務でGAE/JでSlim3をフレームワークとしてWebアプリを作っています。<br />
以下のようなルールを設定して使用するEntityを作成していました。<br />
<br />
<br />
<ul>
<li>Javaのクラスは末尾に「Model」をつける</li>
<li>Kind名には「Model」を付けない<br />→アノテーションでKind名を設定する<br /><div class="p1">
<span class="s1"> 例)@Model</span>(kind=<span class="s2">"カインド名"</span>)</div>
</li>
</ul>
<br />
<br />
新規でEntityを作ってアノテーションを設定していました。<br />
そしたら、以下のような状況が発生しました。<br />
<br />
<br />
<ul>
<li>ローカルの開発環境ではデータがうまく取得できる</li>
<li>GAE環境にデプロイしたらデータがうまく取得できない</li>
<li>GAE管理画面では該当のKINDにデータが投入されていることは確認できた</li>
</ul>
<br /><br />
ん〜ってソースを見なおしていたら・・・<br />
<br />
<span class="s1">@Model</span>(kind=<span class="s2">" カインド名"</span>)<br />
<br />
こんな感じになっていました。<br />
??<br />
一見間違いはない。問題はない。<br />
<br />
よーく見ると・・・<br />
<br />
<span class="s1">@Model</span>(kind=<span class="s2">" カインド名"</span>)<br />
<br />
そう、カインド名の前に半角スペースが!!<br />
ローカルの開発環境ではうまく動くっていうのが非常に辛い><<br />
<br />
皆様ご注意下さい。。。o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-78620264534654343142012-12-03T01:03:00.000+09:002012-12-03T01:03:06.532+09:00MacのEclipse Juno(4.2)にstepcounterをインストールとある事情があってMacにインストールしたEclipse Juno(4.2)にstepcounterをインストールしました。
<br />
stepcounterは、以前<a href="http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi?page=StepCounter" target="_blank">ProjectAmaterasのページ</a>で公開されていました(Version2.0まで)。現在は、<a href="https://github.com/takezoe/stepcounter" target="_blank">Github</a>で開発・公開が進められているそうな。<br />
<br />
<br />
<ul>
<li>stepcounterのダウンロード<br /><a href="http://d.hatena.ne.jp/takezoe/20120421" target="_blank">2012-04-21-新・たけぞう瀕死の日記</a>に記載されているGithubのダウンロードページから。<br /><a href="https://github.com/takezoe/stepcounter/downloads" target="_blank">Github:takezoe/stepcounter download</a><br />この記事を書いた2012/12/02現在はVer3.0.1が最新でした。<br /><br />上記ページから「jp.sf.amateras.stepcounter_3.0.1.201204211246.jar」をダウンロードしました。<br /></li>
<li>インストール<br />インストールしたEclipseのpluginsのフォルダに先にダウンロードしたjarをコピペ。<br />そしたら、Eclipseを再起動。<br />以上!!<br /></li>
<li>参考サイト</li>
<ul>
<li>stepcounterのダウンロード<br /><a href="http://d.hatena.ne.jp/takezoe/20120421" target="_blank">2012-04-21-新・たけぞう瀕死の日記</a></li>
<li>stepcunterのインストール・使い方<br /><a href="http://javasystem.blog4.fc2.com/blog-entry-74.html" target="_blank">あるシステム屋による開発の記録:EclipseプラグインSpteCounterを導入する</a></li>
</ul>
</ul>
<br /><br />
<div>
無事に使えましたw</div>
o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-51727010761607657992012-10-07T14:50:00.001+09:002012-10-07T14:50:55.720+09:00GAE/Jでメール送信機能を実装してみた<p>
GAE/Jでメールを送信する機能が必要となったので、調べて実装してみました。<br />
参考にしたGoogle App Engineの日本語サイトは
<a href="https://developers.google.com/appengine/docs/java/mail/overview?hl=ja">こちら(※1)</a>。<br />
⇒https://developers.google.com/appengine/docs/java/mail/overview?hl=ja
</p>
<p>
このページによると、Mail Service Java API は、メール メッセージの送信用に JavaMail(javax.mail)インターフェースをサポートしているそうです。基本的なメール送信の実装方法はこちらのサイトをご参考ください。
</p>
<p>
ちなみにローカルで実行した場合には、メールは送信されません。
その代わりに、コンソールに送信しようとしたメールの内容が出力されます。
ここで困ったことは、メール本文は出力されなかったこと。
現在も表示方法がわからないので、もしご存知の方がいたら教えていただけると幸いです^^
</p>
<p>
GAE/Jにデプロイしてケータイにメール送信をして動作確認してみました。
そしたら、英語の件名、本文はきちんと送信されました。<br />
<br />
が、しかし!!<br />
<br />
日本語の件名が文字化けしていました;;<br />
本文の日本語はきちんと表示されていたんですけど、件名だけが・・・<br />
画面から入力した日本語を含む件名をGAE管理画面でログ出力するように実装して確認したら、きちんと表示されていました。。。
</p>
<p>
色々と調べてみたら、<a href="http://www.javadrive.jp/javamail/smtp/index3.html">分かりやすいサイト(※2)</a>を発見しました。<br />
件名はきちんと文字コードを設定しないと文字化けしてしまうようです。
しかも、"ISO-2022-JP"にしないといけない、という事でした。<br />
ということで、以下のように変更してみました。
</p>
<p>
<blockquote>
変更前:msg.setSubject("日本語の件名");<br/>
⇒<br/>
変更前:msg.setSubject("日本語の件名", "ISO-2022-JP");
</blockquote>
</p>
<p>
が、コンパイルが通らない。。。<br/>
よくよくサイトを見ると、もう一箇所修正が必要でした。
</p>
<p>
<blockquote>
変更前:Message msg = new MimeMessage(session);<br/>
⇒<br/>
変更後:MimeMessage msg = new MimeMessage(session);
</blockquote>
</p>
<p>
これでコンパイルが通り、日本語の件名も使えるようになりました!!<br />
本文についても、文字コードを指定してあげる方が安全かもしれません。私はやっておきました。
</p>
<p>以上!!</p>
<p>
<h4>参考サイト</h4>
<ul>
<li>(※1)<a href="https://developers.google.com/appengine/docs/java/mail/overview?hl=ja#Sending_Mail_with_the_JavaMail_API">Google Developers : Google App Engine > Mail Java APIの概要</a><br />GAE/Jでメール送信するための方法が書いてある</li>
<li>(※2)<a href="http://www.javadrive.jp/javamail/smtp/index3.html">JavaDrive:Home > JavaMailでメール送信 > メールの送信 > Messageクラス</a><br />JavaMailで件名に日本語を使う方法が書いてある</li>
</ul>
</p>o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-88866234562424200602012-08-04T03:51:00.001+09:002012-10-14T16:24:05.179+09:00GAE/Jアプリのローカル・データストアのアップ・ダウンロードGoogle App Engine SDK for Java を利用したアプリを開発している。<br />
ユーザ認証をするときにGoogleアカウントを利用せず、データストアにユーザマスタを作成して行っている。<br />
<br />
データのアップロード・ダウンロードにはGoogle App Engine SDK for Pythonで公開されているappcfg.pyとbulkloader.yamlを使った一括ローダーが一般的だろう。<br />
<a href="https://developers.google.com/appengine/docs/python/tools/uploadingdata?hl=ja">データのアップロードとダウンロード</a><br />
<br />
しかし、「開発用サーバーへのデータのロード」にローカル環境へのコマンドが記載されているが、同じようにやってもうまく行かず、結局イマイチよく分からなかった。これってpythonで作ったアプリに対してだけなのかな、って判断した。なので、マスタ登録用のロジックを組んで・・・って感じで登録を行っていた。<br />
<br />
これが相当面倒・・・<br />
できれば、ユーザマスタとか他のマスタデータをエクセルやCSVファイルとかで用意して、ローカル環境で動作確認をしたかった。<br />
<br />
色々調べたり、試してみたりしていたところ、<br />
<blockquote><b><i><u>httplib.BadStatusLine</u></i></b></blockquote>という例外が発生していた。<br />
<br />
これを調べてみるとProxy設定の記事にたどり着いた。<br />
<br />
おや?<br />
<br />
会社からGAE環境にアップするときには、会社のProxy設定をしている。<br />
ということは??ローカルURLでProxy設定を行うのか?????<br />
<br />
やってみよう!!<br />
<br />
ということで、やってみた。<br />
<br />
・・・<br />
<br />
・・・・・・<br />
<br />
でけたーーーーーーーーー!<br />
<br />
<br />
という事で、データアップロードの手順とかまとめる。<br />
諸々のインストールとかEclipseからGAE/JでWebApplicationとして実行できるとか、yamlファイルを作成と編集とか、そこらへんは割愛!<br />
<br />
<ul><li>設定内容<br />
<ul><li>OS:Windows</li>
<li>ポート番号:8888</li>
<li>リモートAPIのパス:http://localhost:8888/remote_api</li>
<li>アップするデータファイル:CSVファイル</li>
</ul></li>
</ul><br />
<ol><li>Google App Engine for Pythonにパスを通す<br />
<blockquote>set PATH=%PATH%;appEnginePython¥bin </blockquote></li>
<li>Proxy設定を行う<br />
<blockquote>set HTTP_PROXY=http://localhost:8888<br />
set HTTPS_PROXY=http://localhost:8888<br />
</blockquote></li>
<li>Eclipseで該当のアプリを起動</li>
<li>アップロードコマンドの実行!<br />
<blockquote>appcfg.py upload_data<br />
--filename=xxxxx.csv<br />
--config_file=bulkloader.yaml<br />
--url=http://localhost:8888/remote_api<br />
--kind=xxxx<br />
-v --no_cookies --email=test@example.com --passin<br />
</blockquote></li>
<li>メールアドレスのパスワードの入力が求められるので、入力</li>
</ol><br />
上記手順でローカル環境へのアップロードが完了する!(はず・・・)<br />
<br />
ちなみに、プロキシはEclipseの起動オプションで設定したものを、メールアドレスとパスワードは何でもOKです。<br />
ポイントはアップロードコマンドにアプリケーションIDを指定するオプションを使用しないこと。<br />
<br />
理由は分からないけど、アプリケーションIDを指定してしまうと、データが行方不明になりましたw<br />
<br />
ダウンロードも同様の設定でできた〜o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-65519029709740108482012-05-15T00:32:00.000+09:002012-05-15T00:32:46.871+09:00良いソースとは?-Javaの参照型変数と引数- 私の結論先日5月7日に記事を一つ書かせていただいた。<br />
「<a href="http://yusuke-memo.blogspot.jp/2012/05/java.html">良いソースとは?-Javaの参照型変数と引数</a>」<br />
<br />
簡単におさらいを。<br />
<br />
<hr />最近の悩み。<i><b>「良い設計・ソースとは」</b></i><br />
【要件】<br />
あるクラスの中で、0から9までの整数を格納しているリストが必要である。<br />
今回はこのリスト取得のために、1つメソッドを作成したい。<br />
メソッドは以下の要件を満たすこと。<br />
<ul><li>アクセス修飾子:private</li>
<li>メソッド名:createList</li>
</ul>と、上記のように2人のコーダーに伝えたとする。 すると、下記のようなメソッドが納品された。<br />
<br />
【納品物1】<br />
private void createList(List <Integer> list) {<br />
for(int i = 0; i < 10; i++) {<br />
list.add(new Integer(i));<br />
}<br />
}<br />
<br />
【納品物2】<br />
private List<Integer> createList() {<br />
List<Integer> result = new ArrayList<Integer>();<br />
for(int i = 0; i < 10; i++) {<br />
result.add(new Integer(i));<br />
}<br />
return result;<br />
}<br />
<hr /><br />
「1と2でどちらが良いか」についてコメントをいただいた。<br />
コメントを頂戴いただいた方々、この場を持って御礼申し上げます。<br />
ありがとうございました。<br />
<br />
頂いたコメントをまとめるとこんな感じ。<br />
<ul><li>2が良い。</li>
<li>1はNullチェックや引数のリストに対して追加をする場合には良い。(条件付)</li>
</ul><br />
私も2が良いと考える。その理由は以下の通り。<br />
<ul><li>要件から「作成したメソッドを呼び出すことで、必要なリストが作成される」と読み取れ、満足するのは2である。</li>
<li>1を使用する場合、呼び出し元で予期せぬデータ操作が行われてしまう可能性がある。</li>
<li>1を使用する場合、予期しない例外が発生する可能性がある。</li>
</ul>つまり、コメント頂いた方々と同じ理由だ。<br />
<br />
もし、1のように実装する場合は、呼び出し側で明示的に入れ替える処理を記載するようにListをreturnするのが良いと思う。<br />
そうすれば、呼び出し元で予期しないデータ操作を幾らか回避することができると考える。<br />
<br />
コメントでも頂いたのだが、<br />
<blockquote>結局はそのメソッドの責務を明確にすることが重要で、その責務に見合った引数と戻り値を設定することが大切ではないか<br />
</blockquote>ということだと思う。<br />
後輩に説明する際には、コメント頂いた内容を参考にさせていただきます。<br />
<br />o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-66433024320640587262012-05-07T01:06:00.000+09:002012-05-07T01:06:23.174+09:00良いソースとは?-Javaの参照型変数と引数<p>
仕事で詳細設計と実装をやっていたり、後輩のソースコードレビューをしたり。
そこで最近の悩み。<br />
<br />
<b><i>「良い設計・ソースとは」</i></b><br />
<br />
私自身、”何が良い”という好みはある。けど、後輩に指導するときの根拠として弱いと思う。
そこで、皆さんのご意見をお聞かせ頂けたら、と思って今回のブログを書かせていただきたい。
今回は実際に私が困った事と類似の例を紹介させていただく。
</p>
<hr />
<p>
<b>【要件】</b><br />
あるクラスの中で、0から9までの整数を格納しているリストが必要である。<br />
今回はこのリスト取得のために、1つメソッドを作成したい。<br />
メソッドは以下の要件を満たすこと。
<ul>
<li>アクセス修飾子:private</li>
<li>メソッド名:createList</li>
</ul>
と、上記のように2人のコーダーに伝えたとする。
すると、下記のようなメソッドが納品された。
</p>
<p>
<b>【納品物1】</b>
<pre>
private void createList(List<Integer> list) {
for(int i = 0; i < 10; i++) {
list.add(new Integer(i));
}
}
</pre>
</p>
<p>
<b>【納品物2】</b>
<pre>
private List<Integer> createList() {
List<Integer> result = new ArrayList<Integer>();
for(int i = 0; i < 10; i++) {
result.add(new Integer(i));
}
return result;
}
</pre>
</p>
<hr />
<p>
どちらも要件を満たしているが・・・<br />
<ul>
<li>どちらが”良い”ソースだと思いますか?</li>
<li>それはなぜですか?</li>
</ul>
コメントに皆様のご意見をお書き頂けたら幸いです。
</p>o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com2tag:blogger.com,1999:blog-2789325012697036639.post-16191015238146227412012-05-06T17:15:00.000+09:002012-05-06T17:15:22.296+09:00JavaOne Tokyo 2012に参加して~4月5日~<p>
遅くなってしまいましたが、4月4日と5日に開催された
<a href="http://www.oracle.com/javaone/jp-ja/index.html">JavaOne</a>
の二日目の5日の参加報告です。
</p>
<p>
【参加したセッション】
<ol>
<li> 9:00-11:00 [JK2-01] Technology Keynote</li>
<li>11:15-12:15 [JS2-01] Chuck Munn Lee 「The Java EE 6 Programming Model Explained」</li>
<li>12:30-13:30 ランチセッション-エンジニアに直接質問してみよう!</li>
<li>13:15-14:15 休憩</li>
<li>14:30-15:30 [JS2-24] 輪島 裕之 「ビジネスの継続的改善に貢献するJava EEアーキテクチャとアジャイル開発」</li>
<li>15:45-16:45 [JS2-33] 山本 裕介 「JSR 353: Java API for JSON Processing」</li>
<li>17:00-18:00 [JS2-41] Douglas Clarkeis 「Java Persistence API on the Grid」</li>
<li>18:15-19:15 [BoF2-04] 木村 貴由、寺田 佳央 「The New JSR-107 Caching Standard 」</li>
<li>19:30-20:30 スペシャルセッション</li>
</ol>
</p>
<hr />
<div id="jk2-01">
<b><u>1. 9:00-11:00 [JK2-01] Technology Keynote</u></b>
<p>
■SE 7での主な変更点
<ol>
<li>MapやらListの宣言時の型宣言を行うジェネリックス<br >
-> 左辺だけ記述して、右辺については省略可能</li>
<li>Switch文の条件にStringが使用可能に</li>
<li>try-catchのcatch句で条件をor表記可能に<br />
-> 例) catch(NullPointerException | NumberFormatException)</li>
<li>FileStreamのclose()が不要になる<br />
-> try-with-resourceを使って自動close</li>
</ol>
</p>
<p>
(1)については非常に嬉しい!<br />
MapのMapを作ったときには1行が200文字程度になったりするから・・・
ま、そんなMapを作るくらいならBeanをうまく作った方が現実的なような気がしますが(汗)
</p>
<p>
(2)これについても嬉しい!<br />
Stringの比較をする際にはIf文が大変なことになるから。
それがSwitch文で書ければ、分岐が分かりやすくなる。
</p>
<p>
(3)今まで予期したExceptionのCatch句が複数になる場合、
ログ出力とかはそのクラス内でprivateメソッドを作って共通処理化して、
そのメソッドを呼び出すようにしていた。
結局テストのし易さとかで判断するようになると思うけど、
今はまだ旨みが分からんな。。。
</p>
<p>
(4)これってDBのトランザクションもだっけ?<br />
それだったらかなり嬉しい!ちょっと調査が必要だな。
</p>
</div>
<div id="js2-01">
<b><u>2.11:15-12:15 [JS2-01] Chuck Munn Lee 「The Java EE 6 Programming Model Explained」</u></b>
<p>
正直なところ、英語も早かったし、通訳も早かった。。。
途中まで、というか最初しか付いていけなかった。
</p>
<p>
分かった範囲では、次の感じ。
<ul>
<li>これまでWeb.xmlに書いていたサーブレットの設定がアノテーションでできる</li>
<li>同じくフィルターの設定もアノテーションでできる</li>
</ul>
<p>
これでweb.xmlの記載量が減ることは確か。<br />
でも、一方のサーブレットから他方のサーブレットを呼びたい時はどうすんだ?
サーブレットクラス自身には自分のマッピングルールだけ書けば、
他のサーブレットからでも、そのマッピングルールが参照できるってこと?
1ユースケース内であればイイと思うけど、ユースケースの入り口のような
複数箇所から呼ばれそうなサーブレットはweb.xmlに記載して共通化した方が
チーム開発では便利なような気がする。。。
</p>
<p>
フィルタに関してはSaStrutsでも同じようにできるようになるのか?
それならweb.xmlが太ることなく設定できるからいいかも。
けど、どのクラスに設定したかは探すのが大変になりそうだ。
でも、パッケージ構成とかクラス名とかを工夫すれば解決できるか。
ん~どうなんだろ??
</p>
</div>
<div id="lanch">
<b><u>3.12:30-13:30 ランチセッション-エンジニアに直接質問してみよう!</u></b>
<p>
正直なところ、ご飯を食べてるだけで、ほとんど英語でディスカッションされていたので、
内容が分からなかった。。。
本来はネイティブな方が通訳になってくれて、日本語での質問がOKだったのに、10回中3回くらいしか日本語なかった。
</p>
</div>
<div id="reflesh">
<b><u>4.13:15-14:15 休憩</u></b>
<p>
ノートPCとケータイの充電が(私の体力も)切れてしまったので、カフェで1時間休憩した。<br />
この間にGmailに来てたメールを処理したり、ブログ書くようにまとめ作業を行ったりした。
カフェは窓際に面していて、東京タワーやスカイツリーが見えた。風景写真を撮影している人も居た。
とても明るく開放的な雰囲気で、電源タップが用意されていたので、PCを触ったり食事をしながら雑談をしたり、って感じ。
あとは、各協賛会社のブースもあって、かなりにぎわっていた。
</p>
</div>
<div id="js2-24">
<b><u>5.14:30-15:30 [JS2-24] 輪島 裕之 「ビジネスの継続的改善に貢献するJava EEアーキテクチャとアジャイル開発」</u></b>
<p>
アジャイル開発の事例紹介が聞けると思って参加。確かに事例は聞くことができた。<br />
他の会社がどのように開発スケジュールをひいているのか、を聞くことができた。
また、要員確保の方法と契約方法について、どのような契約方法があってどのような特徴があるのかを知ることができた。
</p>
</div>
<div id="js2-33">
<b><u>6.15:45-16:45 [JS2-33] 山本 裕介 「JSR 353: Java API for JSON Processing」</u></b>
<p>
TwitterだけでなGoogle、Yahoo!でも使用されているJSON(JavaScript Object Notation)。
現在最もポピュラーなWebAPIであるJSONについて標準化を行っていること、その内容についてお話いただいた。
XMLと比較して、JSONは設定が簡単で人間でも読みやすいのが特徴。
</p>
<p>
■Javaの標準化に関する略称
<ul>
<li>JCP:Java Community Process Java標準化機構</li>
<li>JSR:Java Specification Request Java新機能提案</li>
<li>TCK:Technology Compability Kit 準拠判断テストツール</li>
</ul>
</p>
<p>
JSONについては、JSR353で標準化作業が行われている。
標準として策定されるためにはTCKも作成する必要がある。
</p>
<p>
このセッションの中で一番驚いたのが、
JSONのモデリングにVisitorパターンが採用されていること。
Visitorパターンをちゃんと把握しているわけではないけど、ちょっと違和感を感じた。
Template Methodの方がしっくりくるような気もするけど。。。
</p>
<p>
このJSR353が策定・承認されて、Javaの標準APIとして搭載されるようになれば、
独自でAPIを突っ込む必要がなくなるので、楽になるだろうなぁ。
</p>
</div>
<div id="js2-41">
<b><u>6.17:00-18:00 [JS2-41] Douglas Clarkeis 「Java Persistence API on the Grid」</u></b>
<p>
このセッションではJavaとDatabaseとの関連について話があったみたい。
正直私の頭では、ついていくことがかなり難しかった。。。
</p>
<p>
ついていけたのは<br />
<i>「Java Persistence API(JPA)は、POJOとDBのEntityをマッピングしてくれる」</i><br />
ということ。<br />
このマッピングルールはアノテーションまたはXMLで設定する。
実際のマッピング処理は、Entity Manager Factoryが行う。
JPAはキャッシュを行うので、パフォーマンス向上も図れる。
けど、キャッシュ上にあるデータとDB上にあるデータでの不整合発生が問題点だったからコントロールできるようにした。
それがData Gridらしい。
</p>
<p>
ここら辺から「コヒーエンス」とか知らない単語がバンバン出てきて付いていけなくなってしまった。。。
とりあえず、アノテーションとかXMLを利用することで、DBのエンティティとのマッピングを自動化できることが分かった。
具体的な使い方については、分からないので、調べて試してみる必要があるな。
</p>
</div>
<div id="bof2-04">
<b><u>7.18:15-19:15 [BoF2-04] 木村 貴由、寺田 佳央 「The New JSR-107 Caching Standard」</u></b>
<p>
Java EE 7で本格導入されるJavaのキャッシュについてのお話。
寺田さんと木村さんの絶妙なやり取りが面白く、飽きないプレゼンだった。
</p>
<p>
JCache(JSR107)がJava Objectのキャッシュ。
使い方はConcurrentMapに類似していて、Java SE/EE 6以降で使用可能。
mavenを使用することでAPIをインポートすることができる。
</p>
<p>
Google App Engineではmemcahceが該当する。
</p>
<p>
キャッシュの対象にすべきデータは下記の4種。
<ul>
<li>DBから取得した値(参照回数の多いデータ)</li>
<li>ネットワーク越しの処理結果</li>
<li>オブジェクト生成に時間のかかる処理結果</li>
<li>大規模Session情報(Sessionに大きな情報を格納すると読み書きバッファが多くかかるから)</li>
</ul>
</p>
<p>
GAEではレスポンス時間とデータ量がポイントになってくるから、
Sessionとキャッシュとリクエストとをうまく使い分けていく必要があると感じた。
どのタイミングで確定させるのがいいのかな?やっぱり詳細設計の段階かな~
</p>
</div>
<div id="session">
<b><u>8.19:30-20:30 スペシャルセッション</u></b>
<p>
スペシャルセッションでは、各勉強会の主催者によるパネルディスカッション。
社内の勉強も大切だがそれだけでは不十分なんだな、って感じました。
私個人では自分で勉強会を立ち上げるのは、ちょっと厳しいので既存の勉強会から参加して勉強をしていこうと思った。
</p>
</div>o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-62546378209580362312012-04-09T00:07:00.000+09:002012-04-09T00:07:11.985+09:00JavaOne Tokyo 2012に参加して~4月4日~<p>
7年ぶりに日本で<a href="http://www.oracle.com/javaone/jp-ja/index.html">JavaOne</a>が開催されました。
</p>
<p>
私が4月4日に参加したセッションについて、技術的な内容については他の方々のBlogを参考にしてください。
ここでは私の感想を主に書いて、他には備忘録を書きたいと思います。<br />
</p>
<p>
【 参加したセッション】
<ol>
<li> 9:00-11:00 [JK1-01] Strategy Keynote</li>
<li>11:15-12:15 [JS1-04] 櫻庭 祐一 「NIO.2を使って、簡単ファイル操作」</li>
<li>12:30-13:30 ランチセッション-GlassFish</li>
<li>13:15-14:15 [JS1-14] 斉藤 賢哉 「Java EE 6時代におけるエンタープライズシステムのあり方」</li>
<li>14:30-15:30 [JS1-21] John Clingan 「Pragmatic Cloud and PaaS with Java EE 7 (and GlassFish)」</li>
<li>15:45-16:45 [JS1-33] 寺田 佳央 「What's coming in Java Message Service 2.0」</li>
<li>17:00-18:00 [BoF1-02] 佐藤 直生 「Windows AzureでのスケーラブルなJavaアプリケーション構築」</li>
<li>18:15-19:15 [BoF1-04] 谷本 心 江里口 温 「トラブルシューターの頭の中身 ~7年間のJavaトラブルシュートサービスから」</li>
<li>19:30-20:30 スペシャルセッションLT</li>
</ol>
<hr />
<div>
<b>1. 9:00-11:00 [JK1-01] Strategy Keynote</b><br />
<p>
このセッションでは、主に下記の2点についての報告があった(と思う)
<ul>
<li>これまでの標準化の進捗状況や今後のスケジュールについて</li>
<li>Java 7に搭載される各Editionの機能紹介<br />
(Java SE 7/Java EE 7/Java FX 2.0/GlassFish など)</li>
</ul>
あとはJavaがここまで発展したのは、コミュニティの存在が大きかったらしい。<br />
各講演の中でスピーカーは常々、使ってみて不便なところがあったらメーリングリストにメールを投げて欲しい、コミュニティで発言して欲しい、と仰っていたのが印象的。Javaを一緒に作っていきましょう!という強いメッセージを感じた。<br />
<br />
続いて、Education分野であるOracle資格についての講演があった。<br />
この中で話題になったのは、以下の2点。<br />
・Javaの資格がOracleDBと同様にBronze、Silver、Goldという3形態になること<br />
・現在のJava資格の合格者は日本だと合格点ぎりぎりだが、インドではほぼ満点。<br />
日本人、頑張らないと仕事がなくなりそうって感じた。<br />
<br />
資格については興味があったので、資格のレベルをまとめる。<br />
【Gold】単独で開発が可能なレベル<br />
【Silver】上級者のサポートの元で、開発が可能なレベル<br />
【Bronze】Javaに関する基本知識レベル<br />
そいや今はJavaSEに対してはOJC-Pが、JavaEEにはOJC-WCが、対応している認識だけど、これからはどうなるんだろう??<br />
</p>
</div>
<br />
<b>2.11:15-12:15 [JS1-04] 櫻庭 祐一 「NIO.2を使って、簡単ファイル操作」</b><br />
■NIO2でできるようになったこと<br />
・ファイルのコピーが簡単になった<br />
・ファイルのメタデータの操作が可能になった<br />
・ディレクトリツリーに対する操作も簡単になった<br />
・ファイルを使用する際に冗長だった記述が非常にシンプルになった<br />
<br />
これまで私個人の見解としては「Javaはファイル操作が苦手だ、」というイメージを持っていたけど、NIO2の登場によって、そんなイメージも完全になくなりそうな予感。<br />
Java FXと組み合わせることで、Javaでかなり使い勝手の良いファイル操作アプリが作れそうな予感もする!<br />
<br />
<br />
<b>3.12:30-13:30 ランチセッション - GlassFish</b><br />
GlassFishとはOracleが提供しているアプリケーションサーバーの開発プロジェクトのこと。<br />
他に有名なJavaのアプリケーションサーバーにはTomcatがある。<br />
GlassFishのライセンスはオープンソースになっているものもある。<br />
<br />
GlassFish3はJava EE 6に、GlassFish4はJava EE 7に対応。<br />
<br />
セッション開始時には、GlassFishのTシャツを投げる。<br />
また、終了時にはGlassFishのシールを配布する、というイベントがあった。<br />
<br />
<br />
<b>4.13:15-14:15 [JS1-14] 斉藤 賢哉 「Java EE 6時代におけるエンタープライズシステムのあり方」</b><br />
■Java EE5からの特徴<br />
・開発容易性を実現<br />
→POJO:シンプルなクラス<br />
→アノテーション:XML地獄からの開放・テスト容易性の確保<br />
<br />
■Java EE 6の特徴<br />
・JSF2.0(Java Server Faces)<br />
Webアプリケーション標準フレームワーク<br />
【特徴】<br />
1.HTMLにJSFタグを埋め込むだけ(モックアップが不要)<br />
2.JSF拡張フレームワーク<br />
3.JS + JAX-RSパターン(ネットワークの切れ目=担当者の切れ目)<br />
・EJB(Enterprise Java Beans)<br />
トランザクション管理、インターフェースが省略可<br />
シングルトンSessionBean<br />
<br />
■デザインパターン<br />
・EE 5:プレゼンテーション層+ビジネスロジック層+DAO層<br />
※各層を疎結合にすることが目的。<br />
※ただし、各層をつなぐための”グレーコード”(DTO)が必要。<br />
詰め替えを行うための不要な処理が必要となり、コード量が増大<br />
・EE 6:フルスタックなフレームワーク<br />
※CDIによって各コンポーネントの結合が楽になる<br />
※”グレーコード”(DTO)が不要<br />
<br />
■CDIを使用することで、<br />
保守性・生産性がアップするらしい。<br />
アプリ実装範囲の軽減することができるらしい。<br />
モデリングが容易になるらしい(オブジェクト指向、モデリングスキルが必要だけど)<br />
設定ファイルが不要になるらしい<br />
<br />
<br />
<b>5.14:30-15:30 [JS1-21] John Clingan 「Pragmatic Cloud and PaaS with Java EE 7 (and GlassFish)」</b><br />
<br />
このセッションに関しては途中までしか把握できなかった。<br />
把握できた内容は以下の通り。<br />
<br />
Java EE 7は「PaaS」でクラウドに対応するよう作られている。<br />
そのために、WebサーバとしてGlassFishが提供されている。<br />
<br />
・SaaS:Software as a Service → PaaSに加えてWebアプリまでを提供。Webメールなど<br />
・PaaS:Platform as a Service → IaaSに加えてWebサーバまでを提供(Webアプリとデータは自分で用意)<br />
・IaaS:Infrastructure as a Service → サーバそのものを提供(Webアプリサーバなどは自分でインストール)<br />
<br />
SaaSは業務でも開発しているものなので把握していたが、他の二つについてはきちんと把握できなかったから、復習になった。<br />
<br />
<br />
<b>6.15:45-16:45 [JS1-33] 寺田 佳央 「What's coming in Java Message Service 2.0」</b><br />
大きな変更点<br />
・アプリケーションサーバを利用<br />
→JDBCと同じように、コネクションプーリングの利用が可能<br />
・EJBコンテナを利用して<br />
→コネクション接続の記述不要(コード削減)<br />
・例外の実装方法が変更<br />
→7のtry-with-resourceに対応(コネクションのクローズ処理を書かなくてOK)<br />
・ある例外を非チェック例外にした<br />
→try-catch不要(rollbackの記載が不要)<br />
・Messageスケジューリングもできる(非同期通信として処理可能)<br />
<br />
今まで使ったことはないが、かなり使いやすそう、というイメージを持った。<br />
GAEだとTaskQueueがあるけど、そんな感じで使えるんだと思う。<br />
AjaxでTaskQueueを動かしておいて、完了時にMessageを返して、って感じで使うといいのかなぁ~って思った。<br />
<br />
<br />
<b>7.17:00-18:00 [BoF1-02] 佐藤 直生 「Windows AzureでのスケーラブルなJavaアプリケーション構築」</b><br />
<br />
サーバは世界に6台(日本にはない)。アプリデプロイ時にメインサーバを選択できる。<br />
(ただし、すべてのサーバに自動バックアップされる)<br />
<br />
■Azureで使えるもの<br />
・テーブル:Key-Valueストア<br />
・キュー<br />
・BLOB:ファイル形式<br />
・Drive:マウントしてローカルドライブのように使える<br />
<br />
・データについては、SQL Azure DB(SQL Server)を利用<br />
→論理サーバを提供<br />
・Trafic Manager<br />
→データセンター毎にクラッシュした場合、他方のセンターへ割り振り<br />
・staticなデータはキャッシュしておく<br />
(キャッシュサーバは日本にもある)<br />
<br />
GAEとは異なり、デプロイ時にメインサーバを選べたり、サーバの設定ができるらしい。<br />
GAEと同様にJavaアプリが動くので、状況によって使い分けることが大切になりそう。<br />
あとは互いの特徴を調べて比較しないと何とも言えんな。<br />
<br />
<br />
<b>8.18:15-19:15 [BoF1-04] 谷本 心 江里口 温 「トラブルシューターの頭の中身 ~7年間のJavaトラブルシュートサービスから」</b><br />
事例の紹介と、それに対し「どのように原因を究明するのか」の実演が行われた。<br />
キーワードはこちら。<br />
java -XX:+HeapDumpOnOutOfMemoryError<br />
jvisualvm<br />
jstack<br />
Jメーターで負荷テスト<br />
<br />
私自身、作成したロジックのパフォーマンスを実際に検証することはなかった。<br />
特にWebアプリを作っていると、ApachやTomcatの設定、SQLパフォーマンスに目が行き、Javaそのもののパフォーマンスを考えることが少ないように思う。<br />
だけど、今回この話を聞いてパフォーマンス検証の重要性を感じた。<br />
ヒープダンプを取ったりスレッドの状態をチェックしたりやってみよう。<br />
Eclipseのプラグインでも見れるのかな?<br />
<br />
<br />
<b>9.19:30-20:30 スペシャルセッションLT</b><br />
<br />
ここでは何人だったかな?5分で思いのたけを話すLTでした。<br />
LTだけあってかなりユニークなプレゼンもありました。<br />
一番びっくりしたのは「;」なしで色々実装した、というプレゼン。<br />
そんな発想が私にはなかったので。。。ただただ「すげー」だった。。。<br />
<br />
スペシャルセッションではご飯も出ました。<br />
おにぎり2個とから揚げとたくあんと出し巻き卵と・・・<br />
そんなくらいだったかな?<br />
おにぎりの1個はJavaマスコットのDukeになってましたww<br />
<br />
<hr />
<br />
初日はこんな感じでした。<br />
かなり刺激的な一日で途中からパンクしていました。。。<br />
<br />
あとは、業務の中で、JavaでWebアプリ開発をしているけど、Javaについて知っていることは、ほんの一部でしかないことを実感しました。<br />
全部を全部、自分だけで勉強することは難しいから、業務で知りえた範囲から一歩外側も勉強して知識を少しずつでもいいから増やしていきたい、と感じました。<br />
<br />
2日目の5日の分については、また後日アップしたいと思います。<br />
<br />o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-89581244596722399462011-12-14T01:05:00.000+09:002011-12-14T01:05:02.242+09:00GAEのことでやってみたい事のメモGAEを使ってやってみたい事を忘れないようにメモメモ。
<ol>
<li>簡単なアプリを作って公開する</li>
<li>RDB→Bigtable(Key-Value)のDB設計方法の変換</li>
<li>Slim3プロジェクトのディレクトリ構成の変更方法をまとめる</li>
<li>ログのフォーマット変換とローカル環境でのログファイル保存方法</li>
</ol>
<p>
1は自分の勉強のため。<br/>
まずログイン処理をする。
そのあと、簡単な掲示板を作ってみる。
これで、一連の処理の流れを押さえられる、と思うから。
</p>
<p>
2は、RDBとは異なり敢えて非正規化をすることが必要とあるけど、
実際にはどのように設計すればいいのか、という具体例を見つけることができなかった。
(私の検索能力の問題だな・・・)
だから、RDBでの簡単なテーブル2,3個をBigtable用にデザイン変更にしてみようかと。
</p>
<p>
3は、Slim3のデフォルトのディレクトリ構成が個人的に好きでないからww
</p>
<p>
4は、仕事上、ログのフォーマットを記録する必要があったから調べたので。
それを忘れないようにまとめておこうかと思います。
</p>
<p>
AndroidやGAEの事を考えると、
Googleさんは”JavaVM”という仮想OSを新しいOSとして利用することで、
マルチプラットホームを実現して、より簡単にアプリとかのサービスを
展開していこうとしているんだろうな~<br/>
となると、今のOSの未来も変わってくるのかな??
</p>
さて、今日はメモだけで寝ようかな~o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-83336412415060289472011-12-11T23:52:00.001+09:002011-12-12T00:45:03.960+09:00【GAE】Eclipseローカルで起動時に出るエラーメッセージ会社のようなプロキシ経由で外部ネットワークに接続する場合、
Google App Engine(以降、GAE)をローカルで実行する際に
以下のようなエラーメッセージが表示されることがある。
(バージョン情報は伏せ時にしてます。)
<blockquote>
Unable to access https://appengine.google.com/api/updatecheck?runtime=java&release=x.x.x×tamp=xxxxx1&api_versions=['x.x']
</blockquote>
どうやら実行時にアプリのGAE SDKのバージョンと
公開されている最新のGAE SDKのバージョンの比較をするらしい。
その時、プロキシのせいで問い合わせができずにエラーが出ているみたい。
そこで、下図の画面で実行時のプロキシ設定を追加。
<p>
【画面表示】<br />
プロジェクトを右クリック > Run As > Run Configrations > Argmentsタブをクリック
</p>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-knsbVACnDY8/TuTMcSQJFJI/AAAAAAAAAUg/tKXKGx0OEY4/s1600/GAE_RunConfigrations.jpg" imageanchor="1" style="margin-left:1em; margin-right:1em"><img border="0" height="190" width="320" src="http://1.bp.blogspot.com/-knsbVACnDY8/TuTMcSQJFJI/AAAAAAAAAUg/tKXKGx0OEY4/s320/GAE_RunConfigrations.jpg" /></a></div>
<p>
【追加内容】<br />
proxy hostやproxy postは適宜変更で。
</p>
<blockquote>
-Dhttp.proxyHost=<proxy host> <br />
-Dhttp.proxyPort=<proxy port> <br />
<br />
-Dhttps.proxyHost=<proxy host> <br />
-Dhttps.proxyPort=<proxy post> <br />
</blockquote>
<p>
【実行環境】
</p>
<table border="2">
<tr>
<th>Eclipse EE</th><td>3.7</td>
</tr>
<tr>
<th>Java SDK</th><td>1.0.27</td>
</tr>
</table>
<p>
【参考サイト】<br />
<a href="http://d.hatena.ne.jp/sugumura/20100927/1285575554">Eclipse(Galileo)のGAEでプロキシ</a>
</p>o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-10396650004103452262011-06-23T23:54:00.004+09:002011-06-24T00:37:24.080+09:00FlexPMDのEclipseプラグイン仕事でFlash作成を行った。<br /><br />開発環境:Flash Builder(Eclipseプラグイン)<br />開発言語:ActionScript3<br />コンパイラ:Flex4<br /><br />結合テストの際に、ActionScriptのステップ数のカウントを行うためのプラグインを<br />探していたら、FlexPMDを発見した。<br />そのインストール手順の備忘録。<br />Eclipseのバージョンとかは以下のサイトを参考に。<br /><br />参考URL:http://opensource.adobe.com/wiki/display/flexpmd/FlexPMD+Eclipse+plugin<br /><br />◆インストール<br />1.Eclipseのメニュー Help > Install new software <br />2.Addボタンをクリックして、新規リポジトリの登録を行う。<br /> 名前:FlexPMD<br /> 場所:http://opensource.adobe.com/svn/opensource/flexpmd/plugin/trunk/flex-pmd-eclipse-plugin-site<br />3.FlexPMDをインストール<br />4.Eclipse再起動<br /><br /><br />◆設定<br />設定のためには、いくつかダウンロードが必要。<br />1.FlexPMDのコマンドライン.jarをダウンロード<br /> <a href="http://opensource.adobe.com/svn/opensource/flexpmd/maven-repository/release/com/adobe/ac/flex-pmd/1.1/flex-pmd-all-in-one-bundle-1.1.zip">zipファイル</a><br />2.ダウンロードしたファイルを適当なディレクトリに展開。<br /> ただし、ディレクトリ名に半角スペースがあると、うまく動かない様子。<br /> (http://www.kei3.jp/diary.php?id=7561より)<br /> ちなみに、私はFlexSDKを以下のディレクトリに入れていたので、同じディレクトリに展開。<br /> <C:\tools\Flex\flex-pmd-all-in-one-bundle-1.1><br />3.EclipseのFlexPMDアドインにコマンドライン.jarを登録する<br /> Eclipseメニュー > Window > Preferences > FlexPMD と設定画面を表示。<br /> ・FlexPMD command line installation:(2)のディレクトリ\flex-pmd-command-line.jar<br /> ・FlexPMD custom ruleset:今はブランクで<br /> ・FlexCPD command line installation:(2)のディレクトリ\flex-pmd-cpd-command-line.jar <br /> ※ファイル名にはダウンロードしたバージョンが入っている場合有<br />4.Apply > OK<br /><br />以上で設定終了。<br /><br /><br />◆動作確認<br />検証したいファイル/ディレクトリを右クリック > FlexPMD > Run FlexPMD<br /><br />これで検証結果が表示されれば、インストール&設定が完了!!<br />ただし、ワークスペース名に半角スペースがあると、うまく動かない様子。<br /> (http://www.kei3.jp/diary.php?id=7561より)<br /><br /><br />◆監査ルールの取得<br />1.監査ルールの設定ファイル(xml)のダウンロード<br /> URL:http://opensource.adobe.com/svn/opensource/flexpmd/bin/flex-pmd-ruleset-creator.html<br /><br />2.上記サイトにアクセスし、画面下部の「Export」ボタンをクリック。<br />もし、ルールを変更したい場合は、画面内を操作してカスタマイズ可能。<br /><br />3.ダウンロードしたファイルの格納場所は適当な場所へ。<br /> 私の場合、以下のディレクトリに格納。<br /> ルールファイルはxmlなので、テキストエディタで編集可能。<br /> ・C:\tools\Flex\FlexPMD_Ruleset<br /><br />4.ダウンロードしたルールファイルの設定<br /> Eclipseメニュー > Window > Preferences > FlexPMD と設定画面を表示。<br /> ・FlexPMD custom ruleset:(3)でダウンロードしたファイル<br /><br /><br />以上で、一通り動くはず!o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-43008311792755350112011-05-09T03:08:00.005+09:002011-05-09T03:41:09.469+09:00Flash(AS3)で外部XMLファイルを参照する方法<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/-1v7qbgojx1E/TcbhyU-K6AI/AAAAAAAAATI/-e0sxRYQxN4/s1600/%25E5%25AE%259F%25E8%25A1%258C%25E4%25BE%258B.jpg"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 216px;" src="http://4.bp.blogspot.com/-1v7qbgojx1E/TcbhyU-K6AI/AAAAAAAAATI/-e0sxRYQxN4/s320/%25E5%25AE%259F%25E8%25A1%258C%25E4%25BE%258B.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5604415041048340482" /></a><br /><br />Flash(ActionScript3)でXMLファイルを読み込む手順について<br />解説されているサイトは沢山あったけど、今回自分がやりたかったのは、<br /><Flexプロジェクト>でのやり方。<br /><br />これについては、なかなか紹介されているサイトがなく、<br />悩んだので、実現できた方法を忘れないようにまとめます。<br /><br />ちなみに作成環境は以下の通り。<br />・Windows Vista<br />・Flash Develop(フリーのFlash開発環境統合ソフト)<br /><br />【手順】<br />1)Flash Developにて<Flex3プロジェクト>を新規作成<br /> パッケージ:test<br /> テンプレートのコピーをする<br /><br />2)src/test/Main.mxml の編集<br />~~~~~ Main.mxml ここから ~~~~~<br /><?xml version="1.0" encoding="utf-8"?><br /><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"><br /> <mx:Script><br /> <![CDATA[<br /> import test.asFile.ShowMessage;<br /> ]]><br /> </mx:Script><br /> <br /> <!-- レイアウト --><br /> <mx:Text id="messe" text="以下に表示するファイル名を入力"/><br /> <mx:TextInput id="textBox" text="test.xml" /><br /> <mx:Button id="button" label="Click!!" <br /> click="new ShowMessage(textBox, textArea)" /><br /> <mx:TextArea id="textArea"<br /> width="500" height="200"<br /> text="ここに指定したXMLファイルの内容が表示されます。" /><br /></mx:Application><br />~~~~~ Main.mxml ここまで ~~~~~<br /><br />3)asファイルの作成<br />~~~~~ ShowMessage.as ここから ~~~~~<br />package test.asFile {<br /> import flash.events.Event;<br /> import flash.net.URLLoader;<br /> import flash.net.URLRequest;<br /> import mx.controls.TextArea;<br /> import mx.controls.TextInput;<br /><br /> /** XMLファイルの内容を表示するためのクラス */<br /> public class ShowMessage {<br /> /** XMLファイルを設置するディレクトリ */<br /> private const XML_HOME_DIR:String = "test/xml/";<br /><br /> /** コンストラクタ */<br /> public function ShowMessage(<br /> textInput:TextInput, textArea:TextArea) {<br /> var fileName:String = textInput.text;<br /> ReadXMLFile(fileName, textArea);<br /> }<br /> <br /> /** ファイル内容の取得 */<br /> private function ReadXMLFile(<br /> fileName:String, textArea:TextArea):void {<br /> <br /> var xml:XML = new XML();<br /> var urlRequest:URLRequest = <br /> new URLRequest(XML_HOME_DIR + fileName);<br /> var urlLoader:URLLoader = new URLLoader(urlRequest);<br /> <br /> urlLoader.addEventListener(Event.COMPLETE, xmlLoaded);<br /> <br /> function xmlLoaded(event:Event):void {<br /> xml = XML(urlLoader.data);<br /> trace(xml.toString());<br /> textArea.text = xml.toString();<br /> }<br /> }<br /> }<br />}<br />~~~~~ ShowMessage.as ここまで ~~~~~<br /><br />4)xmlファイル作成<br />~~~~~ test.xml ここから ~~~~~<br /><?xml version="1.0" encoding="utf-8" ?><br /><data><br /> <member><br /> <name>first</name><br /> </member><br /> <member><br /> <name>second</name><br /> </member><br /></data><br />~~~~~ test.xml ここまで ~~~~~<br /><br />5)最終的なディレクトリ構成<br /><a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/-Zi8vvjxPze0/TcbgmsVMoLI/AAAAAAAAAS8/X6n6y0zUypk/s1600/%25E3%2583%2587%25E3%2582%25A3%25E3%2583%25AC%25E3%2582%25AF%25E3%2583%2588%25E3%2583%25AA%25E6%25A7%258B%25E6%2588%2590.jpg"><img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 138px; height: 320px;" src="http://3.bp.blogspot.com/-Zi8vvjxPze0/TcbgmsVMoLI/AAAAAAAAAS8/X6n6y0zUypk/s320/%25E3%2583%2587%25E3%2582%25A3%25E3%2583%25AC%25E3%2582%25AF%25E3%2583%2588%25E3%2583%25AA%25E6%25A7%258B%25E6%2588%2590.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5604413741648879794" /></a><br />XMLファイルを設置する場所がポイント!<br />swfファイルが設置されているディレクトリが<br />ホーム扱いになるので、<br />そこから相対パスで参照できるようにする<br />必要がある点に注意。<br /><br />これに関しては、EclipseにFlash Developerのプラグインを入れてコンパイルすると<br />自動でディレクトリが作成されるからsrcディレクトリに入れると行ける。o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-42785869089669412812011-04-19T23:17:00.004+09:002011-04-27T22:29:12.650+09:00便利なEclipseのプラグイン~JStyle~Eclipseを使ってJavaの開発を行ってます。<br /><br />その時にいつも困っているのが、インデント。<br />半角4つだったり、タブだったり・・・<br />その区別もソースを見ただけだと判断できません。。。<br /><br />そこで、Eclipseの設定を変更していました。<br />Window→Preferences→General→Editors→Text Editors<br />ここの「Show whitespace characters」にチェックを入れます。<br />そうすると、タブと改行の部分が明示的に表示されるようになります。<br /><br />しかし、個人的にはタブは表示してほしいけど、改行は不要でした。<br />んで、見つけたのがJStyleというプラグイン!!<br />こいつがかなりナイスな働きをしてくれます!<br /><br />JStyleでは以下の項目の表示/非表示が選択できます。<br />・改行<br />・タブ<br />・全角スペース<br />・半角スペース<br /><br />私は、これの「タブ」と「全角スペース」にチェックを入れました。<br />「全角スペース」にもチェックを入れたのは、<br />以前ソースコード中に全角スペースを入れてしまいコンパイルエラーになったことがあるから・・・<br /><br />参考サイトは検索してみてください。<br />ダウンロード、インストールなど色々な情報がありますので。<br /><br />以上です。o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-58800550836924627772011-02-04T01:19:00.003+09:002011-02-04T01:43:00.856+09:00UbuntuサーバのMySqlにNaviCatでリモートアクセス~その2~UbuntuのMySqlにVistaのNaviCatからリモート接続にリトライした。<br /><br />まず、先日行ったことと同じことをやった。<br /><a href="http://yusuke-memo.blogspot.com/2011/01/ubuntumysqlnavicat.html"><br />UbuntuサーバのMySqlにNaviCatでリモートアクセス<br /></a><br /><br />1.以下のファイルの53行目をコメントアウト。<br />/etc/mysql/my.cnf<br /> 53行目 → # bind-address = 127.0.0.1<br /><br />2.MySqlを再起動<br />sudo /etc/init.d/mysql restart<br /><br /><br />次にNaviCatの設定を。<br />3.新しい接続で、MySqlを選択<br /><br />4.基本設定は以下の通り<br /> 接続名:自分が分かりやすいもの<br /> ホスト名/IPアドレス:Ubuntu ServerのIPアドレス(プライベートアドレス)<br /> ポート:3306(初期設定)<br /> ユーザー名:root<br /> パスワード:MySqlインストール時に設定した値<br /><br />5.SSH設定は以下の通り<br /> SSHトンネルを使用する:チェックを入れる<br /> ホスト名/IPアドレス:4で設定したIPアドレス<br /> ポート:22(初期設定)<br /> ユーザー名:Ubuntu Serverログインのユーザー名<br /> 認証方法:「パスワード」<br /> パスワード:Ubuntu Serverログインのパスワード<br /><br />6.「接続をテストする」を押下<br /><br />これをやったが接続できなかった・・・<br /><br />で、MySqlのユーザー設定を確認したら、以下の感じだった。<br />コマンド:select host, user from mysql.user<br />+------------+------------------+<br />| host | user |<br />+------------+------------------+ <br />| 127.0.0.1 | root | <br />| localhost | debian-sys-maint | <br />| localhost | root | <br />| ubuntu-ser | root | <br />+------------+------------------+<br /><br />これを見ると、4で設定したユーザーのrootが<br />localhostからじゃないと接続できないって感じ。<br /><br />そこで、MySqlに新しいユーザーを登録。<br />7.GRANT ALL PRIVILEGES ON *.* TO ユーザー名 IDENTIFIED<br /> BY 'パスワード' WITH GRANT OPTION;<br /><br />これで、4の設定したユーザーとパスワードを<br />7で作成したユーザの設定に変更。<br />そんで、接続テスト。<br /><br />やっと接続できた!!!!!!!!<br />これで、GUIでテーブル内容を確認できそうです♪o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com2tag:blogger.com,1999:blog-2789325012697036639.post-11077764673786319122011-01-25T23:27:00.005+09:002011-01-26T01:23:50.396+09:00UbuntuサーバのMySqlにNaviCatでリモートアクセスUbuntuサーバのMySqlにWindowsからNaviCatでアクセスしようとした時の覚書。<br /><br />SSHトンネルして接続しようとしたけど、以下のようなエラーが。<br />「2013 - List connection to MySQL server at 'reading initial communication packet', system error: 0」<br /><br />調べてみたら、MySQLは初期設定でローカルからのアクセスしか許可していない様子。<br />参照URL:http://mipin.blog6.fc2.com/blog-entry-102.html<br /><br />参考にしたサイトの通り、以下のファイルの53行目をコメントアウト。<br />/etc/mysql/my.cnf<br /> 53行目 → # bind-address = 127.0.0.1<br /><br />これで、接続確認。<br /><br />結果。再起動はOKだった。<br />しかし、NaviCatからもコマンドからもMySQLにログインできなかった。<br />「1130 - Host '***.***.***.***' is not allowed to connect to this MySQL server」<br /><br />ん~こりゃ別の方法を探さなきゃかな。。。<br />参考にしたサイトではVMwareを使ってるから、うまくできなかったのかもな・・・<br />残念・・・o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0tag:blogger.com,1999:blog-2789325012697036639.post-76895835516815538432010-12-12T22:37:00.003+09:002010-12-12T23:02:15.918+09:00【DB】テーブルの移行現在の仕事でテーブルの移行作業がある。<br />そのための手順について勉強したから、参考用にまとめておく。<br /><br />【要求】<br />・サービスの改定に伴い、テーブル定義の変更が発生<br />・これまでのテーブルに登録された内容はそのまま移行<br />・ALTER TABLEの使用禁止<br />・追加するカラムには、定数が入る<br /><br />【テスト環境】<br />・OS:Windows Vista<br />・RDBMS:SQLite3<br /><br />【手順】<br />1.現在のテーブルのバックアップテーブルを作成する<br /> create table BackUpTable as select * from OriginalTable;<br /><br />2.現在のテーブルを削除する<br /> drop table OriginalTable;<br /><br />3.新しいテーブルを作成する<br /> create table NewTable(カラム名 属性, 追加カラム名 属性, ...);<br /><br />4.バックアップテーブルから新しいテーブルにレコードをコピー<br /> insert into NewTable <br /> as select カラム名, 追加カラム名の値, ...<br /> from BackUpTable;<br /><br /><br />以上で移行ができるはず。<br />だけど、DBMSによって、SQL文に修正が必要かもしれない。<br />あと、SQLiteは型の制約がないから簡単にできたけど、他がどうかは分からない。<br />まず、実環境と同じ環境でテストし、動作確認が必要だな。<br /><br />参考URL:<br />・テーブルデータの移行 - Database Expert - @IT<br /> http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=40910&forum=26o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com1tag:blogger.com,1999:blog-2789325012697036639.post-86682994833867316462010-12-11T00:16:00.002+09:002010-12-11T00:28:21.116+09:00思ふこと俺にとって<br /> 仕事って?<br /> 同僚って?<br /> 同期って?<br /><br />評価を<br /> どうされたい?<br /> だれにされたい?<br /><br /><br />今週ずっと残業してた。<br />毎日勤務開始1時間前に出勤して、23時くらいまで仕事してた。<br /><br />先輩とチームで仕事をしてるから、俺の作業の遅れで迷惑をかけたくないって<br />気持ちでいた。<br /><br />今日は先輩に飲みに誘われた。<br />同期も参加するって感じになった。<br />誘ってもらって、俺も行きたいって言った。<br /><br />けど、行けなかった。<br />行けないって連絡もしなかった。。。<br /><br />連絡する機会は何度もあった。<br />先輩が先に行く時、何度も気にして言ってくれた。<br />けど、俺は気づかなかった。<br />どこかで、”伝えてくれる”って甘えてたのかも。<br /><br />約束の時間10分前に、同期が連絡くれてた。<br />サイレントにしてて全然気付かなかった。<br />けど、約束をしていたんだから携帯に注意を向けておくべきだった。<br /><br />と、今更考えても「自分が悪い」って結論しか出てこない。<br /><br /><br />「俺=仕事を理由にして約束を破るやつ」<br /><br /><br />そんな風に評価されたいのか?<br />そんなん嫌と思ってるくせに、なぜ行動できなかった??<br /><br />お前はこうやって自分から嫌われにいってる。<br />嫌われたくない癖に。<br /><br />どうしないといけないか考えろ。<br />考えろ、考えろ、考えろ。。。o310yusukehttp://www.blogger.com/profile/17272432963800746263noreply@blogger.com0