OmniAICreator/Qiita-1.07M huggingface dataset:
最速でコードを書こう！本当に便利なsublime textのショートカット６選！

sublime textを使い始めて約半年が経ち、やっとsublime textの"良さ"が分かってきました。

今から紹介する６つのショートカットは非常に強力です。
これらのショートカットを利用して、ストレスなくコーディングしていきましょう。
ショートカットは覚えられないほどあるので、本当に良く使うショートカットだけ選びました。
###1. マルチセレクト　★★★

Windows:	Control + D
Mac    :	Command + D

選択した文字列と同じ文字列を次々選択し、同時に編集することができます。
クラスの編集など、同じ文字列が多数あるものの変更に役立ちます。
<img width="299" alt="スクリーンショット 2016-04-11 15.09.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/28069257-e538-3845-d451-6ce37dc22939.png">

<img width="301" alt="スクリーンショット 2016-04-11 15.09.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/9f9ec2bb-ad06-f92d-3ea6-910e798462a5.png">

<img width="302" alt="スクリーンショット 2016-04-11 15.09.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/88d75d86-be8b-c9c7-1b7c-e70e57dfe123.png">

###2. 矩形選択　★★☆
Windows:	Shift + 右ドラッグ
Mac	:       Option + 左ドラッグ

ドラッグして範囲選択することができます。
要素が縦に並んでいる時に、同時に編集できます。

<img width="300" alt="スクリーンショット 2016-04-11 15.12.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/3d22cba0-ea80-7d51-272f-eb1569a4cc98.png">

<img width="300" alt="スクリーンショット 2016-04-11 15.13.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/1fc5d96e-eda1-9071-18d5-f354f73e398e.png">

<img width="300" alt="スクリーンショット 2016-04-11 15.13.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/47a399a2-31c4-b3dd-f02f-b279e09d7df1.png">

###3. クォーテションマークなどで囲む　★★☆
範囲選択した後に、クォーテーションマークを打つことで、選択した範囲の外側にクォーテーションマークを追加できます。

<img width="298" alt="スクリーンショット 2016-04-11 15.16.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/4b31f2ff-6969-ef8f-c6bf-29882ee204b3.png">

<img width="300" alt="スクリーンショット 2016-04-11 15.17.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/1f8b61db-823d-6371-2861-47b03042ecee.png">

###4. コメントアウト　★★☆
Windows:	Ctrl + /
Mac	:      	command + /

行を簡単にコメントアウトできます。
範囲選択してから行うと、複数行を一瞬でコメントアウトできるので本当に便利です。
<img width="302" alt="スクリーンショット 2016-04-11 15.18.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/7cda7ac8-ca6e-06d5-0e92-95183e0b009f.png">

<img width="302" alt="スクリーンショット 2016-04-11 15.18.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/00c96a5d-423f-1690-86eb-0f91843c3e5f.png">

###5. 行のコピーなど（comandキー周辺）　★★★
コピー/貼り付け
Windows:	Ctrl + C/V
Mac	:      	command + C/V

commandやCtrlは、本当に便利で、
command　+　enter/return で下一列に改行することができたり、
command + shift + enter/return で上一列に改行することができたりと
便利です。commandとshiftの組み合わせは便利なことが多いので色々確かめてみてください。

<img width="300" alt="スクリーンショット 2016-04-11 15.00.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/cb6e119e-01df-6786-2ff4-666473e82e9c.png">

<img width="299" alt="スクリーンショット 2016-04-11 15.02.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/5fb92258-ca9c-47ad-1015-1845cf72a9ec.png">
###6. 指定フォルダ内の全ファイルを検索→一括置換★★☆
Windows	Control + Alt + F
Mac	Command + Shift + F

で、指定フォルダ内の全ファイルを検索や一括置換することができます。
一括置換はリスクがあるのであまり使いませんが、全ファイル検索は、検索後、検索にヒットしたファイルを簡単に開くことができるのおすすめです。
<img width="1274" alt="スクリーンショット 2016-04-11 15.23.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/115198/251b5fb3-627c-7e07-4ef2-7faaaf442247.png">
/var/lib/docker/tmpをtmpfsにすると動作が早くなる

## docker pullの動作

1. `/var/lib/docker/tmp`に圧縮されたイメージをダウンロード
1. `/var/lib/docker/aufs`に展開
1. `/var/lib/docker/tmp`を空にする

/var/lib/docker/tmp に何百MBも書き込みが行われるのでSSDに優しくない。

## その他

* docker buildの場合`/var/lib/docker/tmp`に圧縮されたイメージを展開
    * 親子関係がある場合、それも展開
* saveもexportもimportも同じ様子。

## fstab

```bash:/etc/fstab
tmpfs   /var/cache/apt          tmpfs  defaults,nofail   0     0
tmpfs   /tmp                    tmpfs  defaults,nofail   0     0
tmpfs   /var/lib/docker/tmp     tmpfs  defaults,nofail   0     0
```

* OS再起動し早くなった気がすることを確認。

## 全部tmpfsでやりたい！場合

```bash:/etc/fstab
tmpfs   /var/lib/docker     tmpfs  defaults,nofail   0     0
```

* データを失わないように定期的にバックアップすること。


### tmpfsはメモリがなくなるとswap領域を使い出す

* CPUが余っている場合

```bash:
apt-get install -y zram-config
systemctl start zram-config
```

