OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidKeyStoreSystemのisInsideSecureHardwareがfalseになる時

#isInsideSecureHardware
Androidの鍵がハードウェア内の安全な領域に保存されているかどうか調べるAPIです。
実装時に使用していたGalaxyでは、問題なかったため以前記事にした
実装方法で良いと思っていたのですが、一部の端末を使用すると
上記APIがfalseが帰って来ますと報告受けたので調べてみました。

##確認した端末
Androidは端末多すぎ定期なので、以下の端末に絞ってみました。
GalaxyS6Edge
Priori4
XperiaZ3Compact 
VAIOPhoneA


##実際のソース

確認のためのソース

```java
try {
            KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
            keyStore.load(null);
            SecretKey secretKey = (SecretKey)keyStore.getKey(AES_ALIAS,null);
            SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(KeyProperties.KEY_ALGORITHM_AES,"AndroidKeyStore");
            KeyInfo keyInfo = (KeyInfo)secretKeyFactory.getKeySpec(secretKey,KeyInfo.class);
            if(keyInfo.isInsideSecureHardware()) {
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (UnrecoverableKeyException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            e.printStackTrace();
        } catch (NoSuchProviderException e) {
            e.printStackTrace();
        }
        return false;
```

##確認結果
GalaxyS6Edge     true
Priori4          false
XperiaZ3Compact  false
VAIOPhoneA       true


##なんで端末によって、結果が違うのか
冒頭に説明した通り「isInsideSecureHardware」は
>鍵がハードウェア内の安全な領域に保存されているかどうか調べる

結果をいうと、CPUの種類によって発生するようです。
https://developer.android.com/training/articles/keystore
こちらの抽出の防止に以下の様な記述があります。

```
キーマテリアルを Android 端末の安全なハードウェア（たとえば、Trusted Execution Environment（TEE）や セキュア エレメント（SE））にバインドすることができます。キーに対してこの機能が有効化されていると、キーのキーマテリアルが安全なハードウェアの外部に露出されることはありません。
```

このTEEとは、ハードウェアの安全な領域にアクセスするためのAPIの様で
Android OSとは独立した領域です。
安全な領域は、CPUのアーキテクチャーの技術であり
そこからCPUによる差分なのではと思い、各端末のCPUを確認しました。

GalaxyS6Edge     EXYNOS7420
http://www.samsung.com/semiconductor/minisite/exynos/products/mobileprocessor/exynos-7-octa-7420/
Priori4          MT6737
https://www.mediatek.jp/products/mt6737
XperiaZ3Compact  Snapdragon 801
https://www.qualcomm.com/products/snapdragon/processors/801
VAIOPhoneA       Snapdragon 617
https://www.qualcomm.com/products/snapdragon/processors/617

サイトを見てみると、trueになっているのは
ARM Cortex A53
が書いており、TrustZoneが実装されているCPUなら大丈夫だと思います。
(Priori4もA53なのですが、MT6737TはTEEに関する記事を見つけたので
もしかしたらMT6737では未実装？とか思っています。
https://www.mediatek.com/blog/mediatek-mt6737t-granted-globalplatform-tee-security-evaluation-product-certificate)


##最後に
ちょっと前に同様の記事あげたのですが、理解が乏しかったのと
wikipediaをソースにしちゃったので、削除してもう一度書きました。
正直な話、対処法をどうしようかと考えているので
分かる方ご教授いただけると嬉しいです。
Unity - LayerMaskの中に対象のLayerが含まれているかチェックする方法

# 概要
Raycastでヒットした特定のレイヤーを判別して処理を分ける、みたいな使い方ができます。

# 実装
```
// LayerMaskに含まれていた場合
if (((1 << gameObject.layer) & layerMask) != 0;) {
	Debug.Log ("含まれている");
}

// LayerMaskに含まれていない場合
if(((1 << gameObject.layer) & layerMask) == 0) {
	Debug.Log ("含まれていない");
}
```
メソッドにしておくと便利。

```
// LayerMaskに対象のLayerが含まれているかチェックする
private bool CompareLayer (LayerMask layerMask, int layer) {
	return ((1 << layer) & layerMask) != 0;
}
```

以上。
google cloud platformでPHP開発環境をローカルで作ってテストした件

PHPで行う処理が多く、タイムアウトになってしまうので悩んでいました。
今回、HTMLを読みこむターゲットのサイトがアップデートしたので、ソースをテストしようとしました。
今までは、所有しているパソコンの内蔵ストレージの空き容量が少ないので、クラウドで環境を作ってきました。
今回簡単にテストサーバーを作ることができることを思い出したので、GoogleCloudPlatformのPHPのチュートリアルを読んで、環境作りをしました。

#Composerのインストール
依存関係の管理のために、Composerを使います。
https://getcomposer.org/download/
にアクセスして、installer.phpというファイルをダウンロードしました。
そのあとファイル名を変えました。
```
$ cp installer composer-setup.php
```
そしてインストールを行いました。
```
$ php composer-setup.php
$ sudo -s mv composer.phar /usr/local/bin/composer 
````
私は、Macにログインするときのパスワードをセットしているので、パスワードを聞かれました。
```
$ cd getting-started-php/1-hello-world
```
ディレクトリを移動しました。
```
$ composer install
```
依存関係をインストールしました。
#テストサーバー起動
https://cloud.google.com/php/getting-started/hello-world?hl=ja

こちらのチュートリアルにあるように、テストサーバーの起動してHello Worldと表示されることを確認しました。

私が作ったPHPのソースをWEBというディレクトリに入れました。
そして、通常のURLにアクセスする感じで
http://localhost:8000/
に続けてファイル名を入力してアクセスしたところ無事に、テストできました。
Hello World

# はじめに

このブログは,  私の日々の研究・勉学の内容をまとめることを目的としています．
(発表前の研究は，公開していないことが多いです．発表したら公開します．)
何か不明な点やご意見がございましたら，お気軽にご連絡ください．


# 自己紹介

## 現職

東京大学 生産技術研究所 特任研究員 (2018年5月現在)

東京工業大学 工学博士

岡本有司

##学歴

2008年3月 名古屋学院大学付属高校 退学

2008年4月 千葉大学工学部 先進科学プログラム(メディカルシステム工学科) 飛び入学

2008年8月 San Jose State University (アメリカ合衆国) に交換留学

2008年9月 交換留学のプログラムを終え，帰国

2008年9月 千葉大学 工学部 先進科学プログラム(機械工学科) へ転学科

2012年3月 千葉大学 工学部 先進科学プログラム(機械工学科) 卒業

2012年4月 東京工業大学大学院 情報理工学研究科 情報環境学専攻 修士課程 入学

2013年9月 University of Strathclyde, Mechanical & Aerospace Engineering (Glasgow, UK) の交換留学プログラムへ参加, 液体燃料ロケットのエンジンの温度制御の研究に従事

2014年1月 交換留学のプログラムを終えて帰国

2014年3月 東京工業大学大学院 情報理工学研究科 情報環境学専攻 修士課程 終了

2014年4月 東京工業大学大学院 情報理工学研究科 情報環境学専攻 博士後期課程 入学

2017年4月 東京工業大学大学院 情報理工学研究科 情報環境学専攻 博士後期課程 終了  工学博士取得

## 職歴

2012年8月 Honda Research Institute Japan のインターンプログラムに参加

2012年9月 インターンプログラム終了

2013年8月 Works Applications のインターンプログラムに参加

2013年9月 インターンプログラム終了

2014年6月 理化学研究所 IMS センター 研修生に配属

2016年7月 シスメックス株式会社 インターンシッププログラムに参加

2016年9月 インターンシッププログラム終了

2017年1月 株式会社キャンサースキャン インターンシッププログラムに参加

2017年3月 インターンシッププログラム終了

2017年3月 理化学研究所 IMS センター 研修生 終了

2017年4月 東京大学 生産技術研究所 特任研究員に配属

## 賞罰

2016年 システム制御情報学会 奨励賞

2016年 第59回自動制御連合講演会  優秀発表賞




# 今までの研究内容

## 修士時代: 伝染症モデルの制御

インフルエンザなどの，人から人に伝播する病気を考えます．
その病気の伝播率，発症率，復帰時間等をもとに，病気の伝播という現象を数理モデルで記述することができます．
さらに，ある都市の病気の流行は都市間の人口流動によって起こると考えられるため，都市間の人口流動ネットワークを元に，都市ごとに病気の人の増加を考えることができます．
私の研究は，その数理モデルを「超離散化」という新しい手法をもちいて制御することを目的としています．
研究結果として，人口流動ネットワークを元に最も伝染病が伝播してくる都市(ハブ)を制御することにより，伝染病の流行を抑えられるという結論になりました．
(自明ですね...)

## 博士時代: 細胞の簡易な数理モデル化と制御

体内の化学的な状態を制御を用いることによって，化学面からの病気の治療法を確立することを目標と掲げました．
これにより，いままで医師の主観で行われていた病気の治療を，個々人の特性を踏まえた**定量的な治療** に変えていくことをを目指しています．
そこで，人体を構成する基本要素である「細胞」を数理モデルで記述し，それに対する制御の理論体系を整えました．
(詳細は後日に別ページで纏めたいと思っています．)


# 専門と特技
私は，制御理論を専門としています．
また，制御理論を医療に応用する研究を行っているため，医師や生命系の研究者と専門の話をできる 程度の医療・生命の知識があります．

一方，データの取り扱い方という面として，現代数理統計学の基本的な知識を始めとし，いわゆるAIと呼ばれてる機械学習とパターン認識を修めております．
特に，時系列データの取扱は，専門の知識を用いられるため，より高度な解析を行うことができます．

実践としましては，インターン先の企業でのデータ解析の他，練習のためにkaggleなどに取り組んでいます．
Unity - AndroidでCardboardが有効にならない

# 症状
Unity2017.3.1f1にて、AndroidでCardboardが有効にならない問題に直面しました(他のバージョンでも起きるかも)  
下記エラー文

```
05-04 03:52:47.189: E/Unity(10148): Error trying to call delegated method load. null
05-04 03:52:47.190: E/Unity(10148): Google VR Error [Cardboard]: Exception caught while loading GoogleVR. Attempt to invoke virtual method 'long java.lang.Long.longValue()' on a null object reference
05-04 03:52:47.190: E/Unity(10148): Google VR Error [Cardboard]: Google VR had a fatal issue while loading. VR will not be available.
05-04 03:52:47.194: E/Unity(10148): Error trying to call delegated method unload. null
```

  
# 原因
Unityに統合されているCardboardが壊れてるっぽい。  

# 対策
GoogleVR SDK(v1.120以降)を導入する or Unityの修正パッチをインストールする。  
対応しているパッチのバージョンについてはこちら。  
[For people targeting cardboard on Android please update your Google VR SDK to 1.12 or later.](https://forum.unity.com/threads/for-people-targeting-cardboard-on-android-please-update-your-google-vr-sdk-to-1-12-or-later.520986/)


Unity5.6以降からGoogleVR SDKなくてもCardboardは動くようになったので、SDK入れずに運用してたからこれは盲点(´・ω・`)
vim で PlugInstall したら怒られたメモ

