OmniAICreator/Qiita-1.07M huggingface dataset:
AWS EC2でメモリ利用率をCloud Watchで監視する

EC2はCPU使用率やネットワークI/Oといった値を5分毎にCloudWatchへ送信しているため、その値に対してアラームを設定することで監視を行うことが可能です。

ただし、デフォルトではメモリ利用率はCloudWatchへデータを送信するようになっていません。
これを行うにはAmazonが提供しているサンプルスクリプトを利用して自分で設定する必要があります。

今回はその手順をまとめます。

## 監視対象のインスタンスにSSHログイン

```rb

ssh -i ~/.ssh/xxx.pem ec2-user@インスタンスのグローバルIPアドレス
```

## 必要なパッケージをインストール

```rb

sudo yum -y install perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https
```

## スクリプト用ディレクトリの用意

スクリプト用のディレクトリを作成して移動します。

```rb

sudo mkdir /usr/local/cloudwatch
cd /usr/local/cloudwatch
```

## スクリプトのダウンロード・解凍

```rb
sudo wget http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip
sudo unzip CloudWatchMonitoringScripts-1.2.1.zip
sudo rm CloudWatchMonitoringScripts-1.2.1.zip
```

## 設定ファイルの作成

```rb
cd aws-scripts-mon
sudo cp awscreds.template awscreds.conf # 雛形からコピーして設定ファイルを作成
sudo vi awscreds.conf
```

作成した設定ファイルに管理しているAWSアカウントのアクセスキーIDとシークレットキーを記入します。

```rb
AWSAccessKeyId=[アクセスキーID]
AWSSecretKey=[シークレットキー]
```

## cronにメモリ利用率を送信する設定を行う

```rb
crontab -e
```

crontabに以下記述を追加

```rb
*/5 * * * * /usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail --from-cron
```

## 送信したデータを確認する

