OmniAICreator/Qiita-1.07M huggingface dataset:
Swiftではnamespaceとしてcaseなしenumが使える

# こういうメリットがあるよ

```swift
// classやstructをnamespaceがわりに使ったとき、
class C1 {
    static func xxx() {}
}
// C1をインスタンスとして使いたくないのに、C1のインスタンスを作れてしまう
let c1 = C1()
```

```swift
class C2 {
    static func xxx() {}

    // こうやってイニシャライザを外から呼べないように殺せば、
    private init() {}
}
// たしかにインスタンス化を防ぐのは可能
let c2 = C2() // ⛔️'C2' initializer is inaccessible due to 'private' protection level

// だが…こういう引数を書けてしまうことは避けられない
func doSomething(c2: C2) {
    print("c2のインスタンスを期待する処理")
}
```

```swift
enum E {
    static func xxx() {}

    // caseなしenumならイニシャライザをprivateにして殺す必要もないし、
}

// コンパイラが「eのインスタンスなんてないよ」と警告してくれる
func doSomething(e: E) {
    print("eのインスタンスを期待する処理") // ⚠️Will never be executed
}
```

## 🤔列挙しないenumって……トリッキーすぎない？

否。
そう感じられるかもしれませんが、実はStandard Libraryでも活用されてるんですよ。
なので、enumがnamespaceになりうるというのはお墨付きです。

例:

https://developer.apple.com/documentation/combine/publishers

> A namespace for types that serve as publishers.
> 
> ```swift
enum Publishers
```

https://developer.apple.com/documentation/swift/unicode

> A namespace for Unicode utilities.
> 
> ```swift
@frozen enum Unicode
```

## 🤔 `namespace` キーワードとか導入して明確に区別できればいいんじゃない？

ワイトもそう思います。
Swift Forumsでも議論はされているのが見当たるんですが……
でもnamespaceのメンバはstaticつけるのかつけないのか、submodule導入するアプローチはどうか、いやそれは別物で、とか色々論点が出てきて、今は議論が止まっちゃってるみたいに見えます。

https://forums.swift.org/t/namespace-keyword/11338
https://forums.swift.org/t/namespaces-x-submodules/11673

となれば、まあcaseなしenumは現実解としては必要十分じゃないでしょうか。
Neo4j用語

この記事にNeo4jに関する用語をまとめる

