OmniAICreator/Qiita-1.07M huggingface dataset:
CSSからFlexでResponsiveなマルチカラムレイアウトを考える

#はじめに
いい感じにマルチカラムデザインできないかなーと思って調べてみました。
[ぼくたちのLIG INC.さん](https://liginc.co.jp/web/html-css/css/21024)がこれ以上ないくらい分かりやすく解説してくれてるので特に書くこともないのですが...。

#HTML
```html
<body>
    <section class="flex-container">

        <article class="col-8">
            <h1>Title 1</h1>
            <p>I have a pen.</p>
        </article>

        <article class="col-4">
            <h1>Title 2</h1>
            <p>I have an apple.</p>
        </article>

        <article class="col-12">
            <h1>Title 3</h1>
            <p>Umm... Apple-pen!</p>
        </article>

        <article class="col-2">
            <h1>Title 4</h1>
            <p>I have a pen.</p>
        </article>

        <article class="col-2">
            <h1>Title 5</h1>
            <p>I have a pineapple.</p>
        </article>

        <article class="col-8">
            <h1>Title 6</h1>
            <p>Umm... Pineapple-pen!</p>
        </article>

    </section>
</body>
```
#CSS
```css
.flex-container{
    display: flex;
    flex-wrap: wrap;
    flex-grow: 1;
    justify-content: space-around;
    align-content: space-around;
}
flex-container > *[class^="col-"]{
    box-sizing: border-box;
    min-width: 50px;
    border: 1px solid #DDD;
}
.col-1 { width:  8%; }
.col-2 { width: 16%; }
.col-3 { width: 24%; }
.col-4 { width: 32%; }
.col-5 { width: 40%; }
.col-6 { width: 48%; }
.col-7 { width: 56%; }
.col-8 { width: 64%; }
.col-9 { width: 72%; }
.col-10{ width: 80%; }
.col-11{ width: 88%; }
.col-12{ width: 96%; }
```
親要素にdisplay:flexを与えてあげると、その子要素がいい感じにぬるぬる動くようになる。
このとき、min-widthを与えてあげると要素の最低幅を指定できる。
ただこの設定だとコンテンツの高さが揃っちゃうから、一つだけ高さを2列分にできないんだよなぁ...もしかしたらそういう設定があるのかもしれないですが。
25時表記の時刻データの変換

深夜のテレビ番組などは25時、26時スタートなどの表記をされることがある。
扱っているデータが、日付の文字列と25時表記の時刻で持っていたので、DateTime形式への変換方法をメモしておく。

```test.py
df["日時"] = pd.to_datetime(df["日付"]) + pd.to_timedelta(df["時刻"])
```

時刻をTimedelta形式にすることで、25時表記の時刻を25時間(1日と1時間)と扱い、datetimeに足し合わせた。

# 余談
25時表記のことを何と呼べばいいのだろう。。
【ev3dev】MacとBluetoothを使ってSSH接続しよう

## はじめに
mindstorm-EV3で動くLinux環境、ev3devを使った開発。
CUI上での開発が必要なので、ev3devをインストールしたEV3端末にSSH接続をする必要があるのですが、以前紹介した[ルーターとWiFiドングルを用意する方法](http://qiita.com/murotani/items/46f905bec33b1673c41a)以外にも、EV3のBluetooth接続機能を利用する方法が簡単なので紹介します。

ev3devのインストール方法についてはこちらの記事を参考にしてください。
>
[mindstorm-EV3をLinuxで制御しよう! ev3dev OSのインストールとSSH接続](http://qiita.com/murotani/items/46f905bec33b1673c41a)

## 環境
今回はMacを使って説明します。

- PC : Mac (Darwin Kernel Version 15.5.0) 
- mindstorm-EV3 

## 手順
(＊撮影のために画面画像ではすでにネットワーク接続できている状態になっています。)

### Wireless and Networksを選択
![1.png](https://qiita-image-store.s3.amazonaws.com/0/149019/c82fcdb7-926f-0248-d4a7-8ea0f9b7107a.png)

### Bluetoothを選択
![2.png](https://qiita-image-store.s3.amazonaws.com/0/149019/c37ee17f-30b5-41a2-677d-17a380bbd875.png)

### Bluetooth起動
![3.png](https://qiita-image-store.s3.amazonaws.com/0/149019/08e180e9-e14e-e1e2-5896-ddb1463db105.png)

### スキャンします
ここでMac側のBluetooth機能を入にしてください。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/149019/5cdcf084-bdf1-b40e-16d6-9f746b49eb5d.png)

### デバイスの検出
文字化けしていますがMacBook Airが認識されています。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/149019/8365a957-cb40-e2e5-1c70-80d2a098b4b4.png)

###　ペアリング
Mac側画面でペアリングが要求されますので画面に従います。
![スクリーンショット 2017-02-16 16.20.40.png](https://qiita-image-store.s3.amazonaws.com/0/149019/375ff44b-27ce-2f87-864b-ff876924ae96.png)

### ネットワークコネクションを選択
![7.png](https://qiita-image-store.s3.amazonaws.com/0/149019/f2424307-d52e-7911-f43b-fd8de0e57dd7.png)

### 接続できました
![8.png](https://qiita-image-store.s3.amazonaws.com/0/149019/1f2b4644-38ec-a672-96ea-3dc61fc3f490.png)

## SSH接続
この状態でMacのターミナルを開いてSSH接続が出来るか確認しましょう。デフォルトユーザーはrobot,パスワードはmakerです。

```
$ssh robot@ev3dev.local
Warning: Permanently added the ECDSA host key for IP address '169.254.254.152' to the list of known hosts.
robot@ev3dev.local's password:
             _____     _
   _____   _|___ /  __| | _____   __
  / _ \ \ / / |_ \ / _` |/ _ \ \ / /
 |  __/\ V / ___) | (_| |  __/\ V /
  \___| \_/ |____/ \__,_|\___| \_/

Debian jessie on LEGO MINDSTORMS EV3!

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
```

## まとめ
以上がBluetoothを利用したSSH接続の方法でした。
ルーターやドングルがない環境でも手軽で便利ですね。
記事中のEV3画面のスクリーンショットの作り方はこちらの記事を参考にして下さい。
>
[【ev3dev】pythonを使ってLCD画面をキャプチャーするプログラムを作る](http://qiita.com/murotani/items/8f301c57d3e5741ea8f7)
アプリ起動中に特定のActivityを開いているかどうか判定する

アプリ起動中に特定のActivityでのみ処理を変更したいなどの場合に使えるtipsです。

### 対象のActivityで`NAME`を定義
```java:MyActivity.java

public class MyActivity extends AppCompatActivity {
    public static final String NAME = MyActivity.class.getName();
    …
}

```

### `Application.ActivityLifecycleCallbacks`の実装クラスを作成

```java:MyLifecycleListener.java

public class MyLifecycleListener implements Application.ActivityLifecycleCallbacks {

    private static String currentActivityName = "";

    @Override
    public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

    }

    @Override
    public void onActivityStarted(Activity activity) {

    }

    @Override
    public void onActivityResumed(Activity activity) {
        //今回は表示されている画面を対象としたのでResumeで取得
        currentActivityName = activity.getClass().getName();
    }

    @Override
    public void onActivityPaused(Activity activity) {

    }

    @Override
    public void onActivityStopped(Activity activity) {

    }

    @Override
    public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

    }

    @Override
    public void onActivityDestroyed(Activity activity) {

    }

    public static String getCurrentActivityName() {
        return currentActivityName;
    }
}
```

### `Application`クラスで登録

```java:MyApplication.java
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        registerActivityLifecycleCallbacks(new MyLifecycleListener());
    }
}
```

以上で設定は終了です。
あとは任意の場所で処理を行えます。

```
if (MyLifecycleListener.getCurrentActivityName().equals(MyActivity.NAME)) { 
    //do something.
}
```
任意のパーセンタイル値を求める方法

最近知ったのでメモ。

quantile()は四分位数だけでなく、自分で取得したいところのパーセンタイル値を出力してくれる。

```{R}
> x  <- rnorm(1000)
> quantile(x, c(0, 0.1, 0.45, 0.9, 1))
       0%       10%       45%       90%      100% 
-3.351967 -1.416228 -0.147615  1.290920  3.118316 
> quantile(x, c(0.33, 0.66))
       33%        66% 
-0.4488476  0.4264979 
> quantile(x, probs = 0.33)
       33% 
-0.4488476 

```

便利ですね。
JS初心者がオブジェクトのプロパティへのアクセスを理解する

# 目的
　自分のようなJavaScript入門者への情報共有、また自分の備忘録のために作成します。

# 結論
　オブジェクトのプロパティへのアクセスについて、ドット演算子でもブラケット演算子でもよい。
　**ただし、「プロパティに変数の値を使いたい」。この場合のみ、ブラケット演算子で書かなければならない。**

# 内容
　JavaScriptでオブジェクトのプロパティの値を得たい場合、以下2つの方法があります。

```js
var obj = { hoge: "hoge" }; //オブジェクトobjのhogeプロパティの値は0

console.log(obj.hoge);  // 方法A(ドット演算子を用いるやり方)
console.log(obj["hoge"]); // 方法B(ブラケット演算子を用いるやり方)
// どちらも"hoge"が表示される
```

　方法Bは、JavaのMap(連想配列)のような書き方です。プロパティの中にさらにオブジェクトや配列を入れる場合、可読性が悪くなるでしょう。（後述します）
　**「ここではインスタンス(オブジェクト)のフィールド(プロパティ)を取ってきているんだ！」という意図を、コード上で明らかにしたいため、私は方法Aを選択したい。**

　よって、コードの全てを方法Aで統一したいところですが、ここで、**変数に対応したプロパティの値を得たい場合**を考えます。

```js
var obj = { hoge: "hoge" };

var key = "hoge";
console.log(obj.key);
// "undefined"が表示される（「変数が未定義」ということ）

console.log(obj[key]);
// "hoge"が表示される
```

　**オブジェクトに対し、与えた変数値のプロパティを得たい場合は、方法Bでなければなりません。**
　オブジェクトのプロパティへの読み書きについて、基本的に方法Aでよいのですが、この場合のみ、方法Bでコーディングしなければならない。

　余談ですが、「**プロパティの中に配列のあるオブジェクト**のプロパティに、変数値を使いたい場合（変数は配列とする）」を考えてみます。

```js
var obj = { hoge: ["hoge0", "hoge1"]};

var key = ["hoge", "piyo"];
for (var i = 0; i < obj[key[0]].length; i++) {
  console.log(obj[key[0]][i])
}
```

　ブラケット演算子は、ArrayやMapでのみ用いる！　としたいところですが。

# 参考文献
[Qiita: "javascriptの連想配列と配列の違い"](http://qiita.com/katsukii/items/168bee174073ae7ec7e4) @katsukii氏
[Qiita: "JavaScriptのオブジェクトのキーに変数の値を使うTips"](http://qiita.com/masarufuruya/items/d29a567d0ca4bbfb00cb) @masarufuruya氏
(Omniauth)ソーシャルログインでハマる

# ログインに失敗する

超初心者的なミスです｡
恥ずかしいのですが､自分への備忘録として｡

1. devise+Omniauthを導入
2. facebookとtwitterログイン機能を実装｡
3. twitterログインが確認できたのでherokuにデプロイ｡

･･･あれ?なぜかfacebookのログインができない(滝汗)

コードがほとんど共通なのに､twitterだと普通に入れるというナゾ現象｡

FB側でのコールバック設定や､API-KEYなどの環境変数を疑いましたが､FB認証は通っている様子｡コントローラーまで処理が戻ってきた上ではじかれ､新規登録画面に飛ばされるのだが､はて｡

# コード

callbackを担当するコントローラーはこんな感じ｡

[こちらのサンプル](https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview)にをほぼほぼそっくり真似た､標準的な書き方かなと思います｡

```ruby:omniauth_callbacks_controller.rb

  def facebook
    auth = request.env["omniauth.auth"]
    @user = User.where(provider: auth.provider, provider_uid: auth.uid).first
    unless @user
      @user = User.create(
          name:     auth.info.name,
          email:    fake_email(auth), # (ダミーのメールアドレスを生成)
          provider: auth.provider,
          provider_token:    auth.credentials.token,
          provider_uid: auth.uid,
          password: Devise.friendly_token[0,20],
      )
    end

  
    if @user.persisted?              # 以下はログイン処理
      set_flash_message(:notice, :success, kind: "Facebook") if is_navigational_format?
      sign_in_and_redirect @user, event: :authentication
    else                             # 失敗した場合
      session["devise.facebook_data"] = request.env["omniauth.auth"]
      redirect_to new_user_registration_url
    end
  end

```

最後の条件分岐で､新規登録画面にリダイレクトされてしまっている模様｡

なおUserはdeviseモデル名で､デフォルトの設定(emailとpassword)以外に､nameというカラムが入っている｡

# 原因

自分で書いたバリデーションで`@user`の登録がはねられていました｡(´∀｀；)

```ruby:user.rb
  VALID_NAME =  /\A[a-zA-Z0-9_]+\z/
  validates :name, presence: true, uniqueness: true, length: {minimum: 4, maximum: 20}, format: { with: VALID_NAME }
```

`request.env['omniauth.auth']`に[入っているデータ例](https://github.com/mkdynamic/omniauth-facebook#auth-hash)を見るとわかるのですが､nameにはスペースが入っています｡(しかも名前はアルファベットとは限らない｡私の場合､漢字･･)

twitterだと英数字のアカウント名が返ってくるので､問題なく通っていたのでした｡

ソーシャルログインプロセスのエラーなので､原因箇所の特定に少し手間取ったことと､同種のエラーがどんだけググっても出ない(そりゃそうだ)のでハマりました｡

# 教訓

当たり前すぎますが､

｢ソーシャルログインで帰ってくるデータは向こうの仕様に左右される｣

･･･当たり前ですね｡

以前には[facebookがデフォルトでemailを返さなくなった変更](http://qiita.com/blueplanet/items/25c815aa45cad46be73d)もあったようだし､気をつけたい｡

素人なりに考えられる対策としては､ログイン認証でapiから受け取る情報を最低限に絞り､プロフィール関係は別途入力してもらう(ここはここでバリデーションをかけるけど､認証とは分ける)という手もあるのかな､とおもいました｡
二段階にすると､ユーザーの負担は増えそうですね｡どうなんでしょうか?

こんな残念な間違いをする方はいないとは思いつつ､億が一､誰かの役に立てたらということで置いておきます｡
Jupyter Notebookを起動する時に自動で新しいウィンドウで開く

Jupyter Notebookはとても便利です。
ターミナルで任意のフォルダに移動して`jupyter notebook`のコマンドをいれると最前面にあるブラウザのウィンドウに新しいタブが開かれます。

これでもいいのですが，ブラウザの新しいウィンドウを自動で開いて欲しい。

# まずはJupyterのコンフィグファイルをつくる
```bash:コンフィグファイルを作製
jupyter notebook --generate-config
```
すると，Macの場合Homeディレクトリ内の不可視フォルダ「.jupyter」にコンフィグファイルができます。

# コンフィグファイルを書き換える
jupyter_notebook_config.pyにある「c.NotebookApp.browser」の項目を書き換えます。

Chromeを使っている場合を想定しています。
/Application以下にChromeがインストールされている前提です。

コメントアウトされているので，コメントを外して
```
c.NotebookApp.browser = '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome %s --new-window'
```
とします。

これでJupyter Notebookを起動したときに新しいウィンドウが開きます。
Android WebViewのデバック方法

##Android WebViewでデバック
Android の WebView にアセットに登録したHTML・CSS・JavaScriptをChrome Developer Toolsを使ってデバックすることができます。
Web開発で使ったことのあるツールなので、それをAndroidアプリで使えるのは便利です。

##デバックするときの条件

* コンピュータに Chrome 32 以上がインストールされていること
* USB ケーブルで Android 端末と接続できること
* Android 端末で USB デバッグが有効になってること
* Chrome for Android で使う場合は Android 4.0 以上
* Webview アプリで使う場合は Android 4.4 以上

後半の2点だけ注意すれば、問題なさそうです。

##実装
Chrome Developer Toolsを利用するために、以下のコードを記述します。

```java
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    WebView.setWebContentsDebuggingEnabled(true);
}
```

##デバック
Chrome のアドレスバーに chrome://inspect と入力します。
そうすると、WebView一覧が出てくるので、その中からデバックしたいWebViewに inspect をクリックします。

##余談
Stethoというものを使えば、Chrome Developer Toolsでネットワーク状況も確認できるそうです。
また、SQLiteやPreferenceの中を覗くこともできそう。
この辺りをログに吐き出して確認していた部分でもあるので、Stethoを入れるのは良さそうです。

[StethoでAndroidのNetwork Performanceを見る](http://qiita.com/wasabeef_jp/items/1e7bdb78766708206d3d)
[Android: StethoでSQLite, Preferenceの中を覗く](http://yuki312.blogspot.jp/2015/03/android-stethosqlite-preference.html)

##参考
* [[Android] WebView に読み込んだ JavaScript アプリケーションを Chrome Developer Tools でデバッグする](http://qiita.com/hkusu/items/fca23e0fa5cfb1b7fe1f)
* [Android の Chrome や Webview アプリで開発時にはリモートデバッグ機能が便利](http://loumo.jp/wp/archive/20160110120026/)
namespaceのclass名/module名の重複

# 背景

railsのアプリ書いてて、レビューでnamespaceにclass名/module名が使えないという指摘があったので調べた

指摘された時の構成

```
/app
  /models
    hoge.rb
    /concern
      /hoge
        /foo.rb
```

```ruby:hoge.rb
class Hoge < ApplicationRecord
end
```

```ruby:foo.rb
module Hoge::Foo # namespaceとしてのHogeはclassでもmoduleでもいい
  extend ActiveSupport::Concern
end
```

# 結論
namespaceとclass名/module名を区別しないので使えます。

以下、実験

```ruby
[71] pry(main)> class A
[71] pry(main)* end
=> nil
[72] pry(main)> module A
[72] pry(main)* end
TypeError: A is not a module

[74] pry(main)> class A
[74] pry(main)* end
=> nil
[75] pry(main)> module A::A
[75] pry(main)* end
=> nil

[77] pry(main)> class A
[77] pry(main)* end
=> nil
[78] pry(main)> class A::A
[78] pry(main)* end
TypeError: A is not a class
```

75行目の `module A::A` が成功しているのは、 `class A` をnamepaceとして、そこに `module A` を指定しているからっぽい。
`module::class` /  `module::module` だけでなく `class::class`/`class::module`もできるからかなと

実際こんな風にかける

```ruby
[80] pry(main)> class A
[80] pry(main)*   module A
[80] pry(main)*   end
[80] pry(main)* end
=> nil
```

namespaceに関しては、classでもmoduleでも問題ないようですね。

-----
ここからは余談ですが
classとmoduleの名前が重複できないのは、 `#name` だけで管理してるのかなと

```ruby
class A
end
module B
end
module A::C
end

A.name # -> "A"
B.name # -> "B"
C.name # -> NameError: uninitialized constant C
A::C.name # -> "A::C"

A.namespace_name # -> ""
B.namespace_name # -> ""
A::C.namespace_name # -> "A"
```
concrete5でgetThumbnailURL("hoge")の結果が思ったサイズのサムネイルにならない場合

* 画像を再スキャンする。
* キャッシュを消す。

これで解決しました。
キャッシュ設定が無効になってても起こるっぽい。
キャッシュ系はエラーが出ないのでアレですね。
Node.jsの管理をnvmからnodebrewに変更した時のメモ

Node.jsの管理をnvmからnodebrewへ切り替えた際のメモです。



# nvm、npm、nodebrewとは？

そもそもnvmとかnpmとかよく分かっていなかったので整理。(誤りありましたらご指摘を)

nvm(Node Version Manager)とnodebrewは、Node.jsのバージョン管理をするツールです。
npm(Node Package Manager)は、Node.jsで作られたパッケージモジュールを管理するツールです。
npmはNode.jsをインストールすれば一緒にインストールされるみたいです。


nvmの代わりにnodebrewでNode.jsを管理出来るみたいで、
どうやらそちらの方が便利みたいなことを、どこかで読んだのでnodebrewに切り替えてみようとなりました。



# 環境
OS X El Capitan(10.11.6)



# node.jsとnvmの削除

node.jsが既にインストールされているか確認

```
$node -v
v6.6.0

$which node
/Users/kota/.nvm/versions/node/v6.6.0/bin/node
```

私の場合、nvmでnode.jsをインストールしたので、[nvm でインストールしたnode.jsのアンインストール](http://www.tkd55.net/blog/?p=1311)を参考にし、.bash_profileの編集と.nvmフォルダを削除しました。


nvmをインストールした時に.bash_profileに追加した以下の行を削除

```.bash_profile
export NVM_DIR="/Users/kota/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm

nvm use default
npm_dir=${NVM_PATH}_modules
export NODE_PATH=$npm_dir
```

nvmフォルダを削除します。

```
$rm -rf ~/.nvm
```

.bash_profile の変更を反映します。

```
source ~/.bash_profile
```

node.jsが削除されたことを確認

```
$node -v
-bash: node: command not found
```

# nodebrewのインストール

1．下記のコマンドを実行してnodebrewをインストールします。

```
$curl -L git.io/nodebrew | perl - setup
```

2．nodebrewのパスを追加します。

```~/.bashrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

3．追加したパスの反映

```
$source ~/.bashrc
```

# Node.jsのインストール

nodebrewをインストール後、Node.jsをインストールします。

1．インストールするNodeのバージョンを確認
ずらっとバージョンが表示されます。

```
$nodebrew ls-remote
v0.0.1    v0.0.2    v0.0.3    v0.0.4    v0.0.5    v0.0.6

(・・・中略・・・)

v6.9.3    v6.9.4    v6.9.5

v7.0.0    v7.1.0    v7.2.0    v7.2.1    v7.3.0    v7.4.0    v7.5.0


io@v3.0.0 io@v3.1.0 io@v3.2.0 io@v3.3.0 io@v3.3.1
```

2．install-binaryコマンドでコンパイル済みのNodeをダウンロードします。
今回はv6.9.5をインストールします。

```
$nodebrew install-binary v6.9.5
Fetching: https://nodejs.org/dist/v6.9.5/node-v6.9.5-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully
```


通常のinstallコマンドでインストールすると、ダウンロードしてからコンパイルするので少し時間がかかるそうです(私は試してません)

```
$nodebrew install v6.9.2
```

3．使用するNode.jsのバージョンとデフォルトのバージョンを指定

```
使用するバージョン
$ nodebrew use v6.9.5
use v6.9.5

デフォルトのバージョン指定
$ nodebrew alias default v6.9.5
default -> v6.9.5
```

4．別ターミナルを起動してnodeのインストール確認

```
$ node -v
v6.9.5

$ which node
/Users/kota/.nodebrew/current/bin/node
```


# 参考にしたサイト

以下のサイトを参考にさせて頂きました。ありがとうございました。
[nvmでインストールしたnode.jsのアンインストール](http://www.tkd55.net/blog/?p=1311)
[Node.js nvmからnodebrewに乗り換えるぞい！](http://chaika.hatenablog.com/entry/2016/12/07/120000)
Pythonスクリプトからインストールされているモジュールをチェックする

Pythonスクリプトを非プログラマなどに配布する際、依存モジュールがインストールされているかチェックしたい場合があります。
`pip`モジュールを使えば、インストール済みのモジュールとバージョンの一覧を取得可能です。
お薦めはしませんが、スクリプトからモジュールをインストールする事も可能です。

```python
# coding: utf-8
import pip

# インストールされているpackageを返す
pip.get_installed_distributions()
"""
[
    'watchdog 0.8.3'
    'toml 0.9.1'
    'sympy 1.0'
    'Sphinx 1.5.2'
    'sphinx-rtd-theme 0.1.9'
    .
    .
    .
]
"""

# スクリプト上からpackage_nameをインストールする
if pip.main(['install', package_name]) == 0:
    print("ok")
```

なお、配布先の非プログラマが黒い画面（コンソール画面）を立ち上げる知識を有している場合。

動作済みのPC環境から

```
$ pip freeze > requirements.txt
```

で出力したファイルを一緒に配布して

```
$ pip install -r requirements.txt --upgrade
```

をしてもらうか、バッチファイルを実行してもらうのが一番です。
新しくmac買ったらいれるもの

# 英語キーボード

# プログラミング
brew
mysql
postgresql
rbenv
pyenv
docker
virtual box
xcode
android studio
セキュリティ関連

# vj
cinder
vdmx
after effect

# デザイン
photoshop

# 映像
premiere
final cut pro

# dj
ableton
Jenkinsのジョブが停止するとプロセスが全てkillされてしまう時の対応


# 環境
CentOS release 6.6 (Final)
Jenkins 2.7.1


# 課題
Jenkinsのジョブでビルドを行い、
ビルドの後続処理としてシェルを実行してモジュールをデプロイし
tomcatの落としあげをしようとした。

tomcat起動は上手く行ったが、Jenkinsのジョブが終わったと同時に
tomcatのプロセスがkillされてしまう。

# 対応

 https://wiki.jenkins-ci.org/display/JENKINS/ProcessTreeKiller
に書いてあるが、ジョブが完了するとプロセスは全て殺されてしまうらしい。
シェルの中で BUILD_ID という変数を指定することで解決した。

例)
BUILD_ID=xxxxxx(何でもいい) tomcat_start.sh
railsの超短縮系partialの書き方【部分テンプレート】

```
<%= render @notes %>
```
このようなめちゃめちゃ短い形で部分テンプレートを使用できます。

これを使うときは上記の例なら
views/notes/_note.html
というディレクトリ構造にしておく必要があります。

```
renderの指定 → @複数形
ディレクトリ名 → 複数形
partial名（部分テンプレート名） → _単数形
```

実際に書いた例はこんなところです。

```haml:views/notes/index.html.haml
!!!
%html
  %body
    .top-bar
    .wrapper
      .notes
        .notes__header
        .notes__search-bar
        .notes__body
          = render @notes # ここで部分テンプレートの読み込みをしています
      = render partial: "shared/content"
```


```haml:views/notes/_note.html.haml
// 部分テンプレート内での変数名は note が勝手に指定されます。
// 変数noteにそれぞれの@noteが都度入ってくる感じです。
= link_to note_path(note) do
  .notes__body__box
    .notes__body__box__title
      = note.title

    %hr.notes__body__box__line/

    .notes__body__box__body
      = note.body
```

スクリーンショット（それぞれの@noteのtitleとbodyを読み込んでいます）
![スクリーンショット 2017-02-16 13.40.47.png](https://qiita-image-store.s3.amazonaws.com/0/145707/cc9e999d-28d5-e576-e1b4-d1c07e719137.png)


## まとめ
今回の手法を使うと見やすく短く書けます！
railsはきちんと乗っかってあげると素晴らしく効率的に、いい感じにやってくれますね。
Kotlin Android Extensionsを有効にする

Android StudioでKotlin Android Extensionsを使ってみようと思ってググったところ、
古めの記事が引っかかり少し混乱したのでメモも兼ねて。

以下の内容はAndroid StudioへのKotlinプラグインのインストール、プロジェクトのKotlin有効化の設定は済んでいることが前提です。

Kotlin Android Extensionsを使うには、app/build.gradleに以下の1行を追加するだけでOK。

```:build.gradle
apply plugin: 'kotlin-android-extensions'
```

現在Kotlin Extensions for AndroidプラグインはKotlinプラグイン本体に統合されているので、そのインストールおよびbuild.gradle(Project)へのclasspathの追加は必要ありません。
react onClickでprops を渡す

#react onClickでprops を渡す

reactのonClickはチュートリアルなどでよく見かけるbindを使わなくてもイベントを取ってこれる

```jsx:Link

const click =(e)=> {
    e.preventDefault();
    console.log(e);
}
class Link extends Component {
  render(){
    return (
        <li>
          <a href="" onClick={click}>aaa</a>
        </li>
    )
  }
}

```

でもこの下の書き方みたいに引数にpropsを渡したい時にエラーが出ちゃう

```jsx:Link

//ダメなパターン
const click =(e,props)=> {
    e.preventDefault();
    console.log(e,props);
}

class Link extends Component {
  render(){
    return (
        <li>
          <a href="" onClick={click(e,this.props)}>aaa</a>
        </li>
    )
  }
}

```


~~なのでここはあえてbindを使う精神~~ 2017/02/17 修正
コメントでの指摘にもあるようにarrow function でのthisは良くないので修正しました


```jsx:Link

const click =(e,props)=> {
    e.preventDefault();
    console.log(props,e);
}

class Link extends Component {
  render(){
    return (
        <li>
          <a href="" onClick={e => click(e,this.props)}>aaa</a>
        </li>
    )
  }
}

```

これでイベントとpropsが渡せるようになった

## 追記

正確にいうと上記の書き方も正しくない
過去の自分の記事を振り返ってなぜ、clickに即時関数を使ったのかと言われると「今風」だからとしか返せないと思う
即時関数ということはclick処理が発生するたびに関数が生成するのでパフォーマンス的によろしくない

なので、チュートリアルにある通りbindしてthisを束縛するやりかたか
関数を指定するべき
アロー関数が悪いのではなく、clickイベント内でアロー関数を無名関数で実行しているのが悪い


## 参考にしたサイト
[React.jsのEventについて](http://qiita.com/koba04/items/bf8d02a2d0589e9247a7)
Azure Data Facotoryの逆引きリファレンス

#Azure Data Factory

Azure Data Factory(ADF)はデータソースから、データ抽出や生成、転送、バックアップなどを定期実行するための機能です。Azureの分析フレームワークで最初に使う情報管理（information management）系のツールに位置付けられています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/00cf4b3c-f9bd-2aac-9dbc-715b7000365f.png)

ADFを使えば、簡易なJSONやウィザード形式で簡単に定期実行をする、データフローが始められるため、既存のDBやファイルでデータログを管理しているサービスなどには親和性が高いサービスとなっています。

##ADFの問題点

JSONやウィザード形式で提供されている分、かゆいところに手が届かないなどの問題があります。
※ 私はコピーウィザードしか使ったことがないので、一般的な見方とは少し違うかもしれません。

* 細かいフィルタなどはかけない
　SQLクエリーを入れることはできますが、はっきり言ってADFではおまけ程度です。

* 作成した後変更方法などが分かりにくい
　単にUIの問題ともいえますが、直感的に作業するにはAzure慣れが必要です。

ですので、備忘録的に、ADFの”この時はこうする”を書いておきます。

# 逆引きリファレンス

以下のブレードから始まるADFですが、ここからの目的となる操作項目へのパスが多種多様で、かなり迷います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/9f7453d0-ff7b-996d-f1cd-d4d0c793fd00.png)

## パイプラインを編集したい

[パイプライン]->対象のパイプラインを選ぶ->パイプラインソース

でパイプラインのJSON編集ブレードが現れます。これは特にわかりにくいところは無いです。

入力ソースの切り替え、頻度の編集、クエリーの編集などができます。


## スケジュールされたパイプラインを即時実行したい

これはわかりにくいです。

[監視と管理]->対象のパイプラインを選ぶ->アクティビティウィンドウで最新のアクティビティを選ぶ-> Rerun

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/0dfd4e2f-1ddf-ce53-0ed8-74078c5edd71.png)

Rerunはメニューバーの最初（一番左）のボタンです。これ以外にも方法はありそうですが、見つかりませんでした。

## パイプラインを起動、停止、一時停止する

[監視と管理]->対象のパイプラインを選ぶ->メインウィンドウの再生ボタンなどを押す

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/33e98b1d-4843-3e28-0cda-96921deedd46.png)

これもわかりやすいですが、ここまでのパスを忘れてしまいます。

また増えたら追加していきたいと思います。
heroku-buildpack-mecabで独自辞書を使う

# tl;dr

Procfileに良い感じに書くとok

# 環境

- [heroku-buildpack-mecab](https://github.com/diasks2/heroku-buildpack-mecab),  [commit](https://github.com/diasks2/heroku-buildpack-mecab/commit/415a9aebd9b7cd8020fa2eee0ae3c4a4bcf1df57)

# HerokuにおけるProcfile

Procfileは1行しか書けませんが、bashを起動することによって複数コマンドを実行することができます。

```
$ cat Procfile
bot: bash heroku_exec.sh

$ cat heroku_exec.sh
/app/vendor/mecab/libexec/mecab/mecab-dict-index -d /app/vendor/mecab/lib/mecab/dic/ipadic -u original.dic -f utf-8 -t utf-8 dic.csv
mv original.dic /app/vendor/mecab/lib/mecab/dic/ipadic/

echo "userdic = /app/vendor/mecab/lib/mecab/dic/ipadic/original.dic" >> /app/vendor/mecab/lib/mecab/dic/ipadic/dicrc

/app/vendor/bundle/ruby/2.4.0/bin/bundle exec ruboty
```

※最後の1行は皆さんの環境に合わせて変更してください

このように書いてユーザー辞書を`dic.csv`としてリポジトリに含んでおくと、勝手にユーザー辞書として反映されます。

実際に動いているリポジトリは[こちら](https://github.com/whywaita/ruboty-d250g2)です。

# 利点
## Herokuに辞書を置く
辞書作成は意外とコマンドが長くて面倒なのですが、この辺の扱いを気にせずCSVを書けば良いだけなので非常に楽です。

## gitで管理できる
GitHubなどのgitホスティングサービスを使って管理していると、Pull Requestベースで管理出来たりと便利です。

実際にはこのようなPRが飛んでくる想定です。

https://github.com/whywaita/ruboty-d250g2/pull/11

# まとめ

- Procfileはshellを開けばなんでも書ける
- MeCab独自辞書をHerokuで管理するの結構楽
- 良い形態素解析ライフを
DB2DBA: ストアドプロシージャの実行計画管理

DB2のSQL/PLによるストアドプロシージャは通常、CREATE PROCEDURE時にSQLがコンパイルされパッケージBINDが行われるため、CやCOBOLの埋込SQLプログラムと同様に静的SQLとしての実行計画管理が必要となります。

# 運用の原則
RUNSTATS未実施の状態でCREATE PROCEDUREを行うと、統計情報がない状態で実行計画が決定されます。そのまま実行するとそこで確定した実行計画が使用されるため、パフォーマンス問題が発生するリスクがあります。

適切な実行計画をDB2に選択させるためには、CREATE PROCEDUREをRUNSTAS後に実施するか、RUNSTATS後にREBINDを実施してください。


# パッケージの確認
以下のカタログビューからストアドプロシージャが使用しているパッケージに関する情報を取得することができます。

- SYSCAT.ROUTINES
- SYSCAT.ROUTINEDEP
- SYSCAT.PACKAGES

```sql
SELECT
	SUBSTR(rtn.routineschema, 1, 8) AS rtnschema
	,SUBSTR(rtn.routinename, 1, 32) AS rtnname
	,SUBSTR(rtn.specificname, 1, 32) AS specificname
	,SUBSTR(pkg.pkgschema, 1, 8) AS pkgschema
	,SUBSTR(pkg.pkgname, 1, 12) AS pkgname
	,pkg.last_bind_time
FROM
	syscat.routines AS rtn
	INNER JOIN syscat.routinedep AS dep
		ON rtn.routineschema = dep.routineschema
		AND rtn.specificname = dep.specificname
	INNER JOIN syscat.packages AS pkg
		ON dep.bschema = pkg.pkgschema
		AND dep.bname = pkg.pkgname
WHERE
	rtn.routineschema NOT IN
	(
		'SYSIBM'
		,'SYSIBMADM'
		,'SYSIBMINTERNAL'
		,'SQLJ'
		,'SYSCAT'
		,'SYSFUN'
		,'SYSPROC'
		,'SYSPUBLIC'
		,'SYSSTAT'
		,'SYSTOOLS'
		,'NULLID'
		,'NEWTON'
		,'OBSIEGER'
	)
	AND rtn.routinetype = 'P'
	AND dep.btype = 'K'
ORDER BY
	rtn.routineschema
	,rtn.routinename
	,rtn.specificname
	,dep.bschema
	,dep.bname
;
```

```
RTNSCHEMA RTNNAME                          SPECIFICNAME                     PKGSCHEMA PKGNAME      LAST_BIND_TIME            
--------- -------------------------------- -------------------------------- --------- ------------ --------------------------
SVC34     TESTPROC                         SQL170215172851122               SVC34     P693021293   2017-02-15-22.28.51.196170
```

# REBIND
SYSCAT.ROUTINEDEPから取得したパッケージ名をREBINDコマンドに直接指定することも可能ですが、このパッケージ名は数字の羅列であるため扱いが面倒です。

管理プロシージャREBIND_ROUTINE_PACKAGEを利用すれば、ストアドプロシージャ名を指定してパッケージをREBINDすることが可能です。

```sql
CALL REBIND_ROUTINE_PACKAGE('P', 'SVC34.TESTPROC', '') ;
```


# EXPLAIN
管理プロシージャEXPLAIN_FROM_CATALOGもしくはシステムコマンドdb2explnにより、パッケージで使用されているSQLのEXPLAINを行うことができます。

```sql
CALL EXPLAIN_FROM_CATALOG('SVC34', 'P693021293', '', 1, 'SYSTOOLS', ?, ?, ?, ?, ?) ;
```

```sh
$ db2expln -d maildb -terminal -graph -schema SVC34 -package P693021293 -section 0
```

ただし、これらによって確認できる実行計画はあくまでもEXPLAIN実行タイミングのものであることに注意してください。確定している実行計画を見るには、CREATE時またはREBIND時のEXPLAIN結果を取得しておく必要があります。

CREATEおよびREBINDと同時にEXPLAINが実行されるようにするには、管理プロシージャSET_ROUTINE_OPTSを使用します。これはストアドプロシージャ用パッケージのBINDオプションを変更するもので、ここにEXPLAIN YESを設定した状態でCREATE PROCEDUREを実施します。

```sql
CALL SET_ROUTINE_OPTS('EXPLAIN YES') ;
CREATE PROCEDURE ... ;
CALL SET_ROUTINE_OPTS('') ;
```

この状態で作成されたパッケージはREBIND時にも毎回EXPLAINが行われ、結果がEXPLAIN表に追加されていきます。


# 参考資料

- IBM Support
    - [[DB2 LUW] SQL ストアード・プロシージャーのアクセス・プランを取得する方法](http://www-01.ibm.com/support/docview.wss?uid=swg21614846)
- IBM developerWorks
    - [DB2 packages: Concepts, examples, and common problems](https://www.ibm.com/developerworks/data/library/techarticle/dm-0606chun/)
ローカルブランチの削除コマンド

気がついたら、大量にローカルブランチができてる時に使ったコマンド

### 問答無用で全削除
```
git branch | xargs git branch -D
```

### 問答無用で条件にマッチするものを全削除
```
git branch | grep <文字列> | xargs git branch -D
```
Centos6.5にpython2.7を入れたメモ

Coetos6.5にpython2.7をインストールする時必要があったので、
http://qiita.com/Kodaira_/items/feadfef9add468e3a85b
を参考に導入してみました。


###事前に必要なパッケージ

```
$ yum install gcc
$ yum install bzip2-devel
$ yum install zlib-devel
$ yum install gcc
$ yum install -y sqlite-devel.i686
```

###pyenvのインストール
gitからCloneしてくる。

```
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
```

で、（~/.bash_profile）に以下を追記

```
export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
```

ここまででインストール一旦完了

##特定のバージョンのインストール

```
$ pyenv install 2.7.9
```


■2.7に切り替える

```
$ python --version
$ Python 2.6.6
$ pyenv shell 2.7.9
$ python --version
$ Python 2.7.9
```
こうすると、systemのPythonを使用する。

```
$ pyenv shell system
$ python --version
$ Python 2.6.6
```
Macの標準ブラウザを変更するための設定方法


slackやkobitoなどのデスクトップアプリからURLを踏むと`Safari`が起動します。
これを普段使いしているブラウザ(chrome)に変更します。

忘れないようにメモ。

```手順
1.システム環境設定の「一般」を選択
2.デフォルトWebブラウザを「Google Chrome」に変更
```

以上。
curlでproxyを通したくないときの対応

いや、ホント、man読めって話しと、思い込み危険って話しなんですけど。

curlのバージョンは以下の通り。

```bash
$ curl -V                                                                                                           
curl 7.51.0 (x86_64-apple-darwin16.0) libcurl/7.51.0 SecureTransport zlib/1.2.8
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets
```

curlには7.19.4以降`--noproxy`というオプションが追加されています。

manを読むと、proxyを使いたくない宛先ホスト名をカンマ区切りで並べろということです。

```
--noproxy <no-proxy-list>
      Comma-separated  list of hosts which do not use a proxy, if one is specified.  The only wildcard is a
      single * character, which matches all hosts, and effectively disables the proxy. Each  name  in  this
      list  is matched as either a domain which contains the hostname, or the hostname itself. For example,
      local.com would match local.com, local.com:80, and www.local.com, but not  www.notlocal.com.   (Added
      in 7.19.4).
```

オプション名だけ見て↓な感じでcurlぶん投げてて、そりゃ届かんよなって感じになってました…

```bash
$ curl --noproxy -i -X POST -H "Content-Type: application/json" http://example.com/users -d @user.json
```

以下のように、proxyを通したくないホスト名を指定するのが正しいです。

```bash
$ curl --noproxy example.com -i -X POST -H "Content-Type: application/json" http://example.com/users -d @user.json
```


ちなみに7.53.0からは、空文字(`""`)を指定することで、環境変数に設定した`no_proxy`を打ち消すこともできるようになる(まだリリースされていないはず？)みたいです。

```
--noproxy <no-proxy-list>

Comma-separated list of hosts which do not use a proxy, if one is specified. The only wildcard is a single * character, which matches all hosts, and effectively disables the proxy. Each name in this list is matched as either a domain which contains the hostname, or the hostname itself. For example, local.com would match local.com, local.com:80, and www.local.com, but not www.notlocal.com.

Since 7.53.0, This option overrides the environment variables that disable the proxy. If there's an environment variable disabling a proxy, you can set noproxy list to "" to override it.

Added in 7.19.4.
```
https://curl.haxx.se/docs/manpage.html

### おまけ

常にproxyを通さないで良い場合は環境変数`no_proxy`に設定すれば良いわけですが、`172.19.*`といった形でワイルドカード指定してもうまく動いてくれません。(ここもボケていて、ワイルドカード指定していて効いてませんでした…)

* [no\_proxy にネットワークアドレスとかワイルドカードを指定しても期待通りに動かない、でどうするかというお話 \- 双六工場日誌](http://sechiro.hatenablog.com/entry/2013/08/06/no_proxy_%E3%81%AB%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%A8%E3%81%8B%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E3%82%92)
Liferay 7 / DXP- Workflow/ワークフロー Scriptからのカスタムサービス・標準サービスのコール方法

#Liferay7/DXP - Workflow/ワークフロー Scriptからのカスタムサービス・標準サービスのコール方法

Liferayの強力な機能のうちの１つに、ワークフローがある。ワークフローは管理画面のKaleo Designerを利用して、グラフィカルに設定を作成することができるが、実際の案件では標準機能だけではなく、スクリプト(Groovy, Javascript)を利用して、動的に承認者の選択・通知を行うことがよくある。

その際に、Liferay組み込みのサービスや、自身が開発したカスタムサービスを利用することが多いが、dev.liferay.comにある標準サービスコールが古い6.2のLocalServiceUtilを利用した方法のままで、これは間違った方法なので、以下にサンプルを作成してみた。

Liferay7/DXPからアーキテクチャーがOSGiに移行し、6.2の時からサービスのコール方法が変わっている。OSGiのフレームワークに対して問い合わせをして、必要なサービスを取ってくる、という形になる。

普通にJavaコード内からサービスを呼び出す場合は、https://github.com/liferay/liferay-portal 内のLiferayコアにあるサービス群のコーディングを参考にしてもらえばわかるように、@Referenceアノテーションを利用して

###Javaコード内でのサービス取得方法(liferay-portalコードから抜粋)
```java:WSRPAdminPortlet.java
@Reference(unbind = "-")
protected void setWSRPConsumerPortletLocalService(
    WSRPConsumerPortletLocalService wSRPConsumerPortletLocalService) {

    _wSRPConsumerPortletLocalService = wSRPConsumerPortletLocalService;
}

private static WSRPConsumerPortletLocalService
    _wSRPConsumerPortletLocalService;
```

のように書けるが、Workflow内のscripted-assignmentなどのタグ内では以下のように記載する。

###Scriptページ/Workflow内でのサービス取得・利用方法
```
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker
import com.liferay.portal.scripting.groovy.internal.GroovyExecutor


def st = null
try {
    Bundle bundle = FrameworkUtil.getBundle(GroovyExecutor.class);

    st = new ServiceTracker(bundle.getBundleContext(), "com.liferay.journal.service.JournalArticleLocalService", null);

    st.open();
    if (!st.isEmpty()) {
        def service = st.getService();
        def articles = service.getArticles();
        for (def article: articles) {
            System.out.println("article Name:${article.getUrlTitle()}");
        }
    }
} catch(Exception e) {
    System.out.println("Handle error here appropriately")
    e.printStackTrace()
} finally {
    if (st != null) {
        st.close()
    }
}
```

これはWorkflow定義に記載してもらっても動作するが、簡単に試したい場合は、何かWebコンテンツを作成したあとに、Control Panel -> Configuration -> Server Administration -> Scriptから、Groovyを選択してもらい、Scriptフィールドに上記のコードを貼り付けてもらうと、作成したWebコンテンツのタイトルが表示される。

OSGiのお作法に則り、FrameworkUtil.getBundleで起点となるバンドルを指定（この場合はGroovy Scriptエンジンを利用しているので、GroovyExecutor.classを指定している）次にServiceTrackerで対象となるサービスを取得してきている。
Railsで新規アプリケーションを作成　MEMO

# はじめに
駆け出しのエンジニアがRailsで新規アプリケーションを作成しviewを表示させるまでのメモ。
hamlを使用しています。

# Version
Programming歴: 70日目
Ruby:　2.3.1
Rails:　5.0.1

# Step 1 - アプリケーションの作成
　

```:terminal
$ cd 
```
一旦ホームディレクトリに戻って、

```:terminal
$ cd projects
```
アプリケーションを作成・保存したいディレクトリに移動する。今回は「projects」ディレクトリにアプリケーションを作成・保存します。

```:terminal
$ rails new <新規アプリケーションの名前> -d mysql
```

「-d」はデータベースの種類を指定するオプション。今回はmysqlを用いてアプリケーションを作成します。

```:terminal
      create  
      create  README.md
      create  Rakefile
      create  config.ru
      ...
      ...
      ...
Use `bundle show [gemname]` to see where a bundled gem is installed.
         run  bundle exec spring binstub --all
* bin/rake: spring inserted
* bin/rails: spring inserted
```
ズダダダーっとterminalが走って、rails newコマンドが完了。projectsディレクトリ以下に新規アプリケーションが作成されました。

```:terminal
$ cd <新規アプリケーションの名前>
```
アプリケーションのディレクトリに移動しましょう。


```:terminal
$ rake db:create
```
データベースを作成し、

```:terminal
$ rails s
```
「rails s」コマンドでサーバーを立ち上げて、「http://localhost:3000/」 にアクセス。以下のような画像が表示されればOK!

<img width="634" alt="スクリーンショット 2017-02-15 22.54.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/158026/d835f317-8345-971b-8425-0e65023c4b00.png">

# 2. Model、Controller、Viewの作成と最低限のRouting

今後、「rails g」コマンドを用いてModelやControllerなどを作成していくが、
その際一緒にデフォルトで生成されてしまうhelper file、test file、assetsを生成されないように
以下のように記述を加える。（この3つは、必要になった時に手動で作れば良い、と思う。）

```config.application.rb
config.generators do |g|
 g.helper false
 g.test_framework false
 g.assets false
end
```

●Model作成

```:terminal
$ rails g model <modelの名前（単数形）>
```
今回はまずevent　modelを作りたいので、

```:terminal
$ rails g model event
```
とします。

●table作成

```:terminal
$ rake db:migrate
```

●Controller作成

```:terminal
$ rails g controller <Controllerの名前（複数形）>
```

今回はまずevent　controllerを作りたいので、

```:terminal
$ rails g controller events
```
とします。

●View作成
今回viewはhamlで記述したいので、gemをインストールします。Gemfileに以下を追記し、

```:Gemfile
gem 'haml-rails'
gem 'erb2haml'
```

```:terminal
$ bundle install
```

これでhamlが使えるようになりました。

デフォルトでアプリ内にあるerbファイルをhamlに変換したいので、以下のコマンドを実行。

```:terminal
$ rails haml:replace_erbs
```

アプリ内のerbファイルをhamlに置き換えました。

その上で、app/views/eventsに、index.html.hamlを手動で作成。中に適当に文字を書きます。

```:app/views/events/index.html.haml
Create an app from scratch!!
```

●Routingの設定

```config.routes.rb
Rails.application.routes.draw do
  root "events#index"
  resources :events, only: [:index]
end
```

このように記述。


これで、完了！

http://localhost:3000/
にアクセスすると以下のような表示になるはず。

<img width="462" alt="スクリーンショット 2017-02-16 11.31.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/158026/66b4593f-71e5-af28-04a6-c1722adcb02f.png">

ならない場合はサーバー立ち上げ忘れの可能性あり。「rails s」を再度する。
C#のSMOを使ってMicrosoft SQL Serverのバックアップを取る方法

日本では情報が少なかったので、海外のフォーラムを参考に使えるところまでまとめました。
コメントはほぼ割愛。
この情報にたどり着いてる時点で、下記のサンプルだけあれば十分かと思います。
あとは自分のプログラムに合わせてソースを変えてください。

SMOとは
https://msdn.microsoft.com/ja-jp/library/ms162151.aspx

Backupクラスの説明
https://msdn.microsoft.com/ja-jp/library/microsoft.sqlserver.management.smo.backup.aspx

```csharp:SqlBackup.cs
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

//SQLの接続情報が入っているdll
using MySqlServerDatum;

public void SqlBackup(){
    try{
        //SQLへの接続情報
        MySqlServerDatum.Info info = new MySqlServerDatum.Info();
        SqlConnection sc = new SqlConnection(info.connectionString);
        Server s = new Server(new ServerConnection(sc));

        //ここの型への名前空間はあえてフルパスにしています。Backupでも動作しますが、念のため。
        Microsoft.SqlServer.Management.Smo.Backup b = new Microsoft.SqlServer.Management.Smo.Backup();
        b.Action = BackupActionType.Database;
        b.Database = info.databaseName;
        b.Incremental = false;
        b.Initialize = true;
        b.LogTruncation = BackupTruncateLogType.Truncate;
        
        //バックアップする場所を設定
        BackupDeviceItem backupItemDevice = new BackupDeviceItem("C:\\"+@"\"+info.databaseName+".bak", DeviceType.File);
        b.Devices.Add(backupItemDevice);
        b.SqlBackup(s);
    } catch(Exception ex){

    }
}
```
Retrofit2でGsonのポリシー設定

```
// Gson
Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();

//クライアント生成
OkHttpClient client = httpClient.build();
retrofit = new Retrofit.Builder()
        .baseUrl(url)
        .addConverterFactory(GsonConverterFactory.create(gson))
        .client(client)
        .build();
```
Cognos ログイン画面にメッセージやリンクを表示する簡単な方法

Cognosのログイン画面は、デフォルトで以下のようなイメージです。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/43b74612-8fa1-e3e9-2bba-bca4915f46ad.png)

この画面上に、パスワード期限切れの場合に対応して、パスワード変更のリンクなどを以下のように埋め込みたい、という要望が良くあります。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/15f4c5ee-126e-6fb5-02fb-ac71750a3279.png)

非常に簡単な方法で実現できますので、Tipsとして覚えておいて頂ければと思います。
※あくまでメッセージとリンクを表示しているだけで、LDAPに接続してユーザーIDのパスワード期限をチェックとか、そういう事はやっていません。

##手順
C:\Program Files\ibm\cognos\c10_64\webcontent\ps\portal\js\faultlogin.js ファイルの先頭の以下の箇所に、太字の行を追加するだけで実現できます。
※redirecturlは、ご使用の環境のURLを指定してください。


function init()
{

**var copyright = document.getElementById("loginCopyright");**
**var message01 = "【パスワード変更】";**
**var message02 = "パスワード変更サイトに移動し、パスワードの変更をお願いします。";**
**var message03 = "パスワード変更はこちらから";**
**var redirecturl = "http://www.ibm.com";**
**copyright.innerHTML = message01.bold() + "\<br>\<br>" + message02 + "\<br>\<br>" + "\<a href='#' onclick='window.open(\"" + redirecturl + "\", \"_blank\", \"height=1000,width=1000,menubar=0,toolbar=0,location=0,directories=0,status=0,scrollbars=0,resizable=0\")'>" + message03 + "\</a>";**

if (document.pform != null) {


##参考
こちらにCognos TM1Web版のログイン画面カスタマイズを投稿しましたので、併せてご参照下さい。
http://qiita.com/shinyama/items/7619c74cbd3e134a8432
MySQLのtimezoneをUTCに出来ないときに試すメモ

mac。MySQL は Oracle 公式パッケージでインストールした 5.7。

そのままだと JST で時刻が扱われたので、
↓ 下記を作成する。

```my.cnf
$ cat /etc/my.cnf 
[mysqld_safe]
timezone = UTC
default-time-zone = UTC
```

これで、システム環境設定からmysqldをstop->startしたが、UTCにならなかった。

```mysql
mysql>  show variables like '%time_zone%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
2 rows in set (0.00 sec)

mysql> select NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2017-02-16 10:33:06 |  
+---------------------+
1 row in set (0.00 sec)
```

↑ JSTの現在時刻が返ってきている

そこで。

timezone情報をmysqlデータベースに入れる。

```bash
$ sudo /usr/local/mysql/bin/mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
```

```mysql
mysql>  show variables like '%time_zone%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| system_time_zone | JST   |
| time_zone        | UTC   |
+------------------+-------+
2 rows in set (0.02 sec)

mysql> select NOW();
+---------------------+
| NOW()               |
+---------------------+
| 2017-02-16 01:34:20 |
+---------------------+
1 row in set (0.00 sec)
```

↑ UTCで返ってきてくれた :raised_hands:
Cousera - Andrew Ng 先生の Machine Learning Week 2

[前回](http://qiita.com/ryohey/items/7db8d3a35bce7e392a58) から一ヶ月近く経ってしまったその理由とは・・・

## 概要

変数が複数になった Linear Regression について学びました。

- 複数の変数に対して最急降下法を使う場合に、Feature Scaling という手法を使うとよい
- J(θ) の変化をプロットして Learning Rate を変えるとよい
- Octave のチュートリアル
- Octave で書いたプログラムの提出

## 所感

学習率や Feature Scaling の設定が思っていたより感覚的に行われていて面白かった。最急降下法は使いやすいツールなんだと感じました。

## 講義メモ

### univariate linear regression

前回までのやつ

```math
h_θ(x) = θ_0+θ_1x
```

### Multivariate linear regression

今回のサンプルごとにn個データがあるバージョン

```math
h_θ(x) = θ_0+θ_1x_1+θ_2x_2 ... θ_nx_n
```

行列で書くと

```math
h_θ(x) = θ^Tx
```

このとき、

```math
x_0 = 1
```

とおく

### Feature Scaling

- 最急降下法を早く収束させるテクニック
- 値の幅が大きく異なると時間がかかる x1が0〜2000, x2 が1〜5 のようなとき
- 同じ範囲(-1〜1)になるようスケーリングする
- 1 に大した意味はなく、3 とか -2 とかなら問題ない
- Andrew 先生的には -3 to 3 や -1/3 to 1/3 くらいなら問題ないらしい
- x0以外について平均が0になるようにする

例: xi が 100 to 2000 なら

xi := (price - 1000) / 1900

このくらいにする

### 最急降下法が正しく動いてるか確認する方法

- イテレーション回数を横軸にJを縦軸にしてJがちゃんと毎回下がっていっているか確かめる
- 何回くらいで収束するかは分からない
- J(θ)がとても小さい値しか下がらなくなったら停止するautomatic convergence testもできるが、そのとても小さい値を決めるのは難しいのでグラフをプロットして確かめるのがよい

### αの決め方

- グラフが増えていったら αが大きすぎる
- お椀型のように下がって増えてのときも大きすぎる
- 波打つように上がり下がりするときも大きすぎる
- 十分に小さければ下がっていくが、収束に時間がかかる
- 小さすぎると思う値から3倍ずつ大きくするか、大きすぎると思う値から1/3倍ずつ小さくするかでだいたいいい感じのαを見つけられる

### polynomial regression

曲線にフィッティングできる

```math
h_θ(x) = θ_0 + θ_1x
```

のような変数がxひとつしかないものでも、

```math
h_θ(x) = θ_0 + θ_1x + θ_2x^2
```

のようにするとか、

```math
h_θ(x) = θ_0 + θ_1x + θ_2\sqrt{x}
```

のようにすると曲線が作れる
データのグラフから洞察を得て仮説を作る (どう増えていくか、どういう曲線かとか)

### Normal Equation 正規方程式

```math
θ = (X^TX)^{-1}X^Ty
```

Jの傾き = 0 となる θ (それぞれのθの微分方程式を解いたもの) をまとめるとこうなる

### Gradient Descent vs Normal Equation

- α を決める必要がある / αはない
- 多くの iteration が必要 / iteration は必要ない
- n が大きいと機能する / n が大きいと計算量が莫大
  - -> n が 1000 くらいなら (現代のコンピュータなら) Normal Equation でよい
  - -> 10000くらいから悩む 10^6 なら Gradient Descent を使う

## Octave と課題メモ

平均値を計算する mean と標準偏差を計算する std があり、(X - mean(X)) / std(X) とすると例の計算ができそうなのですが、std(X) にゼロが含まれていると NaN になってしまうので困りました。ところが 0 の場合は 1 で除算する zscore というそのものズバリな関数がありました。

## コースの switch について

due date をしばらく過ぎると web の画面にクラスを切り替えるボタンが出てきて、押すと次の週のクラスに切り替わります。以降の期日が全部ずれてまたスケジュールを始めることができます。

公文式も進研ゼミも宿題を積み上げて結局辞めてしまった僕はこの仕組でモチベーションが保たれたのですごい良いと思いました。

## Programming Assignment 

この週の最後に宿題提出です。
Mutivariate linear regression を Octave で実装してサーバーに送信すると、機械的に採点され、必要な課題を達成すると完了となります。
Feature Scaling などは必須ではない課題になっており、とりあえず時間があったらやることにして置いておきました。

## なぜ遅れたか

通勤時間で iPhone を使って進めていたのですが、iOS の Coursera アプリでキーボードに隠れて解答ボタンが押せないクイズがあったり、そもそもプログラミング課題ができないなどの問題があり、家での時間が取れずに終わらせずにいました。さらに Windows 10 に Octave をインストールしたのですが、頻繁に固まったりして結局 Mac でやるなどして無駄に時間を割いてしまいました。

ただ、課題自体はちゃんと授業を見返せば簡単で、Octave の使い方についても授業で詳細な説明があったので、特に Coursera 以外の資料を見なくてもこなすことができました。

## 遅れたもう１つの理由

5pb. ウィンターセールで買った CHAOS;HEAD NOAH が面白すぎて電車でずっと Vita を使っていたからでした。

はい。Week 3 に進んでまた動画で進められるので通勤勉強タイムを再開します！
RuboCopは自動修正のみ使うと捗る

# RuboCopの解析結果をPull Requestにコメントするのをやめた

弊社では[pronto](https://github.com/mmozuras/pronto)というライブラリを使って、[RuboCop](https://github.com/bbatsov/rubocop)による静的解析の結果をPull Request（以下PR）にコメントして自動コードレビュー的なことをしていた[^0]。これをつい最近やめた。理由は下記の2つ。

[^0]: 設定は[onkcop](https://github.com/onk/onkcop)をカスタマイズしたもの。

# 理由1: フィードバックに意味がない

RubocopがPRのページに残す「メソッドの行数が長すぎる」などの指摘は、今のチームでは多くの場合トレードオフを踏まえた意図的な判断であり、改めてそれをコメントで指摘する意味はさほどない[^1]。

# 理由2: 人間が指摘を受けて直すのは無駄

RuboCopは多くの違反を[自動修正できる](https://github.com/bbatsov/rubocop/wiki/Automatic-Corrections)。弊社ではこの機能を使い、Jenkinsから定期的に自動修正をかけてPRを出している。自動で修正できるにも関わらずコードフォーマットに対する指摘を人間が修正することは、その行為に副次的な価値が有る場合を除き時間の無駄である[^2]。

[^1]: 教育的な効果が必要な場合はあるかも。
[^2]: 同上

# 自動修正のやり方

下記のスクリプトをJenkinsから定期実行している。要[hub](https://github.com/github/hub)。

```shell-session
#! /bin/bash -xe

bundle
bundle exec rubocop --auto-correct $(git ls-files | grep -E -v "^(db|bin)" | grep "\.rb$") || true
git diff --exit-code && exit 0
git add .
timestamp=`date +'%Y%m%d%H%M'`
commit_comment="rubocop --auto-correct $timestamp"
git commit -m "$commit_comment"
git checkout -b rubocop-auto-correct-$timestamp
branch_name=`git name-rev --name-only HEAD`
git push -u origin $branch_name
hub pull-request -m "$commit_comment" -h proper-inc:$branch_name
```

# まとめ

ということで、RuboCopでPRにコメントするのはやめて、RuboCopの自動修正のみ活用するようになった。自動修正でコードのお行儀的には及第点まで持っていける感触です。コードフォーマットが揃っているとノイズが少なくて読むのがかなり楽になる。ちなみに[ESlint](http://eslint.org)と[CSScomb](http://csscomb.com/)も同じように使ってお行儀を維持しています。

# おまけ
年をとって考えるのをやめるエンジニア

# エンジニアは何歳で定年か

プログラマ35歳定年説は、昨今の言説によれば、「プログラマには一定額以上の給料を払いたくない」「年功序列で年をとると給料があがる」「プログラマにはらってもいいと経営層が思っている金額を出せるのが35歳まで」というロジックらしいのだが、まあクソみたいな話である。
よいプログラムを書いて欲しければ金を払えという話だ。年齢は関係ない。

とはいえ、年齢を重ねると、いや家庭を持って、子供という非生産者が家庭に加わると、否が応でも金が必要になり、結局年をとるとそれだけの理由で給料をあげてもらわないとやってられないという切実な事情も理解できる。

理想的な給与体系というのが、私はいまだに分からない。
完全能力給としたとして、家庭が重石になっているような場合、本人の能力はあるが成果は出せない（たとえば子供が病気で頻繁に早退・欠勤するなど）場合は、どう評価する？
能力を評価するのであれば、成果が出ていなくても評価するべきじゃないのか？

それに、能力のあるなしを言われても、子供に金がかかる事実はなにをどうやっても変えようがない。子育て支援とか、子育てしやすい社会ってのと、子供がいても能力がないやつには給料出さないよというのは、両立できるのだろうか。

色々と悩ましい問題はあるが、私自身はエンジニアが現場のエンジニアでいることに定年なんてあって欲しくないし、クソ喰らえと思っているし、自分は死ぬまでエンジニアリングの仕事をしていたいと思っている。
もちろん、それで相応の給料をもらうというのは当然の前提だ。

# 考えるのをやめる人

きっかけが何なのかは分からない。年齢的なものなのか、何か事情があるのかは、分からない。

ある日をさかいに、考えるのをやめてしまうエンジニアというのを何人か見てきた。
何かの理由で心が折れてしまったのかもしれないが、踏み込んだ事情は分からない。

同じように、ある日をさかいに勉強することをやめてしまうエンジニアというのも見てきた。
これについては、もしかすると元々勉強なんかずっとしていなくて、たまたま過去のちょっとした経験で生き延びられていただけの可能性はある。

逆に、若い者には敵わん的なことを言っていた人が、ある日をさかいに急に最近のホットなウェッブテクノロジーとかをばりばりと勉強してばりばりと実装できるようになっている例も見たことがある。

人生とは、奇っ怪だなあと、本当に思う。

# 彼らは生きていけるのか

考えることをやめ、学ぶことをやめたら、彼らはエンジニアではいられない。
少なくとも一流のエンジニアではいられない。
何か別の方法で飯を食う算段をしなければならない。

もしぬるい会社なら、ぬるいエンジニアとして生きていけるのかもしれない。ぬるいエンジニアというのがどういう仕事をする人なのか、私はよく分からないが。
大手なら、抱えている業務の種類が多いので、別の業務に再配置されるということもあるのかもしれない。大手の人事制度がどれだけ柔軟なのか、私はよく分からないが。

ただ、単純にバッファが大きいという理由だけでも、大企業なら生きていけるのではないかと思う。
ずっと現役のエンジニアだったり、管理職になってもプレイングマネージャだったりすることが求められる中小のベンダでは、止まることは死を意味する。
なぜなら、若者は優秀で、日々変化する技術トピックに目を輝かせて飛びついて勉強し、当たり前のものとして吸収する。どうせなら新しくて楽しい仕事は彼らに回したい。
そして考えることをやめたエンジニアは、新しいことを学びもしないので、彼らにアドバイスする側にも回れない。いや、そもそも、考えることをやめてしまうタイプの人は、小手先の技術ではない本質的な考え方や哲学の部分の土台がないことが多いような気がする。偏見かもしれないが。

馬力で頑張ってきたのが、息切れしてしまったのかもしれない。

どう考えても生きていけるはずがない彼らは、ではどうすれば生きていけるのだろう。

# 生き残り方

現場のエンジニアリングからは離れるという方法はあると思う。管理する側に回るわけだ。
ただ、どんどん「技術のことを知らないのに、指示だけは出さなければならない」というつらい立場になる。私には耐えられないが、そういうのが性にあっているか、割り切れるひとはそれでいいだろう。
ただし、分からないのに不適切な口出しだけはする類の上司にはなりたくないものである。

次に、分かることだけ、できることだけやる、という生き残りかたはある。レガシーシステムのメンテ、などである。これはこれで悪くない。レガシーシステムそのものへの風当たりはあるかもしれないが、そんなものは担当者の責任ではない。レガシーシステムのお守りをして定年まで逃げきれば勝ちかもしれない。

次に、若者の部下になってしまうという手もある。分からないので、手取り足取り教えてくださいと、若者に頭を下げるのである。これも別に悪いことではない。だって自分は分からなくて、若者が分かっているのなら、教えを乞うのは恥ずかしいことではない。
ただこの業界によくあるパターンとして、若者側が教えるのが上手という保証はどこにもないということと、教えてもらうことで若者側のパフォーマンスを奪ってしまうことになるという懸念がある。
だから部下になるなら、スーパーな若者の部下になるべきなのだが、スーパーな若者は放っておいても上司になるので、結果的にこうなることは、まあ珍しくない。

こうしてみると、考えるのをやめてスターチャイルドになっても、地球を握りつぶすこともなく、しずかに生きていくことはできるのかもしれない。

# おわりに

だけどどうしても私は思ってしまう。

「どうしてこの人は、考えるのをやめてしまったのだろうなあ」と。
web制作者にもわかる、Swift 3が++と--を削除した理由

JavaScriptやC等の言語の経験があれば、変数の値を1増やすインクリメント(`++`)、1減らすデクリメント(`--`)を使ったことがあるでしょう。しかし、**macOSやiOS用アプリ開発言語[Swift](https://www.apple.com/jp/swift/)のバージョン3からはこの2つの演算子は削除されました**。

本エントリーでは、Swift 3からインクリメントとデクリメントが削除された理由を人気のスクリプトJavaScriptと比較しつつ紹介します。

# インクリメントとデクリメントは紛らわしい
`++`と`--`は、似たような紛らわしい使い方があります。JavaScriptを例にして考えてみましょう。

次の処理において`console.log(a)`部分では何が出力されるでしょうか？

```
let x = 1;
let a = ++x;
console.log(a);
```

答えは`2`です。`++x`と記述すると、変数`x`に1を足した後の結果が返ります(プリインクリメント)。

では、次の処理では`console.log(a)`部分では何が出力されるでしょうか？

```
let x = 1;
let a = x++;
console.log(a);
```

答えは`1`です。`x++`と記述すると、変数`x`に`1`を足す前の値のコピーが返ります(ポストインクリメント)。

同様に、`--`についても、プリデクリメント(`--x`)とポストデクリメント(`x--`)があります。

**この使い分け、紛らわしくないですか？**

# インクリメント・デクリメントのデメリット
インクリメント・デクリメントには、いくつかのデメリットがあります。

## 1. 学習コスト
ポストインクリメント、プレインクリメントの使い分けは、プログラミングを初めて学ぶ人にとっては高い学習コストになります。

## 2. そんなに短くない
`++`や`--`は一見短くコードを書けそうですが、似た表現をする`x+=1`も同じくらい短いものです。

## 3. 混乱を招きやすい
`++`や`--`を用いたコードは、前述のように紛らわしい計算結果であり、他の開発者にとっては混乱を招き、危険です。

# Swift 3では`++`と`--`が削除された
Swiftにおいても開発当初はインクリメント、デクリメントが実装されていましたが、それは他の言語でも実装されていたからという理由に過ぎず、議論が充分になされていませんでした。**Swift 3では前述のデメリットを踏まえインクリメントとデクリメントが削除されました**。

次に示すのは、Swift 3で`++`を使おうとしている例です(Xcode 8.2のPlayground) 。

![image](https://qiita-image-store.s3.amazonaws.com/0/67884/3cef3734-5ebc-8ba9-d665-f3b18a2c1a0f.png)

`'++' is unavailable: it has been removed in Swift 3` というエラーが表示され、`++`が使えないことがわかります。

## for文はどうなるのか
気になるのは`for`文で使用している`++`です。Swift 3以前では、`for`文は次のように記述していました。


```swift
for var i = 0; i < 10; i++ {
    // 処理
}
```

`i++`の部分が使用不可能ですので、次のように記述します(※)。

```swift
for i in 0..<10 {
    // 処理
}
```



`0..<10`の部分はJavaScriptでは見慣れないかもしれませんが、`0, 1, 2, ... 9`を表す範囲演算子というもので、Swiftでは3以前から使用できる一般的な演算子です。このように、Swift 3では`++`と`--`を用いずとも可能な処理体系が実装済です。

# 最後に
インクリメント(`++`)とデクリメント(`--`)というプログラマーなら誰でも知っている演算子を削除したSwift 3。**要約すれば、「`++`や`--`は紛らわしいし、そんなにメリットも無いから削除したよ」ということです**。
プレインクリメント、ポストインクリメントの問題があることや、両演算子を使わない代替手段があることを考えれば、個人的には賛同できるアップデートです。

Swiftは、既存のプログラミング言語を見直し、都度モダンな概念を取り入れています。学んでみると、現在自分が使っている言語の特性も見えてくるのでお勧めです。

参考記事：[swift-evolution 「Remove the ++ and -- operators」](https://github.com/apple/swift-evolution/blob/master/proposals/0004-remove-pre-post-inc-decrement.md)