OmniAICreator/Qiita-1.07M huggingface dataset:
いつのまにかGAEのChannel APIのclient idにハイフンが使えなくなってる


掲題の通り。
2013年7月初旬くらいまでハイフンも使えていた。
2013年8月5日現在も、ハイフンありでtokenの発行とopenまではできるが、push(channel.send_message)が動かない。
100歩譲ってハイフンなしにしてもいいけど、それならtoken発行でエラー吐いてほしい。意味わからなすぎる。というか、channel api周りは全体的にエラーが足りない。channel.send_messageとかも空振りしたらエラー吐いてほしい。
uuid.uuid4()でclient idを生成している人は気をつけましょう。
googleはこの記事を書いた私に8万円ください。

##環境
python:2.7
GAE SDK:1.8.2
PHP の MySQL で "No such file or directory" と出た時の対処方法


# 症状

- MacOS X の MAMP で WebからのDB接続は問題ない
- けど、コマンドラインからやると接続エラー
- エラー内容は "No such file or directory" となる


# 原因

mysql.sock の場所の指定がおかしいから

# 対策

以下で治った

```
ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock
```

# 調べ方

以下のコマンドで、設定しているsockファイルの場所を調べる

```
% php -i | grep socket
mysql.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
mysqli.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
pdo_mysql.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
```


コード上で、mysql_connect 当の後に

```php
mysql_error();
```

でエラー内容見られるよ

# 参考

