OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHP3でEntityを新規保存する方法


# Entityを保存する場合、1レコード作成する方法と複数レコード作成する方法が違うため、メモ

## バージョン
CakePHP 3.5
PHP 7.2

## 新規保存
### 1レコード作成する方法
``` UsersController.php
public function add()
{
    if ($this->request->is('post') {
        $entity = $this->newEntity($this->request->getData());
        $this->save($entity);
    }
}
```

### 複数レコード作成する方法
``` UsersController.php
public function add()
{
    if ($this->request->is('post') {
        $entities = $this->newEntities($this->request->getData());
        $this->saveMany($entities);
    }
}
```
Rails+heroku+postgreSQLでnilを最後にしてorderする


それぞれ取得して、あとで+で結合する。

```ruby
    @novels_like_not_null = @osusume.novels.where.not(like: nil).order(like: :DESC)
    @novels_like_null = @osusume.novels.where(like: nil)
    @novels = @novels_like_not_null+@novels_like_null
```

もっと綺麗なやり方があるかもしれない。。。
Zabbix3.4 PostgreSQLとElasticsearch 6.3のデータ連携

[こちら](https://qiita.com/jackkitte/items/5190ab0aea6713bb12c7)を参考に、Zabbix内のPostgreSQLデータをLogstash経由でElasticsearchに格納し、Kibanaでの可視化まで実施した手順を纏めます。

なおこの記事は、Zabbix/PostgreSQL、Elasticsearchをインストール済みの環境での実施手順です。
前提となる環境の構築情報は、記事の最後に必要順にまとめて載せています。

実行環境は次の通りです。

・CentOS 7.5
・Zabbix 3.4
・PostgreSQL 9.2.23
・Elasticsearch 6.3.2
・Kibana 6.3.2
・Logstash 6.3.2


#<b>Logstashのインストール</b>

様々なデータソースからのデータ収集エンジンであるLogstashをインストール
[こちら](https://www.elastic.co/guide/en/logstash/current/installing-logstash.html)を参考に、PGP keyのインポートとElasticsearch の yum リポジトリを登録する

```
# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
# vi /etc/yum.repos.d/logstash.repo
[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
```
Logstashのインストールとサービスの起動

```
# yum -y install logstash
# systemctl start logstash.service
# systemctl enable logstash.service
```

#<b>Logstash Plugin等、JDBC接続環境の準備</b>
LogstashのJDBC接続用 Plugin logstash-input-jdbc Input Pluginをインストール

```
# /usr/share/logstash/bin/logstash-plugin install logstash-input-jdbc
```

PostgreSQL用のJDBCドライバを、Elasticsearchサーバ(アクセス側)にインストール

```
# yum -y install postgresql-jdbc
# find / -name postgre*.jar
```

#<b>PostgreSQLから収集するデータ内容</b>
Zabbix内のPostgreSQL DBには2種類の時系列データ、trends(1年分データ）とhistory(1週間分データ）がある。今回はtrendsテーブルとitemテーブル（データ情報）を参照する。例ではlogstash.confという名前で作成する。

```Java
# vi /usr/share/logstash/bin/logstash.conf
input {
  jdbc {
    jdbc_driver_library => "/usr/share/java/postgresql-jdbc.jar" (jarファイル格納先)
    jdbc_driver_class => "org.postgresql.Driver"
    jdbc_connection_string => "jdbc:postgresql://Zabbix Server IP:5432/zabbix"
    jdbc_user => "zabbix"  (zabbixユーザ)
    jdbc_password => "zabbix"
    statement => "select itemid, items.name, items.hostid, to_timestamp(trends.clock), trends.num, trends.value_min, trends.value_avg, trends.value_max from trends JOIN items using (itemid)"
  }
}

output {
  elasticsearch {
    hosts => "localhost:9200"
    index => "trends"
  }
}
```

#<b>Elasticsearchへのデータ取り込み</b>
```
# /usr/share/logstash/bin/logstash -f /usr/share/logstash/bin/logstash.conf --path.settings /etc/logstash
```

#<b>KibanaでのIndexの確認</b>

[Management] > [Create Index Pattern]をクリックしindex patternに[trends]を入力し、trendsインデックスを確認

![Kibana.JPG](https://qiita-image-store.s3.amazonaws.com/0/251519/6ed4c6e1-9662-660d-d00e-827b8b55e7ac.jpeg)


[Discover]にてレコードの参照
![Search.JPG](https://qiita-image-store.s3.amazonaws.com/0/251519/cd748f84-0736-dd29-fd0b-e441a5e07aa6.jpeg)


関連記事
[Zabbix3.4 PostgreSQL版をCentOS7にインストールする](https://qiita.com/m-eno/items/93dbb93fcd286f460f92)
[Zabbix3.4 監視対象の設定](https://qiita.com/m-eno/items/20f91a850eabd62e7688)
[CentOS7へのElasticsearch6.3 のインストール](https://qiita.com/m-eno/items/6f0d76bff0114e917ef0)
[PostgreSQL9.x 外部ホストからの接続設定](https://qiita.com/m-eno/items/4a4f8f6f0b2d38709641)
jQueryで高さを固定長からautoアニメーションで変更させる方法

使ったサイト。
[なろう廃人のすすめ](https://www.narou-osusume.com/osusumes/1)
![ezgif.com-resize.gif](https://qiita-image-store.s3.amazonaws.com/0/145707/862d1dd9-48e3-5b45-bdd4-5949205e938f.gif)


元のheightをcssで100pxに設定、
そこからアニメーションでheightをautoにする。

autoにした場合の具体的なheightの数値をjqueryで取得、
その数値に向かってanimateさせることで
autoに向かってアニメーションで変更することを実装。


```javascript
      //現在のheight取得
      curHeight = $(this).height();
      //autoにした場合のheightを取得
      autoHeight = $(this).css('height', 'auto').height();
      //autoにした場合のheightへ向かってanimate
      //数値なのでanimateが有効
      $(this).height(curHeight).animate({height: autoHeight}, 150);
```

戻す場合は普通に数値指定すればOK。

```javascript
      $(this).animate({height: "100px"}, 150);
```
Uptime Robot (remote9.uptimerobot.com) (Tokyo - Japan)

# Uptime Robot 日本国内の接続元

[Uptime Robot](https://uptimerobot.com/)


監視接続元、日本だと


```
54.64.67.106 (remote9.uptimerobot.com) (Tokyo - Japan)
```

と書いてあるけど実際は `69.162.124.228` から来ている。


[Locations and IPs \| Uptime Robot](https://uptimerobot.com/locations)


# Mobile apps

モバイルアプリもあったみたい

- [Uptime Robot \- Apps on Google Play](https://play.google.com/store/apps/details?id=com.uptimerobot&hl=en)
- [‎Uptime Robot App on the App Store](https://itunes.apple.com/us/app/uptime-robot-app/id1104878581)
pickle vs npy

# やること

繰り返し同じデータを扱うとよくファイルに保存しておくが、.pickleと.npyのどっちを使うべきなのか深く考えたことがなかったので比較してみた。比較ポイントは読み込み/書き込み速度。

# 環境

python3.6(Anaconda)

# 比較するもの
- pickle(protocol=4)
- _pickle(protocol=4)
- numpy with 

# 比較

適当にndarrayの行列を作って保存して読み込んだ。np.saveは書き方がシンプル

```py:データ作成
import numpy as np

data = np.random.rand(1000, 1000, 3, 500)
```

```py:保存時間の計測
# numpy
start = time.time()
np.save('npsave', data)
print('numpy save:', time.time() - start)

# pickle
start = time.time()
with open('picklesave.pickle', mode='wb') as f:
    pickle.dump(data, f, protocol=4)
print('pickle save:', time.time() - start)

# _pickle
start = time.time()
with open('cpicklesave.pickle', mode='wb') as f:
    _pickle.dump(data, f, protocol=4)
print('_pickle save:', time.time() - start)
```

```py:読み込み時間の計測
# numpy
start = time.time()
data = np.load('npsave.npy')
print('numpy load:', time.time() - start)

# pickle
start = time.time()
with open('picklesave.pickle', mode='rb') as f:
    data = pickle.load(f)
print('pickle load:', time.time() - start)

# _pickle
start = time.time()
with open('cpicklesave.pickle', mode='rb') as f:
    data = _pickle.load(f)
print('_pickle load:', time.time() - start)
```

# 結果
| 形式 | 書き込み時間 [s] | 読み込み時間 [s] |
|:-:|:-:|:-:|
| numpy  |  104 | 113  |
| pickle  | 154  |  175 |
| _pickle  | 194  |  168 |

書き込みも読み込みもnumpyが最速だった。\_pickleはpickleよりも優秀だと思ってたがそこまで変わりがなかった。
今まで_pickle使ってましたがこれからはnp.save()つかいます。
チュートリアルで学ぶDocker

# 概要

Dockerについて知識としてわかった状態から、
チュートリアルで手を動かすことでDockerを使えるようにする。

基礎的な部分は良スライドがいくつもあるため、そちらでざっと勉強すると良い。
https://www.slideshare.net/zembutsu/practical-docker-and-arukas-osc2016-nagaoka
とか。

# 対象

幾つかのスライドでDockerのことをなんとなくわかったので
手を動かしながら学びたい人

## PLAIDさんのDockerチュートリアル

docker 関連のスライドを幾つか見た上で、手を動かしながら覚えられるので
良かった。
https://tech.plaid.co.jp/tutorial-for-docker-beginners/
https://github.com/otolab/plaid-study-20180605

基本的にはリポジトリをクローンしてきて、参照できるスライドをもとに
チュートリアルを進める。

```bash
git clone https://github.com/otolab/plaid-study-20180605.git
cd ./plaid-study-20180605/slide
docker-compose up -d
```
起動後、http://localhost:82/ にアクセスし、指示通りに進める。

## wordpressをdockerで

ざっくり使い方を覚えたら、実際に身近な題材で使ってみる。

```docker-compose.yml
version: '3'

services:
  wordpress:
    image: wordpress

    links:
      - mysql:mysql
    #他の初期値は https://hub.docker.com/_/wordpress/ を参照
    environment:
      MYSQL_ROOT_PASSWORD: "test"

    ports:
      #　ホストのポートは何でも良いが、使ってないところで。
      - 81:80

  mysql:
    image: mysql

    environment:
      #.envファイルなどを指定し管理外にしておくのが無難だが、テストのためわかりやすさ優先
      MYSQL_ROOT_PASSWORD: "test"
      #databaseを生成して起動
      MYSQL_DATABASE: "wordpress"

    volumes:
      - wordpress-data:/var/lib/mysql

# hostにvolumeとして定義したい場合
# https://docs.docker.com/compose/compose-file/#volume-configuration-reference
volumes:
    wordpress-data:
```

---

公式イメージの説明部分に、パラメータを指定するとどうなるかなど説明が書いてあるので、それをちゃんと読んでおくと困ったときに助かります。

https://hub.docker.com/_/wordpress/
https://hub.docker.com/_/mysql/

ymlの内容を一つ一つ理解しつつ、起動

`$ docker-compose up -d `

### データベースのホスト名に注意

![settings.png](https://qiita-image-store.s3.amazonaws.com/0/3094/6d4e4589-edb5-ebbc-ee75-d4610299913d.png)

wordpressのサーバからみて、dbのホストをdocker-compose.ymlでmysqlとして定義しているため、
localhostではなく、mysqlと指定する。


## 後処理
### volumeの整理
いろいろチュートリアルをやっていると、
hostのvolumeが汚れるので不要なものをすべて削除
`$ docker volume prune`


参考
　https://docs.docker.com/engine/reference/commandline/volume_prune/


次は公式のトレーニング動画があるのでやってみてまとめたい。
https://training.play-with-docker.com/
vueのnuxxでsassを使用する場合に[Make sure 'options.resources' is String or Array of Strings]とエラーがでる場合

#nuxtでsassの使用方法

###sassのインストール
```
yarn add --dev node-sass sass-loader
```

あとは、vueの中でも書けるようになります

####使用方法
```*.vue
<style lang="scss" scoped>
// you can use scss syntax here.
</style>
```

####使用例
```*.vue
<style lang="scss" scoped>
test {
  child {
    background-color: antiquewhite;
  }
}
</style>
```

####Tips
```nuxt.config.js
css: [
  '~/assets/css/main.css',
],
```

上記の設定から以下の設定に変更するとすべてのファイルに自動でインクルードされる
下記で説明しているresources-loaderとは違い表示されるページに追加される

```nuxt.config.js
css: [
  '~/assets/css/main.scss',
],
```

nuxt.js本家参考ページ
https://ja.nuxtjs.org/api/configuration-css/


###リソースローダーのインストール
すべてのsassに以下で指定したファイルが読み込まれる(@import)
上記しているやり方とは違い使用したいsassファイルに読み込まれる
また、ワイルドカード読み込みなども可能
**重複読み込み注意**

```
yarn add --dev nuxt-sass-resources-loader
```

####設定
```nuxt.config.js
module.exports = {
  env: {
    baseUrl:
      process.env.BASE_URL ||
      `http://${host}:${port}`
  },
/* 省略 */

  modules: [
    'nuxt-sass-resources-loader'
  ],
  sassResources: [
      //自分の作成したsassファイル
      //ワールドカードも使える -> *.scss
      '@/assets/css//main.scss',
  ]
}
```
**sassResourcesを追加するのがポイント**
【Slack】スレッドに投稿したコメントをチャンネル側に表示したけど、やっぱり消したいとき 

またSlackの地味な技を見つけました。
需要があるかわかりませんが共有です。

「スレッドに自分が投稿したコメントをみんなに見てほしくて `Also send to xxx(チャンネル名)` にしたけど、もう見てくれたからチャンネル側からは消しとこう」という場合に使えます！

## 手順
① スレッドで `Also send to xxx(チャンネル名)` にチェックを入れて「**Send**」ボタンをクリック

![1.png](https://qiita-image-store.s3.amazonaws.com/0/156147/07bce0e5-9cae-0543-2abf-15654de0694a.png)
***
② `replied to a thread:` がついてチャンネル側に表示される

![2.png](https://qiita-image-store.s3.amazonaws.com/0/156147/fed3ad10-cc8e-cb5d-5be4-aa63c8374851.png)
***
③ 「**More actions**」アイコンをクリック

![3.png](https://qiita-image-store.s3.amazonaws.com/0/156147/b5989175-a7ac-873e-28c8-4a3fc150936c.png)
***
④ 「**Remove from channel**」をクリック
![4.png](https://qiita-image-store.s3.amazonaws.com/0/156147/c9e3d917-5937-36ae-cedc-a857271d5a4f.png)
***
**これで、チャンネル側からは消えるけどスレッドにはコメントが残ります！**

## あとがき
これをやるとチャンネルがスッキリするので、私はちょこちょこやってます。
chmod備忘録

## chmod
```
$ chmod アクセス権限 ファイル名
$ chmod 777 hogehoge/hugahuga.txt
$ chmod o-x hogehoge/hugahuga.txt
$ chmod a=xwr,g-x,o-xw hogehoge/hugahuga.txt
```

## 権限

| 権限種別 | 番号 | 内容           |
|:-------- |:---- | -------------- |
| r        | 4    | 読込/展開           |
| w        | 2    | 書込/書換/追加/削除 |
| x        | 1    | 実行           |

## 八進

| 番号 | 表記 |
|:---- |:---- |
| 0    | ---  |
| 1    | --x  |
| 2    | -w-  |
| 4    | r--  |
| 3    | -wx  |
| 5    | r-x  |
| 6    | rw-  |
| 7    | rwx  |

## 対象

| 表記 | 内容 |
|:---- |:---------- |
| u    | 所有者     |
| g    | グループ   |
| o    | その他     |
| a    | 全て           |

## ls-lの説明
```
例
$ ls -l
dr-xr-xr-x. 2 root root  4096   6月  6 12:15 2018 hogehoge
-rwxr-xr-x  1 root root  27776  3月 23 03:52 2017 hugahuga
```
![ls-l.png](https://qiita-image-store.s3.amazonaws.com/0/63060/d437fce1-79a1-7dac-bb97-ebf222a974e2.png)


##### ファイルの種類と許可属性表記
| 種類 | 所有者 | グループ | その他 |
|:---- |:------ | -------- | ------ |
| d    | rwx    | r-x      | r--    |
| -    | 421    | 4-1      | 4--    |
| -    | 7      | 5        | 4      |


##### ディレクトリ種別

| ls -lでの表示 | 意味|
| :--- | --- |
| - | 普通のファイル |
| d | ディレクトリ |
| l | シンボリックリンク |
| c | キャラクタ型デバイスファイル（特殊ファイル）|
| b | ブロック型デバイスファイル（特殊ファイル）|
Raspberry Pi > Geany > Make (Shift + F9) > Makefileの一つ目がビルドされる > デフォルトのターゲット

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Geany 1.24.1
GNU Make 4.0
gcc (Raspbian 4.9.2-10) 4.9.2
```

Geanyには「Build」メニューの「Make」(Shift + F9)がある。

下記のMakefileを用意した。

```txt:Makefile
RPi_i2c_comm_CLKSTR: RPi_i2c_comm_CLKSTR_180712.c
	gcc -Wall -v RPi_i2c_comm_CLKSTR_180712.c gpio_RPi_180301.c wait_msec_nsec_180301.c i2c_comm_180302.c i2c_gpio_180309.c crc16.cpp -o RPi_i2c_comm_CLKSTR_180712
RPi_i2c_comm: RPi_i2c_comm_180227.c
	gcc -Wall -v RPi_i2c_comm_180227.c gpio_RPi_180301.c wait_msec_nsec_180301.c i2c_comm_180302.c i2c_gpio_180309.c -o RPi_i2c_comm_180227
```

Geanyの「Make」(Shift + F9)でビルドされたのは「RPi_i2c_comm_CLKSTR」の方だけ。

一つ目のターゲットだけビルドするのかもしれない。
(順番を入れ替えたら、RPi_i2c_comm_180227がビルドされることを確認済）。

### 教えていただいた事項

@tenmyo さんの[コメント](https://qiita.com/7of9/items/97a26904519244a89b7c/#comment-23c7a4d2850795a30452)にて引数なしのデフォルトターゲットに対するビルドであることが分かりました。

情報感謝です。
Dockerでfluentd + Elasticsearch + kibanaをしようとしたらDockerくんが凍ったお話

# 概要

自分の開発環境としてdocker-composeにあれよこれよとサービスを複数立ち上げて、そこにfluentdとElasticsearchとkibanaをぶちこんだらDocker for Macが凍るようになった。  
**Dockerアアアアァァァァァァァァ！！！**

# 原因

**メ　モ　リ　不　足**

Docker for Macにはデフォルトでは2GB与えられているが、これが絶妙に足りない数値だった
Vagrantで試したときに、1GB割当ではElasticsearchがそもそも落ちる程の代物なのだが、2GBだと動いてしまう。そこにスワップやアレやコレやと重なって凍っていたらしい

# まとめ

Dockerのメモリも面倒見てね！
RubyMine上でRails Webpackerプロジェクトのブレークポイントを使ったデバッグ


RubyMineのBreakpoints機能でJavaScriptデバッグができるので便利です。  

しかしWebpackerを使ってAngularやReactなどのプロジェクトではWebpackでビルドされたJavaScriptが出力されるため、Breakpointsで止めてデバッグ実行できないと思っていましたが、できました。

これはRubyMineだけでなく、JetBrains系のIDEでangular-cliやvue-cli, create-react-appなどwebpackビルド系のプロジェクトに関しても共通だと思うので、関連する人は参考になると思います。

今回はwebpackerを使ったRailsプロジェクトで、RubyMineでの開発を前提とします。

## Chrome拡張インストール
[JetBrains IDE Support](https://chrome.google.com/webstore/detail/jetbrains-ide-support/hmhgeddbohgjknpmjagkdomcpobmllji)をインストールします。

## プロジェクトをRunする

Run > Edit Configurations... で `rails s` と `webpack-dev-server` を起動する設定を行います。
RubyMineを使っている人はみんなやっていると思うので、今回は省きます。

今回はJavaScriptのデバッグなのでRubyMine側で起動しなくてもコンソールから起動でも良いかもしれません。

個人的なオススメはgemの `foreman` をインストールして `foreman start` コマンド一つでrailsとwebpackの開発サーバーが 立ち上がるようにしておくと、RubyMine側でも起動が一回になって良いです。

設定が終わったら `rails s` と `webpack-dev-server` Runしてブラウザで見れるようにしときます。

## プラグインインストール

RubyMineでNodeJSプラグインをインストールします。  
RubyMine > Preferences... > Pluginsからインストールできます。

## Webpackerの設定

config/webpack/development.jsにあるファイルを

```
const environment = require('./environment')

const config = environment.toWebpackConfig();
config.devtool = 'sourcemap';

module.exports = config;
```

という風に編集します。

`config.devtool = 'sourcemap'` の設定が肝になります。

これがないとビルド前ファイルのデバッグツール側で追えなくなり、見れません。


## JavaScriptデバッグ設定
Run > Edit Configurations... > + > JavaScript Debugから
NameとURLを設定します。

URLは先ほど動かしたプロジェクトのURLですね。
localhost:5000などです。

終わったらOKで保存します。

そしたらRubyMine上で先ほど設定したJavaScript Debugを選択したDebug実行します。(虫マークみたいなやつ)

するとChromeが立ち上がり、開いているページで使われているJavaScriptがRubyMine上で見れ、
Breakpointsで止まることができます。

View > Tool Windows > Debug > Scriptsタグから読み込まれているjsファイルの一覧が見れます。


これでいちいちconsole.log()しなくてもよくなりました。
react/redux-devtools, vue-devtools, Augury(Angular)などと組み合わせてより最強の開発環境が整いました！
[基礎編]enumを使って可読性を向上

# 目的 
- enumの基本的な使い方を知識の整理のため

# 目次
- enumをなぜ設定するのか？
- enumの定義方法
- scopeでのenumの使い方

## enumをなぜ設定するのか？

![Image from Gyazo](https://i.gyazo.com/e5abf915223dc2bfd62345a83596e215.png)

上記画像の`state`カラムの値(数字)がぱっと見で何をやっているのか分からないですよね。
そのような場合に、使用すると便利なのが「enum」です。

<font color='red'>enumは値に意味を持たせることができます。</font>
「0、1、2」という便宜的な数値で操作するよりも、よりも、<font color='red'>「draft、published、deleted」のようなキーワードで操作／参照できた方がコードの可読性は改善します。</font>

## enumの定義方法

|定義するキーワード|
|:---:|

|値|意味|
|:---|---:|
|0|下書き(draft)|
|1|公開済み(published)|
|2|削除済み(deleted)|

---

```rb:enumを定義
class Article < ApplicationRecord
  # 0が「draft」、1が「published」、2が「deleted」で操作／参照できるようになる
  enum state: { draft: 0, published: 1, deleted: 2 }
end 
```
```ruby:操作/参照方法
def show
  # 仮定
  # id:1の記事をのデータを検索
  @article = Article.find(1)

  # @articleにはid:1のデータ入っている
  # @articleに対して破壊的メソッド「.published!」で「公開済み(published)」に更新し保存する
  @article.published!

  # @article.stateを表示する(ステータス:公開済み)
  render plain: 'ステータス：' + @article.state #結果： published
end
```
---
#### 列挙値は配列としても定義できる

```ruby:
enum state: [:draft, :published, :deleted]
```

この場合、<font color='red'>データベースには配列のインデックス値がセットされます。</font>
ただし、その性質上、自分で数値を設定できない、あとから列挙値を追加／削除した場合、既存の値がずれる可能性がでてきます。

## scopeでのenumの使い方

```ruby:
class Article < ApplicationRecord
  scope :viewable, -> { published.where('published_at < ?', Time.current) }

# enumで設定した「published」を記述することで簡単に条件定義できる

end
```

## 最後に

文章力なさすぎて文章でアウトプットするの難しい。
定期的に過去の記事を見ると他者目線で見れる＆メンテナンスにもなると思うので良いかも
AWS Certificate Managerで無料証明書を発行

## AWS Certificate Managerについて

* ドメイン検証（DV）
  * 拡張検証（EV）、組織検証（OV）は提供されていない。
* 有効期限13ヶ月
* 自動更新
  * ELB、CloudFrontなどのAWSサービスに関連付けされていないと自動更新されない。
* ワイルドカード可
  * 「\*.hogehoge.com」の証明書はネイキッドドメインの「hogehoge.com」を保護できない。そのため、「hogehoge.com」「\*.hogehoge.com」を保護するように証明書をリクエストすること。

## Eメール認証
AWSでの証明書の発行にはDNS認証またはEメール認証でのドメイン所有権の検証が必要。
AWSはDNS認証を推奨。

以下のメールアドレスより確認メールが送信される。

    no-reply@certificates.amazon.com

※Gmailの場合迷惑メールに分類されていることがあるため、Gmailフィルタで迷惑メールにしないようフィルタを設定しておくと良い。

確認メールが以下のメールアドレス宛に送信される。

* WHOISに登録された連絡先アドレス
  * ドメインの登録者
  * テクニカル担当者
  * 管理者の連絡先

* WHOISにメールアドレスがない場合にも送信されるアドレス
  * administrator@ドメイン名
  * hostmaster@ドメイン名
  * postmaster@ドメイン名
  * webmaster@ドメイン名
  * admin@ドメイン名
Raspberry Pi Zero WとUSBシリアル通信する(not SSH)

# はじめに

Raspberry Pi は WiFi 接続しなくても USB ケーブルで接続してコンソールにログインできます。
しかしそのやり方の説明は SSH 接続するものばかりです。

ここでは USB ケーブルでラズパイと接続し、シリアル通信する方法を解説します。
USB シリアル通信アダプタは必要ありません。

# 背景

昔組み込み開発やってたおっさんエンジニア的には、
「開発ボードとはシリアル通信するもんじゃないの？ USB ケーブルで繋いでネットワーク通信して SSH 接続とか超イマドキでカッケェ。」
とか思ってました。

しかし Wi-Fi 接続の設定でトラブった際に USB でも SSH 接続できない問題が発生しまして・・・。
ネットワーク絡みで問題が発生したせいで、USB 経由のネットワーク通信もダメになったのかも。
事務所にある２つのディスプレイはどっちも HDMI 接続できず、HDMI-DVI 変換も見当たらず、HDMI 接続があるプロジェクターは持ち出されていて・・・
何が起こってるのかさっぱり分からん！！

__「やっぱりシリアル通信したい！！」__

と思ったわけです。

```pi@raspberrypi.local``` はラズパイが Wi-Fi で同じネットワークに繋がってればその IP アドレスにアクセスしに行くので、USB で通信してるんだか Wi-Fi で通信してるんだが分からないのも気持ち悪いです。

でも USB シリアル通信アダプタ手元にない・・・ USB ケーブルでシリアル通信できないのかな？
はい、できました！！

# Raspbian 側の設定

以下を参考にしました。

[Setup a Raspberry Pi for headless use with USB serial console](http://www.tal.org/tutorials/raspberry-pi-zero-usb-serial-console)

上記サイトを見てもらえばそれまでなんですが、英語苦手な人のためにも解説しておきます。

自分のインストールしたのは Raspbian jessie です。
スターターキット付属の SD カードからネットワーク接続なしでもインストールできるのをそのままインストールしました。

まずは /boot/config.txt を編集します。

```text:/boot/config.txt
dtoverlay=dwc2
```

これは SSH 接続できるようにする場合と同じですね。

次に /boot/cmdline.txt を編集し、行の最後に```modules-load=dwc2,g_serial```を追加します。

```
dwc_otg.lpm_enable=0 (略) modules-load=dwc2,g_serial
```

SSH 接続できるようにしたい場合は g_ether を指定しますが、それを g_serial にすればシリアル通信になります。

# Mac 側からの接続

自分の環境は macOS なのでその場合のやり方を書きます。

ラズパイを起動して USB ケーブルで繋いだら、以下で TTY デバイスを確認します。

```
ls -l /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port
/dev/tty.MALS
/dev/tty.SOC
/dev/tty.1051
```

1051 とか数字が入ったデバイスが現れているはずです。
どれか分からない場合は一旦 USB ケーブル抜いて確認して、繋いでまた確認してください。増えた奴が目的のものです。
この TTY デバイスに screen で接続します。

```
screen /dev/tty.1051
```

ログインして exit してもまたログイン画面に戻ってしまうので、GNU Screen を知らない人のために detatch の仕方を書いておきます。
デフォルトの設定では Ctrl-a d を打つと TTY デバイスとの接続が detatch されて screen を抜けます。
これは接続が切れている訳ではなく、

```
screen -r
```

とすると reattatch されて前の接続に復旧します。

# Windows 側からの接続

Windows マシンを持っていないので試してませんが、一応こうやればいいんじゃないかというのを書いておきます。

デバイスマネージャを起動して、ラズパイと USB 接続した際に増える COM ポート番号を確認しておきます。多分「ポート(COMとLPT)」ってところに現れるかと。

TeraTerm をインストールして、TeraTerm でその COM ポートに接続します。

# まとめ

USB ケーブルでの通信をシリアル通信にすることで、ネットワーク絡みで問題が起こってもラズパイにログインできるようになりました。

シリアル通信接続できるのに何で皆さん SSH 接続したがるんでしょうね？
ケーブルで１対１で接続してるんだから、暗号化通信とかいらなくないですか？

```/home/pi/.ssh``` を作成しておかなくても通信できますし、ネットワーク関係なくなりますし、こちらの設定の方がトラブルが少ないんじゃないかと思ってます。
WWW(The Web Conferenc)2018 採録論文分析

# 本記事では
WWW2018(ことThe Web Conference 2018)の論文読み会に参加するので、その前に色々分析してみた。
※ ただし、本記事の筆者は結果に対する考察はしていない。各々感じて欲しい。

# やったこと
- WWW2018の論文タイトルからワードクラウド作成
- 各Research trackの論文タイトルからワードクラウド作成
- 採録数が多い著者を抽出

※ 対象データはMain Proceedingsのみ、Companion proceedings(Poster, Workshopなど)は含んでいない

# (やるべきだけど) やってないこと
- 結果に対する考察
- 過去のWWWとの比較
- KDDやAAAIなど他会議との比較

# WWW2018の論文タイトルからワードクラウド作成

<img width="695" alt="0.png" src="https://qiita-image-store.s3.amazonaws.com/0/264359/61826f7a-aaa7-b7d5-018a-d4a2d8aef979.png">


# 各Research trackの論文タイトルからワードクラウド作成

|Crowdsourcing and Human Computation for the Web|Health on the Web|
|---|---|
|![](https://qiita-image-store.s3.amazonaws.com/0/264359/0691a8f7-bccf-ea47-9f37-73e1e76cc469.png)|![](https://qiita-image-store.s3.amazonaws.com/0/264359/fc5705b1-07fa-a750-7bb3-a8df99e70a3d.png)|
|**Intelligent and Autonomous systems on the Web**|**Security and Privacy on the Web**|
|![](https://qiita-image-store.s3.amazonaws.com/0/264359/0639f04e-3978-07f1-c2a9-f806c41df320.png)|![](https://qiita-image-store.s3.amazonaws.com/0/264359/8a621982-cf3f-9ea8-323e-ebe761095107.png)|
|**Social Network Analysis and Graph Algorithms for the Web**|**User Modeling, Interaction and Experience on the Web**|
|![](https://qiita-image-store.s3.amazonaws.com/0/264359/3882f2f8-0b32-53d3-c494-df183a1686cc.png)|![](https://qiita-image-store.s3.amazonaws.com/0/264359/3ecdfc48-d902-7567-de7b-ee9569acf9c6.png)|
|**Web Content Analysis, Semantics and Knowledge**|**Web Economics, Monetisation, and Online Markets**|
|![](https://qiita-image-store.s3.amazonaws.com/0/264359/b4b9811d-a619-1780-32b3-6cede570c0d9.png)|![](https://qiita-image-store.s3.amazonaws.com/0/264359/7051fdd1-e538-a12d-db1a-33cd0cd6549a.png)|

# 採録数が多い著者を抽出
Main Proceedingsに３本以上採録されている著者

5本
- Jure Leskovec (Stanford University)

4本
- Yiqun Liu (Tsinghua University)
- Min Zhang (Tsinghua University)

3本
- Tim Althoff (Stanford University)
- Xing Xie (Microsoft Research Asia)
- Najmeh Miramirkhani (Stony Brook University)
- Nick Nikiforakis (Stony Brook University)
- Xiangnan He (National University of Singapore)
- Shaoping Ma (Tsinghua University)
Angular CLI v6.0 でローカルサーバのポート番号を変更

## はじめに
複数のAngularプロジェクトを開発する中で、ポート番号を変更してローカルサーバを複数立ち上げたいケースがあり、設定方法を探してみました。

## 対象の環境
以下の環境で動作確認してます。

```
Angular CLI: 6.0.8
Node: 8.11.2
OS: darwin x64
Angular: 6.0.5
```

## 方法１：設定ファイルを書き換える
AngularCLIの設定ファイルですが、以前までは`.anglular-cli.json`でしたが、v6.0より`angular.json`に変更となっています。
`angular.json`ファイルに以下の設定を追加することで、ローカルサーバのポート番号を変更できます。

```json:angular.json
"projects": {
    "ng": {
        "architect": {
            "serve": {
                "options": {
                    "browserTarget": "ng:build",
                    "port": 4300
                }
            }
        }
    }
}
```

## 方法２：起動オプションで指定する
ローカルサーバの起動オプションとしてポート番号の指定ができます。

```
ng serve --port 4300
```

※npm-scripts（`npm start`など）を使用してローカルサーバを起動している場合は、以下のようにpackege.jsonを変更してください。

```json:package.json
"scripts": {
    "ng": "ng",
    "start": "ng serve --port 4300",
}
```
## 最後に
ローカルサーバ起動時に以下のように表示されていればOKです。

```
** Angular Live Development Server is listening on localhost:4300, open your browser on http://localhost:4300/ **
```

## 参考文献
[How to change angular port from 4200 to any other](https://stackoverflow.com/questions/40717449/how-to-change-angular-port-from-4200-to-any-other)
[Angular 6 - How to change default port 4200](https://stackoverflow.com/questions/50519121/angular-6-how-to-change-default-port-4200)
【仕事メモ-没ネタ】OpenAM (ver13) 用のOpenDJ(Linux ver2.6.0)インストール方法

#お断り
__この記事をご覧になる方、すみません、この記事に記載していることは何も保証できないです。__
__あくまで自分用のメモとして残してある記事です。__

#前回からの続き
前回ざっくりとしたOpenAMのインストール手順を記載しましたが、今回はOpenAMで認証を行う際のデータソースとなるデータベースをインストールする手順を記載します。

＜前回の記事＞
【仕事メモ】OpenAM (ver13) 超簡単インストール方法
https://qiita.com/Blue2012/items/df9a790a73b72dd3724c

##前提について
ちょっと軽く触れる程度にしますが、今回はOpenAMサーバとは別のサーバにOpenDJというLDAPデータベースのソフトウェアを導入して認証元となるデータソースを保存する構成とします。

前回の記事でも触れていなかったのですが、前回の記事にしてもAWS上のEC2インスタンスにサーバを構築しています。

##事前作業について
__§１．TigerVNCおよびGUNOMEDESKTOP関連のパッケージインストール
（※GUIでセットアップする人のみ）__

OpenDJはCUIでもGUIでもどちらでもインストールすることが出来るのですが、今回はGUIを使って導入する手順でいきます。※慣れている人は絶対CUIのほうが圧倒的に良いです。
EC2インスタンスでLinuxのAMIを使用してLaunchした場合、通常はGUIを使って起動することはできないですが、TigerVNCを導入することでGUIで接続することができます。

＜参考にした記事＞
CentOS7 VNC Server設定のメモ
https://qiita.com/takao_mofumofu/items/449b8b7bf8e58c7d4d35

詳細なインストール作業の順序は上記の記事を参考にされたほうが良いかと思いますが、本当にざっくりと作業の流れをお伝えしますと以下の流れになるかと思います。

```bash:インストールの流れ
１．yumを使ってtigervnc-serverをインストール
２．yumを使ってGNOME Desktop、XWindow関連パッケージを一式インストール
３．sytemdの起動モードをgraphical.targetにする
```
上記の流れを行って自端末にtiger-vncのクライアントソフトをインストールして、接続すれば、LinuxのEC2インスタンスにGUIで接続することが可能です。

__§２．OpenDJのGUIインストール__

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/7eb2b8d3-a1d7-1971-570e-975887ad2fda.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/593311a3-e7c7-8435-56da-94cf3295cef9.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/b1a9d3b4-1f7c-a1c1-c152-c219b70c9524.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/cf15869a-f4e1-8c2f-464c-8b11b09df2d1.png)


設定は以下、画面の項目を変更可能です。(Java Runtimeに関連するパラメータの初期値、最大値、他のパラメータの指定など)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/a6b1da77-fcc7-181c-516d-b25758ecfb46.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/ee293aa0-c8ce-142f-be56-1591431221f6.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/d1837335-1e50-469c-c54c-3cdb6feb8203.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/84c587c7-e54c-0aa5-c083-7b390cd44c2d.png)
tcpdump + mtail

長期戦のデバッグ用途で、変なパケットが来ていないかをモニタリングしたくなった。`tcpdump` と `mtail` で実装してみた。

ログファイルを書いて、それを `mtail` で監視するという一般的な構成に落ち着いた。

```text:tcpdump_logger.service
[Unit]
Description=tcpdump logger

[Service]
ExecStart=/bin/sh -c '/usr/sbin/tcpdump -i eth0 -tttt -n -l src net 192.168.0.0/16 | /usr/bin/rotatelogs -n 5 /var/log/tcpdump.out 5M'

[Install]
WantedBy=multi-user.target
```

```text:tcpdump_scraper.service
[Unit]
Description=tcpdump scraper

[Service]
ExecStart=/usr/local/bin/mtail -progs /usr/local/etc/mtail -logs /var/log/tcpdump.out -logtostderr

[Install]
WantedBy=multi-user.target
```

## mtail program

`tcpdump` の時刻表現は出力オプションによって変化する。`mtail` での共通処理になるのでデコレーターにまとめてみた。

```text
hidden gauge delta
counter packets_total by delta

def timef {
        # none
        ## 17:03:44.379393
        /^(?P<tm>\d{2}:\d{2}:\d{2}\.\d+) / {
                strptime($tm, "15:04:05.000000")
                next
        }
        # -tt
        ## 1533024241.471384
        /^(?P<tm>\d+)\.\d+ / {
                settime($tm + 0)
                next
        }
        # -ttt -ttttt
        ## 00:00:00.040176
        /^ (?P<h>\d{2}):(?P<m>\d{2}):(?P
\d{2}).(?P<x>\d{6}) / {
                delta = "" + (($h * 3600 + $m * 60 + $s) * 1000 + $x)
                next
        }
        # -tttt
        ## 2018-07-31 17:16:30.196173
        /^(?P<tm>\d{4}\-\d{2}\-\d{2} \d{2}:\d{2}:\d{2}\.\d{6}) / {
                strptime($tm, "2006-01-02 15:04:05.000000")
                next
        }
        # -t
        otherwise {
                next
        }
}

@timef {
        /$/ {
                packets_total[delta]++
        }
}
```

## 補足
tcpdump を log に書き出す部分は、unit ファイルを二つに分けて、間を systemd に結んでもらう方法もある。fifo をあらかじめ作って使ってもいいし、 socket activation を使ってもよさそう。ここでは簡単に済ませるために shell を呼び出してパイプで結んだ。

mtail も pipe で結べそうなものだけれども、実際にはできない。mtail を安定的に使おうとするなら、やはりファイルに書かざるを得なかった。

mtail のプログラムは実はかなり hacky なことをやっていて、`settime($tm + 0)` やら `delta = "" + ...` といった型変換のための小細工が入れてあります。このへんも本来は mtail 自身で吸収してほしかった…。

- `settime` の引数は整数でなければならない
- ラベルの部分には文字列しかとらない
Androidの自動UIテストで他アプリや設定ダイアログのボタンを押す

# 概要
Espressoの操作録画機能（Record Espresso Test）は便利ですが、残念ながら一部の操作は記録されないようです。
今回は、他のアプリや設定ダイアログのボタンを押す操作が記録されなくて困ったので、OKの文字列を探し出して押すコードで代用できないか調べました。
結果としては可能で、[UI Automator](https://developer.android.com/training/testing/ui-automator)の[UiDevice](https://developer.android.com/reference/android/support/test/uiautomator/UiDevice)を使います。

# 実装方法（例）
## build.gradle
```
dependencies {
    ・・・
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test.uiautomator:uiautomator-v18:2.1.3'
　　　　　　　　・・・
}
```
## テストコード
```
private static final int TIMEOUT = 5000;

// Initialize UiDevice instance (UI Automator)
UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

// Tap "OK" button
UiObject2 obj = device.wait(Until.findObject(By.text("OK")), TIMEOUT);
if (obj == null) {
    fail("OK button was not found.");
}
obj.click();
```

# 補足
以下調査中。もしわかる方いましたらコメント下さい。
- 言語が違う場合に対応する
【備忘録】gulp環境構築

自学でコーディングしたいときに、いつも「どうやるんだっけ、、」となって効率が悪いので備忘録としてまとめることにしました。

## 導入したいタスク
- sass
- es2015

## gulpfileをes2015で記述する
### babelをインストール
```
yarn add babel --dev
```
### package.jsonにpresetsを書く
```json

"babel": {
    "presets": [
      "env"
    ]
  }
```
あとは`gulpfile.babel.js`に設定をes2015でかける

## sass
### gulp.sassをインストール
```
yarn add gulp.sass --dev
```

### 設定
```js

gulp.task('sass', () => {
   gulp.src(['./src/**/*.scss', '!./src/**/_*.scss'])
       .pipe(plumber())
       .pipe(sourcemaps.init())
       .pipe(sass({outputStyle: 'compressed'}))
       .pipe(gulp.dest('./build'))
});
```

## babel
### gulp.babelをインストール
```
yarn add gulp-babel babel-core babel-preset-env --dev
```

### 設定
```js

gulp.task('babel', () => {
   gulp.src('./src/**/*.js')
       .pipe(plumber())
       .pipe(sourcemaps.init())
       .pipe(babel({
           presets: ['env']
       }))
       .pipe(gulp.dest('./build'))
});
```

### watchとdefaultの設定
```js

gulp.task('watch', ['sass', 'babel'], () => {
    gulp.watch('./src/**', ['sass', 'babel'])
});

gulp.task('default', ['watch']);
```
WindowsにUbuntuをインストールするのは気持ち良いゾイ!!~導入編~

## はじめに
Windowsさんさぁ…

**やっぱあんたプログラミングには向いてないわ**

端末であるpower-shellが不便な時点でお察しだよね…
いつまでもWindowsじゃやる気がしないんで、Ubuntuを入れますか!!

## でも、WindowsでもUbuntu使えたよね?
このように思われた人もいるはず。
確かに、Microsoft StoreにUbuntuのアプリ?はある。

でもねぇ…
**結局はwindowsなんですよ**

Dockerを使うには、Docker for Windowsを入れて、接続しないといけない、とかやってられんわ。
言うなればこのアプリはUbuntu風の端末を使えるといった具合。
自分の設定が甘かったのかもしれないけれど、

「これでUbuntu使えるやんけ!!」
→「駄目やんけ!!」

アカンこれじゃ(プログラミングができるまでに時間がかかりすぎて)死ぬぅ!!

じゃけん、OSをUbuntuに変えましょうね。

## USBの準備
まずは、Ubuntuを構成するファイルをインストールしないとね。
`ライブUSB`とか言うらしい。
この中にUbuntuのisoイメージを入れてbootの順番を変更すればUbuntuをインストールできる。
まぁ、その手順は後々。

このサイトを参考に進めていきますよー、イクイク。
[Linuxをインストールできる「ライブUSBメモリ」をWindowsで作成する方法【スクリーンショットつき解説】 | Linux Fan](https://linuxfan.info/make-linux-install-usb-on-windows)

最初に、Ubuntuの公式から最新のバージョンisoイメージをPCにダウンロードしましょう。
[Ubuntu Desktop 日本語 Remixのダウンロード | Ubuntu Japanese Team](https://www.ubuntulinux.jp/download/ja-remix)
![Screenshot from 2018-08-01 10-38-16.png](https://qiita-image-store.s3.amazonaws.com/0/218398/7cd9e924-98a5-40ac-e4b6-5ccdb5eabf5e.png)
(写真は2018/08/01現在)

色々と手順は必要だけど、これさえあればOSがインストールできる。
だから、数GBと容量もかなりある。
自分のPCが重いのもあるけれど、3時間くらいかかったかな。
なんかの作業中に進めておくことをオススメ。

できたら、`Rufus`というアプリケーションをダウンロード。
これは手元のUSBを、ライブUSBというOS導入機にしてくれるアプリケーション。

`Rufus`のダウンロードはこちらから。
[Rufus - 起動可能なUSBドライブを簡単に作成できます](https://rufus.akeo.ie/?locale=ja_JP)
![Screenshot from 2018-08-01 10-46-37.png](https://qiita-image-store.s3.amazonaws.com/0/218398/eca670cc-216e-35a1-95b6-94f386f28e29.png)

あとの作業は[参考記事](https://linuxfan.info/make-linux-install-usb-on-windows)通りに進めれば大丈夫。
バージョンの違いによって、色々と違いはあるけれど、そこは無視して大丈夫。
というか、デバイスとパーテーションだけ選べばOK。

以上でUSBの準備は終了。
次は、Ubuntuの導入!!

## Ubuntuのインストール
ライブUSBを用意できたら、PCから取り出して、一旦シャットダウン。
その後、ライブUSBを差し込んだPCを起動して、ログインする前に、`F2`か`F10`、または`Del`を押し続けるか連打して、BIOSを起動。
上の3つのキーでもできなかったら、ログインしてからでもできるので焦らないように。
1. `設定`
2. `更新とセキュリティ`
3. `回復`
4. `PCの再起動をカスタマイズする`の`今すぐ再起動する`
5. 再起動して、`オプションの選択`が表示されたら、`トラブルシューティング`を選択
6. `詳細オプション`
7. `UEFIファームウェア`の設定
これでBIOSかUEFIが表示されるはず。

BIOS画面になったら、`Boot`タブに`USB`が表示されているはず。
なかったら、`1st boot`や`Boot Option #1`に矢印キーで移動して、`Enter`。
そしたら、`USB`っていう選択肢がある。
見つけたら、それをEnter!!
その後、真っ黒な`GNU GRUB`画面になって、`Install Ubuntu`という選択肢が表示される。
それを`Enter`で、Ubuntuの導入開始ィィィィィー!!

## Ubuntuの初期設定
ここまでくれば、あとは表示された選択肢の中から自分が好きな設定を選べば大丈夫。
どんな設定があるか気になる人は、次の参考記事を見てみては。
[Ubuntu 18.04 LTSインストールガイド【スクリーンショットつき解説】 | Linux Fan](https://linuxfan.info/ubuntu-18-04-install-guide)

## 次の記事
俺好みの開発環境にしてイクゾー!(ﾃﾞｯﾃﾞｯﾃﾞﾃﾞﾃﾞﾃﾞ!(ｶｰﾝ))
[WindowsにUbuntuをインストールするのは気持ち良いゾイ!!~Ubuntuの設定編~](https://qiita.com/kaitaku/items/37daec30ad747e58b253)
memo:マニュアルでpipを9.0.1から10.0にあげる方法

# Upgrae pip from 9.x manually 
TLS1.0がdeprecatedになったから、pipからupgradeできなくなりました。なのでマニュアルでpipのバージョンをあげないと

as TLS error comes out, we cannot upgrade pip use pip install, workaround is needed
# Step1

```sh
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py  
```
# Step2

```sh
python get-pip.py pip==10.0 
```
Mac での SSH Keys の作成と Keychain にパスフレーズを覚えさせる


## SSH キーペアの作成

```shell-session
$ ssh-keygen -t rsa -b 4096 -C "メールアドレス"
```

`Enter passphrase ...` とパスフレーズを聞かれたら設定をする。

## Keychain にパスフレーズを覚えさせる

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

```sh
AddKeysToAgent yes
UseKeychain yes
```

こうすると次からパスフレーズを入れなくて済む。
PostgreSQL9.x  外部ホストからの接続設定

PostgreSQLは、デフォルトでは自ホスト内の接続しか許可されていません。
JDBC等で他のホストからアクセスする際の接続設定をまとめます。実行環境は次の通りです。

・CentOS 7.5 
・PostgreSQL 9.2.23

#<b>postgresq.confファイルの修正</b>
デフォルトで、localhostからの接続しかListenしていない為、下記を設定

```
# vi /var/lib/pgsql/data/postgresql.conf
listen_addresses = '*'   (#を外し、'localhost' から'*'に変更)
port = 5432　　　　　　　　(#を外す）
```
※listen_addressesにアドレス範囲は指定出来ず、pg_hba.confファイルで指定する

Firewallの設定

```
# firewall-cmd --add-port=5432/tcp --zone=public --permanent
# systemctl restart firewalld
```

#<b>pg_hba.confファイルの修正</b>
・pg_hba.conf：対象DBへの該当DBユーザの接続元と認証方式を指定

接続を許可するクライアントのアドレスと認証方式を追記する
例）クライアントは10.44.59.0/24でmd5（暗号化パスワード）認証

```
# vi /var/lib/pgsql/data/pg_hba.conf
host    all     all      10.44.59.0/24  md5
```

サービス再起動

```
# systemctl restart postgresql
```
CakePHP3.6でいつの間にか TableRegistry::get()が非推奨になっていた

## 概要
タイトルのまんまです。

3.5 までは日常的に使用されていた
`TableRegistry::get()` が `deprecated` になっていました。


## 代替えコード

[3.6移行ガイド](https://book.cakephp.org/3.next/ja/appendices/3-6-migration-guide.html)

移行ガイドによると
`Cake\ORM\TableRegistry` の static な API は非推奨となったらしいです。

代わりに `Cake\ORM\TableRegistry::getTableLocator()` か `Cake\ORM\Locator\LocatorAwareTrait` を介して使用するんだよと。


ただ、Controllerにて使用する場合には、Controller の基底クラスにて上記 Trait が use されているので、実際には

```php:SampleController.php

$table = $this->getTableLocator()->get('ModelName');
$entity = $table->newEntity();
```

 といった風に使用できるようです。
IBM Cloud で Block / File Storage として使える Endurance / Performance Storage の違い


# 機能概要

こちらを参考にしてください。
[Getting started with Block Storage](https://console.bluemix.net/docs/infrastructure/BlockStorage/index.html#getting-started-with-block-storage)
[Getting Started with File Storage](https://console.bluemix.net/docs/infrastructure/FileStorage/index.html#getting-started-with-file-storage)

![Kobito.H6nLnq.png](https://qiita-image-store.s3.amazonaws.com/0/101361/64e298d8-7ddb-0ab2-b7bb-e8d15a399748.png "Kobito.H6nLnq.png")


# 選べる性能・容量

Endurance Storage と Performance Storage のそれぞれで指定可能な性能・容量になります。

![Kobito.G0ourv.png](https://qiita-image-store.s3.amazonaws.com/0/101361/24a2bc00-6a9e-ed67-35ac-b28386cf2eb5.png "Kobito.G0ourv.png")

0〜500 GB の範囲の拡大版をのせておきます。

![Kobito.vFD9Yi.png](https://qiita-image-store.s3.amazonaws.com/0/101361/cfd6ef93-6be4-c212-7861-9cb25fb259b6.png "Kobito.vFD9Yi.png")

>Performance Storage で指定可能な IOPS 値（詳細）
![Kobito.OdOLUh.png](https://qiita-image-store.s3.amazonaws.com/0/101361/1a01d6c1-bd9f-a9b5-7d22-9eb03f774d95.png "Kobito.OdOLUh.png")


# コストと性能

容量を一定値(3600 GB)で固定した際のコストと性能について、みてみます。
グラフにしてみるとわかりますが、

- 同じ性能(IOPS) であれば、Endurance Storage の方が低価格
- 同じ容量でも、性能(IOPS)を下げられるのであれば、Performance Storage の方が低価格にできる場合がある

![Kobito.9mxlL8.png](https://qiita-image-store.s3.amazonaws.com/0/101361/bdba6750-050f-1466-88dd-88de1e39169a.png "Kobito.9mxlL8.png")

>コストはこちらの月額費用を参考にしています。
[使いやすいブロック・ストレージ | IBM Cloud](https://www.ibm.com/cloud-computing/bluemix/ja/block-storage)
![Kobito.jtstFt.png](https://qiita-image-store.s3.amazonaws.com/0/101361/ad7efaed-336c-0795-379f-6e42dbf16ca9.png "Kobito.jtstFt.png")
![Kobito.2ugquR.png](https://qiita-image-store.s3.amazonaws.com/0/101361/4e7bd05c-26f2-985d-c946-d1334e58d418.png "Kobito.2ugquR.png")
SolidityのimportでIdentifier already declaredと言われる原因とその対処法

Solidityで複数ファイルに分けたコントラクトをimportするとき、
`DeclarationError: Identifier already declared`
と言われてcompileに失敗することがある。
一方で、失敗しないときもある。その違いを探す。

## 1. 失敗しないとき

```:ContractA.sol
pragma solidity ^0.4.23;

import "../node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol";

contract ContractA is Ownable {
    constructor () public {
        owner = msg.sender;
    }
}
```

```:ContractB.sol
pragma solidity ^0.4.23;

import "./ContractA.sol";
import "../node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol";

contract ContractB is Ownable {
    ContractA contractA;
    constructor (ContractA _aAddress) public {
        owner = msg.sender;
        contractA = _aAddress;
    }
}
```

## 2. 失敗するとき

```:ContractA.sol
pragma solidity ^0.4.23;

import "../node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol";

contract ContractA is Ownable {
    constructor () public {
        owner = msg.sender;
    }
}
```

```:ContractB.sol
pragma solidity ^0.4.23;

import "./ContractA.sol";
import "../node_modules/openzeppelin-zos/contracts/ownership/Ownable.sol";

contract ContractB is Ownable {
    ContractA contractA;
    constructor (ContractA _aAddress) public {
        owner = msg.sender;
        contractA = _aAddress;
    }
}
```

```:エラー内容
DeclarationError: Identifier already declared.
import "../node_modules/openzeppelin-zos/contracts/ownership/Ownable.sol";
^------------------------------------------------------------------------^
```

## 3. 原因
間違い探しみたいになってしまったが、1では全く同じOwnableをimportしている。
つまり、**同じコントラクトを複数回importしてもエラーにはならない**。
一方2では、ContractAでzeppelin-solidityのOwnableを、ContractBでzeppelin-zosのOwnableをimportしている。
これは**同じ名前の別のコントラクトを実装していることになり`DeclarationError: Identifier already declared.`が引き起こされる**。
このように自分でimportを書いている場合、このエラーに気づかないことはあまりないかもしれないが、ライブラリの内部的にimportが行われている場合には、気づくのが難しかったりする。特に、細かいversionの違いが厄介なことがある。

## 4. 対処法
- 同じパッケージを使うように注意する
- `import {必要なもの} from ファイル名`の構文を使って、なるべく不要なものはimportしないようにする。

例えば、2を以下のように変更するとエラーにならない。

```:ContractA.sol
pragma solidity ^0.4.23;

import "../node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol";

contract ContractA is Ownable {
    constructor () public {
        owner = msg.sender;
    }
}
```

```:ContractB.sol
pragma solidity ^0.4.23;

import {ContractA} from "./ContractA.sol";
import "../node_modules/openzeppelin-zos/contracts/ownership/Ownable.sol";

contract ContractB is Ownable {
    ContractA contractA;
    constructor (ContractA _aAddress) public {
        owner = msg.sender;
        contractA = _aAddress;
    }
}
```
[Python2.7] input()でNameError

# 入力した文字列は定義されていない!?
pythonで`filename = input('ファイル名を入力してください。: ')`と書いて実行すると以下のエラーが出ました:confused:

```
Traceback (most recent call last):
  File "javascript_kindle.py", line 3, in <module>
    filename = input("ファイル名を入力してください。: ")
  File "<string>", line 1, in <module>
NameError: name '_script' is not defined
```
エラー該当のコードはこれです。

```python:javascript_kindle.py
filename = input("ファイル名を入力してください。: ")
```

:see_no_evil:`NameError: name '_script' is not defined`:see_no_evil:
定義されていない。。。? いやそれはそうでしょう。inputで定義してfilenameに代入したんだからおとなしくfilenameに入ってくださいな:two_women_holding_hands:

input()の書き方がおかしいのかと思いましたが、合ってる。しかしエラーが出ている。。。
google検索すると[CODE Q&A](https://code.i-harness.com/ja/q/1424dec)がヒットしました。
曰く、
> Python 3ではなく、Python 2を実行しています。これをPython 2で動作させるには、 `raw_input`使用し`raw_input` 。

原文ママなので日本語がおかしいですが、要するに
:guardsman:あなたのPythonはバージョン2だから`input()`ではなく`raw_input()` を使いなさい:guardsman:
ということらしいので`input()`を`raw_input()`に修正して無事エラーを治せました。
よかった:sparkling_heart:
C++ セマフォ waitとpost

forkを使ってひとつのプログラム上でやりたい人はこっち
↓
[C++ forkを使ったセマフォのサンプルコード](https://qiita.com/yusk24/items/dce15a989f2ddb810eb8)

## はじめに
ここでやることは、共有メモリにセマフォを置いて
それをwaitするプログラムとpostするプログラムを実行すること

## wait
セマフォが0以上の場合は、セマフォの値を一つ減らす。
この時、使い終わったらpostする。

しかし今回はタスクという意味でwaitとpostを使っているので
postからwaitにタスクが振られてタスクを消化して終わりなのでpostはしない。

今回は、セマフォの値を0からスタートさせているためはじめからwaitする。
そして他のプロセスからpostされたらwait以降が走りだす。

```c++:sem_wait.cpp
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/stat.h>

#define NAME "/test"

// 開放
void my_free(sem_t *sem){
    // semaphore解放
    sem_destroy( sem );

    // 共有メモリ開放
    shm_unlink(NAME);
}

int main()
{
    int p_id;
    int status;
    int return_code = 0;
    int i;

    int fd;
    void *ptr;
    struct stat stat;

    // 共有メモリ作成
    fd = shm_open(NAME, O_CREAT | O_RDWR, 0666);
    ftruncate(fd, 1024);

    // 共有メモリをポインタに割り当てる
    ptr = mmap(NULL, stat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    
    // ポインタのアドレスをsemに割り当てる
    sem_t *sem = (sem_t*)ptr;

    // sempahoreの初期化:プロセス間を可能でsemの値0から
    if (sem_init( sem, 1, 0 ) < 0) {
        perror("init");
        my_free(sem);
        exit(EXIT_FAILURE);
    }

    cout << "wait..." << endl;
    if(sem_wait(sem) < 0){ // waitする
        perror("wait");
        my_free(sem);
        exit(EXIT_FAILURE);
    }
    cout << "end" << endl;

    my_free(sem);
    return return_code;
}
```
## post
指定したセマフォの値をプラス1する。
今回は、waitで待っているプロセスに対してセマフォの値をプラス1することで動かすため。

```c++:sem_post.cpp
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/stat.h>

#define NAME "/test"

// 開放
void my_free(sem_t *sem){
    // semaphore解放
    sem_destroy( sem );

    // 共有メモリ開放
    shm_unlink(NAME);
}

int main()
{
    int p_id;
    int status;
    int return_code = 0;
    int i;

    int fd;
    void *ptr;
    struct stat stat;

    // 共有メモリ作成
    fd = shm_open(NAME, O_RDWR, 0666);
    ftruncate(fd, 1024);

    // 共有メモリをポインタに割り当てる
    ptr = mmap(NULL, stat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    
    // ポインタのアドレスをsemに割り当てる
    sem_t *sem = (sem_t*)ptr;

    cout << "post " << endl;
    if (sem_post(sem) < 0) { // postする
        perror("post");
        my_free(sem);
        exit(EXIT_FAILURE);
    }
    cout << "post done." << endl;

    return 0;
}
```

## 実行結果
コンパイル
`❯ g++ sem_post.cpp -pthread -lrt -o p.o`
`❯ g++ sem_wait.cpp -pthread -lrt -o w.o`

wait側の実行

```zsh
❯ ./w.o
wait... 
```
post側の実行

```zsh
❯ ./p.o       
post 
post done.
```
waitが動き出す

```zsh
❯ ./w.o
wait... 
end
```
ウェブスクレイピング（英: Web scraping）をやってみるの巻

#目的
市場調査のため、Web 検索する機会が増えて、自動化したくなった

#目標
まずは、ウェブスクレイピングができる環境を準備しよう
下のサイトを参考に動かすところまで実施する
https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406

今回は、Ubuntu 18 ベースで行う

#効果
Web スクレイピング環境の構築
サンプルコードから、スクレイピングの理解

#作業
下に自動化のスクリプトをアップしました。
https://github.com/HaHatake/Web-scraping/blob/master/beautifulsoup4setup.sh

まずは、apt の更新とcurl の導入
`apt update`
`apt -y install curl`

自動化スクリプトの導入
`curl -LO https://raw.githubusercontent.com/HaHatake/Web-scraping/master/beautifulsoup4setup.sh`

下のように出力されれば完了
> 22,660.36 (ここは、日によって変わりますが、数字が出力できればコードは正常に可動しています)
> script end of job

#自分好みに変えてみる
`vi getNikeiHeikin.py`

8行目付近のURL へ好みのサイトを入れる
# アクセスするURL
`url = "http://www.nikkei.com/markets/kabu/"`

まずは、他のサイトでどのような出力になるか試してみよう。
その後は、そのページから好きな情報を取得できるように改造してみよう。
Pythonのバージョンを確認しようとしたらよくわからん文字列が一気に出力された

# 実行環境
- Cloud9
- Python 2.7.6

# 「python -v」でバージョン確認しようとしたら色々文字が出てきた
。。。バージョンは出てこず:dizzy_face: 以下のような文字の羅列が:computer:
何でしょうか。何かインストールしているのでしょうか:alien:
![pyv.png](https://qiita-image-store.s3.amazonaws.com/0/171266/93be7191-4155-7e53-4417-7339a910825a.png)

最終的には`>>>`と出てきましたorz いつもの`yukiya025:~/workspace $ ` じゃない:trollface:
データベースでしょうか、[Rails Tutorial](https://railstutorial.jp/) で`>>>`は出てきたような気がするのですが、如何せんこれを何というのかわからなかった私はとりあえずこのモードを出るべく「q (quit)」と入力しEnterキーを押しました。
![q.png](https://qiita-image-store.s3.amazonaws.com/0/171266/8007d624-7d13-f081-7f5f-62f957fc0575.png)

違ったみたいです:see_no_evil:
ならばと私の超初心者的語彙力から伝家の宝刀「exit」(もうこれしか心当たりなし:joy_cat:) を入力すると「出るんだったらexit()かCtrl+Dを使ってね!」と教えてもらえたので、Ctrl+Dで脱出。
![exit.png](https://qiita-image-store.s3.amazonaws.com/0/171266/6a12c6ce-bc68-de10-49ac-496021c55ea7.png)

Ctrl+Dを押すと何かを続々とクリアし。。。
![clear.png](https://qiita-image-store.s3.amazonaws.com/0/171266/d7c35b01-d621-a7bb-1ecd-95a9be65a819.png)

いつもの`yukiya025:~/workspace $ `に戻れました:relaxed: あーよかった:sparkles:
それにしてもさっきまでの入力モードは何というのでしょうか。。。:frowning:
![returned.png](https://qiita-image-store.s3.amazonaws.com/0/171266/e7a38572-6264-470f-bf14-13537ec8d1a6.png)

ちなみに本来の目的であったPythonのバージョン確認は`$ python --version`で確認できました:clap::clap::clap: 2.7.6だそうです。
![276.png](https://qiita-image-store.s3.amazonaws.com/0/171266/dcabb4dd-1b28-5772-5496-ed4f7d5bf70d.png)
Pythonの[[0]*4]*4の罠

罠にはまったのでメモしておく。
簡単に言えば、Pythonの`[0] * 4`は浅いコピーになるのでリストなどをコピーして生成すると死ぬ。
リストでやるとどうなるかというと、以下のようになる。

```python
>>> l = [[0]*4]*4
>>> l[0][0] = 1
>>> print(l)
[[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
```
要素のリストの最初の値が全部書き換えられているのが確認できる。

気を付けよう。

# 代替案
とりあえず内包表記でやるのが一番シンプルだろうか？

```python
l = [[0 for i in range(4)] for j in range(4)]
```
これなら問題なく値の更新ができる。少し長くなるけど。


forを使うなら以下のようになる。

```python
l = []
for i in range(4):
    l.append([0] * 4)
```
リストの中身が数値なら浅いコピーにならないので、内側のリストの生成には`[0]*4`が使える。

0で初期化する場合はどちらとも同じくらいの速さでリストを生成できた。
インデックスから値を生成するようにした場合だとリスト内包表記の方が速い。

基本的にはリスト内包表記を使うようにすれば問題ないと思う。
標準関数にありそうだけど見つからない。
PHPのオブジェクト指向



PHPの学習を進めていて、オブジェクト指向というものに直面しました。
あっ、これはJAVAでもあった概念だと気が付きました。

#クラス
クラスにはプロパティと呼ばれる変数と、メソッドといわれる関数が存在します。
私はクラスは指令室のようなものだと思っています。
例えば、モンスターA：強さ４０、モンスターB：強さ５０といったものを操ることができ、それぞれのモンスターにメソッドで「攻撃」や「防御」といったことをさせることができるという考えです。
インスタンスが以下でいうMonster Aになります。インスタンスはクラスで定義したものを引き継いだものです。

```php
Class Monster{

public $name
public $strength

} 

//ここでインスタンスを作成します。
$A = new monster;

$A->name = “Monster A”

echo $A->name
```

## constructorとメソッド
これはインスタンスが作成されるときに実行されるメソッド関数になります。
これで名前が生成されます。

```php
Public function_construct($name){
$this->name = $name;
}
```
ついでに他のメソッドも見てみます。

```php
public function Attack(){
echo "$this->name is about to attack the opponent";
}
$A = new Monster("Monster A");
echo $A->name;
$A->Attack();
```
といった攻撃メソッドを作成しました。
これでMonster Aに攻撃をさせることができます。
インスタンス（＝モンスター）さえ複数作れば、この攻撃コマンドは共有できますよね。

###最後に
引き続きPHPを勉強していきます。
Docker— docker run -it の -t を抜くとどうなるか ( tty 指定なしの interactive モード )

普通は `--tty` と `--interactive` を両方指定して docker コンテナに「入る」と思うが、 `--tty` を使わないとどうなるのかを試してみる。


## そもそも tty とは何なのか

```
$ docker run --help | grep tty
  -t, --tty                            Allocate a pseudo-TTY
```

分かりそうで分からない

- [Pseudoterminal - Wikipedia](https://en.wikipedia.org/wiki/Pseudoterminal)
- [ttyとかptsとかについて確認してみる - Qiita](https://qiita.com/toshihirock/items/22de12f99b5c40365369)

## 実験

```
docker run --interactive alpine
```

### プロンプトマーク

まずはプロンプトのマークがないことに気付く。 ( e.g `#` `$`  )

何も起きておらず、画面が固まっているように見えるが、実は「何も出力されてこない」だけで、dockerコンテナの操作モードには入れている。

### 上下左右のキーがうまく使えないことに気付く。

```
^[[C^[[C^[[C
/bin/sh:    : not found
```

空のコマンドが実行されようとしているように見えるが、たぶんコントロール文字がコマンドとして解釈されようとしている。

## コマンドは打てる

### echo

```
echo Alice
Alice
echo Bob
Bob
```

### ls

```
ls var/lib

apk
misc
udhcpd
```

### exit

```
exit
```

## まとめ

tty = 標準入出力となっている端末デバイス を指定しなくてもコマンドは打てるが、端末をうまく操作できなくなる。

## 環境

- Docker version 18.06.0-ce, build 0ffa825
- Mac OS X High Sierra

## リンク

- [Docker —Using docker run with interactive mode but without tty ( What happens? )](https://gist.github.com/YumaInaura/aacc80bda81a35306ef2dad2469fe1bb)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
MSX 16進変換サンプル (2)

```tohex2.asm
; z88dk / WebMSX
; z80asm -b -l tohex2.asm
; appmake +msx -b tohex2.bin --org 0xd000 --fmsx

chget   equ     $009f
chput   equ     $00a2

        org     $d000
table:
        defm    "000102030405060708090a0b0c0d0e0f"
        defm    "101112131415161718191a1b1c1d1e1f"
        defm    "202122232425262728292a2b2c2d2e2f"
        defm    "303132333435363738393a3b3c3d3e3f"
        defm    "404142434445464748494a4b4c4d4e4f"
        defm    "505152535455565758595a5b5c5d5e5f"
        defm    "606162636465666768696a6b6c6d6e6f"
        defm    "707172737475767778797a7b7c7d7e7f"
        defm    "808182838485868788898a8b8c8d8e8f"
        defm    "909192939495969798999a9b9c9d9e9f"
        defm    "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf"
        defm    "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf"
        defm    "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf"
        defm    "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf"
        defm    "e0e1e2e3e4e5e6e7e8e9eaebecedeeef"
        defm    "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"
start:
        call    chget
        ld      de, buf
        call    tohex
        ld      hl, buf
        call    puts
        jr      start

puts:
        ld      a, (hl)
        or      a
        ret     z
        call    chput
        inc     hl
        jr      puts

tohex:
        add     a, a
        ld      l, a
        ld      h, $d0
        jr      nc, j1
        inc     h
.j1
        ldi
        ld      a, (hl)
        ld      (de), a
        ret

buf:    defm    "xx ", 0
```

`tohex2.cas`の$24-5の実行アドレスをバイナリエディタなどで書き換える。