OmniAICreator/Qiita-1.07M huggingface dataset:
なんとなくPythonでセル・オートマトンつくった。

とりあえずPythonで。
===
普段業務では基本PHP、たまにnginxまわりでlua使っています。
プライベートではPerlをおぼえようとしていたり。

PHPやPerlは後からオブジェクト指向の考え方が取り入れられたと聞く。
ので初期からそれが盛り込まれていた言語をなにか覚えようかなっと、とりあえずPythonを選んだ。

RubyとPythonでどっちにしょうかなってところだったんだけど、Raspberry piが標準に選んだのがpythonだったなあという理由からこっちにした。
バージョンは3.6。

さわり始める前の印象。
===
- インデント強制気持ちわるい。
- {}欲しい。
- 初心者向けって一時期喧伝されてたなあ。
- 実装シンプルになるって聞いた。

とりあえず学生時分はあんまりそそられないなあって印象だった。(おもにインデント強制が)


基本セル・オートマトンつくった。
===
## パッケージ管理。
composerやcartonみたいなパッケージ管理ツールを探したけれど、Pythonの場合はちょっと考え方が違うらしい。
プロジェクトごとの環境をつくってプロジェクトごとに環境を切り替える感じなよう。
`pip freeze` と `virtualenv` を使った方法が割とメジャー？
`pipenv` なるものが簡単そうだった。 上の二つを総合的に扱うためのツールだとか。
https://github.com/kennethreitz/pipenv
https://qiita.com/subarunari/items/dcbdad68ba1809b721b9
今回は標準モジュールで事足りたので使ってはいない。

## 各種操作。

```
# listの初期化 0 を 151 個並べる
default_init = [0 for i in range(151)]
```

```
roule = list(format(args.roule, 'b').zfill(8))
roule.reverse()

# 文字列をlistに変換
# list(str)

# 数値を二進数表記の文字列に変換
# format(int, 'b').zfill(8)
# zfill(8) 8桁になるよう0で埋める

# 配列を逆順にする
# roule.reverse()
```

書いててあって楽だなあと思ったのはこの辺り。

## class。
classの定義はこう。

```
from typing import List

class Cell:

    def __init__(self, roule: List[int], init_status: int):
        self._roule        = []
        self._around_cells = []
        self._situation    = None
        self._status       = init_status

        self.setRoule(roule)

    def setRoule(self, roule: List[int]) -> None:
        self._roule = roule
```
型ヒント使っているけどドキュメントこんなこと言っているのでどうなんだろう。
> 注釈 typing モジュールは 暫定的に 標準ライブラリに追加されました。マイナーリリースの間でもコアデベロッパーが必要だと判断した場合は、新機能の追加や API の変更がなされることがあります。

https://docs.python.jp/3/library/typing.html

Pythonではファイルをモジュール、ディレクトリをパッケージと呼ぶみたい。
ディレクトリをパッケージとして使用するためには `__init__.py` というファイルを置くらしい。
けど別になくても一応使える。
んだけどimportするとき気持ち悪いのでやっぱり置いたほうがいいと思う。
中身はこんな感じ。

```
from .Cell import Cell
from .LineOfCell import LineOfCell
```

## コマンドライン引数解析。
argparse っていうのが標準ライブラリにあった。
https://docs.python.jp/3/library/argparse.html
https://qiita.com/sesame/items/3c03ac7ebeecb060af4f

```
parser.add_argument(
        '--roule', '-r', metavar = 'roule', type = int,
        required = False, default = 30,
        help = 'roule of cell automaton. default: 30'
        )
```

自分的には PHP, Perl とかよりいい感じな気がする。

## できたもの。
githubへあげています。
https://github.com/yoko-chance/BasicCellAutomaton

ここまでさわってみてからの印象。
===
- インデントでブロック表現ってのはよくできた仕様だなあ、だれが書いても同じだもの。
- それでも{}は欲しい気がする。
- コメントで区切るってのもありなのかなあ。
- 区切らないと見づらいようなでかいブロックにするのがわるいってのも大きいので一概には言えないとは思う。
- なんというかわりとあっさりと実装できたので初心者向けってのもわかる気がする。
- フレームワークとかでなんとかなるのかなと思いつつ、いちいち第一引数に `self` いるのがたまにむっとなる。

わりかしすらすらっと使えた。
最低限できれいなコードにはなるし、たしかにプログラミング初学者にはおすすめしたくもなる。
今回は特段使用していないが数学的な処理用ライブラリも揃っているとのことなので、音響とかビジュアル表現とかそういう分野で楽しくできそう。

ちょいちょい使っていきたいなと思う。

*
*
*

この記事は **株式会社ソニックムーブ Advent Calendar 2017** 14日目の記事です。
アドベントカレンダーはこっち。 -> https://qiita.com/advent-calendar/2017/sonicmoov
ソニックムーブについてはこっち。 -> https://www.sonicmoov.com
jmeterで負荷試験する際の設定値決めをがんばった。

思うように負荷がかけられない...。
===

過去二度三度jmeterを使って負荷試験を行うことがあったがいつもjmeterの設定値を決めるのに苦労する。
毎度計算式から試行錯誤するがいまいち期待する負荷にならない。
ターゲットスループットの設定が毎分単位なので、秒間のリクエスト数をねらった値にするのが度し難い。

おおまかな前提。
===
- awsにインスタンスを複数台立てて実施。
- serverに期待するスループット値を想定、秒間平均同値のリクエストを一定時間かける。
- スレッドグループの `スレッド数` ・ `ループ回数`、 `定数スループットタイマ` を設定してリクエスト数を制御する。

いままで使っていた考え方。
===
- 一度のループで各サーバ各スレッド全体がなげる総リクエスト数が期待するスループット値と同等とする。
- ループの回数は試験時間と一スレッドに含まれるリクエスト数に依存する。
- 一分間で処理されるスレッドののべ数。 -> 定数スループットタイマの設定値。

比較的低いスループットを想定して行っている間はいいのだけど、値が大きくなるごとに(サーバにかかる負荷があがるごとに)処理待ちが発生してしまってうまくリクエスト数を伸ばせなかった。

## ダメだった点。
一回のリクエストのレスポンスタイムを考慮していなかった。

だから比較的少量の負荷時はずれが少なかったが負荷があがるにつれズレが大きくなっていった。
nginxで処理が終わるようなものならある程度許容できる誤差かなともおもったが、phpで処理しているやつなんかは結構想定とずれて大変だった。。

今回新しく考慮した点。
===
- いままで **点** で考えていたリクエストを(レスポンスタイムを考慮して) **線** と考える。

## 新しい考え方で試験した結果。
- かなりの確度で想定値に近づいた。
- リクエストが気持ちよく伸びる。
- 想定値をあげても誤差はそこまで広がらない。

〆
===
以上の考え方で組んだ計算式をgithubにあげました。
https://github.com/yoko-chance/jmeter-calc

そのままいつでも使えるかどうかはわからないけど、参考になるところはしてもらえれば...。
他の人がどんな感じで値決めているのかが気になるところ。

*
*
*

この記事は **株式会社ソニックムーブ Advent Calendar 2017** 7日目の記事です。
アドベントカレンダーはこっち。 -> https://qiita.com/advent-calendar/2017/sonicmoov
ソニックムーブについてはこっち。 -> https://www.sonicmoov.com
iOS11でkeyboardの高さを正しく取得する

## 問題
よくScrollView+TextFieldのような画面で、キーボードが隠れないようにするためにキーボードの開閉の通知を受け取ってscrollInsetをいい感じに調整したりする場合があります

```swift
    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: .UIKeyboardWillShow, object: nil)
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: .UIKeyboardWillHide, object: nil)
    }

    @objc private func keyboardWillShow(_ notification: Notification) {
        guard let userInfo = notification.userInfo as? [String: Any] else {
            return
        }
        guard let keyboardInfo = userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue else {
            return
        }
        guard let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey] as? Double else {
            return
        }
        let keyboardSize = keyboardInfo.cgRectValue.size
        let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0) //←
        UIView.animate(withDuration: duration, animations: {
            self.scrollView.contentInset = contentInsets
            self.scrollView.scrollIndicatorInsets = contentInsets
            self.view.layoutIfNeeded()
        })
    }

    @objc private func keyboardWillHide(_ notification: Notification) {
        scrollView.contentInset = .zero
        scrollView.scrollIndicatorInsets = .zero
    }
```


しかし、iOS11だと上記処理のうち、 `keyboardSize.height` が0になってしまう問題があるようです。

これにハマって、最初の1回目のキーボード表示では高さが取得できていい感じにinsetが調整されるものの、2回目以降、アプリを再起動するまでずっと0になってて... :innocent: 


## 修正方法
`UIKeyboardFrameBeginUserInfoKey` を `UIKeyboardFrameEndUserInfoKey` に変更します。

```swift
guard let keyboardInfo = userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue else {
    return
}
```

