OmniAICreator/Qiita-1.07M huggingface dataset:
HugoをWerckerでビルドし、GitHub Pagesで公開するまでの手順


preview: http://syui.github.io/lanyon-hugo/

repository: https://github.com/tummychow/lanyon-hugo

```bash:
$ sudo pacman -S mercurial go

$ cat < EOF >> ~/.zshrc
if [ -x "`which go`" ]; then
  export GOPATH=\$HOME/go
  export PATH=\$PATH:\$GOROOT/bin:\$GOPATH/bin
fi
EOF

$ go get -v github.com/spf13/hugo

$ git clone https://github.com/tummychow/lanyon-hugo

$ cd lanyon-hugo

$ vim config.json
{
    "contentdir": "content",
    "layoutdir": "layouts",
    "publishdir": "public",

    "builddrafts": false,

    "baseurl": "http://syui.github.io/lanyon-hugo/",
    "canonifyurls": true,
    "permalinks": {
        "post": ":year/:month/:day/:title/",
        "fixed": ":title/"
    },

    "params": {
        "Title": "Lanyon",
        "Tagline": "A Jekyll theme",
        "Author": "Mark Otto",
        "DateForm": "Jan 2 2006",
        "Github": {
            "Url": "http://github.com/syui/lanyon-hugo",
            "Head": "master"
        }
    }
}

$ hugo server
$ firefox localhost:1313/lanyon-hugo

$ git add .

$ git commit -m "force"

# forceしたものを自分のリポジトリに上げます
$ git push

$ hugo

$ git push --delete origin gh-pages

$ cp -rf .git public/

$ cd public
$ jekyll server

$ git checkout -b gh-pages

$ git add .

$ git commit -m "up"

$ git push -f origin gh-pages

$ cd ..

$ cat < EOF > wercker.yml
box: wercker/default
build:
  steps:
    - arjen/hugo-build:
        version: 0.12
        theme: herring-cove
        flags: --buildDrafts=true

deploy:
    steps:
        - lukevivier/gh-pages:
            token: \$GITHUB_TOKEN
            basedir: ./public
            repo: syui/lanyon-hugo
EOF

$ git add wercker.yml

$ git commit -m "ci"

$ git push
```

テンプレートが古いので、更新スクリプトを書きました。基本的には、`word`に変更するワードを入れれば、自動で書き換えます。

```bash:
#!/bin/bash

#ERROR: 2015/04/22 Node's .Url is deprecated and will be removed in Hugo 0.15. Use .URL instead.
#ERROR: 2015/04/22 Site's .Recent is deprecated and will be removed in Hugo 0.15. Use .Pages instead.

word1=".Url"
word2=".URL"

grep -R $word1 ../  |grep -v config.json | grep -v hugo-1.5-url-fix.sh

echo [y]
read key
case $key in
    y)
        file=`grep -r $word1 ../ | cut -d : -f-1 | grep -v config.json | grep -v hugo-1.5-url-fix.sh`
        echo "$file"
        for (( i=1;i<=`echo "$file" | wc -l | tr -d ' '`;i++ ))
        do
            a=`echo "$file" | awk "NR==$i"`
            echo $a
            case $OSTYPE in
                darwin*)
                    com="s/${word1}/${word2}/g"
                    sed -i "" ${com} $a
                    ;;
                linux*)
                    com="s/${word1}/${word2}/g"
                    sed -i ${com} $a
                    ;;
            esac
        done
        ;;
esac
```

あとは、werckerにログインして、アプリを設定します。

