OmniAICreator/Qiita-1.07M huggingface dataset:
csh > WRFのWPS処理で使うlink_grib.cshの中身確認 > ファイルの選択処理

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
GNOME Terminal v2.31.3
tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec
```

WRF(Weather Research and Forecasting Model)関連。

WPS処理時のlink_grib.cshファイルのSymbolic link対象ファイルの処理を確認中。

やりたいこと
   
- 二か月分のNCEPデータのSymbolicリンクを作る
   - 例: 2016年12月 2017年1月 (年またぎ)

### code

link_grib.cshのファイル選択部分だけを抽出してみた。

```csh:mycsh_exec
#!/bin/csh 

set i1 = 1
set i2 = 1
set i3 = 1

if ( ( ${#argv} == 1 ) || ( ( ${#argv} == 2 ) && ( ${2} == "." ) ) ) then
    echo "case 1"
	foreach f ( ${1}* )
		echo ${f}
	end
else if ( ${#argv} > 1 ) then
    echo "case 2"
	foreach f ( S* )
		echo ${f}
	end
endif
```

cshスクリプトをまともに使ったのは22年前?(その後、ksh, bashと移行してきた)。

### 実行結果 > 1つの引数

```
$ csh mycsh_exec ~/NCEP_DATA/WORK/fnl_20161201 | head -n 10
case 1
/home/XXX/NCEP_DATA/WORK/fnl_20161201_00_00.grib2
/home/XXX/NCEP_DATA/WORK/fnl_20161201_06_00.grib2
/home/XXX/NCEP_DATA/WORK/fnl_20161201_12_00.grib2
/home/XXX/NCEP_DATA/WORK/fnl_20161201_18_00.grib2
```

### 実行結果 > 2つの引数

```
$ csh mycsh_exec ~/NCEP_DATA/WORK/fnl_20161201 ~/NCEP_DATA/WORK/fnl_20161202 | head -n 10
case 2
SST:2016-11-14_00
SST:2016-11-14_06
SST:2016-11-14_12
SST:2016-11-14_18
SST:2016-11-15_00
SST:2016-11-15_06
...
```

case 2の場合は、関係ないファイル(SST:...)までリンクしてしまう。
さらに、リンクするのはNCEP_DATA/WORK以下ではなく、「現在のディレクトリ」にあるファイル。

case 2の使いどころは不明。
JsonをHTMLのテーブルに変換するJSライブラリを作りました。

**※成果物はこちらで確認できます：[c-cho/JsonToHtmlTable: Make json more readable as html table](https://github.com/c-cho/JsonToHtmlTable)**  

#製作動機
仕事の中でjson文字列をHTMLのテーブルとして可視化する機能がしばしば必要になります。ネット上で使えそうなライブラリを検索してみましたら、jqueryが必須だったり、ネストしているjsonがうまく表示できなかったりして、意外と見つかりませんでした。なので、土曜日の空き時間を使って、jsonをhtmlテーブルにしてくれるライブラリをできるだけ単純なコードで作ってみました。

#使い方
htmlの中でscriptとして`jsonToHtmlTable.min.js`をインポートしても良いし、CommonJSでモジュールとしてインポートしても良いです。

#API
APIはただ一つ、`JsonToHtmlTable(table, json, callback)`です。  

- `table`: tableタグDOM要素、作成されたテーブルはこいつの中に嵌ります。
- `json`: 処理したいJson要素。Json形式のstringでもいいし、jsの配列かオブジェクトでも良いです。
- `callback`: 処理後呼び出すコールバック関数です。

例：

```html
<script src="dist/jsonToHtmlTable.min.js"></script>
<table id="test-table"></table>
<div id="test-callback"></div>
<script>
  var json = ["A", "B"];
  var callbackFunc = function() { document.getElementById('test-callback').innerHTML = 'Generated by a callback function'};
  JsonToHtmlTable(document.getElementById('test-table'), json, callbackFunc);
</script>
```

#動作環境
ChromeとFirefoxでテスト済み
Babelを使ってトランスコンパイルをしてあるので、IEとかも大丈夫なはず・・・

#ソースコード
```js
(function(){
  let template = (strs) => {
    return function(...vals) {
      return strs.map((s, i) => `${s}${vals[i] || ''}`).join('');
    };
  };

  let build = v => {
    if(v === null) return '';
    if(Array.isArray(v)) return buildArray(v);
    if(typeof v === 'object') return buildObject(v);
    return buildElement(v);
  };
  let buildElement = el => '<td>' + el + '</td>';
  let buildObject = obj => {
    let templ = template`<tr>${0}${1}</tr>`;
    return Object.keys(obj).map(key => templ(build(key), build(obj[key]))).join('');
  };
  let buildArray = arr => {
    let templ = template`<table>${0}</table>`;
    return '<td>' + arr.map(el => templ(build(el))).join('') + '</td>';
  };

  let JsonToHtmlTable = (dom, json, callback) => {
    if(dom.nodeName !== 'TABLE') throw new Error('Whoops! The DOM seems not to be a table.');
    dom.innerHTML = (typeof json === 'string') ? build(JSON.parse(json)) : build(json);
    if(typeof callback === 'function') callback();
  };
  
  module.exports = JsonToHtmlTable;
})();
```
Kotlin 1.1 BetaでShorter syntax for propertiesを用いるときの注意点

Kotlin 1.1にて導入される構文の１つである [Shorter syntax for properties](https://kotlinlang.org/docs/reference/whatsnew11.html#shorter-syntax-for-properties) を用いた以下のようなコードは，1.1.0-beta-22の段階では構文チェックは通るもののコンパイル時に落ちます．

```kotlin

open class A(val s: String)

class B(s: String): A(s) {
    val rep // ここが問題
    	get() = s.replace("a", "b")
}

fun main(args: Array<String>) {
    println(B("abrakadabra").rep)
}
```

```
Error:Kotlin: [Internal Error] org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Don't know how to generate outer expression for lazy class B
︙
```

問題の箇所は

```kotlin
val rep: String
    get() { return s.replace("a", "b") }
```

と等価になるはずなので`s`は`this.s`のつもりで使用していますが，コンストラクタに渡された`s`と判別がつかないためにエラーを吐くようです．

対処法としては，

1. `rep`の型を明記する
2. コンストラクタの引数名を変更する
3. `this.s`に書き換える

が考えられます．
本質的には`rep`の型を推定するプロセスの問題なので，通常は型を明記すれば良いでしょう．
（多少はコンパイル速度も向上するのではないかと思いますし）

修正後のBクラスのコードは次のようになります．

```kotlin
class B(s: String): A(s) {
    val rep: String // 変更点
    	get() = s.replace("a", "b")
}
```

~2017/2/3追記~
バグ報告は既にされているので，そのうち修正されると思います．
https://youtrack.jetbrains.com/issue/KT-15844
メールでアカウント認証をするときの一般的な流れ

# はじめに
この記事ではメールでアカウント認証をするときの一例を説明します。具体的には、ユーザーがサインアップするとメールが送られてきて、そのメールにURLが書いてあり、そのURLをクリックするとアカウント認証完了とします。以下が大きな流れです。
![overview.png](https://qiita-image-store.s3.amazonaws.com/0/119783/464a5e44-a8bc-7908-fbaa-1701414b87ed.png)

# 1.トークンを生成し保存
サインアップする時にトークンを生成する。トークンとはランダムでとても長い文字列の事である。以下の図ではトークンをsampletokenとした。
その際にトークンをデータベースに登録し（この時トークンをハッシュ化して登録した方がセキュリティ的に良い）、そのトークンを末尾にくっ付けたURL(```https:/www.account.co.jp/sampletoken```)を生成する。その後、URLを記したメールを、ユーザーがサインアップで記入したメールアドレスに送信する。
![step1.png](https://qiita-image-store.s3.amazonaws.com/0/119783/36c3895f-145e-8790-30df-182389d4aa9b.png)

# 2.ユーザーがクリックしてトークンを送信
ユーザーがそのURLをクリックすると、ブラウザがURLの語尾を切り取って、その語尾をサーバーに送信する(ようにプログラムする)。
![step2.png](https://qiita-image-store.s3.amazonaws.com/0/119783/f7dc6780-6e58-40b6-02f0-b71a0e7037ec.png)

# 3.データベースと照会
送られてきた語尾を、データベースに保存したトークンと比較して、同じであればtrue、違うならばfalseを返す。
![step3.png](https://qiita-image-store.s3.amazonaws.com/0/119783/c584e54d-5272-e097-00ab-a356963ee7a8.png)

# 4.認証完了
trueが返ってくればアカウント認証完了とし、次の画面（例えばユーザーの設定画面とか、サインインした状態のトップページとか）に遷移する。

# とは言っても
Gemのdeviceとか使えばすぐできるんだろうけど、、、
Gist に置いた markdown を reveal.js でプレゼン資料っぽく表示するやつ

発表用の資料を準備しようとしてて、もうパワポで作るの嫌だと思ったので、作ってみた。  
(すでに似たようなのたくさんありそうだけど、少し調べて使いたいと思ったものがなかったので。)

## 使い方

* `https://decks.prgrphs.tokyo/${ユーザー名}/${Gist ID}/${ファイル名}`
* 例: https://decks.prgrphs.tokyo/tily/a5e8bc2e2ecf09586c1c36b384cd2812/deck.md

## ソース

* https://github.com/tily/decks (だいぶ手抜き気味)

## TODO

* https://decks.prgrphs.tokyo/ にアクセスしたときにちゃんと説明とか表示する
* キャッシュが効いてしまい Gist 側を更新しても一定時間反映されないのを直す

## 参考資料

* [reveal\.js/index\.html at master · hakimel/reveal\.js](https://github.com/hakimel/reveal.js/blob/master/index.html)
* [reveal\.js free CDN links by jsDelivr \- A super\-fast CDN for developers and webmasters](http://www.jsdelivr.com/projects/reveal.js)
BackWPUpでバックアップしたファイルをWP-CLIで復元する


BackWPUpはs3バケットに定期的にバックアップとかできて素晴らしいですね。
バックアップに関してはバズ部を参考にどうぞ。

http://bazubu.com/how-to-use-backwpup-23804.html

WP-CLI自体のセットアップや、新規作成についてはこちらをどうぞ。

http://be-into.com/blog/web/create-local-wp-dev-env/


上記記事を参考にセットアップ、バックアップしたのち

# まずはバックアップしたzipをダウンロード

展開してcd

# wp-configの内容を環境に合わせて変更する

ローカルだったらuserをrootにするとか

# DBを作成

```
$ wp db create
```

# DBをimportする

```
$ wp db import hoge.sql
```


※その時エラーとして

```
ERROR 2006 (HY000) at line ***: MySQL server has gone away
```

と出たら

http://qiita.com/RyutaKojima/items/3772d695db5e2342ab47

こちらの記事を試します。

sqlファイルが大きい場合は

max_allowed_packet

が怪しいです。私の場合もそうでした。

```
mysql --help | grep my.cnf
```

をして出てきた

```
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
```

の一覧に実在するファイルがないかチェックします。

なければ作成し、

```
[mysqld]
max_allowed_packet=16MB
```

と、記載すると許容するpacketサイズが標準よりも大きくなりますので、

mysqlをリスタートして、、

```
mysql.server restart
```

してもっかいインポートを試します。成功したら

```
wp server
```

で動作を確認しましょう。

めでたしめでたし。
データーベース設計の注意点

データーベース設計ではプログラミングを始める前に必ず設定しなければならないもので、第３者から見てもわかりやすく設計しなければならないものである。初見のものは何を書けばいいかわからないと思うのでここで書きたいと思う。

データベースを構成する要素は下記の通りになります。

1.サービスで扱う概念（エンティティ）
2.エンティティの属性
3.エンティティ同士の関係性（リレーション）

具体的にはなにを書けばわかからないので具体的に言えば、ER図に沿って**エンティティの概念、属性（カラムについて）**、**エンティティのアソシエーション**、**エンティティの制約**について書けば良いです。

まず、どのようなエンティティが存在し、カラムを指定するのか決めます

# example
## user
name
telephone_number
e-mail


次に制約をマークダウン方式で記入していきます。

# example

## user

|column|type|key|
|:--|--:|:--:|
|name|string|null: false, add_index|
|telephone_number|integer |null: false, unique: true|
|e-mail|string|null: false|

次にアソシエーションをマークダウン方式で記入していきます

# example

## user
 has_many :group
 has_many :chat-group
 has_many :tweets

このように考えるの今自分の中でのベターな方法だと考えられます。
FactoryGirlで連番を使う

FactoryGirlであるカラムに同一ではない適当な値を入れる際にしたこと。
※連番を使うので完全にランダムではない。


今回はCustomerが持つmail_addressを例に進めます。
「sequence」を使用するだけなのでとっても簡単。

## 連番
```ruby:
factory :customer do
   sequence(:mail_address){|n| "hoge_#{n}@fuga.com"}
end
```

```ruby:結果
hoge_1@fuga.com,hoge_2@fuga.com,hoge_3@fuga.com・・・
```


## 初期値付き連番

```ruby:
factory :customer do
   sequence(:mail_address,20){|n| "hoge_#{n}@fuga.com"}
end
```

```ruby:結果
hoge_20@fuga.com,hoge_21@fuga.com,hoge_22@fuga.com・・・
```

## 数値以外

```ruby:
factory :customer do
   sequence(:mail_address, 'a'){|n| "hoge_#{n}@fuga.com"}
end
```

```ruby:結果
hoge_a@fuga.com,hoge_b@fuga.com,hoge_c@fuga.com・・・
```


## アドレスに日本語はありえませんが日本語もできます
```ruby:
factory :customer do
   sequence(:mail_address, 'あ'){|n| "hoge_#{n}@fuga.com"}
end
```

```ruby:結果
hoge_あ@fuga.com,hoge_ぃ@fuga.com,hoge_い@fuga.com・・・
```
vuforiaでオートフォーカスを効かせる

# 手順
大体の手順は以下のスレッドの通り。
https://developer.vuforia.com/forum/unity-extension-technical-discussion/camera-focus-mode-android-unity

* ARCameraゲームオブジェクトに上記のCameraFocusController.csをアタッチ。

# それでも実行されない
* Assets>Plugins>Android>AndroidManifest.xmlに 、android.hardware.camera.autofocusを追加。


``` 
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus"/>
```

# それでも実行されない
## 問題発生状況
* Vuforia 6.2
* Unity 5.4.4f1 64bit (windows10)
* Sumsung GalaxyS7

以上でVuforiaアプリを起動すると、カメラのオートフォーカスが実行されない。
調べるにGalaxySシリーズで発生している様子。
https://developer.vuforia.com/forum/android/focus-problems-android

## 対応
上記のCameraFocusController.csに、タップ時にフォーカスを手動実行させる記述を追加。

```
using UnityEngine;
using System.Collections;
using Vuforia;

public class CameraFocusController : MonoBehaviour {

    private bool mVuforiaStarted = false;

    void Start () 
    {
        VuforiaARController vuforia = VuforiaARController.Instance;

        if (vuforia != null)
            vuforia.RegisterVuforiaStartedCallback(StartAfterVuforia);
    }

    private void StartAfterVuforia()
    {
        mVuforiaStarted = true;
        SetAutofocus();
    }

    void OnApplicationPause(bool pause)
    {
        if (!pause)
        {
            // App resumed
            if (mVuforiaStarted)
            {
                SetAutofocus();
            }
        }
    }

    private void SetAutofocus()
    {
        if (CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO))
        {
            Debug.Log("Autofocus set");
        }
        else
        {
            Debug.Log("this device doesn't support auto focus");
        }
    }

    void Update()
    {
        foreach (Touch touch in Input.touches)
        {
            if (touch.phase == TouchPhase.Began)
            {
                CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO);
                Debug.Log("focus");
            }
        }
    }
}
```
Arduino MEGA ADK R3とAndroidをUSB接続する[Accessory mode]

# 用意するもの

- Android端末
- Arduino MEGA ADK R3
- USBケーブル Aコネクタ-Bコネクタ (MacとArduino接続用)
- USBケーブル Aコネクタ-*コネクタ (ArduinoとAndroid端末接続用)

# FTDIドライバのインストール

ここからFTDIドライバをダウンロードしてインストール

http://www.ftdichip.com/Drivers/VCP.htm

# Arduino IDEをインストール

ここからArduino IDEをダウンロードしてインストール

https://www.arduino.cc/en/Main/Software

# ADK packageをダウンロード

ここからADK packageをダウンロード

https://dl-ssl.google.com/android/adk/adk_release_20120606.zip

ADKについて詳しいことはこちらを参照のこと

https://developer.android.com/adk/adk.html

# AndroidAccessory, USB_Host_ShieldをArduino libraryに追加

1. ADK packageを解凍
2. `arduino_libs`配下にある`AndroidAccessory`, `USB_Host_Shield`を`~/Document/Arduino/libraries`にコピー
3. Arduino IDEを起動している場合は再起動する

# Arduinoにコードを書き込む

ArduinoIDEを起動して以下のようにコードを変更


```cpp
#include <Max3421e.h>
#include <Usb.h>
#include <AndroidAccessory.h>

AndroidAccessory acc("Google, Inc.",
                     "DemoKit",
                     "DemoKit Arduino Board",
                     "1.0",
                     "http://www.android.com",
                     "0000000012345678");

void setup()
{
  Serial.begin(115200);
  Serial.print("\r\nStart");
  acc.powerOn();
}

void loop()
{
  if (acc.isConnected()) {
        //communicate with Android application
  }
  else{
        //set the accessory to its default state
  }
  delay(10);
}

```

`ツール > ボード > Arduino MEGA ADK`を選択

MacとArduinoをUSBケーブルで接続後、`ツール > シリアルポート > /dev/hogehoge`で書き込み対象のArduinoを選択。

`検証`を行いコンパイルが通ったら`マイコンボードに書き込む`


# ArduinoとAndroidを接続

コードを書き込んだArduinoとAndroid端末をUSBケーブルで接続するとDialogが表示される

(今回の例ではタイトルに'DemoKit Arduino Board', 本文中に`http://www.android.com`が含まれたDialogが表示される。)

# 参考

Arduino ADKをはじめてみる – kwLog
http://blog.makotokw.com/2012/12/17/arduino-adk%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%BF%E3%82%8B/
UVマップとは

3次元のメッシュを、2次元に展開するための情報のことです。

UVの「U」はテクスチャの横座標、「V」は縦座標を表します。
UVはXYと同じ意味です。
XYではなくUVなのは、3次元の座標を表すXYZと区別するためです。

「WXYZ」が3次元の座標を表すために使用されているため、
アルファベットの並び順……UVWXYZで、WXYZの2文字前の「U」「V」を使用しています。
PlayCanvasでPhotonを使う

#何
PlayCanvasでPhotonを使うためのプラグインを作りました。
https://github.com/utautattaro/Photon-for-PlayCanvas

御託はいいからとりあえずどんなもんができるのか見てみたい人
→https://playcanvas.utautattaro.com/quadiframe.html?tile_x=2&tile_y=2&url=https://playcanvas.utautattaro.com/photon/
(※PlayCanvas x Photonの簡易サンプルが4窓で開きます。PC専用)

スマホは1画面でどうぞ
→https://playcanvas.utautattaro.com/photon/

#しくみ
Photon の JavaScript SDKを簡単に使えるラッパーのようなものです。
そのまま使ってもいいのですが、サンプルにはリアルタイムサンプルが少なく、PlayCanvas向けに使うにはいくつか工夫も必要だったので、そこの間を取り持つラッパーとして作りました。
公式サンプルのdemo-loadbalancingを参考にしています。

#やり方
app.jsからphotonの諸設定を行います。
適当なエンティティにアタッチするとインスペクターにパラメータが表示されるので、それを埋めるだけで簡単に使えます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148084/346ec80e-df4b-1616-e791-2746fe0ee3c3.png)

AppIDは外部に漏れるとよくないので、[ここ](https://qiita.com/ryotaro_/items/07129ed7aa5348457055)の仕組みがあらかじめ入っています。
一度実行するとlocalStorageが記録するので、インスペクターからは外しておくことをお勧めします。

Photonのイベントは、app.jsをアタッチしたエンティティのphotonオブジェクトから拾いに行きます。

```javascript:sample.js
sample.prototype.initialize = function(){
  this.photonObject = this.app.root.findByName(app.jsをアタッチしたエンティティ);
}
sample.prototype.update = function(dt){
  this.photonObject.photon // photonの実態
}
  
```

詳しくは以下ドキュメントからどうぞ
https://utautattaro.github.io/Photon-for-PlayCanvas/ja/

#その他あると助かるやつ

人数指定のルーム作成

```javascript
photon.createRoom(name.value.length > 0 ? name.value : undefined,{maxPlayers:5});
```
ランダムマッチ
(入れるルームを検索、なかったら新規作成)

```javascript:app.js
App.prototype.autojoinroom = function(){
    var isFullhouse = true;//満室かどうか
    for(var l = 0;l < this.entity.photon.availableRooms().length;l++){
        var room = this.entity.photon.availableRooms()[l];
        if(room.maxPlayers > room.playerCount){
            isFullhouse = false;
            console.log(room);
        }
    }
    var canJoin = this.entity.photon.isInLobby() && !this.entity.photon.isJoinedToRoom() && this.entity.photon.availableRooms().length > 0 && !isFullhouse;//入れるかどうか
    if (this.entity.photon.isInLobby()) {
        if (canJoin) {//もし入れるなら
            this.entity.photon.output("Random Game...");
            this.entity.photon.joinRandomRoom();//適当なルームにジョイン
        }else{//入れないなら
            var name = document.getElementById("newgamename");
            this.entity.photon.output("New Game");
            this.entity.photon.createRoom(name.value.length > 0 ? name.value : undefined,{maxPlayers:5});//最大5名の部屋を作成し入室
        }
    }
};
```
PlayCanvasで「Roll a Ball」をつくる①

PlayCanvasはWeb上で動作するWebGLゲームエンジンです。
[前回の記事](http://qiita.com/p-baleine@github/items/5f9204c654badeccbe66)より、エディタやスクリプトのアップデートがあったので、改めてなぞりながら解説していきます。

#アカウントの作成

[PlayCanvas](https://playcanvas.com/)にアクセスして、右上の「SIGN UP」から無料でアカウントを作成することができます。
![image](https://qiita-image-store.s3.amazonaws.com/0/148084/d0d957c2-0f1c-924c-d647-271f044181de.png)

無料アカウントでは、パブリックプロジェクト無制限、ストレージ200MBがあるので、簡単に触ってみる分には十分と思います。

アカウントを作成すると、最初に「My First Project」のエディタに飛びます。
ここで一度PlayCanvasエディタを見てみましょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/148084/73e00d83-d63b-cf59-23b8-d1bdad3176f3.png)
「LET'S GO」を選択

#PlayCanvasエディター　
###SCENE View
![image](https://qiita-image-store.s3.amazonaws.com/0/148084/1e77185c-559e-ab05-9f5a-5c21ccc9b83c.png)
エディタ中央がシーンビューです。マウス操作でシーン全体を閲覧、編集することができます。
それぞれ右クリック、ホイールクリック、左クリックしながらドラッグすることで、シーンを見渡すことができます。

### HIERARCHY View
![image](https://qiita-image-store.s3.amazonaws.com/0/148084/bdc4efd9-2399-b293-6d5a-13fd6766b567.png)
左側にあるのがヒエラルキービューです。シーンに存在するオブジェクトが階層構造で記述してあります。

### ASSETS View
![image](https://qiita-image-store.s3.amazonaws.com/0/148084/89c74f29-a91d-117f-b2e6-df9b6e8f747a.png)
下にあるのがアセットビューです。プロジェクトにあるアセットが全てここに入っています。ローカルの素材をドラック＆ドロップでここにアップロードしてプロジェクトで使用することができます。

### INSPECTOR View
![image](https://qiita-image-store.s3.amazonaws.com/0/148084/4ef0ed2e-a633-aefe-dfae-511bea78f9e6.png)
右側にあるのがインスペクタービューです。ヒエラルキーもしくはシーンからオブジェクトを選択したときにそのオブジェクトの詳細が表示されます。ここからオブジェクトに対するコンポーネントを指定したり編集したりすることができます。


#次
次回は空のプロジェクトから「Roll a Ball」を作っていきます。
https://qiita.com/ryotaro_/items/4371bf30d7ba62373193
CSSだけでアニメーションする背景を作る

# keyframe を使ってCSSだけで背景画像を作成しました

animation と keyframe を使用するとCSSで簡単にアニメーションが実装できます。  
このサイトを作成する際に animation と keyframe を使用したのでその使い方を紹介します。

![Screen Shot 2017-01-24 at 11.55.40 PM.png](https://qiita-image-store.s3.amazonaws.com/0/63056/2300334a-3e92-6790-0934-c12284e6b33f.png)
[Elastic | A collection of background image created by CSS only](http://www.sottar.net/elastic/)

コードはこちらに上がっています。
https://github.com/sottar/elastic


## keyframeとは

詳しくはこちら ([@keyframes - CSS | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/@keyframes)) に書かれていますが、簡単に説明すると CSS animation の流れの中間地点を制御することができます。
10%ではこの状態、50%ではこの状態、80％では、、、のような感じです。

モダンブラウザには全て対応しており、IEも10以降には対応しています。

# オプション一覧

animation属性にオプションを設定することで細かい挙動を指定でき、
以下のオプションをつけることができます。
※（）内はデフォルトの値

- animation-name (none) 必須
アニメーション名を指定する  

- animation-duration (0) 必須
アニメーション一回分の時間の長さを指定する  

- animation-timing-function (ease)
アニメーションのタイミング・進行割合を指定する  

- animation-delay (0)
アニメーションがいつ始まるかを指定する  

- animation-iteration-count (1)
アニメーションの繰り返し回数を指定する
infiniteを指定すると無限に再生を繰り返す  

- animation-direction (normal)
アニメーションを交互に反転再生させるかどうかを指定する  

- animation-play-state (running)
アニメーションを一時停止したり、再開したりさせる
マウスオーバー時に動きを止めたい時に使用できます  

- animation-fill-mode (none)
アニメーションの実行前や実行後にどのようなスタイルを適用するかを設定する  


これらのオプションと keyframes 内のパーセントの値を駆使することで複雑なアニメーションも比較的簡単に実装できます。


## 使いかた例

``` css
.css {
  animation: spin 10s linear infinite;
}
@keyframes spin {
  0% {
    width: 50px;
    transform: rotate(0deg);
  }
  50% {
    width: 100px;
    transform: rotate(120deg);
  }
  100% {
    width: 200px;
    transform: rotate(360deg);
  }
}
```

css の animation 属性で指定したアニメーション名と keyframes の識別子を合致させて使用します（上の例だとspin）  
10s かけて 0% から 100% まで 識別子spin がアニメーションします。
初期値が 0% の ``` width: 50px; transform: rotate(0deg); ```, 
5s後に ``` width: 100px; transform: rotate(120deg); ```, 
10s後に ``` width: 200px; transform: rotate(360deg); ``` になり、その後0%の値に戻って繰り返されます。



背景画像に keyframe, animationを使用するサンプルサイトを作成したので実際に動きを確認してみてください。
[Elastic | A collection of background image created by CSS only](http://www.sottar.net/elastic/)
SCSSの繰り返しと:nth-child(n)の組み合わせ

8色$colorsを順番に回す

```
div {
  $length: length($colors);
  @each $color in $colors {
    $i: index($colors, $color);
    &:nth-child(#{$length + "n+" + $i}) {
      border-color: $color;
      
      &::before {
        border-color: $color;
      }
    }
  }
}
```
送信ドメイン認証

# **なりすまし攻撃を防ぐ仕組み**
* 前回の記事ではなりすまし攻撃の事例や危険性とそれらを防ぐ仕組みについて簡単にまとめました。
* 今回の記事ではなりすまし攻撃を防ぐ仕組みである<font color="Red">**送信ドメイン認証**</font>について少し掘り下げていきます。

> 送信ドメイン認証（SPF、DKIM、DMARC）

##**SPF**
* なりすましメール対策として、<font color="Red">**IPアドレスを利用して受信したメールの送信元が詐称されていないかどうかを確認**</font>することができる送信ドメイン認証技術のひとつ。
* 国内の主要携帯キャリアではSPFを取り入れており、2015年の時点でSPF普及率は約<font color="Red">**90%**</font>と非常に高く、もはや必須の設定でしょう。
![image](https://qiita-image-store.s3.amazonaws.com/0/153290/8dd18d64-b777-308c-7242-574af7ea0f43.png)




##**DKIM**
* なりすましメール対策として、<font color="Red">**電子署名を利用して受信したメールの送信元が詐称されていないかどうかを確認**</font>することができる送信ドメイン認証技術のひとつ。
* DKIMでは送信側で電子メールに電子署名を付加し、受信側でその電子署名を照合するという方法で送信者のドメインの認証を行うのです。
* 2015年時点でDKIMの普及率はまだ約<font color="Blue">**40%**</font>ですが、徐々に普及してきています。
![image](https://qiita-image-store.s3.amazonaws.com/0/153290/b7eae5f1-0a5d-bf7d-3b3c-7091beb02188.png)



## **DMARC**

* SPFやDKIMで認証を行っても認証後のアクションが曖昧では対策にならない
* そこで、<font color="Red">***DMARC***</font>

#### レポートとポリシー

* *レポート*：送信ドメイン認証が成功したのか失敗したのか、どうして失敗したのか、といった報告

* *ポリシー*：DMARCでは、認証にSPFやDKIMを使うのですが、この認証に失敗した時にどのように対処するのかを送信ドメインの署名と一緒に、送信元の方で定義しておく

DMARCとはSPFとDKIMなどの<font color="Red">**認証の結果をレポートにし、そのレポートとあらかじめ決めておいたポリシーを元に対処を決定する**</font>という仕組みです。
DMARCを導入すれば、認証が失敗したメールを様子を見ながら徐々に拒否していく、といったような運用なども可能になるのです。


## **導入済みかどうかの確認方法**
* <font color="Red">**送られてきてるメールを見て、相手側がちゃんと送信ドメイン認証を導入しているかどうかを確認してみましょう！**</font>

### SPF&DKIM確認方法(YahooメールからGmailに送ったメール)
#### １．Gmailで受信したメールを開き、右上の赤枠で囲まれた部分をクリックします

![image](https://qiita-image-store.s3.amazonaws.com/0/153290/8d4d9f2e-2bf1-07d3-f835-723d8a11c799.png)

#### ２．「メッセージのソースを表示」をクリックします

![image](https://qiita-image-store.s3.amazonaws.com/0/153290/3822accf-eb2f-761b-30e0-f5049c663a57.png)

####３．下図のように別ページに飛ばされるのでここで確認ができます

![image](https://qiita-image-store.s3.amazonaws.com/0/153290/f0354e07-c4a2-5aa4-983b-6a2c94a50ab9.png)

SPF,DKIM共に｢<font color="Red">**PASS**</font>｣なので、送信側にてSPFとDKIMの設定がされているということが分かりますね。

ちなみにですが「PASS」以外だったらどうなるのよ？って人のために一覧表を用意しました

#### SPF認証結果早見表
|認証結果|意味|
|:--:|:--:|
|None|SPFレコードが公開されていない|
|Neutral|SPFレコードが"？"として公開されている条件にマッチした|
|Pass|認証処理に成功した|
|Fail|SPFレコードが公開されているが、認証に失敗した|
|SoftFail|SPFレコードが“~”として公開されている条件にマッチした|
|TempError|一時的な障害で認証処理が失敗した|
|PermError|SPFレコードの記述に誤りがあるなどで認証処理に失敗した|

#### DKIM認証結果早見表
|認証結果|意味|
|:--:|:--:|
|Pass|署名の検証に成功した|
|Neutral|署名の検証に失敗した(公開鍵がない等)|
|Hardfail|署名の検証に失敗した(認証失敗)|
|None|署名が付与されていない|
|PermError|認証処理でエラーが発生|

## **まとめ**
* なりすまし攻撃を防ぐ仕組みである送信ドメイン認証について掘り下げてみました。基本的な対策ではありますが、<font color="Red">**基本的だからこそ知っておくべきこと**</font>だと思いますので再度確認してみてはいかがでしょうか

###引用元
>http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/
>http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/dkim/
Unityを始める（１）

# 環境
MacOS
# Unityをダウンロード
公式URLよりダウンロード
https://unity3d.com/jp/get-unity/download
![スクリーンショット 2017-01-30 10.58.25.png](https://qiita-image-store.s3.amazonaws.com/0/8109/c9bd8475-2c92-b77f-2dfc-51d15e64cfe6.png)

# インストールする
![スクリーンショット 2017-01-30 11.02.16.png](https://qiita-image-store.s3.amazonaws.com/0/8109/d79128f4-b68a-c801-8ad9-733556ec1890.png)

### アシスタントを開く
「Continue」を押す
![スクリーンショット 2017-01-30 11.02.24.png](https://qiita-image-store.s3.amazonaws.com/0/8109/10ad399e-44bf-f106-e61e-fdd461c88182.png)

また「Continue」を押す
![スクリーンショット 2017-01-30 11.03.18.png](https://qiita-image-store.s3.amazonaws.com/0/8109/780c9982-a567-ae9c-e15e-292ca37cea3a.png)

とりあえずデフォルトで「Continue」を押す
![スクリーンショット 2017-01-30 11.03.27.png](https://qiita-image-store.s3.amazonaws.com/0/8109/59002ce1-ffb8-ade5-5c90-58cb311f8157.png)

するとインストールが始まる
![スクリーンショット 2017-01-30 11.03.50.png](https://qiita-image-store.s3.amazonaws.com/0/8109/3e6e4ada-a0b4-ccbd-bd3b-997e7699f4c6.png)

そして完了
![スクリーンショット 2017-01-30 11.16.51.png](https://qiita-image-store.s3.amazonaws.com/0/8109/38f5b3d1-7029-66eb-7f71-d1c1534f4a70.png)

「アプリケーション」から開く
![スクリーンショット 2017-01-30 11.18.13.png](https://qiita-image-store.s3.amazonaws.com/0/8109/0d21c225-4343-1807-e1b3-19433cbbb9b9.png)

「create one」をクリック
![スクリーンショット 2017-01-30 11.36.21.png](https://qiita-image-store.s3.amazonaws.com/0/8109/ecf43b5e-b17e-c763-5a81-b9eed466b75d.png)

アカウントを作る
![スクリーンショット 2017-01-30 11.22.48.png](https://qiita-image-store.s3.amazonaws.com/0/8109/d3eb90fa-5240-aebd-2126-27a6ad3b7845.png)

有料か無料を選ばせられますが
とりあえず無料で使用します。

そして完了。
![スクリーンショット 2017-01-30 11.51.55.png](https://qiita-image-store.s3.amazonaws.com/0/8109/c576052c-a431-10f4-fcee-7970ee55ccd0.png)
csh > link > $*の意味 > $argv[*]と同じ > 全ての引数

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
GNOME Terminal v2.31.3
tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,sm,rh,color,filec
```

WRF(Weather Research and Forecasting Model)関連。

WPSの処理時のlink_grib.cshの使い勝手が悪い。
2つの月(年をまたぐ場合もある)のGRIBFILE.XXXを作りたいのだが、標準のスクリプト(`link_grib.csh`)ではどうもそのようにできない気がする。

cshスクリプトを読んでいて気になった箇所。

```link_grib.csh
foreach f ( ${1}* )

...
foreach f ( $* )
...
```

`${1}`は１つ目の引数と分かった。

`$*`は何なのか。
man cshしても、その記載場所が分からない（かつ、manの構造を覚える労力がかかる)。

以下が分かりやすかったです。
http://nw.tsuda.ac.jp/lec/csh/

情報感謝です。
CSS フォーム内で文字変換した時に文字が消える！？

## そんなバカな....
![スクリーンショット 2017-01-30 11.08.26.png](https://qiita-image-store.s3.amazonaws.com/0/147005/90db2039-c791-6218-18b5-9089bdf02d2b.png)

消えとるぅー:hugging:

## 原因は「::selection」
::selectionってのは

```css:selection.css
::selection {
  background: #4f5362;
  color: #FFFFFF;
}
```
みたいに背景色と文字色を指定したら
![スクリーンショット 2017-01-30 11.09.45.png](https://qiita-image-store.s3.amazonaws.com/0/147005/7718599c-eb07-0bdd-2bfd-695368fe8d78.png)

普通こうなるのが
![スクリーンショット 2017-01-30 11.10.03.png](https://qiita-image-store.s3.amazonaws.com/0/147005/46a390bf-edad-530d-612a-30a7a92409db.png)

こうなる。カッコイイ？:japanese_goblin:

フォーム内で文字変換した時にこの文字色のスタイルがかかるらしい。
なので文字が消えるというよりは、#FFFFFF（白色）になっていんですね。

## こうした
フォーム以外にスタイルかかるようにすればいい。

```css:selectionFix.css
:not(input)::selection {
  background: #4f5362;
  color: #FFFFFF;
}
```

:not()とか初めて使った
Bitbucket + SourceTree を使って，Deisへ Web アプリをデプロイする

# 本稿で行うこと。
[Windows に Deis Workflow CLI をインストール](http://qiita.com/monamour555/items/1b2a0f2a180ffb90178a)し，
[SourceTree を用いて認証用の鍵を作成し登録した](http://qiita.com/monamour555/items/1031f801990f416756ef)あとの作業は，Webアプリのデプロイです。
やってみましょう。

外部の Git リポジトリとしては [GitHub](https://github.com/) が一般的です。
しかし，零細規模では，プライベートリポジトリを無料で複数持てる [Bitbucket](https://bitbucket.org/) を用いる例が多いのではと思いますので，そちらで例示します。

本稿では，作業者が下記のような状態にあることを想定します。

* Bitbucket には既にプロジェクトと Git リポジトリが存在している。
* 既に誰かが Web アプリのソースコードを Bitbocket の Git リポジトリに登録している。
* さきほど上記プロジェクトに参加したばかり。
* Git の使い方は知っている。
* 使用する端末は Windows 系。
* Workflow CLI と SourceTree はインストール済み。
* `deis.exe register` および `deis.exe login` を実行済み。

# 作業

順番に説明します。

## Bitbucket への接続

Web検索をかけてみたら[とても良いブログエントリ](http://www.granfairs.com/blog/staff/sourcetree-ssh)がありました。
[先日，筆者が書いた記事]((http://qiita.com/monamour555/items/1031f801990f416756ef))よりも内容が濃く解りやすいと思います。

## Deis へのデプロイのための設定

SourceTree から clone したリポジトリを選択した状態で「端末」ボタンを押し，コマンドラインウインドウを開きます。
開いたら `deis.exe` コマンドを実行するのですが，デプロイするWebアプリが Deis 上に存在するかどうかで，オプションが異なります。

いずれにせよ，`deis.exe` は内部で `git remote:add` を呼び出し，設定します。 

### 新しく Web アプリを生成する場合

```
deis.exe create {アプリ名}
```

`{アプリ名}` は省略可能です。省略した場合には適当な名前が割り当てられます。

### 既にデプロイ済みの Web アプリを更新する場合

```
deis.exe remote:add -a {アプリ名}
```

アプリ名は省略できません。

## デプロイ

Deis は [Heroku](http://heroku.com/) 互換ですので，`git push` でデプロイのためのビルドが開始されます。
コマンドラインの場合は，`git push deis master` でプッシュします。

SourceTree の場合，下記の手順となります。

0. 「プッシュ」ボタンを押してプッシュウインドウを表示させる。
0. プッシュ先リポジトリを `deis` にする。
0. プッシュ対象のブランチを `master` にする。
0. `OK` ボタンを押す。

### デプロイが拒絶されたら?

稀にデプロイが拒絶される場合があります。
初回での場合 `deis.exe keys:add` の設定ミスも疑われますが，
Deis のバグや過負荷と思われる拒絶も稀に起きるようです。
設定ミスの可能性は無い，という自信がある場合は，サーバ管理者に問い合わせましょう。

## 確認

デプロイされた Web アプリは，`http://{アプリ名}.{Deis のベースドメイン名}/` でアクセス可能となります。

Deis のベースドメイン名とは，ログインの時に指定した URL の `http://deis.{ここの部分のことです}/` 。

### Web ブラウザからのアクセスで 5xx エラーが返ってくるときは?

Deis は，Kubernetes を実行環境の基盤としています。
背後では下記のようなタスクが走ります。
このため，複数ノードの環境では，ビルド完了からデプロイ完了まで時間がかかることがあります。

0. Deis builder がデプロイ終了時に Docker リポジトリにコンテナイメージを push。
0. その後 Kubernetes が Docker リポジトリからコンテナイメージを pull。
0. Kubernetes Pod として実行。

デプロイ完了後に `deis.exe ps` を実行すると，アプリを受け持っているコンテナの状態がわかります。
`up` になっているのが正常です。
502 エラーが返ってきて `image pulling` の場合は，しばらく待ってみてください。

それ以外の状態になっている場合には…，おそらく，デプロイした Web アプリにバグがあるか，Deis や Kubernetes がトラブっています。
後者の場合はサーバ管理者に問い合わせましょう。


# まとめ

以上，文章にすると煩雑ですが，慣れるとルーチンワークです。ご参考になれば幸いです。
【Rails】redirect_toとrenderの使い分け

#renderとredirect_to
###redirect_to

指定したcontroller、actionに再度リクエストを送信
controllerのインスタンス変数は、リダイレクト先で新たに生成

###render

controllerで処理した結果の出力先Viewを指定する
controllerのインスタンス変数は、そのままViewに渡される


基本的に、
データを追加、更新、削除を行う時は「redirect_to」
データの取得を行う時は「render」

```messages_controller.rb
  def index
    @message = Message.new
  end

  def create
    @message = current_user.messages.new(message_params)
    if @message.save
      redirect_to :index
    else
      flash[:alert] = "メッセージを入力してください。"
      render action: :index
    end
  end
```

メッセージボタンを押すとフォームに入力されたメッセージが送信される時の処理。
メッセージの保存に成功すれば、redirect_toにより、indexアクションのリクエストが再度送信されるため、メッセージは正しく表示される。
例えば、ここがrenderだった場合、メッセージの保存は成功するが、正しく表示されない。



#参考記事
http://ruby-rails.hatenadiary.com/entry/20140808/1407427457
http://avosalmon.hatenablog.com/entry/2014/05/17/%E3%80%90Rails%E3%80%91render%E3%81%A8redirect_to%E3%81%AE%E9%81%95%E3%81%84
nexus 2.14をDocker起動で、Not Foundエラー

2.13では問題なくアクセスできていたが、2.14でブラウザアクセスすると、下記のエラーページが表示される。

```
HTTP ERROR: 404
Problem accessing /. Reason:
Not Found
Powered by Jetty://
```

2.14から、デフォルトのコンテキストパスが/nexusになった模様。
http://{{your server}}/nexus

利用者にURL変更をお願いする訳にはいかないので、コンテナ起動時に、コンテキストパスを指定することで、回避。

```
docker run -d \
  --name nexus \
  -p 8081:8081 \
  -v /nexus-data:/sonatype-work \
  -e CONTEXT_PATH=/ \
  sonatype/nexus
```
デートタイムピッカーのカスタム表示方法

#デートタイムピッカー(DateTimePicker)のカスタム表示

 デートタイムピッカーの日付・時刻表示フォーマットをカスタム表示にするコードです。マイクロソフトのページより書き出したものです。デフォルトの表示では「2017/1/17 0:00」のようなおかしな書式になってしまいます。

デートタイムピッカーのプロパティに以下のラインを追加します。赤字部分はユーザーカスタム表示部。下に各デートタイムコードの表示例を挙げてあります。
   
```c++:
  dateTimePicker1->Format = DateTimePickerFormat::Custom;
  dateTimePicker1->CustomFormat = "MMMM dd, yyyy - dddd";
```

- d The one- or two-digit day.
- dd The two-digit day. Single-digit day values are preceded by a 0.
- ddd The three-character day-of-week abbreviation.
- dddd The full day-of-week name.
- h The one- or two-digit hour in 12-hour format.
- hh The two-digit hour in 12-hour format. Single digit values are preceded by a 0.
- H The one- or two-digit hour in 24-hour format.
- HH The two-digit hour in 24-hour format. Single digit values are preceded by a 0.
- m The one- or two-digit minute.
- mm The two-digit minute. Single digit values are preceded by a 0.
- M The one- or two-digit month number.
- MM The two-digit month number. Single digit values are preceded by a 0.
- MMM The three-character month abbreviation.
- MMMM The full month name.
- s The one- or two-digit seconds.
- ss The two-digit seconds. Single digit values are preceded by a 0.
- t The one-letter A.M./P.M. abbreviation (A.M. is displayed as "A").
- tt The two-letter A.M./P.M. abbreviation (A.M. is displayed as "AM").
- y The one-digit year (2001 is displayed as "1").
- yy The last two digits of the year (2001 is displayed as "01").
- yyyy The full year (2001 is displayed as "2001").
Gradle依存関係がSLF4Jを使っているときのエラー対処法

Gradle の依存関係で追加したライブラリが SLF4J というロギングフレームワークを使っていて、
プログラムの実行時にエラーが表示されることがあります。
ここでは、その対処法についてメモしておきます。

## Failed to load class

依存関係で追加したライブラリが SLF4J を使っていた場合に、以下のようなエラーを吐くことがあります。

```
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
```

これは、StaticLoggerBinder を実装したロガーがありませんという意味です。
SLF4J では、使用するログ実装の指定を StaticLoggerBinder というクラスで行なっています。
なので、StaticLoggerBinder を実装したロガー（Log4J）を依存関係に追加しましょう。

```build.gradle
dependencies {
    compile 'org.slf4j:slf4j-log4j12:1.7.21'
}
```

## WARN No appenders could be found for logger

StatucLoggerBinder を実装したロガー(Log4J)を依存関係に追加しプログラムを実行すると、以下のような警告を吐きます。

```
log4j:WARN No appenders could be found for logger (xxxxxxx).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
```

これは、ログ出力を行うクラスに対して Appender の設定がされていないという意味です。
そこで、Log4J の設定ファイルを作成しプロジェクトの `src/main/resources` に配置しましょう。

### ■ 作成する設定ファイル

開発環境ではログを出力させたいが、本番環境ではログを出力させる必要がない場合などがあるため、
ログを出力する場合としない場合の設定をメモしておきます。

#### ログを出力させる場合

```log4j.properties
log4j.rootLogger=DEBUG, console
log4j.logger.xxx=DEBUG, console

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%-5p-%c] %m%n
```

#### ログを出力させない場合

```log4j.properties
log4j.rootLogger=FATAL, null
log4j.appender.null=org.apache.log4j.varia.NullAppender
```
GNU coreutils > stat > Symbolic link先のファイルのサイズを取得する > stat -Lc %s GRIBFILE.AAA

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
GNOME Terminal v2.31.3
GNU coreutils 8.4                  May 2016 
```

WRF(Weather Research and Forecasting Model)において、WPSにてNCEPデータのSymbolic linkを作成している。

そのコマンドでミスをして、「元ファイルを消してしまっていないか？ファイルサイズは0になっていないか?」を確認したくなった。

参考 https://ubuntuforums.org/showthread.php?t=1751783

```bash
$ stat -Lc %s GRIBFILE.AAA 
19515418
```

```bash
$ stat -Lc %s GRIBFILE.* | less^C
19383082
19320312
19424502
19443886
19294341
19291482
19384378
19109982
19104404
19165879
19030230
19118363
19064058
19115145
19172183
...
```

大丈夫そう。
更新日時でファイルを検索して圧縮する

## 日付を指定して検索
#### 24時間以内に更新されたファイルを検索
```bash
find -type f -mtime 0
```
#### 今日更新されたファイルを検索
```bash
find -type f -newermt `date +%F`
```
#### 48時間以内に更新されたファイルを検索
```bash
find -type f -mtime -2
```
#### 昨日までに更新されたファイルを検索
```bash
find -type f -newermt `date +%F -d yesterday`
```
#### 72時間以内に更新されたファイルを検索
```bash
find -type f -mtime -3
```
#### 3日前までに更新されたファイルを検索
```bash
find -type f -newermt `date +%F -d -3days`
```
#### 2017年1月1日以降に更新されたファイルを検索
```bash
find -type f -newermt 2017-01-01
```
## 時間を指定して検索
#### 3時間以内に更新されたファイルを検索
```bash
find -type f -mmin -180
```
```bash
find -type f -newermt `date +%F -d -3hours`
```
## ファイル名を指定して検索
#### 今日更新された PHP ファイルを検索
```bash
find -type f -newermt `date +%F` -name *.php
```
## 検索したファイルを直接圧縮する
```bash
find -mtime -10 | xargs tar cvf archives.tar.gz
```
bash > 単語単位での移動 with WindowsPC用キーボード > Alt + F / Alt + B

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
GNOME Terminal v2.31.3
```

bashを用いて複数のコマンドを実行している時、キーボードショートカットを覚えていれば作業が捗りそう。

以下の記事が参考になりました。
http://qiita.com/odacoh/items/b94be0deecaaa27b0263

上記の記事はmacでの操作。
`Opt + F`や`Opt + B`に対応する操作はどのキーが対応するのか。

http://ss64.com/bash/syntax-keyboard.html
Altを試してみた。

- Alt + F
  - GNOME Terminalのメニューが開いてしまう
- Alt + B
  - リンク記事と同じ動作
     - カーソルを1単語戻す

`Esc, F`と`Esc, B`でも１単語単位での移動ができるが、入力しやすさは`Alt + B`の方が良い。
`Alt + B`を使うと`Alt + F`を使えない、というアンバランスがある。

## GNOME Terminalの設定変更

Edit > Keyboard Shortcuts... > Enable menu access keys (such as Alt + F to open the File menu)

のチェックを外した。

これで、`Alt + F`でターミナルの単語単位のカーソル移動に使えるようになった。
JavaでのStream操作

# 配列に変換する

```java
Stream<String> streamString = Stream.of("a", "b", "c");
String[] stringArray = streamString.toArray(String[]::new);
```

# Stream同士の結合

```java
Stream.concat(stream1, stream2, ...)

// ２つのStreamを結合する例
List<String> values = Stream.concat(
        Stream.of("a", "b", "c"),
        Stream.of("d", "e"))
        .collect(Collectors.toList());
System.out.println(values); // -> [a, b, c, d, e]
```

# `IntStream`で数値の範囲を反復

```java
// forを利用し1〜9までループ
List<String> values = new ArrayList<>();
for (int i = 1; i < 10; i++) {
    values.add("value:" + i);
}
System.out.println(values); // -> [value:1, value:2, value:3, value:4, value:5, value:6, value:7, value:8, value:9]

// IntStreamで1〜9までのStreamを生成
List<String> values = IntStream.range(1, 10)
        .boxed()
        .map(value -> "value:" + value)
        .collect(Collectors.toList());
System.out.println(values); // -> [value:1, value:2, value:3, value:4, value:5, value:6, value:7, value:8, value:9]
```

# カスタムコレクタ

```java
Stream<String> stream = Stream.of("apple", "banana", "cherry");
String result = stream.collect(
    Collector.of(
        StringBuilder::new,
        StringBuilder::append,
        StringBuilder::append,
        StringBuilder::toString
    )
);

System.out.println(result); // -> applebananacherry
```
# コレクタをネストさせた例

```java
record Person(String name, int age, String city) {
}

List<Person> people = Arrays.asList(
    new Person("Alice", 23, "London"),
    new Person("Bob", 28, "New York"),
    new Person("Charlie", 33, "London"),
    new Person("Diana", 40, "New York"),
    new Person("Eve", 28, "London"),
    new Person("Frank", 33, "New York")
);

Map<String, Map<Integer, List<String>>> groupedByCityAgeAndNames = people.stream()
    .collect(
        Collectors.groupingBy(
            Person::city, Collectors.groupingBy(
                Person::age, Collectors.mapping(
                    Person::name, Collectors.toList()
                )
            )
        )
    );

System.out.println(groupedByCityAgeAndNames); // -> {New York={33=[Frank], 40=[Diana], 28=[Bob]}, London={33=[Charlie], 23=[Alice], 28=[Eve]}}
```
CygWinでgo get

Windowsにgoをインストールすれば、cygwin上でもgoの実行が可能ですが、go getを実行するには、GOPATHの設定が必要です。

# cygwinでのGOPATHの設定

cygwinでのGOPATHの設定はexportコマンドで以下の様に行います

```
$ export GOPATH=d:\\cygwin\\home\\username\\go
```

# go getのための設定

加えて以下の設定を行っておくと困らないと思います。

## githubの設定

~/.ssh/id_rsa_githubにSSH KEYを配置
~/.ssh/config を以下のように設定

```
Host github.com
    User git
    Hostname github.com
    IdentityFile /home/username/.ssh/id_rsa_github
```

## httpsで処理できるように証明書を配置

http://curl.haxx.se/docs/caextract.html
から最新のcacert.pemをダウンロードして
~/.ssh/cacert.pem
に配置

~/.gitconfigを以下のように設定

```
[user]
    email = your.email@your.domain
    name = yourname

[http]
    sslcainfo = ~/.ssh/cacert.pem
```

# 動作確認

```
$ go get github.com/golang/example/hello
```
PureScript で Maybe a を a にする

# 問題

PureScript で Maybe a を a にしたい (値を取り出したい) 。どうすれば良いのか。

# 解決策

あくまで一例。

- case などのパターンマッチで取り出す。
- `maybe` (https://pursuit.purescript.org/packages/purescript-maybe/2.0.1/docs/Data.Maybe#v:maybe) を使う。
- `fromMaybe` (https://pursuit.purescript.org/packages/purescript-maybe/2.0.1/docs/Data.Maybe#v:fromMaybe) を使う。
- `fromJust` (https://pursuit.purescript.org/packages/purescript-maybe/2.0.1/docs/Data.Maybe#v:fromJust) + `unsafePartial` を使う。

基本的には値がない (Nothing) ときの代わりの値については考えないといけない。次の例では `456` を使っている。

`fromJust` は Nothing のパターンを考慮していない部分関数。 `unsafePartial` を使って、危険を承知で `Just` 前提で抜き出す。

## `case`

```
> import Data.Maybe (Maybe(..))
> let m1 = Just 123
> let m2 = Nothing
>
> :paste
… case m1 of
…   Nothing -> 456
…   Just x -> x
…
123

> :paste
… case m2 of
…   Nothing -> 456
…   Just x -> x
…
456
```

## `maybe`

```
> import Data.Maybe (Maybe(..), maybe)
> let m1 = Just 123
> let m2 = Nothing
>
> maybe 456 (\x -> x) m1
123

> maybe 456 (\x -> x) m2
456
```

## `fromMaybe`

```
> import Data.Maybe (Maybe(..), fromMaybe)
> let m1 = Just 123
> let m2 = Nothing
>
> fromMaybe 456 m1
123

> fromMaybe 456 m2
456
```

## `fromJust` (+ `unsafePartial`)

```
> import Data.Maybe (Maybe(..), isJust, fromJust)
> import Partial.Unsafe (unsafePartial)
> let m1 = Just 123
> let m2 = Nothing
>
> if isJust m1 then unsafePartial fromJust m1 else 456
123

> if isJust m2 then unsafePartial fromJust m2 else 456
456

> unsafePartial fromJust m1
123

> unsafePartial fromJust m2 :: Maybe Int
...
Error: Failed pattern match
...
```

## 実装

ちなみにそれぞれの実装は次の通り。

`maybe` https://github.com/purescript/purescript-maybe/blob/v2.0.1/src/Data/Maybe.purs#L213-L213

```
maybe :: forall a b. b -> (a -> b) -> Maybe a -> b
maybe b _ Nothing = b
maybe _ f (Just a) = f a
```

`fromMaybe` https://github.com/purescript/purescript-maybe/blob/v2.0.1/src/Data/Maybe.purs#L238-L238

```
fromMaybe :: forall a. a -> Maybe a -> a
fromMaybe a = maybe a id
```

`fromJust` https://github.com/purescript/purescript-maybe/blob/v2.0.1/src/Data/Maybe.purs#L264-L265

```
fromJust :: forall a. Partial => Maybe a -> a
fromJust (Just x) = x
```

# 参考

- https://pursuit.purescript.org/packages/purescript-maybe/2.0.1/docs/Data.Maybe#v:maybe
- https://pursuit.purescript.org/packages/purescript-maybe/2.0.1/docs/Data.Maybe#v:fromMaybe
- https://github.com/purescript/purescript-maybe/blob/v2.0.1/src/Data/Maybe.purs#L213-L213
- https://github.com/purescript/purescript-maybe/blob/v2.0.1/src/Data/Maybe.purs#L238-L238
- https://github.com/purescript/purescript-maybe/blob/v2.0.1/src/Data/Maybe.purs#L264-L265
Python > Python does not include the last offset

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 948 / 12833)

> , offset 12 to 14 (Python does not include the last offset):

```
>>> letters[12:15]
'xyz'
```

ideoneで試してみた。

http://ideone.com/0q0x1y

```py
alphabet = 'abcdefghijklmnopqrstuvwxyz'
print(len(alphabet))

print(alphabet[0:25])
print(alphabet[:25])
print(alphabet[::-1])
```

```txt:結果
Success	time: 0.01 memory: 9992 signal:0
26
abcdefghijklmnopqrstuvwxy
abcdefghijklmnopqrstuvwxy
zyxwvutsrqponmlkjihgfedcba
```

他の言語からPythonに戻ってきた時にミスしやすいように思う。
メモ: xubuntu 17.04

* [Xubuntu 17.04 (Zesty Zapus) Daily Build](http://cdimage.ubuntu.com/xubuntu/daily-live/current/)

## ダブルクリックでウィンドウ最大化

* ALT押しながら左ダブルクリック -> ウィンドウ最大化
* ALT押しながら右ダブルクリック -> ウィンドウ縦に最大化

## トラックパッド誤操作防止

* 以下でキー入力から0.5秒間はトラックパッドが無効になる。

```bash:
if [ "$DISPLAY" = ":0.0" ];then
    pgrep syndaemon > /dev/null
    if [ $? -eq 1 ];then
        /usr/bin/syndaemon -d -i 0.5 -R
    fi
fi
```

## ログアウト

```
killall sh
```


## 日本語入力

* OSインストール時にオフラインにしておき、インストール完了後、不足している言語の追加実施。
* 日本語入力できなかったため、`fcitx`と入力するとXMODIFIERが設定されていないとでた。
* `im-config`で`fcitx`を指定しOS再起動すると日本語入力できるようになった。

## grubにwindowsの追加

* 参考:[別ドライブに入れたWindows10をgrubで認識させる話。 - Qiita](http://qiita.com/ABC10946/items/8b4de8b34b03c70a9ba3)

```diff:/etc/default/grub
- GRUB_HIDDEN_TIMEOUT=0
+ #GRUB_HIDDEN_TIMEOUT=0
- GRUB_TIMEOUT=10
+ GRUB_TIMEOUT=3
```

```
sudo mount -o ro /dev/sda1 /media
sudo os-prober
sudo grub-install --efi-directory=$esp --bootloader-id=grub --recheck /dev/sda
sudo grub-mkconfig -o /boot/grub/grub.cfg
```

```diff:grub-mkconfigの出力
  Generating grub configuration file ...
  Linux イメージを見つけました: /boot/vmlinuz-4.9.0-12-generic
  Found initrd image: /boot/initrd.img-4.9.0-12-generic
  Found memtest86+ image: /boot/memtest86+.elf
  Found memtest86+ image: /boot/memtest86+.bin
+ Found Windows 10 on /dev/sda1
  完了
```
技術英語 > By preceding a character with a backslash ('\'), you [give it a special meaning].

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 838 / 12833)

> Escapse with '\'

...

> By preceding a character with a backslash ('\'), you **<font color=red>give it a special meaning</font>**.

```
>>> plaindrom = 'A man,\nA plan, \nA canal:\nPanama.'
```
eZ Publish の pagelayout で利用できる変数

https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Templates/The-pagelayout/Variables-in-pagelayout

変数|タイプ|説明
---|---|---
`$access_type`|配列|The name of the siteaccess (as "name") and the ID number (as "type") of the access method that was used (1=URL, 2=Host, 3=Port).
`$anonymous_user_id`|整数|The ID number of the content object that represents the anonymous user account (the default/standard value is 10).
`$current_user`|オブジェクト|現在ログインしているユーザーの ezuser オブジェクト。<br>ユーザーがログインしていない場合は anonymous ユーザーアカウントが使用される。
`$ezinfo`|配列|An array of three strings: "version", "version_alias" and "revision". These strings reveal basic information about the eZ publish release that is being used.
`$module_result`|配列|Contains information about the result (and the result itself) generated by the module/view that was executed.
`$navigation_part`|配列|A hash containing the name and the identifier (the keys are "name" and "identifier") of the current navigation part; for example: "Content structure" and "ezcontentnavigationpart". The navigation part is used by the administration interface to determine which part the user interacts with.
`$requested_uri_string`|文字列|Contains the site specific part of the requested URL, for example: "content/view/full/44" (system URL) or "company/about" (virtual URL).
`$site`|配列|Contains miscellaneous information about the siteaccess that is being used (site name, design resource, meta tags, etc.)
`$ui_component`|文字列|The user interface component which eZ publish uses while the current page is being shown. This variable is used by the administration interface.
`$ui_context`|文字列|The user interface context in which eZ publish is in while the current page is being shown. This variable is used by the administration interface to distinguish between different modes (for example "navigation", "edit", "browse", etc.).
`$uri_string`|文字列|The system version of the requested URL (for example "/content/view/full/13").
`$warning_list`|配列|An array of warnings related to problems that were discovered when the page was rendered.

### $current_user
```jinja
{def $current_user=fetch( 'user', 'current_user' )}
```
pagelayout 以外から $current_user を参照したい場合は fetch ファンクションで取得する。
https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Modules/user/Fetch-functions/current_user
mruby-cliでmruby-websocketを使う


http://qiita.com/miminashi/items/303bc5c29c78d8587db4 で書いた通り、mruby-websocketがmruby 1.2.0だと動かない。リリース版じゃなくてmasterのHEADをいれてやればいいっぽい。
mruby-cliのRakefileにmrubyをダウンロードするtaskがあるんだけど、ヒントっぽいコメント行が存在してた。

```ruby
file :mruby do
  #sh "git clone --depth=1 https://github.com/mruby/mruby"
  sh "curl -L --fail --retry 3 --retry-delay 1 https://github.com/mruby/mruby/archive/1.2.0.tar.gz -s -o - | tar zxf -"
  FileUtils.mv("mruby-1.2.0", "mruby")
end
```

↓

```ruby
file :mruby do
  sh "git clone --depth=1 https://github.com/mruby/mruby"
  #sh "curl -L --fail --retry 3 --retry-delay 1 https://github.com/mruby/mruby/archive/1.2.0.tar.gz -s -o - | tar zxf -"
  #FileUtils.mv("mruby-1.2.0", "mruby")
end
```

`mruby`というディレクトリがあるかどうかでmrubyをダウンロード済かどうか判断しているようなので、ビルドの前に`rake clean`すると良いようです。
【Docker】RancherOSでnameserverのipを変更するメモ

## rancherとは
- [Spark + Kubernetes Docker on SoftLayer by Rancher](http://qiita.com/cyberblack28/items/d1c6259c137c7c71703b)
- [Rancherでdocker管理体験](http://qiita.com/devopsCoordinator/items/19a5206488f363f4328c)
- [Dockerで本格的なサーバーを構築する](http://qiita.com/okamu_/items/da52b4dc12221feca55c)
- [meetupも開催されています](https://rancherjp.connpass.com/event/45768/)

## 経緯
- だいぶ昔にはまったのですが、同じ方がいらっしゃったので共有します

## resolv.confじゃ反映されませんでした
```
$ sudo ros config get rancher.network
$ sudo ros config set rancher.network.dns.nameservers "['192.168.x.x']"
```

## networkを再起動します
```
$ sudo system-docker ps
$ sudo system-docker restart network 
```

## 余談
- `sudo system-docker `でいろいろ再起動できます