OmniAICreator/Qiita-1.07M huggingface dataset:
【JavaScript】IE9以前でconsole.logを使用しているとハマる

##はじめに
FirefoxとかChromeなら問題ないがIEだと上手く動作しないとかはよくある話だと思う。その要因の一つであるconsole.log使用時のエラーに、つい最近ハマったのでメモしておく。

##対処法
そもそもなぜconsole.log使用時にエラーが出るのかといえば、IEがConsoleAPIに対応していないために、window.consoleの時点でundefinedを吐くからである。対処法としては、

```js
// consoleプロパティとlog関数作ってとりあえずエラー回避
if(!window.console) {
  window.console = { log: function(msg){} };
}
```

とか

```js
// ConsoleAPIに対応していないなら無視
if(window.console && typeof window.console.log === 'function') {
  console.log('hoge');
}
```
とか。
…まぁ、ちゃんとリリース時にconsole.logを消すのが一番良いのかもしれない。

##おわりに
console.logでのエラーのやっかいなところは、 **開発者ツールを起動して確認するとうまく動く** ところである（IE9,8）。これでハマった。いざデバッグしようとしてF12を押して確認したら「ちゃんと動いてるじゃん」と。逆に言えば、それで原因の特定ができたので良かったといえばよかったのだが。

##参考
[IEでconsole.log()のエラーを出さないようにする](http://blog.livedoor.jp/unahide/archives/53057929.html)
[stackoverflow - 'console' is undefined error for Internet Explorer](http://stackoverflow.com/questions/3326650/console-is-undefined-error-for-internet-explorer)
HTTPでリターンコードが0になる

mbedで[HTTPClient_HelloWorld](http://mbed.org/users/donatien/code/HTTPClient_HelloWorld/)を試してみたところ、サンプルは動くがこれを自分のサイトなどに変えてみるとエラーになる。
しかもHTTP Responseが0という謎の値で、どうやら宛先に到達できていない模様。

うーんおかしい、ということでHTTPClientのなかみを見てみると驚愕の事実が。。。

```c
  char host[32];
  char path[64];
```

なんと、ホスト名は32byte、その先のパスは64byteまででないとNGになっていたのだ(コラッ)。これを拡張したところ、うまく動くようになったという。

こんなのを見るとCをこの世から駆逐してやりたい気持ちでいっぱいになる。C++ベース(std)で自分で書き直したほうがいいような気も。。。
YesodアプリをHerokuにデプロイする


HaskellのWebアプリケーションフレームワークであるYesodで作ったアプリをHerokuにデプロイするのはなかなかたいへん・・・と思いきや、[heroku-buildpack-ghc](https://github.com/begriffs/heroku-buildpack-ghc)という素晴らしいツールのおかげで、実に簡単にデプロイ出来ます。

# buildpackの指定
Herokuにbuildpackを指定するには、プロジェクト作成時に指定する方法と、後から環境変数で指定する方法があります。
私は前者の方法を使いました。

## プロジェクト作成時にbuildpackを指定する方法

プロジェクト作成時に``` —-buildpack ```オプションを付けます。

```
heroku create —-stack cedar --buildpack https://github.com/begriffs/heroku-buildpack-ghc.git --app app-name
```

## 後から環境変数でbuildpackを指定する方法

事前にHerokuのプロジェクトが作成済みである前提で、以下のコマンドを実行します。

```
heroku config:set BUILDPACK_URL=https://github.com/begriffs/heroku-buildpack-ghc.git
```


buildpackの詳細は、[HerokuのDevCenter](https://devcenter.heroku.com/articles/buildpacks)をご覧下さい。

# heroku-builcpack-ghcが行ってくれること

heroku-buildpack-ghcを設定しておけば、Herokuに``` git push ```すればHeroku上でGHCによるビルドが行われるようです。
Heroku上でビルドしたバイナリだから、Heroku上での動作に支障ないと期待して間違いないでしょう。
mongodbでシャーディングをした際にでるメッセージへ対応


# 概要
mongodbでシャーディング環境で大量にデータを入力した際に、シャーディング状況が詳細にでない場合への対応

```
mongos> sh.status();
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"version" : 3,
	"minCompatibleVersion" : 3,
	"currentVersion" : 4,
	"clusterId" : ObjectId("53344f8fb902e42d70c8f23f")
}
  shards:
	{  "_id" : "shard0000",  "host" : "localhost:30000" }
	{  "_id" : "shard0001",  "host" : "localhost:30001" }
	{  "_id" : "shard0002",  "host" : "localhost:30002" }
  databases:
	{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
	{  "_id" : "logdb",  "partitioned" : true,  "primary" : "shard0000" }
		logdb.logs
			shard key: { "uid" : 1 }
			chunks:
				shard0000	17
				shard0002	18
				shard0001	17
			too many chunks to print, use verbose if you want to force print
	{  "_id" : "logs",  "partitioned" : false,  "primary" : "shard0002" }
```

# 出力を有効にするには以下のコマンドを実行する。
```
sh.status(true)
```
か
```
db.printShardingStatus( true )
```
EthernetInterfaceでコンパイルエラー

mbedでHTTPリクエストを扱おう、と思い手ごろなサンプル[HTTPClient_HelloWorld](http://mbed.org/users/donatien/code/HTTPClient_HelloWorld/)をImportしたわけですが、一筋縄ではいかなかったという話。
結論としては動くようになったので、さっさとそちらを見せんかい、という場合は[こちら](http://mbed.org/users/icoxfog417/code/HTTPClient_HelloWorld/)をご参照ください。

まず、必要なライブラリがないエラー。
![error1.JPG](https://qiita-image-store.s3.amazonaws.com/0/25990/463eee8e-4d25-4480-4b6f-5117ab834be0.jpeg)

実際ないと言われる。

```
Error: Cannot open source input file "rtos.h": No such file or directory in "EthernetInterface/EthernetInterface.h", Line: 27, Col: 18
```

これは更新すれば何とかなるだろうということで、更新。これを行うと中身が入るはず。

![update.JPG](https://qiita-image-store.s3.amazonaws.com/0/25990/c24e6a2f-8683-7545-fe6c-835fce50028d.jpeg)

めでたく取得できたので、これでうまくいくだろうと思いきや今度はコンパイルエラー。下記のようなエラーが大量に出る。

```
Error: A value of type "void *" cannot be used to initialize an entity of type "lpc_enetdata *" in "EthernetInterface/lwip-eth/arch/lpc17_emac.c", Line: 288, Col: 36
```

`EthernetInterface`内部でエラーが起きていて、最新化しても消えてくれない。
[掲示板の情報](https://mbed.org/forum/mbed/topic/3741/)によると、[TCPEchoServer](http://mbed.org/users/mbed_official/code/TCPEchoServer/)ならうまくいくぜ、との情報があり確かにこいつはコンパイルが通る。

そのため、この`TCPEchoServer`をベースに`HTTPClient`などを引越しさせてコンパイルしたところ、ちゃんと通るようになった。どうやらmbedのバージョンが古かったせいのようだ(サンプルである`HTTPClient_HelloWorld`はmbedのリビジョンが40、TCPEchoServer`は現時点最新の81だった)。
Rで可視化。Pixivタグ検索結果からデンドログラムを出力

#出力イメージ
![now loading...](https://gist.githubusercontent.com/nezuQ/9872352/raw/700238ea863a92cc1f123775c922991d0274cb38/RCluster.svg)

#概要
Pixivタグ間の関係を調べる為にクラスター分析を行い、その結果をデンドログラムで可視化する。

#処理
##01.Pixivタグ検索結果からタグ間のクロス集計データを作る。（Ruby）
[-> Rubyで前処理。Pixivのタグ検索結果からクロス集計データを作る](http://qiita.com/nezuq/items/052f072298c3f332307e)

```csv:OUTPUT.csv
艦隊これくしょん,百合,艦これ,加賀,赤城,赤賀,大北,天龍,大井,鈴熊,北上,龍田,天龍田,女性提督
艦隊これくしょん,294,283,227,70,61,52,24,21,20,19,19,18,15,15
百合,283,288,223,69,60,52,24,20,20,19,19,17,14,15
艦これ,227,223,233,57,49,42,16,21,13,17,13,18,15,12
加賀,70,69,57,70,58,39,0,1,0,2,0,1,1,1
赤城,61,60,49,58,61,39,0,0,0,0,0,0,1,0
赤賀,52,52,42,39,39,53,1,0,0,1,0,0,1,0
大北,24,24,16,0,0,1,24,1,19,1,19,1,0,0
天龍,21,20,21,1,0,0,1,21,1,0,1,18,10,1
大井,20,20,13,0,0,0,19,1,20,1,19,1,0,0
鈴熊,19,19,17,2,0,1,1,0,1,20,1,0,0,0
北上,19,19,13,0,0,0,19,1,19,1,19,1,0,0
龍田,18,17,18,1,0,0,1,18,1,0,1,18,10,1
天龍田,15,14,15,1,1,1,0,10,0,0,0,10,15,1
女性提督,15,15,12,1,0,0,0,1,0,0,0,1,1,15
```

##02.Rでクラスター分析を実行し、デンドログラムで可視化する。（R）
```r:pxcluster.r
dt <- read.csv("OUTPUT.csv")
dt.dist <- dist(dt)
dt.hc <- hclust(dt.dist)
plot(dt.hc)
```
GradleでサードパーティJarをMavenリポジトリにデプロイする

# 概要
Gradleで成果物をMavenリポジトリにデプロイする方法は探せば結構見つかるんだけど、ライブラリだけをデプロイする方法が見当たらなかったのでメモ。

# デプロイ方法
junitのjarファイルをデプロイしてみる。
build.gradleを作って、同じ階層にjunitのjarファイルを配置。
build.gradleの内容は次の通り。

```groovy:build.gradle
apply plugin: "maven-publish"

publishing {
    publications {
        maven(MavenPublication) {
            groupId "junit"
            artifactId "junit"
            version "4.11"
            // jarへのパス
            artifact "junit-4.11.jar"
        }
    }
    repositories {
        maven {
            // デプロイ先
            url "${buildDir}/repo"
        }
    }
}
```

準備できたら次のコマンドでpublishタスクを実行。

```
gradle publish
```

今回の場合だとbuild/repoフォルダ以下にデプロイされる。

# まとめ
GradleだけでサードパーティJarのデプロイは可能。
社内リポジトリに登録するときとかにどうぞ。
Gradleのドキュメントとかsampleを見てこのやり方にたどりついたんだけど、どこに書いてあったか分かんなくなっちゃった…。
NeoBundleを用いたVimプラグイン管理と色設定メモ


PureなVim人間だったが今更ながらプラグイン使いたくなりNeoBundle導入したのでそのメモ

# NeoBundleのダウンロードと設置

```sh
# 配置先のディレクトリを作成
$ mkdir -p ~/.vim/bundle
# NeoBundleをリポジトリから取得
$ git clone git://github.com/Shougo/neobundle.vim ~/.vim/bundle/neobundle.vim
```

# NeoBundle導入

## NeoBundleを設定する(.vimrc)


```sh
$ vim ~/.vimrc
```

```.vimrc
# 以下を追記
set nocompatible
filetype plugin indent off

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim
  call neobundle#rc(expand('~/.vim/bundle'))
endif 

NeoBundleFetch 'Shougo/neobundle.vim'

# 以下は必要に応じて追加
NeoBundle 'Shougo/unite.vim'
NeoBundle 'Shougo/neosnippet.vim'

filetype plugin indent on

```

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

.vimrcに追記したあとで以下を実行

```vim
:NeoBundleInstall
```

## プラグインアップデート

```vim
:NeoBundleUpdate
```

## プラグイン削除

.vimrcの記述を削除したあとで以下を実行

```vim
:NeoBundleClean
```


# ColorSchema導入

NeoBundleを導入すればカラースキーマも簡単にインストールできちゃいます。

## カラースキーマの選別

以下でよさ気なものを選別してきます。

[Vim Color Scheme Advent Calendar](http://hail2u.github.io/vim-color-scheme-advent-calendar-2013.html)

[Vim Colorscheme Gallery](http://cocopon.me/app/vim-color-gallery/)


## カラースキーマのインストール設定(.vimrc)

```sh
$ vim ~/.vimrc
```

```.vimrc
" solarized
NeoBundle 'altercation/vim-colors-solarized'
" mustang
NeoBundle 'croaker/mustang-vim'
" jellybeans
NeoBundle 'nanotech/jellybeans.vim'
" molokai
NeoBundle 'tomasr/molokai'

NeoBundle 'Shougo/unite.vim'
NeoBundle 'ujihisa/unite-colorscheme'
```

```vim
:NeoBundleInstall 
```

## カラースキーマ表示確認

```vim
:Unite colorscheme -auto-preview
```

カーソルを動かせばすぐにプレビューが見れるようになります

## デフォルトカラースキーマの設定

```sh
$ vim ~/.vimrc
```

```.vimrc
colorscheme <カラースキーマ名>
if &term =~ "xterm-256color" || "screen-256color"
  set t_Co=256
  set t_Sf=[3%dm
  set t_Sb=[4%dm
elseif &term =~ "xterm-color"
  set t_Co=8
  set t_Sf=[3%dm
  set t_Sb=[4%dm
endif
 
syntax enable
hi PmenuSel cterm=reverse ctermfg=33 ctermbg=222 gui=reverse guifg=#3399ff guibg=#f0e68c
```
Githubにアクセス出来なくなった場合の対処法

<h3>Githubにアクセス出来ないことはありませんか？</h3>


<div>私は先日、このようなエラーでアクセスすることが出来ないことがありました。(機種はMac OS X 10.7.5)</div>

![SSL_エラー.png](https://qiita-image-store.s3.amazonaws.com/0/14106/5527b280-b083-9e4a-6f71-eb7e01beb1d0.png)

<div>このような時に参考になるソースがいくつかあったので掲載しておきます。</div>

<ol>
<li><a href="http://tizio1976.blogspot.jp/2013/10/github.html?m=1">github の接続確認でのエラー(Programmer's Report)</a></li>
<li><a href="http://memo.sanographix.net/post/78103291775">[解決済み]OSXアップデートしたらGitHubでSSL証明書エラーが出て繋がらなくなった件と対処法(Tumblr)</a></li>
<li><a href="http://orangain.hatenablog.com/entry/2014/03/01/mavericks-ssl-certificate"> Mac OS X 10.9.2でGitHubにアクセスするとサーバー証明書のエラーが発生する場合の解決策 (orangain hatenablog)</a></li>
</ol>

1は、ssh通信で何らかの問題がある為にgithubと通信がうまくいかないケースです。今回の問題と直接関係はありませんが、結構起こりうることだと思うので、チェックしてみて下さい。

2と3が今回の問題でした。どうもキーチェーンがアクセスを阻んでいて
、これを削除すれば起動したそうです。

![SSL_エラー-4.png](https://qiita-image-store.s3.amazonaws.com/0/14106/8b938035-c5c7-ed0f-604b-f220dac132f3.png)


私も見よう見まねで、キーチェーンアクセスを確認して、DigiCertから始まる項目を全て削除しました。（2や3の投稿だと、CA-3などのバージョンになっていると思いますが、私の場合はCA-1でした。)

ただ、削除した場合にCSSとかが崩れちゃう可能性があるみたいです。
SVN上フォルダに対応するGradleタスクの動的定義

# 概要
Gradleのタスク動的定義を試したのでメモ。
今回はSubversionのリポジトリ上のフォルダに対応するタスクを定義してみる。

# やり方
## タスクの動的生成
Gradle日本語ドキュメントを参考に次のメソッドを作ってみたので抜粋。
指定した名前のタスクを定義してくれる。

```groovy:build.gradle
// タスクを定義
void createTask( List taskNames ) {
    for( String name : taskNames ) {
        task "${name}" << {
            println "task[${name}]"
        }
    }
}
```

## SVNのフォルダ名取得
SVNのフォルダ名を取ってくるメソッドを作成。
SVN操作にはSVNKitを使用。
以下抜粋。

```groovy:build.gradle
// リポジトリ上に存在するフォルダ名リストを取得
List getSVNList( String repoUrl,
                 String userName,
                 String password ) {
    def manager = SVNClientManager.newInstance(
                        SVNWCUtil.createDefaultOptions(true),
                        userName,
                        password)
    def client = manager.getLogClient();

    def dirList = new ArrayList<String>();
    def dirHandler = new ISVNDirEntryHandler() {
        public void handleDirEntry(SVNDirEntry dirEntry) {
            if(!dirEntry.getName().equals("")) {
                dirList.add(dirEntry.getName());
            }
        }
    };

    client.doList(
        SVNURL.parseURIDecoded(repoUrl),
        SVNRevision.HEAD,
        SVNRevision.HEAD,
        false,
        dirHandler );

    return dirList;
}
```

## ソース
ソースは次の通り。

```groovy:build.gradle
import org.tmatesoft.svn.core.*
import org.tmatesoft.svn.core.wc.*

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'org.tmatesoft.svnkit:svnkit:1.7.8'
    }

}

// リポジトリの情報
def svnList = ["url1","url2"]
def userName = "user"
def password = "password"

setup(svnList, userName, password)

// リポジトリ上に存在するフォルダ名に対応するタスクを定義
private void setup( List<String> baseUrlList,
                    String userName,
                    String password ) {
    for(String baseUrl : baseUrlList) {
        createTask(getSVNList(baseUrl, userName, password))
    }

}

// リポジトリ上に存在するフォルダ名リストを取得
List getSVNList( String repoUrl,
                         String userName,
                         String password ) {
    def manager = SVNClientManager.newInstance(
                        SVNWCUtil.createDefaultOptions(true),
                        userName,
                        password)
    def client = manager.getLogClient()

    def dirList = new ArrayList<String>()
    def dirHandler = new ISVNDirEntryHandler() {
        public void handleDirEntry(SVNDirEntry dirEntry) {
            if(!dirEntry.getName().equals("")) {
                dirList.add(dirEntry.getName())
            }
        }
    }

    client.doList(
        SVNURL.parseURIDecoded(repoUrl),
        SVNRevision.HEAD,
        SVNRevision.HEAD,
        false,
        dirHandler )

    return dirList
}

// タスクを定義
void createTask( List taskNames ) {
    for( String name : taskNames ) {
        task "${name}" << {
            println "task[${name}]"
        }
    }
}
```

# まとめ
SVNのフォルダに対応するタスクを動的に定義できた。
リポジトリ上フォルダのZIP圧縮はよくやる作業なので、タスク内で圧縮するようにしたら楽できそう。

あと、Javaは知ってるけどGroovyが全然分かんない。
多分もっと簡潔に書けるんだろうなぁ。
MacBook ProのSDカードスロットをVirtualBoxのrawdiskとして使う


**rawdiskの操作を誤ると、対象のストレージを破壊してしまうことがありますので十分ご注意ください。マジで。**

RaspberryPi謹製のSDカードは複数のOSがブートできるようになっています。手元にRaspbianをインストールして運用しているハードウェアがあり、このSDカードをMacBook Proのにマウントして読み書きしたい、というのが今回のお題です。

MacBook ProのSDカードスロットはUSBコントローラと接続されておらず、仮想マシンのUSBコントローラから見えないため通常の方法ではマウントすることが出来ません。しかし、Macのrawdiskとして設定することでマウントすることが出来ます。

SDカードをMacBook Proに挿すと次の3つのパーティションが見えます。

* RECOVERY
* boot
* disk1s6 (EXT4)

DiskUtilityで見るとこんな感じ。

![kobito.1396179185.850858.png](https://qiita-image-store.s3.amazonaws.com/0/29860/8fbcb492-6370-b3c7-749b-e997ce28b4cf.png "kobito.1396179185.850858.png")


`disk1s6`がRaspbianのファイルシステムにあたるので、これをVirtualBoxのrawdiskとしてマウントします。

# vmdkファイルの作成

rawdiskをマウントするにはvmdkファイルが必要なので、`VBoxManage`コマンドを使用して`raw.vmdk`を作成します。

```bash
cd ~/VirtualBox\ VMs/SomeVM/
sudo VBoxManage internalcommands createrawvmdk -filename ./raw.vmdk -rawdisk /dev/disk1s6
sudo chown username raw.vmdk  # rootで作成されるのでchownする
```

次にVirtualBoxの設定からストレージを追加します。ハードディスクの追加から先ほど作成した`raw.vmdk`を選択します。

![kobito.1396182143.785412.png](https://qiita-image-store.s3.amazonaws.com/0/29860/323d6172-1582-d997-4a99-1781c7d40b51.png "kobito.1396182143.785412.png")

vmdkの追加時にエラーが出る場合にはデバイスファイルのパーミッションが誤っているので、ログインユーザに変更してください（再マウントするとrootに戻るので変更しても大丈夫です）。

```bash
sudo chown username /dev/disk1*
```

仮想マシンを起動してsshログインし、ファイルシステムをマウントします。

```bash
sudo mount /dev/sdb /mnt
```

```bash
/dev/mapper/precise64-root on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/sda1 on /boot type ext2 (rw)
rpc_pipefs on /run/rpc_pipefs type rpc_pipefs (rw)
/dev/sdb on /mnt type ext4 (rw)
```

/mntにSDカードがマウントされました。やったー！

----

あわせて読みたい

* [9.9.1. Using a raw host hard disk from a guest](https://www.virtualbox.org/manual/ch09.html#rawdisk)
rails4のアプリを作成しgithubに公開する手順


WEB+DB PRESS vol73のRails 4実践チュートリアルを写経した。
いくつかのコマンドはそのままでは動作しなかったので変更した。
あと本屋ではなく魚屋にした。

githubの設定は完了した段階から開始。


```
$ rails new rails4_sample_fishstore

$ cd rails4_sample_fishstore

$ spring rails generate scaffold fish title price:integer

$ spring rake db:migrate

$ spring rake

```

サーバ起動

```

$ rails s

```

http://localhost:3000/fish

うごいた。fishは複数形無いからURLそのままらしい。


```

$ vi config/routes.rb

以下を追加
root 'fish#index'

```


http://localhost:3000/

これでfishがトップページに設定された

```

$ spring rails generate migration add_published_on_to_fish weight:integer

$ spring rake db:migrate


```

```

$ vi app/views/fish/index.html.erb

$ vi app/views/fish/show.html.erb

$ vi app/views/fish/_form.html.erb

```


githubにpushする

```

git config --global user.email "your email address"
git config user.email

git init
git add -A
git commit -m "first commit"

git remote add origin git@github.com:your_account/rails4_sample_fishstore.git

git push -u origin master


```
SHIFT+Numlockオフのテンキー でテキストを選択できるようにする

#問題
Numlockオフのテンキーではカーソルキーや`Home` `End` `PgUp` `PgDn`が入力できるが、`Shift`キー+これらのキーでテキストを選択しようとすると、数字が入力されてうまくいかない。

例: `Shift+KP_HOME`とタイプすると`7`が入力される。

#解決
`/etc/default/keyboard`の該当部分を以下のように変更して再起動する。

```:/etc/default/keyboard
XKBOPTIONS="numpad:microsoft"
```
Rubyで前処理。Pixivのタグ検索結果からクロス集計データを作る

#概要
Pixivタグ間の共起関係を見てみる事にした。
その為に、Pixivタグ検索結果（A）からクロス集計データ（B）を出力するRubyコードを書いた。

（A）
X Y Z
X
Y Z

（B）
,X,Y,Z
X,3,1,1
Y,1,3,2
Z,1,2,3

#データ
[-> Pixiv検索結果をCSVダウンロードするHTMLファイルを用意した](http://qiita.com/nezuq/items/55800d55c03606e0b13c)

#コード
```ruby:pxcsv2tagsummap.rb
# coding: UTF-8

=begin
pxcsv2tagsummap.rb
Copyright (c) 2014 nezuq
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
=end

require 'csv'

#Rで読み込む形式にするフラグ
IS_FORRLANG = ARGV[0] || '0' #コマンドライン第1引数で1が指定された場合、Rで読み込む形式になる
#入力ファイル名
INPUT_CSV = ARGV[1] || 'INPUT.csv'
#出力ファイル名
OUTPUT_CSV = ARGV[2] || 'OUTPUT.csv'
#しきい値（出現頻度が指定範囲外のタグのカラムは出力しない）
MAX_FREQUENCY = ARGV[3] ? ARGV[3].to_f : 1.000
MIN_FREQUENCY = ARGV[4] ? ARGV[4].to_f : 0.100
=begin
#しきい値（出現回数が指定範囲外のタグのカラムは出力しない）
MAX_COUNT = 100
MIN_COUNT = 10
=end
#表示しないタグのパターン
UNDISP_KEYPATTERN = Regexp.new (ARGV[5] || ".+00users入り|R-18|漫画|落書き")

h = {}
nrow = 0
CSV.foreach(INPUT_CSV, encoding: "UTF-8") do |row|
	nrow += 1
	tags = (row[13] ? row[13].split(' ') : [])
	tags_all = h.keys | tags
	(tags_all).each do |key|
		(tags_all).each do |key_in|
			if !(h[key]) then
				h[key] = {}
				h[key].default = 0
			end
			h[key][key_in] += (tags.include?(key) && tags.include?(key_in)) ? 1 : 0
		end
	end
end

lst = h.delete_if {|key, hsh|
		(key =~ UNDISP_KEYPATTERN) || !((hsh[key]*1.000/nrow).between?(MIN_FREQUENCY, MAX_FREQUENCY))
#		(key =~ UNDISP_KEYPATTERN) || !((hsh[key]).between?(MIN_COUNT, MAX_COUNT))
	}.sort_by{
		|key, hsh| -hsh[key]
	}

CSV.open(OUTPUT_CSV, "w") do |csv|
	hdr = []
	hdr.push(nil) if IS_FORRLANG != '1'
	for i in 0..(lst.length - 1) do
		hdr.push(lst[i][0])
	end
	csv << hdr
	for i in 0..(lst.length - 1) do
		row = [lst[i][0]]
		for j in 0..(lst.length - 1) do
			row.push(lst[i][1][lst[j][0]])
		end
		csv << row
	end
end

puts "end!"
```

#出力イメージ
```csv:OUTPUT.csv
,艦隊これくしょん,百合,艦これ,加賀,赤城,赤賀
艦隊これくしょん,98,93,79,13,12,12
百合,93,94,76,13,12,12
艦これ,79,76,81,12,11,11
加賀,13,13,12,13,11,10
赤城,12,12,11,11,12,10
赤賀,12,12,11,10,10,12
```
リダイレクト先のエラーメッセージをテストする

Laravelのテンプレート内では常に`$errors`という変数が定義されていて、`Redirect::to(...)->withErrors($validator)`などとしたときにエラーの内容がSessionStore経由でリダイレクト先にセットされる。この処理は`Illuminate\View\ViewServiceProvider#registerSessionBinder()`で、bootedイベントリスナーとして登録されている。

https://github.com/laravel/framework/blob/master/src/Illuminate/View/ViewServiceProvider.php

TestCaseはデフォルトではリダイレクトをfollowしないが、BrowserKitの`followRedirect()`を呼び出すことでfollowすることができる。

```php
    $form = $this->client->getCrawler()->selectButton("Submit")->form();
    $this->client->submit($form);
    $this->client->followRedirect();
```

これを使ってリダイレクト先でエラーメッセージが表示されることをテストできるかと思ったのだが、この時bootedイベントリスナーは呼び出されないため、`$errors`はセットされない。結果、ブラウザでテストするとエラーメッセージは表示されるがTestCaseからは見えない。

このため、エラーメッセージをテストするにはセッションの内容を確認するのが妥当のようだ。

```php
    $this->assertSessionHas('errors');
    $this->assertSessionHasErrors(['email', 'password']);
    $this->assertSessionHasErrors(['name' => 'The name field is required.']);
```
bower で dependencies のパッケージ同士のdependencies のバージョンがコンフリクトした時の対処


例えば下記の場合、そのまま `bower install` すると foundation の dependencies であるjquery2.1.0が読み込みれてしまうので、resolutions をつけてやる。

``` bower.json
{
  "name": "sample",
  "version": "0.0.0",
  "dependencies": {
    "foundation": null,
    "jquery": "1.11.0"
  },
  "exportsOverride":{
    "jquery":{
      "javascripts": "**/dist/jquery.js"
    },
    "foundation": {
      "javascripts": [
        "**/foundation.js"
      ],
      "stylesheets": [
        "**/foundation.css",
        "**/normalize.css"
      ]
    }
  },
  "resolutions": {
    "jquery": "~1.11.x"
  }
}
```


https://github.com/bower/bower/issues/532
testing環境ではfilterは無効になっている

Laravelのfilterはtesting環境では無効になっているので、TestCase内からcsrfフィルターなどのテストをするときはRoute::enableFilters()を呼び出す必要がある。

https://github.com/laravel/framework/blob/master/src/Illuminate/Routing/RoutingServiceProvider.php

```php
    protected function registerRouter()
    {
        $this->app['router'] = $this->app->share(function($app)
        {
            $router = new Router($app['events'], $app);

            // If the current application environment is "testing", we will disable the
            // routing filters, since they can be tested independently of the routes
            // and just get in the way of our typical controller testing concerns.
            if ($app['env'] == 'testing')
            {
                $router->disableFilters();
            }
```
即売会サービスを作ろう2


今回は好きな物を販売できるようにアイテム管理機能を作ります。


##アイテム管理に必要な機能
* サークル名、サークル画像
* 上記の修正、サークルの表示・非表示
* アイテムの名前、アイテムの説明、販売個数、サムネイル、配送方法、販売金額登録
* 上記の修正、アイテム表示・非表示

が必要になります。支払い方法は日本円の他にBitcoinに対応すると面白そうですね。

##画面遷移
![スクリーンショット 2014-03-30 16.34.22.png](https://qiita-image-store.s3.amazonaws.com/0/2029/e7263c1d-b778-c9d0-e2ac-5f708ec9013b.png "スクリーンショット 2014-03-30 16.34.22.png")


前回用意したフィールドマップ画面から、このような遷移を想定していて
* サークルを作ったことがなければAのルート
* サークルが作成済みであればBのルート
* サークル画像の登録は twitter,facebookからアイコンを取得できるようにする
を考えています




##今回の作業
ブランチはこちら
https://github.com/nagai/freemarket/tree/20140330

* サークル＆アイテム周りのDB設計とコーディング
* 画面遷移にはないけど１ユーザーが複数のサークルを持てるようにした
* 次回はAPI実装かな


##今後の課題
* UIの色を変更したい
* 配送方法が不明
絵文字をサジェストで快適に入力する

# やりたいこと
- 自分の作るWebアプリでもGithubのように絵文字を入力できるようにしたい
- さらにコロン( : )スタートで快適にサジェストしたい

完成イメージ
![スクリーンショット](https://qiita-image-store.s3.amazonaws.com/0/4195/bf57b596-1763-12e7-8a66-8d4c164e20f5.png)

※このテキストはWebチャットアプリ「[DevHub](https://github.com/volpe28v/DevHub)」に絵文字対応を行った手順を元になるべく最短ルートで実現できる方法を記述しています。不明点や詳細については各プラグインのドキュメントを参照ください。

# 使うもの
emojify.js
http://hassankhan.github.io/emojify.js/

チートシート(入力時の参考に)
http://www.emoji-cheat-sheet.com/

jquery-textcomplete
http://yuku-t.com/jquery-textcomplete/


# 絵文字を表示できるようにする
emojify.js を html ヘッダで読み込んでおく。

emoji 用のスタイルを css を追加。
表示したい絵文字の大きさ・位置に合わせて必要ならいい感じに調整する。

```css
.emoji {
  width: 1.5em;
  height: 1.5em;
  display: inline-block;
  margin-bottom: 0.2em;
}
```

js の初期処理辺りで emojify の初期化を記述。
img_dir には絵文字画像を置いたディレクトリを指定する。

```js
emojify.setConfig({
  img_dir : 'img/emoji', // Directory for emoji images
});

```

絵文字を表示したい箇所で、絵文字のマークダウン(`:smiley:` 等)を含むDOMを get(0) して emojify.run() に食わせる。(jQueryの場合)
例えばチャットの場合はサーバからチャット文字列が送られて表示するところで行う。

```js
emojify.run($msg.get(0));
```

ここまでで、`:smiley:` などと入力されたテキストが絵文字画像(:smiley:)に変換されて表示されるようになる。

# サジェストできるようにする
自分で `:smiley:` と入力したりチートシートからコピるのは面倒なので : スタートでサジェスト表示可能にする。

jquery-textcomplete.js を html ヘッダで読み込んでおく。

サジェスト表示用のスタイルを cssに追加

```css
.emoji-suggest {
  width: 1.5em;
  height: 1.5em;
  display: inline-block;
  margin-bottom: -0.3em;
}
```

入力フォームにサジェスト機能を付加する

```html
<input type="text" id="message" placeholder="Message”/>
```

例えばこんな入力フォームを設置していたら、#message に対して textcomplete() を適用してあげる。

```js
$('#message').textcomplete([
  {
    match: /\B:([\-+\w]*)$/,
    search: function (term, callback) {
      callback($.map(emojies, function (emoji) {
        return emoji.indexOf(term) === 0 ? emoji : null;
      }));
    },
    template: function (value) {
      return '<img class="emoji-suggest" src="img/emoji/' + value + '.png"></img> ' + value;
    },
    replace: function (value) {
      return ':' + value + ': ';
    },
    index: 1,
    maxCount: 8   // サジェストで表示する最大絵文字数
  }
]);
```

サジェストの候補絞込(search)で使う emojies 変数を定義する。以下のように全絵文字のキーを配列で列挙する。

```js
var emojies = ["blush","scream","smirk","smiley","stuck_out_tongue_closed_eyes”, …
```

参照）https://github.com/yuku-t/jquery-textcomplete/blob/master/media/javascripts/emoji.js
※上記 emoji.js をそのまま持ってきてもいいかも

これで絵文字の快適サジェストライフを送ろう :smirk:
FFmpeg覚書（サムネイル）

http://www.ffmpeg.org/ffmpeg.html

入力ファイル（＝動画ファイル）「input.avi」の、0秒から1フレーム目を、画像ファイル「output.jpg」として出力する。

```
$ ffmpeg -ss 0 -vframes 1 -i input.avi -f image2 output.jpg
```

入力ファイルは、リモートファイルでも可。
プログレッシブダウンロードに対応している場合（＝Fast Start仕様）、全てダウンロードしないで済む。すばらしい。
プログレッシブダウンロードに対応してない場合は・・・、手っ取り早いのは先頭数バイトだけダウンロードか。例えば、10KBなら、以下のように。

```
$ curl -r 0-10239 $MOVIE_URL | ffmpeg -ss 0 -vframes 1 -i - -f image2 output.jpg
```

### 補足

全フレームを出力したい場合は、出力ファイルをoutput-%03.jpgとしておくと、‘output-001.jpg’,‘output-002.jpg’...というファイルができる。
また、その画像から動画を生成したりも。

> http://www.ffmpeg.org/ffmpeg.html
You can extract images from a video, or create a video from many images:

あたりを参考に。
Clojureでランダムな文字列を生成してみる

長さを与えたらその長さ分のランダムな文字列を返す関数を作ってみる。
デフォルトでは英数62文字の中からランダムに文字選択される。
文字範囲は第2引数で指定できるようにもする。

```rand-str.clj
(defn range-size
  ([start size] (range-size start size 1))
  ([start size step]
    {:pre[(integer? size)]}
    (take size (range start (+ start (* size step)) step))))

(defn rand-str
  ([n] (rand-str n (mapcat #(apply range-size %) [[48 10] [65 26] [97 26]])))
  ([n charseq] (apply str (map char (repeatedly n #(rand-nth charseq))))))
```

するとこんな感じでできた。

```
user=> (range-size 50 5)
(50 51 52 53 54)
user=> (rand-str 20)
"195Tbl1nE8ME0QGEwJl7"
user=> (rand-str 20 "abc")
"cbabbbcabbbaaaabcaca"
```
パラメータのシリアライズ（deep か shallow か）


jQueryの小ネタです。

## 浅いシリアライズと深いシリアライズ

jQuery の $.param() には、2通りのシリアライズの形式があります。

### $.param(obj [, traditional])

jQuery1.4 以降は シリアライズの方法を第２引数（オプション）で指定可能です。

[jQuery.param()](https://api.jquery.com/jQuery.param/)
> traditional
> Type: Boolean
> A Boolean indicating whether to perform a traditional "shallow" serialization.

「従来の"浅い"シリアライズを行うかどうかを指定する」引数で、デフォルトではfalseです。
true にすると、1階層までの値をシリアライズし、falseにすると再帰的に "深く" までシリアライズします。

### 例

上記リンクと同じデータで例を示します。

```Javascript
$.param({a: [2, 3, 4]}); // "a[]=2&a[]=3&a[]=4"
$.param({a: [2, 3, 4]}, true); // "a=2&a=3&a=4"
 
$.param({a: {b: 1, c: 2}, d: [3, 4, {e: 5}]});
// "a[b]=1&a[c]=2&d[]=3&d[]=4&d[2][e]=5"
$.param({a: {b: 1, c: 2}, d: [3, 4, {e: 5}]}, true);
// "a=[object+Object]&d=3&d=4&d=[object+Object]"
```

Ajaxでパラメータを送信する場合、サーバ側がdeepな形式に対応していない場合はtraditionalにtrueを指定する必要があります。
（私は最初これに気づかないで、仕方なく文字列に置換かけて一時しのぎしていました）

### 注意

jQuery 1.8 以降、\$.param() は jQuery.ajaxSettings.traditional の値を使用しないので、$.param() で明示的に traditional の値を指定したほうが良いそうです。

## 参考リンク

https://api.jquery.com/jQuery.param/
画像付きUIButtonのレイアウトを変更する


![スクリーンショット 2014-03-30 16.53.31.png](https://qiita-image-store.s3.amazonaws.com/0/21397/188a9f7b-b4ad-7e04-7ab3-6a75cd9c97b1.png "スクリーンショット 2014-03-30 16.53.31.png")


デフォルトは一番上ですが、こんな感じのボタンとかもUIButtonで作れます。

## Storyboard（Interface Builder）で設定する
![スクリーンショット-2014-03-30-16.44.49.png](https://qiita-image-store.s3.amazonaws.com/0/21397/d00d2f98-9372-8516-2faf-3fc7c5efcabb.png "スクリーンショット-2014-03-30-16.44.49.png")

ここを変更することで、画像の位置とテキストの位置を調整することができます。

* Content
	- 画像とテキスト全体
* Title
	- テキストのみ
* Image
	- 画像のみ

![スクリーンショット 2014-03-30 16.43.13.png](https://qiita-image-store.s3.amazonaws.com/0/21397/764f5541-b18c-5e97-a9e6-d74202e83c27.png "スクリーンショット 2014-03-30 16.43.13.png")

たとえば、上記のように画像の下にテキストを表示するようなスタイルのボタンを作りたい場合は以下のようにTitleのInsetとImageのInsetを設定します。


![スクリーンショット 2014-03-30 16.43.22.png](https://qiita-image-store.s3.amazonaws.com/0/21397/5f7191fe-4770-3bd3-1acc-06aee475b6fa.png "スクリーンショット 2014-03-30 16.43.22.png")　![スクリーンショット 2014-03-30 16.43.36.png](https://qiita-image-store.s3.amazonaws.com/0/21397/a8439a7d-798f-60c9-8c68-31345baaf15e.png "スクリーンショット 2014-03-30 16.43.36.png")

## コードで設定する

```objectivec:
button.titleEdgeInsets = UIEdgeInsetsMake(30.0f, -20.0f, 0, 0);
button.imageEdgeInsets = UIEdgeInsetsMake(-20.0f, 40.0f, 0, 0);
```

こんな感じで簡単に指定することができます。

## 参考文献
[画像付きUIButtonのレイアウト調整 - PILOG](http://xoyip.hatenablog.com/entry/2014/01/10/215106)
Alfredでいろいろサーチ

随時更新

# るりまサーチ

```
http://rurema.clear-code.com/query:{query}/version:2.1.0/
```

`version` はいつも使うヤツに適宜変えましょう。

# Weblio辞書

```
http://ejje.weblio.jp/content/{query}
```
jquery.inview plugin について


指定した要素が画面内に入ってきたら inview イベントを発火させてどうこうするもの

https://github.com/zuk/jquery.inview/

https://github.com/protonet/jquery.inview

ふたつあるけど上のほうは data-offfset 属性でオフセットを指定できるから都合がよさそう
cocos2d-x tips

意外にいろいろと日本語で検索しても出ないので、メモしとくよ！

PhysicsBody::createEdgeBox(Size)
指定したサイズの矩形の壁を作り、外と中を区切る。
画面サイズでこれを作成すれば、画面内から物理オブジェクトが出ないようにできる。
(※高速で動くオブジェクトは簡単に抜けるので注意)


ジョイントの使い方

良くわかってないけど、間違ってたら誰か指摘してくれるよね。

生成方法
PhysicsJoint* joint = PhysicsJointXXXX::construct(...);
physicsWorld->addJoint(joint);

PhysicsJointFixed::construct(PhysicsBody* a, PhysicsBody* b, const Point& anchr)

aとbの中心同士を重ねて固定する？ anchrは空間上の座標っぽい。
PHPでzip/rar/pdfでアーカイブされたマンガを扱う


comic viewer的なものを作っているとこういうのを扱う必要がでてくる。Webベースだと画像単位でリクエスト分けたかったりするのでそういう時にどうするかという話

## zip
大抵PHPに最初からついてくるZipArchiveというライブラリが使える。

```php
$zip = new \ZipArchive;
if (!$zip->open($path)) {
    throw new \Exception("error");
}

// アーカイブされているファイル全部をなんかする
for ($i = 0; $i < $zip->numFiles; $i++) {
    $stat = $zip->statIndex($i);
    $body = $zip->getFromIndex($index);
    // do something
}

// i番目のファイルの中身を返す
return $zip->getFromIndex($index);

```
画像1枚のリクエストごとにzipファイルをopenして、指定されたのファイルのjpgを返すみたいなことをしても結構高速に動いてくれる。解答してディレクトリに展開せず扱えるのは非常に便利

## rar
RarArchiveがZipArchiveと同じ感じで使える。細かいインターフェースは色々違うのでそこら辺はラッパー書いたほうが良い

インストール

```sh
pecl install rar

# ...../php.iniとかに以下を追加
extension = rar.so
```
PHP5.5 + Ubuntu13.10だと上記でうまくいった。OS X Marvericksだとなぜかコケたので手動makeしてインストールしたらいけた。


```php
$rar = \RarArchive::open($path);
if ($rar === false) {
    throw new \Exception("error");
}

// アーカイブされているファイル全部をなんかする
$entries = $this->rar->getEntries();
foreach ($entries as $entry) {
    // do something
}

// i番目のファイルの中身を返す
$entries = $this->rar->getEntries();
$entry = $entries[$index];
$stream = $entry->getStream();
return fread($stream, $entry->getUnpackedSize());

```

こちらもアーカイブ内の特定のファイルを引っ張ってくるの高速でできるので解凍せずに扱える。


## pdf
つらい
IMagick(Image Magick)とか使えば連番画像にできるのでアップロード時とかに変換処理を走らせておくといいと思う。
それか大抵のブラウザはPDFを適切に処理してくれるのでそれに任せてしまうとか。
IMagickを使うと一応ページ単位で画像に変換したりできるんですが、内部でghostscriptが叩かれたりして超重い(ファイルによっては30秒とか)ので現実的でない。というか内部的にはページ単位じゃなくて全部変換してる気がする。
自力でPDFまともに扱うのはつらみしかない。
Google Analyticsでページ毎のコンバージョンへの貢献度を知りたい

ユーザー登録完了やお買い物完了、資料請求完了など何かとコンバージョンに至るサイトが多々あります。
その場合、完了ページなどのゴールページと言われるページを目標に設定します。

で、さらにページ毎にそのゴールページへの貢献度ってどれくらいかって知りたい場合もあると思います。

その場合は

コンバージョン -> 目標 -> サマリー

のレポート画面で新しいセグメントを作成し、条件に「ページ」「完全一致」「計測対象ページURL」を設定するとサマリーの「目標Nのコンバージョン率」ってところに数値が表れます。

貢献度が測りたいページが明確に決まっていればこの方法で問題ないのですが、

* どのページが一番貢献しているのか知りたい
* 計測対象ページがたくさんある
* とにかくページを一覧で見たい

って場合は困ります。

じゃあ、どうすればいいのか？
残念ながらGoogle Analyticsでは通常の方法で数値が取れないっぽいです。

ということで、カスタムレポートとセグメントを駆使して数値を出してみました。

**【カスタムレポート】**
* ディメンション：ページ
* 指標グループ：目標Nの完了数＋ページ別訪問数

![](http://memo.torachiyo.com/wp/wp-content/uploads/2014/03/img01.png)

作ったカスタムレポートのレポート画面でカスタムセグメントを設定します。

**【セグメント】**
* 条件：「目標Nの完了数」「セッションごと」「＞」「0」

![](http://memo.torachiyo.com/wp/wp-content/uploads/2014/03/img02.png)

こんな風に設定して、「すべての訪問」と合わせてレポートを表示してみます。
すると「すべての訪問」「カスタムセグメント」の2軸の数値が出ます。
レポート画面の「ページ別訪問数」に出ている数値が貢献度になります。

「カスタムセグメント」÷「すべての訪問」で貢献度が割合で出るのですが、Google Analyticsではここが限界でした・・。
あとはこれをエクスポートしてエクセルなどで計算するって感じかと。。

不完全燃焼感がハンパないです。
ちなみにページの価値を設定する方法もあるのですが、汎用的に数値を出したいと思い・・。

Google Analytics API使えば出せそうなんでいずれ作ってみたいと思います。
Google AnalyticsがGoogle Spreadsheetで使える！

Google AnalyticsのデータがGoogle Spreadsheetで使えるようになったそうです。
今までReporting APIとか使って、スクリプト組んでゴリゴリと取得していたデータがSpreadsheetでサクッと取得できるだなんて素晴らしいですね。

ただ、気になる点がSpreadsheetのとReporting APIの仕様上気になる点が。

* Spreadsheetの仕様でセル数が400,000セルと決まっているのでディメンションやメトリクス（指標）を10個設定すると40,000レコードしか取得できない
* Analytics APIの仕様で1回のリクエストで取得できるレコード数が10,000レコードまでと決まっているのでそれ以上取得できない

この当たりが気になります。

検証しろよと思いますが、自分のSpreadsheet見てもまだアドオンメニューが表示されていないのです。
Googleドライブの「設定」->「編集」に何やらアドオンを出すための設定があるらしいのですが、それすらない。という状況で未だ確認できず。

アドオンが使えるようなったら速攻で検証してみたいと思います！
レシーバがnullでもNullPointerExceptionにならない時もある


最近気づいたさしずめどうでも良い話ですが、
例えば、下記のような挑発的な書き方でもエラーにならないことがあることに気づきました。

``` java
	((Foo) null).sayHello();
```

で、Foo.sayHelloってなんぞやと言うと、

``` java
public class Foo {
	public static void main(String[] args) {
		((Foo) null).sayHello();
	}
	
	public static void sayHello() {
		System.out.println("hello");
	}
}
```

staticだとレシーバがnullでもOKみたいです（正直なところstaticメソッドにレシーバが付けられるのはJavaの不思議仕様）

### おまけ
staticメソッドには仮想関数のような、実行時の型を解決する機能は無いみたいです。

``` java
public class Foo {
	public static void main(String[] args) {
		((Hello) new A()).sayHello();
		// -> hello
	}
}

class Hello {
	public static void sayHello() {
		System.out.println("hello");
	}
}
class A extends Hello {
	public static void sayHello() {
		System.out.println("hello, I am A.");
	}
}
```

なんならリフレクションを使って関係無い型をレシーバに渡しても何も言われません。

``` java
public class Foo {
	public static void main(String[] args) throws Exception {
		Class<Hello> klass = Hello.class;
		Method method = klass.getMethod("sayHello");
		method.invoke(100);
		// (new Integer().sayHello)
	}
}

class Hello {
	public static void sayHello() {
		System.out.println("hello");
	}
}
```
CentOS 6.5 でトラックポイントを使えるようにする

私、もはやトラックポイント無しでは
スクロールできない体になってしまいましたので、
Myマシン(ThinkPad T400)上のCentOS 6.5 で
トラックポイントを使えるようにしました。

最初ネット上の情報を参考にトライしたのですが、
私の環境ではどうもうまくいかず、以下を行って
なんとか成功しました。

(注：オペミス、環境の差異などで問題が生じた場合、
     Xが立ち上がらなくなる可能性があります。
     もし参考頂く際は慎重に、自己責任でお願いします。)

###1
>$ su

でrootにスイッチ

###2
> $ gedit /usr/share/X11/xorg.conf.d/11-evdev-trackpoint.conf&

で gedit 起動

###3 以下の内容をコピペ

>Section "InputClass"
&nbsp;&nbsp;&nbsp;&nbsp;Identifier	"trackpoint catchall"
&nbsp;&nbsp;&nbsp;&nbsp;MatchIsPointer	"true"
&nbsp;&nbsp;&nbsp;&nbsp;MatchProduct	"TrackPoint|DualPoint Stick"
&nbsp;&nbsp;&nbsp;&nbsp;MatchDevicePath	"/dev/input/event*"
&nbsp;&nbsp;&nbsp;&nbsp;Option	"Emulate3Buttons"	"true"
&nbsp;&nbsp;&nbsp;&nbsp;Option	"EmulateWheel"	"true"
&nbsp;&nbsp;&nbsp;&nbsp;Option	"EmulateWheelButton"	"2"
&nbsp;&nbsp;&nbsp;&nbsp;Option	"XAxisMapping"	"6 7"
&nbsp;&nbsp;&nbsp;&nbsp;Option	"YAxisMapping"	"4 5"
EndSection

(上記内容はUbuntu 13.10 日本語版にあった同名ファイルから
 拝借してきました)

###4 保存して、gedit 終了
###5 OS再起動

(私は最初この時点でつまずき、Xが起動しなくなってしまいました。。。
 一旦シングルユーザーモードでログインしなおしてファイルを
 修正しました。
)

###5 適当なアプリを起動して、中ボタン+トラックポイント操作でスクロールすることを確認

これでなんとかCentOSさんともお付き合いして
いけそうです。
CentOS 6.5にrbenvでRuby on RailsとSpringをインストールしたログ


CentOS 6.5にrbenvでRuby on Railsをインストールしたログ

ほとんど以下の手順そのまんま
https://github.com/sstephenson/rbenv


以下は入ってなければインストール

```
$ sudo yum -y install git
$ sudo yum -y install gcc
$ sudo yum -y install openssl-devel
$ sudo yum -y install sqlite-devel
```

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

シェルを再起動
```
$ type rbenv
```

ruby-buildをインストール
```
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

インストール可能なバージョン一覧を確認
```
$ rbenv install --list
```
今回は2.1.1をインストール
```
$ rbenv install 2.1.1
$ rbenv rehash
$ rbenv global 2.1.1
```
railsインストール
```
$ gem i bundler
$ gem i rails
```

nodejsインストール

``` 
$ sudo yum -y install nodejs
$ wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo rpm -ivh epel-release-6-8.noarch.rpm
$ sudo vi /etc/yum.repos.d/epel.repo
enabled=1をenabled=0に変更

$ sudo yum --enablerepo epel search nodejs
$ sudo yum --enablerepo epel install nodejs
```

springとexecjsをインストール
``` 
$ gem i spring
$ gem install execjs
```
nginxのエラーをstderrに流す

nginxの拡張モジュール開発してる際に毎回エラーログ確認するの面倒だなと思ってたんだけど、よくよく考えてみたらstderrに流せばいいやと思って今は起動時に↓のオプション付けることにしている。

```bash
$ nginx -g 'daemon off; error_log stderr;'
```
Xcode5.1 アプリ再申請する手順


アプリを改修して再度Apple申請するときの手順、忘れやすいのでメモ。

（※公開後のバージョンアップについては一番下の追記参照）

##iTune Connect側の設定

###Waiting for Uploadにする
iTune Connectのアプリ管理画面、右上の”Ready to Upload Binary”をクリック。

![kobito.1396150352.911802.png](https://qiita-image-store.s3.amazonaws.com/0/29775/4477b240-dd20-97fd-277d-09622f827251.png "kobito.1396150352.911802.png")


前回からの更新内容についてちょっと質問がある。  


Statusが"Waiting For Upload"になればOK

![kobito.1396150380.630726.png](https://qiita-image-store.s3.amazonaws.com/0/29775/83683026-4362-42b4-5b8c-b02f15b8eece.png "kobito.1396150380.630726.png")



###バージョン番号を更新
バージョン番号を変更する。
あとで設定するXcode側のバージョン番号と合わせる必要がある。

![kobito.1396150528.096580.png](https://qiita-image-store.s3.amazonaws.com/0/29775/2a51358a-6528-6cf2-3f0b-d047cec54973.png "kobito.1396150528.096580.png")


##Xcode側の設定
###バージョン番号を更新

VersionとBuildは同じ番号にしておくのが無難。

![kobito.1396150621.492594.png](https://qiita-image-store.s3.amazonaws.com/0/29775/ac3594f1-cbec-3554-f131-768496b805b7.png "kobito.1396150621.492594.png")


###バイナリ作成
メニューから、Product > Archiveを実行。

※Archiveが無効で押せない(;;)時はコチラ
→ http://qiita.com/takahi5/items/c0f5b01fe7111b6174f3 

###アップロード

バイナリが作成されたら、"Validate", "Distribute"をクリック。

![kobito.1396150895.015280.png](https://qiita-image-store.s3.amazonaws.com/0/29775/2677f227-a56b-3c65-f4c6-7562c7367dcc.png "kobito.1396150895.015280.png")



##完了！
iTune ConnectでStatusが"Upload Received"になっていればOK。
![kobito.1396150949.645386.png](https://qiita-image-store.s3.amazonaws.com/0/29775/d4bc6338-dd31-9c81-d60f-64e33f180ccf.png "kobito.1396150949.645386.png")


20分くらいすると"Waiting For Review"になる。
![kobito.1396151803.406367.png](https://qiita-image-store.s3.amazonaws.com/0/29775/82ea5d81-2bb5-d879-c555-1e41665f40b9.png "kobito.1396151803.406367.png")

以上！あとはレビュー結果を待ちましょう！


##[追記]公開後にバージョンアップ申請するとき

”Ready for Update”ボタンがない！と焦る事なかれ。

まず”Add Version"をクリックして、新バージョンの情報を入力したら、あとは上記手順と同じ。

![kobito.1399061765.438162.png](https://qiita-image-store.s3.amazonaws.com/0/29775/06e7cc2e-e7b4-3c2e-9f1f-84345b43b33d.png "kobito.1399061765.438162.png")
XcodeでAriciveメニューが無効で押せない



###問題
メニューの"Procduct > Archive"が無効で押せない件。

![kobito.1396151361.440776.png](https://qiita-image-store.s3.amazonaws.com/0/29775/e4a265ad-e418-a83a-3343-c279e76b7751.png "kobito.1396151361.440776.png")


以前にもハマったのでメモ。

###解決法
ビルドターゲットに"iOS Device"を選択する、、、

![kobito.1396151458.045731.png](https://qiita-image-store.s3.amazonaws.com/0/29775/5d74d148-c241-6903-5e98-314465991ad1.png "kobito.1396151458.045731.png")


以上、これだけ！

![kobito.1396151494.447960.png](https://qiita-image-store.s3.amazonaws.com/0/29775/99dd1875-8d87-a674-c380-ba62bca54f38.png "kobito.1396151494.447960.png")
自作クラスに簡単にdelegateを設定する

XCodeでアプリを作成していると，delegateメソッドを結構使います．

自分で作成したクラスでもdelegateが使えたら便利なのに…と思う事はあると思います．

そこで，簡単にdelegateを実装する手順を示します．

今回はMyDelegateSampleと言うクラスを作成し，ViewControllerから呼び出してdelegateを受け取ると言う想定です．

ソース中にコメントを埋め込んでいますので，解説は特に書きません．

```objectivec:MyDelegateSample.h
#import <Foundation/Foundation.h>

// Define Delegate
@protocol MyDelegateSampleDelegate <NSObject>

// Declare Delegate methods.
// Only declaration. Implements shoud be done by ViewController
- (void)sampleDelegate;
- (void)sampleDelegateWithParameter:(NSInteger)val;

@end

@interface MyDelegateSample : NSObject

// Define property so that it could be seen from user object
@property (nonatomic, assign) id<MyDelegateSampleDelegate> delegate;

// initializer
- (id)init;

// Method which calls delegate
- (void)fireDelegate;
- (void)fireDelegateWithParameter;

@end
```

```objectivec:MyDelegateSample.m
#import "MyDelegateSample.h"

@implementation MyDelegateSample

// Initializer Implement
- (id)init
{
    if (self = [super init]) {
        // Do initilaization if needed
    }
    return self;
}

// Fire delegates
- (void)fireDelegate
{
    // check if user has implemeted the delegate method
    if ([self.delegate respondsToSelector:@selector(sampleDelegate)])
    {
        // fire sampleDelegate
        [_delegate sampleDelegate];
    }
}

- (void)fireDelegateWithParameter
{
    // check if user has implemeted the delegate method
    if ([self.delegate respondsToSelector:@selector(sampleDelegateWithParameter:)])
    {
        // fire sampleDelegate
        [_delegate sampleDelegateWithParameter:10];
    }
}
@end
```

```objectivec:ViewController.h
#import <UIKit/UIKit.h>
#import "MyDelegateSample.h"


@interface ViewController : UIViewController<MyDelegateSampleDelegate>

@end
```

```objectivec:ViewController.m
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
    
    // Create MyDelagateSample Instance
    MyDelegateSample* myDelegate = [[MyDelegateSample alloc]init];
    
    // Set myDelegate's delegate to self
    myDelegate.delegate = self;
    
    // Fire first sampleDelegate
    [myDelegate fireDelegate];
    
    // Fire second sampleDelegateWithParameter
    [myDelegate fireDelegateWithParameter];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

// Implemets Delegate Methods
- (void)sampleDelegate
{
    NSLog(@"sampleDelegate is fired");
}

- (void)sampleDelegateWithParameter:(NSInteger)val
{
    NSLog(@"sampleDelegateWithParameter is fired with value %ld", (long)val);
}

@end
```

Single View Applicationを作成して，上記のコードを書いてシミュレーターで実行すると，NSLogが二回出力されるのが確認できます．

実際のdelegateメソッドの中では色々と処理を別スレッドでしますので，ViewControllerでdelegateメソッドがいつ呼ばれるかは判りません．
Amazon Linux を使って AWS SDK for PHP を使おう

Amazon Linux は AWS が用意しているだけあって repository に色々入っています。とりあえず使ってみるには最適。

Access Key ID と Secret Access Key を書くようにしてますけど、IAM role 使うとか色々方法あると思うんでよしなに。

# PHP

```shell-session
$ sudo yum install php-amazon-sdk2
(snip)
完了しました!
```

インストール完了! よい子はきっと sdk2 の方を使いたいはず。

```shell-session
$ rpm -ql php-amazon-sdk2 | grep aws.phar
/usr/share/pear/AWSSDKforPHP/aws.phar
```

というわけで、下みたいなの書くと動きます。

```php:cw_listMetrics.php
<?php
require 'AWSSDKforPHP/aws.phar';

use Aws\CloudWatch\CloudWatchClient;

$cw = CloudWatchClient::factory(array(
  'region' => 'us-west-2',
  'key' => 'YOUR ACCESS KEY ID',
  'secret' => 'YOUR SECRET ACCESS KEY',
  ));

$result = $cw->listMetrics();
print_r($result['Metrics'][0]);
?>
```

Credential に関しては factory の引数ではなく環境変数でも指定可。

```shell-session
$ export AWS_ACCESS_KEY_ID='YOUR ACCESS KEY ID'
$ export AWS_SECRET_KEY='YOUR SECRET ACCESS KEY'
```

で、実行。メトリックが詰まってるぜ。

```shell-session
$ php cw_listMetrics.php
PHP Warning:  strtotime(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in phar:///usr/share/pear/AWSSDKforPHP/aws.phar/Aws/Common/InstanceMetadata/InstanceMetadataClient.php on line 99
Array
(
    [Dimensions] => Array
        (
        )

    [MetricName] => NetworkIn
    [Namespace] => AWS/EC2
)
```

何か、Warning 出てくるので嫌だなーという場合は php.ini を編集しましょう。

```php:/etc/php.ini
[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = UTC
```

logging に関しては次を参照: http://docs.aws.amazon.com/aws-sdk-php/guide/latest/faq.html#how-can-i-see-what-data-is-sent-over-the-wire
これで request/response も見れます。

```php:cw_listMetrics.php
<?php
require 'AWSSDKforPHP/aws.phar';

use Guzzle\Plugin\Log\LogPlugin;
use Aws\CloudWatch\CloudWatchClient;

$cw = CloudWatchClient::factory(array(
  'region' => 'us-west-2'
  ));
$cw->addSubscriber(LogPlugin::getDebugPlugin());

$result = $cw->listMetrics();
print_r($result['Metrics'][0]);
?>
```
PHP: The "Right" Wayの日本語版PDF/EPUBを作成してみた


ストレートフォワードにできるかと思ったら意外と苦難の道のりだった記録。

https://github.com/m-takagi/php-the-right-way
にある日本語版のレポジトリをcloneする。

https://raw.githubusercontent.com/lsd/php-the-right-way-pdf/builder/build-pdf.sh

を参考にコマンドを実行していくが、実はこの通りにやってもうまくいかないので以下の手順で。

# Jekyll のインストール(インストール済みの場合は不要)
Xcode 5.1 and Command Line Developer Tools 5.1ではうまくbuildできなかったので rbenvを使った(rbenv の細かい使い方は省略)

```jekyll.sh
rbenv local 2.1.0
gem install jekyll
```

# 手順
jekyllのサーバを起動しておく

```jekyll.sh
jekyll build
jekyll server &
```

別のターミナルセッションでpandocを使ってEPUB/PDFを生成

```python:epub.sh
$ pandoc -s -S --toc -c styles/all.css http://localhost:4000 -o php-the-right-way.epub
pandoc: Could not find image `http://localhost:4000/http://i.creativecommons.org/l/by-nc-sa/3.0/88x31.png', skipping...
pandoc: Could not find image `http://localhost:4000/https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png', skipping...
```

```python:pdf.sh
 PATH=/usr/texbin:$PATH pandoc -s -S --toc -c styles/all.css http://localhost:4000 -o php-the-right-way-single-html.pdf  -V documentclass=ltjarticle --latex-engine=lualatex
```

# 今後の課題
 * 生成物をCC-By-SAでGitHubに公開する
 * EPUBを作るときにちょっとだけWarningがでるけど一応本文には影響なさそうなのでまだ直してない。
 * CI化しちゃったほうがメンテが楽かも

# Special Thanks

PDFの作成方法はこちらを参考にさせていただきました。
http://qiita.com/sky_y/items/80bcd0f353ef5b8980ee
DistributionNotFoundエラーの対処方法


### 問題
pipのバージョンが古いため、正常に動作しなかった。

### 環境
OSX 10.9.2

### トラブル

コマンド

```
$ python --version
```

実行結果

```
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 5, in <module>
    from pkg_resources import load_entry_point
  File "/Library/Python/2.7/site-packages/distribute-0.6.49-py2.7.egg/pkg_resources.py", line 2877, in <module>
    working_set.require(__requires__)
  File "/Library/Python/2.7/site-packages/distribute-0.6.49-py2.7.egg/pkg_resources.py", line 698, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/Library/Python/2.7/site-packages/distribute-0.6.49-py2.7.egg/pkg_resources.py", line 596, in resolve
    raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: pip==1.4.1
```

### 対応方法

pipをupgradeすることによって解決した。

コマンド

```
$ sudo easy_install --upgrade pip
```

実行結果

```
Reading http://pypi.python.org/simple/pip/
Best match: pip 1.5.4
Downloading https://pypi.python.org/packages/source/p/pip/pip-1.5.4.tar.gz#md5=834b2904f92d46aaa333267fb1c922bb
Processing pip-1.5.4.tar.gz
Writing /tmp/easy_install-w8dJ21/pip-1.5.4/setup.cfg
Running pip-1.5.4/setup.py -q bdist_egg --dist-dir /tmp/easy_install-w8dJ21/pip-1.5.4/egg-dist-tmp-61WflU
warning: no files found matching 'pip/cacert.pem'
warning: no files found matching '*.html' under directory 'docs'
warning: no previously-included files matching '*.rst' found under directory 'docs/_build'
no previously-included directories found matching 'docs/_build/_sources'
Adding pip 1.5.4 to easy-install.pth file
Installing pip script to /usr/local/bin
Installing pip2.7 script to /usr/local/bin
Installing pip2 script to /usr/local/bin

Installed /Library/Python/2.7/site-packages/pip-1.5.4-py2.7.egg
Processing dependencies for pip
Finished processing dependencies for pip
```

### 確認

正常に動作するようになったことを確認した。

コマンド

```
$ python --version
```

実行結果

```
pip 1.5.4 from /Library/Python/2.7/site-packages/pip-1.5.4-py2.7.egg (python 2.7)
```
Sublime Text3 初期導入(Windows)

#SublimeText3

インストール後まずすること

以下のURLからパッケージコントロールを入れるためのコマンドを
コピーする(参考サイトだと、たまに古いのを貼り付けてあるので)
https://sublime.wbond.net/installation

SublimeText3のメニューバーから

View->Show Consoleを選択

下部にコンソールが出るので、先ほどのURLからコピーしたものを
ペースト＆エンター

これで、パッケージコントロールが導入される。
注意：プロクシ使ってると、プロクシの設定をしないといけないはず。
JavaScript、Python、HTML周りのパッケージを
とりあえず入れる。

1.BracketHighlighter 括弧の始まりと終わりを可視化。便利
2.jQuery jQueryの保管
3.DocBlockr 関数等のコメント保管、/** をうつのめんどくさいよね
4.SublimeLinter 構文エラーチェック 必須。
5.SublimeLinter-jshint "SublimeLinter"とセット。Javascript用(Javascriptはnode.jsインストールとnpmでパッケージ追加必須)
6.SublimeLinter-flake8 "SublimeLinter"とセット。python用(pythonのインストール -> pieのインストール「 http://www.pip-installer.org/en/latest/installing.html 」 -> flake8のインストール必須　CMD「 python -m pip install flake8」 -> pathを通す 「任意で読替え D:\program\python27\Scripts\flake8」->　CMD 「flake8」なんか表示されればOK)
7.SublimeLinter-html-tidy "SublimeLinter"とセット。HTML5用(HTML Tidy for Windows with HTML5, tidy.exe download, batch files[ http://tidybatchfiles.info/ ]からtidy.zipをDL ->　pathを通す)
9.IMESupport 変換

見やすくまとめるのはまた今度

自分の違う記事からコピペ
###忘れやすいコマンド
| やりたいこと         | Windows | Mac |
|:--------------------|---------------------------------------------:|:------------:|
| スクリプトの実行      | ```Control``` + ```B```                      |        |
|画面の分割(左右)       | ```Alt``` + ```Shift``` + ```Number```       | |
|画面の分割(上下)       | ```Alt``` + ```Shift``` + ```8```            | |
|矩形選択              | ```Shift```+```右クリック(マウス)```+```移動``` ||
|行選択                | ```Ctrl``` + ```L```                         ||
|コマンドプロンプトを開く| ```Ctrl``` + ```Shift``` + ```P```           ||
|ブックマーク          | ```Ctrl``` + ```F2```　(F2で移動)             ||
|画面の複数化          | ```Alt``` + ```Shift``` + ```Number```       | |
|画面間の移動          | ```Control``` + ```Number```                 ||
リムーバブルディスクにファイルを書き込むときの注意


##空っぽのファイルができる!
以下のコードを実行すると、ぱっと見はファイルができています。取り外して別のPCで見ると中身が空っぽになります。

```java:
FileOutputStream fout = new FileOutputStream("path to removable disk");
byte[] data = new byte[4096];
fout.write(data);
fout.flush();
fout.close();
```

##何が起きているか
リムーバブルディスクへの書き込みが遅延書き込みモードになっており、書き込まれたデータはディスクではなくバッファに存在しています。書き込んだ環境のファイルシステム上では、見た目上では保存されているように見えますが、正しく書き込むためには同期を行う必要があります。

##同期
ファイルディスクリプタを取得してsyncメソッドを呼び出せばOKです。

```java:
FileOutputStream fout = new FileOutputStream("path to removable disk");
byte[] data = new byte[4096];
fout.write(data);
fout.flush();
fout.getFD().sync();//ここを追加
fout.close();
```

##注意
最近のUSBメモリはそこそこに速いですが、物理的に書き込むのは決して速い処理ではありません。
さらに最近のUSBメモリは内部のチップによるウェアレベリングによって書き込みが分散されますが、それでも書き込み回数には制限があり同期によってNAND素子を1つ減らすことになります。
同一ファイルに対する読み書きが複数回あるならば、全てが終わった後に同期を行うべきで、同期を乱用してはいけません。