OmniAICreator/Qiita-1.07M huggingface dataset:
EPPlusでExcelテンプレートを使用する

[EPPlus](http://epplus.codeplex.com/)はOpen XMLの仕様を元にExcelのデータ操作を行う為の.NET Framework向けのオープンソースライブラリです。

このEPPlusにてExcelのテンプレートファイルを使用する場合には、以下のようにExcelPackageオブジェクトの初期化時に、コンストラクタの引数として、作成するExcelファイルのFileInfoオブジェクト、使用するExcelテンプレートのオブジェクトを渡します。テンプレートを開くためにパスワードが必要な場合は3番目の引数としてString型のパスワード文字列を渡します。

この時使用するExcelのテンプレートファイルは、拡張子がxltxとなるOpenXML形式のテンプレートのみ使用でき、旧来のテンプレートファイルは使用できませんので、注意してください。

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing;
using OfficeOpenXml;
using OfficeOpenXml.Style;


namespace EPplusSample
{
    /// <summary>
    /// EPPlusでテンプレートを使用する場合のサンプル
    /// </summary>
    class Program
    {
        /// <summary>
        /// Entry Point.
        /// </summary>
        /// <param name="args">コマンドライン引数</param>
        static void Main(string[] args)
        {
            // テンプレートのFileInfo
            var template = new FileInfo(@"Test.xltx");

            // ExcelファイルのFileInfo
            var newFile = new FileInfo(@"sample.xlsx");

            // テンプレートファイルを使用してExcelファイルを作成する。
            // テンプレートを開くのにパスワードが必要な場合は ExcelPackage(newFile, template, password)
            // と3番目の引数にString型のパスワード身時列を与える必要がある。
            // また、テンプレートはOpenXml形式のものでないとだめです。
            using (var package = new ExcelPackage(newFile, template))
            {
                ExcelWorksheet worksheet = null;

                // WorkSheetオブジェクトの取得。FirstOrDefault()しているので、本来後段でnullチェックしたほうがよい。
                worksheet = package.Workbook.Worksheets.Where(s => s.Name == "Sheet1").FirstOrDefault();

                // セルを二次元配列で指定する場合1次元目がY方向、2次元目がX方向となります。
                worksheet.Cells[2, 2].Value = "テンプレートのサンプル";

                worksheet.Cells[2, 2].Style.Font.Color.SetColor(Color.Red);

                for (int i = 0; i < 14; i++)
                {
                    worksheet.Cells[4 + i, 2].Value = DateTime.Now.Hour;
                    worksheet.Cells[4 + i, 3].Value = DateTime.Now.Minute;
                    worksheet.Cells[4 + i, 4].Value = DateTime.Now.Second;
                    worksheet.Cells[4 + i, 5].Value = DateTime.Now.Millisecond;
                }

                // Excelファイルのセーブ
                package.Save();
            }
        }
    }
}

```
WordPress 子テーマ作りメモ（超最小限）


twentyfifteenを親テーマとしたサンプルです。

## テーマフォルダ作成
```bash
cd wp-content/themes/
mkdir custom2015
```

## テーマフォルダcustom2015内に *style.css* 作成

ヘッダコメントのTheme NameとTemplateは必須です。

```css
/*
 * Theme Name: Custom 2015
 * Template: twentyfifteen
 */
@import url('../twentyfifteen/style.css');
```

WPに戻り、外観->テーマから、追加したテーマを有効化すればOK。

## 注意
*style.css* と *functions.php* の２ファイルだけは差分だけ定義するのが良いようです。他はファイルのコピペ。

あとinc内のファイルは元のテーマのものが読まれてしまうので、inc/template-tags.phpなどを変更したい場合は当該関数をfunctions.phpの方で先に定義しておく必要があります。
押すと文字が切り替わるボタン

ぽちぽち押すと、文字が切り替わっていくボタン実装
ソートボタンとかの、強い順→弱い順→新しい順→…　みたいなやつです

```csharp
using System.Collections.Generic;
public class ToggleText : MonoBehaviour {
	public List<string> StateTexts = new List<string>();
	public int State = 0;
	public UILabel LabelObj =null;
	
	void Start () {
		SetText(State);
	}

	public void Increment(){
		SetText(State + 1);
	}

	public void SetText(int _idx){
		if( _idx >= StateTexts.Count ){
			_idx = 0;
		}
		if( LabelObj != null ){
			LabelObj.text = StateTexts[_idx];
		}
		State = _idx;
	}
}
```

こんな感じでインスペクタで設定可能。
![スクリーンショット 2015-04-01 10.34.39.png](https://qiita-image-store.s3.amazonaws.com/0/39089/09ed2e87-78e5-f815-7578-1c528a0b2872.png)
Framinで、Fx0のアプリを作ってみる

# Framinで、Fx0のアプリを作ってみる

## はじめに

Firefox OSを搭載した、Fx0を入手しました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/72852/e085af50-bb03-d42a-a4f9-64734d9c939f.jpeg" width="40%">

Fx0には、プログラミングをしなくてもアプリを作成できるツールである「Framin」がプリインストールされています。なので、実際にFraminでアプリを作成してみようと思います。
どうやら、Framinは、HTML/CSS/JavaScriptを知らなくてもアプリを作成できるらしいです。

## Framinとは

Framinは、スマートフォン上で、アプリケーションを作成することができるツールです。
プログラミングの知識がなくても予め用意されているトリガとなるセンサーやアクションを選択することで、自作アプリを作成できるのが特徴のようです。
尚、作成したアプリは、通常のアプリにすることもできますが、「ロック画面」に設定することで、「ロック画面」をカスタマイズすることができます。

http://framin.kddi.com/pc/ 
![framin_home.jpg](https://qiita-image-store.s3.amazonaws.com/0/72852/25f0dc27-9241-152b-10b7-28dfa4f4daf5.jpeg)

Framinでどんなことができるのかは、以下のサイトに情報があります。
http://framin.kddi.com/pc/howto/

また、作成したアプリは、公開することができるみたいです。
公開の方法は以下を参照して下さい。
http://framin.kddi.com/pc/howto/basic9.html

## Framinのインストール

Framinを使用するには、Framinをインストールする必要があります。
プリインストールされているFraminのアイコンをタップすることでインストールすることができます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/72852/2e7bf0a3-ed77-41e0-aec0-68ad335d8367.jpeg" width="50%">

<img src="https://qiita-image-store.s3.amazonaws.com/0/72852/c67c998d-3932-f9e3-7212-964a0403fd2d.jpeg" width="40%">

インストールは、画面の案内に従って進むだけで簡単にインストールができました。

インストールが完了すると新規にアプリを作成することができるようになります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/72852/ec8ec83f-ab8d-a1ef-9986-309f000c6b06.jpeg" width="40%">

## アプリの作成

今回は、手始めに、KDDIのサイトにある「アプリを作ってみよう」のサンプルを試してみたいと思います。
このアプリは、照度センサーを使用し、明るさに応じて、画像が切り替る「ロック画面アプリ」です。

http://framin.kddi.com/pc/tutorials/
![framin_tutorials.jpg](https://qiita-image-store.s3.amazonaws.com/0/72852/7a1150fa-f5ec-430a-f3ba-59641f681e7e.jpeg)

作成手順についは、「アプリを作ってみよう」に詳しく書いてありますので、サイトを参照して下さい。
アプリの作成は、サイトの手順に従っていくことで、迷わずに作成することが出来ました。

![procedure.jpg](https://qiita-image-store.s3.amazonaws.com/0/72852/66c59361-60c1-9df2-88c1-18e8772a3bff.jpeg)

## アプリの実行

実行結果は以下の通りです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/72852/7b7e9602-1de0-7808-0a6d-373e830007f1.jpeg" width="40%">

ここで、Fx0の周囲を暗くしてみます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/72852/476be8bb-cdf8-d62f-6f84-bea42ab5f8d5.jpeg"  width="40%">

画像が切り替わりました!
明るさに応じて画像が、切り替わってます。

## おわりに

Fx0のみで、アプリが簡単に作成することができました。
昼間と夜間で「ロック画面」の画像を変化させることができました。他にも応用できそうです。
次回は、違うアプリを作成したいと思います。
githubで登録したAPI Tokenが消えた!?

SublimeTextの`sublime-github`というパッケージを使うと、SublimeText上で自分のGistの操作ができるので便利で愛用していますが、これがある日を境に使えなくなってしまいました。

SublimeText上からGistの参照や投稿ができなくなってしまったのです、、、

そこでGitHubの`Personal settings` ->`Applications` ->`Personal access tokens`を確認したところ、登録したはずのAPI Tokenが消えていました。

Security historyを見たところ、`oauth_access.destroy – sublime-github (API)`というログが残っていました。

該当日のことを思い出したのですが、Sublime Textの設定を他のPCにも共有したくて、`~/Library/Application Support/Sublime Text 3/Packages/User`をgithubのリポジトリにpushした日でした。

このディレクトリ内にはsublime-githubの設定ファイルである`GitHub.sublime-settings`も含まれており、このファイル内にはAPI Tokenが書かれています。

恐らくGithub側でこれを検知して、自動的に私のAPI Tokenを消したと思われます。

試しに実験したら、やはり`git push`したタイミングでAPI Tokenが消されたので間違いないと思います。

この辺を意識せず`git push`した自分を恥じると同時に、GitHubに :pray:
bashのプロンプトにsvnのブランチ名/タグ名を表示


参考1: https://wiki.archlinux.org/index.php/Color_Bash_Prompt

参考2: http://hocuspokus.net/2009/07/add-git-and-svn-branch-to-bash-prompt/

```~/.bashrc
#
# Colors
# from : https://wiki.archlinux.org/index.php/Color_Bash_Prompt
#

Color_Off='\e[0m'       # Text Reset

Black='\e[0;30m'        # Black
Red='\e[0;31m'          # Red
Green='\e[0;32m'        # Green
Yellow='\e[0;33m'       # Yellow
Blue='\e[0;34m'         # Blue
Purple='\e[0;35m'       # Purple
Cyan='\e[0;36m'         # Cyan
White='\e[0;37m'        # White

#
# parse SVN branch
#

parse_svn_branch() {
  parse_svn_url | sed -e 's#^'"$(parse_svn_repository_root)"'##g' | sed -e 's#^/##g' | sed -e 's#^branches/##g' | sed -e 's#^tags/##g' | awk '{print " (svn:"$1")" }'
}
parse_svn_url() {
  svn info 2>/dev/null | sed -ne 's#^URL: ##p'
}
parse_svn_repository_root() {
  svn info 2>/dev/null | sed -ne 's#^Repository Root: ##p'
}

export PS1="$Green\h:\W$Yellow\$(parse_svn_branch)$Color_Off $ "
```
deviseでomni-authと組み合わせてたら「missing required keys: [:provider]」

感謝しつつ下記を見よ。

http://stackoverflow.com/questions/17099473/rails-4-error-with-twitter-facebook-authentication-devise

具体的には例えば下記のように`:omniauth_providers`を指定する。


```rb
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, :omniauthable, :omniauth_providers => [:facebook, :twitter]
```
地形アルゴリズムの結果をPOVRAYで出力する

# Diamond-Square Algorithmとは
今回使うのはHunter Loftis氏によるリアルな地形生成アルゴリズム
http://www.playfuljs.com/realistic-terrain-in-130-lines/
130行で地形生成ができると少し前に話題になった。
アルゴリズム自体の解説は上記リンク参照

#仕組み
今回のDiamond-Square Algorithmはx-yの平面上にアルゴリズムで生成したheightを使って1*1*heightの四角柱を並べる事で地形を生成する仕組みになっている。
なのでアルゴリズムで生成したあとは並べてライトを置けばそれっぽくなる

#生成の手順
POVRAYの旧石器時代のような言語にアルゴリズムを書くのは現実的じゃないので、javascript部分をそのまま利用してそこからpovファイルを生成する。
生成にはMacのScriptEditorを利用する。
アルゴリズム→POVファイル文字列→書き出し→実行
までをjsで行うので、POVRAYをCLIから実行出来るようにしておく必要があった。

#コード
githubに置いておきました。
https://github.com/noppefoxwolf/diamond-square-algorithm-to-povray


![generated.png](https://qiita-image-store.s3.amazonaws.com/0/24979/47777b7c-61e0-32d8-b85f-a4a8b254f166.png)

#おまけ
オリジナルのように影やISOは実装していないので見栄えが悪い（ライト置いただけ）
~~ぶっちゃけUnityでやればいい~~
CoreOSのoverlayfsでyumエラー

## 結論

とりあえず Dockerfile で RUN yum ..... | true とすれば回避できる．

## 経緯

CoreOS が不安定要因らしき btrfs をあきらめて EXT4+OverlayFS に[デフォルトを切り替えて](http://www.phoronix.com/scan.php?page=news_item&px=CoreOS-Btrfs-To-EXT4-OverlayFS)数ヶ月．手元環境でも docker build で再起動なんてのが頻発していたので，再インストールを実施．いくつか余計な地雷は踏みつつも無事以降．負荷かけまくっても落ちないぜー，と喜んでいたら CentOS 系の build が通らない問題に遭遇．

```
Rpmdb checksum is invalid: pkg checksums: libXdamage-0:1.1.3-4.el6.x86_64
INFO[0669] The command [/bin/sh -c yum --enablerepo=rpmforge install -y lha] returned a non-zero code: 1
```

エラーはこういうの．なんかパッケージによって通ったり通らなかったりするところが謎い．

## 調査

でもって[辿りついたのがこちら](https://github.com/docker/docker/issues/10180#issuecomment-85503075)．どうやら問題自体はEXT4+OverlayFS特有らしく，CoreOSでなくても発生している模様．カーネルパッチ待ちなのかな．

回避策としては，Dockerfile で RUN yum ..... | true としてエラーコードを無理やり true にしてやること．これはコンテナ内での操作でも同様で ssh や exec bash でログインした時も yum に失敗することがあるので，-y install |true とかしてやるとインストールできる．

## 感想

CoreOS，チャレンジ精神はいいんだけど，いろんな落とし穴がありますね……．特にオンプレ運用してる人ってあんまいなくね？って感じが情報不足気味な原因かも．
何故かWindowsからSAMBAのファイルサーバーにアクセスするとエクスプローラーが落ちる件

#SAMBAファイルサーバーにアクセスすると”エクスプローラは動作を停止しました”の解決策

何故かWindowsからSAMBAのファイルサーバーにアクセスするとエクスプローラーが落ちる事があるがその原因が判明。

BLEtokenCredentialProvider.dll
が原因らしいのだがデバッガで追ってみると*諸悪の根源*は

**CSR Harmony Wireless Software Stack**

というソフトウェアが原因なのだ。なのでコレを利用しているデバイスやソフトウェアがあった場合使えなくなってしまう。が、やはりSAMBAファイルサーバーの方が重要だと思われるQiitaユーザーは多いはずなので処分してしまおう。

コントロールパネルの*”プログラムの追加と削除”*からこのソフトウェアを*アンインストール*。

これで万事解決だ。

新しいバージョンのリリースが待たれる。

via http://d.hatena.ne.jp/gae/20121210/1355134670#c
Perlで平方根を子供が生まれた年の桁数程度求めるには

bignumというパッケージを使うと出来ました。


求めたい桁数は、bignumを宣言する際のpオプションで指定するようで、
任意のタイミングで変えることは出来ないようです。

以下で、2013(次男の生れた年)の平方根を2013桁求まります。
（実際2013桁必要な場合、更に桁数を増やして計算した結果を使った
ほうが正確です。有効数字とかでググれば理解できるのかなぁ）

```perl
use bignum(p => -2013);
$a= sqrt(2013);
print "Ans = $a\n";
```

## 求める桁数を任意のタイミングで変えるには

Math::BigFloatを使うとできる。先ほどのbignumでは一度設定した
桁数を変更できない模様。

```perl
use Math::BigFloat;

$x = Math::BigFloat->new(2013);
$x->precision(-2013);
print $x->bsqrt();
```

# 参考リンク

- [How can I set the level of precision for Perl's bignum? - Stack Overflow](http://stackoverflow.com/questions/2136339/how-can-i-set-the-level-of-precision-for-perls-bignum)

# 関連投稿

- [WolframAlphaで連立方程式を指定した変数について解く - Qiita](https://qiita.com/kjunichi/items/b42932a33e280a825ed7)
- [Gadflyでジバニャンの方程式をプロットする、あるいはz=0を満たす等高線をプロットするには - Qiita](https://qiita.com/kjunichi/items/0bc36f651063fe95c8c5)

# 関連記事

- [東大の過去問をPerlに解かせようとしたらbignumとbigintの違いを知った](https://abrakatabura.hatenablog.com/entry/2014/11/27/073543)
- [東大の入試問題をNode.jsに解かせてみた](https://abrakatabura.hatenablog.com/entry/2014/11/28/175853)
- [node.jsで大きな数を扱う](https://abrakatabura.hatenablog.com/entry/2014/05/20/072903)
- [Maximaでリーマン予想のゼータ関数をプロットした](https://abrakatabura.hatenablog.com/entry/2012/10/12/112958)
- [複素数版のコラッツの問題](https://abrakatabura.hatenablog.com/entry/2012/06/04/072248)
- [DockerでIPython Notebookを動かして、数え上げおねえさんを救う](https://abrakatabura.hatenablog.com/entry/2014/11/30/214133)
- [BlenderでPython使って最速降下曲線を描いてみる](https://abrakatabura.hatenablog.com/entry/2016/05/26/070858)
- [Maximaで2018年のセンター試験、数学I・数学Ａの第1問を解いてみた](https://abrakatabura.hatenablog.com/entry/2018/01/30/204125)
- [node.jsでtruncatable primeを試したら、OpenSSLをビルドした件](https://abrakatabura.hatenablog.com/entry/2019/01/22/075328)
logmon でかんたんにログ監視


logmon は IBMの作成したログ監視用perlスクリプトです。
1ファイル100行程度のスクリプトですが、十分実用的です。

## インストール

githubにIBMのオリジナルにパッチをあてたものものがアップされているので、こちらを使うと楽ちんです。

```
$ git clone https://github.com/moomindani/logmon.git
$ cd logmon
$ sudo ./setup.sh
```

参考: [CloudWatchとlogmonでEC2 Linuxのログを監視する | mooapp](https://moomindani.wordpress.com/2014/06/24/cloudwatch_logmon/)


## 設定

設定ファイルは、/etc/logmon/logmon.conf です。

書式は、下記のような感じになります。
設定ファイルは1つですが、下記の設定を複数記述することで複数のログを監視することもできます。

```
:ファイル名
(監視文字列)
コマンド
```

例： /var/log/messagesにERROR という文字列を発見したら、me@example.com にメールを送る

```
:/var/log/messages
(ERROR)
echo -e "ERROR\n<%%%%>\n" | mail -s "logmon alert" me@example.com
```

設定したら設定をチェックし、再起動します。

チェック

```
$ sudo service logmon check
```

logmonの再起動

```
$ sudo service logmon restart
```

## 参考


* [IBM Systems Director で利用できるログファイル監視用スクリプト](http://www-06.ibm.com/jp/linux/tech/doc/00057580.html)

* [ログ監視ツール logmon （修正パッチつき） パソコン鳥のブログ/ウェブリブログ](http://vogel.at.webry.info/201402/article_2.html)

* [CloudWatchとlogmonでEC2 Linuxのログを監視する | mooapp](https://moomindani.wordpress.com/2014/06/24/cloudwatch_logmon/)
Ubuntu15.04でFirefox37を使う

苦労したのでメモ

## ダウンロード

[Web ブラウザ Mozilla Firefox — 各国語版の Firefox をダウンロード — Mozilla](https://www.mozilla.org/ja/firefox/all/?q=Japanese,%20%E6%97%A5%E6%9C%AC%E8%AA%9E)
から`Linux 64-bit`をダウンロード。

## PATHを登録

* ダウンロードしたものを解凍。
* Downloads/firefox/firefox が実効ファイル。

```bash:
ln -s ~/Downloads/firefox/firefox ~/bin/firefox
```

としておくことで、ランチャーアイコンをクリックした時firefox37が起動してくれる。

## やってはいけないこと

```bash:
apt-get remove firefox
```

これをするとfirefox runtimeが見当たらず起動できないと出る。
またランチャーのアイコンがなくなってしまうので残しておく。

## youtubeをhtml5で再生してもらう

flashだと重たいのでhtml5に切り替える。
firefox37からhtml5動画に対応。
[YouTube HTML5 動画プレーヤー](https://www.youtube.com/html5)にアクセスし、`HTML5プレイヤーをリクエストする`ボタンをクリック。
Railsコマンドのおさらい(その1)


何度となく使っているにも関わらず忘れてしまう`rails`コマンドのおさらい
今回はよく使うMVC形のコマンドを中心に紹介

# rails new
Railsプロジェクトの生成をするコマンド

```
# プロジェクトを生成
$ rails new AppName
```

## Options

|Command Name          |Description                                     |
|:---------------------|:-----------------------------------------------|
|`--skip-test-unit`    |Test::Unitを生成しない(RSpecを使用する場合など)      |
|`--skip-gemfile`      |`Gemfile`を生成しない                             |
|`--skip-bundle`       |`bundle install`を行わない                        |
|`--skip-active-record`|ActiveRecordを生成しない(MongoDBを使用する場合等)    |
|`--bundlerPATH`, `-b` |bundlerのPATHを指定                               |
|`-database=DATABASE`  |データベースの種類を指定(デフォルトは`sqlite3`)        |


```
# aaa
$ rails new AppName --skip-bundle --skip-test-unit --database=sqlite3
```


# rails server
Railsアプリのサーバを起動

```
# 基本形
rails server subcommand

# 省略形
rails s subcommand
```

## Options

|Subcommand Name          |Description             |
|:------------------------|:-----------------------|
|`--environment=ENV`, `-e`|環境を指定してサーバを起動   |
|`--port=PORT`, `-p`      |サーバを起動するポートを指定 |
|`--debugger`, `-u`       |デバッグモードで起動        |

# rails console

```
# コンソールを起動
$ rails console
```

## Options
|Subcommand Name |Description                            |
|:---------------|:--------------------------------------|
|`-sandbox`, `-s`|sandboxモードで起動; 終了時にDBをロールバック|
|`-debugger`     |Debugモードで起動                        |


# rails dbconsole
DBクライアントを起動

```
$ rails dbconsole (environment:development, test, production)
```


# rails generate
Rails関連のファイルを生成

```
# 基本系は以下
$ rails generate subcommand

# 以下のように省略もできる
$ rails g subcommand
```

## rails generate scaffold

```
rails generate scaffold MODEL_NAME column_name:type
```

http://railsdoc.com/rails#アプリケーションに必要なコントローラ、モデル、ビューをまとめて生成(rails%20generate%20scaffold)


## rails generate model
modelを生成

```
$ rails generate model ModelName column_name:type
```

http://railsdoc.com/rails#モデルの生成(rails%20generate%20model)


## rails generate controller
controllerを生成

```
$ rails generate controller ControllerName action_name
```

## rails generate scaffold_controller
先にmodelを作っていた場合に使用する

```
$ rails generate scaffold_controller ModelName
```

## rails generate migration
テーブル定義を変更(追加/削除)するためのマイグレーションファイルを生成

```
# Pageモデルにtitleカラムを追加
$ rails generate migration AddTitleToPages title:string

# Pageモデルからtitleカラムを削除
$ rails generate migration RemoveTitleFromPages title:string
```


# rails destroy
生成済みのRails関連ファイルを削除

## rails destroy scaffold
Scaffoldで生成したファイルの削除

```
$ rails destroy scaffold MODEL_NAME
```


## rails destroy model
生成したモデルを削除

```
$ rails destroy model MODEL_NAME
```

## rails destroy migration
生成したマイグレーションファイルの削除

```
$ rails destroy migration MigrationName
```
\ なパスを / にするワンライナー・エイリアス

Windows の書式で書かれているパスを Linux, OS X (≒ *nix) っぽいパスに変えるワンライナー。


自分は SMB のファイルサーバのパスを Unix 上でマウントしてアクセスするのに使っている。


# 手軽だけど危険な方法

tr コマンドを使う。

```shell-session
$ tr \\ / <<< '\\fooserver\bar\buzz'
//fooserver/bar/buzz
$
```

この方法は自分の知る限り最も手軽。
しかし、 [このページ](http://en.wikipedia.org/wiki/Filename) にある通り、
ファイルシステムによって使用可能なファイル名のルールとエスケープの方法は異なるので、
置換後に意図していないリソースを指してしまう可能性がある。

でも、たいていのファイル名では問題ないので、覚えて損はない。

# それなりに信頼できる方法

Python 3 の pathlib を使った例。

```shell-session
$ python3 -c 'import pathlib;print(pathlib.PureWindowsPath(input()).as_posix())' <<< '\\fooserver\bar\buzz'
//fooserver/bar/buzz
$
```

ただし、 Python 3.4 以降もしくは pathlib パッケージがインストール済みでなければならないので、
手軽ではないかもしれない。

# エイリアス

なので、それぞれシェルのエイリアスは次のようになる。

```shell-session
alias path_wintounix="tr \\ /"
```

```shell-session
alias path_wintounix="python3 -c 'import pathlib;print(pathlib.PureWindowsPath(input()).as_posix())'"
```


```shell-session
$ path_wintounix <<< '\\fooserver\bar\buzz'
//fooserver/bar/buzz
$
```

# 余談

Windows は / 区切りのパスも開けるので、逆の変換はあまり問題になることはなさそう。

```shell-session
alias path_unixtowin="tr / \\"
```
JSON(Hash)データの階層をツリーで表示する


深い階層を持ったJSON(Hash)のキーを一覧で表示させるコードを書きました（探しても無かったので…）。

```ruby
def show_json_tree(json)
  case json
  when Array
    puts json[0].tree
  when Hash
    puts json.tree
  end
end

class Hash
  def tree
    a = []
    each do |key, value|
      case value
      when String
        a << "#{key}(#{value.class})"
      when Hash
        a << key
        a.concat value.tree.flatten.map{|s| "  " + s }
      when Array
        a << "#{key}(Array of #{value[0].class})"
        a << value[0].tree.map{|s| "  " + s } if Hash === value[0]
      else
        a << "#{key}(#{value.class})"
      end
    end
    a
  end
end
```


## Example

```ruby
require 'json'
require 'open-uri'
json = JSON.parse open("https://api.deckbrew.com/mtg/cards?oracle=win+the+game&oracle=lose+the+game", &:read)
show_json_tree json
```

```foo:実行結果
name(String)
id(String)
url(String)
store_url(String)
types(Array of String)
subtypes(Array of String)
colors(Array of String)
cmc(Fixnum)
cost(String)
text(String)
power(String)
toughness(String)
formats
  commander(String)
  legacy(String)
  modern(String)
  vintage(String)
editions(Array of Hash)
  set(String)
  set_id(String)
  rarity(String)
  artist(String)
  multiverse_id(Fixnum)
  flavor(String)
  number(String)
  layout(String)
  price
    low(Fixnum)
    median(Fixnum)
    high(Fixnum)
  url(String)
  image_url(String)
  set_url(String)
  store_url(String)
```

こんな感じで全体の構造を見ることができます。
(Arrayに対しては先頭の要素だけを見て出力しています。)
JSON形式のWebAPIを触るのに便利ではないでしょうか。

実装があまり綺麗ではないのでアドバイス歓迎です。
Photoshop互換性を優先を外して上書き保存するApplescript-Droplet


```applescript:PhotoshopmaximizeCompatibilityoff.scpt
on open of myFiles
	tell application "Adobe Photoshop CC 2014"
		activate
		set myOldSetting to maximize compatibility of settings
		set maximize compatibility of settings to never
		repeat with i in myFiles
			set myFile to i as Unicode text
			open alias myFile
			set myLayer to make new art layer at end of current document with properties {name:"Trash"}
			delete myLayer
			save current document in file myFile
			close current document
		end repeat
		set maximize compatibility of settings to myOldSetting
	end tell
end open
```

互換性を優先環境設定を一時的にneverにし、レイヤー作成＆削除で保存フラグを立てて、上書き保存します。

注意）　使用時、カラー設定は以下のように。
![SS 2015-04-01 16.40.03.png](https://qiita-image-store.s3.amazonaws.com/0/35477/340c135a-c0f6-4d6d-f4a6-17ca28b8f128.png)
カラープロファイルが埋め込まれていることを前提にしています。埋め込まれていないファイルは適宜、指定してください。
Serviceとはなにか

（参考：[MVCモデルにおけるサービスの役割について教えて下さい](http://ja.stackoverflow.com/questions/4360/mvc%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%AE%E5%BD%B9%E5%89%B2%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E6%95%99%E3%81%88%E3%81%A6%E4%B8%8B%E3%81%95%E3%81%84)）
#サービスとは
サービスというのは、処理をするモノのことです。

たとえば、アプリケーションでユーザーのパスワードをハッシュ化して記録する場合、そのハッシュ化処理を1つのクラスに独立させたとしましょう。このクラスは「PasswordEncoderサービス」です。要するに、ライブラリでも何でも、処理を提供するクラスはサービスだと言ってしまえます。また、このPasswordEncoderサービスは、ユーザーの情報を保存する時に、Modelの内部で利用されることもあれば、他の理由でControllerから使われることもあり得ます。

#サービスを利用する場面
サービスをどう使うのかという点では、先ほどのPasswordEncoderでもそうでしたが、いくつか考えられます

Controllerに記述していた共通処理を何かの観点でまとめるのに使う
Modelに記述していた共通処理を何らかの観点でまとめるのに使う
テンプレートのために必要な共通処理を何らかの観点でまとめるのに使う
Controllerの共通処理のためには、Controllerの基底クラスを作り、そこに共通メソッドを作るという方法もありますが、これはあまり良い方法ではありません。個々のControllerからコードが減る代わりに、基底クラス側に複雑性が集中してしまったりします。

「サービス」というものを直接扱えるフレームワークであれば、単に個々の処理に対応するクラスを作り、必要な箇所で利用できうようにフレームワークに指示する、という共通した手順で使えます（例えばSymfonyのサービスコンテナ）。CakePHPの場合は、使う箇所によってヘルパーだったり、と個別の仕組みが用意されていたりしますが、そういったものを超えて、自分で作ったクラスを使えるようにすれば、いろいろと対応の幅が広がります。

#サービスはModelなのか？
前節のように、MVCのパーツのどの部分の処理でも、それをサービスにまとめることは可能です。サービスというのは、単なる「処理を提供するもの」だからです。この意味で、サービスというのは、ModelだとかControllerだとか、そういった構造とは基本的に関係のないものということになります。

#サービスレイヤー（ユースケースレイヤー）
* ControllerとModelの間に挟んで、Modelの操作をまとめる層のように使う

という使い方もあります。これは部品として使うというよりも、MVCというアーキテクチャ（作り方）に構造を追加するという目的になります。専門的な言葉では、サービスレイヤー、またはユースケースレイヤーと呼ばれます。こういった作り方で、プロダクションコードの見通しを良くすることができます。

#マイクロサービス？
昨今話題になる「マイクロサービス」という言葉で表されるサービスは、ここで説明した「1つのクラス」というのよりももっと大きな単位を指しています。例えば1つの企業の中の「会員管理サービス」などを1つのサービスというカタマリで捉えます。

「サービス」という言葉はとても汎用的で、この言葉を基準にして調べても膨大な事柄がでてきてしまいます。なので、何のために使うのかという目的から理解されていくのが、よいと思います。

#まとめ
* サービスというのは単なる処理／クラス
* MVCの「モデル」とサービスとは、直接的には関係がない
* 「サービス」は用語として混乱しているので、目的から理解しよう
Windows で psql から Redshift に接続する時の client_encoding エラーの対処

## 環境

- Windows 7
- psql (PostgreSQL) 9.2.2
- Redshift はローカル環境から接続できるようにセキュリティ設定済み（Security の CIDR/IP に接続元の IP を追加した）

## 課題になったこと

```shell-session
> psql -h xxx.ap-northeast-1.redshift.amazonaws.com -U username -d dbname -p 5439
psql: FATAL:  invalid value for parameter "client_encoding": "SJIS"
```

上記のようなエラーが出てしまう。

どうやら UTF-8 しか扱ってくれないらしいが、Windows では Postgresql のクライアントエンコーディングの自動判定で常に SJIS と解釈されてしまうらしい。

- [Redshift - Ayutaya.com](http://www.ayutaya.com/aws/redshift)
- [Multibyte Character Load Errors - Amazon Redshift](http://docs.aws.amazon.com/redshift/latest/dg/multi-byte-character-load-errors.html)
- [postgresqlのclient_encodingについて質問](http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12110080187)

`postgresql.conf` で指定するという方法もあるようですが、環境変数に利用するクライアントエンコーディングを指定する事でも解消できた。

- [cannot connect from psql due to invalid parameter "client_encoding" - AWS Foram](https://forums.aws.amazon.com/thread.jspa?messageID=600088)

```
set PGCLIENTENCODING=UTF8
```

もちろん環境変数として永続的に設定しておいても大丈夫です。
iTerm2をフルスクリーンアプリ上に表示する

iTerm2をホットキーで表示する機能って便利ですよね。

でも、フルスクリーンアプリを表示しているときに使うと、
通常のデスクトップまで画面がスライドしてから表示されるのが非常に気になります。

TortalTerminalにはフルスクリーンアプリ上に表示するための設定があるんですが、
iTerm2には同様の設定がなくて困っていました。

しかし、次の記事で紹介されている方法を試したところ、
iTerm2をフルスクリーンアプリ上でも表示できるようになりました。
英語の記事ですが、ほとんど図で説明されているので、リンクだけ貼ります。

http://limitlesschannels.com/code/2013/06/29/how-to-force-osx-app-to-run-as-background-process.html

なお、普通のデスクトップ上でフルスクリーン表示すると、1行目がメニューバーで隠されてしまいます。
これは`Auto-hide menu bar in non-Lion fullscreen`を無効にすることで回避できます。

<img width="924" alt="2016_05_02_12_34.png" src="https://qiita-image-store.s3.amazonaws.com/0/33735/f11ae308-8fd4-33fd-4ae2-790a47991936.png">

これで、iTerm2が快適に利用できるようになりますが、いくつか制約があります。

 - iTerm2のアイコンがDockに表示されなくなる。
 - iTerm2がアップデートされると元に戻ってしまい、上の記事の作業を改めて行う必要がある。
Finderから任意のファイルのdiffを取る（Sublimerge）

## 概要
とある２つのファイルのdiffをFinder上から取りたい。
いろいろ差分ツールあるけどSublime Textのプラグインの「Sublimerge」を利用

## やり方

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

参考：[Sublimergeのインストールと、まずはDiffを取るだけのメモ](http://qiita.com/Shoesk/items/956b1b4cdd3f819a0b21)

### 2. Sublime Textをコマンドラインから実行できるようにする

参考：[備忘録：Sublime Text3をコマンドラインから開くようにする](http://qiita.com/using923/items/08dcdd3785755d308e79)

### 3. Automatorのサービスに登録
![スクリーンショット 2015-03-31 23.21.02.png](https://qiita-image-store.s3.amazonaws.com/0/49055/8f8cf6d9-8fc6-5965-b86a-1186acc20602.png)

上記のスクショを参考に設定。「Compare with Sublime」とかで保存

```bash
/usr/local/bin/subl --command "sublimerge_diff {\"left\": \"$1\", \"right\": \"$2\"}"`
```
※sublのパスは設定したやつ
※Automator初なので正しいやり方か不明・・


### 4. Finderから選択

![スクリーンショット 2015-03-31 23.31.31.png](https://qiita-image-store.s3.amazonaws.com/0/49055/b3a67729-9780-8256-b204-e3cd2dc92970.png)
任意の２つファイルを選択して右クリックから「サービス」で「Compare with Sublime」

![スクリーンショット 2015-03-31 23.32.41.png](https://qiita-image-store.s3.amazonaws.com/0/49055/494721ae-53c7-9aff-7668-64b4628bb793.png)
できた！


以上


## フォルダの比較もいけるよ

![スクリーンショット 2015-03-31 23.38.46.png](https://qiita-image-store.s3.amazonaws.com/0/49055/0dd8c2f4-b2de-cb6c-1890-45ed03ff7763.png)
AndroidのScrollView内でMapを利用する方法

ScrollViewの中に地図を配置したときに、地図のスクロールや拡大・縮小をしようとすると、ScrollViewが反応してしまい、うまく操作できません。

これは、地図の親にあたるScrollViewによって、地図のタッチイベントが妨害されていることが原因です。

そこで、地図のタッチイベントが発生するごとに、ScrollView#requestDisallowInterceptTouchEvent()にtrueを設定して、ScrollViewが地図のタッチイベントを妨害しないようにします。

また、MapFragment自体にはタッチイベントを設定することができないため、別途タッチイベントを設定する用のFrameLayoutを作成し、これをMapFragmentに追加します。

実装は下記のようになります。

```java:MapFragmentの拡張
public class MyMapFragment extends MapFragment {

    private ScrollView parentScrollView = null;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View layout = super.onCreateView(inflater, container, savedInstanceState);

        TouchableWrapper frameLayout = new TouchableWrapper(this.getActivity());
        ((ViewGroup)layout).addView(frameLayout);

        return layout;
    }

    public void setParentScrollView(ScrollView scrollView) {
        this.parentScrollView = scrollView;
    }

    private class TouchableWrapper extends FrameLayout {

        public TouchableWrapper(Context context) {
            super(context);
        }

        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                case MotionEvent.ACTION_UP:
                    if(parentScrollView != null) {
                        parentScrollView.requestDisallowInterceptTouchEvent(true);
                    }
                    break;
            }
            return super.dispatchTouchEvent(ev);
        }
    }

}
```

地図を表示する箇所で、拡張したMapFragmentに親のScrollViewを設定します。

```java
FragmentManager manager = this.getFragmentManager();
MyMapFragment mapFragment = (MyMapFragment) manager.findFragmentById(R.id.map);
ScrollView scrollView = (ScrollView)view.findViewById(R.id.scrollView);
mapFragment.setParentScrollView(scrollView);
```



参考: http://www.londatiga.net/it/programming/android/how-to-make-android-map-scrollable-inside-a-scrollview-layout/
時系列データを地図に可視化する①



調べてもあまり出てこないから，メモがてら．

# 前準備
地図を表示したりするまでの準備

## ツールのインストール
- gdal
- ogr2ogr
- topojson

この３つが必要．インストール方法はいくらでもあるので割愛．
自分はhomebrewとnpmで入れた．


## データの入手，整形

### ダウンロード
いろいろとあるけど，自分は[国土交通省](http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-N03.html)から．
東京都だけを抜き出してダウンロード．
アンケートとか必要だった．平成26年度のものを選んだ．

### GeoJSONの作成

拡張子が`shp`のものが必要
バイナリだから，中身を見るには

```bash
$ ogrinfo -al N03-14_13_140401.shp | nkf -w | head -n 20 | less

INFO: Open of `N03-14_13_140401.shp'
      using driver `ESRI Shapefile' successful.

Layer name: N03-14_13_140401
Geometry: Polygon
Feature Count: 3297
Extent: (136.069482, 20.425119) - (153.986898, 35.898424)
Layer SRS WKT:
GEOGCS["GCS_JGD_2000",
    DATUM["Japanese_Geodetic_Datum_2000",
        SPHEROID["GRS_1980",6378137.0,298.257222101]],
    PRIMEM["Greenwich",0.0],
    UNIT["Degree",0.0174532925199433]]
N03_001: String (10.0)
N03_002: String (20.0)
N03_003: String (20.0)
N03_004: String (20.0)
N03_007: String (5.0)
OGRFeature(N03-14_13_140401):0
  N03_001 (String) = 東京都
  N03_002 (String) = (null)
  N03_003 (String) = 西多摩郡
  N03_004 (String) = 奥多摩町
  N03_007 (String) = 13308
  POLYGON ((139.100223 35.867104...

```

今回は東京都の島しょ部を除いた部分が欲しかったから，
N003_007(行政区域コード)で13360未満のものだけ抽出．（島しょ部は13600以降）

```bash
$ ogr2ogr -f GeoJSON -where "N03_007 < '13360'" tokyo_honshu.geojson N03-14_13_140401.shp
```


### TopoJSONの作成

GeoJSONをTopoJSONっていう圧縮したもの？に変換する．
とりあえず中身を見ると

```bash
$ less tokyo_honshu.geojson

{
"type": "FeatureCollection",

"features": [
{ "type": "Feature", "properties": { "N03_001": "東京都", "N03_002": null, "N03_003": "西多摩郡", "N03_004": "奥多摩町", "N03_007": "13308" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ 139.100223, 35.867104 ], [ 139.100419000000102, 35.866862 ], [ 139.100845, 35.866292 ], [ 139.101117, 35.86603 ], [ 139.101137, 35.865995 ], [...

```

後々で使うかもしれなかったからTopoJSONに変換する際に，
区市？（N03_003）と町村？（N03_004）をプロパティとして追加して，行政区域コード（N03_007）をIDとして追加することに．
さらに区とかに名前を書き換えるため"変換後"="変換前"っていうのも加える．

```bash
$ topojson --id-property N03_007 -p shi=N03_004 -p ku=N03_003 -o tokyo_honshu.topojson tokyo_honshu.geojson

```

これで`tokyo_honshu.topojson`っていうファイルができる．



# 参考
http://tactosh.com/2014/04/d3-js-japan-geo-map/
http://kshigeru.blogspot.jp/2013/03/d3-geojson-polygon.html
Macで音声付き録画をする

### 概要
QuickTimeとSoundflowerを使ってMacで音声付き録画をする

### 0.SoundFlowerのダウンロード  
https://code.google.com/p/soundflower/downloads/list

### 1.Soundflowerを立ち上げる
以下のように設定する
![スクリーンショット 2015-03-31 23.28.28.png](https://qiita-image-store.s3.amazonaws.com/0/7186/1667d029-eda2-2e3b-12f9-7b3f76e3c3a5.png)

### 2.QuickTimeを立ち上げる
ファイル>新規画面収録を開く
![スクリーンショット 2015-03-31 23.29.37.png](https://qiita-image-store.s3.amazonaws.com/0/7186/0514f55c-e363-cc4e-b47f-00f340e17472.png)

### 3.音声をSoundflower(2ch)から取得する
![スクリーンショット 2015-03-31 23.29.49.png](https://qiita-image-store.s3.amazonaws.com/0/7186/7b3d7533-bd2f-9e62-d0ee-739cb9e13f9d.png)

### 4.録画ボタンを押して録画開始
ATOM でファイルを開いたら自動文字コード判定を行う

ATOM でファイルを開いたら自動文字コード判定を行う

# はじめに
encoding-selector パッケージで文字コード判定ができるが、
わざわざ`cntl+shift+u`を押して判定させるのは面倒。
ということで、ファイルを開いたら自動的に文字コード判定を行わせることにしてみた。
なお、環境はWindows7。

# 設定環境
ATOMインストールフォルダが、
C:¥Users¥HOGEHOGE¥AppData¥Local¥atom¥app-0.187.0  
ATOM設定フォルダが、
C:¥Users¥HOGEHOGE¥.atom  

# パッケージの参照設定
 - 管理者権限でコマンドプロンプトを開く
 - node_modulesフォルダを作成  
 `mkdir C:¥Users¥HOGEHOGE¥.atom¥node_modules`
 - iconv-liteのシンボリックリンクを作成  
 `mklink C:¥Users¥HOGEHOGE¥.atom¥node_modules¥iconv-lite C:¥Users¥HOGEHOGE¥AppData¥Local¥atom¥app-0.187.0¥resources¥app¥node_modules¥iconv-lite`
 - jschardetのシンボリックリンクを作成  
 `mklink C:¥Users¥HOGEHOGE¥.atom¥node_modules¥jschardet C:¥Users¥HOGEHOGE¥AppData¥Local¥atom¥app-0.187.0¥resources¥app¥node_modules¥encoding-selector¥node_modules¥jschardet`

 ~~ATOM ver.0.187.0のフォルダを指定しているので、バージョンアップには対応できてない。。なんかうまく参照する方法はないのかな？~~
もしくは、npmでiconv-liteとjschardetをインストールだけでもよい~~とのこと~~。

# init.coffeeの修正
 - init.coffee を編集するには、ATOMのFileメニューから[Open Your Init Script]を選択
 - 次のコードを追加

```coffee
fs = require('fs')

atom.workspace.onDidOpen ->
  editor = atom.workspace.getActiveTextEditor()

  try
    filePath = editor.getPath()
  catch error
    return
  return unless fs.existsSync(filePath)

  jschardet = require 'jschardet'
  iconv = require 'iconv-lite'
  fs.readFile filePath, (error, buffer) =>
    return if error?
    {encoding} = jschardet.detect(buffer) ? {}
    encoding = 'utf8' if encoding is 'ascii'
    return unless iconv.encodingExists(encoding)

    encoding = encoding.toLowerCase().replace(/[^0-9a-z]|:\d{4}$/g, '')
    editor.setEncoding(encoding)
```

*コードは、encoding-selectorパッケージのencoding-selector-list-view.coffeeのdetectEncodingメソッドを参考。*

# ATOMの再起動
 - `ctrl+Alt+r`

# 効能
これで、とりあえずはShiftJISとUTF-8の混在するWindows環境でもイラッとせずに済みそう。
Gitのコミットメッセージを標準のテキストエディットで入力する

`git commit`した時にvimが立ち上がってイラッとしませんか？  

普段はsublimeとか使ってるのにコミットメッセージを入れるときだけvim使わなきゃいけなくて、vimの使い方はなんとなく知ってるけどでもやっぱりショートカット使えなくて勝手が違ってイラッとしませんか？  

それが嫌で`git commit -m 'hogehoge'`とかするけどやっぱりめんどくさくてイラッとしませんか？

そんなあなたにgitのエディタをmac標準のテキストエディット(TextEdit)に設定する方法です。

## do or vim
まず、ホームディレクトリの.gitconfigを開きます。  
もしなかったら作ります。

```
vim ~/.gitconfig
```

(なんだよここでvim使うのかよ、ってツッコミはやめてください)

以下を追加します。

```bash:.gitconfig
[core]
        editor = open -t -n -W
```


これで`git commit` とか`git merge`とかした時にテキストエディットが開きます。  
入力したら`cmd + s`して`cmd + q`するだけです。

さぁそれでは素敵なgitライフを！

(あ、ちなみにvim大好きです）
heroku python3 →もしかして： 空白？

virtualenvを知ってから、ローカルでpython2とpython3を切り替えたりしながら作業してて楽しい。けれども、pythonのバージョン変えてherokuにdeployするというのをさっき初めてやってみて30分くらいかかったので、今後のためにメモしておく。


目的：　python2で作っていたherokuアプリをpython3に変更する。

方法：　アプリのルートに"runtime.txt"というファイルを置く。それだけ。中身は、

```runtime.txt
python-3.4.2
```

と書くだけ。

で、はまってたのは一行目を空白で改行してたから！

エラー（一部抜粋）はこんな感じ。

```
remote: -----> Python app detected
remote: -----> Found runtime python-2.7.9, removing
remote: -----> Installing runtime (
remote: python-3.4.2)
remote:  !     Requested runtime (
remote: python-3.4.2) is not available for this stack (cedar-14).
remote:  !     Aborting.  More info: https://devcenter.heroku.com/articles/python-support
remote: 
remote:  !     Push rejected, failed to compile Python app

```

バージョン指定を調べ直したり（https://devcenter.heroku.com/articles/python-runtimes）
して、それから空白行に気づいた。慣れないvimで書いてた。

あと、pythonのバージョン変えたら``pip freeze > requirements.txt``をするのもわすれないこと。
Ansibleのyumからphp5.4をインストールする

## 概要
ansibleのyumモジュールを使ってphp環境を構築するとphp5.3がインストールされてしまったので、php5.4以上をインストールするための手順をば

## 1. レポジトリを追加する
phpも初心者なので知らなかったが、centos6.5で標準に用意されているyumレポジトリからだとphp5.3しかインストールできないため、自分でレポジトリを追加しないといけないらしい。その中でも、remiという名前のレポジトリが有名らしいので、remiと他の有名なレポジトリも一緒に登録する。

```yaml:common/tasks/main.yml
- name: Add repository 'epel-repo'
  yum: name=http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm state=present

- name: Add repository 'rpmforge-repo'
  yum: name=http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm state=present

- name: Add repository 'remi-repo'
  yum: name=http://rpms.famillecollet.com/enterprise/remi-release-6.rpm state=present

```

## 2. 追加したレポジトリを使ってphpをインストールする

```yaml:php/tasks/main.yml
- name: Install php
  yum: name={{ item }} state=present enablerepo=remi,epel,rpmforge
  with_items:
    - php
    - #他ついでに入れたいものがあったら書き連ねる
```

## まとめ
php5.3だと``<?= ?>``など一部の記法やメソッドがサポートされておらずエラーが出てました。構築しなおすときには、version情報などもきっちりしておきたいですね。
Mac上のCentOS(vagrant)にansibleで環境を構築する（準備）


## 概要 
vagrantのprovision機能を使って、ansibleによる環境構築をするのではなく、Macでansible-playbookコマンドを叩いて、vagrantの環境を構築する準備をします

## ansibleの導入
1. xcodeをインストール
2. pipのインストール

 ``sudo easy_install pip``

3. pipからansibleをインストール
 
 ``sudo pip install ansible --quiet``


4. ansibleのインストールを確認

  `` ansible --version``

## ansibleを使ってvagrantに接続
1. vagrantへの接続情報を取得

  ``vagrant ssh-config > ssh_config``

  ```:ssh_config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2201
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile ~/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
  ```

2. 先ほど取得した接続方法を使うようにansibleの設定ファイルを書く

  ```:ansible.cfg
 [ssh_connection]
 ssh_args = -F ssh_config
 ```

3. 接続先のroleを指定するためのファイルを作成

 ```hosts
 [front] # role名。名前は適当
 default # ssh_configでHostがdefaultという名前なので
 ```

4. 接続できるか確認

 ```
 $ ls
 Vagrantfile ansible.cfg hosts ssh_config
 
 $ ansible -i hosts front -a 'uname -r'
 ```
 
# まとめ
以上で準備は完了です。あとは、ansibleのplaybookを書いて、
``ansible-playbook -i hosts playbook.yml``とかするといろんな環境が構築できます。
アジャイル開発、スクラム開発について

#アジャイル開発とは
システムを機能ごとに分けて、
1.要件定義
2.基本設計
3.開発
4.結合テスト
5.システムテスト
を各機能ごとに進めていく。

各工程は短期間で早いサイクルで進められていくため、途中で発生した手戻りや、技術的な変更点に対応できる。
最初の段階で計画された全ての機能を完璧に製作することよりも、何度も開発のサイクルをまわすことによって、製品がリリースされる直前まで修正・改善が可能であり、製品リリースと同時に最高の物ができれば良い。

###メリット
-仕様変化への対応がしやすい。
-早い段階で実際に動く物が確認できる。
-スピーディーに開発ができる。
###デメリット
-開発工程を何度も繰り返し、途中の仕様変更や修正にも寛容なため、工数が膨らみやすい。

***
#スクラム開発とは
アジャイル開発の開発手法（フレームワーク）
プロジェクトにおいて、１スプリントのうちに達成すべき要件すなわち、１スプリント中にすべき作業をリストアップしたものをバックログといい、バックログはさらに細かく、開発者が一人単位で担当するストーリーに分割される。開発者は自分に割り振られたストーリーをスプリント中にこなしていくことでチーム全体の開発が進められていく。

また、スクラム開発には以下の３つの役職が必要とされる。

1.プロダクトオーナー
製品の責任者。クライアントのやりとりを通してプロジェクトがビジネスとしてうまくいくことを保障する。
2.スクラムマスター
チームがスムーズに回転しているかどうかをチームの外部から客観的に見る。
3.開発チーム
二週間のスプリントを通して機能の追加を行って、製品を開発していく。
【PHP】配列に関する関数

配列まわりの関数をメモっていく。随時追加予定。

#配列の先頭を取り除く（array_shift）

```php
$foo = ['aa','bb','cc'];
$top = array_shift($foo);

//戻り値は先頭の値
var_dump($top);
/*
string(2) "aa"
*/

//先頭が取り除かれる
var_dump($foo);
/*
array(2) {
  [0]=>
  string(2) "bb"
  [1]=>
  string(2) "cc"
}
*/
```

※注意
添え字が数値であれば（文字列でもキャストされる）、採番されなおされる。

```
$foo = ['10'=>'aa',20=>'bb','15'=>'cc'];
$top = array_shift($foo);

//添え字が採番されなおされる。
var_dump($foo);
/*
array(2) {
  [0]=>
  string(2) "bb"
  [1]=>
  string(2) "cc"
}
*/

```

#連想配列または配列のキーを返す（array_keys）

array_keys(連想配列)
戻り値：連想配列のキー

```php:
$array = array('apple'=>'りんご','bananas'=>'バナナ');
$key = array_keys($array);

var_dump($key);
/*=>
array(2) {
  [0]=>
  string(5) "apple"
  [1]=>
  string(7) "bananas"
}
*/
```

#配列を指定した要素数で分割する（array_chunk）

array_chunk(分割対象の配列, 分割する要素数)
戻り値：分割された値

```php
$array = array("a","b","c","d","e");
$res = array_chunk($array, 2);

print_r($res);
/*
Array
(
    [0] => Array
        (
            [0] => a
            [1] => b
        )

    [1] => Array
        (
            [0] => c
            [1] => d
        )

    [2] => Array
        (
            [0] => e
        )

)
*/
```

こんな関数あるんなんてPHP万能過ぎ。

参考
[PHPマニュアル](http://php.net/manual/ja/book.array.php)
[配列関数](http://php-beginner.com/function/array/)
【MySQL】MySQLでは、group by のカラムとselectのカラムが違ってもエラーにならない


以下のように、group byのカラムとselectのカラムが異なる場合、標準のSQLではエラーになるが（Oracleなどではエラー）、mysqlの拡張仕様によりmysqlでは可能。

```mysql:sql
select
 foo,bar
from hoge
 group by foo
```

以下の場合、barには何が入るのかというと、結果は不確定となる。
つまり、AかBかCが入る。(試してみるとAが入るっぽいが、保障はしないということだと思う。）

| foo | bar | 
|:------|-------:|
| 1     |      A |
| 1     |      B |
| 1     |      C |




[11.11.3. 非常時フィールドとの GROUP BY および HAVING)](http://ftp.nchu.edu.tw/MySQL/doc/refman/5.1/ja/group-by-hidden-fields.html)
>この拡張は、グループ分けされていないカラムが、同じグループに関する値を持っていることを前提としています。それ以外では、結果は不確実になります。



参考
[MySQLの拡張仕様、GROUP BYでカラム指定を省略してSELECTする場合について](http://d.hatena.ne.jp/kanonji/20120712/1342069857)
アジャイル開発・スクラム開発について

##■アジャイル開発
####◆概要
アジャイル開発とは、**機能ごとに**要件定義からシステムテストを行う開発手法である。
手戻りを前提とした手法なので、
　①変更に対する融通が効きやすい
　②スピーディーに開発を進められる
　③早い段階からプロトタイプを確認できる
などの利点がある一方で、
　❶ドキュメントを残せない
　❷開発をする回数が多いので工数が膨らみやすい
のような欠点もある。
アジャイル開発は、主に**中小規模の案件**や**Webサービス開発**に向いている。


##■スクラム開発
####◆概要
アジャイル開発手法の一つにスクラム開発がある。スクラムとは、**チームで仕事を進めるためのフレームワーク**である。

####◆バックログ
スクラム開発では以下２点のバックログを定義している。
**プロダクト・バックログ**
・機能や技術的改善要素を優先順位を付けて記述したもの。
・プロダクトの全体の進捗への影響の把握・伝達がスムーズになる。
**スプリント・バックログ**
・プロダクト・バックログから２週間分を抜き出したチームのToDoリスト。
・2週間で終わらせられるかを検討し、チームの仕事として責任を持って仕上げる。

#####◆役割
スクラム開発はもちろんチームワーク重視なことに変わりないが、最低限の役割がないと非効率になってしまう。そのため以下３つの役職がある。
**プロダクトオーナー**
・バックログの作成を行う。
・仕様に関する権限を持つ。
・スプリント終了時に確認作業を行う。
**スクラムマスター**
・チームの仕事がうまくいっていっているか、困っていることは何かを確認する。
・プロジェクトの阻害要因を排除する。
**開発チーム**
・スプリントの中で機能を実装し、動作確認まで行う。
・動作するものをプロダクトオーナーに届ける。
![alt](http://image.itmedia.co.jp/ait/articles/1208/07/r804.gif)

##■まとめ
スクラム開発の最大の価値は、**自らの課題を発見できる**ことだ。リーダーが主役になるのではなく、**チーム**が主役になることによって、今まで見えていなかった課題が顕在化してくるのである。
「リーダーやマネージャに責任を押し付けすぎず、チーム主体でセルフマネジメントしていく」というのがスクラムのあり方なのだ。
全てがObservableになる

『javascriptパターン』という書籍にobserverパターンが載っていたけど、書籍の例ではイベント発行する側とサブスクライバの結合度が高かった。
なので結合度なしで実装してみた。(どのイベントを購読するかは指定する必要ある)

ソースコードはこちら。
https://github.com/0xfffffff7/ObserverJS

やることは二つだけで、

```
Observable.toObservable(対象の何か)  // observerに昇格させる。

対象の何か.subscribe(func(), "受け取りたいイベント名")  //コールバックを指定する。
```

# イメージ

![20150310214204.png](https://qiita-image-store.s3.amazonaws.com/0/33116/1654aff0-128f-a59b-e018-c54196ec273e.png)



# サンプル

```
<script type="text/javascript" src="Observer.js"></script>

// とあるオブジェクト.
var SomeObject = {
    SomeObjectEventFunc: function(arg1, arg2){};
};


// イベントを受け取りたい人.
var YourReceiver = { 
    CallbackFunc: function(){
      console.log(arguments);
    }
};


// とあるオブジェクトをオブザーバーへ昇格させる.
Observable.toObservable(SomeObject);


// イベントを購読する.
SomeObject.subscribe(YourReceiver.CallbackFunc, 'SomeObjectEventFunc');


// イベント発火.
SomeObject.SomeObjectEventFunc(arg1, arg2);
```
　
　
コールバックメソッドの引数にはイベントメソッド名、その引数、結果が渡される。

```
console output -> ["SomeObjectEventFunc", Arguments[2], "RESULT_OBJECT"]
```
cbbackup で取得したバックアップデータを sqlite で検索する


先日参加した Couchbase MeetUP Tokyo #12 で知ったのですが、`cbbackup` が出力するファイルを使って SQLite で検索ができるとのこと。

まずはcbbackup

```
$ /opt/couchbase/bin/cbbackup -b items -u Administrator -p hogemoge http://localhost:8091 /vagrant/dump
```

```
$ tree dump
dump
└── 2015-02-16T082318Z
    └── 2015-02-16T082318Z-full
        └── bucket-items
            ├── design.json
            └── node-127.0.0.1%3A8091
                ├── data-0000.cbb
                ├── failover.json
                ├── meta.json
                ├── seqno.json
                └── snapshot_markers.json

```

sqlite は使ったことがないので良く分からないけど、`.cbb` 以外は JSON ファイルしかないので・・・ 

```
$ sqlite3 data-0000.cbb 
SQLite version 3.7.13 2012-07-17 17:46:21
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> 
```

おお、なんか起動したっぽい。

```
sqlite> .tables
cbb_meta  cbb_msg
```

`cbb_meta` は単純な key/value なレイアウト。

```
sqlite> select key,count(*) from cbb_meta group by key;
source_bucket.json|1
source_map.json|1
source_node.json|1
start.datetime|1
```

`cbb_msg` の方はこんなレイアウトで、val に JSON が入っています。

|cmd|vbucket_id|key|flg|exp|cas|meta|val|seqno|dtype|meta_size|
|---|----------|---|---|---|---|----|---|-----|-----|----------|


```
$ sqlite3 data-0000.cbb "select val from cbb_msg limit 1" | jq '.'
{
  "id": "1584",
  "asin": "B004X2L352",
  "categories": [
    52391051
  ],
  "name": "オーガニックローカシューナッツ",
  "description": "原産国:アメリカ合衆国 内容量:227g",
  "available_hours": 0,
  "url": "http://www.amazon.jp/dp/B004X2L352/ref=asc_df_B004X2L3521162042?smid=AN1VRQENFRJN5&tag=AssocID&creative=9407&creativeASIN=B004X2L352&linkCode=df0",
  "sales_rank": 565,
  "adult_product": false,
  "images": {
    "small": {
      "width": 75,
      "height": 75,
      "unit": "pixels",
      "url": "http://ecx.images-amazon.com/images/I/513jniBDtvL._SL75_.jpg"
    },
    "large": {
      "width": 500,
      "height": 500,
      "unit": "pixels",
      "url": "http://ecx.images-amazon.com/images/I/513jniBDtvL.jpg"
    },
    "hires": {
      "width": 1000,
      "height": 1000,
      "unit": "pixels",
      "url": "http://ecx.images-amazon.com/images/I/61clJe9w-KL.jpg"
    },
    "medium": {
      "width": 160,
      "height": 160,
      "unit": "pixels",
      "url": "http://ecx.images-amazon.com/images/I/513jniBDtvL._SL160_.jpg"
    }
  },
  "identifiers": {
    "ean": "0803813051104",
    "upc": "803813051104"
  },
  "parent_asin": null,
  "keywords": {
    "feature": [
      "原産国:アメリカ合衆国",
      "内容量:227g"
    ],
    "mpn": "SF10135",
    "brand": "サンフードスーパーフーズ(Sunfood Superfoods)",
    "manufacturer": "アリエルトレーディング"
  },
  "original_price": 3024,
  "price": 3100,
  "status": "exchangeable",
  "exclusion_halls": [],
  "exclusion_companies": []
}
```

もっと詳しく知りたい場合はこちらをドーゾ。

[cbrestoreで特定のドキュメントだけをリストアする](http://qiita.com/ijokarumawak@github/items/69e128d37b13e55bed89)
Homebrew のインストール先を変更する

Homebrew のインストール先は、デフォルトでは `/usr/local` になっています。
インストール先を `/opt/homebrew` にするには、以下のようにします。

## Homebrew 本体のインストール

まず、あらかじめ `/opt/homebrew` ディレクトリを作成しておきます。

```shell-session
cd /opt
sudo mkdir homebrew
sudo chown ${USER}:staff homebrew
```

通常のインストールスクリプトを実行する代わりに、以下を実行します。このコマンドは、Homebrew ドキュメントの [Alternative Installs](https://github.com/Homebrew/brew/blob/master/docs/Installation.md#alternative-installs) に書かれているものです。

```shell-session
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
```

インストールそのものはこれだけです。あとは実行パスの設定さえしてしまえば `brew` コマンドが使えます。

## 実行パスの設定

`/usr/local/bin` と違ってデフォルトで実行パスが通っていないので、以下のどれかで設定します。

* `/etc/paths` に `/opt/homebrew/bin` を追加。
* `/etc/paths.d/homebrew` というファイルを作って `/opt/homebrew/bin` と記述。（ただし、`/etc/paths.d/*` は `/etc/paths` よりも後にパスが追加される点に注意）
* `~/.zshrc` や `~/.bashrc` で `PATH` 環境変数を設定。

## インストール先を取得するには

`brew --prefix` がインストール先を返してくれます。

## キャッシュパスの設定

キャッシュの参照先が `/usr/local` や `/Library/Caches` になってしまうようなので、パスを変更します。

`~/.zshrc` や `~/.bashrc` で以下を設定します。

```
export HOMEBREW_CACHE=/opt/homebrew/cache
```

この内容は、[コメント](http://qiita.com/usamik26/items/601f5612bd3f8a21cc41#comment-21e0df472b6c5949fb75)でご指摘いただいたものです。ありがとうございます。

## 補足：なぜインストール先を変更するのか

Homebrew は `/usr/local` にインストールすることを推奨しています。

しかし、`/usr/local` はそもそもホスト管理者に与えられた場所で、自前でビルドしたものやローカルで用意したツールなどを置く場所です。パッケージマネージャに入ってきてほしい場所ではありません。

`/usr/local` を本来の意味で使いたいため、Homebrew は `/opt` にインストールすることにしました。

## 補足：インストール先を変更するデメリット

Homebrew は `brew install` 時にビルド済みバイナリがあるものはバイナリをインストールしてくれるようになっています。

しかし、インストール先を変更していると、多くの場合にビルド済みバイナリがそのままでは使えず、ソースからインストールすることになります。このため、`brew install` の動作が遅くなります。
【Arduino】一番簡単なLチカの仕方

前回は、LEDやArduinoの選び方をShareしました。
今日は、一番簡単なLEDの点滅をShareしたいと思います。


まず、Arduino UNOが一番やりやすいのでUNOで説明します。
また、私がMacを使用しているので、Macでの操作を基本的に示しますが、WindowsでもLinuxでも基本
同じです。

# 1. ソフトの書き込み
ArduinoはすでにDL済みで(Windowsの場合はFTDIドライバも)インストールしている事を
前提にします。

## 1-1. ボードの選択 
下の図のように、UNOを選択します。
![1-1.png](https://qiita-image-store.s3.amazonaws.com/0/61161/d95a4e8c-13ad-32ce-3ec2-b4d9ae21dfd4.png)


## 2-2. シリアルポートの選択
下の図のように、/dev/tty.usbmodem1451を選択します。
Windowsの場合は、COMxポートを選択します。（xはドライバをインストールして割り振られたポートです）
![1-2.png](https://qiita-image-store.s3.amazonaws.com/0/61161/fd9b2d82-299a-9fb6-82f6-890584b42a20.png)


# 2.ソフトウェアを記述する
以下の様にスケッチを新規作成して記述してください。
わかりやすいようにコメントもつけてあります。

```c

//definition of output pin
#define LED_PIN            13


void setup() {
  
  //setup 13 pin for output
  pinMode(LED_PIN, OUTPUT);
  
}


void loop() {

  //arduino output high value to 13 pin
  digitalWrite(LED_PIN, HIGH);
  //delay 1s delay. You have to specify function's parameter in milli second's 
  delay(1000);
  //arduino output low value to 13 pin
  digitalWrite(LED_PIN, LOW);
  //delay 1s
  delay(1000);
 
}

```

# 3. ソフトウェアを転送する
ファイルメニューからアップロードを選択してください。
そうすると、Arduinoに上で記載したソフトが転送されます。

# 4. LEDを取り付ける
PIN13にLEDの足の長い方、GNDと書いてあるところに、LEDの足の短い方を突っ込んでください。
長い方と短い方間違わないでね！

![DSC_0056.JPG](https://qiita-image-store.s3.amazonaws.com/0/61161/50b2af80-b0ef-c9eb-69ba-159bdd1a311a.jpeg)

こんな感じです。
ちなみにわかりやすいように、PIN13とGNDは敢えて隣り合わせの部分を選んでいます。



はい！
以上です！！！

ね、簡単でしょ！
コレであなたも、マイコン＆組み込みエンジニアの仲間入り！！！
Railsのmodelで【WHERE カラム名 IN [配列] OR カラム名 IN [配列]】検索するメソッドの書き方

Railsのmodelで、ちょっと複雑なSQLの処理をしようとしたら、かなりハマりました…orz

という事で同じように困っている方の役に立てればなと思います☆

#【WHERE カラム名 IN [配列] OR カラム名 IN [配列]】をこう書いた！


Testモデルで、id1・id2・id3にそれぞれINかつORで検索して取得するという処理の場合です。

上記では配列と記載していますが、配列ではない場合にも対応しなければいけなかったため、下記のように対応しました。


```rb
ids1 = [1, 2, 3]
ids2 = [10, 20, 30]
ids3 = 100

Test.where("id1 IN (?) OR id2 IN (?) OR id3 IN (?)" ,ids1, ids2, ids3)
```

これでSQLは

```sql
SELECT * FROM tests WHERE (id1 IN (1, 2, 3) OR id2 IN (10, 20, 30) OR id3 IN (100));
```

#おわりに
まだまだ初心者なので、もっと良い書き方があれば知りたいです！

以上で終わりになります。
閲覧ありがとうございました☆
即時関数の様々な記法

#functionの先頭に！だと…？
ある日、Twitterボタンを設置しようとしていた私は、ふいにそのソースコードを見て心がざわつきました。

```
<script>
!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');
</script>
```

ん？？

```
!function(...){
	doSomething();
}(...);
```

functionの前に「！」が書いてあるぞ…。
いったい何者だこやつは…！

#即時関数だった
調べてみると、JSでよく見かける即時関数

```
(function(...){
	doSomething();
})(...);

```

の別記法でした。

#他にも…
他にもこんな書き方ができるようです。

```
+function(...){
	doSomething();
}(...)
```

```
-function(...){
	doSomething();
}(...)
```

```
void function(...){
	doSomething();
}(...)
```

```
typeof function(...){
	doSomething();
}(...)
```

そもそも( )を使う必要性すらないわけですね。

#なぜこの書き方ができるの？
詳しい説明は割愛しますが、ポイントは関数を「式 Expression」として解釈させることにあります。

JSの処理系に関数を式として解釈させるには、「式文 ExpressionStatement」と呼ばれる文法にのっとる必要があります。

ECMAScriptの仕様書には

```

ExpressionStatement :
	[lookahead  {{, function}] Expression ;

/* 先頭が { もしくは function で始まらないこと */

```

とあるので、冒頭の「!」で始まるfunctionは関数式として解釈され、実行されるというわけです。


#参考リンク
* [ECMAScript Documentation](http://www.ecmascript.org/docs.php)
* [知ってて当然?初級者のためのJavaScriptで使う即時関数](http://d.hatena.ne.jp/sandai/20110824/p1)
* [ソーシャルボタンのJavaScriptでfunctionの前に「!」がついている理由](http://d.hatena.ne.jp/teramako/20130622/p1)
システム開発の進め方について

#システム開発の進め方について。
##以下の6工程に沿って開発していく。
***
###1.要件定義
***
クライアントがその対象物を通して何を達成したいかということを元に、システムやソフトウェアの開発において、クライアントに提示された目的を達成するために必要な機能や、満たすべき性能などを明確にしていく作業。

###2.基本設計
***
要件定義にて捻出された目的を達成するために必要な機能、性能を踏まえて、製品の基本的な設計を行う。
製品の基本的な機能や外装（画面のイメージなど）を大まかに決定していきながら、製品の全体像を描き出す。
###3.開発
***
基本設計で得られた全体像を機能ごとに分割して、プログラムを作成する。
プログラムが正常に動作するか、単体テストを行いながらすすめていく。

###4.結合テスト
***
開発段階で作成したプログラムを繋げて、機能レベルでのテストを行う。
設計された機能が満足に動作しているか検証する。
###5.システムテスト
***
結合テストが全て終了した段階で、開発の最終段階に行われる。システムが全体として要求された機能を動作させられているか、性能は十分であるかを検証する。
本番と同じ環境で稼働することを確認する。



###6.運用・保守
***
システム納入後、システムの稼働監視、セキュリティ対策、トラブルの解決などクライアントの対応をする。