OmniAICreator/Qiita-1.07M huggingface dataset:
Gulp で SASS+Bourbon を自動ビルドする

[SASS](http://sass-lang.com/) + [Bourbon](http://bourbon.io/) + [Neat](http://neat.bourbon.io/) でちょっとしたアプリを作ることになりました。手動で SASS をビルドするのは面倒なので、Gulp で変更を監視して自動ビルドする環境を作りましょう。以下はその手順です。


チュートリアル
----
### 必要な Gem と npm パッケージをインストールする

```bash
gem update --system
gem install sass bourbon neat
npm install --save-dev gulp gulp-plumber gulp-sass node-bourbon
```

### Bourbon と Neat のファイル群をインストールする

プロジェクトのルートディレクトリで以下のコマンドを実行します。

```bash
bourbon install
neat install
```

これにより、各種 mixin が格納された `bourbon/` および `neat/` ディレクトリが作成されます。
（邪魔なら `src/sass/` 配下に移動してもOK）

### Gulpfile を設定する

コンパイル元の SASS ファイルが `src/sass/*.sass` にあり、コンパイル後の CSS ファイルを `dist/css/` 配下に出力する場合、以下のような設定になります。

```coffeescript
# gulpfile.coffee

gulp = require 'gulp'
plumber = require 'gulp-plumber'
sass = require 'gulp-sass'
bourbon = require 'node-bourbon'

gulp.task 'sass', ->
  gulp.src 'src/sass/*.sass'
    # Prevent becoming zombie process when build failed
    .pipe plumber(
      errorHandler: (err) ->
        console.log(err.messageFormatted)
        this.emit 'end'
    )
    .pipe sass(
      includePaths: require('node-bourbon').with('dist/css/')
    )
    .pipe gulp.dest 'dist/css/'

gulp.task 'watch', ->
  gulp.watch 'src/sass/*.sass', ['sass']
```

※`.pipe plumber()` は、SASS の記述エラーでコンパイルできなかった時にファイル監視が停止してしまう不具合を防ぎます。

### SASS を書く

```sass
# src/sass/main.sass

@import "bourbon/bourbon"
@import "neat/neat"

body
  @include outer-container

h1
  font-size: golden-ratio(14px, 1)
```

### 実行！

```bash
# 単発ビルド
gulp sass

# SASS ファイルを検知したら自動ビルド
gulp watch
```

問題なく設定できていれば、`dist/css/main.css` に下記の内容のファイルが出力されます。

```css
html {
  box-sizing: border-box; }

*, *::after, *::before {
  box-sizing: inherit; }

body {
  max-width: 68em;
  margin-left: auto;
  margin-right: auto; }
  body::after {
    clear: both;
    content: "";
    display: table; }

h1 {
  font-size: 22.652px; }
```


参考
----
- [node-bourbon](https://www.npmjs.com/package/node-bourbon)
- [thoughtbot/neat: A lightweight, semantic grid framework built with Bourbon](https://github.com/thoughtbot/neat)
- [gulp-sass, gulp-plumberを使うときの注意 - Qiita](http://qiita.com/Quramy/items/5491d8da29d1fe047464)
- [Bourbon x gulp.js - Qiita](http://qiita.com/oreo3@github/items/8ce92be494ee4e3ee303)
rails ページ　URL　作成

`bundle exec rails generate controller ファイル名 index`

結果
```
create  app/controllers/profiele_controller.rb
       route  get 'profiele/index'
      invoke  erb
      create    app/views/profiele
      create    app/views/profiele/index.html.erb
      invoke  test_unit
      create    test/controllers/profiele_controller_test.rb
      invoke  helper
      create    app/helpers/profiele_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/profiele.coffee
      invoke    scss
      create      app/assets/stylesheets/profiele.scss
```
　　　generate controller profile index
　　＝generate controller profile　”profileっていうcontrollerを作成”
　　＝generate (view) index
..........など
    　　　　　　　　　　　　　　　　　　　の省略


 　profiele_controller.rbをcontrollerの中に作成
   index=vi app/views/profiele/index.html.erb作成　
　　ここで編集

.erb =rubyで編集

`vi config/routes.rb`

`root to:'ファイル名#index'`
root にアクセスした時に　to以下に飛ばす
PowerShell で peco (インタラクティブ・フィルタリングツール)っぽいものを作った

下記のような感じで PowerShell で peco っぽいものを作った。なお、選択機能は実装されていない:scream:

![Animation 1.gif](https://qiita-image-store.s3.amazonaws.com/0/36744/1de63e00-971e-c1f9-00a2-d3a139c1a66e.gif)



# :question:なぜ作った

## そのまま peco 使えばいいじゃん

peco は、テキストストリームを扱うコマンドであって、PowerShell のオブジェクトを扱うコマンドではない。そのため、Where-Object のように、オブジェクトをオブジェクトのままフィルタリングすることができない。そのままオブジェクトとしてフィルタリングできるコマンドが欲しかったので作った。


## `Out-GridView -PassThru`で十分じゃん

全くその通りだし、普通は豊富なフィルタリング機能を持つ`Out-GridView`を使うべき。ただ、折角 CLI 使ってるのに GUI に頼りたくないという思いがあったので作った。


# :star:使い方

[リンク先（Gist）](https://gist.github.com/yumura/8df37c22ae1b7942dec7)の、各ファイルをローカルで作って、`poco.psm1` をインポートすれば使えるようになる。


## :memo:クエリの書き方

`:`の後にフィルタリングに使用したいプロパティ名を記述する。そのプロパティ値と比較したい単語を半角スペース区切りで後ろに記述する。なお、各条件は論理積（and） で結合される。
例えば、`:name chrome :id 5`は、`Where-Object {$_.name -match 'chrome' -and $_.id -match '5'}`のように解釈される。

![Animation 1.gif](https://qiita-image-store.s3.amazonaws.com/0/36744/1de63e00-971e-c1f9-00a2-d3a139c1a66e.gif)

`:`のみの一文字の後、あるいはクエリの先頭に`:`で始まらない単語を記述すると、それらの単語は直接オブジェクトと比較される。
例えば、`powershell`は`Where-Object {$_ -match 'powershell'}`のように解釈される。

また、`Alt+R`を押すとフィルタリングに使用される比較演算子を切り替えられる（match, like, eq)。更に、`Alt+C`で c を、`Alt+I`で not を付けたり外したりできる。そのため、比較演算子には match, cmatch, notmatch, cnotmatch, like, clike, ...　が使える。

![Animation 2.gif](https://qiita-image-store.s3.amazonaws.com/0/36744/9d87d556-7fe2-013f-7439-e69afc8cb8f7.gif)


## :musical_keyboard:キーマッピング

[リンク先（Gist）](https://gist.github.com/yumura/8df37c22ae1b7942dec7)の poco_key.ps1 を参照のこと。（実装されてない機能にもマッピングされてたりする。）


# :snowflake:コード

コードは [Gist](https://gist.github.com/yumura/8df37c22ae1b7942dec7) に貼ってある。なお、実装は[オセロゲームを作ろう（１） - PowerShell Memo ](http://d.hatena.ne.jp/newpops/20080511/p1)をコピペしてるので、コードを追うならオセロゲームの方の解説を先に読んだほうが良い。


# :shit:イケてない部分色々

* 入力に対して反応が遅い
    * オブジェクト数が多いともっさりする

* ページングができない
    * 先頭付近のオブジェクトしか確認できない

* 選択ができない
    * クエリを頑張らないと目的のオブジェクトのみを拾えない

* `:`をエスケープする術を用意していない
    * 正規表現なら`[:]`とか書けるけど

* タブ補完がない
    * 長いプロパティ名を頑張って打つしか無い
    * プロパティ名を暗記していないと使えない

* 特殊キーの入力が排除されていない
    * Windowsキーとか押すと文字として認識される 


正直、実用的なコマンドレットを**誰かが作ってくれることを期待している**:stuck_out_tongue_closed_eyes:
[ubuntu]ubuntu14.04にemacs24.5をインストールしてanaconda-modeを使用する

ubuntu14.04だとapt-getでインストールできるemacsは24.3なので、emacs24.5をビルドしてインストールすることにした。
ビルドしてインストールする理由は、anaconda-modeが使いたいからです。
emacs24.3ではうまくanaconda-modeが動かなかったので、emacs24.5に更新することにした。
下記はインストールした時の記録です。

anaconda-modeに関しては[ここ](https://github.com/proofit404/anaconda-mode
)を参照。

# download
http://ftp.gnu.org/gnu/emacs/emacs-24.5.tar.xz
をダウンロードして適当な場所に解凍します。

```
wget http://ftp.gnu.org/gnu/emacs/emacs-24.5.tar.xz
tar -Jxvf emacs-24.5.tar.xz
```

#ビルド環境を整える
sudo apt-get install build-essential
sudo apt-get build-dep emacs24
sudo apt-get install libacl1-dev

## libpng16をビルドする
このままビルドするとmakeで-lpng16が見つかりませんと怒られるので、libpng16をソースコードからビルドする。
下記よりsourceコードをダウンロードする。
http://www.libpng.org/pub/png/libpng.html

```
tar -Jxvf libpng-1.6.21.tar.xz 
cd libpng-1.6.21
./configure
make check
sudo make install
sudo ldconfig
```

## conda update libpng
anaconda のlibpngが15だとエラーがでるので16にupdateする。

```
conda update libpng
```

## fontインストール
一回ビルドしてemacsを起動したらフォントのエラーが出たので、fontをインストールする。

```
apt-get install xfonts-100dpi xfonts-75dpi xfonts-shinonome
```

# emacs ビルド

```
cd emacs-24.5
./configure
make
sudo make install
```

# anaconda mode
https://github.com/proofit404/anaconda-mode
上記を参考にしてanaconda-modeをインストールする。

pakage-installからanaconda-modeをインストール

```
M-x package-install RET anaconda-mode RET
```
list-packagesから選んでも良い。

./emacd.d/init.elに下記記述を追加

```
(add-hook 'python-mode-hook 'anaconda-mode)
```

emacsを起動して、コードを書くとこんな感じになる。

![WS000072.jpg](https://qiita-image-store.s3.amazonaws.com/0/100523/d9157921-ebf5-b9b4-ea47-16f2a2d8be26.jpeg)
今すぐ役立つDroidKaigi 2016セッション5選

Droidkaigi 2016に参加してまいりました。
発表者、関係者のみなさま、ありがとうございました！

さて、DroidKaigiでは全部で45のセッションが催されておりました。
ここではたくさんのセッションの中から **即効性がある** という観点から選んだセッションを５つ、独断と偏見でご紹介します。


# OSSの動向を捉えた実装方針 ( @wasabeef_jp さん)

https://speakerdeck.com/wasabeef/day1-keynote-in-droidkaigi-2016

**ライブラリでとにかく開発を楽にしたい** というアナタには特に効果があると思います。

とにかく膨大な数のライブラリが紹介されています。
有名どころもあればマイナーなものもあるので、一度目を通してみると新しいライブラリとの出会いがあるかもしれませんね。

こちらの記事に、紹介されたライブラリすべてへのリンクが書かれているようです。

[DroidKaigi 2016 で 紹介された Android開発に役立つ ライブラリ 集 と スライドリンクまとめ](http://qiita.com/hidenorly/items/b3ee7f1df5c53cce2873)


# Android Dev Tools Knowledge ( @operandoOS さん)

http://www.slideshare.net/shinobuokano7/android-dev-tools-knowledge

**周辺ツールを駆使して開発を楽にしたい** というアナタにおすすめです。

Android開発者にはおなじみ `adb` コマンドの便利サブコマンドから、Gradleプラグイン、Android Studio (IntelliJ)プラグインまで多岐にわたって紹介されています。

個人的には特に [adb-idea](https://github.com/pbreault/adb-idea) の便利さが半端ではなかったです。
アプリのデータを一発で消去できるので、インストール後の初回起動時にしか再現しないバグの調査で大活躍しました。

# Support Library ノススメ ( @yuichi_araki さん )

http://yaraki.github.io/slides/droidkaigi2016/

今や必須ライブラリとなった **Support Library を正しく理解して活用したい** というアナタは読んだ方が良さそう。

特に Material Design にどう対応させたらいいのかわからない、と悩んでいる方は必見かと。
CoordinatorLayout や Behavior など、最近登場した新しいクラスの使い方のヒントも紹介されています。


# ライブコーディング・Androidのライブラリを作ってみよう ( @mapyo さん)

http://www.slideshare.net/masatakakono1/android-58450612

**Android用のライブラリを作ってみたい** というアナタにおすすめ。

ライブラリ化する箇所のヒントから、JCenterへ公開する具体的な方法までカバーされています。
業務でアプリを作っていると他でも使えそうな機能がちょいちょい出てきたりするので、どんどんライブラリ化して公開して、他の開発者まで幸せにできたら素敵ですね。


# Advanced Kotlin for Android ( @ngsw_taro さん)

https://speakerdeck.com/ntaro/advanced-kotlin-for-android-number-droidkaigi-number-droidkaigib

**Kotlinの便利な使い道を知りたい** というアナタにお役立ち。

最後に紹介されている Double context extension というテクニックはKotlinの評価順序まで知らないと理解できないかもしれませんが、総じてKotlinを使えばAndroid開発はこれだけ楽になる、という知見を得ることができます。

個人的には `val` と `lazy {}` の存在だけでもKotlinを使う価値があると思います。

<hr>

以上、独断と偏見でチョイスした５つでした。

もちろん、他のセッションも十二分に役立つ内容となっていました。
（困っていることや抱えている課題によって役立つかどうかが変わってくるので、真に役立つかどうかは人それぞれ、その時々によります）

ぜひ上記以外のセッションの資料もご覧になってください。

さあどんどん開発するぞ＼＼\\٩( 'ω' )و //／／
Reduxのreducer内でよく使うJavascriptの描き方まとめ

keyとvaluを持つ配列に対して、
keyの重複がないように元の配列を新しい配列で更新し、keyで降順にソートする

```js

state = [
  {key: 1, val: 'aaa'},
  {key: 2, val: 'bbb'},
  {key: 3, val: 'ccc'},
  {key: 4, val: 'ddd'}
];

payload = [
  {key:2, val: 'BBB'},
  {key:3, val: 'CCC'},
  {key:5, val: 'EEE'}
];

const newState = state.filter(o => 
    payload.map(n => n.key).indexOf(o.key) === -1
).concat(payload).sort((a, b) =>
    a.key > b.key ? 1 : -1
);

/*
結果はこちら
[
    {key: 1, val: 'aaa'},
    {key: 2, val: 'BBB'},
    {key: 3, val: 'CCC'},
    {key: 4, val: 'ddd'},
    {key: 5, val: 'EEE'}
]
*/
```


随時更新
Windows 環境で Ruby を2.3に更新したら Dir::glob が日本語のファイルを列挙してくれなくなった→解決

もともとRuby1.9.3環境で動かしていたスクリプトが、Windows10インストールのついでにRuby2.3 に更新したら動かなくなったので直してみた。
コメントでご指摘いただいたのですが、ひょっとしたらRubyのバージョンの話ではなく、OSのバージョンとか、インストールしたRubyパッケージが別物だからという理由かもしれません。
が、ちゃんと検証してないので不明です。すみません。。。


ちなみに、もともとの環境が下記。

```
Windows7 x64
Ruby 1.9.3 p362
http://rubyinstaller.org/
```

で、更新後の環境は下記になります。

```
Windows10 x64
Ruby 2.3.0 p0
http://www.artonx.org/data/asr/
```

動かなくなった箇所はDir::globでファイルを列挙している部分。

もともとのスクリプト

```ruby
#!/bin/ruby
targetFiles = "#{ARGV[0]}/*.ts"
Dir::glob(targetFiles).each {|f|
...
...
```

修正後は以下のような感じ。

```ruby
#!/bin/ruby
targetFiles = File.expand_path("#{ARGV[0]}/*.ts")
Dir::glob(targetFiles.encode('utf-8')).each {|f|
...
...
```

これでおｋでした。



ちなみに、スクリプトの呼び出しはこんな感じで使ってます


```
> encode.rb d:/rec
```
Mac OS X + Vagrant で X11 転送をする

# デモ動画

* Mac から vagrant ssh をして Ubuntu の xeyes とかを立ち上げたところ。
![X11Capture.gif](https://qiita-image-store.s3.amazonaws.com/0/19717/6cd79f32-3c6b-3501-52bb-cd1229fb461a.gif)



# OS

|項目    | バージョン                  |  
|-------|----------------------------|
|ホストOS|Mac OS X EL Capitan(10.11.3)|
|ゲストOS|Ubuntu 14.04 LTS            |

# 利用したソフト

|項目    |バージョン|
|-------|---------|
|vagrant|1.8.1|
|VirtualBox|5.0.10|
|XQuartz   |2.7.8|

# インストール手順
* vagrant, VirtualBox のインストールは省略
* XQuarts を以下のサイトからダウンロードして、Mac にインストール
    * http://www.xquartz.org/
* 適当な場所にディレクトリを掘る

```bash
$ mkdir ubuntu-x11fowarding
$ cd ubuntu-x11forwarding
```

* 以下のような Vagrantfile をディレクトリ内に作る

```rb
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty64"

  # ubuntu-desktop をインストール
  config.vm.provision :shell, :inline => "sudo apt-get update && sudo apt-get install -y ubuntu-desktop"
  # X11 Fowarding を有効にする
  config.ssh.forward_x11 = true

  config.vm.hostname = "ubuntu-xforwarding"
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end
end
```

* 後は以下のコマンドを実行して適当に xeyes を起動してみれば OK

```bash
[Mac]$ vagrant up # VM を立ち上げる
(ubuntu-desktop のインストールが走るのでしばらく待つ)
[Mac]$ vagrant ssh # ssh で接続する
[Ubuntu]$ xeyes
[Ubuntu]$ xclock
```

# 何に使うの？

* qemu や virt-manager を GUI で立ち上げるときに使ってみたり
* Linux 上でしか動かない GUI アプリを検証してみたり(あまりやらないけど)

# 注釈
* ポイントは ```config.ssh.forward_x11 = true```。これだけで X11 転送が有効になる
* ssh コマンドで ```-X``` オプションを利用してもいいし、~/.ssh/config に ```ForwardX11 yes``` を追記しても良い

# 備考
* OS X のバージョンによっては以下の更新が必要かも
    * https://support.apple.com/kb/DL1605?locale=ja_JP
rails file 構成 役割 メモ

Gemfile
　管理ファイル
README
　配布物の一般的な情報を記載したファイルである。
Rakefile
　タスク
app
 メインのアプリケーション、ここにいろいろ書く、アプリケーションを格納するディレクトリ
主要なプログラムはこの配下に格納
　assets/
    スタイルシートや画像などを格納するディレクトリ
　controllers/
    コントローラを格納するディレクトリ*大事、よく使う
　helpers/　
　　ヘルパーを格納するディレクトリ
　mailers/
　　メール系
　models/
　　モデルを格納するディレクトリ*大事、よく使う
　views/
　　見える感じ*大事、よく使う　HTML,CSS,JS
　.swp
   実際にはないが、どっかで
bin（後でコピー）
  bundle
    
  rails
  rake
  setup
config
 設定を書くところ
config.ru
　後で
db
　データを保存するところ
lib
　複数のアプリケーション間で共有するライブラリを格納するディレクトリ
log
　ログファイルが格納されるディレクトリ。ログファイルはアプリケーションと環境ごとに作成される
　　logファイル
　　　　　履歴
public
　Web上に公開するファイルを格納するディレクトリ
test
 テストするディレクトリ（後で）
 アプリケーションのテストに使うファイルを格納するディレクトリ
tmp
 キャッシュなど、一時的なファイルを格納されるディレクトリ
vendor
 ライブラリや他のアプリケーションで共有するような外部ライブラリを格納するディレクトリ

詳しくはhttp://railsdoc.com/rails_base


View (目に見えるもの全て)
　HTML、CSS、JS
Controlー以下ruby
　何を表示するか？
　エラーを返す
Model DBにデータ出し入れ  MVCモデル（検索）
　　　⇅　Ruby
DataBase
　ーmysql
UIScrollViewをlabelの長さなどに応じで自動でスクロールさせるためのAutoLayout制約

記事の内容はこちらを参照してください。
https://mishimay.github.io/754dec7ffe5f202b780c/
<!--

# やりたいこと
- UIScrollViewにlabelなどの可変viewを配置して、その長さに応じてUIScrollViewをスクロールさせたい
- それをコード上ではなく、Interface Builder 上のAutoLayout制約だけで実現したい



# 制約の指定方法

Storyboard上の View Controller に Scroll View を配置しその中にLabelを表示する、という想定で説明します。

1. View Controller に Scroll View を配置する
    - Scroll View の上下左右にスペース0の制約を付ける
        - これで Scroll View の大きさが規定される
1. Scroll View にViewを配置する
    - Viewの上下左右にスペース0の制約を付ける
        - この時点でStoryboardにエラーが出る
        - Scroll View の中身であるViewの大きさかが規定されておらず、どれくらいスクロールさせればいいかわからないため
    - Scroll View とViewに Equal Widths の制約を付ける
        - これで Scroll View の中身の横幅が Scroll View 自体の横幅と同じに固定され、横方向にスクロールさせないことを指定できた
        - 横方向にスクロールさせたい場合は Equal Heights の制約を付ければ良い
1. ViewにLabelを配置する
    - LabelのLinesを0にして、文字列が長い場合には複数行で表示できるようにする
    - Labelの上下左右に適当なスペースの制約を付ける
        - これで Scroll View の中身の高さはLabelの高さに応じて動的に決定されることを規定できた
        - この設定をもってStoryboardのエラーはなくなったはず


![Screen Shot 2016-02-20 at 3.22.41 PM.png](https://qiita-image-store.s3.amazonaws.com/0/23679/31d7ff3b-b2c8-3368-bf19-d632249c3b2a.png)


# 環境
Xcode 7.1 
iOS 9
Swift 2.1


-->
fixで簡単にループを書く

`fix`は関数の最小不動点を求める関数です。

```hs
fix :: (a -> a) -> a
fix f = f (fix f)
```

例えば

```hs
> fix (const "hello")
"hello"
```

常に文字列`"hello"`を返す関数の不動点(入力と出力が同じになる値)は`"hello"`です。(参考: [Haskell/不動点と再帰](https://ja.wikibooks.org/wiki/Haskell/%E4%B8%8D%E5%8B%95%E7%82%B9%E3%81%A8%E5%86%8D%E5%B8%B0))

`fix`といえば無名関数で再帰を書く時に使われる例が有名だと思います

```hs
fact :: Int -> Int
fact = fix $ \f n -> if n == 0 then 1 else n * f (n-1)
```

再帰関数が最小不動点として構成できるというのは凄いですね。(参考: [再帰プログラムの意味論について](http://www.kurims.kyoto-u.ac.jp/~hassei/papers/sugaku07.pdf))

fixで簡単にループを書く
---------------------
`fix`は普段コードを書くときも便利に使えます。例えばユーザーからの入力を反転して出力する動作を`"quit"`という入力が来るまで繰り返すプログラムを考えましょう

```hs
import Control.Monad
import Data.Function

main :: IO ()
main = do
    putStrLn "Start"
    fix $ \loop -> do               -- ループ開始
        str <- getLine              -- 入力待ち
        unless (str == "quit") $ do -- "quit"じゃ無ければ次を実行
            putStrLn (reverse str)  -- 反転して表示
            loop                    -- 繰り返し
    putStrLn "Bye"
```

`fix`を使わない場合`let`を使って再帰関数を一旦定義してから実行するといった手順でもできますが、`fix`を使ったほうが定義と実行が一度にできるのでスッキリすると思います。好みの問題かもしれませんが :expressionless: 

ループに初期値を与える
--------------------
次に先ほどのプログラムに回数制限を設けてみます。`"quit"`と入力されなくても3回ループすると自動的に終わるようにしてみます。

```hs
import Control.Monad
import Data.Function

main :: IO ()
main = do
    putStrLn "Start"
    ($ 3) . fix $ \loop n -> do         -- 初期値に3を与えてループ開始
        unless (n == 0) $ do            -- nが0じゃ無ければ次を実行
            str <- getLine              -- 入力待ち
            unless (str == "quit") $ do -- "quit"かどうか確認
                putStrLn (reverse str)  -- 反転して表示
                loop (n-1)              -- nを1減らして繰り返す
    putStrLn "Bye"
```

`$`を使って`fix`で作った関数に値を適用しています。


fixだよ！！！
-----------------

[無名関数で再帰するjavascript](http://qiita.com/hiroqn@github/items/fe0e71648447595e18b9)
Android 4.4 でもPdfRendererを使えるようするライブラリを作りました


PdfRendererはSDKに追加されたPDFレンダリング用のクラスですが、Android 5.0（API Level 21）未満の端末では使えません。しかしPDFを表示するアプリケーションを作るにあたって4.4以下の端末のサポートを諦めるというのはあまりいい選択ではありません。

しかし、Androidで使える無料のオープンソースのPDFレンダリングエンジンというものは基本的にないといっていいです。あるとしてもとても高価な商用のライブラリ（しかもあまり信用出来ない）であったりとあまりいい感じではありません。

というわけで本題ですが、Android 4.4（API Level 19）でも使えるPdfRenderer互換のライブラリを作りました。

[https://github.com/loilo-inc/loilo-pdf](https://github.com/loilo-inc/loilo-pdf)

Gradleなら以下のようにbuild.gradleに記入することで使えます。

```
repositories {
    maven {
        url 'http://oss.sonatype.org/content/repositories/snapshots'
    }
}

dependencies {
  compile 'tv.loilo.pdf:pdfcompat:0.2.1-SNAPSHOT'
}

```

使い方はこんな感じ。オリジナルのPdfRendererと完全に同じインターフェースになってます。ライセンスはオリジナルと同じApache 2.0です。

```MainActivity.java
// pdf file
File file = new File("file.pdf");
try (ParcelFileDescriptor fd = ParcelFileDescriptor.open(file,ParcelFileDescriptor.MODE_READ_ONLY);
     PdfRendererCompat renderer = new PdfRendererCompat(fd);
) {
    for (int i = 0; i < renderer.getPageCount(); i++) {
        try(PdfRendererCompat.Page page = renderer.openPage(i)){
             Bitmap out = Bitmap.createBitmap(page.getWidth(), page.getHeight(), Bitmap.Config.ARGB_8888);
             Matrix mat = new Matrix();
             mat.setScale(2,2);
             page.render(out, null, mat, PdfRendererCompat.Page.RENDER_MODE_FOR_DISPLAY);
        }
    }
}
```

## 仕組み

Android、というかGoogle ChromeはもともとFoxit SDKという商用のPDFレンダリングエンジンをライセンスして使用していたようなのですが、Android 5.0になるタイミングでpdfiumという名前でオープンソース化しました。ここらへんの事情はよくわかりません。


しかしOSSになったので一応pdfiumのソースはAOSPのリポジトリに存在しています。AndroidのPDF関連の処理はほぼ全てがJNIでネイティブのシェアードライブラリを呼んでいるだけなので、
Android5.0のリポジトリからpdfiumの部分とPdfRendererのJavaクラスをforkしてNDKでビルドすれば、シェアードライブラリとJNIクラスが作れるのでは？というところからスタートしました。

pdfiumのNDKビルドにとても苦労しましたが、なんとか4.4で動く.soをビルドすることができました。

## 4.4未満

ソースコードを見る限りではビルドできそうなのですがJNIの闇に飲まれてビルドできませんでした。ビルドできたという方はプルリクをいただければと思います。
Visual Studio Codeで保存時に行末尾の空白を自動で消す

Lintを有効にしていたりすると空白のみの行や末尾の空白を自動で指摘してくれるが、
消してくれなくてイラッとしたので自動で消すようにする方法を調べた

<img width="308" alt="Story_ts_-_kanban.png" src="https://qiita-image-store.s3.amazonaws.com/0/16612/9031c142-1021-1c15-df34-684d863c5da1.png">

Visual Studio Codeの設定に以下を追加すると保存時に自動で消してくれるようになる。

`"files.trimTrailingWhitespace": true`

また、コマンド入力(macなら `shift+command+p` で呼び出せる)で以下のコマンドを実行すると手動で消すことも出来る。

`Trim Trailing Whitespace`
Visual StudioにBootstrapのツールボックスが追加され



#Visual Studio 2015にBootstrapのツールボックスが追加されてた事にいまさら気づいたのでメモ

以下の映像の中でさらっと紹介されて衝撃を受けたのでメモ
https://channel9.msdn.com/Events/Visual-Studio/Connect-event-2015/100


![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/49910/090621d2-3bbb-7437-4368-558183a61909.jpeg)

ツールバーの中から追加したいものをダブルクリックする事で、コード中に挿入される。
![WS000055.JPG](https://qiita-image-store.s3.amazonaws.com/0/49910/1b352b38-8c3d-eae8-1d52-cf529058fc74.jpeg)

![WS000056.JPG](https://qiita-image-store.s3.amazonaws.com/0/49910/ea666ffc-20d5-f08e-a755-f968c0cf6846.jpeg)


変更したい場合には部分的に文字列を削除すると候補が出てきます。
![WS000057.JPG](https://qiita-image-store.s3.amazonaws.com/0/49910/c256cf17-3fcc-4781-eb9d-a4d2b0c134fd.jpeg)

簡単にアイコンを追加できました。
![WS000059.JPG](https://qiita-image-store.s3.amazonaws.com/0/49910/c52a96f8-8229-68f1-e45c-55bffb027cd7.jpeg)
ubuntu server16.04のデフォルトが nanoになってたので viにしてみる


ubuntu serverを初めてVirtualBoxに入れてみた。
それをポーとフォワーディングしてsshしてみたのだけど、
visudo したところ、nanoで開かれてしまった。
viってついてるコマンドなのに。。。というのはさておき、
以下で変更

```shell-session
$ sudo update-alternatives --config editor
alternative editor (/usr/bin/editor を提供) には 4 個の選択肢があります。


  選択肢    パス              優先度  状態
------------------------------------------------------------
  0            /bin/nano            40        自動モード
  1            /bin/ed             -100       手動モード
  2            /bin/nano            40        手動モード
* 3            /usr/bin/vim.basic   30        手動モード
  4            /usr/bin/vim.tiny    10        手動モード
現在の選択 [*] を保持するには <Enter>、さもなければ選択肢の番号のキーを押してく ださい:

Press enter to keep the current choice[*], or type selection number: 3
```

crontab -e もやってみたらどうなるかと思ったら、
エディターを選べといわれた。

```shell-session
Select an editor.  To change later, run 'select-editor'.
  1. /bin/ed
  2. /bin/nano        <---- easiest
  3. /usr/bin/vim.basic
  4. /usr/bin/vim.tiny
```
nanoお勧めなのかな。。。

とりあえず、Ctrl+Oで保存、Ctrl+Xで終了。
これ知ってれば大丈夫そう。
そう思うと、viより簡単だけど、vi使っている人はvi使いたいよね。
rails アプリ作成　手順

1.バージョン確認
`ruby -v`
  ruby バージョン確認

`rails -v`
　rails バージョン確認

`mysql.server start`
　mysql　サーバー開始

`git --version`
　git バージョン確認

2.ファイル作成
`rails new ファイル名` 
　新規ファイル作成

(スキップok)
`bundle init`
　現在の作業ディレクトリ内に、Gemfileを生成します。

GemfileとはBundler用の設定ファイル。
Bundlerとはアプリケーションで使用するgemのバージョン管理を行うプログラム。
＝http://xxxcaqui.hatenablog.com/entry/2013/02/11/013421

`tail Gemfile`
　追跡

`bundle install --path vendor/bundle`
　　　　　　　　　　　　　場所　
`--path`


 
GEM file
=アプリで使う、モジュールやソフトを書くファイル 
＝新しいものをつくつなら、いろんな機能がある
＝GEM　作る人はすごい

`mv 古い名前　新しい名前`
　リネーム

3.プロジェクト作成
`bundle exec rails new . --skip-bundle`
 railsプロジェクトを作成（bundleを後で実行）

4.サーバー立ち上げ
`bundle exec rails server`
 サーバーを立ち上げる

`ctrl-c`
サーバー削除

アクセス先
　http://localhost:3000/
zshのコマンド補完時に補完前の入力が残ってしまうのを修正

# プロンプトの設定

[ArchWiki](https://wiki.archlinuxjp.org/index.php/Zsh#.E3.83.97.E3.83.AD.E3.83.B3.E3.83.97.E3.83.88)を参考に

```
PROMPT="%{${fg[cyan]}%}$ %~%{${reset_color}%}                                           
${fg[magenta]}[%n]$ ${reset_color}"
```

下1行を`%{ [...] %}`で区切り忘れていた為、カーソルが動いてしまっていた。

なので、以下の様に修正

```
PROMPT="%{${fg[cyan]}%}$ %~%{${reset_color}%}                                           
%{${fg[magenta]}%}[%n]$ %{${reset_color}%}"
```
pryでバックトレースを全部出す

`pry`便利ですよね。便利というか`irb`って基本的に使わないので`pry`しか使ってません。ただ`pry`ってエラーメッセージを最初の一行しか表示してくれないと思ってたんですよ。こんな感じに。

```
TypeError: nil can't be coerced into BigDecimal
from /Users/ironsand/.rbenv/versions/2.2.2/lib/ruby/gems/2.2.0/gems/activesupport-4.2.1/lib/active_support/core_ext/enumerable.rb:24:in `+'
```

まあ、これだけ使われてるツールがそんなわけ無いだろうと思ってやり方調べたら`wtf?`で直前にコマンドのbacktraceを表示してくれるようです。

"What's the fxxk!"の略ですね。綺麗な言葉をコードにかけてあげるとキレイなコードになるそうなのであまり汚い言葉を使わないようにしましょう！

### 参考

http://stackoverflow.com/a/15303592/1536527
arduinoでジャイロ　その２

#概要
arduino unoにジャイロをつないでみた。
mpu6050をi2cでつないだ。
#写真
![MVC-019S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/a69cd574-e1b6-16e1-24a9-ee951fe2e19a.jpeg)

#ログ
![mpu.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/399b48b0-f9ec-5ea1-fbe0-45455036b086.jpeg)

#回路図
![mpu_6050.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/e8a76120-61e0-3648-fa20-e56d75cc9cbe.jpeg)

#サンプルコード
```
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"

MPU6050 mpu;
unsigned long time = 0;
float prev_X = 0;
float prev_Y = 0;
float prev_Z = 0;
float angle_X = 0;
float angle_Y = 0;
float angle_Z = 0;
int t = 0;
void setup()
{
	int gx, gy, gz;
	Wire.begin();
	Serial.begin(115200);
	while (!Serial);
	Serial.println("initialize device ...");
	mpu.initialize();
	delay(900);
	Serial.println(mpu.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
	Serial.println("Updating internal sensor offsets...");
	mpu.setXGyroOffset(-464);
	mpu.setYGyroOffset(-566);
	mpu.setZGyroOffset(232);
	Serial.print(mpu.getXGyroOffset());
	Serial.print("\t");
	Serial.print(mpu.getYGyroOffset());
	Serial.print("\t");
	Serial.println(mpu.getZGyroOffset());
}
void loop()
{
	int az, gx, gy, gz;
	int sampleTime = 10;
	if (millis() - time > sampleTime)
	{
		time = millis();
		t++;
		mpu.getRotation(&gx, &gy, &gz);
		angle_X += ((prev_X + gx) * sampleTime) / 131000;
		prev_X = gx;
		if (angle_X < 0)
		{
			angle_X += 360;
		}
		else if (angle_X >= 360)
		{
			angle_X -= 360;
		}
		angle_Y += ((prev_Y + gy) * sampleTime) / 131000;
		prev_Y = gy;
		if (angle_Y < 0)
		{
			angle_Y += 360;
		}
		else if (angle_Y >= 360)
		{
			angle_Y -= 360;
		}
		angle_Z += ((prev_Z + gz) * sampleTime) / 131000;
		prev_Z = gz;
		if (angle_Z < 0)
		{
			angle_Z += 360;
		}
		else if (angle_Z >= 360)
		{
			angle_Z -= 360;
		}
		if (t > 100)
		{
			t = 0;
			Serial.print(angle_X);
			Serial.print(" ");
			Serial.print(angle_Y);
			Serial.print(" ");
			Serial.println(angle_Z);
		}
	}
}
```
underscoreコードリーディング（defaults）


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



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


##defaultsとは


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

こんな説明。
>####_.defaults(object, *defaults) 
Fill in undefined properties in object with the first value present in the following list of defaults objects.


```javascript
var iceCream = {flavor: "chocolate"};
_.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});
=> {flavor: "chocolate", sprinkles: "lots"}

```

------------- 

defaults objectsに指定されている値で、オブジェクトのundefinedなプロパティを埋めます。


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

```javascript
  // Fill in a given object with default properties.
  _.defaults = createAssigner(_.allKeys, true);
```

createAssignerに_.allKeysとtrueを渡す。
[createAssigner](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L856)は[_.extend](http://qiita.com/ikasumi_wt/items/7fda8945b8912e1405e6)で説明したとおり、objectを引数にとる関数で、_.allKeysの結果を用いて、obj[key] === void 0なところに値を埋める。
Java8のOptionalでSomeの時とEmptyの時の処理


`Optional`を使ってて、`Some`のときと`Empty`のときで処理を変えたい場合

``` java
Optional<Hoge> hoge = repository.find("hoge");
if (hoge.isPresent()) {
    // some processing.
    return ok(hogeJson);
} 

return badRequest("sorry...");
```

FPっぽくかけないかなーと思ったので以下の感じにした。

``` java
return repository.find("hoge")
  .map(hoge -> {
    // some processing.
    return ok(hogeJson);
  })
  .orElse(badRequest("sorry..."));
```

すっきりした。

こんな書き方もできるんだ…

``` java

return repository.find("hoge")
  .<Supplier>map(hoge -> () -> {
      // some processing
      return Ok(hogeJson);
  })
  .orElse(() -> {
      return NotFound("sorry...");
  })
  .get()

```

なんか、これだとあんまり意味ないか。
高階関数の使い道がいまいちまだわからない…
apache の POST の内容をログに吐かせて確認する

##1. httpd.conf を編集する

```
sudo vi /etc/httpd/conf/httpd.conf
```

↓コメントを外す
```
LoadModule dumpio_module modules/mod_dumpio.s
```
↓行追加
```
DumpIOInput On
```

LogLevel を warn から debug に変更

```
#LogLevel warn
LogLevel debug
```

##2. httpd を restart する

```
sudo service httpd restart
```

##3.  error_log を確認する

```
sudo tail /var/log/httpd/error_log
```

＜環境＞
CentOS6

＜参考＞
http://d.hatena.ne.jp/turkey_hate/20140128
ダイレクトスカウトが可能なサービスまとめ

突然だが、「ダイレクトリクルーティング」について調査してみた。
採用・人材関連に興味を持ったので。
IT・エンジニア採用が前提だけど、ほかの職種でも適用できるかも。

## 背景

* 近年は求職者に直接アクセスするダイレクトリクルーティングに注目が集まる
* 従来の人材紹介の特徴
  * ヘッドハンター／エージェントが人材を紹介
  * 成功報酬（手数料）は年収の30%が相場 
* ダイレクトスカウトの特徴
  * 登録されている求人プロフィールを直接表示／スカウト可能
  * 成功報酬がない月額課金だったり、あっても少ない
  * 求人原稿を書く負担がない
  * 人材紹介会社の取材に対応する負担がない
  * 結果として面接に至る日数を短縮可能
  * ピンポイント少数の求人が可能

## 代表的なダイレクトスカウト
### [Wantedly](https://www.wantedly.com/about/list)

* 登録ユーザ数 30万人
* 着手金／成功報酬なし
* 10万円／月（プレミアムビジネスの場合）
* ダイレクトスカウト 40通／月（プレミアムビジネスの場合）
* ベンチャーとの親和性高い
* 転職潜在層にリーチしやすいメディア


### [リクナビNEXTプロジェクト](http://www.direct-recruiting.jp/topics/shohin/rikunext-project/price/)

* 登録者数 237万人（2015年9月末）
* 着手金 10万円／1企画（ベーシック・エクスプレス）
* スカウト数上限 200通（ベーシックの場合）
* 成功報酬 85万円／人（IT・エンジニア）
* プランナーが積極的にサポートしてくれる

### [Doda Recruiters](http://prtimes.jp/main/html/rd/p/000000010.000016455.html)
* DODA 登録の 97万人（2015年11月）に直接スカウト可能
* 80万円／8週間
* 成功報酬 ゼロ
* スカウト数上限 500通
* 人工知能型のマッチング機能あり

### [LinkedIn Recruiter Lite](https://www.linkedin.com/premium/products?&family=talent)

* スカウト（メッセージ送信） 30件／月
* 11,400円／月
* 成功報酬なし
* 日本人の登録者数は少ない気がする 

### BizReach
* CMしてる。ドヤっと人差し指立ててる女の子が印象的
* ネットで検索しても金額面など詳細分からず。
* 成果報酬型。企業の規模、予算、担当する営業マンによって費用感がまったく違う

### そのほか
* daijob ： 外資系・グローバル企業特化型
* LiB： キャリア女性特化型

## 感想

* Wantedly 最強
* 成功報酬ありのリクナビNEXTプロジェクトはハードル高い
* 採用意欲が短期的にすごく高い場合 Doda Recruiters はちょっとアリかも
可変長引数の受け手がインターフェイスだった場合は一手間必要

引数受け手がインターフェイスの可変長引数の時、
次のようなコードを書いて１度はコンパイルエラーを誰もが出した事あると思います（と信じてる）


```go:test.go
package main
import "fmt"

func main() {
    str_list := []string{"test1", "test2", "test3"}
    Print(str_list...)
}

func Print(data ...interface{}) {
    for _, d := range data {
        fmt.Println(d)
    }
}
```
これでコンパイルすると、
`cannot use str_list (type []string) as type []interface {} in argument to Print`
って言われて怒られる。
スライスで関数に渡して受け取った先で展開しているのかな？
だから型違いのような事になるのかな？
俺の個人的勝手な感覚では呼び出し元で展開して渡してくれてるんじゃないの・・？？

どうしてだろう？って理由は未だにはっきり分かってませんが、
とにかくinterfaceの配列にして引数に渡せればうまく動きます。

```go:
inf := make([]interface{}, len(str_list))
for i, d := range str_list {
    inf[i] = d
}
Print(inf...)
```

未だにこの問題に出くわして「あるぇー」って一瞬困惑する事があるんだよねぇ・・・・
二重のプロット（左右縦軸）のグリット表示（matplotlib）

こんにちは。
matplotlib の twinx を利用し、二重で左右縦軸を持つプロットでグリット表示もさせました。

ただしそのままではこれらの ticks, grids の位置が整合せず見苦しくなります。今回、上手な対処方法を思いつかなかったので set_yticks を手動的に書いて整合させました（matplotlib 2.0.2 利用）。
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/54617/417f3f65-af20-e309-3875-df3899278af3.png)



```twinx_grid.py
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

t = np.arange(0.0, 10.01, 0.01)
_, ax1 = plt.subplots()
ax2 = ax1.twinx()

title = 'sin'
s1 = np.sin(np.pi*t)
ax1.plot(t, s1, 'b.')
ax1.set_ylabel(title, color='b', fontsize=18)

title = 'linear'
s2 = t * 1.6
ax2.plot(t, s2, 'g-')
ax2.set_ylabel(title, color='g', fontsize=18)

# 左右縦軸の tick 数を等しくして同じ位置となるようにしている
ax1.set_yticks(np.linspace(-1.0, 1.0, 5))
ax2.set_yticks(np.linspace(0, 20, 5))
ax1.set_ylim(-1.06, 1.06)
ax2.set_ylim(-0.6, 20.6)

ax1.tick_params(labelsize=18)
ax2.tick_params(labelsize=18)
ax1.set_xlabel('time (s)', fontsize=18)
ax1.grid(True, which='both') 
plt.xlim(-0.2, 10.2)
plt.subplots_adjust(left=0.18, right=0.86, bottom=0.14, top=0.94)
plt.show()
```
[HTTP]HTTP2について学ぶためスライドを見たまとめ

# スライドURL
http://www.slideshare.net/kazuho/http-58452175

# DeNA開発HTTPサーバ
- H2O

# サーバ技術の評価軸
- サーバ負荷
- 転送データ量
- 応答性
- 設定、運用コスト

# HTTP2の基本
## 登場背景
- エンドユーザーの通信速度は上昇
	- LTEの普及とか
- だがページロード速度はそれに比例しない
	- （1.6Mbpsで頭打ち）
- ページロードはレイテンシ<a href="#toc_16">(※1)</a>が小さいほど速い
	- まぁ当然

## なぜHTTP2か
- HTTP1.1は多重性がない
	- 1RTT<a href="#toc_17">(※2)</a>あたり1リクエスト/レスポンスしかできない
	- 緩和策は複数のTCP接続を使う
		- 1RTTあたり6リクエスト
			- **?どうやって？**
- 多重性がないために複数のリクエストを必要とする
	- そうなると1RTT毎のレイテンシが通信速度に重くのしかかる
- そのために開発されたのがHTTP2！！！

## HTTP2とは
### 基本的な技術要素
- バイナリプロトコル
- 多重化
- ヘッダ圧縮

#### バイナリプロトコル
- 脆弱性を防ぐ
	- HTTP Response Splitting Attack
	- レスポンス分割攻撃
		- [HTTP レスポンス分割攻撃](http://www.asahi-net.or.jp/~wv7y-kmr/memo/php_security.html#HTTPResponseSplitting)
- 転送データ量の低減
- 全てのデータは「フレーム」に分解して送受信

#### 多重化
- 同時に100以上のリクエストを送信可能
- 任意のタイミングでリクエスト送信可能
- レスポンスの順序に制限なし
	- 先のレスポンスを待たないってことか

#### ヘッダ圧縮
- HTTP1.1のヘッダは大きい
	- リクエストで最低でも300バイト程度
	- レスポンスで通常300バイト程度
	- 100回通信するとヘッダだけで60kb

### HTTP2.0体感サイト
[HTTP2.0体感サイト](https://www.symfony.fi/entry/compare-resource-loading-between-http-2-and-http-1-1)

### HTTP1.1とHTTP2.0のやり取り簡易比較図
![1.1と2.0](https://qiita-image-store.s3.amazonaws.com/0/62386/6217ebd8-9dea-7640-24d2-115b2cafdaec.png)

## レスポンス優先度
- クライアントがサーバにレスポンス優先度を指定
- サーバはその優先度を参考にレスポンスを返す順番を決める
- 優先度指定することでユーザ体感速度を大幅に向上させることができる
	- 初期描画を優先したレスポンスにすることによる

## サーバプッシュ
- HTTP2はRTTを隠蔽する技術
- でも最低1RTTはいるよね？？
	- 実は0RTTにすることができる
- それが「サーバプッシュ」
	- サーバがクライアントの発行するリクエストを予測してレスポンスをプッシュ
- まだ仕様の標準化はされてない
- ブラウザ対応がまだ
- ポテンシャルは秘めている

![サーバプッシュ](http://i.yimg.jp/images/tecblog/2014-1H/http2/http2_server_push.png)

# 参考サイト
- [なぜ、我々はHTTP/2に対応する必要があるのか？](http://www.seojapan.com/blog/everyone-moving-http2)
- [で、 HTTP2.0 対応って何をすればいいの？](http://dskst9.hatenablog.com/entry/2016/01/30/235019)

# 調査ワード
## ※1:レイテンシ
- リクエストが実施に送信されるまでの遅延時間　
	- [用語:レイテンシ](http://www.idcf.jp/words/latency.html)　

## ※2:RTT
ラウンドトリップタイム

- リクエストしてからレスポンスが返るまで

![ラウンドトリップタイム](http://pds.exblog.jp/pds/1/201108/29/63/e0091163_22465544.jpg)
Git コマンドメモ

git とは？
➡︎バージョン管理システム
　（昔の履歴を管理したりとか、別機能を開発するために違うバージョンを同時開発したりとか、そういったことをすることが多いのですが、それをしやすくするためのツール）

基本的に Web サービスでも Web サイトでも、ファイルを作ったり修正したりして、ある程度のまとまりになったら、履歴データベースに保存する

1,作業ディレクトリ　：ファイルを作ったり修正したりする

2、ステージングエリア　：意味のあるまとまりをリポジトリの方に綺麗に保存していくことができるという利点

3、リポジトリ：ローカルリポジトリ」と「リモートリポジトリ」

git init : この myweb というディレクトリを git で使うよ
git add : ここの 1 番（作業ディレクトリ）から 2 番（ステージングエリア）に上げるためのコマンド
git commit : その次に 2 番（ステージングエリア）から 3 番（リポジトリ）に上げるには、「commit」
git log : その履歴を見たりすることができる

—oneline:
1行で表示

git log -p　：　変更された場所を具体的に見たい場合
git log —stat : どのファイルが何箇所変わったか

git status: 状態確認

☆いろいろ便利な命令がたくさんあるのですが、基本は変更をしていって、何かよく分からなくなったら「git status」を見ながら自分のやりたいコマンドをこの辺りから探していく、というのが最初の基本だと思いますので、こういった流れに慣れていくようにしましょう。

git diff : どこをどう編集されたのかを知りたい
git diff —cached : 次のコミットでどう変わるか？
git add : 今のディレクトリより下にあるファイルを全部 add 

git rm :　削除
git mv :　移動

git commit -m “メッセージ” : 簡単にコミット
git commit —amend 　：　コミット修正

git reset --hard HEAD :  1個前に戻る
git reset --hard HEAD^　：　2個前に戻る
git reset —hard　ID

git reset --hard ORIG_HEAD　：　

⬛︎違いがよく分からない



git branch　：　ブランチの情報
git branch (branch name)　：　ブランチを新規作成
git checkout (branch name)　：　ブランチを移動

git merge (branch name)：　混ぜる
git branch -d (branch name)：　取り込んだやつを削除
ちょっとした機能を試したいときにはさっとブランチを作って、そこで作業して、うまく行ったら master にどんどん取り込んでいく、というように開発を進めていけば OK かと思います。

git checkout -b (name)：ブランチを作って移動

git tag　：タグ確認
git tag (tag name)：タグ作成
git tag (tag name) (commit id)　：昔のやつにつける
git tag -d (tag name)　：タグ削除
⬛︎短縮

git config --global alias.co checkout
git config --global alias.st status
git config --global alias.br branch
git config --global alias.ci commit
git config -l　：　確認
git init —bare：　共同ディレクトリ作成
TableViewCellなどから画面遷移するときの注意点

コードで

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath) {
 Object = List[indexPath.row]
        performSegueWithIdentifier("View",sender: nil)
    }
    
        
    
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if (segue.identifier == "View") {
            let Vv:ViewViewController = (segue.destinationViewController as? ViewViewController)!
            Vv.Object = selectedObject
        }
    }

などするときにStoryBoardでcellからViewセグエを伸ばすと2回画面遷移されてしまう。

画面遷移前のViewControllerから画面遷移後のViewControllerにViewセグエを伸ばすと解消する
GitHubのレポジトリをうっかり消してしまった時に復活させる方法

GitHubのレポジトリを間違えて消してしまうことなんてないと思いますが、
うっかり消してしまった時に、**もしかしたら復活できるかもしれない**方法です。

# 手順
1. https://github.com/contact で復活して欲しいお願いと、復活して欲しいレポジトリを記入。あとは、返信を待つだけです。

2. 復活できれば復活の連絡が届きます。下のメールが届いた時には嬉しくて泣きました。
<img width="554" alt="スクリーンショット 2016-02-20 12.40.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/37954/f18d71fc-fcdb-b713-1cf7-d01f2306f88b.png">
Go言語でGoogle Cloud Vision APIを使う

## 準備

Google Cloud ConsoleでCloud Vision APIを有効にします。Service Accountを作成しJSONファイルをダウンロードします。

```json:your.json
{
  "type": "service_account",
  "project_id": "...",
  "private_key_id": "...",
  "private_key": "...",
  "client_email": "...",
  "client_id": "...",
  "auth_uri": "...",
  "token_uri": "...",
  "auth_provider_x509_cert_url": "...",
  "client_x509_cert_url": "..."
}
```

OAuth2でのアクセスに必要なファイルです。

なお、プロジェクトで課金設定を有効にしておく必要があります(現時点では1000 API callまでは無料枠ですが、設定だけは必要)。

## import

```go
"golang.org/x/net/context"
"golang.org/x/oauth2/google"

// package名はvisionになっている
"google.golang.org/api/vision/v1"
```

## Service

```go
// 前述のJSONファイルを読み込んでJWTのConfigを作成
cfg, err := google.JWTConfigFromJSON(
	[]byte(jsonData), vision.CloudPlatformScope)

// OAuth2の認可を付与したHTTPクライアントを作る
client := cfg.Client(context.Background())

// Vision APIのサービスを作る
svc, err := vision.New(client)
```

## Annotate

```go
// 画像ファイルを読み込んでBASE64エンコード
enc := base64.StdEncoding.EncodeToString(imgData)
img := &vision.Image{Content: enc}

// 使いたいVisionの機能
feature := &vision.Feature{
	Type:       "LABEL_DETECTION",
	MaxResults: 10,
}

// 1つの画像に対して複数のFeatureを指定できる
req := &vision.AnnotateImageRequest{
	Image:    img,
	Features: []*vision.Feature{feature},
}

// 1回の呼び出しで複数の処理を要求できる
batch := &vision.BatchAnnotateImagesRequest{
	Requests: []*vision.AnnotateImageRequest{req},
}

// 実際のAPIコールを実行
res, err := svc.Images.Annotate(batch).Do()
```

## 結果

```go
// 結果をJSON出力してみる
body, err := json.Marshal(res.Responses[0].LabelAnnotations)
fmt.Println(string(body))
```

手元のステーキ写真の場合は、以下のような結果となった。

```json
[
    {
        "description": "kobe beef", 
        "mid": "/m/03dzf4", 
        "score": 0.98839045
    }, 
    {
        "description": "food", 
        "mid": "/m/02wbm", 
        "score": 0.96780306
    }, 
    {
        "description": "dish", 
        "mid": "/m/02q08p0", 
        "score": 0.96229196
    }, 
    {
        "description": "sirloin steak", 
        "mid": "/m/04fyb1", 
        "score": 0.92836541
    }, 
    {
        "description": "roast beef", 
        "mid": "/m/01pldp", 
        "score": 0.92026973
    }, 
    {
        "description": "rib eye steak", 
        "mid": "/m/05853c", 
        "score": 0.91176695
    }, 
    {
        "description": "meat chop", 
        "mid": "/m/0272v_j", 
        "score": 0.90220582
    }, 
    {
        "description": "steak", 
        "mid": "/m/0grtl", 
        "score": 0.82390612
    }, 
    {
        "description": "dinner", 
        "mid": "/m/0jffp", 
        "score": 0.79311848
    }, 
    {
        "description": "lamb and mutton", 
        "mid": "/m/01hcps", 
        "score": 0.78561467
    }
]
```

----

JSONや画像ファイルの読み込みなどの処理は省略し、Visionまわりのコードの抜粋となっています。
DockerでGo言語をお手軽クロスコンパイル（Go環境が無い状態で1行コンパイル）


![frontpage.png](https://qiita-image-store.s3.amazonaws.com/0/73580/2a497df9-9bcb-56c0-f79e-a6c5a156c601.png)![docker_toolbox_banner_icon.png](https://qiita-image-store.s3.amazonaws.com/0/73580/616b2efd-8dc1-11e7-a0bf-05b8cbe5e225.png)

# 1.概要
DockerのGo言語コンテナイメージを使用し、何もない状態(Dockerは導入済み)でGo言語を1行の命令でコンパイルする方法をご紹介します。
 * Dockerのインストールはこちら （[Dockerオフィシャルサイト](https://docs.docker.com/mac/ "Docker")）
 * DockerのコンテナイメージはDocker Hubのオフィシャルイメージを使用（[Official Repository golang](https://hub.docker.com/_/golang/ "golang")）

# 2.方法
## 2.1.ソースファイルの格納場所に移動
Dockerを利用できる状態のコマンドプロンプト(DOCKER CLIなど)でホームディレクトリ配下のGo言語のソースを置いているディレクトリに移動。（Windows/Maxの場合、デフォルトではDockerが動作しているVirtualBoxの共有フォルダがUserディレクトリとなっているため）
(例)

```lang: 
cd ~/develop/go
```
サンプルとして上のディレクトリにサンプルのソースファイルを置きます。

hello.goファイル

```lang:go
package main
import "fmt"
func main() {
	fmt.Println("こんにちは世界")
}
```

## 2.2.コンパイルの実行
カレントディレクトリのソースをコンパイルします。
**GOOSとGOARCHの値を変更するだけで、違うアーキテクチャの実行ファイルを作成できます。（WindowsでMacの実行ファイルなど）**

Windowsの場合

```lang:
docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=windows -e GOARCH=386 golang:1.6 go build -v
````

 * 初回はコンテナイメージのダウンロードが発生するため多少時間が掛かります。（次回からは一瞬）
 * Macの場合⇒「 -e GOOS=darwin -e GOARCH=amd64 」
 * Linuxの場合⇒「 -e GOOS=linux -e GOARCH=amd64 」
 
他のアーキテクチャの場合は下の「 GOOS・GOARCH一覧リスト 」を参照。

## 2.3.実行してコンパイル結果を確認
Windowsの場合
コマンドプロンプトから先ほどのディレクトリに移動して作成されたexeファイルを実行。
![myapp_go.png](https://qiita-image-store.s3.amazonaws.com/0/73580/cd87cfa7-6d00-1a5f-d2fe-062500566eca.png)

# 補足
## GOOS・GOARCH一覧リスト
| $GOOS| $GOARCH |
|:-----|:-----|
|darwin|386|
|darwin|amd64|
|darwin|arm|
|darwin|arm64|
|dragonfly|amd64|
|freebsd|386|
|freebsd|amd64|
|freebsd|arm|
|linux|386|
|linux|amd64|
|linux|arm|
|linux|arm64|
|linux|ppc64|
|linux|ppc64le|
|linux|mips64|
|linux|	mips64le|
|netbsd|386|
|netbsd|amd64|
|netbsd|arm|
|openbsd|386|
|openbsd|amd64|
|openbsd|arm|
|plan9|	386|
|plan9|amd64|
|solaris|amd64|
|windows|386|
|windows|amd64|
Unity3D-簡単なゲームを作りながら学ぼう⑥

#今回はカメラを設定して飛行機が動く時に一緒に動くようにします。
>まずはカメラのプロパティを設定します
>カメラを選択してプロパティを見ましょう。最初はProjection値がPespectiveで設定されています。これをOrthographicに設定します。これでSize変更にカメラの調整ができます。カメラPreviewで確認しながら調整します。

![51.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/e9a84fad-ef45-1082-808c-32e6ba885b98.png)

>次はカメラにスクリプトを追加します。
moveCameraの名前でスクリプトを追加します。カメラのプロパティに追加されたので修正してみます。

![52.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/4a052087-3248-d583-7c21-2afd9120f1cb.png)

>コード

```
public class moveCamera : MonoBehaviour {
    GameObject player;
    Vector3 offset;

	// Use this for initialization
	void Start () {
        //飛行機にタグを「Plane」と言う名前で追加したのでこれで参照できます。
        player = GameObject.FindGameObjectWithTag("Player");
        //飛行機の最初位置情報から現在カメラの位置情報の差を保存します。
        offset = player.transform.position - transform.position;
	}
	
	// Update is called once per frame
	void Update () {
	
	}

    void LateUpdate()
    {
        //飛行機が移動すれば、最初保存した差の分カメラを移動されます
        transform.position = player.transform.position - offset;
    }
}
```

#これで飛行機が移動したら地形も飛行機と合わせて動くようになります。
ここで注意することは「GameObject.FindGameObjectWithTag("Player");」このコードがタグからオブジェクトを探しているので飛行機のTagがPlayerに設定しないといけないです。

>以下の画面のTagに「Player」が選択されているかを確認しましょう。
![53.PNG](https://qiita-image-store.s3.amazonaws.com/0/108475/d0c69752-7e22-e6d9-2347-3c3fd9faab48.png)

#Playerとカメラの設定前の飛行機の動き
![before.gif](https://qiita-image-store.s3.amazonaws.com/0/108475/b1edec3a-1669-48d0-1a4c-8d37de542a35.gif)

#スクリプト追加後の動き

![after.gif](https://qiita-image-store.s3.amazonaws.com/0/108475/e07476bb-7a7b-28b9-d25d-bf41d2ec34c2.gif)
EPS8266 > Arduino IDE > epscomm_send(FLASH_DOWNLOAD_BEGIN) failed > バッテリー電圧低下

```txt:動作確認
ESP-WROOM-02
Arduino IDE 1.6.6
```

ESP-WROOM-02にプログラムを何回も書き込んでいたのだが、突然以下のエラーが出るようになった。

```
...
epscomm_send(FLASH_DOWNLOAD_BEGIN) failed
```

何も変えてない。
変わったといえばバッテリー電圧か。

測定してみると 2.412 Vだった。(CR-123A使用)。

反対にこの低い電圧まで動いていたのがすごい。
定格での使い方ではないのは注意。
ESP8266 > Link > 1MHzで50% dutyを出力する


以下などでESP8266にて1MHzのクロックを出そうとしていたがうまくいってなかった。
http://qiita.com/7of9/items/c55023a4af15b83ac7e3


macsbugさんの方でその方法を解明された。
https://macsbug.wordpress.com/2016/02/19/esp8266%E3%81%A7%EF%BC%91mhzwo/

> 結論：１MHz の目標に対し １.０００MHz を達成。

少数3桁の精度まで出ているのがすごい。

詳細はリンク先を参照ください。

他の記事も ESP8266 関連で詳細な測定データに基づいた情報があり、いろいろ勉強になります。
ついつい忘れがちなPythonのリスト内包表記


初めて見る人には意味がわからないけど使い始めると手放せないリスト内包表記ですが、しばらくPythonから離れていると忘れることがあるので、使い方をメモってみました。


# ディクショナリのリストから特定のキー値のみを取り出す
まずはシンプルに、プロフィールのリストから氏名を取り出します。

```py
profiles = [
    {"name": "Tanaka", "age": 17},
    {"name": "Suzuki", "age": 18},
    {"name": "Sato", "age": 19},
]
names = [p["name"] for p in profiles]
print(names)
```

結果は、こんな感じになります。
```
['Tanaka', 'Suzuki', 'Sato']
```

# 条件付きで値を取り出す
年齢による縛りを入れてみます。18歳以上の氏名のみを取り出します。

```py
profiles = [
    {"name": "Tanaka", "age": 17},
    {"name": "Suzuki", "age": 18},
    {"name": "Sato", "age": 19},
]
names = [p["name"] for p in profiles if p["age"] >= 18]
print(names)
```

Tanakaさんは18歳未満なので除外されます。
```
['Suzuki', 'Sato']
```

# 結果をディクショナリにする
リストからディクショナリに変換してみます。

```py
profiles = [
    {"name": "Tanaka", "age": 17},
    {"name": "Suzuki", "age": 18},
    {"name": "Sato", "age": 19},
]
names = {p["name"]: p["age"] for p in profiles}
print(names)
```

氏名が被っているとおかしくなりますが、この例では大丈夫。
```
{'Tanaka': 17, 'Sato': 18, 'Suzuki': 18}
```

# もう少しリッチなディクショナリにしてみる
ちょっと強引ですが、年齢ごとに氏名のリストを作ってみます。

```py
profiles = [
    {"name": "Tanaka", "age": 17},
    {"name": "Suzuki", "age": 18},
    {"name": "Sato", "age": 18},
]
names = {
    p2["age"]: [
        p1["name"] for p1 in profiles if p1["age"] == p2["age"]
    ]
    for p2 in profiles}
print(names)
```

こんな感じです。
```
{17: ['Tanaka'], 18: ['Suzuki', 'Sato']}
```
プルリクにコメントするときにチェックボックスを設置するルール


## とは
タイトルの通り。
チームメンバーにちょろちょろっとした指摘をいくつかされて、
「全部同じコミットでまとめてやっちゃうかぁ...」
「あれ...あとどれやってないんだっけ...」
ってなることがあるので、それ対策。急に思いついたので良さは不明。

## 例
![スクリーンショット 2016-02-20 11.21.31.png](https://qiita-image-store.s3.amazonaws.com/0/113398/e11dd364-7321-8838-ea8d-153eabe81369.png "スクリーンショット 2016-02-20 11.21.31.png")

対応したらチェックしていくと忘れない！！

## やりかた
**コメントする側**がコメントの先頭に`- [ ]`と書いてあげる

## どうなんだろう
なんかやりかたがいまいちだけど、悪くはない気がする...
試してみて良さそうだったらちょろっとChrome拡張でも作ってみようかな...
message station > v0.5 > hello, bye対応 

```txt:動作確認
ESP-WROOM-02
Arduino IDE 1.6.6
```

https://hackaday.io/project/9526-bring-your-own-pizero-byop
にエントリー中のBYOPで核となるMessage stationの実装をしている。

ようやくhello, byeの応答までたどり着いた。

[v0.5 @ github](https://github.com/yasokada/esp8266_160220_BYOP/releases)

コードは3つのinoファイルで実装中

- eps8266_160220_BYOP.ino : メイン
- eps8266_160220_StringLib.ino : 文字列(主にcsvテキスト)を扱う
- esp8266_160220_UARTlib.ino : UART通信を扱う

予定している通信プロトコルは以下。
http://qiita.com/7of9/items/a62a6f21b00923fe3658

現状は以下のコマンドが動く。

| 入力 | 応答 |
|:-:|:-:|
| hello<LF>  | hello,7of9<LF> |
| bye<LF> | bye,7of9<LF> |
Terms Aggregationで正確な結果を取得するには

# はじめに
ElasticsearchのTerms Aggregationをを使用すると、集計結果の上位n件とかをサックリと取得できます。取得できるのですが、基本的にTerms Aggregationで取得できるのは「おおよそ」の値です。もしかすると、1位だと思っていたデータが、実は2位かもしれません。
大抵の場合は問題ないと思いますが、どうしても正確な値が欲しいということもあります。そんな場合は適切にオプションを設定しましょう。[公式ドキュメント](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html)でも丁寧に説明されていますので、そちらも合わせてご参照ください。

# Terms Aggregationの動き
Terms Aggregationの動きを説明するために、アクセスログからアクセス数の多いIPアドレスの上位3件を取得するケースで考えてみます。
以下のように、doc_countでソートしてsizeで件数をしてあげれば良さそうです。

```json
{
    "aggs": {
        "source_ip_addresses": {
            "terms": {
                "field": "source_ip_address",
                "order" : { "_count" : "desc" },
                "size": 3
            }
        }
    }
}
```

しかし、sizeに3を指定しても、全ドキュメントからIPアドレス数を集計して3つを取得する**訳ではありません**。集計は、まずshard単位に行われます。shard単位に上位3つ取得し、次に各shardの上位3つを集計、その集計結果の上位3件が最終結果となります。つまり、各shardの4位以下のデータはすべて切り捨てられてしまうわけです。

![temrs.png](https://qiita-image-store.s3.amazonaws.com/0/73867/d9f15f0b-efc2-45bb-02e0-1f7e0845ba3c.png)

# 正確な結果を求めるには
これを解決するためには、shard単位では全集計結果を取得し、最終的な結果に対してのみsize指定できれば良いのです。Terms Aggregationでは、shard単位のsizeを設定するために、shard_sizeオプションが用意されています。shard_sizeは指定されない場合にsizeと同じになりますので、上記の例では各shardの4位以下が切り捨てられてしまったのです。
以下のようにshard_sizeに0 (Integer.MAX_VALUE)を設定し、sizeに3を指定すると正確に上位3件が取得できます。

```json
{
    "aggs": {
        "source_ip_addresses": {
            "terms": {
                "field": "source_ip_address",
                "order" : { "_count" : "desc" },
                "size": 3,
                "shard_size": 0
            }
        }
    }
}
```

# ちょっとだけ注意
shard_sizeを大きくすると、当然Elasticsearchの負荷が高くなります。どうしても必要な場合だけ使うと良いでしょう。
package.jsonからREADMEの雛形を自動生成する


READMEを書くのって面倒ですよね。
他のプロジェクトをいちいち開いてコピペしてくるとかやってられません。
１コマンドでひな形をつくってくれると便利です。
そこで、`package.json`の情報から`README`の雛形を作成する[readme-gen](https://github.com/akameco/readme-gen)をつくってみました。


## インストール

```
$ npm install -g readme-gen
```

## 使い方
`npm init`実行後、`readme-gen`もしくは`rdm`を叩くとpackage.jsonの情報からREAEMD.mdを生成します。

例えば、以下のようなpackage.jsonがある場合、

```package.json
{
  "name": "sample-app",
  "version": "1.0.0",
  "description": "awesome sample app.",
  "author": "akameco",
  "license": "MIT"
}
```

出力されるREADME.mdは以下のようになります。
名前、概要、インストール、使い方、コントリビュートの方法、ライセンスを出力します。
インストールと使い方は埋める必要がありますが、雛形としてはこれで十分でしょう。

```markdown:README.md
# sample-app

> awesome sample app.

## Installation

## Usage

## Contributing

1. Fork it!
2. Create your feature branch: `git checkout -b my-new-feature`
3. Commit your changes: `git commit -am 'Add some feature'`
4. Push to the branch: `git push origin my-new-feature`
5. Submit a pull request :D

## License

MIT

```

また、すでにREADMEが存在してる場合は、コマンドを叩いても何もしません。

デフォルトで生成されるREADMEが気に入らなければ、ホームディレクトリに`.readme-genrc`を配置することで、それをテンプレートとして読み込みます。Contributingがいらないとか、InstallationではなくInstallがいいとか、ライセンスに名前を入れたいなどの場合、以下のような感じになります。package.jsonで使っているキーをそのまま使うことができます。

```ejs:~/.readme.gem
# <%= name %>

> <%= description %>

## Install

## Usage

## License

<%= license %> © <%= author %>
```


## おわりに
ぶっちゃけやっていることは、package.jsonをパースして、ejsでレンダリングしているだけです。
READMEを書く時間を多少短縮するだけですがが、いちいち前に書いたREADMEを参考にしなくていいのは、ストレスなくいい感じです。