OmniAICreator/Qiita-1.07M huggingface dataset:
Bootstrap3: フォーム項目を水平方向に並べる


## やりたいこと

### djang-bootstrap3

- [django-filter](https://django-filter.readthedocs.org/en/latest/index.html)のフォームアイテムを [django-bootstrap3](https://github.com/dyve/django-bootstrap3)で整形
- grad_year は MultiWidget/RangeWidget
- eraはRadioSelect

~~~html
{% load bootstrap3 %}
{% bootstrap_field filter.form.grad_year %}
{% bootstrap_field filter.form.era %}  
~~~

### よくない

![](https://github.com/hdknr/scriptogr.am/blob/e345d9840903683d6015e5d8a17f568c7aa7736f/django/bootstrap3.input.horizontal.bad.png?raw=true)

### こうしたい

![](https://github.com/hdknr/scriptogr.am/blob/e345d9840903683d6015e5d8a17f568c7aa7736f/django/bootstrap3.input.horizontal.good.png?raw=true)


## RadioSelect : jQueryでclassを変える

- `radio` -> `radio-inline` に修正

~~~js
  $("#id_era").children('div.radio').each(function(i){
    $(this).addClass('radio-inline'); 
    $(this).removeClass('radio'); 
  });
~~~


## MultiWidget は置き換える

### BootstrapRangeWidget

-  input のclassのデフォルトを `form-control` に
- レンダリングの修正
- 単純に `-` で連結したたものを `span.input-group-addon` でラップして連結する
- 全体を `div.input-group` でラップする
- あとはbootstrap3 に任せる

~~~py
from django import (forms, template) 

class BootstrapRangeWidget(forms.MultiWidget):
    def __init__(self, attrs={'class': 'form-control'}):
        widgets = (forms.TextInput(attrs=attrs), forms.TextInput(attrs=attrs))
        super(BootstrapRangeWidget, self).__init__(widgets, attrs)

    def decompress(self, value):
        if value:
            return [value.start, value.stop]
        return [None, None]

    def format_output(self, rendered_widgets):
        return template.Template('''
        <div class="input-group">
        {{w.0}} <span class="input-group-addon">-</span> {{ w.1 }}
        </div>
        ''').render(template.Context(
            dict(w=rendered_widgets, c=self)))
~~~

### フィルターにWidgetを指定

~~~py
import django_filters

class AlumnusFilter(django_filters.FilterSet):                                         
    grad_year = django_filters.RangeFilter(widget=BootstrapRangeWidget,)  
    ....
~~~
配布物にOAuth2で利用するclient_secretを含むことのリスク

## 突然のメール

AtomでGmailにOAuth2でアクセスするためのパッケージのソースに`client_secret.json`をつけていることについて、「i saw what might be some private credentials.」なるメールが届いたのが数日前。
英語に詳しくないのだが、多分「プライベートな認証情報が丸見えやで。」っていう意味に取れる。

配布前にも少し悩んだのだが、もう一度client_secret.jsonを配布物に含むことで発生するリスクと考えられる対応方法などを素人なりにまとめてみて、識者からの教えを請いたいと思う。

## client_secretを悪用されてのリスク

### client_secretの乗っ取り

まずすぐに思いつくのがこれ。

同じような名前のパッケージを作り、Scopeとソースの一部を書き換えれば例えばユーザーのメール全てを読み書きすることが出来ると思われる。
この場合はソース配布者には損害がない(悪いうわさが広まって信用が無くなる可能性はある)が、ユーザーの個人情報が漏れてしまう。

でも、ユーザーの個人情報が漏れてしまうってのは乗っ取りに関係なく、信用しないプログラムは利用しないという常識(まあ、個人的にも拡張機能の類は検証なしに入れてしまうから常識とはいえだれも意識してないかもしれない)からみるとユーザーの責任になるのではないかと思われる。
そもそも、Googleからの認証の時にパーミッションが表示されているのでユーザーは開示に合意したことになるだろうし。

### 利用回数制限の回数が減る

ほかでも同じclient_secretが使われると利用回数が割増しになってしまうので、上限に引っかかる可能性が高くなる。
ユーザーには関係なさそうだが、利用者が増えてきた時はユーザーが利用できなくなるおそれがある。

とはいえ、Gmailの場合は `1,000,000,000 ユニット数/日` なので、初期設定(一分間隔)で使ってもらえば、およそ70万人の利用者にならないと問題は無い。ってことは同じような使い方をされてもほとんど問題ないよね。

### デベロッパーコンソールの情報信頼性の低下

低下するというのが適切かどうかわからないけど、そのclient_secretを利用してのアクセス数を確認できるデベロッパーコンソールの情報が割増しされることになる。

まあこれについてもあんまり気にしなくてもいいかもしれない。本当に情報が欲しかったらGoogleAnalyticsなどを使うと思うし。
で、どのWebページのソースを見ても最後に載ってるコピーできるUA-なんちゃらと同じ位に考えて良さそう。



その他にはリスクあるのだろうか？

## 対応方法は？

いちおう 「[Re: OAuth 2.0のclient_secretって本当に秘密鍵ですか？](http://oauth.jp/blog/2012/08/03/re-oauth-20clientsecret/) 」あたりも読んではいるのだが、実のところは不勉強でどう対応したほうがいいのかが分からない。

 - client_secretなんて実際はSecretなんかじゃないんだから気にしないで今の方法でもいいんじゃ？
 - やっぱりclient_secretの配布は気持ち悪いので止めるべき。例えば利用者に個人でclient_secret.jsonを準備させればいいんじゃない？
 - ちょっと使われたくらいは気にならないけど、念のため定期的にclient_secret.jsonを更新してバージョンアップしたらいいんじゃないの(ユーザー側で再認証の手間が増えるけど)？
 - Golangあたりで作ったWin,Mac,Linux用のバイナリを添付してそこで認証の処理させたら少しはマシなんじゃないの？開発の手間は増えるけど。

とかの対応が考えられるのだが、どうしたら良いものなんだろう。

ちなみに、実装にあたっては [Gmail API - Node.js Quickstart](https://developers.google.com/gmail/api/quickstart/nodejs) を参考に実装しているので処理内容には問題ないと思われるが、やはりサーバーサイドのNode.js用サンプルをクライアント用のAtomに利用するのは間違いだったのだろうか。

### 追記1（Client-sideアプリケーションパターンの場合に方向性を変えて検討してみる）

サーバーサイド側の実装例をクライアントサイド側に実装するから問題があるのかと思い [Using OAuth 2.0 for Client-side Applications](https://developers.google.com/identity/protocols/OAuth2UserAgent) を検討してみた。

確かにこの方法だと `client_secret` は不要になるが、`client_id` は必ず必要になる(当たり前だが)。
ここで、 `client_secret` の代わりになるのがリダイレクトURLなのだとおもうのだが、クライアントで完結するようなプログラムでは `localhost` しか選択肢は無いと思われる。そうすると `client_secret` が丸見え状態と状態はほとんど変わらないように思える。

例えばHerokuあたりに実装したWebアプリケーションを一枚噛ましてそこからlocalhostへ再度リダイレクトさせるのが正しい実装方法ということになるのかな。うーんちょっと面倒なぁ。仕方ないことなのかなぁ。

ちなみに、Stackoverflowの [Can I really not ship open source with Client ID? [closed]](http://stackoverflow.com/questions/27585412/can-i-really-not-ship-open-source-with-client-id) でも議論されてるようだが、英語でもう一つよくわからない。

### 追記2（Client-sideアプリケーションパターンを実装してみた）

「[OSSのクライアントインストール型プログラム(Atom用パッケージ)でOAuth2をなるべく安全に利用する](http://qiita.com/nobuhito/items/fdde76ff0b951da34dd0)」 で実装してみました。
Typescriptのletとconstメモ


Typescriptでは、変数の定義にlet（ブロックスコープ）と、const（定数）を使用することができます。

##let
varと同じように使用します。

```lang:Typescript
let a = 'イエス ブロック！';
```

letを使用すると、関数外でもスコープを分けることができます。
下記のようにletを使用すると、ブロックの中と外で同じ変数名でもスコープを分けてくれます。

```lang:Typescript
let a = 'イエス ブロック！';
var b = 'ノー　ブロック！';

if(true){
	let a = 'YES BLOCK！';
	var b = 'NO BLOCK！';
	console.log(a);//YES BLOCK！
	console.log(b);//NO BLOCK！
}

console.log(a);//イエス ブロック！
console.log(b);//NO BLOCK！
```

##const
varと同じように使用します。

```lang:Typescript
const a = '定数だよ。書き換えないでね！';
```

下記のようにconstを書き換えようとするとSyntaxErrorとなります。

```lang:Typescript
const a = '定数だよ。書き換えないでね！';
a = '書き換えてやる！';//エラーになります。
```

また、constもletと同じくブロック単位でスコープを分けてくれます。

```lang:Typescript
const a = '定数だよ。書き換えないでね！';
if(true){
const a = 'YES CONST!';
console.log(a);//YES CONST!
}
console.log(a);//定数だよ。書き換えないでね！
```
Ruby i18nのyamlでキー名にドットを使いたい

# RailsでのRuby i18n
i18n、便利ですよね。

ビュー内でこうやって、

```haml
= t "hoge.fuga.title"
```

あるいはこうやって、

```rb
I18n.t :title, scope: [:hoge, :moge]
```

こんなYAMLを用意すれば

```yaml:en.yml
en:
  hoge:
    fuga:
      title: "TITLE"
```
```yaml:ja.yml
ja:
  hoge:
    fuga:
      title: "タイトル"
```

ばっちり置き換えてくれます。

多言語対応だけでなく、
単純にテキストとサイト構成を疎結合にする為に使っても良いです。

# ネストした要素の参照

上で例示しましたが、ネストした要素を参照するには2通りの方法があります。
1つは、

```rb
I18n.t "hoge.fuga.title"
```

のように1つの文字列にしてドットで区切るやり方で、もう1つが、

```rb
I18n.t :title, scope: [:hoge, :fuga]
```

と、`scope`と要素名の配列とを使った方法です。

ちなみに、これらは混ぜて使う事もでき、
またシンボルでも文字列でも引数に取ります。

```rb:全て有効
I18n.t :"hoge.fuga.title"
I18n.t "title", scope: [:"hoge.fuga"]
I18n.t :title, scope: %w(hoge fuga)
I18n.t "fuga.title", scope: [:hoge]
I18n.t :"fuga.title", :scope => ["hoge"]
```

ドットで区切られた単語を階層として扱っているんですね。

# キー名にドットを使いたい

さて、本題です。
次のコードはYAMLのどの箇所の要素を参照するでしょうか？

```rb
name = "Mr.Smith"
render json: { name: I18n.t("hoge.fuga.#{name}") }
```

これは式展開されて`"hoge.fuga.Mr.Smith"`という文字列になりますので当然、

```yaml
hoge:
  fuga:
    Mr:
      Smith: "..."
```

という要素を参照しに行きます。
……多分求めているものと違いますね。
おそらく実際のYAMLは、

```yaml
hoge:
  fuga:
    Mr.Smith: "スミスさん"
```

こんな感じでしょう。

YAMLのキー名にドットが入っている場合、そのキー名を引数に含めても、
`I18n.t`メソッドがそれを区切りとして判断してしまうので、
意図したものと違う場所を参照してしまうという事ですね。

そこでこういう希望が出てきます。
**Ruby i18nのyamlでキー名にドットを使いたい**

# separatorを変えよう

いきなり結論ですが、これが手っ取り早そうです。
separatorをデフォルトのドットから変えてしまえば良いのです。

```rb
name = "Mr.Smith"
render json: { name: I18n.t(name.intern, scope: [:hoge, :fuga], separator: "\001") }
```

これで、ドットは区切りとして扱われなくなる為、
Mr.Smithも分割されません。良かった。

`"\001"`というのはCtrl-Aで入力できる区切り文字の一種だそうです。
正確に述べると、所謂ASCIIの制御文字で、「ヘッディング開始」を表します。
「ここから読み取り始めるよ」というくらいの意味でしょうか。
キー名に使われている可能性は（少なくともドットよりは）低いでしょう。

ちなみにこの`\001`も勿論そのまま区切り文字として使えます。

```rb
I18n.t "hoge\001fuga\001Mr.Smith", separator: "\001"
```

区切り文字は何にしても良いので、

```rb
I18n.t "hoge*fuga*Mr.Smith", separator: "*"
```

とかでも良いわけです。キー名にアスタリスクが入り込んで来なければ。
また、こんなこともできます。

```rb
I18n.t "hoge fuga Mr.Smith", separator: " "
```

特段理由が無ければデフォルトのままで使い、必要ならば、
見やすくて、バグを起こし難いものを選ぶのがいいでしょう。
と、無難にまとめておきます。

勿論デフォルトの区切り文字も変えられます。

```rb
I18n::Config.default_separator = "\001"
```

# 参考（てか参照）

[i18n](https://github.com/svenfuchs/i18n)
Mithril.js + MaterialDesignLiteでメニューバーを作る


# やりたいこと

http://www.getmdl.io/components/index.html#menus-section
これをSPAの上部メニューに固定して使いたい。

# バージョン

* Mithril.js 0.2.0
* MaterialDesignLite 1.0.4


# View構成
※モデル部分は割愛。

ナビゲーション部分をコンポーネントとして定義する。



``` javascript:ナビゲーションバーコンポーネント
var NavBar = {
  controller: function(args) {
  var self = this;
  this.current = args.page;
  },
  view: function(ctrl) {
    return m("div",{
      class: "bar"
    }, [
      m("button", {
        class: "mdl-button mdl-js-button mdl-button--icon",
        id: "menu-button"
        }, [
        m("i", {class: "material-icons"},  "more_vert")
      ]
      ),
      m("ul", {class: "mdl-menu mdl-menu--bottom-left mdl-js-menu mdl-js-ripple-effect", for:"menu-button", style: "width:100px;"}, [
        m("li",
          {class: "mdl-menu__item"},
          [
            m("a", {href: "/", config: m.route}, "main")
          ]
        ),
        m("li",
          {class: "mdl-menu__item"},
          [
            m("a", {href: "/detail", config: m.route}, "detail")
          ]
        )
      ]
      )
    ]);
  }
};
```

各ページ用コンポーネントを用意する。
コンポーネントをネストして各コンポーネントにNavbarコンポーネントを持たせる。

``` javascript:メインページコンポーネント
var MainView = {
  controller: function() {

  },
  view: function(ctrl) {
    return m("div", {id:"main-view-main"}, [
      m.component(NavBar, {page:"main"}),
      m.component(MainContent)
    ]);
  }
};
```

``` javascript:詳細ページコンポーネント
var DetailView = {
  controller: function() {

  },
  view: function(ctrl) {
    return m("div", {id:"detail-view-main"}, [
      m.component(NavBar, {page:"detail"}),
      m.component(DetailContent)
    ]);
  }
};
```

ラウターの定義は下記のように。

```javascript:ラウター定義部分
m.route.mode = "pathname";
m.route(document.body, "/", {
  "/": MainView,
  "/detail": DetailView
}
);
```

# 事象

ファーストビューではメニューがちゃんと出てくるが、画面遷移した先ではメニューが動作しない。

# 原因と解決策

ラウターによる遷移でロードがかからないと、MDLに遷移後のDOMが認識されずに動作しなくなってしまう。
なので、MaterialDesignLiteのcomponentHandler.upgradeDom()がNavbarコンポーネントの再描画時に呼ばれるように、config擬似属性に定義する。

``` javascript:ナビゲーションバーコンポーネント抜粋
  view: function(ctrl) {
    return m("div",{
      class: "bar",
      config: function(element, isInitialized, context) {
        componentHandler.upgradeDom();// 再描画時にMDLのcomponent設定を更新する
      }
    }, [

```

config擬似属性の追加で無事にメニューが遷移後も機能するようになりました。
Laravelで詰まったこと（初心者）

# formからポストしようとしたら"MethodNotAllowedHttpException"

updateするときはputでないと動かない。
`Form::open`のところに`'method' => 'put'`を入れればOK.

# ページネーションが上手く動かない
Laravel5のバグっぽい。
paginate()で取ってきた後にsetPathメソッドでURL指定すれば上手く動く。

# Eloquentのメソッド使おうとしたら"Undefined property"

→Eloquentモデルでは無い可能性
hasMany系のリレーションで取得した結果は配列になっている。
配列に対しては当然Eloquentメソッド使えないのでエラーになる。

この場合はforeachしたり、first()とかで1個だけ取ってくるようにすると良い。

→そもそもDBにデータがない可能性
よくよくDBを見たら対象データが1個もなかったとかありがち。。。

# HTTPレスポンスヘッダのSet-Cookieを消したい
Laravel5の場合は、app/Http/Kernel.phpの下記記述を削除。

```php:app/Http/Kernel.php
protected $middleware = [
    ...

    'Illuminate\Session\Middleware\StartSession', ←削除
    'Illuminate\View\Middleware\ShareErrorsFromSession', ←削除
    'App\Http\Middleware\VerifyCsrfToken', ←削除
];
```

# try,catchでわざとエラーを起こしているのにcatchできない
`use Exception`をしてないとか。←エラー出ないので気付きづらい。
MacのChromeではオレオレ認証が使えないからキーチェーンアクセスで解決する


# 前提
開発環境等では証明書をとらずにオレオレ認証で頑張る・・という方も多いと思います。
そんな時にmacでアクセスするとアクセスができなかったので対処方法を記載します。
　
# 現象
macのchromeでオレオレ認証のアドレスにアクセスする

すると以下の画像のようになる。

![8729de8c-273e-23a0-f456-5919a6b65b72.png](https://qiita-image-store.s3.amazonaws.com/0/57634/4377d278-6e5b-9920-882e-982cbda5fb2a.png "8729de8c-273e-23a0-f456-5919a6b65b72.png")


ちなみにWindowsのchromeから同様のページにアクセスすると

![8429c254-eb28-71ae-8817-e2973b96eb212.jpg](https://qiita-image-store.s3.amazonaws.com/0/57634/1ce539fa-29c9-687a-00af-288e3267aaa7.jpeg "8429c254-eb28-71ae-8817-e2973b96eb212.jpg")


\~~~~~~~~~~にアクセスするからアクセスができる。

# 原因
macではOSX Moutain Lionからいわゆるオレオレ証明書は接続できない。

# 対処方法
## 1.他のブラウザを使う
諦めてFireFoxやSafariを使おう。

## 2.他のOSを使う
諦めてWindowsを使う

## 3. キーチェーンアクセスに証明書を追加する
他のブラウザでオレオレ証明書をDLしキーチェーンアクセスに追加する。
今回はFireFoxを例にする。
### FireFoxで証明書をDL
アドレスバーの三角に!があるマークをクリック
![c12d708f-7ff6-8d90-2a98-1253a015bd8d.png](https://qiita-image-store.s3.amazonaws.com/0/57634/a8612339-d999-b454-627b-10e256e20ec8.png "c12d708f-7ff6-8d90-2a98-1253a015bd8d.png")


![1a57b965-77d5-7b68-945b-99929229f016.png](https://qiita-image-store.s3.amazonaws.com/0/57634/9e5e2abb-2802-45f0-e5f7-0b6ee728c464.png "1a57b965-77d5-7b68-945b-99929229f016.png")

でてきたポップアップから詳細を表示
Webサイトの識別情報


から証明書を表示
詳細から書き出すを選択
![f520c2dc-0514-b122-4d8c-3a4bff63ac1d.jpg](https://qiita-image-store.s3.amazonaws.com/0/57634/c38f05a7-ec00-eae3-10aa-95c420523d71.jpeg "f520c2dc-0514-b122-4d8c-3a4bff63ac1d.jpg")


適当な名前で保存


### キーチェーンアクセスに追加
/Applications/Utilites/キーチェーンアクセスを開く
ファイル→読み込みからFireFoxでDLした証明書を選択
追加された証明書から信頼をクリックしこの証明書を使用するとき:を常に信頼に変更
![4008909a-1988-40d0-13e1-cb61aa5d22db.png](https://qiita-image-store.s3.amazonaws.com/0/57634/23d0deca-b250-bfd5-4088-765de487ed79.png "4008909a-1988-40d0-13e1-cb61aa5d22db.png")
rpmパッケージからファイルを取り出す


## とりあえず全部取り出す
```sh
$ rpm2cpio hoge.rpm | cpio -id  
```

## ファイルを指定して取り出す
まず一覧表示

```sh
$ rpm2cpio hoge.rpm | cpio -t
./etc/hoge.txt
./etc/data/file1
./etc/data/file2
./etc/data/file3
```

取りたいファイルを引数に指定

```sh
$ rpm2cpio hoge.rpm | cpio -id  ./etc/hoge.txt 
```


## ディレクトリを指定して取り出す
取りたいディレクトリを引数に指定。アスタリスクつける

```sh
$ rpm2cpio hoge.rpm | cpio -id  ./etc/data/*
```
GoogleDisplayNetwork(GDN) 運用Tips

# TL;DR

- 日頃GDNを運用をする中で得た、基本的なノウハウを記載する。
- GDNをはじめとする運用型広告は **(運用力)** x **(クリエイティブ力)** により効果を上げる。
- ロジカルな左脳的運用力と、ユーザーへ刺さるクリエイティブを創りだす右脳的な能力を合わせて必要とするため、始めは敷居が高く感じられるかもしれないが、経験とともにどちらも向上できる。

# 前提
- スマートフォン（モバイル）のみへの配信を前提としている（モバイルサービスのマーケティングにGDNを利用していると仮定していただきたい）。
- 一方でおおよその内容はPCでの訴求にも使えるものであると思う。

# クリエイティブサイズ
全6種類あるが、基本は2種類抑えておけばOK

- 600x500px
- 640x100px

# アカウント構造
GDNは一般的なAdwordsのアカウント構造。下記の階層設定をおすすめしている。

- キャンペーン：配信ターゲット毎に設定
- 広告グループ：クリエイティブサイズ毎に設定
- 広告：クリエイティブごとに設定

# ターゲティング

- 例えばsmarbyのようなユーザーセグメントが明確なサービスの場合、全キャンペーンで性別・年齢・子供の有無などユーザー情報は絞っておく。その際、はじめは「不明」も含まれるように設定することをオススメする。
- 筆者は下記3種類のターゲティングを用いて運用している（=3つのキャンペーンを建てる）。
  - キーワード：ユーザーの検索キーワード毎にセグメンテーション
  - アフィニティ（インタレスト）：ユーザー関心ごとにセグメンテーション
  - トピック：配信面のトピック毎にセグメンテーション

- 各ターゲティングのなかでどのようにキーワードを設定するか、アフィニティを設定するかなどの**プランニング**がもっとも重要な仕事で、運用力と合わせてマーケターの力量が問われる。

# クリエイティブ運用

- 期間・金額にもよるが、1ヶ月数十万円単位であればどのサイズも、クリエイティブの交換タイミングは4週間が目安。

# KPIの目安

- CPC/CPAは訴求商材によるので一般化できない
- 一方で共通のKPIとしてCTRが挙げられる。CTRの目安として、0.10%がひとつの基準。
- 0.10%を割り込む場合はCPM出稿へ切替を検討。

# Q&A

**Q.** 例えば200,000imp、400clickほど出ているキーワードでCVにつながらないキーワードがある。このキーワードは切って良いのか？Noの場合、どのくらいのimp, Click時点で切る判断するか？
**A.** この程度のimpであればまだ様子を見たほうが良い。クリックボリュームがでて、CVに繋がっていないものは個別に入札単価を下げて、再度様子を見る。

**Q.** 検証期間は？
**A.** 1週間は見る。平日休日や、時間帯での差異を検証する。

**Q.** 配信時間を指定するとgoogle側で配信の差配を行うのか？
**A.** Yes。初期設定では配信できる時間帯に、最大限配信する。日予算3万、0-1時で2万円分配信してしまった場合、google側で調整がされ、以降の時間で急激に配信が抑制される。ベストはユーザーが最もサービスにふれる時間に配信時間を絞ること。弊社では15~00時。
ListenAndServeをCTRL+Cで止める

`signal.Notity`とGoroutineを使います。

```go
package main

import (
	"net/http"
	"os"
	"os/signal"
)

func handler(w http.ResponseWriter, r *http.Request) {
}

func main() {
	ch := make(chan os.Signal, 1)
	signal.Notify(ch, os.Interrupt)

	go func() {
		for _ = range ch {
			signal.Stop(ch)
			os.Exit(0)
		}
	}()

	http.HandleFunc("/", handler)
	http.ListenAndServe(":8080", nil)
}
```
Fabric Engine Splice/Canvasアプリケーションのビルド環境構築


FabricEngine 2.0 + Windows環境でのビルド

*注意: 特別な意図がないかぎり Fabric Engine を使用するにあたって この記事で解説するようなビルドは必要ありません。* 今回は FE2.0でSoftimage2013 が非対応となっていたので修正版を用意するためにビルドしました。


# ソースの取得
ライセンスを取得しFE本体を展開
https://github.com/fabric-engine

### FabricEngine:
https://github.com/fabric-engine/FabricUI
https://github.com/fabric-engine/FTL

### Splice:

https://github.com/fabric-engine/SpliceAPI
https://github.com/fabric-engine/SpliceMaya
https://github.com/fabric-engine/SpliceSoftimage


## ソースの配置

フォルダ構成を以下のようにする

```bat:tree.bat
SpliceAPI
 ─.build
├─samples
├─SpliceMaya
│  ├─lib
│  ├─Module
│  ├─plugin
│  └─TestingScripts
└─SpliceSoftimage
    └─UI
```

# 必要ツール、ライブラリ

#### scons
```py
pip install scons
```

#### VisualStudio2013（vc120)
Fabric Core と利用コンパイラ、バージョンを合わせる。FE1 から FE2 で vc100 から vc120へと変更になったので注意。2010 Express版の場合 64bit でビルドするためには~~かなりの意味不明な~~準備が必要であったが（ http://d.hatena.ne.jp/torutk/20100927/p1 ）もしかしたら2013では不要？
    
#### boost 1.55以上
 http://www.boost.org/ 
math, filesystem, thread の静的ビルドが必要
こちらも vc120 でビルド。詳細は別の記事を参照

```bat:build_b2.bat
bootstrap.bat
.\b2 --prefix=D:\Programs\b2 install
```

```bat:build_boost.bat
call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat"
b2 toolset=msvc-12.0 threading=multi variant=release link=static runtime-link=static address-model=64 -j 8
```

### Qt 4.8.6

自前でビルドするかコンパイル済のものを調達

#### 自前でビルドするには
https://download.qt.io/archive/qt/4.8/4.8.6/
https://download.qt.io/archive/qt/4.8/4.8.6/qt-everywhere-opensource-src-4.8.6.zip
よりソースを取得 Visual Studio 2013 でビルドする。

https://github.com/appleseedhq/appleseed/wiki/Making-Qt-4.8.6-compile-with-Visual-Studio-2013

SET QMAKESPEC=win32-msvc2013
https://forum.qt.io/topic/22514/5-0-windows-7-and-msvc-2010-and-64-bit-compilation/3

TARGET名を QtCore4.[dll|lib] → QtCoreFabric4.[dll|lib] のように全ての生成物について変更する。configure 後に Makefile.release 書き換えとかでいいはず？もしかして configure オプションにあるのかもしれない

用意ができたら ``` SpliceSoftimage\ThirdParty\PreBuilt\Windows\x86_64\VS2013\Release\qt-fabric\4.8.6 ''' にリンクを貼っておく



# ビルド

0. 環境変数通す
0. scons

```bat:setenv.bat
SET FABRIC_BUILD_OS="Windows"
SET FABRIC_BUILD_ARCH="x86_64"
SET FABRIC_BUILD_TYPE="Release"
SET FABRIC_SPLICE_VERSION="2.0.0"
SET BOOST_DIR=D:\boost_1_59_0
SET FTL_INCLUDE_DIR=D:\fabric\repositry\FTL
SET FABRIC_UI_DIR=D:\fabric\repositry\FabricUI

SET MAYA_INCLUDE_DIR="C:\Program Files\Autodesk\Maya2015\include\"
SET MAYA_LIB_DIR="C:\Program Files\Autodesk\Maya2015\lib\"
SET MAYA_VERSION="2015"

SET SOFTIMAGE_INCLUDE_DIR="C:\Program Files\Autodesk\Softimage 2013 SP1\XSISDK\include"
SET SOFTIMAGE_LIB_DIR="C:\Program Files\Autodesk\Softimage 2013 SP1\XSISDK\lib\nt-x86-64"
SET SOFTIMAGE_VERSION=2013SP

```

```bat:build.bat
cd SpliceSoftimage
scons -j8
```

boost もそうだが -j8 の数字部分は並列ビルド数なのでマシンの最大コア数指定しておくと良い
これにて SpliceSoftimage/.stage に出来上がる。
julia メモ


tutorial

http://samuelcolvin.github.io/JuliaByExample/
http://quant-econ.net/jl/learning_julia.html
https://en.wikibooks.org/wiki/Introducing_Julia
http://samuelcolvin.github.io/JuliaByExample/
http://learnxinyminutes.com/docs/julia/
https://github.com/chrisvoncsefalvay/learn-julia-the-hard-way



```julia:read
open("file_name") do f
    for line in eachline(f)
        print(line)
    end
end
```

```julia:read2_指定文字列の存在する行を抜き出す．
name="hogefuga" # 指定文字
f=readall("file_name")
dat=matchall(Regex("$name"".*"),f)
```

```julia:read3_データを行列に格納
f = open("file_name")
dat=readdlm(f)
```

```julia:read4_matchした行があったらループを終了
lines = open( "file_name", "r" ) do fp
    dat=readlines( fp )
    n=0
    for line in dat
        n+=1
        if( ismatch(r"$name", line)) 
            n+=1
            break
        end
    end
end
    
```

```julia:write
open("output.txt", "w") do f
    for n = 0:9
        write(f, string(n)"\n")
    end
end
```

```julia:中身のサイズが不明な配列（5個）を，配列の各要素に持たせる．
d=Array(Array,5)
```

```julia:行列の演算
A.*B		# 要素ごとの積
A.^B		# 要素ごとにB乗する．
dot(A,B)	# 内積
A'         # 転置
```

```julia:式展開
"$a"
```
WatchOS2 Complication

#参考
Hikaru Satoさんのまとめが非常に分かりやすいです。
http://qiita.com/HIkaruSato/items/66e7857435bbcd4f75f9

#ComplicationControllerの役割
ComplicationControllerは、表示に関する設定及び内容の登録に利用されます。
設定はタイムトラベル機能の有効無効及びプライバシーが扱えます。

#実機の動作確認
Apple WatchのUUIDを登録するのを忘れているとインストールエラーが起きます。
またDevelop環境でのProvisional ProfileはAppもExtentionもwildCardで問題無いですが、team provisionalはデバイス登録直後だと抜けていたりするので新規に作ると確実です。

#Complicationの罠
コンプリケーションを開発する上で、
**更新回数制限がある**
**更新タイミングの間隔が１時間以上でないといけない**
**通信等の時間のかかる処理をしてはいけない**

時計を見ている時にリアルタイムの情報を得たいというのがあると思うのですが、１時間間隔なので大体のアイデア（バッテリー残量とか今の最寄り駅表示したりとか）はダメって感じです。
公式のコンプリケーションはこの辺りの制限が緩和されているっぽいので、非常に厳しいかと思います。

#実機で起動直後に落ちる
iPhoneのインストールのタイミングとAppleWatchのインストールのタイミングにはズレがあって、しかもXcodeのインジケータも実はアテにならない。
AppleWatchで起動してクルクルが表示されてすぐ落ちる場合はインストール自体がまだ終わってない事が多い。
少し待つと動いたりする。
Nginx + TLS で HTTPS なサーバを構築する.

# 経緯
普段は Apache で構築してますが、今回は Nginx でやってみたいな、と思い立ったが吉日。
ひとまず無料で出来る手段でやってます.

過去、リバースプロキシ構成のために触ったぐらいなので、実は本格的に Web サーバ (と言っても API 応答用のアプリケーションサーバなんですが) として利用しようと思ったのは今回が初.

# 対象者
Nginx 初心者で、HTTPS で接続させたいけど、まったくわからん…って人向けです.
あ、でも最低限 DNS の設定とかは他の方の記事で抑えておいてください. MX とか A レコードの設定とか.(FastMail で独自ドメイン設定するときに必要になるので)


# 前提
* SSL 証明書はここ. → https://www.startssl.com/
* 証明書発行に必要なメールは https://www.fastmail.com/ から独自ドメインを設定して受け取る.
* SSL の評価は https://www.ssllabs.com/ssltest/ ここで判定してもらいます. (以下の記事に倣って A+ 判定を目指す)

# 手順と設定
https://juliansimioni.com/blog/https-on-nginx-from-zero-to-a-plus-part-1/
と
https://juliansimioni.com/blog/https-on-nginx-from-zero-to-a-plus-part-2-configuration-ciphersuites-and-performance/
を見て設定していく.
↑の記事だけで Nginx で HTTPS サーバが構築できます.
簡単！本当にありがとう！
特にここに書くことがないぐらい、懇切丁寧.

※追記：POSTD にて上記の日本語訳もされてます。英語が嫌だ！って人はこちらでも.
http://postd.cc/https-on-nginx-from-zero-to-a-plus-part-1/
http://postd.cc/https-on-nginx-from-zero-to-a-plus-part-2-configuration-ciphersuites-and-performance/

ただ、一か所.
中間証明書の設定をする際、記事の通りに設定していけば何も問題ないはずなんですが、認証局が発行した .pem ファイルと .crt ファイルを `cat` コマンドで連結して設定する場合には注意が必要です.

これは Nginx に限らずの症状なんですが….
連結した証明書をそのまま開いてみると、こんな感じになってると思います.

```
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
```

このままのファイルだと Nginx の再起動時(もしくは config ファイルの reaload 時、configtest 時) に

```
PEM routines:PEM_read_bio:bad end line.
```

とかって怒られてしまうので、間に改行を入れて

```
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
```

上記のように設定してあげます.
最初これに気付かなくて、認証チェーンが上手く設定できず、B 判定.
ひとまず分からないときは記事に従って設定することって大事だな、と思いました….

参考：
http://answers.splunk.com/answers/221766/how-to-fix-the-below-pem-routinespem-read-biobad-e.html

本当にこれだけ. 何も解説してない.
ひとまず Nginx で HTTPS な Web サイトを構築したい人の手助けになれば幸い.






それでは良きエンジニアライフを(^w^)ﾉｼ
Perlでファイル内に書いた文字複数行を<DATA>で参照・ループする方法

perlでは、`__END__`あるいは`__DATA__`以降に書いた文字列は、無視されるようになっており、かつ、そこに書かれた内容は`<DATA>`というファイルハンドルで参照できるようになっています。

簡単なCSVやTSVフォーマットの文章をちょこちょこっと整形したいようなときに、僕はこの方法をよく使う(使っていた)のですが、久しぶりにやろうとしたら書き方を忘れてしまっていました。

(`__DATA__`と`<DATA>`の部分の単語というか書き方が思い出せなかった)

「POD ファイル DATA 参照」とかでぐぐっても目当ての情報がヒットせず「何て検索したらいいんだろう^^;」状態になってしまい、なかなか見つけることができなかったので、僕が使った検索ワードを散りばめつつ記録に残しておきます。

## 書き方

```pl
use strict;
use warnins;
use utf8;

for my $line (<DATA>) {
    chomp $line;
    my ($id, $name) = split ',', $line;

    # ここに何らかの加工処理
}

# __DATA__を__END__と書いても動く。但しファイルハンドルの書き方は<DATA>のまま
__DATA__
1,山田
2,田中
3,川村
4,中村
```

## 参考記事

* [特殊ファイルハンドル DATA](http://d.hatena.ne.jp/palmo/20060620/data)
* [The <DATA> syntax in perl](http://stackoverflow.com/questions/13463509/the-data-syntax-in-perl)
Error: Cannot find module の対応

# 現象

npmのパッケージでグローバルにインストールしているにも関わらず

```
Error: Cannot find module 'module_name'
```
と、参照できないとのエラーが出る。


# 対応 

zshを使っている場合は.zshrcに

```
export NODE_PATH='/usr/local/share/npm/lib/node_modules'
```
を追加してパスを通す。
Spring Boot の組み込みDB(h2database)を永続化する設定

## 設定

下記の設定を追加してください。

```yaml:application.yml
spring:
    datasource:
        url: jdbc:h2:./.data/h2/db;MODE=PostgreSQL
```

*`./.data/h2/db`はデータの格納先なので、任意のディレクトリを指定可能。*
*プロジェクト内部にデータベースを格納する場合は、バージョン管理から除外してください。(`.gitignore`ファイルに`/.data/`を追加)*

`Gradle`の`bootRun`タスクを実行して成功した場合は、`./.data/h2/db.mv.db`が作成されます。

## 参考

* [yosshio0426's blog - Spring Boot お勉強　その３　～H2DBの永続化～](http://yosshio0426.hatenadiary.com/entry/2014/07/21/070153)

以上
[Elixir]マクロでもテストしたい！

# Goal
ExUnitからのマクロのテスト方法を習得する。

# Dev-Environment
OS: Windows8.1
Erlang: Eshell V7.1, OTP-Version 18.1
Elixir: v1.1.1

# Wait a minute
マクロをはどうやってExUnitでテストしたらいいのでしょうか？

丁度良く、友人から強だｹﾞﾌﾝｹﾞﾌﾝ・・・快くお貸し頂いた[Metaprogramming Elixir](https://pragprog.com/book/cmelixir/metaprogramming-elixir)にある方法を、試してみようと思います。

# Index
Macro test with ExUnit
|> Before you start
|> Macro test with ExUnit

## Before you start
始める前に準備をしましょう！

Example:

```cmd
>cd path/to/project
>mix new macro_sample
>cd macro_sample
>mix test
```

よし、ではやっていきましょう！！

## Macro test with ExUnit
自作したマクロをExUnitでテストするにはどうすればいいのでしょうか？

結論から言えば、別に難しいことはないです。
難しかったら、誰も使わない気がしますが(笑)

まずは、テスト用の適当なマクロを作成してしまいましょう。

File: lib/macro_sample.ex

```elixir
defmodule MacroSample do
  defmacro sample(string) do
    quote do
      unquote(string)
    end
  end
end
```

続いてテストコードです。

File: test/macro_sample_test.exs

```elixir
ExUnit.start
Code.require_file("lib/macro_sample3.ex")

defmodule MacroSampleTest do
  use ExUnit.Case
  import MacroSample

  test "Ensure loaded?" do
    assert Code.ensure_loaded?(MacroSample3)
  end
end
```

[Code.require_file/2](http://ns.maqcsa.org/elixir/docs/v1.1.0/elixir/Code.html#require_file/2)で対象のファイルをrequireしています。
その後、importしています。

[Code.ensure_loaded?/1](http://ns.maqcsa.org/elixir/docs/v1.1.0/elixir/Code.html#ensure_loaded?/1)では、読み込んだモジュールがロードされているか確認しています。
ロードされていればtrueを返しています。

テストを実行してみましょう。

Example:

```cmd
>mix test
.

Finished in 0.09 seconds (0.08s on load, 0.01s on tests)
1 test, 0 failures

Randomized with seed 738000

```

最初のテストはパスしました。

それでは、本題のマクロをテストコードで使ってみましょう。
といっても、既に読み込みもできているのが確認できているので、後は普通の関数と変わりませんね。

テストコードを追加します。

File: test/macro_sample_test.exs

```elixir
...

defmodule MacroSampleTest do
  ...

  test "Macro test sample" do
    assert MacroSample.sample("hoge") == "hoge"
  end
end
```

テスト用に作ったマクロは、渡した引数をそのままunquoteしているだけです。
なので文字列:hogeを渡したら、文字列:hogeが返ってくるはずです。

テストを実行しましょう！

Example:

```cmd
>mix test
..

Finished in 0.07 seconds (0.07s on load, 0.00s on tests)
2 tests, 0 failures

Randomized with seed 622000
```

テストが通過しました。

# Speaking to oneself
もっと難しいマクロのテストをどうするんだ？とかとか色々とまだあるのですが、
最初の足掛かりとしてはこれで良いです。

気が向いたら続きの記事作ります。

# Bibliography
[Metaprogramming Elixir](https://pragprog.com/book/cmelixir/metaprogramming-elixir)
Goutteで文字化け

# 現象
あるサイトをスクレイピングしていて、ajaxで取得されるページの内容を取得しようとしたところ
突然 `$crawler->html()` したときに日本語が文字化ける現象に遭遇。

文字的には `èå /æ±æ­¦ä¼å¢å´ã»å¤§å¸«ç·` とかそんな感じ。


# 原因
「取得しようとしていたページにcharsetがない」

実際はUTF-8なんだけど、headerにもmetaにも明示されてない。
で処理を追っていくと Synfony\ComponetnDomCrawler\Crawler::addContent() にて
>    /**
     * Adds HTML/XML content.
     *
     * If the charset is not set via the content type, it is assumed
     * to be ISO-8859-1, which is the default charset defined by the
     * HTTP 1.1 specification.
     *
     * @param string      $content A string to parse as HTML/XML
     * @param null|string $type    The content type of the string
     */

ということでHTTP 1.1に従ってデフォルトはISO-8859-1にしますよ、と。


# 対策
単純にレスポンスをmb_convert_encodingしてもダメだったので
以下のような継承クラスを定義してこっちを使う。

```php
<?php namespace MyNameSpace;
use Goutte\Client;
use Psr\Http\Message\ResponseInterface;
use Symfony\Component\BrowserKit\Response;

class GoutteClientCustom extends Client
{
    protected function createResponse(ResponseInterface $response)
    {
        $headers = $response->getHeaders();
        if (!isset($headers['Content-Type'])) {
            $headers['Content-Type'][0] = 'text/html; charset=UTF-8';
        } elseif (stripos($headers['Content-Type'][0], 'charset=') === false) {
            if (trim($headers['Content-Type'][0]) && substr(trim($headers['Content-Type'][0]), -1) !== ';') {
                $headers['Content-Type'][0] = trim($headers['Content-Type'][0]) . ';';
            }
            $headers['Content-Type'][0] .= ' charset=UTF-8';
        }
        return new Response((string) $response->getBody(), $response->getStatusCode(), $headers);
    }
}

```

headerに無理やり `charset=UTF-8` をねじ込む。
とりえあずはこれでうまくいった。
MapでStream APIを使う


こんな ``Map<String, String>`` があります。

```Java
Map<String, String> map = new HashMap<String, String>() {
    {
        put("key 1", "value 1");
        put("key 2", "value 2");
        put("key 3", "value 3");
    }
};
```

これをStream APIで処理するには ``Map::entrySet`` を使います。

```Java
map.entrySet().stream()
    .map(e -> e.getKey() + ": " + e.getValue())
    .forEach(System.out::println);
```

出力結果。　

```
key 3: value 3
key 2: value 2
key 1: value 1
```
centOS6.7のconohaVPSでrailsappを走らせるまで

### 前置き

conohaの中の人達にお世話になったので借りてrails走らせてみた
ただの備忘録です
調べれば沢山出てくるはず
ansibleとかはいずれかければ
rubyは2.2.0
railsは4.2.0

# 事前設定

```
useradd hoge
passwd hoge
su hoge
cd
mkdir .ssh
vi .ssh/authorized_keys
# 公開鍵貼り付け
exit #rootに戻る
visudo #hogeにsudo権限付ける
yum install -y git gcc gcc-c++ openssl-devel readline-devel zlib-devel libcurl-devel
```

# rbenv

```
cd /usr/local
git clone git://github.com/sstephenson/rbenv.git rbenv
mkdir rbenv/shims rbenv/versions rbenv/plugins
groupadd rbenv
chgrp -R rbenv rbenv
chmod -R g+rwxXs rbenv
cd /usr/local/rbenv/plugins

# ruby build
git clone git://github.com/sstephenson/ruby-build.git ruby-build
chgrp -R rbenv ruby-build
chmod -R g+rwxs ruby-build
rbenv install -l

# ruby-default-gems(勝手にgem入れてくれる奴)
git clone git://github.com/sstephenson/rbenv-default-gems.git rbenv-default-gems
chgrp -R rbenv rbenv-default-gems
chmod -R g+rwxs rbenv-default-gems
vim /etc/profile.d/rbenv.sh
vim /usr/local/rbenv/default-gems
```

```shell-session:/etc/profile.d/rbenv.sh
export RBENV_ROOT="/usr/local/rbenv"
export PATH="$RBENV_ROOT/bin:$PATH"
eval "$(rbenv init -)"
```

```shell-session:/usr/local/rbenv/default-gems
bundler
rbenv-rehash
```

```
source /etc/profile.d/rbenv.sh
rbenv install *.*.*
rbenv global *.*.*

※ 2.2.0入れる時は以下が必要
yum install libffi-devel
```

# nginx

```
rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
yum -y install nginx
chkconfig nginx on
service nginx start
#IPでアクセスして起動画面確認
```

#rails 設定

```
git clone git@hogehoge
sudo chown -R username hogehoge
bundle install

#nokogiri で怒られたので以下を実行
bundle config build.nokogiri --use-system-libraries
sudo yum install libxml2-devel libxslt-devel

#sqlite3で怒られたので以下実行
sudo yum install -y sqlite-devel 
```


# 本番環境準備

```
bundle exec rake db:migrate RAILS_ENV=production

#js runtimeがないってさ
gem 'therubyracer'
を追加
bundle update
bundle install

bundle exec rake assets:precompile RAILS_ENV=production

# こんなエラーが出続けたので
rake aborted!
Sass::SyntaxError: File to import not found or unreadable: style.scss.
application.cssをscssにリネーム
```

## unicorn.rb 追加
以下参照
http://omohayui.hatenablog.com/entry/2015/07/18/154837

# 起動

```
mkdir /var/run/unicorn
mkdir /var/log/unicorn

#必要に応じて
sudo chown -R hoge folder_name

bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```
 
# 確認と停止

```
#確認
ps -ef | grep unicorn | grep -v grep

#停止

kill -QUIT `cat /var/run/unicorn/unicorn.pid`
```

これでアプリが立ち上がります




#参考

参考というかほぼコピペ、、、まとめただけ
http://kzy52.com/entry/2015/05/13/201831
http://shiro-16.hatenablog.com/entry/2014/12/26/003810
matplotlibを用いたグラフ描画

グラフ描画はよく使うので、個人的に必要最低限のものを作成しました。
基本的なmatplotlibにあるの関数の説明はおそらく、他の方が説明しているので省きます。
`import matplotlib.pyplot`のインポートは省きます。
***
###
```plot_graph.py
def plot_graph(x, y=[], graph_name='graph.png', \
    save_flag=True, show_flag=False, label_x='', label_y='', label='',title=''):
    if label: pyplot.plot(x, y, label=label)
    else: pyplot.plot(x, y)
    if title: pyplot.title(title)
    if label_x: pyplot.xlabel(label_x) 
    if label_y: pyplot.ylabel(label_y)
    if save_flag: pyplot.savefig(graph_name)
    if show_flag: pyplot.show()
```
デフォルト設定として、`x, y`を引数に与えれば、`graph.png`ファイルに書き込んでくれる。
`x, y`は数列入力です。
optionとして、ファイルネーム、保存のするかしないか、showに変更可、各軸ラベル、グラフのラベル、タイトルをいれました。
`save_flag`と`show_flag`分けた方がいいと思ったのですが、後で見たときにわかりやすいかと思い分割。

下記にそれぞれ部分的に関数化
***
####plotの部分
```plot_only.py
def plot_only(x, y=[], label=''):
    if label: 
        if y: pyplot.plot(x, y, label=label)
        else: pyplot.plot(x, label=label)
    else: 
        if y: pyplot.plot(x, y)
        else: pyplot.plot(x)
```
ラベル有無、引数が一つの場合の対応
***
####ラベル付けの部分
```add_label.py
def add_label(label_x='', label_y='', title=''):
    if title: pyplot.title(title)
    if label_x: pyplot.xlabel(label_x) 
    if label_y: pyplot.ylabel(label_y)
```
***
####出力の部分
```output_graph.py
def output_graph(save_flag=True, show_flag=False, graph_name='graph.png'):
    if save_flag: pyplot.savefig(graph_name)
    if show_flag: pyplot.show()

```
***
####関数ができたので、`plot_graph.py`をスマートに
```new_plot_graph.py
def new_plot_graph(x, y=[], graph_name='graph.png', \
    save_flag=True, show_flag=False, label_x='', label_y='', label='',title=''):
    plot_only(x, y, label)
    add_label(label_x, label_y, title)
    output_graph(save_flag, show_flag, graph_name)
```

legendとか、表示範囲、xtrickとかはあんまり使わないので、今回は書いてません。
こんな感じで、自分的に必要な関数でした。
pepper Operation Tips -pepperの名前変更-

pepper一般販売バージョンに初めて触り一瞬とまどったので、自分への忘備録も兼ねての投稿です。

http://"pepperのIPアドレス"/advanced/

で旧ロボットウェブページにアクセス出来ます。
（今まではロボットウェブページから旧ロボットウェブページにアクセス出来ていましたが、それが無くなっていました）

パスワード入力しログインした後、Settingsをクリックしてページ遷移しNew Nameの欄に入力します。変更後はpepperの再起動が必要です。
![advanced.jpg](https://qiita-image-store.s3.amazonaws.com/0/59491/b6ed646c-7140-23d8-c995-dd6a650e3675.jpeg)
ページング用Smartyカスタムプラグイン


smarty_plugins に放り込むだけです。

```php:function.pagination.php
<?php

/**
 * function.pagination.php
 */
function smarty_function_pagination($params)
{
	//レコードの総数
	$intTotal = (isset($params['total']) && 0 < $params['total']) ?
		$params['total'] :
		0;

	//レコード総数がゼロのときは何も出力しない
	if (0 === $intTotal) {
		return '';
	}

	//ページあたりの表示レコード数
	$intLimit = (isset($params['limit']) && 0 < $params['limit']) ?
		$params['limit'] :
		10;

	//現在表示中のページ番号（ゼロスタート）
	$intCurrentPage = (-1 < filter_input(INPUT_GET, 'page')) ?
		filter_input(INPUT_GET, 'page') :
		0;

	//ページの最大数
	$intMaxpage = ceil($intTotal / $intLimit);

	//現在ページの前後３ページを出力
	$intStartpage = (2 < $intCurrentPage) ? $intCurrentPage - 3 : 0;
	$intEndpage = (($intStartpage + 7) < $intMaxpage) ? $intStartpage + 7 : $intMaxpage;

	//url組み立て
	$urlparams = filter_input_array(INPUT_GET);

	$items = [];

	//最初
	$urlparams['page'] = 0;
	$items[] = sprintf('<span><a href="?%s">%s</a></span>'
		, http_build_query($urlparams)
		, '最初'
	);

	//表示中のページが先頭ではない時
	if (0 < $intCurrentPage) {
		$urlparams['page'] = $intCurrentPage - 1;
		$items[] = sprintf('<span><a href="?%s">%s</a></span>'
			, http_build_query($urlparams)
			, '前へ'
		);
	}

	for ($i = $intStartpage; $i < $intEndpage; $i++) {
		$urlparams['page'] = $i;
		$items[] = sprintf('<span%s><a href="?%s">%s</a></span>'
			, ($intCurrentPage == $i) ? ' class="current"' : ''
			, http_build_query($urlparams)
			, $i + 1
		);
	}

	//表示中のページが最後ではない時
	if ($intCurrentPage < $intMaxpage) {
		$urlparams['page'] = $intCurrentPage + 1;
		$items[] = sprintf('<span><a href="?%s">%s</a></span>'
			, http_build_query($urlparams)
			, '次へ'
		);
	}

	//最後
	$urlparams['page'] = $intMaxpage - 1;
	$items[] = sprintf('<span><a href="?%s">%s</a></span>'
		, http_build_query($urlparams)
		, '最後'
	);

	return implode(PHP_EOL, $items);
}

```

テンプレート側からは、以下のようにして表示します。

```html:*.tpl
{pagination total=100 limit=10}
```
OS X El Capitanで日本語入力のデフォルトを半角スペースにする方法

# 概要
OS X Yosemiteで `␣` → 半角スペース、`shift + ␣` → 全角スペースというように設定したが、OS X El Capitanにアップデートしたら元に戻り、しかも前行った手順で設定できなくなっている！OS X El Capitanでは手順が少し違うので改めてまとめてみました。

# 手順
1. リカバリーモードでパソコンの起動
  * Mac起動時に `cmd + R` を押す
  * OS X Utilitiesというダイアログが表示される
2. System Integrity Protection（システム保全性保守）の無効化
  * メニューバーから ユーティリティー ＞ ターミナルを選択
  * ターミナルで `csrutil disable` を実行
  * Macを再起動
3. `KeySetting_*.plist` のバックアップ、パッチの実行
  * ターミナルで以下を実行

    > * `cd /System/Library/Input\ Methods/JapaneseIM.app/Contents/Resources/`
    > * `tar czf ~/JapaneseIM_KeySetting.tar.gz KeySetting_*.plist`
    > * `curl -sL https://gist.githubusercontent.com/comutt/dd0a03bdc81e2660ea07/raw/003f1c44891280f813233235e11dbb0dcfd7bdce/KeySetting.diff | sudo patch -p1`
    > * `sudo killall -HUP JapaneseIM`

4. System Integrity Protectionの有効化
  * もう一度リカバリーモードでパソコンを起動（1. を参照）
  * メニューバーから ユーティリティー ＞ ターミナルを選択
  * ターミナルで `csrutil enable` を実行
  * Macを再起動

# 参考
* [Qiita - OS X Yosemite の日本語入力で常時半角スペースにする方法](http://qiita.com/comutt/items/3f497f05ef98c7a2e615#comment-65b031be4e48714ccbbe)
* [Mac OS 10.11 El Capitanで日本語入力の既定のスペースを半角に設定する（最初にrootless設定を無効にする必要あり）](http://kotonohatrans.hatenablog.com/entry/2015/09/23/010147)
CoffeeScriptの配列をgeneratorで記述する

今のところ CoffeeScriptでは `for-of`ステートメントが使えないので、generatorから配列を生成するには `Array.from`を使う必要があります。

```coffeescript
coffee> Array.from do -> yield 1; yield 2; yield 3
[ 1, 2, 3 ]
```

end嫌いな人にはこんな使いたかもできます。

```coffeescript
foo = Array.from do ->
  yield "item1"
  yield "item2"
  yield "item3"
```

末尾の一行が節約できますね。
こんな風にすればもう少し綺麗かもしれません。

```coffeescript
list = (f) -> Array.from do f

foo = list ->
  yield "item1"
  yield "item2"
  yield "item3"
```
はじめてiOSアプリを開発してみる人のブートストラップ(swift2/2015夏編)

# 概要
社内キータに書いてましたが似たような悩みがある人も多いと思うので転載します。
ちょっとずつアプリを書くようになったのでまとめます。ツッコミ補足大歓迎です！

# ざっくり思ったこと
世の参考書には適正レベルがあるので、レベルに達していないうちに読んでも全然役に立たない（cf. FFでレベルが足りなくて魔法の本が読めないのと同じ）

# LV.0（世の「挫折しない！」系の本はここ）
## この時期に悩んでること
- 何から始めたらいいのかよくわからない
- Xcode自体の使い方がわからない
- swiftがわからないのかiOSのapiが分からないのか分かってない
- 名前がいろいろわからない（セグエ、コントローラー、etc）
- 素材の入れ方がわからない
    - 実態とXcode上では概念が異なることの理解（フォルダ構造なども指定しないと受け継がない、など）

## これができたら卒業
- Xcodeを起動してシミュレータでアプリを動かせる
- StoryBoard上でセグエを使って画面遷移できる
- StoryBoard上に設置したラベルの文字をコードから変更できる
- コントローラーと画面を紐づけることを理解する
    - そうしないと部品をコードに紐付けられないことも理解する

## おすすめ教材
- ドットインストール iOS開発編
    - http://dotinstall.com/lessons
    - 基本的なapiの意味がわかる
- [詳解swift](http://www.amazon.co.jp/dp/4800710707)を通して写経
    - ゲームの部分はやらなくて良い。何かひとつ物を作ってくれる本がおすすめ

# LV.1（1前半と後半がありそう）
## この時期に悩んでること
- ページ遷移してデータも受け渡す方法がよくわからない
- URLの扱いがよくわからない
- サーバのapiを叩いて情報を表示させる方法がよくわからない
- swift1.2 -> 2.0への移行
- Webapiへのログイン実装（どうやってリクエストを送ってレスポンスをもらい、それを保存するの？）

## これができたら卒業
- cocoapodsでライブラリをインストールできる
    - トラブル対応（初期化）もできる
- prepareForSegueを理解できている
    - 意外に参考書に載ってないが、これがないとセグエ間でデータを受け渡せない
- UITableViewに動的なデータを流しこめる
- Autolayoutを理解できる
- トラブル時に+optionでビルドフォルダのクリアを選択肢に持てる
- ベタなエラーの自動修正を使える

## おすすめ教材
- [UIKit＆Swiftプログラミング 優れたiPhoneアプリ開発のための UI実装ガイド](http://www.amazon.co.jp/dp/4797371145/)
    - UIkit内の「これそもそも何なの？」を理解する
    - 物を作るよりapiや概念の話が多かったり、サンプリアプリ3xx本みたいなパターンの本はLv0で見てもさっぱりわからない
- Swift入門系コンテンツ
    - コードでUIを作る、処理をすることが増えてくるので改めてSwift2を学ぶ
    - [swift入門](http://dotinstall.com/lessons/basic_swift)
    - [はてな教科書](https://github.com/hatena/Hatena-Textbook)
- Qiita上にある「100行でつくってみた」系リポジトリのコードリーディング
    - スレッド処理あたりはここで知った
- [Swift Docs](https://sites.google.com/a/gclue.jp/swift-docs/)
    - この辺の機能はこう、という実例がわかる。Lv0で来るとちとハードル高い
- [iOS Swift Tutorial : UICollectionView Pinterest Layout](http://shrikar.com/ios-swift-tutorial-uicollectionview-pinterest-layout/)
    - 基本的なCollectionViewの作り方がわかる

# Lv2
- まだここになってないのでこれから

## この時期に悩んでいること
- キャッシュ、初期化などの「まともに使える状態」にする方法
- cocoapodsライブラリの使い分け（どこまで自分で作るべき？）
- 多言語化のベストプラクティス
- Webapi側の設計・実装
- コードでやったほうが早いこと、できることの種類の引き出し不足
    - あそこのあれはどうやって変えられるんだ（固定メニューヘッダとか）案件
グループポリシーによるポータブル デバイス制御方法

【ホームページ抜粋】
WPDとは、Windows Vista 以降の OS に標準的に備わっている、携帯電話、デジタル カメラ、
音楽プレーヤーのようなポータブル デバイスとの通信手段を提供するドライバ ベースの
テクノロジーです。WPD は API を有しており、デバイスの状態を調べたり、デバイスを
制御する (写真を撮る、メッセージを送るなど) アプリケーションを開発することができます。
なお、Windows XP の場合、別途 Windows Media Player 10 または 11 をインストールする
必要があります。

スマート フォンや従来の携帯電話を USB で PC につないでファイルの転送をする際、通常、
「MTP モード」や「PTP モード」など、事前にモードの選択をする必要があります。
この MTP や PTP というのは WPD が使用している通信手段のことで、現在、WPD が
主に使用しているものは以下の 3 つとなります。

•Picture Transfer Protocol (PTP) - 携帯電話やデジタル カメラなどに画像ファイルを
転送するためのプロトコル
•Media Transfer Protocol (MTP) - PTP を拡張し、携帯電話や音楽プレイヤーなどに
音楽ファイルや動画ファイルも転送できるようしたプロトコル
•Mass Storage Class (MSC) - 従来から使われている USB を介したファイルの転送技術

【ホームページ】
http://blogs.technet.com/b/askcorejp/archive/2014/08/18/wpd.aspx
Macで「Photos」から「写真」にアップデートした際に容量が大幅に減る現象の対処法

タイトル長くてごめんなさい。
Macで、デフォルトアプリの「Photos」で写真を管理している場合、新アプリ「写真」にアップデートすると、容量が大幅に減ってしまう。
原因は、アップデートしたため写真が2倍に保存されているため。
これの対処法は、「Pictures」から「Photos Library.photoslibrary」を削除してしまえばいい。
PythonでWeb上のファイルをダウンロードする

#Webサーバーにあるファイルをダウンロードする

自動ダウンロードをしたいと思った時に便利なプログラムをpythonで書いてみた。[urllib](http://docs.python.jp/2/library/urllib.html)を使うとすごく簡単にできる。


```download.py

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import urllib.request
import sys

def download():

	url = sys.argv[1]
	title = sys.argv[2]
	urllib.request.urlretrieve(url,"{0}".format(title))

if __name__ == "__main__":
	download()

```

```lang:実行方法
python download.py [url] [ファイルタイトル]

```

実行するとdownload.pyのファイルと同上のディレクトリにファイルが作成される。（ファイルタイトルに絶対パスを入れるとそのパス上に作成される。）

sys.argvは[sys](http://docs.python.jp/2/library/sys.html)モジュールをインポートすることで使用できる。sys.argv[0]にはそのプログラムのファイル名が入り、sys.argv[1]からはターミナルでの実行の際に入れた引数が順番に代入される。いくつものファイルを自動でダウンロードしたい場合はurlの規則性を見つけるか、[Beautifulsoup](http://tdoc.info/beautifulsoup/)のようなモジュールを使ってスクレイピングを行いurlを抽出しfor文でdownload()を複数回走らせればできる。

規則性とは、「https://hogehoge/service/10-1.png」 といった画像のURLがあった場合、3-1.pngの3がカテゴリ、1が連番で並んでいるといったようなことがありえる。複数個サンプルを見てみて規則性を見つけると一括ダウンロードができたりする。（サーバー側に負担がかかるので、スクリプト内にtime.sleep(0.1)を入れる等工夫はした方がよい）


##参考
[urllib](http://docs.python.jp/2/library/urllib.html)
[sys](http://docs.python.jp/2/library/sys.html)
[Beautifulsoup](http://tdoc.info/beautifulsoup/)
HerokuのMongodbを直接操作する(Monglab編)


[ポスグレでやったように](http://qiita.com/master-of-sugar/items/887dc292c7155102c4d9)Mongodbを直接操作する。

##接続URLを取得して読み解く
```
heroku config | grep MONGOLAB_URI
```

`mongodb://`ではじまるURLが取得できるのでURLから情報を抜く。

```
mongodb://<接続ユーザー>:<パスワード>@<ホスト名>:<ポート>/<DB名>
```

##ターミナルから接続してみる
```
mongo <ホスト名>:<ポート>/<DB名>
```

```
MongoDB shell version: 3.0.6
connecting to: <ホスト名>:<ポート>/<DB名>
```

つながった。適当にmongoのコマンドを打ってみる。

```
db.posts.count()
```

```
2015-10-02T16:13:31.231+0900 E QUERY    Error: count failed: {
	"ok" : 0,
	"errmsg" : "not authorized on <DB名> to execute command { count: \"posts\", query: {}, fields: {} }",
	"code" : 13
}
    at Error (<anonymous>)
    at DBQuery.count (src/mongo/shell/query.js:326:11)
    at DBCollection.count (src/mongo/shell/collection.js:1046:27)
    at (shell):1:10 at src/mongo/shell/query.js:326
```

認証しないとダメみたい。

```
db.auth("<接続ユーザー>","<パスワード>")
```

`1`が返ってくればOK。もう一度試してみる。

```
db.posts.count()
0
```

接続できました。
goenvで"couldn't find any version specified for use"と言われる問題


## 現象発生手順
1. anyenv使ってインストールしたgoenvを利用し、go(version 1.5)をインストール
2. go global 1.5 と go shell 1.5 を実行
3. goコマンドを利用すると"couldn't find any version specified for use"と言われる

## 原因
go shell 1.5を実行した際、

```
export GOENV_VERSION="1.5"
```
とか表示されるが、実際にはexportできていない。
(おそらく、goenv内部で立ち上げたshellの中で実行してしまっている)

## 解決策
自分でGOENV_VERSIONを設定する。
適当に.bash_profileなり.zshrcなりに下記を追加。
(goのバージョン変えるたびに手動でGOENV_VERSIONを書き直さなければならないが...)

```
export GOENV_VERSION="1.5"
```
mysqlでユーザを作成

### mysqlでユーザを作成する

##### ルートで入って  

```
$ mysql -u root
```

##### ユーザを作成

```
mysql> create user 'hogehoge'@'localhost';
Query OK, 0 rows affected (0.00 sec)
```

※ ユーザ名は`16文字まで`

16文字以上にすると

```bash
String 'hogehogehogehogehoge' is too long for user name (should be no longer than 16)
```
となってしまう。

##### 確認

以下のように追加されている。

```
mysql> SELECT Host,User,Password FROM mysql.user;
+-----------------------------------+-----------------+----------+
| Host                              | User            | Password |
+-----------------------------------+-----------------+----------+
| localhost                         | root            |          |
| localhost                         | hogehoge        |          |
+-----------------------------------+-----------------+----------+
2 rows in set (0.00 sec)
```

##### 追記(2016.12.12)

mySQL5.7からpasswordが
authentication_stringに変わったらしく。

`SELECT Host,User,Password FROM mysql.user;` だと
エラーになります。

以下で確認できます。

```mysql
SELECT user, host, authentication_string FROM mysql.user;
```

参考：
http://stackoverflow.com/questions/30692812/mysql-user-db-does-not-have-password-columns-installing-mysql-on-osx
iOS9で起動しない問題

大分昔にリリースして放置してたiPhoneアプリなんですが。今回、新型iPhone6sを購入したお客様から起動しないという報告を受けたので調査しました。

iOS9のシミュレーターで確認したところ
Assertion failure in -[UIApplication _runWithMainScene:transitionContext:completion:]
の部分で例外が発生しています。これだけだとよく分からないので検索してみたら以下の記事を見つけました。
> http://stackoverflow.com/questions/30884896/application-windows-are-expected-to-have-a-root-view-controller-at-the-end-of-a

これに従い


``` 
[window addSubview:viewController.view];
```

を

```  
[window setRootViewController:viewController];
```

のように修正してiOS9でも起動できるようになりました。
Githubが結構色々なatomフィードを出せるので、連携で役に立ったりする


自分がオーナのリポジトリはサービス連携やらWebHookやら色々あるので、他との連携は容易です。
ただ、他所様のリポジトリの更新具合を見たり、何かが進んだら結合テストを流しておきたい時などに、とりあえずフィード購読からトリガーを作成できます。



|要素 |説明 |例 |
|----|----|----|
|releases |Githubに登録されたリリース |https://github.com/higanworks/sakurraform/releases.atom|
|wiki |Wikiの更新履歴 |https://github.com/fog/fog-sakuracloud/wiki.atom |
|{org or user}/{repo}/commits/{branch}|任意のブランチのコミットログ |https://github.com/higanworks/sakurraform/commits/master.atom|
|{org or user}/{repo}/commits/{branch}/{path_to_file}|任意のブランチで、特定ファイルに関わる更新を含むコミットログ |https://github.com/higanworks/sakurraform/commits/master/lib/sakurraform/version.rb.atom|


これで IFTTTでFeed購読 => 何か。が捗ります。最近作った連携はこんな感じ。

- リリースを
   - メールで自分におしらせ
   - CIのビルドをキック
- master更新を
   - DockerhubのAutoBuildをキック

他にも、見落としがちなWikiの更新をチャットに突っ込むとかで使えそう。

ちなみにアクティビティのタイムラインもフィードを出していて、ユーザ単位、Org単位、ひいてはGithubグローバル(!)なんかもあるけど、さすがにそれは範囲が広い。
Orgをうまいことフィルタすれば、特定リポジトリのIssueやPRをトリガにできるかも。(メールならwatchで十分ですが)


## プライベートリポジトリの場合

プライベートリポジトリからフィードを取ってくる場合は、今のところBasic認証の形式でユーザ名にTokenを使えばOK。

こうですね、

`https://{Personal access token}:@github.com/higanworks/circleci-private-sandbox/commits/master.atom`
SQLをコマンドラインから実行


```insert_user_data.sql
delete from users;
INSERT INTO  users(first_name, last_name, age) values
('田中', '太郎', '40'),
('田中', '太郎', '40'),
('田中', '太郎', '40');
```
以下で実行する。

PostgreSQLの場合

```
psql -U ユーザー名 DB名 -f 実行するファイル名
```

MySQLの場合

```
mysql [DB名] < 実行するファイル名
```
GKE(Google Container Engine) のContainer Registryでハマった話

# 概要
GKE（Google Container Engine）をでクラスターを構築し、Container Registry（GKEで使えるDockerのPrivate registry）に独自イメージをPush。
その後Podを作成するもうまく立ち上がらず、色々修正したりしてみたけどやっぱりうまくいかず。
さらに色々調べながらやったら最終的にはちゃんと動作したのだけど、結構ハマってしまったのでここに原因と対策を書き留めておこうと思います。

# ハマる
## やったこと
1. ローカルで`docker pull centos:7`してイメージをPull
2. `docker run -it --name cent1 centos /bin/bash `でターミナルを開いてコンテナ内部でNginx入れたりした
3. `docker commit cent1 asia.gcr.io/myproject/nginx`で構築済みのコンテナを独自イメージとして固める
4. `gcloud docker push asia.gcr.io/myproject/nginx`でGKEのContainer RegistryにイメージをPush
5. 作成しておいたクラスターにこれまた作成しておいたPod（ReplicationController）ファイルからPodを展開
6. PodがなかなかREADYにならず、RESTARTを繰り返す（あれ？おかしい。。。）

ちなみにPodファイルの中身は以下のようになっています。

```yaml:nginx-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx-rc
spec:
  replicas: 3
  selector:
    app: nginx-web
  template:
    metadata:
      labels:
        app: nginx-web
    spec:
      containers:
        - name: nginx-po
          image: asia.gcr.io/myproject/nginx
          ports:
            - containerPort: 80
```

## 原因
この手順を見てわかるように、この独自イメージはDockerfileから作ってないのです。
つまり、おそらくCMDはベースにしたcentosのイメージのまま。。。

`CMD ["/usr/sbin/init"] `

これがPodで起動したんですね。
ちなみにこれをバックグラウンドで起動してもコンテナはすぐ終了するので、

```
コンテナ作成
↓
コンテナ起動
↓
すぐ終了
↓
（GKEさんがきちんとお仕事をされて）コンテナを再生成
↓
コンテナ起動
↓
すぐ終了
↓
（GKEさんが、、、）
```

という挙動を繰り返したと思われます。

# さらにハマる
## やったこと
1. `docker build -t asia.gcr.io/myproject/nginx .`で独自イメージをDockerfileからビルドしてイメージを作成（CMDもつけてNginxが起動するようにした）
2. 先ほどPushしたイメージはいらないのでContainer Registryから削除（GUIで消した）
3. `gcloud docker push asia.gcr.io/myproject/nginx`で再度Container RegistryにイメージをPush
4. クラスターはそのままでPodを展開
5. やはりPodはなかなかREADYにならず、RESTARTを繰り返す（あれあれ？やっぱりおかしい。。。）

## 原因
色々調べてみると、Kubernetes（GKEが使っている仮想コンテナを制御するサービス）のドキュメントにこんな一文がありました。

```
all pods can use any images cached on a node
```

つまり、Nodeにキャッシュされたイメージを使っていたらしいです。

これを回避する為に`imagePullPolicy`というのがあるので、それを以下のようにPodファイルに定義してあげると無事解決しました。

```yaml:nginx-rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx-rc
spec:
  replicas: 3
  selector:
    app: nginx-web
  template:
    metadata:
      labels:
        app: nginx-web
    spec:
      containers:
        - name: nginx-po
          image: asia.gcr.io/myproject/nginx
          imagePullPolicy: Always  ## この行を追加
          ports:
            - containerPort: 80
```

※ Note
imagePullPolicyを設定しなくてもimageにlatestタグを定義してあげるとデフォルトがAlwaysになるみたいです。

# おさらい
* Podに配置するイメージは適切なCMD（またはENTRYPOINT）を定義したDockerfileからビルドしたイメージを使いましょう。
* デフォルトではPodはNodeにキャッシュされたイメージを使うので、**更新が頻繁にあるのなら**imagePullPolicyを設定するか、latestタグを指定した方が良いでしょう。（更新がほぼないなら当然キャッシュを使ったほうがいいのでそこは良しなに判断して下さい）

# 最後に
この手のトラブルはググってもあまり出てこず、ここまで解明するのに結構時間を使ってしまったのでポストしておこうかと思いました。（そもそもこんなハマり方は普通しないのかも。。。）
もし誰かのお役にたったら嬉しいです。

おわり
RewriteCondのANDとORの優先順位

そもそもそんなのが必要なRewrite設定を書く必要があるシチュエーションを避けたいって話もあるが、必要なときもあるので覚書として書いとく。

# ORの方がANDより強い
結論から言うと以上。


## 例えば

↓これは `(A or B or C) and D` の意味。

```
RewriteCond A [OR]
RewriteCond B [OR]
RewriteCond C
RewriteCond D
RewriteRule xxx
```

↓これは `(A or B) and (C or D)` の意味。

```
RewriteCond A [OR]
RewriteCond B
RewriteCond C [OR]
RewriteCond D
RewriteRule xxx
```