OmniAICreator/Qiita-1.07M huggingface dataset:
goでのgodoc用コメント作成 正規表現

エクスポートしているメソッドなどにドキュメントコメントをつける正規表現。
`// 名称`までは作成してくれるので、以降のコメントは自分で書く。

なお以下はIntelliJで動作確認しています。

## type用

#### 検索用正規表現
    ^type\s*([A-Z][\w]*)

#### 置き換え
    // $1 \n$0

#### 実行例

```go:置換前
type Sample struct {
	// do something
}
```

```go:置換後
// Sample
type Sample struct {
	// do something
}
```

## func(レシーバなし)用

#### 検索用正規表現
    ^func\s*([A-Z][\w]*)

#### 置き換え
    // $1 \n$0

#### 実行例

```go:置換前
func Sample() bool {
	// do something
}
```

```go:置換後
// Sample
func Sample() bool {
	// do something
}
```

## func(レシーバあり)用

#### 検索用正規表現
    ^func\s*\(\w*\s*\S*\s*([A-Z][\w]*)

#### 置き換え
    // $1 \n$0

#### 実行例

```go:置換前
func (s *Sample) TestMethod() bool{
  // do something
}
```

```go:置換後
// TestMethod 
func (s *Sample) TestMethod() bool{
  // do something
}
```

## struct内のフィールドなど

置き換えたい部分だけ選択してから置き換え実行する。
(余計なものまで引っかかるため)

#### 検索用正規表現
    ^(\s*)([A-Z][\w]*)

#### 置き換え
    $1// $2 \n$0

#### 実行例

```go:置換前
type Example struct {
	Hoge string
	Fuga string
	*Embedded
}
```

```go:置換後
type Example struct {
	// Hoge 
	Hoge string
	// Fuga 
	Fuga string
	*Embedded
}
```

**追記**
面倒になってきたのでperlで。
エラー処理など全く無いので自己責任で実行してください。

```sh:add_comment_go.sh
#!/bin/sh
perl -i -pe 's/^type\s*([A-Z][\w]*)/\/\/ $1 \n$&/g' $1
perl -i -pe 's/^func\s*([A-Z][\w]*)/\/\/ $1 \n$&/g' $1
perl -i -pe 's/^func\s*\(\w*\s*\S*\s*([A-Z][\w]*)/\/\/ $1 \n$&/g' $1
perl -i -pe 's/^(\s*)([A-Z][\w]*)/$1\/\/ $2 \n$&/g' $1
```

```sh:実行
add_comment_go.sh [対象ファイル]
```
gem 断点　恢复 restore

http://www.justinweiss.com/articles/3-quick-gem-tricks/

gem pristine

```text

  Description:
    The pristine command compares an installed gem with the contents of its
    cached .gem file and restores any files that don't match the cached .gem's
    copy.
    
    If you have made modifications to an installed gem, the pristine command
    will revert them.  All extensions are rebuilt and all bin stubs for the gem
    are regenerated after checking for modifications.
    
    If the cached gem cannot be found it will be downloaded.
    
    If --no-extensions is provided pristine will not attempt to restore a gem
    with an extension.
    
    If --extensions is given (but not --all or gem names) only gems with
    extensions will be restored.
```
Passenger5で$LOAD_PATH.unshiftを使うと起動できなくなった

環境を新しくして、Passenger5でRailsを起動しようとしたら、エラーになった。

```
Message from application: RVM - Ruby integration was extracted to a separate gem, it should be installed by default with RVM, remove the `$LOAD_PATH.unshift` line and all should be fine again.
Visit https://rvm.io/integration/passenger for more details. (RuntimeError)
```

その昔、rvmのgemのパスをRailsに明示的に渡すのに書いた「$LOAD_PATH.unshift」がエラーになってしまう模様。

```
if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
  begin
    rvm_path     = File.dirname(File.dirname(ENV['MY_RUBY_HOME']))
    rvm_lib_path = File.join(rvm_path, 'lib')
    $LOAD_PATH.unshift rvm_lib_path
    require 'rvm'
    RVM.use_from_path! File.dirname(File.dirname(__FILE__))
  rescue LoadError
    # RVM is unavailable at this point.
    raise "RVM ruby lib is currently unavailable."
  end
end
```

https://rvm.io/deployment/passenger3

この処理全体今はもういらなさそうなので、全部削除したら、無事起動できた。
Javascriptで文字列末尾から指定の文字列を削除する

# 文字列末尾から指定の文字列を削除する

Table上に支店名を表示する際、マスタ上に「札幌支店」「名古屋支店」「大阪支店」のように登録されていて、「支店」を表示せずに札幌、名古屋、大阪と表示したいとの要望に対応した時の自分用メモ。

## Stringにprototypeとしてメソッドを追加

```javascript
String.prototype.tailCut = function(str){
  return this.replace(new RegExp(str + "$"), "");
}
```

## 呼び出し元での記載例

```javascript
"大阪支店".tailCut("支店"); // "大阪"と表示される。
```

もちろんStringな変数でもOK。

# 2018/08/08追記
Javascriptの標準オブジェクトのprototypeに手を加えるとか禁じ手ですね。。
自分の記事ですがこれはやらない方がいいです。。
Yarnで react+browserify+babel+JSX変換してみる

# yarnとは何か？

facebookを中心に開発されたnpmクライアント、Hadoopに同名のフレームワークがありQiitaのタグも現状ではそちらの方を指してるので注意。

おそらく大文字でYARNだとHadoopで、小文字でyarnだとnpmって感じで使い分けられるのではなかろうかと予想。
※とか思ってたけどyarnpkgに落ち着きそうである。

# npm と何が違うのか(※yarnpkg.comより引用)

- Ultra Fast（超速い）
- Mega Secure（超安全）
- Super Reliable（超ちゃんとしてる）

# 使い方は？

npmを使ったことがあるならほとんどそのままの感覚で利用できる、以下にreact+browserify+babel+JSX変換したい場合の手順を具体例として上げておく。

### yarn インストール

まずyarnをインストールする、macOS/windows/linuxそれぞれでのインストールの仕方がyarnのサイトの「[Install yarn](https://yarnpkg.com/en/docs/install)」にあるのでそれに従ってインストールする、以降の例はmacOSでのもの。

`curl -o- -L https://yarnpkg.com/install.sh | bash`

ちなみにこれだと自分でPATHを通さないといけなかったりするので、面倒な場合は

`npm install -g yarnpkg`

でインストールすれば、大体大丈夫な気がする。
※npmの代替ツールをnpmでインストールするのは何か自己矛盾を感じるが。

### package.jsonの作成

`yarn init`

でいつものように名前とか聞かれるので、無視してENTER押してればとりあえずpackage.jsonができてるはず。

### reactをインストール

`yarn add react`
`yarn add react-dom`

でreactをインストールする、オプションがない場合は「dependencies」の方に追加されます。

### ビルド環境を構築

Sassを使いたいのでnode-sassをインストール
`yarn add node-sass --dev`

--devオプションをつけることで「devDependencies」に追加されます、「peerDependencies」に追加したい場合は--peerをつければOK。

Browserify+babelをインストール
`yarn add browserify --dev`
`yarn add babelify --dev`
`yarn add babel-preset-es2015 --dev`
`yarn add babel-preset-react --dev`

jsのminifyをしたいので以下をインストール
`yarn add uglifyjs --dev`

間違ってインストールしてしまった場合は、`yarn remove [pkgname]`でアンインストールできます。

ここまでうまくいっていれば、package.jsonの内容は以下のようになっているはずです。

```package.json
{
  "dependencies": {
    "react": "^15.3.2",
    "react-dom": "^15.3.2"
  },
  "devDependencies": {
    "babel-preset-es2015": "^6.16.0",
    "babel-preset-react": "^6.16.0",
    "babelify": "^7.3.0",
    "browserify": "^13.1.0",
    "node-sass": "^3.10.1",
    "uglify-js": "^2.7.3"
  }
}

```

## ビルド用のscriptsを追加

タスク名は何でもいいが、とりあえず下記の3つを追加してみた。

```package.json
  "scripts": {
    "build:sass": "node-sass --output-style compressed src/sass/style.scss dist/css/style.css",
    "build:babel": "browserify -t babelify src/js/app.js -o dist/js/app.js",
    "build:min": "uglifyjs dist/js/app.js --compress -o dist/js/app.js"
  }
```

「src」ディレクトリ内のファイルをビルドして「dist」ディレクトリに吐き出すというもの。

- build:sass がsassのビルドでscssをcssに変換して吐き出す
- build:babel がbrowserify+babelify+JSX変換
- build:min が上記で生成したjsのminifyでuglifyjsで圧縮

## scriptsを実行

`yarn run build:sass`

などでscriptを指定すれば実行可能、ちなみにインストールのみならずscriptの実行もnpmよりyarnの方が速い気がする。

## 感想

今の所npmと異なる独自機能などはないようなので、超速いnpmという感じ。

ただしまだ出来たてのものなので、いくつか問題点もあるようで自分が気がついた範囲ではprivateなrepositoryに関してはインストールが失敗する模様。
rbenvのinstallに失敗するのをどうにかした

# rbenv install 2.2.4 が失敗する

環境は OS X 10.11.6

```
$ rbenv install 2.2.4
：
//色々ログがでる
BUILD FAILED (OS X 10.11.6 using ruby-build 20151230)
：
//色々ログが出る
```

と出て失敗してしまう

# brew --config の CLTを確認
```
$ brew --config
：
CLT: N/A
：
```

N/Aだったので、command line toolsをインストール（以下から）

https://developer.apple.com/download/more/?=for%20Xcode

その後、再度rbenv install 2.2.4で見事にインストール成功
PhysX3.3を実装しよう！

## はじめに
会社からの課題で使うことになったのだが、いろいろとハマりポイントがあったので忘れないようにメモメモφ(..)
導入までを解説する
###開発環境
Windows10 64bit
VisualStudio Community2015
## SDKの取得
###開発者アカウント登録
https://developer.nvidia.com/gameworks
からアカウントを登録しましょう。詳細は割愛

###PhysXリポジトリのアクセス申請
プライベートリポジトリになっているので
https://developer.nvidia.com/physx-source-github
から申請します。
###コードのDL
アクセスができるようになれば、GitHubのリリースのタブから最新のPhysXをダウンロードします。
2016/10/12現在での最新版は3.3.4です。

## PhysXのビルド
32bit向けのDEBUGのみビルドしてみます

###ダウンロードデータの中身
ダウンロードデータはCドライブのルートに置いときます

ダウンロードデータルート
- APEXSDK（今回は触れない、布とか粒子とかを扱える）
- PhysXSDK（今回使う物理エンジン）
- PhysXSDK\Bin（サンプルやスニペットでビルドしたデータが入る）
- PhysXSDK\Include（おなじみのフォルダー）
- PhysXSDK\Lib（初期状態では必要最低限のライブラリが不足してる）
- PhysXSDK\Source（PhysX本体）
- PhysXSDK\Snippets（PhysXの使い方を理解するための簡単なサンプル）
- PhysXSDK\Samples（PhysXで何ができるかのデモリール的なサンプル）
- PhysXVisualDebugger（PhysXをリアルタイムで別ウィンドウでデバッグできる優れもの）

###PhysXのビルド
PhysXSDK\Source\compiler\vc14win32
にソリューションファイルがあるのでアクセス

すべてのプロジェクトを選択し、プロジェクトのプロパティで
C/C++の全般の警告レベルをいいえ(/WX-)にします
C/C++のコード生成のランタイムライブラリをマルチスレッドデバッグ/MDdにします

ビルド！

エラー	C2373	'__pfnDliNotifyHook2': 再定義されています。異なる型修飾子です。		
が３つほど出るので　とりあえずその行をコメントアウトします。今のところ不具合は特に出てないですけど、ほかに方法があるのかも

プロジェクトのクリーンを行い、リビルド！

無事完了すれば
PhysXSDK\Bin\vc14win32　にdllファイルが生成、
PhysXSDK\Lib\vc14win32　にライブラリデータが生成されます

###サンプルのビルド
PhysXSDK\Samples\compiler\vc14win32
にソリューションファイルがあるのでアクセス

特に設定はせずにビルド！

PhysXSDK\Bin\vc14win32　のフォルダーにexeが作成されます
色々サンプルを触って遊べます

###スニペットのビルド
PhysXSDK\Snippets\compiler\vc14win32
にソリューションファイルがあるのでアクセス

すべてのプロジェクトを選択し、プロパティーを開き、C/C++の全般の警告をエラーとして扱うをいいえ(/WX-)にする

プロジェクトのクリーンを行いビルド！

PhysXSDK\Bin\vc14win32 にexeが生成されます
かんたんなサンプルが動いている様子を確認できます

## Visual Debugger
ダウンロードしたデータにインストーラーが入っているのでインストール
インストールしたデータはデフォルトでは
C:\Program Files\NVIDIA Corporation\NVIDIA PhysX Visual Debugger
になっているかと思います
このフォルダー内のPVD2.exeがビジュアルデバッガです

ビジュアルデバッガを起動した様態でPhysXのサンプルを起動するとその様子をデバッグできます
![Desktop 10.12.2016 - 18.36.07.16.png](https://qiita-image-store.s3.amazonaws.com/0/64805/1778e80e-dfc7-9e49-0ab9-337e05a6a99a.png)


## 自分のプロジェクトでPhysXを使用
###パス
自分のプロジェクトのVC++ディレクトリに、ビルドしたIncludeとLibを指定し、

```cpp:MyPhysics.cpp
#include <PxPhysicsAPI.h>

#pragma comment (lib,"PhysX3CommonDEBUG_x86.lib" )
#pragma comment (lib,"PhysX3DEBUG_x86.lib" )
#pragma comment (lib,"PhysX3CookingDEBUG_x86.lib" )
#pragma comment (lib,"PhysX3CharacterKinematicDEBUG_x86.lib" )
#pragma comment (lib,"PhysX3ExtensionsDEBUG.lib" )
#pragma comment (lib,"PhysX3VehicleDEBUG.lib" )
#pragma comment (lib,"PhysXProfileSDKDEBUG.lib" )
#pragma comment (lib,"PhysXVisualDebuggerSDKDEBUG.lib" )
#pragma comment (lib,"PxTaskDEBUG.lib" )

```
と書けば開発準備OK！

あとは
http://docs.nvidia.com/gameworks/index.html
のリファレンスとビルドしたサンプルを見ながら作っていこう！
composer メモ


よく忘れる

# バージョン番号指定

|指定|対象バージョン|
| :--: | :---: |
| 1.2.3 | 1.2.3.0-stable |
| >1.2 | >1.2.0.0-stable |
| >=1.2 | >=1.2.0.0-dev |
| >=1.2-stable | >=1.2.0.0-stable |
|<1.3 | 	<1.3.0.0-dev |
|<=1.3 |	<=1.3.0.0-stable | 
|1 - 2 |	>=1.0.0.0-dev <3.0.0.0-dev |
|~1.3 |	>=1.3.0.0-dev <2.0.0.0-dev |
|1.4.* |	>=1.4.0.0-dev <1.5.0.0-dev |

## バージョン名のフォーマット

`X.Y.Z` or `vX.Y.Z` で、オプションとして `-dev`,`-patch`(`-p`),`-alpha`(`-a`),`-beta`(`-b`),`-RC` が認識できる。

例

- 1.0.0
- 1.0.3
- 1.1.0
- 0.2.5
- 1.0.0-dev
- 1.0.0-alpha3
- 1.0.0-beta2
- 1.0.0-RC5
- v2.0.4-p1

# インストールしている特定のパッケージのバージョンを確認

- `composer depends vendor/foo`

# インストールしているパッケージの一覧を表示

- `composer show`

# インストールしている特定パッケージの詳細な情報を表示

- `composer show vendor/foo`


# 参考

- http://tech.quartetcom.co.jp/2015/01/19/composer-practices/
- https://getcomposer.org/doc/articles/versions.md
- https://getcomposer.org/doc/04-schema.md#version
数値カラムのソートでnullの位置を制御する

[order by null 最後]
数値カラムをソートするとき、「null,1,2,3...」の順になる。
ステータスを表すカラムだったりすると、1,2,3をまず表示してnullは後にしたいとか制御が必要になったりする。
そういうときに
`order by case when b_clm is null then 10 else 0 end asc,
b_clm asc`
のように二段階ソートするとnullを最大として扱かったりできる。

## 表

#### テーブルA
| a_id | a_clm1 | a_clm2 |
|:-:|:-:|:-:|
| 1  | 1  | 3  |
| 2  | 1  | 3  |
| 3  | 2  | 4  |
#### テーブルB
| b_id | b_a_id |
|:-:|:-:|
| 1  | 1  |
| 2  | 2  |
#### テーブルC
| c_id | c_a_id |
|:-:|:-:|
| 1  | 1  |
| 2  | 2  |

こんな感じのときに、AとBを結合して、Cはサブクエリで取るとする。

## SQLServerでnullの位置を制御

fromとjoinに入っているカラムはorder byのなかでcase whenできる。
SQLServerが試せるところにないのであまり確認できないのだけど、次のような感じだった。

**A.**
>select a_id
,(select top 1 c_clm from tablec where c_a_id = a_id order by c_id desc) as c_clm
from tablea
left join tableb on b_a_id=a_id
order by 
case when b_clm is null then 10 else 0 end asc
,b_clm asc

これはb_clmがfromとjoinで指定したテーブルのカラムなのでいける。

**B.**

>select a_id
,(select top 1 c_clm from tablec where c_a_id = a_id order by c_id desc) as c_clm
from tablea
left join tableb on b_a_id=a_id
order by 
case when c_clm is null then 10 else 0 end asc
,c_clm asc

これはc_clmがfromとjoinに入ってない、サブクエリのカラムなので「c_clmは無効です」とか言われる。
`order by c_clm asc`
単体はいけるんだからcase whenもいけていいと思うんだけど。

**B'.**
それでこうやった。
>select a_id
,(select top 1 (10 - c_clm) from tablec where c_a_id = a_id order by c_id desc) as c_clm_od
from tablea
left join tableb on b_a_id=a_id
order by c_clm_od asc

二段階のorder byは諦めて（しかもサブクエリでのCASE WHENも使えなかった）、select時に大小関係が逆になるように10-c_clmとしてそれでソートするようにした。
こうやってみると二段階order byよりこちらのほうがシンプルな感じがする。別に10から引かなくても普通に(-c_clm)でよかったかも。


これが手元のMySQLで試したら両方行けた。

今検索したら、2件目のリンクによるとこれでもいけた。こっちのほうがシンプルだった。
`order by c_clm is null asc`
SQLServerで使えるんだろうか。

# 参考

[[SQLServer][SQL] Order by で NULLを最後に持ってくる](http://t-wata.com/?p=171)
[【SQL】ORDER BY で NULL を最後にする場合の注意点](http://yukiten.com/blog/info-tec/sql-order-by-null/)
iPhoneアプリで戻るボタンを非表示にする

久しぶりにiPhoneアプリを触ってみた。遷移元のコントローラ別にナビゲーションアイテムの表示を制御するというのをやったらこんな感じになった。

```
class XyzController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 前の画面コントローラー
        let prev = self.parentViewController
        if (( prev?.isEqual(CdeController)) != nil) {
            // CDEから来たとき
        }
        if (( prev?.isEqual(DefController)) != nil) {
            // DEFから来たとき
            self.navigationItem.hidesBackButton = true
            var stuImg = UIImage(named: "stu.png")?.imageWithRenderingMode(.AlwaysOriginal)
            var stuBtn = UIBarButtonItem(image: stuImg, style: .Plain, target: self, action: "ShowWindow")
            self.navigationItem.setRightBarButtonItem(stuBtn, animated: false)
        }

        
    }
}
```

これ自体は難しくないんだけど、検索したらいろんなやり方があって、objective-cのコードとかも出てきて、どこに何を書いたらいいのかわからなくなる。

[Swiftポケットリファレンス](https://www.amazon.co.jp/dp/4774179841/)

Swiftポケットリファレンスを見ながらやるとなぜか頭がスッキリするのか、サクサク進んだ。
わからない→検索→わからない
だったのが
わからない→ポケットリファレンスを読む→書いてない→検索→わかる
となった。何でも書いてるわけではない。
ついでにnavigationItemの右ボタンをセットするとかもぱっとできた。

# 参考
[UINavigationControllerの戻るボタンを消したい、非表示にする方法](http://qiita.com/takashings/items/657069b22740fe4bf021)
PHP PDO 接続関数

<?php

  function db_connect(){

     $db_user = 'root';
     $db_pass = 'root';
     $db_host = 'localhost';
     $db_name = 'test01_db';
     $db_type = 'mysql';
     $dns = $db_type.':host='.$db_host.'; dbname='.$db_name.'; charset=utf8';

     try{

      $pdo = new PDO($dns,$db_user,$db_pass);
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);            
     
     }catch(PDOException $Exception){

      die('接続エラー'.$Exception->getMessage());

     }

     return $pdo;

  }
   
?>
技術的負債と戦わずにマネジメントする

[技術的負債とどうやって戦うか - Qiita](http://qiita.com/kmszk/items/ad687e772da454e3f614)

こちらを読んで、思ったことを書いてみようと思いました。

# 記事についての感想

ほとんど同意です！ 凄くまとまっていて読みやすかったです。
ここに書くのは引用記事の別視点での自分の解釈になります。

# 技術的負債はいつ生まれるか？

残念ながらアプリケーションのコードを書いた瞬間に技術的負債は生まれます。
どんなに綺麗に書いても、レビューをしても消えることはない闇です。
つまり技術的負債は生み出さないようにするものではなく、コントロールするべきものなのです。

そして、引用元タイトルでは戦う！となっていましたが、
僕は戦い続けて疲れてしまったため、マネジメントすることにしました。
(やることは変わりません)

# 技術的負債を許容する

技術的負債を細かく返すことは賛成。
ただ、開発者はスケジュールと戦っているため、スケジュール内に必要な機能を提供することが最低限になる。
プロダクトに価値を生むためにはリリースを最速でやったほうが良い場合がある。
そのときには技術的負債をある程度許容する。

その際にはどれほどの負債になるかを把握して、マネジメントすることが必要。

# 技術的負債はほとんどの場合についてお金のローンと同じように考えることが出来る

お金も投資することによって、ビジネスのスピードを上げることが出来る。
かわりにその瞬間は売上０。人を雇ってコストも掛かり、システムもまだ出来ていないため動かないのでお金ばかり出る。赤字である。ただ、最初に投資したお金を使うことで、最速でシステムが完成し、ビジネスが立ち上がり収益が出たときに、投資にかかったお金を返済する。
もちろん、自分の空いた時間だけでコツコツ１人でシステムを作れば赤字は０に出来る。
しかし、システムはいつ完成するか分からず、売上も上がらない。
ビジネスは負債を抱えても、スピードを重視しなければならないときがあるものです。

技術的負債も開発スピードを優先する瞬間には許容し、
ビジネスが立ち上がり、プロダクトが価値を提供できるようになったときに
初めてその返済するタイミングを考えることが出来る。

エンジニアは決済者に技術的返済のお願いをすることになるだろうが、
そのプロダクトがちゃんと価値を提供できる状態になったのか？軌道に乗ったのか？
を見極めて、そのタイミングでお願いをしなければ負債返済は了承されることはない。

# プロダクトに価値を与えることこそがメインであり、手法として技術がある

残念ながら、そもそも売れないものすごくキレイなコードを書いても全く意味はないのだ。
エンジニアとして売れるか売れないかは理解しようもないが(企画をする人も世に出ない限り売れるかはわからないだろうが) プロダクトの価値を生む方法として技術があることに変わりはしない。


# 技術的負債の発生量を把握する

まず、メンバーの力量を知ること。
技術的負債をコントロールする人はコードを書く全員分のコードレビューを１度はした方が良い。
出来る限りメンバの力量を知る方が良い。

なぜなら、上手く書けない、設計できないメンバはコードを書くだけで負債を生み出してしまうからだ。
そのようなメンバはベテランのメンバとコンビを組むようにしたり、
１度しか使われないようなプログラムを多く任せて力を付けてもらう。

# 負債状況のシェア
KPTや愚痴大会でも良いので、どこに不満があるか、どのように改善したいか、なにか新しい良いものがあるかなど
負債状況を素直に話せる環境を作りましょう。
毎日のレビューだけでは出てこず、把握できないものが出てくるはずです。

タイミングについてはビジネスとのサイクルを合わせることが重要ですが、
負債の最新状況の把握は常にやらなければなりません。

# 必要なのは短期、中期、長期の負債戦略
もはや、お金の投資のタイミングの話と同じような事になります。
短期的に開発スピードを優先するケースと負債を抑えることを優先するケースを判断する
中期に開発スピードを落とす可能性のある負債を解消する。ルール定義を行うことやレビュー感覚を共有しノウハウをシェアして一定水準の品質を保てる仕組みやシェアの仕組みをつくる
長期に上手くコードが書けないメンバなどの引き上げや採用計画、チーム編成などを検討し安定した負債コントロール状態に出来る体制づくりをする

# 決済者との対話

中期的な負債解消の際には決済者と対話し時間を貰うことになるが、エンジニアには説明責任があると思う。
これを行わないと今は動いているが、中長期でどのようなことになるかをしっかり説明する。

- 開発スピードが下がり、新規機能の開発スケジュールが常に長くなる
- バグを誘発させ、障害になるケースが増える
- セキュリティ問題が発生し、情報漏えいなどの可能性がある
- システム許容サイズを超え、ビジネスをスケールさせることが出来ない
- 普通にツライので辞めるエンジニアが出る(たいてい優秀な人から辞める)

などなど

# 技術的負債とお金の負債の違う部分

技術的負債は生み出したメンバであってもプロジェクトを移ることで
別の人に丸ごと返済を追わせることが出来る、最悪のことが可能な恐ろしいものなのだ！

自分で生み出した負債でない対応に苦しめられるメンバは理不尽さを感じたり、自由に開発が出来ない不自由さから辞めてしまうこともある。
メンバ状況からプロジェクトで請け負える負債量を把握しながら返済したり借金したりしなければ、チームが破錠の道へ進むのはお金の場合と変わらない。


# 最後に

負債をひたすら嫌悪するだけではなく仲良く過ごす方法を考えましょう！

お借入は計画的に！
iso8601をDateオブジェクトに変換する

~~JavaScriptはiso8601形式の日時表記をパースできません。~~

**現在はできます。**gaogao_9さんのコメントを参照ください。
つまりDateにiso8601を投げるだけで良かったようです。とほほ。

CMSのAPIとかで結構使われているので地味に困る。

変換ライブラリがすでにありますが、別ファイルを読み込むまでもないし、時差も考慮しないのでざっと書きました。

```javascript:iso8601date.js
var iso8601Date = function(iso) {
    var parse = iso.match(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\+\d{2}:\d{2}/);
    return new Date( Number(parse[1]), Number(parse[2]), Number(parse[3]), Number(parse[4]), Number(parse[5]), Number(parse[6]) );
};

...

var pubdate = iso8601Date( '2016-10-12T17:47:15+09:00' );

console.log(pubdate[1]); //2016

```

## 正規表現での抽出

matchで正規表現を書く際に、条件内を括弧で囲んでいる箇所は配列として抽出できます。
これを覚えると地味に捗ります。

正規表現チェッカーをよく利用させてもらってます。
http://okumocchi.jp/php/re.php
AndroidのNotificationでカスタムViewの高さを広げる


# Notificationの高さを64dpよりも高く広げる

AndroidのNotificationにおいて、通常のスタイルでは表現できない通知を行いたい場合、
RemoteViewsをつかってカスタムビューを作成します。

ただ、RemoteViewsにどんなものも使えるかというとそうではなく、
通常では高さが64dpまでという制限が自動的にかかります。

## JellyBean以降の拡張

しかし、API16のJELLY_BEAN以降は以下のようなコードを書くことで、
高さ64dpの制限を256dpまで拡張することができます。

Androidの公式ドキュメントにもこの高さを広げられる仕様について説明されているのですが、
『標準ビューレイアウトでは64dpまでで、拡張ビューレイアウトでは256dpまでです。』とあるだけです。
https://developer.android.com/guide/topics/ui/notifiers/notifications.html?hl=ja#CustomNotification

具体的にどうすればいいのかの説明が見当たらなかったのでまとめておきます。
やることは結構単純で、build済みの `notification` に対して、
`notification.bigContentView = custonView` してください。

## 修正前

builder.setContentで作成したRemoteViewsをセットしてあげればいいのかと思っていました。
しかし、setContentは、閉じた時、つまり高さ64dpの時のViewをセットする役割なので、高さは64dpのままでした。

![before.jpg](https://qiita-image-store.s3.amazonaws.com/0/75564/0104910e-69b6-9a2e-58e3-d862ceec109a.jpeg "before.jpg")


### 修正前のコード

```java
NotificationCompat.Builder builder = new NotificationCompat.Builder(context.getApplicationContext());
builder.setSmallIcon(R.drawable.notification_icon);

RemoteViews customView = new RemoteViews(context.getPackageName(), R.layout.notification_layout);
customView.setTextViewText(R.id.customTitleTextView, "タイトル");
customView.setTextViewText(R.id.customDescTextView, "本文-カスタム通知レイアウトで使用できる高さは、通知ビューによって異なります。標準ビューレイアウトでは64dpまでで、拡張ビューレイアウトでは256dpまでです。AndroidのNotificationを使う際、通常のスタイルでは表現できない通知を行いたい場合、RemoteViewsをつかってカスタムビューを作成します。");
customView.setImageViewBitmap(R.id.customImageView, bitmap);
builder.setContent(customView);

Notification notification = builder.build();
NotificationManagerCompat manager = NotificationManagerCompat.from(context.getApplicationContext());

manager.notify(123, notification);
```

## 修正後

`notification.bigContentView = custonView` とAPIバージョンでの分岐を追加します。
高さが十分に広がり、出したい情報が出せるようになりました。

![after.jpg](https://qiita-image-store.s3.amazonaws.com/0/75564/45464366-9927-3936-eb98-acf84eb352fa.jpeg "after.jpg")


### 修正後のコード

```java
NotificationCompat.Builder builder = new NotificationCompat.Builder(context.getApplicationContext());
builder.setSmallIcon(R.drawable.notification_icon);

RemoteViews customView = new RemoteViews(context.getPackageName(), R.layout.notification_layout);
customView.setTextViewText(R.id.customTitleTextView, "タイトル");
customView.setTextViewText(R.id.customDescTextView, "本文-カスタム通知レイアウトで使用できる高さは、通知ビューによって異なります。標準ビューレイアウトでは64dpまでで、拡張ビューレイアウトでは256dpまでです。AndroidのNotificationを使う際、通常のスタイルでは表現できない通知を行いたい場合、RemoteViewsをつかってカスタムビューを作成します。");
customView.setImageViewBitmap(R.id.customImageView, bitmap);
builder.setContent(customView);

Notification notification = builder.build();
// ここを追加
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    notification.bigContentView = customView;
}
NotificationManagerCompat manager = NotificationManagerCompat.from(context.getApplicationContext());

manager.notify(123, notification);
```

## 参考

[Android Remoteviews for expanded notifications](http://stackoverflow.com/questions/21172118/android-remoteviews-for-expanded-notifications)
【find・grep】特定の文字列を含むファイルのリストを取得する方法。

「○○」という文字列を含むファイルをリスト化したい時は、以下のコマンドで。
毎回ぐぐってるので、いいかげんメモ。

#### ■ファイル名に「○○」という文字列が含まれているファイルのリストを取得。
```txt:指定フォルダ直下のみ
ls [検索対象フォルダのパス] | grep "[検索したい文字列]"
```

```txt:指定フォルダ配下を再帰検索
find [検索対象フォルダのパス] -type f -name "*[検索したい文字列]*"
```

#### ■ファイルを開いた中身に、「○○」という文字列が含まれているファイルのリスト。
```txt:指定フォルダ配下を再帰検索
grep [検索したい文字列] -rl [検索対象フォルダのパス]
```
※いままで↓を使っていましたが、コメントで上記grepコマンドを使う方法を教えていただきました。（こっちの方が簡単！）

```txt:指定フォルダ配下を再帰検索
find [検索対象フォルダのパス] -type f -print | xargs grep '[検索したい文字列]'
```
ReactでMaterialでwebpackなボイラープレート

ReactでMaterialなダッシュボードのベースアプリとなるboilerplateです。

![qiita_rancher_20.PNG](https://qiita-image-store.s3.amazonaws.com/0/143640/b3d455a3-42b8-98d4-cb2b-ff770b65dd6f.png)


* ReactJS
* MaterialUI
* karma
* webpack

これを起点にSPAを作るのに適しています。

[Lambda-CDM/react-material-dashboard](https://github.com/Lambda-CDM/react-material-dashboard)

github のReadmeそのままですので、あしからず

## インストール

    $ git clone https://github.com/lambda-cdm/react-material-dashboard.git

    $ cd react-material-dashboard
    $ npm install

## 起動（Devモード)

    $ npm start

## 本番ビルド
    $ npm run dist

## Karmaテスト
    $ npm test

# あわせて読みたい

[webpack+React+material-uiの環境を最小手順で作成](http://qiita.com/takaki@github/items/724d97a20d3ae194ded4)
Supervisorで常駐化している任意のプロセスをMackerelでモニターする

## はじめに
supervisorを運用していて、まれにプロセスが落ちているときはないでしょうか？
Mackerelエージェントに、監視結果を出力するコマンドを登録することで、任意の常駐化プロセスをモニターしてみます。

### 環境
尚、動作環境はEC2上に構築してみました。

- OS: Amazon Linux 2016.03


## supervisord自体のモニターは公式プラグインでする
公式チェックプラグインを使うとsupervisord自体の死活監視は簡単に行うことができます。

### プラグインのインストール
```bash
$ yum install mackerel-check-plugins
```

### 設定
Mackerelの設定ファイル（`/etc/mackerel-agent/mackerel-agent.conf`）に、下記のように設定を追加します。

```/etc/mackerel-agent/mackerel-agent.conf
[plugin.checks.supervisord]
command = "check-procs -p supervisord"
```

### 参考URL
- [チェック監視に公式チェックプラグイン集を使う - Mackerel ヘルプ](https://mackerel.io/ja/docs/entry/howto/mackerel-check-plugins)


## supervisorctl statusコマンドを使ってモニターする
`supervisorctl status {program name}`コマンドを使って、任意のプロセスの状態をモニターします。

### スクリプトの作成
pythonで簡単なスクリプトを作成してみます。
やっていることは単純です。

- `supervisorctl status`で出力される文字を分解
- 配列の2番目に状態を表す文字が入っているので、その状態によって、exitコードを切り分ける
- exitコードは、それぞれ、0: OK, 1: WARNING, 2: CRITICAL, 左記以外: UNKNOWN の意味になる 
- 標準出力に情報を出力しておくと、Mackerelに送信されるので便利

```check_supervisor_example_program.py
import sys
import commands

def main():
    output = commands.getoutput('supervisorctl status example_program')
    print(output)
    parts = output.split()
    print(parts[0])
    print(parts[1])
    if (parts[0] == 'example_program'):
        if (parts[1] in ['RUNNING']):
            sys.exit(0)
        if (parts[1] in ['STARTING','BACKOFF']):
            sys.exit(1)
        if (parts[1] in ['STOPPED','STOPPING','EXITED','FATAL']):
            sys.exit(2)

    sys.exit(9)


if __name__ == '__main__':
    main()
```

### 実行結果
```bash
$ sudo python ./check_supervisor_example_program.py 
example_program                  RUNNING   pid 25436, uptime 0:35:27
example_program
RUNNING
```

### 設定
`check-procs`のときと同様に、設定ファイルに下記の設定を追加する。

```/etc/mackerel-agent/mackerel-agent.conf
[plugin.checks.supervisord_example_program]
command = "python /path/to/check_supervisor_example_program.py"
```

### 参考URL
- [チェック監視項目を追加する - Mackerel ヘルプ](https://mackerel.io/ja/docs/entry/custom-checks)


## モニター結果

### example_programが`STOPPED`の場合

![supervisord_monitor_program.png](https://qiita-image-store.s3.amazonaws.com/0/26422/f3abddf1-442d-b1b6-81c2-fc2ebf41e1b9.png "supervisord_monitor_program.png")

![supervisord_alert_edited.png](https://qiita-image-store.s3.amazonaws.com/0/26422/69693e14-db3f-d927-6cc1-88b7848f86c1.png "supervisord_alert_edited.png")

### supervisordが停止している場合

![supervisord_monitor_service.png](https://qiita-image-store.s3.amazonaws.com/0/26422/e3fdf3fa-9a28-0e9d-ceb1-99e49c121096.png "supervisord_monitor_service.png")

![supervisord_alert_service_edited.png](https://qiita-image-store.s3.amazonaws.com/0/26422/5f7e1b6a-9b7c-ed55-dd01-f5773ca2d9e6.png "supervisord_alert_service_edited.png")


## おわりに
あまり需要がないかもしれませんが、supervisorに限らず、監視したい項目を簡単なスクリプトでモニターできますので、トライしてみると良いかと。
aws kinesis firehoseとaws lambdaを試す

aws kinesis firehoseとaws lambdaを試した

参考URL
[Amazon Kinesis エージェントを使用して Amazon Kinesis Streams への書き込み](http://docs.aws.amazon.com/ja_jp/streams/latest/dev/writing-with-agents.html#config-start)

s3までデータが上がることを確認
![スクリーンショット 2016-10-12 午後0.06.47.png](https://qiita-image-store.s3.amazonaws.com/0/130570/d6ed9398-3664-4340-cc3d-a7b0dd416f54.png)

[Kinesis Streamと別リージョンのFirehoseをLambdaで連携させてみた](
http://dev.classmethod.jp/cloud/aws/kinesis-stream-to-firehose/)

ブラウザからkinesis→lambda→firehose→s3にデータ設置が確認出来た。
途中、kinesis→lambda間のregionを間違えて嵌った。

![スクリーンショット 2016-10-12 午後5.42.27.png](https://qiita-image-store.s3.amazonaws.com/0/130570/57caa9b9-b8d0-13ea-f40a-11591c5b2ee6.png)
![スクリーンショット 2016-10-12 午後5.43.19.png](https://qiita-image-store.s3.amazonaws.com/0/130570/c813a45f-372d-2a9d-cf97-f7bff6a35b0a.png)
Homebrewで入るPython2.7.12でモジュールをimportしてコケることに対応したメモ

検索してもなかなかたどり着けなかったのでメモ

下記の記事を参考に、Macでpythonを設定
[[Qiita] MacでPython使う時の最低限のメモ（Homebrew編）](http://qiita.com/zaburo/items/fbdaf6c04151671407db)

下記の記事と同じようなエラーが出ました
[[Qiita]Homebrewで入るPython2.7.11でDjangoのrunserverがコケることに対応したメモ](http://qiita.com/zaburo/items/802423b0d2d63b0cb456)
※私の場合は、バージョン2.7.12で、Djangoではなく適当なモジュールをimportして実行したら出ました

```
ImportError: dlopen(/usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so, 2): Symbol not found: __PyCodecInfo_GetIncrementalDecoder
  Referenced from: /usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
  Expected in: flat namespace
 in /usr/local/Cellar/python/2.7.12_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload/_io.so
```

下記のコマンドで解決しました

```
$ hash -r python
```

hashテーブルの再構築が必要らしい
もしくはターミナルの再起動でも解決するっぽい

参考：http://stackoverflow.com/questions/34386527/symbol-not-found-pycodecinfo-getincrementaldecoder
gnomeでF10を押したときにメニューが開くのを抑制する


※CentOS7環境で確認してます。

code::blocksでF10にデバッグのステップ実行を割り当てて
Debug時に押したらなぜかメニューバーが開いてしまう。
調べてみるとどうもgnomeの設定でF10を押すとメニューが開くらしい。
設定エディタ(gconf-editor)の

    /desktop/gnome/interface/menubar_accel

を空にすると良いと書いてあるのを見かけるがこちらの環境だと見当たらない。
のでどうしようかと思ったらgsettingでできるというのを見かけたのでやってみた。

    gsettings set org.gnome.desktop.interface menubar-accel ''  
    
これでcode::blocksでF10を押してもメニューが出なくなった。
shellはF10でメニューがでるけどひとまずこれで良しとする。
List<Map<T1, T2>> を Map<T1, List<T2>> へ変換 (Stream API)

ほぼ自分のメモ

## 概要
MyBatisとかでselectした時にresultTypeをMapにして結果が複数だとList\<Map>の形式に戻ってくる。
ここから特定カラムの値リストだけ取りたいとか、そういう要望があって
うまい具合にListにネストされたMapを出して、Map\<key, List\<value>> 形式にしたい。

## ソース

わりとgenericsで悩まされる

```java

public class Main {
    public static void main(String[] args) {

        List<Map<String, String>> list = new ArrayList<>();
        list.add(new HashMap<String, String>() {{
            put("a1", "test1");
            put("a2", "test2");
            put("b1", "testb1");
            put("b2", "testb2");
        }});
        list.add(new HashMap<String, String>() {{
            put("a1", "test3");
            put("a2", "test4");
            put("b1", "testb4");
            put("b2", "testb3");
        }});
        list.add(new HashMap<String, String>() {{
            put("a1", "test5");
            put("a2", "test6");
            put("b1", "testb8");
            put("b2", "testb9");
        }});

        Map<String, List<String>> map = list.stream()
                .flatMap(e -> e.entrySet().stream())
                .collect(Collectors.groupingBy(
                        Map.Entry::getKey,
                        Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

        List<String> a1list = map.get("a1");
        System.out.println(a1list.toString());

    }
}


```

説明は省略
BluemixでBowerを使う（非推奨）

**追記1**
Bowerは、deprecatedとなっています。
この記事は、以降の参考のために残しますが、新規の開発はWebpack等を使いましょうね。

> deprecated bower@1.8.0: ..psst! While Bower is maintained, we recommend Yarn and Webpack for *new* front-end projects! Yarn's advantage is security and reliability, and Webpack's is support for both CommonJS and AMD projects. Currently there's no migration path but we hope you'll help us figure out one.

**追記2**
Bluemix DevOps Service (hub.jazz.net) のサービスは、停止になりました。今後は Continuous Deployment を使うことになります。ですので、下記の手順は、そのままでは使えません。
一方、ツールチェーン作成時に導入されるサンプルコードにはBowerがすでに組み込まれております。

# 記事本文

Bluemixのcfインスタンスとしてnode.js, express環境を作成しMEANスタックでの開発を行うのは、一般的な開発手順ですみます。一方でフロントエンドのレポジトリであるbowerも、MEAN環境での一般的なツールでありますが、日本語でまとめられた設定手順がweb上にありません。ここに手順メモをシェアいたします。
##前提
* BluemixのCloud Foundry ランタイム・インスタンスとしてnode.js環境を構築していること。
* Bluemix DevOps servicesのGitレポジトリ機能を使用し、ローカルで開発・git pushでアップロードする運用をしていること
* ここでは git clone で作成したローカルのプロジェクト・フォルダをdev/とします

## git clone で生成したローカルのプロジェクトフォルダに移動する。
```
> cd dev/
```

## プロジェクトに、bowerを組み込む
```
> npm install --save bower
```
プロジェクトのpackage.json における dependencies にbowerが追加されます

## プロジェクトにおけるbowerの初期化を行う
```
> bower init
```
ここでは、この選択肢はYesで返答します。
```
? would you like to mark this package as private which prevents it from being ac
cidentally published to the registry? Yes
```
上記以外は全てデフォルトでOK。

プロジェクトフォルダのルートにてbower.jsonが作成される。

## bowerを使ったinstallを実施する。
この例では bootstrap をインストールしている

```
> bower install bootstrap --save
```

bower.json の dependencies に bootstrapが追加される。

またプロジェクト内にbower_componentsフォルダが作成され
その中に bootstrap フォルダ, jqueryフォルダが作成され、ファイルが保存されている

## gitにフォルダを無視させる設定 .gitignore ファイルを作成する。

プロジェクトフォルダのルート (dev/) にて .gitignore ファイルを作成する。
これにより、gitは、bower関連の雑多なファイルを無視するため、
変更がcommitに反映されないし、Bluemixへgit pushする際に、雑多なファイルが送信されなくなる

.gitignore

```
/node_modules/
/bower_components/
```

参考: Windowsエクスプローラーでドットファイルを作成する
http://qiita.com/sgur/items/745e0ee02c69b50bf9e5

## package.json に bower install を自動実行させる設定を組み込む

プロジェクト・ルート・フォルダの package.json にて

```
  "scripts": {
    "start": "node app.js"
  },
```

　を、次のように設定追加

```
  "scripts": {
    "start": "node app.js",
    "postinstall": "bower install"
  },
```

## bowerで導入されるパッケージをpublicと同様に公開するための設定

/public と /bower_components が同じフォルダに存在する構成。

```
  / 
    |
    |- /bower_components
    |    |
    |    |- /bootstrap
    |    |- /jquery
    |
    |- /public
```

なので、次のように プロジェクトルートフォルダの app.jsに staticミドルウェア関数設定を追加する。

```
app.use(express.static(__dirname + '/public'));
```

上記の行のようにstaticミドルウェア関数を設定している行があれば、下記のように追加する。

```
app.use(express.static(__dirname + '/public'));
app.use(express.static(__dirname + '/bower_components'));
```

## 以上の設定で、git push すればOK

http://～～～.mybluemix.net/bootstrap/****.js でアクセスできるはずです。
Linuxのディレクトリについて

参考(めっちゃ参考になりました…)
http://raichel.hatenablog.com/entry/2015/07/22/000551

いろんなサイト調べたけど、CentOS7のroot構造はこのサイトが一番わかりやすかったです。

あと補足でこことかも参考にしました。
http://www.linuxmaster.jp/linux_skill/2010/02/06linux.html

# シンボリックリンクについて
調べてる途中に謎だったこと。

`bin->usr/bin`
`lib->usr/lib`
`lib64->usr/lib64`
`sbin->usr/sbin`
のシンボリックリンクが貼ってある。

なんだろ？？

http://www.wdic.org/w/TECH//bin
>古いUNIXでは/binのほかに/usr/binが別にあった。
>やがて、起動時に必要なファイル(rootfsにないと困るファイル)は/sbinに集約されたため/binの必要性は減り、後に/usr/binに統合され、/binは単なる/usr/binへのシンボリックリンクで済むようになった。

なるへそ～。
(古いヤツの通りbinを使うパスだったとしても、シンボリックリンク貼ってあるからあんまり気づかないのかも？)


# ほぼ確実に覚えた方がいいやつ(主観)
いろいろあって覚えられないけど、この辺りを覚えておけば設定ファイル探したりするのに困らないのかなあ。

## bin
一般ユーザが実行できるコマンド。
`ls`とかそういうの。


## etc
設定ファイルとかがある。
yumとかで入れるとここに設定ファイルが入る。

## mnt
VMWareとか使って共有するときとかによく使いました。
あと他、何かマウントするときとかに使う。

## run
pidとかがあったりする。

## opt
ソフトウェアパッケージとかが入る。

## usr
各種プログラムやライブラリ、ドキュメントがある。
ソースコンパイルすると`/usr/local`に入る。

## var
ログとか。ファイルとか。


# yumのインストール先
http://okwave.jp/qa/q8029047.html

コマンド類：`/bin`とか`/usr/bin`とか`/sbin`とか
設定：`/etc`
ライブラリ：`/lib`、`/usr/lib`とか

に入れてくれるらしい。
つまりLinuxに合わせるんだな……。
[Spigot-1.9.4] ConfigurationSerializableを使ったシリアライズメモ

##概要
ConfigurationSectionに対して、以下のような入出力が可能なクラスの作成を行います。

```java
void write(ConfigurationSection config, String tag, Data data) {
  config.set(tag, data);
}
```

```java
String read(ConfigurationSection config, String tag) throws Exception {
  Object raw = config.get(tag);

  if (raw instanceof Data)
    return ((Data) raw).getText();
  else
    throw new Exception();
}
```

##クラス作成
シリアライズ可能クラスの作成には、ConfigurationSerializableを利用します。

```java:Data.java
@SerializableAs("Data")
public class Data implements ConfigurationSerializable {

  public static final String TAG_TEXT = "text";

  private String text;

  public Data(String str) {
    this.text = str;
  }

  public Data(Map<String, Object> args) {
    if (args.containsKey(TAG_TEXT))
      this.text = args.get(TAG_TEXT).toString();
  }

  public String getText() {
    return this.text;
  }

  @Override
  public Map<String, Object> serialize() {
    Map<String, Object> result = new LinkedHashMap<String, Object>();

    result.put(TAG_TEXT, this.text);

    return result;
  }

}
```
※SerializableAsアノテーションは省略可能です。

最後に

```java
ConfigurationSerialization.registerClass(Data.class);
```
を利用して、作成したクラスをConfigurationSerializationクラスに登録します。
php-build/php-buildとかmadumlao/phpenvで、コンパイルするときに"-j4"オプションを付けて高速化する方法

[`make` するときに `-j4` オプションを付ける](https://linuxjm.osdn.jp/html/GNU_make/man1/make.1.html)ために、 `phpenv` する前に、 `export PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4` する。

## 実例
 `AMD A8-3870 APU` だけど、6分くらいで終わったみたい。CPU使用率は100%に張り付いてたし、ちゃんと4コア使えてるみたいだった。  
 1コアの場合の時間を計測していないので、比較対象がない。

```sh:こんな感じになった
[ndxbn@sandbox:~]phpenv versions
[ndxbn@sandbox:~]export PHP_BUILD_EXTRA_MAKE_ARGUMENTS=-j4
[ndxbn@sandbox:~]echo $PHP_BUILD_EXTRA_MAKE_ARGUMENTS # 確認用
-j4
[ndxbn@dev1:~]time phpenv install 7.0.11
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 7.0.11 into /home/suzuki_k/.anyenv/envs/phpenv/versions/7.0.11
[Skipping]: Already downloaded and extracted https://secure.php.net/distributions/php-7.0.11.tar.bz2
[Preparing]: /tmp/php-build/source/7.0.11
[Compiling]: /tmp/php-build/source/7.0.11
[xdebug]: Installing version 2.4.1
[xdebug]: Compiling xdebug in /tmp/php-build/source/xdebug-2.4.1
[xdebug]: Installing xdebug configuration in /home/suzuki_k/.anyenv/envs/phpenv/versions/7.0.11/etc/conf.d/xdebug.ini
[xdebug]: Cleaning up.
[Info]: Enabling Opcache...
[Info]: Done
[Info]: The Log File is not empty, but the Build did not fail. Maybe just warnings got logged. You can review the log in /tmp/php-build.7.0.11.20161012163940.log
[Success]: Built 7.0.11 successfully.

real    6m23.305s
user    12m54.380s
sys     3m10.226s
```
【AWS SDK for PHP】ListObjects関数で、S3から1000件超えのリストを取得する方法。

#### 概要
「AWS SDK for PHP」のListObjects関数は、
普通に使うと1000件までしかリストしてくれない仕様になっているが、
1000件超えでも取得できる方法は用意されているため、関数化してみました。

#### ポイント
1. ListObjects実行時に、1000件超えしていた場合、$objects["IsTruncated"]にTRUEがセットされて返ってくる。
2. ListObjects実行時、Marker引数にファイルのS3キーを指定すると、指定したファイルの次のファイルから1000件リストしてくれる。
3. $objects["IsTruncated"]===TRUE の場合、取得したリストの一番末尾のファイルをMarker引数に指定して再度ListObjects関数を実行する。
4. 3を $objects["IsTruncated"]===FALSE になるまで繰り返す。


#### ソース
```php:
<?php

require '/opt/aws-sdk/vendor/autoload.php';
use Aws\S3\S3Client;

$S3 = S3Client::factory();
$S3->registerStreamWrapper();

// リストを取得して、表示
var_dump(ListAllObjects($S3, "bucket_name", "key/key2", $marker = null, $delimiter=null));

// 1000件超えでも、全てリストしてくれる関数。
function ListAllObjects($S3, $bucket, $bucketPrefix, $marker = null, $delimiter=null){
	$objects = $S3->ListObjects(array(
			'Bucket' => $bucket,
			'Prefix' => $bucketPrefix,
			'Marker' => $marker,
			'Delimiter' => $delimiter
	));

	$list = array();
	if(isset($objects["Contents"])){
		// 取得したファイルのリストを$list配列に追加していく。
		foreach ((array)$objects["Contents"] as $object) {
			// フォルダはスルー。ファイルのみ追加。
			if(substr($object['Key'],-1,1) != "/"){
				array_push($list, "s3://{$bucket}/{$object['Key']}");
			}
		}
		// リストの結果が1000件超えの場合、IsTruncated がTRUEで返ってくる。=> FALSEになるまで繰り返せば良い。
		if($objects["IsTruncated"] === TRUE){
			$key = ltrim($list[count($list)-1],"s3://{$bucket}/");	// S3キー部分を取り出すして、これをMarkerに指定する。
			$list = array_merge($list,ListAllObjects($S3, $bucket, $bucketPrefix, $key, $delimiter)); // 再帰処理
		}
	}

	return $list;
}
```
【Android】WebViewのinputなどからのキーボードの表示/非表示のイベントを取得する

# AndroidJavaでキーボードの表示/非表示を取得する

取得するAPIは用意されてないので自前で実装せざるを得ないが、そんな面倒でもない。


## もくじ

1. LinearLayoutを拡張させてキーボードのListenerを実装する
2. キーボードの表示/非表示判定について
3. Activityで通知を受け取る

※適度に省略する。


## LinearLayoutを拡張させてキーボードのListenerを実装する

`LinearLayoutWithSoftwareKayboardListener`クラスとしたがここはテキトーに。

```java:LinearLayoutWithSoftwareKeyboardListener.java
/**
 * ここらへんの pckage とか import とかはテキトーに。
 */

public class LinearLayoutWithSoftwareKayboardListener extends LinearLayout
{

  // Context 持ちのコンストラクタしか書かないがここはテキトーに
  public LinearLayoutWithSoftwareKayboardListener(Context context)
  {
    super(context);
  }


  public interface SoftwareKeyboardListener
  {
    /**
     * キーボードが表示されたときに呼ばれる。
     * @param height キーボードの高さ[px]
     */
    public void onShow(int height);

    /**
     * キーボードが表示になったときに呼ばれる。
     */
    public void onHide();
  }


  private SoftwareKeyboardListener _listener;
  private boolean                  _preStatus = false;


  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
  {
    if (this._listener == null) {
      super.onMeasure(widthMeasureSpec, heightMeasureSpec);
      return;
    }

    Activity activity = (Activity)this.getContext();

    Rect rect = new Rect();
    activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

    /**
     * rectのメンバはそれぞれ次を表す。
     * - rect.top    ステータスバーの高さ[px]
     * - rect.bottom 画面の高さから、ステータスバーとキーボード分を引いた残り[px]
     */

    int keyboardHeight = MeasureSpec.getSize(heightMeasureSpec) - (rect.top + rect.bottom);

    // 若干の誤差があるっぽい。この時点で`keyboardHeight > 10`であればキーボード表示と見なす。
    if (keyboardHeight > 10 && !this._preStatus)
      this._listener.onShow(keyboardHeight);
    else if (keyboardHeight <= 10 && this._preStatus)
      this._listener.onHide();

    this.preStatus = (keyboardHeight > 10);
  }

}
 
```


## キーボードの表示/非表示判定について

コメントでだいたい説明したので、ざっくり。

画面サイズの縦幅と実際にコンテンツが描画されている縦幅とを比較して判定している。
`画面縦幅 - (スタータスバー縦幅 + 描画縦幅) = 「何か」が表示されている縦幅`となり、これが`10[px]`より大きければその「何か」はキーボードだという判定である。

さらに、手前の状態(`_preStatus`)を持っておき、表示状態→表示状態、非表示状態→非表示状態をはじくようにしている。


## Activityで通知を受け取る

キーボードのイベントを受け取りたいアクティビティで

```java:FooActivity.java

public class FooActivity {

  // :

  /* private */ LinearLayoutWithSoftwareKeyboardListener. SoftwareKeyboardListener _listener = new LinearLayoutWithSoftwareKeyboardListener. SoftwareKeyboardListener()
  {
    @Override
    public void onShow(int height)
    {
      /**
       * キーボードが表示されたらここが実行される。
       * `height`はキーボードの高さ[px]
       */
    }

    @Override
    public voif onHide()
    {
      /**
       * キーボードが非表示になったらここが実行される。
       */
    }
  };
      
  // :

  /**
   * 普段LinearLayoutを使うところをLinearLayoutWithSoftwareKeyboardListenerを使って、
   * `layout.setListener(this._listener);`でセットしておく。
   */

}

```

こんな感じ。
社内でSlackを使いたいけど情シスに怒られるので、社内ネットワークで動くWEBチャットアプリ「Rocket.Chat」をコマンド2行でインストールする 

# 社内でSlackを使いたいけど情シスに怒られるので、社内ネットワークで動くWEBチャットアプリ「Rocket.Chat」をコマンド2行でインストールする

## 概要
* タイトルが長くなってしまいました。
* Slackって便利ですけどどこからでもアクセスできるので、セキュリティホールになりかねませんよね。
* ちなみにコマンド2行と書きましたが、実際に1から導入するとなるとコマンド叩くまでの道のりが結構長かったりします。よくある詐欺です。

## Rocket.Chatについて
<a href="http://i.imgur.com/7w4hTrs.png">
	<img src="http://i.imgur.com/7w4hTrs.png" width="400">
</a>
<a href="http://i.imgur.com/rTBRxVo.png">
	<img src="http://i.imgur.com/rTBRxVo.png" width="400">
</a>

* デモ https://demo.rocket.chat
* SlackをパクったWebで動くチャットアプリです
* スクショの通り、BOTでgithubやgitlab等のプルリクエストや、RedmineやJenkinsの通知もできるみたいです（やり方は知らない）


## つかうもの
* CentOS7.2
* Docker
* mongoDB（データベース）

## 他に似たようなチャットWEBアプリ
* http://qiita.com/yasuhiroki/items/0e06ccda1c53f616d74d の記事で紹介されています。
* この頃のRocket.Chat人気は普通でしたが今はRocket.Chatのスター数が他を圧倒している状況です。
* Let's chatも使ってみましたが、1年ほど前に使ったときは微妙でした。機能も少ないし、インストール方法が悪かったのか一定数ログが溜まるとデッドロックする致命的なバグに遭いました。。。

## インストールの大きな流れ
* CentOS上にDockerをインストールして、その上にmongoDB（データベース）とRocket.Chatを置きます  
(Dockerって流行ってますけど正直僕はあまり詳しくないです)

## 導入手順
* コマンド2行だけ解説してもつまらないので、OSのインストールから軽くですが説明します。

1. とりあえずVirtualBox上にブリッジネットワークでcentOS7を入れる  
1. SSHで接続後、SELinuxとFireWallを切る（参照: http://qiita.com/fetaro/items/8cf5169dc4d8a7ac9af6）
1. dockerのインストール、サービス起動、サービス自動起動有効化
  
    ```bash
    yum install -y docker
    systemctl start docker
    systemctl enable docker
    ```
1. dockerにmongoDB、rocketChatを入れて起動（参考:https://github.com/docker-library/docs/tree/master/rocket.chat#how-to-use-this-image ）
  
     ```bash
     # mongodb3.0のイメージファイルpullしてきてdbという名前でdockerイメージ起動（--smallfilesはmongodbの設定）
     docker run --name db -d mongo:3.0 --smallfiles
     # rocket.chatのイメージファイルpullしてきてrocketchatという名前でdockerイメージ起動
     # docker側の3000番ポートとホストOSの80番ポートをマッピングする
     # mongodbを使用するので先ほど作った dbという名前のコンテナとリンクする
     docker run --name rocketchat -p 80:3000 --env ROOT_URL=http://192.168.1.8（ホスト名） --link db -d rocket.chat
     ```
1. アクセスすると起動します（2行で済むといったのはこの直前のコマンドのみです。）
    * たしか最初にログインしたユーザーがスーパーユーザーになったと思います。  
		<a href="http://i.imgur.com/WsQrOKo.png">
	<img src="http://i.imgur.com/WsQrOKo.png" width="200">
	</a>

## どうでもいいこと
* 言語はNode.jsでMeteorというwebsocketを使うフレームワークで書かれているようです。
* 絵文字は「[emojione](http://emojione.com/)」というライブラリを使っています。qiitaの絵文字よりフラットで好きです。
![alt](http://i.imgur.com/laI9xZe.png)
* 画面表示メッセージには、多分「[toatr](https://github.com/CodeSeven/toastr)」というライブラリを使っています。これも好きです＆よく見ます。
![alt](http://i.imgur.com/zhj9tJz.png)

## 最後に
* rocket.chatを導入すれば社内でしかアクセスできないので、slackみたいにプライベートの時間中に呼び出されることもないですね。
* こんな記事書きましたが、実際にrocket.chatを社内で使ったことはないです。
* 長期運用もしたことないので運用関係のアレコレもなんも分からないです。
* dockerって便利らしいですけど、学ぶのめんどくさいですよね。
rake db:migrate した時に発行される SQL を調べる方法

# 概要

migration した際の SQL が知りたくなったので

```
rake db:migrate
```

した際に発行される SQL を標準出力に出力させます。

# やり方

[Is it possible to output the SQL change scripts that 'rake db:migrate' produces?](http://stackoverflow.com/questions/4100512/is-it-possible-to-output-the-sql-change-scripts-that-rake-dbmigrate-produces)
調べたら stack overflow で解決してくれてる人がいた。

log を出力させる task を作って

```rb
task log: :environment do
  ActiveRecord::Base.logger = Logger.new(STDOUT)
end
```

追加した task を付与して実行！

```
rake log db:migrate
```

これで DEBUG ログも出力されて、発行される SQL が見れます。簡単。

ちなみに

```rb
ActiveRecord::Base.logger = Logger.new(STDOUT)
```

は、debug ログなどが出力されない本番環境などで、「あれ？このコードどんな SQL が発行されるんだ？」って思ったときに、さくっとコンソールで調べられるので知っておくとちょっと便利です。
Python-matplotlibでグラフ上のプロットの座標を読み取る（超初級）


## はじめに
前回は「画像の座標を読み取る」ところまでのプログラムを紹介しましたが，今回は，そのプログラムをもとに，グラフ上の数値を読み取る（画像の座標からグラフ上の数値に変換する）ところをやってみました．

座標軸の入力精度が低く，大体の値しかでず，実務に使える代物ではありませんが，一応「こういうことをしたい」ということがイメージできる代物になったというところでしょうか．

課題としては，上述の通り，グラフの座標軸の入力精度を高めること，更に点のクリック時の精度を高めることだと思います．
ここから先はかなり難しそうです．



## グラフ上の値への変換式

$$
x=x_{min}+(x_{max}-x_{min})\cdot \cfrac{k_{xx}-k_{xi}}{k_{xf}-k_{xi}}
$$
$$
y=y_{min}-(y_{max}-y_{min})\cdot \cfrac{k_{yy}-k_{yf}}{k_{yf}-k_{yi}}
$$

+ $x$, $y$ : グラフ上のプロットの$x$および$y$座標
+ $k_{xx}$, $k_{yy}$ : 画像領域のプロットの$x$および$y$座標
+ $x_{min}$, $x_{max}$ : グラフ上のx軸の最小・最大
+ $y_{min}$, $y_{max}$ : グラフ上のy軸の最小．最大
+ $k_{xi}$, $k_{yi}$ : 画像領域におけるグラフの左上隅の座標
+ $k_{xf}$, $k_{yf}$ : 画像領域におけるグラフの右下隅の座標



## プログラム
```python:py_img_test1.py
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import warnings;warnings.filterwarnings('ignore')

im=Image.open('fig_PSHQ1.png')
im_list=np.asarray(im)
plt.imshow(im_list)

#click left-top and right-bottom
nn=2
a=plt.ginput(n=nn)
xi=a[0][0]
yi=a[0][1]
xf=a[1][0]
yf=a[1][1]
del a

#click on the graph
nn=5
a=plt.ginput(n=nn)
b=np.array(a)
vec_x=b[:,0]
vec_y=b[:,1]
plt.plot( vec_x,vec_y, 'ro' )

# range of the graph
#(xmin,xmax)=(0,12000)
#(ymin,ymax)=(60,90)

xmin,xmax=map(float,input('xmin xmax= ').split())
ymin,ymax=map(float,input('ymin ymax= ').split())

# calculation of the values
xx=xmin+(xmax-xmin)*(vec_x-xi)/(xf-xi)
yy=ymin-(ymax-ymin)*(vec_y-yf)/(yf-yi)
for x,y in zip(xx,yy):
    print(x,y)

plt.savefig('fig_test.png', bbox_inches="tight", pad_inches=0.2)
plt.show()
```


## 使い方

1. プログラムをスタートすると画像が表示される
2. グラフの左上と右下をクリックする．
これにより $(k_{xi},k_{yi})$ および $(k_{xf},k_{yf})$ が入力・定義される
3. 任意の5点をクリック
4. コンソール上でx軸の最小と最大を聞いてくるので入力．これにより $x_{min}$，$x_{max}$ が入力・定義される．
5. コンソール上でy軸の最小と最大を聞いてくるので入力．これにより $y_{min}$，$y_{max}$ が入力・定義される．
6. クリックした5点のグラフ上の値が表示される
7. 表示を閉じて終了


## コンソールでの入出力

```
$ python3 py_img_test1.py
xmin xmax= 0 12000
ymin ymax= 60 90
-31.25 62.1212121212
1937.5 70.202020202
3968.75 74.0404040404
6000.0 77.1717171717
9968.75 82.2222222222
```

## 出力画像
![fig_test.png](https://qiita-image-store.s3.amazonaws.com/0/129300/6b770f27-e9d3-a11d-67bd-89b23edd47dd.png)



以　　上
Ftp から引っ張ってきたWordpressをローカル環境で動かす手順


## 下準備

wp コマンドがまだ入っていない場合は、wpコマンドをインストール
 
````
$ composer global require wp-cli/wp-cli
````

## 動かす

1. config.phpでデータベース設定を変更
2. ローカルのデータベースにデータベースを作成する。
3. `wp install` コマンドで、wordpressをインストール
4. プラグインを有効化する。

## データのインポート

インポートファイルを本番から引っ張ってきて、取り込む
pipのインストール方法

pip のインストール方法
=========================


事前準備
-------------------------
1. python がインストール済みであること



Windows環境手順
-------------------------
1. ダウンロード先：https://bootstrap.pypa.io/get-pip.py
よりget-pip.pyを任意のディレクトリに保存する
2. 保存したディレクトリで下記コマンドを実行する

```
python get-pip.py
```

Linux(CentOS)環境手順
-------------------------
1. pip をインストールする

```
curl -kL https://bootstrap.pypa.io/get-pip.py | python
```

インストールの確認(pip のバージョン確認)
-------------------------
1. 下記コマンドを実行する

```
pip -V
```

結果として、下記のようなpipのバージョンが表示されたらインストールが完了している

表示例：```pip 8.1.2 from /usr/local/lib/python2.7/site-packages (python2.7)```
unitypackageのインポート処理をカスタマイズする / unitypackageを解凍する

Unity には unitypackage という便利な機能があるが、下記の点において不満がある。

- 任意のパスへインポートできない
- 該当プロジェクトをエディタで開いていると、コマンドラインでインポートできない

そこで、unitypackage のインポート処理を独自で行うことで、これらの不満を解消してみる。
（以下の方法は Unity のバージョンアップにより利用できなくなる可能性がある。）

## コマンドラインでインポート

unitypackage は下記のようにコマンドラインでもインポート可能だが、複数の Unity プロセスが同一のプロジェクトへアクセス出来ないため、既に該当プロジェクトを Unity エディタで開いている場合エラーとなる。

```zsh
/Application/Unity/Unity.app/Contents/MacOS/Unity \
    -projectPath /path/to/unity/project \
    -importPackage customassets.unitypackage \
    -batchmode \
    -nographics \
    -logfile unitypackage.log \
    -quit
```

## unitypackage を解凍する

unitypackage は tar.gz 形式なので下記のように解凍できる。

```zsh
mkdir -p customassets
tar -zxpf customassets.unitypackage -C customassets
```

## unitypackage の構造を知る

解答した unitypackage は下記の様に、guid をディレクトリとして、アセット・メタファイル・パス名 が格納されている。

```
% tree customassets/
customassets/
├── 1b3a955b14cc44f0a85525b74c5cc194
│   ├── asset
│   ├── asset.meta
│   └── pathname
├── 4df8e2426febb471384bf16a4b17d070
│   ├── asset
│   ├── asset.meta
│   └── pathname
└── fe642c8c33bb64f4c88acc0a9c594584
    ├── asset
    ├── asset.meta
    └── pathname
```

## 個々のアセットを pathname を元にコピーする

unitypackage の構造がわかったので、pathname に格納されているパス名を元に asset, asset.meta をコピーします。
このパス名を修正することでインポート先を変更したり、インポートするアセットをフィルタリングすることが出来る。
また、Unity のコマンドを使わないので、プロジェクトをエディタで開いていても実行できる。

```zsh
rm -rf Assets/CustomAssets
for guid in `cd customassets && ls`; do
    path=`cat customassets/${guid}/pathname | sed -e 's/^Assets\/Plugins\//Assets\/CustomAssets\/Plugins\//`
    mkdir -p `dirname $path`
    cp customassets/${guid}/asset $path
    cp customassets/${guid}/asset.meta ${path}.meta
done
```
jQの結果をlessで見るときに色付きで見る方法

```
echo '{"foo":[{"bar":1}]}' | jq '.' -C | less -R
```

みたいな感じでやる。

```
$ man jq
--color-output / -C and --monochrome-output / -M:
    By default, jq outputs colored JSON if writing to a terminal. You can force it to produce color even if writing to a pipe or a file
    using -C, and disable color with -M.
```
 
的な感じで色付きでパイプさせて

```
$ man less
-R or --RAW-CONTROL-CHARS
    Like -r, but only ANSI "color" escape sequences are output in "raw" form.  Unlike -r, the screen appearance is  maintained  cor-
    rectly in most cases.  ANSI "color" escape sequences are sequences of the form:

        ESC [ ... m

    where the "..." is zero or more color specification characters For the purpose of keeping track of screen appearance, ANSI color
    escape sequences are assumed to not move the cursor.  You can make less think that characters other than "m" can end ANSI  color
    escape  sequences  by  setting  the environment variable LESSANSIENDCHARS to the list of characters which can end a color escape
    sequence.  And you can make less think that characters other than the standard ones may appear between the ESC and the m by set-
    ting the environment variable LESSANSIMIDCHARS to the list of characters which can appear.
```

的な感じで色付きで受け取る