OmniAICreator/Qiita-1.07M huggingface dataset:
会社と社員と３つの円とか

# 始めに
## 元ネタの在り処
- P・F・ドラッカー著書の「マネジメント・上」

ここに書いてあることはP・F・ドラッカー著書の「マネジメント・上」を読めば正確な事が分かるし、
普通にいい感じの日本語訳が出てるからまずは読むことをお勧めする。
ていうか趣味としてああいう本を読んだとしても面白いぞ。
普通に情報コスパいいし、頭のいいキャラクターを創作する上では必須のツール。

## 何が言いたいのか
強いて言うなら、「頭のいいキャラクターを作る上でまとめる必要があった事象」をまとめた事が言いたい。
ここに全体の主張は必要なく、むしろ個々の主張を読み解く必要があった。
つまりマネジメントを通して、ポエムを作る必要があった。


#  良い会社、良い社員、良い関係とは
誰にとって良い会社なのか。もちろん社会にとってだ。
誰にとって良い社員なのか。もちろん会社にとってだ。
社員と会社の良い関係とは何を意味するのか。まだ、分からない。

## ３つの円とカンパニー・ロイヤリティー
### 会社と社会の関係
顧客ロイヤリティーは聞いた事があるだろう。マーケティングを耳にしている者ならば、まず通る道の１つだ。
一方で、会社のロイヤリティーを考えている人は相応に少ない。
まずもって、会社が社会に生かされている事の本質をまとめよう。

### ３つの円
- 社会的正当性
    - 社会的に歓迎される、弾圧されない
    - メンバーが事業に喜びを感じる
- 社会的存在性
    - セグメントで一番になる、ブランド
    - 安さ、性能、コストパフォーマンス、耐久性、信頼性、UI、拡張性、シンプル性、etc...
    - シンプル、セグメント規模が大きい部分で一番だとより存在感が増す
- 社会的存続性
    - 経済的に成り立つ
    - 顧客に対し、存続の為の対価を求める姿勢
    - 互いに利他的であることの要求

### 欠けてはならない
どれか１つが欠ければ、社会追放は免れない。
とはいえ、現在でも姿形を変え、身を隠しながら、追放から逃れている会社もある。自信があるなら真似るのも手だ。
日本は制度と伝統上の理由で社会的正当性の変遷が遅れている。
奴隷制に近くとも、個人情報を垂れ流したとしても、多少の弾圧で免れる事が多い。


## ３つの円とエンプロイ・ロイヤリティー
### 社員と会社の関係
会社のロイヤリティー以上に放置されているのが現状だ。
社員は本質的に顧客と同等だ。故に、扱い方を間違えると会社は社会追放となる。

### ３つの円
- リピーター
    - 長く、高品質な労働力を支払う
    - 継続的学習、積極性と改善
- ロングライフ
    - 転職・退職する事を行わない
    - よりよい条件の会社になびかない忠誠心
- パブリッシャー
    - 会社のプロファイルを担う
    - 明示的、暗示的にも、会社の代表として宣伝を行う

### 負の作用を生み出す円
勤めている割りに生産性が異常に低い上司は居ないだろうか？
即座に転職する新人が居たことはないだろうか？
社員が会社の看板に対して泥を塗るような事はしていないだろうか？
気をつけなればいけないのは、負の円が存在することだ。
そして、根本的な解決を提供しなければ、負の円はゼロサムゲームのように、表面的な問題が変移する。
一方の負の円が小さくしたとしても、他の円が大きくなるだけだ。
この性質を知らないと、いたちごっこが始まるか、対処を放棄する事になる。



## ３つの円と仕事とキャリア
### will, must, can
これは非常に出回っている内容だ。ただし、日本限定だ。
しかし、同様に重要な事実でもあるので、乗せよう。
これは社員の仕事とキャリアに関するヒントとなる。
同時に、ロイヤリティーに関するヒントでもある。
その上で、次の違いは理解すべきだ。

- 仕事：金銭を受給する為に行うこと
- キャリア：将来的な学習、経験を獲得すること

### ３つの円
- やりたいこと
- 求められてること
- できること

### ロイヤリティー
当たり前だが、人はやりたいことを望む。
それを援助するような仕事を与えることは、リピーターとなり、ロングライフで、会社のパブリッシャーにもなる。
できることを与える仕事は、キャリアに傷をつけることになる場合がある。
少なくとも何一つ、その人の将来をよい方向に変えないのだ。むしろ、時間を奪っていると考えられるかもしれない。



## 働く事

## 働く事に必要な力
### 力を授けること
コミュニケーション・コストを必要以上に相手に被せてはいけない。双方の対人力が低下するからだ。
ノウハウを独占してはいけない。双方の技術力が低下するからだ。
課題やソリューションを押し付けたり、一方的に求めてはいけない。双方の対課題力が低下するからだ。
相手の困っている事を無視したり、自分の困っている事を押し付けてはいけない。双方の対自分力が低下するからだ。

### ４つの力
- 対人力
    - 他者とのコミュニケーション
- 技術力
    - 価値を生み出す、ソリューションの実現
- 対課題力
    - 課題を見つける
    - ソリューションを生み出す
- 対自分力
    - 困難なことに挑戦し、継続し、達成する力
    - 昨日の自分より、今日、今日より明日の自分が成長すること
    - モチベーションとセルフ・マネジメント

### まずは地固め
他者を助けられるほど力が自分には無いかもしれない。
そういう時は、PCゲーム「Getting Over It」をプレイする事をお勧めする。
４つの力について理解が進むだろう。なによりも、対自分力を求められるゲームだ。
これは真面目な話だ。
vue.jsだけで、モーダルのオーバレイ機能を作成する

## はじめに

最近jQueryで書いていたコードをvueに書き直すことをしているのですが、vueだとjQueryで複雑になりがちなコードをシンプルに記述できるのがいいですね。書き方も直感的だし。

今回つくりたいのは、このサイトにあるようなこういうやつです。↓
https://syncer.jp/jquery-modal-window