php - Warning: mysql_connect(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in - Stack Overflow
http://stackoverflow.com/questions/4219970/warning-mysql-connect-2002-no-such-file-or-directory-trying-to-connect-vi
AngularJS：日本語チュートリアル 1

[オフィシャルドキュメント](http://docs.angularjs.org/tutorial) を日本語訳しながら、サクッと紹介してみます。

# karmaのインストールと、サンプルスクリプトのチェックアウト

Node.jsや Gitに詳しくなければ、次のサイトから右下の「Download ZIP」ボタンでダウンロードするだけでも良いでしょう。
https://github.com/angular/angular-phonecat

次の各コマンドで、Karmaというテストランナーとサンプルスクリプトをチェックアウトします。

```shell-session:
npm install -g karma
git clone git://github.com/angular/angular-phonecat.git
cd angular-phonecat
git checkout -f step-0
```

Node.jsは、v0.8以上が必要のようです。使っているバージョンは ```node --version``` で調べられます。

app/index.htmlを開いて、次のように変更します。

```html:app/index.html
<body>
 
  <p>Nothing here {{'yet' + '!'}}</p>
  <p>1 + 2 = {{1 + 2}}
 
</body>
```

こうして、ファイルをWebブラウザーで表示すると、次のように表示されます。

> Nothing here yet!
> 1 + 2 = 3

{{ }} で囲まれた場所がAngularJSによって処理されて、文字列連結や算術演算が行われました。

AngularJSを作動するポイントは、<html>タグの特殊な属性です。

```html:app/index.html
<html ng-app>
```

この「ng-app」という記述がAngularJSを作動させるキーとなります。
Xcode で行番号を表示させる

![Text_Editing_と_EverOne.xcodeproj_—_MainStoryboard.storyboard.png](https://qiita-image-store.s3.amazonaws.com/0/8812/52bb7bfe-1f22-2691-c747-1c35197729cb.png "Text_Editing_と_EverOne.xcodeproj_—_MainStoryboard.storyboard.png")
Mac に MySQL Community Server をいれる

適当にいろいろついてくるので Oracle が配布している Community Server をいれてみる。
dmg でインストール。

http://dev.mysql.com/downloads/mysql/

もろもろでコケるのでまずは lib のシンボリックリンクを張る。
ここらへんは HomeBrew で入れるといらないのかな。

```zsh:
cd /usr/lib/
sudo ln -s /usr/local/mysql/lib/libmysqlclient.18.dylib libmysqlclient.18.dylib
```

コマンドラインツールのパスを通す。
.zshrc あたりに以下を書いとく。

```zsh:
# for MySQL
export PATH=$PATH:/usr/local/mysql/bin
```

とりあえずで文字コードの設定をする。

```zsh:
sudo vim /usr/local/mysql/my.cnf
```

```
[mysqld]
character-set-server=utf8

[mysqldump]
default-character-set=utf8

[mysql]
default-character-set=utf8
```

起動する。

```zsh:
sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
```

初期設定は適当にやればいいと思うけど、最低限パスワード設定と余計なものの削除。

```zsh:
mysqladmin -u root password 'password for root'
mysql -u root -p
```

```mysql:
DROP DATABASE test;
DROP USER ''@localhost;
SET PASSWORD root@'127.0.0.1' = PASSWORD('password for root');
SET PASSWORD root@'::1' = PASSWORD('password for root');
FLUSH PRIVILEGES;
```

これでおわり。


アンインストール
----------------

アンインストーラーはないらしい。
mysqldump とかしてデータ退避するといい。

アプリケーション登録の抹消。

```zsh
pkgutil --unlink com.mysql.mysql
sudo pkgutil --forget com.mysql.mysql
pkgutil --unlink com.mysql.mysqlstartapp
sudo pkgutil --forget com.mysql.mysqlstartapp
```

実体の削除。

```zsh
sudo rm -rf /usr/local/mysql
sudo rm -rf /usr/local/mysql-x.x.xx-osx10.y-x86_64
sudo rm -rf /Library/StartupItems/MYSQLCOM
sudo rm -rf ~/Library/PreferencePanes/MySQL.prefPane
```
Ubuntu12.04LTSにpythonのdjangoを使う環境を作るとき

Ubuntuでdjangoを勉強したいとき

１、準備の準備

```bash:
$sudo apt-get install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libssl-dev 
```

２、pyenvいれる
https://github.com/yyuu/pyenv
readmeに書いてあるのを順番に。１をやってあれば通った。

３、pipいれる

```bash:
$sudo apt-get install python-pip
```

Ex、DB関係入れる

```bash:
sudo apt-get install mysql-server
sudo apt-get install sqlite3
```

４、djangoいれる
どちらが正しいのかわからない？

```bash:
pip install Django
sudo apt-get install python-django
```

５、django-scalforadいれる
https://github.com/modocache/django-generate-scaffold
railsのscalforadのように簡単なcrudアプリを自動生成してくれる、、、らしい？
入ったけどうまく動かなかった
Macでカット・アンド・ペースト


1. Command + C
1. Command + Option + V

## Windowsでは

1. Ctrl + X
1. Ctrl + V

## 引用元

- [ひとりぶろぐ » 実はできたMac OS XのFinderでのファイルのカット＆ペースト](http://hitoriblog.com/?p=7465)
How to log database queries in Pligg 2.0



# change setting

in libs/eq_sql_core.php 

```php
        var $log_to_file      = false;   // create a file in your root pligg fol\
der
        var $logfile          = 'logs/query.log';
        var $logpath          = 'logs/query.log';
```

set following variable to true

```php
var $log_to_file      = false;
```

# log file

logs/query.log
consとconjの違い

``````````````````clojure
(def x (cons (list 1 2) (list 3 4))) ; => ((1 2) 3 4)
(class x) ; => clojure.lang.Cons
(list? x) ; => false

(def y (conj (list 3 4) (list 1 2))) ; => ((1 2) 3 4)
(class y) ; => clojure.lang.PersistentList
(list? y) ; => true
````````````````

ソースをみてみる.

``````````````clojure
user=> (source cons)
(def
 ^{:arglists '([x seq])
    :doc "Returns a new seq where x is the first element and seq is the rest."
   :added "1.0"
   :static true}
 cons (fn* ^:static cons [x seq] (. clojure.lang.RT (cons x seq))))
```````````````

``````````````clojure
user=> (source conj)
(def
 ^{:arglists '([coll x] [coll x & xs])
   :doc "conj[oin]. Returns a new collection with the xs 'added'. (conj nil item) returns (item).  The 'addition' may happen at different 'places' depending on the concrete type."
   :added "1.0"
   :static true}
 conj (fn ^:static conj
        ([coll x] (. clojure.lang.RT (conj coll x)))
        ([coll x & xs]
         (if xs
           (recur (conj coll x) (first xs) (next xs))
           (conj coll x)))))
`````````````````````
phpVirtualBox4.3

virtualbox4.3をインストール(CentOS6.5)
======================

```bash:virtualbox4.3をインストール
$ cd /etc/yum.repos.d
$ sudo wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo
$ sudo yum install -y VirtualBox-4.3.x86_64
$ sudo yum update -y
```

```bash:virtualboxのmodule作成
$ sudo yum groupinstall -y "Development tools"
$ sudo yum install -y kernel-devel
$ sudo /etc/init.d/vboxdrv setup
```

vboxweb-serviceの設定
======================

```bash:vboxユーザー作成
$ sudo useradd -d /home/vbox -m -g vboxusers -s /bin/bash vbox
$ sudo passwd vbox
$ sudo usermod -aG cdrom vbox
$ sudo vim /etc/default/virtualbox
VBOXWEB_USER=vbox
```

```bash:vboxweb-service起動
$ sudo /etc/init.d/vboxweb-service start
```

phpVirtualBoxの設定
======================

```bash:httpd起動
$ sudo yum install -y httpd php php-soap
$ sudo service httpd start
$ sudo chkconfig httpd on
```

[phpVirtualBox4.3](http://sourceforge.net/projects/phpvirtualbox/files/)をダウンロード。

```bash:
$ unzip phpvirtualbox-4.3-1.zip
$ sudo mv phpvirtualbox-4.3-1 /var/www/html/phpvirtualbox
$ cd /var/www/html/phpvirtualbox
$ sudo cp -a config.php-example config.php
```

```bash:config.phpをvirtualboxをvboxユーザーのログインパスワードに変更する。
var $username = 'vox';
var $password = 'pass';
```

admin : adminでログイン。
![スクリーンショット 2014-01-31 8.31.03.png](https://qiita-image-store.s3.amazonaws.com/0/25728/be6025a4-8425-bc55-20da-3feb5e334f85.png)


ログイン成功![スクリーンショット 2014-01-31 8.34.40.png](https://qiita-image-store.s3.amazonaws.com/0/25728/26c69411-8ed3-f3f4-20f1-e52aeea9911a.png)


VirtualBoxのextensionインストール
======================

一般ユーザーでは拡張機能をインストール出来ないため、rootで作業。

```bash:rootでvncserver,virtualboxを起動。
$ sudo yum install -y tigervnc-server ipa-gothic-fonts.noarch
$ sudo -uroot vncserver :1
$ sudo -uroot DISPLAY=:1 virtualbox
```

extensionをインストール。

```bash:vncserver終了
$ sudo -uroot vncserver -kill :1
```


# RemoteBoxという他の方法もある

```bash:
yum install -y RemoteBox
```

## 操作されるvirtualbox側

port 18083 でListenしておく。

```bash:
vboxwebsrv -H 0.0.0.0
```

## RemoteBox側

vboxwebsrvが稼働しているサーバの情報を入力し接続。
なおmacでvboxwebsrvをListenさせて接続してみたところフリーズした。
git push や pull をしたときに permission denied (publickey)  が出てしまった場合

普段は `git clone` や `git push` ができていたのだけど
突然 `git push` も `git pull` もできなくなった
github とローカルから使用していた公開鍵を削除して
公開鍵の再作成 再登録して
> ssh -T gist@github.com

が成功していたけど同様のエラーがでました

その後  ~/.ssh/ に config をつくって
> Host github.com
	User git
	Port 22
	Hostname github.com
	port 22
	IdentityFile ~/.ssh/id_rsa
	TCPKeepAlive yes
	IdentitiesOnly yes
Host gist.github.com
	User git
	Port 22
	Hostname gist.github.com
	port 22
	IdentityFile ~/.ssh/id_rsa
	TCPKeepAlive yes
	IdentitiesOnly yes  

って書いたら出来た
もしかしたら config の作成だけで済んだかもしれない
vdiイメージのtrim

* vmdkはvboxmanageで圧縮ができないので注意。

* linuxの場合は以下でzero埋めする。

```bash:zero埋め
$ dd if=/dev/zero of=zero bs=4k; rm zero
```

* windowsの場合は[sdelete](http://technet.microsoft.com/ja-jp/sysinternals/bb897443(en-us).aspx)を使って`必ず`空き容量をzero埋めしておく。

```bash:
sdelete.exe -z c:
```

```bash:UUIDで指定し圧縮
$ vboxmanage list hdds
$ vboxmanage modifyhd [UUID] --compact
```

```bash:ファイル名を指定して圧縮
$ vboxmanage modifyhd linux.vdi --compact
```

```bash:例
$ vboxmanage list hdds
UUID:        0490685d-d218-4561-be29-d30ce83d81a3
Parent UUID: base
Format:      VDI
Location:    /home/User/VirtualBox VMs/windows7_vagrant/80gb.vdi
State:       created
Type:        normal
Usage:       windows7_vagrant (UUID: ce7504bb-cc22-4914-8ce8-ccd028bc516e)

$ vboxmanage modifyhd 0490685d-d218-4561-be29-d30ce83d81a3 --compact
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%
$ 
```
Javaで短いFizzBuzz

数年前に[Anarchy Golf](http://golf.shinh.org/p.rb?FizzBuzz#Java)に投稿したjavaのFizzBuzzです。
懐しくて公開しました。

```java:f.java
class f{public static void main(String[]a){for(int i=0;++i<101;)System.out.println((i%3<1?"Fizz":"")+(i%5<1?"Buzz":i%3<1?"":i));}}
```

更に短いコードはenumを使うようですが、Anarchy Golfではstderrをチェックされるのでテストを通りませんでした。

```java:f.java
enum f{a;{for(int i=0;++i<101;)System.out.println((i%3<1?"Fizz":"")+(i%5<1?"Buzz":i%3<1?"":i));}}
```

Javaは文法の制約が厳しめなので他の言語ほど短くするのは難しくないと思います。
Vagrantで PHP+MySQL環境を構築する（シェル編）

いろいろなサイトを参考にしたけれど、chefとかと連携して便利そうだが複雑だったので、できるだけオフィシャルのドキュメントに沿う形で、必要な部分だけ書き足してみた。

# インストール

Vagrantをダウンロード
http://downloads.vagrantup.com/

VirtualBoxをダウンロード
https://www.virtualbox.org/

# 仮想環境の構築

Vagrantの仮想環境を構築（オフィシャル通り）

```shell-session:
mkdir vagrant
cd vagrant
vagrant init precise32 http://files.vagrantup.com/precise32.box
```

# bootstrap.shの作成

作業フォルダ（vagrant）に「bootstrap.sh」を作る

```shell-session:bootstrap.sh
#!/usr/bin/env bash

echo "Installing Apache etc..."

apt-get update >/dev/null 2>&1

echo mysql-server-5.5 mysql-server/root_password password PASSWORD | debconf-set-selections
echo mysql-server-5.5 mysql-server/root_password_again password PASSWORD | debconf-set-selections

apt-get install -y apache2 php5 mysql-server php5-mysql vim unzip >/dev/null 2>&1

/etc/init.d/apache2 restart

rm -rf /var/www
ln -fs /vagrant /var/www

# phpMyAdmin
echo "Installing phpMyAdmin"
cd /vagrant
wget http://downloads.sourceforge.net/project/phpmyadmin/phpMyAdmin/4.0.5/phpMyAdmin-4.0.5-all-languages.zip >/dev/null 2>&1
unzip phpMyAdmin-4.0.5-all-languages.zip >/dev/null 2>&1
mv phpMyAdmin-4.0.5-all-languages phpmyadmin

# WordPress
echo "Installing WordPress"
wget http://ja.wordpress.org/wordpress-3.6.1-ja.zip >/dev/null 2>&1
unzip wordpress-3.6.1-ja.zip >/dev/null 2>&1

a2enmod rewrite
```

こちらに参考に、各種書き加えました。
https://gist.github.com/ChrisYip/5539984

内容は、各種ソフトをインストールします。phpMyAdminは、apt-getでインストールすると文字化けしてしまったので、ZIPファイルをダウンロードしてセットアップする形に。
WordPressは不要であれば、最後の3行を削除してください。

MySQLのパスワードは「PASSWORD」で設定されます。変更したい場合は別のものに書き換えましょう。

# Vagrantfileを編集

```shell-session:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
    config.vm.box = "precise32"
    config.vm.box_url = "http://files.vagrantup.com/precise32.box"
    config.vm.network :forwarded_port, guest: 80, host: 4567
    config.vm.provision :shell, :path => "bootstrap.sh"
end
```

# 起動・確認

起動する

```shell-session:
vagrant up
```

# Allow Overrideを変更する
```shell-session:
vagrant ssh
vi /etc/apache2/sites-enabled/000-default
```

「AllowOverride」の設定を書き換えます。

- Webブラウザで次のURLにアクセスする
http://127.0.0.1:4567

- phpMyAdminはこちらで起動
http://127.0.0.1:4567/phpmyadmin

- WordPressはこちらでアクセス
http://127.0.0.1:4567/wordpress
ステージング環境でもbetter_errorsを使えるようにする


ローカル環境ではbetter_errorsが使えるのですが、そのままだとステージング環境に上げた時にbetter_errorsが使えません。
ステージング環境は普通グローバルIPを当てるので、全部のホストからbetter_errorsの画面が見えてしまうと irb で任意のシェルコードが実行できてしまうのでセキュリティ上見えないようになっています。

社内からのアクセスではbetter_errorsの画面が見たいと思うときがあると思うので、これを回避するためには development.rb の最後尾に以下を記述します。

```ruby:config/environments/development.rb
BetterErrors::Middleware.allow_ip! "xxx.xxx.xxx.xxx"
[ "127.0.0.1", "210.xxx.yyy.zzz" ].each do |ip|
  BetterErrors::Middleware.allow_ip! ip
end
```

アクセスする予定のホストのIPアドレスを列挙します。
Railsでデバッグするときに使用するgem


better_errors + pry を組み合わせています。
better_errorsはエラー時の画面を見やすく整理してくれて、例外吐いたところでrubyのコマンド叩いて変数の内容をダンプしたりできるのでとても便利です。

```ruby:Gemfile
# Debugging tools
group :development, :staging do
  gem 'better_errors'
  gem 'binding_of_caller'
  gem 'letter_opener'
  gem 'mail_view'
  gem 'pry-rails'
  gem 'pry-debugger'
  gem 'pry-remote'
  gem 'quiet_assets'
  gem 'sextant'
end
```

pryは

```ruby
require 'pry'
```

して
ブレークポイントを張りたいところで

```ruby
binding.pry
```

と記述します。書いた所で `rails server` したターミナルが停止します。
VMWare Toolsのインストール


VMWare Toolsのインストールが地味にめんどくさいです。
全部デフォルト設定なのでプロンプトで空エンターに代わるコマンドはないものか。そこでyesコマンドを使うことにしました。

```
yes '' | ./vmware-install.pl
```

パイプで流して終了。
rootでやるか適宜sudoをつけてください。
一方通行なコライダ

下からは乗れて上からは乗れない足場や、右から入れて左から通れない一方通行の壁を作るには、[トリガーコライダ](http://docs.unity3d.com/Documentation/ScriptReference/Collider-isTrigger.html)（IsTriggerをオンにしたコライダ）と普通のコライダを組み合わせる方法があります。

```
  ___________
  |   足場  |
+-+---------+-+
| |_________| |
|   トリガー   |
+-------------+
```

足場のコライダの下にトリガをAAのように配置して、トリガに触れた時足場とキャラの間の[衝突を無効にします](http://docs.unity3d.com/Documentation/ScriptReference/Physics.IgnoreCollision.html)。
プレイヤーが離れたら無効化を解除して足場の衝突を復活させます。トリガと足場の配置がうまくいっていれば足場がプレイヤーを押し出してくれます。

(参考: [Unity Answers - Eficient one-way collider](http://answers.unity3d.com/questions/362021/eficient-one-way-collider.html))
MongoDBをシェルで弄ることが多いならmesh使おう


日頃業務なんかでmongodbをシェルからいじってて、「あ”ー、underscore.js使いたい」とかその他諸々機能を拡張したいなと思っている方におすすめ。

## meshとは？
正式には**Mongo Extended Shell**という名前らしい。
以下のライブラリをまとめた便利ツールです。


## 導入方法

```shell:
$ git clone https://github.com/skratchdot/mesh.git
$ echo 'load("<meshをcloneしたディレクトリ>/mesh/mesh.js");' >> ~/.mongorc.js 
```

こんだけです。

## 含まれるライブラリ

* underscore.js - ご存知underscore.js
* underscore.string.js - 文字列操作用ライブラリ
* moment.js - 日付操作ライブラリ
* science.js - 科学系演算用ライブラリ
* distinct2() - あまり使ってないけど、デフォルトのdistinctコマンドより大きなコレクション数に対しても使えるdistinctコマンド
* distinctTypes() - distinctと違って、指定したキーの型を返してくれるコマンド
* flatten() - mapReduce使ってドキュメントをkey-value型に展開してくれる拡張。使ったこと無い。
* schema() - A schema analysis tool for MongoDB.
* wild() - ワイルドカード検索を可能にしてくれる

他にも色々入ってる。

## その他
https://github.com/skratchdot/mesh
configとか細かく設定できるみたいなので見てみてください。
Macに最初から入ってる ab が古いからビルドしたよ


焦るんじゃない　俺は ab コマンドが使いたいだけなんだ

"nginxにLion付属のab（ApacheBench）を実行したら失敗するときの解決ログ ::ハブろぐ" - http://havelog.ayumusato.com/develop/others/e477-lion_bundled_ab_nginx.html


ここにも書いてあるけど、ab が古くて

```
apr_socket_recv: Connection reset by peer (54)
```

とか出るから、ビルドしたことを思い出せるように書いておこう。

ほぼ同じ手順だけど、OSX10.8 の Xcode's comand line utilities が見つけられなくて、apache 自体のビルドエラーになる。

```
configure: error: C preprocessor "/Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.8.xctoolchain/usr/bin/cc -E" fails sanity check
```

次のコマンドで解決。

```
sudo ln -s /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/ /Applications/Xcode.app/Contents/Developer/Toolchains/OSX10.8.xctoolchain
```

``XcodeDefault.xctoolchain`` が、``OSX10.8.xctoolchain``を指すように変更するってことですね。

``configure`` は通ったものの、今度は ``make`` でエラー

```
libtool: compile: unable to infer tagged configuration
libtool: compile: specify a tag with `--tag'
make[3]: *** [unixd.lo] Error 1
make[2]: *** [all-recursive] Error 1
make[1]: *** [all-recursive] Error 1
make: *** [all-recursive] Error 1
```

"MacPortsのApache2.2.8 - KoshigoeBLOG" - http://blog.koshigoe.jp/archives/2008/02/macportsapache2.html
ここに書いてあるように、LIBTOOL っていうのに tag 指定してあげた

build/config_vars.mk に加えたのは以下の diff のとおり

```
-LIBTOOL = /opt/local/share/apr-1/build/libtool $(LTFLAGS)
+LIBTOOL = /opt/local/share/apr-1/build/libtool --tag=CC $(LTFLAGS)
```

再度 ``make`` する
``support/ab`` ができているので、デフォルトで入ってる ``ab`` をこいつで上書きする

```sudo cp support/ab /usr/sbin```

やっとまともな ``ab`` 使えたので、これで終わり。
Sublime Text 2で行を上/下に移動するショートカット

Sublime Text 2には、キャレットのある行を直接上や下に1行移動する (つまりスワップする) 便利なショートカットがある。
http://nerdkitchen.org/blog/sublime-text-2-useful-shortcuts-number-1/

	コマンド + コントロール + ↑または下

なぜ今までこれがなかったのか不思議なぐらい便利 (よくは知らないけどEclipseでは当たり前の機能らしい)。今までは行を1つ上に移動しようとするたびに行のカット/一行上に移動/ペースト/改行調整をやっていたのだから。

ところが、少なくともこのショートカットがなかなか効かず、英語圏でも質問が続出している。

自分の環境でもこのキーが効かず、確かめてみたところ、どうやらコントロールを先に押してしまうとだめらしい。Keybindings - Defaultでは以下のようにコントロールが先に記述してあるというのに。

	{ "keys": ["ctrl+super+up"], "command": "swap_line_up" },
	{ "keys": ["ctrl+super+down"], "command": "swap_line_down" },

そこでさっさと以下を Keybindings - Userに登録してしまった。

	  { "keys": ["+super+up"], "command": "swap_line_up" },
	  { "keys": ["+super+down"], "command": "swap_line_down" }

自分の場合初代HHKを使っていて、矢印キーのためにFnキーを押さなければいけないので、キーは少しでも少ない方がありがたい。

* 直接関係ないのだけど、「行の移動」と書いてしまうと、上で言うところの「行を上に移動する」という意味の他に、「行単位でカーソルを上に移動する」という従来の意味も含まれてしまうので、何ともググりにくい。これは英語圏でも似たような事情があるらしい。実際に行なっているのはスワップなのだけど、直感的には「行を移動している」と考えてしまいがち。
古いGIGABYTEマザーでUSBメモリからのLinuxブートにハマったのでメモ

#結論
基本的には[UNetbootin](http://unetbootin.sourceforge.net/)、または[Linux Live USB Creator](http://www.linuxliveusb.com/)で、ブート可能なUSBメモリを作成すればよいのですが、我が家の古いGIGABYTEマザー（GA-965P-DS3）では、 **FAT16でフォーマット** しないとうまくいきませんでした。

FAT32でフォーマットすると

>ERROR:No Configuration file found
>No DEFAULT or UI configuration directive found!

となります。

#その他
その他、いくつかハマったのでメモします。

NTFSでフォーマットすると

>BOOTMGR is missing
>Press Ctrl+Alt+Del to restart

exFATでフォーマットすると

>Remove disks or other media. 
>Press any key to restart.


####ググってたどり着いたサイト
- [【メモ】Unetbootinで"BOOTMGR is Missing"が出る→解決](http://d.hatena.ne.jp/hekkun_toradora/20120507/1336398937)
- [ERROR: No configuration file found](http://tennoji.seesaa.net/article/256791723.html)
emacs設定

使っているinit.el晒せばいいだけなのですが、備忘録でメモです。

### ~バックアップファイルを作らない
(setq make-backup-files nil)

### テーマ変更
(load-theme 'テーマ)

http://d.hatena.ne.jp/aoe-tk/20130210/1360506829

## 便利ショートカット

少しずつ書き溜める

### transient-mark-mode

C-space

### コメントアウト/解除

transient-mark-mode M-;
setIntervalをaruguments.calleeを使わずに0秒でも発火させる

元ネタ:[setIntervalをaruguments.calleeを使って0秒でも発火させる - 終わる世界とコンテンツ](http://blog.geta6.net/post/57143440084/setinterval-aruguments-callee-0)

`arguments.callee`はstrictモードでエラーになるので使うべきじゃありません。
即時関数にも名前を付けられるので、それを利用できます。

```javascript
setInterval((function waf() {
    console.log('わふー');
    return waf;
}()), 2000);
```
Gitレポジトリを移行する方法


既存のGitレポジトリを、GithubやBitBucketのようなホスティングサーバに移行したり、逆にローカルサーバのGitBucketやGitLabなどに移行したい場合、（乗り換えなど）まあ単純にpushすればいいやんと思ったら、思うような結果にならなかったり、面倒な手順になってしまったりしてしまった。

どうも自分のワーキングのレポジトリから飛ばそうとすると、tagだったりbranchだったりが移行できていないかったりするのです。
ぐぐると、いったんローカルにリモートと同名のブランチ作って(checkoutして)から、push --all, --tags とかしてる奴とかありますがそれは面倒だなぁやだなぁみたいな。
最終的には、これが一番楽な手順かなと思う手順に行きつけたのでここに記す。

```
$ git clone --mirror <SOURCE_REPOSITORY_URL>
$ cd <REPOSITORY>
$ git push --mirror <DESTINATION_REPOSITORY_URL>
```

mirrorオプションでcloneしてきて、mirrorオプションでpushする。これぐらいの手間なら許すとしよう。

[tanacasinoのメモ - Gitレポジトリを移行する方法](http://tanacasino.hatenablog.com/entry/2013/08/03/233427)
ffmpegを使って複数のビットレートが違う動画を2passでエンコードしながらcropとscaleを同時にする。

タイトル長いけど、そのままです。
環境はUbuntu12.04

ffmpegは動画の連結オプションがややこしい上にcropと併用すると上手く動かなかったりつまづく所が多かったので。

## まずffmpeg をソースからインストールする
apt-get からでもインストールできるけどライセンスの問題で色々と重要な機能が使えないのでちゃんと使うなら必ずソースからインストールしたほうが良し。
バイナリでインストールしたのが古いと -filter_complex オプションが使えなくて
`ffmpeg: unrecognized option '-filter_complex'`などが出たりする。

インストール方法はここにあるとおりにすればOK。
http://ffmpeg.org/trac/ffmpeg/wiki/UbuntuCompilationGuide

## 動画の連結

ハマったのが -filter_complex オプションを使って動画の連結をすると -vf オプションでのcropが無効化されてしまう点。

あと何故か concat=n=2:v=1:a=1 と音声をオンにして -filter_complex の crop を使おうとすると
`Too many inputs specified for the "crop" filter.`のエラーが出てエンコードできない。
何で映像部分のcropオプションが音声があると使えないのかは不明。

ちなみに `a=0` でも1つ目の動画の音声は残るので初めの方の音声だけ聞いて確認してると2つ目の動画の音声が無くて悲しい事態になる。

というわけで映像と音声を別々に連結して、最後に映像と音声を合成するしかなさそう。めんどくさい。

まず音声をwavで結合して抽出。
`ffmpeg -i input1.avi -i input2.avi -filter_complex "concat=n=2:v=0:a=1" audio.wav`

neroAacEncを使ってaacに変換
`neroAacEnc -if "audio.wav" -of "audio.aac" -2pass -br 96000`

次に動画を連結しつつ2passでエンコード。
`ffmpeg -i input1.avi -i input2.avi -filter_complex "concat=n=2:v=1:a=0, crop=704:420:8:0" -s 640x360 -pass 1 -vb 900k -an video.mp4`

これで720x420の元動画の左右を8pxずつcropしてから640x360にサイズ変更して、音声なしで出力の1pass目ができるので

`ffmpeg -i input1.avi -i input2.avi -filter_complex "concat=n=2:v=1:a=0, crop=704:420:8:0" -s 640x360 -pass 2 -vb 900k -an video.mp4`

で2pass目を行う。1pass目でできたvideo.mp4を上書きするか聞いてくるのでOKで。
ちゃんと1パス目でクロッピングやサイズ変更、それに連結ができてるかを確認しておかないと2パス目の後に気づいた時に時間の無駄を嘆くことになる。

音声と映像が無事連結されてたら、それらを結合
`ffmpeg -i video.mp4 -i audio.aac -c copy output.mp4`

以上で終了！やっと終わった―！

## 参考
http://looooooooop.blog35.fc2.com/blog-entry-1020.html
"Using \lstinline inside a \item"する時の注意

# 経緯

学校の授業の課題でレポートを作ることになったので、TeXでレポートを書いていた。そうしたところ、`description`環境の`\item`のラベルの中で`\lstinline`を使いたくなった。ところが、

```latex:
\begin{description}[style=nextline]
	\item[\lstinline|public static void main|]
		メイン関数です。
\end{description}
```

などとすると、ラベル（`\item[ここ]`）がまるごと消滅する。

# 解決策（？）

適当にググるとすぐに解決策が出現する。

http://tex.stackexchange.com/questions/93944/using-lstinline-inside-a-item

これは次のようにして解決している。

```latex:
\let\orig@item\item %もともとの\itemを保存

\def\item{%
    \@ifnextchar{[}%         "\item["で始まっているかチェック
        {\lstinline@item}%   "\item["で始まってたら専用のものを使う
        {\orig@item}%        そうじゃなかったらもともとの\itemを使う
}

% \lstinlineを使うため、ボックスを作ってそこに叩き込む
\begingroup
\catcode`\]=\active
\gdef\lstinline@item[{%
    \setbox0\hbox\bgroup
        \catcode`\]=\active
        \let]\lstinline@item@end
}
\endgroup

% もともとの\itemに↑で作ったボックスを食わせて終わり
\def\lstinline@item@end{%
    \egroup
    \orig@item[\usebox0]%
}
```

最初はこれで万事解決かと思ったが、事件は発生した。

# 事件

今使っているクラスファイルでは、ラベルの文字列を`\bfseries`で太くするように設定しているのに、何故か太くならないという問題が発生した。
いろいろ調べた結果、`\lstinline`用に改造したのが原因らしい。というのも、

```latex:
\@ifnextchar{[}{\lstinline@item}{\orig@item}
```

という感じで、`description`環境を使う時は全て`\lstinline@item`が実行され、それによってラベルの中味は一旦ボックスに封印されてしまう。`\bfseries`などはボックスの中に影響を及ぼさないので、結果として普通のフォントで表示されてしまったようだ。

# 解決策

これは、`\item[]`を全て`\lstinline@item`へ送って箱詰めしているのが不味い感じだったので、`\lstinline`を使う時は`\item<>`という表記を使い、その時だけ`\lstinline@item`へ送って箱詰めし、それ以外は箱詰めしないという方針へ切り替えた。

## コード

```latex:
\makeatletter
\let\orig@item\item

\def\item{%
    \@ifnextchar{<}%
        {\lstinline@item}%
        {\orig@item}%
}

\begingroup
\catcode`\>=\active
\gdef\lstinline@item<{%
    \setbox0\hbox\bgroup
        \catcode`\>=\active
        \let>\lstinline@item@end
}
\endgroup

\def\lstinline@item@end{%
    \egroup
	\orig@item[\box0 ]%
}
\makeatother
```
もとのソースコードでは`\usebox`を用いていたが、ボックスの保存にTeXのプリミティブである`\setbox`を使っていながら、呼び出しにLaTeXの`\usebox`を用いるのは微妙という結論にいたり、ボックスの呼び出しもTeXのプリミティブである`\box`を用いることにした。（Thanks zr_tex8r）

## 使い方

```latex:
\begin{description}[style=nextline, font=\bfseries]
	\item[ふつうの]
		ちゃんと太くなる。

	\item<\lstinline|void main()|>
		書ける。
\end{description}
```

## 結果

![スクリーンショット 2013-08-03 23.09.12.png](https://qiita-image-store.s3.amazonaws.com/0/10815/e7964e69-55c8-4d2a-6c5e-327aad17868e.png)
Mac が USB 接続した Nexus7 を認識しなかったときにやったこと


追記(8/6) : どうやらNexus7に付属していたUSBケーブル不良だったみたいです。Kindle Paper white 用のUSBケーブルで接続したら普通に認識しました…orz おれの土日を返せ...

追記(8/5)：以下の手順で一瞬認識したかに思えたがすぐに認識しなくなった...

あまり確証が無いので参考程度に...

ログを見ると

```
13/08/03 21:50:17.000 kernel: USBF:	2151.126	[0xffffff8012753200] The IOUSBFamily is having trouble enumerating a USB device that has been plugged in.  It will keep retrying.  (Port 3 of Hub at 0xfd100000)
```

というようなログが大量に流れていたので、以下のページを参考に IOUSBFamily.kext を Apple からダウンロードして置き換えてみたら直ったっぽい。

* [Mac：USB接続機器(特にHDD)を認識しない、警告が表示される等のトラブル時に試してみることのまとめ。 | Macとかの雑記帳](http://tukaikta.blog135.fc2.com/blog-entry-148.html)

ただし上記サイトにあるように、手作業での置き換えは行わず、.pkg ファイルを起動してインストーラに任せてインストールした。

当初、上記 kext をログ出力版に置き換えて症状が改善しなかった。
そこで、SMCリセットやPRAMリセットも試してみたが改善しなかったので、先の Appleからダウンロードした kext にログ出力無しバージョンの IOUSBFamily.kext をインストール・再起動したら 認識するようになった。

## 参考

* [Mac：USB接続機器(特にHDD)を認識しない、警告が表示される等のトラブル時に試してみることのまとめ。 | Macとかの雑記帳](http://tukaikta.blog135.fc2.com/blog-entry-148.html)
AnsibleでCentOSにApache HTTP Serverをインストールしサービス開始を確認するところまで


今回はタイトル通り、Ansibleを使ってCentOSにhttpdをインストールし、サービスが開始されるところまでを確認します。

## 環境

|Location|OS|
|:--|:--|
|Local|Mac OS X|
|Remote|CentOS 6.4 (VirtualBox/Vagrant)|

Mac OS XでのAnsible環境構築に関しては、以下を参考にしています。
https://weluse.de/blog/installing-ansible-on-os-x.html

## Playbook

今回はPlaybookのinclude機能を使っているため、YMLファイルが二つ、またhttpd動作確認時に必要となるHTMLファイル一つ、の構成です。

``` 	vagrant-httpd.yml
- hosts: vagrant
  port: 2222
  user: vagrant
  sudo: yes
  tasks:
    - include: centos/install-start-httpd.yml
```

``` centos/install-start-httpd.yml
    - name: install yum packages
      yum: name={{ item }} state=latest
      with_items:
      - httpd
      - python-setuptools
    - name: install easy_install package
      easy_install: name=pip
    - name: install pip package
      pip: name=httplib2
    - name: copy index.html
      copy: src=centos/index.html dest=/var/www/html
    - name: start httpd
      service: name=httpd enabled=yes state=started
    - name: check httpd is working
      uri: url=http://localhost/
```

``` centos/index.html
<html>
<head>
    <title>index.html</title>
</head>
<body>
    index.html
</body>
</html>
```

上記ファイルを配置し、事前にLocalからRemoteへSSH接続ができることを確認して、以下を実行。
`$ ansible-playbook vagrant-httpd.yml`

接続関係の問題が無ければ、無事に動作確認まで完了できる、、、はず。

## 解説っぽいもの

### 色々インストールしているけど

今回の最終目標であるhttpd動作確認のために、localhostへHTTPで接続を行なっています。
これを行なうための"uri"パッケージなのですが、__Remote__側に"httplib2"というPythonのパッケージを入れておかなければいけません。
これを入れるために"pip"が必要となり、"pip"を入れるために"easy_install"が必要となり、"easy_install"を入れるために"python-setuptools"が必要となるようです。

### index.htmlをコピーしているけど

CentOSの"httpd"はデフォルトで"/var/www/html"以下にファイルが存在しておらず、そのまま"uri"でアクセスしてもエラーとなってしまうため、適当なHTMLファイルをコピーしておく必要があります。

### "service"パッケージはあるけど

今回"service"パッケージを使用して、確かに"/etc/rc*.d"にファイルが作成されていました。
ですが、コマンドラインから`chkconfig`を実行してもサービスとして"httpd"が表示されませんでした。
"httpd"自体は動作しているので、後々コマンドからの調査や管理が必要となった場合に、混乱する基になるかもしれませんね。
ターミナルで作業をしている時にFinderを開きたくなったら


まず、

    open .

でディレクトリを開ける。

    open flower.png

で画像がプレビューできる。

で、vimつかってる最中にFinder開きたくなったらコマンドモードに移行して

    :! open .

で Finder が開きます。

便利なことこの上ない。


[MacのターミナルからカレントディレクトリをFinderで開く方法 - 頭ん中](http://www.msng.info/archives/2011/01/opening-terminal-current-directory-on-finder.php)
jenkinsでoctopressのビルド

以前github pagesでoctopressを使用してみてはいたのですが、ビルドした際に実際に表示されるhtmlファイルをバージョン管理はできているけども、ビルドする元ファイル、markdownやテーマの設定ファイル群のバージョン管理がしづらかったのですがjenkinsを使う事で簡単に運用して行く事ができたので設定方法をまとめてみます。

## 以前までの問題点

- sourceのバージョン管理
- ビルド時間

### sourceのバージョン管理

octopressをgithub pagesの設定にしている時は
`source/_posts/`
のディレクトリにmarkdownだったりhtmlファイルを置いて

    rake generate

コマンドでビルドすれば`public/`ディレクトリ下にビルドして作成されたhtmlファイル群が変更されて、
`_deploy/`ディレクトリ下にも同じファイルが作成されてgit管理されるかと思います。

    rake deploy

をすればgithubのリポジトリにpushされてgithub pagesに変更分が反映されるようになっていると思うのですが、
そうなると`_deploy/`ディレクトリはバージョン管理ができている状態なのですが、ビルドする元ファイル郡`source/_posts/`やテーマの設定ファイルのバージョン管理ができていません。手元にあるファイルがなくなったら更新すげー面倒。

しかし、回避策はすでに用意されていて
github pagesをデプロイ先に選んでいれば`source`リポジトリがすでに作られているのでコミットを行って`git push origin source`をすればgithubのリポジトリに変更分が反映されるようになっています。

でも`git push origin source`は記事の公開と関係がない部分なので忘れそう、面倒くさい。

### ビルド時間

ビルドするときには過去の記事も一からビルドし直すので記事が多くなればなるほど時間かかります。(新規ページだけビルドする設定とかあったんでしたっけ？)


これらの解決策としてjenkinsを使うという案。


## 目標

- sourceブランチをコミット、プッシュでビルドして反映

記事を作成、コミットをすればページが作成されて反映されていればよい。
それをjenkinsでやろうという目標


## jenkinsの設定

すでにoctopressを使ってgithub pagesでブログを作成済みでsourceリポジトリをpush済み前提

- 鍵登録
- プラグインインストール
- ジョブの作成

### 鍵登録

jenkinsサーバーにssh接続

    cd /var/lib/jenkins
    sudo -u jenkins -H ssh-keygen -t rsa

`.ssh/id_rsa.pub`の中身をgithubに登録する

    sudo -u jenkins git ls-remote -h git@github.com:<自分のgithubリポジトリ>.git HEAD

でknown_hostsに登録しておく

### プラグインインストール

`Git plugin`,`rbenv plugin`のインストール

`Jenkinsの管理` ➡ `Git plugin`
`Global Config user.name Value` , `jenkins`
`Global Config user.email Value` , `some@emai.com`

に設定

### ジョブの作成

`フリースタイル・プロジェクトのビルド`でジョブの作成

ジョブの設定
`ソースコード管理`
Gitにチェック
Repositoriesに `git@github.com:<自分のgithubリポジトリ>.git` の設定
Branches to buildに `source`

`SCMをポーリング`

    */5 * * * *

`rbenv build wrapper`にチェック

ビルド手順の追加
シェルの実行を追加

実行内容

```
bundle install --path vendor/bundle
# 初回のみコメンアウトを外す
#git clone git@github.com:<自分のgithubリポジトリ>.git _deploy
bundle exec rake gen_deploy
```

初回のみgit cloneを実行してください。

これで完了。sourceリポジトリで記事を作成してコミットすれば反映されます。
Heroku Schedulerにnode.jsで書いたプログラムを登録する

基本的な所は下記を拝見してやることができた（多謝）。
http://stackoverflow.com/questions/13345664/using-heroku-scheduler-with-node-js
http://www.youtalk.jp/post/13964633597/heroku-scheduler

自分の所は下記のようにした。
まず、トリガーになるファイルは下記のように記す事でnode.jsのコードとして読んでくれるので、本体をrequireする。トリガーのファイルは拡張子を入れない（ルールなのかはわからないが）ようなので、これでコードを編集する際にも色分け等が効いてやりやすい。

```bash
#!/usr/bin/env node
require('./myscript.js');
```

2014/4/11 追記
以前のコードは動きません！仕様が変わった様子です。下記のリンクをご覧下され。
http://qiita.com/ms2sato/items/a4e6654fd2f1b13e99f9
`#! /app/bin/node`ではなくて`#!/usr/bin/env node`にしましょう。



また、npmで外部コンポーネントを呼んで利用する事も出来る。その際は通常のWEBのアプリケーションと同様にpackage.jsonに書いておけば良い。
michinari.c

```c:
#include <stdio.h>
#include <string.h>

typedef int * const cp_i;
typedef char * const cp_c;

char input[] = "\
	0 	2RcL3LL22 	ABCNYjmpsvy147edcbcdef\
	1 	L3R4L5RR5R3L5 	A?\
	2 	2ReLLe 	ABCNYjmpsvy147eTITe741yvspmjYNC\
	3 	1ReRRe 	ABMXilorux036fUJUf630xuroliXMB\
	4 	ReRRe 	ALWhknqtwz25gVKVg52zwtqnkhWLA\
	5 	f 	ABCDEFGHIJK?\
	6 	Rf 	ALWhknqtwz25gVK?\
	7 	1Rf 	ABMXilorux036fUJ?\
	8 	2Rf 	ABCNYjmpsvy147eTI?\
	9 	aR1RaL1LaR1R2L1L2 	ABCDEFGHIJKVUTSRQPONMLWXYZabcdefg567432\
	10 	2R1R2L1L2R1R2L1L2R1R2L1L2R1R2L1L2 	ABCNMLWXYjihklmponqrsvutwxy\
	11 	2R4R2L4L2R4R2L4L2R4R2L4L2 	ABCNYjmlknqtwxy147efgVK?\
	12 	R1L2R4R2L4L2R4R2L4L2R4R2L4L2 	ALMNYjmponqtwz0147eTUVK?\
	13 	R2L2R4R2L4L2R4R2L4L2R4R2L4L2 	ALWXYjmpsrqtwz2347eTIJK?\
	14 	R3L2R4R2L4L2R4R2L4L2R4R2L4L2 	ALWhijmpsvutwz2567eTI?\
	15 	R5L2L5L1LaR1L4L5 	ALWhknopmjYNCBMXilorux0325gVKJIHGF\
	16 	1R2L4L2R4R2L4L2R4 	ABMXYZabQFGHIJUfg?\
	17 	2R2L4L2R4R2L4L2R4 	ABCNYZabcRGHIJKVg?\
	18 	3R2L4L2R4R2L4L2R4 	ABCDOZabcdSHIJK?\
	19 	4R2L4L2R4R2L4L2R4 	ABCDEPabcdeTIJK?\
	20 	5R2L4L2R4R2L4L2R4 	ABCDEFQbcdefUJK?\
	21 	LLL1RRR1LLL1RRR2R1 	ALMXYZ?\
	22 	R3RRR3 	ALWhij?\
	23 	1LLL4RRR1LR1RL1 	ABMXilm?\
	24 	R2L1R2L1R3R4 	ALWXilmpsvut?\
	25 	7R4f47LLLc6R9L 	ABCDEFGHSd?\
	26 	5RR868L8448LL4R6 	ABCDEFEDCBA?\
	27 	42Rd1RLLa7L5 	ABCDEFGRc?\
	28 	RRLL6RLR1L5d12LaLRRL529L 	ABCDEFGRSTUV?\
	29 	RLR7L6LL1LRRRcRL52R 	ALWhknqtuv?\
	30 	1RLR8RLR1R437L99636R 	ABMXiloruxwtqnkhWLA?\
	31 	LLL2L3La9Le5LRR 	ALWXYZOD?\
	32 	R1LcRR491 	ALMNOPQRSTUV?\
	33 	R8L1R1R512L8RLLReRf 	ALWhknqtwx0z?\
	34 	1RcL8f1L29a5 	ABMXilorux036fedcbaZYXW?\
	35 	R822LeL46LL39LL 	ALWhknqtwz25gfedcbaZYXW?\
	36 	9R3L5LRRLb5R3L7cLLLR4L 	ABCDEFGHIJUf65?\
	37 	7LLRRR2R3R69Lf76eR2L 	ABCDEFGHSdcbaPE?\
	38 	8RRRLL3Le 	ABCDEFGHITe765?\
	39 	8R5RLL6LbL4LL5bL 	ABCDEFGHITe7410z?\
	40 	6LR2R1LR5LRLRL484L63 	ABCDEFGHITe741yxw?";

const char MAP[] = "\
?????????????\
?ABCDEFGHIJK?\
?LMNOPQRSTUV?\
?WXYZabcdefg?\
?hij?????765?\
?klm?????432?\
?nop?????10z?\
?qrs?????yxw?\
?tuv?????vut?";

const char HEX[] = "0123456789abcdefRL";

void solve(const cp_c data, cp_c output)
{
	const int DIR[] = {1,13,-1,-13};
	int dir = 0, pos = 1+13*1, i, j, code=0, cnt=0;
	output[0]='A';
	for(i=0; data[i]!='\0'; i++) {
		code = strchr(HEX,data[i])-HEX;
		if(code>=16) {
			dir = (data[i]=='R') ? (dir+1)%4: (dir+3)%4;
			continue;
		}
		for(j=0; j<code; j++) {
			pos += DIR[dir];
			output[(++cnt)] = MAP[pos];
			if(MAP[pos]=='?') return;
			if(pos/13==8) {
				pos = 13*8+12-pos%13;
				dir = (dir+2)%4;
			}
		}
	}
}

typedef struct {
	char c[40];
} OUTPUT;

int main()
{
	int i = 0;
	char *code = strtok(input,"\t "), *data[3] = {code,0,0};
	OUTPUT output={0}, clr={0};	
	for(i=1; code!=NULL; i++) {
		//printf("%s\n",code);
		if(i%3==0) {
			output = clr;
			solve(data[1],output.c);
			printf("%s\t%s\t%s\t%s\n",
				(strcmp(output.c,data[2])==0) ? "OK": "NG",
				data[0],data[1],output.c);
		}
		data[i%3] = code = strtok(NULL,"\t ");
	}
	return 0;
}
```
CentOSをminimalでインストールしてscpを実行するには、openssh-clientsのインストールが必要です

CentOS 6.4をminimal(最小構成)でインストールすると、scpできない？
いろいろ探した結果、openssh-clientsがインッストールされていないので使用できない事がわかった。

ローカルのMacBookProから、お名前.comのVPSにインストールしたCentOS6.4にscpしようとしたところ、

macbookpro [userid] $ scp id_rsa.xxxxxx.pub [userid]@xxx.xxx.xxx.xxx:/home/[userid]
[userid]@xxx.xxx.xxx.xxx's password:[input password]
bash: scp: コマンドが見つかりません
lost connection

と表示され接続できない。。。

そこで分かったのは、openssh-clientsをyumでインストールしないといけないと言うこと！

# yum install openssh-clients

これで無事に動作できた！！
ListViewの内容をフィルタリングするメモ

ユーザ入力によってインタラクティブにリストの内容が絞り込まれるあれ

### 単純な文字列のリスト
[公式Sample](http://developer.android.com/tools/samples/index.html)にまんまの例がある．
ArrayAdapterは _Filterable_ を実装しているので，ListViewの側で _setOnQueryTextListener_ と _setFilterText_ を適当に呼んであげれば良い．

```java:SearchViewFilterMode.javaから適当に編集引用
public class SearchViewFilterMode extends Activity implements SearchView.OnQueryTextListener {
    protected void onCreate(Bundle savedInstanceState) {
        // (省略)
        mListView.setAdapter(mAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                mStrings));
        mListView.setTextFilterEnabled(true);
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setSubmitButtonEnabled(false);
    }

    public boolean onQueryTextChange(String newText) {
        if (TextUtils.isEmpty(newText)) {
            mListView.clearTextFilter();
        } else {
            mListView.setFilterText(newText.toString());
        }
        return true;
    }

    public boolean onQueryTextSubmit(String query) {
        return false;
    }
```


### ArrayAdapterにString以外を入れたい
文字だけのリストではなくて，アイコン等を含めるために自分の定義したオブジェクトを渡したいことがある．

[androidでArrayAdapterを使う&nbsp;-&nbsp;@blog.justoneplanet.info](http://blog.justoneplanet.info/2011/12/24/android%E3%81%A7arrayadapter%E3%82%92%E4%BD%BF%E3%81%86/)

上記URLより，このときの注意点は以下の二点
- _ArrayAdapter#getView_ をオーバライドするときは _getItem(position_ メソッドによって _position_ に対応する要素を取得する
- データクラスの _toString()_ がフィルタに利用されるので, _toString()_ を適切にオーバライドする


### ポップアップで入力内容が表示させるのを無効化する
上述の方法でそのままListViewにフィルタをかけると，フィルタ文字列が半透明のポップアップで表示される．
![filter_popup.png](https://qiita-image-store.s3.amazonaws.com/0/6000/b36516c0-bf0c-3dee-ecca-5eb509861510.png)
(画像は[Stack Overflow](http://stackoverflow.com/questions/9994841/how-to-hide-the-filter-popup-on-listview-in-android)より)

ワークアラウンドはいくつかありそうだけど， _ListView#setFilterText_ を呼ぶ代わりに，直接Filterオブジェクトを操作するのが良さそうだ．（参考: http://stackoverflow.com/questions/7999083/how-do-i-remove-popup-text-from-listview-filter)

```java
Filter filter = ((Filterable) listView.getAdapter()).getFilter();
filter.filter("search string");
```
memptyと`mempty`の書き間違えでハマった

```hs:
foldr (mappend . Sum) mempty [1..10] :: Sum Int
```
を、

```hs:
foldr (mappend . Sum) `mempty` [1..10] :: Sum Int
```

と書いてかなりの時間ハマった。後者は明らかに間違えているが、正しく型付けされてしまう。理由は、```Monoid b => Monoid (a -> b)```のインスタンス。こいつのせいで、```a->a'->Sum Int```は```Monoid```のインスタンスとなり、後者の式の```mempty```はそういうモノイドに関数適用した結果となるので常に0を返すことになる。
sed一括置換術(Gitにも対応)


Linuxのターミナルで作業しているとき、あるディレクトリ以下のファイルすべてについて一括置換したいなぁって思うときありますよね。
そのときのTips。

## 普通のやつ

```bash
find . -type f -print0 | xargs -0 sed -i -e 's/foo/bar/g'
```

## Gitバージョン管理のリポジトリ

### Linuxのとき

find を使うと .git ディレクトリも巻き込んでリポジトリをぶっ壊すので `ls-files` を使います。

```bash
git ls-files -z | xargs -0 sed -i -e 's/foo/bar/g'
```

### Macのとき

`-i` オプションの後に空文字列をつけるのがポイント。じゃないとハマる。

- [【Mac】sedコマンドで上書き保存](http://blog.shonanshachu.com/2013/02/macsed.html)

```bash
git ls-files -z | xargs -0 sed -i '' -e 's/foo/bar/g'
```

また、 `sed: RE error: illegal byte sequence` エラーが出た時の対処は以下のようにします。

```bash
export LANG=C
```

- [regex - sed: RE error: illegal byte sequence on Mac OS X - Stack Overflow](http://stackoverflow.com/questions/19242275/sed-re-error-illegal-byte-sequence-on-mac-os-x)
KnockoutJSのcomputedにおける依存関係の仕組み for v.2.2.1


以下のように、computed（dependentObservable）の[evaluateImmediate](https://github.com/knockout/knockout/blob/v2.2.1/src/subscribables/dependentObservable.js#L40)は作られた際とそれを関数呼び出しした際に呼ばれる。

```
var x = ko.observable(1);
var y = ko.observable(2);

// 1回目
var sum = ko.computed(function(){
	return x() + y();
});

// 2回目
console.log(sum());
```

evaluateImmediateが呼ばれると、内部で[ko.dependencyDetection.begin](https://github.com/knockout/knockout/blob/v2.2.1/src/subscribables/dependencyDetection.js#L6)が[呼ばれる](https://github.com/knockout/knockout/blob/v2.2.1/src/subscribables/dependentObservable.js#L63)。
beginが呼ばれた後に、ko.computedでdependentObservableを作った際に渡した関数（上記の例だとxとyを足している関数）を[呼び出す](https://github.com/knockout/knockout/blob/v2.2.1/src/subscribables/dependentObservable.js#L71)。
この関数内(readFunction)で、依存しているobservableが呼び出される。上記の例では、x()とy()が実行されている。
observableの[値の読み出し](https://github.com/knockout/knockout/blob/v2.2.1/src/subscribables/observable.js#L21)が行なわれると、[ko.dependencyDetection.registerDependency](https://github.com/knockout/knockout/blob/v2.2.1/src/subscribables/dependencyDetection.js#L14)が呼び出される。
ko.dependencyDetection.registerDependencyでは、最後にbeginして、endが呼び出されていない依存関係のチェーンに対して、呼び出されたobservableを[追加している](https://github.com/knockout/knockout/blob/v2.2.1/src/subscribables/dependencyDetection.js#L21)。
上記の例では、xとyがsumで作られた依存チェーンに登録される。
evaluateImmediate内でendが[呼び出される](https://github.com/knockout/knockout/blob/v2.2.1/src/subscribables/dependentObservable.js#L84)と依存チェーンの登録対象から外れる。

このように、computedが依存している、obsearvableを検知して依存関係を構築している。
ルートラボのコースをWordPressの記事に埋め込む


下記コードをfunction.phpに追加。あとはルートラボのコースのURLを記事にはりつけるだけ。



```php
wp_embed_register_handler( 'latlonglab', '#http://latlonglab\.yahoo\.co\.jp/route/watch\?id=([0-9a-z]+)#i', 'wp_embed_handler_latlonglab' );

function wp_embed_handler_latlonglab( $matches, $attr, $url, $rawattr ) {

    $width  = get_option('embed_size_w');
    if(intval($width) === 0 ){
        $width = $GLOBALS['content_width'];
        $height = intval($width * 0.75);
    }else{
        $height = get_option('embed_size_h');
    }

    $embed = sprintf(
            '<script type="text/javascript" encoding="UTF-8" src="http://latlonglab.yahoo.co.jp/route/paste?id=%s&width=%d&height=%d&mapstyle=map&graph=true&maponly=false"></script>',
            esc_attr($matches[1]),
            $width,
            $height
            );

    return apply_filters( 'embed_latlonglab', $embed, $matches, $attr, $url, $rawattr );
}
```

# 完了
- プラグイン化　→ https://github.com/RyujiAMANO/WordPress_Plugin_LatLongLab_route

# TODO

- ショートコードでwidth, height オプション使えるようにする
- 他の表示オプション使いたい人いるのかな？いたらショートコードで使えるようにする？
Git で 削除したファイルのコンフリクト解消方法 



# 以下のようなエラーが出る

CONFLICT(modify/delete)

Automatic merge failed; fix conflicts and then commit the result.


# 選択肢は2つ

1. ファイルを削除
2. ファイルを追加する


# 1. ファイルを削除

```
git rm res/layout/dialog_item.xml 
```

# 2. ファイルを追加する

HEADのファイル変更を受け入れる

```
git add res/layout/dialog_item.xml
```

で、 git commit する


# 参考

[git - How do I fix a merge conflict due to removal of a file in a branch? - Stack Overflow](http://stackoverflow.com/questions/1380670/how-do-i-fix-a-merge-conflict-due-to-removal-of-a-file-in-a-branch)
すぐ分かる! git の origin と master ってなんだ?



## 前提知識

Gitは、分散レポジトリ
だから
「どのレポジトリ」の「どのブランチ」かを指定しないとわからないよ!

## origin と master

- origin: レポジトリの場所(URL)の別名
- master: ブランチの名前

つまり、"git pull origin master" は、originという名前のレポジトリのマスターブランチから、git pull しろと命令している。

## デフォルト

origin と master はデフォルトだよ。
つまり、 "git pull" = "git pull origin master"

## 別名はどこを指してるんだよ?

```
% git config --list
```

以下みたいにどこを指しているかわかる!

```
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.url=https://github.com/ユーザ名/レポジトリ名.git
```

## 俺だって別名つけてーよ

GitHub のレポジトリに名前つけちゃおう。

> git remote add 別名 https://github.com/ユーザ名/レポジトリ.git

例

> git remote add upstream https://github.com/user/repositry.git

あちこちのレポジトリを追加して、あちこちに push すればいいさ。

## 別のレポジトリに push しちゃうぜ


GitHub から持ってきたソースを Bitbucket にpush しちゃおう。

Bitbucketのサイトでレポジトリを新規作成してから

```
git remote add bitbucket https://ユーザ名@bitbucket.org/ユーザ名/レポジトリ名.git
```

で、 git config --list


>remote.bitbucket.url=https://ユーザ名@bitbucket.org/ユーザ名/レポジトリ名.git
>remote.bitbucket.fetch=+refs/heads/*:refs/remotes/gitbreak/*


push する
git push はデフォルトでは、同じブランチ名がリモート上にある場合、全部のブランチを push しちゃう?

```
git push -b bitbucket master
```
UITableViewCellをInterface Builder + Auto Layoutで作るとConstraintがおかしくなる

UITableViewを編集状態にする。

## Auto Layout無効

これは問題なし。

![スクリーンショット 2013-08-03 03.45.59.png](https://qiita-image-store.s3.amazonaws.com/0/3603/fd6a906d-6a90-5583-c7cc-5951b6a6f7c1.png)

## Auto Layout有効

現れる削除ボタンが（Content View ?）に重なってしまう。Constraint がうまく適用されていない模様。

![スクリーンショット 2013-08-03 04.04.08.png](https://qiita-image-store.s3.amazonaws.com/0/3603/426f83d6-49d1-2ad0-ef98-b6eb5da479b0.png)

## おそらく解決策

http://www.wannabegeek.com/?p=512
簡単、自動! MySQL を AutoMySQLBackup + cron でバックアップ 



# 自動バックアップツールの選択肢

- AutoMySQLBackup
- mysqlmybackup.sh

Percona MySQL だから、XtraBackup でインクリメントなバックアップとかしたいのだが、いいの見つからない…誰か教えて下さい。


# AutoMySQLBackup

automysqlbackup というシェルスクリプトをcronで使っていた

AutoMySQLBackup | Free software downloads at SourceForge.net
http://sourceforge.net/projects/automysqlbackup/

## AutoMySQLBackup の良いところ

機能が一杯あるよ

- 日、週、月ごと等で設定できる
- 何日で削除するか(ローテーション)の設定できる
- 除外するDBやテーブルを設定できる
- メールでお知らせもできる
- sslで暗号化できる
- バックアップ前、後にコマンドを実行できる
- マルチコア、マルチスレッド対応?
- dry-run の設定もある

## AutoMySQLBackup のインストール方法

### 簡単な方法

1. install.sh スクリプトを走らせる
2. /etc/automysqlbackup/myserver.conf というファイルを自分用設定にカスタマイズ

## AutoMySQLBackup を cron に設定する方法

以下のシェルスクリプトファイルを作って /etc/cron.daily とかに入れる

```bash
#!/bin/sh

/usr/local/bin/automysqlbackup /etc/automysqlbackup/myserver.conf

chown root.root /var/backup/db* -R
find /var/backup/db* -type f -exec chmod 400 {} \;
find /var/backup/db* -type d -exec chmod 700 {} \;
```

## デフォルト・ディレクトリ構成

```
% ls /var/backup/db/
daily  fullschema  latest  monthly  status  tmp  weekly
```

## バックアップで困っていること

もっと手軽で簡単なバックアップツールがあったら教えて下さい!

困っていること

- 別サーバに自動差分バックアップ
 例えば、別サーバやAWSやDropbox等に自動でバックアップの同期
 rsyncとか自分でコード書いて、設定するの面倒
- Percona MySQL流のバックアップがささっと設定できるツール



## 検索用語

- mysql, mysqldump, backup, cron, innodb, myisam
- バックアップ、差分バックアップ
prototype汚染しないようにObject.prototypeを拡張する


`Object.prototype.hoge = function(){…}`などとやってしまうと、`for in`に`hoge`が列挙されてしまう。
昔はこれを回避する方法がなかったので禁忌とされていたが、もはや`Object.defineProperty`が普通に使える今、<del>拡張してはいけない理由はないはず。</del>
ありました。[alucky0707さんの記事](http://qiita.com/alucky0707/items/79b7f625cfd95ee3755d)に詳しいですが、`Object.prototype`を拡張してしまうとグローバル変数を定義するのと同義ですので、やるなら明確な意思をもって、自己責任でお願いします。
よって下記のコードは好ましくないです。
(ただ、Object以外のprototypeを拡張する場合はこの限りではないので、下記のパターンを用いてObject以外のprototypeにメソッドを生やすこと自体は問題ないはず)


```js
Object.defineProperty(Object.prototype, 'merge', {
	value: function(o){
		for(var key in o){
			this[key] = o[key];
		}
		return this;
	},
	writable: true,
	configurable: true,
	enumerable: false
});
```

`defineProperty`でプロパティにメソッドを生やしたい場合、`value`を使うとうまくいった。
`merge`が`for in`で列挙されないので、ちゃんと動く。

```js
({hoge: 1}).merge({fuga: 2}) //=> {hoge: 1, fuga: 2}
```
AngularJS on-load-element

jQueryのプラグイン使うときに、モデルの値が読み込まれてからjQueryプラグイン適用したい場合があったので、directiveでやってみることに。

[sampleはこちら](http://embed.plnkr.co/gpCtw6/preview)


```coffeescript:angular-at-on-load-element
###*
 * angular at-on-load-element
 *
 * @author atomita
 * @license MIT
 * @version 0.0.1
###
angular.module("at-on-load-element", []).directive("atOnLoadElement", ["$timeout", ($timeout)->
  {
    restrict: "AC"
    scope: true
    link: (scope, iElement, iAttrs)->
      apply = iAttrs.atOnLoadElement
      if apply
        scope.element = iElement
        scope.attrs = iAttrs
        scope.angular = angular
        $timeout -> scope.$apply(apply)
      return
  }
]).directive("atOnLoadElementFromFirst", ["$timeout", ($timeout)->
  {
    restrict: "AC"
    scope: true
    link: (scope, iElement, iAttrs)->
      apply = iAttrs.atOnLoadElementFromFirst
      $parent = scope
      loop
        $parent = $parent.$parent
        if $parent
          if "$first" of $parent
            $first = $parent.$first
            break
        else
          break
        
      if apply and $first
        scope.element = iElement
        scope.attrs = iAttrs
        scope.angular = angular
        $timeout -> scope.$apply(apply)
      return
  }
]).directive("atOnLoadElementFromMiddle", ["$timeout", ($timeout)->
  {
    restrict: "AC"
    scope: true
    link: (scope, iElement, iAttrs)->
      apply = iAttrs.atOnLoadElementFromMiddle
      $parent = scope
      loop
        $parent = $parent.$parent
        if $parent
          if "$middle" of $parent
            $middle = $parent.$middle
            break
        else
          break
        
      if apply and $middle
        scope.element = iElement
        scope.attrs = iAttrs
        scope.angular = angular
        $timeout -> scope.$apply(apply)
      return
  }
]).directive("atOnLoadElementFromLast", ["$timeout", ($timeout)->
  {
    restrict: "AC"
    scope: true
    link: (scope, iElement, iAttrs)->
      apply = iAttrs.atOnLoadElementFromLast
      $parent = scope
      loop
        $parent = $parent.$parent
        if $parent
          if "$last" of $parent
            $last = $parent.$last
            break
        else
          break
        
      if apply and $last
        scope.element = iElement
        scope.attrs = iAttrs
        scope.angular = angular
        $timeout -> scope.$apply(apply)
      return
  }
])
```
開発環境を作るための準備

Ubuntuなどをインストール直後の新しい環境で、色々やろうとした場合、あれがないこれないと言われることがよくあります。
入れておけば間違いのないものたち。rpm系はあとで調べる

apt系

```bash:
$ sudo apt-get install build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev libssl-dev 
```
「第7回オフラインリアルタイムどう書くの問題」をPHPで解く

http://qiita.com/Nabetani/items/4364285801d1c9f370a1
http://nabetani.sakura.ne.jp/hena/ord7selectchair/

トイレとかでよく見る光景です。

```php:
<?php
	class CHAIR{
	
		/**
		* 椅子に座る
		* @param  String 「6:NABEbBZn」みたいな文字列
		* @return String 「-ZAB-E」みたいな文字列
		*/
		public function get($input){
			// 入力値を分解
			list($num, $input) = explode(':', $input, 2);
			// 椅子のリスト 前後に門番
			$chairs = str_repeat('-', $num+2);
			
			// 検索用
			$loneliness = '---';
			$teteatete = '--';
			$lotlotlot = '-';
			
			// 順番に繰り返し
			for($i=0; $i<strlen($input); $i++){
			
				// 大文字であれば追加
				if(ctype_upper($input[$i])){
					
					// 両隣が空いてる
					if(($pos = strpos($chairs, $loneliness)) !== false){
						$chairs[$pos+1] = $input[$i];
						continue;
					}
					// 左端が空いてる
					if(substr($chairs, 0, 2) === $teteatete){
						$chairs[1] = $input[$i];
						continue;
					}
					// 右が空いてる (右端含む)
					if(($pos = strpos($chairs, $teteatete, 1)) !== false){
						$chairs[$pos] = $input[$i];
						continue;
					}
					// 両隣に人がいる
					$chairs[strpos($chairs, $lotlotlot, 1)] = $input[$i];
					continue;
				
				// 小文字であれば削除
				}else{
					$chairs = str_replace(strtoupper($input[$i]), '-', $chairs);
					continue;
				}
			}
			
			// 前後の門番を削除して返す
			return substr($chairs, 1, -1);
		}
		
	}
	
	// テスト
	$test = [
		['6:NABEbBZn', '-ZAB-E'],
		/* 省略 */
	];

	$chair = new CHAIR();
	foreach($test as $key=>$data){
		$answer = $chair->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
```

右端は要らないのに左端は特殊な処理が必要というあたりが微妙な感じです。

かかった時間は1時間弱。
左端と右端の門番を別の文字にしてわかりやすくしようとしたらifが増えてわかりにくくなった。