OmniAICreator/Qiita-1.07M huggingface dataset:
【問題解決】Scala: Play-JSON: 「No instance of play.api.libs.json.Writes is available ...」というエラー発生

# 環境
* Scala 2.12.5
* [play-json](https://www.playframework.com/documentation/ja/2.2.x/ScalaJson) 2.6.7


# やりたいこと
オブジェクトをJSONオブジェクトに変換したいです。

下記サイトを参考にしました。
[Play Framework で JSON パースを簡単に](https://qiita.com/miyatin0212/items/fdfe3c6141323ae281c3)


# 問題

```scala:Main.scala
object Main {
  def main(args: Array[String]): Unit = {

    val profile = Profile("miyatin", 21, List("Scala", "C#", "JavaScript", "PHP"),
      University("Kobe Univ",  "Engineering", 4 )
    )

    // ProfileクラスからJSONへ
    val profileJson = Json.toJson(profile)
    println(profileJson)

  }
}
```

```scala:Model.scala

object Profile {
  implicit val jsonWrites = Json.writes[Profile]

  implicit val jsonReads = Json.reads[Profile]
}



case class University(name: String, major: String, grade: Int)

object University {
  implicit val jsonWrites = Json.writes[University]

  implicit val jsonReads = Json.reads[University]
}


```

```txt:console
Error:(9, 40) No instance of play.api.libs.json.Writes is available for jp.co.sample.University in the implicit scope (Hint: if declared in the same file, make sure it's declared before)
  implicit val jsonWrites = Json.writes[Profile]
```

# 原因・解決方法
「もし同じファイルに定義しているならば、前に宣言されていないか確認しろ」とのことです。

以下のように宣言の順番を変えたら、動きました。

```scala:Model.scala

case class University(name: String, major: String, grade: Int)

object University {
  implicit val jsonWrites = Json.writes[University]

  implicit val jsonReads = Json.reads[University]
}


object Profile {
  implicit val jsonWrites = Json.writes[Profile]

  implicit val jsonReads = Json.reads[Profile]
}

```

# 補足
Json.writesの宣言です。マクロを使っています。

```scala:Json.scala
object Json extends JsonFacade {
  def writes[A]: OWrites[A] = macro JsMacroImpl.implicitConfigWritesImpl[A]
}
```
ターミナルでGoLandを使ってプロジェクトを開く

# バージョン
Goland 2018.1

# できるようになること

ターミナルで

```shell
goland path/to/project
```

と打って、対象のプロジェクトが開けるようになる。

[ターミナルからRubyMineを呼んで任意ファイルを開く - Qiita](https://qiita.com/kidach1/items/bf2316038fbbd7d1ed2a) のGoLandバージョン。

# やり方

①Tools -> Create Command-line Launcher

<img width="360" alt="スクリーンショット 2018-04-10 11.04.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/164998/0eabf43a-00eb-f4fc-bdaf-cd2c315d6cb8.png">


②開いたウインドウでパスをコピー


<img width="718" alt="スクリーンショット 2018-04-10 11.04.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/164998/646e7c04-5d81-6d73-d583-f49ca945a45d.png">

③エイリアスを追加
`.zshrc`(or `.bashrc`)にエイリアスを追加します。


```shell
alias goland='<YOUR_PATH>/goland'
```
`<YOUR_PATH>`には②でコピーしたパスを入れてください。


## 参考
[Launch IntelliJ IDEA or Goland from command line (Linux or MacOs)](https://medium.com/@clasikas/launch-intellij-idea-or-goland-from-command-line-linux-or-macos-b1cb3876ea7)
Windowsで特定のプログラムを自動停止

# 趣旨

具体的にはKeePassとかを，うっかり落とし忘れて放置してしまい，別のマシンで共有しているファイルを更新してしまうとファイルコンフリクトを起こしてバージョニングがぐちゃぐちゃになってしまうので，うっかり落とし忘れているKeePassを自動で落としたい．
特にWindowsでやってしまいがち．
なのでWindowsについてのみ書く．もしLinuxでもやりたいなら``killall keepass2``をcronで回せば良いと思う．

# 方法

## 落とし方

特定のプログラムを停止させるには，次のコマンドで良い．

```
taskkill /IM KeePass.exe
```

このコマンドをcmd.exeのコマンドラインオプションで実行させることを，タスクスケジューラに登録すれば完成．

```
cmd.exe /C taskkill /IM keepass.exe
```

/Cと/Rと/Kとあるが，/Cか/Rが良いと思う．

## タスクスケジューラへの登録

- 管理ツールのタスクスケジューラを起動
- タスクスケジューラライブラリ内で「新しいタスクの作成」
    - トリガの設定  
      アイドル時に実行することした．web情報によれば，15分のアイドルにより判定されるらしい．  
      → [タスクスケジューラのアイドル時間の判定 \- マイクロソフト コミュニティ](https://answers.microsoft.com/ja-jp/windows/forum/windows_7-security/%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%B9%E3%82%B1/3248e98a-49bd-4e55-89f4-aca177d57586)  
      ![trigger.jpg](https://qiita-image-store.s3.amazonaws.com/0/210798/0250e10d-33b2-ade1-3b3e-be5f3c12f1e2.jpeg)
    - 操作の設定  
      ![operation.jpg](https://qiita-image-store.s3.amazonaws.com/0/210798/15c10209-7fb5-1f8b-38ba-cc83eff6f336.jpeg)
    - タスク名の設定  
      全般タブでタスクに名前をつけないと保存できないので忘れることはないと思うけど，まぁ何かつける．close keepassとか分かりやすいのがいいんじゃないだろうか．

他の設定はまぁ適当に．

## 確認

最後に，keepassを起動した状態で作成したタスクを右クリックし「実行する」で動作確認すれば完了．  

## おまけ

keepassを起動しないでいると該当のIM名が存在しないというエラーを起こす．
私は気にしないことにしているが，もし気になる場合はbatchファイルでtasklistを実行し，findで絞り込んだあと，ERRORLEVELを参照して存在確認する．
多分，こんな感じ．  
このbatファイルをプログラム/スクリプトの欄に指定すればOK．

```
tasklist | find /I "keepass.exe" > nul
if not a%errorlevel%==a1  (
    taskkill /IM keepass.exe
)
```
VMWareでハードディスクのイメージが分割ファイルで管理されているのを１つにまとめる

https://server-setting.info/blog/vmware-disk-file-marge.html
のまんまです。

# 1 download tools
workstation userは既に入っている。
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=1023856

# 2 configuration PATH
vmware-diskmanagerのPATHを通す。
$ set PATH=%PATH%;"C:\Program Files (x86)\VMware\VMware Workstation"

# 3 combine
$ cd /path/to/vm dir
$ vmware-vdiskmanager.exe -r old.vmdk -t NUM new.vmdk

NUM:
0 : 事前割当なし拡張可能な仮想ディスク
1 : 2GBで分割された拡張可能な仮想ディスク
2 : 事前に割り当てられた仮想ディスク
3 : 2GBで分割された事前に割り当てられた仮想ディスク
4 : 事前に割り当てられたESX-type の仮想ディスク
5 : ストリーミング用に最適化された圧縮ディスク
6 : thin provisioned virtual disk – ESX 3.x 以上で利用可能

# 4 rename filename in vmx file
scsi0:0.filename = "new.vmdk"
sympy でDJアルゴリズム(量子ゲート計算）

sympy の基本的な使い方は [sympy で量子計算](https://qiita.com/41semicolon/items/8f5d8c6d8b767959ed97) を参考のこと。

ドイチェ=ジョザアルゴリズム**DJ** とは量子ゲート Fが constant もしくは balanced であるとわかっている場合、 F がどちらであるかを決定するアルゴリズムである。

入力:3-qubit, 出力:1-qubit の系を考えよう。DJ アルゴリズムを使うと、以下のように `isBalanced` 関数を定義できる。引数は量子ゲートである。

```python
def isBalanced(circuit):
    start = Qubit('1000')
    DJ = H(0)*H(1)*H(2)*circuit*H(0)*H(1)*H(2)*H(3)
    # calculate probability for |*000>, could be better implemented.
    p1 = qapply(Dagger(Qubit('0000')) * DJ * start)
    p2 = qapply(Dagger(Qubit('1000')) * DJ * start)
    prob = abs(p1)**2 + abs(p2)**2
    #print (prob)
    if prob < 0.001:
        return True
    elif prob > 0.999:
        return False
    else:
        raise Exception('something wrong')
```

いくつかの balanced, constant なゲートを通してみる。うまく動作しているようだ。

```python
from sympy.physics.quantum.qubit import Qubit, measure_all
from sympy.physics.quantum.gate import I, X, Z, H, CNOT, CGate
from sympy.physics.quantum.dagger import Dagger
from sympy.physics.quantum.qapply import qapply

Toffoli = lambda a,b,c: CGate((a,b),X(c))

def isBalanced(circuit):
    start = Qubit('1000')
    DJ = H(0)*H(1)*H(2)*circuit*H(0)*H(1)*H(2)*H(3)
    # calculate probability for |*000>, could be better implemented.
    p1 = qapply(Dagger(Qubit('0000')) * DJ * start)
    p2 = qapply(Dagger(Qubit('1000')) * DJ * start)
    prob = abs(p1)**2 + abs(p2)**2
    #print (prob)
    if prob < 0.001:
        return True
    elif prob > 0.999:
        return False
    else:
        raise Exception('something wrong')

Fc1 = I
Fc2 = X(3)
Fb1 = Toffoli(0,1,3)*CNOT(2,3)
Fb2 = CNOT(0,3)*CNOT(1,3)*CNOT(2,3)

for f in [Fc1, Fc2]:
  assert(isBalanced(f) is False)
for f in [Fb1, Fb2]:
  assert(isBalanced(f) is True)

# F = CNOT(0,3)*Toffoli(0,1,3)
# isBalanced(F) #throws Exception
```

参考：https://www.appi.keio.ac.jp/Itoh_group/abe/pdf/qc3.pdf
codemirror demo list補完

### 公式のdemo一覧が足りないので、補完。
http://codemirror.net/demo/activeline.html
http://codemirror.net/demo/anywordhint.html
http://codemirror.net/demo/bidi.html
http://codemirror.net/demo/btree.html
http://codemirror.net/demo/buffers.html
http://codemirror.net/demo/changemode.html
http://codemirror.net/demo/closebrackets.html
http://codemirror.net/demo/closetag.html
http://codemirror.net/demo/complete.html
http://codemirror.net/demo/emacs.html
http://codemirror.net/demo/folding.html
http://codemirror.net/demo/fullscreen.html
http://codemirror.net/demo/hardwrap.html
http://codemirror.net/demo/html5complete.html
http://codemirror.net/demo/indentwrap.html
http://codemirror.net/demo/lint.html
http://codemirror.net/demo/loadmode.html
http://codemirror.net/demo/marker.html
http://codemirror.net/demo/markselection.html
http://codemirror.net/demo/matchhighlighter.html
http://codemirror.net/demo/matchtags.html
http://codemirror.net/demo/merge.html
http://codemirror.net/demo/multiplex.html
http://codemirror.net/demo/mustache.html
http://codemirror.net/demo/panel.html
http://codemirror.net/demo/placeholder.html
http://codemirror.net/demo/preview.html
http://codemirror.net/demo/requirejs.html
http://codemirror.net/demo/resize.html
http://codemirror.net/demo/rulers.html
http://codemirror.net/demo/runmode.html
http://codemirror.net/demo/search.html
http://codemirror.net/demo/simplemode.html
http://codemirror.net/demo/simplescrollbars.html
http://codemirror.net/demo/spanaffectswrapping_shim.html
http://codemirror.net/demo/sublime.html
http://codemirror.net/demo/tern.html
http://codemirror.net/demo/theme.html
http://codemirror.net/demo/trailingspace.html
http://codemirror.net/demo/variableheight.html
http://codemirror.net/demo/vim.html
http://codemirror.net/demo/visibletabs.html
http://codemirror.net/demo/widget.html
http://codemirror.net/demo/xmlcomplete.html
VSCodeでphpcsのエラーメッセージが出る

# エラーメッセージについて

ある日、MacでVSCodeを起動すると、こんな感じのエラーメッセージが出るようになりました。

<img width="450" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3232313834352f36366564363563392d343032322d303834372d383533612d6131643934656565303030372e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/221845/f8aceca7-357b-9972-0265-45e8f4eb58a4.png">

> phpcs: Request workspace/configuration failed with message: Unable to locate phpcs. Please add phpcs to your global path or use composer dependency manager to install it in your project locally.

翻訳すると、「phpcsが見つからないので、グローバルパスに追加するか、ローカルのプロジェクトにインストールしてください。」という感じでしょうか。
最近、PHP関係の拡張機能をVSCodeに色々と導入したので、その際に、phpcsという拡張機能も一緒に入れたのでしょう。（覚えてない）
拡張機能phpcsを利用するためには、PHP_CodeSnifferというパッケージをPCにインストールする必要があるようです。phpcsというのはPHP_CodeSnifferの略称のようですね。

# エラーメッセージの消し方
[PHP_CodeSnifferのページ](https://github.com/squizlabs/PHP_CodeSniffer)に答えが載っていました。
ずばり、PHP_CodeSnifferをインストールすれば良いです。

Composer（PHPのパッケージマネージャー）を導入済みであれば、以下のコマンドでPHP_CodeSnifferをインストールできます。

```bash
composer global require squizlabs/php_codesniffer
```

私の環境では以下のディレクトリにインストールされました。

```
~/.composer/vendor/squizlabs/php_codesniffer
```

VSCodeを再起動したところ、エラーメッセージは出なくなりましたとさ。めでたしめでたし。

# Composerを入れてない場合

Composerなんて使いたくない！という人もいるかもしれません。[公式ページ](https://github.com/squizlabs/PHP_CodeSniffer)を見ると、他にも色々なインストール方法が載っているので、ご自身の環境に合ったものを試してみてはいかがでしょうか？
Firbase の Crashlytics のクラッシュレポートのメール通知の設定について

# ０．はじめに

Android アプリを開発し、

やはりクラッシュレポートが送られた方が良いなぁ、
と思い、

Firebase の Crashlytics を設定したところ、

クラッシュレポートのメールが、
送られたり、送られなかったりして…、

色々調べたり、
サポートに問い合わせたりしたので、
シェア。

# １．Firebase プロジェクトの所属ユーザーに、「所有者」や「編集者」の権限を付与した際の、クラッシュレポートのメール通知の設定

以下のページに記載されていますが、Firebase プロジェクトの「所有者」と「編集者」は、クラッシュレポートのメール通知が送られるとのことでした。

* [Configure Email Alerts \- Firebase Help](https://support.google.com/firebase/answer/7276542?hl=en)

この設定のせいで、
クラッシュレポートのメールが、
(Firebase のプロジェクトの「オーナー」や「編集者」に)送られたり、
(Firebase のプロジェクトの「オーナー」や「編集者」以外に)送られなかったり、
していた訳です。

で、
Firebase のプロジェクトの「オーナー」や「編集者」以外に、クラッシュレポートをメール通知するやり方がわからなくて、サポートに問い合わせたところ、以下の手順を教えて頂きました。

# ２．クラッシュレポートのメール通知の設定

1. まず、Firebase Console を開きます。
    * [Firebase console](https://console.firebase.google.com/u/0/?hl=ja&pli=1)
<br><br>
1. Firebase Console が開いたら、右上にあるベルのアイコンをクリックします。
    * <img width="640" alt="0001.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/d9da024b-fd7c-90c1-9f5b-c45cd9ba66fe.png">
<br><br>
1. 右側からアラートのポップアップが表示されるので、右上にある歯車のアイコンをクリックします。
    * ※ポップアップで、「All projects」が選択されているので、個別にプロジェクトの設定をしたい場合は、変更して下さい。
<br><br>
    * <img width="640" alt="0002.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/be101f8e-c25e-dd78-7fe8-db37b45a4289.png">
<br><br>
1. 「アラートを登録」画面が表示されるので、以下の設定を ON にします。
    * 「このプロジェクトのアラートを受信します」
<br><br>
    * <img width="640" alt="0003.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/6b246edf-44a8-2bcd-832b-1665c91e0938.png">
<br><br>
1. そうすると、以降の設定を編集可能になるので、「Crashlytics」以下をクリックします。
    * 新しい致命的な問題の報告
        * ※必要であれば、それ以外の設定をしてもいいと思います。
<br><br>
    * <img width="640" alt="0004.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/105bef1f-f039-7fa8-0002-03b8f7b51c6b.png">
<br><br>
1. ダイアログが表示されるので、メール送ってほしいアプリにチェックを入れ、「保存」ボタンを押下します。
    * <img width="640" alt="0005.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/f7d931a5-423e-b9e2-5fe6-04d8f4f74b59.png">
<br><br>
1. 以下の画面に遷移し、設定が完了します。
    * <img width="640" alt="0006.png" src="https://qiita-image-store.s3.amazonaws.com/0/161939/664bfaa2-d964-5eb7-ca6f-facdc4a4c57d.png">

# ９９．ハマりポイント

* Firebase のことをあまり知らないので、各アカウントに通知の設定があることを知りませんでした。(っていうか、「気づけよ」って感じですが…。) そのお陰で、サポートに問い合わせる事になりました。ただ、サポートからの返事も早く、わかりやすかったので非常に助かりました。サンキュー、 Mike !!

# ＸＸ．まとめ

で、まとめですが。

大前提として、

* <font color="magenta"><b>通知の設定は、各アカウントの設定 (ベルのアイコン) から行う。</b></font>

で、例外的に、

* <font color="orange"><b>Firebase プロジェクトの「オーナー」や「編集者」の権限が設定されると、そのプロジェクトの全てのアプリのクラッシュレポート (新しい致命的な問題の報告) のメール通知設定がされる。</b></font>

という事みたいです。

逆に、

* <font color="red"><b>Firebase プロジェクトの「オーナー」や「編集者」の権限が解除されると、そのプロジェクトの全てのアプリのクラッシュレポート (新しい致命的な問題の報告) のメール通知設定も解除される。</b></font>

みたいなので、
注意しないといけないです。

とりあえず、
Firebase プロジェクトのユーザーの権限変更したら、念の為にクラッシュメールのメール送信設定を確認する様に伝えた方が間違いが起きない様に思います。
他の言語やフレームワークをやって気づいたRailsのすごさ9つ

java+spring / python+flaskを使って見て、改めてrailsの凄さ・便利さを感じたのでメモ。
railsで当たり前だと思ってた機能が、当たり前ではないことに改めて気付かされた。

# 1 初期装備がすごい

他のフレームワークを使うと

rails new (+ 引数)で出来る装備がやばい。
- RDBへの接続, ORM
- MVCの切り分け
- それなりの規模に対応できるフォルダ構成
- DBのスキーマ管理
- Logging
- dev / production / test環境の切り分け
- assets管理 min対応 / alt-js対応
- 今ではwebpackやreactも一発

# 2 ActiveRecordがすごい
ActiveRecordは最強のORM


# 3 json化がすごい
だいたい何でもto_jsonやrender :jsonすると当たり前のようにjsonになる
apiサーバの作成で

```
render json: Hoge.includes(:moge).where(kind:10, moges:{grade:4})
```

が1行で書けてしまう楽さよ。

# 4 paramsがすごい
getでもpostでもfomDataもjsonもmulti-partも全部parmas[:hoge]で取れる


# 5 loggerがすごい
リクエストの始まりと終わりと処理時間、routeエラー、捕捉されない例外をログに出力してくれる。
初期状態で、develomentだとSQLをログに表示してくれる。
ローテーションも設定数カ所いじるだけ


# 6 assetsがすごい
assets-pipeline or webpack環境を一発で構築してくれる
es6 / haml / sass などもgemで一発


# 7 互換性がすごい
railsは互換性が無いイメージだけど、プロジェクト全体がrails wayに含まれる。

# 8 deviseがすごい
簡単かつ高性能かつデファクトスタンダート

# 9 フルスタックすごい
ここで書いたことを全部含めてrails wayなので、他のrails開発メンバーと意識や前提が共有出来る。
他のフレームワークでやると、どうしてもオレオレ化した構成になりがち。
Data Bindingで論理演算子などを使う

いつもわからなくなって過去のコードを掘り出してくることになるので備忘録

- 論理積を使う
 
```xml

android:visibility="@{hogeFrag!=null &amp;&amp; hogeFrag.isGotResult ? View.GONE : View.VISIBLE}"
```

- 論理和を使う

```xml

android:text="@{HogeClass.canStart() || HogeClass.isFinished() ? "push for start" : null}"
```


- 3項演算子を使う
 
```xml

android:text="@{HogeClass.isStarted() ? "isStarted" : null}"
```


- 文字列の一部を実行時に値を決める。+ 他の文字列を再利用する。
  -  values/strings.xml
    
    ```xml
<string name="pages">%1$d枚目%2$s色</string>
<string name="red">赤</string>
    ```

  -  layout/hoge_layout.xml
   
      ```xml
<layout>
    <data>
        <variable
            name="data"
            type="com.user.hogehoge.hogeClass"/>
    </data>

    (中略)

     android:text='@{@string/pages(data.pageNo,@string/red)}'

    (以下略)
    ```

->「3枚目赤色」「5枚目赤色」のように実行時に値を変更可能したり、他の文字列を再利用したりできる。

- 文字列の結合

   
```xml

     android:text='@{ @string/month + @string/day }'
 ```


-  android SDKのクラスや自作クラスをimportする(staticな値やメゾッドの使用のため)
 
```xml

   <data>
        <import type="android.view.View"/>

        <import type="com.user.hoge.HogeClass"/>

   </data>
```

- 自作クラスのデータを宣言する

```xml
    <data>
        <variable
            name="hogeFrag"
            type="com.user.hoge.HogeFragment"
            />
    </data>
```
- int型で自作クラスを介して渡した変数をString型にする

```xml

     android:text='@{ String.valueOf(data.price) }'
 ```


- DataBindingとは直接関係ないが、string.xml内の文字列に「"」を含めたいとき（ハマって時間溶かしてしまったので）

```xml
    <string name="hoge">\"</string>
```

-> 「\&quot;」だと、android studio上のpreviewだと「"」とちゃんと表示されるが、実機だと無視されて何も表示されないので注意 
(参考：https://qiita.com/kazuhidet/items/7866ec0ce3e8b0fccf60)
【Excel 2016 for Mac/Excel 2016(windows版)】ショートカット比較&備忘録

# Win&Mac両刀に…
どうも。とあるインターン学生です。
私用とインターンで使うのがMacBook、大学の研究室で配布されたのがThinkPad。
別にMacじゃなきゃ発狂する人種では無いのでいいのですが、MacとWindowsのExcelの使用感の違いに気持ち悪さを覚えています。Mac版Excelは店員にそそのかされて買ったので、どんなに不便でも他の表計算ソフトに乗り換えるのが癪で使い続けています。
ただ、似て非なる使用感のWin版とmac版のExcelを使い分けている状態なので、ショートカットの記憶がめちゃくちゃになります。

似た境遇の方のためにも、記憶がめちゃくちゃになる自分のためにも、ここに備忘録として置いておきます。
当たり前だけど両方同時に乗ってるサイトあまりないんですよね。
しかも逐一調べるのも「GUIからリボンのこのボタンを選択して…」って書いてるサイトが多いので~~いちいち検索するのも面倒臭い~~大変なんですよね

# 前提-環境
[私用MacのExcel] Excel 2016 for Mac ver.16.11.1
[研究室Windows]  Excel 2016 ver.16.0.4266.1001

# この記事での記法
|  |windows版  |mac版  |
|---|---|---|
|C  |Ctrl  |<font color=red>command⌘|
|M  |alt  |option⌥|
|RET  |Enter  |return  |
|control|  |<font color=red>control⌃|

- 大文字は上の表の通りに対応。小文字はキーボードからアルファベットを入力。
例：C-M-v(形式を選択して貼り付け)なら
　　win:Ctrl、alt、vを同時押し
　　mac:command⌘、option⌥、vを同時押し  

- マイナス記号は同時押し、プラス記号は「順番に押す」。windows版のリボン操作をショートカットで操作するときは他のコマンドと違い順番に押します。急に操作感変わるよね。
windowsの版のリボン操作は順番に押すから厳密にはショートカットではない…？
例：M+h+a+c(中央揃えにする)なら
　 win:Alt、h、a、cを**順番に**押す

<font color=red>※emacsなどで使用されるショートカットの表記法を**アレンジして**表記しています。</font>　　
本当はemacsのキーバインドの"C"にあたるキーってcontrolなんですよね。

# ショートカット一覧表
|  |windows版  |mac版  |
|---|---|---|
|テキストのコピー  |C-c  |C-c  |
|テキストのペースト  |C-v  |C-v  |
|切り取り|C-x |C-x |
|貼り付け|C-v|C-v|
|形式を選択して貼り付け|C-M-v|C-M-v|
|1つ戻す(undo)|C-z|C-z|
|１つ進む(redo)|C-y|C-y|
|上書き保存|C-s|C-s|
|名前を付けて保存|F12|C-Shift-s|
|検索|C-f|C-f|
|置換|C-h|C-h|
|ファイルを開く|C-o|C-o|
|印刷|C-p|C-p|
|書式設定ウィンドウ|C-1|C-1|
|フォント編集|C-Shift-f||
|太字|C-b|C-b|
|斜体|C-i|C-i|
|下線|C-u|C-u|
|中央揃えにする|M+h+a+c|C-e|
|左揃えにする|M+h+a+l|C-l|
|外枠|C-Shift-6|C-M-0|
|外枠を削除|C-_|C-M--|
|フォントの拡大/縮小||C-Shift->/C-Shift-<|
|桁区切り表示|C-!|C-!|
|通貨単位付き表示|C-$|control-$|
|パーセント記号%を付けて表示|C-%|control-%|
|表示形式の削除|C-~|control-~|
|現在時刻入力|C-:|C-:/C-;|
|日付を入力|C-;||
|選択したセル全てに同じ内容を入力|C-RET|C-RET|
|シート全てのセルを選択|C-a|C-a|
|左右のセルに移動|Tab/Shift-Tab|Tab/Shift-Tab|
|編集モード|F2|F2|
|空白のセルを挿入|C-+|C-+|
|選択したセルを削除|C--|C--|
|セル内で改行|M-RET|M-RET|
|行全体を選択|C-Space|C-Space|
|列全体を選択|Shift-Space|Shift-Space[^1]|
|複数のセルを選択|Shift-移動キー|Shift-移動キー|
|縦方向にコピー|C-d|C-d[^2]|
|横方向にコピー|C-r|C-r|
|再計算|Shift-F9|Shift-F9|
|オートsum|C-=|C-Shift-t|
|絶対参照|F4|F4|
|新しいシートを挿入|Shift-F11|Shift-F11|
|シートの名前を変更|M+o+h+r||
|隣のシートに移動|C-PgUp/C-PgDn|M-→/M-←|
|シートの削除|M+e+l||
|新しいブック(ウィンドウ)|C-n|C-n|
|ブック切り替え|C-Tab||
|ブックを閉じる|C-w|C-w|
|A1セルに移動|C-Home|C-g|
|入力されているデータの先頭/末尾に移動|C-矢印キー|C-矢印キー|
|ジャンプ|C-g||
|左右のセルに移動|Tab/Shift-Tab|Tab/Shift-Tab|
|上下のセルに移動|RET/Shift-RET|RET/Shift-RET|
|オートフィルタ|M+d+f+f||
|フィルタ解除|M+d+f+s||
|ピボットテーブル|M+d+p||
|ウィンドウ枠の固定|M+w+f+f||
|グループ化|M-Shift-→|M-Shift-→|
|グループ解除|M-Shift-←|M-Shift-←|

近々見やすくします…


[^1]: 日本語キーボードだとうまくいかない
[^2]: 関数にこのショートカットを当てるとオートフィルみたいに動作する
Trello > 手順 > ボード削除 (2018-04-10)

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1709
Google Chrome バージョン: 65.0.3325.181（Official Build） （64 ビット）
```

ボードの削除方法。

[TrelloでBoardを削除する](https://qiita.com/yukinaka/items/65643c2ed310107b1554)
に記載のUIとは現在異なるUIになっている。

### 手順

ボードを選択後、以下を順次クリックする。

1. ...ボードメニューを表示
2. ... もっと見る
2. ボードをアーカイブ
3. アーカイブ
4. ボードを完全に削除
5. 削除

「ボードが見つかりません。」と表示され、削除したことが分かる。
OreoからServiceの扱いが変わって、既存のアプリがピンチに・・・

# 検証環境
この記事の内容は、以下の環境で検証した。

* Java:open jdk 1.8.0_152
* Kotlin 1.2.10
* Android Studio 3.0.2
* CompileSdkVersion:26

# はじめに
Android 8.0であるOreoからバックグラウンド処理に対してかなり厳しいルールが適用されます。
今まで、バックグラウンドで実行していたServiceが既存の実装では止められてしまいます。
この記事ではそんなServiceを救済するための方法を載せます。
何とかして、Serviceを救っていきましょう！

# OreoでのServiceの扱いについて
Oreoでは下記のページに書いているように、Serviceを大別します。

[バックグラウンド実行制限 | Android Developers](https://developer.android.com/about/versions/oreo/background.html?hl=ja)

サービスは以下のように区別されます。

|Foreground Service(フォアグラウンドサービス)|Background Service(バックグラウンドサービス)|
|:--|:--|
|・サービスを起動したアプリのActivityが可視状態にある<br>・Foreground Serviceを使用している。<br>・別のアプリが自身のサービスにバインドしている。<br>・IME、壁紙サービス、通知リスナー、音声またはテキスト サービスにバインドしている。<br>・バックグラウンドサービスではなくJobSchedulerを使用している。|左記以外すべて|

backgroundサービスと判断されると、
アプリがバックグラウンドになってから数分後にはServiceに対し、
stopSelfメソッドを呼び出した時と同じように、Serviceが終了してしまいます。

# Serviceを救おう！
既存アプリのServiceを救うには下記の方法があります。

* アプリを永遠に起動したままにしてもらおう！（現実的ではない）
* 他のアプリにバインドしてもらおう！（これも現実的ではない）
* Foreground Serviceにしよう！（現実的だ！）
* JobSchedulerに置き換えよう！（現実的だ！）

結果的に2つの方法がありそうです。
では、『Foreground Service』と『JobScheduler』の実装方法が理解できれば対応できそうですね。

# Foreground Serviceの実装方法
Foreground Serviceの実装方法は下記の記事を参照してください。
[Foreground Serviceの基本 - Qiita](https://qiita.com/naoi/items/03e76d10948fe0d45597)

# JobSchedulerの実装方法
下記の記事を参照してください。
[Jobschedulerの基本 - Qiita](https://qiita.com/naoi/items/f1d00a79196d3d2d3a81)

# JobSchedulerはLolipop(API Level 21)からしか対応していない件
必要に応じてKitkatでも同じことができる下記の2つから選択する必要があります。

* GCMNetworkManager  
[GcmNetworkManager  |  Google APIs for Android  |  Google Developers](https://developers.google.com/android/reference/com/google/android/gms/gcm/GcmNetworkManager)
* Firebase JobDispatcher   
https://github.com/firebase/firebase-jobdispatcher-android



# まとめ
いずれやってくるOreoに備えて、十分な準備をしておかなければなりません。
この記事では説明しきれていないOreoからの変更もあります。
下記のページで変更内容を確認できますので、是非一度は確認してみてください。

[Android 8.0 | Android Developers](https://developer.android.com/about/versions/oreo/index.html?hl=ja)
Aurora(MySQL)でCREATE VIEWしたらエラーが出た

# 初めに
Auroraを使って環境構築したときにビューを作成しようとして失敗した。
解決にかなり時間がかかってしまったので、今後忘れないようにメモ書き。  
# 状況  
前環境の構築に使ったCREATE VIEWを実行すると、以下のエラーが出て失敗した。
(権限がないと怒られた…)   
## 怒られたSQL
```sql
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`192.0.2.0:80` SQL SECURITY DEFINER VIEW `example_view` AS ~
```
## エラーメッセージ
```
Access denied; you need (at least one of) the SUPER privilege(s) for this operation
```
# 原因と対処方法  
元々のSQLではユーザの後にIPアドレスを指定していた。
Auroraの場合は、IPアドレスではなく、\`%`を指定する必要があった。
## 実行すべきだったSQL
```sql
CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`%` SQL SECURITY DEFINER VIEW `example_view` AS ~
```
AWSの知識はもちろん、SQLの知識も不足しすぎてて調査に無駄に時間がかかった。
Amazon RDSでのMySQLでは、rootユーザでもSUPER権限を持っていないらしい。
今までAWSをまともに触ったことがなかったので、ちょっと勉強になった。
[Notes] Short Summary on Research Papers 

## MemGEN: Memory is All You Need
**link**: https://arxiv.org/pdf/1803.11203v1.pdf
**authors**: [Sylvain Gelly Karol Kurach Marcin Michalski Xiaohua Zhai](https://research.google.com/pubs/SylvainGelly.html)
**abstract**: They have proposed a novel approach for generative modeling based on 
[Rademacher Coin Flipping metrics](https://qiita.com/festa78/items/25f982d96201f6ed4ef5)
**algorithm**:
<img width="717" alt="Screen Shot 2018-04-10 at 9.20.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/16850406-0029-a1c7-2814-8d19b7cddc48.png">
**conclusion**: comparing to [this dataset selection method](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.79.2501&rep=rep1&type=pdf
), this proposed approach can result very well.

## Modeling Semantic Plausibility by Injecting World Knowledge
**link**: https://arxiv.org/pdf/1804.00619v2.pdf
**authors**: Su Wang, Greg Durrett, Katrin Erk
**abstract**: They have proposed validated the improvement of accuracy in semantic plausibility by injecting world knowledge to existing neural network. the model is the combination of neural network(3 layers) and world knowledge.
<img width="371" alt="Screen Shot 2018-04-10 at 10.02.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/0d682fe7-ff52-5d3a-2edc-ee92cfe06849.png">
And this is the world knowledge they used in that paper.
<img width="349" alt="Screen Shot 2018-04-10 at 10.02.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/6cb4a1c3-03a2-c2b0-577e-b0fbae2416ad.png">

## Pixel2Mesh: Generating 3D Mesh Models from Single RGB Images
**Link**: https://arxiv.org/pdf/1804.01654v1.pdf
**authors**: Nanyang Wang, Yinda Zhang, Zhuwen Li, Yanwei Fu, Wei Liu, Yu-Gang Jiang
**project page**: http://bigvid.fudan.edu.cn/pixel2mesh/
**abstract**: They have proposed the method to produce the triangular mesh 3D shape from a single colour input image. Example is below.

<img width="997" alt="Screen Shot 2018-04-13 at 10.54.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/7204e736-d11e-945d-7b81-ac337aaf3958.png">

And the strategy they used in this paper called "Coarse-to-Fine" approach, which is starting with rough shape and then curve the sphere to make it intricate.

<img width="750" alt="Screen Shot 2018-04-13 at 10.57.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/a5e365ef-ecdb-0f5f-4d21-c455fc86133d.png">

As you can see, they have improved the accuracy significantly.

<img width="734" alt="Screen Shot 2018-04-13 at 10.59.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/b4411428-8c51-9572-0eaf-7944dabd20e5.png">

**Future work**: Our method only produces meshes with the same topology as the initial
mesh. Future work involves extending our approach to handle more general case,
such as scene level reconstruction, and learn from multiple images for multi-view reconstruction.
ElixirリモートアプリをObserverする

リモートのElixirアプリケーションをローカルマシンのObserverで確認するための設定

## SSH接続
リモートサーバへは、port forwardingを使用しsshで接続します。
ここでは、9001と4369のportを転送していますが、9001のほうは任意です。

```
ssh -L 9001:localhost:9001 -L 4369:localhost:4369 user@remote-server.com
```

## アプリケーション起動
リモートサーバ側で、portを指定しElixirアプリケーションを立ち上げます。
- sshで転送設定した9001をlisten設定します。
- nameは、このノードの名前です。
- cookieの値は、ローカルから接続するためのパスワードのようなものなので、任意の値を設定します。

```
iex --name remote@127.0.0.1 --cookie xxxxxx --erl "-kernel inet_dist_listen_min 9001 inet_dist_listen_max 9001" -S mix
```

## Observer起動
ローカル側で、iexを実行します。
- cookieの値は、リモートサーバ側で設定したものと合わせてください。

```
iex --name local@127.0.0.1 --cookie xxxxxx --erl "-run observer"
```

ObserverのGUIが立ち上がるので、メニューのNodesから、リモートサーバ側で設定したノードの名前を入力してください。この例では`remote@127.0.0.1`です。
（JavaScriptにおける）浮動小数点演算


JSに限ったことではないですが、JSでも例にもれず浮動小数点演算の誤差があるようです。
普段あまり小さいな小数点気にしてないですが、仮想通貨系のプログラム書いててハマりました（桁が大きいので）。

>16桁以上の大きい数字でも誤差があるようです。felisさんからコメントいただきました。

### 対応

* 整数に直して計算する
* ライブラリを使う


bignumber.jsというのを使うとよいらしいので使ってみます。他にもあるみたいです。

### 必要なライブラリのインストール

作業場所で、

```bash
npm install bignumber.s
```
### 実装

とりあえず、index.jsってファイルに以下を記述。

```js
var BigNumber = require('bignumber.js');

var ans1 = 1.1 * (10**18)
var ans2 = BigNumber(1.1).times(10**18);

console.log("ans1:"+ans1);
console.log("ans2:"+ans2);
```

### 実行

```bash
node index.js
```

### 結果

bignumber.jsで処理していない方は値がおかしい

```bash
ans1:1100000000000000100
ans2:1100000000000000000
```

### 結論

小数点自体の処理、結果が少数点になることが予想される処理はbignumber.jsを利用する。

## 追記

16桁以上でもおかしくなると教えてもらったので検証。

```js
var BigNumber = require('bignumber.js');

//動作１
if((1e16+ 1) === 1e16) {
    console.log("同じ１");
} else {
    console.log("同じじゃない１");
}

//表示してみる
console.log("1e16+1="+(1e16+1));

//動作２
if(new BigNumber(1e16 + 1) === 1e16){
    console.log("同じ２");
} else {
    console.log("同じじゃない２")
}
```

実行結果。
計算上同じに評価されるだけじゃなく、そもそも1がどっか消えてしまってます。

```bash
同じ１
1e16+1=10000000000000000
同じじゃない２
```

1e15で検証したら、それは問題なかったです。1e16+2だと同じにはなりません。

仮想通貨の実装では内部的にはuintとして扱い、Ethereumの仕様乗、e18以上をよく扱うので大変参考になりました。JSが正しく計算できるのは2の53乗まで。web3.jsは内部的にbignumber.jsを利用してるようですが、素で計算するときは注意が必要です。
async/awaitでErrorをGoっぽく書きたかった

# 非同期のエラー処理

フロントでは非同期処理でエラーを捌くことが多い。
普通だったら `Promise` で `catch` すればいいが・・・

# 複雑なエラー処理

「**複数の非同期** を **直列** で実行したい」
こういうとき、どうなるか

## Promise でやる

これを見て欲しい。

```javascript
function foo() {
  return new Promise((resolve, reject) => {
    let result_1;
    fetch('/foo')
      .catch(() => {
        reject({ errorType: 1 });
        return new Promise(() => {});
      })
      .then(_result_1 => {
        result_1 = _result_1;
        return fetch('/bar?result_1=' + result_1);
      })
      .catch(() => {
        reject({ errorType: 2 });
        return new Promise(() => {});
      })
      .then(result_2 => {
        resolve({
          messaga: 'fetch complete',
          result_1,
          result_2,
        });
      });
  });
}
```

控え目に言ってナニコレ状態。
解説をつけたのがこちら。

```javascript
function foo() {
  return new Promise((resolve, reject) => {
    let result_1;
    fetch('/foo')
      .catch(() => {
        // fetch('/foo') のエラー処理
        reject({ errorType: 1 });

        // ここで処理止めたいが・・・
        // 何もしないと次の then(1) へ進んでしまう
        // throwすると次の catch(2) へ進んでしまう
        // 苦肉の策、永遠にresolveしないPromiseを返して止める・・・
        return new Promise(() => {});
      })
      .then(_result_1 => {
        // result_1 を最後に返すためにわざわざlet
        result_1 = _result_1;
        // (1) 2つ目のfetch開始
        return fetch('/bar?result_1=' + result_1);
      })
      .catch(() => {
        // (2) fetch('/bar') のエラー処理
        reject({ errorType: 2 });

        // 苦肉の策、永遠にresolveしないPromiseを返して止める・・・
        return new Promise(() => {});
      })
      .then(result_2 => {
        resolve({
          messaga: 'fetch complete',
          result_1,
          result_2,
        });
      });
  });
}
```

つらい

## async/await でやる

`async/await` だと自然なコードにできて幸せ

```javascript
async function foo() {
  let result_1;
  try {
    result_1 = await fetch('/foo');
  } catch (e) {
    throw { errorType: 1 };
  }

  let result_2;
  try {
    result_2 = await fetch('/bar?result_1=' + result_1);
  } catch (e) {
    throw { errorType: 2 };
  }

  return {
    messaga: 'fetch complete',
    result_1,
    result_2,
  };
}
```

いい感じ。
しかし `try/catch` のために `let` を使わなきゃいけないし、インデントも増える。
`try/catch` 使ったら当たり前のごく普通のコードだけど。
`try/catch` の見た目は慣れない。

# Go みたいに書きたい

個人的に Go のエラーの書き方が好きなので、
Go みたいにエラー書けたらいいのになぁあああああ！！！
という願望がある。

## イメージ

イメージではこんな感じに書きたい

```javascript
// イメージです
async function foo() {
  const result_1, err = await fetch('/foo');
  if(err){
    throw { errorType: 1 };
  }

  const result_2, err = await fetch('/bar?result_1=' + result_1);
  if(err){
    throw { errorType: 2 };
  }

  return {
    messaga: 'fetch complete',
    result_1,
    result_2,
  };
}
```

## Go っぽく書いた

```javascript
async function foo() {
  const result_1 = await fetch('/foo').catch(e => e);
  if (result_1 instanceof Error) {
    throw { errorType: 1 };
  }

  const result_2 = await fetch('/bar?result_1=' + result_1).catch(e => e);
  if (result_2 instanceof Error) {
    throw { errorType: 2 };
  }

  return {
    messaga: 'fetch complete',
    result_1,
    result_2,
  };
}
```

イケるやん
個人で書くならこの書き方したい。

けど、少しトリッキーだから、
やっぱtry/catchで書くのがいいですかね。
【問題解決】Scala: ` """\d{4}-\d{2}-\d{2}""".r`でMatchError


# 環境
* Scala 2.12.4

# やりたいこと

[scala.util.matching.Regex](https://www.scala-lang.org/api/current/scala/util/matching/Regex.html)で正規表現のマッチを行いたいです。



# 問題

日付を年、月、日に分解するため、以下のソースを実行したところ、`scala.MatchError`が発生しました。

```scala
val date = """\d{4}-\d{2}-\d{2}""".r
val date(year, month, day) = "2018-04-01"
//scala.MatchError: 2018-04-01 (of class java.lang.String)
```

# 原因・解決方法
正規表現のキャプチャが行われていないためです。
正規表現の数字部分に括弧を付けると、期待通り動きます。

```scala
val date = """(\d{4})-(\d{2})-(\d{2})""".r
val date(year, month, day) = "2018-04-01"
//year: String = 2018
//month: String = 04
//day: String = 01
```


# 感想
正規表現の問題で、Scalaは関係ないですね。
少しハマったので、記事として残しました。
【Rails】Railsの3つの環境

# Railsの3つの環境
> Railsにはテスト環境 (test)、開発環境 (development)、そして本番環境 (production) の3つの環境がデフォルトで装備されています。Rails consoleのデフォルトの環境はdevelopmentです。
[デバッグとRails環境（コラム7.1）](https://railstutorial.jp/chapters/sign_up?version=5.1#sec-rails_environments)

- 環境を明示して実行する。（指定なしは"development"）

```console:console
# consoleコマンド
$ rails console production

# serverコマンド
$ rails server --environment production

# migrateコマンド
$ rails db:migrate RAILS_ENV=production
```
新卒のvim日記 day4 shellを使いたい。【備忘録】

# はじめに
今日はVim上でshell動かしたいと思って色々探しました

## ピュアなvim
ピュアなvimでは、vimと画面分割をして、shellを呼び出すことができないようです。※外部のプラグイン利用・neovimを使うと利用できる様子。
フォアグラウンド・バックグラウンドでは、shellを起動することは可能です。

### shell・外部コマンドを呼び出す方法
- フォワグラウンド処理
`:shell` | `:sh` shellを起動する `exit` でvimに戻ることができる

- バックグラウンド処理
`Ctr-z` でバックグラウンドで shellを起動でき、 `fg` でフォワグラウンドの処理に戻ることができる。 


## vimshell
プラグインとしては**vimshell**が存在するらしい。ぜひ使ってみたい。
vimのプラグインを使うのはまだはないのかなーという感触です。おいおい調べて行きます。

## neovim
neovimがあるらしい。vim上でshell等も利用できるらしいし、色々便利みたい。
これからもう少し調べてみたい。

- [neovimのterminal emulatorが便利すぎた](http://tsub.hatenablog.com/entry/2016/07/02/220823)
- [neovimの便利設定 ターミナルモードのマッピング](http://blog-sk.com/vim/neovim-settings/)
- [neovim = VM](https://www.slideshare.net/Shougo/vim-presentation2)

## 追記[2018/04/10]
コメントで@YamasakiKenta　さんから最新のvimは`:terminal`を使えるようになったという話を聞いたので追加調査。
今までMacのデフォルトのvim7.3を使っていたけどvim8.0~ `:terminal`が使えるようになったみたい！！
brewでversion8.0にアップデートすることができます。(同時に依存関係のパッケージもインストールしてくれるみたいで便利！

```
$ brew install vim --with-lua
==> Installing dependencies for vim: perl, openssl, ruby, gdbm, sqlite, python, lua
==> Installing vim dependency: perl
==> Downloading https://homebrew.bintray.com/bottles/perl-5.26.1.sierra.bottle.1.tar.gz
######################################################################## 100.0%
...
==> ./configure --prefix=/usr/local --mandir=/usr/local/Cellar/vim/8.0.1650_1/share/man --
==> make
==> make install prefix=/usr/local/Cellar/vim/8.0.1650_1 STRIP=/usr/bin/true
🍺  /usr/local/Cellar/vim/8.0.1650_1: 1,429 files, 23.0MB, built in 1 minute 17 seconds
```

### Iterm使ってるのに`:terminal`が起動しない問題
[terminalではできるのにitermだとできない！問題](https://qiita.com/kangyoosam/items/9ceaf9c079c5d3b9eaca)

### 参考文献
- [terminal - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/terminal.html)
- [vimをアップデートすると同時にHomebrew管理に移行する](https://qiita.com/yu-ichiro/items/c9db44671701e7f485af)
Solaris 11.3 を使いこなす

# Overview 

Solaris環境を持っているので、生活環境としての構築備忘録を記録する
基本的には以下のドキュメントに沿って構築すれば良さそう。

https://docs.oracle.com/cd/E36784_01/html/E49624/docinfo.html#scrolltoc

```
# pkg install network/openssh
# pkg set-mediator -I openssh ssh
```

# Package Installation

## Switch sunssh to OpenSSH

sunssh はそのうちobsoluteになる、ということからOpenSSHへの切り替えを行う。
手順は以下に従ってSSHをsunssh から OpenSSH に変更する

https://docs.oracle.com/cd/E62101_01/html/E62749/tsk-openssh.html

## Install ruby

どうも標準で入れるのは 1.9系らしい。
2.xの方が良いと思うが、とりあえず1.9系で入れてから考えることにする

https://docs.oracle.com/cd/E36784_01/html/E49624/gnwrc.html#scrolltoc

```
# pkg install runtime/ruby-19
```

## Install git

https://docs.oracle.com/cd/E53394_01/html/E54831/gnwqa.html#scrolltoc

```
# pkg install developer/versioning/git
```


## Install apache 2.4

これですんなり入るらしい
https://docs.oracle.com/cd/E53394_01/html/E54831/gnvhs.html

```
# pkg install web/server/apache-24
```

### Install php

```
# pkg install web/php-56
```


# Set up applications
DialogflowのFulfillmentで会話を継続 or 終了させるメソッドの使い方

Google Homeのアプリ開発を行っていたとき、DialogflowのFulfillmentを使った会話の継続/終了方法がよくわからず調べたことがあったので、今後も忘れないようメモしておきます。

**2018/04/19追記**
Dialogflowのバージョンアップ（V1 -> V2）に伴い、仕様が変わったみたいです。以下記事で詳しくまとめらていますのでご覧ください。

[Dialogflow v2の会話を継続 or 終了させるメソッドの使い方 - Qiita](https://qiita.com/h-takauma/items/1c26d0e43b3a6ce849b9#_reference-880877af778e6c923c7d)

# `app.ask()` or `app.tell()`
**会話を継続させる -> `app.ask()`
会話を終了させる -> `app.tell()`**

```javascript:会話を継続させる
const app = new DialogflowApp({request: request, response: response});
const FRUITS_INTENT = 'input.fruits';

// ユーザへの質問（会話継続）
function fruitsIntent (app) {
  app.ask('好きな果物を教えてください。');
}

const actionMap = new Map();
actionMap.set(FRUITS_INTENT, fruitsIntent);
app.handleRequest(actionMap);
```

```javascript:会話を終了させる
const app = new DialogflowApp({request: request, response: response});
const FRUITS_INTENT = 'input.fruits';

// ユーザへの返答（会話終了）
function fruitsIntent (app) {
  app.tell('バナナは栄養価の高い果物です。');
}

const actionMap = new Map();
actionMap.set(FRUITS_INTENT, fruitsIntent);
app.handleRequest(actionMap);
```

# まとめ
開発中、会話を継続したいのに、`app.tell()`を使っていたがために会話が終了してしまうことがありました。結局、Dialogflowのリファレンスを読んで理解しました。リファレンス大事！

# 参考リンク
- [Class: DialogflowApp  |  Actions on Google  |  Google Developers](https://developers.google.com/actions/reference/nodejs/DialogflowApp)
- [javascript - DialogFlow, keep assistant open after completing action - Stack Overflow](https://stackoverflow.com/questions/48502204/dialogflow-keep-assistant-open-after-completing-action)
GItHub DesktopをWindowsにインストール(2018年)

GitHub DesktopをWindows環境にインストールしたのでその手順です。今までは、単純にGitHubからリポジトリをzipでダウンロードして使っていたのですが、特定のbranchが欲しい、差分管理をしたいなどとGit clientが欲しく、GitHub Desktopを使い始めました。Sourcetreeにしようかとも思ったのですが、Sourcetreeアカウント登録に抵抗感を感じてGitHub Desktopを選択しました。この分野に詳しくないので、その選択が正しいかは自身がないです。

#環境
|種類|バージョン|内容|
|:--|:--|:--|
|OS|Windows8 64bit |自宅環境なのでProfessionalでもないです|
|GitHub Desktop|1.1.1|2018年3月末にリリースされた版|

#手順
##1. セットアップファイルダウンロード
[公式ダウンロードサイト](https://desktop.github.com/)から「Download for Windows」をクリックしてダウンロードします。
![10.DownloadGitHubDesktop01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/e6e721b3-5f4a-a4ad-ff61-7f197b8d3e2f.jpeg)

##2. GitHub Desktopインストール
インストールファイルを起動。GitHubのアカウント持っているのでサインインします。
![20.InstallGitHubClient01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/dcaa97a7-3469-2a74-d33f-e5a22c004792.jpeg)

認証情報を入力。
![20.InstallGitHubClient02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/e8725ac1-507c-d3de-d9ed-8a287c420270.jpeg)

入力されていた値のまま続行。
![20.InstallGitHubClient03.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/d6085b4d-3c69-5c69-e1cb-a8252d610093.jpeg)

終了です。インストールは非常に簡単です。
![20.InstallGitHubClient04.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/0d50eba6-713e-8df1-ebc8-d03e889dd820.jpeg)

#3. Cloneで確認
GithubからリポジトリをクローンしてGitHub Desktopの動作確認をします。

例としてTensorFlowのModelをダウンロードします。ブラウザで[TensorFlowのModelのGitHub](https://github.com/tensorflow/models)ページに行き、URLをクリップボードにコピーします(少し重いリポジトリなので、テスト用にはもっと軽いやつをお勧めします)。
![30.CloneRepository01.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/d8e02eb1-53b9-79cb-3df0-99141b1139ca.jpeg)

GitHub DesktopのメニューからFile -> Clone repository を選択して「URL」タブで
コピーしたURLを張り付けて「Clone」を押します。あとはエラーがなければOKです。
![30.CloneRepository02.JPG](https://qiita-image-store.s3.amazonaws.com/0/134273/e61dbf97-724b-800e-1bb2-8c90bb7330b1.jpeg)
「Got permission denied while trying to connect to the Docker daemon socket」への対応

# 環境

### OS

```
$ cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
```

### docker
[公式](https://docs.docker.com/install/linux/docker-ce/centos/#prerequisites)の通りdocker-ceをインストール

# 概要

yumにてdockerをインストール後、dockerコマンドを実行するとタイトルにあるよう下記のエラーが発生した。

```
$ docker run hello-world
Using default tag: latest
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/images/create?fromImage=python&tag=latest: dial unix /var/run/docker.sock: connect: permission denied
```

どうやらdockerコマンドはデフォルトではroot権限で無いと動かないらしい。（一般ユーザでは動かせない）
たしかにsockファイルに権限が無かった。

```
$ ll /var/run/docker.sock
srw-rw---- 1 root docker 0 Apr 10 02:18 /var/run/docker.sock
```

# 行った対応

[公式](https://docs.docker.com/install/linux/docker-ce/centos/#install-using-the-convenience-script)の言うとおり、一般ユーザを「docker」グループに追加する。

```
$ grep -i docker /etc/group
docker:x:990:

$ sudo gpasswd -a username docker
Adding user username to group docker

$ grep -i docker /etc/group
docker:x:990:username
```
グループに入ったことを確認した後、一旦ログアウトを行い、再度ログインする。

そして、もう一度 docker run を実施してみる

```
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
Digest: sha256:97ce6fa4b6cdc0790cda65fe7290b74cfebd9fa0c9b8c38e979330d547d22ce1
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/
```

無事実行できた。
Gitの紹介

Gitの簡単な紹介です。(一部GitHub)

# Gitとは
Git(ギット)はバージョン管理システムです。
人気度でいえば、2008年頃にはSubversionを抜いてバージョン管理システムでは絶対的な人気となっています。

![トレンド.png](https://qiita-image-store.s3.amazonaws.com/0/79214/072f05c9-7408-ca59-3ef8-8c839f76c9b3.png)

Line、Google、メルカリなどなどがGit(GitHub)を採用しています。

# Gitの特徴
## 分散型

リモートリポジトリとローカルリポジトリの2つのリポジトリを持ちます。

- リモートリポジトリ：全員で共有するリポジトリ
- ローカルリポジトリ：自分のみが使用するリポジトリ

Gitに慣れるまで、ローカルリポジトリが何のためにあるのか、ただややこしくしているだけと思っていました。。。が、アジャイル開発のような周期が速い開発、かつ、顧客要望/不具合の緊急リリースが多い開発だとかなり強力でした！

中途半端なものをローカルリポジトリに退避させておき、別の対応を行うというのが、何のストレスもなくスピード感をもってできます。
Subversionの時はわざわざ、PCにファイルをコピーして、差分を消して対応し、PCのコピーを戻すような事をしていました。(他にストレスなく良い方法があったのでしょうか？？)

## 高速
ブランチの作成や切り替えが速く、ストレスなく操作できます。

## マージが賢い
他のVCSと比べてマージアルゴリズムが優れているらしい
※でも最新のsubversionとはそんなに大差がないらしい。。。

よく使うコマンドは[こちら](https://qiita.com/naka46/items/8b1c3b9825f64b69db37)を参考に


# なんせGitHub
Gitをここまで人気者にさせたのは、間違いなく**GitHub**です！
**Git + さまざまなWebツール**を提供するサービスです。

下記のような猫マークのサイトがまさにGitHubです。
[bootstrap](https://github.com/twbs/bootstrap)

GitHubもGitLabも、開発スタイルとして**DevOps**を目指している。

#### DevOpsとは ビジネスやプロジェクトを成功するために、組織文化とツールの両面を改善する事でビジネスアジリティを向上させ、リスクを低減する活動

チームとして作業効率アップとコミュニケーションを活性化させ、お客様に迅速に価値を提供する為のツール一式という感じです。

特にいいツールが

## Pull Request
簡単にいうと、
修正したので、ソースレビューして、OKならブランチに取り込んで下さい　です。

レビュアーはブラウザ上で簡単に差分を確認できます。

差分だけの確認ではいけないものもありますが、全ての修正に対して第三者が目を通せるので、プログラマーの緊張感もUPとなるはずです！
※プロジェクトが忙しくなるとどうしてもレビュアーに負担がかかり、ソースレビューがされなくなり、品質が悪いプログラムが増殖してしまう。という状況は起こりにくいです

![マージリクエスト.png](https://qiita-image-store.s3.amazonaws.com/0/79214/f4c79f3c-91b5-3a5b-1a3f-33c2a47dc168.png)

- ブラウザで差分が確認できる
- 修正もできる
- どのissueかもぱっと辿れる
- 気になるコードもすぐ連携して確認してもらえる
- 後々どういう経緯でそうなったのか忘れた時もコードとissueを照らし合わせたら何か思い出す時もある

## Issues
課題管理ツール。
ソースコードやPull Request、変更履歴といったものを、簡単に課題と紐付けて管理していくことが可能です。

IssueBoardを使って、看板方式のタスク管理が簡単にできます。

![IssueBoard.png](https://qiita-image-store.s3.amazonaws.com/0/79214/bf9af55f-1fb9-4921-f308-cb5f42d9f66d.png)

## wiki
wiki。
ちょっとした共有内容はここにまとめていくと楽ちんです。

## Slackなどのコミュニケーションツールと連携
Pull Requestやpushなど連携できます。

# 会社ならGitLab
でも、チームで使うならお金がかかるので、会社で使うならGitLabですね。
GitLab:「GitHub」のようなサービスを社内などのクローズド環境に独自で構築できるGitリポジトリマネージャー。**GitHub ≒ GitLab**です。

# 私見
昔はsubversionを使っており、Gitを使うようになりました。
コマンドで操作していたこともありましたが、ローカルリポジトリの考えに慣れず、慣れるまではメリットが感じられなかったです。
また、会社としてGitLabを使うとなったのですが、自分のプロジェクトは断り続けてきました。プロジェクトがかなり忙しく、他の事を覚える余裕がなかったのですね。。。

初めてGitLabを使った時、スピード感に驚愕しました。
そのプロジェクトはIssueごとにブランチを切っていたのですが、その切り替えのストレスのなさ、マージリクエストによるレビューの速さ、課題もひとつのGitLabで管理できる一元管理のよさ。
アジャイルで開発しており、リリース直前での組み替えが多いプロジェクトでしたが、GitLabでないとあのスピード感を持って開発するのは無理だと感じました。

ウォーターフォール開発のような、決まったものを決まった期日までに開発する、というようなプロジェクトだとGit,GitLabの恩恵はあまり受けれないと思います。
DevOpsのような「ビジネスの価値をより確実かつ迅速にエンドユーザーに届け続ける」事が命題のプロジェクトであれば、Gitでないとスピード感を持った開発は無理かと思います。
現在はLineやメルカリなどのBtoCがDevOpsですが、今後は社内システムや中小企業にも**価値を迅速に届ける**システム開発が増えていき、今以上にGitの人気度が上昇するのかなぁと思っております。
見れない問題 


　このブログへ投稿をするのは、難しいですね。

長いのが添付が見れない問題

このMarkdown方式というや、スライドモードが、長くはできない。

添付pagesで作ったものが　投稿できたのに、見れなかった、がっかり。

　＊＊＊＊ビデオ作成したのが　　載せれない！！

　誰か教えてください。
ReverseProxy with Authentication in Windows

At first, Windows/Apache does very well.
But detail customize is really difficult rather than Linux/Apache.

ReverseProxy with Basic Authentication is needed in DMZ 
and that ends to TableauServer in Intranet.

What proxy is good? 
  > IIS...MS Good. 
  > Apache...everyone uses Good.
  > Nginx...I'don know 

So did PoC below two tools.

IIS...sends Basic Authentication at ReverseProxy to backend server, and backend confused.
      And Basic Authentication dialog appears threeeee times!!!
      SO BAD!!!.And there is no good workaround. 
https://forums.iis.net/t/1233523.aspx?Remove+or+rename+authorization+header+to+backend

Apache...RequestHeader unset Authorization(IIS doesn't have this) does well!! 

So I decided to use Apache

But I got critical error in using mod_dbd.
mod_dbd needs drivers such as pgsql,mysql,sqlite3 and so on.

But all of them in my Windows Environment make error(Can't load file mod_aaa.so)
(Maybe I have not enough knowledge about using network tools.
 And I tried to compile from source code, but did nothing... )

So lastly,I use DBDriver "ODBC" and create ODBC Connection to various RDBMS.
This works fine!!!
【jQuery】addClass()しつつfadeIn()やSlideDown()する

#概要

jQueryで以下のようなリスト要素のどれか一つを表示するイベントについて、addClass()とfadeIn()などを共存させるのに、少し詰まって解決したのでシェア。

```html:index.html
<ul>
  <li class="isActive" id="hoge">hoge</li>
  <li id="fuga">fuga</li>
  <li id="poyo">poyo</li>
</ul>
<div>
  <div class='btn' id='hoge'>hogeBtn</div>
  <div class='btn' id='fuga'>fugaBtn</div>
  <div class='btn' id='poyo'>poyoBtn</div>
</div>
```
```css:style.css
li {
 display: none;
}
li.isActive {
  display: block;
}
```
```js:script.js
$('.btn').click({
  //リストと対応したボタンを押すとそのidから表示対象を受け取る処理
  //(中略)
  $('li').removeClass('isActive');
  target.addClass('isActive');//←ここでfadeInしたい
})
```

#失敗例

```js:script.js
$('.btn').click({
  //(中略)
  $('li').removeClass('isActive');
  target.fadeIn(400,function(){
    $(this).addClass('isActive');
  });
})
```

fadeIn()しながらaddClass()してくれればいいんじゃね？:thinking:
という安易な考えでcallbackに指定してみたが、失敗。

fadeIn()自体は成功するがボタンを押す度に要素が増え、結果として全部の要素が表示されてしまう。removeClass()が非表示の役割を果たせていない。

#ポイント解説
- **fadeIn()やslideDown()は、show()の進化版。**
- **showはcss('display':'block')と同じ。**

　　　　　　　　　　　　　　　by Progateのスライド

つまり、この状況でfadeIn()とaddClass()を併用すると、どちらも対象にdisplay:blockを付与していて、removeClass()で外せるのはaddClass()でつけた方のみなので、対象は消えないまま残ってしまうのでした。:hugging:
ガッテンガッテン。

#成功例
よって、消えないままにしているshow()を解除してあげれば良いので、

```js:script.js
$('.btn').click({
  //(中略)
  $('li').hide();//追記
  $('li').removeClass('isActive');
  target.fadeIn(400,function(){
    $(this).addClass('isActive');
  });
})
```

これで無事、addClass()しつつfadeIn()ができます。
slideDown()も同様に可能です。


>※追記
わざわざcallbackしなくても、メソッドチェーンでも可能でした！！（完全に忘れてた）
↓

```js:script.js
$('.btn').click({
  //(中略)
  $('li').hide().removeClass('isActive');
  target.fadeIn(400).addClass('isActive');
})
```
git stash(一時退避)のコマンド整理

■スタッシュ

| コマンド            | 説明              |
|:-----------------|:------------------|
| git stash        | 一時退避 |
| git stash save “message” | メッセージを付けて一時退避 |
※“message”は任意のキーワード。個人的にはブランチ名推奨。

■スタッシュ確認(list/show)

| コマンド            | 説明              |
|:-----------------|:------------------|
| git stash list       | リスト表示 |
| git stash show stash@{N} | N番目にスタッシュしたファイルの一覧表示 |
| git stash show -p stash@{N} | N番目にスタッシュしたファイルの変更差分を表示 |
※{N}はgit stash list に書いてある内容の番号

■スタッシュ削除(drop/clear)

| コマンド            | 説明              |
|:-----------------|:------------------|
| git stash drop       | 最新のスタッシュを削除 |
| git stash drop stash@{N} | N番目のスタッシュを削除 |
| git stash clear | 全削除 |

■スタッシュを適用(pop/apply)

| コマンド            | 説明              |
|:-----------------|:------------------|
| git stash pop       | 最新のスタッシュを適用し、削除 |
| git stash pop stash@{N} | N番目のスタッシュを適用し、削除 |
| git stash apply | 最新のスタッシュを適用し、残す |
| git stash apply stash@{N} | N番目のスタッシュを適用し、残す |
Ansibleでsquidのbasic認証ユーザ・パスワードを変更した時の手順

####Ansibleでsquidのbasic認証ユーザ名・パスワードを変更をした時の手順をまとめてみました。

0.環境

```
Ansible：2.4.2.0
OS：CentOS7
```

1.ディレクトリ構成

```
ansible/
├─hosts
├─roles/
│　└─squid/
│　  ├─handlers
│　  │  └─main.yml
│　  └─tasks
│       └─main.yml 
└─site.yml
```

2.hostsファイル作成


[ファイルの書き方]
変更対象のIPアドレス（またはホスト名） basic_auth_user="設定したいユーザー名" basic_auth_passwd="設定したいパスワード"

<例>

```
/etc/ansible/hosts

192.168.56.51 basic_auth_user=user  basic_auth_passwd=user
192.168.56.53 basic_auth_user=proxy basic_auth_passwd=proxy
```

3.playbook編集

- site.ymlの編集

`cd/etc/ansible`

```
vi site.yml

---
- hosts: all
  roles: 
    - squid
```

- tasks/main.ymlの編集

`mkdir -p roles/squid/tasks`

```
vi roles/squid/tasks/main.yml

---
- name: "python-passlib installed"
  pip:
    name: passlib


- name: "delete user"
  htpasswd:
    path: /etc/squid/.htpasswd
    name: ##現在のユーザ名を記入
    state: absent


- name: "add user"
  htpasswd:
    path: /etc/squid/.htpasswd
    name: "{{ basic_auth_user }}"
    password: "{{ basic_auth_passwd }}"
    owner: root
    group: squid
    mode: 0640
  notify: restart squid
```

- handlers/main.ymlの編集


```
vi roles/squid/handlers/main.yml
---
- name: restart squid
  systemd: name=squid state=restarted
  become: true
```

4.動かす

 - 対象を確認する
 
`ansible-playbook site.yml --list-hosts`

 - 検証する
  
 `ansible-playbook site.yml -C`

 - 実際に動かす

`ansible-playbook site.yml`
boto3を使ってS3にファイルのアップ＆ダウンロード

botoは、PythonのAWS用ライブラリです。
今回は、Azure VMの環境でboto3を使ってS3のファイル操作をしてみました。

###下準備
boto3のインストール

```
$sudo pip install boto3
```
VM環境にAWS CLI(Command Line Interface)をインストール

```
sudo pip install awscli
```
configureの設定

```
$ aws configure
AWS Access Key ID : IAMユーザのアクセスID
AWS Secret Access Key [None]: IAMユーザのシークレットアクセスキー
Default region name [None]: ap-northeast-1　#東京リージョン
Default output format [None]: json
```
ちなみに、確認方法はこちら

```
$ cat ~/.aws/credentials
[yuni]
aws_access_key_id = XXXXX
aws_secret_access_key = XXXXX
[default]
aws_access_key_id = XXXXX
aws_secret_access_key = XXXXX
```

###ファイルのダウンロード
それではダウンロードです。

```boto_test.py
# -*- coding: utf-8 -*-
import boto3

s3 = boto3.resource('s3') #S3オブジェクトを取得

bucket = s3.Bucket('バケット名')
bucket.download_file('S3のバケット以下のpath', '保存先のpath')
```

動かしてみます。
それっ

```
$ python3 boto_test.py
Traceback (most recent call last):
  File "boto_test.py", line 2, in <module>
    import boto3
ModuleNotFoundError: No module named 'boto3'
```
オロロ。。。
あれこれやって、これで解決。

```
$ pip install --upgrade --user boto3
```
再度実行して、無事ダウンロードすることができました。

###ファイルのアップロード
アップロードも同様にできました。

```boto_test.py
# -*- coding: utf-8 -*-
import boto3

s3 = boto3.resource('s3') #S3オブジェクトを取得

bucket = s3.Bucket('バケット名')
bucket.upload_file('UPするファイルのpath', '保存先S3のpath')
```

はい。
これだけだと、AWS CLIでいいっておはなし。