OmniAICreator/Qiita-1.07M huggingface dataset:
自己証明書の作成手順

自己証明書をprod環境で使用することはまずないですが、stg環境やdev環境、閉じられたcms環境やbackoffice環境だと、費用削減のために自己証明書を使用していることがわりとまだあります。
AWS環境だと、ACMでDV証明書を無料で作れるからいいんですけどね。
ということで、自己証明書の作成手順です。

## 変数定義
ここで各々必要な情報を変数に詰め込んじゃってください。
そうすればあとは基本的にコピペでいけると思います。

```shell
# 日付設定
export ssldate={yyyymmdd}

# ドメイン名設定
export ssldom={ドメイン名}

# bit数の指定
export sslbit=2048

# ユーザ名の指定
export user={ユーザ名}
```

## メイン作業
#### ssl用ディレクトリの作成&移動

```shell-session
$ mkdir -p /home/$user/ssl
$ cd /home/$user/ssl/
$ chown $user:$user /home/$user/ssl/
$ cd /home/$user/ssl/
```

#### シード値の生成
```shell-session
$ date >> mkssl.log; openssl md5 * > rand.dat
```

#### 秘密鍵の作成
```shell-session
$ openssl genrsa -rand rand.dat $sslbit > $ssldom.$ssldate.key
```

#### CSRの作成
```bash
$ openssl req -new -key $ssldom.$ssldate.key -out $ssldom.$ssldate.csr

# 情報をいろいろ聞かれますが、自己証明書なのでCommon Name以外は空Enterで問題ありません。
Country Name (2 letter code) [XX]:
State or Province Name (full name) :
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) :
Common Name (eg, your name or your server's hostname) :{ドメイン名}
Email Address :

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password :
An optional company name :
```

#### CSRの確認
```shell-session
$ openssl req -noout -text -in $ssldom.$ssldate.csr | head -8
```

#### 自己証明書の作成(期限は約10年(3650日)とします)
```shell-session
$ openssl x509 -in $ssldom.$ssldate.csr -sha256 -out $ssldom.$ssldate.crt \
-req -signkey $ssldom.$ssldate.key -days 3650
```
以上です。
AfterEffects エクスプレッションのみでカウントアップ

#やりたかったこと
動画作成中（作成してないけど(笑)）に〇〇と発言した数をカウントする！！
的な事を考えた時に発言した時にレイヤーマーカーを打ってそれをカウントアップさせる。
とりあえずAE内ではテキストレイヤー１つのみで完結させたかった。

実際の作ろうとしたイメージの動画と実際に作成した物を動画にしました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">エクスプレッションのみでカウントアップを作成してみました。<br>詳しくはキータのブログでどうぞ。<a href="https://twitter.com/hashtag/aftereffects?src=hash&amp;ref_src=twsrc%5Etfw">#aftereffects</a> <a href="https://t.co/3Mvtt2Vfki">pic.twitter.com/3Mvtt2Vfki</a></p>&mdash; YouTool (@YouTool3) <a href="https://twitter.com/YouTool3/status/1055063211345567744?ref_src=twsrc%5Etfw">2018年10月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#内容
テキストレイヤーには２つのスライダーエフェクトを使用しています。
①スライダー名　「Sp」
②スライダー名　「PsitionY」

①Spはマーカーの何秒前からカウントアップが始まるかです。
②PositionYはテキストの移動位置です。
②はフォントサイズとか変わるとずれるのでこれで調整して下さい。

テキストのソースのエクスプレッションはこちら

```jsx
var mnk = thisLayer.marker.nearestKey(time);
var count;

if (time < mnk.time){
count = mnk.index-1+"\r"+mnk.index;
}else if ( time < thisLayer.marker.key(1).time ){
count = mnk.index-1+"\r"+mnk.index;
}
else{
count = mnk.index+"\r"+Number(mnk.index+1);
}

count

```

テキストレイヤーにはウィグリーセレクタを追加していますがこれは数字が上下に揺れるだけのものなので
入れなくても大丈夫です。

ウィグリーセレクタ

```jsx
x=value[0];
y=wiggle(5,30);
[x,y[1]]
```

ここからは必要なものです。

テキストレイヤーに
アニメータを３つ追加しています。
①位置
②不透明度
③不透明度

Position(①位置アニメーター)

```jsx
var mnk = thisComp.layer("0 ").marker.nearestKey(time).time;
sp=effect("Sp")("スライダー");
posY= effect("PositionY")("スライダー");

if ( ( time > mnk-sp )&&(time < mnk) ){
linear(time,mnk,mnk-sp,[0,0],[0,-posY])
}else{
[0,0]
}
```

transparent(②不透明度アニメーター　下の数字に対して)

```jsx
var mnk = thisComp.layer("0 ").marker.nearestKey(time).time;
sp=effect("Sp")("スライダー");

if ( ( time > mnk-sp )&&(time < mnk) ){
linear(time,mnk,mnk-sp,0,100)
}else{
0
}
```

transparent2(③不透明度アニメーター　上の数字に対して)

```jsx

var mnk = thisComp.layer("0 ").marker.nearestKey(time).time;
sp=effect("Sp")("スライダー");

if ( ( time > mnk-sp )&&(time < mnk) ){
linear(time,mnk,mnk-sp,100,0)
}else{
100
}
```
不透明度のパラメーター
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/178061/bdb84232-6f59-4b6f-63e7-1841ac9c2bb7.jpeg)



これであとはカウントしたい所にテキストレイヤー上にマーカー打つだけです。

以上です。
RedShiftのQuery editorの注意

ごきげんよう  
  
最近VUIなんだけどスキルじゃない部分を開発してるよくわからん僕です。

本記事は普段のはてなブログにも記載してますが、技術的な話でもあるのでQiitaにも貼っておきます。

はい。 
そんな中でRedShiftのよろしくない動きを見つけてしまったので注意喚起記事です。  
  
### RedShiftって何？
  
