OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubで特定行へのパーマリンクを素早く表示する方法


GitHubでソースコードの特定の行へパーマリンクする方法が便利なのでメモしておきます。
[参照：Stack OverflowのQA](https://stackoverflow.com/questions/23821235/how-to-link-to-specific-line-number-on-github)


GitHubで表示されるソースコードは、行番号をクリックすると、その行が下図のようにハイライトされ、最後尾に`#L74`というような行番号がついたURLに移動します。

![一行を選択](https://qiita-image-store.s3.amazonaws.com/0/147872/55ae4cc3-d4ad-59b4-e52b-50fdd0464ea6.png)

複数行を選択する場合は、最初の行を選択後、シフトキーを押しながら最後の行の行番号をクリックします。URLの最後尾は`#L74-L81`のようになります。

![複数行を選択](https://qiita-image-store.s3.amazonaws.com/0/147872/0a0be8c6-6640-146e-432a-0fe4964d1e78.png)

ここで、`y`をタイプすると、`master`へのリンクではなく、その特定のコミットへのパーマリンクにURLが移動します。

特定行へのパーマリンクへ瞬時に移動する便利なコマンドの紹介でした。
特定のhref属性を持ったa要素を含むli要素にクラスを設置する(jquery)

この形だと要素がうまく取得されずにうまくいかない。
おそらくシングルクオートの中にシングルクオートがあるから

```javascript
$("li:has('a[href='aaa.html']')").addClass("classname");
```

なので２段階に分ける

```javascript
$("a[href='aaa.html']").addClass("classname_sub");
$("li:has('a.classname_sub')").addClass("classname");
```
Error in eval(expr, envir, encols) : object X not found

##概要
randomForest()使用時に、
「Error in eval(expr, envir, encols) : object X not found」
エラーがでた

##使用したデータ
df とする

|ID|　aim_col　|　'"MAY"'　|　JUNE　| JULY |
|:--|--------:|--------:|-------:|:--------:|
|A　 |　1　|　0.11　|　0.2　　|　0.11|
|C　 |　1　|　0.2　|　0.5　　|　0.22|
|B　 |　0　|　0.2　|　0.113　　|　0.6|
|D　 |　1　|　0.3　|　0.11　|　0.11|


##実行内容と結果
```
train_model <- randomForest(aim_col , #目的変数
                            data = df[,c(2:ncol(df)] #使用するデータ
                            #細かいオプションは省略
)
```

を実行すると

```
Error in eval(expr, envir, encols) : object '"MAY"' not found
```


というようなエラーがでた。


'"MAY"'は、データ中の説明変数としているカラムのひとつだが、
どうやらこの名前がよくないっぽい。前後に'とか入っちゃってるし。


##解決策

```
#colnames()でカラム名の変更
#ID,aim_col のカラム名はそのままにして、
#その他のカラムは、col_1,col_2...となるようにする
colnames(df) <-c("ID", "aim_col", paste0("col_", seq(1:ncol(df)-2 ) ) )
```

ここでのポイントは、ID,aim_col以外のカラム名を「１,2,,,」
のようにしてしまうと動かないことが多いので、「col_1,col_2,,,」としていること。


##変換後データ
|ID|　aim_col　|　col_1　|　col_2　| col_3 |
|:--|--------:|--------:|-------:|:--------:|
|A　 |　1　|　0.11　|　0.2　　|　0.11|
|C　 |　1　|　0.2　|　0.5　　|　0.22|
|B　 |　0　|　0.2　|　0.113　　|　0.6|
|D　 |　1　|　0.3　|　0.11　|　0.11|

実行できるようになったはず。
link > Learning in Multidimensional Spaces — Neural Networks. Matrix Formulation by Andrew P Paplinski (March 22, 2017)

[Learning in Multidimensional Spaces — Neural Networks. Matrix Formulation by Andrew P Paplinski](http://users.monash.edu/~app/Lrn/LearningMDS.pdf)
March 22, 2017
http://users.monash.edu/~app/

D次元の入力をM次元の出力にするmappingを学習するNeural Network。

数式ばかりでまったく理解はできていないが、5.4 (Simple) example of function approximationにおいて、2次元の入力、2次元の出力をmappingしている例はある。

実際に学習をした式は以下。

```math
y_1 = x_1 e^{-\rho^2}
```

```math
y_2 = \frac{sin2\rho^2}{4\rho^2}
```

where

```math
\rho^2 = x_1^2 + x_2^2
```

The domain of the function is 

```math
x_1, x_2 \in [-2, 2)
```

> In order to form the training set the functions are sampled on a regular 16×16 grid so that the number of datapoints is N = 256.


### y1, y2の図示

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```


Jupyter code

```py:Paplinski_20170317_Sec5_4.ipynb
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import numpy as np
import math
import matplotlib.pyplot as plt
import matplotlib.cm as cm

'''
on Python 2.7.6

v0.1 Mar. 18, 2017
  - show each of (y1,y2) on 2D map 
  - add func2d()  
'''


def func2d(x1, x2):
    rho = x1 ** 2 + x2 ** 2
    y1 = x1 * math.exp(-rho ** 2)
    try:
        y2 = math.sin(2.0 * rho ** 2) / 4.0 / rho **2
    except ZeroDivisionError:
        y2 = 0.0
    return (y1, y2)

y1_1d = np.array([])
y2_1d = np.array([])

for x1idx in range(-20,20,2):
    for x2idx in range(-20,20,2):
        y1,y2 = func2d(x1idx/10, x2idx/10)
        y1_1d = np.append(y1_1d, y1)
        y2_1d = np.append(y2_1d, y2)
        
siz = 20
dat_2d = np.reshape(y1_1d, (siz,siz))
plt.imshow(dat_2d, extent=(0, siz, 0, siz), cmap=cm.gist_rainbow)
plt.show()
dat_2d = np.reshape(y2_1d, (siz,siz))
plt.imshow(dat_2d, extent=(0, siz, 0, siz), cmap=cm.gist_rainbow)
plt.show()
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ed45b746-5081-782e-270b-c1c9c0a82ade.png)


~~Figure 5-3: Two functions to be approximatedに掲載されているのはy1のような気がするが、y2はどれだろうか。y1とy2というラベルはある。~~

MATLABコードのリンクを教えていただいた (He gave me the link to the MATLAB code)。
http://users.monash.edu/~app/Lrn/Mtlb/fap2D.m

そのコード中に以下がある (I found the following)。

```
surfc([X1-2 X1+2], [X2 X2], [Y1 Y2]), % Two 2-D target functions
                                      % are ploted side by side
```

X1方向に-2, +2してずらして、Y1とY2を表示していることがわかった (I understand that in the figure Y1 and Y2 are plotted side by side by shifting -2 and +2 in X1 direction)。
Y1の方は下に凸と上に凸のバンプがあり、Y2の方は上に凸のバンプがある。matplotlibの図と整合する (I see that there are bumps downward and upward for Y1 whereas there is a bump upward for Y2). Figure 5-3 has similarities with the figure from matplotlib。
link > MULTIDIMENSIONAL FUNCTION APPROXIMATION USING NEURAL NETWORKS @ Inter-Ing 2007

http://www.upm.ro/InterIng2007/Intering/Contents.html
にある
[MULTIDIMENSIONAL FUNCTION APPROXIMATION USING NEURAL NETWORKS](http://www.upm.ro/InterIng2007/Papers/Section6/17-EnachescuMultidimension-VI-17-1_6.pdf) by CALIN ENACHESCU

2007年のInter-Ing(Interdisciplinarity in Engineering)という会議のProceedings?

n次元の実数(R)の入力に対して、1次元の実数(R)を求める関数をNeural Networkで学習している。

RBF(Radial Basis Function) Neural Networkを使用。

学習誤差が1000 Epochで0.0016508、汎化誤差が0.0016481。
Laravelの環境判定で、 in_array(env('APP_ENV'), ['staging', 'production'], true) が最速。っぽい。

Laravelで `env('APP_ENV')` を使うか、 `App::environment()` を使うか検討したメモ。

結論から言うと

|コード|結果|
|---------|------------|
|`in_array(env('APP_ENV'), ['dev', 'production'], true)`|Time: 428 ms, Memory: 14.00MB|
|` (env('APP_ENV') === 'dev' or env('APP_ENV') === 'production') `| Time: 672 ms, Memory: 14.00MB |
|`in_array(env('APP_ENV'), ['dev', 'production'])`|Time: 769 ms, Memory: 16.00MB|
|`\App::environment('dev', 'production')`|Time: 3.89 seconds, Memory: 16.00MB|

ファサードはめっちゃ遅いことはわかった。

第三引数 `true` にした `in_array` をこれからは積極的に使うことにする。

下記のテストを実施した。

```php:tests/TimeTest.php
<?php

namespace Tests;

class FunctionsTest extends TestCase
{

    public function testInArrayStrict()
    {
        foreach (range(1, 100000) as $_) {
            in_array(env('APP_ENV'), ['dev', 'production'], true);
        }
        $this->assertFalse(in_array(env('APP_ENV'), ['dev', 'production']));
    }

    public function testEnvEvaluation()
    {
        foreach (range(1, 100000) as $_) {
            (env('APP_ENV') === 'dev' || env('APP_ENV') === 'production');
        }
        $this->assertFalse(env('APP_ENV') === 'dev' || env('APP_ENV') === 'production');
    }

    public function testInArrayLoose()
    {
        foreach (range(1, 100000) as $_) {
            in_array(env('APP_ENV'), ['dev', 'production']);
        }
        $this->assertFalse(in_array(env('APP_ENV'), ['dev', 'production']));
    }

    public function testFacade()
    {
        foreach (range(1, 100000) as $_) {
            \App::environment('dev', 'production');
        }
        $this->assertFalse(\App::environment('dev', 'production'));
    }

}
```

```
for method in testInArrayStrict testEnvEvaluation testInArrayLoose testFacade
  php vendor/bin/phpunit --filter $method tests/TimeTest.php
end

------------------------

.

Time: 428 ms, Memory: 14.00MB

OK (1 test, 1 assertion)
------------------------

.

Time: 672 ms, Memory: 14.00MB

OK (1 test, 1 assertion)
------------------------

..

Time: 769 ms, Memory: 16.00MB

OK (2 tests, 2 assertions)
------------------------

.

Time: 3.89 seconds, Memory: 16.00MB

OK (1 test, 1 assertion)
```

参考 http://qiita.com/tadsan/items/2a4c3e6b0b74a408c038

Qiitaでテーブルの中にパイプが書けなくてちょっとはまった。
Windows xammp環境のMYSQL文字化け

超絶ド初心者のため発信する知識などほとんど持ち合わせてないんですが、MYSQLの文字化けで丸2日かかったのでwindowsユーザーの初心者の皆さんにも有用かなと思い初投稿してみます。

<h2>my.iniとmy.cnfの混同でハマる</h2>

my.cnfをあれしろこうしろと言われてもそんなファイル無い・・・(T_T)

http://www.pasokuma.net/server/db/mysql/mycnf.html
↑↑↑↑
「my.iniはwindows用、my.cnfはwindows以外のOS用の設定ファイルです。 ちなみにwindowsでもmy.cnfを使用しますが、これはmy.iniがどこにあるかを書くだけです。」だそうです。

xammpなどもインストールする環境によってファイルの名前や置き場が変わったりするみたいなので気を付けないといけませんね。

<h2>my.iniの項目をutf8にしてハマる</h2>

＞show variables like ‘char%’;

をコマンドプロンプトに入力すると
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | cp932                          |
| character_set_connection | cp932                          |
| character_set_database   | utf8                           |
| character_set_filesystem | binary                         |
|
                         |
| character_set_server     | utf8                           |
| character_set_system     | utf8                           |
| character_sets_dir       | C:\xampp\mysql\share\charsets\ |
+--------------------------+--------------------------------+

デフォルトではcp932とutf8の部分がlatin（だったかな？）になってるらしいですが、 character_set_client、 character_set_connection、character_set_resultsをutf8にしなくちゃいけない、と・・・

そのためにmy.iniを
[client]
default-character-set = utf8
[mysqld]
skip-character-set-client-handshake
default-character-set = utf8
character-set-server = utf8
[mysqldump]
default-character-set = utf8
[mysql]
default-character-set = utf8
をこうしろと・・・

でもwindowsではコマンドプロンプトでutf8が使用できないため

character_set_client     | cp932 
character_set_connection | cp932
character_set_results    | cp932 

でいいみたい。

あんまり環境とか意識したことなかったけど環境気を付けないとだめですね。

<h2>skip-character-set-client-handshakeのコメントアウトをはずしててハマる</h2>

これをやったことを忘れて延々と調べる調べる・・・ワカラナイ(;´Д｀)

http://www.cyberarchitect.net/blog/archives/2193
結局こちらであれ？となって解決　　アプリ開発の道のりは遠そうです^^;

ちなみに
http://blog.everqueue.com/chiba/2009/08/27/291/
↑↑↑↑↑
「skip-character-set-client-handshakeを薦める文書がネット上にはやたら転がってるんだけど、これには大きな落とし穴がある。」そうです。
構造体の初期化に於いて、暗黙の初期値を指定する方法

C言語において構造体の初期化を行うときには、定数式を並べる方法と、要素指示子を用いて初期値を指定する方法があります。要素指示子を用いた場合、メンバの識別子順とは順不同に初期値を記述することが出来、これはC++には存在しないC言語特有の構文となります。

```C:
struct st_id {
    int a, b, c;
};

struct st_id v = { 1, 2, 3 };
    // v.a = 1, v.b = 2, v.c = 3
struct st_id w = { .c=1, .b=2, .a=3 };
    // w.a = 3, w.b = 2, w.c = 1
```

これら2つの初期化方法は組み合わせて用いることが出来、要素指示子での初期化は、以前の初期化子を書き換えることができます。

```C:
struct st_id x = { 1, 1, 1, .a = 2 };
    // x.a = 2, x.b = 1, x.c = 1
```

この初期化方法はC言語の仕様として定義されており、C99のJIS規格「JISX3010-2003 プログラム言語C」[^1]にて下記の通り記載されています。

> 6.7.8 初期化
> <中略>
> 初期化は，初期化子並びの順に行う。特定の部分オブジェクトに対する初期化子が，同じ部分オブジェクトに対する以前の初期化子を書き換えることもある。

この初期化方法を使えば、構造体の初期化において、初期化指定されないメンバは通常ゼロ初期化されるところを、任意の初期値を指示することが出来ます。
例えば、関数マクロの可変長引数を使って下記の様に定義すれば、デフォルト初期値を持つ構造体宣言を行うマクロを定義できます。

```C:

#define MAKE_ST_ID(name, ...)   \
    struct st_id name = { -1, -1, -1, __VA_ARGS__ }

MAKE_ST_ID(y, .c = 0, .a = 3);
    // y.a = 3, y.b = -1, y.c = 0
```

[^1]: JISCの[サイト](http://www.jisc.go.jp/app/JPS/JPSO0020.html)より"JISX3010"と検索することで閲覧が可能。
iOS Safariで position:fixedしている要素内のinputにfocusすると、ページトップへスクロールしてしまう挙動を解決する

[position:fixedしている要素内のinputにフォーカスが入ると、ページトップへスクロールしてしまう](https://teratail.com/questions/22695)　というiOS Safariの困った挙動を解決した際の知見を共有します。

###参考リンク
- [iOS8でposition:fixedなheaderに付けたinputにフォーカスを当てると一番上までスクロールしてしまう](http://ja.stackoverflow.com/questions/2979/ios8%E3%81%A7positionfixed%E3%81%AAheader%E3%81%AB%E4%BB%98%E3%81%91%E3%81%9Finput%E3%81%AB%E3%83%95%E3%82%A9%E3%83%BC%E3%82%AB%E3%82%B9%E3%82%92%E5%BD%93%E3%81%A6%E3%82%8B%E3%81%A8%E4%B8%80%E7%95%AA%E4%B8%8A%E3%81%BE%E3%81%A7%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86)
- [Safari in ios8 is scrolling screen when fixed elements get focus
](http://stackoverflow.com/questions/29001977/safari-in-ios8-is-scrolling-screen-when-fixed-elements-get-focus)
- [iPhone では Safari でタブバーが表示されていると fixed な要素の計算上の位置がずれる](http://qiita.com/haribote/items/f23b8a696d98e469723d)

###コード

```css:style.css
@media screen and (max-width: 768px) {
    html, body {
        -webkit-overflow-scrolling: touch !important;
        overflow: auto;
        height: 100%;
    }
    body {
        position: relative;
        overflow-x: hidden;
        min-height: 100%;
    }
}

```
これで解決しました。例えば`positiion:fixed`しているヘッダー内の検索ボックスなどにフォーカスが当たっても、スクロールが発生しません。
Devise Gem Tutorial,Authenticate a user by user id and email(Ruby On Rails)

Devise for user management and authentication.

Below is the details of the Devise Gem.
https://github.com/plataformatec/devise

The main purpose of this tutorial is to implement the devise gem and authenticate a user by user id and email.
Let's come to the implementation.

**Step1.First, add devise gem in Gemfile.**

```rb
gem 'devise', '3.4.1'
```
**Step2.then after installing the gem**

```
bundle install
```
**Step3.Model and View Settings**

```
$ rails generate devise:install
$ rails generate devise MODEL
$ rails generate devise:views
```
(if you want to change the layout of your views)

**Step4.Run the migration.**

```
rake db:migrate
```
**Step5.config/environments/development.rb:**

```rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```
**Step6.Other configuration settings**
in /config/application.rb

```rb
config.action_mailer.delivery_method = :smtp
    ActionMailer::Base.smtp_settings = {
    address: "smtp.gmail.com",
    enable_starttls_auto: true,
    port: 587,
    authentication: :plain,
    user_name: ENV["MAIL_USERNAME"],
    password: ENV["MAIL_PASSWORD"],
    openssl_verify_mode: 'none'
    }
```
**for environment settings please check the below article.**
http://qiita.com/alokrawat050/items/0d7791b3915579f95791

**Step7.Settings, user login by email or user_id**
in your /model/user.rb

```rb
devise :database_authenticatable, :registerable,:confirmable, :lockable, :timeoutable,:recoverable, :rememberable, :trackable, :validatable, :authentication_keys => [:login]
```
here we are using :authentication_keys => [:login], to authenticate user's login.

and also add below code in /model/user.rb.
'# Virtual attribute for authenticating by either user_id or email
  # This is in addition to a real persisted field like 'user_id'

```  rb
attr_accessor :login

  def login=(login)
    @login = login
  end

  def login
    @login || self.user_id || self.email
  end
  
  def self.find_for_database_authentication(warden_conditions)
    conditions = warden_conditions.dup
    if login = conditions.delete(:login)
      where(conditions.to_h).where(["user_id = :value OR email = :value", { :value => login.downcase }]).first
    else
      where(conditions.to_h).first
    end
  end

def send_devise_notification(notification, *args)
    devise_mailer.send(notification, self, *args).deliver_later
  end
```
**Step8.Add below lline in /config/initializers/devise.rb file**
line number 33 → config.authentication_keys = [:login ]

**Step9.Changes in views**
in /views/devise/sessions/new.html.erb

replace below code:

```html+erb
<%= f.label :email %>
<%= f.email_field :email, autofocus: true %>
↓
<%= f.label :login %>
<%= f.text_field :login, autofocus: true, class: 'form-control'  %>
```
in /views/devise/registrations/new.html.erb

```html+erb
<%= f.label :user_id %>
<%= f.text_field :user_id, class: 'form-control' %>
```
Then run your application.
If you have doubts then please feel free to ask.

Enjoy Coding.

**Thanks & Best Regards,
Alok Rawat**
[Unity]FirebaseでDatabaseReferenceの存在を確認する


UniRx使用


```
IObservable<bool> ExistsAsync (DatabaseReference reference)
{
	var subject = new AsyncSubject<bool> ();
	reference.GetValueAsync ().ContinueWith (x => {
		if (x.IsFaulted) {
			Debug.LogError ("Fail to read guildInfo");
			// エラーを飛ばす
			subject.Dispose ();
		} else if (x.IsCompleted) {
			DataSnapshot snapshot = x.Result;
			subject.OnNext (snapshot.Exists);
			subject.OnCompleted ();
		}
	});
	return subject;
}
```

取得には早くても0.2秒，遅いと1.4秒ほどかかった．

再生直後だと，1秒近くかかりましたが，基本的に0.2秒ほどでした．
NCMB PHP SDKをリリースしました

自分が[ニフティクラウド mobile backend (NCMB)](http://mb.cloud.nifty.com/) 用のPHP SDKを開発しているという話は昨年に何回か発表していて、「近いうちに出る」と毎回言ってる、いわば「出る出る詐欺」状態だったわけですね。最初に言ったのが2016年3月30日のPHP勉強会だからほぼ一年前ですか。以下はその時のスライド。

[ニフティクラウドモバイルバックエンドとPHP](https://speakerdeck.com/koyhoge/nihuteikuraudomobairubatukuendotophp)

この一年ずっと開発していたわけではさすがになくて、他の優先順位の高い作業がどんどん入って、ちょっと作っては中断を繰り返していました。目標とする機能が全部揃うまでこのままなのも流石にちょっとアレなので、とりあえずできているところまででリリースしちゃうことにしました。

[koyhoge/php-ncmb](https://github.com/koyhoge/php-ncmb)

[Packagist](https://packagist.org/packages/koyhoge/php-ncmb) にも登録したので、以下を composer.json に書くと composer install できます。

```json
    "require": {
        "koyhoge/php-ncmb": "*"
    },
```

## 注意点

リリースしておいてなんですが、ニフティは間もなくやってくる4月1日に[組織変更](http://pr.fujitsu.com/jp/news/2017/01/31.html)される予定でして、NCMBも含むニフティクラウドを提供するのは「富士通クラウドテクノロジーズ」になります。なので「ニフティクラウド mobile backend」という名称や「NCMB」という略称も、そのうちに変更されるかもしれません。もしそうなった場合は、さくっとパッケージ名も変更するつもりですのでご注意下さい。

## Parse.com のPHP SDKはすごい

NCMB PHPを作っている途中でParseのPHP SDKを発見しました。AS-ISライセンスでGitHub上で公開されています。

[Parse PHP SDK](https://github.com/ParsePlatform/parse-php-sdk)

ご存知のように?、NCMBのREST APIはParseのそれとよく似ていて、SDKのPHPコードも参考になる部分が多々ありました。ポインターやリレーションなど面倒な部分をどうやって実装しようかと、漠然と考えていたこともあって、それまでのコードを大幅に改変してParse SDKの設計方針を取り入れました。

## 使い方はこんな感じ

まだまだ機能は足りないですが、データストアの基本的な部分は動作します。

```php
use Ncmb\NCMB;
use Ncmb\Object;
use Ncmb\Query;

$appkey = 'YOUR APPLICATION KEY';
$clientkey = 'YOUR CLIENT KEY';

// 初期化
NCMB::initialize($appkey, $clientkey);

$className = 'Friends';

// 保存
$friend = new Object($className);
$friend->name = 'サーバルちゃん';
$friend->phrase = 'たーのしー';
$friend->save();

// 読み込み
$query = new Query($className);
$query->equalTo('name', 'サーバルちゃん');
$friends = $query->find();
```

## TODO

これから未対応の部分もどんどん実装していく予定です。

* ポインター
* リレーション
* ロール
* プッシュ通知
* ファイルストア
* スクリプト
FlaskのJinja2テンプレでpython内の変数をどこでも使ってみる

Flaskで、python中に定義した変数（グローバルな定数的な使い方をしてるもの）を共通して使いたかったので、メモ。

# 環境
Flask 0.12
python 3.6.0

# 実現方法

## 定数置き場的なクラスを作る。

```/common/const.py
# coding=utf-8


class Const(object):
    TEST_VAR = 'hoge' 

```

## メインのpyでappに設定

```main.py
# coding=utf-8
from flask import Flask
from common.const import Const


app = Flask(__name__)


# Constの中身をそのままjinja2でつかえるよ！！
app.jinja_env.globals.update(Const.__dict__)

```

## templateに書く

```test.html
{{ TEST_VAR }}
```
とすると、hoge が表示される。
jsとpython間でエラーコードとか共通定義しておきたいときに。

もっとすまーーーとなやり方あるのかなあ・・・？

# 参考
ありがとうございます
http://y0m0r.hateblo.jp/entry/20120115/1326630063
http://stackoverflow.com/questions/33324090/access-jinja2-globals-variables-inside-template
Gitでコミットするアカウントを間違えた際に対象アカウントのみ一括置換する方法

2017-03-21追記：AUTHORだけ変更すると、githubのコミット履歴でアイコンがAUTHORとCOMITTERの２重で重なってしまうため、両方変更するようにコマンドを書き換えました。

2019-12-22追記：待たされるようになったので、待たされないように環境変数追加。まじ余計なお世話かと。。

注）force pushを伴うので、バックアップを取ってから実行するように！！

```bash
FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch -f --commit-filter '
        if [ "$GIT_COMMITTER_EMAIL" = "daijinload@gmail.com" ];
        then
                GIT_AUTHOR_NAME="daijinload";
                GIT_AUTHOR_EMAIL="daijinload@gmail.com";
                GIT_COMMITTER_NAME="daijinload";
                GIT_COMMITTER_EMAIL="daijinload@gmail.com";
                git commit-tree "$@";
        else
                git commit-tree "$@";
        fi' HEAD

# 確認
$ git log --pretty=fuller
Author:     daijinload <daijinload@gmail.com>
AuthorDate: Sat Nov 10 17:37:13 2018 +0900
Commit:     GitHub <noreply@github.com>
CommitDate: Sat Nov 10 17:37:13 2018 +0900

    Initial commit

$ git push -f origin feature/hoge
```



[6.4 Git のさまざまなツール - 歴史の書き換え](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E6%AD%B4%E5%8F%B2%E3%81%AE%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88)

完全にこちらから抜粋となります。

注意点としては、force pushが必要になるので、変えたあとに同じブランチで作業している人に連携が必須なことですかね。

基本的にブランチ切って作業していれば、大きな影響は無いような気もします。
Azure Web AppsでNode.jsな環境でデプロイをカスタム

# 背景

諸事情によりAzure Web Appsを使いはじめたが、デプロイ時にDBのmigrate走らせようとしたらよくわからんかった。
解決したので手順メモ。

# TL;DR

azure-cliを入れて

```
$ azure site deploymentscript --node
```

すれば.deploymentとdeploy.shが吐かれるのでdeploy.shイジる。

# 流れ

具体的にやりたいことはsequelize-cliを使って以下を実行すること。

```
$ sequelize db:migrate
```

## npm scriptsでやってみる（失敗）

とりあえずnpm scriptsに

```json:package.json
{
  "scripts": {
    "start": "npm run db:migrate && node www.js",
    "test": "NODE_ENV=test ./node_modules/.bin/mocha --recursive",
    "db:migrate": "./node_modules/.bin/sequelize db:migrate",
    "db:reset": "./node_modules/.bin/sequelize db:migrate:undo:all"
  }
}
```

とかいてみたけど、Web AppsはWindowsな環境なので動かない。

## .deploymentをかいてみる（失敗）

デプロイ時の挙動をカスタムするやり方は[kudu（Web Appsのバックエンド）のドキュメント](https://github.com/projectkudu/kudu/wiki/Customizing-deployments) に書いてあり、
「.deploymentファイル置いてイジる」と書いてあるので、
「PowerShellとかまじかよ」と思いながらも

```
[config]
command = powershell -NoProfile -NoLogo -ExecutionPolicy Unrestricted -Command "& "node $pwd\node_modules\.bin\sequelize db:migrate" 2>&1"
```

としてみるが動かない。
エラーログを見ると実行ディレクトリがgitのワークディレクトリらしく、node_modulesがないのでsequelize-cliが実行できない。

## azure site deploymentscriptする（解決）

以下はGulpの例だが、基本的にコレに則る。

>Using Gulp in Node.js Azure WebApps
>https://blogs.msdn.microsoft.com/azureossds/2015/10/22/using-gulp-in-node-js-azure-webapps/

以下を実行すると.deploymentとdeploy.shが吐かれる。
bash動いたのか...

```
$ azure site deploymentscript --node
```

最後の方に以下のようにあるので

```bash
##################################################################################################################################
# Deployment
# ----------

echo Handling node.js deployment.

# 1. KuduSync
if [[ "$IN_PLACE_DEPLOYMENT" -ne "1" ]]; then
  "$KUDU_SYNC_CMD" -v 50 -f "$DEPLOYMENT_SOURCE" -t "$DEPLOYMENT_TARGET" -n "$NEXT_MANIFEST_PATH" -p "$PREVIOUS_MANIFEST_PATH" -i ".git;.hg;.deployment;deploy.sh"
  exitWithMessageOnError "Kudu Sync failed"
fi

# 2. Select node version
selectNodeVersion

# 3. Install npm packages
if [ -e "$DEPLOYMENT_TARGET/package.json" ]; then
  cd "$DEPLOYMENT_TARGET"
  eval $NPM_CMD install --production
  exitWithMessageOnError "npm failed"
  cd - > /dev/null
fi

##################################################################################################################################

```

```bash
# db migration
cd "$DEPLOYMENT_TARGET"
eval $NPM_CMD run sequelize db:migrate
```

と足した。
Mac機をSSLアクセラレータのようなもの(リバースプロキシ)にした

# やること

諸事情によりWEBサーバはHTTPS接続できないけどクライアントからはhttpsにしたい時とかにはリバースプロキシをかませるといいよ！
超シンプルに作るよ！

# やり方
- /private/etc/apache2/httpd.conf 以下の３行をアンコメント

```text:httpd.conf
#LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so

#LoadModule ssl_module libexec/apache2/mod_ssl.so

#Include /private/etc/apache2/extra/httpd-ssl.conf
```

- いわゆるオレオレ証明書を作成

`$ cd /private/etc/apache2`
`$ sudo openssl genrsa -aes128 -out server.key 2048`
`$ sudo openssl req -new -key server.key -sha256 -out server.csr`
`$ sudo openssl x509 -in server.csr -days 365 -req -signkey server.key -sha256 -out server.crt`

- /private/etc/apache2/other/reverse_proxy.conf を作成

自機のドメインがhoge.huga.jp, WEBサーバが12.23.24.25とします

```text:reverse_proxy.conf
# reverse proxy
<IfModule mod_proxy.c>
    ProxyRequests on
    <Proxy *>
        Order deny,allow
        Allow from All
    </Proxy>
    <VirtualHost *:443>
        ServerName hoge.huga.jp
        SSLEngine on
        SSLCertificateFile /private/etc/apache2/server.crt
        SSLCertificateKeyFile /private/etc/apache2/server.key
        SSLProxyEngine on
        ProxyPass / http://12.23.24.25/
        ProxyPassReverse / http://12.23.24.25/
    </VirtualHost>
</IFModule>
```

- apache再起動

`$ sudo apachectl -k restart`
server.keyのパスフレーズを聞かれたら入力しよう！
ubuntu 16.04とデバイスドライバ

ubuntu 16.04をインストールしたんだが、vmwareだと遅すぎてなんだこりゃ？状態だった。

# vmwareでの状態
まあ、vmwareはwarkstation 12にupgradeしたので、なんか変なライブラリが残っていたのかもしれない。まともに、easy-installの画面も出ずに、言語も日付も設定しないで、enのままインストールを始めてしまったので、このあたりで引き返せばよかったのかもしれない。

# ubuntu 16の特徴とググりたおし
ubuntu 16は全面的にcompizを基本とした「クール」なguiなんだが、これはある程度のGPUが必要である。っだもんで、仮想上はどうなってんのかな？と思って、いろいろググったんだが、唯一 「Gallium 0.4 on SVGA3D」と表示さｓれたらだめで「chromiun」じゃないといかん！というとこを見つけ
http://kanakatsu.cocolog-nifty.com/blog/2014/06/virtualboxubunt.html　

そうかと思って、いろいろやったのだが、好転しない。なんでもcompizを貧弱なgpu用の設定に変更したりしたんだが、だめ！

まてよ、さっきのwebはvirtualboxだな・・と思ってvmwareからvirtualboxへ。

# virtualboxでのインストール
おおお、exsy-installerがちゃんと動くではないか。なんだ、これでいいじゃん。ということで立ち上げると、なんとなく使える感じ。これでいきますか？と思って、グラフィックドライバをみてみると「Gallium 0.4 on SVGA3D」であった。なんだよ、まあ、いいか・・と思って、クリップボード連携用にguet addition(vmwareでいえば、vmware-tool)をインストールした。

# 不親切な　guet addition
画面から起動できるのはいいんだが、全然終わらない。あれあれ？どうしちゃってるの？ということで、しかたがないので
 tail -f /var/log/vboxadd-install.log
で確認する。これ、端末に出せばいいのにね

# 再起動
あれ？なんか、画面の動きがまた変わった・・と思ったので、グラフィックドライバをみてみると「chromiun」でした。ああ、なるほど、あんなに時間がかかったのはそのせいなのかなあ？ということで、今日の成果でした。

# 追記
chroniumを調べたら、やっぱりあった
http://news.mynavi.jp/articles/2010/10/22/virtualbox-3d-acceleration/
EC2インスタンスをAWS CLIで起動する

## AWSCLIの初期設定

```bash:実行コマンド
aws configure
```

IAMであらかじめユーザーを作成しておく必要があります。
アクセスキーやシークレットアクセスキーは作成したユーザーのものを利用します。

## 起動

```bash:実行コマンド
aws ec2 start-instances --instance-ids "i-xxxxxxxxxxxxxxxxx"
```

```json:処理結果
{
    "StartingInstances": [
        {
            "InstanceId": "i-xxxxxxxxxxxxxxxxx", 
            "CurrentState": {
                "Code": 0, 
                "Name": "pending"
            }, 
            "PreviousState": {
                "Code": 80, 
                "Name": "stopped"
            }
        }
    ]
}
```

## 状態表示（起動後）

```bash:実行コマンド
aws ec2 describe-instance-status --instance-ids "i-xxxxxxxxxxxxxxxxx"
```

```json:処理結果
{
    "InstanceStatuses": [
        {
            "InstanceId": "i-xxxxxxxxxxxxxxxxx", 
            "InstanceState": {
                "Code": 16, 
                "Name": "running"
            }, 
            "AvailabilityZone": "ap-northeast-1a", 
            "SystemStatus": {
                "Status": "initializing", 
                "Details": [
                    {
                        "Status": "initializing", 
                        "Name": "reachability"
                    }
                ]
            }, 
            "InstanceStatus": {
                "Status": "initializing", 
                "Details": [
                    {
                        "Status": "initializing", 
                        "Name": "reachability"
                    }
                ]
            }
        }
    ]
}
```

## 起動完了待ち

`;` で区切ってコマンド指定することで、起動完了後に処理することができます。

```bash:実行コマンド
aws ec2 wait instance-running --instance-ids "i-xxxxxxxxxxxxxxxxx"; echo "next command"
```

## 停止

```bash:実行コマンド
aws ec2 stop-instances --instance-ids "i-xxxxxxxxxxxxxxxxx"
```

```json:処理結果
{
    "StoppingInstances": [
        {
            "InstanceId": "i-xxxxxxxxxxxxxxxxx", 
            "CurrentState": {
                "Code": 64, 
                "Name": "stopping"
            }, 
            "PreviousState": {
                "Code": 16, 
                "Name": "running"
            }
        }
    ]
}
```

## 状態表示（停止中）

停止状態で`describe-instance-status`すると、結果のjsonが空値で返ってきます。

```bash:実行コマンド
aws ec2 describe-instance-status --instance-ids "i-xxxxxxxxxxxxxxxxx"
```

```json:処理結果
{
    "InstanceStatuses": []
}
```
nvm の checksums do not match エラーの回避

# はじめに

Node.jsのバージョン管理をしてくれる nvmを使ってみたとき覚え書きです。
（CentOS 6.8で確認）
[nvm - Node Version Manager](https://github.com/creationix/nvm)

## 問題

`nvm install` 実行時に以下のエラーが表示されて、インストールが失敗する

```
[root@localhost ~]# nvm install 6
Downloading and installing node v6.10.0...
-- 省略 --
################################################################ 100.0%
Computing checksum with sha256sum
Checksums do not match: 'de12****' found, 'f65d****' expected.
xz: (stdin): File format not recognized
tar: Child returned status 1
tar: Error is not recoverable: exiting now
nvm: install v6.10.0 failed!
```

## 原因

調べたところ、 チェックサム関数 **shasum** というコマンドが重要みたい

**CentOSでは** 、sha1sum や sha256sum コマンドがあるが、 
shasum コマンドはデフォルトで使えないことが原因（だと思います）

## 対処
shasumのエイリアスを作って、（一時的に）使えるようにする必要がある

```
alias shasum=sha256sum
```

### alias作成を含めた実行内容

```
[root@localhost ~]# alias shasum=sha256sum
[root@localhost ~]# nvm install 6
Downloading and installing node v6.10.0...
-- 省略 --
Computing checksum with sha256sum
Checksums do not match: '4e70****' found, '0f28****' expected.
Checksum check failed!
Removing the broken local cache...
Downloading https://nodejs.org/dist/v6.10.0/node-v6.10.0-linux-x64.tar.xz...
################################################################ 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v6.10.0 (npm v3.10.10)
Creating default alias: default -> 6 (-> v6.10.0)
```

（なんか１回コケてるけど）できた！

## 謝辞

こちらを参考にさせていただきました。
[nvmでnodeをインストールするとエラーになる](http://toenobu.name/blog/2012/10/25/nvm%E3%81%A7node%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E3%81%A8%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%AA%E3%82%8B/)
上記ブログの `alias shasum=sha1sum` を試してみたけど、結果は失敗。
`alias shasum=sha256sum` でエイリアスを作ったらうまくいった。
nvmの中身がなにか変更されたのかな
Facebook/reason から React を触る

最小セットを作った

[mizchi-sandbox/reason-react-starter](https://github.com/mizchi-sandbox/reason-react-starter)

```sh
git clone https://github.com/mizchi-sandbox/reason-react-starter
yarn install
yarn start
```

bucklescript の出力コードをwebpackでbundleするnpm scripts を書いたという感じ。とりあえずHelloWorldできるので、ここからいじって挙動を確かめるとよい。

enjoy!

## 中身

これだけだとアレなんで、どう書かれているか

```ocaml
module Page = {
  include ReactRe.Component;
  type props = {message: string};
  let name = "Page";
  let handleClick _ _ => {
    Js.log "clicked!";
    None
  };
  let render {props, updater} =>
    <div onClick=(updater handleClick)> (ReactRe.stringToElement props.message) </div>;
};

include ReactRe.CreateComponent Page;

let createElement ::message => wrapProps {message: message};
```

だいたいこんな感じ。ちょっとまだ冗長ですね。

## reason-react のバインディングはどう書かれてるか

https://github.com/reasonml/reason-react/blob/master/src/reactRe.re#L24-L25

```
external createElement : reactClass => props::Js.t {..}? => array reactElement => reactElement =
  "createElement" [@@bs.splice] [@@bs.val] [@@bs.module "react"];
```

`"createElement" [@@bs.splice] [@@bs.val] [@@bs.module "react"];` が `require('react').createElement(...arguments)` に相当してそう。npmのモジュールを呼び出せれば、あとはコードを書くだけ。書くだけです。
PHPで日本語の曜日出す

なんやかんやで毎回使う

```php
class Common {
	static $WEEKS = ['(日)', '(月)', '(火)', '(水)', '(木)', '(金)', '(土)'];

	function date($format, $timestamp=null) {
		if ( preg_match('/x/', $format) ) {
			$w = date('w', $timestamp);
			$format = preg_replace('/x/', self::$WEEKS[$w], $format);
		}
		return date($format, $timestamp);
	}
}

$Common = new Common();
$Common->date('Y年m月d日x H:i', strtotime('2017-03-17 12:00:00'));
// 2017年03月17日(金) 12:00
```

[PHPで和暦・日本語曜日を使う](http://qiita.com/chiyoyo/items/da32649b0e04957856c1)
書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter1】

## 関連記事

* 書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter1】　★今ここ
* [書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter2】](http://qiita.com/laineek/items/121a9a20d5eb26fb56f4)
* [書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter3】](http://qiita.com/laineek/items/86d392541e3278dd95d3)
* [書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter4】](http://qiita.com/laineek/items/408dc12e2c5f8c86d48c)
* 書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter5】
    * 特にありませんでしたので、作成していません。
* [書籍『Ruby on Rails 5 超入門』つまずきやすいポイントまとめ【Chapter6 最終回
】](http://qiita.com/drafts/871a0b93b4cbd82c8e2a)

## はじめに

ゼロからWebアプリに挑戦する知人（非エンジニア）向けに書いたものですが、同じく始める初心者の方の参考になるかもしれないので全体に公開しておきます。
  
知人と一緒に、私も実際に進めてみて、プログラム未経験の新人さんに教えるレベルで詰まりそうなポイントをまとめてみました。書籍自体もとても優しいのですが、それでさえ詰まって諦めてしまったらせっかくの挑戦心がもったいないので…。

鋭意勉強中の知人の記事はこちら。

* [チャレンジ開始！ - やるからには完成させる](http://watagara.hateblo.jp/entry/2017/03/12/213008)

## 対象書籍

Webアプリとは？フレームワークとは？といった基本的な話もあって、言語の説明もあるという初心者向けのありがたい本です。超オススメです。

* [Ruby on Rails 5 超入門](https://www.amazon.co.jp/Ruby-Rails-5-%E8%B6%85%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798048321)

![51GLBK7MuVL._SX385_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/170816/af547057-9b49-69f3-4c33-7e6b66413f34.jpeg)

## 私の環境

* Windows 10 Home 64bit  
(正確にはMac上で動かしている仮想環境です。あまり動作に違いがないことを願いつつ。)

## つまずきやすいポイント

### [p.26] Rubyのダウンロード

* **Ruby 2.2.6** を入れます。書籍では2.2.5で掲載されていますが、書籍では2.2.x系の最新を推奨されているためです。（お仕事では求められているソフトウェアについて都度バージョンを確認することを忘れずに。）

* お使いのマシンが**32bitの場合は、末尾になにもついてないRuby**をダウンロードしてください。**（世の中には間違えても動いちゃうソフトウェアがあって、後々ひょんなときに問題になったりもするので、地味に注意したいところです。）
	* Ruby 2.2.6 -> 32bit版
	* Ruby 2.2.6 (x64) -> 64bit版

### [p.33] コマンドプロントでのバックスラッシュの入力

* 書籍上は「\」となっているところは**「￥の半角」で入力すればOK**です。（Windowsフォントの都合なので、もっと知りたいときはググってみてください。）

### [p.35]「ruby dk.rb install」の実行結果

書籍上は「Skipping existing ごにょごにょ」となっていますが、**初めて実行する場合は次の実行結果になります。**中身は追っていませんが、もしかしたら、２回実行or古いバージョンでは書籍通りに表示されるかもしれません。

```
c:\Ruby22-x64\devkit>ruby dk.rb install
[INFO] Updating convenience notice gem override for 'C:/Ruby22-x64'
[INFO] Installing 'C:/Ruby22-x64/lib/ruby/site_ruby/devkit.rb'
```

### [p.46-49] Visual Studio Code の起動・使い方

やりながら覚えればいいので**「へー」程度にさっさと読み飛ばしましょう。**やってみましょうみたいなスタンスですが、この時点で触れるソースも特に無いので。

ちなみに、起動直後はウェルカムページが開かれます。書籍に合わせるなら「起動時にウェルカムページを表示」のチェックをOFFにしておきましょう。

<img width="1010" alt="Windows_10__Running_.png" src="https://qiita-image-store.s3.amazonaws.com/0/170816/fc30f1da-c5f8-56bf-69be-963d397bdd5e.png">


### その他

上記以外は書籍に記載の情報だけで進められるはずです。親切な本すぎてビックリしたぐらいです。どうしても分からないときは遠慮なくつっこんでください。


## 今後

Chapter1がこれで終わったので、続いては**Chapter2ではなくて、Addendumの「Ruby言語超入門！」**を進めていきます。（本文ではChapter7と記載されているけど誤植ですかね。）

引き続き、私も一緒に進めて、詰まりやすそうかなあというポイントがあれば、また投稿します。基本的にとても分かりやすい本なのであまり必要なさそうですけどね！
Gitで指定したブランチをcloneする方法

## Gitで指定したブランチをcloneする方法

### master を　clone する

```bash
git clone git@github.com:ユーザー名/リポジトリ名.git
#まだ
git clone https://github.com/ユーザー名/リポジトリ名.git
```

### 特定ブランチ を　clone する

```bash
git clone -b ブランチ名　git@github.com:ユーザー名/リポジトリ名.git
#まだ
git clone  -b ブランチ名　https://github.com/ユーザー名/リポジトリ名.git
```
pythonでキーボードイベント取得

# キーボードイベントを取得したい
ユーザが特定のキーを入力したときに何かを出力したい

## コード
```python
from msvcrt import getch

def select():
    #do something

def moveDown():
    #do something

def moveUp():
    #do something

def main3():
    while True:
        key = ord(getch())
        if key == 27: #エスケープ
            break
        elif key == 13:　#エンター
            select()

        elif key == 224: #スペシャルキー（矢印、Fキー、ins、del、など）
            key = ord(getch())
            if key == 80: #上矢印
                moveDown()
            elif key == 72: #下矢印
                moveUp()
```

## asciiコード対応表
（2021/11/17更新）
https://theasciicode.com.ar/ascii-control-characters/escape-ascii-code-27.html

## 気づいたこと
- コマンドプロンプト上でしか反応しない（どのウィンドウ上の入力でも反応してほしかった)
- Window OSのみ

###　参考資料
http://stackoverflow.com/questions/12175964/python-method-for-reading-keypress
競技プログラミング等における標準入力からの値の入出力方法

よく忘れてしまうので調べたらメモする。

# 1行に1つの整数
```
5
```
## R
```r:R
n <- scan("stdin", quiet = TRUE) # 入力
cat(n) # 出力
```
quiet=TRUEを指定しないと読み込み時に"Read 1 item"と出力され、これがエラーメッセージと判断される場合がある。

## Python2
```py:Python2
n = input() # 入力
print n     # 出力
```

## Python3
```py3:Python3
n = int(input()) # 入力
print(n)         # 出力
```
## Ruby
```rb:Ruby
n = gets.to_i # 入力
puts n        # 出力
```
## C++
```cpp:C++
#include <iostream>
int main(void){
    int n;
    std::cin >> n; // 入力
    std::cout << n << std::endl; // 出力

    return 0;
}
```

iostreamでは遅いといった場合はcstdioを使用したほうが良い模様。

# 1行に複数の整数
```
1 2 3
```

## Python3
```py3:python3
n = [int(i) for i in input().split()] # 入力
print(' '.join([str(i) for i in n]))  # 出力
```
```py3:python3
a, b, c = [int(i) for i in input().split()] # 入力
print(a, b, c)  # 出力
```
```py3:python3
n = list(map(int, input().split()) # 入力
print(' '.join(map(str, n))) # 出力
```

## Ruby
```rb:Ruby
n = gets.chomp.split.map { |i| i.to_i } # 入力
puts n.join(' ') # 出力
```

```rb:Ruby
a, b, c = gets.chomp.split.map { |i| i.to_i } # 入力
puts "#{a} #{b} #{c}" # 出力
```
Codeigniterフレームワークアプリをrsyncでコピーしたらうまくいかなかった件

##起こったこと
Codeigniterを利用してアプリケーションを作っています。
自動デプロイをしようと思ってgitからcheckoutしたソースをrsyncで公開ディレクトリの同期をしてみました。

```bash
 rsync -avC --delete --bwlimit=1250 /src/path/ /application/path/
```
比べてみると。

```bash
diff -r  /src/path/ /application/path/
/application/path/applicationだけに発見: core
```

**なんでや！？**

## 調べてみたこと
```bash
man rsync

       -C, --cvs-exclude
              This  is a useful shorthand for excluding a broad range of files
              that you often don’t want to transfer between systems. It uses a
              similar  algorithm  to  CVS  to  determine  if  a file should be
              ignored.

              The exclude list is initialized to exclude the  following  items
              (these  initial  items are marked as perishable ― see the FILTER
              RULES section):

                     RCS  SCCS  CVS  CVS.adm   RCSLOG   cvslog.*   tags   TAGS
                     .make.state  .nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak
                     *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj *.so  *.exe
                     *.Z *.elc *.ln core .svn/ .git/ .bzr/
```

はえーcoreディレクトリは除外されてるやん。みたらわかるーはまるやつやん。

## やったこと

以下のように書きました
```bash
 rsync -avC --include=core --delete --bwlimit=1250 /src/path/ /application/path/
```

が本当は横着せずにきちんとexclodeをつなげて書くほうがいいのかもしれません。
```bash
 rsync -av　--exclude=.git/ --exclude=.gitignore --include=core --delete --bwlimit=1250 /src/path/ /application/path/
```

あとexcludeやincludeが多くてコマンドがながくなりそうだったら
```bash
 rsync -av　--exclude-from=exlude.txt --delete --bwlimit=1250 /src/path/ /application/path/
```

```bash:exlude.txt
# exclude
- .git/
- *.bak
- .svn/
 
# include
+ core
```
別ファイルで管理するのもありかな。



楽しいCIライフを送りましょう。
PowerShellスクリプトによるメール送信

PowerShellを急に触ることになったヒトのための備忘録、第二弾。

第一弾：ロギング編
http://qiita.com/yoshifuji/items/c94e3a8e5c2229f370af

Winサーバ上でPowerShellスクリプトエラーを検知したら、メールサーバ経由でメール送信できるようにしたい。

# 環境

WindowsServer2012 R2

# 定義する

下記のようなスクリプトを書いて、デスクトップに `mail.ps1` といった名前で保存する。

```bash
## HOWTO USE
## 1.IMPORT FILE BELOW 
# . ".\\mail.ps1"
## 2.CALL FUNCTION 
# MailSendLog "dummy_batch_id" "dummy_survey_id" "dummy_error"

$to = "system@your-domain.com"
$from = "apps-" + [Net.Dns]::GetHostName() + "@your-domain.com"
$smtp = "172.21.xxx.xxx" #YOUR MAIL SERVER
$subject = "APP ERROR OCCURRED in dev-" + [Net.Dns]::GetHostName()

$now = Get-Date    
$log = "{0:0000}-{1:00}-{2:00} " -f $now.Year, $now.Month, $now.Day
$log += "{0:00}:{1:00}:{2:00} " -f $now.Hour, $now.Minute, $now.Second

function MailSendLog($batch_id, $survey_id, $error){
    $body =
@"
batch_id = $batch_id
app_id = $app_id
error = $error
log = $log
"@

    Send-MailMessage -To $to -From $from -SmtpServer $smtp -Subject $subject -Body $body -Encoding UTF8
    Return $log
}
```

# 呼び出す

要領は第一弾と同様。

```bash
. D:/mappshulft/batch/mail.ps1

try {
    [System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
    Invoke-RestMethod -Method Post -Uri $uri -Body $body -Headers @{"Content-Type"="application/json"}
} catch {
    echo '$error[0] = ' + $error[0]
    MailSendLog "F_LOGIC01" $survey_id $error[0] #メール送信実行部
}
```
hyperappを読んでReactをわかった気持ちになれるのか

# hyperapp ?

- https://github.com/hyperapp/hyperapp
- **300行**で書かれたReact/ReduxライクなFW
- `dependencies: {}`

----

サンプルコード(カウンター)

```js:index.js
app({
  model: 0,
  actions: {
    add: model => model + 1,
    sub: model => model - 1
  },
  view: (model, actions) =>
    <div>
      <button onClick={actions.add}>
        +
      </button>
      <h1>{model}</h1>
      <button onClick={actions.sub}>
        -
      </button>
    </div>
})
```

```html:index.html
<!doctype html>
<html lang="en">
<head>
  <title>Hello HyperApp</title>
</head>

<body>
<script src="bundle.js"></script>
</body>
</html>
```

----

# hyperappが持っている機能

- 宣言的にUIを記述
- VirualDOMみたいに差分だけ更新する
- Reduxみたいな状態管理
- plugin機構
- Router(pluginとして提供)
- など
- [Wiki#Reference](https://github.com/hyperapp/hyperapp/wiki/Reference)

----

# いやー300行とはいえJSかぁ…

----

# 機能を最小限にしたやつを用意しました :tada:

- https://github.com/adwd/hyperapp
- Router, pluginなどを消して最小限に
- それでも200行になった程度ですが :rolling_eyes:

----

# tr;dr

- JSXからVirtualNodeを作る
- VirtualNodeからDOMを作成する
- actionで状態を変更する
- oldNode, nodeを比べて変わったとこだけDOMをいじる

---

# JSXからVirtualNodeを作る

babelとhyperappのh関数がよしなにJSXをVirtualNodeに変換する様子

```sh
$ cd ./examples/helloworld
$ npm i
$ babel-node
> const { h } = require('hyperapp')
undefined
> <a href="/foo">hello</a>
{ tag: 'a', data: { href: '/foo' }, children: [ 'hello' ] }
> <ul><li>foo</li><li>bar</li></ul>
{ tag: 'ul',
  data: {},
  children:
   [ { tag: 'li', data: {}, children: [Object] },
     { tag: 'li', data: {}, children: [Object] } ] }
```
---

# VirtualNodeからDOMを作成する

```js
root = document.body.appendChild(document.createElement("div"))
root.appendChild(createElementFrom(node))

function createElementFrom(node) {
  var element

  if (typeof node === "string") {
    element = document.createTextNode(node)

  } else {
    element = document.createElement(node.tag)

    for (var name in node.data) {
      setElementData(element, name, node.data[name])
    }

    for (var i = 0; i < node.children.length; i++) {
      element.appendChild(createElementFrom(node.children[i]))
    }
  }

  return element
}
```

---

# actionで状態を変更する

```js
var result = action(model, data, actions)

model = merge(model, result)
render(model, view)
```

----

# oldNode, nodeを比べて変わったとこだけDOMをいじる

```js
if (shouldUpdate(node, oldNode)) {
  if (typeof node === "string") {
    element.textContent = node
  } else {
    parent.replaceChild(createElementFrom(node), element)
  }

} else if (node.tag) {
  updateElementData(element, node.data, oldNode.data)

  var len = node.children.length, oldLen = oldNode.children.length

  for (var i = 0; i < len || i < oldLen; i++) {
    // childrenにも再帰的にpatchしていく
    patch(element, oldNode.children[i], node.children[i], i)
  }
}
```

----

- 意外？と素朴な実装だと思った
- ReactもReactElementだかで同じことやってる気がする
- Reactをわかった気持ちになった

----

# おわり
Github | 自分がレビュー中だと黄色マークで伝える

こんな運用いかがでしょうか。

# 操作

PR で自分に対してレビューリクエストを送る。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/b25811e5-42b8-3eed-f2c6-2e9695c2a1ef.png)

# 表示

自分がレビューを付けるまでは黄色いマークが表示される。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/1382e451-e54f-aefb-0b3e-9b5e7b0297d5.png)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rustで数値計算してみた話

修士・博士課程時代
------------------

- 流体の直接数値計算
- C++でシミュレーションを実装
- Pythonで可視化＋統計量の解析(on Jupyter)
- データはmsgpackで保存

---

データ同化の研究を始める
----------------------

- 既存のコードベースを廃棄
- Pythonで実装を始める
    - NumPy/SciPy使用

---

Python遅い(´・ω・｀)
--------------------
- Pythonでは関数の呼び出しがインライン展開できない
- 汎用性高く実装できない
- でも、もうC++は書きたくない
    - コンパイルに１分かかるのはちょっと・・・

何で書く？
----------
- Haskellで[書いてみた](https://github.com/termoshtt/odeint)
    - ものすごく遅いコードが出来上がった（涙）
    - 配列を部分的に書き換えていくコードが書きづらい
    - コンパイル遅い
- GoかRustか
    - Goが流行ってるのでRustにした
    
---

Rustを覚える
------------

- C++の不満点が解消されている
    - ビルドシステム(cargo)
    - moveが自然に導入
    - template -> traits (concepts)
- iterator周りの機能が豊富
    - [itertools](https://github.com/bluss/rust-itertools)でさらに拡張
- 所有権はC++より簡単
    - ライフタイムはコンパイラが教えてくれる

---

Rustで実装開始
--------------

- 線形代数ライブラリの選択（参考：[Linear Algebra in Rust](https://athemathmo.github.io/2016/03/23/linear-algebra-in-rust.html))
    - rusty-machine (rulinalg): Machine Learning library for Rust
    - ndarray : Arrays inspired by numpy.
    - nalgebra : Low dimensional linear algebra.
    - servo/euclid : Basic linear algebra used by Servo.
    - cgmath : Linear algebra for game development.
- 一番単純そうなndarrayを選択
    - 純粋な線形演算ライブラリで、低次元に特化していない
    - もともとC++で実装してい自作ライブラリに似てた（Eigenは使っていなかった）

---

LAPACK相当の機能がndarrayにない
-------------------------------

- [ndarray-linalg](https://github.com/termoshtt/ndarray-linalg)を開発
    - LAPACKを共有ライブラリとしてリンク(lapack crateを使用)
    - [Rustによる数値計算: 線形代数編](http://qiita.com/termoshtt/items/ddc23071877870ea5391)
- 同時期に同じ目的の別crate [linxal](https://github.com/masonium/linxal)も開発される

FFTできない
-----------

- [rust-fftw3](https://github.com/termoshtt/rust-fftw3)を開発
- Cのバインディングの作成を覚えた 

---

現状の課題
----------

- データの管理
    - 現状msgpackに保存しているがMongoDBに保存したい
    - [diesel](https://github.com/diesel-rs/diesel)で簡単にSQLサーバーに保存できるかも？
- 並列化・大規模化
    - 数値計算はデータ並列なので[Rayon](https://github.com/nikomatsakis/rayon)が有効
        - [データ並列ライブラリRayonを使ってみた](http://qiita.com/termoshtt/items/aaa0728810062e5cfe0f)
    - MPI並列の例がない（？）
- PythonからRustの関数を呼べるようにしたい
    - 呼ぶだけならできる：[rust-cpython](https://github.com/dgrunwald/rust-cpython)
    - NumPy C APIも併せて[rust-ndarray](https://github.com/bluss/rust-ndarray)とシームレスに連携したい
IAMユーザをAnsibleで管理する


#はじめに
AnsibleにはAWSのリソースを操作できるモジュールが豊富に用意されています。

今回はIAMを操作するモジュールを利用して、AnsibleでIAMユーザを管理してみたいと思います。

#やること
- IAMユーザ作成・所属グループ変更
- IAMグループ作成・変更

##ポイント
- ユーザ側の変数で定義したグループを作成する（グループ作成用に別途定義しない）
- ユーザ新規作成時に、ローカルにユーザごとのcredential情報をファイル出力
	
#注意
IAMユーザのパスワードは設定しません。
理由は後述。

#前提
AWS関連のモジュール実行にはbotoが必要です。

#sample

以下のようなユーザとグループを作成します。

- user1
	- 所属グループ:group1
- user2
	- 所属グループ:group1,group2

##ディレクトリ構成

```bash:ディレクトリ構成
site.yml
roles/
|--iam/
|  |--tasks/
|  |  |--main.yml
|  |--templates/
|  |  |--save_credential.j2
group_vars/
|--group.yml
```

##vars

こんな感じに変数を定義します。

```yaml:group_vars/group.yml
---
my_vars:
  aws:
    iam:
      users:
        - name: user1
          groups:
            - group1
        - name: user2
          groups:
            - group1
            - group2
```

##Role

まず、users以下でループさせて、with_subelementsによりユーザが所属するグループを全て作成します。
with_subelementsは多重ループを実現できる便利なディレクティブです。
グループについては、ユーザごとに定義しているので重複しますが、Ansibleが冪等性を担保してくれるので問題ありません。

ユーザ作成については、結果をregisterで保持しておきます。
ここにcredential情報が格納されています。
なお、`password:`によりパスワードも設定できますが、今回は使用しませんでした。なぜなら同じパスワードであっても毎回Ansible上でのステータスがchangedとなってしまうためです。

続いてローカルにcredential情報を格納するためのディレクトリを作成します。

そして、registerに保存したユーザ作成結果からcredential情報を取り出してテンプレートに埋め込み、ローカルにファイル出力します。
whenにより、ユーザ作成結果の内容から、新規作成時のみ実行するようにします。

```yaml:roles/iam/tasks/main.yml
---
- name: IAMグループ作成
  iam:
    iam_type: group
    name: "{{ item.1 }}"
    state: present
  with_subelements:
    - "{{ my_vars.aws.iam.users }}"
    - groups
    - flags:
        skip_missing: True

- name: IAMユーザ作成
  iam:
    iam_type: user
    name: "{{ item.name }}"
    state: present
    groups: "{{ item.groups }}"
    access_key_state: create
  with_items: "{{ my_vars.aws.iam.users }}"
  register: iam_user

- name: credential情報格納用ディレクトリ作成
  file:
    path: "{{ inventory_dir }}/aws_credentials"
    state: directory
    mode: 0755
    group: wheel
  delegate_to: localhost
  check_mode: no
  changed_when: no
  become: yes

- name: credential情報出力
  template:
    src: save_credential.j2
    dest: "{{ inventory_dir }}/aws_credentials/{{ item.item.name }}"
    mode: 0644
    group: wheel
  delegate_to: localhost
  changed_when: no
  become: yes
  with_items: "{{ iam_user.results }}"
  when: item.user_meta is defined and not ansible_check_mode
```

##templates
```yaml:roles/iam/templates/save_credential.j2
{% set params = item.user_meta.access_keys[0] %}
aws_access_key_id = {{ params.access_key_id }}
aws_secret_access_key = {{ params.secret_access_key }}
```

#まとめ
これでシンプルなYAMLでIAMユーザを管理できるようになりました。
また、新規ユーザ作成時には実行ホストにcredential情報が残るので何かと便利だと思います。

#参考
http://dev.classmethod.jp/server-side/ansible/looping_over_subelements/
Linux | grep -o でマッチした文字列だけを抜き出す 

# 例

普通なら文字列全体が返るところを

```bash
$ echo 'Find me please'
Find me please
```

マッチした文字だけ返してくれる

```bash
$ echo 'Find me please' | grep -o me
me
```

# 環境

- bash 4.4
- Mac OSX








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
WordPressが遅い時にまず見ることメモ

#よく考えられる要因
1. ページの構成
2. サーバーのスペック
3. 回線での遅さ
4. プラグイン


##1. ページの構成(HTML/CSS/JS)

###PageSpeed Insights
まずこれで見る。いろいろ提案してくれるのを潰す。
https://developers.google.com/speed/pagespeed/insights/?hl=ja

###ChromeのデベロッパーツールのNetwork
一番上のページの構成に時間がかかっている時
→HTMLの組み方の改善

Autoptimizeプラグインを使うのも手
https://ja.wordpress.org/plugins/autoptimize/
ソースコードの圧縮してくれる
→0.5秒〜1秒くらいの改善が望めそう

##2. サーバーのスペック
スペックを確認しないとわからない。
スペックをあげるのも一つの手。


##3. 回線での遅さ
回線での遅さもあり得る。回線スピードは？

回線スピードチェックツール
http://www.rapidnet.jp/


##4. WordPressのプラグイン
プラグインが原因の場合も。データベース更新系とか。PVランキングなどはページ読み込む度にデータベース更新が走る（=重い）
何が入っているか管理画面入って見ないと本当に遅くしているのかどうかは分からない。
プラグイン全外ししてスピード見てみるのも手。