OmniAICreator/Qiita-1.07M huggingface dataset:
Vue.jsでアコーディオンの実装が難しい・・・

アニメーションがつけやすいVue.jsではあるけれど、、
アコーディオンの実装で100%よし！って思える実装がいまだにみつからない・・・

もともと、高さをautoではアニメーションしてくれないっていう問題はVue.jsに限ったことではないけれど。

1番理想に近いのはこれ。

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="css,result" data-user="kdydesign" data-slug-hash="VrQZqx" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="Vue.js-transition slideUp/slideDown">
  <span>See the Pen <a href="https://codepen.io/kdydesign/pen/VrQZqx/">
  Vue.js-transition slideUp/slideDown</a> by DY (<a href="https://codepen.io/kdydesign">@kdydesign</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

高さが固定のものであれば、問題ないが、高さが可変するタイプのものだと、
`max-height` の数値の設定が難しい・・・

高さが小さいものだと、すごく早く開いているように感じたり、
指定した高さよりも大きいと、ガクッとなってしまう。。。

何かいい方法を知っていましたら、ぜひご教示ください！！！


## 2019.05.17 追記

ここの書き方が一番シンプルだと思いました。
http://lab.astamuse.co.jp/entry/2018/10/15/154737

`transition` に `@before-enter` みたいに書けるの知らなかった。
複数のAWSアカウントを利用する場合のCodeCommit SSHパスの設定方法

# はじめに

業務で複数のAWSアカウントを扱っており、ソース管理のリポジトリ「CodeCommit」も複数アカウントにまたがったものを並行して使用しています。
そういった場合に「git clone」する際のSSHパス設定をどのように扱えば良いかを整理しました。

# どういった方法があるのか

複数CodeCommitの管理方法を調べてみると、以下のような記事を発見しました。

「複数AWSアカウントのCodeCommitからgit cloneする際のssh設定についての覚書」
https://qiita.com/SpeakEasy/items/e92a494a3f6a5f81a74c

簡単に説明すると、SSHコンフィグに任意のホスト名を定義して、そのホスト名で「git clone」するという方法です。「aws1」「aws2」というホスト名をつけた例が記載されています。

> git cloneする度にHost部分を書き換えるのがちょっと面倒なので、他にもっと良い方法がないか知りたいところ。

たしかにホストの書き換えを毎回するのは面倒ですね。。。

他の方法がないかGitコマンドのリファレンスを見ていたところ、SSHユーザ指定で「git clone」する方法を見つけましたので、その方法を説明します。

# 手順

## CodeCommitのSSH接続手順

こちらは[AWS公式ドキュメント](https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-ssh-unixes.html#setting-up-ssh-unixes-connect-console)に記載がありますので、詳細は省略します。

複数のAWSアカウントのCodeCommitを扱う場合は、公式の手順に従うと「~/.ssh/config」 の記載が以下のようになります。

```sh:~/.ssh/config
# AWSアカウント1
Host git-codecommit.*.amazonaws.com
User A0000000000000000001 #SSHキーID
IdentityFile ~/.ssh/id_rsa

# AWSアカウント2
Host git-codecommit.*.amazonaws.com
User A0000000000000000002 #SSHキーID
IdentityFile ~/.ssh/id_rsa
```

## Git Clone時のSSHパス設定

ホスト名の前に「SSHキーID@」を付けることによって、SSH接続ユーザを指定して「git clone」を行うことが出来ます。

```sh
# AWSアカウント1からgit cloneする場合
git clone ssh://A0000000000000000001@git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test_repo

# AWSアカウント2からgit cloneする場合
git clone ssh://A0000000000000000002@git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test_repo
```

この方法で、それぞれのAWSアカウントのCodecommitにアクセスすることが可能になります。

# おわりに

前述のSSHコンフィグに任意のホスト名を指定し接続時のURLを変更して「git clone」する方法と比べると、SSHコンフィグの内容はシンプルにデフォルトのままとなります。

ただし、「git clone」時のSSHパスを変更しないといけないのは変わりないので、好みの方法を使用すれば良いと思います。

また、SourceTreeを使用する場合も、URL/パスにユーザ名付きのSSHパスを設定することで複数のAWSアカウントのCodecommitを使用することが可能です。
Laravelで"could not find driver"が出たときの対処法

# LaravelからMySQLに接続する
### 環境情報
・PHP 7.1.23
・CentOS Linux release 7.4.1708 (Core)
・MySQL 5.6.39

## "could not find driver"が私を襲う
### 背景
元々sqliteで環境を作っていたが、あまりにサーバの動作が安定しないためMySQLにすることにした。

### これが悲しみの正体である
良く書かれているようなコマンドは叩いた。

```CentOS:Command
yum install --enablerepo=remi php-mysqlnd
```

・・・が全く出来ない。そればかりかずっと以下のエラーが出るのだ。

```PHP:PDOException
could not find driver
```
真っ黒な画面に、そう何度も何度も。

## "php.ini"またお前か
色々試したのだが"php.ini"を直す必要があった。

```PHP:php.ini
# Windows
extension=php_pdo_mysql.dll

# Linux
extension=php_pdo_mysql.so
```

この部分がコメントアウトされていたため動かなかったのだ。
※ちなみに編集した後はApacheの再起動（```/etc/init.d/httpd restart
```）を忘れずに。

意外と設定を忘れてしまう。。。気を付けよう。。。
【HSP】dupptrを使った構造体のような何か

[【上級者向け】プロのHSPerになりたけりゃdupptrを使え](https://qiita.com/ksoft2015/items/e8329f011ec127e73b25)

## 概要
上記記事を見て突発的に思いついたことを実践しただけの記事。

```cpp
#runtime "hsp3cl"

#const global str_t 2
#const global int_t 4 
#define global ctype Person(%1) %tPerson \
	%i=varptr(%1) :\
	dupptr %1_name,%p,16,str_t :\
	dupptr %1_age,%o+16,4,int_t
#define global ctype new@Person(%1,%2,%3) \
	sdim %1,20 :\
	Person(%1) :\
    %1_name=%2 :\
    %1_age=%3

#module
	#deffunc view var p
		Person(p)
		mes "名前:"+p_name
		mes "年齢:"+p_age
	return
#global

#module Program
	#deffunc main
		new@Person(student,"bob",13)
		view student
		new@Person(teacher,"john",30)
		view teacher
	return  
#global
main
```

関数の引数として複数型の複数変数をまとめて渡せるのは素晴らしい。
都度ポインタの定義が必要になるけど、そのまま変数引き継げるなら十分。
モジュール変数みたいにアクセサが必要にならないのは便利。

定義時に変数サイズを細かく指定しておかなきゃならないのが若干ネックになりそうか。

おまけ:モジュール変数版/列挙体&文字列配列版

```cpp
#runtime "hsp3cl"

#module Person __name,__age
	#modcfunc name
		return __name
	#modfunc set_name str _name
		__name=_name: return
	#modcfunc age
		return __age
	#modfunc set_age int _age
		__age=_age: return

	#define new(%1,%2,%3) dimtype %1,5: newmod %1,Person,%2,%3
	#modinit str _name,int _age
		__name=_name
		__age=_age
	return
#global

#module
	#deffunc view var p
		mes "名前:"+name(p)
		mes "年齢:"+age(p)
	return
#global

#module Program
	#deffunc main
		new@Person student,"bob",13
		view student
		new@Person teacher,"john",30
		view teacher
	return  
#global
main
```
```cpp
#runtime "hsp3cl"

#enum global name=0
#enum global age
#enum global PersonLen
#module Person
	#deffunc local initPerson array p,str _name,int _age
		p.name=_name
		p.age=str(_age)
	return
	#define new(%1,%2,%3) dim %1,PersonLen: initPerson@Person %1,%2,%3
#global

#module
	#deffunc view array p
		mes "名前:"+p.name
		mes "年齢:"+p.age
	return
#global

#module Program
	#deffunc main
		new@Person student,"bob",13
		view student
		new@Person teacher,"john",30
		view teacher
	return  
#global
main
```
Railsのform_forについてまとめてみる

Railsの勉強をしているとform_forがよく出てくるのですが、よくよく考えてみるとあまりしっかりと理解できていないことに気が付いたので、一度ここに整理してみようと思います。

---

[Railsチュートリアル](https://railstutorial.jp/chapters/sign_up?version=5.1#sec-using_form_for)では、form_forを以下のように説明しています。

>ユーザー登録ページで重要な点は、ユーザー登録に欠かせない情報を入力するためのformです。
Railsでform_forヘルパーメソッドを使います。
このメソッドはActive Recordのオブジェクトを取り込み、そのオブジェクトの属性を使ってフォームを構築します。

一行ずつ読んでいきましょう。

>ユーザー登録ページで重要な点は、ユーザー登録に欠かせない情報を入力するためのformです。

現代の一般的なWebサイトではユーザ登録機能はほぼ必須であり、そのためにはformをが必要という話ですね。これは問題ないでしょう。

>Railsでform_forヘルパーメソッドを使います。

（Railsで "は" の間違いでしょうか）
formを作成するために、Railsでは`form_for`というメソッドを使うということですね。
このform_forメソッドはHelperで定義されていることも読み取れます。

>このメソッドはActive Recordのオブジェクトを取り込み、

form_forを使うにはActive Recordのオブジェクトが必要ということですね。
これは簡単に言ってしまえば、**モデルが必要**ということができます。
**form_forを使うには、モデルが必要**ということですね。

>そのオブジェクトの属性を使ってフォームを構築します。

モデルの属性に応じたフォームを作るということですね。

---

具体例で整理してみましょう。

例えば、Userモデルがあるとします。

このUserモデルは、`rails generate model`コマンドで生成されたものです。

`rails generate model`コマンドで生成されたモデルは、以下のような継承関係を持ちます。

**Basic Object
↑
Object
↑
Active Record
↑
Application Record
↑
User**

上の説明で、

>このメソッドはActive Recordのオブジェクトを取り込み、

とありましたが、この図を見ればUserモデルがActive Recordのオブジェクトであることがわかりますね。

---

以上をまとめると、
**form_forを使うにはモデルが必要で、form_forではそのモデルの属性に対するフォームを作成する**
ということですね。

---

form_for関連のページ
[Railsチュートリアル](https://railstutorial.jp/chapters/sign_up?version=5.1#sec-using_form_for)
[Railsドキュメント](http://railsdoc.com/references/form_for)
[Railsガイド](https://railsguides.jp/form_helpers.html#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A8%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E7%B5%90%E3%81%B3%E4%BB%98%E3%81%91%E3%82%8B)
[Railsソースコード(GitHub)](https://github.com/rails/rails/blob/477fae3eb3d3b3bfdbe28586fecb8578c0be4721/actionview/lib/action_view/helpers/form_helper.rb#L422)
[WordPress] 初回の記事公開日をカスタムフィールドに残す

# 要件とか
- 公開日時と更新日時を併記したいけど、軽微な修正程度では更新日時を変更したくない。
    - 手動で掲載用の更新日時の指定をしたい
- 記事を更新したら一覧系（HOMEやアーカイブ）の並び順も更新日順にしたい。
    - 更新しない記事もあるのでその場合は公開日時も並び順の条件に加える

という要件で **手動で更新日時を変更するなら「公開日時」を変更すればOK** となるが、公開日時と更新日時を併記する都合上、記事を **初めて公開した日時をカスタムフィールドに保存しておくようにする**。
（カスタムフィールドで掲載したい更新日時を保存する方法の場合、並び順のクエリが複雑になるのがよろしくないという事情もある）
なお、過去に投稿された記事にも対応。

# 保存のロジック
- 初回の公開日時は1回だけ保存されればいい
- 隠しのカスタムフィールドにすることで投稿編集画面から変更できないようにしておく。

なので

1. `save_post` 実行時に
2. 公開済み、予約投稿、非公開の投稿のみ
3. 隠しのカスタムフィールド（`_publish_date`） がなかった場合
4. 公開日時を保存

```php
add_action( 'save_post', 'my_save_post' );
function my_save_post( $post_id ) {
	if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
		return;
	}
	if ( wp_doing_cron() ) {
		return;
	}

	if ( get_post_status ( $post_id ) == 'publish' || get_post_status ( $post_id ) == 'future' || get_post_status ( $post_id ) == 'private' ) {
		if ( empty( get_post_meta( $post_id, '_publish_date', true ) ) ) {
			$publish_date_u = get_the_date( 'U', $post_id );
			update_post_meta( $post_id, '_publish_date', $publish_date_u );
		}
	}
}
```

※過去の投稿は管理画面の投稿一覧の一括編集で投稿を選択して、何も変更せず保存すればOK。

# 表示

カスタムフィールド `_publish_date` をよしなに出力。上の例ではUNIXタイムで保存してるので日時フォーマットは適宜設定。

# 管理画面の投稿一覧
初回掲載日時を出しておきたい場合

参照：[WordPress 管理画面の投稿一覧にカラムを追加してカスタムフィールドの値を出す](https://qiita.com/gatespace/items/199c9995e47d668e0fb0)

```php
add_filter( 'manage_posts_columns' , 'add_publish_date_columns' );
function add_publish_date_columns( $columns ) {

	$new_columns = array();
	foreach ( $columns as $column_name => $column_display_name ) {
		if ( $column_name == 'date' ) {
			$new_columns['publish_date'] = '記事公開日時';
		}
		$new_columns[ $column_name ] = $column_display_name;
	}   
	return $new_columns;
}
add_action( 'manage_posts_custom_column' , 'custom_publish_date_column', 10, 2 );
function custom_publish_date_column( $column, $post_id ) {
	switch ( $column ) {
		case 'publish_date' :
			if ( ! empty( get_post_meta( $post_id, '_publish_date', true ) ) ) {
				echo date_i18n( get_option('date_format') . get_option('time_format'), get_post_meta( $post_id, '_publish_date', true ) ); 
			}
			break;

	}
}
```

現場からは以上です。
AWSのLambdaで動いてるPythonをS3の署名バージョン4に対応させた

# はじめに

今話題のこちら
https://dev.classmethod.jp/cloud/aws/s3-sigv2-abolition/

S3の署名バージョン2に廃止に伴う対応です

慣れ親しんだ東京リージョンは[こちら](https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html#s3_region)を参考にすると、**バージョン 2 および 4**

なので、対応は必須です！

# 前提条件

プログラムはAWSのLambdaで動いています

# 対応方法

基本的にはAWSの言う通りにやればおっけー！
https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version

のはずが、、、

<img width="808" alt="スクリーンショット 2019-03-22 10.24.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/11006/85c95194-0150-3930-346e-d5fbd177e347.png">

**botoデフォルト設定ファイル**！？
`.boto` って事だよね。。。

Lambdaは認識しないんじゃ。。。

## Lambdaで対応するための対応

botoのドキュメントに答えは書いてある！
https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3.html#generating-presigned-urls

```diff
@@ -2,8 +2,11 @@


+ from botocore.client import Config


@@ -25,7 +28,7 @@


-    s3 = boto3.resource('s3')
+    s3 = boto3.resource('s3', 'ap-northeast-1', config=Config(signature_version='s3v4'))


```

## 検証

以下を書いてログ出力

```python
import botocore
botocore.session.Session().set_debug_logger()
```

__ログ内容（色々MASKしてます）__

```
〜
[DEBUG]	2019-03-20T06:20:12.515Z		〜
StringToSign:
AWS4-HMAC-SHA256
20190320T062012Z
20190320/ap-northeast-1/s3/aws4_request
〜
```

aws4_request を行っていることで、署名バージョン4を使っていることが判明
Androidアプリ定期購読のGrace Period（猶予期間）の本番環境結果

##〇概要
Androidアプリ定期購読のGrace Period（猶予期間）の利用方法
https://qiita.com/KIRIN3qiita/items/cc3bcbd48a8891ff506c
の本番環境での結果です。

###・期限の伸び方
Grace Period中のユーザーの有効期限が切れそうになると、1日と2時間伸びる。

###・延長してくれるユーザー数
大体３割の人が猶予期間中に課金再開してくれる。
予想より結構多い。

###・延長回数
7回がMAXの様子（問い合わせでは8回と回答が来たが違うらしい・・・）。
10回伸びているユーザーが0.5%ぐらいいたが、問い合わせではそういうバグもあるとのこと。

###・有効期限は最終的にいつになるのか
本来の有効期限-4時間に戻ることが多かった。
他にも-2時間や１日+2時間などがあり、安定はしていない。

##〇総評
本来停止するはずだった定期購読ユーザーが３割ほど救えるのは相当大きい！！
その人たちは切れたら再開する予定だったかもしれないけど、課金の機会を与えて、シームレスに更新してもらうのはサービス運営側としては重要ですね。
JetBrains エディターの便利な機能まとめ(RubyMineで検証)

##  2時間で使いこなす！JetBrains開発ツール ハンズオン

[これ](https://samuraism.doorkeeper.jp/events/87305)に行ってきました
2時間半とても内容の濃い会でした。お勧めします。
ちなみに私はRubyMineを使っています。

## version upについて
[JetBrains toolbox](https://blog.jetbrains.com/jp/2018/10/09/1294)を使えば勝手に最新版にしてくれる
ちゃんと安定させてからリリースしているから大丈夫とのこと。

※そう言われたので最新verにしたところ、htmlの埋め込みruby部分のみが真緑に全面ハイライトされる謎現象に襲われ、一つ前のversionにしたら戻りました。
個人的にはチョット信用できない、ごめんなさい。。

## macの人が必要な設定
①こうする
<img width="734" alt="Screen Shot 2019-03-22 at 8.17.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/120381/15428515-8adc-2882-29d2-73ebb1022dbd.png">

②U.Sキーボードを入れる

③touch barがある人はfunction keyが常にbarに表示されるようにする
※私は今までtool boxを使っていなかったので、RubyMineを直で入れてます
<img width="662" alt="Screen Shot 2019-03-22 at 9.41.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/120381/acd4a108-342c-e801-acb5-db53f8e6b05d.png">


## 検索系機能
基本的に何かのダイアログが出たら、タイピングをすると検索ができる
例えば`cmd+ 1`でプロジェクトペインへフォーカスを当て、`cmd + n`で新規作成ダイアログが出てきて、htmlやr![uploading-0]()
uby class fileなどの候補が出てくる。そこでタイピングを始めれば絞り込みができる。

## ファイル検索系
`cmd + `
`shift + e` 最近開いたファイル
`shift + cmd + e` 最近編集したファイル
`ctrl + tab` 一つ前のファイルにジャンプ。こっちはEnterを押さなくていいので速い。tabをもう一回押せば２つ前に。

## 選択系
`opt + ↑↓` スコープを判断して、一つずつscopeを拡大して選択してくれる。

## Emmet記法
Live Edit　Pluginが必要
Emmet記法で書いてtabを押すと、htmlが一気に生成される。記法については以下を参照。
https://qiita.com/flag_ryo/items/7ec402eeb4133a26939f

## 空気読む系
`opt + Enter`　でその時に応じて色々なことができる
その時に応じてなので、いろんな場面で試してみると良い。

rubymineだと、stringをシンボルに変えるというものがあったので、その言語特有の動きもしてくれるっぽい。

一番よかったと思うのは、rubyで文字列を書いている時に`opt + Enter`を押し、
`Inject Ranguage`を押し、regexを検索して選択。
するとrubyから正規表現モードに代わり、さらにもう一度`opt + Enter`を押すと、その正規表現を検証するpopupがでるというもの。
すごい。
JsonやSQLも使えそう。

## github系
基本的にrubymineでは、一度addすれば次回からはaddする必要がない。
毎回addしたい場合は、1度目のaddで「今後もaddする？」と聞かれるのでNoと答えれば良い。
`cmd + v` git系operation一覧
commit changes画面で、差分の上の方にある鍵マークをクリックすると、commit画面で直に編集できる。

## change list
これが一番便利
下部のversion controlの部分。

このchange listというのが、IntellJ系の独自機能で、ファイル分けができる。
どう使うかというと、defaultとは別に、「コミットしないもの」というchange listを作成し、そこにcommitはしたくないファイル、ファイルの一部を加えておく。

そうすればcommit時にそれらのファイルは対象にならず、誤ってcommitされることがなくなる。
ローカルテスト用にconfigをいじったりする時に間違って本番に入れてしまった、ということがなくなったり、あとはブランチで作業していたけど、差込が入って別のブランチに移動しなくちゃいけない、という時にstashせずにdefaulではないchange listに逃しておくということもできるとか。

## Docker連携機能
もある。

## JIRAにも繋げる
使ってみたい

## DB系
DBは色付けして本番とテストを分けられる
radonlyにもできる
UPDATE文は、where句がついていない場合、実行すると「本当にいいの？」と警告を出してくれる

## deploy系
スクリプト言語はTool > deploymentで設定すると、変更するたびにサーバーに投げてくれるとのこと。
本番ではもちろん使えないが、stg環境や個人開発では便利そう

## そのほかのJetBrainsアイテム
teamcity を使うとCIのビルドが終わったら通知してくれる

upsource githubで、エディタを使ってコードレビューできるかのようにできる。これも使いたい。

## そのほか　（私はなぜかできないので解決したい系）
`cmd + shift + F12`  Editor最大化
`cmd + F8` ブレークポイントを置く
`ctrl + g` マルチカーソル
クリック後に背景色、文字色を固定させる方法

サイドバーのメニュー項目をクリック後、そのメニューの背景、文字色を固定させるのに躓いたのでメモ。
クリックしたメニュー項目にクラスを付与する考えで、実装できた。
例えば、、以下のrubyコードを

```erb:view/ruby.html.erb
<ul>
  <li><%= link_to 'ホーム', sample_path(sample_id) %></li>
</ul>
```

次のようにcurrent_page?メソッドを使って、書き換える。

```erb:view/ruby.html.erb
<ul>
  <li class="<%= 'sample_selecting' if current_page?(sample_path) %>"><%= link_to 'ホーム', sample_path(sample_id) %></li>
</ul>
```

current_page?(オプション)で指定したURLが、現在表示されていればtrueを返す。
現在sample_pathで表示されるページが開かれていれば、sample_selectingクラスを付与する。
このsample_selectingクラスを用いてcssを書けば、任意に特定のページにのみcssを反映させることができる。

```custom.scss
.sidebar-menu > li.sample_selecting > a {
  color: #fff;
  background-color: #a0a0a0;
}
```

また、別の方法として、jQueryでクラスを付与することもできる。

```js
//現在のページにsampleクラス付与
$(function(){
    $('.sidebar-menu li a').each(function(){
      var $href = $(this).attr('href');
      if(location.href.match($href)) {
        $(this).parent().addClass('sample');
      } else {
        $(this).parent().removeClass('sample');
      }
    });
  });
```

このとき、sidebar-menuはulタグのクラスを意味する。
変数hrefに特定のhref属性を代入。現在位置と合っていれば、sampleクラスを付与する。
このsampleクラスを用いて、cssを上記と同じような形で書けば、任意に特定のページにのみcssを反映させることができる。
pryで入力履歴（histroy）が上手く機能しない

# 事象

`pry`で入力履歴（histroy）が上手く機能しない。

`pry`を起動しそのセッションの履歴は表示できるのだが、以前のセッションの履歴が表示されない。

# 原因

`readline`

ref: https://github.com/pry/pry/issues/1594#issuecomment-474150732

# 対応

`homebrew`で`readline`がインストール完了後に`rbenv`でRubyをインストールする。

`RUBY_CONFIGURE_OPTS`に`--with-readline-dir=$(brew --prefix readline)`を設定する、という記事も見かけるが、現時点（2019-03-22）では上記未設定の状態でもreadlineがあれば勝手にそちらを利用してくれる様になっている模様。

# その他

## とりあえず`.pry_history`に記載されている履歴を見たい場合

```rb
hist --all
```

- `hist`コマンド自体は現在のセッションの履歴のみを表示する仕様
- 以前のセッションを見たい場合は`-a`または`--all`を付与
- 履歴を検索したいなら`-G`または`--grep`で検索
- その他オプションは`help hist`で確認されたし

## とりあえず読み込んで`arrow up`で呼び出せるようにしたい

```rb
Pry.history.load
```

- Rubyの再インストールはできない場合やとりあえず暫定でOKなどの場合に
- pry起動のたびに上記を実行する必要あり
- `.pryrc`に上記を記載しても`arrow up`で呼び出せるようにはならない
python,djangoでのデータのhtmlへの表示方法。（関数編&汎用ビュー編）

python,djangoでのhtmlへの表示方法。（関数編+汎用ビュー編）。
早速関数編からやっていきましょう！

まずは基本から。views.pyに以下のように書き込みます。


```
def 関数名(request):
    context = {
    'test':'これはテストです'
    }
    return render(request, 'アプリケーション名':html名.html', context)
```
html部分に


```
{{ test }}
```
urls.pyに

```
path('使用したいURL', view.関数名, name='使用したい名前'),
```

と書くとcontextリストの中のtestキーが呼び出され、valueである'これはテストです'という文字が表示されます。
<br>
<br>
でも実際にはmodels.pyからデータベースに保存されたデータを表示させるパターンが多いと思います。そんな方はこのように。


```
from .model import モデル名

def 関数名(request)
    context = {
        'test_list': モデル名.objects.all(),
    }
    return render(request, 'アプリケーション名':html名.html', context)

```
<br>
allにするとモデルに登録されているデータがすべて取り出されます。
ここでは説明を省きますが、filterを使って特定のデータだけ取り出すことも可能ですよ。

```
モデル名.objects.all(),
```

<br>
<br>
続いてはhtml側。

```
{% for test in test_list  %}
    {{ test.表示したいモデルのフィールド名 }}
{% endfor %}
```


<br><br>
分割して解説しましょうか。
models.pyからデータベースに保存されたデータが複数あった場合for文を使って1つずつ呼び出しましょうということ。
test_listにモデル名.object.all()が反映されていて、for test部分でそれと一つずつ取り出してるイメージ(を僕は持っています。)

```
{% for test in test_list  %}

{% endfor %}
```
<br>
<br>

testにモデルからのデータが一つずつ送られるわけですが、そのモデルのどのフィールドを表示した以下を以下の書き方で定義することができます。

```
    {{ test.表示したいモデルのフィールド名 }}
```
例えばモデルにtest_1,test_2,test_3というフィールドがあった場合。

```
{{ test.test_1 }}
{{ test.test_2 }}
```
と書くとtest_1フィールドのデータベースに保存されたデータが表示された後にtest_2が表示されますが、test_3は書いてないので表示はされません。
<br>
<br>


今までは関数でやってきましたが、汎用ビューで書き換えるとこうなります。
汎用ビューはクラスを使います。

```
from django.views import generic


　　　　class クラス名(generic.ListView):
　　　　　　 template_name = 'アプリケーション名/使用したいhtml名.html'
            model = モデル名     

```

これだけ！！！！
<strong>これいつも思うけどすごいよね！！</strong>


<br>
urls.pyを

```
path('使用したいURL', views.クラス名.as_view(), name='使用したい名前'),
```
とすることを忘れないでくださいね。

<br>
ちなみにtemplateの名前なんですが

```
モデル名_list.html
```
という名前をhtmlにつけると<br><br>

二行目のtemplate_name部分は無くても動作するので試してみてください。

```
　　　　class クラス名(generic.ListView):
　　　　　　 template_name = 'アプリケーション名/使用したいhtml名.html'
            model = モデル名     
```
<br><br>
templateの中身は、

```
{% for 使用したい名前 in モデル名_list %}
{{ 使用したい名前.使用したいモデルのフィールド名 }}
{% endfor %}
```
で動作します。なにしろデフォルトでモデル名+_listが設定されていて、そのように記載すると色々指定が省略できるんですね。
Git-hookで始める自動テストの第一歩

## テストしてますか？
せっかくテストを作ったのに、それを実行したのはずっと前。
久しぶりに実行してみたらエラー！なぜ？
テスト対象のクラスやメソッドの仕様が変わっていた！

テスト作って満足していませんか？テストを放置していませんか？
せっかくテストを作ったのに動かしていないのでは意味がありません。

しかし人間は完璧ではありません。時が経つと忘れてしまいます。
ではどうするか？自動で動くようにすればいいんですよ。

## Git-hook
ではローカルでテストを動かす仕組みは何かと考えたら、Gitを使っている場合はいいものがあります。
「Git-hook」というものです。
これは特定のGitアクションが発生した時にスクリプトが動く仕組みです。

https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF

フックできるアクションは色々あります。テストを行うタイミングとしてはコミットを打つ時がちょうど良さそうなので、そのタイミングでスクリプトが動くようにしましょう。
スクリプトのサンプルは`.git/hooks`にあります。この中に特定の名前で保存したシェルスクリプトが、特定のタイミングで実行されます。
コミット時に実行したい場合は、スクリプト名を`commit-msg`にします。中身はただのシェルスクリプトなので、この中に実行したいコマンドを入力します。
ちなみにGit for windowsを使っている方でも、普通に実行したいコマンドを入れれば大丈夫です。

Pythonだと、Pytestと呼ばれるモジュールがあり、gitプロジェクトルートで`python -m pytest`を実行すると、すべてのテストが実行されるので、このコマンドを記述しておきます。
すると、コミット時にテストが走り、テストが失敗するとコミットフローが中断されます。なのでテストに合格するまでコミットが打てなくなります。
これで忘れずにテストが動かせますね！！

## まとめ
- テストは動かさないと意味がない。
- しかし動かすのを忘れてしまう。人間だもの。
- だったら自動化させよう！

ありがとうございました。
VCCW のインストールとvargrantのコマンドのメモ

# VCCW
http://vccw.cc/

英語だけどGoogel先生による翻訳をたのべば読めばわかる

## 毎回ハマるところ

> Copy provision/default.yml to site.yml like following.
> 
> ```
> $ cp provision/default.yml site.yml
> ```

ここをfinderでファイルをコピーして
provision/site.yml
にしてしまい、vagrant upしても反映されないという罠

正しくは./site.yml ルートにコピーしないといけない
毎回ハマるわ〜

コマンドでしたらミスらない。はず。

# VCCWで使ったことのあるvargrantのコマンド

## vagrant up 

仮想マシンの起動

## vagrant halt 

仮想マシンの終了

## vagrant provision

## vagrant ssh 

仮想マシンにssh

## vagrant global-status　

仮想マシンの一覧

## vagrant destroy XXXXXX

仮想マシンの削除

## vagrant plugin update

いつも起動するのにエラーになったらとりあえずこれ

# Wordmove

1. vagrant ssh
1. cd /vagrant
1. wordmove pull -d
SELECT文を使いこなして、SQLデータベースから欲しいデータを取り出そう

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているyukako_nishimuraです。

# リレーショナルデータベース
2次元の表みたいなもの。

| id| name | grade |
|:---:|:---:|:---:|
| 1 | Tom | 2 |
| 2 | Jerry | 3 |

# SELECT文
SQLデータベースからデータを検索できます。

    SELECT (DISTINCT) 表示するカラム(, …）　
    FROM　テーブル名
    INNER/LEFT/RIGHT/FULL JOIN 結合するテーブル名 ON 結合条件
    WHERE　検索条件
    ORDER BY ソートするカラム ASC(昇順)/DESC(降順) 
    LIMIT 表示する列数 OFFSET 表示する最初の列番号-1

## 重複を避ける
SELECTの後にDISTINCTをつけると、重複を省くことができます。

## 表示するカラムの指定

| id| name | grade |
|:---:|:---:|:---:|
| 1 | Tom | 2 |
| 2 | Jerry | 3 |
この場合のカラムは、

- id
- name
- grade

の3つ。
全部表示したい場合は、カラムに`*`を指定。

##表の結合の種類
## 内部結合と外部結合
**内部結合**は、結合条件にマッチする列のみを表示します。
つまり結合条件にマッチしない列は、表示しません。

**外部結合**は、片方の表にしか存在しない列も表示します。その場合、もう一方の列は**NULL**で表示します。

| 種類 | 意味 |
|:---:|:---:|
| INNER | 内部結合 |
| LEFT | 左側の表のカラムのみを全て表示する外部結合 |
| RIGHT | 右側の表のカラムのみを全て表示する外部結合 |
| FULL | 両方の表のカラムを全て表示する外部結合 |


## 検索条件

### 検索条件が複数ある場合
    検索条件 AND/OR 検索条件　…

### 数値の比較演算子
| 演算子 | 意味 | 
|:---:|:---:|
| =, !=, <,>,<=,>= | 数値の比較|
| BETWEEN … AND …| 数字が範囲内にある|
| NOT BETWEEN … AND …| 数字が範囲外にある|
|IN(数字,…)|数字のリストに含まれている|
|NOT IN(数字,…)|数字のリストに含まれていない|

### 文字列の比較演算子
| 演算子 | 意味 | 
|:---:|:---:|
| =, !=, <> | 一致、不一致 |
|LIKE, NOT LIKE  | 一致、不一致（大文字小文字を区別しない）|
| IN(…), NOT IN(…) |リストに一致するものがあるかどうか|
|%|LIKE,NOT LIKEで使える。文字列中で使い、0個以上の任意の文字を表現|
|-|LIKE,NOT LIKEで使える。文字列中で使い、1個の任意の文字を表現|

#
GCPUG 鹿児島 × TFUG 鹿児島（合同ゼミ）#6 Session 2：TensorFlow Dev Summit Recap

GCPUG 鹿児島 × TFUG 鹿児島（合同ゼミ）
https://gcpug-kagoshima.connpass.com/event/124260/

# Session 2：TensorFlow Dev Summit Recap

TensorFlow Dev Summitトピック紹介

## 概要

TensorFlow Dev Summit 2019 の中の TensowFlow V2 について復習します。

- YouTube
    - https://www.youtube.com/watch?v=Up9CvRLIIIw
- 公式ドキュメント
    - https://www.tensorflow.org/alpha
    - https://www.tensorflow.org/alpha/tutorials/eager/tf_function
- 藤原さんのプレゼン資料
    - https://speakerdeck.com/shuheif/tensorflow-devsummit-2019-recap

## 自己紹介

藤原 秀平 さん TFUG Tokyo

- 普段はメルペイに努めている
- Google Developer Expert

## Tensorflow V2で大きく変わったこと

- 大きい違い
  - AutoGraph
  - Eager Execution
- 1系と2系は全く違うフレームワーク！
    - **今からやるなら、V2を覚えたほうが良い。**
    - kerasを使用しているなら、それほど変わらない。

## 今日アルファ版がリリースされた

- Eager Execution(define-by-run) by default
- AutoGraph
  - パイソンのステートメントがtensorflow graph
- Cleanup APIs
  - tf.kerasがメインのフレームワークに

## ドキュメント

- Youtube
- Official Document

## 1.0

- 定義された時点では実行されない(define and run　定義してから実行する)

## ディープラーニングに必要なもの

- 微分
  - 勾配降下法のために必要
    - 微分するには、どういう計算がされてきたかという履歴がないとできない
  
- 定義されたものを実行する、としておけば、勾配降下法がそれほど考えなくても実行できる

- 必要なのは
  - 計算の履歴
  - どのように計算されてきたか
  - 微分ができる

### ではあるが

本来は、微分を計算するだけであれば、すべての計算結果はいらないのでは？

## Define and Run, Define by Run

### Define and Run（定義してから実行する）

tensorflowは、今はどちらもできる(1.0でも)

### Define by Run（定義したら既に実行されている）

chainerが走り

## Eager Mode (GradientTape)

GradientTapeの中で実行することで、実行する

v2では、Eager Modeが既定となる

## Eager Modeはすべてを解決するのか？

### Define and Runは、

- 利点
  - パフォーマンスが高い（最初に定義されるので最適化される）
  - Deployのしやすさ
    - Pythonのランタイムに依存しない形で、モデルを動かすことができる
    - モバイル端末で動かしやすい
- 欠点
  - デバッグがしにくい
  - デバッグのしにくいと、実験を早く回せない
    - 大学でやるとChainerが多い
      - プロダクションしなくてもいいので、実験しやすいほうが選ばれる
    - 企業でやるとTensorflowが多い
      - プロダクション重視。（パフォーマンス、ランタイム依存がないほうが良い）


### 理想（v2が目指しているもの）

- デバッグしやすい
- パフォーマンスが高い
- プロダクションしやすい

## Autograph

- Pythonのグラフを、Tensorflowのグラフに変換するものを作りましょう、というものがAutograph
  - 頭に、``@tf.function``をつける
    - ``if`` → ``tf.cond``に変換！
- パフォーマンスが高い
- 有効か無効かは、``tf.executing_eagerly()``で帰ってくる

## すべてがgraphに変換できるか？

- いいえ。ある程度の制限はあります
- ``tf.Variable``は、最初に作られる

## 変更点についてのまとめ

- 普通に使用すると、Eager Modeになる
- 基本的には、``@tf.function``を使う
- 高レベルAPI(tf.keras)を使う場合には、あまり変わらない。
情報処理安全確保支援士 平成28年度春 午後2 問2

#設問1
**(1) UAがDL2以外の場合には"404 Not Found"を返す。**
User-Agent(以下UA)はWebサイトにアクセスするときChromeなのか、FireFoxなのかを通知する情報のことです。
今回UAは標準ブラウザが設定されていましたが、DL2に書き換えられておりDL2を利用し、C&Cサーバと通信を行っていました。
そして、UAを標準ブラウザに変更し、C&Cサーバとの通信を試みるも失敗に終わっているため、C&CサーバはDL2からの通信しか許可していないことが想像できます。
仕組みとしては解答例のようなものになると思いますが、「DL2以外からの通信を拒否する」等の回答でも部分点はもらえていたのかなと思います。

**(2) ①JプロキシのURLフィルタ機能**
**　②JプロキシのRHフィルタ機能**
HTTP(S)通信は必ずJプロキシを通っているため、Jプロキシで何かしらの機能を利用することが想像できます。(それ以外に○○機能と記載があるところがあんまりない)
表1Jプロキシの項目を確認すると複数の機能が提供されており、この設問だと、通信先URL(http://yy.yy.yy.yy/?v1)を制御できそうなURLフィルタ機能と、UAが書いてあるHTTPリクエストヘッダの文字列検査(DL2)を行うRHフィルタ機能を利用すればC&Cサーバへの通信を制御できそうです。

#設問2
**a：DLL**
DLLについてうまく表現ができないですが、試験では以下リンクの知識があればいいかと思います。
[DLLとは](https://wa3.i-3-i.info/word11024.html)
今回だと標準ブラウザでDLLを利用し通常のコードを呼び出す予定でしたが、DLLが横取りされたことにより不正なコードが呼び出されてしまいました。
このような攻撃を**DLLインジェクション**と呼びます。

#設問3
**(1) b：ドライブバイ** 
ドライブバイダウンロード攻撃は、平成29年度秋AP午前問40より「利用者がWebサイトを閲覧したとき，利用者に気付かれないように，利用者のPCに不正プログラムを転送させる。」とあります。
今回、Webサイトのバナー広告に改ざんが行われており、自動的にダウンロードが行われていました。
 
**　c：分割**
200kBの圧縮データを2kBに、**分割**して送信した可能性があります。
フラグメントはNGなのか確認しましたが、MTUサイズ以上のパケットを送信するときに利用する言葉そうなので「分割」がよさそうです。(規格によりますが大体1500バイト位)

**(2) d,e：H社Webメール、Nコラボ、可搬記憶媒体、P社CRMツール(この内2つ)**
「(d)や(c)に格納された情報」とあるため、情報(データ)を格納できるものを探せばよさそうです。
個人的には解答例の中でもNコラボと可搬記憶媒体はわかりやすかったかなと思いました。

#設問4
**f：見直し**
解答例を見れば「なるほど」と思いますが、個人的には中々思いつかないかなーと思っています。

#設問5
**(1) マルウェアからハードディスク内の情報が透過的に見えてしまうから**
表2ハードディスクの暗号化を確認すると、OSからは、ハードディスク内のデータが透過的に見えるとあります。
これをうまく使えば解答例に近い答えが導きだせそうです。

**(2) ①AMのマルウェア定義ファイルが初期化状態に戻る。**
**　②セキュリティパッチが適用前の状態に戻る。**
ブートイメージを読取り専用領域から復元するにあたり、何が初期化されるのかというとブートイメージ作成後以降に更新されたデータです。特にこの問題ではセキュリティ対策が初期化されるとあるため、表2のモバイルPCの概要を確認するとマルウェア定義ファイルと脆弱性修正プログラムのセキュリティ対策機能がタイミングによっては更新されない状態になります。

**(3) 画面などの情報からのデータの窃取**
マルウェア対策を万全に行っていたとしても、画面をキャプチャされていたり、キーボード・マウス操作の情報を窃取されてしまう可能性はどうしても残ります。

**(4) 項目：3**
**　変更後の案：VDIサーバ及び社内LANからのHTTP及びHTTPS通信によるアクセスだけを許可するように設定する。**
図1の1,2についてはログイン回数に関する問題なのであまり関係ありません。この機能は継続して利用していく必要があり変更を行うこともないでしょう。
そうなると項目：3が今回の回答になりますが、現状はモバイルPC利用を前提としたガイドラインになっています。しかし今後はVDIを利用することになるため、クラウドサービスと通信を行うVDIサーバの通信許可をしておく必要があります。
VDI端末が実際の通信を行うわけではないため念のため注意です。
php-master-changes 2019-03-21

今日は filter のビルドシステム修正、不要な hash 拡張チェックの削除、テストの修正、PCRE のバグ修正/リファクタリングがあった！

# 2019-03-21
## KalleZ: Sync the changes to ext/filter with 7.4, now that it works.
- https://github.com/php/php-src/commit/26f98ecd19bac2d8911fe85d4b086b4ff5408e8c
- ext/filter で、--with-pcre-dir を削除し、configure で共有オブジェクトを作れるよう修正

## KalleZ: Remove usage of HAVE_HASH_EXT and COMPILE_DL_HASH as ext/hash is always available (master only)
- https://github.com/php/php-src/commit/e632537c83af5186d4cf3f0dacb3102ef850fb88
- ext/hash が常時ある前提になったので、HAVE_HASH_EXT と COMPILE_DL_HASH を削除

## remicollet: fix test
- https://github.com/php/php-src/commit/5c8d69bf6fde2bbb3d6c168833bc9a70f0a5bc1f
- [7.3~]
- var_export() のテストの修正

## nikic: Fix bug [#73948](https://bugs.php.net/bug.php?id=73948)
- https://github.com/php/php-src/commit/6311581ac64372164de7ba24f086eb3b0b91eabb
- ext/pcre で、preg_match_all() が PREG_UNMATCHED_AS_NULL で使われた際はマッチしなかったキャプチャグループでは null（オフセットキャプチャ有効時は [null, -1]）になるよう修正
- [一昨日](https://qiita.com/sj-i/items/270b829f43894b002f37#nikic-respect-offset_capture-when-padding-preg_match_all-results)の続き

## nikic: Cleanup add_offset_pair API
- https://github.com/php/php-src/commit/621b1f0312a559bce667ccf4be0a346a56e368a2
- ext/pcre で、add_offset_pair() のリファクタ

## nikic: Try to create interned strings in preg_split as well
- https://github.com/php/php-src/commit/1cf84f1579c54233c69a9394a8c02d29e092e32a
- [7.4~]
- ext/pcre で、preg_split() でも interned 文字列を使おうとするよう↑の追加関数を使うよう修正
Shell Script   引数のないオプションとパラメータを共存させる

Bashのプログラムで、引数のないオプションと引数を共存する方法がわからなかったので、整理してみる。

# 現象

実際こうなって欲しかったのだが

```bash
$ ./polling.sh https://qiita.com/koara-local/items/04d3efd1031ea62d8db5
20190321-130653 | 200
20190321-130655 | 200
^C
$ ./polling.sh -i https://qiita.com/koara-local/items/04d3efd1031ea62d8db5
20190321-130700 | 200 | https://qiita.com/koara-local/items/04d3efd1031ea62d8db5
20190321-130702 | 200 | https://qiita.com/koara-local/items/04d3efd1031ea62d8db5
20190321-130704 | 200 | https://qiita.com/koara-local/items/04d3efd1031ea62d8db5
20190321-130705 | 200 | https://qiita.com/koara-local/items/04d3efd1031ea62d8db5
```

実際はこうなった

```bash
$ ./polling.sh -i https://qiita.com/koara-local/items/04d3efd1031ea62d8db5
20190321-125815 | N/A | -i
20190321-125816 | N/A | -i
20190321-125817 | N/A | -i
20190321-125818 | N/A | -i
```

どうやらオプションがパラメータとして認識されている様子。

# 問題の解決

問題は、`getopts` の書き方だった。知らなかったが、`:` が付いているのは、オプションの引数があるこをと示している。だから、今回のアプリは、引数がないので、それを取り除いた。

```bash
while getopts "ih" opt; do 
  case $opt in 
    i)
      hasUrl=true
      ;;
    h) 
      usage
      exit 0
      ;;
    \?)
     echo "Unknown option: -${OPTARG}" >&2
     exit 1
     ;;
  esac
done
```

ただし、これだと、`$1`を参照しても`-i` になるので、`shift`コマンドで$1をシフトさせる。オプションのインデックスから１を引いた分だけシフトさせる。

```bash
shift $((OPTIND -1))
```

# 全体像

```bash
#!/bin/bash

declare -i duration=1
declare hasUrl=""
declare endpoint

usage() {
    cat <<END
    polling.sh [-i] [-h] endpoint
    
    Report the health status of the endpoint
    -i: include Uri for the format
    -h: help
END
}

while getopts "ih" opt; do 
  case $opt in 
    i)
      hasUrl=true
      ;;
    h) 
      usage
      exit 0
      ;;
    \?)
     echo "Unknown option: -${OPTARG}" >&2
     exit 1
     ;;
  esac
done

shift $((OPTIND -1))

if [[ $1 ]]; then
  endpoint=$1
else
  echo "Please specify the endpoint."
  usage
  exit 1 
fi 


healthcheck() {
    declare url=$1
    result=$(curl -I $url 2>/dev/null | grep HTTP/1.1)
    echo $result
}

while [[ true ]]; do
   result=`healthcheck $endpoint` 
   declare status
   if [[ -z $result ]]; then 
      status="N/A"
   else
      status=${result:9:3}
   fi 
   timestamp=$(date "+%Y%m%d-%H%M%S")
   if [[ -z $hasUrl ]]; then
     echo "$timestamp | $status "
   else
     echo "$timestamp | $status | $endpoint " 
   fi 
   sleep $duration
done
```
transform.localEulerAngles と、インスペクタ上（Transform Rotation）で表示されている値違うじゃん。inspector に表示されているとおりに取得したい。



<img width="256" alt="スクリーンショット 2019-03-22 5.16.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/365269/f390427f-3c34-1202-10fd-d400793c5e96.png">

例えば、
(90.0, 0.0, 60.0) を入れると

transform.localEulerAngles
(90.0, 300.0, 0.0)

---

inspector に表示されているとおりに取得したかったので。


#### 環境
* バージョン 2018.3.8f1
* プラットフォーム エディタ上

SerializedObject にして、"m_LocalEulerAnglesHint" というプロパティを読みに行けば、inspector に表示されているとおりの値が取得できました。


---

How to get Euler rotation angles exactly as displayed in the Transform inspector? [SOLVED] - Unity Forum
https://forum.unity.com/threads/how-to-get-euler-rotation-angles-exactly-as-displayed-in-the-transform-inspector-solved.425244/

> それが本当に必要なのであれば、リフレクションを介してm_LocalEulerAnglesHintを取得できます。

...

> トランスフォームインスペクタの回転値を取得するには、C＃リフレクションを使用する必要があると思います。
これは一時的なvector3値のVector3Fieldです。
そのため、選択したGameObjectを取得してTransformInspectorインスタンスを取得し、TransformInspectorのTempフィールド（Vector3）を取得する必要があります。

...

```csharp
SerializedObject serializedObject = new UnityEditor.SerializedObject(transform);
SerializedProperty serializedEulerHint = serializedObject.FindProperty("m_LocalEulerAnglesHint");
Debug.Log(serializedEulerHint.vector3Value);
```
Windows10のWSL(Ubuntu)にPostgreSQLをインストールしたときのメモ

# 手順

まずはPostgreSQLのインストール.

```shell
$ sudo apt update
$ sudo apt install postgresql
```

念のため再起動.

```shell
$ sudo /etc/init.d/postgresql restart
```

(Ubuntuの)ユーザpostgresに切り替える.

```shell
$ sudo -u postgres -i
```

(postgresの)ユーザuserを作る.パスワードを聞かれるが適当に設定する.

```shell
$ createuser -d -U postgres -P user
```

user用データベースuserdbを作る.

```shell
$ createdb userdb --encoding=UTF-8 --owner=user
```

Ctrl+Dを押すなどして(Ubuntuの)ユーザpostgresから元のユーザに戻ってログインできるか確認.

```shell
$ psql -U user -h localhost -d userdb
```

設定したパスワードを入力すればログインできる.
XGBoostのお気持ちをちょっとだけ理解するためのメモ

現在、Kaggleにてよく使われる手法の一つにGBDT(Gradient Boosting Decision Tree)があります。さらにその種類の１つXGBoostはKagglerによりその効果を検証され非常に人気の高いアルゴリズム・実装です。このブログでは、XGBoostの[論文](https://arxiv.org/abs/1603.02754)からアルゴリズムを理解するための主要な部分、
* 2. TREE BOOSTING IN A NUTSHELL
  * 2.1 Regularized Learning Objective
  * 2.2 Gradient Tree Boosting 
を丁寧に解説することを目的に書いています。

また、ここで解説した理論、アルゴリズムについては[LightGBM](https://github.com/Microsoft/LightGBM)においてもほぼ同じと思いますので、合わせて参考になるかと思います。

#### おことわり
しかしながら、最初におことわりをさせていただくのですが、markdownやtexでキレイにまとめる余裕がなかったため、iPadで書いた手書きのメモを暫定的に公開し、markdown化が済んだらまた更新する形とさせていただきます。（Qiita前代未聞の手書き記事？）

PDF版の方が画像が鮮明なので、細かいところを見たい方はこちら[PDF版](https://github.com/matsuken92/matsuken92.github.io/raw/master/XGBoost%E3%81%AE%E3%81%8A%E6%B0%97%E6%8C%81%E3%81%A1%E3%82%92%E4%B8%80%E9%83%A8%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B.pdf)をご参照ください。

![xgboost_001.png](https://qiita-image-store.s3.amazonaws.com/0/50670/8cc0a0fc-d174-879b-b642-f60418125dc5.png)
![xgboost_002.png](https://qiita-image-store.s3.amazonaws.com/0/50670/1ed4068b-3cb9-33f2-4d78-944080b33cb2.png)
![xgboost_003.png](https://qiita-image-store.s3.amazonaws.com/0/50670/749eed78-7e6b-6e87-97ef-7bb1600b72ac.png)
![xgboost_004.png](https://qiita-image-store.s3.amazonaws.com/0/50670/ce5f9fea-af3c-9dec-3c93-205178c2ba48.png)
![xgboost_005.png](https://qiita-image-store.s3.amazonaws.com/0/50670/c3f02406-9846-b5a0-ddbe-f0726cdc017c.png)
![xgboost_006.png](https://qiita-image-store.s3.amazonaws.com/0/50670/9b3687a7-dcfd-345b-798b-d9666f3dfa34.png)

いかがでしたか？少しでもXGBoostやGBDTのお気持ちがわかってもらえたら幸いです。この記事を読んで少しでもためになったと思われた方は「いいね」ボタンやRetweetをお願いします！:wave:

# Reference
* PDF版： [URL](https://github.com/matsuken92/matsuken92.github.io/raw/master/XGBoost%E3%81%AE%E3%81%8A%E6%B0%97%E6%8C%81%E3%81%A1%E3%82%92%E4%B8%80%E9%83%A8%E7%90%86%E8%A7%A3%E3%81%99%E3%82%8B.pdf)
* XGBoost: A Scalable Tree Boosting System https://arxiv.org/pdf/1603.02754.pdf
* XGBoost githubリポジトリ https://github.com/dmlc/xgboost
* ともにゃん的データ分析ブログ XGBoostの概要 http://kefism.hatenablog.com/entry/2017/06/11/182959
Node.jsで古いパッケージを一気に更新する

## 背景
material-uiを使おうと思ったら、
ジェネレータで作ったベースが古すぎて使えなかった際に、
一気にnpmをアップデートする方法があったのでメモします。

結構人気なnpmのようなので、今更感があるかもしれませんが！

## 環境
node.js v8.12
npm v6.3.0

## 準備する

#### 古いバージョンのnpmを入れておく
とりあえず何でもいいのでいれます。

```console
$ npm install sass-loader@6.0.6 style-loader@0.19.0 webpack@3.6.0
```
これを1発でバージョンアップします。

```json:package.json
～～省略～～
  "dependencies": {
    "sass-loader": "^6.0.6",
    "style-loader": "^0.19.0",
    "webpack": "^3.6.0"
  }
```

#### 全アップデートできるライブラリを入れる

```console
$ npm install -D npm-check-updates
```
特に問題ないなら、
-gをつけて、グローバルインストールしても良いと思います。
今回は検証なのでローカルインストールにしときます。

npmの説明はこちらです。
[npm-check-updates公式](https://www.npmjs.com/package/npm-check-updates)

## 実行する
グローバルインストール時はnpxは不要です。

```console
$ npx npm-check-updates -u

[INFO]: You can also use ncu as an alias
Upgrading ～～～～\package.json
[====================] 4/4 100%

 sass-loader    ^6.0.6  →   ^7.1.0
 style-loader  ^0.19.0  →  ^0.23.1
 webpack        ^3.6.0  →  ^4.29.6

Run npm install to install new versions.
```

これでまずpackage.jsonのみ更新されます。

```json:package.json
～～省略～～
  "dependencies": {
    "sass-loader": "^7.1.0",
    "style-loader": "^0.23.1",
    "webpack": "^4.29.6"
  },
```

パッケージの指示通り、下記を実行します。

```console
$ npm install
～～省略～～

added 84 packages from 74 contributors, removed 77 packages, updated 25 packages and audited 4439 packages in 13.19s
found 0 vulnerabilities
```
2コマンドで全部更新されます。
すごく便利ですので、未導入の方は導入を検討されてもいいかもしれません。

なお、これでは更新できないものもあったりするので、
気をつけてください。
具体的にはBabel6から7へのアップデートはこれでは無理です。
他にもあると思うので、エラーがでたら1つ1つ対処すれば問題ないです。
Neuron 用身体測定マニュアル

<p><img src="https://dl.dropbox.com/s/81gbm1cae0z1dr1/Neuron%20%E7%94%A8%E8%BA%AB%E4%BD%93%E6%B8%AC%E5%AE%9A%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB.png" /></p>


演者さんに送付する、Perception Neuron / Neuron Pro 用の身体測定マニュアルの PDF。
ユーザーの方はどうぞ。


<!--
https://qiita.com/sator_imaging/items/e88a6813bdaeeee6fb09
-->


- [Neuron 用身体計測マニュアル - Sator Imaging - BOOTH](https://sator-imaging.booth.pm/items/1281204)
    <iframe
        class="embed-card embed-webcard"
        scrolling="no"  frameborder="0"
        style="
            display: block;  border: none;
            margin: 10px 0px;
            width: 100%; height: 155px;
            max-width: 500px;
        "
        src="https://hatenablog-parts.com/embed?url=https://sator-imaging.booth.pm/items/1281204">
    </iframe>



--

#### こちらもどうぞ

- [#VTuber関連まとめ - Qiita](https://qiita.com/sator_imaging/items/5d3b4466a2a1539184d0)
   <iframe
      class="embed-card embed-webcard"
      scrolling="no"  frameborder="0"
      style="
         display: block;  border: none;
         margin: 10px 0px;
         width: 100%; height: 155px;
         max-width: 500px;
      "
      src="https://hatenablog-parts.com/embed?url=https://qiita.com/sator_imaging/items/5d3b4466a2a1539184d0">
   </iframe>


- [Neuron 用身体測定マニュアル](http://www.sator-imaging.com/2019/03/neuron.html)
    <iframe
        class="embed-card embed-webcard"
        scrolling="no"  frameborder="0"
        style="
            display: block;  border: none;
            margin: 10px 0px;
            width: 100%; height: 155px;
            max-width: 500px;
        "
        src="https://hatenablog-parts.com/embed?url=http://www.sator-imaging.com/2019/03/neuron.html">
    </iframe>
checkoutで前のコミットに戻った状態のまま作業進めちゃって、変更をマージしながらpushもしたいよってときの対処法

消しちゃったコードを探すとか、バグが出ちゃった時に、checkoutで前のコミットに戻ってごにょごにょすることがあるのですが、
その後、HEADに戻り忘れたまま作業を進めてしまい、
pushできず、作業を進められないという状況に陥ったので、その時の対処法です。多分これでOKなはずです。

##手順
```
// 変更内容をstashで一旦回避する。(変更内容をコミットしてたらcheckoutでコミット前の状態に戻っておく)
git stash

// checkoutする前の状態に戻る?
// <作業ブランチ>は今までいたブランチと同じブランチ名でOK
// ここで一旦変更内容は失われます。
git checkout <作業ブランチ>

// pullして最新の状態にする。
git pull

// 回避した変更ファイルを戻す
// git stash listで戻したいstashの番号を確認できる。
git stash apply stash@{番号}
```
コンフリクトがあれば解消。なければ自動マージされます。
これで、変更内容を泣く泣く諦めるたり、差分を他のファイルにコピーしておくことなく、作業に戻れるはずです。
うまくいかなかったら、git reflog を使うと消えたと思ったlogを見ることもできるので、それでまたコミットログ拾って戻れると思います。
javascriptでlodashを使ってディープコピーを簡単に行う

## 検証の背景
Javascriptでオブジェクトなどを含む、
ディープコピーがうまくできない問題が話題になります。

そのあたりは下記サイト様をご参照ください。
[ES6のObject.assignがシャローコピーなのでディープコピーする方法を考える](https://kuroeveryday.blogspot.com/2017/05/deep-clone-object-in-javascript.html)
[[JavaScript]色々なディープコピー](https://qiita.com/knhr__/items/d7de463bf9013d5d3dc0)
[JavaScript:Array,Object,Map,Set,Dateをまとめてディープコピーする](https://qiita.com/ttatsf/items/68de3795ae3bf35c0228)

Node.jsのnpmで、
簡単にディープコピーができるものがあったので、
紹介します。

## 環境
node.js v8.12.0
npm v6.4.1

## ライブラリを取得する

```console
$ npm install lodash
```

lodashというライブラリは、
配列、オブジェクト、文字列を簡単に扱えるようになる、
人気のライブラリだそうです。

詳しくは下記公式サイトをご確認ください。
[github](https://github.com/lodash/lodash)
[npm](https://www.npmjs.com/package/lodash)

なおブラウザでも使えるようです。（未検証）
https://www.jsdelivr.com/package/npm/lodash


## やってみる

ディープコピーと、比較でシャローコピーもやってみます。

#### ソースコード

```javascript:index.js
const clone = require('lodash/clone');
const clonedeep = require('lodash/cloneDeep');

// まずオリジナルを定義する
const externalObject = {
  color: 'red'
};
const original = {
  a: new Date(),
  b: NaN,
  c: new Function(),
  d: undefined,
  e: function () { },
  f: Number,
  g: false,
  h: Infinity,
  i: externalObject
};

// シャローコピー
const cloned = clone(original);

// 1階層したのオブジェクトの値を変える
// ※オリジナルのほうだけのつもり
externalObject.color = 'blue';

// iの中身が変わってしまう
console.log('***original ----------------- shallow copy');
console.log(original);
console.log('***cloned ------------------- shallow copy');
console.log(cloned);    // 両方blueになる。。。

// ディープコピー
const deepcloned = clonedeep(original);
externalObject.color = 'yellow';

// iの中身が変わらない！！！
console.log('\n***original ------------------ deep copy');
console.log(original);    // オリジナルだけyellowになってる
console.log('***deepcloned ---------------- deep copy');
console.log(deepcloned);  // blueのまま！
```
#### 実行
```console
$ node index.js
***original ----------------- shallow copy
{ a: 2019-03-21T17:48:35.494Z,
  b: NaN,
  c: [Function: anonymous],
  d: undefined,
  e: [Function: e],
  f: [Function: Number],
  g: false,
  h: Infinity,
  i: { color: 'blue' } }
***cloned ------------------- shallow copy
{ a: 2019-03-21T17:48:35.494Z,
  b: NaN,
  c: [Function: anonymous],
  d: undefined,
  e: [Function: e],
  f: [Function: Number],
  g: false,
  h: Infinity,
  i: { color: 'blue' } }

***original ------------------ deep copy
{ a: 2019-03-21T17:48:35.494Z,
  b: NaN,
  c: [Function: anonymous],
  d: undefined,
  e: [Function: e],
  f: [Function: Number],
  g: false,
  h: Infinity,
  i: { color: 'yellow' } }
***deepcloned ---------------- deep copy
{ a: 2019-03-21T17:48:35.494Z,
  b: NaN,
  c: [Function: anonymous],
  d: undefined,
  e: [Function: e],
  f: [Function: Number],
  g: false,
  h: Infinity,
  i: { color: 'blue' } }
```
## 所感
思いのほか簡単でびっくりしましたが、
そもそも速度性能やコストを考えると、
ディープコピーをしないような作りにしたほうがいいと思います。
とはいえ、使わざる得ない局面ではかなり役に立ちそうですね！！

## 参考
[How to deep clone a JavaScript object](https://flaviocopes.com/how-to-clone-javascript-object/)
[stackOverflow](https://stackoverflow.com/questions/48972320/error-using-lodash-clonedeep-in-angular-5)
テーブルに使ってほしくないカラムがある時にプログラム上で対応したこと

別チームが管理しているDBを参照することがあったのだが
仕様書には「`hoge`カラムは使わないでください」と書いてあった

ActiveRecordを利用するので、何か対応をしなければ`my_model.hoge`で参照できてしまう
この状況でどういう対応をしたのか履歴を残しておく

## 対応1

### nilを返すよう強制した

```ruby
class MyModel < ApplicationRecord
  def hoge
    nil
  end
end
```

### 結果

運用前にレビューで弾かれので対応2へ

## 対応2

### 触れない

レビューで「使ってほしくないカラムに対してコードは書かなくて良いのでは」という意見をもらったのでそうしてみた

```ruby
class MyModel < ApplicationRecord
end
```

### 結果

実装して数日経つと、使ってはいけないという仕様を忘れてしまい
見事に使ってしまった
これは良くないということで対応3へ

## 対応3

### 例外を投げる

エラーを投げることで使ってはいけないということを開発者に通知するようにした

```ruby
# 例外クラスを作る
UnavailableAttributeError = Class.new(StandardError)
```
```ruby
class MyModel < ApplicationRecord
  def hoge
    raise UnavailableAttributeError
  end
end
```

### 結果

今のところ問題無し

# さいごに

対応3で運用してみて問題があればまた更新します。
更新が無いということはうまくいっていると思っていただければm(_ _)m
rbenvでrubygemsのバージョン指定

# gem
rubygemsをバージョン3.0.2から、バージョン2.7.6に下げたいと思います。

```sh
$ rbenv exec gem -v 
3.0.2
```

まず、`rubygems-update`をアンインストール

```sh
$ rbenv exec gem uninstall -v 3.0.2 rubygems-update
Remove executables:
	update_rubygems

in addition to the gem? [Yn]  Y
Removing update_rubygems
Successfully uninstalled rubygems-update-3.0.2
```

続いて、インストールしたいバージョンの`rubygems-update`をインストール

```sh
$ rbenv exec gem install -v 2.7.6 rubygems-update
Fetching rubygems-update-2.7.6.gem
Successfully installed rubygems-update-2.7.6
Parsing documentation for rubygems-update-2.7.6
Installing ri documentation for rubygems-update-2.7.6
Done installing documentation for rubygems-update after 31 seconds
1 gem installed
```

この時点ではまだバージョンは変わっていません

```sh
$ rbenv exec gem -v
3.0.2
```

`rubygems-update`を実行してあげます。

```sh
$ rbenv exec update_rubygems
Bundler 1.16.1 installed
RubyGems 2.7.6 installed
Regenerating binstubs
Parsing documentation for rubygems-2.7.6
Installing ri documentation for rubygems-2.7.6
```

バージョン変更完了！

```sh
$ rbenv exec gem -v
2.7.6
```
Nowのv2以降はDockerfileに対応しなさそう

# これは何？

ZeitのPaaSである[Now](https://zeit.co/now)は、この先Dockerfileのサポートする？っていう話です。
調べてたら長くなったので記録にしました。

# NowでDockerfileを使う

**Serverless Docker Beta**
**https://zeit.co/blog/serverless-docker**

### v1はDockerfileに対応している

```now.json
{
    "version": 1,
    "type": "docker",
    "alias": "ubuntuman"
}
```
これでDockerfile置いてnowすればOK。

### v2はDockerfileに対応していない

```now.json
{
    "version": 2,
    "type": "docker",
    "alias": "ubuntuman"
}
```
これでnowすると失敗する。

```
machida@DESKTOP-EP8ECJ4:/mnt/c/dev/ubuntuman$ now
> Deploying /mnt/c/dev/ubuntuman under town-field
> Using project ubuntuman
> Error! The property `type` is not allowed in now.json when using Now 2.0 – please remove it.
```
2.0では``type``は取り除いてね、って書いてある。
そうすると、Dockerfileを指定することは不可能？

# [Nowのチャットルーム](https://spectrum.chat/zeit/now/clarify-future-support-of-docker-on-now-platform~96985341-e17f-4af4-a330-c726774ed436)を覗いた

ユーザー側が「**v2でDockerfileサポートする予定ある？**」って聞いてます。
**チャットは長いですが、ユーザーと開発チームがいろんなおしゃべりしてるので、気になった方は覗いてみると面白いと思います。**

以下は開発チームのコメントの気になるところを**抜粋**して訳してます。

### 開発チームコメント1

![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/145628/3e24a605-d185-7fe0-61d8-89b413472121.png)

> 少し明確にすると：Now v1をもうすぐシャットダウンするつもりはありません。 v2上のv1の最も一般的でクリティカルなユースケースに対応できるようになったら、非推奨計画について検討を始めることにします。

### 開発チームコメント2

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/145628/140b1194-6a03-8f9a-3ab1-ab7d4d4a1543.png)

> はい、最終的にはDockerのサポートを削除する予定です。

### 開発チームコメント3

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/145628/f2d820f8-66ef-13d4-b692-ebc2e84daf15.png)

> 私たちはこれがプラットフォームにとって正しい方向であることを100％確信していることを皆に再保証したいと思います。
> 私が深く展開とコード実行の未来であると確信していなかったら私達はこれを2.0と呼びません。

# おわり

v2でDockerfileいつ対応されるかな～と思ってたらこんな情報に行き着きました。

チャット内ではもっといろいろ話し合われていたのですが、開発チーム的にはDockerfileをサポートする予定はなさそうですね。
ただ、**「最終的には廃止していきたい」っていう意向なのでv1は使えるように残してる**、ということみたいです。
残念と言えば残念ですがNowは軽くて好きなので、node.jsとかで今後も使いどころを選んで利用させてもらおうと思います。

# 他のサービス

チャットでのユーザー間のやり取りで、Dockerfileのホスティングの代替として**Hyper.sh**というPaaS(というよりContainer as a Service？)が紹介されてたので使ってみようと思います。
SparkFun SAMD21 Dev BreakoutでSPIピンをICSPヘッダからD11〜D13に変更する

#ボードライブラリに含まれるvariant.hを変更
Macの場合、/Users/ユーザ名/Library/Arduino15/packages/SparkFun/hardware/samd/1.8.3/variants/SparkFun_SAMD21_Devなどにあります。
ボードライブラリを更新すると、D11〜D13でSPIが使えなくなるので、再度編集する必要があります。

##変更前
```:variant.h
#define PIN_SPI_MISO         (22u)
#define PIN_SPI_MOSI         (23u)
#define PIN_SPI_SCK          (24u)
#define PERIPH_SPI           sercom4
#define PAD_SPI_TX           SPI_PAD_2_SCK_3
#define PAD_SPI_RX           SERCOM_RX_PAD_0
```
##変更後
```:variant.h
#define PIN_SPI_MISO         (34u)
#define PIN_SPI_MOSI         (35u)
#define PIN_SPI_SCK          (37u)
#define PERIPH_SPI           sercom1
#define PAD_SPI_TX           SPI_PAD_0_SCK_1
#define PAD_SPI_RX           SERCOM_RX_PAD_3
```
##参考URL
[SparkFun SAMD21 Dev Breakoutの製品URL](https://www.sparkfun.com/products/13672 "SparkFun SAMD21 Dev Breakout")
[Adding More SERCOM Ports for SAMD Boards](https://learn.sparkfun.com/tutorials/adding-more-sercom-ports-for-samd-boards "Adding More SERCOM Ports for SAMD Boards")
『小さなチーム、大きな仕事〔完全版〕: 37シグナルズ成功の法則』を読んで

# 作品情報

ジェイソン・フリード  (著), デイヴィッド・ハイネマイヤー・ハンソン (著), 黒沢　健二 (翻訳), 松永　肇一  (翻訳), 美谷　広海 (翻訳), 祐佳　ヤング (翻訳)
単行本: 269ページ
出版社: 早川書房; 完全版 (2012/1/11)
言語: 日本語
ISBN-10: 415209267X
ISBN-13: 978-4152092670
発売日： 2012/1/11

# メモ
面白かった章題を。ちょうど自分の周りにいる方達に伝えたい。
そういう意味では今時の考え方、と言えるし、納得もいく。

* 仕事依存症はバカげている
* 中途半端な一つの製品ではなく、よくできた半分の製品
* 書類上の合意は幻想
* 競合相手以下のことしかしない
* 基本的に「ノー」と言おう
* 限界で人を雇う

# 読み終えて
仕事をする上で大事なことは下の３つかなと思いました。

* シンプルに保つこと
* 自分らしさを消さないこと
* とにかくやってみる

会社やチームを必要以上に大きくする必要はないし、自社製品を競合他社と比較して機能を追加する必要もない。
他人の真似をしても先進性はないし、誰の役にも立たない。製品もそう、考え方もそう。自分であることが価値そのものだ。
終わるはずのない長いTODOリストを毎日見ても意味はない。今必要なことをとにかくやってみよう。アイデアは形にしよう。

もう１つ面白かったことは、この本では社員のモチベーションを上げるための工夫も書かれていたこと。
毎日小さな決断をして前進しよう、間違ったら正しい方向にまた進めばいい、という考え。
AWSで投稿記事の更新ができない

先日WordPressのログインページのURLの変更に成功したのですが、今回、投稿記事の更新ができない現象が起きました。

いろいろ調べていて、WordPressの設定のパーマリンク設定の項目を、基本に戻して変更保存しました。
そしたら、記事の更新ができるようになりました。

再び、パーマリンク設定を日付+投稿名に戻して試しましたが、記事を更新できない現象が再発してしまいました。
根本的な原因調査は、時間があるときに行いたいと思います。
今日も仕事で深夜起きている状態なので、今日は、このままにしたいと思います。
EC2インスタンス内でユーザを追加してsshでログインするまで

# EC2メモ
EC2を使ってみようかなと思ってデフォルトユーザ以外でログインをしようとする過程でちょっと詰まったのでメモメモ

## 対象
AWS でEC2のインスタンスを作っている

## 本題
まず、デフォルトのユーザでAWSインスタンスのサーバにアクセスする
centOSの場合

```bash:shell
ssh centos@<public DNS or IP Adress> -i インスタンスを作った際の.pem -p 22
```

これでcentosアクセスできる

アクセスした状態で

```bash:shell
sudo su -
```

これでルートになって

```bash:shell
useradd ユーザ名
```

これで新規ユーザの作成

```bash:shell
passwd 追加したユーザ名
```

でユーザのパスワードを設定

```bash:shell
visudo
```
でsudoの設定ファイルの編集を行う
`/All`で文字列検索して`root    ALL=(ALL)    ALL`の下に`ユーザ名     ALL=(ALL)    ALL`を追加

```bash:shell
sudo su - 新規ユーザ
```
で新規ユーザでアクセスし、

```bash:shell
mkdir .ssh
chmod 700 .ssh
ssh-keygen -t rsa
chmod 600 .ssh/id_rsa.pub
cd .ssh/ && mv id_rsa.pub authorized_keys
cat id_rsa | pbcopy # 秘密鍵をコピー
```

で新規ユーザの鍵を作成し権限を変更した後 公開鍵の名前を変更

`exit`ででた後にローカル環境の`.ssh`に`id_rsa`を作って内容をコピーした秘密鍵をペースト

```bash:shell
ssh 新規ユーザ@<public DNS or IP Adress> -i ~/.ssh/インスタンス内で作った秘密鍵がある場所 -p 22
```

でアクセスできた
Macにdlibを導入したいと思ったら意外と簡単だったのでまとめてみた

# はじめに

記念すべき100本目の記事です。

タイトルにもあるとおり、顔検出でOpenCVより優秀と名高いDlibを導入しようと思って試行錯誤していたら意外と簡単だったのでまとめてみました。

# Anacondaのインストール

手前味噌ではありますが、以下の記事を参考にAnacondaを導入して下さい。

[macOS SierraでJupyter Notebookを使った機械学習環境を手っ取り早く作る手順 with anaconda](https://qiita.com/mix_dvd/items/d915752215db67919c06)

# Dlibのインストール

以下のコマンドを実行。

```
conda install -c menpo dlib
```

# 動作確認

以下のコマンドでPythonを起動。

```
python
```

読込を試してみる。

```
>> import dlib
```

特にエラーがなければOK。

...できた(^_^;)

Homebrewを使ったり、ソースからインストールしたりという方法がたくさん紹介されていたので色々試したのですが、上記のコマンドで完了してしまった後、なんとも言えない気持ちになりました。