いままでBeginとEndとあってどっち使うんだって思っていたんですけど、Endの方を使っておけば大丈夫そうです。

## 参考
- [stackoverflow](https://stackoverflow.com/questions/45689664/ios-11-keyboard-height-is-returning-0-in-keyboard-notification)
VARCHAR2型の制限拡張機能を試す

Oracle Databaseでは可変長文字列を格納するデータ型としてVARCHAR2を使います。大規模データにはCLOB型を使うこともあります。またNVARCHAR2型やNCLOB型を使うこともあります。
ここではVARCHAR2型の制限について書いてみます。

# VARCHAR2型の制限
Oracle Database 12c Release 2のリファレンス・マニュアル(E72905-02)にはVARCHAR2型の制限について以下のように書かれています。

> 最大サイズ: 4000バイト、または32767バイト(MAX_STRING_SIZE初期化パラメータがEXTENDEDに設定されている場合)

https://docs.oracle.com/cd/E82638_01/REFRN/datatype-limits.htm#GUID-963C79C9-9303-49FE-8F2D-C8AAF04D3095

# セマンティックスの違い
Oracle Databaseの文字列型の指定には、最大バイト数を指定する「バイト・セマンティックス」と文字数を指定する「キャラクタ・セマンティクス」を選択することができます。
以下の例ではtable1テーブルの作成ではキャラクタ・セマンティクスを、table2テーブルの作成ではバイト・セマンティクスを指定しています。

```
SQL> CREATE TABLE table1(c1 VARCHAR2(10 CHAR)) ;

Table created.

SQL> CREATE TABLE table2(c1 VARCHAR2(10 BYTE)) ;

Table created.
```

省略時の値は、初期化パラメーターnls_length_semanticsに依存し、デフォルト値はBYTEです。
データベースの格納文字コードがAL32UTF8の場合（UTF-8）、漢字のバイト数は3バイトまたは4バイトになります。このためすべて漢字データの場合、VARCHAR2型の列に格納できるのは1000文字までになる可能性があります。

最大バイト数が4,000と言いながら、Oracle Database 12cは下記のようにCREATE TABLE文でVARCHAR2(4000 CHAR) の指定を許します。

```
SQL> SHOW PARAMETER max_string_size ;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
max_string_size                      string      STANDARD

SQL> CREATE TABLE table3(c1 VARCHAR(4000 CHAR)) ;

Table created.

SQL> DESCRIBE table3
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 C1                                                 VARCHAR2(4000 CHAR)
```

下記の例はtable3テーブルのc1列に漢字を1,024文字（=3,072バイト）格納しています。
この文字列を２倍に拡大しようとして失敗しています。

```
SQL> SELECT LENGTH(c1), LENGTHB(c1) FROM table3 ;

LENGTH(C1) LENGTHB(C1)
---------- -----------
      1024        3072

SQL> UPDATE table3 SET c1=c1 || c1 ;
UPDATE table3 SET c1=c1 || c1
       *
ERROR at line 1:
ORA-01489: result of string concatenation is too long
```

テーブル定義上は4,000文字格納できますが、実際にはそこまで格納できないことがわかります。
このため、列定義にキャラクタ・セマンティクスを使用する場合は以下の点に注意が必要です。

1. 4,000バイトを超えないことを確認する
2. 初期化パラメーターmax_string_sizeをEXTENDEDに指定する
3. CLOB / NCLOB型を使う

# max_string_size = EXTENDED の影響
初期化パラメーターmax_string_sizeをEXTENDEDに指定することで、VARCHAR2型の最大長は32 KBまで拡大することができます。内部的にはBLOBデータになりますが、アプリケーションからはVARCHAR2型として認識されます。そこでOracle Database Client 11gからVARCHAR2(5000) 列のデータを検索してみました。

```
$ sqlplus SCOTT/pass@db12c

SQL*Plus: Release 11.2.0.4.0 Production on Thu Nov 16 15:47:28 2017

Copyright (c) 1982, 2013, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> DESCRIBE data1 
 名前                                    NULL?    型
 ----------------------------------------- -------- ----------------------------
 C1                                                 VARCHAR2(5000)

SQL> SELECT LENGTHB(c1) FROM data1 ;

LENGTHB(C1)
-----------
       4096

SQL> SELECT c1 FROM data1 ;
SELECT c1 FROM data1
*
ERROR at line 1:
ORA-24920: column size too large for client

```

上記の結果から、4,000バイトを超えるVARCHAR2型の列は旧バージョンのクライアントからは検索不可能であることがわかります。Oracle Database 11gのJDBC Driverを使ったアプリケーションでも同様の動作になりました。
システムフォントの文字化け

# システムフォントの文字化け（？）

Xcodeのシミュレーターや、
iPhoneの実機を使用してテスト中に、
日本語のフォントが一部中国語っぽくなってしまうことがあります。
（文字化けではなく、システムフォントが使われない事が原因のような気もしますが…）

# 対処方法

システムフォントを使用している箇所について、
実機にて、USBを抜いた状態でテストしたところ、フォントが直りました。
（実機でのテストでも、USBをつないでいるとフォントがおかしくなりました）

（Xcode9.1使用）
RAD Studio, C++Builder, Delphi 旧バージョンライセンスの入手手順

RAD Studio、C++Builder, Delphi の XE バージョン以降では、購入したバージョンだけではなく、旧バージョンのライセンスを使用することができます。

※ この記事を更新した 2018 年 12 月 12 日現在、このサービスが有効なのは、10.3 Rio と 10.2 Tokyo のライセンスです。

以下、ライセンスの入手手順です。

##入手手順

1. 購入したライセンスを、[EDN (Embarcadero Developer Network)](http://edn.embarcadero.com/jp) のアカウントに登録します。
アカウントを持っていない場合は、[メンバーズサイト](https://members.embarcadero.com/newuser.aspx?lang=jp) からアカウントを登録します。
ライセンスを登録するには
 - 製品をインストールする
 - [使用許諾ファイルをダウンロード](https://reg.embarcadero.com/srs6/activation.do)する

のいずれかの方法で登録できます。（詳しい説明は割愛します）

2.購入したライセンスのバージョン・エディションによって、以下のいずれかにアクセスします。

 - 10.3 Rio
  - [10.3 Rio Professional, Enterprise](https://reg.codegear.com/srs6/promotion.jsp?promoId=544)
  - [10.3 Rio Architect](https://reg.codegear.com/srs6/promotion.jsp?promoId=546)

 - 10.2 Tokyo (2018 年 12 月 31 日までの提供)
  - [10.2 Tokyo Professional, Enterprise, Add-on Pack](https://reg.codegear.com/srs6/promotion.jsp?promoId=444)
  - [10.2 Tokyo Architect](https://reg.codegear.com/srs6/promotion.jsp?promoId=446)
  - [10.2 Tokyo アカデミック版 Professional, Enterprise](https://reg.codegear.com/srs6/promotion.jsp?promoId=445)
  - [10.2 Tokyo アカデミック版 Architect](https://reg.codegear.com/srs6/promotion.jsp?promoId=447)

3.Serial Number の部分に購入したライセンスの Serial Number (インストール番号) を入力して、「無償製品の取得」ボタンをクリックします。
4. 旧バージョンがツリー形式で表示されます。取得したいバージョンにチェックをつけて「取得」または「Redeem」のボタンをクリックします。
5. アカウントに登録されている email アドレスに、ライセンスとインストーラのダウンロード先に URL が記載されたメールが届きます。

これで入手完了です。

###注意

- 旧バージョンのライセンスは、購入したライセンスと同じひとつの指名ユーザーライセンスとみなされます。10.1 Berlin を Aさん、 10.2 Tokyo を B さんで使うということはライセンス違反になります。
- 使用している EDN アカウントに旧バージョンのライセンスが登録されている場合、登録されているバージョンのライセンスは供給されません。
- ネットワークライセンス (Network named/Network concurrent) の場合、旧バージョンのライセンスは、購入したバージョンのライセンスに含まれますので、ここで紹介している方法は利用できません。
- 10.3 Rio のアカデミック版のライセンスは安価な期間ライセンスになったため、１年間の保守はありますが、過去バージョンのプロモーションは提供されません
スクリプトの作り方&貼りつけ方

①C#スクリプト作り
![スライド1.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/2caf90e2-96c3-e5f6-4494-056a469d1136.png)
②スクリプトに名前をつける
![スライド2.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/4a74a249-a52b-b55c-3f24-2b7cd1fce4c0.png)
③スクリプトを入力する
![スライド4.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/f71372d9-94c8-0d2a-4746-c5f289e6b447.png)
④オブジェクトにスクリプトを貼り付ける
![スライド3.PNG](https://qiita-image-store.s3.amazonaws.com/0/214359/6bc3be78-72bd-e1e1-7c98-b8a436473c7b.png)

[目次に戻る](https://qiita.com/takasaki19841121/items/55daf89bbd2e0998a16c)
RddshiftからS3へUNLOADする


[S3へ書き出したDynamoDBデータをRedshiftへコピーする [Copyコマンドについて]](https://qiita.com/Yuki_BB3/items/d24c22198035915d218e)の逆をする。

UNLOADコマンドを使用する際の個人的な確認用まとめ

# 構文（抜粋）

```
UNLOAD ('select-statement')
TO 's3://object-path/name-prefix'
authorization
[ option [ ... ] ]

where option is

{ MANIFEST
| DELIMITER [ AS ] 'delimiter-char' 
| FIXEDWIDTH [ AS ] 'fixedwidth-spec' }  
| ENCRYPTED
| BZIP2  
| GZIP     
| ADDQUOTES 
| NULL [ AS ] 'null-string'
| ESCAPE
| ALLOWOVERWRITE
| PARALLEL [ { ON | TRUE } | { OFF | FALSE } ]
[ MAXFILESIZE [AS] max-size [ MB | GB ] ]
```

相変わらずわかりにくい構文っすよね。。。

### 簡単なサンプル

```sql:sample
UNLOAD ('SELECT * FROM test;')
TO 's3://mybucket_name/target_dir/'
CREDENTIALS 'aws_access_key_id=<キー>;aws_secret_access_key=<シークレットキー>'
MANIFEST
DELIMITER AS '\t'
GZIP
ALLOWOVERWRITE
```

### UNLOAD ('select-statement')
SQL文を書く。途中で `''` を使用したい場合はちゃんとエスケープすること `\'\'`

### TO 's3://object-path/name-prefix'
出力先のS3を指定する。
`object-path` 配下に `name-prefixXXXXXXXXXXXX` で作成される。

### CREDENTIALS
COPYにも書いたけどIAMなりクレデンシャルキーなり指定する

## オプション指定

```:一覧
MANIFEST
DELIMITER [ AS ] 'delimiter-char' 
FIXEDWIDTH [ AS ] 'fixedwidth-spec' }  
ENCRYPTED
BZIP2  
GZIP     
ADDQUOTES 
NULL [ AS ] 'null-string'
ESCAPE
ALLOWOVERWRITE
PARALLEL [ { ON | TRUE } | { OFF | FALSE } ]
MAXFILESIZE [AS] max-size [ MB | GB ] ]
```

幾つかかいつまんで

### MANIFEST

> UNLOAD プロセスによって作成されたデータファイルを明示的にリストするマニフェストファイルを作成します。

### DELIMITER

> パイプ文字 (|)、カンマ (,)、タブ (\t) など、出力ファイル内のフィールドを分離する単一の ASCII 文字。デフォルトの区切り文字はパイプ文字です。

### BZIP2/GZIP
出力時に圧縮して出力する

### ADDQUOTES

> アンロードされた各データフィールドは引用符で囲まれるため、Amazon Redshift は区切り文字自体を含んでいるデータ値をアンロードすることができます。

出力データに区切り文字が含まれている場合、カラム毎に `””` で囲んで出力してくれる機能
読み込み時の使い方に寄る。

### NULL AS 'null-string'
NULL文字の置き換え

### ALLOWOVERWRITE

> デフォルトでは、UNLOAD によってファイルの上書きが発生する可能性がある場合、その UNLOAD 操作は失敗します。ALLOWOVERWRITE が指定された場合、UNLOAD によって、マニフェストファイルを含めた既存のファイルが上書きされます。

ファイルが存在すると上書き禁止でエラー終了する。
これを指定すると上書きする。

### MAXFILESIZE AS 最大サイズ [ MB | GB ]

> Amazon S3 で作成された UNLOAD ファイルの最大サイズ。5 MB ～ 6.2 GB の十進値を指定します。AS キーワードはオプションです。デフォルト単位は MB です。MAXFILESIZE を指定しない場合、デフォルトの最大ファイルサイズは 6.2 GB です。

> マニフェストファイルが使用されている場合、このサイズは MAXFILESIZE に影響されません。


### LIMIT

> SELECT クエリは、外部の SELECT で LIMIT 句を使用することはできません。その代わり、ネスティングされた LIMIT 句を使用してください。

```sql:sample
SELECT 
 * 
FROM 
 test 
WHERE id IN (
  SELECT 
   id
  FROM 
   test
  LIMIT 100
);

```

こんな感じにしろとのこと。


# 参考
[UNLOAD](http://docs.aws.amazon.com/ja_jp/redshift/latest/dg/r_UNLOAD.html)
Three.jsのoutline effect(とtoon rendering)の使い方

three.jsはwebGLを簡単に扱えるライブラリー。
ウェブ上で3Dっぽいエフェクトとか色々できる。
ググっても情報があんまりなかった&サンプルのパラメーターのキーが間違ってて動いてなかったので書いときます。

ThickNessはThickness or thickness !

# 準備
three.js本体 (https://threejs.org/)
サーバーとかウェブサイトが作れるスペース or 仮想サーバー

#　使うライブラリと記述

今回は適当なオブジェクトをトゥーンレンダリングしたい。
使うjsは以下、使うやつだけ抜き出してjsディレクトリに格納。

* three.min.js 
* TrackballControls.js - マウスでぐりぐり動かすやつ　three.jsのexampleとかに入ってる
* OrbitControls.js - 極座標を中心にカメラを動かす　これもexampleとかに入ってる
* OutlineEffect.js - オブジェクトの周りに輪郭線をつけてくれる

これ以外に、hogehoge.jsを作って記述。

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1.0">
    <title></title>
  </head>
  <body>

  <script src="js/three.min.js"></script>
  <script src="js/TrackballControls.js"></script>
  <script src="js/OrbitControls.js"></script>
  <script src="js/OutlineEffect.js"></script>

  <script src="js/hogehoge.js"></script>

  </body>
</html>

```

``` javascript:hogehoge.js
window.addEventListener('load', init);

var scene;
var camera;
var renderer;
var controller;
var point;
var effect;

function init() {

  scene = new THREE.Scene();
  scene.updateMatrixWorld(true);

  // カメラ

  camera = new THREE.PerspectiveCamera(45, 1, 1, 2000);
  camera.lookAt(new THREE.Vector3(0, 0, 0));

  // レンダラー
  renderer = new THREE.WebGLRenderer({antialias: true, alpha: true });
  renderer.setPixelRatio(window.devicePixelRatio);
  renderer.setSize(window.innerWidth, window.innerHeight);
  renderer.setClearColor(0x000000, 1);
  document.body.appendChild(renderer.domElement);

  // カメラコントローラー
  controller = new THREE.OrbitControls(camera);

  // オブジェクト
  const geometry = new THREE.SphereGeometry(100, 40, 40);
  const ball = new THREE.MeshToonMaterial({　//toon materialを使うと簡単にトゥーンレンダリングっぽくなる。オプションは適当に。
    transparent:true,
    opacity:1,
    color: 0xffffff,
    shininess: 1
  });

  //ボールにだけ別の色のアウトラインをつけたいので、mesh materialにoutlineParametersを設定する
  // OutlineEffect.js の上の方にサンプルが書いてあるけど、パラメーターのキーが間違ってるので

  ball.outlineParameters = {
    thickness: 0.007,
    color: new THREE.Color( 0xffffff ),
    alpha: 10,
    visible: true,
    keepAlive: true
  }

  scene.add(ball);

　　　　// ライティング
  var directionalLight = new THREE.DirectionalLight( 0xffffff, 1);
  directionalLight.position.set( 100, 100, 100);
  scene.add( directionalLight );

  // エフェクト
  // デフォルトの色や太さを設定できる。outlineParametersが設定されていないものはこちらが適用される
  effect = THREE.OutlineEffect( renderer, {
    defaultThickness: 0.01,
    defaultColor: new THREE.Color( 0x888888 ),
    defaultAlpha: 0.8,
    defaultKeepAlive: true
  } );

  // レンダリング
  effect.render( scene, camera )
}


```
CUDA環境の構築について

ご質問失礼いたします。

昨日人工知能の計算においてGPUを利用したく思いダウンロード等を行ったのですが上手くいかなく困っております。ご助力いただけますと幸いでございます。

[環境]
Windows10/Chainer(2.1.0)/Anaconda5.0.1(python3.6)/CUDA9.0/Visual Studio2017
テキストエディタAtomにCODEを記述し、コマンドプロンプトで起動したいです。

>python train_mnist.py -g 0
※Githubから拝借したGPUが作動しているか確認するためのpyファイルです。
https://github.com/chainer/chainer/blob/master/examples/mnist/train_mnist.py


しかしながら以下のエラーをはいてしまいました。
>RuntimeError: CUDA environment is not correctly set up
(see https://github.com/chainer/chainer#installation). No module named 'cupy'

以下がそれに対し試行錯誤した記録です。

(1)chainerのuninstallおよびinstall -> 変化なし
(2)cupyのinstall ※以下がエラー内容です
>Exception: Traceback (most recent call last):
  File "F:\artificial_intelligence\python\lib\site-packages\pip\compat\__init__.py", line 73, in console_to_str
    return s.decode(sys.__stdout__.encoding)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 19: invalid start byte

>During handling of the above exception, another exception occurred:

>Traceback (most recent call last):
(中略）
**UnicodeDecodeError**: 'utf-8' codec can't decode byte 0x96 in position 19: invalid start byte

(3)UnicodeDecodeErrorが原因かと思い以下サイトを参考に文字CODEをUTF-8に変更　-> 変化なし
https://groups.google.com/forum/#!topic/chainer-jp/76eRJTMUQX0

参考になるかわかりませんが、Visual Studioを起動し新規プロジェクトを開くとNVIDIAよりCUDA9.0でプロジェクトを新規作成できるようになっているのでCUDAのダウンロード自体はうまくいったのかと思っております。

ご助力いただけますと幸いでございます。
何卒よろしくお願いいたします。
vim操作の基本

モードは３種類。
  ・コマンドモード(:)
  ・インサートモード(i)
  ・ビジュアルモード(v)

基本のコマンドは以下の通りです。
      H←  J↓  K↑  L→
      ^         行の先頭に移動
      $         行の末尾に移動
      ctrl + f 次の画面に移動
      ctrl + b 前の画面に移動
      w         次の単語に進む
      b         前の単語に戻る
      x         文字を削除
      dd       1行切り取り
      yy       現在行をコピー
      p         ペースト
      /文字    Enterで検索開始。
      u         前の操作を取り消す
さくらエディタ置換備忘録

### 該当行以外削除
- solrとかの結果からpathだけ取り出したい時があるので「/hoge/piyo/」で始まる行以外消すとかしたい

Ctrl+R -> 置換前：```^(?!^/hoge/piyo)``` 置換後：なにもなし -> 置換対象：行削除 -> すべて置換

正規表現チェック、スラッシュの前に円マークいらないのか。
Unity編目次

# [ゲタバコ先生のホームページ遊びに来てね♪](http://getabako.wp.xdomain.jp/)

[blenderで車のモデリングをしてから、ペジェでコース作って、Unityでマリオカートみたいなレーシングゲームにするてんこもりなチュートリアル](https://qiita.com/Getabako/items/18d8e8be941413347595)

[Unityの便利機能を使いこなそう #1 Terrainでステージを作ろう](http://getabakoclub.com/2018/09/21/unity%E3%81%AE%E4%BE%BF%E5%88%A9%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%9D%E3%81%86-1-terrain-skybox%E3%81%A7%E3%82%B9%E3%83%86%E3%83%BC%E3%82%B8%E3%82%92%E4%BD%9C/)

[【初心者向け】Unityで3Dシューティングを作るチュートリアル](https://qiita.com/Getabako/items/f2d3f1f92f187ed77f31)

[Scratch → Unity対応表を使って迷路ゲームを作ってみよう](https://qiita.com/Getabako/items/7f7035aad0e573849bef)

[ScratchのブロックをUnityに対応させてみた](https://qiita.com/Getabako/items/9efaa6e48c29e7df3a7e)

[3Dアクションシューティング①](https://qiita.com/Getabako/items/0950f09c1f416b7bc406)
[3Dアクションシューティング②](https://qiita.com/Getabako/items/839cfa286a8a156898e1)
[3Dアクションシューティング③](https://qiita.com/Getabako/items/d51921123236ada61d7e)
[3Dアクションシューティング④](https://qiita.com/Getabako/items/32278941267f9a6a3c78)

[スクリプトの作り方＆貼りつけ方](https://qiita.com/takasaki19841121/items/4756327b6801a1efad6b)

[ThirdPersonControllerをベースにしたオリジナルキャラの移動とアニメーションの遷移](https://qiita.com/Getabako/items/4219c2b43c3860060013)

[一定距離のカメラ](https://qiita.com/takasaki19841121/items/4560f2d11fbf02cbd453)

[NavmeshAgentを使用した敵の追跡](https://qiita.com/takasaki19841121/items/ce6aea489ab0139c85de)

[剣での攻撃と当たり判定の作成
※パンチとかキックは判定を手や足につければできるよ♪](https://qiita.com/takasaki19841121/items/4d636f3d1c3017a0824e)

[コンボ攻撃](https://qiita.com/Getabako/items/6f42b0f0edff28aa1004)

[プレイヤーが近づいたら会話するキャラクター※編集中](https://qiita.com/Getabako/items/ce0164f50d3b1734c230)

[体力ゲージとダメージ処理※編集中](https://qiita.com/Getabako/items/ca128cb6b2505d480a9e)

[タイトル画面※編集中](https://qiita.com/Getabako/items/26f4bbeca35e63cd77fd)

[プレイヤーが乗ったら足場から落ちないようにする(プレイヤーの子オブジェクトにする)※編集中](https://qiita.com/Getabako/items/b6435b02b302239f7a32)

[行ったり来たりするオブジェクト※編集中](https://qiita.com/Getabako/items/f739be4bc1af009494b5)

[何秒かたったらタイトル画面に戻る※編集中](https://qiita.com/Getabako/items/024620cc78cb5daf5e0a)

[左クリックで弾を飛ばす※編集中](https://qiita.com/Getabako/items/c3e2408c12fdc2f91760)

[プレイヤーの移動と攻撃 Verバーチャルパッド対応版](https://qiita.com/Getabako/items/7ac1f65a37705359b6bb)

[プレイヤーの上下左右の移動と攻撃※編集中](https://qiita.com/Getabako/items/76532e0acb9dde4f9e47)

[パーティクルを消す※編集中](https://qiita.com/Getabako/items/6b7f168a5d9256507c3b)

[敵を全員倒したらクリア※編集中](https://qiita.com/Getabako/items/a473fcd0e29cb283a4b9)

[アニメーションを一回で終了させる※編集中](https://qiita.com/Getabako/items/ead9961e6c1221c20cdb)

[ダメージ処理(弾に触れたら爆発)※編集中](https://qiita.com/Getabako/items/f178aa5276be3c5deb3d)

[ランダムな場所にクローン生成※編集中](https://qiita.com/Getabako/items/402c78910b4f58d54433)

[カメラの横移動とオブジェクトを中心に回転](https://qiita.com/Getabako/items/653c9a7887261c18bdef)

[目次へ戻る](https://qiita.com/Getabako/items/ab1bb2e1b0cbb7dd7c68)

[ゲタバコ先生のホームページ遊びに来てね♪](http://getabako.wp.xdomain.jp/)
LaravelでBasic認証を設定値で切り替える

LaravelのBasic認証を設定値で切り替えます。

## 独自のミドルウェアを作る

元のBasic認証のミドルウェアは

```
Illuminate/Auth/Middleware/AuthenticateWithBasicAuth.php
```

なのでこれを継承して独自のミドルウェアを作ることにします。

```php:App/Http/Middleware/CustomAuthenticateWithBasicAuth.php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Auth\Middleware\AuthenticateWithBasicAuth;
use Illuminate\Contracts\Auth\Factory as AuthFactory;
use Illuminate\Contracts\Config\Repository as Config;

class CustomAuthenticateWithBasicAuth extends AuthenticateWithBasicAuth
{
    private $config;

    public function __construct(AuthFactory $auth, Config $config)
    {
        parent::__construct($auth);
        $this->config = $config;
    }

    public function handle($request, Closure $next, $guard = null)
    {
        if ($this->config->get('app.basic_auth')) {
            return parent::handle($request, $next, $guard);
        }

        return $next($request);
    }
}
```

設定の値を取得するためにコンストラクタで`\Illuminate\Contracts\Config\Repository`を受け取るようにしました。

`$this->config->get('app.basic_auth')`の値でbasic認証の親クラスに流すか、どうかを分岐します。


## ミドルウェアを差し替える

```php:app/Http/Kernel.php
<?php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{

・・・　中略 ・・・

    /**
     * The application's route middleware.
     *
     * These middleware may be assigned to groups or used individually.
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \App\Http\Middleware\CustomAuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    ];
}

```

`auth.basic`の部分を`CustomAuthenticateWithBasicAuth`に差し替えます。

## 設定値を追加
```php:config/app.php
<?php

return [

     ・・・　中略 ・・・

    /*
     |--------------------------------------------------------------------------
     | Basic Auth Configuration
     |--------------------------------------------------------------------------
     */

    'basic_auth' => env('BASIC_AUTH', false),

]
```


```text:.env
BASIC_AUTH=true
```
「ゆるふぁい」の話

Delphi のゆる~い集まり「ゆるふぁい」を月１のペースで開催しています。

ゆるふぁいでは、最初にゆるーい LT を必ず１本入れています。
その LT には、参加してくださった方への質問を入れ込んでいます。
参加者同士、共感できることがあったり、あーそんなこともあったんだという発見があったり

そのあとはフリートーク的な感じで進めています。

[今回](https://connpass.com/event/69931/) (2017年 11月 15日 - #1) は、

- LT : Delphi との出会いは？
- 文字幅の話
- グラフの描画
- お勧めプラグイン、サードパーティ製ソフト
- Delphi 製のアプリケーションって何がある？
- インストーラ

などの話題を井戸端会議な感じで話していました。

- Delphi に関する情報交換したい
- 周りに Delphiやってるひとがいなくて寂しい
- 無償版の Starter Editionで Delphi を始めたいけど何から始めたらいいのやら...

ゆるーい感じで集まってみませんか？
お気軽にご参加ください。 途中入室・退出はご自由に でございます。
CodeMirrorでスマホからの日本語入力をなんとかする

## 前提

* CodeMirror 5.31.0 について記述しています。
* iPhone6s、iOS10.3.3、Mobile Safari で遭遇した問題について記述しています。

## 問題点

CodeMirrorには２つの入力モードが用意されており、それは`inputStyle`というオプションで切り替えることができる。
なのだけれど、スマホから使用した時、日本語入力（というかIME）に関しては、この2つの入力モードのどちらでも何かしらの問題が発生する。

### inputStyle = textarea

見えないテキストエリアを使用して入力を行う方式。
入力しているテキストエリアと、表示されているcontenteditableなエディタ部分の要素との違いが問題を発生させる。文章をタッチするとtextareaが起動してイベントを拾ってしまうため、文字選択ができない問題がある。
入力は問題なくできるように思えるが、IMEで確定前の文字を削除すると文字が二重で入力されたりする。

### inputStyle = contenteditable

contenteditableの要素に直接入力する方法。直接といってもキー入力をエミュレートしてCodeMirror内で複雑なことをしているのだけれど・・。
この入力方式の場合は致命的な問題がある。なんとIMEがきかない。たとえば、「て」と入力した時点で「て」が確定されてしまい、「手」のような漢字に変換することができない。

まとめるとこうなる。つまりCodeMirrorを日本で使う場合は、モバイルでまったく使い物にならない。

||textarea|contenteditable
| --- | --- | --- |
| IME入力 | ○ | × |
| IME入力中の文字削除 | × | × |
| 文字選択 | × | ○ |
| 絵文字キーボードでの入力 | ○ | × |
| 3Dタッチによるカーソル移動 | × | ○ |

この問題は本家で[Issue](https://github.com/codemirror/CodeMirror/issues/3137)にもなっている。

## 解決方法

イベントの流れをみると、どうやらIME入力中に`keypress`とか`keydown`が発生するのが主な原因だったようなので、IME入力中の`keypress`はキャンセルするようにした。

```js
cm = CodeMirror.fromTextArea(textarea, {inputStyle: 'contenteditable'})

if(UserAgentがモバイルであれば) {
  const origOnKeyPress = cm.display.input.onKeyPress // 元のkeypressを取得
  cm.display.input.onKeyPress = function(e) {
    // iOSの絵文字キーボードのように、サロゲートペアの直接のkeypressは、CodeMirrorの処理を通すと文字化けるのでキャンセルする
    if(e.which >= 0x10000) {
      return
    }

    if(!cm.display.input.composing) { // 文字入力中かどうかはcomposingでわかる
      cm.keyPressTimer = setTimeout( () => {
        origOnKeyPress.call(this, e)
      }, 30) // 30ms以内（適当）にcompositionstartが呼ばれなければkeypressは実行して良い
    }
  }

  const inputArea = cm.display.input.div || cm.display.input.textarea // 一応、inputStyleがどちらの状態でも大丈夫な書き方にした
  inputArea.addEventListener('compositionstart', (_cm, e) => {
    if(cm.keyPressTimer) {
      clearTimeout(cm.keyPressTimer)
    }
  }, false)

  const inputField = cm.display.input.getField()
  // IME入力中のkeydownをCodeMirrorに渡さないようにする
  window.addEventListener('keydown', function(e){
    if(e.target == inputField && cm.display.input.composing) {
      e.stopPropagation()
    }
  }, true)

  // バーチャルキーボードの「完了」ボタンを押した時に、キーボードだけが消えないようにする
  inputField.addEventListener('blur', function(e){
    if(e.relatedTarget) { // 「完了」ボタンでのblurかどうか
      return
    }
    e.stopPropagation() // stopしないと文字が二重で入力される

    if (cm.display.input.composing) {
      // 再focusが確定したらblurさせる
      inputField.focus()
      setTimeout(function(){
        inputField.blur()
      }, 1)
    }
  }, false)
}
```

## 残る問題点

とりあえずこれだけやれば日本語入力や文字の選択が普通にできた。のだけれど、IME入力中にエディタの内容が外部から書き換わった場合（CodeMirrorのAPIを使って書き換えたりした時）に、MobileSafariのタブ単位でエラーが発生し、タブが強制リロードされるという致命的な問題がある。

どうやらMobileSafariでは、contenteditableの要素に対してIMEで入力中に、対象の要素が削除されると入力した文字が行き場を失ってしまいエラーになってしまうみたいだった。
通常の使い方であれば、IME入力中にエディタの中身を書き換えるようなことはしないので大丈夫ではあるのだけれど、たとえば同時編集機能にCodeMirrorを使っていて、他のユーザからエディタ内の文字が書き換えられるようなシチュエーションでは問題になる。

これの解決方法は・・・・！！　わからない。
一定距離のカメラ

```CameraFollowPlayer.cs

using UnityEngine;
using System.Collections;

public class CameraFollowPlayer : MonoBehaviour
{
    public Transform target;    // ターゲットへの参照
    private Vector3 offset;     // 相対座標

    void Start()
    {
        //自分自身とtargetとの相対距離を求める
        offset = GetComponent<Transform>().position - target.position;
    }

    void Update()
    {
        // 自分自身の座標に、targetの座標に相対座標を足した値を設定する
        GetComponent<Transform>().position = target.position + offset;
    }
}

```
スクリプト貼り付けるオブジェクト：Main Camera
TargetにプレイヤーをD&D

![カメラ1.png](https://qiita-image-store.s3.amazonaws.com/0/214359/ec54703d-6a28-22e9-8da1-26b9d841c98a.png)

キャラクターにカメラがついていきます
![camera](https://media.giphy.com/media/26u3ZB4gZgH1QfMMU/giphy.gif)
[目次に戻る](https://qiita.com/takasaki19841121/items/55daf89bbd2e0998a16c)
Azure の DSVM (Ubuntu) で日本語デスクトップ環境を構築する

# VM の作成

今回は CLI ではなく Portal 上から作成しました。

GPU の使える NV または NC を選択するため、ディスクの種類は「HDD」固定です。
N シリーズの VM が選択出来る場所は限られているので、[ここ](https://azure.microsoft.com/ja-jp/regions/services/)から調べましょう。

![portal.azure.com_.png](https://qiita-image-store.s3.amazonaws.com/0/124014/64fe46ac-8e1f-689a-6ff3-95a1994027f1.png)

また、クォータの上限引き上げ依頼をしていない場合は、選べる VM サイズの最大コアが 10 コアになってしまい、
何も選べなくなるので、先にサポート宛に引き上げ依頼をリクエストしておく必要があります。

参考: https://qiita.com/satonaoki/items/a1d2545ca78adf540f8e

今回は NC12 を選択。

![portal.azure.com_ (1).png](https://qiita-image-store.s3.amazonaws.com/0/124014/07b060a5-c39e-8d27-ffca-bf7330c9c00c.png)

設定は特にいじらなかったので割愛して作成。

![portal.azure.com_.png](https://qiita-image-store.s3.amazonaws.com/0/124014/66a8056e-4a12-9ab8-6c2f-b8a210b6adb9.png)

# 日本語環境の構築

作りたての DSVM は locale が英語になっているので、普段からリモートで接続しながら作業する事を考えて、
GUI の日本語化と日本語入力 (Mozc) をインストールしておきます。

#### 1. SSH で接続

手元のターミナルで ssh に接続する。

```bash:bash
$ ssh ユーザー名@[IP アドレス]
```

##### 手元に SSH 接続環境が無い場合

リモートで VM に接続し、その中で Terminal を開いて操作します。
先に [5. VM にリモート接続する](#5-vm-%E3%81%AB%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B) を確認して、デスクトップにリモート接続してください。

接続したら、左上の Applications を開き Terminal Emulator を選択すれば、ターミナルが開きます。
![launch-terminal.png](https://qiita-image-store.s3.amazonaws.com/0/124014/15e6f246-53b7-6c82-4b89-bef850d4dfea.png)

#### 2. apt の更新

次のコマンドを実行してパッケージマネージャの状態を最新にします。

```bash:bash
$ sudo apt-get update && sudo apt-get upgrade -y
```

#### 3. 必要なパッケージのインストール

次のコマンドを実行して、日本語の言語パック、Mozc(IME)、Takao フォント をインストールします。

```bash:bash
$ sudo apt-get install -y \
language-pack-ja-base \
language-pack-ja \
ibus-mozc \
fonts-takao-pgothic \
fonts-takao-gothic \
fonts-takao-mincho
```

#### 4. OS のデフォルト言語を日本語にする

次のコマンドを実行します。

```bash:bash
$ sudo localectl set-locale LANG=ja_JP.UTF-8 LANGUAGE="ja_JP:ja"
```
※ ここで、SSH ではなく先に X2Go でリモート接続しながらここまで作業している場合は、
　 一旦ログアウトします（再接続するまで、日本語化されません）。
　 左上の Applications を開き Log Out を選択、その後のウィンドウでも Log Out を選択。

　 ![logout.png](https://qiita-image-store.s3.amazonaws.com/0/124014/e88c07cc-e9d0-f7de-0056-05b388d681f3.png)

#### 5. VM にリモート接続する

[MSDN のドキュメント](https://docs.microsoft.com/ja-jp/azure/machine-learning/data-science-virtual-machine/dsvm-ubuntu-intro#installing-and-configuring-x2go-client)にも書かれている通り、リモート接続には X2Go client を使います。

RDP を使う場合は `xrdp` を、VNC を使う場合は `vnc4server` などを別途インストールし、別途セットアップが必要です ([MSDN のドキュメント](https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/use-remote-desktop)にもあるので、ここでは解説しません)。

Installing the Qt-based X2Go Client
https://wiki.x2go.org/doku.php/doc:installation:x2goclient

X2Go client で接続すると、日本語環境になっています。
お疲れ様でした。
![desktop-japanese.png](https://qiita-image-store.s3.amazonaws.com/0/124014/ad31fded-c64f-5c8e-aa9d-19d01cece2ce.png)
Spring Securityで特定URLだけにHTTPヘッダ（X-Frame-Options）を設定する

# 背景
Spring-bootで埋め込み用ページを作りました。iframeで他のサイトから見せるやつ。
この際、Spring Securityを導入しておりデフォルトでHTTPヘッダの「X-Frame-Options」がDENYになり、埋め込んだページが表示されませんでした。

このX-Frame-Options自体は、普通のページではクリックジャッキングを抑止するためにDENYであるほうが良いので、埋め込み用のページだけこのヘッダを送らない設定にした方が良いと判断しました。
ただ「特定のURLだけ、X-Frame-Optionsを設定する」のが、ちょっとややこしかったので、まとめてみました。

他のHTTP Headerも、もし必要であればURL毎に設定できるようになると思います（未検証）。

# 目的
|対象URL |X-Frame-Options  |
|---|---|
|example.com/contents/embed/** |ヘッダ自体送信しない |
|上記のURL以外 |DENY（デフォルト） |

# 参考
同じ悩みの人がStack overflowに。
なので、今回はこれを参考にしました。

Disable X-FrameOptions response header for a URL Spring Security JAVA config
https://stackoverflow.com/questions/42257402/disable-x-frameoptions-response-header-for-a-url-spring-security-java-config

# 設定
同じ「configure(HttpSecurity http)」で設定すると、全URLに影響が及んでしまいます。
WebSecurityConfigurerAdapterをextendsしたものを複数用意するのが鍵だそうです。

```java
@EnableWebSecurity
public class WebMVCSecurity {
    // 認証のための設定をする。オプション。これはただのサンプルで、X-Frame-Optionsには影響しないので変えてもOK。
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user").password("password").roles("USER").and()
                .withUser("admin").password("password").roles("USER", "ADMIN");
    }

    // ここが一番大事。
    // WebSecurityConfigurerAdapterのインスタンスを作成。@Orderアノテーションで読み込む順番を設定。
    @Configuration
    @Order(1)
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            // 「"/contents/embed/**"」のように、適用したいURLを指定する。
            // 今回はヘッダ設定無しにしたかったので、「.headers().frameOptions().disable()」とした。
            // 「.headers().frameOptions().sameOrigin()」などの設定もあるので、調べてみてください。
            http.antMatcher("/contents/embed/**").headers().frameOptions().disable();
        }
    }

    // もう一つ、WebSecurityConfigurerAdapterのインスタンスを作成。
    // 「"/contents/embed/**"」に該当しないURLは、ここの設定が適用されます。
    // @Orderアノテーションを付けなかったら、他の@Orderの後に読み込まれるとのことです。
    @Configuration
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                    .formLogin();

            // などなど。プロジェクトに応じて設定してください。
        }
    }
} 
```

以上です。
Gemfile.lockアップデートガイド

# Gemfile.lockアップデートガイド

しばらくバージョンアップされていないプロジェクトの`Gemfile.lock`のアップデートは大変です。
重要な更新から順番に一歩一歩アップデートしていきましょう。
[Rails アップグレードガイド](https://railsguides.jp/upgrading_ruby_on_rails.html)
[Bunler日本語ドキュメント](http://ruby.studio-kingdom.com/bundler/guides/)
[rubygems.org](https://rubygems.org/)

（このドキュメントは随時更新します）

## 今一番更新が必要なgem１つに絞る

複数のgemを同時にアップデートするとそれによりバグった際の問題切り分けが困難になります。
`bundler update rails`のように引数として渡すことで、指定したgemのみを更新できます。
[bundle update | Bundler日本語ドキュメント](http://ruby.studio-kingdom.com/bundler/bundle_update/)

Gemfile

```ruby
# (snip)
gem 'rails'
```

Command

```bash
$ bundle update rails
```

## Bundler could not find compatible versions for gem “xxxxxx”

バージョンの依存関係解決できなかったときは以下のようなメッセージが表示され、アップデートに失敗します。

```bash
$ bundle update rspec-rails
```

> Bundler could not find compatible versions for gem "rspec-core":
>   In Gemfile:
>     guard-rspec was resolved to 4.2.8, which depends on
>       rspec (< 4.0, >= 2.14) was resolved to 3.0.0, which depends on
>         rspec-core (~> 3.0.0)
> 
>     rspec-rails (~> 3.4.1) was resolved to 3.4.1, which depends on
>       rspec-core (~> 3.4.0)

`bundler`は依存ツリーを辿りながら、登場するすべてのgemのバージョン指定の解決を試みます。
このメッセージから以下のことがわかります。

- `gem 'guard-rspec'`は`guard-rspec 3.4.1`を選択
  - `guard-rspec 3.4.1`は`rspec (< 4.0, >= 2.14)`に依存していて、`rspec 3.0.0`を選択
    - `**rspec 3.0.0**`**は**`**rspec-core (~> 3.0.0)**`**（3.0.x）に依存している**
-  `gem 'rspec-rails', '~> 3.4.1'`で`rspec-rails 3.4.1`を選択
  - `**rspec-rails 3.4.1**`**は**`**rspec-core (~> 3.4.0)**`**（3.4.x）に依存している**

`**rspec 3.0.0**`**が問題で**`**rspec-core (~> 3.4.0)**`**をインストールできない**ということです。

ですので、この場合は以下のようにアップデート対象に`rspec`を含めてやればよいことになります。

```bash
$ bundle update rspec-rails rspec
```

## アップデート幅はなるべく小さくなるようにする

一度に大きな更新をすると、非互換の変更が入り込む可能性も大きくなりますし、どのバージョンで変更があったのかも調べづらくなります。
gemにもよりますが、少なくともメジャーバージョンが上がるときは１つ、できればマイナーバージョンも１つづつ上げるようにしましょう。
しばらくバージョンアップをしていなかったプロジェクトの場合、`Gemfile`での指定ががないと一気に大きくバージョンアップしてしまいがちなので、事前に[rubygems.org](https://rubygems.org/)を確認しておきましょう。
Gemfile

```ruby
gem 'rails'
```

現在のバージョン

```bash
$ bundle show rails
/home/takeyuweb/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/rails-4.1.16
```

最新のバージョン
https://rubygems.org/gems/rails 記事作成時点で5.1.4
4.1の次のマイナーバージョン最新
https://rubygems.org/gems/rails/versions 記事作成時点で4.2.10
Gemfileを更新

```ruby
gem 'rails', '~> 4.2', '>= 4.2.10'
```

更新

```bash
$ bundle update rails
```
KotlinでのSwiftのEnum Associated Values相当のことをする方法


SwiftのEnumには便利な機能があって、enumを利用するときにenumの要素に付属する値を設定することができます。
[代数的データ型（Algebraic data type）](https://ja.wikipedia.org/wiki/%E4%BB%A3%E6%95%B0%E7%9A%84%E3%83%87%E3%83%BC%E3%82%BF%E5%9E%8B)というそうです。

例えば、Httpエラーコードのenumを定義して、statusCodeやその時のresponseをmapで設定したい場合は以下のように書けます。

```HttpErrorType.swift
public enum HttpErrorType: Error {

    case timedOutError 
    case cannotFindHost
    case cannotConnectToHost 
    case statusCode(Int, [AnyHashable: Any]?)
}
```

判定するときは、以下のように書けます

```swift
            switch errorType {
            case .timedOutError:
                print("タイムアウト")
            case .cannotFindHost, .cannotConnectToHost:
                print("サーバー接続できない")
            case let .statusCode(401, detail):
                print("ログインして")
            case .statusCode(500, _):
                print("サーバーエラー")
        }

```

そして網羅チェックもしてくれます。
例えば、timedOutErrorをswitch文に入れてなければ、```add missing case: '.timedOutError'```とコンパイラが知らせてくれます。

Kotlinのenumでは同じことができませんが、```sealed```を使えば同じようなことができます。
Kotlinの ```sealed``` はクラスの継承を制限するための修飾子です。
```sealed``` クラスはサブクラスを持つことができますが、それらのすべて同じファイルで宣言されなければなりません。 詳しくはコメント欄を確認してください。
( C#の```sealed```はJavaのfinalと同等なのでC#の人は注意です。)

```HttpErrorType.kt
sealed class HttpErrorType

object TimedOutError : HttpErrorType()
object CannotFindHost : HttpErrorType()
object CannotConnectToHost : HttpErrorType()
data class StatusCode(val code: Int, val map: Map<String, Any>?) : HttpErrorType()    
```

判定方法は、以下になります。

```kotlin
        when (errorType) {
            is TimedOutError -> print("タイムアウト")
            is CannotFindHost, is CannotConnectToHost -> print("サーバー接続できない")
            is StatusCode -> {
                when (type.code) {
                    400 -> print("ログインして")
                    500 -> print("サーバーエラー")
                    else -> print("その他")
                }
            }
        }.let { }
```

Kotlinでは、残念ながらパターンマッチができないのでStatusCodeの中身を分解して判断する必要があります。(その際にelseも必要になります)
最後の```.let{}``` は、コンパイラに網羅チェックをしてもらうために書いています。
WAA03

##データ解析基礎論 a weekly assignment A03
[課題内容](http://peach.l.chiba-u.ac.jp/course_folder/waa03.pdf)
####WAA03.1
~~~R
# データのinputと正形
par(mfrow=c(1,1))
dat <- read.csv("http://peach.l.chiba-u.ac.jp/course_folder/waa03.csv")
control <- dat[dat$condition == "control",]
medicineA <- dat[dat$condition == "medicine A",]
medicineB <- dat[dat$condition == "medicine B",]

# figure1
plot(control$w,control$blood.pressure,pch = 19,xlab = "weight",
     ylab = "blood pressure",col = "skyblue",ylim = c(60,160),xlim = c(40,80),
     main = "relationship between blood pressure and weight (by medicine type)")
abline(lm(control$blood.pressure~control$w), lwd=2,col = "blue")
par(new = T)

plot(medicineA$w,medicineA$blood.pressure,pch = 17,col = "moccasin",
     ylab = "",xlab = "",xaxt = 'n',yaxt ='n')
abline(lm(medicineA$blood.pressure ~ medicineA$w),
       lwd = 2,col = "navajowhite2")

par(new = T)
plot(medicineB$w,medicineB$blood.pressure,pch = 15,col = "chocolate1",
     ylab = "",xlab = "",xaxt = 'n',yaxt ='n')
abline(lm(medicineB$blood.pressure ~ medicineB$w),
       lwd = 2,col = "chocolate")

legend("topleft", c('control','medicineA','medicineB'), 
       col=c('blue','navajowhite2','chocolate'),cex = 0.9,lwd = 2,pch = c(19,17,15))
~~~
![RplotWAA03.1.png](https://qiita-image-store.s3.amazonaws.com/0/210627/c1892111-6cdc-9c4d-42a8-f9c8a5d1f392.png)


~~~R
# figure2
par(mfrow=c(3,1))
plot(control$w,control$blood.pressure,pch = 19,xlab = "",
     ylab = "blood pressure",col = "skyblue",ylim = c(60,160),xlim = c(40,80),
     main = "relationship between blood pressure and weight (by medicine type)")
abline(lm(control$blood.pressure~control$w), lwd=2,col = "blue")
text(43, 140, 'Control',cex=2,col = "black")

plot(medicineA$w,medicineA$blood.pressure,pch = 17,col = "moccasin",
     ylab = "blood pressure",xlab = "",ylim = c(60,160),xlim = c(40,80))
abline(lm(medicineA$blood.pressure ~ medicineA$w),
       lwd = 2,col = "navajowhite2")
text(45, 140, 'Medicine B',cex=2,col = "black")

plot(medicineB$w,medicineB$blood.pressure,pch = 15,col = "chocolate1",
     ylab = "blood pressure",xlab = "weight",ylim = c(60,160),xlim = c(40,80))
abline(lm(medicineB$blood.pressure ~ medicineB$w),
       lwd = 2,col = "chocolate")
text(45, 140, 'Medicine B',cex=2,col = "black")
~~~

![RplotWAA03.2.png](https://qiita-image-store.s3.amazonaws.com/0/210627/2b07f2a0-6d64-1d84-88b8-1f464400054f.png)

####WAA03.2
~~~R
dbinom(3,10,0.5)
[1] 0.1171875
sum(dbinom(0:3,10,0.5))
[1] 0.171875
~~~

####WAA03.3
~~~R
dbinom(2,20,0.5)
[1] 0.0001811981
sum(dbinom(0:2,20,0.5))
[1] 0.0002012253
sum(dbinom(0:2,20,0.5))+sum(dbinom(18:20,20,0.5))
[1] 0.0004024506
~~~
[解答例](http://peach.l.chiba-u.ac.jp/course_folder/waa03_ExAns.pdf)
PythonからVLFeatを使う(cyvlfeat)

# TL;DR

* Debian/UbuntuのVLFeatは特許を取られているSIFT関連コードが削除されたものがパッケージ化されている
* VLFeatのpythonバインディングであるcyvlfeatはSIFT関連コードの存在を期待しているためpipではインストールに失敗する
  * SIFT関連コードだけを除外することで使えるようになる

# VLFeatについて

OpenCV以外の画像処理OSSとして、[VLFeat](http://www.vlfeat.org/)があります(2-clause BSDライセンス)。
OpenCVがサポートしていない、PHOW, LIOP特徴を扱うことが出来ます。

基本的にはC++用ライブラリですが、Python bindingも存在しています。

* [pyvlfeat](https://github.com/DerThorsten/pyvlfeat)
  * 新しめのpython, gccの組み合わせでビルドできない
* [cyvlfeat](https://github.com/menpo/cyvlfeat)
  * Cythonベースのwrapper

メンテナンスに関してはcyvlfeatの方が状態は良さそうだったのでこちらを使おうとしたのですが、Debian/Ubuntuパッケージのバイナリと組み合わせた時に問題があったので、その対応方法を示します。

## libvlfeat-dev

Debian 9, Ubuntu 16ともにlibvlfeat-devのパッケージバージョンは0.9.20+dfsg0-1となっています。0.9.20がupstreamのバージョン、+dfsg0はDFSGに適合するよう修正したことを示すバージョン、-1がパッケージのバージョンとなっています。
DFSGとは[Debian Free Software Guidelines](https://www.debian.org/social_contract)の略で、Debian/Ubuntuにおいて公式にパッケージ化するためには、このガイドラインを満たしたライセンスである必要があります。

全体としてはDFSGに適合しないけれども、適合ない部分を外して再配布可能な場合にこのようなバージョン番号をつけ、適合しない部分を削除した状態でパッケージ化しています。

* [参考: Debian Wiki What does “dfsg” or “ds” in the version string mean?
](https://wiki.debian.org/DebianMentorsFaq#What_does_.2BIBw-dfsg.2BIB0_or_.2BIBw-ds.2BIB0_in_the_version_string_mean.3F)

VLFeatの場合、SIFT特徴に関するコードを削除してパッケージ化しています。

## cyvlfeat

cyvlfeatはそういった事情をまったく考慮していないので、pip等でインストールを試みる場合、vl/sift.h自体が存在していないため、失敗してしまいます。
対応方法としては

* VLFeatをオリジナルのソースコードからビルド、インストールしてSIFTを使えるようにする
* cyvlfeatの方を修正して、SIFTを使わないようにする

の2通りが考えられます。ここでは後者について説明します。

### ソースコードの取得

githubより取得します。

```shell-session
$ git clone https://github.com/menpo/cyvlfeat
$ git checkout v0.4.6 # この記事を書いている時点の最新リリースタグ
```

### setup.py, cyvlfeat/__init__.pyの修正

以下のパッチを適用します。

```diff
diff --git a/cyvlfeat/__init__.py b/cyvlfeat/\_\_init\_\_.py
index d18842c..f327cdc 100644
--- a/cyvlfeat/__init__.py
+++ b/cyvlfeat/__init__.py
@@ -3,7 +3,7 @@ import cyvlfeat.generic
 import cyvlfeat.gmm
 import cyvlfeat.hog
 import cyvlfeat.kmeans
-import cyvlfeat.sift
+#import cyvlfeat.sift
 
 
 from ._version import get_versions
diff --git a/setup.py b/setup.py
index 7775538..85e49d7 100644
--- a/setup.py
+++ b/setup.py
@@ -57,8 +57,8 @@ if IS_WIN and IS_CONDA:
     LIBRARY_DIRS.append(conda_bin_dir)
 
 vl_extensions = [
-    gen_extension('cyvlfeat.sift.cysift',
-                  [op.join('cyvlfeat', 'sift', 'cysift.pyx')]),
+#    gen_extension('cyvlfeat.sift.cysift',
+#                  [op.join('cyvlfeat', 'sift', 'cysift.pyx')]),
     gen_extension('cyvlfeat.fisher.cyfisher',
                   [op.join('cyvlfeat', 'fisher', 'cyfisher.pyx')]),
     gen_extension('cyvlfeat.hog.cyhog',
```

### インストール

ソースコードからのインストールを行います。

```
$ python setup.py install
```
iOS11からのUniversalLinksのいいところと悪いところ?


# 概要
iOS11でUniversalLinksの挙動が少し変わったのでメモ

# 前提知識
iOS9からはじまったUniversal Links(Deep Link)
詳しい導入方法はこちらの記事などで載っています。

> URLスキーム・独自ディープリンク実装に代わる、Universal Links(iOS 9で導入)でより良いUXを実現
http://qiita.com/mono0926/items/2bf651246714f20df626

> Universal Links日本語ガイドhttps://developer.apple.com/jp/documentation/General/Conceptual/AppSearch/UniversalLinks.html

# iOS11での気になる変更点を
:frowning2::point_up: 以下、2つ

## 良さそうな点→遷移元情報を取得できるようになった

**iOS10まで**
*`UniversalLinksで飛んできてもアプリで遷移元がわからなかった。`*
*`どのサイトからきたのか？がわからないと分析ができない。`*
↓　↓　↓　↓　↓
**iOS11から**
*`アプリで遷移元を取得できるようになった。`*

> ```
/* The URL of the webpage that referred (linked to) webpageURL.
 */
@property (nullable, copy) NSURL *referrerURL API_AVAILABLE(macos(10.13), ios(11.0), watchos(4.0), tvos(11.0));
```
> https://developer.apple.com/documentation/foundation/nsuseractivity/2875762-referrerurl

:angel:「どこからきたのかわかる！うれしい！」(←これくらい普通のことだけど・・)

#### :point_up:AppDelegateで実際に取れているか確認してみた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187252/3df66ee8-7c3f-504f-a7e1-52ead5b717e5.png)

:airplane:Yahoo!検索から、アプリに飛んでみた:eye:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187252/1a107250-5150-075b-baf2-5ad9f33bc658.png)

:airplane:Google!検索から、アプリに飛んでみた:eye:
![image.png](https://qiita-image-store.s3.amazonaws.com/0/187252/79178858-0652-88b4-dac0-a7cbed3128b7.png)

```
🐸KEROKERO🐸:referrerURL=https://search.yahoo.co.jp/
🐸KEROKERO🐸:referrerURL=https://www.google.co.jp/
```

:man_tone1:「これで、特定のサイトから飛んできたら何か特別なことをする〜とか、
数値分析とかが捗りますね！！！！」:fire::soccer::fire:

## いまいちな点→Webブラウザからアプリに飛んだあと、アプリからWebに戻る方法がない・・


**iOS10まで**
*`アプリに飛ばされた後、右上のボタンを押せばWebで開き直すことができた。`*
↓　↓　↓　↓　↓
**iOS11から**
*`行方不明に。`*

→現状、アプリからWebに戻る方法はないようです。（あったら教えてください:innocent:）

| iOS10             | iOS11              |
|:-----------------:|:------------------:|
| <img src="https://qiita-image-store.s3.amazonaws.com/0/187252/5262ed4d-3231-9494-7729-a3a748ec0681.png" width=55%>|<img src="https://qiita-image-store.s3.amazonaws.com/0/187252/333cd222-4317-fe70-33fb-1cd70fe61456.png" width=90%> | 
| ↑右上に戻るボタンがある           |　↑特になにもない |



:eye:軽く裏技:eye:
アプリに飛んでしまうのが嫌なとき、
Webブラウザでリンクを長押しして「開く」or「新規タブで開く」とアプリに飛びません！！


:frowning2:余談:frowning2:
:ghost:「個人的には好きじゃないです。アプリで開きたくないサイトもあるので。人それぞれですかね。」
昨日のWindowsUpdateからユーザープロファイル正常に読めなくなった

ので復旧方法をいろいろ試したのですが
結局新PCにデータを移行する事になりそうです……

ですが今後そのような事が起こった時のために
メモ失礼します。


と思いましたが
システムの復元でどうにかなりそうなので
様子見中……
macでダブルクリックでMoneroをマイニングできるようにしてみた

# 注意
<font color="red">**2018年10月のMoneroのハードフォークにより、ハッシュアルゴリズムがcryptonightv8に変更されました。v1.4以降のマイナーを利用してください。**</font>

https://github.com/kackyt/easy-mining-mac/releases/tag/1.4

※マイニングCPUパワーの3%ほどを開発費用として利用しております。あらかじめご了承下さいm(_ _)m


# 目的
最近、仮想通貨のマイニングにはまってまして、空き時間を使ってマイニングを実験したりしてますが、どうせならコンソールからコマンドラインを打つのではなく、アイコンをダブルクリックするだけで、マイニングを開始できないか試してみました。

# やり方
MacOSXのアプリケーションの形式の実体はフォルダになっていて、その中にあるInfo.plistに従って、様々な処理を実行してくれます。この仕組みを生かして、内部にあるマイニングソフトを動かすというやり方を取ります。

マイニングソフトはCPUマイニングの中では速いと評判のxmr-stak-cpuを使い、Moneroをマイニングすることにしました。

# 構成

- StartXMR.app
  - Info.plist -- (アプリの起動設定)
  - MacOS
     - exec.sh -- (xmr-stak-cpuを起動するスクリプト)
  - Resources
     - xmr-stak-cpu (マイニングソフト)
     - config.txt (コンフィグファイル)

## Info.plist
Info.plistにはexec.shを実行するという設定を書いておきます。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>CFBundleExecutable</key>
    <string>exec.sh</string>
  </dict>
</plist>
```

## exec.sh
シェルスクリプトにはResources/xmr-stak-cpuをバックグラウンドで実行する処理を書きます。

```bash
#!/bin/bash

DIR=`dirname $0`
cd $DIR/../Resources/
./xmr-stak-cpu &
```

## config.txt
マイニングの設定はファイルを読みながらよしなに自分向けにカスタマイズしてください。
まあ、設定すべきところは、CPU周り(cpu_threads_conf)とマイニングプールのあたりくらいです。

```json
"cpu_threads_conf" :
[
   { "low_power_mode" : false, "no_prefetch" : true, "affine_to_cpu" : 0 },
   { "low_power_mode" : false, "no_prefetch" : true, "affine_to_cpu" : 1 },
   { "low_power_mode" : false, "no_prefetch" : true, "affine_to_cpu" : 2 },
],
```

```
/*
 * pool_address	  - Pool address should be in the form "pool.supportxmr.com:3333". Only stratum pools are supported.
 * wallet_address - Your wallet, or pool login.
 * pool_password  - Can be empty in most cases or "x".
 *
 * We feature pools up to 1MH/s. For a more complete list see M5M400's pool list at www.moneropools.com
 */
"pool_address" : "monerohash.com:3333",
"wallet_address" : "455h9vpZNrygxoHXi8oE44KkuVL82pzg3DGpAw4gGfkLVKfpAWFFNuaV9CPSEu85BWE4oh7di62s2RwznKaaqeNT41hEQzV",
"pool_password" : "x",
```


# 止め方
マイニングを止める方は、MacOSに同梱されているAutomatorを使ってみました。

Automatorを使うと、シェルスクリプトの実行は下のようにGUIで打ち込むだけでできます。
pkillを呼び出してxmr-stak-cpuを止めます。

![スクリーンショット 2017-11-16 13.15.14.png](https://qiita-image-store.s3.amazonaws.com/0/23392/8775497f-97b2-c24c-13aa-4cfdfdc91965.png)


# 成果物
https://github.com/kackyt/easy-mining-mac/releases

# TODO
開始と終了のアプリは1つにまとめてもよさそうかなー。