OmniAICreator/Qiita-1.07M huggingface dataset:
WatchServiceで特定のファイルを監視したい

たとえば`dir\file.txt`が変更されたことを`WatchService`で検出したい場合、次のようなコードを書きたくなりますが、これは実行時例外(`NotDirectoryException`)が発生します。

```java
var file = Paths.get("dir", "file.txt");
var watcher = FileSystems.getDefault().newWatchService();
file.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
```

[`Path::register`のJavaDoc](https://docs.oracle.com/javase/jp/8/docs/api/java/nio/file/Path.html#register-java.nio.file.WatchService-java.nio.file.WatchEvent.Kind:A-java.nio.file.WatchEvent.Modifier...-)にもある通り、`WatchService`の登録対象はディレクトリです。あるいは`WatchService`は登録したディレクトリの配下にあるファイルやディレクトリに発生したイベントを監視している、と言い換えてもいいでしょう。よって特定のファイルのイベントだけを検出したい場合は、たとえば次のような工夫が必要になります。

```java
var file = Paths.get("dir", "file.txt");
var directory = file.getParent();
var watcher = FileSystems.getDefault().newWatchService();
directory.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);

// 割り込みなどで中断するまで、file.txtを監視し続ける。
while (true) {
    var watchKey = watcher.take();
    for (var event : watchKey.pollEvents()) {
        var modified = (Path) event.context();
        if (modified.equals(file.getFileName())) {
            // Do Something
        }
    }
}
```

`WatchEvent::context`でイベントが発生したエントリの情報を取得できます。`WatchEvent::context`の戻り値は`Object`ですが、実態としては`Path`オブジェクトが返ってくるので、上記の例ではキャストして、変数`modified`としています。

また`modified`に格納された`Path`オブジェクトは、`WatchService`に登録されたディレクトリからの相対パスになっています。要するに`var modified = Paths.get("file.txt");`となっているため、`equals`などで比較する場合は注意する必要があります。
Mysql CASE構文について（メモ）

SQL文の中で条件分岐する必要がありましたので、SQL文で記述する方法についてメモ。

### CASE構文
```
CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE
```

条件分岐を行いたい時に,CASE〜始まる記述になります。WHENでは、通常WHERE句で使われるような記述で書くことができます。カラム名を指定して、値がどのような状態であるかを指定します。THEN以降で条件を満たした時に出力する値を指定します。

mysqlについて
https://aqua-engineer.com/category/%E9%96%8B%E7%99%BA/%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9/mysql/

mysql仕組みについて
https://aqua-engineer.com/post-422/
ひとまず Hello, World!

#Qiita
Qiitaはじめました。

#Haskell
関数型言語のHaskellやってみようとしたが、諸事情によりScalaになってしまった。

#JRE
>java -version
1.6だったからJRE1.8をインストールしてみた。

#sbt
GUI派なんだけど、諸事情によりsbtインストール
(略)
compile/runしてHello,World!
Bedrock Dedicated Server 1.7.0にてLinuxのライブラリエラーが起こった

先日リリースされた、BDS 1.7.0のLinux(Ubuntu 16.04)にてエラーが起こった。

#注意
初稿で内容に大幅な誤りがありました、修正したのですがご注意ください。

#症状

```
/foo/bedrock_server: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.27' not found (required by /foo/bedrock_server)

/foo/bedrock_server: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.22' not found (required by /foo/bedrock_server)
```

解決はgccだとか、libstdc++6 を更新すればよい。

#libstdc++6の更新
```shell:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update -y
sudo apt upgrade -y
```

#glibc2.27の更新
```shell
ldd bedrock_server
./bedrock_server: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.27' not found (required by ./bedrock_server)
```

ふむふむ。

これ　 http://ubuntu.cs.utah.edu/ubuntu/pool/main/g/glibc/libc6_2.27-3ubuntu1_amd64.deb

をダウンロードして、data.tar.xzの中の　./lib/x86_64-linux-gnu/から
libm.so.6とlibm-2.27.soを
bedrock_server（実行ファイル）と同ディレクトリに設置した上で、

```shell
LD_LIBRARY_PATH=. ./bedrock_server
```
コピペすれば完了。

/libにあるやつよりも先に、新たに設置されたやつよりも優先的に読み込みます。

コレで直るはず。

#参考
https://qiita.com/miyagaw61/items/98a881409ab7cb960aa7
Django　日本語名のファイルアップロード

# 'ascii' codec can't encode character
Djangoで日本語のファイルをアップロードしたらPythonでよく見る文字コードエラーが返ってきた。
![SnapCrab_NoName_2018-10-18_17-13-0_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/218921/eb92689b-3d48-77d5-4f01-e39a30f33c5e.png)

`'ascii' codec can't encode character in position :ordinal not in range()`

アップロードするファイル名を英数字にするとエラーが起きなかった。

そこでファイル名を処理する箇所で`encord`やら`decode`をしたけれどうまくいかなかった。
(今思えばとても無駄なことをしていた)

テスト環境の
`python manage.py runserver`
では問題なく動作していたのでもしかしたら本番環境のapacheが原因なのかもしれないと思って調べたら、apacheはデフォルトだとCロケールで起動するので変更しなければならないらしい。

# 解決方法
自分の環境はCentOS7だったので`/etc/sysconfig/httpd`に環境変数を設定した。

```configuration:/etc/sysconfig/httpd:
export LANG='en_US.UTF-8'
export LC_ALL='en_US.UTF-8'
```
とりあえずこれで解決した。

後々、公式のドキュメントに書いてあるのを見つけて泣いた…
https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/modwsgi/
[ 作成中]Numpy使い方メモ

##はじめに
KaggleのGStoreコンペのKernelで使用されていたNumpyについて、使い方を備忘録として記載します。


##Numpy Basics Cheat Sheet
Numpyの基本的な使い方は以下の画像を参考にしてください。
![numpy_cheat_sheet.png](https://qiita-image-store.s3.amazonaws.com/0/277948/00ede62e-b747-4b90-d900-ea57fe175a9c.png)

[引用]https://becominghuman.ai/cheat-sheets-for-ai-neural-networks-machine-learning-deep-learning-big-data-678c51b4b463


##平方根を求める
###sqrt

```python:Python
>>> import numpy as np
>>> np.sqrt(7) # 7**0.5と同等
2.6457513110645907
```
##データ型指定
int64　64ビットの符号付き整数


##expm1
***expm1(x) は e の x 乗から 1 を引いた値を返します。***
非常に小さな x で exp(x) - 1 を計算すると、減算により桁落ちしますが、expm1関数は精度を保ちます。

下のサンプルコードでは x = 1.0e-5 として、exp(x) - 1 と numpy.expm1(x) を計算させています。
※以下のような単純な計算では、Pythonに標準搭載されているMath関数の方が処理時間は速いです。

```python:Python
import numpy as np
a = np.exp(1.0e-5)-1
b = np.expm1(1.0e-5)

print("a =", a)
print("b =", b)
a = 1.0000050000069649e-05
b = 1.0000050000166667e-05
```

#log1p
***expm1の逆数であるlog(1 + x)***
1を加えた底eの自然対数
[Windows]PHP7系のMySQL接続でCall to undefined function mysql_connect()エラーの解決策


### はじめに
エラー、つらいですよね。（唐突）
まさに今タイトルのエラーで数時間消耗したばかりのぼくです。
ほんとにつらかった。。

解決策がしょうもなさすぎるためかググっても全然出なくて完全に詰んでたので一応メモしておきます。

### 環境
Windows 8.1
PHP 7.2.10
MySQL 5.7

### エラーについて
タイトルの通り、
`Fatal error: Uncaught Error: Call to undefined function mysql_connect() in hogehoge~`
ってやつです。

### 解決策
php.iniのextension=mysqliのコメントアウトを外す

### おわりに
はい、これだけです。
内容薄くてごめんなさい。
そして多分これは数ある原因の内の１つだと思うので助けにならなかったらごめんなさい。。

ちなみにこれはただの言い訳ですが、解決までにすごく時間がかかった理由として、これ、WordPressの環境構築で起きたんですよね。
で、WordPressも初めてだし、Apacheも初めてだし、MySQLも初めてだし、PHPも初めてだしで、もう何が原因か分からなくて。
このエラーの前にApacheの設定でハマってたこともあり、どうせその辺だろうと思ってPHPに対して油断してたら後ろから刺された感じですね。
お前だけは味方だと思ってたのに。。裏切ったな！的なね。
今後は誰のことも信じずに全てを疑ってかかろうと思いました。

以上です。ではでは。
VR体験の３６０パノラマイメージ

## VR体験のイメージ
今回ふれあいまつりのために奥多摩日本語学校のプロジェクトはVR体験です。VR体験についていろいろな部分を必要です。もう１つ一番必要な部分をパノラマイメージです。パノラマイメージは遠景や動いている風景を表わす。今回のVR体験のパノラマイメージは4つがあります。

- 奥多摩日本語学校　：
　奥多摩日本語は私たちの学校だからちょっと紹介したいと思います。
- インドネシア　：
　インドネシアのパノラマイメージはボロブドゥール「です。なぜボロブドゥールですか？ボロブドゥールは一番有名仏教の遺跡です。
- フィリピン　：
　ナクパンビーチは本当に綺麗な海ですので、学生たちはフィリピンから行きましたから、ナクパンビーチは紹介したいです。
- 奥多摩観光のスポット　：
　奥多摩は本当に綺麗な場所です。なぜ奥多摩に選びましたか？　私たちの目的は奥多摩の観光スポットを紹介したいです。”奥多摩は綺麗ですね”、このフレーズはお客さんから聞きたいです。

***プロセス***
まずアイデアを決めた後に、イメージを探します、どんなイメージですか、イメージはググルストリートからです。できるのためにググルストリートのイメージを他のサイトでパノラマイメージになるためにリンクコピーしてそのウェブサイトからパノラマイメージをダウンロードすることができます。コンバーターのウェブサイトは[インスタントストリートビュー](https://www.instantstreetview.com/)です。

ダウンロードの後はフレームワークの中に追加します。方法はHTMLと同じです。

```html
<a-scene>
  <a-assets>
    <img id="my-image" src="image.png">
  </a-assets>
</a-scene>
```

###結果###

###リンク###
[全体のふれあいまつりのプロジェクト](https://qiita.com/e-hirasawa/items/855af4ba63827f3a679a)
[VR体験のスケジュール](https://qiita.com/harfendybit/items/245976c9f5d6c96fab72)
[VR体験のガイドの声](https://qiita.com/zuu/items/9fb8cc8bd5331b366d38)
[MixPad](https://www.nch.com.au/mixpad/index.html)
[Github](https://github.com/zuhairiBIT/360PanoramaVR)
Javascript[基礎]をまとめてみた

ProgateでJavascriptの勉強をしたので、自分の気になる部分のみまとめてみました

●変数
let 変数名
変数を更新する場合は、letは不要

●定数
const 定数名

●テンプレートリテラル
文字列全体をバッククォートで囲む必要がある
例）console.log(“こんにちは${name}さん”);
【“の部分は、バッククォートになります。】
●if文
if(条件式) {
　　処理
}
セミコロンは不要
・条件を加える場合は、else if
・且つは&&、又はは、||

●switch文
switch (条件の値) {
    case 値１:
       「条件の値」が「値１」と等しい時の処理
　 break;
　・以下、分岐の数だけcaseを追加していく

   ・breakはswitch文を終了させるための命令
 
default:
    処理
　 break;
・defaultは、if文のelseに似たようなもの
}

●while文
while (条件式) {
　処理
}
セミコロンは不要

●for文
for (変数の定義;条件式;変数の更新) {
  処理
}

●関数
＊関数の定義
const 定数名 = function(引数名){
  まとめたい処理
}

[アロー関数]
const 定数名 = (引数名)=>{
  まとめたい処理
}
functionの部分をこのように代えてもOK

＊関数の呼び出し
定数名(値);

●クラス
class クラス名 {
  constructor(引数名){
    this.プロパティ名 = 値
}
メソッド名(引数名) {    
    行いたい処理
}
}
・クラス名は基本的に大文字で始める
・constructorは、インスタンスを生成するときに実行したい処理や設定を追加するための機能
・constructorの中で、「this.プロパティ名 = 値」とすることで、生成されたインスタンスにプロパティと値を追加できる
・メソッド内でインスタンスの値を使うには、this.プロパティ名とする
・「this.メソッド名()」とすることで、同じクラスの他のメソッドを使うことができる

・クラスの定義の後で、「export default クラス名」とすることで、そのクラスを他のファイルでも使うことができるようになる
・他のファイルに定義されているクラスを使用するには、使用するファイルの先頭で、「import クラス名 from “./ファイル名」とする
・クラスの継承は、「class 子クラスのクラス名 extends 親クラスのクラス名」とする
・親クラスと子クラスで同じ名前のメソッドがあった場合、子クラスのメソッドが優先して使用される（これをオーバーライドという）
・constructorもオーバーライドすることができる
ただし、その場合には、１行目に「super()」と記述する必要がある
OpenSSLでSSLサーバ証明書の検証をする方法

# はじめに
Webサーバへ設定するSSL/TLS証明書を設定する際、中間証明書やクロスルート証明書を設定する場合に、設定したい証明書が本当に正しいかを検証したいとき、OpenSSLを使用して検証する方法に手間取ったので備忘として記載。

## 用意するもの
- サーバ証明書
- 中間CA証明書
- クロスルートCA証明書 (※必要な場合のみ)
- ルートCA証明書

## 1. 証明書の準備
各種証明書を作業用ディレクトリに集めておきます。

```
$ ls -lR
.:
合計 8
drwxrwxr-x 2 kino8 kino8 4096 10月 18 23:12 cacerts       # (CA証明書用ディレクトリ)
-rw-rw-r-- 1 kino8 kino8 2195 10月 18 22:59 server.crt    # サーバ証明書

./cacerts:
合計 8
-rw-r--r-- 1 kino8 kino8 1647 10月 18 22:59 mid-ca.crt    # 中間CA証明書
-rw-r--r-- 1 kino8 kino8 1200  9月 28  2017 root-ca.crt   # ルートCA証明書
```

## 2. CA証明書へシンボリックリンクを張る
OpenSSLの仕様[(※)](## 備考：CA証明書のファイル名の規則)で、チェーン検証に使用するCA証明書は`証明書ハッシュ値.0`というファイル名でないと認識してくれないため各証明書にそれに応じたシンボリックリンクを作成します。

```
$ cd cacerts
$ ln -s mid-ca.crt "$(openssl x509 -hash -noout -in mid-ca.crt).0"
$ ln -s root-ca.crt "$(openssl x509 -hash -noout -in root-ca.crt).0"
```

### 最終的なディレクトリ内容

```
$ ls -lR
.:
合計 8
drwxrwxr-x 2 kino8 kino8 4096 10月 18 23:05 cacerts
-rw-rw-r-- 1 kino8 kino8 2195 10月 18 22:59 server.crt

./cacerts:
合計 8
lrwxrwxrwx 1 kino8 kino8   11 10月 18 23:05 2e5ac55d.0 -> root-ca.crt   # ルートCA証明書(リンク)
lrwxrwxrwx 1 kino8 kino8   10 10月 18 23:00 4f06f81d.0 -> mid-ca.crt    # 中間CA証明書(リンク)
-rw-r--r-- 1 kino8 kino8 1647 10月 18 22:59 mid-ca.crt
-rw-r--r-- 1 kino8 kino8 1200  9月 28  2017 root-ca.crt
```

## 3. 検証する

`openssl verify`コマンドを使用して、サーバ証明書の検証を行います。
`-CApath`には、各CA証明書とリンクが格納されたディレクトリを指定します。

```
$ openssl verify -CApath ./cacerts server.crt
```

### OKの場合

下記のようなOKのメッセージが出力されれば、`-CApath`でした配下にあるCA証明書で証明書チェーンに問題はないことになります。

```
server.crt: OK
```

### NGの場合

下記のようなエラーが表示される場合は、チェーン検証に使用した中間orルートCA証明書が誤っているか、必要なCA証明書が不足していると思われます。

```shell
error 2 at 1 depth lookup:unable to get issuer certificate
```

---

## 補足：CA証明書のファイル名の規則

`men verify`でマニュアルを確認すると、以下のように記載されています。

>       -CApath directory
>           A directory of trusted certificates. The certificates should have names of the form: hash.0 or
>           have symbolic links to them of this form ("hash" is the hashed certificate subject name: see the
>           -hash option of the x509 utility). Under Unix the c_rehash script will automatically create
>           symbolic links to a directory of certificates.


検証用のCA証明書のファイル名は何でもよいというわけではなく、***証明書のハッシュ値に.0という拡張子を付けたファイル名***で保存するか、***証明書へそのような名前を付けたシンボリックリンクを張る***必要があるようです。

OpenSSLでは証明書のハッシュ値は以下のコマンドで計算が可能です。

```shell
$ openssl x509 -hash -noout -in 証明書ファイル名
```
React「context API」を一筆書き。

# あらすじ

context APIとライフサイクル(componentDidMount)をあわせた、簡単な記事としてとりあえず書きたかった。
解説はまた別の機会にします。

# 注意点

この記事はReact 16.3以降で使える実装です。
React 16.2以前は、[別の実装方法](https://reactjs.org/docs/legacy-context.html)になり現在非推奨です。


# 実装

実用的というより、基本を抑えるイメージで書きました。

```jsx
import React from "react";
import ReactDOM from "react-dom";
import { compose, withStateHandlers, lifecycle } from "recompose";
import "./styles.css";

const { Provider, Consumer } = React.createContext();

function App(props) {
  return (
    <Provider value={{ color: props.color }}>
      <div className="App">
        <h1>Hello CodeSandbox</h1>
        <Consumer>
          {({ color }) => (
            <h2
              style={{
                backgroundColor: color
              }}
            >
              {color}
            </h2>
          )}
        </Consumer>
      </div>
    </Provider>
  );
}
const enhance = compose(
  withStateHandlers(
    {
      color: "red"
    },
    {
      handleColor: (state, props) => color => {
        return { color };
      }
    }
  ),
  lifecycle({
    componentDidMount() {
      const { handleColor } = this.props;

      setTimeout(() => {
        handleColor("blue");
      }, 1000);
    }
  })
);
const Main = enhance(props => <App {...props} />);

const rootElement = document.getElementById("root");
ReactDOM.render(<Main />, rootElement);
```
slim プロトタイプに必要　form  テーブル　ボタン　navbar



## form forの書き方

```
= form_for @log, html: { class: "form"} do |f|
  = f.text_field :title, class: 'log_title'
  = f.text_field :log, class: 'log'
  = f.text_field :tag, class: 'log_tag'
  = f.file_field :image, class: 'log_image'
  = f.submit
```

## from forで送るときの値　中身

```
"log"=>
  {"title"=>"safa",
   "log"=>"asf",
   "tag"=>"asf"},
 "commit"=>"Create Log",
 "controller"=>"logs",
 "action"=>"create"}
```

# requireの目的　
　この入れ子になっているモノを分ける
```

 params.require(:log).permit(:title, :log, :tag)
```
Blockchain技術：分散型アプリケーション (Dapps)の革命

ブロックチェーンは多目的な技術です。様々なアプリケーションを作ることができます。この記事でいくつか例を紹介します。

## 自己紹介
こんにちは、サム （[@sbenemerito](https://twitter.com/sbenemerito)） です。奥多摩の留学生です。日本語とブロクチェーン技術を勉強しています。２０１８年１０月に日本にフィリピンから来ました。

## 分散型アプリケーション (Dapps) とは
Dappsは「Decentralized Applications」の略で分散型アプリケーションという意味です。このアプリケーションはブロクチェーン技術を使って作ります。

__記事__
https://bitdays.jp/dapps/

### ENJIN (エンジン)｜ゲーム産業、アセットマネージメント

<a href="http://www.youtube.com/watch?feature=player_embedded&v=OCeg_i782f0
" target="_blank"><img src="http://img.youtube.com/vi/OCeg_i782f0/0.jpg" alt="Enjin video" width="480" height="360" border="10" /></a>
<sup>（YouTubeビデオを見るには、イメージをクリックしてください）</sup>

ENJINはゲーム専用の暗号通貨です。「ERC-721」や「ERC-1155」を使って作ります。ゲームの資産の管理をより簡単に安全な形で交換できます。そして、暗号通貨にゲームの資産を変換できます。このアプリケーションは分散型ゲーム産業における革命をもたらす可能性があります。

__オフィシャルサイト__
https://enjincoin.io/

### Etheremon (イサーモン) | ゲーム、デジタル資産

<a href="http://www.youtube.com/watch?feature=player_embedded&v=XOqEmAwJc-4
" target="_blank"><img src="http://img.youtube.com/vi/XOqEmAwJc-4/0.jpg" alt="Golem video" width="480" height="360" border="10" /></a>
<sup>（YouTubeビデオを見るには、イメージをクリックしてください）</sup>

Etheremonもポケモンのように、コレクターは架空の生物を集められます。Etheremonに、架空の生物はデジタル資産です。この資産は「ERC-721」を使って作りました。そして、売買することができます。

__オフィシャルサイト__
https://www.etheremon.com/

### Golem (ゴーレム)｜分散コンピューティング

<a href="http://www.youtube.com/watch?feature=player_embedded&v=_Q888b0VRx8
" target="_blank"><img src="http://img.youtube.com/vi/_Q888b0VRx8/0.jpg" alt="Golem video" width="480" height="360" border="10" /></a>
<sup>（YouTubeビデオを見るには、イメージをクリックしてください）</sup>

Golemは余分なコンピューティングパワーをP2Pで取引する分散型コンピューティングプラットフォームです。リクエスターはプロバイダーからコンピュータリソースを購入できます。これにより、自分の能力以上の計算を実行できます。

__オフィシャルサイト__
https://golem.network/

__アーキテクチャ__
https://blog.golemproject.net/golem-architecture-bfd75faa8ecc

### Storj (ストーリジ) | データ

<a href="http://www.youtube.com/watch?feature=player_embedded&v=vl3bUzfn2lg
" target="_blank"><img src="http://img.youtube.com/vi/vl3bUzfn2lg/0.jpg" alt="uPort video" width="480" height="360" border="10" /></a>
<sup>（YouTubeビデオを見るには、イメージをクリックしてください）</sup>

Storjは暗号化された分散型クラウドストレージ。このプラットフォームはブロックチェーン技術とP2Pに基づいた。だから、安全でプライベートです。

__オフィシャルサイト__
https://storj.io/

### uPort (ユーポート) | IDサービス
<a href="http://www.youtube.com/watch?feature=player_embedded&v=talCRzqK9-c
" target="_blank"><img src="http://img.youtube.com/vi/talCRzqK9-c/0.jpg" alt="uPort video" width="480" height="360" border="10" /></a>
<sup>（YouTubeビデオを見るには、イメージをクリックしてください）</sup>

[ConsenSys社](https://consensys.net/)のuPortは分散型のデジタルIDサービスです。イサーリアムブロクチェーン上で作りました。このアプリケーションは分散型ID産業における革命をもたらす可能性があります。

__オフィシャルサイト__
https://www.uport.me/

## 結論
現在、様々な産業において多くのアプリケーションはブロックチェーン技術を応用しています。「[DappRadar](https://dappradar.com/)」と「[State of the Dapps](https://www.stateofthedapps.com/)」に たくさん例を見ることができます。
laravelの認証機能を試す

##laravelの認証機能を試してみます。

###1.phpの設定

認証にデータベースを使うので、php.iniを編集します。今回はpostgreSQLを使います。
php.iniを開いて、「;extension=pdo_pgsql」のコメントを外します。

```php.ini
extension=pdo_pgsql
```

###2.データベースの作成

認証のためのテーブルを格納するデータベースを作成します。
わかりやすいように「laraveldb」としてます。

```
create database laraveldb
```

###3.プロジェクトの作成

composerを使ってプロジェクトを作成します。「myproject」とします。

```
composer create-project --prefer-dist laravel/laravel myproject
```

###4.myprojectの設定

####(1)myprojectフォルダに移動

```cmd.prompt
C:\data\php>cd myproject
```
####(2)「.env」ファイルを編集します。

```　.env
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=laraveldb
DB_USERNAME=testuser
DB_PASSWORD=xxxxxxxxxxxxxxxx
```

###5.migrate

コマンドプロンプトでプロジェクトフォルダに移動し「php artisan migrate」を実行します。
実行します。

```cmd.prompt
C:\data\php\myproject>php artisan migrate
```

###6.認証機能を追加する。

プロジェクトに認証機能を追加します。

```cmd.prompt
C:\data\php\myproject>php artisan make:auth
```

以上で、認証機能を使うための設定は完了です。

###7.動作確認

####(1)WEBサーバを起動します。

```cmd.prompt
C:\data\php\myproject>php -S localhost:8000 -t public
```

####(2)ユーザの登録画面にアクセス

http://localhost:8000/register

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/30b8bbfb-6c9d-ed55-5d5c-70cfc22aebd3.png)

###(3)ユーザを登録する。

ユーザを登録するとログイン認証が行われる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/55592ab0-706a-7b39-3d6e-d43357b2a0a8.png)

###(4)ログアウトしてみる。

画面右上に表示されているユーザ名をクリックすると、「logout」のメニューが表示されるので選択してログアウトする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/a777ad4a-3854-983c-9c3a-7d3a2c263cd2.png)


###(5)ログインしてみる

LOGINボタンをクリックしてログインしてみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/75757836-f440-0f2a-ed9c-fdd5e763cf41.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/246741/eb24c5ed-d2bd-a39a-e3f6-1abf5ca11abc.png)

Laravelでは認証機能も一通りそろっていますね。実際には画面をカスタマイズする必要があると思いますが認証機能の実装にあまり手間がなさそう。非常にいいです。
BLOCKCHAIN製品（DApps）の例

今日では、分散アプリケーションについて説明します。 Blockchainをもっと分かるため、リアルアプリケーション（DApps）にも見ていく必要があります。

# DAppsとは
分散アプリケーション（DApps）は、ブロックチェーン技術を使用して構築されたアプリケーションです。 Blockchainの詳細については、このリンクを見てください: https://blockgeeks.com/guides/what-is-blockchain-technology/

たくさんDAppsがあります。でも、このアプリケーション間には共通の特徴があります。 ここに特徴：

**オープンソース** (Open Source)
それは自治によって処理されるべきである。 アプリケーションを変更するためのコンセンサスが必要です。

**分散型** (Decentralized)
アプリケーションのデータを社会分散ブロックチェーンに格納する必要があります。 これは集中化を避けるためです。

**インセンティブ化** (Incentivized)
ブロックチェーンのバリデータには報酬を与えるべきです。

**プロトコル** (Protocol)
コミュニティは、価値の証明を示す暗号アルゴリズムに同意しなければなりません。

# DAppの例
ここにDAppsの例があります。これらは実際に使用できるアプリケーションです。 さらに詳しい情報はウェブサイトをご覧ください。

## Golem
ゴーレムは誰かアクセスできる分散型スーパーコンピュータです。 それは、アイドルコンピュータ電源のための最初のグローバル市場を作ることを目指しています。 これはコンピューティングパワーの共有コミュニティを作りします。 開発者に柔軟で安価なコンピューティングパワーを提供します。ゴーレムは、ブロックチェイン技術を使って新しいものを作ることを目指しているので面白いです。

**ウェブサイト**: https://golem.network/

## Status
スタツスはあなたの携帯電話をETHEREUMネットワークのクライアントに変換します。 どこでもETHEREUMにアクセスできます。 興味深いのは、ユーザーが独自のメッセージングシステムを使用してSMART CONTRACTSと支払いを送信できるためです。

**ウェブサイト**: https://status.im/

## Brave
BRAVEはブラウジングを迅速かつ安全に行うウェブブラウザです。 これは、サードパーティトラッキングからあなたを保護します。 広告を有効にしてコンテンツ作成者をサポートすれば、トークンを獲得できます。 これは単なるアプリケーションではなく、ブラウザであるため興味深いです。

**ウェブサイト**: https://brave.com/

## Etheria
ETHERIAは、プレーヤーがタイルを所有できるMINECRAFT-LIKEゲームのようなものです。 あなたはタイルからブロックを獲得し、それを使って物を造ることができます。 Etheriaは”entire state of the world is held in and all player actions are made through the decentralized, trustless Ethereum blockchain”と言っていました。これはブロックチャインがゲームにも適用できることを見ることができるので興味深いです。

**ウェブサイト**: http://etheria.world/

## Eth-Tweet
ETH-TWEETは、ETHEREUMネットワークで動作しているプロトタイプのマイクロブログサービスです。 メッセージを投稿するための基本的なTWITTER-LIKE機能を提供します。 これは、古い中央集中型システムがBLOCKCHAIN技術を採用しているのを見ると興味深いです。

**ウェブサイト**: http://ethertweet.net/ui/

# まとめ
ご覧のとおり、BLOCKCHAINを使用して作成されたさまざまなアプリケーションがあります。 これは、BLOCKCHAINが普及しており、より多くの人々がそれを採用していることを示しています。 この記事はいくつかの例を示していますが、BLOCKCHAINが提供できるものはまだまだたくさんあります。

ソース:
https://blockgeeks.com/guides/dapps/
https://www.coindesk.com/7-cool-decentralized-apps-built-ethereum/
踏み台をいくつか経由した上でSSHポートフォワーディング

# 概要

次のような構成において、Clientから直接RemoteServiceにアクセスしたい。

![多段SSH_ポートフォワーディング.png](https://qiita-image-store.s3.amazonaws.com/0/115524/bd9ddf5d-175b-348a-024a-2e0149b2c20b.png)

どういうことかというと、RemoteServiceはNW内（図中の外部NW）からのアクセスしか許可されていない。例えば踏み台2からならアクセスできるが、図中の内部NW（Client、踏み台1）からはアクセスできない。


# 方針
多段SSHとSSHポートフォワーディングを使う。

Clientから自身の10080番ポートにアクセスすると、RemoteServiceの80番ポートにつながるように設定する。

# 設定

Clientの`~/.ssh/config`に下記を設定する。

```text:~/.ssh/config
Host fumidai-1
    HostName [踏み台１のIPアドレス]

Host fumidai-2
    HostName [踏み台2のIPアドレス]
    ProxyCommand ssh -W %h:%p fumidai-1
```

その上で、下記コマンドを実行する。

```
$ ssh -f -N -L 10080:[RemoteServiceのIPアドレス]:80 fumidai-2
```

[RemoteServiceのIPアドレス]は、fumidai-2からアクセス可能なものを指定する。今回の例では、RemoteServiceホストのプライベートIPアドレスになるはず。

# 試してみる

Clientにて下記を実行する。

```
curl localhost:10080
```

# トラブルシューティング
## 10080番ポートつながらない
ローカル（Client）はLISTENしている？
確認：Linuxなら`netstat -nltp`、Macなら`lsof -i -P -n`。

## 認証のエラーになる
ローカル（Client）から`ssh fumidai-1`および`ssh fumidai-2`ができる？

### できない場合
* 踏み台サーバのSSHのログをみる(RedHat系なら`/var/log/secure`、Ubuntuなら`/var/log/auth.log`)
* 踏み台１、踏み台2のユーザの設定を確認する
    * ユーザ名が揃っているか
    * ローカル（Client）で使用している秘密鍵のペアとなる公開鍵が正しく設定されているか
* ssh-agent周りを確認する
    * ローカル（Client）にある秘密鍵を使って、踏み台1を超えて、踏み台2にログインするためにはssh-agentの力を借りる必要がある
    * Macならデフォルトで起動しているはず


### できる場合
* RemoteServiceホストで、サービス起動している？（そもそも）
* 他に何かあるかな…？


## ClientがWindows
GitBashを使って、同様の手順で成功することを確認した。
ssh-agentの起動で一癖あったので、気をつける。（https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#adding-your-ssh-key-to-the-ssh-agent）



以上です。
Powershellで調整さんを自動で出力

初投稿
自分用のメモを兼ねてQiitaを登録してみました。
テスト投稿として直近で作ってみたスクリプトを書いてみます。体裁はほかの人の参考に後々修正したいと思います。

スクリプトの内容：
「調整さん」という出欠表管理サイトに次の週の火曜日～月曜日分の調整さんを自動で生成してくれます。

作った背景：
「調整さん」は カレンダーをクリックすれば自動でテキストボックスに日付と開始時間が入力されていくのですが
 開始時間が「19:00〜」で固定されており、毎週調整さんを生成している人がイラついていたため作ってみました。


------------------------------------------------------------------------------------

```powershell
#PSVersion　5.1.14409.1012　動作確認

$event_name = "event_name"
$set_schedule = $null

#来週の火曜の日付を取得してセット
$Date = get-date
$N = 2 #$N = 0:日 ? 6:土   火曜日は2
$next_week = ($Date).AddDays(7 - ($Date).DayOfWeek.value__ + $N) | % {get-date($_)}

$objIE =  New-Object -ComObject InternetExplorer.Application

$objIE.Visible = $true #IEを表示
$objIE.navigate('https://chouseisan.com/') #IEでURLを開く
while($objIE.Busy) { Start-Sleep -milliseconds 100 }

$htmlDoc = $objIE.document #objIEで読み込まれているHTMLドキュメントをセット
 
$text_value = $htmlDoc.getElementById("name") #イベント窓をセット
$text_value.setattribute("value",$event_name) #イベント窓にキーワードを入力

for ($i = 1; $i -le 7; $i++)　#再来週の火曜日までのスケジュールテキストを作成
{ 
    if ($i -ge 2 -and $i -le 3)
    {
        $set_schedule += ($next_week).tostring("MM/dd (ddd) ") +"21:30～`r`n " #時刻窓に入れるテキスト作成(水木)
    }else{
        $set_schedule += ($next_week).tostring("MM/dd (ddd) ") +"21:00～`r`n " #時刻窓に入れるテキスト作成(水木以外)
    }
    $next_week = get-date($next_week).adddays(1)
}

$text_value = $htmlDoc.getElementById("kouho") #時刻窓をセット
$text_value.setattribute("value",$set_schedule) #時刻窓にキーワードを入力

$elForm = $htmlDoc.getElementById("createBtn") #ボタンクリックIDをセット
$elForm.click() #クリック
```
Angularでyamlを読み込んだ時に改行を反映させる

Angularなどのフレームワークを使って，yamlのデータをhtmlに表示させるには，通常以下のようにする．

```
<p>{{labels.hogehoge}}</p>
```

yamlは

```yaml
labels: 
  hogehoge: ほげほげ
```
みたいな感じ．
ただ，ここで改行を含む文字にしようと，

```yaml
labels: 
  hogehoge: |
  ほげ
  ほげ
```
のようにしても，改行されず普通にほげほげと表示されてしまう．
改行を反映させるには，CSSで

```css
p{
  white-space: pre-wrap;
}
```
とするか，改行タグをyamlの文字列に埋め込み，以下のようにinnerHtmlとして読み込ませると改行が反映される．

```
labels: 
  hogehoge: ほげ<br>ほげ

<p [innerHtml] = "labels.hogehoge"></p>
```
Rails アソシエーションのhas_many・belongs_toについてまとめてみた

#アソシエーションとは
２種類のテーブルを関連付けさせること。
関連付けをすることにより、簡潔にコードをまとめることができます。
テーブル同士の関係には、「1:1」「1:多」「多:多」の3つの関係があります。
今回は「1:1」「1:多」の関係を表す時に使われるアソシエーションの「has_many」「belongs_to」
をまとめてみました。

##has_many
◯◯が複数の△△を所有しているという関係を表す時に使うアソシエーション。

##belongs_to
△△が◯◯に従属するという関係を表す時に使うアソシエーション。

##使い方
user登録ができる投稿アプリの場合

 ```ruby:user.rb
class User < ApplicationRecord
  has_many :posts, dependent: :destroy
end
```

```ruby:post.rb
class Post < ApplicationRecord
  belongs_to :user
end
```

```ruby
@user.destroy
```
上記のように関連付けしたことで、user情報と、そのuserの投稿をまとめて削除するコードを簡潔に書くことができます。

##参考サイト
[Active Record の関連付け (アソシエーション) | Rails ガイド](https://railsguides.jp/association_basics.html)
[Rails モデルの関連付け(アソシエーション) - Qiita](https://qiita.com/To_BB/items/47d2c7b1bc3513025d7b)
[【Rails入門】has_many、belongs_toの使い方まとめ](https://www.sejuku.net/blog/26617)
【MySQL】datetime型など日付の加算・減算はdatediffを使う

先日、SQLで「前後２日以内のレコードを取得したい」と思い、datetime型の加減算を行ったところ、想定外の件数が返ってきてサーバーのメモリを食いつぶしかけました・・・:sweat_drops:
その時の失敗記録です。

# n日以内のレコードを取得したかった
スケジュール系のレコードを保持しているテーブルがあり、内容はこんな感じ:arrow_down:

| スケジュール名 | 開始日（datetime） | 終了日（datetime） |
|:-:|:-:|:-:|
| 出張1 | 2018-09-20 13:30:00 | 2018-09-25 24:00:00 |
| 展示会 | 2018-09-23 10:00:00 | 2018-09-29 18:00:00 |
| 休暇 | 2018-09-29 00:00:00 | 2018-10-01 24:00:00 |
| 社内研修 | 2018-09-30 09:00:00 | 2018-10-03 18:30:00 |
| 出張2 | 2018-10-03 19:00:00 | 2018-10-06 16:30:00 |

以前、全件取得しようとしたら、あまりの重さに耐えきれず、DBサーバーが落っこちたのです・・・:droplet:
そこで、「開始日が本日含め前後２日以内」という条件でレコードを取得しようとしました。
なので、本日＝2018/10/01であれば、以下の２レコードが取得できるはず・・・！

| スケジュール名 | 開始日 | 終了日 |
|:-:|:-:|:-:|
| 休暇 | 2018-09-29 00:00:00 | 2018-10-01 24:00:00 |
| 社内研修 | 2018-09-30 09:00:00 | 2018-10-03 18:30:00 |

# NGパターン：現在日時curdate()に対して加減算を実行した
```SQL
select * from xxxTbl
where
  開始日 >= (curdate()-2)      -- ２日前
  and 開始日 <= (curdate()+2)  -- ２日後
;
```
最初に書いたのが、上記:arrow_up:のSQLです。
この書き方の場合、```curdate()```が2018/10/1だと、２日前の日付が正しく取得できていませんでした。
内部ではこのように動いていたようです:arrow_down:

```SQL
select * from xxxTbl
where
  開始日 >= (20181001-2)      -- 開始日 >= 20180999
  and 開始日 <= (20181001+2)  -- 開始日 <= 20181003
;
```
数値として計算してしまったので、```20180999```となってしまい、ありえない日付になってしまいました。
その結果、取得できていたのがこちら:arrow_down:

| スケジュール名 | 開始日（datetime） | 終了日（datetime） |
|:-:|:-:|:-:|
| 出張1 | 2018-09-20 13:30:00 | 2018-09-25 24:00:00 |
| 展示会 | 2018-09-23 10:00:00 | 2018-09-29 18:00:00 |
| 休暇 | 2018-09-29 00:00:00 | 2018-10-01 24:00:00 |
| 社内研修 | 2018-09-30 09:00:00 | 2018-10-03 18:30:00 |
「２日前」の判定が出来なくて、過去データをすべて取得していました。
そりゃあ、DBサーバー落っこちるわ（－－；

だけど、今思うと、datetime型に対して±２って、日付なのか時間なのか、時間だとしても分なのか秒なのかさっぱりわからないですね・・・。
さらにいうと、このSQLを作っていたのが2018/09/15のような月のど真ん中だったため、```curdate()±2```でも正しく数値計算が出来てしまっていたのです。

# OKパターン：datediffを使って現在日時curdate()との差分を取得する
```SQL
select * from xxxTbl
where
  datediff(curdate(), 開始日) <= 2       -- ２日前
  and datediff(curdate(), 開始日) >= -2  -- ２日後
```

```datediff()``` 関数は、２つの日付の差を求める関数です。
第１引数の日付の方が大きければ正の値が返ります。
```datediff()```を使うと、想定通りの結果が取得できました:star:

## datediff()関数の実行結果の具体例
実際に```datediff()```を実行してみると以下のようになります:arrow_down:
月をまたいでいても、正しく計算されていることがわかります。

| 第１引数 | 第２引数 | 結果 |
|:-:|:-:|:-:|
|2018-10-13|2018-09-30 00:00:00|13|
|2018-10-13|2018-10-11 00:00:00|2|
|2018-10-13|2018-10-12 00:00:00|1|
|2018-10-13|2018-10-13 00:00:00|0|
|2018-10-13|2018-10-14 00:00:00|-1|
|2018-10-13|2018-10-15 00:00:00|-2|

# おまけ：テスト不足:cry:
こういう「前後２日以内」みたいな場合は、境界値テストを必ず実施するはずです。
私も、「３日前のレコードは取得できない」など、入念に確認しました。
しかし、月をまたいだ場合・年をまたいだ場合のテストは全く実施していませんでした・・・ :sob:

そもそもの話、テストケースの洗い出しが不十分だったというわけです。
例え、実装の時にこういうバグを仕込んでしまっても、テストで月またぎ・年またぎのケースを実施していれば、気づけたはずだったなぁと。

# 教訓
- MySQLで日付計算をする時は```datediff()```を使う。
- 日付計算をする時は、月や年をまたいだパターンもテストすること。
PL/pgSQLで偶数丸めを実装

#####偶数丸めとは
端数が0.5より小さい場合切り捨て、
端数が0.5より大きい場合切り上げ、
端数が0.5の場合切り捨てと切り上げのうち結果が偶数となる方へ丸める



```round_even.sql
CREATE OR REPLACE FUNCTION test.round_even(
	in_round_number numeric,
	in_exponent int)
    RETURNS numeric
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE 
AS $BODY$

declare
base_number numeric := 10;
even_number numeric := 2;
middle_number numeric := 0.5;
begin

  IF in_round_number IS NULL OR in_exponent IS NULL THEN
    RETURN NULL;
  END IF;

  IF MOD(ABS(in_round_number) * POWER(base_number, in_exponent) ,even_number ) = middle_number THEN
      RETURN TRUNC(in_round_number, in_exponent);
  ELSE
      RETURN ROUND(in_round_number, in_exponent);
  END IF;

EXCEPTION
	WHEN OTHERS THEN
		RAISE NOTICE 'ERROR : % : %', SQLSTATE, SQLERRM;
end;

$BODY$;
```

#####結果

```sssada
test=> select test.round_even(1.4,0);
 round_even
------------
          1
test=> select test.round_even(1.5,0);
 round_even
------------
          2
test=> select test.round_even(1.6,0);
 round_even
------------
          2
test=> select test.round_even(2.5,0);
 round_even
------------
          2
test=> select test.round_even(3.5,0);
 round_even
------------
          4
```

###追記
そもそも、偶数丸めを実装せずとも、realやdouble precision型ではround関数に渡すことにより偶数丸めになります。

```round_even.sql
SELECT x,
  round(x::numeric) AS num_round,
  round(x::double precision) AS dbl_round
FROM generate_series(-3.5, 3.5, 1) as x;
  x   | num_round | dbl_round
------+-----------+-----------
 -3.5 |        -4 |        -4
 -2.5 |        -3 |        -2
 -1.5 |        -2 |        -2
 -0.5 |        -1 |        -0
  0.5 |         1 |         0
  1.5 |         2 |         2
  2.5 |         3 |         2
  3.5 |         4 |         4
(8 rows)
```
参考：[postgres標準ドキュメント](https://www.postgresql.jp/document/11/html/datatype-numeric.html)
【Rails】Herokuにアプリをデプロイする

#最初に
Herokuを使ってデプロイするための自分用まとめです。
まずはデプロイしたいアプリをしっかりgitにpushしよう。

#基本的流れ
1 Heroku側にアプリを作成する

```ruby:
$ heroku create 任意のアプリ名

#例
$ heroku create sampleapp
```
2 ローカルにあるものをherokuにpushする

```ruby:
#masterブランチの内容をデプロイ
$ git push heroku master

#master以外のブランチの内容をデプロイする
$ git push heroku ブランチ名:master
#例
$ git push heroku make_top_page:master
```
3 ページにアクセスして確認する

```ruby:
$ heroku open
```

#エラーへの対処
##本番用DBにPostgreSQLを使っていない
手順2においてローカルの内容をherokuにpushした際、
下画像のようなエラーが出た。
<img width="484" alt="スクリーンショット 2018-10-18 22.07.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/620d77ea-918c-79cd-2591-137d5d5a33bd.png">
Herokuはsqliteに対応していないのにsqliteを使用してしまっているのが原因らしい。

###本番用DBをPostgreSQLにする
Gemfileを書き換えることによって実現する。
Gemfileは、アプリのディレクトリ直下にある。

```ruby:sampleapp/Gemfile
gem 'sqlite3', group: :development
gem 'pg', group: :production
```
sqliteの記述があるあたりを上のように書き換える。

```ruby:
$ bundle install
```
変更したらpushを忘れずに。ターミナルでbundle installをする。
変更するために切ったブランチの内容をherokuにpushするか、
そのブランチをmasterにマージしてからmasterをherokuにpush。

###assetのprecompileができない
<img width="478" alt="スクリーンショット 2018-11-02 19.06.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/8d22d4c4-99e4-714a-cc63-0385a226e2c5.png">

stylesheetにcssファイルがあるといけないらしい。
すべてのcssファイルの拡張子をcssからcss.scssに変更したらうまくいきました。

## マイグレーションを実行していない
新しく作成したページを開いてみたら何かエラーが出て内容が見られない場合、
Herokuでマイグレーションを実行し忘れていることがある。
ターミナルで以下のコマンドを実行。

```
heroku run rake db:migrate
```

私はこれを実行した際、接続時にタイムアウトしてしまったので、
以下を実行してみたらうまくいった。

```
heroku run:detached rake db:migrate
```
なぜこっちだとうまくいったのかはまだ調べられていないので、もしわかる方がいらっしゃれば教えていただきたいです。

ちなみにこの実行直後はまだページを開けなかったが、
1時間ほど時間をおいてアクセスしてみたところ問題なく処理できるようになっていた。
(DBの反映に時間がかかるのでしょうか？)

少々謎な部分が残っているのでそのうち詳しく勉強したいところです。
AWSでEC2からRDSにアクセスできるまでにハマったこと

# そもそもRDSが作られない
createしようとすると以下のエラーが出た。
`VPC must have a minimum of 2 subnets in order to create a DB Subnet Group. Go to the VPC Management Console to add subnets.`
これまでsubnetを作る際にAvailability Zoneを指定してなかったのが原因の模様。
なのでもう一つsubnetをAvailability Zoneを指定して作成すると解決した。

# EC2からアクセスできない
セキュリティグループを確認すると、
もともとアクセスは作業していたPCのグローバルに対してだけアクセスを許可していたため、
VPCのPrivateIPからの接続のルールを追加すると接続できるようになった。

# DBnameがわからない
DBinstanceの名前ではなく、接続できなかった。
調べるとPSQLの場合、デフォルトでpostgresであることがわかった。
```PostgreSQL
The name of the database to create when the DB instance is created. If this parameter is not specified, the default "postgres" database is created in the DB instance.```
https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html
ソフトウェアインストールに必要な権限

```
管理者 = インストールできる
一般ユーザ = インストールできない
```
だと思ってましたが、
実際には

```
管理者 = Program filesにインストールできる
一般ユーザ = Program filesにインストールできないが、自分のフォルダ配下(User/ユーザ名/)にはインストールできる
```
が正解でした。
あと、おそらくレジストリをイジるようなソフトウェアのインストールは管理者のみ可能だと思います。
macOS を Mojave にしたら vagrant から VM が立ち上がらなくなった

## 問題

```
tee: /etc/exports: Operation not permitted
tee: /etc/exports: Operation not permitted
tee: /etc/exports: Operation not permitted
The nfsd service does not appear to be running.
Starting the nfsd service
==> default: Mounting NFS shared folders...

The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
```

NFS の立ち上げでパーミッションがないとか言われてる

## 対処法

GitHub に対処法をあげられてる方がいた
https://github.com/hashicorp/vagrant/issues/10234#issuecomment-424305964

`システム環境設定` > `セキュリティとプライバシー` > `フルディスクアクセス` から iTerm を許可すると動くようになる。macOS付属のターミナルから操作してる場合はターミナルも。

![4cab34be58c3dc2cf8b1280124aa0e04.png](https://qiita-image-store.s3.amazonaws.com/0/26239/3f918da4-e37c-7278-97c1-8872ec037f66.png)
[Swift]TableViewでセルに複数行の文章を表示する方法[ToDoアプリ]



#はじめに

Qiita初投稿です。
サンプルアプリでよく見るtodoリストのアプリを作成してた際に遭遇した、
セル内の文章が途中から・・・と途切れてしまう際の対処法について
書かせていただきたいと思います。

#詳細

tableViewのセルにある程度長い文章を入力すると

![Simulator Screen Shot - iPhone XR - 2018-10-18 at 21.45.16.png](https://qiita-image-store.s3.amazonaws.com/0/303227/13ed4b26-6f5a-cf83-5920-8b6542d1d6b7.png)

この画像のように
・・・で省略されると思います。

#対処法

ググると、結構色々な対処法がでてきたのですが、
個人的に一番簡単だったのが、

```
cell.textLabel?.numberOfLines=0
```

こちらのコードを、下記の場所にいれてあげる方法です。


```
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.numberOfLines=0
        return cell
```


こうすることで、

![Simulator Screen Shot - iPhone XR - 2018-10-18 at 21.48.42.png](https://qiita-image-store.s3.amazonaws.com/0/303227/7e57c7a1-49f2-c1d6-2817-a408f1de35e0.png)

上の画像のように途中から・・・と省略されることなく改行され複数行が表示されます。

#最後に

最後まで読んでくださりありがとうございました。
もしどなたかの為になれれば、幸いです！！
CSVの文字コードを指定する方法(CSVファイルを出力した時に、エクセルで開いた時の文字化けを防ぐ)

##CSVファイルを出力した時に、エクセルで開いた時の文字化けを防ぐ
CSV.generateの引数に下記を付けるだけ。
```(encoding: Encoding::SJIS, row_sep: "\r\n", force_quotes: true)```
Shift_JISにすると文字化けすることなく表示される。

参考：
https://qiita.com/wada811/items/8b73f633f77c0466e9da
curl コマンドでJSONの値を渡す方法(@RequestBody)


@RequestBodyで指定した変数にcurlコマンドでJSONの値を渡す方法

環境 Mac
注) win環境においては、JSONファイルを別で作り読み込む方法だとうまく行くと思います。

java側

     @RequestMapping(value="/post",method=RequestMethod.POST)
      public Person getPerson(@RequestBody Person person){
	        return service.saveAndFlush(person);
	  
      }

コマンド

    curl -X POST -H "Content-Type: application/json" -d '{"id":"1","name":"nameuser","age":"10"}' localhost:8080/person/post
RDSの自動起動で無料枠を超えそうになった話

#AWSの勉強中
AWSの資格を取得しようとAWSの無料枠を使って勉強しております。
その勉強中に「あれっ？？」と思ったことがあります。
#一通のメールを着信
普段はあまり見ないメールなのですが久しぶりに見てみるとAWSからメールが来てました。
「AWS Free Tier limit alert」
英語は苦手でしたが、雰囲気で無料枠を超えそうだと理解しました。
メールを見ると、RDSが無料枠を超えそうだということです。
「普段使わないときは停止しているのに何故に？？」と思った自分はAWSを確認しました。
#RDSが動いてる〜〜
確認してみると停止していたはずのRDSが動いていました。
２台インスタンスがあったのですが、２台とも動いていました。
#原因
なんで動いているんだろうと思いながら再び停止させようとすると
<img width="585" alt="スクリーンショット 2018-10-18 21.46.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/146391/d4ff51c6-048f-48ca-3121-778cf1e14295.png">
こんな注意書きが
どうやら1週間経過すると勝手に動くらしい
自分アホすぎ(涙)
#まとめ
自分の確認不足が原因でこんな結果に
先月700円ぐらい引き落とされたんですがこいつせいです。
まあ、低価格でインフラを提供してくれるAWSはやっぱり神ですね!!

以上
sequel proはmysql8.0系に対応してない！TablePlusを使おう。

RailsのDBを標準のSQliteからmysqlに変更したのですが、エラーの嵐を何とか乗り越え、いざGUIツールでDBを表示させようと思い、評判のよかったsequel proで実行したのですが、クラッシュしてどうにもなりませんでした。

## sequel proはmysql8.0系に対応してない！
そのままです。らしいです。

なので、https://tableplus.io/ を使用しました。
RxSwift Firebase Firestore データ取得メモ

# Firebase FirestoreのデータをRxSwiftで取得するためのメモ
メモなので今後も追記予定

```swift
    func getData() -> Observable<[Model]?> {
        guard let uid = Auth.auth().currentUser?.uid else { return Observable.just(nil) }
        return Observable.create { (observer: AnyObserver<Model?>) -> Disposable in
            Firestore.firestore().document("path to data/\(uid)").getDocument { (document, error) in
                if let error = error {
                    observer.onError(error)
                    return
                }
                guard let document = document, document.exists else {
                    observer.onError( /* データなしエラー */ )
                    return
                }
                // DocumentSnapshottから変換して返す
                let model = try? Model(from: document)
                observer.on(.next(model))
                observer.onCompleted()
            }
            return Disposables.create()
        }
    }
```
## RxFirebaseを使う場合
```swift
    func getData() -> Observable<[Model]?> {
        guard let uid = Auth.auth().currentUser?.uid else { return Observable.just(nil) }
        return database.collection("path to datas").document(uid).rx.getDocument().map(Model.init)
    }
```

## オプショナルをなくす場合
```swift
    func getData() -> Observable<[Model]> {
        guard let uid = Auth.auth().currentUser?.uid else { return Observable.error( /* 定義していた何かのエラー */ ) }
        return database.collection("path to datas").document(uid).rx.getDocument().map(Model.init)
    }
```

## 利用例
Category というモデルがある場合 
Serviceクラスを作成

```swift
class CategoryService {

    private static let database = Firestore.firestore()

    static func getCategories() -> Observable<[Category]> {

       return database.collection("/category")
                .whereField("status", isEqualTo: 1)
                .rx.getDocuments()                  // QuerySnapshot
                .map { $0.documents }               // [QueryDocumentSnapshot]
                .map { $0.compactMap{ doc in return try? Category.init(from: doc) } } // [Category]
    }

}
```

ViewModel はこんな風に

```swift
class ViewModel {

    let categories: Driver<[Category]>
    let error: Driver<Error>

    init () {
         (self.categories, self.error) = Driver.split(result: CategoryService.getCategories().resultDriver())
    }
}
```

```swift
class ViewController: UIViewController {

    @IBOutlet weak var tableView: UITableView!
    private var viewModel: ViewModel!
    let caategories = BehaviorRelay<[Category]?>(value: [])

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        // データ取得
        self.viewModel = ViewModel()

        // カテゴリ情報を bind
        self.viewModel.categories.asObservable()
            .bind(to: self.caategories)
            .disposed(by: rx.disposeBag)

        // カテゴリ情報を bind した後に一覧を更新
        self.caategories.asDriver().drive(onNext: { [unowned self] _ in
            self.tableView.reloadData()
        }).disposed(by: rx.disposeBag)
    }
}
```
Oracle Certified Java Programmer Silver SE 8 を取得 受験体験記

[かなりの前の記事](https://qiita.com/Shi-nakaya/items/bb9cf792f0d6236d730e)で「Oracle Java SE8 Silverの取得を目指して〜」と記載しており、

先月、ようやく有言実行しましたので、
合格までの勉強方法と受験体験記を記載します。

## 私の勉強前のJavaスキル
 - 基本的な文法はわかる(if,for,while,APIの使い方等)
 - 業務上の経験は十数行のソースコードを修正するのみ(7年前)
 - VB.net,PL/SQLなら業務でがっつり実装した経験あり(5年前)
 - 2ヶ月前にプログラミングスクールにて4ヶ月間Javaを受講
 - オブジェクト指向はあんまり(インターフェースとかコンストラクタとか継承とかさっぱり)

プログラミングスクールにて4ヶ月間Javaを受講したアウトプットとして取得を試みました。

## 勉強に使用したテキスト

 - オラクル認定資格教科書 Javaプログラマ Silver SE 8 スピードマスター問題集（以下白本）
<img src="https://qiita-image-store.s3.amazonaws.com/0/265300/d1d24718-b0d6-6222-e2fd-c642b5fc09c2.png" width=30%>

 - 徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応（以下黒本）
<img src="https://qiita-image-store.s3.amazonaws.com/0/265300/3e079a0e-0f5a-0ec5-4aaa-27ddab4012d6.png" width=30%>

 - Javaのオブジェクト指向がゼッタイにわかる本
<img src="https://qiita-image-store.s3.amazonaws.com/0/265300/68884cf4-912c-a6f6-0ccd-b482d15c6506.png" width=30%>

## 勉強期間
一ヶ月間、１日１時間半くらい

## 勉強の流れ

最初の1.5週間で白本を間違えた問題だけを繰り返し5周して
全ての問題を間違えずに解けるように

これで基本的なJavaの文法と問題形式に慣れましたが、
amazonのレビュー等を見ると実際の問題はかなり難しいらしいので

その後、約4日程で黒本を１週しました。
基本的な文法、分岐、ループ、APIの問題はスラスラ解けるし、
間違えても解説を読めば「あーそういうことねー」
って納得できるのですが、

オブジェクト指向の問題だけ
:upside_down: **解 説 を 読 ん で も 全 く 理 解 で き ま せ ん** :upside_down:

インターフェースとかコンストラクタとかの言葉とソースが頭の中で紐づいていない為、
解説を読んでもさっぱり

これはマズイと思い
オブジェクト指向についてしっかりと理解する為、
「Javaのオブジェクト指向がゼッタイにわかる本」
を購入し3日程で読破

するとあら不思議
これまでさっぱりだった黒本のオブジェクト指向の解説が頭に入ってくるように

白本と同じように黒本も1.5週間程かけて
解けない問題がなくなるまで約5周しました。

受験の1週間前から黒本の「総仕上げ問題」を3周して
試験に臨みました。

## 試験結果
88%の正答率で無事に合格(66%で合格)

## 所感
意外と余裕
白本５周は必要なかったかも
黒本の「総仕上げ問題」と類似した問題が多く出題された。
しかし、オブジェクト指向を理解してないと解けない問題がほとんど

現在、転職してJavaを書いていますが、
勉強しておいて良かったなと
本当に思います。（特にオブジェクト指向の概念は本当に助けになっています）

## 次回は？
応用情報技術者か、AWSアソシエーションかを予定しております。
合格したら、そちらも記事を書きますので
頑張ります。
nginxでメンテナンスページを表示させる。

# はじめに
nginxでメンテナンスページを表示させるための基本設定をまとめました。

# 設定
ここでは管理しやすいようにメンテナンスページ用の設定はmaintenanceという名前で別に記載し、includeさせます。

```conf:maintenance
set $maintenance "true";

if ($uri ~ "^/maintenance.html") {
  set $maintenance "false";
}
if ($uri ~ "^/exclude/") {
  set $maintenance "false";
}
if ($remote_addr ~ "xxx.xxx.xxx.xxx") {
  set $maintenance "false";
}
if ($maintenance = "true") {
  rewrite ^(.*)$ http://www.hoge.jp/maintenance.html? redirect;
}
```

# 説明
まず、maintenance の一番下に記載されているif文ですが、「_$maintenance = "true"_」ここでmaintenance変数がtrueである場合 `http://www.hoge.jp/maintenance.html` へリダイレクトが行われるという設定です。
次に一番上の「_set $maintenance "true";_」ではmaintenanceという変数にtrueという値を設定しています。
ですので、この設定だけだとアクセスが来たら全てリダイレクトされるように設定になっています。
それだとメンテナンスページにリダイレクトされても、またリダイレクトされてしまうため無限ループになってしまいます。
そこで一つ目のif文で、`maintenance.html`へのアクセスの場合はmaintenance変数にfalseを設定し直します。
これで全てのアクセスが用意した `http://www.hoge.jp/maintenance.html` へリダイレクトされます。

次に特定のパスへのアクセスに対してはメンテナンスページを表示させない設定です。
二つ目のif文でその設定をしています。
今回は`/exclude/`以下に対してのアクセスはリダイレクトを行わない設定です。
もし、除外パスが`/EXCLUDE/`もであれば`~`の部分を`~*`に変更することで大文字小文字の区別をなくすことができます。

最後に特定IPからのアクセスはメンテナンスページを表示させない設定です。
三つ目のif文でその設定を行っています。
ここでは直接サーバーへのアクセスの場合ですがLoadBalancerなどを経由する場合、`$remote_addr`だと設定によってはLBのIPが記載されてしまう場合があるので、その場合は`$http_x_forwarded_for`へ変更する必要があります。
confに、`real_ip_header X-Forwarded-For;`といった設定が入っていればおそらく`$remote_addr`で大丈夫です。

デフォルトのnginxの場合はこのmaintenanceファイルを`/etc/nginx/conf.d/maintenance`
などに配置し、nginx.confのserverディレクティブ内に`include /etc/nginx/conf.d/maintenance;`と追記してリロードすればOKです。


# おわりに
この手の設定のポイントはホワイトリスト方式にすることだと思います。
まず、全てのアクセスがメンテページに行くように設定した上で、特定の条件のみ除外とすることで漏れを防げます。
動画のストリーミング配信の概要

### [記事を移転しました](https://blog.minimalcorp.com/posts/JlZbNSAW9N4Z0lNl0jQmvA)。

## まえがき

タイトルの情報源は知人です。動画のストリーミング簡単にできないのか -> S3にAPIあった気がするという噂を聞いたので、「S3 動画　ストリーミング」とググってみたら二番目に [これ(Amazon CloudFront メディアストリーミングチュートリアル)](https://aws.amazon.com/jp/cloudfront/streaming/) が出てきた。

実際ググる前にある程度の...

[続き -> https://blog.minimalcorp.com/posts/JlZbNSAW9N4Z0lNl0jQmvA](https://blog.minimalcorp.com/posts/JlZbNSAW9N4Z0lNl0jQmvA)
[macOS] rbenvでrubyを切り替えられない


超単純な話だったのでいうまでもないかもしれませんが一応。
vimgolfがやりたくてgemのインストールをしたのですが、うまく使えなかったので書き留め。
rubyを切り替えられない場合、

```bash
eval "$(rbenv init -)"
```
この行を`.bash_profile`/`.zshrc`に書き加え忘れていませんか...!?
自分はこれを直で実行しましたが動かず、`.bash_profile`に追加した途端に動くようになりました。
参考までに。
一括go fmtをignoreする

ピリオドから始まるファイルはgo fmtから無視される
下記コマンドでカレントディレクトリ以下の.foo.go以外の.goファイルは全てgo fmtが適用され上書きされる

```
% gofmt -s -w ./
```


参考
https://qiita.com/suin/items/9f9bdaa0cb9cb80cf752

> Files starting with a period are ignored
https://golang.org/cmd/gofmt/
【RSpec】で書く「Rails Tutorial　５章」のテスト

<br>
こんにちは。

現在、`RSpec猛勉強中`のGoiと言います。

先に言っておくと、
こちらの記事は多分「クソ記事」に該当する可能性があるため、
マサカリを投げられる方はお引き取りください。
***

本題に入るのですが、
今現在ダメもとでRails TutorialをRSpecで進めるという暴挙に出ています。
<br>

- **前提条件**

・Viewのトップページ（Home）より、各リンク先にページ遷移できるかのテスト
・homeがトップページ（root_path）
・リンク先に遷移するために押下`文字がclick_linkに該当`
・`have_content("XXX")のXXXに入る文字列は、ページ遷移先に表示されるコンテンツのこと`
　　※home（トップページ）だと、「Welcom to the Sample App」や「This is the home page...」のコンテンツ（文字に該当）

![スクリーンショット 2018-10-18 20.52.06.png](https://qiita-image-store.s3.amazonaws.com/0/260354/acd31b55-3281-1d7e-779d-1d7c47612c2b.png)

<br>
実際にfeatureスペックを使用したテストが下記になります。

**Feature（エンドツーエンド）テスト**

```ruby:spec/features/homes_spec.rb
require 'rails_helper'

RSpec.feature "Homes", type: :feature do

  scenario "homeへページ遷移できるか" do
  	visit root_path
  	click_link "Home"

  	expect(page).to have_content("Welcome to the Sample App")
  end

  scenario "aboutへページ遷移できるか" do
  	visit root_path
  	click_link "About"

  	expect(page).to have_content("Help Log in About")
  end

  scenario "helpへページ遷移できるか" do
  	visit root_path
  	click_link "Help"

    expect(page).to have_content("Log in Help")
  end

  scenario "contactへページ遷移できるか" do
  	visit root_path
  	click_link "Contact"

  	expect(page).to have_content("Help Log in Contact")
  end

  scenario "Sign upへページ遷移できるか" do
    visit root_path
    click_on "Sign up now!"

    expect(page).to have_content("Sign up")
  end
end

```

***

>ユニットテスト　＝　controller spec
インテグレーションテスト　＝　request spec
エンドツーエンドテスト　＝　feature spec / system spec

上記の通り、テストにはそれぞれ種類があり、
上で書いたfeature（エンドツーエンド）テストを書くまえにrequest（インテグレーション）テストを書くべきとご指摘いただきました。

そのため、改めてrequestテストを書いてみました。

**Request（インテグレーション）テスト**

```ruby:spec/requests/homes_api_spec.rb
require 'rails_helper'

RSpec.describe "HomesApi", type: :request do
  describe "GET path check" do
    it "Homeページのhttpリクエストは正しいか" do
      get root_path
      expect(response).to have_http_status(200)
    end

    it "Aboutページのhttpリクエストは正しいか" do
      get about_path
      expect(response).to have_http_status(200)
    end

    it "Helpページのhttpリクエストは正しいか" do
      get help_path
      expect(response).to have_http_status(200)
    end

    it "Contactページのhttpリクエストは正しいか" do
      get contact_path
      expect(response).to have_http_status(200)
    end

    it "User/newページのhttpリクエストは正しいか" do
      get sign_up_path
      expect(response).to have_http_status(200)
    end
  end
end

```

***

<br>

初めて自分で一から作ったテストのため
簡素であり見応えのないものとなっています。

こちらで一応テストは成功します。


しかし、経験者の方からすればより良い記述方法やそもそもfeature使わなくていいとか
その他諸々のアドバイスありましたら教えていただけるとありがたいです。

***
**<追記>**
@juchito さん（everydayrailsの著者）より、
コメントの通り今後のエンドツーエンドテストだと
feature specではなくsystem specの勉強をした方が良いとのアドバイスをいただきました。

まだsystem specを試せていませんので
改めて試し次第、こちらの記事も更新したいと思います。

***
**変更履歴**
10/19
・feature spec修正
・request spec追加
・各テストと各specの繋がりを記述
・<追記>部分を追加
VSCode+XAMPPでPHP環境を整える(Windows)

タイトルの通りです。構築するときに少し時間が掛かったので備忘録。

##環境
- Windows 10 Pro(1803)
- VSCode 64bit(1.28.2)
- XAMPP(3.2.2)

インストール設定はデフォルトで進めていきます。PHPにPathを通しておくと幸せかも。
##VSCodeで使う拡張機能
PHP IntelliSense
https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-intellisense
PHP Debug
https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug
PHP Extension Pack
https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-pack
VSCodeのようこそ画面でPHPをクリックするとインストールされる御三家ですね。とりあえず入れておきましょう。
設定に下の3つを追加しておきましょう。これで基本の設定は終わり。

    "php.suggest.basic": false,
    "php.validate.executablePath": "C:/xampp/php/php-win.exe",
    "php.executablePath": "C:/xampp/php/php-win.exe",

php cs fixer
https://marketplace.visualstudio.com/items?itemName=junstyle.php-cs-fixer
フォーマッタですね。インデントなんかを自動で綺麗にしてくれます。

##Xdebugの追加
PHPのデバッガーと言えばXdebugです。入れておきましょう。
php -iの出力をペーストすれば適切なバージョンを選択してくれるツールがあるので使います。
https://xdebug.org/wizard.php
私の出力を貼っておきます

Download php_xdebug-2.6.1-7.2-vc15.dll
Move the downloaded file to C:\xampp\php\ext
Update C:\xampp\php\php.ini and change the line
zend_extension = C:\xampp\php\ext\php_xdebug-2.6.1-7.2-vc15.dll

書かれたとおりにXdebugをダウンロードし、設定に以下を追記しておきましょう。
[xdebug]
zend_extension=C:\xampp\php\ext\php_xdebug-2.6.1-7.2-vc15.dll
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_enable=1
xdebug.remote_autostart=1

動かないときにもphp -iは役に立つので見ておきましょう。

##php cs fixerのセットアップ
php cs fixerはPHP Coding Standards Fixerに依存しているため追加します。
https://cs.sensiolabs.org/

Composerを使う方法と直接ダウンロードする方法があります。
https://getcomposer.org/download/
Composerをインストールしてc:\users\username\AppData\Roaming\Composerにcomposer.jsonを作成し

```json
{
  "require": {
    "felixfbecker/language-server": "*"
  }
}
```
をコピペし保存します。
そして、管理者権限のcmdで
```composer global update```を実行
language serverが入ります。
###php cs fixerのインストール
```composer global require friendsofphp/php-cs-fixer```
C:\Users\username\AppData\Roaming\Composer\vendor\binに入るのでこのリンクのphp-cs-fixer.batまでをコピー
###php cs fixer 拡張機能設定
setting.jsonに
```"php-cs-fixer.executablePathWindows": "C:/Users/username/AppData/Roaming/Composer/vendor/bin/php-cs-fixer.bat",```
を追加して終了！

###まとめ
これでPHPのコーディングに基本的なものは一式入りました。抜けがありましたら指摘をお願いします！
React Native codepush導入備忘録

## プロジェクトの作成

~~~bash
$ react-native init codepush 
~~~

Microsoft App Center に登録しておく
https://appcenter.ms

導入手順公式ドキュメント
https://docs.microsoft.com/en-us/appcenter/distribution/codepush

appcenter CLIのインストール

~~~bash
$ npm install -g appcenter-cli
~~~

appcenterにログイン

~~~bash
$ appcenter login
~~~

appcenterにアプリを登録

~~~bash
$ appcenter apps create -d codepush-iOS -o iOS -p React-Native
~~~

デプロイ(staging)

~~~bash
$ appcenter codepush release-react -a nyara/codepush-iOS -d Staging
~~~

keyの確認(アプリのinfo.plistに追記する)

~~~bash
$ appcenter codepush deployment list -a nyara/codepush-iOS
~~~

## アプリ側
[react-native-code-push](https://github.com/Microsoft/react-native-code-push)の導入

~~~bash
$ npm install --save react-native-code-push
$ react-native link react-native-code-push
~~~

[サンプルコード](https://github.com/Microsoft/react-native-code-push/tree/master/Examples/CodePushDemoApp)