OmniAICreator/Qiita-1.07M huggingface dataset:
MacのVimでHomebrewを使ってクリップボード連携を有効にする


Mavericksで標準インストールされているVimではクリップボード連携ができません。
クリップボード連携できるようになるとVimで書いたプログラムなどをコピーしてその他のエディターなどに貼り付けることができるようになります。

特に何もしていないVimでは以下のように表示されると思います。

```Bash
$ vim --version | grep clipboard 
-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments 
 -xterm_clipboard -xterm_save

#-clipboard＝クリップボードが無効
```

**おすすめのサービス：[MyBooks](http://mybooks.strikingly.com/)**

## 手順

Homebrewを使って新しいVimを入れます。

```Bash
$ brew update
$ brew install vim
```

インストールされたことを確認します。

```Bash
$ brew list vim
/usr/local/Cellar/vim/7.4.161/bin/xxd
/usr/local/Cellar/vim/7.4.161/bin/vimtutor
/usr/local/Cellar/vim/7.4.161/bin/vimdiff
/usr/local/Cellar/vim/7.4.161/bin/vim
/usr/local/Cellar/vim/7.4.161/bin/view
/usr/local/Cellar/vim/7.4.161/bin/rvim
/usr/local/Cellar/vim/7.4.161/bin/rview
/usr/local/Cellar/vim/7.4.161/bin/ex
/usr/local/Cellar/vim/7.4.161/share/man/ (113 files)
/usr/local/Cellar/vim/7.4.161/share/vim/ (1496 files)
```

インストールしたvimがclipboard連携できるか確認します。

```Bash
$ /usr/local/Cellar/vim/7.4.161/bin/vim --version | grep clipboard
+clipboard       +iconv           +path_extra      -toolbar
+eval            +mouse_dec       +startuptime     -xterm_clipboard

# +clipboardになっているのでOK
```

既存のvimを置き換えます。

```Bash
$ sudo mv /usr/bin/vim /usr/bin/old_vim                                                                                                                                           

$ sudo ln /usr/local/Cellar/vim/7.4.161/bin/vim /usr/bin/
```

きちんと配置できたことを確認します。

```Bash
$ vim --version | grep clipboard
+clipboard       +iconv           +path_extra      -toolbar
+eval            +mouse_dec       +startuptime     -xterm_clipboard
# +clipboardになっていることを確認
```

ここまでできたらVimの設定です。
`~/.vimrc`に以下の設定を追加しましょう。

```
set clipboard+=unnamed
```

これで終了です。
vimでコピーした文字列がOSレベルのクリップボードで保持できるようになります。

tmux内で使おうとしたらエラーが出ました。[次の記事](http://qiita.com/shoma2da/items/853074f05445722b496e)で書きました。

[shoma2daをフォロー](https://twitter.com/intent/user?screen_name=shoma2da)
Intellij Idea 13 のTerminalでCygwinを使う

# Intellij Idea 13 のTerminalでCygwinを使う

Intellij Idea 13の新機能でTerminalが使えるが、Windowsの場合cmd.exeが起動されるので今ひとつ。
どうせならCygwin使いたい

## Cygwinインストール

ここからダウンロードしてインストール
[http://cygwin.com/install.html](http://cygwin.com/install.html)

## Intellij Ideaの設定
[Preferences]→[Terminal]
C:\cygwin64\bin\bash.exe --login
Markdownのtable記述でのエスケープ

## Markdownのtable記述の|問題

Markdownでテーブルを書いてる時にドキュメントの内容に|が入っていて、テーブルの区切りと認識されてしまう時には、|を``&#124;``に置き換えることで正常に表示されるようになる。

### 素直に書いてみる

```
| カラム1 | カラム2 |
|-------|------|
| これ|それ | あれ|これ |
```

| カラム1 | カラム2 |
|-------|------|
| これ|それ | あれ|これ |

### エスケープしてみる

```
| カラム1 | カラム2 |
|-------|------|
| これ&#124;それ | あれ&#124;これ |
```

| カラム1 | カラム2 |
|-------|------|
| これ&#124;それ | あれ&#124;これ |
HerokuでWebsocketを使いたいときの注意点

よく以下のようにやればいい、と書いてあるのだが実際やってみると「labsなんてコマンドないよ」みたいなメッセージが出てはまったことがあった。

```
heroku labs:enable websockets -a myapp
```

heroku labsは実はプラグインなので、インストールが必要(あまり困っている人がいないところを見ると最近は最初から入っているのか？一応`gem update heroku`をかけたのだが・・・)。

```
heroku plugins:install https://github.com/heroku/heroku-labs.git
```

これで晴れてwebsocketを使えるようになった。

＜参考＞
[Heroku Labs: WebSockets](https://devcenter.heroku.com/articles/heroku-labs-websockets)
[heroku-labs](https://github.com/heroku/heroku-labs)
Sphinx: 表にクロスリファレンスする



毎度わすれるのでメモ。 tableディクレクティブ前にリファレンスを入れる


	.. _discovery.rel:

	.. table:: 

    	=====================   ============================================= 
    	Rel Type                URI
    	=====================   ============================================= 
    	OpenID Connect Issuer   http://openid.net/specs/connect/1.0/issuer
    	=====================   ============================================= 


セクションとかと同じように参照。

	:ref:`Discovery Rel Type <discovery.rel>`
iOS開発に加わって最初に学んで欲しいこと


## コード規約
* https://github.com/wantedly/objective-c-style-guide
    * NYTimesをベースにraywenderlichからいくつか使えるものを追加し、Storyboard, Category, Directory, Cocoapodsの章を追加した。
    * https://github.com/NYTimes/objective-c-style-guide
    * https://github.com/raywenderlich/objective-c-style-guide

## 既存のプログラム見て確認して欲しいポイント
* RestKit
    * APIの仕様の確認
    * ORマッピングについて
    * モデルへのマッピングをどうやっているか
    * ObjectManager, ResponseMapping, RequestMapping, Descriptorはどういう役割をしているか
* StoryboardとContainer
    * autolayoutの使い方
    * viewController間のデータ受け渡しはどうしているか
    * containerViewのsize調整はどうやっているか
* Extensionsの内容
    * それぞれのObjectにどういうカテゴリを定義しているか
* モダンなiOSの記法(コード規約)
    * NSArray, NSDictionaryの定義方法
    * NSEnum
    * property
* 編集画面のデータの受け渡し方法
    * copyを利用した受け渡し
* コントローラーを軽く
    * modelに移せるものは移す
    * view移せるものは移す
    * http://www.objc.io/issue-1/lighter-view-controllers.html
    * (data sourceとprotocolの独立はしてない)
* comunication pattern
    * delegate, notification, kvo, blockなどの使い分け
    * http://www.objc.io/issue-7/communication-patterns.html
* ライブラリ
    * どういうものを利用しているか確認してほしい
* 定数の使い分け
    * globalな定数か、そのクラスだけの定数か、他の一部なクラスで使う定数か
    * enumを使ってコードを整理する

## 進め方
* コード読んで分からない箇所は全部聞く
    * 実装の意図
    * 勉強するのにどこを見ればいいかとか
* githubでコミュニケーション
    * 細かい単位でレビューしやすいcommit
    * pushして定期的に実装内容や方針の確認

## ブックマーク
### 全般
* foundationが学びたいとき http://nshipster.com/
* いろいろTipsがある http://www.objc.io
* UIのサンプル https://www.cocoacontrols.com/
* iOSの情報取得のbot http://www.iosdevbot.com/
* 動画。割といい http://nsscreencast.com/
* iosの情報ブログ http://cocoadays-info.blogspot.jp/
* apple 日本語ドキュメント https://developer.apple.com/jp/devcenter/ios/library/japanese.html
* cocoapodの検索(川崎さんが作った) http://cocoapods.wantedly.com/
* 本家 http://cocoapods.org/
* いろいろcocoapodがまとまってる http://bpoplauschi.wordpress.com/2013/11/06/worthy-ios-libraries/
* gitに慣れてないなら http://qiita.com/reikubonaga/items/60b4f6ee0a86ed06e83b
* githubのbrowserの使い方 http://qiita.com/reikubonaga/items/da5992a8360ccfa25106
* cocoaのcoding規約 https://developer.apple.com/library/mac/documentation/cocoa/conceptual/codingguidelines/CodingGuidelines.html

### ツール
* dash(これは入れるべき) https://itunes.apple.com/jp/app/dash-docs-snippets/id458034879?mt=12
* iOSのデバックに便利(使ってるけど重い) http://sparkinspector.com/

### 関連URL
* containerを使う概要 http://qiita.com/reikubonaga/items/2e88ddda1ac0868a2729
* autolayoutの使い方 http://qiita.com/reikubonaga/items/06d73aa4b28d0eb3fb9c

### その他
* スタートアップでのコードの磨き方(すごい勉強になる) https://speakerdeck.com/hedjirog/sutatoatupudefalseji-shu-li-falsemo-kifang
Homebrewでインストールしたパッケージをまとめてアップデートするシェルスクリプト


>参考リンク
[MacでWebサイトデザイン・コーディングするための、黒い画面と仲良くなりながらの環境構築手順メモ](http://gatespace.jp/2013/10/31/mac-web-setup-use-terminal/ "MacでWebサイトデザイン・コーディングするための、黒い画面と仲良くなりながらの環境構築手順メモ")




```bach:brew.sh
#! /bin/bash
 
# Homebrew
echo -e "\n####### Homebrew Update #######\n"
brew update
brew upgrade
echo -e "\n####### Homebrew Check #######\n"
brew -v list
brew doctor
 
# WP-CLI
echo -e "\n####### WP-CLI Update #######\n"
cd ~/.wp-cli
php composer.phar self-update
php composer.phar require 'wp-cli/wp-cli=@stable'
cd ~
 
# Ruby
echo -e "\n####### Ruby #######\n"
ruby -v
 
# RubyGem
echo -e "\n####### RubyGem #######\n"
sudo update_rubygems
sudo gem update
echo -e "\n####### gem list #######\n"
gem list
 
# npm
echo -e "\n####### node.js npm Update #######\n"
sudo npm update -g grunt grunt-cli grunt-init bower less
echo -e "\n####### node.js version #######"
node -v
echo -e "\n####### grunt-init version #######"
grunt-init --version
echo -e "\n####### grunt version #######"
grunt --version
echo -e "\n####### bower version #######"
bower -v
echo -e "\n####### less version #######"
lessc -v
 
# Vagrant plugin
echo -e "\n####### Vagrant plugin Update #######\n"
vagrant plugin update vagrant-hostsupdater
vagrant plugin update vagrant-global-status
echo -e "\n####### Vagrant plugin List #######\n"
vagrant plugin list
```
[MariaDB] ubuntuのMySQL5.5からMariaDB10.0.6に切り替える

この記事を参考にMySQLからMariaDBへの切り替えした。
http://qiita.com/pb_tmz08/items/9cddfccc6615d1a089f2

はまりかけたこと。

```
sudo apt-get install mariadb-server-10.0 mariadb-common mariadb-client
```

のコマンド実行の際に、my.cnfを上書きするか聞かれるので、
「D」オプションで、差分を軽く確認し、
他のタブで、my.cnfをバックアップする。

その場は、そのまま「Y」で上書きインストールした後に、
あとで、オリジナルとの差分をmy.cnfに入れてmysqlの再起動。

自分の差分は、文字コードの設定とbind-adressのコメントアウトのみ。
ただし、`[client]`の`default-character-set = utf8`の設定を
`[mysqld]`に書いてしまい再起動に失敗する事態に陥ったので気をつけよう。

```
...

[client]
port            = 3306
socket          = /var/run/mysqld/mysqld.sock

default-character-set = utf8

...
[mysqld]
#
# * Basic Settings
#
user            = mysql
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
lc_messages_dir = /usr/share/mysql
lc_messages     = en_US
skip-external-locking
character-set-server = utf8
skip-character-set-client-handshake

#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1

```

念のため再起動方法
```
sudo /etc/init.d/mysql restart
```
cs2csにおいて、towgs84は飾りではなかった

Proj.4のcs2csにおいて、前記事の投影系関連の疑問氷解。
要するに、こういう事でした。

```shell-session
$ cs2cs -f %.10f +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +to +proj=longlat +ellps=clrk80 +no_defs
-61.35 15.42 0
-61.3500000000  15.4200000000 0.0000000000
```

これが変換前後一致するのは前記事の通りですが、

```shell-session
$ cs2cs -f %.10f +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +to +proj=longlat +ellps=clrk80 +towgs84=0,0,0,0,0,0 +no_defs
-61.35 15.42 0
-61.3500000000	15.4216146170 -87.5112862904
```

こうすると（全部0指定でtowgs84を与える）結果が変わる！
ところが、

```shell-session
$ cs2cs -f %.10f +proj=longlat +ellps=WGS84 +no_defs +to +proj=longlat +ellps=clrk80 +towgs84=0,0,0,0,0,0 +no_defs
-61.35 15.42 0
-61.3500000000	15.4200000000 0.0000000000
```

こうすると（WGS84側のdatum指定を削除）また変換されなくなる。
最後に確認のため、

```shell-session
$ cs2cs -f %.10f +proj=longlat +ellps=WGS84 +towgs84=0,0,0,0,0,0 +no_defs +to +proj=longlat +ellps=clrk80 +towgs84=0,0,0,0,0,0 +no_defs
-61.35 15.42 0
-61.3500000000	15.4216146170 -87.5112862904
```

WGS84側にdatumの代わりに全部0指定でtowgs84を与えると、datum指定と同じ結果になります。

## 投影系でのtowgs84指定は、電子回路でGNDを取るようなもの

これで疑問は氷解しました。
**towgs84無指定と、towgs84ゼロ指定は、全く意味の異なるもの** だったのです。
ゼロ指定であろうと **towgs84指定がされてはじめて、異なる楕円体を用いた相対的な2座標系は、地球中心を原点とした絶対座標系にバインド** されるようです。
datum指定は、[Proj.4ソースコード](http://trac.osgeo.org/proj/browser/tags/4.8.0/proj/src/pj_datums.c)内に定義されている通り、よく使う楕円体/towgs84セット等に名前をつけたもののようで、つまりは **datumが指定されていれば、towgs84が指定されているのと等価** のようです。

たとえていうなら、これは電子回路でGNDが描かれているか描かれていないか、に近い感じではないでしょうか。
GNDの描かれていない電子回路同士は、たとえ片方には描かれていても、絶対的な電圧値で議論する事はできません。
2つの電子回路両方にGNDが描かれていて初めて、絶対値で議論できるようになると思います。
それと同様、投影系も、towgs84設定が為されていてはじめて、地球中心という絶対座標ベースで結びつけられて変換できますが、towgs84が設定されていなければ、楕円体同士の絶対的関係が定義できないため、経緯度＋高度という本来相対的な値を仮に一致していると考えて変換するのでしょう。

[追記]
Proj.4のWikiのFAQの方に、[関連ある情報が載っていました](http://trac.osgeo.org/proj/wiki/FAQ#WhydoIgetdifferentresultswith4.5.0and4.6.0)。

```text
The default datum application behavior changed with the 4.6.0 release. PROJ.4 will now only apply a datum shift if both the source and destination coordinate system have valid datum shift information.
```

Proj.4のバージョンが4.5.0から4.6.0になった際に、測地系の原点ズレ情報が変換前、後両方の定義に設定されていなければ、ズレを適用しなくなったようです。

## proj、cs2csといったコマンドラインの動作は理解できた、次はpj_transform関数の動作を検証

これで、proj、cs2csといったコマンドラインの動作は理解できました。
次回以降は、ではなく、c APIのpj_transform関数の挙動を確かめたいと思います。
というのも、これまでの経験上、pj_transform関数は関数で、projコマンド、cs2csコマンドどちらとも一味違う挙動を示しているようであるからです。
まだ精査しては未検証なのでどんな結果が出るか判りませんが、何か判ればここに書きます。
Objective-C で用意されたクラスのインスタンス変数を取得する


```objc
#import <Foundation/Foundation.h>

@interface Foo : NSObject
{
	int age;
}

- (id)init;
@end


@implementation Foo : NSObject
- (id)init
{
	if (self = [super init]) {
		age = 42;
	}
	return self;
}
@end
```

のような感じで Objective-C コード内で用意されているインスタンス変数 `age` をどうしても取得したい場合には、

```ruby
    foo = Foo.alloc.init
    p foo.valueForKey('age')
```

と `valueForKey:` が使えるようです。

内部実装のためにインスタンス変数が使われているので、不用意に外部から利用すると実装が変わったりするとクラッシュを引き起こすかもしれません。アクセサが用意されていればそれを使いましょう。

`valueForKey:` が強力すぎるな、という話でした。
Google glassでのスクリーンショットの取得方法

Google Glassはエミュレータが公開されていませんので、その開発には実機を使うことになります。したがって、スクリーンショットを取得する場面が多く発生します。Google Glassでスクリーンショットを取得するには、screencapを使います。

以下のように、adb shellでscreencapを実行し、adb pullで取り込みます。
この場合、スクリーンショットがscreenshot-test.pngに保存されます。

```shell-session
$ adb shell /system/bin/screencap -p /sdcard/screenshot-test.png
$ adb pull /sdcard/screenshot-test.png
```
ThinkpadX41 with CrunchBang環境でのトラックポイント設定

ThinkPadX41にCrunchBangを入れたときに設定したトラックポイントまわりの設定メモ。

# 実施環境

CrunchBangのバージョンは以下の通り。

```
$ uname -a
Linux crunchbang 3.2.0-4-686-pae #1 SMP Debian 3.2.41-2 i686 GNU/Linux
```

# 設定

## トラックポイントのスクロールを有効にする

次のファイルを置いて再ログイン。

```/usr/share/X11/xorg.conf.d/20-thinkpad.conf
 Section "InputClass"
     Identifier "Trackpoint Wheel Emulation"
     MatchProduct       "TPPS/2 IBM TrackPoint|DualPoint Stick|Synaptics Inc. Composite TouchPad / TrackPoint|ThinkPad USB Keyboard with TrackPoint|USB Trackpoint pointing device"
     MatchDevicePath    "/dev/input/event*"
     Option             "EmulateWheel"          "true"
     Option             "EmulateWheelButton"    "2"
     Option             "Emulate3Buttons"       "false"
     Option             "XAxisMapping"          "6 7"
     Option             "YAxisMapping"          "4 5"
 EndSection
```

## トラックポイントの速度と感度を変える

速度は`speed`、感度は`sensitivity`ファイルの値で決まる。

```
$ sudo sh -c "echo -n 120 > /sys/devices/platform/i8042/serio1/speed"
$ sudo sh -c "echo -n 120 > /sys/devices/platform/i8042/serio1/sensitivity"
```

この方法で変えた値はログアウトするまで有効なので、`rc.locl`に次の２行を追加して起動時に実行されるようにする。`exit 0`より前に追加する点だけ注意。

```/etc/rc.local
echo -n 120 > /sys/devices/platform/i8042/serio1/speed
echo -n 255 > /sys/devices/platform/i8042/serio1/sensitivity
```

ちなみに`sh -c`を付けないと権限が足りない言われ失敗した。（なんでだろ？）

```
$ sudo echo -n 120 > /sys/devices/platform/i8042/serio1/speed
bash: /sys/devices/platform/i8042/serio1/speed: 許可がありません
```

[20140625追記]
上記挙動の理由を教えていただいた。

> `sudo`でrootになれているのが`echo -n 120`までで、リダイレクト以降は元の権限に戻ってしまっているため。

ということでした。スッキリ。

# 参考サイト

https://wiki.debian.org/InstallingDebianOn/Thinkpad/Trackpoint
http://thinkwiki.org/wiki/How_to_configure_the_TrackPoint#Sensitivity_.26_Speed
glob(グロブ)について

## 改めて記事を書き直しました。(2024/02/12)
技術検証もきちんと行なっているのと不要なPerlの記述を削除してわかりやすくまとめています。
以下を参照いただければと思います。
https://inasan.tech/glob/

皆さんUNIX系OSを使ったことがある方なら、UNIX系OSで以下の様にワイルドカードパターンを使用した経験があると思います。

```Bash
$ ls -l /tmp/test/*
-rw-r--r--  1 ingktds  wheel  0  2 22 03:27 /tmp/test/aaa
-rw-r--r--  1 ingktds  wheel  0  2 22 03:27 /tmp/test/bbb
-rw-r--r--  1 ingktds  wheel  0  2 22 03:27 /tmp/test/ccc
```

この様なワイルドカードパターンをglob(グロブ)と言うようです。私もPerlを勉強して初めて知った用語です。

[glob](http://linuxjm.sourceforge.jp/html/LDP_man-pages/man3/glob.3.html "glob")
>glob, globfree - パターンにマッチするパス名を見付ける。glob() によっ て確保されたメモリ領域を解放する。

例えばこの/tmp/test/*というパスを記述した設定ファイル(test.conf)を読み込むperlスクリプト(test.pl)とbashスクリプト(test.sh)の違いを比較してみましょう。

test.confは/tmp/test/*のパスが書かれているだけのシンプルなファイルです。

```test.conf
/tmp/test/*
```

test.plは単純にtest.confを一気に読み取って配列@lineに代入してその内容をprintしているだけです。

```test.pl
#!/usr/bin/env perl
use 5.010000;
use strict;
use warnings;

my $conf = 'test.conf';
open my $fh, '<', $conf;
my @line = <$fh>;
print @line;
close $fh;
```

その実行結果はまぁそうだよねって感じです。

```test.plの実行結果1
$ perl test.pl
/tmp/test/*
```

test.shも同じでtest.confの内容を一気に読み取って配列LINEに代入してechoしているだけです。

```test.sh
#!/bin/bash
CONF=test.conf
LINE=(`cat $CONF`)
echo ${LINE[*]}
```

その実行結果はおやっ？？

```test.shの実行結果1
$ bash test.sh
/tmp/test/aaa /tmp/test/bbb /tmp/test/ccc
```

どうやらbashがglobの機能を如何なく発揮して*(アスタリスク)を変数展開してしまったようです。
じゃあどのようしてperlスクリプトと同じように*(アスタリスク)を文字列として認識させるかというと、皆さんまず始めに思いつくのがtest.confの*(アスタリスク)をエスケープすることだと思います。


```test.conf
/tmp/test/\*
```

test.pl,test.shともに同じ実行結果になりましたが、期待している文字列と違う…

```test.plの実行結果2
$ perl test.pl
/tmp/test/\*
```

```test.shの実行結果2
$ bash test.sh
/tmp/test/\*
```

test.confのglobをいちいちエスケープするのも面倒くさいし、そもそも期待している動作と違う。やっぱりtest.confはそのままでやりたい。

```test.conf
/tmp/test/*
```

google先生に聞いてみたらなんとこんなところに同じような悩みにぶち当たっている人が…どうもありがとう！！
[globで. ..を除いたドットファイルを得る](http://d.hatena.ne.jp/lla/20091208/1260235648)

こんなときはGLOBIGNOREシェル変数に*を代入してしまえば、globの変数展開は無視されます。使い終わったら必ずunsetしてあげましょう。じゃないと以降の動作にも影響が出てしまいます。

```修正版test.sh
#!/bin/bash
CONF=test.conf
GLOBIGNORE=*
LINE=(`cat $CONF`)
echo ${LINE[*]}
unset GLOBIGNORE
```

```test.plの実行結果3
$ perl test.pl
/tmp/test/*
```

```test.shの実行結果3
$ bash test.sh
/tmp/test/*
```

やっとできたー。
AndroidのreleaseタスクでAPKを作成する

Antを使ってandroidの開発を行っているとreleaseタスクを実行してもapkは作成されません。
これは署名に関する前作業を行っていないからで、署名の準備をしさえすればapkが作成されるようになります。

①keytool6を使ってキーストアを作成する

```shell-session
$ keytool6 -genkeypair -v -keystore <キーストアファイルパス> -alias <キーのalias> -keyalg RSA -validity 10000
```

②ant.propertiesにキーストアの情報を格納する

```text:ant.properties
key.store=<キーストアファイルへパス>
key.alias=<キーのalias>
# 以下を設定すると毎回入力不要となる
key.store.password=<キーストアパスワード>
key.alias.password=<キーaliasのパスワード>
```
異なるgitリポジトリ間でもcherry-pickはできる

`git cherry-pick`は異なるリポジトリ間でも使える。

なんとなく似てるコードがいろんなリポジトリにある。。。残念な状況だけど。
そんなとき点在している同じコードに問題が見つかったら一生懸命修正して回ることになるけど、ちょっとでも楽したい。

```shell-session
（修正を導入したいリポジトリ内で）
git remote add FIXED_REPO {すでに修正を導入したリポジトリのURL}
git fetch FIXED_REPO
git cherry-pick {FIXED_REPO上のコミットのSHA1}
git push origin master
```

もう一歩進んで、１つのリポジトリで修正した後、そのまま他のリポジトリにその修正を導入して行くにはどうしたら良いか。

```shell-session
（最初に修正を導入したリポジトリ内で）
git remote add TO_FIX_REPO {これから修正を導入したいリポジトリのURL}
git fetch TO_FIX_REPO
git checkout -b TO_FIX_REPO-master TO_FIX_REPO/master
git cherry-pick {master上の修正コミットのSHA1}
git push TO_FIX_REPO TO_FIX_REPO-master:master
（上記を修正を導入したいリポジトリの数だけ繰り返す）
```

これならかなり機械的に処理できるから、だいぶ楽になるんじゃないだろうか。まぁだからといってコピペが横行して良いというわけではないが。

ちなみに`git push TO_FIX_REPO TO_FIX_REPO-master:master`ってのも結構ポイント。ローカルのブランチ名とリモートのブランチ名が異なるときはこう書く。間違えてローカルのブランチ名だけ書いちゃう（`git push TO_FIX_REPO TO_FIX_REPO-master`）と、リモートに変なブランチが作られちゃうので要注意。

そしてこのエントリを書く前にテストしていて気づいたけど、リポジトリ内のパスが異なっていてもある程度まで解決してくれるみたい。すごい。cherry-pickコマンドに対して明示的に、「このpathをこのpathに置き換えて適用」って指定できたらもっと嬉しいけど、残念ながらいまのところそういう機能はなさそう。

それにしてもcherry-pickってなんか良い名前。
各ブラウザでJavaScriptを無効にする

2019/04/02 14:30 超久々に差分チェック。
引き続きで使えることを確認しました。

【経緯】
フロントエンドの問題切り分けのため、JavaScriptをOFFにしてみることにした。
Firefoxの設定メニューを開くも、JavaScriptに関するメニューが無い。

そんなにJavaScriptOFFにされると困るのか…(´･ω･`)
どっかのタイミングで設定メニューから外したらしい。
Firefoxと、普段使いのChromeでの設定方法を確認して粛々と進めます。

## Firefoxの場合 (65.0.2で確認)

アドレスバーに、``about:config``を入力。
動作対象外です！と警告が出るので納得の上で進む。
検索バーに「javascript.enabled」を入力。
出てきた設定項目はおそらく「true」になってるので、ダブルクリックで「false」に切替え。
これでJavaScriptは無効になりました。

公式の見解はこちら。
https://support.mozilla.org/ja/kb/javascript-settings-for-interactive-web-pages
個別にOFFにするScriptをご案内してました。

アドオンでボタン一発でON/OFFできると便利かな。（そんなに使う機会多くはないけれど）

## Google Chromeの場合 （v72.0.3626.121で確認）
メニューの「設定」を開く。
検索窓に「javascript」を入力。
「コンテンツの設定」ボタンを押下すると、JavaScriptの設定メニューが表示。
「許可（推奨）」の項目があるので、スイッチをOFFにする。

## IEの場合 （IE11で確認） 
（※2017/11/28より更新なし。Macに切り替えてしまったので…）

メニューから「インターネットオプション」を選択。
「セキュリティ」タブにて、「レベルのカスタマイズ」を選びます。
「スクリプト」＞「アクティブスクリプト」の設定を、「無効にする」にします。
このあと、ブラウザを再起動することで反映されます。

このあたりのページでビジュアル的にも確認できます。
http://www.ajaxtower.jp/js/browser/index1.html


以上、ちょっとした備忘録でした。
あ、最終的にはデザイナーさんにJavaScriptの修正を依頼する形で解決しました。
TmuxでEmacs風 ペインおよびウィンドウ操作設定


C-z 数字でウィンドウの移動も便利だが、C-z [0-3]でペイン、ウィンドウ操作のほうがしっくりくる。

```text:tmux.conf
# prefixをCtrl-BからCtrl-zに変更
unbind-key C-b
set-option -g prefix C-z
bind-key C-z send-prefix

bind 0 kill-pane
bind 1 break-pane
bind 2 split-window -v
bind 3 split-window -h
bind o select-pane -t :.+
bind k kill-window
```

|キー入力   |説明                                                 |
|----------|----------------------------------------------------|
|Ctrl-z 0  |現在のペインを削除                                     |
|Ctrl-z 1  |ウィンドウ内の現在のペインを残し、他のペインをウィンドウにする|
|Ctrl-z 2  |ウィンドウを横に分割                                   |
|Ctrl-z 3  |ウィンドウを縦に分割                                   |
|Ctrl-z o  |ペインをローテート                                     |
|Ctrl-z k  |ウィンドウを削除                                       |
【いまさら】マルチ解像度に対応する対応【メモ】



cocos2dxはAndroidとiOS両方にそしてあらゆる解像度にも対応できる最高のゲームエンジンですね！

AndroidやiOSの画面解像度への引き延ばしは(cocos2dx3.0より)ResolutionPolicyとして設定することができます。


```cpp:AppDelegate.cpp

 auto director = Director::getInstance();
    auto eglView = EGLView::getInstance();
   director->setOpenGLView(eglView);
   eglView->setDesignResolutionSize(designResolutionSize.width,
                                    designResolutionSize.height,
                                    ResolutionPolicy::NO_BORDER);



```
この[ResolutionPolicyてなんじゃって人はこちら](http://qiita.com/KawabataLemon/items/00958e0d74ec11a7540b)

んで、このDesignResolutionSizeは、結局<font color = "red">ゲームで使う座標系</font>のことのなんですよ。これ大事！たとえば、iPhoneの4inch(<font color="blue">1136×640</font>)で設計したとしましょう。

```cpp:ex
Size designResolutionSize = Size(640,1136);

```


ところがどっこい、Androidにも対応させたいです。そこで、どんなオプションがあるか、という話です。画面に設定した座標系をどう表示させるかは、先ほどの<font color="orange">ResolutionPolicy</font>があるわけです。画面を引き延ばして一致させるのか、全体を表示させるのか、引き延ばしてもアスペクト比をいじるのかいじらないのか。とかね。しかし、もし、リソースが<font color="blue">1280×720</font>でデザインされてたらどうしましょう。

ゲームの座標系を伸ばす処理は<font color="orange">ResolutionPolicy</font>なわけですが、リソースが<font color="blue">1280×720</font>では、そのまま貼付けてもうまく行きません。

というわけで、ScaleFactorなんていうオプションが<font color="orange">Director</font>があるわけです。リソースがこうあるので、(<font color="blue">1136×640</font>)　に縮小してくださいっていう処理が次のようになります。

```cpp:AppDelegate.cpp
//画面のリソースの解像度
Size ResourceDpi = Size(720,1280);
auto  director = Director::getInstance();


director->setContentScaleFactor(MIN(ResourceDpi.size.height / designResolutionSize.height ,
                                       ResourceDpi.size.width / designResolutionSize.width));


```

ContentScaleFactorは、リソースをゲーム座標系に対しどれくらい縮小するか、大きくするかを決めるファクターなんですよね。
たとえば、<font color="blue">1136×640</font>がゲーム座標系で、リソースの解像度が<font color="blue">1280×720</font>なら、ContentScaleFactorはこの場合は、<font color="red">1280/1136 = 1.25f</font>となります。
これは、もとのリソースがゲームの解像度の何倍か、教えてあげるものです。それに応じて、この逆数倍、縮小してあげればちゃんと表示できるわけです。

このResourceDpiは、画面の実際の解像度に合わせて、設定してあげた方が良いです。
たとえば1920*1080(FHD)にたいして1280*720を一旦1136*640に縮小して1920*1080に伸ばしてもやっぱりあまり綺麗ではなかったりするので。

実際の画面の解像度は次のようにして得られます。


```cpp:ex
 auto eglView = EGLView::getInstance();
  
//実際の画面の解像度
Size frameSize = eglView->getFrameSize();

```

これで得た解像度に合わせて、使うリソースを切り替えたりすると端末ごとに綺麗に表示されていいです。
UIImageを動的に作る


サムネイル画像とかを動的に作るときに使えそう。

```objectivec:
UIGraphicsBeginImageContextWithOptions(CGSizeMake(100, 100), NO, 0.0);
[image drawInRect:CGRectMake(0, 0, 100, 100)];
UIImage *thumbnail = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
```
TestFlightとDeployGateを比較してみた(その１)

これまでiOSアプリ配布といえばTestFlightが鉄板でしたが、ついにDeployGateがiOSアプリに対応しました。
そこでTestFlightとDeployGateを使ったiOSアプリ配布について比較してみました。

## 共通してできること

* AdHoc版アプリを配布できる

現時点で共通した機能はAdHoc版アプリの配布だけでしょうか。
今後Deploygateの機能追加により以下の機能も共通してできることになりそうです。

* クラッシュレポートを管理画面で確認する
* アプリのインストール状況や端末の情報を確認する
* アプリの更新通知を送る

TestFlightではアプリのバージョンアップ通知はメールで送られてきますが、
DeployGateでの通知はどうなるのか期待です。

## TestFlightの良い点
![8b8284a4-9166-cd39-f6dc-ec775cd505eb.png](https://qiita-image-store.s3.amazonaws.com/0/38102/cf04b6e5-600a-b77f-1f9f-07e25714991e.png)




* in-House版アプリを配布できる

TestFlightはin-House版アプリを配布することができます。
例えば社内でテストを行う際に新しいiPhone,iPadを導入しても、端末にプロファイルさえインストールすれば
既に公開されているiOSアプリをインストールできます。
わざわざProvisioning Profileをrefreshして再度ビルドする必要がなくて楽ですね。

## DeployGateの良い点

![27b8f6ed-c37c-05e7-d74c-81e94c9806a6.png](https://qiita-image-store.s3.amazonaws.com/0/38102/c6392ee3-c110-e8a8-3aff-5e7b676e3fb9.png)


* シンプルなコマンドラインツールが用意されている
* 日本語ページをサポートしている

TestFlightでもipaファイルをアップロードするためのUpload APIが用意されていますが、
DeployGateではターミナルから簡単にipaファイルをアップロードすることができます。
Jenkinsとの連携も簡単にできそうです。

```
# コマンドラインツールのインストール
$ curl https://deploygate.com/install.sh | /bin/sh

# "filename.ipa" をアップロードする。
$ dgate push filename.ipa

# "filename.apk" をtomo-kのアプリとしてアップロードする。
$ dgate push tomo-k filename.ipa 
```

また、日本語ページがあるので英語が苦手な人でも使いやすいサービスになっています。

DeploygateのiOSアプリ配布についてはBetaということで、今後下記の機能追加が予定されているようです。

* クラッシュレポートと更新通知をサポートするためのiOSアプリ向けSDK
* iOS向けの配布ページ機能
* ビルドしたipaをアップロードするためのクライアントアプリケーション
* UDIDを簡単に追加するためのChrome Extension

今後の使い勝手向上に期待したいですね。
上記機能はリリースされ次第、TestFlightとDeployGateを比較してみた(その２)でレポートします。
WebStorageのパフォーマンス比較

WebStorageのパフォーマンスについて気になったので、jsperfで試してみました。

# jsperfでの結果

http://jsperf.com/web-storage-performance

* MemoryStorageとしているのは、ただ変数に入れてるだけのバージョンです。
* Storage使う時はJSON.parse、JSON.stringifyしたりすると思うのでそんな感じで比較してます

## MemoryStorage

```js
    var memoryStorage = {
      _data: {},
      setItem: function(key, data) {
        this._data[key] = data;
      },
      getItem: function(key) {
        return this._data[key];
      }
    };
```

## SPAでのSessionStorage

* 基本的にはどれもそんなに変わらない感じでしたが、ChromeだとMemoryStorageが高速でした。
* SinglePageApplicationの場合はページ読み込みは最初しか発生しないので、ガベージされない変数に突っ込むのもSessionStorage使うのも違いがないと思うのでこれなら自分でSessionStorage的なものを作って使う方がいいのかなと思ったりしました。
Scala: 例外が発生するシナリオをテストする


例外が発生するのをテストにするには `intercept` を使う。

```scala:ExampleTestSuite.scala
import org.scalatest._

class ExampleTestSuite extends FunSuite with Matchers {

  test("invalid status transition") {
    val s = "hi"

    intercept[IndexOutOfBoundsException] {
		s.charAt(-1)
    }
  }
}

```

BDDらしく書く場合は、`should be thrownBy`、 `thrownBy`、 `noException should be thrownBy` などが使える

```scala:ExampleSpec.scala
import org.scalatest._

class ExampleSpec extends FeatureSpec with Matchers {
  scenario("Throws exception") {
    an[IndexOutOfBoundsException] should be thrownBy "".charAt(-1)
  }

  scenario("Throws exception with message") {
    val thrown = the[IndexOutOfBoundsException] thrownBy "".charAt(-1)
    thrown.getMessage shouldBe "String index out of range: -1"
  }

  scenario("Throws no exception") {
    noException should be thrownBy "a".charAt(0)
  }
}
```
matplotlibで作った画像がdviからpdfにするとずれる

※追記 2014/2/22
zr_tex8rさんからコメントをいただきました。ご指摘ありがとうございます。
結論から言うとmatplotlibは一切関係ありませんでした。
zr_tex8rさんが既に原因などについて詳しく言及されているので、下のzr_tex8rさんのコメントのリンクからそちらを参照してください。

---

matplotlibで作ったepsがdviでは問題なく表示されるのに、dvipdfmxでpdfに変換すると画像の位置がずれる場合。

原因や発生する環境の条件などは一切不明なので、偶然に見つけた解決策のみを紹介。

```tex
\usepackage{graphicx}
```

を

```tex
\usepackage[dvipdfmx]{graphicx}
```

に変更

http://mkacky.wordpress.com/2013/05/27/tex%E3%81%A7dvi%E3%81%8B%E3%82%89pdf%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%81%A8%E5%9B%B3%E3%81%8C%E3%81%9A%E3%82%8C%E3%82%8B/
で紹介されていた方法はGhostscriptでエラーが発生して上手く行きませんでした。
UITableView の deleteRowsAtIndexPaths: で落ちる場合の対処法

# 今回やりたかったこと
UITableViewで以下を実施。

* データが0件の場合は、セルを1つ表示し「なし」と表示
* データが1件以上の場合は、データの数だけセルを表示
* 上記の条件で、アニメーションでいいかんじに削除できるようにする

# 問題
* 2→1件はOKだが、1→0の削除をした場合に下記エラーで落ちる

## エラーメッセージ

```cobol:error
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 0 beyond bounds for empty array'
```

## ソースコード(誤)
```objc:SampleTableView.m

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSInteger cnt = [self.items count];
    return (0 == cnt)? cnt+1 : cnt;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self beginUpdates];
    [self.items removeObject:self.items[indexPath.row]];
    [self deleteRowsAtIndexPaths:@[indexPath]
                withRowAnimation:UITableViewRowAnimationFade];
    [self endUpdates];
```

# 原因
* deleteRowsAtIndexPaths:で1→0件にするアニメーションを呼んでいるが、numberOfRowsInSection:で返す値は常に1のため、不整合が生じて落ちる。

# 解法方
* 1→0件の場合のみ、deleteRowsAtIndexPaths:withRowAnimation: ではなく reloadRowsAtIndexPaths:withRowAnimation:を呼べばOK.

## ソースコード(正)

```objc:SampleTableView.m

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSInteger cnt = [self.items count];
    return (0 == cnt)? cnt+1 : cnt;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self beginUpdates];
    [self.items removeObject:self.items[indexPath.row]];
    if (indexPath.row < [self tableView:self numberOfRowsInSection:indexPath.section]) {
        [self reloadRowsAtIndexPaths:@[indexPath]
                    withRowAnimation:UITableViewRowAnimationFade];
    } else {
        [self deleteRowsAtIndexPaths:@[indexPath]
                    withRowAnimation:UITableViewRowAnimationFade];
    }
    [self endUpdates];
```

これでOK.

あとはアニメーションを諦めて[self reloadData]を呼んでしまえば問題はないが、今回はアニメーションさせたかったのでこうしました。 

もっといい方法や気になる点があれば、気軽にコメントください。
セレクタからメソッドシグネチャの引数の数を調べる


```objectivec

- (NSUInteger)argc:(SEL)sel
{
	return [[NSStringFromSelector(sel) componentsSeparatedByString:@":"] count];
}

```

原始的ですが。

※2014/02/22 @tomohisaota さんから教えていただきました。
recieverが分かっている場合はNSMethodSignatureを使うほうが良さそうです。

```objectivec

- (NSUInteger)argc:(SEL)sel
{
	NSLog(@"%d",[self methodSignatureForSelector:@selector(viewDidAppear:)].numberOfArguments); // => 2 + 1 = 3
}

```

※ 2014/02/22 追加 

##NSObjectのmethodSignatureForSelector:の挙動について

調べたいセレクタがプロトコルの場合、レシーバがプロトコルを採用している場合は返してくれるようですが、明示的に採用していないオブジェクトは返してくれないみたいです。

```objectivec

#import <XCTest/XCTest.h>

@protocol HogeProtocol

@optional
- (void)hoge:(int)hoge fuga:(int)fuga var:(int)var;

@end

@interface ObjcTests : XCTestCase <HogeProtocol>

@end

@implementation ObjcTests

- (void)testArgc
{
    NSUInteger i;
    XCTAssertNoThrow(i = [[self methodSignatureForSelector:@selector(hoge:fuga:var:)] numberOfArguments], );
    XCTAssert(i == 5,); // 2 + 3 = 5
    NSObject *ob = [NSObject new];
    XCTAssertNoThrow(i = [[ob methodSignatureForSelector:@selector(hoge:fuga:var:)] numberOfArguments], );
    XCTAssertFalse(i == 5, ); // 0
}

@end

```
objcのクラスメソッドとインスタンスメソッドの違い


**は、ありません。**

http://qiita.com/keroxp/items/43ed73f3ca7566d6c76c

でも述べたんですが。もう少し踏み込んで。

objcのクラスにはクラスメソッドがあります。
あまり知られていませんがクラスメソッドとインスタンスメソッドの違いは実はあんまりないのです。

例えば、NSObject ClassにはconformsToProtocol:というセレクタのメソッドが、クラスメソッドとインスタンスメソッドと両方ありますが、セレクタだけではその判別は出来ません。なのでこんなこともできます。

```objectivec:ObjcTests.m

+ (BOOL)conformsToProtocol:(Protocol *)protocol
{
    NSObject *obj = [NSObject new];
    return (BOOL)objc_msgSend(obj,_cmd,protocol);
}

- (void)testExample
{
    Class class = [self class];
    XCTAssert([class conformsToProtocol:@protocol(NSObject)], @"???");
}

```

クラスメソッド+conformsToProtocol:の呼び出しを動的に生成したNSObjectにプロクシーしても、"unrecognized selecter was send to ~"というエラーにはなりません。ちなみに_cmdはSEL型のオブジェクトで、objcのメソッド内での隠し引数（selfもそう）で、すべてのメソッドに第二引数として渡されています。（selfは第一引数）

つまり、こういうことです。

```objectivec

// 以下の二行は同じことをしている
[obj respondsToSelector:@selector(count)];
objc_msgSend(obj,@selector(respondsToSelector:),@selector(count));

```

クラス、インスタンスを問わずメソッドの中でselfが参照できるのは、objc_msgSendの引数でターゲットが送られているからなんですね。

クラスメソッドの中では以下のようなメソッド呼び出しが可能ですが、それはselfがクラスオブジェクトになっているからです。

```objectivec

+ (void)staticMethod1
{
	[self staticMethod2]; //呼び出せる	
}

+ (void)staticMethod2
{
	...
}

```

ということはどういうことかというと、こういうことです。

```objectivec

+ (void)staticMethod1
{
	// 同じ
	[self staticMethod2];
	objc_msgSend(self,@selector(staticMethod2)); // 呼び出せる	
}

+ (void)staticMethod2
{
	...
}

```

**つまり、objcではクラスに対してもインスタンスと全く同じ方法でメッセージ送信が可能なんですね。**

なので、NSSelectorFromString, NSClassFromStringを使うと、単なる文字列からクラスメソッドも呼び出せます。

メタメタですね。
rbenv install -l で最新バージョンが出ない時の対処



依存しているruby-buildがrubyのバージョンに関係ある
/.rbenv/plugins/ の中にあるruby-buildを最新にすればいいらしい。

```
$ cd .rbenv/plugins/ruby-build
$ git pull origin master
```

なぜ下記の brew で最新にならないんだろか。
2重に install されている気がする。

```
$brew upgrade ruby-build
```



参考
http://9ensan.com/blog/programming/ruby/rbenv-plugins-ruby-build/
リモートリポジトリとカレントの差異を取得する

現在の変更をきちんとpushしたかどうかを確認する方法

基本的には
git status コマンドで確認可能

```
console$ git status                                                                                     [/project 16:07]
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#   (use "git push" to publish your local commits)
#
```

push先のリポジトリよりも2コミット進んでいることが分かる。
pushを行った後、同じコマンドを実行する

```
console$ git status                                                                                     [/project 16:08]
# On branch master
nothing to commit, working directory clean
```

push先のリポジトリとローカルのリポジトリの状態が同じ状態となったことが分かる。

また、この状態で再びpushを行うと

```
Everything up-to-date
```

と出力される。
NeoBundleUpdateをバックグラウンドで勝手にしてくれるやつ


```vim:.vimrc
"NeoBundleUpdate!を1日毎にバックグラウンド実行"
NeoBundle 'git://gist.github.com/9133200.git', { 'script_type' : 'plugin' }
```

    :NeoBundleUpdate!


対象ソースコード

<https://gist.github.com/soramugi/9133200>

インスパイア元

<a href='http://qiita.com/knt45/items/d475e673c40724fd36fc'>Vim - NeoBundleCheckが便利 - Qiita</a>
<a href='http://qiita.com/td2sk/items/2299a5518f58ffbfc5cf'>Vim - NeoBundle周りを自動化する - Qiita</a>
wordpressのDBに直接接続してコンテンツ更新する方法

wordpressの管理画面を使わず、プログラム等でコンテンツを更新したい、もしくは別システムからデータを投稿したい場合に、どのテーブルにどのデータを入れるかを記載。

## 記事を投稿したい
まず｢wp_posts｣テーブルにinsert

|カラム名|値|
|:--|---:|
|post_author|作者|
|post_date  |投稿時刻(現在時刻)|
|post_date_gmt|投稿時刻|
|post_content|本文|
|post_title|タイトル|
|post_name|タイトル|
|post_modified|投稿時刻(現在時刻)|
|post_modified_gmt|投稿時刻(現在時刻)のUTC時間|
|guid|空白|

insertすると、idが採番されるので、それ使って、
｢wp_posts｣テーブルのguidをアップデート

|カラム名|値|
|:--|---:|
|guid|http://ドメイン名/archives/採番されたid|


## タグをつけたい
まず｢wp_terms｣テーブルにinsert

|カラム名|値|
|:--|---:|
|name|タグ名|
|slug|タグ名をUrl Encodeしたもの|
|term_group|0|

insertすると、term_idが採番されるので、それ使って、
次に｢wp_term_taxonomy｣テーブルにinsert

|カラム名|値|
|:--|---:|
|term_id|wp_termsのterm_id|
|taxonomy|｢post_tag｣|
|count|1|

さらに｢wp_term_relationships｣テーブルにinsert

|カラム名|値|
|:--|---:|
|object_id|wp_postsのid|
|term_taxonomy_id|wp_term_taxonomyのterm_taxonomy_id|
|term_order|0|

## カテゴリーをつけたい
カテゴリーの作成自体は未調査。管理画面で作成済みとする。
まず｢wp_term_relationships｣テーブルにinsert

|カラム名|値|
|:--|---:|
|object_id|wp_postsのid|
|term_taxonomy_id|カテゴリーID|
|term_order|0|

次にカテゴリーに属する記事数を更新
カテゴリーIDで、｢wp_term_taxonomy｣を更新

|カラム名|値|
|:--|---:|
|count|カテゴリーに属する件数|

件数は
SELECT count(*) FROM wp_term_relationships WHERE term_taxonomy_id = [term_taxonomy_id]
で算出

管理画面からデータを入れて、登録されたデータを参考にしているので、
細かいところで誤りがあるかもしれないが、上記の方法で特に問題ない感じ。
iOS Frameworks リンク集


Update 2014.2.21

|<h1>CoreAudio </h1>|
|:-----------|
|Don't Be Afraid to Play it LOUD! (SlideShare) [リンク先へ](http://www.slideshare.net/invalidname/core-audio-dont-be-afraid-to-play-it-loud-360idev-san-jose-2010 "")|
|CoreAudioの使い方メモ [リンク先へ](http://d.hatena.ne.jp/uosoft/20110502/1304264193 "")|
|Core Audio その１ [リンク先へ](http://objective-audio.jp/2008/03/core-audio-audiobufferaudiobuf.html "")|
|<h1>CoreData </h1>|
|サルでもわかる Core Data 入門【概念編】 [リンク先へ](http://d.hatena.ne.jp/glass-_-onion/20111015/1318667971 "")|
|CoreData 非同期データ処理 (SlideShare) [リンク先へ](http://www.slideshare.net/hedjirog/core-data-14134061 "")|
|CoreData の 属性に現在時刻など固定値以外のデフォルト値を設定する [リンク先へ](http://d.hatena.ne.jp/KishikawaKatsumi/20120426/1335460134 "")|
|CoreDataを用いたデータ管理を行う方法。準備編。 [リンク先へ](http://www.yoheim.net/blog.php?q=20120616 "")|
|iOS でデータを永続化する方法 [リンク先へ](http://d.hatena.ne.jp/glass-_-onion/20110904/1315142404 "")|
|<h1>Core Bluetooth </h1>|
|iBeacon [リンク先へ](http://qiita.com/hedjirog/items/abd48a55387891cc8503 "")|
|iBeaconハンドブックの下書き [リンク先へ](http://reinforce-lab.github.io/blog/2014/02/14/ibeaconbook-prev/ "")|
|[iOS] Bluetooth Low Energyでアプリ開発 [リンク先へ](http://seesaakyoto.seesaa.net/article/378601306.html "")|
|1行もコードを書かずにiBeaconで遊んでみる [リンク先へ](http://geo.hatenablog.com/entry/2013/12/01/074148 "")|
|Core Bluetoothのプロファイル [リンク先へ](http://d.hatena.ne.jp/shu223/20140109/1389216052 "")|
|iBeaconとcocos2dを連携してみる [リンク先へ](http://qiita.com/pakorepqu/items/5a367806837ae4bd19df "")|
|iBeaconのビーコン設置とチート対応の一例 [リンク先へ](http://reinforce-lab.github.io/blog/2013/12/21/ibeacon-ex1/ "")|
|iBeaconの解説 [リンク先へ](http://reinforce-lab.github.io/blog/2013/10/21/ibeacon/ "")|
|iBeaconの実装に役立つ記事の逆引きリファレンス [リンク先へ](http://d.hatena.ne.jp/shu223/20131219/1387448941 "")|
|iBeaconはどんなデータをやり取りしているのか？ [リンク先へ](http://www.rbbtoday.com/article/2014/01/09/115671.html "")|
|iBeacon開発ハマリどころポイント [リンク先へ](http://qiita.com/himara2/items/1d6c11a4d4839c3027d5 "")|
|iOSのCore Bluetooth / BLEの通信速度 [リンク先へ](http://d.hatena.ne.jp/shu223/20140110/1389292125 "")|
|正しいビーコン監視方法 [リンク先へ](http://brightechno.com/blog/archives/220 "")|
任意の日から何日経過した計算する方法

```java
// 今日の0時を算出
Calendar calendarNow = Calendar.getInstance();
calendarNow.set(calendarNow.get(Calendar.YEAR), calendarNow.get(Calendar.MONTH) + 1, calendarNow.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
// 過去の0時を算出
Calendar calendarPast = Calendar.getInstance();
calendarPast.set(2014, 2, 15, 0, 0, 0);
// 経過時間を秒単位で求めて、日に直す
long diffTime = calendarNow.getTimeInMillis() - calendarPast.getTimeInMillis();
long pastDays = diffTime / (1000 * 60 * 60 * 24);
```

別サイトで、

```java
Calendar calendarNow = Calendar.getInstance();
```
のみで現在時刻を取れるって書いてあったけど、うまくいかなかったので、

```java
calendarNow.set(calendarNow.get(Calendar.YEAR), calendarNow.get(Calendar.MONTH) + 1, calendarNow.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
```
を追加した。
MacOSX 10.9 にHadoop2.2の開発環境(疑似分散モード)構築


## 前提条件
+ JDK1.7系インストール済

## 下準備
```
$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ vim ~/.ssh/config
+ Host localhost
+  HostName 127.0.0.1
+  Port 22
+  IdentityFile ~/.ssh/localhost_rsa
```
+ Macのシステム設定->共有からリモート共有を有効化


## インストール
```
$ brew install hadoop
$ cd /usr/local/opt/hadoop/libexec/etc/
```


## 設定

```xml:core-site.xml
<configuration>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>${任意のディレクトリ}</value>
        <description>A base for other temporary directories.</description>
    </property>
    <property>
        <name>fs.default.name</name>
        <value>hdfs://localhost:9000</value>
    </property>
</configuration>
```
> ${任意のディレクトリ}は相対パスで書くと「/usr/local/Cellar/hadoop/2.2.0/libexec」から始まる

```sh:hadoop-env.sh
export HADOOP_OPTS="-Djava.security.krb5.realm=OX.AC.UK -Djava.security.krb5.kdc=kdc0.ox.ac.uk:kdc1.ox.ac.uk"
```
>※1系だと上記オプション追加で「Unable to load realm info from SCDynamicStore」のエラーが回避出来ていたが、2系では回避できませんでした・・・。要オプション精査


```xml:hdfs-site.xml
<configuration>
  <property>
    <name>dfs.replication</name>
    <value>1</value>
  </property>

  <property>
    <name>dfs.namenode.name.dir</name>
    <value>${hadoop.tmp.dir}/dfs/name</value>
  </property>

  <property>
    <name>dfs.datanode.data.dir</name>
    <value>${hadoop.tmp.dir}/dfs/data</value>
  </property>
</configuration>
```

```xml:yarn-site.xml
<configuration>

<!-- Site specific YARN configuration properties -->
  <property>
    <name>yarn.nodemanager.aux-services</name>
    <value>mapreduce_shuffle</value>
    <description>shuffle service that needs to be set for Map Reduce to run </description>
  </property>
</configuration>
```


## 起動

```
$ hdfs namenode -format
$ start-all.sh 
```

## 動作確認

```
$ hadoop fs -mkdir /test
$ hadoop dfs -ls /
$ hadoop fs -rmdir /test
$ hadoop dfs -ls /
$ hadoop jar /usr/local/opt/hadoop/libexec/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.2.0.jar pi 5 10
```

http://localhost:50070/


## 参考
1系からの変更
jobtracker＆tasktracker=>yarnへ移行
※ドキュメントがあまり整備されてない・・orz
RubyMotion用のテンプレートを作ってみた


もくもく作業でRubyMotionの自分用テンプレートをまとめてみました。さくっと作ったりする時に（自分に）使いやすいようにまとめてみました。

https://github.com/bellx2/rubymotion-templates

特徴としては

*  .yamlファイルで一部設定を別ファイルに逃がせるようにしている（github時等）
* 簡単なViewですがIBを使っているので「rake ib:open」でStoryBoardの修正にすぐ入れる
* cocoaPodも連携済みなので組み込みが簡単

です。

## 作り方

以下を参考に行いました。

[RubyMotion テンプレートの基本/作り方/gem 化](RubyMotion テンプレートの基本/作り方/gem 化)

ここにすべて書いてある...といっても過言では無い。

### 基本手順(まとめ)
1.　基本となるプロジェクトを作る
2.　プロジェクト名称を埋め込むファイルを.erbに書き換える
3.　"<%= name %>"を必要な場所に埋め込む
　　　↑「"」を忘れない
4. フォルダー名称をfilesに変えてテンプレートフォルダーに入れる

### 階層構造

```
+templateフォルダー(~/Library/RubyMotion/template)
  + <template_name>
    + files
      + app
      + resources
      ....
```
という構造になっています。

## 導入

[bellx2@github / rubymotion-templates](https://github.com/bellx2/rubymotion-templates)

コンソールから

```Terminal
git clone https://github.com/bellx2/rubymotion-templates.git ~/Library/RubyMotion/template/
```

とすればtemplateディレクトリーに展開されます。

###使い方

「ios-ib」テンプレートの場合

```Terminal
motion create hogeApp --template=ios-ib
cd hogeApp
bundle install
rake pod:install
rake
```

で、サンプルプロジェクトが起動します。

<img src="http://cdn-ak.f.st-hatena.com/images/fotolife/b/bellx2/20140221/20140221192112.png"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/b/bellx2/20140221/20140221192120.png">

### 今後

もう少し他の人の役に立ちそうなテンプレートを作る

### ごにょごにょ

というところです。主に自分用なので追加や削除がおこなわれる場合がありますので、興味のある方はforkしてお使いください。

[bellx2@github / rubymotion-templates](https://github.com/bellx2/rubymotion-templates)
Alfred+KnockでMacを速攻でロックできるようにするハック


Macのセキュリティを重視するあまり、パスワードが長くなりすぎて画面ロックの解除も一苦労。

そんな人に便利なのが[Knock](http://www.knocktounlock.com/)です。これはパスワードを入力する代わりに、iPhoneを「コンコン」とノックするだけでMacのロック画面を解除できるアプリです。

パスワードがいらないぶん、ロックを解除するのが手軽になるのですが、Knockにはロック画面に入るためのショートカットキーがありません。

そこで、[Alfred](http://www.alfredapp.com/)と組み合わせて、簡単にロックできるようにします。

Alferdの Preferences → Features → Web Search → Add Custom Search で以下の設定を追加

![Screenshot_2014_01_22_15_18.png](https://qiita-image-store.s3.amazonaws.com/0/889/ff38754d-7c2f-0c6a-0bf4-d73ce957f080.png "Screenshot_2014_01_22_15_18.png")


これで退席するときに「lock」と打つと、Knockのロック画面になります。

![Screen Shot 2014-01-22 at 15.19.11.png](https://qiita-image-store.s3.amazonaws.com/0/889/d0491edb-eaca-222b-8612-8f137bd104af.png "Screen Shot 2014-01-22 at 15.19.11.png")

戻ってきたら、あとはiPhoneを2回ノックするだけ。
Git のリモートブランチとかの用語

ブランチ関連の用語がまぎらわしくてわかりにくいことがあるのでメモ。

## ローカルブランチ

 - ローカルリポジトリのブランチ
 - refs/heads/* (refs/heads/master とか)
 - git commit/merge とかで更新される

## 追跡ブランチ

 - ローカルブランチのうち config で次の設定があるもの
    - `branch.<local-branch>.remote`
    - `branch.<local-branch>.merge`
 - 主に次のようなコマンドで設定される
    - `git branch <local-branch> <remote-branch>`
    - `git checkout -t <remote-branch>`
    - `git push -u <remote-repository> <local-branch>:<branch of remote-repository>`
 - このブランチ上で push や pull すると自動的にプッシュ先やプル元となるリモートリポジトリのブランチが選択される（こともある）

## リモートブランチ

 - ローカルリポジトリにある、リモートリポジトリ上のローカルブランチのコピー
 - refs/remotes/* (refs/remotes/origin/master とか)
 - config の次の設定によってマッピングが決められる
    - `remote.<remote-repository>.fetch`
 - git fetch/pull/push とかで更新される
    - fetch/pull はリモートリポジトリのローカルブランチを取得して、ローカルリポジトリのリモートブランチを更新する
    - push はローカルリポジトリのリモートブランチと、リモートリポジトリのローカルブランチを更新する
 - 直接のチェックアウトはできない
    - やると HEAD がブランチから外れる
 - リモート追跡ブランチ(remote-tracking branch) と呼ばれることもある
    - どちらかといえば リモート追跡ブランチ の方が正しい気がする
       - git の man だと remote-tracking branch が多い

---

まぎらわしいのがこの辺り・・・

 - リモートブランチ != リモートリポジトリのローカルブランチ
 - 追跡ブランチ != リモート追跡ブランチ
 - ローカルリポジトリ contains 追跡ブランチ

---

参考 ... [Git - リモートブランチ](http://git-scm.com/book/ja/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81 "Git - リモートブランチ")
vimの挿入モードで一定以上入力がなかったら通常モードにしてみる

# 経緯
vimでテキストカキカキ
↓
人に呼ばれる
↓
雑談（５分）
↓
戻る。「お！保存してなかった ：w と…」
↓
「：w」書かれたテキストがそこに

#というわけで
一定時間意識が途切れたらNormalモードにするようにしてみた。

```vim
" 一定時間入力がなかったらノーマルモードに {{{
set updatetime=5000

function s:InsertToNormal()
	call feedkeys("\<Esc>")
endfunction

autocmd CursorHoldI * call s:InsertToNormal()

"}}}

```
※これでいいのかしら…

# 追伸（2/22 *8:30 追記）
導入して問題のある方はコメント欄を見て頂いて、 @enkinhoさんの方法も試してみてください

# 追伸２（2/22 *9:45 追記）
ついでにIMEのモードをOFFに…とおもったのですが、ターミナルのVimから使っているのでなかなか難しい感じです。
GUIなやつだと 

```vim
set iminsert=0
```

とかなんかで行けるとか有りましたが…

ちなみに、ESCキーを押下したら日本語入力モードをOFFにする感じのやつは keyremap4macbookでやっているのですが、
今回のやつではそのイベントが発火しないのですよねぇ…
ある特定の機種だけでAnimationが倍速になってしまう


他の機種では期待通りのアニメーションをするけど、この機種だけ早すぎるよ。。
そんな問題に遭遇した人へ

開発者向けオプションで倍速設定されているかもしれません。。
一度確認してみましょう。
知らずにひどくハマりました。

参考リンク
http://android-smart.com/2013/03/nex_speedup.html
Regexp.newでオプション(修飾子)を指定する

/abc/i みたいなオブジェクトをRegexp.newでやるにはどうするか調べたのでメモ
実装を見ずに調べたので、ちょっと意外な結果だった

**参考サイト**
- http://www.rubylife.jp/regexp/ini/index3.html

**指定できるオプション**

|オプション|効果|
|:--------|:--|
|/i    |大文字と小文字を区別せずにマッチを行う|
|/x    |パターンの中の空白やコメントを無視する|
|/m    |複数行モード。メタ文字(.)が改行にもマッチする|


定数を使って指定

```
pry(main)> Regexp.new("abc", Regexp::IGNORECASE)
=> /abc/i
pry(main)> Regexp.new("abc", Regexp::MULTILINE)
=> /abc/m
pry(main)> Regexp.new("abc", Regexp::EXTENDED)
=> /abc/x
```

定数の中身はただのFixnum

```
pry(main)> Regexp::IGNORECASE
=> 1
pry(main)> Regexp::IGNORECASE.class
=> Fixnum
```

なので、こんな書き方もできる

```
pry(main)> Regexp.new("abc", 1)
=> /abc/i
pry(main)> Regexp.new("abc", 2)
=> /abc/x
pry(main)> Regexp.new("abc", 4)
=> /abc/m
```

複数オプションを指定する場合
真面目に書くならビット演算で

```
pry(main)> Regexp.new("abc", Regexp::IGNORECASE | Regexp::MULTILINE)
=> /abc/mi
```

各定数は立つビットが別々なのでこれでもいける

```
pry(main)> Regexp.new("abc", 3)
=> /abc/ix
pry(main)> Regexp.new("abc", 5)
=> /abc/mi
pry(main)> Regexp.new("abc", 6)
=> /abc/mx
pry(main)> Regexp.new("abc", 7)
=> /abc/mix
```

ここから余談

何気に上記以外の引数でもいける。nilでない場合はiオプションがつくもよう
詳しく調べる気はなかったのでほんとに余談

```
pry(main)> Regexp.new("abc", nil)
=> /abc/
pry(main)> Regexp.new("abc", {})
=> /abc/i
pry(main)> Regexp.new("abc", [1,2,3])
=> /abc/i
pry(main)> Regexp.new("abc", :a)
=> /abc/i
pry(main)> Regexp.new("abc", "m")
=> /abc/i
```
SELinuxと共存する方法について

いろいろ悪名高き(?)SELinuxちゃんですが、意外と何をすれば解決できるかをログに書いてくれていて「あ、共存(setenforce 0しなくても)できそう」と思ったのでメモしておく。  

------
今回の環境(関係ありそうなもの)  

* Fedora 19  
* httpd 2.4.6  
* postfix 2.10.2  
* selinux-policy 3.12.1  

今回の嵌まり

* phpに外部からアクセスした際、mail関数でメールが送れなかった  
 * sendmailコマンドでターミナルからは送れる  
 * phpコマンドでターミナルからも送れる  
* ログ見ると普通のアクセス権は問題ないのに、/etc/postfix/main.cf が Permission deniedになってしまっていた  
* ググるとSELinuxが邪魔していることが判明  
 * しかし、いくらググっても良さげな解答事例がなかった  

リポジトリがおかしいのか、それともこれが仕様なのか、はたまた自分でいつの間にかぶっ壊したのかわからないけど、なるべく簡単にポリシーに加える事を目標に頑張った。  

/var/log/maillog には/etc/postfix/main.cf Permission denied としか書いていないのでアクセス権を見てしまうがそこは問題なかった。なので /var/log/messagesを見ると、 setroubleshoot: SELinux is preventing /usr/sbin/sendmail.postfix from read access on the file /etc/postfix/main.cf. For complete SELinux messages. run sealert -l hogehoge-fugafuga-piyopiyo と書かれている。  
rootで sealert -l hogehoge-fugafuga-piyopiyo すると詳細情報が見られる。  
   
If httpd が、メール送信することを、許可したい  
Then これを許可するには、SELinux を設定しなければいけません  
Do  
setsebool -P httpd_can_sendmail=1  
  
ということなので、rootで setsebool -P httpd_can_sendmail=1 をやってあげておしまい。  

------

教訓
ログ見よう。ログ読もう。さすれば解は得られる。(こともあるかも？)
Rubyで文字列の入った変数を処理するときはとりあえず"#{}"で展開とするとよさそう

文字列の入った変数を処理するときに、nil が入っていることが避けられないことがある。
うっかり、

```rb
str += tmp
```

という書き方をすると、tmp が nil だったときに例外が出て困るので、

```rb
str += "#{tmp}"
```

と文字列リテラル中で展開した方がよさそう。
同様に、

```rb
str = "#{tmp_1 + tmp_2 + tmp_3}"
```

よりも、

```rb
str = "#{tmp_1}#{tmp_2}#{tmp_3}"
```
がよさそう。
Ubuntuでシェルからマスターボリュームを設定する方法

下記記事によると `pactl` コマンドを使うことでマスターボリュームを設定できる。

[blog.seljebu.no » XBMC and pulseaudio master volume (Ubuntu 11.10)](http://blog.seljebu.no/2011/10/xbmc-and-pulseaudio-master-volume-ubuntu-11-10/)

```bash
$ pactl set-sink-volume 0 50% # マスターボリュームを50%に設定
```
mPDFでconfig.phpを触らずに日本語フォントで出力させて文字化けを解消

phpからpdfファイルを直接生成させることができる便利な[mPDF](http://www.mpdf1.com/)ライブラリだが、そのまま使うと日本語が化けてしまう。

mPDFで日本語フォントで出力するには [mpdf/config.php#44](https://github.com/finwe/mpdf/blob/master/config.php#L44) を


```php
$useAdobeCJK = true; // デフォルトはfalse
```

と修正する必要があるのだが、`composer`や`git submodule`を使ってデプロイされるアプリケーションだと、ライブラリ内にあるconfig.phpを書き換えるのは若干面倒臭い。

そこでmpdfクラスのコンストラクタに下記のように初期化文字列を渡すと、うまいこと解決できる

```php
$mpdf = new mpdf('ja+aCJK');
```
mySQL Root Password Reset

#Goal
```
* mySQLの再インストールせずにrootパスワードをリセットする
```

#Preparation
```
* mysqld稼動サーバのroot権限を持っていることが前提
```
```shell-session
## 
## 実行環境情報
## 

$> uname -a
Linux *** 2.6.32-358.14.1.el6.x86_64 #1 SMP Tue Jul 16 23:51:20 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
$> cat /etc/issue
CentOS release 6.4 (Final)
Kernel \r on an \m
$> which mysqld
/usr/local/mysql/bin/mysqld
$> whoami
root

## Check Shell
$> set | grep -i version
BASH_VERSION='4.1.2(1)-release'

## mysqld version
mysql> select version();
+-----------+
| VERSION() |
+-----------+
| 5.6.10    |
+-----------+
```

#Manual

```
Milestone
* 起動しているmysqlを一旦ストップしてskip-grant-tablesオプション付きで再起動する
** これによって、パスワード認証スキップでログイン可能状態にする
* mysqlのrootユーザでログインする
* mysqlデータベースuserテーブルのレコードをupdateしてパスワードを変更する
* mysqlの起動モードを元に戻して起動し直す
```

## Stop mysqld

```shell-session
## Stop
/etc/init.d/mysqld stop
  # Or : HOSTNAME=`hostname`; kill `cat /usr/local/mysql/data/${HOSTNAME}.pid`
  # ps -ef | grep mysqld : --pid-fileでpidファイル確認できる
```

## Start mysqld with option(skip-grant-tables)

```shell-session

## 
## skip-grant-tablesオプションを指定してmysqldサーバを起動することで、
## mysqlログイン時のHost/Userチェックを無視させることができる
## /etc/my.cnfの[mysqld]ブロックにオプションを追加して通常起動させる方法が確実
## 

grep 'skip-grant-tables' /etc/my.cnf
  # option追加を確認

## Start
/etc/init.d/mysqld start
ps -ef | grep mysqld
  # 起動確認
```

## Password Reset with nopass login

```shell-session
## From any machine
mysql -uroot
  # これでログインできるようになるはず

mysql> use mysql
mysql> select Host, User, Password from user;
  # user一覧
  # mysqlはHost+Userの組み合わせチェックなので、rootユーザでも接続元クライアントによってアカウントが分かれている
mysql> update user set Password=Password('new_password') where Host='localhost' and User='root';
  # 接続元としたいHost+Userでレコードを指定してパスワードを更新
  # この場合、接続元としたいサーバとmysqlデーモンが稼動したいサーバが同じなので、Host='localhost'としている
mysql> flush privileges;
  # 反映させる
mysql> exit;
```

## Restore and Restart mysqld

```shell-session
## 
## skip-grant-tablesオプションを解除して、mysqldを再起動させて
## nopassログイン可能状態を元に戻す
## 

## /etc/my.cnfからskip-grant-tablesを削除
grep 'skip-grant-tables' /etc/my.cnf
  # option削除を確認

/etc/init.d/mysqld stop
/etc/init.d/mysqld start

##
##  正しいパスワードでのログインを確認
##  From any machine

mysql -uroot
  # ログインできないことを確認
mysql -uroot -p
  # new_password入力でログイン可能なことを確認

```