OmniAICreator/Qiita-1.07M huggingface dataset:
cmakeを途中で終了させる方法

# やりたいこと
cmakeスクリプト中で問題があった時点で停止させたい。


# 結論
`message`関数の引数に`FATAL_ERROR`を指定すると、
message出力して停止する。


# Example
```cmake:CMakeLists.txt
cmake_minimum_required(VERSION 2.8)

project(error_test CXX)

option(FATAL "error test" OFF)

if(NOT FATAL)
    message(SEND_ERROR "SEND_ERROR!")
else(FATAL)
    message(FATAL_ERROR "FATAL_ERROR!")
endif()

message("end of file!")
```

##　エラーメッセージを出力して継続
`message`に`SEND_ERROR`を指定すると、エラーメッセージを出力して動作を継続する。
以下の実行例では`message(FATAL_ERROR "FATAL_ERROR!")`を実行後に、
最終行の`message("end of file!")`まで到達して終わる。

```console:SEND_ERROR
>cmake .
CMake Error at CMakeLists.txt:8 (message):
  SEND_ERROR!


end of file!
-- Configuring incomplete, errors occurred!
```


## エラーメッセージを出力して停止
以下の実行例では、`message(FATAL_ERROR "FATAL_ERROR!")`を実行した時点で終了する。

```console:FATAL_ERROR
>cmake . -DFATAL=ON
CMake Error at CMakeLists.txt:10 (message):
  FATAL_ERROR!


-- Configuring incomplete, errors occurred!
```


# 参考
Cause CMAKE to generate an error - Stack Overflow
http://stackoverflow.com/questions/5403636/cause-cmake-to-generate-an-error
/fonts/glyphicons-halflings-regular.ttf 404 (Not Found)

（書きかけです）

# 症状

JavaScript コンソールに次のようなエラーメッセージが表示される（「ファイルが無い」）

```
GET http://0.0.0.0:3000/fonts/glyphicons-halflings-regular.woff2 
GET http://0.0.0.0:3000/fonts/glyphicons-halflings-regular.woff 
GET http://0.0.0.0:3000/fonts/glyphicons-halflings-regular.ttf 404 (Not Found)
```

# 対処法

## (A) CSS 内に記述されている fonts への URL を書き換える :pensive: 

```
$ sed -i -e 's/..\/fonts/\/assets/g' \
  vendor/assets/stylesheets/bootstrap.css
```

## (B) URL を Rewite する :kissing: 

* Gemfile

```
gem 'rack-rewrite'
```

* config/initializers/rewrite.rb

```
Rails.application.config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do
  rewrite   %r{/fonts/(.*)}, '/assets/$1'
end
```

# 環境

rails 5.0.0.1
bootstrap 3.3.7
スタートアップがRailsでこれだけはやっておくべきTips

# スタートアップがRailsでこれだけはやっておくべきTips
## はじめに
先日、「スタートアップRails勉強会」というものに参加し、
10名弱のRailsエンジニアの方達がLTをされたので、メモとしてまとめときます。


## 技術的負債を減らしやることに集中すべし
スタートアップはスピード感が大事！！ということで、
負債に時間をかけてられません。そこで、
**Railsのアップグレードは頻繁に行うべし！**
じゃないと、後から大変なことになるみたいですね・・・
あとは、
- **コードは少なく書け！不要なコードはガンガン消す！**
- **アップグレードすべきものは、その都度slackに流れてくるようにして、アップグレードするべし。**
LT参考資料：
http://qiita.com/kmszk/items/ad687e772da454e3f614

## Docker-composeを導入せよ
動く環境をコマンド一つで構築、できるとか、なんとか
Dockerは知ってるけどDocker-composeは知らなかった。
IncrementsのQiita Teamの方がLTで推奨していました。

## modelのvalidationは最初から入れる
これは、最初にやっておかないと、後で相当やばいことになるらしいです。
私、してたっけ・・・後でチェックします。
特にuniquenessは設定しておくべし、とのこと。

## お手軽にエラーを見える化する
Bgusnagを使うべし。
Bugsnagとは、エラーを全部記録してくれて、webで見れるそうです。
確かうちでも、導入していますが、前のエンジニアにしかメールが届かないので教えてもらわないと・・。
簡単にGithubのissueや、slackの通知と連携することができるそうです！
これは可視化もできて、なかなかよさそう。

## サーバが落ちたときの復旧に対応できるような体制
まず、「サーバが落ちたときはslackなどに通知がくるようにして、すぐに対応できる体制にしましょう」、とのこと。
サーバが落ちたときの対応も知識として入れておかねば・・(私まだわかりません。ごめんなさい)
また、負荷がかかってサーバが落ちるのを防ぐための準備も必要。
過負荷テストをしたり、オートスケーリングの設定をしておく、など！
AWSだとオートスケーリング設定できるけど、VPSだとどうなんだろう・・
これも後で調べてみよう。

## Re-dashなどの計測ツールを使って各種KPIの計測、slackに流す
最近は、KPIを自動で計測・可視化してくれるサービスが多いようですね。
先日は、TechCrunch(だったかな)でRedashが取り上げられていたので、Redashを使って毎日slackに通知させている企業さんが多いのかな。
他にもtableauとか、いろいろあるみたいです。
毎日KPIがグラフになってslackに流れてきたら、モチベも上がるかもしれませんね。
私もためしてみよう。

## PRD, RFCを書く
### PRD(Product Requirements Document)
PRDとは、「製品への要求が書かれた文書」のこと。
製品の目指すゴール、要求される技術などを詳しく書くもののようです。
(実装方法については書かない。)
具体的になにを書くかは、下のURL(参考資料)から見れます。
### RFC(Request for Comments)
RFCとは、「新機能や機能改善のための提案書」のこと。
PRDよりもミクロ。本当に必要なのか？を議論することができる。
軽く書いて、共有するもの。いけそうだったら実装に入る。

参考
http://qiita.com/takashi/items/39adc590ddb48e5765a6)


# 最後に
私もスタートアップにいるし、このイベントはRailsだけに特化していてとてもよかった。
いろいろ聞けたので、試してみようと思います！
また試したものの中でいいのがあったら、Qiitaにメモしよう。
ということで、初めてのQiitaの記事投稿でした。
Windows で markdown-pdf の css がうまく動作しなかった

以下の環境で markdown-pdf を使用して Markdown から PDF に変換をしたのですが、
オプションの cssPath が正常に設定できなかったので、ソースをいじくってなんとか適用できました。

OS: Windows 10
NodeJS: v4.5.0
npm: 2.15.9

いろいろ調べた結果、css のパスの先頭に「file:///」が付加されておらず、
css のパスを正常に解釈できていませんでした。

そこで、markdown-pdf を実行するフォルダ以下

node_modules/markdown-pdf/index.js

を

```JavaScript:index.js
function markdownpdf (opts) {
  opts = opts || {}
  opts.cwd = opts.cwd ? path.resolve(opts.cwd) : process.cwd()
  opts.phantomPath = opts.phantomPath || require('phantomjs-prebuilt').path
  opts.runningsPath = opts.runningsPath ? path.resolve(opts.runningsPath) : path.join(__dirname, 'runnings.js')
  opts.cssPath = opts.cssPath ? path.resolve(opts.cssPath) : path.join(__dirname, 'css', 'pdf.css')
  opts.highlightCssPath = opts.highlightCssPath ? path.resolve(opts.highlightCssPath) : path.join(__dirname, 'css', 'highlight.css')
```

から


```JavaScript:index.js
function markdownpdf (opts) {
  var isWindows = (process.platform === 'win32');
  var protocol = isWindows ? "file:///" : ""
  opts = opts || {}
  opts.cwd = opts.cwd ? path.resolve(opts.cwd) : process.cwd()
  opts.phantomPath = opts.phantomPath || require('phantomjs-prebuilt').path
  opts.runningsPath = opts.runningsPath ? path.resolve(opts.runningsPath) : path.join(__dirname, 'runnings.js')
  opts.cssPath = protocol + (opts.cssPath ? path.resolve(opts.cssPath) : path.join(__dirname, 'css', 'pdf.css'))
  opts.highlightCssPath = protocol + (opts.highlightCssPath ? path.resolve(opts.highlightCssPath) : path.join(__dirname, 'css', 'highlight.css'))
```

に強引に修正、実行

で、css が適用されるようになりました。

ソースを修正してしまっているので、
もっとよい方法を知っている方がいましたら、教えてください。
RAID ありのサーバーを購入する際に IPMI などの低レイヤー監視の必要性を説明するための資料