AWSのRedShiftです。  
[https://aws.amazon.com/jp/redshift/:embed:cite]
  
### Query editorって何？
  
最近、ベータ版から正式版にランクアップしたRedShiftの機能で、AWSのGUIの画面ポチポチでSQLを発行できるやーつ。  
  
RedShiftはPostgreSQLとある程度互換性があるのでJDBCなりでSQLを投げることができますが画面でできればラクチンではあるわけです。  
  
で、AWSの開発者コンソールのGUIの画面でSQLを投げる機能としてQuery editorができたんだろうとは思います。  
  
が、こいつがよろしくない動きをしてます。  
  

### クエリの実行ボタンを押さなくても実行される
  
Query editorはSQLごとにタブ画面になっていて便利です。  
が、<b>1回SQLを記述して実行した後、別のタブを開くなり、別の画面に遷移するなりなどをしたあとに<span style="color: #ff0000">再度SQLを実行した後のタブを開くと、実行ボタンを押さなくても勝手に実行中状態になります。</span></b>  
  
こいつがどうも画面のみではなく実際にSQL投げちゃってる可能性があるので<b>AWSサポートに連絡したら再現確認されました。</b>  
  
で、やっぱりSQLを意図せず実行されちゃうとデータの信頼性を損なうし  
SELECTだけでもリザルトキャッシュとかに影響するかもだし・・・  
  
更新系は再現する場合としない場合があるようですが、参照系は再現率が高いらしいです。  
AWSサポートさんの調査結果だと動いてるように見えるだけの場合もあれば、実際に動いちゃってる場合もあるようで結構インパクトありそう。  
  
そんなこんなでAWSサポートさんからは海外部署も巻き込んで原因究明にあたるけど時間かかりそうです。  
10月30日に一旦進捗報告してくれるとのことです。  
  
AWSサポートが約1週間も返答待ち宣言をするのはなかなかないので、それなりにインパクトがあるのかもですね。  
  
というわけで、Query editorを使う場合は実行したら「クリア」を押してSQLを保存しないでおく運用で回避になりそうです。  
  
### ところで
  
週1ペースくらいでGlueとかRedShiftとかガンガン不具合踏んでて報告しまくってるんだけど、Amazonさんから何かもらえたりしないかなー
プログラミング独学者がkaggleでスコアを獲得するための第一歩〜kaggle日記〜

# kaggleとは
　データサイエンティストと企業や政府を繋ぐコンペサイトです。
　データ解析の正答率をスコアとして参加者同士でスコアの高さを競い合います。
　企業から出されたテーマに対して上位入賞者に賞金と引き換え（！）にデータセットを買い取るという意欲的な仕組みです。

# なぜkaggleを学ぶのか
　私の現職は通常のPGとは違って少し特殊で、小中学向けプログラミング教育の講師を勤める傍ら、数学・現代文の講師と内製アプリケーション専門のPGをやっております。
　なので経験値をアピールする機会がとても少ない……という悲しい事態に直面しておりその対策として何か実力を証明できるものはないだろうかというものを探している中でkaggleを見つけました。
　ちょうど社内でマーケティングの役割が必要なのではないかと話をしていたところだったのでいい機会だということでkaggleを始めました。
　様々なバックグラウンドを持っている人間でも自由に出入り出来、また、データサイエンスの世界ではある程度の市民権があることもkaggleのいいところだと思います。

# 第一歩
・第一歩の手順は以下の二つです
① kaggleに登録する
② チュートリアル的な内容を回してみる

# ①kaggleに登録する
そんなに難しいことはありません。
メールアドレスとパスワードを登録するだけです。

# ②チュートリアル的な内容を回してみる
今回はこの内容を回してみました。
https://www.codexa.net/kaggle-titanic-beginner/

### 開発環境
MacOS v10.13.6
Docker v18.06.1-ce-mac73
ubuntu v16.04（Docker上で起動）
jupyter-notebook v5.1

### 行程
1.開発環境を整える
~~積ん読していた~~[もともと持っていた本](https://www.amazon.co.jp/%E3%81%99%E3%81%90%E3%81%AB%E4%BD%BF%E3%81%88%E3%82%8B-%E6%A5%AD%E5%8B%99%E3%81%A7%E5%AE%9F%E8%B7%B5%E3%81%A7%E3%81%8D%E3%82%8B-Python%E3%81%AB%E3%82%88%E3%82%8B-AI%E3%83%BB%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%83%BB%E6%B7%B1%E5%B1%A4%E5%AD%A6%E7%BF%92%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E6%96%B9-%E3%82%AF%E3%82%B8%E3%83%A9%E9%A3%9B%E8%A1%8C%E6%9C%BA/dp/4802611641)で作った環境をそのまま用いました。dockerコンテナ上で作成した開発環境にdockerからアクセスしています。
　dockerの勉強は後回しになってしまっていますが、どこかのタイミングで追記という形ででもオリジナルのdockerイメージをDL出来るようにしたいと思っています。

2.[参考サイト](https://www.codexa.net/kaggle-titanic-beginner/)を見ながら機械学習を行う
参考サイトでは決定木を用いてタイタニックの生存率を予測するデータ解析を行なっていました。
手順に関しては参考サイトを見ていただければわかると思うのでこちらでは決定木について解説します。

【決定木とは】
端的に表すと「フローチャート式のデータ決定方法」です。フローチャートの最終到着地点にそれぞれ結論を持たせておきその結論を出力します。

![Decision_tree_model_ja.png](https://qiita-image-store.s3.amazonaws.com/0/306351/229498d4-0d44-398b-2b4f-d4fdda5662c7.png)

*引用：https://dev.classmethod.jp/machine-learning/2017ad_20171211_dt-2/#sec1*

　データ解析のアルゴリズムは難しいものが多く、なかなかわかりづらいのですがこれは非常にわかりやすいアルゴリズムとなっています。
　また、データの型に対しての許容度が高く、説明変数に型が入り混じっていても対応がききます。
　反面、分類性能は高くなく、過学習も起こしやすいです。

　つまり、簡単でわかりやすいけれども実用性が発揮される場面は限られる、という内容のアルゴリズムとなります。

【参考サイトの概略】
●データセットの確認
・CSVを読み込んで内容を確認する
・元データ と testデータ の簡単な統計情報とサイズも確認する
・pandasのdescribe()を使って各データセットの基本統計量も確認する
・データセットの欠損の確認する
●データセットの事前処理
・欠損データへ代わりとなる代理データを入れる
・カテゴリカルデータの文字列を数字に変換
●アルゴリズムにデータを流し込む
・決定したアルゴリズムにデータを流し込む

3.完成
お疲れ様でした。

# まとめ
備忘録としてkaggle日記を書きました。
新しいことを始める時の第一障壁である環境構築を本に書かれている通り行なった（多少うまくいかないところもありましたが……）のであまり詰まることなく学習を行うことが出来ました。
冒頭に書いている通り本職はプログラミング講師で、dockerは非常に有用な知識なのでこちらも学びたいとは思っていますし、追記でオリジナルの環境構築方法をいつか書ければ……と思っております。
kotlinでアプリを動かすお勉強2


# 外部ネットワークへの接続がうまくいかない

## エミュレータから外にうまく出られない

最初にマニュフェストでやったこと

* securityの設定をした
* 権限を与えた

エラーが変わったけどでられない

wi-fiが繋がらないけど、ケーブルだとネット自体は繋がったような気がする
それでも、アプリからはうまくいかなかった
（これはソースコード側で対応できたかもしれないが未確認）

## 実機をつなげる（Huawei）

USBデバッグがなかなか有効にならずこまった
ケーブル接続する前に設定して、有効になって、
設定画面を開き直しても有効のままなのを確認して接続することで接続確認された
その後、ログが出ないので特殊コマンド的なことをした
https://www.imobie.jp/faq/phonerescue-for-huawei-faqs.htm

### 実機での外部接続

fuelのgetHttpや、connectHttps的なのだとうまくいかず、、
Fuel.getとかを使うとうまくいった。
詳細はまだ理解していない

## 今後

エミュレータから場合に応じてネットワーク周りをつかえるとよい。
とりあえずは、実機で動かして行く。
ただ、android9だったかで、セキュリティが強化されているので、それを動作確認したのだが、
そのままでは実機のバージョンが古くて確認できない。
最終的にはエミュレータなどでもうちょっと確認したい。

## おまけ

プロキシ周りでプライベートIPのルールをしっておくことになるのかもしれない
https://stackoverflow.com/questions/6775743/need-help-with-android-emulator-networking

fuelでは、いろんなコーディングに対応できるようになっているみたい
リアクティブプログラミング用とかコルーチンとか、、使いこなせないので保留。
https://github.com/kittinunf/Fuel
https://qiita.com/fanfanta/items/e924fff5c62dd1633110
https://qiita.com/hiruberuto/items/39e4126f470d8b84b291

# 機密とか認証情報とかもう少し軽度な秘密情報とかは、どうしたらいいのかな

要検討

https://qiita.com/ComicCafeApp/items/389cd0d8dee05bb0ea3e
https://teratail.com/questions/117632
https://qiita.com/f_nishio/items/485490dea126dbbb5001
https://qiita.com/rsahara/items/4a957c77751cda7d2d16
https://teratail.com/questions/19224
https://qiita.com/mickamy/items/ee55e8fab2dfb114c2f2
Windows10 インストール in macOS mojave

※最新の話は下の方にあります

# 2018/10/24時点でのインストール記録

## OS本体
SSDにwindowsを入れて、インストールする。
SSDを起動できるようにして、
インストールを実行。画面は小さすぎるものの、インストールするには問題なし。
再起動後、USBデバイスからbootcampをインストール。
Microsoftアカウントでログインし、以前に入れたWindows10のプロダクトキーを
入れるものの、エラーになってうまくいかない。

トラブルシューティングを見ていると、
以前のpcに入れたものはそのまま入れられない様子。
トラブルシューティングにて、以前のpcをアクティブ化してみる。
これもうまくいかない。

なんでだ、、、、
色々見ているうちに、なぜか今のプロダクトキーが入れたものと違うな、と思い、
再度プロダクトキーを入力。
今度は上手くいった。
なんでかよくわからんけど、、、、、

## キーバインディング
とりあえず、英数キーとかなキーで、macと同じように切り替えしたいので、
これを変更する。

## Windows update(2020/02/10)
しばらくwindows起動してなかったのだけど、久しぶりに起動したらアップデートが大量に。まあこの際全部待つかと思い、何回か再起動して完了した。
さて、今のやつは最新なのかなと確認してみたところインストールされているものは1803となっている。
でも最新は1909の模様。もう2020年なのに、1803って番号的にも変だもんな。
何回か更新プログラムのチェックをしてみても、最新ですと言われて、1909にならない。しょうがないのでマニュアルでアップデートすることに。どうやら[更新アシスタント](https://www.microsoft.com/ja-jp/software-download/windows10)から実行できる模様。
「今すぐアップデート」を押す。
いくつかOK押していると、更新が始まるのですが、なぜか途中でエラーに、、
メッセージコードは「0xc1900201」USBにはインストールできません、、、ということらしい。
update 1903あたりから取られた処置みたいなのですが。
しかし、このマシン、windows的にはmacのSSDは見えないので、USBってwindows本体しか入ってないUSB-SSDがCドライブとして接続されているだけなのですが、、、、

### 私のwindows10は macで使っていて、windows10本体はUSB SSDに入っている。mac本体のSSDに入れると容量とられるし、環境をwindows側で変更される恐れもあるかなと。この環境ならUSB-SSDをつなげていない時は純粋なmacとして使える。

さて、どうするかな、、、
update 1809とか一世代だけでもあげられないものだろうか、、、
結局[ここ](http://hima-tama.blogspot.com/2019/08/windows-10-v1809-windows-10-11.html)にたどり着いた。

>キー : KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control の
>名前 : PortableOperatingSystem の値を 0 にする

やったことはこれだけ。
適用後、通常の更新プログラムのチェックを実行してみます。
おお、更新プログラムとして、1903がでてきた。めでたしめでたし。
【Chrome】スマホ/タブレット表示の時に固定ヘッダーがカタカタする件を解決する

# 何が起きたか

`position:fixed`を指定て画面上部に固定したヘッダーがChromeのスマホ、タブレッド表示の時だけスクロールするとカタカタ動いてしまう。

# 確認環境
OS: Windows10
ブラウザ: Chrome

devtoolsでスマホ表示モードに切り替えた際に再現。

# 結論

viewportに `width=device-width,initial-scale=1.0,minimum-scale=1.0` を指定して解決


# 再現

百聞は一見に如かず。現象をご覧ください。

## ソースの抜粋

**HTML**

```html:template
  <header class="header">
    <div class="header-left">

    </div>
    <div class="header-center">
      <h3>SampleHeader</h3>
    </div>
    <div class="header-right">

    </div>
  </header>
```

**CSS**

```css:style
  .header {
    height: 8vh;
    width: 100%;
    background-color: #145e43;
    color: #F5F5F5;
    position: fixed;
    top: 0;
    right: 0;
    left: 0;
    z-index: 1;
    display: flex;
    align-items: center;
    justify-content: space-around;
  }
```

## 再現VTR
![chrome_fixed_header.gif](https://qiita-image-store.s3.amazonaws.com/0/58841/e7b1ce6c-74f8-2ef3-ec72-28d2ab9aadd6.gif)


と、こんな風にスクロール時に固定されているはずのヘッダーがカタカタ動いてしまいました。PC表示では問題なくスクロールできています。

# 解決方法

自分が勉強したことも含めて解決

[StackOverflow](https://stackoverflow.com/questions/44679794/position-fixed-on-chrome-mobile-causing-element-to-move-on-scroll-up-down)に同じような投稿がありました。

回答によるとmetaタグviewportに`user-scalable=no`を追加することで解決できるとのこと。
追加してみるとヘッダーが期待通り固定されました。

## user-scalable=no

`user-scalabele=no`とはユーザーによる画面の拡大・縮小を禁止する属性のようです。

参考: http://2ndidea.com/accessibility/pros-cons-of-user-scalable-no/

ただし参考に書かれている通り拡大・縮小ができないことによるアクセシビリティの低下があるのではという意見もあります。一方で見た目をスマホアプリのようにすることができるなどの使い方もあるようです。

どういう作りにしたいかによるかと思いますが、今回は拡大くらいはできた方がよいかなと漠然と思っていたので別の手段で解決することにしました。

## width=device-width,initial-scale=1.0,minimum-scale=1.0

それぞれの属性については[@102Designさんの記事](https://qiita.com/102Design/items/1cfc04b405bf8787474a)に記載があります。そして、この指定が最適であるとのことなので試しに指定してみたところこちらも期待通り固定ができました。

`width=device-width,initial-scale=1.0`で初期表示の幅を端末の幅いっぱいにしつつ、`minimum-scale=1.0`で縮小できないようにしています。

---

viewportの指定について勉強になりました。参考にさせていただいた投稿者のみなさま、ありがとうございました。
sshログインに失敗する

初歩的なことだが、戒めメモ
AWSのEC2インスタンスにログインしようとすると失敗した

```
$ ssh hogehoge@ipアドレス
Permission denied (publickey).
```

あれ？

```
$ ls -lah ~/.ssh
-rw-------@  1 hogehoge  hogehoge   1.7K 10 24 15:50 hogehoge.pem
```

権限はちゃんと「600」になっている...
まさかディレクトリか？ いや、今更そんなわけ... でも一応確認

```
$ ls -lah ~
drwx------   10 hogehoge  hogehoge   340B 10 24 15:59 .ssh
```
「700」問題ない...

解決
簡単なことでした

```
$ ssh -i .ssh/hogehoge.pem hogehoge@ipアドレス
```

でも普段(ローカル環境ログイン時)はわざわざ指定しなくても読み込んでくれているような...
※後ほど勉強して追記予定

# 2018/10/27追記
sshの設定値を確認する

```
$ ssh -G hogehoge@ipアドレス

user hogehoge
hostname ipアドレス
port 22
...他にもいっぱい...
identityfile ~/.ssh/id_rsa
identityfile ~/.ssh/id_dsa
identityfile ~/.ssh/id_ecdsa
identityfile ~/.ssh/id_ed25519
```

秘密鍵は「~/.ssh/id_rsa」などを使用するというのがデフォルトの設定になっている

と、いうわけで
configファイルを用意して、設定を記載すればオプションで秘密鍵を指定せずにログインできました

```
$ cd ~/.ssh
$ vi config
```

今回の私の例でいくと最低限必要だったのは3種類

```
Host hogehoge
    HostName ipアドレス
    user hogehoge
    IdentityFile ~/.ssh/hogehoge.pem
```

再度、sshの設定値を確認
意図した設定になっていました

```
$ ssh -G hogehoge

user hogehoge
hostname ipアドレス
port 22
identityfile ~/.ssh/hogehoge.pem
```

今まで特に指定せずにログインできていたのは
・全てのローカル環境に同一の公開鍵を登録していたから
・接続元の秘密鍵のファイル名が「id_rsa」
・sshコマンドはデフォルトで「~/.ssh/id_rsa」を使用する (他にも3種)
ということでした

@forl_head_officer 様
@angel_p_57 様
ご教示いただきありがとうございました

## 参考
https://qiita.com/f0o0o/items/3fd3b00b515a1ebe427e
samba-toolに苦労した……(CentOS7編)

samba-toolを入れようとして苦労したので、その記録を。

###ディストリビューション
`# cat /etc/redhat-release 
CentOS Linux release 7.5.1804 (Core) `

###portal.enterprisesamba.comに繋がらない

`samba-tool は sernet のリポジトリにしかないんだぜ`

みたいなことが書いてあって、そこには
まず https://portal.enterprisesamba.com/ に行ってUSERNAMEとACCESSKEYを手に入れろ、という記述のあるページがたくさん見つかりましたが、 **繋がりません** (>_<)

###他の方法

https://www.server-world.info/en/note?os=CentOS_7&p=samba&f=4

こちらの方法に糸口が。

手順通りに configure すると、エラーが。 [最新版(4.9.1)](https://download.samba.org/pub/samba/stable/samba-4.9.1.tar.gz)とかダウンロードしたけどダメでした。

結果的には、Python2系じゃないと上手くいかないということで。

リンクを貼り直しました（Python2.7に)

```
# cd /usr/bin/
# rm python
# ln -s python2.7 python
# python -V
```


インストール中にエラーが出たため追加したパッケージは、以下です。

```
# rpm -qa --last | head

lmdb-0.9.22-2.el7.x86_64                      2018年10月24日 18時55分53秒
lmdb-libs-0.9.22-2.el7.x86_64                 2018年10月24日 18時55分53秒
lmdb-devel-0.9.22-2.el7.x86_64                2018年10月24日 18時56分59秒
jansson-2.10-1.el7.x86_64                     2018年10月24日 18時59分45秒
jansson-devel-2.10-1.el7.x86_64               2018年10月24日 18時59分45秒
gpgme-devel-1.3.2-5.el7.x86_64                2018年10月24日 19時02分14秒
libgpg-error-devel-1.12-3.el7.x86_64          2018年10月24日 19時02分14秒
libarchive-devel-3.1.2-10.el7_2.x86_64        2018年10月24日 19時03分42秒
```

結局、sambaの最新版をソースからインストールすれば良かった、ということなんですけれども。
word2vecでword ○○ not in vocabularyになった場合の対処

###対処
焦らず例外処理を書くだけで良い．

important_word[]は単語が格納されている配列です．

###コード

```sample.py
for i in range(len(important_word)):
    try:
        print(model.most_similar(important_word[i]))
    except KeyError as error:
        print(error)
```
puttyの設定を別PCに移行する

最近会社のPCを変えることになったので、以前ローカルにメモった `puttyの移行方法` を掘り起こしました。

Puttyの設定は、ファイルではなく`レジストリ`に保存してある為、レジストリの移行が必要になります。
※保存先、読み込み先は任意で変更

## putty 設定のエクスポート
Windowsコマンドプロンプトを起動して、下記のコマンドを実行することで、必要なレジストリの内容をファイルに出力します。
僕の場合、出力先はDropBoxにしています。(新しいPCにもDropBox入れておけば、ファイルを持っていく手間が省けるので)

```
reg export HKEY_CURRENT_USER\Software\SimonTatham\PuTTY putty.reg
```
## putty 設定のインポート
生成したregファイルをPCに移行し、Windowsコマンドプロンプトを起動します。
regファイルを配置したディレクトリまで移動し、下記のコマンドを実行します。

```
reg import putty.reg
```

これで新しいPCでputtyを開いてみてください。設定が移行できていると思います。
WordPress REST API での検索条件設定

# やりたかったこと

カスタムフィールドの値を用いて取得結果をソートしたかった。

# 結論

`rest_[post_type]_query` フィルターフックに処理を適用することでREST APIで検索条件の設定が行えます。
例えば以下のようにフィルターフックに処理を追加することで、特定の投稿タイプ(今回はpost)の投稿一覧を取得する際に指定のカスタムフィールドの降順でソートされた結果が返ります。

```php
add_filter('rest_post_query', function ($args, $query) {
	$args['orderby'] = 'meta_value_num'; // meta_value_numは数値として扱う、meta_valueだと文字列扱い
	$args['meta_key'] = '[カスタムフィールド名]';
	return $args;
}, 10, 2);
```

# 詳細

`rest_[post_type]_query` フィルターは`WP_REST_Posts_Controller::get_items( WP_REST_Request $request )`内(L261)で適用されています。
[WP_REST_Posts_Controller::get_items()](https://developer.wordpress.org/reference/classes/wp_rest_posts_controller/get_items/)

このフィルターは引数を２つ(`$args, $request`)を取り、`$args`を返却します。
さらにこの返却された`$args`がどう使われているかを見ると、L262で

```php:L262
$query_args = $this->prepare_items_query( $args, $request );
```

と、`prepare_items_query`という処理を経て、

```php:L290~291
$posts_query  = new WP_Query();
$query_result = $posts_query->query( $query_args );
```

ここで`WP_QUERY::query()` の引数として用いられていることが分かります。
ここまで分かれば、実際に設定できる内容は以下のリファレンスを見れば理解できます。

[WordPress 関数リファレンス/WP Query](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/WP_Query#.E9.A0.86.E5.BA.8F.E3.81.A5.E3.81.91.E3.83.91.E3.83.A9.E3.83.A1.E3.83.BC.E3.82.BF)

あとは指定したい検索条件の指定方法を探して、連想配列の形で指定を行うことができます。
`rest_[post_type]_query`フィルターでは`$request`という引数(WP_REST_Requestインスタンス)も受け取っているので、この値を用いて特定のリクエストのみで検索条件を設定することも出来ます。

# 参考

* https://qiita.com/grazios/items/1fe6c0a36c4a2cddeb4d
* https://www.timrosswebdevelopment.com/wordpress-rest-api-post-order/
【WordPress】Contact Form 7 で超お手軽スパム対策

WordPress に問い合わせフォームを設置する際の定番プラグイン「Contact Form 7」について、**お手軽にスパム対策する方法**をご紹介します。

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

## 対象としている人

- Contact Form 7 経由のスパムメールに悩まされている
- 日本人のみを対象としたサイトを運営している

- 手間はかけたくない

- FTP（SFTP,FTPS）の使い方ぐらいは分かる
- 文字コードという言葉ぐらいは何となく分かる

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

## 動作原理的なこと

- スパムの大半は海外からのもの
	- であれば、`<textarea>` 内に書かれる本文が日本語の**ひらがな**を含んでいなければ、エラーにすればいい

という非常に単純なものです。

本気で対策したいのであれば、[**Akismet** のようなスパム対策用プラグインとの連携](https://www.google.com/search?q=Contact+Form+7+%E3%82%B9%E3%83%91%E3%83%A0+Akismet&oq=Contact+Form+7+%E3%82%B9%E3%83%91%E3%83%A0+Akismet
)や[画像認証の導入](https://www.google.com/search?q=Contact+Form+7+%E7%94%BB%E5%83%8F%E8%AA%8D%E8%A8%BC)等を検討してください。

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

## 編集対象ファイル

`wp-content/themes/XXXXX/functions.php`

- XXXXX：現在使用中のテーマファイルに対応したディレクトリ
	- XXXXX-child のように子テーマを作ってる場合は、子テーマ内の方の `functions.php` を編集してください。

上記を FTP 等を使って編集します。管理画面からも編集できるようですが、おすすめはしません。

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

## コード

- `functions.php` の一番下あたりへ、以下のコードをコピペするだけです。
	- 文字コードは必ず **UTF-8（BOM無し）** にしてください。


```php
//-- Contact Form 7 の <textarea> にひらがなが含まれなければエラーにする
add_filter('wpcf7_validate_textarea', 'wpcf7_validation_textarea_hiragana', 10, 2);
add_filter('wpcf7_validate_textarea*', 'wpcf7_validation_textarea_hiragana', 10, 2);

function wpcf7_validation_textarea_hiragana($result, $tag)
{
    $name = $tag['name'];
    $value = (isset($_POST[$name])) ? (string) $_POST[$name] : '';

    if ($value !== '' && !preg_match('/[ぁ-ん]/u', $value)) {
        $result['valid'] = false;
        $result['reason'] = array($name => 'この内容は送信できません。');
    }

    return $result;
}
```

- 2018年10月24日時点
	- WordPress の最新バージョン 4.9.8 は、PHP5.2.17 でも動くようですので、念のため古いバージョンのPHPでも動くような書き方をしています。
	- Contact Form 7 はバージョン 4.1 から仕様が変わったそうですので、古いバージョンから最新バージョン 5.0.4 まで動くような書き方をしています。

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

## 参考URL

- https://contactform7.com/ja/2015/01/06/contact-form-7-41-beta/
Visual Studio 2012に最新バージョン（2018.10時点で1.50.5が最新）のDapperをインストールできなかった

#現象
Visual Studio 2012にNugetで最新バージョン（2018.10時点で1.50.5が最新）のDapperをインストールできなかった

#何をしたか
パッケージマネージャーコンソールで以下のコマンドを実行し、Dapperのインストールを試みた。

```
PM> Install-Package Dapper

Install-Package : 'Dapper' にはすでに 'System.Data.SqlClient' に対して定義された依存関係があります。
```

#試行錯誤をメモ

以下のサイトより新しいNugetバージョンだと、SQLClientが新しいバージョンでないと駄目の模様。
https://github.com/StackExchange/Dapper/issues/962

そこで、Dapperを古いバージョン指定で取得してみようと思う。
いつのバージョンにしようか？
Dapperの公式サイトにてバージョンの確認
https://www.nuget.org/packages/Dapper/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235774/1d87453c-727f-9853-645b-968493d108d1.png)

1.50.5←エラー
1.50.4←エラー
1.50.2←OK

```
PM> Install-Package Dapper -Version 1.50.2
'Dapper 1.50.2' をインストールしています。
'Dapper 1.50.2' が正常にインストールされました。
'Dapper 1.50.2' を Sample_20181031_1 に追加しています。
'Dapper 1.50.2' が Sample_20181031_1 に正常に追加されました。
```
OK!インストールできた。

#結論
- 環境によると思いますが、VS2012に1.50.2のDapperであればインストールできました。
# C++のパラメータパックを順繰りに手繰る方法

忘れっぽいのでとりあえず記するますですにゃーん

普通にぐるぐる回すだけ

```c++
template <typename Current, typename... Nexts>
auto func(Current&& c, Nexts&&... n) -> void {
    func(std::forward<Nexts>(n)...);
}

void func() {}
```

型だけで良けりゃ

```c++
template <typename Current, typename... Nexts>
auto func(std::tuple<Current, Nexts...>* = 0) -> void {
    func(static_cast<std::tuple<Nexts...>*>(nullptr));
}

auto func(std::tuple<>* = 0) {}
```

と思ったけどこっちがいいかもね

```c++
template <typename Current = void, typename... Nexts>
auto func() -> void {
    if constexpr(!std::is_same<Current, void>::value) func<Nexts...>();
}
```

# 参考

コレジャナイってな人はこっち https://qiita.com/_EnumHack/items/677363eec054d70b298d
LAMP環境でPHP学習

こんばんは。

昨日はちょっとした所用ででかけ

その時にCentOS7の日本語入力の切り替えに関して

質問されたので私自身も久々だったので、ど忘れしていました。

その後、家に帰り、久々にVMWare workstation playerを開き

自分でインストールしていたCentOS7をいじりました。

かつては、Wordpressサーバーを作ってみたり

Hinemosuを入れてみたりとかしていました。

わからないことは、「何がわからなかったのか？解決策はどうしたのか？」

ということをノートに取っておりました。

しかし、最近ではめったにいじることもなくなったので、

LinuxコマンドもViエディタの使い方も

すっかり忘れていました。

そして昨日・今日で少しずつ勉強しなおしています。

```
ls
dir
systemctl
ip
ifconfig
mkdir
chmod
```
といった感じでコマンドを使っています。

今躓いているのはMariadbってどうやってデータベース作って

テーブル作るんだっけ

っていう所で躓いています。

学びなおしにはちょうどいいかなぁと思い

勉強しています。

とりあえず、忘れない様にするために

繰り返し繰り返し

勉強し続けていきます。
React 16.6の新機能

昨日（10月23日）にReact 16.6がリリースされていましたが、入った新機能の3つが3つともありがたいものでした。

## 関数コンポーネントの`PureComponent`化…`React.memo`

[以前に書いた](https://qiita.com/jkr_2255/items/82f690def71cc035f0c2#%E9%96%A2%E6%95%B0%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88)ように、`state`のない関数コンポーネントと`PureComponent`は本来相性が良いはずなのですが、`PureComponent`はクラスコンポーネントである必要があるため、「そのためだけにクラスコンポーネントにする」「補助関数でクラスコンポーネントを生成する」などの手間を強いられていました。

React 16.6では、関数コンポーネントを`PureComponent`化する`React.memo`関数が登場したため、もう悩む必要もなくなりました。

## クラスコンポーネントへの`Context`適用…`Component.contextType`

逆に、クラスコンポーネントで書きづらかったのが、React 16.3以降のコンテキストで、値がRender propsの引数となるために、別に関数コンポーネントを立てて値を受け取るなどの手間が必要でした。

React 16.6では、コンポーネントの静的プロパティ（`SomeComponent.contextType = SomeContext;`のように代入する、あるいはクラス内部で`static contextType = SomeContext;`のようにする）として`contextType`にコンテキストを指定することができるようになりました。こうすると、`render`や`componentDidMount`などのライフサイクルメソッドで、`this.context`としてコンテキストが取れるようになります。

なお、複数のコンテキストが必要な場合は従来どおりRender Propsを使ってください、とのことです。

## コンポーネントの遅延ロード…`React.lazy`/`React.Suspense`

巨大なアプリになれば、全部一気にダウンロードするとなるとかなり重くなってしまいます。[Webpackでも`import()`が動くようになっています](https://qiita.com/jkr_2255/items/8d3b58f993c8739e211d)が、Reactでそれを支援する機能が登場しました。

まず、`React.lazy`を使って遅延ロード用のコンポーネントを生成します。引数には関数を指定しますが、

* 引数に指定するのは、実行すると`import`を実行する関数
* その関数の返り値は、`default`からコンポーネントを取れるオブジェクト[^1]を返す`Promise`

というようなものになります。そして、`<React.Suspense fallback={ ... }>`の中でこのコンポーネントを使うと、読み込めていないタイミングでは`fallback`の中身を使う、というような動きになります（`Suspense`のない箇所で使って、読み込みができていないとエラーになります。）。

```jsx
import React, {lazy, Suspense} from 'react';
const OtherComponent = lazy(() => import('./OtherComponent'));

function MyComponent() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <OtherComponent />
    </Suspense>
  );
}
```

## 外部リンク

* [React v16.6.0: lazy, memo and contextType](https://reactjs.org/blog/2018/10/23/react-v-16-6.html)

## 脚注
[^1]: default importでなかった場合に、`{default: SomeComponent}`のようなオブジェクトに変換して渡す、というような方法も考えられます。
jupyter notebook上でkeras+tensorflow-gpuで学習するとGPUメモリが開放されなくて困ってる

#### 環境
windows10 64bit
cpu: Ryzen7 1700X
gpu: GTX1080Ti
CUDA9.0
cuDNN7.3.1 for cuda9.0
python3.6
tensorflow-gpu 1.11.0
keras 2.2.4

#### やったこと
1. jupyter notebookで実行後にgc.collect()
- jupyter notebookで実行後にdel model
- 1つのclassにまとめてjupyter notebookで実行後インスタンスをdelする
- pyファイルにまとめてjupyter notebookから%runで呼ぶ
- terminalでpyファイルを実行
- pycharmでpyファイルを実行

#### 何故やったか
GPU使った画像認識をjupyter notebookでやろうとしたんですが、2回目以降学習が止まってしまって困りました。nvidia-smiでメモリ使用状況を確認したところ、学習が終わったあともメモリがリリースされてないのが分かったので、これをリリースするべく色々試してみましたが結局ダメでした。

#### 結論
jupyter notebook上で出来る1～4は全部ダメ
pycharmまたはterminalは無事リリースされる

jupyter notebookがダメ？困ったなぁ…


#### 1. jupyter notebookで実行後にgc.collect()
`>>> import gc`
`>>> gc.collect()`

普通にダメ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/ce4a2a25-6f90-4490-c35b-4b9927b2e032.png)

#### 2. jupyter notebookで実行後にdel model
keras+tensorflow-gpuで以下のようにモデルを作ったあと学習してたので、このmodelをdelしたらメモリもリリースされるかな、とやってみました。
`>>> #学習`
`>>> model = self.initModel(self.nb_classes)`
`>>> history = model.fit_generator(train_batches, train_steps, epochs=self.epoch, validation_data=valid_batches, validation_steps=valid_steps)`
`>>> del model`

うん、ダメ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/708a150a-574c-2a1b-1f3a-3a57b659701a.png)

#### 3. 1つのclassにまとめてjupyter notebookで実行後インスタンスをdelする
じゃあ１つのclassにまとめて、インスタンスを作って実行した後にインスタンスをdelしたらどうかなというのをやってみました。class visual()にすべてのコードをまとめて以下のように実行後にdel。
`>>> study = visual()`
`>>> %time history = study.main()`
`>>> del study`

あうあう、ダメ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/3c17b16d-56b6-1f18-39aa-f6eabc1e0270.png)


#### 4. pyファイルにまとめてjupyter notebookから%runで呼ぶ
上記でまとめたclassをpyファイルにして、jupyter notebookから呼んだらどうかなというのをやってみました。下記ではipynbファイル置いてる場所と同じフォルダにvisual10.pyを置いています。
`>>> %run './visual10.py'`

うん知ってた
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/d4812b81-18ac-d639-72ba-39dd45d10577.png)

#### 5. terminalでpyファイルを実行
そんで、上記visual10.pyをterminalから実行するとどうなるかというとですね

ちゃんとリリースされるわけですよ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/bfdd858a-0d91-c38a-ea41-27f781af800a.png)

#### 6. pycharmでpyファイルを実行
じゃあ同じことをpycharmからやると？

リリースされます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/6d517963-7f1f-af8f-56df-a892e0182cfc.png)

#### まとめ
4～6は同じファイルを実行してるだけなんですよね。今回は比較のために同じAnacondaで作ったpython.exeファイルを使って実行してるので、違いはどこから実行したかだけなんですが、jupyter notebookのみがダメという結果になりました。

1回だけ実行するなら問題ないし、コードを書いていく過程では結果が見やすいjupyter notebookがやりやすいので、jupyter notebookで書きながら完成したらpyファイルにまとめるというやり方になりそうです。

ほんとは全部jupyter notebookでやりたいんで、継続して良い方法を探したいですが検索しても手動でプロセスkillする方法しか出て来ないので連続して複数の条件を試していく使い方が出来ないんですよね…

悩ましいです。
MySQL Slave再構築

とあるクラウド上で`MySQL`の`Master-Slave`構成を組んでいるのですが、
あるとき`Slave`サーバが載っているホストがダウンしたらしく、`Slave`サーバもダウンしてしまいました。
めでたく別ホスト上に自動で立ち上がってきたのですが、ブチッと切れたので、レプリケーションエラーが発生してしまっていました。
なので面倒なことに`Slave`を再構築することになりました。

##作業その前に
作業完了後は以下の確認をしたいため準備しておくこと。

- `dabatase`、`table`、`データ(サンプル)の数`が一致すること
- Master で create dabase をして、Slave に伝播されること
- Slave を restart してもレプリケーションが正しく動作すること
- MySQL のエラーログにエラー等が出ないこと

## メイン作業
#### Master で dump を取得
```shell-session
$ mysqldump -u root -p --opt --single-transaction --master-data --all-databases > /tmp/Master-alldatabases.dmp.`date +%Y%m%d`
```
#### ポジションの取得
後ほど Slave の設定をする際に`ポジションの情報`が必要なので、上記手順で取得した dump から`MASTER_LOG_FILE`、`MASTER_LOG_POS`を確認しメモしておきます。

dumpは1行になっている可能性もあるため、以下のような`grep`だとよくわらない結果になるかもしれません。
その場合は`less`などで開いてから検索してみてください。

```shell-session
$ grep -i 'CHANGE MASTER TO' /tmp/Master-alldatabases.dmp.`date +%Y%m%d`
---
CHANGE MASTER TO MASTER_LOG_FILE='binary_log.000044', MASTER_LOG_POS=117069861;
```
#### Slave へ dump を転送
手順は略。環境によって具合良くやってください。

#### Slave で MySQL のデータをバックアップ(念のため)
```shell-session
$ cd /var/lib
$ tar zcvf mysql.tgz mysql/
```
#### slave の設定を削除
```sql
reset slave all;
```
slave status も Empty となり、 relay_log もリセットされる。

#### Slave に Master の Dump を投入
```shell-session
$ mysql -u root -p <  /tmp/Master-alldatabases.dmp.`date +%Y%m%d`
```

投入後、MySQLにログインしてから`Slave設定`を入れます。

```sql
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='slave_user',
MASTER_PASSWORD='slavepasswd',
MASTER_LOG_FILE='binary_log.000044',
MASTER_LOG_POS=117069861;
-----
start slave;
```
jQueryの .on でハマった話

スマホでスクロールを禁止する記述を追加した

```javascript
$(document).on('touchmove', function(e) {e.preventDefault();});
```

すると以下の警告が表示される

```
[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. 
See https://www.chromestatus.com/features/5093566007214080
preventDefault @ jquery-1.11.2.min.js:3 (anonymous)
```

URLが表示されているので中を見てみると

```
AddEventListenerOptions defaults passive to false. 
With this change touchstart and touchmove listeners added to the document will default to passive:true 
(so that calls to preventDefault will be ignored)..

If the value is explicitly provided in the AddEventListenerOptions it will continue having the value specified by the page.

This is behind a flag starting in Chrome 54, and enabled by default in Chrome 56. 
See https://developers.google.com/web/updates/2017/01/scrolling-intervention
```

Chrome56以降はデフォルトで `passive：true` になっているからスクロールできないよって言ってますね
理由は知らないですが、 `passive: false` を渡してあげるように修正してみます

```javascript

$(document).on('touchmove', function(e) {e.preventDefault();}, {passive: false});
```

すると新規に以下のエラー

```
TypeError: ((m.event.special[e.origType] || {}).handle || e.handler).apply is not a function
```

何について怒られているのか全くわからない件･･･エラーの意味ないでしょこれ

jQuery側のエラーなので、記述方法について調べてみます。今回使ってるのは `.on` ですね
公式リファレンスを見てみます（http://api.jquery.com/on/ ）
`.on(events[,selector][,data],handler)` と書かれていて、これを見る限りhandlerの後ろに第三引数で `passive: false` を渡すのは無理っぽいですね。ナンテコッタ

# 解決
素のJSのAddEventListenerのリファレンスを見てみます（https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener ）
`target.addEventListener(type, listener[, options]);` と書かれていますね！こちらは options としてオブジェクトが渡せそうです。記述方法を下記の様に変えてみます

```javascript

document.addEventListener('touchmove', function(e) {e.preventDefault();}, {passive: false});
```
エラー無し。スクロール制御ができました。
jQueryじゃ本当に無理なのかな？一旦これで。
コスパ最強GKEノードはどれだ

# はじめに
GKEの[公式ドキュメント](https://cloud.google.com/kubernetes-engine/docs/concepts/cluster-architecture#node_allocatable_resources)を読んでいて、以下の記載があった。コスパ最強のノードはどれなんだ・・・というのが気になったので、調べてみた。
>注意すべき点として、ノードのリソースの一部は、そのノードをクラスタの一部として機能させるために必要な Kubernetes Engine と Kubernetes リソースを実行するために必要です。そのため、ノードの総リソース数（マシンタイプのドキュメントで指定されたもの）と Kubernetes Engine でのノードの割り当て可能リソース数との間に相違があることがあります。

## 前提条件
* 為替レート: 112.42 円/$
* Sustained Use Discount: 30%込
* Region: asia-northeast1(TOKYO)
* kubesystemが使用しているリソースは含まない(約400m CPU,400mi RAM)
* 1ノードの料金

## 結果発表
割当可能率のCPU,RAMの平均を取ると、 98.0%で **n1-highmem-64**。
コストのCPU,RAMの返金を取ると ¥2,243で **n1-standard-96**。
※f1-microは¥1,002だったけど、さすがに実運用にはつらすぎるので除外

|マシンタイプ|RAM容量(GB)|割当可能RAM(GB)|割当可能率(RAM)|コスト(円/GB)|CPU容量(コア数)|割当可能CPU(コア数)|割当可能率(CPU)|コスト(円/コア)|コスト(円/月)|
|:------------|----------:|----------:|------------:|------------:|------------:|------------:|------------:|------------:|--------------:||
f1-micro|0.6|0.6|100.0|881|0.5|0.47|94.0|1,124|528|
|g1-small|1.7|1.2|70.6|1,541|0.5|0.47|94.0|3,935|1,849|
|standard-1|3.75|2.7|72.0|1,298|1|0.94|94.0|3,728|3,504|
|standard-2|7.5|5.7|76.0|1,230|2|1.93|96.5|3,631|7,008|
|standard-4|15|12.3|82.0|1,140|4|3.92|98.0|3,576|14,017|
|standard-8|30|26.6|88.7|1,054|8|7.91|98.9|3,544|28,034|
|standard-16|60|54.7|91.2|1,025|16|15.89|99.3|3,529|56,068|
|standard-32|120|111.2|92.7|1,008|32|31.85|99.5|3,521|112,136|
|standard-64|240|228.4|95.2|982|64|63.77|99.6|3,517|224,271|
|standard-96|360|346.4|96.2|971|96|95.69|99.7|3,516|336,408|
|highmem-2|13|10.7|82.3|814|2|1.93|96.5|4,515|8,715|
|highmem-4|26|22.8|87.7|764|4|3.92|98.0|4,446|17,430|
|highmem-8|52|47.2|90.8|739|8|7.91|98.9|4,407|34,858|
|highmem-16|104|96|92.3|726|16|15.89|99.3|4,387|69,717|
|highmem-32|208|197.4|94.9|706|32|31.85|99.5|4,378|139,435|
|highmem-64|416|400.8|96.3|696|64|63.77|99.6|4,373|278,869|
|highmem-96|624|605.1|97.0|691|96|95.69|99.7|4,371|418,304|
|highcpu-2|1.8|1.3|72.2|4,021|2|1.93|96.5|2,709|5,228|
|highcpu-4|3.6|2.6|72.2|4,021|4|3.92|98.0|2,667|10,455|
|highcpu-8|7.2|5.5|76.4|3,802|8|7.91|98.9|2,644|20,910|
|highcpu-16|14.4|11.9|82.6|3,514|16|15.89|99.3|2,632|41,821|
|highcpu-32|28.8|25.3|87.8|3,306|32|31.85|99.5|2,626|83,643|
|highcpu-64|57.6|52.5|91.1|3,186|64|63.77|99.6|2,623|167,284|
|highcpu-96|86.4|79.6|92.1|3,152|96|95.69|99.7|2,622|250,927|


## まとめ
ワークロードによる。
っていう話だけど、本当にチューニングしていったらCustomMachineTypeになるんだろうな。
この辺は経験値をためていって、最適なノードサイズを選択して、コストバランスがいいようにしていく必要がある。
eclipseの起動オプション


実行したbatファイルの該当行は以下↓
start .\eclipse.exe -clean -data A -Xmx1024M

start これは言わずもがなですが、以下に書かれた該当のものを起動する（処理完了を待たない）
```start [呼び出したいバッチファイル・アプリケーション名]```
call 処理完了を待つ場合

-clean キャッシュを破棄してEclipseを起動
-data ワークスペースの場所の指定
-Xmx eclipseが使用する最大のメモリ量

つまり上記のコマンドを分割するなら以下の4つになります。
start .\eclipse.exe //eclipseの起動 
-clean //キャッシュを消して起動
-data A //Aのワークスペースで起動
-Xmx1024M //最大使用メモリは1024MB
ruby on rails: view上のforeachの中で、複数回yieldに値を渡したいとき

#ruby on rails: view上のforeachの中で、複数回yieldに値を渡したいとき
railsの中でviewの数が増えてきてレンダリングしていると、
　users/_user.html.erb
のような、同一viewで複数回参照されるものに対しても<%= render '~~' %>を使ってレンダリングしたくなってくるのですが、<% provide :name, user.name %>で渡すと

- 1人目　佐藤
- 2人目　佐藤田中
- 3人目　佐藤田中小杉
- 4人目　佐藤田中小杉鈴木
…

と、値をストックしてしまってまともにidを渡せずに、しばらく困っていました。

#content_forを使う

そもそもyieldに、provide以外で渡す方法を知らなかったのですが、調べてみると、
```ruby

<% content_for :name, flush: true do %>
 <%= user.name %>
 <% end %>
```

として、content_forで渡せば

- 1人目　佐藤
- 2人目　田中
- 3人目　小杉
- 4人目　鈴木
…

と、その場で表示したいidや名前だけにできるようです。

備忘録と、調べてもなかなか出てこなかったので、同じ悩みを抱えている方に役立てばいいなと思いつつメモ。
【英語】技術文書翻訳の時に困るorよく出るIT用語一覧【IT用語】（随時更新）

# はじめに
なんとなく良く出る系の単語を中心にまとめてみた。（下書きの肥やしになっていたので公開）
AuthenticationとAuthorizationが、どっちが認証でどっちが認可だか混乱するので、ついでにまとめてみた。
マサカリ求む。

# 名詞
## 基本

| 単語 | 説明 |
|:--|:--|
| argument  | 引数  |
| variable | 変数 |
| dictionary |連想配列|
| attribute| 属性 |
| specification | 仕様 |
| feature | 機能 |
| implementation | 実装 | 

## チェック系

| 単語 | 説明 |
|:--|:--|
| Authentication  | 認証（お前誰やねん）  |
| Authorization  | 認可（権限の有無）  |
| Validation  | 妥当性確認（業務的な妥当性確認）  |
| Verification  | 検証・精査（システム的なチェック）  |

## 金融系

| 単語 | 説明 |
|:--|:--|
| payment | 決済 |
| payment method | 決済手段 |
| monetary instrument| 通貨代替物：小切手やトラベラーズチェックなど |

## その他

| 単語 | 説明 |
|:--|:--|
| Patent | 特許 | 
| non-normative | 参考情報（規格の内容を定義するものではなく、あくまでも参考情報であることを示す） |

# 動詞

| 単語 | 説明 |
|:--|:--|
| determine | チェックする（はっきりさせる） |
Slack bot 開発経験者が LINE bot を作る際につまづいたこと

# 概要

平成も終わろうというのに、初めて LINE bot を作りました。

Slack bot であれば過去に作ったことがあったのですが、それが逆に先入観を生んでしまい、いくつかつまづいたポイントがあったので、それをメモします。逆に、LINE bot の作り方的なことは書きません。

# つまづきポイント

## bot は非公開にできない

Slack bot はワークスペースに閉じた形で bot を開発できます。その bot を使えるのはそのワークスペースの参加者だけです。それゆえに、社内システムのデプロイなどのセンシティブな機能を bot に持たせることが気軽にできました。

一方、LINE bot は非公開にはできません。bot の ID や友達追加リンクが知られてしまえば、誰でも bot とやりとりできてしまいます。センシティブな機能を実装したい場合は、話者が誰なのかを bot アプリ上で判定して、あらかじめ決められた人の発言にしか反応しないようなプログラムにする必要があります。

逆にいうと、LINE bot は特別なプロセスを経なくても広くいろいろな人に使ってもらうことができます。Slack bot を一般公開したい場合は、App Directory に登録申請を出し、レビューを受ける必要があります。

## Webhook をインターネットに公開する必要がある

Slack には [Real Time Messaging (RTM) API](https://api.slack.com/rtm) というものがあり、これを使うことで bot アプリサーバーをグローバルに公開せずに bot を動かすことができます（bot アプリと Slack が websocket で通信する）。一方、LINE bot を作る際は Webhook をインターネットに公開する必要があります。

とはいえ、外部から Webhook を叩いて動かすには適切な署名をリクエストヘッダーに含める必要がある（シークレットさえ漏れなければ第三者がそれを行うのは不可能）ので、Webhook 自体が外部露出していることの危険性はそこまで高くないと言えそうです。また、RTM のような仕組みがある方がレアケースな気もするので、LINE を責める意図は全くありません。念のため。

## 1つのトークグループに bot は1つまで

LINE bot はグループトークに参加させることもできるのですが、参加できる bot は1つだけです。複数 bot を招待しようとすると、1つが強制退出されてしまうらしいです (参考: https://www.nowsprinting.com/entry/2016/10/02/043410) 。

そのため、1つの bot には小さな機能を持たせて、bot を複数ウヨウヨさせるような戦略はとることができません。やりたいことがたくさんある場合、1つの巨大な bot を開発する必要があります。

## bot にメンションを飛ばせない

LINE は Slack と違い、bot に向けて `@ボット名` のような形でメンションが飛ばせません（2018/10/24 現在）。そのため、Slack bot でよくある「とりあえずメンションを飛ばしたら反応する、でいいか」という雑な仕様決定ができません。

* bot の機能をトリガーするためのキーワードを独自に決める
* 自然言語解析からの文脈判断を頑張る

といったアプローチが必要になります。

前述した「1つのトークグループに bot は1つまで」という特徴もそうなのですが、LINE bot は1対1で会話するもの、という前提で設計されているような気がしています。開発する際もそういったメンタルモデルで臨む必要がありそうです。
【Rails】requireとpermitメソッド

## Strong Parameters
セキュリティに関わる考え方です。
ユーザーに関わるname、email、パスワードなど、重要な情報を
悪意ある変更から守るために設定します。


## requireメソッドとpermitメソッド


```user_controller.rb
def user_params
 params.require(:user).permit(:name, :email, :password)
end
```
controllerにて、上記のような記述をします。
.requireメソッドがデータのオブジェクト名を定め、
.permitメソッドで変更を加えられる（保存の処理ができる）キーを指定します。

これをあらかじめ設定しておくことで、
仮に悪意のあるリクエスト（指定した以外のデータを送ってくる等）を受けた際に、
.permitメソッドで許可していない項目については変更されず、データの扱いがより安全になります。




##参考サイト
Rails4のStrong Parametersの使い方まとめ
http://o.inchiki.jp/obbr/181

【Ruby on Rails】require と permit の使い方がよく分からない
http://techblog.kyamanak.com/entry/2017/08/29/012909
色を透過させたときのカラーコードをJSで求める

## 経緯
色を一定値で薄くしたくて単に`rgba`の指定で薄くすると、当然の如く透過しており背景がうっすら見えてしまいます。
薄い色を指定すれば済むかもしれませんが、javascriptで計算してみました。

## アルファブレンド
2つの画像を重ねたときの重なっている箇所の色を求めるものです。
透過させている赤と青を重ねると紫になりますが、この紫のカラーコードを求めるようなものと思っております。(詳しくないです。)

式的には以下になります。

```math
out_{rgb} = src_{rgb} * alpha_{src} + dest_{rgb} * (1 - alpha_{src})
```

今回はこれをより単純に扱います。

```math
out_{rgb} = src_{rgb} * alpha_{src} + 255 * (1 - alpha_{src})
```
10進数で考えた場合`255`は白色です。背景の白色に単に透過させた色を合成することで薄くしたときのカラーコードを取得するという寸法です。

実際に、簡単にコードを書いてみます

```js
function compositeColor(code, alpha) {
  const colorCode = parseInt(code, 16) * alpha + 255 * (1 - alpha);
  return Math.floor(colorCode).toString(16);
}

function convertToPaleColor(colorCode, alpha) {
  // colorCodeは`#`を除いた16進数とします。
  const codes = [colorCode.slice(0, 2), colorCode.slice(2, 4), colorCode.slice(4, 6)];
  return codes.map(code => compositeColor(code, alpha)).join("");
}

convertPaleColor("FF0000", 0.1);
// "ffe5e5"
```

これだけです。たまに役に立つかもしれません。
Nginx + php + ZipArchive で 大容量zipファイルを作成・ダウンロード

# 問題
nginx を使ったwebサービスで、メガバイト級のファイル群をzipファイルにまとめてダウンロードする、という機能をつくる際に困った問題が起きました。

phpをつかってるので、ZipArchiveを使ってzipを生成するようにしてます。


# zip生成 & zipダウンロードのコード

```
$filepath = [..., ..., ...];

$zipName = '/var/www/html/example.zip';
if (!file_exists($zipName)) {
  mkdir($zipTmpPath, 0777, TRUE);
}

$zip = new ZipArchive();
$zipResult = $zip->open($zipName, ZipArchive::CREATE | ZipArchive::OVERWRITE);

if ($zipResult !== true) {
  throw new Exception("Zip open is FALSE");
}

try {
　　　　foreach ($files as $filepath) {
　　　　　　　　$filename = basename($filepath);
　　　　　　　　if ($zip->addFile($filepath, $filename) === FALSE) {
　　　　　　　　　　　　if (!$zip->close()) {
　　　　　　　　　　　　　　　　throw new Exception("$zip->addFile is FALSE AND $zip->close() is FALSE");
　　　　　　　　　　　　} else {
　　　　　　　　　　　　　　　　throw new Exception("$zip->addFile is FALSE");
　　　　　　　　　　　　}
　　　　　　　　}
　　　　}
　　　　if (!$zip->close()) {
    throw new Exception("$zip->close() is FALSE");
　　　　}
} catch (Exception $e) {
  throw new Exception("zip exception");
}
  
if (!file_exists($zipPath)) {
  throw new Exception('Zip does not exist.');
}

header('Content-Type: application/force-download');
header('Content-Length: ' . filesize($zipName));
header('Content-Disposition: attachment; filename="' . basename($zipName) . '"');
  
while (ob_get_level() > 0) {
  ob_end_clean();
}
ob_start();
  
if ($realFile = fopen($zipName, 'rb')) {
  while (!feof($realFile) and (connection_status() == 0)) {
    echo fread($realFile, '4096');
    ob_flush();
  }
  ob_flush();
  fclose($realFile);
}
ob_end_clean();

unlink($zipName);
```

※ 参考コード: https://blog.kuromusubi.com/develop/language/php/20180114-ziparchive

# 問題の詳細

- 400メガバイト程度のファイル群をzipにしようとすると、zipArchiveの`addFile`部分で処理が止まってしまう。
- 上記の場合、ブラウザ上では 「404 not found nginx」 と表示されてしまう。

nginxの`error.log`には、以下のエラー内容が出力されていた。

```
upstream timed out (110: Connection timed out) while reading response header from upstream, client: ....
```

```
open() "/var/www/html/dev/50x.html" failed (2: No such file or directory),...
```

# 処理が止まっていた要因

- メモリ不足
- phpのタイムアウト
- nginxのタイムアウト

# 対策
## メモリ不足の対策

```:/etc/php.ini
memory_limit = 256M
```

## phpのタイムアウトの対策

```:/etc/php.ini
max_execution_time = 600
```

## nginxのタイムアウトの対策

```:/etc/nginx/nginx.conf
fastcgi_read_timeout 1200;
```
大量のエッチなCD-RやDVD-Rを簡単に完全消去して廃棄する方法（個人情報にも応用可）

# 大量のCD-RやDVD-R。どうやって処分していますか？

ネットで検索すると、高価なシュレッダーやカッターで破壊する方法がよく紹介されていますが、何年にもわたって収集した大量のエッチなDVDがある場合は、正直やってられません。

そこで便利なのが、

**燃料用メタノール**

薬局で300円程度

燃料用メタノールをガラスや金属のバットなどに入れて、
DVD-Rを漬け込みます。

30分程度でデータの記録面がズタズタに破壊されます。

あとはプラスティックごみとして捨ててください。

使用済みメタノールは、水で薄めて台所に流してください。

これで、偏った性癖（もしくは個人情報など）が保護されます。

**メタノールは引火性が高いので取り扱いには十分注意してください**
Google Translatorのあれこれ(スタイルの崩れ修正 & ボタンclickでイベント発火&翻訳しない)

## Google Translateを使いこなす

### 概要
多言語対応する時に、気軽に使える[ウェブサイト翻訳ツール - Google 翻訳](https://translate.google.com/manager/website/?hl=ja)。
今回は、このgoogle translateで、色々試行錯誤した内容をまとめておきます。
まあ、あまり使うことはないかと思いますが、参考にしてみてください。

### スタイル崩れる問題
なぜか、Google Translateを使うと、既存のスタイルが崩れて画面がぐちゃぐちゃになってしまう。
原因を調べてみると、翻訳イベントの後に、bodyタグに謎のスタイルが当たっている。
`style="position: relative; min-height: 100%; top: 40px;`

これを直すために、cssに以下のように記述

```css
/* Google Translate Overrides対応 */
html, body{
  min-height: 0!important;
  height: auto!important;
  position: inherit!important;
}

```

### タグではなく、ボタンclickで翻訳

defaultで用意されているselectタグを使うと簡単だが、実際に使う場合に、ボタンをclickした時に使いたいなんてこともある。そのような時は、下記のように使ってあげると良い。


```html
<button id="translate-en-btn">英語翻訳する</button>
```


```js


// 英語対応
translate_lang('translate-en-btn', 'en');

/**
 * ボタンを押した時に、指定の言語でgoogle翻訳する
 * @param btn
 * @param lang
 */
function translate_lang(btn, lang) {
    var target = document.getElementById(btn);
    target.addEventListener('click', function () {
        var jObj = $('.goog-te-combo');
        var db = jObj.get(0);
        jObj.val('en');
        fire_google_translate(db, 'change');
    });
}

/**
 * グーグル翻訳のイベントを発火
 * @param element
 * @param event
 * @returns {*}
 */
function fire_google_translate(element, event){
    if (document.createEventObject){
        // dispatch for IE
        var evt = document.createEventObject();
        return element.fireEvent('on' + event, evt);
    }
    else {
        // dispatch for firefox + others
        var evt = document.createEvent("HTMLEvents");
        evt.initEvent(event, true, true);
        return !element.dispatchEvent(evt);
    }
}
```


こんな感じでやってあげれば、ボタンを押下した時に、翻訳するイベントが走ります。

### google翻訳しない

#### 全体的に翻訳しない場合
そもそも、google翻訳自体を走らせたくないよという場合は、google翻訳時に保存されたcookieを削除します。
`googtrans`というcookieに保存されているので、サーバーサイドで削除してあげましょう。
以下、Rubyの場合ですが。

```ruby
cookies.delete(:googtrans)
```

#### 部分的に翻訳しない
この箇所だけは、翻訳して欲しくないんだよね、というところはhtmlのクラスで`notranslate`をつけてあげましょう。

```html
<p class="notranslate">翻訳しないでー</p>
```



以上、割と力技のものもありましたが、まとめてみました。

### 参照
[css - Prevent Google Translator from changing height of html to 100% - Stack Overflow](https://stackoverflow.com/questions/3562784/prevent-google-translator-from-changing-height-of-html-to-100)
[jquery - Trigger Google Web Translate Element - Stack Overflow](https://stackoverflow.com/questions/6303021/trigger-google-web-translate-element)
[javascript - Google Translate set default language - Stack Overflow](https://stackoverflow.com/questions/1773687/google-translate-set-default-language)
[javascript - How can I tell Google Translate to not translate a section of a website? - Stack Overflow](https://stackoverflow.com/questions/9628507/how-can-i-tell-google-translate-to-not-translate-a-section-of-a-website)
はじめてのyukicoder vol.3

今回から『簡単な問題を解いてみよう』をこなしていきます

地獄みたいな問題にぶち当たって三時間くらい悩んだとか絶対に言えないですね・・・

ではNo.46からです

##No.46
```46.f90
implicit none
double precision a,b,c
read(*,*) a,b
if ((mod(b,a)).eq.0) then
   c=b/a
   write(*,*) int(c)
else
   c=b/a
   c=c+1
   write(*,*) int(c)
end if
end
```
特に難しいところもなく、ごく普通な感じに終わりました

せいぜい〈if構文〉中の条件文は()で閉じるのを忘れないようにしようくらいですかね？

real(8)よりdouble precisionの方がしっくりくる定期

意味は同じ・・・かなぁ、少しお勉強ですネ

##No.388
```388.f90
implicit none
integer(8) s,f,c
read(*,*) s,f
c=s/f
c=int(c)+1
write(*,*) c
end
```
上とやっていることは同じですよー

integerで宣言しているので、int構文はいらなかったかもしれませんね


##No.188
```188.f90
program calendar
implicit none
integer(8) a,b,c,i,y
y=0
do i=1,6
   if (i==2) then
      call twentyeight(b,y)
   else if (mod(i,2)==0) then
      call thirty(c,i,y)
   else
      call thirtyone(a,i,y)
   end if
end do
do i=7,12
   if (i==9) then
      call thirty(c,i,y)
   else if (i==11) then
      call thirty(c,i,y)
   else
      call thirtyone(a,i,y)
   end if
end do
write(*,*) y
end program calendar

subroutine twentyeight(b,y)
integer(8) i,x,b,y
b=28
do i=1,b
   x=int(i/10)+mod(i,10)
   if (x==2) then
      y=y+1
   end if
end do
end subroutine twentyeight

subroutine thirty(c,i,y)
integer(8) j,x,c,y,i
c=30
do j=1,c
   x=int(j/10)+mod(j,10)
   if (x==i) then
      y=y+1
   end if
end do
end subroutine 

subroutine thirtyone(a,i,y)
integer(8) j,x,a,y,i
a=31
do j=1,a
   x=int(j/10)+mod(j,10)
   if (x==i) then
      y=y+1
   end if
end do
end subroutine 
```
時間泥棒でしたね・・・

解き終わった後に、Fortranで書いている人のを見たんですが、こんなのより断然よかったというネ

dataは配列にしか使ったことなかったので、普通に使えるとは思いませんでした

問題の意味は分かる(ただし書けるとは言っていない)が直撃

作成手順としては

・ifで場合分け
・月ごとのHAPPY BIRTHDAYを計算
・合計値を算出

とこんな感じですが、三つ目が一番の難敵でした

call文ではあくまで数値しか出してきませんし、call文+call文の構造は無理ですしね

結局単純な話で、yを代入すれば勝手に事がすすむんですよ・・・

もっとスマートに書きたかったヨ

前途多難で笑えないネ

今回はこの三問で力尽きました

以上！
WPFアプリからファイルをドラッグ

# WPFアプリからファイルをドラッグ
WPFアプリにドロップされた場合の例は結構あるんですが、WPFアプリからデスクトップやエクスプローラなんかにドラッグする時のサンプルが見つけ難かったので備忘録。

画面に表示されている<Image>コントロールを右クリックするとドラッグ開始です。


```xml
<Window x:Class="WpfApp6Drag.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp6Drag"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="500">
    <Window.Resources>
        <ResourceDictionary>
            <BitmapImage x:Key="neko" UriSource="Images/neko.jpg"/>
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <Image Name="ImageWork" Source="{StaticResource neko}" Height="300" MouseDown="Image_MouseDown"/>
    </Grid>
</Window>
```
```c#
private void Image_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed) {
        // 元の画像はとりあえずリソースから取得
        var img = FindResource("neko") as BitmapImage;

        // テンプラリフォルダに画像ファイル作成
        var filePath = System.IO.Path.GetTempPath() + "image.jpg";
        using (var fs = new FileStream(filePath, FileMode.Create)) {
            BitmapEncoder enc = new JpegBitmapEncoder();
            enc.Frames.Add(BitmapFrame.Create(img));
            enc.Save(fs);
        }

        // ドラッグ開始
        var dataObject = new DataObject(DataFormats.FileDrop, new[] { filePath });
        DragDrop.DoDragDrop(ImageWork, dataObject, DragDropEffects.Copy);
    }
}
```

文字列や画像イメージではなく、ファイルとしてドラッグさせたかったのでテンポラリフォルダにimage.jpgを一度作って、それをドラッグするようにしています。
ドラッグ自体は DragDrop.DoDragDrop()を呼べば後は勝手にやってくれるので簡単なんですが、ここに辿り着くまでが大変でした。
Spacemacsのターミナルのデフォルトをfish shellに変える

Spacemacsのターミナルはデフォルトではbashを使うことになる。
ただ、これは設定を書き換えればfish shellにすることができる。

以下の内容を`.spacemacs`に記述する。

```lisp
dotspacemacs-configuration-layers
'(
  ;; ...
  (shell :variables shell-default-term-shell "/usr/local/bin/fish")
  ;; ...
 )
```

`"/usr/local/bin/fish"`はfishへのパスを記述するので、環境によって変わる可能性がある。
各自、`which fish`などを使って調べておく。
VSCodeにてSpringBootプロジェクト作成した時に遭遇したエラーの対象方法まとめ

VSCodeの問題というより、SpringBootプロジェクト作成時に遭遇したエラーというべき内容です。ご了承下さい。

# プロジェクト作成

VSCode の Spring Initializr でプロジェクトを作成

Dependencies
- Lombok
- JPA
- PostgreSQL

# 遭遇したエラー
mvn clean package 実行で２つのエラーが発生。

## ①entityManagerFactory

コンフィグクラスが必要なの感じのエラー

```java
Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method failed
```

### 対処方法
pom.xml の &lt;dependencies&gt; に次を追加。

```xml
<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
```


## ②PgConnection.createClob() メソッドはまだ実装されていません。

見覚えのあるエラーです。

```java
Caused by: java.sql.SQLFeatureNotSupportedException: org.postgresql.jdbc.PgConnection.createClob() メソッドはまだ実装されていません。
```

### 対処方法

hibernate.properties に以下の定義を追加。

```properties
hibernate.jdbc.lob.non_contextual_creation = true
```

# 参考サイト

- [HibernateでPostgreSQLに接続する際の初期化時エラー](https://qiita.com/bwtakacy/items/be3509e1765546f92184)
- [Error creating bean with name 'entityManagerFactory' defined in class path resource : Invocation of init method failed](https://stackoverflow.com/questions/40058001/error-creating-bean-with-name-entitymanagerfactory-defined-in-class-path-resou)
Bashでワイルドカード展開を無効にする


ユーザー入力のデータや、AA等を扱っている際に、`*`が自動的に展開されて困る場合があります(ありました)
単純な解決策:
  * *オプションセッティングで解決* できます。

# `set -f`

`-f`はワイルドカード展開を無効化するオプションのようです。
そのため、展開されていない所のみ有効化してやれば望んだ通りのことができます。

```bash
set -f
# your work here...
set +f
```