OmniAICreator/Qiita-1.07M huggingface dataset:
tan(x)を何度も微分する

# はじめに

だいぶ前ですが、Twitterで「RT(Favだったかな？)の数だけtan(x)を微分する」というつぶやきを見ました。わりとRT/Favされてて収拾がつかなくなっていたようです。

$\tan(x)$は$\sin(x) / \cos(x)$なので、一度微分すると、

$$
\frac{d}{dx} \tan{x} = \frac{1}{\cos^2{x}}
$$

もう一度微分すると、

$$
\frac{d^2}{dx^2} \tan{x} = \frac{2 \sin{x}}{\cos^3{x}}
$$

と、いい感じにややこしくなっていきます。

最近、シンボリックな微分コードが欲しくなったところだったので、その練習として、tan(x)を微分するコードを書いてみましょう。

# 方針

$\tan{x}$を微分するとき、$\tan{x} = \sin{x}/\cos{x}$にして、$f(x)/g(x)$という分数の微分公式、

$$
\frac{d}{dx} \frac{f(x)}{g(x)} = \frac{f'(x) g(x) - f(x)g'(x)}{g^2(x)}
$$

を使いたくなります。しかし、プログラムで微分する場合は、

$$
\tan{x} = \cos^{-1}{x} \sin{x}
$$

という形にしたほうが扱いやすいです。

いま、$\cos{x}$と$\sin{x}$のべき乗の積、$\cos^m{x} \sin^n{x}$を考えましょう。これを微分すると、

$$
\frac{d}{dx} \cos^{m}{x} \sin^{n}{x}
= -m \cos^{m-1}{(x)} \sin^{n+1}{(x)}
+ n \cos^{m+1}{(x)} \sin^{n-1}{(x)}
$$

と、やはり$\cos^m{x} \sin^n{x}$の形しかでてきません。なので、$\tan{x} = \cos^{-1}{x} \sin{x}$という形からスタートして、後は上記のルールに従って計算していけば、何度でも微分できることになります。

# コード

というわけで、そのままコードに落としてみましょう。デフォルト値があるハッシュを使えばあっという間です。$\cos^{m}{x}\sin^{n}{x}$を、`[m,n]`という配列で表し、この配列をキーとして、係数`v`をハッシュとして登録しましょう。

```rb
def diff(h)
  h2 = Hash.new(0)
  h.each do |key, v|
    m, n = key
    h2[[m-1,n+1]] += v*n if !m.zero?
    h2[[m+1,n-1]] -= v*m if !n.zero?
  end
  h2
end

h = Hash.new

h[[-1,1]] = 1

5.times do
  h = diff(h)
  p h
end

```

実行するとこんな感じです。

```sh
$ ruby tan.rb
```

```rb
{[-2, 2]=>1, [0, 0]=>1}
{[-3, 3]=>2, [-1, 1]=>2}
{[-4, 4]=>6, [-2, 2]=>8, [0, 0]=>2}
{[-5, 5]=>24, [-3, 3]=>40, [-1, 1]=>16}
{[-6, 6]=>120, [-4, 4]=>240, [-2, 2]=>136, [0, 0]=>16}
```

これを見て気が付きました。

$\cos^{m}{x}\sin^{n}{x}$を、`[m,n]`という配列で表すと、これを微分すると`[m+1, n-1]`と`[m-1, n+1]`しか出てきません。つまり、$\cos^m{x}$と$\sin^n{x}$の係数の和`m+n`は常に一定です。

最初に$\tan{x} = \cos^{-1}{x} \sin{x}$からスタートしているので、常に$m+n=0$が成立します。つまり、$\tan{x}$を何度微分しても、$\tan{x}$のべき乗の線形和で表せる、ということです。

改めて微分の式を書くとこんな感じになります。

```math
\begin{align}
\frac{d}{dx} \tan{x} &= \tan^2{x} + 1 \\
\frac{d^2}{dx^2} \tan{x} &= 2 \tan^3{x} + \tan{x} \\
\frac{d^3}{dx^3} \tan{x} &= 6 \tan^4{x} + 8\tan^2{x} + 2\\
\end{align}
```

これを、パスカルの三角形的な形にするとこんな感じになるでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79744/f9a4968a-ba19-a769-faaa-3c437a525180.png)


で、ここまで考えたところで、Twitterで先行研究があることを教えていただきました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">これ<a href="https://t.co/iAc8z5HeLW">https://t.co/iAc8z5HeLW</a><br>ですかね？</p>&mdash; Keigo Nitadori (@k_nitadori) <a href="https://twitter.com/k_nitadori/status/1142359088740745216?ref_src=twsrc%5Etfw">2019年6月22日</a></blockquote>

あるだろうなと思ってましたが、やっぱりありましたね・・・

# まとめ

Rubyで$\tan{x}$を何度も微分するコードを書いてみました。っていうか、コードを書く前に「$\tan{x}$を何度微分しても$\tan{x}$のべき乗しか出てこない」という事実に気が付かなかったのはアホすぎますね。

