OmniAICreator/Qiita-1.07M huggingface dataset:
Kerasでネットワークの可視化@jupyter lab

# はじめに
Kerasの勉強中、Kerasでネットワークの可視化が出来るという話が合った。
参考は下記のサイト
http://dev.classmethod.jp/machine-learning/introduction-keras-deeplearning/
出来るといろいろ便利かなと思いチャレンジしてみました。
#環境
Ubuntu16.04
Nvidia-Docker（tensorflow/tensorflow:latest-devel-gpu-py3イメージ）
# 手順
可視化をするには以下のコマンドを実行すれば行けるらしい

```
brew install graphviz
pip install pydot
```
ってMacの場合か…こちらの環境ではもちろんUbuntuなのでgraphvizのインストールは下記のコマンドで

```
pip install graphviz
```
早速jupyter lab上でインポートしてみる成功。

```python
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
SVG(model_to_dot(model).create(prog='dot', format='svg'))
```

…インポートエラー発生！！pydotがインポートできていないとの事。（ここら辺のエビデンス取り忘れたのであとで更新します）
出来ない…色々調べたところ、下記のサイトのコメント通りにやるとうまくいった
https://github.com/Theano/Theano/issues/1801
どうやらTheanoのバグらしい…

```
#C版のgraphvizインストール
$ apt-get install graphviz
$ pip install pydot
#python版のgraphvizインストール
$ pip install graphviz
```

これでインポート…うまくいった。
モデルも(サンプルのだけど）うまく読み込めた…。
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/189407/5edccbb5-88d8-9550-509d-1ebf0143d5a6.png)
fullpage.jsを使ったページでセクションをスキップさせる

フルスクリーンで段落ごとに見せていくので定番のjQueryプラグインのfullpage.js
https://alvarotrigo.com/fullPage/

デフォルトでは対応してないが、
レスポンシブにして、
スマホのときだけセクションを増やしたい、という仕様があり、
PCのときは、セクションを display:noneとか height:0で隠しておいて、
スマホのときだけ表示させる、というのをした。


しかしPCのときは、非表示セクションへ一回移動してしまうので、（スクロールせずナビゲーションだけが進んでしまう）
非表示セクションはスキップさせる必要がある

（ナビゲーションのドットはcssでPCサイズのときのみ
　#fp-nav ul li:nth-child(2)　とかで消しておく）

##エラーが出てしまいダメだったコード
```js
//セクションの2番目をスキップさせる
    $('#fullpage').fullpage({
      onLeave: function(index, nextIndex, direction){
        if(PCのときだけ){ //なんか分岐判定用の変数とか使ってください
          if(index == 1 && direction == "down"){
            //セクション1から下に移動するときにセクション２を飛ばしてセクション3に
            $.fn.fullpage.moveTo(3);
          }
          if(index == 3 && direction == "up"){
            //セクション3から上に移動するときにセクション２を飛ばしてセクション1に
            $.fn.fullpage.moveTo(1);
          }
        }
      }
    });
```

onLeave のとき $.fn.fullpage.moveTo(セクション)
を実行すると、実行タイミングがよろしくないのかエラーが出てしまう、
そこで、実行タイミングを少しズラした

##大丈夫だったコード
```js
    $('#fullpage').fullpage({
      onLeave: function(index, nextIndex, direction){
        if(PCのときだけ){
          if(index == 1 && direction == "down"){
            setTimeout(function(){$.fn.fullpage.moveTo(3);},10);
            //setTimeoutを追加
          }
          if(index == 3 && direction == "up"){
            setTimeout(function(){$.fn.fullpage.moveTo(1);},10);
            //setTimeoutを追加
          }
        }
      }
    });
```
これだけでエラーをださずにスキップさせる動作が出来ました
bigqueryで大量データ処理する時のオプション

業務で一部のログはbigqueryに保存しているんですが、少量のデータならWebUI上でサクッと取得ができるのですが、大量データとなるとコマンドライン上でバッチジョブを動かす必要があり、そのオプションをいつも忘れるので、備忘録として残しておきます

## allow_large_resultsとdestination_table

クエリ結果が最大レスポンスサイズを超える場合に、`--allow_large_results`を指定し、`--destination_table` + テーブル名で結果セットの保管先を指定します。

```
$ bq query --destination_table '[DATASET].[TABLE_NAME]' --allow_large_results "[QUERY]"
```

### バッチクエリを利用する

`--batch`を指定することで、バッチジョブとして、クエリを実行します

上記を組み合わせて、レスポンスサイズが大きい場合、バッチジョブとして、クエリを走らせ、結果をテーブルとして保管するようにすると、データを操作しやすくなります。

```
$ bq query --nosync --batch \
--destination_table [DATASET].[TABLE_NAME] \
--allow_large_results "[QUERY]"
```

### テーブルデータをGCSにエクスポートする

bigqueryのテーブルデータはGCSにエクスポートできるので(CSV,JON,AVRO)、他のデータストア(RDBMSやElasticSearch等)に集計結果を移行する場合等、GCSに一度エクスポートすれば可能になります。

```
$ bq extract --destination_format=[CSV | NEWLINE_DELIMITED_JSON | AVRO] [DATASET].[TABLE_NAME] gs://[BUCKET_NAME]/[FILENAME]
```

FILENAMEの箇所はワイルドカードを使用すると、自動でパーティション分割をしてくれます。

## 番外編: csvデータをbigqueryにインポートする

大量クエリとはまた別ですが、インポートコマンドのドキュメントも別ページになっていて忘れがちなので...

```
$ bq load babynames.names2010 yob2010.csv name:string,gender:string,count:integer --skip_leading_rows=1
```

`--skip_leading_rows`オプションで先頭から指定した行数をスキップする

- JSONの場合

```
$ bq load --source_format=NEWLINE_DELIMITED_JSON [DATASET].[TABLE_NAME] [PATH_TO_SOURCE] [SCHEMA]
```