* [zram](https://www.kernel.org/doc/Documentation/blockdev/zram.txt)

```bash:容量確認
cat /sys/devices/virtual/block/zram0/{compr,orig}_data_size
```
技術英語 > リスニング > Endress+Hauser > The Temperature Law: E+H = degC > Part 5

温度測定の技術に関しての面白そうな動画
http://qiita.com/7of9/items/d828a48977f038182939
のリスニングの続き

@ Endress+Hauser > The Temperature Law: E+H = degC
https://www.youtube.com/watch?v=vnLyPVAb81s&list=WL&index=45

赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。

(6:00-)
[Rosetta](https://en.wikipedia.org/wiki/Rosetta_(spacecraft))の画像が出てくる。Started:2nd March 2004. On board Technology by Endress+Hauserという記載がある。

International standards and specifications are certainly taken into account, as are unusual applications. How does Enress+Hauser always manage to be one step ahead and supply optimally designed measuring technology for such a wide variety of industries and applications. 

(6:28-)
以下は字幕
By not just producing temperature measurement devices but also all the others, such as for pressure and flow measurement. 

The company gives our employees many opportunities to develop their skills!

Because our services is available around the clock and worldwide!

(6:50-)
From micro to macro, so while thermometers look similar, they differ, but temperature is always defined.


完了。
技術英語 > each press of the MicroZed board's pushbutton would produce [an indeterminate number of] triggers

@ Adam Taylor MicroZed Chronicles - Using the Zynq 101 [Kindle Edition]

No. 606/2129

contact bounce (chattering)関連

> ,each press of the MicroZed board's pushbutton would produce <font color=red>an indeterminate number of</font> triggers ...

http://ejje.weblio.jp/content/indeterminate
>不確定の、不定の、明確でない、漠然とした、あいまいな、未解決の、未定の
arduinoでusb host その６

#概要
arduino unoにusb hostつないで、androidのデバイス　ディスクプリターとってみた。
androidは、HT-03Aです。
#結果
```
Start

Addr:1(0.0.1)


01
--

Device descriptor>>
Descriptor Length:      12
Descriptor type:        01
USB version:            0102
Device class:           00
Device Subclass:        00
Device Protocol:        00
Max.packet size:        40
Vendor  ID:             0BB4
Product ID:             0C02
Revision ID:            0100
Mfg.string index:       03
Prod.string index:      02
Serial number index:    01
Number of conf.:        01

Configuration descriptor>>
Total length:           0037
Num.intf:               02
Conf.value:             01
Conf.string:            00
Attr.:                  80
Max.pwr:                80

Interface descriptor>>
Intf.number:            00
Alt.:                   00
Endpoints:              02
Intf. Class:            08
Intf. Subclass:         06
Intf. Protocol:         50
Intf.string:            00

Endpoint descriptor>>
Endpoint address:       01
Attr.:                  02
Max.pkt size:           0040
Polling interval:       00

Endpoint descriptor>>
Endpoint address:       81
Attr.:                  02
Max.pkt size:           0040
Polling interval:       00

Interface descriptor>>
Intf.number:            01
Alt.:                   00
Endpoints:              02
Intf. Class:            FF
Intf. Subclass:         42
Intf. Protocol:         01
Intf.string:            00

Endpoint descriptor>>
Endpoint address:       02
Attr.:                  02
Max.pkt size:           0040
Polling interval:       00

Endpoint descriptor>>
Endpoint address:       82
Attr.:                  02
Max.pkt size:           0040
Polling interval:       00


```
HTML,CSS勉強メモ #15 〜画像付きリスト横並びに成功〜

＃14でのハマってるその１が解決しました

##**進度**##
mainの画像付きリストが横並びにならない件解決

##**メモ**##
###幅の問題
`li`の横幅が広すぎました。

親要素のスタイル

```css
#contants{
float: left;
width: 400px;
height: auto;
}
```

`li`のスタイル

```css
ul.products{
margin-bottom: 14px;
text-align: center;
}

ul.products>li{
fliat: left;
width: 400px;  /* ←ここ */
display: inline-block;
}
```

つまり、幅が広すぎたのです。これを`100px`にしたら無事横並びになりました。

- なぜ`400px`にしていたのか
 - `li`全体の幅と勘違いしていたから。
- なぜ判明したか
 - `border`で領域がどうなっているか確認しました。同じようなミスが実は度々あって、その場合領域がどうなっているか確認するために枠線を付けてみるのです。そうすると今回のような勘違いに気づけます。


長々ハマってしまいましたが、ようやく先へ進めそうです。
一応修正したソースを貼っておきます。

[画像付きリスト修正後](https://github.com/marin-takagi/tutorial/commit/5011bffaa47e81c18e8f581e4b92b3cf56b81bc4)
HTML,CSS勉強メモ #14'

##**ソースを貼ってみます**##
未だGitHubの使い方はイマイチですが、とりあえずこれまでのソースを貼っておこうと思います。
かなり見づらいと思いますが、コメントアウトしている部分は試行錯誤の後です。

[HP作成練習](https://github.com/marin-takagi/tutorial/commit/20cfc45591dc1f616628ab645fa1ea3c74af15a5)
terminal起動時に毎回bashエラーが表示される

`brew doctor`を動かしたところどうやらpyenvの置き場が原因でwarningをもらっていたので色々といじっていたら何故かterminalを起動した際に毎回以下のエラ−が表示される始末に。

```
-bash: pyenv: command not found
-bash: pyenv: command not found
```

>_〜/.bash_profile , 〜/.bashrc /etc/profileの何処かにpyenvを実行するコードを記述してあることが原因です。 
ログイン時に読まれるのは.bash_profileなどのprofile系のファイルになります。 
.bashrcはrun commandの意味で，ログイン時にも呼ばれますがbashというコマンドを単独で使う度呼ばれます。 
試しにbashと打ってみて実行されないようであればprofile系のファイルの何処かにpyenvを実行する記述が入ってると思うのでそれを消去してください。_

どうやらbash自体に問題があるというよりはterminal起動時にも関わってくる`bash_profile`に書き込みが残っていてそれが原因なのではと思い、`touch ~/.bash_profile; open ~/.bash_profile`で起動。

```
export PATH=$PATH:/usr/local/mysql/bin

[[ -s "$HOME/.profile" ]] && source "$HOME/.profile" # Load the default .profile

[[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*

# Setting PATH for Python 3.4
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.4/bin:${PATH}"
export PATH

export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
export TMPDIR="$HOME/tmp"
export PYTHON_PATH=./
eval "$(pyenv init -)" #ここと
eval "$(pyenv virtualenv-init -)" #ここが原因で起動している模様

# Setting PATH for Python 3.4
# The orginal version is saved in .bash_profile.pysave
# PATH="/Library/Frameworks/Python.framework/Versions/3.4/bin:${PATH}"
# export PATH

# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
#PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
#export PATH
alias brew="env PATH=${PATH/\/Users\/hironorisama\/\.pyenv\/shims:/} brew"　
```

元々pyenvをアンインストールしてやり直す予定だったのでpyenv関係のpathを全て消したところ正常な状態に戻った。

#参考にしたリンク

- [Terminalを起動する度にbashエラーが表示される](https://teratail.com/questions/32097?whotofollow)
- [How To Edit Your PATH Environment Variables On Mac OS X](http://hathaway.cc/post/69201163472/how-to-edit-your-path-environment-variables-on-mac)
ヒルベルト＝シュミット型の内積

#前置き
行列もベクトル空間の定義を満たすので、ベクトルと見なすことが出来ます。Fortranに慣れていれば、多次元配列はメモリーに１次元に並んでいるだけなので、行列を一本のベクトルと見なすこと有りかなと納得できると思います。

そうなると、行列に内積を考えて、ただのベクトル空間から計量ベクトル空間に進みたい気持ちも湧いてくるというものです。ヒルベルト＝シュミット型の内積は、そういう二つの行列の間の内積です。定義は、

```math
<A|B>={\rm Tr}(A^*B)
```
のようになっています。ここで$A^*$は行列$A$のエルミート共役です。

これは、見かけは面倒ですが、実際は行列$A$の複素共役と行列$B$の対応する各成分の積の和になります。つまり、行列を一次元ベクトルにしたとき、普通のベクトルの内積と一致します。

```math
{\rm Tr}(A^*B)=\sum_{i, j}(\bar{A}_{i,j})({B}_{i,j})
```
成分で書いてある方が単純ですが、Trace を使って書いてあると結果が基底に依らないことが明白になって、好ましいと思われます。

#計算での確認
##プログラム
```fortran
    module m_subs
      implicit none
    contains 
      complex function Hilbert_Schmidt(c, d) 
        complex, intent(in) :: c(:, :), d(:, :)
        Hilbert_Schmidt = trace(matmul(Hermitian_Conjugate(c), d))
      end function Hilbert_Schmidt
     
      function Hermitian_Conjugate(c)
        complex, intent(in) :: c(:, :)
        complex, allocatable :: Hermitian_Conjugate(:, :)
        Hermitian_Conjugate = transpose(conjg(c))
      end function Hermitian_Conjugate  
      
      complex function trace(c)
        complex, intent(in) :: c(:, :)
        integer :: i
        trace = sum( [(c(i, i), i = 1, size(c, 1))] )
      end function trace
    end module m_subs
    
    program HS
      use m_subs
      implicit none
      integer, parameter :: n = 10
      complex :: a(n, n), b(n, n), c, d, e
      complex, allocatable :: s(:), t(:)
      real :: x(n, n), y(n, n)
      call random_seed()
      call random_number(x)
      call random_number(y)
      a = cmplx(x, y)
      call random_number(x)
      call random_number(y)
      b = cmplx(x, y)
      s = reshape(a, [size(a)]) ! 1-dimensional array of size n^2
      t = reshape(b, [size(b)]) ! 1-dimensional array of size n^2
      
      c = Hilbert_Schmidt(a, b) ! Trace(A* B)
      d = sum(conjg(a) * b)     ! sum (A_ij)* (B_ij)
      e = dot_product(s, t)     ! inner-product(A, B) 
      print *, c, d, abs(c - d) / abs(c)
      print *, d, e, abs(d - e) / abs(d)
    end program HS
```
##実行結果
乱数で行列を生成しているので複数回実行してみます。単精度の範囲で結果が一致しているのが分かります。

```
 (51.86407,-2.380983) (51.86405,-2.380983) 2.9404126E-07
 (51.86405,-2.380983) (51.86405,-2.380983) 0.000000
続行するには何かキーを押してください . . .

 (54.13935,4.021431) (54.13936,4.021432) 2.8161699E-07
 (54.13936,4.021432) (54.13936,4.021432) 0.000000
続行するには何かキーを押してください . . .

 (48.62010,5.180973) (48.62009,5.180972) 7.8624716E-08
 (48.62009,5.180972) (48.62009,5.180972) 0.000000
続行するには何かキーを押してください . . .
```
hubot-line-trialを使ってhubotからlinebotに通知させてみた

# はじめに

仕事仲間のNさんが密かに公開したhubot-line-trialがなかなかの優れものだったので使ってみた感じを紹介します。

# hubot-line-trial

- GitHub
 - https://github.com/notok/hubot-line-trial
- 導入方法
 - https://liptonista.wordpress.com/2016/04/10/build-hubot-using-line-bot-api-trial/
- hubot-line-trialについて
 - https://liptonista.wordpress.com/2016/04/11/hubot-line-trial-adapter/

LineのBOT API Accountを用意して、導入方法を見ながら進めていけば導入できると思います。
導入方法はメモ的なので適宜読みかえが必要です。

- Ubuntu以外の場合、heroku-toolbeltのインストール手順は各環境に置き換える
- herokuコマンドは`heroku create <appname>`で成功

自分も同じようにherokuにhubotをデプロイし、うまくいきました。

既にhubotを動かしているという方は以下を行えばよいと思います。(たぶん)

- npmでhubot-line-trialをインストール
- adapterにline-trialを指定
- linebotの各IDを環境変数に設定
- LINE管理画面でコールバック等を設定

# hubot-line-trialで何ができるか？

チャットBOTのhubotの通知をlinebotに対して行えます。つまり、

- linebotの反応をhubotスクリプトで書けます
- 既存のhubotスクリプトを再利用できます**(しかもnpmを使って簡単に！)**

# 試しに自作hubotスクリプトを通知させてみた

自分で作ったhubotスクリプトを自分のlinebotアカウントで通知させてみました。
定番のおみくじです。コードは以下です。

```coffeescript:omikuji.coffee
module.exports = (robot) ->
  robot.respond /おみくじ|omikuji/i, (res) ->
    res.send res.random ['大吉', '吉', '凶', '凶', '大凶', '大凶', '大凶']
```

これをlinebotで通知させると次のようになります。

<img width="375" alt="image1 (1).png" src="https://qiita-image-store.s3.amazonaws.com/0/103339/8f7b3c0e-c0b4-60dd-b10b-49d18dbe8fc5.png">


見事hubotがlinebotに通知してくれています。
linebot周りの処理を意識せずに、簡潔にコードを書けるというのも利点かもしれません。

# npmでもってきたhubotスクリプトを通知させてみた

hubotスクリプトを使う利点として、既存のhubotスクリプトを再利用することが挙げられます。
以下が参考になると思います。

- http://qiita.com/hirosat/items/dd292490b12b6ce8bdbc
- https://github.com/hubot-scripts
- https://hubot-script-catalog.herokuapp.com/

今回は日本の天気を教えてくれるhubot-weather-jaを使わせていただきました。

- https://www.npmjs.com/package/hubot-weather-ja

導入は以下でできました。

1. `npm install hubot-weather-ja`
2. external-scripts.jsonにhubot-weather-jaを追加
3. package.jsonのdependenciesにhubot-weather-jaを追加
4. `git add .`
5. `git commit -m 'Add weather-ja'`
6. `git push heroku master`

自分でコード書かなくていいのが嬉しいです。
これをlinebotで通知させると次のようになります。

<img width="375" alt="image1.png" src="https://qiita-image-store.s3.amazonaws.com/0/103339/e5d64b1c-b6bd-fcc3-78e7-2ad268be4123.png">


hubotスクリプトは他にもRedmine連携できるもの、GitHub連携できるものなどたくさんあるので色々なことが簡単にできると思います。

# 最後に

hubotを使っている方、使っていない方、ぜひhubot-line-trialを使ってみてください。
作者の方もきっと喜びます。
aws ec2,g2.2xlarge,ubuntu 14.04環境にcaffe整備。特にfully convolutional networks for semantic segmentationを動くようにする。


基本的には既存ブログを踏襲しています。

pyenvとminicondaのインストール。conda上の機械学習環境ml_envまでは作成せず。必要ライブラリはcondaで適宜インストール。
参考：http://qiita.com/icoxfog417/items/950b8af9100b64c0d8f9

aws ec2, ubuntu環境におけるcaffe環境整備を以下ブログを踏襲して動作確認（ubuntu14.04,CUDA7.0,cuDNNv3）
参考：https://github.com/BVLC/caffe/wiki/Install-Caffe-on-EC2-from-scratch-(Ubuntu,-CUDA-7,-cuDNN)
-> 最新のCUDA7.5,cuDNN4.0でもうまく行った。

opencvは2.4.9 (or 2.4.10?)をインストールする
参考：http://www.samontab.com/web/2014/06/installing-opencv-2-4-9-in-ubuntu-14-04-lts/
->opencv3.0.0でも試したがうまく行かず。

opencvのビルド中に
nvcc fatal : Unsupported gpu architecture 'compute_11'
と出たら、以下のサイトを参考にopencv/buildのcmake時にGPU architectureを以下のbashで指定して修正
http://stackoverflow.com/questions/28010399/build-opencv-with-cuda-support

```bash
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_TIFF=ON -D BUILD_EXAMPLES=ON -D CUDA_GENERATION=Auto -D BUILD_NEW_PYTHON_SUPPORT=ON ..
```

NCVPixelOperations.hppに関するエラーが出たら、code内のtemplate関数についているstaticをすべて消す
参考：https://devtalk.nvidia.com/default/topic/793805/opencv-2-4-9-won-t-compile/

opencv install中にlibpng16.so.16等のlinkageエラーが出たら、該当する.so等を見つけてきてldconfigにひも付け。
参考：http://stackoverflow.com/questions/32405035/caffe-installation-opencv-libpng16-so-16-linkage-issues

fully convolutionに関するcaffe整備を行う。ただしGPU（CUDA,cuDNN）利用
参考：http://akiomik.hatenablog.jp/entry/2016/01/10/230118

make runtestのコンパイルエラー回避のため
/usr/lib/x86_64-linux-gnu/libhdf5_hl.so.10
/usr/lib/x86_64-linux-gnu/libhdf5.so.10
を
/usr/lib/x86_64-linux-gnu/libhdf5_hl.so.8
/usr/lib/x86_64-linux-gnu/libhdf5.so.8
へコピーする必要
参考：https://github.com/BVLC/caffe/issues/1463

libdc1394 error: Failed to initialize libdc1394
というエラーが出たら
sudo ln /dev/null /dev/raw1394
で対処
参考：http://stackoverflow.com/questions/12689304/ctypes-error-libdc1394-error-failed-to-initialize-libdc1394

import caffe時にinvalid syntaxが出たらその行を消すなり、..を.にするなりして修正。
（これで本当に良いのかは不明）


#その他参考

ubuntu-desktopをapt-getで入れてしまうと完全にバグるので気をつける。

caffe.ioとnumpyのioが競合するときは下を参考に修正
http://qiita.com/CORDEA/items/9fad27ae024928b6a7b1

aws s3をec2にマウントする
参考：https://www.robusta-hosting.eu/en/blog/development/2015/04/install-s3fs-ubuntu-1404-lts

dropboxのcuiベースな同期をec2上で行う。
参考：http://d.hatena.ne.jp/TrinityT/20141225/1419512389

emacsのpython環境jedi
参考：http://d.hatena.ne.jp/n-channel/20131220/1387551080
Gradle wrapper のバージョン更新についてのメモ

# Gradle wrapper

[Gradle の公式ドキュメント](https://docs.gradle.org/current/userguide/gradle_wrapper.html)では Gradle wrapper をプロジェクトに追加することが推奨されている。 また、Gradle wrapper のためのファイルをリポジトリに入れて管理することも推奨されている。 具体的には下記の 4 ファイル。

* gradlew (Unix Shell script)
* gradlew.bat (Windows batch file)
* gradle/wrapper/gradle-wrapper.jar (Wrapper JAR)
* gradle/wrapper/gradle-wrapper.properties (Wrapper properties)

Gradle wrapper で使用される Gradle のバージョンは `gradle/wrapper/gradle-wrapper.properties` に記述されており、Gradle のバージョンもバージョン管理されることとなる。

# バージョン更新の方法

さて、そんな Gradlew wrapper のバージョンを更新する方法について。

## gradle-wrapper.properties の変更

上に書いたように Gradle のバージョンは `gradle/wrapper/gradle-wrapper.properties` に記述されているので、Gradle wrapper で使用される Gradle のバージョンを更新したい場合は `gradle/wrapper/gradle-wrapper.properties` を書きかえれば良い。

```
distributionUrl = https\://services.gradle.org/distributions/gradle-2.10-all.zip
```

Android Plugin for Gradle のドキュメントでもこの方法が紹介されている。

* [Android Plugin for Gradle Release Notes | Android Developers](http://developer.android.com/intl/ja/tools/revisions/gradle-plugin.html#updating-gradle)

## gradle wrapper にオプション渡す

[Gradle 2.4](https://docs.gradle.org/2.4/release-notes) からは、`gradle wrapper` タスクに `--gradle-version` オプションを指定できるようになっており、これでバージョンを更新することもできる。

```
./gradlew wrapper --gradle-version=2.12
```

バージョン 2.12 現在の挙動を見たところ、やっていることは `gradle/wrapper/gradle-wrapper.properties` を変更しているだけっぽい。 (例えば存在しないバージョンを指定してもエラーにならず `gradle/wrapper/gradle-wrapper.properties` ファイルが書き替えられる。 まじか……。)

## `./gradlew wrapper` し直す

上のどちらかの方法で `gradle/wrapper/gradle-wrapper.properties` の記述を変更すれば、それで `./gradlew` で使用される Gradle のバージョンは変更される。

だが、Gradle のバージョンアップで `gradlew` ファイルや `gradlew.bat` ファイル、`gradle/wrapper/gradle-wrapper.jar` ファイルが変更されていることがたまにあって、それらのファイルも合わせて更新しておきたいところである。 それらのファイルも更新するため、`gradle/wrapper/gradle-wrapper.properties` の記述を変更したあとに `./gradlew wrapper` コマンドを実行すると良い。 Gradle のバージョンアップで Gradle wrapper のファイルに変更があった場合、プロジェクトの既存の Gradle wrapper のファイルが更新される。

しなかったからといって困ることはないと思うけど、せっかくなので。
webstormで絶対パスでもコードジャンプさせる方法

## やり方
- preferencesを開く(ショートカット：cmd + ,)
- Projectをクリック
- Directoriesをクリック
- sorceフォルダを選択(srcとか)
- Mark as:のResource Rootをクリック(紫色のフォルダ)
- OKをクリック

## 参考
### Configuring Folders Within a Content Root
https://www.jetbrains.com/help/webstorm/2016.1/configuring-folders-within-a-content-root.html
Windowsでインストーラーで入れたnode.jsを消してnodistで入れ直す


# 作業前に

念の為に

```
npm list -g
```

を書き出して保存しておきましょう。

# nodist導入

[nodistでNode.jsをバージョン管理](http://qiita.com/satoyan419/items/56e0b5f35912b9374305)

これまんまでいいです。「Node.jsのインストール」の項を全部やってください。ただしこれ終了時点ではpathの関係で古い方のnode.jsが呼ばれていると思います。

# node.jsのアンインストーラー実行

"プログラムと機能"からnodejsアンインストーラを起動する。

cf.)http://sushichop.blogspot.jp/2013/09/nodejswindows.html

# 確認

```
node -v
```

して、nodistで入れたバージョンになってたらいいです。

この時点でnpmはそのままのはずです。
Macでpdfの文書をtxtに変換する方法

## pdfの文書をtxtに変換する方法
注意としてはpdf自身にはOCR(画像などに含まれる文字を認識してくれる)してなければできません。つまりpdfの文字がコピーできたりすればok  
OCRがされていないPDFの場合あらかじめ何かしらの手段でPDFにOCRをかけましょう(有名どころだとAdobe Acrobatだとすぐにできそうですね[未確認])
  
### 方法
- - -
1.Macのapplicationのその他からAutomatorというアプリを起動してください
![スクリーンショット 2016-04-12 0.46.54.png](https://qiita-image-store.s3.amazonaws.com/0/104186/f147e391-ceb7-1cd5-c9ce-c762f7590028.png)

2.起動したら新規書類を選択、次にワークフローを選択してください
![スクリーンショット 2016-04-12 0.47.37.png](https://qiita-image-store.s3.amazonaws.com/0/104186/bd037e7a-1305-6825-54f8-56c5cf0b50c9.png)

3.変換したいpdfをドラック&ドロップしてください
4.ドラック&ドロップしたら🔎検索で「PDFのテキストを取り出す」を選択してください
![スクリーンショット 2016-04-12 0.44.05.png](https://qiita-image-store.s3.amazonaws.com/0/104186/659f5f92-7b73-1c6d-08ce-2427abaafa8b.png)

5.右上の実行を押してください
6.保存先に.txtファイルができているはずです

以上でPDFの文書が無事txtに変換できているはずです
(精度は察してください)
よく使うCLIのショートカット（bash）

以前、以下の内容を投稿しました。
[新しいLinuxサーバにログイン時確認すること](http://qiita.com/kaikusakari/items/8c6bc5b18074d0ad17e7)

後輩の方などに説明する際に利用していましたが、今回の題でも整理いたします。すでにインターネット上には、いろんな方が整理・まとめていますが、私がよく使うという観点でまとめてみます。

##環境
CentOS7.2（bash）を利用します。

**Ctrl + a**
カーソルを先頭に移動します。
コマンドをコピーペーストした後で、オプションを追加する場合など。

```bash
[Alnitak@user ~]$ PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:　[corsor]
[Alnitak@user ~]$ [corsor]PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:　
```

**Ctrl + e**
カーソルを末尾に移動します。
コマンド後に続けて、|(パイプ)などで処理を追加する場合など。

```bash
[Alnitak@user ~]$ [corsor]PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:　
[Alnitak@user ~]$ PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:　[corsor]
```

**Ctrl + k**
カーソル位置から末尾の文字を削除します。
1つのファイルを、複数の名前でコピーするなど（そんな状況想像できない。。）

```bash
[Alnitak@user ~]$ PATH=/usr/local/bin:[corsor]/usr/bin:/usr/local/sbin:　
[Alnitak@user ~]$ PATH=/usr/local/bin:[corsor]
```

**Ctrl + s**
一時的にキー入力不可、標準出力に出しません。（Ctrl + qで復帰）
grepや、tailなどで大量の出力がある場合、一時的に出力を止めます。
若手の頃、気付かずこのショートカットを入力してOSの反応がなくなって焦ったのも良い思い出。。

**Ctrl + q**
Ctrl + sで止めた制御を元に戻す

```bash
[Alnitak@user ~]$ None Example
```

**Ctrl + l**
プロンプトを、画面の一番上段に移動します。
作業前や、設定ファイル編集前に画面を整理するなど。

```bash
[Alnitak@user ~]$ None Example
```

**Ctrl + d**
カーソル位置によって、2通りの動きをします。
・コマンドラインに文字を挿入している場合、カーソルに重なっている文字を削除します。バックスペースだと、消したい文字の右側にカーソルを持っていく必要がありますが、これであれば1マス分移動が減ります。
・コマンドラインに文字を入力していない（カーソルのみ）の場合、ログアウト（$ exitと同義)します。

```bash
[Alnitak@user ~]$ None Example
```

**Ctrl + c**
入力している内容を破棄して、新しい行を入力可能とする

```bash
[Alnitak@user ~]$ echo "This is Anfield." [cursor]
[Alnitak@user ~]$ [cursor]
```

今日、新しいサーバに接続すると「ls = ls -aF」というaliasが設定されていました。複数の.shファイル中身を一括で確認していて、「ls | xargs　〜」のようなコマンドを入力したところlsコマンドの-Fオプションにより、.sh*という出力になって、lsコマンドの結果をうまくxargsコマンドに渡せていませんでした。そういえばこんなオプションありましたね。結局、unaliasコマンドでaliasを剥がして作業しました。
できるエンジニアはthefuckしてる

こんな人向け

- 会社では普段と違うPCのためよくtypoする！
- gitコマ○ドうろ覚え！
- コマン○を微妙に間違って覚えてしまってaliasしてる！
- とりあえずThe Fuckしたい！！
- 「fuck！」が口癖！！！

そんなあなたに [**thefuck**](https://github.com/nvbn/thefuck)

# The Fuckイン○トール
## 環境別
### pip
`sudo pip install thefuck`

### brew
`brew install thefuck`
or
`sudo easy_install thefuck`

### apt-get
```
sudo apt-get install python-pip python-dev
sudo pip install psutil thefuck
```

### dnf
```
sudo dnf install python-pip python-devel
sudo pip install thefuck
```

## イ○ストール後
`.bashrc`とか`.bash_profile`とかに`eval "$(thefuck --alias)"`を追記

# 使う
git st○tus

```
$ git sttus
git: 'sttus' is not a git command. See 'git --help'.

Did you mean this?
	status
$ fuck
git status [enter/↑/↓/ctrl+c]
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
```

gi◯

```
$ gi pull
-bash: gi: command not found
$ fuck
git pull [enter/↑/↓/ctrl+c]
remote: Counting objects: 354, done.
remote: Compressing objects: 100% (246/246), done.
remote: Total 354 (delta 85), reused 5 (delta 5), pack-reused 13
```

p○thon

```
$ puthon
-bash: puthon: command not found
$ fuck
python [enter/↑/↓/ctrl+c]
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
```

かんぺき！
これで毎日元気に`fuck`！

昨今windowsでもbashが使えて`apt-get`もできるらしいのでThe Fuckワンチャンあるかも？！
Ruby技術者認定試験Silver 2.1 学習用の個人的なメモ　その５

#クラス/メソッド定義
- クラスはリオープンして再定義する事が可能（以後他へ影響する）
- クラスは特異クラスとして一時的に独自の定義が可能（他へ影響しない）
- メソッドは特異メソッドとして一時的に独自定義が可能（他へ影響しない）
- 親クラスを同時に二つ定義し継承することはできないが、代りにmoduleがある
- moduleはMix-in
- moduleからインスタンス変数へアクセス可能
- 特異クラスからincludeする場合 extend メソッド利用可能
- 標準親クラスのメソッドを子で定義してオーバーライド可能（例：method_missing）
- aliasでメソッド名別名定義が可能
- aliasで別名定義し元のメソッド名をundefし定義を消す事も可能

```class.rb
# class
class Hoge
	def initialize(a)
		@a = a
		p "call Hoge.initialize @a --> #{@a}"
	end
	def method_hoge(a)
		p "call Hoge.method_hoge @a --> #{@a} a --> #{a}"
		@a + a
	end
end

# 派生クラス
class HogeExt < Hoge
	def initialize(a, b)
		p "call HogeExt.initialize a --> #{a}"
		super a
		@a = a + b
		@b = -1
	end

	def method_ext(a)
		p "call HogeExt.method_ext @a --> #{@a}"
		@a + a
	end

	def method_hoge(a)
		@a = @a + a
		p "call HogeExt.method_hoge #{@a}"
		super a
	end

	def method_missing(m, *args)
		p "NoMethodError フック成功！"
		super 
	end

	alias ext method_ext # 別名にして
	undef method_ext     # 大本を消してみる
end

# module
module CommonHoge
	def common_method(a)
		# moduleからインスタンス変数がアクセス可能
		p "call module CommonHoge.common_hoge @b --> #{@b}"
		a * 100
	end
end

module CommonHoge2
	def common_method2(a)
		# moduleからインスタンス変数がアクセス可能
		p "call module CommonHoge2.common_hoge @b --> #{@b}"
		@b * a
	end
end

# リオープンclass
class Hoge
	include CommonHoge
	def method_hage(a)
		p "hage!"
	end
end


work = Hoge.new(1)
p work.method_hoge(2)
p Hoge.ancestors
p Hoge.instance_methods(false)
p work.instance_variables
p work.common_method(10) # --> 1000

def work.test(a)
	p "TOKUI METHOD!"
	@a * 10 + 5
end

p work.test(5)

work = HogeExt.new(1, 2)
p work.method_hoge(2)
p HogeExt.ancestors
p HogeExt.instance_methods(false)
p work.instance_variables

work.method_hage(10) # --> 呼び出し可能
p work.common_method(10)
#p work.test(5)      # --> NoMethodError
def work.test(a)
	p "TOKUI METHOD2!"
	@a * 10 + 5
end
p work.test(5)       # --> 55

# extendを利用しない書き方
class << work
	include CommonHoge2
end
p work.common_method2(25)

work = HogeExt.new(3, 5)
# extendを利用した書き方
work.extend(CommonHoge2)
p work.common_method2(25)


p work.ext(2)        # --> alias側はコールできる
p work.method_ext(2) # --> NoMethodError
```

結果

```
"call Hoge.initialize @a --> 1"
"call Hoge.method_hoge @a --> 1 a --> 2"
3
[Hoge, CommonHoge, Object, Kernel, BasicObject]
[:method_hoge, :method_hage]
[:@a]
"call module CommonHoge.common_hoge @b --> "
1000
"TOKUI METHOD!"
15
"call HogeExt.initialize a --> 1"
"call Hoge.initialize @a --> 1"
"call HogeExt.method_hoge 5"
"call Hoge.method_hoge @a --> 5 a --> 2"
7
[HogeExt, Hoge, CommonHoge, Object, Kernel, BasicObject]
[:method_hoge, :method_missing, :ext]
[:@a, :@b]
"hage!"
"call module CommonHoge.common_hoge @b --> -1"
1000
"TOKUI METHOD2!"
55
"call module CommonHoge2.common_hoge @b --> -1"
-25
"call HogeExt.initialize a --> 3"
"call Hoge.initialize @a --> 3"
"call module CommonHoge2.common_hoge @b --> -1"
-25
"call HogeExt.method_ext @a --> 8"
10
"NoMethodError フック成功！"
class.rb:35:in `method_missing': undefined method `method_ext' for #<HogeExt:0x007f9b24059968 @a=8, @b=-1> (NoMethodError)
	from class.rb:110:in `<main>'
```
新人エンジニアに言っておきたい10箇条

## はじめに

* この記事はタイトルの通り4月で3年目になった私が今年からエンジニアになったタマゴ達に先輩ぶったアドバイスを書いた記事です
* Qiitaが[面白いこと](http://blog.qiita.com/post/141132737319/4yournewlife)をやってるみたいなので便乗します:smile:

## 新人エンジニアに言っておきたい10箇条

（エンジニアに限らない話も多いですが悪しからず）

### その1: メモをとる

新人たるもの毎日新しいことを教わり覚えます。
そして教わったことは次の日になったら忘れます（断言）
次の日でなくても1週間後や1ヶ月後には忘れてる確率が高いです。
教わったことは必ずメモをとりましょう。
「お前、それ前に教えただろ！」を言われないようにがんばりましょう。

### その2: 必ずログを残す

同期や先輩と毎日色んな話をします。
ミーティングをして仕様を決めることもあるかと思います。
「どうしてこうなった」の経緯や話し合って決まった話しの流れなどを必ずログに残しましょう。
後で「言った言わない」の言質をとる意味でも絶対大事。

### その3: 自分のキャパを知る

新人のうちはやりたいことが山程あり、先輩から「これやってみない？」というお誘いも多々あります。
何でもかんでも請け負っているとやがて全てが中途半端になってしまいます。
かく言う私も2年目はやりたい放題手を出して目の前の仕事が全く回っていない、なんてこともありました。
自分の請け負えるキャパシティを知っておくことが大事です。

### その4: 大丈夫じゃないことは大丈夫じゃないと言う

これ超大事。
色々教えてもらって先輩に「どう大丈夫？できそう？」って言われるとついつい「大丈夫です！がんばります！」と返してしまう人、要注意です。
分からないことはハッキリ分からないと言う、大丈夫じゃないことは大丈夫じゃないときちんと言いましょう。
それが成長への近道だと私は思います。

### その5: 空気は読むな

会社に入って早く馴染むために周りの空気を読んで黙っていたり「これを言ったら引かれるのでは？」と新人さんは不安になるものです。
会社は新人さんには新しい風を求めているので淀んだ空気はどんどんぶっ壊していきましょう。
私も後輩に「なんでこうしないんですか？」と言われ「確かに・・・」という気付きがあることが度々あるので、是非是非空気を壊していってください。（ただし良い空気は壊したらあかんで）

### その6: gitは覚えておこう

入った会社でバージョン管理の仕組みを使っていない場合、かなりやばいですが今時滅多にない（はず）です。
仮に会社やプロジェクトで使用していないにしても個人利用でも大変重宝するので`git`くらいは押さえておきましょう。
「このリモートリポジトリをローカルにクローンして。うちのブランチ戦略はこんな感じなんでここからワークブランチ切ってくれればいいよ。修正をコミットしてプッシュしたらこのブランチにプルリク出してくれればこっちでレビューしてマージするから」
とかとか、先輩にこう言われた時に意味を100%理解できているといい感じですね。

### その7: viはリテラシー

エンジニアたるもの1日の大半はエディタに向かっています。
自分の好みで使いやすいエディタを使いましょう。
うちでは`sublime`や`atom`なんかが人気ですね。
ただし`vi`だけは必ず触れるようにしておきましょう。
サーバサイドを触る際にリッチなエディタなんてものは用意されていません。
デフォルトで入っている`vi`を使うことを余儀なくされる場面は多いです。
`vi`のノーマルモード・インサートモード・コマンドモードあたりのモードの考え方を理解し、
ファイルを開く→編集する→保存する→閉じる
くらいの一連の操作は最低限覚えておきましょう。
ちなみに私は学生の頃は`emacs`を触っていて`vi`は全く触っておらずとても苦労しました。
`vi`に慣れるために日常的に使用するようになり、今ではすっかり`vim`おじさんに成長しました。
リテラシーと言わず普段使いできると最高ですね（これ以上は宗教戦争になるのでステマはここまで）

### その8: 周辺ツールと友達になろう

エンジニアたるものエディタと同じくらい眺めるのがコマンドラインやデベロッパーツールです。

* シェルをいじって自分の使いやすい環境にする
* コマンドを叩いて任意の処理が書かれた行やファイルをディレクトリから探しだす
* デベロッパーツールを開いて現在の状態を確認する
* ブレイクポイントを貼って任意の場所の値を見る

実際に手を動かしてプログラムを書く以上に上記のことを頻繁にします。
各種メジャーなツールの使い方は覚えておくと良いでしょう。

### その9: 人に説明する

教わって覚えたことは別の人に説明しましょう。
人から教わって覚えたことはすぐ忘れます（断言）
人に説明する・教えることで自分の知識としての吸収率が格段にあがります。
例えば社内で勉強会を自身で開催するなどを行うと良いと思います。
僕も2年目で社内で`Ruby`と`Rails`の勉強会を開催して知識をより深められた経験があります。

### その10: 腐らない

最後に超大事なことがこれ。
新人たるもの必ずどこかで挫折します。
技術面で全然成長できない、まわりよりも開発速度が遅い・理解力がないなどの悩みが頻発すると思います。
でも腐ってはいけません、初めはみんなそうなのです。
しかし腐ってる間にまわりはどんどん先に進みます。
腐っている時間は無駄です、前に進みましょう。
かく言う私も同期にとんでもない化物がいますが必死に喰らいついています（ただし喰らいつけているとは言っていない）
エンジニアとは過酷なお仕事です。
愚痴を吐くのも大事ですが吐いた後はスッキリして前を向いて進んでいきましょう。

## おわりに

書いてて思いましたが、エンジニアに限った話が少なかったですね:sweat:
まぁいちエンジニアのお節介なアドバイスだと思って読んで頂ければ幸いです:bow:
ECMAScript modulesとCommonJS modulesの使い分け

個人の感想です。

## 規約

- 相対パスは ECMAScript modules で `import`/`export`
- それ以外は Common JS で `require`/`module.exports`

## 意味

- 内界 - プロジェクト内のコードはECMAScript modulesでやり取り
- 外界 - npmパッケージを `require` や、package.jsonの `"main"` へのexportはCommonJSでやり取り

## 例

```js
const fs = require("fs");
const path = require("path");
const mkdirp = require("mkdirp");
const Promise = require("bluebird");
const debug = require("debug")("textlint:cli");
import options from "./options";
import TextLintEngine from "./textlint-engine";
import TextFixEngine from "./textfix-engine";
import Config from "./config/config";
import configInit from "./config/config-initializer";
import TextLintFixer from "./fixer/textlint-fixer";
import Logger from "./util/logger";
```

- https://github.com/textlint/textlint/blob/6fd9273cf0bae467b8739343f3492a6e029a8410/src/cli.js

## その他

- [8.1.1.5 Module Environment Records](https://tc39.github.io/ecma262/#sec-module-environment-records "Module Environment Records")
- [whatwg/loader: Loader Standard](https://github.com/whatwg/loader "whatwg/loader: Loader Standard")
- [16. Modules](http://exploringjs.com/es6/ch_modules.html)
- [ES6 module loading: More complicated than you think - NCZOnline](https://www.nczonline.net/blog/2016/04/es6-module-loading-more-complicated-than-you-think/)
- [ES6 Module Detection in Node · nodejs/node Wiki](https://github.com/nodejs/node/wiki/ES6-Module-Detection-in-Node)
- [TypeScript-Handbook/Namespaces and Modules.md at master · Microsoft/TypeScript-Handbook](https://github.com/Microsoft/TypeScript-Handbook/blob/master/pages/Namespaces%20and%20Modules.md)
- [Typings for NPM Packages · TypeScript](http://www.typescriptlang.org/docs/handbook/typings-for-npm-packages.html)
- [ES6 in Practice](http://www.slideshare.net/teppeis/es6-in-practice)
- [Webpack 2 Tree Shaking Configuration — Modus Create: Front End Development — Medium](https://medium.com/modus-create-front-end-development/webpack-2-tree-shaking-configuration-9f1de90f3233#.4ioj4qosf)
BitBarで為替でも見るか

2017年3月31日修正
[Yahoo!ファイナンスのFX・為替](http://info.finance.yahoo.co.jp/fx/)からのスクレイピングがうまくいかなくなったので、[YQL](https://developer.yahoo.com/yql/)を使うようにコード変更しました。

Macのメニューバーに情報表示できる[BitBar](https://getbitbar.com)というのをインストールしてみた。どんな情報が表示できるかというと、ほぼなんでも。

## プラグインでなんでも表示できる
規定のディレクトリにあるプラグインを一定時間ごとに起動してその結果を表示するのだけれど、公式サイトに結構いろんなプラグインがある。自作もできる。

で、プラグインの正体はスクリプトファイルだ。シェルスクリプトだったりRubyだったりPythonだったり。。。ターミナルの標準出力に出力されたものをメニューバーに表示してくれる。

これなら簡単に作れそう！

## プラグインをワンライナーで作ってみた
最近いきなり円高に振れてきたのでWebから為替データを拾ってきて表示するプラグインを作ってみた。

![bitbar.png](https://qiita-image-store.s3.amazonaws.com/0/32983/90c4f505-7071-8492-b6af-1d145afee26a.png)

<strike>適当に「為替」で検索かけたら[Yahoo!ファイナンスのFX・為替](http://info.finance.yahoo.co.jp/fx/)のページが引っかかったので、ここからデータを取ることにしました。</strike>
[YQL](https://developer.yahoo.com/yql/)を使って取得した為替データを力技でぶった切っています。

```
curl -s -m 30 'https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.xchange%20where%20pair%20in%20(%22USDJPY%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys' | sed 's/^.*Rate":"/USD\/JPY=/' | cut -d '"' -f 1
```

これにshebangを付け加えて適当に`fx.1m.sh`などと名前を付けて保存。実行属性を付けてやるとBitBarが規定の間隔で結果を表示してくれます。

ファイル名の拡張子の前にあるのが動作間隔。数字+単位で表現します。単位は以下のとおり。

- s=秒
- m=分
- h=時
- d=日

すごく簡単。そして便利かも。

もう少しちゃんとしたのができたら公式にcontributeしてみたいな。
underscoreコードリーディング（result）

underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##resultとは


###[underscorejs.orgのresult](http://underscorejs.org/#result)

こんな説明。
>####_.result(object, property, [defaultValue]) 
> If the value of the named property is a function then invoke it with the object as context; otherwise, return it.
> If a default value is provided and the property doesn't exist or is undefined then the default will be returned.
> If defaultValue is a function its result will be returned.


```javascript
var object = {cheese: 'crumpets', stuff: function(){ return 'nonsense'; }};
_.result(object, 'cheese');
=> "crumpets"
_.result(object, 'stuff');
=> "nonsense"
_.result(object, 'meat', 'ham');
=> "ham"
```

------------- 
valueが関数の名前だった場合、その関数を利用してその結果を返します。そうでない場合、それを返します。
デフォルトの値が与えられていて、そのプロパティが存在しないもしくはundefinedだった場合は、デフォルトの値を返します。
defaultValueが関数なら、それを返します(?)


###[underscore.result](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L1363)
コード的にはこのあたり。

```javascript

  // If the value of the named `property` is a function then invoke it with the
  // `object` as context; otherwise, return it.
  _.result = function(object, property, fallback) {
    var value = object == null ? void 0 : object[property];
    if (value === void 0) {
      value = fallback;
    }
    return _.isFunction(value) ? value.call(object) : value;
  };

```

引数はobject,property,fallbackの３つ。
変数valueにobjectがnullの場合はvoid 0(undefined)を、そうでない場合はobject[property]を入れる。
valueが void 0だった場合、valueにfallbackを代入する。
_.isFunctionにvalueを渡した結果が関数だった場合、objectを渡してvalueをcallしたものを返し、そうでない場合はvalueを返す。
Elixir入門（４）

勉強したことをほぼ写経するだけ

# Function

```
iex> sum = fn (a, b) -> a + b end
#Function<12.54118792/2 in :erl_eval.expr/5>
iex> sum.(1, 2)
3

# 引数は"()"なしでもOK
iex> sum = fn a, b -> a + b end
#Function<12.54118792/2 in :erl_eval.expr/5>
iex> sum.(1, 2)
3

# こんなこともできる
iex> f1 = fn -> fn -> "Hello" end end
#Function<20.54118792/0 in :erl_eval.expr/5>
iex> f1.()
#Function<20.54118792/0 in :erl_eval.expr/5>
iex> f1.().()
"Hello"

# スコープはゆるい
iex> f1 = fn name -> (fn -> "Hello #{name}" end) end
#Function<6.54118792/1 in :erl_eval.expr/5>
iex> f2 = f1.("hoge")
#Function<20.54118792/0 in :erl_eval.expr/5>
iex> f2.()
"Hello hoge"

# 関数も引数に渡せる
iex> f1 = fn n -> n * 2 end
#Function<6.54118792/1 in :erl_eval.expr/5>
iex> f2 = fn f, n -> f.(n) + 1 end
#Function<12.54118792/2 in :erl_eval.expr/5>
iex> f2.(f1, 2)
5
```

# & Notation

```
# "fn p1 -> p1 + 1 end"
iex> add = &(&1 + 1)
#Function<6.54118792/1 in :erl_eval.expr/5>
iex> add.(2)
3

# "fn p1, p2 -> p1 + p2 end"になると思わせて、"p1 + p2"になる
# Optimizerが無名関数を使うか、既存の関数を使うかを判断している
iex> add = &(&1 + &2)
&:erlang.+/2
iex> add.(2, 3)
5
```
pythonでGoogle Spread Sheetをいじる(OAuth)

# 環境

* Mac OSX(El Capitan)
* Python 2.7

# 準備

## Google Drive APIの発行

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

* プロジェクトが無い場合は右上のExampleの箇所から新規プロジェクトの作成を行います

<img width="1133" alt="スクリーンショット 2016-04-11 22.46.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/22527/479abf28-8d75-dede-b81f-7a98dedd1046.png">

* プロジェクト名とIDを決める事が出来ます

<img width="539" alt="スクリーンショット 2016-04-11 22.45.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/22527/3a331dd2-b3a5-3869-0869-0c596d943f1c.png">

## API

* [Google Developers Console](https://console.developers.google.com/)からGoogle Drive APIを有効にします

<img width="849" alt="スクリーンショット 2016-04-11 22.29.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/22527/e4020711-539e-ba8a-6575-de50e1326858.png">  


* APIを有効にしたら左の認証情報を選択し、認証情報を作成 -> サービスアカウントキーを選択します (サービスアカウントが無い場合は作成して下さい)

<img width="719" alt="スクリーンショット 2016-04-11 22.30.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/22527/19128b58-de13-f8a9-e9b7-a74fd9ad57bc.png">

* JSONとP12形式が選択可能ですが、ここではJSONを利用します
 
<img width="534" alt="スクリーンショット 2016-04-11 22.36.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/22527/30629540-73c5-2467-dad2-3b83a81ae152.png">

* 完了するとJSONファイルが自動的にダウンロードされます

## スプレッドシート側の共有設定

* 使用するスプレッドシートの右上にある共有ボタンを押し、ダウンロードしたJSONファイルに記載されている`client_email`の欄のアドレスを入力します

<img width="714" alt="スクリーンショット 2016-04-11 22.53.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/22527/63cef3a4-82fa-b698-6953-5e88f506cd8f.png">

* id

urlの`https://docs.google.com/spreadsheets/d/***********/edit`
アスタリスク部分がidになります

# Python

## ライブラリのインストール

* ライブラリ
 - [oauth2client](https://github.com/google/oauth2client/)  
  `sudo pip install --upgrade oauth2client --ignore-installed six`
 - [gdata](https://github.com/google/gdata-python-client) (google正規: 今回は使わない)  
  `sudo pip install gdata --ignore-installed six`
 - [gspread](https://github.com/burnash/gspread) (こちらの方が便利そうなので今回はこっちを使用します)   
  `sudo pip install gspread --ignore-installed six`


※ El Capitanでは System Integrity Protection (SIP)のせいでpipのinstallが失敗するので、`--ignore-installed six`を最後に付けてます

## Code

* 以前は`SignedJwtAssertionCredentials`クラスが使用されていたのですが、2016/02に[ライブラリのアップデート](https://github.com/google/oauth2client/issues/401)があり`ServiceAccountCredentials`を使うようになりました

```py

import os
import gspread
from oauth2client.service_account import ServiceAccountCredentials

def main():
    scope = ['https://spreadsheets.google.com/feeds']
    doc_id = 'Your doc id'
    path = os.path.expanduser("Path of json file")

    credentials = ServiceAccountCredentials.from_json_keyfile_name(path, scope)
    client = gspread.authorize(credentials)
    gfile   = client.open_by_key(doc_id)
    worksheet  = gfile.sheet1
    records = worksheet.get_all_values()

    for record in records:
        print(record)
 
if __name__ == '__main__':
    main()
```
Apacheの.htaccessで詰まった話

.htaccessを使って
phpファイルの拡張子を消して下記のように
ドメイン/index.php
　　　　↓
ドメイン/index
アクセスできるようにしようとしたら詰まったのでそれの解決方法のお話+備忘録

# .htaccessを利用できるように設定ファイルの変更

設定ファイルとディレクトリのところは読み替えてください

```bash:変更前
$ sudo vim /etc/apache2/sites-available/****.conf

<Directory "/home/name/public_html/">
                Options Indexes FollowSymLinks
                AllowOverride None
                Require all granted
</Directory>
```

.htaccessを利用したいディレクトリの設定のところのAllowOverrideのNoneをAllに変更

```bash:変更後
<Directory "/home/name/public_html/">
                Options Indexes FollowSymLinks
                AllowOverride All
                Require all granted
</Directory>
```

# .htaccessを配置する

```bash:.htaccess
$ vim ~/public_html/.htaccess

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^(.*)$ $1.php
```

# ファイルを作ってアクセスする

```php:index.php
<html>
 <body>
 <?php
   echo "拡張子なしでアクセスできるかのテスト";
 ?>
 </body>
</html>
```

こんなファイルを作りアクセスしてみるが
ドメイン/indexでも、ドメイン/indexでも500エラーが返る。

## 原因を調べる

```bash
$ less /etc/var/log/apache2/error.log

[Mon Apr 11 22:49:20.736625 2016] [core:alert] [pid 19815]  
/home/name/public_html/.htaccess: Invalid command 'RewriteEngine', 
perhaps misspelled or defined by a module not included in the server configuration
```

moduleが入ってないみたいなエラーを見つける。
RewriteEngineがないようなのでmod_rewriteを有効にする。詳しくは[ここ](http://qiita.com/u-akihiro/items/c7a5bb38c34858d00c2a)


```bash
$ cd /etc/apache2/mods-available/
$ sudo a2enmod rewrite
$ sudo service apache2 restart
```

## 再度アクセスする

アクセスができるようになりました。
![スクリーンショット 2016-04-11 23.33.32.png](https://qiita-image-store.s3.amazonaws.com/0/42927/64a17a98-e857-99ac-9dae-75c39b74129f.png)

# 最後に

なんか困ったらエラーログ見てググるとだいたい解決します。
％何とかの意味をまとめてみました

%d 　十進数を扱います。
	%c   　　　文字１個　の場合使用します。
	%s 　複数の文字の場合使用します。
	%f 　実数の場合使用

int        ;     整数用変数。
	double      ;     実数用変数
	char        ;  文字列用変数 ２０文字確保
ネットワーク分析・監視　ツール

とりあえず、リンク

#ネットワークプロトコルアナライザ

##[Wireshark](http://www.wireshark.org/)
ライセンス：GNU General Public License（GPL）
[OSDN Magazine](https://mag.osdn.jp/11/07/07/0454255)
【引用】...中でもWiresharkは使いやすいGUI、OSを選ばないクロスプラットフォーム、850を超す膨大な対応プロトコルから世界中の技術者に愛用され、業界標準とされているツール...以前は「Ethereal」という名前で呼ばれていたが、数年前に商標問題から改称...
![800x600_0.png](https://qiita-image-store.s3.amazonaws.com/0/54159/3aa7502e-aa42-7c25-ea3a-45eacda53dcc.png)


#[SmokePing](http://oss.oetiker.ch/smokeping/)
ライセンス：GNU General Public License （GPL）

#統合運用管理ツール
#[Hinemos](http://www.hinemos.info/)
ライセンス：GNU General Public License （GPL）
開発言語：多分java

#[ZABBIX](http://www.zabbix.com/)-[日本語情報](http://www.zabbix.jp/)
ライセンス：GNU General Public License （GPL） V2
開発言語：ＰＨＰ

#[jffNMS](http://www.jffnms.org/)
ライセンス：GNU General Public License （GPL） V2
開発言語：ＰＨＰ

#[RRDtool](http://oss.oetiker.ch/rrdtool/)
ライセンス：GNU General Public License （GPL）

#[look@lan](http://www.lookatlan.com/)
ライセンス：フリー（個人利用/商用ともに可）

#[Windows Registry Recovery](http://www.mitec.cz/wrr.html)
ライセンス：フリー（個人利用/商用ともに可）

#ネットワーク調査ツール

##[Advanced Port Scanner](http://www.advanced-port-scanner.com/jp/)
ネットワークに接続しているマシン(ip & port)表示。ポートスキャンしてるようなので、自分で管理してるネットワーク以外で動かす時は注意！！ポートスキャンの意味が分からない人は使わない方が無難です。
![aps_main_window.jpg](https://qiita-image-store.s3.amazonaws.com/0/54159/c2472ffc-fd1f-5361-d2d4-cb77af54f4c3.jpeg)

# 備忘メモ
ポートスキャン「nmap」
ドメインやサーバなどの情報収集ツール「Maltego CE」
Webサイトの脆弱性診断ツール「Burp Suite」と「OWASP ZAP」
SQLインジェクションの検証ツール「sqlmap」
ユーザー認証のクラッキングツール「Hydra」
パスワードクラッキングツール「John the Ripper」
システム侵入テストツール「Metasploit Framework」
MetasploitのGUI「Armitage」
脆弱性試験用検体「exploitDB」
xcodeのコマンドラインビルドでenable bitcodeをNoにする

Xcode7からEnable Bitcodeの設定が入り、デフォルトの値がYesになっており
![image](https://qiita-image-store.s3.amazonaws.com/0/6338/f10d6363-fa05-4f48-01e7-1df4f5df56c8.png)

こんなエラーがでる

```
You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
```

普通にXcodeでプロジェクト開いた時はEnable Bitcodeの項目をNoに変えてからやればよいが
コマンドラインからやる場合はどうすればよいか。

```
xcodebuild -target <your target> -configuration <your configuration> ENABLE_BITCODE=NO
```
こんな感じで`ENABLE_BITCODE=NO`のオプションを追加して実行すればいいみたい。
PHP7.0.5に変なバグがあった

先日なんとなくbugs.php.netを眺めてたら、[ずいぶん不可解なバグ](https://bugs.php.net/bug.php?id=71914)を見つけました。

```php
function ref1(&$value) {
    $value = 'bar';
}
function ref2(&$value) {
    if($value==='foo'){
        $value = 'bar';
    }
}
function refswitch1(&$value) {
    switch($value){
    default:
        $value = 'bar';
        break;
    }
}
function refswitch2(&$value) {
    switch($value){
    case 'foo':
        $value = 'bar';
        break;
    }
}

$a = $b = $c = $d = 'foo';
ref1($a); ref2($b); refswitch1($c); refswitch2($d);
var_dump($a, $b, $c, $d);
```

結果はどうなるでしょう。
当然全てbarになりますね。

https://3v4l.org/ZBPUn

何故かPHP7.0.5の$dだけ'foo'になってます。
どういうことだってばよ。
まあ個人的には参照は一切使わないのでこのバグに遭遇することはないのですが。

なお[PHP7.0.6で既に修正済](http://git.php.net/?p=php-src.git;a=commit;h=2e6d70787c93413daecbea529bf0f74fa901d1db)です。


特に関係ないけど[もうひとつ変なバグ](https://bugs.php.net/bug.php?id=71972)を紹介。
こちらはPHP7.0.3以降session_start()できなくなるというものですが、どうして[そこでエラーが出る](https://3v4l.org/CgdNh)のかさっぱりわかりません。
ちなみにsession_id()をコメントアウトするだけで発生しなくなります。
まるで意味がわからんぞ。


特に発展とかもなく、適当にバグを紹介するだけでこのエントリは終わり。
【VBA】セルを選択して削除するをVBAで自動化してみる


せっかく作ったのでまとめてみました。

-

下のような表のデータ値を削除したいときに便利なVBA。

![kobito.1460382345.828478.png](https://qiita-image-store.s3.amazonaws.com/0/33479/69327466-c630-c1f8-cef3-7f897a35f831.png "kobito.1460382345.828478.png")

Selectしたセル基準に範囲選択するときは、

````
Sub sample01()
    
    'セルの選択
    Range("B3").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xltodown)).Select
    
    '文字列の初期化
    Selection.ClearContents
    Range("B3").Select
    
End Sub

````

削除対象のセルが固定されているときは、

````
Sub sample02()
    
    'セルの選択
    Range("B3:D12").Select
    
    '文字列の初期化
    Selection.ClearContents
    Range("B3").Select
    
End Sub

````
carrierwaveのimage_preview_inputでデフォルト画像が表示されるようカスタムする


carrierwaveのwikiで例として提示されている `image_preview_input.rb` を掲題のようにカスタムしてみます。

## やりたいこと

この `image_preview_input.rb` はアップロード済みの画像が存在する場合は、ファイルアップロードフォームの隣にアップロードした画像を表示します。

ただ、画像がアップロードされていない場合は何も表示されないので、今回は「画像がありません」といった旨の画像を表示しようという感じです。

## やったこと

以下が `image_preview_input.rb` です。

```
class ImagePreviewInput < SimpleForm::Inputs::FileInput
  def input(wrapper_options = nil)
    # :preview_version is a custom attribute from :input_html hash, so you can pick custom sizes
    version = input_html_options.delete(:preview_version)
    out = ActiveSupport::SafeBuffer.new # the output buffer we're going to build
    # check if there's an uploaded file (eg: edit mode or form not saved)
    if object.send("#{attribute_name}?")
      # append preview image to output
      out << template.image_tag(object.send(attribute_name).tap {|o| break o.send(version) if version}.send('url'))
    end
    # allow multiple submissions without losing the tmp version
    out << @builder.hidden_field("#{attribute_name}_cache").html_safe
    # append file input. it will work accordingly with your simple_form wrappers
    out << @builder.file_field(attribute_name, input_html_options)
  end
end
```

これをこのようにカスタムします。

```
class ImagePreviewInput < SimpleForm::Inputs::FileInput
  def input(wrapper_options = nil)
	# input_htmlのオプションに:preview_versionがある場合、削除し値を保存
    version = input_html_options.delete(:preview_version)
    
    # 出力の準備
    out = ActiveSupport::SafeBuffer.new
    
    # attribute_nameが存在するか確認
    # 今回の場合、imageが返ってくる
    if object.send("#{attribute_name}?")
      # プレビュー画像の表示
      out << template.image_tag(object.send(attribute_name).tap {|o| break o.send(version) if version}.send('url'))
    else
      # 存在しない場合、デフォルトの画像を表示
      out << template.image_tag('default.png', size: "80x80")
    end
    
    # hidden_fieldとfile_fieldを追加
    out << @builder.hidden_field("#{attribute_name}_cache").html_safe
    out << @builder.file_field(attribute_name, input_html_options)
  end
end
```

これでアップロード済みの画像が存在しない場合は、デフォルトの画像が表示されます。
localhost しか許可していない mysql に HeidiSQL や Workbench でつなぐ

# localhost しか許可していない mysql に HeidiSQL や Workbench でつなぐ

## やりたいこと

- mysql のユーザはすべて localhost のみ
- 22, 80, 443 以外のポートは閉じている
- ssh (root) は繋がる

という状況で Windows から HeidiSQL や Workbench などのビジュアルなソフトで mysql に繋ぎたい。
深淵な理由で localhost 以外の mysql ユーザを作成するのは不可。

## まずやったこと

「ssh が繋がるんだからポートフォワードでリモートの 3306 を引っ張りゃよくね？」って思った。

```sh
ssh -f -N -L 13306:remote-host:3306 user@remote-host
mysql -h 127.0.0.1 -P 13306
```

```
ERROR 1045 (28000): Access denied for user 'user'@'remote-ip' (using password: NO)
```

フォワードされてるし、 `remote-ip` は接続先 IP ですがダメでした。
まさに `user@locahost` しか許可されていないためです。

※ 2016/04/20 追記

コメントで指摘を頂きました。

```sh:local
ssh -f -N -L 13306:localhost:3306 user@remote-host
mysql -h 127.0.0.1 -P 13306
```

で OK です。
私がなにか勘違いしていたみたいです。

※ 追記ここまで

## 次に試したこと

会社の先輩に「socat で unixドメインソケットを引っ張れば出来る」とアドバイスを貰ったので試してみました。
結論から言えば出来ました。

基本的な流れは下記です。

1. socat で mysql の unixドメインソケットを適当なポートで listen (ex. 1234)
2. 1234 は開いていないので ssh でポートフォワード (ex. 2345)
3. 引っ張った 2345 へ mysql 接続すると リモートの mysql へローカル接続できる

まず、リモートの 1234 を引っ張りつつ ssh 接続します。

```sh:local
ssh -L 2345:remote-host:1234 user@remote-host
```

次にリモートの mysql の unixドメインソケット を 1234 で listen します。

```sh:remote
socat TCP-LISTEN:1234,reuseaddr,fork UNIX-CLIENT:/var/lib/mysql/mysql.sock
```

最後にローカルに戻って 2345 へ mysql 接続します。

```sh:local
mysql -h 127.0.0.1 -P 2345
```

すると接続することが出来ます。

```
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 154
Server version: 5.1.73-log Source distribution

mysql> SELECT user();

+----------------+
| user()         |
+----------------+
| user@localhost |
+----------------+
1 row in set (0.00 sec)
```

あとはこのホストに向けて HeidiSQL なり Workbench なりで接続すればビジュアルにデータベースをいじることができます。
ただ、上の手順に記述はないですが `-g` オプションが必要です。

unixドメインソケットでリッスンする系のサービスで色々出来そう。
mysql しか知らないけど…。