![ダウンロード (1).gif](https://qiita-image-store.s3.amazonaws.com/0/140786/40d66079-3bbf-bf67-2765-33d88b845815.gif)

jQueryや、vue+jQuery実装事例はいっぱい転がっているのですが、今回はvueだけを使ってもっとシンプルに作成しちゃいます。:+1:
(ちなみに今回は、どういう風に作るのか、という流れだけさらっと書きます。
なので、必要最低限のコードだけ紹介します。あとでコンテンツ載せるかもです:bow:)


## 作成
jQueryでモーダル操作をしようとすると、クリックするDOMの指定やら、なんやらがめんどくさいですが、vueのdataを利用することで、（jsは）以下のコードだけで済んでしまいます。:ok_hand:

流れとしては、コンテンツのclickイベントが発火したら、`openItem`メソッドのなかの`toggleModal();`を更に呼び込みます。
`toggleModal();`の中では、vueのdata内に登録した`isModalActive`という状態を切り替えることで、モーダル機能を実現します。

#### JS
``` vue.js
new Vue({
  el: '.l-wrapper',

  data(){
    return {
      isModalActive: false,
    }
  },
  methods: {
   /**
   * clickイベントが発火されたタイミングで、 
   * オーバーレイコンテンツを表示するフラグを持つdata(isModalActive)を切り替える
   */
    openItem() {
      this.toggleModal();
    },
    /**
    * active状態を切り替える。
    */
    toggleModal() {
      this.isModalActive = ! this.isModalActive;
    },
  }
});
```

#### HTML

html部分では、先程作成した`openItem`vueメソッドをclickで発火するように設定します。
（ちなみに、`@click`は`v-on:click`と同等です。）

``` click_item.html
<div class="l-wrapper">
  <button class="p-modalBtn" @click="openItem">{ ここをクリックすると、モーダルが開きます。}</button>
</div>
```

``` modal_content.html
<div class="p-modal" :class="{'is-open': isModalActive}">
  { clickで表示したいmodal_content部分 }
</div>
```

```modal.css
.p-modal {
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  overflow-y: auto;
  visibility: hidden;
  opacity: 0;
  z-index: -1;
  &.is-open {
    visibility: visible;
    opacity: 1;
    z-index: 100;
  }
}
```

こちら先程dataに登録した、`isModalActive`の状態を感知して、`is-open`というクラスを付与することで、コンテンツをオーバーレイするclassを呼ぶことができます。
（ちなみに、`:class`は`v-bind:class`と同等です。）

## おわりに
jQueryからちょっとづつ脱したい！という人にこういう簡単な取っ掛かりがあると、いいかと思いあえてシンプルなコードを載せました。機能単位でイメージが分けば、ちょっとづつvueの手軽さがわかっていただけるのではないかなと思います。
（自分が複雑なエコシステムを無理に理解しようとして挫折しそうになったので笑）

こういった知見が、少しでもそういった方に役に立てばいいなと思います。:bow:


### 参考
- [クラスとスタイルのバインディング — Vue.js](https://jp.vuejs.org/v2/guide/class-and-style.html)
- [初心者でも分かる！モーダルウィンドウの作り方](https://syncer.jp/jquery-modal-window)
- [Vue.jsでモーダルウィンドウを作ってみる - 俺、サービス売って家買うんだ](http://www.ie-kau.net/entry/2015/08/19/Vue.js%E3%81%A7%E3%83%A2%E3%83%BC%E3%83%80%E3%83%AB%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B)
Macからraspberry piにUbuntu MATEをインストールする

#raspberry piでubuntuを使ってみたい
Raspbianだとできることが限られてるんで、Ubuntu使ってみようと思ってインストールしてみたかった
一度ラズベリーパイにUbuntuを入れたものの、再インストールしたいと思ったときにやり方を忘れてしまったので備忘録として

#環境
mac Seirra バージョン10.12.6
Raspberry pi 3

##1,Ubuntu MATEをダウンロード
![スクリーンショット 2018-04-15 23.54.28.png](https://qiita-image-store.s3.amazonaws.com/0/249909/486e4266-8254-2ff7-1ee5-2f56aa748d9e.png)
図１
https://ubuntu-mate.org/raspberry-pi/


このページの「Download Ubuntu MATE」をクリック

![スクリーンショット 2018-04-15 23.57.12.png](https://qiita-image-store.s3.amazonaws.com/0/249909/ab9b2d97-072a-5e2d-f301-ac8277dbf895.png)

ラズベリーパイを選択して、進めていくと「ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img.xz」を選択する項目が出て来るのでクリックするとダウンロード開始！
ファイルのサイズが大きいのでダウンロードには少し時間がかかります。




ダウンロードができたので、「.xz」ファイルの解凍していきます。

![スクリーンショット 2018-04-16 0.28.49.png](https://qiita-image-store.s3.amazonaws.com/0/249909/4d35739d-e9b1-b4b4-9f37-723fc499cd26.png)

ダウンロードから「ubuntu-mate-16.04-desktop-armhf-raspberry-pi.img.xz」を右クリック「このアプリケーションで開く」から「The Unarchiver」を選択します。

#SDカードにOSイメージを焼いていく

ここからUbuntuのOSをSDカードに焼いていきます。

SDカードのフォーマット方法は割愛。ディスクユーリティーでもいいですが、自分はフォーマット用の無料ソフトを使っています。（以下ダウンロード用リンク）
https://www.sdcard.org/jp/downloads/formatter_4/

このページを参考にしました。
https://qiita.com/mogetarou/items/b193be4974f9b0282cc6

```ターミナル
$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *121.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            120.5 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3

/dev/disk1 (internal, virtual):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           +120.1 GB   disk1
                                 Logical Volume on disk0s2
                                 BAD4D5FD-DA88-43E5-81E5-325A5064A936
                                 Unlocked Encrypted

/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk2
   1:             Windows_FAT_32 RECOVERY                15.9 GB    disk2s1
```

disk2にSDカードがマウントされていることがわかりました
次に、解凍したファイルのある場所へ移動

```ターミナル
$ cd Downloads/
```

RECOVERYというSDカードの名前だったので以下でアマウント

```
$ diskutil umount /Volumes/RECOVERY/
Volume RECOVERY on disk2s1 unmounted
```

アマウントできたのでSDカードに書き込んでいきます

```
$ sudo dd if=ubuntu-mate-16.04.2-desktop-armhf-raspberry-pi.img of=/dev/disk2 bs=1m
```



書き込みが完了したらSDカードをラズベリーパイにセット！
無事に起動してくれました。
US配列のキーボードをJIS配列のMacBookにマウンティングした思い出

これを実現するためにやったことのまとめ

|![mounting_keyboard.jpg](https://qiita-image-store.s3.amazonaws.com/0/178904/a4a8ec87-047b-9e6a-5d0b-ebd2b3d1315b.jpeg)|
|:-:|

US配列主義者だけど、現場に入ったらJIS配列のMacが用意されていた。そんなとき。

自分の場合、本体付属のトラックパッドをよく触るので、外部接続のキーボードをMacBookの前に置いて作業するのも効率が落ちる。

だから本体のキーボードがある位置に、US配列のキーボードをいい感じにマウンティングさせたかった。


## Apple純正のMagic Keyboardがジャストサイズ

Appleのサイトでキーボードを調べてみると、MacBook付属のキーボードと同じスケール感のものがあった => [Magic Keyboard - 英語（US)](https://www.apple.com/jp/shop/product/MLA22LL/A/magic-keyboard-%E8%8B%B1%E8%AA%9Eus)

|![magic_keyboard.jpg](https://qiita-image-store.s3.amazonaws.com/0/178904/aa5d82d4-69fa-c30c-51f7-d9c3488bcb79.jpeg)|
|:-:|

もしかするといけるかもな...と思い、JIS配列のMacBookを持って電気屋に行った。

実際に売り場で現物をマウンティングさせてみると、これがビックリ。ジャストサイズではないか。

上に乗せるぶん若干の高低差はあるが、そんなに違和感がなかった。すぐに購入した。

## Karabiner Elementsで本体のキーボードを無効化する

[Karabiner Elements](https://pqrs.org/osx/karabiner/)というソフトを使えば、外部キーボードを接続したときに本体キーボードを無効化する設定ができる。

設定は簡単で、外部キーボードを接続した後に`Preferences > Devices`の`Disable the built-in keyboard while ...`をONにするだけ。

これで、Magic KeyboardをONにすると、本体付属のキーボードが無効化されるようになった。

マウンティングさせても大丈夫。


## 注意点等

### 電源ボタンは反応してしまう

上の設定を行っても、本体の電源ボタンだけは反応してしまうので注意が必要。

ただ、マウンティングしているキーボードが下手にずれない限りは特に押すことはない。

自分の場合、10ヶ月くらい使って2回くらいスリープしたような。それくらいの頻度。

### Early 2016のMacBookじゃないといい感じにならない

キーが薄くなったEarly 2016のMacBookじゃないといい感じにならないようだ。

試しに一世代前のEarly 2015のMacBookにマウンティングさせてみたが、キーに厚みがあるぶんフワフワァして安定しなかった。フワフワァして安定しなかった。

## 以上

ありがとうございました。
Docker で MySQL 8.0.4 を使う

docker 上の Rails に [mysql:8.0.4](https://github.com/docker-library/mysql/blob/ad625c64a06e16683e997e5a0147508d115f4989/8.0/Dockerfile) を使おうとして mysql 認証にはまったのでその対応記録

# 結論

`caching_sha2_password` の認証形式に対応できないので
下記のカスタム設定をマウントして認証形式を変更する

```
[mysqld]
default_authentication_plugin= mysql_native_password
```

# mysql8.0

Mysql8.0 ではデフォルトの認証形式を `mysql_native_password` から `caching_sha2_password` に変更している。
https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html

# 起きたこと

`rake db:create` で下記エラー

```
Mysql2::Error (Authentication plugin 'caching_sha2_password' cannot be loaded: /usr/lib/x86_64-linux-gnu/mariadb18/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory):
```

`caching_sha2_password` に対応させる方法までは調べられなかったので `mysql_native_password` に設定を変更する方向に。

# 対応

## 設定ファイル

下記設定ファイルをローカルに作成

```mysql-confd/default_authentication.cnf
[mysqld]
default_authentication_plugin= mysql_native_password
```

## マウント

Docker の Mysql は `/etc/mysql/conf.d/*.cnf` を読み込むようなのでマウントを設定

```docker-comnpose.yml
  mysql:
    image: "mysql:8.0.4"
    # ...
    volumes:
      - ./mysql-confd:/etc/mysql/conf.d
```

## 再起動

コンテナ、ボリュームを一旦削除して再起動

```sql
MySQL > SELECT user, host, plugin FROM mysql.user;
+------------------+-----------+-----------------------+
| user             | host      | plugin                |
+------------------+-----------+-----------------------+
| root             | %         | mysql_native_password |
| mysql.infoschema | localhost | mysql_native_password |
| mysql.session    | localhost | mysql_native_password |
| mysql.sys        | localhost | mysql_native_password |
| root             | localhost | mysql_native_password |
+------------------+-----------+-----------------------+
5 rows in set (0.00 sec)
```

これで問題なく認証が通るようになった
プログラミング言語Goを読みながらメモ(第十三章)

[プログラミング言語 Go]( https://www.amazon.co.jp/dp/4621300253 ) を読みながらメモ。


第一章 : https://qiita.com/Nabetani/items/077c6b4d3d1ce0a2c3fd
第二章 : https://qiita.com/Nabetani/items/d053304698dfa3601116
第三章 : https://qiita.com/Nabetani/items/2fd9c372fcd8383955a5
第四章 : https://qiita.com/Nabetani/items/59bfd00dc3323883a07f
第五章 : https://qiita.com/Nabetani/items/4b785f1c9b0b26d48475
第六章 : https://qiita.com/Nabetani/items/1c100394a65af6506187
第七章 : https://qiita.com/Nabetani/items/6553ad253af77661e915
第八章 : https://qiita.com/Nabetani/items/3b2e3964159cc292fe00
第九章 : https://qiita.com/Nabetani/items/c94e51aa29926a56159e
第十章と第十一章は省略。
第十二章 : https://qiita.com/Nabetani/items/2d63279465e7ab8c20a2

で。

十三章は、楽しい unsafe。

# ポインタを使ってプライベートメンバを書き換える

まずはこんなイタズラから。

```go:go
package main

import (
	"fmt"
	"os"
	"reflect"
	"unsafe"
)

func main() {
	stdout := os.Stdout
	vs := reflect.ValueOf(stdout).Elem()
	file := vs.FieldByName("file")
	pfd := file.Elem().FieldByName("pfd")
	sysfd := pfd.FieldByName("Sysfd")
	unsafePtrToFD := unsafe.Pointer(sysfd.Addr().Pointer())
	intPtrToFD := (*int)(unsafePtrToFD)
	fmt.Fprintln(stdout, "stdout?") // 標準出力に出る
	*intPtrToFD = 2
	fmt.Fprintln(stdout, "stderr?") // 標準エラーに出る！
}
```

本当にこれで「stderr?」は標準エラーに出た。

`unsafe.Pointer` を使わないバージョンでは書き換え禁止だったけど、`unsafe.Pointer` を使ったら書き換えられた。素晴らしい。

とにかく、邪悪な用途に使えることはわかった。面白い。

# cgo で、C のコードを呼ぶ

本よりも
http://otiai10.hatenablog.com/entry/2014/06/24/082448
が参考になった。

```go:go
package main

/*
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char const * gcc_version(){
	static char r[] = "123.123.123";
	sprintf( r, "%d.%d.%d", __GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__ );
	return r;
}

char const * clang_version(){
	return __clang_version__;
}

int is_cpp(){
#if defined __cplusplus
	return 1;
#else
	return 0;
#endif
}

*/
import "C"
import "fmt"

func main() {
	gv := C.gcc_version()
	fmt.Printf("gcc_version : %v\n", C.GoString(gv))
	//=> gcc_version : 4.2.1
	cv := C.clang_version()
	fmt.Printf("clang versoin : %v\n", C.GoString(cv))
	//=> clang versoin : 9.1.0 (clang-902.0.39.1)
	fmt.Printf("is_cpp() == %v\n", C.is_cpp())
	//=> is_cpp() == 0
}
```

こんな感じ。

# cgo で、C++ のコードを呼ぶ

C++ を go のソースに埋め込む方法はわからなかったので、別ファイルにした。

まずは C++

```c++:c++
// clang++ -c hoge.cpp -o hoge.o

extern "C"
int is_cpp(){
#if defined __cplusplus
  return 1;
#else
  return 0;
#endif
}
```

を、コメントのとおりにビルドしておいて、
go にリンクする。

```go:go
package main

/*
#cgo CFLAGS:
#cgo LDFLAGS: hoge.o

int is_cpp();

*/
import "C"
import "fmt"

func main() {
	fmt.Printf("is_cpp() == %v\n", C.is_cpp())
}
```

と、ちゃんと C++ のコードが呼べる。

# 終りに

というわけで、読破した。
読破しただけなので、練習問題もやっていないし、まだ書けるという感じではない。
とはいえ、全体像はわかったような気になった。

本の評価はあんまり高くないんだけど、これより良い本があるような気もしないので仕方ないという感じ。

C++でいうところの「注解C++リファレンスマニュアル」、あるいは C でいうところの「[Ｓ・Ｐ・ハービソン３世とＧ・Ｌ・スティール・ジュニアのCリファレンスマニュアル]( https://www.amazon.co.jp/dp/4434124234 )」のような本がほしい。
まあウェブを見ろということなんだと思う。
[TravisCI]複数のブランチをそれぞれ別の環境にデプロイする

masterブランチを本番環境へ、stagingブランチをステージング環境へそれぞれデプロイする際の記述

AWS S3の場合

```yml:.travis.yml
deploy:
  - provider: s3
    bucket: 本番環境
    ...
    on:
      branch: master
  - provider: s3
    bucket: ステージング環境
    ...
    on:
      branch: staging
...
branches:
  only:
  - master
  - staging
```

`branches`は、上記以外のブランチが更新された際にビルドが走らないようにするため。
[php/Laravel]UUID生成

## 目的
メール認証実装時に、URLのハッシュ値を生成するときに使用。
通常の`uniqid()`やハッシュ関数を組み合わせて汎用性の高い関数を作ってみた

## 使い方
1. 以下の`UUID.php`を作成 (例では`App/Libs`に配置)
2. `new UUID()`で使用
    + MD5でhashしたいとき => `new UUID('md5')`
    + sha1でhashしたいとき => `new UUID('sha1')`

### UUID.php

```.php
<?php
/**
 * 限りなくuniqueに近いUUIDを生成する
 */

namespace App\Libs;


class UUID {

    /**
     * @var
     */
    public $prefix;

    /**
     * @var
     */
    public $entropy;

    /**
     * @param string $prefix
     * @param bool $entropy
     *
     */
    public function __construct($prefix = '', $entropy = false, $hash = null)
    {
        switch ($hash) {
            case 'md5': //32文字の16進数を返す
                //実行結果例：719deecdbfec1e13b4ed4e755ed39a47
                $this->uuid = md5(uniqid($prefix, $entropy));
                break;
            case 'sha1': //40文字の16進数を返す
                //実行結果例：ad46200ced3a5a5acd6697b11926589cc279b363
                $this->uuid = sha1(uniqid($prefix, $entropy));
                break;
            default: // $entropy:true 実行結果例：145677405658ddab75790ea7.19793837
                $this->uuid = uniqid($prefix, $entropy);
                break;
        }
    }

    /**
     * Limit the UUID by a number of characters
     *
     * @param $length
     * @param int $start
     * @return $this
     */
    public function limit($length, $start = 0)
    {
        $this->uuid = substr($this->uuid, $start, $length);

        return $this;
    }

    /**
     * @return string
     */
    public function __toString()
    {
        return $this->uuid;
    }


}
```

### 使い方
#### 1)prefixを付けたいとき
+ 第一引数にprefixテキストを渡す。
+ `new UUID('prefix_',true)` 
  + 実行結果例：prefix_ad46200ced3a5a5acd6697b11926589cc279b363

#### 2)$entropy付与
+ 第二引数にtrue/falseでentropy付与の選択が可能
+ entropyを使用すると、返り値に更に線形合同法を使用した値が付与される

> これにより一意性がさらに増すとのこと [PHP - uniqid](http://php.net/manual/ja/function.uniqid.php )

+ とはいっても理由無ければ使わなくても問題ないかと

#### 3)ハッシュ関数選択
+ 第三引数にハッシュ名を渡す。
+ `new UUID('',false,'MD5')`
+ デフォルト(引数なし)では`uniqid()`を使って生成する

### 使用例
laravelデフォルトだと生成tokenに'/'が混入してしまって、URLがおかしくなるので、そういうシーンにはいいかと

```.php
    /**
     * Userパスワードリセットデータの作成
     */
    protected function create(array $data)
    {
        $email = $data['email'];
        $token = base64_encode(new UUID('',true));
        $this->token = $token;
        $created_at = Carbon::now();
        return PasswordReset::create(compact('email', 'token','created_at'));
    }
```
Bashの入力、編集ショートカットを覚える

# はじめに
毎日使うシェルでの入力をより快適にするために、これまで使っていなかったショートカットを勉強します。

#各ショートカットの説明
## Ctrl+b / Ctrl+f
カーソルを一つ戻し(back)、あるいは一つ進め(forward)ます。矢印キー←→でも同じことができるので必須ではないですが、ホームポジションから手を動かさずに押せるのはいいですね。

## Ctrl+d
カーソルがある位置にある文字を削除します。これもDelキーで同じことができるので必須ではないです。なおBackspaceの代わりのショートカットはなさそうです。。

## Ctrl+a/Ctrl+e
カーソルを行の先頭/末尾に移動します。HomeキーやEndキーで同じことができます。

## Esc+b/Esc+f
カーソルを、現在位置より左にある単語の先/現在位置より右にある単語の次の空白に移動します。Ctrlとは違って同時押しではなくEscを押してからb/fを押す操作になります。これは慣れると便利そうですね。

## Ctrl+k
現在位置から文末までの文字列をカット(kill）します。あまり使わないかも。

## Esc+d
現在位置から次の単語末までの文字列をカットします。

## Esc+w
直前の空白から現在位置の左までの文字列をカットします。

## Ctrl+y
カットした文字列をペースト(yank)します
R Studio で "Hello World"

#R のインストール
R for Windows
https://cran.r-project.org/bin/windows/base/

「base」をダウンロードしてインストール
バージョンは「R-3.5.0 for Windows」

スタートメニューから「RGui」を実行します。

```R
> print('Hello World')
[1] "Hello World"
```

q() で終了

#R Studio のインストール
RStudio
https://www.rstudio.com/products/rstudio/download/

「RStudio 1.1.447 - Windows Vista/7/8/10」をダウンロードしてインストール

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/240467/5da246d6-eaf8-4386-6244-403c6f6aeb99.png)
[php] foreachの謎

### 2018.05.06 追記
コメントにもあるように PHP 7.0.X から PHP 7.1.X への移行による新機能のようでした。
参照: [PHP 7.0.x から PHP 7.1.x への移行による新機能](https://secure.php.net/manual/ja/migration71.new-features.php#migration71.new-features.symmetric-array-destructuring)

<hr>

foreachでarray_mapを使う時、phpのバージョンによって書き方が妙に変わってたのでメモ

```php
<?php
  // php7.1
  foreach(array_map(null, $array1, $array2) as [$val1, $val2]) {
    echo $val1.', '.$val2;
  }

  // php7.0
  foreach(array_map(null, $array1, $array2) as list($val1, $val2)) {
    echo $val1.', '.$val2;
  }
?>
```

なんで[]で書けなくなったか分からないけど、list()を使えばどっちでも使えるから、まぁいいか。
パーシステントホモロジーでタンパク質の穴を見てみる

# （追記）
PDBIDからパーシステント図を見るWebアプリ。

[Protein Holes](http://takemoto08.bio.kyutech.ac.jp/~hirano/Protein_Holes/)
（学生時代の研究室サーバに立てているので動かなくなってるかも）

![スクリーンショット 2018-09-02 2.55.20.png](https://qiita-image-store.s3.amazonaws.com/0/247972/70b6927c-9b94-1a05-58ff-d7ba9773b1ba.png)

# はじめに

今回は、パーシステントホモロジーを用いてタンパク質の穴を可視化してみました。

# パーシステントホモロジーとタンパク質
パーシステントホモロジーとは、新しい位相的データ解析手法のことです。

一言で説明すると、データに含まれる「穴」に注目した解析手法です。

詳しくは、[「位相的データ解析の基礎と応用」](https://www.wpi-aimr.tohoku.ac.jp/hiraoka_labo/introduction_j.pdf)をご覧ください。

データは、"uncleaved ovalbumin"(1OVA)というタンパク質のアミノ酸主鎖座標(x, y, z)を使いました。

uncleaved ovalbuminは以下のような構造をしています。

![output.gif](https://qiita-image-store.s3.amazonaws.com/0/247972/d9361bcd-4ebe-769c-8df0-55fe4a41f1d9.gif)

このタンパク質に存在する穴をパーシステントホモロジーを使って可視化してみようと思います。

パーシステントホモロジーの計算には、[HomCloud](http://www.wpi-aimr.tohoku.ac.jp/hiraoka_labo/homcloud/#download)を使いました。

PDBファイル（タンパク質構造のファイル：[Protein Data Bank](https://www.rcsb.org/)から入手可能）からアミノ酸主鎖座標を抜き出す部分のソースコードを公開しています。

ソースコードは、[こちら](https://github.com/hokuto-HIRANO/Persistent_Homology-PDB)からご覧ください。

# 結果

uncleaved ovalbuminの２次（空洞）のパーシステントホモロジーを計算した後のプロット図です。

![スクリーンショット 2018-09-02 2.56.32.png](https://qiita-image-store.s3.amazonaws.com/0/247972/900ade36-a039-83c2-653f-25c21795de5f.png)

# （追記）
HomCloudが更新されていて、インストール時のエラーが無くなっていました。
インストールもpipで簡単にできるようになりました。

（MacOXでも普通にインストールできました。）

さらに、以前は使えなかった拡張部分が使えるようになっていました。

~~# HomCloudのインストール時のエラー~~
~~HomCloudのインストール時につまずいたところをいくつかあげて起きます。~~

~~原因は分かりませんが、インストールはできました。~~

~~１、"cmake"ができない~~

~~私のPC環境はmac High Sierraですが、"cmake"だけではエラーがでました。~~

~~"cmake CMakeList.txt"とすることで解決できました。~~

~~２、"pip3 install homcloud-base-x.y.z.tar.gz"ができない~~

~~pyenvのpythonを使っていると、なぜかインストールできませんでした。~~

~~以下のようにして、systemのpythonに切り替えることでインストールできました。~~

~~````$ pyenv global system````~~
何気なく使ってるprintfを改めて理解してみる

##prinfで使う変換指定文字列の書式
変換指定文字列の書式は次のようになっている。

**%[フラグ][フィールド幅][.精度][長さ修飾子]変換指定子**

##フラグ
| フラグ    |    　　　　　　　　　　　　　　　　　　　　　　　   意味 |
|:----------:|:----------------------------------------------------------------|
| #         | 変換指定子がoの時に値に0を付け、変換指定子がx,Xの時に値に0xを付ける。また、変換指定子がa,A,e,E,f,F,f,g,Gの時、強制的に小数点を付ける。また、変換指定子がg,Gの時には後ろの0を取らない。|
| 0         | 表示する文字列の長さがフィールド幅より小さいときに、フィールド幅の余白に0を付加 |
| スペース   | 表示する文字列の長さがフィールド幅より小さいときに、フィールド幅の余白にスペースを付加 |
| +         | 数字に符号をつける |
| -         | 表示を左寄せにする。デフォルトは右寄せ |

##フィールド幅と精度
個人的にこの2つは混同しやすいが、違いは以下の通り。
1. 文字列の長さより小さな値をフィールド幅に指定したとき、出力は変わらない。
2. 文字列の長さより小さな値を精度に指定したとき、指定した値分の文字数が出力される。
3. 文字列の長さより大きな値をフィールド幅に指定したとき、(指定したフィールド幅の値 - 文字列の長さ)分の空白が挿入される。
4. 文字列の長さより大きな値を精度に指定したとき、出力は変わらない。

上記の内容は以下の実験1、実験2から分かる

####実験1
```c:sample1.c
#include<stdio.h>

int main(void){
        char *str;
        str = "abcdef";

        printf("%%3s  : ");
        printf("%3s\n", str);
        printf("%%.3s : ");
        printf("%.3s\n", str);

        return 0;
}
```
↓実行結果

```shell
$ ./sample1 
%3s  : abcdef
%.3s : abc
```

####実験2
```c:sample2.c
#include<stdio.h>

int main(void){
        char *str;
        str = "abcdef";

        printf("%%8s  : ");
        printf("%8s\n", str);
        printf("%%.8s : ");
        printf("%.8s\n", str);

        return 0;
}

```
↓実行結果

```shell
$ ./sample2
%8s  :   abcdef
%.8s : abcdef
```
Raspberry Pi Zero WH、USBケーブルのみでSSHするまでのメモ

# 前提
Raspberry Pi Zero WHでモニタ、マウス、キーボード、UTPケーブル無しで、USBだけで起動、ネットワーク(SSH)接続まで出来るようになってたので、その手順メモ。リンクが主。

- Windows 10
- Raspberry Pi Zero WH
    - http://akizukidenshi.com/catalog/g/gM-12958/


# 手順メモ

## 1. SDカードをフォーマット

以下を利用した。実行後、エクスプローラからアクセス可能。

SD Memory Card Formatter - SD Association https://www.sdcard.org/downloads/formatter_4/

## 2. OSイメージのインストール


Etcherにより実施
https://etcher.io/

手順は以下を参照した。
ラズパイ の OS イメージを焼くときは Etcher が 便利 ＆ UI カッコいい | 験なきものを思はずは https://azriton.github.io/2017/11/12/%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4%E3%81%AEOS%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E7%84%BC%E3%81%8F%E3%81%A8%E3%81%8D%E3%81%AFEtcher%E3%81%8C%E4%BE%BF%E5%88%A9%EF%BC%86UI%E3%82%AB%E3%83%83%E3%82%B3%E3%81%84%E3%81%84/

## 3. 電源投入、USB接続
略

## 4. ドライバの更新
### ドライバ更新

ドライバ取得先のリンクは↓を参照。
成功するとUSB/Ethernetがネットワークアダプタに見える

Raspberry Pi zero WをWindows10からUSBでssh接続する（iTunes不要） - Qiita https://qiita.com/saitetu/items/8412cfb274a3d85997fc

手順は↓参照
https://qiita.com/mt08/items/ce5e3911d74d7fad4563


### Bonjourをインストール

https://support.apple.com/kb/DL999?locale=ja_JP

## 5. SSH接続

・ラズパイ再起動して、以下でつながった

接続先：raspberry.local
ユーザ名/パスワード：pi/ raspberry

## 6. Wi-Fi設定

以下の通り実施
https://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573#wifi%E7%B7%A8
Ubuntu 18.04の変更点とかまとめてみた



## 祝!! 18.04 LTSリリース！
2018年4月26日に無事18.04(コードネーム: Bionic Beaver)がリリースされました！！（拍手！

この記事では主に16.04からの変更点をざっとまとめてみたいと思います．
俺はリリースノートみたら十分だぜって方は[こちら](https://wiki.ubuntu.com/BionicBeaver/ReleaseNotes)に公式のURL載せときますね．
### Ubuntuとは(一応)
- DebianベースのLinuxディストリビューション
- デスクトップ用，サーバ用以外にもクラウドやIoT用にも展開している
- Canonical社がバックについてくれている

## 変更点
17.10や17.04までに変更された点も含まれています．また筆者は16.04を全然使ったことがなく17系からUbuntuを使いだしているので落としてる事項もあるかもしれませんのでご了承ください．
### Linux kernel 4.15
[Spectre/Meltdown](https://meltdownattack.com/)にもきちんと対応したカーネルにアップデートされています．
### net-toolsからiproute2へ
こちらは17系からあってましたね．ifconfigやarpなどを始めとする[net-tools](http://net-tools.sourceforge.net/)からipコマンドを筆頭とする[iproute2](https://wiki.linuxfoundation.org/networking/iproute2)に移行しています．
### ifupdownからNetplanへ
ifupdown (ifupコマンド，ifdownコマンドと/etc/interfaces)から[Netplan](https://netplan.io/)(/etc/netplan)への変更だそうです．コンフィグをyamlで管理するのか「やったー」思いつつなんで移行したんだということは[サイト](https://netplan.io/design)のRequirementsに書いていました．遠隔でMTUを操作できたりとかできるっぽい？，あとはEC2やAzure variantsへの対応などだそう．
### openjdkのdefault versionが JDK10へ
JDKのバージョンアップだそうですが，2018年9月にはJDK11がでるのでそのあとは11がdefaultになるそう 
詳しくは[こちら](https://www.publickey1.jp/blog/18/java_109java_11java.html)
### 各種プログラミング言語のアップデート
こちらはリリースノートで確認ください！
### pythonだけ話ししますね
python2はデフォルトでインストールされなくなりました．またpython3は3.6にアップデート．次回のLTSからpython2がmianでは入らなくなるそうです．(brewはpython2じゃ3じゃとバタバタしてたのでスムーズに行くといいなとか思ってます．)

### gnupg1から2へ
gnupgとかいう暗号化のパッケージがあったのか....  勉強不足なので勉強して追記します．

## Desktop版変更点
### UnityからGnomeへ
ろくに16.04を使ったことがないので正直どうでもいい(マサカリが飛んできそう　怖いので下ろすかコメントで僕にUnityの良さを伝えていただけると嬉しいです．) 16.04は大学の共用マシンでほんのすこしだけ触っただけなんですごめんなさい．
#### WayLandへの移行
17系はXorgからWayLandへの移行が進んでました．まあ17.04リリース時はmozcが対応してなくてWayLandで日本語が打てずにXorgを使ってた人も多いんじゃないんでしょうか(そして17.10にあげてデフォルトのまま気づかずWayLand使ってました) .

とはいえ今回18.04ではデフォルトはXorgへ戻りましたね．不具合多かったからでしたっけ？(裏取りができてない)．個人的にはTweetDeck使ってるときXorgだと挙動がおかしかったりしたのでWayLand頑張ってほしい
### L2TP over IPSecの標準使用可能
やっときた......
従来だとl2tpとipsecをインストールしてゴチャゴチャ設定をしていたL2Tp over IPSec,SoftEther Clientでゴチャゴチャやるという手段と僕はとっていました．それがなんと今回！
できるようになりましたー(拍手！)

[こちら](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0498)の記事です！　 そういえばppaでも出てたはずだけどこれとは別なのかな

### スワップパーティションからスワップファイルへ
17.04のときから選択できるようになってました．[記事](http://blog.surgut.co.uk/2016/12/swapfiles-by-default-in-ubuntu.html)
クライアントは今どき結構メモリ積んでるしそんなにいらないでしょうという時代の流れですかねぇ．
[記事2](https://kledgeb.blogspot.jp/2016/12/ubuntu-1704-6.html)

## Server版変更点
### 32bit版ディスクイメージ廃止
だそうです
### 新しいインストラーの採用
[こんな](https://kledgeb.blogspot.jp/2018/02/ubuntu-1804-51-ubuntu-server.html)感じですね

### ntpdからChronyへ
ntpdからChronyに移行したそうです．ntpdとの比較は[こちら](https://chrony.tuxfamily.org/comparison.html)

(これクライアントもなってるか確認できてない)
## 思ったこと
ネットワーク周りがかなり変わっているので移行はかなり慎重になったほうが良さそう．サーバだけ，クライアントだけの変更点というよりは共通の変更点が多いですね．開発中にいろいろ事件があったりしたので開発チームのみなさんはおつかれさまでした．まだまだ不足があるとおもいますので，参考文献の１つ目やリリースノートも確認されると誤りがないかと思います．
## 参考文献
- https://www.ospn.jp/osc2018-spring/pdf/OSC2018_TokyoSpring_Ubuntu.pdf
- Software Design 2018年5月号 (いい感じでまとまってました！)
centOS7にいれたMariaDB5.5をv10.2にアップデートしたよ

[前回](https://qiita.com/nyanyamo/items/02fe96f0a197f8983f03)、MariaDB5.5.56インストールした直後に、
最新版が10.xってことを知っていきなりアップデートする羽目になったよ。
安定版最新が10.2っぽいのでそれいれた。
ので、キロク。

本家バージョン情報
[https://downloads.mariadb.org/mariadb/+releases/](https://downloads.mariadb.org/mariadb/+releases/)

## 環境
OS：centOS7
MariaDB：v5.5.56

## アップデートの手順

#### 1.リポジトリの登録

本家のリポジトリジェネレータを使ってOS、DBのバージョンを選択
[repository generator](https://downloads.mariadb.org/mariadb/repositories/)

/etc/yum.repos.d/配下にMariaDB.repoを作成して、ジェネレータで作ったやつ↓貼り付け

```cmd:/etc/yum.repos.d/MariaDB.repo
# MariaDB 10.2 CentOS repository list - created 2018-05-05 13:01 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

#### 2018/05/08 追記
リポジトリの一発登録コマンドがあるそうな！

```cmd:コマンド
curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
```
[本家参考ページ](https://mariadb.com/kb/en/library/mariadb-package-repository-setup-and-usage/)

@namahage1111 さん、コメントありがとうございます。

#### 2.MariaDB停止
動いてたらだけど

```cmd:コマンド
$ systemctl stop maridb
```

#### 3.更新

```cmd:コマンド
$ yum update MariaDB-server MariaDB-client

# 新規の場合はinstallで
$ yum install MariaDB-server MariaDB-client
```

#### 4.MariaDB開始
```cmd:コマンド
$ systemctl start mariadb
```

#### 5.バージョン確認

ログインして確認。

```cmd:コマンド
$ mysql -u root -e 'status' -p
$ Enter password:


--- ここからstatus ---
--------------
mysql  Ver 15.1 Distrib 10.2.14-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:          9
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server:                 MariaDB

# ↓これこれ
Server version:         10.2.14-MariaDB MariaDB Server
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/lib/mysql/mysql.sock
Uptime:                 8 sec

Threads: 7  Questions: 4  Slow queries: 0  Opens: 16  Flush tables: 1  Open tables: 9  Queries per second avg: 0.500
--------------
```

とりあえずできたっぽいので、おしまい。
Dockerコンテナからホスト側カレントディレクトリにアクセス

Dockerコンテナ上のツール等からホスト側のファイルやディレクトリにアクセスする場合、これらを`docker cp`でホスト↔コンテナ間移動するのは結構に手間です。

以下のようにコンテナ側からホスト側のカレントディレクトリがアクセスできるようにオプション設定することで、この手間を省くことができます。**ツール等をDockerコンテナとして配布している場合、そのツールでホスト側のファイルやディレクトリを指定したり、ツールが出力したファイルをホスト側にそのまま格納したい時などにはとても便利**です。

## コマンドの雛形

```bash
docker run --rm \
  --user $UID -v $PWD:$PWD -w $PWD \
  <Dockerイメージ> \
  <コマンド文字列>
```

- `<Dockerイメージ>`には任意のイメージを指定します。
- `<コマンド文字列>`にはdocker run/create等で指定するコマンド文字列を指定します。なお後述する通り、コンテナ上でパイプラインやリダイレクト等を使う場合は`bash -c "<コマンド文字列>"`とする必要があります。**この落とし穴にハマる人は結構多いです**。

## 使用例

最も簡単な使用例。コンテナ上でtouchコマンドを使ってhello.txtを作成し、このファイルがホスト側のカレントディレクトリに配置されていることを確認します。

```bash
docker run --rm \
  --user $UID -v $PWD:$PWD -w $PWD \
  alpine \
  touch hello.txt

ls hello.txt
```

Pythonで特定のPythonライブラリ+依存関係をまとめてダウンロードする場合、以下のようにpip3コマンドを実行します。

```bash
mkdir my-py-library

docker run --rm \
  --user $UID -v $PWD:$PWD -w $PWD \
  python:3.6 \
  pip3 install docker -t my-py-library

ls my-py-library
```

## 留意事項

### ホスト側カレントディレクトリは$HOMEより下にする

カレントディレクトリを\$HOMEよりも上位のディレクトリにして本コマンドを実行することにより、アクセスできるファイルとディレクトリの範囲が広がります。しかしコンテナが想定通り動作しなくなったり、ホスト側のディレクトリやファイルを破壊する危険性があるためお勧めしません。また後述する通り\$HOME直下をカレントディレクトリにするのも同様に危険なため、\$HOMEよりも一つ下以降のディレクトリをカレントディレクトリにしましょう。


### ホスト側の$HOMEは局所化して利用する

本記事で紹介しているdockerコマンドを応用して、下記のいずれかの条件で実行すれば、コンテナ上でホスト側の$HOMEにアクセスできます。

- \$HOMEをカレントディレクトリにする
- `-v $HOME:$HOME`を指定する

コンテナ上からホスト側の\$HOMEにアクセスすることにより、各種設定やキャッシュ等にアクセスすることができるため、使い方によっては作業効率を改善できます。ただし、異なるバージョンのプログラムを使用することにより、アクセスしたディレクトリやファイルを意図しない形で破壊するリスクが発生します。このため$HOMEの各種設定やキャッシュ等にアクセスしたい場合は、それぞれを明示的に`v`オプションで指定することをお勧めします。

例えばコンテナ上からホスト側のGradle関連キャッシュ等にアクセスしたい場合は、`-v $HOME/.gradle:$HOME/.gradle`と指定してコンテナ側で必要なディレクトリのみに範囲を制限しましょう。

### リダイレクト、パイプライン等を含む場合はbach -cを使用する

`docker run`に記述するコマンド文字列にリダイレクト、パイプライン、セミコロンは直接使うことができません。使った場合は以下のようにホスト側に対しての入出力やコマンドが実行されてしまいます。

- リダイレクトのファイル出力先はホスト側となる
- パイプライン以降はホスト側のコマンドで実行される
- セミコロン以降はホスト側のコマンドが実行される

> NOTE: なおこれはDockerコマンドの仕様ではなく、bash等のシェルの仕様です。

これらを使用する場合は、以下のように`bash -c`を使ってコマンドを実行する必要があります。コンテナ上で実行するコマンド文字列全体は、必ずシングルクオートまたはダブルクオートで囲ってください。

```bash
# bash -cの引数として指定されたコマンド文字列は全てコンテナ上で実行される
docker run --rm \
  --user $UID -v $PWD:$PWD -w $PWD \
  python:3.6 \
  bash -c 'python3 -V > python_version.txt; cat python_version.txt'
```

> NOTE: ちなみに上記の例だと、bash -cを使っても使わなくても結果は変わりません。`-v $PWD:$PWD -w $PWD`を削ると結果が変わります。
> ただし実際に結果が変わってしまうケースに遭遇する場合、原因解明に少し手間取る可能性があります。このためリダイレクトやパイプライン等を含む時には、基本的にbash -cを使うという方針でよいと思います。

## 補足: Dockerオプション解説

本記事のDockerコマンドで使用している各オプションについて説明しています。

- `--rm`オプションでDockerコンテナのプロセス(コマンド)が終了した時点でコンテナを破棄します。コマンド終了後にDockerコンテナ上のファイルを色々とアクセスしたい場合は外しても構いません。
- `--user`オプションでホスト側のUIDを指定します。指定しない場合、生成したファイル等の所有者がroot:rootとなるためホスト側のユーザが編集したり削除したりできません。
- `-v $PWD:$PWD`オプションで、ホスト側カレントディレクトリとコンテナ側カレントディレクトリのボリューム内容を一致させます。
- `-w $PWD`オプションで、ホスト側カレントディレクトリとコンテナ側カレントディレクトリのディレクトリパスを一致させます。`-v $PWD:$PWD`オプションと組み合わせて使います。
kintoneでレコード取得数の上限を突破する

## 動機
kintoneのカスタマイズまたはプラグインで、kintone.apiを用いてレコードを取得する際、そのレコード数に上限があります。それを突破することを考えてみよう。

## アイデア

ポイントは２つ：

- kintone.apiのコールバック関数を省略するとkintone.Promiseを返してくれる
- thenの戻り値は(kintone.)Promiseになる


## 実装

クエリを指定して取得するレコードを絞ったりできますが、ここでは取得数の上限を突破するための最低限のコードを書きます。

```javascript:fetchAllRecords.js
function fetchAllRecords(offset, records){
    
    //offsetは、取得したデータの先頭からいくつスキップするかを表す
    offset = offset || 0;
    let allRecords = records || [];

    //kintone.apiでレコード取得するためのパラメータ
    let params = {
        'app': appId, //ここは何か取得先のアプリID
        'offset': offset
    };

    //ここがポイント
    return kintone.api(kintone.api.url('/k/v1/records', true), 'GET', params).then(function(records){
        
        allRecords.concat(records);
        
        //取得したレコード数が上限に達していれば再帰呼び出し
        if(records.length === 100){
            return fetchAllRecords(offset + records.length, allRecords);
        }else{
            return allRecords;
        }

    });

}
```

## もう少し説明を

上のコードは、javascriptのPromiseの基本的な使い方を理解していると簡単に理解できます。
Promiseは非同期処理を監視してくれるオブジェクトであり、thenはPromiseのメソッドです。Promiseが非同期処理完了の合図を出した後に、thenの中の処理を実行することが出来ます。

```javascript:example1.js
let promise = new Promise(function(resolve, reject){
    //何かしらの非同期処理
    setTimeout(function(){
        resolve('A'); //ここのPromiseが監視している非同期処理が完了したことを知らせる関数
    }, 1000);
})
//resolveで渡された引数を受け取ることが出来る
.then(function(message){
    console.log(message); //文字'A'が出力される
});

```

先ほどのfetchAllRecordsでは、再帰呼び出しをすることで、**thenの中でさらに非同期処理を実行している**のです。

そして最後は取得したすべてのレコードをreturnしているのですが、最初に「アイデア」の部分で述べたように、**thenの戻り値はPromiseになる**ので、上の関数のあとにさらにthenをつなげることで、取得した全レコードを利用した処理を実行することが出来る。つまり以下のようにできたりします。

```javascript:example2.js
fetchAllRecords().then(function(allRecords){
    //allRecords変数には、取得した全レコードが渡されている
    console.log(allRecords);
});
```

## まとめ

Promiseの実戦的な応用例として、kintone.apiでのレコード取得数の上限を突破する関数を紹介しました。ただ、Promiseについての説明がここではしっかりできていないので、また初心者向けにまとめようと思います。
Railsの学習メモ　～cloud9でRailsを使う

##まえおき

プログラミング初心者のRailsを使ったアプリケーション作成のメモのようなものです。
自分自身の理解を深めること、のちに見返して復習できること、あとは学習を始めたばかりの方の参考に少しでもなればと記事を残そうと思いました。
自分的な解釈の部分も多いので、間違っている個所も多々あると思います。
ご教授いただけると嬉しいです。

##開発環境

Rails　4.2.8
Cloud9

##Cloud9にてRailsのインストール

まずは　Ruby　をインストール

以下のコマンドでインストール可能なRubyのバージョンを確認できる。

~~~
$ rvm list known

# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.7]
[ruby-]2.3[.4]
[ruby-]2.4[.1]
ruby-head
~~~

インストールしたいRubyのバージョンを指定してインストール

    $ rvm install 2.0.0-p648

複数のRubyバージョンをインストールすることも可能

コマンドでインストールされているバージョンを確認できる

~~~
rvm rubies

   ruby-2.0.0-p648 [ x86_64 ]
   ruby-2.2.7 [ x86_64 ]
=* ruby-2.4.1 [ x86_64 ]
~~~

=* のマークがあるものが現在使用中のバージョン。

    $ rvm use 2.2.7 

使うバージョンを指定して切り替えることができる。

Railsをインストールする前にgemsetを作成しておく
gemsetはRailsで使えるgemと呼ばれる便利なプラグインのようなものをしまっておく箱のようなもの。
gemsetを利用することでプロジェクトによってgemの使い分けができる。

    $ rvm gemset create  任意の名前

作成したgemsetを使用するには下記のコマンドを実行

    $ rvm gemset use 名前

gemsetはRubyバージョンごとに用意する必要があるようです。

いよいよRailsのインストール

    $ rvm gemset install rails -v 4.2.8

-v でバージョンを指定している。バージョンを指定しなければ最新版がインストールされるようです。
今回は利用している学習サイトに合わせ４系をインストールしました。
4.2.8が安定して利用できるみたいです。

    $ rvm ruby -v
___
    $ rvm rails -v

上記コマンドでそれぞれのバージョンを確認

    $ rvm gemset list

使用中のgemsetの確認

以上でCloud9でのRails環境構築は終了です。
1.2 不偏分散の仕組み

#不偏分散の説明
標本分散が標本の分散である。不偏分散は標本から算出する所は標本分散と同じだが、母分散を推定した分散である点が異なる。不偏分散は母分散の不偏推定量である。

標本数nが十分に大きくない場合、標本分散は母集団の分散より小さくなる。そこで不偏分散は、期待値が母集団の分散に一致するように、標本分散の算出式にn/(n-1)をかけている。
・標本分散 
　$s^2 =\frac{1}{n}\sum_{i=1}^n (x_i-m)^2 $
・不偏分散
　$u^2 =\frac{1}{n-1}\sum_{i=1}^n (x_i-m)^2 $
　※mは標本平均


たしかに標本分散は母分散より小さくなるのは直感で理解できる。標本の平均は、母数の平均に比べて個々の標本値に近い場所に存在するはずなので、標本分散が母分散より小さくなるのは当然であろう。
だからと言って、二乗和をnで割る代わりに(n-1)で割る不偏分散の期待値が、何故母分散と一致するのだろう。数学的な根拠はあるのだろうか。
確認の為に証明してみよう。


#証明：標本の不偏分散の期待値は母集団の分散
母平均をμ、母分散を$σ^2$、サンプルサイズnで抽出した標本の標本平均をm、標本分散を$s^2$とする。
標本抽出を何度も行うとすると、標本平均$M$も標本分散$S^2$も確率変数と考える事ができる。

　$\begin{aligned}
 E[S^2]  
 &= E[　\frac{1}{n}\sum(X_i-M)^2　]\\\
 &= E[　\frac{1}{n}\sum X_i^2 -2M\frac{1}{n}\sum X_i  - \frac{1}{n}\sum M^2 　]\\\
 &= E[　\frac{1}{n}\sum X_i^2 -M^2　]\\\
 &=\frac{1}{n}\sum E[X_i^2]  -E[M^2]　　　　　・・・①\\\
 ここで\\\
 E[X_i^2]&=E[X^2]\\\
 また\\\
 σ^2 &=E[(X-μ)^2]\\\
    &=E[X^2] -2μE[X] +E[μ^2]\\\
    &=E[X^2] -2μμ +μ^2\\\
    &=E[X^2] -μ^2\\\
 より\\\
 E[X_i^2]&=σ^2 +μ^2　　　　　・・・②
　\end{aligned}$

　またmの分散について
　$\begin{aligned}
 V[M]  
 &= V[\frac{1}{n}\sum X_i]\\\
 &= \frac{1}{n^2} (V[X_1]+V[X_2] ・・・V[X_n])\\\
 &= \frac{1}{n^2} (nσ^2)\\\
 &= \frac{σ^2}{n}
　\end{aligned}$
　一方
　$\begin{aligned}
  V[M]  &= E[(M-μ)^2]\\\
        &= E[M^2]-μ^2\\\
  \end{aligned}$
　より
　$\begin{aligned}
　E[M^2]&=\frac{σ^2}{n}+μ^2　　　　　・・・③
　\end{aligned}$
　②、③を①に代入する。
　$\begin{aligned}
　E[S^2]  
  &=\frac{1}{n}\sum E[X_i^2]  -E[M^2] \\\
　&=\frac{1}{n}\sum (σ^2 +μ^2) -(\frac{σ^2}{n}+μ^2)\\\
  &=(n-1)σ^2/n\\\
　\end{aligned}$
　つまり
　$\begin{aligned}
　σ^2 &=nE[S^2]/(n-1) \\\
      &= E[　\frac{1}{n-1}\sum(X_i-M)^2　]\\\
　\end{aligned}$
母分散は、標本値から標本平均を引いた二乗和を(n-1)で割った不偏分散の期待値となった。

#不偏分散の期待値をプログラムで確認
不偏分散の期待値は、本当に母集団の分散に一致しているのだろうか。pythonで試してみる。

```python:不偏分散
import numpy as np

sample_var_array  = np.zeros(10000)#標本分散の配列の準備
unbaias_var_array = np.zeros(10000)#不偏分散の配列の準備

np.random.seed(1)
for i in range(0,10000):
    #母集団を平均0,標準偏差2の正規分布として5個サンプリング
    sample = np.random.normal(loc=0, scale=2, size=5)
    sample_var_array[i] = np.var(sample,ddof=0)#varのddof(Delta Degrees of Freedom)が0なら分散(デフォルト）
    unbaias_var_array[i]= np.var(sample,ddof=1)#varのddof(Delta Degrees of Freedom)が1なら不偏分散

#標本分散の平均
print(np.mean(sample_var_array)) #結果：3.22
#不偏分散の平均
print(np.mean(unbaias_var_array)) #結果：4.03
```
上記プログラムでは、標準偏差が2（分散が4）の正規分布に従う母集団から標本を5個サンプリングし、5個の標本から不偏分散を算出する処理を1万回実施し、その平均を出力している。たしかに不偏分散は4になった。つまり不偏分散の期待値は母分散に一致する事が分かる。
Android WebViewでのいろんな対処法

#概要
androidアプリの開発をしていたところ、いろいろ詰まってしまったので備忘録的に残しておく。
#そもそもの使い方
ここではXMLの記述は割愛。
`MainActivity.java`に限り記す。

```MainActivity.java
package com.example.XXXXX.XXXXX;

import //省略

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView webView = (WebView)findViewById(R.id.webView);

        webView.getSettings().setJavaScriptEnabled(true);//javascriptのオン
        webView.setWebViewClient(new WebViewClient());//標準ブラウザへのジャンプを防ぐ
        webView.loadUrl("http://www.XXXXXX.net/");//URLをロード
    }
}
```
#webへアクセス許可を書く
アクセスの許可をしておらず、`net::ERR_CACHE_MISS`というエラーが出てしまったので、それの対策。

```AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.XXXXX.XXXXX">

    <uses-permission android:name="android.permission.INTERNET"/><!--ここでアクセス許可-->
・
・
・
```
自分の端末宛にpingを送って応答の有無をCSVに記録する

# つらみ

毎日、勤務先の滞在時刻を記録して、毎月、指定のエクセルのフォーマットで提出する必要がある。手で入力するのがつらい。

# だらず

自分のサーバから自分が使用しているパソコンとスマートフォンに定期的に `ping` を送って応答の有無を記録する。応答の有無の情報があればその時刻を出勤・退勤時刻を記入する際のヒントに使えて嬉しい。

MACアドレスから `ip n` でIPアドレスを引いて `ping` して応答が有れば `1`、無ければ `0` を追記する。

以下をサーバのから `cron` で1時間毎とかで実行させる。なお、細部は個々の環境に応じて修正が要る。

```pings.bash
#!/bin/bash

LOG_FILE="/var/log/pings.log"

function log () {
  local mac_address=$1
  local tag=$2
  local ip_address=`ip neigh show | grep $mac_address | cut -d ' ' -f 1`
  local date=`date --iso-8601=seconds`
  local record="${date},${mac_address},${ip_address},${tag}"
  touch $LOG_FILE
  if ! ping -c 1 $ip_address 1> /dev/null; then
    echo "${record},0" >> $LOG_FILE
  else
    echo "${record},1" >> $LOG_FILE
  fi
}

log "00:00:5E:00:53:00" "pc"
log "00:00:5E:00:53:01" "mobile"
```

以下のようなログが出力される。あとはこれを煮たり焼いたりして使う。

```/var/log/pings.log
2018-05-05T21:45:37+09:00,00:00:5E:00:53:00,192.0.2.0,pc,1
2018-05-05T21:45:37+09:00,00:00:5E:00:53:01,192.0.2.1,mobile,1
```

つづく。
VisualStudio2015でソリューション名の変更

#はじめに
VisualStudio2015でソリューション名やプロジェクト名を変更する手順です。
特に難しいことはありませんし同様の情報はいくつも出てきますが、自分なりにまとめたいと思ったので記事を作ってみました。
C#のコンソールアプリケーションを例にします。
他の言語だとプロジェクトのプロパティなどが異なるのですが、基本的には同様の手順でいけると思います。
**※作業は自己責任で必ずバックアップをしておきましょう！**
#手順
##１．ソリューション
ソリューションエクスプローラーからソリューションを選択後、もう一度クリック（Windowsのエクスプローラーでファイル名を変える要領）で編集。
またはソリューションのプロパティウインドウで「（名前）」を編集。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/110941/25c5832a-aa0e-37c6-0770-10ac4774495c.png)

「ConsoleApplication1」→「HogeApplication1」に変更。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/110941/b20860e6-9585-6017-eb57-afc9efafa3f6.png)
##２．プロジェクト
ソリューションエクスプローラーからプロジェクトを選択後、もう一度クリックして編集。
またはプロジェクトのプロパティウインドウで「プロジェクトファイル」を編集（当たり前ですが拡張子は変更出来ません）。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/110941/1d53ebb2-a251-46d0-054a-e29799c77c01.png)

「ConsoleApplication1」→「HogeApplication1」に変更。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/110941/2471df49-336b-d420-e7ad-8c70f0c056f3.png)

プロジェクトのプロパティページで「アセンブリ名」「既定の名前空間」を編集。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/110941/5c033a8e-b5cf-f28e-0e08-2056b7274589.png)

「ConsoleApplication1」→「HogeApplication1」に変更。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/110941/88daeb12-1242-c13a-5502-8452edc85dea.png)
##３．ディレクトリ
作業前に、VisualStudioで該当ソリューションを開いている場合は一度終了します。
ソリューションファイル（.sln）が入っているディレクトリは単純に名称変更するだけでOKです。
ソリューションファイルと同階層にある、元ソリューション名と同名のディレクトリに関しては、ディレクトリ名の変更と同時にソリューションファイルをテキストエディタで開いて編集をします。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/110941/66d28008-0025-5d29-487e-3178311483de.png)

![8.png](https://qiita-image-store.s3.amazonaws.com/0/110941/c06439a3-d63e-2c32-29ea-455cd41eec37.png)

「ConsoleApplication1」→「HogeApplication1」に変更。
![9.png](https://qiita-image-store.s3.amazonaws.com/0/110941/fd5345a8-0f60-3780-25c1-3b287c5fa20c.png)

![10.png](https://qiita-image-store.s3.amazonaws.com/0/110941/2be1b746-c707-b5a1-b165-34e85ea74368.png)

#最後に
以上で変更完了です。
問題なく起動出来れば大丈夫だと思います。
個人的には、テキストエディタで編集～って部分が気に入らないのでVisualStudio上だけで完結出来ればいいんですが・・・。
Linux で 写真のExif タグを一気に編集する

# 時刻設定の誤ったカメラで撮影した写真

写真管理は、撮影時刻を参考にすることが多いので、時刻設定が誤ったままで撮影してしまうと後々面倒なことになります。
特に、海外旅行前後に失敗することがよくあります。

今回、100枚ほど写真を撮影したところでカメラの時刻設定が誤っていることに気づいたので、これらを一気に修正する方法を探しました。

備忘録的に記録します。

# exiftool

exiftool はコマンドラインで exif タグを編集できるソフトです。
Ubuntu では

```bash
sudo apt install exiftool
```
でインストールできます。

Windows や mac では [ここ](http://owl.phy.queensu.ca/~phil/exiftool/) からダウンロードできるみたいです。

# 複数のファイルの撮影時刻を一気に編集する

`exiftool -s ファイル名` でファイルのexif情報を参照できます。
今回は日時が8日間ずれていて、5/5に撮影したファイルの撮影日時が4/27になっていました。

```bash
$ exiftool -s IMG_2428.JPG 
...
SubSecCreateDate                : 2018:04:27 11:40:03.25
SubSecDateTimeOriginal          : 2018:04:27 11:40:19.25
SubSecModifyDate                : 2018:04:27 11:40:03.25
...
```

上記が日時関係の情報です。
撮影日時を8日間後ろにずらすには

```bash
exiftool -DateTimeOriginal+='0:0:08 0:0:0' ./
exiftool -CreateDate+='0:0:08 0:0:0' ./
exiftool -ModifyDate+='0:0:08 0:0:0' ./
```

とすれば、現在のフォルダ以下にあるフォルダ・ファイルを一気にスキャンして、日時を 0年0ヶ月8日 0時間0分0秒 後に修正してくれます。

確認してみると

```bash
$ exiftool -s IMG_2428.JPG 
...
SubSecCreateDate                : 2018:05:05 11:40:03.25
SubSecDateTimeOriginal          : 2018:05:05 11:40:19.25
SubSecModifyDate                : 2018:05:05 11:40:03.25
...
```
間違いなく修正されていました。
簡単チャットボットを作ろうーAIMLをPython3で試してみた

#AIMLを教えてもらったのでやってみました〜
ここのサイトをお手本に・・・
[AI Chat Bot in Python with AIML](https://www.devdungeon.com/content/ai-chat-bot-python-aiml)

##エディタを使って、読み込むStartup File(xml)とaimlファイルを作る
###1ちょっと記事内ではわかりにくいけど、Startup Fileとしてstd-startup.xmlを最初に作ります。

###2同じフォルダにbasic_chat.aimlを作ります。

##Python AIMLをインストール！！
みおはPython3だからこっち
```pip install python-aiml```

"unsupported locale setting"エラー:frowning2:最初からつまずくみお・・
[pip install時のエラー対処](https://qiita.com/Mio_mm/items/2678658bccd7fab070fc)


##pythonで実行！
ターミナルでさっき作ったファイルの場所に移動してpython3起動
参考にしたサイトがpython2でできてたので下記のように少し変更⬇️
（inputとprintのとこです）

```import aiml```

\# Create the kernel and learn AIML files
```kernel = aiml.Kernel()
kernel.learn("std-startup.xml")
kernel.respond("load aiml b")```

\# Press CTRL-C to break this loop
```while True: print(kernel.respond(input("> ")))```

\>が出てきたら
HELLOと打って、返事が戻ってきたら成功！！！

python3で動くように下記を参考にさせてもらいましたありがとう
[https://github.com/weddige/pyaiml3](https://github.com/weddige/pyaiml3)
javascriptで任意個の変数を動的に生成する

## 動機

javascriptの記事を書いていて、なにかしらの入力値の数だけ変数をうまく生成できないか考えた時、
**連想配列**をうまく使うと実装できたのでちょっとしたメモとして。

## アイデア

動的に生成するだけなら、javascriptには**eval関数**という、文字列をjavascriptのコードとみなしてくれるものがあるが、パフォーマンスも悪く、セキュリティにも問題があるそうなので使わない。

そこで、連想配列の**キーを変数名**に、**値を変数の値**とみなすことにする。


## 実装

まずは空っぽの連想配列を用意して、順次追加していく。

```javascript

const len = 3; //何かしら入力値を受け取ったとする

//変数を動的に生成するための連想配列
const variables = {};

//要素を追加していく＝変数を生成する
for(let i = 1; i <= len; i++){
    variables['variable' + i] = 'value' + i;
}

```

こうすることで、連想配列variablesの構造は以下のようになる：

```javascript
{
    'variable1': 'value1',
    'variable2': 'value2',
    'variable3': 'value3'
}
```

となることが分かる。

## まとめ

似たような内容のオブジェクトを生成するときは、上記のようなコードを書くことで、繰り返しの少ない綺麗なコードが書けるかと思います。
以上、ちょっとしたアイデアでした。
第1話 空積

この記事は[仮面ライダービルドの数式](https://qiita.com/izmktr/items/e26a624e79bce3edccc9)の第1話です。

```math
1010^0=1
```
最初の数式はべき乗の式です。0以外の数を0乗すると1になるという分かり易い式です。
1010は主人公の名前、桐生戦兎の”せんと”=1010から来ています。
べき乗は何回掛け算を繰り返すか、という式です。
0回掛け算を繰り返すというのをどう考えるべきでしょうか。べき乗の式を見てみます。

```math
\begin{align}
2^2&=2\times2\\
2^1&=2
\end{align}
```
この式をちょっと変更してみます。

```math
\begin{align}
2^2&=1\times2\times2\\
2^1&=1\times2\\
2^0&=1
\end{align}
```
こういう風に、1に2を何回掛けたか、という考え方をすると0乗が1と定義できます。
基本的は0回何かをかける、というときは、その時の値を1とする事が多いです。
似たようなものに、階乗があり、こちらも0のときは１です。

```math
0!=1
```
pandas-profilingが探索的データ解析にめちゃめちゃ便利だった件 - GoogleColab編




# はじめに
以下記事よりGoogleColabratoryでは表示、挙動が不安定とのこと、解決方法があったので紹介します。
[【Pythonメモ】pandas-profilingが探索的データ解析にめちゃめちゃ便利だった件](https://qiita.com/h_kobayashi1125/items/02039e57a656abe8c48f)
> Colaboratoryでやると表示、挙動が不安定でした。
Kaggle KernelはOK。
Colaboratoryでは何か方法があるかもしれません。
IT詳しい方、ご存知でしたら教えてください。

**2020/2/4 追記**
以前までは以下のように一度htmlファイルに出力してから`from IPython.display import HTML`を使って描画するようにしていました。

**2020/10/3 追記**
下記コードの内容を@Kudaka さんの指摘を受けて修正しました。

```python3
import pandas as pd
import warnings
from pandas_profiling import ProfileReport
from pandas_profiling.utils.cache import cache_file

warnings.filterwarnings('ignore')

file_name = cache_file(
    "titanic.csv",
    "https://raw.githubusercontent.com/datasciencedojo/datasets/master/titanic.csv",
)
df = pd.read_csv(file_name)
profile = ProfileReport(df)

profile
```
`pandas_profiling v2.4.0`から後処理(HTML(profile))をせずともJupyerNotebooks上で綺麗に表示されるようになったようです。GoogleColabratoryで動かした例を作成しておきましたのでご確認ください。

[GoogleColabratory - pandas-profiling tutorial.ipynb](https://drive.google.com/open?id=1rhn9nIpuLZrsHldkX1TniHU9U5jhruob)

また描画失敗、成功例を紹介していましたがアップデートにより必要なくなったため削除しました。

# 参考
- [Github - pandas-profiling](https://github.com/pandas-profiling/pandas-profiling)
- [stackoverflow - Import html to ipython notebook file
](https://stackoverflow.com/questions/26462893/import-html-to-ipython-notebook-file)
- [Pythonメモ : pandas-profilingでDataFrameのプロファイリング](https://wonderwall.hatenablog.com/entry/2018/02/12/171500)
- [Qiita - Google Colab上でKaggleのデータをロード、モデル訓練、提出の全てを行う](https://qiita.com/katsu1110/items/a8d508a1b6f07bd3a243)
マニフェストファイルは Basic / Digest 認証を通過できない

# Basic 認証や Digest 認証で保護されたマニフェストファイルを取得できないとき

ウェブアプリ マニフェスト (Web App Manifest) についての公的な説明
* [W3C Working Draft](https://www.w3.org/TR/appmanifest/)
* [MDN web docs](https://developer.mozilla.org/ja/docs/Web/Manifest)
* [Google Developers](https://developers.google.com/web/fundamentals/web-app-manifest/?hl=ja)

## 事象

Apache 2.4 に Digest 認証を設定し、ドキュメントルート以下、すべてのファイルを保護した。ドキュメントルート直下には site.webmanifest ファイルを置き、index.html から参照させている。

しかし、何度パスワードを正しく入れても、Apache 2.4 が AH01797: client denied by server configuration エラーをログに残す。ほかのファイルは問題なく読みこめている。

ウェブで検索しても、Deny from All が Apache 2.2 以前の古い書き方だとか、MIME Types に .webmanifest が登録されていないからだとか（ファイル名を manifest.json に変えても状況は変わらない）、そういう情報ばかりで解決につながるものがない。

さんざん検索して、ようやく辿りついたのがこのページだった。

> [SUUMOスマホサイトへのService Worker導入  ① - リクルート住まいカンパニー Tech Blog](http://tech.recruit-sumai.co.jp/suumo%25e3%2582%25b9%25e3%2583%259e%25e3%2583%259b%25e3%2582%25b5%25e3%2582%25a4%25e3%2583%2588%25e3%2581%25b8%25e3%2581%25aeservice-worker%25e5%25b0%258e%25e5%2585%25a5%25e2%2591%25a0-add-to-home-screen-%25)
> **WebAppManifestのBasic認証について**
開発環境でBasic認証などをかけている場合、通常は認証のためのダイアログが表示されます。
> しかし、WebAppManifest (manifest.json) に対しては、Basic認証がかかっていてもクライアントに入力ダイアログが表示されず、「ホーム画面に追加」のボタンが出ないことがあります。
> これを回避するために、manifest.json にはBasic認証を掛けないといった対応が必要です。

Oh...

## 解決

httpd.conf に以下を追加。ファイル名のマッチングはもっと工夫して汎用化した方がいいかもしれないが、主に使われているのはこの2つくらいなようだ（[W3C では拡張子を .webmanifest としている](https://www.w3.org/TR/appmanifest/#x13-1-media-type-registration)）。

```conf:httpd.conf
<Files ~ "^(manifest\.json|site\.webmanifest)$">
    Require all granted
</Files>
```
Truffle でコントラクトの ABI を取得

Truffle でビルド済みのコントラクトの ABI を取得する方法を紹介します。

一番簡単なのは、`./build/contracts` ディレクトリにビルド済みのコントラクト ABI や bytecode が記録されている JSON ファイルがあるので、そこから取得する方法です。

たとえば、`ExampleSmartContract` というクラスをコンパイルすると、`./build/contracts/ExampleSmartContract.json` というファイルができているので、そのなかの `abi` の値をみます。

# サンプルコード
* JavaScript (Node.js) によるサンプルコードです。
* ExampleSmartContract というクラスをコンパイルした場合のサンプルです。

```js
const fs = require('fs');
const contract = JSON.parse(fs.readFileSync('./build/contracts/ExampleSmartContract.json', 'utf8'));
console.log(JSON.stringify(contract.abi));
```

#参考
* http://blog.playground.io/entry/2018/05/05/215347

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Truffle_でコントラクトの_ABI_を取得