OmniAICreator/Qiita-1.07M huggingface dataset:
Arch Linux向けのGroonga族パッケージングの小噺（2015年版）

# はじめに

Groongaは基本的にLinuxではビルドすることが可能です。FreeBSDへポートされていたり、[Gentoo Linuxにもebuildがあるようです](https://packages.gentoo.org/packages/app-text/groonga)。

この記事ではArch Linux向けにGroonga族をパッケージングしているという話を書きます。

## Arch Linuxとは

Arch LinuxはArch Build System(ABS)を持ち、システムをシンプルかつミニマムにするように設計されています。また、設定は基本的にGUIでは行わず、ファイル編集により行う方式となっています。あとArch Linux Wikiはとても充実していますね！

## PKGBUILD

Arch Linuxのビルドシステム(ABS)に乗ってパッケージングするにはPKGBUILDを知る必要があります。積極的にパッチを当ててビルドするような仕組みにはなっておらず [^1]、基本的にはバニラのソフトウェアをビルドして使うことになります。

[PKGBUILD | Arch Wiki](https://wiki.archlinux.org/index.php/PKGBUILD)を見るとほとんどやるべきことは書かれています。パッケージ名の指定、tarballのハッシュ値、依存関係、`build()` 関数、`package()` 関数の辺りが最低限把握しておくべき情報です。

[^1]: 一応パッケージをビルドする前にパッチを当てているPKGBUILDも存在します。ただしあまり見かけません。

## AURとは

Arch User Repository(AUR)はアカウントを作成すれば、誰でもPKGBUILDを登録できる仕組みです。そのため、AURに置かれているPKGBUILDは基本的に現状有姿・無保証で扱う事が求められます。これはオープンソース・ソフトウェアでも同じなので特にハードルにはなりませんね！

去年も[GroongaのAURについてアドベントカレンダーで言及しています](https://cosmo0920.wordpress.com/2014/12/20/groonga%E3%81%AEarch-linux%E5%90%91%E3%81%91%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0/) が、今年の夏頃に[AURがバージョン4へと移行](https://lists.archlinux.org/pipermail/aur-general/2015-August/031322.html)しました。AURがtarballをWebUIで登録する方式ではなく、gitベースになり、pushするだけで良くなりました。また、co-maintainerという概念が登場し、共同でAURパッケージを管理できるようになっています。

## Groonga族のPKGBUILD

GroongaとMroonga、そしてPGroongaをAURからインストールできるようにメンテナンスを続けています。[^2]
PKGBUILDのリポジトリは去年から変わらず[こちら](https://github.com/cosmo0920/AUR-for-Groonga-family)です。今年はPGroongaのPKGBUILDとcutter testing frameworkのPKGBUILDが増えました。また、Cortex A9のARM CPUを積んだARMボードでのArch Linux
環境を整えたのでいくつかのPKGBUILDはarmv7h向けにもビルドできることを確認しています。

[^2]: 最近はちょっと更新が遅れ気味です、すみません。。

## おわりに

GroongaはArch Linuxでもコマンド一発でインストールが可能になっています。Arch Linuxをお使いの方でAURパッケージのメンテナンスに興味があったり、AURパッケージを使ってみての不具合報告しようかしまいか抱えていたりする場合はぜひ声を上げていただけるとうれしいです[^3]。

[^3]: Arch Linuxを使っていなくても実はArch LinuxのVagrantBoxを作る[packerスクリプト](https://github.com/elasticdog/packer-arch)もあるのでこれを機にArch Linuxに挑戦してみるのもいいかもしれません。
BLENanoにbootloader.hexをうまく書き込めないとき

![aa884cc155cf7b01065e442029cbe87d.image.538x354.JPG](https://qiita-image-store.s3.amazonaws.com/0/41889/455d4e4c-618a-6592-a4a6-c29f891668c3.jpeg)
[BLE Nano](http://redbearlab.com/blenano/)

初心者すぎてめっちゃ嵌ったので、備忘録としてメモ。

***Mac OS10.10.x(Yosemite)だと、BLENanoにbootloader.hexがうまく書き込めなかった。***

#### 前提

BLENanoをArduinoIDEで開発するには
https://github.com/RedBearLab/nRF51822-Arduino/blob/S130/README.md

結論は、以下コマンドで解決した。

`sudo mount -u -w -o sync /Volumes/MBED;
cp -X ~/(your path)/bootloader.hex /Volumes/MBED/`

普通の手順は、BLENanoをmacに挿すとマウントされた`MBED`が出現するので、そこに`bootloader.hex`ファイルをドラック&ドロップするだけ。すると、一度アンマウントされて、再度マウントされる。これで完了。

しかし、僕のmacだと、`fail.txt`といういかにも失敗したっぽいファイルが生成されて、やはりちゃんとbootloaderをロードできていない。

どうやら発売元のRedbareのフォーラムを見ても、同じように困っている人がいるらしい。
挙げ句の果てに、半田付けはちゃんとできているか？みたいな指摘をされていて、ちょっと可愛い。

[Please help -- cannot install nRF51822 Arduino Add-on on Mac (Yosemite)](https://redbearlab.zendesk.com/entries/71376925-Please-help-cannot-install-nRF51822-Arduino-Add-on-on-Mac-Yosemite-)

解決につながった記事↓
[Yosemite file copier for HDK-based mbed](https://developer.mbed.org/platforms/RedBearLab-BLE-Nano/)

これの一番下にすごく重要なことが書いてある

>Note: If you are using OSX 10.10.x (Yosemite), it has a bug with the OS, please use this method to load firmware: 
https://developer.mbed.org/users/okano/notebook/mbed-on-yosemite/?c=14179


ちなみに、何度もマウント、アンマウントを繰り返していると稀に、「/Volumes」のマウントポイントが重複してしまうバグが起こるときがある。

[volumes-に重複したマウントポイントを削除する](https://dodastrand.wordpress.com/2014/05/09/volumes-%E3%81%AB%E9%87%8D%E8%A4%87%E3%81%97%E3%81%9F%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%82%92%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B/)


そのほか、リファレンス

[公式リファレンス]
(http://redbearlab.com/blenano/)
[RedBearLab/nRF51822-Arduino]
(https://github.com/RedBearLab/nRF51822-Arduino)
[BLE NanoでiOSアプリとBluetooth通信(BLE Nano編)](http://pentacreation.com/blog/2015/12/151207.html)
[BLE NanoをArduino IDEで開発する]
(http://shokai.org/blog/archives/10424)

appleWatchと連動の知見も↓
[6500円でつくるスマートロック 電子工作編]
(http://qiita.com/toshi-saito/items/87c507350941a95cc660)


おわり
unix系でaccesslogのデータを解析したい

unixコマンドのメモ

追記：今回awkを使って日付の期間を絞り込んでいますが、newerをつかっても可能です。
[unix系でファイルの数、容量を知りたい:1.ファイル生成時刻の期間で抽出したい](http://qiita.com/tagosaku324/items/7370eccec74384ea3b5c)
参照
これでやってもいいと思います！この場合は

```
ls -la `find . -type f -newermt "2015-10-01" ! -newermt "2015-11-01"`
```
で期間の取得はできますね。


Apacheのaccesslogのある期間から、ある条件の行だけを取得したい。
また、ファイルはすでにbz2で圧縮されている
っていうような状態の時に実行したコマンド。

```
-rw-r--r-- 1 tago tago  1021404 8月 31 00:00 acct.1446163200.bz2
```
上記みたいな状態でaccesslogがあるとする。
8月分を全部取得したいけど、日本語が入ってるとうまくできない。そんな時は
環境言語をデフォルトにして、'Oct'でひっかけちゃう。
不要な年が入ってきちゃうならば年を取り除く　egrep -v '**'　とかを使って絞り込む。

```
$LANG=C ls -la *acc* | egrep 'Oct'
```
上記訂正！(20151224　訂正)
上の状態だと、たまたまうまくいくけど'Oct'っていう文字でもひっかかってしまうので、awkを使って絞りこむように変更します。

```
LANG=C ls -la *acc* | awk '$6 ~ /Oct/'
```

ファイルリストの取得はできたけど、これを展開しないことには中身のgrepはかけれない。

```
bzcat `LANG=C ls -la *acc* | awk '$6 ~ /Oct/'| awk '{print $9}'` 
```
awkを使ってファイル名を取得し、bz2を展開するbzcatを使う。
そしてファイルの中身のフィルター文言をgrepで抽出する。

```
bzcat `LANG=C ls -la *acc* |awk '$6 ~ /Oct/'| awk '{print $9}'` | egrep 'test1|test2' > log.txt
```
こんな感じで必要な箇所だけ抜き出して取得できる！

参考URL
[AWKで一番の得意ワザ！ シェルで文字列を自在に扱うための文字列関数](http://codezine.jp/article/detail/7912)
BootStrapより軽くて少機能！ CSS Framework「Pure」をBootStrap Advent Calendarで宣伝する暴挙に出る！

#あらまし
「ジョジョの奇妙な冒険 未来への遺産」で２番目に好きなキャラクターがホル・ホースだったということもあってか、CSS Frameworkはbootstrapよりもマイナーなpureを推す事もあった(伏線)。

#CSSフレームワーク「Pure」とは
yahoo YUIチームによる超軽量CSSフレームワーク。
javascript不使用。
v0.6.0の時点で約4KB。
v1.0.0の時点で約3.8KB。
レスポンシブ対応/非対応選択可。

[Pure公式サイト](http://purecss.io/) / [GitHub](https://github.com/yahoo/pure)

#好きなところ

## 1. 24Grid or 5Grid。黄金比もより近似値に
メジャーなCSSフレームワークは12Gridの場合が多いが、Pureは二倍の24Grid。
更に面倒な5等分、5Gridも設定可能。

美しく見えるという~~オカルト~~比率、黄金比。
24Gridだと、12Gridより近似値で作りやすい。

|黄金比|長辺|短辺|
|---|---|---|
|24grid|15(14.83)|9(9.17)|
|12grid|7(7.42)|5(4.59)|

bootstrapで黄金比に固執する場合だと、下記のようなサブセットを代わりに導入する必要がある（こちらはheaderサイズも黄金比で組まれていて面白い）
https://github.com/iamkevinrhodes/goldbootstrap

まあその、BootStrapとかなら白銀比が使いやすいので、こっちの方が断然オススメ。

|白銀比|長辺|短辺|
|---|---|---|
|24grid|14(14.06)|10(9.94)|
|12grid|7(7.03)|5(4.97)|

ちなみに計算はこちらを利用。
http://voidism.net/metallicratio/

## 2.hiddenパラメータ
これが

```
<div class="hoge" hidden>ふっかつ おそ松くん</div>
```

こうなる

```
<div class="hoge" style="display: none !important;">ふっかつ おそ松くん</div>
```

運用上、一般ユーザ（ソース見る奴を一般とは言わないならば）に隠したい項目を、html6文字で消せる。
実は一番お気に入りの機能。
jQueryで扱うなら、hoge.attr('hidden',''); みたいな感じ。
(bootstrapだとhoge.addClass('hidden')なのでpureは直感的じゃない気がする)

## 3.Skin Builderが存在する
http://yui.github.io/skinbuilder/?mode=pure

まあコレ無いとデザインで泣くのですが。
bootstrapのカラフルなコンポーネントの方針とは違い、一色系、もしくは二色系を中心にデザインしていく形。

bootstrapならPaintStrapが非常に良い。Adobe Color CCのプロファイルが使えるのが素敵。アプリ併用すれば写真から色情報起こせるので。
http://paintstrap.com/ja/

## 4.コンポーネント切り離しが可能で小さい、CSSのマイクロフレームワーク
機能ごとに絞った個別導入ができるので、デフォルトのファイルサイズ(4KB)から更に絞れる。
http://purecss.io/customize/

また、bootstrapに存在する「ラベル」「バッジ」「アラート」など、CSSで書き直すのが比較楽な機能は存在せず、色に関しても「primary,success,info,warning,danger」などの色の区分もない。

公式サイトを見るに「そんなの自分で組んだほうが早いよ！！！！」と言わんばかりの解説が行間から漂う。

例：「アイコンフォント？ そうそう[Font Awesome](https://fontawesome.com)って知ってる？ すごく便利だよ！！！！」

pureはまさしく「CSSマイクロフレームワーク」だ。
Rubyで言えばRailsではなくSinatra。
PHPで言えばSymfonyではなくSilex。
必要なコンポーネントを選び採用することで反応速度を上げるタイプ。

# まとめ、もしくは「pureが生きる現場とは」
アクセスが激しい大規模サイトなど。
初動のレンダリング速度を重視したい販促用サテライトサイトなど。
軽量高速のpureは、これらによく合う。

また、js不使用でcssの記述量も少なく、既存のサイトへ適用した際の破綻が少ない。
レガシーサイトを中途半端に対策する際に便利。IE 10から動くし。

という訳で、bootstrapがシステム上で組み込まれていない環境であれば、pureも比較検討いただきたい。
（pure公式にbootstrapとちゃんぽんさせる方法が記載されていたが個人的にはナンセンス。bootstrap一本を推奨）


# 私信
20/05/15にてiOS 12- に正式対応。appleは赦された。
あとIE8のサポートが消えてた。いらないよね
十六進数の文字列から実際の数値を取得する

ググるとほとんどの記事はこの書き方しか教えてないんですよな…

```swift
let hexString = "FF"
var hex:UInt32 = 0x0
let scanner:NSScanner = NSScanner(string: hexString)
scanner.scanHexInt(&hex)

print(hex) //255
```

まあ Objective-C の時代ならこの書き方がベストだったのかもしれませんが、せっかく今の Swift はもっと便利な書き方あるのにな…

```swift
let hexString = "FF"
let hex = Int(hexString, radix: 16) ?? 0

print(hex) //255
```

`var` 使わずに済むし `NSScanner` 使わずに済むしコード量も半分で済むし（変換だけを考えれば半分どころか 1/3 になるんやで）何より余計な NS オブジェクト作らずに済みますから純正は Swift コードだけで出来ちゃうのがすごい気持ちいいんですよな。さらに `radix:` の記述で御察しの通り、これは十六進数だけでなくいろんな進数に対応している（正確に言うと hexString で使える文字は `[0-9a-zA-Z]` だけなので実質三十六進数までだが）しさらに実は hexString の先頭に `"-"` を入れればマイナス値もちゃんと取得できるので `NSScanner` よりも便利だったり。

というわけでもう十六進数の文字列から実際の数値を取得しようとするとき積極的に `Int` の `init` 使いましょうぜ
Atomで行移動(moveLineUp/moveLineDown)時のオートインデントをオフにする方法

##前置き
[【超おすすめ！！】Atomのパッケージ、テーマ、キーバインディング、設定を紹介してみる（※随時更新）:カスタム設定：行移動時のオートインデントをオフにする](http://qiita.com/snowsunny/items/f40c3291a580f3215797#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E8%A8%AD%E5%AE%9A%E8%A1%8C%E7%A7%BB%E5%8B%95%E6%99%82%E3%81%AE%E3%82%AA%E3%83%BC%E3%83%88%E3%82%A4%E3%83%B3%E3%83%87%E3%83%B3%E3%83%88%E3%82%92%E3%82%AA%E3%83%95%E3%81%AB%E3%81%99%E3%82%8B)
↑の記事にも追記したのですが、探してる人向けに別記事化しましたー。

##行移動時のオートインデントをオフにする方法
v1.3.0 (2015-12-10)の更新で下記の行移動時に自動でインデントする機能が追加されたのですが、これが不具合を起こしていて、一行だけの移動なら良い感じに動いてくれるのですが、複数行を移動させる時にファイルタイプにも依りますが、結構な確率でコードの構造を壊してしまいます…その問題の取り敢えずの解決法を考えたので、かなり微妙なやり方ですが紹介してみたいと思います。
>v1.2.4...v1.3.0
>...
>・[atom/atom#9104 - autoindent lines with moveLineUp/moveLineDown](https://github.com/atom/atom/pull/9104) on November 3rd 2015
>...

引用元：https://atom.io/releases

手順は簡単で、まずはinit.coffeeに下記のコードを追加します。

```init.coffee
atom.commands.add 'atom-text-editor', 'my:move-line-up', ->
  editor = atom.workspace.getActiveTextEditor()
  if atom.config.get('editor.autoIndent')
    atom.config.set('editor.autoIndent', false)
    editor.moveLineUp()
    atom.config.set('editor.autoIndent', true)
  else
    editor.moveLineUp()

atom.commands.add 'atom-text-editor', 'my:move-line-down', ->
  editor = atom.workspace.getActiveTextEditor()
  if atom.config.get('editor.autoIndent')
    atom.config.set('editor.autoIndent', false)
    editor.moveLineDown()
    atom.config.set('editor.autoIndent', true)
  else
    editor.moveLineDown()
```

次にkeymap.csonに下記の設定を追加して終了です。
<div class='alert alert-warning'>「.pratform-linux」部分は各種OSの物に変更してくださーい。</div>

```keymap.cson
'.platform-linux atom-workspace atom-text-editor:not([mini])':
  'ctrl-shift-up': 'my:move-line-up'
  'ctrl-shift-down': 'my:move-line-down'
```
これで以前の行移動の動作と同じ様な動きになっているかと思います。

##最後に
[atom/atom#9104 - autoindent lines with moveLineUp/moveLineDown](https://github.com/atom/atom/pull/9104)のページを見て貰えれば分かるかと思うのですが、GitHubの中の人が、この問題に対応出来るまで一旦この機能を削除した方が良いかも的な事を言っているので、この設定は次の更新で不必要になるかもしれません…
(´・ω・｀)

その時はまたここでもお知らせしますねー。
(｀･ω･´)b
今日マージされたプルリクエストのタイトル一覧を表示するgitコマンド

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


GitHubでプルリクエストを利用して開発しているプロジェクトが対象です。

# コマンド

開発用ブランチにいることを確認し、以下のコマンドを実行します。

`git log --merges --since=6am --first-parent --reverse --pretty=format:"* %b"`

すると以下のように出力されます。

```
* 画像Aをホーム画面に表示
* バグBを修正
* ボタンCが押された時にテキスト投稿
```

# 説明
`git log`

- コミットログ表示

`--merges`

- マージされたコミットだけに限定
  
`--since=6am`

  - 今日朝6時からのコミットだけに限定
  
`--first-parent`

  - 開発ブランチのコミットだけに限定
    - ≒ プルリクエストによりマージされたコミットだけに限定
    
`--reverse`

  - 逆順 (マージされた順) に表示

`--pretty=format:"* %b"`

  - 出力フォーマットの指定
    - `%b` でコミットメッセージの本文を出力
      - 具体的には、プルリクエストによりマージされた時に自動で付与されるコミットメッセージのうち、 `Merge pull request #xxx from xxxxx` という文言を省いて、プルリクエストのタイトル文言だけを出力する
    - その他いろいろと指定できます  
      https://git-scm.com/docs/pretty-formats

# 利用例
1日の終わりにJenkinsによって社内テスト用アプリを自動リリースするときなど、リリースノートとして利用すると良い感じです。

# 参考
`git log` のオプション一覧
https://git-scm.com/docs/git-log

`--pretty=format` オプションについて
https://git-scm.com/docs/pretty-formats


-->
IMGkitとRMagickを使ってURLスクリーンキャプチャにHello Worldしてみた

##動機
ハロワしなきゃいけないという強迫観念に囚われた

##やること
1. IMGKitを使ってURLのスクリーンキャプチャを取得する事
2. 取得した画像をRMagickを使って加工する事
3. 加工した画像にHello Worldを確認する事

## 使うもの
- [IMGKit](https://github.com/csquared/IMGKit)
- [RMagick](https://github.com/rmagick/rmagick) 
- [example.com](http://example.com) 
- ruby

### IMGKitでスクリーンキャプチャを取得
```Ruby
  # file_path生成
  file_path = "#{SecureRandom.hex(40)}.png"
  img = IMGkit.new(`http://example.com`)
  img.to_file(file_path)
```

### RMagickで画像加工
```rb
   require 'RMagick'
   text = "Hello World!!!"
   img = Magick::ImageList.new(file_path)
   draw = Magick::Draw.new

   # 文字を白色で縁取り
   draw.annotate(img, 0, 0, 3, 3, text) do
     self.fill = 'red'
     self.gravity = Magick::SouthEastGravity
     self.pointsize = 30
     self.stroke = 'white'
     self.stroke_width = 4
     self.text_antialias = true
   end
   # Hello World!!!設定
   draw.annotate(img, 0, 0, 3, 3, text) do
     self.fill = 'red'
     self.gravity = Magick::SouthEastGravity
     self.pointsize = 30
     self.stroke = 'transparent'
     self.text_antialias = true
   end
```

### ハロワ確認
![57cbb40ffad2ddfc286df9336d7959f38e682b4a1a40001a0db724731ae7d2dfe1f842a85ccb411f.png](https://qiita-image-store.s3.amazonaws.com/0/96832/22514c83-184c-2366-cbe6-34874694aede.png)

#### 参考
[Railsでhtmlファイルやリンク先のスクリーンショットを撮影～IMGKit&wkhtmltoimage](http://blog.scimpr.com/2013/03/18/rails%E3%81%A7html%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%84%E3%83%AA%E3%83%B3%E3%82%AF%E5%85%88%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%82%92/)
[RMagickでフォント名を指定して文字列を描画する](http://blog.ruedap.com/2011/04/13/ruby-rmagick-font-draw-string-annotate)

```
 ⊂[Ｊ(´ｰ`)し
　 / (⌒マ
　(⌒＼ヘ｣つ
　 ＞ _)、
　 じ ＼_)＼＼＼

　 Hello World!!!

　　　　　　　 (⌒
　　　　　⌒Ｙ⌒
```
【中級者向け】パフォーマンス問題に燃えるLAMPプロジェクトへの処方箋

環境構築は普通に出来て、負荷分散でちょっとした台数動いている程度、サーバの能力をある程度食い切ってる程度のプロジェクトが対象です。

# 処方箋スタート！
## 1．まずはモニタリング（工数：〜半日程度）
ここでいうモニタリングは死活監視ではなく、主に性能監視、それもアプリケーションの。プロジェクトのレベルがイマイチな状態で、ボトルネックを可視化し対策していく事は困難です。なのでコレはお金の力で解決してしまいます。

NewRelic
http://newrelic.com/

詳細解説は他の記事に譲るとして、使う上での個人的なポイント

- **ロードバランサ配下の1台にだけ入れる**（費用節約）
- よく見るのはMONITORINGのTransactionsとDatabasesのtrace（なので有償版が必要）
- Errorsも結構役に立つ

平たく言うと、遅くて回数の多い処理のtraceを見て、そこに対してチューニングしていきます。slow log自体はミドルウェアやフレームワークで出力出来たりもしますが、炎上するプロジェクトにおいて、これらがNewRelicと同等レベルに見やすい状態になっている事は無いでしょう。**有償版は結構高いですが、エンジニアの迷走工数の方がはるかに高いので**、サクッといきましょう。

## 2. 静的ファイルをCDNに逃がす（工数：1時間〜）
LAMPのベーシックな構成だとmod_phpを使う事が多いと思いますが、この場合、静的ファイルとアプリケーション処理が同列のプロセスでの処理になってしまいがちです。なので、負荷が高くなった際の挙動がピーキーになりがちです。
CDN自体は色々ありますが、有名どころで敷居が低いものだとCloudFrontでしょうか。世の中の記事だと、S3とセットになっているものが多いのでS3が必須っぽく感じるかもしれませんが、**オンプレでAWSとは関係ないデータセンターでも利用可能**です。

- サービス用FQDNに対してCloudFrontを設定する
- Viewを編集して、移して良いファイルだけCloudFrontのFQDNに参照を向ける

という流れだと、リスクは小さく、CDNへの移転を進められます。
また、**CDNに不慣れな場合はファイルが書き換わらないという問題が出る**と思うので、その場合、オブジェクトのヘッダを無視したCustomizeなTTLを当てても良いかもしれません。

## 3. MySQLのチューニング（工数：〜1週間程度）
こちらも遅いクエリとして見つかったものに対し、対処をしていく形になります。

- 参照系であれば、クエリキャッシュやキャッシュ機構でまずは代替可能か。代替不能な場合、適切にインデックスを使用しているか
- 更新系であれば、不用意なテーブルロックが発生していないか。その他、不要なインデックスが無いか。

あたりでしょうか。

特に、DBAやそれに相当するスキルの人がいないプロジェクトでは、各カラムにインデックスを張りまくったりという事件もありますのでご注意を。

#### インデックスに纏わる注意点
* InnoDBの場合、**クエリーで使用できるインデックスは、原則、各テーブルにつき1つだけなので、カラム毎に乱発したインデックスはまともに使われない**ので、複合インデックスにした方が良い
* 最近のMySQLバージョンだと[インデックスマージ](https://dev.mysql.com/doc/refman/5.6/ja/index-merge-optimization.html)が結構機能するので、乱発という程でないインデックスはそれなりに活用される（基本的には複合インデックスの方が速い）
* インデックスは複合インデックスの場合も含め、カーディナリティが高い（簡単に言うと、一撃でグッと絞り込める）ところに張ります。なので、**レコード有効フラグ的なところに張るのは基本的に効果が低い**です。

## 4. PHPのチューニング（工数：数時間〜）
遅いTransactionsとして見つかったものに対し、処理ロジックを改善していきます。見つかった後のコレは普通の話なので省略します。

# あとがき
費用対効果が高めで、出来ていなそうなポイントを並べています。なので、リリース前のチェックシートとして使うのは推奨しません。

## 参考になりそうな記事
詳解 NewRelic で監視＆性能改善〜その１
http://qiita.com/wapa5pow/items/e3ef018af270cc2ad014

AWS CloudFrontで極力キャッシュさせたくない時の話
http://qiita.com/shogomuranushi/items/a2367350ea54a8f41257

MySQLクエリパフォーマンス改善簡易まとめ
http://qiita.com/pekimoche/items/6a5d771d41168e9b738d

カーディナリティについてまとめてみた
http://qiita.com/soyanchu/items/034be19a2e3cb87b2efb
CS-Cart: デバッグ用にメールの送信先を固定する

CS-Cartで開発時や検証時に、CS-Cartから送信されるメールを一箇所に送りたいことがある。ここではその実現方法を紹介する。

前提として、CS-CartのPHPフックを使うので、適当なAddonを作っておく。

## 使うフック

```php:init.php
fn_register_hooks(
    'send_mail_pre'
);
```

## フック関数の実装

```php:func.php
/**
 * @param $mailer
 * @param $params
 * @param $area
 * @param $lang_code
 */
function fn_{アドオンID}_send_mail_pre($mailer, &$params, $area, $lang_code)
{
    $debugEmails = Registry::get('config.debug_email_to');

    if ($debugEmails === null or $debugEmails === []) {
        return; // デバッグモードではない場合
    }

    if (array_key_exists('to', $params)) {
        $params['to'] = $debugEmails;
    }
    if (array_key_exists('cc', $params)) {
        unset($params['cc']);
    }
}
```

## 送信先固定はconfig.local.phpに定義する

```php:config.local.php
// メール送信先固定設定(コメントアウトすると固定解除)
$config['debug_email_to'] = [
    'debug@example.com',
];
```

もしくは、`local_conf.php`に定義する。

```php:local_conf.php
if ($_SERVER['SERVER_NAME'] === 'localhost') {
    // メール送信先固定設定
    $config['debug_email_to'] = [
        'developer@example.com',
    ];
}
```

## 送信先固定が効いているかを管理画面で確認できるようにする

ディスパッチのフックに噛んで、通知を表示する。

```php:init.php
fn_register_hooks(
    'send_mail_pre',
    'before_dispatch'
);
```

```php:func.php
function fn_myaddon_before_dispatch($controller, $mode, $action, $dispatch_extra, $area)
{
    fn_myaddon_warn_email_debug_mode();

    if ($controller === 'index' and $area === 'A') {
        fn_myaddon_info_email_debug_mode();
    }
}


function fn_myaddon_warn_email_debug_mode()
{
    $isDebugMode = defined('DEBUG_MODE') and DEBUG_MODE === true;

    if ($isDebugMode and fn_myaddon_is_email_debug_mode() === false) {
        fn_set_notification('E', "警告", "全てのメール通知は実ユーザに送信されてしまいます。local_conf.phpに`debug_email_to`を設定し、メール送信先を固定してください。");
    }
}

function fn_myaddon_info_email_debug_mode()
{
    $debugEmails = Registry::get('config.debug_email_to');
    if (fn_myaddon_is_email_debug_mode()) {
        $filename = defined('DEBUG_MODE') ? 'local_conf.php' : 'config.local.php';
        fn_set_notification('W', "検証モード", sprintf('メール送信検証のため、全てのメール通知は%sに固定送信されます。この設定を変更するには %s の `debug_email_to` を変更してください。', json_encode($debugEmails), $filename));
    }
}

function fn_myaddon_is_email_debug_mode()
{
    $debugEmails = Registry::get('config.debug_email_to');
    if ($debugEmails === null or $debugEmails === []) {
        return false;
    }
    return true;
}
```
SourceTree > ターミナル > エクスプローラのフォルダに移動 > No such file or directory > 円マークをスラッシュに変更する

```txt:動作確認
Source Tree version 1.6.22.0 on Windows 7pro
```

##症状

SourceTreeのターミナルから任意のフォルダに移動したい。

エクスプローラで表示中のフォルダへ移動するには、SourceTreeではなくコマンドプロンプトでは以下でできる。

1. コマンドプロンプト立ち上げ
2. `cd ` と入力 (dの後にスペース付き)
3. エクスプローラのフォルダ欄から黄色のフォルダアイコンをコマンドプロンプトにドラッグ
4. コマンドプロンプトでReturnを入力

同じことをSourceTreeのターミナルで行うと、以下のエラーが出る。

> sh: cd: [フォルダ]: No such file or directory

##対応

3で追加されたフォルダの区切り文字を円マークからスラッシュに変更して実行する

`cd C:\Users\[ユーザ名]`
ではなく
`cd C:/Users/[ユーザ名]`

うまく移動したかは
`pwd`を実行して確認する
デフォルト設定でできる vim のコピペ色々

こんにちは！ACCESS の近藤です。

前回担当日は 0:00 に自動投稿になるよう焦って下書きに突っ込むくらいの気概がありましたが、
他のメンバーの投稿時間を見て、あっ、0:00 じゃなくても良いんか。と気づいてからはもうこの余裕ですよ。
寝坊したけど間に合ってしまうと、次からデフォルトになるアレですね。。

というわけで、今回は デフォルト設定でできる vim のコピペ色々です。

もう4年くらい前になりますが、
Linux + vim の世界に足を踏み入れた時に一番困ったのがコピペでした。

御存知の通りターミナル上で動作する vim は GUI アプリケーションのエディタとは異なり、
気軽にマウスでえいやっ！とやると、意味不明な動きをして大惨事になったりします。

今回は、あれこれいじらずデフォルト設定でも、それなりに使えるコピペ方法についてまとめてみます。

## ヤンクとペースト

最も一般的なコピペはこれで、vim で作業をしている際に最も使う方法だと思います。

```vim:ノーマルモード
yy " など色々
p
```

ヤンクする色々な方法は、ググれば詳しい情報はたくさん見つけることができると思いますので、
ここでは、説明は省略させていただきます。

### 別ターミナル上の vim からコピペ

```vim:コマンドモード(コピー元vim)
yy "ヤンクしておきます
:wv
```

```vim:コマンドモード(ペースト先vim)
:rv!
p "ペースト！
```

さて、恐らくヤンクとペーストを覚えてすぐ不便だと感じるのは、
別のターミナルで開いている vim でヤンクした文字列をペーストできないことだと思います。

男は黙って vim フルスクリーン！！と、
心の中で思ったなら、その時既に行動が終了しているレベルに達するまでの間は、
複数ターミナル上で vim 開いてコピペしたいという場面は多いと思います。

こういう場合は :wv, :rv で .viminfo を介してレジスタの読み書きを行うのが便利です。
　
### 最後にヤンクした文字列をペースト

```vim:ノーマルモード
"0p
```

せっかくヤンクしたのに、x とか dd とかで少し削ったら消えるやんけ！
という悩みもありがちだと思いますが、カットでは 0番レジスタには書き込まれないため上記のコマンドでペーストできます。

また、頻繁に打つのはかったるいコマンドなので、好みにもよると思いますが、
p を "0p にバインドしてしまうのもありかと思います。

## マウスでコピペ

通常の GUI のエディタになれ親しんだ人からすると、
マウスを使ってコピペするのは軟ｊ…ではなく、自然な発想です。

例えば、豪傑でもブラウザからサンプルコードをコピペしたり、
仮想環境であれば、ホストOS上でコピーした内容をペーストしたりといったことはよくあると思います。

が、マウスを使って vim にペーストする場合は結構癖がありますので注意が必要です。
ここでは、下記2つの方法をご紹介します。

### インサートモードからペーストする

```vim:ノーマルモードから開始
:nosi (あるいは :noai)
i
マウスでペースト
:si (あるいは :si)
```

まず、大抵の場合オートインデントが設定されていると思いますので、これを一時的に解除します。
これをしないとインデントが大幅に崩れてしまうためです。

次に、インサートモードからペーストする必要がある点に注意です。

vim のノーマルモードでマウスからペーストすると、
ペーストした文字列をノーマルモードで入力したコマンドとして解釈されるため、
文字列によって割りと凄惨なことになります。undo も大変…。

その後、一時的に解除したオートインデントを元に戻してあげます。

### コマンドモードからペーストする

```vim:ノーマルモードから開始
:a!
マウスでペースト
改行
ESC
```

こっちが簡単なのでオススメです。
コマンドモード上で文字列が入力され、ESC を押した時点でテキストに反映されます。
最後に改行がない行 (EOF で終わっている行) はペーストされないので、その点は注意が必要です。

## 動作確認環境

雑ですみませんが…、このへんで動くことは確認しています。
真新しいことは何もしていないので、それ以前の古い環境でもそれなりに動くと思います。

* Ubuntu 12.04 以降
    * デフォルトのターミナル
    * デフォルトの vim 以降

* Mac OS X Mountain Lion 以降
    * デフォルトのターミナル
    * デフォルトの vim 以降

## あとがき

やはり、文字だけだとわかりづらいですね…。
よく vim のコマンドやプラグインを紹介されている記事だと gif アニメ等でわかりやすく紹介されているので、
真似してみようと思っていましたが、案の定この体たらくです。すみません。

さて、明日の取りを飾るのは
@aKatsuhiroMihara さんです！

最終日もよろしくお願いします！＼(^o^)／
rubyのバージョンを上げたら rubocop でエラーになって、syntasticでのチェックが走らなくなった


以下のようなエラーが出てsyntasticでのチェックが走らない

```
warning: parser/current is loading parser/ruby22, which recognizes
warning: 2.2.3-compliant syntax, but you are running 2.2.4.
warning: please see https://github.com/whitequark/parser#compatibility-with-ruby-mri.
```

rubocop の github issue を見ると、parser の問題らしいことが判明。

[rubocop doesn't work with ruby version 2.2.4 · Issue #2513 · bbatsov/rubocop](https://github.com/bbatsov/rubocop/issues/2513)



で、 parser の issue 見ると、2.3.0.pre.6 で対応されているっぽい。

[2.2.3-compliant syntax, but you are running 2.2.4 · Issue #231 · whitequark/parser](https://github.com/whitequark/parser/issues/231)

なので、parser のバージョンを v 2.3.0.pre.6 にしてみる。

```
$ gem install parser -v 2.3.0.pre.6
```

試しに --version で表示してみる。

```
$ rubocop --version
0.35.1
```

以上で解決。

##参考

[Syntastic + Rubocop + Ruby2.1.2で上手く動かないので対処した - Qiita](http://qiita.com/ka2n/items/55a435c10a240ea5d434)
並列に実行している非同期処理(Promise)で最後に実行したやつだけresolvedにする

例えば、サーバー上のリソースをajaxで引っ張ってきて、その結果をビューに反映するようなコードを書いたとします。雑に書くと以下の様な感じで。

```js
fetch('/api/items/1').then(render);
fetch('/api/items/2').then(render);
```

`/api/items/1`、 `/api/items/2`はどちらが先に返ってくるかは保証されないですね。後のほうが先に返ってくると、多分想定とは違う結果になるかと思います。

そこで、実行回数をカウントしておいて、resolvedになったとき記録しておいたカウント数と比較して一致したときは最後に実行したものなのでそのまま後ろに流す、違ったらrejectするという層を作ります。

```js
var latest = (() => {
  var ids = {};

  return key => {
    ids[key] = ids[key] || 0;
    var id = ++ids[key];
    return x => id === ids[key] ? x : Promise.reject(new Error('old promise!'));
  };
})();
```

これで並列に最後に実行した非同期処理のなかで最後に実行したやつだけresolvedになります、めでたし。

```js
var sleep = t => new Promise(resolve => setTimeout(() => resolve(t), t));
var log = console.log.bind(console);
var error = console.error.bind(console);

sleep(100).then(latest('a')).then(log, error);
sleep(200).then(latest('a')).then(log, error);
sleep(300).then(latest('a')).then(log, error);
sleep(150).then(latest('a')).then(log, error); // resolved
sleep(340).then(latest('b')).then(log, error);
sleep(120).then(latest('b')).then(log, error);
sleep(110).then(latest('b')).then(log, error);
sleep(200).then(latest('b')).then(log, error); // resolved
```
XVim の insert mode をEmacs 風にする

XVim は便利なんだけど、入力は Emacs の方が慣れているので ``C-e`` ``C-n`` ``C-p`` をEmacs風にマッピングする。

insert mode で ``C-o`` をするとワンアクションだけ normal mode になるらしいので、それを利用する。 というのは XVim の Github にも書いてあった。

```vimrc
inoremap <C-e> <C-o>$
inoremap <C-n> <C-o>j
inoremap <C-p> <C-o>k
```
初めてのhtml,CSS

![image.jpeg](https://qiita-image-store.s3.amazonaws.com/0/106876/6bb3237b-3600-28a5-90d3-6e3548adb133.jpeg)

html,CSSを使って自分がしたいことを考えた結果がこれです。
オナニーする時のサイトってピンク色のはいけいで、遠目から見ても明らかにそういうサイトだってバレちゃうので、紳士的カラーのサイトを作ってみた感じです。
SESってもう辞めない？

この日を書くと言っていた人にも逃げられたので、埋めておきます。

フリーランスの仕事で時々出会うのが、SES。
何の省略かは忘れたけど、要は、エンジニアを短期間に準委任契約で派遣するお仕事。

今まで何度かSESの仕事も経験したけど、お互いが疲弊するだけで、何の実りも無いので
そろそろこの日本の業界の悪しき慣習を辞めませんか？っていう話。

# 人を大量に投入すればプロジェクトがうまく行くとは限らない

プロジェクトがうまくいかない。

⇒プロジェクトメンバーが足りない。
⇒プロジェクトの計画自体に無理がある。
⇒プロジェクトメンバーのスキルが足りない。
⇒プロジェクトの予算が足りない。

世間で問題のあるプロジェクトの８割方が、上記の理由でプロジェクトがうまく回らず、頓挫する。

ここで、よくあるのが、どっかのコンサルが「自動化ツールを導入すれば」とか
「高スキルの上級エンジニアを追加アサインすれば」とか言い出して、混乱に拍車がかかったりする。

超高額なツールを導入したり、人員を増やしたりすれば、一見プロジェクトが成功するように見えますが、全てはまやかしです。

結局、高額なツールを導入したら、プロジェクトの原価が上がってしまって利益が出なかったり、
単価が高額な人員を追加しても、その人員が契約を終了してしまうと、プロジェクトメンバー全体の
スキルは元に戻ってしまう。
まあ、一番利益を上げたのは、高額なツールを販売した会社と、単価が高額な人員を連れてきた人材派遣会社だけ。

プロジェクトリーダーやマネージャーが本質的にプロジェクトを改善しないと、こんな残念な結果になってしまいます。

# じゃあSESはなぜ悪い？

一見、足りない人員を補充したり、プロパーで賄えなかったプロジェクトメンバーを揃えたりするので、
良い仕組みだと見えますが。

人材派遣会社の中抜きが結構えげつないので、たとえ月６０万円をエンジニアが貰っていたとしても、
人材派遣会社はそのエンジニアを紹介するだけで１０万〜２０万円を毎月売上が上がるわけです。

仕事を発注している会社から見れば、このエンジニアは月８０万円支払っているのに、
このエンジニアは６０万円分の仕事しかしない。なんてことを思われていたり。

SESは契約が終了すればそれで終了なので、発注元の会社に指示された納品物以外を納める必要は無く、プロジェクトが成功しようがしないが、全く関係ありません。

発注元とエンジニアのお互いがお金と時間を疲弊して、得られる成果ってお金以外ほとんどありません。
なぜならば、スキルに関しては人材紹介時点ですでに持っているスキルのみ評価されるわけで、
派遣先でスキル向上をさせてくれるわけでは無いのです。

# で・・・

まあ、エンジニア全員がどこかの社員になることは必要ない訳で、人材派遣のSESより、
フリーランスのエンジニアと業務委託契約を直接結ぶというので良いのでは？

しかし、業界の長い慣習や、ある程度のスキルセットを持った（持ったように見せる）エンジニアを
雇っただけで、社外にSES派遣させて簡単に売上になる商売が出来るので、SESは無くならないと思います。

ただ、業界として長期的な視野で見たとき、エンジニアとしての待遇をもっと向上させたり、
SES派遣という不安定な待遇でエンジニアを疲弊させることが良いことなのか、考えるべきだと思うんですよ。

特に、昔からのSIerは今更商売を変えることは出来ないので、これからのスタートアップ企業やこれから起業する人達は、SES派遣から縁を切ることを心がけても良いのでは？
これからの若いエンジニアのためにもね。

でもね、フリーランスのエンジニアって言っている人達の半数は、SES派遣でお金を稼いでいるのも事実なんですけどね。
まあ、自分は表向きは「辞めよう」って言っていきますけど、お金が必要なときはSES派遣で働かざるえないと思います。
git管理対象のファイルを暗号化して利用する


一部のファイルのみ暗号化した状態でgit管理したい要件があったのでメモ

ほとんどこちらを参考にしています。
https://gist.github.com/shadowhand/873637


## フィルタ処理用のファイルを作成する。
```
$ mkdir ~/.gitencrypt  
$ cd !$
$ touch clean_filter_openssl smudge_filter_openssl diff_filter_openssl  
$ chmod 755 *  
```

### 各ファイルの中身
\<your-passphrase\>は適宜書き換えること
※確認でアップロードしたリポジトリはpass:\<your-passphrase\>のままで実行しています。

```bash:clean_filter_openssl
#!/bin/bash
PASS_FIXED='pass:<your-passphrase>'
SALT_FIXED='XXXXX'
openssl enc -base64 -aes-256-cbc -pass $PASS_FIXED -S $SALT_FIXED
```
※2016/01/14 -saltを追加
単なる暗号化だけであれば自動でランダムなsaltにしてくれるので-S指定は不要だけど、-Sがないと新規にcheckoutした場合やindexを作り直した際にdiffはないのにmodifiedな状態になってしまうので、saltを固定しておいたほうがよさそう。


```bash:smudge_filter_openssl
#!/bin/bash
PASS_FIXED='pass:<your-passphrase>'
openssl enc -d -base64 -aes-256-cbc -pass $PASS_FIXED 2> /dev/null || cat
```


```bash:diff_filter_openssl
#!/bin/bash
PASS_FIXED='pass:<your-passphrase>'
openssl enc -d -base64 -aes-256-cbc -pass $PASS_FIXED -in "$1" 2> /dev/null || cat "$1"
```

[^1]: 関係ないけど!$で直前のコマンドの最後の引数を利用できることを初めて知った

## フィルタ適用対象の設定を行う
今回は encrypy/*.yml というパターンにマッチするファイルに対して、checkin/checkout時とdiff時に
opensslフィルタを利用する設定をします。

```
cd \<repository\>  
touch .gitattributes  
echo 'encrypt/*.yml filter=openssl diff=openssl' >> .gitattributes
```
[^2]: フォーマットは "ファイル名パターン 属性1 属性2 ..."。 詳しくは[gitattributes](http://git-scm.com/docs/gitattributes)を参照

## gitconfigにフィルタの設定をする
```
cd \<repository\>  
git config --add merge.renormalize true
git config --add filter.openssl.smudge ~/.gitencrypt/smudge_filter_openssl  
git config --add filter.openssl.clean ~/.gitencrypt/clean_filter_openssl  
git config --add diff.openssl.textconv ~/.gitencrypt/diff_filter_openssl  
```

[^3]: マージする時にフィルタ適用後にマージするための設定

## 確認する
上記をて起用してpushしたリポジトリを作成してpushしておく。

cloneすると暗号化されたままの状態でワーキングツリーにチェックアウトされる。

```
$ git clone https://github.com/ikeisuke/encrypted-sample  
$ cd encrypted-sample  
$ cat encrypt/encrypt.yml  
U2FsdGVkX1/Sw8ihiaafq7xpSrWqAWMSBXLexo8gw7Ciho2GRvcaF0f9uV12SwhE
```

フィルタ設定はリポジトリローカルの設定だったので、フィルタが適用されていない。
再度git configコマンドを利用してフィルタを追加する。

```
$ git config --add merge.renormalize true
$ git config --add filter.openssl.smudge ~/.gitencrypt/smudge_filter_openssl  
$ git config --add filter.openssl.clean ~/.gitencrypt/clean_filter_openssl  
$ git config --add diff.openssl.textconv ~/.gitencrypt/diff_filter_openssl  
```

git reset --hardでワーキングツリーをリセットすると暗号化解除されたファイルに書きかわる。

```
$ git reset --hard  
$ cat encrypt/encrypt.yml  
encrypted:
  - yml
  - encrypt
```
Java IceCreamProject




▪️IceCreamFlavor.java

```java
enum IceCreamFlavor {
	HAZELNUT("Hazelnut", 300), WHIPPEDCREAM("WhippedCream", 270), ALMOND("Almond", 370), OREOCOOKIECRUMBLES("OreoCookieCrumbles",
			500), MARSHMALLOWS("Marshmallows", 420);

	public String name;
	public int price;

	private IceCreamFlavor(String name, int price) {
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public int getPrice() {
		return price;
	}

}
```

▪️Customer.java

```java
public class Customer {
	public IceCreamFlavor icecream;
	// public String IceCreamFlavor,name;
	public int price;
	public IceCreamFlavor HAZELNUT;
	public IceCreamFlavor WHIPPEDCREAM;
	public IceCreamFlavor ALMOND;
	public IceCreamFlavor MARSHMALLOWS;

	Customer(IceCreamFlavor icecream) {
		this.icecream = icecream;
	}

	public String getName(IceCreamFlavor icecream) {
		IceCreamFlavor.getName();
	}

	public int getPrice() {
		return price;
	}
	
	public IceCreamFlavor buy() {
		return this.icecream = icecream;
		
	}
}
```

▪️IceCreamShopMain.java

```java
public class IceCreamShopMain {
	public static void main(String[] args) {
		IceCreamFlavor icecream = new IceCreamFlavor();
		System.out.println("IceCreamFlavor.HAZELNUT.getName() + "The price of ice-cream is " + IceCreamFlavor.HAZELNUT.getPrice() + "dollars.");
		Customer c = new Customer(IceCreamFlavor.WHIPPEDCREAM);
		System.out.println("c bought " + c.getName() + "ice(" + c.getPrice() + "dollars)");
		c.buy();
	}
}
```
[参考になるおすすめページ](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13153939553)
Cxx.jl を動作させるための julia, llvm, clang, lldb のコミットハッシュ

[Cxx.jl を使ってみた感想 + OpenCV.jl, Libfreenect2.jl の紹介 - LESS IS MORE](http://r9y9.github.io/blog/2015/12/22/cxx-jl/) で紹介した、Cxx.jl を動作させるための各種依存関係のコミットハッシュを書いておきます。

時間が立つと価値のない記事になるので、お気をつけください。メモ代わりです。

## コミットハッシュを出力するだけのシェル

```bash
#!/bin/bash

cmd="git rev-parse --short HEAD"

JULIA_HOME=~/julia

for dir in $JULIA_HOME \
               $JULIA_HOME/deps/srccache/llvm-svn \
               $JULIA_HOME/deps/srccache/llvm-svn/tools/clang \
               $JULIA_HOME/deps/srccache/llvm-svn/tools/lldb \
               $JULIA_HOME/deps/srccache/llvm-svn/projects/compiler-rt \
               ~/.julia/v0.5/Cxx
do
    cd $dir 2&>1 /dev/null
    echo -n "$(basename $dir): "
    $cmd
    cd - 2&>1 /dev/null
done
```

## 実行結果

```
julia: 5393150
llvm-svn: 4ec69ea
clang: 30f5c21
lldb: edfa1f7
compiler-rt: fa33ffc
Cxx: ff0bec6
```

Julia, Cxx.jl ともに現在の最新ではありませんが、上記コミットにチェックアウトすれば、きっと動くと思います。
電子工作 > リレータッチボード > 動作確認 (EN入力電圧が3.3Vでの動作) > 動いた

リレータッチボードの動作試験

関連 http://qiita.com/7of9/items/9184a14182235d5feb96

<font color=red>免責: 以下でやっていることはデータシート記載の本来の使い方ではないため、故障の原因になるかもしれません。同じことをされたことによる故障の責任は負いかねます。</font>

ENへの入力が3.3V程度でもリレー駆動できるか。

## try1 (RPi2にて3.3VでEN印加)

ESP-8266での動作確認が目的だが、5V電源作るのが別作業が必要なので、第一段階としてはRPi2で確認してみる。

RPi2のGPIO配置。

https://ms-iot.github.io/content/en-US/win10/samples/PinMappingsRPi2.htm

使うのは以下のあたりが配置的にわかりやすいので、この線処理をした。

- ピン2 : 5V
- ピン6 : GND
- ピン12 : GPIO 18


### pythonコード

```relayTouchBoard.py
#!/usr/bin/env python

'''
v0.1 2015/12/24
  - add main routine
'''

import RPi.GPIO as GPIO
import time
import os

swio=12
GPIO.setmode(GPIO.BOARD)
GPIO.setup(swio, GPIO.OUT)

while True:
	GPIO.output(swio, True);
	time.sleep(0.1)
	GPIO.output(swio, False);
	time.sleep(2.0)
```

### Unityアプリ

リレーが動作した時の確認のためUnityのソフトを用意した。

といっても、大きなチェックボックスを置いただけ。

置き方は過去に調べた方法を行った。
http://qiita.com/7of9/items/26fa124f49722ca8c63f

チェックボックスのサイズは以下とした。

- Background
  - Width: 550 / Height: 550
- Checkmark
  - Width: 500 / Height: 500

### リレーの動作確認

pythonコードをRPi2にて実行。
`time.sleep(0.1)`の部分を`time.sleep(2.0)`にしてデジボルによりピン12の電圧を見たところ、交互に0Vと3.225Vが出力されていた。

### 実行

動画で録画したが、変換やサイズ縮小が面倒だったので、画像にした。

以下が実行の結果。

- 0秒後の状態

![qiita_sec00.png](https://qiita-image-store.s3.amazonaws.com/0/32870/589215d2-4ab0-ff81-f0f6-aeb499258e18.png)

- 2秒後の状態

![qiita_sec02.png](https://qiita-image-store.s3.amazonaws.com/0/32870/623f2615-9593-a9ce-a8b0-61d37429e133.png)

- 4秒後の状態

![qiita_sec04.png](https://qiita-image-store.s3.amazonaws.com/0/32870/d0ae3837-9dd5-1eef-eaba-8b9e6084088b.png)

### 動いた
カチカチ音がしながらリレーが切り替わっている状態となった。

あとは、よい粘着方法を見つけること。

リレーのタイミングを0.1秒と2.0秒のスリープにしたが、このあたりは2.0秒だけでいいのか理解が浅い。

### 謝辞

@qa65000 さん
3.3Vでは動きました。感謝。


## try2 抵抗分圧した

上記の構成に加えて、ブレッドボードと10kの抵抗を使って分圧することにより、3.3V以下の電圧での印加を試した。

ENの印加電圧をデジボルで計測（デジボル: KU-2600)。

リレータッチボード(以下「ボード」と記載)接続時と未接続で電圧の安定度が異なった。

### 分圧なし (3.3VでのEN印加)

- ボード未接続 : 3.225Vで安定
- ボード接続時 : 3.225Vで安定

### 1/2分圧 (1.64VでのEN印加)

抵抗２つで1/2に分圧

- ボード未接続 : 1.64Vで安定
- ボード接続時 : 2.2Vになり、すぐに0.8Vに落ちた

### 2/3分圧 (2.2VでのEN印加)

抵抗３つで2/3に分圧

- ボード未接続 : 2.2Vで安定
- ボード接続時 : 2.4Vになり、すぐに0.9Vに落ちた

### 低い電圧でのEN印加について

現時点の僕の知識では上記の結果はよくわらかない。

電圧低い時に突入電流が大きくなってしまうのだろうか？

バイポーラトランジスタの静特性や動特性の勉強をもっとしたほうがよさそうだ。

(追記 2016/01/03)
DC-DCコンバータを使った時、出力電流以上の使用電流になった時に電圧が落ちる現象を経験したのを思い出した。これと同じようなことが起きているのだろうか。
半可通がつくる家庭内LAN　無線LAN編

[ネットワーク生半可厨が作る家庭内LAN](http://qiita.com/e_bot/items/cb45a33b789e7b2911d6) の続き

まぁタイトル通りなんだけど実際のところはそんな難しい話じゃない
前のエントリーのRTX1200をつかった半可通の家庭内LANの設定の続き
ぶっちゃけチラ裏に近いのでQiitaに書くべきか悩んだけど変にハマる人は嵌りそうなのでこちらに

ってか、設定で詰まったんじゃない、装置の仕様がわからなくて調べ結果別に調べることが杞憂だったというお話

##Buffaloというメーカのネットワーク機材
かつては日本総研やNetGear・Planexのルータ　まぁ安物の最たるものという意味ではCoregaのルータなんかってイメージだったんだけど、昨今ではISPが配布しているものって言うと、このBuffaloかNECあたりのAtermって感じがする。特に一般家庭向けには。
Yahoo!BBってどこのルータ使ってるんだっけか？

個人的には実のところそう嫌いなルータじゃない
無線APが一体化してついてくれるしNATの設定もIPマスカレード・ポートフォワードも一律設定可能　GUI（Web画面）で・・・・


そう　GUIで設定なのだ
SSHとは言わないtelnetでもいいのでなぜCUIで設定させてくれないのかｗコンソールはまぁ諦めてるんだけど。え？Pro買えばいいじゃないかうんそのとおりだ

##ブリッジモードとAPモード
そもそもこれが一緒こたにされているのが今回ググりまくって時間を無駄にした理由。
以前はこれ、分かれてたんだよね。俺が今使っている安物の無線LANルーターWHR-1166DHP2の場合背面スイッチで切り替えられるのは「ROUTER」モードと「BRIDGE」モードのみ　APモードないなぁ・・・・

もう一つは「無線Hub」って機能の存在。こいつが更に理解をややこしくさせているｗ。いやまぁ普通に使う分には便利なんだと思うよ。距離に関しては電源確保さえできればネットワークケーブルの配置関係なくWifiの距離を稼ぐことができるんだから（そこかわり通信帯域は半分になるわけだけど）

まぁ結論から書けば「物理的な手順」をちゃんと踏んでやれば
Bufflaloの無線LANルータはブリッジモードでただの無線LAN-APとして使用できる

###「ブリッジモード」とは、
アクセスポイントモード、ハブモード、無線ハブモード、APモード、BRモード、ルータOFFモードなど、様々な呼び名があるが、ブロードバンドルータの無線LAN機能（Wi-Fi機能）以外のルータ機能をOFFにして、無線電波を飛ばすだけの機器（HUB）として利用することを指す。ルータにはインターネット接続機能、DHCP機能、NAT/NAPTなど様々な機能が搭載されているが、こういった各種機能を無効化して、無線電波を発するただの箱として動作させることを言う。

らしい、言葉をひと纏めにしたからってわかりやすくなるとは限らなくなる例

###ま、そんなわけで設定
くどくど上で文句を書いたけど、とりあえずすでにRTX1200導入前にはこいつがメインのネット回線につながっているルータ&無線Wifiの親だった訳。
なので、移行は実は10分で出来た（が2分では多分できなかった）

手順は以下のとおり

 - WHR-1166DHP2/Nに刺さっているケーブルを電源含め全て外して5分ほど待ちます（重要）
 -  本体背面（ポートなんかがある面）の最上部にある「ROUTER/BRIDGE」 のスイッチをBRIDGEに切り替えます
 - 本体のWANポートとルータ（今回はRTX1200）のポートを接続します。
 - 普通に無線でWHR-1166DHP2/Nに接続します
 - おめでとう　うまく繋がっていればWHR-1166DHP2/Nには192.168.XX.100が割り振られているはずです
 - 望み通りのIPに切り替えて再起動してあげれば立派に無線APとして利用できます。もちろん以前の無線のSSID設定はそのまま残っています。
 
 ハマったのはまぁ、このBRIDGEモード＝APモードだて確証を得るために調べまくった時間が随分かかったためｗ
 あと、もう一点電源を入れたまま接続方法を上記のとおりにして本体の再起動をかけてもBRIDGEモードにうまく切り替わってくれなかった点。エアステーション接続ツールが使いたくない環境だったのでついついWeb-UI画面から操作しようとしてしまったんですよね。
 
APモードってのが実はマスクされてるけど存在していて、ルータモードのまま接続したら自動で切り替わるのか？とかなんかいらない想像をして変なことをいろいろしてしまいました。素直にはなっから本当に素直に電源切ってスイッチ切り替えてケーブル挿し直せばよかったのです。

##教訓
__「間抜けは何をやっても間抜け」__

しかしこうやって使うと、WHR-1166DHP2/Nはなかなかに優秀です。ちょっと迷いはしましたが\10kオーバーのビーム昨日使える上位機種の導入も考えていたんですがこっちにして結果的に良かったと思えますな、、、、ゲストポート機能・・・・・・あれ？ゲスト用のVLAN要らんかったんや・・・・
Chrome 拡張機能開発 Jquery で挿入したタグが click() できない

# Chrome 拡張機能開発 Jquery で DOM 操作し挿入したタグが click() できない！
今回は完全に自身でも納得行かず、知識不足による問題無気がしてならないのですが、
唸ってた問題が、一つの切り替えでさくっと解決してしまったので、

どなたかの役に立てればと思ったのと、ハイレベルな方にもしかしたら
助言をいただけるかもしれない？という甘い考えもありつつ投稿させていただきます。


## 目的
DOMに以下のようなリンクが複数あり、全て同じ`close`というクラス名なので、
それらを全て読み込み終了段階で、自動クリックし、`onclick`のjsを実行させたい。

```html:target_page.html

<!-- この要素たちを自動クリックしたい -->
<a id="originID1" class="close" href="javascript:void(0);" onclick="closeRegion('originID1');">エリア1 閉じる</a>
<a id="originID2" class="close" href="javascript:void(0);" onclick="closeRegion('originID2');">エリア2 閉じる</a>
<a id="originID3" class="close" href="javascript:void(0);" onclick="closeRegion('originID3');">エリア3 閉じる</a>
<a id="originID4" class="close" href="javascript:void(0);" onclick="closeRegion('originID4');">エリア4 閉じる</a>

```


## 試行錯誤
コンソールで `$('.close').click();`とコマンドを打ち込むときちんとクリックされるのに、
いざ拡張機能に組み込むと、なぜかクリックしてくれない・・・・苦戦しました。
#### ダメだったこと
1. `setTimeout`で実行を遅らせる →　かなり遅くしても不可
2. 一個一個、個別でid指定して、クリックのコードを書いても不可

#### 解決のきっかけ
以下のコードで、全`.close`の`onclick`の値を集め、
別目的用として、拡張機能のJqueryで挿入していた`a`要素に、
`onclick`としと組み込んでみると・・・ちゃんとクリックされて、
思い通りに実行された！・・・・が、しかし

```html:my_extesiont_tag
<!-- jqueryで挿入していた、タグ -->
<a href="javascript:void(0);"><div class="cogTab"><i class="fa fa-cogs"></i></div></a>

```


```js:main1.js


var onclickValues;
$('.close').each(function(i, e){
  onclickValues += $(e).attr('onclick');
});
// a にクラス名を指定していなかったため、子要素から親の a を辿って設定。
$('div.cogTab').parent().attr('onclick', onclickValues);
$('div.cogTab').click(); // 実行できた！


```


## きちんと作りなおし

以下のように、別に専用の要素を作って 同様にjqueryで挿入、
`click()`させようとすると再びできない。
手動でクリックすると、やはり実行される。


```js:main2.js


var onclickValues;
$('.close').each(function(i, e){
  onclickValues += $(e).attr('onclick');
});
// a タグを新たに作成し、それにかき集めた、関数を`onclick`設定
$('body').append('<a class="allCloser" href="javascript:void(0);"><div class="allCloserDiv">閉じる</div></a>' );

var linkTag = $('a.allCloser').attr('onclick', onclickValues);
$('a.allCloser').click(); // 実行できない・・・
// 手動でクリックしたり、デペロッパーツールのコンソールに同様のコード入力すると、実行される
```

##  click() 指定する対象の選択に問題があった
いろいろ位置を変えたり、また実行タイミングを遅らせたり、
更に別の要素の`click`イベントに`$('a.allCloser').click();`仕込んでみたりと
わけのわからない方向へ進んでいました。

しかし、別のタグに設定してうまく行った時のことを考えてみると、
同じようにしていないことに気づきました。



```js:mytest.js

// これでうまく行った時は、aタグの中の子要素をクリック対象にしている。
$('div.cogTab').parent().attr('onclick', onclickValues);
$('div.cogTab').click(); // 実行できた！

// この時は子要素ではなく、aタグ自体をクリックしている。
var linkTag = $('a.allCloser').attr('onclick', onclickValues);
$('a.allCloser').click(); // 実行できない・・・


```

## 解決
思った通り、以下のように中の要素をクリックするように指定すれば、うまくいきました。

a タグ自体をクリックするのではなく、
リンクに内包した要素を作り、それをクリックすると堅いようです。


```js:main3.js


var onclickValues;
$('.close').each(function(i, e){
  onclickValues += $(e).attr('onclick');
});
// a タグを新たに作成し、かき集めた関数を`onclick`設定
$('body').append('<a class="allCloser" href="javascript:void(0);"><div class="allCloserDiv">閉じる</div></a>' );

var linkTag = $('a.allCloser').attr('onclick', onclickValues);
$('div.allCloserDiv').click(); // 実行できた！！
```

今回はこれにて
めでたしめでたし
°。。(´-ω-｀)ﾃﾂﾔﾃﾞﾈﾑﾈﾑ

## 最後に
最後までお読み頂きありがとうございました。

以上、大した内容ではございませんが、かなり時間浪費したので、
備忘録も兼ねて投稿させていただきました。

ご指摘ございましたら、遠慮無く頂けましたら幸いです。
フリーランスの１日

ここに書く予定の方に逃げられたので、埋めておきます。

# よくあるフリーランスの１日

・ 7:00：起床。Twitterとメールのチェック
・ 7:30：朝食。簡単なもの。食べない時もある。
・ 8:30：出発。家で仕事しても集中出来ないので、コワーキングスペースに出かける
・ 9:00：コワーキングスペースに入館
・ 9:00：無料のドリンクとともに、メールチェックとWebの巡回、SNSの巡回チェック
・ 9:30：SNSに発言やレスを付ける
・10:00：午前の仕事開始
・13:00：午前終了。お昼休み。500円以下のランチを食べるか買ってくる。
・13:30：寝たり、読書。
・14:00：午後の仕事開始
・18:00：午後の仕事終了
・18:00：休憩と読書とかSNS巡回チェック。レス返し。
・19:00：コワーキングスペース退出。帰宅する。
・19:30：夕食。途中で食べたり。買って帰ったり。
・20:00：風呂。
・21:00：深夜仕事開始
・25:00：仕事終了。寝る。

こんな感じが理想な１日。

# 理想な１日を破綻させられる要因

・顧客からの突発的な障害対応要望（電話やチャットが多い。メールって減りましたね）
・顧客からの見積り、提案の相談（この段階ではお金は払って貰えず、タダ働き）
・顧客との打ち合わせ（だいたい、顧客の会社に出向くことが多いので、交通費こちらもち）
・顧客からの回答待ち（待っている時間も浪費しているんだけどなぁ。。。）

外的要因がこんな感じ。

・設計や予定通り実装しても、バグが治らない。
・事務処理（経費の帳簿付けとか、売上請求。銀行での入金確認）
・営業計画、実装計画を練る。

内的要因がこんな感じ。

・気分が乗らない。
・単に疲労困憊。
・眠い。

どうにもならない要因がこんな感じ。

理想の１日を破綻させられることが多いこと多いこと。しんどいのう。しんどいのう。

まあ、他にも家族がいれば、家族のことに時間を割かないといけないので、
それも考慮すると、**残業代が出ない社畜にはかわらないのねん**。
Mathematica で YouTube 動画を作る（Lorentz 方程式の数値解の可視化）

# はじめに
吉野です．Mathematica でアニメーションを作るのが好きです．その一部は YouTube で公開しています．ここでは，以前に作った Lorentz 方程式の動画の作成手順を解説します． Mathematica で YouTube 動画を作ることがそれほど難しくないと思っていただければ幸いです．

# Lorentz 方程式
Lorentz 方程式はカオスを示すことで有名な方程式です．

```math
\begin{eqnarray*}
\frac{dx}{dt} &=&\sigma (y-x) \\
\frac{dy}{dt} &=& x(\rho-z)-y \\
\frac{dz}{dt} &=& xy-\beta z
\end{eqnarray*}
```

カオスの特徴のひとつに，時間が経過するにつれて初期値の僅かな違いがとても大きな違いになることが挙げられます．

# Mathematica で数値解を求める
パラメータの値を固定して，初期値を指定すれば NDSolve 数値解を求めることができます．

```
lorentzEq = 
 With[{sigma = 10, rho = 28, 
   beta = 8/3}, {x'[t] == sigma (y[t] - x[t]), 
   y'[t] == x [t] (rho - z[t]) - y[t], 
   z'[t] == x[t] y[t] - beta z[t], x[0] == x0, y[0] == y0, 
   z[0] == z0}];
ansLorentz = 
 NDSolve[(lorentzEq /. {x0 -> 1, y0 -> 1, z0 -> 1}), {x, y, z}, {t, 
   0, 50}];
ParametricPlot3D[{x[t], y[t], z[t]} /. ansLorentz, {t, 0, 30}]
```

で，数値解をプロットすることができます．

# 初期値に敏感なことを示したい

「初期値に敏感であることを視覚的に示すには，微妙に異なる初期値についての数値解が十分に時間を経過すると異なる振る舞いをすることを示せばよい」と考えました．数学的にはリヤプノフ指数を使います．そこで，微妙に異なる初期値を20000ほど用意してその数値解を求め，相空間内での軌跡を表示するアニメーションを作成しました．

数値計算は以下のコードで行いました．初期値は， (0, 0, 1) を中心に半径 0.1 の球の中に入るように設定しました．コードは Table で 20000 回の繰り返しを行うだけの簡単なものです．

```
ansList = 
   Table[
    With[{r = RandomReal[{0, 0.1}], theta = RandomReal[{0, 2 Pi}], 
      phi = RandomReal[{0, Pi}]}, 
     NDSolve[(lorentzEq /. {x0 -> 1 + r*Cos[theta]*Sin[phi], 
         y0 -> 1 + r*Sin[theta]*Sin[phi], z0 -> 1 + r*Cos[phi]}), {x, 
       y, z}, {t, 0, 50}]
     ], {20000}]);
```

アニメーションは以下のコードで作成しました．表示に工夫したせいで，完成まではそれなりに時間がかかった記憶があります．でも，それほど難しいことはしていません．

```
grdata = Table[
   Graphics3D[
    Table[Sphere[{x[t], y[t], z[t]}, 0.2] /. ansList[[i]], {i, 
      20000}], PlotRange -> {{-30, 30}, {-30, 30}, {0, 60}}, 
    Boxed -> False, Background -> Black, Lighting -> "Neutral", 
    ImageSize -> 1200], {t, 0, 25, 0.02}];
Export["Lorentz20000-0-25-1240.mov", Take[grdata, 1240]];
```

結果を YouTube にアップロードしています（[こちら](https://youtu.be/6owIHy3U3zQ)からどうぞ）．20000 個の粒子は，はじめのうちは塊になって動いていますが，あるタイミングで細長くなり，最終的には別の動きをすることが確認できます．異なる軌道にあるはずの粒子がストレンジ・アトラクタの形を作るところなどはかなり面白いと思うのですが…．

是非とも Mathematica で数理アニメーションを作って公開してみてください．
ESP8266 > user_interface.h へのリンク / system_adc_read() / system_get_vdd33() / system_restart() / system_get_rtc_time()

https://github.com/esp8266/Arduino/blob/master/tools/sdk/include/user_interface.h

system_adc_read()
以外にも色々ある。

system_get_vdd33()
もあるが、これは上記と排他使用になっていたかもしれない。

void system_restart(void);
リブートできるのか?

uint32 system_get_rtc_time(void);
NSMagnificationGestureRecognizer  ワークアラウンド

# NSMagnificationGestureRecognizer

NSMagnificationGestureRecognizer は OS X の Gesture Recognizer でトラックパッドなどを二本の指でつまんだジェスチャーでズームなどに利用できる。iOS の経験者であれば、UIPinchGestureRecognizer の親戚かと直感的に思うかもしれない。

UIPinchGestureRecognizer　であれば、view の transform を scale プロパティでスケールしてやればいい。

```
// viewController 
func scaleGesture(gesture: UIPinchGestureRecognizer) {
	view.transform = CGAffineTransformScale(self.view.transform, gesture.scale, gesture.scale); 
}

```

NSMagnificationGestureRecognizer で同様なコードを書くと不思議な現象が発生する。なんと、この magnification は 拡大は正、縮小は負とするとんでもない値をプロパティに持つ。確かにドキュメントを見ると、1.0 を加えれば scale factor になるよと書いてある。

> **Declaration**
> `var magnification: CGFloat`
> **Discussion**
> This property contains the current magnification in effect for the gesture. Add the value of this property to 1.0 to get the scale factor to apply to your content.


よって、1.0の場合は、２倍ズームで、2の場合は3倍ズームであるのはいいのだが、問題は縮小（ズームアウト）させたい時だ、半分に縮小させる時は よせばいいのに -1.0 が帰ってくるというわけだ。これでは、まともに `CGAffineTransformScale` とかにそのまま渡すと、上下左右が反転してします。当然、負の値を渡しているからだ…

なので、magnification を scale factor として使いたい場合は

```
let magnification = gesture.magnification
let scaleFactor = (magnification >= 0.0) ? (1.0 + magnification) : 1.0 / (1.0 - magnification)
```

これで、`-1.0` は `0.5`、`-2.0`（三分の一だよ） は `0.3333`という具合に、scale factor として利用できるようになります。


NSMagnificationGestureRecognizer は UIPinchGestureRecognizer の後にできたのだから、改善されているならともかく、改悪されているのはいかがなものか、せめて、UIPinchGesture と同様に scale factor として利用できるようにして欲しかった。
pritunlをubuntu14.04にインストールするメモ

下記は全てrootで実行します

```
sudo su -
echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.0 multiverse" > /etc/apt/sources.list.d/mongodb-org-3.0.list
echo "deb http://repo.pritunl.com/stable/apt trusty main" > /etc/apt/sources.list.d/pritunl.list
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com --recv 7F0CEB10
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com --recv CF8E292A
apt-get --assume-yes update
apt-get --assume-yes upgrade
apt-get --assume-yes install pritunl mongodb-org
service pritunl start
```
windows7にMySQL Workbench 6.3 64bitをインストール時、「MSVCP120.dllが見つからない」エラーが発生

![error.jpg](https://qiita-image-store.s3.amazonaws.com/0/106789/b8543bc8-bc1b-86dd-7453-d55ed03a875e.jpeg)

MySQL Workbenchをアンインストール後、
Microsoft Visual Studio 2013のVisual C++ 再頒布可能パッケージのインストールをして、
MySQL Workbenchを再インストール

無事に起動

### 参考

Device Updaterエラーメッセージ: MSVCP120.dllが見つからない (Windows)
https://www.native-instruments.com/jp/support/knowledge-base/show/2399/device-updater-msvcp120.dll-windows/

MySQL Workbench
https://www-jp.mysql.com/products/workbench/
https://downloads.mysql.com/archives/workbench/
c++ builder XE4, 10.2 Tokyo > TeeChart > 時系列グラフ > 複数日間の表示で日付ラベルの表示間隔を1日ごとにする > Chart1->BottomAxis->Increment = 1;

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
    TeeChart v2016.17.160129 32bit VCL
```

関連
http://qiita.com/7of9/items/707826b7b9dc6fe89d49

Incrementを1にすればいいようだ。

```Unit1.cpp
#include <DateUtils.hpp> // for IncSecond()
...
void __fastcall TForm1::FormShow(TObject *Sender)
{
	Chart1->Series[0]->XValues->DateTime = true;
	Chart1->BottomAxis->DateTimeFormat = L"nn:ss";

	TDateTime startDt = VarToDateTime("2015/12/21 00:00:00");
	TDateTime endDt = VarToDateTime("2015/12/26 00:00:00");
	Chart1->BottomAxis->SetMinMax(startDt, endDt);

	Chart1->BottomAxis->DateTimeFormat = "mm/dd";
	Chart1->BottomAxis->Increment = 1;

	TDateTime dt;

	dt = Now();
	for (int idx=0; idx < 10; idx++) {
		Series1->AddXY(dt, 1+idx, "", clRed);
		dt = IncSecond(dt, 1);
	}

}
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/3d90b210-59d2-4ad0-4a02-e85e1f9b132a.png)
CentOS6.5にdockerを入れて、dockerにUbuntuの最新イメージを乗せてphp7.0.1が動くまでメモ書き

タイトルのようなことをやるときに、結構色々ググったので、備忘用です。
エラったところとかそのまま書いているので冗長ですが、同じようにハマったときのためにそのまま書きます。


# こういう環境を作る

```
・VirtualBoxにCentOS6.5が入っている【前提】
・上記にdockerをインストールする
・dockerにUbuntuのイメージを乗せる（latest＝投稿時点で14.04.3）
・php7.0.1をソースからインストールする
・phpをコマンドラインから実行
```

それでは早速

# dockerを入れる

これは簡単

```bash
# dockerインストール
sudo yum install docker-io

# 起動
sudo service docker start

# chkconfig追加
sudo chkconfig docker on

# ubuntuのイメージを取ってくる
sudo docker pull ubuntu

# 起動
sudo docker run -i -t ubuntu /bin/bash
```

これでとりあえずdockerにUbuntu14.04.3が乗っかりました。

# php入れる準備

まずUbuntuの更新と、必要そうなものを入れておきます

```bash
apt-get update

# lib系は一個でも抜けてると./configureしたときに怒られます
apt-get install wget gcc vim apache2 apache2-dev libxml2-dev libcurl4-openssl-dev libbz2-dev libjpeg-dev libpng-dev libxpm-dev libgmp3-dev libmcrypt-dev libpspell-dev librecode-dev
```

# php7.0.1を入れる

ソースをphpの公式ページから落とします

【公式ページURL】
http://www.php.net/downloads.php

```bash
# ダウンロード
wget -O php-7.0.1.tar.bz2 http://ar2.php.net/get/php-7.0.1.tar.bz2/from/this/mirror

# 解凍
tar -xjvf php-7.0.1.tar.bz2

cd php-7.0.1
```

いよいよビルドしてみる。

```bash
# 一旦最低限必要そうなものだけでビルド
./configure \
> --enable-mbstring \
> --enable-zip \
> --enable-bcmath \
> --enable-ftp \
> --enable-pcntl \
> --enable-exif \
> --enable-calendar \
> --enable-sysvmsg \
> --enable-sysvsem \
> --enable-sysvshm \
> --with-curl \
> --with-mcrypt \
> --with-iconv \
> --with-gmp \
> --with-pspell \
> --with-gd \
> --with-jpeg-dir=/usr \
> --with-png-dir=/usr \
> --with-zlib-dir=/usr \
> --with-xpm-dir=/usr \
> --enable-gd-native-ttf \
> --enable-gd-jis-conv \
> --with-openssl \
> --with-zlib=/usr \
> --with-bz2=/usr \
> --with-recode=/usr \
> --with-apxs2=/usr/bin/apxs

configure: error: Unable to locate gmp.h
```


怒られた(´・ω・｀)

gmp.hが見つけられてないらしいが、インストールはしてるので、探してみる

```bash
find / -name gmp.h

/usr/include/x86_64-linux-gnu/gmp.h
```

やっぱりある様子。
色々調べたら、/usr/include/配下に置く必要があるようなので、リンク貼る

```bash
ln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/
```

もう一回やってみる

```bash
# 引数は省略しているので注意
./configure \

```

今度は成功したっぽいので、引き続きmakeしていく

```bash
make

make install
```

入ったっぽいので確認する。

```bash
php -v

PHP 7.0.1 (cli) (built: Dec 24 2015 02:37:41) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
```

無事7.0.1になっているようで安心！

早速コマンドラインから実行

```bash
php -r "echo 'hallo world' . PHP_EOL;"

hallo world
```

ようやくhallo worldまでたどり着けました。
コミュニケーションが先か、コミュニケーションを促進させるツールの導入が先か

TL;DR: コミュニケーションが先です。

---

コミュニケーションが先か、コミュニケーションを促進させるツールの導入が先かという話をしたいと思います。

コミュニケーションを促進させるツールというのは

- チャットツール (Slack など)
- 社内 Wiki、 社内 SNS、謎の Excel
- その他色々、情報の共有などを目的としたツール

のことです。

「うちの部署(会社)はコミュニケーションが活発じゃないからコミュニケーション促進ツールを導入して活性化させよう！」みたいなことを時々聞きます。

「うちの会社にはメンテされてない wiki があるんですよ」的なこともよく聞きます。

悲しいことにコミュニケーションを活性化させる為に導入したツールが上手く活用されない事があります。

これは目的と手段が入れ替わってしまったためだと思います。

導入したツールを悲しい状態にしないためには、まずコミュニケーションを取る必要性を共有して、全員が納得できる妥協点を探ったうえでそれにあったツールを導入することが大事です。

既にコミュニケーションをとっているが、何らかの制約で上手くコミュニケーションが取れない人(リモート勤務の人とか)がいてその人を補助する為にツールを導入するのであれば速攻でやったほうがいいと思います。


### まとめ

コミュニケーション不全に陥っているのなら

1. まずはコミュニケーションをとる
2. 次にコミュニケーションを活性化させるツールを導入する
3. このツールがあったら絶対便利だわ！ってやつは導入する (さらなる改善)

という手順で改善していくと良いと思います。

1 のコミュニケーションは時間は使うけど初期投資や維持費はかからないのでおすすめです。

ツールの導入は初期投資や維持費もかかる上に時間も使ってしまい、さらに「せっかく導入したから続けよう」といったサンクコスト効果も発生してしまい負のループに入ると最悪ですので気をつけましょう。