OmniAICreator/Qiita-1.07M huggingface dataset:
JQuery Mobile 標準Template HTML

メモ

```html:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript"
	src="./../../report/jquery/jquery-1.10.2.js"></script>
<script type="text/javascript"
	src="./../../report/jquery/jquery.mobile-1.3.1.js"></script>
<link rel="stylesheet" type="text/css"
	href="./../../report/jquery/jquery.mobile-1.3.1.css">
<title>Insert title here</title>
</head>
<body>
	<section data-role="page" data-position="fixed">
		<header data-role="header" data-position="">
			<h1>タイトル</h1>
		</header>
		<section data-role="content">内容</section>
		<footer data-role="footer" data-position="fixed">
			<nav data-role="navbar">
				<ul>
					<li><a href="index.html#1"  class="ui-btn-active">メニュー１</a></li>
					<li><a href="index.html#2">メニュー２</a></li>
					<li><a href="index.html#3">メニュー３</a></li>
					<li><a href="index.html#4">メニュー４</a></li>
				</ul>
			</nav>
			<address>&copy; 2013+ @asahina_dev</address>
		</footer>
	</section>

</body>
</html>
```
vimでお手軽にXMLを整形する

開発などで改行がないXMLをvimでお手軽に整形するコマンドです。

```vim:
:%s/></>\r</g | filetype indent on | setf xml | normal gg=G
```

もしくは

```vim:
:%s/></>^M</g | filetype indent on | setf xml | normal gg=G
```

`^M`は`^`と`M`の2文字ではなく、`Ctrl-V`の後に`Enter`を入力した1文字です。

インデント不要だったりXMLが巨大で時間がかかる場合は次のように置換だけにすると高速です。

```vim:
:%s/></>\r</g
```
```vim
:%s/></>^M</g
```

## 整形例

```xml:
<foo><bar><qiita>example</qiita></bar></foo>
```

こんなテキストが

```xml:
<foo>
	<bar>
		<qiita>example</qiita>
	</bar>
</foo>
```

このように整形されます。
vagrant install

#chefを利用するためにvagrantをインストールする

Mac OS X 10.7.5

```
$sudo gem install vagrant
$vagrant box add base http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130427.box

Failed to untar the box file. This is usually because you're
attempting to add a box that isn't a valid box file. Please
double check that the box file is properly packaged.
```
error
#vagrantのヴァージョンを確認

```
$ vagrant -v
Vagrant version 1.0.7
```
調べた
>http://nushu123.blogspot.jp/2013/06/vagrant-box-addfailed-to-untar-box.html
>https://github.com/mitchellh/vagrant/issues/977

VAGRANT_HOME??

```
$VAGRANT_HOME=/vagrant/path
$export VARGRANT_HOME
```
もう一回実行

```
Failed to untar the box file. This is usually because you're
attempting to add a box that isn't a valid box file. Please
double check that the box file is properly packaged.
```

同じエラー

>http://zakuni.blogspot.jp/2013/06/macvagrant.html
>http://docs.vagrantup.com/v2/installation/

Gem Install?

Vagrant 1.0.x had the option to be installed as a RubyGem. This installation method has been removed for installers and packages only.

アンインストール

```
$sudo gem uninstall vagrant
```

vagrant 再インストール
http://downloads.vagrantup.com/tags/v1.2.2/
Vagrant-1.2.2.dmg
インストール

```
$ which vagrant
/usr/bin/vagrant
$ vagrant -v
Vagrant version 1.2.2
```

再度実行
Successfully added box 'base' with provider 'virtualbox'!
成功


##vagrant 設定

```
$vagrant init
$vi Vagrantfile
$ diff Vagrantfile Vagrantfile.org
112,116d111
< Vagrant::Config.run do |config|
<  config.vm.box = "base"
<  config.vm.network:hostonly,
<   "192.168.50.12"
< end
```

起動

```
$vagrant up
```
ログインする

```
$vagrant ssh
```

成功
Ubuntuの初期設定に便利なコマンドとツール

http://www.webupd8.org/search/label/cli
全記事に目を通してCLI力をつけました。

## liquidprompt

* bashのPS1をゴージャスにする。また、gitの状態やバッテリー残量、現在時刻の表示も。

## apt-fast

* ppaから入れる。分割ダウンロード支援ソフト(aria2)を使うので早いらしい。

## 各種topコマンド

* powertop, iftop, iotop

## vimpager

* www.vim.orgからダウンロードできます。spaceでページ送り、qで終了できます。

## ファイルのコピー、貼り付け

* ファイルをccopyで/tmp/にコピーしたあと、目的の場所に移動してcpasteで貼り付けができます。

```Bash:
ccopy(){ while (( $# )); do cp -av "${1}" "/tmp/ccopy.${1}"; shift; done; }
alias cpaste="ls -d /tmp/ccopy* | sed 's|[^\.]*.\.||' | xargs -I % mv -v /tmp/ccopy.% ./%"
```

## CLI Companion

