OmniAICreator/Qiita-1.07M huggingface dataset:
HHKB Professional BTをType-s化する


## 必要なもの
- 顎間ゴム(3/16)(今回はラビットの絵の物をメルカリで購入しました[^1])
- ドライバー

## 前書き
同期のHHKB(Pro2)を触らせてもらい、最高のタイプ心地だったため、購入画面へ
墨無刻印がかっこよすぎたのと、今年BTが出たとのことで黒無刻印HHKB BTを購入

## Pro2とBTの比較
届いて触ってみたところ、
Pro2(白)に比べてBTの方がキートップが硬い感じで、音も少しチャカチャカ響く感じがしました(墨と白で違うのか？)[^2]
そこでType-sの方がよかったんじゃ・・・と思い始めたけど、墨無いし、ということで調べたらType-s化改造している記事を見かけたのでやってみました

## Type-s化
こちら[^3]の手順に従っただけですが、BTでのType-s化の記事がなく
詰まりどころがあったので共有します

1. キートップを全て外す
2. 裏のネジを外して、開ける
	- BT only: 上部3箇所にネジがあり、左右はすぐわかりますが、中央のネジがBT用の電池を入れるスペースにあります。最初気付かずに開かなかったためすべり止めのゴムを剥がしてみたり、中央の説明シールの凹みを探ってみたりしてしまいました
	![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/86763/61227a08-19a3-45c0-9d74-609eb4406a1d.jpeg "1.jpg")

3. 基盤のネジを外す
	- BT only: BTモジュールがネジの上に被さっており、ネジが全て外せません。ゴム用意したのに終わったかと思いました。BTモジュールのネジを2箇所外した後、厚みのある粘着テープでくっついているので、意を決して垂直に引っ張って外します。(ブレッドボードのようなもので接続されている箇所もあるので注意する)
	![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/86763/a6af2de3-95c1-e197-cf39-5b34e39ba38c.jpeg "2.jpg")
	![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/86763/6f35fc40-3b8f-c531-8f7e-e3c751bcd2b1.jpeg "3.jpg")

4. ツメを外してゴムを付ける
基盤が外れたら後は他の記事通り、ツメを外してゴムを付けていく作業になります。
見えにくいですが、画像のツメ周辺に落ちている黒いカスがツメを外す際、欠けるというもので気にする程ではありませんでした
これ一つ一つにゴムをハメていく感じになります
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/86763/cca329b4-0342-8982-565a-5574779a7fff.jpeg "4.jpg")

Returnと左Ctrlとスペースはツメタイプではなく、金具がついていたので、特に何もしませんでした。(元々ここだけは音が良かった)
5. 戻す
基盤を付けて、BTモジュールのブレッドボードがちゃんと差し込まれるように戻して、カバーを付ける


作業は以上で終わりです
後はタイプして全てのキーが正常か確認してみます
自分がやったとき、基盤に付いてるシリコン製のバネを包むものの位置が若干ずれて

- Returnが効かない
- 左Shiftが効かない
- Returnの効きが不安定(1/4くらいの確率で反応する) x 2

の事故が起こり、1〜5の手順を4回程繰り返すハメになりました。
最終的には上手くいきましたが、慎重にやりましょう
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/86763/f315a949-6dd0-bc24-dafb-78f14a423956.jpeg "5.jpg")

