OmniAICreator/Qiita-1.07M huggingface dataset:
FactoryBotでHashに引数を渡す

# 結論

``` Ruby
FactoryBot.define do
  factory :user, class: "User" do
    profile {
      {
        name: name,
        age: age,
        nickname: nickname
      }
    }
  end

  transient do
    name Michael
    age 16
    nickname Mike
  end
end
```

こういうfactoryを作ったら、Spec内で

``` Ruby
let(:user) {
  FactoryBot.create(:user, name: 'Robert', nickname: 'Rob')
}
```

と呼び出す。
`transient` で定義しているから、`user`オブジェクトからは`name`や`age`は見えない。

``` Ruby
let(:user) {
  FactoryBot.create(:user, profile: {
    name: 'Robert', 
    nickname: 'Rob'
  }) 
}
```

↑ こう書くと`age`の項目が上書きされて無くなってしまうため困っていたがこの手を思いついたのでメモ


# 参考

[FactoryGirlのtransientとtraitを活用する](https://qiita.com/joker1007/items/da63b8630351c1f3fe1d)
Alibaba Cloud の ActionTrail

Alibaba Cloud のコンソールを見ていたら、「ActionTrail」 というサービスが追加されていました。
少し触ってみましたので、ご紹介します。

「Monitor and Management」 というカテゴリにありますね。
カテゴリと名前からサービスの想像が付きますが、そうです、まさに AWS CloudTrail と同じようなサービスです。　

<img width="1099" alt="スクリーンショット 2018-02-09 16.06.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/09cad917-ae63-78a1-c032-7f4e4dc4b9b3.png">

## ActionTrail を使ってみる
Action Trail のメニューへ行き、有効化 「GO!」 します。

<img width="598" alt="スクリーンショット 2018-02-09 16.06.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/0063fc3f-1c16-7c52-a66f-4e2b8c6c81f3.png">

サービスを有効にした直後から、直近の操作ログが出てきました。

<img width="915" alt="スクリーンショット 2018-02-09 16.15.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/8e727fa9-f8f0-5127-20e9-74a539e71667.png">

また、OSS(AWS でいう S3) へログを出力しておくこともできます。

<img width="699" alt="スクリーンショット 2018-02-09 16.14.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/135946/d8be7249-361e-a26e-ec9b-5853c241f192.png">


## まとめ
- ActionTrail はリソース操作ログを記録するサービス
- リソースの追跡、セキュリティ、コンプライアンス等の観点から、有効化しておくことがベストプラクティスだと思います
- ドキュメントを確認したところ、サービスの利用料は無料、OSS の料金のみかかるようです
- ドキュメント（現時点では未翻訳）: https://jp.alibabacloud.com/help/doc-detail/28804.htm
Sketch備忘録~マスク編~

#はじめに
~〇〇編~と書くようにしてサブタイつけるのに困り始めてるけど、あとで見るときに楽になったから良し。
すでに投稿されたものもナンバリングからサブタイに変更しました。
そんなことは置いといて、理解できたことをこの記事で整理。

#環境
sketch Version48.2 (Free Trial)

#今回の備忘録

##マスク
1. 使う画像を選択
2. Insert>Shape>○○(好きな図形)を選択
3. 選んだ図形を画像の切り抜きたい部分に重ねて、図形と画像を選択する![スクリーンショット 2018-02-09 11.12.19.png](https://qiita-image-store.s3.amazonaws.com/0/153719/c7ff3f46-20d9-2105-286b-96640e23e113.png)
4. 完成![スクリーンショット 2018-02-09 11.22.55.png](https://qiita-image-store.s3.amazonaws.com/0/153719/a0454dc6-5c7a-e234-b7ba-ee8297d22c0a.png)
5. 補足
    1. 図形の設定をFillsのみ、Bordersのみ、FillsとBordersにしても切り取られる範囲は一緒
    2. 完全に切り取られているわけではなく、見える範囲を限定しているだけなので画像の位置を動かせば見える範囲は変わる![スクリーンショット 2018-02-09 11.41.36.png](https://qiita-image-store.s3.amazonaws.com/0/153719/f136c695-a496-0456-f8b1-d2173d209198.png)
IT用語の読み方クイズ(10問)(新人向け)

自社は特定製品をガッツリ扱うようなビジネスモデルなので、逆に一般的なITの用語に疎い傾向があります。

そのため、社内の若手向けに有名どころのIT用語の読み取り問題を出してみました。周辺のIT技術にもにも興味を持ってもらうきっかけになると嬉しい。  
  
社内メールでは各用語に色々とコメントを入れましたが、怒られそうなのでQiitaでは省略します。


####問題1：adobe
####問題2：hadoop
####問題3：Ruby
####問題4：Perl
####問題5：Delphi
####問題6：Azure
####問題7：git
####問題8：gulp
####問題9：haskell
####問題10：nginx

答えは以下
↓  
↓  
↓  
↓  
↓  
↓  
↓  
↓  
↓  
↓  
↓  
↓  
↓  
↓  
↓  
↓  
↓  
↓   
問題1:**アドビ**　　(誤:アドベ,アドボ,アドーブ)  
問題2:**ハドゥープ**　　(誤:ハドップ,ハドープ)   
問題3:**ルビー**　　(誤：ルバイ,ラビー)   
問題4:**パール**　　(誤：ペリル,ペール)   
問題5:**デルファイ**　　(誤：デルフィー)   
問題6:**アジュール**　　(誤：アズワー,アジュワー)   
問題7:**ギット**　　(誤：ジット)   
問題8:**ガルプ**　　(誤：グルプ)   
問題9:**ハスケル**　　(誤：ハスカル,ハスクル)   
問題10:**エンジンエックス**　　(誤：ニグイクス,ングインクス) 

<pre>
全問正解：IT用語読み界の生ける伝説  
８～９問正解：IT用語読みプロフェッショナル  
６～７問正解：IT用語読み界の優等生  
４～５問正解：IT用語読み界の一般市民  
２～３問正解：飲食店勤務  
１問正解：逆になんで1つわかった  
０問正解：世の中に興味がない人  
</pre>
Pandas で時系列のデータを期間ごとに集計してまとめる

最近Pandas の勉強をしはじめたのでそのメモです。
怪しいところの編集リクエストやコメントをいただけるとありがたいです。

### 実行環境

* Python version 3.6.4
* Pandas version 0.22.0
* Matplotlib version 2.1.2

### 今回の目的

以下のような時系列のイベントデータに対して、特定の期間ごとにイベントの数を集計しグラフ化します。

```csv
2017-07-02 23:17:02,3
2017-07-11 17:48:55,2
2017-11-01 16:50:22,0
.
.
.
2018-01-18 15:48:58,2
2018-01-18 23:47:19,1
2018-01-19 12:37:00,2
2018-01-31 14:04:48,3
2018-02-01 07:46:54,1
```

### 実行

まずはライブラリをimport

```python
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
%matplotlib inline
```

次にヘッダーなしのcsvファイルから、一列目をdate型として、かつindexとして読み込み

```python
df = pd.read_csv('data.csv', parse_dates=[0], header=None, index_col=[0])
df.head()
```

[Out]

```python
                     1
0                     
2017-07-02 23:17:02  3
2017-07-11 17:48:55  2
2017-11-01 16:50:22  0
2017-11-15 13:34:05  5
2017-11-19 14:59:14  2
```

出現回数を数えたいので、１を追加

```python
df['count'] = 1
df.head()
```

[Out]

```python
                     1  count
0                            
2017-07-02 23:17:02  3      1
2017-07-11 17:48:55  2      1
2017-11-01 16:50:22  0      1
2017-11-15 13:34:05  5      1
2017-11-19 14:59:14  2      1
```

一週間ごとにまとめて、各グループを合計する。
Wを、2Wにすると2週間ごとに、Mにするとー月ごとにまとまる。

```python
df2 = df.resample('W').sum() 
df2.head()
```

[Out]

```python
            1  count
0                   
2017-07-02  3      1
2017-07-09  0      0
2017-07-16  2      1
2017-07-23  0      0
2017-07-30  0      0
```

単純に描画

```python
df2.plot(kind='bar')
```

![df2plot.png](https://qiita-image-store.s3.amazonaws.com/0/51316/b0fd1c25-70e6-169d-b89b-3f92b2bcfc1f.png)


x軸のラベルがごちゃごちゃしているとの、countだけ出したいので軸設定をし描画

```python
fig, ax = plt.subplots(figsize=(10,7))
ax.xaxis.set_major_locator(mdates.MonthLocator())
ax.xaxis.set_major_formatter(mdates.DateFormatter('%b %d'))
ax.bar(df2.index, df2['count'])
```

![count.png](https://qiita-image-store.s3.amazonaws.com/0/51316/752a2f1b-db04-e185-4cc3-9ea1cc7c95cc.png)


とりあえず目的は達成。
count あたりの処理は、もっとうまい方法がありそう。。。
Makefileのタスク実行時にy,Nで確認をとる

Makefile、タスクという形でコマンド群を容易に再現可能な状態で保存しておける最高のツールだと認識しています。
最近はなんでもかんでもMakefileにコマンドをまとめるのがマイブームです。
が、その容易さゆえに危険なタスクをうっかり実行してしまう、ということがそのうち起こりそうで怖いなあと感じていて、これに対する対策は無いものかと考えていました。
そこで、shellらしく[y,N]で確認がとれるようにしたいという結論に至りました。

## コマンド実行時、[y,N]で確認をとるようにする

以下の記述で可能になります。

```
cmd:
	@read -p "Are you sure? [y,N]:" ans; \
	if [ "$$ans" = y ]; then  \
	  実行したいコマンド; \
	fi
```

makefileのタスク内のコマンドは1行1行がサブシェル内で実行されるので、readで受け取った値を別箇所で使う際は、明示的にワンライナーとして記述する必要があります。

これで実行時に確認を取ってもらえるようになりました。より安全にMakeのタスクを実行できるようになりましたね。
Jupyter notebookの特定のセルの色を変える

## スタイルの変更の基本

Jupyter notebookでは

```python
from IPython.core.display import display, HTML

html_code = "<h1>Hello World</h1>"
display(HTML(html_code))
```

のようにするとセルの出力にhtmlコードを埋め込むことができる。これを利用して`<style>`タグを埋め込むとcssをいじれる. 

Jupyter notebookではコードが表示されている部分のクラスは```CodeMirror```なので

```python
display(HTML("""<style>
.CodeMirror { background-color:#dfd;}
</style>"""))
```

を実行すると、

![code.png](https://qiita-image-store.s3.amazonaws.com/0/233302/cfeac1d7-bd02-8a13-30b4-ee81f58dc63c.png)

このように、コードの入力部分のいろを変えることができる。

またセルのクラスは```cell```なので、

```python
display(HTML("""<style>
.cell { background-color:#dfd;}
</style>"""))
```

を実行すると、

![cell.png](https://qiita-image-store.s3.amazonaws.com/0/233302/d0753113-2049-735b-a2fb-1691cc276eda.png)

今度はセルの背景の色を変えることができる。

## 特定のセルのスタイルの変更

上のやり方では全てのセルに関してスタイルが変更されてしまう。特定のセルのスタイルを変更したい時には、何かセルに目印をつける必要がある。ここではコードになんらかのコメント（```#green```）を付け加えることにした。

その後は、それぞれのセル内のテキストに```#green```が含まれているかを調べ、もし含まれていたらコード部分の背景の色を変更するというもので、それは以下のように実装できる。

```python
display(HTML("""
<script>
let cells = $(".cell");
for(let i=0;i<cells.length;i++){    
    if( $(cells[i]).text().includes("#green") ){
        $(cells[i]).find(".CodeMirror").css("background-color","#efe");
    }
    else{
        $(cells[i]).find(".CodeMirror").css("background-color","#f7f7f7");
    }
}
</script>
"""))
```

こうすることで、コードに```#green```のコメントを入れたセルのコード部分のみの色が変更される。

例えばこれを一番上のセルに書き、for文の```i=0```を```i=1```に変えれば一番上以外の```#green```の含まれているセルの色が変わる。

* もっといいやり方があれば教えてください、、、
FlyingText3Dで用意されているAPIを調べてみた

この記事は公式ドキュメントの補足的な立ち位置で書いてます。

# [FlyingText3D](https://www.assetstore.unity3d.com/en/#!/content/3627)とは
Unityで文字の3Dオブジェクトを簡単に生成してくれるアセット。
フォントファイルさえ用意すればどんな文字でも3Dオブジェクトとして生成してくれます。
その他詳しいことは[コチラの記事](https://qiita.com/arumani/items/fc7211287678deb75277)を見てください。

# 用意されているAPI
大きく分けて5種類あります。

## GetObject
文字列(String)を渡したら **子を持たないGameObject** が返ってくる。
文字列を1つのまとまったオブジェクトとして扱いたいときはこれを使う。
String のほかに Material, edgeMaterial, size, extrudeDepth, resolution, characterSpacing, lineSpacing, lineWidth, position, rotation が引数として渡せる。
一部だけ指定することも可能。例えばPositionとRotationだけ指定したいなら

```
GameObject gameObject = FlyingText.GetObject( (string)text, (Vector3)position, (Quaternion)rotation);
```
とすればいい。

## GetObjects
GetObjectと違い文字列(String)を渡したら **文字数だけ子を持った親のGameObject** が返ってくる。
文字を個別に扱いたいときはこれを使う。
使用できる引数はGetObjectと同じ。

## GetObjectsArray
GetObjectsと違い文字列(String)を渡したら **1文字ごとのGameObjectを配列として** 返す。
特定の文字だけ操作したいときはこれを使った方が便利？
使用できる引数はGetObjectと同じ。

## UpdateObject
生成済みオブジェクトの文字を変更したいときに使用する。
FlyingText3Dで生成したオブジェクト(GameObject)と変更後の文字列(String)を引数として渡すとオブジェクトの文字が変わる。返値はない。

```
UpdateObject( (GameObject)gameObject, (string)text);
```

## PrimeText
~~このアセット内で1番使えない関数。~~
Startで呼び出すことで、引数として渡した文字を事前に用意してくれる。
事前に用意することで文字オブジェクトの生成時の負荷を軽くすることができる。

```
FlyingText.PrimeText("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ");
```

英語だけなら大文字小文字合わせて50文字程度で済むし、半角数字を含めても+10字程度なので問題にはなりません。
これを日本語に拡張すると、平仮名だけで100文字とちょっと、片仮名や常用漢字、人名漢字、全角数字などなどを合わせると3000字を余裕で超えます。
フォントファイルに登録されている文字だけ抽出してそれを登録するという方法もありそうですが、メモリ消費量がヤバいことになりそう。
~~あとフォントに登録されている文字を抽出するってどうやるの。~~

正直現実的ではないので、文字列を1~5文字ずつに分離してそれぞれGetObjectした方がいいと思います。
ネットワーク用語 色々メモ

### ネットワーク用語 ざっくりメモ
1,BSR
RPを決定するもの
プライオリティ　BN < AN < 野
ネットワーク制御のIPv6が大きいほう

2,RP
マルチキャストパケットが届くところ
BN < AN < 野 IPv6が小さいほう

3,MLD
マルチキャストパスを要求
パケットを送るか送らないかを決める

4,マルチキャスト
1対多　の通信

5,MPLS
IPアドレスの代わりにラベルを使って通信を行う

6,ネクストホップ
たらいまわし先
バケツリレーにおける次にバケツを渡す先

7,BSR border
BN < AN < 野 
BN ANの間を切った場合、BN側でBSRを作成、AN,野側でもBSRを作成する
WindowsMixedRealityモーションコントローラーの左右識別

WinMRモーションコントローラーのトリガー押下時に、左右の識別で詰まったのでメモします。
現状、トリガー入力をハンドルするIInputClickHandlerのInputClickedEventDataでは、コントローラーの左右の情報が取れない?(ちゃんと調べてない)ので、gestureRecognizerを使うとうまくできました。サンプルコードは以下。

```csharp
    private void Awake()
    {
        //InputClickedEventDataではどちらのコントローラーが押されたかを識別できないのでGestureRecognizerを使う
        gestureRecognizer = new GestureRecognizer();
        gestureRecognizer.Tapped += GestureRecognizer_Tapped;

        gestureRecognizer.StartCapturingGestures();
    }

    public void GestureRecognizer_Tapped(TappedEventArgs obj)
    {
        if(obj.source.handedness == InteractionSourceHandedness.Left)
        {
            Debug.Log("left Trigger");
        }

        else if (obj.source.handedness == InteractionSourceHandedness.Right)
        {
            Debug.Log("right Trigger");

        }
    }
```
Elasticsearch(5.4.2)の謎を解明するための実験結果。２データノードをダウン(障害だ)させて復活させる

# 効果
障害時・・データノードが２つ停止した場合にどうなるのかわかる。

# 構成
クライアントノード3台
データノード3台
マスターノード3台
ドキュメントは10Gくらい
レプリカは１

# グリーンからデータノード２台電源OFF
・レッドになる
・シャードがなくなる（UNASSIGNED）
障害だ。。。

# 一台電源ONしてサービススタート
・シャードが再配置される
・イエロー
参照できる。。。サービス的には復旧？
でもドキュメントの更新ができない。
多分ほっといたら、再配置が完了してグリーンになる予定だけど・・・

# さらに一台電源ONしてサービススタート
・シャードが再配置される
・グリーン
完全復旧

# 感想
電源落ちたくらいなら、復旧可能。
ドキュメントデータ壊れたとか、データが汚くなったららどうなるんだろう。
実験できないので試しようがない。
もしかしたら、データファイルを壊せばいいのかもしれない。

#Elasticsearch(5.4.2)実験記事
[サービス無停止でデータノードを安全に削除してメンテする。](https://qiita.com/mokoenator/items/28bd41611274c5f4c771)
[ダウンタイムなしてデータノードを追加できる？](https://qiita.com/mokoenator/items/4d92edda8b7fac5d1668)
[アクセスノード、受付ノードの振る舞いについて](https://qiita.com/mokoenator/items/9ccadbfcb6ce42ab24e4)
[辞書ファイル、スクリプトファイルの配置ノードは？](https://qiita.com/mokoenator/items/2b080ec5417a0564baf7)
[２データノードをダウン(障害だ)させて復活させる](https://qiita.com/mokoenator/items/8b1c8f7160981e9a6938)
[１データノード・1シャードで作ると早かった](https://qiita.com/mokoenator/items/38602224a50625894683)
Django2(Python3)+Mysqlの開発環境をDockerで構築

(macOS10.12.6, Django2.0.2, python3.6.4, MySQL5.7)

[公式はポスグレ版のみ](https://docs.docker.com/compose/django/#connect-the-database)しか書いてないのでmysqlで。

## 前提

Docker for Mac と Django をインストールしておく

- https://www.docker.com/docker-mac
- https://www.djangoproject.com/


## Django

### プロジェクト作成

公式とは順番変える。先にローカルにプロジェクト作ってしまう。  
（プロジェクト名は暫定で `webapp` としておく）

```
$ django-admin startproject core
$ mv core webapp
$ cd webapp
```

### Djangoの設定を修正する


``` core/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'django',
        'PASSWORD': 'django',
        'HOST': 'db',
        'PORT': 3306,
    }
}
```
### pythonライブラリ

``` requirements.txt
Django>=2.0.1
mysqlclient
```

- [Databases | Django documentation | Django #MySQL DB API Drivers](https://docs.djangoproject.com/ja/2.0/ref/databases/#mysql-db-api-drivers)

## docker

### ファイル作成

- mysql の文字コードをutf8mb4にしておく
- db より先に web が起動した場合エラーになるので [wait-for-it](https://github.com/vishnubob/wait-for-it) 使うのがよさそう。 `wait-for-it.sh`
 をダウンロードしてトップの階層に置く
 - http://docs.docker.jp/compose/startup-order.html
 - https://github.com/vishnubob/wait-for-it

``` docker-compose.yml
version: '3'
services:
 db:
 image: mysql:5.7
 command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
 volumes:
 - .:/var/www/webapp
 restart: always
 environment:
 MYSQL_ROOT_PASSWORD: django
 MYSQL_DATABASE: django
 MYSQL_USER: django
 MYSQL_PASSWORD: django
 web:
 build: .
 command: sh -c "./wait-for-it.sh db:3306; python3 manage.py runserver 0.0.0.0:8000"
 volumes:
 - .:/var/www/webapp
 ports:
 - "8080:8000"
 depends_on:
 - db
```

``` Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir -p /var/www/webapp
WORKDIR /var/www/webapp
ADD requirements.txt /var/www/webapp/
RUN pip install -r requirements.txt
ADD . /var/www/webapp/
```


### コンテナを作成・起動

```
$ docker-compose up -d
```

### 動作確認

- http://localhost:8080/

![スクリーンショット 2018-02-09 16.41.51.png](https://qiita-image-store.s3.amazonaws.com/0/41656/1095bf07-ff01-f427-d2a5-6a10df3544e4.png)


## 管理画面

### migrate して管理者を作成

```
$ docker-compose run web python manage.py migrate
$ docker-compose run web python manage.py createsuperuser
```

### 動作確認

- http://localhost:8080/admin/

![スクリーンショット 2018-02-09 16.42.02.png](https://qiita-image-store.s3.amazonaws.com/0/41656/9c3b016b-09ad-bf08-f752-c032a43eb1cc.png)

## ファイル構成

```
$ tree -I __pycache__
.
├── Dockerfile
├── core
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── docker-compose.yml
├── manage.py
├── requirements.txt
└── wait-for-it.sh

1 directory, 9 files
```


- [Quickstart: Compose and Django | Docker Documentation  ](https://docs.docker.com/compose/django/#connect-the-database)
- [Docker公式イメージのMySQLで文字コードを指定する - Qiita](https://qiita.com/neko-neko/items/de8ea13bbad32140de87)
Elasticsearch(5.4.2)の謎を解明するための実験結果。辞書ファイル、スクリプトファイルの配置ノードは？

# 全部に置いとく
データノードとクライアントノードに配置すればいいような気がするけど・・
緊急時に「クライアントノードをデータノードにしなきゃ！！」とか「マスターノードをデータノードにしなきゃ！！」という対応で絶対に配置忘れそうだから置いとけばいい。
配置は何かの方法で自動化しておくのが良い。

# データノード追加でそのノードに辞書がない場合
再配置でエラーになって、いつまでも再配置が終わらない。


#Elasticsearch(5.4.2)実験記事
[サービス無停止でデータノードを安全に削除してメンテする。](https://qiita.com/mokoenator/items/28bd41611274c5f4c771)
[ダウンタイムなしてデータノードを追加できる？](https://qiita.com/mokoenator/items/4d92edda8b7fac5d1668)
[アクセスノード、受付ノードの振る舞いについて](https://qiita.com/mokoenator/items/9ccadbfcb6ce42ab24e4)
[辞書ファイル、スクリプトファイルの配置ノードは？](https://qiita.com/mokoenator/items/2b080ec5417a0564baf7)
[２データノードをダウン(障害だ)させて復活させる](https://qiita.com/mokoenator/items/8b1c8f7160981e9a6938)
[１データノード・1シャードで作ると早かった](https://qiita.com/mokoenator/items/38602224a50625894683)
Ratpack入門 (9) - Thymeleaf

## Ratpack入門シリーズ

1. [Ratpack入門 (1) - Ratpackとは](https://qiita.com/minebreaker/items/d7eeca815872a97069f5)
2. [Ratpack入門 (2) - アーキテクチャー](https://qiita.com/minebreaker/items/a9b256fd8a1513104669)
3. [Ratpack入門 (3) - hello world 詳解](https://qiita.com/minebreaker/items/b26d7d0677f91f17a7b5)
4. [Ratpack入門 (4) - ルーティング & 静的コンテンツ](https://qiita.com/minebreaker/items/8f26d8350f936ad669c2)
5. [Ratpack入門 (5) - Json & Registry](https://qiita.com/minebreaker/items/4353611cc541e3cb35fb)
6. [Ratpack入門 (6) - Promise](https://qiita.com/minebreaker/items/4689058d0d7b34d99c74)
7. [Ratpack入門 (7) - Guice & Spring](https://qiita.com/minebreaker/items/52b303bc18db5b33bd68)
8. [Ratpack入門 (8) - セッション](https://qiita.com/minebreaker/items/1ebaa492b257365e1e5e)
9. [Ratpack入門 (9) - Thymeleaf](https://qiita.com/minebreaker/items/50693a4d6614979f654c)


## Thymeleaf

Ratpackは、[Thymeleaf](http://www.thymeleaf.org/)テンプレートエンジンをサポートするモジュールを提供しています。

```groovy:build.gradle
dependencies {
    compile "io.ratpack:ratpack-thymeleaf:${ratpack}"
}
```

モジュールを追加します。

```java
Function<Registry, Registry> registry = ratpack.guice.Guice.registry( bindings -> {
    bindings.module( new ThymeleafModule() );
} );
```

Thymeleafモジュールは、デフォルトで`${BaseDir}/thymeleaf`以下の`*.html`ファイルをテンプレートとして認識します。そのため`BaseDir`の設定が必須です。

```java
ServerConfig.builder()
            .development( true )
            .findBaseDir( "public/.ratpack" )
```

この場合、`public/thymeleaf`がテンプレートディレクトリとみなされます。

モジュールは`ratpack.thymeleaf.Template`クラス用の`Renderer`を登録します。Thymeleafの`IContext`用のレンダラー**ではない**ことに注意してください。`Template`は、`Template.thymeleafTemplate()`メソッドから作成できます。

```java
Action<Chain> handlers = chain -> {
    chain.get( "/:name?", ctx -> {
        String name = ctx.getPathTokens().get( "name" );
        name = name.isEmpty() ? "world" : name;
        ctx.render( Template.thymeleafTemplate( ImmutableMap.of( "name", name ), "template" ) );
    } );
};
```

第一引数のマップがパラメーターのバインディング、第二引数がテンプレートの名前です。`BaseDir`が`public/.ratpack`とすると、実際に解決されるファイルは、`public/thymeleaf/template.html`になります。

テンプレートファイルは、通常のThymeleafと全く同じです。

```html:template.html
<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta content="text/html; charset=UTF-8" />
</head>

<body>
<h1 th:text="'hello, ' + ${name}"></h1>
</body>

</html>
```

このように、Thymeleafの使い方は非常に簡単です。モジュールの実装自体も、テンプレートを表すクラスと、テンプレートエンジンをラップするレンダラーの実装があればいいため、簡単に作ることができます。同様のパターンで、Velocityやほかのテンプレートエンジンに対応することも、容易に出来るかと思います。


## Thymeleafのバージョンについて

~~Ratpack公式が提供しているモジュールは現在(2018年2月)、Thymeleaf 2.1.5までです。バージョン3には対応しません(仕方がないので私は自分で実装しました - [宣伝](https://github.com/minebreaker-tf/ratpack-thymeleaf3))。~~
1.6.0以降で公式が対応しました。そちらをお使いください。
DataGripでRedshitを繋ぐ


DBのGUIツール、**DataGrip**

DataGripの[公式](https://www.jetbrains.com/help/datagrip/connecting-to-a-database.html#amazon_redshift)にも記載されている内容です。(英語)

**前提**: mac

# DataGripをダウンロード


ここ → [DataGrip](https://www.jetbrains.com/datagrip/) 

02.2018現在、30日間の無料トライアルが可能でした。

# アカウント作成

[ここからサインアップ](https://account.jetbrains.com/login)

1. メールアドレスを入力
2. 届いたメールアドレスからパスワードなどを設定
3. アカウント作成完了

# アプリを開く

1. アプリを開くと**DataGrip License Activation**が出てくる。
2. 先頭のチェックボックス**Evaluate for free**を選択で無料トライアルできる。
3. メールアドレスを入力し、**Evaluate**


# 接続設定
1. **⌘** + **;**
2. **Data Sources and Drivers**ウィンドウが出てくる。
3. 左上の**+**をクリック。
4. 任意のサービスを選択。
5. 接続に必要な項目に値を入れていく。

* Name: 任意の接続先名
* Comment: 接続先に関する説明(任意)
* Host: 例(<cluster>.xxxxxxxxxx.<Region>.redshift.amazonaws.com)
AWSコンソールからRedshit→クラスター→任意のクラスターのエンドポイント
* Database: データベース名
* User: ユーザー
* Password: パスワード
* URL: こちらはHostを入力すると自動的に入力されていくはずです。

6. **Test Connection**を押下し、"Successful"と表示されればOK.
7. 下部の、"Apply"押下して、"OK"
8. 接続先が完了すると、DataGripウィンドウの左にあるDB一覧に表示されるはずです。

#  おわり
あとはポチポチしたら、クエリ書いたり！
ライセンスや価格については、以下を参照してみてください。

* https://www.jetbrains.com/datagrip/buy/#edition=personal&tabs_1=personal
* https://www.componentsource.co.jp/product/datagrip/prices

使い勝手が良さそうなので、ライセンス購入も検討！
データの色を表示して視覚化する。

### データはハッシュ化できる。ハッシュ化したデータはカラー値に変換しやすい。
```js

var hashColor=((s)=>{ return '#'+md5(s).slice(0,6) });
```
### スライスして先頭６文字分をカラーにするため、ハッシュよりもかぶりやすくなる。
対策として、全てのハッシュ値をカラー化するには、６色カラーにする。端数はゼロパディング。

```js
//ready padding
fn.pad=( (d,l)=>('000000000000000000'+d).slice(-1*l)) 
```
```js
 fn.md5(d).match(/[\s\S]{1,6}/g).map(d=>'#'+fn.pad(d,6)).forEach((d)=>{
 console.log(d); //d is #xxxxxxx * 6
})
```
### デモ
```js
//hash color
let fn={}
fn.ce=(d=>document.createElement(d))
//fn.md5=md5
fn.pad=( (d,l)=>('000000000000000000'+d).slice(-1*l)) 
fn.script=(u=>{let el=fn.ce('script');el.onload=on;el.src=u;return el})
;
let $sc =fn.script('https://cdnjs.cloudflare.com/ajax/libs/blueimp-md5/2.10.0/js/md5.js')
,$s=fn.ce('style')
,$t=fn.ce('textarea')
,$o=fn.ce('output')
,sol=(d=>Promise.resolve(d))
;
$s.innerHTML=`textarea{width:100%;height:10rem}span{width:2rem;border-bottom:4px solid;padding:0 1rem}.none{display:none}`
;
$t.oninput =on
$t.classList.add('none')
;[$sc,$s,$t,$o].forEach(d=>document.body.appendChild(d))
;
function on(ev){
 let type=ev.type
 if(type==='load'){ fn.md5=md5;$t.classList.remove('none')}
 if(type==='input'){
  let v= $t.value
  ;sol(v).then(d=>{
   $o.innerHTML='';
   fn.md5(d).match(/[\s\S]{1,6}/g).map(d=>'#'+fn.pad(d,6)).forEach((d)=>{
     let color= d
     ,el=fn.ce('span')
     ;
     el.innerHTML =color.slice(1)
     el.style.borderColor=color;
     /*console.log(color);*/
     $o.appendChild(el) 
    })
  })
  ;
 }
// 
}

```
Unity2017でARアプリ - 4.ビルドする(Android)

Unity+Vuforiaで作ったプロジェクトをビルドしてみます。
プロジェクトの制作過程は過去記事（Unity2017でARアプリ）に書きました。
[1.サンプルを動かす](https://qiita.com/takako_sudou/items/50644c672310f990bf57)
[2.シンプルなARプロジェクト](https://qiita.com/takako_sudou/items/e09f2c6f15f29ded49c7)
[3.オリジナルのARマーカーを使う](https://qiita.com/takako_sudou/items/ec2081cc4d9c4abb1c8f)

###参考にさせて頂いた記事
UnityからAndroid実機ビルド手順(2017.08版)
https://qiita.com/relzx/items/7f8e7817c9edd11c5023
#作業概要
やるべきことは大きく2つあります。
1.Androidアプリをビルドする環境を作る
2.Unityでのビルドに関する設定をする
#1.Androidアプリをビルドする環境を作る
##(1)Java SE Development Kit 8をインストール
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
##(2).Android Studioをインストール
https://developer.android.com/studio/index.html?hl=ja
これはAndroid SDKのインストールが主な目的なのですが、インストール途中で表示される『Android SDK』のオプション（チェック項目）が今のバージョンでは無くなっています。ですがSDKはインストールされるので問題ありません。インストール先フォルダの確認方法は後述。
##(3)Android NDKセットアップ
https://dl.google.com/android/repository/android-ndk-r13b-windows-x86_64.zip
からダウンロードし、解凍しておく。
#2.Unityでのビルドに関する設定をする
##(1)Android用機能追加
①機能追加
方法１）インストール時の画面「Choose compasenents」で「Android Build Support」にチェックを入れる。
方法２）メニュー「File」→　「Build Setting」をクリックし、「Build Settings」の画面を開く。
「Android」クリック→「Open Download Page」をクリックすると機能を追加するための設定を行える。(今回はこちらの方法で機能追加しました）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/098d7f4f-dfb9-f52a-bbd2-7eac6f4494bf.png)
途中、Unityを終了するようにメッセージが出ますのでUnityを閉じ、インストール終了させる。
②Unityを起動。メニュー「File」→　「Build Setting」をクリックする。
③「Android」クリック→「Development Build」にチェックを入れる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/4945460d-a7d1-ef4a-bdb7-d1389e2a3bd9.png)

##(2)設定

①「Edit」→「Project Settings」→「Player」で、Vuforia Argumented Realityをチェック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/ffc71805-3f11-14b3-1fe8-cdf12ef2ae2f.png)
②「Edit」→「Project Settings」→「Player」の「Other Settings」の中にある、「Android TV Compatibility」のチェックを外す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/e921d169-e38c-897a-809a-0202f1db5935.png)

③「Edit」→「Project Settings」→「Player」の「Other Settings」の中にある、「Package Name」に入力
Package Nameの記述形式は、「com.会社名.製品名」で、全て半角の英数字が基本。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/4cddd3bf-d2c0-62d1-0685-f600f390208a.png)

④メニュー「Edit」→「Preference」の「External Tools」を設定。Androdの三か所の「Brows」ボタンからパスを設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/b83a8a4c-d17e-3065-d987-f6f6f35d7fd3.png)
各パスは、インストール先フォルダを指定する。
○SDKインストール先確認方法
①Android Studioを起動する
②スタートアップ画面右下の歯車の「Configure」をクリックし、「Default Settings」を表示させると、Android SDK Locationという項目で確認できる。これを使う。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/9277947b-65d1-e198-9dae-b2ace3f6da11.png)

##(3)ビルドする
メニュー「File」→　「Build Setting」をクリックし、「Build」ボタンクリック
apkファイルができるので、Google Driveなどを経由してスマホやタブレットに送ると実行可能。
#3.実際に動かしてみる
今回は、実機ではなくエミュレータNoxPlayerを使ってテストしてみました。
https://jp.bignox.com/
ただWebカメラが原因なのか、勝手にミラー反転していたので、カメラの設定を変更して動作しました。


###その他参考記事
【３０分でできる】Unityで簡単にARアプリを作る
http://makers.hatenablog.com/entry/2013/12/27/191636
Unity＋Vuforiaで3プラットフォームに対応したARコンテンツを作る基本 (1/4)
http://www.atmarkit.co.jp/ait/articles/1701/19/news028.html
How to secure SSL and get A+ on Qualys SSL Server Test

### Symptoms

like to get rid of ciphers marked as <font color=red>WEAK</font>
https://www.ssllabs.com/ssltest/analyze.html

- before

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114634/be5ef514-e1d6-a8ce-b516-8a14a515651a.png)


### How to secure SSL


- before

```nginx.conf
...
    ssl_prefer_server_ciphers on;

    ssl_protocols TLSv1.2 TLSv1.1;
    # ssl_protocols TLSv1.2; # Score=100

    ssl_dhparam          /etc/nginx/dhparam.pem;

    ssl_ciphers "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5;!CAMELLIA";
#    ssl_ciphers AES256+EECDH:!aNULL; # Score=100
...
```

- after

```nginx.conf
...
    ssl_prefer_server_ciphers on;

    ssl_protocols TLSv1.2 TLSv1.1;
    # ssl_protocols TLSv1.2; # Score=100

    ssl_dhparam          /etc/nginx/dhparam.pem;

#    ssl_ciphers "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5;!CAMELLIA";
    ssl_ciphers "ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL:!MD5;!CAMELLIA";
#    ssl_ciphers AES256+EECDH:!aNULL; # Score=100
```



![image.png](https://qiita-image-store.s3.amazonaws.com/0/114634/2121b85a-14fc-f791-0d68-1d89a758b894.png)

Done :relaxed:
ProcessingでBMPをバイナリデータから作る

投稿テストも兼ねて。
宗教上の理由でPGraphics.saveを使えない方におすすめ。

```java:bmp.pde
import java.io.*;

void bmpSave(PGraphics g,String fileName){
  g.updatePixels();
  int bw = g.width * 3 + g.width % 4;
  //== ceil(g.width*3/4)*4
  int fileSize = 54 + bw * g.height;
  
  try {
    OutputStream os = new FileOutputStream(fileName);
    os.write(new byte[]{'B', 'M'}); //ファイルタイプ
    os.write(intToBytes(fileSize,4)); //ファイルサイズ
    os.write(new byte[]{
      0, 0, //予約領域1
      0, 0, //予約領域2
      54, 0, 0, 0, //画像データまでのオフセット
      40, 0, 0, 0}); //情報ヘッダのサイズ
    os.write(intToBytes(g.width,4)); //幅
    os.write(intToBytes(g.height,4)); //高さ
    os.write(new byte[]{
      1, 0, //プレーン数
      24, 0, //色のビット数
      0, 0, 0, 0}); //圧縮形式
    os.write(intToBytes(g.height*g.width*3,4)); //画像データのサイズ
    os.write(new byte[]{
      0, 0, 0, 0, //水平解像度
      0, 0, 0, 0, //垂直解像度
      0, 0, 0, 0, //パレットの色数
      0, 0, 0, 0}); //重要なパレットのインデックス
    for (int y = g.height - 1; y >= 0; y--) { //画像データの左下から読む
      for (int x = 0; x < g.width; x++) {
        os.write(intToBytes(g.pixels[x+y*g.width],3));
      }
      for (int x = 0; x < g.width % 4;x++){ //0埋め
        os.write(0);
      }
    }
    os.close();
  }
  catch(Exception e) {
    e.printStackTrace();
  }
}

byte[] intToBytes(int number,int h) {
  byte[] returnByte = new byte[h];
  for(int i = 0; i < h; i++){
    returnByte[i] = byte(number >> (i*8)); //リトルエンディアン
  }
  return returnByte;
}

void setup() {
  size(299, 299);
  PGraphics pg = createGraphics(width, height);
  pg.beginDraw();
  pg.background(255);
  int count = 0;
  for(int r = 0 ; r < 256; r+=127)
  for(int g = 0 ; g < 256; g+=127)
  for(int b = 0 ; b < 256; b+=127){
    pg.fill(r,g,b);
    pg.rect(count/6*50,count%6*50,50,50);
    count++;
  }
  pg.endDraw();
  image(pg, 0, 0);
  bmpSave(pg,savePath("output.bmp"));
}
```

#参考
[【バイナリファイル入門】Bitmapファイルを手書きで作って遊んでみる](https://qiita.com/chooyan_eng/items/151e67684e5ef8d1a695)
[Bitmapファイルを入出力してみる](http://hooktail.org/computer/index.php?Bitmap%A5%D5%A5%A1%A5%A4%A5%EB%A4%F2%C6%FE%BD%D0%CE%CF%A4%B7%A4%C6%A4%DF%A4%EB
)
Oracle ORA- エラーメッセージ一覧  PL/SQL list_ORA_errors.sql

```SQL:
V$INSTANCE, V$NLS_PARAMETERS のSELECT 権があるスキーマで実行するか、
あらかじめSYSスキーマから
GRANT SELECT ON V_$INSTANCE TO PUBLIC or 当コードを実行するスキーマ ;
GRANT SELECT ON V_$NLS_PARAMETERS TO PUBLIC or 当コードを実行するスキーマ ;
```
```SQL:list_ORA_errors.sql
--
--  Oracle ORA- エラーメッセージ一覧
--
--  銀行などインターネットに接続できない環境で開発・保守する時使えるとちょっと便利
--
-- English
ALTER SESSION SET NLS_LANGUAGE = AMERICAN ;
-- Japanese
-- ALTER SESSION SET NLS_LANGUAGE = JAPANESE ;
--
SET ECHO OFF
SET FEEDBACK OFF
SET HEADING ON
SET LINESIZE 150
SET PAGESIZE 50000
SET SERVEROUTPUT ON SIZE UNLIMITED
SET TERMOUT OFF
SET TRIMSPOOL ON
-- SPOOL pass includes VERSION and LANGUAGE
COLUMN VERSIONS NEW_VALUE VERSIONS
SELECT REPLACE(VI.VERSION, '.', '_') || '_' AS VERSIONS
FROM V$INSTANCE VI
-- Windows ↑,  UNIX/Linux では ↓ を有効に
FROM V\$INSTANCE VI
;
COLUMN LANGUAGES NEW_VALUE LANGUAGES
SELECT NP.VALUE AS LANGUAGES
FROM V$NLS_PARAMETERS NP
-- Windows ↑,  UNIX/Linux では ↓ を有効に
-- FROM V\$NLS_PARAMETERS NP
WHERE NP.PARAMETER = 'NLS_LANGUAGE' ;
SPOOL list_ORA_errors_&&VERSIONS&&LANGUAGES..log
-- Windows ↑,  UNIX/Linux では ↓ を有効に
-- SPOOL list_ORA_errors_\&&VERSIONS\&&LANGUAGES..log
DECLARE
    L_SQLERRM         VARCHAR2(2048) ;
    CURSOR CUR_ER
    IS
        -- NUMBER FROM ～ TO
        SELECT A.NUMBER_FROM - ROWNUM + 1 AS NUMBERS  -- DESCENDING
        FROM(
            SELECT -1     AS NUMBER_FROM  -- 初期値
                 , -65536 AS NUMBER_TO    -- 終了値
            FROM DUAL
            ) A
        CONNECT BY LEVEL <= A.NUMBER_FROM - A.NUMBER_TO + 1 ;
BEGIN
    FOR REC_ER IN CUR_ER LOOP
        L_SQLERRM := SQLERRM(REC_ER.NUMBERS) ;
        IF L_SQLERRM NOT LIKE '%not found;  product=RDBMS; facility=ORA%' AND
           RTRIM(SUBSTR(L_SQLERRM, 11)) IS NOT NULL THEN
            DBMS_OUTPUT.PUT_LINE(L_SQLERRM) ;
        END IF ;
    END LOOP ;
END ;
/
SPOOL OFF
SET LINESIZE 80
```

-- ALTER SESSION SET NLS_LANGUAGE = AMERICAN ; で実行した時

```SQL:anser
ORA-00001: unique constraint (.) violated
ORA-00017: session requested to set trace event
ORA-00018: maximum number of sessions exceeded
ORA-00019: maximum number of session licenses exceeded
ORA-00020: maximum number of processes () exceeded
ORA-00021: session attached to some other process; cannot switch session
ORA-00022: invalid session ID; access denied
ORA-00023: session references process private memory; cannot detach session
ORA-00024: logins from more than one process not allowed in single-process mode
ORA-00025: failed to allocate
-- 以下略
```

-- ALTER SESSION SET NLS_LANGUAGE = JAPANESE ; で実行した時

```SQL:anser
ORA-00001: 一意制約(.)に反しています
ORA-00017: セッションがトレース・イベントを設定するようリクエストしました。
ORA-00018: 最大セッション数を超えました
ORA-00019: 最大セッション・ライセンス数を超えました
ORA-00020: 最大プロセス数()を超えました
ORA-00021: 他のプロセスに連結されています。セッションは切替えできません
ORA-00022: 無効なセッションIDです。アクセスは拒否されました
ORA-00023: セッションがプロセス・プライベート・メモリーを参照します。セッションを連結解除できません
ORA-00024: シングル・プロセス・モードで複数ログインは使用できません。
ORA-00025: の割当てに失敗しました
-- 以下略
```

参考
[Oracle SQL 連番や連続した日付を取得](https://qiita.com/Papageno/items/00cf44596ce2e871cc91)
生物の人がコンピューターをいじってみて（余談）

まず始めにごめんなさい。

- 今卒業研究でやっているグラフデータベースのお話はしません。
- こっちの分野寄りのことを研究してきてみて思ったことを雑談形式で話そうかなとちょっと思いました。
- 要は同じ専攻の人にも分かるようなブログのようなものです。
- こんな使い方あんまりして欲しくないそうなので、Qiitaさんごめんなさい。。。

というわけでちょっと書いていきます！

---
### データベースの位置づけ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/190039/fd565feb-4060-4e0a-889a-fefdbc4d8c9c.png)

データベースというものは、ビックデータ（大量のデータ）を意味のあるものにまとめて使いやすくすることだと思っています。何でもかんでも。それが一つの箱の中に入ってて、それをうまくくっ付けて一つの作品にする、みたいな。
やっていてキツい事は、データの集合から何をまとめて一つにまとめれば意味を為すのか、ということです。これをほんとに良く感じるので、データベース業界に携わる皆さんを尊敬してしまいます、、
ちらっとそちらの業界の方とお話したことなのですが、データはぼんやりとした**「影」**で、それらをまとめ上げたものが初めて**「情報」**になる、という話を聞いて、目からウロコ状態でした。

なので、RDFなどのデータのリレーションに注目していく動きっていうのはものすごく面白いじゃないか！！と、、箱の中のものを紐でくっつけて引っ張ると、ぽぽぽぽーん！のような！それをWebの世界で実現させようということです。これって想像するとほんとにすごい事ですよね、、、

個人的にはデータベースの面白みが何となーく分かってきたのかな？？という感覚でいます（そうであって欲しい）。
<br/>

話を戻すと、、データベースって、コンピューターの世界の中の根幹をなしているものです。

現代の情報社会の中で、蓄積されていく情報データというものは

- ビジネス
- 勉強
- 研究 etc..

…いずれも人間社会の中で切り離せない要素ですよね。これらをより良いものにさせていくために、過去から蓄積されてきたデータというものはすごく大切になります。

分かりやすい例で言うと、、某大手回転寿司チェーン店:sushi:は来店した顧客のデータを毎日ものすごい量リアルタイムで集めて分析しているそうです。性別、年齢、その日の天気まで、、、そこからその時に売れそうなネタを分析して流していくみたいです！！データから分かることってものすごく多いということですね。

そのとき、自動化システム、IoT、など、裏ではいろいろなものを連携させて動かしているのだなと思うと、、これから勉強の日々なのだろうなぁ、としみじみ感じています。

要は、このようなデータをうまく管理して効率的に扱っていくのがデータベースなんですね（最初にも言ってますが…）。

### IT企業...って？

![job_it_dokata.png](https://qiita-image-store.s3.amazonaws.com/0/190039/e4a5b540-754a-04c0-0ae8-bd9a5c2cd22d.png)


ぶっちゃけた話、大学ではネズミの解剖、ニワトリの生まれる途中の姿での観察、大腸菌の観察、など、、ウェットなバイオの勉強を主にしてきた身なので、IT企業というイメージが中高生レベルだというのを感じています、、

というのも

> **IT企業 ＝ パソコンを扱う会社**

としか思えていませんでした。。:scream:

まず、興味はあったのですが、生物界隈の人が行くフィールドじゃないんだろうなという印象しか持っていませんでした。GUI操作しかしてきてなかったですから。黒い画面に割と拒絶反応を起こしていました（笑）

そして、ほんとに移り変わり（流行り廃り）が早い感じがしました。
10年前に主流だったものがもう古い、みたいなことが良くあるそうで、、、最近は機械学習、人工知能とか流行ってきていて勝手にSF感を感じています。昔はそんな言葉空想だと思っていたのに、、いろんなことが出来るんだなぁ、と本当に思います。

WebでIT企業を検索しても、色々なものが出てきて、自分自身は今のところエンジニアとしてやっていきたいなという思いがあるので、ソフトウェアを作るのか、システムを構築するのか、ITインフラを整えるのか、など、、**ITエンジニア**っていう言葉の中身はこんなにいろんなことがあるのか、、、と就活当時はポカーンとなってしまいました。

IT企業っていったい何なのかと思っている人にも分かりやすいサイトがあったので同じ境遇の方はでそちらをお読みください。笑

> **[IT業界研究 - インターネット・アカデミー](https://www.internetacademy.jp/it/management/it-basic/it-industry-map-and-four-occupations.html)**

このようにIT各業界の中にも区分けされた業種があるので、例えば同じ会社の中の営業、ディレクターと話が通じない、この大変さを分かっていない、など認識の齟齬が起こっているのもまた事実らしいですね、、、

とにかく！まず思ったことは自分がどのエリアに進みたいか、を考えてそのIT業界について掘り下げてみるといいんだろうなと感じました。

でも個人的には実際に今のようにデータベースというものを扱ってみて、「あーこういうことなんだ！！」ってなる瞬間が多いので、色々な業種、業界に行けるのであれば行ってみたいなぁと今思うようになってきました。

話が飛び飛びで申し訳ありません、、今回ばかりなのでご勘弁を！
お読みくださり有難うございました！
Dockerでdoc2vecを試すためのDockerfile

# 概要
pythonでのdoc2vecをDocker上で試してみるためのDockerfileです。（自分用メモ）
doc2vecのほかに下記パッケージをインストールします。

* Mecab
* mecab-ipadic-neologd

## Dockerfile

```Dockerfile
FROM python:3.6.4-slim-stretch

RUN apt-get update && \
    apt-get -y install sudo \
    git \
    gcc \
    g++ \
    make \
    curl \
    xz-utils \
    liblzma-dev \
    file \
    mecab-ipadic \
    mecab-ipadic-utf8

RUN mkdir -p /opt/downloads && \
    cd /opt/downloads && \
    git clone https://github.com/taku910/mecab.git && \
    git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git

RUN cd /opt/downloads/mecab/mecab && \
    ./configure  --enable-utf8-only && \
    make && \
    make check && \
    make install

RUN apt-get -y install 
RUN cd /opt/downloads/mecab-ipadic-neologd && \
    ./bin/install-mecab-ipadic-neologd -n -y

RUN pip install gensim mecab-python3
    
WORKDIR /usr/src/app/

ENTRYPOINT tail -f /dev/null
```

## pythonスクリプト
コンテナが作成出来たらコンテナ内に入り、下記のような感じのスクリプトを実行できるはずです。

```app.py
import MeCab
from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument

mecab = MeCab.Tagger('-Owakati -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')

#  …(略)…

```
Alibaba CloudのNAS

#概要
Alibaba CloudコンソールにNASが追加されていたので説明。
ドキュメントも追加されていますがまだ翻訳されていません。(英語のまま)
https://jp.alibabacloud.com/help/product/27516.htm?spm=a3c0i.mja.a1.6.49232f9fF8xsyt

##コンソール 
画面は`Storage & CDN`の欄に追加されています.
![AliCloud_Console_Home.png](https://qiita-image-store.s3.amazonaws.com/0/234379/8b71bf46-c4fb-d340-2599-12764a844c48.png)


`NAS`の画面ですが、こんな感じ。日本リージョンまだ未対応です。対応されることを期待しましょう.
![NAS_Console.png](https://qiita-image-store.s3.amazonaws.com/0/234379/488aea78-3895-057e-389f-53018f866df4.png)

購入画面です。思ったより安いです。でも日本リ...期待しましょう。
![スクリーンショット 0030-02-09 15.33.50.png](https://qiita-image-store.s3.amazonaws.com/0/234379/b37bd2bb-a335-20b8-3004-f43bc6a08857.png)

##特徴

###共有アクセス
- 複数のコンピューティングノードが同じファイルシステムに同時にアクセスできるため、同じデータソースに依存するアプリケーションを多数のAlibaba Cloud ECS、HPC、またはDockerインスタンスに展開できます。

###弾性スケーラビリティ
- Alibaba Cloud NASは、ファイルシステムあたり最大10PBの容量をサポートします。あなたは実際の使用料だけを支払う。

###安全な制御
- ファイルシステムの完全なデータセキュリティを確保するために、ネットワーク分離（VPC）とユーザー分離（従来のネットワーク）、ファイルシステムの標準アクセスとグループのアクセス許可の制御、RAMマスターアカウントとサブアカウントの承認などの複数のセキュリティメカニズムが実装されています。

###線形の拡張可能なパフォーマンス
- Alibaba Cloud NASは、アプリケーションのワークロードに高スループット、高IOPS、低レイテンシのストレージを提供します。パフォーマンスとキャパシティ要件は、ビジネス目標に合わせて調整できます。
RubyMineでRemote SDKを追加時にGemsが読み込めない現象の解決

OS X El Capitan (10.11.6)で動いているRubyMine 2017.3.2 (Build #RM-173.4301.17, built on January 11, 2018)でタイトルの現象が発生しました。※特にプラグインを追加していない状態です。

### 現象の詳細

Vagrant上のUbuntuにインストールしたRuby (rbenv)をRubyMineのRemote SDKとして登録したく、
https://qiita.com/zchee/items/77800caffadf6e3ddc3f を参考に設定をしてみましたが、次の通り、 "Nothing to show" となり、Gemsが読み込めませんでした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1102/03ef2240-90fa-c3ec-f676-94cbea8a4008.png)

Teratailでも（恐らく同じ状況で）困ってる方がいたのですが、現時点でコメントがなかったので調べてみました。

> RubyMineでvagrant上でインストールしたgemを読み込めない
> https://teratail.com/questions/106781

### YouTrackにあった

JetBrainsのYouTrackに同様と思われる問題が提起されていました。

Vagrant doesn't detect gems -- rsync fails
https://youtrack.jetbrains.com/issue/RUBY-19761

これによると `rsync` が怪しいらしく、ログ (Help -> Show log in Finder で見れる) を確認すると、ドンピシャでした。

```
INFO - y.remote.RubySshRemoteTransfer - Updating gems' local copy 
INFO - ns.plugins.remotesdk.RSyncUtil - rsync version: rsync  version 2.6.9  protocol version 29 
INFO - ns.plugins.remotesdk.RSyncUtil - rsync version: rsync  version 2.6.9  protocol version 29 
INFO - ns.plugins.remotesdk.RSyncUtil - RSync exited with code: 12 
.
.
.
INFO - y.remote.RubySshRemoteTransfer - Gems copied. 
```

終了コード `12` で失敗しています。

[コメント](https://youtrack.jetbrains.com/issue/RUBY-19761#comment=27-2700270)では具体的な解決策も掲載されていていて、指示の通り、Registry (⌘+Shift+A で`Registry`と検索すると開ける)から `ide.remote.interpreter.use.rsync` を無効にすれば解決しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/1102/f294900b-bdf5-143b-acd4-637c5864e27a.png)

ただRegistry値の変更はむやみにしてはいけないっぽいので、JetBrainsの今後の対応に期待です。
Windowsでnode-gpyのエラーが止まらない

# Windowsでnpm installすると、node-gpyのエラーが出る

Node.jsのパッケージマネージャー npm ですが、素の環境に、ネイティブライブラリをインストールしようとすると、エラーが出ます。

node-gpyを使うモジュールは、ネイティブライブラリのものです。そのため、コンパイルする必要があり、Visual Studioなどのコンパイル環境が必要です。それを知っていれば、エラーが出るのも当然と納得がいくでしょう。

とは言え、npmでは、親切に以下のコマンドを実行すると、コンパイル環境が自動インストールできるようになっています。

```
npm install --global windows-build-tools
```

なんとも便利！ 以下の環境が自動でインストールされます。

- python 2.7
- Visual Studio Build Tools

改めて、``npm install``すれば、正しくライブラリをコンパイルしてインストール出来ます。

## トラブルシューティング

ただし、Win10 64bitでは、上記の手順で良かったのですが、以下の環境で試したところ、うまく動きませんでした。

- Windows 7 (32bit)
- npm 5.6

特に、明確な理由はエラーメッセージに出力されません。いろいろ調べた結果、
Win7の.Net Frameworkが古すぎるため、正しく、Build Toolsがインストールされていませんでした。そこで、最新版の.Net Frameworkをインストールする必要があります。

また、Pythonのパスがうまく設定されない問題も起きていました。

```
npm config set python <パス>
```
Python2のパスですが、npmでwindows-build-toolsをインストールすると、以下のパスにインストールされていました。

``C:\Users\<ユーザー名>\.windows-build-tools\python27``

# WindowsでNode.jsを使う結論

ちなみに、Windows10(64bit)では上記のような問題は起きなかったです。今回、Windowsの32ビット版で動く環境を作りたかったので、Windows7(32bit)の環境を引っ張り出してきたのが、トラブルの元凶だったようです。

また、Node.jsをWindowsで活用するには、ビルドツールのインストールが必要など、障壁が高い印象。一部のモジュールは、Linux/macOSを念頭に作られているので、仮想環境でLinuxが使えるなら、それが近道かも。
Ubuntu Budgieでibus-mozcを使う

Ubuntu Budgieをインストールしたらプリインストールでfcitxとmozcが入っていたが、うまく機能しないので、fcitxを削除してibus-mozcで日本語入力をするようにした。

## fcitxのアンインストール
```
sudo apt autoremove fcitx fcitx-mozc fcitx-libs-qt5 fcitx-frontend-qt5
```
## iBusの設定
おそらくGUIで探してもiBusの設定は見つからないので

```
ibus-setup
```
でiBusの設定を呼び出す。
入力メソッドを「日本語-Mozc」のみにする。
Elasticsearch(5.4.2)の謎を解明するための実験結果。アクセスノード、受付ノードの振る舞いについて

# 効果
Elasticsearchの構築やスキーマーの設計はできるけど、本番ノードデザインについての情報がすくないので、参考になればいいと思います。

# 構成
マスターノード3台
クライアントノード2台
データノード3台
10Gくらいのドキュメントを登録済み

# 受付ノードって
queryを受けつけたノードの事。
受け付けたノードの仕事は重い。
Elasticsearchは受けつけたノードが「データノードから集約してクライアントに返却する役目」をもっているらしい。
実験してみたら、aggregation(集計)でメモリを大量に消費した。
そして、簡単に落ちる。

# 受付ノードのメモリは大量に積んでおこう
受付ノードはaggregation(集計)を実施するので大量に積んだほうがいい。
でもJAVAが３２G以上認識するとオーバーヘッドがかかるからやめましょうって記載があるのでJVMは３２Gまで。
あとaggregationはバケットをメモリ限界まで簡単に作れるから注意しないとダメっぽい。

# 受付ノードは分けるべき？？
社内集計用、集計サービス、それ以外と受付ノードは分けよう
理由はメモリ不足で落ちると全部持っていかれてしまうから。
社内の業務で集計したら、「全サービス止まりました」ってことになってしまう。

# クライアントノードを受け付けノードにすべき？
受付ノードにすべき。
データノードで受け付けるとメモリを食ってしまって落ちる可能性が上がる。
マスターノードで受け付けるとメモリを食ってしまって落ちる可能性が上がる。
クライアントノードって言うくらいなんだから受付させとこう。

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html
に書いてあるけど「ロードバランサとして機能します」って・・・
でも集計しちゃう＆メンテナンス性が上がるので、純粋なバランサはあった方がいいかも。 


#Elasticsearch(5.4.2)実験記事
[サービス無停止でデータノードを安全に削除してメンテする。](https://qiita.com/mokoenator/items/28bd41611274c5f4c771)
[ダウンタイムなしてデータノードを追加できる？](https://qiita.com/mokoenator/items/4d92edda8b7fac5d1668)
[アクセスノード、受付ノードの振る舞いについて](https://qiita.com/mokoenator/items/9ccadbfcb6ce42ab24e4)
[辞書ファイル、スクリプトファイルの配置ノードは？](https://qiita.com/mokoenator/items/2b080ec5417a0564baf7)
[２データノードをダウン(障害だ)させて復活させる](https://qiita.com/mokoenator/items/8b1c8f7160981e9a6938)
[１データノード・1シャードで作ると早かった](https://qiita.com/mokoenator/items/38602224a50625894683)
PostgreSQL インデックス(btree)の謎の制限

久しぶりの投稿。最後は解決出来ていないのでモヤモヤした記事です。

PostgreSQL(8.4) で遭遇したエラーについて。

`ERROR: index row size 3376 exceeds maximum 2712 for index "xxx"`

というエラーが発生しました。

どうやらPostgreSQLではデフォルトのB-treeインデックスでは項目の長さに制限があるようです。
バージョンによってその数値は違うようですが、ソースにハードコードされているらしく、制限を回避する方法は無さそうです。
（そもそもそんな長い文字列にインデックス貼るなよ！っていうのは別のお話として・・・・）

で、このエラー、テストした当初は発覚しませんでした。
テストでは「１２３４５６７８９０１２３４５６７８９０・・・・・」というような繰り返しパターンで1万文字の文字列を生成し挿入していましたが、このパターンだとエラーにはなりません。ところが、通常の自由文だと2712バイトを超えるとエラーになります。B-treeだと並べ替えされ、範囲検索にも使えるくらいなので、文字列を加工せずに比較して並べ替えたインデックスを貼るものと思っていましたが、文字列のパターンによって、エラーになったりならなかったりする原因が全く分かりません。

そもそもインデックスを貼るカラムの長さに制限があることすら、マニュアルに記述されておらず（少なくとも見つけられず）、さらに文字列のパターンによって、違いがあるなんて予想もしませんでした。
（そもそもそんな長い文字列に、、、以下略）

だれかエライ人、教えてください。。。。。
MVCの簡略な概要

#MVCとは
処理をモデル、ビュー、コントローラーに分ける設計モデルのこと。
分けることによって処理が整理されるので初見のプログラムでもわかりやすく、またモデルを担当する人（データベースエンジニアなど）、ビューを担当する人（Webデザイナーなど）、コントローラーを担当する人（プログラマーなど）に割り振ることができる。互いに仕様変更の影響を受けにくくなるメリットがある。

##モデル（Model）とは
処理の中心部分を担う。
ビジネスロジックの記述、SQLコマンドの送信、必要なレコードの取得と管理を行う。
ビジネスロジックとはデータベース上のデータに対する処理手順のこと。
データベースとの対話に用いる言語をデータベース言語といい、SQL(Structured English Query Language)はその一つ。
SQLコマンドはデータベースにクエリ（問い合わせ）を行う。
またデータベースのテーブル上にあるレコードの取得と管理とも言える。
いずれにせよデータベースを扱う。

##ビュー（View）とは
UIへの出力を扱う。表示されるデザインなのでユーザーが直接目にする部分。
モデルのデータを元にユーザーが見るのに適した形で出力する。

##コントローラー（Controller）とは
UIからの入力をモデルに伝えたり、モデルのデータの出力が必要な場合にはビューに渡すなどプログラムを制御する。モデルとビューの橋渡しをする役目を担う。

モデル、ビュー、コントローラーは協力しながら処理を行う。
またUIにおける入力と出力は厳密には切り分けられないので、ビューとコントローラーは必ずしも分離できるとは限らない。
Elasticsearch(5.4.2)の謎を解明するための実験結果。ダウンタイムなしてデータノードを追加できる？

# 目的
性能がたりなくて今すぐデータノードを追加したい！って思った時に問題なく追加できるか試してみました

# 構成
マスターノード3台
クライアントノード2台
データノード3台
10Gくらいのドキュメントを登録済み

# データノードの設定
・ymlのip列挙するところにマスターノードが書かれていればOK
・ほかのノードは記述しなくてもよい。
・適当にIP書いても問題ない。間違ったり、嘘が書いてあっても、正しいマスターノードが書いてあれば良いみたい。
・再配置が失敗するから辞書やスクリプトは全ノードに展開しておく

# 追加
追加は、ノードのサービスを開始するだけ。
シャードの再配置が始まって適当に終わる
ヘルスチェックはグリーンのままなのでドキュメント登録もできる
何も問題ない。
Amazon未出荷レポート→クリックポストCSV変換

# 動機
クリックポストのCSVを作るのが手作業で、くっそメンドクサイ。
手を抜きたい。

# 概要
Amazon未出荷レポートを、スクリプトにドラッグ＆ドロップすれば、クリックポストCSVの形式に自動変換してくれるスクリプト。

未改良点：自分用のため、敬称「様」、内容品「書籍」が固定。

Python3.6.1

#スクリプト convert_addr.py
```python3
# coding: UTF-8

import sys
import csv

from time import sleep

if len(sys.argv) != 2:
    print('usage: drop input_file to convert_addr.py')
    sleep(3.0)
    sys.exit()

input_file = sys.argv[1]

data = []

with open(input_file) as f:
    reader = csv.reader(f)
    for row in reader:
        data.append(row[0].split('\t'))

post_list = []
name_list = []
adr1_list = []
adr2_list = []
adr3_list = []
adr4_list = []

### SETTING ###
NAME_COL = 16
POST_COL = 22
ADR1_COL = 21
ADR2_COL = 17
ADR3_COL = 18
ADR4_COL = 19
###############

for x in data:
    name_list.append(x[NAME_COL])
    post_list.append(x[POST_COL])
    adr1_list.append(x[ADR1_COL])
    adr2_list.append(x[ADR2_COL])
    adr3_list.append(x[ADR3_COL])
    adr4_list.append(x[ADR4_COL])

post_list[0] = 'お届け先郵便番号'
name_list[0] = 'お届け先氏名'
dear = 'お届け先敬称'
adr1_list[0] = 'お届け先住所1行目'
adr2_list[0] = 'お届け先住所2行目'
adr3_list[0] = 'お届け先住所3行目'
adr4_list[0] = 'お届け先住所4行目'
cont = '内容品'

with open('out.csv', 'w', newline='') as f:
    write = csv.writer(f)

    write.writerow([post_list[0], name_list[0], dear, adr1_list[0], adr2_list[0], adr3_list[0], adr4_list[0], cont])
    
    i = 1
    while i < len(name_list):
        write.writerow([post_list[i], name_list[i], '様', adr1_list[i], adr2_list[i], adr3_list[i], adr4_list[i], '書籍'])
        i += 1
チェックリスト

- [ ] PC
    - [ ] Mac
        - [ ] safari
           - [ ] inread
           - [ ] sva
           - [ ] billboard
        - [ ] chrome
           - [ ] inread
           - [ ] sva
           - [ ] billboard
        - [ ] firefox
           - [ ] inread
           - [ ] sva
           - [ ] billboard
  - [ ] Windows
      - [ ] IE
          - [ ] inread
          - [ ] sva
          - [ ] billboard
      - [ ] chrome
          - [ ] inread
          - [ ] sva
          - [ ] billboard
      - [ ] firefox
          - [ ] inread
          - [ ] sva
          - [ ] billboard
electronでbacklogの通知をデスクトップに出すアプリ

https://github.com/rh-taro/backlog_notify

1年ぐらい前にbacklogの通知を出すアプリを作って仕事中も一人でちまちま使ってました
タスクトレーにはいるけどDockにはいない、ウィンドウも消せる、それっぽい感じですね

当時いろんなサイトを見て回ったんですがどこを見たのかメモってないので思い出し次第参考URL書いていきます
せっかく公開するのでまたちょっとずつソース直したり
ここにも記述増やしたりしていこうと思います

# 使い方(macのみ)
実行手順は
1 electronとelectron-packagerをnpmでインストール

```sh
$ npm install -g electron
$ npm install -g electron-packager
```

2 実行

```sh
$ electron backlog_notify
```

3 パッケージング(実行ファイル作成)

```sh
$ electron-packager ./backlog_notify_ver backlog_notify --platform=darwin --arch=x64 --electron-version=1.8.2
```

4 あとは出力された実行ファイルを実行するだけ

macでのみ動作確認してます
ソース内のOSに関する記述を一部修正したり
--platform=darwinを変えるとwindowsでも動くはずです
手元にwindowsがないので未確認ですが

# ポイント(苦労したこととか
特別難しいことはしてないはずなのですが当時結構苦労した気がします

### **jqueryが動かなかった**
普通にhtmlみたいにjqueryのファイルを読み込んでも$がエラーになるので
nodeのモジュールを使う

参考URL
https://qiita.com/Chayata/items/be0f7f8d371039ab9fdd
wordpressプラグイン開発でwordpressの関数が効かない時

そのwordpress関数はプラガブル関数かもしれません
#プラガブル関数の特徴
・wordpress標準関数なのだけれども書き換えができるというもの。
・プラガブル関数はプラグインが読み込まれた後に読み込まれる関数
・今後は増えることはない予定とのこと

#参考資料
[wiki](http://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%AC%E3%83%96%E3%83%AB%E9%96%A2%E6%95%B0)
[こちらのページも参考になりました](https://core.trac.wordpress.org/ticket/23861)

以下の場所に定義されています。
wp-includes\pluggable.php

##関数名一覧（非推奨関数含まれるので注意です。）
auth_redirect
cache_users/en
check_admin_referer
check_ajax_referer/en
get_avatar
get_currentuserinfo (非推奨)
get_user_by_email/en (非推奨)
get_user_by
get_userdatabylogin (非推奨)
get_userdata
is_user_logged_in
wp_authenticate/en
wp_check_password/en
wp_clear_auth_cookie/en
wp_create_nonce/en
wp_generate_auth_cookie/en
wp_generate_password/en
wp_get_current_user/en
wp_hash_password/en
wp_hash/en
wp_logout
wp_mail
wp_new_user_notification
wp_nonce_tick/en
wp_notify_moderator
wp_notify_postauthor
wp_parse_auth_cookie/en
wp_password_change_notification/en
wp_rand/en
wp_redirect
wp_safe_redirect
wp_salt/en
wp_sanitize_redirect/en
wp_set_auth_cookie/en
wp_set_current_user
wp_set_password/en
wp_text_diff/en
wp_validate_auth_cookie/en
wp_validate_redirect/en
wp_verify_nonce

#wp_get_current_userの場合
今回wp_get_current_userを使用していて効かなかったので
体験談をメモしたいと思います。

##ソースコード

```プラグイン.php
function my_special_function () {
    $my_original_current_user = wp_get_current_user();
    echo <<<TEST
    <p style="font-size: 350px; color: red;">$my_original_current_user->user_login</p>
    TEST;
}

my_special_function ();
```

##エラーメッセージ
Fatal error: Call to undefined function 

これは当然といえば当然ですね。
プラガブル関数はプラグインが読み込まれた後に読み込まれますので。

##解決策

```修正.php
add_action('plugins_loaded','my_special_function');
function my_special_function () {
     $my_original_current_user = wp_get_current_user();
     echo <<<TEST
     <p style="font-size: 350px; color: red;">$my_original_current_user->user_login</p>
     TEST;
}
```

plugins_loadedというアクションフックは有効なプラグインとプラガブルな関数が読み込まれた後に
実行されるとのことでもう一度このタイミングで実行することでプラガブル関数を実行できるようですね。

#覚書
プラガブル関数は上書きできるという体の物だが
基本的には上書きする前にクラスでの継承ができないか
フックが使えないかなどを検討したほうがよさそう。

##関数全般について
これはwordpressプラガブル関数に限らずだと思いますが
グローバルに関数を定義する際はif ( !function_exists() )で囲むなり
カプセル化するなり、名前空間をつかうなりして関数名のバッティングを避けるようにするとよい。
※グローバルにはなるべく変数も関数も定義しないほうがよさそう