## 経緯

`~/.vim` を消して作り直したとき。

```vim
:PlugInstall
```

したら怒られた。

```
Not an editor command ^M
```

言ってることはわかるんだけど、この前まで動いてたじゃん。

## 原因

`~/.gitconfig` を編集したのが原因だった。

```
autocrlf = true
```

チェックアウト時にLF→CRLF する設定にしたの忘れてた。
ので、修正。

```diff
- autocrlf = true
+ autocrlf = input
```
シェルスクリプトでファイル名に日付＿時間を付けてコピーする

シェルスクリプト内で、ファイル名に日付をつけてコピーしたい。
更に一日に何回も実行するかもしれないから時間もつけたい。
そんな時の自分用のメモ

```
cp -p a.txt a.txt.`date "+%Y%m%d_%H%M%S"`
```
Xcodeでコンパイルエラーが出た場合の対処方法

# はじめに
Githubからダウンローしたサンプルのプロジェクトをコンパイルしようとして四苦八苦しました。初歩的な内容も含んでいるかもしれませんが、備忘録の為に記しておきます。
# Undefined symbols for architecture エラーが発生する。
Twitkitを含んだサンプルプロジェクトをコンパイルしようとしたら
Undefined symbols for architecture x86_64:
  "_TWTRCoreOAuthSigningOAuthEchoHeaders", referenced from:
が出力されました。
## 対処方法
https://ez-net.jp/article/0A/7RrII9dI/1LhpEKH-QiM8/
# [carthage導入時のfailed with exit code 72: xcrun: error: unable to find utility "xcodebuild", not a developer tool or in PATH]

## 対処方法
https://github.com/Carthage/Carthage/issues/1325
上記記事の通り、Priferences→locations→Command Line Toolsを選択しバージョンを指定することで解消しました。
Julia で ベクトル場を描く

# 環境など

Julia 1.1 に合わせて記事を更新した。

```
julia> versioninfo()

Julia Version 1.1.0
Commit 80516ca202 (2019-01-21 21:24 UTC)
Platform Info:
  OS: Windows (x86_64-w64-mingw32)
  CPU: Intel(R) Core(TM) i5-2500K CPU @ 3.30GHz
  WORD_SIZE: 64
  LIBM: libopenlibm
  LLVM: libLLVM-6.0.1 (ORCJIT, sandybridge)
```

```julia
using Plots
gr(size=(400, 400))
#gr(fmt=:png)
```

Plots のデフォルトでは、グラフは SVG 形式で出力される。しかし、描画点数が多くなってくると、ブラウザ（Jupyter クライアント）の表示のほうで負荷がかかってしまう。その場合は PNG 形式に変更するとよい。

# 座標系をつくる

ベクトル場を描く関数 `quiver()` の引数は一次元配列である。それに合わせて、一次元の座標系をつくる。

```julia
xe = range(-1, 1, length=15)
ye = range(-1, 1, length=15)

x = repeat(xe, outer=length(ye))
y = repeat(ye, inner=length(xe));
```

```
julia> x

225-element Array{Float64,1}:
 -1.0                
 -0.8571428571428571 
 -0.7142857142857143 
  ...
  0.8571428571428571 
  1.0

julia> y

225-element Array{Float64,1}:
 -1.0
 -1.0
 -1.0
  ...
  1.0
  1.0
```

# ベクトル場をつくる

```julia
u = y
v = x
```

# ベクトル場を描く

見やすいように、適当な係数 `k` をかけて矢印の長さを調節した。

```julia
k = 0.1
quiver(x, y, quiver=(k*u, k*v))
```

