OmniAICreator/Qiita-1.07M huggingface dataset:
文化祭での作品について

コードについて自分で解説。見直しにもなっていいかもしれない、と思い書いた。

C++歴一年ほどで作りました。設計等はこれまで何にも学んでなかったです。
ここはもっといい関数、書き方があるよ！と思ったら何なりと仰ってください。

 https://github.com/Hirose-Yuto/school-festival-work/tree/master これのcpp，hファイルです。別に見なくとも読むのには問題ないです。

DXライブラリを使ってゲームを作りました。開発環境はVisual Studioです。
##ゲームの概要
地球に侵略してきた、地球の反対側にいる敵にロケットを発射させて当てて駆逐しようぜってゲーム。　非常に伝わりにくかった。これは反省。
主に万有引力の法則を用いて制御した。

##クラスについて
一旦クラスについて軽く説明。

>・Draw
・Handle
・Mouse

それぞれ、Drawはフォントや色、Handleは画像データ、 Mouseはマウス、に関するものをまとめました。メンバ変数、関数ともに全てstatic。同じ系統は系統で管理したかった。初期化(?)も同じ場所でまとめた。

>・gameframe 

ゲーム全体の枠組みに関するもの。これは表示した方が早い。

```cpp:gameframe.h
class gameframe { 
public: 
	void doMainLoop(int); 
private: 
    GameState stage=GameTitle;
  	enum GameMainMode { Select, FromEarth }; 
  	GameMainMode GameMainSelect = Select;
	bool GameResult; 

  	void drawGameMain(); 
  	void drawGameTitle(); 
  	void drawGameOver(); 
  	void drawGameClear(); 
  	void drawCredit(); 
  	  	 
  	ThrowFromEarthGame EarthGame;
 }; 

```

>・Game
・ThrowFromEarthGame:public Game
・NiconicoComment

ゲーム本体に関するもの。
Gameでゲームの基本的な流れ。
その子クラスとして、ゲームの細かい部分を担当したThrowFromEarthGame。ゲームの種類を増やすときに苦労しないようその形にした。~~結局作らなかったが。~~(オブジェクト指向といったところか？)
NiconicoCommentはクリア演出周り。ニ◯ニ◯風の演出。名前でお察し()。

##プログラムの大まかな流れ
main()でgameframe.doMainLoop()を呼び出し、ここで主にループを行う。
enumとswitchでゲームの状態を管理し、ゲームが選択されたらGameのループに入れる。ここでループを別に用意したのは、ループ外の処理が無駄だから。
ゲームを終えたら、結果に応じてゲームクリア、オーバーを表示して最初に戻る。

##GameMain()について
まず初期化。ここでループに入る。
ThrowFromEarthGameでは最初に値を設定する必要があったので、設定させる。Enterキーが押されたら計算の初期条件を整えて演算開始。
(ちなみにThrowFromEarthGameでは第二宇宙速度を超えるかで演算を変えた。軌道が楕円になるかどうかの問題。)


演算するからには現実と時間の進み具合を合わせなきゃいかんので、ループ一周ごとに時間を計測してそれを演算に反映。
要所要所にゲームで必要な判定やゲームリセット、ゲーム終了を用意。
ゲームをクリアしたらクリア演出。そしてdoMainLoop()のループに戻す。

##反省、言いたいこと
時間を計測して、と言っていたがいわゆるフレーム制にしてよかったかもしれない。今回のゲームではあまりいらなかったが、他のゲームでは一周の時間を固定した方が処理がしやすそうだ。

あと、クリア演出で表示されるコメントをプログラムに直接書き込んでしまったが、vectorでまとめたならtxtファイルからでも読み込む形式にすればよかったと思う。


普通ゲームを作るなら、

アイデア→デザイン→設計→コーディング→修正　

という感じの流れだと思うが、

アイデア→コーディング→修正→デザイン→それに伴う修正

とかいう行き当たりばったりのことをしてしまった。設計は正直後付け。
部活で作品を出すのは自分だけじゃないんで、ゲームを立ち上げたりするランチャーも作った。
この作品の反省を生かして、その時は同級生も利用しつつ前者の流れで作った。慣れたのもあると思うが、非常に作りやすかった。

デザイン関係はとても苦労した。実際にこの記事を読めばその未熟さがわかる←

##最後に
ここまで読んで頂き、ありがとうございました。
では。
javascriptでのファイル分割（importとexport）

# export

分割するためにはまずはexpotしたいファイルに下記を記述して他のファイルでも参照できるようにする。class単位で参照できるようになる。

```rei.js
class Rei{
}
export default Rei;
```

# import

imprtしたい場合、下記のようにclass名とそのclassの記載されたファイル名を指定。

```script.js
import Rein from "./rei.js";
```

# export defaultの注意点

## 変数や関数もエクスポートできる

```javascript
const text = "ababa";
export default text;
```

## 自動的にexportdefaultで設定したものがimportされる

```javascript
const dog = new Dog();
export default dog;
```

```javascript
import doggy from "";
doggy.info();
```

この場合doggyにはdogが入っている。上記のようにexport defaultは自動で代入してしまうのでファイル一つにつき一つしか使えない。

# 名前つきエクスポート

defaultをつけないで{名前}を指定すると名前に指定したもののみをexportできる。配列も可能。

```javascript
export {名前};
export {名前1,名前2};
```
```javascript
import {名前} from "";
名前.info();
import {名前1,名前2} from "";
```

# ファイル名の記述

```javascript
import {dog1,dog2} from "./dogData";
import {dog1,dog2} from "./dogData,js";
```

.jsはつけてもつけなくてもよし
インストールするだけでVSCodeをカッコよくする拡張4つ

VSCodeを使い始めました。とりあえずデフォルトをイケてる感じにしたかったので、4つの拡張機能をインストールしました。せっかくなので共有します。

Before|After
---|---
<img width="945" alt="Before" src="https://qiita-image-store.s3.amazonaws.com/0/10499/acb102e7-5f28-3456-3b52-37cc3c0558e8.png">|<img width="945" alt="After" src="https://qiita-image-store.s3.amazonaws.com/0/10499/49908057-943f-08df-1c99-1241c0f2f1aa.png">

私と同じVSCode初心者は、とりあえず下記をインストールしておけばOKだと思います！

