OmniAICreator/Qiita-1.07M huggingface dataset:
EI Capitan(10.11.4), XCode 7.3 でlibv8

rails使いがみんな頭を抱えている、libv8とtherubyracerのインストールが上手く行かなくなる問題。今回の対応はこうらしいです。

```
brew tap homebrew/versions
brew uninstall v8
brew install v8-315
bundle config build.libv8 --with-system-v8
bundle config build.therubyracer --with-v8-dir=$(brew --prefix v8-315)
bundle update
```
https://github.com/cowboyd/libv8/issues/205


```
Installing libv8 3.16.14.13 with native extensions
Installing therubyracer 0.12.1 with native extensions
```
以上。

# 追記 bundle config localを使おう

こっちのほうがいい気がしてきた。

```
brew tap homebrew/versions
brew uninstall v8
brew install v8-315
bundle config --local build.libv8 --with-system-v8
bundle config --local build.therubyracer --with-v8-dir=$(brew --prefix v8-315)
bundle update
```
http://qiita.com/mogya/items/89ea2da8a9e35ccb902b

# 余談：より抜本的な対応

　Dockerが直接動くようになるそうだから、もうMac上でrails動かすのは諦めちゃったほうがいいのかもしれない。

[Docker for Mac and Windows Beta: the simplest way to use Docker on your laptop](https://blog.docker.com/2016/03/docker-for-mac-windows-beta/)
SwiftでiOS標準カレンダーを使う方法


`swift calendar`とかで検索すると独自UIを作る情報は検索されるけど、あんまりEventKitを使った情報が出てこなかった。
リファレンス上のデモもswiftのバージョンがないし。

Google Calendarの時も思ったけど、あんま情報ないんだよね。ライブラリー(?)の更新とかもあんまないし。カレンダーって人気ないのかな？ｗ


### バージョン
| 環境 | バージョン |
|:-:|:-:|
| Xcode | 7.3, 7.2 |
| Swift | 2.2, 2.1 |
| iOS   | 9.3, 9.2 |

### 参照したドキュメント
[EventKitのリファレンス](https://developer.apple.com/library/watchos/documentation/EventKit/Reference/EventKitFrameworkRef/index.html)



[プログライミングガイド](https://developer.apple.com/jp/documentation/EventKitProgGuide.pdf)


### 使い方

#### 準備
EventStore経由であれこれするので、初期化

```calendar.swift
// EventStoreを初期化
let eventStore = EKEventStore()
```

#### カレンダーへのアクセス許可の取得
```calendar.swift
// 許可状況を確認して、許可されていなかったら許可を得る
func allowAuthorization() {
    if getAuthorization_status() {
        // 許可されている
        return
    } else {
        // 許可されていない
        eventStore.requestAccessToEntityType(.Event, completion: {
        (granted, error) in
            if granted {
                return
            }
            else {
                print("Not allowed")
            }
        })
        
    }
}

// 認証ステータスを確認する
func getAuthorization_status() -> Bool {
    // 認証ステータスを取得
    let status = EKEventStore.authorizationStatusForEntityType(.Event)
    
    // ステータスを表示 許可されている場合のみtrueを返す
    switch status {
    case .NotDetermined:
        print("NotDetermined")
        return false
        
    case .Denied:
        print("Denied")
        return false
        
    case .Authorized:
        print("Authorized")
        return true
        
    case .Restricted:
        print("Restricted")
        return false
    }
}
```

#### カレンダーの一覧の取得
```calendar.swift
let calendars = eventStore.calendarsForEntityType(.Event)
```

#### イベントの一覧を取得
```calendar.swift
func listEvents() {
    // 検索条件を準備
    let startDate = NSDate()
    let endDate = NSDate()
    let defaultCalendar = eventStore.defaultCalendarForNewEvents    // ここではデフォルトのカレンダーを指定
    // 検索するためのクエリー的なものを用意
    let predicate = eventStore.predicateForEventsWithStartDate(startDate, endDate: endDate, calendars: [defaultCalendar])
    // イベントを検索
    let events = eventStore.eventsMatchingPredicate(predicate)
}
```

#### イベントの新規登録
```calendar.swift
func addEvent() {
    // イベントの情報を準備
    let startDate = NSDate()
    let cal = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
    let endDate = cal.dateByAddingUnit(.Hour, value: 2, toDate: startDate, options: NSCalendarOptions())!
    let title = "カレンダーテストイベント"
    let defaultCalendar = eventStore.defaultCalendarForNewEvents
    // イベントを作成して情報をセット
    let event = EKEvent(eventStore: eventStore)
    event.title = title
    event.startDate = startDate
    event.endDate = endDate
    event.calendar = defaultCalendar
    // イベントの登録
    do {
        try eventStore.saveEvent(event, span: .ThisEvent)
    } catch let error {
        print(error)
    }
    
}
```

#### イベントの削除
```calendar.swift
func deleteEvent(event: EKEvent) {
    do {
        try eventStore.removeEvent(event, span: .ThisEvent)
    } catch let error {
        print(error)
    }
}
```
日付や時刻まわりのSnippet


```swift
//現在時刻
let now = NSDate()

let cal = NSCalendar(identifier: NSCalendarIdentifierGregorian)!
//10日後
let in10days = cal.dateByAddingUnit(.Day, value: 10, toDate: now, options: NSCalendarOptions())

//2日前
let ago2days = cal.dateByAddingUnit(.Day, value: -2, toDate: now, options: NSCalendarOptions())

//1年前
let ago1year = cal.dateByAddingUnit(.Year, value: -1, toDate: now, options: NSCalendarOptions())

//日付の比較
cal.isDate(now, inSameDayAsDate: in10days!)

//年月など単位を指定して比較
cal.isDate(now, equalToDate: in10days!, toUnitGranularity: .Month)

cal.isDate(now, equalToDate: ago2days!, toUnitGranularity: .Month)

cal.isDate(now, equalToDate: ago1year!, toUnitGranularity: .Month)

cal.isDate(now, equalToDate: ago1year!, toUnitGranularity: .Day)

cal.isDate(now, equalToDate: now, toUnitGranularity: .Day)
```
Haskell でシグナルで中断された時にクリーンナップ処理をしてから終了する


最近 [Programming in Haskell](http://amzn.to/22Qe9zf) という本を読んでいるのですが 9.7 Game of Life（ターミナルに Game of Life をアニメーション表示）を動かしてみたらカーソルが邪魔だったので、プログラムの開始時にカーソルを消して終了時にまた表示するようにしようとしました。

```hs
import System.Process (system)

main :: IO ()
main = do
  -- カーソルを隠す
  system "tput civis"
  -- Game of Life を画面に表示
  life glider
  -- カーソルを表示（ここに到達しない！！！）
  system "tput cvvis"
  return ()
  
life :: Board -> IO ()
glider :: Board
```

しかし `life` が無限ループで Game of Life を表示するため、カーソルを表示するところまで到達しません。`Ctrl+C` で中断するとカーソルが隠れたままになってしまいます。

[unix - Killing a Haskell binary - Stack Overflow](http://stackoverflow.com/a/18430872/822317) を参考にして、シグナルで中断されるまで `a -> IO a` な処理をループさせる関数を書いてみました。`MVar` で中断されたかどうかを管理し、中断されていた場合はループを止めます。

```hs
import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, tryTakeMVar)
import System.Posix.Signals (Handler, Handler(CatchOnce), installHandler, sigINT, sigTERM)

loopUntilInterruption :: (a -> IO a) -> a -> IO ()
loopUntilInterruption p init = do
  v <- newEmptyMVar
  installHandler sigINT (handler v) Nothing
  installHandler sigTERM (handler v) Nothing
  loop v p init

handler :: MVar () -> Handler
handler v = CatchOnce $ putMVar v ()

loop :: MVar () -> (a -> IO a) -> a -> IO ()
loop v p prev = do
  x <- p prev
  val <- tryTakeMVar v
  case val of
    Just _ -> return ()
    Nothing -> loop v p x >> return ()
```

Game of Life の例では `life` の型を変えて前回の結果を返すようにして、`loopUntilInterruption` でループさせました。今度はシグナルで中断しても終了処理が呼ばれます。

```hs
import System.Process (system)

main :: IO ()
main = do
  -- カーソルを隠す
  system "tput civis"
  -- 中断されるまでループ
  loopUntilInterruption life glider
  -- カーソルを表示（今度は呼ばれる！！！）
  system "tput cvvis"
  return ()
  
life :: Board -> IO Board
glider :: Board
```

めでたし、めでたし。

ちなみに [Programming in Haskell](http://amzn.to/22Qe9zf) は [edX の Introduction to Functinal Programming](https://www.edx.org/course/introduction-functional-programming-delftx-fp101x-0) で Erik Meijer がおすすめしていたので読んでいます。約 150 ページと薄いのに内容が凝縮されていていい感じです。Monad などについてもごちゃごちゃ言わないので、個人的には[すごい Haskell たのしく学ぼう！](http://amzn.to/22QfpCv)よりもわかりやすいと思いました。[日本語版](http://amzn.to/22QeCBy)の方が安いのでさらにおすすめです。
Go fmtで自動整形

> [目的]
gofmtでGoファイルを自動整形する。

```go:インデントや改行を消したHelloWorld(hello.go)
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
```

これをgofmtで整形する。

```bash:gofmt
go fmt hello.go 
```
```shell-session
hello.go
```

```go:自動整形されたHelloWorld(hello.go)
package main

import "fmt"

func main() {
	fmt.Printf("hello, world\n")
}
```
CIサービスの自動ビルドをスキップする方法まとめ

# やりたいこと
リポジトリへのコミットに伴う、CI(Continuous Integration)サービスによる自動ビルド起動を一時的にスキップしたい。
※例えば、ドキュメントのみの更新等、プログラムに変更が無くテストやビルドが不要な場合


# 方法
コミットメッセージに含まれるキーワードでCI起動を抑制できる。
※各CIサービスが個別にそうした機能を実装している


# 結論
`GitHub Actions`/`Travis CI`/`Circle CI`/`AppVeyer`/`GitLab CI/CD Pipeline`のいずれかのCIサービスであれば、
`[skip ci]`/`[ci skip]`をコミットメッセージのどこか(行頭でなくても可)に書くとpush時にCI起動をスキップできる。


# CIサービス毎の抑制方法
## GitHub Actions
下記キーワードのいずれかをコミットメッセージのどこかに記載する:

- `[skip ci]`
- `[ci skip]`
- `[no ci]`
- `[skip actions]`
- `[actions skip]`

### Reference
[GitHub Actions: Skip pull request and push workflows with [skip ci] - GitHub Changelog]( https://github.blog/changelog/2021-02-08-github-actions-skip-pull-request-and-push-workflows-with-skip-ci/ )

>If any commit message in your push or the HEAD commit of your PR contains the strings [skip ci], [ci skip], [no ci], [skip actions], or [actions skip] workflows triggered on the push or pull_request events will be skipped.


## Travis CI
下記キーワードをコミットメッセージのどこかに記載する:

- `[<ci|travis|travis ci|travis-ci|travisci> skip]`
- `[skip <ci|travis|travis ci|travis-ci|travisci>]`

### Reference
[Customizing the Build - Travis CI]( https://docs.travis-ci.com/user/customizing-the-build/#skipping-a-build )


## Circle CI
下記キーワードのいずれかをコミットメッセージのどこかに記載する:

- `[ci skip]`
- `[skip ci]`

### Reference
[Skip and Cancel Builds - CircleCI]( https://circleci.com/docs/2.0/skip-build/ )

>CircleCI won't run the build if we find [ci skip] or [skip ci] anywhere in the commit message of the head commit. You can use the handy retry button on the build page if you decide that you want to run the build after all.


## AppVeyor
下記キーワードのいずれかをコミットメッセージのどこかに記載する:

- `[skip ci]`
- `[ci skip]`
- `[skip appveyor]`

### Reference
[Setting up commits filtering | AppVeyor]( https://www.appveyor.com/docs/how-to/filtering-commits/#skip-directive-in-commit-message )

>Add [skip ci] or [ci skip] to commit message title and build won’t be triggered by AppVeyor for that commit. Or explicitly skip AppVeyor only with [skip appveyor] and still allow any other CI to build the commit (eg. Travis CI).

## GitLab CI/CD Pipeline
下記キーワードのいずれかをコミットメッセージのどこかに記載する:

- `[skip ci]`
- `[ci skip]`

もしくは、
- `git push -o ci.skip`オプションを使う

### Reference
[Keyword reference for the `.gitlab-ci.yml` file | GitLab]( https://docs.gitlab.com/ee/ci/yaml/#skip-pipeline )

> To push a commit without triggering a pipeline, add [ci skip] or [skip ci], using any capitalization, to your commit message.
> Alternatively, if you are using Git 2.10 or later, use the ci.skip Git push option. The ci.skip push option does not skip merge request pipelines.

# まとめ

Keyword|GitHub Actions|Travis CI|Circle CI|AppVeyor|GitLab CI
---|:---:|:---:|:---:|:---:|:---:
`[skip ci]`|✔|✔|✔|✔|✔
`[ci skip]`|✔|✔|✔|✔|✔
`[no ci]`|✔||||
`[skip actions]`|✔||||
`[actions skip]`|✔||||
`[skip <TRAVIS>]`||✔|||
`[<TRAVIS> skip]`||✔|||
`[skip appveyor]`||||✔|


- `✔`: スキップ可
- `TRAVIS`: `travis`|`travis ci`|`travis-ci`|`travisci`

`GitHub Actions`/`Travis CI`/`Circle CI`/`AppVeyer`/`GitLab CI`に共通するCIのスキップが可能なコミットメッセージのキーワードは`[skip ci]`/`[ci skip]`
Gollum on Alphine on Docker

[gollum](https://github.com/gollum/gollum) というGitをデータストアに使用するWikiをDocker(alpineベースのイメージ)で構築した際のDockerfileとGemfileをメモとして残しておきます（GitHubなりBitbucketに上げろやとか言われそう）

```docker:Dockerfile
FROM ruby:alpine

ENV DEBIAN_FRONTEND noninteractive

WORKDIR /root

ADD ./versions.txt /root/versions.txt

ADD Gemfile /root/Gemfile

RUN apk update
RUN apk add icu-dev build-base git
RUN apk add libxml2-dev libxslt-dev

RUN bundle install

RUN mkdir /root/wikidata
RUN git init /root/wikidata

EXPOSE 4567

ENTRYPOINT ["/usr/local/bundle/bin/gollum", "/root/wikidata", "--port", "4567"]
```

```rb:Gemfile
source 'https://rubygems.org'

ENV['NOKOGIRI_USE_SYSTEM_LIBRARIES'] = 'YES'

gem 'gollum'
gem 'charlock_holmes'
gem 'redcarpet'
gem 'github-markdown'
gem 'org-ruby'
```
Sublime Text > 他のIDE/エディタでの変更後、Find Resultsの結果が反映されない

```txt:動作確認
Sublime Text 2 (以下SL2) on Windows 7 pro 32bit
IDE: 組込み用開発環境 (C実装)
```

SL2でコードを編集しつつ、IDEでコンパイルしてIDEの専用エディタでエラーコードを修正した時、SL2の方のキャッシュが更新されないためかFind Resultsの内容が古いままとなる時がある。

対応としては、SL2を終了して再起動することで、Find Resultsがきちんと表示される。
XcodeでUIStepperを使う方法

# UIStepperとは

こういうやつです。

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/6c18a31a-643c-5b09-f0b4-0c2a9d6a9a5d.png)

* 「-」「+」ボタンから構成されています
* UIStepper 自身が値を保持します（デフォルト：0-100）
* iOS 5.0で追加されました

※記事中では UIStepper を Stepper と表記することもあります。

# この記事の実行環境

* Xcode 7.3
* Swift 2.2

# 使い方

Storyboard 上で Stepper を貼り付けます。

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/f85af779-25c9-f198-061c-ba1c5165ec4a.png)

Stepper とソースコードを紐付けます。Event は `Value Changed` にしておきます。

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/e2c795a2-93b6-5a0e-a3f2-50ec8c4e7b4a.png)

UIStepper の現在値は `value: Double` プロパティで取得できます。

```swift
@IBAction func stepperDidTap(stepper: UIStepper) {
    print(stepper.value)
}
```

試しに実行してみましょう。

▼実行結果
![image](https://qiita-image-store.s3.amazonaws.com/0/8292/7211e686-c01b-5c4a-915c-0391e53a7bd8.png)

「＋」ボタンを押すたびに値が増えていることがわかります。

# いろいろいじってみる

UIStepper の Attributes Inspector から様々な値を設定できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/853dc4a8-8163-db54-66e9-560e7a276e40.png)

* Value
    * Minimum - Stepper の最小値
    * Maximum - Stepper の最大値
    * Current - Stepper の初期値
    * Step - 「-」「+」ボタンをタップした時の増減値
* Behavior
    * Autorepeat - 「-」「+」ボタン長押しで値が変化し続けるようにする（デフォルト：オン）
    * Continuous - 常にイベントが発生するようにする。ここをオフにすると、長押し中に何度もイベントが発生しなくなる（デフォルト：オン）
    * Wrap - 最大値を超えると最小値に戻る。逆もまた然り（デフォルト：オフ）

# サンプルコード

UIStepper を使って、画面の明るさを調整するサンプルコードです。

https://github.com/koogawa/iSensorSwift/blob/master/iSensorSwift/Controller/BrightnessViewController.swift

![image](https://qiita-image-store.s3.amazonaws.com/0/8292/39aa4497-746a-6651-d72e-83d5d27de5b0.png)
Raspberry PI で Lピカ


以下では、GPIO２１に接続したLEDを光らす。

GPIO21を有効にする。

```
$ echo 21 > /sys/class/gpio/export
```

gpio21が作成される。
出力ポートに設定する。

```
$ echo out > /sys/class/gpio/gpio21/direction
```

LEDを点灯させる。

```
$ echo 1 > /sys/class/gpio/gpio21/value 
```

LEDを消灯させる。

```
$ echo 0 > /sys/class/gpio/gpio21/value 
```

GPIO21を無効にする。

```
$ echo 21 > /sys/class/gpio/unexport 
```
「RailsにBootstrapデザインを適用する」をやってみた

## 参考

* [RailsにBootstrapデザインを適用する - Qiita](http://qiita.com/kamizuno/items/5c3ecceea5aa78e25058)の通りにやってみた。

![org.png](https://qiita-image-store.s3.amazonaws.com/0/25728/3b79b131-d47c-ff61-8844-640fd193eba7.png)

## 手順

```
rails new spec && cd spec

rails g scaffold \
  machine \
  ip:string \
  hostname:string \
  note:string \
  middleware:string \
  addition:string \
  place:string

rake db:migrate
```

```ruby:Gemfile
# less(CSS)対応（後述LESSを使う場合）
gem 'less-rails'
# JavaScript のエンジンである v8 を Ruby から使えるようにする
gem 'therubyracer'
# JavaScriptコードを実行するためのエンジン
gem 'execjs'
# Twitter社が提供しているCSSとJavaScriptのフレームワーク
gem 'twitter-bootstrap-rails'
```

```
bundler install
rails g bootstrap:install less
yes | rails g bootstrap:themed Machines
rails g bootstrap:layout application fluid -f
```

## 画面確認

```bash:
rails s
```

* http://localhost:3000/machines/
* レスポンシブに対応

![wide.png](https://qiita-image-store.s3.amazonaws.com/0/25728/1719e8c1-0c9d-af75-7ebd-2339b0fc4a00.png)

![bb.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f0043f2c-0356-77c0-dc43-41a97e9463e2.png)

## Linkを消す場合は以下を削除

```erb:app/views/layouts/application.html.erb
51:            <li><%= link_to "Link1", "/path1"  %></li>
52:            <li><%= link_to "Link2", "/path2"  %></li>
53:            <li><%= link_to "Link3", "/path3"  %></li>
70:              <li><%= link_to "Link1", "/path1"  %></li>
71:              <li><%= link_to "Link2", "/path2"  %></li>
72:              <li><%= link_to "Link3", "/path3"  %></li>
```

----

## あとでカラムを追加したい場合

```
rails generate migration \
    AddOrderToMachines order:text
rails db:migrate
```
cronに登録したバッチからエンコードの問題でメール送信が失敗する場合

## 現象

* fcron + archlinuxにて遭遇

> Failed to create encoded message: Invalid or incomplete multibyte or wide character
... message not sent

## 対策

```
crontab -e
```

```diff:LANG指定にて回避できた
+ LANG=ja_JP.UTF-8

 2 5 * * * $HOME/cron/report.sh
```

また、バッチ($HOME/cron/report.sh)側でもLANG指定をしておく。
Karabiner | 外付けキーボードを外しても内蔵キーボードが無効になってしまう原因

「外付けマウス」 を「USB レシーバー」で接続していても無効になってしまう。

どうやら「Logitech のUSBレシーバー」を使うと起きる現象のようだ。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/a844dbaf-28ec-b487-a5b0-0a07259fb43b.png)

# 解決方法

本記事コメント欄より。

>Logitech Unifying Receiver でマウスしか使っていないのであれば、
>件のオプションの下の「Treat Logitech Unifying as pointing device.」をチェックすれば無効にならないようにできそうです。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/a1d75de2-dd2a-8e63-cf4f-ac72f12f7488.png)

Thanks! @shuhei 

# 参考

- [外付けキーボードを接続したときだけ MacBook の内蔵キーボードを無効化する](http://qiita.com/shuhei/items/fcaee827b9bf256820b6
)



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Rで、行列計算を使ってかけ算の九九の表を作ってみたかったのです。



(2016-03-30)似た記事があったことに気がつきました。
Rで九九を出力するワンライナー
http://qiita.com/sasanquaneuf/items/0f299722fb8a82f107c4
モダンな書き方な気がします。
　　
また、コメント欄も併せてご覧頂ければ、私の書いた内容よりも、もっとエレガントな書き方が確認できると思います。
＝＝＝

#ベクトルや行列計算の練習として、かけ算の九九の表を作って見ました。
（今の私の実力では）Excelで、作成した方早いですが、行列操作の基礎の練習とrepコマンドの使い方を確認できました。


二つの縦に9個(1, 2, ...9)と横に9個(1, 2, ...9)からなる行列を組み合わせて、かけ算しました。


```R:kakezan.R
#9x9 かけ算九九の表

VecA <- rep((1:9),9)
matA <- matrix(VecA, 9, 9)

VecB <- rep(1:9, rep(9,9))
matB <- matrix(VecB, 9, 9)

matC <- matA*matB

View(matC)
```
結果のスクリーンショットです！
![九九の表.png](https://qiita-image-store.s3.amazonaws.com/0/22082/fa91b599-95c3-fe26-906c-926adbcc3e88.png)
常用域でO(1)のleftpad

常用領域(追加するスペース/0の数が25個ぐらいだろうという想定)だとO(1)なleftpad実装です。チートです。0とスペース以外を埋めることはない、という割りきりで、それ以外が来たら拒否します。

常用領域外はO(n)ですが、O(n)表記は定数ぶぶんは省略してしまうので表記だけ見ても違いは分からないのですが、同じO(n)でも25個ずつ繋ぐので、最大で25倍速いです。node.js 5.7を利用してます。

| |4|8|16|32|64|128|
|---|---|---|---|---|---|---|
|leftpad|12|80|179|320|552|1100
|lodash.startPad|60|219|237|257|275|303|
|チート版|12|15|13|24|31|49|

数値は処理時間(mS)なので、短いほど良いという表です。

__3/27追加__: 要望があったのでlodash.startPad()との比較を追加

コードはPublic Domain(Unlicense)です。

```js:leftpad.js
'use strict';

var padStart = require("lodash").padStart;

var spaces = [
    '',
    ' ',
    '  ',
    '   ',
    '    ',
    '     ',
    '      ',
    '       ',
    '        ',
    '         ',
    '          ',
    '           ',
    '            ',
    '             ',
    '              ',
    '               ',
    '                ',
    '                 ',
    '                  ',
    '                   ',
    '                    ',
    '                     ',
    '                      ',
    '                       ',
    '                        ',
    '                         '];

var zeros = [
    '',
    '0',
    '00',
    '000',
    '0000',
    '00000',
    '000000',
    '0000000',
    '00000000',
    '000000000',
    '0000000000',
    '00000000000',
    '000000000000',
    '0000000000000',
    '00000000000000',
    '000000000000000',
    '0000000000000000',
    '00000000000000000',
    '000000000000000000',
    '0000000000000000000',
    '00000000000000000000',
    '000000000000000000000',
    '0000000000000000000000',
    '00000000000000000000000',
    '000000000000000000000000',
    '0000000000000000000000000'];


// left-pad
function leftpad1(str, len, ch) {
  str = String(str);

  var i = -1;

  if (!ch && ch !== 0) ch = ' ';

  len = len - str.length;

  while (++i < len) {
    str = ch + str;
  }

  return str;
}

// チート版
function leftpad2(str, len, ch) {
  str = String(str);
  var chars;
  if (!ch && ch !== 0) chars = spaces;
  else if (ch === 0) chars = zeros;
  else if (ch === ' ') chars = spaces;
  else throw new Error("ch should be ' ' or 0");

  len = len - str.length;
  if (len < 1) {
    return str;
  } else if (len < 25) {
    return chars[len] + str;
  }
  var len2 = Math.floor(len / 25);
  var pad = chars[len % 25];
  for (var i=0; i<len2; i++) {
    pad += chars[25];
  }
  return pad + str
}

const len = parseInt(process.argv[2], 10);
const count = 1000000;

console.log("pad length", len);

console.log("leftpad1", leftpad1('aaaa', len, 0))
console.time('leftpad1');
for (let i = 0; i < count; i++) {
    leftpad1('aaaa', len, 0);
}
console.timeEnd('leftpad1');

console.log("padStart", padStart('aaaa', len, 0))
console.time('padStart');
for (let i = 0; i < count; i++) {
    padStart('aaaa', len, 0);
}
console.timeEnd('padStart');

console.log("leftpad2", leftpad2('aaaa', len, 0))
console.time('leftpad2');
for (let i = 0; i < count; i++) {
    leftpad2('aaaa', len, 0);
}
console.timeEnd('leftpad2');
```
Travis CI で Swift Package Manager を試す 🚀

Travis CI で Swift Package Manager を試す方法を共有します。

ただし Swift 3.0 正式リリースまでに役に立たなくなるかもしれません。
⚠️___今のうちに試したい方向けです。___

![スクリーンショット 2016-03-26 17.53.55.png](https://qiita-image-store.s3.amazonaws.com/0/105213/8bb7fe7c-0e0c-2137-716e-194596b6e537.png)

## 前提

- あくまで Travis CI で `$ swift build` が使えることを確認するのが目的です。
  - Swift 2.2 サポートのライブラリは `$ swift build` できません。
  - そのため `$ swift build --fetch` のみ実行しています。
  - `$ swift test` は実行していません。
- 3月24日付の __[Development Snapshots](https://swift.org/download/#snapshots)__ を使用しています。
  - `swift-DEVELOPMENT-SNAPSHOT-2016-03-24-a`
- これは __最低限__ の設定です。ご自身の環境に応じてほかの設定を追加してください。

## 設定内容

```yaml:.travis.yml
language: objective-c
osx_image: xcode7.3
script:
  - swift build --fetch
before_install:
  - export SWIFT_VERSION=swift-DEVELOPMENT-SNAPSHOT-2016-03-24-a
  - curl -O https://swift.org/builds/development/xcode/${SWIFT_VERSION}/${SWIFT_VERSION}-osx.pkg
  - sudo installer -pkg ${SWIFT_VERSION}-osx.pkg -target /
  - export TOOLCHAINS=swift
```

### 変更版
（2016-04-08 追記）

Travis CI のフォーマットに従えば `env:` で環境変数を設定できますね。
（ついでに変数名を `TOOLCHAIN_VERSION` に変更したのがまぎらわしいですが 🙏）

```diff:.travis.yml
 language: objective-c
 osx_image: xcode7.3
+env:
+  - TOOLCHAINS=swift
 script:
   - swift build --fetch
 before_install:
-  - export SWIFT_VERSION=swift-DEVELOPMENT-SNAPSHOT-2016-03-24-a
-  - curl -O https://swift.org/builds/development/xcode/${SWIFT_VERSION}/${SWIFT_VERSION}-osx.pkg
-  - sudo installer -pkg ${SWIFT_VERSION}-osx.pkg -target /
-  - export TOOLCHAINS=swift
+  - TOOLCHAIN_VERSION=swift-DEVELOPMENT-SNAPSHOT-2016-03-24-a
+  - curl -O https://swift.org/builds/development/xcode/${TOOLCHAIN_VERSION}/${TOOLCHAIN_VERSION}-osx.pkg
+  - sudo installer -pkg ${TOOLCHAIN_VERSION}-osx.pkg -target /
```

> [https://docs.travis-ci.com/user/environment-variables/#Defining-Variables-in-.travis.yml:title]


## 結果

```bash
The command "swift build --fetch" exited with 0.
Done. Your build exited with 0.
```

## 参考

__try! Swift__
JP Simard ([@simjp](https://twitter.com/simjp)) さん『実践的クロスプラットフォーム Swift』
https://speakerdeck.com/jpsim/practical-cross-platform-swift?slide=36

### 補足

https://github.com/apple/swift-package-manager/blob/swift-DEVELOPMENT-SNAPSHOT-2016-03-24-a/README.md

Xcode 7.3 では次のとおり設定します。

- Xcode 7.3

```bash:.travis.yml
export TOOLCHAINS=swift
```

- Xcode 7.2

```bash:.travis.yml
export PATH=/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2016-03-24-a.xctoolchain/usr/bin:"${PATH}"
```

# おまけ

Apple の方がメーリングリストに次のとおり送っています。（2016年1月）

https://lists.swift.org/pipermail/swift-build-dev/Week-of-Mon-20160111/000233.html
> We are hoping that people will adopt SwiftPM.
>
> - - -
>
> Alternatively, call it `swift build`

[Swift.org のコミュニティ内](https://swift.org/community/) では __SwiftPM__ または __`swift build`__ と呼んだほうがよいでしょうね。💁
【swift】Objective-C時代のDBGPみたいなのを作ってみた

# 経緯
+ objective-c時代にDBGP(Debag Print)が使われていたのが、少し便利だった
+ 軽くswiftのを探したけど、見つからんかったのでなんとなく作ってみた

- Update版を制作中です...

# Objective-CのDBGP
```objc
// Macro for create LogString
#define LOG_STR() [NSString stringWithFormat:@"%s(%d)", __FUNCTION__, __LINE__]
// Macro for DebugPrint
#define DBGP(...) ERRP(__VA_ARGS__)
//#define DBGP(...)
// Macro for ErrorLog
#define ERRP(...) NSLog(@"%@ %@", LOG_STR(), [NSString stringWithFormat:@""__VA_ARGS__])
```

# Swiftで書いてみた(Version1.2です)

```swift
public func DGBP(value:Any..., function: StaticString = __FUNCTION__, file: StaticString = __FILE__, line: UInt = __LINE__){
    #if DEBUG
        var message = ""
        for element in value {
            var eachMessage = "\(element)"
            let pattern = "Optional\\((.+)\\)"
            eachMessage = eachMessage
                .stringByReplacingOccurrencesOfString(pattern,
                    withString:"$1",
                    options:.RegularExpressionSearch,
                    range: nil)
            message += eachMessage
        }
        Swift.print("[\(NSDate())]// \(message) //function: \(function), file: \(file), line: \(line)")
    #endif
}
```

# 実行結果
```swift
DBGP("aaaa")
```

```
[2016-03-27 00:13:25 +0000]// aaaa //function: viewWillAppear, file: /Users/~~/~~/~~/~~/OOOOViewController.swift, line: 50
```

#今後
+ 今後もう少し改良してerrorのやつも書いたらUPし直します〜
+ 指摘、修正はどんどん募集します
sliceの重複チェックを高速化

sliceの重複チェックはmapを使うと高速に動作させることができます。

```go
// 重複した要素を削除して返却
func removeDuplicate1(args []string) []string {
	results := make([]string, 0, len(args))
	encountered := map[string]bool{}
	for i := 0; i < len(args); i++ {
		if !encountered[args[i]] {
			encountered[args[i]] = true
			results = append(results, args[i])
		}
	}
	return results
}
```

以下のようにfor文を２重ループさせる方法だと最大でデータ数-1の階乗分の比較処理が行われるため、データ数が増えるにつれ指数関数的に処理時間が増えてしまいます。

```go
// 重複した要素を削除して返却
func removeDuplicate2(args []string) []string {
	results := make([]string, 0, len(args))
	for i := 0; i < len(args); i++ {
		dup := false
		for j := 0; j < len(results); j++ {
			if args[i] == results[j] {
				dup = true
				break
			}
		}
		if !dup {
			results = append(results, args[i])
		}
	}
	return results
}
```

## ベンチマーク結果

```go
func BenchmarkRemoveDuplicate1(b *testing.B) {
	data := make([]string, 0, 100000)
	for i := 0; i < 100000; i++ {
		data = append(data, fmt.Sprintf("test-%08d", i%99000))
	}

	as := assert.New(b)
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		result := removeDuplicate1(data)
		as.Len(result, 99000)
	}
}

func BenchmarkRemoveDuplicate2(b *testing.B) {
	data := make([]string, 0, 100000)
	for i := 0; i < 100000; i++ {
		data = append(data, fmt.Sprintf("test-%08d", i%99000))
	}

	as := assert.New(b)
	b.ResetTimer()
	for i := 0; i < b.N; i++ {
		result := removeDuplicate2(data)
		as.Len(result, 99000)
	}
}
```

```
$ go test -bench .
PASS
BenchmarkRemoveDuplicate1-4	      50	   31949991 ns/op
BenchmarkRemoveDuplicate2-4	      1		44521444122 ns/op
```

10万件のデータでかなり速度に違いが出ています。

## おまけ(応用)
SQLのDISTINCTは重複を削除する際に内部的にソートが行われるため負荷の高い処理となります。
SQL側で重複削除する方法がDISTINCT以外にない場合は、SQL側で行わずに呼び出し側で重複削除した方が高速化する場合があります。

```go
func SelectXxxx(db *sql.DB) ([]string, error) {
	query := "SELECT xxxx FROM table"
	values := []interface{}{}
	encountered := map[string]bool{}

	rows, err := db.Query(query, nil)
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	xxxx := []string{}
	var x string
	for rows.Next() {
		err := rows.Scan(
			&x,
		)
		if err != nil {
			return xxxx, err
		}
		if !encountered[x] {
			encountered[x] = true
			xxxx = append(xxxx, x)
		}
	}
	return xxxx, rows.Err()
}
```

またslice同士の重複チェックを行う時も2つのsliceを２重ループさせるより片方のsliceを一旦mapにしてから重複チェックした方が早くなります。

```go
// targetに含まれる要素を削除して返却
func removeTargetIncluded(args []string, target []string) []string {
	results := make([]string, 0, len(args))
	targetMap := map[string]bool{}
	for i := 0; i < len(target); i++ {
		targetMap[target[i]] = true
	}
	for i := 0; i < len(args); i++ {
		if !targetMap[args[i]] {
			results = append(results, args[i])
		}
	}
	return results
}
```

## 参考
http://www.dotnetperls.com/duplicates-go
動的にSegmentedControlの数を変える方法

# 経緯
+ コードでどうしてもSegmentedControlの数を変えたかった
+ すでにある投稿の中で[addSubViewして動的に変える方法](http://qiita.com/BOPsemi/items/9e668d76df1770f5667c)が載っていたが、addSubViewはしたくなかった
+ ついでにextension作ってしまおう！

# 方法
+ Storyboardかコードでsegmentをはっつけて、StoryboardならばIBOutlet接続しておく
+ 下のextensionをコピってきて、


```swift
segment.changeAllSegmentWithArray(["んっぽう！","んっぴゅう！","んってぅ！"])
```


# Extension
```UISegmentedControlExtension.swift
extension UISegmentedControl {
    func changeAllSegmentWithArray(arr: [String]){
        self.removeAllSegments()
        for str in arr {
            self.insertSegmentWithTitle(str, atIndex: self.numberOfSegments, animated: false)
        }
        self.selectedSegmentIndex = 0
    }
    
}
```

# 参考 
+ http://qiita.com/BOPsemi/items/9e668d76df1770f5667c

# 最後に
+ そんな大したことないですが、参考までにどうぞ
体育会系 Amazon EC2 を Vagrant 経由で起動する手順


## 参考

- https://github.com/mitchellh/vagrant-aws
- http://qiita.com/hmuronaka/items/b96aeb8179a4c74a4f9e

有難うございます。

## 事前の準備

- IAM ユーザーを作成し Managed Policy の AmazonEC2FullAccess をアタッチしておく
- IAM ユーザーのアクセスキーID を確認しておく
- IAM ユーザーのシークレットアクセスキーを確認しておく
- SSH key にて鍵を発行しておく
- セキュリティグループの ID を確認しておく
- VPC のサブネット ID を確認しておく
- Vagrant の導入、[vagrant-aws](https://github.com/mitchellh/vagrant-aws) の導入

## 本記事の環境について

### vagrant を実行する環境

~~~sh:vagrantを実行する環境
ProductName:    Mac OS X
ProductVersion: 10.11.4
BuildVersion:   15E49a
~~~

### vagrant のバージョン

~~~sh:vagrantのバージョン
Installed Version: 1.8.1
Latest Version: 1.8.1
~~~

## vagrant-aws の導入

~~~sh:command
vagrant plugin install vagrant-aws
~~~

## Vagrantfile の作成

### プロジェクトディレクトリの作成

~~~sh:command
mkdir ~/path/to/vagrant_ec2
~~~

### vagrant init

~~~sh:command
cd ~/path/to/vagrant_ec2
vagrant init
~~~

`vagrant init` を実行すると Vagrantfile が生成される。

### Vagrantfile

~~~ruby:Vagrantfile
#
# - ami-a21529cc を利用して Ubuntu 14.04 インスタンスを t2.micro で起動する
# - VPC 内にインスタンスを起動する
#
Vagrant.configure(2) do |config|
  config.vm.box = "dummy"
  config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"

  config.vm.provider :aws do |aws, override|
    aws.access_key_id = "${アクセスキー ID}"
    aws.secret_access_key = "${シークレットアクセスキー}"
    aws.region = "ap-northeast-1"
    aws.keypair_name = "${KEYNAME}"
    aws.ami = "ami-a21529cc"
    override.ssh.username = "ubuntu"
    override.ssh.private_key_path = "/path/to/${KEYNAME}.pem"
    aws.security_groups = ["${SECURITY_GROUP_ID}", "${SECURITY_GROUP_ID}", "${SECURITY_GROUP_ID}", "${SECURITY_GROUP_ID}", "${SECURITY_GROUP_ID}"] 
    aws.subnet_id = "${SUBNET_ID}"
    aws.instance_type = "t2.micro"  
  end  
end
~~~

本来はアクセスキー ID やシークレットアクセスキーを直接 Vagrantfile に書くのはイケてないので環境変数に登録しておくと良い。

~~~sh:command
export AWS_ACCEESS_KEY_ID="AKxxxxxxxxxxxxxxxxxxxxxxxxxx"
export AWS_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
~~~

環境変数に登録した場合には Vagrantfile は以下のように書いておく。

~~~ruby:Vagrantfile
  config.vm.box = "dummy"
  config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"

  config.vm.provider :aws do |aws, override|
    aws.access_key_id = ENV["AWS_ACCEESS_KEY_ID"]
    aws.secret_access_key = ENV["AWS_SECRET_ACCESS_KEY"]
    aws.region = "ap-northeast-1"
    aws.keypair_name = "${KEYNAME}"
    aws.ami = "ami-a21529cc"
    override.ssh.username = "ubuntu"
    override.ssh.private_key_path = "/path/to/${KEYNAME}.pem"
    aws.security_groups = ["${SECURITY_GROUP_ID}", "${SECURITY_GROUP_ID}", "${SECURITY_GROUP_ID}", "${SECURITY_GROUP_ID}", "${SECURITY_GROUP_ID}"] 
    aws.subnet_id = "${SUBNET_ID}"
    aws.associate_public_ip = true
    aws.instance_type = "t2.micro"  
  end  
end
~~~


## 仮想マシンの起動、ログイン、停止、破棄

### 仮想マシンの起動

~~~sh:command
vagrant up --provider aws 
~~~

### 仮想マシンへのログイン

~~~sh:command
vagrant ssh
~~~

### 仮想マシンの停止

~~~sh:command
vagrant halt
~~~

### 仮想マシンの破棄

~~~sh:command
vagrant destroy
~~~

## 以上

Amazon EC2 を Vagrant 経由で起動する手順でした。
AD2 > Link > reference manual > 9.1 Analog Inputs (Scope) > Triggering: edge, pulse, transition, hysteresis, etc.

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#features_and_performances) 9. Features and Performances > 9.1 Analog Inputs (Scope)

> Triggering: edge, pulse, transition, hysteresis, etc.16)

トリガはスタンドアロンのオシロでは edge と level しか使ったことがなかった。


色々トリガがあるようだが、transitionとhysteresisトリガは未消化。
hysteresis はシュミットトリガのyoutube動画で出てきたので事象としては知っているが、そのトリガとedgeトリガをどう区別しているのか。

### 関連リンク

[PDF > Triggering Fundamentals - Tektronix](http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&sqi=2&ved=0ahUKEwiF2ernrt_LAhWG6KYKHR9bBToQFggmMAE&url=http%3A%2F%2Fwww.tek.com%2Fdl%2F55W_17291_6_0.pdf&usg=AFQjCNGb_G9pReJyxxZ1Lmnmdmq8Zvu2zQ&sig2=b0YYcrDMyvXNwW7i_lFPZw&bvm=bv.117868183,d.dGY)

https://www.picotech.com/library/oscilloscopes/advanced-digital-triggers
AD2 > Link > reference manual > 9.1 Analog Inputs (Scope) > Analog bandwidth with Discovery BNC adapter12): 30 MHz+ @ 3dB, 10 MHz @ 0.5dB, 5 MHz @ 0.1dB > BNCアダプタとWire Kitとの違い

@ [reference manual](https://reference.digilentinc.com/analog_discovery_2:refmanual#features_and_performances) 9. Features and Performances > 9.1 Analog Inputs (Scope)

> Analog bandwidth with Discovery BNC adapter12): 30 MHz+ @ 3dB, 10 MHz @ 0.5dB, 5 MHz @ 0.1dB
Analog bandwidth with Wire Kit13): 9 MHz @ 3dB, 2.9 MHz @ 0.5dB, 0.8 MHz @ 0.1dB

BNCアダプターの方が同じノイズレベルで高い周波数まで使えるようになっている。

BNCアダプターとWire Kit(という名前なのか）の使用時の違いは気づいている点で以下の二点ある。

1. プローブを使用/不使用 (リード線の長さに関連)
2. Scope の Negative を GND に落としている

2の状態にすると確かにノイズは減るが、差動入力を諦めることになる。
技術英語 > since ancient times,  / since I can remember / before I can remember


http://loe.org/shows/shows.html?programID=03-P13-00008
> Many cultures have worshipped and sung to the sun <font color=red>since ancient times</font>, 

<hr>
関連して思い出したのは

since I can remember

http://eow.alc.co.jp/search?q=since+I+can+remember

> もの心ついてから、ずっと昔から、ずっと前から

覚える前、すなわち、もの心ついてない、と勝手に覚えている。

<hr>

Voyagerで以下の使い方があった。エピソードは失念。

> before I can remember

字幕は「小さい頃から」だが、「もの心つく前」が正しいように思う。
さくらのレンタルサーバーライトでRubyからSQLiteを利用する方法

# そのままでは使えない

「使える」って書いてあるけど、そのままでは使えない。
PHPでは動くみたいなのでSQLite自体は利用可能であることを確認。

ちなみに、Rubyのバージョンを確認すると1.8.7でした。

# Googleで検索

同じようなことをされている方がおられたのですが、リンク先がなくなっていて関係ファイルがダウンロードできませんでした。
http://hal2008.sblo.jp/article/25836286.html

## Debianのアーカイブで必要なファイルを発見

以下のサイトから「sqlite3-ruby_1.2.2.orig.tar.gz」をダウンロードして展開し、libフォルダを入手。
https://archive.debian.net/ja/source/lenny/sqlite3-ruby

これから他のライブラリを使う時に同じようなことをする可能性を感じたので、ホームディレクトリに「lib」というフォルダを作って、そこにコピーしました。

2016.04.07 追記
以下のURLにてGitHubからも古いソースコードがダウンロードできました。
https://github.com/sparklemotion/sqlite3-ruby/archive/v1_2_2.tar.gz

# テストコードの作成

以下のサイトを参考にテストコードを作成。
http://o.inchiki.jp/obbr/39

ちなみに、さくらのレンタルサーバーにはdbというフォルダがあるので、そこにSQLiteのファイルを保存。

```ruby:sample.cgi
#!/usr/local/bin/ruby

$LOAD_PATH << "/home/[ユーザー名]/lib"

require "sqlite3"

print <<EOF
Content-Type: text/html

EOF

print RUBY_VERSION

db = SQLite3::Database.new("/home/[ユーザー名]/db/sample.db")
sql = "SELECT * FROM test;"

rs = db.execute2(sql)

puts "<p>#{rs.count}</p>"

rs.each do |row|
  puts "<p>[#{row[0]}]</p>"
end

db.close
```

動いた！

# 雑感

せっかくRuby2.x系に移行してきたのに、また1.8系を触ることになるとは...
関数内で配列を動的に生成して返す

関数内で配列をnewする際、 関数内で操作した配列を呼び出し元に返したいケースにおいて結構迷ってしまったのでメモ。 
約数を求める関数を作った場合を例に挙げます。

```main.cpp

#include <iostream>
#include <queue>
using namespace std;

//約数の個数を求める
int f(int a, int*& temp){ //配列cのポインタの参照を受け取る
    
    queue<int> qu;
    int n=0;
    for(int i=1; i<a+1; i++){
        if(a%i==0){
            qu.push(i);
            n++;
        }
    }
    cout << "約数の個数は" << n << endl;
    
    temp = new int [n]; //配列を動的に確保
    
    for(int i=0; i<n; i++){
        temp[i]=qu.front();
        qu.pop();
    }
    
    return n;
    
}

int main(void){
    
    int *c;
    int num_div = f(8, c); //num_divに配列の長さ、配列cに約数が格納される
    
    for(int i=0; i<num_div; i++){
        cout << c[i] << endl; //1,2,4,8が格納されていることがわかる
    {
    
    delete[] *c;
       
}

```

こうすることで約数を確保するのに必要最低限の長さの配列を確保することができます。
EmbulkでMySQLのデータをBigQueryにロードするのに便利なツール

はてなブログで書いた記事のQiita版です。
Qiitaでは比較的にEmbulk、BigQuery関連の投稿を見かけるので参考になればと思います。

[Samidare](https://github.com/cobot00/samidare)を作成した経緯などは以下のリンク先を参照ください。ここでは機能・メリットと利用方法について記します。
[EmbulkでMySQLのデータをBigQueryにロードするのに便利なツールの開発](http://cobot.hatenablog.com/entry/2016/01/10/010251)

## Samidareの仕様・機能
* Ruby製でgemとして提供されています
* YAMLでMySQLのDB接続設定と対象テーブルを列挙するだけで実行できる
* MySQLのテーブルスキーマを基にEmbulkの設定、BigQueryのテーブルスキーマを生成してくれる
* 生成した設定をまとめて実行する(任意のテーブルのみ実行することも可能)
* 実行時にBigQueryにテーブルを作成する(事前に作成する必要がない)
* BigQueryへのロードの落とし穴を解決(tinyint変換、タイムゾーン問題)

細部の仕様、実行オプションなどは [Samidare](https://github.com/cobot00/samidare) を参照ください。

## 事前準備
以下のEmbulkプラグインのインストールが必要です。

```bash
embulk gem install embulk-input-mysql
embulk gem install embulk-output-bigquery
embulk gem install embulk-parser-jsonl
embulk gem install embulk-formatter-jsonl
```

## MySQLのDB接続設定(database.yml)
`database.yml` にMySQLのDB接続設定を記述します。
DB毎に任意の定義名を設定してください。以下のサンプルでは定義名として `db01` を設定しています。

```yaml
db01:
  host: localhost
  username: root
  password: pswd
  database: production
  bq_dataset: mysql_db01
```

## ロード対象テーブルの設定(table.yml)
`database.yml` のDB定義名毎に対象テーブルを `table.yml` に設定します。
`table.yml` を変更したら、必ず `generate_config` を実行してEmbulkの設定、BigQueryのテーブルスキーマを再作成してください。

```yaml
db01:
  tables:
    - name: users
    - name: events
    - name: hobbies
```

## Samidareの実行
以下は `Ruby` のサンプルコードです。BigQueryの接続設定と設定の出力先をハッシュにして引数にしてください。 `generate_config` は `database.yml` と `table.yml` に変更がなければ実行する必要はありません。

```rb
require 'samidare'

bq_config = {
 'project_id' => 'BIGQUERY_PROJECT_ID',
 'service_email' => 'SERVICE_ACCOUNT_EMAIL',
 'key' => '/etc/embulk/bigquery.p12',
 'schema_dir' => '/var/tmp/embulk/schema',
 'config_dir' => '/var/tmp/embulk/config',
 'auth_method' => 'private_key'
}

client = Samidare::EmbulkClient.new
client.generate_config(bq_config) # Embulkの設定・BigQueryのテーブルスキーマの作成
process_status = client.run(bq_config) # Embulkの実行
exit 1 unless process_status
```
gulpエラー

**gulp-combine-media-queries**

「buffer.js:169
  throw new TypeError('must start with number, buffer, array or string');...」が出る
gulp-combine-media-queries/index.jsの152行目を削除

```gulp-combine-media-queries/index.js
file.contents = new Buffer(cssJson);
```

**gulp-ejs**

拡張子が.ejsのまま
version2.0.0の仕様
gulpfile.jsの「ejs()」部分書き換え拡張子オプション追加

```gulpfile.js
ejs({}, {ext: '.html'})
```
Atomのショートカットキー


## 全般
| 操作 | 概要 |
|:-----------|:-----------|
|cmd + o|ファイルを開く|
|cmd + \ |TreeViewを開く|
|ctrl + 0|TreeViewにフォーカスを移動する|
|shift + cmd + p|コマンドパレットを開く|
|ctrl + shift + l | 言語を選択する |
|ctrl + shift + m | マークダウンのプレビューを表示する |

## 検索・置換
| 操作 | 概要 |
|:-----------|:-----------|
|cmd + t|今いるディレクトリからファイルを検索する|
|cmd + b|今開いているタブからファイルを検索する|
|cmd + f | ファイル内検索|
|cmd + shift + f | ディレクトリ内をファイル内検索|
|cmd + r | シンボル検索|
|cmd + Enter|すべて置換（検索パネルを開き、Replaceにフォーカスしている前提）|

## 移動
| 操作 | 概要 |
|:-----------|:-----------|
|ctrl + m | 対応するカッコに飛ぶ |
|ctrl + cmd + m | カッコ内をすべて選択する |
|ctrl + g | 指定行にジャンプ |
|cmd + f2 | ブックマークする|
|f2 | 次のブックマークへ移動する|
|ctrl + f2 | ブックマークの一覧を開く|

## マルチカーソル
| 操作 | 概要 |
|:-----------|:-----------|
|cmd + d | 同じ単語を選択 |
|cmd + u| マルチカーソルを元に戻す |
|cmd + d| マルチカーソルをスキップする|
|cmd + ctrl + g|同じ単語を全て選択する|

## 行操作
| 操作 | 概要 |
|:-----------|:-----------|
|cmd + ctl + ↑↓| 行入れ替え|
|cmd + l | 行選択|
|crtl + shift + k |行を削除|
|cmd + shift + d |行を複製|
|cmd + [ / ] | インデント|
|cmd + enter | 新しい行を作る |

## パネル操作
| 操作 | 概要 |
|:-----------|:-----------|
|cmd + k + 矢印| パネル作成|
|cmd + k cmd + 矢印| パネル間の移動|
マインクラフトのマルチサーバーで使用するメモリ使用量を変更する

マインクラフトのマルチサーバーをさくらVPSで運営しているが、
日に日にメモリ使用量が増えてきている。

```bash
$ ps axu
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
1000     31055  0.0  0.0  22016   144 ?        Ss    3月21   0:00 SCREEN -h 102
1000     31056  7.1 76.6 4620660 779372 pts/0  Ssl+  3月21 618:36 java -Xmx2048
```

779,372 KB、このままでは契約の1GBになってメモリ不足になってしまう。

# マインクラフトサーバーのメモリ指定

[Minecraftサーバーに割り当て可能なメモリー量を増やす](http://minecraft-ja.gamepedia.com/%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB/%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97#Minecraft.E3.82.B5.E3.83.BC.E3.83.90.E3.83.BC.E3.81.AB.E5.89.B2.E3.82.8A.E5.BD.93.E3.81.A6.E5.8F.AF.E8.83.BD.E3.81.AA.E3.83.A1.E3.83.A2.E3.83.AA.E3.83.BC.E9.87.8F.E3.82.92.E5.A2.97.E3.82.84.E3.81.99) 

どうやら起動スクリプトの指定で使用するメモリ量を変更できるらしい。

```bash:/etc/init.d/minecraft
 MAXHEAP=2048
 MINHEAP=1024
 HISTORY=1024
 CPU_COUNT=1
 INVOCATION="java -Xmx${MAXHEAP}M -Xms${MINHEAP}M -XX:+UseConcMarkSweepGC \
 -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=$CPU_COUNT -XX:+AggressiveOpts \
 -jar $SERVICE $OPTIONS"
```

MAXHEAP（最大）が2048、MINHEAP（最小）が1024。[オラクルのドキュメント](http://otndnld.oracle.co.jp/document/products/jrockit/jrdocs/refman/optionX.html)には単位付けないとバイト指定とあるが、よく見ると変数展開の後(`-Xmx${MAXHEAP}M`)にMとあるのでMB単位となる。

# MAXHEAPとMINHEAPとは何か？

[チューニングのためのJava VM講座（後編）：ガベージコレクタの仕組みを理解する (2/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/0404/02/news079_2.html)

>
-Xms、-Xmx（-Xms≦-Xmx）に異なる値を設定すると、ヒープサイズは起動時には-Xmsで指定された大きさですが、状況によってJVMがヒープが足りないと判断した場合は最大-Xmxで指定した大きさまで拡大します。これらの値を同じにするとヒープサイズ調整のオーバーヘッドがなくなりパフォーマンスが上がる場合もあります。


Java仮想マシンのガベージコレクションを行う値らしい。
通常はMINHEAPまで溜まったらガベージコレクションが実行されてメモリを回収するが、場合によってはMAXHEAPということのようだ。

# メモリ使用量を設定

```bash:/etc/init.d/minecraft
 #MAXHEAP=2048
 MAXHEAP=640
 #MINHEAP=1024
 MINHEAP=512
 HISTORY=1024
 CPU_COUNT=1
 INVOCATION="java -Xmx${MAXHEAP}M -Xms${MINHEAP}M -XX:+UseConcMarkSweepGC \
 -XX:+CMSIncrementalPacing -XX:ParallelGCThreads=$CPU_COUNT -XX:+AggressiveOpts \
 -jar $SERVICE $OPTIONS"
```

どうせ数人しかいないので640MB、512MBに制限することにした。
[RaspberryPi][Ruby]ADコンバータ+土壌湿度センサー+Rubyで土壌の水分を計る

#はじめに

育てている盆栽の水やりのタイミングを見える化したかったので、ラズベリーパイ、ADコンバータ、土壌湿度センサーを使って、Rubyで土の中の水分を計測します

#電子部品

- [Raspberry Pi 2 B](http://www.amazon.co.jp/dp/B00WLHTPRY/ref=cm_sw_r_tw_dp_GNQ9wb1DM8PDD)
- [ADコンバータ](http://akizukidenshi.com/catalog/g/gI-00238/) 秋月電子で購入
- [土壌湿度センサー](http://www.aitendo.com/product/7417) aitendoで購入

＊aitendoで購入したのはコンパレータモジュール(YL-38)と土壌湿度プローブ(YL-96)
＊コンパレータモジュール(YL-38)にはデジタル出力が付いているが、数値の計測はできないみたいなので、アナログ出力を使って、ADコンバータを通して計測していく

#ラズベリーパイの環境

Raspbian GNU/Linux 8
ruby 2.1.5p273

#参考

- [Raspberry Pi + ruby + pi_piper + MCP3208でSPI通信 / アナログ入力](http://qiita.com/github0013@github/items/9b7fd5f54a62d4a64c2f)
- [PI-IO](http://pi-io.com/apps/ad-converter/mcp3208/)
- [raspberrypi.stackexchange.com](http://raspberrypi.stackexchange.com/questions/40829/rpi-2-spi-bcm2708-or-spi-bcm2709)

#計測
##1.ラズベリーパイでSPI通信の準備

デフォルトだとラズベリーパイのSPI通信がオフになっているので、有効化する

```lang:cmd
sudo /usr/bin/raspi-config
```

設定画面を立ち上げて、「9 Advanced Options」を選択、その次のメニュー選択で「A6 SPI」を選択する
その後、再起動


再起動後、lsコマンドで確認する
/dev/spidev0.0と/dev/spidev0.1が表示されればOK

```lang:cmd
ls /dev/spi*
```

＊参考などの他の情報にはブラックリストファイルを開き、spi-bcm2708を有効化すると書いてあるが、必要がなくなったみたい([raspberrypi.stackexchange.com](http://raspberrypi.stackexchange.com/questions/40829/rpi-2-spi-bcm2708-or-spi-bcm2709)や「spi_bcm2708' no such device」で検索)

##2.計測部品の接続

ブレットボード、ジャンパピンを使ってラズベリーパイ、ADコンバータ、土壌湿度センサーを接続していく。
接続は[PI-IO](http://pi-io.com/apps/ad-converter/mcp3208/)と[RaspberryPi Geek](http://www.raspberry-pi-geek.com/howto/GPIO-Pinout-Rasp-Pi-1-Model-B-Rasp-Pi-2-Model-B)のGPIOピン配置を参考に接続していく

![mcp32081.png](https://qiita-image-store.s3.amazonaws.com/0/106763/4e613a9d-b45b-f31a-7a46-b0d9f63fc886.png)

![GPIO_Pi2.png](https://qiita-image-store.s3.amazonaws.com/0/106763/def2e1f6-5e73-1c9a-9bb3-ad003f803a21.png)

ADコンバータのCH0と土壌湿度センサーのアナログ出力を繋げる

##3.必要なgemのインストール

RubyでGPIOを操作するライブラリ「pi_piper」をインストールする

```lang:cmd
gem install pi_piper
```

##4.pi_piperを使ってセンサーの値を取得する

[Raspberry Pi + ruby + pi_piper + MCP3208でSPI通信 / アナログ入力](http://qiita.com/github0013@github/items/9b7fd5f54a62d4a64c2f)のコードを基にコーディングした

```lang:ruby
#!/usr/local/bin/ruby
require "pi_piper"

RESOLUTION_AT_12BIT = 0b111111111111.to_f.freeze

PiPiper::Spi.begin do |spi|
  loop do
    _, center, last = spi.write [0b00000110, 0b00000000, 0b00000000]
    center = center & 0b00001111
    center = center << 8
    value =  center + last

    moist_value = RESOLUTION_AT_12BIT - value
    puts "#{moist_value}"

    sleep 0.1
  end
end
```

pi_piperからGPIOを使おうとするとroot権限が必要なので、rootユーザで実行する

```lang:cmd
root@raspberrypi:/home/pi/work# ruby bonsai.rb 
#水分が多いほど値が大きくなる
209.0
209.0
210.0
208.0
209.0
209.0
2.0
0.0
0.0
```

#その他

値の取得箇所のコードはもう少し勉強して検証したい。
また、盆栽は屋外にあるので、無線で値を取得したい。
(EC2) user-dataにshell scriptを流し込んでWebサーバ構築を自動化

### この記事の内容
AmazonECで利用可能な「ユーザーデータ」を利用してWebサーバをサクッと立てちゃおうというお話です。
本来であればイケてるプロビジョニングツールで自動化すべきなのでしょうが、ノウハウの蓄積ができていないのでこんな不様な事になってます。
逆に言えば、新たに学習コストを掛けない方法でもある程度の自動化ができるということ...なのだろうか？


### 検証環境
Amazon Linux AMI 2016.03.0 (HVM)で動作確認しました

### 手順
EC2インスタンスのセットアップについては通常の流れと同じだが、
「3.インスタンスの設定」画面で「高度な詳細」をクリックし、ユーザーデータ関連の設定を以下のように行う。

* ユーザーデータ: 「テキストで」を選択
* テキストエリアに以下のシェルスクリプトの内容をコピペする
* やっていることの説明でコメント入れてますが、実際に使うときは英文にするか消すかしておいたほうが無難(エンコーディングの問題でうまくいかないのかな？)

※当然EC2インスタンスがインターネットへ接続可能なことが前提。

```bash:user-data.sh
#!/bin/bash
HOST_F=hostname.domainname
HOST_S=hostname

# ホスト名の変更
sed -ie "s/localhost\.localdomain/${HOST_F}/g" /etc/sysconfig/network

# hostsに自分のホスト名を追加する
ip addr show | grep "inet.*eth0" | awk {'print $2'} | sed -e 's/\(.*\)\/.*$/\1/g' | xargs -I{} echo "{} ${HOST_F} ${HOST_S}" >> /etc/hosts

# タイムゾーンの変更
sed -ie 's/ZONE=\"UTC\"/ZONE=\"Asia\/Tokyo\"/g' /etc/sysconfig/clock
sed -ie 's/UTC=true/UTC=false/g' /etc/sysconfig/clock
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# ロケールの変更
sed -ie 's/en_US\.UTF-8/ja_JP\.UTF-8/g' /etc/sysconfig/i18n

# 管理用ユーザの追加
perl -e "print crypt('password', '\$6\$sa');" | xargs -I{} useradd -u 1000 -b /home/manager -d /home/manager -s /bin/bash --password {} manager

# 管理用ユーザを公開鍵認証できるように設定
mkdir /home/manager/.ssh
cp /home/ec2-user/.ssh/authorized_keys /home/manager/.ssh/authorized_keys
chmod 600 /home/manager/.ssh/authorized_keys
chmod 700 /home/manager/.ssh
chown -R manager:manager /home/manager/.ssh

# 管理用ユーザにsudo権限を与える
cp /etc/sudoers.d/cloud-init /etc/sudoers.d/manager
sed -ie 's/ec2-user/manager/g' /etc/sudoers.d/manager

# Webサーバ用ユーザの追加
useradd -u 1050 -b /home/httpd -d /home/httpd -s /sbin/nologin apache

# rpmを最新化
yum -y update

# 必要なパッケージを入れる
yum -y install gcc zlib-devel ncurses-devel pcre-devel libcurl-devel libxml2-devel 

# ソースをダウンロードしてくる
wget http://ftp.riken.jp/net/apache/httpd/httpd-2.4.18.tar.gz -O /usr/local/src/httpd-2.4.18.tar.gz
wget http://ftp.riken.jp/net/apache/apr/apr-1.5.2.tar.gz -O /usr/local/src/apr-1.5.2.tar.gz
wget http://ftp.riken.jp/net/apache/apr/apr-util-1.5.4.tar.gz -O /usr/local/src/apr-util-1.5.4.tar.gz

# 展開＆コンパイル＆インストール
cd /usr/local/src
tar -xvzf httpd-2.4.18.tar.gz
tar -xvzf apr-1.5.2.tar.gz && mv apr-1.5.2 httpd-2.4.18/srclib/apr
tar -xvzf apr-util-1.5.4.tar.gz && mv apr-util-1.5.4 httpd-2.4.18/srclib/apr-util
cd httpd-2.4.18
./configure --prefix=/usr/local/httpd-2.4.18 --enable-mods-shared=all --with-mpm=prefork
make clean && make -j2 && make install

# シンボリックリンクを貼る
ln -s /usr/local/httpd-2.4.18 /usr/local/apache2

# PATHに追加
echo "export PATH=\$PATH:/usr/local/apache2/bin" >> ~/.bash_profile
source ~/.bash_profile

# apacheのバージョンその他確認
apachectl -V >> /tmp/apache.ver

# apachectlをinit.d下にコピーしてchkconfigで制御できるようにする
cp -p /usr/local/src/httpd-2.4.18/support/apachectl /etc/init.d/httpd
chmod 755 /etc/init.d/httpd
sed -ie '17a# chkconfig: 345 99 00' /etc/init.d/httpd
chkconfig --add httpd

# reboot
reboot
```
これだとスクラップアンドビルドもそんなに大変じゃないです。。。
他のサーバにも応用が効くので色々試してみてますです。
WerckerでRe:VIEWの原稿をビルドする


[Docker](https://www.docker.com/)コンテナを使いやすい[Wercker](http://wercker.com/)というCIサービスがあるそうなので、[Re:VIEW](https://github.com/kmuto/review)で書いた原稿をビルドするようにしてみました。

サンプルのリポジトリ: https://github.com/mstssk/ReVIEW_Wercker_Sample

CircleCI 2.0の場合はこちら
http://qiita.com/mstssk/items/1820dd2e5e03d735ba19

## 解説

リポジトリの構成は`review-init`コマンドで初期化したほぼそのままの構成の前提です。  

Werckerも、CircleCIなどの他のサービスと同様に、GitHubリポジトリを監視してくれます。
連携の設定についてもだいたい同じだったので割愛します。
Wercker独自の設定ファイルについては下記です。

### wercker.ymlの設定

Werckerでは設定を`wercker.yml`に記述します。今回の場合、たったの10行程度で済みました。

```yml:wercker.yml
box: vvakame/review

build:
  steps:
    - script:
        name: Build PDF
        code: |
          cd articles
          rake clean pdf
          cp book.pdf ${WERCKER_REPORT_ARTIFACTS_DIR}/
          ../upload_dropbox.sh book.pdf ${DROPBOX_TOKEN}
```

#### 使用するコンテナの指定

```
box: vvakame/review
```
[vvakame](https://twitter.com/vvakame)さんが作ったRe:VIEWのビルド用コンテナです。
https://hub.docker.com/r/vvakame/review/


#### 実行するscript

```
rake clean pdf
```  

Re:VIEWでPDFをビルドします。
`review-init`はRakefileを作ってくれるので、ここではそのままrakeコマンドでビルドしています。
もちろん、他のビルドツールで`review-pdfmaker`や他のRe:VIEWのサブコマンドを使ってもいいです。
　

```
cp book.pdf ${WERCKER_REPORT_ARTIFACTS_DIR}/
```

ビルドしたPDFをWerckerの成果物ディレクトリにコピーしています。
コピーしておいたPDFはWerckerからダウンロードできます。
　

```
../upload_dropbox.sh book.pdf ${DROPBOX_TOKEN}
```

Werckerからのダウンロードは使い勝手が良くないので、Dropboxにアップロードしておくと楽です。
アップロードするための簡単なShellScriptを呼び出しています。
`${DROPBOX_TOKEN}`は事前に発行しておいたDropboxのAPIトークンです。
Werker側のリポジトリ設定で、環境変数として登録してあります。

APIトークンは[Dropboxの開発者向けページ](https://www.dropbox.com/developers)で自分のアプリを作成して発行しておきます。
oF: XcodeとVisual Studioでのgitignore

こんな感じにするとsrcとbin/dataだけが監視下に入るというメモ。

```
.DS_Store

bin/*
!data
bin/data/settings.xml

# Mac
resources/*
config.make
[projectName].xcodeproj
Makefile
openFrameworks-Info.plist
Project.xcconfig
addons.make

# Win
[projectName].sdf
[projectName].sln
[projectName].vcxproj
[projectName].vcxproj.filters
[projectName].vcxproj.user
addons.make
icon.aps
icon.rc
obj/*
.vs
```