OmniAICreator/Qiita-1.07M huggingface dataset:
Sewa Mobil Jogja

Dapatkan harga promo murah <a href="https://avilorentcar.com/rental-mobil-jogja/">sewa mobil Jogja</a> hanya di CV. AVILO Transport "Yogyakarta Tour &amp; Travel". Mobil yang kami sediakan siap untuk memenuhi kebutuhan transportasi anda saat di Jogja antara lain untuk kegiatan Dinas, Bisnis, Event, Wisuda, Wisata &amp; Lainnya. Dengan menggunakan armada dan sopir yang sudah berpengalaman terbaru tentunya akan membuat anda nyaman dalam bekendara. Mobil yang kami sediakan antara lain: <a href="https://avilorentcar.com/sewa-avanza-jogja/">Sewa Avanza Jogja</a>, Sewa Grand Innova, Sewa Innova Reborn, Sewa Isuzu ELF Short &amp; Long, <a href="https://avilorentcar.com/sewa-hiace-jogja/">Sewa HiAce Jogja</a>, Sewa Camry Jogja, Sewa Fortuner &amp; <a href="https://avilorentcar.com/sewa-alphard-jogja/">Sewa Alphard Jogja</a>. Jika anda membutuhkan <a href="https://avilorentcar.com/paket-wisata-jogja/">Paket Wisata Jogja</a> dengan harga yang murah? Silahkan hubungi kami sekarang! Dapatkan penawaran harga terbaik dari kami.
読んだ・読む論文の一覧をみたい できるだけ楽に

<img width="1173" src="https://user-images.githubusercontent.com/5164000/117146751-7ebc7100-adef-11eb-9561-e84a73de6be5.gif">



## TL; DR
https://github.com/himkt/interest を作った．
https://himkt.github.io/interest にデモがあります．

(追記あり; 2019/01/17)

---

## はじめに

読んだ論文のリスト，どのように管理しているでしょうか？
僕は以下のようなことをやったりやらなかったりしていました．

- Mendeley にPDFを保存
- iCloud or Google Drive に PDF をとりあえず放り投げる
- ツイッターに投稿

しかし，どれも微妙に問題をはらんでいます．
僕にとっての問題は以下のような感じです．

- Mendeley
  - なんかよく同期に失敗したっていわれる
  - メモを残すのがたいへん
  - スマホで見るのはややつらい
  - 検索の UI がなんか壊れてない...？

- iCloud or Google Drive
  - 検索がつらい（ファイル名にいろいろな情報を詰め込みたくない）

- ツイッター
  - 自分の関係ないツイートが邪魔
  - 知らないうちにツイッターで遊んでてダメ

もうすこし楽に論文リストを見たい，
条件で絞って論文を探したい という気持ちになります．

自分がほしい機能をまとめてみると，以下のようなものがあげられました．

- 検索がいい感じにできてほしい
- どの環境（PC・タブレット・スマホ）でもそれなりにきれいに見えてほしい
- リストの追加・削除にコストをかけたくない（同期とか楽なのがいい）

この要求をもとに， Google Spreadsheet + Web アプリで論文を管理してみるという試みをしてみることにしました．
結果として， https://himkt.github.io/interest/ のようなアプリができました．

(a) 論文のメモは Google Docs Sheets でつくる
(b) 論文一覧を表示するのは Webアプリ (React.jsを使ってみた) が担当

という構成になっています．

### スプレッドシートを作る

まずは Google Docs Sheets でスプレッドシートを作成します．
https://docs.google.com/spreadsheets/ で作成できます．

スプレッドシートの各行は以下のようなカラムを含んだデータです．
<img width="1557" alt="スクリーンショット 2019-01-12 23.49.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/85741/d0a65e01-0fe9-63fc-9c77-caff44ed7db7.png">


最後のカラム (misc) はダミーカラムです．


（現在一番右のカラムのデータが正しく取得できないために存在します．そのうち直す．．．）

（追記 2019/01/14: 直しました． misc のフィールドは必要なくなりました．）


つぎに，このスプレッドシートを Web アプリから参照可能にします．
`File -> Publish to the web` を選択します．
<img width="303" alt="スクリーンショット 2019-01-12 23.53.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/85741/1c48eb09-0325-0759-dcad-283af9c93edd.png">

`Automatically republish when changes are made` にチェックを付けて `Start publishing` をクリックします．
<img width="481" alt="スクリーンショット 2019-01-12 23.55.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/85741/8321dffd-3243-2a77-677f-bdd5b122ac2f.png">

`https://docs.google.com/spreadsheets/d/e/XXXXXXX/pubhtml` のような URL が表示されます，これをコピーして
`https://docs.google.com/spreadsheets/d/XXXXXXX/pub?gid=0&single=true&output=tsv` という形式の URL に変換して控えておいてください．

これで準備は完了です．

### Web アプリ
https://github.com/himkt/interest をクローンします．
先程公開したスプレッドシートの URL を https://github.com/himkt/interest/blob/master/src/index.js#L6 に書きます．
`npm install` で依存ライブラリをインストールします．
`npm start` をしてみてください．論文の一覧が表示されれば成功です．

また， https://qiita.com/yuitnnn/items/11375ea29ec023d19fdf を参考に `npm run deploy` で GitHub pages にアプリがデプロイするタスクを追加しました．
自分の GitHub pages にデプロイを行いたい場合は， https://github.com/himkt/interest/blob/master/package.json#L5 を修正して自分のリポジトリの URL を指定してください．


### まとめ・課題
PC・タブレット・スマホでそれなりにきれいに論文の一覧をみたり検索したりできるツールを作りました．
論文の情報はスプレッドシートで管理していて，わりと楽に追加・修正が可能です．
https://github.com/himkt/interest にアプリがあるので，よろしければご活用ください．

論文のメモは GitHub の Issue に投稿，リンクをスプレッドシートに張るという形で管理するのが楽かなと思っています．
もっと楽でいい感じな方法があったら知りたい．．．

課題として，BibTexエクスポートは依然としてMendeleyに頼っています．
この部分もなんかいい感じにしたい．

#### 追記 (2019/01/17)
試験的に BibTex 生成に対応しました．

<img width="1133" alt="スクリーンショット 2019-01-17 1.04.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/85741/2137a08a-5bee-932f-c5fc-62f8689aa153.png">
MailhogAPIのレスポンスをデコードする