- [データの読み込み](https://cloud.google.com/bigquery/loading-data?hl=ja)

## 公式マニュアル

- [bq コマンドライン ツール](https://cloud.google.com/bigquery/bq-command-line-tool)
- [データのエクスポート](https://cloud.google.com/bigquery/docs/exporting-data?hl=ja)
Facebook marketing API を使ったツールを作るときにトークンで苦労したのでメモ

## トークンについて
- https://developers.facebook.com/docs/facebook-login/access-tokens
- FB marketing APIのコールにはトークンが必要
- APIに利用できそうなトークンはユーザートークンとアプリトークンの2種類
- ユーザートークンは期限付きなので、アプリトークンを使用することにした

### アプリトークン
  - 取得方法は[デベロッパーページ](developers.facebook.com)ページのコンソールに記載
    - "app_id|app_secret" がトークンとして使える    
    - 詳しくいろいろ書いてある: https://gist.github.com/xl1/fe779a817a9d4938193d
  - 無期限で有効
  - developersの登録画面から、審査申請をする必要あり
    - その際に ads management basic Accessの設定をする必要あり(これが面倒)
    - https://developers.facebook.com/docs/marketing-api/access#basic
  - 期限気にしないならユーザートークンがおすすめ

### ユーザートークン
  - 取得方法はFBログイン的なやつ
  - ユーザーのid, passが必要
  - ad権限は自力で付与できるのでサクッとトークン取得できる
  - 2ヶ月の期限付き
  - 期限付きしか発行できないので今回は使わない
  - 後述する[API確認ツール](https://developers.facebook.com/tools/explorer/)で確認するときは、ユーザートークンを選択して ad_managers 権限を付与してあげれば確認できる

## その他
- APIの動作確認はAPI確認ツールが便利
  -  https://developers.facebook.com/tools/explorer/
- Tokenの確認にはアクセストークンデバッガが便利
  - とりあえずトークン入れてdebugボタン押せば状態がわかる
  - https://developers.facebook.com/tools/accesstoken/
d3.jsで棒グラフを描く　その４（アニメーション）

## はじめに
[d3.jsで棒グラフを描く　その３（軸）](http://qiita.com/nobuyuki-ishii/items/b470b42e7a2ffe4fe6bf)の続きです。
[前回作成したプログラム](https://jsbin.com/gidizuf/2/edit?html,js,output)にアニメーションを追加します。

## アニメーションの追加
transitionとdurationを使って、アニメーション棒グラフの描画をアニメーションします。棒グラフの高さを0に設定し、transitionとdurationを挟むと、以下に設定した状態にアニメーションします。

```js
svg.selectAll("rect")
    .data(dataset)
    .enter()
    .append("rect")
    .attr("x", function(d, i) {
      // dがデータ、iが添え字
      // 棒グラフのx開始点をずらす
      // 棒グラフがくっつかないようにする
      return i * (BAR_W + 1) + W_PADDING;
    })
    // アニメーションのために追加
    .attr("height", 0)  // 高さ0
    .attr("y", H + H_PADDING)  // yがの位置
    .transition()  // アニメーションする
    .duration(500)  // 500ミリ秒かけて以下の状態にする
    // 追加ここまで
    .attr("y", function(d, i) {
      // 開始点を全体高さから高さを引いた値とする
      return H - scale(d[1]) + H_PADDING;
    })
    .attr("width", BAR_W)
    .attr("height", function(d) {
      // データ配列の１コ目を高さとする
      return scale(d[1]);
    })
    // グラフの色設定
    .attr("style", "fill:turquoise");
```

[ここまでを実行](https://jsbin.com/papilav/edit?js,output)

delayを使うと、棒グラフごとに描画タイミングをずらすことができます。もっといい感じになります。

```js
svg.selectAll("rect")
    .data(dataset)
    .enter()
    .append("rect")
    .attr("x", function(d, i) {
      // dがデータ、iが添え字
      // 棒グラフのx開始点をずらす
      // 棒グラフがくっつかないようにする
      return i * (BAR_W + 1) + W_PADDING;
    })
    // アニメーションのために追加
    .attr("height", 0)  // 高さ0
    .attr("y", H + H_PADDING)  // yが0
    .transition()  // アニメーションする
    .duration(500)  // 500ミリ秒かけて以下の状態にする
    .delay(function(d, i) {
      return i * 50;  // アニメーションの開始を50ミリ秒ずつずらす
    })
    // 追加ここまで
    .attr("y", function(d, i) {
      // 開始点を全体高さから高さを引いた値とする
      return H - scale(d[1]) + H_PADDING;
    })
    .delay(function(d, i) {
      return i * 50;
    })
    .attr("width", BAR_W)
    .attr("height", function(d) {
      // データ配列の１コ目を高さとする
      return scale(d[1]);
    })
    // グラフの色設定
    .attr("style", "fill:turquoise");
```

[ここまでを実行](https://jsbin.com/pegejeb/edit?js,output)

以上で、d3.jsを使った棒グラフ描画を終わります。
沈黙シリーズで一番評価が高いのは「沈黙の戦艦」で、一番評価が低いのは「沈黙の激突」ということが棒グラフで見やすく、分かりました。
d3.jsで棒グラフを描く　その２（スケール）

## はじめに
[d3.jsで棒グラフを描く　その１](http://qiita.com/nobuyuki-ishii/items/2915692f39c5ea58349b)の続きです。
[前回作成したプログラム](https://jsbin.com/nidacij/edit?js,output)にスケールを適用します。
表示領域の高さが100として、100以上の値を持つ棒グラフを表示するとしたら、どうするでしょうか。全体が高さ100以内に収まるよう比率で値を求めますよね。スケールは、実際のデータを表示領域に合った値へ変換してくれる仕組みです。

## スケール
スケールを宣言します。domainに変換前の値の最小値と最大値を設定し、rangeに変換後の値の最小値と最大値を設定します。
このスケールを使うと、5は50、10は100に変換してくれます。

```js
// スケールの宣言
var H = 100;

var scale = d3.scale.linear()
              .domain([0, 10])
              .range([0, H]);
```

## スケールの適用
高さを設定していたところを、先ほど宣言したscale関数に置き換えます。

```js
svg.selectAll("rect")
    .data(dataset)
    .enter()
    .append("rect")
    .attr("x", function(d, i) {
      // dがデータ、iが添え字
      // 棒グラフのx開始点をずらす
      // 棒グラフがくっつかないようにする
      return i * (BAR_W + 1);
    })
    .attr("y", function(d, i) {
      // 開始点を全体高さから高さを引いた値とする
      //return H - d[1] * 10;
      return H - scale(d[1]);
    })
    .attr("width", BAR_W)
    .attr("height", function(d) {
      // データ配列の１コ目を高さとする
      // わかりにくいので、値を10倍
      // return d[1] * 10;
      return scale(d[1]);
    })
    // グラフの色設定
    .attr("style", "fill:turquoise");

// テキストの追加
svg.selectAll("text")
    .data(dataset)
    .enter()
    .append("text")
    .text(function(d) {
      return d[1];
    })
    .attr("text-anchor", "middle")
    .attr("x", function(d, i) {
      return i * (BAR_W + 1) + 10;
    })
    .attr("y", function(d) {
      //return H - d[1] * 10 + 15;
      return H - scale(d[1]) + 15;
    })
    .attr("font-size", "10px")
    .attr("fill", "white");

```

[ここまでを実行](https://jsbin.com/velaki/edit?js,output)
見た目は変わりませんが、スケールを使って表示をしています。

高さを変えてみましょう。

```js
//var H = 100;
var H = 200;
```

[ここまでを実行](https://jsbin.com/rojapuv/edit?js,output)
全体が崩れることなく、高さを変更できました。
次は、[d3.jsで棒グラフを描く　その３](http://qiita.com/nobuyuki-ishii/items/b470b42e7a2ffe4fe6bf)で、軸を追加します。
[Pythonによる科学・技術計算] 3次スプライン補間，scipy

**scipy.interpolateのinterp1dメソッド**を利用して3次スプライン補間を行う。

###内容
例題:$y=1/(1+x^2)$を考える。11点のデータセット$(x_i, y_i)$をサンプルし，補間する。
この関数は，ラグランジュ補間ではうまくいかない([Qiita記事](http://qiita.com/sci_mofy/items/4b220d3a67c730ff08dd)を参照)。



```py3

from scipy.interpolate import interp1d
import numpy as np
import matplotlib.pyplot as plt

x =np.linspace(-5,5,num=11)
y = 1.0/(1.0+x**2)
f_line = interp1d(x, y)
f_CS = interp1d(x, y, kind='cubic')  #3次スプライン補間実行！

#for plot

xnew =np.linspace(-5,5,num=51)
plt.plot(x, y, 'o',   xnew, f_CS(xnew), '-')
plt.legend(['Raw data','Lagrange', 'Cubic spline'], loc='best')
plt.xlim([-6, 6])
plt.ylim([0, 1.4])
plt.show()

```

###結果

![t.png](https://qiita-image-store.s3.amazonaws.com/0/192457/efb627da-329b-8b83-b286-9d7911e25d56.png)
青印がサンプルした11個のデータ点。オレンジ線がスプライン補間したもの。


###[補遺]
以下の図で示されるように，ラグランジュ補間ではこの関数をうまく補間できない。

![t2.png](https://qiita-image-store.s3.amazonaws.com/0/192457/13decdf3-d26c-6acf-9d6a-bdca824cdd40.png)
青印がサンプルした11個のデータ点。オレンジ線がスプライン補間，緑線がラグランジュ補間したもので，両端近傍で不自然な振動を起こす。
emmetでselectタグのoptionを連番で作成


``option[value="$"]{$}*12``

これを展開すると以下になる。

```html
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
```
Struts2→SpringMVCへの移行( Controller編 )

# Struts2からSpringMVCへ移行する際の前提

一番簡単な手順としては、

* Struts2にSpring-pluginを導入しておき
* Struts2のConventionプラグインを使ってActionクラスを書き
* Struts2のActionクラスから実行するロジックをSpring framworkの管理下においてから
* Strut2のActionをSpringMVCのControllerに置き換えます

他にも置き換えるものとして、Validation、View、Interceptorがありますが、それらは一応Struts2から独立したモジュールにできますので、順次置き換えもできます。今回はController編。

## Actionクラスの前提

Struts2のActionクラスは、**Conventionプラグインを利用して、アノテーションで記載するのが前提** です。Conventionプラグインを導入していない場合は、まずConventionプラグインを適用してActionクラスにStruts2のアノテーションを記載してください。

[Struts2公式：Convention Plugin : https://struts.apache.org/docs/convention-plugin.html](https://struts.apache.org/docs/convention-plugin.html)
[Qiita:アノテーションベースでStruts2のActionクラスを記述する(2016 Spring Ver.) http://qiita.com/alpha_pz/items/4a97df916102dad2e2bc](http://qiita.com/alpha_pz/items/4a97df916102dad2e2bc)

## Convention適用後のActionクラス

以下のようにActionクラスの実装は、

* Web層との入出力
* 画面遷移
* ロジックの呼び出し

だけに留めます。

```java:DisplayListAction.java 
// Struts2-Convention
@Namespace("/")        // (1)
@ParentPackage("struts-thymeleaf")
@Results({@Result(name=ActionSupport.SUCCESS,type="thymeleaf-spring",location="list")})        // (3)
// Spring framework
@Controller
@Scope("prototype")
public class DisplayListAction extends ActionSupport {

    @Action("list") // Struts2-Convention        // (2)
    public String execute() throws Exception {
        products = service.search(param);
        return SUCCESS;
    }

    @Autowired // Spring framework
    ProductService service;

    @Setter        // (4)
    private String param;

    @Getter @Setter // Lombok        // (5)
    List<SampleProduct> products;
}
```

ここまで絞りきれば、SpringMVCのControllerに置き換えることができます。

## SpringMVCのControllerへ

```java:DisplayListController.java
@Controller
@RequestMapping("/")        // (1)
public class DisplayListController {

    @GetMapping("list")        // (2)
    public ModelAndView index(@RequestParam String param, ModelAndView mnv) {        // (4)
        List<SampleProduct> products = service.search(param);

        mnv.addObject("products", products);        // (5)
        mnv.setViewName("/list");        // (3)

        return mnv;
    }
}
```

こうすると、1対1のマッピングが可能です。

|#|設定内容|Struts2 Convention|Spring MVC|
|:---|:---|:---|:---|
|1|パス|@Namespace|@RequestMappings|
|2|制御部のパス|@Action|@GetMapping,@PostMappingなど|
|3|表示View|@Results,@Result|ModelAndViewのview名 または View名を単独でreturn|
|4|受け取るパラメータ|メンバ変数＋ミューテタメソッド(※1)|メソッドの引数|
|5|レスポンスする内容|メンバ変数＋アクセサメソッド(※2)|メソッドの戻り値|

※1 : いわゆるprivateフィールドとsetメソッド
※2 : いわゆるprivateフィールドとgetメソッド

移行するために大事なことは、Controller-Serviceの関係をSpringMVCにならってAction-Serviceの関係に持っていくこと、Actionクラスのフィールドで扱っていたリクエスト・レスポンスするオブジェクトをControllerのメソッドに持っていくことです。
新人プログラマーだった自分が2年間でやってきたこと、伝えたいこと

# はじめに

いやー夏ですね。社会人になって3度目の夏がやってきました
もうすごく蒸し暑くて、天然サウナか！って思いながら涼しい部屋で日々ソースコードと戯れています

今回は新卒でIT企業に就職してから2年と少しを振り返ってみて、あのときの新人プログラマーだった自分に聞かせてやりたいな～っと思ったことを書いていこうと思います

## 本題の前に筆者のスペック

- 大学は教育系
- 途中で教員を諦め、IT企業に就職
- プログラミングなんてほぼやったことなかった
- 今は、主にJavaScript(Node.jsとかTypeScriptとか)や少しPythonを書いたりしている
- AWSにかなりお世話になっている。好きなサービスは「Lambda」
- 最近SORACOMにも手を出し始めた

## さて、本題

ここからはあくまで個人の見解や偏見が入っておりますので、ご了承ください

### 問題を分解しよう(問題の切り分け)

エラーが出たところだけを見るのではなく、ほかの関連部分にも目を向けてください
本当にその箇所でエラーが出ているのか？ほかの部分と関係してエラーになっているのか？
問題を分解して、本当に調べないといけない箇所を見つけましょう
といっても、とりあえずエラー文でググるというのもアリだとは思います

### そして調べよう

コーディング中に壁にぶち当たるとこは多いでしょう。そんなときはまずネットに転がっている先人たちの知恵を借りましょう。同じようなことで困っているプログラマーが必ずいるはずです。そして、そこに解決方法が書いてあることでしょう
Google先生は偉大です。そんな先人たちの知恵を少しのキーワードでこれか？こっちか？って出してきてくれます
(QiitaとかStack over flowとか)

### 英語を恐れるな

筆者は極度の英語嫌いで(今はだいぶ改善されているはず)、英語の記事はとことんスルーしていました。でもよく考えてください。日本人より英語圏の人のほうが多いに決まっているではないですか。そら日本語の記事よりも英語の記事のほうが数が多いので情報量も豊富です
(まだ同業者で「英語なんて読めなくても･･･(ry」なんて人がいたりしますが)

### でもわからない･･･

いろんな情報を貪っても解決策が見つからない･･･なんてこともあると思います。そんなときは身近にいる「できる人」に助けを求めましょう
でもただ「ここが動かない」とか「こんなエラー文が出る」といった質問をしてはいけません。「できる人」は神様ではないのですから、質問された側からすると、「で？」となるわけです
「こんなことがしたくて、こうしてみたんですけど、こんなエラーが出て、ここが問題だと思ったんですがエラーが直らないです･･･」のように、自分がやりたい目的やその方法などできるだけ多くの情報を伝えてあげてください。そうすれば、聞かれた側はそのエラーの原因を想定しやすくなります
「できる人」は自分よりもはるかに経験が豊富である場合がほとんどです。詳しく説明すると「あーそれ私も引っかかったわーw」などと言って、さらっと解決方法を教えてくれます

### 調べる時間を決めておこう

まず自分で調べろといっても、永遠に調べていては一向にプロジェクトは進みません。「10分間調べてみよう」などと期間を決めて調査します。それでも解決策が見出せなかった場合は「できる人」に聞いてみましょう

### 自分が納得いくまで要件を聞こう

プロジェクトやタスクを着手する前に、必ず自分の中で納得いくというか、完成形がはっきりしてから着手するようにしましょう
何度も聞くとどんどん聞き辛くなるでしょうから、できれば一回目で思いっきり質問しましょう。そして自分の中で完成形を構築し共有しましょう
そうすれば作った後に「そうじゃなかったのに･･･」みたいな惨事を回避することができます

### いろんな人と関わりを持とう

勉強会やセミナーを通して、同業者だけでなくいろんな業界の人と交流を持ちましょう。そうすると自身のスキルアップにつながるだけでなく、さらなるイノベーションにつながったりするかもしれません
また、Qiitaなどで記事を投稿し発信することで交流が広がったりするかもしれません
少なくとも私の知っている「できる人」は、このようなことを積極的に行っています
(筆者はまだまだこういうことができてませんが･･･)

### 決して挫けるな

仕事をしていると理不尽極まりないことを言われたり、ミスをして怒られたりすることもあるでしょう。でも挫けないでください。挫けそうになったら周りを見渡してください。自ら発信してください。助けてくれる人がいるかもしれません
（世の中には鉄？鋼？のメンタルの持ち主がいたりしますが、それは例外です）

### 仕事は楽しんだもの勝ち

最後に、仕事は楽しんだもの勝ちだと思っています。せっかくやるなら楽しくやりたいですしね
ただこれは周りの環境が大きく関わってきますので、2年間いろいろあって、気づいたらそういう環境にいれた筆者は幸せ者だと思いますね

ではまた！
macOSにMAMPをインストールしてみた

##環境
```
インストールしたOS
macOS Sierra
ver: 10.12.6（16G29）
```
```
インストールした日
2017/7/20
```

##先ずはMAMPのHPにアクセスして、インストーラをダウンロード

URLにenとあるのでjpに変えてみましたが、ドイツ語と英語しかないようです

MAMP↓
https://www.mamp.info/en/

![スクリーンショット 2017-07-20 16.21.47.png](https://qiita-image-store.s3.amazonaws.com/0/190178/bdccbb1d-9cf5-436d-4d53-4a402c2093ee.png)


すると、ダウンロード画面に移ります。
有料のMAMP PROだと、PHPのバージョンを指定できるようですね。
今回は、Free版をインストールしてみます。

<img width="1207" alt="スクリーンショット 2017-07-20 16.31.14のコピー.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/40718763-28ca-5128-f0d3-99ff0ee5909b.png">


ダウンロードが完了したら、ダウンロードのディレクトリに移動して、pkgファイルを開きます

<img width="763" alt="スクリーンショット 2017-07-20 16.43.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/1fbf8e01-7bd7-04c1-0a61-80f21b15c871.png">

インストーラが開いたら、画面の指示に従って、進んでいきます

<img width="616" alt="スクリーンショット 2017-07-20 16.44.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/041bff41-bd44-a566-6a06-d9c92f1d9a33.png">


<img width="611" alt="スクリーンショット 2017-07-20 16.44.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/72c838ff-7676-0058-aab1-e934fc459275.png">

<img width="612" alt="スクリーンショット 2017-07-20 16.44.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/435942ef-4e69-57c8-cd7a-4475ce347fdf.png">


<img width="615" alt="スクリーンショット 2017-07-20 16.45.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/08a91810-8e6b-c686-e3ea-0eee6b02f9ab.png">

で、この画面で、ちょっと待った。
よく見ると、「カスタマイズ」を見つけたので、クリックしてみます。

<img width="617" alt="スクリーンショット 2017-07-20 16.45.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/cf838779-b75a-e902-7892-e6c01afc0d96.png">

デフォルトで、MAMP PROインストーラが入っているので、必要ない人は、チェックを外します
そして、「インストール」をクリック

<img width="618" alt="スクリーンショット 2017-07-20 16.46.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/7c702903-2e9c-43a2-20ae-97e109daafb5.png">

すると、インストール時のユーザーパスワードを聞いてくるので入力。
その後は、１〜２分でイントールが完了しました。

<img width="619" alt="スクリーンショット 2017-07-20 16.47.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/090c9d3f-d478-2f6f-ec02-bdfc0b4969a7.png">


##MAMPを起動して見る

右上の虫眼鏡スポットライトから、mampと打つと、ちゃんとインストールされていれば、mampが見つかるはず。

<img width="879" alt="スクリーンショット 2017-07-20 16.57.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/a56bb466-b072-c7c6-0b7e-afe2d43f4e5f.png">


開いて、下記のような画面が出てきたら、インストール成功

<img width="532" alt="スクリーンショット 2017-07-20 16.58.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/aec0787b-d89d-26da-7a9b-9702313331c2.png">


ポート番号の設定は、歯車マークをクリックして、ポートタブから行う。

<img width="522" alt="スクリーンショット 2017-07-20 17.10.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/190178/1055e9d0-a761-79e7-974b-4aef23d4f6c9.png">

8888は、MAMPオリジナルのポート番号なので、HTTPポートにセットしたい人は、「Set Web & MySQL ports to 80 & 3306」をクリックすれば良い。簡単。


これで終了！
１０分もかからず、インストール完了だ。簡単。

ただし１点注意。デフォルトの設定では、phpは7.1だが、それだとphpMyAdminが動かない。php7.0に変更すれば、phpMyAdminが使えるようになるみたいだ。
MEAN環境を勉強してみる備忘録2 

※前提として、自分の記録としての記事です。

# レガシー環境な弊社。
CMS的なものを導入していないこともあるので、とりあえず私に出来そうなこととして、お客様帖をつくってみる。

# -5からのスタート
## Node + Express + MongoDB
たいしたデータも入れる予定がないし、Joinも少ないので、ちょうど勉強中でもあるし、MongoDBを採用。

## RDB脳から脱却できず。
初めての試みでもあるので、とりあえずこんなデータ構想かな？というのをastahちゃんでゴリゴリ書いてみる。
![図](https://qiita-image-store.s3.amazonaws.com/0/29160/78549b04-e58b-6944-6561-b65fe7c60c9a.png)
なんとなーくこんなかんじ。

RDB脳から離れてはいない感もりもりだが、このイメージでいることにする。

## MongoにDBを作成
とりあえずデータを入れ込むためにターミナルを起動し、mongoに接続。
`mongo`
とな…。

さて、とりあえずこのDBをつくるために
`> use sales_managaer`
とか入力して、実行
`switched to db sales_managaer`
と帰ってくれば成功。
一度mongoをExitしてByeする。

## MongoにImport
次に、jsonファイルのデータをMongoに入れ込む作業をしてみる。
用意したJSONファイルはこんな感じ。
いろいろ突っ込みどころはあるとは思うが、学習用でもあるのでご愛嬌。

```json:users.json
[
  { "name": "Admin", "mailaddress": "1@test.co.jp" , "password": "password1" },
  { "name": "User1", "mailaddress": "2@test.co.jp", "password": "password2" },
  { "name": "User2", "mailaddress": "3@test.co.jp" , "password": "password3"},
  { "name": "Doctor1", "mailaddress": "4@test.co.jp" , "password": "password4"},
  { "name": "Doctor2" , "mailaddress": "5@test.co.jp", "password": "password5"}
]
```
出来たファイルをVagrantのWorkspaceに設置し、

```
mongoimport -h localhost:27017 --db sales_manager --collection users --drop --jsonArray --file /vagrant/workspace/users.json 
```
と実行。

```
2017-07-20T07:56:38.909+0000    connected to: localhost:27017
2017-07-20T07:56:38.909+0000    dropping: sales_manager.users 
2017-07-20T07:56:40.321+0000    imported 5 documents
```
なんて、入れ込んだレコード数がちゃんと帰ってくれば成功ではあるんだけど、念のため確認はしてみたい。

一度、Mongoに入ってデータの有無の確認。
```
mongo
use sales_manager
db.users.find()
```
と入力して、入れ込んだデータが帰ってきたら成功。

よしよし。
この調子で他のテーブルのデータもいれこんでみる。

テーブルといっている段階でもうRDB脳から離れていない感が満載だが、
これもまたよし。

躓くのはこの後、Expressでのアプリ作成なのであった…。
Get,GetGetGetWildAndTough! bash版

# コード
https://github.com/fk2000/getwild-bash/blob/master/getWildAndTough.sh

# 出力
```bash:getWildAndtough.sh
 $ ./getWildAndTough.sh の出力結果
Get
Get
and
Get
Get
Wild
Wild
and
Get
Get
Wild
Get
Wild
Get
Wild
Wild
and
Get
and
Get
Wild
Get
and
and
and
Get
Wild
and
Tough

```

# なにこれ？

この街でやさしさに甘えていたくはない

# 仕様

「Get」 「Wild」 「and」 をランダムに出力します。
「Get Wild and」の順に出力されたら「Tough」と出力して終了します。

# 元ネタ
http://qiita.com/Momiji0223/items/eec45a13e60da1b22b49
Poisson回帰メモ

```math
p(y|\lambda) = \frac{\lambda^y \exp(-\lambda)}{y!}
```

```math
L = \log\left(\prod_i p(y_i|\lambda_i)\right)
```


```math
L = \sum_i \log( p(y_i|\lambda_i) )
```


```math
L = \sum_i y_i \log(\lambda_i) - \lambda_i + \mbox{cont}
```


```math
\log(\lambda) = {\bf w} \cdot {\bf x} + b
```

```math
L = \sum_i y_i ({\bf w} \cdot {\bf x}_i + b) - \exp({\bf w} \cdot {\bf x}_i + b) + \mbox{cont}
```

## Gaussian prior

wにgaussian priorを入れる

```math
L = \sum_i y_i ({\bf w} \cdot {\bf x}_i + b) - \exp({\bf w} \cdot {\bf x}_i + b) 
 - c \ |{\bf w}|^2
```

## オフセット項を入れる

```math
L = \sum_i y_i ({\bf w} \cdot {\bf x}_i + b + \log A_i) - \exp({\bf w} \cdot {\bf x}_i + b + \log A_i) 
 - c \ |{\bf w}|^2
```


で
Lを最大化
Delphi で Android の輝度を変更する

端末上に表示されたバーコードなどを読み取るアプリでは、画面が暗いと読み取れないことが多いです。
このような場合、アプリ側でデバイスの輝度を上げて明るくするという手法が行なわれています。

Delphi で輝度を制御するには [WindowManager.Layoutparams](https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html) を使用します。

##サンプルコード
フォーム上にボタンを１つ置き

- ボタンを押すと輝度を最大にします。
- 再度押すと輝度を最小にします。

という処理を記述しています。(Nexus 5, Android 5.1.1で確認)

```delphi
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  Androidapi.JNI.GraphicsContentViewText, FMX.Controls.Presentation,
  FMX.StdCtrls, Androidapi.Helpers, Androidapi.Jni, Androidapi.JNI.App
  ;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { private 宣言 }
    jp: JWindowManager_LayoutParams;  // WindowManager.LayoutParams
    sw: Boolean;  // 単純にスイッチ
  public
    { public 宣言 }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if sw then begin
    //輝度を最小に
    jp.screenBrightness := TJWindowManager_LayoutParams.JavaClass.BRIGHTNESS_OVERRIDE_OFF;
    sw := False;
  end else begin
    //輝度を最大に
    jp.screenBrightness := TJWindowManager_LayoutParams.JavaClass.BRIGHTNESS_OVERRIDE_FULL;
    sw := True;
  end;
  //セットされた輝度を反映
  TAndroidHelper.Activity.getWindow.setAttributes(jp);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  jp := TAndroidHelper.Activity.getWindow.getAttributes; // 現在の輝度の状態を取得
  sw :=True;  // スイッチ初期化
end;

end.

```
MySQLのtimezoneの設定


```bash
/usr/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo > ~/timezone.sql
```

```bash
mysql -u root -p -Dmysql < ~/timezone.sql
```

```bash
vi /etc/my.cnf
```

```shell-session:my.cnf
[mysqld]
default-time-zone = 'Asia/Tokyo'
```

```bash
service mysqld restart
```

```mysql
show variables like '%time_zone%';
```

```shell-session
mysql> show variables like '%time_zone%';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | JST        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
```

自分用のメモでコピーしました。
[ありがとうございます。](http://qiita.com/tailak/items/63dce2dd7dfe049b038e)
Magento2を動かす

# Magento2をMacのPHPで動かしたい。

なんかDockerで動くやつとかはある。
とはいえ諸々面倒だったり、自分でディレクトリとかハンドルしづらい。

## MySQLを起動させる
普通にSupervisordで起動する。

```
[program:mysql]
command=/usr/local/mysql/bin/mysqld
stdout_logfile=/var/log/supervisor/mysql/access.txt
stdout_logfile_maxbytes=1MB  
stdout_logfile_backups=10    
stderr_logfile=/var/log/supervisor/mysql/error.txt
stderr_logfile_maxbytes=1MB  
stderr_logfile_backups=10    
autostart=true
autorestart=true
user=mysql
```

インストールとかその辺はまあいい感じにやる。

## PHP7を入れる
この辺はまあ別の記事で適当に。

## Magentoの初期化をする
```
# DBを作って
$ mysql -uroot -e "CREATE DATABASE magento";
# Magentoの初期設定をCLIでやる
$ php bin/magento setup:install --base-url=http://localhost:9070 --db-host=localhost --db-name=magento --db-user=root --admin-firstname=Magento --admin-lastname=User --admin-email=user@example.com --admin-user=admin --admin-password=******** --language=ja_JP --currency=JPY --timezone=Asia/Tokyo --use-rewrites=0
```

こんな感じ。


## Magentoの起動をする
Supervisordでやる。

```supervisord.conf
[program:php-fpm]
command=/usr/local/sbin/php-fpm
autostart=true
autorestart=true
stdout_logfile=/var/log/supervisor/fpm/access.txt
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stderr_logfile=/var/log/supervisor/fpm/error.txt
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
user=*****

[program:nginx]
command=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
user=root
autostart=true
autorestart=true
```

```nginx.conf
location ~ ^/static/ {
    rewrite (.*/)version\d+/(.*$) $1$2; 
    root    /path/to/magento2/pub/;
}

location ~ ^/pub/static/ {
    rewrite (.*/)version\d+/(.*$) $1$2; 
    root    /path/to/magento2/;
}

location ~ ^/pub/media/ {
    root    /path/to/magento2/;
}

location / {
    rewrite (.*) /index.php/$1 break;
    root html;
    fastcgi_pass   127.0.0.1:9070;
    fastcgi_index  index.php;
    include        fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME /path/to/magento2/$fastcgi_script_name;
}
```



## CompileとかUpgradeとかする
静的ファイルにversiond¥d+なキャッシュブレーカー的なURLが挟まれている。
Apacheとかnginxとかを挟んでいればRewriteすればいいがスタンドアロンサーバなのでできない。
MySQLのレコードを変更することで、オプションを外せるので外す。
レコードがあったらUpdate、なかったら Insertで対応
```
$ mysql -uroot magento -e "INSERT INTO core_config_data (scope , scope_id , path , value) VALUES ('default',0,'dev/static/sign','0');
;"
$ mysql -uroot magento -e "update core_config_data set value = "0" WHERE path='dev/static/sign'";
```

コンテンツを作ったりDIのコンパイルをしたりする。
```
php bin/magento setup:di:compile
php bin/magento setup:static-content:deploy
php bin/magento setup:static-content:deploy ja_JP
php bin/magento cache:flush;
php bin/magento cache:clean
```

```
$ open http://localhost/
```

enjoy!
Docker-ComposeでEC-CUBE

前回Docker-Composeで構成を作ったのですが
EC-CUBE用に設定を色々入れていたので、改めてまとめ直し

### オフィシャルコンテナに追加で組み込み/有効にしなければいけなかったもの
#### Apache2
+ mod_rewrite

#### PHP
+ PDO
+ PDO_MySQL
+ ZIP

#### MariaDB
~~+ bind-addressとskip-networkingをコメントアウト~~
現行のイメージでは上記設定は必要なくなっているようです

### 設定

#### PHP+Apacheコンテナ
```:Dockerfile-PHP
FROM php:7.1-apache
RUN apt-get update && apt-get install -y \
       apt-utils \
       zlib1g-dev \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

RUN docker-php-source extract \
    && docker-php-ext-install pdo pdo_mysql \
    && docker-php-ext-install zip \
    && docker-php-ext-install opcache
RUN pecl install apcu
RUN echo "extension=apcu.so" > /usr/local/etc/php/conf.d/apcu.ini
RUN a2enmod rewrite
```

#### ~~MariaDBコンテナ~~
```:Dockerfile-DB
FROM mariadb:10
RUN  sed -Ei 's/^(bind-address|skip)/#&/' /etc/mysql/my.cnf
```
現在は別途BUILDする必要なし

#### Docker-Compose
```yaml:docker-compose.yml
    php:
        build:
            context: ./php
            dockerfile: Dockerfile-PHP
        depends_on:
            - db
        volumes:
            - type: bind
              source: /var/vm/eccube-3.0.15
              target: /var/www
        ports:
            - target: 80
              published: 80
              protocol: tcp
              mode: host
        logging:
            driver: "json-file"
            options:
                max-size: "10M"
                max-file: "10"
    db:
        build:
            context: ./db
            dockerfile: Dockerfile-DB
        volumes:
            - type: bind
              source: /var/vm/db
              target: /var/lib/mysql
        environment:
            MYSQL_ROOT_PASSWORD: ROOTPW
            MYSQL_USER: test
            MYSQL_PASSWORD: TESTPW
            MYSQL_DATABASE: eccube_test
        ports:
            - target: 3306
              published: 3306
              protocol: tcp
              mode: host
        logging:
            driver: "json-file"
            options:
                max-size: "10M"
                max-file: "10"
```

### まとめ
##### mod_rewrite
http://example.jp/hoge/ と来たアクセスを書き換えて、http://example.jp/index に渡している為、モジュールを有効にしていないと動かない
##### 他のモジュール
PHPのコンテナは、組み込むモジュールを全部列挙ではなく、オフィシャルの状態から追加したいモジュールを追加で入れる

##### ~~DB~~
~~bind-addressが効いているので、他のコンテナからTCP/IPで接続しようとすると弾かれてしまう、共通のボリューム追加してUNIXドメインソケット接続に…とも思いましたが、今回はこれで~~
##### インストーラ
WEBインストーラー経由でDB名などのセットアップを行います
http://localhost/install.php

environmentは.envに持っていくほうがよさげ
Raspberry Pi 3のセットアップ

# はじめに
Paspberry Pi 3のセットアップに関しては数々の記事が出ていると思いますが、自分が求めている情報は割と散逸していると感じたのでメモとしてまとめておきます。

この記事ではCUIで動く最低限のRaspberry Pi 3が使えるようになるまでの手順を紹介します。

# 前提環境
作業環境はUS配列でUnixライクな環境とします。また、以下のデバイスが必要です。

- Micro SDカード
    - 必要に応じてSDカードアダプター
- USB電源
    - 端子はMicro USB
- USBキーボード
- HDMIケーブル
- モニター

# Raspbianの導入
公式サイトからRaspbian LiteをダウンロードしてきてMicro SDカードに焼き付けます。
SDカード自体は事前にどのデバイスとして認識されているかを調べ、アンマウントしておく必要があります。Linuxだと`/dev/sd?`に、Macだと`/dev/rdisk?`として認識されていることがほとんどです(`?`は数字)。

```bash
$ wget http://vx2-downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2017-07-05/2017-07-05-raspbian-jessie-lite.zip
$ unzip 2017-07-05-raspbian-jessie-lite.zip
$ sudo dd if=2017-07-05-raspbian-jessie-lite.img of=/dev/xxx bs=1m
```

# 起動
SDカードとHDMIケーブルとUSBキーボードを接続してから電源としてMicro-USBケーブルを本体に接続すると勝手に起動します。スイッチはありません。電源を接続した時点で起動するので、事前にSDカードを接続しておく必要がある点に留意してください。

# 初期設定
ここからは初期設定を行っていきます。デフォルトではキーボードが日本語配列ではないので、US配列のキーボードを用意して設定すると楽です。

## ログインと初期パスワードの変更
ユーザー名`pi`およびパスワード`raspberry`でログインできます。これをそのままにしておくと悪用の危険があるため、速やかに変更します。なお入力したパスワードは表示されませんが入力できていますので間違いなく入力してください。

```bash
$ passwd
Changing password for pi.
(current) UNIX password: # <- 今のパスワード(raspberry)を入力
Enter new UNIX password: # <- 新パスワードを入力
Retype new UNIX password: # <- 確認のためもう一度入力
passwd: password updated successfully
```

## Wi-Fi接続とIPの固定。ついでにSSH
とりあえずインターネットにつなぎます。`SSID`と`WIFIPASS`の箇所は各所の環境に合わせて調節します。なお2.4GHz帯にしか対応していないので注意してください。また、設定ファイル(`/etc/wpa_supplicant/wpa_supplicant.conf`)に生パスワードが記述されてしまうので、気になる人は削除してしまっても良いでしょう。viが使えるので活用してください。sedでもいいですけれども。

```bash
$ sudo sh -c 'wpa_passphrase SSID WIFIPASS >> /etc/wpa_supplicant/wpa_supplicant.conf'
```

SSHのたびにいちいちIPを調べるのも野暮ですので、IPアドレスを固定します。適当なエディタで`/etc/dhcpcd.conf`を開いて、末尾に以下のように追記します。固定したいアドレスや各自LAN内のアドレス、サブネットマスクなどは各環境で異なると思いますので、そこは調節してください。

```bash
$ vi /etc/dhcpcd.conf
```

```conf:/etc/dhcpcd.conf
interface wlan0
static ip_address=192.168.0.x/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
```

最後にSSHを使えるようにしておきます。なぜかファイルを生やすだけで使えるようになります。

```bash
$ sudo touch /boot/ssh
```

最後に再起動すれば完了です。

## SSH接続
お使いのターミナルやSSHクライアントを使って接続します。

```bash
$ ssh pi@192.168.0.x
```

## raspi-config
Raspberry Piの基本設定が行える`raspi-config`を使って設定をしていきます。以下の項目だけ済ませておけば良いでしょう。

- 4 Localization Setting
    - I1 Change Locale
        - `ja_JP.UTF-8`を有効化
    - I2 Change Timezone
        - `Asia/Tokyo`に設定
    - I4 Change Wi-fi Country
        - `JP Japan`に設定
- 7 Advanced Options
    - `A1 Expand Filesystem`を実行

## ミラーの変更とアップデート
設定ファイル(`/etc/apt/sources.list`)を以下のように書き換えます。編集には管理者権限が必要なのでsudoを使ってファイルを開いてください。

編集内容としては、1行目の既存の設定をコメントアウトして、最終行で日本のサーバーを設定しているだけです。

```bash
$ sudo vi /etc/apt/sources.list
```

```apache:/etc/apt/sources.list
# deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
# deb-src http://archive.raspbian.org/raspbian/ jessie main contrib non-free rpi
deb http://ftp.jaist.ac.jp/raspbian/ jessie main contrib non-free rpi
```

あとはアップデートを行いましょう。

```bash
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install rpi-update
$ sudo rpi-update
```

# おしまい
とりあえずこれで初期設定は終了です。あとは各用途に合わせてカスタマイズしていきましょう。
【とりあえず】sassデプロイ環境手順【構築】

とりあえずテスト構築なのでところどころ適当(｡>﹏<｡)
###どっかこんてな
こんてなつくって
`docker run -itd --name sass -h sass -p 8080:80 -v /vagrant_data/css:/home/www/css -t centos:centos7 /sbin/init`

ドッカにはいろ
`docker exec -it sass bash`

###紅玉いれて
必要なやーつ
`yum install -y gcc make git bzip2 openssl-devel libffi-devel readline-devel`

ルビーノバージョンがどれがいいのかしらなのでとりまどうにでもなーるやーつ

```ruby:rbenv
git clone https://github.com/sstephenson/rbenv.git /usr/local/src/rbenv
git clone https://github.com/sstephenson/ruby-build.git /usr/local/src/rbenv/plugins/ruby-build
```

```ruby:/etc/profile.d/rbenv.sh
cat << 'EOS' > /etc/profile.d/rbenv.sh
export RBENV_ROOT="/usr/local/src/rbenv
export PATH="${RBENV_ROOT}/bin:${PATH}"
eval "$(rbenv init -)"
EOS
```

`source /etc/profile.d/rbenv.sh`

とりま安定版って書いてあったやつ :) [Ruby](https://www.ruby-lang.org/ja/downloads/)
`rbenv install 2.4.1` 

`rbenv global 2.4.1`

```
[root@sass /]# ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
```

とりあえず。
`gem update --system`

###ここからがSasssssss
`gem install sass`

```
[root@sass /]# sass -v
Sass 3.5.1 (Bleeding Edge)
```

###かんたんなScssかいておこう
```scss:style.scss
div {
    width: 100px;
    a {
        color: red;
    }
}
```
コマンドうつべし(ΦωΦ)
`sass --style expanded style.scss:style.css`

ぽこーーーーーん

```css:style.css
div {
  width: 100px;
}
div a {
  color: red;
}

/*# sourceMappingURL=style.css.map */
```

(/･ω･)/(/･ω･)/(/･ω･)/(/･ω･)/
[Unity]コンポーネントにシーンファイルを何回ドラッグ&ドロップしても、別のシーンがドラッグ&ドロップしたことになる問題

<h1>起こったこと</h1>
<img width="259" alt="スクリーンショット 2017-07-20 15.57.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/179803/80a29f61-462d-ca61-2d40-cd9339358ad4.png">

↑こんな感じで、「Scene1」という名前をつけたシーンをドラッグ&ドロップすると、、、

<img width="257" alt="スクリーンショット 2017-07-20 15.57.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/179803/e597f7cf-068d-3a01-cd13-bc79049bb0f5.png">

ファ！？

こうなる。何回やっても。

UnityChanのツンデレかなって思って再起動しても変わらなかった。
<h1>改善方法</h1>
試行錯誤した結果、「LobbyScene1」と「Scene1」のファイル名に問題があった。
「Scene1」という部分が被ってた。

なので、「Scene1」を小文字で「scene1」にしてみたら、

<img width="258" alt="スクリーンショット 2017-07-20 16.03.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/179803/05385d3e-de76-ad0b-b56d-75c39c82d06b.png">

うまくいった。

<h1>考察</h1>
今まで何回も被ってきた(〜Sceneみたいに)から、おそらく、何かしらのコンポーネントにシーンをドラッグ&ドロップすることになったら、似た名前のシーンが複数あった場合、シーン名を変更したほうがいいっていう考え方でおけ？(...なのか？)

<h1>追記</h1>
Build SettingsでのScene In Buildにシーンを設定する必要もあるので、それを忘れることもドラッグ&ドロップできない原因になるので、チェックです！
Javascriptで逆ポーランド記法の式生成と計算

#概要
Javascriptで実装した[逆ポーランド記法](https://ja.wikipedia.org/wiki/%E9%80%86%E3%83%9D%E3%83%BC%E3%83%A9%E3%83%B3%E3%83%89%E8%A8%98%E6%B3%95)の式生成および計算ライブラリです。
MDNの[演算子の優先順位](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)に則った、評価順および結合法則となっています。

中置記法（一般的な数式の記法）から逆ポーランド記法（演算子を後ろに置く記法。後置記法）への変換、逆ポーランド記法の計算を行います。
また関数として解釈する文字列とその演算機能を動的に定義できます。

##GitHub
[ReversePolishNotation](https://github.com/spica-git/ReversePolishNotation)

##デモ
[数式の逆ポーランド記法コンバートと計算実行デモ](https://spica-git.github.io/gh-projects/demo/rpn.html)

##機能
globalに<strong>rpn</strong>というオブジェクトを追加。

<strong>rpn</strong> -> function (string)：逆ポーランド記法の式評価（計算）
<strong>rpn.Generate</strong> -> function (string)：中置記法から逆ポーランド記法の式を生成
<strong>rpn.SetOperate</strong> -> function (string, number, function)：関数の定義

##使用できる演算子
\+ - * / ** % << >> ~ & ^ |

#使用例

##1.　逆ポーランド記法の式生成
<strong>rpn( 中置記法の式 )</strong>

```javascript
rpn.Generate("2*(5 + 7)");
// => 2 5 7 + *

//# 累乗を含む計算式
rpn.Generate("4 ** 3 ** 2");
// => 4 3 2 ** **

//# 16進法が扱えます
//# マイナス符号は '_' に変換します（プラス符号は '#' に変換）
rpn.Generate("~-5*4**(0x0f - 12)**2");
// => 5 _ ~ 4 15 12 - 2 ** ** *
```

##2.　逆ポーランド記法の式計算
<strong>rpn( 逆ポーランド記法の式 )</strong>

```javascript
rpn("2 5 7 + *");
// => 24

//# 累乗は右から左に計算します
rpn("4 3 2 ** **");
// => 262144

rpn("5_~4 0x0f 12-2** ** *");
// => 1048576
```
##3.　演算機能（関数）の追加
<strong>rpn.SetOperate( 関数名, 引数の数, 関数本体 )</strong>
戻り値は rpn なのでメソッドチェーンが可能。

```javascript
//# chain method available
//# 正弦関数と余弦関数を定義
rpn.SetOperate("sin", 1, function(arg1){ return Math.sin(arg1*(Math.PI/180)); })
   .SetOperate("cos", 1, function(arg1){ return Math.cos(arg1*(Math.PI/180)); });

//# 実行例
rpn.Generate("sin(45 + 45)");
// => 45 45 + sin
rpn("45 45 + sin");
// => 1
```
UnityのVideo Playerで使えるアルファチャンネル付き動画をAdobe Premiereで書き出す方法

## UnityのVideo Playerで使えるアルファチャンネル付き動画
UnityのVideoPlayerでサポートしているコーデックは、[H.264+AACまたはVP8+Vorbis](https://forum.unity3d.com/threads/correct-video-format-for-video-playback.446011/#post-2886983)ということで、アルファチャンネル付きの透過動画を扱いたい場合は、アルファチャンネル付きのVP8で書き出すのがほぼ唯一の選択肢です。

VP8はWebMコンテナで使われるコーデックですが、Adobe Premiereでは、デフォルトではWebMで書き出せないため、追加でWebMを扱うためのプラグインをインストールする必要があります。

## 手順
# 以下のサイトからPremiereでWebMを扱うためのプラグインをインストール
http://www.fnordware.com/WebM/
# Premiereのエクスポート時に以下の設定を変更／確認

- FormatでWebMを選択
- Videoタブ->CodecでVP8を選択
- Videoタブ->Include Alpha Channelにチェックを入れる
- Audioタブ->CodecでVorbisを選択

Videoタブ
<img width="459" alt="premiere_video.png" src="https://qiita-image-store.s3.amazonaws.com/0/42169/ba65f8b3-157c-4f01-b85b-64db34bd7c64.png">

Audioタブ
<img width="462" alt="premiere_audio.png" src="https://qiita-image-store.s3.amazonaws.com/0/42169/d77368d6-f4e6-64ea-7cd5-58309d8ae230.png">
IDCFクラウドでホスト名を変更する方法

# はじめに
IDCFの管理画面側で仮想マシン名の変更を行っても、ホスト名やSSH接続時の
名前等は変わってくれなかったので自分で設定する必要があるようです。

参考：[仮想マシンのホスト名は変更できますか？](https://www.faq.idcf.jp/app/answers/detail/a_id/64/~/%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%AE%E3%83%9B%E3%82%B9%E3%83%88%E5%90%8D%E3%81%AF%E5%A4%89%E6%9B%B4%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F)

## 前提上限
- CentOS7環境

## 作業手順
~~変更したいホストに接続してhostnameコマンドで設定できる~~

```
# 変更
$ hostname FOO
# 確認
$ hostname
FOO
```
上記の方法だとサーバー再起動で設定がリセットされてしまうので、
正しくは以下のやり方でした。すいませんでした m(_ _)m

```
hostnamectl set-hostname  [ホスト名]
```

踏み台からSSHするとき自動で名前解決してくれないので手動でホストを追加する。

```
$ vi /etc/hosts
# 以下を追加
[IPアドレス] FOO
```
よく使うCSS結合子

## 概要
よく使うCSS結合子です。
（sassで記述しています。）

## 結合子
セレクタを結合子で組み合わせると、シーン別に個別に指定をすることができます。
やり過ぎるとメンテナンス性が著しく悪くなるので、シンプルに使うことがポイントです。

### A B
子孫セレクタ。
A要素の子孫であるすべてのB要素に適用されます。

```.sass
div p
  color: red
```

### A > B
子セレクタ。
A要素の子であるすべてのB要素に適用されます。

```.sass
div > p
  color: red
```

### A + B
隣接セレクタ。
A要素の直後に現れるB要素のみに適用されます。

```.sass
h2 + p
  color: red
```

### A ~ B
間接セレクタ。
A要素のあとに現れるB要素のみに適用されます。

```.sass
h2 ~ p
  color: red
```
Library not loaded: /usr/local/opt/imagemagick/lib/libMagickWand-7.Q16HDRI.0.dylib


`brew upgrade` をしたら `Library not loaded: /usr/local/opt/imagemagick/lib/libMagickWand-7.Q16HDRI.0.dylib` が出てくるようになったので対処メモ。

## 対処

`brew reinstall -s php70-imagick` で強制再インストールをする。

## 参考

- [Getting php71-imagick error](https://github.com/Homebrew/homebrew-php/issues/3842)
matplotlibのbarプロットでカラーバーをつける方法

# はじめに

matplotlibでbarプロットを行うと，Mappableオブジェクトが返ってこないため，カラーバーをつけることができない．

```pycon
>>> import matplotli.pyplot as plt
>>> plt.bar(0, 1)
<Container object of 1 artists>
```

でも，なんとかしてカラーバーをつけたい！ということで，やってみた．

# 0. 適当なデータを作る

まず初めに，適当なデータを作ってみる．
ここでは，高さ1~3のバーを積み上げたような図を作成することを想定して，データを作る．

```pycon
>>> import numpy as np
>>> dheight = np.random.choice([1, 2, 3], size=10)
>>> data = np.random.choice([1, 2, 3, 4, 5], size=dheight.size)
>>> print data
[1 1 1 4 5 2 1 2 2 4]
```

今回は，ここで作成したdataという変数の値に応じて色を付けていくということを行う．

適当なデータを作ったので，いよいよ作図に入る．

# 1. Normalize関数を作る

まず，matplotlibのカラーバーは，0~1の間の値に対応してカラーマップに色が定義されている．したがって，今回のような1~5の値に応じて色を塗りたい場合は，標準化するための関数（のようなオブジェクト）が必要となる．それを作成できるのが，Normalizeというクラスである．

```pycon
>>> from matplotlib.colors import Normalize
>>> norm = Normalize(vmin=data.min(), vmax=data.max())
>>> print norm(1), norm(2), norm(3)
0.0 0.25 0.5
```

実際に値を入れてみると分かるように，このnormというオブジェクトに値を与えると，確かにvminが0，vmaxが1となるように標準化されている．

# 2. Mappableオブジェクトの作成

次に，Mappableオブジェクトを作成する．
今回は，matplotlibのデフォルトのカラーマップであるjetに合わせてMappableを作る．

```pycon
>>> from matplotlib.cm import ScalarMappable, get_cmap
>>> cmap = get_cmap('jet')
>>> mappable = ScalarMappable(cmap=cmap, norm=norm)
>>> mappable._A = []
```

# 3. データをプロットする

ここまで準備ができたら，いよいよ実際にデータをプロットできる．

```pycon
>>> import matplotlib.pyplot as plt
>>> bottom = 0.
>>> for dh, v in zip(dheight, data):
...     plt.bar(0, dh, width=1, bottom=bottom, color=cmap(norm(v)))
...     bottom += dh
>>> cbar = plt.colorbar(mappable)
```

今回プロットしたデータは[1 1 1 4 5 2 1 2 2 4]なので，この値に対応した色がカラーバーにあれば，問題なくカラーバーを描けたことになる．

# 4. ラベルを付ける

最後に，ラベルを付けて完成となる．
今回は，データの最小値から最大値の間を5つに区切ってラベルを貼り付けていく．

```pycon
>>> cbar = plt.colorbar(mappable)
>>> ticks = np.linspace(norm.vmin, norm.vmax, 5)
>>> cbar.set_ticks(ticks)
>>> cbar.ax.set_yticklabels([str(s) for s in ticks])
[<matplotlib.text.Text at 0x7f36ac9b01d0>,
 <matplotlib.text.Text at 0x7f36ac9bb850>,
 <matplotlib.text.Text at 0x7f36ac98e550>,
 <matplotlib.text.Text at 0x7f36ac98ec50>,
 <matplotlib.text.Text at 0x7f36ac996390>]
```

# 5. 完成！

以上で完成である．

```pycon
>>> plt.show()
```

![index.png](https://qiita-image-store.s3.amazonaws.com/0/106933/3b63504e-1882-a2d7-d3d5-df88f9da46db.png)

無事，[1 1 1 4 5 2 1 2 2 4]の値に対応した色が描かれた．

# 参考になったページ

* https://datasciencelab.wordpress.com/2013/12/21/beautiful-plots-with-pandas-and-matplotlib/
Laradock on Windows10でdocker-compose exec * bashするとエラる

Macの経験を踏まえ、Windowsでも環境作って作業していたら、以下で躓いた

```
$ docker-compose exec workspace bash
the input device is not a TTY.  If you are using mintty, try prefixing the command with 'winpty'
```

TTYじゃないから、もし、mintty使っているなら、winptyを先頭のコマンドとして付加してみなっ、とのこと

なかなかドンずばなページが見つからなかったが、以下のあたりで触れられていた

 - [Docker for Windowsを入れてみてわかった制約のメモ](https://7me.oji.0j0.jp/2016/docker-for-windows.html)
 - [Docker for Windows: Interactive Sessions In MinTTY Git Bash - Will Anderson](http://willi.am/blog/2016/08/08/docker-for-windows-interactive-sessions-in-mintty-git-bash/)
 - [Windows10でDockerを使う - write ahead log](http://twinbird-htn.hatenablog.com/entry/2017/01/11/063553)
 - [MinGW の mintty で対話モード、ついでに vim 設定 | ユニマージュ](http://dogwood.skr.jp/blog/2013/11/406/)

あまり詳しくは調べてないので、突っ込まれるとよくわからないが...
まぁ、そのまま、`winpty` をコマンドの頭につけるといけた

```
$ winpty docker-compose exec workspace bash
```

dockerのコマンドがまだ把握しきれていなくて、`docker-compose exec`だけじゃなく、`docker exec`なんかでもシェルに入れたり... なんか幾通りも方法があるっぽい...

```
$ winpty docker exec -it laradock_workspace_1 /bin/bash
```

[Docker for Windowsを入れてみてわかった制約のメモ](https://7me.oji.0j0.jp/2016/docker-for-windows.html) に、「PowerShellでも可」とあるけれど、具体的に、どのようにするのでしょう... PowerShell起動してコマンド叩いても上手くいかなかった...
boto3で接続のタイムアウトを設定する

python 3.7
boto3 1.4.4


http://botocore.readthedocs.io/en/latest/reference/config.html


```py3
from boto3.session import Session
from botocore.client import Config
	
session = Session()
config = Config(read_timeout=65)
client = session.client('stepfunctions', config=config)
```
自分の成長目標が立てられない。それは会社に決めてもらいましょう。

会社で最近、エンジニアに半年ごとに目標をたてさせ、その達成状況を給与体系に反映させることになった。
エンジニアごとに目標を考えさせて実現させたいようだ。
その際に「自分が立てるべき目標が分からない」人が結構多かったのでそんな人向けに。

#半年後の目標をいきなり考えてはいけない
まず「将来自分はどうなっているべきか?」を考える。
そのうえで
　１．「今の自分」が何を身につければ「将来の自分」になるのかを書き出す。
　２．書き出したものを身に着けるためのスケジュールを立てる。
　３．立てたスケジュールを半年ごとに区切る。
　４．半年の時点で達成されているべきことを半年ごとの目標にする。
これでOK。

#自分がどうなりたいか分からないんだよ!
自分がどうなりたいか分からないなら、会社に決めてもらえばいい。
「会社があなたに将来どうなってほしいと考えているか」を考える。
そのために

　１．会社の事業全体を理解する。
　２．今後、会社がどう成長するのかをイメージする。
　　　└イメージできない場合、上司に聞く。会社の理念を見る。現場の空気を読む。などをする。
　３．成長した会社で必要とされる人材像をイメージする。

ここで出てきた人材像が「目標」になる。
あとは

　１．「今の自分」が何を身につければ「会社が求める人材像」になるのかを書き出す。
　２．書き出したものを身に着けるためのスケジュールを立てる。
　３．立てたスケジュールを半年ごとに区切る。
　４．半年の時点で達成されているべきことを半年ごとの目標にする。
      
でOK。

#譲れない「やりたくないこと」「やりたいこと」
会社の目標を目指すうちに、「こんな思いはもうしたくない」「どうしてもあの仕事がやりたい」など出てくる。
ここで目標を「自分の希望が反映されるように」見直す。

見直しの方法
例1：会社は管理職になってほしいが、自分は他人の管理をしたくない。
    └目標とやりたいことに矛盾がある
      └「一生現場業務」で会社が納得する目標を考える
      └「最小限の管理」で何とかなる目標を考える

例2：会社は営業、開発両方を経験して欲しいと考えており、自分も営業、開発両方を経験してみたい。
    └目標とやりたいことが一致している。
      └より早く「営業、開発」両方を経験できるキャリアプランを目標として立てる。

例3：べつに「やりたくないこと」「やりたいこと」が出てこない。
    └目標を変更する理由がないのでそのまま継続する。

あとは

　１．「今の自分」が何を身につければ「修正した目標」になるのかを書き出す。
　２．書き出したものを身に着けるためのスケジュールを立てる。
　３．立てたスケジュールを半年ごとに区切る。
　４．半年の時点で達成されているべきことを半年ごとの目標にする。
      
でOK。

#自分の目標を会社に依存していいの?
いい。できない以上諦めればいい。
そもそも、目標を望んでいるのは会社なのだから目標が会社依存なのが普通。
会社依存の目標を目指す途中で自分の目標が見つかればそっちに変えればいい。
古いバージョンのnpmをインストールする方法


ReactNativeの検証をしようとしたところ、npm 4.6.1が推奨だよと言われました。
手元の環境のnpmのバージョンが5.0.1だったので古いバージョンをインストールする方法を調べました。

古いバージョンは次のコマンドでグローバルインストール可能です。

```bash
npm install -g npm@4.6.1
```

`@バージョン`という書式でバージョンが指定できるんですね。
Markdown-Writer for AtomとHexoとのタグ/カテゴリ/ポストの連携

# 対象

1. AtomでMarkdown形式の文書を書くのに[Markdown-Writer for Atom](https://atom.io/packages/markdown-writer)を使用している。
2. 上記プラグインの機能から[Hexo](https://hexo.io/)のタグ/カテゴリ/ポストを参照したい。
3. 公式サイトのページで紹介（[Settings for Front Matters](https://github.com/zhuochun/md-writer/wiki/Settings-for-Front-Matters)）されている、[hexo-generator-atom-markdown-writer-meta](https://github.com/timnew/hexo-generator-atom-markdown-writer-meta)はHexoがversion 3.xでAPIが変わった経緯で動かない。

という人向けのエントリです。

# 実装

以下のスクリプトを `scripts/meta.js` に配置します。これで `http://exmaple.net/meta.json` でアクセスできるようになります。

```meta.js
// See: https://github.com/zhuochun/md-writer/wiki/Settings-for-Front-Matters
// Path: scripts/meta.js
// Author: Masayuki Higashino
// License: MIT
hexo.extend.generator.register('meta', function(locals) {
  var meta = {
    tags: [],
    posts: [],
    categories: []
  }
  locals.tags.sort('name').each(function(tag) {
    meta.tags.push(tag.name)
  })
  locals.categories.sort('name').each(function(category) {
    meta.categories.push(category.name)
  })
  locals.posts.sort('name').each(function(post) {
    meta.posts.push({
      title: post.title,
      url: encodeURI(post.permalink),
      date: post.updated.toDate().toISOString() || post.date.toDate().toISOString()
    })
  })
  return {path: 'meta.json', data: JSON.stringify(meta)}
}
```

Gistは[こちら](https://gist.github.com/mh61503891/544d3c1eefd00b1012463b860222d34f)にあります。
Amazon Linux AMIに最新NodeJSをNVMでインストール、ついでにYarnもインストール

## 手順

インスタンスを作って、初めて`ssh ...`で接続した直後なうです。

### NVMのインストール

```bash
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
```

多分`.bashrc`に以下のような、ログイン時の初期化処理みたいなのが追記されてるはずです。

```bash:.bashrc
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion
```

再読込して上の初期化を流します。

```
source .bashrc
```

こんな感じにでればOK。

```bash
nvm --version
# 0.33.2
```

### NodeJSのインストール

```bash
nvm install 8
# Downloading and installing node v8.2.0...
# Downloading https://nodejs.org/dist/v8.2.0/node-v8.2.0-linux-x64.tar.xz...
# ######################################################################## 100.0%
# Computing checksum with sha256sum
# Checksums matched!
# Now using node v8.2.0 (npm v5.3.0)
# Creating default alias: default -> 8 (-> v8.2.0)
```

こんな感じにでればOK。

```bash
node -v
# v8.2.0
npm -v
# 5.3.0
```

### Yarnのインストール

```bash
curl -o- -L https://yarnpkg.com/install.sh | bash
```

多分`.bashrc`でyarnコマンドを置いてるディレクトリへPathを通すやつが追記されてるはずです。

```bash:.bashrc
export PATH="$HOME/.yarn/bin:$PATH"
```

再読込してパスを通します。

```bash
source .bashrc
```

こんな感じにでればOK。

```bash
yarn -V
# 0.27.5
```

---

`make install`の方よりかなり早いのでこっちのがいいですね。
mac OSから認証付きプロキシ越え

# はじめに
mac OS Xでプロキシ設定は、「設定」→「ネットワーク」→「（デバイスを選択）」→「詳細ボタン」→「プロキシタブ」→「（プロトコルを選択）」としたところにある。
一般のアプリはこの設定を参照するのだが、ターミナルから実行するUnix系のコマンドはこの設定を使わないのでそのままではプロキシ越しにインターネットに接続できない。
`HomeBrew`とか`Pip`とかのパッケージマネージャーは、インターネットに接続しに行くので、プロキシ設定ができていないと環境構築もままならない。

自宅ならプロキシ設定なんかいらないのだが、職場には認証付きプロキシがあって苦労したので、メモしておく。


# 各コマンドのプロキシ設定

## bash
環境変数`HTTP_PROXY`と`HTTPS_PROXY`に設定する。
`host.na.me`はプロキシサーバの名前にする。
`[]`内は省略できる。
```
  export HTTP_PROXY='http://[username:password@]host.na.me[:port]'
  export HTTPS_PROXY='https://[username:password@]host.na.me[:port]'
```

`~/.bash_profile`や`~/.shrc`にも書いておく。

## pip（python）
環境変数`HTTP_PROXY`と`HTTPS_PROXY`を使う。

## curl, HomeBrew
curlの設定ファイル`"~/.curlrc`に、プロキシユーザとプロキシサーバを書く。
```
  proxy_user="user_name:password"
  proxy=http://host.na.me[:port]
```

## その他
また何かあったら更新します。