* コマンドの使い方例と、Commandline-fuのコマンドをそのまま実行できる。
* [動画](http://www.youtube.com/watch?v=nP5UbygAAu0)

## Ultimate .bashrc

* 550kbという巨大な.bashrc。これをそのまま使うのではなく、勉強用によいかと。

## pvコマンド

* ファイルの移動で進捗状況が表示される。mvのaliasとして使うには適さない。

## fishシェル

* コマンドの説明が充実している。とても感動しました。
* ubuntuのパッケージは古い(1.3)ので、公式サイトの2.0を入れましょう。

## .inputrc

* /etc/inputrcで足りないところをここで設定する。
* .bashrcにbindコマンドで割り当てする方法もあり。

## .bashrc

* ほか多数。

```Bash:
## autocd
shopt -s autocd

## man command <Esc-h> or <Alt-h>
bind '"\eh": "\C-a\eb\ed\C-y\e#man \C-y\C-m\C-p\C-p\C-a\C-d\C-e"'
# ctrl+left/right arrows:
bind '"\e\x5b\x31\x3b\x35\x44"':backward-word
bind '"\e\x5b\x31\x3b\x35\x43"':forward-word
# alt+b/f:
bind '"\xe2"':'"\M-b"'
bind '"\xe6"':'"\M-f"'
# alt+'.':
bind '"\xae"':yank-last-arg

## history pgup,pgdn
bind '"\e[5~": history-search-backward'
bind '"\e[6~": history-search-forward'
HISTTIMEFORMAT="[%y-%m-%d %T] "
HISTIGNORE="&:ls:[bf]g:exit"
HISTCONTROL="erasedups:ignoreboth"

alias ...="cd ../.."
alias ....="cd ../../.."
alias .....="cd ../../../.."
alias du="gt5"
```

上に書ききれなかったものも[自分のdotfiles](https://github.com/tukiyo/dotfiles)に含まれているので参考になれば幸いです。
git cloneして、sh set_dotfiles.shを実行したらすぐに自分と同じ設定になります。
Adobe JSXで特定のjsxファイルが存在すれば読み込む

以前、[JSXファイル自身のpathを求める方法](http://qiita.com/mazgi/items/863e9083430084e82cba)を書いたのだけど、それと `$.evalFile()` を使えば「JSXファイルがあれば読み込んで挙動を変える」みたいなことができるのでメモ。

----

### ディレクトリ構成

```shell-session:
$ tree
.
├── lib
│   └── lib1.jsx
└── main.jsx
```

`main.jsx` と同じ階層に `lib` というディレクトリを作り、 `lib` の中に `lib1.jsx` というファイルがあれば読み込むようにする。

### main.jsx

エントリポイントとなるファイル。
`func` にアラートを表示する関数を代入した後で、もし `lib/lib1.jsx` が存在すれば `$.evalFile()` で読み込む。

```js:main.jsx
const SELF = (function(){
    try {app.documents.test()}
    catch(e) {return File(e.fileName)}
})();

var func = function() { alert('function in main'); }

if(new File(SELF.path + '/lib/lib1.jsx').exists) {
    $.evalFile(SELF.path + '/lib/lib1.jsx');
}

func();
```

### lib1.jsx

`main.jsx` から読み込まれる。
内容は `func` にメッセージを変えたアラートを表示する関数を(再)代入するだけ。

```js:lib/lib1.jsx
var func = function() { alert('function in lib'); }
```

`lib/lib1.jsx` を置いて実行するとこのようなアラートが表示される。

![Screen Shot 2013-07-20 at 5.46.02 PM.png](https://qiita-image-store.s3.amazonaws.com/0/9676/137aaee7-f5b5-1212-8981-6b575caa5456.png)

`lib/lib1.jsx` を削除して実行するとこのようなアラートが表示される。

![Screen Shot 2013-07-20 at 6.00.08 PM.png](https://qiita-image-store.s3.amazonaws.com/0/9676/1559f354-bccf-912f-3a60-d5119ad128b7.png)
【作業メモ】Amazon Linuxにmatplotlibとnumpy入れるまで

ベンチマークは手元で動かすと色々アレなのでEC2で一気にやっちゃおうという需要多いと思います。

Amazon Linuxは色々パッケージがあって動かしやすいのですが初期状態だとかなりスリムです。
色々入れて行きましょう。
普通の入れようとすると結構コケるので先にいろいろ入れてしまいます。

```shell-session:
$ sudo easy_install pip
$ sudo yum install gcc python-devel libpng-devel freetype-devel 
$ sudo pip install matplotlib numpy
```

- デフォルトでpipが入ってないけどeasy_installはある
- デフォルトでgccやらPythonのヘッダファイルやら色々足りなくてmatplotlibコンパイルできない
- numpyはPythonヘッダだけで行ける

こんなところです。簡単ですね。
MacのiTerm/Emacsでメタキーを快適に使いたい


MacBook Air 2013 Mid で Macデビューしたけど、何も設定しないとEmacsのメタキーが使いづらすぎて何もできない。

* 左⌘キーをメタキーとして使いたい
* でも⌘-Tabとかは左⌘キーをそのまま⌘キーとして使いたい

Mac OS X Mountain Lion 10.8.4 での設定メモ

## Emacsの設定

Emacsはhomebrewでインストールした ver 24.3.50.1

.emacs に下記の設定を書いておくと⌘キーがメタキーとして解釈される。
ついでに⌘-Tabの入力はOSが奪ってくれるせいかウィンドウ切り替えとして問題なく機能する。

~~~elisp
(when (eq system-type 'darwin)
  (setq ns-command-modifier (quote meta)))
~~~

## iTerm2の設定

iTerm2の環境設定からキーリマップの設定をする

* Profiles → Keys：Left option (⌥) key acts as で `+Esc` をチェック
* Profiles → Keys：Right option (⌥) key acts as で `+Esc` をチェック
* Keys → Remap Modifier Keys で Left ⌘を Left optionにリマップ
* Keys → Global Shortcut Keys でショートカット設定
  * Command-Tab を "Do Not Remap Modifiers" に設定。これで⌘-Tabは iTerm2 に捕捉されなくなり、ウィンドウ切り替えができるようになる
  * Control-Command-Enter を "Do Not Remap Modifiers" に設定。これは自分の環境での Spotlight検索ショートカットキーなので、これもiTerm2に捕捉されないようにした
Berkshelfでcookbookの参照先を変える（githubやlocalなど）

[Berkshelf](http://berkshelf.com/)を使うと、cookbookのdependenciesを解決してくれるらしい。

Berkshelfは基本はopscodeに登録されているcookbookを使用する。

```
site :opscode

cookbook 'mysql'
cookbook 'nginx', '~> 0.101.5'
```

公式のcookbookをローカルにcloneして変更したものを使いたいときは、以下。

```
cookbook "artifact", path: "/Users/reset/code/artifact-cookbook"
```

githubリポジトリを参照するときはこんな感じ。
refでrevisionを指定している。

```
cookbook "riak", github: "basho/riak-chef-cookbook", ref: "2.2.0"
```

今回はriak-chef-cookbookを変更して、
BackendのDBとしてBitcaskではなくeLevelDBを使用するように変更した。

以下、[vagrant-riak-cluster](https://github.com/hectcastro/vagrant-riak-cluster)をgit cloneしたとして進める。

#### まずはcookbookをclone

```
$ cd vagrant-riak-cluster
$ git submodule add https://github.com/basho/riak-chef-cookbook.git
```

#### cookbookの書き換え

```rb:https://github.com/basho/riak-chef-cookbook/blob/master/attributes/default.rb
# riak_kv storage_backend
default['riak']['config']['riak_kv']['storage_backend'] = "riak_kv_eleveldb_backend"
```

#### Berkshelfでローカルパスを指定

```rb:Berkshelf
cookbook "riak", path: "./riak-chef-cookbook"
```

Berkshelf.lockがすでに作成されている場合はBerkshelfへの変更が反映されない。
その場合はBerkshelf.lockを削除（なにかコマンドがあるかも？）

#### `vagrant up`して確認

```
$ vagrant up
$ vagrant ssh riak1
vagrant@riak1 $ less /etc/riak/app.config
```

```

 {riak_kv, [
                ~~~~
                {storage_backend, riak_kv_eleveldb_backend},
                ~~~~
        ]},
```

無事、変わっていることを確認。
Scalaのmatchにて変数の束縛

matchのcase内で"@"を使うことで変数を束縛できる。
変数名 @ パターン のような感じ

以下のような感じ

```scala:
def service(request: String) = {
    val splitRequest:Array[String] = request.split(" ");
    splitRequest match {
        case Array(cmdString, other @ _*) =>
             println(other)
        case _ =>
   }
}
```

sevice("hoge fuga piyo")とか呼び出すと'Vector(fuga,piyo)'という出力になる

fuga以降のArrayデータを束縛できた
Chrome DevToolsでjavascriptをデバッグする際に忘れてはいけない大切な事

[Chrome DevTools](https://developers.google.com/chrome-developer-tools/?hl=ja)はとてもとても便利で、毎日お世話になっている神ツールです。
単純なHTMLの解析からGPUの使用具合というマニアックな情報まで色々確認出来ますが、その中でデバッグの時に設定しておく事で、ちょっとしたミスを減らして問題にすぐ気付ける設定が１つあります。
![](https://developers.google.com/chrome-developer-tools/images/slide8.jpg )

## javascriptエラーが発生した場合にエラーを補足しBreakする

`Source`タブを選択した場合に、左下にメニューがあります。
![kobito.1374293903.755992.png](https://qiita-image-store.s3.amazonaws.com/0/11214/6101454a-8f10-c5ea-bcfb-73566c730c60.png "kobito.1374293903.755992.png")
その中の機能としてボタンっぽい![kobito.1374293979.034949.png](https://qiita-image-store.s3.amazonaws.com/0/11214/b0784954-20f7-3ecb-c22c-556b4f68f570.png "kobito.1374293979.034949.png")があります。
これを、1回クリックします。すると![kobito.1374294617.406480.png](https://qiita-image-store.s3.amazonaws.com/0/11214/2866d0cb-d149-0de8-9e5c-80c794ae9ebb.png "kobito.1374294617.406480.png")という感じで色が変わります。次にもう一度クリックします。すると![kobito.1374294665.711486.png](https://qiita-image-store.s3.amazonaws.com/0/11214/0e977080-8229-1c17-4c97-2837f09f2177.png "kobito.1374294665.711486.png")こんな感じで色がまた変わります。

これらを設定しておくと、javascript実行時に発生したエラーをDevToolが検知してBreakしてくれるので、すぐに問題のあるコードに気がつく事が出来、ミスにすぐ気がつく事が出来ます。

## Pause on Exceptionに関して

![kobito.1374294617.406480.png](https://qiita-image-store.s3.amazonaws.com/0/11214/2866d0cb-d149-0de8-9e5c-80c794ae9ebb.png "kobito.1374294617.406480.png")の状態を指します。詳細は公式サイトの[Pause on Exception](https://developers.google.com/chrome-developer-tools/docs/javascript-debugging?hl=ja#pause-on-exceptions) を確認してください。
簡単に言うと例外が発生した場合にDevToolが感知して該当箇所でBreakされた状態になります。

例えばこのようなコードがあった場合、`Pause on Exception`を有効にしていれば`a.a();`の部分と`a.b()`の部分でBreakされデバッガーが起動します。

```html
<html>
  <head>
    <script type="text/javascript" charset="utf-8">

      var onFail = function() {
        a.a();
      };

      var onTryCactch = function() {
        try {
          a.b();
        } catch(e) {
          console.log(e);
        }
      };

    </script>
  </head>
  <body>
    <input type="button" name="" value="test1" onclick="onFail()">
    <input type="button" name="" value="test2" onclick="onTryCactch()">
  </body>
</html>
```


## Pause on Uncaugh Exceptionに関して
![kobito.1374294665.711486.png](https://qiita-image-store.s3.amazonaws.com/0/11214/0e977080-8229-1c17-4c97-2837f09f2177.png "kobito.1374294665.711486.png")の状態を指します。詳細は公式サイトの[Pause on Uncaugh Exception](https://developers.google.com/chrome-developer-tools/docs/javascript-debugging?hl=ja#pause-on-uncaught-exceptions) を確認してください。
簡単に言うと、`try…catch`で囲まれていない例外が発生した場合にDevToolが感知して該当箇所でBreakされた状態になります。

上記の例で言うと、`Pause on Uncaugh Exception`を有効にしていた場合、`a.a();`ではBreakされますが、`a.b()`ではBreakされません。

## というわけで

自分の場合は、デバッグする際には![kobito.1374294665.711486.png](https://qiita-image-store.s3.amazonaws.com/0/11214/0e977080-8229-1c17-4c97-2837f09f2177.png "kobito.1374294665.711486.png")の状態にしておいて、予期せぬ例外が発生した場合にすぐに気がつけるようにしてあります。
なお`try…catch`を検知しないようにしているのは、実装時に既に考慮しているため不要だからです。
try と try! の使い分け

ていうか try! って何よ。

```ruby
    a.try(:hoge)  #=> nil
    a.try!(:hoge) #=> NoMethodError
```

はーぁん、にゃーるほーどねー。

これ見て初めて気付いたのですが、 **「try メソッドには 2 つの効用がある」** のですね。

1. a が nil の時、何もしない
1. a に hoge が実装されてない時、何もしない

両方の効用を持つのが ```try```
1 つ目の効用しか持たないのが ```try!``` というわけです。

2 つ目の効用も便利っちゃあ便利ですが、メソッド名を typo するとわかりづらいバグになることもありそうです。
実際 try を使うときは、レシーバ (上の例で a ) が nil かどうかで使う 1 つ目の効用を利用したい場合が殆どだと思われるので、積極的に ```try!``` を使っていくといいかと思います。

http://apidock.com/rails/Object/try

# ruby2.3記念追記
rails にまず導入されたのが try で、その後、「NoMethodErrorを捕捉できないのは危険」ということで try! が rails4 から導入されたようです。そして、 ruby2.3 からは「ぼっち演算子」を try! の代わりに使うことができます。

```ruby
  a.try!(:hoge)
  #=>
  a&.hoge
```
NoMethodError を起こさない try と、ブロック渡す try は引き続き現役です。

言語仕様である `&.` と、単なるメソッドである `try!` にはもう一つ重要な違いアリ。
`&.` は nil を受け取るとその先の parsing を停止するので、引数を評価しません。

```ruby
c=0
nil&.to_s(c+=1) # cは0のまま
nil.try!(:to_s, c+=1) # cは1
```
Ubuntu LinuxでのQ4Mインストール → 失敗

実際にはLinux Mintで確認。
最後のテストで通らないので使い物にならない…MySQLをソースから入れなおしたほうがよいか?

```bash
$ cat /etc/lsb-release 
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=15
DISTRIB_CODENAME=olivia
DISTRIB_DESCRIPTION="Linux Mint 15 Olivia"
```


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

Q4Mビルド時にヘッダが足りないといわれるのでlibmysqlclient-devも入れておくとよいみたい。

```bash
$ sudo apt-get install mysql-server libmysqlclient-dev
```


## 2. MySQLのソースをダウンロード

Q4MのバイナリはMySQL5.1系のものしか配布されていないので自分でビルドする必要がある。
ビルドにはインストールされているMySQLと同じソースが必要である。

事前にGUI設定のソフトウェアソースでソースコードリポジトリを有効化しておくこと。

```bash
# パッチあてなどでいくつかファイルができるのでフォルダを切ってそこにダウンロードする
$ mkdir mysql
$ cd mysql
# mysql-5.5の代わりにmysql-serverを指定しても可
$ apt-get source mysql-5.5
$ ls 
mysql-5.5-5.5.31/
mysql-5.5_5.5.31-0ubuntu0.13.04.1.debian.tar.gz
mysql-5.5_5.5.31-0ubuntu0.13.04.1.dsc
mysql-5.5_5.5.31.orig.tar.gz
```


## 3. MySQLのビルド

ビルドして得られるバイナリはQ4Mのビルドに不要だが、
ソースを取得しただけではバージョン情報やエラーファイルが足りないためビルドを行う。
ビルドはcmakeを使って行う。
ncursesなどのライブラリが足りないとエラーが出た時は適宜Googleで調べて入れること。

Q4Mのビルド時に"include/mysqld_error.h"が必要となるが、これはcomp_errコマンドを使って生成する必要があるらしい。

```bash
$ sudo apt-get install cmake # CMakeをインストール
$ cd mysql-5.5-5.5.31
$ cmake .
$ make
$ cd extra
$ ./comp_err -H ../include/mysqld_error.h
```


## 4. Q4Mのビルド

ソースコードをダウンロードしてビルドする。
githubのものが最新版のようだが、masterの最新版はビルドにCMakeを使うようになっており、手順がドキュメントされていない。
そのためバージョン番号を切ってリリースされている最新のものを使うのがよい。

configure時の"--with-mysql"オプションは必須、フルパスでMySQLのソースを置いた位置を指定すること。

```bash
$ wget http://q4m.kazuhooku.com/dist/q4m-0.9.10.tar.gz
$ tar xvfz q4m-0.9.10.tar.gz
$ cd q4m-0.9.10
$ ./configure --with-mysql=/home/tune/src/mysql/mysql-5.5-5.5.31/
```

queue_config.hで定義されているQ4M_VERSION_HEXがビルドに必要だがなぜか読み込まれないのでsrc/ha_queue.ccの67行目と69行目をコメントアウトする

```cpp:src/ha_queue.cc
//#if MYSQL_VERSION_ID < 50500
#include "queue_config.h"
//#endif
```

その後ビルドしてインストール

```bash
$ make
$ sudo make install
```


## 5. AppArmorをオフにしてQ4Mを有効化する

MySQLのAppArmorに関する設定は" /etc/apparmor.d/usr.sbin.mysqld"にあり、
プラグインは自動的に読み込まれる設定になっているようだが、なぜか読み込まれなかった。
解決できなかったのでAppArmorを無効化して対処する。

```bash
$ sudo vi /etc/default/grub
# GRUB_CMDLINE_LINUXにapparmor=0を追加

GRUB_CMDLINE_LINUX="apparmor=0"

# /boot/grub/grub.cfgを更新して再起動する
$ sudo update-grub
$ sudo reboot
```

再起動後、Q4Mを有効化する。

```
$ mysql -u root -p -f mysql < support-files/install.sql

# MySQLにログインしてプラグインが表示されればインストールできている。
$ mysql -uroot -p
mysql> show plugins;
+--------------------------+----------+--------------------+--------------------+---------+
| Name                     | Status   | Type               | Library            | License |
+--------------------------+----------+--------------------+--------------------+---------+
| binlog                   | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
....
| partition                | ACTIVE   | STORAGE ENGINE     | NULL               | GPL     |
| QUEUE                    | ACTIVE   | STORAGE ENGINE     | libqueue_engine.so | GPL     |
+--------------------------+----------+--------------------+--------------------+---------+
24 rows in set (0.00 sec)
```

## 6. テスト

```bash
$ DBI_USER='root' DBI_PASSWORD='root password' DBI='dbi:mysql:database=test' ./run_tests.pl
```

でテストが通るはずなんだけどエラーが出まくる… orz
postach.io で日本語の記事名をつけつつ綺麗なURLに


みなさん、 [postach.io](http://postach.io/) 使ってますか？
Evernote 使ってる方なら是非お試しください。tumblr 代わりとかにも使えます。データが自分の手元に残るのがすごく安心感があって便利です。

postach.io を使い始めて最初にちょっと気持ち悪かったのが、タイトルに日本語を書くと、中国語読みの URL が付くって事ですね。
たとえば、「タピオカの茹で方」というエントリをアップしたら、  "tapiokanoru-defang" という URL になりました。平仮名カタカナを正しくローマ字にするくせに、漢字は chinese です。 pinyin です。まあ実際、漢字仮名まじりの日本語を alphabet 化するのは簡単ではないですし、仕方ないことかも知れません。

postach.io ではテンプレートを自由にコーディング出来るのですが、[文法は jinja2](http://docs.postach.io/page/custom-themes) でして、 python の文字列処理がある程度使えます。そこで、本文の1行目を表示上のタイトルということにすれば、実際のタイトルを純粋に URL のために使える、というわけです。
例えばデフォルトの theme では、以下のようになっています。

                        <h1>{{ post.title }}</h1>
                        <p class="muted">Posted on {{ post.created_at|format_date }}</p>
                        <hr />
                        {{ post.content }}

これを、以下のように書き換えます。

                        <h1>{{ post.content.split('\n')[0]|striptags }}</h1>
                        <p class="muted">Posted on {{ post.created_at|format_date }}</p>
                        <hr />
                        {{ post.content.split('\n')[1::]|join }}

post.content の1行目をタイトルの変わりに表示し、2行目以降を本文に表示するわけです。(python には ["hoge", "fuga"].join は無いので rubyist は注意な。自分がハマっただけだけどな。)

で、 Evernote のほうで記事を書く際に、 note title には平仮名だけで書いたり、英題をつけたりすれば OK.

ちなみに最初、 permalink のほうを urllib.quote_plus(post.title) とか出来ないかな？とか思ったんだが urllib が使えないようでエラー。ていうか書けたとしてもそのリンク無効でした冷静に考えて。

**postach.io の記事を Markdown で書くのに kobito が便利です!!!**
とっても簡単なCSRF対策

**【2021/10/15 追記】**
**この記事は更新が停止されています。現在では筆者の思想が変化している面もありますので，過去の記事として参考程度にご覧ください。**

CSRFおよびその対策の仕組みに関してはこちら↓

[これで完璧！今さら振り返る CSRF 対策と同一オリジンポリシーの基礎 - Qiita](https://qiita.com/mpyw/items/0595f07736cfa5b1f50c)

この記事は，PHPにおけるワンタイムトークンを用いた実装例を示すものです。執筆日が少々古いものになるのでご了承ください。

# コメント欄の議論に関するまとめ

以下，**XSS脆弱性が存在しない**前提．この脆弱性があるとあらゆるCSRF対策がほとんど意味をなさなくなるので，まずここから潰しておくこと．

## セッション固定攻撃に対する対策

- ログイン後に`session_regenerate_id`を必ず実行する．
- ログアウト後に`session_destroy`を必ず実行する．

## CSRF攻撃に対する対策

- セッションIDを抜かれることは原則的には無いが，セッションIDをそのままトークンに用いるのは避けたほうが無難．
- ワンタイムトークンにはF5リロードでの誤作動を防止する意味合いもあるが，必ずしもワンタイム性が求められるわけではない．固定トークンでも十分なセキュリティは保証される．
- トークンによる対策が施されていない場合，GETであってもPOSTであってもCSRFは実行可能なので，それは議論の対象ではない．

# 実装

以前はワンタイムトークン推奨にしていましたが，意向が変わってきたので固定トークンのサンプルに差し替えておきます．

```php:クラス定義
class CsrfValidator {

    const HASH_ALGO = 'sha256';

    public static function generate()
    {
        if (session_status() === PHP_SESSION_NONE) {
            throw new \BadMethodCallException('Session is not active.');
        }
        return hash(self::HASH_ALGO, session_id());
    }

    public static function validate($token, $throw = false)
    {
        $success = self::generate() === $token;
        if (!$success && $throw) {
            throw new \RuntimeException('CSRF validation failed.', 400);
        }
        return $success;
    }

}
```

# 使い方

```php:フォームに埋め込むとき
<input type="hidden" name="token" value="<?=CsrfValidator::generate()?>">
```

```php:検証するとき(返り値チェックタイプ)
<?php

if (!CsrfValidator::validate(filter_input(INPUT_POST, 'token'))) {
    header('Content-Type: text/plain; charset=UTF-8', true, 400);
    die('CSRF validation failed.');
}

// 続きの処理

?>
<!DOCTYPE html>
...
```

```php:検証するとき(例外タイプ)
<?php

try {

    CsrfValidator::validate(filter_input(INPUT_POST, 'token'), true);
    
    // 続きの処理…

} catch (\RuntimeException $e) {

    header('Content-Type: text/plain; charset=UTF-8', true, $e->getCode() ?: 500);
    die($e->getMessage());

}

?>
<!DOCTYPE html>
...
```
php から確実にメール送信（Qdmail使用、SMTP経由）

phpから mail() や mb_send_mail() で、メールを送ると・・・
迷惑メールに分類されたり、SPAMとしてブロックされて届くことすらなかったり、なかなかうまくいきません。

確実にメールを届けるには、面倒ですが実際につかっているSMTPサーバー経由でメール送信するのが、もっとも有効。ということで、その方法です。

###準備
1. 送信用のメールアカウントを用意。ほとんどのサーバー業者の提供するSMTPサーバーは認証が必要なはずなので、メールアカウントを作っておく。
1. Qdmail を [ここから](http://hal456.net/qdmail/downloads) ダウンロードする。
1. Qdsmtp を [ここから](http://hal456.net/qdsmtp/download) ダウンロードする。

###コード

```php:PHP
//Qdmailをロード
require_once('qdmail.php');
//Qdsmtpをロード
//（ドキュメントには、記述不要とかいてあるが、書かないとうまくいかないことがあった）
require_once('qdsmtp.php');

//メール送信関数
// $to：送信先メールアドレス
// $subject：件名（日本語OK）
// $body：本文（日本語OK）
// $fromname：送信元名（日本語OK）
// $fromaddress：送信元メールアドレス
function mailsender($to,$subject,$body,$fromname,$fromaddress){
	//SMTP送信
	$mail = new Qdmail();
	$mail -> smtp(true);
	$param = array(
		'host'=>'（SMTPサーバー名）',
		'port'=> 587 ,
		'from'=>'（Return-Pathにはいるメールアドレス）',
		'protocol'=>'SMTP_AUTH',
		'user'=>'（SMTP認証ユーザー名）',
		'pass' => '（SMTP認証パスワード）',
	);
	$mail ->smtpServer($param);
	$mail ->to($to);
	$mail ->subject($subject);
	$mail ->from($fromaddress,$fromname);
	$mail ->text($body);
	$return_flag = $mail ->send();
	return $return_flag
}
```

補足

* SMTPサーバーの制約によっては、送信元メールアドレスが別ドメインだと蹴られる可能性あり。
* SMTPサーバー経由でのメール送信数に制限があるサーバー業者が多いので注意。

###参考
http://hal456.net/qdmail/smtp
Emacs24 のテーマフレームワークを使おう


Emacs で見た目を変えるときは color-theme を使うのが一般的でしたが、Emacs24 からテーマフレームワークが提供されたので、そちらを使っていきましょう。

# プリインストールされているテーマを使う
いくつかテーマが提供されているのでそれを使う方法です。
非常に簡単です。たった一行 `~/.emacs.d/init.el` や `~/.emacs` に以下を追加するだけです。

```lisp:~/.emacs.d/init.el
(load-theme 'theme-name t)
```

この方のブログにいくつかスクリーンショットがのってるので参考にするといいです。
[Emacs24に最初から同梱されているテーマ](http://d.hatena.ne.jp/aoe-tk/20130210/1360506829 "Emacs24に最初から同梱されているテーマ")

# カスタマイズしたテーマを使う
カスタマイズしたテーマを使う方法です。
こちらを参考にさせて頂きました。が、ちょっとつまづいたのでポイントをかいつまんでおきます。
[Emacs 24以上を使うなら color-themeではなく、Emacsの themeフレームワークを使おう](http://d.hatena.ne.jp/syohex/20121211/1355231365 "Emacs 24以上を使うなら color-themeではなく、Emacsの themeフレームワークを使おう")

## カスタマイズされたテーマの設置場所
カスタムテーマは `~/.emacs.d/themes` に保存します。またカスタムテーマの名前は `foobar-theme.el` とします。

## カスタムテーマをロードする
カスタムテーマを使いたいときは `~/.emacs.d/init.el` に以下の2行を書いておけば大丈夫です。

```lisp:~/.emacs.d/init.el
(setq custom-theme-directory "~/.emacs.d/themes/")
(load-theme 'foobar t)
```

以上です。
VirtualBoxの仮想マシンフォルダ変更手順メモ

#はじめに
VirtualBoxの仮想マシンフォルダに指定していたドライブ容量が逼迫してきたため、仮想マシンフォルダを他のドライブに移動した。そのときの手順メモ。

#試した環境
- Windows 7 64bit
- VirtualBox version 4.2.8

#新規作成する仮想マシンのフォルダ変更
以下のとおり、環境設定を変更する。

* 1. メニューバーの「ファイル(F)」を選択
* 2. メニューアイテムの「環境設定（P）」を選択
* 3. 一般タブのデフォルトの仮想マシンフォルダー(通常は・・・・/VirtualBox VMs)を新しいフォルダに変更
* 4. OKボタンで決定

#既存（作成済み）仮想マシンのフォルダ変更
##真面目にやると
VirtualBox VMsフォルダ内の対象仮想マシン名フォルダ以下を移動先にコピペして、VirtualBox上で仮想マシンを作り直す、というやり方で上手く行った。
（公式の手順かはわからないが、少なくと試している限りはうまくいっている。）

手順は以下のとおり。

* 1. 対象仮想マシンを電源オフ（※1）する。
* 2. VirtualBox VMsフォルダ内の対象仮想マシン名フォルダ以下をまるごと移動先にコピペする。
* 3. 対象仮想マシンを除去する。除去しようとすると、「仮想マシンを構成するファイルをハードディスクから削除しますか？」と聞かれる。選択肢「すべてのファイルを削除」と「除去のみ」のうち、ここでは後者を選ぶ（※2）。
* 4. メニューバーで「ファイル(F)」→「仮想メディアマネージャー（A）」と選択。
* 5. 対象仮想マシンのvdiイメージを除去する。除去しようとすると、ダイアログが出て除去して良いか聞かれるが、「除去」を選択。さらに次のダイアログで.vdiファイルを削除するか聞かれるので、ここでは「保持」を選択。(※2) 
* 6. メニューバーで「仮想マシン(M)」→「追加（A）」と選択。仮想マシンファイルを選択するダイアログで、移動先のフォルダ以下の.vboxファイルを選択する。
* 7. 追加に成功すると一覧に対象マシンが復活するので、起動して動作を確認する。
* 8. 問題なければ、旧フォルダ以下のファイルを削除する。

(※1) 試した限りでは、電源オフ状態でなく保存状態でも問題なく移動できた。
(※2) 「削除」を選んでも良いが、移動失敗時の復元用に念のため。


##面倒くさいので手抜きすると
別の手段でドライブのバックアップなどをとっている場合には、いちいちバックアップするのは面倒。
そういう場合には、仮想マシンを停止した状態でフォルダ以下を移動すると、多少手間が減る。

手順は以下のとおり。

* 1. 対象仮想マシンを電源オフ（※1）する。
* 2. VirtualBox VMsフォルダ内の対象仮想マシン名フォルダ以下をまるごと移動先に移動する。
* 3. 対象仮想マシンを除去する。
* 4. メニューバーで「仮想マシン(M)」→「追加（A）」と選択。仮想マシンファイルを選択するダイアログで、移動先のフォルダ以下の.vboxファイルを選択する。
* 5. 追加に成功すると一覧に対象マシンが復活するので、起動して動作を確認する。
hashchangeイベントとscrollYの不思議な挙動

hashchangeイベントで取得した`window.scrollY`および`window.pageYOffset`など、現在のスクロールの値が期待とだいぶ違う。

* * *

[デモ](http://jsbin.com/ocoxor/1)


1. ハッシュチェンジしてください
2. 適当にスクロールしてください
3. ボタンをクリックして現在のスクロール値を参照してください
4. ブラウザの「戻る」をします
5. 再取得するので、現在のスクロール値を参照するはずがハッシュチェンジ以前の値を取得します
6. ブラウザの「進む」をします
7. さきほど「戻る」をした瞬間のスクロール値が取得されます
8. ...なぜだろう

* * *

```coffeescript:
$ ->
  $input = $('input')
  
  $('button').on 'click', ->
    $input.val window.pageYOffset # => 現在のscrollY
    
  $(window).on 'hashchange', ->
    $input.val window.pageYOffset # => hashchangeする前のscrollYが返される
    window.scrollTo 0, 0
```

* * *

## ...なぜだ？！

ChromeでもFirefoxでも同じだったから仕様っぽい。

hashchangeでも現在のきちんとした値を取得したいのだけど、無理なんだろうか。。。
「第8回オフラインリアルタイムどう書くの問題」をPHPで解く

http://qiita.com/Nabetani/items/709d61dff282cff7a890
http://nabetani.sakura.ne.jp/hena/ord8biboma/

ボンバーマンで爆風が到達する場所を図示せよというお題。

解ける人はたぶんビット演算とかでずばしゃー！と解くのでしょうけど、私はそのあたりがよくわからないんですよね。
なので懇切丁寧に、2次元表になおすという人間に優しい解き方をしてみようと思います。

```php:
<?php

	class BOMBERMAN{
	
		/**
		* 爆風の範囲を返す
		* @param  String 「802b1200/01400c20」みたいな文字列
		* @return String 「53c40cfc」みたいな文字列
		*/
		public function get($input){
			
			// 入力値を2次元表に分解
			$array = explode('/', $input);
			$wall = str_split(substr(str_pad(base_convert($array[0], 16, 2), 32, '0', STR_PAD_LEFT), 0, -2), 6);
			$bomb = str_split(substr(str_pad(base_convert($array[1], 16, 2), 32, '0', STR_PAD_LEFT), 0, -2), 6);
			
			// 爆風の位置
			$blast = $bomb;
			
			// 爆弾の行でくるくる
			foreach($bomb as $key=>$val){
				// 爆弾の列でくるくる
				for($i=0; $i<strlen($val); $i++){
					// 爆弾があれば爆発
					if($val[$i] === '1'){
						$this->explosion($blast, $wall, $key, $i);
					}
				}
			}
			
			// 16進数に戻す
			return str_pad(base_convert(implode('', $blast) . '00', 2, 16), 8, '0', STR_PAD_LEFT);
		}
		
		/**
		* ば　く　は　つ　するーーー!
		* @param &array 爆風が通った場所が1になる
		* @param array 壁
		* @param int 列
		* @param int 行
		*/
		private function explosion(&$blast, $wall, $column, $row){
			// 行を1埋め
			$key1 = $key2 = $row;
			// 右に
			while(@$wall[$column][$key1] === '0'){
				$blast[$column][$key1++] = '1';
			}
			while(@$wall[$column][$key2] === '0'){
				$blast[$column][$key2--] = '1';
			}
			// 列を1埋め
			$key1 = $key2 = $column;
			while(@$wall[$key1][$row] === '0'){
				$blast[$key1++][$row] = '1';
			}
			while(@$wall[$key2][$row] === '0'){
				$blast[$key2--][$row] = '1';
			}
		}
		
	}
	
	// テスト
	$test = [
		['802b1200/01400c20', '53c40cfc'],
		/* 省略 */
	];

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

爆弾と壁と爆風の表も別々にする必要がなく、値を1,2,4とかにすれば1枚で済むのですが、<strike>面倒なので</strike>わかりやすくするために別にしています。
実際計算中の値は以下のようになっており、

```php:
$wall = array(5) {
  [0]=>  string(6) "100000"
  [1]=>  string(6) "000010"
  [2]=>  string(6) "101100"
  [3]=>  string(6) "010010"
  [4]=>  string(6) "000000"
}
$bomb = array(5) {
  [0]=>  string(6) "000000"
  [1]=>  string(6) "010100"
  [2]=>  string(6) "000000"
  [3]=>  string(6) "001100"
  [4]=>  string(6) "001000"
}
$blast = array(5) {
  [0]=>  string(6) "010100"
  [1]=>  string(6) "111100"
  [2]=>  string(6) "010000"
  [3]=>  string(6) "001100"
  [4]=>  string(6) "111111"
}
```

実に人間に優しい形で確認することができます。
かかった時間は3時間くらい。
ビット演算はわかんないとか言いつつ実際やってみようと延々挑戦したあげく挫折したとかいう歴史があったりなかったり。

なおgmp_scan1()とかの使いどころを探してみたがちょっと無理だった。
CSRF対策にクッキーを利用するトークン

CSRF対策にクッキーを利用する場合の具体的なコードをメモ
スマーティ使ってる仮定で。
以下コード

```php
if(一回目のアクセス){
	$value = md5(uniqid() . mt_rand()); //$value にランダムな値をセット
	$setcookie = ("name", $value);  //nameという名前,$valueが値のクッキーをセット
	$tpl->assign( "value", $value);  //テンプレート側に$valueを渡す
}
elseif("二回目のアクセス"){
	$getPost = http_getPOST("value");  //POSTで一回目で渡した$valueを受け取る
	//POSTで受け取った値とクッキーにセットした値が一緒であれば処理を続ける
	if($value == $_COOKIE["name"]){
		/* やりたい処理 */
	}
}
```
HTMLのレイアウト表示をアニメーションで演出するjQueryプラグインを作成しました

HTMLを表示する際に、各パーツごとに左右からビューン、とか上からドスーンみたいなアニメーションを指定できるjQueryプラグインです。って言ってもイミフだと思うのでとりあえずデモをご覧ください。

__[BootStrapのレイアウトを使用したデモ](http://ktty1220.github.io/jquery.lively-layout/demo.html)__

[jQuery Easing Plugin](http://gsgd.co.uk/sandbox/jquery/easing/)を使用したダイナミックなアニメーションや回転しながらの移動をサポートしています。IE7以上で動作します(回転はIE9以上)。

こんな感じで呼び出します。

```js:サンプル
// アニメーション設定
var config = [{
  element: 'footer',
  from: { right: -1 },
  easing: 'easeOutBounce',
  wait: false
}, {
  element: '.sidebar-nav',
  from: { left: 100, top: 20, color: '#ff0000' },
  easing: 'easeOutBounce',
  complete: function (defaultPosInfo, startCss) {
    $(this).addClass('loaded');
  },
  wait: true
}, {
  element: '.navbar',
  from: { top: -1 },
  rotate: { rev: 3, type: 'X', direction: 'left' },
  easing: 'easeOutBounce',
  wait: false,
  delay: 100
}];

// アニメーション実行
$.livelyLayout(config, function () {
  // アニメーション完了
  alert('complete');
});
```

詳しい設定内容などは[GitHubのリポジトリ](https://github.com/ktty1220/jquery.lively-layout)に記載しています。

ダウンロードは[こちら](https://github.com/ktty1220/jquery.lively-layout/archive/master.zip)からどうぞ。
UTF-8を想定して、不正なバイト列が含まれていないかを1行でチェックする

```php
function validate_utf8($input) {
    return (bool)preg_match('//u', $input);
}
```

あら簡単。

**え？ホントにこれだけで大丈夫なの？**
って思う人も多いと思うので（というか私も最初そう思ったので）、検証してみます。
<ins>（追加したほうがいいテストケースがあればコメントください）</ins>

```php:テスト用関数
function test($input) {
  
  $output = htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
  $code = str_replace('%', '\\x', rawurlencode($input));
  
  if (validate_utf8($input)) {
      echo "【{$output}】({$code}) は有効なUTF-8シーケンスです。\n";
  } else {
      echo "({$code}) は無効なUTF-8シーケンスです。\n";
  }
 
}
```

```php:テストケース
<?php
test("☝( ◠‿◠ )☝");
test("ゔ〲〰");
test("\x0a\x92\xff"); // てきとー
test("\xef\xbb\xbf"); // BOMだっけ
test(""); // 空文字列

echo "\n";

test("\x2f"); // スラッシュ(1バイト)
test("\xc0\xaf"); // スラッシュ(冗長2バイト)
test("\xe0\x80\xaf"); // スラッシュ(冗長3バイト)
test("\xf0\x80\x80\xaf"); // スラッシュ(冗長4バイト)
```

```text:結果
【☝( ◠‿◠ )☝】(\xE2\x98\x9D\x28\x20\xE2\x97\xA0\xE2\x80\xBF\xE2\x97\xA0\x20\x29\xE2\x98\x9D) は有効なUTF-8シーケンスです。
【ゔ〲〰】(\xE3\x82\x94\xE3\x80\xB2\xE3\x80\xB0) は有効なUTF-8シーケンスです。
(\x0A\x92\xFF) は無効なUTF-8シーケンスです。
【﻿】(\xEF\xBB\xBF) は有効なUTF-8シーケンスです。
【】() は有効なUTF-8シーケンスです。

【/】(\x2F) は有効なUTF-8シーケンスです。
(\xC0\xAF) は無効なUTF-8シーケンスです。
(\xE0\x80\xAF) は無効なUTF-8シーケンスです。
(\xF0\x80\x80\xAF) は無効なUTF-8シーケンスです。
```

おー空文字列のときでも大丈夫なのか！
冗長表現もちゃんと弾いてる！

**u修飾子** すごい。

発展型
--------

```php:リソース型以外ならばなんでも判定できるようにしたバージョン(可変長引数対応)
function validate_utf8() {
    return (bool)preg_match('//u', serialize(func_get_args()));
}
```

まだまだPHP捨てたもんじゃない！！！
setcookieでセットしたCOOKIEを$_COOKIE["name"];で呼べるタイミング

setcookieでクッキーをセットした場合、

直後に$_COOKIE["name"]でクッキーを呼ぶことはできない

具体的には、

setcookie("name",$value);

$_COOKIE["name"];

のように記述しても$_COOKIE["name"]には値は入らない。
GruntのClosureCompileプラグインで使いやすいのはどれだ

GruntでClosureCompileしてみようと思ったら公式サイトだけでもプラグインがいっぱいあったので
どれが使い勝手が良さそうか実際に使って検証してみた。
（一応公式サイトに載ってたのだけ。他は探してない。）

# grunt-closure-tools


https://npmjs.org/package/grunt-closure-tools

## Good
- consoleに実際に実行したコンパイルコマンドが表示される
- compiler.jarの配置場所に制限なし
- 公式にはsrc/destで書いてあるけどfiles:{}でやれば複数src/destが書ける

## Bad

## console

```
Running "closureCompiler:main" (closureCompiler) task
Executing: java  -jar ./build/compiler.jar  --js js/CobitSDK.js --js js/CobitSDK/apiBase.js --js_output_file=build/closure-tools.min.js --compilation_level ADVANCED_OPTIMIZATIONS --externs ./externs.js --summary_detail_level 3
0 error(s), 0 warning(s)

Command complete for target: main

Done, without errors.
```

# grunt-closure-compiler

https://npmjs.org/package/grunt-closure-compiler

## Good
- consoleにコンパイル後のファイルサイズが表示される（と思ったけどgzipってどういうこと？）

## Bad
- compiler.jarの配置場所に少し制限がある（**/*/build/以下に配置しなきゃだめぽい）

## console

```
Running "closure-compiler:main" (closure-compiler) task
Compressed size: 0.75 kb gzipped (773 bytes).

Done, without errors.
```


# grunt-closurecompiler


https://npmjs.org/package/grunt-closurecompiler


## Good
- コンパイル後のファイルサイズ出る
- コンパイル前／後のファイル名がコンソールに表示される
- files:{}で複数src/destが指定できる
- このpluginをインストールするとcompiler.jarも一緒にインストールしてくれるので別途準備する必要がない(node_module/以下のちょっと深いところに配置されるけど、compiler.jarを意識しなくてもokなつくり)

## Bad


## console

```
Running "closurecompiler:minify" (closurecompiler) task

Compiling js/CobitSDK.js,js/CobitSDK/apiBase.js -> build/closurecompiler.min.js
>> 0 error(s), 0 warning(s)
>> Complete: 2002

Done, without errors.
```

# Pluginファイルサイズ
drwxr-xr-x  10 toru.furuya  INTRA\Domain Users   340B  7 19 16:07 grunt-closure-compiler
drwxr-xr-x  18 toru.furuya  INTRA\Domain Users   612B  7 19 20:45 grunt-closure-tools
drwxr-xr-x  13 toru.furuya  INTRA\Domain Users   442B  7 19 21:32 grunt-closurecompiler


結論、自分的には3番目のgrunt-closurecompilerが一番かなと。
AIRで作ったAndroidアプリが端末にインストール出来ないとき


AIRで作ったAndroidアプリが端末にインストール出来ないときは

```zip.sh
zip -d app.apk res/drawable-xhdpi/icon.png
```

で解決するかもしれない。

```
Failure [INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING]
```

こういうエラーが出ていた時に、これでインストールできるようになった。

---

[追記]
けど、アイコンが表示されなくなっちゃったので、以下を実行して入れなおしてみる。

```zip.sh
mkdir -p -v tmp
mkdir -p -v res/drawable-xhdpi
unzip -o app.apk -d tmp
cp -f tmp/res/drawable-xhdpi/icon.png res/drawable-xhdpi
zip -d app.apk res/drawable-xhdpi/icon.png
zip -u app.apk res/drawable-xhdpi/icon.png
rm -rf res
rm -rf tmp
```

AIRで書きだすと
上記同名のファイルが2つ入ってしまうのが問題らしいので
1つにしてやることで解消。
node.jsでjsonファイルの読み込み

今までテキストファイルとして読み込んで、 JSON.stringifyでいちいちパースしていたけれど、requireで読み込めばいいだけだった orz


```js:
var json = require('./test.json');
console.log(json);
```

※ このやり方で大量のJSONデータを読み込むとメモリーリークを起こす場合があるそうです。詳しくはコメント欄を参照してください。
Linuxで1日あたりのデータ送受信量を算出する方法



## 1. 今までに送受信したバイト数を求める

`ifconfig` コマンドで調べる:

```
ifconfig eth0
```


```
eth0      Link encap:Ethernet  HWaddr **:**:**:**:**:**  
          inet addr:***.***.***.***  Bcast:***.***.***.***  Mask:255.255.255.0
          inet6 addr: ****::****:****:****:****/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:52041393515 errors:0 dropped:0 overruns:0 frame:0
          TX packets:43058710548 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:7319618510115 (7.3 TB)  TX bytes:50480592202458 (50.4 TB)
          Interrupt:20 
```

ここの `RX bytes:7319618510115 (7.3 TB) ` がOSを起動してから受信した合計バイト数、 `TX bytes:50480592202458 (50.4 TB)` がOSが起動してから送信した合計バイト数。

## 2. OSが起動してからの経過時間を調べる

`uptime` コマンドで調べる:

```
uptime
```

```
 18:14:30 up 292 days, 18:25,  2 users,  load average: 0.36, 0.34, 0.33
```

ここの `292 days` が経過日数。

## 3. 送受信量を経過日数で割る

```
受信: 7.3 TB / 292 = 25.6 GB日
送信: 50.4 TB / 292 = 176.7 GB日
```
Mac の libedit に死んでもらう

```bash:
ruby -rreadline -e "puts Readline::VERSION"
# EditLine wrapper
```

...

```bash:
brew install readline
brew link readline --force
rbenv install 2.0.0-p247
rbenv global 2.0.0-p247
rbenv rehash
ruby -rreadline -e "puts Readline::VERSION"
# 6.2
```

うむ
DBus での BUS  一覧の取得方法

# はじめに
DBus での BUS  一覧の取得方法について

# BUS 一覧の取り型
d-feet を使うのが手っ取り早いです。GUI で system  バスと session バスの一覧が閲覧できます。
https://wiki.gnome.org/DFeet

dbus-send を使った方法以下。

- system バス一覧取得

    dbus-send --system --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames

- session バス一覧取得方法

    dbus-send --session --dest=org.freedesktop.DBus --type=method_call --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames

# おわりに
日本語の DBus の情報が少なすぎる。

# 参考文献
http://unix.stackexchange.com/questions/46301/a-list-of-available-dbus-services
Management StudioでSQL整形（外部ツールを利用）

「Microsoft SQL Server Management Studio」は標準でSQLのコード整形を持っていない？
外部ツールを連携すると、Management Studio上でコード整形できます。

# 環境
* SQL Server 2012 Developer Edition
* SQL Convert (SQL整形) Ver1.0.4.5

# 事前準備

* SQL整形ツール「SQL Convert (SQL整形)」を下記のサイトからダウンロードして、  
利用できる状態にしておきます。  

> [SQLConvert](http://www.geocities.jp/rgyxd366/)

# Management Studioでの利用設定

## 外部コマンドの登録
* メニュー「ツール＞外部ツール」を開く。
* 新規で下記の情報を登録する。  
タイトル：任意　例）SQLConvert  
コマンド：SQLConvert.exeまでのパス　例）C:\Program Files\SQLConvert_1_0_4_5\SQLConvert.exe  
引数：$(ItemPath),1  
* 「OK」を押す。

## ツールバーへ登録
* メニュー「ツール＞カスタマイズ」を開き、「コマンド」タブを選択する。
* 「ツールバー」を選択し、ドロップダウンから「SQL エディター」を選択する。  
* 「コマンドの追加」ボタンを押し、カテゴリから「ツール」、コマンドから「外部コマンド1」を選択して「OK」を押す。
* カスタマイズダイアログを「閉じる」。
　→ツールバー「SQL エディター」に「SQLConvet」ボタンが追加される。

## SQLの整形
* 新しいクエリを開いて、SQLクエリを書く。
* クエリをいったん保存する。
* 先の手順で追加した「SQL Convert」ボタンを押す。
* 「再度読み込みますか？」というメッセージが出るので、「OK」を押す。

## ところで・・・
外部ツール登録は便利ですが、下記の手順の方が早いかもしれないですね・・・。

* 「SQL Convert」を起動しておく。(GUIとして）
* 整形したいSQLをクリップボードにコピーする。
* SQL Convertの「実行」を押す。
* Management Studioにペーストする。
Tools to boost office work and development

# 専用ツール

## CSVファイルの確認と編集
- [CSV編集ソフト（CS Editor 3）のご紹介](http://www.miyab.com/softced3.html)

## ファイル差分(Diff)ツール
- [WinMerge](http://winmerge.org/)

## Javaのデコンパイル
- [Java Decompiler](http://java.decompiler.free.fr/)
スーパークラスのメソッドを上書きして返り値の型を狭め、キャストを不要にする

あるメソッドの返り値の型が事前に分かっている型よりも“広い”ために、わざわざキャストをしなければならないことがある。

たとえば、`-[NSDocumentController sharedDocumentController]` メソッドは、通常 `NSDocumentController` 型のオブジェクトを返すにもかかわらず、返り値の型が `id` になっている。また、 `NSWindowController` の自前のサブクラスにおいて、 `NSWindow` のサブクラスを扱うことが分かっているのに、 `-window` メソッドの返り値の型が `NSWindow` のままになっているということもあるだろう。これらのメソッドの返り値を扱うにはダウンキャストが必要になり、煩わしい：

```objc:
[(NSDocumentController *)[NSDocumentController sharedDocumentController] newDocument:self];

[[(MyWindow *)[myWindowController window] myWindowMethod];
```

このような場合、サブクラスで同名のメソッドを宣言することで返り値の型を狭めることができる（実装は不要）：

```objc:
@interface MyDocumentController : NSDocumentController

// + (id)sharedDocumentController から返り値の型を狭める
+ (instancetype)sharedDocumentController;

@end

@interface MyWindowController : NSWindowController

// - (NSWindow *)window から返り値の型を狭める
- (MyWindow *)window;

@end
```

型を狭めることでダウンキャストが不要になる：

```objc:
[[MyDocumentController sharedDocumentController] newDocument:self];

[[myWindowController window] myWindowMethod];
```

このように、サブクラスはスーパークラスから継承したメソッドの返り値や引数の型を変えることができる。ただし変更後の型は変更前の型のサブクラスでなければならない。

なお、既存のクラスにカテゴリを追加してメソッドの型を変えようとしても効果はない：

```objc:
@interface NSApplication (TypeNarrowing)

// - (id<NSApplicationDelegate)delegate から返り値の型を狭めようとしても…
- (MyAppDelegate *)delegate;

@end

...

- (void)foo {
  // 返り値の型は id<NSApplicationDelegate> のまま
  [[NSApplication sharedApplication] delegate];
}
```
VirtualBox & Vagrant & Chef-solo 導入メモ

# VirtualBox & Vagrant & Chef-solo 導入メモ
+ ホストOS
	+ Mac OS 10.8.4
+ ゲストOS
	+ CentOSが入れたい。PHPの開発環境が必要になったから作りたい。

## VirtualBox
[公式サイト](https://www.virtualbox.org)からダウンロードした

## Vagrant
[公式ダウンロード](http://downloads.vagrantup.com)からダウンロードした

## Virtual BoxImage
[http://www.vagrantbox.es](http://www.vagrantbox.es)からダウンロードさせてもらう。今回は **CentOS 6.3 x86_64_minimal** を選択した。

## BoxImageの登録
1. `vagrant box add CentOS_6.3_x86_64_minimal *url* ` で登録
2. 適当なディレクトリを作成しその中に移動。`vagrant init CentOS_6.3_x86_64_minimal`で初期化
3. 作成された`Vagrantfile`の以下の部分を変更。共有フォルダ（つまりホストのMac）でソースは管理して、ゲストOSからその共有ホルダを見に行く構成にしてみた。今回はApacheとPHPのため、`/var/www/html`を使っている。

	```ruby:Vagrantfile
	config.vm.network :private_network, ip: "192.168.33.10"
	config.vm.synced_folder "../www", "/var/www/html", :extra => "dmode=777,fmode=666"
	```

4. `vagrant up`で起動
5. `vagrant ssh`で接続
	
## ホストOS(Mac)のSSH設定変更
Chef-soloを使うには、`ssh 192.168.33.10`コマンドで、何も聞かれずにSSHログインできないといけないらしい。以下の設定を`~/.ssh/config`に追加する。

```
Host 192.168.33.*
    IdentityFile ~/.vagrant.d/insecure_private_key
    User vagrant
```
	
## Vagrantインストール
gemでもインストールしてみたけど、バージョンがかなり古かったから、結局[Vagrant公式サイト](http://www.vagrantup.com)からインストールした。

## Chef-soloインストール
1. これはgemから。ただそのままだとこれまたバージョンが古いので、`gem install chef-solo --pre`で新しいヤツをクレと要求する。
2. `knife configure`で設定。色々聞かれるけど、全部初期値（リターン押しまくり）でOKっぽい。

## Chefのレシピとか
1. Chefのレシピを入れるリポジトリ。まだ良くわかってないので、とりあえず一つのリポジトリ（＝ディレクトリ）で全部を管理してみようと思う。
2. `knife solo init chef-repo`でリポジトリを作成。現在のディレクトリに`chef-repo`というディレクトリができて、その下になんだかファイルがたくさんできる。
3. `knife solo prepare 192.168.33.10`で初期化。`knife solo init 192.168.33.10`もやったかもしれないし、やってないかもしれない。忘れた。やっておけばいいと思う。
4. `knife cookbook create seezoo -o site-cookbooks`で、[seezoo](http://seezoo.org)用のCookbookを作った。そう。今回はこの国産CMSで、色々と試すためにやったんだ。それと`-o`オプションで出力ディレクトリ`site-cookbooks`を指定している。`cookbooks`ディレクトリは、インポートしたサードパーティ製のレシピなどを入れるといいらしい。

## さぁ！あとは試行錯誤だ！
ちなみに、sngmrはこんな感じになってます。`site-cookbooks`ディレクトリの`seezoo`ディレクトリを見てください。

**[https://github.com/sngmr/Chef-Repo](https://github.com/sngmr/Chef-Repo)**
MacPorts環境にTilemill 2をインストール


[Tilemill 2](https://github.com/mapbox/tm2)をそろそろ触ってみたかったのですが、[マニュアル](https://github.com/mapbox/tm2/blob/master/README.md)ではhomebrewを使うのを前提になっていたので、MacPortsでインストールしました。

まずはTilemill 2に依存するものをインストールします。

```shell
% sudo port install mapnik
% sudo port install nodejs
% sudo port install npm
% sudo port install protobuf-c
% rehash
```

homebrewとは違い、node.jsとnpmが別れてるのに気をつけて下さい。あと、僕はzshを使ってるので、最後にrehashしています。

あとはTilemill 2をインストールします。これは同じ手順ですね。

```shell
% git clone https://github.com/mapbox/tm2.git
% cd tm2
% npm install
% node index.js
```

今回、npm側でいくつか問題がありました。

1. npmで何かのダウンロードに失敗したのか、止まってしまう。
2. npmでビルドをしても、途中で止まったように見える

これは、何度かnpm installを実行して対処しました。なんだかなぁ...
【PHP】指定した日の週の週初めの日付を取得するロジック

指定した日の週の週初めの日付を取得するロジックですが、とりあえず週始まりを日曜日として考えています。

```php:getBeginningWeekDate.php
public function get_beginning_week_date($ymd) {
	# もし週始まりを月曜日にするなら、$w + 1　にすればいいはずです
	$w = date("w",strtotime($ymd));
	$beginning_week_date =
		date('Y-m-d', strtotime("-{$w} day", strtotime($ymd)));
	return $beginning_week_date;
}
```
はじめてのSinatra

プロジェクト作成

```
$ mkdir helloapp
$ cd helloapp
$ bundle init
```

Gemfile

```
source "https://rubygems.org"

gem "sinatra"
```

gemインストール

```
$ bundle install --path=vendor/bundle
```

```
$ touch myapp.rb
```

myapp.rb

```rb:
require 'sinatra'
get '/' do
    'Hello world!'
end
```

サーバ起動

```
$ bundle exec ruby myapp.rb
```

localhost:4567 をみる。
Hello world! と表示されていれば成功。
EGit使っていると.gitignoreがおっきくなるバグを回避する

EGitとGroovyプラグインを一緒にインストールすると.gitignoreファイルにビルド結果保存ディレクトリを無視する設定を追記し続けるバグが発生します。

このバグは、Groovyプラグインをインストールしなくてもたまに発生しますが、Groovyプラグインを入れると割と頻繁に追記するようになって困ります。

僕の場合、気が付くと/targetという行が30万行追記されていました。

以下のように、.gitignoreにプロジェクトが生成するファイルを追記する設定を外してください。

![ignoreProblem.png](https://qiita-image-store.s3.amazonaws.com/0/6829/c1834f86-d0b9-ad97-1d22-bb2eeb1d3df6.png)
ちょっとしたアーカイブやバイナリをcloud-initで配備する

AWSではファイル渡したいならS3経由とかで捗る感じですが、本当にちょっとしたものの場合は、そのためにバケット用意したり、S3アクセスできるキーを用意したりというのは非常に面倒です。

cloud-initはテキストベースですが、一応がんばればバイナリファイルを渡す事も出来ますので、そのやり方。

## 事前準備
### 渡したいものをアーカイブする
1つの場合はそのままでいいですが、複数ある場合は処理が面倒なのでtar等で適当にアーカイブしておきます。後々楽なので、ルート（/）からのアーカイブにするのがおすすめ。

```bash:archive_sample
cd /
tar cpvfj /tmp/archive.tar.bz2 /tmp/hello.txt
```

### ファイルをbase64エンコードする
cloud-initに入れるために、ファイルをbase64エンコードします。

```bash:encode_archive
base64 archive.tar.bz2 > archive.tar.bz2.b64
```

## cloud-initをつくる
先ほどのbase64エンコードしたテキストをcloud-initに入れて、それをデコード・解凍してファイルを配備できるようにします

参考
[cloud-initで設定ファイルをつくる](http://qiita.com/YamaguchiRei/items/91eed4186a814dd23765)

```yaml:cloud-init_sample
#cloud-config
# vim: syntax=yaml

repo_upgrade: all

runcmd:
  -
    - sh
    - -c
    - |+
      cat > /tmp/hostkey.tar.bz2.b64 <<EOF
      QlpoOTFBWSZTWZrk4+cAAIH7hMoQAFBgAf2ACABiRt5AAACACCAAdBpPVMgGg0NDRptQSUJoDQ0A
      DQJfMgxqEE8wCRdGgjSPIMSQNVrR0mu6JPyoASNgGjy0hzIkMOUWmskiEgvXg9DmDYQE53yo5WL9
      RX3IiAfi7kinChITXJx84A==
      EOF
  - [sh, -c, "base64 -d /tmp/archive.tar.bz2.b64 > /tmp/archive.tar.bz2"]
  - [tar, xfj, /tmp/archive.tar.bz2, -C, /]
```

あとはこのcloud-initを使って普通にEC2インスタンスを作ってください。

## あとがき
スマートな方法ではないですが、ちょっとしたバイナリを入れちゃいたい要件があったので。。。
気がついたらNginx記事まとめてた。

## nginx タグを全部読んで逆引き作った

* [超シンプルな書き方](http://qiita.com/naoty_k/items/536e8b7ce25e2d30f5d1)
* [VirtualHost](http://shiken.infrabu.info/nginx/nginx%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%9B%E3%82%B9%E3%83%88%E8%A8%AD%E5%AE%9A/)
* [VirtualHostに正規表現を使う](http://qiita.com/semind/items/195102661a3b6ccb91dd)
* [Nginxでバーチャルドキュメントルート](http://qiita.com/semind/items/18322effee888306432f)
* [NginxでWebDavの設定例](http://qiita.com/semind/items/24020a4fe436e435aa4e)
* [basic認証](http://qiita.com/minodisk@github/items/90c6d6cd8f16c34ac10b)
* [basic認証、ssl設定](http://n.blueblack.net/articles/2012-10-21_01_nginx_ssl_and_basic_auth/)
* [ssl 設定](http://dogmap.jp/2011/05/10/nginx-ssl/)
* [https](http://dogmap.jp/2011/06/15/nginx-ssl-fastcgi-phpmyadmin/)
* [パスフレーズなし秘密鍵](http://qiita.com/kadoppe/items/b17bf60337ebb18f00e8)
* [指定していないserver_nameのとき404を出すようにする](http://qiita.com/T_Hash/items/e3c74cdd4481118a1894)
* [NginxでPC,スマートフォンごとにrootディレクトリを変更する方法](http://qiita.com/semind/items/21a0786fa48add3754db)
* [gzip圧縮](http://qiita.com/semind/items/a196b43ae5a343095142)
* [Nginxでフィーチャーフォンからのアクセスの場合専用サイトにリダイレクトする方法](http://qiita.com/semind/items/51c190f3ab1141e28552)
* [mod_rewrite](http://qiita.com/shiftky@github/items/6bda0ba6a9e697361e7f)
* [リバースプロキシ](http://qiita.com/tomo_watanabe/items/484aa9bfb7bc4206ffed)
* [nginxで404の時だけ別サーバから取得してくる](http://qiita.com/hogelog/items/812c028888c1b460f426)
* [redmineをnginx+unicornで動かす](http://n.blueblack.net/articles/2012-07-29_01_nginx_unicorn_redmine_02/)
* [同上](http://qiita.com/suin/items/c172b6d3f952aa686625)
* [nginxでサービスモードとメンテナンスモードを切り替える](http://qiita.com/la_luna_azul/items/c17df8c68b51830e26ce)
* [チューニング](http://dogmap.jp/2013/04/16/sakura-vps-performance-tuning/)
* [ブラウザ言語設定別の静的ファイル配信](http://qiita.com/futoase/items/1f304a9e8fe850e7f92b)
* [nginx ドキュメント訳](http://neta.megumi-champloo.net/)
* [nginx の構成パターン](http://ja.ninjax.cc/configuration/)
* [nginxでperl](http://abeerforyou.com/?p=429)
* [nginxだけで画像リサイズして表示](http://cloudrop.jp/labs/nginx_image_filter)

# 設定

## ip制限

* [nginx でIP制限をかける - Qiita](http://qiita.com/i-horse@github/items/61b6d0c1aa949f2a7251)

```bash:
        location / {
                allow 127.0.0.1;
                allow xx.xx.xx.xx;
                deny all;
        }
```



## 処理の流れ

* OS => nginx(port:80) => php-fpm(port:9000) => response

## worker processの数の指定

```bash:/etc/nginx/nginx.conf
$ cat /proc/cpuinfo | grep processor | wc -l
```

## Apacheのいない環境で.htpasswdを作る

http://qiita.com/nsymtks/items/2dcd3bfe26d502db8676

* IDがfoo、パスワードがbarな.htpasswdを作るには、

```bash:
$ printf "foo:$(openssl passwd -crypt bar)\n" >> .htpasswd
```
HomeBrewを使用したPythonImagingLibrary(PIL)の導入

諸用でPILを使用する必要があったのでメモ
PILはPythonでお絵かき(画像生成，処理)するためのライブラリ

HomeBrewの導入法は割愛

PythonはMacにインストールされていたもの(HomeBrewで落としてない)

```bash:
brew install pil
ln -s /usr/local/Cellar/pil/1.1.7/lib/python2.7/site-packages/PIL /Library/Python/2.7/site-packages/PIL
```

Python側が使おうとしているところ(その方向にはなにもない)にPILがあるところをシンボリックリンク張る感じ？
インストールしただけではimport Imageとかが出来なかった。

実行チェック
Pythonを起動して

```py:
>>> from PIL import Image,ImageDraw
>>> img = Image.new('RGB', (200,200),(255,255,255)) # 200*200の白背景
>>> draw = ImageDraw.Draw(img) 
>>> draw.line((20,50,150,80),fill=(255,0,0)) # 赤い直線
>>> draw.line((150,150,20,200),fill=(0,255,0)) # 緑の直線
>>> draw.text((40,80),'Hello',(0,0,0)) # 黒文字
>>> img.save('test.jpg','JPEG')  # test.jpgとして保存
```

実行結果
![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/23755/ca6d879f-4f59-1bb4-7e26-d5624e136fa1.jpeg)
【質問です。ごめんなさい】みなさんRailsのセキュリティチェックってどうされてます？

タイトルの通り、ノウハウ共有じゃなくてただの質問です。
すみません。
ごめんなさい。

OKWaveとかStack Overflow行けって思った方。
その通りですね、でもQiitaのほうがノイズ少なそうなので...

**ここから本題！**

皆さんはRailsで構築したサービスのセキュリティチェックってどうされてますか？
特に商用の場合。

Railsはそんな数作ってないんで、セキュリティのことまで気が回ってませんでしたが、
個人的に商用にできるの1個作ってみようって思った時にセキュリティチェックどうしようって思いました。

ググって、Brakemanっていうgemで入れられるのは見つけましたが、
なんか他にいいのがあるんでしょうか？

Brakeman
http://brakemanscanner.org/

JenkinsやTravisみたいなCIツール・サービスで実行できるのが前提です。
オープンソースか、フリーか、格安なのがいいです。
軍資金は持ち出し(完全自腹)でやるんで
CoffeeScriptでメソッドのエイリアス的なことを実現する方法2つ

`a.coffee`

```coffeescript:
class A

  foo: (x) -> console.log "foo #{x}"

  bar: @::foo

  baz: -> @foo arguments...

a = new A

a.foo "one"
a.bar "two"
a.baz "three"
```

```
$ coffee a.coffee
foo one
foo two
foo three
```
PPAの利用を容易にするy-ppa-managerを使ってみよう

ubuntuは残念ながら用意している扱っているパッケージが古かったりします。
そこでPPAの出番です。

https://launchpad.net/ubuntu/
から検索してもヒットしないものもヒットするようです。

```bash:
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:webupd8team/y-ppa-manager && sudo apt-get update
$ sudo apt-get install -q -y y-ppa-manager
```

使い方

```bash:
$ sudo y-ppa-manager
もしくは
$ sudo y-ppa-cmd search
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2f805514-6064-1063-5e2c-45c01ef8a8db.png)

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/65956a1e-6e9a-1de9-9af1-d9e7a7ae5e39.png)

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/46e850df-457c-1170-647a-2ab22d9b1fdd.png)