![CloudWatch_Management_Console.png](https://qiita-image-store.s3.amazonaws.com/0/33823/43f06f89-001f-c8c2-0f36-6c27b55ea8d9.png)

設定を終えてしばらくしてから、
CloudWatchを開くと左下にLinuxシステム(英語表記はLinux System)という項目が追加されています。

ちゃんと設定できていれば、ここにメモリ利用率(mem-util)、利用メモリ量(mem-used)、利用可能メモリ量(mem-avail)の推移がグラフで表示されるようになります。

今回設定した内容はデフォルトの値ではなく、カスタムメトリクスの扱いになるのでアラームの設定はEC2の画面からではなく、CloudWatchのLinuxシステムの画面から設定する点に注意してください。

他にも同様の手順で、ディスク利用量を監視することも出来ます。次はそちらも試してみようと思います。

何か間違っていたり、もっと良い方法があればぜひコメントで教えて下さい！

## 追記

上記の手順をシェルスクリプト化してみた

```bash
#!/bin/sh
sudo yum -y install perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https
sudo mkdir /usr/local/cloudwatch
cd /usr/local/cloudwatch
sudo wget http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip
sudo unzip CloudWatchMonitoringScripts-1.2.1.zip
sudo rm CloudWatchMonitoringScripts-1.2.1.zip
cd aws-scripts-mon
sudo touch awscreds.conf
sudo chmod 777 awscreds.conf
sudo echo -e "AWSAccessKeyId=[アクセスID]\nAWSSecretKey=[シークレットキー]" > awscreds.conf
sudo touch cron.txt
sudo chmod 777 cron.txt
sudo echo '*/5 * * * * /usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail --from-cron' > cron.txt
crontab cron.txt
sudo rm cron.txt
```

実際にリクエストした内容の結果を知りたい場合は`--verbose`オプションをつける

```rb
/usr/local/cloudwatch/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail --verbose
```

## 参考にしたサイト

Amazon EC2 インスタンスのモニタリングスクリプト - Amazon Elastic Compute Cloud http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/mon-scripts.html

Amazon ClouldWatchで始めるAWSのリソース監視、はじめの一歩
http://codezine.jp/article/detail/8100
Railsのform入力画面で、submit前に移動しようとした時に警告を出す

試行錯誤に時間がかかったので、備忘録を兼ねて共有します。

#方法

- 警告を出したいformの変更を認識する
- 編集中の場合、aタグがクリックされた時に警告を出す
- 編集中の場合、ブラウザのタブが閉じられようとしたときに警告を出す

````app/views/someform.html.erb
<%= form_tag some_path, class: 'warning-before-move' do %>
  ....
<% end %>
````

````app/assets/javascripts/form_warning_before_move.js
var unsaved
var formWarningMessage = "登録・保存していない入力内容は破棄されますがよろしいですか？"

$(document).on('ready page:change', function(){
  unsaved = false

  //変更の認識
  if( $('form.warning-before-move').length > 0 ){
    $('input, textarea, select').on('change', function(){
      console.log('changed')
      unsaved = true
    })
  }

  //aタグクリック時の警告
  $('a').click(function(e){
    var href = $(this).attr('href')
    if(typeof(href) !== "undefined" && href != '#' && unsaved){
      if(confirm(formWarningMessage) == false){
        e.preventDefault()
      }
    }
  })
})

//ブラウザのタブを閉じようとした時、またはturbolinks以外のリンクをクリックした時の警告
$(window).on('beforeunload', function(){
  if(unsaved){
    return formWarningMessage
  }
})
````

#課題
`data-no-turbolinks="true"`を設定しているaタグをクリックした場合、警告が2回出ます。
解決方法が分かる方が居れば、教えてもらえると嬉しいです。

以上です。

#参考
http://www.railsmine.net/2013/11/javascript-alert-for-unsaved-changes-turbolinks-jquery.html
https://github.com/rails/turbolinks
http://stackoverflow.com/questions/11844256/alert-for-unsaved-changes-in-form
http://stackoverflow.com/questions/3252730/how-to-prevent-a-click-on-a-link-from-jumping-to-top-of-page-in-jquery
Xampp＠CentOS7 に Mroonga を導入するメモ

XAMPP for Linux + CentOS7 Linux 64bit環境に groonga/mroonga を導入した記録．
（特に面倒・複雑な部分はありません．）

# 導入環境
* OS: CentOS Linux release 7.1.1503 (Core) x86_64
* XAMPP: XAMPP 5.6.3
* XAMPPインストール先: /opt/lampp

# 0.必要なパッケージの導入
```
% sudo yum install -y wget tar gcc-c++ make mecab-devel
% sudo yum install -y cmake ncurses-devel
```

# 1. MySQLの準備
* 事前にMySQLのSourceを取得
* XAMPP(5.6.3) の場合，mysql-5.6.21 なので， mysql-5.6.21.tar.gz を用意
* **※ MySQL は make するだけで make install はしない**

```
% tar xvzf mysql-5.6.21.tar.gz
% cd mysql-5.6.21
% cmake && make
```

# 2. Groongaの導入
```
% wget http://packages.groonga.org/source/groonga/groonga-5.0.3.tar.gz
% tar xvzf groonga-5.0.3.tar.gz
% cd groonga-5.0.3
% ./configure --prefix=/opt/lampp --libdir=/opt/lampp/lib/mysql --with-package-platform=redhat
% make
% sudo make install
```


# 3. Mroongaの導入
```
% wget http://packages.groonga.org/source/mroonga/mroonga-5.02.tar.gz
% tar xvzf mroonga-5.02.tar.gz
% cd mroonga-5.02
% PKG_CONFIG_PATH=/opt/lampp/lib/mysql/pkgconfig/ \
  ./configure\
 	 --with-mysql-source=/****/mysql-5.6.21\
	 --with-mysql-config=/opt/lampp/bin/mysql_config\
	 --prefix=/opt/lampp
% make
% sudo make install
% mysql -u root -p < /opt/lampp/share/mroonga/install.sql 
```
**configure の option に注意してください**

これで完成です :laughing:
wheneverをupdateしたらopsworksのデプロイフックでコマンドが通らなくなった時の取り急ぎの対応

wheneverをupdateして`0.9.4`になったらopsworksのデプロイフックでコマンドが通らなくなった。

具体的には`bundle exec whenever -w`を実行すると以下のエラーがでた。

```
/home/deploy/.bundler/【app名】/ruby/2.1.0/gems/whenever-0.9.4/lib/whenever/numeric_seconds.rb:12:in `gsub': invalid byte sequence in US-ASCII (ArgumentError)
```

ちょっと調べてみると以下の記事に`LC_ALL`と`LANG`を設定すると動くよ〜という記述を発見
http://shiro-16.hatenablog.com/entry/2015/02/17/000715
※ このページ内で「invalid byte」で検索すると該当箇所がわかります。

なので、デプロイフックのソースを以下の様に修正

```
env = node[:deploy][【app名】][:rails_env]
current_release = release_path

execute "whenever -w" do
  cwd current_release
  command "bundle exec whenever -w"
  environment(
      'RAILS_ENV' => env
  )
end
```

↓

```
env = node[:deploy][【app名】][:rails_env]
current_release = release_path

execute "whenever -w" do
  cwd current_release
  command "bundle exec whenever -w"
  environment(
      'RAILS_ENV' => env,
      'LANG' => 'ja_JP.UTF-8',
      'LC_ALL' => 'ja_JP.UTF-8'
  )
end
```

これでエラーなく通った！
APKに含まれているAndroidManifest.xmlの内容を確認する


```
$ {android-sdk}/build-tools/{version}/aapt dump xmltree hoge.apk AndroidManifest.xml
```


# Unity の PlayerSetting との関連

## Unity : BundleIdentifier

```
A: package="com.hoge.fuga" (Raw: "com.hoge.fuga")
```

## Unity : Bundle Version

```
A: android:versionName(0x0101021c)="2015.05.26" (Raw: "2015.05.26")
```

## Unity : Bundle Version Code

```
A: android:versionCode(0x0101021b)=(type 0x10)0x3
```

## Unity : Minimum API Level

```
A: android:minSdkVersion(0x0101020c)=(type 0x10)0x10
```

16 (0x00000010) は Android 4.1 を指す。
各バージョンを表す値は以下のページ参照

http://developer.android.com/reference/android/os/Build.VERSION_CODES.html
CentOSでLinuxカーネルヘッダー違いでVirtualBox DKMS 起動がこける時の対応

CentOS7にVirtualBoxを入れて起動しようとするとこういうエラーが出た


```
[root@~]#  service vboxdrv setup
Stopping VirtualBox kernel modules                         [  OK  ]
Uninstalling old VirtualBox DKMS kernel modules            [  OK  ]
Trying to register the VirtualBox kernel modules using DKMSError! echo
Your kernel headers for kernel 3.10.0-229.el7.x86_64 cannot be found at
/lib/modules/3.10.0-229.el7.x86_64/build or /lib/modules/3.10.0-229.el7.x86_64/source.
                                                           [FAILED]
  (Failed, trying without DKMS)
Recompiling VirtualBox kernel modules                      [FAILED]
  (Look at /var/log/vbox-install.log to find out what went wrong)

```

どうやらカーネルのバージョンとカーネルヘッダーが違う！と起こってるらしいのだがバージョンはあってるのに、末尾が微妙に違う様子

unameのカーネル
`` [root]# uname -a
Linux 157-7-109-110 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux ``

カーネルヘッダーの場所

``
[root]# ls /usr/src/kernels/3.10.0-229.4.2.el7.x86_64/
Kconfig   Module.symvers  arch   crypto   firmware  include  ipc     lib  net      scripts   sound  usr   vmlinux.id
Makefile  System.map      block  drivers  fs        init     kernel  mm   samples  security  tools  virt
``

* unameカーネル 3.10.0-229.el7.x86_64
* カーネルヘッダー 3.10.0-229.4.2.el7.x86_64

ln -s　でカーネルヘッダーのショートカットを作ると解決できます

``ln -s /usr/src/kernels/3.10.0-229.4.2.el7.x86_64 /usr/src/kernels/3.10.0-229.el7.x86_64``


```
[root kernels]#  service vboxdrv setup
Stopping VirtualBox kernel modules                         [  OK  ]
Uninstalling old VirtualBox DKMS kernel modules            [  OK  ]
Trying to register the VirtualBox kernel modules using DKMS[  OK  ]
Starting VirtualBox kernel modules                         [  OK  ]
```
Ruby proxy認証下でmechanizeを使用 プロキシ認証IDに@を含む場合

proxy認証下でmechanizeを使用する
加えてプロキシ認証IDに@を含む場合、IDに含まれる@を%40にエスケープする必要がある
参考コードは下記の通り


require 'mechanize'

agent = Mechanize.new
agent.set_proxy('プロキシ名', ポート, 'test%40jp.test.com', 'パスワード')
agent.user_agent_alias = 'Windows IE 9'
page = agent.get('http://yahoo.co.jp')
p page.links #確認用

<version>
ruby 2.1.5

<備考>
(IDエスケープ前)
test@jp.test.com
(IDエスケープ後)
test%40jp.test.com

何故か小一時間実行時に認証エラーになりハマった
そして何故かいきなり実行エラーが消えた
Google Chart APIでQRコード画像を簡単に生成

PCサイトからスマホサイトに誘導したいとか、未だにQRコードが結構便利だったりしますよね。

##現在のページのQRコード画像生成用PHPスニペット（適当）
```html

<img id="qr_code" src="http://chart.apis.google.com/chart?cht=qr&chs=300x300&chl=<?php echo (empty($_SERVER["HTTPS"]) ? "http://" : "https://") . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"] ?>">
```

## 参考
https://google-developers.appspot.com/chart/infographics/docs/overview

あれ・・・このAPI非推奨になってるぽい？(汗)
Bitbucket x TrelloでターダーでWikiとIssueTrackingとタスク管理と。

とりあえずお金無いし、個人的 or 少数でやるなら十分だと思うし自分はこうしてる
結論から先に書くと

- ソース管理　=> Bitbucket
- Issue Tracking => Bitbucket
- ドキュメント管理 => Bitbucket Wiki
- タスク管理 => Trello
- IssueのTrelloへの転送 => zapier

以上である。

~~~
※改めて言うがあくまて個人レベル。
  大規模ならもっといいやり方は沢山あるしお金払って使えばいいと思うｗ
~~~

さて。導入も簡単なのでサクッと紹介

# 導入手順
## 手始めに
これらのサービスで使うメールアドレスだけは準備しましょう。
Gmailなんかでいいでしょう。え？増やしたくない？

YourAdress+ForProject@gmail.com

とかもうエイリアス使えばいいよ。

## Bitbucket導入
https://bitbucket.org/
ここに行くともう書いてありますね。

<b>Get started for free</b>

free。なんていい響きなんでしょう。
ここクリックして登録しましょう！するとすぐに使えます！イケメン！

## Wiki、IssueTracking導入
まずはRepositoryを作りましょう。なんでもいいです。
そして設定を開きます。

左バー -> 設定アイコン -> Wiki設定
 Wikiを使用しないから自分で使いたいモードに。ここでは非公開Wiki
![SYaaS   Tutorial   管理者   Wiki 設定 — Bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/10843/8de9b04e-64da-cc96-52f6-c4c3227c1507.png)

左バー -> 設定アイコン -> 課題管理の設定
ここでも課題トラッカーなしから非公開の課題トラッカーに
![SYaaS   Tutorial   管理者   課題管理の設定 — Bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/10843/ef02edbb-036d-af49-8a5b-544df1498c23.png)

以上！後は簡単にWikiもIssueも作れますね！便利！
ただWiki内のIssueリンクが本当にタダのリンクで味気ない。ちょっと残念
![SYaaS   Tutorial   wiki — Bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/10843/4d9d2d2a-da93-893b-8fb8-69815ce45b50.png)

↓↓↓

![SYaaS   Tutorial   wiki   Home — Bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/10843/b01b2e1c-ab6b-b7d3-0f07-4f87c86781f7.png)

## Trello導入
https://trello.com に行きましょう

ここに行くともう書いてありますね。

<b>Sign Up – It’s Free.</b>

free。なんていい響きなんでしょう
ここクリックして登録しましょう！するとすぐに使えます！イケメン！(2度目)

とりあえずここではテストボードとリストを作っておきます。こんな感じ
![test board   Trello.png](https://qiita-image-store.s3.amazonaws.com/0/10843/c550b9c2-3ecd-ff30-146b-db924c886c85.png)

まだなにもカードがない。うん。

## zapierによる連携
これがまだイマイチ知られてないかも。
でもタダだよ。

https://zapier.com/

ここに行きましょう！
あれ！Freeって書いてない！？嘘です。ちょっと下にスクロールするとありますね。

<b>Start FREE Today</b>

はい、ポチポチっと登録しましょう。簡単だなぁほんと。

そして次。下記のリンクで連携するよ！

https://zapier.com/zapbook/bitbucket/trello/

![Explore   Zapier.png](https://qiita-image-store.s3.amazonaws.com/0/10843/831f2e28-54eb-c262-e683-6c01beafa752.png)

画像の中の赤枠をクリック！すると

![Editor   Zapier.png](https://qiita-image-store.s3.amazonaws.com/0/10843/54e55e48-8ed4-1f9e-6cb6-cf18ef14b551.png)

こんな画面！ここであとは手順通りにこれまで作ったBitbucketとTrelloのアカウントをつなげていきます！

これが完了すると！
なんと！

Bitbucketで作ったIssueが！！
![SYaaS   Tutorial   課題2 — Bitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/10843/76a46c87-f93d-9bee-de1c-7c07a304ddda.png)


連携されたよーーー！※First Issueは連携前に作ったIssue
![test board   Trello2.png](https://qiita-image-store.s3.amazonaws.com/0/10843/c6d3833c-4e4b-f75c-e415-14a0b9f30654.png)

コンテンツもちゃんと反映されてる！
![Second Issue on test board   Trello.png](https://qiita-image-store.s3.amazonaws.com/0/10843/aa1c11ac-4288-dee4-1bb1-6231d6f8a128.png)

以上！！！

# あとがき
Bitbucket や Trello、Zapierは全て無料で使えます。
が、一部機能が制限されていたりします。

リポジトリもっと作りたい！とか大人数で使いたい！ならBitbucketにお金を払いましょう。
ZapierもTrelloもお金を払うと連携頻度等様々な機能が拡張されます。

お金が全てなのよ！世の中は！

じゃ、殴り書きでした。あばよ！
illuminate/CacheをLaravelフレームワークの外で使う方法


Laravelのilluminateはコンポーネント化されていて、PHPでちょっとしたプログラムを書くときや、Wordpressのプラグイン作る時とかcomposerでインストールして使うと便利ですよね。

今回は`illuminate/Cache`を単独で使おうとした時に、4.x時代と使い方が変わっていたのでそのメモです。

## まずはcomposerにrequire

```
composer require illuminate/cache:5.0.* illuminate/filesystem:5.0.*
```

適切な場所で`vendor/autoload.php`のインクルードも忘れずに。

```
require 'vendor/autoload.php';
```


## Laravel4系のilluminate/Cacheまで

CacheManagerのコンストラクタに配列で設定すればOKでした。

```php
$app = [
    'config' => [
        'cache.driver' => 'file',
        'cache.path' => 'path/to/your/cachedir'
        'cache.prefix' => 'your_app_name'
    ]
];

$cacheManager = new CacheManager($app);
$cache = $cacheManager->driver();

$cache->put(/* stuff */);
```

## Laravel5系のilluminate/Cache

CacheManagerのコンストラクタにコンテナを設定してあげる必要があります。

```php
$app = new Illuminate\Container\Container();
$app->singleton('files', function () {
    return new Illuminate\Filesystem\Filesystem();
});
$app->singleton('config', function () {
    return ['cache.default' => 'files', 'cache.stores.files' => ['driver' => 'file', 'path' => 'path/to/your/cachedir']];
});

$cacheManager = new CacheManager($app);
$cache = $cacheManager->driver();

$cache->put('test', 'stuff', 5);
```

### キャッシュドライバを限定して使うならもっとシンプルに

```php
$filestore = new \Illuminate\Cache\FileStore(new \Illuminate\Filesystem\Filesystem(), 'path/to/your/cachedir');
$cache = new \Illuminate\Cache\Repository($filestore);

$cache->put('test', 'stuff', 5);

```
同じ要領で DB, Memcached, Redisがキャッシュドライバとして使えるかと思います。
Swift でキーボードをタッチイベントで隠す

UITextField/UITextView などの入力箇所以外でキーボードを「Tap Gesture Recognizer」を利用して隠します。「Tap Gesture Recognizer」はジェスチャーを感知して処理を行う時に使うようです。

# Storyboard で必要なViewにTap Gesture Recognizerを配置

![xcode.gif](https://qiita-image-store.s3.amazonaws.com/0/21321/f62f59dd-588e-c408-dec5-52542e9b51fc.gif)


# Storyboard で Tap Gesture Recognizer と処理を結びつける

## 紐づるける処理

```swift:AddController.swift
    @IBAction func tapScreen(sender: UITapGestureRecognizer) {
        self.view.endEditing(true)
    }
```

## Xcode の操作

![xcode2.gif](https://qiita-image-store.s3.amazonaws.com/0/21321/623a6587-e1f4-d753-bde6-fb557692776d.gif)

## 結果

* Sent Acitions に紐付けたswiftファイルの名前？Class名が出ている

# 環境

* Xcode 6.3
* Swift 1.2
* iOS 8
不要なプリンターを削除

Canon LBP3910のプリンターをクライアントから削除したいです。
会社でCanon LBP3910を退役させて、Canon LBP8710eを導入しました。
しかし、営業中に社員のPCを拝借して設定するのはできるだけ避けたい。

コマンド一発で削除できればいいんだけどなぁ。

##Win32_Printerが適えてくれるよ
Powershell v3.0からは Get-WmiObject というCmdletで、
Win32_Printerを呼び出し、
プリンターの一覧を取得することができる。

その中から該当するプリンターを選び出し削除することもできる。

やり方は下記のスクリプトの通り

```ps1:printerdel.ps1
# プリンター一覧を取得
$printerlist=Get-WmiObject Win32_Printer
# LBP3910 という名前を含むプリンターを選んで $delprinterlist に格納
$delprinterlist=$printerlist | Where-Object Name -match "LBP3910"
# Delete()を実行して該当するプリンターをすべて削除
$delprinterlist.Delete()
```

Win32_PrinterDriver(プリンタードライバー)でも
Win32_TcpIpPrinterPort(プリンターポート)でも同じような作業で、
削除や編集ができる。

```ps1:プリンターポートの変更
# プリンターポートをすべて取得
$ports = Get-WmiObject Win32_TcpIpPrinterPort
# 変更したいプリンターポートを取得
$port = $ports.get(0)
# Name部分を変更
$port.Name=60
# 変更を実行
$port.add()﻿
```
Cocos2d-xでのバイナリ列の音源再生

結論から言ってしまうと、半分妥協で、ある程度目的は達成できたということで備忘録として書いておく。

まずは、問題点として、cocos2d-xでzip内に入っている音源をzipから解凍せずに読みたかったんです。
そこで、調べてみるとどうやらcocos2d-xでは音源の再生にSimpleAudioEngineを使うようだ。

しかし、これ問題があって（私が分からないだけでもしかしたらほんとはやり方あるのかも...）、

**引数にバイナリ列を入れて再生、ってのができない！！！**

これじゃ、FileUtil::getInstance()->getFileDataFromZipからとってきたデーター再生できないじゃん。わざわざローカルに解凍して読むのも負けた気がするしどうしよう。

ってなり色々考えてもうOpenALで再生機能書けばいいかとなり今に至ります。

この辺を参考にさせていただきました。
http://nullpot.blog.fc2.com/blog-category-16.html


一応以下がコードになっていて

```C++:playVoice.h
#import <OpenAL/al.h>

class playVoice{
public:
    playVoice();
    void decodeBinary(unsigned char* buff, unsigned long bufLength);
    void playData();
private:
    ALuint dataBuff;
};
```

```C++:playVoice.mm
#include "playVoice.h"
#include <OpenAL/alc.h>
#import <AVFoundation/AVFoundation.h>

playVoice::playVoice(){
    ALCdevice *device = alcOpenDevice(NULL);
    if(device){
        ALCcontext *context = alcCreateContext(device, NULL);
        alcMakeContextCurrent(context);

    }
    
    
}

void playVoice::decodeBinary(unsigned char* buff, unsigned long bufLength){
   
    ALuint buffer;
    alGenBuffers(1, &buffer);
    alBufferData(buffer, AL_FORMAT_MONO16, buff, bufLength, 44100);

    
    dataBuff = buffer;
}

void playVoice::playData(){
    ALuint soundSource;
    
    alGenSources(1, &soundSource);
    alSourcei(soundSource, AL_BUFFER, dataBuff);
    alSourcePlay(soundSource);
}
```
それで呼び出し方は

```C++:main.cpp
#include "playVoice.h"
#import "external/unzip/unzip.h"

int main()
{
 /*
   省略
 */
  unsigned long pSize=0;
  unsigned char* soundData = FileUtils::getInstance()->getFileDataFromZip("zipファイルのパス", "ここに音源ファイルが入るよ", (ssize_t*)&pSize);
  unsigned long soundLong = pSize;

  playVoice *voice=new playVoice();
  voice->decodeBinary(soundData, soundLong);
  voice->playData();
}
```

って感じで再生行いました。

ただ、問題あって音源ファイルがcafじゃないとダメなんだよね。

誰か、mp3から読む方法知ってたら教えてください。
Facebook、Twitterのシェア数を取得する

URL渡したらFacebook、Twitterのシェア数取得できるようなAPIないかなぁと思ったらあったのでメモ。

**APIは予期せずドラスティックに変更されるので、突然使えなくなる可能性があります。もし使えなかったらコメントか編集リクエストをもらえると助かります。**

# Facebook
[FQL](https://developers.facebook.com/docs/reference/fql/)を使います。

## Request
```url
https://graph.facebook.com/fql?q=SELECT url, normalized_url, share_count, like_count, comment_count, total_count,commentsbox_count, comments_fbid, click_count FROM link_stat WHERE url='http://konifar.hatenablog.com/entry/2015/05/02/003449'
```

## Response (json)
```json
{
   "data": [
      {
         "url": "http://konifar.hatenablog.com/entry/2015/05/02/003449",
         "normalized_url": "http://konifar.hatenablog.com/entry/2015/05/02/003449",
         "share_count": 499,
         "like_count": 2073,
         "comment_count": 390,
         "total_count": 2962,
         "commentsbox_count": 0,
         "comments_fbid": "948279871872016",
         "click_count": 0
      }
   ]
}
```

ソーシャルボタンで表示されているのは `total_count` なのでそれを使えばいいはずです。


# Twitter
Twitterのcount APIを叩きます。

## Request
```url
https://cdn.api.twitter.com/1/urls/count.json?url=http://konifar.hatenablog.com/entry/2015/05/02/003449
```

## Response (json)
```json
{
    "count":2133,
    "url":"http:\/\/konifar.hatenablog.com\/entry\/2015\/05\/02\/003449\/"
}
```

以上。
指定した時点での gem のバージョンを調べる


StackOverflow や blog を見てると "gem を最新にしたら..." などの記述がしばしばあるが、そのときの最新のバージョンが何なのか書かれていない事がある。

gem のバージョンとリリースされた日付の一覧は `https://rubygems.org/gems/[gem name]/versions` で見ることができる ([例: rails](https://rubygems.org/gems/rails/versions)) ので、記事の日付からそのときの最新のバージョンを特定できる。

が、面倒なのでスクリプト書いた。rubygems.org の API を使う gems という gem を使っている。


```ruby
#!/usr/bin/env ruby
# Usage: ./find_gem_version_at.rb GEM_NAME DATETIME_AS_ISO8601 [REQUIREMENT]
gem "gems", "~> 0.8.3"
require "gems"
require "time"

name, at, requirement = ARGV
at = Time.parse(at)
requirement ||= ">= 0"
requirement = Gem::Requirement.create(requirement)

$stderr.puts "Find gem `#{name}` (#{requirement}) at #{at.iso8601}"

versions = Gems.versions(name)
found = false

versions.each{|v|
  v["built_at"] = Time.parse(v["built_at"]).getlocal
  v["number"] = Gem::Version.create(v["number"])
}.select{|v|
  requirement.satisfied_by?(v["number"])
}.map{|v|
  if !found && v["built_at"] < at
    found = true
    [true, v]
  else
    [false, v]
  end
}.each{|(latest, v)|
  line = "#{v["number"]} (#{v["built_at"].iso8601})"
  if latest
    puts "> #{line}"
  else
    puts "  #{line}"
  end
}
```

こんな感じで使える。

```bash
# rails gem の 2015年1月1日時点の最新のバージョンを調べる
$ ./find_gem_version_at rails 2015-01-01
Find gem `rails` (>= 0) at 2015-01-01T00:00:00+09:00
  4.2.1 (2015-03-19T09:00:00+09:00)
  4.2.1.rc4 (2015-03-12T09:00:00+09:00)
  4.2.1.rc3 (2015-03-02T09:00:00+09:00)
  4.2.1.rc2 (2015-02-25T09:00:00+09:00)
  4.2.1.rc1 (2015-02-20T09:00:00+09:00)
> 4.2.0 (2014-12-20T09:00:00+09:00)
  4.2.0.rc3 (2014-12-13T09:00:00+09:00)
  4.2.0.rc2 (2014-12-05T09:00:00+09:00)
  4.2.0.rc1 (2014-11-28T09:00:00+09:00)
...

# Rails 3 系だけに絞る
$ ./find_gem_version_at rails 2015-01-01 '~> 3.0'
Find gem `rails` (~> 3.0) at 2015-01-01T00:00:00+09:00
> 3.2.21 (2014-11-16T09:00:00+09:00)
  3.2.20 (2014-10-29T09:00:00+09:00)
  3.2.19 (2014-07-02T12:00:00+09:00)
  3.2.18 (2014-05-06T09:00:00+09:00)
  3.2.17 (2014-02-18T12:00:00+09:00)
  3.2.16 (2013-12-03T09:00:00+09:00)
  3.2.15 (2013-10-16T09:00:00+09:00)
...
```
GitLab 7.10.x (GitLab CI)に対してLogjam脆弱性対応を行なう

[GitLab](https://about.gitlab.com)のオールインワンパッケージGitLab CE Omnibus packageにも[Logjam脆弱性](https://weakdh.org/)が存在しており、GitLab CE/GitLab CI 7.10を運用している環境に対して、その対応を行なう。

GitLab CEのみならず、GitLab CIを利用している場合は[Security Advisory for Logjam Vulnerability](https://about.gitlab.com/2015/05/21/security-advisory-for-logjam-vulnerability/)に記載されている手順ではGitLab CI側への反映がされないので、この手順が必要になる。

## 前提
```
$ rpm -q gitlab-ce
gitlab-ce-7.10.0~omnibus.2-1.x86_64
```

GitLab CEとGitLab CIを有効化している場合、GitLab CI単体を有効にしている前提。

## 作業

### 1. 設定変更
```
# Workaround for packages prior to version 7.11.0
nginx['custom_gitlab_server_config'] = "ssl_dhparam /etc/gitlab/ssl/dhparams.pem;\n"
ci_nginx['custom_gitlab_ci_server_config'] = "ssl_dhparam /etc/gitlab/ssl/dhparams.pem;\n"
```
を``/etc/gitlab/gitlab.rb``に追記する。

### 2. 設定反映
```
$ sudo gitlab-ctl reconfigure
```
を実行すると、``nginx``の設定ファイルが更新され、``nginx``プロセスの``restart``が実施される。

### 3. 確認
[https://weakdh.org/sysadmin.html](Logjam脆弱性のチェッカー)などで確認する。

## 参考
- https://weakdh.org/
- https://about.gitlab.com/
TwitterのGeo付きツイートをCSVで保存、GoogleMapへプロットしてみる。

とりあえず知識不足でSTREAMING APIからどうやってロケール絞るとか分からないわけです。
というわけで普通にSearchを使って、「なう」「i'm at」を拾ってプロットしようと。

１．以前作ったTwitterサーチ用のPythonスクリプトでCSVデータを作成
２．GoogleMap APIを使ってJavascriptでマップ表示
３．そこにプロット

という感じでやりました。

```
for tweet in tweets["statuses"]:
	User = (tweet["user"]["screen_name"].encode("utf-8"))
		try:
			Place = (tweet["place"]["bounding_box"]["coordinates"])
					
			flat_list = []
			for e in Place:
				flat_list.extend(e)
    	
			flat_list2 = []
			for b in flat_list:
				flat_list2.extend(b)
 
			flat_list3 = []
			for c in flat_list:
				flat_list3.extend(c)
    	
			geolng = flat_list3[0]
			geolat = flat_list3[1]
		except:
			pass
```

まぁこういう感じでPlaceだけtryでひろおう、と。

```
Place = (tweet["place"]["bounding_box"]["coordinates"])
```

で取ってくるとリストがネストされまくりなので flat_listでネストを解除。
いや、本当美しくない処理ですよね・・・。

取得したデータをCSVで書き出しして地図へプロット。

![alt](http://www.in-ga.net/qiita/map.jpg)

予想通りというか首都圏が多いです。
地方の人はあんまり位置付きでツイートしないのか、それともTwitter人口自体が少ないのか。

あ、絞り込むキーワードがダメなのか。
ansibleでpostgresqlインストール

最近ChefからAnsibleに乗り換えてみたので、AnsibleからPostgresqlをインストールする一連の流れをplaybookにしてみた。

## 手順
1. 必要パッケージのインストール
2. postgresql initdb
3. postgresql start
4. DB作成
5. DBユーザ作成

## playbook
```yaml:main.yml
---
- hosts: all
  sudo: yes
  vars:
    dbuser: "sample-ansible"
    dbpass: "abcdefg"
    dbname: "ansible-db"

  tasks:
  - name: install postgresql
    yum: name={{ item }} state=latest
    with_items:
      - postgresql-server
      - postgresql-devel
      - postgresql-contrib
      - python-psycopg2

  - name: postgresql initdb
    shell: service postgresql initdb

  - name: start postgresql
    service: name=postgresql state=started  enabled=yes

  - name: postgres user sudores
    lineinfile: 
      dest: /etc/sudoers.d/postgres 
      owner: root
      group: root
      mode: 0440
      line: "%vagrant ALL=(postgres) NOPASSWD: ALL"
      state: present
      create: yes
      validate: "visudo -cf %s"

  - name : create database
    postgresql_db: 
      name: "{{ dbname }}"
      encoding: "UTF-8"
      login_user: postgres
    sudo_user: postgres
    sudo: yes

  - name: create user
    postgresql_user: 
      db: "{{ dbname }}"
      name: "{{ dbuser }}"
      password: "{{ dbpass }}"
      priv: ALL
      state: present
      login_user: postgres
    sudo_user: postgres
    sudo: yes

```


## 確認
```bash
[vagrant@postgresql-server ~]$ sudo su - postgres
-bash-4.1$ psql -l
                                      List of databases
    Name    |  Owner   | Encoding |  Collation  |    Ctype    |       Access privileges
------------+----------+----------+-------------+-------------+-------------------------------
 ansible-db | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres
                                                              : postgres=CTc/postgres
                                                              : "sample-ansible"=CTc/postgres
 postgres   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
                                                              : postgres=CTc/postgres
 template1  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres
                                                              : postgres=CTc/postgres
(4 rows)
```

## ポイント
- postgresqlをansibleで操作するために、'python-psycopg2'をインストールする
- postgresユーザを利用するため、sudoresに権限を追加する

今回作成したplaybookを以下リポジトリにあげてます
https://github.com/tatsu07/Sample-ansible-postgresql
OSXの同僚にSSH接続してうざい嫌がらせをするコマンド

よりうざくする方法があったらコメントで教えてください!

# 使い方

1. SSHで誰かのMacOSXにログイン
2. 以下のスクリプトをコピペして実行

* GUIでログインしているアカウントと同じアカウントでないと動きません
* 自分のマシンのターミナルで実験することも可能

```applescript
sh <<SCRIPT
open /
open .
open ~/Desktop
osascript <<EOF
run script hoge
script hoge
	tell application "Finder"
		activate
	
		--ウィンドウをランダムに移動
		repeat with i from 0 to 100
			set position of Finder window 1 to {random number from -500 to 1000, random number from 0 to 500}
			set position of Finder window 2 to {random number from -500 to 1000, random number from 0 to 500}
			set position of Finder window 3 to {random number from -500 to 1000, random number from 0 to 500}
		end repeat
	
		--Text-to-speech
		say "Hey!"

 		-- 画面をチカチカさせる(事前にシステム環境設定で、キーボード>ショートカット>アクセシビリティ>カラーを反転…のショートカットをONにしておく)
		tell application "System Events"
			repeat with j from 0 to 8
				key code 28 using {control down, option down, command down}
			end repeat
		end tell
			
		-- 警告音を鳴らす
		beep
		beep
		beep

		--ダイアログ表示
		set sNum to display dialog "ねえねえどんな気持ち???" with icon stop buttons {"消えろ", "うざい", "もう1回"} default button 1 
		if button returned of sNum = "もう1回" then
		  run hoge
		end if

	end tell
end script
EOF
SCRIPT
```

## 仕組み
osascriptコマンドでうざそうなAppleScriptを実行している。

## 注意事項

* 仕事中に仕掛けるとガチで怒られると思う
Mysqlストレージエンジンまとめ

## 主なストレージエンジン種類(テーブル毎に選択可能)
* MyISA
 * トランザクション無し
 * 主にログ系でDWHとして使用

* InnoDB
 * トランザクション有り
 * 運用テーブルはInnoDB一択

## ストレージエンジンの仕組み
1. クライアントからの接続受付。スレッドバッファを確保し、切断時にキャッシュ保存等
2. クエリキャッシュヒット確認
 * SQLがクエリキャッシュされてたら返す
3. パーサ解析
 * クエリ構文チェック
4. SQL実行計画の決定(オプティマイザ)
 * indexの可否、indexの選択等

## テーブルのファイル構成
レコードのカラム情報や、ストレージエンジン情報等
* /var/lib/mysql/[user_name]/[table_name].frm

insertやupdateされたデータ
* /var/lib/mysql/[user_name]/[table_name].iba

## InnoDBのパフォーマンス向上のためのmy.cnf設定
### OSページキャッシュを使用しない

InnoDBはbuffer_poolにキャッシュする仕組みになっているので、
OSページキャッシュは、オーバーヘッドにしかならないので切る
```
innodb_flush_method = O_DIRECT
```
### バッファプールのサイズを多めに割り当てる

バッファプール確認
```
SHOW VARIABLES LIKE "innodb_%_size"
```
InnoDBはOSページキャッシュを使わず、独自のバッファプールを確保し、テーブルデータをキャッシュするので、
かなり多めに設定する必要がある。
ただし、バッファプール以外にも5〜10%程メモリを使用する為、大体、全体の8割程度に設定しておく。
```
innodb_buffer_pool_size = 32G
```
上記に設定したメモリ容量をOSから割り当てられ、キャッシュする

例えば、以下のDBサーバがあるとする
* メモリ容量
 * 8GB

* テーブルの容量
 * userテーブル :       2GB
 * tweetテーブル :      2GB
 * user_tweetテーブル : 2GB

```
innodb_buffer_pool_size = 6G
```
上記の場合だと、

テーブルの容量が6GB(userテーブル+tweetテーブル+user_tweetテーブル)なので、
全てのテーブルデータがメモリ(バッファプール)に載っかるので、
I/Oが発生せず、高速にデータの更新、参照が可能。


## クエリキャッシュについて
* クエリキャッシュは、更新時にグローバルロックを掛ける為、クエリが多い場合切った方がいい
   * 更新したクエリに影響が出るキャッシュ情報を全てチェックし、削除するためパフォーマンスが出ない

## 参考文献
 * [Webエンジニアのための データベース技術[実践]入門 (Software Design plus)](http://goo.gl/HS0ux)
 * [クエリキャッシュは切ったほうがいいんじゃなイカ？](http://dsas.blog.klab.org/archives/52021866.html)
List<Map<String,Object>>形式の一覧結果をフィルタリングする

# いまさらな感じですが…

業務システムにありがちですが、何かのデータを検索した結果（一覧検索結果）をjava.util.Listなどで持ちます。

このlistには、1件のデータをMap<String,Object>で保持しているとして、さらにコードでフィルタしたい場合を考えます。
検索済みの結果を、再検索することなく表示を切りかえる場合などを想定しています。

## 以前まではforループ書いて頑張ってました

Java7以前では、forループでListの中身を取り出し、Mapに対して処理を記載し、新しいListに詰め直す処理を書いていました。

せっかく今はStream API使えますので、今回はこの処理に使ってみましょう。

```java:SampleFilter.java(抜粋)
public void execute() {
	// JSONで読み取った値をList<Map<String,Object>>に格納したとする
	List<Map<String,Object>> loadData = JSON.decode(jsonData);

	// 
	List<Map<String,Object>> filtered = 
		loadData.stream().filter(
			target -> test(target)
		).collect(
			Collectors.toList()
		);
	log.debug("filtered : {}" , filtered);
}

public static boolean test(Map<String, Object> target) {
	// 引数のMapに対し、何らかの判定処理をここで実装して true/false を返す。
	// trueなら次の条件を続けて実施。
	return true;
}
```

すごく簡素で、修正・拡張する場所もわかりやすいですね d(・ω・)
CentOS 6.5 インストール、初期設定


# はじめに

この文書は、私の開発用環境を構築するためのメモです。

あなたのお役には立たないかも…

# 履歴

2015-05-27 作成

# インストール

1. インストールタイプ
+ Desktop

# 初期設定

1. ip アドレス割り当て
2. ipv6 無効化
2-1. /etc/sysctl.conf に以下の設定を追加
    # ipv6 disable
    net.ipv6.conf.all.disable_ipv6 = 1
    net.ipv6.conf.default.disable_ipv6 = 1
2-2. 下記コマンドで設定を反映
    /sbin/sysctl –p
3. SELinux 無効化
3-1. getenforce コマンドで SELinuxの状態を確認。
    Enforcing   (SELinux 有効)
    Permissive  (SELinux 無効)
3-2. 有効の場合下記コマンドで無効にする。
    setenforce 0
3-3. SELinux設定ファイルを編集。
    vi /etc/sysconfig/selinux
    -SELINUX=enforcing
    +# システム起動時にSELinuxを無効化
    +SELINUX=disabled
4. リポジトリ追加
epel
fedoraプロダクトが提供しているRHEL向けのディストリビューションに適用できるパッケージ。
    yum install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
remi
redisがあったりする。便利。
    yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
ius
Python2.7, PHP5.5、Python3.3、Git 1.8などそこそこ新しいパッケージが入れられる。
    yum install http://dl.iuscommunity.org/pub/ius/stable/CentOS/6/x86_64/ius-release-1.0-11.ius.centos6.noarch.rpm
mysql
MySQL オフィシャル。
    yum install https://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
mariadb
MariaDBオフィシャル。
以下のファイルを/etc/yum.repos.d/ 以下にファイルを作成
    maria.repo
        [mariadb]
        name = MariaDB
        baseurl = http://yum.mariadb.org/10.0.10/centos6-amd64/
        gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
        gpgcheck=1
        postgresql
PostgreSQLオフィシャル。
    yum install http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm
4-1. リポジトリ更新
    yum update
5. リモートデスクトップ設定
5-1. xrdp インストール
    su
    root パスワード
    rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
    sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/epel.repo
    yum --enablerepo=epel install xrdp
5-2. 日本語キーボードの設定
    cd /etc/xrdp/
    wget http://www.mail-archive.com/xrdp-devel@lists.sourceforge.net/msg00263/km-e0010411.ini
    mv km-e0010411.ini km-0411.ini
    ln -s km-0411.ini  km-e0010411.ini
    ln -s km-0411.ini  km-e0200411.ini
    ln -s km-0411.ini  km-e0210411.ini
5-3. サービス設定
5-3-1. システム→管理→サービスを開く。
5-3-2. xrdp を有効にし、起動。
5-4. ファイアーウォール設定
5-4-1. システム → 管理 → ファイアーウォールを開く。
5-4-2. その他のポートを選択し、追加をクリック。
5-4-3. 3389/tcp を選択し OK。
5-4-4. 適用をクリック。
5-4-5. 確認を求められるので はいをクリック。

6. samba
6-1. samba インストール
    yum -y install samba
6-2. システム→管理→サービスを開く。
6-3. smb を有効にし、起動。
6-4. ファイアーウォール設定
6-5. システム → 管理 → ファイアーウォールを開く。
6-6. smb（クライアントも）許可
6-7. smbaユーザ設定
    pdbedit -a ユーザ
    new password: パスワード
    retype new password: パスワード(確認)
6-8. 開発用共有フォルダ作成
    mkdir /var/www/html/dev
    chmod -R a+rwx /var/www/html/dev
6-9. /etc/samba/smb.conf を編集し、末行に追記
    [dev]
       path = /var/www/html/dev
       writable = yes
       guest ok = no
       create mode = 0777
       directory mode = 0777
       share modes = yes
syntax errorが出てもwebpackからエラーが帰ってこない


```
  gulp.task "scripts:compile", [], ->
    conf = require "#{paths.root}/gulp.d/webpack.conf.coffee"
    gulp
    .src "#{paths.src}/bundle/index.coffee"
    .pipe(webpack(conf, null, (err, stat) ->
      console.log err if err
    )).pipe gulp.dest "#{paths.dest}"
```

これで`index.coffee`にめちゃめちゃな文字を書いても `err == null` で帰ってくる。コマンドラインで

```
./node_modules/.bin/webpack --config=./gulp.d/webpack.conf.coffee       
```

するとちゃんとエラーが表示されるのでどうなってるんだとコード見たら `stats.hash` も見ないとダメだそうです。そんなのわかんねっす。

https://github.com/webpack/webpack/blob/master/bin/webpack.js#L176-L179	
# 追記
callback書かなければいい感じに表示してくれた
zsh で特定の文字列を入力すると自動で return を押したことにさせる


## 概要
例えば `ll` と入力すると、勝手に `ls``<Return>` してくれるような代物です。

`bindkey -s "ll" "ls\n"` だと行頭以外でも発動してしまいますが、下記ソースだと行頭で `ll` と入力した場合のみ発動します。

## ソース
`.zshrc` にコピペしてご利用下さい。

```zsh
typeset -A aaaliases
aaaliases=(
  "ll"    "ls"
  "gh"    "gh"
)

self-insert-aa() {
  local self_insert_next
  zstyle -s ":self-insert-aa" self-insert-next self_insert_next

  local aamatch
  local aastroke
  local aacommand
  local aacontext
  local aakey

  aamatch=0
  for aastroke in "${(@k)aaaliases}"; do
    aacommand=$aaaliases[$aastroke]
    aacontext=$aastroke[0,-2]
    aakey=$aastroke[-1]

    if [[ $LBUFFER == $aacontext && $KEYS == $aakey ]]; then
      LBUFFER=$aacommand
      zle .accept-line

      aamatch=1
      break
    fi
  done

  if [[ $aamatch == 0 ]]; then
    zle "$self_insert_next"
  fi
}

self-insert-aa.on() {
  # Find self-insert wrapper
  # reference: knu/zsh-git-escape-magic (https://github.com/knu/zsh-git-escape-magic)
  emulate -L zsh
  local self_insert_next="${$(zle -lL | awk '$1=="zle"&&$2=="-N"&&$3=="self-insert"{print $4;exit}'):-.self-insert}"

  zle -la "$self_insert_next" || zle -N "$self_insert_next"
  zstyle ":self-insert-aa" self-insert-next "$self_insert_next"
  zle -A self-insert-aa self-insert
}
zle -N self-insert-aa
self-insert-aa.on
```

## カスタマイズ
`aaaliases` に「発動のためのキーストローク」「コマンド」の順で入れます。キーストロークとコマンドは必ずしも一致している必要はありませんが、一致している場合でも明示的に並べて書いて下さい。

例えば、上記ソースの `aaaliases` では以下のように置換されます。

- `ll` と入力 → `ls` コマンドを自動確定
- `gh` と入力 → `gh` コマンドを自動確定 (自分は `git history ...` のエイリアスにしています)

## その他
### `ll` とそのまま打ちたくなった場合
- 最初にスペースを入れてごまかせば発動を回避できます
- quoted-insert を呼び出します。多分こっちの方が正しい方法
  - vi mode の場合: `l<C-v>l` と打つ

### url-quote-magic (prezto) と併用する場合
url-quote-magic を先にロードさせて下さい。こちらが後だと url-quote-magic に上書きされてしまいます。

ちなみに、prezto を利用していると自動で url-quote-magic がロードされるようです。こちらも prezto を先にロードさせる必要があるかも知れません。

## 参考
- [knu/zsh-git-escape-magic](https://github.com/knu/zsh-git-escape-magic)
  - `self-insert` が既に置き換えられていた場合の挙動が大変参考になりました
1時間以内に解けなければプログラマ失格となってしまう5つの問題の問題3

#1時間以内に解けなければプログラマ失格となってしまう5つの問題の問題3

##問題3は解けた

###問題3
最初の100個のフィボナッチ数のリストを計算する関数を記述せよ。定義では、フィボナッチ数列の最初の2つの数字は0と1で、
次の数は前の2つの合計となる。例えば最初の10個のフィボナッチ数列は、0, 1, 1, 2, 3, 5, 8, 13, 21, 34となる。
***


```php
echo '<pre>';
print_r(getSumFibonacci([0, 1], 0, 1, 100));
echo '</pre>';

function getSumFibonacci($array, $firstValue, $secondValue, $limit)
{
	if (count($array) == $limit) {
		return $array;
	}
	else {
		$array[] = $firstValue + $secondValue;
		return getSumFibonacci($array, $secondValue, $firstValue + $secondValue, $limit);
	}
}
```
1時間以内に解けなければプログラマ失格となってしまう5つの問題の問題2

#1時間以内に解けなければプログラマ失格となってしまう5つの問題の問題2

##問題2は解けた。array_shiftは遅いけど、とりあえず。

###問題2
交互に要素を取ることで、2つのリストを結合する関数を記述せよ。
例えば [a, b, c]と[1, 2, 3]という2つのリストを与えると、関数は [a, 1, b, 2, c, 3]を返す。
***


```php
$list1 = array('a','b','c','d','e','f');
$list2 = array(1,2,3,4,5,6,7,8,9,10);

echo '<pre>';
print_r($list1);
print_r($list2);
print_r(getAlternationArrayMerge($list1, $list2));
echo '</pre>';

function getAlternationArrayMerge($list1, $list2) {
	$answer = array();
	while(true) {
		if (empty($list1) && empty($list2)) {
			break;
		}
		if($list1) {
			$answer[] = array_shift($list1);
		}
		if ($list2) {
			$answer[] = array_shift($list2);
		}
		
	}
	return $answer;
}
```
Redmine wikiを使いやすくして情報共有をはかどらせる

# TL;DR

wikiの効果や重要さはだれもが理解していると思います。
しかし、運用コストの高さから現実には放置されていることが多いのではないでしょうか？

そんな時はwiki拡張機能（WikiExtension）が効果的です。
読み手の利便性を高め、また発信側の編集へのモチベーションを高める効果があります。

正直メリットしかないと思うので、ぜひ導入しましょう！

WikiExtensionについては[こちら](http://www.r-labs.org/projects/1/wiki/Wiki_Extensions)。


# サマリ

* サイドバーの活用
* フッタの活用
![wiki_sidebar.png](https://qiita-image-store.s3.amazonaws.com/0/6463/d9990b27-7d0e-e852-67f2-17115c423beb.png)


# Sidebarでアクセスしやすくする

WikiExtensionを適用し```Sidebar```ページを作るとサイドバーが有効になります
Sidebarページは単純にWikiページの名前を```Sidebar```にするだけです。
小文字大文字は無視するようです。

r-labsさんのページに有るように、**「リンク集」**、**「アクセス数ランキング」**、**「更新履歴」**、**「タグクラウド」**という鉄板パターンに則ると良いと思います。

リンク集はJenkinsやGitlabやHipChatなどなど開発に使いそうなサービスのリンクを貼っています。
場合によっては社内イントラやFAQなどをリンクさせることも有効です。

アクセスランキング数や更新履歴の表示件数は任意数を指定できますが、表示件数は絞って詳細表示用の別ページを用意することがベストプラクティスです。
あくまでトップページの情報は絞ることで、新規参入の敷居を下げてカジュアルに使えるようなwikiを目指します。


詳細ページを作成したのは次の3ページです

* 過去アクセス数ランキング
* 1周間アクセス数ランキング
* 最近更新されたページ

タグクラウドは格好いいので載せていますが、自分では使ってません。笑

サイドバーイメージです
![8442ca01-7ea5-c42e-675b-0995292b78ca.png](https://qiita-image-store.s3.amazonaws.com/0/6463/fa8eac7e-32be-8775-828e-240691d4899b.png)


```wiki:Sidebar
h1. Sidebar

{{new_page}}

h3. 各種リンク

* "フリートーク - Slack":https://xxxxxxx
* "情報共有 - Discouse":https://xxxxxxx
* "CI - Jenkins":https://xxxxxxx
* "ソース管理 - GitLab":https://xxxxxxx

h3. [[過去アクセス数ランキング]]

{{popularity(10)}}

h3. [[1週間アクセス数ランキング]]

{{popularity(10, 7)}}

h3. [[最近更新されたページ]]

{{recent(15)}}

{{tagcloud}}
```

リンク先の内容は以下のとおりです。
**「最近更新されたページ」**は表示件数は30にしていますが、Wikiの投稿流量によってはもっと数を増やしても良いかもしれません。

```wiki:過去アクセス数ランキング
h1. 過去アクセス数ランキング

{{popularity(100)}}
```

```wiki:1週間アクセス数ランキング
h1. 1週間アクセス数ランキング

{{popularity(100, 7)}}
```

```wiki:最近更新されたページ
h1. 最近更新されたページ

{{recent(30)}}
```

# Footerでアクセスを可視化する

Sidebarと同様に`Footer`も編集できます。

Wikiページの更新時間や**アクセス数が表示**できます。
同じ人が二度見てもカウントされない仕様なので非常に使える機能です。
（正確にはセッション判定なので一度ログアウト/ログインするとカウントされちゃいます）

これに加えて、**vote**のマクロで投票する機能を付けてフィードバックを得る試みをしてます。

そうするとそのWiki内容がビューアからして有益だったか簡単にフィードバックをもらえます。
PDCAサイクルを回すためには必須ですね！

ただし、voteのフォームで投票されたかどうかを検知する手段は現在把握できていないので、
定期的にページを巡回しましょう。

![fotter.png](https://qiita-image-store.s3.amazonaws.com/0/6463/71c2ceeb-a21b-5d99-25b3-d58f653f1763.png)

書き方は次のように。

```wiki:footer
{{comments}}
Updated by {{lastupdated_by}} , {{lastupdated_at}}{{count}} Access count: {{show_count}}

* {{vote(good, このページは参考になった)}}
* {{vote(improvement, このページは改善の余地がある)}}
* {{vote(bad, このページは不要だと思う)}}
```


# StyleSheetで使いやすくする見た目にこだわる

SidebarやFooterと同様に`StyleSheet`ページを作るとCSSとして動作させることが出来ます。
デザインセンスが無いので今回は割愛します。


# まとめ

* wikiを運用するのは非常に大変ですが、ちゃんとメンテすると新規に参画する人や後で見直すときに抜群な効果を発揮してくれます
* 良いwikiライフを
1時間以内に解けなければプログラマ失格となってしまう5つの問題の問題4

#1時間以内に解けなければプログラマ失格となってしまう5つの問題の問題4

##問題4を解けず、プログラマ失格
###問題4
正の整数のリストを与えられたとき、数を並び替えて可能な最大数を返す関数を記述せよ。例えば、[50, 2, 1, 9]が与えられた時、95021が答えとなる
***

答えみてPHPに直しました

```php
//$list = array(5, 50, 56);
$list = array(50, 2, 1, 9);
usort($list, 'comp');

echo '<pre>';
print_r(implode('', $list));
echo '</pre>';

function comp($int1, $int2) {
	$str1 = (string)$int1;
	$str2 = (string)$int2;
	if ($str1 === $str2) {
		return 0;
	}
	return -1 * strcmp($str1 . $str2, $str2 . $str1);
}
```


本家の回答
https://blog.svpino.com/2015/05/08/solution-to-problem-4
Hubotをpm2でデーモン化@slack

以下のjsonを作って

``` /etc/pm/process.json
{
    "apps":[
        {
            "name"                  : "hubot",
            "cwd"                   : "/home/hubot",
            "args"                  : ["-n", "hubot", "-a", "slack"],
            "script"                : "bin/hubot",
            "node_args"             : [],
            "log_date_format"       : "YYYY-MM-DDTHH:mm:ssZ",
            "error_file"            : "/var/log/pm/hubot.err.log",
            "out_file"              : "/var/log/pm/hubot.log",
            "pid_file"              : "/var/run/hubot.pid",
            "exec_mode"             : "fork",
            "instances"             : 1,
            "min_uptime"            : "200s",
            "max_restarts"          : 0,
            "max_memory_restart"    : "150M",
            "watch"                 : true,
            "ignore_watch"          : ["[\\/\\\\]\\./", "node_modules"],
            "merge_logs"            : true,
            "exec_interpreter"      : "bash",
            "autorestart"           : true,
            "vizion"                : false,
            "env": {
                "NODE_ENV"               : "production",
                "HUBOT_SLACK_TOKEN"      : "YOUR SLACK TOKEN",
                "PORT"                   : "8080"
            }
        }
    ]
}

```

envに設定を色々追加していく。
ignore watchはまだ適当。

``` bash

$ pm2 start /etc/pm/process.json

```
RealmのフィールドにEnumとしてアクセスする

# About

[Realm](http://realm.io/)のフィールドにはEnum的な型のサポートはありませんが、フィールド値をEnumとして扱えた方が、プログラムの記述がスッキリすることが多いと思います。

色々と試行錯誤した結果、RealmObjectへのEnumの取り込み方は、このような感じに落ち着きました。

必ず`typeAsEnum`プロパティを使うように気を付ける必要があったり、rawValueへのアクセサが隠蔽されていなかったりはしますが、switchのコーディングが楽になりました。

# Java

```java
public class Item extends RealmObject {
    public enum Type { TYPE1, TYPE2 }

    // 用途に応じてintでも良い
    private String type = Type.TYPE1.name();

    /** typeをEnumで扱うためのIgnoredプロパティ */
    @Ignore
    private Type typeAsEnum;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public Type getTypeAsEnum() {
        return Type.valueOf(getType());
    }

    public void setTypeAsEnum(Type typeAsEnum) {
        setType(typeAsEnum.name());
    }
}
```

以下は利用例です。

```java
// getter
switch (item.getTypeAsEnum()) {
   case Type1:
      break;
   case Type2:
      break;
}

// setter
item.setTypeAsEnum(Type.Type1);
```

# Swift

```swift
class Item : RLMObject {
  enum Type : String {
    case Type1 = "Type1"
    case Type2 = "Type2"
  }

  // 用途に応じてIntでも良い
  dynamic var type: String = Type.Type1.rawValue

  /// typeをEnumで扱うためのプロパティ
  var typeAsEnum {
    get {
      return Type(rawValue: type)!
    }
    set {
      type = newValue.rawValue
    }
  }
}
```

以下は利用例です。

```swift
// getter
switch item.typeAsEnum {
   case .Type1:
   case .Type2:
}

// setter
item.typeAsEnum = .Type1
```
Rubyでjsonファイルを1行毎に読み込んでパースした話

##はじめに
こんな感じのファイルがあった

```json:hoge.json
{"id":"1","kana":"あ","boin":"a"
}
{"id":"2","kana":"い","boin":"i"
}
{"id":"3","kana":"う","boin":"u"
}
```
ここからデータを取りたいと思った。

##やってはいけない
最初こんなことをやっていた

```rb:suck.rb
require 'json'

json=open('hoge.json'){|io|
 JSON.load(io)
}

json.each_line{|line|
  puts line['kana']
}
```
意図としては、パースされたhoge.jsonが変数jsonにオールイン。その後、各行ごとに取り出して必要なkeyのvalueをとってこよう、ということ。
しかしこれをやろうとすると、こんな事を言われてしまう。

```shell-session
.../gems/json-1.8.2/lib/json/common.rb:155:in `parse': 795: unexpected token at '{"id":"2","kana":"い","boin":"i"} (JSON::ParserError)
```

##こうしたら動いた
わけがわからず、「1行目はうまく読んでるみたいだから、2行目の記述がだめなのかな？」とか考えていた。しかし、どう見ても変なところがわからない。

そこで、1行ずつ読んだ後で、読んだ1行をパースすることにした。
こんな感じ。

```rb:working.rb
require 'json'

# とりあえず変数fileに展開する
file=open('hoge.json')

# fileを1行読む毎にパースして、その上で出力する
file.each_line { |line|
	json=JSON.load(line)
	puts json['kana']
}
```

すると、

```shell-session
$ ruby working.rb
あ
い
$
```
とうまくいった。

##まとめ
一気にパースしてから各行毎に切り出して...みたいなのはダメらしい。
1行毎に読み込んでから行毎にパースして...というのは大丈夫らしい。
イマイチよくわからないけれども、そういうことらしい。


おわり
c++ builder > if (not Assigned(sc) ...

[SO](http://stackoverflow.com/questions/30426635/multiple-thread-delphi-stop/30427509#30427509)
にて以下のようなdelphiコードがあった。

```
 Sc: TMy_Thread;
...
if (not Assigned(Sc)) or Sc.Terminated then
...
```

直接nilかどうかをチェックするのでなくAssigned()を使ったほうがいいとのこと。
ms-help://embarcadero.rs_xe4/libraries/System.Assigned.html

しかしながら上記のヘルプを見る限りではこれはdelphi用APIでC++用は用意されていないようだ。

結局、C++ builderではNULLと直接比較することになるのかもしれない。
git subtree addでハマったメモ

git subtree addでハマったのでメモ。

## リポジトリ ##
* repositoryA : 親リポジトリ
* repositoryB : subtreeとして追加したいリポジトリ

以降、この２つのリポジトリに対する操作。

## 起きたこと ##
repositoryAに対して、
`git subtree add --prefix=repositoryB repositoryB_url master --squash`
を実行すると
`'master' does not refer to a commit`
が発生して、addできない。

## やったこと ##
repositoryAのローカルリポジトリに「master」ブランチを追加。
リモートリポジトリだけではなく、ローカルリポジトリにもmasterブランチ(addしたいrepositoryBのブランチと同じブランチ)がないとできないらしい。

## 参考 ##
http://stackoverflow.com/questions/21500722/why-am-i-told-that-master-does-not-refer-to-a-commit-when-i-use-git-subtree
CordovaとOnsenUIメモ(1:Cordova起動まで)


# 準備
node.jsとかcordovaはインストール済みとしておく。
あと、Android Studioもインストール済。

# プロジェクト作成
管理者権限のコマンドプロンプトで実行。

```
D:\> cordova create testapp jp.example.testapp TestApp
Creating a new cordova project.
```
```
D:\> cd testapp
D:\testapp> cordova platform add android
Adding android project...
Creating Cordova project for the Android platform:
        Path: platforms\android
        Package: jp.example
        Name: TestApp
        Activity: MainActivity
        Android target: android-22
Copying template files...
Android project created with cordova-android@4.0.0
Discovered plugin "cordova-plugin-whitelist" in config.xml. Installing to the project
Fetching plugin "cordova-plugin-whitelist@1" via npm
npm http GET https://registry.npmjs.org/cordova-plugin-whitelist
npm http 304 https://registry.npmjs.org/cordova-plugin-whitelist
Installing "cordova-plugin-whitelist" for android
```
```
D:\testapp> cordova run android
Running command: D:\data\oandu\oandu\testapp\platforms\android\cordova\run.bat
ERROR: Error: ANDROID_HOME is not set and "android" command not in your PATH. You must fulfill at least one of these conditions.
ERROR running one or more of the platforms: Error: D:\data\oandu\oandu\testapp\platforms\android\cordova\run.bat: Command failed with exit code 2
You may not have the required environment or OS to run this project
```
あぁ…。
`{AndroidSDKのパス}\platform-tools` と `{AndroidSDKのパス}\tools` にパスを通してみる。

```
D:\testapp>cordova run android
Running command: D:\testapp\platforms\android\cordova\run.bat
ERROR: Error: Failed to run "java -version", make sure that you have a JDK insta
lled.
You can get it from: http://www.oracle.com/technetwork/java/javase/downloads.

ERROR running one or more of the platforms: Error: D:\testapp\platforms\android\
cordova\run.bat: Command failed with exit code 2
You may not have the required environment or OS to run this project
```

えっ?

```
D:\testapp>java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
```

なにを言うてるん?
環境変数JAVA_HOMEを追加して再チャレンジ。

```
D:\testapp>java -version
...(略)...
BUILD SUCCESSFUL

Total time: 1 mins 32.894 secs
Built the following apk(s):
    D:\testapp\platforms\android\build\outputs\apk\android-debug.apk
Installing app on emulator...
Using apk: D:\testapp\platforms\android\build\outputs\apk\android-debug.apk
Launching application...
LAUNCH SUCCESS
```
やっと成功。
そしてくそでかいエミュレータが起動しやがった。

![くそでかい.png](https://qiita-image-store.s3.amazonaws.com/0/34041/ddbfedcd-300f-1577-b1fd-09241fc47381.png)
CentOS7におけるifconfigの代替新コマンド

# centos7では標準でifconfigが使えなくなった。
以下、ifconfigの各コマンドの新コマンドをメモする。
<section>
<h3>ifconfig</h3>
<pre>
<code>ip addr show</code>
</pre>
</section>
<section>
<h3>ifconfig eth0 192.168.33.10 netmask 255.255.255.0</h3>
<pre><code>
ip addr add 192.168.33.10/255.255.255.0 dev eth0
</code></pre>
</section>
<section>
<h3>route</h3>
<pre><code>
ip route
</pre><code>
</section>
<section>
<h3>arp</h3>
<pre><code>
ip neighbor
</pre></code>
</section>
<section>
<h3>それでもifconfigを使いたい場合</h3>
<p>「net-tools」パッケージを導入する<small>（ただし非推奨）</small></p>
<pre><code>
　#yum -y install net-tools
</pre></code>
</section>
[Rails]条件でバリデーションをまとめる

条件によってバリデーションの内容を変更したい時、with_optionsを使えば簡単にまとめることができる。

#### 使い方
例）店舗検索を条件によってフォーム内容を変更する場合
1. 現在地から検索(緯度経度)
2. 店舗名から検索（ワード）
3. 都道府県から検索（都道府県と市町村を選択）

```rb:model
# 現在地から検索
with_options if: :location? do |v|
  v.validates :lat, presence: true
  v.validates :lon, presence: true
end

# 店舗名から検索
with_options if: :shop_name? do |v|
  v.validtes :word, length: { in: 2..20 }
end

# 都道府県から検索
with_options if: :area? do |v|
 v.validates :pref, presence: true
 v.validates :city, presence: true
end
```

rails4.2では少し簡略して書くことができます。

```rb:model
with_options if: :location? do
  validates :lat, presence: true
  validates :lon, presence: true
end
```

#### 注意点
with_optionsの中でさらに`if`を定義した場合

```rb:model
with_options if: :location? do
  validates :lat, presence: true
  validates :lon, presence: true, if: :lat
end
```

上記のような場合、`with_options`ブロック内の`if`で上書きされてしまいうまく動作しません。
`with_options`のブロック内では`if,unless`オプションは使わない方がいいです。
やむをえず使用する場合は`with_options`で定義したものと逆のものを使います。

```rb:model
with_options if: :location? do
  validates :lat, presence: true
  validates :lon, presence: true, unless: 'lat.blank?'
end
```