OmniAICreator/Qiita-1.07M huggingface dataset:
[macOS] SafariのようにWKWebView単位でミュートをかける 最新版 [hack]

### WKWebView単位でミュートをかける

以前 [SafariのようにWKWebView単位でミュートをかける on Qiita](https://qiita.com/masakihori/items/5ffcf35f01373d849561)で紹介した方法の最新版です。

### ややこしいことはしなくて良くなった

前回はシンボルから関数へのアドレスを検索してなど、かなりややこしいことをしていました。:cold_sweat:

しかし、（おそらく）High Sierraから`-[WKWebView _setPageMute:]`メソッドが取り込まれたので、カテゴリを作ってこのメソッドを呼ぶだけでミュートができるようになりました:clap:

でも、やっぱり、ちょっと問題ありです…:disappointed_relieved:

setterはあるのにgetterがない。つまり今どうなっているかという状態は自分で記録しておく必要があります。

### 使用例（実装編）

ご自分で実装するならこんな感じになります。

```objc
@interface WKWebView (WATASHINO_WKWebView_Extension)

@property (getter=isMuted) BOOL muted;

@end 
```

```objc

typedef NS_OPTIONS(NSInteger, _WKMediaMutedState) {
    _WKMediaNoneMuted = 0,
    _WKMediaAudioMuted = 1 << 0,
    _WKMediaCaptureDevicesMuted = 1 << 1,
};

@interface WKWebView (Private_na_API)
- (void)_setPageMuted:(_WKMediaMutedState)mutedState;
@end

@implementation WKWebView (WATASHINO_WKWebView_Extension)

// プロパティ用。_WKMediaMutedStateは隠されている。
- (BOOL)isMuted {
    
    return self.mute != _WKMediaNoneMuted;
}

- (void)setMuted:(BOOL)isMuted {
    
    self.mute = isMuted ? _WKMediaAudioMuted : _WKMediaNoneMuted;
}

// 実際の実装部分
- (void)setMute:(_WKMediaMutedState)mute {
    
    objc_setAssociatedObject(self, mutekey, [NSNumber numberWithInteger:mute], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    
    [self _setPageMuted:mute];
}

- (_WKMediaMutedState)mute {
    
    NSNumber *muteVal = objc_getAssociatedObject(self, mutekey);
    return muteVal.integerValue;
}
@end 
```

`associatedObject`を使用して現在の状態を記録しています。

### 使用例（ぼくのやつ）

[Githubのレポジトリ](https://github.com/masakih/MuteableWKWebView)

こちらは以前の実装と上に書いた実装をframeworkがロードされるときに切り替えるようにして、10.13以前でも使用可能にしています。

ダミークラス（MethodSwizzler）を用意して`+[MethodSwizzler load]` が呼ばれたときに`-[WKWebView _setPageMute:]`メソッドが使えるならば、新しい実装に Method Swizzlingするようになってます。

若干ややこしいです。
Reactアプリケーションの開発ツールRekit

大規模なReactアプリケーションを構築できるというRekitを使ってみたので、その紹介記事です。(記事執筆時のバージョンは2.2.0)

https://github.com/supnate/rekit

まず最初に、以下のようなケースはRekitが向いていないと思いますので、興味がなければサヨウナラしてください。

* 小規模(ReduxやReact-Routerが不要)なアプリケーションを作りたい
* 既存のアプリケーションに導入したい
* ソースコードのディレクトリ構造は垂直分散がいい

# 開発の準備

## インストール

まずはRekitのCLIをインストールします。npm v3以上とNode v6以上が必要だそうです。


```
$ npm install -g rekit
```

## アプリケーションの作成

```
$ rekit create <app-name>
```

* デフォルトではCSSのトランスパイラとしてlessが使用されますが、`--sass`オプションを付けるとsassに変更できます。
* デフォルトではサンプルコードも一緒に作成されますが、`--clean`オプションを付けるとサンプルコードなしにできます。（今回はサンプルコードありで試してみました）

ちなみに `.gitignore`も一緒に作成されているので、このタイミングで `git init` および 初回コミットをするといいかもしれません。

## アプリケーションの起動

指定したアプリケーション名のディレクトリが作成されるので、cdしてinstall&startすれば準備は完了です。

```
$ cd <app-name>
$ npm install
$ npm start
```

開発時には主に以下の2つを使うことになると思います。6077ポートでもビルド結果の確認用サーバが動作していますが、それについては後述します。
(ポート番号はデフォルトのものであり、package.jsonの `rekit.devPort` , `rekit.studioPort` でそれぞれ変更できます)

* `http://localhost:6075` でアプリケーションが動作しています。(webpack dev server)
* `http://localhost:6076` でIDEが動作しています。(Rekit Studio)

IDEが提供されていてブラウザ上でソースの編集を行えますが、使用は必須ではありません。普段使いのエディタ等でソースを編集してもwebアプリケーションおよびIDEにホットに反映されます。

# IDE(Rekit Studio)でできること


## 1. ダッシュボードの表示

画像のようなダッシュボードが表示されます。見にくいですがパイチャートはコンポーネント間の依存を表しています。たとえばどのコンポーネントがどのactionを使用しているかなど。
（雰囲気は出ますが、個人的にはあまり要らないかなぁと思います）

<img width="1287" alt="ss-dashboard.png" src="https://qiita-image-store.s3.amazonaws.com/0/25588/285e4a85-d1fa-d455-8b94-02f4f65fc028.png">


左上の「...」メニューから以下の各種操作が行なえます。

## 2. Featureの追加(actionまたはcomponetのみの追加も可能)

メニューの`Add feature`でcomponent, route, action, reducer, css, test等の一式の雛形が作成されます。
ちなみにディレクトリ構造は水平分散でFeature毎のディレクトリにcomponent, route, action, reducer等一式があるタイプです。
よくある垂直分散のcomponents, actions, reducers等のディレクトリに別れているタイプではありません。

## 3. ソースコードの編集

左ペインにツリー表示されるので、対象のファイルを選択しブラウザ上で編集することができます。(ツリー表示と実際のディレクトリ構造は異なります)
プロダクションコードとテストコードがワンセット(Componentの場合はCSSも)で表示されるので、なかなか開発しやすそうです。

![ss-editor.png](https://qiita-image-store.s3.amazonaws.com/0/25588/41855a17-e8a8-9597-2ef7-1b53700fc860.png)

ただショートカットキーはまだ弱いので、ガッツリ編集するときは別のエディタを使うことになりそうです。

## 4. テストの実行

メニューの`Run tests`でテストが実行され結果が表示されます。ターミナルから `npm run test` でも実行できます。
カバレッジはメニューの`Test coverage`から確認することができます。ちなみに要約版がダッシュボードに表示されます。

![ss-test.png](https://qiita-image-store.s3.amazonaws.com/0/25588/c24fa4ac-8162-9450-840b-4ae2e1448387.png)

![ss-test-coverage.png](https://qiita-image-store.s3.amazonaws.com/0/25588/5abfc135-1b29-d012-1b4d-5987e678055b.png)


## 5. ビルド

メニューの`Build`を押下すると本番用にビルドされたファイルがbuildディレクトリ配下に作成されます。ターミナルから `npm run build` でも実行できます。
`http://localhost:6077` ではビルドされたファイルが使用されている(webpack dev serverを介さない)ので、本番デプロイ前の動作確認が行えます。
また、build/static/report.htmlに webpack-bundle-analyzerの結果が出力されているので、ブラウザで開いて依存モジュールやサイズの確認が行なえます。

![ss-build.png](https://qiita-image-store.s3.amazonaws.com/0/25588/eaa74ea8-70ab-90cd-7df9-1579260f1bb6.png)

![ss-analyzer.png](https://qiita-image-store.s3.amazonaws.com/0/25588/4379d2f7-23e5-0bb4-6a18-884d9a56c7af.png)
nodebrewを使ってnode.jsを使える環境を作る

# やりたいこと
Macのターミナル上で `node` コマンドを実行して、node.jsを動かせる環境を作りたい

# 背景
訳あってnode.js自体を覚えないといけないかも...
という状況になり急いで会社のPCにnodebrew入れたが、
やったことを忘れないように手順をメモ！
>注) nodebrewは、nodeのバージョン管理するものでRubyでいうrbenvのこと


# 手順 : `nodebrew`を入れるところから

1.`nodebrew`をインストールする

以下のURLに記載されたコマンド実行
https://github.com/hokaccha/nodebrew

*インストールするコマンド

```ruby
> curl -L git.io/nodebrew | perl - setup
```


2.`nodebrew`が入ったかを確認

```ruby
> nodebrew -v 

nodebrew 0.9.8 

コマンド実行後にnodebrewのバージョンが表示されたらOK
```

3.`node.js`の最新版をインストールする

```ruby
> nodebrew install-binary latest 

Fetching: https://nodejs.org/dist/v9.5.0/node-v9.5.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully

successfullyが表示されたらOK
```

4.インストールするされたnode.jsを確認する

```ruby
> nodebrew list

v9.5.0

v9.5.0がインストール済みということ
```
5.このままだとnode.jsはあっても、nodeコマンドが実行出来ないので、パスを通す

```ruby
node.jsのパスを.bash_profileに追記

> echo 'export PATH=$PATH:/Users/ユーザー名/.nodebrew/current/bin' >> ~/.bash_profile

追記した内容を反映させるために以下のコマンドも合わせて実行

> source ~/.bash_profile

ユーザー名の部分は自分のPCのユーザー名
```
6.nodeコマンド実行

nodeコマンド実行後 `>` が次の行に表示されてコンソールが起動すればオッケー

```ruby
node
>
併せてconsole.logで値を出力できることも確認
> console.log("hoge");
hoge
undefined

```
なぜthree.jsには単位ベクトルがないのか？

なぜないんでしょう……

## 単位ベクトルとは？
この記事でいう単位ベクトルとは、x, y, zのどれか一要素だけが±1のベクトルのことです。Unityでいう`Vector3.right`, `Vector3.up`, `Vector3.forward`などに相当します。
普通こういったよく使う定数は静的プロパティとして定義されているはずなのですが、three.jsではなぜかそれらしきものが見当たりません(`.add()`などの関数が破壊的になっている設計思想と関係しているのかも)。
なので、作ります。

## ダメな例
一番簡単な方法は`THREE`に定数を直接セットする方法です。

```js
const THREE = require("three");
THREE.X_AXIS = new Three.Vector3(1, 0, 0);
THREE.Y_AXIS = new Three.Vector3(0, 1, 0);
THREE.Z_AXIS = new Three.Vector3(0, 0, 1);
```

`[X,Y,Z]_AXIS`は普通のベクトルのため、以下のようにうっかり破壊的な操作を加えてしまうと大変なことになります。

```js
> THREE.X_AXIS = new THREE.Vector3(1, 0, 0);
< Vector3 {x: 1, y: 0, z: 0, isVector3: true, set: function, ...}
> THREE.X_AXIS.add(new THREE.Vector3(1, 1, 1));
< Vector3 {x: 2, y: 1, z: 1, isVector3: true, set: function, ...}
> THREE.X_AXIS
< Vector3 {x: 2, y: 1, z: 1, isVector3: true, set: function, ...} // 単位ベクトルのはずが...
```

## 提案手法
プロパティを変更できない`Vector3`クラスを作ります。

```js
const ImmutableVector3 = class extends THREE.Vector3 {
    constructor(x=0, y=0, z=0) {
        super();
        this.x_ = x;
        this.y_ = y;
        this.z_ = z;
        this.init_ = true;
    }
    get x() { return this.x_; }
    get y() { return this.y_; }
    get z() { return this.z_; }
    set x(v) { if(this.init_) throw new Error(); }
    set y(v) { if(this.init_) throw new Error(); }
    set z(v) { if(this.init_) throw new Error(); }
}
```

`ImmutableVector3`の`super()`では`this.[x,y,z]`への代入が行われるため、コンストラクタ中(`this.init_`が`true`でない間)は`.[x,y,z]`を参照してもエラーが発生しないようにしています。
このクラスを使って

```js
THREE.X_AXIS = new ImmutableVector3(1, 0, 0);
THREE.Y_AXIS = new ImmutableVector3(0, 1, 0);
THREE.Z_AXIS = new ImmutableVector3(0, 0, 1);
```
とすればOKです。

## 実行例

```js
> const v = new THREE.Vector3(1, 2, 3);
< Vector3 {x: 1, y: 2, z: 3, isVector3: true, set: function, ...}
> v.add(THREE.X_AXIS);
< Vector3 {x: 2, y: 2, z: 3, isVector3: true, set: function, ...}
> THREE.X_AXIS.add(v);
< Error
```
`X_AXIS`を破壊しない操作は普通の`Vector3`と同様に行えますが、`X_AXIS`を破壊するような操作はエラーが発生します。

---
追記(2018/2/16):
`Vector3`の`clone()`ではコンストラクタを使って複製を行うようで、`X_AXIS.clone().add(v)`などとするとエラーとなってしまいます。この場合は`ImmutableVector3`に
`clone() { return new Three.Vector3(this.x, this.y, this.z); }`
を追加すれば解決できます。
docker 18.02でコンテナが起動しないときの対処法

boot2docker(docker toolbox)でコンテナが起動しない現象が発生
`container {hash}: already exists`みたいなエラーがでて再起動してもダメだった(´・ω・`)
自分の環境では以下の手順を実施したら今のところ問題はなくなった
また同じことが起こった時用にメモ

# 手順
1. dockerのバージョンを動いていたときのバージョンに戻す  
   `C:\Users\%USERNAME%\.docker\machine\machines\default`のboot2docker.isoを前のバージョンのboot2docker.isoに変更する
2. 対象コンテナを起動・停止  
   `$ docker start ${コンテナ名}; docker stop ${コンテナ名}`
3. dockerのバージョンを戻す(上げる)  
   1.で変更したboot2docker.isoを18.02のものに変更する


# 参考
これに引っかかった?
https://github.com/moby/moby/issues/36145
Atlassian Confluence の環境を立てる


# 概要
コミュニケーションを履歴で残して、設計書もwikiで書く。そういったモダンな開発スタイルに働き方を変えていきたいので、Confluenceの環境を立てました。
社内では全社Redmineなるものがあるがカスタマイズ皆無だったり使い勝手悪そうだし、逆に使いたくなくなったというのもある。

# バージョンとか
ライセンスはチームの数人で使うなら、1000円で買い切りなのでまぁ自腹でもいいかと
今回は Debian に Confluence の 6.6.2 を入れることにしました

# インストール手順

メディアをダウンロードしてきます

```
# Download sh
wget https://www.atlassian.com/software/confluence/downloads/binary/atlassian-confluence-6.6.2-x64.bin

chmod +x atlassian-confluence-6.6.2-x64.bin

# Execulte 
./atlassian-confluence-6.6.2-x64.bin 

Unpacking JRE ...
Starting Installer ...
Feb 15, 2018 2:12:31 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
Feb 15, 2018 2:12:31 PM java.util.prefs.FileSystemPreferences$2 run
INFO: Created system preferences directory in java.home.
You do not have administrator rights to this machine and as such, some installation options will not be available. 
Are you sure you want to continue?
Yes [y, Enter], No [n]
y ## 1. [Enter] ##
This will install Confluence 6.7.1 on your computer.
OK [o, Enter], Cancel [c]
o ## 2. [Enter] ##
Choose the appropriate installation or upgrade option.
Please choose one of the following:
Express Install (uses default settings) [1], 
Custom Install (recommended for advanced users) [2, Enter], 
Upgrade an existing Confluence installation [3]
1 ## 3. [Enter] ##
See where Confluence will be installed and the settings that will be used.
Installation Directory: /home/hiroyuki_fukui_va/atlassian/confluence 
Home Directory: /home/hiroyuki_fukui_va/atlassian/application-data/confluence 
HTTP Port: 8090 
RMI Port: 8000 
Install as service: No 
Install [i, Enter], Exit [e]
i
Extracting files ...
                                                                           
Please wait a few moments while we configure Confluence.
Installation of Confluence 6.7.1 is complete
Start Confluence now?
Yes [y, Enter], No [n]
y
Please wait a few moments while Confluence starts up.
Launching Confluence ...
Installation of Confluence 6.7.1 is complete
Your installation of Confluence 6.7.1 is now ready and can be accessed via
your browser.
Confluence 6.7.1 can be accessed at http://localhost:8090
Finishing installation ...

```

その後GUIでライセンス入力してうんぬんするが、HTTP 500 Errorでアクセスできなくなる
なぜと思い旧バージョンでインストールしたり試してみたがどれもうまく行かず、
結局ただどPermissionの設定不足でした
[参考](https://ja.confluence.atlassian.com/doc/start-confluence-automatically-on-linux-183148.html)
```
sudo chmod +x /ect/init.d/confluence
sudo /ect/init.d/confluence restart
```

これで再度ブラウザからアクセスすればOK!!
BitZenyのNOMPサーバーを建てる

**自分のブログの記事に書いたのでそちら見てくださいm(_ _)m**
同じこと書くのは辛いので、ごめんな
わからないことはコチラなりブログなりどちらでも質問してもらえば可能な限りで返します

# Wallet
[BitZenyのWalletをインストール[Ubuntu]](http://www.zinntikumugai.com/2018/02/05/-4334-/)
普通にBitZenydを入れるだけですが最新バージョンにすること
**Walletのソースは現在メインで開発している[BitzenyCoreDevelopers](https://github.com/BitzenyCoreDevelopers/bitzeny)を使用してください**

# NOMP
[NOMPでBitZenyのPoolを作る 諦め編](http://www.zinntikumugai.com/2018/02/06/-4345-/)
NOMPのソースでやってみたらだめだったよっていう記事
`yescrypt`の導入に失敗しただけなので他の通貨ならある程度これでできると思います

[BitZenyのNOMPサーバーを作る ReTry](http://www.zinntikumugai.com/2018/02/10/-4363-/)
`zny-NOMP`というBitZenyに対応したNOMPでリトライ
**とってもすんなり行きました**

[BitZenyのNOMPサーバーを作る NOMPのポート設定他](http://www.zinntikumugai.com/2018/02/10/-4373-/)
Twitterで要望を頂きましたので設定関連として書きました

[BitZenyのNOMPサーバーを作る PoolのWebページを80ポートに](http://www.zinntikumugai.com/2018/02/11/-4383-/)
Poolはデフォルトで`8080`ポートを使用しますが(個人的に)URLがみっともないのでNginxを使用してリバースプロキシを噛ましました
これで`http://mining.zinntikumugai.xyz/`のようにアクセスしても問題なくなります(マイニングにはほとんど影響ありません)

# できたPool
[[人のプール]Poolができたので良かったらどうぞ！](http://www.zinntikumugai.com/2018/02/10/-4377-/)
zny-NOMPですがWebUIあたりは多少カスタマイズしたりプルリク送ったりしてます

# 他のPoolツールとNOMP
## MPOS
登録しなくてはなりませんが、一つのアドレスで複数のWorkerを動かすことができるのがメリットでしたが`zny-NOMP`では`アドレス.WokerName`とすると一つのアドレスでも複数のWorkerを動かすことができてしまい少々メリットが薄れてしまってますね...
ただ、選民Poolさんのように**ユーザーを分ける**というときは必須になりますね
個人的には導入が難しい(と言うよりすんなり行かない)イメージがあります(過去にやりましたがその時はできませんでした)

## yiimp
ほぼNOMPと言っても過言ではないと思いたいぐらいほぼ一緒です
NOMPと比べるとしたらNOMPは多数の通貨のマイニングができますがより多くの通貨に対応しているところが多いですね
NOMP同様にアドレスを指定してマイニングを行います

# 表でまとめてみた

| 種類  | 登録 | ユーザー名 | 複数通貨対応 | APIの情報量(public) | 派生 |
|:-----:|:----:|:---------:|:----------:|:------------------:|:-----:|
| NOMP  | なし | アドレス  | 可能       | 多い | z-nomp, k-nomp, zny-nomp, open-nekonium-pool など |
| MPOS  | 必須 | 登録制    | 可能       | 少ない   | - |
| yiimp | なし | アドレス  | 可能       | -     | yaamp → yiimp |

時間があればMPOSやyiimpも触ってみたい

# 小話
## ドメインは必要？
自分の場合は手持ちドメインのサブドメイン`mining.zinntikumugai.xyz/`を使用しました
人によっては今から作るぜって言う人もいるとお思います
個人的意見ですが作成中やベータ公開では無料ドメイン、無料サブドメインでも十分に使えます
本格運用の少し前くらいにPoolの名前とかも噛み合わせながら取得するのもありかと
マイニングする際に特にマイニングする際ははじめ設定してbatファイルなりshellなりに保存してそれを起動させることが多いので
ただ、以前のドメインは多少保持しておかないと知らないユーザーがどう対応するかなどが出てきます

## Poolに必要なマシン
私の場合はNOMPPoolを一つ、bitzenydをMainNet, TestNetを起動させていますが、ConoHaの512Mプランでも十分にできます。ただ、このVPSはスワップが2Gとなっています
海外の格安VPSではスワップを設定しなくては動かないとかそもそもbitzenydのビルドができない(time4vpsでやろうとしましたがスワップの追加ができないためできませんでした。プランはxs)
特にBitZenydの初期同期の読み込みが時間がかかります([ConoHaでCPUが高すぎて止められました](https://twitter.com/uesitananame55/status/959335171748085761))

またWorkerが増えるとどんどんリソースを消費していく傾向にありますので__余裕のある、スペック増強が手軽に行えるようなマシンを用意したほうが良い__と思います

## 何のためにPoolを運営するのか
これが一番重要だと思います
_一番良くないのが作ったのはいいがメンテせずにやめるというもの_
**やるからにはやり遂げてください**
そんな方が運営されるPoolは自然とユーザーは増えていきますよ
今更ながら Ruby on Rails Tutorial をやってみた (その2)

## この記事について…

普段はRuby on Railsと無縁なプログラマなんですが、今更ながら**面白そう**という単純な理由から**Ruby on Rails Tutorial**をやってみようと思い立ちました。今回は[前回の記事](https://qiita.com/hideki0145/items/02aedea80c9940ec447a)の続きで第2章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつVagrantを使用した環境で進めていきます。

## 第2章 Toyアプリケーション

第2章はToyアプリケーションと呼ばれるものを作成していくとのことです。第1章で学んだ知識のおさらいをしつつ、チュートリアルに沿って進めていきましょう。

第1章でBitbucketに`git push`する際にエラーが発生していましたが、新規リポジトリの作成時「Include a README?」項目をNoにしなかった為に発生したと改めて理解しました。READMEは基本的には`Initialize repository`の際に追加しようと心に誓いました。

話は逸れましたが、第2章からはデータベースと連携したRailsアプリケーションの作成が始まります。
Railsでは変数命名の際に**単数形**と**複数形**を使い分ける必要があると噂に聞いていたのですが、チュートリアルの例を見ると確かにモデル名は単数形のような気がするし、テーブル名は複数形のような気がします。
「この単語の複数形ってなんだったっけ…？」と開発中に悩むのは嫌だなぁと思っていたら、Railsでは`active_support`という便利なものを使えるみたいです。

```bash
# irbコマンドを実行してRubyの式を標準入力から実行できるようにする
$ irb
# 外部ライブラリを読み込む
irb> require 'active_support/inflector'
=> true
# 単数形を複数形に変換
irb> 'user'.pluralize
=> "users"
# 複数形を単数形に変換
irb> 'users'.singularize
=> "user"
```

しばらくお世話になりそうな手法です。

さて、第2章のRailsコーディング自体はチュートリアルにわかりやすく手順が記載されているのであまり詰まることもありませんでした。Active Recordが提供する強力な基本クラスのお陰で、データベースへのアクセスが簡単にできる印象を受けますね。

第2章はすんなり終わったなぁ…と余裕ぶっこいていたら、アプリケーションをデプロイするところで嵌りました。

```powershell
$ heroku run rails db:migrate
 !    Missing required flag:
 !    -a, --app APP  app to run command against
 !    See more help with --help
```

なんかアプリを指定しろと怒られているけど、アプリを指定とは何ぞや…？って一瞬固まりましたが、ヘルプを眺めてたら`heroku apps`ってアプリを一覧表示してくれそうなコマンドがあったので事なきを得ました。第1章で既にHerokuにデプロイ済みだった為に、アプリが複数あるから指定してくれっていうことだったんですね。それとは別件でHerokuへのログインも忘れていた…。

ということで、備忘録としてHerokuの簡単な操作を書いておきます。

```powershell
# ログイン
$ heroku login
# ログアウト
$ heroku logout
# アプリ一覧表示
$ heroku apps
$ heroku list # これでもいいみたいです。
# ステータス確認
$ heroku ps -a APP_NAME
# コマンド実行
$ heroku run -a APP_NAME COMMAND
$ heroku run -a APP_NAME bash # bashを起動すると楽な時もあります。
# ログ取得
$ heroku logs
```

その後、Herokuへのデプロイも無事成功して第2章を終えることができました。
Scaffoldの手軽さがわかった一方で、チュートリアルにもある通り何でもかんでも自動で出来て深いところまで理解できなかった感もあります。この点を、次章以降で解消していければいいですね。

それでは、次回 第3章から再開したいと思います。
cocoapods

```
$ sudo gem update --system
$ gem -v
2.7.5
$ sudo gem install cocoapods
 ・
 ・
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/bin directory.
(なんかHigh Sierraだとそうなるのか。/usr/local/binに入れる)
$ sudo gem install cocoapods -n /usr/local/bin
```
【swift4】Data型の任意バイトのみを取り出す

Swiftでローレベルの演算はあまりしないが個人的メモ

```swift
//Data型を宣言
let data = Data(bytes: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
        
//任意(0~5)のバイトを取り出してmapでStringへ変換
let afterData = data[0...5].map { String(format: "%01X", $0) }.joined()
        
print(afterData)
```

```swift:実行結果
012345
```

NFCとかRFIDの書き込み、読み込みなどの参考程度に〜～
pix2pixでAKB総選挙ランキング上位者を線画画像から再現する

#有名なpix2pixの検証
[GANの一種 Keras で pix2pix を実装する。【 cGAN 考慮】ｂｙ　トミーさん](http://toxweblog.toxbe.com/2017/12/24/keras-%e3%81%a7-pix2pix-%e3%82%92%e5%ae%9f%e8%a3%85/)の結果検証をAKB総選挙ランキング上位者の画像を使って実施してみました。

コードは以下に置きました
[MuAuan/pix2pix](https://github.com/MuAuan/pix2pix)

#やったこと
###①img2h5.pyが画像の入ったフォルダからh5pyファイルを生成
最初、yahooから収集した画像はいろいろなサイズのものがあり、読み込みで失敗。Canny関数を勘違いしてサイズ変更しているものと考えていました。一度サイズ変更してやればやれましたが、同じ手間なのでトミーさんのimg2h5.pyを書き換えて入力画像の大きさに依存しないようにしました。
実行は以下のとおりです。
まず、images/にカテゴリ毎にディレクトリを作成して画像を配置しています。
以下を実行すればdatasetimages.hdf5ファイルが作成されます。
`python img2h5.py -i images/ -o datasetimages -t canny`

使い方は以下のサイトを参照してください。 
[tommyfms2/pix2pix-keras-byt](https://github.com/tommyfms2/pix2pix-keras-byt)

※画像はカテゴリ毎に読み込みと合わせて配置してください。　 　
※画像サイズはバラバラでも対応しています、サイズ変更されてしまうので、 　元画像を保存したい場合はあらかじめコピーするか、別途ディレクトリを決めてそこに保存・取得するように変更してください。

###②Trainingは以下で実行
`python pix2pix.py -d datasetimages.hdf5`
 オプションがあるみたいですが、使いませんでした。 上記サイトを参照願います。
出力は時々刻々変化するので、出力ファイルに番号付けました。そして、Weight再利用できるように、出力できるようにしました。

#結果
###③出力はTrainigとValidationの二つがでます
あまり記載されてませんが、このGANは収束がとても速いです。
様子を示すと、以下のとおりです。
因みに約１０００個の画像データ（128x128）に対して１epoch 72secです。
　上段が元画像をCannyした線画
　中段がGenerateされた画像
　下段が元画像 です。
【epoch 0 Training】なんとなく人の絵？？
![current_batch_training0.png](https://qiita-image-store.s3.amazonaws.com/0/233744/7a2b37a9-1db1-1cf9-7a77-d02d29f6c9e9.png)
【epoch 2 Training】ほんとに見えてきました！
![current_batch_training3.png](https://qiita-image-store.s3.amazonaws.com/0/233744/c8f9c612-692d-acf8-f77c-da823d57499e.png)
【epoch 3 Training】もはやそれぞれの似顔絵？
![current_batch_training5.png](https://qiita-image-store.s3.amazonaws.com/0/233744/4ffa80cc-da17-2cb2-ebe2-c0e398935117.png)
【epoch 5 Training】絶対カンニングしてるよ？
![current_batch_training10.png](https://qiita-image-store.s3.amazonaws.com/0/233744/74a3ee7c-96db-3bd3-04cb-b7e475447c50.png)
【epoch 20 Training】。。。
![current_batch_training40.png](https://qiita-image-store.s3.amazonaws.com/0/233744/2e989e9b-7059-3068-e1c6-d2583a4d0f32.png)
【epoch 50 Training】カンニングしても描けない。。
![current_batch_training100.png](https://qiita-image-store.s3.amazonaws.com/0/233744/67453b22-5e7b-ccec-be81-b5ce065f88cd.png)
【epoch 180 Training】元画像に近づいてきた
![current_batch_training361.png](https://qiita-image-store.s3.amazonaws.com/0/233744/e9e040b4-9909-8bb1-e80a-ca02ac082783.png)
【epoch 180 Validation】苦手はあるんだな、でもTestデータ！
![current_batch_validation361.png](https://qiita-image-store.s3.amazonaws.com/0/233744/c42292ce-9f4b-4890-e34f-37ff39806862.png)
【epoch 400 Validation】つまり４００回回した最後のTest。。
![current_batch_validation799.png](https://qiita-image-store.s3.amazonaws.com/0/233744/960deacd-e592-0e3b-1b0e-8d28d0a695fa.png)
#感想とこれから。。
最後、Testデータに対しては、苦手な画像がはっきりしていて、少し安心。でもこれだけ、きれいな絵が得られると、これ使って何やろうかな？？

たとえば、
①普通の風景とか動画からフレームごとの連続シーン入力にして再度動画再作成とか。。そのあと線郭まんがからリアル動画できるね？？
②セルフィッシュ画像を入力にして、似顔絵？返信サービスとか
MacMini(Mid 2007)上のVirtualBoxで稼働させているCentOSの上でdocker経由でSwiftを使う

# はじめに
最近作るスクリプトはperlからpythonに切り替えるなどしているわけですが、ふとSwiftの開発なんかもやってみたいなと思っているカピバラおじさんです。
新しいMacなども欲しいわけで、口座に残っているいい感じの金額を見て「か、買える」と一瞬だけ思ったけれど、これは子カピバラの学費・・・・これに手をつけたら今度こそ・・・・

> 「カピバラ家では粗大ごみを車で持ち込んで処分するんだけど、いつもよりによって一番重いのを出さずに持ち帰ってしまうんだって」
> 「なんで？」
> 「そりゃ、帰りに車を運転する奴がいなくなるからだろ」

はいお客さん、これ、カピバラジョークね、笑うところ。

・・・・笑えない・・・

それでも~~衝動買いの起爆剤のため~~勉強のためにSwiftを触ってみたいという気持ちは変わらず、何らかの形で動かしてみたいと調べてみるとdockerのイメージが提供されているとのことなので、トライしてみることに。

# 環境
手元にあるMacMiniはMid 2007。メモリは増やしているとはいえ、2GB。この上で動かしているVirtualBox上のCentOSへの割り当ては762MB。（おそらく768MBにしたかったんだと思うけど、酔っぱらっていたに違いない）
dockerはインストール済なので、インストールについては割愛。適当にyumしてあげてください。

# dockerでSwiftを使えるようにするまで

## イメージのダウンロード
~~~~
$ docker pull swiftdocker/swift
~~~~
しばらくダウンロード表示が続き、プロンプトに戻る。
確認してみよう。

~~~~
$ docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
docker.io/swiftdocker/swift   latest              466addff05d1        7 weeks ago         1.299 GB
~~~~

## コンテナの作成～起動
ダウンロードしたイメージを利用してコンテナを作成し起動してみる。

~~~~
$ docker run  -i -t --privileged --name swift swiftdocker/swift:latest /bin/bash
root@921f2ed79fe8:/#
~~~~
2行目の表示はdocker上のbashプロンプト。921...は、コンテナID。

## 触り始める前に、やっておいた方がいいこと

<!-- ### CoreFoundationのパーミッション変更
`chmod 644 /usr/lib/swift/CoreFoundation/*`
-->

### vimのインストール
今回使用したイメージにはvimが入っていない。
じゃ、インストールしておこう。

~~~~
# yum install vim
bash: yum: command not found
~~~~
え・・・と、数秒固まったが、そういえばこれはいつものCentOSではなく、ubuntu。慌てず騒がず（←慌ててたじゃん）

~~~~
# apt-get update
# apt-get install vim
~~~~

### exitでコンテナを停止させないために
コンテナ内で`exit`してしまうとコンテナが停止してしまい、次に使う時には`docker start` `docker attach`の2オペレーションが必要になる。再起動を必要とせずに抜けるためには、`[Ctrl]+[P], [Ctrl]+[Q]`で抜けるのが正しいらしい。
このキーアサインを変更することはできるようだが、`exit`で悲しい目に遭うことには変わらない。
どうしよう。
カピバラオヤジは黙ってvimを起動し、`~/.bashrc`に下記のラインを追加。

~~~~
alias exit='echo "to exit, press [Ctrl]+[P], [Ctrl]+[Q]"'
~~~~

これでよし (ｴ ´ ＼

# それでは、おなじみの「あれ」を。

## プロジェクト作成
~~~~
# mkdir myproject
# cd myproject
# swift package init --type executable   # パッケージの初期化
~~~~
これで、下記のようなファイルとディレクトリが作成される。

~~~~
myproject
  ├ Package.swift
  ├ README.md
  ├ Sources
  │   └ myproject
  │       └ main.swift   # とりあえず、これがメインとなるソース
  └ Tests
~~~~

初期状態での`main.swift`は、

~~~~
print("Hello, world!")
~~~~
となっているので、これを

~~~~
print("Hello, Capybara world!")
~~~~
に変更する。（もちろん、全く必要のない変更です）

## コンパイル～実行
~~~~
# swift build
Compile Swift Module 'myproject' (1 sources)
Linking ./.build/x86_64-unknown-linux/debug/myproject
~~~~

これで、myproject直下の`./.build/x86_64-unknown-linux/debug/myproject`に実行モジュールが出来上がり。

~~~~
# ./.build/x86_64-unknown-linux/debug/myproject
Hello, Capybara world!
~~~~

とりあえず、動くようになりました！
Qiita書き方の練習

初めて投稿するにあたり、最低限これだけはという書き方を練習がてら投稿してみます。
こちらの記事を参考にさせていただきました。
[Qiita書き方メモ](https://qiita.com/hiroyuki_hon/items/f2a779bb295fd12646ab)

#見出し
「#見出し」のように#をつけると見出しになるようです。
行頭じゃない部分で # を書いても見出しにならない模様。

#リンク
リンクは、下記のような書き方で書けます。
[ ]内にリンクの文字で、続く ( ) 内にURLを記載。
`[Yahooへのリンク](http://yahoo.co.jp/)`
[Yahoo!へのリンク](http://yahoo.co.jp/)

#コードの挿入
上下に空行、\`\`\`（バッククオート３つ）を挿入。
ruby表記の場合、最初に「\`\`\`ruby:ファイル名」と書けばruby表記にしてくれるみたい。

>
(空行)
\`\`\`ruby:led.rb
led
delay 2000
led
\`\`\`
(空行)

このような表記で、下記のようになる。色付けもしてくれるのがイイ！

```ruby:led.rb
led
delay 2000
led
```

#画像貼り付け
ファイルをドラッグ＆ドロップするだけで貼り付けてくれます。
ただ、２回目から貼り付けられなかったのでなんでかなーと思ったら、投稿していないと容量制限があるようです。こちらを参考に。
[Qiitaに1件も投稿していない時の画像アップロード容量の上限は月間2MBまで]
(https://qiita.com/unsoluble_sugar/items/f61be798972883e44877)

![DancingPlant.jpg](https://qiita-image-store.s3.amazonaws.com/0/207597/647e47ba-0c63-40d2-9e16-7bc174f04f57.jpeg)

このあたりができたら投稿できそうかなーと思いましたので、練習はここまで。
Log4j 2.0を使用してみる

# はじめに
簡単にではありますが、備忘目的でlog4j 2.0 の使用方法を記載します。
小さなJavaアプリを作成する際に使用する為、調査。

# Maven依存関係定義
ライブラリ管理で利用しているMavenにlog4jを追加

```xml:pom.xml
<dependencies>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-api</artifactId>
		<version>2.10.0</version>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-core</artifactId>
		<version>2.10.0</version>
	</dependency>
</dependencies>
```

# 設定ファイル作成
標準出力にログを出力するよう設定。

```:log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE project>
<Configuration status="off">
	<Properties>
		<Property name="format1">%d{yyyy/MM/dd HH:mm:ss.SSS} [%t] %-6p %c{10} %m%n</Property>
	</Properties>
	<Appenders>
		<Console name="Console" target="SYSTEM_OUT">
			<PatternLayout>
				<pattern>${format1}</pattern>
			</PatternLayout>
		</Console>
	</Appenders>

	<Loggers>
		<Root level="trace">
			<AppenderRef ref="Console" />
		</Root>
	</Loggers>
</Configuration>
```

# 実装
ロガーの名称はlookupを使用してコピペするだけで済むようにする。

```java
public class Hoge {
  private static final Logger logger = LogManager.getLogger(MethodHandles.lookup().lookupClass());
  
  public void sayHoge() {
    logger.info("hoge hoge");
  }
}
```
Unity チュートリアル 01: Play & Edit Mode 日本語意訳 + α


Unity のチュートリアルをやったので、せっかくなので自分で訳してみようと思います。
間違っていたら編集リクエスト等で教えてくださると助かります。

## バージョン
`Unity 2017.3.1f1`

## チュートリアルの始め方
Unity 起動 → 「Learn」タブ→「01: Play & Edit Mode」
Download ボタンを押してしばらく待つと Start ボタンになるので、それをクリックするとプロジェクトが開く。

***

## 日本語訳

### P1
さあ、Unity でのゲーム作りを学ぼう！

* ゲームを修正して
* それを実際にプレイしてテストしてみる

っていう手順で進んでいくよ。

これを繰り返していくことで、実際のゲーム作りを学んでいこう！

（注：Start ボタンを押すと次に進みます）

***

### P2
今、ハイライトされていてこの文章が表示されているのが「チュートリアルウィンドウ」。指示とか情報とかを表示するウィンドウだよ。

チュートリアルウィンドウの右上の家のマークは「ホームボタン」。チュートリアルの選択画面を開けるよ。

その隣は「リスタートボタン」。もう一回やり直せるドン！

右下の Next って書いてあるボタンを押すと先に進むよ。押してみてね。

***

### P3
今ハイライトしたのが**「シーンビュー」**。

ここからゲームが作り出されるよ。シーンビューは、ゲーム世界のすべてのモノを詰め込んだ箱みたいなもんさ。

そして今は、この箱の中にゲームが1つ用意されている。

シーンビューを使って、見たり編集したりするよ。

***

### P4
今ハイライトしたのが**「ゲームビュー」**。

プレイヤーがゲームをプレイしたときの画面が見られるよ。そして、実際にテストプレイができるんだ。

***

### P5, 6
**実践**

* 画面上中央の再生ボタンを押して、ゲームをプレイしてみよう！ Play Mode になるよ。
* WASD か矢印キーでキャラクターを移動させてみよう。Escape でリセットもできるよ。
* 青い矢印が出ているところまで進めばクリア！

クリアしたら、再生ボタンを押してテストプレイを終了しよう。

***

### P7
今回は次のことを学んだよ。

* Unity でのテストプレイのやり方
* Edit Mode と Play Mode の変え方
ログインが楽しくなる！screenfetchを使ってCentOSで遊んでみた

**screenfetch**とは、Linuxのディストリビューションのロゴをアスキーアートで表示させてくれるものだが、今回はそれを使い、ログイン時に複数のパターンがランダムに出るようにして遊び心を加えてみた。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/235933/7ef18adc-0d3f-52a2-44d6-830865994be0.png)



##ロゴ紹介
今回は以下のロゴを使用する。オプションをつけることで、例のようにそれぞれ表示することが出来る。

```screenfetch -D 'CentOS'```
![cent.PNG](https://qiita-image-store.s3.amazonaws.com/0/235933/0be088d2-24da-c133-bcbb-3b8d078ff568.png)

```screenfetch -D 'Red Hat Linux'```
![rethut.PNG](https://qiita-image-store.s3.amazonaws.com/0/235933/77bc7fcf-af73-a4c2-9354-c0fe364a39ac.png)

```screenfetch -D 'Mandrake'```
![hosi.PNG](https://qiita-image-store.s3.amazonaws.com/0/235933/2bdf73b5-4374-08ca-918a-d76926fd495d.png)

```screenfetch -D 'Fedora'```
![fedora.PNG](https://qiita-image-store.s3.amazonaws.com/0/235933/80c88f73-fdc0-758d-01a7-0bae174a889e.png)

```screenfetch -D 'pentax'```
![pengin.PNG](https://qiita-image-store.s3.amazonaws.com/0/235933/9ed46713-71cb-d4fe-73a1-0ff0684d0a9c.png)

他にもロゴは沢山ある。気になる人は調べてみよう。

##インストール方法
以下の順でインストールする

```
$ wget https://raw.githubusercontent.com/KittyKatt/screenFetch/master/screenfetch-dev

$ su -

# cp screenfetch-dev /usr/local/bin/screenfetch

# chmod 755 /usr/local/bin/screenfetch
```

##設定
使用するユーザーのhomeディレクトリにある```.bashrc```ファイルに下記を追記。
乱数を応用し、ログインする度に、コマンドがランダムに実行されるようにする。

```bash:.bashrc
SCREEN=$(echo "$(($RANDOM % 5))")

if [ "${SCREEN}" = "0" ]; then
     /usr/local/bin/screenfetch -D 'CentOS' 
elif [ "${SCREEN}" = "1" ]; then
     /usr/local/bin/screenfetch -D 'Red Hat Linux'
elif [ "${SCREEN}" = "2" ]; then
     /usr/local/bin/screenfetch -D 'Mandrake'
elif [ "${SCREEN}" = "3" ]; then
     /usr/local/bin/screenfetch -D 'Fedora'
elif [ "${SCREEN}" = "4" ]; then
     /usr/local/bin/screenfetch -D 'pentax'
fi
```

##確認
以下のコマンドを入力して確認。無事、実行できれば成功。

```. .bashrc```

これで次回以降から、ログインする毎にランダムに表示される
[備忘録]2D&3Dスマホゲーム入門　part1 　軽く復習も。

##3Dプロジェクトでの操作
**1.視点のズームイン・アウト**
　マウスホイールで奥に回すと拡大、手前に回すと縮小。
**2.視点の水平移動**
　マウスホイールクリックしたままドラッグ。
**3.視点の回転**
　「alt」押したままドラッグ。
**4.OBの移動**
　ヒエラルキーで動かしたいOBを選択。ツール左から２番め（✚）を選択。回転はツール左から３番目。
**5.OBの拡大縮小**
　ツール左から４番目を選択。拡大縮小したい方向に伸ばす。
**6.プロファイラ**
　Gameシーン右上にある「Stats」を選択。FPSや描画ポリゴン数、バッチ数、ドローコール数などを確認できる。3Dゲームで処理が極端に重くなる場合の解析などに使う。より詳しいのを見たいときはWindow→Profilerで確認できる。

---
代入には「=」を１つでいい。

```csharp
int age;
age = 30;
Debug.Log(age);
```
出力結果 30

左辺と右辺が等しいときは「==」。

if文→真のときの処理のみ

```
if(条件式)｛
   処理
｝
```

if-else文→真と偽のときの処理

```
if(条件式){
    処理A
}else{
    処理B
}
```

if・else-if文→if文を追加するときに使う

```
if(条件式){
    処理A
}else if(条件式){
    処理B
}else{
    処理C
}
```

**変数は宣言した行を含む{}内でしか使えない。これを【変数のスコープ（使える範囲）】という。**
わかりやすく考えると、同じ関数内では、**同じインデントされた行内でしか使えない**。


**配列の宣言**

```csharp
int[] points = new int[5];
```
「new」は「作る」に近い意味。
配列に値を代入したり、取り出したりするときは次のように番号を指定してやる。

```csharp
points[2]
```
これは３番目の値を取り出している。２番めじゃないので注意。

配列を書くときは、

```csharp
int[] array = new int[5];

array[0] = 2;
array[1] = 10;
array[2] = 5;
array[3] = 15;
array[4] = 3;

for(int i =0; i < 5; i++){
    Debug.Log(array[i]);
}
```
となるが、簡易的に書く方法として、

```csharp

int[] array ={2, 10, 5, 15, 3};
```
と書く方法もある。これは要素数が事前にはっきりしている場合に使える。

ちなみに、**「配列型の変数名.Length」**で、配列の長さを取得することもできる。

```csharp:要素の値を全て足したいときの式
void Start () {
        int[] points = { 56, 34, 87, 12, 91 };

        int sum = 0;
        for (int i = 0; i < points.Length; i++){
            sum += points[i];
        }
        Debug.Log(sum);
	}
```

**C#では整数同士の割り算をしたときに、小数点以下が切り捨てられる。なので裏技として、最初に「1.0f」を掛けてやる。**

```csharp
float average = 1.0f * sum / points.Length
```

**引数も返り値もない関数**

```csharp
void SayHello()
    {
        Debug.Log("Hello");
    }

	// Use this for initialization
	void Start () {
        SayHello();
	}
```

**引数のある関数**

```csharp
 void CallName(string name)
    {
        Debug.Log("Hello" + name);
    }

	// Use this for initialization
	void Start () {
        CallName("Tom");
	}
```

**引数も返り値もある関数**

```csharp
 int Add(int a, int b)
    {
        int c = a + b;
        return c;
    }
	// Use this for initialization
	void Start () {
        int answer;
        answer = Add(2, 3);
        Debug.Log(answer);
	}
```

**関数を実行した後は、関数の呼び出し部分が返り値に置換されるイメージ。**
つまり、「answer = c;」　となり、answerにcを代入していると考えていい。
GitLab CIでビルドの結果をテストに引き継ぐ方法 [http対応]

# はじめに
GitLab CIでせっかくbuild、testのステージに分けたのにbuildの結果がtestに引き継がれずになんでや！ってなったことありませんか？ありますよね。少なくとも僕はあった。
テストのジョブごとに毎回ビルドして貴重な電力を消費してしまうのは心が痛みます。

ということで、docker-in-docker (dind)というぱっと見だと頭の悪そうな構成で解決できるようだったのでメモしておきます。

# やり方

GitLab Runnerとかの設定は一通り済んでいるものとして話を進めます。

1. Docker Container Registry の設定を行い、ビルドした結果のイメージを保存してテスト時にそのイメージをpullして状態を引き継げるようにする。
2. GitLab Runner の設定
2. `.gitlab-ci.yml`の設定

以下、だいたいのことは
[Using Docker Build - GitLab Documentation](https://docs.gitlab.com/ce/ci/docker/using_docker_build.html)
を参考にしています。

## Docker Container Registry を使う

[GitLab Container Registry - Qiita](https://qiita.com/masakura/items/802f4b8ce322d2543c80)
こちらの記事によくまとまっているので、これを読んで設定すれば大丈夫なはずです。

## GitLab Runner の設定
GitLab Runnerの登録は

```bash
sudo gitlab-runner register
```
で行い、`executor`には`docker`、デフォルトのイメージは`docker:latest`などとしておきます。

その後`/etc/gitlab-runner/config.toml`を編集し、

```
privileged = false
```
となっているのを

```
privileged = true
```
に変更し、特権モードで動作するようにしておきます。
dindの構成は特権モードでないと動作しないようです。

次に、これは必須ではないのですが

```
environment = ["DOCKER_DRIVER=overlay2"]
```
を`[[runners]]`の項に追加しておきます。
詳しいことはよく分かりませんが、これを指定しておくと無駄なディスクアクセスが行われなくなるようです（参考：[Using the OverlayFS driver](docs.gitlab.com/ce/ci/docker/using_docker_build.html#using-the-overlayfs-driver)）。

## `.gitlab-ci.yml`の設定
下みたいな感じで設定してあげると良い感じになると思います。

```yml
image: docker:latest
services:
- docker:dind

variables:
  CONTAINER_TEST_IMAGE: registry.example.com/my-group/my-project/my-image:$CI_COMMIT_REF_NAME

before_script:
  - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.example.com

build:
  stage: build
  script:
    - docker build --pull -t $CONTAINER_TEST_IMAGE .
    - docker push $CONTAINER_TEST_IMAGE

test1:
  stage: test
  script:
    - docker pull $CONTAINER_TEST_IMAGE
    - docker run $CONTAINER_TEST_IMAGE /script/to/run/tests

test2:
  stage: test
  script:
    - docker pull $CONTAINER_TEST_IMAGE
    - docker run $CONTAINER_TEST_IMAGE /script/to/run/another/test
```

ただ、GitLabをhttpで運用している場合、ホスト上でDockerのhttp接続の設定を行っていてもDockerのコンテナ上でhttpのRegistryに接続しようとすると怒られてしまいます。
その場合、

```yml
services:
- docker:dind
```
の部分を

```yml
services:
- name: docker:dind
  command: ["--insecure-registry", "registry.example.com"]
```
と変更すると良いです。
この辺の情報はなかなか見つからなくて、`docker:dind`のイメージをベースにして新しいイメージを作っている情報しか見つからないのですが、`command`でオプションを指定してあげるだけでできました。

# おわりに
この方法はDocker imageのpush、pullで割と時間を食うので、小規模なプロジェクトではあまりよい方法とは言えないです。
ビルドするのに10分くらいかかってしまうくらいのプロジェクトでは良い選択であると思います。
あなたは何派？アイデアを発想する思考タイプについて

自身が考える、アイデアを発想するときの色んな人の思考タイプを5つのカテゴリ別にまとめてみました。

それぞれのカテゴリにおいて、前者は「持続的イノベーション」よりの発想、後者は「破壊的イノベーション」よりの発想が生まれるんじゃないかなと思っています。

もしアイデアを考えるのに行き詰まったら、以下の思考タイプを参考にして異なる視点から発想してみてはいかがでしょうか？

## 1. 「リアリスト」派 vs 「ロマンティスト」派

### 「リアリスト」派
**既に世の中に存在している技術やサービス、問題** からアイデアを発想する

### 「ロマンティスト」派
**今後世の中に登場しそうな技術やサービス、問題** からアイデアを発想する

## 2.「思いつく」派 vs 「思いつかせる」派

### 「思いつく」派
**一つのリソースから相性のよいリソースを見つけて** アイデアを発想する

### 「思いつかせる」派
**異なるリソースを強引に結びつけて** アイデアを発想する

## 3. 「オタク」派 vs 「ミーハー」派

### 「オタク」派
特定のリソースに関心を持ち、その **詳しい知見** の中からアイデアを発想する

###  「ミーハー」派
多様なリソースに関心を持ち、その **広い知見** の中からアイデアを発想する

## 4.「レギュラー」派 vs 「イレギュラー」派

### 「レギュラー」派
**定常的、普遍的な事実** からアイデアを発想する

### 「イレギュラー」派
**一瞬の変化やアノマリー（例外的な出来事）** からアイデアを発想する

## 5. 「クラスター」派 vs 「チェーン」派
### 「クラスター」派
一つのキーワードから **放射状に思考** し、複数のキーワードの関係性をクラスターとして形成する
### 「チェーン」派
一つのキーワードから **鎖状に思考** し、複数のキーワードの関係性をチェーンとして形成する
VagrantでVirtualBox上に立てたCentos7内にVBoxGuestAdditionsをインストールする方法備忘録

最新版のCentos7の公式ボックスにはguest additionsが入っていませんので、それインストールするためのメモみたいなものです。

Centosをインストールするところまでは省略します。

# ホストマシン側
## ゲストマシンに仮想的な光学ドライブを追加してGAイメージをマウントする

画像の感じでポチポチして光学ドライブを追加。
無事追加出来たらGAイメージを指定する。
多分下記にある

```
C:\Program Files\Oracle\VirtualBox\VBoxGuestAdditions.iso
```

![window.png](https://qiita-image-store.s3.amazonaws.com/0/107536/196272be-43b6-1139-e5c1-b17c584b9442.png)


# ゲストマシン側
## 各種パッケージをインストールして再起動
* gcc
* make
* gcc-c++
* kernel-devel
* kernel-headers

```
# yum -y install gcc make gcc-c++ kernel-devel kernel-headers
```

install後に再起動

## 光学ドライブのイメージからVBoxGuestAdditionsをインストールする


### 光学ドライブをマウントする？

正直この作業は理屈がよくわかっていません。

```
# mkdir /media/cdrom/
# mount -r /dev/cdrom /media/cdrom
# /media/cdrom/
# cd /media/cdrom/
# ls -la
total 49573
dr-xr-xr-x. 2 root root      480 Jan 15 13:59 32Bit
dr-xr-xr-x. 2 root root      480 Jan 15 13:59 64Bit
-r--r--r--. 1 root root      763 Nov 28 09:50 AUTORUN.INF
-r-xr-xr-x. 1 root root     6384 Jan 15 13:52 autorun.sh
dr-xr-xr-x. 2 root root      950 Jan 15 13:59 cert
dr-xr-xr-x. 2 root root     2508 Jan 15 13:59 OS2
-r-xr-xr-x. 1 root root     4821 Jan 15 13:52 runasroot.sh
-r--r--r--. 1 root root      449 Jan 15 13:59 TRANS.TBL
-r-xr-xr-x. 1 root root  7300555 Jan 15 13:52 VBoxLinuxAdditions.run
-r--r--r--. 1 root root 16426496 Jan 15 14:53 VBoxSolarisAdditions.pkg
-r-xr-xr-x. 1 root root 16471688 Jan 15 13:59 VBoxWindowsAdditions-amd64.exe
-r-xr-xr-x. 1 root root   268504 Jan 15 13:52 VBoxWindowsAdditions.exe
-r-xr-xr-x. 1 root root 10275944 Jan 15 13:53 VBoxWindowsAdditions-x86.exe
```

### VBoxLinuxAdditions.runを実行する

```
# ./VBoxLinuxAdditions.run
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.2.6 Guest Additions for Linux........
VirtualBox Guest Additions installer
Removing installed version 5.2.6 of VirtualBox Guest Additions...
Copying additional installer modules ...
Installing additional modules ...
VirtualBox Guest Additions: Building the VirtualBox Guest Additions kernel modules.
VirtualBox Guest Additions: Running kernel modules will not be replaced until the system is restarted
VirtualBox Guest Additions: Starting.

```

### 再起動する

以上で入るはず。
CTE と INSERT INTO の組み合わせ

## 正しい書き方

```sql:oracle
INSERT INTO foo
(
    bar
)
WITH buz AS (
    SELECT
        1 AS bar
    FROM DUAL
)
SELECT
    bar
FROM buz
;
```

## 間違った書き方

```sql:oracle
WITH buz AS (
    SELECT
        1 AS bar
    FROM DUAL
)
INSERT INTO foo
(
    bar
)
SELECT
    bar
FROM buz
;
```

## 発生するエラー

### Oracle

``ORA-00928：SELECTキーワードがありません。``
rubyの「％」ってすごくない？？って話

## rubyの「％」ってすごくない？？
ちゃんとドキュメント読めよという話なのですが、
知らなかった&びっくりしたので書き残すことにした。


## %ってなにもの
%はStringクラスのメソッドで
**「string % arg」でstringにargを当てはめた文字列を生成します。**

## 使用例

stringには指示子をいれて使います。
今回は文字列の指示子である**%s**を使います

```ruby
 "みなさん,%s" % 'こんにちは'

=> "みなさん,こんにちは"
```

上記はぱっと見わかりづらいですが「%」はメソッド、「こんにちは」は引数です。
こう書くと少しイメージしやすくなります。

```ruby
"みなさん,%s".%('こんにちは')
=> "みなさん,こんにちは"
```

##### ◆配列でも渡せます
```ruby
"みなさん,%s,%s" % ['こんにちは', 'お元気ですか']

=> "みなさん,こんにちは,お元気ですか"
```

##### ◆ハッシュでも(これ便利)
```ruby
"みなさん,%{hoge},%{fuga}" % {hoge:'こんにちは', fuga:'お元気ですか'}

=> "みなさん,こんにちは,お元気ですか"
```
catkinでユニットテスト走らせるときは、まずcatkin_make run_tests

[gtest - ROS Wiki](http://wiki.ros.org/gtest)を読んでも"Building and running tests"の内容が中途半端でハマったのでメモ。
ROS Wiki通りに進んで行くと"Simple `make`の後に`make test`で動く"ようなことが書いてあるが、テストコードがビルドされずにテスト出来ない状態に陥った。（もしかしたら、設定が悪いのかも？）

そんな時、[catkin_make run_tests と catkin_make test の違い](https://qiita.com/MoriKen/items/f44c5bac509fbaae5513)を発見。この記事によれば、
> cppのテスト(gtest)を使う場合，テストコードを初回ビルドするのにこちらが必須．

とのこと。（なんと・・・）

`catkin_make run_tests`したら意図通り（＆他のサンプル通り）にgtestが動いた。
swift初心者備忘録帳

#①for文の注意点

for文の開始値と終了値はint型を要求されるように思い込んでいたが
実際の中身は配列となっている。

```swift:for文
for i in 1 ... 5 {
    print("Swift")
}
```

の場合
`1...5`
は
`[1,2,3,4,5]`
という解釈の方が正しいと思われる。(正しくはシーケンスというらしい）

そのため以下のようなコードも無事に実行される。

```swift:for文２

let instrument: [String] = ["piano", "violin", "trumpet"]

for playMusic in instrument {
	print(playMusic)
}
```
```swift:for文２（結果）
piano
violin
trumpet
```
上記の通り出力される。
#②viewdidLoad、viewWillAppear等が呼ばれるタイミングについて

```swift:呼ばれるタイミング
viewDidLoad:インスタンス化された直後（初回に一度呼ばれる）
viewWillAppear:表示される直前
viewDidAppear:表示された直後
viewWillDisAppear：遷移する直前
viewDidDisAppear：遷移した直後
```

#③内部引数と外部引数とは

Swift学習時内部引数と外部引数の違いを理解するのに若干時間を必要としました。
関数名を`areaOfTrapezoid`とします。

#④NavigationBarの背景を変えたい
UINavigationBar.appearance().barTintColor = UIColor.White

#⑤TabBarの背景を変えたい
選択時の色変更
UITabBar.appearance().tintColor = UIColor.orange

tabBarの背景色変更
UITabBar.appearance().barTintColor = UIColor.White


#⑥値型と参照型の違い
|型|型|説明|具体的な説明|
|:--|---|----:|-----:|
| 構造体|値型|名前をつけて保存|変数や定数への代入や引数への受け渡しのたびにコピーされる、変更は共有されない。安全に値を扱いたい際に積極的に使用する。|
| 列挙型|値型|同上|同上|
| クラス |参照型 |上書き保存|変数や定数への代入や引数への際にコピーされず、参照が渡されるため、変更も共有される。状態管理などの変更が必要なデータに積極的に使用する。

#⑥インターネット上にあるmp４の再生方法

```:mp4再生方法
let videoURL = URL(string: "https://hoge.mp4")
        let player = AVPlayer(url: videoURL!)
        let playerLayer = AVPlayerLayer(player: player)
        
        self.containerView.layer.addSublayer(playerLayer)
        playerLayer.frame = CGRect(x: 0, y: 0, width: containerView.frame.width, height: containerView.frame.height)
        
        
        playerLayer.frame = self.view.bounds
        self.view.layer.addSublayer(playerLayer)
        player.play()
```

#⑦画面遷移方法
```:Swift
let hogeViewController = self.storyboard?.instantiateViewController(withIdentifier: "Hoge") as! HogeViewController
        hogeViewController.image = image!
        self.present(hogeViewController, animated: true, completion: nil)
```

#⑧【Swift】動画から静止画を切り出して、UIWebViewにサムネイルとして表示
```:swift
http://www.suzukigroup.jp/groupblog/?p=8781
```

#⑧【Swift】カスタムセルを使用する際に注意すること。




<img width="1295" alt="スクリーンショット 2018-04-18 14.33.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/226787/1a565b5d-147e-016a-f1c3-f73dcc27d649.png">


#⑧【Swift】ビルドをしても表示がおかしい。
xcordで`command + shift + k`を試す。

#⑧【Swift】クロージャー内の式
```:swift
let c3 = { (a:Int, b:Int) -> Double in
    b == 0 ? 0.0 : Double(a) / Double(b)
}
print(c3(10,8)) // 1.25

比較の式 ? trueの場合 : falseの場合
```

#⑨【Swift】参考になる記事
webViewのデバッグ方法：https://www.tam-tam.co.jp/tipsnote/html_css/post12114.html

#⑩【Swift】[]のこと。
```
open func boundingRect(with size: CGSize, options: NSStringDrawingOptions = [], attributes: [NSAttributedStringKey : Any]? = nil, context: NSStringDrawingContext?) -> CGRect
```

`[]` となっている部分は配列のように記述できるが、厳密には配列ではなく、Option の値を AND したもの。

NSStringDrawingOptions にあるオプションのそれぞれの実際の定義をみると、以下のようになっていて、

```NSStringDrawingUsesLineFragmentOrigin = 1 << 0```


`[]` を使って複数のオプションを記述した場合は、実際にはこれらを論理演算の AND を取った値が使われるようになっています。

なので、１つだけオプションを設定したいときは、 `[]` を飛ばして値を渡しても構わないという風になっています。

#⑩Staticとは
`static` というのは、インスタンスを作らずにアクセスできるようにするという意味。

今後も僕のような本当の初心者のため、些細な気付きを残していこうと思う。
HSPでポリモーフィズムっぽい何か

偶然見つけたHSPの怪しい動作。

```cpp
#runtime "hsp3cl"

#module A fn
	#modinit
		fn=*pf
	return

	#modfunc pfn
		gosub fn
	return

	*pf
		mes "Aです。"
	return
#global

#module B fn
	#modinit
		fn=*pf
	return

	*pf
		mes "Bです。"
	return
#global

newmod afn,A
newmod bfn,B
pfn afn
pfn bfn
```
nanが出た時のメモ

同じ問題で時間を費やしてしまう可能性のある人（未来の自分を含む）への共有として備忘録

# 学習中にnanが出た
`tfdbg`使えという声も聞こえてきそうですが、結構大きなネットワークだったりするとデバッグ時には部分的に並列で実行していた学習が直列にされるっぽいためnanが実際に出るまで回すのにアホみたいに時間がかかります。

こんな感じのログが出ます。

`For debugging, tfdbg is changing the parallel_iterations attribute of the Enter/RefEnter node "training_1/Adam/gradients/lstm_1/while/mul_5_grad/BroadcastGradientArgs/Enter" on device "/job:localhost/replica:0/task:0/device:CPU:0" from 32 to 1. (This does not affect subsequent non-debug runs.)`

そのためデバッガに頼る前にある程度目星が付きそうな所はそもそも可能性として潰しておきたいというのが現実です。

# sqrt
割りと色んな所で見る $\sqrt x$ です。Tensorflowでは割りと気軽に `tf.sqrt()` なんて書いてしまいますがちょっと気をつける点があります。

まず第一に誰もが思いつくのが（複素数を明示的に扱っている訳ではない場合に）負の数を入れたらダメだということ。
そこでこんな風にしたりします。

```
tf.sqrt(tf.clip_by_value(x, 0, 十分に大きい数値 or np.inf))
```

これで、フォワードプロパゲーションの時は問題ありません。$\sqrt 0$は0です。
しかし問題はバックプロパゲーションの際、$f(x)=\sqrt x$ を微分すると
$\frac{\mathrm{d}f(x)}{\mathrm{d}x} = \frac{1}{2}x^{-\frac{1}{2}} = \frac{1}{2\sqrt x}$
このようになるため $x$ は分母に飛んでいきます。

ここまで来ればお察しかと思いますが、 $x = 0$の時に明らかに問題となります。

前後の繋がりによってどう回避するのが最適かは異なりますので敢えてコードは書きませんが nan や inf と戦っている方は参考にどうぞ。

# 便利でも原理は知っておこう
ここ最近のライブラリの発展は目覚ましく、正直背景知識なんてほとんどなくてもKerasのチュートリアルを適当に触ってあとは入力データとネットワークの中をちょこちょこいじればそれっぽいものができてしまいます。

それはそれで素晴らしいのですが、背景で動いている数学的なロジックはやはり知っていたほうが可能性が圧倒的に広がると思います。というか、そうじゃない機械学習エンジニアが世に溢れて、そういう人たちが一般の認識になってしまって、本当にできる人も含めて買い叩かれてしまう世の中になってしまうと悲しいですよね。

最近それが現実になりつつあるような気がしていて、この記事を見て「なんで微分するの？」という疑問を持つ人も一定数いるような気もしています…
Numpyのargsortの結果を降順で受け取る

`numpy.argsort`にはデフォルトで昇順でしか結果を受け取れません、
また降順にするオプションもありません。そこで今回は降順に結果を受け取る方法を紹介します。

```python:
import numpy as np

x = np.array([3, 1, 2])

print(np.argsort(x))

# array([1, 2, 0])

print(np.argsort(-x))

# array([0, 2, 1])
```
以上です。

# 参考
- [Scipy.org - numpy.argsort](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.argsort.html)

- [DeepAge - NumPyのソート関数np.sortとnp.argsortの使い方](https://deepage.net/features/numpy-sort.html)

- [Qiita - numpyで配列の要素とインデックスを降順に取り出す](https://qiita.com/kaw/items/ba808bcc7b80bf7eb0df)

- [StackOverflow - How to sort in descending order with numpy?
](https://stackoverflow.com/questions/36265930/how-to-sort-in-descending-order-with-numpy/36266307)
mysql データベース 色々

### mysql いろいろコマンド

1,データベースの作成
CREATE DATABASE board_db DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

2,データベースの選択
use board_db;

3,ユーザの作成
GRANT ALL PRIVILEGES ON board_db.* TO board_user@localhost IDENTIFIED BY 'board_pass' WITH GRANT OPTION;

4,テーブルの作成
create table board(
    id int not null auto_increment primary key,
    name varchar(20),
    comment text
)

5,テーブルの構造確認
desc board;

6,データを入力する
insert into テーブル名 (カラム名1, カラム名2, ...)　values  ( '値1', '値2', ...);
insert into board ( name, comment ) values ( 'matsumoto' ,'test' );

7,データを検索する
select カラム名　from テーブル名　where 条件文;
select id, name, comment from board;
例えばid=100のデータだけをとってきたい場合
select id, name, comment from board where id = 100;

8,データを更新する
update テーブル名 set カラム名　= '変更したい値' where 条件文;
update board set comment = 'test2' where id = 1;

9,データを削除する
delete from テーブル名　where 条件文;
delete from board where id = 1;
Azure CLI をバッチで使用する方法

# はじめに
Azure Portal にアクセスして仮想マシンを管理していたのですが、台数が多いと起動停止だけでも手順が少し煩雑に感じられてきました。この記事では Azure CLI 2.0 を使用してどうやったら簡単にパブリッククラウドの必要なときに必要なだけという柔軟なリソースを享受できるのかというのを目的にあれこれ試した備忘録を残しておこうと思います。
__本情報の内容（添付文書、リンク先などを含む）は、作成日時点でのものであり、予告なく変更される場合があります。__

# Azure CLI でバッチ使用するための準備
## Azure CLI でログインするための方法あれこれ
　Azure CLI で自動化するにあたって、ログインする必要があります。いつも自分でコマンドラインを実行できる環境なら問題無いですが、そもそもコマンドラインから管理したい理由は抜け漏れがないようにしたいことと自動化（macOS のAutomaterあたりで実行できたらいいなと考えている）を視野にいれているため、インタラクティブなログインだと都合が悪い。
コマンドラインでIDとパスを渡す方式は2要素認証が設定されていると使用できないため、サービスプリンシパルを使用することにしました。
検討に際してドキュメントを一読するとよいと思います。

## 前提環境
## サービスプリンシパルの作り方
サービスプリンシパルは Azure CLI で作成します。
詳細はマニュアル（[Create an Azure service principal with Azure CLI 2.0](https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest)）を参考にしてください。
作業前に az login しておきます。(コマンド実行結果は適当に伏せ字です。）

```bash
$ az ad sp create-for-rbac --name spuser --password p@ssw0rd
Retrying role assignment creation: 1/36
{
  "appId": "abcdefgh-ijkl-mnop-qrst-uvwxyz12345",
  "displayName": "spuser",
  "name": "http://spuser",
  "password": "p@ssw0rd",
  "tenant": "12345678-90ab-cdef-ghij-klmnopqrstuv"
}
```

サービスプリンシパルに権限付与します。
今回はビルトインのOwnerをアサインしました。ビルトインのロールの詳細はこちらのドキュメント[Built-in roles for Azure role-based access control](https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-built-in-roles) に記載があります。

```bash
$ az role assignment create --assignee abcdefgh-ijkl-mnop-qrst-uvwxyz12345 --role Owner
{
  "id": "/subscriptions/...snip.../providers/Microsoft.Authorization/roleAssignments/...snip...",
  "name": "...snip...",
  "properties": {
    "additionalProperties": {
      "createdBy": null,
      "createdOn": "2018-02-15T10:12:32.6334177Z",
      "updatedBy": "...snip...",
      "updatedOn": "2018-02-15T10:12:32.6334177Z"
    },
    "principalId": "...snip...",
    "roleDefinitionId": "/subscriptions/...snip.../providers/Microsoft.Authorization/roleDefinitions/...snip...",
    "scope": "/subscriptions/...snip..."
  },
  "type": "Microsoft.Authorization/roleAssignments"
}
```

サービスプリンシパルでログインします。

```bash
az login --service-principal --username abcdefgh-ijkl-mnop-qrst-uvwxyz12345 --password p@ssw0rd --tenant 12345678-90ab-cdef-ghij-klmnopqrstuv

[
  {
    "cloudName": "AzureCloud",
    "id": "...snip...",
    "isDefault": true,
    "name": "Microsoft Azure ...snip...",
    "state": "Enabled",
    "tenantId": "...snip...",
    "user": {
      "name": "...snip...",
      "type": "servicePrincipal"
    }
  }
]
```

ログイン完了。具体的な操作はまた今度。

# 参考資料
[Create an Azure service principal with Azure CLI 2.0](https://docs.microsoft.com/en-us/cli/azure/create-an-azure-service-principal-azure-cli?view=azure-cli-latest)

[Built-in roles for Azure role-based access control](https://docs.microsoft.com/en-us/azure/active-directory/role-based-access-built-in-roles)

[Azure CLI 2.0 を使用してログインする](https://docs.microsoft.com/ja-jp/cli/azure/authenticate-azure-cli?view=azure-cli-latest#az_authenticate_azure_cli_logging_in_with_a_service_principal)
ECS -> CloudWatch logsのログをローカルでみる

## なぜ CloudWatch Logs？
ECSやFargateではログドライバとしてawslogsが用意されていて、非常に簡単にCloudwatch Logsへとログを出力できる。

以下はapiコンテナでログをcloudwatch logsに出力するdocker-composeの設定です。

```yaml
    logging:
      driver: awslogs
      options:
        awslogs-group: ecs-api-log
        awslogs-region: ap-northeast-1
        awslogs-stream-prefix: api
```

## やっぱりstaging環境や障害時はtail -fしながら見たいよ！

そんな貴方に朗報です。
[awslogs](https://github.com/jorgebastida/awslogs)と言うものが御座います。

### 1. install 方法
```shell
$ pip install awslogs
```

### 2. 使い方
```shell
$ awslogs get ecs-nginx-log --profile production_logs -S --timestamp -w
```
解説:  

```
awslogs get <ロググループ名> --profile <AWS Profile名> -S timestamp -w
```

|サブコマンド|用途|
|:----|:----|
|groups|CloudWatch Logsのロググループ名を表示|
|streams|CloudWatch Logsのストリーム名を表示|
|get|CloudWatch Logsのストリームに発生したイベントを表示|

|getのオプション|説明|
|:----|:----|
|-w|tail -f|
|-S|ストリーム名を省略|
|--timestamp|ストリームが発生した時間を表示|
|-s|ログの時間範囲指定(開始)|
|-e|ログの時間範囲指定(終了)|

よく使いそうなものはこの辺りですかね。
ASP.NET Core で追加されるjQuery Validation UnobtrusiveのInvalidハック

ASP.NET Coreで新規作成した時に自動生成されるJSのValidationにて、ちょっと躓いたのでメモ。
答えはここにあった。
[jQuery.Validation.Unobtrusiveのsuccess, errorをhandleする方法 #aspnetjp](http://katsuyuzu.hatenablog.jp/entry/2015/03/01/090000)

やりたかったこと
--
クライアントサイドのJS検証がInvalidだった時にScrollTopするアニメーションを実現したかった。
（縦に長い入力Formで、標準の`asp-validation-summary`が一番上にあった場合に、どこでエラーが起きたか分からん！と言われた）

結論から
--
以下のコード

```JavaScript
$.validator.unobtrusive.options = { 
    invalidHandler: function () { 
        //やりたい処理
        //$("html,body").animate({ scrollTop: 0 }, 'normal');
    } 
};
```
を

```C#
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
```

より先に記述。

つまづきポイント
--
[ASP.NET Core × jQuery Validationでエラーを表示する](https://qiita.com/takasan/items/205de7ac4a5f3567d7c6)
この記事では`showErrors`をハックしており、アニメーション処理は実現できました。
がなんか挙動がバギーで、エラーが発生している項目をBlurした際にもアニメーションしてしまったので採用見送り。
また`validator.settings.invalidHandler = ほにゃらら`と記述した場合そもそも動作しませんでした。

以上！誰かの助けになれば！
[厳選版] 特殊フォルダーの場所を素早く開く

# 特殊フォルダーの開き方

[ファイル名を指定して実行]メニュー ( [Windows] + [R] )
のテキストボックスに"shell:表記"のコマンドを入力することで、特殊フォルダーを素早く開ける。

| shell:表記 | フォルダー |
|:--------------|:---------------------------------------------------------------------------------------|
| shell:Startup | 現在のユーザーの［スタート］－［プログラム］－［スタートアップ］フォルダー |
| shell:Desktop | 「デスクトップ」フォルダー |
| shell:SendTo | エクスプローラーの「送る」メニュー |
| shell:ControlPanelFolder | 「コントロール パネル\すべてのコントロール パネル項目」フォルダー |
| shell:ConnectionsFolder | コントロールパネルの「ネットワーク接続」フォルダー |
| shell:Windows | Windowsのシステムフォルダー（デフォルトはC:\Windows） |


[注意]
* "shell:表記" は、すべて小文字でも良い。
* "shell:" 直後は、空白文字を入れてはダメ。

# 参考
* スタートメニューやスタートアップなどの特殊フォルダーの場所を素早く開く
   http://www.atmarkit.co.jp/ait/articles/1401/24/news036.html