OmniAICreator/Qiita-1.07M huggingface dataset:
AWKのこういう時はどう書く? 

linuxのコマンドラインでデータ加工をする際によく使うAWKですが、個人的につまずいた使い方について、
覚え書きとして残します。誰かの助けになれば…

- 組み込み関数覚え書き

```
 FS	       入力フィールドセパレータ(空白とタブ)
 CNVFMT	       数値を文字列に変換するフォーマット
 OFMT	       数字の出力フォーマット(%.6g)
 OFS	       出力フィールドセパレータ（空白） 
 ORS	       出力レコードセパレータ（\n）
 RS	       入力レコードセパレータ（\n） 
 SUBSEP	       配列添字セパレータ(\034)
 ARGC	       コマンド行の引数の数+1
 ARGV	       コマンド行の引数の配列 
 ENVIRON["..."] 環境変数の値 
 FILENAME       入力ファイル名 
 FNR	       入力ファイルの通算レコード 
 NF	       入力レコードのフィールド数 
 NR	       入力レコード総数
 RLENGTH       matchで適合した文字列の長さ 
 RSTART	       matchで適合した文字列の開始位置 
```

- セパレータを指定して処理したい

```
# -Fでセパレータを指定
awk -F ":" '{ print $1 " " $3 }' /etc/passwd

root 0
bin 1
daemon 2
adm 3
lp 4
sync 5
shutdown 6
halt 7
mail 8
uucp 10
operator 11

```

- 各フィールドをループしたい

```
awk '{for (i = 1; i <= NF; i++) print $i;}' data.txt
```

- 複数の記号をセパレータとして使用したい

```
#正規表現を使用するとできる
#以下はスペースと:と/を区切り文字として使用した場合の例

echo "2016/03/01 12:12:12" | awk -F'[ :/]' '{print $2}'
```

- 特定の正規表現のパターンにマッチする行だけ処理する

```
awk -F':' '$0 ~ /root/{ print}' /etc/passwd
```

- 文字列を数値に変換する

```
#特に何もする必要がない。数値を表した文字列は数値に自動的に変換される。
echo | awk '{ x="1.01"; x=x+1; print x}'
2.01
```

- 部分文字列を作成する

```
echo 'abcde' | awk '{print substr($0, 2)}'
```

- 特定の制御文字でフィールドを区切る

```
#下の例では^Aの部分が制御文字
#^Aの場合はCtrl+v Ctrl+Aでターミナル上から入力できる

more control_code.txt

a^Ab

awk -F'^A' '{print $1 ":" $2}' control_code.txt

a:b

#バイナリの値を以下のように指定する事もできる

awk -F'\01' '{print $1 ":" $2}' control_code.txt 

a:b
```

- csvのカラム数が8個の行だけ抽出

```awk:8get.awk
BEGIN {
while (getline < "/work/test.csv" > 0) {
    col = split($0,field,",")
    if ( col == 8  ) print $0
    }
    close("/work/test.out.csv");
}
```

実行

```
gawk -f /work/8get.awk
```

- ゼロパディング(ゼロ埋め)

```
echo "1" | awk '{printf "%02d", $1}'
> 01
```

- フォーマット変換

```
# xを○○に変換

printf("%d\n",x)               #整数として出力
printf("%5d\n",x)              #5桁で右詰の整数として出力
printf("%e\n",x)               #浮動小数点数(eの後の数字は10の累乗を表す)
printf("%7.2f\n",x)            #浮動小数点数、7桁で小数第2位まで
printf("%6.2f\n",x)            #浮動小数点数、6桁で小数第2位まで
printf("%5.2f\n",x)            #浮動小数点数、5桁で小数第2位まで
printf("%4.2f\n",x)            #浮動小数点数、4桁で小数第2位まで
printf("%o\n",x)               #8進数として出力
printf("%x\n",x)               #16進数として出力
printf("%c\n",x)               #文字コードして対応するアルファベットを出力
printf("%s\n",x)               #そのまま文字列として出力
printf("%10s\n",x)             #右詰で10桁のスペースに出力
printf("%-10s\n",x)            #左詰で10桁のスペースに出力
printf("%.3s\n",x)             #左詰で3文字のみ出力
printf("%10.3s\n",x)           #右詰で10桁のスペースに3文字を出力
printf("%-10.3s\n",x)          #左詰で10桁のスペースに3文字を出力

#ワンライナーで使う場合は以下のように置き換えればOK
echo 12345 | awk '{ printf("%-10.3s\n",$0) }'
```

#ちょっと穿った使い方
- ファイルを結合してみる(inner join風)


使うワンライナーはこんな感じ

```
awk 'F==0{a[$1]=$2;next}{print $1 "\t" a[$1] "\t" $2}' data1.tsv F=1 data2.tsv
```

data1.tsv と data2.tsvの1カラム目を比較して、おなじだったら、カラムを右に結合
例として、以下のような２つのtsvがあったとして、上記のコマンドを打つと、結果が以下のように出る
joinのほうが絶対簡単だと思うけれど、awkでやってみたいと思ったので、やってみた。

```data1.tsv
a 100
b 200
c 250
d 500
```


```data2.tsv
a red
d black
b blue
c green
b blue
d black
```

```shell:結果
a       100     red
d       500     black
b       200     blue
c       250     green
b       200     blue
d       500     black
```
Homebrewを久々にupdateしたら出来なかった時の対処法

久しぶりにHomebrewをupdateしたら以下のようなエラーがでて失敗し、全てのbrewコマンドが使えなくなった時の対処法です。原因は特定してないけど、おそらくOSをEl Capitanにアップデートしたせい。


```
takezoux2$ brew update
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- mach (LoadError)
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/Library/Homebrew/extend/pathname.rb:2:in `<top (required)>'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/Library/Homebrew/global.rb:3:in `<top (required)>'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require'
	from /usr/local/Library/brew.rb:15:in `<main>'
```

1: ```/usr/local```を元の状態に戻す

上記エラーが出てしまうと、brewのコマンドが全て使用できなくなるので、brewのディレクトリを元の状態に戻します。

```cd /usr/local```して、```git reset --hard && git clean -df```を実行し、ファイルを全て巻き戻して下さい。

2: ```/usr/local```の権限を変更

brew doctorで以下のようなエラーが出る場合、

```
takezoux2$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: The /usr/local directory is not writable.
Even if this directory was writable when you installed Homebrew, other
software may change permissions on this directory. Some versions of the
"InstantOn" component of Airfoil are known to do this.
```

コマンド
```sudo chown -R $(whoami):admin /usr/local```
(${whoami}の部分もそのままでOK)を実行して権限を変更します。


3: ```brew update```する

後は、updateすれば成功するはずです。
ELB配下のApacheIP制限


# IP制限

ELB配下のApacheでディレクトリ単位でIP制限したい時のメモ


## htaccess

X-Forwarded-ForからIPを取得しないと、内部IPになるので注意。

```
SetEnvIf X-Forwarded-For "xxx.xxx.xxx.xxx" allow_ip_address
Order deny,allow
Deny from all
Allow from env=allow_ip_address
```
Ethereumのsolcでビルドエラーが出た時に試すこと

以下に移行しました<br><a href="http://block-chain.jp/tech/ethereum-solc-build-error/" title="Ethereumのsolcでビルドエラーが出た時に試すこと">Ethereumのsolcでビルドエラーが出た時に試すこと</a>
ELB配下でConcrete5を運用しているとセッションが切れる

# 現象と原因