この、`tan(x)`を何度も微分して、その係数がどんどん増えてややこしくなっていくという奴、なんとなく[L System](https://ja.wikipedia.org/wiki/L-system)を思い出しますね。

# 参考文献

* [The On-Line Encyclopedia of Integer Sequencesでの記述](https://oeis.org/A155100)
Pythonでデータベースに関するコード集

未来電子テクノロジーでインターンをしているもーなです。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
今回はプログラミング初心者の私が学んだPythonについての知識について、書きます。

```
< form action="URI">
```
URIとは、データの送信先を表し、データの受け渡し作業を行うサーバーのURIのこと！
actionとは、フォームの送信ボタンを押して、送信されるデータの送信先を指定します。

```
<method="POST">
```
methodは、送信するときの転送方法を指定します。
今回の場合は、POSTで転送します。

```
db_path
```
db_pathは使用するデータベースを指定するコードです。

```
con = sqlite3.connect(データベース名)
```
sqlite3オブジェクトを取得し、データベースに接続することを意味しています。

```
con
```
conとはconnectionの略です。
connectionとは、データベースを接続する際に使用するコードです。
readme-md-generatorを使ってリッチなREADME.mdをお手軽に作ってみませんか? 

今回は簡単にREADME.mdを作成できる、`readme-md-generator`を紹介させていただきます。

githubはこちらです。良いと思った方は:star2:をつけると良いと思います。

- [kefranabg/readme-md-generator - github](https://github.com/kefranabg/readme-md-generator)

# `readme-md-generator`とは

CLIで動かせる、美しいREADME.mdを生成するためのライブラリです。

package.jsonとgitの設定をデフォルトとしてREADME.mdを作成するようです。

# 使ってみました

### 基本的な使い方

このように対話式にREADME.mdの内容を設定できます

※↓のは全部<kbd>Enter</kbd>としてるので、デフォルト値がそのままREADME.mdに書き込まれます。(または、`npx readme-md-generator -y`としてもと全てデフォルト値としてくれます。)

![Jx0YgBCnfG.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/1c9481f3-2655-8f55-c6e8-63f7159db3b2.gif)

自動でmarkdownファイルが出来上がりました。

![Screen Shot 2019-06-30 at 20.00.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/c03bd2ad-905f-7e7b-655b-2f1caf4e48f7.png)

---

良い`package.json`の例としてはこのような感じになるようです。

※ちょっと前にこちらの投稿で書いたコードの`package.json`を再作成してみました。
https://qiita.com/okumurakengo/items/aecd060ce64c99a646c8

```package.json
{
  "name": "react-hooks-todos",
  "version": "1.0.0",
  "description": "ReactのHooksを使ってReduxのTodoリストをReduxなしに書き換えたサンプル(TypeScript使用)",
  "main": "webpack.config.js",
  "scripts": {
    "start": "webpack-dev-server"
  },
  "homepage": "https://github.com/okumurakengo/react-hooks-todos#readme",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/okumurakengo/react-hooks-todos.git"
  },
  "author": "okumurakengo",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/okumurakengo/react-hooks-todos/issues"
  },
  "engines": {
    "npm": ">=5.5.0",
    "node": ">=9.3.0"
  }
}
```

```bash:bash
npx readme-md-generator -y
```

少し書き換えたりとかしましたが、こんな感じにREADME.md生成してくれました、すごいですね:grinning:
ライブラリの信用度も上がりそうです。

![github.com_okumurakengo_react-hooks-todos (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/82afe2d8-c918-0e2f-14bf-4eee30ff1052.png)

# `ejs`のテンプレートを使用できる

```bash
npx readme-md-generator -p path/to/my/own/template.md
```

`.md`ファイルに`ejs`で記述し、それをテンプレートとして使うことができます。

テンプレートの例はこちら：https://github.com/kefranabg/readme-md-generator/tree/master/templates

---

読んでいただいてありがとうございました。m(_ _)m
Google Compute EngineでGrafanaを動かしてCloud SQLのデータを見る方法

## 概要

Google Compute EngineでGrafanaを動かしてCloud SQLのデータを見る方法です。

Cloud SQLのデータを可視化したりアラートを設定したりするために、Grafanaを動かしたかったが、Grafana用のhttpsエンドポイントを用意したり、Cloud SQLのセキュリティ設定とかが面倒だったので、最小の労力でやる方法を探した。

ssh tunnel -> Google Compute Engine上のdocker上のgrafana -> Cloud SQL proxy -> cloud sql

## Google Compute Engineの設定

Container optimizedで起動
cloud sqlのapi権限を付与しておく(インスタンスを作るときに選べる)。

https://cloud.google.com/community/tutorials/docker-compose-on-container-optimized-os
この方法でdocker-composeをインストール(エイリアスの設定)

cloud sql proxyを使う。
docker-compose例

```yml
version: "2"
services:
  cloudsqlproxy:
    image: gcr.io/cloudsql-docker/gce-proxy:1.12
    command: /cloud_sql_proxy -instances=[接続名]=tcp:0.0.0.0:5432
  grafana:
    image: grafana/grafana:6.2.5
    volumes:
    - /path/to/data:/var/lib/grafana
    ports:
      - "3000:3000"
    links:
      - cloudsqlproxy
    environment:
      GF_SECURITY_ADMIN_USER: [grafanaユーザー名]
      GF_SECURITY_ADMIN_PASSWORD: [grafanaパスワード]
      GF_USERS_ALLOW_SIGN_UP: "false"
      GF_USERS_ALLOW_ORG_CREATE: "false"
      GF_SERVER_DOMAIN: 'localhost'
      GF_SERVER_ROOT_URL: 'http://localhost:63000/'
```

## Cloud SQLの設定

設定不要。

## ssh tunnel

```
gcloud compute ssh --zone asia-northeast1-b grafana -- -NL 63000:localhost:3000
```

## Cloud SQL readonlyユーザー

gcpのuiからreadonlyユーザーを作る

以下の方法でreadonlyユーザーに権限付与。
https://codeday.me/jp/qa/20181207/60923.html
Microsoft Edge を使って SVG を PNG に変換

※EdgeがChromiumベースになってから、この方法は使えなくなりました。

# 1. Edgeを開く

PNGに変換したい画像をEdgeで開きます。今回は、例として適当にInkscapeで作った画像を使用します。また、Internet Explorerでも同様の方法で行えますが、Google Chromeでは出来ません。

※一部、塗りつぶしやモザイク処理をしています。

![penguin_スクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420120/bd1241cd-4570-ae82-ab0d-6ea55ea7905f.png)

# 2. 右クリックで「名前を付けて画像を保存」

画面を右クリックして出てくるメニューの[名前を付けて画像を保存]をクリックします。

![penguin_スクショ_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420120/8d9ba1e6-fe26-cbf8-191f-231815d23882.png)

# 3. PNG を選択して保存

ファイル名を好みのものに変更し、[ファイルの種類]でPNGを選択して保存します。

![penguin_スクショ_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420120/a897a751-1273-5e33-5994-378dfae468be.png)
【Ruby】1 - 0.8 = 0.2 にしたい （浮動小数点誤差）

###小数点の演算で誤差がでてしまった

```ruby
> 1 - 0.8
=> 0.19999999999999996
```
`0.2` を期待しているのに、誤差が生じてしまってます。

1に小数点つけてもおなじ

```ruby
> 1.0 - 0.8
=> 0.19999999999999996
```

###BigDecimalを使う方法

bigdecimalをrequireすると良い、とあったのでやってみました。

```ruby
> require  'bigdecimal'
> BigDecimal("1") - BigDecimal("0.8")
=> 0.2e0
```
BigDecimalの引数はString型にして、誤差のない数を演算機に伝えてる（と理解した）。
理由はわからないけど答えに指数部分がついてきました。String#to_fでいい感じの小数点表示にする。

```ruby
> require  'bigdecimal'
> (BigDecimal("1") - BigDecimal("0.8")).to_f
=> 0.2
```
####答えに整数が欲しいとき

例えば消費税計算とか。1800 * 1.08 の答えは1944が返ってきて欲しいのに、、、

```ruby
> 1800 * 1.08
=> 1944.0000000000002
```
こういう時にBigDecimal使う。

```ruby
> require 'bigdecimal'
=> true
> (BigDecimal("1800") * BigDecimal("1.08")).ceil
=> 1944
```

※上記に使われているFloat#ceilは「自身と等しいかより大きな整数のうち最小のものを返す」。
BigDecimal使わないとこうなる。

```ruby

> (1800 * 1.08).ceil
=> 1945
```

###Rational（有理数）クラスを使う方法
[コメント](https://qiita.com/hellojtokyo/items/794c540aa0052ada54cc#comment-62719092aa221d25cb69)で @obelisk68 さんに教えていただきました。ありがとうございます！
そのままコピペします。

"
BigDecimal でよいのですが、Rational（有理数）クラスを使ってもよいです。ここでは0.8の浮動小数点演算が問題なので、これを有理数（分数と考えてかまいません）に直して計算します。このとき、Float#to_rではなく、Float#rationalizeを使うとよいです。

```ruby

[1] pry(main)> i = 1 - 0.8.rationalize
=> (1/5)
[2] pry(main)> i.to_f
=> 0.2
```
あるいは0.8が決め打ちならば、有理数リテラルを使うと簡単に書けます。

```ruby
[3] pry(main)> j = 1 - 8/10r
=> (1/5)
[4] pry(main)> j.to_f
=> 0.2
```
消費税計算もこんな感じ。

```ruby
[5] pry(main)> (1800 * 108/100r).ceil
=> 1944
```
"

数値リテラル初めて意識しました。有理数も、、、

> 有理数（分数と考えてかまいません）

こういう分かりやすい説明ができる人になりたい。
浮動小数点誤差の解消法方法はいろいろあるようなので、慣れてきたら他にも調べてみたいと思います。


###参考
[[Ruby]消費税計算にはBigDecimalを使いましょう](https://qiita.com/jnchito/items/d0ef71b25732ad5a881c)
[instance method String#to_f](https://docs.ruby-lang.org/ja/2.6.0/method/String/i/to_f.html)
[instance method Float#ceil](https://docs.ruby-lang.org/ja/2.6.0/method/Float/i/ceil.html)
[class Rational](https://docs.ruby-lang.org/ja/latest/class/Rational.html)
【欲しいもの or 儲かるもの】 個人開発したアプリをリリースするまでに考えたこと

最近、初めて個人開発したアプリをリリースしました。
今回の個人開発を通して考えたことがあったので戒めのためにメモしていきます。
どんな内容のアプリかはこちらに書いたので気になる方は見てみてください。
https://note.mu/iosapp/n/n53f36e1e6a22
注：この記事はポエムです。暇な人だけ読んでください。

## 個人開発リリースできない問題
個人開発はリリースするまで行くのがとても難しいです。
なぜなら開発するモチベーションを維持するのが難しく、完成に至らないからです。

開発を始めるときはワクワクしていたはずなのに、なぜモチベーションを維持することができないのでしょうか。
それを突き止めるにはまず最初のモチベーションはどこからきたのか、
つまり、**なぜ個人開発をしたくなるのか** ということをはっきりさせるべきでしょう。

### 個人開発をしたくなる理由
エンジニアが個人開発をしたい理由は大きく分けて２つあると思います。

- なんか作ってリリースしたい！
- お金を儲けたい！

エンジニアの皆さんは分かっていただけると思います。
**なんか作りたい！！** という漠然とした気持ち。

普段開発してお給料をもらっているので、
**せっかく作るんだからお金を儲けたい！！**とも思いますよね。

つまりこの２つを満たすものを作りたいわけです！！
・
・
・
そうです。
察しのいい皆さんならもうわかると思いますが、
この２つの理由を満たすことがとても難しいのです。

### なんか作ってリリースしたい！
これを満たすのはさほど難しくありません。
`自分の欲しいもの` を作ればいいのです。
お金を儲けるためのビジネスモデルなんて考える必要がないので、とにかく自分の欲しいものを作ってリリースすればいいです。
自分がそれを欲しいと思っている間はモチベーションが落ちないのでドンドン開発できます。
非常にシンプルで、挫折しずらいです。

### お金を儲けたい！
これは難しいです。
お金を儲けられるものというのは `他人の欲しいもの`です。
つまり、お金を儲けるためには`他人の欲しいもの`を予想して作る必要があるということです。
個人開発なら資金はほぼないので大きくマーケティング施策を打ったりすることが難しいので、
圧倒的にセンスのあるものを作る必要があるということです。

これだけでもめちゃくちゃ難しいですが、
まだ問題があります。

得てして**他人の欲しいもの**は**自分の欲しいもの**と一致しないという問題です。
『俺はいらないけど、こんな感じのあったら喜ぶ人多いんじゃね？？』みたいなアイデアばっかり生まれるということです。

自分が欲しいわけではないものを長い時間かけて開発するのは苦行です。
しかも、`他人の欲しいもの`をただ予想して作っているだけなので
**本当に他人が欲しいと思ってくれるのかも保証がありません。**

### 個人開発のジレンマ
- 自分の欲しいものを作りたいけど、それじゃ売れない。
- 売れるものを作りたいけど、それじゃつまらないし、不安が大きくてしんどい。

とんでもないジレンマですよね。


## じゃあお前はどうやってリリースしたの？？
この問題にぶち当たった僕は、**自分の欲しいもの**を作るということに注力しました。
売れなくてもいい！！とにかくリリースしたいんじゃ！！！という気持ちで儲けることを諦めました。
僕の場合は良くも悪くもビジネスの経験も才能も知識もなかったので、自分の欲しいものを作るということに集中できました。



## 【欲しいもの or 儲かるもの】 どっちを作るべきなんだろう？？

この問いに対する僕の答えは、**自分が本当に求めていることがどっちか見つけるべきだ**ということです。
僕のように
「とにかく個人開発がしたい！」という方は「自分の欲しいもの」を作るべきで、
「がっつり稼ぎたい！」という方は「売れるもの」を作ることにフォーカスするべきだと思いました。
こう見るとすごく当たり前のことですね。
しかし、**目を背けがち**なことです。
## まとめ

- 欲しいものを開発してリリースするのは比較的簡単だけど、(ほとんど)売れるものにならない
- 儲かるものを開発してリリースするのはべらぼうに難しいけど、売れる可能性がある。


自分はがっつり稼ぐんだ！という強い意志を持っている方は売れそうなものを考えることもありだと思いますが、
多くの人が挫折している修羅の道です。
それでもどうせ開発するなら売れそうなものが作りたい！
これもよくわかります。お金にならない自分が欲しいだけのものをせっせと開発するのは時間の無駄に感じる方もいるでしょう。
そういった方は、周りを巻き込んで個人ではなくチームで開発するのもありだと思います。
自分が折れそうな時に仲間に支えてもらえる環境は修羅の道を歩むのに有効な手段だと思います。
SuiteCRMを動かそうとしてPHP7.3使った際にcontinue問題に遭遇した

ひょんなことからSuiteCRMを動かしてみよう、と思い立ちました。

## dockerで動かす

https://github.com/d9magai/docker-compose-suitecrm
こんな感じでvagrantで作った仮想マシンのdocker上で環境構築しました。
`git clone`して`vagrant up`すると構築できます。

## php7.3を使ったときの警告

はじめはappは`php:7.3.6-fpm-alpine3.10`で動かそうと思いました。
しかし次のような警告が発生して上手く動きませんでした。

![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24415/294e4a78-6efc-4990-ca95-dc723c0b769c.png)
意味はこんな感じですかね。「`switch`を対象とした`"continue"`は`"break"`と同じ。`"continue 2"`の意味で使いたかったのか？」
文章を読んでもよく分からないので調べたのですが、PHPは曖昧なcontinue文はPHP8から禁止する方針で7.3からwarningを表示するようになったっぽいです。

## 曖昧なcontinue文とは

continue文はループから抜ける為に利用しますが、switch文で使うとswitchからの脱出を表し、「このループから抜ける」つもりでcontinueを書いても、switch文内ではbreakの意味で動作していました。

```aimai.php
while ($foo) {
    switch ($bar) {
        case "baz":
            continue;
    }
}
```

switchを抜けたかったらbreakを用いるべきす。私もそうしてきましたし。上位ブロックのループから抜ける為にcontinueを使いたかったら`continue 2`を使え、というwarningでした。 continue文は抜けるループのレベルを引数を指定できるみたいですね。PHP以外の言語では、switch文の中で`continue`を使うとPHPでいう所の`continue 2`の意味として動作します。この為、間違えやすい仕様であると長年指摘されてきました(らしいです)。
で、その辺の曖昧なところをPHP7.3では警告を出すようにしたって話ですね。

Warningで指摘されている箇所を`continue 2;`に書き換えるとうまく動いているように見えるのですが、本当に大丈夫なのかちょっと不安だったので、結局`php:7.2.19-fpm-alpine3.9`を使うことにしました。

で、あとはSuiteCRMの画面に従って操作をしていけば環境を構築できました。

## その他のはまったポイント

いくつかはまった点があるので紹介したいと思います。

### `hirak/prestissimo`を入れた後に`composer install`したい

```
uid=$UID gid=$GID docker-compose run --rm -v /tmp/:/home/$(whoami) app sh -c "composer global require hirak/prestissimo && composer install"
```

これでいけました。`hirak/prestissimo`を入れる際に`$HOME`にごにょごにょするみたいですが`/etc/passwd`と`/etc/group`をマウントしてユーザをしているだけなのでホームディレクトリが無いんですよね。なので`/tmp`をホームディレクトリってことにすることでうまく動きました。

### SuiteCRMの静的ファイルをnginxで配信できない

環境を構築するとSuiteCRMの静的ファイルが出来上がるのですがこれをnginxで配信できませんでした。理由はパーミッションです。そこで、nginx.confでrootで動かすという力業で解決しました。「動きゃあええねん」の精神だったのでこれで良しとしました。
【製作進捗】BlackJack：04

#初めに
[前回](https://qiita.com/DoroRITCH/items/512a2accc0d1771732df)まででほとんど製作の部分は終わっていたので、今回はGitHubで公開しましたという報告がメインです。

#更新内容
##プログラム更新
- [前回記事のコメント](https://qiita.com/DoroRITCH/items/512a2accc0d1771732df#comment-225965098b49930786b6)にもあった「ディーラーは17点以上になるまでHitを繰り返す」という条件に変更しました。

```Java:BlackJack_main.java
		//ディーラーの行動
		while(cardPoints_dealer<17) {
			handCard_dealer.add(bills.get(0));
			System.out.println("ディーラーの引いたカードは["+handCard_dealer.get(handCard_dealer.size()-1)+"]です");
			cardPoints_dealer+=points.get(handCard_dealer.get(handCard_dealer.size()-1));
			bills.remove(0);
			System.out.println("ディーラーの得点は"+cardPoints_dealer+"点です");
			JUDGE.judge(cardPoints,cardPoints_dealer);
			if(JUDGE.result != "") {
				System.out.println("BlackJack終了！また遊んでね☆");
				return;
			}
		}		//while文締め
```

##Github
上記の更新までを含めたプログラミングをGithubで公開しました。

[DoroRitch/BlackJack](https://github.com/DoroRitch/BlackJack)


#最後に
全体で二週間弱ほどかかってしまいましたが、ひとまず終わりということで区切りをつけたいと思います。


##今後
今後は[もっと気軽にアウトプットできる技術ブログサービス「Qrunch（クランチ）」をリリースした【個人開発】](https://qiita.com/c0domisu/items/95a561d163d26bbfe274)で紹介されている[Qrunch](https://qrunch.net/)で記事の執筆などしていこうと思います。
アジャイル開発について本を読んでみた

## 現状
・アジャイル開発に携わったばかり
・アジャイル開発に対する知識が無い

## 目的
・アジャイル開発に対する知識をつける
・良いものは取り入れていきたい
・webディレクションの本を読んでおすすめに紹介されていた
[「Webディレクションの新・標準ルール システム開発編 ノンエンジニアでも失敗しないワークフローと開発プロセス」] (https://amzn.to/2KkvVLj)
→ [こちらの記事] (https://qiita.com/beychan/items/035d581fd757d6700706)の続きになります。

## アジャイルサムライについて
[「アジャイルサムライ」] (https://amzn.to/2KhFj29)
・会社に置いてあった


## キーワード、気づき
・ちゃんと動くソフトウェアを届ける（p4）
・生産性UPのためには同じ職場で働く（p21）
・お客さんとの信頼関係（p23）
・権限（p29）
・役割分担があいまい（p30）
・プロジェクトを始める前の意見交換（p34）
・1週間姿をくらましても、プロジェクト業務に何の支障も出ないようにできること（p36）
・チームメンバーを探すコツ（p38）
　・ゼネラリスト
　・曖昧な状況に抵抗がない人
　・我を張らないチームプレイヤー
・インセプションデッキ（p48）
　・関係者にプロジェクトに対する期待と共有、認識合わせ
・ユーザーストーリー（p115）


## 取り入れたいこと
### インセプションデッキ
・関係者にプロジェクトに対する期待と共有、認識合わせ
　→ キックオフのときにやるのが良いかも
　→ 今走っている案件でもやってみる
・プロジェクトコミュニティは考えているより大きい
　→ 目線を高く持つこと
・スコープ定め
　・インセプションデッキの前半の内容
・うまくいかない条件
　・チームが同じ仕事場にいない
　・顧客を巻き込めない
　・自分の開発環境をコントロールできない
・「時間」「予算」「品質」を固定する代わり、「スコープ」を柔軟に扱う
　・顧客にも同意を取った前提で


### ユーザーストーリー
・ストーリー = ユーザーにとっての価値のこと
・ストーリーが独立していれば、必要に応じてスコープを柔軟に調整できる
→ ユーザーストーリー書いてみる

## 備考
・発表資料用のスライド
https://www.slideshare.net/secret/hH9PcIZ7zOV2kK
モーダル内のチェックボックスを動的に反映させる

jQueryほとんど使ったことがなかったので、前に実装でつまずいたところを書きます。


モーダル内のチェックボックスを操作した時、inputに動的に反映させて、POST出来るようにしたい

まずは、Bootstrapの雛形を取得
雛形は[公式](https://getbootstrap.com/docs/4.3/getting-started/introduction/)から

次に下記のようなモーダルを作成
![スクリーンショット 2019-06-30 22.41.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379873/23964795-500e-55a8-01c0-033fa09166ac.png)


```html:
  <body>
    <div class="container">
        <div class="trigger mt-5">
            ここにモーダルでチェックした値をいれたい
            <input id="input" type="text" class="form-control" value="" placeholder="選択して下さい"  disabled>
        </div>

        <!-- Modal -->
        <div class="modal fade" id="modal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLongTitle" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content" style="margin-top:150px">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                <span aria-hidden="true">&times;</span>
                </button>
            </div>
            <div class="modal-body">
                <input  id="1" type="checkbox" name="checkbox"  />
                1
                <input id="2" type="checkbox" name="checkbox"  />
                2
                <input id="3" type="checkbox" name="checkbox"  />
                3
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                <button type="button" class="btn btn-primary">Save changes</button>
            </div>
            </div>
        </div>
        </div>
    </div>
  </body>

```

scrptタグを抜粋

```html:
 <script type="text/javascript">
    $(function() {
        // クリックでモーダルオープン
        $('.trigger').on('click', function() {
            $('#modal').modal('show');
        });
        array = [];
        change_input_value(array);
        // チェックボックスをチェックしたら発動
        $('input[type="checkbox"]').click(function() {
            // チェックされているか配列で管理
            $number = $(this).val();
            array[$number] = 1;
            // チェックが外されたら配列のその値を削除
            if ($(this)[0].checked == false) {
                delete array[$number];
            }
            // 配列のkeyを渡す
            change_input_value(Object.keys(array));
        });
        // inputタグのvalueを変更
        function change_input_value(array) {
            input_values = $('#input');
            input_values.val(array);
        }
    });
  </script>   
```

最終的な動き
![modal.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379873/7ee95d7c-2e67-0533-a968-dedcc32f8078.gif)

以上です。

次こそReactの何かを書きたい。
Laravel初心者がLaravelでテストコードを書くまでの勉強メモ（dockerでLaravelの環境を構築）

## 背景

* [初回Laravelインストール時](https://qiita.com/shimomai@github/items/35c4d52a38ff6a0399b0)はxamppを使ってローカルにサクッとインストールした
* より実務に近づけるためにDockerでLaravelの環境を構築をトライする

## Dockerとは

* Dockerは、コンテナと呼ばれるOSレベルの仮想環境を提供するオープンソースソフトウェア
* VMware製品などの完全仮想化を行うハイパーバイザ型製品と比べて、ディスク使用量は少ない
* 仮想環境作成や起動は速く、スクラップ＆ビルドが容易
（[Wikipedia](https://ja.wikipedia.org/wiki/Docker)より）

## 準備

### Dockerをインストール

いいとこだらけの仮想環境を作成するソフトウェアということで早速インストール！
[Docker for Windows](https://docs.docker.com/docker-for-windows/install/)をインストール ~~する~~ しようとするが、自宅PCがWindows 10 HomeでDocker for Windowsがインストールできないことに気づいて、(; Д) ﾟ ﾟなる。

仕方がないので、
[windows 10 home で docker を導入するメモ](https://qiita.com/idani/items/fb7681d79eeb48c05144)
を参考に「Docker Toolbox」を導入した。


### LaraDockをインストール

LaraDockとはすぐにLaravel開発環境が用意できる便利なものらしい。
https://github.com/laradock/laradock
をサクッとgit cloneでインストール。

```
git clone https://github.com/laradock/laradock.git
```

### .envを作成する

環境設定ファイルである.envを用意する。
env-exampleというサンプルがあるので、これをコピー。

```
cp env-example .env
```

### Dockerコンテナを立ち上げ

[本手順](https://qiita.com/hosono/items/dd404f3f074722ef989d#nginx%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E7%B7%A8%E9%9B%86%E3%81%99%E3%82%8B)
に従い、nginxの設定ファイルを編集した上で、LaraDockのディレクトリ内で、

```
docker-compose up -d nginx
```
を実行。(終わるまでめっっっちゃ長い）

※Docker composeとは、複数のコンテナから成るサービスを構築・実行する手順を自動的にし、管理を容易にする機能
※docker-compose up：コンテナの作成と開始
※-d オプション：バックグラウンドでコンテナを実行し、新しいコンテナ名を表示

終わったら

```
docker ps
```
でコンテナのステータスを調べる。STATUSがUpになっていればOK！


### workspaceにログインし、Laravelをインストール

```
docker-compose exec workspace bash
```
でworkspaceにログイン。
あとは前記事と同じ流れでLaravelをインストール。

```
composer create-project --prefer-dist laravel/laravel hoge
```

終わったら
http://localhost
にアクセス！

※参考：[Docker環境でLaravelを構築するまで、わずか15分](https://qiita.com/hosono/items/dd404f3f074722ef989d)

...Dockerは奥が深そうなので、並行してもう少し学習する。
Laravel 5.7のscaffoldでハマった

PHPの学習中にちょっとハマってしまったのでメモ。

## 環境

Laravel 5.7.28
PHP 7.1.3

## 背景

Laravelでscaffoldを使いたい場合、 `Laralib/L5scaffold` を使うらしい。
そして、Laravel 5.5以降では以下のように修正しないとうまく動かないらしい。
[LaravelのScaffoldのインストール問題](https://qiita.com/masahirok_jp/items/f4efcf9f8b518c2be7b0)

とここまではよくある記事ですが、私の環境では
`php artisan`の実行結果はうまく表示されるものの、
`php artisan make:scaffold ...(省略)`を実行するとエラーになってしまった。

## 解決法

```php:vendor/laralib/l5scaffold/src/Makes/MakeController.php
// よく書いてある修正方法
use DetectsApplicationNamespace, MakerTrait;

// 名前空間を絶対指定にしたら動いた
use \Illuminate\Console\DetectsApplicationNamespace, MakerTrait;
```

## エラー内容

```text
Symfony\Component\Debug\Exception\FatalErrorException  : Trait 'Laralib\L5scaffold\Makes\DetectsApplicationNamespace​' not found
```

`use`で指定している名前空間が相対指定になっているので、該当ファイルの`namespace`と連結されて意図しないパスになってました。
(よく読めばすぐわかる話でした...)

## その他

でもそれ以前に、`Laralib/L5scaffold`を追加した後の`php artisan`の実行結果が、

```sh
make:scaffold        Create a scaffold with bootstrap 3
```

むむ、 **bootstrap 3** なのね。古い。
GitHub見ても全然更新されてない...。
Railsみたいに標準でサポートされないのかな。

結論としては、もっと新しい教材で学習すべきでした。
Rのような変数保存をPythonでやりたい

# はじめに
RStudioではEnvironmentの保存ボタンから、形式をそのままに利用した変数を保存することができる。しかし、Pythonの開発環境には、そのような便利な機能が存在しない。

# 目的
sklearnのdumpを利用して全ての変数を一括保存し、loadを利用して読み込み、通常の変数同様に利用しながら再利用する最低限のプログラムを作成する。

# 実践
## 準備
これまでにプログラム中で利用した変数は、すべて dict 型で管理する。
まず、data_dict = {} のように、空のdict型を用意する。
プログラムの作業の中で再利用するデータは全て、data_dict["どのような変数かわかりやすい名前のキー"] = 何らかのデータ　として保存する。例えば、tmp = 10 * 5 とやらず、data_dict["演算結果"] = 10 * 5 とする。もちろん一時的な利用の変数をわざわざ保存する必要はない。

## 保存
これまでのデータを保存するためには、open("ファイル名.binaryfile","wb")として書き込みモードでオープンする。
データを保存するためにdump(保存したい変数,f1)としてバイナリー形式で出力する。

## 読み込み
これまでの計算結果を再度利用するためには、open("ファイル名.binaryfile", "rb")として読み込みモードでオープンする。
データを読み込み再度変数として利用するためには、test_data = load(読み込みモードでオープンした情報)として読みこむ。

## 再利用
test_dataをそのまま利用する。特別な処理は必要なし。

## プログラム例
```python
from sklearn.externals.joblib import dump, load
import pandas as pd
import matplotlib.pyplot as plt
# データをまとめて入れておくもの
data_dict = {}
# データを読み込む
data_dict["str"] = "test"
data_dict["raw_data"] = pd.read_csv("data/2017_liquor_sales.csv", index_col=0, encoding="utf-8")

print(data_dict.keys())
print(data_dict["raw_data"].head())
f1 = open("data_dict.binaryfile","wb")
dump(data_dict,f1)
f1.close

f2 = open("data_dict.binaryfile", "rb")
test_data = load(f2)
f2.close
print("\n")
print(test_data.keys())
print(test_data["raw_data"].head())
```

    dict_keys(['str', 'raw_data'])
           清酒     焼酎    ビール  ウイスキー   ワイン   発泡酒等  チューハイ・カクテル   他の酒
    都市                                                           
    札幌市  5052   5070  15284   2771  2425  13876        1880   844
    青森市  7403  12208  13557   2910  2573  11019        4527   847
    盛岡市  7956   7313  12289   2119  3533   8727        3661  1059
    仙台市  7481   7247  10463   3954  2903   9164        2781   945
    秋田市  9567   6969  15134   4241  3288  10834        4031   933
    
    
    dict_keys(['str', 'raw_data'])
           清酒     焼酎    ビール  ウイスキー   ワイン   発泡酒等  チューハイ・カクテル   他の酒
    都市                                                           
    札幌市  5052   5070  15284   2771  2425  13876        1880   844
    青森市  7403  12208  13557   2910  2573  11019        4527   847
    盛岡市  7956   7313  12289   2119  3533   8727        3661  1059
    仙台市  7481   7247  10463   3954  2903   9164        2781   945
    秋田市  9567   6969  15134   4241  3288  10834        4031   933



# テストに利用したデータ
本データは政府統計の総合窓口に掲載されている1世帯当たり年間の食料「酒類」別支出金額，購入数量及び平均価格の「家計調査結果」（総務省統計局）(https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200561&tstat=000000330001&cycle=7&year=20170&month=0&tclass1=000000330001&tclass2=000000330004&tclass3=000000330006&stat_infid=000031705230)を抽出・整形したデータです。
Webソケットって何？

# Webソケット 概要
Webソケットについて、勉強して概要を図で自分なりにまとめてみました。

![スクリーンショット 2019-06-30 23.25.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263738/1e8be7e7-2798-6557-45ec-a3f608f716f3.png)

Webソケットとは、一般的にサーバー側とクライアント側を常時接続状態にしておいて双方向通信ができるようにする技術であり、チャットアプリや複数人が同時に遊べるゲームなど、リアルタイムに通信が行えることができます。

でもチャットシステムならWebソケットを使うといいと聞くけど、どうして何だろう？
それについての説明が次のスライドになります。



![スクリーンショット 2019-06-30 23.23.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263738/e977729c-296c-507d-4687-ab421ba53280.png)

例えば、チャットを作ろうとなった場合、上の図で言うと左側のユーザーがチャットしたら、リアルタイムで繋がっている各ユーザーにその内容を反映させなければなりません。


![スクリーンショット 2019-06-30 23.24.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263738/e462a114-926a-f075-c458-0334ada5618b.png)

もし、チャットシステムをWebソケットを使用しなかった場合、左側のユーザーとサーバー間のデータのやり取りは、従来の技術でいうAjaxを使用すれは実現できます。


![スクリーンショット 2019-06-30 23.24.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263738/d382ecce-95e9-f3e1-705c-4b3996bb507d.png)

一方で、その他のユーザーにチャットの内容を反映したい場合は、cometという仕組みを用いれば、実現できます。

![スクリーンショット 2019-06-30 23.24.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263738/5488ab14-2d92-3aa9-62f7-44045baabd78.png)

以上のことから、従来の技術であるAjaxとCometを使用すれば、チャットサービスを作れなくはないのですが、、、通信の度にHTTPヘッダーが付与されるので、わずかであるが一定時間内にネットワーク常に転送されるデータ量が増えてしまい、結果通信速度が遅くなってしまいます。

そのため、リアルタイム性が求められるチャットシステムの場合、その問題がネックになります。

![スクリーンショット 2019-06-30 23.24.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263738/a11acec4-5c9e-d482-7e60-c43fa63d9f71.png)

Webソケットを使用すると、その問題が解消でき、上記スライドで書いてあることが実現できます。

だから、チャットシステムでWebソケットが使われのかと考えています。
ns3のrun実行時の引数に関するメモ(備忘録)

#注意事項
人に見せる用ではないので適当です。
よく忘れるコマンドについて書いてます。
項目は自分の気分次第で増えていきます

#commandLine arguments 一覧表示
`--PrintHelp`

```bash
./waf --run "xxx/xxx --PrintHelp"
```


# 出力ファイルの場所の指定方法

`--cwd='出力先フォルダ'`

```bash
./waf --run xxx/xxx --cwd=xxx
```

#debugのやり方

`--command-template="gdb --args %s <args>"`

```bash
./waf --run xxx/xxx　--command-template="gdb --args %s <args>"
```

ちなみに
`cmd.AddValueのコマンドライン引数を使う方法は`
gdbが起動して

```bash:おまけ
(gdb)r --設定した引数=値
```
これでつかうことができる


#logingの内容をファイルに書き込む

`>log.txtでいいんじゃないの？`って思う人もいると思うけどそれはじっこうしたらわかる。

`2>&1`

```bash
./waf --run xxx/xxx > log.txt > 2>&1
```
[ Vue.js ] moment.jsを導入する時はバンドルサイズに気をつける (IgnorePluginを理解)

個人的にwebサイト制作にほぼ必須なmoment.js。
下記のように、なんとなく導入します。

```
npm i --save moment
```

で使用したい箇所で、

```typescript
import moment from 'moment';
```

これでmoment.jsが使用できます。しかし、このままではバンドルサイズが肥大化しています。
バンドルサイズに確認は、vue-cliで開発しているプロジェクトの場合は、次のコマンドを実行します。

```
vue-cli-service build --report
```

すると、dist/report.htmlが生成されるので、ブラウザで開いて確認してください。--reportによって、[webpack-bundle-analyzer](https://www.npmjs.com/package/webpack-bundle-analyzer)が実行され、レポートが出力されています。

<img width="1436" alt="スクリーンショット 2019-06-30 22.40.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194978/cf19c223-c6c6-fa72-3efe-947f17fdf341.png">

このレポートはwebpackバンドル内の要素のサイズが面積として図示されたものです。お気づきの通り、moment.jsがVue.jsそのものよりも大きな面積を閉めてしまっています。上図はprodcution buildの結果ですが、moment.jsで540kBを締めています。

なぜこれだけサイズが大きいのかというと、localeというものが含まれているためです。ファイル名から想像がつきますが、多言語対応するための設定ファイルになっているます。例えば`〇〇時〇〇分`という表示をする時に、jaの設定が使えたりします。

## 対策

しかしながら、単純な時刻の整形に使用することが多いので、localeは必要ありません。また、カレンダー等のライブラリを使用している場合はロケールに依存している可能性が高いですが、使いたいのは`ja.js`（日本語）だけだったりします。
そんな時に、わざわざ130ヶ国の言語の設定をバンドルに含むのは無駄になります。localeは合計で約400kBあり、moment.jsのコアの部分だけなら約150kBです。

そんな時はWebpackの[Ignore Plugin](https://webpack.js.org/plugins/ignore-plugin/)を使用します。このプラグインは正規表現で指定したファイルはimportやrequireで依存関係が指定されていても、バンドルから除外することができます。

Webpackの設定と同様ですが、Vue.jsの場合はvue.config.jsに指定します。

```javascript:vue.config.js
configureWebpack: {
    plugins: [
      new webpack.IgnorePlugin( {
        resourceRegExp: /^\.\/locale$/,
        contextRegExp: /moment$/
      } )
    ]
  },
```

細かい話ですが、resourceRegExpには無視したいimportやrequireを指定します。moment.jsはロケールを

```js
require('./locale/' + name);
```

で呼んでいるので, ```resourceRegExp: /^\.\/locale$/,```を指定しています。
また、contextRegExpにはresourceRegExpを適用するフォルダ名を指定します。今回は`moment`の文字で終了する全てのフォルダを対象にします。

以上から、localeは全て排除することができ、プロジェクト内でのimportは有効であるため、必要なlocaleだけをimportすることもできます。

```ts
import from "moment/locale/ja";
```

この状態で再度レポートを生成すると、、、

<img width="1434" alt="スクリーンショット 2019-06-30 22.38.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194978/4db392ad-3e70-92ee-9341-e7b13672e037.png">

このようにmoment.jsのサイズが削減されました。

## まとめ

moment.jsとか, Rx.jsとか何も考えずに導入するとバンドルを非常に肥大化させてしまうものがありますので、改めて注意喚起の意味で書きました。
ここまで読んだ方は多少身に覚えがあると思いますので、ご参考ください。
Twitter連携サービスでアイコンの変更に対応する簡単な方法

## Twitter連携サービスでアイコンの変更に対応する簡単な方法
注意: この記事で紹介されている方法は外部サービスに依存します。個人開発では通用しますが、重要なプロダクトでは採用しない方が良いでしょう。

Twitter連携サービスでアイコンのURLを取得したのちにTwitterの方でアイコンが変更されると、以前のURLは404になってしまいます。

そこでお勧めしたいのが、avatars.ioというサービスです。

このサービスはTwitterのUser IDからアイコンを取得してくれます。Twitterでアイコンが変更されても問題ありません。

例えば以下のようにリクエストを送ると、僕のアイコンが取得できます。
https://avatars.io/twitter/ToshioAkaneya

詳しい説明はこちらをご覧ください。
https://avatars.io/

この記事が参考になれば幸いです。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Webディレクションについて本を読んでみた

## 目的
・Webディレクションについて体系的に学んだことが無いため、
本を読んで知識を整理したり、自分がWebディレクションの中のどの箇所に関わっているかを知りたかった。

## 読んだ本について
[「Webディレクションの新・標準ルール システム開発編」] (https://amzn.to/2SlPR3N)
・会社の方におすすめしてもらった

## キーワード、気づき
・システム担当者が知っておくべきこと
　・専門家たちの窓口となり、コミュニケーションが円滑に進むようにサポート（p12）
　・誰に何の相談をするか（p13）
　・ゴールが役割で違う（p13）
・ベンダー選定
　・RFP（p18）
　　→ どうやって自社が選ばれているか
・変更管理（p24）
　→ backlogにチケットを上げておけば後から追える
・ベンダーの管理対象（p29）
　→ あくまでベンダー側のみ。発注側の作業は行わない。
・概算見積がいつの間にか開発予算の上限となってしまう（p30）
・エンドユーザーの使い勝手（p42）
・テーマ・マネジメント（p43）
・要件定義
　・インプット（p45）
　　→ めんどうだから後回しにしがち
　・「できない」を明示（p47）
　　→ 明示しないことは「できる」と思われる
・データ移行
　・切り戻しへの対応方法も併記（p63）
　・リハーサル（p63）
・システム開発の成功の鍵はゴールを明確にすること（p64）
・機能要件
　・発注者の意図は受注者が汲み取り、機能要件を考えていく必要あり（p75）
　→ フローが複雑化している案件では、フロー図もしくは画面遷移図が必要だった（p76）
・データ漏洩のリスク対応
　・個人情報の取得は最低限にする（p88）
　・プライバシーポリシー必要（p88）
・見積もりの考え方
　・請負契約（p91）
　・準委任契約（p91）
　・係数モデル見積（p91）
　　→ 工数計算書
　・ボトムアップ見積（p92）
　　→ 普段よくやっている見積もり。工数毎。
・アジャイル開発（p99）
　☆おすすめ書籍「アジャイルサムライ」

## 特に注目したこと
アジャイル開発について。次にアジャイル開発についての本を読みました。（2019/06/30）
→ [アジャイル開発について本を読んでみた](https://qiita.com/beychan/items/97ef85b3d94a961714c2)
Django モデルをスクリプトから使用する

以下のような場面で Django モデルをアプリ外で使用することがあったので方法をまとめます。

- 初期データ（or サンプルデータ）をまとめて作成する
- 定期的に外部からデータを取得して, Django モデルとして DB に Insert する

## Requirements
- Python 3.6
- django==2.2.2
- django-extensions==2.1.9
- pip

## 手順
### 1. django-extensions をインストール

```
$ pip install django-extensions
```

### 2. `<project name>/settings.py` の `INSTALLED_APPS` に `django-extensions` を追加

```python

INSTALLED_APPS = [
    ...

    'django_extensions',
]
```

### 3. スクリプトを配置するディレクトリを作成

Django プロジェクト直下に `scripts` という名前で作成します。  

```
$ mkdir scripts
```
作成場所と名前が異なると動作しないので気をつけてください。

### 4. スクリプト作成

`scripts` ディレクトリ直下に任意の名前で作成します。

```
$ tree
.
├── <project name>
├── db.sqlite3
├── <app name>
├── manage.py
└── scripts
    ├── <script file name>.py
    ├── batch.py                    # example
    └── create_sample.py            # example
```

`run` という名前のメソッドが実行されるので、`run` メソッドを用意してください。

```python

from <app name>.models import <model class name>

def run():
    ...
```

### 5. スクリプト実行

Django プロジェクト直下から以下のコマンドを実行します。

```
$ python manage.py runscript <script file name>
```
runscript の後に指定するファイル名には `.py` は不要です。

## おわりに
[`django-extensions`](https://django-extensions.readthedocs.io/en/latest/index.html) には Django をより便利に使うための機能が他にもたくさん用意されているので、気になる方はドキュメントを見てみてください。
AWS Cloud9でRubyのバージョンをアップデートする方法

# rvmとは

**`rvm`**は**`Ruby Version Manager`**の略、つまりRubyのバージョン管理ツールです。（たぶん）
（※ Macのローカルでは`rbenv`を使ってる場合がほとんどだと思うので別記事を参照してください😉）
まずは`rvm`が常に最新バージョンになるよう設定しておきましょう。

```shell:teminal
$ echo rvm_autoupdate_flag=2 >> ~/.rvmrc
```

ちなみに、手動で最新安定版に更新する場合のコマンドはこっち。

```shell:terminal
$ rvm get stable
```


# rvmコマンドのあれこれ

rvmコマンドで使えるオプションを確認してみよう！

```shell:teminal
$ rvm -h
```

するとたくさんのコマンドが表示されるので、よく使いそうなものだけ抜粋します。

```shell:teminal
# インストール済みのRubyバージョンを一覧表示
$ rvm list


# インストール可能なRubyバージョンを一覧表示
$ rvm list known


# Rubyのバージョンを指定してインストール（今なら3.0.0かな？）
$ rvm install <version>


# 使用するRubyのバージョンを指定する
$ rvm use <version>


# デフォルトで使用するRubyのバージョンを指定する
$ rvm use <version> --default
```

他にもたくさんあるので時間があれば眺めてみてね😉⭐️

# で、結局どうやってRubyのバージョンをアップデートするの？
上記で抜粋したコマンドを順に実行すればアップデート完了✨

# おまけ

実際の作業はこんな感じ↓

```shell:terminal
# 現在のrubyバージョンを調べる
$ rvm list
   ruby-2.5.0 [ x86_64 ]
   ruby-2.5.5 [ x86_64 ]
=* ruby-2.6.3 [ x86_64 ]


# いまは2.6.3を使ってるけど、最新版はいくつかな？
$ rvm list known
〜〜 前略 〜〜
[ ruby- ]2.6[.6]
[ ruby- ]2.7[.2]
[ ruby- ]3[.0.0]
〜〜 後略 〜〜


# 最新版は3.0.0か、じゃあインストールしとこ
$ rvm install 3.0.0
〜〜 前略 〜〜
ruby-3.0.0 - #generating default wrappers........
ruby-3.0.0 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
Install of ruby-3.0.0 - #complete 
Ruby was built without documentation, to build it run: rvm docs generate-ri


# 再びrubyバージョン確認
$ rvm list 
   ruby-2.5.0 [ x86_64 ]
   ruby-2.5.5 [ x86_64 ]
 * ruby-2.6.3 [ x86_64 ]
=> ruby-3.0.0 [ x86_64 ]


# 無事に3.0.0が追加されてるからデフォルト設定にしとこ
$ rvm use 3.0.0 --default
Using /home/ec2-user/.rvm/gems/ruby-3.0.0


# 再度rubyバージョン確認
$ rvm list 
   ruby-2.5.0 [ x86_64 ]
   ruby-2.5.5 [ x86_64 ]
   ruby-2.6.3 [ x86_64 ]
=* ruby-3.0.0 [ x86_64 ]
```

ということで無事に最新安定板のrubyを使用可能になりました◎
Microsoft TodoをiOSのリマインダと同期させて利用する場合に、繰り返し予定の期限が予期せぬ値になる

# 前置き

Logic AppsでMicrosoft Todoのデータを利用していたところ、当日の完了タスクをフィルタ出来ない、完了したはずのタスクが残っている、などの意図せぬ挙動をしたので、原因追及をしました。

その結果、iOSのリマインダで利用した場合とMicrosoft TodoやLogic Appsから利用した場合に期限の挙動が変わってくる、ということが分かったのでメモを残します。

※ 本記事は2019/6/29時点の検証結果を元に書いています。今後の仕様変更などにより挙動が変わる可能性があります。

※ 2019/7/14追記 本件については、以下の記事も深く関連します
* [Power Automate（旧Microsoft Flow）でOutlook タスク（Microsoft ToDo）を利用する際の制限事項：2019/7/14時点](https://qiita.com/tfunakoshi/items/0e831301f021345b4312)

# 調査方法

* Microsoft TodoとiOSのリマインダの同期設定を行う（iOSの設定でOutlook.comのアカウントを追加）
* __iOSリマインダから__期限付きの繰り返し予定を作成する
* iOSリマインダ、Microsoft Todo、Logic Appsのそれぞれでタスクの完了を行う
* (1)作成したタスク、(2)完了したタスク、(3)完了後に生成された繰り返しタスク、のそれぞれの期限をLogic Appsで確認する

![2019-06-30_22h54_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/96f7a770-4724-61b5-d059-475d6512961e.png)

Logic Appsでの確認は、「フォルダー内のすべてのタスクの一覧表示」で得られた値のうち、"DueDateTime"の"DateTime"を参照。

![2019-06-30_22h57_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/47b2b2f7-23d9-e1b3-5067-bf35b0eebd17.png)

# 結果

| 完了する方法  | iOSリマインダのアラーム日時 | (1)作成したタスクの期限 | (2)完了したタスクの期限 | (3)完了後生成された繰り返しタスクの期限 | 
|:-------------|---------------|----------------|----------------------|---------------------:|
| iOSリマインダ | 2019/6/29 9:00 | 2019-06-29T00:00:00Z | 2019-06-29T00:00:00Z | 2019-06-30T00:00:00Z | 
| LogicApp | 2019/6/29 9:00 | 2019-06-29T00:00:00Z | 2019-06-29T00:00:00Z | 2019-06-30T00:00:00Z | 
| iOSリマインダ | 2019/6/29 12:00 | 2019-06-29T00:00:00Z | __2019-06-29T03:00:00Z__ | 2019-06-30T00:00:00Z | 
| LogicApp | 2019/6/29 12:00 | 2019-06-29T00:00:00Z | 2019-06-29T00:00:00Z | __2019-06-30T03:00:00Z__ | 
| iOSリマインダ | 2019/6/29 15:00 | 2019-06-29T00:00:00Z | __2019-06-29T06:00:00Z__ | 2019-06-30T00:00:00Z | 
| LogicApp | 2019/6/29 15:00 | 2019-06-29T00:00:00Z | 2019-06-29T00:00:00Z | __2019-06-30T06:00:00Z__ | 

* Microsoft TodoとLogic Appsは同結果だったので割愛
* 同様に18時、21時のタスクも作成して試したが同様の結果だったので割愛

# 挙動のまとめ

| 完了する方法  | (2)完了したタスクの期限 | (3)完了後生成された繰り返しタスクの期限 | 
|:-------------|-----------------------|-------------------------------------:|
| iOSリマインダ | __アラーム時刻に書き換える__ | UTC 0時に設定する | 
| LogicApp | 書き換えを行わない | __アラーム時刻に書き換える__ | 

なお、今回はタスクの作成をiOSリマインダで統一しましたが、Microsoft TodoやLogic Appsでタスクを作るとまた挙動が異なります。

# 回避策

1. Logic Appsを利用する前提であれば、iOSリマインダとの同期は行わず、Microsoft Todoのみを利用する
2. iOSリマインダを利用する必要がある場合、日本時間9時（UTC 0時）でタスクを作成する。（iOSリマインダで完了してもMicrosoft TodoやLogic Appsで完了しても同じ結果になる）

2の回避策の場合は、任意の時間にアラームで通知したい、という機能は残念ながら諦める必要があります。

# 後書き

こんな仕組みを作っていました。

* Microsoft Todoでその日完了したタスクと未完了だったタスクをLogic Appsで収集し、SQL Databaseに格納
* 未完成の当日タスクはLogic Apps側で完了
* SQL Databaseに格納したタスクの達成度データをPowerBIで可視化

![2019-06-30_23h15_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449038/c1e958e2-2b46-5d2e-ad47-f12442b52a66.png)

が、しばらく運用していると、次のような症状が出てきました。

* 完了したタスク、未完了のタスクが思ったようにフィルタリングできない
* Logic Apps実行後に当日のタスクが残っている
* 繰り返しタスクを完了すると自動で翌日のタスクが生成されるはずなのに、翌日以降のタスクとして生成されてしまう

対象のタスクはiOSのリマインダでもMicrosoft TodoでもLogic Appsでも完了することがあり、そこが原因ではないかと調べた内容が今回の記事になります。

なお、調査の際にはMicrosoft Todoのタスク情報をLogic Appsで抽出し、Excelに書き出しながら行いました。

かなりニッチですが同じような現象で困っている方のヒントになれば幸いです。
Visual Studio Live Share 把握しておきたいアクセス制限項目

# はじめに
先日、同僚であり先輩である方と知識共有を兼ねてペアプロをしたのですが、その際に `Visual Studio Live Share` が非常に便利でした。要はVSCodeを使って、ソースコードをそれぞれのPCから共同編集できるやつです。

[Visual Studio Live Share](https://visualstudio.microsoft.com/ja/services/live-share/)

# 懸念
今後、プロダクトコードを扱うとなると、アクセス制限などセキュリティ周りが気になったので、[ドキュメント](https://docs.microsoft.com/ja-jp/visualstudio/liveshare/)見たあとに試してみました。以下の機能があるようです。

# 機能
##### セッション毎に推測不可能な招待リンクが発行されるので、狙って不正参加することはできない
* ホスト側でセッションスタートすると毎回招待リンクが変わり、古いものは無効化された
* ゲスト側ではダイアログが出てアクセス不可
<img width="499" alt="スクリーンショット 2019-06-30 22.34.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87716/ee718d03-4ccf-0be3-84ad-7da68aec073c.png">

##### セッションに参加中のユーザーは把握できるし、退出させることもできる
* ホスト側の左端メニュー `Participants` 項目似て参加中のゲストを監視できる
* 削除すればゲストは即座にセッションから退出させられた
<img width="241" alt="スクリーンショット 2019-06-30 20.35.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87716/6f813d3d-83bc-5256-a998-0e6ca08df77f.png">

* ゲスト側ではダイアログが出てアクセス不可
<img width="422" alt="スクリーンショット 2019-06-30 20.46.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87716/4871bc3b-5dfa-16d8-f748-29cc47bb4873.png">

##### 未ログインユーザーの参加リクエストを、常に拒否できる
* 常に許可・常に拒否・確認がありますが、用途がペアプロなのでこちらは常に拒否(reject)しておくのが良さそう。設定画面から変更可能。  
<img width="400" alt="スクリーンショット 2019-06-30 22.30.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87716/e39bc86d-61a7-81ae-8a4d-8176a3884bc3.png">

##### ログイン済みユーザーからの参加リクエストを、常にホスト側の承認必須にできる
* 設定画面から変更可能  
<img width="400" alt="スクリーンショット 2019-06-30 22.46.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87716/1afbf9b5-061c-b653-808d-0d8bae9f43ae.png">
* ホスト側  
<img width="477" alt="スクリーンショット 2019-06-30 22.21.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87716/326c0f2e-376f-04d1-8166-6489a54ff85f.png">
* ゲスト側  
<img width="465" alt="スクリーンショット 2019-06-30 22.18.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/87716/d91c1405-1586-12b2-5013-dafdf928f57e.png">


##### 見られたくない・編集されたくないファイルは共有から除外できる
* 現状あまり使う想定はないですが、試してみました。
* .vsls.jsonというファイルをプロジェクトルートに置き、ファイルを指定したところ即座にゲストからは見えなくなり、デバッグのステップインやコードジャンプも不可でした。設定ファイルなどは場合によっては除外しておいたほうが良いかもしれません。

```json:.vsls.json
{
    "excludeFiles":[
        "fold.scala",
        ".gitignore"
    ]
}
```


設定はいろいろ細かくできそうなので、参考リンクをご参照ください。
前提として、**招待リンクは信頼できる人以外には知らせるな**、とのことです。

# 参考リンク
* [Security features of Live Share](https://docs.microsoft.com/ja-jp/visualstudio/liveshare/reference/security)  
デフォルトで機械翻訳?の日本語が表示されてしまいひどいあり様なので、英語か、それをGoogle翻訳したほうが遥かに読みやすいです😅
【Kotlin】API通信をするための事前準備

いつも忘れるのでメモ。

# ライブラリへの依存を定義
* okhttp3
* retrofit2
* moshi
* Koin

```groovy:build.gradle
dependencies {
    // API通信関連
    def okhttp_version = '3.11.0'
    implementation "com.squareup.okhttp3:okhttp:$okhttp_version"
    implementation "com.squareup.okhttp3:logging-interceptor:$okhttp_version"

    def retrofit_version = '2.6.0'
    implementation "com.squareup.retrofit2:retrofit:$retrofit_version"
    implementation "com.squareup.retrofit2:converter-moshi:$retrofit_version"

    def moshi_version = '1.8.0'
    implementation "com.squareup.moshi:moshi:$moshi_version"
    implementation "com.squareup.moshi:moshi-kotlin:$moshi_version"

    // DI
    implementation 'org.koin:koin-androidx-viewmodel:1.0.2'
}
```

# ApiClientオブジェクトを作成
```kotlin:ApiClient.kt

object ApiClient {
    private const val BASE_URL = "https://qiita.com/"

    val moshi: Moshi = Moshi.Builder()
        .build()

    var retrofit: Retrofit

    init {
        val okHttpClient = OkHttpClient.Builder()
            .connectTimeout(20, TimeUnit.SECONDS)
            .writeTimeout(30, TimeUnit.SECONDS)
            .readTimeout(30, TimeUnit.SECONDS)
            .addInterceptor(HttpLoggingInterceptor().apply {
                level = HttpLoggingInterceptor.Level.BODY
            })
            .build()

        retrofit = Retrofit.Builder()
            .client(okHttpClient)
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .baseUrl(BASE_URL)
            .build()
    }
}
```

* シングルトンで作る
* okhttp、retrofit、moshiを立ち上げる
* BASE_URLはこの中で定義しておくとわかりやすい気がする


# KoinModuleオブジェクトを作成
```kotlin:KoinModule.kt
object KoinModule {
    val modules = listOf(
        dataModule(),
        domainModule(),
        uiModule()
    )

    private fun dataModule() = module {
        single { ApiClient.retrofit }
    }

    private fun domainModule() = module {
        // あとで追加する
    }

    private fun uiModule() = module {
        // あとで追加する
    }
}
```

* シングルトンで作る 
* DIのメリットはテストがしやすくなる＆柔軟なコードになること
* このファイルでは依存関係の解決を行う
* 階層によって分けておくと管理がしやすい


# Applicationクラスを作成
```kotlin:Application.kt
class Application : android.app.Application() {
    override fun onCreate() {
        super.onCreate()
        startKoin(this, KoinModule.modules)
    }
}
```

```xml:AndroidManifest.xml

<application
    android:name=".Application"
    ...>
</application>
```

* Applicationクラスを継承したクラスを作り、その中でKoinを初期化する
    * Androidアプリケーションがプロセスとして起動する際に作成され、呼び出される
* AndroidManifest.xmlへ独自Applicationクラスとして登録する
* 参考： [Applicationクラスを継承して、データの共有をする。 | TechBooster](https://techbooster.org/android/application/2353/)

→ここまできたらあとはServiceを作成してAPIを呼び出せばOK
組み込み開発現場で得た知見を書く

#はじめに
記事を書くのは久しぶりなのでつまんないと思いますが、忘備録程度の内容でご勘弁を……
 
##組み込み現場でやったこと
・車の故障検知の単体テスト
・ナビシステムの不要モジュール潰し設計から実装、システムテストまで
・メーターのシステムテスト

上二つは一年以上前＋炎上しまくってたのであんまり覚えてません
一番最後のメーターのシステムテストだけ書こうと思います

###大まかに何をやったか
・システムテストの実施(CANalyzer、オシロスコープ、基板を使用)
・システムテストの設計

https://www.vector.com/jp/ja/products/products-a-z/software/canalyzer/#c82750
↑CANalyzerについてはこちらを参照していただければと思います

あんまり書きすぎるとお叱りを受ける危険性があるので、
使用したツールや、どんなスキルを得たかを中心に書いていこうと思います

##どんなスキルを得たか
・基板や回路図を読むスキル
・不具合の報告を細やかに書くスキル
・CANalyzerを扱うスキル
・オシロスコープを扱うスキル
・EEPROM設定（ここが一番しんどかった）
・A/D変換などの計算（この辺もうちょっと強化しないとマズイかも……なんか良い本あったら教えてください）

細かく書くとキリがないのでさっくりと書いていきます

###基板や回路図を読むスキル
CPU（ベテランの方々は「石」と言ってました）と機能（LEDやメータの針を動かす場所、モニタ等）のどこに繋がってる的なものを回路図と基板とをにらめっこしながら探すスキルです
基板についてる部品と文字が滅茶苦茶小さいので目が疲れます。オシロスコープのプローブを当てながら作業することもままありましたが、どうしても無理な場合は線出しを依頼しました。半田ごて使えるようになりたい

###不具合の報告を細やかに書くスキル
作業において一番キモになる部分です
テスト手順書に書いてる通りにテストし、期待通りの値にならなければ手順を細かくまとめて報告書に記載します。面倒ですが大事なことです。
不具合報告に必要なものは以下です

・不具合発生（些細なことでもリーダーに確認します）
・仕様書での挙動とテスト手順書とのすり合わせ（仕様書通りでなければ手順書をここで修正します）
・テスト手順とテスト結果（手順に抜け漏れがあればここで補います。だいたいはここらへんまでで解決します）
・開発サイドにエスカレーションして修正を依頼します（不具合として起票します）
・修正されたものを再テストして結果と原因をまとめる（この辺りで問題なしになります）
・手順書の修正方針を書く（次のフェイズで直します）

###CANalyzerを扱うスキル
癖があるツールなのでさっくりと………
基板に値を流して操作し、値通りに動作するかを確認するためのツールです
一点だけ例を挙げます

例）
1.赤いLEDを光らせるRedRightTurnONという変数を持つ信号メッセージEXAM1234を基板に流します
2.CANalyzerからRedRightTurnONの値に1(LEDが光る値。1で光り、0で消える)を送信します。
3.基板のどこかのLEDが光ります。
4.基板の回路図とにらめっこして、正しい箇所が光っているかを確認します。

こんな感じで基板上の機能を操作していきます。
実際は点灯方法やメータの指針やモニタの表示やブザーや時間なども見ていく必要があるのでもっと複雑です。

###オシロスコープを扱うスキル
波形を取るのに時間がかかって大変だった………
電源ONからLED点灯やブザーのタイムラグ(ms単位やμs単位)などを測る際に使用します。

###EEPROM設定
別途の内製ツールで設定していたため割愛します。
テスト手順書通りに設定しないと動かなかったり間違った挙動をするので上手く動作しない場合だいたいこいつのせいです。ちゃんと設定しない私という作業者に主な問題があります。

###A/D変換などの計算
https://www.hokutodenshi.co.jp/PUPPYSupportPage/ensyu/ad/ad1.html

ググったら良いサイトがあったのでだいたいこんな感じの計算です

仮にCANalyzerで電圧が350（デジタル値）が出力されている機能（LEDだろうがブザー回路だろうがなんでも良いです）の電圧を求めることにします

CPUのA/D変換器の分解能が10bitで電圧(VCC)が5Vの場合
GNDからVCCまでの0〜5Vを2^10(1024)で分割しているため次のような計算になります

350*5/1024≒1.71(V)

計算結果からこの機能には1.71Vの電圧がかかっていることになります
（実機ベースでは抵抗その他諸々によりこの値より下の電圧がかかっていることが多いです）

このあたりの話は自分でもかなり勉強不足だと思っているので、良い書籍があれば教えてください（切実）
モータの回転数と排気量の計算とか燃費の計算とか完全にわけわかめなのでorz

##まとめというか感想というか知見
・テストは業種問わずカッチリやるべき
・組み込みもじっくりやるには悪くない業界
・電子回路系は学生時代好きだったのでより深くやりたい
・計算とかC言語のプログラムが底辺レベルなので重点的な強化項目はこの辺りになりそう

久しぶりにアウトプットしましたが、書きたいことがまだあるので余裕あったらまた書きたいです
さてはクソコマンドだなオメー

# 概要
ふと思い立って自作~~クソ~~コマンドを作成した
環境変数について勉強できたので良かったと思う

# $PATHの確認
まず自分のPCの$PATHの確認から

```code:shell
$ echo $PATH
$ /usr/local/bin:
  /usr/bin:
  /bin:
  /usr/sbin:
  /sbin:
  /Library/Apple/usr/bin:
  /Library/Apple/bin
```
# コマンドの作成
テキストエディタならなんでもよし 自分はvimで作成した

```code:shell
$ vim gotohome
```
```shell:gotohome
cat << EOF;
  ∧,∧
( 'ω' )つ お前は
（m9 ＼ 　帰ってよし！
　 ＼　 ＼
　 　 ) ) ＼
　 ／／ ＼ ＼
　 (＿） 　 (＿)
EOF
```
※shellにはprintはないので注意

# 完成
最後に$PATHのどこかにコピーして、すべてのユーザーに実行権限を与えて完成

```code:shell
$ cp gotohome /usr/local/bin
$ cd /usr/local/bin
$ chmod a+x gotohome
```

# 実行してみる
```code:shell
$ gotohome
  ∧,∧ 
( 'ω' )つ お前は 
（m9 ＼ 　帰ってよし！
　 ＼　 ＼ 
　 　 ) ) ＼ 
　 ／／ ＼ ＼ 
　 (＿） 　 (＿)
```
**定時になったら実行したいコマンドができた**
elixir公式のインストールからHello, World!まで[Mac OS]

今更ですが、elixirはじめました。

## インストール

elixirの公式サイトを参考に進めます。
https://elixir-lang.org/install.html#macos

HomebrewとMacportsの2通りありますが、
今回はHomebrewを使います。

### 環境 
>Mac: 10.12.4
Homebrew: 2.1.1(update前)
Homebrew: 2.1.6(update後)

### Homebrewアップデート

```
$ brew update
```

エラーなくアップデートが完了

### elixirのインストール

```
$ brew install elixir
==> Installing dependencies for elixir: openssl@1.1, libpng, libtiff, wxmac and erlang
(省略)
```

elixirの依存パッケージがインストールされます。
依存パッケージでerlangがインストールされているので、
erlangを使うことができます。

```
$ erl +V
Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 10.4.3
```

## Hello, World!

### インタラクティブに

`iex`を使うことでコマンドライン上でやりとりしながら実行できます。
変数に文字列を代入して表示することもできます。

```
$ iex
Erlang/OTP 22 [erts-10.4.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]

Interactive Elixir (1.9.0) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> IO.puts "Hello, World!"
Hello, World!
:ok
iex(2)> x = "Hello, World!"
"Hello, World!"
iex(3)> IO.puts x
Hello, World!
:ok
```

最初に出ている`Erlang/OTP 22 ~`は、
Erlangのフレームワークのバージョン22を使用してることを表してるようです。
（初見時、エラーかと思いました。。。）

### ファイル実行

#### 拡張子

elixirで使用するファイルには主に3つ拡張子があります。

- .ex: コンパイルするファイル
- .beam: .コンパイル時に生成されるファイル
- .exs: コンパイルせずに実行するファイル（スクリプトファイル）

#### exファイル（beamファイル）

ファイル作成

```
$ touch helloworld.ex
```

適当なエディタでファイルに記入

```helloworld.ex
defmodule HelloWorld do
    def greet do
        IO.puts "Hello, World!"
    end
end

HelloWorld.greet
```

参考: [The Elixir Style](Guidehttps://github.com/christopheradams/elixir_style_guide)

コンパイルには`elixirc <ファイル名>`を実行します。

```
$ elixirc helloworld.ex
Hello, World!
```

実行後、ディレクトリに実行ファイルが作成されています。

```
$ ls
Elixir.HelloWorld.beam	helloworld.ex
```

`elixir -e <モジュール名>.<関数名>`で実行できます。

```
$ elixir -e HelloWorld.greet
Hello, World!
```

#### exsファイル

先ほど作成したファイルをコピーします。

```
$ cp helloworld.ex helloworld.exs
```

スクリプトファイルの場合は`elixir <ファイル名>`を実行します。

```
$ elixir helloworld.exs
Hello, World!
```

先にコンパイルしていると以下のWarningが表示されますが、
beamファイルを削除することで表示されなくなります。

```
warning: redefining module HelloWorld (current version loaded from Elixir.HelloWorld.beam)
```

## 所感

インストールに時間がかからない点、
関数型言語にしては分かりやすい点で、お手軽な言語だと思いました。
PHPの文法をrubyにして、pythonを足した様な言語という所感です。

ちなみに、elixirに興味を持った理由は2つです。

1. 株式会社アカツキ様のロマサガRSで使用していること
([ロマサガRS における Elixir サーバー開発実践 ~生産性を上げてゲームの面白さに注力~](https://speakerdeck.com/elixirfest/romasakars-niokeru-elixir-sahakai-fa-shi-jian-sheng-chan-xing-woshang-ketekemufalsemian-bai-sanizhu-li))

2. サーバーサイドの言語として新しいこと
新しいものが好きです。
（新しい言語は古い言語よりも勉強しやすいと個人的に思っています。）


elixirを学ぶのにいいサイトなどあれば、
コメントにて教えていただけると助かります！

## 参考

[elixir](https://elixir-lang.org/)
[Elixir で Hello world!](https://qiita.com/tanaka0325/items/045ce9d9ee9355741c3d)
[Elixir入門の入門（インストール→「Hello, World!」を表示）](https://qiita.com/kazuhikoyamashita/items/fee98aa446a9e71c109c)