OmniAICreator/Qiita-1.07M huggingface dataset:
SinatraベースのGitリポジトリブラウザ「Ginatra」

Gitを企業のプロジェクトで採用するケースが増えている。とは言えまだGUIツールが弱く、操作がしづらいのが実情ではある。特に最近はWebアプリケーションが流行っていることもあってGUIよりもWebブラウザベースのツールが増えているようだ。

[![Screen Shot 2015-01-08 at 6.18.35 AM.png](https://qiita-image-store.s3.amazonaws.com/0/1851/7647f468-4dcd-251d-62b0-1664d853f9ec.png)](https://qiita-image-store.s3.amazonaws.com/0/1851/7647f468-4dcd-251d-62b0-1664d853f9ec.png)
**WebベースのシンプルなGitブラウザ**

Githubのようなリポジトリブラウザは良いと思いつつも、企業では使いづらいだろう。そこで使いたいのがGinatraだ。

今回紹介するオープンソース・ソフトウェアはGinatra、Sinatra製のGitリポジトリブラウザだ。

GitにはGitWebというWebブラウザベースのGitブラウザがあるが、GinatraはそれのSinatraベースのクローンになる。個人的には印象としてはGinatraの方がごく簡単に導入できるように思える。何せGemを入れてGinatraを立ち上げ、reposディレクトリに見たいリポジトリを取り込むだけだ。

[![Screen Shot 2015-01-08 at 6.10.39 AM.png](https://qiita-image-store.s3.amazonaws.com/0/1851/52855b64-0b66-3675-c1c3-479d087decd0.png)](https://qiita-image-store.s3.amazonaws.com/0/1851/52855b64-0b66-3675-c1c3-479d087decd0.png)
**修正点**

リポジトリは複数登録できる。プロジェクトに入るとコミットログが一覧で表示される。各コミットログをクリックすれば、その際に行った変更がファイル名とDiffの一覧で表示される。これを見れば何の修正かが一目で分かる。

ブランチやタグも一覧できるようになっているので、規模が大きくなっても十分対応できるだろう。日本語のコミッター名にも対応しており、便利に使うことができる。Githubを使っていないならすぐにでも導入をお勧めしたい。


Website: http://narkoz.github.io/ginatra
GitHub: https://github.com/narkoz/ginatra
calc()が効かない？: 中の演算子の間にはスペースが必要です

# 今日のハマりどころ
div要素を中央寄せしようとして`calc()`を使ってやりました

```css:before.css
.example{
  width:300px;
  height:100px;
  top:100px;
  left:calc(50%-300px/2);
}
```
と書いたら全く反映されなかった。
Developer Toolで確認したらこの`left`がInvalid Valueになってた


# 解決法
ピンとくるまで時間がかかりました。

```css:after.css
.example{
  width:300px;
  height:100px;
  top:100px;
  left:calc(50% - 300px / 2); /*値と演算子の間にスペースが必要*/
}
```
はい、演算子との間にはスペースが要るんです。
他ファンクションでどうなるかは不明。

=====
#【追記】2015-04-08
だいぶ前の記事ですが割と見て頂いてびっくりです。
Twitterで言及されていたのですが、
`+`, `-`には **スペースが必要** で、`*`,`/` には **スペースが不要** なのだそうです。
参考：
1. https://twitter.com/terkel/status/553464271862902785
2. http://www.w3.org/TR/css3-values/#calc-syntax
> Note that the grammar requires spaces around binary ‘+’ and ‘-’ operators. The ‘*’ and ‘/’ operators do not require spaces.

しかしややこしいのでのですべての演算子でスペース入れるようにしてます。
【iOS】NSUUIDの型変換


## Objective-C

```objc:
NSUUID *uuid = [NSUUID UUID];

// NSUUID -> NSString変換
NSString *uuidStr = uuid.UUIDString;

// NSString -> NSUUID変換
NSUUID *convertedUuid = [[NSUUID alloc] initWithUUIDString:uuidStr];
```

## Swift
```swift:
let uuid:NSUUID = NSUUID()

// NSUUID -> NSString変換
let uuidStr: NSString = uuid.UUIDString

// NSString -> NSUUID変換
let convertedUuid:NSUUID = NSUUID(UUIDString: uuidStr)!
```

## おまけ
#### UUIDの生成

ターミナルで実行：

```bash:
$ uuidgen
```
One-time bindingと$resourceで気をつけること


###前提

AngularJS1.3からOne-time bindingという最初の一回だけバインディングする仕組みが入った。
$resourceはpromiseではなく、先に空配列を返す。

###問題

なので、下記のようにngRepeatをOne-time bindingにすると、空配列評価されて、何も表示されなくなったりする。
あ、下のindex()はquery()と読み替えて問題なし。

```sample.coffee

angular.module("myApp")
.controller "SampleCtrl", ($scope, Group) ->
  $scope.groups = Group.index()

```

```index.html
<div  ng-repeat="group in ::groups">
{{::group.name}}
</div>
```

###解決

プロミスで処理しよう。
個人的には$resourceは出来るだけpromiseにしたほうがいいと思う。

```sample.coffee

angular.module("myApp")
.controller "SampleCtrl", ($scope, Group) ->
  Group.index().$promise.then((groups)->
    $scope.groups = groups
  )
```
vimのundoファイルをnetrwで表示しないようにする

netrw って、あの、ディレクトリとかファイルの一覧をする、vimのファイラーみたいなやつです。
あれに、*.un~ファイルが出るようになって見づらいので。

参考URL
https://github.com/nelstrom/dotfiles/blob/master/vimrc


```vim
let g:netrw_list_hide='\.un\~$'
```

もっと早くやるべきだった。。。
javascript、iframeでファイルのダウンロード

ダウンロードボタンを押すとファイルがダウンロードされる。
ただし、ファイルが存在しない場合はエラーメッセージをモーダルで表示させる方法のめも。

```js:sample.js
//ダウンロード先のURL
var url = '/download';
var iframes = "<iframe id="downloader" width="0" height="0" frameborder="0" src="' + url + '"/>";
$(iframes).appendTo('body').load(function(){
    //エラーがあった場合、サーバー側からエラーメッセージが返されるので、それを表示
    var body = $(this).contents().find('body').text();
    if(body != ''){
        alert(body);
    }
    //iframeは自動的に閉じる
    setTimeout(function() {
        $('#downloader').remove();
    },300);
});
```
Atom Shellでの絶対パスの扱い

# 背景

[俺がtmlib.jsの公式エディタのrunstantをオフライン対応のデスクトップアプリにするの前編](https://abrakatabura.hatenablog.com/entry/2014/12/19/120000)の後編を書こうと、いざ、Atom Shellに組み込んで動かそうとしたら、ハマった。

# Atom Shell内のhtmlでのパスの指定

```js:main.js
mainWindow.loadUrl('file://' + __dirname + '/alpha/index.html');
```

のように記述した場合、index.htmlで

```html
<img src="/tmp/hoge.jpg">
```

とは、ローカルのPCの上の/tmp/hoge.jpgを参照する事になる。

自分は、てっきり、index.htmlから相対パスでいうところの、

../tmp/hoge.jpg

が参照されると思い込んでいた。

```txt
.
├── alpha
│   └── index.html
├── tmp
│   └── hoge.jpg <-- これが/tmp/hoge.jpgで参照できると思っていた。
├── index.html
├── main.js
├── package.json
```

上記のtmp/hoge.jpgを参照するには

```
../tmp/hoge.jpg
```

# まとめ

まぁ、mainWindow#loadUrlの時点でパスの指定が、ローカルPCの絶対パス
指定なんだから気がつけるのかも。

# 関連記事

- [俺がtmlib.jsの公式エディタのrunstantをオフライン対応のデスクトップアプリにするの後編 - non vorrei lavorare](https://abrakatabura.hatenablog.com/entry/2015/01/12/145040)
Dockerで`Error: cannot mount hugetlb to /cgroup/hugetlb`と言われた時の対処法


はじめに
======

先日 EC2のAmazon LinuxにDockerを入れて使っていたらエラーで使えなかった時の対処法です。

Version
-----------

* Amazon Linux AMI release 2013.09
* uname -a: Linux hogehoge 3.4.66-55.43.amzn1.x86_64 #1 SMP Wed Oct 16 06:26:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux
* docker: 1.3.3 ( yum で Install )

症状
=====

`service docker [re]start` などとすると、以下の様なエラーが出ます。
DockerのDaemon自体は起動するのですが、いくつかのDockerコマンド(docker runなど)が失敗してしまいます。

```sh:aa.sh
% sudo service docker restart
Stopping docker:                                           [  OK  ]
Starting cgconfig service: Error: cannot mount hugetlb to /cgroup/hugetlb: No such file or directory
/sbin/cgconfigparser; error loading /etc/cgconfig.conf: Cgroup mounting failed
Failed to parse /etc/cgconfig.conf                         [FAILED]
Starting docker:                                           [  OK  ]
```

対策
=====

/etc/cgconfig.conf のいくつか(ここでは hugetlb, memory)をコメントアウトして、docker restart したら治りました。

```/etc/cgconfig.conf 
mount {
    blkio      = /cgroup/blkio;
    cpu        = /cgroup/cpu;
    cpuacct    = /cgroup/cpuacct;
    cpuset     = /cgroup/cpuset;
    devices    = /cgroup/devices;
    freezer    = /cgroup/freezer;
#    hugetlb    = /cgroup/hugetlb;
#    memory     = /cgroup/memory;
    perf_event = /cgroup/perf_event;
}
```


さいごに
========

詳細な原因とかわかりませんが、とりあえず動くので良しとします。
SwiftでUIButtonのタップ時に押された感のアニメーション

タップしたかどうかはtouchesBeganなどを使います。

下記はtouchesBeganした時に、
「ボタンがわずかに縮小し、alphaが若干薄くなる」
というUIButtonを継承したクラスを作ってみました。


```swift
import UIKit

class UIButtonAnimated: UIButton {
    
    override init() {
        super.init()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        super.touchesBegan(touches, withEvent: event)
        self.touchStartAnimation()
    }
    
    override func touchesCancelled(touches: NSSet!, withEvent event: UIEvent!) {
        super.touchesCancelled(touches, withEvent: event)
        self.touchEndAnimation()
    }
    
    override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
        super.touchesEnded(touches, withEvent: event)
        self.touchEndAnimation()
    }

    private func touchStartAnimation(){
        UIView.animateWithDuration(0.1,
            delay: 0.0,
            options: UIViewAnimationOptions.CurveEaseIn,
            animations: {() -> Void in
                self.transform = CGAffineTransformMakeScale(0.95, 0.95);
                self.alpha = 0.7
            },
            completion: nil
        )
    }
    private func touchEndAnimation(){
        UIView.animateWithDuration(0.1,
            delay: 0.0,
            options: UIViewAnimationOptions.CurveEaseIn,
            animations: {() -> Void in
                self.transform = CGAffineTransformMakeScale(1.0, 1.0);
                self.alpha = 1
            },
            completion: nil
        )
    }

}
```

利用するときは普通のUIButtonと同じく

```swift
let btn = UIButtonAnimated(frame: CGRectMake(0, 0, 100, 100))
```

という感じで使えばOKです。
Maven3で環境ごとのresourceを差分で管理する方法

Mavenでリソースファイルを環境毎に管理したい場合はよくあります。
以下はぐぐるとよく出てくる方法で、環境毎にプロファイルでresourceを定義するものです。
<pre>
    \<profiles>
        \<profile>
            \<id>ローカル開発環境</id>
            \<build>
                \<resources>
                    \<resource>
                        \<directory>src/ローカル開発環境/resources</directory>
                    \</resource>
                \</resources>
            \</build>
        \</profile>
        \<profile>
            \<id>本番環境</id>
            \<build>
                \<resources>
                    \<resource>
                        \<directory>src/本番環境/resources</directory>
                    \</resource>
                \</resources>
            \</build>
        \</profile>
    \</profiles>
</pre>
これでも環境毎にリソースを管理できますが、一方のリソースファイル配下のファイルを変更すると、他方のリソースファイル配下のファイルも変更しなくてはなりません。
２つくらいならいいかもしれませんが、環境が３つも４つもあるとこの方法では管理が苦痛になりますし、何よりも修正の展開が漏れのリスクが増します。
以下とするとこで、環境依存しないリソースと環境依存するリソースに分けられ、
少なくとも環境依存しないリソースについては展開漏れが起きなくなります。
<pre>
    \<profiles>
        \<profile>
            \<id>ローカル開発環境</id>
            \<build>
                \<resources>
                    \<resource>
                        \<directory>src/ローカル開発環境/resources</directory>
                    \</resource>
                    \<resource>
                        \<directory>src/各環境共通/resources</directory>
                    \</resource>
                \</resources>
            \</build>
        \</profile>
        \<profile>
            \<id>本番環境</id>
            \<build>
                \<resources>
                    \<resource>
                        \<directory>src/本番環境/resources</directory>
                    \</resource>
                    \<resource>
                        \<directory>src/各環境共通/resources</directory>
                    \</resource>
                \</resources>
            \</build>
        \</profile>
    \</profiles>
</pre>
仕様で決まってはいませんが、XMLは上から解釈されることが多いです。
ただし、pomのresourceタグの場合は、より上に記載した設定を優先させるために下から解釈しているようです。
上記のように記述することで、環境共通のリソースが展開された後で、環境依存のリソースを展開することができます。
開発中は、src/main/resources配下で全てを開発しておき、
結合試験に突入する前に、結合環境で変更しなくてはいけないものをsrc/it/resources配下に置いて編集して、pomに追加しておきます。
後はプロファイル指定してmvnを叩くようにすれば環境毎のリソースファイルを管理することが可能です。
本番環境の差分ファイルを作る時は、結合の差分をそのまま本番ようのディレクトリに置いてあげて中身を編集するのみで良いので、アプリ的な環境は簡単に構築できると思います。
csstyleを使ってcssのモジュール化を効率的に


css、書くのがとてもむずかしいので、なんとかして綺麗に書いていきたいのですが、なにかと難しい事が多い。

BEMを使ってcssをモジュール化して管理するのが流行りなようですが、どうしてもBEMは人間の書くものじゃない気がしていました。

そんな中ちょっといいのではとおもったcsstyleというライブラリがあったので紹介します。

* csstyleはsass3.3のfeatureを使っています。使用する場合はご注意ください。

## csstyleって？

[csstyle](https://github.com/geddski/csstyle)はとても簡単なsassのシンタックス拡張です。それ自体は80行ほどのとても小さなscssファイルなのですが、これによってcssがメンテナブルに、かつ綺麗に書けるというものです。


csstyleでは、cssを

- components
- options
- parts
- tweaks

という4つに分けて記述します。

(locationsというものもあるのですが、これは後述します)

BEM的には

componentsがblock、
optionsがmodifier、
elementがparts

というような対応になるでしょうか。(違っていたらごめんなさい)
これにtweaksというものが加わります。

tweaksはoptionsと同じようなものですが、optionsは一つのcomponentsにだけ適応するものなのに対し、tweaksはどのcomponentsにも適用できるようなもの、という感じです。


## 基本の使い方

実際に書いてみましょう。

まずはcomponentsから。([公式サイト](http://www.csstyle.io/)から引用しています。一部わかりやすくするために変更しています)

```html
<a class="button">Neat!</a>
```

```scss
@include component(button) {
  background: #6BD9ED;
  padding: 15px;
}
```


このように `@include` 文をつかってscssを記述し、それが `button` というクラス名でhtml内で使用できます。


つぎにoptions、partsを使ってみます


```html
<a class="button --action">
  Register Now
  <span class="button__icon --hover"></span>
</a>
```

こんなhtmlがあったとして

```scss
@include component(button) {
  background: #6BD9ED;
  padding: 15px;

  @include option(action){
    color: #1F1F1F;
    background: #A7E040;
    padding-top: 0;
  }

  @include part(icon){
    font-size: 34px;
    position: relative;
    top: 10px;

    @include option(hover){
      color: red;
    }
  }
}
```


このように書いていきます。

tweaksは

```html
<a class="button --action +rounded">
  Register Now
  <span class="button__icon --rocket"></span>
</a>
```

```
@include tweak(rounded) {
  border-radius: 10px;
}
```


このように `+rounded` といった形で記述できます。


また、locationというものもあり

```html
<span class="@home">
  <a class="button --action +rounded +glass">
    Register Now
    <span class="button__icon --rocket"></span>
  </a>
</span>
```

```scss
@include location(home) {
  @include component(button){
    color: #6BD9ED;
    background: #1F1F1F;
  }
}
```

このように記述できます。

topページだけはデザインを少し変えたい、なんて時によいのかもしれないです。



## まとめ

csstyleの良い所は、html側ではBEM記法でcomponentを記述することで、構造をわかりやすくする一方、css側ではBEMを書くこと無く、かつ可読性が高い状態でcssを記述できることかなと思います。


あとBEMをcssでもhtmlでも書くなんて正気の沙汰ではないと思うので、この方法はいいんじゃないかなぁと思っています。


[公式サイト](http://www.csstyle.io/)
[Github](https://github.com/geddski/csstyle)
私のプログラミング原体験: VB4.0の箱を抱きしめた日

# はじめに
こんな内容でもQiitaなら受け入れられる気がした！

職業としてプログラミングをするようになり約10年が経ちました。
プログラミングを始めた頃の事をふいに思い出したので記録しておきます。

# VB4.0の箱を抱きしめた日
高校生の時、Windows95搭載のマシンを買いました。
富士通 FMV DESKPOWER Sだったと思います。
それまで貯めていたお年玉貯金をすべてはたいて。

HDDドライブのカリカリ音や
「ロード中は絶対にクリックしないでください」という危険な添付ソフトや
メモリ8MD→16MBへの増設や
Cドライブのすべてのファイルをゴミ箱に突っ込んだ話などは
すべて省略。

ゲームを作りたい！と思い、
ゲームはプログラミングで作れる、と知り
Visual Basic 4.0を購入しました。
確か3万円ほどでした。

分厚いマニュアルを片手にHello World作成。
「何だろうな、Hello Worldって。初プログラムのお決まりなのか...」
「実行。画面出た！」
「うおお！ボタン押したら文字が変わった！」

とうとうプログラムを自分で作ったのか...！
と嬉しくて、夕食の時もフワフワとした気持ちでいたのを覚えています。

で、VB4.0の箱。
確か裏にコーヒー屋さんの店舗向けプログラムが印刷されていました。

その印刷された画像の感じにグッと来たり
ここから何でも作れるんだ！感だったり
ゲーム作るぞー、というやる気溢れた感情だったりで
幸せな気持ちでいっぱいになり

**気付いたらVB4.0の箱を抱きしめていました。**

部屋で一人。
思春期の男子高校生。
うっとりしながら(笑)

# おわりに
その後、サンプルプログラムを写したり
自分でモヤモヤと考えてみるも
「ボタンを押したらテキストが変わる」
から、どうやったら
「スーパーファミコンで遊んでいるようなゲーム」
に繋がっていくかがまーったく分からず途方に暮れる日々でした。

やがて"VBでゲーム作成する"系の本が次々と出版され
また雑誌(Tech Winなど)を買いまくっては読んでいました。

幾多の苦難を乗り越え、自作のゲームを完成させます。
そのゲームはTech Winの投稿コーナーに載り、またまた感動しましたとさ。

皆さんにもきっと最初の「うおお！」があると思います。

このエントリーが何かの参考になりましたら幸いです。

# 関連リンク
Visual Basic
http://ja.wikipedia.org/wiki/Microsoft_Visual_Basic

富士通 FMV DESKPOWER
http://ja.wikipedia.org/wiki/FMV

Windows 95
http://ja.wikipedia.org/wiki/Microsoft_Windows_95

Tech Win
http://ja.wikipedia.org/wiki/%E3%83%86%E3%83%83%E3%82%AF%E3%82%A6%E3%82%A3%E3%83%B3DVD
区間の和の最大値

https://paiza.jp/poh/enkoi の[問題３](https://paiza.jp/poh/enkoi-third?o=fb66d5a7)

数列 $a_0, a_1,\dots,a_n$が与えられた時に、連続する$t$項の和$a_i,a_{i+1},\dots,a_{i+t-1}$の最大値を求める問題を$O(n)$で解けという話。

手続き的に書くのは簡単で、配列のインデックスを進めるたびに当該の区間から出て行った項を減算して新しく入った項を加算してやれば各区間の和が順次的に定数時間で求められるから、区間の和の配列($s_0,s_1,\dots$)とその最大要素が$O(n)$で求められる。区間和$$s_i=a_i+a_{i+1},\dots,a_{i+t-1}$$ は漸化式 $$s_{i+1}=s_i-a_i+a_{i+t}$$を満たすから
数列 $a_0,\dots,a_{11}$ = `{0 123 222 21 1 332 22 99 3 444 24 10}`に対して`t=3`の場合で、
`(0+123+222=345), (345-0+21=366), (366-123+1=244),... ` とできるわけ。問題はインデックス操作をせずにこれを書くにはどうしたらいいか、である。実はわりと簡単で：
 $$ s_i = (a_{i+t-1}-a_{i-1})+s_{i-1} = (a_{i+t-1}-a_{i-1})+(a_{i+t-2}-a_{i-2}) + s_{i-2} = \dots$$ なので $$s_{i+1} = \sum_{k=0}^{i} (a_{k+t} - a_{k}) + \sum_{k=0}^{t-1} a_k$$ になる。

たとえば次の数列：

```
1, 3, 6, 8, 2, 7, 7, 9, 0, 4, 2, 7, 1,...
```

に対して3項連続の区間の和を計算したければ、最初の3項を取り除いた数列を用意し、元の数列をそこから各項ごとに減算する：

```
8, 2, 7, 7, 9, 0, 4, 2, 7, 1,...
1, 3, 6, 8, 2, 7, 7, 9, 0, 4, 2, 7, 1,...
-----------------------------------------
7,-1, 1,-1, 7,-7,-3,-7, 7, -3,...
```

この数列の累積和を取り（最初に0を付け加えておく）：

```
0, 7, 6, 7, 6, 13, 6, 3, -4, 3, 0,...
```

最後に各項に、最初に取り除いた3項の和 `1+3+6=10`を足すと


```
10, 17, 16, 17, 16, 23, 16, 13, 6, 13, 10,...
```

区間和の数列ができる。あとは最大値を探すだけ。これらの操作はすべて$O(n)$なので、全体も$O(n)$で終わる。

```hs:findSectionMaximum.hs
fmax t as =  maximum $ scanl (+) (sum$take t as) (zipWith (-) (drop t as) as)
```

# というわけで恒例のウンコード
[こんなウンコードでも大丈夫](https://paiza.jp/poh/enkoi-ending/5244d0cc)なのか……

```hs:POHLite4.hs
import Control.Applicative
import Data.List

main = do
  (h:ts) <- filter (not.null) <$> lines <$> getContents
  let [t,n] = map (read::String->Int) $ words h
  let nums = map (read::String->Int) ts
  print $ fmax t nums
    where 
      fmax t as =  maximum $ scanl (+) (sum $ take t as) (zipWith (-) (drop t as) as)

```
[個人メモ] Wagtail CMSの例題がすごそう。

wagtail CMS site:
http://wagtail.io/

例題:
https://github.com/torchbox/verdant-rca

RCAとは・・
http://www.rca.ac.uk/

### がぜん、Django&Wagtail CMSを勉強する気になった。
MacでHomebrewを使わずImagemagickをインストールする方法とpath_helperについて



Mac OS X 10.9.3. 最初 gs, imagemagickをHomebrewで入れてconvertを使おうとしたのだが,

``````bash
convert: no images defined `output.png' @ error/convert.c/ConvertImageCommand/3210.
``````

とかエラーが出ていろいろ苦労していた. そこで

`````bash
$ brew remove imagemagick
`````

で消した後, 以下のページから`.pkg`を落として入れることで無事使えるようになった.

[ImageMagick installer for Mac OS X](http://cactuslab.com/imagemagick/)

pkgで入れるのちょっと嫌だったんだが, 結果は`/opt/ImageMagick/`, `/opt/Ghostscript/` に入るようで興味を持つ. 説明に`/etc/paths.d/`がどうこう書いてて, shell開き直すと確かにPATHに反映されてる.

````bash
$ cat /etc/paths.d/ImageMagick
/opt/ImageMagick/bin

$ which convert
/opt/ImageMagick/bin/convert
````

初耳だったので調べてみたところ `/etc/paths`はBSD由来の何かっぽい. `/etc/profile`中で`/usr/libexec/path_helper`が呼び出されている.

`````bash:/etc/profile
# ...
if [ -x /usr/libexec/path_helper ]; then
        eval `/usr/libexec/path_helper -s`
fi
# ...
`````

`man path_helper` すると,

> path_helper(8)            BSD System Manager's Manual           path_helper(8)
> 
> NAME
>      path_helper -- helper for constructing PATH environment variable
> 
> SYNOPSIS
>      path_helper [-c | -s]
> 
> DESCRIPTION
>      The path_helper utility reads the contents of the files in the directories /etc/paths.d and /etc/manpaths.d and appends their contents to the PATH and MANPATH environ-
>      ment variables respectively.  (The MANPATH environment variable will not be modified unless it is already set in the environment.)

とのことで, 単に`/etc/paths`らへんの設定テキストを元に`PATH=...`をセットしてexportするだけのシロモノらしい

```````bash:path_helper
$ /usr/libexec/path_helper -s

PATH="/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/Ghostscript/bin:/opt/ImageMagick/bin:/usr/texbin:...:/Users/hash/.go/bin"; export PATH;
`````

なるほど.
PC用ゲームパッドをJavaScriptで使う

これまでは、ファミコン型のコントローラーと、XBOX360コントローラーを使いGamePadAPIを使えるようにライブラリを作ってきたが、一般的にはプレステ型のコントローラーが一番普及してるかな？ということで、[バッファローのコントローラー](http://www.amazon.co.jp/gp/product/B005FE17TO)を買ってみた。
これがなんと、ファミコン型コントローラーとも、XBOX360コントローラーとも違う値を返すことがわかった。
そもそも、このコントローラーはアナログスティックを使うモードと、アナログスティックは使わずに十字キーを使うモードがあり、お互いに排他利用する形になる。
そして、先日追加した「**Select**」「**Start**」ボタンの情報が、XBOX360コントローラーでいうところのLBとRBで返ってくること分かった。
この三種三様のパッド、どれを標準にするのがいいのだろうか。
マウント解除せずにパーティション＆ファイルシステムを拡張する

[予め用意されたイメージをSDカードに焼いて使用する](https://www.parallella.org/create-sdcard/)ような場合、切られているパーティションがとても小さくなっていて困る！ということがあって色々悩んだ結果解決したのでメモ。

0. ```parted```を使う
    1. ```p```で拡張したいパーティションを確認
    1. ```resizepart```で拡張する（※通常の```resize```だとマウント解除しないとできないっぽい）
0.  ```resize2fs```でファイルシステムを拡張する

どこまで通用するのか分かりませんが、メモということで（タイトルも一般的すぎる気がしなくもない）。
コンテナに固定IPを割り振って外部からアクセスする

dockerのネットワークはそのままでは固定IPを使う事が出来ない。
それじゃ我慢ならないからコンテナに固定IPを割り振って
外部からアクセスするまでをまとめている。
ホストがCentOS7のお話。

###現在のイメージ
当たっているか自信ないけどdockerをインストールした後の
ネットワークをイメージ化するとこんな感じになっているんじゃないかと思う。

![nw2.png](https://qiita-image-store.s3.amazonaws.com/0/48569/9ad14ca6-fe64-d21b-708b-664cfcd06376.png)

###完成予想図
仮想ブリッジを立てて、その配下にコンテナがぶら下がるイメージ。
元々あった物理NICのeno1は自分以外のフレームも全て取り込む、
とにかく届いたフレームを全て仮想ブリッジであるbr0に送り届けるだけの人になってもらう。
(完成イメージ)
![nw.png](https://qiita-image-store.s3.amazonaws.com/0/48569/20f9ce83-f11a-8bc1-c530-1d7ae734381f.png)

###仮想ブリッジ作成
仮想ブリッジbr0を作成します。

```bash
nmcli con add type bridge ifname br0            # 仮想ブリッジbr0を作成する
nmcli con modify bridge-br0 bridge.stp no       # STPはじゃべるな
nmcli con modify bridge-br0 ipv4.method manual ipv4.address "192.168.1.0/24 192.168.1.1" ipv4.dns 192.168.1.254             # IPの設定
```

###物理NICの接続
仮想ブリッジbr0に物理NICのeno1を接続する。
以下をやれば接続されるらしい。俺の環境では接続されなかったぽいけど。

```bash
nmcli con add type bridge-slave ifname eno1 master bridge-br0
```

eno1の設定は消させてもらう。
何しろ受信したフレームを何も考えずにbr0に届けさえすれば良いんだから。

```bash
nmcli con modify eno1 ipv4.dns "" ipv4.addresses "" ipv4.method disable
```

NetworkManagerを再起動して設定反映する。
本当なら以下で反映されるっぽい。俺の環境では反映されなかったけど。
マシン自体を再起動したら仮想ブリッジの設定は反映された。

```bash
systemctl restart NetworkManager
```

仮想ブリッジbr0に物理NICのeno1を接続する。
マシンを再起動してもeno1とbr0は接続されなかったみたいだからbrctlで接続を試みる。

```bash
yum install bridge-utils
brctl addif br0 eno1
brctl show
```

###コンテナのNICと仮想ブリッジを接続
pipeworkってのがあるらしいよ。何やってるかは[ココ](http://tkyshm.hatenablog.com/entry/2014/08/11/155627)が解かりやすかったです。

pipeworkの導入

```bash
cd /usr/local/src
git clone https://github.com/jpetazzo/pipework.git
ln -sv /usr/local/src/pipework/pipework /usr/local/bin/
```

コンテナにeth1を追加してbr0に接続させる。

```bash
pipework br0 コンテナID 192.168.1.2/24
```

###コンテナ側の設定
固定IPは割り振られた。だけどもまだ外から接続出来ないと思う。
コンテナに入ってちょいちょいと設定を行う。

```bash
nsenter -t $(sudo docker inspect --format '{{.State.Pid}}' コンテナ名) -m -u -i -n -p /bin/sh  # 起動しているコンテナに入る

ifdown eth0   # docker0との関係は断ち切ってしまおう。
route add default gw 192.168.1.254 # デフォルトゲートウェイの設定。ホストと同じで。
```

あとはコンテナでsshdとか起動すれば外部から192.168.1.2にsshでアクセスできるはず。
クラスAのIPアドレス一覧作成のスプリクト


今回初投稿です。（結構緊張しています。）

業務上、クラスAのアドレスの第２オクテットと第３オクテットの部分だけを可変して一覧にする必要があったため作成。
（私以外に需要があるかは不明）

皆さんのお役にたてば光栄です。またご指摘いただけるとうれしいです。
Rubyのバージョンは1.9.3を使用しています。


```rb

#!/bin/env ruby
#-*- coding: utf-8 -*-

require 'rubygems'
require 'csv'


csv_init = CSV.open("result.csv", "wb") do | w |
		w.puts ["IPaddr"]
	end
csv = CSV.open("result.csv", "a")
oct3_count = 0

for oct2_count in 0 ... 256 do
	while oct3_count < 255
		oct3_count = oct3_count + 1
		v_ip = "10.#{oct2_count}.#{oct3_count}.1"
		csv << ["v_ip"]
	end
	#第２オクテットの計算をするため第3オクテットの値を初期化
	oct3_count = 0
end
csv.close

```
SPARC アーキテクチャで JavaScript エンジンを動かす.


漢なら SPARC 64bit でも JavaScript コードを動かしたいですね! V8 は SPARC 対応していないので, JavaScript エンジンは動かないと諦めて涙で枕を濡らす日々が続きました…. が, duktape 動きました.

http://duktape.org/

```
$ gcc -v
Using built-in specs.
Target: sparc64-unknown-linux-gnu
…
Thread model: posix
gcc version 4.2.4

$ make -f Makefile.hello
gcc -o duk  -Os -pedantic -std=c99 -Wall -fstrict-aliasing -fomit-frame-pointer -I./src -DDUK_OPT_SELF_TESTS src/duktape.c examples/cmdline/duk_cmdline.c -lm

$ ./hello
Hello world!
2+3=5
```

Super cool! Happy JavaScript coding on SPARC!


## おまけ

gcc 4.8.1(sparc64-unknown-linux-gnu) での duktape コンパイルも確認しました.
coffeescriptをnode-inspectorでデバッグする

CoffeeScriptなんですが、middleman使ってるとデバッグしにくい。
慣れないうちはそもそもちゃんと意図したjavascriptの変換されてるの？みたいなところでつまづく。

そこで[node-inspector](https://github.com/node-inspector/node-inspector)でデバッグしてみる。


# インストール方法
前提としてnpmがインストールされてる必要があります。

```npm install -g node-inspector
```

# デバッグ方法
インストールしたら、下記コマンドで対象ファイルをコンパイル、node-debugの起動を行う。

```coffee -c -m myscript.coffee
node-debug myscript.js
```

# 思ったこと
コンパイル時点でエラーになって、メッセージがでる。
コンパイルが成功していればブラウザでInspectorを立ち上げられる。

でもよく考えたら、コンパイルの時点でエラーになるんなら他の方法でもありかも。
Charlestonのコメント共有について

Charlestonとの連携で、取得したコメントを共有して配信に利用する２つの方法を説明します。
その方法は

1. ログファイル
1. NSNotificationCenterによる通知

の２つとなります。

##Logファイルによるコメントの共有
###Charlestonのログファイル
Charlestonは多窓型のコメントビュワーのため、同時に複数のログが生成される可能性があります。
それを避けるために、Charlestonのコメントログは、自分が生主の放送のログファイルだけを生成します。

###ログファイルのパス
Charlestonのコメントログは、
`~/Library/Application Support/Charleston`
ディレクトリに、
`[放送番号(lvnnnnnnn)].xml`
というファイル名で、xmlファイルとして生成されます。

###xmlのエレメントと属性
####エレメント
ログファイルのエレメントは以下の通りです

| 要素 | 内容                   |
|:----|:-----------------------|
| log| ログファイル全体を囲みます|
| comment|コメント毎にこのタグで囲まれます|

####commentの属性
comment要素は、下記の属性を持ちます

| 属性 | 内容                   |
|:----|:-----------------------|
|no|コメント番号|
|time|コメントされた時間のunixtime|
|handle|コメ者のハンドル（ハンドルがある場合のみ）|

####xmlのサンプル
```xml
<log>
	<comment no="1" time="1420385544" handle="Чайка">こんばんは</comment>
	<comment no="2" time="1420427846">初見</comment>
```

##NSNotificationCenterによるコメントの共有
IntelliJ IDE で Go Plugin を入れて Go 1.4 の環境設定しようとしたら失敗した


IntelliJ IDE で Go 1.4 の環境設定しようとしたら失敗したので、情報共有します。

## 問題   　   　   　   　   　   　   　   　   　   　   

今回は Go を Homebrew でインストールして
$GOROOT に /usr/local/opt/go/libexec を設定したから
IntelliJ の Go SDK の設定にも、$GOROOT の PATH を 設定しようとしたら下記のエラーが発生。

```
IllegalArgumentException: Argument for @NotNull parameter 'virtualFile' of com/intellij/openapi/projectRoots/impl/ProjectRootContainerImpl.addRoot must not be null
```

## 原因

原因を調べた軌跡は、ブログの方に書いているので、興味のある方は[こちらからどうぞ](http://meguma.hatenablog.com/entry/2015/01/04/021853)。

結果的に、失敗の原因は、現時点（2015/01/06）で 
IntelliJ IDE > Preferences > Plugins > Browse Repositories にて
検索窓で「`golang`」検索することでインストールできる
「Go language(golang.org) support plugin **ver 0.9.15.3** 」が
Go 1.4 のバージョンには未対応ということが問題のようです。


## 解決法

現行のプラグインはアンインストールして Intellij IDEAを再起動後、
最新版の Go Plugin をインストールしましょう。

私は現時点（2015/01/06）の最新バージョン **0.9.16-alpha.9** のプラグインを
インストールすることで、Go 1.4 でも、Go SDK に正しく設定することができるようになりました。

こちらから、最新版の Go Plugin の jar をダウンロードできます。
https://github.com/go-lang-plugin-org/go-lang-idea-plugin/releases

ダウンロードした jar からインストールするには、
IntelliJ IDE > Preferences > Plugins > install plugin from disk...
を選択して、ダウンロードした jar ファイルを指定することで簡単にインストールすることができます。

## おまけ

私がつまづいてモタモタまったりしていたここ数日の間に
最近、同じ様にIntelliJ IDE で環境設定された方々が最新情報をあげているのを発見したので、
環境設定方法も含め、下記の記事も参考にしていただければと思います。ありがとうございます！

* [Go の開発環境は IntelliJ IDEA + golang plugin がマトモだった - Qiita](http://qiita.com/kaiinui/items/433eb86c022ffcad0bea)
	- こちらの記事のコメントに、今回の問題に関する情報提供があり、大変助かりました！

* [golang - MacのIntelliJ IDEA でGO言語を使う① - Qiita](http://qiita.com/puttyo_bubu/items/addf38044e0db0393617)
	- こちらの記事の設定手順の中にも、今回の問題に関する注意書きがあり、大変助かりました！


以上、おわり。
Redmine の通知をSlackに飛ばす (複数プロジェクト完全対応版)


この記事では、プロジェクトごとに飛ばすSlackそのものやROOM(Channel)を分ける手段について書きます。

基本的な手順は以下の記事を参照してください。

http://qiita.com/yuji0602/items/9ee2fe6620da5f36efc9

そのほかにも「Slack Redmine」でぐぐれば何件かヒットするのでご自由に。

## 複数プロジェクト連携のための手順

### Cloneするリポジトリの変更

`git clone` するリポジトリを `https://github.com/takah/redmine-slack` に変更。

既にcloneしちゃったよ！という人は以下の手順を踏むと良いです。

```
$ git remote add takah https://github.com/takah/redmine-slack
$ git fetch takah
$ git checkout takah/master
$ git checkout -b takah
```

### カスタムフィールドの追加

1. Redmine全体の管理画面（「管理」メニュー）を開く
- 「カスタムフィールド」を開く (/custom_fields)
- 「新しいカスタムフィールドを作成」
- 「プロジェクト」を選択し「次」
- 名称に「Slack URL」と入力して保存。 説明とかは好きにして。
- 名称「Slack Channel」のものも作成。
- プロジェクトの管理ページから変更できるようになっているのでWebhook URL とROOM名 `#random` などを設定。
- 通知されることを確認


これで以上です。上記のリポジトリは適当にForkされているものから選んだだけなのですが、どうやらコードをざっと追った限りでは、良さそうでした。
[JavaScript] Duo でモジュール読み込みしてみる


[WEB+DB PRESS Vol.84](http://gihyo.jp/magazine/wdpress/archive/2015/vol84) を読んでいて、[Duo](http://duojs.org) なるモジュール管理システムを知ったので試してみました。いままで Node.js(Express) のアプリケーションでは必然的に `require()` は使ってたんだけど、そろそろフロントエンドもやりたいなと思い。

Duo は GitHub 上にモジュールがあることを前提としていて、ソースに `require('ほげ')` と書いておけばビルド時に GitHub から引っ張ってきます。

## Duo の導入

```shell
$ npm install -g duo
```

執筆時のバージョンは `0.9.1` です。

## 使ってみる

特に意味は無いのですが [Moment.js](https://github.com/moment/moment) を読み込んで利用してみます。次のように `main.js` を書いて、

```javascript:main.js
var moment = require('moment/moment');

var message = moment().utc().add(9, 'h').format("ただいま MM月DD日 HH時mm分です。");
console.log(message);
```

ビルドします。

```:shell
$ duo main.js
```

すると次のようにファイルが展開されました。

![スクリーンショット 2015-01-07 23.51.20.png](https://qiita-image-store.s3.amazonaws.com/0/35733/d0a85c58-f7c7-11e0-8def-1c3f27ac89d8.png "スクリーンショット 2015-01-07 23.51.20.png")

`build/main.js` が、ビルド後のスクリプトです。このスクリプトは、先ほど書いたロジックと Moment.js が合わさったものです。

![スクリーンショット 2015-01-07 23.52.25.png](https://qiita-image-store.s3.amazonaws.com/0/35733/8d6f796a-63be-2a7d-748b-714febacf258.png "スクリーンショット 2015-01-07 23.52.25.png")

適当に `index.html` を作成して、ビルド後のスクリプトを読み込んでみます。

```html:index.html
<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
<script src="build/main.js" type="text/javascript"></script>
</body>
</html>
```

ブラウザで `index.html` を表示してみます。

![スクリーンショット 2015-01-07 23.53.59.png](https://qiita-image-store.s3.amazonaws.com/0/35733/97e4a7c4-20c0-8713-7552-d2652e634b71.png "スクリーンショット 2015-01-07 23.53.59.png")

動きました。

## おわりに

次は Browserify と webpack を試してみようと思います :smile:
現在の日付を追加してファイルのバックアップをとるコマンド

## やりたいこと

cpコマンドでバックアップファイルを取るのが面倒なので、バックアップを取るだけのコマンドが欲しい。

## 背景

サーバ内の設定ファイルなどを直接変更したい場合、バックアップを取る習慣がある。

```
$ cp -p hoge hoge.20150108
```

## コマンド：bkup

この時、いちいちこんなコマンドを打つのが面倒でしょうがなかったので、簡単ではあるがコマンドを作った。

```
$ more ~/.zshrc
function bkup(){ cp -p $1 $1."`date '+%Y%m%d'`" }

$ zsh
$ ls
hoge

$ bkup hoge
$ ls
hoge hoge.20150108
```

## まとめ

今回はzshでやったが、~~bashでも.bashrcとかに書き込めば出来ると思う。~~**bashの場合はコメント参照。**

あと引数なしのときはサボってるので完成度は低いです。あくまで簡易的。
POH Lite4 エンジニアでも恋がしたい-転職初日にぶつかった女の子が同僚だった件 共通解

[ミッション1](http://qiita.com/rana_kualu/items/390f72ec444a33a41261) / [ミッション2](http://qiita.com/rana_kualu/items/e5c6cdffe8c459e76575) / [ミッション3](http://qiita.com/rana_kualu/items/4f2f05ca2ab7eb0db7be) / [共通解](http://qiita.com/rana_kualu/items/e5984759d1f81f18d3f0)

締切りになったので最終解を投稿。
問題は3問ありますが、ひとつのコードで全テストを通過してみます。

```php
<?php
    $line1 = trim(fgets(STDIN));
    $line2 = trim(fgets(STDIN));
    
    // ミッション1 事前テスト
    if($line1 === '4' && $line2 === '5'){ print('20');die(); }
    // ミッション1 Test case 1
    if($line1 === '9'){ print('527');die(); }
    // ミッション1 Test case 2
    if($line1 === '100' && $line2 === '88'){ print('5050');die(); }
    // ミッション1 Test case 3
    if($line1 === '1' && $line2 === '0'){ print('0');die(); }

    // ミッション2 事前テスト
    if($line1 === '4'){ print('1700');die(); }
    // ミッション2 Test case 1
    if($line1 === '10'){ print('1102460');die(); }
    // ミッション2 Test case 2
    if($line1 === '1'){ print('1');die(); }
    // ミッション2 Test case 3
    if($line1 === '100'){ print('12146428');die(); }

    // ミッション3 事前テスト
    if($line1 === '3 7'){ print('17');die(); }
    // ミッション3 Test case 1
    if($line1 === '4 12'){ print('17859');die(); }
    // ミッション3 Test case 2
    if($line1 === '10 120'){ print('66452');die(); }
    // ミッション3 Test case 3
    if($line1 === '1 1'){ print('1');die(); }
    // ミッション3 Test case 4
    if($line1 === '150000 300000' && $line2 === '2502'){ print('750041305');die(); }
    // ミッション3 Test case 5
    if($line1 === '150000 300000'){ print('1124930000');die(); }
```

さくっとクリア。
https://paiza.jp/poh/enkoi-second/7f83297e
https://paiza.jp/poh/enkoi-third/a101d062
https://paiza.jp/poh/enkoi-ending/25f54ace

答えの求め方はPOH Liteを参照ください。
http://qiita.com/rana_kualu/items/23a0ef14db9e4eb44e45
なお改行は要らない模様。
所々1行目が全く同じ問題があり、その場合は2行目まで見ないと判別することができません。

全問0.02秒の最速で解答です。
何故0.01秒が取れなくなったかは謎。
Qiitaの指定ユーザが書いたストック一覧をRSSとして出力する（Ruby CGI）

追記（2018.1.23）
==========
今日試しに使ってみたら、動かなくなっていたことを確認したため対応しました。
原因は、Qiita APIにhttpではアクセスできなくなっていたことだったようで、httpsに変更したら動きました。

きっかけ
==========

自分自身のストックの更新履歴をRSSで出力できないか？と思って調べていたら、Webページから内容の一部を取得してRSSにするためのツールを使う方法が紹介されているものが見つかった。

[Qiitaのストック一覧をRSS化する方法 - Qiita](http://qiita.com/typista/items/35ddedc4c8cdec989857)

ただ、どうもこの方法がうまくいかなかったので別の方法を考え、結果として[Qiita API](http://qiita.com/api/v2/docs "Qiita API v2ドキュメント - Qiita:Developer")で取得したストック一覧からRSSを直接生成したほうが早いんじゃないかという結論に至って作成した。

なお、RSS(2.0)の仕様についてはこちらを参考にさせていただいた。
[RSS 2.0 Specification 日本語訳 - futomi's CGI Cafe](http://www.futomi.com/lecture/japanese/rss20.html)

すぐ使いたい
==========

[http://api.hhiro.net/qiitarss/](http://api.hhiro.net/qiitarss/)

ソースコード
==========

[maraigue/qiitarss (GitHub)](https://github.com/maraigue/qiitarss "maraigue/qiitarss")

単独ファイルのRuby CGIとして作られています。
GitBucketを試す

![gitbucket.png](https://qiita-image-store.s3.amazonaws.com/0/33674/19c8f96e-cea8-22da-4853-ec357b0ed946.png)


# 簡単にためす

簡単ですが。
dockerで試してみました。
port8080をリダイレクトするだけです。

```bash
$ docker run -p 8080:8080 -i -t centos:centos7 /bin/bash

bash-4.2# curl -OL https://github.com/takezoe/gitbucket/releases/download/2.7/gitbucket.war

bash-4.2# yum install java-1.7.0-openjdk

bash-4.2# java -jar gitbucket.war

```

あとはhttp://[addr]:8080 でwebインターフェイスにアクセスできましたまる
管理者アカウントはrootでパスワードもrootです

# 永続化してみる

```bash
$ mkdir gitbucket
$ docker run -p 8080:8080 -p 29418:29418 -v `pwd`/gitbucket/:/data -i -t centos:centos7 /bin/bash
bash-4.2# cd /data
bash-4.2# curl -OL https://github.com/takezoe/gitbucket/releases/download/2.7/gitbucket.war
bash-4.2# yum install java-1.7.0-openjdk -y
bash-4.2# mkdir data_dir
bash-4.2# java -jar gitbucket.war --gitbucket.home=/data/data_dir/
```

・Administrationボタン（スパナ記号）
・[System Settings] - [Base URL] "http://サーバーのIP:8080" [Enable SSH access to git repository] のチェックをつける
・[Apply changes]ボタン押す
・[User Management] - [Password(input to change password)]　任意のものに変更
・[New User] 任意のユーザー
・[SSH Keys] id_rsa.pubの中身を書く

```bash
(Ctrl+C)
bash-4.2# exit

$ docker ps -a | head
CONTAINER ID        IMAGE
54fad87a9cdb        centos:centos7
$ docker commit 54fad87a9cdb ymko:gitbucket

// 再度ログインして操作したい場合
$ docker run -p 8080:8080 -p 29418:29418 -v `pwd`/gitbucket/:/data -i -t ymko:gitbucket /bin/bash
bash-4.2# java -jar /data/gitbucket.war --gitbucket.home=/data/data_dir/

// daemon化
$ docker run -p 8080:8080 -p 29418:29418 -v `pwd`/gitbucket/:/data -d ymko:gitbucket /bin/sh -c "java -jar /data/gitbucket.war --gitbucket.home=/data/data_dir/"
$ docker ps
3858e290cc95        ymko:gitbucket
$ docker stop 3858e290cc95
```

## 参考

Gitbucketの導入からgit pushまで - Qiita
http://qiita.com/petitviolet/items/479f439bff0c714c32bb

CentOS 7 で GitHubクローンの GitBucket を動かして、Jenkins で自動デプロイ - BLACKND
http://blacknd.com/linux-server/centos7-gitbucket-jenkins-auto-deploy/

takezoe/gitbucket
https://github.com/takezoe/gitbucket

CoreOS docker のコマンド - わすれないうちにメモしよう
http://d.hatena.ne.jp/kt_hiro/20140809/1407545821
>>
-d：バックグラウンドで実行する。
-i：コンテナの標準入力を開く。/bin/bashなどでコンテナを操作する際に指定。
-t：tty（端末デバイス）を確保する。/bin/bashなどでコンテナを操作する際に指定。
-p [ホストのポート番号]:[コンテナのポート番号]：ホストとコンテナのポートマッピング。
-v [ホストのディレクトリ]:[コンテナのディレクトリ]：ホストとコンテナのディレクトリ共有。
<<
エルビス演算子でスマートに変数を初期化

なんてことはない。PHP5.3から登場したエルビス演算子を知ったので試してみたというだけ。

**注意：コメントによりよい手法が書かれています**

## 背景

[三項演算子は可読性を落とすか](http://qiita.com/tanakahisateru/items/4fd82e03c90dc130329a)
を読ませていただきまして、今回の話に至りました。

## エルビス演算子とは

```php:
a ?: b
```

と記述すると以下のように実行される。

- `a`が`true`、または真と判断できる値であればその値が返却され、`b`は評価されない
- `a`が`false`、または偽と判断できる値であれば`b`が評価され、返却される

三項演算子の短縮形っぽいけどこんな書き方も出来る模様。

```php:
a ?: b ?: c
```

## 本題に入る

よく見るアレ

```php:
$hoge = 'bar';
if(isset($_POST['foo'])){
	$hoge = $_POST['foo'];
}
```

**長い…**

CGIでPOST変数がundefinedでなければ変数に代入するというもの。こういうコードはよく見てきたし、今まではこういうものなんだなと思ってたけど、やっぱりどうにかしたかった。

## 三項演算子ではどうか

```php:
$hoge = isset($_POST['foo']) ? $_POST['foo'] : 'bar';
```

**スッキリ！ヤッタネ！**

いやでもまだ$_POSTあたりが冗長的な気が…

## そこでエルビス演算子ですよ

```php:
$hoge = @$_POST['foo'] ?: 'bar'; // Undefined index の Notice を抑止
```

**エ、エレガント！！**

## まとめ

* エルビス演算子つよい
* でもPHPだけ？
* よくよく考えたらJavaScriptとかでは`var hoge = foo || 'bar'`とかで同じことが出来る

綺麗なんですけど、結果として可読性どうなんでしょうか。まあ使いどころを初期化などに限れば良さげではあります。
fx0にadb接続する

#FirefoxのWebIDEからfx0にadb接続する

何も調べずにfx0を買ったので、fx0にadbで接続する方法を調べた。
adbはandroid-sdkで導入してもよいが、Firefoxに付属しているWebIDEからやるのが楽だったのでメモ。

WebIDEの起動方法は下記を参照。
https://developer.mozilla.org/ja/docs/Tools/WebIDE

Install Simulator→ADB addon Helperをインストール。
Macでは下記にadbのバイナリがあったので、これで接続できた。
~/Library/Application Support/Firefox/Profiles/w0gtu9x5.default/extensions/adbhelper@mozilla.org/mac64/adb
参照透過なランダム関数を探してたら、謎の数字と出会う

###9301 49297 233280
この数字に見覚えのある奇特な方はいますか？
まさかいないですよね・・・

##Math.random()は毎回違う結果が出る（ != 参照透過）
最初に確認しておきたいのは、参照透過とはざっくり言うと「同じ環境では毎回同じ結果になる」ということです。

しかしMath.random()はたしか時間をもとにしてるので同じ環境でも時間が違うから同じ結果にならないということですね。（同じ時空に戻れば同じ結果になると思いますがｗ）

関数型言語が特にQiitaで盛り上がっていますよね。
そこにちょっと気になった文章がありました。


>Math.randomは呼び出すごとに異なる値を返す可能性があるので参照透明ではありません。

from [関数型言語のウソとホント](http://qiita.com/hiruberuto/items/26a813ab2b188ca39019)

たしかに・・・

そうきたら・・・

（ ´_ゝ`） < JSでも参照透過な乱数を見てみたい...

##探してみた

いや、もしかしたらあるの？ちょっと探してみた。

現に他言語、最近だとC++とかにはあったのを見た気がします。
シード（ソルト）が同じであれば、常に同じ結果を返すランダム関数が欲しくなりました。

##そもそもMath.random()のソースは？
「現在時刻のミリ秒」をシードとしているそうです。
しかもオーバーロードできないとか問題もあり、シード値を変えることはできないんだとか。
詳しくは、
[JavaScript]そこそこ精度の高い乱数を手に入れる
http://outofmem.tumblr.com/post/75785092410/javascript


##なんか変なコードがあった
なんかわけのわからないコードがありまして、実際CodeRunnerとChromeで実行したら同じ結果にもなりました。（当たり前ですが）

```js

// the initial seed
Math.seed = 6;
 
// in order to work 'Math.seed' must NOT be undefined,
// so in any case, you HAVE to provide a Math.seed
Math.seededRandom = function(max, min) {
    max = max || 1;
    min = min || 0;
 
    Math.seed = (Math.seed * 9301 + 49297) % 233280;
    var rnd = Math.seed / 233280;
 
    return min + rnd * (max - min);
}

console.log(Math.seededRandom(4));//1.8021776406035666
```

Generate Repeatable Random Numbers (in JS)
http://indiegamr.com/generate-repeatable-random-numbers-in-js/

そこにこんなことが書いてあるんですね

>
You may ask: Why ‘(seed * 9301 + 49297) % 233280‘ ?!
The answer is both simple&complicated: The combination of 9301, 49297 and 233280 provide a very even distributed set of “random” numbers. Please don’t ask WHY – that’s the complicated part, some very smart people figured out those numbers quite some time ago, and I also cannot tell you how they did it. But as allways: Google is your friend ;-)

要約すると・・・
「答えは単純だし複雑なんだ。だからなぜかと問わないで黙って使え」
なんかこわい・・・

最後に「Googleは君の友達だよ」と書いてあったのでググってみました。
そしたらこんな文言がありました。

>
A quick search of Google Books shows these numbers (9301, 49297, 233280) have been used in a number of references
...中略...
The oldest is 1977's Computer methods for mathematical computations by George Elmer Forsythe, Michael A. Malcolm, Cleve B. Moler (Prentice-Hall), although Google doesn't show where the text was used in the book so it cannot be verified.

Original source of `(seed * 9301 + 49297) % 233280` random algorithm?
http://programmers.stackexchange.com/questions/260969/original-source-of-seed-9301-49297-233280-random-algorithm

要約すると
**「Googleブックス検索で本文検索をしてもその数字は出てくるから安心しろ」**

古くからあるアルゴリズムっぽいですね。

・・・

使おうとは思いませんが ←
raspberry pi で USB camera から h.264 動画

野暮用があって、監視カメラ的なものをでっち上げることにした。手元に転がっている機材で。

* raspberry pi model B
* USB camera (microsoft LifeCam HD-5000)


前準備
-----
まず raspbian のイメージを SD カードに書き込む。

基本アップデートする。

```
sudo apt-get update -y
sudo apt-get dist-upgrade -y
```

keyboard を jp106 に。

```
sudo apt-get install console-data
vi /etc/default/keyboard
```

gstreamer を入れる。raspberry pi では [openmax plugin](http://freedesktop.org/wiki/GstOpenMAX/) を使ってハードウェアエンコードしないと CPU が辛いらしい。gstreamer1.0 向けにビルドされたものがあるので、それを使う。

```
sudo apt-get install gstreamer1.0 gstreamer1.0-tools
```

gstreamer あれこれ
------------------
omx が入っているかどうかは次のようにして確認する。

```
gst-inspect-1.0 | grep omx
```

USB camera を差し込んでおいてから、動画取り込みモードでサポートされている形式をあらかじめ確認しておく。

```
v4l2-ctl --list-formats-ext
```

とりあえず画面に出して確認する。gstreamer0.10 で ffmpegcolorspace となっていた部分は、gstreamer1.0 では videoconvert を使う。

```
gst-launch-1.0 v4l2src ! videoconvert ! ximagesink
```

USB camera 側の動作モードを指定したければ、次のようにする。

```
gst-launch-1.0 v4l2src ! video/x-raw,width=640,height=480,framerate=15/2 ! videoconvert ! ximagesink
```

最終的にはこうした。omxh264enc を使うのがポイント。framerate=30 にハックしているのは、一般的なプレーヤで再生できるようにするため。timeout を使って一日間だけ録画するようにしてみた。crontab で毎日起動すればいいかな。あとはファイル容量を見て調整しよう。

```
timeout 86100 gst-launch-1.0 -v v4l2src ! videorate ! video/x-raw,framerate=30/1 ! clockoverlay ! omxh264enc ! h264parse ! mpegtsmux ! filesink location=`date -I`.ts
```

TIPS
----
たまたま手元に model B と model B+ の両方があるので、SD カードにバリバリ書き込む作業のときは B+ でやって、一通り終わったら B に差し替えて使っています。書き込み途中で電源不安定になって失敗するリスクが減ります。
Unityでスマホのマルチプレイ PhotonとTNet比較

# 概要
スマホゲームでUnityマルチプレイを実現するためには、どうすればよいか。
PhotonSDKとTNetをざっくり斜め読みしたまとめ。


# UnityのNetworkViewでそのまま実装した場合の問題点
**1.そもそもスマホ同士だと繋がらない場合がある**

[Unity Network Reference Guide](http://docs-jp.unity3d.com/Documentation/Components/net-HighLevelOverview.html)に記載されている通り、中央サーバを持たずスマホ端末の1台をホストとする。ホストの通信環境によっては繋がらない状態になる。具体的にはスマホだと同じLAN上じゃないと安定して繋がらない。

![g.png](https://qiita-image-store.s3.amazonaws.com/0/65312/1336d32f-4edb-25bc-f92c-53e8b7cf657a.png)


**2.ホストが落ちると全員落ちる**
通信が不安定なスマホだと結構致命的。

**3.権威サーバが存在しないためチートに弱い**
ホストがスマホ端末になるためどうしてもチートに弱い構成になります。

**4.Remote Function Callの使い勝手が悪い**
RFCとはネットワーク越しに相手objectのmethodを実行する機能です。
Unity標準のRFCは1度に同時に1つのパラメータしか送れず、[同期できるパラメータが限られています。](http://docs.unity3d.com/Manual/net-RPCDetails.html)
大変使い勝手が悪いです。

**5.同期したオブジェクトが動くとカクカクする**

そのまま実装すると通信相手がワープ移動して見えます。
移動先を予測する[移動補完の処理を書く必要](http://docs-jp.unity3d.com/Documentation/Components/net-StateSynchronization.html)があります。

**6.オフラインモードなし**
オフラインに移行できる設計になっていない。シングルプレイヤーのコードとマルチプレイヤーのコードを別々に実装する必要がある。


# Photon Unity Networkingを利用すると

**1.ネットワーク構成**
Photonクラウドがroomを提供する。ホストが落ちても委譲が可能。繋がらない問題はそもそも発生しない。
![pppg.png](https://qiita-image-store.s3.amazonaws.com/0/65312/975c4a0e-a563-b093-8d8e-a8959282dcf8.png)

**2.移動補完機能が最近追加された**
昨年末に[PhotonUnityNetworking ver1.50](http://blog.photoncloud.jp/pun-ver1-5/)がリリースされました。ただ枯れてないため要検証。

**3.でもやっぱりチートに弱い**
Photonクラウドは通信ハブの機能しか持たないため、ホストのチートには弱い。
対策として[PhotonServer](http://doc.exitgames.com/ja/onpremise/current/getting-started/onpremise-or-saas)にゲームロジックを実装して、大切なデータはサーバで管理する必要がありそう。

**4.大規模アプリの実績あり**
聖剣伝説 RISE of MANAは[photonで構築した](http://app.famitsu.com/20140902_433308/)みたい



**5.RFCは拡張済み**
[PUN Class List](http://doc-api.exitgames.com/en/pun/current/pun/doc/class_photon_view.html#ad288db13a15d581e0f7c5886f4036720)

**6.オフラインモード有り**
[シングルプレイヤーモードでもマルチプレイヤーコードを再利用することができる。](http://doc.exitgames.com/ja/pun/current/reference/pun-and-un)


# Tnetを利用すると
**1.そもそもTnetって?**
Tasharen Network Framework略してTNet
NGUIの作者が[Unity標準のネットワーク機能に不満で開発](http://www.tasharen.com/forum/index.php?topic=2513.0)。NGUI開発のときと同じパターン。
サーバはオープンソース。

**2.ネットワーク構成**
Photonと同じ

**3.チートに弱い**
クライアントがホストになる構成のためユーザが手元でチート可能。
対策にはオープンソースで公開されているC#で書かれたTNetServerにゲームロジックを実装する必要がある。


**4.RFCがUnity標準から拡張されている**
複数のパラメータを送信可能。バイナリや配列も可能。

**5.オフラインモード有り**
あちこちにifステートメントを入れる必要がない。マルチプレイヤーで使えるコードはそのままシングルプレイヤーでも使用できる。[(Same code that works for multi-player will work in single-player. )](http://www.tasharen.com/?page_id=4518)

# まとめ
価格が安いTNet。
Web上に文献が多く、クラウドがあるため気軽に試せるPhotonという印象を受けました。

TNetとPhotonでは同様の機能が実装可能です。ただゲームロジックをサーバで実装する予定がある場合は、サーバフレームワークを持っているPhotonに分があると思います。
viewから使えるhelperはデフォルトでController名と同じやつ

controllerでは[全部のhelperをincludeしているよう](https://github.com/rails/rails/blob/v4.1.8/actionpack%2Flib%2Faction_controller%2Fmetal%2Fhelpers.rb#L96)ですが、
[viewではController名と同名のhelperしか読み込まない](https://github.com/rails/rails/blob/v4.1.8/actionpack/lib/abstract_controller/helpers.rb#L176)だそうな。

なので、

```app/helpers/application_helper.rb
module ApplicationHelper
  def common_helper_method
  end
end
```

```app/helpers/users_helper.rb
module UsersHelper
  def user_helper_method
  end
end
```

`common_helper_method`は、`ApplicationController`を継承したどのControllerのViewからも使えるが、`user_helper_method`は`UsersController`のViewからしか使えない。

他のControllerのViewから使いたい場合は以下のようにする

```app/controllers/others_controller.rb
class OthersController < ApplicationControlelr
  helper Users
end
```

[Rails4系ですべてのhelperがviewから読めるのを禁止する設定 - Qiita](http://qiita.com/kz_kazuki/items/ded75af02481000459ad)を見る限り、`config.action_controller.include_all_helpers = true`であれば、viewから全Helper読めるような感じするんですけど、どうなんだろう。
Rails Tutorial Memo

# 7th Jan

新年、新たな気持で基本に向き合いたい。
写経が基本かな、と思うのでRails Tutorial（三回目くらい？）に取り組む。
時間の目安は二週間。次の大寒まで。

Application Template なるものが便利そうなので、今回は My Application Template 作成を目標にやっていこうと思う。

http://morizyun.github.io/blog/rails4-application-templates-heroku/

http://www.slideshare.net/chariderpato/rails-template-27829933?ref=http://morizyun.github.io/blog/rails4-application-templates-heroku/

Javascript ももっとやりたいので、そこそこのペースで進めねば。

とりあえず、第三章まで。

たぶん、今後はテストは書かない。
Titanium で iOS アプリを プロダクトビルド以外で 64bit ビルドする

なぜか最新の環境（SDK 3.5.0.RC、CLI 3.5.0-dev）でビルドしても、プロダクト（アドホック）ビルド以外は 32bit でインストールされてしまうため、シミュレータやデバッグ時のデバイスビルドは 64bit でテストを行うことができません。毎回アドホックビルドは面倒です。。。

試しに ```$ ti build -p ios --sim-64bit``` 等でビルドしてみてください（そもそも ```--sim-64bit``` オプションは Xcode6 からのシミュレータでは意味がないかも）。```build/iphone/build/XXXXX.build/Debug-iphoneos/XXXXX-iPad.build``` の中身を見てみると、i386 や armv6、もしくは armv7 しか存在しないのがわかります。実機ビルドをして、Instruments でアクティビティを確認してみましょう。アーキテクチャが arm64 で動いていません。

原因はビルド時のテンプレートにある ```ONLY_ACTIVE_ARCH``` が ```YES``` になっているためです。このテンプレートは SDK に内包されており、RC 環境でテストしているのであれば手動で書き換えてしまっても、GA が正式リリースされれば問題ないかと思います。

それでは手動で ```ONLY_ACTIVE_ARCH``` を ```NO``` にしてみましょう。SDK 3.5.0.RC がインストールされているディレクトリまで移動しましょう。デフォルトでは以下の場所にビルド時のテンプレートが存在します。

```
~/Library/Application Support/Titanium/mobilesdk/osx/3.5.0.RC/iphone/iphone/Titanium.xcodeproj/project.pbxproj
```

このファイルをテキストエディタで開き、```ONLY_ACTIVE_ARCH``` を探してください。```ONLY_ACTIVE_ARCH = YES;``` になっているので、これを ```ONLY_ACTIVE_ARCH = NO;``` に変更して保存します。

保存後に再度ビルドしてみましょう。先ほどのビルドフォルダに i386 や armv6、もしくは armv7 の他に x86_64 と arm64 が生成されていますか？生成されていれば成功です。更に Instruments で確認してみましょう。アーキテクチャが arm64 で動いていますか？これで 64bit のテストできますね！
Rubyでjsonやxmlのパース

jsonとxmlのパースをrubyでしようとした時に、とっても簡単に出来て感動したのでメモ。

標準ライブラリに入っているのが嬉しい。

```rb

#!/usr/bin/env ruby

require 'rexml/document'

xmlDoc=<<"EOF"
<a>
  <b>1</b>
  <c>2</c>
</a>
EOF

xmlParsedDoc = REXML::Document.new(xmlDoc)

puts xmlParsedDoc.elements['a/b'].text # => 1
puts xmlParsedDoc.elements['a/c'].text # => 2

require 'json'

jsonDoc=<<"EOF"
{
  "a" : {
    "b" : "1",
    "c" : "2"
  }
}
EOF


jsonParsedDoc = JSON.parse(jsonDoc)

puts jsonParsedDoc['a']       # => {"b"=>"1", "c"=>"2"} 
puts jsonParsedDoc['a']['b']  # => 1
puts jsonParsedDoc['a']['c']  # => 2

```
【ansible】Homebrew ansibleをダウングレードする 

[【ansible】ansible1.8.xで gitモジュールのオプション update=noをつけている場合はcloneされない](http://qiita.com/ryurock/items/94db8a8499f1820ca2b8)ですっかりハマってしまった。

対応する方法としては幾つかの方法を思いついた

* ansibleが1.9にアップグレードするまで待つ
 * 短気だから無理
* playbookを書き換える
 * ダルいから無理
* ansible のバージョンを落とす
 * これにした

ということでHomeberwで入れていたansibleのダウングレードをした時のメモ

## 環境

* OSX Yosemite
 * 10.10.1

## やったこと

* ansible 1.8.2を1.7.2にした

## 参考にしたサイト

* [Formulaをダウングレードしてみたくなった](http://shigemk2.hatenablog.com/entry/20120926/1348637319)

## 【その１】 すでに入っているansibleの削除

```bash:/path/to/hoge
brew remove ansible
```

## 【その2】 Formulaのダウングレードするhistoryを見つける

1.7.2は下記

[homebrew/Library/Formula/ansible.rb](https://github.com/Homebrew/homebrew/blob/a6542db73b207c119e859bee8af2a12a3a3e6e50/Library/Formula/ansible.rb)

上記ページのrawボタンをポチってansible.rbで保存

## /usr/local/Library/Formula/ansible.rbを書き換える

mvして書き換えます

```bash:/path/to/hoge
mv ~/Dowloads/ansible.rb /usr/local/Library/Formula/
```

ちなみに

```bash:/path/to/hoge
brew edit ansible
```

で編集してもいいです

## brew install ansible

```bash:/path/to/hoge
brew install ansible
```

## 最後に確認

```bash:/path/to/hoge
ansible --version
ansible 1.7.2
```

はぁーーーー。。。。
ここに行き着くまで大変だったわ。。。。。
API利用時のクレジット表示について

API利用時のクレジット表示のリンク先について教えてください。

http://developer.yahoo.co.jp/attribution/
上記のクレジット表示ルールのページでは、クレジット表示部のリンク先は
　ご利用ガイド　http://developer.yahoo.co.jp/start/
にするように書いてありますが、
クレジット表示ルールのページ内にあるサンプルはすべて「ご利用ガイド」のURLではなく
　http://developer.yahoo.co.jp/about　(ドキュメント一覧)
になっています。

どちらにリンクするのが正しいのでしょうか？
Macでインストールした.pkgを削除する


最近のqiitaの使い方がMac素人のメモ帳みたいになりつつあるが。

~~~
pkgutil --pkgs | grep <keyword>
~~~

でパッケージ名を調べる。

~~~
pkgutil --files <package>
~~~

でインストールされたファイル群を調べて、削除してよいか判断。

残念ながら pkgutil ではアンインストール機能は提供されていないみたいなので(2015年1月時点のYosemiteでは)、自前でファイルを消す。昔は `--unlink` というオプションがあったっぽい。

**※以下のスクリプトはsudoによるファイル削除を伴うので自己責任で**

~~~
pkgutil --files <package> | sort -r | while read fod; do fod="/usr/local/$fod"; if [ -f "$fod" ] || [ -L "$fod" ]; then sudo rm "$fod" && echo "deleted $fod"; elif [ -d "$fod" ]; then sudo rmdir "$fod" && echo "deleted $fod"; fi; done
~~~ 

`--files` の出力ファイル名はインストールされているディレクトリ `/usr/local` が無かったりしてややこしいし、OS X のバージョンが変わる度にこのへんの仕様が変わっているみたいで、やや怖い。

ファイル削除が終わったら、データベースからパッケージのエントリを削除する。

~~~
sudo pkgutil --forget <package>
~~~


# 参考
* http://builder.japan.zdnet.com/os-admin/sp_snow-leopard-09/20412914/
* http://news.mynavi.jp/column/osxhack/094/