###関連
[グラフ理論に関する用語](https://qiita.com/euonymus/items/bb9f5f0825e76c446c0d)

### Software
|用語|説明|
|---|---|
|Neo4j|Graph databaseの一つ|
|Bolt|Neo4jの公式言語ドライバー|

### Web Tools
|用語|説明|
|---|---|
|Neo4j Browser|Neo4jの操作を行うWebツール|
|Sandbox|Neo4j Browserを使ったテスト用DB(数日で消える無料DB)|

### Language
|用語|説明|
|---|---|
|Cypher Query|Neo4jのクエリ言語|
|Clause|Cypherの句（ex: MATCH, CREATE, WHERE など）|

### Resources
|用語|説明|
|---|---|
|Node|Entities or Objects in the graph|
|Relationship|Node間を接続する情報（Edge）|
|Property|NodeとRelationshipに付属させる情報。Key-Valueのペア。|
|Label|Nodeの役割を示すラベル。Ontologyで言うところのRole|
|Type|Relationshipの種類を示す。|

###一般用語との比較
Neo4j、Graph theory、Ontologyのそれぞれにて、ほぼ同じ事を指す言葉が別々に定義されているのでまとめる

|Neo4j|Graph theory|Ontology|
|---|---|---|
|Node|Node|Entity|
|Relationship|Edge|Relation|
|Label|Label|Role|
UnityのQuaternionとVector3を手書きで変換した件について

# 初めに
仕事でunityで行っていた機能をc++で書いているサーバに引っ越すことになりその際に調べたので備忘録として書いてます。
ちなみにQuaternionとVector3の変換は扱っている座標系などによって異なるためいくつか種類があります。ここではUnityで動いているものを基準に書きます。unityは(pitch,yaw,roll)=(x,y,z)で回転順はZXYです。
理由など詳しいこと調べたい方向けというよりは答えが知りたい人向けです。（理解してないなんていえない・・・）


# QuaternionからVector3への変換
```c++
Vector3 Quaternion_to_Vector3(Quaternion r)
{
    float x = r.x;
    float y = r.y;
    float z = r.z;
    float w = r.w;

    float x2 = x * x;
    float y2 = y * y;
    float z2 = z * z;

    float xy = x * y;
    float xz = x * z;
    float yz = y * z;
    float wx = w * x;
    float wy = w * y;
    float wz = w * z;

    // 1 - 2y^2 - 2z^2
    float m00 = 1.f - (2.f * y2) - (2.f * z2);

    // 2xy + 2wz
    float m01 = (2.f * xy) + (2.f * wz);

    // 2xy - 2wz
    float m10 = (2.f * xy) - (2.f * wz);

    // 1 - 2x^2 - 2z^2
    float m11 = 1.f - (2.f * x2) - (2.f * z2);

    // 2xz + 2wy
    float m20 = (2.f * xz) + (2.f * wy);

    // 2yz+2wx
    float m21 = (2.f * yz) - (2.f * wx);

    // 1 - 2x^2 - 2y^2
    float m22 = 1.f - (2.f * x2) - (2.f * y2);


    float tx, ty, tz;

    if (abs(m21 - 1.f) < 0.000001f)
    {
        tx = M_PI / 2.f;
        ty = 0;
        tz = atan2(m10, m00);
    }
    else if (abs(m21 + 1.f) < 0.000001f)
    {
        tx = -M_PI / 2.f;
        ty = 0;
        tz = atan2(m10, m00);
    }
    else
    {
        tx = asin(-m21);
        ty = atan2(m20, m22);
        tz = atan2(m01, m11);
    }

    tx = tx / M_PI * 180;
    ty = ty / M_PI * 180;
    tz = tz / M_PI * 180;

    Vector3 res;
    res.x = tx;
    res.y = ty;
    res.z = tz;

    return res;
}
```

# Vector3からQuaternionへの変換
```c++

Quaternion Vector3_to_Quaternion(Vector3 rot)
{
    float x = rot.x * M_PI /180.f;
    float y = rot.y * M_PI /180.f;
    float z = rot.z * M_PI /180.f;

    float c1 = cos(x * 0.5f);
    float c2 = cos(y * 0.5f);
    float c3 = cos(z * 0.5f);

    float s1 = sin(x * 0.5f);
    float s2 = sin(y * 0.5f);
    float s3 = sin(z * 0.5f);

    // Unity's order is 'YXZ'
    float qx = s1 * c2 * c3 + c1 * s2 * s3;
    float qy = c1 * s2 * c3 - s1 * c2 * s3;
    float qz = c1 * c2 * s3 - s1 * s2 * c3;
    float qw = c1 * c2 * c3 + s1 * s2 * s3;

    Quaternion res;
    res.x = qx;
    res.y = qy;
    res.z = qz;
    res.w = qw;

    return res;
}
```
[Java]Stringクラスを使って特定の文字列の手前までを取得する方法

文字列の取得の方法としてメモ書き。

Stringクラスには、最初に出現する文字列を取得する場合にはindexOfメソッドを、最後に出現する文字列を取得する場合はlastIndexOfメソッドを使用することで特定の文字列を取得することができる。

基本的な書き方はこんな感じ。

最初に出現する位置 = オブジェクト.indexOf(値)

最後に出現する位置 = オブジェクト.lastIndexOf(値)

今回はStringクラスでの使用方法についてまとめてみる。

⑴indexOfメソッド

・indexOf(int ch)
(戻り値の型はint)

この文字列内で、指定された文字が最初に出現する位置のインデックスを返します。値chを持つ文字がこのStringオブジェクトによって表される文字シーケンス内にある場合、最初に出現する位置のインデックス(Unicodeコード単位)が返されます。chの値が0から0xFFFFの範囲にある場合、次の式がtrueとなるような最小値kが返されます。
 this.charAt(k) == ch
がtrueである。chがほかの値の場合、次の式がtrueとなるような最小値kです。
 this.codePointAt(k) == ch
がtrueである。該当する文字がこの文字列内にない場合は、-1が返されます。
パラメータ:
ch - 文字(Unicodeコード・ポイント)。
戻り値:
このオブジェクトによって表される文字シーケンス内で、指定された文字が最初に出現する位置のインデックス。文字がない場合は-1。


・indexOf(int ch, int fromIndex)
(戻り値の型はint)
この文字列内で、指定されたインデックスから検索を開始し、指定された文字が最初に出現する位置のインデックスを返します。
値chを持つ文字が、このStringオブジェクトによって表される文字シーケンスのfromIndexより大きいか同じインデックス位置にある場合、該当する最初のインデックスが返されます。chの値が0から0xFFFFの範囲にある場合、次の式がtrueとなるような最小値kが返されます。
 (this.charAt(k) == ch)  && (k >= fromIndex)
 
がtrueである。chがほかの値の場合、次の式がtrueとなるような最小値kです。
 (this.codePointAt(k) == ch)  && (k >= fromIndex)
 
がtrueである。いずれの場合も、そのような文字がこの文字列内の位置fromIndexかそれより後に存在しない場合は、-1が返されます。
fromIndexの値に対して制約はない。負の値の場合は、ゼロの場合と同じ結果になります。この文字列全体が検索されます。この文字列の長さより大きい場合は、この文字列の長さに等しい場合と同じ結果になり、-1が返されます。
すべてのインデックスは、char値(Unicodeコード単位)で指定されます。
パラメータ:
ch - 文字(Unicodeコード・ポイント)。
fromIndex - 検索開始位置のインデックス。
戻り値:
このオブジェクトによって表される文字列で、指定された文字がfromIndexと同じかこれより大きいインデックス位置にある場合は、最初に出現した位置のインデックス。文字がない場合は-1。

(2)lastIndexOfメソッド
・lastIndexOf(int ch)
この文字列内で、指定された文字が最後に出現する位置のインデックスを返します。ch値が0から0xFFFFの範囲にある場合、返されるインデックス(Unicodeコード単位)は、次の式に該当する最大値kです。
 this.charAt(k) == ch
がtrueである。chがほかの値の場合、次の式がtrueとなるような最大値kです。
 this.codePointAt(k) == ch
がtrueである。該当する文字がこの文字列内にない場合は、-1が返されます。Stringの検索は最後の文字から開始され、先頭方向に行われます。
パラメータ:
ch - 文字(Unicodeコード・ポイント)。
戻り値:
このオブジェクトによって表される文字シーケンス内で、指定された文字が最後に出現する位置のインデックス。文字がない場合は-1。

・lastIndexOf(int ch, int fromIndex)
(戻り値の型はint)

この文字列内で、指定された文字が最後に出現する位置のインデックスを返します(検索は指定されたインデックスから開始され、先頭方向に行われる)。ch値が0から0xFFFFの範囲にある場合、返されるインデックスは、次の式に該当する最大値kです。
 (this.charAt(k) == ch)  && (k <= fromIndex)
がtrueである。chがほかの値の場合、次の式がtrueとなるような最大値kです。
 (this.codePointAt(k) == ch)  && (k <= fromIndex)
がtrueである。いずれの場合も、そのような文字がこの文字列内の位置fromIndexかそれより前に存在しない場合は、-1が返されます。
すべてのインデックスは、char値(Unicodeコード単位)で指定されます。
パラメータ:
ch - 文字(Unicodeコード・ポイント)。
fromIndex - 検索開始位置のインデックス。fromIndexの値に対して制約はない。この文字列の長さと同じかこれより大きい場合は、この文字列の長さより1小さい場合と同じ結果になり、この文字列全体が検索される。負の値の場合は、-1の場合と同じ結果になり、-1が返される。
戻り値:
このオブジェクトによって表される文字シーケンス内で、指定された文字がfromIndexと同じかこれより小さいインデックス位置に最後に出現する位置のインデックス。指定された文字がその位置より前にない場合は-1。

参考サイト
・Java(tm) Platform Standard Edition 8 クラスString
https://docs.oracle.com/javase/jp/8/docs/api/index.html?overview-summary.html

・すぐに使える！JavaのindexOfとlastIndexOf - エンジニアの入り口
https://eng-entrance.com/java-indexof
アジャイルが全て良いわけではない（ウォーターフォールをしないといけないものも多数ある）

![Pace-Layered Application Strategy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/c4266bdc-0adf-dcbb-e987-f7525682815c.png)

ガートナーがきれいにまとめてくれていた資料をベースに2017年に自分なりに整理していた資料。少し古いが現時点でも有効な資料として活用できる。当時はBi-modal IT, バイモーダルITと言う言い回しが海外ではされていたかと思う。

アジャイル、アジャイルと言うが、アジャイル手法が使えるのはイノベーション系のシステムで要求事項がクリアではなく（事前にクリアにすることもできず）、ソリューション自体が使ってみないとわからない状態でテストしないと結果がなんとも言えないもの。

一方で基幹システム（わかりやすく言うと人事のマスタ関連や、財務会計（制度会計）やサプライチェーン（在庫管理など））は法的に決まっている要素もそれなりにあり、例えば例として勘定科目体系の変化がコロコロ起きては膨大な周辺のシステムやレポートの作成し直しが発生してしまい困る。この手の類のシステムは結果として何が必要なのかは事前に明確にしてから開発する手法、いわゆるウォーターフォールが最適になる。

ガバナンスが強く必要か否か、変化が多くあって良いかいけないかはシステムの特性によって異なる。

この基本的なフレームワークと言うか考え方を理解をしていないSIer、ITコンサルタント、ITエンジニア、もっと言うと経営層（とにもかくにもアジャイルがベストでウォーターフォールは時代遅れ的な考え方を持った人たち）がかなり多い気がする。考えてみれば当然なことだが、なんか時代の雰囲気に乗せられてしまっている人が多い。

私が火消しに回ったプロジェクトの根本的な問題もここ（ウォーターフォールでかっちりやらないといけないのにアジャイルをする社内SE, SIer）にあったりした。基幹システムの構築で詳細な要件一覧、課題管理表が無いってどういうこと！ってことからスタートしたのは2年前ではなく、今年に入ってから、つい前の話だった。

ちなみにIT投資（保守運用含む）がされているかされていないか、妥当な金額かどうかの判断基準の一つが売上の１％〜２％。こちらもガートナーからきていたと思うが、FinTechのような先行投資しないとビジネスにならない企業もあれば製造業もあるので必ず妥当かと言うと困ることもあるが一般的な事業会社として何か参考となる値はと聞かれたら売上の１％〜２％は覚えておいた方が良さそう。これは基幹システムやアジャイルなイノベーション系のシステム全てを含めた費用感になる。
PHP標準入力(足し算)

# PHP標準入力(足し算)
### 
私はどうしても標準入力が苦手で…:sweat_smile:
まず簡単な足し算からと思い、検索したら
理解できました！:relaxed:
配列自体は基本的なことは理解してるので、そんなに難しくなかったですね！

#### 入力値が横の場合 
```
5 7 8
```
```
$i=trim(fgets(STDIN));
$o=explode(" ",$i);
$p=$o[0]+$o[1]+$o[2];
echo $p;
```

#### 入力値が縦の場合
```
5
7
8
```
```
$i=trim(fgets(STDIN));
$o=trim(fgets(STDIN));
$p=trim(fgets(STDIN));
echo $i+$o+$p;
```

足したらどちらも合計20になります！
プログラミング始めて2ヶ月ぐらいなので簡単なことでも思ったことがあればアウトプットしていきます。
【python】画像処理その1 ~画像を読み込んで表示~

#必要なライブラリをインポート#

```python

from PIL import Image
import numpy as np
from matplotlib import pylab as plt
from scipy import ndimage
```

画像を表示するだけなら下の3つは要らないようですが,
今後いろいろいじりたいのでインポートしてます.


#画像ファイルを開く#

```python
img = np.array(Image.open('表示したい画像のパス'))
```

`Image.open`で画像を読み込んで`np.array`で**ndarray**にしますです.

#画像を表示#

```python
plt.imshow(img)

plt.show()
```

この二行はどっちがかけても表示されないので気を付けてください.

#ここまでの全体のコード#

```python
from PIL import Image
import numpy as np
from matplotlib import pylab as plt
from scipy import ndimage

img = np.array(Image.open('表示したい画像のパス'))

plt.imshow(img)

plt.show()
```

#表示結果#
![image-processing-1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/0de45741-2028-9839-2c7f-85903dda79bc.png)

#参考#
・[Matplotlibで画像を表示](https://qiita.com/zaburo/items/5637b424c655b136527a)
・[Python, NumPyで画像処理（読み込み、演算、保存）](https://note.nkmk.me/python-numpy-image-processing/)
フォームが更新された時に入力内容を取得する

以下投稿と関連して記載します。
[フォームが更新された時にどのフォームが更新されたか確認する：Googleフォーム - スプレッドシート](https://qiita.com/wau/items/44ad4558fea61888df98)

## 目的
Googleフォームの更新された時にフォームと対応したスプレッドシートでGAS処理をしたい。

### 詳細
フォーム更新をトリガーにonFormSubmit()を呼び、その中で今回フォームに入力された情報を取得する。

### 利点
getLastRow()を使って最後に書かれた行をスプシから取得する手もあるけど、getLastRowって結構うまくいかない事が多い。
今回の方法の方が処理時間も実装時間も節約できるのでは。

## 方法
こんな感じ。

```js:sample.gs
function onFormSubmit(e) {
  var range = e.range;
  var form_name = range.getSheet().getSheetName();
  Logger.log("form_name: " + form_name);
  //どのフォームが更新されたかを一応確認
  if(form_name == "SampleForm"){
    //フォームに入力された内容を取得
    var itemResponses = e.values;
    itemResponses.forEach(function(itemResponse, index){
      //各入力内容を処理
      Logger.log("No." + index + ": " + itemResponse);
    })
  }
}
```

## 追記
itemResponseの内容は回答した項目が順番で入ってきます。
回答していない項目は飛ばされるので注意してくださいね。

例えばフォームに設定している質問が
`質問A, 質問B, 質問C`で、回答が`回答A, 回答C`だけのときもありますよね。
Bが入力必須じゃなければ未回答になることもあるので。

そのときのindex, responseは
`0: 回答A, 1: 回答C`
となるので注意してください。

`0: "回答A", 1: "", 2: "回答C"`とかを期待すると事故るので注意です。
「どの質問に対する回答か」を把握したい場合はgetTitle()でどの質問かが分かるのでそっち使いましょう。
Vue.jsについての基礎（Nuxt.js）

#はじめに
おはようございます。こんにちは。こんばんは。
ワタタクです。
今回はNuxt.jsについて見けいけたらいいなと書いています。
#Nuxt.jsとは？
[公式サイト](https://ja.nuxtjs.org/guide/)に詳しく書いていますが、Vue.js アプリケーションを構築するためのフレームワークです。
**サーバーサイドレンダリング**するアプリケーションの開発のために必要な設定があらかじめセットされているのが特徴です。

#サーバーサイドレンダリングとは？
Vue.jsなどでDOMの構築をクライアント側で行うと、サイトにアクセスした際に一瞬画面が表示されない状態になります。
サーバー側で初期状態のDOMレンダリングを完了した状態で返すことで、サイトにアクセスした際にすぐに画面を描画することができます。
これをサーバーサイドレンダリング(SSR)と呼びます。

#Nuxt.jsを使ってみよう
では、早速使ってみましょう。
今回も``「vue-cli」``を使います。
``「vue-cli」``がインストールされていない場合は、以下のコマンドを実行してvue-cliをインストールしてください。

```console
$ npm install -g vue-cli
```
vue-cliがインストールされたら、以下のコマンドを実行すると、Nuxtのテンプレートプロジェクトが作成されます。
ここでは「sample」というプロジェクト名で作成します。

```console
$ vue init nuxt-community/starter-template sample
```
sampleディレクトリに、プロジェクトが作成されます。
以下のコマンドを実行して、必要なライブラリをインストールします。

```console
$ cd sample
$ npm install
```
開発サーバーを起動します。

```console
$ npm run dev
```
localhost:3000でNuxtのサンプルアプリが起動します。
<img width="926" alt="sample.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116696/9dde499b-bb2b-0e2c-0e72-9836cf72d176.png">

#ページの追加
従来Vue.jsでSPA作るときはVue-Routerを使っていました。
その際、componentを作成して、Vue-RouterでURIとcomponentをマッチングするための定義を記述していましたが、Nuxt.jsでは、pagesディレクトリにページ用のcomponentを配置します。
pagesディレクトリに*.vueファイルを配置することで、自動でルーティングの定義を行ってくれます。
例えば、
``/pages/users/index.vue``を作成するだけで、自動的に/usersのURIとマッチングしてくれて、
http\://localhost:3000/users
にアクセスすると、作成した``/pages/users/index.vue``のページが表示されます。
##[TIPS]
ビューにあたる部分は/components /layouts /pages となる
このディレクリ名は変更不可

- components：``layouts``や``pages``に使用できるコンポーネントファイル
- layouts：``pages``内のVueファイルが表示される（デフォルト以外にも作れる）
- pages：ページごとのVueファイル、ここで作ったディレクトリ通りにルーティングが作られる

<font color="red">ページ間を遷移するためには ``<nuxt-link>`` コンポーネントの使用を推奨します。</font>
あとはVue.jsの知識があれば、だいたいの事は出来ます。
Nuxt.jsを触る前に一通りVue.jsを勉強しといた方がいいかもしれませんね。
[Vue.jsについての基礎(基本構文)](https://qiita.com/watataku/items/346a7d51b90610b08810)←勉強の参考までに

#まとめ
従来のVue.jsでSPAを作る際は、自由度があるが故に、自分でVue-Routerをもってきたり、Vuexをもってきたり、最初のプロジェクトを作る時にはいろいろ手探りしながらやっていました。
それらがNuxt.jsには最初から含まれているので、フロントエンド開発に慣れていない方でもすごくとっつきやすいのでこっちの方が良いかもですねw。ルーティングが自動で生成されるのも手軽で良いですね。
#最後に
最後まで読んでいただきありがとうございました。
もし間違い等、アドバイス、ご指摘等有れば教えていただけたら幸いです。
次回はVuex(store)の使い方をやって行こうかな？
#追記(2019-10-31)
##サーバーアップ
以下のコマンドを叩く。

```console
$ npm run generate
```
その後ビルドされたファイル(``_nuxtディレクトリ``,``index.html``)ができるので、それらをサーバーに置く。
#追記(2020-04-03)
##パラメータ受け取りの遷移
２種類の方法があります。
###パスからパラメーターを取得する
``http://localhost:3000/post/12345/`` にアクセスした時に``12345``の部分を取得したい。
以下のように行います。

```
pages/
--| post/
-----| _id.vue
```

```vuejs:_id.vue

<template>
  <section>
    <p>{{ $route.params.id }}</p>
  </section>
</template>
```
###getパラメーターを取得する
``http://localhost:3000/post/?id=12345``` にアクセスした時に``12345``の部分を取得したい。

```
pages/
--| post/
-----| index.vue
```

```vuejs:index.vue
<template>
  <section>
    <p>{{ $route.query.id }}</p>
  </section>
</template>
七対子と国士無双の打牌の特徴を主成分分析した

# ※この記事は2020年に作成しました
#概要
七対子エージェントと国士無双エージェントの手牌から打牌を予測するニューラルネットワークの中間層の出力の100次元のデータを集め、それを主成分分析した。
データ数は両方とも5000個ずつである。

#結果
##第一主成分と第二主成分の散布図
それぞれ色分けしてラベルを表示している。
意外と違いが出てることがわかる。
![chitoi_kokushi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436155/03bd6d8d-4b87-a2ee-fa2e-63bb207f3c5c.png)

##累積寄与率
2つのデータがあるからか、データの8割を説明するのに約第30主成分まで必要。
![chikoku_ruiseki2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436155/a3d386d7-e3fd-4325-8056-19ffee5234aa.png)

##第一主成分と第二主成分における観測変数の寄与度をプロットする
100次元もあるからさすがにごちゃごちゃしてるし、学習させるごとに形や値は全然変わってくる。
![chikoku_kiyodo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/436155/3c9528ee-45be-8a2e-cf61-ee5ad6de25c6.png)

#作成したプログラム

```python
# coding: UTF-8
import numpy as np
import matplotlib.pyplot as plt
import sklearn #機械学習のライブラリ
from sklearn.decomposition import PCA #主成分分析器
from pandas import plotting 
import matplotlib.ticker as ticker
import pandas as pd
from sklearn.preprocessing import StandardScaler


data = 5000

chitoi = np.loadtxt("C:/Users/p-user/Desktop/chitoi_pca.csv")
chitoi = np.delete(chitoi,slice(data,None),0)
kokushi = np.loadtxt("C:/Users/p-user/Desktop/kokushi_pca.csv")
kokushi = np.delete(kokushi,slice(data,None),0)

df = np.vstack((chitoi,kokushi))
#print(df.shape)

lavel = np.zeros((data*2))
for i in range(data,len(lavel)):
    lavel[i] = 1

pca = PCA()
feature = pca.fit(df)
# データを主成分空間に写像
feature = pca.transform(df)
#主成分得点
pd.DataFrame(feature, columns=["PC{}".format(x + 1) for x in range(100)]).head()

"""
#累積寄与率をプロット
plt.gca().get_xaxis().set_major_locator(ticker.MaxNLocator(integer=True))
plt.plot([0] + list( np.cumsum(pca.explained_variance_ratio_)), "-o")
plt.xlabel("Number of principal components")
plt.ylabel("Cumulative contribution rate")
plt.grid()
plt.show()
"""

"""# 第一主成分と第二主成分における観測変数の寄与度をプロットする
plt.figure(figsize=(6, 6))
for x, y, name in zip(pca.components_[0], pca.components_[1], range(100)):
    plt.text(x, y, name)
    #print(x,y,name)

plt.scatter(pca.components_[0], pca.components_[1], alpha=0.8)
plt.grid()
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.show()
"""

"""
plt.figure(figsize=(6, 6))
#plt.scatter(feature[:, 0], feature[:, 1], alpha=0.8, c=list(lavel), label=legend)
plt.scatter(feature[:4999, 0], feature[:4999, 1], alpha=0.8, c='red', label='Chitoitsu')
plt.scatter(feature[data:, 0], feature[data:, 1], alpha=0.8, c='blue', label='Kokushimuso')
plt.grid(True)
plt.xlabel("PC1")
plt.ylabel("PC2")
plt.legend(loc='upper left')
plt.show()
"""
```
OpenCV + iOS (Swift) + CvVideoCamera: サンプル

# はじめに

OpenCV を Swfit で書いたアプリに組み込んで、カメラで撮影した画像をリアルタイムに画像処理して表示するサンプルアプリを作ってみました。

# 背景

OpenCV を iOS で使うには、 OpenCV から公式配布されている `opencv2.framework` をプロジェクトに組み込めば容易に使えます。

しかし、 OpenCV は C++ のライブラリなので、 iOS で使うには Objective-C++ を書かなければいけません！

もっぱら最近の iOS アプリは、 Swift で書かれていると思います。
Swift から Objective-C++ を使うにはブリッジファイルを用意する必要があります。

# ソースコード

GitHub で公開しています。
https://github.com/kulikala/ios-opencv-skeleton

ローカルにクローンして使ってください。

```shell
git clone git@github.com:kulikala/ios-opencv-skeleton.git
cd ios-opencv-skeleton
```

# CocoaPods

OpenCV のフレームワークを Xcode プロジェクトに取り込む方法として、 Carthage や SwiftPM などがありますが、オールドクラシックに `Podfile` を使う方法にしています。

```shell
pod install
```

開くときには、 CocoaPods が作成する `OpenCVSkeleton.xcworkspace` を開いてください。

```shell
open OpenCVSkeleton.xcworkspace
```
Spring Bootを触ってみたメモ

#Spring Bootの特徴
兎に角、アノテーションによって他の言語と同じようにサーブレットの存在を無視したプログラミングができるようになっていることが大きな特徴なよう。

![](https://cz-cdn.shoeisha.jp/static/images/article/11509/11509_003.png)
[参照先](https://codezine.jp/article/detail/11509?p=2)

|アノテーション|概要|
|---|---|
|@ Conponent|DIコンテナにBeanとして登録する最も基本的なアノテーション|
|@ Configuration|Bean定義をJavaベースで行うためのアノテーション　※言っている意味わからないので後ほど解説|
|@ Repository|データの保存や読み込みなどを扱うためのクラスを示すアノテーションです。Spring Dataなど使いデータベースを利用する場合には、このアノテーションを指定することで自動的にテーブルにアクセスできるようにするなど、特別な意味を持つケースがあります。|
|@ Controller|MVCのコントローラークラスであることを示すアノテーション。|
|@ Service|ビジネスロジックなどを扱うためのクラスを示すアノテーション。|

各サブプロジェクトで特別なものとして、これらのアノーテーションを上書きして別のアノテーションが定義される。

|アノテーション|概要|
|---|---|
|@ SpringBootApplication|Spring Bootのアプリケーションのmainプログラムを指定するための慣習として利用されるアノテーション|
|@ RestController|REST用のコントローラとして登録するためのアノテーション|
|@ RestControllerAdvice|各コントローラで共通の入力データ形式の変換やエラー処理などの共通処理を定義するためのアノテーション。|

※コーディングの際は@ と アノテーション名の間にはスペース不要


- mavenを利用する場合
    - `pom.xlm`ファイルに依存関係のパッケージを記載すると自動的に必要なパッケージを読み込んでくれる
    - `application.properties` 各パッケージで使用する設定をまとめて記載する場所
- gradleを利用する場合
    - これから使ってみる予定


## Entity周りのアノテーション概要
https://qiita.com/ughirose/items/5d691adc677aa08636b8


## Spring Bootログ周りの設定概要
https://qiita.com/NagaokaKenichi/items/34356c72e8ac0279e1a0

## RestAPI作成時の記載方法
https://qiita.com/MizoguchiKenji/items/2a041f3a3eb13274e55c

## JpaRepositoryの使い方
http://terasolunaorg.github.io/guideline/5.5.1.RELEASE/ja/ArchitectureInDetail/DataAccessDetail/DataAccessJpa.html
さらに条件を加えて検索したいときの利用方法
https://qiita.com/ksh-fthr/items/44ecc0550a77f4280ea7

## Spring Bootで定期実行
https://qiita.com/rubytomato@github/items/4f0c64eb9a24eaceaa6e
https://reasonable-code.com/spring-boot-scheduling-tasks/

## Spring BootでBatch作成
https://qiita.com/kurukuruz/items/44743a6cd45037061548

## Spring Boot Actuator
監視、メトリック、監査などの機能を提供するサービス。
導入するだけで、監査、ヘルス、およびメトリックの収集もアプリケーションに自動的に適用。

注意点としては、エンドポイントを認証なしのポイントにおいてしまうとサーバーのセキュリティ情報を公開してしまう危険性をはらんでいるためエンドポイントの公開については、注意して開発を行う必要がある。

[Spring Boot Actuator ドキュメント](https://spring.pleiades.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready)
bash > fileIO > 並列化 > ls + awk > 入力ファイルをINTVLとINDX指定で分割する > コマンド | bashスクリプト v0.1, v0.2 | brace expansionによる失敗

```txt:動作環境
CentOS Linux release 7.7.1908 (Core)
```

### 状況

- OpenMPで処理が遅いので、自分が考える最適な並列化に変更する
- そのためにはlsで読込むファイルリストを分割する方法が必要となる

### 分割対象ファイル

```
$ ls DATA/
inp.001  inp.002  inp.003  inp.004  inp.005  inp.006  inp.007  inp.008  inp.009  inp.010  inp.011  inp.012
```

### 環境変数とawkを使った分割例

```bash
$ INTVL=3 && INDX=1 && ls DATA/inp.0* | awk '(NR % '$INTVL' == '$INDX'){print $1}'
DATA/inp.001
DATA/inp.004
DATA/inp.007
DATA/inp.010
```

環境変数にするとパイプで渡す必要がなくなる。


## bashスクリプト v0.1

loop_interval_191023_exec

```bash:loop_interval_191023_exec
#!/usr/bin/env bash

function myls ()
{
	INTVL=$1 && INDX=$2 && ls DATA/inp.0* | awk '(NR % '$INTVL' == '$INDX'){print $1}'
}

if [ $# -lt 2 ];then
	echo "[cmd] [interval] [start]"
	echo "e.g."
	echo "[cmd] 4 1"
	exit
fi

INTERVAL=$1
START=$2

for elem in $(myls $INTERVAL $START);
do
	echo $elem
done
```

### 実行例 > パラメータ不足

```
$ bash loop_interval_191023_exec 
[cmd] [interval] [start]
e.g.
[cmd] 4 1
```

### 実行例 > パラメータ指定

```
$ bash loop_interval_191023_exec  4 1
DATA/inp.001
DATA/inp.005
DATA/inp.009
```

## bashスクリプト v0.2

対象ファイルを指定できるように変更

```bash:loop_interval_191023_exec
#!/usr/bin/env bash

function myls_skipped ()
{
	INTVL=$1 && INDX=$2 && ls $3* | awk '(NR % '$INTVL' == '$INDX'){print $1}'
}

if [ $# -lt 3 ];then
	echo "[cmd] [interval] [start] [Dir/prefix]"
	echo "e.g."
	echo "[cmd] 4 1 DATA/inp.0"
	exit
fi

INTERVAL=$1
START=$2
TARGET_DIR_WITH_PREFIX=$3

for elem in $(myls_skipped $INTERVAL $START $TARGET_DIR_WITH_PREFIX);
do
	echo $elem
done
```

### 実行例 > パラメータ不足

```
$ bash loop_interval_191023_exec 
[cmd] [interval] [start] [Dir/prefix]
e.g.
[cmd] 4 1 DATA/inp.0
```

### 実行例 > パラメータ指定

```
$ bash loop_interval_191023_exec  4 1 DATA/inp.0
DATA/inp.001
DATA/inp.005
DATA/inp.009
```

### 備考

```
$ bash loop_interval_191023_exec  4 1 DATA/inp.0*
```

のように使うとBrace Expansionにて展開された引数を関数mylsが受けることになり失敗する。

そのために上記のようにした。

## 関連

下記は上記の実装の先で使った情報。

- [bash > カレントディレクトリとスクリプトのディレクトリ(絶対 / 相対)の取得](https://qiita.com/7of9/items/dab46b98d012d5ed115e)
datascience-notebookで独自ユーザーでJupyterLabを使うための設定

[jupyter/datascience-notebook](https://hub.docker.com/r/jupyter/datascience-notebook)でJupyterLabを使っているときに独自ユーザーで起動したいケースがあったので、そのときの設定を共有します。

なお、本記事の内容は[公式docsのDocker Options](https://jupyter-docker-stacks.readthedocs.io/en/latest/using/common.html#docker-options)に書いてあります。

※デフォルトだとjovyanユーザーで起動する挙動（jovyanって[木星の〜](https://ejje.weblio.jp/content/Jovian+planet)といった意味の言葉みたいですね。）

## 動機

- ノートブックでboto3を使いたくて、その認証情報を`~/.aws/credentials`から取るようにしたかった。

## 設定

## Dockerfile

```dockerfile
From jupyter/datascience-notebook

USER root

RUN pip install -U boto3
```

## docker-compose.yml

以下はカレントディレクトリをworking_dirにマウントしている例です。

```yaml
version: '3'

services:
  dev:
    container_name: test-ds-notebook
    build: .
    user: root
    ports:
      - '10088:8888'
    volumes:
      - .:/home/$NB_USER/work
      - ~/.aws:/home/$NB_USER/.aws
    command: start.sh jupyter lab
    environment:
      - GRANT_SUDO=yes
      - NB_USER=$NB_USER
      - NB_UID=$NB_UID
      - NB_GID=$NB_UID
      - CHOWN_HOME=yes
    working_dir: /home/$NB_USER/work
```

## .env

以下は、上述したAWSの認証情報を保持するユーザーが`test`、UIDが`100X`の場合の例です。

```
NB_USER=test
NB_UID=100X
NB_GID=100X
```

これで`docker-compose up -d`すれば

```
session = boto3.Session(profile_name='hoge')
forecast = session.client(service_name='forecast')
```
みたいな感じで、認証情報を使えました（もっと簡単な方法もあるかもしれませんが…）。
なお、コンテナの中に入って`/usr/local/bin/start.sh`を見てみると各オプションの挙動がわかりますので、気になる方はご参照ください。
getElementByIdの引数は式展開できる！

#a=1; getElementById('id${a}');　（※「'」→「`」に変えてください）

JavaScriptでは、**文字列をバッククオートで囲み**、さらにその中で**${変数}**とすれば式展開ができます。([こちら](https://qiita.com/shuzootani/items/6e69b1872d623ed7712d)の記事でとても分かりやすく書かれています)

そしてこれは、直接出力する文字列**だけでなく**、getElementByIdの引数として渡す**id名でも同じことができます**！

たとえば下のコードでは、"id1"というid名を「id${a}」(a=1)という形で取得しています。

```cake.html
<html>
<body>

<input type="text" id="id1">

<script>
let a = 1;
document.getElementById(`id${a}`).value = "ケーキ";
</script>

</body>
</html>
```
実行結果は
<img width="600" alt="ケーキ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/5a6dc20c-f905-5114-b76f-42ad89e9c17c.png">
ちゃんと取得できています！

#注意：「"（ダブルクォート）」ではなく「`（バッククォート）」で囲むこと！
getElementByIdでは基本的に、
**getElementById("id1")**のように引数をダブルクォートで囲みます。
しかしid名の中で式展開をしたい場合は、ダブルクォートではなく`Shift`と`@`ボタンの同時押しで出せる「**`（バッククォート）**」を絶対使わなければいけません。
また、`Shift`と`7`同時押しの「**'（シングルクォート）**」は形が似ていますが、これでは上手くいきませんのでそこもご注意を！



以上です。
もしかしたら皆さんにとっては常識なことかもしれないのですが、「出力する文字列ではなくコード中で使うid名でも式展開が効く」ことを作業中に知って嬉しかったので投稿してみました。
analyzingcontext.comのpython3へのアップデート

## analyzingcontext.comのpython3へのアップデート



analyzingcontext.comはpython2.7+flask+allpairs2を基に構成されたシステムです。

僕がこのpython2ベースをpython3でアップデートする目的は以下の二つです。

1. python2の支援終了
   - 2020年でpython2は捨てられる予定。
2. allpairs2のpython3支援なし
   - python3で組み合わせライブラリ「[allpairs2]( https://sourceforge.net/projects/allpairs/ )」をテストして見ましたがエラー発生して動作しない。
3. pypictの変更
   - ちなみにallpairs2ではロジック自体に誤りがあるためこれを補うコードが要ります。そのためコードが汚くなってしまう。
   - MSから制作されたPICT(Pairwising 組み合わせツール)をpythonライブラリーで変換した[pypict]( https://github.com/kmaehashi/pypict ) に変更





#### 1. 2to3.pyの遂行

python2とpython3の文法的なことはpython3のinstall際に提供される「2to3.py」で大体変更できます。例えば

```
print "ABC"
```

は

```
print("ABC")
```

で変更させます。

でもそれで全部おわるわけはありませんね。



#### 2. 自作ライブラリーの認識問題

python2では

```
sys.path.append(myLibPath)
```

で自作専用フォルダーを認識させて自作ライブラリーを読み込めましたがpython3ではこれが受け取りませんでした。個人的な考えはpython3では`sys`関連部分が大きく縮まってる感じです。

この部分は全部フォルダーから直接呼ぶ方法に変更しました。例えば

```
from libs.getParams import catch_conditions
```

は「libs」のフォルダー下のgetParam.pyを読み込んでいます。



#### 3. UTF-8関連

python3からはUTF-8を別にセッティングする必要がなさそうです。python2で使ったstrオブジェクトのdecode("UTF-8")が全部エラーになってしまいました。



#### 4.割り算("/")の問題

python2の割り算はpython3とちょっと違います。

```
#python2の割り算
3/2 = 1
```

でもpython3の割り算結果は

```
#python3の割り算
3/2 = 1.5
```

なのでpython3でpython2の結果を維持しようと思ったら「//」を使います。

```　
3//2 = 1
```



これ以外にpython3と2の違いはもっとあるらしいけど僕がこの作業で経験したのはこの四つです。



#### おまけ

analyzingcontext.comの「How to Use」日本語バージョンをアップしたのでもしMC/DCのケースが欲しい方は使ってみてください。

 http://analyzingcontext.com/static/jpn/Aboutpage_Japan.html
Serverless BI (Power BI / Qlik Sense Desktop) サーバーレスBIの構築事例（BIにお金かけるの？）

中堅企業（それぞれ異なる企業）でBIを構築、リプレースした事例。圧倒的なコスト削減事例。SIerやベンダーは儲からずとても提案できない。
シンプルすぎてベンダーが儲からず積極的に教えてくれる内容ではないので、事業会社社内で理解でき手足を少し動かして構築する人がいないとやや厳しいかもしれない。
お金をかけなくてもBIができる。しかも社内でサーバーを持つ必要もない。
下図の画像が全体のイメージで少しコメントを書き加えると次のようなことをしてみました。
　
#(情報更新)Qlik Sense Desktopが2020年6月をもって有償になります。Power BIへの移行が加速の可能性が高まりました。
https://community.qlik.com/t5/Qlik-Support-Updates-Blog/Changes-to-Qlik-Sense-Desktop-in-2020/ba-p/1653306

●（2020年1月現在現在は推奨しません）Qlik Sense Desktop　・・・　店舗POS, 配架データの分析や基幹システムのデータ確認（総勘定元帳の集計、他）に利用
・データベースのローデータと共有フォルダにあるExcelなどのマッピングデータをロードスクリプトで定義して一括ダウンロード、更新
・無料のQlik Sense Desktop版でも数千万件のデータを高速に差分更新できるのがメリット（データロードエディタで差分ロードの定義できます）・・・この処理は無料のPower BI Desktop や Tableau では私の知る限りできません（最近リリースされたPremium版を契約しないといけない）
・更新者は更新後のQVFファイルを共有フォルダにコピーして保存
・閲覧者はバッチファイルで個々のPCに最新版のレポートQVFファイルをコピーしてPCで閲覧（レポート利用者は全員Qlik Sense Desktopを自分でインストールしてもらう・・・管理者権限なくインストールできるのもメリット）

●Power BI Desktop / Power BI Service　基幹システムのデータチェック、お客様対応・CRMに利用
・Power BI Desktop / Power BI Service 側でデータの閲覧権限やデータベースのマージを可視化しながらコントロールするのは大変なことが予見できたので、一旦SQL Server Expressでデータベースリンクを必要となるデータベースに全て貼った（このExpress中継サーバー上でバラバラのSQL Server, MySQLといった異なるデータベースのインスタンスのリンクを集約させ、同じマシンにPower BI On-Premise Gatewayで連携させた）
・Power BIからのDB接続先はSQL Server Express一箇所（データベースのローデータに対しては）
・管理者用アカウント、閲覧者用アカウント合わせて月額2,000円程度
・閲覧者はChromeでアクセス（Power BI Desktopをインストールする必要がない）
・レポートのリアルタイム更新ができる (この機能はこの価格でできるのは私の知る限りPower BIのみ)

![PowerBI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/672e6a91-0666-8ee3-33b5-8fcc68ad8cc9.jpeg)
![QlikSense.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/518389/954c79ed-b51c-4d21-a525-a8c711559340.jpeg)
初めてのVulkanプログラミング step5 fragment シェーダーの作成。

## fragment シェーダー
バーテックスシェーダーは、頂点の計算だがフラグメントシェーダは、色情報の計算を行う。フラグメントシェーダはバーテックスシェーダーによって計算された、図形のピクセル数だけ実行され各ピクセルにどういう色を付けるのかを求める。

今回は、画面の選択した範囲全体に緑に変えるプログラムを作成する。ソースコードは以下のようになる。新しくshader.fragファイルに以下を書き込む


```glsl
#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(location = 0)out vec4 outColor;


void main(){
	outColor = vec4(0.0, 1.0, 0.0, 1.0);
}
```
layout(location = 0)で、フレームバッファーインデックス[0]に出力します。

outColorでは、画面に表示するカラーを設定している。それぞれの要素は、RGBaとなっており、値は0~1の範囲です。Rを上げてあげると赤みが増えます。αは、画面の透過度0に近いほど透過していきます。

このファイルも同様にglslangValidatorでコンパイルします。
するとfrag.vertが出来上がります。

```powershell
C:\VulkanSDK\1.1.82.1\Bin32\glslangValidator.exe -V shader.frag
```
機械学習（理論）の筑波大学授業動画(OCW)を紹介

筑波大学の**佐久間先生**が講義している機械学習の授業（2019年度）がOCW（オープンコースウェア）として公開されています。まだ、勉強途中ですが紹介します。

授業は初めて機械学習の勉強をする人向けの内容ですがプログラミングはなく**数学(微分、線形代数など)**を使った理論的な内容です。

`授業内で解説されている課題の解答をコメントとして載せていく予定です`

URLは次の通りです。

https://ocw.tsukuba.ac.jp/course/systeminformation/machine_learning/

動画は授業は合計20回で1回あたり１時間の講義です。スライドのPDFも公開されていてトータルで約400ページになっています。奇数回・偶数回で１テーマになっていて同じスライドがアップされていますので奇数回のみダウンロードすればOKです。演習などで使われるプログラムは公開されていないようです。

2.のスライドと動画で**Google Colaboratory**についての説明があります。初めて知ったのでスライドのコードを試してみました。結果**winequality-red.csv**のダウンロードはできました。
このデータは http://www3.dsi.uminho.pt/pcortez/wine/ のデータと同じようです。
Googleで`赤ワイン 回帰`で検索すると**Qiita**も含めたくさんヒットします。

講義一覧は次の通りです。
    
1. 機械学習概論と単回帰 (1)
2. 機械学習概論と単回帰 (2)
3. 重回帰 (1)
4. 重回帰 (2)
5. モデルの複雑さと汎化 (1)
6. モデルの複雑さと汎化 (2)
7. 特徴選択とL1正則化 (1)
8. 特徴選択とL1正則化 (2)
9. 決定的識別モデル (1)
10. 決定的識別モデル (2)
11. カーネル/確率的識別モデル1 (1)
12. カーネル/確率的識別モデル1 (2)
13. 確率的識別モデル2/経験損失最小化 (1)
14. 確率的識別モデル2/経験損失最小化 (2)
15. k-meansと主成分分析(1)
16. k-meansと主成分分析(2)
17. ニューラルネットワーク1 基礎とCNN (1)
18. ニューラルネットワーク1 基礎とCNN (2)
19. ニューラルネットワーク2 RNNとGAN (1)
20. ニューラルネットワーク2 RNNとGAN (2)
[ TomCat ]　インストールとサンプル表示のメモ

サーバクライアント通信をするためには、
サーバが必要となる。

そこでTomCatをインストールすることにした。

##インストール方法
以下のサイトがとても参考になった。
・https://eng-entrance.com/java-servlet-tomcat-install

上記サイトの最後の項目「Webアプリケーションマネージャ有効化」
というところは行わなくても通信できたので、
今回は触れていない。

##サンプルを用いた通信
テスト通信では以下のサイトがとても参考になった。
・https://searchman.info/java_eclipse/1040.html

サンプル表示についても
上記のサイトに従って進めればできたので、
特にいうことはない。

##コードの内容
web.xmlには
　　・**サイトへのURL**
　　・**javaファイルのクラス名**
が書かれている。

また、javaファイルには
　　・**doGet()**（サイトにアクセスしたとき最初に呼び出されるメソッド）
　　・**PrintWriter型の変数**（表示されるサイトのHTML文、F12で開ける）
が書かれている。

##まとめ
ファイルに書かれていることを理解しておかないと、
サーバクライアント通信がうまく実装できないので、
気を付けたい。

以上。
Kubernetes NodePortで30000~32767以外のポートも割り当てられるようにする(Microk8s)

# 背景
KuberentesのNodePortは、デフォルトでは30000~32767以外のポートは割当できない用に設定されている。

それ以外のポート（8080）を割り当てたいときには、設定変更が必要


# 解決方法
**kubernetesのマスターノードを変更できる環境であることが必須**

- GKE などではおそらく不可

`kube-apiserver` のオプションである`--service-node-port-range`を有効にする

## 例: Microk8s

```:/var/snap/microk8s/current/args/kube-apiserver
....(略)...

# 次の1行を追加する                                                                    
# --service-node-port-range <from>-<to>   

--service-node-port-range 2000-32767       
```

書き換えたら、microk8sを再起動

```bash
sudo systemctl restart snap.microk8s.daemon-apiserver.service
```
# References:
https://github.com/ubuntu/microk8s/issues/95
【Pycharm】同じ階層のpythonファイルをインポートしようとするとエラーが発生するときの対処法

#pythonの問題ではなくpycharmの問題で嵌った話

pythonでは自分で書いたプログラムの関数をライブラリとしてインポートできる便利な機能がある。

同じ階層にある、前に作ったあの関数を使いたい。そんな時にpycharmでエラーが出ました。

No module named ~

##原因の切り分け

最初は原因がわからなかったため、とりあえずコンソールからインポートできるか試してみると実行できました。

つまり、この問題はpycharm側の問題であるとわかりました。

##原因

調べていく中で、ライブラリとしてインポートするにはプログラムの親ディレクトリがsources rootである必要があるようです。これは一応便利機能の一つだと思います。

このディレクトリをsources rootに指定すると、プロジェクト内のどのディレクトリでインポートしてもsources rootをルートディレクトリとした絶対パスで指定できる、つまりfromなどを使ったパスの指定をする必要がなくなるというものです。

代償としてpure pythonのようにディレクトリの相対パスで指定するとエラーが出るようです。

##解決方法

野蛮な方法として、使いたいプログラムがあるディレクトリを右クリック、Mark Directory as でsources rootを指定することでエラーが消えて使えるようになりました
created_atを西暦/月/日 XX:YYと表示したい　#CSS #Ruby on Rails #Progate

#やりたいこと
・投稿した日付を　西暦/月/日 XX:YY　と表示したい

#経緯
・ProgateでRuby,Ruby on Rails,HTTM&CSSを学習し、現在tweet_appを再現中！
その中でつまずいた箇所の備忘として。


#解決方法・いろいろな表示方法
◆投稿日時を表示（例：2019/10/23 15:03）
今回の表示方法であれば、下記のようにすればOK

```ruby:CSS
<%= 変数名.created_at.strftime('%Y/%m/%d %H:%M') %>
```

◆何分前、何時間前に投稿したかを表示(例：３０秒以内、約1ヶ月・・・）

```ruby:CSS
<%= time_ago_in_words(post.created_at) %>
```
※これだと英語表記になるので、日本語にしたい場合は[こちら](https://qiita.com/bellx2/items/30906a7832ef4ff4c886)を参考に
ScalaのfoldRight練習として、漢数字を含む文字列から数値に変換する関数を作成してみました

# はじめに
業務で、漢数字を含む文字列を数値に変換する処理が必要になりました。昔Javaで実装した処理はScala、Pythonをかじり始めた今見返すと残念でしかなく、チョロっと調べた範囲でもあまりScalaっぽいサンプルも見つからず。
なので、foldRightの練習も兼ねて関数を作成してみました。ScalaやPythonは半年くらいの片手間実装経験しかないので、そもそも人のコードも自分のコードもScalaっぽい、とか言える程の理解も腕前もありませんが。。。

# 結論
先に結論ですが、```foldRight```便利！
あとScalaもやっぱり便利！
昔々Javaで書いたロジックに比べてとても簡潔になりました。
Scalaっぽい気がする！

# 文字定義
数値文字、桁文字を以下の通りマップで定義します。```京```以上の桁はLongを超えてしまうのでとりあえず桁はここまでです。BigDecimalって何桁いけるのかわかりませんが、仮にScalaの数値桁が対応しており、```恒河沙```みたいな複数文字で表現される桁文字列にも対応したい場合は、マップのキーを桁文字（Char）ではなく、桁文字列（String）にすればいいのかな？まぁ実用上問題ないからこのままでいいかな、と。

```scala
// 数値文字 -> 値マップ
private val numericCharacterMap = Map(
  '0' -> 0,
  '０' -> 0,
  '零' -> 0,
  '〇' -> 0,
  '1' -> 1,
  '１' -> 1,
  '一' -> 1,
  '壱' -> 1,
  '2' -> 2,
  '２' -> 2,
  '二' -> 2,
  '弐' -> 2,
  '3' -> 3,
  '３' -> 3,
  '三' -> 3,
  '参' -> 3,
  '4' -> 4,
  '４' -> 4,
  '四' -> 4,
  '5' -> 5,
  '５' -> 5,
  '五' -> 5,
  '6' -> 6,
  '６' -> 6,
  '六' -> 6,
  '7' -> 7,
  '７' -> 7,
  '七' -> 7,
  '8' -> 8,
  '８' -> 8,
  '八' -> 8,
  '9' -> 9,
  '９' -> 9,
  '九' -> 9,
)
// 桁文字 -> 桁マップ
private val digitMap = Map(
  '十' -> 1,
  '百' -> 2,
  '千' -> 3,
  '万' -> 4,
  '萬' -> 4,
  '億' -> 8,
  '兆' -> 12,
  '京' -> 16,
)
```

## 文字列 -> 数値変換関数
こんな感じになりました。

```scala
def convertFromKanjiToNumber(input: String): Long = {
  // 定義に無い文字は捨てる（桁区切り文字等）
  var tmp = input.filter(x => numericCharacterMap.contains(x) || digitMap.contains(x))
  // 桁文字（十、万等）の前に数値文字が無い場合”1”を追加（”百十”を”1百1十”に）
  tmp = tmp.head + tmp
  tmp = tmp.sliding(2).map(x => {
    if (digitMap.contains(x(0)) && digitMap.contains(x(1)) && (digitMap(x(0)) >= digitMap(x(1))))
      "1" + x(1)
    else
      x(1)
  }).mkString("")
  // foldRightで下位の文字から数値に変換して足し込む
  // 初期値は値、桁（十百千の桁）、桁（万以上の桁）のtuple）
  val result = tmp.foldRight((0L, 0, 0)){ (x, current) =>
    // 桁文字の場合、桁の繰り上げ
    if (digitMap.contains(x))
      (current._1, if (digitMap(x) > 3) 0 else digitMap(x), if (digitMap(x) > 3) digitMap(x) else current._3)
    // 数値文字の場合、桁を適用して足し込み
    else
      (current._1 + numericCharacterMap(x) * Math.pow(10, current._2 + current._3).toLong, current._2 + 1, current._3)
  }
  result._1
}
```

## テストデータ
以下はとりあえず正しく変換できました

```scala
val testDataList = List(
  ("一", 1),
  ("十四", 14),
  ("二十三", 23),
  ("四十", 40),
  ("千六", 1006),
  ("一二三", 123),
  ("千十", 1010),
  ("５千二百", 5200),
  ("5千万", 5000 * 10000),
  ("百十萬", 100 * 10000 + 10 * 10000),
  ("十二万", 120 * 1000),
  ("７千五十億百七五", 7000L * 10000L * 10000L + 50L * 10000L * 10000L + 175L)
)
```
「会社法人等番号」を「法人番号」へと変換するJavaScriptのコード

# コード
12桁の会社法人等番号の左端に一桁のチェックディジットを付加して13桁の法人番号を生成するためのJavaScript (ES6)コード

```javascript
// 12桁の会社法人等番号，0から始まることもあるので文字列で与えることにする
const n12 = "000012050002";

// 13桁の法人番号
const n13 =  9 - n12.split("").map(c => Number(c)).map((d, i) => i % 2 === 0 ? d * 2 : d)
  .reduce((acc, cur) => acc + cur, 0) % 9 + n12; // -> "7000012050002"
```

# 参考
- [Ruby版の変換コード](https://qiita.com/kawasaki/items/fc1abfd62db10fa082ca)
- [法人番号の定義に関するQiita記事](https://qiita.com/kawasaki/items/bfa9f0edc32c132eff30)
Rubyで配列を展開したい

hashの配列を返すメソッドを用意したとして

```
def foo_method
  ['a', 'b'].map.with_index do |str, index|
    {str.to_sym => index}
  end
end
```

こんな形で値を取得しようとすると配列の中に配列ができてしまう

```
[
  {hoge: 1},
  {fuga: 2},
  foo_method
]
=> [{:hoge=>1}, {:fuga=>2}, [{:a=>0}, {:b=>1}]]
```

でもほんとは配列の中にハッシュが並んでるだけのものが欲しい
flattenとかしてみたけど何も変わらないｗ

[Rubyの配列展開](http://yamakichi.hatenablog.com/entry/2016/10/18/232253)
こちらのページを参考にしたおかげで解決しました
メソッドに"*"を付けてあげます

```
[
  {hoge: 1},
  {fuga: 2},
  *foo_method
]
=> [{:hoge=>1}, {:fuga=>2}, {:a=>0}, {:b=>1}]
```

foo_method内でreturnするときに*を付けたりしたけど、それではダメ

```
def foo_method
  ret = ['a', 'b'].map.with_index do |str, index|
    {str.to_sym => index}
  end
  *ret
end
```

配列の中で展開するからこそできる技であって、自分を分解して返すものではないみたいです
Hubsan Zino 2: Specifications and data

Hubsan will launch the new Zino 2 drone in the next few weeks. The first details and technical specifications of the Hubsan Zino 2 have been leaked. We have prepared the first information about Hubsan Zino 2.

Hubsan Zino 2:       Specifications / Specifications
Name/model: 	     Hubsan Zino 2
Weight:   	     915 grams
Size (folding):      216.5 x 129.0 x 94.9 mm
Size (expand):       326.0 x 260.0 x 94.9 mm
Battery (aircraft):  3,800 mAh (17.4V)
Battery (remote control): 3,350 mAh (not interchangeable) / 310 g
flight duration:     33 minutes
Charging time:      2 hours
Arrivals: 	    6 km
maximum height:     500 meters
Maximum airspeed:  (sport mode) 	   20 m / s (72 km / h)
Camera:             Ultra HD / 4K
Picture resolution: 12 megapixels
Video resolution:  4K (3840 x 2160) at 60 frames / sec
                   1080p (1920x1080) at 120 fps
                   720p (1280x720) at 200 fps
Video bit rate:    Up to 100 Mbps
Flight mode:  	  GPS mode, optical flow, attitude
Image Sensor:     Sony-1 / 2.3 image sensor
Lens/lens:        f / 2.2, 23 mm / replacement filter
Position:         GPS / GLONASS


Hubsan Zino 2: 4K resolution (60 fps) and high range

The new Hubsan Zino 2 weighs 915 grams and weighs only 216.5 x 129.0 x 94.9 mm. When expanded, the dimensions are 326.0 x 260.0 x 94.9 mm. When one of the Hubsan Zino 2 is used for a 3800 mAh <a href="https://www.ovonicshop.com/">lipo battery</a>. According to the manufacturer, the flight time should be up to 33 minutes.
The battery is charged for approximately two hours. The range of the Hubsan Zino 2 has been improved and is currently up to 6 km. The Hubsan Zino 2 UltraHD camera records 4K video at speeds up to 60 fps and video bit rates of 100 Mbps. A single photo can be used for 12 megapixels. Alternatively, you can capture 1080p video at 120 fps or 720p video at 200 fps. The camera is stabilized by a 3-axis universal joint, so a butter-like soft video material can be used. In addition, the Hubsan Zino 2 camera has a replaceable lens cable, so you can choose to use a spare filter or you can install an ND filter. GPS and Glonass as well as optical flow positioning systems are also on board. As a result, Hubsan Zino 2 has a variety of intelligent flight and recording modes, such as ActiveTrack, Hyperlapse and Panorama, auto start and landing, hover, headless mode, home return or fault protection.
Unity Hololens(UWP)をIL2CPPでビルドするときにDeviceが出てこないときにすること

#問題
UnityでHololensをビルドするためにUWPをIL2CPPでビルドして、ソリューションファイルを開くと「開始」しかなく、いつもの「Device」がないことがあります。
![コメント 2019-10-23 151320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223871/ae6ffed9-0c01-354b-7bb1-053078650983.png)


#解決策
上記の様な問題が起こる場合は、スタートアッププロジェクトの初期設定が間違っている可能性があります。
以下の画像の様に、ソリューションエクスプローラーから、自分の名前のプロジェクト（画像のStudyGoogleAPIs）を右クリックして、「スタートアッププロジェクトに設定」をクリックして下さい。
![コメント 2019-10-23 150911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223871/95014e03-6c94-6274-0e65-b50470048955.png)
![コメント 2019-10-23 150917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223871/a02b648e-807d-44ec-969e-4851ab214621.png)

この設定を行うことにより、無事に「Device」を出すことができました！
![コメント 2019-10-23 151721.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223871/3b4f74f5-70c5-c53d-56ca-806e07a22871.png)



#参考リンク
このサイトを参考にさせて頂きました。
https://github.com/Microsoft/MixedRealityToolkit-Unity/issues/2419
Laravel で 開始と終了 時刻 でのバリデーション

Laravel6を使用して動作を確認しています。

#画面

```html:form.blade.php
<input type="text" placeholder="00:00" name="start_time" class="form-control">
@error('start_time') {{ $message }} @enderror
<input type="text" placeholder="00:00" name="end_time" class="form-control">
@error('end_time') {{ $message }} @enderror
```

![SC000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/a07cda98-eb6c-91cf-9a81-883b50611fbe.jpeg)

#バリデーション
FormRequestで行います

```bash
php artisan make:make:request TimeRequest
```

```php:TimeRequest.php
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class TimeRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'start_time' => 'required|date_format:H:i|',
            'end_time' => 'required|date_format:H:i|after:start_time',
        ];
    }
}


```

これで適当なControllerのメソッドへformをpostするようにして、引数に`TimeRequest`を指定します

```php:TekitoController
<?php

namespace App\Http\Controllers;

use App\Http\Requests\TimeRequest;

class TekitoControllerextends Controller
{
    public function some(TimeRequest $request)
    {
        //バリデーション済み$requestが渡ってくる
    }
}

```
(日本語化済みの表示サンプル)
![SC000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174757/06270c22-0a92-8f12-f65a-6294c032fdf2.jpeg)
kubectlコマンドを使うためにAmazonLinux2にaws-iam-authenticatorをインストールする

## 公式のをそのまま
https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-aws-iam-authenticator.html

## 
```
curl -o aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/1.14.6/2019-08-22/bin/linux/amd64/aws-iam-authenticator
chmod +x ./aws-iam-authenticator
mkdir -p $HOME/bin && cp ./aws-iam-authenticator $HOME/bin/aws-iam-authenticator && export PATH=$HOME/bin:$PATH
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
aws-iam-authenticator help
```
Vimでよく使うキーマップのカスタマイズ

## はじめに

私がVimでよく使うキーマップのカスタマイズを紹介します。

## よく使うキーマップのカスタマイズ

### 折り返しがあっても上下の移動を1行にする

<kbd>j</kbd> <kbd>k</kbd> によるキャレットの移動はデフォルトだと行番号単位であり、折り返されていると一気に移動してしまいます。
折り返されていても常に1行ずつ移動するようにします。

```vim
noremap j gj
noremap k gk
```

### 「H」「L」で行頭・行末に移動する

<kbd>0</kbd> はまだしも、 <kbd>$</kbd> はとにかく押しにくいです。
よく使うコマンドは押しやすいようにしたいので、 <kbd><kbd>Shift</kbd> + <kbd>h</kbd></kbd> <kbd><kbd>Shift</kbd> + <kbd>l</kbd></kbd> で移動するようにします。

```vim
noremap <S-h> 0
noremap <S-l> $
```

これで押しやすくなりました。

### 「+」「-」でインクリメント・デクリメントする

数字やアルファベットのインクリメント・デクリメントは、デフォルトだと直感的なキーマップになっていません。
<kbd>+</kbd> <kbd>-</kbd> として直感的に操作できるようにします。

```vim
nnoremap + <C-a>
nnoremap - <C-x>
```

### 「Y」でキャレット位置から行末までヤンクする

<kbd>D</kbd> や <kbd>C</kbd> と異なり、<kbd>Y</kbd> は行全体をヤンクします。
統一性を持たせたいので、 <kbd>Y</kbd> でキャレット位置から行末までをヤンクするようにします。

```vim
nnoremap Y y$
```

~~ただ、私は <kbd>yL</kbd> で同様の操作を行っており、こちらの設定は使っていないです。。~~
→ <kbd>Y</kbd> の方が手数が少ないため、最近は積極的に使っています。

### 貼り付け先のインデントに合わせてペーストする

コーディング中にペーストするとき、貼り付け先とインデントの深さが異なると、ペースト後にインデントを調整する必要があります。
手間なので、ペースト時に自動でインデントを調整するようにします。

```vim
nnoremap p ]p
nnoremap P ]P
```

### インデントの調整後にビジュアルモードを解除しない

<kbd>></kbd> と <kbd><</kbd> でインデントを調整できますが、調整後にビジュアルモードが解除されます。
連続でインデントを調整できるようにします。

```vim
vnoremap < <gv
vnoremap > >gv
```

### 矢印キーを無効にする

こちらは禁断のカスタマイズです。
Vimのキーマップに慣れるため、矢印キーを押してもキャレットが移動しないようにします。

```vim
noremap <Left> <Nop>
noremap <Down> <Nop>
noremap <Up> <Nop>
noremap <Right> <Nop>
```

これですぐにVimのキーマップマスターになれます。
先輩や同僚に自分のマシンを操作してもらう場合、軽くキレられるのでご注意ください。

## おわりに

いかがでしたでしょうか？
みなさんが他によく使うキーマップがありましたら、教えていただけると嬉しいです。

私のキーマップの設定ファイルはGitHubにあるので、よかったら見てください。
https://github.com/uhooi/dotfiles/blob/master/.vim/config/mappings.vim

## 参考リンク

- [Vimのキーマッピングを書いた - Qiita](https://qiita.com/mizukmb/items/ddb5a5bfa2ce223057cb)
- [個人的に便利だと思うVimの基本設定のランキングを発表します！ - プログラムモグモグ](http://itchyny.hatenablog.com/entry/2014/12/25/090000)
- https://twitter.com/thinca/status/1200791599510245376
- https://twitter.com/mattn_jp/status/1202603537521401856
AmazonLinux2でkubectlコマンドを使う

## 参考
https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-linux

## コマンドダウンロード

```
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
```

## 実行権限つける

```
chmod +x ./kubectl
```

## 実行できるパスへ移動

```
sudo mv ./kubectl /usr/local/bin/kubectl
```

## 実行できるかチェック

```
kubectl version
```

出力結果

```
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.2", GitCommit:"c97fe5036ef3df2967d086711e6c0c405941e14b", GitTreeState:"clean", BuildDate:"2019-10-15T19:18:23Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?
```
unityでとりあえずMessagePack for CSを使うやり方

#とりあえずMessagePackをunityで使いたい
ちゃんと使いたい人は調べてください。
とにかくとりあえず動かしてみたい人向けです。

##そもそもMessagePack-CSharpって何？
[C#(.NET, .NET Core, Unity, Xamarin)用の新しい高速なMessagePack実装](http://neue.cc/2017/03/13_550.html)
こちらをご覧ください。作者さんの解説です。

#使い方
##githubから入手
[neuecc/MessagePack-CSharp](https://github.com/neuecc/MessagePack-CSharp)
リリースからunitypackageとMessagePackUniversalCodeGenerator.zipを取得してください。

##シリアライズしたいクラスの定義

```csharp:SerializeTarget.cs
    [MessagePackObject]
    public class msgpacktest
    {
        [Key(0)]
        public Vector3 pos { get; set; }

        [Key(1)]
        public Vector3 rot { get; set; }
    }

    [MessagePackObject]
    public class testlist
    {
        [Key(0)]
        public List<msgpacktest> list = new List<msgpacktest>();
    }
```

##コードジェネレート
MessagePackUniversalCodeGenerator.zipを任意の場所に解凍して
コマンドプロンプトから

```
mpc.exe -i [プロジェクト名].csproj -o "MessagePackGenerated.cs"
```
でMessagePackGenerated.csを自動生成してAssets内に配置します。
ソリューションが分かれてるときはクラス定義スクリプトのソリューションcsprojをinputに指定してください。

##準備
スタートにこれ突っ込んでください（よくわかってない）

```csharp:sample.cs
public class mspseriarizetest : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        MessagePack.Resolvers.CompositeResolver.RegisterAndSetAsDefault(
            MessagePack.Unity.UnityResolver.Instance,
            MessagePack.Resolvers.GeneratedResolver.Instance, 
            MessagePack.Resolvers.BuiltinResolver.Instance,
            MessagePack.Resolvers.AttributeFormatterResolver.Instance, 
            MessagePack.Resolvers.PrimitiveObjectResolver.Instance
            );
    }
}
```

##シリアライズとデシリアライズ

```csharp:serializetest.cs
msgpacktest msg = new msgpacktest
            {
                pos = new Vector3(1, 2, 3),
                rot = new Vector3(3, 4, 5),
            };
            //シリアライズ
            byte[] bytes = MessagePackSerializer.Serialize(msg);//LZ4MessagePackSerialzier
            //デシリアライズ
            msgpacktest msg1 = MessagePackSerializer.Deserialize<msgpacktest>(bytes);
```

以上。多分これで最低限動かせるはず。
stringだけとかならコードジェネレート必要ないです。
Splunk SPL 複数イベントの属性を集約して１イベントにまとめたい

#1 こんなデータ
- FieldA と　FieldB の列を持つ
- FieldA の属性が FieldB にもつが、イベント(行)ごとに分かれている
- FieldA で集約して、１イベントに複数属性をもたせたい


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394817/db515c0f-1a9c-d6b2-27df-1445770435d8.png)


#2 それをこうしたい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394817/3cfec788-0ca6-542f-e242-67fe46507b4e.png)

- 集約したFieldA ごとに各FieldBの属性を並べて表示

#3 データ取り込んでみた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394817/2ad2353c-6a9c-04d6-bb15-6c395de02735.png)

テーブル化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394817/ceaee5e7-3783-1b7a-6408-778dc544f12b.png)

#4 SPLで編集して整形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394817/bea305d3-df03-388e-eec2-e0453d2af7c8.png)

```
source="test.csv" host="test" index="test" sourcetype="csv"
| table FieldA,FieldB
| stats values(FieldB) as values by FieldA
| eval  FieldC=if(isnotnull(mvfind(values,"監督")),"監督","")
| eval  FieldD=if(isnotnull(mvfind(values,"選手")),"選手","")
| eval  FieldE=if(isnotnull(mvfind(values,"コーチ")),"コーチ","")
| table FieldA,FieldC,FieldD,FieldE
```

- まず stats values by でFieldAごとにマルチバリュー(mv)で集約する
- mvfind()で mvに含まれている文字列がnullでなければ、その文字列を新規Filed に挿入
- table で整形
プロコンまとめ

こんにちは　ハラショーです

[プロコン30](http://www.procon.gr.jp/?cat=1661)で競技部門として出場しました
今回はプロコンの反省をしようと思います

# 反省点

## 1.知識、経験が不足していた

まず、出場をすることになった段階で自分の実力は[AtCoder](https://atcoder.jp/?lang=ja)でC問題が解けるようになった程度
（あきらかに実力不足）
探索アルゴリズムもあまり理解していなかった

**そりゃ足りないよね...**

## 2. チームリーダーに任せっきりだった

自分に実力がない中、チームリーダーである[ひがし](https://twitter.com/higashi136_2)君に頼りっきりでした

他のメンバーもひがしを頼ってたのかなっていう印象がありました

その結果、**チームの実力 $=$ ひがしの実力** ということになってしまった

## 3. 危機感がなかった
チームメイトの[かりんと](https://twitter.com/k41t_)君と[えびな](https://twitter.com/ebina_hoge)君と自分に危機感が無さすぎたのかなと思いました

実際あった会話なんですけど

ひがし「進捗は？？」
えびな「やばいね」
かりんと「キーーーーーッ」
ハラショー「:sweat_smile:」

そりゃだめだよね...

## 4. バイトをしていた

これは言ってもしょうがないけど自分はアルバイトをしていました

学校の寮を出た自分はアパートに住んでアルバイトである程度の生計を立てていました

でも、ほかのチームメイトよりも開発できる時間も限られ
かなりキツイ状況でした

もし寮に住んでいたら...
なんて「〜たら」「〜れば」はやめましょう

***

ここまでは反省でしたが得たものもあります

# 得たもの

## 1. [GitHub](https://github.com/)が使えるようになった

チーム開発をする上でGitHubを使うのは必須でした
まぁ自然と使ってくうちに使えるようになったよね

## 2. 複数人で開発する雰囲気を味わえた

今までコードを書いたのは一人でだったので
みんなで一つのプロジェクトを動かすことがどういうものなのか知ることができました

これはほんとにいい経験

## 3. 入ったばかりだったが部活の先輩や後輩と話せるようになった

プロコンに出るうえで[ICT委員会](https://twitter.com/NITOk_ICT)に入りいろんな先輩後輩と話せました

話したいなと思ってた先輩方と話せてとても嬉しかったです

***

# 総括

とまぁ
いいことも嫌なこともあったプロコン30でしたが
出場してよかったなと思いました

来年は ~~物欲発揮して~~ 課題部門か自由部門に出ようかな
（わかんないけど）

というわけで
チームメンバーの皆さん
出場者の皆さん
関係者の皆さん
お疲れ様でした

これでハラショーのプロコン30を終了したいと思います