OmniAICreator/Qiita-1.07M huggingface dataset:
Git to svn のまとめ

### はじめに
GitLabを使っているけど、いろんなしがらみでsvnにも履歴を送らないといけないのでやったこと。

### 環境
使うのはsubgit。
イメージはこんな感じ。

```GitLab --(pull)--> work.git --(push)--> subgit ===> svn
```

subgitのリポジトリにpushすればsvnに同期する。
ただしsubgitはbareリポジトリなので、subgit側からpullできない。
なので、GitLabからpullしてsubgitにpushするためのworkリポジトリを作る。
もっといいやり方がありそうな気がするけど。

### subgit
subgitリポジトリを作る。

```bash
# subgit configure --svn-url https://your.svn.server/repos svn-sync-repos
# (config設定)
# subgit install svn-repos.git
# git clone svn-sync-repos work.git
```
work.gitにGitLabを紐づけて、イニシャルセット。

```bash
# git remote add gitlab git@your.gitlab.server:yourname/repos.git
# git pull gitlab master
# git push -u origin master
```

これでsvnにデータが流れるはず。


### jenkinsで自動化

手作業なんてやってられないので、当然自動化する。
まずはjenkinsでGitLabからデータを取得する準備。
つっても、普通に使う場合と同じで、jenkinsの実行ユーザーのsshキーを登録する。

```bash
# sudo su - jenkins
# ssh-keygen
# (簡単のため、パスワードは空にする)
```

これでOK。


### jenkinsジョブ

定期実行ジョブにする。リアルタイムである必要は全くないので。

イニシャルで登録した時のpush/pullをシェルまたはバッチに記述するだけ。

```bash
# git pull gitlab master
# git push -u origin master
```

これでうまく行ってるはず。

リアルタイムに同期したければ、ビルドトリガをそのように。
Web.configを使ってIISのディレクトリの参照を許可する

Web.configを作る。

```
<configuration>
  <system.webServer>
     <directoryBrowse enabled="true" />
  </system.webServer>
</configuration>
```

```
<configuration>
  <location path="pub/hoge">
    <system.webServer>
      <directoryBrowse enabled="true" />
    </system.webServer>
  </location>
</configuration>
```

これだけ。
他のIIS設定もWeb.configで制御可能。
IISマネージャを直接触れない環境で使う。
MacOSXのVSCode 0.10.5 の起動時バグメモ

**追記(2015/12/24) 0.10.6 で修正済**

0.10.6 で修正すると言ってますが。

*Crash during startup 0.10.5*
https://github.com/Microsoft/vscode/issues/1463

- MacOS X で、VisualStudioCode起動時、キーボードが日本語レイアウトの場合、エラーで落ちる。
- 一旦、USレイアウトにして起動すればエラーで落ちない。
Goでワンライナーを書く