## 現象
Concrete5をEC2上にインストールしELB経由でアクセスして、ページを編集しようとログインした後、しばらくするとセッションが切れてしまう。
## 原因
原因は、ELBのIPアドレス（REMOTE_ADD）がしばしば変わってしまうため、Concrete5のセッションのVaridationで引っ掛かりセッションが無効化されてしまう。Concrete5では管理画面と一般ユーザ閲覧画面の区別がないため、より厳しいセキュリティチェックが行われているようで、同一セッションで接続元IPアドレスが変わる場合にセッションが無効化されてしまう。（セッションハイジャック対策の一部）
ELBの特性として、スケールしたりTTL（デフォで60秒？）が切れたりすると接続先のELBの宛先がコロコロ変わる。そのため、内部IPも変わってしまう。
[セキュリティへの取り組み](http://concrete5-japan.org/about/security/)
# 対策
1.IPアドレスのミスマッチのチェックをオフにしてチェックそのものを無効にしてしまう。

```php
<?php
// application/config/concrete.php

return [
    'security' => [
        'session' => [
            'invalidate_on_ip_mismatch' => false
        ]
    ]
];
```
**/application/config/concrete.php**
ファイルが無ければ追加、あれば追記。
本体の設定ファイルではない

参考URL：[ロードバランサーを通してconcrete5のセッションを維持する](https://concrete5.co.jp/blog/concrete5-load-balancer-session)

2.ELBの内部IPアドレスを信頼済みIPアドレスとして設定する

ELB経由でアクセスされることを前提にしているのであれば、信頼済みプロキシアドレスとして設定する。

```php
<?php
/**
 * Always trust incoming request.
 * 
 * For more detail, see: http://symfony.com/doc/current/cookbook/request/load_balancer_reverse_proxy.html
 */
// Get remote address
$remoteIp = $_SERVER['REMOTE_ADDR'];


return array(
    'security' => array(
        'trusted_proxies' => array(
            'ips' => array($remoteIp),
        ),
    ),
);
```
**/application/config/concrete.php**
ファイルが無ければ追加、あれば追記。
本体の設定ファイルではない

参考URL：
[Cloud9でconcrete5開発環境を作る](https://concrete5.co.jp/blog/cloud9-concrete5)
[How to Configure Symfony to Work behind a Load Balancer or a Reverse Proxy](http://symfony.com/doc/current/cookbook/request/load_balancer_reverse_proxy.html)

- Concrete5はSymfony2ベースで作られているので設定等はSymfonyベースのものが基本的に使用できるようだ。

**検証環境**
Concrete5 **5.7.5.6**
Amazon AWS ELB
EC2

FYI：[設定ファイルの使い方](http://concrete5-japan.org/help/5-7/recipes/config/)
【ブロック引数を知る】config/environments/deveropment.rbって何してるの？

#概要
railsでは

>config/environments/deveropment.rb

は、実行環境別の設定を持たせるようになっています。
その中で

```rb:deveropment.rb
Rails.application.configure do
  config.hoge = false
end`
```

↑のdo~endの意味が解らないので調べてみました。

- do~end　ってなってるし繰り返し処理なのかな？
- でも、回してる値とか見当たらないし何じゃこりゃ？

というのが最初の感想でした（恥ずかしい）

#標準出力で表示してみる

```rb:deveropment.rb
p "---------------------------"
p Rails.application.configure
p "---------------------------"`
```

まずは、こんな感じのをdeveropment.rbの先頭に追加して、rails s　を実行


**Exiting
c:/work/proto_waraiba/vendor/bundle/ruby/2.1.0/gems/railties-4.2.4/lib/rails/railtie.rb:210:in 
`instance_eval': wrong number of arguments (0 for 1..3) (ArgumentError)**

とエラーが出ました。

どうやらconfigureはメソッドらしいです。
で、railtie.rbの210行目を見てみると

```rb:railtie.rb
def configure(&block)
  instance_eval(&block)
end
```

ありました。こいつを呼んでるんですね。

この時点で思ったこと

- **rubyにもevalあるんだな**
- **&blockって何？**
- **method って do …end　付けると何が嬉しいの？**

#Evalってどんな感じなの？
まずはevalについて調べてみます

[instance_eval (Object)](http://ref.xaio.jp/ruby/classes/object/instance_eval)

>メソッドは、渡されたブロックをレシーバのインスタンスの元で実行します。

ふむふむ。ほかの言語にあるevalと似た感じ。（普段eval使わないから知らないけど）
与えられたStringをコードとして実行してくれるみたい。

#ブロックって何？

[[Ruby] ブロックやProcの使いどころを理解する](http://qiita.com/kidach1/items/15cfee9ec66804c3afd2)

ありがたやありがたや。

>do~end（もしくは{~}）で囲われた、引数となるためのカタマリ。

なるほど、そもそもdo~endに対する理解を大いに間違えていたらしい。
~~今まで、do~endは繰り返し処理のためのコードの一部であって、引数とは一切思ってなかったけど、**do~endで囲まれた中身はは引数**になってたんですね。~~
[追記　頂いたコメントを反映しました]
forループのdo~endは制御構造で、ブロックではないそうです。
また、ブロックはメソッドに与えられますが、引数ではないそうです。
むー、難しい。


```rb:sample.rb
for num in 1..10 do
  p num
end
```

#結論
というわけで

>config/environments/deveropment.rb

がやってる事は、
config.hogeみたいな値の宣言をひたすらevalを使って定義してるだけということでした。

あー、すっきりした。
CSS設計まとめ用のまとめ


やばい、当たりまえだけど、NAVERまとめに置いてある記事たちが分かりやすいｗ
■NAVERまとめ
http://matome.naver.jp/odai/2141533836163066801

↓まとめの中で良いなって思ったやつ
■破綻しにくいCSS設計の法則 15
http://qiita.com/BYODKM/items/b8f545453f656270212a
■いまどきのCSS – OOCSSとかBEMとかSMACSSとか
http://5log.jp/blog/css_375/ (edited)

個人の感情が強いけど、考えとしてはすごくわかるサイト
■BEMという命名規則とSass 3.3の新しい記法
http://blog.ruedap.com/2013/10/29/block-element-modifier 

これ見れば「OOCSS」、「BEM」、「SMACSS」がだいたい分かる！
■悩まないコーディングをしよう！ OOCSS,SMACSSを用いた、読みやすくてメンテナブルなCSS設計（Sass対応）
http://www.slideshare.net/horiguchiseito/master-architecture-forcss

■OOCSS（オブジェクト指向CSS）のススメ
　http://hijiriworld.com/web/oocss/

■やっぱりSassは導入すべき! メリット・デメリットを考察したうえで、導入を薦める最大の理由
　http://lifequest-blog.com/webcreation/css/589/

■CSSコーディングで泣かないためのSassの基礎知識と10の利点
　http://www.atmarkit.co.jp/ait/articles/1402/17/news102.html

■これからSassを始めたい人へ！導入手順をまとめてみた(Dreamweaver対応)
　http://liginc.co.jp/web/html-css/css/56599

BEMが個人的に分かりやすい気がしてきた・・・
http://feb19.jp/blog/archives/000276.php

このサイトめちゃべんきょうになる～
http://pepabo.github.io/docs/frontend/standard/css-architecture/
phoenix_slimeチートシート（少しずつ追加していくつもり）

Railsのslimとはちょっとだけ書き方が違っていて、そのちょっと違うで結構苦労するのでまとめておきます。
取り急ぎスモールスタートして、都度増やしていこうかと思います！

# 公式github

なにはともあれgithub

https://github.com/slime-lang/phoenix_slime

# 変数

変数の宣言＋代入と利用はこんな感じで

```slim
- data = "こうやって出力するよ"

p #{data}
```

# 条件分岐

if文は - if ではなく = ifなのがミソ
ただしelseの方は  - else

```slim
- bool = true
= if bool do
  p OK!
- else
  p NG!
```

# ループ制御

配列をループで回す方法は2通り。

* forで回すパターン

```slim
- datalist = ["aaa", "bbb", "ccc"]
= for data <- datalist do
  p = data
```

key => valueの場合は

```slim
= for {key, value} <- datalist do
```

でOK

* Enum.mapで回すパターン

```slim
- datalist = ["aaa", "bbb", "ccc"]
= Enum.map datalist, fn data ->
  p = data
```

# ループ中でループカウント(index)を使いたい場合

他の書き方まだわからないですが、こんな感じで対応可能

```slim
= for {record, index} <- Enum.with_index(datalist) do
```

datalistがこんな感じの場合

```
{{data_a}, {data_b}}
```

```slim
= for {{data_a, data_b}, index} <- Enum.with_index(datalist) do
```

これでOK

# Phoenix.HTML

Phoenix.HTMLはだいたいeexをslimぽく書けばいい

```slim
/ form_for
= form_for @changeset, page_path(@conn, :confirm), fn f ->

/ text_input　他hoge_inputもだいたい同じ
= text_input f, :name, id: "name", class: "class"
```

# validationエラーのメッセージ出力

validationエラーはtranslate_errorヘルパーを使って出力

```slim
/ 項目ごとに出力する場合
= text_input f, :name
= if f.errors[:name] do
  span = translate_error(f.errors[:name])

/ まとめて先頭とかに出力する場合
= for {attr, message} <- f.errors do
  li = translate_error(message)
```

# 動的にclassを付与するとか

よくある、エラーだったらis-invalidを追加的なやつ
※例はmaterial-design-liteの場合

\#{}の中に条件式を書けばいい（なんかもうちょっとスマートなやり方がありそうな気がする）

```slim
div class="mdl-textfield mdl-js-textfield #{if f.errors[:name] != '' do 'is-invalid' else '' end}"
```

# 変数内のタグのエスケープ解除

phoenix_htmlで用意している関数を使う

```slim
p.text-info
  = text_to_html(data_with_tag)
```

またつまづいて解決したら追加していく！
TypeScriptで名前付き引数のようなものを使う


TypeScript1.8での動作です。

```ts
// groupのデフォルト引数を指定 ageに関しては入力自由
function Idol({group = "Dempagumi.inc", name, age} : {group?: string, name: string, age?: number}){
    console.log(group, name, age)
}

Idol({name: "Yumemi Nemu"});  // groupはデフォルト値を使用 年齢はundefined
Idol({name: "Fujisaki Ayane", age: 20});  // groupはデフォルト値を使用 年齢を明示的に指定
Idol({group: "Momoiro Clover Z", name: "Tamai Shiori", age: 20});  // groupを明示的に指定

/*
Result
  Dempagumi.inc Yumemi Nemu undefined
  Dempagumi.inc Fujisaki Ayane 20
  Momoiro Clover Z Tamai Shiori 20
*/
```

ES6でも使用されるオブジェクトを変数に展開する仕組み`destructuring`を使って実現しています。変換後のJavaScriptは以下のとおりです。

```js
function Idol(_ref) {
    var _ref$group = _ref.group;
    var group = _ref$group === undefined ? "Dempagumi.inc" : _ref$group;
    var name = _ref.name;
    var age = _ref.age;

    console.log(group, name, age);
}
Idol({ name: "Yumemi Nemu" });
Idol({ name: "Fujisaki Ayane", age: 20 });
Idol({ group: "Momoiro Clover Z", name: "Tamai Shiori", age: 20 });
```

デフォルト値を受ける部分の型は名前に`?`を付けてオプションのフィールドとして設定します。

```
              /*    変数名とデフォルト値を指定    */   /*   受け取る変数のシグネチャ   */
function Idol({group = "Dempagumi.inc", name, age} : {group?: string, name: string, age?: number}){
```
fluent-plugin-s3のver 0.6.0以降から必要になったinstance_profile_credentials

以下のようなログを見かけてその対処の備忘録です。

```
2016-01-14 06:13:50 +0000 [warn]: 'aws_iam_retries' parameter is deprecated. Use 'instance_profile_credentials' instead
```

※warnは出ているもののS3には届いていた

instance_profile_credentialsは、fluent-plugin-s3のver 0.6.0以降から利用されてるらしい

```
 Release 0.6.0.pre1 - 2015/09/10

   * Use AWS SDK v2
```

上記の影響。
ちなみに、
instance_profile_credentialsが設定されていない場合、aws_iam_retriesのdefault値 5回が自動設定され、Warningになっていた。
回避するには、fluent-plugin-s3のVerを0.6以降の場合下記の設定が必要でした。
0.5.xでは、instance_profile_credentialsという設定はないので設定追加するとエラーとなりtd-agent自体の起動に問題が。

```
<match *>
  @type s3
###fluent-plugin-s3のver 0.6.0以降以下を追加
    <instance_profile_credentials> 
      retries 5 
    </instance_profile_credentials> 
```

対応としては、
・全台fluent-plugin-s3をアップデートする
・無視する
・0.5.11指定インストールする
かの選択が必要、ということで、
低いのはほっといても大丈夫なのでchef上の設定変えといて順次差し替えということに。
Unity5.3.2でVuforiaが使えなかった話

# はじめに
[UnityでVuforiaを使ってLive2DとARの可能性を感じる](http://qiita.com/shima07/items/7f1d8343aab677f38bc2)でコメントしましたが、Unity5.3.2p1で開発をしていたところ、エラーが出てつまづきました。

# Unity5.3.2でVuforiaが使えなかった
Unity5.3.2p1で開発中、ARの導入にVuforiaを使おうと、
VuforiaのSDKをインポートして、マーカーをインポートして・・・としていたところ、ImageTarget を Hierarchy に追加したところ、下記画像のようなエラーが出て、Unityが落ちました。
![unityerror.png](https://qiita-image-store.s3.amazonaws.com/0/93282/f1f77995-9075-9a22-0d3d-41127c78ad37.png)


原因はこちらでした。
[NOTICE:Unity 5.3.2 incompatible with Vufoia](https://developer.vuforia.com/forum/unity-extension-technical-discussion/notice-unity-532-incompatible-vuforia)

どうやらVuforiaではUnity5.3.2、5.3.1p4 をサポートしていないそうです。
Unity5.3.1f1 もしくは 5.3.1p3 を使うように、とのことです。
UnityでOculusRift用のHUDUIを作成[初期設定編]

#UGUIでHUDを作成する際に行った設定
##Canvasの設定
・RanderModeはCamera
・PlaneDistanceを2くらいに調整　→1だと近すぎた

##CanvasScalerの設定
・Android、iPhoneでの設定と同様


RenderMode-OverRayは映らなかった　→　カメラを基調にしてるから？？
Cameraの合成はできているみたい。

##Canvas上でのUI配置
###無理なく見える範囲
X軸-650～650辺り
Y軸-700～550辺り

##疲れにくい様に配慮してUI配置を行う
・人間の目は水平からやや下向きが楽な角度なので、中心となる位置を100程下にすると楽な位置に来る
・無理なく見える範囲外にはUIは配置しない
・UIはなるべく上よりも下に配置する　　　　→上を見る動作は下を見るよりも目が疲れやすい
ベトナムでオフショア開発してみる(7) これでうまくいくオフショア開発ワークフロー

GYAOの窓際エンジニア　玉利です。

現在はベトナムメンバーと一緒にサプライチェーン系のツールを開発しているのですが、先日ようやく本格稼働はじめまして弊社の新サービスの大量の業務を無事さばくことが出来ました。これをExcelとメールでやってたら、自分が業務担当だったら人生考えなおしたくなります。

いままではExcelで作っていたので、だいたい日付ベースで処理を行ってきたのですが、今度からWebシステムになったために、できることがふえました。

例えば荷物の到着日を「材料到着日」として Excel上では扱っていたため、開発時の要求仕様書では日付を入れればよく、DB設計は「date型」にしたのですが。

Kさん「急ぎ便の処理を見分けるために、時間まで入れて欲しいんだけど」
ワタシ「えー、そこDBがdate型なのをdatetimeに変えなきゃいけなくて、結構面倒だよー」

やりたくない仕事なのですが、Kさん美人で面白い人なので聞いてあげることにします。

でも本当の理由は、「探す仕事は付加価値を生まない原価だけを高める行為」ということなのです。ここをカイゼンするのは我々がやってはいけないことを無くす、という製造業で言う「５S（整理　整頓　清掃　清潔　躾）」活動になるからです。

# 下調べをしてみる

まずはRubymineでDBを見てみます。date型ではありますが、秒数が入ってるっぽいので、マイグレーションでなんとかなりそうな気がしてます。ここでダメならカラムを潰して作り直しになるので、過去データの扱いは非常に面倒になります。

![tickets_-_Che-GYAO_-____RubymineProjects_Che-GYAO_.png](https://qiita-image-store.s3.amazonaws.com/0/113049/3f9b2d14-9a47-b7be-c285-f23b1f925a1e.png)

行けそうな気がしてきました。こういうのはDB設計レビュー時につぶしておきたかった問題点ですが、業務サイドに仕様を仕切れる人がいないからExcelで頑張っているというのがほぼすべての会社の姿なので、気がついた時にカイゼン活動をしましょう。

このチェック部分は、将来への影響までしっかり考え抜かないと、あとで地雷が発生したり大変なので、ベテランがしっかり押えてくださいね。

# 要望資料を書いてもらい、SEのコメントを入れる

以前、どこかの記事で書いてもらった気がしますが、要望はグラフィカルにパワポで作ってもらいます。前はExcelで箇条書きされてて、毎回自分でパワポ化していたのですが、パワポじゃないと要望受けないよ、と伝えてあります。

近年ではパワポは悪、みたいな扱いを受けることが多いのですが、発案者の頭の中にある問題点を可視化するには非常に優れたツールですね。

そして、緑の部分はワタシが追記したコメントです。

![要望サンプル20160229_pptx.png](https://qiita-image-store.s3.amazonaws.com/0/113049/eb408df9-a15d-f2b6-00eb-924118246fc3.png)


これを、ベトナムに送ります。

# ベトナム側の翻訳

ベトナムオフィス(Techbase Vietnam)には、日本留学経験のあるコミュニケーター（通訳）がいます。

![_3__Techbase_VietNam_Company_Limited.png](https://qiita-image-store.s3.amazonaws.com/0/113049/7b6a15c5-fdd1-164f-0eeb-41fb34569a87.png)
（写真は[TechBase Vietnam Facebook](https://www.facebook.com/techbasevietnam/)より)

彼女が、ベトナム語に訳してくれます。最初は英語でやろうとしていたのですが、どうせ日本人は英語わからないし、日本人エンジニアもコードは読めるけど英語もベトナム語もダメなので、「ベトナムではベトナム語を公用語にすべきである！」というシンプルな考えで、現地資料はベトナム語にしました。

![社内Slack.png](https://qiita-image-store.s3.amazonaws.com/0/113049/8bada3a1-b711-cab9-3c97-5d79cd8c71e6.png)

細かい詰めの作業は、社内Slack的なメッセンジャーで処理します。
なにかわかりにくいところがあれば、この段階で日本語で問題を潰すことができます。


# 開発作業



そして、エンジニアに依頼が渡ります。いまメインで担当しているのはコアさん、日本でも滅多に見かけない腕の良いエンジニアです。Hackdayイベントでも表彰されていました。彼は特に仕事が速いので、彼らの仕事を出すのが大変です。Rubyエンジニアは、PHPエンジニアの倍くらいの速度で仕事を片付けてくれます。

![_3__Techbase_VietNam_Company_Limited.png](https://qiita-image-store.s3.amazonaws.com/0/113049/fe07086e-e43f-2d33-a7d8-8f43eef10632.png)
（写真は[TechBase Vietnam Facebook](https://www.facebook.com/techbasevietnam/)より)

要望は、ベトナム側の開発チームでGithub Issue化されます。

![Issues_·_GYAOCORP_Che-GYAO.png](https://qiita-image-store.s3.amazonaws.com/0/113049/7cb0e6b2-6122-af27-8328-9a91f66172d8.png)

あとは、社内Slackで質問が来たら、サンプルコードで答えていけばなんとかなります。
実装が終わったら、コードの確認と動作の確認を行い、Issueのクローズをしていきます。

# ベトナム開発の社内でのメリット例

だいたい日本のWebサービスの会社は、バックエンドはExcelというのが普通にあります。10年以上前の着メロブームの時でもそうでしたし、今でもサービス開発が忙しくバックヤードは人力という会社ばかりだとおもいます。

弊社のスタッフで、アメリカの動画系サービス会社に視察に行った人は、業務システムがしっかり作られていて小人数でまわるようになっているのが衝撃だったようです。ええ、過去を振り返れば日本は個人技で頑張って、兵站でアメリカに負けたわけです。日本人はシステム化に疎いという弱点は今も昔もおんなじです。

シリコンバレーの会社は、おそらくインドや中国のアウトソースを使ったりして社内システムを整備し、創造的なフロント側はアメリカで開発してるんじゃないかと想像しています。あんなに立派な業務システムまで手が回るほど、エンジニア売り手市場のシリコンバレーにエンジニアリソースは転がってません。

日本でやる場合は、ベトナムを味方に付ければ同じモデルに持ち込めるのではないかと思ってます。シリコンバレーの背中はまだ見えませんが、GYAO社は数年でおいついてやろうと思っています。
Raspberry Pi 3 Model B発売！

# Raspberry Pi
[Raspberry Pi - Teach, Learn, and Make with Raspberry Pi](https://www.raspberrypi.org/)
言わずと知れたみんなのおもちゃ

## Raspberry Pi 3 Model B

Raspberry Pi 2 Model Bからの主な変更点

- Soc
- CPU
- 電源
- 無線LAN
- Bluetooth
- その他
	- デスフラッシュ対策
	- microSDスロット部品の変更（Pi2にて初期不良多発のため）

### 変更点比較
[「Raspberry Pi 3 Model B」発表のお知らせ - Raspberry Pi Shop by KSY](https://raspberry-pi.ksyic.com/news/page/nwp.id/24)

|              |                    Raspberry Pi 3 Model B                    |             Raspberry Pi 2 Model B             |
|--------------|--------------------------------------------------------------|------------------------------------------------|
| SoC          | Broadcom **BCM2837**                                         | Broadcom BCM2836                               |
| CPU          | **1.2 GHz** クアッドコア **Cortex-A53** **ARMv8 64bit**      | 900 MHz クアッドコア Cortex-A7 ARM11 32bit     |
| GPU          | デュアルコア VideoCore IV® 400MHz（3D **300MHz**）           | デュアルコア VideoCore IV® 400MHz（3D 250MHz） |
| 電源         | Micro USB Bソケット 5V **2.5A** / 2.54mm ピンヘッダ          | Micro USB Bソケット 5V 2A / 2.54mm ピンヘッダ  |
| 最大消費電力 | **約12.5W**                                                  | 約9W                                           |
| 無線LAN      | **IEEE 802.11 b/g/n 2.4GHz（Broadcom BCM43143）**            | 非搭載                                         |
| Bluetooth    | **Bluetooth 4.1, Bluetooth Low Energy（Broadcom BCM43143）** | 非搭載                                         |

### バンドルソフトの追加（Node-RED）
[Node-RED](http://nodered.org/)
> A visual tool for wiring the Internet of Things

[第3世代モデル「Raspberry Pi 3 Model B（ラズベリー・パイ　スリー　モデル　ビー）」の取り扱いを決定 | 半導体・電子部品の通販 RSオンライン](http://jp.rs-online.com/web/generalDisplay.html?id=footer1/release/160229_raspberry_pi_3)
> 「Node-RED」は、デバイス、API、オンラインサービスをビジュアル的に開発できるソフトで、IoTシステムのプロトタイプ開発ソリューションとして注目されています。

Qiitaでも既に78投稿ほど記事があるようです。
[目からウロコ！Node-REDのデザインパターン10選 - Qiita](http://qiita.com/zuhito/items/e9abfd6f1ba188f908ed)

### 販売状況
<del>国内の販売店は技適待ちの模様。</del>
**販売開始！**
先行販売は3月15日の夜中に開始して翌16日朝には完売。
次回販売は3月18日（金）夕方以降を予定

価格は**5,670円（送料込み）**
[「Raspberry Pi 3 Model B」販売のご案内 - Raspberry Pi Shop by KSY](https://raspberry-pi.ksyic.com/news/page/nwp.id/28)

Pi3向け2.5A出力電源は1,620円
公式ケースは1,080円
になる模様

スイッチサイエンスでは受注開始通知が受け取れるとのこと
[Raspberry Pi 3の受注開始通知を受け取れます | スイッチサイエンス マガジン](http://mag.switch-science.com/2016/03/04/raspberry-pi-3-3/)

#### 技適通過

- 型式又は名称
Raspberry Pi 3B - Single Board Computer
- 工事設計認証番号
205-160251
- 日付 2016/2/25


### まとめ
無線LAN・Bluetooth標準搭載は嬉しいですが、無線LANの影響か電流容量の要求が厳しくなってるのはちょっと残念。
KSYでは[対応電源の発売予定](https://raspberry-pi.ksyic.com/news/page/nwp.id/24)があるよ模様。
> Raspberry Pi 3に対応したKSYオリジナル「USB電源アダプター 5V/2.5A/1P [KSY0525USB-RASPI]」の販売も予定しています。
kaminariをBootstrap3デザインに適応する

# 環境
- MacOSX: 10.11.3 
- Rails: 4.2.5
- Ruby: 2.3.0
- Kaminari: 0.16.3
- Bootstrap: 3.3.6

# 前置き
Kaminariをインストールする手順は結構情報があるので、省略します。

# 適応方法（本題）
以下のコマンドを実行する。

```shell-session:ターミナル.app
bundle exec rails g kaminari:views bootstrap3
```

すると、以下のようにviewが生成される。

```shell-session:ターミナル.app
create  app/views/kaminari/_first_page.html.erb
create  app/views/kaminari/_gap.html.erb
create  app/views/kaminari/_last_page.html.erb
create  app/views/kaminari/_next_page.html.erb
create  app/views/kaminari/_page.html.erb
create  app/views/kaminari/_paginator.html.erb
create  app/views/kaminari/_prev_page.html.erb
```

[BootstrapのPagination](http://getbootstrap.com/components/#pagination)を見ると`nav`タグが入っているので、それに従うのであれば、以下のように`nav`タグを追加すればOKです。

```diff:app/views/kaminari/_paginator.html.erb
<%= paginator.render do -%>
+    <nav>
      <ul class="pagination">
        <%= first_page_tag unless current_page.first? %>
        <%= prev_page_tag unless current_page.first? %>
        <% each_page do |page| -%>
            <% if page.left_outer? || page.right_outer? || page.inside_window? -%>
                <%= page_tag page %>
            <% elsif !page.was_truncated? -%>
                <%= gap_tag %>
            <% end -%>
        <% end -%>
        <%= next_page_tag unless current_page.last? %>
        <%= last_page_tag unless current_page.last? %>
      </ul>
+    </nav>
<% end -%>
```

素晴らしい。

<img width="150" alt="スクリーンショット 2016-03-01 10.33.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/104056/ff589ac8-e74d-de1e-af8a-a026f625e9c8.png">
Pixenで設定したショートカットキー

## ^H
Layer->Flip Layer->Horizontally

## 絵を書くときの手順
だいたい半分側だけを書いて`^H`してしまえばよい。
ある程度書いたらリフレクとして様子をみるを繰り返す。
リフレクとすると元の絵は削除されてリフレクとされたものだけが残るので、これを避けるために

* `Ctr + Shift + D`でレイヤーをDuplicate
* `^H`
* `Ctr + E`でレイヤーを結合

するとよい。結合を忘れると、fillツールとかで塗りつぶすときにあれ、なんで余計なところまで塗りつぶされるんだろう？みたいな勘違いが起こる。
DjangoにおけるDecoratorの使い方とその作り方

#背景
Djangoでwebappを作ってるんだけど、Adminページのdocumentを読んでみると、以下の２つのコードは置き換えが可能らしい。

```admin.py
from django.contrib import admin
from .models import Author

#decorator無し
  class AuthorAdmin(admin.ModelAdmin):
    pass
  admin.site.register(Author, AuthorAdmin)

#decorator有り
  @admin.register(Author)
  class AuthorAdmin(admin.ModelAdmin):
    pass
```

まぁこれが一個だけだと何もありがたみを感じないんだけど、admin.site.register(sth, sthAdmin)ってのが何十個も並び出すと、目に優しく無いからこれで代用する方がすっきりするんだとか。

で、decoratorってなんやねん！って思ったので、調べて何となくわかった範囲でまとめてみる。

元記事は[こちら](http://francoisgaudin.com/2013/08/22/decorators-in-django/)。もうちょっと経験値が上がってからじゃないと納得して理解して使えない系の話題みたい。少なくとも俺にとっては。


わかったことだけ先にまとめてしまうと、

 - functionとかclassの上で定義してあげると、なんらかの効果を付与してくれる。
 - 例えば、viewの実行をログインしてるユーザーだけに限定したり
 - ログをとったりclassを定義すると勝手にそれを実行したり

まぁ便利みたいだから、登場した度に一個ずつ覚えて行こうと思う。ではスタート。



#Decoratorsは関数

面倒臭い@の概念に関してはとりあえず無視して、Decoratorありの場合と無しの場合を比較してみる。

```example1.py

#Decorator あり
  @login_required
  def my_view(request):
   return HttpResponse()


#Decoratorなし
  def my_view(request):
   return HttpResponse

  my_view = login_required(my_view)

```

```example2.py
#Decoratorあり
  @require_http_method(['GET','POST'])
  def my_view(request):
   return HttpResponse()


#Decoratorなし
  def my_view(request):
   return HttpResponse()
  
  my_view = require_http_method(['GET'],['POST'])(my_view)
 
```

#Decoratorのパラメータのない場合

これまでの説明からもわかるように、decoratorはただの関数に等しいもので、後に続く関数をパラメーターとして受け取り、役割を引き継ぐみたい。（これで解釈して現状問題なし）

例えばmy_view(request)が呼ばれた時には、実際にはlogin_required(my_view)(request)が呼ばれていることに等しいらしい

ここで一個注意しておきたいのは、Decoratorはcodingするときのdesign patternの一種であってpython や Djangoに特有のものでは無いんだとか

だからpythonの知識がある程度あれば、decoratorは自分で作れちゃうらしい。ということで、decoratorの作り方を少しずつ見ていくことにする。

##はじめに

identity decoratorを作る。何をするわけでもなく、ただ関数一個受け取ってそれを返すだけ。djangoでいうviewの役割そのものでしか無い。

```example3.py
def identity(a_view):
  return a_view
```

この場合は、上のdecoratorはmy_view(request)と同じ仕事をしてくれるんだとか。うーん、まだいまいち分からない。。

##ステップ２

実際になんかしら仕事をするdecoratorを作ってみることにする。試しにviewの呼ばれた回数のログを取っていくdecoratorを作ってみる。

```example4.py
def log(a_view):
  def _wrapped_view(request, *args, **kwargs):
    logger.log('My view is called')
    return a_view(request, *args, **kwargs)
  return _wrapped_view
```

ここで作ったものは

 - なんかしらのlogをとって
 - parametarで受け取ったviewをそのまま返す

なんともシンプルなdecorator。実行される手順としては以下の手順。

- log(my_view)(request)
- _wrapped_view(request)
- my_view(request)

なんか実際に意味があるのかわからないけど、とりあえずこれでログが取れるらしい。

試しに次はwrapped_viewを実行しようとしているユーザーがログインしてるかどうかをみる機能をこのdecoratorに追加する。

```example5.py
def login_required(a_view):
  def _wrapped_view(request, *args, **kwargs):
    if request.user.is_authenticated():
      return a_view(request, *args, **kwargs)
    return HttpResponseForbiden()
  return _wrapped_view

```

やっぱりよく分からないんだけど、物覚えと理解力がへぼいのかな。。
GitLab逆引きメモ

必要に迫られたGitLab関連の逆引きメモになります。

# アップデートに失敗する場合

環境としては`CentOS7`の`yum update`で下記のようなエラーが出る場合です。

```
gitlab preinstall: It seems you are upgrading from x.x version series
gitlab preinstall: to c.x series. It is recommended to upgrade
gitlab preinstall: to the last minor version in a major version series first before
gitlab preinstall: jumping to the next major version.
gitlab preinstall: Please follow the upgrade documentation at https://docs.gitlab.com/ee/policy/maintenance.html#upgrade-recommendations
gitlab preinstall: and upgrade to x.x first.
error: %pre(gitlab-ce-x.x.x-ce.0.el7.x86_64) scriptlet failed, exit status 1
Error in PREIN scriptlet in rpm package gitlab-ce-x.x.x-ce.0.el7.x86_64
```

1. `yum list installed | grep gitlab-ce`でインストールされているバージョンを確認。
2. ` yum --showduplicate list gitlab-ce`で利用可能なバージョンを確認。
3. `and upgrade to x.x first.`で指定されているバージョンの更新コマンドを実行。

**更新コマンド**

```
yum update gitlab-ce-x.x.x-ce.0.el7
```

**参考**
[GitLab Maintenance Policy](https://docs.gitlab.com/ee/policy/maintenance.html#upgrade-recommendations)

# タイムゾーンを"Asia/Tokyo"に変更する

GitLabのタイムゾーンはデフォルトだとUTCになっているので"Asia/Tokyo"に変更する。

```ruby:/etc/gitlab/gitlab.rb
# gitlab_rails['time_zone'] = 'UTC'
```

time_zoneの#を削除して**Asia/Tokyo**へ変更

```ruby:/etc/gitlab/gitlab.rb
gitlab_rails['time_zone'] = 'Asia/Tokyo'
```
**設定反映**

```
# gitlab-ctl reconfigure
```


**参考**

[omnibus-gitlabでtimezoneをAsia/Tokyoにする | orca8の備忘録](http://orca8.blogspot.jp/2015/03/omnibus-gitlabtimezoneasiatokyo.html)



# GitLabのホスト名を変更

**external_urlを変更[^1]**

```ruby:/etc/gitlab/gitlab.r
## Url on which GitLab will be reachable.
## For more details on configuring external_url see:
## https://gitlab.com/gitlab-org/omnibus-gitlab/blob/629def0a7a26e7c2326566f0758d4a27857b52a3/README.md#configuring-the-external-url-for-gitlab
external_url 'http://example.jp'
```
**設定の反映**

```shell
gitlab-ctl reconfigure
```

[^1]: `/var/opt/gitlab/gitlab-rails/etc/gitlab.yml`は変更しない。
spreadsheetでセルの色をコピーする楽ちんな方法

エクセルのようでエクセルでないちょっと使いづらいエクセルでお馴染みの、GoogleSpreadSheetですが、資料を作りながらセルに色を付けたいケースってありますね。

エクセルであれば、「最後につけた色」を色パレットが覚えてくれているのですが、SpreadSheetは常に忘れる。目でみて似た色を設定するのってプリミティブすぎる。

なので、以下の手順がお手軽。

- 色の着いたセルにフォーカス
- この時には色パレットには同じ色にチェックが入ってる
- もう一度色をつける
- 他のセルにフォーカスを移して、「コマンド+Y」（編集の繰り返し）

![スクリーンショット 2016-03-01 10.21.41.png](https://qiita-image-store.s3.amazonaws.com/0/53489/5fe41cfc-98e4-a6c6-426a-a01881265e1b.png)


「もう一回同じ色を付けてそれを別のセルで繰り返し」ってことをしているだけです。地味ですが、後はコマンド＋Yだけの操作で色づけ作業ができるので便利。
（スケジュールの休日をグレーアウトするときとかね）
MSYS2のzshでパスの補完を有効にする


## はじめに

MSYS2のzshを使い始めてまず気になったのが、Cドライブ等のパス補完ができないことである。

```shell-session
$ cd /c/<TAB>
```

bashでは補完が行われていたが、zshでは何も起きない。
zshの問題だと思いしばし放置していたが、いくらなんでも補完が出来ないのは効率が悪すぎるので調べてみたところ、あっさり解決策が見つかったのでここに残すことにする。

## `zstyle`の`fake-files`を利用する

調べるとすぐに[GitHubのIssue](https://github.com/Alexpux/MSYS2-packages/issues/38)や[Cygwinのzshに関する質問](http://superuser.com/questions/533040/zsh-completion-doesnt-work-under-cygwin-for-other-drives)が見つかった。
[EdVanDance氏の投稿](https://github.com/Alexpux/MSYS2-packages/issues/38#issuecomment-150131217)にある通り`.zshrc`に下記の設定を追記することでCドライブ等のパス補完が有効になる。

```zsh
# complete hard drives in msys2
drives=$(mount | sed -rn 's#^[A-Z]: on /([a-z]).*#\1#p' | tr '\n' ' ')
zstyle ':completion:*' fake-files /: "/:$drives"
unset drives
```
PHP:平日だけのリストをDatePeriodで求める

`DatePeriod`と`N`フォーマットと`array_filter`を使うと特定の期間の平日だけのリストを求めることができる。

```php
$period = new DatePeriod('2016-03-01T00:00:00Z/2016-03-31T00:00:01Z/P1D');
$weekdays = array_filter(iterator_to_array($period), function (DateTimeInterface $date) {
	return $date->format('N') < 6;
});

foreach($weekdays as $date) {
    echo $date->format('Y-m-d H:i:s l'), PHP_EOL;
}
```

出力結果

```
2016-03-01 00:00:00 Tuesday
2016-03-02 00:00:00 Wednesday
2016-03-03 00:00:00 Thursday
2016-03-04 00:00:00 Friday
2016-03-07 00:00:00 Monday
2016-03-08 00:00:00 Tuesday
2016-03-09 00:00:00 Wednesday
2016-03-10 00:00:00 Thursday
2016-03-11 00:00:00 Friday
2016-03-14 00:00:00 Monday
2016-03-15 00:00:00 Tuesday
2016-03-16 00:00:00 Wednesday
2016-03-17 00:00:00 Thursday
2016-03-18 00:00:00 Friday
2016-03-21 00:00:00 Monday
2016-03-22 00:00:00 Tuesday
2016-03-23 00:00:00 Wednesday
2016-03-24 00:00:00 Thursday
2016-03-25 00:00:00 Friday
2016-03-28 00:00:00 Monday
2016-03-29 00:00:00 Tuesday
2016-03-30 00:00:00 Wednesday
2016-03-31 00:00:00 Thursday
```

`DatePeriod`は`DateTime`と`DateInterval`を使う以外に、ISO 8601 のRecurring time intervals書式でインスタンス化することができる。

ISO 8601では開始日〜終了日を指定した書式は`'開始日時/終了日時/間隔'`となる。なお、期間は開始日時以上、終了日時**未満**になるので、最終日も含めたい場合は、終了日時を**0時0分1秒以後の時刻**にする必要がある。したがって、上のコードでは3月31日の0秒ちょうどを含めるために、終了日時を3月31日の1秒にしているわけである。

ちなみに、`Rn`で繰り返し回数を指定することもできる。下記の反復形式は同じ意味になる。

```
'2016-03-01T00:00:00Z/2016-03-31T00:00:01Z/P1D'
'R30/2016-03-01T00:00:00Z/P1D'
```

```php
$p1 = new DatePeriod('2016-03-01T00:00:00Z/2016-03-31T00:00:01Z/P1D');
$p2 = new DatePeriod('R30/2016-03-01T00:00:00Z/P1D');

// 参考: DateTimeとDateIntervalを使った例
$p3 = new DatePeriod(
	new DateTime('2016-03-01T00:00:00Z'),
	new DateInterval('P1D'),
	new DateTime('2016-03-31T00:00:01Z')
);

assert(iterator_to_array($p1) == iterator_to_array($p2));
assert(iterator_to_array($p2) == iterator_to_array($p3));
```


元ネタ：[DateTimeクラスで平日のリスト - Qiita](http://qiita.com/killkllkill/items/e25f6ff5f1858634de45)
参考: [PHP: DatePeriod::__construct - Manual](http://php.net/manual/ja/dateperiod.construct.php)
GitLabとSlackの連携


gitlabにあるリポジトリに誰かがpushしたらSlackで通知してくれると嬉しいなあとか思って、ぽろっと隣に座ってる弊社CTO(@mogetarou)氏に聞いてみたら優しく丁寧に教えてくれたのでまとめます。

僕が個人的に使ってるGitLabのバージョンは7.8です。
会社で使ってるのは8.0です。
両方共全く同じ操作でSlack連携できます。

## Slack側の操作
1.アプリでもブラウザ版でもいいでGitLabと連携したいSlackチームにログインします。
![スクリーンショット 2016-03-01 9.24.06.png](https://qiita-image-store.s3.amazonaws.com/0/19674/923eea92-72bc-64cf-42a7-84c6b827e68a.png "スクリーンショット 2016-03-01 9.24.06.png")

2.左上のチーム名のところをクリックして、ドロップダウンメニューからApps&Custom Integrationsをクリック。
![スクリーンショット 2016-03-01 9.24.31.png](https://qiita-image-store.s3.amazonaws.com/0/19674/54ef89e8-3086-2e9e-279a-337c52885eca.png "スクリーンショット 2016-03-01 9.24.31.png")

3.右上のBuild your ownをクリック
![スクリーンショット 2016-03-01 9.24.51.png](https://qiita-image-store.s3.amazonaws.com/0/19674/8ad8b344-6567-1289-1cbe-ac5022b1410f.png "スクリーンショット 2016-03-01 9.24.51.png")


4.Something Just for my team の Make a Custom Integrationをクリック
![スクリーンショット 2016-03-01 9.30.34.png](https://qiita-image-store.s3.amazonaws.com/0/19674/afb12766-f0ae-ea4b-3656-d2bf1a4a2b43.png "スクリーンショット 2016-03-01 9.30.34.png")

5.Incoming WebHooksをクリック
![スクリーンショット 2016-03-01 9.31.58.png](https://qiita-image-store.s3.amazonaws.com/0/19674/75b3047a-465d-93fd-8ffa-7bf8daeb1408.png "スクリーンショット 2016-03-01 9.31.58.png")

6.gitlabの更新を表示させたいチャンネルを設定して、Add Incoming WebHooks itegrationをクリック
![スクリーンショット 2016-03-01 9.32.31.png](https://qiita-image-store.s3.amazonaws.com/0/19674/0b9cecf6-856d-a1c2-c845-fe078961c026.png "スクリーンショット 2016-03-01 9.32.31.png")

※generalチャンネルとかにするとteam全員に通知行くのでプロジェクト毎にチャンネル作ってそちらに流すほうが良いと思います。

7.WebhookURLをコピー
![スクリーンショット 2016-03-01 9.33.24.png](https://qiita-image-store.s3.amazonaws.com/0/19674/975b8344-ce57-fde3-3b17-66d1db2697de.png "スクリーンショット 2016-03-01 9.33.24.png")

Slack側の設定は以上です。

## GitLab側の操作
1.連携したいプロジェクトのページを開いて左側のメニューのSettingsをクリック
![スクリーンショット 2016-03-01 9.51.09.png](https://qiita-image-store.s3.amazonaws.com/0/19674/2913693c-7180-9617-ea17-000a13f59b07.png "スクリーンショット 2016-03-01 9.51.09.png")


2.左側のメニューのServicesをクリック
![スクリーンショット 2016-03-01 9.51.28.png](https://qiita-image-store.s3.amazonaws.com/0/19674/0839797c-b8a3-af21-85ab-2e903bce1e7b.png "スクリーンショット 2016-03-01 9.51.28.png")

3.下のほうにあるSlackをクリック
![スクリーンショット 2016-03-01 9.52.01.png](https://qiita-image-store.s3.amazonaws.com/0/19674/06de6cd0-9e56-a044-46e5-2231eb5d84fa.png "スクリーンショット 2016-03-01 9.52.01.png")

4.Activeにチェックを入れて先ほどSlackでコピーしたURLを入れてSave
![スクリーンショット 2016-03-01 9.52.20.png](https://qiita-image-store.s3.amazonaws.com/0/19674/9bcd8aea-5d45-4f2a-80b6-6727e08cd316.png "スクリーンショット 2016-03-01 9.52.20.png")


5.Test settingを押してみてテスト。Slackのチャンネルに投稿されればオッケーです。
![スクリーンショット 2016-03-01 9.55.38.png](https://qiita-image-store.s3.amazonaws.com/0/19674/2ebddfcf-f8b8-cc6b-02f7-0e078e7a7bc3.png "スクリーンショット 2016-03-01 9.55.38.png")



以上です。俺今仕事してるぜアピールに持って来いの機能ですね。
Java SE7 Gold 取得を目指して (6)

Java SE7 Gold をとりたい…!
===


本日は第6回目です。
5章の残り半分を進めました。

## 今日のこぼれ話
最近、ひょんなことでCoffeeScriptを書いたのですが、{} の代わりにインデント、というのはなかなか心地のいい記法ですね。
{ の位置を行終わりにするか次の行にするか、みたいな不毛な論争も起きませんし。
とはいえ、そんな言語も \ とか入れて途中改行すると途端に見づらくなるので、Javaのように1行が長くなりがちな言語だと不向きなのかもしれません。
まぁ、eclipseのようなIDEはもちろん、最近はテキストエディタでもフォーマッタありますし、コード整形はそちらで十分やっていけるのでしょう。
インデントとかフォーマットを気にしないメンバーが、必ずと言っていいほどプロジェクトに紛れこんでしまうのは、また別のお話…。

## 本日知ったこと(5章 2/2)

* フォーマット
  * Numberフォーマットは `NumberFormat format = NumberFormat.getXXXInstance();` のような形で取得する (newできない)
  * DecimalFormatは `DecimalFormat format = new DecimalFormat(pattern);`のような形で
  * DecimalFormatで`\`を使いたければ`\u00a5`
  * DateFormatは `DateFormat format = DateFormat.getInstance();` のような形で(new できない)
  * SimpleDateFormatは `SimpleDateFormat format = new SimpleDateFormat(pattern);` のような形で
  * (個人的に)あまり使わないSimpleDateFormatのパターン文字

    | 文字 | 意味 | 出力例 |
    |:---:|:---:|:---:|
    | G | 紀元 | 2016 |
    | E | 曜日 | 火, Tue |
    | a | 午前/午後 | 午後, PM |
    | SS | ミリ秒 | |
    | z | タイムゾーン | JST |

 * パターン中での `''` は単一引用符

* 正規表現
  * Matcherの引数CharSequenceは、StringやStringBuilderのスーパーインタフェース
  * Matcherのメソッドたち

    ```java
    Pattern p = Pattern.compile("(?<=SE)\\d");
    Matcher m = p.matcher("Java SE6 Gold");
    System.out.println(m.find()); // true
    System.out.println(m.group()); // 6
    System.out.println(m.start()); // 7
    System.out.println(m.end()); // 8
    System.out.println(m.replaceAll("7")); // Java SE7 Gold
    ```

  * `String.replaceAll(str1, str2);` は第1引数に正規表現をとる
  * `String.replace(str1, str2);` は第1引数に単純な文字列をとる
  * `String.valueOf(obj);` はstaticメソッドなので、以下でも大丈夫

    ```java
    String str = null;
    str.valueOf(10); // 10
    ``` 

正規表現と聞くと、この格言(?)を思い出しますよね。
> 一つの問題に直面した時，「なるほど、正規表現を使えばいいのか．」と考える人がいる。
> こうして彼らは二つの問題を抱えることになる。
http://kiyotakakubo.hatenablog.com/entry/20090518/1242658608
debian4 -> 8 に更新したメモ

OpenVz上にて実施

* sources.listを書き換え
* apt-get update
* apt-get upgrade
* 再起動
* apt-get dist-upgrade

## 問題があった点

* 「既存のコンフィグを上書きしますか？」で思い切って「はい」を選ぶとちょいちょい動かなくなるサービスがあるので、都度設定ファイルを手直しした。
* dpkgの途中で数分サービス停止中になることがあるので余裕があるときに行うこと。

## debian 7 -> 8

```bash:/etc/apt/sources.list
deb http://ftp.jp.debian.org/debian jessie contrib main non-free
```

```bash:
apt-get install debian-keyring debian-archive-keyring
apt-get install dpkg
```

* .bashrcで.pythonbrewを読み込むようにしているとlsとか実行できなくなった。
    * 別アカウントでログインしコメントアウトにて解決。
* OpenVzの場合、systemdは入れないこと
MacにNode.js環境を作る(nodebrew)


## 環境
* Mac OS X 10.11.3
* zsh

## homebrewのnodeモジュールをアンインストール
homebrewのnodebrewがすでに入ってる場合はアンインストール

```sh
$ brew uninstall nodebrew
$ brew uninstall node
```

## nodeblewのインストール
`nodeblew`はnode自体のバージョンを管理するツール。他にも似たようなので`nvm`というのがあるらしいけど、zsh使いにはnodebrewの方がいいっぽいので、[公式](https://github.com/hokaccha/nodebrew)を参考にnodeblewをインストールする。

ソースのダウンロード

```sh
$ curl -L git.io/nodebrew | perl - setup
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:02 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:04 --:--:--     0
100 23754  100 23754    0     0   4354      0  0:00:05  0:00:05 --:--:--  4354
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

`.zshrc`にnodebrewのパスを追記

```sh:.zshrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

設定を再読み込み

```sh
$ source ~/.zshrc
```

これでnodebrewのインストール完了。

## Node.jsのインストール
続いてNode.jsをインストールする。

まずはインストール可能なNode.jsを確認。

```sh
$ nodebrew ls-remote
```

現時点での最新stable版は`v5.7.0`だったのでこれをインストールする。
`nodebrew`にはバイナリをインストールする`nodebrew install-binary <version>`という素敵なコマンドが用意されているのでこれを使う。公式もこのコマンドでのインストールを推奨してる。

```sh
$ nodebrew install-binary v5.7.0
Fetching: http://nodejs.org/dist/v5.7.0/node-v5.7.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully
```

nodeがインストールされていることを確認

```sh
$ nodebrew ls
v5.7.0

current: none
```

使用するnodeのバージョンを指定

```sh
$ nodebrew use v5.7.0
use v5.7.0
```

nodeが使えることを確認

```sh
$ node -v
v5.7.0
$ npm -v
3.6.0
```
これでnode.jsのインストール完了。
Fluentdでプラグインを使うと便利になる

#概要
以下を使って、データの内容によってファイル名、パスを動的に変えて出力するメモ

- rewrite_tag_filter 
- file_alternative

こんなかんじ↓
<img src="https://qiita-image-store.s3.amazonaws.com/0/108485/ee155277-578e-4912-67a6-6460584f72bb.png" width="600px">

# 試しにやってみよう

## 1. 「tag」と呼ばれる情報でデータを管理する
　　※tagを付けるってことは、レコードごとにラベル付ける感じです

```
<source> 
　 //データを格納するファイル名を指定
 　 @type tail path /var/tmp/data.csv
 　 //読み込んだ位置を記録するファイルを指定する。（  fluentd daemon を再起動したい場合などの場面でその続きから再開して読み込んでくれる）
   　pos_file /var/tmp/data.log.event.pos 　

　 //各レコードに対してタグを指定する
  　tag foo.id 

　//出力するデータのフォーマットを作る 
   　format /^(?<fooid>[^,]*),(?<foodata>.*)$/ 
</source> 
```
こうなります
<img src="https://qiita-image-store.s3.amazonaws.com/0/108485/3fb8ef4f-50e4-5778-4eea-839b5e78a925.png" width="300px">

## ２. rewrite_tag_filterでレコードにタグを付ける

```
<match foo.id> 
　　//レコードの内容に応じてタグを変更することが出来るプラグイン
   　@type rewrite_tag_filter 
　　 //レコードにタグをつける
   　rewriterule1 fooid (.*) bar.id.$1 
</match> 
```

こうなります
<img src="https://qiita-image-store.s3.amazonaws.com/0/108485/7007dd0f-2e58-567b-1875-fa2d7908ccd0.png" width="500px">




## ３.　file_alternativeとforestでtagによってファイル名、パスを動的に変える

```
<match bar.id.*>
   　@type copy 
   　<store> 
       　　type forest 
　　　　 //タグの一部をディレクトリやファイル名に利用するプラグイン
       　　subtype file_alternative 
       　　<template> 
                // 利用したい要素を選ぶ　${tag_parts[0]}=bar ${tag_parts[1]}=id
           　　path /var/tmp/${tag_parts[2]}/rawdata.csv
       　　</template>
   　</store>
</match>
```

こうなります
<img src="https://qiita-image-store.s3.amazonaws.com/0/108485/4c5f2fb6-7325-ebb2-f89a-719fa179fc65.png" width="400px">




起動
/etc/init.d/td-agent restart

設定ファイル
vi /etc/td-agent/td-agent.conf

プラグインインストール
cd /usr/sbin/
./td-agent-gem install fluent-plugin-rewrite-tag-filter
./td-agent-gem install fluent-plugin-file-alternative
./td-agent-gem install fluent-plugin-forest
ちょいと楽しみにしている書籍

http://www.amazon.co.jp/%E3%83%91%E3%82%BA%E3%83%ABRPG%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E6%BA%90%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE-ebook/dp/B012VQQOKU/ref=sr_1_3?s=books&ie=UTF8&qid=1456792176&sr=1-3&keywords=cocos2d-x

※このリンクから購入しても私に利益はありません(汗

3/14(大型本は3/15)発売予定らしいです。
予約はしてあるので、再来週には手元にあると思います(´・ω・`)
Java8 Proxyでインターフェースデフォルトメソッドを呼び出す

# Proxyでインターフェースデフォルトメソッドを呼び出す

調べた限り、普通にはできない様子。
今回の方法は、リフレクションでどこぞのコンストラクタに無理やりアクセスするので保証はされないソースになってしまっています。  

ちゃんとした（オフィシャルな）方法があるなら知りたいです。  


参考：
https://rmannibucau.wordpress.com/2014/03/27/java-8-default-interface-methods-and-jdk-dynamic-proxies/


```java
	/**
	 * デフォルトメソッド実行
	 */
	private static Object invokeDefaultMethod(Object proxy, Method method, Object[] args) throws Throwable {
		//コンストラクタにリフレクションでアクセス
		Constructor<MethodHandles.Lookup> constructor = MethodHandles.Lookup.class
				.getDeclaredConstructor(Class.class, int.class);
		constructor.setAccessible(true);

		Class<?> declaringClass = method.getDeclaringClass();
		int allModes = MethodHandles.Lookup.PUBLIC | MethodHandles.Lookup.PRIVATE | MethodHandles.Lookup.PROTECTED | MethodHandles.Lookup.PACKAGE;
		return constructor.newInstance(declaringClass, allModes)
				.unreflectSpecial(method, declaringClass)
				.bindTo(proxy)
				.invokeWithArguments(args);
	}
```

実行

```java
			String[] array = { "a", "b", "c" };
			@SuppressWarnings("unchecked")
			List<String> proxyList = (List<String>) Proxy.newProxyInstance(
					Thread.currentThread().getContextClassLoader(),
					new Class<?>[] { List.class },
					(proxy, method, args) -> {
						if (method.isDefault()) {
							return invokeDefaultMethod(proxy, method, args);
						} else if (method.getName().equals("iterator") && method.getParameterCount() == 0) {
							//forEach()内部ではiterator()が必要
							return Arrays.stream(array).iterator();
						}

						throw new UnsupportedOperationException(method.toString());
					});
			//デフォルトメソッドのforEachを実行
			proxyList.forEach(System.out::print);//abc
			System.out.println();
```

# ダメなパターン

普通にこう書きたいところ。

```java
	private static Object invokeDefaultMethod(Object proxy, Method method, Object[] args) throws Throwable {
		Class<?> declaringClass = method.getDeclaringClass();

		return MethodHandles.lookup().in(declaringClass)
				.unreflectSpecial(method, declaringClass)
				.bindTo(proxy)
				.invokeWithArguments(args);
	}
```

しかしこれだとエラー
残念。

```
Exception in thread "main" java.lang.reflect.UndeclaredThrowableException
	at com.sun.proxy.$Proxy0.forEach(Unknown Source)
	at hogehoge.XXXXXX.main(XXXXXX.java:XX)
Caused by: java.lang.IllegalAccessException: no private access for invokespecial: interface java.lang.Iterable, from java.lang.Iterable/public
	at java.lang.invoke.MemberName.makeAccessException(MemberName.java:852)
	at java.lang.invoke.MethodHandles$Lookup.checkSpecialCaller(MethodHandles.java:1568)
	at java.lang.invoke.MethodHandles$Lookup.unreflectSpecial(MethodHandles.java:1227)
	at hogehoge.XXXXXX.invokeDefaultMethod(XXXXXX.java:XX)
	at hogehoge.XXXXXX.lambda$1(XXXXXX.java:XX)
	... 2 more
```
USBチップのベンダーIDとプロダクトID



|Chip名|ベンダーID|プロダクトID|メモ|
|:-:|:-:|:-:|:-:|
|FT232RL|1027|24577|一般的によく使われる |
|FT232H|1027|24596| |
|FT231X|1027|24597| |
|FT2232C/D/HL|1027|24592| |
|FT4232HL|1027|24593| |
|FT230X|1027|24597| |
|REX-USB60F|1412|45088| |
|A16U2|9025|*|Arduino.ccで使われる|
|A16U2|10755|*|Arduino.orgで使われる|
技術英語 > So it's a reward system? / No, it's a respect system. / RHYME / What do they have in common?

@ AXIS Feb. 2016 > Cover interview: Frank Gehry

フランクが学生のただ働きはさせずきちんとお金を払い、かつ社員に対しては物価指数に合わせてサラリーも上げていくことについて、インタビューアとフランクのやりとり

> **So <font color=red>it's a reward system?</font>**
> No, <font color=red>it's a respect system</font>.

http://ejje.weblio.jp/content/reward

こういうのは「韻が同じ」と言ったのか、忘れた。
1998年ころに受けた英会話クラスで音楽のフレーズは韻を踏んでいる、というようなことを言っていた。
似たようなフレーズで歌詞が構成されていくということ。

~~ライム?~~
RHYMEだった
http://www.ongakuenjoy.com/entry/2015/04/08/222222
http://eow.alc.co.jp/search?q=RHYME&ref=sa

よく見ると、上の２つは別に韻を踏んでなかった。reward/respect:「ら行で始まる」のみ。

What do they have in common?
They start xxx.

「ら行で始まる」という英語フレーズは未消化。
基数変換コマンドまとめ 〜N進数からM進数への変換をいろんな言語で〜

N進数からM進数への変換をしたいときに
各言語でどんなコマンド/関数を使えばいいのかまとめてみた。
基本的な基数である2,8,10,16以外の方法にも言及するつもり。

```
number_str: 変換元の数
from_base : 変換元の基数
to_base   : 変換先の基数
```

# LinuxやUNIXのコマンドライン

```sh
echo "obase=to_base; ibase=from_base; number_str" | bc
```
obase,ibaseで指定できる値は、2以上の整数ならなんでもOK。

ibaseを先に指定すると、obaseで指定する値がibaseで指定した進数で解釈されてしまうので、**obaseを先に指定**したほうが良い。
例えば、

```sh
echo "ibase=16; obase=10; number_str" | bc
```

とした場合、*obaseで指定した10は16進数の'10'と解釈される*ので、

```sh
echo "obase=16; ibase=16; number_str" | bc
```

と解釈されてアウトプットは16進数となる。
あと、16進数のアルファベットは**大文字**じゃないとNGなので注意。

上記をエイリアスにしました。
https://gist.github.com/macoril/2cd76be7577507296a5f8219fe0904a9

10進数⇔16進数, 10進数⇔8進数ならprintfも簡単。

```sh
printf '%d' 0xF #15
printf '%o' 017 #15
printf '%x' 15  #f
printf '%o' 15  #17
```
こっちの場合は小文字でもOK。

# JavaScript

```js
parseInt(number_str, from_base).toString(to_base);
```

parseInt()で一度10進数にしてから[^1]、toStringで変換する。
from_base, to_baseで指定できる値は、2から36までの整数[^2]。

[^1]: 厳密には「10進数」というわけではなく、文字列型から数値型への変換が行われています。コメント欄のscivolaさんのお話を参照してくださいm(..)m
[^2]: [parseInt() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt), [Number.prototype.toString() - JavaScript | MDN]( https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Number/toString)

# Perl

```pl
oct '0b' . number_str;    #  2進数→10進数
oct number_str;           #  8進数→10進数
hex number_str;           # 16進数→10進数
sprintf '%b', number_str; # 10進数→ 2進数
sprintf '%o', number_str; # 10進数→ 8進数
sprintf '%x', number_str; # 10進数→16進数
```

2,8,10,16以外の基数の変換を行いたい場合は
[Math::BaseCalcモジュール](http://search.cpan.org/~kwilliams/Math-BaseCalc-1.017/lib/Math/BaseCalc.pm)を使う。

```pl
use Math::BaseCalc;

$calc7  = new Math::BaseCalc(digits=>[0..6]);
$calc36 = new Math::BaseCalc(digits=>[0..9,'a'..'z']);

$calc36->to_base( $calc7->from_base(number_str) );
```

メジャーな基数用のdigitsは予め用意されている。

```pl
bin => [0,1],
hex => [0..9,'a'..'f'],
HEX => [0..9,'A'..'F'],
oct => [0..7],
64  => ['A'..'Z','a'..'z',0..9,'+','/'],
62  => [0..9,'a'..'z','A'..'Z'],
```

# PHP

```php
base_convert($number_str, $from_base, $to_base);
```

from_base, to_baseで指定できる値は、2から36までの整数[^3]。

decbin(), bindec(), decoct(), octdec(), dechex(), hexdec()とあるけど、base_convert()だけ覚えておけば十分。
わざわざ他を使うメリットってあるのかな？知ってる人教えてーm(..)m

[^3]: [PHP: base_convert - Manual](http://php.net/manual/ja/function.base-convert.php)

# Python

2,8,10,16進数以外の基数の変換を簡単に行う方法はなさそう。

10進数に戻す[^1]のは下記の方法でできる。

```python
int(number_str, from_base)
```

10進数からの変換は、bin(), oct(), hex()、あるいは、8進数、16進数なら文字列フォーマット操作を使うのが簡単。

```python
'%o' % number_str #8進数へ
'%x' % number_str #16進数へ
```


# Ruby

```ruby
number_str.to_i(from_base).to_s(to_base)
```

from_base, to_baseで指定できる値は、2から36までの整数[^4]（from_baseには0の指定も可能）。
JavaScriptと同じで、to_i()で一度10進数に戻してから[^1]、to_s()で変換する。

[^4]: [instance method String#to_i (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/method/String/i/to_i.html), [instance method Integer#to_s (Ruby 2.3.0)](http://docs.ruby-lang.org/ja/2.3.0/method/Integer/i/to_s.html)