MailHogはメールのテストをするときに便利ですが、APIのレスポンスがMIMEエンコードされており読めないのが玉に瑕です。
色々試行錯誤したのですが、Nodemailerのモジュール、[Mailparser](https://nodemailer.com/extras/mailparser/)を使うのが手っ取り早そうだったので紹介します。

## 環境

- Ubuntu 18.04
- NodeJS 10.14.2

## 手順

NodeJSでMailhogを扱うための[mailhog-node](https://github.com/blueimp/mailhog-node)と、メールをデコードするためのMailparserをインストールします。

```bash

$ npm install --save-dev mailhog mailparser
```

次に、Mailhogからメールを取得し、レスポンス中の `Raw.Data` をMailparserでパースします。

```js
const mailhog = require('mailhog')({apiUrl: 'http://localhost:8025'})
const { simpleParser } = require("mailparser");

const mailTo = 'foo@example.com'
const mails = await mailhog.search(mailTo, 'to')

const parsedMails = []
let parsed = ''
for (let mail of mails) {
  parsed =  await simpleParser(item.Raw.Data)
  parsedMails.push(parsed)
}

```

パース結果は https://nodemailer.com/extras/mailparser/#mail-object などを参考にしてください。
【gnuplot超入門】基本コマンド

#**はじめに**
計算物理の分野では求めた関数をグラフとしてプロットしり、集めたデータをファイルから出力しプロットしたかったりします。
ここでは、その際利用するツールの一つである`gnuplot`に関して、初歩的なコマンドをまとめておきます。

#**インストール**
gnuplotをまずはインストールしましょう。
macOSでのインストールに関しては下記の記事がとても参考になります。
[gnuplotをHomebrewからインストールするときの手順](https://qiita.com/noanoa07/items/a20dccff0902947d3e0c)

#**起動**
Gnuplotは`gnuplot`コマンドで起動することができます。

```
$ gnuplot

	G N U P L O T
	Version 5.2 patchlevel 6    last modified 2019-01-01

	Copyright (C) 1986-1993, 1998, 2004, 2007-2018
	Thomas Williams, Colin Kelley and many others

	gnuplot home:     http://www.gnuplot.info
	faq, bugs, etc:   type "help FAQ"
	immediate help:   type "help"  (plot window: hit 'h')

Terminal type is now 'aqua'
gnuplot>
```

#**基本コマンド**
###**関数をプロット(２次元)**
関数をプロットするには、`plot`コマンドを利用します。省略形`pl`でも構いません。
変数**x**を利用することができます。

```
gnuplot> plot sin(x)
```

一気に複数の関数をプロットすることもできます。

```
gnuplot> plot sin(x), x, cos(x)
```

###**関数をプロット(３次元)**
３次元グラフをプロットするには、`plot`関数ではなく、`splot`関数を利用します。
変数**x**に加えて、変数**y**を利用することができるようになります。

```
gnuplot> splot x**2 + y**2
```

###**関数を再プロット**
はじめにプロットした関数と、別の関数を同時に表示させるためには、`replot`関数を利用します。
省略形の`repl`でも構いません。

```
gnuplot> replot cos(x)
```


###**グラフをクリアにする**
`clear`コマンドを利用することによって、グラフが表示されるウィンドウ（AquaTermなどのツールにより開かれるウィンドウ）をクリアにすることができます。
つまり、再度グラフを構築することが可能になります。

```
gnuplot> clear
```
###**オプションを設定する**
オプションを設定するには`set`コマンドを利用します。

```
gnuplot> set [オプション]
```

###**設定の読み込み**
上記`set`コマンドなどで追加した設定（例：領域や見た目の変更など）を現在のグラフに適用するには、`replot`コマンドを使用します(`repl`でも構いません)。

```
gnuplot> replot
```

先ほどの`set`コマンドを利用して次に各種設定の方法を記載しておきます。

###**表示領域の変更**
`plot`コマンドでは、標準では、横軸は[-10, 10]、縦軸はグラフがうまく収まるように自動的に設定されます。
ただし、表示領域を変更したい場合もあると思います。そんな時は次のコマンドで変更することができます。

####**x軸の範囲**
```
gnuplot> set xrange[2:9]
gnuplot> replot
```
`xrange`は`xr`と省略することができます。

####**y軸の範囲**
```
gnuplot> set yrange[-2:2]
gnuplot> replot
```
`yrange`は`yr`と省略することができます。

####**z軸の範囲**
```
gnuplot> set zrange[-5:5]
gnuplot> replot
```
`zrange`は`zr`と省略することができます。


###**x(,y(,z))軸の範囲を設定**
`plot`する段階で範囲を設定する場合、x、y、z軸の範囲をまとめて設定することができます。
- ２次元
`plot [ x 軸の左端値:x 軸の右端値] [ y 軸の下端値:y 軸の上端値] 式`
- ３次元
`splot [ x 軸の左端値:x 軸の右端値] [ y 軸の前端値:y 軸の奥端値] [ z 軸の下端値:z 軸の上端値] 式`

```
gnuplot> plot [-9:9] [-2:2] sin(x)
```
**指定する必要のない軸に関しては`[]`範囲を空にします**。
また、**下端、上端を省略することも可能**です。

```
gnuplot> splot [] [] [:0.5] sin(x)*cos(y)
```

###**タイトルを設定**
```
gnuplot> set title "title fuga"
```

###**ラベルの設定**
```
gnuplot> set xlabel 'x hoge'
gnuplot> set ylabel 'y hoge'
gnuplot> replot
```

###**設定のリセット**
```
gnuplot> reset
gnuplot> replot
```


#**おわりに**
関数を視覚的に理解しておくことは、様々な物理現象を読み解く際に大いに役に立ちます。ですので、関数をより身近なものにして諸現象への理解を深めていこうと思います。
『機械学習のエッセンス(http://isbn.sbcr.jp/93965/)』のPythonサンプルをJuliaで書き換えてみる。（第04章04疎行列）

# はじめに

[『機械学習のエッセンス(http://isbn.sbcr.jp/93965/)』のPythonサンプルをJuliaで書き換えてみる。（第04章03配列の基本計算）](https://qiita.com/yshutaro/items/01da8826324027b4aa6b)の続きです。

## 疎行列の操作

Juliaには`Sparse Arrays`モジュールというのがあるようです。
https://docs.julialang.org/en/v1/stdlib/SparseArrays/index.html

+ JuliaはIndexが1からなので、配列の番号はすべて本よりプラス1しています。行列の番号と同じになるので場合によってはわかりやすいですね。

```julia
julia> using SparseArrays

julia> a = spzeros(4, 5)
4×5 SparseMatrixCSC{Float64,Int64} with 0 stored entries

julia> a[1, 2]
0.0

julia> a[1, 2] = 1
1

julia> a[1, 4] = 2
2

julia> a[3, 3] = 3
3

julia> a[4, 5] = 4
4

julia> a
4×5 SparseMatrixCSC{Float64,Int64} with 4 stored entries:
  [1, 2]  =  1.0
  [3, 3]  =  3.0
  [1, 4]  =  2.0
  [4, 5]  =  4.0

julia> Array(a)
4×5 Array{Float64,2}:
 0.0  1.0  0.0  2.0  0.0
 0.0  0.0  0.0  0.0  0.0
 0.0  0.0  3.0  0.0  0.0
 0.0  0.0  0.0  0.0  4.0

julia> b = spzeros(5, 4)
5×4 SparseMatrixCSC{Float64,Int64} with 0 stored entries

julia> b[1, 3] = 1
1

julia> b[2, 3] = 2
2

julia> b[3, 4] = 3
3

julia> b[4, 4] = 4
4

julia> Array(b)
5×4 Array{Float64,2}:
 0.0  0.0  1.0  0.0
 0.0  0.0  2.0  0.0
 0.0  0.0  0.0  3.0
 0.0  0.0  0.0  4.0
 0.0  0.0  0.0  0.0
```

+ 行列積の計算

```julia
julia> c = a * b
4×4 SparseMatrixCSC{Float64,Int64} with 3 stored entries:
  [1, 3]  =  2.0
  [1, 4]  =  8.0
  [3, 4]  =  9.0

julia> Array(c)
4×4 Array{Float64,2}:
 0.0  0.0  2.0  8.0
 0.0  0.0  0.0  0.0
 0.0  0.0  0.0  9.0
 0.0  0.0  0.0  0.0
```

+ csr_matrixとcsc_matrix

`scipy.sparse`には`csr_matrix`と`csc_matrix`という型があって、本でもそれについて書かれています。Juliaにもあるのでしょうか？
上記で行列`a`を作成すると`4×5 SparseMatrixCSC{Float64,Int64} with 0 stored entries`というメッセージが表示されます。`SparseMatrixCSC`とあるのでデフォルトでCSC型になるようです。

Juliaで型を調べて見ましたが`SparseMatrixCRC`という型はないようです。

```julia
julia> SparseMatrixCSC
SparseMatrixCSC

julia> SparseMatrixCRC
ERROR: UndefVarError: SparseMatrixCRC not defined
```

Juliaで`csr_matrix`に相当するものはわかりませんでした。（デフォルトの配列がすでに行を取り出す操作が高速なのかもしれません。）
もう少し勉強してみます。
RAK811 TrackerBoard ・RAK5205用 GPSアンテナ　

RAK811 TrackerBoard ・RAK5205はGPSが使えます。
（RAK831やWisLink Cellular BG96にも使えます。）
しかしアンテナが車載などで使うでかいもので、非常に邪魔です。
そこで、ハンディタイプを用意してみました。

無指向性８５０～１９９０ＭＨｚ帯ラバーダックアンテナ（長さ８．５ｃｍ　ＳＭＡ）
[NWX-282XSAXX-781]
秋月電子　500円
（GPSは送信ではなく、受信なので技適の問題はありません）

http://akizukidenshi.com/catalog/g/gP-03703/
![Lora-Tracker-GPS.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/54d18883-bac5-9542-d7bf-c5eabee819af.jpeg)

取り付けイメージ
![RAK5202-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/06d50bba-6334-193a-e527-24bfc17b0d77.jpeg)
![RAK811-Tracker-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/92bf83a2-fbc6-e082-e30f-212da26ec7ae.jpeg)

Aliexpressでは1ドル程度からありますが、Loraアンテナのサイズ以下にする必要もない上、入手も容易なので本製品がお勧めです。

RAK Wirelessの製品の優位点は、GPSがついているということですかね・・・
使う用途は限られるし、消費電流も増えるのですが、PoCには最高です。
Mbed CMSIS-DAP　AE-LPC11U35-MBってすごい

秋月電子で売っているAE-LPC11U35-MBのファームウェアをいじるとArmコアのICEとして使えます。

http://akizukidenshi.com/catalog/g/gK-12144/
![Mbed-1-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/5c82ba7c-3ae7-b64e-8a0c-8121d1392cf7.jpeg)

Githubよりhttps://github.com/ARMmbed/DAPLink/releases
0xxx_release_package_9295000c.zipの中の
0xxx_lpc11u35_ssci1114_0x0000.binを書き込むとMbedのCMSIS-DAPとして使用可能です。

簡略説明：SW1,SW2を押しながらUSBケーブルをさす。
SW１のみ押した状態にするとマスストレージとして見えるので、ファイルを消して、上記のBinを書き込む

使用する場合、1.27mmの10ピンをハンダ付けすることをおススメします。

![Mbed-1-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/5137fdbb-5d94-e934-4fe2-a3c94dd41616.jpeg)
![Mbed-1-3.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/9d5f1e83-75fc-b604-8f66-e15acbbf6b2a.jpeg)


ちなみに、Mbedの雪だるまさん事　渡會さんが
秋月のAE-LPC11U35-MBでDAPLinkを動かすを記事にしていただけました。
https://qiita.com/toyowata/items/a57ee1dfa884b29c298d
ギリギリでネットワークスペシャリスト試験 (ネスペ) に一発合格した私の勉強方法

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237882/ce32e2dc-8f8c-4369-f0b1-a32ba9680008.png width=45%>



# はじめに
2018年10月に実施されたIPAの[ネットワークスペシャリスト試験](https://www.jitec.ipa.go.jp/1_11seido/nw.html)を受け一発合格しました！！ かなりギリギリでしたが（笑）

合格出来たのが凄く嬉しかったので記念に記事を書きました。ネスペ受験を考えている人の参考になれば幸いです。

# 本記事の想定読者

ネスぺにギリギリ合格するバックグラウンド&勉強方法の一例を知りたい人 (笑)

# 私のバックグラウンド

- 2016年10月 [基本情報技術者試験](https://www.jitec.ipa.go.jp/1_11seido/fe.html)に合格

- 2017年04月 
    - 新卒で某SIerに就職 (理系院卒ですが情報系出身ではありません)
    - [応用情報技術者試験](https://www.jitec.ipa.go.jp/1_11seido/ap.html)に落ちる

- 2017年10月　2度目のチャレンジで、応用情報技術者試験に合格

- 2017年04月　データベーススペシャリスト試験に落ちる

- **2018年10月　ネットワークスペシャリスト試験を受験←←←←今回**

仕事でAWSをよく触っていますが、自分でネットワーク構築をした経験はありませんでした。また、ネットワーク関連の知識と言っても応用受けた際に覚えた程度しか身に付けていませんでした。


# 勉強期間
おおよそ2ヶ月程度

# 勉強時間
平日は多くて2時間
休日は3〜4時間くらい

# 勉強方法
いきなり過去問を解いても分からな過ぎてしんどいだろなー、と思ったので以下のような流れで勉強しました。

### 2ヶ月〜1ヶ月半前

- ネットワーク入門書・概要書を読んで、ざっくりとした理解だけしました。
    - [図解いちばんやさしく丁寧に書いた ネットワークの本](https://www.amazon.co.jp/dp/4415325580/)
    - [基礎からわかるTCP/IP ネットワークコンピューティング入門 第3版](https://www.amazon.co.jp//dp/4274050734)

- 分からないことがあっても、そのままにして本を読み進めました。
    - 最初から完全に理解しようとするのは辛いですからね。


### 1ヶ月半前〜3週間前

- 重点対策を頭から進めました。2周やりました。
    - [2018 ネットワークスペシャリスト「専門知識+午後問題」の重点対策 (専門分野シリーズ)](https://www.amazon.co.jp/dp/4865751297)

- 分からないとこはその都度ネットで調べて理解を深めるよう努めました。
    - [3分間NetWorking](http://www5e.biglobe.ne.jp/aji/3min/index.html)
    - [30分間NetWorking](http://www5e.biglobe.ne.jp/aji/30min/index.html)

- 問題を30分で解き、20分くらいで解答を読み、問題内容に関連する技術をネットで1時間調べる、みたいなやり方で勉強してました。問題解く時間よりネットで調べている時間の方が圧倒的に多かったです。

- なかなか暗記できないものは単語帳へ。電車の中で覚えてました。受験時代を思い出しました。(笑)

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237882/8ff3ece8-4d22-241c-2350-dc8bea0caa6d.jpeg width=30%>



### ３週間前〜受験日前日

- 過去問を4年分くらい解きました。
    - [ネットワークスペシャリスト過去問道場](https://www.nw-siken.com/nwkakomon.php)

- といっても、重点対策で既に解いたことのある問題も多かったです。

- 初めて解く問題の場合、正答率は半分行けば良いくらいでしたね。時間制限を設けて解きました。


# 受験結果
|区分|得点|
|:---:|:---:|
|午前Ⅰ試験|(免除)|
|午前Ⅱ試験|84.00点|
|午後Ⅰ試験|61点|
|午後Ⅱ試験|61点|

.... めちゃくちゃギリギリ！！！！！(笑)

午後Ⅰは完答したのでもう少し点が伸びると思ったのですが。。。ちょっとショックでした。

# 感想
実務歴もほとんどありませんでしたが、とりあえず合格出来て本当に良かったです。

午後試験の内容は、全く勉強してなかった内容でしたが何とか解けました。（61点ですが笑）

繰り返し過去問を解くことで、問題の解き方がある程度身に付いたのかもしれません。


# 余談

### 応募者数割合でみるとネスぺ合格率はさらに低い
[統計情報](https://www.jitec.ipa.go.jp/1_07toukei/_index_toukei.html)を見ていて気付いたことです。

年度にもよりますがネスペ応募者数の7割も試験を受験していおらず、その受験した７割のうちの13~15%しか合格していません。

ざっと計算して、応募者数でみた合格率は10%切るくらいです。

まあ、他の試験も同じような感じみたいですけどね。


### ネスペに合格して何か変わったかな？

- 会社から少しだけ奨励金がもらえた。(受験から半年経ってようやくもらえた。)

- ネットワーク絡みのタスクが自分に振られるようになった。

- 「ネスペ受かったんやから分かるやろ？？wwww」みたいな煽りが発生し始めた。
    - 「いやいや61点合格やったんで〜笑」と返す。


合格したからって大きな変化があったわけではありませんが、分かることが増えた分、仕事が少し楽しくなった気がします。


### 他の試験が比較的簡単に感じれるようになる。(2019/10/24追記)

ネスぺ受験で覚えたことは比較的基礎知識なものが多いので、
ここで覚えた知識は他の試験でそのまま使えます。（全部とは言いませんが）

例えば、[LPIC](https://www.lpi.org/ja/)とか[AWS認定ソリューションアーキテクトアソシエイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)とか。

私が先日受けた[情報処理安全確保支援士試験](https://www.jitec.ipa.go.jp/1_11seido/sc.html)は、先にネスぺ受験していたおかげか、比較的楽に取り組めました。
gradle でJavaおよびリソースの標準ディレクトリを作成するTask

####結論

```makeDefaultDirectory.gradle

task baseFolderCreate {
    sourceSets*.resources.srcDirs*.each { it.exists() ? println("already exists dir ${it}") : it.mkdirs() }
    sourceSets*.java.srcDirs*.each { it.exists() ? println("already exists dir ${it}") : it.mkdirs() }
}

```

###おまけ
以下は、Javaしかやってこなかった人間がここに至るまでの過程。

####Javaだけで作る
```Javaだけやってきた人.gradle
task baseFolderCreate {
    for (SourceSetContainer container : sourceSets) {
        for (File directory : container.java.srcDirs) {
            if (!directory.exists())
                if (directory.mkdirs())
                    System.out.println("create dir " + directory.getPath())
                else 
                    System.out.println("failed create dir " + directory.getPath())
            else 
                System.out.println("already exists dir " + directory.getPath())
        }
        for (File directory : container.resources.srcDirs) {
            if (!directory.exists())
                if (directory.mkdirs())
                    System.out.println("create dir " + directory.getPath())
                else
                    System.out.println("failed create dir " + directory.getPath())
            else
                System.out.println("already exists dir " + directory.getPath())
        }
    }
}

```
だめだコイツ・・・。早くなんとかしないと・・・。
※ネタです。

参考リンク：
 [gradleのbuildスクリプトに与えられるパラメータsourceSetsに関する情報のみ](http://gradle.monochromeroad.com/docs/userguide/java_plugin.html)

####each, it がちょっと分かってきた

```gloovyのeach,itがわかってきた人向け.gradle
task baseFolderCreate {

    def func = {File f ->
        if (!f.exists()) {
            def ret = f.mkdirs()
            if (!ret)
                println "failed create dir ${f.getPath()}"
            else
                println "create dir ${f.getPath()}"
        }
    }

    sourceSets.each {
        it.java.srcDirs.each(func)
        it.resources.srcDirs.each(func)
    }

}
```
クロージャを試し始める。

参考リンク：
[API Document クロージャ](https://koji-k.github.io/groovy-tutorial/closure/index.html)
[API Document リスト操作](https://koji-k.github.io/groovy-tutorial/collection/list.html)

####groovyだいぶ分かってきた

```groovyわかってきた.gradle
task baseFolderCreate {
    def filter = {sourceSetContainer, targets ->
        sourceSetContainer.each { set ->
            targets.each { target ->
                set.getAt(target).srcDirs.each { it.exists() ? println("already exists ${it}") : it.mkdirs() }
            }
        }
    }

    filter(sourceSets, ["java", "resources"])
}
```
operatorによるプロパティアクセス。Javaには無い。
JavaScriptでなんとなく知ってたやつ。

参考リンク：
 [API Documnet operator](http://groovy-lang.org/operators.html)


####完全に理解した。
```makeDefaultDirectory.gradle

task baseFolderCreate {
    sourceSets*.resources.srcDirs*.each { it.exists() ? println("already exists dir ${it}") : it.mkdirs() }
    sourceSets*.java.srcDirs*.each { it.exists() ? println("already exists dir ${it}") : it.mkdirs() }
}

```

参考リンク：
[star-dot* operator](http://docs.groovy-lang.org/docs/groovy-2.5.2/html/documentation/#Collections-Gettingefficientwiththestar-dotoperator)
タイムゾーンをちゃんと理解しておこう

# 改めて整理しようと思ったきっかけ
基礎的な知識だけど、サーバやDBなどの設定を間違えると、「タイムスタンプ」で判定する処理が意図しない動作をすることがあるので。
実際そういうことが身の回りであったので...

# 「タイムゾーン」とは
「同じ標準時を利用する地域や区分」のこと。
例えば日本であれば、「グリニッジ標準時＋９時間」が標準時となっており、韓国やインドネシア東部と同じタイムゾーンとなっている。

## よくみる「JST」「GMT」「UTC」ってなに？
### JST(Japan Standard Time: 日本標準時)
日本で使われている標準時。「東経135度、兵庫県明石市」...っていうやつ。

### GMT(Greenwich Mean Time: グリニッジ標準時)
イギリスのグリニッジ天文台を基準とする標準時。
日本標準時は、GMT+9:00H。

### UTC(Universal Time, Coordinated: 協定世界時)
GMTだと、長く使った場合数秒のズレが生じるらしい。
それを解消するために、人工的に調整された時間。

# サーバやDBに設定されているタイムゾーン
サーバやDBにも、それぞれタイムゾーンが設定される。

## Linuxサーバ
dateで現在の時刻を確認すると、設定されているタイムゾーンが確認できる。

```
$ date
2019年  1月 12日 土曜日 22:51:52 JST
```

## PostgreSQL
select now()で現在の時刻を確認する。
「+09」となっていることから、JSTのタイムゾーンが考慮された時刻が設定されていることがわかる。

```
postgres=# select now();
              now              
-------------------------------
 2019-01-12 23:02:14.185657+09
(1 row)
```

/usr/local/var/postgres/postgresql.conf
の中で、タイムゾーンが設定されている。

```
timezone = 'Japan'
```

# 参考リンク
- [タイムゾーン](https://kotobank.jp/word/%E3%82%BF%E3%82%A4%E3%83%A0%E3%82%BE%E3%83%BC%E3%83%B3-5525)
- [JST、GMT、UTCとは？ 英語で押さえるべき日本と世界の標準時](https://www.quicktranslate.com/blog/2017/11/jst%E3%80%81gmt%E3%80%81utc%E3%81%A8%E3%81%AF%EF%BC%9F-%E8%8B%B1%E8%AA%9E%E3%81%A7%E6%8A%BC%E3%81%95%E3%81%88%E3%82%8B%E3%81%B9%E3%81%8D%E6%97%A5%E6%9C%AC%E3%81%A8%E4%B8%96%E7%95%8C%E3%81%AE%E6%A8%99/)
- [【Linux】タイムゾーン(Timezone)の変更](https://qiita.com/azusanakano/items/b39bd22504313884a7c3)
- [【設定確認から変更方法まで】Linuxでのタイムゾーンの扱い方](https://eng-entrance.com/linux-time-timezone)
- [PostgreSQL 9.2 でタイムゾーンのデフォルト値が変わった話](https://mallowlabs.hatenablog.com/entry/20140402/postgresql_92_timzone)
洋書「xUnit Test Patterns」 URLポインタ集

# はじめに

ユニットテストを作成、運用する上で有用性が高い[xUnit Test Patterns: Refactoring Test Code](https://www.amazon.co.jp/dp/0131495054)は、未だ翻訳書が発売さません。
というわけで、原書を読む上で有用なURLポインタ集を作成しました。

# xUTPMagazine

xUTP読書会の有志よって作成されたマガジン。テストパターンや不吉な匂いについて簡単なサマリーがある。

[第一回](http://devtesting.jp/pekema/?0001)
[第二回](http://devtesting.jp/pekema/?0002)
[第三回](http://devtesting.jp/pekema/?0003)
[第四回](http://devtesting.jp/pekema/?0004)

読む上で特に参考になる部分
[xUnit Test Patterns の世界観(テストパターン等）](http://devtesting.jp/pekema/?0001%2FTopics)
[xUnit Test Patterns の世界観「テストコードの不吉な臭い」（逆引き）](http://devtesting.jp/pekema/?0002%2FTopics)
[xUnit Test Patterns の世界観「テストコードの不吉な臭い」](http://devtesting.jp/pekema/?0004%2FTopics)

# xUnit Test Patterns(xUTP)読書会

githubで一部公開されている。
https://github.com/yujiorama/xutp

# 和田卓人氏のSlideShare

[xUnit Test Patterns - Chapter11]
https://www.slideshare.net/t_wada/xunit-test-patterns-chapter11

[xUnit Test Patterns - Chapter16]
https://www.slideshare.net/t_wada/xunit-test-patterns-chapter16

[xUnit Test Patterns - Chapter19]
https://www.slideshare.net/t_wada/xutp-chapter19

[xUTP Chapter19 (2). Testcase Class]
https://www.slideshare.net/t_wada/xutp-chapter19-2-testcase-class

[xUTP Chapter26. Dependency Injection]
https://www.slideshare.net/t_wada/xutp-chapter26-dependency-injection

[xUTP Chapter27 Generated Value]
https://www.slideshare.net/t_wada/xutp-chapter27-generated-value

# Qiitaの記事

[xUnit Test Patternsから学ぶユニットテストの６つの目指すべきゴール]
https://qiita.com/hgsgtk/items/00daa278516d1995dac6

[xUnit Test Patternsから学ぶ12個のユニットテストの原則]
https://qiita.com/hgsgtk/items/a3186a250d36d3b224d9

# 本家のサポートURL

洋書は後でという方はこちら。

http://xunitpatterns.com

# 最後に
翻訳書はまだ発売されないが、原書発売以後に発表されたユニットテスト系の本に言及があるのでそれなりになんとかなる。
Rails 5.2.2+ では event.time を使うな！

Rails 5.2.2 の https://github.com/rails/rails/commit/7c4542146f0dde962205e5a90839349631ae60fb このコミットによって、
`ActiveSupport::LogSubscriber`での`event.time`の値が変わるので要注意です！ :warning::warning::warning:

(タイトルでは`使うな!`と書きましたがどういうデータが返ってくるのか把握できていればもちろん問題ありません。)

### `event.time`の値

before: 
`2019-01-11 12:50:06 +0900` 
`Time.now`の値が返って来ていました。

after: 
`356151.886698` (Float)
Rails 5.2.2 では `Process.clock_gettime(Process::CLOCK_MONOTONIC)`の値が返ってくるようになります

`Process.clock_gettime(Process::CLOCK_MONOTONIC)`はOS起動からの時刻がFloatで取得できるようです(環境によるようです)

### 影響範囲

- [Lograge](https://github.com/roidrage/lograge)を使っているケース
  - 今回私がこの問題にハマりました。
- 自前で `LogSubscriber`を書いているケース

### 必要な対応

基本的には `event.time`としていたところを`Time.current`(`Time.now`)に変更するのがよいと思います。

ただ、厳密には、いつの実時刻をどれだけ正確に必要か、によるので各々検討をお願いします。
Logrageで`Time.current`とすると、リクエストを受け付けた時刻ではなくログをはくときの時刻になりますし、`Time.current`の処理自体にもある程度の時間がかかります。

## 補足

ちなみに、 [Rails5.2.2のリリースノート](https://github.com/rails/rails/releases/tag/v5.2.2)には今回の修正に関する記述はありません。
ですので、5.2.2にあげるタイミングに気づくのは難しいので、直ぐに対応されるのが良いと思います。

また、Lograge側では特にコードの修正はされていません。(Logrageのコード上は何も影響がないので)
Issueに報告が上げられて README.md の変更だけがされています。

https://github.com/roidrage/lograge/issues/266
https://github.com/roidrage/lograge/commit/8d267d72fc9f50603af553e6567cc7bff7803920

## 終わりに

Rails 5.2.2 がリリースされてすでに1ヶ月以上経っているので、すでに問題にぶつかって対応されている方も多いかもしれないですが、これから上げる方もたくさんいらっしゃると思います。
この記事がその方たちの助けになればと思います。　:pray:
【Noby API】ノビィ取り扱い説明書　使い方編【CotoGoto】

こんにちは。この記事は[【Noby API】ノビィ取り扱い説明書【CotoGoto】](https://qiita.com/blue_islands/items/0d5a9ea5f4911e959924)の続きの記事になります。

今回は使い方についてを説明していきます。

# 1. 認証キーの発行
認証キーの発行は以下の手順で行います。

## 1-1. API利用の場所
[CotoGoto](https://www.cotogoto.ai/)の下のリンクから[API](https://webapi.cotogoto.ai/)をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/562a718d-de8d-a6d7-334a-b35115bb16a2.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/d4013f23-18cc-2390-7497-63de80189973.png)

## 1-2. ユーザ登録

アカウントとAPIキー取得から[次](https://app.cotogoto.ai/webapi/console)のページに遷移します。
![FireShot Capture 041 - アカウントとAPIキー取得 - Noby API - webapi.cotogoto.ai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/a61b4b9c-bca4-52ab-722e-b0113707e303.png)

Line or Facebookで ユーザ登録を行います。
![FireShot Capture 043 - Noby API ・ CotoGoto(コトゴト) - app.cotogoto.ai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/62df2913-08e8-ef34-3b4f-3f0a2615565c.png)


## 1-3. 認証キーの発行
認証キーが発行されます。
![FireShot Capture 044 - Noby API ・ CotoGoto(コトゴト) - app.cotogoto.ai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/f8b156fd-2ea0-19d2-61a0-0dfb51265e02.png)


# 2. APIを動かしてみる
APIの動作確認は[Apiary](https://nobyapi.docs.apiary.io/)からも動作確認を行うことができます。
![FireShot Capture 045 - NOBY API · Apiary - nobyapi.docs.apiary.io.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20464/2646821b-78cf-0c11-2f49-13898a5b3289.png)


# 3. JavaScriptでAPIを実装する
次にJavascriptでAPIを実装します。

## 3-1. HTMLのテンプレートを作成
HTMLのテンプレートを作成します。

```HTML:index.html
<!DOCTYPE html>
<html lang="ja">
<title>ノビィと会話</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script>
</script>
</head>
<body>
<div>
  <label for="message">話す：</label><br>
  <textarea id="message"></textarea>
</div>
<input type="button" value="送信" onclick="send()">
<div id="reply"></div>
</body>
</html>
```

作るとこんな感じ。
![3-1.png](https://qiita-image-store.s3.amazonaws.com/0/20464/105c3991-5828-bdb7-ce78-f38a98f33245.png)

## 3-2. Javascriptを追加
空のscriptタグにJavascriptを実装します。

```HTML:index.html
・
<script>
 function send() {
    $.get('https://app.cotogoto.ai/webapi/noby.json',
      {
        appkey: 'YOUR_API_KEY'
        , text: $('#message').val()
      },
      function(data) {
        $('#reply').html(data.text)
      }
    );
  }
</script>
・
```

## 3-3. APIのパラメータを指定する
APIのパラメータをJavascriptに指定します。

```HTML:index.html
・
<script>
 function send() {
    $.get('https://app.cotogoto.ai/webapi/noby.json',
      {
        appkey: 'YOUR_API_KEY'
        , text: $('#message').val()
        , persona: ‘3’,
        , ending: ‘のじゃ’
      },
      function(data) {
        $('#reply').html(data.text)
      }
    );
  }
</script>
・
```

# 4. 最後に
実際に動かしてみると神さまと会話している感じになりますが、そちらは実際に動かして試してください。
まだまだ、[コマンド機能](https://qiita.com/blue_islands/items/e9f9ccefade25af0cd96)というものもAPIの説明を[次の記事](https://qiita.com/blue_islands/items/e9f9ccefade25af0cd96)でまとめています。

※ソースについては[Github](https://github.com/livlog-llc/noby-handson)に上げてあります。
Prologで言語をサクッと作るノウハウ2019

# Prologで言語をサクッと作るノウハウ2019

プログラミング言語をさくっと作って見る場合のノウハウ集

## 評価器

    % a1.pl
    eval(I,I) :- integer(I).
    eval(E1+E2,I) :- eval(E1,I1),eval(E2,I2),I is I1+I2.
    eval(E1*E2,I) :- eval(E1,I1),eval(E2,I2),I is I1*I2.
    :- eval(1+2*3+4,R),writeln(R).
    :- halt.

## 文法定義

BNF的に木文法を定義できると便利です。
ライブラリを使うのも良いですし、マクロを使うのもよいのですが、ポータビリティの観点で考えるとソースに内包できると便利です。
以下に簡単な例を示します:

    % a2.pl
    :- op(1200,xfx,::=),op(650,xfx,∈),op(250,yf,*).
    G∈{G}. G∈(G|_). G∈(_|G1):-G∈G1. G∈G.
    syntax(G,E):-G=..[O|Gs],E=..[O|Es],maplist(syntax,Gs,Es),!.
    syntax(G,E):-(G::=Gs),!,G1∈Gs,syntax(G1,E),!.
    syntax(i,I):-integer(I),!.
    syntax(E*,Ls):-maplist(syntax(E),Ls).
    t ::= int.
    e ::= i | e+e | e*e.
    eval(I,I) :- integer(I).
    eval(E1+E2,I) :- eval(E1,I1),eval(E2,I2),I is I1+I2.
    eval(E1*E2,I) :- eval(E1,I1),eval(E2,I2),I is I1*I2.
    run(E,R) :- syntax(e,E),eval(E,R).
    :- run(1+2*3+4,R),writeln(R).
    :- halt.

## ローカルモジュール

プログラムが大きくなってくるとローカルモジュールが欲しくなることがあります。
その場合はterm_expansionを使って数行でローカルモジュールを作れるので作ってしまいましょう。

    % a3.pl
    :- dynamic(mod/2).
    term_expansion(:-mod(M,E),:-!):-assert(mod(M,E)).
    term_expansion(:-end(M),:-!):-retract(mod(M,E)),maplist(M:export,E),
                                  forall(member(P,E),user:import(M:P)).
    term_expansion(P,:-!):-mod(M,_),M:assert(P).
    :- op(1200,xfx,::=),op(650,xfx,∈),op(250,yf,*).
    :- mod(syntax,[syntax/2]).
      G∈{G}. G∈(G|_). G∈(_|G1):-G∈G1. G∈G.
      syntax(G,E):-G=..[O|Gs],E=..[O|Es],maplist(syntax,Gs,Es),!.
      syntax(G,E):-(G::=Gs),!,G1∈Gs,syntax(G1,E),!.
      syntax(i,I):-integer(I),!.
      syntax(E*,Ls):-maplist(syntax(E),Ls).
      t ::= int.
      e ::= i | e+e | e*e.
    :- end(syntax).
    :- mod(eval,[eval/2,run/2]).
      eval(I,I) :- integer(I).
      eval(E1+E2,I) :- eval(E1,I1),eval(E2,I2),I is I1+I2.
      eval(E1*E2,I) :- eval(E1,I1),eval(E2,I2),I is I1*I2.
      run(E,R) :- syntax(e,E),eval(E,R).
    :- end(eval).
    :- run(1+2*3+4,R),writeln(R).
    :- halt.

## 部分型

部分型付けは意外と難しい概念のように思えます。
とりあえず、部分型付けだけでテストしてみると良いです。


クラスの部分型付け

    % a4.pl
    T<:T.
    A<:C :- class(A<:B),B<:C.
    class(a<:top).
    class(b<:a).
    class(c<:b).
    :- c<:top.
    :- c<:a.
    :- halt.

関数とレコードのある部分型付け

    % a5.pl
    T<:T.
    _<:top.
    bot<:_.
    (A->B)<:(C->D) :- C<:A,B<:D.
    R1<:R2 :- maplist([L:T2]>>(member(L:T1,R1),T1<:T2),R2).
    :- int <: top.
    :- bot <: int.
    :- [x:int,y:int] <: [x:int].
    :- halt.
PythonでURLのリストからサイトマップ（sitemap.xml）を作る【決定版】

# Python で URL のリストからサイトマップ （sitemap.xml） を作る

SEO について考える上で、必須である項目の1つに<strong>サイトマップ（sitemap.xml）</strong>があります。そこで、URL のリストからサイトマップを作る方法についてご紹介いたします。
（※ Python 3系を前提としています）


## Google の推奨するサイトマップ形式

`sitemap.xml` の主な構造は以下です。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> 
  <url>
    <loc>http://www.example.com/foo.html</loc>
    <lastmod>2018-06-04</lastmod>
  </url>
  <url>
    <loc>http://www.example.com/faa.html</loc>
    <lastmod>2018-06-04</lastmod>
  </url>
</urlset>
```

参考: https://support.google.com/webmasters/answer/183668?hl=ja


## sitemap.xml を作る

`xml`という標準ライブラリの、`ElementTree`を利用します。

### サンプルプログラム

```python
import xml.etree.ElementTree as ET

urls = [
    "https://www.yahoo.co.jp/",
    "https://www.google.com/",
    "https://www.facebook.com/",
    "https://twitter.com/",
    "https://paymap.jp/",
]

urlset = ET.Element('urlset')
urlset.set("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9")
tree = ET.ElementTree(element=urlset)

for url in urls:
    url_element = ET.SubElement(urlset, 'url')
    loc = ET.SubElement(url_element, 'loc')
    loc.text = url
    lastmod = ET.SubElement(url_element, 'lastmod')
    lastmod.text = "2019-01-12"

tree.write('sitemap.xml', encoding='utf-8', xml_declaration=True)
```


### 順番に説明

#### import

`xml` の `ElementTree` を `ET` としてインポートします。

```python
import xml.etree.ElementTree as ET
```

#### urls

URL のリストを `urls` としました。

```python
urls = [
    "https://www.yahoo.co.jp/",
    "https://www.google.com/",
    "https://www.facebook.com/",
    "https://twitter.com/",
    "https://paymap.jp",
]
```

#### urlset

sitemap の構造に合わせて、`urlset`をルートにし、`xmlns` のアトリビュートをセットします。

```python
urlset = ET.Element('urlset')
urlset.set("xmlns", "http://www.sitemaps.org/schemas/sitemap/0.9")
tree = ET.ElementTree(element=urlset)
```

#### 各要素を作る

URL のリストからで`url`　に `loc` と `lastmod` を作成し、`loc` に URL を挿入し、`lastmod`には日付を挿入します。必要に応じて`changefreq`などもセットしてください。

```python
for url in urls:
    url_element = ET.SubElement(urlset, 'url')
    loc = ET.SubElement(url_element, 'loc')
    loc.text = url
    lastmod = ET.SubElement(url_element, 'lastmod')
    lastmod.text = "2019-01-12"
```

日付の操作方法を詳しく知りたい場合は[Python datetime 日付の計算、文字列から変換【決定版】](https://qiita.com/7110/items/4ece0ce9be0ce910ee90)をご覧ください。


#### 書き出し

`encoding`と`xml_declaration`で、書き出される XML 上部に`<?xml version="1.0" encoding="UTF-8"?>`を定義し、`sitemap.xml`というファイル名で書き出します

```python
tree.write('sitemap.xml', encoding='utf-8', xml_declaration=True)
```


## `sitemap.xml` の確認

書き出されたファイルは以下のようになっています。

<img width="500" alt="sitemap.xml on Editor" src="https://qiita-image-store.s3.amazonaws.com/0/130952/7f4565ca-d9e1-62e8-853e-5b4854969963.png">

これでは確認しずらいので、Chromeなどのブラウザにドラッグ・アンド・ドロップすると、以下のように確認することができます。

<img width="500" alt="sitemap.xml on Browser" src="https://qiita-image-store.s3.amazonaws.com/0/130952/67d817eb-04f4-dc87-3650-09146263f111.png">


## まとめ
Python によるサイトマップ（sitemap.xml）の作り方の説明でした。

**いいね**をしていただけるとモチベーションに繋がりますので押していただけると嬉しいです。
コア数に応じた最適なmake実行


make実行にいつも`-j`（無制限に並列実行）を指定していたらひどい負荷になったので反省。
おれは…反省すると強いぜ…。

# 並列数はいくつが最適か

参考: [makeの並列オプションは何を指定するべきか - よーる](http://lpha-z.hatenablog.com/entry/2018/12/30/231500)

参考記事によれば、物理コア数＋１が最速。
以下のような理由かと推測する。

* 結局は物理コア数分だけしか並列動作できない
* 並列動作数よりも多ければ、処理を終えた物理コアがすぐに次の処理に取り掛かれる
* 並列動作数をあまり多くしすぎても、資源獲得のオーバーヘッドなどで遅くなる

# 物理コア数を調べる

参考: [物理 CPU、CPU コア、および論理 CPU の数を確認する](https://access.redhat.com/node/2159401)

以下のコマンドで取得できる。
これはMSYS2でも使える。さすが！

| 対象                   | 取得コマンド                                       |
|:--                     |:--                                                 |
| 物理CPU数              | <code>grep physical.id /proc/cpuinfo &#124; sort -u &#124; wc -l</code> |
| 物理コア数（CPUコア数）| <code>grep cpu.cores /proc/cpuinfo &#124; sort -u</code>           |
| 論理CPU数（スレッド数）| <code>grep processor /proc/cpuinfo &#124; wc -l.</code>             |

# 

シェルスクリプトなどで指定するなら以下:

```bash
JOBS=$(($(grep cpu.cores /proc/cpuinfo | sort -u | sed 's/[^0-9]//g') + 1))
make -j${JOBS}
```

参考: [いつも make で高速化する：パソコン鳥のブログ](https://s.webry.info/sp/vogel.at.webry.info/201702/article_8.html)

↑の記事のように、`~/.bashrc`に指定するなら以下:

```bash:.bashrc
export MAKEFLAGS=-j$(($(grep cpu.cores /proc/cpuinfo | sort -u | sed 's/[^0-9]//g') + 1)) $MAKEFLAGS
```
GitHubにprivate repositoryを作った

#用意するもの
- GitHubアカウント
- MSへの感謝の気持ち

#作ってみる
まずはログイン。ほんでNew repository押す。
![github.com_.png](https://qiita-image-store.s3.amazonaws.com/0/23757/81e4ae39-9a94-b364-9243-906de0927006.png)

~~珍しくちょっと格好良いrepository名オススメしてるけど~~privateというラジオボタンを選びます。
![github.com_new.png](https://qiita-image-store.s3.amazonaws.com/0/23757/db6dec5d-b076-4ad3-7cbf-f9071b4a7c68.png)

できました。
![github.com_rptrryo_privateTiger.png](https://qiita-image-store.s3.amazonaws.com/0/23757/f14a888d-e01e-10ac-21b1-b2c2adf36039.png)

とっても簡単ですね。エンジニア大喜びなのではないでしょうか。
草も生えてウレシイ:smiley:

![github.com_rptrryo.png](https://qiita-image-store.s3.amazonaws.com/0/23757/c2503d1c-1c2a-224d-7d3d-e0773e9f7053.png)
HTMLだけでボタンごとのsubmit先を変える方法

#はじめに
PHPでアプリケーション制作時、一つのform上に複数ボタンがあり、ボタンによってデータの送り先やメソッドを変更したかったのですが調べてみるとJavaScriptを使うのが一般的のようです。
ただ調べてみるとHTMLだけでもできたので書いておきます。

#使い方
HTML5（今回使用する`formaction`はHTML5から使えるようになりました）


```html:html
<form method="post" action="?">
　<input type="checkbox" name="id[]" value="1" >1
  <input type="checkbox" name="id[]" value="2" >2
　　・
　　・
　　・

　<!-- PUTメソッド -->
  <button type="submit" formaction="送信先のurl" name="_METHOD" vlaue="put">更新</button>

　<!-- DELETEメソッド -->
　<button type="submit" formaction="送信先のurl" name="_METHOD" vlaue="delete">削除</button>
</form>
```

これで一つのフォームの中でチェックボックスの値をPUTとDELETEメソッドの両方に送ることができます。

ポイントは全体のformはpostメソッドで囲むことです、普段hiddenで_METHODプロパティを使ってputやdeleteメソッドを送るときと同じですね。
ただこうすると何も設定していないボタンはpostメソッドに送られてしまうので、普通に画面遷移などをする際にはそのボタンにgetメソッドを設定してください。
php-master-changes 2019-01-11

今日は何より型付きプロパティの実装がマージされた！
あと imagescale() のバグ修正と不要コード削除に誤った型の修正、openssl のテストでの証明書自動生成とopenssl_random_pseudo_bytes() が失敗時に例外を投げるようにする修正に pkg-config への移行、opcache の 64bit AIX でのビルド修正、readline のビルドシステム修正があった！

# 2019-01-11
## cmb69: Fix [#73281](https://bugs.php.net/bug.php?id=73281): imagescale(…, IMG_BILINEAR_FIXED) can cause black border
- https://github.com/php/php-src/commit/6b4cdbaade1b077e8f0eceecb0e07921fed00aff
- [7.2~]
- ext/gd で、真っ白な画像を [imagescale()](http://php.net/manual/ja/function.imagescale.php) で IMG_BILINEAR_FIXED オプションで補間して拡大すると、底部に黒い枠線ができる問題の修正

## cmb69: Remove unused variables and functions
- https://github.com/php/php-src/commit/41c3e3d853c7203b8fc0f6b5a4625b80525d6662
- ext/gd で、使われていない変数 / 関数を削除

## kamazee: Generate certs for openssl tests on the fly
- https://github.com/php/php-src/commit/1fab01be5bef046ff6dcbf843cc3db66faacda12
- [7.2~]
- ext/openssl で、テストに使う証明書をオンザフライで生成するよう修正

## kamazee: Fix cleaning up after openssl_pkcs7_verify_basic test
- https://github.com/php/php-src/commit/1a1e12c2a964214ddce276a3c1cb6447393ad23c
- [7.2~]
- ext/openssl で、openssl_pkcs7_verify_basic のテスト後の一時ファイル削除処理を修正

## cmb69: Fix misleading variable type
- https://github.com/php/php-src/commit/8c21ce5b2ecf118a34247971f8582ae0d1853894
- ext/gd で、変数の型を誤っていた箇所の修正

## kadler: Fix bug [#77361](https://bugs.php.net/bug.php?id=77361) (configure fails on 64-bit AIX when opcache enabled)
- https://github.com/php/php-src/commit/332b58f86591548acd5965c7f7f0085af377f0d9
- [7.2~]
- ext/opcache で、64-bit AIX 環境でビルドに失敗する問題の修正

## oerdnj: Fix rl_completion_matches detection
- https://github.com/php/php-src/commit/1ea58b6e78355437b79fb7b1f287ba6688fb1c57
- [7.2~]
- ext/readline で、ビルド時の rl_completion_matches の検出方法を修正

## SammyK: Improve openssl_random_pseudo_bytes()
- https://github.com/php/php-src/commit/74c0e580efa8feb282d0da9c830c6bd01b08b45e
- ext/openssl で、openssl_random_pseudo_bytes() が失敗時に例外を投げるよう修正
- [会社ブログ](https://www.infiniteloop.co.jp/blog/2018/11/php-news-5/) でちょっと触れた

## eli-schwartz: ext/openssl: port to pkg-config macro and consistently require its use
- https://github.com/php/php-src/commit/fe8fdfa3bd588d80ce60f6b3848058239e0a760f
- ext/openssl で、ビルドシステムを pkg-config へ移行

## nikic: Implement typed properties
- https://github.com/php/php-src/commit/e219ec144ef6682b71e135fd18654ee1bb4676b4
- 型付きプロパティ [PR](https://github.com/php/php-src/pull/3313) のマージ
- 先日 [RFC](https://wiki.php.net/rfc/typed_properties_v2) が受理されてから実装を仕上げるのにしばらくかかっていた
Docker の URL を入れるだけで、コンテナ立ち上げてくれてそのまま本番運用できる PaaS があったらどうだろう

# これは何

こういうサービスがあったら便利かな？と思い、デモ画面を作ってみました。ご意見頂けますと幸いです。

https://docker-run.com

![image.png](https://github.com/acro5piano/docker-run.com/raw/master/demo.gif)

# 動機

最近、 Docker コンテナを本番運用するのがスタンダードみたいになっているので、 Fargate やら ECS やら Kubernates を使ってみようとしています。

ただ、開発環境で Docker 使ったことあるくらいの知識でやろうとすると、かなり時間がかかりました。もっと簡単に Docker 本番運用できないの、と思いました。特に ECS は自分でスクリプトを書かないといけないことがあり、なんだかなーと。

「コンテナ疲れ」という言葉もあります。
https://www.slideshare.net/jacopen/k8spaasserverless

zeit の Now というサービスも使ってみましたが、コンテナが眠ってしまったり、専用のツールのインストールが必要などで、もっとシンプルにできるのではないかとも思いました。
https://zeit.co/now

やりたいことは、 Quay に近いかもしれません。
https://quay.io 

ローカルで `docker run -d ...` するような感覚で、サービスを立ち上げられないものかなと。

# docker-run.com

https://docker-run.com

冒頭の Gif はただの LP で、実際には何も動いていませんが、こんな感じで気軽に使えるものがあれば良いな。作ろうかな。

デプロイはこんな感じ。

```sh
curl -XPOST -H 'Authorization: YOUR_TOKEN' -d HOST/IMAGE:VERSION https://docker-run.com/APP_ID/renew
```

その他、詳しい動機や仕様は下記に掲載しています。

https://github.com/acro5piano/docker-run.com
Raspi2にAlexa Voice Service(AVS)を 〜AWS IoT設定編〜

# はじめに
2019年年始の（勝手にやってる)宿題の一貫でRaspiにAVSを入れるってのをやってみることにしました。
今回はシリーズもので書いてる中で、前準備でAWS IoTの設定だけを書き出します。

#設定手順
これからAWS IoTの設定手順を記載します。

## 1. AWS IoT Coreの選択
AWS マネジメントコンソールのサービスの検索から「IoT」と入力し、「IoT Core」をクリックしてください。
<img width="645" alt="iot001.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105220/471b8381-1ff0-605e-73ce-824649beb1a6.jpeg">

## 2. ポリシーの作成
AWS IoT Coreの画面の左側のメニューから、「安全性」→「ポリシー」をクリックし、「ポリシーの作成」ボタンをクリックします。
<img width="1213" alt="iot002.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105220/30273036-0823-31dd-b8da-d92563ce9618.jpeg">

## 3. ポリシーの入力
ポリシーの作成画面で、「名前」を入力し、「ステートメントを追加」枠で「アクション」に「iot:*」を入力し、「リソースARN」に「*｝を入力し、「許可」にチェックを入れてください。終わったら、「作成」ボタンをクリックしてください。ポリシーを「iot:*」としてますが、時間を見つけて絞っていこうと思います。
これで、ポリシーの作成が完了となります。
![iot003.jpg](https://qiita-image-store.s3.amazonaws.com/0/105220/3a52da75-c188-ccb4-3f79-44b5c80174d7.jpeg)

## 4. モノの登録
AWS IoT Coreの画面の左側のメニューから、「管理」→「モノ」をクリックし、「モノの登録」ボタンをクリックします。
<img width="1028" alt="iot004.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105220/fad1bc01-bee9-7e2f-0947-83ef045cae2b.jpeg">

## 5. 単一のAWS IoTモノの登録
「単一のモノを作成する」ボタンをクリックします。
<img width="1016" alt="iot005.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105220/5ae8fa09-8c2d-d91b-9e54-b653a4bcf4d7.jpeg">

## 6. Thing Registryにデバイスを追加
「名前」を入力して、「次へ」ボタンをクリックしてください。
![iot006.jpg](https://qiita-image-store.s3.amazonaws.com/0/105220/bcf5e195-e82a-f72c-b875-36da5f03c2a1.jpeg)

## 7. モノに証明書を追加
「証明書の作成」ボタンをクリックしてください。
<img width="998" alt="iot007.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105220/938578ac-69c4-671f-067c-e26064a48924.jpeg">

## 8. 証明書のダウンロードと有効化
このモノの証明書、パブリックキー、プライベートキーをクリックしてダウンロードしてください。
AWS IoTのルートCAは別のページでダウンロードしてください。
「有効化」ボタンをクリックして、その後、「ポリシーをアタッチ」ボタンをクリックしてください。
<img width="991" alt="iot008.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105220/4be1a0a5-051e-5c32-0e77-98c24167fb61.jpeg">

別ページ
<img width="737" alt="iot009.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105220/a9aabf55-d26b-63d2-2441-f183ad97a852.jpeg">

## 9. ポリシーの追加とモノの登録
先程作成したポリシーのチェックをオンにして、「モノの登録」ボタンをクリックしてください。
これで、モノの登録とポリシーのアタッチが完了となります。
<img width="1013" alt="iot010.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/105220/b784fb81-6611-78a7-e7d2-d3af5074a7e3.jpeg">
Railsでmigrate時にクラス図を自動生成する設定

## 目的
- ドキュメントとシステムが乖離する要因を消す。
- 視覚的に把握する。
- 共有の手間をなくす。

## 手順
1. graphvizをインストールする
2. gemを指定する
3. タスクを定義する

##1. graphvizをインストールする
```
# ディストリビューションに合わせて
yum install graphviz
　or
apt-get install graphviz
```


##2. gemを指定する

```ruby:Gemfile

group :development do
  gem 'yard'
end
```

##3. タスクを定義する

```ruby:Rakefile
require_relative 'config/application'

Rails.application.load_tasks

# migrateのタスクをフックする
Rake::Task['db:migrate'].enhance do
  if Rails.env.development?
    Rake::Task[:after_migrate].invoke
  end
end

# migrateの後のタスク
task :after_migrate do
  Rake::Task[:create_classd].invoke
end

task :create_classd do
  sh 'yard doc'
  sh 'yard graph --full -f bookshelf-classd.dot'
  sh 'dot -Tpng bookshelf-classd.dot -o bookshelf-classd.png'
end
```

# 実行する
```
rails db:migrate
```
［Kotlin］内部クラスを理解する

## はじめに

Kotlin in Actionを読み進めているとき内部クラスが全く理解できませんでした
なので今回は内部クラスについて**調べたこと**、**実践したこと**をまとめてみたいと思います。

## 調べる

クラス内に宣言されたクラスを内部クラスと呼ぶらしいです。
これだけ説明されると普段やるクラス内にクラスを定義するのと何が違うのかという疑問が出ると思います。
以下のコードと何が違うんだろうかと、筆者が**クラス内に宣言されたクラス**と説明されたとき思いました。

#### クラスの中にクラスを定義 

```kotlin
class ClassA {
  class ClassB() { 
    ...
  }
}
```

疑問を解決するために調べてみたところ、
**内部クラス**を使うと**内部クラスにとっての外部クラスのインスタンス(エンクロージングインスタンス)**にアクセスできるらしいです。
以下のコードはあくまでもイメージですが、ClassBからClassAにアクセスような感じでしょうか？

```kotlin
class ClassA {
  val id = "ClassAですよ"
  class ClassB() { 
    fun getOuterId() : String = ClassA.id
  }
}
```

はっきり言って説明されてもよくわからないので実際にコードを書いて確認してみます。

## 実践する

Kotlinではクラス定義にInner識別子をつけることで内部クラスを定義できます。
なので外部クラスとしてOuterクラス、内部クラスとしてInnerクラスを定義しました。

``` kotlin
class Outer {
    inner class Inner {
     ︙
    }
}
```

次に内部クラスの特徴であるエンクロージングインスタンスへアクセスするための仕組みを実装します。
内部クラスからエンクロージングインスタンスへは**this@クラス名.プロパティ名**でアクセスできるようです。
なのでOuterクラスにIDプロパティ、InnerクラスにGetOuterIdにてthis@Outer.idでアクセスします。

``` kotlin
class Outer {
    val id = "アウターですよ"
    inner class Inner {
      fun getOuterId() : String = this@Outer.id
    }
}
```

後はInnerクラスのインスタンスを生成してエンクロージングインスタンスへアクセスするのみです。
Innerクラスを生成するにはエンクロージングインスタンスが必要になるので
エンクロージングエンスタンスを生成したあとにInnerインスタンスを生成してIDプロパティを出力します。

``` kotlin
fun main(args: Array<String>) {
    val enclosing_instance = Outer()
    val inner = enclosing_instance.Inner()
    println(inner.getOuterId())
}

Output
------------------------------------------
アウターですよ
Process finished with exit code 0
------------------------------------------
```

無事、エンクロージングインスタンスにアクセスすることができました。

## おわりに
調べたこと実践したことをまとめます。

* 内部クラスを作るときはClassにinner識別子をつける。
* 内部クラスを定義すると内部クラスのインスタンスからエンクロージングインスタンスにアクセスすることができる。
* 内部クラスのインスタンスからthis@クラス名.プロパティ名でエンクロージングクラスにアクセスできる。
* 内部クラスを生成するときにはエンクロージングクラスが必要になる

## 参考
以下の書籍・記事を参考にしながら本記事を作成しました。

* [Kotlin in Action](https://book.mynavi.jp/ec/products/detail/id=78137)
* [インナークラスとは](http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000889.html)
* [エンクロージングインスタンスとは](http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000994.html)
商用レベルなiOSオープンソースアプリ集 (Macアプリも追加)

# はじめに

[Android版]
(https://qiita.com/takaaki7/items/92af58c55dca39a4faed)のオープンソースアプリ集はあるがiOS版が存在しなかったので投稿しました。

選定基準は以下の通りです。

- 使用者数が百万人レベルを超えている？
- コードのほとんどがSwiftあるいはObjective-Cで実装されている(ハイブリットアプリや非UI部分がC/C++で実装されたアプリ(VLC、Chrome等)は除く)。
- アプリではなくても主要なUIが公開されている(TwitterKit)。

# Wikipedia [(GitHub)](https://github.com/wikimedia/wikipedia-ios) [(AppStore)](https://apps.apple.com/us/app/wikipedia/id324715238)

- 典型的なMVC＋iOSのマナーに沿ったクラス構成。
- 普通な開発組織が目指すべき実装?
- Swiftに移行中でほぼ完了している。
- 行動分析系の処理の設計は参考になる(〜Funnelクラス)。
- カテゴリークラスの設計方法は参考になる。
- モデルにはほとんどテストを入れている。UIは一部はSnapshotをとってテストを入れている。

# WordPress [(GitHub)](https://github.com/wordpress-mobile/WordPress-iOS) [(AppStore)](https://apps.apple.com/us/app/wordpress/id335703880)

- Swiftに移行中
- AppDelegateが肥大化していたり、UIとModelが混じっているところあったりして、クラス設計の健全度はWikipediaより劣る。

# Kickstarter [GitHub](https://github.com/kickstarter/ios-oss) [(AppStore)](https://apps.apple.com/us/app/kickstarter/id596961532)

- 有名な実装。MVVM+ReactiveCocoaを使用
- Swiftで実装
- テストを含めてこの実装は精鋭で固めないと無理？
- ViewModelまでがっつりテストを書いている。一部のViewはスナップショットを撮っている。

# FireFox [(GitHub)](https://github.com/mozilla-mobile/firefox-ios) [(AppStore)](https://apps.apple.com/us/app/firefox-private-safe-browser/id989804926)

- オブジェクト指向的なクラス分割はあまりしてない？
- UI系のユニットテストには力を入れていて、KIF＋Earl Grayをフルに活用しており、その面では非常に参考になる。

# TwitterKit [(GitHub)](https://github.com/twitter/twitter-kit-ios)

- アプリではないが主要部分が公開されている?のでここに載せる。
- 典型的なMVC
- MVCにかかわらずモデルからView、ViewControllerまでテストコードがある。プロダクト、テストコードともObjective-Cなのが残念なところ。
- View、ViewController系のテストはメソッドを叩いてDelegateが呼ばれるか否かを確認するようなクラス設計の健全性を担保するのみのテスト。
- これも普通な開発組織が目指すべき実装なので、Swiftで作り直して欲しい。。。

# CotEditor [(GitHub)](https://github.com/coteditor/CotEditor) [(AppStore)](https://apps.apple.com/jp/app/coteditor/id1024640650?mt=12)

- Mac アプリだがコードが綺麗なのでここに載せる。
- 典型的なMVCでNSViewControllerを活用した構成。
- 直感的な非常にわかりやすい構成。
- モデル層のみテストを入れている。

# VLC [(GitHub)](https://github.com/videolan/vlc) [(AppStore)](https://apps.apple.com/us/app/vlc-for-mobile/id650377962)
- 動画プレーヤーのiOS版

# ProtonMail [(GitHub)](https://github.com/ProtonMail/ios-mail) [(AppStore)](https://apps.apple.com/us/app/protonmail-encrypted-email/id979659905)
- メールアプリ
これからのシステム開発にご期待ください。

これからのシステム開発にご期待ください。

# title by

[コピーメカ/キャッチコピー自動作成サイト](http://www.copymecha.com/index.php)

# 元タイトル

クライアントの具体的な問題解決をするためには、業務上の現実的問題を深く理解しておかなければいけないという、原点回帰な話

# Inspired by

[お客様が望むのは売上アップだけではない。思い込みを捨てなければ価値ある提案はできない - 株式会社ロカラボ](https://localab.jp/blog/what-clients-want-is-not-just-sales-up/)

# ブログで書かれていることの私的解釈

- お客さんに向かって「売上を上げますよ！」という提案をしない
- たとえば野球選手に「ホームランを打てますよ」とか売りかけるセールスマンがいたとして、一笑に付されて、まったく胸に響かないと思う
- 問題意識の強いクライアントほど、より具体的な悩み、ごく現実的な要求を持っているはず

>「お客様が全員、売上や集客に困っているんじゃないか」
>と思い込んでしまいがちです。

# システム開発においても、思い込みは必ず覆される

90%はA路線だろう、と思って1分の確認をすると、B路線もC路線もどんどん出てきたりする。

>思い込みがあると
>「こんな当たり前のこと聞くの失礼になるかも」
>と考えてしまい、確認しなくなります。

僕らが以下にクライアント業務を理解できていないかという振り出しに、何度でも立ち返る必要がある。

ちょっとした会話と、会話しても無駄だろう、全て理解できているだろうという錯覚を滅ぼすことで。

# クライアントの具体的な問題にフォーカスして、提案する

- クライアントの問題を理解していなければ、「経路的」な問題解決はできない
- 仮に誰にでも思いつく「売上を上げる」ということが薄っぺらい1mmの提案だとしたら、より複雑で途中経過的な問題解決提提案は、クライアントの業務、業務的問題をを理解していなければ絶対にできない
- 問題を理解せずして提案することはできないが、問題を理解しているという思い込み自体が危険だ

>「今ある御社のデータを可視化して整理できますがご興味ありますか？」
>というような提案の方が、お客様の欲求に刺さりやすいのではと思っています。

# Ref

https://twitter.com/yutakarai/status/1083832514395828224

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">【ブログ更新】お客様が望むのは売上アップだけではない。思い込みを捨てなければ価値ある提案はできない <a href="https://t.co/awpSAUx6cI">https://t.co/awpSAUx6cI</a></p>&mdash; 荒井豊🤖腹を割って話そう (@yutakarai) <a href="https://twitter.com/yutakarai/status/1083832514395828224?ref_src=twsrc%5Etfw">January 11, 2019</a></blockquote>



---

https://twitter.com/yumainaura

https://github.com/YumaInaura/YumaInaura/issues


https://github.com/YumaInaura/YumaInaura/issues/348








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
FlutterでAndroidの日本語フォントが正しく表示されない対応 (1.0.0)

以下の情報を元に試してみましたが、1.0.0では、日本語フォントが中華フォントになる問題は解決しませんでした。

- [FlutterでAndroidの日本語フォントが正しく表示されない \| backport](https://backport.net/blog/2018/08/28/flutter_cjk_issue/)
- [Flutter and CJK font selection 2 – Tetsuhiro Ueda – Medium](https://medium.com/@najeira/flutter-and-cjk-font-selection-2-2ba06e32dd8d)

### 解決策
多言語化のライブラリ flutter_localizations を空で仕込んどくと解決できました。

**pubspec.yaml**

```
dependencies:
  flutter:
    sdk: flutter
  flutter_localizations: <- 追加
    sdk: flutter
```

**main.dart**

```
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      // Delegate には、flutter_localizations 標準のものだけを設定
      localizationsDelegates: [ 
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('ja', ''), // Japanese
      ],
      home: MyHomePage(title: '今骨累直'),
    );
  }
}
```

*検証環境*

```
$ flutter --version
Flutter 1.0.0 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 5391447fae (6 weeks ago) • 2018-11-29 19:41:26 -0800
Engine • revision 7375a0f414
Tools • Dart 2.1.0 (build 2.1.0-dev.9.4 f9ebf21297)
```

以上