OmniAICreator/Qiita-1.07M huggingface dataset:
P2P地震情報 JSON APIの紹介と活用事例


[国産Web API Advent Calendar 2018](https://qiita.com/advent-calendar/2018/apijp) 23日目の記事です．
[P2P地震情報](https://www.p2pquake.net/)で提供しているJSON APIを紹介します．


# P2P地震情報 JSON API

## 概要

[JSON API | P2P地震情報 ガラクタおきば](https://www.p2pquake.net/dev/json-api/)
…このAPIは，次の情報をJSON形式で取得することが出来ます．

- 気象庁 地震情報
- 気象庁 津波予報
- 地震感知情報 （P2P地震情報ユーザからの「揺れた！」という情報）

## 利用方法

`https://api.p2pquake.net/v1/human-readable` にアクセスするだけです．
パラメタ `limit`(1〜100) で取得件数を制御できます（直近100件．

HTTPレスポンスヘッダに`Access-Control-Allow-Origin: *`を設定しており，どのオリジンからでもアクセスが可能です．

```shell
$ curl https://api.p2pquake.net/v1/human-readable?limit=2 | jq
```
```json
[
  {
    "_id": {
      "$oid": "5c19111af837cf25af9bb6b5"
    },
    "time": "2018/12/19 00:24:07.215",
    "code": 551,
    "issue": {
      "type": "DetailScale",
      "source": "気象庁"
    },
    "earthquake": {
      "time": "19日0時18分",
      "maxScale": 20,
      "domesticTsunami": "None",
      "hypocenter": {
        "name": "宮城県沖",
        "depth": "50km",
        "magnitude": "3.9",
        "latitude": "N38.3",
        "longitude": "E141.7"
      }
    },
    "points": [
      { "scale": 20, "addr": "石巻市" },
      { "scale": 10, "addr": "東松島市" },
      { "scale": 10, "addr": "大崎市" },
      { "scale": 10, "addr": "女川町" },
      { "scale": 10, "addr": "相馬市" }
    ]
  },
  {
    "time": "2018/12/19 00:19:02.297",
    "code": 5610,
    "count": 13,
    "regions": {
      "東北": 11, "関東": 2
    },
    "prefs": {
      "宮城": 9,  "岩手": 1,  "福島": 1,  "埼玉": 2
    },
    "areas": {
      "宮城北部": 2, "宮城南部": 7, "岩手沿岸南部": 1, "福島中通り": 1, "埼玉南部": 2
    }
  }
]
```

レコードの種類は `code` キーで識別でき，`551`は地震情報，`552`は津波予報，`5610`は地震感知情報を表します．

細かいフォーマットは [JSON API | P2P地震情報 ガラクタおきば](https://www.p2pquake.net/dev/json-api/) をご覧ください．

### サンプル

取得結果を一覧表示するRubyスクリプトのサンプルです．

[epsp-utils/json\_api\_reader at master · p2pquake/epsp-utils](https://github.com/p2pquake/epsp-utils/tree/master/json_api_reader)


```shell
$ ./example.rb
地震情報 21日13時13分 震度2 福島県沖(50km, M4.1) 津波の心配なし
地震感知情報 21日13時13分 埼玉(9) 福島(7) 東京(3) 茨城(3) 宮城(2) 千葉(2) 群馬(2) 神奈川(2) 兵庫(1) 北海道(1) 栃木(1)
地震情報 21日6時01分 震度3 胆振地方中東部(30km, M3.5) 津波の心配なし
震源情報 21日6時01分 震度不明 胆振地方中東部(30km, M3.5) 津波の心配なし
震度速報 21日6時01分 震度3  津波有無は調査中
地震感知情報 21日06時01分 北海道(3) 千葉(1) 埼玉(1)
遠地地震 21日2時02分 震度不明 ロシア、コマンドル諸島(-1km, M7.3) 津波の心配なし
地震感知情報 21日02時07分 千葉(1) 静岡(1) 北海道(1)
地震情報 20日18時46分 震度1 岩手県内陸南部(10km, M3.0) 津波の心配なし
地震情報 20日18時12分 震度1 茨城県南部(60km, M3.0) 津波の心配なし
```

## 活用事例

知名度のないAPIですが，平均26万アクセス/日の利用があり，そこそこ使われているようです．
ただし，利用報告等は求めていないため，全容は不明です．

ここでは，利用報告を頂いた or 利用されているのを見つけた事例を紹介します．

### スマートスピーカ

- [各地の地震情報 | Google アシスタント](https://assistant.google.com/services/a/uid/000000c644b2a598?hl=ja)
- [Amazon.co.jp： 地震スコープ: Alexaスキル](https://www.amazon.co.jp/dp/B079RHGZ3W)

### エディタプラグイン・パッケージ

- [haya14busa/eew.vim: 緊急地震速報 on Vim](https://github.com/haya14busa/eew.vim)
- [syohex/emacs-eew: Japanese Earthquake Early Warning for Emacs](https://github.com/syohex/emacs-eew)
- [tgfjt/Sublime-eew](https://github.com/tgfjt/Sublime-eew)

# まとめ

地震情報や地震感知情報を取得できるP2P地震情報 JSON APIの紹介でした．

リクエストが30回/分を超えない程度であれば制限はありません，使えそうな場面があれば使ってみてください．
メモ：「３０日でできる！OS自作入門 」9日目

## メモリ管理

1) ソースの整理
- keyboard.c, mouse.c に切り出す

2) メモリ容量をチェック
- キャッシュを一旦無効
- 386　か 486 以降かチェック
    - EFLAGS_AC_BIT(0x00040000) がセットされてれば 486
- CRO_CACHE_DISABLE　(0x60000000) フラグをセット （CR0 レジストに入れるだけ）
- あるメモリレンジに書き込みしてみて期待通りになっているか確認する
- この段階では qemu 上 memory 3072MB と表示されっちゃう

3) メモリ容量チェック２
- コンパイラーが最適化されて期待の処理ではなかった
- ということでC言語ではなくアセンブリでささっと書くｗ


![スクリーンショット 2018-12-22 17.18.50.png](https://qiita-image-store.s3.amazonaws.com/0/109145/6a46930c-6ad3-1d5d-e866-0623a20a07a8.png)

4) メモリ管理
- 128M / 4k = 32k ブロック分ける方法
    - char a[32768]; にして、使ったものを 1, 空きを 0 にして管理とか
    - もっと大きなデータ量ほしい場合は連続もブロックを返すとか
- フロッピーディスクは 512 で区切ってるとか
- 3G のメモリの場合は 32k　ブロックにする方法とか、ビットで管理とかすれば割合が良くなるとか

- レンジで分けて管理する方法
    - x 番地 (address) から n バイト(size) を free[0], free[1] 。。。として管理していくイメージ
    - これを使って malloc 見たいなものを実装、allocate できるブロックは固定
    - free は多少複雑
        - この実装の free は初期化もしている
        - allocate したいアドレスの前と後ろのブロックもチェックしている、うまく挿入できなかった場合はエラーにしていると理解した。

- メモリ容量とFree情報。(2) はなんブロック使っているか自分で追加したもの

![スクリーンショット 2018-12-22 22.25.57.png](https://qiita-image-store.s3.amazonaws.com/0/109145/5ffcca18-d9b2-8fab-7801-e68ee6ea62bf.png)
【CSS】おしゃれなデザインのボタンをBttn.cssで実現する【ライブラリ】

おしゃれでカッコイイボタンを作りたいんだけど、CSSはあんまり・・・ということで、フリーのライブラリ[Bttn.css](https://bttn.surge.sh)を使って、簡単・お手軽に作ってみようと思います。
公式サイト:link:[Bttn.css](https://bttn.surge.sh)

# １．ダウンロード
サイトトップにいきなり「Download」ボタンがあります。
これをポチって、CSSファイルをダウンロードします。これだけでOK:ok_hand_tone3:
![001_075.png](https://qiita-image-store.s3.amazonaws.com/0/188980/79ae357f-d2ab-6e26-7d24-183d49868906.png)
「Github Repo」ボタンはGithubへのリンクです。今回は使いません。

# ２．インストール
ダウンロードしたファイルを、シンプルにlinkタグで定義するだけ。

```HTML
<link rel="stylesheet" href="./bttn.min.css">
```

# ３．使ってみる
13種類のスタイルと６種類の色が定義されてます。
サイズも４種類あるので、その組み合わせは312通り :exclamation:

## ３－１．色を選ぶ
冒頭の「Download」ボタンの下に、６色の丸があります。
一番右は、すごく見にくいですが、白色です。
![003_100.png](https://qiita-image-store.s3.amazonaws.com/0/188980/916b0d77-f16f-240f-4261-03b83e3aaa92.png)
この６色が使える色で、ポチポチすると色が切り替わってシミュレーションできます。
そして、それぞれの色の名前は以下の通りです:art:

| 色 | class名 |
|:-:|:-:|
| 青 | bttn-primary |
| 黄 | bttn-warning |
| 赤 | bttn-danger |
| 緑 | bttn-success |
| 紫 | bttn-royal |
| 白 | bttn-default |

## ３－２．サイズを選ぶ
用意されているサイズは次の４つ:point_down_tone3:

| サイズ | class名 |
|:-:|:-:|
| 極小 | bttn-xs |
| 小 | bttn-sm |
| 中 | bttn-md |
| 大 | bttn-lg |
横に並べて比較してみると、こんな感じ。
※左から順に、極小 / 小 / 中 / 大
![004_100.png](https://qiita-image-store.s3.amazonaws.com/0/188980/7f8c2e1d-6211-9eb1-11f7-89c872f848ce.png)
極小サイズはちょっと押しにくそうです:sweat_drops:
スマホだと最低でも中サイズくらいでしょうか。

## ３－３．形を選ぶ
13種類用意されてる中で、今回はSimpleを使ってみます。
![002_085.png](https://qiita-image-store.s3.amazonaws.com/0/188980/7d19acbf-b855-c91b-5a4b-ea9d5f8a4c7a.png)
なんてことはないです。今まで選んだ色とサイズ、形をclassに指定するだけです。

```html
<button class="bttn-simple bttn-md bttn-primary">bttn.css</button>
```
あっという間に、青色＆中サイズ＆Simpleスタイルのボタンが出来ました！:arrow_down:
![005_100.png](https://qiita-image-store.s3.amazonaws.com/0/188980/2fe5b3fa-a0e4-e8b2-2264-fddd32ee4779.png)

# ４．こんなにいらない
13種類も形があるのは、選択肢が豊富でありがたいのですが、実際に13種類全部使うかというと、そうでもない・・・。
特定の１つか２つくらいだけです。

そんな時は、必要なスタイルだけ入ったCSSをダウンロードすればよいのです:bulb:
各スタイルをマウスオーバーすると、クラウド:cloud:マークが浮き上がってきます。
![006_075.png](https://qiita-image-store.s3.amazonaws.com/0/188980/03dc335a-d573-b41c-e21b-d0de87920c54.png)
このクラウドマークをクリックすると、（上記の図の場合）SimpleスタイルのみのCSSがダウンロードできます。
最初にダウンロードした「全部入り」が33KBなのに対して、スタイル１つだけだと5KB前後と、かなり軽量化されます。

## ４－１．小さいCSSを使ってみた
先ほどSimpleを使ったので、今度はFloatをDLしてみました。

```html
<html lang="ja">
<head>
  <link rel="stylesheet" href="./float.css">  /* DLしたスタイル指定のCSS */
</head>
<body>
  <button class="bttn-float bttn-md bttn-primary">bttn.css</button>
</body>
</html>
```
できたー:tada: :raised_hands_tone3:
読み込むCSSを変えるだけなので、使い方は同じです。
![007_100.png](https://qiita-image-store.s3.amazonaws.com/0/188980/304d1e5c-e33b-669d-1577-23c88e134e2e.png)

# まとめ
こういうライブラリは「全部入り」なことが多い気がしてて、スタイルごとにDL出来るのはあんまり見たことないです。
あと、シンプルなものからちょっと凝ったものまで、形のバリエーションが豊富:exclamation:

ぜひ使ってみてくださいー。
Qiitaでいいねが付かない？リアルSEOな口コミで拡散！って口実で人類平和を目的にプログラマ同士のゆるコミュニティを作りたい大阪Web開発システムエンジニア。


# スタバでドヤ顔でMacBookに自分のQiitaページを開きっぱなしにして遠くから見守る

隣にPythonエンジニアが座ったらしき今日の大阪スターバックスMeRISE、関西大学の施設でスタートアップカフェもあるツタヤブックス

「絶対隣でQiita開いて、その人が席を立ったらチラ見るするでしょ？」といってしばらく席を外れてみた

結果は知らない


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/991c30cf-1786-21a3-17d0-ad5e9e9d2afb.png)


# スタバや学習室に来ている若手学生初心者Javascriperが気になる本を開いていたので勢い余って話しかけてみる

しれっと自分のQiitaを宣伝してみるステマ。「Qiitaとかやってます？」「僕も大好きでねえ」「記事1000個ぐらい書いてますけど！」「いいね一番ついてるのが初心者向け記事で」「これよ、これ」「Google検索しても出てくるよ」「忘れないでしょ？」白々しいぐらいにステマ。

学生よ大志を抱け。おじさんプログラマも大変心機一転の原始的衝動思い出すきっかけになりました。ありがとう。

見てたら連絡くださいね‥！ おじさんJquery全然わからないので、むしろ教えてください。

[閲覧禁止セルフまとめ！大阪関西大学MeRISE TSUTAYAブックストア スターバックスでJqeryを勉強中の学生に社会人Ruby on Railsエンジニアが話しかけた！ - Togetter](https://togetter.com/li/1300936)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/59f8acde-08aa-bba2-fd4a-de9da7edc344.png)


# 人見知りで勉強会も苦手だったけど、ちょっとゆる楽しそうなリアルコミュニケーション交流会に参加表明してみる、情報源はTwitter

Twitterで見かけたプログラマ交流会に勢いで参加してみる、なにもわからない状況だけどノリと勢い優先でLT登壇を宣言してみる！

大阪IT勉強会のタイムラインを見てみたら、ちょうどタイミングも良くて楽しげだったので、2019年大阪登壇してみたい

https://twitter.com/osaka_it/status/1075971038062665728

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/91946c2e-ccbb-fd1d-d80a-4c683e5e5da2.png)









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
JSTQB テストマネージャ試験に3回落ち、4回目に合格して考えたこと

## はじめに
「資格試験の勉強」は「仕事」とは切り離して考えがち。
「資格とったからって仕事できるようになるわけではないし」
「資格持ってなくても、テストできるもん」とかいう声をたまにききます。

まあ、そうです。
でも、
試験のために勉強したことが仕事に活かせることもたくさんあるし、
仕事でやったことが資格合格・スキルアップにつながっていく。

ということをJSTQB(Japan Software Testing Qualifications Board) 
Advanced Level テストマネージャ試験を受けてみて改めて思ったので、
アドベントカレンダーに書くことにしました。

※JSTQBとは･･･日本におけるソフトウェアテスト技術者資格認定、詳細は[こちら](http://www.jstqb.jp/committee.html)


## 2018年10月：JSTQB AL TM(テストマネージャ)試験に合格

同僚にはサクッと受かったような顔をしていたけど、
実は、この試験を受けるのは4度目:neutral_face:

## JSTQB 受験歴

 - 2014年まで：SIerで10年位、基本設計から総合テストまでといった案件をいくつか経験
 - 2014年10月：JSTQB FL合格
 - 2014年11月：第三者検証会社に転職
 - 2015年08月：JSTQB AL TM 1回目受験　不合格 :expressionless:
 - 2016年08月：JSTQB AL TM 2回目受験　不合格 :expressionless:
 - 2017年08月：JSTQB AL TM 3回目受験　不合格 :expressionless:
 - 2018年08月：JSTQB AL TM 4回目受験　合格 :relaxed:

1回目受験直後の感想
「おもしろい問題だったな、合格してたらもう受けられないのか。。。ちょっと残念」
→天の声 :angel: 「あと3回受けられますよ」

## なんで合格できたのか？
勉強方法は1回目からほとんど変えてない、
（シラバスとシラバス掲載の参考書籍読んだり、[模擬問題サイト](http://squaring.jp/others/index.jsp)の解説読んだり）
そして、**試験対策のための勉強時間は受験回ごとに減っている**
でも、受験回ごとに自信を持って解ける問題は増えていた。

ということは、
**「仕事(関係)でやってきたこと」**
が、ちょっとずつテストマネージャのスキルアップにつながっているのでは？
と思い、第三者検証会社に転職してきてから、この4年間を振り返ってみることにした。

## この4年間をTMのシラバスとともに振り返り

◎：仕事で検討・実施
〇：仕事以外で勉強(勉強会、書籍）
△：JSTQB資格対策で勉強
×：あんまり考えていない or なんとなくまわりと同じようなやり方をする

というかんじで、シラバスの章ごとにだいたいのマッピングをしてみました。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/37182/7b8c7adc-7c9e-6941-262c-79c8a2f8294c.png)

[※ISTQBテスト技術者資格制度　AL シラバス 日本語版 TM Version2012.J03](http://www.jstqb.jp/dl/JSTQB-Syllabus.Advanced_TM_Version2012.J03.pdf)

2014年：ツールとか自動化はやってたけど、テストについて特別に考えていない頃
2015年：入社直後、テスト設計からテスト実行、案件管理をがんばる
2016年：テストプロセス改善技術を知って社内や社外の人と研究会で勉強し始める
　　　　業界標準を適用しなくてはならないプロセス重視の案件にアサインされ、
　　　　テストの成果物やレビューについても今までよりちゃんと考える必要が出てくる
2017年：個別テスト計画、マスターテスト計画などテスト設計より前の工程のアサインも増える


所属している会社はお客様の製品・システムのテストをする会社なので、
その時の、お客様の要望や、社内の体制、タイミングなどで
次にどんな案件の担当になるかはわかりません。

それでも、やっていることが少しずつ増えてきたのは
テストマネージャに必要なことを知ったことで、
チャレンジする領域をひろげていけたことがよかったのかなと思っています。

## まとめ
#### 資格試験のために勉強したことが仕事の現場で役に立つ
自分の引き出しが増えることにより、
何か問題が起きたとき、今よりよくしたいとき「あれが使えるのでは？」のヒントになる。
テストプロセスの改善技術を知って勉強したことによって
テストの現場では何が必要なのか、全体を意識して考えられるようになりました。
（まだまだだけど）


#### 仕事でやったことが資格合格・スキルアップにつながる
仕事でやったことは、少しずつ自分の力になっていく。
ただ、毎日の作業に追われていると、
今自分が何ができていて、どんなことが必要なのかわからなくなることがあります。
そんなとき、体系的に必要な知識を確認するためにも
資格試験の勉強をしてみることは有効だと思いました。


## おまけ
合格だけが目的ではないけど、試験に合格することはやっぱりうれしい。
次は、JSTQB AL TA(テストアナリスト）目指します。
OPEN MUCOM88

## はじめに

この記事は [音楽ツール・ライブラリ・技術 Advent Calendar 2018](https://adventar.org/calendars/3353) の 22 日目の記事です。

OPEN MUCOM88 とは PC-8801 シリーズ用 FM 音源ドライバーである "MUCOM88" のオープンソース版です。 [12/20 の OBSLive](https://freshlive.tv/obslive/255131) にて発表がされ、同日公開されました。

* [onitama/mucom88](https://github.com/onitama/mucom88)
* [MUCOM88 Windows](https://onitama.tv/mucom88/)
* [MUCOM88](https://www.ancient.co.jp/~mucom88/)

発表されてまだ間もないところなので、軽く見た感じで記事にしたいと思います。あまり深堀はできていませんがご了承ください。

## MUCOM88 とは

古代祐三氏によって開発された PC-8801 シリーズ用の FM 音源ドライバーです。一般向けには "MUSIC LALF" という名称で市販されていました。歴史的な背景は正確なところを語る自信がないので、 hally 氏の著作を是非ご一読ください。

* [チップチューンのすべて　All About Chiptuneーーゲーム機から生まれた新しい音楽](http://www.idea-mag.com/books/all-about-chiptune/)

※2018/12/23 追記
よく読み返してみたら MUCOM88 についての記述は特にされていませんでした。すいません。 MUCOM88 の前身となる SPLIT ～ MUCOM (Falcom ドライバー) については詳しく書かれています。全体的に読み応えのある良い本ですのでチップチューンに興味がある方へお勧めできます。


## OPEN MUCOM88 の構成

2018/12 現在の First Commit 版ではオリジナルの 88 版と Windows 版が公開されています。

* 88 版はオリジナルそのもので、 Z80 のアセンブラソースコードになっています。
* Windows 版については下記のような構成になっています。
    * Z80 + OPNA エミュレーターの上にオリジナルの MUCOM88 を実行させている構造のようです。
    * コアに音声再生エンジン自体が統合されているため、コア自体が Windows に依存しています。他プラットフォームで動かすにはこの部分の切り離しからになると思います。

ライセンスは CC BY-NC-SA 4.0 となっていますが、 Windows 版についてはドライバー本体以外にライセンスの異なるライブラリが使用されています (リポジトリに一緒にコミットされているので別途ソースコードを入手する必要はありません) ので利用の際は各種ライブラリのライセンスも要確認です。~~また、 Windows の GUI アプリケーションである MUCOM88 Windows のソースコードは含まれていません。~~ (12/23 訂正) 含まれていました (hspplugin/mucom88win.hsp) 。確認不足ですいません。

Windows 版はプロジェクト (src/mucom88.vcxproj) を開き、ビルドをすると "mucom88.exe" というコンソールアプリケーションが生成されます。 MML のコンパイル、再生はこれで試せるのでコアの使い方はこれを見れば基本的な使い方は理解できそうです。

First Commit 版ではビルドエラーが出ましたが、該当箇所は私が試した範囲では通ることがなかったようなのでコメントアウトでいけました。 (mucomvmm.cpp - 469 行目の SetHL(ans); をコメントアウト)

とりあえず MML をコンパイルして再生するコードはこんな感じでした。

```cpp
int main()
{
	CMucom mucom;
	mucom.Init();

	mucom.Reset(2);
	mucom.CompileFile("sampl1.muc", "sampl1.mub");

	mucom.Reset(0);
	mucom.LoadMusic("sampl1.mub");
	mucom.Play(0);

	mucom.PrintInfoBuffer();
	puts(mucom.GetMessageBuffer());

	while (!(GetKeyState(VK_RETURN) & 0x80000000))
	{
		::Sleep(100);
	}

	mucom.Stop();

	return 0;
}
```

* まず最初に Init を一度実行します。ウィンドウアプリケーションの場合はそのウィンドウのハンドルを指定します。
* コンパイルする前、曲ロードして再生の前等、大きな処理をする前には Reset をする必要があります。 Reset しないと正しく処理が行われません。
* PrintInfoBuffer と GetMessageBuffer を呼んでいるところは情報表示のためのものなのでなくても可です。
* 再生は別スレッドで行われています。コンソールアプリだと再生開始後にすぐ終わってしまうため、最後に GetKeyState ループで終了待機させています。


再生エンジンが組み込まれているので Windows で鳴らすだけだったら簡単なのでよいですが、自力で鳴らすようにしたい場合はかなり読んで再生エンジンの切り離しをしないといけないので逆に大変そうです。

## おわりに

とりあえずざっと試してみたところで記事にまとめてみました。

非常に有名なドライバーでありながら現代では入手自体が難しかったドライバーでしたが今回のオープン化、 Windows 対応により誰にでも使いやすいものになりました。オープンソース化により周辺環境に改善も進みそうですし、今後も楽しみです。

## ライセンス

本記事は OPEN MUCOM88 のライセンス ([CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ja)) に準拠します。 ([README.md](https://github.com/onitama/mucom88/blob/34a67312d39911a8b65d87ad41aa86b78bf59bcd/README.md) / [license.txt](https://github.com/onitama/mucom88/blob/34a67312d39911a8b65d87ad41aa86b78bf59bcd/package/license.txt))
Countlyのインストール

やってみたのでメモ
とは言ってもワンライナー

# 前提条件
- CentOS7

# 手順
1. rootユーザに切り替わる

    ```
    $ sudo su -
    ```

2. スクリプトを実行する

    ```
    # wget -qO- http://c.ly/install | bash
    ```

# 参考
- [Installing Countly server](https://resources.count.ly/docs/installing-countly-server)
SECCON 2018 オンライン予選 Writeup[unzip]

このブログは、[大国魂（ITブログ） Advent Calendar 2018](https://adventar.org/calendars/3489) の22日目です。

# この記事の内容について
インフラ運用者ではあるもののセキュリティに興味があるので SECCON 2018 オンライン予選 に参加した筆者が、良質な Writeup がたくさんあるにもかかわらず自身の振り返りも兼ねて解けた問題の Writeup を書いた、というものになります。

予選終了後、便利に参照させていただいていた記事は[こちら](https://qiita.com/nicklegr/items/51cbc4ff59d245646988)になります。

今回は最も簡単だった Forensics の unzip です。

# uznip 
解くうえで悩んだことがあれば記載しようとしていましたが、悩むことなく解けたので解き方のみ記載しています。

## unzip のファイルの中身について
### flag.zip
展開しようとすると暗号化された zip ファイルであり、中身に flag.txt が含まれていることがわかります。

### makefile.sh
以下の内容が記載されたシェルファイルとなります。

```
echo 'SECCON{'`cat key`'}' > flag.txt
zip -e --password=`perl -e "print time()"` flag.zip flag.txt
```

- 1行目は SECCON のフラグ形式の中に key というファイルの中身を cat で出力したものを flag.txt に出力している。
- 2行目は zip コマンドの -e オプションで flag.zip という名前で flag.txt を暗号化したうえで圧縮している。
 - この時指定されるパスワードは perl の -e オプションで time(エポックタイム) を表示したもの。

## 解法
- flag.zip が生成された時間 = 圧縮時点の時間となるため、この時間をエポックタイムに変換すれば zip をファイルを解凍できと想定。
- タイムスタンプは 2018/10/27 00:10:42 なのでエポックタイムに変換すると、1540566642 が得られます。
- 1540566642 を zip 解答時のパスワードに指定しても解答できないため、処理時間があると考えて 1秒前の 1540566641 を指定すると無事に flags.zip を回答できます。
- 展開された flag.txt に記載された `SECCON{We1c0me_2_SECCONCTF2o18}` がフラグとなります。

## 問題について
### 題意的な何か
メール誤送信対策に添付ファイルをパスワード付きzipにするという手法は多くの方が実施されているかと思います。
この作業を自動化しようという意図のスクリプトかと思いますが、今回のエポックタイムのように数字のみだとすぐに破られてしまいそうですね。
もう少し複雑なパスワード生成ツールを利用したワンタイムパスワードが安全そうではあります(破られないとは言っていない)

### 問題の中身
問題自体は Windows 上だけでも解ける(環境を選ばない)、初心者に優しいタイプの練習問題です。
コマンドの一つ一つがわからなくても、Windows であればググればよく、Linux や mac であれば、ターミナル上で man コマンドを打つだけで解けます。

### エポックタイム補足
エポックタイムについては適当な変換サイトを利用して解きましたが、Linux/mac であれば date を利用することで変換可能です。

```
[root]# date +%s --date "2018/10/27 00:10:42"
1540566642
```

Windows ではどうなんだ？と気になったので調べてみたら、[こちらの記事](https://qiita.com/tsubasaxZZZ/items/ca95ecb129acabb7fba8)を参考に PowerShell でできました。

```
PS C:\> ((Get-Date "2018/10/27 00:10:42 GMT") - (Get-Date "1970/01/01 00:00:00 GMT")).TotalSeconds
1540599042
```

ワンライナーで出せるものの、1970/1/1 を引き算しないといけないのがひと手間かかる感じですね。
swift4.2の変更点


4.2が出てだいぶ時間もたったのですが、現状まだ4.0を使ってるので備忘録として変更点をまとめておきます。

## Bool型を .toggle()で反転できる
true or false の反転がしやすくなった

```swift
    var isMoved = false
    isMoved.toggle() // trueになる
    
    // こうも使える
    sampleView.isHidden.togle()
```

## self = self
selfのアンラップ時に

```swift
  guard let `self` = self else { return } 
```

って書いてたのがそもそもコンパイラのバグで、 4.2からは以下のように書けるようになりました。

```swift
  guard let self = self else { return } 
```



## ランダム周りの変更
かなり便利になった
arc4randomとのお別れ。UIntから変換する必要もなくなった。

```swift
// 0から99のどれか ex> 10
let randomNumber = Int.random(in: 0 ... 99) 

let array = ["hoge", "huga", "piyo"]

// 配列のうちどれか ex> "huga"
let randomElement = array.randomElement() 
// 順番の入れ替え ex> ["piyo", "hoge", "huga"]
let shuffledArray = array.shuffled() 


```
毎度検索するhostsファイルの場所【Win・Mac・Linux】

毎度忘れた頃に開発等で必要になるhostsファイルの変更と設定。
おなじみのネタですが、（自分に対して）いい加減覚えろ、ということで備忘録として残しておきます。

# Windows 10
7, 8 / 8.1等も同じはず。

```
C:\Windows\System32\drivers\etc\hosts
```

# Macintosh
High Sierraで確認。
`/etc/host` としてシンボリックリンクが貼られているので、`/etc/hosts` でも編集可能

```
/private/etc/hosts
```

### DNSキャッシュの削除
```
$ sudo killall -HUP mDNSResponder
```

# Linux
```
/etc/hosts
```

# ブラウザで反映させる方法
こちらが参考になります。
[hostsファイルの変更をブラウザで即反映させる方法](https://qiita.com/mickey390/items/dd062935e1c54bc25545)
scpコマンド

#scpコマンド
リモートマシンとローカルマシン、あるいはリモートマシン同士でファイルをコピーする際に使用するLinuxのコマンド。
通信には`ssh`を使用する。sshコマンドと同じ認証でデータ転送の通信を暗号化する。

sshを使用するため、ssh接続をできるようにしておく必要があります。


#scp
```
$ scp [オプション] コピー元パス 保存先パス
```

###オプション

| オプション | 説明 |
|:--|:--|
| -i 鍵ファイル | ssh接続に使用する鍵ファイルを指定する |
| -P ポート番号 | (sshのポートを変更している場合などに)接続に使用するポートを指定する |
| -p | コピー元のタイムスタンプやパーミッションを保持する |
| -r | ディレクトリごと再帰的にコピーする |

###パス
パスは以下のような構成で書きます。

```
ユーザ名@サーバのホスト名(or IPアドレス):コピーしたいファイル、もしくは保存先のパス
```

ローカルの場合は`ユーザ名@サーバのホスト名(or IPアドレス):`を省略できる。

####リモートのファイル(test.txt)をローカルのカレントディレクトリへコピー
```bash
$ scp user@xxx.xxx.xxx.xxx:~/test.txt ./
```

####ローカルのカレントディレクトリのファイル(test.txt)をリモートのホームディレクトリ直下へコピー
```bash
$ scp test.txt user@xxx.xxx.xxx.xxx:~/
```
MongoDBのインストール

やってみたのでメモ

# 前提
- CentOS7

# 手順
1. リポジトリ情報を登録する

    ```
    # vi /etc/yum.repos.d/mongodb-org-4.0.repo
    ```
    
    ```mongodb-org-4.0.repo
    [mongodb-org-4.0]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.0/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
    ```

2. yumでインストールする

    ```
    # yum install -y mongodb-org
    ```

3. 起動する

    ```
    # systemctl start mongod
    ```

# 参考
- [Install MongoDB Community Edition on Red Hat Enterprise or CentOS Linux](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/)
ElmでpreventDefaultなフォームを作る

Elmのバージョンは0.19
以下の `onSubmitWithPrevented` のような関数を定義すればよい。

```elm
import Json.Decode as JD

-- 省略...

onSubmitWithPrevented msg =
    Html.Events.custom "submit" (JD.succeed { message = msg, stopPropagation = True, preventDefault = True })

view : Model -> Browser.Document Msg
view model =
  {
    title = "Simple form example",
    body = [
      Html.form [onSubmitWithPrevented StartsLoggingIn] [
        div [] [
          label [] [
            text "email:",
            input [type_ "email", placeholder "Your email", value model.newLogin.email, onInput UpdatesLoginEmail] []
          ]
        ],
        div [] [
          label [] [
            text "password:",
            input [type_ "password", placeholder "Your password", value model.newLogin.password, onInput UpdatesLoginPassword] []
          ]
        ],
        div [] [
          button [] [text "login"]
        ]
      ]
    ]
  }
```
参考: https://stackoverflow.com/questions/52541501/why-cant-i-use-onwithoptions-in-elm-0-19
番号を振る・振りなおす Excelマクロ

### 1. はじめに
「ドキュメンテーション？ Editor使ってMarkdownで書くよ！」という人は、
端からこんな記事読まないはず。

資料はすべてExcelで作るのがルール、というウチのような職場にお勤めの方に、
もしかしたらちょっと役立つかもしれない、
番号を振ったり振りなおしたりする、ただそれだけのExcelマクロです。


### 2. 動作例
![01.PNG](https://qiita-image-store.s3.amazonaws.com/0/164214/d53ed8f3-9b14-6047-d6a7-6bdec7bee52f.png)
![02.PNG](https://qiita-image-store.s3.amazonaws.com/0/164214/e25724a5-65da-d48d-5ae0-08881ad5146d.png)
![03.PNG](https://qiita-image-store.s3.amazonaws.com/0/164214/4af5d1fb-8c6f-3e35-dbf5-8d9a8592f670.png)

### 3. ソース
※参照設定： Microsoft VBScript Regular Expressions 5.5

```vb
Sub Numbering()
    Dim r As New RegExp, c As Range, i As Long, v As String
    r.Pattern = "^[0-9]+"
    For Each c In ActiveWindow.RangeSelection.SpecialCells(xlCellTypeConstants)
        i = i + 1
        v = c.Value
        c.Value = IIf(r.Test(v), r.Replace(v, i), i & "." & v)
    Next
End Sub
```

### 4. 解説
……するほどのものでもないですが、
選択範囲を`Selection`とせずに`ActiveWindow.RangeSelection`としたのは、
図形とかを選択していた時のエラーを避けたかったから。
（インテリセンスを効かせたかったというのもある。）
そのくせ、選択範囲に何もないと実行時エラーになることには目を瞑るダブスタぶり。
ほかにも、数字以外（ABC、アイウ、①②③）や多階層（1-1-1.）への対応など、
色々とあるんですが、やめときます。（ちょっとした、の域を超えそうなので。）
Ubuntu 18.04LTSにnvidia-docker2をインストールする際のエラーについて

# 状況
新しいPCにubuntu 18.04LTSを入れ、nvidia-docker2をインストールしようとしたところ、参考にした記事のままではうまく行かなかったので、メモしておきます。

まず、
https://qiita.com/myyasuda/items/cb8e076f4dba5c41afbc
を参考に、docker-ceをインストールしました。

その後、
https://qiita.com/sabaku20XX/items/f7cc8fd614ea7c15034e
を参考にnvidia-docker2のインストール作業を進め、

```
sudo apt-get install -y nvidia-docker2
```

を実行したところ、

```
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:

以下のパッケージには満たせない依存関係があります:
 nvidia-docker2 : 依存: docker-ce (= 5:18.09.0~3-0~ubuntu-bionic) しかし、5:18.09.1~2.1.rc1-0~ubuntu-bionic はインストールされようとしています または
                          docker-ee (= 5:18.09.0~3-0~ubuntu-bionic) しかし、インストール
することができません                                                                    
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
```

とのエラーが発生し、インストールできませんでした。

# 解決法
上記エラー文のとおり、2018/12/22現在apt-get install で入るdocker-ceがnvidia-docker2の依存関係を満たさないらしいので、

```
sudo apt-get install -y --allow-downgrades docker-ce=5:18.09.0~3-0~ubuntu-bionic
```

として、docker-ceのバージョンを指定されたものにすると、nvidia-docker2をインストールすることができました。

# 追記
2019/06/07 スペルミスを修正(instlal->install)
CEのインストーラーUSBをSSDにしたお話

#はじめに

この記事は[Nutanix Advent Calendar 2018](https://adventar.org/calendars/3014#list-2018-12-22)の22日目の記事です。


朝からAOSのバージョンアップで休出をしていて日本酒けんちゃんというお店で20時から記事を書き始めております...
初めまして。仮想化というものを触り始めてまだ4か月くらいのインフラエンジニアの卵の殻ですがよろしくお願いします。
後ほどマークダウン形式で見やすく編集しなおしますので見にくいのはご容赦ください...


#Nutanixの求めるHW仕様確認
Nutanix support Portalにはこのようになっております。(参照先は以下のURLです。)
https://portal.nutanix.com/#/page/docs/details?targetId=Nutanix-Community-Edition-Getting-Started:com-sysreqs-ce-r.html

主な仕様については省略します。

今回の主題となるBoot deviceについては、Notes欄に

Nutanix has successfully tested and used external USB drives and internal devices such as a SATA DOM. USB 3.0 media recommended.

と記載があります。
なので、Sataの端子を使用したデバイスが使用できるのでは？と考え、やってみたところ起動したので手順を記載します。

#書き込みのやりかた
Nutanix Hyper Converged Infrastructure入門のUSBフラッシュの書き込みと同じようにPass mark soft wareにて最新版CEのイメージを選択し、書き込むだけなのですが、注意事項が1つあります。

SSDの接続を必ず外付け化ケースや変換基盤を使用しUSB接続にしてください。
このソフトの仕様で、USB接続のデバイスでないとSSDを認識しません。

#SSDへ推奨する環境(201812/23 03:23追記)
主にWestmere世代やSandy Bridge世代等のUSB3.0非搭載の古い環境の場合、USBフラッシュを使いたくない場合はこちらを推奨します。
USB2.0の状態でインストールを行いましたが、凄まじく時間がかかりました。

#HOT Tier SSDとの競合について(201812/23 03:23追記)
競合はしませんので同時使用可能です。
ただ、判別をするために小さい容量や、メーカーを変更することを強く推奨します。(中古の128GBモデルや64GBモデルは非常に安くMLCのものがまだありますのでそちらを使用されると幸せになれるかもしれません)

#謝辞
こちらのアドベントカレンダーへ誘ってくださり、そして、インフラ勉強会での色々なことについて構築、運用をされている@dozonoさん
CEのインストールのインストールでコケていたときにSLACKへお誘いいただきました@smzkstsさん
本当にありがとうございました。

これからも精進して、貢献できるようにいきたいと思いますのでよろしくお願いいたします。
【Xcode 10】 iOS Bundle Identifier (Bundle ID) を変更する。

# Bundle ID 変更のポイント
Xcode で project を作成する際に Bundle Identifier (Bundle ID) を入力しますが、App Store Connect で申請する時に間違って別の名前で登録してしまうことがあります。project 作成時の Bundle ID と App Store Connect 登録時の Bundle ID が異なると provisioning profile を紐付けることが出来ません。App Store Connect 側では ID を変更できないので Xcode 側の ID を修正する必要があります。
「 info.plist 」の画面で Bundle ID の名称を変更しても project の奥深くで変更が反映されないことがあります。
そんな時は、以下のようにします。

1) project ファイルの「 ○○.xcodeproj 」を右クリックして、「パッケージの内容を表示」を選択します。
![showPackageContents.gif](https://qiita-image-store.s3.amazonaws.com/0/193431/dd650f5d-cf04-6711-6827-581ca7da1709.gif)

2) 「 project.pbxproj 」をダブルクリックして開きます。
![projectpbxproj.gif](https://qiita-image-store.s3.amazonaws.com/0/193431/94ddf18a-4fec-7424-43a3-87f6c31a925b.gif)

3) 「 Find 」(command + F)で「 Bundle 」と検索すると
PRODUCT_BUNDLE_IDENTIFIER = com.hoge.CalendarLink;
のように Bundle Identifier が記録されている所が2カ所出てきます。
![editBundleID.gif](https://qiita-image-store.s3.amazonaws.com/0/193431/a7e87075-9b91-8259-3242-c0f0f8e0ce45.gif)
上記の「 com.hoge.CalendarLink 」の部分 (2カ所) を書き換えて保存すれば、project の最奥部から Bundle Identifier (Bundle ID) を変更することが出来ます。
ruby・putsの戻り値はnilになる

まず、メソッド　palindrome_tester を定義する。

```
def palindrome_tester(s)
  if s == s.reverse
   puts "It`s a palindrome!"
  else
   puts "It`s not a palindrome."
  end
 end
```
メソッドpalindrome_tester　を実行する。

```
puts palindrome_tester("racecar")
It`s a palindrome!

=> nil
```

戻り値としては nil が表示されている。

「It`s a palindrome!」という文言は、コンソールの標準出力であり、puts自体での戻り値は nil ということになる。
MacOSにHomebrewでtcmdump入れる時のメモ

MacOSにツール入れる時にHomebrewを使っていますが、偶然表題にあるtcpdumpを入れようとした時に少し躓いたのでメモがてら記載します。

# 前提条件
- MacOS Mojave
- Homebrew 
- tcpdump

# 手順
1. /usr/local/sbin ディレクトリをあらかじめ作成します (すでにある場合は不要)

    ```
    $ sudo mkdir /usr/local/sbin
    ```

2. 所有者を自分自身に変更します

    ```
    $ sudo chown -R `whoami`:admin /usr/local/sbin
    ```

3. `brew install`コマンドでtcpdumpをインストールします

    ```
    $ brew install tcpdump
    ```

4. パスを通します

    ```
    $ echo 'export export PATH="/usr/local/sbin:$PATH"' >> ~/.bash_profile
    ```

これで通るようになりました。
MissingFieldException: Field 'UnityEditor.Scripting.Compilers.ScriptCompilerBase._island' not found.

#詳細
他にも
Exception generating network code: System.Exception: Assembly Temp\Unity.TextMeshPro.dll does not exist!
Windows10
Unity2018.2.5をUnity2018.2.20にアップデートしてプロジェクト開いたら発生してました
症状としてはcompile error状態です
Package ManagerがWindowのところに表示されなくなったりもしました

https://forum.unity.com/threads/2018-3-0-b6-conflicts-with-incremental-compiler-solution-within.570865/
incremental compilerとtextmeshproを削除してmanifestからも消すんだ、と書いてありますが
そんなことしたらmissingだらけになって僕が死んでしまいます
#修正方法
Unity2018.2.5のPackage ManagerでIncrementalCompilerをRemoveしました
（一応気休めにTextMeshProを最新の1.3.0にしました
その後アップデートしたらうまくいきました

もしかしたらmanifestから直接incremantal compilerの項目を消しても治ったかもしれません
http://kan-kikuchi.hatenablog.com/entry/PackageManager
{unityprojectフォルダ}/Packages/manifest.json
時系列データの欠測値補間

# 概要
1. エネルギーデータの欠測値について
2. Excelで補間
3. pandasのinterpolateで補間  

# 使用データについて
* 下記のデータを使用します。

<img src=https://qiita-image-store.s3.amazonaws.com/0/148213/de828e27-efbb-9a91-dd08-a233e4ca6fa7.png width=50%>


# エネルギーデータの欠測値について
　エネルギーデータの種類はたくさんありますが、私が扱ったことのあるデータでは下記のような欠測が見られました。

# Excelで線形補間
　Excelで線形補間するには、下記の形で行っていました。
<img src=https://qiita-image-store.s3.amazonaws.com/0/148213/294b73c3-116c-266f-b63a-975f40098151.png width=50%>

# pandasのinterpolateで補間
pandasを用いると、下記のコードで補間できます。

```python:intepolate
df = pd.read_csv(r'C:\***\SampleData.csv',engine='python',index_col=[0],parse_dates=[0])

# axis=0で時系列の方向に補完することできます。
df.interpolate(axis=0)
```
<img src=https://qiita-image-store.s3.amazonaws.com/0/148213/82501cfb-194d-2016-afd1-c6cfa9ba7661.png width=50%>

# まとめ
* Excelでもやれなくはない。（少量の欠測であれば）
* pandas(Python)であれば、何列あってもこのコードだけで補間できる。
* データの量が多ければ多いほどpandas使う方が簡単に処理できる。
Opalのバグを見つけたら？

Opalは[ruby/spec](https://github.com/ruby/spec)をもとに互換性がテストされており([参考](https://yhara.jp/2016/12/07/opal-and-rubyspec))、完成度はとても高いですが、それでもたまに細かいところでバグを見つけることがあります。今回は別記事の執筆中にちょうどバグを見つけたので、本家にレポートするまでを解説します。

## バグ発見？

今回問題を見つけたのは、こんなコードを書いていたときでした。以下は正しく動くのですが、

```rb
    draw_thick_box(260, 240, 380, 360, C_WHITE, 4)
```

これを少し変形して座標をsplatで渡すようにしたところ、`undefined method 'length' for 255`というエラーが出るようになりました。

```rb
PLAYAREA = [260, 240, 380, 360]

    # ...
    draw_thick_box(*PLAYAREA, C_WHITE, 4)
```

どこでエラーが出ているのかはわかりませんが、この変形は同じ動作になるはずなので、ここでOpalのバグである可能性を考え始めました。

## 再現ケースを作る

Opalのバグは、[github](https://github.com/opal/opal/issues)で報告すればそのうちに直してもらえたりします。とはいえ、まずはOpal側のバグである(ライブラリやアプリのエラーではない)ことを明確にしなければなりません。ということで、この現象を再現できる最小のプログラムを作ることを考えます。

もとのプログラムから関係なさそうな部分を削っていくと、最終的に以下の例で問題が再現することが分かりました。

```rb
def draw_thick_box(x1, y1, x2, y2, color, thickness)
  p color: color 
end
draw_thick_box(1,2,3,4,[255,255,255,255], 4)     #=> {"color"=>[255, 255, 255, 255]}
a = [1,2,3,4]
draw_thick_box(*a,[255,255,255,255], 4)          #=> {"color"=>255}
```

## issueを立てる前に

それではレポートを…と行きたいところですが、先に2つのことを確認します。

1. 既にissueとして報告されていないか？
2. masterでは既に直っていたりしないか？

1.を確かめるためにgithub issuesを「splat」で検索してみますしたが、この現象を報告したものはなさそうです。(このことを厳密に確認するのは大変なので、ざっと見てなさそうならissueを作って良いと思います。重複を恐れて報告が0個になるよりは、報告が複数あるほうが良いので)

2.はopalのリポジトリをcloneして確かめます。

## Opalのmasterで試す

環境構築はbundle installだけなので簡単です。

```console
$ git clone https://github.com/opal/opal.git
$ cd opal
$ bundle install
```

あとは、./bin/opalを起動して確かめてみると…

```
$ ./bin/opal -e 'def draw_thick_box(x1, y1, x2, y2, color, thickness); p color: color; end; a = [1,2,3,4]; draw_thick_box(*a,[255,255,255,255], 4)'
{"color"=>[255, 255, 255, 255]}
``` 

あれ、**直ってる？**

念のためgemで入れたopalでも試します。

```
$ opal -v
Opal v0.11.4
$ opal -e 'def draw_thick_box(x1, y1, x2, y2, color, thickness); p color: color; end; a = [1,2,3,4]; draw_thick_box(*a,[255,255,255,255], 4)'
{"color"=>255}
```

こっちだと再現します。フーム。

そういえばさっきgithub issueを検索したとき、openなissueしか見ていませんでした。closedなissueも探すようにすると、それっぽい報告が見つかりました。

- [Method argument is wrong when using the splat operator · Issue \#1797 · opal/opal](https://github.com/opal/opal/issues/1797)

## ~~レポートする~~

はい、ということで「本家にレポートするまでを解説します」と書きましたが、今回は報告する必要はなさそうでした。まあこういうこともありますよね。直っててよかったです。

ただmasterにしか入ってないようなので、0.11.xには入らないのかな？もし早急にこの修正が必要な人がいたら、backportをお願いしたほうが良いかもしれません。個人的には別の書き方(例えば以下)で回避できるのでとりあえずいいかという気分ですが。

```rb
    args = PLAYAREA + [C_WHITE, 4]
    draw_thick_box(*args)
```
EAMを実装しよう

#前置き
　新しい言語を作るにあたって、ファイルを読み書きするものが必要になると思ってこの記事を書きました。汎用性がとても高いので、ぜひ何かに応用してみてください。
##EAMとは
　EAMとは**Execute Around Method**の略でメソッドの前後でメモリを確保または開放するというものです。特に、外部リソースを使うとき(IOなど)ガベージコレクタ(GC)だけでは十分でなく、リソースを閉じる必要があります(FileWriterのclose()など)。言葉で言ってもわかりづらいのでさっそく実装を見てみましょう。
##try-with-resourcesやARMを使わずEAMを実装している理由
`Javaによる関数型プログラミング
-Java8ラムダ式とStream-`
からの引用ですが、
`Java8で追加されたStreamクラスがAutoCloseableを実装しました。(中略)これに伴いAutoCloseableは以前の厳格な「リソースは閉じられなければならない」ではなく、より緩い「リソースは閉じられる可能性がある」という取り決めに変更されました。(中略)ARMを使用するこのコードは非常に簡潔で魅力的ですが、開発者が忘れず使わなければなりません。このエレガントな構文を無視してもコードに注意されることはありません(中略)しかし、タイムリーなリソース解放を行い、開発者によるエラーを確執に回避する方法を探しているのであれば、ARMのさらに先を行かなければいけません。`
##実装
```java:EAM.java
import java.util.*;
import java.io.*;

public class EAM{
    private final FileReader fr;
    private EAM(final String s) throws IOException{
        fr = new FileReader(s);
    }
    public static void use(final String s,final Use<EAM,IOException> u) throws IOException{
        final EAM eam = new EAM(s);
        try{
            u.accept(eam);
       	}finally{
            eam.close();
       	}
    }
    private void close() throws IOException{
        System.out.println("close()");
        fr.close();
    }
    public void read(char[] c) throws IOException{
        fr.read(c);
    }
}
```
Readerのみの実装ですが、Writerの実装も簡単です。

```java:Use.java
@FunctionalInterface
public interface Use<T,X extends Throwable>{
    void accept(T t) throws X;
}
```
##実装の説明
　せっかく外部リソースを管理しようとしているのにuse()の外でリソースが開かれてしまうといけないので、コンストラクタをprivateにしています。これによって外部から呼び出せるのはuse()だけになります。
--EAM.javaの説明
　*final EAM eam = new EAM(s);*　では、インスタンス化とともにコンストラクタ内で外部リソースを開いています。
　*u.accept(eam);*　これがメソッドの本体です。
　*eam.close();*　finallyの中に記述されているので、確実に外部リソースを閉じます。
--Use.javaの説明
　*void accept(T t) throws X;*　IOExceptionを投げます。Consumerを使うこともできましたが、例外を投げることを示す必要があります。
##実行
```java:Main.java
import java.io.*;
import java.util.*;

public class Main{
    public static void main(String[] args) throws IOException{
        char[] c = new char[100];
        EAM.use("eam.txt",eam -> eam.read(c));
        for(char aChar:c) System.out.print(aChar);
    }
}
```
eam.txtを作成して文字列を打ち込むか、ほかのファイルを指定してください。
ファイル内の文字列は読み込めたでしょうか。分からないことがあれば質問してください。
Samuel Gélineau からの返信その2


# Question 2 #
>Do you think that the adoption rate of Haskell in industry will grow over time?

Yes, Haskell's adoption is growing and I believe it will continue to grow. However, Scala's adoption has grown much faster, and I think there is a lesson there. To quote John Wiegley again, “Haskell’s cost is an upfront cost with a long payoff over time, whereas other languages have an incredibly small upfront cost, but you keep paying over time”. Not having to keep paying over time is very good in the long term, but having a small upfront cost is a more important factor when it comes to a language's adoption rate.

By supporting both a Java-like programming style and a purely-functional programming style, Scala allows that upfront cost to be spread over a much longer period, at the cost of making its purely-functional code a lot more verbose than the corresponding Haskell code. As Scala’s spectacular success demonstrates, this can be a very worthwhile tradeoff! I believe there are other points in the design space which are worth exploring, and that despite Haskell’s continued growth, other Scala-like successes will continue to eclipse Haskell in terms of adoption rate. As long as those are FP languages, I think that's a good thing!


>If so, in what area will Haskell be used more frequently?

As a general-purpose language, Haskell should be suitable for most domains. In practice, it turns out that some domains have more and better libraries, but I believe this mostly reflects the areas in which library writers up to now have chosen to invest their time, rather than betraying any significant limitation of the language.

Judging by the Haskell job posts I have seen go by, I’d say that the current domains in which Haskell is used the most are: finance, cryptocurrency, and web-app backends.

The web and cryptocurrency domains are very popular domains overall, regardless of programming language, so it’s not very surprising to see them in that list. For the finance and cryptocurrency domains, if bugs are going to lead to big money losses, it makes sense to use a language which is known for its correctness properties. But if that was the only reason, I would expect to also see other domains in which correctness is very important, such as controllers for automated vehicles and for medical devices, not just money-related domains. So I’m guessing there is a self-reinforcing effect here, in which new players in one domain are more likely to adopt a technology if they see that other players in their domain are already using it.

Note that cryptocurrency appears on both sublists: it’s a domain which is very popular these days, in which it makes sense to use a language which favours correctness, and in which a self-reinforcing effect is causing new players to be more likely to consider Haskell in the first place. So that would be my guess for the domain in which Haskell will be used the most frequently in the near future.

***

###**Haskellの仕事の投稿から判断すると、Haskellが最もよく使用されている現在のドメインは、財務、暗号通貨、およびWebアプリケーションのバックエンド**
とSamuelさんが仰っているように、今まさにブロックチェーンにまでHaskellが使われようとしています。Scalaとの融合にしても、もしかしたら予測の範囲内だったのかもしれません。

では質問３へ映ります。
FragmentのViewをさらに考察してみる。

先日[FragmentのViewにlateinitをつけてはいけないのでは?](https://qiita.com/kenz_firespeed/items/4eccc8a46aa8d3d6af18)
でViewはnullableにして実行時にnullチェックをすべきでは？という話をしたのですが、

こういう意見が寄せられました。
<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Android よく知らないですが、null の時にアクセスされることがそもそも間違いであれば、間違った実装をしていること (想定してないフローに入っていること) がまずいのではと思いました。そのパターンが蔓延してしまうのではという気もします。</p>&mdash; みつせ (@mitsuse_t) <a href="https://twitter.com/mitsuse_t/status/1076307595646779392?ref_src=twsrc%5Etfw">December 22, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

たしかに、
[Kotlinでnullについてもう一度考える](https://qiita.com/kenz_firespeed/items/6e02d71c2eab58814d32)
のときにも感じたNullにあまり説明性がない問題ですね

lateinitを使っていればViewがnullのときに処理が呼び出されると例外が発生してアプリが落ちますがNullチェックをいれてnon null時のみ処理をするようにしておくと単に処理が行われないだけで処理が継続されます。

ViewがNullのときに処理が呼び出される状態自体が想定外であれば下手に処理が継続するより例外で落ちてもらったほうが良いかもしれません。

一方でlateinitにすることでNullチェックを行わせず、例外を発生させる使い方はKotlin的には想定している使い方ではないと思いますし、非同期処理の結果を表示するときのようにViewがいないなら単に処理を無視して構わない時もあります。
ということで、Viewが存在していれば処理を行い、Viewが存在していなければログを出力するクラスを作ってみました。

ここではLogCatでログを出力していますがCrashlyticsなりFirebaseでエラーを通知するのが良いかと思います。

ライフサイクルがStopになるタイミングでViewにNullを明示的にセットすることで破棄されたViewにまちがえて保存するのを防ぐことが出来ます。


``` kotlin
class ViewHolder<T>(lifecycle: Lifecycle) {
    init {
        lifecycle.addObserver(object : LifecycleObserver {
            @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
            fun onStop() {
                obj = null
            }
        })
    }

    var obj: T? = null

    fun able(func: (T) -> Unit) {
        obj?.let {
            func.invoke(it) }
    }

    fun must(func: (T) -> Unit) {
        obj?.also { func.invoke(it) }
            ?: run {
                Log.e("ViewHolder", "Destroy")
            }

    }
    
}
```

使い方は次の通り
Fragmentの初期化時にViewHolderのインスタンスを初期化します。
このインスタンス自体はライフサイクルに関わらず存在するためnon nullにすることが出来ます。
型パラメータでライフサイクル内で保存したい型（DataBindingのViewDataBindingなど）を渡します。
引数としてlifecycleを渡します。

``` kotlin
private val viewHolder = ViewHolder<MainFragmentBinding>(lifecycle)
```

onCreateViewで保存したいViewやBindingをviewHolderのobjにセットします。

``` kotlin
override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    val binding: MainFragmentBinding = DataBindingUtil.inflate(inflater, R.layout.main_fragment, container, false)
    viewHolder.obj = binding
    // 中略
    return binding.root
}
```

bindingを取得するときは次の通り
ViewHolder#mustを呼ぶと、Viewがあれば処理が行われ、Viewがなければエラー処理を実行します。

``` kotlin
viewHolder.must{
    // itにBindingがnon nullで渡されます。
}
```

ViewHolder#ableを呼ぶと、Viewがあれば処理が行われ、Viewがなければ処理を行いません。

ちょっと雑な感じがしないでもないですがどうでしょうかね
[Vue.js メモ]条件に応じてトランジション変更したい場合

# 条件に応じてトランジションを変更する

テンプレートで**transition**コンポーネントをつかうとき、
ある条件のときは、左から右に、
ある条件のときは　右から左に　のように条件・状態に応じてアニメーションを変更したいときには以下のように固定的に指定するのではなく、

```js
<transition name="slide">
```

**transition**で**v-bind**を使って、条件に応じて設定する、というやり方。
ここでは条件判定は三項演算子でやった。

- msg.humanプロパティには、trueかfalseが格納されているとする

```js
<transition v-bind:name="msg.human? 'slide-fade-l2r':'slide-fade-r2l'">
```


```js:省略形
<transition :name="msg.human? 'slide-fade-l2r':'slide-fade-r2l'">
```

- トランジション用CSS

```css:左から右に登場するトランジション
.slide-fade-l2r-enter-active {
    transition: all .3s ease;
}
.slide-fade-l2r-enter,
.slide-fade-l2r-leave-to {
    opacity: 0;
    transform: translateX(10px);
}
```

```css:右から左に登場するトランジション
.slide-fade-r2l-enter-active {
    transition: all .3s ease;
}
.slide-fade-r2l-enter,
.slide-fade-r2l-leave-to {
    opacity: 0;
    transform: translateX(-10px);
}
```

# 参考
- https://jp.vuejs.org/v2/guide/transitions.html
- https://github.com/vuejs/vuejs.org/pull/256
正規表現の書き方に注意。`^`と `$`と `\A` `\z` 

## 発生したエラー文
```
The provided regular expression is using multiline anchors (^ or $), which may present a security risk. Did you mean to use \A and \z, or forgot to add the :multiline => true option?
```

## 背景

```ruby
  # 郵便番号の正規化
  VALID_POSTAL_CODE_REGEX = /^\d{7}$/

  validates :postal_code, presence: true,
                          format: { with: VALID_POSTAL_CODE_REGEX,
                          message: "is invalid format" }
```
こちらのコードがひっかかった。

## 原因

エラー文を読み解いていきます。

```
(^ or $), which may present a security risk
```

`^`と `$` はセキュリティ的リスクを抱えているとのこと。

## 解決策

### ① \A and \zに置き換える
```
Did you mean to use \A and \z
```

といわれているので、
`^`を`\A`
`$`を`\z`
に置き換える。

### ② `:multiline => true option`をつける
```
forgot to add the :multiline => true option?
```
もしくは、`:multiline => true option`をつけると解決するようです。

## 最善策

しかし、②のやり方では、セキュリティリスクは解決しない模様。
`^`と `$` の書き方は、直前の`\n`しか見てくれないため、例えば

```
me@example.com\n<script>dangerous_stuff();</script>
```
このような、テキストも入力を受け付けてしまうので注意。
https://stackoverflow.com/questions/577653/difference-between-a-z-and-in-ruby-regular-expressions

このように直しましょう。

```ruby
  # 郵便番号の正規化
  VALID_POSTAL_CODE_REGEX = /\A\d{7}\z/

  validates :postal_code, presence: true,
                          format: { with: VALID_POSTAL_CODE_REGEX,
                          message: "is invalid format" }
```


## 参考
[Difference between \A \z and ^ $ in Ruby regular expressions](https://stackoverflow.com/questions/577653/difference-between-a-z-and-in-ruby-regular-expressions)
[Rails4では正規表現が厳しくなった。](http://jumperson.hatenablog.com/entry/2013/06/27/062237)
[Railsの正規表現での^と$](https://qiita.com/kentana20/items/3f37bbc8eb04d9ce927d)
GAのアプリ用SDKがサポート終了になるらしいのでイベントを整理する


# Googleアナリティクスの開発用SDKがサポート終了

モバイルアプリの数値分析において必須サービスであったGoogleアナリティクスですが、
アプリ向けの開発者サービスSDKが2019年10月以降、サポートが終了するということなので、関連情報をメモしておきます。

<img width="1271" alt="スクリーンショット 2018-12-22 18.08.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/66341/a63890bb-9ed4-2e60-1ff4-f4728bd4fa1c.png">

# 代替手段
移行先として推奨されるのは、Firebaseアナリティクスの利用(Firebase SDK)になりますが、
数年前にFirebaseアナリティクスが登場してから、すでに多くのデベロッパーが移行済みとは思われます。
https://firebase.google.com/docs/analytics/?hl=ja

# なぜまだGoogleアナリティクスを使い続けていたのか？

何年も前からFirebaseアナリティクスが広まりつつあったので「さっさと移行すれば良いじゃん？」という話ではあるものの、
Googleアナリティクスを手放しづらい理由がいくつかありました。

例えばGoogleアナリティクスでは容易にできていた下記のような項目が、Firebaseアナリティクスでは扱いづらくなっています。

1. 時間別利用数をGUI上でサクッと見る
2. 行動フローを可視化して離別箇所を特定する
3. コホート分析をセグメントありで可視化したい
4. GUI上から見ることのできる各イベントの値に限りがある

上記の課題は、Firebaseアナリティクス + BigQueryを利用することで、数値を追うことは可能ですが、
GUI上で気軽に数値を追いたい場合には少し抵抗があります。また、Web用のGoogleアナリティクスに慣れてきたデベロッパーも多く、Googleアナリティクスで分析したい需要は少なからずあったかと思います。
こういった背景から、FirebaseアナリティクスとGoogleアナリティクスを併用して利用するサービスもあったのではないかと思います。

# 移行後どうするべきか
2019年10月からサポートを随時終了していくとのことなので、使い続けているわけにはいきません。
私もGoogleアナリティクスに頼っていた面が多々ありましたが、早めにGoogleアナリティクスとの併用をやめてFirebaseアナリティクス (+BigQuery)を使い倒せるよう勉強しようと思っています(汗)。

## イベントを整理する

GoogleアナリティクスとFirebaseアナリティクスを併用していたり、GoogleアナリティクスからFirebaseアナリティクスに乗り換える場合、今までに利用していたイベントパラメータを整理する必要があるかと思います。GoogleアナリティクスとFirebaseアナリティクスのイベントパラメータは形式が異なるので、相違点と設定時の注意点をメモします。

## 相違点
### Google アナリティクス
|項目  |Action  |Category  | Label | Value |
|---|---|---|---|---|
|説明  |イベントアクション  |イベントのカテゴリ  |イベントのラベル  |  |
|型  |文字列  |文字列  |文字列  | 数値 |

### Firebase アナリティクス
|項目  |Event  |Parameter  |
|---|---|---|
|説明  |イベント  |パラメータ(複数化) |
|型  |文字列  |[key-value,....]  |
|例  |SelectContent  | { ItemId:"item1", contentType:"Hoge"} |

Googleアナリティクスが項目数固定であるのに対し、Firebaseアナリティクスには可変のカスタムパラメータを設定することができます。

## Firebaseのイベント情報定義の注意点
Firebaseアナリティクスはカスタムパラメータは利用者自身で定義できますが、下記のポイントに留意しておく必要があります。

- 推奨イベントに従う
- 設定できるパラメータ数に上限

### 推奨イベントに従う
Firebaseが公式でイベント定義を用意しています。Firebaseアナリティクスのイベントパラメータは自由に定義できてしまいますが、「想定された通り正しく使う」ことや、Firebase上で扱いやすい値にするため、利用が可能である限り推奨イベントにしたがっておくのが無難です。

[推奨イベント一覧](https://firebase.google.com/docs/reference/unity/class/firebase/analytics/firebase-analytics?hl=ja) 

#### 推奨イベント例
イベント名: EventSelectContent
パラメータ: ParameterContentType (文字列) , ParameterItemId (文字列)


### 設定できるパラメータ数に上限
Firebaseアナリティクスは、フリーの利用において以下の制限がある。

 - 送信可能なイベント数は最大500
 - 各イベントでカスタムパラメータの最大設定数は25
 - 各カスタムイベントパラメータは合計50 (数値40, テキスト10)まで指定が可能

#参考リンク
[Firebaseアナリティクス　イベントロギング] (https://firebase.google.com/docs/analytics/android/events?hl=ja)
Amazon Managed Blockchainでフリマアプリ作りたい Part1

この記事は[ハンズラボAdvent Calendar 2018](https://qiita.com/advent-calendar/2018/handslab)
23日目の記事です。

# ことの発端。
- @yuka_jyotei に弊社[エンジニアブログ](https://www.hands-lab.com/tech/)書けと言われた。
- @sho-hitomi  に某フリマアプリみたいなの作ればいいんじゃないと言われた。
- なんなら、前社長が行っちゃた。

とはいえ、腐ってもエンジニア。何かを書かなければ。<-(2018/12/22現在)

先に謝っておきます。
前日まで何もしてませんでした。すみません。許してください。僕が悪いです。
補足として、AWSそんなに使ったことないし、Blockchainも詳しく知らない人です。
そんなこんなでPart1始めます。

# Amazon Managed Blockchain?
[Managed Blockchain](https://aws.amazon.com/jp/managed-blockchain/)とは2018年のAWS Re:Inventにて発表されました。
> Amazon Managed Blockchain はフルマネージド型のサービスで、一般的なオープンソースフレームワークである Hyperledger Fabric や Ethereum を使用して、スケーラブルなブロックチェーンネットワークの作成と管理を簡単に行えます。

なるほど。さっぱりピーマン。

# では、行ってみよう。
## Create blockchain network#1
<img width="1186" alt="Create blockchain network001
" src="https://qiita-image-store.s3.amazonaws.com/0/104403/445d3358-b230-056e-561f-a269bb2d26e7.png">
※現在はPreviewなので、Hyperledger Fabricのみ使用可能です。
**Network name**を入力しましょう。

## Create blockchain network#2
<img width="1186" alt="Create blockchain network002" src="https://qiita-image-store.s3.amazonaws.com/0/104403/d4953aa6-5074-bd1c-bf3e-21e7d3464e46.png">
**Member name** を入力しましょう。

- メンバーは複数登録できますが、ネットワーク内での名前はユニークでないといけません。

- メンバー名は最大64文字で`英数字`と`-`を使用できます。
    - `数字`と`-`始まり
    - `-`終わり
    - `--`禁止
    - 以上の制限はあります。

---
<img width="1186" alt="Create blockchain network003" src="https://qiita-image-store.s3.amazonaws.com/0/104403/92e3e669-f67d-bc47-a6d1-107748770264.png">
**Admin username**と**Admin password**を入力しましょう。

- **ユーザー名**は最大16文字で`英字`始まり
    - `英数字`の使用可能

- **パスワード**は最低8文字以上最大32文字
    - `大文字`,`小文字`,`数字`各1文字以上は必須
    - `‘(一重引用符)`,`"(二重引用符)`,`/`,`\`,`@`,` (スペース)`禁止

## Create blockchain network#3
<img width="1186" alt="Create blockchain network004" src="https://qiita-image-store.s3.amazonaws.com/0/104403/453f1696-2439-49c5-4eac-08dd1bda0a3b.png">
最終確認して、間違いがなければ作成しましょう。

## Create blockchain network#4
<img width="1158" alt="Create blockchain network005" src="https://qiita-image-store.s3.amazonaws.com/0/104403/cae0d56f-5421-5495-ef6f-d044ec8ebb10.png">

`Status`がアクティブになるまで気長に待ちましょう。

## Create blockchain network#5
[Endpoint](https://docs.aws.amazon.com/ja_jp/managed-blockchain/latest/managementguide/managed-blockchain-endpoints.html)の設定は公式をみていただいた方が健全に終わるかと思います。

VPCに合わせて読んでいただきたい[弊社AdventCalendar](https://qiita.com/rednes/items/24135187191c07f8e1f3)はこちら。

## Create blockchain network#5
<img width="1306" alt="Create blockchain network006" src="https://qiita-image-store.s3.amazonaws.com/0/104403/dec0f65a-7343-72b0-b2b5-f01bafabdd02.png">

メンバーを選択し、`Create peer node`しましょう。

---
<img width="874" alt="Create blockchain network007" src="https://qiita-image-store.s3.amazonaws.com/0/104403/f1b64e89-ae96-bdb4-777d-b0f8bbe37f4b.png">
Blockchainインスタンスは現在`b3.t3.small`のみとなっています。

# これにて。
とりあえず、Blockchain networkは作成できたと思います。
BlockChainの技術にまだ触れたことがないので、次回は実際に触ってみようかと思います。

ここで勉強すればいいよ！とかあれば、教えていただけると幸いです。

次回の更新がいつになるかはわかりませんが、末長く見守っていただければと思います。

---

[ハンズラボAdvent Calendar 2018](https://qiita.com/advent-calendar/2018/handslab) の24日目は[@ansark88](https://qiita.com/ansark88)さんです！
python3のinstall for mac & venvを使った仮想環境

## macでのpython3 install方法
macの環境 macOC High Sierra
## Homebrewの導入
Homebrewは、rubyで作られたmacOS用パッケージマネージャーです。
これを入れておくと便利です。
[Homebrew](https://brew.sh/index_ja)
ここに行ってコピペしてterminalに入力すれば良い。

`/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`

Homebrewが入りました。
## python3のインストール
さっそくbrewを使ってインストールします。
`brew install python3`
インストールに成功したら、バージョンチェックして見ましょう。
`python3 -V`　と入れて、
`Python 3.7.1`
とでたらOKです。
## 仮想環境を作る
virtualenvを使ったやり方もありますが、Python3.3以降はvenvが便利です。
仮想環境をつくりたいディレクトリから、terminalで。
`python3 -m venv [つけたい名前]`
[つけたい名前]ディレクトリが出来ます。中を見ておくといいでしょう。
## 仮想環境にはいる
`. [つけた名前]/bin/activate`
でactivate実行します。.のあとはスペースを。
`(つけた名前) $`
となるのが分かるかと思います。
`python -V` でPythonのバージョン確認をします。
## 仮想環境を終了する
`deactivate`
で終了です。仮想環境自体が不要になったら、ディレクトリごと削除します。

個人的にはこのやり方がいちばん楽な気がします。
仮想環境下ではpipで大丈夫だし。以上です。