1. [Dracula Theme](https://draculatheme.com)
2. [Material Icon Theme](https://github.com/PKief/vscode-material-icon-theme)
3. [Indent Rainbow](https://github.com/oderwat/vscode-indent-rainbow)
4. [Bracker Pair Colorizer](https://github.com/CoenraadS/BracketPair)

# 1. Dracula Theme
まずはこれ。[Dracula Theme](https://draculatheme.com)です。
これを入れればシンタックスハイライトが変わり、かなり雰囲気が良くなります。デフォルトのハイライトだと特別感が少ないので、本当におすすめです。

追記：Dracula以外のおすすめThemeをこちらにまとめています。よかったら見てください。
[VSCodeをカッコよくするTheme拡張7つ](https://qiita.com/ksakiyama134/items/9971620dd5fb51c75f2a)

<img src="https://draculatheme.com/assets/img/screenshots/vscode.png">

**GitHub**
https://draculatheme.com

# 2. Material Icon Theme
[Material Icon Theme](https://github.com/PKief/vscode-material-icon-theme)を使うと、ファイルアイコンをマテリアルデザインにできます。プロジェクトビューが柔らかくなりました。
<img width="200" src="https://qiita-image-store.s3.amazonaws.com/0/10499/86b8e858-ce25-75a2-3392-b8f91b96bd74.png">

**Marketplace**
https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme

# 3. Indent Rainbow
[Indent Rainbow](https://github.com/oderwat/vscode-indent-rainbow)をインストールするだけで、インデントレベルごとに背景色が付きます。デフォルトだと縦線ハイライトが付きますが、背景色だとやんわりした感じになります。
<img width="975" alt="Screen Shot 2018-11-04 at 9.51.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/10499/c6133046-53db-2076-a67c-d839c5b3a737.png">

**Marketplace**
https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow

# 4. Bracket Pair Colorizer

**更新！** [VSCodeバージョン1.60.0からビルドインで機能が提供されています](https://code.visualstudio.com/updates/v1_60#_high-performance-bracket-pair-colorization)

最後は[Bracket Pair Colorizer 2](https://github.com/CoenraadS/Bracket-Pair-Colorizer-2)です。対応するカッコに縦横線のハイライトを表示してくれます。
![bracket.png](https://qiita-image-store.s3.amazonaws.com/0/10499/89b2eddc-9972-b129-d793-b40fbe041938.png)

**Marketplace**
https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer-2

**旧版**
当初、この記事を書いたときに2はBeta版だったのですが、現在は正式版になっているようです。旧版のリンクも残しておきます。
https://marketplace.visualstudio.com/items?itemName=CoenraadS.bracket-pair-colorizer

# 5. Peacock (2020.11.4追記)

タイトルに `4つ` と書いたのですが、追加でもう1つだけ。
[Peacock](https://github.com/johnpapa/vscode-peacock) は開くプロジェクトによって VSCode の色を変更できる拡張機能です。使い方の例として、「Aのリポジトリは React Blue」「Bのリポジトリは Vue Green」といった具合に、パッとみでどのリポジトリを開いているか、視覚的にわかりやすくできます。これもインストールするだけで簡単に使えちゃいます。

<img src="https://raw.githubusercontent.com/johnpapa/vscode-peacock/main/resources/hero.png">

**Marketplace**
https://marketplace.visualstudio.com/items?itemName=johnpapa.vscode-peacock
RatatoskrによるUSBキャプチャ

殴り書きなので必要な情報や足りない情報があればちょくちょく訂正します。

## USBキャプチャとは

Web業界ではEthernet通信をモニターできるEthernetキャプチャがよく使用されると思いますが、USBキャプチャはそれのUSB通信版です。Web関連業界だとあまり恩恵はなく使い道は少ないですが、組み込み業界にいると非常にお世話になります。

## Ratatoskrとは

組込み機器開発の効率化を目指した.NET Frameworkで作成されたOSSの汎用通信ソフトです。
単純なシリアル通信やTCP/UDP等の通信もでき、送受信パケットの用途に合わせてデータビューやフィルタを設定できます。

RatatoskrはUSBPcapにてUSBキャプチャを実現しています。
WiresharkでもUSBPcapを使用することでUSBキャプチャを行うことができますが、USBキャプチャを使用する方法が異なるため、WiresharkではUSBキャプチャが使用できなくてもRatatoskrではUSBキャプチャができることがあります。

## インストール

### 1. ランタイムをインストール

Ratatoskrを実行するための.NET Frameworkと、USBキャプチャを使用するためのUSBPcapをインストールします。Ratatoskrは.NET Framework 4.7を使用します。(.NET Framework 4.6でも動く？)

* [.NET Framework 4.7](https://www.microsoft.com/net/download/dotnet-framework-runtime/net47)
* [USBPcap 1.2.0.4](https://desowin.org/usbpcap/)

### 2. Ratatoskrをインストール

以下からダウンロードしてインストールしてください。(執筆当時はv0.5.0が最新)
https://github.com/tokihk/Ratatoskr

### 3. Ratatoskrを管理者権限で起動する

RatatoskrでUSBキャプチャを使用するには、Ratatoskrを管理者権限で起動します。Ratatoskrを管理者権限で起動するには、スタートメニューや実行ファイル本体を右クリックして「管理者として実行」を選択します。

管理者権限で起動していれば、タイトルバーに「(Administrator Mode)」が表示されます。
![管理者権限.png](https://qiita-image-store.s3.amazonaws.com/0/158155/6687ea88-00ed-2f76-cd84-175a264419fb.png)

## USBキャプチャの設定と実行

### 4. USBキャプチャをセットアップする

Ratatoskrは一度に５個までの通信を行うことができますので、今回は「GATE_001」にUSBキャプチャ機能を設定します。「GATE_001」のボタンを左クリックするとGate settingのダイアログが開くので、Device typeで「USB Monitor」を選択します。Monitor deviceはUSBコントローラの数だけ表示されるので、USBキャプチャしたいUSBのみを選択します。どのUSBPcapの下に目的のUSBデバイスが存在するかはUSBPcapと一緒にインストールされるUSBPcapCMDを使用することで確認できますが、今回は割愛して適当に選択します。

![モード設定.png](https://qiita-image-store.s3.amazonaws.com/0/158155/b51ffeb1-26bd-40ac-067c-75f14e087bbd.png)

### 5. USBキャプチャを有効にする

「GATE_001」にUSBキャプチャを設定した後、「GATE_001」を左クリックすることでUSBキャプチャが開始されてパケットビューにデータが流れ始めます。

![キャプチャ.png](https://qiita-image-store.s3.amazonaws.com/0/158155/6b8bd6d7-02a4-a031-231b-7ad18080f73d.png)

流れてきたデータの種類はInformationにて識別できます。
表示形式は以下です。
　`USB: [デバイス番号]-[Isochronous/Interrupt/Control/Bulk]`
ブログを書くまでがJAWS FESTA 2018 OSAKA!!

# はじめに
この度はスポンサー・スタッフの方々を初め、
500+の参加申し込み・400+の来場いただいた方々ありがとうございました！！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88884/d5501818-7d0e-e1d2-0a27-a8465d2f2c2f.png)


さいこーな1日でした！！

今回は、"お飾りの実行委員長"と"登壇者"と"企業スポンサー"して
[JAWS FESTA 2018 OSAKA](https://jft2018.jaws-ug.jp/)に参加しました。

実行委員長と登壇の両方やったのって初なのかな??
(すごく疲れました...)

1日中走り回っていたのですが、その中でもいたるところでお声がけいただき
嬉しかったです！

さて、今回ですが、各セッション等については、参加いただいた方がきっと書いてくださるので、自分のセッションについて書きたいと思いますw

# 自分のセッション
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88884/63265003-efb8-0551-211d-55f4bef36e27.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88884/bfc26572-b432-6a39-9e41-6cbbc4c24cb7.png)
ですねww

[数千イベント/sをServerless x Microserviceで捌く](https://jft2018.jaws-ug.jp/session/914/)です。
資料は[こちら](https://www.slideshare.net/ssuser9d40ae/serverlessmicroservice)
今回は抽象度高めの内容にしました。
初めは、がっつり現場のエモいインフラよりな話で構成していたのですが、
聴きにきていただく方は、どんな内容だと喜んでもらえるかなーとかどんな話聞きたいのかなーとか色々考えました。(社内のあれこれもあり....おっと...)
"なぜ"そうした/選択したのかってあたりかなーと思い、そんな感じにしました。

で、今回試みたのが下記の2点です。
1. 僕はOutputするだけでなく、さらに多くのInputをもらえるような取り組み
2. アンケートにより、聞きたい内容とマッチしていたかの確認

1.については、セッションの初めにTwitterで「始まるよー」的なtxtを含んだQRコードを表示し、皆さんにTweetしてもらうことをしました。
これにより、初めからスマホを出してTwitterを開いていただけるので、その後も感じたことをTweetいただける準備ができると踏んだからです。

結果は、、、、、、、、



ザーッとTweetを確認しました。
`僕のセッションのTweet多かった気がします！！！！(ニヤリ`
皆さんの感じ方を学べる好材料ですので、じっくり分析・ふりかえりさせていただきます！！！
ありがとうございます！！！！

2.については、、、、、、

Q. 満足度をお聞かせください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88884/c56ed498-ed84-c80a-e7d3-5b22d1c76fe4.png)
ありがとうございます！！！！！

Q.よかった点を教えてください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88884/31129298-5ef4-9d07-9d79-8a86f63ae453.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88884/683aca9d-823a-dbb6-6494-6b73a5885705.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88884/ad4e382b-98ad-990b-6708-49d18e3771b4.png)
ありがとうございます！！！！
「書籍などに書いていない、DeepDiveしないとわからないことをフィードバックできれば」の思いで、構成考えましたので、その結果が出ていたのかな！！！！(ニヤリ
後ほど、知人を介して「お礼の言葉などもいただけました！」

Q.イマイチだった点を教えてください
![image.png](https://qiita-image-store.s3.amazonaws.com/0/88884/ecb66564-4ce8-8000-141d-5b0a0c9dedb8.png)
いや〜うれしいですね！！！！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/88884/6e264da8-a557-3ee6-a7b2-b4db40cb233e.png)
これは、すみません。事前練習大事ですね...
時間が余ったので、エモい話&質問タイムに切り替えましたが、
エモい話がよかった！！！と言っていただける方や、
いっぱい質問いただき、嬉しい限りです！

=>
用意していたタイトルからは、少し抽象度の高いお話になってしまいましたが、
そこまで外していなかったのかな。と思いますw(自己満)

# さいごに
2点の取り組みをしてみて、いい感じに結果が出ていたので、
こちらもブラッシュアップしていこうと思います！

また、違う場所で同じ内容で後数回お話したいなー
お話するごとに、ブラッシュアップされ、自分の中でもまとめが進むと思います。
ホスト名&IP変更時のDHCPのフェイルオーバー機能再設定メモ

・DHCPフェイルオーバー設定済みサーバーでホスト名&IPアドレス変更が発生した際の対応メモ。

#作業手順
前提：環境はWindowsServer2012R2と2016。ホットスタンバイモードが組まれている。
ホスト名指定でフェイルオーバーを組んでおり、ホスト名変更で通信不可となるため以下手順を実施した。
以下でIP&ホスト名を変更するのはStandby側だが、Active側でも同様の手順で対応した。

1.Admin権限のアカウントで両サーバーにログオンする。
2.Activeサーバー側でDHCP管理ツールを起動し、各DHCPセグメントで"deconfigure"を選択する。
3.Standbyサーバー側で各DHCPセグメントが消えていることを確認する。
4.Standbyサーバーの参加ドメインをWORKGROUPに変更する。（ホスト名変更対応のため)
5.Standbyサーバーのホスト名を変更&OS再起動を行う。
6.Standbyサーバーをドメインに参加&OS再起動を行う。
7.StandbyサーバーのIPアドレスを変更する。
8.Activeサーバー側でDHCP管理ツールを起動し、ホスト名を右クリックし全セグメントに対してフェイルオーバーを設定する。
9.Active、Standby側で各DHCPセグメントが元の通り表示されている事を確認する。
10.Standby側でサーバーオプションを設定する。

#メモ
・フェイルオーバーを組めばActive側のセグメント情報がStandby側にも反映され、Standby側ではセグメント登録の作業は必要なし。PCのリース情報もStandby側に反映される。
・ホスト名変更後、ホスト名変更前のフェイルオーバーのプロパティ情報が残り削除が通信相手がいないエラーが発生し、削除できず。IPv4のアイコンが赤矢印で表示されるが、削除できなくてもDHCP機能は問題なく動作している。
・WindowsServer2016ではDHCPのサーバーオプション252(WPAD)を追加作業をしないと表示されない。追加方法は後日追記する。
MariaDBのブロックハッシュ結合

# 1.MySQLのJOINアルゴリズム

MySQLは従来からJOINする際に使用するアルゴリズムはネステッド・ループのみと聞いてきました。そこからフォークしたMariaDBも同様だと、今まで認識していました。
ところが最近下記の記事を知りました。

https://mariadb.com/kb/en/library/block-based-join-algorithms/
（Google翻訳）
https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https%3A%2F%2Fmariadb.com%2Fkb%2Fen%2Flibrary%2Fblock-based-join-algorithms%2F
ここにはMariaDB 5.3で「ブロックハッシュ結合」が可能になった、とあります。

そこで少々動きについて調べてみました。
# 2.環境

## 試したのは
・Windows 10 Pro
・MariaDB 10.2.15

## my.ini 以下のパラメータの修正、追加
・join_cache_level = 8
・optimizer_switch='optimize_join_buffer_size=on,mrr=on,mrr_cost_based=on'
・join_buffer_size 128K → 4M
・join_buffer_space_limit = 64M

## ・テスト用のテーブル
create table t ( id int, col1 varchar(255), col2 varchar(255) )

主キー、インデックスはなし

## ・データ
idに1から1000の連番、col1, col2は'a'と'b'で埋める

## ・SQL
```
select t1.*, t2.*
from t t1 join t t2
on t1.id = t2.id
```
あまり細かいことは考慮していません

# 3.実行計画の確認
```
+------+-------------+-------+----------+---------------+-----------+---------+------------+------+--------------------------------------------------+
| id   | select_type | table | type     | possible_keys | key       | key_len | ref        | rows | Extra                                            |
+------+-------------+-------+----------+---------------+-----------+---------+------------+------+--------------------------------------------------+
|    1 | SIMPLE      | t1    | ALL      | NULL          | NULL      | NULL    | NULL       | 1000 | Using where                                      |
|    1 | SIMPLE      | t2    | hash_ALL | NULL          | #hash#$hj | 5       | test.t1.id | 1000 | Using where; Using join buffer (flat, BNLH join) |
+------+-------------+-------+----------+---------------+-----------+---------+------------+------+--------------------------------------------------+
2 rows in set (0.00 sec)
```
実行計画の「key」に「#hash#$hj」が出現。
「extra」に「Using join buffer (flat, BNLH join)」が。
BNLHは **Block Nested Loop Hash** とのこと。

# 4.感想

とりあえず、MariaDBではハッシュ結合が出来るようです。
ただ、デフォルトの設定では有効になっていません。
この理由はよくわかりません。
確かに多数のセッションからアクセスがかかる場合、ハッシュ結合よりもインデックスを利用したアクセスパスのほうが効率的で使用メモリが少ないことは確かです。
動作としてjoin_buffer_sizeのメモリを常に確保する仕様だとワーカースレッド数が増えると無視できなくなります。
PostgreSQLなどだとけっこうハッシュ結合を実行計画として採用する傾向があります。
なお、PostgreSQLやORACLEなどだとSemi JOIN、Anti Joinでもハッシュ結合を採用しますが今回のテストでは確認できませんでした。
現在のMaiaDB開発陣のハッシュ結合についての評価の反映かもしれません。

なお、今回はあくまで動作に関することですので、実行パフォーマンスについての評価計測などは行っていません。
ハッシュ結合が常にパフォーマンス的に優れているわけではありません。
時間に余裕ができたら、いくつかのパターンで比較したいとは思っています。
Firestore のフィールド名は英語にすべき

個人的には、DBのカラム名（フィールド名）は視認性が良くなるため日本語が好きです。そこで Firestoreでも日本語で登録していたところ、2018年11月4日時点では、フィールドが日本語だと少なくとも管理コンソール画面ではソートできなかったです・・・（コードから直接クエリを使うとソートできるかどうかは未確認です）
日本語をよく使う方は気をつけてください。

Firestoreの管理コンソール画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/86792/488e27bb-85b5-9791-58bd-6b14191453fd.png)

試したソート条件
　　　　　<img src="https://qiita-image-store.s3.amazonaws.com/0/86792/7070c9a0-d04e-1534-7d11-8244d6d400e4.png" width="400">

ソート実行結果（エラーになる）
　　　　　<img src="https://qiita-image-store.s3.amazonaws.com/0/86792/871cc2ab-d6d4-3c33-7dc3-542edc66052c.png" width="400">
【忘備録】初心者向け　Docker で環境構築する際によく使うコマンド 


#目的

新しいプロジェクト先でdockerで環境構築を進めていくため
忘備録として、dockerで環境構築を進めるにあたって自分がよく利用しているコマンド一覧を並べてみる。

納得行く形で環境構築ができたらチュートリアルを書いていこうと思う。

#イメージ / コンテナの確認

```

#イメージ一覧
docker images

#動作中のコンテナ一覧
docker ps

#未動作含めてのコンテナ一覧
docker ps -a

```


#コンテナの実行

```
docker run centos
```

***動作内容***


①Dockerイメージ(centos)がDockerホスト(ローカルリポジトリ)に存在するか確認し、なければDocker Hub（レジストリ）からダウンロードする(docker pull)
②コンテナを作成する (docker create)
③コンテナを実行する (docker start)


#実行中のコンテナにシェルで入る

```
docker exec -it コンテナ名 /bin/bash
```

##デフォルトはフォアグラウンドなので、明示的にバックグランド実行したいときは　-d　オプションを追加

```
docker run -d nginx 
```


##--rmコマンドは自動削除 フォアグラウンドで利用したときのみ有効。date や catなどその場限りで確認したいときとかに有効

```
docker run --rm ubuntu date
```

##コンテナの中でシェルを利用する場合 "-i , -t"オプションで標準出力・疑似端末を有効にする

```
docker run -it ubuntu /bin/bash
```


#ログを見たい

```
docker logs dataonly_webserver_1
```

#コンテナにアクセス　

```
docker exec -it dataonly_webserver_1 bash
```

#削除系


##docker images全削除

```
docker images -aq | xargs docker rmi
```

##コンテナ全削除

```
docker ps -aq | xargs docker rm
```

##すべてのコンテナを終了する

```
$ docker kill $(docker ps -a)
```

##すべての終了しているコンテナを削除する

```
$ docker rm $(docker ps -a -q)
```

##動作しているコンテナを含めて、すべてのコンテナを削除する

```
$ docker rm-f(docker ps -a -q)
```

#webサーバーとDBサーバーの紐づけ
wordpress と　dbサーバーがpullされている状態を前提としている。
下記はwordpressにログインするときに必要なパスワードを明示的に指定している。

mysqlのバージョンによってはうまくいかないときあり。(pull mysqlでやると最新版が8系が取得され、権限の影響でうまくいかなかった。　→ mysql 5.6で指定したらうまくいった。)

```
docker run -d --link db:mysql -p 8080:80 -e WORDPRESS_DB_PASSWORD=password --name web wordpress
```

#イメージ名の編集

```
docker tag ansible/centos7-ansible ken0830/ansible/centos7-ansible
```
Javascriptのexportとimport

## modelを作ってexportする

```javascript
// exportする側
// constを作成
const exampleModel1 = {
    object: {
        prop1: 'prop1',
        prop2: 'prop2',
        prop3: 'prop3',
    }
};
const exampleModel2 = {
    object: {
        prop4: 'prop4',
        prop5: 'prop5',
        prop6: 'prop6',
    }
};
function example(x) {
  return x * x * x;
}
// 色々export出来る
export { exampleModel1, exampleModel2, example }



// importする側※exampleModel1だけimportの場合
import { exampleModel1 } from '/path/to/file';
```
【Rails】MySQL8.0のせいで1日中環境構築し直してた時のメモ

#環境
この記事で使用したversion（macOSです）
ruby 2.4.1
rails 5.1.6
mysql 5.7

#久しぶりにRailsで開発しようとしたら。
 なんかmysqlがどっかいったので、
まずは

```
$ brew install mysql
```
mysql 5.7を入れたかったのに、
これでmysql 8.0が入ってしまったようでした。

それに気づかず、rails newしたことで

**まる1日消えました。**

#ざっくり解決法
ほんとにざっくりメモです。

##憎きmysql 8.0を抹殺
まずは

```
$ brew uninstall mysql
```
##最愛のmysql 5.7をインストール

5.7は神

```
$ brew install mysql@5.7
```
##ちゃんとmysql @5.7にpath通ってるか確認しようね

pathは大事

```
$ echo $PATH
```

###mysqlにpathが通ってなかった場合

```

$ vi ~/.bash_profile

(~/.bash_profile　に以下を書き加える)
export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"
```

>[vim command](https://qiita.com/hide/items/5bfe5b322872c61a6896)
わかりやすいです。
ありがとうございます。

**ターミナルはちゃんと再起動しましょうね。**

#結果

```
$ mysql.server start
$ mysql
｜
｜
略
｜
｜
mysql>
```
ってなればOK。


あとなんか、
こんな単純なことをやる前に色々エラーおきてたけど、
全部消してこれやれば多分いい。（）

#睡眠は大事

なんでこんな単純なミスしてんだろう。
ちゃんと寝よう。。。(´◔ω◔`)
旋盤工とAI

ポエムなので、いつもの、ですます調ではありません。

# AIは旋盤工に取って代われるのか
悪の組織（大学や企業の研究所）が日夜、旋盤工を失業させるために頑張っているイメージだが、
現状のAIは旋盤工を失業させ得るとは思えない。
多くの人が思い描くのは、旋盤工に代わって、NC旋盤の前に立つロボットだろうが、
NC旋盤自体がロボットのようなもので、ロボットがロボットを制御するのは非効率だから、
そういったことは起こり得ない
また、多くのNC旋盤が、インターネットに接続されていないし、
旋盤という仕事をAIに教え込むために必要なデータの定義や、
ビッグデータが（秘密裏に）取得されているようには見えない。
しかし、油断は出来ない。
なぜなら、旋盤という仕事は、確率とくにベイズ推論の世界なのだから。

# 旋盤の仕事は確率論的である
例えば材料である。鉄材の場合、SS400のように成分がすべて均質ということはありえない。
材料の中に石が所々に詰まっていて、偶然石に当たった場合に切削していたチップが
摩耗していくというイメージだ。
例えばチップである。チップは工業製品なので均質と思いがちだが、
個々には微妙に大きさや品質が違っていて、うまく削れる場合もあるし削れない場合もある。
例えばタップやドリルである。材料にもよるし、切削条件にもよるが、ある回数以上になると破断する。
豊富なデータを使用できれば、切削条件や、使用回数をAIが決めてくれる未来の可能性もあるだろう。

# NC旋盤は未熟である
結論、AIに学習させるというAI対応NC旋盤が出てこない限りは、旋盤工は失業しないであろう。

以上
fabric 1.3.0の運用環境を構築する

# fabric 1.3.0の運用環境を構築する

- [fabric-ca 1.3.0の設定ファイルを取得する](https://qiita.com/sipadan2003/items/024cecda7f980f966eda?fbclid=IwAR0MiexodDU4opeRchgjJo9f6ulods_tRnH-ItFd6h_6PW79dPsa4nxiESc)
- [プライベートCAを構築する](https://qiita.com/sipadan2003/items/4f2ab95cb2019ae8bb79)
- [中間CA向けキーマテリアルを作成する](https://qiita.com/sipadan2003/items/341a0af48c9df6de0268)
- 以下，未稿
AudioSource.PlayOneShotがシーン変更時にぶつ切りになる問題と対応

UI.Buttonにこういうコールバックを紐づけていたとします。

```MyButton.cs
[SerializeField]AudioSource sePlayer;
public void OnTapButton()
{
    sePlayer.PlayOneShot(Resources.Load<AudioClip>("SeFileName"));
    SceneManager.LoadSceneAsync("NextSceneName", LoadSceneMode.Single);
}
```

音は鳴るんですが、途中で必ず音がブツっと中断されます。
どうもシーンの切り替えが起きると、再生中のAudioClipがnullか何かになるらしいです。
この現象は設定での回避はできない[^1]らしいので、処理で回避しました。

```MyButton.cs
[SerializeField] AudioSource sePlayer;
public void OnTapButton()
{
    StartCoroutine(ChangeSceneCoroutine())
}

IEnumerator ChangeSceneCoroutine()
{
    sePlayer.PlayOneShot(Resources.Load<AudioClip>("SeFileName"));
    while (sePlayer.isPlaying)
        yield return null;//1フレーム待機
    SceneManager.LoadSceneAsync("NextSceneName", LoadSceneMode.Single);
}
```

要するには、音の再生が終わるまではシーン遷移を行わない、という手法です。
SEの空白時間が長いとシーンロードが始まらないので虚無な時間が発生する可能性がありますが、
そこはこう、暗転+ローディングアニメーション演出とかで誤魔化すのが良いかと思います。
個人的に最近気に入った演出は、デスティニーチャイルドの一枚絵斜めスライドイン。
[^1]: 自分が見つけられなかっただけかもしれないので、ご存知な方いらっしゃったらご教示いただければと思います。
プライベートCAを構築する

# プライベートCAを構築する

証明書は本来，正式なルートCAまたは中間CAに依頼して発行してもらいます。
ここでは，開発用途で自前でルートCA（プライベートCA）を構築する方法を紹介します。

## 確認環境

- CentOS 7
- OpenSSL 1.0.2k-fips

## OpenSSL投入

```yum install``` コマンドでOpenSSLを投入します。
ここではOpenSSLの設定ファイルはいじりませんが，念のために設定ファイルをバックアップしておきます。

```bash
$ sudo yum -y install openssl
$ sudo cp /etc/pki/tls/openssl.cnf /etc/pki/tls/openssl.cnf.org
```

## OpenSSLの設定ファイルを確認

設定ファイルの一部を，次に抜粋します。
プライベートCAの構築にあたり，最低限，知っておくべき部分です。

```:/etc/pki/tls/openssl.cnf
[ ca ]
default_ca      = CA_default            # The default ca section

[ CA_default ]
dir             = /etc/pki/CA           # Where everything is kept
database        = $dir/index.txt        # database index file.
certificate     = $dir/cacert.pem       # The CA certificate
serial          = $dir/serial           # The current serial number
private_key     = $dir/private/cakey.pem# The private key
```

## プライベートCA構築

```CA_default``` セクションがデフォルトの設定です。
今までに証明書を発行したことがない場合，この設定に従って，次のファイルを作成していきます。

- /etc/pki/CA/serial
  - CAが証明書を発行するたびに，自動的にこのファイル内の数字がインクリメントされる
- /etc/pki/CA/index.txt
  - CAが証明書を発行するたびに，自動的にこのファイルに証明書の情報が追加される
- /etc/pki/CA/private/cakey.pem
  - CA自身の秘密鍵ファイル（漏洩しないように管理する）
- /etc/pki/CA/cacert.pem
  - CA自身の証明書ファイル

まず， ```serial``` と ```index.txt``` ファイルを作成します。

```bash
$ sudo su -c 'echo "0001" > /etc/pki/CA/serial'
$ sudo su -c 'touch /etc/pki/CA/index.txt'
```

今回は， **「ルートCA」** として使用するので自己署名で証明書を作成します。次のコマンドで，自己署名済みの証明書ファイル ```cacey.pem``` と秘密鍵 ```cakey.pem``` を作成します。

コマンドのオプションでは，暗号方式はRSA（2048ビット），公開鍵証明書の形式はX.509，ルートCAの国名として ```C=JP``` ，組織名として ```O=Example Company``` ，部署名として ```OU=Example Cerificate Authority``` を指定しています。

```bash
$ sudo su -c 'openssl req \
    -new -x509 -newkey rsa:2048 \
    -out /etc/pki/CA/cacert.pem \
    -keyout /etc/pki/CA/private/cakey.pem \
    -subj "/C=JP/O=Example Company/OU=Example Cerificate Authority"'
```

コマンドを実行すると，パスフレーズ（pass phrase）を聞かれるので，パスフレーズを入力します。プライベートCAで ```openssl ca``` コマンドで証明書を発行する際にこのパスフレーズの入力が必要になります。

最後に，作成した証明書を確認します。

```bash
$ openssl x509 -text -noout -in /etc/pki/CA/cacert.pem
```

以上で，プライベートCAの構築は終わりです。
GrafanaをIngress経由で利用するためのパスのRewriteについて

# 経緯

GrafanaをK8s上で動かす場合は既存のHelmを使うのがおそらく最も楽ですが、諸般の事情により個別のDockerイメージからデプロイしたい場合があります。Grafanaはデフォルトではhttp://*:3000/で動作するようになっていますが、K8sでサービスの外部公開にIngressを使う場合、/はデフォルトコンテンツのために空けておくのが習わしなので、/grafanaのようなサブパスを追記することになります。これがうまく動かずに半日ハマったので注意点を書き残します。

## 検証環境

IBM Cloud Kubernetes Service 1.10.8_1527

# 手順

## Grafanaへのサブパスの設定

サブパスを/grafanaとします。

grafana.iniの以下の場所を修正します。例えば``http:///grafana``です。ホスト名部とポート番号は省略します。この方が環境に依存せず汎用性が高くなるのでいいと思います。

```grafana.ini
# The full public facing url you use in browser, used for redirects and emails
# If you use reverse proxy and sub path specify full url (with sub path)
# ;root_url = http://localhost:3000
;root_url = http:///grafana

```

環境変数として外部から注入することもできます。DockerfileでもDeploymentでもお好きに。

```
GF_SERVER_ROOT_URL=http:///grafana
```

## デプロイ

いつものようにK8sにデプロイします。DeploymentとServiceを作っておきます。

## Ingressの設定

次のように設定します。pathは必ず``/``で終わらせ、アノテーションでパスを``/``にリライトします。リライトのアノテーションはこの例はIBM Cloud Kubernetes Serviceのものです。実際にはお使いのK8s環境で使えるものを使ってください。

```yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-sample
  annotations:
    ingress.bluemix.net/rewrite-path: serviceName=grafana-sample rewrite=/
spec:
  rules:
    - host: hoge.com
      http:
        paths:
          - path: /grafana/  # must end with /
            backend:
              serviceName: grafana-sample
              servicePort: 3000
```

## どこにハマったか

何がおきていたかを説明しますと、GrafanaのサービスはPodの内部的には/grafanaで待ち受けているつもりなので、ここの値をIngressのパスを一致させれば問題ないだろうと思っていたのですが、なぜかGrafanaは先ほど指定したroot_urlを一部のパスでは認識し、また、一部のパスでは無視していました。つまり、Grafanaのサービスは/で受ける必要があり、Ingressのパスと差が出るので、rewriteで/grafanaを/に書き換えました。当初は以下のように書いていました。

```yaml
metadata:
  annotations:
    ingress.bluemix.net/rewrite-path: serviceName=grafana-sample rewrite=/
spec:
  rules:
    - http:
        paths:
          - path: /grafana
```

しかしそれでもうまくいきませんでした。さらに調査すると、Grafanaのコンテンツファイル（画像やJavaScript等）は/publicというパス以下にあるのですが、/grafanaを/にリライトすると、//publicというパスへのアクセスと解釈され、これがGrafanaサーバでは404となっていました。//でも問題ないWeb/APサーバは多いと思うんですけどね。

次にRewriteパスを/ではなく./にしたら今度はIngressで無効な値だったらしくアノテーションが認識されなくなったりとPDに多くの時間を要しましたが、勘のいい方は気づいたと思いますが、/grafanaを/にするから/grafana/publicが//publicになっていたんです。なので、/granana/を/にすれば/grafana/publicは/publicになります。はい、たった一文字で解決しました。

```yaml
spec:
  rules:
    - http:
        paths:
          - path: /grafana/  # must end with /
```

## 教訓

Webの世界ではパスのトレイルは明確に書くべし。
Array.prototype.includesとArray.prototype.indexOfの違い

### はじめに

配列がある要素を含むか判定することはよくありますよね。その時に使われるメソッドとしては表題の二つがあります。
ちなみに私は基本的に`includes`を使います。だって`indexOf`は結果と`-1`を比較しないとBooleanが取り出せないし、文字数多いもん。
恥ずかしながら`arr.includes('a')`と`arr.indexOf('a') !== -1`は微妙に異なることに最近気が付いたので、調べたついでにまとめました。
このメソッドを使う時はBooleanを取り出したいことが多いので、その例を使います。
### まず使い方

```javascript
const arr = [1, 2, 3]
// indexOfは存在しない場合-1を返す
arr.indexOf(1) !== -1 // true
arr.includes(1) // true
```

どちらも第二引数にfromIndexを指定することもできます
### null

```javascript
const arr = [null]

arr.indexOf(null) !== -1 // true
arr.includes(null) // true
```

### undefined

```javascript
const arr = [undefined]

arr.indexOf(undefined) !== -1 // true
arr.includes(undefined) // true
```
これは同じ結果ですが、

```javascript
const arr = [,]

arr.indexOf(undefined) !== -1 // false !!!
arr.includes(undefined) // true
```
これはindexOfではundefinedとは異なる扱いを受けるようです。

~~`a=[,]`とした時に`a[0]`は`undefined`なのでincludesの挙動が正しい気がします。~~
※2018/11/5追記
`indexOfはあくまでindexを返す為に存在するので、indexが存在しない[,]では-1を返すという挙動をするようになっているようでした。`
もちろん

```javascript
const arr = []

arr.indexOf(undefined) !== -1 // false
arr.includes(undefined) // false
```
です


### NaN

```javascript
const arr = [NaN]

arr.indexOf(NaN) !== -1 // false !!!
arr.includes(NaN) // true
```
NaNはindexOfでは見つけられません。


### まとめ

- `Array.prototype.includes`と`Array.prototype.indexOf`の挙動はだいたい同じ
- `indexOf`は`NaN`と`空の要素`を見つけられない
初心者が『Swiftによるアプリケーション開発:入門編』を読んで自作アプリを作ってみた

# はじめに
## 自己紹介
初めまして、はなまと申します。
本業(?)は京都大学理学部で化学を勉強しています。
プログラミング初心者ながらアウトプットしていこうと思っております。拙いところがあれば是非ご指摘よろしくお願いします。
Qiitaでの初投稿として、最近始めたswiftの入門書の書評を書いていきたいと思います。
## 動機と本の紹介
今回swiftの勉強をしようと思ったきっかけは大学の友人が一緒にお酒についてのアプリを作らないかという声をかけてきたからです。
お酒もプログラミングも好きだったのでいいきっかけとしてswiftの勉強をすることにしました。
さて、swiftをどうやって勉強しようかと[Appleの公式サイト](https://www.apple.com/jp/swift/)を見ているとApple自身で学習ツールを提供してくれているということが書いてありました。そしてまず手始めにそこで見つけた『[Swiftによるアプリケーション開発:入門編](https://itunes.apple.com/jp/book/id1209648719?mt=11&ls=1)』を使って勉強を始めてみようと決意しました。
(上のリンクからiBookで無料で入手出来るので初めてみたい方は是非！)
# 書評
## 環境
macOS Mojave ver 10.14
Xcode ver 10.1
Swift 4
Swiftによるアプリケーション開発:入門編 p.5からダウンロードしたXcode9用のプロジェクトファイル
(2018/11/4現在　Xcode10用のプロジェクトファイルは更新されていませんが、画面レイアウトが少し異なる点以外はXcode9用でも十分学習できました。)
を使って学習しました。

## 目次と構成

- Playgroundの基本
- 命名と識別子
- 文字列(Strings)
- Hello, world!
- 最初のアプリケーション
- 関数(Functions)
- BoogieBot
- 定数と変数(Constants and Variables)
- 型(Types)
- パラメータと結果(Parameters and Results)
- 意思決定を行う
- インスタンス、メソッド、プロパティ
- QuestionBot
- 配列とループ(Arrays and Loops)
- 構造体を定義する(Defining Structures)
- QuestionBot 2
- アクションとアウトレット
- アダプティブユーザーインターフェイス
- 列挙型とswitch文(Enumerations and Switch)
- 最終プロジェクト
- アプリケーションデザイン
- 次のステップ
- その他のリソース

以上の構成になっており、実際の作業はダウンロードしたプロジェクトファイルを使ってPlayground上で実際に手を動かしながら学べます。
iBookにはイントロダクションとまとめ、次のステップへのヒント、理解度チェックというそのレッスンの確認テストが掲載されています。
各理解度チェックは選択式のものでそのレッスンに出てきた新しい言葉の意味やコードのテンプレートの正誤を判定するもので手軽に出来る様に工夫されています。
練習問題の解答などについては友人の[こちら](https://www.siketai.org/entry/2018/10/09/125843)のブログにまとまっているのでぜひ活用すると良いと思います。

## 感想
プログラミングに初めて触れる人でもレッスンを順にこなしていくことで無理なくスキルを身につけることができる様になっていると感じました。後半のレッスンでは少し長いコードを書くことも要求されますが、事前にしっかり解説や準備があるのでコーディングに対する苦手意識も生まれにくいと思います。
中でも僕が特筆したいと思うのはレッスン2の変数の命名とレッスン10の関数の命名です。
僕が初めてプログラミングに触れたのは約1年前でしたが今までコードを書いてきた上で使ってきた変数名や関数名は可読性や保守性の面であまりよくないものだということを実感させられました。

```swift:例
#Bad Naming
hA:Double //図形Aの高さ
vB:Double //図形Bの体積
func greeting(people: String) //挨拶文を出力する関数

#Good Naming
heightOfA:Double //図形Aの高さ
volumeOfB:Double //図形Bの体積
func printGreeting(to name: String) //挨拶文を出力する関数

```

恥ずかしながら1年前から書いてきたコードたちには上の様な名前が散見されていました^^;
上の例でもわかる様に下の変数は連結して一つのものを明確に表しているし、関数は文の形になっていて関数内部での引数の扱いも明示できています。Xcodeでコードを書くとオートコンプリート機能が働いて名前の続きは自動的に補填されるので多少長くてもわかりやすい命名をすることが大切だと感じました。(あまりにも冗長なものはもちろん逆効果ですが、、、)

この他にも後々重要になってくることや他の言語で開発するときにも重宝する様な情報も散りばめられていました。

# 作ってみた

学習のまとめとしてこの参考書を使って学んだことを使ってその日の状況に応じてオススメの夕食を提案するアプリを作ってみました。ソースコードは[こちら](https://github.com/CastaChick/DinnerProducer)です。
練習として構造体の定義や様々なアウトレットの配置をおこなってみました。
シンプルながら下の様なレイアウトのアプリの作成ができました。
![UI見本.png](https://qiita-image-store.s3.amazonaws.com/0/306613/8f6b3076-4c35-1fc2-7c36-298c212cde31.png)


# まとめとこれから
親切にswiftに入門できる良書であり、これからアプリを作ってみたいという方にもお勧めできると思います。
以後は発展編である『[App Development with Swift](https://itunes.apple.com/jp/book/app-development-with-swift/id1219117996?mt=11)』(英語版のみ)を使って本格的なアプリ作成法を勉強したり、他のリソースを探してアプリケーションデザインの勉強をしたりしてアプリらしいアプリを作成できる様になりたいと思います。
駄文ながら閲覧していただきありがとうございました。
手っ取り早くSSH公開鍵認証の設定するメモ

# 手っ取り早くSSH公開鍵認証する

**ちゃんとしたい人が↓の手順でいいのかどうかは知らないので注意。**

## ローカル側＠キー生成

git-bashから、

```bsah
ssh-keygen.exe -f hogehoge

# パスフレーズを聞かれるのでenter連打で飛ばす（必要なら当然入力）
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

カレントに↓のファイルができるので、それぞれ秘密鍵、公開鍵
```
hogehoge
hogehoge.pub
```

## サーバ側

ログインするユーザに対して、

```bash
cd ~/.ssh
```

で、authorized_keys の中にhogehoge.pubの中に書かれてるテキストを追記する。
コマンドでいうと、

```
cat hogehoge.pub >> authorized_keys
```

## クライアント側＠ログインする

```
ssh -h xx.xx.xx.xx -i hogehoge
```

※Teratermとか使う場合は、秘密鍵として、hogehogeを指定する。
若手エンジニアとしての心がけ

新卒としてweb企業に就職しそろそろ若手ではなくなってきたので、
自分への戒めも込めて書きたいと思います。
(エンジニアリングの話は、ほとんど出てこないです。)

## 信頼貯金を意識する
信頼が仕事をするうえで一番大事だと思います。
信頼がない状態で自分の意見を言っても聞いてもらえないですし、
信頼がない状態で仕事を任せてもらえるようにはならないと思います。
信頼はすぐに得られるものではなく、
日々の行いを通して少しずつ得られるものであり、
貯金のようなものだと思っています。
悲しいことに信頼は貯めるのは難しく時間がかかりますが、
無くなるときは、一瞬で無くなります。

自分の信頼貯金がいくらほどあるかをちゃんと把握して、
信頼貯金に応じた行動をすることが大切だと思います。

ただ信頼を得ることだけに意識を向けて人の顔を見て仕事をしてしまうと、
社内政治が始まるので、それは避けるべきだと思います。

## オープンな存在になる
仕事は一人では行えないので他の人と関わりますが、
自分がどういう存在で何を考えているか・何に重きを置いているかなどを、
発信してオープンな存在にすることが大事だと思います。

オープンな存在の方が周りが自分を理解する部分が多くなるため、
自分のキャリアプランニングに沿った経験をさせてもらうこともできますし、
自分が働きやすい環境になると思います。

また教えてもらう立場の時には教える方も、
何がわからいのか・どこで詰まっているのかを知りたいので、
自分は何がわからないのか・何を教えてほしいかを明確に示すことも大事です。

あと、人は忙しいときやミスとしたときはクローズな状態になりがちですが、
そういった状態でもオープンな状態を維持して、
一人で抱え込まないことを意識すべきだと思います。

## 相手を尊敬、尊重する
エンジニアはプロダクトの開発に責任を負っているプロフェッショナルですが、
企画やデザイナーは同じプロダクトの別の部分の責任を負っているプロフェッショナルです。
一つのプロダクトにおいて別の責任を負った人がいるので、
必ず意見が食い違う時がありますが、否定的にとらえてはいけないと思います。

しっかりとなぜ相手はその意見になるか・相手は何を考えているかを考え、
相手の意見を尊重した上でシステムに落とし込むべきです。

またエンジニア同士でも、お互いの得意分野や設計に対する思想が違うので、
相手のコードや設計を否定せずに、どのアプローチがプロダクトに一番合っているかを考慮し、
コードレビューなどを行うべきだと思います。

## 自分の論を持つ
若手は教えてもらうことが多いのであまり意識しないかもですが、
何事にも自分の論を持つことが大事です。

自分の論がない状態で他の方に質問や意見を求めて回答が返ってきて、
それをそのまま取り入れても何も自分の成長には繋がらないと思います。
自分ではできない仕事でもいったん自分で出せる考えを出したうえで、
他の方に自分の意見をぶつけてみることが大事だと思います。
違っていたらそのズレから自分がどれだけ足りない部分があるかを、
知ることができるかと思います。

また自分の論を作るときにはしっかりと自信を持つことが大事です。
自信がない付け焼刃の論を持つぐらいなら、持たない方がましだと思います。

## コストを意識する
コストといっているのは、時間的なコストの話です。
社会人は時間に対してお金をもらっているのでできるだけ無駄な時間を減らすことが
コスト面では大事だと思っています。

コミュニケーション部分でのコストは他人と自分の時間のコストがかかるので、
コーディングといった自分だけの時間のコストよりも意識する必要があると思います。
例えば他の人に質問をするときには事前に分からない内容をまとめておくことや、
会議に議題を持ち込むときには何を話すかを明確にしておく、などです。
仕事で話すときにちゃんと会話のゴールを決めて、
無駄な時間を使う手探りの会話を避けることが大事だと思います。

ただ仕事外の雑談は大いにすべきだと思います。

## 振り返りをちゃんとする
定期的に自分の振り返りを行うことが大事です。
普段の業務に対する振り返りもちろんですが、
自分のキャリアの棚押しも振り返りに含めて行うべきだと思います。

振り返りで意識すべきことは振り返りをしたうえで、
ちゃんと次の行動を明確にすることです。
振り返りをただ漠然として、
次に行う行動を決めないと意味がないので注意です。

またチーム内での振り返りもチーム力の強化になるのですべきだと思います。

## チームを意識する
チームとして働くうえでは自分の仕事はもちろんですが、
チーム全体の問題点を自ら考え改善していく動きを自主的に行うことが、
チームにとっては大事だと思います。

チームに貢献しようとすると今までの自分視点ではなく、
チーム全体視点で物事を見る必要があるのですが、
これがすごく大事だと思います。

いかに自己組織化ができるようになるかが、チーム力につながるかと思います。

## できるだけプロダクトの話をする
エンジニアは案件を遂行するのが仕事ですが、それだけがすべてではないと思います。
案件の裏にはKPIであったりサイトとしての目指している姿があるわけで、
それが単にシステムタスクとして落とし込まれたのが、案件です。

なので案件を行うときには最低でも一回は企画の方などと、
なぜ案件を行うのか・この案件終了後どうしていきたいのかといった、
プロダクト大枠にかかわる部分をちゃんと話すべきだと思います。
そうすることでシステムとしてのモチベーションも上がりますし、
何より話すことでより仕様書には書かれていないような企画の意図などを知ることができ、
より効率的なアプローチなどを考えることができるようになり、
案件をより良いものにすることができます。

## 若手のメリットを生かす
あまり意識していない人が多い気がしますが、
若手ってすごく貴重な時間だと思います。

メンターの方に質問をしたら親身になって教えてくれるし、
少しミスをしてもチームがカバーしてくれるし、
手を上げたら大体のことをやらせてもらえるし、
何よりミスをしたら、ちゃんと怒ってもらえることができます。

中途やベテランになるとそうはいかなくて一人の社会人になるので、
教えてもらう機会や注意される機会も少なくなって、
シビアに評価されてしまいます。

なので若手というメリットを最大限使って、
恐れずにできるだけ手を挙げていろいろ経験するのが本当に大事だと思います。

## まとめ
エンジニアはエンジニアリングスキルも大事ですが、
エンジニアリングスキル以外にもいろいろ大事な部分があるかと思います。
(もちろん一定のスキルレベルはマストだと思いますが。)

コメントやツッコミいただけると嬉しいです。
【JavaScript】オブジェクトリテラルの省略記法

## はじめに
ES2015を使用したオブジェクトリテラルの省略記法について説明します。
少しコードをスッキリ書く事ができます。

## 対象読者
・ES2015をこれから使っていきたい人

### 注意点
レガシーブラウザに対応させる場合は、トランスパイラ（Babel等）を使用し、ES5記法にトランスパイルをおこなってください。
（参考記事）
https://qiita.com/mizchi/items/3bbb3f466a3b5011b509#%E3%81%84%E3%81%BE%E3%81%99%E3%81%90es2015%E3%82%92%E4%BD%BF%E3%81%86
https://qiita.com/hietahappousai/items/9570da4b9275425489b2

## 省略記法
### valueを省略できる（keyとvalueの変数名が同じ時）

【例】 ES5の書き方

```js

const location = 'カリフォルニア';

const company = {
    name: 'google',
    location: location,
    getLocation: function() {
        return this.location;
    }
}
console.log(company.getLocation()); //カリフォルニア

```

【例】 ES2015での書き方

```js

const location = 'カリフォルニア';

const company = {
    name: 'google',
    location,
    getLocation: function() {
        return this.location;
    }
}

console.log(company.getLocation()); //カリフォルニア

```

### functionを省略できる

【例】 ES5の書き方

```js
const location = 'カリフォルニア';

const company = {
    name: 'google',
    location,
    getLocation: function() {
        return this.location;
    }
}

console.log(company.getLocation()); //カリフォルニア
```
【例】 ES2015での書き方

```js
//ES2015
const location = 'カリフォルニア';

const company = {
    name: 'google',
    location,
    getLocation() {
        return this.location;
    }
}

console.log(company.getLocation()); //カリフォルニア
```

## 使用例
なにかをPOSTする時

```js
function postMessage(url, data) {
    $.ajax(
        {
         url,
         data,
         method: 'POST'
        }
    );
}

const url = 'https://xxxxxx';
const data = { text: 'xxxxxxxx' };

postMessage(url, data);
```
Pythonで1行ででかい💩を表示するまでの道のり

#TL, DR
```print("\n".join([f'{" "*(10-i)}{"💩"*i}' for i in range(10)]))```

#1.💩の表示
そもそもprintで絵文字を表示できていたかの確認

```python

>>> print("💩")
💩
```
よし，出だしは順調
（考えてみれば日本語が入力できるので，絵文字も出力できてもおかしくなかった）

#2. 片階段💩の作成
絵文字をよくよくみる限りおそらくでかい💩は正三角形型に💩を並べれば良さそう
ならばfor文で適当に片階段💩が作れるはず
高さはとりあえず10段ぐらいでいいだろう

```python

>>> for i in range(10):
...   print("💩"*i)
... 
💩
💩💩
💩💩💩
💩💩💩💩
💩💩💩💩💩
💩💩💩💩💩💩
💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩
💩💩💩💩💩💩💩💩💩
```
ここまではいい感じ

#3.正三角形のでかい💩の作成
正三角形を作るということは💩の前にスペースを置きたい，
💩が全角ということを考えると（本当に全角かは不明）
一行あたりに置くスペースの数は

```math
(段数-i)/2\times2
```
となるはずだ
つまりコードにすると

```python
>>> for i in range(10):
...   print(f'{" "*(10-i)}{"💩"*i}')
... 
         💩
        💩💩
       💩💩💩
      💩💩💩💩
     💩💩💩💩💩
    💩💩💩💩💩💩
   💩💩💩💩💩💩💩
  💩💩💩💩💩💩💩💩
 💩💩💩💩💩💩💩💩💩

```
これでいいと思ったが，何かが違う
これでは💩ツリーだ


#4.💩ツリーの1行化
テクいことはできないので，素直にリスト内包表記を使っていく
ここでちょっと迷ったのが，
```print([i for i in range(10)])```
```[print(i) for i in range(10)]```
で結果が違うのだ（当たり前かもれないが）

それぞれ結果は

```[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]```

```
0
1
2
3
4
5
6
7
8
9
[None, None, None, None, None, None, None, None, None, None]
```
となる
下のコードの最後のNone配列ってなんだ？と思ったが，考えてみれば自然なことでインタプリタではリストの内容が勝手にprintされているので，print文の戻り値がリストに入っているのである

今回はインタプリタでもカッコよく💩を見せたいので，リストを生成してprintしてやろうと思う
ただし素直に書いてあげるとリストがそのまま表示されてしまうので(下コード)

```python
>>> print([f'{" "*(10-i)}{"💩"*i}' for i in range(10)])
['          ', '         💩', '        💩💩', '       💩💩💩', '      💩💩💩💩', '     💩💩💩💩💩', '    💩💩💩💩💩💩', '   💩💩💩💩💩💩💩', '  💩💩💩💩💩💩💩💩', ' 💩💩💩💩💩💩💩💩💩']
```

joinを使って結合してあげる

```python
>>> print("\n".join([f'{" "*(10-i)}{"💩"*i}' for i in range(10)]))

         💩
        💩💩
       💩💩💩
      💩💩💩💩
     💩💩💩💩💩
    💩💩💩💩💩💩
   💩💩💩💩💩💩💩
  💩💩💩💩💩💩💩💩
 💩💩💩💩💩💩💩💩💩
```
これでワンライナー💩ツリーの完成だ

#終わりに
これが本当のクソ記事ってね

#Environment
python3.7
３０代後半から、プログラミングの勉強を始めた脳性麻痺のおっさんの取り組みと結果

Qiitaに自分も何か記事を投稿してみようと思い、これまでの学習の話を記事にすることにした。

# 自分の障がいとプログラミングを学ぶきっかけ
　私は、生まれつき脳性麻痺という障がいを煩っている。脳に障がいがあるために、手足と言語が不自由ある。実際にパソコンも鉛筆を加工した棒を一本握ってキーボードをたたいている。もちろん人よりも入力は遅い。言語に関しても自分の発する言葉はほとんど聞き取れにくく、基本筆談で用を済ませている。
　そんな自分が、ある雇用型の障がい者施設で働いていたところにそこの代表から｢もっとスキルアップしなさい｣と強く勧められ、その代表の知り合いの方が経営してるあるIT企業がプログラミング教育にも力を入れていることを教えていただき、プログラミングの学習が始まった。
　最初は、そこの会社が自分の働いてるところよりも１時間くらい電車で行くところでしたので、できるだけ自宅で学習し、分からないところは最初はご担当の方にSNSのメッセージでやりとりをしながら学習を進めていった。月に１度か２度はそこの会社を訪問することで、進捗や疑問点などをFaceToFaceで見ていただき、今後のアドバイスをいただく形を取っていた。

# プログラミング学習のために時間を作る
　当時私は、朝８時から事務の仕事をしていて家に戻れるのは、夕方から夜だった。土日も他の用事もこなす必要が生じたので学習時間を確保することには、苦労したと思う。でも心に決めていたこととして｢一日一行以上codeを打つ｣という目標を掲げて、１時間から２時間、時には３０分もできないときもあったけど、毎日学習することを目標に取り組んでいた。
### 学習内容は下記の通り
・技術書や教本を読む
　これは通勤の時間や昼休みも活用していた
・ドットインストール
　映像自体のテンポは、早いものの繰り返し見られるところが自分には合っていたと思う
・実際にアプリを作る

# プログラミング学習で役立ったこと
　上記に書いたような学習方法を取り組んでいく一方で、早い段階で、プログラミング学習でお世話になっている会社の方々が中心となって行われていた｢コミュニティー｣に参加できたことは大きな助けとなった。そのコミュニティーが主催する勉強会に毎回のように参加させて頂いたり、中でも一番の助けになったのは、、｢Slack｣に入れて頂いたことだと思う。言語に不自由がある私にとってSlackは大きな助けになった。口頭で伝えられない分、Slackにガンガン書き、codeを貼って教えてもらう日々を今でも続いている。このおかげで私の学習は、だいぶスムーズになったと思う。
### Slackとは・・・
　IT企業にお勤めの方なら、よくご存知だと思いますが、チャットアプリの一つです。
## 時には、自分を追い込む
　プログラミング学習の最初の頃は、CoronaSDKと言うプログラミング学習には、ちょうどよい言語で色々勉強したり、作っていたりしたが、それに慣れてからjavaを使ったAndroid開発へ移行した際に、自分一人で学習していくのに限界を感じ、一時期、毎週のように往復２時間を掛けてお世話になった会社に通っていた時期がありました。確かに体力的にきつかったですが｢人生の勝負｣だと思って頑張ってみました。

# 自分が障がいを抱えている故に
　日本人が、今まで来た環境として、多くの方が障がい者になれていないのが現状です。その中において自分が理解していること、信頼してもらえるようになるために、また時には頑張っていることを示すために行ったことをまとめてみました。
### 学習の週報
　この学習プロジェクトが始まった際に、新着を週報でお世話になっている会社のご担当者の方と週報で確認し合うことにしました。内容としては淡々とした内容でしたが｢必ず送る｣事を心掛けました。学習の新着が鈍くてもできなかった理由をきちんと書くようにしました。片手で収まるくらいはお休みをいただいたこともありますが、基本毎週お送りしました。
### イベントに積極的に参加する
　お世話になっている会社やコミュニティが、何らかのイベントや勉強会を開く際は、できる限り行けるよう自分の予定を調整しました。当時は、自分の年次休暇はそのためにあるんだ位の勢いで、予定を調整し、イベントや勉強会に参加させて頂きました。当時私は、土曜が仕事だったときもありまして、その時は朝に自分の業務を最低の範囲ですませて、往復２時間電車に揺られて、イベントに行き、帰りも自分の業務に支障が出ていないか電話等で確認しつつ、家路に戻ることもよくありました。
### 感謝を忘れない
　当然のことですが、どんな時も感謝する気持ちをもってこの学習を行いました。私は、特殊学級というクラスを出たもので、守られてはいたものの勉強は限られていた部分もあり、こうして専門的な事柄を学べることは大きな喜びでした。だからこそ、どんなことでもきちんと感謝しました。

# 学習を約２年ほど行って

### できた事柄
　この期間中にAndroidのアプリを２つリリースすることができた。これらに加えて、プログラミングに必要な調査する方法も少し身につけることができたと思います。まだまだ分からなくて、教えてもらうこともありますが、プログラミングで詰まったときに自己解決が、少しですができるようになりました。

### ステップアップ
　こうした事柄を約２年ほど行いました。私もさらにステップアップしたいと考え、プログラミング学習でお世話になっている会社の代表に就職相談をさせて頂きました。「どこか紹介して頂けないでしょうか」この問いに代表は｢うちに来たら｣と仰ってくださいました。
現在私は、プログラミング学習でお世話になった会社で働いています。
業務内容は、学習していたときよりと異なる部分もありますが、私はこの学習によってプログラミングの基礎を固めることができました。よく友人から違う業務内容で大丈夫なの？？と聞かれることもありますが、基礎ができていればどんなプログラム言語も勉強し、扱っていくことはわりとできると思います。と言いつつもまだまだ勉強の身です。最高の環境が与えられたからこそ、さらに自分をパワーアップしていきたいです。

### 最後に
ここに自分の例を書きましたが、偶然の良さが重なった部分が多いことは、認めざるを得ません。しかし、努力しようと励むときにその道が開けてくると私は思います。「私には無理。」と決めつける方によくお目にかかります。特に障がいを抱えておられると、自分では何もできないように感じるときもあります。私もそういう気持ちになるときもありました。しかし大切なのは努力を辞めないいことです。これからプログラミングの学習を始める人に向けてこの記事を書きました。社会人であれば色々大変だと思います。
でもぜひ、一歩一歩学習を進ませてください。
Docker for Macで起動したKubernetesクラスタ上にprivate registryを作成しアクセスする

この記事ではDocker for Mac Version: [18.06.1-ce-mac73](https://docs.docker.com/docker-for-mac/release-notes/#stable-releases-of-2018)を使っています。

# 背景
Docker for Mac 18.06.0-ceから使用できるようになったKubernetesですが、ちょっとしたアプリケーションなどのイメージをlocalで試したいときに、わざわざDocker HubやGCR, ECRなどのレジストリにプッシュしたくなかったため、local registryを起動してみました。

# 環境
Docker for Mac Version: 18.06.1-ce-mac73
Kubernetes: v1.10.3

# やりたいこと
Docker for MacでデプロイしたKubernetesクラスタ上でregistryを起動し、そこにイメージをpushする。そのイメージをpullして他のpodで使用する。

# Kubernetes上にregistryを用意
下記の`registry.yaml`にあるように
DaemonSetにてregistryのPodを作成し、LoadBalancer Serviceを用いてアクセスする。

```yaml:registry.yaml
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: registry-ds
spec:
  selector:
    matchLabels:
      app: registry
  template:
    metadata:
      labels:
        app: registry
    spec:
      containers:
      - name: registry-container
        image: registry:latest
        ports:
        - containerPort: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: registry-service
spec:
  selector:
    app: registry
  ports:
    - protocol: TCP
      port: 5000
      targetPort: 5000
  type: LoadBalancer

```
上記ファイルを適用し、

```terminal
$ kubectl apply -f registry.yaml
daemonset "registry-ds" created
service "registry-service" created
```
registry-serviceが作成されてることを確認。

```terminal
$ kubectl get services registry-service
NAME               TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
registry-service   LoadBalancer   10.100.223.219   localhost     5000:30124/TCP   1m
```

# registryにアクセスする
curlでアクセスできるが、普通にpushしようとするとできない...

```terminal
$ curl -I localhost:5000
HTTP/1.1 200 OK
Cache-Control: no-cache
Date: Sat, 03 Nov 2018 15:00:00 GMT
Content-Type: text/plain; charset=utf-8
$ docker push localhost:5000/whatever-image
The push refers to repository [localhost:5000/whatever-image]
Get http://localhost:5000/v2/: dial tcp [::1]:5000: connect: connection refused
```
下図の様にDocker for MacのDaemonに `docker.for.mac.localhost:5000`を `insecure registries`に追加する。
<img width="496" alt="Screen Shot 2018-11-04 at 1.10.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/92515/078ecb4b-6979-ab5e-ae45-f515d4ea0802.png">
その上で `docker push docker.for.mac.localhost:5000/whatever-image` すると成功する。

# 参考
- https://github.com/docker/for-mac/issues/1160
Item 23: Prefer class hierarchies to tagged classes

# 23.タグ付きクラスよりクラス階層を選ぶ

## タグ付きクラス
2種類以上の特性を示し、その特性をフィールドに有しているタグで切り替えるクラスをタグ付きクラスと呼ぶ。
以下のクラスはその実例で、円と長方形を表現することが可能である。

```java
package tryAny.effectiveJava;

class Figure {
    enum Shape {
        RECTANGLE, CIRCLE
    }

    // 図形タイプを保持する
    final Shape shape;

    // shape が RECTANGLE の場合だけ利用する
    double length;
    double width;

    // shape が CIRCLE の場合だけ利用する
    double radius;

    // 円のためのコンストラクタ
    Figure(double radius) {
        shape = Shape.CIRCLE;
        this.radius = radius;
    }

    // 長方形のためのコンストラクタ
    Figure(double length, double width) {
        shape = Shape.RECTANGLE;
        this.length = length;
        this.width = width;
    }

    double area() {
        switch (shape) {
        case RECTANGLE:
            return length * width;
        case CIRCLE:
            return Math.PI * (radius * radius);
        default:
            throw new AssertionError();
        }
    }
}
```

このようなタグ付きクラスは欠点がたくさんある。
以下、欠点一覧。

* タグ付きクラスの定型文には、enum、タグフィールド、switchさせる文があり、たくさんの実装が1つのクラスに混ざるので、可読性が落ちる
* 利用している特性に関係ないフィールドも保持せねばならず、メモリ使用量が大きくなる
* コンストラクタが無関係なフィールドも初期化しない限りは、フィールドをfinalとして生成することができない
* コンストラクタでタグフィールドを初期化し、コンパイラの補助なしで正しくフィールドを初期化する必要がある。できないとプログラムは実行時に落ちる
* ソースをいじらない限り、タグクラスに新しい特性を追加することはできない。また、追加したときに、switch文にケースを追加しないと実行時に失敗する
* インスタンスのデータ型がその特性に関して手掛かりを与えてくれない

## タグ付きクラスの代替法：クラス階層
オブジェクト指向言語であれば、クラス階層を用いることで改良できる。

タグ付きクラスからクラス階層に修正する手順としては、

1. abstract なクラスを作成し、その中にタグの値で動作を切り替えていたメソッド(上の例だとareaメソッド)を、abstract メソッドとして定義する
2. タグの値に依存しないメソッド、フィールド値は abstract クラスに入れる（上の例だとそのようなものは無い）
3. タグ付きクラスの特性に当たる部分について、サブクラスを作成する。（上記例だとcircle,rectangle）
4. 特性独自のフィールドを各サブクラスに入れる。（circleならradius、rectangleならlength,width）

上記の修正結果は以下のようになる。

```java
package tryAny.effectiveJava;

abstract class Figure {
    abstract double area();
}

class Circle extends Figure {
    final double radius;

    Circle(double radius) {
        this.radius = radius;
    }

    @Override
    double area() {
        return Math.PI * (radius * radius);
    }
}

class Rectangle extends Figure {
    final double length;
    final double width;

    Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    @Override
    double area() {
        return length * width;
    }
}
```

こうすることによって上記であげたタグ付きクラスの欠点は解消されている。

### その他クラス階層の良い点
クラス階層は、型の間の本来の階層関係について反映できるため、柔軟性を改良したり（？）、コンパイル時のエラーチェックをより良いものにすることができる。

上記例で正方形の型について追加することになったときは、クラス階層の特性を使って以下のように記述することができる。

```java
class Square extends Rectangle {

    Square(double side) {
        super(side, side);
    }
}
```
個人的GANのTipsまとめ#更新途絶中

#はじめに
DeepLearningは今のところ、どのようにしたら上手くいくのかなど、理論的に体系立てて説明するのは難しいようです。そのため、研究者、技術者間ではこうしたら上手くいったよなどのようにノウハウ、テクニックといった形で知識が共有されているといのうが現状ではないでしょうか。
そのDeepLearningモデルの中でもGANは学習が難しいことで知られており、高品質な生成を可能とするためにかなりのノウハウがあり、自分もあまり追えていない状況です。

本記事ではそのGANの学習を改善するテクニック集を網羅的に集めていきたいと思ってます。主に個人的な備忘録のためですが、いい情報がありましたら教えてくださるとありがたいです。

#Tips
参考文献は個々のテクニックの解説論文、記事はできるだけ,トピックの下にリンクをおきます。テクニック集など網羅的にまとめてあるものは[1]のように番号のみをのせて、最後にまとめてリンクを貼ります.


##1 画像は-1~1の範囲に正規化し、Gの出力にTanh()をかける
[1]

##2 ノイズはガウス分布からサンプリングする
[1]
BigGAN(https://arxiv.org/abs/1809.11096) ではTruncation Trickなるものが述べられていて、ガウス分布からサンプリングしてきたノイズがある閾値を超えていた場合、閾値以内に収める処理をする。(生成時のみ。学習時は行わない)
ガウス分布は原点から遠いほどサンプリングされる確率は小さいので、それを切り捨ててしまえば、生成画像の品質は向上すると述べられています。しかし、その分生成画像の多様性とトレードオフになるようです。


##3 BatchNormlizationをつかう
[1]
DCGANはこれを入れることで高品質に成功したという印象です。
BatchNormlizationは内部共変量シフトを取り除くためと言われていましたが、実際はそうではないという[論文](https://arxiv.org/abs/1805.11604)が最近でました。
また[PGGAN](https://arxiv.org/abs/1710.10196)でも共変量シフトを防ぐことは観測されなかったとして、BatchNormは入れていません。
ただ、lossを安定させるなどの効果はでるようで、以前として入れる効果はあるようです。
PGGANはBatchNormの代わりにequalized learning rateとpixelwise future vector normlizationなるものが入っています.

##4 最適化手法はAdamがいい
[1]

##5 生成画像のしましまはDeconvolutionのせい?
GANで画像を生成すると縞模様のようなものが現れる場合がある。
[ここ](https://distill.pub/2016/deconv-checkerboard/)ではそれはDeconvolutionでkerenl_sizeがstrideで割り切れないとき畳み込みの不均一によるものだと述べてある。よってdeconvolutionの代わりにBilinearUpsample+Convにするのが良いらしい。
(kerel_size=4,stirde=2のとき縞模様がでないかは未確認)

##6 正解labelをを1ではなく0.9などにする。
[2]
generatorの勾配が緩いときDiscriminatorが強くなりすぎる傾向があるので正解labelを1ではなく0.9などにすることでDiscriminatorの確信度を低くする狙いがある.またDiscriminatorの入力にある程度ノイズを載せる試みもある
##7 ミニバッチ間の統計量をDiscriminatorの入力に追加する
[2]
GANにはmode collapseと呼ばれるGeneratorが同じような画像しか生成しなくなるという現象がある.
これはGeneratorが本物っぽい画像を1枚だけでも作れれば、それだけでDを騙せてしまうことに起因する。これを防ぐためにminibatchでの統計量(分散など)もDに追加で入力してあげる。これにより,Gが同じような画像ばかりだと本物画像と分散が違いすぎてDを騙せくなり生成画像の多様性が向上する。(minibatch discrimination)
PGGANでは標準偏差を用いたものが使われている。


##参考
[1][参考文献1](https://towardsdatascience.com/gan-ways-to-improve-gan-performance-acf37f9f59b)
[2][参考文献2](https://arxiv.org/abs/1710.07035)

##じっくりと読めていない論文置き場
[a][google brainによるGAN検証](https://arxiv.org/abs/1807.04720)
[b][GANのaugementation](https://arxiv.org/abs/1810.10863)
Node-redのJSonata事例3 〜配列の中身が、一つでも文字列に存在するかチェック〜

前回記事：
第一弾：https://qiita.com/kouichirou/items/5622dcb14ab22441fe27
第二弾：https://qiita.com/kouichirou/items/d58a251eef3e50658f37

#第三弾です
今回やりたいのは
・とある配列の値を一つ一つ取り出して、別の変数（string）の中にマッチするかを調べる
・一個でも存在する(= true）ならば、全体としてtrueを返す。デフォルトはfalse
です。

これ、意外と簡単に出来そうな気もするんですが、~~実はArrayに対して中身を取り出して、何らかの処理を行う関数が用意されていないんです。~~というかまぁ、Mapがあるんですが、Arrayで使えるeachが欲しかったな、、と。。

```
$reduce(
   $map(
       $._somearray
       ,
       function($v) {
           $contains($string($._somestring), $v)
       }
   )
   ,
   function($i,$j){$i or $j}
   ,
   false
)
```
今回は、map、reduceとcontainsを使ってます。
まずはmapで一つ一つ中身を取り出して、それぞれをcontainsして存在有無をチェックします。

このままだと、結果はBooleanの配列（個数は元の配列と同じ）で出てくるので、1個でもtrueがあれば良しとしたい場合はその集約するfunctionノードを作るのがめんどくさいです。

なので、reduceでそれぞれの配列のbooleanをorで積み上げていくことでtrueが1つでもあれば全体としてtrueのみとなり、そうでなければfalseとなるようになっています。


#本家のガイド
mapとreduce https://docs.jsonata.org/higher-order-functions.html#maparray-function
contains https://docs.jsonata.org/higher-order-functions.html#maparray-function

#まとめ

第一回〜第三回までで、
・ある条件に基づき、二つのリストからデータを抽出し（しかも条件次第で検索の内容も異なる）、それぞれ別の配列およびテキストを取得
・その配列の一つ一つがテキスト列に含まれているかを確認
・一つでも含まれている場合はtrueを返す
というそこそこな処理をChangeノード一つで実装出来ました。

こういうデータ処理はJsonataだと短く記述できて良いですね。

（というか、これ3ヶ月したら自分でコード見ても絶対忘れている自身があります。。備忘。。）


ということで、全部見てもらった方は、ありがとうございました。
Android: "adb server is out of date. killing..."

初稿2010/7
#はじめに
adbはserverとclientのversionが食い違っていると、
"adb server is out of date. killing..."を出力して、serverを再起動してしまいます。
同一LAN上に複数のターゲットと1台の共有Linuxサーバがぶら下がっていてみんなで開発したりする場合、共有linuxサーバ上でみんなが起動するadb-clientのversionを合わせるように気をつける必要があります。
このような場合、adbは以下のプロセス構成で動いていて、serverはadb-client起動時に(既に起動していなければ)自動的に起動されます。

```
[ターゲット]              [共有linuxサーバ]          [共有linuxサーバ]
adb-daemon1 -----------¥                 /----------- adb-client1
adb-daemon2 --------------- adb-server -------------- adb-client2
adb-daemon3 -----------/                 ¥----------- adb-client3
```
この対策は単純に(各々localにインストールしたadbではなく)全員が同じadb (例えば/usr/local/toolsにインストールしたadb)を使うように強制すればOKです。

#共有linuxサーバからみんなで使うには
1) ターゲットにselialコンソールで接続してIPアドレスを設定する

```
速度：115200
```
2) 実機のIPアドレス設定

```
# ifconfig eth0 10.61.1.x netmask 255.255.0.0
```

3) 確認

```
# ifconfig eth0
eth0: ip 10.61.1.x mask 255.255.0.0 flags [up broadcast running multicast]
# netstat
Proto Recv-Q Send-Q Local Address          Foreign Address        State
tcp        0      0 127.0.0.1:5037         0.0.0.0:*              LISTEN
tcp        0      0 0.0.0.0:5555           0.0.0.0:*              LISTEN
```

4) 共有linuxサーバからターゲットに接続する

5) 【準備】共有linuxサーバにログインし、.cshrcにpathを追加する

```
$ vi ~/.cshrc
  set path = (. /usr/bin /bin /etc /usr/etc /usr/local/bin /usr/local/tools)
```
上記のようにpath設定に「/usr/local/tools」を追加

```
$ source  ~/.cshrc
```

6) 確認

```
$ which adb
/usr/local/tools/adb
$ adb version
Android Debug Bridge version 1.0.26
```

7) adb-serverにターゲットへの接続情報を登録

```
$ adb connect 10.61.1.x:5555  <--5555はselialコンソールから、netstatで確認したport-no
connected to 10.61.1.x:5555
```
8) 接続情報の確認

```
$ adb devices
"List of devices attached"
"10.61.1.11:5555 device"
"10.61.1.x:5555 device"  <--- "10.61.1.x:5555"がシリアルNo
"10.61.1.6:5555  device"
```
9) 自分のシリアルNoを指定してloginする

```
$ adb -s 10.61.1.x:5555  shell
```
** シリアルNoは環境変数"ANDROID_SERIAL"に設定して使うのが楽かも

```
$ setenv ANDROID_SERIAL 10.61.1.x:5555
$ adb shell
```
#参考
 adbのマニュアル http://www.muo.jp/android16/?developing/tools/adb.html