# RAID ありのサーバーを購入する際に IPMI などの低レイヤー監視の必要性を説明するための資料

## 目的:

* 低レイヤーハードウェア監視の必要性を理解してもらう

## 対象:

* RAID ありかつ IPMI なし低価格サーバーの購入が検討されている状況下にあり
* その購入に対してひとこと物申したい
* そのサーバの管理を任されそうで戦々恐々
* かつ OS レイヤーでの自由度の高い監視が仕込みにくい
    * ESXi(Freeライセンス)
    * Windows(?)
* そんなサーバーにはできるだけ関わりたくないが立場や状況的にいかんともしがたい方

## IPMI とは?

- http://e-words.jp/w/IPMI.html
- https://thinkit.co.jp/free/article/0710/5/4/
- http://ameblo.jp/principia-ca/entry-10983675114.html
- https://www.psychz.net/client/kb/ja/what-is-ipmi-benefits-and-drawbacks.html

## 理由:

### 監視をしないと RAID にしている意味が薄れ復旧不可能なシステム障害リスクが高まります

## すこし厳しい前提条件を定義します

### 前提条件:

* ホットスペア Disk なしの HDD x2 の RAID1 構成である

ある時間 t で片系の Disk(A) が Fail し、それから b 時間経過した t + b 時間でもう一方の Disk(B) が Fail するとします。もちろん t + b 時点で Disk(A) を復旧(t + a)させてなければ RAID1 構成は壊れます。

```
t     : Disk(A) が壊れる日時
t + a : Disk(A) を交換し RAID を復旧する日時
t + b : Disk(B) が壊れる日時
```

* Disk(A) -> Disk(B) の順序で壊れるものとします
* a,b > 0, a,b < 5年程度

  * MTTF(mean time to failure)に依存するがここでは最長で 5 年程度とします
  * a = b の可能性もありえ、その場合は ホットスペア Disk の必要性が出てきますが本書ではそれはいったん除外し b > a とします。すなわち、Disk(B) の障害前に Disk(A) を交換します。
  * b - a > 0 の場合でも b - a = 30分 といった場合には人力による復旧は困難と思われ、この場合も ホットスペア を必要とするでしょう
* a は RAID の Rebuild 時間も含みます

```
Disk(A): ---> 障害(t) ---> Disk交換,RAID復旧(a)
Disk(B):            |-------------(未知)----------------> 障害(b)
RAID構成:            |<------------復旧猶予--------------->|
```

* a が最小のとき復旧猶予は最大になる

### なぜ監視が必要か?

#### 答え: つまり、期間 b - a が RAID1 を壊さずに RAID1 を復旧させるための猶予であり、最小の a 時点で対応を開始することが予測不能な期間 b に対してリスクを最小にすることにほかなりません。

### 副次的なメリット:

* (ハードウェア)監視の知見を得られる
* IPMI の知見を得られる

### デメリット:

* サーバー購入価格はあがります
* IPMI と 監視 の学習コストは必要です(が、それをコストと考えますか?)
* 監視用のサーバもしくはVMが別途必要です

## 以上

### それでもなお、IPMI なしの安サーバーにする必要がある場合の代替案

* RAID6 + ホットスペア x1 ありなど
  * 気づくのが多少遅れても RAID 崩壊のリスクは上の例に比べて下がる
* Linux などの OS レイヤーでの監視を仕込みやすい OS にする
  * OS の正常動作が前提となるため障害検知の確実性がその分下がる
  * OS と監視システムそのものの正常性確認の必要性 
  * HyperVisor として利用する場合、KVM といった知識が別途必要になる
      * KVM は基本 CLI 操作となるため ESXi + vSphere Client よりも学習と管理運用コストが上がる可能性(人的リソースが少ない場合)
MT4 チャートをスクショとって、メール送信・・・ができない