## おわりに
チャカチャカチャカという音からスコスコスコという音になり、かなり静音化されました
(比較動画用意しました: [HHKB BT type-s化](https://youtu.be/FSoHaCv7YqY))
満足度120%です!!
墨無刻印BTでType-sという世に出回ってないプレミア感と最高のタイプ心地と音を感じながら、
日々のコーディングを楽しみたいと思います

[^1]: 日本では手に入らず、セカイモン等の外国商品を扱っているショップで購入する必要があり、輸入代で高額になるので入手困難(アマゾンも一応あるが、輸入代込で4000円くらい)
[^2]: 公式はBTとPro2の性能は同様と言ってます
[^3]: http://ryoge.com/blog/hhkb-pro2-custom
Data Augmentationに使えるopencv_createsamplesの使い方

![faces.gif](https://qiita-image-store.s3.amazonaws.com/0/12309/cdfadbd3-85e5-c1e2-89e2-54d070feec99.gif)

Data Augmentationというのは、データを変形させて訓練データを増やすこと。そのためのopencv_createsamplesが提供されている。上の画像のように回転・拡縮・光を変えて生成される。コマンド例は、

# 1枚の画像を変形させて増幅し、vecにまとめる

```
opencv_createsamples -vec output.vec -img faces/00000000.jpg  -num 10 -bgcolor 255 -h 250 -w 250 -show
```

オプションは、

```
Usage: opencv_createsamples
  [-info <collection_file_name>]
  [-img <image_file_name>]
  [-vec <vec_file_name>]
  [-bg <background_file_name>]
  [-num <number_of_samples = 1000>]
  [-bgcolor <background_color = 0>]
  [-inv] [-randinv] [-bgthresh <background_color_threshold = 80>]
  [-maxidev <max_intensity_deviation = 40>]
  [-maxxangle <max_x_rotation_angle = 1.100000>]
  [-maxyangle <max_y_rotation_angle = 1.100000>]
  [-maxzangle <max_z_rotation_angle = 0.500000>]
  [-show [<scale = 4.000000>]]
  [-w <sample_width = 24>]
  [-h <sample_height = 24>]
```

複数画像を入力にするなら-info, 単一画像なら-imgを使う。画像が生成されるのではなく、vecファイルというバイナリが生成される。これはopencv_haartrainingコマンド, opencv_traincascadeコマンドなどの入力となる。

形が決まっている物、たとえばCDのジャケットなどは上記コマンドで数千枚を生成すればそれの検出器を作れるだろう。顔検出の場合は-infoを使って様々な人の顔を入力とすべき。

# PNG出力

[できると書いてあるが、](http://docs.opencv.org/2.4/doc/user_guide/ug_traincascade.html)-info, -img共に、Macでは出力されなかった。

# -infoで複数の正例をvecにまとめる

```
opencv_createsamples -vec output.vec -info positives.txt -num 4 -bgcolor 255 -h 250 -w 250 -show
```

positives.txtは、

```
./data/faces/00000000.jpg 1 1 1 250 250
./data/faces/00000001.jpg 1 1 1 250 250
./data/faces/00000002.jpg 1 1 1 250 250
./data/faces/00000003.jpg 1 1 1 250 250
```

こうすると複数画像を学習データのvecにできる。変形は行わないようだ。1枚の画像に顔が複数あってどちらも学習する場合の指定方法は、

```
img/img2.jpg 2 100 200 50 50 50 30 25 25
```

このように、2枚と書いてx, y, width, heightの順に書く。[形式](http://note.sonots.com/SciSoftware/haartraining/document.html)

# 実行時間

```
time opencv_createsamples -vec positives.vec -info positives.txt -num 13233 -h 24 -w 24
```

結果は、

```
Done. Created 13233 samples

real	0m18.683s
user	0m13.293s
sys	0m2.881s
```

vecのサイズは15.3MB.
【jasmine + Karma】の単体テストをCircleCIで実行されるようにしてみた

[【jasmine + Karma】 による AngularJs 単体テストをしてみた](http://qiita.com/TKR/items/95d0cb2849a57cbf4a60)
で作ったプロジェクトについて、CircleCIを使って、githubにpushされたらkarmaでjasmineの単体テストが実行されるようにしてみました。


# CircleCI の 設定

## CircleCI の 登録

[CircleCI](https://circleci.com/signup/)の「Authorize Github」で、githubアカウントでcircleCIの登録を行います。

![circleci-sinup.png](https://qiita-image-store.s3.amazonaws.com/0/50028/2f827062-b456-8e06-dfb2-20db297c2b6d.png)


## CircleCI で Buildを行いたいレポジトリを選択

CircleCIのAdd Projectで、ciで回したいリポジトリを追加します。
今回は、リポジトリ「test-circleCI」を追加しようと思いますので、
下記添付画像の ① > ② > ③ の順でクリックしていきます。

![add-project.png](https://qiita-image-store.s3.amazonaws.com/0/50028/2415ed77-0168-3af6-526f-8480f437c58b.png)

build projectをクリックした段階で、対象のリポジトリに対してBuildが行われます。

circleCIの設定を置いていなくてもなんかいい感じにnpm testを実施してうまいこといっている雰囲気なのですが、nodeのversionが古かったりするので、circle.ymlでちゃんと記述してこうかと思います。

## circle.yml

node versionの上げ方については、[ここ](http://qiita.com/inuscript/items/d2c87e076595f801b44b)を参考にしてます。てゆうかまんまコピペ・・・

依存関係は、「dependencies」で記述するらしい？ので、ここで、npm install を行います。
キャッシュが悪さしてnpm install 失敗するのもいやなので、npmのキャッシュを消してからnpm install しています。

最後に、testとして、package.jsonに記述しているkarma実行scriptを叩いています。

```circle.yml
machine:
  timezone:
    Asia/Tokyo
  node:
    version: 6.3.0
  post:
    - npm install -g npm@3

dependencies:
  override:
    - npm cache clean
    - npm install

test:
  override:
    - npm run karma
```

## Coverage

CircleCIのArtifactsにCoverageのhtmlを吐き出したいのですが、ローカルでは、./Coverageに吐き出したい。

ということで、karma.config.jsのcoverageReporterプロパティを追加します。
htmlを吐き出すディレクトリは、
ローカルの時は、 ./coverage/
CircleCIの時は、Artifacts/coverage/
となるようにします。

```karma.config.js
+  var reportDir = process.env['CIRCLE_TEST_REPORTS'] || '.';

+  coverageReporter: {
+    dir: reportDir + '/coverage/',
+    reporters: [ { type: 'html' } ]
+ },
```

# 実際にBranchをpushして、CircleCIが回るか確認する。

![coverage.png](https://qiita-image-store.s3.amazonaws.com/0/50028/805bbdd4-9e78-e55d-3035-b071304afbc8.png)

![ci-npm-test.png](https://qiita-image-store.s3.amazonaws.com/0/50028/ae0e8941-b0d8-80cd-178c-481b4f9429b9.png)


ちゃんと、CircleCIでKarmaが実行されて、Artifactsにcoverageが吐き出されてます(^ ^)

因みに、ローカルでテストした場合は、./coverage に吐き出されていました。


# 折角なので、githubのmasterブランチを保護する

CircleCIでテスト実施の環境が整ったので、githubのmasterブランチについて、テストが通らないとマージできないように保護したいと思います。

保護したいリポジトリのsetting > Branches > Protected branches で mastarを選択し、status checks で、circleciを選択するだけです。

![branch-protect.png](https://qiita-image-store.s3.amazonaws.com/0/50028/afe7ea67-bfd0-b8a1-3f11-c76eb9827ccc.png)

## 保護した結果

ciが回っている間や、テストに失敗した場合は、マージボタンがdisableとなりマージできなくなりました。

### CircleCI Running

![test-running.png](https://qiita-image-store.s3.amazonaws.com/0/50028/2f3bef59-5aa2-a15e-a50c-f88b8555f2f6.png)

### CircleCI Test NG

![test-ng.png](https://qiita-image-store.s3.amazonaws.com/0/50028/c48626a7-aed1-4530-13c5-95196c8e0cca.png)

### CircleCI Test Success

テストを含めBuildが全て問題なく完了した場合は、マージボタンが活性化しました。

![test-ok.png](https://qiita-image-store.s3.amazonaws.com/0/50028/965e4dd0-a213-7162-9367-30716a241cff.png)


# おわりに

CircleCIのど導入は、思っていた以上にあっさりできてしまいました。
CircleCIは、無料プランでもいろいろできるようなので、どんどん使っていきたいですね。

[ソースはgithubで公開](https://github.com/yohei-takara/test-circleCI)しています。
[ちょっとしたメモ] MSYS2上のRubyでsqlite3 gemをインストールしたかった

# 前提

- RubyはMSYS2のpacmanでインストールしている

# 遭遇したエラー

`gem install sqlite3`の結果、以下のエラーが。

    Building native extensions.  This could take a while...
    ERROR:  Error installing sqlite3:
            ERROR: Failed to build gem native extension.
    
        current directory: /usr/lib/ruby/gems/2.3.0/gems/sqlite3-1.3.12/ext/sqlite3
    /usr/bin/ruby.exe -r ./siteconf20170104-5380-12c9rum.rb extconf.rb
    *** extconf.rb failed ***
    Could not create Makefile due to some reason, probably lack of necessary
    libraries and/or headers.  Check the mkmf.log file for more details.  You may
    need configuration options.
    
    Provided configuration options:
        
        【中略】
        
    /usr/lib/ruby/2.3.0/mkmf.rb:457:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
    You have to install development tools first.
            from /usr/lib/ruby/2.3.0/mkmf.rb:542:in `try_link0'
            from /usr/lib/ruby/2.3.0/mkmf.rb:557:in `try_link'
            from /usr/lib/ruby/2.3.0/mkmf.rb:658:in `try_ldflags'
            from /usr/lib/ruby/2.3.0/mkmf.rb:1814:in `pkg_config'
            from extconf.rb:27:in `<main>'
    
    To see why this extension failed to compile, please check the mkmf.log which can be found here:
    
      /usr/lib/ruby/gems/2.3.0/extensions/x86_64-unknown/2.3.0/sqlite3-1.3.12/mkmf.log
    
    extconf failed, exit code 1
    
    Gem files will remain installed in /usr/lib/ruby/gems/2.3.0/gems/sqlite3-1.3.12 for inspection.
    Results logged to /usr/lib/ruby/gems/2.3.0/extensions/x86_64-unknown/2.3.0/sqlite3-1.3.12/gem_make.out

# 対策

これだけ見ても、"probably lack of necessary
libraries and/or headers"（おそらくライブラリかヘッダがない）と書かれているだけで、具体的に何をすればよいのかわからない。

ただ、"please check the mkmf.log which can be found here"（ここに記載されているmkmf.logをチェックしてください）という指示通りにファイルを見ると、gccのオプションの`-lgmp`と`-lcrypt`で失敗していたことが判明。

結局、以下のコマンドで解決した。

`pacman -S libsqlite-devel gmp-devel libcrypt-devel`

※これは私の場合です。mkmf.logを見ると、もっと別のライブラリが必要とされているかもしれません。
データサイエンティストのためのDockerfileを作ります（1）

#データサイエンティストのためのDockerfileを作ります。
毎回環境作るの面倒なので、データサイエンティストのためのDockerfileを作ります。
github
https://github.com/richi40/plenty

#作成完了
centos、nvidia/cuda、python3、日本語環境
※インプットのみ日本語にしたいがdateコマンドの出力も日本語になってしまう。分かる人がいたら教えてください。

#今後追加したい ※いいのがあったら追加してください
stan、chainer、spark、juman++、mongodb
※python3バイディング含む

scrapy、flask、tornade、Nginx

#nvidia-dockerの環境構築
##１．ネットにつながるPCでnvidiaドライバをUSBに落としておく。
http://www.nvidia.co.jp/Download/index.aspx?lang=jp

##2．DVDに焼いたcentos7.3をbasic graphics mode または インストール方法選択画面でescを押しlinux textでインストールする。途中のソフトウエア選択画面でGNOME Desktopを選ぶ。
※多分グラフィックボード（私はGTX 1080）のせいで普通にインストールしようとすると途中で止まります。

##3．最新の状態にする。
`sudo yum -y pdate`
`reboot`

※↓キーボードを日本語レイアウトにする。
http://qiita.com/sh1k1ya/items/c025bb4d9ca207aacaaa

##4．NVIDIAドライバのインストールに必要なものをインストールする。
`
sudo yum install gcc*
sudo yum install freeglut
sudo yum install freeglut-devel
sudo yum install kernel-devel
reboot
`

※引用
http://qiita.com/Koki-Suemitsu/items/8a16526e1aaf59e90f9a

##5．1でUSBに落としたNVIDIAドライバのインストール
※↓こちらのサイトの手順でできました。CUDAのインストールはnvidia-dockerでやるつもりなので、ここでCUDAのインストールは不要です。
http://blog.takahashikanji.com/2016/10/centos7gtx1080cuda.html
ドライバーのインストールが終了したら
`systemctl set-default graphical.target
reboot`

※NVIDIAドライバのインストールは全部YESまたはOK
※↓USBのマウント方法
http://linuxserver.jp/linux/centos/usb%E3%83%A1%E3%83%A2%E3%83%AA%E3%81%AE%E6%89%8B%E5%8B%95%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88
※それっぽいエラーがでたらBIOSでセキュアブート（Secure Boot）を Other OSにしてみてください。
↓UEFI のセキュアブートを設定する(主にASUS製マザー)
http://freesoft.tvbok.com/tips/lga2011/asus_secure_boot.html
※ここまででcentosのインストールが完了します。私はfedoraが好きだったのですが、centosの使いやすいさにびっくりです。
※↓レポジトリからもnvidiaドライバのインストールができるかもしれません。USBとか面倒ですものね。
http://curlune.hatenablog.com/entry/2016/12/18/140000
http://negativo17.org/nvidia-driver/

##6．dockerのインストール
公式通りです。
https://docs.docker.com/engine/installation/linux/centos/

##7．nvidia-dockerインストール
公式通りです。
https://github.com/NVIDIA/nvidia-docker
UIColor または NSColor から RGBA の値を取得

iOS と Mac でできるだけ多くの共用したコードを使えるようにするために。こんなコードをよく使っています。

```swift
#if os(iOS)

import UIKit
typealias XView = UIView
typealias XImage = UIImage
typealias XColor = UIColor
typealias XBezierPath = UIBezierPath
typealias XScrollView = UIScrollView
typealias XViewController = UIViewController

#elseif os(macOS)

import Cocoa
typealias XView = NSView
typealias XImage = NSImage
typealias XColor = NSColor
typealias XBezierPath = NSBezierPath
typealias XScrollView = NSScrollView
typealias XViewController = NSViewController

#endif
```

すると、以下のように以外と iOS でも mac でも使えるコードが書けたりします。

```swift
let bezier = XBezierPath(ovalIn: CGRect(x: 0, y: 0, width: 100, height: 200))
XColor.red.set()
bezier.fill()
```

UIColor または NSColor から R、G、B、Aの要素を取得したい時に、これを使えば、`getRed(_:green:blue:alpha:)` で iOS でも macOS でも同様に r, g, b, a の要素を取得できそうですが…

```swift
var r: CGFloat = 0
var g: CGFloat = 0
var b: CGFloat = 0
var a: CGFloat = 0
XColor.white.getRed(&r, green: &g, blue: &b, alpha: &a)
```

iOSでは実際に値が取れるのですが、macOS ではなぜか runtime エラーとなってしまう場合があります。具象クラスはどちらも似たようなものだと思うのですが、iOS と macOS のコードを共用したい場合には障害になります。

```swift:macOS
type(of: color) // NSCachedWhiteColor.Type
```

```swift:iOS
type(of: color) // UICachedDeviceWhiteColor.Type
```

色々調べてみると、CIColor を使うと、r,g,b,a の値が綺麗に取れそうです。そこで、UIColor と NSColor の共通メソッド cgColor を介して、CIColor に変換すると、CIColor のプロパティで RGBA の値を直接取り出せそうです。

#### CIColor
<img width="381" alt="Screen Shot 2017-01-04 at 0.17.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/65634/1b226eef-94ef-531e-3ff5-f5bf5b98fc5d.png">

よって以下のような extension を書いてみました。

```swift
#if os(iOS)
import UIKit
#elseif os(macOS)
import Cocoa
#endif

extension XColor {

	var rgba: (r: CGFloat, g: CGFloat, b: CGFloat, a: CGFloat) {
		let color = CIColor(cgColor: self.cgColor)
		return (color.red, color.green, color.blue, color.alpha)
	}

}
```

これで、iOS でも macOS でも r,g,b,a の値が綺麗に取れるようになりました。

```swift
XColor.red.rgba // (1.0, 0.0, 0.0, 1.0)
```

## おまけ

ちなみに、UIBezierPath と NSBezierPath のメソッドも似ているのですが、`addLine` と `line` のように微妙な違いがあるものもあります。そんな場合は以下のような extension を用意しておけば、どちらのスタイルでも書く事が出来るので便利です。


```swift
#if os(macOS)
extension NSBezierPath {

	func addLine(to point: CGPoint) { self.line(to: point) }

}
#endif

#if os(iOS)
extension UIBezierPath {

	func line(to point: CGPoint) { self.addLine(to: point) }

}
#endif
```

---

［環境に関する表記］

```
Xcode Version 8.2.1 (8C1002)
Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)
```
sqlcmdを実行するWindowsバッチ

#この記事を書いたわけ#

職場でsqlcmdを実行するWindowsバッチを書く必要が出てきたので、予習のために自分でバッチを書いてみました。
設定ファイルの書き方とか数値をリダイレクトするときの注意とかsqlcmdを実行したときのエラー判定とか
実際に書いてみると詰まるところがあったので、備忘録として残しておきます。

#使い方#
①下記のディレクトリ構成の通りにファイルを配置します。
②settei.batの設定値 sqlcmd接続情報を記載します。
③select文をsample.sqlに記載します。
④sample.batをダブルクリックします。


■設定方法
settei.batの設定値を変更することで発行するSQL等を変更できます。

■ディレクトリ構成
Qiitaにはzipをあげられないので、少し手間がかかりますが以下の構成となるようにファイルを配置します。

WindowsBat
│  sample.bat     :このbatファイルをダブルクリックでSQLSERVERに接続します。
│  
├─output
│      res.txt    :sqlcmdの実行結果値が出力されます。batが実行されれば、作成されます。
│      test.log   :batの実行結果が追記されます。batが実行されれば、作成されます。
│      
├─settei
│      settei.bat :sample.batを制御する設定ファイルです。
│      
└─sql
        sample.sql :sample.batのsqlcmdを経由して発行されるSQLです。

#ファイル

```sample.bat
@echo off

rem sqlcmdを実行し、正常終了、異常終了で処理を分岐させるプログラム

rem カレントディレクトリ配下のsetteiディレクトリの設定batを呼び出す
call ./settei/settei.bat

echo プログラムを実行します。
echo 止めたい場合はコマンドプロンプトを閉じてください。

rem 一時停止
pause

rem 画面メッセージのクリア
cls


rem -------処理記載ここから------

rem SQLSERVERにsqlcmdで接続を行う
%sqlcmd% ./sql/%sqlFile% -v param=%sqlParam% -b -s, >> ./output/%fileNameLog%  2>&1

rem sqlcmd実行結果で処理を分岐
rem 0:正常終了 それ以外:異常終了
if %errorlevel% equ 0 (
 echo 正常終了しました。>> ./output/%fileNameLog%

 rem リダイレクトの直前の数値はコマンドに影響を与えるため、
 rem echo %resNormal%> ./output/%fileNameTxt% 
 rem とはせず、以下とする。
 > ./output/%fileNameTxt% echo %resNormal%

) else (
 echo 異常終了しました。>> ./output/%fileNameLog%

 rem logを標準出力に表示する
 type %~dp0\output\%fileNameLog%

 > ./output/%fileNameTxt% echo %resError%
)


rem -------処理記載ここまで------

echo プログラムが終了しました。


pause
exit
```

```settei.bat
rem 設定ファイル。他ファイルから呼び出される
rem ■参考
rem sqlcmd パラメータ詳細
rem http://msdn.microsoft.com/ja-jp/library/ms162773.aspx

rem 正常結果値
set resNormal=0
rem 異常結果値
set resError=99
rem 出力するファイル名称_log
set fileNameLog=test.log
rem 出力するファイル名称_一時ファイル
set fileNameTxt=res.txt
rem sqlcmd接続情報
set sqlcmd=sqlcmd -S サーバー名 -d DB名 -U ユーザー名 -P パスワード -i
rem sqlファイル
set sqlFile=sample.sql
rem sqlパラメータ
set sqlParam='abc101'

```

```sample.sql
--1 行処理されました と処理文の出力をさせない--
set nocount on;

SELECT
colCA
FROM
Table_1
WHERE
colCA = $(param)
;
```


#参考にしたところ#

以下のサイトを参考にして作りました。
ここで書いとかないとまた詰まりそうなので、記載してきます。

[batファイルでSQLServerのSelect結果をCSV形式で出力する。](http://chintongame.hatenablog.com/entry/2014/11/27/175254)

[echoの出力の最後のスペースを除去したい](http://okwave.jp/qa/q8093416.html)

[sqlcmd ユーティリティ](https://msdn.microsoft.com/ja-jp/library/ms162773.aspx)

[BATファイルで環境変数を設定ファイルから読み込む方法](http://www.kunst1080.net/entry/2014/04/07/183736)

[バッチファイルのあるディレクトリ](http://okwave.jp/qa/q5738095.html)

[.bat（バッチファイル）のifコマンド解説。](http://qiita.com/sawa_tsuka/items/8edf3d3d33a0ae86cb5c)

[標準エラー出力をファイルへ出力](http://www.adminweb.jp/command/redirect/index3.html)

[開発に役立つ，BATファイルの書き方・パターン集](http://language-and-engineering.hatenablog.jp/entry/20130502/PatternsOfMSDOSorBAT)
ScalaでHaskellのsequenceを実現する

# はじめに
ScalaのEitherでエラーを引きずり回していたときに、Listの中にEitherが入り込んでしまって困ってました。
そういえばHaskellにはsequence関数があって、中に入ったモナドをリストの外に出せるなと思いついたのですが...

なんとScalaにはHaskellのsequence相当の関数がデフォルトで準備されていません。
Scalazにはありますが、一回しか使わないなど簡単に済ませたいときにはちょっと大げさです。
そこでモナドの理解もかねて、自作してみようという試みです。

なお前提となる諸々は端折っておりますので、ご了承ください。

# Haskellのsequenceとは
Haskellのsequenceは、以下のように型が定義されています。

```haskell
sequence :: (Monad m, Traversable t) => t (m a) -> m (t a)
```

`Monad m`はどんなモナドでもかまいませんが、`Traversable t`は、Traversable型クラスに所属した型でなければ動きません。
例えば、mを`Maybe`、tを`List`として考えてみると、こんな感じ。

```haskell
Prelude> sequence [Just 5, Just 6]
Just [5,6]
```

sequenceは、右たたみ込みを使って簡単に自作することができます。
左ではなく右たたみ込みを使うのは、リストを結合する際に先頭に結合されてしまうためです。

```haskell
import Control.Monad

sequence' :: (Monad m, Traversable t) => t (m a) -> m [a]
sequence' = foldr (liftM2 (:)) (return [])
```

空リストをデフォルトの文脈に入れ(`return []`)、その文脈から値を取り出して引数として与えたリストの末尾にある値と結合していく(`liftM2 (:)`)だけの簡単な関数です。動作の流れのイメージは以下のような感じ。
矢印の左が元の値で、右が返り値だと思ってください。

```
1. [Just 5, Just 6] -> Just []
2. [Just 5] -> Just (6 : [])
3. [] -> Just (5 : 6 : [])
4. [] -> Just [5, 6]
```

# Scalaでsequence
さて、ここからが本題です。デフォルトのScalaにはsequenceが存在しないので、頑張って実装していきます。
ScalaにはTraversableトレイトはありますが、Monadトレイトはないので、今回は汎用的ではなく専用の関数を作ります。
MonadにOptionを、TraversableにはListを用います。

とりあえず型を決めていきます。

```scala
def sequence[A](List[Option[A]]): Option[List[A]] = ???
```

Haskellの例を参考にしながら、実装します。

```scala
def sequence[A](list: List[Option[A]]): Option[List[A]] = {
  list.foldRight (Some(Nil): Option[List[A]]) { (value, acc) => 
    for (
      v <- value;
      a <- acc
    ) yield v :: a
  }
}
```

こちらもデフォルトの文脈に入れてから、出してくっつけて入れて、という作業を繰り返しています。
2引数関数を取ることができるmap(HaskellではliftM2)が無いため、for~yieldを使って同様のプログラムを実現しています。
また、型推論がうまくいかないため、`Some(Nil)`に対して型を指定しています。

さて、Scala 2.12で改良されたEitherでも同様のことをやってみましょう。
デフォルトでRight値を取るようになってくれたおかげで、以下のようなコードで済むようになりました。

```scala
def sequence[A](list: List[Either[String, A]]): Either[String, List[A]] = {
  list.foldRight (Right(Nil): Either[String, List[A]]) { (value, acc) =>
    for (
      v <- value;
      a <- acc
    ) yield v :: a
  }
}
```

# おわりに
Haskellでの記述にはちょっと目をつぶるとして(そもそもデフォルトで入ってる)、Scalaでも意外と簡単に実装できました。
少ししか使わないのであれば、このぐらいの関数を自前で実装してしまった方が手軽そうです。
もちろん、本格的な関数型プログラミングを楽しみたい方(型?)は、Scalazでバリバリやっても良いと思います。

Eitherが中に入ってしまったリストからEitherを追いやる当初の目的も達成できましたし、一件落着ということで。

# 参考

- [すごいHaskell楽しく学ぼう](https://estore.ohmsha.co.jp/titles/978427406885P)
- [Stack Overflowの質問](http://stackoverflow.com/questions/6750609/list-of-options-equivalent-of-sequence-in-scala)
今さら整理するパソコンの構造と原理　①パソコンの構造

こんにちは　
３年ぐらいWEBプログラマとして働いていたのに今さら！
今さら！
パソコンの構造と原理について頭の中で整理する必要があると思って勉強した内容を整理して見ました。
ComputerArchitecture周りについて詳しい情報や間違っている情報があるとぜひコメントをよろしくお願いいたします。

まず基本的な部分から始めます。
<h1>１．パソコンの構成装置と基本構造</h1>

パソコンのシステムは多くハードウェア（Hadware）,ソフトフェア（Software）で分けています。
ハードウェアは機械的な装置を意味して、ソフトウェアはハードウェアの動作を制御、指示する役割をしています。

| | パソコンの構成 | |
|:-----------|------------:|:------------:|
| １．ハードウェア       |         |     ２．ソフトウェア     |
| ①入力装置       |         |          |
| ②処理装置       |         |          |
| ③補助記憶装置  |         |          |
| ④出力装置  |         |          |

まず上の表を参考にして整理すると、

<h2>１．ハードウェア</h2>
<h3>①入力装置</h3>
Input Deviceと呼ばれます。
データを読み込む役割をします。
例）キーボード、マウス、スキャナなど

<h3>②処理装置 </h3>
主記憶装置と中央処理装置で分けています。
まず中央処理装置です。

中央処理装置は英語で言うと、Central Processing Unit つまり　CPU　と呼ばれるそのものです。
パソコンのシステム全体を制御する装置で入力装置からデータをもらって処理した後出力装置に送る
一連の流れで動くパソコンの脳に該当する装置です。

またCPUには、計算の流れを担当する算術論理演算装置(ALU: Arithmetic Logic Unit)と
システムを制御する制御装置(Control Device)、貯蔵場所の役割をするレジスタ（register）で構成されています。

ALU　Arithmetic Logic Unitは　CPUの核心要素で算術演算(Arithmetic Operation),論理演算(Logic Operation)
をする装置です。

制御装置(Control Device)は　CPU内部で起こす全ての作業を管理する役割をします。適切な順番で命令を出して解析してシステムの適切な部分に制御信号を渡す装置です。

あと、主記憶装置と③補助記憶装置を記憶装置と呼びます。

<h3>③記憶装置</h3>
パソコンシステムはプログラムとプログラムの実行に必要なデータを保存するために様々な記憶装置（Memory device）を使っています。
内部記憶装置と補助記憶装置で分けて、CPU内のレジスタ、キャッシュ記憶装置、主記憶装置（Main Memory）
が内部記憶装置、補助記憶装置（Secondery memory）は外部記憶装置に該当します。

| 区分|容量| 速度|
|:-----------|------------:|:------------:|
| ①CPU内のレジスタ　Register                         |　4位 |      1位    |
| ②キャッシュ記憶装置(Cache Memory): Static RAM       | 3位 |     2位     |
| ③主記憶装置(Main Memory): Dynamic RAM  |    2位     |      3位    |
| ④補助記憶装置(Secondary Memory): HDD, FDD, Magnetic Tape  |    1位     |  4位        |


<h4>主記憶装置(Main Memory)</h4>

主記憶装置は　実行しているプログラムと実行に必要なデータを記憶している装置です。
比較的CPUに接近速度が速いし多くの容量の記憶ができます。
RAM(Random Access Memory)が主に使われています。

<h4>補助記憶装置(Secondary Memory)</h4>
補助記憶装置(Secondary Memory)は外部記憶装置とも言い、半永久的にデータを貯蔵して保存できます。
補助記憶装置はCPUと直接にデータを交換することができないので主記憶装置にデータを移動した後処理できます。
主記憶装置より価格が安く、容量も大きいですが速度が遅いです。
例でHDD,FDD,DVD,CD-ROMなどがあります。

<h3>④出力装置</h3>

出力装置(OutputDevice)はパソコン内部から処理された結果を出力媒体を通じて出す役割をします。
例）モニタ、プリンター、スピーカー

<h2>2．ソフトウェア</h2>
データが移動する方向やデータ処理の種類を指定、動作が起こる時間を指定する命令（Command）の集合で
システムソフトウェアと応用ソフトウェアで分けています。

<h3>①システムソフトウェア</h3>
システムソフトウェア（System Software）は使用者がパソコンをもっと効率的に使うために作ったソフトウェアでパソコンのシステムを制御して運営するプログラムです。
代表的にOS(Operating System)プログラム　DOS,UNIX,Linux,Windows..があります。
<h3>②応用ソフトウェア</h3>
応用ソフトウェア(Application Software)は特定な応用分野に使うために開発された
プログラムで事務自動化プログラム、ウェブブラウザーなどがあります。

パソコンの構造を簡単に言うとそんな感じで分けて説明できます。
もっと詳しく、パソコンが動く原理や構造については次の投稿で整理します。
投稿内容に問題や修正要のところがあったら指摘やコメントをお願いいたします。

↓私のBLOGにも投稿されています。
https://www.yunzeroin.com/%E4%BB%8A%E3%81%95%E3%82%89%E6%95%B4%E7%90%86%E3%81%99%E3%82%8B%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E3%81%AE%E6%A7%8B%E9%80%A0%E3%81%A8%E5%8E%9F%E7%90%86%E3%80%80%E2%91%A0%E3%83%91%E3%82%BD%E3%82%B3/
scpコマンドでファイルは送れるけどフォルダは送れない件について

vagrantを使い開発をしていたのですが、ローカルからフォルダをリモートホストに送りたいと思い**scpコマンド**で送信しようとしたらエラーが出ました

```vim:commond
mac:php hoge$ scp -r ssh.config 送りたいフォルダ vagrant@default:~/
ssh: Could not resolve hostname default: nodename nor servname provided, or not known
lost connection
```

ファイルは送れるのにフォルダは送れない....

ipアドレスをVagrantfileから設定して送信してみます

```vim:commond
scp -r ssh.config 送りたいフォルダ vagrant@default:~/
```

から

```vim:commond
scp -r ssh.config 送りたいフォルダ vagrant@192.168.33.10:~/
```

に変えたら無事に送信できました。

フォルダだとパーミッションがかかるらしいのですが、ip付与するとその権限も付与されるのでしょうか...
pythonでシステムローカルのタイムゾーンで現時刻を取得する、そして変換する

# 環境

```bash
$ python --version
Python 2.7.12
```

# タイムゾーンを気にしないとエラーが起こる

TrelloのAPIで取得したカードの時刻と現在の時刻を比較しようとして、以下のコードを書いたらエラーが出てハマった。


```python
def show_cards_(cards):
    for c in cards:
        print("---------------")
        print("card id   : {id}".format(id=c.id))
        print("card name : {name}".format(name=c.name))
        
        if c.due is not None:
            due = c.due_date
            now = dt.now()
            print("過ぎたよ" if now > due else "まだ大丈夫")
```

このコードを実行したら、以下のエラーが帰ってきた。

```
TypeError: can't compare offset-naive and offset-aware datetimes
```

dueとnowがそれぞれoffset-nativeとoffset-awareで異なるので比較できないらしい。

中身をよく見てみるとこんな感じだった。

```python
2017-01-03 10:00:00+00:00    # dueのほう : offset-aware
2017-01-03 22:40:14.709333   # nowのほう : offset-native
```

trelloから返ってくるのはoffset-awareのutcの時間だった。

pythonではどっちかに合わせて比較するということらしい。

# 解決策

### ポイント

``offset-native``と``offset-aware``を混ぜない。

今までは全然気にしてなかったけど、こういうときに``pytz``と``python-dateutil``にお世話になるらしい。

### offset-nativeで現時刻を取得する方法
```python
>>> from datetime import datetime as dt
>>> print(dt.now())
2017-01-03 22:45:07.334307+09:00
```

大体の場合はこれでok

### offset-awareで現時刻を取得する方法

```python
>>> from datetime import datetime as dt
>>> import dateutil.tz
>>> print(dt.now(dateutil.tz.tzlocal()))
2017-01-03 22:47:27.712684+09:00
```

タイムゾーンを``Asia/Tokyo``とかに固定することもできるけど、
システムローカルのタイムゾーンをかっこよさそうだったのでそうしてみました。

# timezoneの変換（以下はoffset-awareな話)
### UTCで時刻取得
```python
>>> from datetime import datetime as dt
>>> import pytz
>>> now_utc = dt.now(pytz.utc)
>>> print(now_utc)
2017-01-03 14:07:54.861061+00:00

```

いつもの``dt.now()``にタイムゾーンを変数として渡せばokみたい。

↓そして、

### UTC → JST
```python
>>> print(dt.now(pytz.utc).astimezone(pytz.timezone("Asia/Tokyo")))
2017-01-03 23:05:53.765549+09:00
```


#　以上。

おうちはっく！おうちはっく！
ポルカドットスティングレイとDAOKO最高！
JavaScriptの"string".replaceの第二引数と/regexp/.execの結果の対応表

JavaScriptで文字列を正規表現などを用いて検索、置換するにはそれぞれ[`String.prototype.replace()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/replace)（以下`string.replace()`）や[`RegExp.protoptype.exec()`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)（以下`regexp.exec()`）を使われると思います。

`string.replace()`の第二引数（以下`replacement`）には文字列と関数を設定することができます。

そして、`replacement`は置換前の文字や正規表現によってキャプチャされた文字列など、様々な情報が渡されます。

`replacement`が文字列の場合、`$`から始まる特別な置換パターンを、関数の場合引数によって、それらの情報が与えられます。

`regexp.exec()`は第一引数に与えられた文字を`regexp`で検索するメソッドですが、その返り値（以下`match`）も様々な情報を待っています。

`match`は`.index`と`.input`というプロパティが生えた**`Array`**のインスタンスです（ここで配列ではなくArrayのインスタンスと表記しているのは、DOMノードなどのようなArrayライクなオブジェクトではなく、[標準ビルトインオブジェクト](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects)の[Array](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array)だからです）。

そこで、`string.replace()`の`replacement`が文字列のときの置換パターンの二文字目（正規表現で言えば```/\$([$&`']|[0-9]+)/```のキャプチャ部分）、関数のときの引数の順番（=`arguments`のキー）と、`match`のプロパティのキーをまとめてみました。

なお、表中のnは１始まりです。

例: 正規表現:`/その(檸檬)の/`、ソース: `　見わたすと、その檸檬の色彩はガチャガチャした色の階調をひっそりと紡錘形の身体の中へ吸収してしまって、カーンと冴えかえっていた。`

![例](https://qiita-image-store.s3.amazonaws.com/0/104663/45bc8ddc-ef59-e5e5-da94-c0f2940bdc65.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/104663/e6d6bcc0-011d-0e24-9799-1e571c82cb22.png)

（文字が多いからかテーブルがQiita上では正しく表示されないのでKobitoのをスクショして貼ってます）


![image](https://qiita-image-store.s3.amazonaws.com/0/104663/db07964b-47a3-7cd9-073b-65e2c95deb49.png)

文章は、名作、[梶井基次郎](https://ja.wikipedia.org/wiki/%E6%A2%B6%E4%BA%95%E5%9F%BA%E6%AC%A1%E9%83%8E)「[檸檬](http://www.aozora.gr.jp/cards/000074/files/424_19826.html)」から拝借しました。

＼カーン／
　　:lemon:
  &nbsp;　:books::books:
さくらVPSはじめてみた

# さくらインターネットのVPS初期設定で早速躓いたこと

今日から作業中に何か躓いたことを書いて行こうと思います。
技術的と言うよりも、ただのブログになってしまったら引っ越すかも…。

見出しにある通り、さくらVPSの初期設定で躓いたことを記載します。が、ほんとつまらないことでした。

## さくらVPSのサーバの初期設定ガイドに従って進めている最中に…

一先ずサーバーはほとんど初心者なので、まずはさくらのHPにある初期設定ガイドに従って初期設定をしてみました。

- サーバを起動
    - サーバの起動・強制停止・再起動
- セキュリティの設定
    - rootパスワードの変更
    - 一般ユーザを追加
    - sudoを設定
    - SSH接続の設定を変更
    - システムのアップデート
    - ファイアウォールを設定

ほんとこれだけだったのですが、いきなりrootパスワードの設定で躓きました。
しかも内容が、ログインできないという…。
ただの入力ミスだったのかもしれないけど、そこだけで30分位調べたりなんだりしたので念のためメモ程度に対応内容を記載します。
と、言っても何度やってもログインできないので、結局OS再インストールしてその際にパスワードも設定し直したら入れました、と言うだけです。。

何だったのだろう？原因は不明。

その後は何の問題もなく終了。

さあ次はJettyの設定だ！
ISO版のVisual Studioをダウンロードする方法

Visual Studio初級者が、最新リリースをISOで保存しておくための備忘録です。

ダウンロードページに到達するまでいつも苦労します。迷子防止のためサイトを一つに絞ります。
まず、英語版のVisual Studioのページに接続するところから始めます。

Communityの場合、『Visual Studio Community 2015 with Update 3』が最新版です。

**１、英語のVSのダウンロードサイトアクセスします**
https://www.visualstudio.com/downloads/

**２、スクロールダウンします。**
途中にある「Free Download」を押さないよう注意します。押すとWeb　Installerが勝手にダウンロードされます。

**３、Visual Studio 2015 をクリックします。**
白地に細い字でVisual Studio 2015と書かれているところが目的地になります。

**４、入手したい製品・データーを以下から選択します。**

>
Visual Studio Community 2015 with Update 3 – Free
Visual Studio Enterprise 2015 with Update 3
Visual Studio Enterprise 2015 with Update 3
Visual Studio Enterprise 2015 with Update 3
Visual Studio Enterprise 2015 with Update 3
Visual Studio Test Professional 2015 Language Pack
Visual Studio 2015 Update 3
Visual Studio Express 2015 for Windows Desktop
Visual Studio Express 2015 for Windows 10
Visual Studio Express 2015 for Web

**５、ISOにチェックをいれます。**
HDD・SSDの換装やOSクリーンインストールがあった時、７GB以上あるファイルをその都度ダウンロードしていては大変な無駄です。必ずISOからインストールします。

**６、言語を選択します。コンボボックスの既定は「English」になっているので「日本語」を選択。**
英語でよければ「English」を選択します。

**７、Downloadを押します。**
2015 Communityで7.1GBの容量があります。

ファイル名を変更、または所定の場所に保存したい場合は、Downloadボタン上で右クリックして「名前を付けて保存」を選択し、保存場所を選択、ファイル名を入力後、保存ボタンを押します。
无线速率和安全配置


以TP-Link 路由器为例：默认的登录地址为 http://192.168.1.1  
如果自己设置过登录密码。则使用自定义的帐号密码登录管理后台，否则请参考路由器背后的登录信息。

登录完成后能看到如下的界面。
![](http://www.xp510.com/uploadfile/2011-8/2011822152228952.jpg)

在左边选择 `无线参数` -> `基本配置`    然后在右边的 频段（信道）里选择 `1`,或者`6` 或者`11` 然后安全类型 **务必** 选择有 `WPA2` 的那一项，密码推荐10位左右。
然后点保存即可。

由于路由器版本不同，上图的密码选项也有可能是在 `无线设置` -> `无线安全设置` 下面。如下图所示
![](http://img.pc841.com/allimg/141027/1_141027171949_1.jpg)

以上就是需要注意的地方。

    * 另外，在进行抢票，拍牌等操作时，还是推荐使用有线连接的方式来上网操作。
【Swift】Realm BrowserでRealm Mobile Databaseの中身を確認する

# Realm
[公式ページはこちら](https://realm.io/jp/)

CoreDataに代わるデータベースとして注目されているフレームワークで、モバイルデータベースとして利用できます。

# Realm Browser
![image](https://qiita-image-store.s3.amazonaws.com/0/44105/439b461d-1dce-3648-ad82-c1f3588fa7a3.png)

ふつう、データベースの中身を見たり内容をいじったりするには、コマンドを叩いたりSQL文というデータベースで使われる文を打たなければなりません。それはちょっと面倒くさい！！

そこで、Realm BrowserをつかってRealm Mobile Databaseの中身を確認してみます。

[ダウンロードはApp Storeから](https://itunes.apple.com/jp/app/realm-browser/id1007457278?mt=12)

# どこにデータベースファイルがあるんだ？
インストールして最初に起動すると、以下のような画面が表示されます。
![image](https://qiita-image-store.s3.amazonaws.com/0/44105/927ba14d-37dc-97d8-eb44-07cd6374d11a.png)

ただ、「Open Realm File」を押しても、どこにRealm Fileがあるのかわからないとデータベースを参照できません。
そこで、XcodeからRealm Fileの場所を確認してみましょう。

# Xcodeのコンソールに出力してみよう
Realmを使う場合は、次の文でRealmを初期化します。

```swift
let realm = try! Realm()
```

そのすぐ下の行に、

```swift
print(Realm.Configuration.defaultConfiguration.fileURL!)
```

を追加してコンソールにRealmデータベースファイルまでのパスを表示させてみましょう。
すると、以下の文がコンソールに出力されます。

![console.png](https://qiita-image-store.s3.amazonaws.com/0/44105/3fe3d141-b1d4-a663-e981-b6c746866e2b.png)

これで`default.realm`の場所がわかりました。

# Realm Browserで開こう

これを今度はターミナルに入力してみます。

このとき、最初の

```
file://
```

は除き、`/Users`以降をコピペして、最初に`open`コマンドを入れます。

```ruby:Terminal
open /Users/ryo/Library/Developer/CoreSimulator/Devices/■■■■■■■■■■■■■■■■■■■/data/Containers/Data/Application/■■■■■■■■■■■■■■■■■■■/Documents/default.realm
```

すると、以下の画面が表示されますので、「Allow」で開きます。
![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/44105/d45ca360-081e-779a-8c30-01d82ebd2be5.png)

無事Realm BrowserでRealm Mobile Databaseを開くことができました。
![image](https://qiita-image-store.s3.amazonaws.com/0/44105/cda0a66b-e7d8-9e11-f9a6-3c5eefc1e029.png)
grafana4.0.2をApacheの下で動かす


いまのgrafanaは自前でWebサーバ機能を持っていて、デフォルトでPort3000でListenしてます。これをApacheの下で動かすにはリバースプロキシを使うわけですが、2017年1月現在、[公式のドキュメント](http://docs.grafana.org/installation/behind_proxy/) ではnginxを使った場合の手順しか書いてません。ということで、Apacheでの手順を書いてみることにします。なお環境はUbuntu14.04LTSです。

## Apache側設定
###  proxy_module、proxy_httpモジュールを有効化する
私の環境では、これらのモジュールの情報はmods-available内にあったので、シンボリックリンクをmods-enableに作成しました。

```
cd /etc/apache2/mods-enabled
ln -s ../mods-available/proxy.load proxy.load
ln -s ../mods-available/proxy_http.load proxy_http.load
ln -s ../mods-available/proxy.conf proxy.conf
```

httpd.confが単一なら、単純に下記エントリをコメントアウトします。

```
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
```

### リバースプロキシを設定
proxy.confの```<IfModule mod_proxy.c>```ディレクティブに以下エントリを追加します。httpd.confが単一なら、空いている場所に記述。
下記は http://[domain]/grafana  とアクセスした際にgrafanaに飛ぶようにする場合の設定です。異なるURLにしたい場合は、/grafanaを適切な値に変更してください。

```
ProxyRequests Off
ProxyPass /grafana http://127.0.0.1:3000
ProxyPassReverse  /grafana http://127.0.0.1:3000
```

注意点としては、127.0.0.1:3000の後ろにスラッシュ（/）を入れるとうまく動いてくれません。自分はこれでちょっとハマりました。

## Grafana側設定

### grafana.iniのroot_urlを編集
grafana.iniの[server]ディレクティブ内のroot_urlエントリを編集します。
具体的には、root_urlをApacheのリバースプロキシ設定に合わせます。この記事では/grafanaにアクセスした場合にgrafanaに飛ぶように設定したので、root_urlの末尾に/grafanaを付加します。

```
root_url = %(protocol)s://%(domain)s:/grafana
```

## 各種サービス再起動
```
service apache2 restart
service grafana-server restart
```

以上で、http://[domain]/grafana にアクセスした場合にgrafanaにアクセスできるようになるはずです。
Hugo 0.19 Dev で index.html を作成するための Best Practice

## Hugo 0.19 Dev で index.html を作成するための Best Practice

ルートのindex.htmlとルート以外のindex.htmlでは挙動が違うので注意すること。

#### 1) public/index.html を作成する場合

- content/_index.md
- layout/index.html

```html:layout/index.html

    {{- .Content }}
```

もし、 layout/index.htmlがないときは、layout/_default/list.htmlが使われてしまう。テンプレートは"index.html"で、 コンテンツは"_index.md"となっていて、名称を間違えやすいから注意すること。

#### 2) public/a/index.html を作成する場合

ルート以外のindex.htmlは、1ページだけなら一階層上に"ファイル名.md"でつくるのが良い。この場合、テンプレートはsingle.htmlが使われる。サブディレクトリの中に他にもページを作成する場合は、サブディレクトリ内に"_index.md"を作成する。この場合、テンプレートはsection.htmlが使われる。

##### A) public/a/index.html のみの場合

  - content/a.md
  - layout/_default/single.html


```html:layout/_default/single.html

    {{- .Content }}
```


##### B) サブディレクトリに public/a/a.html, public/a/b.html, public/a/c.html などが存在する場合

  - content/a/_index.md
  - layout/_default/section.html

```html:layout/_default/section.html

    {{- .Content }}
```

自分で実験して見たい場合は、こちらを使用すると良い。
https://github.com/koba-ninkigumi/hugo-sample-0.19
C言語でchar型の数値(1桁)をint型にする方法

# はじめに
char型の1桁の数値をint型にしたくていろいろ調べたけど、結局よくわからなかったので力ずくで解決した話です。

```c:main.c
int i=1;
char chr='1';
printf("%d %d\n",i,chr);
```
このようなコードがあったとき、出力は1と49になり、等しくはなりません。
理由は1のAsciiコードが49だからです。

# 環境

* Visual C++ 2015 (cl.exe)
* SublimeText 3

# コード

## 追記
@SaitoAtsushi さんから「chr-'0'とすればよい」と教えていただきました。

```c:main.c
int i=1;
char chr='1';
printf("%d %d\n",i,chr-'0');
```
この出力は`1 1`になります。
@SaitoAtsushi さん、ありがとうございました。

ここから下は力ずくで解決した話です。
あまり参考にしないほうがよろしいかと...

```c:main.c
int ChartoInt(char chr)
{
	switch(chr){
		case '1':return 1; break;
		case '2':return 2; break;
		case '3':return 3; break;
		case '4':return 4; break;
		case '5':return 5; break;
		case '6':return 6; break;
		case '7':return 7; break;
		case '8':return 8; break;
		case '9':return 9; break;
		case '0':return 0; break;
	}

	return 10;
}
```

こんなコードを書きました。

# 最後に
`atoi()`という関数があるようなのですが、うまく動きませんでした。時間もあまりなかったのでこんな方法になってしまいました。
今回は1桁だったのでコードは短くて済んだのですが、桁が増えると`atoi()`を使う必要があると思われます。

## 追記
@shiracamus さんのコメントです。
> atoi関数の引数は`char`ではなく`char *`です。つまり、文字ではなく文字列の先頭アドレスを引数に渡さなければいけません。

`atoi()`がうまく動かなかったのは、引数に「文字」を渡していたのが原因でした。

@shiracamus さん、ありがとうございました。
Postfix+Dovecot バーチャルドメイン環境でユーザーを簡単に追加できるスクリプトを書いた

Postfix, Dovecot, CyrusSASLを用いたバーチャルドメイン環境で簡単にユーザーの追加、削除、リスト表示ができるスクリプトを書きました。
[GitHub](https://github.com/yasuo-ozu/mailadm)で公開しています。
GNU Bash, sed等に依存しているので、おそらくBSD等ではそのままでは動かないと思います。その他環境合わせて適宜スクリプトを変更して使ってください。

# 前提

以下の環境を前提としています。(合わない場合は、適宜スクリプトを変更する必要が有ります。)

- バーチャルドメイン環境であること。(デフォルトでは/var/mail/vhosts/DOMAIN/USER/以下にMaildir形式でメールを保存している環境であること)
- Postfix で`virtual_mailbox_maps = hash:/etc/postfix/vmailbox`としていること。
- CyrusSASLを使用し、`pwcheck_method = auxprop`として、sasldbとして`/etc/sasldb2`を使用していること。
- Dovecotを使用し、conf.d/10-auth.conf内でauth-passwdfile.conf.extを有効にした上で、その中で`driver = passwd-file` とし、またパスワードファイルとして`/etc/dovecot/users`を使用していること。

# 仕組み

- `sasldblistusers2`コマンドの結果、`/etc/postfix/vmailbox`, `/etc/dovecot/users`を参照し、それぞれに登録されているメールアドレスが同一かを調べます。(異なっている場合はエラー)
- ユーザーの追加、削除の際は、`saslpasswd2`コマンドを使用し、また`/etc/postfix/vmailbox`, `/etc/dovecot/users`の内容を変更します。(`/etc/dovecot/users`に登録するパスワードのハッシュを求めるために`doveadm pw`コマンドを使用します)

基本的に上記以外の操作(バーチャルドメインの設定を含む)は手動で行う必要があります。
Bash on Ubuntu on Windows (WSL) からpageantを利用する

# はじめに

Bash on Ubuntu on Windows (WSL)のSSHで，ssh-agentのかわりにWindows10側のpageantを利用する方法のメモです。

PuTTYとWSLのsshやgitなどを併用する際に便利かと思います。

ほぼ[wsl-ssh-pageant](https://github.com/benpye/wsl-ssh-pageant)の[README.md](https://github.com/benpye/wsl-ssh-pageant/blob/master/Readme.md)に記載されている通りの内容ですが，原典ではsocatの使い方がダサいので少しマシな方法を書いておきます。

2017/11/2追記: 
Creators Update以降なら[weasel-pageant](https://github.com/vuori/weasel-pageant)を使う方が手順が少なくスマートかもしれません。

# 必要なもの

## Windows側

+ Pageantまたはその互換品
+ [wsl-ssh-pageant](https://github.com/benpye/wsl-ssh-pageant)

## Ubuntu側
+ socat
+ ~~[cbwin](https://github.com/xilun/cbwin) (無くても可)~~ (Creators Update適用後は不要)

# インストール
##  Windows側

1. Pageantまたはその互換品をダウンロードし，適当なフォルダに展開
2. https://github.com/benpye/wsl-ssh-pageant/releases よりwsl-ssh-pageantをダウンロードし，適当なフォルダに展開

## Ubuntu側

1. `sudo apt-get install socat`でsocatをインストール
2. ~~Ubuntu側からwsl-ssh-pageantを起動したいなら，[このへん](http://qiita.com/shiena/items/28f94659083805322733)を参考にcbwinをインストール~~ (2017/07/05追記: CreatorsUpdate適用後ならUbuntu側からWindowsプログラムを直接実行可能)

# 実行

1. Windows側でPageantを起動しておく
2. ~~cbwinを使わないならWindows側で，cbwinを使うなら~~WindowsまたはBash on Windowsのコンソールからwsl-ssh-pageant.exeを起動する\*)

    ~~`$ wrun /mnt/c/somewhere/wsl-ssh-pageant.exe [ポート番号]`~~
    `$ /mnt/c/somewhere/wsl-ssh-pageant.exe [ポート番号] &`


3. Bash on WindowsのsocatコマンドでUnixドメインソケットとwsl-ssh-pageantのTCPソケットを結合する \*), \**)

    `$ socat UNIX-LISTEN:/tmp/wsl-ssh-pageant.socket,fork,reuseaddr TCP:127.0.0.1:(13000|ポート番号) &`
    `,fork,reuseaddr`をつけたら永久ループは不要。詳しくは`man socat`。
4. 環境変数`SSH_AUTH_SOCK`に`/tmp/wsl-ssh-pageant.socket`をセットする

    `$ export SSH_AUTH_SOCK=/tmp/wsl-ssh-pageant.socket`

\*) デフォルトのポート番号は13000

\**) Address already in useのメッセージが出る場合は，`pidof socat`などでsocatが起動済みでないことを確認し，`rm /tmp/wsl-ssh-pageant.socket`でソケットの残骸を削除して再実行。`lsof`や`netstat -x`は本稿執筆時点(Ver.1607 build 14393.576)では機能しない。

## Tips

+ Windows側でwsl-ssh-pageant.exeを起動するとコマンドプロンプトが残って邪魔くさい。cygwinの`run`経由で起動することでコマンドプロンプトの表示は抑止できるが，Ubuntu側からcbwinの`wrun`コマンドを使う方がスマート。
    + `run`または`wrun`から起動したwsl-ssh-pageant.exeを終了するには，タスクマネージャから「プロセス」タブで"dotnet"または「詳細」タブで"wsl-ssh-pageant.exe"を選択して「タスクの終了」。
+ socat (1.7.2.3)は作成したUnixドメインソケットの後始末をしてくれない。パッチを書くのがベストだが，以下のようなシェルスクリプトでごまかすことも可能。

~~~~
#!/bin/bash
#
SOCK=/tmp/wsl-ssh-pageant.socket
PORT=13000

if [ -e $SOCK ]; then
    if [ -n "$(pidof socat)" ]; then
        echo "Already started" >&2
        exit -1
    else
        rm -f -- "$SOCK"
    fi
fi

trap "rm -f -- '$SOCK'" EXIT
/usr/bin/socat UNIX-LISTEN:$SOCK,fork,reuseaddr TCP:127.0.0.1:$PORT
rm -f -- "$SOCK"
trap - EXIT
exit
~~~~

# セキュリティ上の留意点

ssh-agentおよびpageantが持つ[一般的な問題](http://tech.nitoyon.com/ja/blog/2008/01/07/pageant-security/)に加え，wsl-ssh-pageantはlocalhost:13000へのアクセスに対し，認証なしに無条件で応答してしまうという問題を持つ。
マルチユーザ環境や信頼できないプログラムが走る可能性のある環境では絶対使用しちゃいけない。
簡単な Watson Document Conversation 入門


## はじめに

Watson サービスの中で R&R の SoIr 用の JSON データを、PDFファイルなどから変換してくれるサービスです。

以下を作業する前に、Bluemix 上で、NLC サービスをカタログから選択して、サービスを作成していることを前提とします。

## 変換方法

サービスを作成後、選択スト以下のような画面があるので、「Demo」を選択する。

![Watson-2017-01-03-20.54.jpg](https://qiita-image-store.s3.amazonaws.com/0/73831/94b4f740-b222-3ad9-cf8d-6440d036b916.jpeg "Watson-2017-01-03-20.54.jpg")

「Upload a file」を選択すると、「Choose your file」を選択してファイルを指定する。但し、1MBのサイズまで。

![Watson-2017-01-03-20.58.jpg](https://qiita-image-store.s3.amazonaws.com/0/73831/b24a7a5e-1334-2321-13e3-9bb84c962a63.jpeg "Watson-2017-01-03-20.58.jpg")

サイズ制限があるので、サービスを確認する最初の画面から、「サービス資格情報」を選択し、クレデンシャル情報を確認して、以下のようにAPIを呼ぶことで、サイズ制限なく変換可能。

> curl -X POST -u "{username}":"{password}" -F config="{\"conversion_target\":\"answer_units\"}" -F file=@{ファイル名} "https://gateway.watsonplatform.net/document-conversion/api/v1/convert_document?version=2015-12-15"

## 変換結果

手元にある適当なファイルを変換してみた。PDFにあるタイトルを title にして、content は、そのセンテンスの文章をいれている感じ。扱える文書は、限られる気がするが、簡易的にデータ作成した場合は活用できるかも。

![Watson-2017-01-03-17.55.jpg](https://qiita-image-store.s3.amazonaws.com/0/73831/8c78131e-36de-f1e3-5eb1-f563a77bce80.jpeg "Watson-2017-01-03-17.55.jpg")

## あとがき

Document Conversation は、使い方も簡単だが、読み込ませるデータは考えなければいけないのと、出力データは整形スクリプトを書く必要がありそう。

## 参考

書籍: [初めてのWatson](https://www.amazon.co.jp/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AEWatson-API%E3%81%AE%E7%94%A8%E4%BE%8B%E3%81%A8%E5%AE%9F%E8%B7%B5%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E4%BA%95%E4%B8%8A%E7%A0%94%E4%B8%80/dp/4865940529/ref=sr_1_1?ie=UTF8&qid=1482120101&sr=8-1&keywords=Watson)

## 変更履歴

2017/01/03 公開
2017/01/04 タイトルのミスを修正^^;
Go 1.6 から導入された Vendoring 機能でインポートされるライブラリの優先順位


# 概要

Go 1.6 から標準機能になった、外部のライブラリを本体のソースコードとは別の場所で管理できるようになった Vendoring 機能で読み込まれるディレクトリの優先順位を確認してみました。

# 結論

- 実行するソースコードと同じ場所、なければ親ディレクトリにあるライブラリ
- ```vendor``` があれば優先
- ```src``` ディレクトリが最上位

## 例外
```src/mypackage/main.go``` から親ディレクトリの ```src/vendor/lib/lib.go``` は読み込まれるが、```src/main.go``` からは同じ場所にある ```src/vendor/lib/lib.go``` は読み込まれない。
※ ```src``` 直下の場合のみ挙動が異なる。


# 検証

## $GOPATH のディレクトリ構成

```
$ tree
.
├── src
│   ├── lib
│   │   └── lib.go
│   ├── main.go
│   ├── mypackage
│   │   ├── lib
│   │   │   └── lib.go
│   │   ├── main.go
│   │   └── vendor
│   │       └── lib
│   │           └── lib.go
│   └── vendor
│       └── lib
│           └── lib.go
└── vendor
    └── lib
        └── lib.go

10 directories, 7 files
```

## ソースコード

```Go:main.go
package main

import (
    "lib"
)

func main() {
    lib.Execute()
}
```

```Go:lib.go
package lib

import "fmt"

func Execute() {
    // 実行されるソースコードの場所を出力
    fmt.Println("src/lib/lib.go")
}
```

## 検証結果

### テスト1

```
$ cd $GOPATH

$ go run src/main.go 
src/lib/lib.go

$ rm -R src/lib

$ go run src/main.go 
src/main.go:4:5: cannot find package "lib" in any of:
	/usr/local/Cellar/go/1.7.4_1/libexec/src/lib (from $GOROOT)
	/Users/aiba/.go/src/lib (from $GOPATH)
```

```src/main.go``` から ```src/vendor/lib/lib.go``` が読み込まれることはない。



### テスト2

```
$ cd $GOPATH

$ go run src/mypackage/main.go 
src/mypackage/vendor/lib/lib.go

$ rm -R src/mypackage/vendor

$ go run src/mypackage/main.go 
src/vendor/lib/lib.go

$ rm -R src/vendor

$ go run src/mypackage/main.go 
src/lib/lib.go

$ rm -R src/lib

$ go run src/mypackage/main.go 
src/mypackage/main.go:4:5: cannot find package "lib" in any of:
	/usr/local/Cellar/go/1.7.4_1/libexec/src/lib (from $GOROOT)
	/Users/aiba/.go/src/lib (from $GOPATH)
```

```src``` より上位にある ```vendor/lib/lib.go``` が読み込まれることはない。
何も考えずにmacOS Sierraでphpenv使ってPHP7.0.9をインストールしたい時のメモ

## 注意

自分用の雑記です。

## 内容

### [Homebrew](http://brew.sh/index_ja.html)を入れる(あればスキップ)

```bash
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### [anyenv](https://github.com/riywo/anyenv)を入れる

```bash
$ git clone https://github.com/riywo/anyenv ~/.anyenv
$ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
```

そして`exec $SHELL -l`を打つかターミナルを閉じて再度開く（要するにシェルを再起動する）

### phpenvを入れる

```bash
$ anyenv install phpenv
```

再度、`exec $SHELL -l`を打つかターミナルを閉じて再度開く

### phpのビルドに必要なライブラリを揃える

```bash
$ brew install openssl libxml2 autoconf automake libjpeg libpng libmcrypt
```

### --with-mysqlオプションを削除する(PHP7以降だとコケる原因に…？)

`vim`かなにか好みのエディタで`$(phpenv root)/plugins/php-build/share/php-build/default_configure_options`の中の`--with-mysql`で始まる行を削除して保存

### PHPのインストール

```bash
$  CFLAGS="-g" PHP_BUILD_EXTRA_MAKE_ARGUMENTS="-j$(sysctl -n hw.ncpu)" phpenv install 7.0.9
```

- `CFLAGS="-g"`  
  コンパイラに渡すオプション。より詳細なデバッグができるらしい…？（コンパイラについてはほとんど知識がないもので…）
- `PHP_BUILD_EXTRA_MAKE_ARGUMENTS="-j$(sysctl -n hw.ncpu)"`  
  ビルドのスレッド数。論理CPUの数だけの数字を設定してやると並列でコンパイルが実行されるため、高速になる。Linuxの場合は単に`nproc`コマンドだけでよい。macOS(OS X)の場合もHomebrewで`coreutils`が入れてあれば`gnproc`コマンドでよい。

### デフォルトの使用バージョンを7.0.9に設定

```bash
$ phpenv global 7.0.9
```

### 7.0.9になったか確認

```bash
$ php -v
PHP 7.0.9 (cli) (built: Jan  3 2017 20:15:13) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.9, Copyright (c) 1999-2016, by Zend Technologies
    with Xdebug v2.5.0, Copyright (c) 2002-2016, by Derick Rethans
```

以上
Ubuntuの言語設定を日本語に変更する。

# Ubuntuの言語設定を日本語に変更する
vagrantのboxで配布されているものが基本的に英語で日本語設定されていないため、必ず最初に設定する必要があるであろう日本語設定についてです。

## 環境情報
OS: ubuntu-15.04
vagrant box: [ubuntu-15.04](https://github.com/kraksoft/vagrant-box-ubuntu/releases/download/15.04/ubuntu-15.04-amd64.box) 

## 方法
* 日本語パッケージをインスト➖ルする  

```
root@vagrant-ubuntu-trusty:~# apt-get -y install language-pack-ja-base language-pack-ja ibus-mozc
root@vagrant-ubuntu-trusty:~# update-locale LANG=ja_JP.UTF-8 LANGUAGE=”ja_JP:ja”
root@vagrant-ubuntu-trusty:~# source /etc/default/locale
```

### 以上
Dockerを使ってものすごく簡単なサーバーを立ててみる（Nginx）

#HTMLとかJavaScript（JQuery）とかでさくっと作ったものをEC2とかで公開する

Dockerを使ってNginxをベースに簡単なWebサーバーを構築してみます。環境はMac OSXでしたが、仮想OSを利用する必要はありません。NginxをDockerでセットアップすることに関連する記事は結構見かけたのですが、古かったりして意外と時間がかかったので簡単にまとめておきます。AWSのEC2などで公開する際も全く同様の手順でできます。

以下のような簡単なWebアプリケーションを作って公開してみました。（[http://shuichi.tech](http://shuichi.tech)）
![http://shuichi.tech](https://s3-ap-northeast-1.amazonaws.com/ngo275.asset/Gif/profile.gif)

##構成

コードは[ここ](https://github.com/ngo275/nginx-docker-my-profile)においています。元旦暇すぎてバーっと作ったのでコードの質はアレですが...。

```/path/to/project.
.
├── Dockerfile
├── app
│   ├── css
│   │   └── main.css
│   ├── index.html
│   └── js
│       └── typed.js
└── sites-enabled
    └── default
```

##最低限のファイル作成

まず `Dockerfile` から。今回 `Ubuntu(17.04)` を利用しました。

```/path/to/project/Dockerfile.
# Getting Base Image
FROM ubuntu:17.04

# Author Info
MAINTAINER ngo275

RUN apt-get update && \
    apt-get install -y nginx && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

RUN echo "daemon off;" >> /etc/nginx/nginx.conf
ADD sites-enabled/ /etc/nginx/sites-enabled/
#ADD app/ /app/

EXPOSE 80

CMD ["/usr/sbin/nginx"]
```

次に設定ファイル（ `/path/to/project/sites-enables/default` ）です。

```/path/to/project/sites-enables/default.
server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    root /app;
    index index.html index.htm;

    server_name localhost;

    location / {
        try_files $uri $uri/ =404;
    }
}
```

そして `path/to/project/index.html` です。cssやjsを読み込む場合は以下のコメントの部分を適宜修正してください。ここでは一旦cssやjsなしで進めます。

```/path/to/project/index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    /*****ここはなくても良い.
    <link rel="shortcut icon" href="faviconのurl">
    <link rel="stylesheet" type="text/css" href="css/hoge.css">
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
    <script src="js/hoge.js"></script>
    ******/

</head>
<body>
    <h1>Hello World!!</h1>
</body>
</html>
```

##Dockerを利用
Dockerをインストールしておきます。Mac OSXにインストールするなら[このサイト](http://qiita.com/hshimo/items/e24b1fbfbf775ec7c941)が参考になります。また、EC2（Amazon linux）にインストールするなら以下のような手順です。

    sudo rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6
    sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
    sudo yum -y install docker-io
    sudo service docker start
    sudo chkconfig docker on


projectへのpathが `/path/to/project` であるとします。ここでは簡単のためにrootで実行します。

    sudo su
    cd /path/to/project
    docker build -t nginx-app .
    docker run -p 80:80 -d -v /path/to/project/app/:/app/ nginx-app

としてブラウザで `http://localhost` （もしEC2や仮想OSならそのIPアドレス）にアクセスするとindex.htmlがブラウザで確認できるはずです。

index.htmlやCSS, JavaScriptを編集してブラウザでリロードすると反映されます。

サーバーを停止したい時は `docker ps -a` で今動かしているプロセスを確認して、 `docker stop CONTAINER ID` したのち、 `docker rm CONTAINER ID` を実行します。

##まとめ
Docker使うと簡単なWebアプリケーションなら、開発環境と同じようにしてすぐにデプロイできる。
ただし、DB用のコンテナを利用したり、と複雑になっていくと、こうも簡単にはいかなくなる。