OmniAICreator/Qiita-1.07M huggingface dataset:
AIR for Androidでのテキストフィールドは何を指定しても中華フォントになるので、埋め込みフォントを使おう



## 結論: AIR for Androidでは中華フォントになるのでフォントを埋め込もう！

- Androidにはモトヤフォントが入っているのに、中華フォントが表示されます

以下の指定をしても、中華フォントです

- _ゴシック
- _sans
- _等幅 
- MotoyaLMaru

なので **埋め込むのが正解です**

## 試したバージョンは AIR3.6

です。


## こんなフォントになります。

![chuuka.png](https://qiita-image-store.s3.amazonaws.com/0/2631/192500f9-e9ea-50b1-c1cd-b9171a9b1b91.png)

約のてんてんが違う

- WebView、StageTextはモトヤフォントで、
- AIR側のテキストフィールドは中華フォントと、

違う見た目になるので、すごく気持ちが悪い。


## ためした端末とFont.enumerateFontsで取得したフォントリスト

- Xperia AX (Android 4)
- Xperia Acro  (Android 2.3)
-  GALAXY NEXUS (Android 4)

いずれも`MotoyaLMaru` がインストールされている。

### Xperia AX (Android 4)

- AndroidClock-Large
- Arabic
- Clockopia
- Droid Sans Armenian
- Droid Sans Ethiopic
- Droid Sans Fallback
- Droid Sans Georgian
- Droid Sans Hebrew
- Droid Sans Mono
- Droid Sans Thai
- Droid Serif
- Lohit Bengali
- Lohit Devanagari
- Lohit Tamil
- MotoyaLMaru
- Roboto
- SoMA
- SoMA-Digit
- SoMC Sans Regular
- SoMC-HKSCS-Fallback


### Xperia Acro  (Android 2.3)

- Arabic
- Bengali OTS
- Clockopia
- Devanagari OTS
- Droid Sans
- Droid Sans Fallback
- Droid Sans Mono
- Droid Sans SEMC
- Droid Sans Thai
- Droid Serif
- Hebrew OTS
- MotoyaLMaru

### GALAXY NEXUS (Android 4)

- Android Emoji
- AndroidClock
- AndroidClock-Large
- AnjaliNewLipi
- Clockopia
- Droid Arabic Naskh
- Droid Naskh Shift Alt
- Droid Sans Armenian
- Droid Sans Devanagari
- Droid Sans Ethiopic
- Droid Sans Fallback
- Droid Sans Georgian
- Droid Sans Hebrew
- Droid Sans Mono
- Droid Sans Tamil
- Droid Sans Thai
- Droid Serif
- Lohit Bengali
- Lohit Kannada
- Lohit Telugu
- MotoyaLMaru


## こんなコードを書いてました

``` AndroidTF.as

textFormat.font = MOTOYA_FONT_NAME;
textFormat.bold = false;

textField.defaultTextFormat = textFormat;
textField.setTextFormat(textFormat);

# ＿人人人人人人人人人人人人＿
# ＞　中華フォントのまま！　＜
# ￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣
```




## ここにも使えない報告が！



[Android端末で日本語字崩れ　フォントを指定したい](http://www.fxug.net/modules/xhnewbb/viewtopic.php?topic_id=4918)

 > 使用可能なフォントを全て試しましたが、見え方は変わりませんでした。
> 
> 埋め込みフォントでもしない限りは回避不能な
> Androidの仕様なのでしょうか。

ここのトピックではAndroid4から使えるよ、と書いてますが、無理でした！


## まとめ

埋め込もう！
電波状況が悪い時にiPadにファイルを転送する

大したTIPSではないが自分のためのメモ。

iPadって、他の端末にあるデータを転送しようとすると色々と不便ですよね。選択肢としてはDropbox一択かと思ってますし普段はそうしています。
いつもはWimax+3GのポータブルWifiを利用しているのですが、いま出張中で電波状況が悪いところに来ています。その状態で、PCからiPadにファイル（それなりにサイズが大きいpdf）を転送したいのですがさてどうしましょう。

普段使っているDropboxは通信の問題で使えないです。WAN側の通信は不安定なのですが、もちろんLAN側は使えるのでそれを使えばいいですよね。でもSambaやscpはiPadから使えない（もしかしたらそういうアプリがあるかもしれないけど入れていない）ので、iPadの通信アプリはブラウザに限定しましょう。

そうすると、pythonの標準モジュールSimpleHTTPServer使うのが一番便利でした。もちろんpythonは入っていることは前提として。転送したいファイルのあるディレクトリに以下のコマンドを入れます。

```shell-session:
 > python -m SimpleHTTPServer
```

あとはPCのIPアドレスを調べてiPad側で「IPアドレス:8000」とすればファイル一覧が表示されます。

WEBrick使ってもいいかなと重たけど、多分こっちのほうが楽です。
画像のsepiaエフェクトを作る


画像のsepiaエフェクトを作るために、R,G,Bを微妙に混ざったら簡単にできる

```ruby:sepia.rb
finalRed= (R * 0.393) + (G * 0.769) + (B * 0.189)
finalGreen = (R * 0.349) + (G * 0.686) + (B * 0.168)
finalBlue= (R * 0.272) + (G * 0.534) + (B * 0.131)
```
gitプロトコルが使えない環境での、たった一つの重要な設定

開発環境によっては、セキュリティー()を高めるために、利用可能なプロトコルがしぼられている場合があります。例えば、http/httpsは使えるけどgitプロトコルは使えないといった状況です。  

ただし、イマドキのライブラリ管理系のツールを使うと、gitプロトコルを使ってgithubからcloneしたがるものが多く、当然ながらエラーになって困ります。

そんなとき、gitプロトコルでリクエストをする場合に、自動的にhttpsとして実行するように変更すると幸せになれます。

```
git config --global url."https://".insteadOf git://
```

JavaScriptのbowerやVimのNeoBundleとかで動作確認済みです。
お試しあれ。


参考
(http://stackoverflow.com/questions/4891527/git-protocol-blocked-by-company-how-can-i-get-around-that/10729634#10729634)
capistranoとprecompileされていないjs

※ やんごとなき理由により、現在precompile済みのjsとprecompileされたjsが`/public/assets/`以下で共存しています。

capistranoでデプロイすると、もともとpublic/assets内にあったjsが無くなってしまうので以下のようにして対応しました。

```rb/deploy.rb
set :deploy_via, :remote_cache
...
namespace :customs do
  task :symlink, :roles => :app do
    # public/assets直下のディレクトリをリンクする
    ['images', 'javascripts', 'stylesheets'].each{ |dir|
      run "ln -nfs #{shared_path}/cached-copy/public/assets/#{dir} #{current_path}/public/assets/#{dir}"
    }
  end
end
after "deploy:symlink", "customs:symlink"
```
CarrierWaveで画像更新時に以前のバージョンを削除しない

自前で画像の再アップロード時にfilenameを更新するようにしていたので、以前のバージョンも保持しておきたかった

```rb:config/initializers/carrierwave.rb
CarrierWave.configure do |config|
  ...
  # 画像更新時に以前のバージョンを削除しない
  config.remove_previously_stored_files_after_update = false 
end
```
LXC (Linux Container) を使い超軽量作業環境を手に入れよう

[Vagrantをvirtualboxからlxcに切り替えて超軽量仮想環境を手に入れよう](http://qiita.com/tukiyo@github/items/16847c348f928fbf1654)もどうぞ。

[arch wiki](https://wiki.archlinux.org/index.php/Linux_Containers)見るとわかりやすいかと。
ubuntuにlxcを入れてubuntuとcentosを動かしてみた。とにかく動作が早い。

lxc とは
====

* chroot環境に、(virtualboxみたいに)IPが個別に割り振られたような仮想環境。
* オーバーヘッドがどの仮想環境よりも少ない。
* スナップショット機能、ライブマイグレーション機能がない（終了させてからフルバックアップは可能）
* dockerはx86_64のみ対応だが、lxcはi386にも対応。

手順
====

## 1.lxc のインストール

```bash:
$ sudo apt-get install lxc
```

## 2.ubuntu のインストール

```bash:
$ sudo MIRROR=http://jp.archive.ubuntu.com/ubuntu lxc-create -t ubuntu -n ubuntu0
# -r でリリースバージョンを指定できる。詳細は /usr/share/lxc/templates/lxc-ubuntu 内を参照
$ sudo lxc-create -n gitlab -t ubuntu -- -r precise
```

## 3.centosを入れる

lxcのtemplatesにcentosが含まれていないため、[hagix9](https://gist.github.com/hagix9/3514296)さんが作ってくれたtemplateを使用する。

* id:pass=root:password

```bash:
$ sudo apt-get install -y curl yum
$ sudo wget -O /usr/share/lxc/templates/lxc-centos \ 
 https://gist.github.com/hagix9/3514296/raw/7f6bb4e291fad1dad59a49a5c02f78642bb99a45/lxc-centos
$ sudo chmod 755 /usr/share/lxc/templates/lxc-centos
$ sudo MIRROR=http://ftp.jaist.ac.jp/pub/Linux/CentOS/6.4/os/x86_64/ lxc-create -t centos -n centos0
```

## コンテナの一覧

```bash:
$ sudo lxc-list
※sudoしないとRUNNINGのものが表示されません。
```

## 使い方

```bash:
起動
$ sudo lxc-start -n ubuntu0

終了
$ sudo lxc-stop -n ubuntu0

コンソールに接続
$ sudo lxc-console -n ubuntu0

再起動
$ sudo lxc-shutdown -n ubuntu0 -r

停止
$ sudo lxc-shutdown -n ubuntu0

強制終了
$ sudo lxc-stop -n ubuntu0

削除
$ sudo lxc-destroy -n ubuntu0

バックアップ
$ sudo lxc-backup ubuntu0 1
※ "/var/lib/lxc/ubuntu0/rootfs.backup1" にバックアップされる。

バックアップからのリストア
$ sudo lxc-restore ubuntu0 1

 ホスト起動・停止時にコンテナを自動起動・停止する設定
$ sudo ln -s /var/lib/lxc/ubuntu0/config /etc/lxc/auto/ubuntu0.conf
```

## コンテナの場所

* /var/lib/lxc/<コンテナ名>/

## コンテナのIPアドレス設定

* /var/lib/lxc/<コンテナ名>/config

```bash:
lxc.network.ipv4 = 10.0.3.2
lxc.network.ipv4.gateway = 10.0.3.1
```

## コンテナのclone(自動)

```bash:
$ sudo lxc-clone -o ubuntu0 -n ubuntu1
```

## コンテナのclone(手動)

```bash:
$ sudo cp -a /var/lib/lxc/ubuntu{0,1}/
$ sudo vim /var/lib/lxc/ubuntu1/
lxc.network.hwaddr = 00:16:3e:d0:5c:d0 ←これを重複しないものに書き換える
lxc.utsname = ubuntu0 ←ubuntu1に書き換え
lxc.rootfs = /var/lib/lxc/ubuntu0/rootfs   ←ubuntu1に書き換え
lxc.mount  = /var/lib/lxc/ubuntu0/fstab  ←ubuntu1に書き換え
```
.gitattributesで特定ファイルの文字コードを指定する

基本的にはUTF-8で統一しているけれど、たまにcp932なcsvファイルがあったりする場合、そのcsvファイルのあるディレクトリに.gitattributesファイルを作成して、中に

    *.csv encoding=cp932

とか書いておく。WindowsのGit Guiで見ても差分が文字化けしないので、ちょっと幸せ。
Windowsでのサービス監視


Windows（サーバなどは特に）でも、サービスの起動状態を監視したいことが結構ある。
日に1回とか数回の実行でよく、監視を行うバッチファイルをタスクで実行し、サービスが起動していなければメールを送信するというレベルであれば、大がかりな監視システムやエージェントを入れ無くても、特に投資も無く出来る。


## サービスのキー名称を調べる
`sc query`コマンドを実行すると、起動中のサービスについての情報を得られる。
ただし、**管理ツール**の**サービス**にて表示されるのは**表示名称**であって、`sc query`の表示のものとは異なる。
`sc`コマンドにおいては、**キー名称**が必要となる。
**表示名称**から**キー名称**を調べるには以下のコマンドでを実行する。

`sc getkeyname **表示名称**`

```例）DHCPクライアントのキー名称を調べる
sc getkeyname "DHCP Client"
名前 = Dhcp
```

## 監視バッチファイル
`sc query`の実行結果から対象のサービスのキー名称を検索し、無ければ起動していない、有れば起動しているという判断となる。
検索条件（**findstr**のところ）は他のサービスのキー名称との兼ね合いで、考慮する。
（Dhcpの他にDhcphogeとかいうサービスが起動していると間違った判断になるので）

```chkservice.bat
@ECHO OFF
set dt=""
FOR /F "USEBACKQ" %%i IN (`sc query ^| findstr /i "Dhcp"`) DO @SET DT=%%i
IF %DT%=="" GOTO error
GOTO end
:error
cscript c:¥sysadm¥errmail.vbs
:end
```

## 通知メール送信スクリプト
上のerrorラベルのところで指定したエラー通知メールの送信処理をWSHで動かす。
オブジェクトのパラメータについては以下を参照。
[＠IT：Windows TIPS -- Tips：Windows標準機能とWSHを使ってメールを送信する](http://www.atmarkit.co.jp/fwin2k/win2ktips/428wshmail/wshmail.html)


```errmail.vbs
Set MsgObj = CreateObject("CDO.Message")
MsgObj.From = "alert@example.com"
MsgObj.To = "operator1@example.com,operator2@example.com"
MsgObj.Subject = "DHCP Service error Happend."
MsgObj.TextBody = "DHCP service Stopped." & vbCrLf & Now
MsgObj.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
MsgObj.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "192.168.0.100"
MsgObj.Configuration.Fields.Item ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
MsgObj.Configuration.Fields.Update
MsgObj.Send
```

## タスクを組む
監視バッチファイルをタスクで起動する。
周期やタイミングは状況に合わせて。
**※念のため、運用に影響が出ない範囲で、実際にサービスを停止してメールが配信されるか、環境も含めてチェックした方が良いと思われます。**
Homebrew で「error: The following untracked working tree files would be overwritten by merge: Library/Formula/libarchive.rb」というエラーが発生した場合の対応


Homebrew の update 時にエラーが発生。

```bash
$ brew update

error: The following untracked working tree files would be overwritten by merge:
    Library/Formula/libarchive.rb
Please move or remove them before you can merge.
Aborting
Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master
```

この問題が発生した場合は、以下の手順をお試しください。

```bash
$ cd /usr/local/Library/Formula
$ git reset --hard FETCH_HEAD
HEAD is now at c784e68 clutter: better homepage
```

その後、update を実行。

```bash
$ brew update

Removing libarchive.rb
Updated Homebrew from c784e68f to c784e68f.
==> Updated Formulae
homebrew/dupes/ab        homebrew/dupes/fetchmail   homebrew/dupes/whois
homebrew/dupes/ant        homebrew/dupes/lapack
homebrew/dupes/diffstat        homebrew/dupes/openssh
==> Deleted Formulae
homebrew/dupes/libarchive
```

無事に update できました。

### 参考URL
* [brew updateで、Library/Formula/libarchive.rb がなんちゃらかんちゃらってエラー。 | firegoby](http://firegoby.jp/archives/4429)
* [brew update fails to handle formulae moved from taps to core · Issue #19799 · mxcl/homebrew](https://github.com/mxcl/homebrew/issues/19799)
How to strip tags in Javascript?

The 'strip_tags' method is from php, but how to do it in javascript?

There's two solution, choose one of these according to your requirement.

Solution 1
---

If you simply needs to output plain text.

You can use regular expression to strip **all tags** from string like the code below.

```js:
var stripped = original.replace(/(<([^>]+)>)/ig,"")
```

Solution 2
---

If you have to output some simple font tags like '&lt;p>&lt;i>&lt;b>'.

Using the [strip_tags function of php.js](http://phpjs.org/functions/strip_tags/) which is a website for porting language from php to js.

After you include the library from php.js, you can write some sample like these.

```js:
//strip_tags(inputString, allowTags)
strip_tags("<script>alert('test')</script><p>Hello, world.</p>", "<p>")
```

result will output:

```html:
alert('test')<p>Hello, world.</p>
```

Hope these help. :)
BitBucketのhgリポジトリを、githubのgitリポジトリに移行する

Mercurial + bitbucket でホストしている趣味のプロジェクトがいくつかあるのですが、全部 github でやれば良いよねってことで、コンバートできるかぐぐってみました。

Convert Mercurial project to Git - Stack Overflow http://stackoverflow.com/questions/16037787/convert-mercurial-project-to-git

> Q. mercurial のプロジェクトを git に移行したい。コミット履歴もそっくりそのまま移行したい。
> hg 関連のファイルを消して、 git init して、git add したけどコレじゃ履歴が引き継がれない。
> 解決策ない？
>
> A. fast-export 使え

# hg インストール

作業は、hgの入っていないLinuxマシンにて行う。(fedora-19)

python がなければ必要かも。

```
sudo yum install hg
```

# リポジトリをとってくる


```
hg clone ssh@hg@bitbucket.org/USERNAME/PROJECT hg_repo
```

# fast-export をとってくる

```
git clone git://repo.or.cz/fast-export.git
```

# 新しいリポジトリを作り、インポート

ローカルは

```
git init git_repo
cd git_repo
/path/to/fast-export/hg-fast-export.sh -r /path/to/hg_repo
git checkout HEAD
```

# リモートにリポジトリを作る

リモートは github から create repository して

```
git remote add origin git@github.com:USERNAME/git_repo.git
git fetch
git merge origin/master
git status # if you feel uneasy
git push origin master
```

ぼくにもできた
テーブル名からカラム情報を取得

`users` というテーブルに定義されているカラム情報を取得する方法のメモ。

使うAPI: [Ruby on Rails API columns()](http://api.rubyonrails.org/classes/ActiveRecord/ModelSchema/ClassMethods.html#method-i-columns "columns()")

テーブル名からモデルクラスを参照し、それに`.columns`メソッドを使うと取得できる。

```ruby:get_columns.rb
# テーブル名から、定義されているすべてのカラム定義を取得
Module.const_get('users'.classify).columns

# 特定のカラムの情報を取得(例えば `id`)
Module.const_get('users'.classify).columns['id']

# 特定のカラムから定義の一部を取得
col = Module.const_get('users'.classify).columns['id']
col.type # データ型を取得
```

カラムの定義の取得はこんなメソッドが用意されているっぽい。
コレで全てかわからんとです… (´・ω・｀)

* `.name` : カラム名
* `.sql_type` : SQLでのデータ型
* `.type` : データ型
* `.null` : NOT NULL制約
* `.limit` : カラム数制限(?)
* `.precision` : 数値桁数
* `.scale` : 小数点以下桁数
* `.default` : デフォルト値
* `.primary` : Primary制約
* `.coder`: エンコード

* * *
コメント欄で教えていただきました。
columnsメソッドの詳細はこちらに書いてありました。
[Class: ActiveRecord::ConnectionAdapters::Column](http://www.rubydoc.info/docs/rails/ActiveRecord/ConnectionAdapters/Column#coder-instance_method)

`.coder` の結果、今のところ`nil`がかえってくるところしか見たことがない。
もう少し検証してみなければ。
railsでi18nのyamlファイルを書くときはダブルクォーテーション必要ない

## ポイント2点
- ダブルクォーテーションは必要ない
- 複数行書くときは`|-`を使うといい

```yaml:ja.yml
  title: Qiita [キータ]
  description_html: |-
    Qiita[キータ] は、プログラマの技術情報共有サービスです。<br />
    詳細はhttp://qiita.comを御覧ください。
```

ただし先頭が変数になっている場合は引用符が必要

```yaml:ja.yml
  hello: '%{user}さん、こんにちは'
```
MXML で Hello World.


```xml:hello.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark">
  <fx:Script>
    <![CDATA[
      import mx.controls.Alert;

      private function sayHello():void {
        Alert.show("Hello MXML world.");
      }
    ]]>
  </fx:Script>
  <s:Button label="hello" click="sayHello()"/>
</s:Application>
```

以下のようにコンパイル

```
$ mxmlc hello.mxml
```

コンパイル成功すると hello.swf が生成される。ので直接開くかブラウザへドラッグ&ドロップで開く。

##  click イベントの処理をインラインで書いてみる

```xml:hello2.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark">
  <s:Button label="hello">
    <s:click>
      <![CDATA[
        import mx.controls.Alert;
        Alert.show("Hello MXML world.");
      ]]>
    </s:click>
  </s:Button>
</s:Application>
```
自分のアプリにURLSchemeをつける場合（リンクのみ）

こちらと、こちらから辿れるリンクがわかりやすかったです。多謝。
http://tech-gym.com/2012/02/ios/709.html

以前はInfo.plistを編集するものだったのですが、変わった様子ですね。
plv8をOSXでビルド出来た Postgres.app編

# 2017年10月　追記

以下の記事はplv8がv1.xの頃の話です。
最新の2.x系は、Unix系の環境であれば、

```shell-session
make static
```

一発でV8も内部的にDLしてビルドしてplv8に静的リンクしてくれます。


# v8の古いバージョンを使う
これがポイントだった。

実は、Ubuntuでは最新のv8をビルドして、すんなり[plv8]()がビルド出来たように
見えたのですが、どうもすでにインストール済みのv8のヘッダとライブラリを
使ってビルドされていたという罠があり、OSXでのビルドにハマっていた
時期があったのですが、Twitterで@umitanukiさんにアドバイスいただき、
v8の古いバージョンを使うことを知ることが出来た。
@umitanukiさんありがとうございました。

## git cloneするだけで実は古いバージョンのソースも入手できてた件
githubにアカウントあるだけでgitコマンドは未だによくわからないので、
今回v8の古い版をどうやって入手するのかも初めは分かりませんでした。

```bash:
git clone git://github.com/v8/v8.git v8 && cd v8
git checkout 3.17.1
```
3.17.1に特に意味はありません。もう少し新しくでも良いかもです。

## native.checkだと動かない
手元のHomeBrewベースの環境だと、run-test.pyで

```bash:
Unknown mode 
Usage: run-tests.py [options]
```
となぜかエラーになるので、
v8のビルドは以下のようにした。

```bash:
make native library=shared console=readline strictaliasing=off
```

## plv8本体のビルド
### アイコンが好みなので、[Postgres.app](http://postgresapp.com/)を愛用中ｗ

OSXにはPostgresqlが/usr配下に入っているので、Postgres.appへの
パスを優先させておく


```bash:
export PATH=/Applications/Postgres.app/Contents/MacOS/bin:$PATH
```

## ビルドしたv8のパスを環境変数に設定

```bash:
export V8_OUTDIR=../v8/out/native/
export V8_SRCDIR=../v8/
```

## あとは
make以降[手順](http://code.google.com/p/plv8js/wiki/PLV8)の通り

#　関連記事

- [npm install pgだけでは済まない件](http://abrakatabura.hatenablog.com/entry/2013/01/08/071749)
- [OSXで最速でOCamlでPostgresqlに接続するには](http://abrakatabura.hatenablog.com/entry/2013/06/27/064038)
- [mrubyでPostgres.appを使って、LOBも扱ってみた](http://abrakatabura.hatenablog.com/entry/2016/06/14/222417)
- [まさかPostgreSQLを触って、IPv6の知識が増えるとは](http://abrakatabura.hatenablog.com/entry/2016/06/17/065528)
- [WindowsでPostgreSQLをソースからビルドした](http://abrakatabura.hatenablog.com/entry/2017/05/18/071705)
- [Winodws(MSVC)でplv8をビルドするまで](http://abrakatabura.hatenablog.com/entry/2017/10/15/095503)
- [How to build plv8 2.3.0 for Raspberry Pi 3](https://dev.to/kjunichi/how-to-build-plv8-230-for-raspberry-pi3-2n09)
文字列リテラルで正規表現を書くときのバックスラッシュ

たまに文字列リテラルでの正規表現の書き方を間違っている人を見かけます。

## PHP の場合

バックスラッシュ 2 個 `\\\\` にマッチする正規表現は `\\\\\\\\` ですが、リテラル中だとさらにエスケープしなければならないので `\\\\\\\\\\\\\\\\` のように 8 個バックスラッシュが必要です。

```php
<?php
var_dump(!!preg_match('/^\\\\$/',     '\\\\')); // bool(false)
var_dump(!!preg_match('/^\\\\\\\\$/', '\\\\')); // bool(true)
```

ただ PHP の場合 `\` の後ろがエスケープシーケンスと解釈されなければ `\` のままとなるため `.` にマッチする正規表現を文字列リテラルで `\.` と書いても大丈夫です。

```php
<?php
var_dump(!!preg_match('/^\.$/',  '.')); // bool(true)
var_dump(!!preg_match('/^\.$/',  'x')); // bool(false)
var_dump(!!preg_match('/^\\.$/', '.')); // bool(true)
var_dump(!!preg_match('/^\\.$/', 'x')); // bool(false)
```

## JavaScript の場合

JavaScript でも文字列リテラルで正規表現を書く場合は同じように `\` を 2 重にエスケープする必要があります。

```javascript
console.log(new RegExp('^\\\\$'    ).test('\\\\')); // false
console.log(new RegExp('^\\\\\\\\$').test('\\\\')); // true
```

しかも JavaScript の場合 `\` の後ろがエスケープシーケンスと解釈されないと `\` が消えてしまうので、`.` にマッチする正規表現は `\\\\.` とする必要があります。

```javascript
console.log(new RegExp('^\.$' ).test('.')); // true
console.log(new RegExp('^\.$' ).test('x')); // true
console.log(new RegExp('^\\.$').test('.')); // true
console.log(new RegExp('^\\.$').test('x')); // false
```

もっとも JavaScript なら正規表現リテラルがあるので、あえて正規表現を文字列リテラルで書く必要はありません。

```javascript
console.log(/^\.$/.test('.')); // true
console.log(/^\.$/.test('x')); // false
```

PHP にも正規表現リテラルが欲しいですね・・・ http://d.hatena.ne.jp/anatoo/20130304/1362325689

---

ところで Qiita だとバッククオートの中でも `\` がエスケープされるのだけどそういうものなの？
[個人用Memo]cv-qualifierがエラーに表示された場合の対処

c++を使用中に以下のエラーが発生。
static member function cannot have cv-qualifier

対処方法
　staticメンバー関数のconstを取る。

例
class Hoge {
public:
  static int hoge() const;    // このconstを取り去る。
};
引数の変数名の衝突を気にせずに extract する

PHP をテンプレートのように使いたいとき、`extract` で連想配列をシンボルテーブルにインポートすることがありますが・・・

```php
<?php
function render1($filename, array $params)
{
    extract($params);
    include $filename;
}
```

このようにすると `$params` に `"filename"` というキーが含まれていると `$filename` が上書きされてしまい非常にマズイことになります。

```php
<?php
render1("template.php", ["filename" => "ore_no_himitu.txt"]);
```

なので次のように `extract` で `EXTR_SKIP` を指定して名前が衝突したときは無視されるようにしていました。

```php
<?php
function render2($filename, array $params)
{
    extract($params, EXTR_SKIP);
    include $filename;
}
```

が、次のようにすれば関数のスコープに引数が無いので衝突を気にする必要がなくなります。

```php
<?php
function render3(/*$filename, array $params*/)
{
    extract(func_get_arg(1));
    include func_get_arg(0);
}
```

### 参考

[Zend_View::_run()](https://github.com/zendframework/zf1/blob/4528b888a92e0ee51825c4e4af6e80dd1cc015b7/library/Zend/View.php#L152)
第12回オフラインリアルタイムどう書く ruby による実装例


オフラインリアルタイムどう書く
http://atnd.org/events/40389
の、当日の問題(サイコロを転がす)
http://nabetani.sakura.ne.jp/hena/ord12rotdice/
の実装例。

ruby。

他の言語などの解答例は
http://qiita.com/Nabetani/items/f3cca410428f90333e28
から辿れます。

で。

```ruby
require 'matrix'

def topof(s)
  s.each{ |e,a|
    break e if a[0,2]==1
    break 7-e if a[0,2]==-1
  }.to_s
end

def mx(c)
  case c
    when 'S'; mx('N').inv
    when 'E'; mx('W').inv
    when 'N'; Matrix[ [1,0,0], [0,0,-1], [0,1,0]]
    when 'W'; Matrix[ [0,0,-1], [0,1,0], [1,0,0]]
    else; raise "??"
  end
end

def solve( src )
  s=[ [1, Matrix[[0,0,1]]],
      [2, Matrix[[0,1,0]]],
      [3, Matrix[[1,0,0]]]]
  src.chars.each_with_object( topof(s) ){ |c, r|
    m=mx(c)
    s=s.map{ |e,a| [e,a*m] }
    r.concat( topof(s) )
  }
end

raise( "FAIL" ) unless DATA.inject(1){ |r,line|
  num, src, expected = line.split(/\s+/)
  actual = solve( src )
  ok = expected == actual
  puts "#{num} #{ok ? 'ok' : '***NG***' } : #{src} -> #{actual} ( #{expected})"
  $stdout.flush
  r && ok
}
__END__
0 NNESWWS 15635624
1 EEEE  13641
2 WWWW  14631
3 SSSS  12651
```

いつも通り、テストデータの大半は省略。

サイコロを転がすんだから三次元。平行移動がないので 3✕3 の行列でいいよね。
という実装。

出題者としては誰かがこういうのを書くだろうと思ってたんだけど、誰も書かないので自分で書いた。
逆行列とか、いろいろ便利。
ライブラリとして行列を持っていない環境だとちょっとやる気にならないけど、ruby や python だと現実的だと思う。

`concat` を使っているのは、`each_with_object` だから。`+=` だとうまくいかない。

ちなみに、2.0.0 と 1.9.3 で動作確認済み。
bash/zsh のパラメータ展開(#, %)の覚え方いろいろ

bash/zsh では パラメータ展開の `#` と `%`を使って Prefix または Suffix を削除することができます。

```sh
$ var='hogefuga'

# Prefix削除
$ echo "${var#hoge}"
fuga

# Suffix削除
$ echo "${var%fuga}"
hoge
```

シェルスクリプトではよく使う手法ですが、意外と覚えづらく、特にどちらが Prefix削除 でどちらが Suffix削除 なのか忘れてしまいがちです。(私だけ？

先日そんな悩みを Twitter で吐露したところ、3名の親切な方が覚え方を伝授してくれました。

その覚え方がなかなかユニークで覚えやすかったので紹介します。

## 覚え方

1. `#` はコメントを表す記号なので Prefix(先頭)削除

2. `#` を番号記号と考えて `#30` のように使うので Prefix(先頭)削除

3. `%` はパーセンテージを表す記号で、`30%` (30パーセント) のように使うので Suffix(末尾)削除

4. キーボードの配列が [#][$][%] のように 変数展開を行う `$` を挟んで [prefix][value][suffix] という並びになっていることから考える。

## おわり

どれも非常に面白い覚え方です。
みなさんはどのように覚えているでしょうか。

他にもこんな覚えた方があるよ、という方がいましたら是非教えてください。
(ちなみに私はどれも知りませんでした…)
1分でVim+Pythonのテスト環境をつくる


##1.vimrcに下記を追加
```vimrc
nnoremap <C-p> :!python %<CR>
```
##2.対象のファイルの上下に下記を追加
```python:unittest
import unittest

#(中略)

if __name__ == '__main__':
  unittest.main()
```

##3.テストを書く
```python:テスト達
class PythonTest(unittest.TestCase):
  def test_zero(self):
    self.assertEqual(0, 0)
  def test_foo(self):
    self.assertEqual("foo", "foo")
  def test_bar(self):
    self.assertEqual("foo", "foo")
```
##4.該当のファイルをVimで開いたままControl+Pでテストを実行できる
![スクリーンショット 2013-07-11 23.58.44.png](https://qiita-image-store.s3.amazonaws.com/0/1630/32bbd02c-7a6b-bdd7-d0f7-ec59700177c4.png "スクリーンショット 2013-07-11 23.58.44.png")


##5.サンプル様

```python:sample
#! /usr/bin/env python
# -*- coding: utf-8 -*-

'評価するための関数達'

def evaluate(value):
  """そのまま返す関数"""
  return value


import unittest

class EvaluateTest(unittest.TestCase):
  def test_evaluate(self):
    value = 1
    evaluated_value = evaluate(value)
    self.assertEqual(value,evaluated_value)

if __name__ == '__main__':
  unittest.main()
Rubyでプラグイン機能を実現する

Rubyでプラグイン機能を実現するための自分なりの方法。

##概要
入力があって、それをいじっていくタイプのプラグイン機構を作りたい。例えば、`ruby`という入力があって、大文字にするプラグインと、2回繰り返すプラグインがあったら、`RUBYRUBY`となる。

##ディレクトリ構造

    +--main.rb
    +--plugins
    |  +--pluginA
    |  |  +--plugin.rb
    |  +--pluginB
    |  |  +--plugin.rb

##プラグインを追加したい場合

例えば、大文字にするプラグイン(upcase)を追加したい場合

```rb:plugins/upcase/plugin.rb
class UpcasePlugin
  def on_message(msg)
    msg.upcase!
  end
end
```

##ソース

```rb:main.rb
plugins = []
Dir.entries('plugins').each do |name|
    path = "plugins/#{name}"
    next if File.ftype(path) != 'directory' or %w(. ..).include? name

    require_relative path + '/plugin.rb'
    name[0] = name[0].upcase
    plugins << Module.const_get("#{name}Plugin").new
end

loop do
    msg = gets.chomp!
    plugins.each{|plugin| plugin.on_message(msg) }
    puts msg
end
```

エラー処理皆無ですｗ。plugins内にあるディレクトリをプラグインとみなし、その中にあるplugin.rbをrequireすることでファイルをロードし、`Module.const_get`でクラスを取得してnewしています。プラグインを使うときは、eachでぐるぐる回します。
開発先サーバーでパッケージ入れるのはちょっと…というときの技

使いたいコマンドが入ってる端末で、
$ ldd `which command`
で依存ライブラリを探し、割りと少ないようならライブラリごと開発先サーバーに持っていく。

自分のホームディレクトリ下に適当に掘ってライブラリパス通す。
ただし開発先のサーバーで実行前にもう一度lddコマンドで確認した方がいい。
これでライブラリが見当たらない状態になってるプログラムは実行できない。

バージョン管理システムが入ってないサーバーにこれでcvsコマンド持っていったことある。
cvsコマンドは依存関係がシンプルなのです。

Gitやsubversion、scseen等は無理
Rails4なのにassets:precompileが遅い

地味にはまったのでメモ。

# 前提

- Capistrano 2系

# 現象

- ローカルとかで`precompile`してると2回目は早い。
- でも、`Capistrano`でデプロイする時は毎回遅い。
- `assets`に変更がないのに遅い。
- サーバにログインして、`rake assets:precompile`するとは普通に早い。

こんな状況だった。

結論としては、`deploy.rb`の設定を変更して

```rb:deploy.rb
set :shared_children, ['system', 'log', 'pids', 'tmp/cache']
```

という感じで、`tmp`も`shared`配下に置くようにしたら二回目からは早くなった。

`tmp/cache/assets`にも大事な情報があるみたい。

まぁ、以前の情報があるから早いというのはわかるんだけど、`Capistrano`のデフォルト設定ではないというのが少し気にかかっている…。

もっと良いやり方などがあるのだろうか…？

Capistrano 3系では、`shared_children`は`linked_dirs`に変わっているので

```rb:deploy.rb
set :linked_dirs, ['system', 'log', 'pids', 'tmp/cache']
```

とすれば良さそう。(@hidechaeさんご指摘ありがとうございます。)
暴走プロセスの終了の仕方

終了したいプロセス名を runaway とします。

### プロセス名で終了

```bash:
$ killall runaway

$ pkill runaway
```

### バックグラウンドに移して終了

```bash:
$ runaway
control-z を押してバックグラウンドに移す
^Z
[1]+  停止                  runaway
$ kill %1
```

### PID番号を指定して終了

まずはPIDを知ることが必要。いくつか方法があります。

```bash:
$ pgrep runaway
※PIDの番号だけ表示

$ ps -ef | grep runawa[y]
※grepで[]くくると、結果にgrepコマンドが引っかかりません。

$ ps -ef f | grep runawa[y]
※fオプションつけるとツリー構造で表示。(solarisにはないです。)

$ pstree -p | grep runaway
※こっちは[]でくくらなくてもgrepが引っかからない。(solarisにはないです。)
```

```bash:
$ kill <PID番号>
だめなら
$ kill -9 <PID番号>
```

### マウスでクリックすると強制終了。

```bash:
$ xkill
```


### screenの中で暴走したとき（端末描画がどうしょうもない時使うことあり）

```bash:
screenのバインドキーを標準の^aとする。
^a-k を押して、yを押すとscreenごと終了する。
```

### screenを切り離した後、外から終了させたいとき

```bash:
# screen -ls
There is a screen on:
	91402.ttys000.mba	(Detached)
1 Socket in /var/folders/zz/zyxvpxvq6csfxvn_n0000000000000/T/.screen.
# screen -S 91402.ttys000.mba -X quit
```


----

### topコマンドからPID指定して終了させる

```bash:
$ top
kを押してPID入力、Enterキー押下

特定のコマンドだけtopで表示させたい場合、PID番号指定で起動する。
$ top -p $(pgrep -d, runaway)
```

### htopコマンドから終了させる

```bash:
$ htop
kを押してシグナルを選択しEnterキー押下。15で試してみてダメなら9を選ぶといいかと。
```

----

### そもそもcontrol-sを押して固まっている疑惑の時

* control-q を押しましょう。

### 端末の描画がグチャグチャになってどうしょうもない時

```bash:
control-l を押してみる。ダメなら
control-zを押してから
$ reset
```

### Xの反応がない時

* control-alt-backspace を押してダメならcontrol-alt-F1とか押し、そこからログインしてXを再起動させましょう。

### OSごと応答ないとき

（例：カーネルパニックや、本番運用中にサーバー死んでnfsのマウント失敗して何十分も待たされて憤死しそうな時)

* SysRq+R+S+E+I+U+B と入力していきましょう。電源長押しはダメです。

* ネットワークが使えなくなっただけの場合、シリアルポートからのログインを可能にしておくといざという時役に立ちます。特にSolaris

* ラックに入っているサーバーで該当のマシンを探すのに、ejectコマンド(CDトレイを出す)が便利です。
midiの再生

デバイス確認

```bash:
$ aplaymidi -l
 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
```

timidityサービスをインストールし、TiMidityの項目が増えていることを確認。

```bash:
$ sudo apt-get install timidity alsa-utils
$ aplaymidi -l
 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
128:0    TiMidity                         TiMidity port 0
128:1    TiMidity                         TiMidity port 1
128:2    TiMidity                         TiMidity port 2
128:3    TiMidity                         TiMidity port 3
```

再生確認

```bash:
$ aplaymidi --port 128:0 nanika.mid
```
オブジェクトをアルファベット順でGETパラメータに変換

```js:
var obj = {b: 1, a: 3, c:2};

_.map(_.keys(obj).sort(), function(key) {
  return key + '=' + obj[key];
}).join('&');

// a=3&b=1&c=2
```

判別用に使うのでソートし、URLエンコードはしない。
MacBookProでキーバインド変更メモ（fn→Ctrl-R、caps→Ctrl-L、Ctrl→fn）

#目的
私は、日本語キーボード配列が慣れている。
特にCtrlキーは左右2つ無いと嫌だ！
左のCtrlキーはCapsの位置が良い！
なんか、左右にCtrlが有るのに慣れてしまって、Vimでのスクロールとががやり辛くってね〜
とりあえず上手くいっているようなので、メモしておく。

#使用アプリ
アプリを2つ使用します。
2つとも同じサイトです。
[KeyRemap4MacBook](https://pqrs.org/macosx/keyremap4macbook/index.html.ja)
[PCKeyboardHack](https://pqrs.org/macosx/keyremap4macbook/pckeyboardhack.html.ja)
インストールの際には、再起動が必要です。

#設定
##PCKeyboardHackの設定
KeyRemap4MacBookのサイトはヘルプもしっかりしているので参考になります。
まずは、以下を参考にする。
https://pqrs.org/macosx/keyremap4macbook/faq.html.ja#capslock

PCKeyboardHackの設定で、CapsLockを110に設定。
110は、"PC Application Key" です。
いったん、未使用のキーへ割り当てます。

##Macのシステム環境設定
Macのシステム環境設定で
キーボード→修飾キー
Caps Lockキーをアクションなしに変更

##KeyRemap4MacBookの設定
|設定名|チェックする項目|説明|
|:------|:--------------------|:----|
|Pass Through Mode|Simultaneous Key Press [Escape + Tab] to Toggle "Path Through Mode|一時的にキーバインド変更をOFFにする|
|Change Control_L Key|Control_L to Fn|Ctrlをfnに変更|
|Change Fn Key|Fn to Control_R|fnをCtrl_Rに変更|
|For PC Users → Change PC Application Key|Application Key to Control_L|CapsをCtrl_Lに変更|

#注意点
fnキーの動作に注意。
参考URLは
https://pqrs.org/macosx/keyremap4macbook/faq.html.ja#fn

有効なfnキー操作は以下のもの。

* fn+cursor (home, end, page up, page down)
* fn+delete (forward delete)
* fn+return (enter)
* fn+jkl... (Keypad)

これ以外は、変更前のfnキーで大丈夫。
例

* fn+f1
* fn+10

fn周りで修正が必要ならまたやるかね。
Which application is using port 80?

It's hard for me to figure out which app is using port 80 when I need to run up web server in windows before.

But now I realize how to find it out.

Use this following command to get process id of the application which is using port 80.

*p.s. Ofcuz you can change to any port number you want.*

```
netstat -nao | find "0.0.0.0:80"
```

Then put the process id into the column named 'process_id' below, we'll have a vision like the following picture.

```
tasklist /fi "pid eq [process_id]"
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/26863/cfeb79d9-984d-d075-18b7-4d8660f9cd62.png)

Here I use 'httpd.exe' to be the sample, at the first time I solve my problem that is skype dibs port 80.

Hope these help. :P
Flaskで大きいアプリケーションを作るときのTips

通常、Flaskでは

```py:flask.py
from flask import Flask

app = Flask(__file__)
```

こうやってアプリケーションを定義するが、 **MVT** で作りたいという場合は、

```py:blueprint.py
from flask import Blueprint

app = Blueprint("app", __name__, url_prefix="/path")
```

このようにアプリケーションを定義する。

たとえば、

```
.
├── app.py
├── model.py
├── static
│   ├── interface.js
│   └── layout.css
├── template
│   ├── design.html
│   └── main.html
└── view
    ├── __init__.py
    ├── api.py
    ├── auth.py
    ├── main.py
    └── setting.py
```

このようなファイル構造の場合。

`view/`以下の各Pythonスクリプトには **Blueprintでアプリケーションを定義する。**

```py:api.py
from flask import Blueprint

app = Blueprint("api", __name__, url_prefix="/api")
```

`app.py` には **`view/`以下の各PythonスクリプトのBlueprintを登録する必要がる。**

```py:app.py
from flask import Flask
from view import api, auth, main, setting

application = Flask(__name__)

modules_define = [api.app, auth.app, main.app, setting.app]
for app in modules_define:
        application.register_blueprint(app)
```

まず `view/` ディレクトリ以下の各Pythonスクリプトをimportする。

    from view import api, auth, main, setting

次に **Blueprintアプリケーションを登録する**

    application.register_blueprint(app)

これでMVTができる。

## ちなみに

ちなみに、`app.py` に直接 `view/` 以下のBlueprintアプリケーションを登録するのではなく、 `view/` 以下の `__init__.py` にBlueprintアプリケーションを登録して、それを `app.py` でimportする、という方法もある。

```py:__init__.py
from flask import Flask
import api, auth, main, setting

application = Flask(__name__)

modules_define = [api.app, auth.app, main.app, setting.app]
for app in modules_define:
        application.register_blueprint(app)
```

```py:app.py

from view import application
```

こちらのほうが楽かも。
EC2 microでElasticsearchコマンドが立ち上がらない

## 現象
タイトルの通り．ログは以下

```
STATUS | wrapper  | 2013/07/11 11:47:35 | Launching a JVM...
ERROR  | wrapper  | 2013/07/11 11:47:35 | JVM exited while loading the application.
INFO   | jvm 5    | 2013/07/11 11:47:35 | Error occurred during initialization of VM
INFO   | jvm 5    | 2013/07/11 11:47:35 | Could not reserve enough space for object heap
```


## 原因
microインスタンスにはswap領域がない．

## 解決策
[AWS - １分でできる！AmazonEC2のmicroインスタンスでswap領域を作る - Qiita](http://qiita.com/DQNEO/items/be026d978ef5dcf1e44e)
postgresでinsert時にデフォルトで登録された値をreturningで取得する

# postgresでinsert時にデフォルトで登録された値をreturningで取得する

* Aテーブルにレコードをinsert
* BテーブルにもAテーブルに紐づくレコードをinsertしたい
* Aテーブルにinsertした際にシーケンスで登録されたIDを取得して使用したい！

```
-- データを INSERT
INSERT INTO hoge (hoge_id, hoge_text) VALUES (nextval('hoge_id_seq'), 'てすと');

-- 直前のシーケンス値を取得
SELECT currval('hoge_id_seq');
```

currvalが一般的だよな〜と思いながら、他にもなんかやり方あったよな〜
とおぼろげな記憶で探してたらあったあった

#### returning

https://www.postgresql.jp/document/8.2/html/sql-insert.html

```
INSERT INTO hoge (hoge_id, hoge_text) VALUES (nextval('hoge_id_seq'), 'てすと')
  RETURNING hoge_id;
```

* RETURNINGリストの構文はSELECTの出力リストと同一です。
とのことで、SELECT文と同じように結果を取得してやれば、IDが取得できる！
git rev-parse でできること

`git` の記事などを見ていると、よく `rev-parse` というコマンドが出てきます。
rev-parse単体でググっても使い道がよくわからないので、メモ変わりにrev-parseでできることをここに書いてみます。

【参考】

> git-rev-parse(1) Manual Page
> https://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html

## 使用可能なリファレンス(ref)を渡すとハッシュを返す

### ハッシュ

```
$ git rev-parse 1838ad4786...02cc4e713a
>> 02cc4e713a10dc68bcba40919f0f23eb62b45ec4
>> 1838ad478661d8cdb544c9adf921d08a97f7cc91
>> ^02cc4e713a10dc68bcba40919f0f23eb62b45ec4
```

### tag

```
$ git rev-parse v0.1.1
>> 4b7688eda62c07ec71f7a9576395861c252bd904
```

### 省略ハッシュ

```
$ git rev-parse 4b7688
>> 4b7688eda62c07ec71f7a9576395861c252bd904
```


## gitリポジトリのディレクトリを返す

```
$ git rev-parse --git-dir
 >> .git
```

## 現在のディレクトリにリポジトリがあるかどうかを確認

```
$ git rev-parse --is-inside-work-tree
>> true
```

## リポジトリが共有リポジトリか確認

```shell
$ git rev-parse --is-bare-repository
>> false
```

## トップレベルディレクトリを絶対パスで取得

```
$ git rev-parse --show-toplevel
>> /path/to/repository
```

## サブディレクトリにいるときにトップレベルのディレクトリからの相対パスを出力

```
$ git rev-parse --show-cdup
>> path/
```

## 使用可能なすべてのリファレンスを出力

```
$ git rev-parse --all
>> d2c70a0299127fbfa3cb898cb0b1ffd1186a01b4
>> a8a66d65282a22ae93954a468121a66ffc6926a3
>> d8cf577b01c3b52b1d568cf32230cf3537c3a5f5
>> f55abf927a2300831bbffb877a6f6ae8bec701d6
>> 81732ec5d6040da5c1ad9b68022292c97d6d3198
>> 69249bdcb954bb851df9901ed6491119836c2c8d
>> 63c8ebd4f31a1d580b8068f44b547d8418002972
>> b771459c556b79442ef0c5a1569c74a173c9492b
>> 53d65668f327df193637c4150a45fab1eacd138f
>> 4b7688eda62c07ec71f7a9576395861c252bd904
>> d490a6e5c0862bcd49450d79ba81d6d01470c42a
```

### ブランチ

```
$ git rev-parse --branches
>> d2c70a0299127fbfa3cb898cb0b1ffd1186a01b4
```

### タグ

```
$ git rev-parse --tags
>> d8cf577b01c3b52b1d568cf32230cf3537c3a5f5
>> f55abf927a2300831bbffb877a6f6ae8bec701d6
```

### リモート

```
$ git rev-parse --remotes
>> a8a66d65282a22ae93954a468121a66ffc6926a3
```

自分が知ってるのはこれくらいです。
もっとあればコメントお願いします！
Linux でシンボリックリンクを使った環境の注意点

シンボリックリンクの作り方によりTomcatが起動できないことがある。

### 誤った例
| permission  | type | size  | mon | day | hh:mm | files                                              | 
|:-----------:|-----:|------:|----:|----:|:-----:|:---------------------------------------------------| 
| lrwxrwxrwx. |  1   |  31   | Jul | 10  | 22:42 | apache-tomcat -> /usr/local/apache-tomcat-7.0.42**/**  | 
| drwxr-xr-x. |  9   |  4096 | Jul | 10  | 22:40 | apache-tomcat-7.0.42                               | 

### 正しい例
| permission  | type | size  | mon | day | hh:mm | files                                              | 
|:-----------:|-----:|------:|----:|----:|:-----:|:---------------------------------------------------| 
| lrwxrwxrwx. |  1   |  31   | Jul | 10  | 22:42 | apache-tomcat -> /usr/local/apache-tomcat-7.0.42   | 
| drwxr-xr-x. |  9   |  4096 | Jul | 10  | 22:40 | apache-tomcat-7.0.42                               | 

シンボリックリンクの貼り方によりエラーになるので注意が必要ってことか・ｑ・
アサーションメソッド一覧

#assert_responce :success
ブラウザーのリクエストに対してサーバーが「２００ OK」のレスポンスを出すかのテスト
#assert_responce :redirect
リダイレクト（ステータスコード３００番台）
#assert_responce :missing
ファイルが見つからない（ステータスコード４０４）
#assert_responce :error
エラー（ステータスコード５００番台）
#assert_redirected_to (モデル名)
リダイレクトがきちんとできているか確認
#assert_template（action名）
適切なテンプレートが選ばれているか確認
#assert_equal

#ステータスコード
200	OK	正常終了
300 リダイレクション
401	Unauthorized	ユーザー認証が必要（ユーザー認証失敗）
403	Forbidden	ファイルに対するアクセス権が無い
404	Not Found	存在しないURL。（ファイルが存在しない）
500	Internal Server Error	サーバーでの処理中にエラーが発生した。
501	Not Implemented	サーバーで実装されていないメソッドが要求
[Javascript] 配列から特定の要素を削除する(訂正有り)

###【訂正】下記方法には重複している要素が削除されないなどの問題があります。詳しくはコメント欄を参照してください。

---

配列の中から特定の要素を削除したいときはsomeメソッドを使うと便利。

```js:
var array1 = [10, 20, 30, 40, 50];
var target = 30;

//要素を削除する
array1.some(function(v, i){
    if (v==target) array1.splice(i,1);    
});

console.log(array1) //=> [10, 20, 40, 50];


/*
 * 連想配列から特定の要素を排除したいときにも便利
 */
var array2 = [
    {id:1, name:"hoge"},
    {id:2, name:"test"},
    {id:3, name:"hello"},
    {id:4, name:"world"},
    {id:5, name:"hoge"},
    {id:6, name:"test"},
    {id:7, name:"hello"}
];

var targetId = 3;
array2.some(function(v, i){
    if (v.id==targetId) array2.splice(i,1); //id:3の要素を削除
});

var targetName = 'hello';
array2.some(function(v, i){
    if (v.name==targetName) array2.splice(i,1);  //name:helloの要素を全て削除
});

```


TIPS:null埋め、delete、spliceで削除の違い

```js:
if (v==target) array1[i] = null; 
//null値が入る。for～inに引っかかる。lengthは変わらない。

if (v==target) delete array1[i]; 
//undefinedが入る。for～inに引っかからない。lengthは変わらない。

if (v==target) array1.splice(i,1);
//完全に削除。for～inに引っかからない。length減る。
```
gclientでgitのリポジトリをcloneする方法


google製のSCM管理ツールgclient
このツールではsvnとgitのリポジトリからソースを落としてこれる

svnかgit、どちらのツールでソースを落としてくるのかはURLでも制御できるみたい

svnでcheckoutされるURLは
http://
https://
svn://
svn+ssh://
で始まる場合

gitでcloneされるURLは
git://
ssh://
git+http://
git+https://
で始まる場合と
.git
で終わる場合

ただし、
git+https://foo@code.google.com/p/bar/ 
という感じで途中で@が含まれるURLを指定すると
@以降が削除されて上手く動かないみたい

まだ他にも指定方法があるみたいだけどよくわからない
『Macで日本語ファイルをgitにコミットするのやめて><』とりあずMacとLinuxで互換性のない日本語ファイルを探すスクリプト書いた


最近携わっているPHPのプロジェクトでは、プログラムを日本語で書いています。クラス名・変数名はもちろんファイル名も日本語です。(なぜ日本語で書くことにしたのか、そこらへんのモチベーションについては別記事にまとめたい)

このプロジェクトは開発環境がMac、プロダクション環境がLinuxなのですが、日本語ファイル名のPHPがオートロードされないなどの問題が発生しました。しらべたところ、MacのファイルシステムとLinuxのファイルシステムでUnicodeの規格が違うのが原因でした。詳しくは、「[紹介マニアどらふと版: Mac OS X におけるファイル名に関するメモ(NFC, NFD等)](http://www.sakito.com/2010/05/mac-os-x-normalization.html)」の記事が参考になります。

簡単にファイルシステムの違いを説明すると、

Mac: NFDという規格。濁点半濁点などバラしている(正規化)。「だ」は「た」「゛」の6バイトになる
Linux: NFCという規格。濁点半濁点をバラさない(非正規化)。「だ」は3バイトになる

という違いがあります。

Macで作ったNFDのファイルをgitにcommitすると、そのまま正規化された状態でステージされます。それを、Linuxでgit pullしたときに、NFDからNFCに変換してくれればいいのですが、NFDのままファイルが作られます。PHPのソースコードはNFCですから、ファイル名が決め打ちで参照されていると、「Macでは動いていたけど、Linuxで動かなくなった」という現象が発生するのです。

日本語ファイルをコミットされてしまったのはしょうがないので、ひとまず問題のあるファイルを洗い出すために、NFDのファイルを根こそぎ探しだすスクリプトをPythonで作りました。


## 使い方

```
$ find-nfd -h
usage: find-nfd [-h] [path]

Find NFD files

positional arguments:
  path        path to find(Default: current working directory)

optional arguments:
  -h, --help  show this help message and exit
```

## ソースコード

```py:find-nfd.py
#!/usr/bin/env python
import os
import argparse
from unicodedata import normalize

def fild_all_files(directory):
    for root, dirs, files in os.walk(directory):
        yield root
        for file in files:
            yield os.path.join(root, file)

def to_nfc(string):
    string = string.decode("utf8")
    string = normalize("NFC", string)
    string = string.encode("utf8")
    return string

def is_nfd(string):
    if to_nfc(string) == string:
        return False
    else:
        return True

def find_nfd_files(directory):
    for file in fild_all_files(directory):
        if is_nfd(file):
            yield file

def main():
    parser = argparse.ArgumentParser(description="Find NFD files")
    parser.add_argument("path", type=str, help="path to find(Default: current working directory)", nargs='?', default=os.getcwd())
    args = parser.parse_args()

    count = 0

    for file in find_nfd_files(args.path):
        print file
        count += 1

    print ""
    print "%u files found" % (count)

if __name__ == "__main__":
    main()
```

## 使ってみる

Macで作ったファイルです↓

```
$ php -r 'var_dump(glob("/tmp/test/1/*"));'
array(7) {
  [0] =>
  string(13) "/tmp/test/1/a"
  [1] =>
  string(13) "/tmp/test/1/b"
  [2] =>
  string(17) "/tmp/test/1/schon"
  [3] =>
  string(19) "/tmp/test/1/schön"
  [4] =>
  string(30) "/tmp/test/1/한글"
  [5] =>
  string(27) "/tmp/test/1/はひふへほ"
  [6] =>
  string(42) "/tmp/test/1/ぱぴぷぺぽ"
}
```


見た目はNFDなのかNFCなのか全く区別がつきませんが、「はひふへほ」と「ぱぴぷぺぽ」でstringのバイト数が違うのがわかります。
ドイツ語のウムラウトや、韓国語のハングルもNFDになっているのが分かります。

この中から、NFDのファイルを探してみます:

```
$ find-nfd.py /tmp/test/1
/tmp/test/1/schön
/tmp/test/1/한글
/tmp/test/1/ぱぴぷぺぽ

3 files found
```

3つ見つかりました。

こういうファイルを見つけたら、Linux環境かWindows環境でリネームして、gitに入れなおすことになります。

「こんなめんどくさいこと毎回やるのか?」と言われそうですが、vagrantでDebian環境がたった5分でできあがるように開発の仕組み自体を変えています:)

 Macとは言え、プロダクション環境ではないので、無駄なハマリを回避するには、プロダクション環境と全く同じ開発環境を作ることが大事ですね。
PHPでTwitter botの習作(2)

昨日のギークハウス元住吉用当番おしらせbotを引き続き改良しました。

#### 仕様
- 8時と22時にcronで巡回して当番に@を飛ばす
- 日曜日に当番が切り替わる
 
#### 課題
- 当番が最後まで行ったら最初に戻る（現状戻らない）
- 当番を順番等を変更する画面を作りたい
- セキュリティ対策
- 指定時間以外はツイートしないようにする

```php:

<?php

require_once('twitteroauth/twitteroauth.php');

// config.phpをこっちに書いた
define('CONSUMER_KEY',  // 省略

// OAuthについて。よくわからん
$conn = new TwitterOAuth(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET);

// 当番順のTwitterアカウント。順番あとで確認
$member = array("@ltd ");

// 週番号で当番の判定。
$week = date('W') % 7;
switch ($week) {
	case '0':
		$duty = 0;
		break;
	case '1':
		$duty = 1;
		break;
	case '2':
		$duty = 2;
		break;
	case '3':
		$duty = 3;
		break;
	case '4':
		$duty = 4;
		break;
	case '5':
		$duty = 5;
		break;
	case '6':
		$duty = 6;
		break;
}

// 次の当番の判定。まだ

// テンプレ。余計なことしたかもしれん。下が読みにくい
$trash = array("普通ごみ", "缶・ペットボトル・びん、ダンボール", "プラスチック製容器包装", "ミックスペーパー", "の収集日です。");
$temp = array("タオルの洗濯をお願いします。", "朝8時までに捨ててください。", "生ごみの回収もお願いします。");

// 曜日で文章を変える
$youbi = date('D'); // 曜日を判定

switch ($youbi) {
	case "Sun":
		$msg = array($temp[0],
			"明日、月曜日は".$trash[1].$trash[4].$temp[0]);
 		break;
	case "Mon":
		$msg = array("今日は".$trash[1].$trash[4].$temp[1].$temp[0],
			"明日、火曜日は".$trash[0].$trash[4].$temp[0]);
 		break;
	case "Tue":
		$msg = array("今日は".$trash[0].$trash[4].$temp[1].$temp[0],
			"明日、水曜日は".$trash[2].$trash[4].$temp[0]);
 		break;
	case "Wed":
		$msg = array("今日は".$trash[2].$trash[4].$temp[1].$temp[0],
			"明日、木曜日は".$trash[0].$trash[4].$temp[0]);
 		break;
	case "Thu":
		$msg = array("今日は".$trash[0].$trash[4].$temp[1].$temp[0],
			"明日、金曜日は".$trash[3].$trash[4].$temp[0]);
 		break;
	case "Fri":
		$msg = array("今日は".$trash[3].$trash[4].$temp[1].$temp[0],
			"明日、土曜日は".$trash[0].$trash[4].$temp[0]);
 		break;
	case "Sat":
		$msg = array("今日は".$trash[0].$trash[4].$temp[1].$temp[0],
			"生ごみの回収とタオルの洗濯をお願いします。1週間お疲れさまでした。".$member[$duty+1]."明日から当番をお願いします。");
 		break;
}

// 朝夜の判定。8時と22時にツイート
if (date(G) == 8) {
	$time = 0;
} elseif (date(G) == 22) {
	$time = 1;
}

//test
//echo $member[$duty].$msg[0];

$params = array('status' => $member[$duty].$msg[$time]);

// POST statuses/updateっていうTwitter API
$result = $conn->post('statuses/update', $params);

// TwitterOauth参照
var_dump($result);
```
Pythonで再帰的にファイル・ディレクトリを探して出力する


Pythonで再帰的に全てのファイルやディレクトリのリストを作るときは、`os.walk()`とジェネレーター(`yield`)を組み合わせた関数を作っとくと楽。

```txt:例えばこんなディレクトリ構成
$ tree /tmp/test
/tmp/test
├── 1
│   ├── a
│   │   ├── A
│   │   ├── B
│   │   └── hoge
│   └── b
│       ├── A
│       ├── B
│       └── hoge
└── 2
    ├── bar
    ├── c
    │   ├── buzz
    │   └── fizz
    └── foo

9 directories, 6 files
```

```python
import os

def find_all_files(directory):
    for root, dirs, files in os.walk(directory):
        yield root
        for file in files:
            yield os.path.join(root, file)

for file in find_all_files('/tmp/test'):
    print file
```

```txt:出力
/tmp/test
/tmp/test/1
/tmp/test/1/a
/tmp/test/1/a/hoge
/tmp/test/1/a/A
/tmp/test/1/a/B
/tmp/test/1/b
/tmp/test/1/b/hoge
/tmp/test/1/b/A
/tmp/test/1/b/B
/tmp/test/2
/tmp/test/2/bar
/tmp/test/2/foo
/tmp/test/2/c
/tmp/test/2/c/buzz
/tmp/test/2/c/fizz
```

## 関連記事

* [PHP - ディレクトリを再帰的に削除する方法のメモ - Qiita](http://qiita.com/suin/items/b5445ff6fbc21e8d883a): PHPで同じようなことをする場合は `RecursiveIteratorIterator` を使うとできる
yumインストールに必要なrpm


FC2 VPSのようにyumが入ってない場合は下記のrpmをインストールすればよい

```
gpgme-1.1.8-3.el6.x86_64.rpm
gpgme-devel-1.1.8-3.el6.x86_64.rpm
libgpg-error-devel-1.7-3.el6.x86_64.rpm
pygpgme-0.1-18.20090824bzr68.el6.x86_64.rpm
python-iniparse-0.3.1-2.1.el6.noarch.rpm
python-pycurl-7.19.0-5.el6.x86_64.rpm
python-urlgrabber-3.9.1-7.el6.noarch.rpm
rpm-python-4.8.0-12.el6.x86_64.rpm
yum-3.2.27-14.el6.centos.noarch.rpm
yum-metadata-parser-1.1.2-14.1.el6.x86_64.rpm
yum-plugin-fastestmirror-1.1.26-11.el6.noarch.rpm
```

## EPEL

```
epel-release-6-8.noarch.rpm
```
ChromeOSの初期設定に便利なコマンドとツール

## 起動の準備

[ChromeOS](http://chromeos.hexxeh.net/)のVMWareイメージを解凍し、vmxファイルへ追記

```bash:
ethernet0.virtualDev = "e1000"
```

## 起動

デベロッパーモードになる。
ctrl+alt+tでターミナルを開き、shellと入力してEnter押下。[crouton](https://github.com/dnschneid/crouton)をダウンロード

```bash:
$ wget http://goo.gl/fd3zc
```

## 初期ユーザー、パスワード

user:chronos
pass:facepunch

## ChromeOSにapt-get等を取り戻す(debootstrap raring)

```bash:
$ sudo sh -e crouton -t core -m http://www.ftp.ne.jp/Linux/packages/ubuntu/archive/
```

/usr/local/chroots/precise/ に保存される。

## 初期ユーザー作成(Please specify a username for the primary user.)

作成したいユーザー名、パスワードを入力。

## chroot

```bash:
$ sudo enter-chroot
```

# chrootからXのプログラムを表示

ChromeOS環境にて

```bash:
$ xhost +
```

chroot側からは

```bash:
$ export DISPLAY=:0
$ xterm
```

![chromeos.png](https://qiita-image-store.s3.amazonaws.com/0/25728/b99763d1-e266-f2d6-c26f-85c2b5f4cce4.png)

日本語入力はuim-fep使えば良いかと。

後はお好きに。
NSNotification/NSNotificationCenter


基本的な説明は[ここで](http://iphone-tora.sakura.ne.jp/nsnotificationcenter.html "iPhoneアプリ開発の虎の巻")

HogeクラスのメソッドをFugaクラスから呼び出す

```Hoge.m
-----略-----

//デフォルトの通知センターを取得
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

//hogeメソッドを呼び出す通知をHogeNotificationという名前で登録
[nc addObserver:self selector:@selector(hoge:) name:@"HogeNotification" object:nil];

-----略-----

- (void)hoge:(NSNotification *)center {
	//このメソッドが呼び出される

	NSDictionary *dic = [center userInfo];
}
```

```Fuga.m
-----略-----

// 通知を作成する
//dicはhogeメソッドの引数に渡される
NSNotification *n = [NSNotification notificationWithName:@"HogeNotification" object:self userInfo:dic];

//通知！
//Hogeクラスのhogeメソッドが実行される
[[NSNotificationCenter defaultCenter] postNotification:n];

```


##参照
[iPhoneアプリ開発の虎の巻](http://iphone-tora.sakura.ne.jp/nsnotificationcenter.html "iPhoneアプリ開発の虎の巻")
flump の　DemoScreen.as　はloader.succeeded.connectのせいで動作しないloader.succeeded.addに書き換えればOK

 
https://github.com/threerings/flump/blob/master/demo/src/main/as/flump/demo/DemoScreen.as


    public function DemoScreen () {
        const loader :Future = LibraryLoader.loadBytes(ByteArray(new MASCOT_ZIP()));
       // loader.succeeded.connect(onLibraryLoaded);//NG
	loader.succeeded.add(onLibraryLoaded);//OK
       // loader.failed.connect(function (e :Error) :void { throw e; });//NG
         loader.failed.add(function (e :Error) :void { throw e; });OK
    }


あーちなみにswcは
flump-runtime.swc
starling.swc
はこのflumpyからもってきていまうす。
https://github.com/katopz/flumpy/tree/master/libs

まとめたもの
FlashBuilder & Flash Develop Project　File
http://www.mediafire.com/download/b5274crmjhtkzef/flump-demo-mobile3_full_downloaded_fix.zip
apache mod_deflateで圧縮転送する

solarisの場合

```apache:/etc/apache2/2.2/httpd.conf
<IfModule deflate_module>
SetOutputFilter DEFLATE
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI\.(?:gif|jpe?g|png)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
</IfModule>
```

syntax check

```bash:
$ apachectl -t
```

apache restart

```bash:
$ svcadm restart svc:/network/http:apache22
```

chrome extension のPageSpeedで確認すると有効になったかわかりますね。
![pagespeed.png](https://qiita-image-store.s3.amazonaws.com/0/25728/8411b642-776f-aa3f-0565-24dad39ae23b.png)
シンボリックリンクを開くと recentf に同じファイルが複数記録される問題を解決する

デフォルトの Emacs では、 find-file でシンボリックと元のファイルの両方を開くと、そのどちらも記録されてしまいます。

この問題は以下のコードを .emacs に記述することで解決します。

```el
(setq-default find-file-visit-truename t)
```

これにより、シンボリックリンクを開いてもリンク元のファイルのパスで開かれるため、シンボリックリンクのパスが recentf に登録されるのを防ぐことができます。
StyleDocco導入（windows編）

# StyleDocco導入（windows編）

* コーダー向けにCygwinは使わず、Windows上だけで完結するようにしてみました

## 事前準備

### [msys-git](https://code.google.com/p/msysgit/downloads/list?q=full+installer+official+git)

* Windows向けgit

### [python2.7+](http://python.org/download/)

* python（nvmwの実行に必要）

### [nvmw](https://github.com/hakobera/nvmw)

* Windows向けのnode.jsのバージョン管理ツール

#### 補足

* msys-gitとpython2.7はパッケージインストールなので簡単です。
* nvmwもgithubのコマンドをコマンドプロンプトにコピペでいけます。

#### nvmwをインストールしたら
コマンドプロンプト上で

    peter> nvmw install v0.10.8
    peter> nvmw use v0.10.8
    peter> node -v
    v0.10.8

* これでnode.js（v0.10.8）がインストールできました。
* 0.11.x系はまだ不安定なので0.10.x系を使いました。

## [StyleDocco](https://github.com/jacobrask/styledocco)

* CSSスタイルのドキュメントジェネレーター
* 作業効率が2倍に！（なるらしい）

### インストール方法

     peter> npm install -fg styledocco

### 実行方法

#### cssファイルを作成

	/* Provides extra visual weight and identifies
	 the primary action in a set of buttons.
	<button class="btn primary">Primary</button> */
	.btn.primary {
		background: blue;
		color: white;
	}


_上記はgithubからコピペ_

* 上記のコードをexampleフォルダにbutton.cssというファイル名で保存する

##### 注意点

* ReadMe.mdに説明を書いてexampleフォルダにいれるとindex.htmlとして表示される
* なのでindex.cssというファイルはstyledoccoで使われるので使ってはいけないぽい


#### styledoccoコマンドを実行

	styledocco example

* docsというフォルダにドキュメントが出力される
* 詳しい使い方はstyledoccoのgithubをみてね
postgresレプリケーション環境でのバックアップ失敗！

# postgresレプリケーション環境でのバックアップ失敗！
* postgresのストリーミング・レプリケーションを使ったマスタ・スレーブの2台構成のレプリケーション環境

* さらに万が一のために、DBのダンプを別のサーバに保存しよう！

* マスタはアプリケーションで使用してるので負荷かけたくないなと思い、
**スレーブ**からダンプを取ろう！！

#### あれ？ダンプが取れない。。。

* pg_dumpでダンプファイルは途中まで作成されてて、下記エラーが出て処理が止まってしまっていた。

```
pg_dump: SQL command failed
pg_dump: Error message from server: ERROR:  canceling statement due to conflict with recovery
DETAIL:  User was holding a relation lock for too long.
```

検索したら英語のサイトだらけだったけど、要は

#### スレーブのテーブルロック時間長すぎてレプリケーション止まってるからこの処理止めるな！止めるからな！

ということだった。。。
で、その待ち時間をなが～くする設定が

max_standby_streaming_delay

http://www.postgresql.jp/document/9.1/html/runtime-config-replication.html

今回は
#### max_standby_streaming_delay = -1
で待ち時間を無限に設定して、再度ダンプを取得してちゃんとダンプ取得できました！