[http://forex.toyolab.com/?p=410](http://forex.toyolab.com/?p=410)を参考に、チャートをスクショ撮って、
メール送信して、それをslack連携してslackでみるってやろうとしたらエラーに・・・

環境は下記の通り

* windwos10
* MT4 build 1010

エラー内容

```
2016.09.29 01:07:05.357	Cannot call 'shell32.dll::ShellExecuteW', DLL is not allowed
```

ちなみに、下記で試してみたが結果は同じだった。。。

* ShellExecute
* ShellExecuteA
* ShellExecuteW
* ShellExecuteEx

ご存知の方、アドバイスください><

[2016/11/7]
上記ですが、問題なくできました。
EAを読み込むときに、外部ライブラリの確認タブみたいなものがありまして、
そのタブをぽちっと押して表示しただけ？で動作するようになりました・・・(謎)

キャプチャを後ほど追加します。
rosserialのインストールとエラー

環境：ubuntu 14.04LTS           ROS=indigo

ROSとArduino間でメッセージ通信をすることができるrosserialを使おうとしたところ、
インストールはできたのですが、includeやライブラリの登録のときにおかしな挙動をしました。その解決方法を記して置きます。

ArduinoのROS用ライブラリであるros_libがうまく設定できなかったり、できたと思ったら、ビルドエラーが表示されたりしました。

その前に、どんなエラーかと言いますと、
\#includeを含んだ文をビルドすると、

/opt/ros/indigo/include/rosserial_msgs/TopicInfo.h:9:18: fatal error: string: そのようなファイルやディレクトリはありません

と表示されました。
結論、あるサイトを参考に実行したところ解決しました。
それが、http://cir-kit.github.io/blog/2015/03/10/use-rosserial-first/です。
具体的な方法も下に記して置きます

/////arduinoのインストールとrosserialパッケージの追加///////

sudo apt-get install ros-indigo-rosserial ros-indigo-rosserial-arduino
sudo apt-get install arduino
arduino
↑実行するとhomeにsketchbook/librariesが作成される
cd ~/catkin_ws/src
git clone https://github.com/ros-drivers/rosserial.git
cd ../
echo "source ~/catkin_ws/install/setup.bash" >> ~/.bashrc
↑下の3つを今後省略するために（必須ではない）
catkin_make
catkin_make install

source install/setup.bash

///////////////以上////////////

ここまでがインストール関係です。次にArduino IDEにrosと通信するためのライブラリのros_libの追加をします。

cd ~/sketchbook/libraries
rosrun rosserial_arduino make_libraries.py .

これで追加されたはずです。もしrosrunの部分がうまくいってないようでしたら、catkin_make installあたりをもう一度行ってください。

おそらくですがcatkin_make installの後にターミナルを閉じてしまうと、設定が戻ってしまってrosrunがうまくいかない可能性があります。
 

これでrosserialを使えるようになりました。後はIDEのファイル→スケッチの例→ros_lib→HelloWorldなどを実行して

rostopic echo /chater

などで確認してください。
誤ってgit commitしたものをgit resetで取消方法

適用場合：`git commit` したけど `git push` をしていない。

```
$ git status
  (use "git reset HEAD <file>..." to unstage)

	modified:   filea.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	fileb.txt
```

`filea` は修正したファイルで、 `fileb` は新規ファイルです。

`filea` のみを `commit` したいけど、あやまって：

```
$ git add .
$ git commit -m "msg"
```

で２つのファイルを全部 `commit` した。

新規ファイル `fileb` を取り戻したいなら、下記に手順で行います：

### 一つ前の `commit` 履歴に戻ります：

```
$ git reset --soft HEAD^
```

これでは `git add .` の状態に戻り、 `git status` で確認できます：

```
$ git status
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   fileb.txt
	modified:   filea.txt
```


### 提示の通り、 `git reset HEAD` で `fileb` を `staging` 領域から外します。

```
$ git reset HEAD fileb.txt

$ git status
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   filea.txt
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	new file:   fileb.txt
```

### 再び `git commit`

この状態でも一度 `commit` すれば良いです：

```
$ git commit -m "msg"
```

もしすでにリモートレポジトリにPUSHしましたら、 `git push -f` は使えるのではないか。
ubuntuでArduino IDEのエディタの文字化けのようなもの

環境：ubuntu 14.04LTS 

ubuntuにArduino IDEをインストールして、プログラムを書こうとしたところ、

書いた文字の一部分がが消えたり、戻ったりするという減少が起こりました。これは文字が消えたわけではなく、見えなくなっただけで、ビルドには影響はありませんでした。

しかし、致命的ではないにしても、操作性が我慢ならないくらいに不便だったので、解決方法を模索していました。

結論として、

IDEのフォントの問題であることが分かりました。

解決策は、

gedit ~/.arduino/preferences.txt

で開いて、

editor.font=

の部分を

editor.font=Monospaced,plain,16

にしたところ、正常に戻りました。Monospacedの部分は好きなフォントに変更してください

とにかく、別のフォントに変更したらうまくいきました

ちなみに設定できるフォントは

fc-list

で確認できます。多すぎて何がなんだか分かりませんがね(笑)

 

おそらく原因はここだと思うのですが、ほかの部分もいじっていたりもしていたので、それでもダメなら以下のことを試してみてもいいかもしれません。

gedit ~/.arduino/preferences.txt　で開いて　editor.antialias=false　をtrueに変える

 

sudo gedit /usr/bin/arduino　で開いて　

java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel processing.app.Base "$@"

の部分を

\#java -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel processing.app.Base "$@"


java processing.app.Base "$@"

に変える。

 

すこしでも力になれば幸いです。
elementary OS FreyaにPHP7 + Nginx + MySQL+Phalconのインストール

普通にUbuntu14.04と同じ。


「add-apt-repopsitory」が入ってなければ

```bash
$ sudo apt-get install python-software-properties
```


PHP7(このリポジトリで7.1もいけると思います。)

```bash
$ sudo add-apt-repository ppa:ondrej/php
$ sudo apt-get uppdate
$ sudo apt-get install php7.0 php7.0-fpm
```

その他PHP関係(apt-cache searchの結果から必要なものをチョイス)

```bash
$ sudo apt-cache search php7-*
$ sudo apt-get install php7.0-common php7.0-curl php7.0-mcrypt php7.0-json php7.0-mbstring
```

後は必要になったら臨機応変に。

Nginx

```bash
$ echo "deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx" >> /etc/apt/sources.list
$ echo "deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx" >> /etc/apt/sources.list
$ curl http://nginx.org/keys/nginx_signing.key | apt-key add -
$ sudo apt-get update
$ sudo apt-get install nginx
```

Mysql

```bash
$ sudo add-apt-repository ppa:ondrej/mysql-5.6
$ sudo apt-get update
$ sudo apt-get install mysql-server-5.6
```




php-fpmの設定

/etc/php7.0/fpm/php.ini の 760行付近

```
# cgi.fix_pathinfo=1
```

をコメントアウトし、さらに0へ変更

```
cgi.fix_pathinfo=0
```

ソケットのパーミッション設定

/etc/php/7.0/fpm/pool.d/www.conf

```
user = nginx
group = nginx

listen.owner = nginx
listen.gropu = nginx
```

Nginxの設定

```
location / {
  # root /usr/share/nginx/html; ここは自分の慣れた場所に変える
  root   /var/www/default/httpdocs;

  # 先頭にindex.php追加
  index  index.php index.html index.htm;
}


# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
# 以下のブロックをコメントアウトし変更
location ~ \.php {
  # ur[l]じゃない！ur[i]だ！
  try_files          $uri = 404;
  # root             html; コメントアウト
  fastcgi_index      index.php;
  fastcgi_pass       unix:/var/run/php/php7.0-fpm.sock


  include            fastcgi_params;
  fastcgi_param      SCRIPT_FILENAME /var/www/default/httpdocs$fastcgi_script_name;
}
```


80番ポート開く

```bash
$ sudo iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
```

Nginx・php-fpmの起動

```bash
$ sudo service nginx start
$ sudo service php7.0-fpm restart
```





Phalconインストール

```bash
$ curl -s https://packagecloud.io/install/repositories/phalcon/stable/script/deb.sh | sudo bash
```

URLに含まれた間違ったディストリ名を修正

/etc/apt/sources.list.d/phalcon_stable.list

```
# deb https://packagecloud.io/phalcon/stable/elementaryos/ freya main
# deb-src https://packagecloud.io/phalcon/stable/elementaryos/ freya main
deb https://packagecloud.io/phalcon/stable/ubuntu/ trusty main
deb-src https://packagecloud.io/phalcon/stable/ubuntu/ trusty main
```

```bash
$ sudo apt-get update
$ sudo apt-get install php7.0-phalcon
```

簡単になりすぎててシャンプー切れた。
Bluemixでデータ分析「dashDB」：わからない操作をすぐ質問できるチャットサービスが始まったみたい（便利！）

ふとdashDBのweb画面を見ていたら、右下にこんなマークが・・・。
![スクリーンショット 2016-09-27 10.00.16.png](https://qiita-image-store.s3.amazonaws.com/0/119378/495e9565-6f26-4427-ae8a-fa51bf638f78.png)


クリックしてみると、チャットができるようで！あと、何やら色々お知らせも届いている・・![スクリーンショット 2016-09-27 10.00.55.png](https://qiita-image-store.s3.amazonaws.com/0/119378/59f4fcdc-91f1-ae89-43d4-d1e6e88925be.png)


片言英語で試しに質問してみる。

> CSVデータをアップロードしたいんだけど、たくさん方法ありすぎて・・どれがいいかしら。

そしたら以下のような返事が。

> どの方法を選ぶかは、CSVの大きさに依存するよ。小さくて、ローカルにあるなら〜〜で、大きいファイルなら〜〜で・・・（続く）

![スクリーンショット 2016-09-28 10.24.15.png](https://qiita-image-store.s3.amazonaws.com/0/119378/cd57cbe8-00c0-430f-bdd2-3cd548c4d0ab.png)



へー。ちゃんと答えてくれた（笑）人間が丁寧に返信をしてくれるのですね。
絵文字も使えるし（使うかは別として）、なにやら画像も送れるみたいだから、「この画面のこれがわからない」ってことも質問できそうですね。

また別の日に、チャットで聞いてみたら、**不明な内容について解説しているマニュアルのURLを案内することはもちろん、step by stepで操作方法をチャットで案内することもできる**そうです。
さらに、上記の返信が帰ってきたときに、わたしはdashDBのブラウザ画面を閉じていたのですが、そしたら**わざわざbluemixに登録しているメールアドレスにも返信内容のメールが飛んできました。**

相手は外国人なので、英語だし、時差もあるけど、でもでも超便利だと個人的には思います・・・！
Onsen UI 2でアプリを作ってわかったこと

半年ぐらい前から作っていたアプリがようやくリリースできた。

取り急ぎOnsen UI 2を使った感想を書いてみる。

# Onsen UI 2
導入は非常に簡単。
ページ遷移はプッシュ/ポップの概念でIonic 1.xより簡単。
Web Componentsに沿っていて美しい。

AngularJS依存でなくなったのでフレームワークの選択の幅が広がった。

Angular v2+、React、さらにはVue.jsに対応している。そんなに手を広げて大丈夫か？
もちろん普通のJSで書いてもOK（オススメはしない）。

日本語対応なので「英語はちょっと...」な人も安心。

Onsen UIの1系を仕事で使っていたので、ひとまずAngularJSバインディングを選択。
※ 今ならvue-onsenuiやngx-onsenui等もっと速いものを使った方が良い
※ 2017/11/22 公式はVue.jsがお気に入り。今から始めるならVue.jsでも悪くない

特に意識しなくてもモダンなアプリの見た目になる。非デザイナーには心強い。
2からはMaterial Design対応。自動でテーマが切り替わったのには感動した。

実際に使いだしたのはBeta.7から。
Beta.9からのバグは本当にきつかった。何度かIonicが頭をよぎった。
最終的にアプリに使ったのは現行の2.0.0ではなく、「RC.17」
※スライディングメニュー系のバグがRC.18以降で出るようになった
※↑2.0.1で修正。しかしons-carousel-itemで下記のバグが出るようになったorz

めんどくさがりな性格が災いしてリリースまでは半年かかったが、プロトタイプは実は2週間ぐらいでできていた。iOS/Android両対応のアプリをこのスピードで作れるのはハイブリッドの良いところ。

# 問題点

ons-carouselはバグが多い
・スワイプイベントが競合するのでons-splitter-sideと併用できない。
　↑ons-sliding-menuで回避できる。要はカルーセルにオーバーレイしなければOK。
・「カレンダー部分をカルーセルにできたらカッコいいんじゃね？」と思って手を出したら、インデックス強制初期化バグに見事にハマった（現在は解決済み）。一応バグ発生は検知できるため[対応可能](http://qiita.com/puku0x/items/5104e78a7794a94ee004)（めんどくさい）。

Onsen UIは速い。AngularJSが少し足を引っ張っている感じ。
適宜データを削ったり、単方向バインディングにして高速化を図るのが良い。

AngularJS 1.5で導入されたComponentで作ると画面遷移アニメーション（スライド）が正常に作動しない。

ons-popover内でng-clickが使えるといつから錯覚していた？
※ ons-popoverやons-dialogは別スコープになるため注意（parentScopeで解決できる）

CSSのテーマローラにはバグがある。手で修正したほうが安全。
※ 2017年12月から[GitHub上](https://github.com/OnsenUI/theme-roller)に動きが...近いうちVerUpか？

ons.notificationのボタンラベルの配置はiOSとAndroidで **逆** になる。

~~ons-page内にstyleを書いてはいけない。ステータスバーに変な空白ができる。
必ずCSSで読み込ませること。~~ ※ 2.4.0で修正されたもよう

Androidで動かした場合、タップ時のリップルエフェクトが少し重い。

~~iPhoneで動かした場合、ons-pull-hookを入れるとリストがガクガクする。~~
※ 2.6.0で修正、長い戦いだった

~~ionicと違ってselectタグには対応していない。~~ ※2.1.0から対応
ons-selectを使う場合はレイアウトに注意。縦に並べるとフォーカスがずれる事がある。iOSのUIを参考にons-list-itemにしてページ遷移で「選択」を実装するのが良いかも。

公式のリファレンスが全てと思ってはいけない。
「pushPageで渡された引数を遷移後のページで取得するにはどうするか？」ぜひ調べてみてほしい。

~~RC.16からページオブジェクトを任意に破壊できなくなった。
つまり、ページを一つ飛ばしてpopPageするといったことができなくなった。割と痛い。~~ v2.0.5で修正

# 結局Onsen UI 2は使えるのか？
あまり凝ったUIにしなければ使えると思う。

慣れていない状態でons-splitter + ons-tab + ons-navigatorとか欲張ると高確率で死ぬので注意。ons-pull-hookはしばしば実機での画面ちらつきが報告されている。採用は実機で確認してから。

2.0.0がリリースされたがAngularJSバインディングにはまだ罠が多い。
~~AngularJSと一緒に使うなら今のところRC.17が正解。~~
最近は2.7系でもいいんじゃないか、という気がしてきた。

# その他
開発初期はMonacaを使用。アシアルさんありがとう。
Onsen UIをすぐ試せるし、ネットさえあればどこでも使えるので超絶便利。

アイコンやスプラッシュスクリーンを解像度毎に生成してくれるのは助かった。
更にデバッガアプリはPhoneGapのやつより高機能。

無料アカウントではローカル通知、広告、アプリ内課金、ソース暗号化が使えない。お金がなかったので、Monacaである程度作っておいてPhoneGapに乗り換えるという方法をとった。アシアルさんごめんなさい。
cocos2d-xでゲームを作ってる最中のメモ

cocos2d-xでゲーム制作を独学していたときに「あ、これ忘れそう」と思ったことをメモしておきます。
自分自身の備忘録にもなりますし、他にも同じように「あれ、どうやったっけ・・・？」という人の助けになれば嬉しいです。
（この記事は「あ、これ忘れそう」てのがある度に更新されます。更新そのものを忘れなければ。）

<h1>機種による画像の大きさの変化をなくしたい</h1>
何も処理をしていない状態だと、画面右上に置いた画像が、本来なら１／４しかでないはずなのに全部出てたり、もしくはほんの少ししかでてなかったり、というのは誰しも通る道かと（俺だけ？）。
そんなときには、最初に読み込むSceneのinit関数の冒頭（Scene::init()の直後）にコレを置いてあげる。
<pre>
int resolution_size_width = 640;
int resolution_size_height = 480;

auto gl_view = Director::getInstance()->getOpenGLView();
gl_view->setDesignResolutionSize(resolution_size_width, resolution_size_height, ResolutionPolicy::SHOW_ALL);
</pre>
これを読み込めば、640*480で表示されます。
また「setDesignResolutionSize」の第三引数「ResolutionPolicy::SHOW_ALL」は、「指定した大きさで画面いっぱいに表示するが、引き延しはしない」という内容です。
ので、機種によっては上下または左右に余白ができる場合があります。
たぶん余白のところを活かす方法があると思いますが、それについては調べる気になったら調べます。
<h3>追記</h3>


<h1>スプライトの範囲をタップしたときのイベントを作る</h1>
ほい。
<pre>
	auto listener = EventListenerTouchOneByOne::create();
	listener->onTouchBegan = &#91;=&#93;&#40;Touch *touch, Event *event&#41; {
		Rect target_box = event->getCurrentTarget()->getBoundingBox();
		Point tap_point = touch->getLocation();
		if (target_box.containsPoint(tap_point)) {
			this->removeFromParentAndCleanup(true);
			return true;
		}
		return false;
	};
</pre>
とりあえずこれでできるはず。
これ毎回やるんだけど、その度にタップ判定の位置がなんかずれるから、今後はこれでいこうかと思います。
もし「それこれが原因じゃね？」てのがあればコメントいただけると泣いて喜びます。３０近くのおっさんが。
Adobe XD - 9月の追加機能


26日に追加された新機能の雑感デス。

# モバイルアプリの登場とライブプレビュー

![ios.png](https://qiita-image-store.s3.amazonaws.com/0/138215/abe68310-bc1b-c64a-1f26-a145feb180fa.png)


アプリ起動とUSB接続で端末でのライブプレビューが可能となりました。
サクサクと表示と変更が反映され、
目視によるデバイスチェックが用意となり
端末での表示イメージがよりつきやすい環境が整いました。だがしかし有線。

ちなみにプロトタイプのプレビューは画面に出ないので
せっかく追加されたトランジションなどが、
端末で見られないながちょっと残念。あと有線。


# アートボードの垂直方向のスクロール

![NAMAHAGE.gif](https://qiita-image-store.s3.amazonaws.com/0/138215/15e29f2f-1774-0fcb-88da-44229d5bba58.gif)


スクロール機能がついにXDに！
そして当然固定ヘッダーフッターはおあずけだ！こうかはばつぐんだ！
使用した印象ではアプリでのスクロール表現はもちろんですが、
Webサイトのモックアップ時への有用性が高い感。
どうしてもページの長さがまちまちになるPC系画面において、
スクロールつけるだけでプレビューモード時に画面サイズが統一できるのは
非常に素晴らしいと感じました。

2016/09/30 追記
機能追加ではなく機能改良でございました。
「アートボードスクロールのためのビューポート高さ指定」のおかげで
画面サイズが統一ができるようになったというお話でした。


# まとめ
その他細かい機能は本家サイトで語られているので、
ぜひそちらをチェックしていただけたらと。
個人的に高感度高かったのは、
チュートリアルのアップデートとスタートアップ画面の変更でした。
こういうそのままでいいじゃんみたいなところに、
デザイン的な変更と気遣いが足されるていくのは作り手の愛を感じます。
XDというアプリ自体の成長も楽しめるってなんだか夢広がりますね！
Ruby/RailsのLoggerで任意コマンドを実行可能なので注意


# TL;DR
ターミナル開いて以下叩くと`ls`が実行されます。

```bash
$ ruby -e 'require("logger"); Logger.new("| ls")'
```



# 概要
Ruby/Rails界隈でも`eval`や\`\`(バッククウォート)は
ユーザからの入力値入れちゃったら大変だから気をつけろ〜的なのは散々言われていますが
`Logger`で任意シェルコマンド実行できるのは知らなかったのでメモとして残しておきたかったのと
それに付随してrailsの`constantize`は危険な場合があるという話です

# 動作環境
Ruby 2.3.1
Rails 5.0.0


# Loggerでのコマンド実行方法
TL;DRにも書きましたが、単に`Logger.new`の引数に`|`+`好きなコマンド`を入れるだけで実行できます

```ruby
> require("logger")
> Logger.new("|pwd")
```


# どういう時に危険か
[The Safest Way to Constantize...](http://gavinmiller.io/2016/the-safesty-way-to-constantize/) (これ読んで`Logger`でコマンド実行できること知りました)
この記事はRailsの`constantize`が危ないよという記事です。

`constantize`とはレシーバの文字列をクラスとして返してくれるやつですね

```ruby
> puts "Fixnum".class 
# => String
> puts "Fixnum".constantize
# => Fixnum
```

動的にクラスを引っ張ってくるので地味に便利なのですが
仮にユーザからの入力値に対して`constantize`した場合に気をつける必要があります。

例えば

```ruby
class ContentsController < ApplicationController
  # GET /contents
  def index
  	obj = params[:type].constantize.new(params[:value])
  end
end
```

なんていうコントローラがあった場合に`/contents?type=Logger&value=|悪意のあるコマンド`(実際にはエンコードされてるでしょう)を叩くと`Logger.new("|悪意のあるコマンド")`ができあがってしまい、いとも簡単に`|`以降のコマンドを実行してしまいます。

ではどうやって`constantize`を安全に使うかというのは先ほどの「[The Safest Way to Constantize...](http://gavinmiller.io/2016/the-safesty-way-to-constantize/)」に載ってるのでそちらを参照して下さい。



# まとめ
よくよく考えるとあんまこんなコード書かないかもしれませんが知ってるのと知ってないのとでは大違いなので頭の片隅にでも置いておくといいかもしれませんね
knife soloが実行できない...orz


[Chef実践入門](https://www.amazon.co.jp/Chef%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-~%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E6%A7%8B%E6%88%90%E3%81%AE%E8%87%AA%E5%8B%95%E5%8C%96-WEB-PRESS-plus/dp/477416500X)を買って、意気揚々とチュートリアルを進めていたところ
**2.6 knife-soloでchef-soloをリモート実行する**で早速つまづく

その解決法をメモ程度に書き起こす

## gem installでのエラー
Macで`gem install knife-solo`をしkinife-soloを実行したところコマンドがないと怒られた。

```bash
$ knife solo init .
-bash: knife: command not found
```
どうやら以下の理由らしい
[初心者にお勧めするChefの正しいインストール方法 \- Qiita](http://qiita.com/hamichamp/items/d3ca7c365353285a564b)
よって本家からダウンロードする

## SDKでもまだ足りない
SDKをインストールした後にコマンドを試したところエラーが起きる。

```bash
$ knife solo init .
FATAL: Cannot find subcommand for: 'solo init .'
Available subcommands: (for details, knife SUB-COMMAND --help)
...
```

調べたところ、chef内のgemにknife-soloをインストールする必要があるのだとか
[簡単！MacOSXやLinuxにChef,Knife,Berkshelfを一発でインストールしてくれるChefDKの紹介 · DQNEO起業日記](http://dqn.sakusakutto.jp/2014/05/mac_osx_linux_chef_knife_berkshelf.html)

```bash
$ chef gem install knife-solo
$ knife solo init .
WARNING: No knife configuration file found
Creating kitchen...
Creating knife.rb in kitchen...
Creating cupboards...
Setting up Berkshelf..
```

やっと完了。。よかったよかった
[Concernの有効活用] Railsで比較(A<B)のバリデーションを動的に定義する

開店日と閉店日のカラムがあった時に、

```rb
open_at > closed_at
```

などを検証するカスタムバリデーションを動的に追加するTips

# コード
全文です

```rb:app/models/concerns/active_comparison_validator.rb
module ActiveComparisonValidator
  module ClassMethods
    # Verified: that A is greater than B.
    # @param [String] field_a_<_field_b This string is field_name, operator_name and field_name
    # @return Define a custom validator in the context of the model.
    # @example open_at < close_at
    #     class Shop < ActiveRecord::Base
    #       include OriginValidator
    #       comparison_validator 'open_at < close_at'
    #     end
    # @note
    #   You can use their operator.
    #     - '<'
    #     - '<='
    #     - '>'
    #     - '>='
    #     - '=='
    #     - '!='
    # @note
    #   And localization.
    #     - Dedault is used errors.messages
    #       - greater_than
    #       - less_than
    #       - greater_than_or_equal_to
    #       - less_than_or_equal_to
    #       - confirmation
    #       - other_than
    def comparison_validator(a_operator_b)
      a_attr, operator, b_attr = *a_operator_b.split(/\s/).map(&:to_sym)
      method_name = "comparison_validator_for_#{a_attr}_and_#{b_attr}"
      define_method(method_name) do
        a_value = send(a_attr)
        to_value = send(b_attr)
        return unless a_value && to_value
        locals = {
          :<  => [:greater_than,             :less_than,                :count],
          :<= => [:greater_than_or_equal_to, :less_than_or_equal_to,    :count],
          :>  => [:less_than,                :greater_than,             :count],
          :>= => [:less_than_or_equal_to,    :greater_than_or_equal_to, :count],
          :== => [:confirmation,             :confirmation,             :attribute],
          :!= => [:other_than,               :other_than,               :attribute]
        }
        return unless locals.key?(operator)
        return if a_value.send(operator, to_value)
        a_value_human = { locals[operator].last => self.class.human_attribute_name(a_attr) }
        b_value_human = { locals[operator].last => self.class.human_attribute_name(b_attr) }

        I18n.with_options scope: 'errors.messages' do |locale|
          errors.add(b_attr, locale.t(locals[operator].first,  a_value_human))
          errors.add(a_attr, locale.t(locals[operator].second, b_value_human))
        end
      end
      config = %(validate :#{method_name})
      class_eval(config)
    end
  end
end
```

## 日本語化
I18nのをつかっています。
config/locals/ja.ymlの、errors.messages.less_thanを編集することでカスタマイズできます

# 使い方

Shopモデル（店舗）が
open_at（開店） < close_at（閉店） となっていることをバリデーションで定義してみます

```rb:shop.rb

class Shop < ActiveRecord::Base
  include ActiveComparisonValidator
  comparison_validator 'open_at < close_at'
end
```

## 演算子

- '<'
- '<='
- '>'
- '>='
- '=='
- '!='


# ちなみに、こちらでGemにしてみました

[active_comparison_validator](https://github.com/s1160054/active_comparison_validator)
java.lang.Stringクラスに学ぶ不変オブジェクトという考え方

突然ですが問題です。

以下のプログラムを実行すると出力されるのは ```true``` でしょうか ```false``` でしょうか。

```java:StringSample.java
public class StringSample {
  public static void main(String args[]) {
    String hoge = "foo";
    String fuga = "foo";
    System.out.println(hoge == fuga);
  }
}
```

答えは ```true``` です。僕はずっと ```false``` だと思っていました。

# 不変なオブジェクト

Javaにおいて、「文字列の比較は ```==``` ではなく ```equals()``` を使え！」と教わるのは誰もが通る道だと思います。参照型であるオブジェクト同士の ``` == ``` は参照値の比較であって中身の比較ではないためです。

また、``` "foo" ``` と書くと、内部的には ``` new String("foo") ``` が呼び出されるとも学んでいたため、別の場所で ``` "foo" ``` と宣言して生成したオブジェクトは別の参照値を持つものと思っていました。

が、Stringクラスにはもう一つ **「同じ文字列リテラルを宣言した場合、すでにある同じ文字列を保持するStringオブジェクトへの参照値を使い回す」** という仕様があるようです。参照値を使い回す（つまり同じインスタンスを参照する）、と聞くと「どちらかの参照（変数）からインスタンスの中身を書き換えたらもう一方にも影響が出てしまうのではないか」と考えてしまいますが、Stringクラスは「不変であること」が保証される実装になっているため、そもそもインスタンスが保持している値を「書き換える」ということができないようです。

**参考**
> 文字列は定数です。この値を作成したあとに変更はできません。文字列バッファは可変文字列をサポートします。文字列オブジェクトは不変であるため、共用することができます。

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html

なお、文字列リテラルの場合はインスタンスを使い回す、というだけなので、次の例は ```false``` です。

```java:StringSample.java
public class StringSample {
  public static void main(String args[]) {
    String hoge = new String("foo"); // "foo" を new String()で生成
    String fuga = new String("foo");
    System.out.println(hoge == fuga);
  }
}
```

この仕組みによって、同じインスタンスを使いまわしても、そのインスタンスが保持する値が意図せず変更されていた、ということが発生しないようになっているわけです。

Javaでは他にも、 Booleanクラスが ```TRUE``` と ```FALSE``` というBoolean型の定数を保持し、Boolean.valueOf()メソッドでは戻り値としてそのどちらかを返す（新しくnew Boolean()しない）実装になっていたり、Java8では時間を扱う不変なクラスがいくつも追加されたりと、至るところに不変なインスタンスを使い回す考え方が見て取れます。

# 不変オブジェクトのメリット

では、オブジェクトを不変にすることによって、どのようなメリットがあるのでしょうか。
一番のメリットは、先ほどことそのままで「インスタンスを使い回せる」ということです。

Javaでは、オブジェクトを ```new``` するたびに、新しいインスタンスが使用するメモリの確保が行われます。また、 ```new``` しすぎてメモリが足りなくなってきたらガベージコレクションが行われます。つまり、```new``` すればするほど、プログラムの実行速度や効率が落ちてしまうのです。

そのため、特に頻繁に使われる基本的なクラスでは不変オブジェクトを活用し、なるべく ```new``` しなくても安全なプログラムが書けるような工夫がされている、というわけです。

また、オブジェクトが不変であることは並行処理をするプログラムでも有効です。

同じインスタンスを複数のスレッドが参照している場合、そのオブジェクトが書き換え可能だとどちらのスレッドがどの順番でインスタンスを書き換えるか、ということがプログラムの実行ごとに変わってしまいます。そうなると、プログラマは参照しているインスタンスにどのような変化が発生するかを分からないまま実装しなければならず、バグを生む原因にもなってしまいます。

オブジェクトが不変であることが保証されていることで、スレッドがいくつあってどのような処理をしているのかに関わらず、常に同じようにそのインスタンスを扱うことができ、想定外の不具合の発生を防げるのです。

# 参考

* [String型から不変クラスを学ぶ【Java】](http://tomcky.hatenadiary.jp/entry/2013/08/31/002148)
* [Effective Java](https://www.amazon.co.jp/dp/4621066056)
    * 項目5「不必要なオブジェクトの生成を避ける」に不変オブジェクトを作るメリットが詳しく書かれています。
* [java.lang.String OpenJDK8](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java)
    * Stringクラスの実装はこちらから参照できます。

（2016.09.29追記）
自作クラスを不変にする工夫についてまとめてみました。
[【Java】不変オブジェクトの作り方　参照の隠蔽と防衛的コピー](http://qiita.com/chooyan_eng/items/ba934145c30419c3cba6)
併せて読んでみてください。
Rails 4系と5系で互換性のあるcontroller specを書く方法

# 環境
* Rails v5.0.0.1
* rspec-rails v3.5.1

# 前置き
Rails 4系以前と5系ではcontroller specの `params` の渡し方が変わっています。

## Rails 4系まで
```ruby
get :show, { id: 1 }
```

## Rails 5系
```ruby
get :show, params: { id: 1 }
```

Rails 5系で古い書き方をすると下記のようなDEPRECATION WARNINGが出ます。

```
DEPRECATION WARNING: ActionController::TestCase HTTP request methods will accept only keyword arguments in future Rails versions.

Examples:

get :show, params: { id: 1 }, session: { user_id: 1 }
process :update, method: :post, params: { id: 1 }
```

普通のアプリならメッセージに従ってspecを書き直せばいいのですが、mountable engineのようにgemの中に含まれるspecの場合はそうはいきません。

specファイルになるべく差分を発生させず、Rails 4系と5系で両方で動くcontroller specを紹介します。

# やり方
`params_wrapper` というラッパを用意するだけです　[^params_wrapper]

[^params_wrapper]: このサンプルでは`ParamsWrapper`をincludeしていますが、rails_helper.rbにメソッドを直接定義するのでもいいです

```ruby:spec/support/util/params_wrapper.rb
module ParamsWrapper
  def params_wrapper(params = {})
    if Gem::Version.new(Rails.version) >= Gem::Version.new("5.0.0")
      { params: params }
    else
      params
    end
  end
end
```

```ruby:spec/rails_helper.rb
Dir["#{__dir__}/support/**/*.rb"].each { |f| require f }

RSpec.configure do |config|
  config.include ParamsWrapper
end
```

controller specでは下記のように呼び出します。

```ruby:spec/controllers/users_spec.rb
get :show, params_wrapper(id: 1)
```

これでRails 4系以前では `get :show, { id: 1 }` が、Rails 5系以降では `get :show, params: { id: 1 }` が実行されます。

`params_wrapper` を挟むことでcontroller specの各所でRailsのバージョン分岐を書く必要がなくなってspecがシンプルになります。

# 実際にこの対応を行ったcommit
https://github.com/mitaku/komachi_heartbeat/pull/18/commits/e5c46a831d7332b262b72d052b97e6140fe2f442

量が多いと書き換えは大変ですが、元のspecとそんなに差分もなく違和感なく読める（と思う）のがいいです。

# 備考: sessionについて
今回は `params` だけだったのでこのような対応でしたが、 `session` も考慮すると対応が若干面倒くさそうな予感がしています。（今回のcontroller specだと `session` を使っていなかったので特に考慮していなかった）
React Native メモ (ListView)

# React Nativeでのメモ（ListView)

ListView でハマった点

- ListView の renderRow で表示させるところでメソッドを動かしたい

```
class MyComponent extends Component {
  constructor() {
    super();
    const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1 !== r2});
    this.state = {
      dataSource: ds.cloneWithRows(['row 1', 'row 2']),
    };
  }
  
  showTodo(todo){
   ...
  }

  renderList(todo){
    <TouchableHighlight onPress={() => {
      this.showTodo(todo)
    }}>
      <Text>{todo.name}</Text>
    </TouchableHighlight>
  }

  render() {
    return (
      <ListView
        dataSource={this.state.dataSource}
        renderRow={this.renderList}
      />
    );
  }
}

```

上のコードだと
 _this2.showTodo is not a function と表示される.

```
　　　　　　　　　　　　<ListView
        dataSource={this.state.dataSource}
        renderRow={this.renderList.bind(this)}
      />

```

renderRow = {this.renderList.bind(this)}と変更することで
エラーが消える
ソーシャルサービスのブックマーク数をJavaScriptで取得する方法

[ソーシャルカウントの取得方法まとめ(全9サイト)](https://syncer.jp/how-to-get-sns-count)を参考にと思ったんだけど、Ajaxとかが古い感じだったので書き直し。ついでにjQuery版にしてみた。とりあえず はてブと Facebook。Twitterは別サービスの審査待ち。

```
$.extend($.fn, {
  fb_share: function(url) {
    var me = this;
    $.ajax({
      url: '//graph.facebook.com/?id=' + encodeURIComponent(url),
      dataType: 'jsonp'
    })
    .then((obj) => {
      var count = obj.shares || 0;
      $(me).html(count);
    });
  },
  hb_share: function(url) {
    var me = this;
    $.ajax({
    	url: 'http://api.b.st-hatena.com/entry.count?url=' + encodeURIComponent(url),
      dataType: 'jsonp'
    })
    .then((obj) => {
      var count = obj || 0;
      console.log(obj);
      $(me).html(count);
    });
  }
});
```

後は、

```
  var url = document.location.href;
  $(".cb-fb").fb_share(url);
  $(".cb-hb").hb_share(url);
```

みたいな感じで取れる。
snapperパッケージについて検討すること

* snapper-aptとして別パッケージにしたほうがいい？
    * その場合はRecommendsにしておく
* aptの場合にはCleanup Algorithms指定したほうがいいのでは？際限なく増えるとディスク圧迫するし…
    * その場合はnumber指定が良いか。stableで前から間が空くとかもあり得るし
    * cleanup、importantの場合は別にできるみたいだけど、どう設定するのだろう？
* configが一つもなかったら実行しないようにしたほうがいいか
* systemd対応の部分がtimer以下にしないといかんのではないか疑惑。

>[Install]
>WantedBy=basic.target

ではなく

> [Install]
> WantedBy=timers.target


忘れないうちにメモ。
Salesforceシステム用以外のSObject一覧を取得する

# 概要

Salesforceでオブジェクト一覧から必要なオブジェクトを選ぶような機能を作る際に、Salesforceのシステム用オブジェクトがたぶんいい感じ（完全ではない）にフィルタリングされたオブジェクト一覧を取得する方法
まだ、若干不要なオブジェクトもあるが、なにかいいフラグはないのかな。。。名前を直に指定するのもカッコ悪いしな。。。



# 方法

```salesforce:sample.cls
//すべてのオブジェクトを取得
Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
for(String k : schemaMap.keySet()) {
    Schema.DescribeSObjectResult schemaSobj = schemaMap.get(k).getDescribe();
　　　　//クエリできるオブジェクト
    if(schemaSobj.isQueryable() &&                  
　　　　//アクセスできるオブジェクト
       schemaSobj.isAccessible() &&
       //更新可能なオブジェクト
       schemaSobj.isUpdateable() &&                 
　　　　//新規機能用に予約されたオブジェクトではない
       !schemaSobj.isDeprecatedAndHidden() &&       
　　　　//カスタム設定ではない（任意）
       !schemaSobj.isCustomSetting() &&            
　　　　//グローバル検索できないオブジェクトまたはカスタムオブジェクトである
　　　　//カスタムオブジェクトを新規作成した場合は、デフォルトでカスタムオブジェクトがオフになっているため、
　　　　//OR条件でカスタムオブジェクトであるを追加しています
       (schemaSobj.isSearchable() || schemaSobj.isCustom())) {   
           //do something
           system.debug(schemaMap.get(k).getDescribe().getName()+'('+ schemaMap.get(k).getDescribe().getLabel() +')');
       }
}
```

# 実行結果(システム管理者)

実行ユーザがシステム管理者以外の場合は、アクセス権限によって変わります

```
Account(取引先)
Asset(納入商品)
Attachment(添付ファイル)
Campaign(キャンペーン)
Case(ケース)
CaseComment(ケースコメント)
CollaborationGroup(グループ)
Contact(取引先責任者)
ContentDocument(コンテンツドキュメント)
ContentVersion(コンテンツバージョン)
Contract(契約)
Document(ドキュメント)
DandBCompany(D&B 企業)
EmailTemplate(メールテンプレート)
Event(行動)
Group(グループ)
Idea(アイデア)
IdeaComment(アイデアのコメント)
Lead(リード)
Macro(マクロ)
Note(メモ)
Opportunity(商談)
Order(注文)
PermissionSet(権限セット)
Pricebook2(価格表)
Product2(商品)
Solution(ソリューション)
SOSSession(SOS セッション)
Task(ToDo)
Topic(トピック)
User(ユーザ)
UserRole(ロール)
xxxxxx__c(xxxxxxカスタムオブジェクト)
…
```

[リファレンス](https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_methods_system_fields_describe.htm)


以上
51EB851F

C++で整数を100で割ったコードを最適化コンパイルしたら、
タイトルの定数が現れた。

一瞬なにをやってるか分からなかったのだが、
div系の命令を使うと重いので、mulとshiftで整数の割り算をやってしまう時に、
最適化で使う定数らしい。

T / 100 という式があったときに、これは以下のように式変形できる
T * (0.32 / 32) * (pow(2 , 32) / pow(2 , 32))

するとこうできるので
T * (0.32 * pow(2 , 32)) / (32 * pow(2 , 32))

分子の項(0.32 * pow(2 , 32))を定数に置き換えると
T * CONST / 32 * pow( 2 , 32)

分母の32は5回の右シフトに変換し、pow(2 , 32)の除算は、
演算するのではなく、乗算時の結果レジスタの上位レジスタだけ見るようにすればいい

すると以下のようなアセンブラがでてくる
mul T 51EB851F
sar edx 5
ChatOpsの概念を歴史から振り返ってみる

ChatOpsという話をしたときに、
社内で認識のすれ違いがあったりしたので、少しまとめてみました。
間違いがあれば指摘して頂ければ泣いて喜びます。

# ChatOpsの歴史
## hubotのリリース
2011年、hubotというchatbotフレームワークがGitHubよりリリースされました。 

hubotは拡張性が高い、非常に良くできたフレームワークでした。
redis、MySQL、yamlと様々なツールを使って、データを保持することができ、
slack、Hipchat、IRCなど、様々なチャットツールと接続するアダプタを用意することが容易でした。

機能の再利用性も高かったため、hubotは様々な人に利用されるchatbotフレームワークとなりました。

## ChatOpsの誕生
PuppetConf 2012において、GitHubはhubotを用いたChatOpsという概念を発表します。

https://speakerdeck.com/jnewland/chatops-at-github

この発表においてhubotは、ciの実行、Pull Request のmerge、自動デプロイ、log出力、リソースグラフの出力。
など様々な役割を持っていました。

ChatOpsの主な利点としては、下記の４点が挙げられています。

- チャットツール上にいる人全員が、現在起きていることを把握できる
- 現状を把握できるので、無駄なコミュニケーションが発生しない
- 目の前で実行することが、教えることに繋がるため教育コストが低くなる
- 複雑な処理をチャットでのメッセージのやりとりに隠蔽できる

この発表時点のChatOpsという概念は、
人がchatbotにメッセージを送り、タスクを実行させる。
そして、その結果をチーム全体で共有するといったものでした。

しかしながら、時間の経過とともにその概念は変化していきます。

## ChatOpsの概念の変化
現在、SentryやDatadog、Mackerel、NewRelicなど、SaaS自体がChatサービスと連携する機能を持つようになりました。

その結果、ChatOpsという概念が、[SaaSなどのツールも含み](http://japan.blogs.atlassian.com/2016/01/what-is-chatops-adoption-guide/)はじめました。
[ChatBotはChatOpsのさらなる効率化を図るツール](http://www.nttdata.com/jp/ja/insights/trend_keyword/2016070701.html)
という位置づけで話をされることさえあります。

## 最後に
現在ChatOpsの概念は、どちらが主流なのかは分かりません。
もしかしたら、SaaSを含んだ概念はある種特殊なものかも知れません。
とはいえ、ChatOpsという開発手法には、ChatBotを含まない可能性もありうるというところだけ
認識しておくと、無駄なすれ違いを発生させないかも知れません。

## 参考資料
PuppetConf 2012
https://puppet.com/blog/watch-and-learn-puppetconf-2012-videos

ChatOps at GitHub
https://www.youtube.com/watch?v=NST3u-GjjFw
https://getputpost.co/the-four-stages-of-chatops-79cc60fc38a#.vnb9dpiky
redis.yml redis_db_num 设置

redis_db_num设置为２０

那么redis.conf里面databases 就要设置为20 + 1 = 21

不然会报这种错误http://stackoverflow.com/questions/14287075/rediscommanderror-err-invalid-db-index-when-running-rspec

redis要重启

rails 如果还是报错试试spring stop
Stormのインストール方法

## 環境
- OS: CentOS7(Linux)  
※ VirtualBox上

## 1. JDKのインストール  
JDK8のダウンロードに、wgetを利用するためインストールされていない場合は、インストールする。

```shell-session
$ sudo yum install wget
```

JDKのダウンロードには、確認にチェックがついている必要があるため、単純にURLを入力してもダウンロードできないため、以下を実行

```shell-session
$ wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u101-b13/jdk-8u101-linux-i586.rpm
```

ダウンロードが完了したら、インストールする。  

```shell-session
$ rpm -ivh jdk-8u101-linux-i586.rpm
```

Javaが正しくインストールされているか確認する。

```shell-session
[root@localhost tmp]# java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) Client VM (build 25.101-b13, mixed mode, sharing)
```

## 2. パスの設定

```shell-session
$ export JAVA_HOME=/usr/java/default
$ source ~/.bashrc
```

## 3. ZooKeeperのインストール

/optに移動します。

```shell-session
$ cd /opt
```
zookeeper(ver.3.4.9)のダウンロード

```shell-session
$ wget http://www-eu.apache.org/dist/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
```
展開し、ディレクトリ名もわかりやすいように変更しておきます。

```shell-session
$ tar -zxvf zookeeper-3.4.9.tar.gz
$ mv zookeeper-3.4.9 zookeeper
```

圧縮されている元ファイルは不要なので削除します。

```shell-session
$ rm -rf zookeeper-3.4.9.tar.gz
```
展開されたディレクトリに移動し、dataディレクトリを作成します。

```shell-session
$ cd zookeeper
$ mkdir data
```
設定ファイルzoo.cfgを作成し、編集します。

```shell-session
$ vi conf/zoo.cfg
tickTime=2000
dataDir=/opt/zookeeper/data
clientPort=2181
initLimit=5
syncLimit=2
```
作成後、zookeeperを起動します。

```shell-session
[root@localhost zookeeper]# bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
```

## 4. Stormのインストール
/optに移動します。

```shell-session
$ cd /opt
```

Storm(ver.1.0.2)をダウンロードします

```shell-session
$ wget http://www-eu.apache.org/dist/storm/apache-storm-1.0.2/apache-storm-1.0.2.tar.gz
```

展開し、ディレクトリ名もわかりやすいように変更しておきます。

```sh
$ tar -zxvf apache-storm-1.0.2.tar.gz
$ mv apache-storm-1.0.2 storm
```
展開されたディレクトリに移動し、dataディレクトリを作成します。

```shell-session
$ cd storm
$ mkdir data
```

設定ファイルstorm.yamlを作成し、編集します。

```shell-session
$ vi conf/storm.yaml
storm.zookeeper.servers:
 - "localhost"
storm.local.dir: "/opt/storm/data"
nimbus.host: "localhost"
supervisor.slots.ports:
 - 6700
 - 6701
 - 6702
 - 6703
```

## 5. Stormの実行
nimbusを起動する

```shell-session
$ bin/storm nimbus &
```
※ バックグラウンドで起動

supervisorの起動

```shell-session
$ bin/storm supervisor &
```
※ バックグラウンドで起動

UIの起動

```shell-session
$ bin/storm ui &
```
[http://localhost:8080](http://localhost:8080)にアクセスすると、管理画面にアクセスできる。  
外部で表示したいが、ポートが空いていない場合は、以下のコマンドを実行する。

```shell-session
$ firewall-cmd --add-port=8080/tcp --zone=public --permanent
$ firewall-cmd --reload
```

## 参考記事
Apache Storm - Installation
https://www.tutorialspoint.com/apache_storm/apache_storm_installation.htm
VMWare仮想マシンに仮想ディスクを追加する

①追加前の状態

```shell-session
[root@vcs ~]# df -k
Filesystem           1K-blocks    Used Available Use% Mounted on
/dev/mapper/vg_vcs-lv_root
                      14225776 4404664   9091820  33% /
tmpfs                   961636      72    961564   1% /dev/shm
/dev/sda1               487652   68525    393527  15% /boot
[root@vcs ~]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2
[root@vcs ~]#
```

②仮想マシンをシャットダウン

③仮想マシン設定の編集
ハードゥエアの追加で、ハードディスクを追加
500GをSCSIで、別ストレージ上
独立型：通常

④仮想マシンをパワーオン

⑤追加後の状態　/dev/sdb　が増えている

```shell-session
[root@vcs ~]# df -k
Filesystem           1K-blocks    Used Available Use% Mounted on
/dev/mapper/vg_vcs-lv_root
                      14225776 4404676   9091808  33% /
tmpfs                   961636      76    961560   1% /dev/shm
/dev/sda1               487652   68525    393527  15% /boot
/dev/sr0               4363088 4363088         0 100% /media/CentOS_6.5_Final
[root@vcs ~]# ls /dev/sd*
/dev/sda  /dev/sda1  /dev/sda2  /dev/sdb
```

⑥仮想ハードディスク上にファイルシステムを作成

```shell-session
# fdisk /dev/sdb


	1. n コマンドで、p(基本パーティション)　 1(パーティション番号)　初期値入力(最初 シリンダ)　初期値入力(Last シリンダ)
	2. p コマンドで確認
	3. w コマンドで書き込み


コマンド (m でヘルプ): m
コマンドの動作
   a   ブート可能フラグをつける
   b   bsd ディスクラベルを編集する
   c   dos 互換フラグをつける
   d   領域を削除する
   l   既知の領域タイプをリスト表示する
   m   このメニューを表示する
   n   新たに領域を作成する
   o   新たに空の DOS 領域テーブルを作成する
   p   領域テーブルを表示する
   q   変更を保存せずに終了する
   s   空の Sun ディスクラベルを作成する
   t   領域のシステム ID を変更する
   u   表示/項目ユニットを変更する
   v   領域テーブルを照合する
   w   テーブルをディスクに書き込み、終了する
   x   特別な機能 (エキスパート専用)

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本パーティション (1-4)
p
パーティション番号 (1-4): 1
最初 シリンダ (1-65270, 初期値 1): 1
Last シリンダ, +シリンダ数 or +size{K,M,G} (1-65270, 初期値 65270): 65270

コマンド (m でヘルプ): p

ディスク /dev/sdb: 536.9 GB, 536870912000 バイト
ヘッド 255, セクタ 63, シリンダ 65270
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x4ec7749b

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sdb1               1       65270   524281243+  83  Linux

コマンド (m でヘルプ): w
パーティションテーブルは変更されました！

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。

# mkfs.ext3 /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
32768000 inodes, 131070310 blocks
6553515 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
4000 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
    102400000

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information:
done

This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
```

⑦マウント

```shell-session
# mkdir /opt/vcs
# mount /dev/sdb1 /opt/vcs
```
⑧fstabへ

```
/dev/sdb1 /opt/vcs ext3 defaults 1 1
```
最終的に、/opt/vcs/mysqlをmysqlの datadirにする
heroku-static-providerを使う際にCDN以外で参照しているファイル名がドット区切りリソースが取得できない

# 環境
<ul>
<li>heroku</li>
<li>http://github.com/nulltask/heroku-static-provider</li>
</ul>
## 現象
[fullPage.js](http://github.com/alvarotrigo/fullPage.js)を取り込んだ静的ページをデプロイし動作確認したところ、一部のスタイルシートとJavaScriptファイルのリクエストが404応答だった。

``` :対応前ディレクトリ構造
current directory
│   .gitignore
│   package.json
│   Procfile
│   server.js
│
└───public
    │   index.html
    │
    ├───css
    │       jquery.fullPage.css ★
    │       style.css
    │
    ├───img
    │       image1.png
    │
    └───js
            jquery.easings.min.js ★
            jquery.fullpage.js ★
            main.js
            scrolloverflow.js
            scrolloverflow.min.js
```
chromeのDevToolで確認したところ、上記★のファイルに404応答があり、デザイン等が崩れた。
## 対応
[Google JavaScript Style Guide 和訳](http://cou929.nu/data/google_javascript_style_guide/)に準じたファイル名に変更した。

``` :対応後ディレクトリ構造
current directory
│   .gitignore
│   package.json
│   Procfile
│   server.js
│
└───public
    │   index.html
    │
    ├───css
    │       fullpage.css ★
    │       style.css
    │
    ├───img
    │       image1.png
    │
    └───js
            easings.js ★
            fullpage.js ★
            main.js
            scrolloverflow.js
            scrolloverflow.min.js
```
Homebrewでいれたpostgresでクエリログを出す


設定ファイル開いて

```
$ vim `brew --prefix`/var/postgres/postgresql.conf
```

以下のような設定にして

```
log_min_duration_statement = 0
```

再起動

```
$ brew services restart postgres
```

これでクエリログが全部流れる

```
$ tail -f `brew --prefix`/var/postgres/server.log
```
サーバからのメールで落ちてるサーバを通知センターに表示するAppleScript

遠隔地のサーバから毎日生きてる通知がくるけど、知りたいのは**落ちてるサーバ！**
50も通知くるのに確認しきれない！ との声が聞こえたのでちょっと書いてみました。

## 準備
| 変数 | 内容 |
|:--|:--|
| **Servers**   | 通知がくるサーバのアドレスを登録してください。  |
| **containSubject**  | サーバからのメールと識別できる一意の文字列を登録してください。  |
| **moveBox**   | 受信ボックスから移動するメールボックス名を設定してください。<br>※毎回作るようにしていますが、一度作ってしまえばコメントアウトした方がいいかもしれません。  |

テスト環境で動作確認をしている際、メールを移動させてもスクリプトからは受信箱に残ったままと認識される謎の挙動に遭遇したのですが、別の環境では大丈夫そう……
OS X 10.9.5にて
 


```AppleScript


set Servers to {"aaa@aaa.aa", "bbb@bbb.bb", "job@xxx.xx"}
set containSubject to "サーバ報告"
set moveBox to "ServerMail"
set errServer to ""

tell application "Mail"
	
	set senderMails to sender of every message in inbox whose subject contains containSubject
	set senderMailsList to senderMails as string
	
	set countMails to count of senderMails
	set countServers to count of Servers
	
	--受信メールが0ではなく、設定サーバ数より少ない
	if countMails is not 0 and countMails < countServers then
		repeat with i from 1 to countServers
			
			set aServer to item i of Servers
			
			if aServer is not in senderMailsList then
				--display dialog "含まない"
				set errServer to errServer & aServer & return
			else
				--display dialog "含む"
			end if
			
		end repeat
		
		--移動用mailBox作成
		my newMailBox(moveBox)
		
		--受信メールを移動
		my moveMsg(containSubject, moveBox)
		
		--異常サーバの通知
		my msg(errServer)
		
	end if
	
end tell


on msg(errServer)
	my notification("サーバエラー", "", "下記のサーバが落ちているようです" & return & errServer)
end msg


on notification(aTitle, aSub, aMessage)
	tell application "System Events"
		tell process "通知センター"
			
			display notification aMessage with title aTitle subtitle aSub
			
		end tell
		
	end tell
end notification


on newMailBox(moveBox)
	tell application "Mail"
		try
			make new mailbox with properties {name:moveBox}
		end try
	end tell
end newMailBox


on moveMsg(containSubject, moveBox)
	tell application "Mail"
		
		set Mails to a reference to (every message in inbox whose subject contains containSubject)
		move Mails to mailbox moveBox
		
	end tell
end moveMsg


```