OmniAICreator/Qiita-1.07M huggingface dataset:
Knitrの出力部分で日本語固定幅フォントを使う

## KnitrでCustom CSSを使う

[R Markdown Document](http://rmarkdown.rstudio.com/html_document_format.html#appearance-and-style)

適用前
![default_style.png](https://qiita-image-store.s3.amazonaws.com/0/5764/0f347654-6776-cfb0-e62f-1dc8641b6de4.png)

適用後
![monospaced_font.png](https://qiita-image-store.s3.amazonaws.com/0/5764/d9c3dac8-253b-34af-90dc-32670fede45f.png)

### 設定方法

**cssファイルを作る**

`font-family`の先頭に`'MS Gothic'`を指定
（それ以外は英数字のみの場合に推奨されていると思われるものを流用した）

```css:styles.css
tt, code, pre {
   font-family: 'MS Gothic', 'DejaVu Sans Mono', 'Droid Sans Mono', 'Lucida Console', Consolas, Monaco, monospace;
}
```

今回は実行するRMarkdownファイルと同じフォルダ内にファイルを作成

**R Markdownでcssを読み込む設定を追加する**

```
---
title: "Hoge"
output:
  html_document:
    css: styles.css
---
```

### 気付いた点

- RStudio組み込みのビューアーでは固定幅にならなかった。ChromeでOKだった
  - `'MS Gothic'`が読み込めてない可能性
  - MS Officeがインストールされているかで結果が違う可能性
- 日本語を含まなければ、`'MS Gothic'`以外の指定で十分かもしれない
- `font-family`に`'ＭＳ ゴシック'`を指定したらうまくいかなかった
  - ソースなどで見るとcssのコードの部分が文字化けしていた
  - 指定箇所は`<link href="data:text/css, ...`のようになっている
  - `self_contained: false`を`html_document`の子として指定すると、js,cssファイルが外部ファイルのまま参照される
- Macでは`Osaka-Mono`も追加しておいて良いかもしれない

試した環境はMac, RStudio

### その他

**結果出力部分を画面いっぱいに使うスタイルも試した**

```css:styles.css
.main-container {
    max-width: none !important;
}
```

RMarkdownのオプション

```
\```{r set-options, echo=FALSE, cache=FALSE}
options(width = 130)
\```
```

**DT**

データの量次第では[DT](https://rstudio.github.io/DT/)を使えばそれで良い場合もある

### テストコード

データ表示部分
日本語のデータの列を追加（一番左の列）

```r
iris
orig_names <- names(iris)

iris$種 <- NA
iris[iris$Species=='setosa',]$種 <- 'セトサ'
iris[iris$Species=='versicolor',]$種 <- 'ヴァージカラー'
iris[iris$Species=='virginica',]$種 <- 'ヴァージニカ'

iris <- iris[,c('種', orig_names)]

# 適当に並べ替え
iris[order(iris$Sepal.Width, iris$Petal.Length),]
```
Grubローダが壊れた

ブートローダが壊れた
原因は新しいシステムを構築しようとしたとき間違えてEFIシステムを壊してしまったのだ
すぐに、`grub-install` を使ったが、再起動した時にこんなメッセージとプロンプトが

```
Minimal BASH-Like line editing is supported. For the first word, TAB lists possible command completion. Anywhere else TAB lists possible device or file completions.

grub> 
```

ほかのArch-linuxからマウントして`arch-chroot`でシステムに入る

```
# mount /dev/sdb3 /mnt
# mount /dev/sda1 /mnt/boot
# arch-chroot /mnt /bin/bash
```

initrdがないようなので

```
# mkinitcpio -p linux

```

これでいける思ったが。vmlinuxがいないよといわれる。

全体アップデートしたばかりだったので`/var/cache/pacman/pkg/`に残ってた

```
# cp /var/cache/pacman/pkg/linux-4.2.2-1-x86_64.pkg.tar.xz ~
# tar zxf linux-4.2.2-1-x86_64.pkg.tar.xz 
# cp boot/vmlinux-linux /boot
```

これで直った

###追記
***

`grub.cfg`のバックアップがない場合は、手動でブートする必要あります

```
grub> ls
(hd0) (hd0,gpt1) (hd0,gpt2) (hd0,gpt3) (hd1) (hd1,gpt1)

#rootにブートパーティションを設定
grub> set root=(hd0,gpt1) 

#確認
grub> ls / 
EFI  grub  initramfs-linux-fallback.img  initramfs-linux.img  vmlinuz-linux

#linuxがあるパーティションをセット
grub> linux /vmlinuz-linux root=/dev/sda3
grub> initrd /initramfs-linux.img

#パーティションで分割してない場合
grub> linux /boot/vmlinuz-linux root=/dev/sda1
grub> initrd /boot/initramfs-linux.img

#起動
grub> boot
```

起動後、`grub.cfg` を作成

```
# grub-mkconfig -o /boot/grub/grub.cfg
```

参考
[GRUB - ArchWiki](https://wiki.archlinuxjp.org/index.php/GRUB)
Mac で Raspbian Jessie を MicroSD に書き込んだ

まずは [公式サイト](https://www.raspberrypi.org/downloads/raspbian/)から zip をダウンロードしてくる。

## zip を展開

展開しようとすると怒られる。

```shell-session
% unzip 2015-09-24-raspbian-jessie.zip
Archive:  2015-09-24-raspbian-jessie.zip
warning [2015-09-24-raspbian-jessie.zip]:  76 extra bytes at beginning or within zipfile
  (attempting to process anyway)
error [2015-09-24-raspbian-jessie.zip]:  reported length of central directory is
  -76 bytes too long (Atari STZip zipfile?  J.H.Holm ZIPSPLIT 1.1
  zipfile?).  Compensating...
   skipping: 2015-09-24-raspbian-jessie.img  need PK compat. v4.5 (can do v2.1)

note:  didn't find end-of-central-dir signature at end of central dir.
  (please check that you have transferred or created the zipfile in the
  appropriate BINARY mode and that you have compiled UnZip properly)
```

ダウンロードに失敗しているわけでもなさそう。

```shell-session
% openssl sha1 2015-09-24-raspbian-jessie.zip
SHA1(2015-09-24-raspbian-jessie.zip)= d8d4880cd0e4f155f343984725d5bd94c1f86023
```

どうやら `unzip` では展開できないらしい。

* [How to deal with unzip error on a large file in OSX?](http://apple.stackexchange.com/questions/208139/how-to-deal-with-unzip-error-on-a-large-file-in-osx)

ということで、

```
tar xvf 2015-09-24-raspbian-jessie.zip
```

で展開できた。zip 圧縮なのに tar でかつ unzip オプションなしで展開できるのが不思議。

リンク先にある `ditto` でも可能だった。`ditto` は Mac OS X 固有のコマンドらしい。

## img を書き込む

MicroSD を Mac に挿入して認識したら、disk 番号を確認する。

```shell-session
% diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            499.4 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +499.0 GB   disk1
                                 Logical Volume on disk0s2
                                 XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
                                 Unencrypted
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *31.7 GB    disk2
   1:             Windows_FAT_32                         31.7 GB    disk2s1
```

容量を見るに、disk2 が MicroSD そう。一度アンマウントする。

```shell-session
% diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
```

`dd` コマンドで書き込む! 4, 5 分かかる。

```shell-session
% sudo dd bs=1m if=2015-09-24-raspbian-jessie.img of=/dev/rdisk2
Password:
4125+0 records in
4125+0 records out
4325376000 bytes transferred in 236.633469 secs (18278801 bytes/sec)
```

できた。

ところで、`dd` って何の略なんだろう?

> dd コマンドの機能は「convert and copy a file」なので本当は cc コマンドにしたかったが、既に C コンパイラが cc という名前を使っていたので、仕方なく cc の次の dd にしたらしい。
http://x68000.q-e-d.net/~68user/unix/pickup?dd
ios9で、Nibで作ったCustomCellのボタンが反応しない件

# 参考

http://stackoverflow.com/questions/32705171/ibaction-inside-uitableviewcell-not-called-in-ios-9

>
just add this line in tableViewCellForeRowAtIndexPath method

```
cell.contentView.userInteractionEnabled = false;
return cell;
```

>but this is not a propar solution.
>
>iOS 9, puts a content view to a tableView cell, even though you use a >custom cell/xib. The content view being added after the custom cell, it was on top of it.
>To solve this properly just replace custom cell/xib's view with >UITableviewCell from object library [from where you usually drag&drop UIButton,UILable,etc...];

# 修正方法

stackoverflowに書いてある通りに、Object LibraryからTableViewCellをドラッグ&ドロップしてカスタムセルを作り直したら、正常に動作するようになった。
Vagrantまとめ

# そもそも、Vagrantって何？
HashiCorp社が開発する、`Vagrantfile` を言われるファイルに構成情報を記述することによって、仮想環境の構築から設定まで自動化を行う事ができるツールです。
`Vagrantfile`を共有したり、仮想環境を丸ごと他の人と共有することもでき、チーム内の開発環境の統一化なども行えるすごいやつです。

チームでよくあることだと思うのですが、「自分の環境だと動いたんだけど・・・」とかチームに新規で人が入ってきた時に同じ環境を渡したい！とか簡単に同じ環境を用意することができます。

ここまで聞くと、Virtual Boxだけでいいような気がしますが、Vagrantを使えば設定のコード管理やサーバ構成ツールのAnsibleやChefと合わせれば、ミドルウェアのインストールから設定まで簡単に用意することができます。
なので、新規で人がチームに加わっても`Vagrantfile`とAnsibleやChefを用意すればすぐに同じチーム内で統一した環境を構築できてしまいます。

# Vagrantの情報
* 公式サイト
 - https://www.vagrantup.com/
* 公式ドキュメント
 - https://www.vagrantup.com/docs/
* 使用言語
 - Ruby

# Vagrantを使うにあたり知っていたほうがいい用語
|用語         |説明                                                                                                                                                                                                                                                                                    |
|------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|box           |Vagrantのイメージファイルの名称<br> インターネット上に公式イメージや個人的に作ったboxも配布されていて下記から探せる <br>https://atlas.hashicorp.com/boxes/search|
|Vagrantfile|どのように構成にするかを記述する設定ファイル                                                                                                                                                                                                            |
|plugin       |Vagrantをより便利にするためのプラグイン                                                                                                                                                                                                                      |


## Tips
```bash
### Macアドレスのマッピング無効化
sudo ln -s -f /dev/null /etc/udev/rules.d/70-persiste

### 未使用領域0埋め
dd if=/dev/zero of=zero bs=4k
rm zero
```

# 目次
* [OS XへのVagrant導入方法](http://qiita.com/mackerel/items/d97fe68065fa8669c090)
* [Vagrant boxの日本語化](http://qiita.com/mackerel/items/acf935c24073046de4d6)
* [Vagrantコマンド](http://qiita.com/mackerel/items/69c2378600bf8adaac5c)
sliceのシャッフル

```go
package main

import (
	"fmt"
	"math/rand"
)

func main() {
	n := 30
	arr := generate(n)

	fmt.Println(arr)
	shuffle(arr)
	fmt.Println(arr)
}

func generate(n int) []string {
	arr := make([]string, n)
	for i := range arr {
		arr[i] = fmt.Sprintf("%02d", i)
	}
	return arr
}

func shuffle(data []string) {
	n := len(data)
	for i := n - 1; i >= 0; i-- {
		j := rand.Intn(i + 1)
		data[i], data[j] = data[j], data[i]
	}
}
```
https://play.golang.org/p/He5P-cHZwk

```
[00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29]
[04 13 23 09 02 03 24 20 00 10 22 05 21 07 19 16 08 12 17 14 27 28 26 01 18 25 29 15 06 11]
```

Fisher–Yates shuffleというアルゴリズムだそうです。
https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle


(教えていただいた記録) https://twitter.com/sugyan/status/653922349931085826
バグの埋め込みを見つけるために　-リポジトリブラウザによる確認-

　いつの間にかバグを埋め込んでしまっていた。単体テストの枠組みができていない部分で、関数の書き換えを行っていた。日々のプログラムの動作確認では、その関数を呼び出していなかった。

 「何か変だぞ」という状況で、以前のバージョンではどうだったのだろう。たくさんの改変をする前のコード、たぶんバグを埋め込む前のコードとの比較をするには、SVN（TortoiseSVN)でのリポジトリブラウザが重宝する。
　
　該当のフォルダで右クリックし[TortoiseSVN][repo-browser]を選択する。
リポジトリブラウザが開かれるので、右上の場所の[Revision]をバグを埋め込んでしまう前のRevisionにして、その時期のファイル構成をたどり、ファイルを選択して開く。

　そうすると、その時期のファイルを開けるので、問題の関数の実装を、当時の実装と今の実装とを比較する。そうすれば、どのような間違いを埋め込んでしまったのかを知ることができる。


[リポジトリブラウザー]
(http://tortoisesvn.net/docs/release/TortoiseSVN_ja/tsvn-dug-repobrowser.html)


追記：開発中の版のあるディレクトリに影響を与えずに、以前の版を試してみるには。
　SVNで開発中の版があるディレクトリで以前の版を試そうとすると、バージョン管理していないファイルの影響を受けたりするので、別のディレクトリで試すことがある。
　リポジトリブラウザーを開いて、リポジトリブラウザー上のフォルダを、エクスプロラー上のフォルダにdrag&dropすると、コピーできる。このとき、リポジトリブラウザーの右上で、SVN上のrevisionを選んでおいてから、リポジトリブラウザーの表示を確認してコピーする。
コピー先では、単なるコピーなので、間違ってコミットしたりしてしまう心配はない。
RailsのCSSへ画像埋め込み（Data URI化）

HTTP接続を減らすためにData URIスキームという技術があります。Railsでも活用できますが、注意点が1つあります。

# Data URIって？
`http://〜`のようなURIがありますが、このうち先頭のコロンまでの、URIの種類を識別する部分を**スキーム**といいます。俗に「プロトコル」と呼ばれてしまうこともあるのですが、`mailto:`のようにプロトコルと1対1で対応しないもの、さらには`file:`や`about:`のように、通信と結びつかないスキームすらあります。

今回主題にするData URIも、`data:`というスキームです。ただし、これはその後に（たいていはBase64化した）データそのものが続いて、他のファイルに参照することなくデータを得られるようになります。詳しくは[RFC 2397](https://tools.ietf.org/html/rfc2397)か、分かりやすい解説が必要なら[ウィキペディア](https://ja.wikipedia.org/wiki/Data_URI_scheme)でもご覧ください。

# ERB経由で使う
Railsでも、標準でData URIの生成機能がヘルパーに用意してあって、簡単に使えます。いつものように、`assets/`の中身を参照して、適切に埋め込んでくれます。

```erb:xxx.yyy.erb
<%= asset_data_uri('path/to/file.png') %>
```

ビューで使う分にはこれで構わないかもしれませんが[^1]、CSSをERBにするのも大げさですし、特にSassを入れてある場合は、さらにプリプロセスを通すのもアホらしい話です。

# Sassの関数として呼び出す
RailsのSassでは`asset-url`のような関数を呼び出せるようになっているので、Data URIも何かしらの手法で使えるだろうと踏んだのですが、`asset-data-uri()`のように関数呼び出ししても全く反応せず、sass-railsのソースコードまで調べまわった結果、正しい動かし方が判明しました。

```scss:yyy.scss
.some-selector{
  background-image: asset-data-url('path/to/file.png');
}
```

`asset-data-`の後が、`uri`ではなくて**`url`**でした。紛らわしいことこの上ないです。とはいえ、`asset-data-url`は`url(data:〜)`を生成して、`asset_data_uri`はData URIだけを生成するので、これはこれで間違っているわけでもないのですが。

[^1]: もっとも、ビューを表示するたびに同じ画像データを送信することになるので、ビューでData URIを使うのはあまりおすすめできません。
NSTimerをメインスレッドで使用した時、タイムアップにずれが生じた

# 結論
NSTimerを別スレッドで動かすようにする。

別スレッドで動かすためには？
NSRunLoopをかませてTimerを動かせば別スレッドで処理が行える

```swift
let timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("timeUp:"), userInfo: nil, repeats: false)

NSRunLoop.currentRunLoop().addTimer(dismissTimer!, forMode: NSRunLoopCommonModes)

func timeUp(timer: NSTimer) {
   // タイマー完了
}
```

# 背景
NSTimerのタイムアップでボタンのイメージを切り替えていく処理を作成したのですが、同画面に配置しているUIWebViewを動かし続けると、タイマーの完了のメソッドが発火しなかった。


その時（メインスレッドでTimerを動かす時）の処理は下記のような書き方。

```swift
let timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("timeUp:"), userInfo: nil, repeats: false)

func timeUp(timer: NSTimer) {
   // タイマー完了
}
```
上記書き方だと、タイマーがメインスレッドで実行され、UIWebViewなどの操作とバッテイングしてタイマーの完了のメソッドが発火しなかったようです。

# 参考
http://tech.admax.ninja/2014/09/17/how-to-use-nstimer/
AdvancedCustomFieldsで、画像の「完全に削除する」を押した時の怪しい挙動を修正する

# みんな大好き AdvancedCustomFields

キレイで分かりやすいカスタムフィールドを
簡単に実装できるWordPressのプラグイン「AdvancedCustomFields」(以下ACF)
検索に弱いなんて弱点もあれど、愛用されている方も多いのではないでしょうか。
僕もPRO版を購入して、ありがたく活用させて頂いています。

この記事は、そんなACFのバージョン5（=PRO版）でのみ発生する妙な挙動のメモです。

## 画像を「完全に削除する」を押してもサムネイルが消えない

ACFで画像フィールドを作成して画像を登録。
その後、鉛筆マークをクリックして画像の編集を行ってみる。

![スクリーンショット 2015-10-13 22.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/48643/f62454d7-960f-247a-ec9b-0e80746e9e0f.png)

画像のトリミングなどは問題なく行えるけど、ここで「完全に削除する」をクリック。

![スクリーンショット 2015-10-13 22.41.13.png](https://qiita-image-store.s3.amazonaws.com/0/48643/9468f000-c45c-4a3b-f0d1-dd49d99d371a.png)

すると画像はなくなっているハズなのにサムネイルが出たままになる。

![スクリーンショット 2015-10-13 22.40.48.png](https://qiita-image-store.s3.amazonaws.com/0/48643/f62454d7-960f-247a-ec9b-0e80746e9e0f.png)

鉛筆マークを押すと何度でも「完全に削除する」ができてしまう。
実は、ちゃんと画像は消えているのだけど、
バツを押すかページを更新するまでそれが反映されていないみたい。

## 解決案

function.phpに以下を記述すれば、とりあえず動きます。

```php:function.php
function my_acf_delete_attachment(){
	?>
	<script type="text/javascript">
	(function($){
		var open_browser  = false;
		var browser_index = '';
		$(document).on('click','.acf-soh-target a[data-name=edit]',function(){
			open_browser = true;
			browser_index = $('.acf-soh-target a[data-name=edit]').index($(this));
		});
		$(document).on('click','.acf-field a:not([data-name=edit])',function(){
			open_browser = false;
		});
		$(document).on('click','.delete-attachment',function(){
			if(! $('.attachment-details')[0] && open_browser){
				$('.media-modal-close').click();
				$('.acf-soh-target a[data-name=remove]').eq(browser_index).click();
				open_browser = false;
			}
		});
	})(jQuery);
	</script>
	<?php
}
add_action('acf/input/admin_head','my_acf_delete_attachment');
```

何をしているかというと、「完全に削除する」をクリックしたら、
同時に画像のバツマークをクリックさせているだけ。
必要でないときは発動しない様に、open_browserで状況を管理しています。

## とはいえ

ACFのアクションフックを使ってゴニョゴニョ…とか、
もっとスマートな方法は絶対にあると思うので思いついたら追記します。

お詳しい方がいらっしゃっていたら、どうぞ忌憚のないご意見いただけたら。

## ちなみに

この挙動は公式サポートを見るに、どうも仕様らしい？
うーん、ACFのバージョン4まではこういう事は無かったので、なにか理由があるのかなあ。
じっくり調べてみます。
nginxでlocalhostとそれ以外のドメインからのアクセスでDocumentRootを分ける

外からのドメイン名(ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com)を指定した場合とサーバー内部からのlocalhostによる実行の際にDocumentRootを分けることをやってみたのでメモ。

# やりたいこと

+ 外からのドメイン名(ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com)を指定した場合にはAというDocumentRootとする
+ localhostからの接続の場合にはBというDocumentRootとする

# 結論

+ serverディレクティブにserver_nameもしくはlisten（もしくはその両方）を記載することでDocumentRootを変えることが出来る
+ localhsotからの接続は`listen 127.0.0.1`というようにせってていすれば良い

# 準備

適当にEC2を起動する。PublicDNSが設定されてインターネット越しにアクセスできるものとする。

以下でnginxをインストールし、起動

```bash
$sudo yum install nginx -y
$sudo service nginx start
```

また、色々面倒なのでhttpdをインストールして、もう一つDocumentRootを作成し、ファイルも置いておく。

```bash
$sudo yum install httpd
$sudo echo "hello" | sudo tee /var/www/html/index.html
```


# やってみる

設定ファイルで以下を変更します。

+ EC2でデフォルトで当てられるホスト名は長いため、server_names_hash_bucket_sizeを128に変更（設定しないとエラーになります）
+ １つ目のserverディレクティブでlocalhost(127.0.0.1)からの80ポートでのアクセス時に適用されるVirtualHostの設定を行う。こちらではDocumentRootとしてnginxデフォルトの/usr/share/nginx/htmlとする
+ 2つ目のserverディレクティブでec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.comの80ポートでのアクセス時に適用されるVirtualHost設定を行う。こちらではDocumentRootとしてhttpdデフォルトのDocumentrootの/var/www/html/とする


```/etc/nginx/nginx.conf

http {
+ server_names_hash_bucket_size 128;

server {
- listen 80;
+ listen 127.0.0.1:80;
- server_name  localhost;
+ #server_name  localhost;
}

-    #server {
-    #    listen       8000;
-    #    listen       somename:8080;
-    #    server_name  somename  alias  another.alias;
-    #    root         html;
-    #    location / {
-    #    }
-    #}

+    server {
+        listen       80;
+        server_name  ec2-xx-xx-xx-xx.ap-northeast-1.compute.amazonaws.com;
+        root  /var/www/html;
+        location / {
+        }
+    }
```

nginxを起動します。

```bash
$sudo service nginx start
```

この状態でlocalhsotから接続するとnginxデフォルトDocumentRootのnginxの初期画面の情報が取得できます。

```bash
$curl http://localhost/
```

また、自身のPCからPublicDNSでブラウザからアクセスするとhelloとだけ表示されるHTMLが返却され、アクセス元でDocumentRootを分ける事ができました。
頭の悪い grep の使い方

特定ディレクトリ以下のHTML（的な）ファイルで、使われているCSSクラスを列挙しようとして書いた。
最適化はできると思うんだけど、これで求めたいものがとれたのでよしとする。

```bash
find [directory] -type f -name [filepattern] \
| xargs grep -o "[^-]class=\"[^\"]*\"" \
| grep -o "\"\(.*\)\"" \
| grep -o "[^\"].*[^\"]" \
| sed -e 's/\s\+/\n/g' \
| sort \
| uniq
```

特記事項として、2行目で`[^-]class`とすることで、ng-classが引っかかるのを防いだくらい。

grep -o 三段重ねとかほんと頭悪い。うーあー。

#追記

↑の出力を[dictionary]ファイルとして、[css]ファイル中にいくつ出現するか？

```bash
for line in `cat [dictionary]`; do M=`grep -c "\.$line" [css]`; if [ $M -ne 0 ];then echo $line: $M; fi;done;
```

複数のCSSフレームワークがぶっこまれたプロジェクトで、片方とさよならしたくて調査する・・・そのためだけにこんな半端なシェル芸をすることに・・・(´・ω・｀)
Railsで悲観的ロック（PostgreSQLの行レベルロック）

悲観的ロックについてよく知らなかったので調べました。

## 前提条件

Rails 4.2.4
PostgreSQL 9.4

## 使い方

http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html

`find`する前に`lock`をつけるだけ。`FOR UPDATE`というロック処理句が発行される。

```ruby
# SELECT * FROM accounts WHERE id=1 FOR UPDATE
Account.lock.find(1)
```

トランザクションがはられている間ロックする。

```ruby
Account.transaction do
  account = Account.lock.first
  account.balance -= 100
  account.save!
end
```

ロックとトランザクションを同時にすることもできる。

```ruby
account = Account.first
account.with_lock do
  account.balance -= 100
  account.save!
end
```

## 動作確認

rails consoleを2つ用意する。

__console 1__

```ruby
account = Account.first
account.with_lock do
  sleep 30
end
```

__console 2__

```ruby
Account.lock.first
```

なお、console 2で`hoge.first`とした場合はレコードを取得できるが`hoge.first.update(...)`としたときはロックが解除されるのを待つ。

というのも、

https://www.postgresql.jp/document/9.4/html/explicit-locking.html#LOCKING-ROWS

> 行レベルロックは、データの問い合わせには影響を与えません。 行レベルロックは、同じ行に対する書き込みとロックだけをブロックします。

という仕様のためらしい。

## 注意

同一トランザクション内でロックしながらいろいろレコードいじったりするとデッドロックになる可能性があるので注意したほうがよさそう。

## 参考

* http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html
* https://www.postgresql.jp/document/9.4/html/sql-select.html#SQL-FOR-UPDATE-SHARE
* https://www.postgresql.jp/document/9.4/html/explicit-locking.html#LOCKING-ROWS
* http://stackoverflow.com/questions/21404484/rails-3-how-to-simply-test-pessimistic-locking-on-console （情報が古いので注意）
OS Xでいつの間にかEmacsが暴走してて困る


こまった。Macを起動したらEmacsがCPU 100%で回って発熱してアレ。

ちなみにEmacsは`brew install emacs --with-cocoa --with-d-bug --with-gnu-tls --with-imagemagick --with-librsvg --with-mailutils`で入れたやつ。

```sh
% launchctl list | grep emacs
-	1	homebrew.mxcl.emacs
% launchctl remove homebrew.mxcl.emacs
% launchctl list | grep emacs
```

なんかファイルもあった。

```sh
% ls -l ~/Library/LaunchAgents | grep emacs
lrwxr-xr-x 1 megurine staff  46 11  3  2014 homebrew.mxcl.emacs.plist -> /usr/local/opt/emacs/homebrew.mxcl.emacs.plist
% rm ~/Library/LaunchAgents/homebrew.mxcl.emacs.plist
```

これで再起動して、Emacsのせいで発熱することはなくなりました。

そういや、`brew info emacs`の出力にはこんなことが書いてある。

```
==> Caveats
A command line wrapper for the cocoa app was installed to:
  /usr/local/Cellar/emacs/24.5/bin/emacs

To have launchd start emacs at login:
  ln -sfv /usr/local/opt/emacs/*.plist ~/Library/LaunchAgents
Then to load emacs now:
  launchctl load ~/Library/LaunchAgents/homebrew.mxcl.emacs.plist
.app bundles were installed.
Run `brew linkapps emacs` to symlink these to /Applications.
```

Z Shellのコマンド履歴を見ると、たしかに自分で `launchctl load ~/Library/LaunchAgents/homebrew.mxcl.emacs.plist` を実行した形跡があった…

めでたしめでたし ヾ(〃＞＜)ﾉﾞ☆
WordPressの自動整形（ビジュアルエディタ含む）を無効にする方法

WordPressで既存サイトのテーマ化などを行った際、胃が痛いのがWordPressの自動整形の問題だと思う。

これはWordPress内部に定義されている `wpautop` という関数が行っている処理なのだけど、この関数が結構やっかいで、

* 改行コードを `<br>` タグに変換
* インラインタグまたは文章には `<p>` タグを適用
* 改行が2回続いたら `<p>` タグを適用

といった処理を自動的に行ってしまうのである。

[wpautop関数](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wpautop)

通常、ブログ用のテーマを使っているのであれば大きな問題にはならず、逆にタグを正規化してくれるので便利な関数なのだけど、通常のウェブサイトにまでこれが適用されてしまうと、単純に2回改行を入れたいだけなのに `<p>` タグを挿入されてレイアウトが崩れてしまったり、意図しないところに `<p>` タグが紛れ込むことでレイアウトが崩れてしまったりと、割と余計なお世話の関数だったりする。

また、この `wpautop` はビジュアルエディタであるTinyMCEにも組み込まれており、WordPressのエディタを切り替えたタイミングで実行され、やっぱり `<p>` タグや `<br>` タグを自動的に変換してしまうのである。

# プラグインを利用して一括回避

これを簡単に回避出来るプラグインが [PS Disable Auto Formatting](https://ja.wordpress.org/plugins/ps-disable-auto-formatting/) である。

このプラグインを導入するだけで、ビジュアルエディタ上の変換機能を停止しさらに出力の変換も停止してくれるため、とにかく便利なプラグインだったのだけど・・・

2015年10月13日現在、WordPress 4.3.x 系でWordPress側のエディター切替スクリプトが大幅に修正された影響を受け、このプラグインを導入するとビジュアルエディタとテキストエディタの切替ができなくなってしまう。

そのため、WordPress 4.3.x 系ではこのプラグインを利用することが出来なくなってしまったのである。

# プラグインを使わず手動で対応する

というわけで、プラグインを使わずに手動で対応する方法をまとめてみた。

## 出力側の変換機能を無効化する

出力の自動変換を回避するためには、`functions.php` に以下のコードを追加する。

```
remove_filter( 'the_content', 'wpautop' );
```

これで投稿本文においては、上記の `wpautop` による処理がされなくなるため、HTMLがそのまま出力される。

ただ逆に、改行の自動変換も効かなくなってしまうため `<br>` タグが挿入されていないと改行さえ無効になるので注意が必要。

### さらに出力側の余計な変換機能を無効化する

WordPressの出力関数にはさらにフィルターが組み込まれていて、特定の記号のならびを別の文字に変換したり、ダブルクォートやシングルクォートを実体参照に変換したりしている。

[wptexturize関数](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/wptexturize)

これが便利なようで逆に不便で、たとえばコード中のHTMLコメントなんかも変換されてしまい、レイアウトが崩れたりしてしまう。

というわけで、以下のコードを用いてこのフィルターを解除しておくことで、さらにHTMLコードを忠実に出力することが出来る。

```
remove_filter( 'the_content', 'wptexturize' );
```


## ビジュアルエディタの変換機能を無効化する

ビジュアルエディタ側の対応もそこまで難しくない。
`functions.php` に以下のコードを追加することで簡単に回避できる。

```
function override_mce_options( $init_array ) {
	$init_array['indent']  = true;
	$init_array['wpautop'] = false;
	
	return $init_array;
}

add_filter( 'tiny_mce_before_init', 'override_mce_options' );
```

### さらにビジュアルエディタの余計な機能を無効化する

ついでにビジュアルエディタに備わっている余計なフィルターを無効化することで、さらに便利に利用することができる。

先ほどのコードを以下のように修正。

```
function override_mce_options( $init_array ) {
	global $allowedposttags;

	$init_array['valid_elements']          = '*[*]';
	$init_array['extended_valid_elements'] = '*[*]';
	$init_array['valid_children']          = '+a[' . implode( '|', array_keys( $allowedposttags ) ) . ']';
	$init_array['indent']                  = true;
	$init_array['wpautop']                 = false;
	$init_array['force_p_newlines']        = false;
		
	return $init_array;
}

add_filter( 'tiny_mce_before_init', 'override_mce_options' );
```

上記のコードは以下のようなことをしている。

* 全てのタグ・全ての属性を許可（空の `<span>` タグや `<div>` タグなどが削除されるのを防ぐ）
* `<a>` タグに全てのタグを入れられるようにする
* 自動的に `<p>` タグで囲われることを防ぐ

これでビジュアルエディターを使ったときにも、タグが無くなったり変換されてしまうことを最小限に抑えられると思う。
Raspberry Pi に upstart と Docker をインストール

# 概要
Raspberry Pi に Docker をインストールする場合，ARM 用のパッケージを使う．この時，サービス管理に upstart を使っていると，upstart 用の設定ファイルが見つからずインストールが失敗する．そのため，他の環境から設定ファイルをコピーしておく必要がある．

# Hypriot Docker
ARM 用の Docker パッケージとして，[Hypriot Docker Debian Packages](http://blog.hypriot.com/) を使う．ダウンロードは [ここ](http://blog.hypriot.com/downloads/) からできて，インストール方法も書いてある．

ただし，upstart を使っている場合，設定ファイルが足りずインストールが失敗するため，下記の docker.conf を /etc/init/ に用意しておく．

```docker.conf
description "Docker daemon"
start on (local-filesystems and net-device-up IFACE!=lo)
stop on runlevel [!2345]
limit nofile 524288 1048576
limit nproc 524288 1048576

respawn
kill timeout 20

pre-start script
    if grep -v '^#' /etc/fstab | grep -q cgroup \
        || [ ! -e /proc/cgroups ] \
        || [ ! -d /sys/fs/cgroup ]; then
        exit 0
    fi
    if ! mountpoint -q /sys/fs/cgroup; then
        mount -t tmpfs -o uid=0,gid=0,mode=0755 cgroup /sys/fs/cgroup
    fi
    (
        cd /sys/fs/cgroup
        for sys in $(awk '!/^#/ { if ($4 == 1) print $1 }' /proc/cgroups); do
            mkdir -p $sys
            if ! mountpoint -q $sys; then
                if ! mount -n -t cgroup -o $sys cgroup $sys; then
                    rmdir $sys || true
                fi
            fi
        done
    )
end script

script
    DOCKER=/usr/bin/$UPSTART_JOB
    DOCKER_OPTS=
    if [ -f /etc/default/$UPSTART_JOB ]; then
        . /etc/default/$UPSTART_JOB
    fi
    exec "$DOCKER" daemon $DOCKER_OPTS
end script

post-start script
    DOCKER_OPTS=
    if [ -f /etc/default/$UPSTART_JOB ]; then
        . /etc/default/$UPSTART_JOB
    fi
    if ! printf "%s" "$DOCKER_OPTS" | grep -qE -e '-H|--host'; then
        while ! [ -e /var/run/docker.sock ]; do
            initctl status $UPSTART_JOB | grep -qE "(stop|respawn)/" && exit 1
            echo "Waiting for /var/run/docker.sock"
            sleep 0.1
        done
        echo "/var/run/docker.sock is up"
    fi
end script
```

その後，パッケージファイルをダウンロードしインストールする．

```shell-session
$ wget http://downloads.hypriot.com/docker-hypriot_1.8.3-1_armhf.deb
$ sudo dpkg -i docker-hypriot_1.8.3-1_armhf.deb
```

# 参考
そもそも Raspbian ではなく，Docker インストール済みの OS (HypriotOS) を使うこともできる．その場合は，[Raspberry Piでdockerを使う(HypriotOS)](http://qiita.com/tukiyo3/items/d25c8d9f6073067e5fcb) が参考になる．
「Playground execution terminated because the playground process exited unexpectedly」が出てしまう


Playgroundを実行中にこんなメッセージが表示されてしまいました。
何をきっかけに出たのか不明ですが、プロジェクトを開き直すと解消しました。
（最初はMacを再起動してましたが、ここまでやる必要はなさそうです）

参考
http://stackoverflow.com/questions/25996714/playground-execution-terminated-because-the-playground-process-exited-unexpected
ASP.NETでJSON形式のリクエストが「The JSON request was too large to be deserialized」というエラーになる場合の対処方法

エラーメッセージからすると一見全体の大きさが原因のように思いますが、実はキーの数が原因です。

これは、Microsoft セキュリティ更新プログラム MS11-100 によってリクエストに含まれるキー数が最大 1000 に制限されているためです。おそらく多量のキーを含むリクエストを送るDoS攻撃への対策ではないかと思われます。詳しくは以下を参照してください。

- [多くのフォーム キー、ファイル、または JSON ペイロード メンバーを含む ASP.NET 要求が例外が発生して失敗する](https://support.microsoft.com/ja-jp/kb/2661403) 
https://support.microsoft.com/ja-jp/kb/2661403

この上限はWeb.configて変更することができるので、キー数が減らせない場合は上限を上げることで対処できます。
Web.configのappSetting要素に以下の要素を追加することで上限を指定することができます。

```xml
<configuration>
  <appSettings>
    <add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
  </appSettings>
</configuration>
```
[メモ] Laravelでマスタ／スレーブ設定のRedisを使う


ほんとにメモです．

マスタ／スレーブ形式でのレプリケーションを設定したRedisにアクセスする場合，読み込みはスレーブ，書き込みはマスタに行う必要があります．が，なんだかWeb上の情報のままだと上手く行かなかったので，Laravel::Redis, Predis のソースを追いかけて追いかけて追いかけて，やっと上手く動きました．


使用バージョン：Laravel-5.1

## 環境 ##

### Master ###

書き込みはマスタに行う

* IP: 192.168.100.100
* Port: 6379

### Slave ###

参照専用

* IP: 192.168.100.101
* Port: 6379

## 設定ファイル ##

```config/database.php
    'redis' => [

        'cluster' => true,

        'master' => [
                'schema'     => 'tcp',
                'host'     => '192.168.100.100',
                'port'     => 6380,
                'alias'     => 'master',
        ],      
        'slaves'    => [
            [   
                'schema'     => 'tcp',
                'host'     => '192.168.100.101',
                'port'     => 6379,
                'alias'     => 'slave-01',
            ],  
        ],      
        'options'   => [
            'replication'   => true, 
        ],              
    ],
```


これで書き込み／読み出しの振り分けをやってくれました．
なんだか Predis のドキュメントと違うような気がする．．．2時間悩みましたorz


#### 2015/10/26 修正 ####

- 設定ファイルのサンプル，前提条件とサーバアドレスが異なっていたので修正しました．
MACへJenkinsをインストール(インストールの仕方編)

MACにJenkinsをインストールする方法はいくつかある。
結局どれもほぼ変わらないのだが、個人的な好みは（3）なのだが、一般的には(1),(2)の方法が主流なので、いろいろなインストールの仕方をメモ。


# (1)jenkins 公式サイトからインストールする方法
一般的なMACでのツールインストール方法。
http://jenkins-ci.org/
ここの「Native packages」から該当の（MACの）をダウンロード。
※jenkins-X.XX.pkg みたいなファイル名
GUIベースなので「OK」「OK」って言ってれば勝手にJenkinsさんに会えます。

```jenkins.warが置いてあるところ
 /Application/Jenkins/jenkins.war
```
```JENKINS_HOME.
 /Users/Shared/Jenkins/Home
```

- メリット
インストール自体はとっても楽。
自動で launchctl（裏で自動で動かしてくれるもの的な）に登録もしてくれるので、MACを再起動してもJenkinsは起動される。

- デメリット
半面裏で何やってるか理解しなくても動いてしまうので、どうやってJenkinsを止めるのか？どのユーザ権限で動いてるのか？などいろいろとわからないことがでてくる。
（そのせいでJenkinsからUnityが動かなかったり散々だった・・・）

### ちなみに・・・
- Jenkinsを止める方法

``` 
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
``` 

- (止まった状態から)起動しなおす方法

``` 
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
``` 

# (2)homebrew でインストールする方法
一般的なMACでのツールインストール方法２
こちらも手順的にはお手軽

ターミナルを立ち上げて、

``` インストール.
brew install jenkins 
``` 

``` jenkins起動.
java -jar /usr/local/opt/jenkins/libexec/jenkins.war
(jenkins だけでも起動可　2017/01/07のコメントを受け修正）

``` 

```jenkins.warが置いてあるところ
/usr/local/opt/jenkins/libexec/jenkins.war
```

``` JENKINS_HOME.
/Users/【ユーザ名】/.jenkins/Home
```

- メリット
こちらもインストール自体はとっても楽（コマンドプロンプトやターミナルに抵抗ある人で無ければｗ）

- デメリット
launchctlなどに登録するのは手動（登録しないとずっとターミナルの１つで動かしておかないといけない）
MAC再起動したら再度javaを叩いて起動しなおし。
jenkins.war の置いてあるところが階層深くてキライｗ（個人的に）。


# (3)jenkins 公式サイトから(warだけ)インストールする方法
ある意味ひねくれ者？
http://jenkins-ci.org/
ここの「Java Web Archive (.war)」から「Latest and greatest (～)」をダウンロード。

``` jenkins起動.
java -jar /【自分の好きなところに置いた】/jenkins.war
``` 

```jenkins.warが置いてあるところ
 どこでも可（DLしたら好きなところに置きましょう）
```

``` JENKINS_HOME.
/Users/【ユーザ名】/.jenkins/Home
```

- メリット
ただただシンプル。

- デメリット
launchctlなどに登録するのは手動（登録しないとずっとターミナルの１つで動かしておかないといけない）


# 結論
どれでインストールしても、いくらでもjenkins.warの置き場所やJENKINS_HOMEの場所は変えられるので、ぶっちゃけどれからでも他の状態にすることができる（最初と言ってること違うｗ）
ただ、インストールの仕方によって微妙にパスが違うので、MAC ＆ jenkins でググったときにたまにアレ？って思うことがある人も中にはいるんじゃないかなと。
scrollイベントの負荷を減らす

# scrollイベントの負荷を減らす
scrollイベントを実行すると処理回数が多くて好きではありませんでした。
いろいろ調べて感じた事、結果どうしたかを書いてみます。

## setIntervalを使った処理

```js
var outerPane = $details.find(".details-pane-outer"),
    didScroll = false;
 
$(window).scroll(function() {
    didScroll = true;
});
 
setInterval(function() {
    if ( didScroll ) {
        didScroll = false;
        // Check your page position and then
        // Load in more results
    }
}, 250);
```

これをすると常時監視をする感じになるので、処理的にはどうなんだろうなぁと思いました。


## 間引きさせて実行する

```js
var timer = null;
$(window).on('scroll',function() {
	clearTimeout( timer );
	timer = setTimeout(function() {
		//処理内容
	}, 300 );
});
```

これ、うまく動くんでしょうか・・・
私がやろうとするとスクロール中のイベントが重複処理になって、すごい速さで同じ処理を行おうとしてしまいました・・・。


## スクロール時にフラグをたててしまう
私が今回ついた結論です。

```js
var flug = true;
$(window).scroll(function(){
  if(flug){
    flug = false;
    setTimeout(function(){
      // ここに処理を書く
      flug = true;
      return flug;
    }, 200);
  }
});
```

上記の``200``という数字を変えれば、遅くも早くもできます。

簡単にいうと、
スクロールしたらボタンを押して、
ボタンが上がってくるまでスクロールしても押せませんよ。

という形ですね。

もう少し細かく言うと、

* ``flug``が``true``のときにスクロール
  1. 最初に``flug``を``false``にしておく。
  2. 処理が250ms後に実行される。
  3. 処理が終わったら``flug``を``true``にもどす。
* ``flug``が``false``のときにスクロール
  1. なにも処理されない。

おそらくresizeでも同じように処理の負担を減らせるのではないでしょうか。(``scroll``を``resize``に変えるだけ)

---

### まとめ
私はまだJavascriptの扱いが慣れていないので、これが正しいという見解ではありません。
あくまで個人的に組んでみた結果という感じです。

今回は、こういった方法をとりましたが、もっといい方法があるよ！とか、この方法おかしくない？とか、
あったら教えていただけたらうれしいです！
はじめてのGo言語 1.環境構築


普段はJavaScriptばかり書いていますが、最近Go言語を勉強し始めました。
忘れないように最初にしたことをメモ。

#インストール
インストールは[homebrew](http://brew.sh/index_ja.html)経由で行いました。

```
$ brew install go
```

インストールが完了したら

```
$ go version
```

でバージョンを確認します。
下記のように表示されればOK（2015年10月13日現在）

```
go version go1.4 darwin/amd64
```

#GOPATHを設定する
次にGOPATHという名前の環境変数を設定します。
GOPATHで指定したパスははGoのパッケージをインストールする場所になるようです。

```.bashrc
export GOPATH=$HOME/<pathを指定する>
```

#Goを書いてみる
とりあえずHello worldを書いてみる。
`hello.go`というファイルを作って以下の内容を記述する。

```hello.go
package main

import "fmt"

func main() {
    fmt.Println("hello world")
}
```

`hello.go`があるディレクトリまで移動して、以下のコマンドを叩たたく。

```
$ go run hello.go
hello world
```

hello worldが表示されればOK。
`go run`はコンパイル後にそれを実行してくれる。
もしコンパイルのみをしたい場合は

```
$ go build hello.go
```

でコンパイルができる。


ちなみに以下のコマンドを打つと自動でGoが定めたスタイルに合わせてコードを整形してくれる。

```
$ go fmt hello.go
```

まだまだ始めたばかりなので間違いとかありましたらぜひ教えて下さい。
globを使ったフォルダ内のファイルネームの取得

フォルダ内のファイル名を簡単に取得したい時によく使います。
ソースはこちらhttp://svn.python.org/view/python/branches/release27-maint/Lib/glob.py?view=markup
下記のようなフォルダがあったとすると、
###
```terminal.
$ ls
0.csv		2.txt		5.csv		7.txt		test_glob.py
0.txt		3.csv		5.txt		8.csv
1.csv		3.txt		6.csv		8.txt
1.txt		4.csv		6.txt		9.csv
2.csv		4.txt		7.csv		9.txt
```
######サンプル
```test_glob.py
   import glob
   text_fnames = glob.glob('./*.txt')
   print text_fnames
```
######実行
```output.
$ python test_glob.py 
['./0.txt', './1.txt', './2.txt', './3.txt', './4.txt', './5.txt', './6.txt', './7.txt', './8.txt', './9.txt']
```
このように、`*.txt`とすることでファイル内のtxtファイルを簡単に取得できます。
######解説
`glob.glob`の引数は文字列で、書き方はシェルと一緒です。
引数には、相対パス、絶対パスの両方が使えます。

また、`glob.glob`を`glob.iglob`とすれば、イテレータがかえってきます。
ファイルの数が膨大になる時以外は、`glob.glob`のみで足りると思います。

ソースの中身的には、`glob.iglob`が`yeild`で一つづつファイルネームを生み出してる。
`glob.glob(pathname)`はただ単に`list(glob.iglob(pathname) )`としてる感じです。
あとは、`os`モジュールを使って、検索するだけの簡単なコードになっています。
【FileMaker】タッチ＆ゴーでデータの移行 改良版

[前回](http://qiita.com/tyuma/items/1af03f4fb7abea6def99)、エクスポートファイルとしてcsv形式にしたけれど、これだと照合順序をいちいち確認しないとならないので、照合順序が取りやすいフィールド名付きのエクスポートファイルを作成するバージョンに改良しました。

フィールド名付きで出力するには、Merge形式のファイルタイプにします。
拡張子は、"mer"です。
![スクリーンショット 2015-10-13 19.42.59.png](https://qiita-image-store.s3.amazonaws.com/0/60538/8c22fbee-373d-c14b-eab2-d6e90def7af1.png)

FileMakerで扱える出力ファイルの種類は、[こちら](http://filemaker-jp.custhelp.com/app/answers/detail/a_id/9158/~/filemaker-pro-%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B)から確認できます。

前回のスクリプトで変更したところは、14,15行目の、Merge形式に対応する部分のみです。
![スクリーンショット 2015-10-13 19.57.45.png](https://qiita-image-store.s3.amazonaws.com/0/60538/512b03ea-af8f-5d4e-09aa-ee043b9621c6.png)
エクスポートファイルとインポートする時の文字コードが違っていると、インポートが失敗する時があるようです。（というか、失敗した。）

ちゃんちゃん。
Androidでアイコンバッジを表示する方法



[ShortcutBadger](https://github.com/leolin310148/ShortcutBadger)を使用すれば簡単に表示できます。

　
proguardを使用する場合は、以下を追記する必要があります。

```
-keep class me.leolin.shortcutbadger.** {*;}
```
【CakePHP】Model::Create()


Model::save()の前に実行するcreate()についてもろもろ。

####前のsave()の残りをクリアしてくれる。
→ループの中でsave()繰り返すときは忘れずcreate()する件。

####DBのデフォルト値を設定してくれる。
デフォルト値いらないなー、クリアだけしてくれればいいのにってときは、nullもしくはfalseをパラメータで渡す。

####モデルの初期化を行うことができる。
→あまり利用シーン思いつかないなー。POSTとデフォルト値マージする場合とか？自分ならarray_merge()使いたいかも。

```php
$this->User->create([
  'name'=>'suzuki'
]);

$this->User->save([
  'weight'=>60
]);
```
ajaxの連打防止

## コード
いろいろ調べたけど、
abortの利用方法がうまくいかないから、
それをflagで送信中かどうか判定して
連打を防止する

```
$(function(){
    var flag;
    $('#execute').click(function(){
        if (flag) {
            return;
        }
        flag = true;//flagを立てる
        $.ajax({
            url: "hoge.com",
            type: "post",
            data:{
              foo: foo,
            }
        })
        .done(function(data) {
            // ...
        })
        .fail(function(data) {
            // ...
        })
        .always(function(data) {
            flag = false;//通信した後、flag解除する
        })
    });
});
```


### setTimeoutで連打送信の制約

改修版
setTimeoutで処理を一旦停止させる

```
var flag = 0;
function hoge() {
	if(flag) return false;

	$.ajax({
		url: url,
		type: 'POST',
		data: {	
                   foo: foo,
		},
	})
	.done( function(data) {
                //...
	})
	.fail( function(XMLHttpRequest, textStatus, errorThrown) {
		//...
	})
	flag = 1;
	setTimeout(function(){ flag = 0;}, 500);// ← ここ
}
```

- [abortの参照](http://ziblo.net/2014/05/jquery%E3%81%A7ajax%E3%81%99%E3%82%8B%E3%81%AA%E3%82%89-abort%E3%81%AF%E3%82%82%E3%81%A1%E3%82%8D%E3%82%93%E7%9F%A5%E3%81%A3%E3%81%A6%E3%82%8B%E3%82%88%E3%81%AD%EF%BC%9F/)
- [小粋空間](http://www.koikikukan.com/archives/2013/12/06-015555.php)
Javaで艦これ用スクショツールを作ってみた その3

※一覧：
その1→http://qiita.com/YSRKEN/items/ac75ffcb0f72adbd2a7f
その2→http://qiita.com/YSRKEN/items/6772903bf6242d8a86b7
その3→ここ

#概要
　ここまでで、必要な機能の90％以上は既に実装できましたので、後は細かな改良となります。
　とは言え、細かな改良でも積み重なれば大きなものになりますので、頑張っていこうと思います(欲しい機能がありましたらコメントでお寄せください)。

#あたしのガベージコレクション、あんまり役に立ってないかもー！
　ご存知のように、Javaには[ガベージコレクション(GC)](https://ja.wikipedia.org/wiki/%E3%82%AC%E3%83%99%E3%83%BC%E3%82%B8%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3)が存在します。これは**確保したリソースが参照されなくなった時点で自動解放される**というなかなかに便利な機能で、ガンガンnewしまくる言語にとっては必須と言っても過言ではない存在です。
　ただ、**使わない参照をずっと保持している場合はGCされません**し、いつGCによってリソースが解放されるかが分からないので**適切なタイミングでリソースが解放されないと困る場合はGCが邪魔**になります。C++にスマポ等があっても仕様上「GC」が存在していないのは[パフォーマンスを史上とする言語として当然](https://ja.wikipedia.org/wiki/Java%E3%81%A8C%2B%2B%E3%81%AE%E6%AF%94%E8%BC%83#.E3.83.AA.E3.82.BD.E3.83.BC.E3.82.B9.E7.AE.A1.E7.90.86)と言えるでしょう。
　ただ、Javaでもリソースを明示的に解放することはできます。その有名なものの一つとして、**Graphics#disposeメソッド**があります。名前の通り、Graphicsクラスのインスタンスを生成してから、それを使わなくなった場合に明示的に破棄できるといったものです。
　これを明示的に宣言すべきかは意見が分かれているらしいのですが、**使わないリソースがGCまで放置されるというのが気持ち悪い**ので早めにdisposeしておくことにします(C++脳)。

#新開発の自動画像取得機能が自慢なの！
　[前回](http://qiita.com/YSRKEN/items/6772903bf6242d8a86b7)、ショートカットキー入力がJavaの仕様上面倒臭いことを話しました。
　その代わり、今回では、**改装一覧画面に自動で画像が登録される機能**を実装しました。つまり、前回までは、改装一覧画像(編成および装備が分かる画像)を作成するのに、

* 艦これの画面を改装画面にする
* 画像追加ボタンかAlt+Zキーで画像を登録する
* それを必要数分繰り返す

ことが必要だったのが、

* オプションから「自動取得」を有効にする
* 艦これの画面を改装画面にして、追加したい艦娘の場所をクリックして開く
* すると自動で登録されるので、後は艦これの画面を操作するだけでオッケー

になるのです。ポイントとしては、**javax.swing.Timerを使えば定期的にスクショ画像を取得できる**ということでしょうか。あまり重いのも勘弁なので2fps程度にしていますが、**人間がマウスを動かす際にそれほど高速に動かさないだろう**ということで特に調整機構は設けません。

#ど、どうしましょう？ れ、連射用意！　……ですね？
　連射とは行っても[高橋名人](http://ameblo.jp/meijin16shot/)的な意味ではなく、スクショを連続してキャプチャする機能のことを指します。これもjavax.swing.Timerを使えば簡単……なのですが、先ほどの自動取得もjavax.swing.Timerを使うのでコードが複雑になります。というわけで、条件を整理してみました。

|動作モード|タイマー間隔[ms]|挙動|
|:---------|:---------------|:---|
|通常|100～1000|連射機能をONにした場合は1～10fpsで自動保存される|
|改装|500|自動取得機能をONにした場合は2fpsで自動認識される|
|ソート|なし|タイマーはOFF|

　また、これらの挙動を実現するため、次の箇所でタイマーの間隔を変更するように記述しました。こういうときに**[イベント駆動型プログラミング](http://e-words.jp/w/%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%83%89%E3%83%AA%E3%83%96%E3%83%B3.html)ができる言語は便利ですね！**

* オプション画面で、自動取得のチェックを変更したとき
* オプション画面で、連射機能のfpsを弄ったとき
* メイン画面で、動作モードを変更したとき

#すこしは理想のソフトに近づけたかな？
　更に、**[潜在的なユーザーの方々からありがたい意見を頂戴しつつ](http://uni.open2ch.net/test/read.cgi/gameswf/1444662273/896-)**、それを反映させるように改良を進めました。具体的にはこんな感じです。

* スクショ撮影時に、自分や演習相手の名前を隠して保存することができる機能
* 編成画面で、編成部分だけを切り取って保存する機能
* [秋津洲ちゃれんじ](http://kantama.net/archives/39301958.html)用に、スクショを連射する機能
* 資源部分だけ切り取って保存する機能
* etc.

#更新が来ているぞ。確認せんのか？
 以上を取り入れた[記録は大切なの.jar Ver.1.2](https://github.com/YSRKEN/cap_nano/releases/tag/Ver.1.2)をリリースしました。活用してくだされば幸いです。
Mac初心者がEl Capitanにnginx + php 環境を構築してハマったメモ その2

※この記事は「[Mac初心者がEl Capitanにnginx + php 環境を構築してハマったメモ その1](http://qiita.com/sygnas/items/d727f64939bd5ba5518d)」の続きです。

その1で各種アプリのインストールの土台が出来上がりました。
ここから様々なツールをインストールしていきます。

# gitのインストール

GitHubなどで知られるバージョン管理ツールです。

```bash
$ brew install git
〜インストールに関するメッセージがずらずら出る〜
```

インストール後に`which git`と入力して、実行ファイルの場所を確認しましょう。
`/usr/local/bin`なら正しいパスになっています。
違っていたら「その1」のパス設定を確認してください。

```bash
$ which git
/usr/local/bin/git
```

# nginxのインストールと起動

これもHomebrew使うので超簡単です。

```bash
$ brew install nginx
```

## nginx自動起動

OSXではログオン時の自動起動にLaunchAgentsというものを使います。
GUIだと`システム環境設定＞ユーザーとグループ＞ログイン項目`がありますが、あれのCLI版だと思ってください。

LaunchAgentsは`~/Library/LaunchAgents`内にある設定ファイルから起動します。
下記のコマンドで設定ファイルのエイリアスを作り、LaunchAgentsのコントローラーに読み込ませます。

```bash
$ ln -sfv /usr/local/opt/nginx/*.plist ~/Library/LaunchAgents
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
```

ブラウザで http://localhost:8080/ を開いてみましょう。
nginxの表示が出たらインストールは成功です。

自動起動をやめるには下記のコマンドを実行します。

```bash
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.nginx.plist
```

単純にnginxを停止、再起動させたいなら下記のコマンドです。

```bash
$ sudo nginx -s stop
$ sudo nginx -s reload
```

ちなみに「`~`」というのはユーザー毎のホームディレクトリを意味します。
ユーザー名「hoge」なら`/Users/hoge`を意味します。


## nginx設定

初期設定では**ポート8080番**、ドキュメントルートは`/usr/local/var/www`になっています。
80番はOSX標準のApacheがすでに使っているので、変更可能ですが面倒なので省略します。

ドキュメントルートを`/Users/hoge/www`に変更してみましょう。
設定ファイル`/usr/local/etc/nginx/nginx.conf`を編集します。

```bash:/usr/local/etc/nginx/nginx.conf
〜中略〜
    server {
        listen       8080;
        server_name  localhost;
        〜中略〜
        location / {
            root    /Users/hoge/www/;
            index  index.html index.htm;
        }
〜中略〜
```

保存したらnginxを再起動させます。

```bash
$ sudo nginx -s reload
```

上記ディレクトリに適当なファイルを置いて、ブラウザから表示できたら成功です。

# PHPのインストール

Homebrewが参照するリポジトリを増やします。

```bash
$ brew tap homebrew/dupes
$ brew tap homebrew/versions
$ brew tap homebrew/homebrew-php
```

PHPをインストールします。

```bash
$ brew install php70
```
色々なサイトを見ていると `brew install php56 -with-fpm` という記述がありますが、何故か上手くいかなかったのでオプション無しでやりました。

## 追記：PHP7について（2016.8.21）

記事掲載時ではPHP5.6系でしたが、現在はPHP7のほうが良いので書き換えました。

なお、すでにPHP5.6系を入れいてアップデートしたいという場合は、下記の記事が参考になります。

参考：[PHP5系からPHP7に移行した。(Homebrew](http://qiita.com/fagai/items/fb69462b3d7caaaa5346)

## PHP自動起動

nginxと同様にログイン時に自動起動するように設定します。

```bash
$ ln -sfv /usr/local/opt/php56/homebrew.mxcl.php56.plist ~/Library/LaunchAgents/
$ launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
```

自動起動を止めるときは下記のコマンドを実行します。

```bash
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.php56.plist
```

## nginxの設定

PHPをインストールしましたが、このままではブラウザから表示できません。
再びnginxの設定を編集します。

```bash:/usr/local/etc/nginx/nginx.conf
〜中略〜
        location ~ \.php$ {
        root    /Users/hoge/www/;
        fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
〜中略〜
```

初期設定では下記のようになっていて、そこでつまづきました。

```bash:/usr/local/etc/nginx/nginx.conf
fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
```

ひとまずここまでの設定でPHPの表示が出来ると思います。
AndroidStudio で長時間エミュレータが起動しない場合の対処法


最近AndroidStudioを触り始めたのですが、
エミュレータが起動しなかったので
その際の対処法メモ

#症状

![スクリーンショット.png](https://qiita-image-store.s3.amazonaws.com/0/6955/8881940b-5b4a-af29-f880-c4d1fe4a10a7.png)

こんな感じのブート画面ずっと続く。
androidロゴは動いているのでフリーズはしていないようですが・・・
自分の場合は１時間以上放置しても変化しなかったです。

#原因

ログを見てみると

**HAXM is not working and emulator runs in emulation mode**

というログが出ている

HAXM（Hardware Accelerated Execution Manager）というのは
仮想化支援機能を使ってAVD（Android Virtual Device）を動作させることができる機能。
要はこれを使用することでエミュレータを高速化できるということみたい。
で、その高速化の機能が働いていないようです。

#対処法

エミュレータの設定のRAMを減らす
以上！

#解説

HAXMインストール時に「Memory Limit」で上限メモリを設定でき、
エミュレータのメモリ量がこれを超えてしまうと使用できないようです。
なのでRAMに大きな値を設定しまうとHAXMを使用した高速起動ができないという事みたいです。
なので、ブート画面がずっと続いていたのは単純に時間がかかっていただけなのかなと。
ちなみに正常にHAXMが動作している時は

**HAXM is working and emulator runs in fast virt mode**

というログが出ます。
これで動作の確認ができるかと。
自分の場合はこのログが出力されてHAXMが動作している状態だと
１分前後ぐらいでエミュレータが起動してくれました。




以上
[FuelPHP]画像をアップロードするときに便利なUploadのErrorExceptionエラー解消方法

##はじめに
Uploadクラスを使用して速攻エラーが出たので、メモを残しておきます。
みなさんもいざUploadクラスを使用するときにエラーが出た場合に参考にしてください。

##こんな感じのソース

```php:
$config = array(
		'randomize' => true,
		'ext_whitelist' => array('img', 'jpg', 'jpeg', 'gif', 'png'),
		);
Upload::process($config);

if(Upload::is_valid()){
	// save系の処理
}
else{
	// error		
}
```

##エラー内容
![error.PNG](https://qiita-image-store.s3.amazonaws.com/0/62070/074d256e-826c-7725-32eb-e4546947d000.png)

ErrorException [ Fatal Error ]:
Call to undefined function Fuel\Upload\finfo_open()

##解決方法

finfo_open()が無効になってるときのエラーのようです。

1.php.iniを開いく
2.;extension=php_fileinfo.dll　を見つける（994行目付近）
3.extension=php_fileinfo.dll　コメントアウトを外す
4.Apacheの再起動　←ここ重要だいたい忘れる
JQuery正規表現めも

## jqueryメモ帳

**アルファベットのみ**
`string.match(/^[a-zA-Z]+$/);`

**英数字のみ**
`string.match(/^[a-zA-z0-9]+$/);`

**全角のみ**
`string.match(/^[^\x01-\x7E]+$/);`

**符号なし整数判定**
string.match(/^[0-9]+$/);

**符号なし小数点6桁まで判定**
string.match(/^[0-9]+\.[0-9]{0,6}$/);

PS:全角チェックの場合は、「^」二つのことを注意すること

---
[参照先](http://www.tohoho-web.com/js/regexp.htm#RegExp)
enhancd.logへの書き込み

[LT](https://atnd.org/events/70008)でupamune氏が[べんりツール with peco](https://speakerdeck.com/upamune/benrituru-with-peco)ということで[enhancd](https://github.com/b4b4r07/enhancd)と[peco](https://github.com/peco/peco)というものを知ったので, 
使ってみたが、enhancd.logに溜まっていかないといい感じに使えなかったので、
```
$find `pwd` -print >> $HOME/.enhancd/enhancd.log
```
以上で、enhancd.logに自ら書き込むことでとりあえず、使える感じにした。
すべてをenhancd.logに書き込むのも、必要なところだけ自分で書き込むのもよろしいとは思わないので
よさげな方法があれば教えてもらえればと思います。
【react-router】複数のパスで同一コンポーネント内を表示しつつ、それぞれの初期fetchを実行する方法

表題がわけわからないかもですが、やりたいことは

- `react-router`を使用している（今回とは関係ないけど、`redux-router`も使用している）
- ルーティングで`/notifications`, `/notifications/unread`, `/notifications/official`みたいにあったときに、表示するコンポーネントは同一のものを使用したい
- それぞれのパスで画面遷移したときに、それぞれに相応しいAPIを初期処理として呼びたい

みたいな感じです。ルーティングの設定のところは、そもそもこの書き方がイケてるのかまだわかっていないのですが、以下のような感じです

```js:routeの設定
    <Route path='notification' component={NotificationComponent} >
      <IndexRoute />
      <Route path='unread' />
      <Route path='official' />
    </Route>
```

## バージョン情報

- react        : `0.14.0`
- react-dom    : `0.14.0`
- react-router : `1.0.0-rc1`
- redux        : `3.0.2`
- react-redux  : `2.1.2`
- redux-router : `1.0.0-beta3`

## 同一のコンポーネントにしないのであれば・・・

それぞれのコンポーネントの`componentDidMount`で`fetch`の処理をすればいいだけ

```js:NotificationAll.js
  componentDidMount() {
    store.dispatch(Actions.fetchAllNotifications())
  }
```

```js:NotificationUnread.js
  componentDidMount() {
    store.dispatch(Actions.fetchUnreadNotifications())
  }
```

## 何も考えず同一のコンポーネントにすると・・・

`/notifications`から`/notifications/unread`に遷移したときに、`componentDidMount`は呼ばれないため、`fetch`の処理が走らない。

または、`componentDidUpdate`なんかで呼び出すようにしたら、これはAPIの処理で`state`を更新すると思うので、大抵の場合は無限ループになってしまう

```
  componentDidUpdate() {
    store.dispatch(Actions.fetchNotifications())
  }
```

## `react-router`の`Component Lifecycle`というページに載っていた。

https://github.com/rackt/react-router/blob/master/docs/guides/advanced/ComponentLifecycle.md#fetching-data

とはいえ、どういうパターンでの遷移か（子コンポーネントを表示する遷移なのかとか）でフックするイベントが異なるので思ったより複雑。

今回の自分のケースだと、

```js:NotificationComponent.js
  componentDidMount() {
    this.fetch();
  }

  componentDidUpdate (prevProps) {
    if (prevProps.location.pathname !== this.props.location.pathname) {
      this.fetch();
    }
  }

  fetch() {
    // ...
  }
```

こんな感じで、`path`を比較してるところはイケてないと思うのですが、最初にリストアップしたやりたいことはとりあえずできた
CircleCIでMySQLに繋げないとです…

弊社のメンバーがすげぇ苦労してたのできっと誰かの為になると思い、残しときます。環境は以下。

- CakePHP3で作成しているアプリ
- CircleCIでCIを設定中
- MySQLに接続

マイグレーションの時に下記のようなエラーになります。

```
./bin/cake migrations migrate

Welcome to CakePHP v3.1.0 Console
---------------------------------------------------------------
App : src
Path: /home/ubuntu/gbs/src/
PHP : 5.6.5
---------------------------------------------------------------
using migration path /home/ubuntu/gbs/config/Migrations


                                                                              
 [InvalidArgumentException]                                                   
 There was a problem connecting to the database: SQLSTATE[HY000] [2002] No s  
 uch file or directory                                                        
                                                                             


./bin/cake migrations migrate returned exit code 1

migrate [-t|--target TARGET] [-d|--date DATE] [-p|--plugin PLUGIN] [-c|--connection CONNECTION] [-s|--source SOURCE] Action failed: ./bin/cake migrations migrate
```

http://easyramble.com/cakephp-mysql-socket-path.html
こちらでやっていたように、 `unix_socket` を指定したら良いのかと思ったのですが、次は適切な指定情報がわからないという状況。

```
mysql -u ubuntu circle_test -e "show variables like '%sock%'"
```

こうすると、socketのパス情報が見れます（今回は`/var/run/mysqld/mysqld.sock`）。それをコンフィグに追加。

```php:config/app.php
 // 'Datasources'の各環境の下に書く（具体的な場所は人によると思う）。

'unix_socket' => '/var/run/mysqld/mysqld.sock'
```
マルチスレッドで、Circular dependency detected...

マルチスレッドで自作のライブラリを追加する為に、autoloadを使用している場合に以下が発生する。
> RuntimeError: Circular dependency detected while autoloading constant Lib::Hoge

autoloadはスレッドセーフでない為、衝突して発生する。

```lang:config/application.rb
config.autoload_paths += %W(#{config.root}/lib)
```

を使わずに

```lang:config/application.rb
config.eager_load_paths += %W(#{config.root}/lib)
```

で、以下の設定がされていること

```lang:config/environments/production.rb
config.eager_load = true
```

で改善される。

autoloadは、const_missing時に名前空間を元にファイルを読み込む。
eagerloadは、起動時にファイルを読み込む。
ちなみに、config.eager_load_pathsに設定したディレクトリは再帰的に読み込まれる。