![quiver.png](https://qiita-image-store.s3.amazonaws.com/0/202534/e9c249bf-f5b1-3836-9e7e-a931f50d83ae.png)

## 他の例

```julia
u = y
v = -x
```

![quiver2.png](https://qiita-image-store.s3.amazonaws.com/0/202534/8d8ff1f0-96a0-56c1-cf8f-5cf2e0dc3bf5.png)

## もし配列が二次元だったら

配列を一次元に開いて `quiver()` に渡せばよい。

```julia
quiver(x[:], y[:], quiver=(u[:], v[:]))
```
Generics のメソッドで型情報を取得する

Generics を使って型の情報を取得したいというケースがある。このような時にどのような書き方ができるのかわからなかったので調べてみた。

# クラスの階層

Generics のパラメータとして渡されるクラスとして次のようなものを作ってみた。出来ればインターフェイスや、アブストラクトクラスも取得できると嬉しい。また、Namespace とクラス名自体を分離して取得したいというのがよくありがちなユースケースだろう。

```csharp
public interface IClass
    {
        string Name { get; set; }
    }

    public abstract class BaseSomeClass : IClass
    {
        public string Name { get; set; }
        public abstract string Hello();
    }

    public class SomeClass : BaseSomeClass
    {
        public override string Hello()
        {
            return "Hello from SomeClass";
        }
    }
```

# クラス名自体を取得する

いくつかの方法でクラス名を取得できる。

## nameof

`nameof` で普通に取得できる。

```csharp
        public string HelloByNameOf<T>()
        {
            return $"Hello! The parameter is {nameof(T)}";
        }
```

結果

```
nameof("SomeClass"):SomeClass
```

## typeof 

`typeof` というメソッドを使うこともできる。最初はこんなコードを書いたけどうまくいかない。

```csharp
        public string HelloByTypeOf<T>()
        {
            return $"Hello! The parameter is {typeof(T)}";
        }
```

```
Generic method nameof: Hello! The parameter is T
```


## typeof (改）

こうすればうまくいく。`typeof` は戻り値(Type) がありそれを使う。

```csharp
        public string HelloByNameAndNamespace<T>()
        {
            var type = typeof(T);
            return $"Hello! The parameter is Name: {type.Name} Namespace: {type.Namespace}";
        }
```

結果

クラス名もメソッド名もとれる。

```
Generic method GetType: Hello! The parameter is Name: SomeClass Namespace: ClassNameSpike
```

## インターフェイスと Base クラスの取得

インターフェイスとか、継承元のクラスの名前を取得するのはどうすればいいか？　デバッグモードでType を見てみると、いくつかのメソッドが使えることに気づく。

* `BaseType` は継承元のクラスの情報が格納されている。
* `ImplementedInterfaces` は、実装しているインターフェイスの配列を取得することができ、`Name` により名前を取得できる。`FullName` はネームスペース付き

# 結論

簡単なサンプルプログラムで Generics の型を取る方法を整理してみた。

* [Sample on Github](https://github.com/TsuyoshiUshio/GenericsTypeSpike)
ORACLE APEX5.1.4 から18.1へのアップグレードメモ（12.2のPDBにインストール PL/SQL Gateway版）


---

* アップグレード手順はインストール手順と同じ
* 下記の過去記事で構築した環境をアップグレード
  * [ORACLE APEX5.1インストールメモ（12.2のPDBにインストール PL/SQL Gateway版）](https://qiita.com/fujid/items/cf21f90ed874a8f8a682)
  * [ORACLE APEX5.1.4 パッチ適用メモ（12.2のPDBにインストール PL/SQL Gateway版）](https://qiita.com/fujid/items/24410702fcc5f3ca65e0)

---

**1. OTNのサイトから「Oracle Application Express 18.1」のダウンロード**

http://www.oracle.com/technetwork/developer-tools/apex/downloads/index.html


**2. アップグレードするサーバーの任意のディレクトリ（ここでは/tmp）に解凍し、移動**

```
> unzip apex_18.1.zip -d /tmp
> cd /tmp/patch
```

**3. SYSユーザーでログインし、インストールするPDBに接続**

```
> sqlplus / as sysdba
SQL> ALTER SESSION SET CONTAINER = ORCLPDB;
```

**4. PL/SQL Gatewayの無効化**

* 現在のポート番号確認

```
SQL> SELECT DBMS_XDB.GETHTTPPORT FROM DUAL;

GETHTTPPORT
-----------
       xxxx

1 row selected.
```

* 無効化

```
SQL> EXEC DBMS_XDB.SETHTTPPORT(0);
SQL> COMMIT;
```

**5. インストール**

```
SQL> @apexins.sql APEX APEX TEMP /i/
```

**6. インスタンス管理者アカウントを更新**

```
SQL> @apxchpwd.sql

　Enter the administrator's username [ADMIN]
　User "ADMIN" does not yet exist and will be created.
　Enter ADMIN's email [ADMIN]
　Enter ADMIN's password []
　Created instance administrator ADMIN.
```

**7. apex_epg_config.sql構成スクリプトの実行**

```
SQL> @apex_epg_config.sql /tmp
```

**8. Oracle XML DBプロトコル・サーバーの有効化**

```
SQL> EXEC DBMS_XDB.SETHTTPPORT(xxxx);
```

**9. ネットワーク・サービスの有効化**

```
SQL> BEGIN
       DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
         host => 'localhost',
         ace => xs$ace_type(privilege_list => xs$name_list('connect'),
                            principal_name => 'APEX_180100',
                            principal_type => xs_acl.ptype_db));
 END;
 /
```

**10. 日本語のインストール**

* 環境変数設定

```
> NLS_LANG=American_America.AL32UTF8
> export NLS_LANG
```

* PDBに接続後SQL実行

```
> cd /tmp/apex/builder/ja
> sqlplus / as sysdba
SQL> ALTER SESSION SET CONTAINER = ORCLPDB;
SQL> ALTER SESSION SET CURRENT_SCHEMA = APEX_180100;
SQL> @load_ja.sql
```
Automatorで作ったサービスは受け取り項目を変更できない

# 受け取り項目

受け取る項目を「テキスト」にして、サービスを作成した。

![スクリーンショット 2018-02-16 0.40.49.png](https://qiita-image-store.s3.amazonaws.com/0/103041/35783552-64fb-c980-5fd0-1147b5736907.png)

すると、「テキスト」のセクションにサービスが追加される。

![スクリーンショット 2018-02-16 0.43.17.png](https://qiita-image-store.s3.amazonaws.com/0/103041/64e9885b-cfdb-0b4e-f503-873921f8d267.png)

このサービスの受け取る項目を「ファイルまたはフォルダ」に変更し、上書き保存する。

![スクリーンショット 2018-02-16 0.51.54.png](https://qiita-image-store.s3.amazonaws.com/0/103041/3fa4ed9b-5bda-14f1-11b5-f89464db39aa.png)

しかし、サービスは「テキスト」のセクションのままであり、Finder上でファイルを右クリックしてもメニューに表示されない。

![スクリーンショット 2018-02-16 0.43.17.png](https://qiita-image-store.s3.amazonaws.com/0/103041/64e9885b-cfdb-0b4e-f503-873921f8d267.png)

Finderを再起動したり、`~/Library/Services/AAA.workflow`を削除してサービスを作成しなおしても、サービスのセクションは変更されない。
apple-touch-iconを作るときのメモ

apple-touch-iconを作るときのメモ。
要ImageMagick。
input.png は 200x200であること。

```shell
#!/bin/sh

cp input.png apple-touch-icon-200x200-precomposed.png
cp input.png apple-touch-icon-200x200.png

for size in 180 152 144 120 114 76 72 60 57
do
  convert input.png -resize ${size}x${size} apple-touch-icon-${size}x${size}-precomposed.png
  cp apple-touch-icon-${size}x${size}-precomposed.png apple-touch-icon-${size}x${size}.png
done
```
Windows10(WSL)で、embulk経由のサーバーレス連携(①JAVA～embulk)

#Windows10(WSL)で...
業務上の必要で、私的シリーズ化しそうなUbuntu/Debian on Windows10(WSL)で何かする、なエントリ（python/pipenv編は[こちら](https://qiita.com/Nimimal/items/72c2e2a6a566d1f5d2a2)）。今回は社内データ（バックオフィス系）を集約・分析するためのembulk経由のサーバーレス連携をしてみる。

#Ubuntu/DebianにOracle Java via SDKMAN
Ubuntu/DebianへのOracle Javaの導入はGroovy製（？）のSDKMANを使うのが手っ取り早い。SDKMANでScala/Kotlinなども楽に入れられる。
Ubuntu/Debian on Windows10(WSL)では、以下の通りでjavaが入る。

```sh
sudo apt install unzip zip curl
curl -s api.sdkman.io | bash
source .sdkman/bin/sdkman-init.sh
sdk install java
```

#embulkを入れる

```sh
curl --create-dirs -o bin/embulk -L "http://dl.embulk.org/embulk-latest.jar"
chmod +x bin/embulk
./bin/embulk
```

無事、Embulk v0.9.7がインストールされた。
SDKMANでは各バージョンのjavaをインストールして切り替えることが簡単なので、java8とjava10を併用していく予定。

お次はAWS lambdaとつなぐ予定。
kubectl create job xxx --from=cronjob/yyy を手軽に実行出来るようにするシェル


要 peco

```sh
#!/bin/sh

K8S_CONTEXT=`kubectl config get-contexts -o name | peco`
CRONJOB_NAME=`kubectl get cronjob --context=${K8S_CONTEXT} | peco | awk '{print $1}'`

TIMESTAMP=`date +%Y%m%d%H%M`
JOB_NAME="${CRONJOB_NAME}-from-cronjob-${TIMESTAMP}"

echo "Creating Job from CronJob"
echo ""
echo "Context: ${K8S_CONTEXT}"
echo "Job: ${JOB_NAME}"
echo "From CronJob: ${CRONJOB_NAME}"
echo ""
echo "Are you ready? [y/N]"

read ANSWER

case $ANSWER in
    "y" | "Y" | "yes" | "Yes" | "YES")
        kubectl create job $JOB_NAME --from=cronjob/${CRONJOB_NAME} --context=${K8S_CONTEXT}
        ;;
    *)
        echo "It's not create. exit."
        ;;
esac

```
apc.php管理画面


# 概要

[apc.php](https://github.com/krakjoe/apcu/blob/master/apc.php)をweb公開フォルダに設置するとapcuの管理画面が利用できユーザーキャッシュの削除や確認ができます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/3940/2245805c-9f1e-e70c-72fe-632dcfd1a383.png)

利用するために同じフォルダに`apc.conf.php`ファイルを設置します。

```php
<?php

require dirname(__DIR__) . '/vendor/autoload.php';

defaults('ADMIN_USERNAME','apc');
defaults('ADMIN_PASSWORD','新しいパスワード');
```

`User Entry Label`で指定したIDのコンテンツの保存内容が見れますが、`autoload.php`を読み込む事で下記のようにクラス名が正しく表示されます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/3940/24d0ed86-eee7-0548-8349-1ce64d49a0cc.png)

(autoload.phpを読み込んでいない場合）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/3940/5bed0533-c178-ad3c-9dfe-2a14ebc43389.png)
IE11 で page-break-after:always; が効かない

「page-break-after:always; が指定されているのに IE11 で改行されない」という現象があったので調べました。

### 先に結論 

- 結論としては、「page-break-after:always; の後ろに何らかの要素がないと駄目」な模様
<br>

- 以下 サンプルソース

```html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>てすと</title>
<style>
  body { font-family:'Meiryo UI'; }
  .test-section { margin-bottom:3em; }


  .test-paseudo:after {
      content: "";
      display: inline;
  }
</style>

<style media="print">
  .page-break-text { display:none }
</style>
</head>
<body>

  <!-- ================================================== -->

  <div class="test-section">
    <div>↓↓↓ これは IE11 では改行されませんでした</div>

    <div style="page-break-after:always"></div>
  </div>

  <!-- ================================================== -->

  <div class="test-section">
    <div>↓↓↓ これは IE11 でも改行されました</div>

    <div style="page-break-after:always"></div>

    <div>↑↑↑ page-break-after の後ろに何か要素がないと駄目っぽい</div>
  </div>

  <!-- ================================================== -->

  <div class="test-section">
    <div>↓↓↓ なにかしら要素があれば何でも良いのか ⇒ 良いです</div>

    <div style="page-break-after:always"></div>
    <span></span>
  </div>

  <!-- ================================================== -->

  <div class="test-section">
    <div>↓↓↓ でも印刷時に非表示になる要素だと駄目だった</div>

    <div style="page-break-after:always"></div>

    <div class="page-break-text">---------------------------------------- 改行 ----------------------------------------</div>
  </div>

  <!-- ================================================== -->

  <div class="test-section  test-paseudo">
    <div>↓↓↓ 疑似要素でも良いのかな･･･ ⇒ OKでした</div>

    <div style="page-break-after:always"></div>
  </div>

  <!-- ================================================== -->

  <div class="test-section">
    あいうえお
  </div>

</body>
</html>
```

- 単純に

```html
<p>あああああ</p>
<p>いいいいい</p>
<div style="page-break-after:always"></div>
<p>ううううう</p>
```

みたいな感じだったら問題なかったんだろうけど、大枠の div で囲んで その末尾に改行を仕込んでいたので 改行されなかったみたいです。

(似たような現象で、stackoverflow に "後ろに空要素を入れれ" みたいな書き込みがあったので試したらいけました ありがとう)

### ていうか

page-break-after じゃなくて
page-break-before にすればいいんじゃないかなこの使い方だったら･･･
:confused:
Fluxについての簡単なまとめ

Reduxについて学習しているとFluxという言葉が出てきたので、Fluxとは何なのか学習したことをまとめてみました。

## Fluxをひとことで言うと
Fluxとは、「Facebook社が提唱した、データフローの設計概念」です。

## MVCモデル
Fluxのアーキテクチャに入る前に、データフローの概念としてよく知られているMVCモデルについて見てみます。

MVCモデルとは、'Model', 'View', 'Controller'からなるモデルのことです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222592/56fd344f-84dc-840d-d989-ad498aa0161f.png)
https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

上の図のようにシンプルなアプリケーションなら良いのですが、次にどんどん機能を追加していって大きくなったアプリケーションについて見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222592/02edc5b0-c006-5852-a71a-0d168cfc2c47.png)

上の図のように、ModelやViewが大量に増えていくとシステムアプリケーションの複雑度も指数関数的に増してしまいます。
また、このようなシステムでは、ModelとViewの間で双方向のデータフローが作られる可能性があるので(表示内容を元に処理を行うなど)、システムの管理・デバッグが難しくなってしまいます。

Fluxは、このような複雑性の増加を避けるために作られた設計概念です。

## Flux
では、Fluxのアーキテクチャを見てみましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222592/98cd3b11-8d2e-f6db-d80e-5e1df6f9bcbc.png)
https://github.com/facebook/flux/tree/master/examples/flux-concepts

Fluxは以下の要素から成っています。

・Store: アプリケーション内のデータ(Reactだとstate)とデータを更新するロジックを持っている
・View: 表示の部分(Reactだとコンポーネント)
・Dispatcher: アプリケーション内の全てのアクションを受けてStore内のデータ更新ロジックを発火する
・Action: Viewやユーザ操作からのイベント

Fluxでは、すべてのActionをDispatcherが受け取るので、コンポーネント間のデータフローが単方向しか生じない様になっています。
機能が追加されアプリケーションが大きくなっても(StoreやViewが複数になっても)、すべてのActionをDispatcherが受けてくれるので、データフローは単方向になります。
また、ReactなどでViewをコンポーネント毎に管理することによって、StoreとViewを1対1で対応させることもできます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222592/3f60c6ec-1a20-f8e4-95ad-a990c155523d.png)

## まとめ
学習を進めていくうちに、FluxはMVCモデルと全く異なった概念ではなく、MVCモデルのいくつかの欠点を補うために改良された概念だということがわかりました。
データフローを一方向に限定することによって、大きなアプリケーションの管理を容易にする為の概念というイメージです。
どちらが良い・悪いではなく、状況にあったものを選ぶことが大事なのだと思います。

学習を始めたばかりなので、理解が間違っているところなどあれば、ご指摘お願いいたします。

## 参考にさせて頂いたサイトなど
https://qiita.com/knhr__/items/5fec7571dab80e2dcd92
https://qiita.com/kiita312/items/b001839150ab04a6a427
https://www.infoq.com/jp/news/2014/05/facebook-mvc-flux
https://github.com/facebook/flux/tree/master/examples/flux-concepts
React Native CounterのsetStateする側

React Nativeで数字のアップダウンのアニメーションをしたい
↓
npmで[react-native-counter](https://github.com/Kerumen/react-native-counter)を発見
↓
初回だけしかアニメーションしてくれない（＋PropTypes非推奨のエラー）
↓
任意のタイミング（ボタンクリックなど）で何度もアニメーションするようなものがほしい
↓
見つからない...

**そのようなパッケージありましたら教えてください**

とりあえずreact-native-counterで必要なものだけバラしてそれっぽいのを作りました

```js:counter.js
import eases from 'eases'

const counter = ({
  start,
  end,
  setState,
  time = 1000,
  digits = 0,
  easing = 'linear',
  onComplete = null
}) => {
  this.start = start
  this.end = end
  this.setState = setState
  this.time = time
  this.digits = digits
  this.easing = easing
  this.onComplete = onComplete
  this.startTime = Date.now()
  this.stop = false
  requestAnimationFrame(animate.bind(this))
}

const animate = () => {
  if (this.stop) {
    if (this.onComplete) this.onComplete()
    return
  }

  requestAnimationFrame(animate.bind(this))
  draw()
}

const draw = () => {
  const now = Date.now()
  if (now - this.startTime >= this.time) this.stop = true
  const percentage = Math.min((now - this.startTime) / this.time, 1)
  const easeVal = eases[this.easing](percentage)
  const value = this.start + (this.end - this.start) * easeVal

  this.setState(value.toFixed(this.digits))
}

export default counter
```

Usage
-----
```js
import React from 'react'
import counter from './counter'

class Hoge extends React.Component {
  state = { value: 0 }
  
  onClick = () => {
    const setState = value => this.setState({ value })

    counter({
      start: this.state.value,
      end: 100,
      setState
    })
  }
}
```
Unity と Mac で開発する Oculus Go アプリ #2 スクリーンショットを撮る

Oculus Goにもスクリーンショットを撮る機能がある
<img src="https://qiita-image-store.s3.amazonaws.com/0/33505/ffa4be34-21de-529f-0472-363c00ef0ab4.jpeg" width=50%/>

スクリーンショットを撮るまではいいが、投稿先がFacebookのみ...
<img src="https://qiita-image-store.s3.amazonaws.com/0/33505/7f0c10cf-c47e-76e5-2178-db64c11da1d9.jpeg" width=50%/>
（~~もしアダルティなものをシェアしてしまったら、間違いなく詰む~~）

今回は、Macにスクリーンショットを取り込むまでやる

---

Oculus Go は Android OS なので Android SDK Platform は用意しておく

```bash
$ ./adb shell getprop ro.build.version.release
7.1.2

$ ./adb shell getprop ro.build.version.sdk
25
```

Oculus Go を開発者モードONにして、ディレクトリを見てみる

```bash
$ ./adb ls /sdcard
000041f9 00001000 000ffcf7 .
000041c9 00001000 000ffcf5 ..
000041f9 00001000 000ffcf6 Music
000041f9 00001000 000ffcf6 Podcasts
000041f9 00001000 000ffcf6 Ringtones
000041f9 00001000 000ffcf6 Alarms
000041f9 00001000 000ffcf6 Notifications
000041f9 00001000 000ffcf6 Pictures
000041f9 00001000 000ffcf6 Movies
000041f9 00001000 5b06dc7d Download
000041f9 00001000 5b037777 DCIM
000041f9 00001000 5b042f4e Android
000041f9 00001000 5b037775 oculus
```

スクリーンショットはここにある

```bash
$ ./adb ls /sdcard/oculus/Screenshots/
000041f9 00001000 5b077cc3 .
000041f9 00001000 5b037775 ..
000081b0 00014c79 5b076332 com.oculus.vrshell-20180525-101322.jpg
000081b0 0001738c 5b07633d com.oculus.vrshell-20180525-101333.jpg
```

このままコマンドラインでやってもいいけど、せっかくAndroidベースなので [Android File Transfer](https://www.android.com/filetransfer/) を使ってみると
<img width="50%" src="https://qiita-image-store.s3.amazonaws.com/0/33505/220bf4e5-ae6b-ac20-85a1-5788fbc2b286.png">

見れた！

ここからが本題で、<font color="Red">Oculusアプリを起動中のスクリーンショットを撮る</font>には `adb` コマンドを使う

```bash
$ ./adb shell screencap -p /sdcard/oculus/Screenshots/screen.jpg
```

そうすると、ファイルがOculus内に作られますので、Transter等でmacに移動させる

```bash
$ ./adb ls /sdcard/oculus/Screenshots/
000041f9 00001000 5b077cc3 .
000041f9 00001000 5b037775 ..
000081b0 00014c79 5b076332 com.oculus.vrshell-20180525-101322.jpg
000081b0 0001738c 5b07633d com.oculus.vrshell-20180525-101333.jpg
000081b0 0003e8a9 5b0781cc screen.jpg
```

できた！
<img src="https://qiita-image-store.s3.amazonaws.com/0/33505/131629e5-b81a-8cb1-68ee-8cb659769adc.jpeg" width=70%/>
DMM.comに深い意味はないよ
ES2015のimportとexportの試し方

# 概要
`import`と`export`がわからなかったので、少し試してみた。

# 実行方法
`<script type="module">`指定し、chromeで確認しました。

ファイルパスではできなかった為、サーバーで実行しました。

# まとめ
- ブラケットは独自仕様で、Objectとは関係なかった。
- importは、最初に一回だけ呼ばれる

# コード

```html:index.html

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <script>
        document.body.innerHTML = 'START<br/>'
    </script>
    <script type="module" src="./app.js"></script>
</body>
</html>
```



```js:app.js
document.body.innerHTML += '-S:app.js<br/>'

// 呼ぶだけ
import './module.js' 

// default + 名前
import def, {
    name,
    name as alias,
} from './module.js'

// default + 全部
import def2, * as all from './module.js' 

// 全部 + 名前はできない

console.log({
    def,
    def2,
    all,
    name,
    alias,
    // alias: aliasの短縮
}) 
document.body.innerHTML += '-E:app.js<br/>'
```

```js:module.js
document.body.innerHTML += '--S: module<br/>'
let var1 = 3

export default 0

export let name = 1, name2 = 2
export {
    var1 ,
    var1 as alias,
}

document.body.innerHTML += '--E: module<br/>'
```

```:出力結果
START
--S: module
--E: module
-S:app.js
-E:app.js
```

# nodejsの実行方法
設定が必要。引数を追加したり、拡張子を追加するとできるようです。

## 参考
https://qiita.com/Kaoru_Yamamoto/items/bcca9b63220e23b69399

# import / export
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/export
PowerShell で自己証明書を生成

```PowerShell

# 個人用証明書ストアに生成
$cert = New-SelfSignedCertificate `
            -DnsName "server01", `
                     "server01.honsya.local", `
                     "server.artisan-kogyo.com" `
            -CertStoreLocation "cert:\LocalMachine\My" `
            -NotAfter (Get-Date).AddYears(100) #100年後に期限が切れるので忘れずに更新すること

# "C:\ServerCert.cer" にファイルとしてエクスポート
Export-Certificate -Cert $cert -FilePath "C:\ServerCert.cer"

# 証明書ストアをお掃除
Remove-Item $cert.PSPath

```
Pythonでコンピュータを作る #4 -XORゲート-

今日はよく寝れて空を飛べる気がしている大学生の[Motmuu](https://qiita.com/Motmuu)です.
[パーセプトロン](https://qiita.com/drafts/69b3b26afd261484ede9/edit)という[アルゴリズム](https://qiita.com/Motmuu/items/ed28e729b863103db089)を用いて,[ANDゲート・NANDゲート・NORゲート](https://qiita.com/Motmuu/items/1f4de21cd4fdbc9a3836)を実装してきました.
これからXORゲートを実装していきたいと思います.

#開発環境
以下の環境で勉強していきたいと思います.
`・Python 3.6.5
・Mac OS X 10.13.2
・Atom 1.10.2`

サンプルコードは[こちら](https://github.com/MotoyaKondo/qitta_gates)
#XORゲート

XORとは exclusive OR (排他的論理和)です.
x1とx2の排他的論理和をとるとすると,排他的という言葉のイメージの通りx1とx2が同じ入力を示す時は0,それ以外は1を出力します.真理値表は以下です!

| x1 | x2 | y |
|:-:|:-:|:-:|
| 0  | 0  | 0  |
| 0  | 1  | 1  |
| 1  | 0  | 1  |
| 1  | 1  | 0  |

それではこれをパーセプトロンで実装していきましょう.
パラメータは...定められますか??


#パーセプトロンは万能ではない?!

ここまで色々なことができたパーセプトロンですが,できないこともあります.
まずパーセプトロンの論理について解釈を少し広げます.

これまで
(式1)
y = 0 (w1 * x1 + w2 * x2 ≦ θ)
y = 1 (w1 * x1 + w2 * x2 > θ) 
w1,w2 : 重み θ : 闘値

と定義してきましが,この闘値を左辺に持っていきましょう.
すなわちこれまでは定数のように扱っていましたが,新たにバイアス(b)という変数を与えます.
パワーアップした定義は以下のようになります.

(式2)
y = 0 (b + w1 * x1 + w2 * x2 ≦ 0)
y = 1 (b + w1 * x1 + w2 * x2 > 0) 
w1,w2 : 重み b : バイアス

あまり変わっていない気がしますが,少しニュアンスが変わりました.
バイアスは1を出力させる度合いを決定するパラメータとして働きます.


ここで,この式を眺めていると気づくことがありませんか???
(式2)はx1とx2を変数とする2次元座標での領域を示しています.
この領域は線形(直線)によって分断されていますね...ここがポイントになります.
パーセプトロンが表すことができるのは,直線で分断することができる場合のみになります.よって,XORの場合を考えるとx1とx2の値の分布をうまく分けるような直線が引けないことがわかります.すなわちXORは非線形な領域をもつと言えます.
百聞は一見にしかず,下の図を見てください.

<img src="https://qiita-image-store.s3.amazonaws.com/0/258933/2d643ee9-98a1-ef1a-e36a-1301fc88b26c.jpeg" height="400px">

NADゲートは直線で分断できているのに対してXORゲートは直線では分断できていません.
では,XORゲートは諦めるしかないのでしょうか.

#それでもXORゲート
諦める必要はありません!なんとパーセプトロンは重ね合わせることができます.
では層を重ね合わせることで,XORゲートを実現させていきたいと思います.

| x1 | x2 | s1 | s2 | y |
|:-:|:-:|:-:|:-:|:-:|
| 0  | 0  | 1  | 0  | 0  |
| 0  | 1  | 1  | 1  | 1  |
| 1  | 0  | 1  | 1  | 1  |
| 1  | 1  | 0  | 1  | 1  |

s1 = x1 NAND x2
s2 = x1 OR x2
y = s1 AND s2

XORゲートが実現できましたね.
このように何層もパーセプトロンを重ねたものを 多層パーセプトロン と言います.
ではこれをPythonで実装していきましょう.

```python
# これまで作った論理ゲートクラスをインポート
import AND
import NAND
import OR

# XORクラスの作成
class XOR():
    def __new__(self,x1,x2):
        return AND.AND(NAND.NAND(x1,x2),OR.OR(x1,x2))

# 確かめてみる
print(XOR(0,0))
print(XOR(0,1))
print(XOR(1,0))
print(XOR(1,1))

````

Terminalでの実行結果は以下のようになります.

```terminal
********$ python XOR.py
0
1
1
0
```

無事,XORを実装することができました.

#まとめ
論理ゲートについては以上になります.
次はこれらの論理ゲートがどのようにコンピュータを構成しているのかをちょっとだけ勉強してみようかと思います.

次はこちら -> #5 [NANDは全ての論理ゲート](https://qiita.com/Motmuu/items/6ca263081a8f5ba8e8a2)
ubuntuのIP追加方法

# 起動中のOSに固定IPをセットする
```py
$ ip addr add 192.168.1.222/24 broadcast 192.168.1.255 dev eno1
$ ip a | grep 192.168.1
```

ちなみにnicのリストを出す
```
ip link show 
ip a
```

# 再起動後も有効な固定IPにする
```py
$ vi /etc/network/interfaces
auto eno1:8
iface eno1:8 inet static
        address 192.168.1.222
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.1
        # dns-* options are implemented by the resolvconf package, if installed
        dns-nameservers 8.8.8.8 4.4.4.4
```

再起動して設定変わらなければok
Unity と Mac で開発する Oculus Go アプリ #1 開封の儀 〜 開発者モードON

届いた↓
<img src="https://qiita-image-store.s3.amazonaws.com/0/33505/cd7ddeb7-4d1d-a345-b86a-ed091fd627d0.jpeg" width=50%/>

箱を開けると、こんな感じ
<img src="https://qiita-image-store.s3.amazonaws.com/0/33505/631ba1b3-b669-7591-f72f-2ad21cacc4d1.png" width=50%/>

初期設定はOculusアプリでおこなう
<img width="30%" alt="IMG_6010.png" src="https://qiita-image-store.s3.amazonaws.com/0/33505/cec9a125-1fe5-2db4-5c7b-fecb840fae0d.png">

利用規約とプライバシーの同意をすると、セットアップが始まります
<img width="30%" alt="IMG_6013.png" src="https://qiita-image-store.s3.amazonaws.com/0/33505/5a4fcdff-2fe3-92f1-fe0c-902b07805d2a.png">

安全に関する注意はすべて見ないと先に進めない
<img width="30%" alt="IMG_6023.png" src="https://qiita-image-store.s3.amazonaws.com/0/33505/f21d96dc-3395-2d78-f543-798cab196aa1.png">

これでセットアップは完了

---

開発者モードには、Oculusアプリからおこなう
<img width="30%" alt="IMG_6031.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/33505/63dceac2-fd0d-e91e-b9dc-e3e9e1298dc7.jpeg">

開発者モードを選択
<img width="30%" alt="IMG_6032.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/33505/349fbfc0-1728-9879-2529-860c1be7b7b0.jpeg">

OculusアプリにログインしているユーザがDeveloper登録していなければ、開発者登録をおこなう
<img width="30%" alt="IMG_6033.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/33505/d272d766-63cf-354f-13ea-fd55da01a919.jpeg">

Oculusストアに公開される団体名（個人名 or 社名）を登録
<img width="30%" alt="IMG_6034.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/33505/c1ddf17f-07e4-9205-e737-27b24ba1ea6b.jpeg">
あとで変更できるのだろうか・・・

Oculusアプリに戻り、再び開発者モードをONにすると、できた！
<img width="30%" alt="IMG_6035.png" src="https://qiita-image-store.s3.amazonaws.com/0/33505/799886a6-e248-b641-a467-e00f0cbbe4d2.png">

これで終わり
Pandas(Python) For Beginners.

# Pandas(Python) For Beginners.

##　実行環境
- Python3.6.5
- iMac (Retina 5K, 27-inch, 2017)
- プロセッサー　4.2 GHz Intel Core i7
- macOS High Sierra Ver.10.13.3

## Code作成の経緯
これまで、いくつもの会社のデータは、
"Excel"という名の煉獄で管理されていた。
そこに住むのは、悪魔よりももっと以前に存在していたと言う
マザーの手によるものだった...

...今回は、そんな煉獄から脱出する為に、
複数のファイルを一つに統合する術を学ぶ。
検索かけても柔軟性がなく、
やっつけみたいな記事しか引っかからないから、
どんな環境においても柔軟に実行可能なように書いてみた。


## 実際のCode.
```python3:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os, sys
dirpath = os.path.dirname(os.path.abspath(__file__))
sys.path.append(dirpath)
os.chdir(dirpath)

import pandas as pd
import numpy as np
import math

INPUT_FILE  = {}
OUTPUT_FILE = 'OutPut_File.xlsx'

ROOT = os.path.realpath('.') + '/'

DATAS = {}

def make_tree(dir_path=ROOT):
    file_dict = {}
    dir_path = dir_path.rstrip('/')
    def recur(path, list):
        for l in os.listdir(path):
            f = os.path.join(path, l)
            if l[0] == '.':
              continue
            elif os.path.isdir(f):
                list[l] = {}
                recur(f, list[l])
            elif l.split('.')[-1] in ['xlsx','xls']:
                list[l] = f[len(dir_path)+1:]
    recur(dir_path, file_dict)
    return file_dict

if __name__ == '__main__':
	tree = make_tree(ROOT)
	INPUT_FILE = list(tree)
	OUTBOOK = pd.ExcelWriter(OUTPUT_FILE)
	for n in range(len(tree)):
		with pd.ExcelFile(INPUT_FILE[n]) as WORKBOOK:
			SHEET_NAMES = WORKBOOK.sheet_names
			for t in range(len(SHEET_NAMES)):
				DATAS[SHEET_NAMES[t]] = pd.read_excel(WORKBOOK,  SHEET_NAMES[t], header=None)
				print(f'Fil_Name: {INPUT_FILE[n]}, Sheet_Name: {SHEET_NAMES[t]}')
				df = pd.DataFrame(DATAS[SHEET_NAMES[t]])
				df.to_excel(OUTBOOK,  sheet_name=SHEET_NAMES[t],header=False, index=False, index_label=None)

	OUTBOOK.save()
```

以上、これで一歩先に行くことができた...次は、統合されたファイルよりテーブル化する。

### 課題
- 処理に掛かった経過時間。
- メモリを監視。
- サブディレクトリのファイルも処理可能にする

---
### :::注意:::
現在(2018/05/24 初投稿日)は、同一ディレクトリー内に`'xlsx','xls'`を読み込んでいるがサブディレクトリー処置は施していない為、サブディレクトリーがある下層ではエラーになる。
今後対応予定　(いつかは未定)
Spring Securityを使いたい②

###認証処理
登録されたユーザーをどこかに登録しておいて、ログインで入力された値と照合する
データベースに登録でフォームで入力したい

###認証処理のアーキテクチャ
1.SecurityFilterのAuthenticationFilterにユーザ名とパスワードが渡される
2.AuthenticationFilterはAuthenticationManagerインターフェースの認証メソッドを呼び出す
3.ProviderManager(AuthenticationManagerインターフェースの実装クラス)は認証処理をAuthenticationProviderインターフェイスの実装クラス(DaoAuthenticationProvider)に任せる

#####AuthenticationFilter
認証方式を決める人
今回はフォーム認証を選択したい

####AuthenticationManager
AuthenticationFilterからの連絡を受ける電話機

####ProviderManager
AuthenticationManagerを使う人
コールセンターみたいなもので、処理をAuthenticationProvederに伝える機関

####AuthenticationProvider
ProvederManagerからの連絡を受ける電話機

####DaoAuthenticationProvider
AuthenticationProviderから処理の連絡があれば処理を受ける


###以下、フォーム認証の流れ
1.UsernamePasswordAuthenticationFilterがクライアントからリクエスト(ユーザ名、パスワード)を受け取る
2.UsernamePasswordAuthenticationFilterがAuthenticationManagerに認証処理を連絡する
3.AuthenticationManagerから連絡が返ってくる
4.UsernamePasswordAuthenticationFilterは成功・失敗で処理を振り分ける(成功時はAuthenticationSuccessHandler、失敗時はAuthenticationFailureHandlerへ)

#####xmlによるフォーム認証を使う設定

######security-config.xml
    <sec:http>
        中身
        <sec:form-login />
    </sec:http>


この記述でフォーム認証が有効になる
※特に何も設定しなければ、"/login"にGETでアクセスするとデフォルトのログインページが表示されて、ログインボタンを押すと"/login"に対してPOSTでアクセスするようになっている
UIColor.cgColor.componentsの不思議

# 前置き
UIColorのカラーコードとアルファ値を取り出すのに[`cgColor.components`を使う方法](https://qiita.com/KikurageChan/items/e1c00c53364e6e3e423a)を[紹介](https://qiita.com/417_72ki/items/31fcc8ec2a856259eee6#comment-7ae5c9e9622e5350c80f)して貰いましたが、ここで新たな疑問が発生しました。

# `components`プロパティ

CoreGraphics内では以下のように定義されています

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135304/612380da-4207-331c-426a-3cf729c6129a.png)

```swift
extension CGColor {

    public var components: [CGFloat]? { get }
}
```

`[CGFloat]?`...だと...?

ところが[公式Doc](https://developer.apple.com/documentation/coregraphics/cgcolor/2427146-components)を見てもこいつが`nil`になるケースについて言及されていません。

# 実際に調べてみた

とりあえず考えられる限りのパターンで生成した`UIColor`の`components`を取り出してみました。

<details><summary>コードはこちら</summary><div>

```swift
//: Playground - noun: a place where people can play

import UIKit

extension UIColor {
    var components: [CGFloat]? {
        return cgColor.components
    }
}

let max: CGFloat = 255
var color: UIColor
color = UIColor(displayP3Red: 250 / max, green: 50 / max, blue: 47 / max, alpha: 1.0)
color.components
color = UIColor(hue: 0.5, saturation: 0.7, brightness: 0.8, alpha: 1.0)
color.components
color = UIColor(white: 0.5, alpha: 1.0)
color.components
color = UIColor(red: 250 / max, green: 50 / max, blue: 47 / max, alpha: 1.0)
color.components

let image = #imageLiteral(resourceName: "hoge.jpg")
color = UIColor(patternImage: image)
color.components

let ciColor = CIColor(red: 50 / max, green: 174 / max, blue: 128 / max, alpha: 1.0)
color = UIColor(ciColor: ciColor)
color.components

if let cgColor = CGColor(colorSpace: CGColorSpaceCreateDeviceRGB(), components: [1.0, 0.0, 0.0, 1.0]) {
    color = UIColor(cgColor: cgColor)
    color.components
}

if let cgColor = CGColor(colorSpace: CGColorSpaceCreateDeviceGray(), components: [1.0, 1.0, 0.0, 1.0]) {
    color = UIColor(cgColor: cgColor)
    color.components
}

if let cgColor = CGColor(colorSpace: CGColorSpaceCreateDeviceCMYK(), components: [1.0, 1.0, 0.0, 1.0]) {
    color = UIColor(cgColor: cgColor)
    color.components
}
```
</div>
</details>

# 結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135304/0023ef0d-a74d-8e4f-f828-470e6a1395be.png)

結局`cgColor.components`が`nil`になるケースは発見できませんでした。
(誰か知ってる方いたら教えてくだちい...)
とはいえ、グレースケールだと`cgColor.components`の要素が`white`と`alpha`の2つになることが分かったので`cgColor.components`でRGBを取り出そうとするのはちょっと危ないなと思いました。

# 結論
大人しく`getRed(green:blue:alpha:)`を使おう
screenで画面を分割する方法(縦,横)と分割後のショートカットキー


# 最近のscreenだと縦分割に対応してる

昔はscreenってパッチ当てないと縦分割しなかったけど
screenのversion 4.01以降であれば縦分割できるらしい。

```shell
$ screen -v
Screen version 4.06.02 (GNU) 23-Oct-17
```

もし古かったらbrewでinstall

```shell
$ brew install screen   
```

# キーボードショートカット

エスケープは^aのままの前提です。
screenrcなどでエスケープキーを変更していたら(escape ^Ttなど)適宜読み替えてください。
大文字Sなどはシフト+sで入力します


|キー|意味|
|:---|:----|
|^a+S|画面を上下に2つにわける|
|^a+｜|画面を左右2つに分ける|
|^a+tag|分割された画面の次に移動する|
|^a+n|現在の画面を次のシェルに切り替える|
|^a+p|現在の画面を前のシェルに切り替える|
|^a+Q|分割した画面をやめる|
RSA暗号の簡単な解説

これまで何となくの理解で使ってきたRSA暗号について理解を深めるために、数学的な理論を調べて（自分なりに）わかりやすくまとめてみました。

#### 基本理論

* $p$ 、$q$ が素数であるとき、$x \equiv 1 \  (\mathrm{mod}\ (p-1)(q-1))$ を満たす $x$ について、$a^x \equiv a \  (\mathrm{mod}\ pq)$ が成り立つ。
  * 例えば、$p=3$、$q=5$ とすると、$x = 9, 17, \cdots$ となり、$3^9 = 19683 \equiv 3 \  (\mathrm{mod}\ 15)$、$2^{17} = 131072 \equiv 2 \  (\mathrm{mod}\ 15)$ となる。
  * この式はオイラーの定理から導出できる。導出方法の簡単な説明は※1を参照。
* $x = de \equiv 1 \  (\mathrm{mod}\ (p-1)(q-1))$ となるような整数 $d$、$e$ を用意し、$d$、$pq$ を公開鍵、$e$ を秘密鍵とする。
  * 送信者はメッセージ $a$ を $e$（公開鍵）乗することで暗号文 $a^e \  (\mathrm{mod}\ pq)$ を作成し、受信者は暗号文を $d$（秘密鍵）乗することで復号：$(a^e)^d = a^x \equiv a \  (\mathrm{mod}\ pq)$ して元のメッセージ $a$ を取り出せる。
  * ここで、公開鍵 $pq$ から $p$、$q$ を求めること（素因数分解）は現実的な時間で計算できないため、$(p-1)(q-1)$ を求めて $x$ を割り出し、$d$（秘密鍵）を求めることも困難となる。

##### ※1 式の導出の簡単な説明

* $a$ と $n$ が互いに疎な正の整数であるとき、$a^{\phi(n)} \equiv 1 \  (\mathrm{mod}\ n)$ が成り立つ。（オイラーの定理）
* ここで、オイラー関数 $\phi(n)$ は $n$ と互いに疎な数の個数を表すが、$n$ が素数 $p$、$q$ の積（$n = pq$）である場合を考える。
* $n$ が素数であったとすると、$\phi = n-1$ となる（フェルマーの小定理）が、今回は $p$ と $q$ の倍数がそれぞれ$(q-1)$、$(p-1)$ 個ずつ含まれるので、$\phi(n) = (pq-1) - (q-1) - (p-1) =  (p-1)(q-1)$ となる。
* よって、$x \equiv 1 \  (\mathrm{mod}\ (p-1)(q-1))$ を満たす $x$ について、$x = 1 + k(p-1)(q-1) = 1+ k\phi(n)$ と置くことができ、$a^x = a^{1 + k\phi(n)} = a \cdot (a^{\phi(n)})^k \equiv a \cdot 1^k =a \  (\mathrm{mod}\ pq)$ となる。

#### 鍵生成・暗号化・復号の手順

##### 鍵生成

- 大きな素数 $p$ (prime1) 、$q$ (prime2) を生成する。
- $(p-1)(q-1)$ と互いに素な整数 $e$ (public exponent) を用意する。
  - 一般的に $e$ には $65537$ が使われる。（[参考](https://en.wikipedia.org/wiki/65,537)）
- 拡張ユークリッド互除法で $d e \equiv 1 \  (\mathrm{mod}\ (p-1)(q-1))$ となる $d$ (private exponent) を求める。
- $n \  (=pq)$ (modulus) と $e$ を公開鍵、$d$ を秘密鍵とする。

##### 暗号化

- メッセージ $m (0 \geq m \geq n)$ から公開鍵を使って暗号文 $C$ を求める。
- $C = m^{e} \  (\mathrm{mod}\ n)$

##### メッセージの復号

- 暗号文 $C$ と秘密鍵 $d$ を用いて、復号する。
- $C^{d} = m^{e d} \equiv m \  (\mathrm{mod}\ n)$

#### 参考

* http://www.maitou.gr.jp/rsa/
* http://tsujimotter.hatenablog.com/entry/euler-function
* https://mathtrain.jp/rsaango
Unity ARkit Plugin のメモ

## 環境

- Unity 2017.2.0p4
- Unity ARKit Plugin 1.0.14
- macOS 10.12 Sierra  
（2018年2月）

## UnityARCameraManager

- ARKitの起動や座標の移動、回転処理を更新している。

## UnityARAnchorManager

- 認識した情報からPlaneを生成してキー情報を保持している。

### ■Generate Planeした平面を削除する

UnityARAnchorManagerの`Destroy()`を呼び出すと、認識した平面オブジェクトを削除できる（キー情報含む）。
同時にNativeInterfaceのイベントも削除される。

```c#:UnityARAnchorManager.cs
public void Destroy()
{
   foreach (ARPlaneAnchorGameObject arpag in GetCurrentPlaneAnchors() {
      GameObject.Destroy (arpag.gameObject);   //平面オブジェクト削除
   }
   planeAnchorMap.Clear();   //アンカー情報削除
   UnsubscribeEvents();      //イベント削除
}

public void UnsubscribeEvents()
{
   UnityARSessionNativeInterface.ARAnchorAddedEvent -= AddAnchor;
   UnityARSessionNativeInterface.ARAnchorUpdatedEvent -= UpdateAnchor;
   UnityARSessionNativeInterface.ARAnchorRemovedEvent -= RemoveAnchor;
}
```

#### 平面オブジェクトをリセットして再配置する場合

`UnsubscribeEvents()`をコメントアウトしてPlane生成イベントを削除させないようにする。

### ■床を認識して足元の高さを取得（VR向け）

UnityARAnchorManagerの`GetCurrentPlaneAnchors()`に、認識した平面のオブジェクトがリスト化されている。

```c#:UnityARAnchorManager.cs
public List<ARPlaneAnchorGameObject> GetCurrentPlaneAnchors()
{
   return planeAnchorMap.Values.ToList ();
}
```
必要な平面のオブジェクトのY軸を利用して足元の基準を取得する。

```c#:FloorSet.cs

[SerializeField]
private GameObject objFloor;

private UnityARAnchorManager unityAnchor;

void Start()
{
   unityAnchor = new UnityARAnchorManager();
}

//ボタンなどに設定
public void OnClick()
{
   //平面が認識されている時
   if(unityAnchor.GetCurrentPlaneAnchors().Count != 0) {

      //1個目の平面オブジェクトのポジション取得
      Vector3 vFloor = unityAnchor.GetCurrentPlaneAnchors()[0].gameObject.transform.position;

      //VR空間の高さを変更する
      objFloor.transform.position = new Vector3 (0f, vFloor.y, 0f);
   }
}
Spring Securityを使いたい

###フレームワークのアーキテクチャ

1.クライアントからのリクエスト
2.FilterChainProxyクラスがリクエストを受け取って、HttpFirewallインターフェースのメソッドを使ってHttpServletRequestとHttpServletResponseにファイヤーウォールの機能を搭載する
3.FilterChainProxyクラスからSecurityFilterChainクラスに処理を任せる
※SecurityFilterChainには何層にもフィルターが重なっていて、それを順々に通っていく。ろ過されていくイメージ。
5.ろ過されて出てきたものは後続処理を終えて、Webアプリケーションのリソースの中に渡されていく
6.[2]のFilterChainProxyクラスはWebアプリケーションから返却されたリソースをクライアントに返却する

###FilterChainProxy
フレームワーク処理の司令塔

###HttpFirewall
HttpServletRequestとHttpServletResponseにファイヤーウォールを教えてあげる先生

###SecurityFilterChain
ろ過器
中身にろ過成分が入っている
あくまで器

######xmlでのBean定義法
    <sec:http pattern="/ui/**">
        中身
    </sec:http>

    <sec:http pattern="上と同じようにパスを入れる">
    </sec:http>

こうやって何層にもフィルターを設定していってあげる

###Security Filter
ろ過成分
サーブレットフィルタクラス

###まとめ
こうやってSpring Securityはできています。
ビルド環境なしで Hyperapp をおためし

「1 kB JavaScript framework」を謳う [Hyperapp](https://hyperapp.js.org/) をさくっとお試し。

## 確認環境

* Google Chrome
    * バージョン: 66.0.3359.181（Official Build） （64 ビット）


## ソースコード

[Github 上の README](https://github.com/hyperapp/hyperapp) に書いてある例をちょっと書き換える。

```html
<!DOCTYPE html>
<html>
<body>
<script src="https://unpkg.com/hyperapp"></script>
<script type="text/javascript">
    const state = {
      count: 0
    }

    const actions = {
      down: value => state => ({ count: state.count - value }),
      up: value => state => ({ count: state.count + value })
    }

    const view = (state, actions) =>
        hyperapp.h(
            "div",
            {},
            [
                hyperapp.h("h1", {}, state.count),
                hyperapp.h("button", { onclick: () => actions.down(1) }, "-"),
                hyperapp.h("button", { onclick: () => actions.up(1) }, "+")
            ]
        )

    hyperapp.app(state, actions, view, document.body)
</script>
</body>
</html>
```

## 動作確認

![hyperapp.gif](https://qiita-image-store.s3.amazonaws.com/0/49690/815bd480-d185-3878-5101-dced1915c50a.gif)

## ポイント

* README に書いてある通り、CDN から読み込んだ場合 `window.hyperapp` を介してアクセスできる
* JSX は解釈できないので代わりに `h()` を利用する
Git初心者なのでpullでつまづいたのでメモ

`git push origin 今いるブランチ` の反対は、`git pull origin 今いるブランチ` だと思ったらそうじゃなかったのでまとめます。

### 登場人物紹介

- 現在のローカルブランチ → `google-button`
- Default のリモートブランチ → 　`master`
- 追跡ブランチ → `origin/master` 

## やったこと

### `$ git pull origin HEAD`

```
$ git pull origin google-button
```
が失敗したので、無理やり、

```
$ git pull origin HEAD
 * branch            HEAD       -> FETCH_HEAD
```
とやったら、自分の望んだ通り、現在のローカルブランチにリモートブランチがマージされた。

ここで出てくる言葉を整理すると、

- `origin` は GitHub リポジトリ URL の別名
- `HEAD` はデフォルトで設定されているリモートのブランチ 
  - `git branch -a` で確認できる。
    - `HEAD` は今いるブランチだと思って上記コマンドを打った。

### `$ git pull origin master`

`pull` についての説明でよく出てくるのはこっち。

```
$ git pull origin master
 * branch            master     -> FETCH_HEAD
   XXXXXXX..XXXXXXX  master     -> origin/master
```

- `git pull origin HEAD` と同様、現在のローカルブランチにリモートブランチがマージされた。


### `$ git fetch` → `$ git merge origin/master`

`git pull` = `git fetch` + `git merge` ということなので。

```
$ git fetch
   master     -> origin/master
```

- リモートブランチが追跡ブランチにマージされた。
- この時点で `git checkout FETCH_HEAD` すると、 `fetch` されたコードがみれた。

```
$ git merge origin/master
```

- 現在のローカルブランチに追跡ブランチがマージされた。


## まとめ

[git push の反対は git pull ではない](https://qiita.com/usamik26/items/28be7d2c221a7a53c2c3) によると、

> `git push` は、ローカルのリポジトリの内容をリモートのリポジトリに送り込むコマンドです。
> `git fetch` は、リモートのリポジトリの内容をローカルのリポジトリに取り込むコマンドです。

なので、

- `git push` の対になるのは `git fetch` である！
- `git pull origin リモートブランチ` を現在のローカルブランチで行ったら、リモートブランチの内容をマージできる！
バックスラッシュ（\）と半角円記号（¥）

メイリオやＭＳ Ｐゴシックではバックスラッシュ（\）と円記号（¥）が同じ見た目に表示されるので注意が必要

# ブラウザで表示する際に注意すること

* テキスト

`&yen;`にする。
画面で表示される際は半角円記号（¥）になります。

* 入力欄等

`font-family: Arial;`等の見た目が異なるフォントを使用する。
フォント対応を行わないと正規表現入力欄等はWindowsのブラウザでは悲惨なことになる(バックスラッシュと円記号の見た目が同じになるので)

# 所感

Windowsユーザーはテキストを打つ際に半角円記号を入力してるつもりでバックスラッシュを入力していることがあるんじゃないかと思えてきてモヤモヤする。
Visitor Pattern

# Visitor Pattern
- Visitor pattern is used when we have to perform an operation on a group of similar kind of Objects. With the help of visitor pattern, we can move the operational logic from the objects to another class.
- The benefit of this pattern is that if the logic of operation changes, then we need to make change only in the visitor implementation rather than doing it in all the item classes.
- Another benefit is that adding a new item to the system is easy, it will require change only in visitor interface and implementation and existing item classes will not be affected.

# Reference
- [tutorialspoint:Visitor](https://www.tutorialspoint.com/design_pattern/visitor_pattern.htm)
- [journaldev:Visitor](https://www.journaldev.com/1769/visitor-design-pattern-java)
- [geeksforgeeks:Visitor](https://www.geeksforgeeks.org/visitor-design-pattern/)
- [iluwatar:Visitor](https://github.com/iluwatar/java-design-patterns/tree/master/visitor)
Strategy Pattern

# Strategy Pattern
- a class behavior or its algorithm can be changed at run time.
- we create objects which represent various strategies and a context object whose behavior varies as per its strategy object. The strategy object changes the executing algorithm of the context object.
- similar to "State Pattern". "State Pattern" use different object based on state but "Strategy Pattern" is based on strategy.

 
# Reference
- [tutorialspoint:Strategy](https://www.tutorialspoint.com/design_pattern/strategy_pattern.htm)
- [journaldev:Strategy](https://www.journaldev.com/1754/strategy-design-pattern-in-java-example-tutorial)
- [geeksforgeeks:Strategy](https://www.geeksforgeeks.org/strategy-pattern-set-1/)
- [iluwatar:Strategy](https://github.com/iluwatar/java-design-patterns/tree/master/strategy)
State Pattern

# State Pattern
- we create objects which represent various states and a context object whose behavior varies as its state object changes.
- If we have to change the behavior of an object based on its state, we can have a state variable in the Object. Then use if-else condition block to perform different actions based on the state. State design pattern is used to provide a systematic and loosely coupled way to achieve this through Context and State implementations.

# Reference
- [tutorialspoint:State](https://www.tutorialspoint.com/design_pattern/state_pattern.htm)
- [journaldev:State](https://www.journaldev.com/1751/state-design-pattern-java)
- [geeksforgeeks:State](https://www.geeksforgeeks.org/state-design-pattern/)
- [iluwatar:State](https://github.com/iluwatar/java-design-patterns/tree/master/state)