[ラッパー](https://github.com/kuwa72/g1)書きました。シェル芸用ですかね…。

例えば[シェル芸勉強会 第19回](https://blog.ueda.asia/?p=7146)Q2はこういう感じ。

```shell-session
-[13771]% ./g1 "for i:=4;i>1;i--{fmt.Println(i)};for i:=1;i<=4;i++{fmt.Println(i)}"
4
3
2
1
2
3
4
```

実用向きではないです。
Xcode 7.2でXVimを再度有効化する

Xcode 7.2 + Xvim のトピックです。

Xcodeをアップデートする。-> XVimが無効になる。
毎度お馴染みのコンボ発生。

どうせまたUUIDが変わってんだろ、ということで有効にすべきUUIDを調査。

Xcodeプロジェクトがあるディレクトリに移動

```sh
$ xcodebuild clean
$ 2015-12-21 11:09:37.288 xcodebuild[29998:407372] [MT] PluginLoading: Required plug-in compatibility UUID F41BD31E-2683-44B8-AE7F-5F09E919790E for plug-in at path '~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/XVim.xcplugin' not present in DVTPlugInCompatibilityUUIDs
```

というわけで、今回は
 F41BD31E-2683-44B8-AE7F-5F09E919790E

 の模様。

## UUIDの追加

 ```sh
 $ find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults write FILE DVTPlugInCompatibilityUUIDs -array-add F41BD31E-2683-44B8-AE7F-5F09E919790E
 ```


## 確認


 ```sh
 find ~/Library/Application\ Support/Developer/Shared/Xcode/Plug-ins -name Info.plist | xargs -IFILE defaults read FILE DVTPlugInCompatibilityUUIDs 
 ```

## Xcodeを再起動する



#参考させて頂いたポスト
Xcode 7.0にアップデート後、使えなくなったプラグイン(XVim等)を使えるようにする
http://qiita.com/redpanda/items/006d35a2277e31dfe8b3

Xcode 5.1にupdateした後に、使えなくなったxcode plug-inを再び使えるようにする方法
http://qiita.com/roothybrid7/items/85bacb992a22aaad04cd
NewRelic で Rails アプリのエラーを分析する

[クービック Advent Calendar 2015](http://qiita.com/advent-calendar/2015/coubic) の 21日目です。

[クービック](https://coubic.com/about)ではアプリパフォーマンス分析のために NewRelic を導入しています。

NewRelic には非常に多くの機能があるのですが、今回は Rails アプリケーションのエラー分析を行う際の工夫をご紹介しようと思います。


## Error Analytics 

最近、新しく追加された機能です。エラーの種類・頻度が一目でわかります。

![newrelic_error_analytics.png](https://qiita-image-store.s3.amazonaws.com/0/20304/ebee1315-ae73-6004-8b3b-e6d94df01251.png)

大半を紫色のエラーが占めていることが一目瞭然です。


## Error Attributes

種類と頻度が分かると、次はなぜそのエラーが発生するのか原因を知りたくなります。

知りたいときに限って、「うー、肝心なログが出てない！ぐぬぬ...」となったことはエンジニアなら少なからず経験あると思います。

NewRelic では、設定ファイルを少し書くだけで、リクエストパラメタが取得可能です。ドキュメントはこの辺りを参照すればよいのですが、読み解くまでに多少時間が掛かりました。

 - https://docs.newrelic.com/docs/agents/ruby-agent/attributes/enabling-disabling-attributes-ruby
 - https://docs.newrelic.com/docs/agents/ruby-agent/attributes/ruby-attribute-examples

結論としては、こんな感じで書けば ok です。

#### config/newrelic.yml
```yaml
common: &default_settings
  license_key: your-secret-license-key
  app_name: YourAppName 
  attributes:
    enabled: true
    include:
      - "request.parameters.*"
    exclude:
      - "request.parameters.user.password"
      - "request.parameters.user.current_password"
```

"request.parameters.*" で任意のパラメタを include するようにしておき、マスクしておくべきものは exclude に指定します。


これだけで NewRelic 上でリクエストパラメタを確認できるようになります。
場所としては、右側の Error attributes になります。 

![no_method_error1.png](https://qiita-image-store.s3.amazonaws.com/0/20304/1337e7f1-a34b-04b1-fec1-db9a88d797d2.png)

![no_method_error2.png](https://qiita-image-store.s3.amazonaws.com/0/20304/0e0d9612-a037-978e-ab95-973779e3298b.png)

## rescue した例外を NewRelic に通知する

通常は newrelic_rpm を Gemfile に書いておけば、よしなにエラーを NewRelic に通知してくれるのですが、

```rb
class MyController < ApplicationController
  rescue_from StandardError, with: :render_500

  def render_500(e = nil)
    render file: 'public/500', status: :internal_server_error
  end
end
```

こういうコードでエラーを握りつぶしている場合は、通知されません。
このような場合は、

```rb
class MyController < ApplicationController
  rescue_from StandardError, with: :render_500

  def render_500(e = nil)
    NewRelic::Agent.notice_error(e)
    render file: 'public/500', status: :internal_server_error
  end
end
```

と書いてあげれば OK です。


## Error をアサインする

[Ticketing integrations](https://docs.newrelic.com/docs/data-analysis/user-interface-functions/ticketing-integrations) によると、JIRA, Lighthouse, Pivotal Tracker と統合できるようです。Github Issue と連携できるとありがたいのですが...


クービックではこれらのツールを使っていないので、原始的ではありますがメールでアサインしています。

![newrelic_share_this_error.png](https://qiita-image-store.s3.amazonaws.com/0/20304/60717a91-2137-7f2a-ac92-db1798df5e96.png)

Share this error をクリックすると、モーダルが表示され、メールを送信することができます。


## おわりに

NewRelic で Rails アプリケーションのエラー分析をする際の工夫をいくつかご紹介しました。お役に立てれば幸いです。
JSでカーニングエンジンを作ってみる 2回目


Fallout4面白いですね。日本語の行間とか最悪ですね。読みづらすぎますね。
[前回](http://qiita.com/s_s_k/items/c6673159a351b3ab403b)はとりあえず実現可能性を探っていましたが、今回は本格的に機能を検討したいとお思います。

### カーニングデータを分離
エンジン部分とデータを分離しておいた方が、Fontごとにデータを作ることができて便利ですよね。JSONも良いですが、今回は別のJSファイルに記述します。

実際に使う場合はconcatしても良いと思います。今回はヒラギノフォント用で進めます。
JSファイル名を「PIPKerningHiragino.js」としてます。

JSのクラス名は「PIPKergninTable」、これはすべてのフォントで同じです。ファイル名で識別します。


```PIPKerningHiragino.js
(function(global){
    "use strict";

    // モジュール設定
    global["pipboy"] = global.pipboy || {};
    var module = global.pipboy;

    module.PIPKerningTable = function(){

    };
    
})((this || 0).self || global);

```


### 行頭データを追加する

まずは行頭ぞろえ用のデータを検討します。

"「"
"（"

は文字の半分だけ内側に入ってしまいます。これ毎回きになりますよね。CSSではネガティブマージンで調整することができます。

クラス変数にマージンの値をもたせます。


```PIPKerningHiragino.js
// Beginning of Line (行頭)
module.PIPKerningTable.BOL = {
    '（': '-0.5',
    '「': '-0.5'
}
```

これで行頭ぞろえの準備はできたので、一旦エンジン側に移ります。行頭以外のカーニングは、エンジンの基本的な実装ができてから再度設定します。


### カーニングエンジンの設計
カーニングを適用する方法はシンプルにCSSのクラス設定のみにします。
カーニング指定するDOMに「pip-kerning」クラスを指定してください。あとは自動的に設定されると便利ですね。

```html
<h1 class="pip-kerning">「見出し1」です。classにpip-kerningを設定</h1>
```

自動的に実装するので、

+ DOM要素を抽出
+ spanタグで一文字づつ囲みカーニング設定
+ 行頭設定

の順番で検討してみます。

### PIPKerningクラスを作る

カーニングエンジンJSを作ります。「PIPKerning.js」とします。クラス名も「PIPKerning」です。

```PIPKerning
module.PIPKerning = function(){
    // プロパティなど
};
```

まずは「pip-kerning」でDOM要素を抽出します。

```PIPKerning
var $elements = document.getElementsByClassName('pip-kerning');
```

これでHTML上のすべての要素を取得しました。$elementsは配列です。
各要素をそれぞれ処理します。

```PIPKerning
var $elements = document.getElementsByClassName('pip-kerning');
var len = $elements.length;
for(var i = 0; i < len; ++i){
     var str     = $elements[i].innerHTML;
     var newHTML = this.__define(str); // __defineはプライベートメソッド
     $elements[i].innerHTML = newHTML;
}
```

innerHTMLでテキストを抜き出し、<b>this.__define</b>でspanタグ実装します。最後に新しいhtmlを追加します。
次に__defineの実装をします。
処理部分を抜き出すのこんな感じです。文字をバラバラにしてspanで囲むだけです。カーニング設定はまだです。
ただし、インラインスタイルで「inline-block」を必ず指定してください。これは行頭ぞろえで使います。

```PIPKerning.js
var characters = str.split('');
var table = module.PIPKerningTable.table;
var len = characters.length;
var output = "";
for(var i = 0; i < len; ++i){
    output += '<span style="display: inline-block;">' + characters[i] + '</span>';
}
return output;
```


### 行頭ぞろえ
次に行頭ぞろえの処理を実装します。行頭はウィンドウサイズで変わる可能性があります。(デバイスサイズ依存）
これは面倒くさいですね。
今回はカーニング領域のサイズを取得し、各文字のサイズと領域のサイズを比較し行頭を見つけます。

```PIPKerning.js
// 行頭処理
var $childs = $elements[i].getElementsByTagName("span"); // 各文字(1文字)
var rowWidth = $elements[i].clientWidth;
var currentRowWidth = 0; // 行
for(var j = 0; j < $childs.length; ++j){
   currentRowWidth += $childs[j].clientWidth; // 行の横幅を加算していく。文字数が増えれば大きくなる
   if(currentRowWidth >= rowWidth || j == 0) { // 行の幅と、最初の一文字目を行頭と判定
       var bol = PIPKerningTable.BOL[$childs[j].innerHTML] + 'em';
       if(bol) {
           $childs[j].style.marginLeft = bol;
           trace($childs[j].style.marginLeft)
       }
       currentRowWidth = 0;
   }
}
```

行の横幅はclientWidthで取得し、forループの中で各文字のサイズを調べます。inline-block設定がないと、spanの横幅を取得できません。ご注意ください。

これで行頭ぞろえが実現できました！　
ブラウザのリサイズは上の処理を再度実行すればできますね。その辺は次回に...
今回はここまでです。つぎは本題の文字ごとのカーニング実装です。
CentOS6でnode.js v4のネイティブコードモジュールがコンパイルできない件

## きっかけ

node.jsで新規で開発するプロジェクト
既存はv0.12.xだったのですがそろそろ新しい構文も使いたいし、いい加減にv4ぐらいには移行しとかないとなあ・・・と
で、手元のCentOS 6.xなマシンにnode.js v4を[nvm](https://github.com/creationix/nvm)でインストール

package.jsonはあるのでプロジェクトの依存パッケージをnpm install・・・したらコケた

iconvなどのネイティブコードを扱うモジュールのコンパイルが一部失敗していて、調べたらg++のバージョン古すぎる(C++11/14あたりをサポートしてない)というのが問題らしい
気になる現在のバージョンは

```bash
$ g++ -v
(略)
gcc version 4.4.7
```

・・・node.jsだけじゃなくC++も新しくしないとそろそろ苦しいな
とはいえCentOS6のホストにDockerなどでCentOS7ゲストはsystemd周りで別な地雷を踏みそう
じゃあこのマシンをまるっとCentOS7にしろっていうのももうしばらくは避けたい

## Developer Toolset

RedHatも10年も続くRHELのサポート期間と開発関係のツールチェーンの進歩との整合性をとるべく[Software Collections](https://access.redhat.com/documentation/en/red-hat-software-collections/)とビルド関連の[Developer Toolset](https://access.redhat.com/documentation/en/red-hat-developer-toolset/)をまとめてくれている
CentOSにも[Tru HuynhさんがDevtools-2をポーティングしてくれている](http://people.centos.org/tru/devtools-2/)のでありがたく使わせてもらうことにする

```bash
$ sudo wget http://people.centos.org/tru/devtools-2/devtools-2.repo
$ sudo yum install devtoolset-2-gcc devtoolset-2-binutils devtoolset-2-gcc-c++
```

さてインストールはできたものの、インストール先は

> /opt/rh/devtoolset-2/root/usr/bin/gcc
> /opt/rh/devtoolset-2/root/usr/bin/g++

でこのままだとパスが通ってない

```bash 
$ scl enable devtoolset-2 bash
```

で一時的にパスを通して有効にする

```bash
$ g++ -v
(略)
gcc version 4.8.2 20140120 (Red Hat 4.8.2-15) (GCC) 
```

この状態で npm install もつつがなく完了

もうこっちしか使わないよって場合は /opt/rh/devtoolset-2/enable を .bash_profile あたりに追加しておけばいいはず
私はこの構成にしたDockerイメージを作ってやりくりすることにした
Macでコマンドラインから電子書籍をKindleへ転送する方法


[ePub Advent Calendar 2015 - Qiita](http://qiita.com/advent-calendar/2015/epub)の21日目に飛び入り参加しました。

（というか、書きたいネタがたまたま合致したので参加しました。）

## はじめに

**KindleにEPUBファイルを落として読みたい。**

* EPUBファイルをMOBIファイルに変換すれば、Kindleで読めるようになります。
* 変換したMOBIファイルはSend-to-Kindleサービス（メール送信）でKindleに送れる
    * Send-to-Kindleを使った事の無い人は、下記に従って設定できます：
        * [Amazon.co.jp ヘルプ: Kindleパーソナル・ドキュメントサービス](http://www.amazon.co.jp/gp/help/customer/display.html?nodeId=200767340)
        * Send-to-Kindle用のメールアドレス（後で使う）は、ここで取得できます。

**GUIのメールクライアントを使うのが面倒なので、すべてコマンドラインで済ませたい。**

そのための手順を紹介します。

## 対象読者

* Mac（またはUnix-like OS）におけるコマンドラインの基本的な使い方が分かる方
* コマンドライン上でエディタ(Vim, Emacs, nanoなど)を使用できる方
    * `vim`と書いているところは、適当に置き換えてください
* 「PATHを通す」の意味が分かる方
    * 通し方(Bash): [MacでPATHを通す - Qiita](http://qiita.com/nbkn/items/01a11392921119fa0153)

## 準備

### MOBIファイルへ変換するツール kindlegen を入れる

下記URLからkindlegen(適切なOSのもの)をダウンロード。

* <https://kdp.amazon.co.jp/help?topicId=A3IWA2TQYMZ5J6>

パッケージを解凍し、PATHの通っているディレクトリにkindlegen本体を移動します。

### （Gmailで2段階認証を使っている場合）Gmailでアプリパスワードを生成しておく

* ログインとセキュリティ https://myaccount.google.com/security
    * アプリパスワードをクリック、指示に従ってパスワードを取得します（後で使う）

### CUIのメールクライアント(postfix)をセットアップする

基本的には下記に従う（パスワードはさきほど生成したものを使う）。

* [お使いのGmailのsmtpを使って、macのメールコマンドでメール送信を許可する設定の方法 - ITの隊長のブログ](http://aipacommander.hatenablog.jp/entry/2014/10/31/151649)

#### このままだと大容量の添付ファイルを送れないので、送信可能容量を1GBまで増やします。

* `sudo vi /etc/postfix/main.cf`

    message\_size\_limit = 10240000
    ↓
    message\_size\_limit = 1073741824

### CUIで添付ファイルを楽に送るツール mutt を入れる

* Mac: `brew install mutt`

* 設定: `vim ~/.muttrc`

    set send_charset="utf-8:iso-2022-jp"
    set realname="Your Name"

設定は最低限のみなので、本格的に使いたい人はググってください。

### （おまけ）postfixをデーモンとして常に起動するようにする

Mac OS X 10.11 El CapitanからSystem Integrity Protection(SIP; rootless) という機能により、一部のシステムディレクトリが管理者権限付きでも操作できなくなりました。

* 参考: [OS X 10.11 El CapitanのSystem Integrity Protection(SIP)についてちょっと詳しく](http://rcmdnk.github.io/blog/2015/10/10/computer-mac/)

そのため、SIPで保護されているディレクトリから設定ファイルをコピーして編集します。

#### 手順

* 設定ファイルを編集可能ディレクトリにコピー

        sudo cp /System/Library/LaunchDaemons/org.postfix.master.plist /Library/LaunchDaemons/

* org.postfix.master.plist を編集

        sudo vim /Library/LaunchDaemons/org.postfix.master.plist

* `<dict>...</dict>`の間に次を挿入（似たような設定が並んでいるので、末尾に追記します）

        <key>RunAtLoad</key>
        <true/>

    * 参考: [Configuring Postfix to Send Mail from Mac OS X Mountain Lion - BenjaminRojas.net](http://benjaminrojas.net/configuring-postfix-to-send-mail-from-mac-os-x-mountain-lion/)

* launchdに設定を読み込ませる

	    sudo launchctl unload /Library/LaunchDaemons/org.postfix.master.plist
   	 	sudo launchctl load -w /Library/LaunchDaemons/org.postfix.master.plist

## 本番

### EPUBをMOBIに変換

EPUBファイルのあるディレクトリに移動。

    kindlegen foo.epub

### KindleにMOBIファイルを転送する

件名不要、本文不要、添付ファイルのみ送る。

    mutt -s "" -a foo.mobi -- myname@kindle.com < /dev/null

### おまけ: 上記を一気にやってくれるシェルスクリプト

gistに置いたのでご自由にお使いください。

<https://gist.github.com/sky-y/69282e06d28c3c4099ea>


以上。
brew update でエラー

brew updateでエラーが発生した時のメモ。

```
error: The following untracked working tree files would be overwritten by merge:
	Library/Formula/appledoc.rb
	Library/Formula/dromeaudio.rb
	Library/Formula/pdf2svg.rb
	Library/Formula/tcpurify.rb
Please move or remove them before you can merge.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master
```

とりあえず書かれている通りに退避する。

```
cd /usr/local/Library/Formula
mv appledoc.rb appledoc.rb.org
mv dromeaudio.rb dromeaudio.rb.org
mv pdf2svg.rb pdf2svg.rb.org
mv tcpurify.rb tcpurify.rb
```

もう一度アップデートする。Warningが発生したけど成功。
```
brew update
Warning: Could not create link for homebrew/dupes/fetchmail, as it
conflicts with Homebrew/homebrew/fetchmail. You will need to use the
fully-qualified name when referring this formula, e.g.
  brew install homebrew/dupes/fetchmail
Warning: Could not create link for homebrew/dupes/gdb, as it
conflicts with Homebrew/homebrew/gdb. You will need to use the
fully-qualified name when referring this formula, e.g.
  brew install homebrew/dupes/gdb
Updated Homebrew from 0385f80f to 78203f9c.
```

Warningがきになるけどとりえあえずインストールできたので、競合っぽいしこれはあとで調べよう。
XMindからMarkdownに変換するWindowsツールをF#で実装した話

この記事は [F# Advent Calendar 2015](http://connpass.com/event/22056/) の21日目の記事です。 20日目は @kos59125 さんの 「[Streams を使ってシーケンス処理をがんばる](http://blog.recyclebin.jp/archives/4541)」でした。

# XMindからMarkdownに変換するWindowsツール

今日は ~~だいぶネタもなくなってきたので~~ 拙作のツールを紹介したいと思います。

## ツールを作った動機

[XMind](https://jp.xmind.net/) というマインドマップツールを使って業務の設計のアイディア出しをしていたのですが、この内容をMarkdownに変換して社内に共有したいなーと思ったのが発端です。

[XMinDoc](https://github.com/sky-y/xmindoc)([解説記事](http://qiita.com/sky_y/items/782cb656ce8b35bc2c9f))という良さそうなツールがあったのですが、Mac/Linuxしか対応していないのと、pandocが必要なのがネックでした。

自分はWindowsで作業がしたかったのです。

あと、pandoc自体は良いツールで、既にインストールして使用していました。MarkdownをWordのdocxに変換できたりするのでSI系の業務でも使用価値があるツールだと思います。それでも、ただ単にMarkdownに変換するだけなのにpandocに依存はあまりしたくないなーという気持ちもありました。

だったら自分で作ればいいじゃない！ということで、非常に単純な機能しかないですが、Windows上で動作するXMind→Markdown変換ツールを自作してみました。

[ツールのソースコードはGithubにあります。](https://github.com/adacola/XMindToMarkdown)

## 実行サンプル

サンプル用のこんなマインドマップを作ってみたので、これをMarkdownに変換してみます。

![サンプル用のマインドマップ画面](https://raw.githubusercontent.com/adacola/XMindToMarkdown/master/sample.png)

変換後のMarkdownは以下の通りです。トピック名を単にヘッダーまたはリスト要素に出力しているだけです。残念ながら画像その他の特殊要素にはまだ対応していません。(とりあえず当初の目的を達成するにはこれでも十分だったので)

```markdown
# root topic

## main topic 1

### sub topic 1-1

#### newlinetopic

##### 5

###### 6

* 7
    * 8

### sub topic 1-2

#### marker

#### relation to

## main topic 2

### サブトピック 2-1

#### relation from

### D言語

# next topic

## next main topic 1

### next sub topic

## next main topic 2

### hoge
```

## 今後の展望

とりあえず画像とか基本的な要素には対応できるようにしたいなーとは考えています。あとはCIできるようにするのと、テストパターンの追加(さすがに現状は少なすぎ)です。

## ツールを作るのにかかった時間

だいたい2時間程度で実装できました。自分程度のF#力でも単純なツールならさくっと実装できるのがF#の強みですね。(テストケース追加をサボってなければもっと時間かかったでしょうが)
TensorFlowチュートリアル - 偏微分方程式（翻訳）

TensorFlowのチュートリアル（Partial Differential Equations）
https://www.tensorflow.org/versions/master/tutorials/pdes/index.html#partial-differential-equations
の翻訳です。
翻訳の誤りなどあればご指摘お待ちしております。

---

TensorFlowは機械学習のためだけのものではありません。ここでは、TensorFlowを使用して偏微分方程式の挙動をシミュレートする（やや単調な）例を示します。正方形の池の表面にいくつかの雨滴が落ちる様子をシミュレートします。

注：このチュートリアルは、本来 IPython notebook のために準備しました。

##基本設定

いくつかの import が必要です。

```py
#Import libraries for simulation
import tensorflow as tf
import numpy as np

#Imports for visualization
import PIL.Image
from cStringIO import StringIO
from IPython.display import clear_output, Image, display
```

池の表面の状態を画像として表示する関数です。

```py
def DisplayArray(a, fmt='jpeg', rng=[0,1]):
  """Display an array as a picture."""
  a = (a - rng[0])/float(rng[1] - rng[0])*255
  a = np.uint8(np.clip(a, 0, 255))
  f = StringIO()
  PIL.Image.fromarray(a).save(f, fmt)
  display(Image(data=f.getvalue()))
```

いじくりまわす利便性のために対話型TensorFlowセッションを開始します。通常のセッションでも、 .py 実行ファイルで実行すれば、同様に動作します。

```py
sess = tf.InteractiveSession()
```

##計算上の便利関数

```py
def make_kernel(a):
  """Transform a 2D array into a convolution kernel"""
  a = np.asarray(a)
  a = a.reshape(list(a.shape) + [1,1])
  return tf.constant(a, dtype=1)

def simple_conv(x, k):
  """A simplified 2D convolution operation"""
  x = tf.expand_dims(tf.expand_dims(x, 0), -1)
  y = tf.nn.depthwise_conv2d(x, k, [1, 1, 1, 1], padding='SAME')
  return y[0, :, :, 0]

def laplace(x):
  """Compute the 2D laplacian of an array"""
  laplace_k = make_kernel([[0.5, 1.0, 0.5],
                           [1.0, -6., 1.0],
                           [0.5, 1.0, 0.5]])
  return simple_conv(x, laplace_k)
```

##偏微分方程式の定義

自然界の大部分の池の場合のように、我々の池は完全な500×500の正方形です。

```py
N = 500
```

池を作成し、いくつかの雨滴でそれを打ちます。

```py
# Initial Conditions -- some rain drops hit a pond

# Set everything to zero
u_init = np.zeros([N, N], dtype="float32")
ut_init = np.zeros([N, N], dtype="float32")

# Some rain drops hit a pond at random points
for n in range(40):
  a,b = np.random.randint(0, N, 2)
  u_init[a,b] = np.random.uniform()

DisplayArray(u_init, rng=[-0.1, 0.1])
```

![図](https://www.tensorflow.org/versions/master/images/pde_output_1.jpg)

微分方程式の詳細を指定しましょう。

```py
# Parameters:
# eps -- time resolution
# damping -- wave damping
eps = tf.placeholder(tf.float32, shape=())
damping = tf.placeholder(tf.float32, shape=())

# Create variables for simulation state
U  = tf.Variable(u_init)
Ut = tf.Variable(ut_init)

# Discretized PDE update rules
U_ = U + eps * Ut
Ut_ = Ut + eps * (laplace(U) - damping * Ut)

# Operation to update the state
step = tf.group(
  U.assign(U_),
  Ut.assign(Ut_))
```

##シミュレーションを実行

楽しめる場所です―単純な for ループで時間を前に進めます。

```
# Initialize state to initial conditions
tf.initialize_all_variables().run()

# Run 1000 steps of PDE
for i in range(1000):
  # Step simulation
  step.run({eps: 0.03, damping: 0.04})
  # Visualize every 50 steps
  if i % 50 == 0:
    clear_output()
    DisplayArray(U.eval(), rng=[-0.1, 0.1])
```

![図](https://www.tensorflow.org/versions/master/images/pde_output_2.jpg)

見て！波紋！
TensorFlowチュートリアル - マンデルブロ集合（翻訳）

TensorFlowのチュートリアル（Mandelbrot Set）
https://www.tensorflow.org/versions/master/tutorials/mandelbrot/index.html#mandelbrot-set
の翻訳です。
翻訳の誤りなどあればご指摘お待ちしております。

---

マンデルブロ集合の可視化は、機械学習ではありませんが、一般的な数学のためにTensorFlowを使用する方法の楽しい例です。これは実際には視覚化のかなり単純な実装ですが、要点を押さえています。 （後に、もっと本当に美しい画像を生成するために、以下より精巧な実装を提供することになるかもしれません。）

注：このチュートリアルは、本来 IPython notebook のために準備しました。

##基本設定

始めにいくつかの import が必要です。

```py
# Import libraries for simulation
import tensorflow as tf
import numpy as np

# Imports for visualization
import PIL.Image
from cStringIO import StringIO
from IPython.display import clear_output, Image, display
import scipy.ndimage as nd
```

反復カウントを受け取り、実際に画像を表示する関数を定義します。

```py
def DisplayFractal(a, fmt='jpeg'):
  """Display an array of iteration counts as a
     colorful picture of a fractal."""
  a_cyclic = (6.28*a/20.0).reshape(list(a.shape)+[1])
  img = np.concatenate([10+20*np.cos(a_cyclic),
                        30+50*np.sin(a_cyclic),
                        155-80*np.cos(a_cyclic)], 2)
  img[a==a.max()] = 0
  a = img
  a = np.uint8(np.clip(a, 0, 255))
  f = StringIO()
  PIL.Image.fromarray(a).save(f, fmt)
  display(Image(data=f.getvalue()))
```

##セッションと変数の初期化

いじくりまわすために、しばしば対話型セッションを使用しますが、通常のセッションでも同様に動作します。

```py
   sess = tf.InteractiveSession()
```

NumPyとTensorFlowは自由に混在させることができ、便利です。

```py
# Use NumPy to create a 2D array of complex numbers on [-2,2]x[-2,2]

Y, X = np.mgrid[-1.3:1.3:0.005, -2:1:0.005]
Z = X+1j*Y
```

TensorFlowのテンソルを定義し初期化します。

```py
xs = tf.constant(Z.astype("complex64"))
zs = tf.Variable(xs)
ns = tf.Variable(tf.zeros_like(xs, "float32"))
```

TensorFlowでは、変数は使用する前に明示的に初期化する必要があります。

```py
tf.initialize_all_variables().run()
```

##定義と計算の実行

複数の計算を指定し...

```py
# Compute the new values of z: z^2 + x
zs_ = zs*zs + xs

# Have we diverged with this new value?
not_diverged = tf.complex_abs(zs_) < 4

# Operation to update the zs and the iteration count.
#
# Note: We keep computing zs after they diverge! This
#       is very wasteful! There are better, if a little
#       less simple, ways to do this.
#
step = tf.group(
  zs.assign(zs_),
  ns.assign_add(tf.cast(not_diverged, "float32"))
  )
```

...そして、200ステップそれを実行します

```py
for i in range(200): step.run()
```

得られたものを見てみましょう。

```py
DisplayFractal(ns.eval())
```

![図](https://www.tensorflow.org/versions/master/images/mandelbrot_output.jpg)

悪くないね！
もやもやCSS

# CSSを書いていて、もやもやしたら

「なんか効率悪いような気がするなー」、「これさっきも書いたけどなー」、「なんかしっくりこないなー」ってことないですか？

そんなときは、CSS設計を考えてみてはいかがでしょうか。

# CSS設計

CSSを書いていて感じるもやもやを解決できるものです。

過去に書いたCSSやこれから書くCSSがちゃんと活かされ、自分の意図が無駄になりづらくなります。
これは言い換えると無駄なコードが少なくなるということが言えると思います。

Web技術の勉強会「HTML5ビギナーズ」の運営に携わっているのですが、そこで「[Web制作者のためのCSS設計の教科書](http://www.amazon.co.jp/gp/product/4844336355)」の著者である谷さんのFLOCSSの登壇をきいて、もうちょっとちゃんとやろうとFLOCSSでCSSを書くようになりました。だんだん慣れてきて使えば使うほど「なるほどなー」が思うことが増えました。

# クローズドのCSS設計の勉強会を開催

自分の考えたものではないけど活用できるものは共有しようということで、「Web制作者のためのCSS設計の教科書」をその名の通り教科書としてクローズドのCSS勉強会を開催しています。個人的にこの本を読むのは2周目。ただ1周目にすみずみまで読んだというわけではなかったので改めてしっかり読むことができるのとすでに忘れていることがあるので良い復習になっています。

10月末から週1回のペースで、それぞれの担当を決めて教科書に書いていることを自分なりに発表していくスタイルで、現段階の進捗はBEMまで進みました。[schooに堀口誠人さんが講師をしているBEMの動画](https://schoo.jp/class/2690)があったので一旦教科書は止めて動画をみんなで観ていたりとちょと寄り道したりしています。

この勉強会を通じて思ったり感じたことは

* 教材の「Web制作者のためのCSS設計の教科書」は良い本
* ただ書くだけならCSSは本当に簡単で、自分が簡単なことしかやっていなかったんだなと改めて反省
* 参加した人はそれぞれ自分や他人の書いたCSSにもやもやしていた

書くこと自体は簡単で、シートの記述の下に継ぎ足せばすでに効いているスタイルを上書きすることができるのでとりあえず作業自体はなんとかなるところがCSSのメリットでありデメリットでもあります。とりあえずできるところが、感じたもやもやをいつの間にか忘れ去せていく…そんな気がします。

# もやもやしたときにやること

体系だった教科書のおかげで、自分だけでなく書籍を買ったたくさんの人のもやもやを解決することができただろうと思います。現在進行中のクローズドの勉強会のメンバーのもやもやも解決できているはずでしょう。しかしそもそも自分を含めてやっておいたほうがよかったことや、今後やっていこうと思うことを書き留めると

* 解決策はすぐ浮かばなかったとしても、とりあえず何にもやもやしたのかを記録しておく
* もやもやを再現してみる
* じっくり何がもやもやするのかとその解決策を考えてみる

まぁ、これはCSSに限らずですが。。。
こういうプロセスをやっていくときっとビギナーから卒業できるはずで、そしてこういうことをちゃんとできる人がレベルアップしたり、有用なものをつくったりしているんだろうなーと。

# で、やっとですがCSS設計でまずは意識したいざっくりとした大事なこと

* 要素に依存しないクラスを使ったセレクタを書くこと
* セレクタの階層を深くしないこと
* 自分なりの命名ルールをつくること

まずはこれを意識してCSSを書きましょう。
小規模なものはこれだけでいけると思います。

そして、もっと体系だっている構成案があるので、それを勉強して実際に使ってみること。
例えば、以下のようなものがあります。

* OOCSS
* SMACSS
* BEM
* FLOCSS

少しずつ慣れていくためにはOOCSSから順番にやっていくのがいいと思います。
これも教科書通りの順番ですが。こういうところでも「CSS設計の教科書」の学びやすさを感じます。

# 自分を成長させるもの

実際につかって体感するということと、どこかでアウトプットすることがよいのかなと。ちょっとえらそーにクローズドのCSS設計の勉強会をしていると書きましたが、これも結局は自分のためでもあるのです。（有用なものは共有しようというのは嘘ではないですよ！）
kintone都市伝説

[kintone Advent Calendar 2015](http://qiita.com/advent-calendar/2015/kintone) 21 日目の記事です。

kintone使ってますか？  
もう使い始めている、もしくはガンガンに使っているという方はkintoneを楽しんでもらえればいいのですが、まだ使っていない、これから使おうとしているという方もまだまだ多いのではないかと思います。
中には、kintoneって本当のところどうなのよ、本当に業務で使えるのかよと思っている方もいるのではないでしょうか？

そういった方のために、**どこか**のクラウドベンダーではないですが、そういった方々が抱えてしまっている**「kintoneの都市伝説」**についてまとめてみようと思います。

# kintone都市伝説

## 1.安いからあまり凝ったことができない
たまにこういう話を聞くことがあります。本格的にやるならSalesなんちゃらでしょと。  
でも、kintoneは意外にというか、結構カスタマイズできるようになってます。JavaScriptでカスタマイズができるようになってますが、「JavaScript！？ぷークスクスｗ」と思う方も一部にはいるかもしれません。そういった方に言いたい。**"JavaScriptをなめるな！"**と。  

**あえて**その辺りの話は書きませんが、今日までの[kintone Advent Calendar](http://qiita.com/advent-calendar/2015/kintone)を見れば、kintoneのカスタマイズ性の高さを理解してもらえると思います。

## 2.データの連携が難しい
Web上で完結してしまうkintone。データを取り出したり、加工したデータを入れたりするのが難しいのではと思われている方、結構多い気がします。CSVへのデータ書き出しもありますが、もうちょっとちゃんとしたデータ連携したいという場合もあると思います。

**安心してください！REST APIがありますよ！**

REST APIでレコードの取得/登録/更新が簡単にできます。
<img width="260" alt="無題.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/95102/093d62f3-68f1-a97b-d762-744253d5d0f7.jpeg">

詳しくはこちら！[Cybozu.com developer Network](https://cybozudev.zendesk.com/hc/ja/categories/200147600)

近々正式版になると噂のアプリの作成や設定変更のできる通称「デプロイAPI」もあり、これでほとんどのことができちゃいます。REST API？って人には[DataSpider](http://dataspider.appresso.com/)という手もありますよ！

## 3.Excelの代わりになる
個人的にはこの話よくききます。Excelでやってる業務があるんだけど、それ全部kintoneでできるよねってやつです。それ間違いですから！

**本来Excelでやるべきでない業務をkintoneに載せ替えることは可能です。でも、Excelじゃないとだめな業務はExcelでやりましょう。**

Excelって何のソフトでしたっけ。表計算ソフトですよね。本来は、データを見やすく表形式に表したり、グラフにしたりするソフトです。でも何かと便利なので、各拠点からのデータ収集ツールに使ったり、帳票形式に見栄えを整えてデータ配信につかったりする人が多いです。そういうのはkintoneで置き換えできます。でも、ピボットテーブルみたいなExcelならではの機能はできません。Excelでやりましょう。

|Excelでやりましょう|kintoneでやりましょう  |
|:--------------:|:-----------------:|
|複雑な表計算     |複数人からのデータ収集|
|ピボットテーブル   |複数人でのデータ閲覧  |
|一覧でのデータ加工|他サービスと連携     |

私が関わったお客様では、ExcelとkintoneをDataSpiderを利用してうまく使い分けている例もあります。

[アイサンテクノロジー様:事例](http://dataspider.appresso.com/casestudy/newarrival/2015/aisantec.html)

## 4.業務システムではつかえない
そんなことを言っている人は、この[事例](https://kintone.cybozu.com/jp/case/)を全部読みやがれ。
と、それで終わったらあれなので、もう少し具体的に話をしたいと思います。

実は、弊社ではkintoneも使ってますが、なんちゃらforceも使っています。kintoneは使いやすいのですが、本格的に使えるテンプレートが少ないです。逆にSalesなんちゃらはテンプレートというか、そもそもの出自がSFAなので、しっかりとした業務アプリの構造をしています。そういう意味では、やりたい業務がはっきりしている時には、なんちゃらforceはとても使い勝手がいいです。

でも、ちょっとしたアンケートの収集に使いたいとか、まとめたデータをみんなにみてもらいたいという場合は、Salesなんちゃらだと設定をいろいろとしないといけなく面倒だったりします。そういう時はkintoneの方がスパっと作れて早いです。

また、結構あるのが、データはあるんだけど簡単に閲覧する仕組みがないという時。いわゆるシステムの足りないところを補完したいという時。こういう時にはkintoneは本当に有益です。

まとめると、kintoneだけですべての業務をこなすは難しいが、使い方次第で業務のいろんなところに使える！って感じだと思います。

## 5.kintoneってなんか面白そう
この話も、本当によく聞きます。なんか面白そうですよねと。それ、正解です。正解なので、ぜひ使ってみてください。使いところなんか後で考えればいいんですよ。安いですし。

私も使い始めてから、これkintoneでできるじゃんと思うこと増えてます。とりあえずデベロッパーの人は、1年間無償で使えるライセンスありますから、触ってみましょう。

明日は、kintone界のアイドル、永遠の18才ことウッシーさんです。
mysqlで集計頑張るのやめてredshiftにいかない？

今回はmysqlのデータをredshiftに流し込む方法

## 実行環境
CentOS6.5

## 今回使用するもの
今回は[embulk](https://github.com/embulk/embulk)を使用
TreasureDataの[@frsyuki](https://twitter.com/frsyuki)さんが作成されたデータ転送するツールで
inとoutを定義することでinputをcsvやmysqlにしたりoutputをredshiftやbigquery,Treasuredataにしたりできる。
めっちゃ便利！！

## 事前準備
今回は下記のスキーマをもったデータベースがあるとする

| 項目名 | 型           |
|--------|--------------|
| id     | integer      |
| name   | varchar(255) |
| age    | integer      |

## 流すまで

### embulkのインストール
[作者のページ見るのが一番](https://github.com/embulk/embulk#linux--mac--bsd)

### embulk実行用のyamlをかく
完成系から

```lang:yaml
in:
  type: mysql
  user: [user名]
  password: [パスワード]
  database: [DB名]
  table: [テーブル名]
  host: [host名]
  select: "*"
out:
  type: redshift
  host: [redshiftの接続先]
  database: [db名]
  user: [user名]
  password: [パスワード]
  table: [テーブル名]
  mode: insert
  iam_user_name: [IAMのユーザーネーム]
  access_key_id: [アクセスキー]
  secret_access_key: [シークレットキー]
  s3_bucket: [バケットの名前]
```

### RUN!!!!
```lang:console
embulk run ***.yml
```

## yamlの解説
redshiftに関してはbigqueryほど複雑ではなかった印象。
s3のバケットを設定しているのはaws側でredshiftにデータを入れる際はs3に一度データをおくことを推奨しているから。
よってIAMでユーザーを作成するのだが、S3へのアクセス許可が必要になる。

## 後の細かな設定は公式ページで
* [embulk-input-mysql](https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-mysql)
* [embulk-output-redshift](https://github.com/embulk/embulk-output-jdbc/tree/master/embulk-output-redshift)
mysqlで集計頑張るのやめてbigqueryにいかない？

今回はmysqlのデータをbigqueryに流し込む方法

## 実行環境
CentOS6.5

## 今回使用するもの
今回は[embulk](https://github.com/embulk/embulk)を使用
TreasureDataの[@frsyuki](https://twitter.com/frsyuki)さんが作成されたデータ転送するツールで
inとoutを定義することでinputをcsvやmysqlにしたりoutputをredshiftやbigquery,Treasuredataにしたりできる。
めっちゃ便利！！

## 事前準備
テーブルのスキーマをjsonで定義する必要がある。
今回は下記のスキーマをもったデータベースがあるとする

| 項目名 | 型           |
|--------|--------------|
| id     | integer      |
| name   | varchar(255) |
| age    | integer      |

## 流すまで

### embulkのインストール
[作者のページ見るのが一番](https://github.com/embulk/embulk#linux--mac--bsd)

### スキーマのjsonを定義する
今のカラムからtypeは何を指定したら良いかは[こちら](https://cloud.google.com/bigquery/preparing-data-for-bigquery#datatypes)を参照

```lang:schema.json
[
  {
    "name": "id",
    "type": "INTEGER"
  },
  {
    "name": "name",
    "type": "STRING"
  },
  {
    "name": "age",
    "type": "INTEGER"
  }
]
```

### embulk実行用のyamlをかく
完成系から

```lang:yaml
in:
  type: mysql
  user: [databaseのユーザー名]
  password: [databaseへのパスワード]
  database: [database名]
  table: [対象テーブル]
  host: [host名]
  select: "*"
out:
  type: bigquery
  auth_method: private_key
  service_account_email: *****@*****.iam.gserviceaccount.com
  p12_keyfile_path: ./*****.p12
  path_prefix: /tmp
  file_ext: .csv.gz
  source_format: CSV
  project: **********
  dataset: *********
  # 完了後にローカルファイルを削除
  delete_from_local_when_job_end: 1
  # bigquery側でのテーブル名
  table: *******
  # テーブルがない場合に自動で作成するか
  auto_create_table: 1
  # 先ほど作成したスキーマファイルのパス
  schema_path: ./schema.json
  formatter:
    type: csv
    header_line: false
    timezone: Asia/Tokyo
  encoders:
  - {type: gzip}
```

### RUN!!!!
```lang:console
embulk run ***.yml
```

## yamlの解説
inに関しては問題ないと思う
だいたい分かると思う。
問題はoutのbigquery側の設定
ややこしかったものをピックアップした

### service_account_email
公式ページには
> Your Google service account email

こう書かれているので、****@gmail.comって書いたら怒られた。
どうやら[権限ページのサービスアカウント](https://console.cloud.google.com/permissions/serviceaccounts)で作成した際のメールアドレスである必要があるらしい。

### project
公式ページには
> project_id

[ダッシュボード画面](https://console.cloud.google.com/home/dashboard)でのプロジェクトのID

### dataset
[bigquery](https://bigquery.cloud.google.com)のページで作成するデータベースのようなもののID


## 後の細かな設定は公式ページで
* [embulk-input-mysql](https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-mysql)
    * [embulk-output-bigquery](https://github.com/embulk/embulk-output-bigquery/)
Java開発の性能改善！ その３ ヒープダンプを取ろう

第３回になります。

記事を書くこと自体に時間がかかってしまうので

見やすい記事にするってのが難しいですね。。

少しずつ改良していきます。

ストックやフォローをして頂けると励みになります。

　


さて、本題です。


jstatやGCログなどを見てメモリがなかなか開放されない場合は


ヒープダンプを取ってメモリの中身を解析することになります。

 

# ヒープダンプの取得

まず、jstatやpsコマンド等で対象のJVMのプロセスIDを取得しましょう。

```

jps -v | less -SN

```

プロセスIDがわかったらjmapコマンドでダンプを取ります。

サーバのディスク容量に注意してください。

heapサイズを2GBとかに設定した場合は2GB以上のファイルが

生成されることがあります。
 

```

jmap -dump:format=b,file=./heapdump.hprof {プロセスID}

```

これで指定した場所にダンプファイルができます。

-dump:live,format=...というようにliveをつけるとGCが起きて

コマンド実行時に活きているオブジェクトのみのダンプになるようです。

とりあえず今回はフルで取ります。

# ヒープダンプの中身を解析をする

解析をするにはツールを使います。

java標準のjhatやMemory Analyzer、HeapAnalyzerなど

いくつかありますが今回は[Memory Analyzer](http://www.eclipse.org/mat/ "Memory Analyzer")を使います。

Eclipseベースなのでサイズの大きいダンプファイルを開く場合は


MemoryAnalyzer.iniの設定でツール自体のヒープサイズを

増やすようにしてください。

file->Open Heap Dumpより先ほど取得したファイルを指定して、

次に出てきたダイアログでLeak Suspects Reportを選択。

少し待つとoverviewが開くのでReportのLeak Suspectsをさらに選択しましょう。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/102999/fadef338-20ad-2543-4d53-1a42c343046d.png)

そうするとツールがメモリリークの疑いがある場所を探してくれます。
※あくまで疑いなので、違う場合もあるし見つからないリークもある。

上記の図ではT4CPreparedStatementが5000弱のインスタンスを保持していて

25%の容量を使っていると教えてくれています。

Details >> というリンクを押すと対象オブジェクトを持つ上位参照を教えてくれます。

![image (1).png](https://qiita-image-store.s3.amazonaws.com/0/102999/caf292da-8be8-e448-0cc2-972f7717df9f.png)


どうやら50個のTxConnectionListenerの配下に約100個ずつT4CPreparedStatementを保持していて

5000個弱(4953個)のT4CPreparedStatementを持っている様子。

TxConnectionListenerが直接T4CPreparedStatementを持っているわけではないようで

このビューではここまでしか見れないようなので

Dominator TreeからT4CPreparedStatementを検索して参照元を深堀しましょう。

![image (2).png](https://qiita-image-store.s3.amazonaws.com/0/102999/510aff64-eb51-0aa3-c7a9-be2d12ee8ce3.png)

中身はSQL情報のキャッシュなどでした。まぁ、PrepareStatementですからね。

ではこれの参照元を辿りましょう。

T4CPreparedStatementをクリックしてPath To GC Roots->with all referencesを選択すると

参照元を追っていけます。

![image (4).png](https://qiita-image-store.s3.amazonaws.com/0/102999/db639ea3-3eb9-57ba-3dff-181f1a551fae.png)

階層を見ていくとcache(PreparedStatementCache)が保持しているということがわかります。

ここまでの情報をからコネクション(TxConnectionListener)が50個あってそれらが

キャッシュ（PreparedStatementCache）を100個持っているということがわかったので

DB(データソース)の接続設定がこの通りなのかサーバ設定を確認しましょう。

![image (5).png](https://qiita-image-store.s3.amazonaws.com/0/102999/06e4e995-5a02-40ab-955e-90bfc44bd39c.png)

ConnectionPool Sizeが50、 Statement Cache Sizeが100でした。

仮説は当たっているようですね。どう見ても多すぎです。はい。

適切値に直してヒープダンプを取り直したところメモリの使用率も大幅に削減できました。


今回はミドルウェア設定が起因でしたが

開発したアプリケーション起因のリークが疑わしい場合は

サーバ起動時、数分後、数時間後などDumpを何度も取って確認しましょう。

２つのヒープダンプの差分を取る機能もあるので残り続けている(リークしている)オブジェクトはないか・・・

異様に大きいサイズのオブジェクトはないか・・・などをチェックしていきます。


今日はここまで！


- [Java開発の性能改善！ その１ jstatによるヒープ/GCの確認](http://qiita.com/i_matsui/items/4997ebedbdd7a6495509 "Java開発の性能改善！ その１ jstatによるヒープ/GCの確認")
- [Java開発の性能改善！ その２ GCログの解析とHeepの設定](http://qiita.com/i_matsui/items/aabbdaa169c6ae51ecb3 "Java開発の性能改善！ その２ GCログの解析とHeepの設定")
- [Java開発の性能改善！ その３ ヒープダンプを取ろう](http://qiita.com/i_matsui/items/0d1ae2c7e9d17b6c04e0 "Java開発の性能改善！ その３ ヒープダンプを取ろう")
【Linux】treeコマンドの導入と使い方

# treeコマンドの導入と使い方
MacOSなどでターミナルを利用することが多く、ディレクトリの階層やファイル配置を考える上で役に立ったので、書いてみた。
 
## 前提
+ HomeBrewが導入されていること

# 導入方法

+ 以下のコマンドを入力する

```cmd
$ brew install tree
==> Downloading http://mama.indstate.edu/users/ice/tree/src/tree-1.7.0.tgz
######################################################################## 100.0%
==> make prefix=/usr/local/Cellar/tree/1.7.0 MANDIR=/usr/local/Cellar/tree/1.7.0
🍺  /usr/local/Cellar/tree/1.7.0: 7 files, 128K, built in 8 seconds
```

# 使用方法

$ tree [オプション] {対象ディレクトリ}
[オプション]
/f : ディレクトリに含まれるファイルも表示
/a : 階層構造の表示に使用されている線をASCII文字で表示

# 使用例

```cmd
$ tree -fa Model
Model
├── Model/.DS_Store
├── Model/Configuration
│   ├── Model/Configuration/Configuration.h
│   └── Model/Configuration/Configuration.m
├── Model/Parser
│   ├── Model/Parser/WebScrapNode.h
│   ├── Model/Parser/WebScrapNode.m
│   ├── Model/Parser/WebScraper.h
│   └── Model/Parser/WebScraper.m
└── Model/Request
    ├── Model/Request/RateRequest.h
    └── Model/Request/RateRequest.m

3 directories, 9 files
```

## 補足
gitをターミナル上で使っている時などに便利！
本格的なリファクタリングの練習問題

#目的

規模の大きリファクタリングの練習問題を作ってみました。

リファクタリングの勉強は、TDDなどで初歩からきちんと行うが一番良いですが、
リファクタリングの経験がないうちから、
現実に稼働しているコードをリファクタリングしなくてはならないことも、現実には多いです。

もともと大きなコードのリファクタリングは難易度が高いうえに、
その場合は自動テストもなく、自動テストを書くところから始めなければならないことが多い。
難解なうえにも難解なので、ほぼ確実に挫折してしまうことでしょう。

せめて、保守困難なほど巨大だけれども、
自動テストは完備しているコードがあったら練習できるのに、
と思ったので作ってみました。

#練習問題

https://github.com/potimarimo/practice-of-refactoring/tree/master/TinySQL/Solution

C++のリファクタリングの練習を目的としていますが、
記述したプログラム言語はCです。
これをC++に直してリファクタリングしていくことを念頭に置いています。
確認した環境はVisual Studio 2013 Update4です。
自動ユニットテストもつけてありますので、すぐにリファクタリングに入ることができます。

CSVに対する簡易なSQLのような機能を提供する関数となっています。

保守困難なコードをめざしましたが、無駄に意地悪なコードにしても意味がないので、

1. Cでできる範囲で書く。
1. 全機能を1関数に押し込む。

という方針のほかはなるべくきれいに書いてあります。

私はCの経験はあまりないので、メモリリークとかも多少あるような気もしますが、
そういうのを見つけやすくするのもリファクタリングの醍醐味ですので、あまり気にしない方向でお願いします。

#解答例

https://github.com/potimarimo/practice-of-refactoring/tree/master/TinySQL/Answer

実際にリファクタリングを行い、極力読みやすくした解答例も作りました。

実際に行ったリファクタリングそのものではなく、
途中のミスなどは修正してわかりやすくしたものとなっています。

283段階に分けて、差分をファイルでおいてあります。

また、差分ファイルではわかりにくいので、
Gitの履歴の形にしてわかりやすくしたものも用意しました。

https://github.com/potimarimo/practice-of-refactoring/commits/master/TinySQL/Answer/Solution/TinySQL/ExecuteSQL.cpp?page=8
[gradle] gradleってなんだろう？

Javaのビルドツールって、何を使ってますでしょうか？
私はmavenしか知らなかったのですが、gradleが流行っている？らしく、
ちょっと触ってみました。（ほんと、触った程度。。）

※OSはAmazon Linuxで試していきます。

## 何が良いのか？
gradleはビルドの記述をGroovyで書けるそうです。
とりあえず、私は「Groovy」が分かりません。。が、ひとまず進むことにします。
mavenのようにxmlて書かなくて良いだけは分かりました。


## なにはともあれ、インストール
Java(JDK)はすでにインストールされているとします。（バージョン6以上）
gradleのビルドに必要になります。

### gradleのダウンロード
[公式](http://gradle.org/gradle-download/)

```
# 2.9が最新っぽいので。ダウンロード先は任意です。
$wget https://services.gradle.org/distributions/gradle-2.9-all.zip
$unzip gradle-2.9-all.zip
$rm -f gradle-2.9-all.zip
$ln -s gradle-2.9 gradle
```

### 以下のファイルに追記し、PATHを通しておく
```utf-8:.bash_profile
export GRADLE_HOME=$HOME/gradle
export PATH=$GRADLE_HOME/bin:$PATH
```

### 設定を反映させておく、gradleコマンドが通ればOK
```
$source .bash_profile

$gradle -v

------------------------------------------------------------
Gradle 2.9
------------------------------------------------------------

Build time:   2015-11-17 07:02:17 UTC
Build number: none
Revision:     b463d7980c40d44c4657dc80025275b84a29e31f

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.7.0_91 (Oracle Corporation 24.91-b01)
OS:           Linux 4.1.10-17.31.amzn1.x86_64 amd64
```


## Javaプロジェクトの作成

ひとまず、何かしら実行できそうです。
mavenでもJavaプロジェクトのひな型を作れたので、gradleもきっとあるはず、、、、ありそうですね！

### Javaプロジェクトの作成
**gradle init --type java-library**で作れます。

```
$mkdir java_test
$cd java_test/

$gradle init --type java-library
:wrapper
:init

BUILD SUCCESSFUL

Total time: 3.222 secs

This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.9/userguide/gradle_daemon.html
```

何かできました。以下のようなディレクトリ構造になるみたいですね。
ソースコードの構成はmavenと同じでした。

```
├── build.gradle：ビルドファイル。pom.xmlみたいのもの。
├── build/：ビルド成果物の出力先
│　 └── libs/：JARファイルの出力先
└── src/
　　├── main/
　　│　 ├── java/：ソースコード
　　│　 │　 ├──Library.java：サンプルコード
　　│　 └── resources/：JARに同梱されるリソース
　　└── test/
　　　　├── java/：テスト用ソースコード
　　　　│　 ├──LibraryTest.java：サンプルテストコード
　　　　└── resources/：テスト実行時に使われるリソース
```

### サンプルコードをビルド
細かい説明は次回にして(笑)、まずはビルドしてみましょう。
**gradle build**だけです。

```
$gradle build
:compileJava
・・
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava
・・
:processTestResources UP-TO-DATE
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

Total time: 10.19 secs

# jarができたか確認
$ll build/libs/
-rw-rw-r-- 1 ec2-user ec2-user 591 Dec 20 22:54 java_test.jar

```

色々実行されたました。コロン（:）で書かれている部分がタスクと呼ばれ、
buildによって順次実行されていくようです。
おそらくテストだけしたいなら、gradle testでいけるはず。

また、buildディレクトリ配下に成果物が出力されていることも確認できました。


## 最後に

ひとまず実行はできましたが、mavenに対するメリットはまだ感じられません。
次回は、build.gradleファイルの中身を確認してみたいと思います。

ではでは。
NetBeans本体をデバッガで動かすまで (+ Mac向けNetBeans追加設定)

NetBeans本体の挙動を知るためにデバッガで動かそうとしたのですが、少々ハマったのでここにメモっておきます。(追加設定については末尾参照)

# 用意するもの

* Mercurial
* JDK8
* ant
* NetBeans

作業のアウトラインは以下のページを参照してください。
http://wiki.netbeans.org/WorkingWithNetBeansSources

# ソースの取得

スナップショットをzipで取得できそうな記述をどっかで見かけたのですが、見当たらないのであきらめてMercurialで取得します。リポジトリは[前述のページ](http://wiki.netbeans.org/WorkingWithNetBeansSources)を参照。

取得後のディスク使用量は4.4GB、当方の環境だと3時間くらいかかってます。

# ビルドの実行

いきなりNetBeansでプロジェクトを開くとライブラリ不足等でコケるので、事前にビルドして必要なライブラリを取得しておきます。ビルドはトップレベルで`ant`コマンドを実行するだけです。

ビルド時間はMacBook Air Mid2013(Core i7 1.7GHz + 8GB RAM + 256GB SSD)で
約15分+ライブラリダウンロード時間。(初回ビルド時の時間は計測してませんでした。1時間くらい見ておけば大丈夫?)

ビルド後のディスク使用量は6.0GB。

# NetBeansへのプロジェクトの読み込み

リポジトリ内のプロジェクト数が1000を超える(!!)ので、うっかり全プロジェクトを読み込もうとするといつまでたっても終わりません。(←一度やらかした)

ターゲットのプロジェクトだけ開けば、「必須プロジェクトを開く」にチェックが入っていると(デフォルトON)、関連プロジェクトも一緒に開いてくれます。

# Netbeansのデバッガで動かす

プロジェクトを読み込んだら、そのままNetBeansの「デバッグ」ボタン、もしくは「実行」ボタンを押せば、プロジェクト設定で仕込まれてるのか、開発版のNetBeansが起動します。

あとは普通のアプリと同様ブレークポイント等も使えます。ログは「出力」ウィンドウに出ます。追加の情報出力を埋め込みたければ、たいていのクラスにはLOG定数(Java標準logger)が定義されているのでこれを使えばよいでしょう。

# おまけ

解析の結果、Mac OS Xでは、NetBeansの設定ファイルに以下の設定(JVMのプロパティ`netbeans.editor.keymap.compatible`を`true`にする)を行うことで、option(alt)キーにショートカットを設定したときには特殊文字入力が無効になることがわかりました。

    > diff -U0 "/Applications/NetBeans/NetBeans 8.1.app/Contents/Resources/NetBeans/etc/netbeans.conf"{.orig,}
    --- /Applications/NetBeans/NetBeans 8.1.app/Contents/Resources/NetBeans/etc/netbeans.conf.orig      2015-12-19 10:21:02.000000000 +0900
    +++ /Applications/NetBeans/NetBeans 8.1.app/Contents/Resources/NetBeans/etc/netbeans.conf   2015-12-20 16:58:06.000000000 +0900
    @@ -46 +46 @@
    -netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true"
    +netbeans_default_options="-J-client -J-Xss2m -J-Xms32m -J-Dapple.laf.useScreenMenuBar=true -J-Dapple.awt.graphics.UseQuartz=true -J-Dsun.java2d.noddraw=true -J-Dsun.java2d.dpiaware=true -J-Dsun.zip.disableMemoryMapping=true -J-Dnetbeans.editor.keymap.compatible=true"
schemizeのnode.js版作った


shcemizeという、JSONからJSON Schemaを生成する便利なGemがある。

https://github.com/kenchan/schemize

schemizeを使うためだけにGemfileを書くのが嫌だったので、node-schemizeを作った。

https://www.npmjs.com/package/schemize

```sh
// とりあえずグローバルにインストール
$ npm install -g schemize

// デフォルト
$ echo '{ "key": "value" }' | schemize
{"type":"object","properties":{"key":{"type":"string"}}}

// プリチー
$ echo '{ "key": "value" }' | schemize --pretty
{
  "type": "object",
  "properties": {
    "key": {
      "type": "string"
    }
  }
}

// プリチーはインデント数と"tab"が指定可能
$ echo '{ "key": "value" }' | schemize --pretty tab
{
        "type": "object",
        "properties": {
                "key": {
                        "type": "string"
                }
        }
}
```

yamlはyaml屋ということで、yamlを出力したい場合は[js-yaml](https://www.npmjs.com/package/js-yaml)等を使ってください。

```sh
$ npm install -g js-yaml
$ echo '{ "key": "value" }' | schemize | js-yaml
type: object
properties:
  key:
    type: string
```

バグ等はissueにて頼む！

https://github.com/pirosikick/node-schemize
技術英語 > I'm unable to [grasp the basic concept of humor]. / As I recall, ...

HuluでStar Trekの映画が登録された。
大好きなTNGも順番に見ながら技術的な英語力向上を目指す。

合わせてDVDで購入しているVoyagerも時々見直す。

<hr>
@ Star Trek movie Generations

感情というものが分からないアンドロイドのデータ少佐

> I'm unable to <font color=red>grasp the basic concept of humor</font>.

この後、悩んだすえにemotionチップの使用を決める。


Hulu映画(AppleTVで閲覧)は日本語字幕でのリスニングなので、細かい点で僕が聞き間違っているかもしれない点に注意。


<hr>
Generationsの冒頭の方でTuvok役の人が出演していた。Voyagerの撮影の大分前のはず。

トム・パリス役の人もTNGのエピソードで出ているのは知っていた。艦長がノーシュカンに殺されるエピソード。タペストリーというエピソード名だったように思う。

確か、Tuvok役の人はTNGの時にラフォージ役で応募して落選して、その数年後にVoyagerで採用されたというのをVoyagerのDVDの特典映像で見たのを思い出した。

<font color=red>As I recall, </font>

「確か」として使う。
http://american-phrases.blogspot.jp/2014/03/as-i-recall.html
エスイーが要件定義でやるべきたったひとつのこと(実践編)

元海岸沿い現西新宿SIerのまつい師匠(@nmatsui)の「良いコードとは」というスライド、お読みになられたでしょうか。まだの方は是非！

[![image](https://qiita-image-store.s3.amazonaws.com/0/8475/988c9075-2a36-6831-be1c-295e91af9901.png)](http://www.slideshare.net/nbykmatsui/ss-55961899)
http://www.slideshare.net/nbykmatsui/ss-55961899

さて、そのスライド中で出てくる「ロジックをシンプルに保つ」という話、以前まついさんと社内SNSでディスカッションしたことがある内容で、その結果をまとめておいたのが、以下になります。


[![image](https://qiita-image-store.s3.amazonaws.com/0/8475/639b5d44-6441-d7a3-cc22-4608d4f22da9.png)](http://www.slideshare.net/kawasima/ss-26968240)
http://www.slideshare.net/kawasima/ss-26968240

デシジョンテーブルを簡略化すると、プログラムの複雑度を減らすことができ、なにより仕様が単なる記号でなくて、顧客の要求が浮き出てきて理解しやすくなるよ、というものです。
ただ、この中では非常に単純な例しか挙げていないので、もう少し実践的な仕様で、ご説明したいと思います。

## 出力が多値のデシジョンテーブル

「[第5回　仕様整理に「デシジョンテーブル」を使ってみよう](http://gihyo.jp/dev/serial/01/test_up/0005)」の記事より、問題を拝借します。

とある、健康ランドの精算システムの仕様は以下のとおりとする。

- クーポン持参:10％OFF
- 平日割引:30％OFF
- 平日シニア割引（65歳以上）:50％OFF
- 2つ以上の割引サービスが重なった場合は，割引率が高い方が優先される

デシジョンテーブルを書くと以下のようになります。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/c277f870-ca38-0e06-4718-83a416c597d0.png)

これは、最初の仕様だけ書いてあれば、みなさんというか、大半のプログラマは以下のようにコード書くと思います。

```java
int discountRate = 0;

if (hasCoupon()) {
    discountRate = 10;
}

if (isWeekday()) {
    if (isElderly()) {
        discountRate = 50;
    } else {
        discountRate = 30;
    }
}
```

ですが、設計書に上記のようなデシジョンテーブル(だけ)が書いてあると、そのとおりIF文が8個書かれることが往々にしてあります。設計者とプログラマが別々の人で、上記のようなデシジョンテーブルしかない場合は、まずそのまま実装することでしょう。

さて、これを簡略化するのもカルノー図を書けばよいです。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/0a808ed4-c949-8235-ccdb-e2a35c10a397.png)

3つ以上の値をとる場合も、同じ値で隣接マスをグルーピングします。

これより、以下の仕様を導くことができます。

- クーポンを持っておらず、休日である → 割引なし
- クーポンを持っていて、休日である → 10％OFF
- 平日で65歳未満である → 30%OFF
- 平日で65歳以上である → 50%OFF

もとの要求事項から、「2つ以上の割引サービスが重なった場合は，割引率が高い方が優先される」のルールを展開して書いた仕様で明確です。これならIF文3つで済みます。

## N/Aの扱い

[記事](http://gihyo.jp/dev/serial/01/test_up/0005)の中で、

- 土日祝ジュニア割引（15歳以下）:20％OFF

の割引ルールが仕様追加された例もとりあげておられます。

またデシジョンテーブルを書きます。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/f7d6bff6-67bf-835d-473b-8467a53f491b.png)

今度は、条件Cと条件Dを同時に満たすユーザはありえないので、ここがN/A(Not applicable)になります。
そしてカルノー図ですが、N/Aの部分(図中"-"で表している部分)は、ワイルドカード的に扱います。隣接領域が大きいほど、簡略化できるということになるので、N/Aを活かしてできるだけ領域を大きくします。

![image](https://qiita-image-store.s3.amazonaws.com/0/8475/b11786c7-0da7-ed5e-ac30-317deedea48e.png)

さて、これで仕様を言語化すると…

- クーポンを持っておらず、休日である → 割引なし
- クーポンを持っていて、休日で、16歳以上である → 10％OFF
- 休日で、15歳以下である → 20%OFF
- 平日で65歳未満である → 30%OFF
- 平日で65歳以上である → 50%OFF

となります。IF文4個で済み、各条件式もシンプルなものになります。

というように、N/Aは仕様を簡略化するチャンスなので、積極的に見つけ出すようにしましょう。

## まとめ

デシジョンテーブルを作ったら、簡略化までして設計書に書いておくのが、要件定義におけるシステムエンジニアのマナーです。どうぞよろしくお願いします :construction_worker:
Homebrewで「Error: Failed to download resource "texi2html"」に遭遇した


# Homebrewで「Error: Failed to download resource "texi2html"」に遭遇した

## こういうシチュエーションだった
[Homebrew](http://brew.sh/index_ja.html)を使って[mpv-player/mpv](https://github.com/mpv-player/mpv)をインストールしようとしたパターン

## やったこと
### Homebrewをインストール
0. [Command Line Tools](https://developer.apple.com/downloads/)をダウンロードしてインストール
0. Homebrewをインストール

```shell-session
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

0. Homebrewの動作を確認

```shell-session
brew doctor
```

0. お約束

```shell-session
brew update
brew install git
```

### mpv-player/mpvをインストール
[homebrew-mpv](https://github.com/mpv-player/homebrew-mpv)を参考に

### 「Error: Failed to download resource "texi2html"」に遭遇
```shell-session
brew tap mpv-player/mpv

==> Installing mpv-player/mpv/mpv dependency: texi2html
==> Downloading http://download.savannah.gnu.org/releases/texi2html/texi2html-5.0.tar.gz
==> Downloading from http://public.p-knowledge.co.jp/Savannah-nongnu-mirror//texi2html/texi2html-5.0.tar.gz

curl: (7) couldn't connect to host
Error: Failed to download resource "texi2html"
Download failed: http://public.p-knowledge.co.jp/Savannah-nongnu-mirror//texi2html/texi2html-5.0.tar.gz
```

[brew で ffmpeg をインストールしようとしたら 404 エラーが出た](http://krakenbeal.blogspot.jp/2013/02/brew-ffmpeg-404.html)を参考にして
/usr/local/Library/Formula/texi2html.rb
を修正

```rb
require 'formula'

class Texi2html < Formula
  homepage 'http://www.nongnu.org/texi2html/'
  #url 'http://download.savannah.gnu.org/releases/texi2html/texi2html-1.82.tar.gz'
  url 'http://download-mirror.savannah.gnu.org/releases/texi2html/texi2html-1.82.tar.gz'
  sha1 'e7bbe1197147566250abd5c456b94c8e37e0a81f'

  keg_only :provided_pre_mountain_lion

  def install
    system "./configure", "--disable-dependency-tracking", "--prefix=#{prefix}",
                          "--mandir=#{man}", "--infodir=#{info}"
    system "make install"
  end
  
  def test
    system "#{bin}/texi2html", "--help"
  end
end
```