OmniAICreator/Qiita-1.07M huggingface dataset:
1年に数回しか起動しないようなクソアプリを作った話

[クソアプリ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kuso-app)の8日目の記事です。

みなさんやけにクオリティが高いクソアプリなせいでプレッシャーを感じてます。
しかも記事が大体バズってるし。。。
このカレンダーのためにみなさん作ってそうなので果たして既存のものを紹介してもよいのか不安ですが、書かせていただきます！

## アプリの概要
![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/119260/a11f3401-f372-739c-6266-d1512cbff8ce.png)

「PinPoint」という地図系のアプリです。
iOS：https://itunes.apple.com/jp/app/pinpoint%E3%81%A7%E4%BD%95%E3%82%AD%E3%83%AD%E4%BB%A5%E5%86%85%E3%82%84%E7%8F%BE%E5%9C%A8%E5%9C%B0%E3%81%8B%E3%82%89%E4%BD%95%E3%82%AD%E3%83%AD%E3%82%92%E7%A2%BA%E8%AA%8D/id1321198947?mt=8
Android：https://play.google.com/store/apps/details?id=jp.ewaf.pinpoint.android&hl=ja
[App名: PinPointで何キロ以内や現在地から何キロを確認、デベロッパ: Yu Watanabe]

地図に半径何kmのピンを立てたり、直線距離を表示するだけのアプリです。
[なんちゃって公式サイト](http://www.bad-company.jp/pinpoint)に書いておいた概要はこちらです。

- 住宅手当は勤務地から2km以内ならば出るので、2km以内の場所ってどこだろう？
- 現在地から直線で何キロ離れてるというのが通常の地図アプリではわからないので知りたい
- この人が現在地から直線で何キロ離れているというのはわかるが、複数地点から何キロという情報を元に計算することで、どこにいるのかが判断つかないだろうか？

## 何がクソなのか？
用途というか使い道がないです。
実は概要に記述した要素はどうにか捻り出しました。
これでも1年に数回しか使わないレベルです。
実際に周りの人で使ったよっていう声もらったんですけど、自分の家が職場から直線で何キロ離れてるんだろうかっていうだけでした笑
1年に1回ふとしたときに使うかどうかレベルですね。

とりあえずReact Nativeでサクッとアプリを出そうと去年思ったので、地図系だったら楽だしなぁと思っただけです。
手段と目的が違うやつですね。
アプリというよりも自分の思考がクソだった可能性もありますけど、アプリを出すことは大事です。

けどこういうよくわからないニッチなアプリ作るの大好きです。

## 使った技術
- React Native
- Expo

### Expoとは
React Native使うことでアプリ開発はすごく簡単になるんですけど、XCodeとかAndroid Studioとか使わないでJSだけでさらに簡単にやろうよ〜っていうのがExpoです。
ある程度のコンポーネントはExpoの方で用意されていて、正直普通のアプリを作るにはこれを使うだけでいいんじゃないかというレベルだと個人的には思っています。
ちなみに[技術書典5にてExpoに関する本を共著](https://watanabeyu.blogspot.com/2018/10/5react-native-expo-firebase.html)で出させていただきました。

### 使ったExpoのコンポーネントやnpmパッケージ
- Expo
    - Asset
        - 画像などをpreload
    - Constants
        - app.jsonに記入した定数やExpoで用意されている定数
    - Location
        - 位置情報取得
    - Permissions
        - 位置情報取得のパーミッション
    - MapView
        - 地図
    - AdMobBanner
        - Admobのバナー
- npmパッケージ
    - @expo/vector-icons
        - アイコンフォント
    - ex-react-native-i18n
        - 多言語対応
    - expo-analytics
        - Google Analytics
    - react-native-keyboard-spacer
        - キーボードを開いたときにTextInputが隠れてしまうのを対応
    - react-navigation
        - ナビゲーションおよびルーティング
    - sentry-expo
        - エラーレポート

このような感じですね。
もしExpoを使わないのであれば、MapViewなどはreact-native-mapsを使ったりしないといけなく、XCodeの設定やらなんやらが地味に面倒だったりします。
そこを解決してくれるのですごく助かりました。

## まとめ
普通だったらいろんな人に毎日使ってもらいたいようなアプリを作るべきなんですけど、1年に数回使ったらいいぐらいの用途のアプリを作ったのでクソアプリとして紹介させていただきました。
こういう謎にニッチなアプリを作るのが大好きなので、これからもクソ精進していきたいと思います🤘
トランザクションの詳細な送信情報を取得する方法

Dappsのいいところは取引の詳細データがブロックチェーン上に半永久的に残っている点です。

たとえばDapps提供者側のシステムがクラッシュしたとしてもすべての取引データはトランザクションとして保存されていますので、本当に重要な情報を復元する事ができます。

しかしその取引データは暗号化されているため通常確認できません。

今回はコーディングしなくてもそのトランザクションにどのようなデータを送信したかを特定する方法を記載します。

コントラクトへのトランザクションの送信情報を確認したいことは開発中はもちろん本番リリース後も発生しますので、知っておくと何らかのときに助かると思います。
## 手順

1. etherscanで調べたいトランザクションのInput Dataを調べる
2. ABIの情報を調べる
3. ethereum-input-data-decoderツールを使って1と2の情報を入れる

## 1.etherscanで調べたいトランザクションのInput Dataを調べる
etherscanではトランザクションのデータ項目にInput Dataというものがあります。
このデータがコントラクトへ送信したデータの内容となりますが、このままだと何もわかりません

例としてCryptoKanojoのKanojo購入トランザクションを見てみます。

以下URLにアクセスすると
https://etherscan.io/tx/0x3cfa5bc76052d2461ae03bbee1753f078cfe77067155de5fecfaf1ced240b7ae
このようなデータが表示されていますので、このあとでデータを使用します
<img width="970" alt="スクリーンショット 2018-12-08 20.26.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/38126/89a4a652-6215-d898-be92-8a5dc7a919c9.png">

## 2.ABIの情報を調べる
コントラクトをコンパイルすると以下のようにJSON形式のABIが出力され、ABI情報の変数として保存していると思いますので、そのデータを使用します。


```console:Kanojo.sol
$ solc Kanojo.sol --abi --bin
======= Kanojo.sol:Memo =======
Binary:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX...
Contract JSON ABI
[{"constant":true,"inputs":[],"name":"endTime","outputs":....
↑これを使う
```

## 3.ethereum-input-data-decoderツールを使って1と2の情報を入れる
ethereum-input-data-decoderで調べるとGitHubで公開されていますが、今回はWEBでコンパイル済みのも公開していますのでこちらを使います。
https://lab.miguelmota.com/ethereum-input-data-decoder/example/

<img width="904" alt="スクリーンショット 2018-12-08 21.05.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/38126/f92f8344-8e87-7835-ae13-d0cb80048473.png">



左のABIに2のデータを、右のInput Dataに1のデータをコピペし、Decodeボタンをクリックすると、コントラクトへ送信したデータが表示されます。

<img width="456" alt="スクリーンショット 2018-12-08 21.07.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/38126/eeb91c1d-2b62-56ab-6c5a-2979e9c45383.png">

以上です。

## デコードして出てきたデータを加工する
これはコントラクトの処理にもよりますが、デコードして出てきたデータが16進数になっていて10進数に直さなくてはいけない場合もあります。

そういったときはX進数変換ツールなどがあるのでそれを使うと便利です。
https://hogehoge.tk/tool/number.html
<img width="757" alt="スクリーンショット 2018-12-08 21.12.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/38126/92fa4756-be18-c232-08fd-699d71826631.png">
演算子からアプローチする C言語

演算子の働きから C言語の理解を深めようというお話です．

## 演算子とは
　そもそも，演算子ってなんでしょう？
　例えば， `5 + 2` であれば， 5　と　2 の和を求める計算をします．
　なので，引数を 2つ持ち，戻り値がある関数を考えてもよいですね．
　上記の例では `plus( 5, 2)` という感じでしょうか．

　C言語の関数であれば `int plus(int, int)` のように，引数や戻り値に型を指定する必要があります．ですが，演算子は整数でも実数でも受け付けてくれます．
　ですので，ちょっと言い過ぎかもしれませんが，
　　**演算子は，オーバーロード機能のある組み込み関数**
と言えると思います．
## C言語の演算子
　C言語にはどのような演算子があるでしょう？
　[望洋先生のサイト](http://www.bohyoh.com/CandCPP/C/operator.html) がとても参考になります．といいますか，このページから今回のネタを思いつきました．

### 関数呼出し演算子
　望洋先生の演算子一覧表を見ると，のっけからハードな演算子があります．
　関数の引数を入れる　`()`　って演算子だったんですね．
　つまり， `func(x)` は， `func` と `x` の 2項演算ということになります．`func` を関数ポインタであると考えると，そんなに違和感ない考え方ですね．
 `func(x,y)` の場合， `func` と `x,y` の 2項演算で，さらに `x,y` の `,` はコンマ演算子・・・となるとカッコいいのですが，ここでの `,` は単なるセパレータとなってしまうが，ちょっと残念な感じです．

 それはともかく，関数呼び出しも演算子なので，　**C言語は演算子ファーストな言語** って言ってもよいかなと思います．

### 添字演算子
　次に，配列の添字の指定をする `[]` も演算子なんですね．
　これは， `a[1]` と `*(a + 1)` が同じ処理であることから，素直に納得できます．
　ところで， `x + y` は `y + x` としても同じ結果になります． `+`は可換性を持つとも言います．　`x % y` には可換性はないですね．
　では， `[]` には可換性があるのでしょうか？
　やってみると分かりますが， `a[1] = 2;` と `1[a] = 2;` は，同じ処理になります．可換性があるんですね．
　`a[1]` と `*(a + 1)` が同じ処理で，かつ， `+` に可換性があるのだから， `[]` も可換性を持つのは理にかなっています．

### 単純代入演算子
　代入 `=` も演算子なんですね．
　`x = y` としたとき， `x` に `y` の値を代入し，演算結果（戻り値）は y の値になります．
　この `x = y` を `subst(x, y)` という関数に置き換えて考えてみます．厳密には `subst(&x,y)` が正しいと思いますが，表記を簡単にするために `x` でいきます．

　もう一度，望洋先生の演算子一覧表を見ると，右端に**結合性**という項目があります．
　`x + y` は，「２項+演算子」で，結合性は「左」です．これは `x + y + z`　のように 2項演算+ が連続する場合には，左から結合していくという意味です．ですので `(x + y) + z` のように，左にある `x + y` を先に処理することになります．
 `x + y` を `plus(x,y)` という関数で置き換えたとすると， `x + y + z` は ` plus( plus(x,y), z)` と同じになります．

　では，単純代入演算子はどうかというと，結合性は「右」です．
　ですので，　`x = y = z` は `subst(x, subst(y, z))` になります．
 もう分かりましたね．単純代入演算子の結合性を「右」にしておくと，
　　`x = y = z = 1`
は
　　`subst(　x, subst(　y, subst(　z, 1) ) )`
となり， `subst(　z, 1)` の戻り値は `1` になるので
　　`subst( x, subst(　y, 1) )`
となり・・・で，最終的に x y z 全てに 1 が代入されます．

## まとめ

　**C言語は演算子ファーストな言語** と考えて，いろいろ考察してみました．当たり前ですが，ちゃんと理にかなった処理になっていましたね．
Pythonのファイル操作で詰まったこと

*プログラミング学習者です。
間違えている箇所もあると思いますので、申し訳ございませんがご指摘していただきますと大変助かります。*

#CSVファイル読み書きでハマったこと

CSVファイルの書き込み、読み込みを今までなんとなくやっていたので、改めて
自分のコードメモ帳に保存しようとしたら、
書き込みはできるのに読み込みはできなくなってました。

##問題のコード
```python:訂正前のコード
import csv

seq = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]

f_read = open("test.csv", "w", encoding="utf-8")
write = csv.writer(f_read)
write.writerows(seq)


f_read = open("test.csv", "r", encoding="utf-8")
f_read_itr = csv.reader(f_read)
for row in f_read_itr:
    print(row)
f_read.close()

```

どうしてだろう？ファイルはディレクトリにちゃんと作成されているのに...

あ。。。



```python:訂正後のコード
import csv

seq = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
f_read = open("test.csv", "w", encoding="utf-8")
write = csv.writer(f_read)
write.writerows(seq)

#ファイルクローズを書き忘れていた。
f_read.close()

f_read = open("test.csv", "r", encoding="utf-8")
f_read_itr = csv.reader(f_read)
for row in f_read_itr:
    print(row)
f_read.close()

```

close()の記述し忘れでした。
今まで別個のファイルで書いていたので忘れていました。
こういう凡ミスがあるから、下記のようにwith文で書いたほうがいいのですね。
withなら例外処理もcloseもしてくれるので。

```python:withで書いた
import csv

seq = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]

with open("test.csv", "w", encoding="utf-8") as f_write:
    write = csv.writer(f_write)
    write.writerow(seq)

with open("test.csv", "r", encoding="utf-8") as f_read:
    for row in csv.reader(f_read):
        print(row)
```
Rust の論理積の & は短絡評価じゃなかった

Rust ド素人がけつまずいたはなし。

Rust の何かのドキュメントを見てたら

```rust
true & false
```

が `false` になる，という話が書いてあって，

> Rust って論理演算の AND は `&&` じゃなくて `&` と書くのか，へー。

と派手に勘違いした。

で，自分のコードを書いているとき，とくに迷うこともなく，こんな感じの書き方をしてしまった。

```rb
let v = vec![1, 2, 3];
let i = 7;
let b = (i < 3) & (v[i] > 2);
```

（実際のコードとは違うけど，けつまづいた点を再現）

要するに，`i` の値がベクター `v` のインデックスとして妥当な範囲かを確認したうえで `v[i]` の値を見ようとした。

そしたらパニック！

> panicked at 'index out of bounds: the len is 3 but the index is 7'

なんでやねん？

要するに短絡評価じゃなくて左右の項を両方評価する，ということらしい。

`&` を `&&` に変えると，これは短絡評価なので期待どおりに動作した。

いろいろなドキュメントを見てみたけど，`&&` が短絡評価であることや，整数で `&` がビットごとの論理積であることは書いてるのに，論理値の `&` が短絡評価でないことは見つけられなかった。うーむ。
Vimのタブ・空白・改行文字等をlistcharsで色変更

自分なりに調べた内容のまとめです。
`.vimrc`内に記述します。

## タブ・空白・改行等の表示

追記: 以下のWebページが閉じてしまったようなので Internet Archive のリンクに変更してあります.
([【Vim】タブ、空白、改行を可視化する | blog.remora.cx](https://web.archive.org/web/20180805045823/http://blog.remora.cx/2011/08/display-invisible-characters-on-vim.html))

> - [【Vim】タブ、空白、改行を可視化する | blog.remora.cx](https://web.archive.org/web/20180805045823/http://blog.remora.cx/2011/08/display-invisible-characters-on-vim.html)
  - listで表示される文字のフォーマットを指定する
  - `tab:»-`
      - “タブ”の表示を決定する。値は 2 文字で指定し、タブがスペース 8 文字に当たる場合、“»-------”などと表示される。
  - `trail:-`
      - 行末に続くスペースを表す表示。
  - `eol:↲`
      - 改行記号を表す表示。
  - `extends:»`
      - ウィンドウの幅が狭くて右に省略された文字がある場合に表示される。
  - `precedes:«`
      - extends と同じで左に省略された文字がある場合に表示される。
  - `nbsp:%`
      - 不可視のスペースを表す表示。ただし、この記号の通りに表示されるのは“&nbsp;”、
      つまり、ノーブレークスペースに限られており、ほかの不可視スペース
      (画像に挙げた &#x200b;、&#xfeff;、などなど)には効果がない。


```
set list
set listchars=tab:»-,trail:-,eol:↲,extends:»,precedes:«,nbsp:%
```

## 文字の色変更

- 改行文字とタブ文字の色設定（NonTextが改行、SpecialKeyがタブ）
    - [vim set color for listchars tabs and spaces - Stack Overflow](https://stackoverflow.com/questions/24232354/vim-set-color-for-listchars-tabs-and-spaces)
        - `NonText`
            - eol, extends, precedes
        - `SpecialKey`
        - nbsp, tab, trail
    - [Xterm256 color names for console Vim - Vim Tips Wiki - FANDOM powered by Wikia](http://vim.wikia.com/wiki/Xterm256_color_names_for_console_Vim)
        - `ctermfg`で使える番号一覧が見れます。


```
hi NonText    ctermbg=None ctermfg=59 guibg=NONE guifg=None
hi SpecialKey ctermbg=None ctermfg=59 guibg=NONE guifg=None
```


## Before -> After
Before (デフォルト)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/ccaba2ff-7bd0-1716-71b0-9f5e230acdab.png)

After (`ctermfg=59`)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195174/f834e3c0-0e0f-b452-5d5e-60b83a7e6925.png)
[ Git ] ターミナルでの頻出コマンドメモ

#ターミナル頻出Git操作コマンド
 忘れそうになるので確認のためにまとめていきます

##cdコマンド
作業ディレクトリーの移動
<pre>cd [プロジェクトのパス]</pre>

##lsコマンド
　ディレクトリーの内容を表示する。
　ls -aで隠しファイルを含めたディレクトリ全内容を表示
 <pre>git ls -files</pre>

##mkdirコマンド
　ディレクトリー新規作成
<pre>mkdir [ファイル名]</pre>

##touchコマンド
 新規ファイルの作成
<pre>touch [ファイル名]</pre>

##rmコマンド
 指定したファイルを削除
<pre>rm [ファイル名]</pre>

##cpコマンド
　ファイルをコピー
<pre>cp [ファイル名]</pre>

##mvコマンド
　　ファイルの移動とファイル名の変更
<pre>#ファイルの移動
mv [ディレクトリ名/ファイル名] [移動先ディレクトリ名]

 #ファイル名の変更
mv [ディレクトリ名/ファイル名] [変更後名称]
</pre>

##catコマンド
　　ファイルの中身の表示
<pre>cat [ファイル名]</pre>
2018年12月版日本語で買えるWindows用EVコードサイニング証明書調査

2018年12月のWindows用EVコードサイニング証明書を調査した。EVコードサイニング証明書は普通のと比べて高いのとハードウェアキーを使う必要があるのと審査が厳しい代わりにSmartScreenの警告が発生しなくなるなどの利点がある。

| ベンダ | 日本の代理店 | 3年分の価格 | 備考 |
| --- | --- | --- | --- |
| DigiCert | デジサート・ジャパン | [￥335,000(税抜)](https://www.websecurity.symantec.com/ja/jp/theme/code-signing-ev-value#tab2) |  |
| DigiCert | サイバートラスト | [￥198,000(税抜込不明)](https://dc.cybertrust.co.jp/code-signing/ev-code-signing.html) |  |
| DigiCert | アールエムエス | [￥175,000(税別)](https://rms-digicert.ne.jp/codesigning/price.html) |  |
| DigiCert | NaviPlus | [￥335,000 → キャンペーン価格：￥244,550(税抜込不明)](https://www.naviplus.co.jp/corporate/security/codesign/)
| GlobalSign | GMOグローバルサイン | [￥220,320(税込)](https://jp.globalsign.com/estimate/codesign/) | |
| Comodo |  コモドジャパン | [￥170,000(税別)](https://comodo.jp/products/evcodesign.html) |  |

* Entrustは日本法人があるが、日本法人ではEVはやってなさそうな雰囲気。英語サイトから [$399 /year](https://www.entrustdatacard.com/products/digital-signing-certificates/code-signing-certificates) で買えるようなので英語に自信があればいける。
* 英語に自信があればksoftwareがComodoの証明書を [$249 / year](https://codesigning.ksoftware.net/) で取り扱っているらしい。今回調査した中では一番安かった。
* Thawte (DigiCert傘下) はEVをやってない
* GoDaddy: EVをやっていない
* QuoVadis: EVではなさそう https://www.quovadisglobal.ch/Registrierung/Documents/Preisliste.aspx
* Trustwave: EVではなさそう https://ssl.trustwave.com/ssl-code-signing.php
* 参考URL https://www.nda.co.jp/memo/codesigning/index.html
Unity開発するにあたって知っておきたいコンパイラのすゝめ(Part3～Burst編～)

#最初に

この記事はUnityで使用されているコンパイラについてまとめた記事のうちの、基本的に使われている部分である**Burst**について簡単にまとめた記事です。

- [Part0.5〜.NET Frameworkの概要編〜](https://qiita.com/4_mio_11/items/89fd91ef8ede02bfdd46)
- [Part0.7～JITとAOT概要編～](https://qiita.com/4_mio_11/items/f58fedbf2a7721c3df58)
- [Part1～Mono編～](https://qiita.com/4_mio_11/items/716d28add984405a80cc)
- [Part3～IL2CPP編～](https://qiita.com/4_mio_11/items/d5d7b4e879a8341595cd)

## Burstとは？

Unity2018以降で新しく追加されたコンパイラです(ただし現在はUnity公式コミュ二ティで配布段階)。IL2CPPが単純にC++に変換してパフォーマンスを確保するのに対し、**BurstはECSやC# JobSystemで組んだような限られた前提条件で組まれたILをCPUに合わせてCPU演算向け最適化を行ったアセンブラを吐いてくれます**。そのため、**劇的なパフォーマンスの改善**が期待できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/36899/f6f13a19-bbc4-29b5-cb39-3d96714a88ae.png)

Burstでコンパイル後に生成されたアセンブラはプレビューすることも可能です。

IL2CPPはMonoよりも2倍〜3倍高速ですが、UnityのBurstコンパイラは、C++よりもC＃のコードを高速にすることができます。ただしBurst自体はまだ登場したばかりなのでこれから更に改良されていくことが期待されています。

## Burstの前提条件とは？

- C#前提。C#のポインタは使える。
- 仮想メソッドを持つことはできない。
- GCも使えない。
- 参照型は無し。プリミティブ型と構造体のみ。
- NativeArray構造体である。
- 連続したメモリレイアウト前提。
- データの入出力がはっきりしてること。
- SIMD auto -vectorization
- Preciton control (Low, Med, High)

## 使い方

IJoｂ系のインターフェースに BurstCompile属性([Unity.Burst.BurstCompile])をつけることで適用できます。

また、Jobs -> Burst Inspector からどのエラーがBurstを妨げているか知ることができます。

現状の標準となっているようなコードの書き方(MonoBehaviour)からECSに変えるには多くの変更点が存在します。このような変更点のために作業コストがかかるのは不本意なので、最終的には改良によって30分程度でプロジェクト内のMonoBehaviourからECSへ変更し、Burstの恩恵を受けられるようにと考えているようです。

# 最後に

とりあえずここまでで一通りUnityで使われているンパイラに触れることができました。実際の細かい内部構造や使用方法などまでには触れていませんが、イメージやメリットデメリットだけでも伝われば嬉しいと思います。私自身もここまでのパートで最新のUnity周りについて勉強になることが多かったので今後も継続してインプットしていきたいと思います。

# 参考
- [【GTMF2018TOKYO】ハードウェアの性能を活かす為の、Unityの新しい3つの機能](https://www.slideshare.net/UnityTechnologiesJapan/gtmf2018tokyounity3)
- [Daily Pathtracer Part 3: C# & Unity & Burst](https://aras-p.info/blog/2018/03/28/Daily-Pathtracer-Part-3-CSharp-Unity-Burst/)
- [[GCC2018] Unity 2018は「カスタマイズ」で小さく速く多機能に](http://jp.gamesindustry.biz/article/1804/18040201/)
paizaでアセンブラ その6

#概要

paizaでアセンブラ、やってみた。
シェルコードやってみた。

#サンプルコード


```
import subprocess
import os

def gcc():
    c_file = 'fizzbuzz.s'
    test_c = """
.code64
.text
.global main

main:
	xor    %rdx, %rdx
    push   %rdx
    mov    $0x68732f2f6e69622f, %rax
    push   %rax
    mov    %rsp, %rdi
    push   %rdx
    push   %rdi
    mov    %rsp, %rsi 
    lea    59(%rdx), %rax
    syscall
"""
    with open(c_file, 'w') as f:
        f.write(test_c)
    os.system("gcc -no-pie %s" % c_file)
    result = subprocess.Popen('./a.out', stdout = subprocess.PIPE).communicate()[0]
    for i, v in enumerate(result[ : -1].split('\n')):
        print v

if __name__ == '__main__':
  gcc()
  

```

#成果物

https://paiza.io/projects/ZcPcI1HmwsG-jAweezVhXQ

以上。
Elm に CodeMirror を埋め込む

Elm で描画した要素の中に JavaScript のコンポーネントを埋め込みたくなることがたまにあります。この記事では、よくある例としてエディタを埋め込むサンプルを作ってみます。今回使うライブラリは [CodeMirror](https://codemirror.net/) です。

というわけで出来たのがこちら。

- [DEMO](https://jinjor.github.io/elm-editor-example/)
- [コード](https://github.com/jinjor/elm-editor-example)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109182/c8fade44-68fb-6f17-b493-8975a105c6f4.png)

これだけだと分かりにくいですが、エディタはちゃんと Elm の中にいます。下手に DOM をいじると Virtual DOM がエラーを出しますが、ポイントさえ押さえれば特に問題ないようです。

## Elm 側のコード

`#editor` 要素を元に CodeMirror に初期化してもらいます。 CodeMirror 特有の事情としては、この要素のすぐ後にエディタの要素が挿入されるため、その場所に他の要素は置かないようにします。

```elm
view : Model -> Html Msg
view model =
    div [ class "main" ]
        [ div [ class "editor" ]
            [ textarea
                [ id "editor"
                , style "display" "none"
                , onInput Input
                ]
                [ text "Hello, press `Ctrl+S` to see the result." ]
            ]
        , pre [ class "result" ] [ text model.lastSaved ]
        ]
```

この例では初期化する前に一瞬汚い textarea が見えないように非表示にしていますが、編集ボタンを押したらエディタに切り替えるような UI にも出来そうです。
面白いところは `onInput` が普通に効くところで、テキストを同期するだけであれば Port すら不要のようです。

とは言え、これだけだとつまらないので保存（`Ctrl+S`）した時にメッセージを受け取れるようにしてみます。

```elm
port save : (String -> msg) -> Sub msg
```


## JavaScript 側のコード

エディタの初期化だけちょっとトリッキーです。 Elm で描画されたタイミングを知る方法がないので、要素が出てくるまで `setInterval` で待っています。まあこれだと失敗した時に無限ループしてしまうので、ちゃんと書くならもう少し工夫が必要そうですが。


```javascript
var app = Elm.Main.init({
    node: document.getElementById("app")
});
var initializer = setInterval(function () {
    var textarea = document.getElementById("editor");
    if (!textarea) {
        return;
    }
    var editor = CodeMirror.fromTextArea(textarea, {
        lineNumbers: true
    });
    editor.setOption("extraKeys", {
        ["Ctrl-S"]: function (cm) {
            app.ports.save.send(editor.doc.getValue());
        },
        ["Cmd-S"]: function (cm) {
            app.ports.save.send(editor.doc.getValue());
        }
    });
    clearInterval(initializer);
}, 10);
```

ショートカットキーで保存したら Elm 側にメッセージを送るようにしています。利便性のためにテキストを送っていますが、 `onInput` で既に取得しているので実はなくてもいけます。

## 感想

もっとトラブるかと思ったのですが、実際には意図的にエラーを起こすまでは平穏無事でした。エディタやその先祖の要素を消すとまた textarea に戻ってしまうというトラブルがあるのですが、実際にはそんなにポンポン初期化を繰り返すようなアプリは多分あまりないと思うので、そこまで心配する必要もなさそうです。

将来的には WebComponents を使うともっとスマートに出来そうです。興味のある方は[先駆者の動画](https://www.youtube.com/watch?v=tyFe9Pw6TVE)もご覧ください。
Macでnodeのバージョン切り替え -nodebrew の使い方-

##公式
https://github.com/hokaccha/nodebrew


###インストール済みのバージョンを調べる

```bash
$ nodebrew ls
v10.10.0
v10.14.0
v11.3.0

current: v10.14.0
```

`current: v10.14.0`の部分が現在適応されているバージョンです。
以下のコマンドでも同じことができます。

```bash
$ nodebrew list
```


###インストールできるNode.jsのバージョンを調べる

```bash
$ nodebrew ls-remote
```

###インストールする

```bash
$ nodebrew install <version>
```

`<version>`では以下の表記が使えます。

- v10.14.0
- 10.14.0
- stable （= 安定版）
- latest （= 最新版）

###使用するバージョンを切り替える

```bash
$ nodebrew use <version>
```

`<version>`では以下の表記が使えます。

- v10.14.0
- 10.14.0
- stable （= 安定版）
- latest （= 最新版）

インストールされていないバージョンに切り替えることはできません。
先にインストールする必要があります。

###アンインストールする

```bash
$ nodebrew uninstall <version>
```

`<version>`では以下の表記が使えます。

- v10.14.0
- 10.14.0

###一時的に他のバージョンでコマンドを実行する

```bash
$ nodebrew exec <version> -- <command>

# 例えば以下のように使います
$ nodebrew exec latest -- node app.js
```
Mac/Linuxでファイル内文字列検索

#Mac/Linuxでファイル内にある特定の文字列を検索したい
Terminalでさくっと調べる場合に便利

``` :Linuxの場合
find . -type f -print | xargs grep 検索したい文字列
```

``` :Macの場合
find . -type f -print0 | xargs -0 grep 検索したい文字列
```
Gitで特定のブランチorタグをcloneする

#GitHubにあるリポジトリから特定のブランチをcloneしたい

```
git clone リポジトリ名 -b ブランチorタグ名
```

#具体例
例. 特定のブランチのapache tomcatをcloneする

1. ブランチ名を調べる
![tomcat.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/94861/305b52dd-205b-6583-3e07-569fc31a3c18.png)

2. cloneする
ここでdepth 1を指定することで、取得するコミットの履歴数を抑え軽量にcloneできる

```
git clone https://github.com/apache/tomcat.git -b 9.0.13 --depth 1 
```

**2020/10/07追記**
Github向けのCLIツールとしてghがリリースされたので、ghを使う場合の方法も追記します
ghでは--のあとに、gitコマンドのフラグを使えるので、下記のように読み替えます。

```
gh repo clone apache/tomcat -- -b 9.0.13 --depth 1 
```
面倒なこと（Shell Script）の代わりにPythonを使うにはInvokeが便利

[Invoke](http://www.pyinvoke.org/)というPython製軽量タスクランナーがある。

`@task`デコレータを設定した関数を作り、c.run()で以下のようにコマンドを実行する。

```python3:tasks.py
from invoke import *

@task
def install(c):
    c.run("pip install -r requirements.txt")
```

これを実行するには以下のようにする。

```
$ pip3 install invoke
$ invoke install
```

繰り返し文も以下のようにfor文でかける。

```python3:tasks.py
@task
def build(c):
    packages = ["Client", "Server", "Tester"]
    for name in packages:
        c.run(f"go build cmd/{name} -o out/{name}")
```

依存関係は、`@task`の引数に依存先の関数を渡す。

```python3:tasks.py
@task
def build(c):
    c.run("go build -o out")

@task(build)
def test(c):
    c.run("go test")

@task(test)
def release(c):
    c.run("zip out.zip out/")
```

終了コードによる分岐をする場合、`warn=True`を引数に加え、戻り値の`.ok`、`.failed`を使う。

```python3:tasks.py
@task
def build(c):
    if c.run("test -e ./node_modules", warn=True).failed:
        c.run("npm install")
    if c.run("test -e out", warn=True).ok:
        c.run("rm -rf out")
    c.run("tsc")
```

ディレクトリを移動するには、with句で`c.cd()`を呼ぶ

```python3:tasks.py
@task
def build(c):
    with c.cd("client"):
        c.run("go build")
        c.run("go test")
    with c.cd("server"):
        c.run("go build")
        c.run("go test")
```

関数に引数を設定すると、コマンドのパラメータになる。

```python3:tasks.py
@task
def release(c, gs_path, force=False):
    if force:
        c.run("git push -f")
    else:
        c.run("git push")
    r = c.run(f"gsutil rsync . {gs_path}")
```

```cmd
$ invoke release --gs-path gs://release-gcs/ --force
```

sedの代わりに使うには、標準出力は`r.stdout`で出力できるが、標準入力として使うには一度tempfileに出力して使う。

```python3:tasks.py
import tempfile

@task
def release(c):
    r = c.run("cat deployment.yaml")
    yaml = r.stdout.replace("__IP__", "3.4.5.6")

    with tempfile.NamedTemporaryFile() as tmp:
        with os.open(tmp.name) as f:
            f.write(yaml)
        c.run(f"cat {tmp.nmae} | kubectl apply -f -")
```

[このあたりをチートシートにした小冊子を作って、技術書典5でフリーペーパーとして配りました。ダウンロードもできますのでよければ活用ください！](https://74th.booth.pm/items/1042711)

[更に詳細な使い方の本を作って技術書典5で頒布しました。](https://74th.booth.pm/items/1042699)
Gatlingで普通のScalaコードの性能をテストする

S3のPUT性能を測ってほしいと頼まれて、Gatlingでできないか試してみたのがことの経緯です。
GatlingはHTTP/HTTPSの負荷テストをサポートしていますが、それ以外の方法はJMS
とMQTTをサポートしていますが、普通のScalaコードから負荷を書ける方法はドキュメントを探してもみあたりません。
S3のPUTはHTTPでできますが、SDKなしでGatlingのシナリオで再現するのはとても面倒です。通常利用する際はSDKで簡単にアクセスできるので、せっかくのScalaなのですから、SDKでアクセスするコードそのままに負荷テストしたいのです。

通常、Gatlingのシナリオはこのように書きます。
<img width="312" alt="スクリーンショット 2018-12-08 18.29.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/30244/e83a1069-b05e-7c41-bbd2-3070204b4574.png">
そこで、execに渡している型を自作できれば、その中にSDKでアクセスするコードを書いてやりたいことができるという算段です。

まずはexecの実装を見て見ましょう。
<img width="512" alt="スクリーンショット 2018-12-08 18.50.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/30244/661ffdbd-fec7-d479-a9c5-c3cbf821daaf.png">
ExecsトレイトのexecメソッドがActionBuilderを返しています。
次にActionBuilderを見て見ます。
<img width="396" alt="スクリーンショット 2018-12-08 18.52.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/30244/0d400bc4-c18c-20c1-addb-08a83fc2f5fa.png">
ActionトレイトにはbuildメソッドがありActionを返します。
<img width="370" alt="スクリーンショット 2018-12-08 18.53.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/30244/24465f30-8fb5-41cc-89d0-0bb9017b240f.png">
Actionトレイトにはexecuteメソッドがあり、名前から考えるとこれを実装すれば良さそうです。
しかし、引数のSessionはなんでも入ってるようなクラスなのでこのメソッド内で何をしているかわかりません。コメントも
> Core method executed when the Action received a Session message
> 「アクションがセッションメッセージを受信したときに実行されるコアメソッド」

としか書いておらず参考になりそうにありません。
そこで「Gatling Custom Action」などでググって参考になるページを探して実装できたんですが、今はそのページ消えていました。
いろいろあってActionBuilderとActionの実装はこうなりました。
<img width="532" alt="スクリーンショット 2018-12-08 19.02.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/30244/7d7d4cb6-c753-f90f-e034-c30edcae904b.png">
ActionBuilderのbuildメソッドの引数で渡されているScenarioContextからstatsEngineを取り出しlogReponseメソッドで実行データを記録しています。
利用方法はこんな感じになります。
<img width="370" alt="スクリーンショット 2018-12-08 19.06.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/30244/30d48117-4745-e2a5-dd5a-6a7cc3eacf9f.png">
適当な処理を書いてStatusを返しています。
これをgatling:testで実行すると無事負荷テストが実行され、レポートも出力されました。
<img width="594" alt="スクリーンショット 2018-12-08 19.09.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/30244/af17ca3a-eb1f-9123-d6e0-7587c2a89a1e.png">
<img width="864" alt="スクリーンショット 2018-12-08 19.09.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/30244/b5fae740-30df-2779-fe1e-7e2081dff0e2.png">

これでAWSやGCP、RedisなどHTTPアクセスが難しい対象に対しても簡単に負荷をかけられるようになりました。
[コードはここにおいてあります](https://github.com/rysh/gatling-cutsom-action-example)
プログラマが記録するとよい作成生年月日と著者名

映画を見ていて、いつも思うのは、どうして映画は製作者名が並ぶのに、
ソフトウェアは製作者名が並ばないのだろうかと。

公開算譜(open source)の場合には、著者は書かれていることが多い。
試験した人、手引きを作った人などの名前は掲載がないことがある。

作成年月日、変更年月日、著者名、担当者名などを記載する習慣を定着するにはどうしたらいいだろうか。

他の分野の状況を確認しながら、考察する。

<この項は書きかけです。順次追記します。>
This article is not completed. I will add some words in order.

# 規格類

ISO/IECの規格では、エディタ、著者名などはない。
なぜなんだろう。

IEEE, JISでは、関係者の一覧がある。

# 条約・法律

条約、法律で著者名を見ることはなかなかない。

作成年月日の記載がない場合がある。
公式文書にはあるのかもしれないが、WEBに掲載されている文書にないか、わかりにくい。

例：
視聴覚的実演に関する北京条約
http://www.cric.or.jp/db/treaty/doc/pekin.pdf

# 特許
日付は出願、公開など複数ある。
人は、出願人、代理人、発明者と３種類記載している。

https://www.j-platpat.inpit.go.jp/web/all/top/BTmTopPage

# 論文
日付は、投稿日、受付日、発行日の記載があるものがある。
人は、著者、参考文献の著者の記載がある。
長文の論文では、謝辞に関係者の名前の記載がある場合がある。

# 音楽
人は作詞家、作曲家、編曲者、演奏者などの名前の記載がある。
日付は、作曲美、演奏美などの記載がある。

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.


# 文書履歴(document history)
ver. 0.01 初稿 　20240107
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
requestsでcsvファイルにアクセスしてpandasで読み込む

# はじめに
csvファイルの直リンクから`requests`でデータを取得し、`pandas`で読み込みます。


# 手順

```python
import pandas as pd
import requests
import io

URL = "http://hogehoge.com/hoge.csv" # ここにcsvファイルのURLを書く

r = requests.get(URL)
df = pd.read_csv(io.BytesIO(r.content),sep=",")
```
`sep`で区切り文字を指定します。
Angular Consoleを触ってみた

## はじめに
この記事は [谷ゼミの落書き帳 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/drawing_pad_from_tani_seminar) の8日目の投稿になります。
特に書くネタがなく途方に暮れていたところ、3日前にAngularの公式ブログで[紹介されていた](https://blog.angular.io/angular-console-21d36c02ff76)ので試しに触ってみました。


## Angular Consoleについて
[Angular Console](https://angularconsole.com/)とは、Angular開発では欠かせないものとなった[Angular CLI](https://cli.angular.io/)を直感的に操作できるようになるアプリケーションです。
[Nx](https://nrwl.io/nx)を提供している[Nrwl](https://nrwl.io/)が開発しています。
執筆時点での最新バージョンは `v7.1.0` でAngular6、7に対応しているようです。


## インストール
### Angular CLIをグローバルへインストール
AngularCLIがないと使えないため、まだ入れていない方はインストールをしましょう。

```
npm install -g @angular/cli
```

### Angular Consoleをインストール
Angular Consoleはアプリケーションとして提供されており、[公式サイト](https://angularconsole.com/#download)より自分の環境に適したものをダウンロードしてきましょう。
ダウンロード後はインストーラーの指示に従ってインストールしてください。


## 取り扱い説明
今回は最低限これだけ知ってれば開発できる `new`、`serve`、`build`、`generate` を紹介したいと思います。
### New
新規にProjectを作成する場合は　`Create`、既にあるProjectをAngular Consoleで読み込む場合は `Open` を選びます。
今回は `Create` をクリックして次へ進みます。
<img width="1071" alt="スクリーンショット 2018-12-08 16.10.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/50750/507b7bdc-f89b-f05c-6db2-4432c6c1f225.png">
ディレクトリを選択しProject名を設定することで簡単に作成することができます。
<img width="1071" alt="スクリーンショット 2018-12-08 16.11.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/50750/be040639-7186-aa51-b2e4-fa494eb626a9.png">
ファイルの生成と同時に `npm install` を叩くようなので少し待ちます。
<img width="1071" alt="スクリーンショット 2018-12-08 16.12.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/50750/e9867e9a-866c-712b-4062-c547107f7f1f.png">
これで無事に `ng new` が完了しました。
`angular.json` のprojectsを一覧として出力してくれているようです。
この画面からポチポチすることによってAngular CLIの豊富な機能を扱うことができます。
<img width="1071" alt="スクリーンショット 2018-12-08 16.13.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/50750/a94bfce9-7c4e-a99c-632c-2dc73e59b807.png">

### Serve
実際に開発をするときは `ng serve` を利用します。

Angular CLIでは環境変数も対応しているため `angular.json` へ記載することによってAngular Consoleでも読み込み、環境変数をラジオボックスで選択することができるようになります。
Optional fieldsではポート番号やホスト名などCLIの多彩なオプションをポチポチ設定することができます。
<img width="1071" alt="スクリーンショット 2018-12-08 17.13.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/50750/a235913a-0cec-115a-d482-2cbbdd3439f6.png">

### Build
開発が完了しサーバーへ上げるときは `ng build` を利用します。
こちらでも環境変数を選択したりOptional fieldsで様々なオプションを設定することができます。
<img width="1071" alt="スクリーンショット 2018-12-08 17.14.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/50750/56dab09f-2c2c-c4db-6740-4c3d332d3909.png">

### Generate
`ng generate` を使うことによってコンポーネントやサービスなどのファイルを生成してくれます。
今回はコンポーネントを作成してみたいと思います。

nameで `/` で区切ることによってディレクトリ構造も作ることができるようです。
オプションからはCSSメタ言語の変更やchangeDetectionの設定などを変更することができます。
( `--dry-run` なんて便利なオプションあったんですね…… )
<img width="1071" alt="スクリーンショット 2018-12-08 17.33.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/50750/384d7759-0d8b-09ad-cb6a-a0d21d870f15.png">


## おわりに
開発で扱うときに最低限必要な機能を一通り試してみました。
ここで紹介しきれなかったもの以外にも `test` や `e2e`、 PWAなどの機能を追加できる `Add CLI Extensions` もあるので気になった人は触ってみてください。
Angular Consoleを使うことによってAngular開発の敷居が下がるのではないでしょうか。
ぜひ皆さんもAngular Consoleを使ってAngularで開発をしてみましょう！
【DDDモノ】ex システムの発展を見据えた設計戦略

# テストしやすさを維持するつくりに向けて

ドメイン駆動設計により、モノリスでくたびれたシステムをIoT対応の改修
![IDDD.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/659528d7-f285-0215-e865-bedd9af104ce.png)

改修時のアダプター層と最外層の区分け
# システム構成
## 関連システムのコード名
はじめに、ドメイン駆動設計のアプローチを試験的に取り入れる、今回のシステム改修（とある商品のIoT化対応改修）の関連システムにコード名をつけておこう。

>**MO**=総合顧客管理システム（お疲れ気味のモノリス。１５年もの。）
**IS** = IoTサービス提供システム（クラウド+IoT端末+スマフォアプリのシステム）
**PR** = IoT化工事支援システム
**ES** = IoT化事業総合検索システム

## 概要と方針
このうち、**MO**では、１５人程度の規模のチームを投入してのシステム刷新が行われている。**IS** は、１０人規模のチームによるスクラッチ開発が行われており、リリース後も改修が続けられる予定。
**PR**と**ES**は、この両システムを下支えするシステム。IoT化顧客対応チームと外注先の工事業者・保守・運用業者等との情報共有を行う**PR**では、オープンソースパッケージ「[プリザンター](https://qiita.com/Implem/items/1d815f93719d4129dc4f)」を一部フロントエンドのこーとをカスタマイズして利用する。
また、**ES**では、**IS**と**PR**、それぞれの全情報のインデックスを作成し、ログ検索と全文検索を行うためにElasticSearchを利用する。
このうち我々のチームがシステム改修を担当するのは、**PR**と**ES**。開発予算を削減するため、 当初から特定のサービスを用いるが、コアなロジックの実装は、用いるサービスとは独立に行っていく。
NuxtでMarkdownエディタ（Qiitaみたいな）

## はじめに
NuxtでQiitaみたいな記事投稿ページを作りたいと思い、[toast-ui.vue-editor
](https://github.com/nhnent/toast-ui.vue-editor)というnpmパッケージを使ったので、toast-ui.vue-editorの紹介:walking_tone1::walking:
![markdown.mov.gif](https://qiita-image-store.s3.amazonaws.com/0/266140/c2eb05af-acff-f9f9-30c2-4449e91a8d27.gif)
## 準備
Nuxtのプロジェクト作成は[nuxt/create-nuxt-app
](https://github.com/nuxt/create-nuxt-app)を使用します。

以下をインストール:point_down:

```
npm install @toast-ui/vue-editor --save
npm install codemirror --save
npm install tui-editor --save
```
```json:package.json
"dependencies": {
    "@toast-ui/vue-editor": "^1.0.2",
    "codemirror": "^5.42.0",
    "cross-env": "^5.2.0",
    "nuxt": "^2.0.0",
    "tui-editor": "^1.2.8",
    "vuetify": "^1.2.4"
  }
```

## Challenge :santa:
まずはnuxt.config.jsでcssを読み込む。

```javascript:nuxt.config.js
/*
 ** Global CSS
*/
  css: [
    '~/assets/style/app.styl',
    /* 以下を追加　↓ */
    'tui-editor/dist/tui-editor.css',
    'tui-editor/dist/tui-editor-contents.css',
    'codemirror/lib/codemirror.css'
  ],
```

プレビューは **previewStyle**から"vertical”か"tab"を選択可
Markdownの表示だけならば**Viewer**だけimportしてvalueにバインドさせれば表示できます。


```vue
<template>
  <div>
    <editor v-model="editorText" :options="editorOptions" :visible="editorVisible" height="500px" previewStyle="vertical" />
    <viewer :value="editorText" />
  </div>

</template>
<script>
  import {
    Editor,
    Viewer
  } from '@toast-ui/vue-editor'

  export default {
    components: {
      'editor': Editor,
      'viewer': Viewer
    },
    data() {
      return {
        editorText: '',
        editorOptions: {
          hideModeSwitch: true
        },
        editorVisible: true
      }
    }
  }
</script>

```

### 感想
[toast-ui.vue-editor](https://github.com/nhnent/toast-ui.vue-editor)がいい！！:snowman2:
詳しいオプションは公式を見てください:point_right:[nhnent/tui.editor
](https://github.com/nhnent/tui.editor)
AOJ day 15: Upgrade from Bower to Psc-Package2Nix

Even though nobody needs to suffer installing their project dependencies with Bower anymore, we still have some people with projects started in Bower from the past couple of years who might not have changed. Worse, sometimes we have users who have a project started with Bower, not knowing that they have much better options to work with.

A long time ago, I wrote about how to upgrade from Bower to Psc-Package: <https://qiita.com/kimagure/items/0d9354900d7a7dbd3864>

And while this is enough to work with our projects in a pretty modern way, Psc-Package itself is a very simple tool that doesn't try to introduce much. If we want a robust way to verify the contents of dependencies we pull down and store them to be shared between multiple installations, we're going to have to come up with good ways to do this.

## "Upgrade from Bower to Nix with Psc-Package2Nix"

In this article, I wrote about how to upgrade a project using Bower to Nix via Psc-Package2Nix:

<https://qiita.com/kimagure/items/aec640d0047d08d2ce90>

With this, we can use a simple `psc-package.json` file to specify the package set definitions and direct dependencies just like with regular Psc-Package usage, but then we can use Psc-Package2Nix to get a set of derivations we can use to install our dependencies.
AOJ day 14: Implementing your own PureScript compiler Type Class

While the current set of compiler type classes are pretty nice, sometimes there's not a class for something I'd like to do. Other times, there's an operation I could perform manually with the existing classes, but the inference and performance of solving these constraints is terrible.

Whatever the reason, it would be nice to define some of my own compiler type classes.

## "Implement your own compiler type class in PureScript"

In this post, I go over what all is involved in lining up the pieces in the PureScript compiler codebase to add your own compiler-solved type class.

<https://qiita.com/kimagure/items/8736fe6a2f25da526368>

Once we have all of the pieces in place from a few dozen lines of adding new definitions, documentation, and functional dependencies information, we can write the core logic that solves our instances. For example, checking if a Symbol pattern is contained within another Symbol and getting a Boolean-kinded result:

```hs
containsSymbol :: Type -> Type -> Type -> Maybe (Type, Type, Type)
containsSymbol patt@(TypeLevelString patt') sym@(TypeLevelString sym') _ = do
  flag <- T.isInfixOf <$> decodeString patt' <*> decodeString sym'
  pure (patt, sym, TypeConstructor $ if flag then C.booleanTrue else C.booleanFalse)
containsSymbol _ _ _ = Nothing
```
AOJ day 13: Type-level annotated string templates

Previously, I covered my post about well-typed paths using Symbols with formatting parameters, such that we can derive a parsing function from a Symbol proxy like so:

```hs
-- inferred type:
parseHelloURL :: String -> Either String { name :: String, age :: String }
parseHelloURL = parseURL (SProxy :: SProxy "/hello/{name}/{age}")
```

But really, we might like to read `age` here as an `Int`, and we could provide this information as a type annotation. And we can!

## "Parsing type-level strings to extract types"

In this post, I go through how we can modify the previous implementation to conditionally parse out a type annotation from our Symbol, by using the same techniques for parsing piecewise with instance chain groups as done in Record-Format and other libraries.

<https://qiita.com/kimagure/items/6729a5d55ab99bcee8ec>

This way, we can instead work with URLs that have their types annotated like so:

```hs
parseHelloURL :: String -> Either String { name :: String, age :: Int }
parseHelloURL = parseURL (SProxy :: SProxy "/hello/{name:String}/{age:Int}")
```

## "Simple Routing based on parsing type-level strings"

There's also a follow-up post to this that applies classic RowToList techniques to allow for a row of these routes to be tried to product an Either of no matches and a Variant of the routes:

<https://qiita.com/kimagure/items/5c3f3fcb898e480c56be>
AOJ day 12: Tortellini

For whatever strange reason, many INI libraries only work by representing your INI files as hashmaps, where the most common representation is `Map String (Map String String)`. While people often live with this, I wanted to get greater type safety when working with INI configuration files.

I ended up writing two libraries: one in PureScript and one in Haskell.

## "The Tale of Two Tortellini: making record based libraries in PureScript and Haskell"

In this post, I wrote about the process involved in writing each library and how they compare when working with a model of fields to sections, sections to document.

<https://qiita.com/kimagure/items/941c22effff608dda9a7>

While the PureScript version was able to take advantage of anonymous records and the row types inside, the Haskell version was limited in that every section of the INI document needed to be its own record type. While it isn't that much of a shortcoming, it does show that having proper anonymous records would go a long way here.

And while this post is about INI files, the techniques covered here should help anyone write their own decoding code for JSON or any other format where they can work with a parsed structure.
DDD本3章を読んでこのように理解しました



# はじめに
[エリック・エヴァンスのドメイン駆動設計](https://www.amazon.co.jp/dp/4798121967/ref=asc_df_47981219672544791/?tag=jpgo-22&creative=9303&creativeASIN=4798121967&linkCode=df0&hvadid=295719984664&hvpos=1o1&hvnetw=g&hvrand=16461507014967985925&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009370&hvtargid=pla-525481409888&th=1&psc=1)(2004)の第3章 「モデルと実装を結びつける」を読んで自分的に理解したことを書き出す
結構自分の考えと混じってしまってるので、ここに書いてあることイコール本の内容ではないです

自分の理解の足りないところやおかしいところはバシバシ突っ込んでもらいたいです:bow:

### 他のまとめ
* [第4章 「ドメインを隔離する」](https://qiita.com/mafuyuk/items/f1626db002915bfab099)
* [第5章 「ソフトウェアで表現されたモデル」](https://qiita.com/mafuyuk/items/07782dcf558e1faa9dc3)
* [第6章 「ドメインオブジェクトのライフサイクル」](https://qiita.com/mafuyuk/items/82dea8efe73644d5063a)
* [第8章 「ブレイクスルー」] (https://qiita.com/mafuyuk/items/91fb0ecb667fbadeceff)

## 対象者
* 古いシステムからリプレイスする人
* リリース優先で作った際のリスクを見ておきたい人
* 設計をしていなくて雰囲気で物を作っている人
* エリック・エヴァンスの本を読むと抗えない眠気に襲われる人

## ざっくりどんな話?
これまで開発手法として手続き型が使われていたけど、アナリストの洞察が含まれたモデルを開発者がソースコードに落とし込む際にモデルとプログラムの設計に乖離が起こっていたよね

モデル != コードの都合上モデルは保守されず、コードからは設計思想が抜け落ちてしまう...

工数は伸びるけどモデル駆動設計を使えば、アナリストと開発者で同じモデルを作って、それをコードに落とし込むから乖離が少なくてよき

つまり全員が同じモデルを頭の中に描いていて、コードもそのモデルを表している状態になっている場合は機能追加、改修時もモデルに対しての変更を話し合えばいいっていう状況ができて幸せになれるよ


なのでモデル駆動設計おすすめ
って感じかな...?

# 開発手法
3章の内容は開発手法の「手続き型」と「モデル駆動設計」についてが主だと思ったので、その内容のみ深掘りします

## 手続き型
### 手順
どういう手順で開発を行っていたのか
チームとして手続き型の開発経験がほぼないので、自分の会社だったらあれかな？っていうコメント追加してみました。逆に分かりづらくなったら:bow:

1. アナリストが分析モデルを作成
自分が所属している組織だと アナリスト == ディレクターが近いかな?
ディレクターが「こんな感じの画面のこんな遷移するとこうなる機能欲しい」をExcelで作っていた記憶

2. 開発者がアナリストに話を聞きながら設計モデルを作成
クラス図、シーケンス図などが該当?
自分が所属している組織だと昔 Wordに「 1.〇〇する 2. 〇〇の場合は△△」みたいなこと書いてあったけどあれかな...?

3. 開発者が実装
4. リリース後追加修正があるとコードの該当箇所のみを見て改修

成果物として分析モデル、設計モデルができる
### Pros
* 開発速度が早い
  * 作る際に妥協が行われたりアナリストの洞察が失われたりするので、その部分を悩む必要がない
  * 小さいプログラムだとこっちでいいよね

### Cons
* 分析モデルと設計モデルにずれが生じモデルがメンテされなくなり、初期の設計思想が失われる
  * 分析モデルはビジネスドメインを理解するためだけに使うツールのため、ソフトウェアシステムで果たす役割を全く考慮しないので設計モデルとの間にずれが生じる

* 分析モデルと設計する人が別なので、実装時にアナリストによってモデルに組み込まれた洞察が失われる
  * 開発者が分析モデルを設計にうまく落とし込めない
  * アナリストが情報の差異があった際に検知できない

* 改修があった際に設計モデルを保守するのがきつい
  * よくある条件分岐やswitch文が増えるような改修が多くなってしまうはずなので、それを言葉で表すことやパターンを網羅するのは現実的ではない

## モデル駆動設計
DDD本で紹介されている開発手法
> 分析モデルと設計という二分法を捨て去り、両方の目的に使える単一のモデル(ドメインモデル)を探し出す

* モデルに対しての変更はコードに対しての変更が発生することを意味する
* コードに対しての変更はモデルに対しての変更が発生することを意味する


### 手順
設計をコードに落とし込むとコードとビジネスドメインに乖離がないので追加修正が発生した際にドメインモデルに対してのイテレーティブな修正を続ける形

1. 仕様の変更をどのようにドメインモデルに反映するか考える
2. ドメインモデルの更新

成果物としてドメインモデルができる
設計をコードに落とし込むことになるのでドメインモデルはコード上で表す

### Pros

* ドメインモデルが設計を表していることになるので設計思想がメンテされ続ける
* モデルの保守はコードで行える
* ドメインモデルをアナリスト(ドメインエキスパート)と開発者で作り上げるので、アナリストの考えが失われない
  * [顧客が本当に必要だったもの](https://dic.nicovideo.jp/a/%E9%A1%A7%E5%AE%A2%E3%81%8C%E6%9C%AC%E5%BD%93%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%A0%E3%81%A3%E3%81%9F%E3%82%82%E3%81%AE)にあるアナリストの設計とプログラマのコードの差がないはず...


### Cons
* 難易度が高く、設計と実装ともに工数がかかる
  * 分析が技術的な配慮から致命的に妥協した貧弱なものになってはいけない
  * ドメインに対する考え方を反映しているが、ソフトウェア設計原則をさけたできのわるい設計になってはいけない

* モデルを保守し続けないと意味がない
  * モデルを考慮しない場当たり的な更新を加えるとモデルから設計を読み 取れなくなる
  * レビューやチーム内のモデルを保守する意識をもたせる必要あり

# 最後に
モデル駆動設計いいよ～っていう内容でしたがなんでもかんでもに使えよっていう話ではなく、本の文脈としては設計をしっかりやらないといけないようなドメインに対してのおすすめっていう雰囲気でした

なので、自分のコンテキストに合わせて随時判断しましょう
メモ

protected void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException

サーブレットがGETリクエストを処理できるようにするために、サーバーによって呼び出されます

req-クライアントがサーブレットに対して行ったリクエストを含むオブジェクト
res-サーブレットがクライアントに対して送ったレスポンスを含むオブジェクト

要するに、ブラウザ(クライアント)がサーバーに対して何らかのリクエスト(画面遷移しようとするとか)を求めたときに、httpサーバ(Apacheとか)？がこのメソッドを呼び出す
また、サーバーがクライアントにレスポンス(次のページの情報とか)を送信するときに呼び出される
JVMがpublic static void main(String[] args)を呼び出すのが決まっているような感じ？

doGetメソッドは主にクライアントから要求された内容を出力するような処理を記述する。
doPostメソッドは主にクライアントからデータが送信される場合に利用する。
2018年身の回りでデジタル化したもの

この記事は[TOWN Advent Calendar 2018](https://qiita.com/advent-calendar/2018/town) 9日目の内容になります。普段はTOWN株式会社で学生アルバイトとしてAipo(https://aipo.com )の開発に携わっています。
本日は私が2018年に自分で作ったものを含めて身の回りでデジタル？化したものをまとめておこうかと思います。

#リモコン操作
去年の年の瀬にAmazon Echoを買いました。
家の照明とかエアコンを玄関や布団の中から操作できたら良いよねってことで声で操作できるようにしました。

<img width="883" alt="スクリーンショット 2018-12-08 10.22.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/160730/2ccfb47f-e347-6a1c-0a69-d5749fd34cbc.png">

Node-REDのおかげでほぼコーディングなしで実装できました。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/160730/5d43c8c2-916b-f94f-058f-9a1c986d310b.png)

照明をつける時間によって照明の色温度が変化するようにしています（22時以降は暖色にするなど）

##今後
・リモコン以外で動く機器も声で操作できるようにしたい(パソコンの電源とか物理スイッチ押す系）
・API化してスマホから柔軟に操作できるようにしたい

#部屋の状態モニタリング

https://qiita.com/t-funaki/items/61ff1487088f3f01d9a7

気温、湿度、気圧などを測れるセンサーを用いて、室内状態をデータ化しました。

<img width="1580" alt="スクリーンショット 2018-12-08 10.32.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/160730/89d1f72a-b9ac-09dd-53d4-90a4d455c3b5.png">

データベースにはinfluxDB、グラフ化にGrafanaを使っています。
外出先から気温を確認したりして、エアコンを操作したりしています。
夏場は35℃を超えたらLINEに通知が飛んでくるようにしていました。

##今後
・ビッグデータの活用
一年近くデータ貯めてたら部屋の状態プチビッグデータができました。
<img width="1343" alt="スクリーンショット 2018-12-08 10.37.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/160730/3b9f6444-5d43-ef67-cae7-484ec06e5b7a.png">

このデータをうまいこと活用したい・・・　アイデア募集中です（笑）

・リモコン、スマホと連動
外出先からデータを見るときは自宅のVPNに繋いでGrafanaにログインして・・・とやっているので面倒くさいです。
LINE botとか活用して手軽に気温を確認してそのままエアコンの操作とかもLINE上で完結できるようにしたいです。

#鍵(スマートロック)
家の鍵っていちいちカバンから出したり、なくなさないように管理したりと面倒くさいですよね。
面倒くさいことはデジタル化しましょうということでスマホやICカード（おサイフケータイ）で操作できるようにしました。

https://qiita.com/t-funaki/items/2a3bbed8f63d2dc660a3

こちらはまだ試作の段階で実用化には至っていません・・・
セキュリティ（APIに認証を実装していない）、信頼性の問題（システムがダウンしたとき）を直せば実用化できるかなと　他人がハッキングして開けられるor鍵持ってなくてシステムダウンして開かなくなると困ります・・・


#番外編
自分で作ったものでは無いですがデジタル化したものは他にもあったりします。
・手書きのメモ
iPad+Apple Pencilでメモを取ることが多くなりました。
・お金
キャッシュレスを進めて現金をあまり使わなくなりました。お金の流れはマネーフォワードで可視化しています。
・
matplotlibで軸を消す

# 概要
matplotlibで軸を消す方法について紹介します。
詳細は「matplotlib.axes.Axes.tick_params」で検索してください。

# 軸目盛りラベルを消す
消したい軸目盛りラベルの位置=`False`で消える。

```py
ax.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False)
```
※ `plt.tick_params(...)`でもOK

# 軸目盛り線を消す
消したい軸目盛り線の位置=`False`で消える。

```py
ax.tick_params(bottom=False, left=False, right=False, top=False)
```
※ `plt.tick_params(...)`でもOK

# 全部消す
```py
ax.axis("off")
```
※ `plt.axis("off")`でもOK
DAIさんの「Pythonによるスクレイピング」をやってみた



スケベサイエンティストで有名なDAIさん（noteは[コチラ](https://note.mu/daikawai)）の
12月8日24時まで無料公開中のチュートリアル（[コチラ](https://note.mu/daikawai/n/nc73889d6d835)）をやってみました。

##チュートリアルの内容
- ブログの記事名の取得
- そのブログのURLの取得
- 上記をCSVに出力してダウンロー

##実行環境と使用するライブラリ
- 実行環境
 - Google Colaboratory（環境構築不要のPythonの実行環境）
- ライブラリ
 - Requests
 - BuautifulSoup
 - Pandas

##感想
スクレイピングって思ってたより簡単！（ライブラリ様様）
今回のを応用して他にもできることがありそうなのでチャレンジしてみようかな。

主旨とは若干ずれるけど、解説がとっても丁寧ですごくわかりやすかった。
解説 → 練習問題 といった構成で少しずつレベルが上がり、
初心者には親切な作りでコンテンツの構成という部分も勉強になった。
pyppeteer + HeadlessChromeで社用ツールを自動化する

この記事は、[LIFULLその2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/lifull2)の6日目の記事です。

※注意: 例示するツールとしてチャットワークを使っていますが、[チャットワーク公式のAPI](http://developer.chatwork.com/ja/)が公開されているのでわざわざクローリングする必要はありません。

勤怠管理や稟議など、けっこう面倒なシステムって多いですよね？特に社用ツールはやや古いものが多く、（リプレースの計画も進んでいるようなのですが）触っていて楽しいものではなく、私の場合はどうしても後回しにして、楽しいPython実装を優先してしまうことが多いです。同じように「好きなものは先に食べてしまう」タイプの人って多いですよね？

以前の上司もそういうタイプだったので、「俺もよく忘れるんだよｗけど俺よりひどいから気をつけて」って感じで私も気にしてなかったのですが、最近上司が変わって（当然）注意されてしまいました。
<img width="883" alt="スクリーンショット 2018-12-08 17.35.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/127762/2b7fd0d1-d660-e1e1-d608-1c2f03a9b298.png">
↑怒られたときの例。その節は申し訳ありませんでした。

というわけで今回は[pyppeteer](https://github.com/miyakogi/pyppeteer)という、PythonからHeadlessChromeを呼び出せるツールを使えば、簡単に自動化できるものもあるんじゃないか？という実験をシェアします。スクリプトから自動化できれば、自動でjsonやyamlファイルを生成して入力することができ、実装作業に近づくためモチベーションも上がるはずです。

## サンプル実装

サンプルとして次のような、チャットワークにメッセージを送信するコードを作ってみました。

1. チャットワークにログインする
2. メッセージを送信する

async/await使っているのは、pyppeteerの元になったライブラリがnode.jsのもので、pyppeteerの関数もそちらのAPIを再現する形で実装されており、そちらに合わせるほうが楽だったからです。

```python:main.py
import asyncio
from src import crawler

async def main():
    async with crawler.ChatworkSession("your_email", "your_password") as s:
        await s.post_message("こんにちは", room_id="********")

if __name__ == "__main__":
    asyncio.get_event_loop().run_until_complete(main())
```

こちらのようにPageの```type```メソッドで入力し、```click```メソッドでボタンを押して送信するというものが多いです。非同期的に行ってしまうため、「待つ」動作が必要になることもあります。

ちなみに、HeadlessChromeはライブラリの初回起動時に自動でインストールされます。こうしたツールを作るときに非常に楽ですね。

他の社用ツールもほぼこの流れで対策できるはずです。

```python:src/crawler.py
from pyppeteer import launch
import asyncio


class ChatworkSession(object):
    def __init__(self, login_email, login_password):
        self._login_email = login_email
        self._login_password = login_password

    async def __aenter__(self):
        self._browser = await launch(headless=True)
        self._page = await self._browser.newPage()
        await self._page.goto('https://www.chatwork.com/login.php')
        await self._page.type('input[name=email]', self._login_email)
        await self._page.type('input[name=password]', self._login_password)
        await self._page.click('input[name=login]')
        await asyncio.wait([self._page.waitForNavigation()]) # 読み込むまで待つ
        return self

    async def post_message(self, message, room_id):
        await self._page.goto(f"https://www.chatwork.com/#!rid{room_id}")
        await self._page.type('textarea[id=_chatText]', message)
        await self._page.click("div[id=_sendButton]")

    async def __aexit__(self, exc_type, exc, tb):
        await self._browser.close()
```

## 懸念や難しい点

async/awaitの実装にまだ慣れません…。また、きちんとテストされたコードではないため、awaitの実行順によってはエラーが起きると思います。同期的なメソッドでラップしてしまうのもありかもしれません。


## 参考

* [asyncio公式ドキュメント](https://docs.python.jp/3/library/asyncio.html)
* [pyppeteer公式ドキュメント](https://miyakogi.github.io/pyppeteer/)
* [puppeteer](https://github.com/GoogleChrome/puppeteer) （node.jsからHeadlessChromeを扱うライブラリ。同じことができるはずです）
CryptZombiesレッスン4(チャプター６~１3)の自分なりのまとめ

# はじめに
この記事は私がCryptZombiesを進めていく上で自分なりにまとめたものです。
**前回の記事**
https://qiita.com/daichi77/items/28a44053a1d915fe03b8
**参考にしたサイト**
サイト名: イーサリアム上のDApp開発をゲームを作って学びましょう
URL: 　https://cryptozombies.io/jp/　
**この記事の問題文と答えについては上の参考にしたサイトから引用しています。**
# チャプター６ 共通ロジックのリファクタリング
## 要点
```
require(msg.sender == zombieToOwner[_zombieId]);
```
これをなんども使っているので関数修飾子として定義し、なんども書かなくていいようにする。
## 今回したこと(テスト)
要点でも述べたとおり、

```
require(msg.sender == zombieToOwner[_zombieId]);
```
この文を関数修飾子として定義し、feedAndMultiply関数を修飾する。
# チャプター７　さらなるリファクタリング
changeName()とchangeDna()にownerOf修飾子をつけただけなので割愛。

# チャプター８　Attackへ戻ろう
## 要点
今回は特になし
## 今回したこと(テスト)
1. ownerOf修飾詞をattack関数に追加(ゾンビとオーナーの関係が正しいかの確認)
2. myZombieとenemyZombieのstorageの作成
**storageのおさらい**
メモリとは違いブロックチェーン場に永久に残るやつ
3. randModを使って乱数生成

# チャプター９ ゾンビの勝敗
## 要点 
個別のマッピング、スコアボードの構造体、もしくはZombie構造体自体の中などゾンビバトルのスコアを保存する方法がいくつもあるが今回は構造体自体の中で保存する。
これらの方法にはそれぞれ利点、トレードオフがある。(この章では説明されていない)

## 今回したこと
Zombie構造体にwinCount,lossCountを追加。
さらにcreateZombieしたときにwinCount、lossCountが０になるように修正。
今回でゾンビに勝利数、負け数が保存できるようになった。

# チャプター１０ ゾンビの勝利
## 要点
## 今回したこと(テスト)
randがattackVictoryProbability(70)より小さかったときにmyzombieのlevel,winCountを＋１、enemyZombieのlossCountを+1するように設定。
最後に feedAndMultiply関数を呼び出した。これはあとでゾンビをベースとして新たなゾンビを生み出すときに必要になってくる。
(feedAndMultiply関数はゾンビのDnaとターゲットのDnaから新たなゾンビを作り出すときの関数)

# チャプター１１ ゾンビの敗北
## やったこと(テスト)
else文を使ってゾンビが負けたときの処理を記入。さらにif文の外で_triggerCooldownを呼び出すことで1日に一回だけ攻撃することができるようになるらしい。
## 疑問
_triggerCooldwonメソッドを書いたとしても_isReady関数使ってないから1日に何回でも攻撃できるのでは？と思ってしまった。これについてはよく分からないので知ってる人はコメントくれるとありがたいです。
# チャプター１２、１３
実際にバトルするだけなので省略

# 次の記事
https://qiita.com/daichi77/items/60477e3e85d3fbc27f0f