OmniAICreator/Qiita-1.07M huggingface dataset:
Nodeのエラーハンドリング（unhandledRejectionとuncaughtException）について

# はじめに
基本的には[Node.js v10.5.0 Documentation](https://nodejs.org/api/process.html)の該当箇所を意訳して個人的な備忘録として残そうとしているだけです。

# uncaughtException
https://nodejs.org/api/process.html#process_event_uncaughtexception

```js
process.on('uncaughtException', (err) => {
  fs.writeSync(1, `Caught exception: ${err}\n`);
});
```

* どこにもキャッチされずにprocessまで来てしまったエラーをキャッチ。
* NodeJSのデフォルト（上記のようにハンドリングしない場合）では、このようなエラーはスタックトレースに出力して終了。
* リスナーの関数は`err`だけ。


## 注意点
* ***このハンドリングでエラーがcatchされた場合、処理を継続すべきではない。***
    * 完全に想定外の状態になっていることを意味しているので、ここから無理やり復帰しようとして更なるエラーが起きる可能性がある。
    * 例えるなら「コンピュータのアップグレード時にコンセントを抜くようなもの」。その意は「10回中9回は問題ないかもしれないが、1回はシステム破壊が起きる」。
* ハンドリング内の処理でさらにエラーが発生した場合は、0以外の終了コードで終了する。
    * 無限ループを避けるため。
* 正しい使い方は「***プロセス終了前にクリーンアップを実行する***」という目的で使うこと。

# unhandledRejection
https://nodejs.org/api/process.html#process_event_unhandledrejection

* `reason: <Error> | <any>` 基本的にはObject
* `p: Promise<any>` rejectされたPromise

```js
process.on('unhandledRejection', (reason, p) => {
  console.log('Unhandled Rejection at:', p, 'reason:', reason);
  // application specific logging, throwing an error, or other logic here
});
```

* `unhandledRejection`はPromiseがrejectされた時にいつでも発行される。
* 普通は`promise.catch()`とかasync/awaitだとtry-catchでキャッチされるが、どこにもキャッチされなかった場合に呼ばれる。
* どのpromiseでrejectされたのかを追跡する（try-catchを入れ忘れている箇所の特定）のに役立つ。

# まとめ
* `uncaughtException`は、もし使う場合にはそこから処理を継続するのはやめましょう。
* ***「try-catch入れ忘れちゃうよね!!」***という私みたいな人は`unhandledRejection`を設定しておきましょう。

# 【備忘録】ブラウザで使う場合
promiseの例外キャッチ用に`unhandledRejection`を加えて、それ以外の例外キャッチ用に以下を加えておく。

```js
window.addEventListener( "error", ( e ) => {
	// todo エラー処理
} );
```
pryでもrubyのnextを使いたい！そんなときの対処法

環境
---
```
pry (0.10.4)
pry-nav (0.2.4)
pry-rails (0.3.6)
 ```

rails consoleでnextが使えない
---

```rb
[1] pry(main)> 1.upto(3) do |num|
[1] pry(main)*   next if num > 1
Error: Cannot find local context. Did you use `binding.pry`?
```

`next`はpry-navでの予約語で使えません :cry: 


`Pry::Commands.delete`を使って解決 :hugging: 
---
```rb
[2] pry(main)> Pry::Commands.delete 'next'
=> ["next"]
[3] pry(main)> 1.upto(3) do |num|
[3] pry(main)*   next if num > 1
[3] pry(main)*   puts num
[3] pry(main)* end
1
=> 1
```

consoleをexitすると初期化されるので、常にoffっておきたい場合は`.pryrc`に書いておくと良いそうです :bulb: 

現場からは以上です。

参考
---
- [ruby - Pry Error: Cannot find local context. Did you use `binding.pry`? - Stack Overflow](https://stackoverflow.com/questions/29305454/pry-error-cannot-find-local-context-did-you-use-binding-pry)
- [nixme/pry-nav: Binding navigation commands for Pry to make a simple debugger](https://github.com/nixme/pry-nav)
Windowsのcmdのprompt文字を変える

PowerShellになじめない者です。

コマンドプロンプト(cmd)でプロンプトを変えたい場合、`prompt` コマンドで置き換えます。

例:タイムスタンプとカレントディレクトリを出しつつ、改行も入れる

```
prompt $C$D $T$F $P$_$G 
```

こんな感じになります。

```
(2018/06/28 19:47:12.53) C:\Users\fukasawah
> 
```

また、環境変数 `PROMPT` にセットすれば、cmd起動時のpromptを指定できます。


bash等ほどカスタマイズできないのが残念です。(コマンドを実行したりしたかった。)
guard letとif letの使い分け

# guard let
これ以上処理を進めたくない場合に使用します。
`nil`が入っていたらエラーとして扱うケースだった場合などによく使います。

```swift
let hoge: String? = nil //`hoge`の中身は`nil`

guard let fuga = hoge else { return } //`hoge`は`nil`なのでreturnされる
//`hoge`が`nil`ではなかった時の後続処理…
```

# if let
`nil`だった場合に行う処理が異なる時に使用します。
`nil`の場合はAの処理、`nil`でない場合はBの処理をしたいなどのケースでよく使います。

```swift
let hoge: String? = nil //`hoge`の中身は`nil`
if let fuga = hoge { 
    //`hoge`が`nil`ではない場合にこっち
    //後続処理へ…
} else {
    //`hoge`が`nil`の場合にこっち
    //後続処理へ…
}
```
RubyMineにElixir Pluginを導入してみた

この記事は「[fukuoka.ex x ザキ研 Advent Calendar 2017](https://adventar.org/calendars/2873)」17日目です。

昨日は @Takeshi-Kogu さんの[「モジュールをファイルに書き込んでみる(前半)」](https://qiita.com/Takeshi-Kogu/items/6a49c71918a7cfd614d4)でした。

## はじめに
前回，[「Elixirで一千万行のJSONデータで遊んでみた #2」](https://qiita.com/zumin/items/94bee4392e3541371887#_reference-a15595d2bb53affde91f) という記事を書きました。


これまでElixirを書くときには，Vimを使っていました。
普段はRubyをよく書いていて，RubyMineを利用しています。
そこで，Railsを使ったりPhoenixを使ったりするなら，統一した方が楽じゃん！となったので，Elixir PluginをRubyMineに導入してみました。

## 動作環境
- macOS High Sierra 10.13.5
- MacBook Pro Retina 13-inch Mid 2014
- exenv 0.1.0
- Elixir 1.6.4 (compiled with OTP 20)
- RubyMine 2018.1.3


## 導入方法
1. `Preferences -> Plugins` と開き， `Brows Repositories` を選択します。
2. `Elixir` と検索してインストールをして，RubyMineを再起動します。
3. SDKを設定します。
  - `Preferences -> Language & Frameworks` を選択します。
  - `Elixir` のドロップダウンから `SDKs` を選択して， `+` を押して，ElixirのPATHを選択します。

自分の環境では，`exenv` を利用しているので， 
`/Users/<UserName>/.exenv/versions/1.6.4` を選択しました。

これで，こんな感じにSDKの設定が終わります。
<img width="814" alt="スクリーンショット 2018-07-04 19.19.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/133717/7ea3f57f-d365-1be0-24e2-a01eeffa175c.png">

結構，簡単でしたね！


※Elixir SDKsの設定をすると `Internal Erlang SDKs` も勝手に設定されました。
※2018年7月4日現在で，Pluginは `v7.5.0` でした。　


### `elixir facet sdk is not defined`
はい，これに，1時間くらいハマりました・・・。
プロジェクトを開いた時に，上に黄色い文字でWorningとして表示がでるんですが，
SDKの設定ちゃんとしたやん・・・？


ドロップダウンにとらわれるあまり，見落としていました・・・。
SDKの設定はしましたが，利用するSDKを選択していなかったんですね。
<img width="814" alt="スクリーンショット 2018-07-04 19.25.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/133717/015b7c64-2744-15dc-901b-5669a5f58fa1.png">



ちゃんと選択すると，こんな感じになります。
これで，Warningも消えました。
<img width="814" alt="スクリーンショット 2018-07-04 19.25.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/133717/fe2f3c28-86ad-46ab-1d0b-bf9cdec98761.png">




### Color Scheme
普段使っている， `Darcula Scheme` だとこんな感じになります。
<img width="1238" alt="スクリーンショット 2018-07-04 18.55.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/133717/d2d2d48c-10ca-644e-776a-9ba74e61bbf2.png">

## さいごに
今回は，RubyMineでElixirによる開発を行うためのPlugin導入に関して書いていきました。
しょうもないことにハマるのはツライですね。。！
SDKの設定も終えたので， `Run/Debug` 機能などこれから使っていきたいと思います。


Pluginの導入に関して， [intellij-elixir](https://github.com/KronicDeth/intellij-elixir) のREADMEを参考にさせていただきました。
それではよいElixir Lifeを！

---

明日は @zacky1972 さんによる「ZEAM開発ログ v.0.3.0 Elixir から GPU を駆動するベンチマークをいろいろアップグレードしてみた」です。お楽しみに！
.bash_profileにとりあえず書いておくこと

#.bash_profileにとりあえず書いておくこと

##mac

下記の記述を.bash_profileにしておけば、`-bash command not found`地獄からは多少逃れられる気がする。

```bash:.bash_profile
export PATH="$PATH:/usr/sbin"
```

.bash_profileはホームディレクトリ（ユーザー名のディレクトリ）に存在している。


また、名前が「.」で始まるファイルは通常見えなくなっており、「command + shift + . 」で可視化される。

この状態でも「.bash_profile」が存在しない場合はターミナルで

```
$ cd ~
$ vi .bash_profile
```
とすると新しく作成できる。
オブジェクト指向において、「依存方向の管理」についてのメモ

##依存方向の管理

依存関係には常に方向がある。
つまり、AはBに依存しているようなアプリが、BがAに依存するように変更がある可能性もあるということ。

ここで、クラスを人と見立ててアドバイスするなら、__「自身より変更されないものに依存しなさい」__とアドバイスすること。

この一文を詳細に説明すると、
・__あるクラスは、他のクラスよりも要件が変わりやすい__
・__具象クラスは、抽象(abstract)クラスよりも変わる可能性が高い__
・__多くのところから依存されたクラスを変更すると、広範囲に影響が及ぶ__

ここでの抽象(abstract)とは、「いかなる特定の実例(インスタンス)からも離れている」ということ。
(クラス内で別のクラスを呼んだりしていることは、特定の実例に近すぎる一例。)

###変化のおきやすさを理解する
プログラミング言語の基本的なクラスは変わりにくい。だが、フレームワークを考えるとどうか。
一般的なフレームワークを使用するにおいては、自前のコードよりも安定していることが多い。
だが、発展途上のフレームワークを使っていて、それの更新が頻繁に起こる可能性は当然ありえる。
つまり、アプリ内のクラスは、変化のおきやすさによって順位付ができる。この順位付こそが、依存の方向を決める際の一つの鍵。

###具象と抽象を認識する
抽象とは、「いかなる特定の実例（インスタンス）からも離れている」ということ。
つまり、クラス内で別のクラスのインスタンスを呼ぶ行為はとても具象的だが、メソッドを細かく切り分け、結合の切り離し(依存オブジェクトの注入(dependency injection)という。)を行ったあとは抽象的なものに依存するようになる。

###具象クラスは、抽象クラスよりも変わる可能性が高い
抽象インターフェースを定義する、ということを動的型付け言語で考えてみると、

クラスAをクラスBに注入することで、クラスAが(クラスBのメソッドである)メソッドBに応答するダックタイプ(型宣言しなくても、勝手にメソッドBがクラスBのものだと判断)に依存するように変える時、実は、さりげなくインターフェースを定義している。
このインターフェースは、__「あるカテゴリーのものはメソッドBを持つ」__という概念が抽象化されたもの。

抽象(あるカテゴリーがメソッドBをもつこと)が、具象クラス（クラスB）から取り出されているわけだが、これはもはや「いかなる特定の実例(インスタンス)からも離れている」もの。

抽象化されたものが素晴らしいのは、__「抽出元となった具象クラスよりも変わりにくい」__こと。
抽象化された者への依存は、具象的な者への依存よりも常に安全。

###大量に依存されたクラスを避ける
・多くのところから依存されたクラスを変更することによる影響は明白
・明白ではないのは、「多くのところから依存されたクラス」を「持つこと」自体の影響。

そのような影響力の大きいクラスを持った時点で、アプリは一生ハンディキャップを抱える可能性もある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/208038/bf3ef461-c216-e480-5556-3a4c60b78d59.png)


A - 抽象クラスやインターフェース
抽象化されたものは変更が起きにくいので、依存はそこに集まる
注意すべきことは、領域Aにあるからって、クラスが抽象になるわけではない。クラスが「すでに」抽象であるからこそ、領域Aに収まる。それらが備える抽象の性質によって、クラスはより安定したものになり、多数の依存を安全に引き受けることができる。（そのクラスが抽象クラスであるべきだということを示しているのは確か。）

B - 設計時に最も考慮する必要のないもの。

C - コードは変わりやすく、依存はわずかしかない。傾向として具象的なクラスが集まる。この場合変わりやすさは問題ではない。

D - 危険領域。変更が約束され、依存もたくさんあるものがここに入ってしまう。具象クラスが多量の依存関係を持っていたら注意するべき。
このクラスが表しているのは、アプリケーションの将来的な健康状態への危険。さらにもっと危険な状態もあり、「領域Dのクラスを、そこに依存しているクラスよりさらに変更されやすくする」ことで、全ての変更が最大化されてしまう。


こういったことをなくすためにも
・具象ではなく、抽象なオブジェクトに依存させる
・具象なもの同士が絡み合っている場合は、積極的に依存オブジェクトの注入を行う。
・依存関係の方向を制御すること。（自分より変更されないもの、つまり抽象オブジェクトに依存すべき。）
';--have i been pwned? のAPIを使って流出したパスワードかチェックする


# 概要

https://support.sku.id/hc/ja/articles/115004031154-世界の電子認証基準が変わる-NIST-SP800-63-3を読み解く
このドキュメントを読んで、自前で頻出パスワード管理するの辛いなーって思ったらいいサービスがありました

https://haveibeenpwned.com

APIが用意されてて、パスワードをsha1でハッシュ化して先頭5文字をAPIに渡すと該当するデータをザクッと返してくれるので、5文字目以降が一致するやつを探すっていう使い方らしいです。

# サンプルコード
MacbookProに入ってるRubyでは多分動いてた。

```ruby:passwordchk.rb
require 'net/http'
require 'digest/sha1'
require 'json'

arg = ARGV[0]

sha1 = Digest::SHA1.hexdigest(arg)

sha1Head = sha1[0, 5]
sha1.upcase!
sha1Tail = sha1[5..-1]

url = 'https://api.pwnedpasswords.com/range/' + sha1Head

uri = URI.parse(url)

res = Net::HTTP.get(uri)

sha1List = res.split("\n")

found = sha1List.select { |hash| hash.index(sha1Tail) }

if found.count > 0 then
    puts found
else
    puts "not found"
end
```

# 使い方

```shell
❯ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]

❯ ruby passwordchk.rb abcde
```

実行するとsha1ハッシュの末尾と、使用回数が返ってきます。使われてなければnot foundって言われます。

パスワードチェックしていこう。
esa にカレンダーの表をはりつける

esa は タブ区切りだと、Markdown の表形式で貼り付けてくれるので、便利ですね。
今回は、今月カレンダーを表示したいと思います。

```rb:cal.rb
require 'active_support'
require 'active_support/core_ext'

today = Date.today

print "日\t月\t火\t水\t木\t金\t土\n"
today.beginning_of_month.wday.times{ print "\t" }
(today.beginning_of_month..today.end_of_month).each do |day|
  print "#{day.day}"
  print "\t" unless day.saturday?
  print "\n" if day.saturday?
end
(5 - today.end_of_month.wday).times{ print "\t" }
```

## コピ

```bash
$ ruby cal.rb |pbcopy
```

## ペ

esa で 貼り付け

![image.png](https://qiita-image-store.s3.amazonaws.com/0/4598/d4cc7016-949b-3df1-0a0c-f08d4ece3f37.png)

プレビュー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/4598/01d7ed9e-a259-2684-ce71-c116257e9446.png)

おー :clap: 

## REF

Excel等から簡単に表を貼り付けられるようになりました : https://docs.esa.io/posts/205
herokuにRailsをデプロイするときにWarning: the running version of Bundler (1.15.2) is older than the version that created the lockfile (ver.si.on).が出る

Railsをサクッとお手軽にデプロイできる神PaaSであるherokuですが、お手軽に利用したい初心者を陥れる罠がその辺に落ちてたりもします。例えば私なんかが引っかかります。
ということで、この記事では掲題の

##herokuにRailsをデプロイするときにWarning: the running version of Bundler (1.15.2) is older than the version that created the lockfile (ver.si.on).みたいなのが出る

に対処していきたいと思います。私が詰まったパターンはググっても出なかったので、残しておきます。

まず、私のパターン場合の解決方法は、

#Gemfile.lockを最新にする
でした。以下詳細です。

##なぜか

heroku様が吐き出すログは``` We suggest you upgrade to the latest version of Bundler by running gem install bundler. ```と仰ります。掲題のメッセージと合わせて、「使ってるbundlerがGemfile.lockで指定されているのより古いから新しいのにして欲しいな」ですね。
Gemfile.lockはbundle installの際に勝手に作られるもので、その時に使用したbundlerのバージョンとか、取得したGemのバージョンや、あるGemが依存するGemはこれだよとかってのが記録されます。例えば、Railsでユーザ認証といえばこれ！なDeviseは、

```ruby:Gemfile.lock
devise (4.4.3)
      bcrypt (~> 3.0)
      orm_adapter (~> 0.1)
      railties (>= 4.1.0, < 6.0)
      responders
      warden (~> 1.2.3)
```
こんな感じになっています。暗号化Gemのbcyptとか認証のベースを担うwardenとかに依存関係があるんですね。

なぜこれがあるのかというと、「ローカル環境ではこれらのGemがこんなバージョンで使われている」というのが記録されていれば、ほかの環境でGemを準備する時にそれを参考にすることで、迷わずローカルで動く組み合わせのGem×バージョン×依存Gemを用意できるからです。
要するに、他の環境でちゃんとGemを用意するためにあるんですね。

でbundlerのアップデートに関しては、ローカルなら対処できるのですがheroku上では無理です。なぜかというと、[公式ドキュメント](https://devcenter.heroku.com/articles/bundler-version)に書いてあるのですが、すごくざっくり言うと「安定して使えることが確認できているバージョンのbundlerを使うよう、設定を固定しています」ということですね。

公式ではローカルのbundlerのバージョンを一時的に下げることも（非推奨ではあるが）記載があったような気がします。でもその前に、一度立ち止まって考えてみましょう。

なぜ、使用しているbundlerのバージョンが、Gemfile.lockに記載されているbundlerのバージョンより低いと問題になるのか。

以下妄想で申し訳ないのですが（定かな知識をお持ちの方はコメントいただけたら幸いです）、bundlerのバージョンによって、Gemfileを元に取得するGemのバージョンが異なる可能性があるからなのではないかと思います。
新しいバージョンのbundlerが取得する新しいGemで動いていたものを、本番環境で古いbundlerが古いGemを取ってきてしまい動かない、なんて自体が起こりうるのではないのでしょうか。

どのバージョンのGemを取得するかどこかにしっかりと記載されていれば確信を持って「このバージョンのGem!!!!!!!」と取得できます。そう、Gemfile.lockです。
しかしGemfile.lockに記載がないものはGemfileを元にふわふわ探しに行かなければなりません。「なんかいい感じのエナジードリンク買ってこい」と言われた新入社員のごとく。モンスターの緑買ってこい！とか言ってくれ。

私のGemfile.lockは以前```bundle install```した時のままちょっと更新されてなかったので、Gemfile.lockに書いてないけどGemfileに書いてあるGemがあるという状況を作り出し、みんなを困らせてしまいました。ごめん。

##Gemfile.lockは動作を担保する立場の人がバージョン管理するのが良いと思います。

適当なことが書いてあるのに気づいた方は、お手数ですがご連絡いただけると幸いです。
Genymotionエミュレータ起動中にadbが失敗したら

## 前提
- Mac OS X 10.12.6
- Android Sdkインストール済み
- Genymotion 2.12.1

## 現象

AVDは起動も早くなって使いやすくなったんだけど、Genymotionの方が便利なときもある。

GenymotionでAndroidエミュレータを作成して起動して、、、

```
$ adb devices
```
とすると以下のエラーが出た。

```
$ adb devices
List of devices attached
adb server version (39) doesn't match this client (40); killing...
ADB server didn't ACK
Full server startup log: /var/folders/ng/knhm_wrj36s15jzb5q9z6cbhny_p2j/T//adb.736450641.log
Server had pid: 51497
--- adb starting (pid 51497) ---
adb I 07-04 15:53:07 51497 2245001 main.cpp:56] Android Debug Bridge version 1.0.40
adb I 07-04 15:53:07 51497 2245001 main.cpp:56] Version 4797878
adb I 07-04 15:53:07 51497 2245001 main.cpp:56] Installed as /Users/xxxx/Library/Android/sdk/platform-tools/adb
adb I 07-04 15:53:07 51497 2245001 main.cpp:56]
adb I 07-04 15:53:07 51497 2245001 auth.cpp:421] adb_auth_init...
adb I 07-04 15:53:07 51497 2245001 auth.cpp:174] read_key_file '/Users/xxxx/.android/adbkey'...
adb server killed by remote request

* failed to start daemon
error: cannot connect to daemon
```

## 解決方法

どうやらGenymotionもadbを持っているらしく、自分のインストール済みadbと競合しているらしい。

Genymotionのadbを、自分がインストール済みのadbにパスを変えればいいらしい。

### Genymotion > Settings > ADB

ここが `Use Genymotion Android tools (default)` になっているのがダメ

<img width="662" alt="スクリーンショット 2018-07-04 15.53.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/8701a588-fe44-3644-1788-f69d028441c1.png">

`Use custom Android SDK tools` を選んで自分のadbパスを選択する。

画像のとおり、`Android SDK tools found successfully` が出ればOK

<img width="662" alt="スクリーンショット 2018-07-04 16.01.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/657d13b9-5369-5941-3d0c-c5986668ff38.png">

あとはGenymotionのエミュレータを起動しなして、adbコマンドは無事に動いた。

## 参考リンク

https://stackoverflow.com/a/43080159
Rubyで、hashをmergeするときに、同一keyの場合はvalueを集計したいとき

例えば、keyに日付が入っており、valueに値が入っているhashが２つあり、

```rb

scores1 = [ {'2018-07-01', 1},   {'2018-07-03', 2},  {'2018-07-04', 3} ]
scores2 = [ {'2018-07-02', 1},   {'2018-07-03', 1},  {'2018-07-05', 2} ]
```

そのhashを以下のようにマージしたい（同一keyの場合は値を合計したい）場合


```rb

sum_score = [{'2018-07-01', 1}, {'2018-07-02', 1},  {'2018-07-03', 3},  {'2018-07-04', 3},  {'2018-07-05', 2} ]
```

ループ回しながらKeyを判定して・・とかやらなくても、こうすることで簡単にできます。

```ruby

sum_score = scores1.merge(scores2) do |key, oldval, newval|
    # 同一keyの場合はsumを行う
    oldval + newval
end
```

同じことで困った人のために、メモとして残しておきます。
配列や連想配列の集計は色々便利なやり方があるようです。

参考URL:
https://ref.xaio.jp/ruby/classes/hash/merge
gcc 7.3.0をソースからコンパイル＆インストール

ホームディレクトリでビルドしたり、展開したソースディレクトリとビルドディレクトリを分けなかったりするとうまくビルドできないことが多かったので、これでやれば確実にビルドできるという方法を書き残しておきます。

環境は以下です。

- Amazon Linux
- `sudo yum groupinstall "Development Tools"` 実行済み


## 手順

[gcc公式のインストール手順](https://gcc.gnu.org/install/)を参考に行う。


```bash
sudo su -
cd /usr/local/src
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-7.3.0/gcc-7.3.0.tar.gz
tar zxvf gcc-7.3.0.tar.gz
cd gcc-7.3.0
./contrib/download_prerequisites
mkdir build
cd build
../configure --enable-languages=c,c++ --prefix=/usr/local --disable-bootstrap --disable-multilib
make -j`nproc` # CPUコア数に応じて並列コンパイル
make install
```

### make install で ldconfig のエラーが出たら手動で修正

```
ldconfig: /usr/local/lib/../lib64/libstdc++.so.6.0.24-gdb.py is not an ELF file - it has the wrong magic bytes at the start.
```
のようなエラーが出たら、対象のファイルを削除して再度ldconfigを実行する。

```bash
mv /usr/local/lib/../lib64/libstdc++.so.6.0.24-gdb.py /usr/local/lib/../lib64/ignore-libstdc++.so.6.0.24-gdb.py
ldconfig
```

### バージョン確認

```bash
gcc --version
```

rootユーザでよくあるが、 `/usr/loca/bin` にパスが通ってないと新しい方のgccを参照できないので注意。

## 注意点

### ビルド用のディレクトリ *objdir* をソースディレクトリ *srcdir* とは別に作る

> First, we **highly** recommend that GCC be built into a separate directory from the sources which does **not** reside within the source tree. This is how we generally build GCC; building where *srcdir* == *objdir* should still work, but doesn’t get extensive testing; building where *objdir* is a subdirectory of *srcdir* is unsupported.

https://gcc.gnu.org/install/configure.html から引用

### configureのprefixオプションはshellが認識できる場所を指定する

> We **highly** recommend against *dirname* being the same or a subdirectory of *objdir* or vice versa. If specifying a directory beneath a user’s home directory tree, some shells will not expand *dirname* correctly if it contains the ‘~’ metacharacter; use $HOME instead.

https://gcc.gnu.org/install/configure.html から引用
ローカルでGtagをテストする場合

プロパティ設定の
デフォルトURLを

```
127.0.0.1:3000 #portは合わせてください

#localhost:3000だとエラーになります
```
にする。


それでもリアルタイムで見れない場合は
Adblock等のアプリが入っていないかを確認してください

入っている場合はドメインを除外するか、そのページでは実行しないように設定する
Dynamics365の個人用ビューの削除方法

最初、個人用ビューの削除の方法が分からず苦戦したのでまとめておきます


##個人用ビューの削除方法

### 1．高度な検索を開く

###2．削除したい個人用ビューがあるエンティティを選択する
今回は活動エンティティの個人用ビューを削除します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258847/2fb17218-0f7a-e7a0-7fff-03ce25a5d49d.png)

##3．「保存されているビュー」をクリック
該当エンティティで自分の作成したビューの一覧が表示されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258847/cecc7026-07d4-b688-6dea-380494a493f8.png)

###4．「保存されているビュー」タブをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258847/bcd62772-d048-4901-8b79-cfa6d63878bd.png)

###5．削除したいビューにチェック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258847/69497e4d-e212-854b-ced1-96681bfbc9ff.png)


###6．ゴミ箱ボタンをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258847/4f44c07d-b3fb-cee1-7f09-1d749fc0e441.png)

###7．「削除」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/258847/ae63a298-1c05-14d9-5cff-ed2a7b7ecc4d.png)




以上の手順で個人用のビューを削除できます。
とりあえずこれで削除できるのですが、もし簡単な方法あれば教えてくださいm(__)m
二次元配列でimplodeを使いたい

phpにはimplodeという関数がある。

 > implode
「配列要素を文字列により連結する」
http://php.net/manual/ja/function.implode.php

例えば次のような使い方ができる。

```php
$cards = [1,3,5,6,7,24];
echo implode(' ', $card);
```
1 3 5 6 7 24
このような出力がされ、for文を回さずにすっきりと書ける。
しかし、二次元配列の時にimplodeを使って出力する場合はどうなるのだろうか。

 ```php
$cards[0] = [1,3,5,7,12,13];
$cards[1] = [2,3,4,5,1,7,4];
$cards[2] = [3,1,3,5,6,1,3];
 ```

上記配列を、

```
1 3 5 7 12 13
2 3 4 5 1 7 4
3 1 3 5 6 1 3
```
このように出力したい場合はどうすればいいか。

1つはforeach文を使う方法

```php
foreach($cards as $card){
       echo implode(' ', $card),PHP_EOL;
}
```

もう1つはarray_mapをつかって書くことができる
 > array_map
「指定した配列の要素にコールバック関数を適用する」
http://php.net/manual/ja/function.array-map.php

```php
echo implode(PHP_EOL, array_map('imp', $cards));

function imp($cards)
{
     return implode(' ', $cards);
}
```
汎用的なViewControllerを目指して

皆さんはSwift好きですか。
好きだからこの記事を見ていますよね笑

さてここからが本題ですがこんな経験はありますでしょうか
・全画面で共通の処理がある
・全画面で共通のViewがある
・Viewの変更に柔軟に対応したい

こういったものに対応するべく以下のような画面構成にすることで
柔軟に対応できるかと思います。

# 画面構成

![d86d315a234d192023864e2af7dca168.png](https://qiita-image-store.s3.amazonaws.com/0/219469/72087d41-09e4-deae-3938-b5056d36fcf1.png)


### RootViewController
特徴として、どの画面を表示していても、この画面のインスタンスは
破棄されず保持され続けるので、全画面共通での処理などを記載するのに最適です。
(例：自動ログアウトなどの画面遷移ロジック)

### ContainerViewController
これがミソ。もし後から共通のヘッダーなどを追加して欲しいなどの
要望があった場合にここにContainerViewControllerを
追加すれば比較的楽に対応が可能。

### NavigationController
割愛。

### 表示したいViewController
表示したいviewをここに表示。

## まとめ
やっていることは単純ですが急な仕様変更などに対処できる選択肢が
増えるかと思います。Apple公式のアプリなどもたくさんContainerが使用されているので
使用しない手はないと思います。皆さんもぜひ。
Chrome 拡張機能の popup ウインドウが RDB接続経由時に意図せず閉じられてしまう問題


## 環境
- Windows 7 Pro 64bit
- Google Chrome 67

## やりたかったこと
1. ある Google Chrome のウインドウＡで、ツールバーの拡張機能アイコンがクリックされたら popup ウインドウＢを開く
1. popup ウインドウＢが開いたとき、新しいウインドウＣを（なるべくユーザーに不可視で）開く
1. ウインドウＣでスクレイピングした処理結果を pupup ウインドウＢに返却し、popup ウインドウＢを再描画する

## 遭遇した問題
- Windows リモートデスクトップ接続経由で Google Chrome を使用した際、ツールバーの拡張機能アイコンをクリックしても popup ウインドウＢが表示されない
  - このとき、新しいウインドウＣは開かれた状態になっている

## 原因？
- Windows リモートデスクトップ接続経由で Google Chrome を使用した場合、ウインドウＡ以外のウインドウ（ここではウインドウＣ）にフォーカスを奪われると popup ウインドウＢが閉じられてしまう
  - 通常は、ウインドウＡ以外のウインドウにフォーカスを当てても（ウインドウＡ内で popup ウインドウＢ以外の領域をクリックしない限り）、popup ウインドウＢは閉じられないハズ

## 解決策（workaround）
- ウインドウＣを開く際にフォーカスを当てないようにする（`focused: false`）
  - また、`focused` オプションを指定すると（ウインドウＣを最小化するための）`state` オプションが無視されるようなので、ウインドウサイズを極小にしておく


```diff
  chrome.windows.create({
    url: url,
    type: 'popup',
-   state: 'minimized'
+   focused: false,
+   top: 0,
+   left: 0,
+   width: 1,
+   height: 1
  }
```

もっと良いアイディアをお持ちの方は、ぜひコメントをください！

## 参考資料
- https://developer.chrome.com/extensions/windows#method-create
[HTMLでお絵描き入門]JavaScriptでCanvas上に直線を描く

canvas,JavaScriptのマウスイベントで直線を描きます。
canvasで線分を描く方法のままマウスイベントを設定すると問題が発生するため、
問題点・解決案を書きました。

##ゴール
下イメージを目指します。
![ゴール.gif](https://qiita-image-store.s3.amazonaws.com/0/259333/3808cde2-1b35-e4b6-793f-53dca4e47ccd.gif)


##問題点
マウスイベント
1.onmousedown->始点を設定
2.onmousemove->始点~カーソル位置までを線で結ぶ
3.onmouseup  ->終点を設定/始点~終点までを線で結ぶ
を設定するだけだと**マウスが動いた軌跡全てに線が引かれてしまいます。**
これはcanvasが動画のように描画していることに起因しています。
![canvas_sequence.gif](https://qiita-image-store.s3.amazonaws.com/0/259333/f2f91f20-bd98-877e-cadc-4eb7ad632fdc.gif)

##解決策
カーソル位置の座標管理+描画面を都度消去する処理を追加
**※詳細は一番下デモ画面を参照して下さい。コードも記載しています。**
1.終点座標を配列管理するための[]を用意

```js
let storedLines = [];
```
2.描画を消す＋始点~終点を線分で結ぶ関数を設定。

```js
function Redraw(){
    ctx.clearRect(0,0,can.width,can.height);
    if(storedLines.length == 0){
        return;
    }
    for(let i = 0; i<storedLines.length; i++){
        ctx.beginPath();
        ctx.moveTo(storedLines[i].x1, storedLines[i].y1);
        ctx.lineTo(storedLines[i].x2, storedLines[i].y2);
        ctx.stroke();
    }
}
```
3.onmousemove->2で設定した関数を使います。
4.onmouseup  ->終点座標をstoredLinesへpush
###デモ

<p data-height="400" data-theme-id="0" data-slug-hash="pKBOoJ" data-default-tab="js,result" data-user="keita-minowa" data-embed-version="2" data-pen-title="HTML/Canvas Drawing Stroke Line" class="codepen">See the Pen <a href="https://codepen.io/keita-minowa/pen/pKBOoJ/">HTML/Canvas Drawing Stroke Line</a> by Keita Minowa (<a href="https://codepen.io/keita-minowa">@keita-minowa</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

canvasで線分が描けました。

参考URL
>https://stackoverflow.com/questions/22441446/mouse-interaction-in-html5-canvas-drawing-lines
PHP入門　Progate編

#PHPとは
- PHPとは見る人や状況に応じて、表示するテキストを変更する言語
- `<?php…;?>`
PHPでは文末に`;`を使う。`//`の後に文字を書くと、行末までメモになる。

- `<echo>`
文字列出力の命令
出力する文字列は`'`か`"`で囲む。
ただし、数値の場合には必要ない。

(計算式に使う記号は＋、－、*、/。％は割ったときのあまりを出せる。)

##変数
データの入れ物。頭に＄をつける。
`$変数名＝値`（htmlの属性のようなもの）

- メリット

 -  データに名前を付けることで、そのデータが何を表しているのか明確にする。
 - 複数回使うデータなら、変更が生じた際に１か所の修正で済む。
   (変数の中身は上書きすることができる。後に書いた中身が優先される。)

変数に数字を加えることができる。

```php
$x=1;
$x=$x+（-、*,/）10;
$x +(-,*)=10;
```

##文字列の連結
`.` 記号を用いると文字列を連結することができる。
文字列と文字列、変数と文字列、変数と変数など

`$name . = '~';`
みたいな書き方もできる

##変数展開
"で文字列を囲み、中の変数を{}で囲むとその部分が変数に入っている値で書き換えられる。

`"こんにちは、｛$name｝さん"=`
`'こんにちは、｛$name｝さん'`…こちらだと変換されない。

##If文

if文は条件に応じて処理を分岐することができる。

- 処理が実行される例

```php
$x=20;
if($x> 10){
echo '$Xは10より大きい';
}
```

- 処理が実行されない例

```php
$x=20;
if($x> 30){
echo '$Xは30より大きい';
}
```
##比較演算子　

２つの値を比較するための記号(true or falseの証明)
大小          等しいか
`<`　　     ==右辺と左辺が等しい　
`<=`　     !=等しくない
`>`
`>=`右辺のほうが小さいまたっ等しい
trueとfalseは真偽値という
真偽値は文字列や数値といったデータの一種

##elseif文
ifと組み合わせてelseを使うと、「もしも～だったら・・・、そうでなければ・・・」といった条件分岐が可能になる。

(ifはそうだったと時用　elseはそうじゃなかった時用)

```php
if($x>40){
echo '~~~';
}
```
elseの場合()はいらない

##論理演算子
複数条件を１つにまとめるもの。
`&&`はかつ　左右の式がどちらもtrueでtrueになる
`||`はまたは　左右の式両方、もしくはどちらかがtrueでtrue

##Switch文

if,elseによる分岐が多い複雑な場合に用いられる。
switch(式)の式がcaseの値と一致した時、ブロックが実行される。
どれにも当たらなかったとき、defaultのブロックが実行される。
`case 1:`とcaseはコロン
ブロックの最後にbreak命令は必須

##配列
配列を用いることで、複数の値をまとめて１つの変数で保存することができる。
基本構文：`$配列名=array(値１、値２…)`
配列データには先頭から０、１、２…と順に「インデックス番号が割り振られる」
配列データを取り出す際には、＄配列名[インデックス番号]といった手順で取り出す。
配列の末尾に値を追加する際には
`$配列名[]=値`
既に存在するインデックス番号を[]に指定すると上書き

##連想配列
配列と同じく、複数のデータをまとめるのに用いられる。
配列との違いは「キー」「=>」を用いるという点。
`$配列名＝array('キー名'=>'値１…')`


##繰り返し処理
１から１００までの数値を出力するときのように繰り返し何かを行いたいとき
for文を用いる

```php
for(①$i = 1;②$i <=100;④ $i++){
③echo $i;
⑤echo '<br>';
}
```

①初期化②ループ条件③繰り返す処理④変数の更新⑤echoの改行

足す数字が１の時だけ++で省略可--もある

##while文
for文と同様、繰り返し処理の１つ
for文の時のように変数`$i`が自動的に増えないため、ループのたびに`$i ++;`を行う。

```php
$i=1;　←初期化
while
($i<=100) ←ループ条件
{
echo $i;　←繰り返す処理
$i++    ←変数の更新
}
```

・break文
ループを強制終了する命令。繰り返し分の中で利用することができる。
条件文と組み合わせて利用するのが一般的。

```php
for($i=1;$i<=10;$i++){
if($i>5){
break;
}
echo $i;
}
```

##continue文
ループを抜けるbreak文に対しcontinue文は現在の周だけをスキップしループそのものは継続して行う。


##foreach文

配列、連想配列を行う中で、先頭から順にデータを取り出し行う。

```php
$data=array('東京', '大阪', '京都');

foreach($data as $value){ echo $value; }
foreach(配列 as 値変数){ 繰り返したい処理; }　　
foreach(配列 as キー変数=>値変数){ 繰り返したい処理; }

$scores = array('数学' => 70, '英語' => 90, '国語' => 80);
foreach ($scores as $key => $value) {
      echo $key.'は'.$value.'点です。';
    }
```
has_manyで定義されたアソシエーションを順序を指定して効率的にとってきたい

## 問題提起
通常、Railsを使って、N+1問題を解決しつつ、子要素以降にorderを指定しようとすると

```ruby
Parent.eager_load(:children).order(:name, "children.name")
```
のように書く形になることが多いと思う。   

今回はこの問題に関して本当にこれが正しいのか？を考えてみたい  

例えば、下記のようなコードで利用することを考える

```ruby
parents = Parent.eager_load(:children).order(:name, "children.name")
parents.each do | parent |
  # ここでparentのオブジェクトに対する処理を行う
  p parent
  parents.children.each do | child |
    # ここでchildのオブジェクトに対する処理を行う
    p child
  end
end
```

上記のような利用シーンでは、ParentにChildのデータが`JOINされている意味`はなく、
`parent.children`で、`希望通りの並び順でchildが取得できていればいい`だけ。  

## 変更案１

- children取得後に並べ替える
    - orderから"children.name"を削除
    - joinする必要がなくなるので、eager_loadからpreloadに変更

```ruby
parents = Parent.preload(:children).order(:name)
parents.each do | parent |
  # ここでparentのオブジェクトに対する処理を行う
  p parent
  parents.children.sort{ |a, b| a.name <=> b.name }.each do | child |
    # ここでchildのオブジェクトに対する処理を行う
    p child
  end
end
```

ここで、気をつけてほしいのは、`parent.children.order(:name)`としてしまうと、せっかくpreloadしたのものが使われず、もう１度データ取得されてしまうこと。
※sortメソッドでやるのも無理やり感ありますが。  

## 変更案2
- 最初からsortしたアソシエーションを用意してそれを利用する
    - joinは不要になるので、eager_loadをpreloadにする

Parentクラスに、下記のようなアソシエーションを追加する（既存のものを変えてもいい場合は変更したほうが簡単です）  

```ruby
has_many :sorted_children, class_name: "Child", ->{ order(:name) }
```

呼び出し部分を変える

```ruby
parents = Parent.preload(:sorted_children).order(:name)
parents.each do | parent |
  # ここでparentのオブジェクトに対する処理を行う
  p parent
  parents.sorted_children.each do | child |
    # ここでchildのオブジェクトに対する処理を行う
    p child
  end
end
```

## JOINの何が悪いのか
データ量が増えれば増えるほど、JOINのコスト、sortのコストは増加していきます。
パフォーマンスを考えた場合、`不要なJOINをしないこと`が一番のパフォーマンスチューニングであると考えているので、なるべくJOINを使わない方法を探しました。

## まとめ
個人的には変更案２が無難かなとは考えています。
他にもいい方法があるようであれば、教えてもらいたいです。
Deep Learning AMI (ubuntu)でデフォルトユーザを変更して使用する方法

# 概略

AWSのAMIはデフォルトユーザ名が決まっているので，ID/PW認証のIDが既知なのはアタック耐性が弱くなるので「けしからん！」という方はいるだろう．
\# 私の勤務先にも沢山いる

で，Deep Learning AMI (ubuntu)はデフォルトユーザのホームディレクトリに環境があるので，別ユーザを作成して利用しようとするとハマる．
じゃぁどうすればいいかというと

- ユーザ名変更で乗り切る
- ただしホームディレクトリは変更しちゃだめ

# 前提

デフォルトユーザ``ubuntu``でログインできる状態のDeep Learning AMIインスタンスがあるとする．

# 手順

1. ユーザ名変更をするためのユーザ(``test``とする)を作成する

    ```
    sudo useradd test
    ``` 

1. ``test``をsudoerに加える

    ```
    sudo gpasswd -a test sudo
    ```

1. ``/home/ubuntu/.ssh/authorized_keys``を``/home/test/.ssh/authorized_keys``にコピーする

    ```
    sudo -s
    cp -r /home/ubuntu/.ssh /home/test
    chown -R test.test /home/test/.ssh
    ```

1. ``test``はパスワードなしで``sudo``できないので，パスワードを作る．ここでは``testpasswd``とする．
   \# もしくは``visudo``でパスワードなしの特権ユーザとして設定しても良いが割愛する

    ```
    sudo passwd test
    Enter new UNIX password: [testpasswd]
    Retype new UNIX password: [testpasswd]
    ```

1. **別窓で**``test``に接続できることを確認し，できることを確認したら``ubuntu``としてログインしている環境から抜ける
   \# 何の設定が漏れているか分からんので
1. ``test``で接続したターミナルからrootになり，デフォルトユーザ``ubuntu``の名前とグループを変える
   （参照：[Linuxでユーザーアカウント名、グループ名の変更 \- Qiita](https://qiita.com/tukiyo3/items/eb160174fa0bad551a45)）
   **※注意：**HOMEを変更すると，```source activate ***``` で参照するパスが```/home/ubuntu/***```であるため，深層学習環境を使えなくなる．HOMEは変更しないこと．

    ```
    sudo -s
    [sudo] password for test:
    usermod -l newuser ubuntu
    groupmod -n newuser ubuntu
    ```

1. ユーザ名を変更すると，パスワードなしで``sudo``することができなくなるので，パスワードを作る
   \# ``visudo``の設定を変更しても良いと思うが，ちゃんと確認してないので割愛する

    ```
    sudo passwd newuser
    [sudo] password for test:
    Enter new UNIX password: [newuserのパスワードを入れる]
    Retype new UNIX password: [newuserのパスワードを入れる]
    ```

1. ``newuser``でログインし正常に動作することを確認して完了

    ```
    ssh newuser@hogehoge
    echo $USER
    newuser
    pwd
    /home/ubuntu
    source activate chainer_p36
    ```
AttributeError: '_NamespacePath' object has no attribute 'sort'とでて泣いてたら解決した

pandasのread_gbqが使いたくて（dialectのオプションがきくやつ）いろいろやっていて、

`pip install pandas-gbq`
を実行したら、

```AttributeError: '_NamespacePath' object has no attribute 'sort'```

とでてきたのです。

調べていると、

setuptoolsが古いんだよ、
`pip install --upgrade pip setuptools`
をやればいいよ。

という情報がでてくるのですが、実行してもなにも変わらない。

あ、環境としては、pyenvでanacondaいれてその中でやっていました。

`conda install pandas-gbq -c conda-forge`
をたたけというのもでてきたのでやってみたけどやっぱりだめ。

長いことハマってて泣きそうだったのですが、

`conda update conda`

というコマンドを叩いたら、なんかsetuptoolsのバージョンが上がった模様。

おや、と思い、

`pip install pandas-gbq`

を叩いたら見事通りました。

めでたしめでたし。
Watson Java SDK で Visual Recognition を呼ぶ


Watson Java SDK
https://github.com/watson-developer-cloud/java-sdk/releases

API Key
https://console.bluemix.net/

```java

		VisualRecognition service = new VisualRecognition("2016-05-20");
		service.setApiKey("<apikey>");

		System.out.println("Classify an image");

		// ローカルからのアップロードも可能
		// ClassifyOptions options = new ClassifyOptions.Builder()
		// .imagesFile(new File("file/662s.jpg"))
		// .build();

		// 画像URL を指定する
		String url = "http://xxx.com/xxx.jpg";

		ClassifyOptions options = new ClassifyOptions.Builder() //
				.url(url)
				.build();
		ClassifiedImages result = service.classify(options).execute();
		// System.out.println(result);

		List<ClassifiedImage> images = result.getImages();

		for (ClassifiedImage image : images) {

			List<ClassifierResult> cr = image.getClassifiers();
			for (ClassifierResult r : cr) {
				// System.err.println(r.getName());
				List<ClassResult> cc = r.getClasses();
				for (ClassResult c : cc) {
					// System.err.println("ClassResult : " + c);
					System.err.println("ClassName : " + c.getClassName());
					System.err.println("Score : " + c.getScore());
					System.err.println("TypeHierarchy : " + c.getTypeHierarchy());
					System.err.println("---");
				}
			}
		}


```

出力結果は以下のような感じ。

ClassName : woman at work
Score : 0.654
TypeHierarchy : /person/woman at work
\---
ClassName : person
Score : 0.854
TypeHierarchy : null
\---
ClassName : pharmacist
Score : 0.599
TypeHierarchy : /person/pharmacist
\---
ClassName : bluestocking
Score : 0.595
TypeHierarchy : /person/female/woman/bluestocking
\---
ClassName : woman
Score : 0.666
TypeHierarchy : null
\---
ClassName : female
Score : 0.667
TypeHierarchy : null
\---
ClassName : maiden
Score : 0.5
TypeHierarchy : /person/female/woman/girl/maiden
\---
ClassName : girl
Score : 0.516
TypeHierarchy : null
\---
ClassName : gray color
Score : 0.96
TypeHierarchy : null
\---
solidity の modifier に引数を渡す

# はじめに

solidity の modifier に引数ってどうやって渡すかちょっと迷ったのでメモ

# 結論

modifier を使う際に渡せる引数は、関数への引数や、そのコントラクトの storage 変数など、modifier を使用する関数の中で参照可能な全ての値が modifier への引数として使える

>Arbitrary expressions are allowed for modifier arguments and in this context, all symbols visible from the function are visible in the modifier. Symbols introduced in the modifier are not visible in the function (as they might change by overriding).

http://solidity.readthedocs.io/en/v0.4.21/contracts.html#modifiers

以下簡単な利用例

- isItemOwner modifier は address を引数として取る
- checkPrice に渡される id と storage 変数の items から　address を計算して modifier への引数として利用できる

```
pragma solidity ^0.4.19;

contract ItemLdeger {
  
  address public owner;
  mapping (address => uint) public balances;
  mapping (uint => Item) public items;

  struct Item {
    uint id;
    address owner;
    uint price;
  }

  // 初期化
  function ItemLdeger() public {
    uint id = 1;
    items[id] = Item({ id:id, owner: msg.sender, price: 100 });
    owner = msg.sender;
  }

  // 引数のある modifier
  modifier isItemOwner(address _owner) {
    require(msg.sender == _owner);
    _;
  }

  // modifier を使う関数
  function checkPrice(uint id) 
    public 
    view 
    isItemOwner(items[id].owner) // modifier に渡す引数は、function への引数と storage 変数を参照して作れる
    returns (uint) {
      return items[id].price;
  }

}
```
How to Install MySQL 8 and phpMyAdmin via Docker?

# 1. Install Docker MySQL 8
```
$ sudo docker run --name mysql \
                  -p 3306:3306 \
                  -e MYSQL_ROOT_PASSWORD=1q2w3e4r \
                  -v /home/johnny/mysql/conf:/etc/mysql/conf.d \
                  -v /home/johnny/mysql/data:/var/lib/mysql \
                  --restart=always \
                  -d mysql:8.0.13
```

# 2. Install Docker phpMyAdmin
```
$ sudo docker run --name myadmin \
                  --link mysql:db \
                  -p 8080:80 \
                  --restart=always \
                  -d phpmyadmin/phpmyadmin
```

# 3. Open Browser 
http://0.0.0.0:8080/phpmyadmin

Read More
[MySQL 8 - Public Key Retrieval is not allowed](https://qiita.com/shaching/items/5fe3d5df691b4ec53084)
Symfony 2.7.3 SonataAdmin CSV文字化け FIX

```sonata-project/exporter/lib/Exporter/Writer/CsvWriter.php
    /**
     * {@inheritdoc}
     */
    public function write(array $data)
    {
        if ($this->position == 0 && $this->showHeaders) {
            $this->addHeaders($data);

            ++$this->position;
        }

        mb_convert_variables('SJIS-win', 'UTF-8', $data); // 追加

        $result = @fputcsv($this->file, $data, $this->delimiter, $this->enclosure);

        if (!$result) {
            throw new InvalidDataFormatException();
        }

        ++$this->position;
    }
```
ブートローダーが壊れただけの正常なファイルシステムのディスクを起動したい

今回使ったのはUbuntuですが、同じやり方でCentOSも出来るんじゃないかなぁ、と思ってます。

# 構成
OS: Ubuntu16.04(Server: CUI)
CD: Ubuntu16.04(LiveCD: GUI)
HDD: 4TB
GRUB2

# 注意
ここでは起動をするだけですが、何か変更を加える場合(下記でGRUBの初期化を実施しようとしていますが、こういったケースも含め)バックアップを取っておいてください。
また、正常なシステムで行うと予期せぬ問題が発生する事も考えられます。

# 解決
**LiveCDのブートメニューを起動して、HDDをrootにする**
boot=casperをroot=/dev/sda2(sda1はbios bootパーティション）として、10分もかからないと思いますが待っていると起動されました。
イメージ的には、LiveCDで実行する時にchroot /media/ubuntu/(UUID)/とする、でしょうか。

# 展開
ネットワーク接続設定を変えてopenssh-serverを入れて接続するところまで確かめたので、この状態でアプリケーションを起動したりするのも問題はなさそうです。
とはいえ、入念なテストを行ったわけではないので、なるべくなら正常な状態に戻すようにすべきです。

## 備考
GRUB の初期化を実施するとログイン画面ではなくGRUB Rescueが立ち上がるので、私の環境では改善は出来なかったようです。

# 補足
正常なファイルシステムであることをfdisk -lとmount /dev/sda2 (mnt)としてファイルにアクセスできることを確認したぐらいですが、より確実に調べるならgpartedを使うべきでしょう。

# 参考
<a href="https://www.kunihikokaneko.com/free/linuxtoolchain/grubinstall.html">起動できなくなった Ubuntu の起動を試みる(金子邦彦研究室)</a>

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
MySQL 8 - Public Key Retrieval is not allowed 

# Problem
Start from MySQL 8, the authentication plugin is changed to **"caching_sha2_password"**.

Therefore, phpMyAdmin or other client tools will get **"Public Key Retrieval is not allowed"** problem.

![mysql01.png](https://qiita-image-store.s3.amazonaws.com/0/150367/d9e1aa8e-9ef0-b4ac-60be-dbeee7723f44.png)

# Solution
We changed the authentication plugin to **"mysql_native_password"**.
> If you use docker. You need do this first. 
***$ sudo docker exec -it docker_run_name bash***
***Example: $ sudo docker exec -it mysql bash***

```
$ mysql -u root -p

mysql> use mysql

mysql> select host, user from user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| %         | root             |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
5 rows in set (0.00 sec)

mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Your New Password';
Query OK, 0 rows affected (0.08 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

```

# Test

![mysql02.png](https://qiita-image-store.s3.amazonaws.com/0/150367/e44d37c6-b5a5-be21-9816-ca6026ea9feb.png)


https://dev.mysql.com/doc/refman/8.0/en/caching-sha2-pluggable-authentication.html

https://stackoverflow.com/questions/49948350/phpmyadmin-on-mysql-8-0

https://blog.csdn.net/u014253011/article/details/80661643

https://blog.csdn.net/sanpic/article/details/80707918
Qiitaで知り合った長野県のリモートワーカーとリモートワークについて雑談しました。

この間、わたしと同じ長野県でリモートワーカーをしている宮崎大智さんにインタビューしてきました。宮崎さんはリモートワーカーとして３年の経験があるので、リモートのよいところ、よくないところ、工夫しているところなどをたくさん聞いてきました。

#### わたしが聞いたいくつかの質問
- 現在のリモートチームの体制
- フルリモートチーム内のコミュニケーションの仕方
- 朝会とミーティングの進め方
- リモートワークの良いところと良くないところ
- 孤独にならないようにすること
- これからリモートで仕事をしたい人へのアドバイス
- など

これからリモートで仕事を考えている人、リモートで働くってどんな感じだろう？と思っている人に、きっと参考になると思います。雑談的なインタビューになっているので、気軽に面白く読んでもらえると思います。

ぜひ読んでみてください！

[https://プログラミング教育.net/長野県でリモートワーカーとして、３年の経験がある宮崎大智さんにインタビューしました！](https://xn--qcka9i7azcwa9b5777ejp5b.net/%E9%95%B7%E9%87%8E%E7%9C%8C%E3%81%A7%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AB%E3%83%BC%E3%81%A8%E3%81%97%E3%81%A6%E3%80%81%EF%BC%93%E5%B9%B4%E3%81%AE%E7%B5%8C%E9%A8%93%E3%81%8C%E3%81%82%E3%82%8B%E5%AE%AE%E5%B4%8E%E5%A4%A7%E6%99%BA%E3%81%95%E3%82%93%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%93%E3%83%A5%E3%83%BC%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%EF%BC%81)
Laravel で DynamoDB の API を作成

Laravel で DynamoDB の テーブルを読むAPI を作成します。

>AWS 上の　DynamoDB に　テーブル　city があるとします。

>次のライブラリーを使います。
[baopham/laravel-dynamodb
](https://github.com/baopham/laravel-dynamodb)

1) プロジェクトの作成

```bash
laravel new dy01
cd dy01
composer require baopham/dynamodb
```

2) config/app.php の編集

```php:config/app.php
'providers' => [
// 略
    		BaoPham\DynamoDb\DynamoDbServiceProvider::class,

],
```

3) .env の編集

```text:.env
DYNAMODB_REGION=ap-northeast-1
DYNAMODB_KEY=*****************
DYNAMODB_SECRET=*****************************
DYNAMODB_DEBUG=true
```

4) config/dynamodb.php を作成

```bash
php artisan vendor:publish
```

5) モデルの作成

```bash
php artisan make:model Models/City
```

6) モデルの編集

```php:app/Models/City.php
<?php

namespace App\Models;
use BaoPham\DynamoDb\DynamoDbModel;

class City extends DynamoDbModel
{
        protected $table = 'city';
}
```

7) routes/api.php の編集

```php:routes/api.php
// 略
Route::group(['middleware' => ['api']], function(){
  Route::resource('city', 'Api\CityController');
});
```

8) コントローラーの作成

```bash
php artisan make:controller Api/CityController
```

9) コントローラーの編集

```php:app/Http/Controllers/Api/CityController.php
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Models\City;

class CityController extends Controller
{
       public function index()
        {
        error_log ("*** CityController index() ***");

        $cities = City::all();
        return $cities;
        }
}
```

10) サーバーの起動

```bash
php artisan serve --host 0.0.0.0 --port 8080
```

11) クライアントでアクセス

```bash
curl http://localhost:8080/api/city
```
Mac環境でRubyを利用したスクレイピングとTumblrに自動投稿するスクリプトを作る際に引っかかったこと

# やりたかったこと
JavaScript が使われた某サイトの情報をスクレイピングして編集し、自動で毎日Tumblr へ情報をポストしたかったのでスクリプトと実行環境を自宅の Macmini 上に作った。ruby での作業、Mac では始めてでした。

# 使った技術
- ruby(Capybara + Poltergeist(PhantomJS), tumblr_client)
- MySQL
- cron

# 引っかかったとこ

## Ruby のバージョンが反映されない

### 問題
Capybara をインストールしようとしたときに MacOSX の ruby のバージョンが古いから、ruby のバージョンを上げてくれというメッセージが出た。

バージョンアップ方法を調べて結果、rbenv を使ってインストールしたが、反映されなかった。

### 解決

反映させるには

- バージョン指定して切替える
- .bash_profile に Ruby の参照パスを追加する

の2つが必要だった。そもそも rbenv はユーザー権限毎にバージョン切り替えを提供するための仕組みらしく、ユーザー毎に参照先指定するのはなるほどなーと思った。


## bundler が反映されない

### 問題

gem は 他の言語でいうところのライブラリにあたるのかな。それらをインストールしたり管理したりするツールが複数あるらしく（めんどい）、というか複数あるなんてしらず、たまたま見ていた記事では bundler というツールで gem をインストールすると書いてあったので、そのまま適応してみたんですよね。でインストールしたけど、そんなコマンド知らん、といって怒られた。

### 解決

bundler へのパス通す必要がある。というかインストール時にうまいことやって欲しいぜ。。

.bashrc にパスを追加することで解決。

## gem が反映されない

### 問題

bundler でインストールした gem ないって怒られた。

### 解決
bundler でインストールした gem を使う（require）にはプログラム内に

```
require 'bundler/setup'
Bundler.require
```

と書く必要がある。

bundler も rbenv 同様にユーザー毎に設定する感じなんですね。


## ruby スクリプトが cron で起動できない

### 問題

ユーザー環境で問題なく tumblr_client による投稿も確認できたので、cron で自動投稿しようとしたら、ruby のバージョンが違う、といわれて怒られた。

### 解決

ユーザー環境では当然、rbenv で参照する .bash_profile を読み込んでいるけれど、cron を動かす root さんはユーザー環境なんか知らんので、既存の ruby を呼び出してしまい、結果システムが使う古い ruby が起動してしまっていた。なので、起動する際に、ユーザーの .bash_profile を読み込んでからスクリプトを起動するように cron のコマンドを書き換える。

```
* * * * * sonots /bin/bash -lc 'cd /path/to/program-dir && ruby program.rb'
```

/bin/bash を使うのですけど cron のデフォルトは /bin/sh だったので、crontab に「SHELL=/bin/bash」を追加しました。


bash のオプション -l はログインシェルとして起動されたかのように動くので、.bash_profile を読み込む、-c で以降のスクリプトを起動する、といった意味ですね。


## 参考リンク
### rbenv
[rbenvとは？（rbenvを利用したRubyのインストール）](https://qiita.com/yunzeroin/items/33a51c805e60ed5eca0e)
[rbenvでmacのrubyを最新にする](https://qiita.com/kogache/items/5886a6b62f036c1f94c9)
[Rubyのバージョンが切り替わらない時の対処法！](https://qiita.com/opiyo_taku/items/3312a75d5916f6cd32b1)

### bundler
- [bundleコマンドにパスが通っていなかったときの対処法](https://qiita.com/hyshhryk/items/7e728ad57d963454b142)
- [Bundlerの使い方](https://qiita.com/oshou/items/6283c2315dc7dd244aef)
- [Ruby Bundler gemを読み込みたい](https://qiita.com/rinkun/items/e50c6fd3d5f89ef163a8)

### cron
- [cronでrbenvのrubyを使う３つの方法](http://blog.livedoor.jp/sonots/archives/33204053.html) 3番目のやつ


## 用語集
- [GitHub - willnet/capybara-readme-ja: Capybara の README 和訳](https://github.com/willnet/capybara-readme-ja)
- [PhantomJSとは](https://qiita.com/uest_kensington/items/82cd6978b4ac7afa6fdf)
- [Capybara + Poltergeist(PhantomJS)編](https://qiita.com/rinkun/items/cebd8e25aec13b6bb933)
コマンドラインでjsonの中身を書き換える

コマンドラインから、要素の追加をし、かきかえたい。


```article.json
"newslist": [
  {
      "name": "test",
      "link": "test.pdf",
      "category": "飲食",
      "filesize": "0.4MB",
      "src": "news/news1808_insyoku.png?20180704",
      "srcset": "news/news1808_insyoku.png?20180704"
    },
]
```

# 要素の中に追加

`|= .+`をつけると要素の中が更新、または追加

```sh
(JSON='articles.json'; cat $JSON | jq '.newslist[0] |= .+ {"name": "myId"}' > 'articles.json') 
```

結果 (nameが更新される)

```article.json
"newslist": [
  {
      "name": "myId",
      "link": "test.pdf",
      "category": "飲食",
      "filesize": "0.4MB",
      "src": "news/news1808_insyoku.png?20180704",
      "srcset": "news/news1808_insyoku.png?20180704"
    },
]
```

# 新しい要素として追加

`newlist`とつけたリスト`[{"name": "myId"}]`に変更で、新しい要素として追加

```sh
(JSON='articles.json'; add_json=`cat $JSON | jq '.newslist[]' | head -n 40`; cat $JSON | jq '.newslist |= .+ [{"name": "myId"}]' > 'new_json.json')

```

結果 (別の要素にnameが追加)

```article.json
"newslist": [
    {
      "name": "myId"
    },
    {
      "name": "test",
      "link": "test.pdf",
      "category": "飲食",
      "filesize": "0.4MB",
      "src": "news/news1808_insyoku.png?20180704",
      "srcset": "news/news1808_insyoku.png?20180704"
    },
]
```

その他

```sh
jq '.newslist[] = {"name": "myId"}' #newslist全てに適応
jq '.newslist[0] = {"name": "myId"}' #newslistの０番目の要素にのみ
jq '.newslist = {"name": "myId"}' #newslistを上書き

```
# 参考
https://dev.classmethod.jp/tool/jq-manual-japanese-translation-roughly/
https://qiita.com/daikumatan/items/a4d872538a6857b89725#%E9%85%8D%E5%88%97%E3%81%AE%E8%A6%81%E7%B4%A0%E3%82%92%E8%BF%BD%E5%8A%A0-1
Ubuntu 16.04 にMySQLをインストール || 少しハマったよバージョン

## :construction: まずは自身の使っている環境をご確認ください

### Debian
***
`$ cat /etc/debian_version`

### CentOSとかRedHatとか
***
`$ cat /etc/redhat-release`

### fedora
***
`$ cat /etc/fedora-release`

### ★Ubuntu ← 対象！
***
`$ cat /etc/lsb-release`

```
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
```

### UbuntuにMySQLをインストールしてみよう！
***

```
$ sudo apt update
$ sudo apt install mysql-server mysql-client
```

### 感想
***
至極単純明快！いいね！！！


## 完了かと思いきや、、、

```
$mysql -u xxx -p
Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

なんと！

## UbuntuにインストールしたMySQLを起動してみよう！

### deamonはいますかー？
***
`ps aux | grep mysqld`

いるじゃないか、、、

### 再起動してみよう
***

```
$ /etc/init.d/mysql stop
$ rm -f /var/run/mysqld/mysqld.sock
$ rm -f /tmp/mysql.sock
$ /etc/init.d/mysql start
$ mysql -u xxx -p
```

ダメじゃないか、、、

### 再起動も試してみよう  ↑と同じだけど
***

```
$ /etc/init.d/mysql restart
$ mysql -u xxx -p

Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.22-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

いけるんかい！

### 再度、感想
***
答えが出なくてごめんなさい、、、
JAVAとXMLでの制作に悩んでるので忘れないうちにやろうとしてることをメモ(for文での表示)

本気でメモです。
基本的に自分が分かればいいという精神でやります。
まず今の問題点
一つのTextViewにfor文で回したname.setText(lvl.get(i) + "￥r￥n" + sample.get(i) + "個" + "￥r￥n")の中でsampleの中身が0じゃないもの以外を表示したいのに最後の一つしか表示しない。
理由はiの値が書き換わっていってるからだろうなー。
じゃあどうしたらいいのか。
今やろうとしてるのはfor文の後にif文で0以外なら配列ary（仮）にsample(i)の中身を入れて条件式が完了し次第その下にさらにfor文にstrcmpでary（仮）の中身を表示すれば0以外のやつは選別できるはず・・・
でも結局一つしか表示されないし。。。
しばらく悩みそう
Firebase RealtimeDatabaseに大量データ投入　-　その1　-

GYAOのtsです。

# 経緯
投稿がかなり久しぶりになってしまった。チームが変わったり、担当のプロダクトが変わったりで完全にチームも作り直し状態になってしまった。個人的にはチームをある程度固定してチームに対して仕事をアサインしたほうが効率的かつインクリメンタルなチームを作る上で効果的な気がする。評価もチームに対してなされる方がいいと思うのだが、そうなっていない現状がある。。。努力せねば。

そんなこんなで、現在は[Firebase Realtime Database](https://firebase.google.com/docs/database/) を主軸とし、モバイルアプリケーションのバックエンドを刷新しようとしている。

# やりたいこと
* ユーザーに対するお知らせをメッセージとして格納していく。
* 全ユーザーに対するお知らせ、個別ユーザーに対するお知らせがある。
* メッセージの変更、削除ができる
* 個別ユーザーに対するお知らせは1回で500万程度のユーザーに対して。

これを実現するために迂余曲折（Firestore試したり、dataflow-pubsub試したり）あったが、
現状、以下の構成で行くことに決めた。

## データ構造
### /root/messagesの中にメッセージIDとメッセージ内容を格納。
isEveryoneがtrueであれば全員向け。（モバイルアプリで制御）
<img width="303" alt="スクリーンショット 2018-07-04 14.17.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/13aef953-97a0-902c-e703-e5d406a56a3d.png">

### /root/usersの中にメッセージIDとboolean（既読・未読）を格納。
<img width="296" alt="スクリーンショット 2018-07-04 14.53.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/114329/768ce412-b0fa-5de3-6462-2712c6c8574d.png">

## システム全体
![design.png](https://qiita-image-store.s3.amazonaws.com/0/114329/a4568fb2-89cd-23e0-5e11-f6628eca72ae.png)


1. cloud storageにmessageディレクトリ、usersディレクトリを作成。
1. 既存システムからjson linerをcloud　storageにアップロードしてもらう（1ファイル1万行を500ファイル）
1. CloudFunctionsのevent triggerでバケットを監視。uploadを検知
1. cloud storageのpathがmessagesならmessagesに、usersならusersにupsert（マージ）する。


※messageは有効期限（expireDate)をunix timestampで持っているので、モバイルアプリの方で切れたメッセージは出さない処理を入れる。DB上は残ってしまうので、cleanExpiredMessageでdailyで削除。functionsはcron triggerが提供されていない。 [他サービスつかってね](https://github.com/firebase/functions-samples/tree/master/delete-unused-accounts-cron)　なので、AzureのLogicAppsを使って、httpsで起動。

# 次回
DBのルールセットアップとupsertJsonを書きます。
メモ帳をつくる - HTML要素を編集可能にする方法

![editable.gif](https://qiita-image-store.s3.amazonaws.com/0/268390/31aae345-d4ba-05bc-55c5-158a7a75e9c4.gif)


#はじめに
この記事では、HTMLファイルをブラウザで開いた後、内容を編集可能にする方法を紹介します。

#やり方
HTMLファイルのテキスト関連のタグ内に、「contenteditable="true"」を記入します。
先ほどのGIFのHTMLファイルは下記のように記述されています。

```html:editable.html
    <h1 contenteditable="true">編集可能タイトル</h1>
    <div contenteditable="true">編集可能コンテンツ</div>
    <h1>編集できないタイトル</h1>
    <div>編集できないコンテンツ</div>
```


「contenteditable="true"」が記述されていないタグについては、編集ができません。

#さいごに

[保存](https://qiita.com/elBlanco/items/08e60c648b3ca4c7fdfe)や[テキスト装飾](https://qiita.com/elBlanco/items/46a5a608206fe1c17245)を組み合わせれば、Evernoteライクなページを作成することができます。
見た目も、textareaよりカッコいいです！