[WerckerでMiddlemanのBuild,Deployを自動化する](http://qiita.com/syui/items/6fc64694863e14233b0b)

[OctopressをBitbucketで管理し、Werckerでデプロイする方法](http://qiita.com/syui/items/2aee0cece27337697ba9)
android5.1.0_r5..android5.1.1_r1の差分コミット


## project bootable/recovery/
0e5356a DO NOT MERGE Revert "Erase PST partition if its marked to be erased."

## project build/
a9c8e58 "LMY47V"
b2bc140 "LMY47U"
3892a6c "LMY47T"
60c5a09 "LMY47S"
9ef1170 DO NOT MERGE - Bump version to 5.1.1
33045be "LMY47R"
cc61059 "LMY47Q"
caa45d6 "LMY47P"

## project device/lge/hammerhead/
5e1dad8 mm-camera-interface: Retry in case of timeouts

## project device/moto/shamu/
2512496 DO NOT MERGE: mm-camera-interface: Retry in case of timeouts
8766777 DO NOT MERGE: Camera3: Increase retry count when opening camera

## project device/samsung/manta/
10299be manta: build libmllite from source
017ed8f manta: update prebuilt kernel

## project external/libpng/
7be36a0 Fix buffer overwrite in png_build_index
36c9013 Fix buffer overflow security vulnerability (CVE-2014-9495)

## project external/libselinux/
6608a18 DO NOT MERGE: handle newlines in file names

## project frameworks/av/
2241216 mediaplayer: ensure secure decoders are instantiated before starting source
1b4d229 DO NOT MERGE - audio policy: fix DeviceVector::getDevicesFromType()
6dc6c38 DO NOT MERGE - audio policy service: fix possible memory overflow

## project frameworks/base/
51c2367 [DO NOT MERGE] Fixed NPE when trying to animate a window without display
f2e5ef3 Fixing to fail android.JobScheduler.TimingConstraintsTest#testSchedulePeriodic in TV test.
48a5ed5 AccessibilityNodeInfo refresh returns a stale state. - DO NOT MERGE
ac9da77 When scanning unbundled apps, only install the expected APK tree
32dcf56 CEC: Explicitly turn on screen for remote control passthrough
b298ba3 Fix NPE if FPE service does not exist.
a6f3009 Disable more hotkeys while in setup.
c6cd327 Write correct checksum when formatting partition
a4e0ab6 Define the capability to speed up MT call audio
4faaaf6 Avoid crashing on corrupted notifications.
157cf33 Prevent activities from being started during setup wizard.
04817d6 Move Noto Sans Tai Le to the end of the font fallback list.

## project frameworks/opt/net/ims/
e9ab611 Add interface to determine whether the IMS service is available

## project frameworks/opt/telephony/
47ca8fb IMS phone instantiation: add polling on base phone creation

## project hardware/intel/common/libmix/
0226d74 libmix: fix out of order decode issue on FUGU

## project hardware/invensense/
3c9a4d3 manta: batching and timestamp issues

## project packages/apps/FMRadio/
1a98ea7 [FM] Earphone mode incoming call ringtone issue in loudspeaker

## project packages/apps/InCallUI/
cd0aa4f Don't hide end call button until call is disconnected

## project packages/apps/Settings/
5f1747a Fix sim notifications.

## project packages/apps/TvSettings/
dcd9bca DO NOT MERGE : Add link to home screen settings

## project packages/inputmethods/LatinIME/
4585f32 Block overflow menu during setup. DO NOT MERGE

## project packages/services/Telecomm/
a31be43 Speed up audio setup for IMS MT call

## project packages/services/Telephony/
bd41f74 Set the capability to speed up audio setup for IMS MT call
macOS-XでのEclipseのショートカットについて。

Eclipseのショートカットキーについてお伺いしたいのですが、
コードアシストがcontrol+スペースで可能と書かれていますが、
私の環境ではうまくいかないようです。

eclipseのkey情報や、macのキーボード設定を確認してみても、
どこに原因があるかわからない状態でございます。

詳しい方がいらっしゃいましたら、ご教授いただけたらと思います。

以上、よろしくお願いいたします。
OctopressをBitbucketで管理し、Werckerでデプロイする方法

##はじめに

はじめに、基本的な状況を説明します。

まず、前提として、Octopressのソースコードは、今までローカルまたは、GitHubで管理していました。

https://github.com

https://github.com/imathis/octopress

GitHubは、プライベートリポジトリの設定ができないため、全部のソースが公開されてしまいます。

したがって、公開が望ましくない秘匿性を含むファイルは、`.gitignore`でアップロードしないように設定し、ローカルで管理していましたが、それを含め、OctopressのソースコードをBitbucketのプライベートリポジトリで管理するように変更しました。

```bash:.gitignore
.bundle
.DS_Store
_deploy
public
sass.old
source.old
source/_stash
source/stylesheets/screen.css
vendor
node_modules
Gemfile.lock
.gist-cache
.sass-cache
```

例えば、私の場合は、Google APIを使い記事ごとのアクセス数を集計し、その結果をサイドバーに表示するプラグインを使用しています。いわゆる人気記事サイドバーというやつですね。

ここで、Google APIを使用するには、シークレットキーなど秘匿性を含む情報が必要で、それを記述したファイルを`.gitignore`などに書いていました。

また、基本的に、`cache`ファイルも公開には向きませんが、ビルドには向きますので、それらを`.gitignore`から消して、Bitbucketのプライベートリポジトリに`push`することにします。

##Bitbucket

https://app.wercker.com/

今まで、GitHubでバージョン管理していたので、それをBitbucketの.gitに切り替えます。

```bash:
$ rm -rf .git

$ git init

$ git remote add origin https://username@bitbucket.org/username/repository.git
```

##Wercker

そして、wercker.ymlを書いて、リポジトリをpushします。

```yaml:wercker.yml
box: wercker/rvm

build:
    steps:
        - rvm-use:
            version: 1.9.3

        - bundle-install

        - script:
            name: build with octopress
            code: bundle exec rake generate

deploy:
  steps:
    - script:
        name: Get commit message
        code: |
          export COMMIT_MSG=$(git log --pretty=format:"%s" -1)
    - script:
        name: Configure git
        code: |-
          git config --global user.email "user@email.com"
          git config --global user.name "user"
          rm -rf .git
    - script:
        name: Deploy to github pages
        code: |-
          cd ./public
          git init
          git add .
          git commit -m "${COMMIT_MSG}"
          git push -f https://${GITHUB_TOKEN}@github.com/syui/syui.github.io.git master
```

```bash:
$ git add .

$ git commit -m "bitbucket"

$ git push -u origin master
```

次に、[Wercker](https://app.wercker.com/)でアプリを設定。

> Apps > Add an application

でアプリを追加します。ここには、GitHubのリポジトリを指定します。

> Settings > Deploy targets > Add deploy target > Custom deploy

でデプロイ対象を追加。Auto deploy はチェックして、ソースの方のブランチ名を指定します。

> Deploy pipleline > Add new variable

にて、werckerで使う環境変数を設定します。ここでは、GitHubのAPIを使えるようにしたいと思います。変数名は、GITHUB_TOKENにしておいてください。設定ファイルの記述が変わってきます。

GitHubで

> Settings > Applications > Personal Access Tokens

でトークンを発行生成し、そのキーをWerckerのところに記述します。

完了すれば、リポジトリにファイルをpushするだけで、自動デプロイが実行され、ブログが更新されます。

##参考

わかりにくければ、以下の記事及び、画像を参考にしてみてください。

[WerckerでMiddlemanのBuild,Deployを自動化する](http://qiita.com/syui/items/6fc64694863e14233b0b)
ゲーム開発現場でMacとWindows上で動かすツールを作った話し

# 結論
Python言語を選び、その環境の構築の難易度が高く、保守管理・拡張にとても高コストな運用をしてしまう事になりました。

# 経緯
仕事でMacとWindows上で動作するツールを作る必要に迫られました。
そこで自分のMacマシンのターミナル（コマンドライン）から簡単に実行出来るPythonを選びました。

このツールはゲームのアイコン画像を沢山合成し出力するものです。
アイコンの素材をデザイナーさんが作成し、Googleスプレッドシート上のデータを参照しながらPythonプログラムが大量のアイコンを出力します。
（最終的にこのアイコン画像はUnityのNGUIでのAtlasという形で1枚にまとめられ、さらに複数のAtlasとなって終了となります）

# Python以外の問題点
今回はじめてPythonを使ってみて分かった事としては環境構築の難しさです。
そして、ビルド（コンパイル）が要らない言語の便利さよりも、ソースコード管理への考えの甘さも有りました。
なんといっても最初は簡単な画像の合成だけを行っていたため、このツールの管理をsvnではなく自分のMacローカル上で動作したPythonのソースコードをzipにしてデザイナーさんに渡していましたし、そのせいでbatファイルや、更にはちゃんとwindows上でPythonが動作するか確認するためのwindowsマシンを用意する必要が出てくるなど、後々自分がこんな大変な思いをするとも思っていませんでした。

# Pythonを選択した理由
Pythonはとてもいい言語だと思います。
既に多くのライブラリが存在し、画像編集も同じようにライブラリが用意されていますし、また多くのプログラマが扱える言語でもあります。

これはビルドを必要とせず、ツールを使う環境ごとにそれぞれ必要なPathやファイル名などのローカルなデータをPythonのソースコードに直に書いて編集できるというメリットもあったためです。

そしてコマンドラインからファイル単体で実行できるという強み。
また、現実的な課題として本当に小さなプログラムから始まったため、Mac/Windowsへのクロスコンパイルが出来るようにといった発想が欠如していたのもPythonを選択した要因の一つでした。

# 直面したPythonの問題点
今回作ったPythonプログラムの問題点は、コンパイルがいらないが故に動作させるマシン上にライブラリなどの環境構築をプログラマではないデザイナーさんに時間を割いて行ってもらう必要があり、自分がその環境構築を指示・実行しなくてはいけなかった点です。

今ではクロスコンパイル出来る言語を選択すればよかったと思ってます。

まず、自分がMac上でPythonをガリガリ書き上げて、ターミナルからPythonファイルを実行し動作するのを確認した後でzipにしてチャットでデザイナーさんへ渡していました。
しかし渡してみると、Windows上で動作しないのです。
チャットで状況やエラーの報告を受けて、対応しますが中々動作しません。
最終的に僕はデザイナーさんの席へ歩いて行きプログラムを確認しました。
コレによって、彼の作業を中断させ自分の他の実装を遅らせたわけです。

エラーを追ってみた所、Mac上にはあるライブラリがありませんでした。
確か Python Imaging Library (PIL) がその時は無かったです。
こいつがすごく厄介でした。

まず解決方法として、
`$ brew install pil`
だけで済む作業を、何時間もかけて調査して色々なライブラリを無駄に導入して貰う結果になったと記憶しています。
（gcc とかで何らかのライブラリをコンパイルまでして貰ったような・・・）
この作業が本当に辛かったです。

# Googleスプレッドシート
次に、GoogleスプレッドシートからCSVのダウンロードです。
最初はUnityのAssetServer（Unity独自のバージョン管理システム）で管理されているゲームプロジェクト上にあるマスターデータからアイテムのデータを参照していました。
しかし、次のバージョンの開発が決まるとプロジェクトのブランチが新しくsvnに切られ、今まで参照していたマスターデータが古くなってしまうのです。
そのためアイテムの最新状態を保守するために、（幸いにも）常に最新を維持しているGoogleスプレッドシートを参照する事にしました。
Googleスプレッドシートを参照するにあたって、gspread というPythonのライブラリを使っています。

デザイナーさんにはgoogleアカウントとそのパスワードをPythonを呼び出すbatファイルに直接記述して貰う事にしました。
そして、まだzipでやりとりしていたため自分が知らないうちにデザイナーさんがsvnへとzipをコミットしてしまったのです。これで一生、彼のアカウントとパスワードがsvn上に残り続けてこのzipファイルをチェックアウト出来る人なら誰でも彼のアカウントを乗っ取れてしまうわけです。

パスワードは変えてもらいました。

そしてその危険性と gspread がメールアドレスとパスワードを非推薦した事で、OAuth の対応が必要になりました。
そう、”もうちょっとしたプログラム”ではなくなっていたのです。
書き飛ばしてしまいましたが、勿論 gspread もデザイナーさんの環境に構築しなくてはならず、僕はとても大変でした。

そして、このプログラムは今もまだ保守管理・拡張が行われています。
さっさと乗り換えたいですが、実際問題時間が割けないので今に至っています。
（色々とダメプログラマーですね・・・）

# 今後の課題と得たこと
今回のツールは、デザイナーさんの作業負担を減らすという課題がこのプログラムの使命としてずっと存在しています。
そのため、UnityEditor から実行して Atlas の import をようにしたいのですが、それも不勉強と時間不足によってずっとなされないまま今に至ります。
僕はツールプログラマではありません。ゲームの実装もしなくてはいけないのです。

しかし、今回の件で得たことはとても大きかったです。
Pythonによるコマンドラインから実行できる強み。
それとコンパイル済みのプログラムがライブラリ環境を必要としない事で実行環境への負担と管理が軽減される事が今回分かりました。
コレは自分としてはとても大事な発見であり経験だったと思います。

そして、なにより、自分のような未熟なプログラマが他にも要ると思います。
あなたが今作ろうとしているプログラムの実行環境が複数のOSを跨ぐのだとしたら、この記事が一つ参考になると嬉しです。
gradle pluginのソースコードをビルドして動かす


既に公開されているpluginのソースコードを拾ってきて少し変更して動かす方法が分からなくてハマったのでメモ。

具体的にはgradle-xcodePluginをちょっと触ろうと思ったんだけどソースコードからだと`apply plugin:`が上手く出来なくてハマった。

# 環境

* gradle 2.3

# 前置き

buildSrcに入れて動かすとかjarをimportして動かすとか色々あるっぽいのだけど上手く行かなかったので、以下のようにした。

1. pluginのソースコードをローカルに配置
2. pluginのビルドを実行
3. ビルドしたpluginをuploadArchivesでローカルリポジトリとして配置
4. build.gradleのrepositoryに手順3で配置したパスを追加

# やったこと

## pluginのソースコードを取得

```
cd ~/workspace
git clone https://github.com/openbakery/gradle-xcodePlugin
```

## pluginのビルド

```
cd gradle-xcodePlugin
gradle build
```

## ビルドしたpluginの配置

uploadArchivesというtaskでmaven repositoryにファイルを配置するのがmaven界のしきたりっぽい(?)けど完全に理解してない。

```
gradle uploadArchives
```

今回のpluginのbuild.gradleにはこんな感じで書いてある。

```workspace/gradle-xcodePlugin/plugin/build.gradle
...
uploadArchives {
  repositories {
    mavenDeployer {
      repository(url: uri('../../repository'))
    }
  }
}
...
```

この場合はworkspace/repository以下にmaven repositoryぽいものが出来る。

## applicationのbuild.gradleの編集

workspace/Appにアプリが配置されていて、直下にbuild.gradleがあるものとすると、以下のようにrepositoriesとdependenciesを指定することでビルドしたpluginを利用することが出来る。

```workspace/App/build.gradle
...
buildscript {
  repositories {
    maven {
      url uri('../repository')
    }
    mavenCentral()
  }
  dependencies {
    classpath group: 'org.openbakery', name: 'xcodePlugin', version: '0.10.+'
  }
}

apply plugin: 'xcode'
...
```

これで`gradle task`とかやってpluginのtaskが表示されたら成功。

もう少しスマートなやり方があったら教えて下さい。


# 参考

Creating a Gradle Custom Plugin with Java
http://stackoverflow.com/questions/17664183/creating-a-gradle-custom-plugin-with-Java

ダメだったその他の方法っぽいやつ
http://gradle.monochromeroad.com/docs/userguide/custom_plugins.html
Mavenで環境依存の値をバージョン管理の外に出す

ファイルのパスは、環境ごとに異なるものです。
バージョン管理内に入れていると、変更ありになってしまったりして面倒です。
というわけで、Mavenでそういった環境依存の値をバージョン管理の外に出す構成と記述の一例をまとめます。
動かすための一連の内容なので、個々の詳細な解説は他に譲ります。
あくまで「Mavenではこんな感じでできる」の例です。フレームワークなど、それぞれの方法があれば、そちらの作法に従うようにしましょう。

具体的には、resourcesの下にあるファイルの文字列をビルド時に置換します。

## 1. pom.xmlで、プロパティとフィルタリングの設定をする

pom.xmlの中に、以下の様な記述をします。
\<directory\>以下のファイル内で、\${foo}という文字列を\${bar}の内容に書き換えます。
${bar}の実際の値は、~/.m2/settings.xml で定義します。（後述）

```xml:pom.xml
<properties>
  <foo>${bar}</foo>
</properties>
<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>
```

## 2. ~/.m2/settings.xmlを作成し、プロパティの値を定義する

maven実行ユーザーの ~/.m2/ に settings.xml というファイルを、以下のような内容で作成します。
※既に settings.xml がある場合は、\<profile> タグを増やしましょう。

```xml:settings.xml
<settings xmlns="http://maven.apache .org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <profiles>
    <profile>
      <id>sample-profile</id>
        <activation>
          <activeByDefault>false</activeByDefault>
        </activation>
        <properties>
          <bar>/home/marrontan619/sample.txt</bar>
        </properties>
    </profile>
  </profiles>
</settings>
```

この sample-profile のプロファイルをアクティブにすることで、pom.xml内の \${bar} が /home/marrontan619/sample.txt にとして認識されます。


## 3. 置換される文字を含んだプロパティファイルを、プロジェクトの /src/resources/ の下に作成する

Java から読み込むときに便利なので、拡張子は.properties にしておきましょう。

```properties:config.properties
baz=${foo}
```

## 4. ビルドする

2 で作成したプロファイルをアクティブにするには、いくつか方法があります。
以下のいずれかの方法１つで十分です。

1. eclipse で開発している場合は、プロジェクトを選択→Alt+Enter→Mavenを選択→アクティブ Maven プロファイルに、（今回の例では）"sample-profile" と入力する。
2. settings.xml 内の \<activeByDefault> の値を true にする。
3. mvn コマンドの -P オプションに、（今回の例では）"sample-profile" を渡す。
例： mvn clean install -P sample-profile

ビルドして出来た config.properties の中身は、こんな感じになります。

```properties:config.properties（成果物）
baz=/home/marrontan619/sample.txt
```

## 5. Java から利用する

順番としては、これをやらないとビルドする意味もないのですが、あくまで今回ここはおまけです。

```java:Sample.java
java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("config");
String baz = bundle.getString("baz");
```

baz の中身は "/home/marrontan619/sample.txt" になります。


以上、何番煎じだという感じの内容でしたが、自分がハマったところをまとめてみました。

pom.xml 内で、アクティブになっているプロファイルからプロパティを読み込めず、置換が出来ない場合はビルドエラーにしたいのですが、いい感じの書き方ありませんか？
教えてエロい人。

その他、気づいたことやご指摘等ございましたら、バシバシください。


### 注記というか言い訳

foo と bar は同じ名前にするのが通常です。
また、そうすれば pom.xml に\<properties> のタグは必要ありませんが、プロファイルが選択されなかった場合に、config.properties の内容が置換されない状態で成果物ができてしまうので、ビルドエラーを出すためにも記述してあります。
本記事では、どこの記述がどこに対応しているかを明確にさせるために、このようになっています。
総務省統計局の地域メッシュを経緯度に変換してみる。


これで市区町村の境界線を Google Maps にマッピング出来ると思ったけど、無理だった地域メッシュを経緯度に変換するメモ。

**どうせだから GeoJSON で吐くようにした。**

使用するデータは下記、総務省統計局の都道府県別に提供されている CSV データ:

* [統計局ホームページ/市区町村別メッシュコード一覧](http://www.stat.go.jp/data/mesh/m_itiran.htm)


上記 CSV データから経緯度を取得する計算方法は次のページを参考にした:

* [03/30　地域メッシュコードを緯度経度に変換する - 二丁目で働く社長の日記](http://www.erde.co.jp/blog/?p=646)

Gist はこちら:

* [地域メッシュの GeoJSON 変換](https://gist.github.com/japboy/15443d79d1a02bfc577c)


例えば [東京都のメッシュコード](http://www.stat.go.jp/data/mesh/csv/city-mesh_13.csv) から [GeoJSON](http://geojson.org/) ファイルを出力する場合は、こんな感じのコマンドを叩く:

```
npm run convert ./city-mesh_13.csv 
```

すると、GeoJSON 形式の `city-mesh_13.json` が出力される。

コードはこんな感じ:

```javascript:mesh2geojson.js
'use strict';

var fs = require('fs');
var path = require('path');

var _ = require('underscore');
var concat = require('concat-stream');
var csv = require('csv');
var GeoJSON = require('geojson');
var iconv = require('iconv');


// 地域メッシュを経緯度に変換
var latlng = function (_mesh) {
  var mesh = _mesh.toString();
  var mesh1 = mesh.slice(0, 4);  // 1 次メッシュ
  var mesh2 = mesh.slice(4, 6);  // 2 次メッシュ
  var mesh3 = mesh.slice(6, 8);  // 3 次メッシュ

  // 経度の度分秒
  var latDeg = parseInt(mesh1.slice(0, 2)) / 1.5;
  var latMin = parseInt(mesh2.slice(0, 1)) * 5;
  var latSec = parseInt(mesh3.slice(0, 1)) * 30;
  // 緯度の度分秒
  var lngDeg = parseInt(mesh1.slice(2, 4)) + 100;
  var lngMin = parseInt(mesh2.slice(1, 2)) * 7.5;
  var lngSec = parseInt(mesh3.slice(1, 2)) * 45;

  // 10 進数表記に変換
  var lat = ((latDeg * 3600) + (latMin * 60) + latSec) / 3600;
  var lng = ((lngDeg * 3600) + (lngMin * 60) + lngSec) / 3600;

  return [ lat, lng ];
};

var f = fs.statSync(process.argv[2]).isFile() ? path.resolve(process.argv[2]) : undefined;
var filein = fs.createReadStream(f);
var fileconv = new iconv.Iconv('Shift_JIS', 'UTF-8//TRANSLIT//IGNORE');
var fileout = fs.createWriteStream(f.replace(/\.csv$/, '.json'));

filein
  .pipe(fileconv)
  .pipe(csv.parse())
  .pipe(csv.transform(function (values) {
    return {
      code: parseInt(values[0]),
      name: values[1],
      coords: [ latlng(values[2]) ]
    };
  }))
  .pipe(concat(function (_data) {
    var data = _.reduce(_data, function (memo, item) {
      if (!_.isArray(memo)) return [ item ];
      var last = _.last(memo);
      if (last.code === item.code) {
        last.coords.push(item.coords[0]);
      } else {
        memo.push(item);
      }
      return memo;
    });
    var geoData = GeoJSON.parse(data, { 'MultiPoint': 'coords' });
    fileout.end(JSON.stringify(geoData));
  }));
```

```json:package.json
{
  "name": "mesh2latlng",
  "author": "Yu I.",
  "license": "UNLICENSE",
  "scripts": {
    "convert": "node ./mesh2geojson.js"
  },
  "dependencies": {
    "concat-stream": "^1.4.8",
    "csv": "^0.4.1",
    "geojson": "^0.2.0",
    "iconv": "^2.1.6",
    "underscore": "^1.8.3"
  }
}
```
Mac OS Xで旧いJDKをアンインストールする

/Library/Java/JavaVirtualMachines/配下の旧いバージョンのJDKディレクトリを削除するだけ

# バージョン確認
```bash:
/usr/libexec/java_home -V
```

# コマンド

```bash:
sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.8.0_<update>.jdk
```

ex)
```bash:
sudo rm -rf /Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk
```
Android上のwolからLinuxの自宅サーバーを起動する


## 初めに
Wakeup On LANという、有線LANにマジックパケットを送信することで外部から電源を投入できる仕組みがあります。
これを使うと、自宅サーバーを常時稼働させる必要がなくなり大変便利です。
しかし、筆者が利用しているHomeGateWayはAterm BL900HWであり、Wakeup On LANマジックパケット送信ができません。
そこで、Wifi運用のAndroid端末にSSHして、そこからLinuxの自宅サーバーを起動することを考えます。

## 準備(ルータ)
- AndroidのSSHポートへポートマッピング設定を行って下さい。自宅サーバーを開設している方なら大丈夫だと思いますので説明は省きます。

## 準備(Android)
- 家に置いておくAndroidが必要です。多分Froyoで大丈夫。Wifiはスリープ中でも常時ONにする設定が必要です。
- SSHサーバーアプリは別途導入して下さい。筆者は(当時[DroidSSHD](https://code.google.com/p/droidsshd/)の不具合の多さに辟易したので)[QuickSSHD](https://play.google.com/store/apps/details?id=com.teslacoilsw.quicksshd)を購入しました。
  - なお、QuickSSHDはarmでしか動きません。AST21の動作確認はadbで行いましたが、どうしたもんでしょうね。

1. wolコマンドを用意します。
2. まず、Android NDKを用意し、build/tools/make-standalone-toolchain.shを使ってtoolchainを設定します(このスクリプトは、コンパイラとplatform/android-*/arch-*をsysrootとしてコピーする原理のようです)。
3. https://sourceforge.net/p/wake-on-lan/code/HEAD/tree/ をチェックアウトし、`sh autogen.sh`、続いて`./configure --host=arm-linux-androideabi`とします。
4. config.hの`rpl_malloc`、`rpl_realloc`、`HAVE_ETHER_HOSTTON`の各行をコメントアウト。`HAVE_STRUCT_ETHER_ADDR`を1、`HAVE_STRUCT_ETHER_ADDR_ETHER_ADDR_OCTET`を1に設定します。
5. makeすると、src/wolが生成されるので、これをAndroidに転送します。転送方法はsshでもadbでも構いません。ただし、SDカード領域に転送したアプリは実行できないので、/data/local(/tmp)配下に転送することになるでしょう。

なお、x86マシンの場合は、`--host=i686-linux-android`となります。

## 準備(Linuxマシン)
### BIOS
- 例として、A78M-E35マザーボードの場合、Power Management Setupの`EuP 2013`をdisabled、Wakeup Event Setupの`Wake up Event by`をBIOS、`Resume By PCI-E Device`をenabledに設定します。

### Linux
- `sudo ethtool -s eth0 wol g`としてwolを有効化、`sudo ethtool eth0`から確認します。
- MACアドレスを確認しておきます。

## 使い方
- 指定ポートにSSHします。
- SSH上からwolコマンドを実行すると、当該端末の電源を投入できます。

## ログ
MacBookAir -> 大学 -> 自宅のAndroidとアクセスしています。

```
neige:~ *******$ ssh ***
[*******@***01 ~]$ ssh root@****.yi.org -p **22 -v -2
root@****.yi.org's password: 
root@android:/data/data/com.teslacoilsw.quicksshd/home # /data/local/wol 44:8a:5b:**:**:**
Waking up 44:8a:5b:**:**:**...
root@android:/data/data/com.teslacoilsw.quicksshd/home # 
[*******@***01 ~]$ logout
neige:~ *******$
```

## 追伸
最初はbusyboxのether-wakeで実験していたのだけど、導入手順がかなりややこしい(そしてx86向けにコンパイルできなかった)ので別アプリにしたところとても簡単に導入できるようになった。
MMDAgentマニュアル fstファイルの記述方法

「遷移元状態番号 遷移先状態番号 イベント名 コマンド名」の順で，1文字以上のスペースorタブで区切る．
イベント名，コマンド名を設定したくないときは `<eps>` を記述する．

# 状態
0 起動直後
1 待機状態
2
Android Wearのデバッグを始める時の手順メモ

Android Wearのデバッグを始める時に忘れそうなのでメモ
Handheld、Wear共に実機を使う時と、共にエミュレータの時。

WearとMacをUSB接続するやり方はやった事ないのでわかりません。

## 実機でAndroid Wearのデバッグをする場合

#### 前提
- [Mac] - USB - [Handheld] - Bluetooth - [Wear] のように接続済
- Wear側はHandheldとBluetoothでのペアリングは済
- １度はデバッグした事ある


#### 手順
- Handheld側でAndroid Wearアプリを起動。
- 設定のBluetooth経由のデバッグを許可
- Wear側のBluetoothでデバッグを有効に。

Mac上で

```
# 接続されているデバイスの確認
$ adb devices
List of devices attached
Handheld        device
# ↑Handheld側の端末しかでない
$ adb forward tcp:5555 localabstract:/adb-hub; adb connect localhost:5555
```



## エミュレータだけでAndroid Wearのデバッグをする場合

#### 前提
- Handheld側はGenymotion。Wear側はエミュレータ。
- HandhedlとWearは接続した事はある
- １度はデバッグした事ある


#### 手順
- HandheldとWear両方のエミュレータを起動させる

```
# 接続されているデバイス一覧を確認
$ adb devices
List of devices attached
emulator-Hand device
emulator-wear device
# ポートフォワーディング
adb -d -s emulator-wear forward tcp:5601 tcp:5601
adb -d -s emulator-Hand forward tcp:5601 tcp:5601
# ↑wear側だけでOKな時もあるし、そうじゃない時もあった。。。
```


## thanks
- http://lastshooting.blogspot.jp/2014/08/android-wear.html

その他いくつか見た気がする
カスタムxibを手軽にコードから使用する

APIからの値を繰り返し表示したり、フォームを動的に生成したい場合とかに割と便利なカスタムviewの作り方のメモ

* UIViewを継承したクラスとXibを同じ名前で作成する。(同じにすることで、xib読み込み時にファイル名を指定する必要がなくなります。)
* 作成したxibのCustom Classに作成したクラスを指定する。
* 以下のコードをクラスに実装 

##作成したクラスに追加したコード
```objc:SampleView.h
+ (instancetype)view;
```

```objc:SampleView.m
+ (instancetype)view
{
    UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
    id view = [nib instantiateWithOwner:self options:nil][0];
    return view;
} 
```

##使用方法
SampleViewクラスとSampleView.xibを作成した場合の呼び出し方です。

```objc:sample.m
- (void)viewDidLoad
{
    SampleView *sampleView = [SampleView view];
    [self.view addSubview:sampleView];
}
```

##はまったところ
autolayoutを使用している時は、frameをいくら変更してもviewが変更されないため,

```objc
view.translatesAutoresizingMaskIntoConstraints = YES;

```
のように、autolayoutを解除する必要があります。
autolayoutの設定があることに気がつかずに、数時間無駄にしたのでメモです。

###参考とか
http://qiita.com/ryusukefuda/items/ec04b743683c58958fc3
vim-quickrun-qo 書いた

## [vim-quickrun](https://github.com/thinca/vim-quickrun)とは

Vim界隈ではとても有名なプラグイン。
`:Quickrun` するだけであらゆるソースをVim内で実行できる神プラグイン。
各部がモジュール化されていて、とても柔軟にカスタマイズができる。

## [qo](https://github.com/andlabs/qo)とは

`C` / `C++` / `Objective-C` のソースファイルに特殊なコメントを追加して、
実行ファイルのビルドを補助するツール。

よく知らないけど、`Go`コミュニティ発祥らしい。

こんな感じで書ける:

```c:curl.c
// #qo LIBS: curl
#include <stdio.h>
#include <curl/curl.h>

int main(int argc, char const *argv[]) {
    CURL *curl = curl_easy_init();
    // CURL を使ったプログラムが続く ...
    return 0;
}
```

普通ならこんな感じでコンパイルする:

```bash
> gcc curl.c -lcurl
> ./a.out
```

しかし、`qo`ならこうなる:

```bash
> qo
[  0%] Beginning build
[ 50%] Compiled curl.c
[100%] Linked curl
> ./curl
```

## [vim-quickrun-qo](https://github.com/manicmaniac/vim-quickrun-qo/tree/master/autoload/quickrun/hook)とは

`vim-quickrun`のhookを利用して、`qo`でのビルド、実行に対応させたツール。

ソースファイルの最初の10行以内に`#qo`ディレクティブを見つけると、
`:Quickrun`をフックして`qo`でビルドし、その場で実行する。
`qo`をインストールしておけば、多少複雑なビルドが必要でもVim内で作業を完結できる。

### インストール方法

[Neobundle.vim](https://github.com/Shougo/neobundle.vim)なり[Pathegon](https://github.com/tpope/vim-pathogen)なり、好きなプラグインマネージャを使ってインストールする。

`manicmaniac/vim-quickrun-qo`

### 使用方法

何もない。インストールして`#qo`ディレクティブを使った`C`系のソースを書いて、`:QuickRun`するだけ。
PHP7調査(21)E_STRICTの廃止

E_STRICTエラーがPHP7から廃止されます。いままでE_STRICTだったものはE_NOTICE、E_WARNING、E_DEPRECATEDのいずれかに引っ越します。

現時点でソースコードをgrepするとまだE_STRICTが数個か残っている状況ですので、完全撤廃できるのかは疑問です。

# 例

このことは、たとえば次のようなPHPプログラムで確認できます。

```php
<?php
class Foo {
	public function method() {}
}
class Bar extends Foo {
	public function method($arg) {}
}
```

これをPHP7で実行すると次のように警告されます。

```
$ php7 /tmp/foo.php
PHP Warning:  Declaration of Bar::method() should be compatible with Foo::method() in /tmp/foo.php on line 7
```

これはPHP5まではE_STRICTでした。

```
$ php5 /tmp/foo.php
PHP Strict Standards:  Declaration of Bar::method() should be compatible with Foo::method() in /tmp/foo.php on line 7
```

# 注意点

ただし、php.iniの設定で次のようにE_STRICTを無効にして利用している人もいそうです。そういう人にとっては、PHP5まで何もエラーが無かったコードでPHP7から急に怒られるように映るかもしれませんね。

```
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
```

# 参照

* [PHP RFC: Reclassify E_STRICT notices](https://wiki.php.net/rfc/reclassify_e_strict)
高速に巨大なダミーファイルを作成する方法

もうdd if=/dev/zero ...とかしなくてええんやで？

```bash
$ fallocate -l 10GB dummy.dat
```

# 参考
command line - How to create a file with a given size in Linux? - Stack Overflow
http://stackoverflow.com/questions/139261/how-to-create-a-file-with-a-given-size-in-linux
``fallocate -l 5G bar``

fallocateで素早く仮想化ディスクを用意する | Linux | マイノリティでいこう
http://blog.be-dama.com/2013/03/01/fallocate%E3%81%A7%E7%B4%A0%E6%97%A9%E3%81%8F%E4%BB%AE%E6%83%B3%E5%8C%96%E7%94%A8%E3%81%AE%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B/
1行のjavascriptでページ内に自身のURLを示すQRコードを埋め込む

スマホサイトの実機確認をする時に、効率よくスマホでページを開くための[qri](https://github.com/toyamarinyon/qri/)というライブラリを作りました。
似たようなことができるブックマークレットとか、ブラウザの拡張機能はありますが、ブックマークレットの登録や、拡張機能のインストールなど準備が必要でした。そのため、環境によっては使えないこともありましたので、何も準備せずに使えるものを作りました。

デモ
====
[デモサイト](http://toyamarinyon.github.io/qri/)
「このページのQRコードを表示」をクリックするとQRコードを表示します。
「QRコードを隠す」をクリックするとQRコードを非表示にします。

使いかた
====

QRコードを埋め込みたいページに、以下のコードを貼り付けてください。
あとは、自動的にページの最下部(bodyタグの閉じタグ直前)に、QRコードを挿入します。

```html
<script src="https://toyamarinyon.github.io/qri/dest/qri.min.js"></script>
```

仕組み
====

QRコードを作成するために[Google Chart Tools](https://developers.google.com/chart/infographics/docs/qr_codes?hl=ja)を使っています。
`Google Chart Tools`は、QRコードにしたいURLや、QRコードのサイズをパラメータに含めてリクエストを送ると、QRコードを返します。



```html
https://chart.googleapis.com/chart?chs=150x150&cht=qr&chl=Hello%20world&choe=UTF-8
// 150x150サイズの"hello world"を示すQRコード(画像)を返します。
```

`qri`では、imgタグのsrcとして、APIのURL渡して、返却値を画像として表示します。


ご意見・要望は[https://github.com/toyamarinyon/qri/issues/](https://github.com/toyamarinyon/qri/issues/)までどうぞ！
Ruby on Rails Tutorialで詰まったところ　その２

3章（3.2.1）テスト駆動開発　でどうやってもRSpecのテスト
`bundle exec rspec spec/requests/static_pages_spec.rb`
で「TypeError: オブジェクトでサポートされていないプロパティまたはメソッドです。」
が発生してしまい通らない。。。

ググッてみたら[Windows 7 の Rails で ExecJS が TypeError を吐くようになった](http://qiita.com/scivola/items/ec7625118fcf6de5203a)がひっかかり、
まさかと思ったがRSpecもHTTPクライアント動かして検証していると思われるので
試しにGemfileに「gem 'coffee-script-source', '1.8.0'」を追記したら
うまく動いた。

バージョンアップで動かなくなるの勘弁してほしいっす。
【C++11】threadでメンバ関数を指定するには？

C++11でthreadやmutexなどがサポートされたと知ったので
~~(調べるのもめんどくさいし)~~システム依存のAPIを使いたくないマン
としてはひとまず使ってみたものの、ちゃんと理解してなかったためとあるコンパイルエラーにひっかかった話。

以下、とりあえずstd::threadを使って組んでみたプログラム

```C++:sample
#include <thread>
using namespace std;

class ThreadClass
{
public:
    ThreadClass();
    ~ThreadClass();

    void ThreadStart();
    void MainThread( int param );
};

ThreadClass::ThreadClass()
{
    //constractor
}

ThreadClass::~ThreadClass()
{
    //destractor
}

void ThreadClass::ThreadClass()
{
    // thread create
    std::thread th( &ThreadClass::MainThread, 5 ); // パラメータは適当

    // thread start
    th.detach();
}

void ThreadClass::MainThread( int param )
{
    bool bLoop = true; // thread control flag
    while( bLoop )
    {
       param--;
       if( param == 0 )
       {
          bLoop = false;
       }
    }
}

int main()
{
    ThreadClass* pcThread = new ThreadClass();
    pcThread->ThreadStart();

    return 0;
}
```
 

これでコンパイルを実行すると
>error C2064: 1 引数を取り込む関数には評価されません。
というエラーが・・・

何がおかしいのか途方にくれながら色々ググってると
どうやら**スレッドにメンバ関数を指定する場合は第2引数にthisを渡す**
ことが必要らしい。



なので以下のように修正してみる。

``std::thread th( &ThreadClass::MainThread, 5 );``
これを
``std::thread th( &ThreadClass::MainThread, this, 5 );``
こうすることで、コンパイルも通りちゃんと動作してくれるようになった。

ちゃんと理解しないまま適当にやるからこうなるいい教訓
Aureliaのdocs.mdに書いてある機能を試す(2)


引き続き、docs.md に記載の機能を試していきます。また、調べている最中に見つけたAureliaのContact Listサンプル、コミッタのMatthewさんから教えてもらったAureliaとSassを組み合わせて使う方法についても記載します。

## プラグイン

Aureliaにはプラグインの仕組みがあります。といっても、installという名前の関数をexportするだけでいいので、非常に簡単に作成できます。プラグインにはカスタムエレメントやカスタム属性を含めることができるので、汎用的なコンポーネントを切り出して単独で管理するのにもってこいです。

[プラグインのスケルトン](https://github.com/aurelia/skeleton-plugin)があるので、これをskeleton-navigatorに組み込んで見ましょう。単にHello, World! と表示するだけの簡単なカスタムエレメントを定義しているプラグインです。

### jspmによるインストール

`package.json` の、 `jspm.dependencies` エントリに、下記を追加します。

```json
  "jspm": {
    "dependencies": {
      //...
      "skeleton-plugin": "github:aurelia/skeleton-plugin@master"
      // ...
    }
  }
```

追加したら、`jspm install` を実行。skeleton-plugin が読み込まれます。

skeleton-pluginのindex.js では、`aurelia.globalizeResources` を呼び出して、`<hello-world>` カスタムエレメントをグローバルに見えるようにしています。これにより、どのビューでもこのカスタムエレメントを使うことができます。

```javascript:index.js
export function install(aurelia){
  aurelia.globalizeResources('./hello-world');
}
```

このプラグインを読み込むためには、アプリケーションのエントリポイント(skeleton-navigatorでは、`animation-main.js`) で、pluginメソッドを呼び出す必要があります。

```javascript:animator-main.js
export function configure(aurelia) {
  aurelia.use
    .standardConfiguration()
    .developmentLogging()
    .plugin('aurelia-animator-css')
    .plugin('skeleton-plugin'); // ココ

  aurelia.start().then(a => a.setRoot('app', document.body));
}
```

では、追加されたカスタムエレメントを使ってみましょう。試しに `src/welcome.html` の最下段に追加してみます。

```markup
  ...
    </section>
    <hello-world>
    </hello-world>
</template>
```

![スクリーンショット 2015-04-22 0.03.24.png](https://qiita-image-store.s3.amazonaws.com/0/12495/74545b66-cc12-04d0-b8cd-998799695811.png "スクリーンショット 2015-04-22 0.03.24.png")
こんな感じで動作するのがわかります。

## Aureliaのサンプル : app-contacts

![スクリーンショット 2015-04-22 0.08.30.png](https://qiita-image-store.s3.amazonaws.com/0/12495/ef846f36-e224-3b41-e06f-7889864aabee.png "スクリーンショット 2015-04-22 0.08.30.png")


Aureliaのサンプルというと skeleton-navigator ですが、もう一つのサンプルとして[app-contacts](https://github.com/aurelia/app-contacts)というのがありました。

簡単なコンタクトリストサンプルですが、リストと詳細が同期して動作します。リストを選択した時の動きはRouterで、詳細を更新したときのリストへの反映は、EventAggregaterというキューを使って実現しています。双方向のSyncのヒントが得られるのではないでしょうか。

## [Using aurelia with Sass](http://www.foursails.co/blog/building-sass/)

Aureliaコミッタの[Matthew](https://github.com/davismj) さんから教えて頂きました。

デフォルトではSassは使えるようにはなっていませんが、簡単に追加できるよーとのこと。詳細はBlogを読んでいただければわかりますが、簡単に紹介すると

1. package.jsonにgulp-sassを追加してnpmでインストール
2. gulpのビルドファイルをSassをコンパイルするように修正

です。
c# カッコで始まってカッコで終わる文字列を取得

```csharp:Strings.cs
public static string GetEnclosedString(string str)
{
    var started = false;
    var openCount = 0;
    for (var count = 0; count < str.Length; count++)
    {
        switch (str[count])
        {
            case '(': openCount++; started = true; break;
            case ')': openCount--; break;
        }
        if (started && openCount == 0)
        {
            return str.Substring(0, count + 1);
        }
    }
    return str;
}
```
// 正規表現とかでシンプルに解決する方法ないかな。。。
MW_WP-FORM　入力ミスでページ転移もバリデーションも動かなくなる！？

<h1>MW_WP-FORM　入力ミスでページ転移もバリデーションも動かなくなる！？</h1>
<p>
　WordPressプラグイン「MW_WP-FORM」利用時、ソースの入力ミスでページがアクションしなくなります。具体的には、確認,送信ボタン等押しても入力チェックもページ転移もしてくれなくなります。</p>

<h2>入力ミス部分</h2>
<ol>
<li>ショートコード内に入力ミス</li>
<li>バリデーションルール内に不備</li>
</ol>
以上の２つです。nameのテキストが間違えていたり、ショートコード内に入力ミスがあると、うんともすんとも言わなくなります。もし前に進まなくなったら、一度ソース内のテキストをキチンと確認しましょう！

</p>
table内、横並びの要素の高さをそろえる！

<h1>table内の横並びの要素の高さをそろえる！</h1>
<h2>左側のtdのバックグラウンドカラーを変えたい</h2>
<p>
　よくあるtableのデザインとして、左側のtdのバックグラウンドカラーを変更しているケースが有りますね。これを実装する際、横並びになっているtdの高さが違うとカラーリングがうまいこといかないケースが有ります。具体的には、カラーリングしたいセルのバックグラウンド全体がきちんと染まってくれません。<br><br>
そんなとき活躍するプロパティは、<br>
<strong>display:table-cell</strong>
です。これをtdに設定してあげると高さが揃います。（少々無理矢理な感じがありますが・・。）<br><br>

また、セルの間に隙間があいているのが気になるときは、<br>
<strong>tableへborder-spacing:0px;</strong>を設定してあげます。



</p>
Redmine起動スクリプト(/etc/init.d/redmine)のサンプル(2015年4月版)


最近、Redmineの起動スクリプトを書き直したのでメモ。
以前のスクリプトは[こちら(2014年2月版)](http://qiita.com/volanja/items/383fcd6d2d2e14792723)

## 対象
+ CentOS 6.x

## 変更点
rbenvのフルパス指定していたので、実行前にPATHを設定するようにしました。

### 変更前

```
CMD="/home/redmine/.rbenv/shims/bundle exec unicorn_rails -D -c ${APP_ROOT}/config/unicorn.rb -E ${RAILS_ENV}"
```

### 変更後

Rubyを`/home/redmine`配下にrbenvでインストールするか、root権限でソースからインストールしたか判断してPATHを設定します。
ユーザ名は`redmine`にしていますが、必要に応じて適当に読み替えます。

```
# set PATH
if [ -e '/home/redmine/.rbenv' ]; then # use rbenv
  PATH=$PATH:/home/redmine/.rbenv/shims
elif [ -e '/usr/local/bin' ]; then # use root system
  PATH=$PATH:/usr/local/bin
fi

CMD="bundle exec unicorn_rails -D -c ${APP_ROOT}/config/unicorn.rb -E ${RAILS_ENV}"
```

## 全文

```bash
#! /bin/sh

# chkconfig: - 85 15

### BEGIN INIT INFO
# Provides:          redmine
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Redmine Project management software
# Description:       Redmine Project management software
### END INIT INFO

# Source function library.
. /etc/rc.d/init.d/functions

### Environment variables
RAILS_ENV="production"

# Feel free to change any of the following variables for your app:
APP_ROOT=/home/redmine/redmine
APP_USER="redmine"
PID=${APP_ROOT}/tmp/pids/unicorn.pid
CMD="bundle exec unicorn_rails -D -c ${APP_ROOT}/config/unicorn.rb -E ${RAILS_ENV}"
INIT_CONF=${APP_ROOT}/config/init.conf
action="$1"
RETVAL=0
prog="redmine"
# set PATH
if [ -e '/home/redmine/.rbenv' ]; then # use rbenv
  PATH=$PATH:/home/redmine/.rbenv/shims
elif [ -e '/usr/local/bin' ]; then # use root system
  PATH=$PATH:/usr/local/bin
fi


test -f "${INIT_CONF}" && . ${INIT_CONF}

cd ${APP_ROOT} || exit 1

start(){
  echo -n $"Starting $prog: "
  daemon --pidfile=${PID} --user=${APP_USER} "cd ${APP_ROOT} && ${CMD}" 
  RETVAL=$?
  echo
}

stop(){
  echo -n $"Stopping $prog: "
  killproc -p ${PID} ${prog} -QUIT
  RETVAL=$?
  echo
}

rh_status() {
    status -p ${PID} ${prog}
}

force_stop(){
  echo -n $"Force-Stopping $prog: "
  killproc -p ${PID} ${prog} -TERM
  RETVAL=$?
  echo
}

reload(){
  echo -n $"Reloading $prog: "
  killproc -p ${PID} ${prog} -HUP
  RETVAL=$?
  echo
}

upgrade(){
  old_pid=${PID}.oldbin
  echo -n $"Staring new master $prog: "
  killproc -p ${PID} ${prog} -USR2
  RETVAL=$?
  echo
  sleep 2
  if [ -f ${old_pid} -a -f ${PID} ]; then
      echo -n $"Graceful shutdown of old $prog: "
      killproc -p ${old_pid} ${prog} -QUIT
      RETVAL=$?
      echo 
  else
      echo $"Upgrade failed!"
      return 1
  fi
}

reopen_logs(){
  echo -n $"ReOpening Logs $prog: "
  killproc -p ${PID} ${prog} -USR1
  RETVAL=$?
  echo
}

case $action in
start)
  start
  ;;
stop)
  stop
  ;;
status)
  rh_status
  ;;
restart)
  stop
  sleep 2
  start
  ;;
reload)
  reload
  ;;
upgrade)
  upgrade
  ;;
force-stop)
  force_stop
  ;;
reopen-logs)
  reopen_logs
  ;;
*)
  echo >&2 "Usage: $0 <start|stop|restart|reload|upgrade|force-stop|reopen-logs>"
  exit 1
  ;;
esac
exit 0

```

以上です。
各国のAppStoreの売上TOP5を取得するRubyスクリプト


ひと月前のAppAnnieのブログ

- http://blog.appannie.com/app-annie-index-market-q1-2015/

これによると、「アメリカ、日本、中国、イギリス、オーストラリア」がアプリの売上の上位国らしい。

ってことで、各国でどんなアプリがランクインしてるのか気になったので調べてみた。


```ruby
require 'rss'

country_table = { 'us' => 'アメリカ',
                  'jp' => '日本',
                  'cn' => '中国',
                  'gb' => 'イギリス',
                  'at' => 'オーストラリア' }

country_table.each do |country, country_name|
  url = "https://itunes.apple.com/#{country}/rss/topgrossingapplications/limit=10/xml"
  rss = RSS::Parser.parse(url)
  p country_name
  rss.entries.take(5).each.with_index(1) do |entry, i|
    title = entry.title.content
    p "#{i}. #{title}"
  end
end
```

### 出力した結果を整形

（2015/05/11(月)23:28現在）

アメリカ

1. Clash of Clans - Supercell
2. Game of War - Fire Age - Machine Zone, Inc
3. HBO NOW - HBO
4. Pandora Radio - Pandora Media, Inc.
5. Candy Crush Saga - King.com Limited

日本

1. モンスターストライク - mixi, Inc
2. パズル＆ドラゴンズ - GungHo Online Entertainment, Inc.
3. LINE：ディズニー ツムツム - LINE Corporation
4. ドラゴンクエストモンスターズ　スーパーライト - SQUARE ENIX INC
5. 白猫プロジェクト - COLOPL, Inc.

中国

1. 梦幻西游-2015国民手游 人人都玩 不玩才怪 - 网易移动游戏
2. 全民突击-全球第一真人实时对战FPS枪战手游 - Shenzhen Tencent Computer Systems Company Limited
3. 神武 - Hero Network
4. 魔龙与勇士(DNW)-腾讯第一实时PK格斗手游 - Shenzhen Tencent Computer Systems Company Limited
5. 刀塔传奇--亿万玩家实时PK 跨服激战！ - 龙图游戏

イギリス

1. Clash of Clans - Supercell
2. Spotify Music - Spotify Ltd.
3. Game of War - Fire Age - Machine Zone, Inc
4. Candy Crush Saga - King.com Limited
5. Candy Crush Soda Saga - King.com Limited

オーストラリア

1. Clash of Clans - Supercell
2. Hearthstone: Heroes of Warcraft - Blizzard Entertainment, Inc.
3. LOVOO - People like you. Deine Chat App für Interessen, Live Fotos & Events deiner Freunde - LOVOO GmbH apps
4. Hay Day - Supercell
5. Candy Crush Saga - King.com Limited

### 雑感

- どの国もゲームばっかり
- SupercellとKingがつおいね(・∀・)
- アメリカとイギリスで音楽関係あるから、これからはもうそういう時代なのかな


関連

- [現在のAppStoreのトップセールス1位を取得する one-liner](http://qiita.com/luckypool/items/5cbe7f06f0e79a970739)
trにborder-bottomを引く！

<h1>trにborder-bottomを引く！</h1>
　trに下線を引きたい。普通に考えれば
　<strong>tr{<br>
　　border-bottom:1px #eee solid;<br>
　}</strong><br>と考えるところですが、実はこれではうまいこといきません。(線が表示されない！)<br>これでだいぶ悩みましたが、以下の方法で解決しました。

<h2>tableへborder-collapse:collapseを設定！</h2>
　CSS2.1の仕様では、table要素のborder-collapseプロパティがcollapseの場合のみ、tr要素のborderプロパティが有効なようです。（<strong>border-collapseプロパティのデフォルトはseparate。</strong>）<br>

　FireFoxはこれを忠実に実装しており、下記ソースで下線が表示されます。
border-collapseを省略、またはseparateにすると下線は出ません。
</p>

</p>
UniRxのシンプルなサンプル その10(プッシュを遅らせる Delay)

[UniRxのシンプルなサンプルの取扱説明書](http://qiita.com/Marimoiro/items/b0c66c6c22cf58bde049)
[前(TimerとInterval 一定時間後に実行)](http://qiita.com/Marimoiro/items/a72b60315c797c19a27c)

# プッシュを遅らせる #
前回時間に関するObserverをやったので今回は更にもうひとつ
プッシュを一定時間遅らせてくれるDelayです。

なにか良い使い道は…とか思って加算合成器が思い当たるけど…あとは…
エフェクトの後に処理するとかだとそのエフェクトがプッシュすれば良かったりして
うーん…

今回はボタンを押すと5秒後に横に行くGameObjectです。

## 前準備 ##

このような形で今回はuGUIでボタンとそれからいつものようにGameObjectを作成します。
そしてGameObjectにはDelaySampleをはりつけます。

![スクリーンショット 2015-05-11 22.34.05.png](https://qiita-image-store.s3.amazonaws.com/0/77177/1b27215d-4f69-725b-1ee4-783c9e1fd262.png)

## 押して5秒後に移動する ##
押して5秒後に移動するボタンは次のコードになります。

Buttonについては先程のSSの赤いボタンをアタッチしておいてください。

```csharp:DelaySample
using UnityEngine;
using System.Collections;
using UniRx.Triggers;
using UniRx;
using UnityEngine.UI;
using System;

public class DelaySample : Base
{

    public Button Button;

	// Use this for initialization
	void Start () {
        gameObject.transform.position = new Vector2(0, 30f);
        //一回だけ右に移動
        Button.onClick.AsObservable()
            .Delay(TimeSpan.FromSeconds(5))//5秒後に実行
            .Subscribe(l => Move(30f, 0));
	}
	
}

```

ボタンに関しては[UniRxのシンプルなサンプル その5(Buttonが押されたら動くGameObjet)](http://qiita.com/Marimoiro/items/bba05b7b1e15f0c804a8)を参照してください。

今回の主役は
Delay(TimeSpan.FromSeconds(5))//5秒後に実行
です。
このメソッドは
IObservable.Delay(TimeSpan dueTime)
と定義されています。

値がプッシュされたらそれをdueTimeだけ遅延して後続に値をプッシュします。

ですので
ボタンが押される
Delayにプッシュされる
5秒後にDelayがさらにプッシュする
Subscribeに到達

という順序で処理が流れていきます。


## 実行結果 ##

以下のように実行されます。
ボタンを押すと5秒後に赤いGameObjectが右に移動します。

![スクリーンショット 2015-05-11 22.41.19.png](https://qiita-image-store.s3.amazonaws.com/0/77177/e9150d00-a6c7-b2f9-1181-3b48751784c5.png)
AngularJSで表とか作る時に、フィルタされた後の合計値とかも表示させたい時。

#ng-repeatで表とか作る時、カスタムフィルタとかでフィルタリングした後の合計値とかを使いたい。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/58613/65209b91-0c5a-6952-e7b4-64d138a2993e.png)

まあ、そんなに難しくなくて、

```
<tr ng-repeat="item in filteredItems=(main.items | filter:q)">
```

っていうのかキモかな。

```index.html
<div ng-app="myApp">
  <div ng-controller="MainCtrl as main">
      <input ng-model="q"/>
    <table>
        <body>
            <tr ng-repeat="item in filteredItems=(main.items | filter:q)">
                <td>{{item.text}}</td>
                <td>{{item.amount}}</td>
            </tr>
            <tr>
                <td>sum</td>
                <td>{{filteredItems|sumFilter}}</td>
            </tr>
        </body>
    </table>
  </div>
</div>
```

```js
"use strict";

angular.module("myApp", []);

//値を発生させる
angular.module("myApp").controller("MainCtrl", function(){
    this.items = [];
    for(var i = 0; i < 10; i++){
        this.items[i] = {
            text: "item" + i,
            amount: Math.round(1000 * Math.random())
        }
    }
});

//合計値計算フィルタ
angular.module("myApp").filter("sumFilter", function(){
    return function(input){
        var sum = 0;
        input.forEach(function(i){
            if(i.amount){
                sum = sum + i.amount;
            }
        });
        return sum;
    }
});
```

https://jsfiddle.net/wk3wjkjx/2/
こんな感じ。
業務用アプリとかでこういうことしている人はすでにいるでしょうかね。
もっといいやり方あったら教えて。

##as
ng-repeatでasの記法を使うことができる。ということを@Quramyさんからコメントいただきました。
1.3.xから使えるのかなhttps://docs.angularjs.org/api/ng/directive/ngRepeat
https://jsfiddle.net/wk3wjkjx/3/
書き直して見ました。
こっちの方が見やすいですね。
Sublime Text 3 Documentation：multiple_selection_with_the_keyboard

# Multiple Selection with the Keyboard　複数選択をキーボードでする場合
[Contents](http://qiita.com/Akki20/items/09c8e3635c5e01e6f38a)

## Adding a Line　行の追加
To add the line above or below to the selection, use Ctl+Alt+Up and Ctrl+Alt+down (OS X: Ctrl+Shift+Up and Ctrl+Shift+Down).
現在カーソルのある行から上、または下の行を選択するには、Ctl+Alt+Up と Ctrl+Alt+down を使います (OS X: Ctrl+Shift+Up と Ctrl+Shift+Down)。

If you go too far, use Undo Selection (Ctrl+U, or Command+U on OS X) to step backwards.
もし、行き過ぎたなら、元に戻す(Ctrl+U、 OS Xの場合：Command+U)を操作をすればいいです。


## Splitting the Selection into Lines
Select a block of lines, and then split it into many selections, one per line, using Ctrl+Shift+L, or Command+Shift+L on OS X.


## Quick Add Next
To add the next occurrence of the current word to the selection, use Quick Add Next, which is bound to Ctrl+D on Windows and Linux, or Command+D on OS X.

Again, if you go too far, use Undo Selection (Ctrl+U, or Command+U on OS X) to step backwards.

Individual occurrences can be skipped via Quick Skip Next, which is bound to Ctrl+K,Ctrl+D on Windows and Linux, or Command+K,Command+D on OS X.

## Find All
To add all occurrences of the current word to the selection, use Find All: Alt+F3 on Windows and Linux, or Ctrl+Command+G on OS X.

## Single Selection
To go from multiple selections to a single selection, press Escape.

# 本家サイト
http://www.sublimetext.com/docs/3/multiple_selection_with_the_keyboard.html
Sublime Text 3 Documentation：TOP

# 本記事について
これは、Sublime Text 3 Documentationの目次として作りました。
このドキュメンテーションには英語の本家サイトが存在し、リンクは一番下部にあります。

本内容は完全な個人での翻訳であり、間違っている箇所が必ずあるでしょう。
もしよければ、こんな風に書き換えたらいいよなども出てくると思います。

その場合、qiitaの編集からプルリクエストを送ってくれれば、幸いです。
よりよい翻訳は必ず反映させますし、そうすれば、もっとよりよいドキュメントになると思います。
もちろん、翻訳のプルリクエストも大歓迎です。
すでに翻訳された方がいるのでしたら、そちらの情報(URLなど)もぜひ教えてください！

私は、sublime textに恋をした一人ですが、日本語でのしっかりしたドキュメントはあまり存在しないように感じます。キーバインドの設定一つをとっても、十分な情報が存在しているとは言えないのではないでしょうか？
このドキュメントが少しでも皆さんのお役にたつことができれば、よいと思っています。


# Sublime Text 3 Documentation
## General

[Sublime Text Unofficial Documentation](http://docs.sublimetext.info/en/latest/index.html) is an excellent resource, with a huge amount of information on Sublime Text.

## Usage
[Column Selection](http://qiita.com/Akki20/private/936573c83c1259d2fb24) (独自翻訳)
[Multiple Selection with the Keyboard](http://qiita.com/Akki20/items/f261ab16b98672b04a6b) (未翻訳)
Auto Complete
Tab Completion
Distraction Free Mode
Vintage Mode
Projects

## Customization
Settings
Changing the Font
Indentation
Spell Checking
Packages

## Miscellaneous
Reverting to a Freshly Installed State
OS X Command Line

## API
API Reference
Porting Guide
How to Create a Sublime Text Plugin

# 本家サイト
http://www.sublimetext.com/docs/3/
初めてCentOS7.xを使った時のメモ


普段は、Windows系のsoftwareばかりなので、Linuxは業務では使用しません。
RasberryPiで遊んだ時もDebian系のOSは使ったけれど、RHEL系はほぼ使ったことないです、ごめんなさい…という筆者がCentOSを使った時にはまったことをメモ。

今回は忘備録的な目的で書いております。
間違っていることとかあったら教えていただけるととても助かります。

# 環境構築の目的
今回環境構築をした目的は、zabbixを使って監視をするよう指令が入ったからでした。
よって、当初の目的は、
  **公開鍵を使ったSSH(ver6.4以降)をインストール＆設定する。**
  **Zabbix 運用のための環境を構築する。** 　
でした。Zabbixも無事たったのですが、この件については別の方のqiitaのブログを参照しておりますので、書かない予定です。

# 使用環境
当初はローカルの環境を使い、その後SoftLayer上の環境を使用しました。
　RAM: 1GB
　HDD: 20GB
程度でやりました。

# 戸惑ったコマンドたち

## Ifconfig
当たり前のように使えると思っていたifconfigが使えなくて、焦りました。新しいコマンドを使える自信がなかったので、ifconfigをインストールすることに。

``` installing!
 yum install ifconfig
```


## サービスの起動/停止/再起動/自動起動用コマンド
ちょっと前までVyattaをいじっていたので、`service (service) start` とか書いていました。
通るわけがないですね。

``` CentOS6
Service <start/stop/restart/status> (Service Name)
chkconfig (Service Name) <on/off>
```

最初に、CentOS6までのコマンドを見つけて打ったところ、結果はもちろん ` command not found `
調べると、以下のコマンドが出てくる。

``` CentOS7.x
systemctl <start/stop/restart/status> (Service Name)
systemctl <enable/disable> (Service Name)
```

## Firewalld
Linuxすら触ったことがない頃、フィルタリングはiptablesでやるんだよ、と教えてもらった記憶。今回、CentSO7.xではFirewalldなるものがあるようだということで使ってみることとしました。

結局、sshを設定するにあたって、この部分ではまったので、iptablesをインストールしました。
よって省略。

## iptables
公開鍵認証のssh設定中に、Firewalldだとうまくいかなかったので、途中でインストールしたiptables。

``` install
yum install iptables-servies

# Firewalld を停止する
systemctl stop firewalld

# Firewalld の自動起動設定をオフに
systemctl disable firewalld

# iptables をスタート！
systemctl start iptables

# iptables の自動起動設定
systemctl enable iptables
```

というわけで、Firewalldをオフにして、iptablesを有効にし設定したところ公開鍵認証のSSHもうまくいくようになりました。

# 最後に
最初は、`systemctl` コマンドなど不慣れなところがありましたが、慣れてくるとあまり気にならなくなりました。
Ansible で MySQL Server をソースインストールしてみる

[Ansible で Apache をソースインストールしてみる](http://qiita.com/ichifx/items/a647c97b6c1f1b831625)
に続き、`MySQL` を `Ansible` にて。

要件は以下。

* `CentOS 6.6 x86_64`
* 事前に `git clone` する必要あり(手順は後述)
* `MySQL` のバージョンは `5.6.24`
* `cmake` にて `configure` する
* `/usr/local` にインストール
* `/usr/local/mysql` にシンボリックリンク作成
* `mysql/mysql` で `user/group` 作成
* 起動スクリプトを設置
* `Ansible` は `root@localhost` にて実行

[PlayBook はこちら。](https://github.com/ichifx/ansible-webdb-setup/blob/master/playbooks/mysql-install.yml)

実行手順は以下。

```lang:shell-command
$ git clone https://github.com/ichifx/ansible-webdb-setup.git /var/tmp/ansible-webdb-setup
$ sudo ansible-playbook /var/tmp/ansible-webdb-setup/playbooks/mysql-install.yml
```

MySQL インストール後、mysqld プロセスを起動する流れは以下。

```lang:shell-command
$ sudo /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
$ sudo service mysqld start
```

/usr/local/mysql/data に mysql_install_db を突っ込んでます。

以上。
Ansible で Apache をソースインストールしてみる

初投稿。
要件は以下。

* `CentOS 6.6 x86_64`
* 事前に `git clone` する必要あり(手順は後述)
* `Apache` のバージョンは `2.2.29`
* `configure` オプションは `--enable-so` のみ
* `/usr/local` にインストール
* `/usr/local/apache2` にシンボリックリンク作成
* `apache/apache` で `user/group` 作成
* 起動スクリプトを設置
* `logrotate` を設置
* `Ansible` は `root@localhost` にて実行

[Playbook はこちら。](https://github.com/ichifx/ansible-webdb-setup/blob/master/playbooks/httpd-install.yml)

実行手順は以下。

```lang:shell-command
$ git clone https://github.com/ichifx/ansible-webdb-setup.git /var/tmp/ansible-webdb-setup
$ sudo ansible-playbook /var/tmp/ansible-webdb-setup/playbooks/httpd-install.yml
```

※git リポジトリ内に起動スクリプトを設置し、`copy` モジュールを使用しているためこのような実行手順となります。

以上。