OmniAICreator/Qiita-1.07M huggingface dataset:
コンテナ初めましてからEKS・ECSを理解する

# 記事の目的
仕事でオンプレで動いているシステムをAWS上に移行するという話が出て来ました。
そこで、今流行りDockerで動かしてEKSで管理して・・・という話になり、学習をはじめました。
AWSのコンテナ系のサービスはいくつかありますが、ECS？EKS？Fargate？美味しいの？状態です。
そこで、この記事はコンテナ初めましての方が、AWSでコンテナを始めるのに何を選んだら良いのかを考えられるようになることが目的です。
説明が薄いので、適宜参考になる記事を載せています。

# コンテナって何？
サーバの仮想化とは何が違うの？と思いました。
サーバの仮想化は、ひとつの物理サーバの仮想化されたハードウェア上で、複数のサーバをOSから丸っと動かします。
一方コンテナとは、一つのOS上で、他のプロセスから隔離してアプリケーションを動作させます。
Dockerはそのコンテナの実行環境を提供してくれます。
この記事が絵があって分かりやすかったです。
[第1回　Dockerとは：超入門Docker](https://www.atmarkit.co.jp/ait/articles/1701/30/news037.html)

# AWSでコンテナを動かすにあたって
コンテナを動かすに当たって気にする点と対応するAWSサービスは下記になります。

- 複数のコンテナを管理する（コントロールプレーン）
  - ECS、EKS
- 複数のコンテナが動く場所を用意する(データプレーン)
  - EC2、Fargate

# EKSとECSの違い？

## EKSとは
Amazon Elastic Container Service for Kubernetes (Amazon EKS) は、
AWSでKubernetesを実行できるようにするマネージド型サービスとなります。

Kubernetesとは、コンテナを運用するツールとなります。
Dockerは外部のホストとやり取りする場合はNATが必要となり、連携が煩雑になります。
そこをひとまとめにし、一つの実行環境として見せてくれて、どこでどうコンテナを動かすのかという部分をKubernetesが管理してくれます。
[Docker（コンテナ型仮想化）と Kubernetes についての簡単な紹介]
(https://ubiteku.oinker.me/2017/02/21/docker-and-kubernetes-intro/)


こちらの記事がKubernetesの説明から図解されていておすすめです。
[10分くらいでわかる、KubernetesとEKSの何が便利なのか](https://qiita.com/masachaco/items/3e50a1ac65cdd661a734)
そのあとに公式ドキュメントを読むと理解が深まります。
[Amazon EKS とは](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/what-is-eks.html)

## ECSとは
Amazon Elastic Container Service (Amazon ECS) は、AWSが開発したコンテナ管理サービスです。
データプレーンはEC2,Fargateどちらにも対応しています。
ECSについては、公式ドキュメントが分かりやすかったです。
[Amazon Elastic Container Service とは](
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/Welcome.html)

データプレーンがEC2起動タイプだと、EC2の面倒は自分でみることになります。
インスタンスのリソースを超えそうになったときは、EC2自体をスケールしなければなりません。
スケールの自動化を作り込みが必要になります。
それ以外にも、インスタンスの監視や、ELBの設定が必要になります。

そこをうまいこと管理してくれるのが、Fargateとなります。
ただ、EC2起動タイプよりも割高です。

# どれを選ぶべき？

|    |メリット|デメリット|
|:-----------------|:-----------------|:-----------------|
|ECS|・シンプルなので容易に始められる<br>・Fargateが使用できる<br>・ECS自体の料金はなく、リソース分の料金のみ|・EC2周りの管理を自前で作り込む必要がある<br>・ECSはAWSのサービスなので、AWS依存になってしまう|
|EKS|・Kubernetesを管理できるのであれば別のシステムに移管することができる<br>・EC2インスタンスのオートスケール機能があるので、スケールを作り込む必要がない|・Kubernetesのメンテが必要になる<br>・EKSクラスターごとに、1時間あたりの料金＋リソースの料金がかかる<br>・東京リージョンに来たばかりなので、ノウハウがまだ十分には無い|

# 感想
AWSでは、EC２上でコンテナを動かすのですが、EC2も仮想サーバなので、仮想サーバの中でコンテナが動いている？と思いました。

EKSは最近東京に来たので、ノウハウがあまり無いですが、ECSで運用していてEKSに移管しようとする声をよく聞きます。
AWS上でコンテナ始めたいけど、ECSはリソースのスケールの自動化がとても大変、でもFargateはとても高いし・・・
Kubernetesはコード管理できるし運用がとても楽だと思いました。

ただ、EKSはEKSクラスターごとに、1時間あたりの料金がかかります。
ECSでスケールの自動化が作り込めるのであれば、スポットインスタンスを併用することで一番安く運用できるのでないでしょうか。
EKSは比較的大きなシステムに向いていそうです。
保存時にPythonコードを自動整形してくれるautopep8の簡単な設定方法

## はじめに
色んな記事を渡り歩きましたが、マクロを使った方法が一番簡単だと気付いたので筆を執りました。

## autopep8とは
Pythonの標準ライブラリに含まれているPythonのコーディング規約のこと
https://pep8-ja.readthedocs.io/ja/latest/#


## 導入の利点
チーム開発時に、細かい修正の手間が省ける。
普段から綺麗なコーディングができる。

## 環境
Windows 10 Home
Python 3.7.3
PyCharm 2019.1.3 (Community Edition)


## インストール
autopep8をインストール

```:コマンドプロンプト
C:\Development>pip install autopep8
```

## マクロの設定
自動整形のショートカットコマンドと保存のコマンドをまとめて行うように設定します。
Edit > Macros > Start Macro Recording
マクロのレコーディングが開始されたので、[Ctrl + Alt + l]、続けて[Ctrl + s]を入力。
Edit > Macros > Stop Macro Recording
マクロ名を入力。今回は「save&autopep8」にしました。
これでマクロが完成しました。Edit macrosで確認すると入力したActionが右側に表示されています。
お好みに合わせて、actionを追加・削除してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/fdc6c425-3c25-552b-8ea3-f14e84c286a6.png)


## マクロへのショートカットコマンドの割り当て
作成したマクロにはショートカットコマンドを割り当てることができます。
File > Settings > Keymap > Macros > save&autopep8 > Add Shorotcut Keyboard
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/1825098d-6a89-e0a2-6830-91d27bb862f7.png)

[Ctrl + s]を入力してOK
既に登録されている場合は警告が出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/ab1bb48b-03ff-287f-d6da-9ff2d9c0a28c.png)


Removeで上書きします。
※保存のみと操作を分けたい方は別のショートカットコマンドを割り当ててください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286189/04c7781c-b88a-f81f-761d-850d529122ca.png)


## おわりに
数時間かかったなんて言えない。

## 参考記事
https://qiita.com/Chanmoro/items/3f20a1adf260c5ddf7dd
https://githubja.com/hhatto/autopep8
rails api のcors設定　覚書

# Rails Api での CORS設定　ー覚書ー

## フロントエンドをNuxt.jsで作り、そこからRailsのAPIを叩く際の覚書
　フロントエンドをNuxtで書いて、Railsで作ったAPIへFetchAPIでPOST送信する際の手順の覚書です。
今回はFetchAPIを使っていますが、Axiosでも同じです。

リクエストのヘッダ情報の中で、```credentials: 'include'``` にした時に、エラーメッセージで,「```credentials: 'include'```の時は```Access-Control-Allow-Origin```はワイルドカードにしちゃ駄目!!」と言われた事に対する対処の覚え書きです。


###　Nuxt側のコード

```javascript:store/hoge.js
export const actions = {

// ー中略ー

actions:{

  async hogehoge ({ commit }) {
    // POST送信で送りたいオブジェクト
    let searchInfo = {
      mode: "new",
      piyopiyo : 9,
      message : "hello",
    }
　　//　開発環境でLocalで動かしているRailAPIアプリのアドレス
    let url = "http://localhost:3000/api/v1/searches"
    let json = fetch(url, {
      mode: 'cors',
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },
      credentials: 'include',
      method: 'POST',
      body: JSON.stringify(searchInfo)
    })
    Promise.resolve(json)
      .then(result => {
        return result.json();
      })
      .then(response => {
        commit('setProducts', response)
      })
      .catch(error => console.log(error));
  }
}
```

### rack-cors の利用

```ruby:Gemfile
gem 'rack-cors'
```

```
$ bundle install
```


bundle install すると自動的にcors.rbファイルが作成される。

### corsの設定

```ruby:config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    # Nuxtの開発用ローカルサーバーのアドレスを指定する。
    origins 'http://localhost:3333'

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head],
      credentials: true
  end
end
```

originの指定を  ```*``` にすると全てを許容する事になるが、リクエスト側でcredentials: 'include'を指定している時は、
```*```にするとエラーとなる為きちんと指定する必要がある。

リクエストにクッキーを含める際は、```credentials:'include```に設定しなくてはならないので、```*```ではダメでした。

## まとめ

CORSについては今まで何でもかんでもOriginsを```*```にしていたり、POST送信を使わず、無理やり　Get送信にパラメターで送りたい情報を持たせていた為、理解が不足していました。さらに、掘り下げて学習していきます。

また、今回の対処方法では、本番環境と開発環境を行き来するたびにフロントエンド側もAPI側もアドレスを書き換えなくてはならないので、環境に応じて、切り替えれるようにしたいです。
RaspberryPi3用 の 64bit OSイメージ(Debian) の作成手順

**RaspberryPi-bin**　[![GitHub stars](https://img.shields.io/github/stars/PINTO0309/RaspberryPi-bin.svg?style=social&label=Stars)](https://github.com/PINTO0309/RaspberryPi-bin)
<a href="https://github.com/PINTO0309/RaspberryPi-bin"><img src="https://github-link-card.s3.ap-northeast-1.amazonaws.com/PINTO0309/RaspberryPi-bin.png" width="460px"></a>

# １．Introduction
Debian 9 (Stretch) をUbuntu上で自力クロスコンパイルして、RaspberryPi3 へ導入するためのOSイメージファイルを生成します。 RaspberryPi3 を 64bit で動作させるために実施します。 動作を確認してみたところ、 Raspbian とほとんど変わらない操作感でした。 全体の作業時間はおおむね３０分と、とても簡単な作業です。 一応、次期 "Buster" もビルドしてGithubへコミットしておきました。

# ２．Environment
- Ubuntu 16.04
- RaspberryPi3 model B/B+

# ３．Procedure
```bash:下準備_(Ubuntu_16.04)
$ sudo apt update
$ sudo apt install -y debootstrap debian-archive-keyring qemu-user-static \
binfmt-support dosfstools rsync bmap-tools whois git bc psmisc dbus sudo \
git crossbuild-essential-arm64
$ git clone https://github.com/drtyhlpr/rpi23-gen-image.git
$ cd rpi23-gen-image
```

```console:64bit_OSイメージのビルド_(Ubuntu_16.04)
$ sudo su

# RPI_MODEL=3 \
RELEASE=stretch \
BUILD_KERNEL=true \
KERNEL_ARCH=arm64 \
RELEASE_ARCH=arm64 \
CROSS_COMPILE=aarch64-linux-gnu- \
QEMU_BINARY=/usr/bin/qemu-aarch64-static \
KERNEL_DEFCONFIG=bcmrpi3_defconfig \
KERNEL_BIN_IMAGE=Image \
KERNEL_IMAGE=kernel8.img \
KERNEL_BRANCH=rpi-4.14.y \
ENABLE_WIRELESS=true \
TIMEZONE="Asia/Tokyo" \
EXPANDROOT=true \
ENABLE_DPHYSSWAP=true \
ENABLE_DHCP=true \
ENABLE_SYSVINIT=true \
./rpi23-gen-image.sh

# exit
```

![Screenshot 2019-06-15 15:15:49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194769/6f308cd1-bc27-6f7d-05cd-4b49f63e2d3f.png)

あとは、Raspbianをインストールするときと同じように **`DDツール`** で microSDカードへ **`.img`** ファイルを焼きこむだけです。

# ４．Optional

```console:内部パッケージの最新化_(RaspberryPi3)
$ sudo apt-get update
$ sudo apt-get upgrade
```

```console:アーキテクチャの確認、aarch64(64bit-arm)になっていることが確認できます_(RaspberryPi3)
$ uname -a
Linux rpi3-stretch 4.14.114-v8 #1 SMP PREEMPT Sat Jun 15 13:27:44 JST 2019 aarch64 GNU/Linux
```

```console:ifconfigコマンドのインストール_(RaspberryPi3)
$ sudo apt-get install -y net-tools
```

```console:SWAPエリアの拡張(8GB)_(RaspberryPi3)
$ sudo nano /etc/dphys-swapfile
CONF_SWAPSIZE=8192
CONF_MAXSWAP=8192

$ sudo systemctl stop dphys-swapfile
$ sudo systemctl start dphys-swapfile
```

```console:Under-voltage_detected!_(0x00050005)_の表示抑止
$ sudo nano /boot/cmdline.txt

#下記の構文を半角空白で区切って末尾に追記します。
loglevel=1
```

# ５．Reference articles

**[Raspberry Pi3用Debianイメージを色々なアーキテクチャに対応させて作成する - Qiita - maccadoo](https://qiita.com/maccadoo/items/2986afa81ba96321c818)**
**[rpi23-gen-image - Github - drtyhlpr](https://github.com/drtyhlpr/rpi23-gen-image.git)**
**[Raspberry Pi3 CPUクロック周波数を固定にする方法 - ある計算機屋さんの手帳](http://my-web-site.iobb.net/~yuki/2017-12/raspberry-pi/cpufreq/)**
**[Orange Pi Ubuntu Xenialのスワップメモリのサイズ変更、設定方法まとめ、ZRAM Swapを無効にする方法](http://www.neko.ne.jp/~freewing/raspberry_pi/orange_pi_pc2_ubuntu_config_swap_memory_size/)**
[備忘録] PythonのPILで透過GIFを作る時に後ろの画像を表示させない方法

[備忘録]
PILにて透過画像からGIFを作成することが可能です。
その時に、何も設定をしないと、透過されているところが黒くなってしまいます。
その対策のために、マスクをかけます。

```py
image = Image.new('test.png')
alpha = image.split()[3]

image = image.convert('RGB').convert('P', palette=Image.ADAPTIVE, colors=255)

mask = Image.eval(alpha, lambda a: 255 if a <= 128 else 0)

image.paste(255, mask=mask)
```

これらの画像から生成すると、画像が更新されると後ろに前の画像が表示されます。
対策としては、gifとして保存する時に、disposal=2にすることで対策が可能です。

```py
image.save('new.gif', save_all=True, append_images=images, duration=100, loop=0, transparency=255, disposal=2)
```
VSCodeをWindows10にいれてみた。

今まで、MarkdownやPython関連でもAtomを使っていたのだけど、職場の人たちがVSCode使う人たちで増えてきたので、これを機に自分も乗り換えてみることにしました。

ちなみに、乗り換えたいと思った一番の要因が、
**「ATOMの起動が遅い！！」**
でした。

まわりの人たちは、「VSCodeの起動特にストレスないよー」とか「プラグイン結構あるから、あまり不便感じないよー」と言っているので、とりあえずと使ってみようと思います。

速度に関しては、こんな比較記事もあったり・・・

Atom vs Visual Studio Code 速度比較!! Electron系テキストエディタ2大決戦!!
https://ryuta46.com/379

## インストール

公式サイトからダウンロードしてインストール

https://code.visualstudio.com/

![rapture_20190615143440.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203502/82d385b7-ac29-779d-0988-4d3238c3e656.png)

インストール場所とかPATとかの設定とか変更できるシーンがありましたが何も変えずそのまま次へを押下しインストールしました。

最後の完了を押下で、VSCodeが起動されました。

![rapture_20190615143926.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203502/084449db-7f76-6cd4-5f15-28530ecbeec0.png)

## 設定

### 言語設定

英語のままでも、なんとなくわかるのですが、日本語化もできるので、とりあえず設定。

左側の下にあるアイコン（拡張機能アイコン「Ctrl + Shift + X」）から設定を追加します。

![rapture_20190615144301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203502/e52c9e2f-a0b5-d4b1-2c9a-90997a8e36a5.png)

検索フィールドに「Japanese Language Pack for Visual Studio Code」を入力し、インストールする。

![rapture_20190615144343.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203502/d02ed4af-3d67-81fa-13fa-6f0c53438d96.png)

右下に「Restart Now」が表示されるので、押下し、再起動。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203502/00d2fa7e-7bde-c11a-4ca7-317b80bd06e6.png)

以上で日本語化も完了！！簡単！！
discordに書かれたメモをPythonを用いてMarkdown記法に変換する

初投稿。

#目的
スマブラプレイヤー**えつじ(https://twitter.com/yk_Etsuji)** が
Youtubeメンバー向けdiscordに残したメモの整理。

既に有志がMarkdownで綺麗にまとめてくれたものが存在するため、
今回のプログラムの目的はまとめ作業の半自動化を目標とする。

#Markdown記法とは
文章を記述するための記法の一つ。
htmlに変換可能で、何より分かりやすく書きやすい。

#処理の流れ
discordのログをtxtファイルにコピー＆ペースト
↓
読み込み[python]
↓
メッセージの日付情報を取得する。[python]
↓
3種類のデータに分類[python]
↓
分類に合わせてデータを格納[python]
↓
日付順にソート[python]
↓
Markdown記法で出力[python]

##dicsordのログをtxtファイルにコピー＆ペースト
そのままコピー＆ペーストするだけ。
ex.discordのログ
![discordsample.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438205/e77a6827-db7b-89c2-ff97-251716d3e4bc.png)

ここからメッセージを日時ごとコピー＆ペーストする。
ex.txtファイル
![textsample.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438205/cd3b3c16-a2bb-4c8a-8fb4-a6870f1ee948.png)

##読み込み[python]
そのまま読み込み。

##メッセージの日付情報を取得する。[python]
discordのメッセージは、

[投稿者の名前][日時]
[メッセージの内容]

という形で表示される。

この特徴を利用し、投稿者の名前(この場合はえつじ)が含まれる行の情報は「日付情報」であるとして、処理を行う。

具体的には、[日時]のみを抜き出し日付型に格納する。

##3種類のデータに分類[python]
メモの特徴として、
日付情報の後には分類のための情報が載ることが多い。

そのため、その行についての情報を調べ、
0 .. スマブラSP全般のメモ
1 .. 使用キャラのメモ
2 .. キャラ対策メモ　　　　　　　に分類する。

具体的には、文章に

「ルキナ、マルス、ディディー」が含まれる場合、
⇒使用キャラのメモ

「それ以外のキャラクターの名前」が含まれる場合、
⇒キャラ対策メモ

いずれにも該当しない場合、
⇒スマブラSP全般のメモ

であるとし、分類を行う。

##分類に合わせてデータを格納[python]
各データはリストdataに格納する。

data[0]  ... 日付情報(datetime)
data[1]  ... 分類情報(int)
data[2~] ... 内容情報(String)

使用キャラのメモ、キャラ対策メモの場合は
data[2]には該当のキャラクターの名前が入る。

作成したリストdataは、
さらに大きなリストdata_listに格納する。

##日付順にソート[python]
日付情報を基準に、バブルソートを用いて、data_list内のソートを行う。

##Markdown記法で出力[python]
データをMarkdown記法でtxtファイルに出力する。

#参考文献、謝辞
日付データを利用するにあたって、
こちらの記事(https://qiita.com/motoki1990/items/8275dbe02d5fd5fa6d2d) を参考にさせていただきました。

何より、メンバー向け情報を整理していただいてる有志の方、ありがとうございます。

最後になりましたが、えつじさん、いつも楽しい配信ありがとう。
ラズパイのSSH接続設定手順(Mac + Rasbian)

# ラズパイにMacからSSH接続してPythonスクリプトをデプロイ+実行する手順
ラズパイ用のスクリプトを開発するときに、Macの方でIDE使いたいし、ラズパイにキーボード・マウス・ディスプレイ繋ぐのめんどくさいので、SSHの設定をしたときのメモ

## ラズパイ側設定
### IPを固定
設定ファイルを開いて、ルータとラズパイのIPを設定

```bash
$ vi /etc/dhcpcd.conf
```

```conf:dhcpcd.conf
interface wlan0
static ip_address=192.168.2.107/24
static routers=192.168.2.1
static domain_name_servers=192.168.2.1
```
※サブネットとルータのIPは自身のLANの環境に合わせて、適宜変更

### SSHを有効化
`/boot/ssh`というファイルを作って再起動

```bash
$ sudo touch /boot/ssh
```

※または、デスクトップ画面の上部メニュー→「設定」→「Raspberry Piの設定」を開き、インターフェースタブで SSH を「有効」に設定

## Mac側設定
### 公開鍵ペアを生成し、配置
鍵ペア生成

```bash
$ ssh-keygen -t rsa
```

公開鍵をSCPでラズパイに送信

```bash
$ scp .ssh/id_rsa.pub　pi@192.168.2.107:
```

SSHでラズパイに接続し、公開鍵の内容を`authorized_keys`に追加

```bash
$ ssh pi@192.168.2.107
$ mkdir .ssh
$ cat id_rsa.pub >> .ssh/authorized_keys
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys
$ rm id_rsa.pub
```

公開鍵認証を許可するため、`sshd_config`を開く

```bash
$ sudo vi /etc/ssh/sshd_config
```

下記６行を追加、またはすでにある場合変更

```conf:sshd_config
Port 25000
PermitRootLogin no
RSAAuthentication    yes
PubkeyAuthentication yes
AuthorizedKeysFile   .ssh/authorized_keys
PasswordAuthentication no
```

SSHDを再起動

```bash
$ sudo /etc/init.d/ssh restart
```

`cmd + D` でMacに戻り、公開鍵認証によるSSH接続の確認

```bash
$ ssh -i .ssh/id_rsa -p 25000 pi@192.168.2.107
```

コマンドが長くてめんどくさいので、エイリアスを設定

```bash
$ vi .ssh/config
```

```conf:config
Host raspi
	HostName 192.168.2.107
	User pi
	Port 25000
	IdentityFile ~/.ssh/id_rsa
    TCPKeepAlive yes
    IdentitiesOnly yes
```

エイリアスでSSHできることを確認

```bash
$ ssh raspi
```


# スクリプトのデプロイと実行
デプロイ(SCPで送るだけ)

```bash
$ scp develop/python_scripts/raspi_bot.py raspi:~/
```

実行(venv環境)
※ホームディレクトリにvenv環境を構築済み前提

```bash
$ ssh raspi
$ . venv/bin/activate
(venv)$ python develop/python_scripts/raspi_bot.py
```

ラズパイのシャットダウン

```bash
$ sudo shutdown -h now
```
phperのための"A Tour of Go" 【Loops and Functions編】

# 【概要】

この記事では [A Tour of Go](https://go-tour-jp.appspot.com/list) のExercise: [Loops and Functions](https://go-tour-jp.appspot.com/flowcontrol/8) の解答例をgolangおよびPHPで提示します。phperの方はこの解答例を参考にしてGopherちゃんと触れ合っていただけると幸いです。

今回取り扱うExerciseの内容は下記の通りです

> 関数とループを使った簡単な練習として、平方根の計算を実装してみましょう: 数値 x が与えられたときに z² が最も x に近い数値 z を求めたいと思います。
> 
> コンピュータは通常ループを使って x の平方根を計算します。 いくつかの z を推測することから始めて、z² がどれほど x に近づいているかに応じて z を調整できます。
> 
> z -= (z*z - x) / (2*z)
> 実際の平方根に近い答えになるまでこの調整を繰り返すことによって、推測はより良いものなります。
> 
> これを func Sqrt に実装してください。 何が入力されても z の適切な開始推測値は 1 です。 まず計算を 10 回繰り返してそれぞれの z を表示します。 x (1, 2, 3, ...) のさまざまな値に対する答えがどれほど近似し、 推測が速くなるかを確認してください。
> 
> Hint: 浮動小数点の変数を初期化して宣言するには、型でキャストするか、浮動小数点を使ってみてください:
> 
> z := 1.0
> z := float64(1)
> 次に値が変化しなくなった (もしくはごくわずかな変化しかしなくなった) 場合にループを停止させます。 それが 10 回よりも多いか少ないかを確認してください。 x や x/2 のように他の初期推測の値を z に与えてみてください。 あなたの関数の結果は標準ライブラリの math.Sqrt にどれくらい近づきましたか？
> 
> (Note: If you are interested in the details of the algorithm, the z² − x above is how far away z² is from where it needs to be (x), and the division by 2z is the derivative of z², to scale how much we adjust z by how quickly z² is changing. この一般的なアプローチはニュートン法と呼ばれています。 多くの関数で有効に働きますがとくに平方根では殊更有効です。)

# 【golangでの解答例】

## - コード
```go
package main

import (
    "fmt"
    "math"
)

func Sqrt(x float64) float64 {
    z := float64(1)
    s := float64(0)
    for {
        z = z - (z*z - x)/(2*z)
        if math.Abs(z - s) < 1e-10 {
            break;
        }
        s = z
    }
    return z
}

func main() {
fmt.Println(Sqrt(2))
    fmt.Println(math.Sqrt(2))
}
```
## - 実行結果
```
1.4142135623730951
1.4142135623730951
```
# 【PHPでの解答例】
## - コード
```php
<?php

function mySqrt(float $x):float
{
    $z = floatval(1);
    $s = floatval(0);
    while (1) {
        $z = $z - ($z * $z - $x) / (2 * $z);
        if (abs($z - $s) < 1E-10) {
            break;
        }
        $s = $z;
    }
    return $z;
}

echo sqrt(2) . "\n";
echo mySqrt(2) . "\n";
```
## - 実行結果
```
1.4142135623731
1.4142135623731
```

# 【golangとPHPを比較して】

golangの実行結果は**1.4142135623730951**、PHPの実行結果は**1.4142135623731**と精度が異なります。
（参考までに）PHPは[公式ドキュメント](https://www.php.net/manual/ja/language.types.float.php) に以下のように記述されています。
> float の大きさはプラットフォーム依存です。ただし、通常はおよそ 10 進数で 14 桁の精度があり、最大値は ~1.8e308 (これは 64ビット IEEE フォーマットです) となります。
私もisbn13をisbn10に変換する。


配列インデックスと10からの重みを一致させといたらスッキリするかと、思ったら、そうでもなかったコードが以下です。

#追記
""scivola 2019-06-14 12:10 2  実使用する人がいるかもしれないので念のため。  13 桁版から 10 桁版に変換可能なのは「978」で始まっている ISBN だけです。 現在のところ，「978」と「979」が ISBN に使われています。""
とのこと。そーなのかー。暫定対応した。

```
isbn13= "9784797386295"; abort "Unsupported Number" if isbn13[0..2] != "978";
isbn13[3..-2] + (   (isbn13[3..-2]+"ZZ").split("").reverse.each_with_index.inject(0){|sum,(c,idx)| sum + (c.to_i * idx) }%11 * (-1)+11 ).to_s.gsub(/\d{2}/,{"10"=>"X","11"=>"0"})
=> "4797386290"

```

```
 isbn13="9784774183619";abort "Unsupported Number" if isbn13[0..2] != "978";
isbn13[3..-2] + (   (isbn13[3..-2]+"ZZ").split("").reverse.each_with_index.inject(0){|sum,(c,idx)| sum + (c.to_i * idx) }%11 * (-1)+11 ).to_s.gsub(/\d{2}/,{"10"=>"X","11"=>"0"})
=> "477418361X"
```

```
 isbn13="9784797386295";abort "Unsupported Number" if isbn13[0..2] != "978";
isbn13[3..-2] + (   (isbn13[3..-2]+"ZZ").split("").reverse.each_with_index.inject(0){|sum,(c,idx)| sum + (c.to_i * idx) }%11 * (-1)+11 ).to_s.gsub(/\d{2}/,{"10"=>"X","11"=>"0"})
=> "4797386290"
```

#参考
https://qiita.com/110416/items/9c627b2c06ae192ce586

https://qiita.com/jnchito/items/b8be26ce87b56c9341ae
ArchLinux + xfce4 を利用しているときのウインドウリサイズのショートカットキー

## はじめに

ArchLinux でウインドウリサイズをするときにどうしたらいいかを調べたメモです。

## tl;dr

以下のようなキーで実現可能でした。

項目|ショートカットキー
:--|:--
リサイズ| `Alt` + `F8` -> ドラッグで調整
最小化| `Alt` + `F9`
最大化| `Alt` + `F10`

Windows では右半分や左半分にリサイズするショートカットキーがあったり、Mac では [Spectacle](https://www.spectacleapp.com/) というアプリを使っていたのですが、xfce4 にはないようですね。。

## おわりに

最低限のウインドウリサイズはできるようになったのですが、もしもっと便利な方法見つけたらまた記事にまとめようと思います。

## 参考

* [Wish to tweak corner-grabbing and edge-grabbing accuracy / Desktop / Xfce Forums](https://forum.xfce.org/viewtopic.php?pid=28378#p28378)
* [xfceのウィンドウサイズ変更ショートカット](https://blog.kaznishi.com/post/180408_xfce_window_resize/)
Railsサーバー起動時の『Could not find a JavaScript runtime』エラー対応方法

新規でRailsアプリケーションを作成する際、サーバーを起動させようとしたら以下のようなエラーが発生しました。

```
/myapp/vendor/bundle/ruby/2.6.0/gems/execjs-2.7.0/lib/execjs/runtimes.rb:58:in `autodetect': Could not find a JavaScript runtime. 
See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
```

エラーの原因は、RubyからJavaScriptを呼び出す役割を持つExecJSのランタイムが見つからないためのようです。

ExecJSがサポートしているランタイムは以下の通りです。[^1]

- therubyracer
- therubyrhino
- Duktape.rb
- Node.js
- Apple JavaScriptCore
- Microsoft Windows Script Host (JScript)
- Google V8
- mini_racer

[^1]: https://github.com/rails/execjs



Node.jsをインストール後、再度サーバーを起動させたら問題は解決しました。
青空文庫から目当ての作家の作品取得

## 概要
NLP 遊び用にファイルを取得する。

- 環境は MacOSX Mojave 10.14.5 ローカル。
- 手順：
    1. github から青空文庫のソースコードを丸ごと `git clone`
    2. WEB ページで目当ての作家の ID 探してディレクトリにたどり着く
    3. unar で unar
    4. xattr で xattr
    5. nkf で nkf

## 1. github から青空文庫のソースコードを丸ごと `git clone`
いつからか [github](https://github.com/aozorabunko/aozorabunko) で管理し始めたらしい。

`Clone or download` からリポジトリのアドレスをコピーして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247099/1f34d58c-6d9d-37e2-5c56-7d66d995d205.png)

クローンする。15 GB あるので注意。

```bash
$ cd $適当なディレクトリ
$ git clone git@github.com:aozorabunko/aozorabunko.git
```

## 2. WEB ページで目当ての作家の ID 探してディレクトリにたどり着く
[WEB ページ](https://www.aozora.gr.jp/index.html)から好きな作家の作品のページにどうにかしてたどり着く。
URL の「〜cards」の直後に作家を示す ID が入ってるのでコピー。
画像でいうと 000879

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247099/7a0a0df5-d0c7-071e-7436-cba9b2fd5c64.png)

ID 把握したら以下のディレクトリに移動。

```bash
cd $適当なディレクトリ/aozorabunko/cards/$作家を示すID/files/
```

## 3. unar で unar
解凍する。
解凍できたら unar でなくてもよいです。

```bash
$ mkdir $解凍ファイル用ディレクトリ
$ brew install unar
$ find . -name '*.zip' -exec unar {} -o $解凍ファイル用ディレクトリ \;
```

## 4. xattr で xattr
なんか com.apple.FinderInfo っていう属性がついてる。
気持ち悪いので削除。

```bash
$ # なかったらインストール
$ brew xattr
$ # まとめて削除
$ for f in `ls -1 $解凍先ディレクトリ`;
$ do
$     xattr -d com.apple.FinderInfo ${f};
$ done
```

## 5. nkf で nkf
これで準備万端！
ってあああああああああ！！！！！！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247099/92d778fe-8f89-6b3f-5b52-12878d2b57cf.png)

文字コード直す

```bash
$ cd $解凍先ディレクトリ
$ mkdir ../$UTF8用ディレクトリ
$ for f in `ls -1`;
$ do
$     nkf -u $f > ../$UTF8用ディレクトリ/$f;
$ done 
```

直った
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247099/dce5e068-5b44-1fc2-f50b-f929835c4b8f.png)

あとはお好みで前処理。
Rust+Windows10+vimの開発環境構築備忘録

# 概要
Rustの開発をしたくて環境構築した時の備忘録です。vimのインストールは省略します。補完はVim標準のomni補完を利用します。

# VisualStudioをインストール
後ほどインストールするrustupにはC++コンパイラが必要です。VisualStudioをインストールするときに「C++デスクトップ開発」にチェックを入れればC++コンパイラもインストールされる。
https://visualstudio.microsoft.com/ja/downloads/

# rustupのインストール
RustにはrustupというCLIのインストーラがある。rustに関するツールやライブラリがrustupからインストールできる。
https://rustup.rs/

# rlsのインストールし、vimのプラグインを入れる
vimからlanguage serverを利用するプラグインvim-lspを追加します。
Rustのlanguage serverであるrlsをインストールします。
https://github.com/prabirshrestha/vim-lsp
https://github.com/prabirshrestha/vim-lsp/wiki/Servers-Rust

# vimにrust用プラグインを追加
https://github.com/rust-lang/rust.vim

# vimrcの設定
rustでlspを使うように設定
インサートモードで.か:を入力したときに補完ができるように設定

```vimrc
  if executable('rls')
      let g:lsp_diagnostics_enabled = 0 " エラー表示はALEで行う
      au User lsp_setup call lsp#register_server({
          \ 'name': 'rls',
          \ 'cmd': {server_info->['rustup', 'run', 'stable', 'rls']},
          \ 'workspace_config': {'rust': {'clippy_preference': 'on'}},
          \ 'whitelist': ['rust'],
          \ })
      autocmd FileType rust setlocal omnifunc=lsp#complete
      " .か:を押したときに自動的にオムニ補完
      autocmd FileType rust imap <expr> . ".\<C-X>\<C-O>"
      autocmd FileType rust imap <expr> : ":\<C-X>\<C-O>"
  endif


```

# VimにALEを追加
コードチェッカーであるALEを追加します。
rlsでもコードチェックはできるが、コード内に下線が引かれないのでALEを使用
https://github.com/w0rp/ale
Pythonのopen()で詰まった話

# pythonのopenファイルで詰まった話

## やりたかったこと
csvファイルに`2019/06/11`みたいな名前のファイルを作成しようとした。


## やったこと

### 1. まずは普通に書いてみた

```test1.py
file_name = dt.now().strftime('%Y/%m/%d') + '.csv'
csv_file = open(file_name, 'a', encoding='utf-8')
```

#### 結果

> FileNotFoundError: [Errno 2] No such file or directory: '2019/06/11.csv'

'2019/06/11.csv'というファイルかディレクトリが見つかりません



### 2. openメソッドの第二引数を`w`や`x`などを試してみた。

```test2.py
file_name = dt.now().strftime('%Y/%m/%d') + '.csv'
csv_file = open(file_name, 'w', encoding='utf-8')
```

#### 結果

> FileNotFoundError: [Errno 2] No such file or directory: '2019/06/11.csv'


### 3. chmodで権限変えてみた

```
comod 777 pythonderectory
```

#### 結果

> FileNotFoundError: [Errno 2] No such file or directory: '2019/06/11.csv'


### 4. エラーメッセージをもう一回読んでみた

#### 結果

> ファイル名かディレクトリの区別がついてない説


### ファイル名を変えてみた
```test3.py
file_name = dt.now().strftime('%Y%m%d') + '.csv'
csv_file = open(file_name, 'w', encoding='utf-8')
```

#### 結果

```
$ ls
20190611.csv			test.py		

```
できてた



## 結論	

### ファイル名に「/」を使うのはやめましょう

ファイル名にすると読み込めない文字がいくつかあって、今回の「/」はがっつり使用不可でした。
他にも「.」「"」「\」「[」「]」「:」「;」「|」「=」「,」とかも使用するのはやめましょうというお話でした。
環境はMacOSですが、他のOSどうなんでしょう。

## 今後
今後は、pandasを使ってcsvファイルを使っていきます。



## 反省
今回pythonあんまし関係なかったな...


## 追記
2022/07/12追記
dynabookの公式サイトでwindows10で使えない文字がありました！
windows10では以下の文字が使えないらしいですね
| | |
| --- | --- |
|\　| 円記号| 
|/ | スラッシュ |
| : |コロン |
|* |	　アスタリスク
|? |	　クエスチョンマーク、疑問符
|" | 　ダブルクォーテーション
|<> |	　不等号
| \|	|　縦棒|

[dynabook公式: ファイルやフォルダー名に使用できない文字＜Windows 10＞](https://dynabook.com/assistpc/faq/pcdata2/017598.htm)
rails sした時にalready initialized constant FileUtils::VERSIONとwarningが出てくる

**この記事ではRuby 2.5.1、Rails 5.2.3を使用しています。**

rails sをすると以下のwarningが出たので解決策として残しておきます。
内容はこのようなものです。

```ターミナル
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:90: warning: already initialized constant FileUtils::VERSION
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:92: warning: previous definition of VERSION was here
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1188: warning: already initialized constant FileUtils::Entry_::S_IF_DOOR
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1267: warning: previous definition of S_IF_DOOR was here
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1446: warning: already initialized constant FileUtils::Entry_::DIRECTORY_TERM
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1541: warning: previous definition of DIRECTORY_TERM was here
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1448: warning: already initialized constant FileUtils::Entry_::SYSCASE
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1543: warning: previous definition of SYSCASE was here
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1501: warning: already initialized constant FileUtils::OPT_TABLE
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1596: warning: previous definition of OPT_TABLE was here
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1555: warning: already initialized constant FileUtils::LOW_METHODS
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1650: warning: previous definition of LOW_METHODS was here
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/2.5.0/fileutils.rb:1562: warning: already initialized constant FileUtils::METHODS
/home/〇〇/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/fileutils-1.1.0/lib/fileutils.rb:1657: warning: previous definition of METHODS was here
```


## 原因 ##
gemでインストールしたfileutilsが読み込まれているのにrailsで再度読み込んでいる。

##対策##
エラー文を調べるとここで同じエラーになっている人を発見。
[https://stackoverflow.com/questions/51334732/rails-5-2-0-with-ruby-2-5-1-console-warning-already-initialized-constant](https://stackoverflow.com/questions/51334732/rails-5-2-0-with-ruby-2-5-1-console-warning-already-initialized-constant)

解決策としては一度gemのfileutilsをアンインストールして再度gemをupdateする。

```ターミナル
gem uninstall fileutils
```
```ターミナル
gem update --default
```

これでrails sするとwarningが消えて正常化しました！！

先人の知恵は偉大です。

初めて投稿してみました。よろしくお願いいたします。
roswellを使って環境構築


自分のための忘備録です。

こちらの記事が詳しいです。
https://qiita.com/t-sin/items/054c2ff315ec3b9d3bdc


# 環境 
Windows10

# 手順

## ダウンロード
https://github.com/roswell/roswell/wiki/Installation

からRoswell-x86_64.zipをダウンロードし解凍する。

## path追加
パスを追加し、再起動。

## セットアップ
Quicklispなどのセットアップを
するために
```
ros setup
```
## 確認
```
ros run
```
これでREPLが起動します。

## slimeのインストール
slimeを使うとコンパイルが一瞬でおこなうことができます。
```
ros install slime
```
## slimeを使ってみる
roswellがdefaultでemacsをインストールしてるので、それを使います。
```
ros emacs
```
そして、emacs上で
```
M-x slim
```
これでslimeが無事起動すれば
OKです。


僕の場合は、
```
ros install slime
```
が正常に動作されていないようで、
正しい場所にslimeが配置されていなかったので下記の変更が必要でした。

```
任意のpath\.roswell\lisp\slime\tmp\
以下に配置されていたので、
.roswell\lisp\slime\2019.05.21\
に移す。
```
パーミッションのr, w, -についてまとめてみる

## パーミッション

ファイル権限の確認を忘れがちなので、自分なりにまとめてみる。


ファイルの権限を確認する。

```terminal
ls -l
```

例えば、以下のような結果が出力されたとしよう。

```terminal
-rw-rw-r-- 1 taro taro 0 Jun 15 12:32 permission.rb
```
最初の１０文字をさらに４つに分解する。

```terminal
-
```

これは、permission.rbがファイルであることを表す。
ちなみにディレクトリの場合、ここがdとなる。




```terminal
rw-
```
この３文字はファイル所有者に対する権限を表している。つまり、permission.rbの所有者taroは読み取り、書き込みができる。

```terminal
rw-
```
この３文字は、ファイル所有グループに対する権限を表している。つまり、permission.rbの所有グループであるtaroは、読み取り、書き込みができる。

```terminal
r--
```
この３文字は、ファイル所有者でも所有グループでもない人に対する権限を表している。つまり、その他の人は、読み取りだけができる。

アルファベットと意味の対応はこちら。

|アルファベット|意味|
|:-----------------|------------------:|
|r|読み取り可|
|w|書き込み可|
|x|実行可|
|-|権限なし|

[参考](https://www.udemy.com/learn-basics-of-linux/)
Active Adminで親メニューの並び順を設定する



## ActiveAdminの親メニュー(Parent Menu)の並び順を固定する

- 設定ファイルを更新してアプリ再起動で反映。
- priorityの若い順に左から並ぶ。

```ruby:config/initializers/active_admin.rb
config.namespace :admin do |admin|
  admin.build_menu do |menu|
    menu.add label: "メニュー1", priority: 0
    menu.add label: "メニュー2", priority: 1
    menu.add label: "メニュー3", priority: 2
    menu.add label: "メニュー4", priority: 3
    menu.add label: "メニュー5", priority: 4
    menu.add label: "メニュー6", priority: 5
  end
end
```

- 以下のpriorityは子供の順なので親の順番とは関係ない。

```ruby
ActiveAdmin.register Test1 do
  menu parent: "メニュー1", label: "Test1", priority: 0
end

ActiveAdmin.register Test2 do
  menu parent: "メニュー2", label: "Test2", priority: 1
end

ActiveAdmin.register Test3 do
  menu parent: "メニュー3", label: "Test3", priority: 2
end
```
Django + Dockerでモジュールのimportでエラーが出た時の対処法

Docker上でDjangoアプリを作成中ですが、初歩的なエラーで躓いたので備忘録を兼ねてメモします。
#事象
Docker上でDjangoアプリからrequestsモジュールをimportすると下記のエラー

```
ModuleNotFoundError: No module named 'requests'
```

#環境
mac OS 10.14
python3.7.1
Django2.2.1
Docker(Desktop for mac) 18.09.2


#解決策
pip freezeでrequests自体は既にインストールされていることを確認。
pipでインストールしていてもDockerFileで定義されているrequirements.txtに記載されていないとうまく動かない事に気づいて記載を追加。

```Dockerfile.
（中略）
COPY ./requirements.txt /requirements.txt
RUN pip install -r /requirements.txt #←ここにpipイントールの記載あり

```

```requirements.txt
requests>=2.21.0 #追加
```
requirements.txtに追加しただけではダメで下記コマンドを実行。

```
docker-compose build
```
このあとdocker-compose runで無事動きました！
CocoaPodsのつかいかた

いつも忘れてしまうので、自分の備忘録がてらまとめます。

## 環境構築

##### CocoaPodsがインストールされているか確認する
    pod

##### CocoaPods本体をインストールする
    sudo gem install cocoapods
    pod setup

## 導入

##### プロジェクトにpodを導入する
Xcodeでプロジェクトを開いていたら、閉じる。
.xcodeprojと同ディレクトリに移動する

     pod init

すると `Podfile`が生成されます。
`Podfile`を開き、インストールしたいライブラリを記載します。

```ruby
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'TestProject' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!

  # Pods for TestProject
  pod 'Material' # ← ここにインストールしたいライブラリを指定する

end
```

その後、ターミナルに戻り、

    pod install

インストールが終わると、以下ファイルが生成されます。

- .workspace
- Podfile.lock
- Podsフォルダ

以後プロジェクトを開くときは .xcodeprojファイル(青いやつ)は使用せず、 .workspace(白いやつ)を使用します。

## 導入後のメンテナンス

- pod install
    - Podfile.lockを参照して、ライブラリをインストールします。
    - ライブラリのバージョンは上がりません。
- pod update
    - 最新のライブラリにアップデートします。
    - その後、Podfile.lockを更新します。

- sudo gem update cocoapods
    - cocoapods 本体をアップデートします。
Colaboratoryの基本コマンドの使い方

#はじめに
Google Colaboratoryを使いこなすには、magic commandを知る必要がある。このため、個人なりの整理といった位置づけのメモである。まとまった資料はあちこちあるので参考にされたい。

- [【秒速で無料GPUを使う】深層学習実践Tips on Colaboratory](https://qiita.com/tomo_makes/items/b3c60b10f7b25a0a5935)
- [(Oreilly)PythonDataScienceHandbook](https://colab.research.google.com/github/jakevdp/PythonDataScienceHandbook/blob/master/notebooks/Index.ipynb)

#ファイルの操作
## ファイルの閲覧や検索
ファイルをcatで表示すればよい。

```
!cat xxxx/yyyy/zzzz.py
```
検索も出来る。

```
!grep -rn xxxx yyyy
```
## ファイルの編集
ファイルを一度取り出して、書込みという形で編集できる。

```
!cat xxxx/yyyy/zzzz.py
```
書込みは以下の通りである。なお、`%%file`は、`%%writefile`の別名(エイリアス) である。

```
%%writefile xxxx/yyyy/zzzz.py
import xxx
xxx
```
#ディレクトリの操作
##ディレクトリを見る
元のディレクトリに戻る

```
%pwd
```
ディレクトリの移動履歴

```
%dhist
```

##ディレクトリを表示する移動する
ディレクトリの表示

```
%cd
```
ディレクトリの移動

```
%cd xxxxx
```

#マジックコマンド (magic command)
マジックコマンドのリストやマニュアルは、以下で見る事が出来る。
リスト

```
%lsmagic
```
マニュアル

```
%magic
```
#環境変数のチェックや変更
環境変数のチェック

```
%env
```
環境変数のパラメータ追加

```
%env PATH=xxxxx:yyyy:zzzz
```

#デバッグやプロファイリング
##デバッグ
pdbデバッガは、on/offで設定して使う。なお、Colabでは、gdb/cuda-gdb等使えるがそれは別記事で説明する。

```
%pdb on
```

```
%pdb off
```

ブレイクポイントは、Python3.6までは、以下のみ。

```
import pdb:pdb.set_trace()
```
Python3.7以降はその下（PEP553)も使える。

```
breakpoint()
```

##プロファイリング
以下の資料に詳しく書いてあるので説明は省略する。

- [(Python Data Science Handbook)Profiling and Timing Code](https://jakevdp.github.io/PythonDataScienceHandbook/01.07-timing-and-profiling.html) 

#参考資料
- [(IPython)Built-in magic commands](https://ipython.readthedocs.io/en/stable/interactive/magics.html)
- [(Colaboratory)Colaboratory へようこそ](https://colab.research.google.com/notebooks/welcome.ipynb)
- [Gerrit Gruben - Leveling up your Jupyter notebook skills](https://www.youtube.com/watch?v=b8g-8T0amuk)
    - [uberwach/leveling-up-jupyter](https://github.com/uberwach/leveling-up-jupyter) 
- [PEP 553 -- Built-in breakpoint()](https://www.python.org/dev/peps/pep-0553/)
  - [PEP 553 -- Built-in breakpoint()を試してみた](https://qiita.com/nakkun/items/62cc704af729893783f1)
- [(Python Data Science Handbook)Profiling and Timing Code](https://jakevdp.github.io/PythonDataScienceHandbook/01.07-timing-and-profiling.html)
スクラム開発の面白いところを書いてみる

お疲れ様です。

スクラム開発のプロジェクトに参画し
いろいろと面白いところ、メリット・デメリットが見えてきたので
少し書いてみたいと思います。

###1.前項　スクラム開発って何？
わかりやすくいうと、
「開発するものと時間を細かく区切って、システムを完成にまで導く」開発手法です。

例えばウォーターフォールの開発手法だと、
●ヶ月で詳細設計をかきあげて、●ヶ月で製造やって、●ヶ月でテストやって、と
製造のフェーズごとに区切られていますが
スクラム開発の場合、
1スプリント（チームによってスプリントの定義は異なりますが1～2周間が多いそう）
という定義の中で、設計・製造・テストを行う、ということになります。

それぞれ役割等々は下記のページを参考にしてください。
画像は下記ページの引用です。
![scrum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327430/7442abc5-3f0f-05d5-a033-cf1b728544cb.png)

https://www.ryuzee.com/contents/blog/7137


####2.スクラム開発の手法

スクラム開発の場合は1スプリントの中に「イベント」というものがあり
次スプリントの製造に向けた準備・見積もり→プロダクトバックログリファインメント（スプリントリファインメント）
終えたスプリントの振り返り→スプリントレトロスペクティブ
今スプリントの時間をどう使うかを考える→スプリントプランニング
というようなイベントが多くあります。

一週間で1スプリントに例えて説明すると
月曜日…スプリントプランニング
火曜日…イベントなし
水曜日…プロダクトバックログリファインメント
木曜日…イベントなし
金曜日…プロダクトオーナーのレビュー＆レトロスペクティブ

翌月曜日…スプリントプランニング
……
という細かい期間で開発していく、という手法になります。


この細かい期間で開発していくメリット・デメリットがあり、
メリット：時間を非常に意識する。
　　　　　→一週間でどれくらい時間が使えるのか、
　　　　　　一週間でどれくらい開発ができるのか
　　　　　　が見えやすいため、遅延が起きたかどうかの判断がしやすい。
　　　　　→そもそもプランが現実的なものかどうかも見える。

デメリット：イベントが多い
　　　　　→イベントのために使用しなくてはいけない時間が多いため
　　　　　　絶妙な塩梅が求められる。
　　　　　　仮にプランニングで十全なプランを設計しようとすると時間を要する。
　　　　　　が、予期せぬ自体が起こると崩れやすい。


20190618追記

肝心なこと書いてないことに気がついたので追追記

スクラムでは、上記のスプリントで作業の難易度、複雑さ、影響範囲に応じてポイントをつけます。

そのポイントを、スプリント毎に高めていく。ということで効率性を視覚化します。

つまり、
1スプリント目 5ポイント
２スプリント目 7ポイント

というように高めていくことで開発における生産性の指標を儲けます。

スクラムではこのチームの行ったポイントをベロシティと言います。
このポイント性はスクラム独特の考え方ですが、生産性が視覚化できるというのは非常に強力なツールと言えます。







####3.スクラム開発の面白いところ

######人間関係が出やすい。
もともとプログラマーはコミュニケーションを求められるところがありますが
特にスクラム開発は求められるところがあるなぁというのが所感です。

スプリントプランニングや、リファインメントのときに
「こういうふうにやったらいいのでは」と考えがぶつかりやすいのですが
うまくやる方法というのもいろいろ見えてきたりします
この人にはこう伝えたら伝わりやすいかなぁとか。
なのでチームで動きたい人には向いていると思います。

#####効率がいい
単純にこれは効率がいいところが多いなと思いました。
時間の区切りをつけることでウォーターフォールのように
仕様変更による無茶な労働時間等になりにくいなと思います。

このスプリントでは100時間使えるから、こうしましょう。
逆に割り込み対応入ったので100時間オーバーするからこの実装は無理だね。等。
理屈をもって説明できるため、このスプリントでは無理です
と実働部隊からも説明しやすいので~~PMに殺意を抱かなくて~~無用な争いをせずに済みます。
それでも納期はあるので、次のスプリントでどうやるか、
等々考えなくてはならないところはあるのですが…。


あとはこの部分の実装はこの人がやったら良いよね。
等々割り振りがしやすい。
それぞれ得意分野（フロント・サーバーサイド等）があるので
そこの持ち味を活かせる機会が多いし、覚えようと思えばいろいろ覚えられる。



一方でここからはデメリットになりやすいなぁと思うところ

#####チームガチャが発生する。
上で述べたように人間関係が出やすいので、
人と人との組み合わせによっては混沌とします。

例えば
・定時で帰りたい人VS残業してでもきれいに終わらせたい
・設計をしっかりしたい人VS設計はそこそこにしといて実装で取り返す人
・インデントや記法をしっかりしたい人VS雑な人
等々ありますが、人と人との相性なのでイカンともしがたいところがあるのが本音。
急な離脱等も影響範囲は大きいので負荷になる人は負荷になると思います。


#####意見を発さないと辛い
こちらも同様ですが、意思表示や理解できない箇所はキッチリ詰めないと
後々に響きます。スプリントプランニング等でも
この設計したらやばいな…と思うところは発して、
事前に潰さないと「時間の見積もり」が決まってしまった後に
直す工数が発生すると後々厳しくなります。発狂します。

なのでここはやばい。ここはOK等きっちり発信しないと
辛くなるため気をつけましょう。気をつけます。


####個人的な見解
非常に効率的な一方で、スクラム開発がうまく回ると
ポイントの奪い合いになるとのことですので、
何事もほどほどに。
RubyでNHK番組表APIを使ってキーワード監視

NHKの番組表APIを使って、興味のあるキーワードを含む番組情報を抽出して通知するプログラムを公開します。同じ記事を、誰かに使ってもらえればと思い、[僕のガジェット向けブログ](https://edgeknocker.blogspot.com/)にも上げているのですが、このAPIを使ったひとつのサンプルとして参考いただければとここに思い上げます。

コードはGitHUBのGistsに上げています。

＞ [smallmake/nhkkw.rb](https://gist.github.com/smallmake/af44ae48d918af909d156eb0af8e722c "smallmake/nhkkw.rb")
（QiitaではGistのembedはできないのでリンクです）

##コードの説明
コードの中の以下の各値を設定すればとりあえず動くはずです。

#####NHK_API_KEY
NHK番組表APIのサイトで、自分のアプリ用にAPIキー（Program List API）を生成して入手してください。APIキーは "doksoHhdwh8shPsd6dsJshdjsjhsmrhdw"（テキトー） みたいな感じの文字列です。ENV[] を使って環境変数から取るようにしています。

#####GMAIL_APP_USERNAME, GMAIL_APP_PASSWORD, GMAIL_ADDRESS
通知をgmailに送れるようにしています。
メール通知が不要な場合、つまり、例えばその都度手元で起動して表示される抽出結果を見るだけでよいなら、これらの変数は設定不要です。設定しなければメール送信しません。
（二段階認証にしている場合、別途アプリ用パスワードの取得が必要ですね）

#####REGION_CODE
住んでいる地域を示すコードを指定しなければなりません。NHKは地域毎に番組表が違う場合があるので、これは重要です。地域コードは下記URLのページの「area」欄を参照してください。

＞ [リクエストパラメータ area](http://api-portal.nhk.or.jp/doc-request#explain_area)

#####GENRE_CODES
これは番組のジャンル（バラエティ、情報番組、ドラマなど）を絞り込むためのパラメータなのですが、実はジャンルのコードがどのようになっているのかはNHKのAPIサイト自体には詳しい説明がなく、僕は下記のブログで簡潔に知ることができました。助かります。

＞ [テレビ番組ジャンル一覧 ゆるくつくる – stabuckyのブログ。](https://stabucky.com/wp/archives/6118)

分類が多いので、大分類を示す最初の2桁だけで絞り込むようにしています（ニュース/報道は1, スポーツは2 ですが、それぞれ 01, 02 と記述します）


#####KEYWORDS
自分の興味を示すキーワードを並べてください。番組情報に半角英数字は使っていないようなので「UFO」も全角で「ＵＦＯ」でなければなりません。


#####LOG_FILE
これは特に変更していただく必要はないと思います。ただし、このような名前のファイルが同じディレクトリ（フォルダ）に作られることを知っておいてください。プログラムに書き込みの権限も必要となります。

このファイルは、取得済み（通知済み）の番組を記憶しておくために使っています。そうしないと、プログラムが動くたびに通知済みの番組をその番組が終わるまでは何度も通知してしまうからです。

この記録は、プログラムの最後で、当日の前の日以前のから消去していますので、容量が増え続けるということはありません。


#####NHK_CHANNELS
抽出するTVチャンネルのコードと表示用の名前を設定します。NHK番組表APIはテレビだけでなくワンセグやラジオ放送も取得できます。コードと名前の対応一覧はNHK番組表APIサイトの下記のURLに「service」欄を参照してください。Rubyのhashで記述してください。

＞ [リクエストパラメータ service](http://api-portal.nhk.or.jp/doc-request#explain_service)

値の設定は以上です。

僕の場合は、これを自分のサーバーに設置してcrontabを設定して、毎朝8時5分に起動させています。以下のような設定ですね。

まず、シェル起動できるように

```
% chmod 755 nhkkw.rb
```
して、crontabでRuby環境を読み込んで起動するシェルスクリプトを nhkkw.sh を用意して

```
#!/bin/sh

cd /home/eijin
source ./.bash_profile
./nhkkw.rb > /dev/null 2>&1
```
で、

```
% chmod 755 nhkkw.sh
```
して、そして

```
% ctontab -e
```
で

```
5 8 * * * /home/eijin/nhkkw.sh
```
ですね。

以上です。

＞ [NHK番組表APIサイト](https://api-portal.nhk.or.jp/ja)
<img width="320" alt="NHK番組表APIサイト" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80250/2be1d34c-5bb3-5bbc-6c2d-bb850fc2cad8.png">
aws-vault で AssumeRole できるようにする。

# はじめに

[アホみたいなスクリプト](https://qiita.com/takat0-h0rikosh1/items/07dafd8e841d4650aa1d)作って AssumeRole してたんですが早く aws-vault 使えばよかったと後悔しました。

### aws-vault について

+ [aws-vault でアクセスキーを安全に](http://labs.septeni.co.jp/entry/2018/01/12/113000)
+ https://github.com/99designs/aws-vault

# Install

```
$ brew cask install aws-vault
```

# Assume するユーザーの Profile 追加

```
# ご自身のIAMユーザーの credentials を入力する
$ aws-vault add my-profile
Enter Access Key ID: ???
Enter Secret Access Key: ???
Added credentials to profile "my-profile" in vault

# 問題なければ ~/.aws/config に下記 が入力さるはず。
$ cat ~/.aws/config
[profile my-profile]
```

# AssumeRole の Profile を設定する

```sh
$ vim ~/.aws/config

[profile my-profile]

# 以下を追加する。
[profile my-role]
role_arn=arn:aws:iam::123456789:role/{{ Role Name }}
source_profile=my-profile
region=ap-northeast-1
```

# 動作確認

### aws-vault login

設定がうまく行っていればブラウザが開きコンソールにログインできるはずです。

```sh
$ aws-vault login my-profile
```

### aws-vault exec

`--` でコマンドをチェーンして一時認証情報を取得しリソースにアクセスします。

```sh
$ aws-vault exec my-profile -- aws sqs list-queues
{
    "QueueUrls": [
        ...
    ]
}
```

 試しに `env` コマンドを実行して `grep` してみると認証情報が環境変数に適用されていることがわかります。

```
$ aws-vault exec my-profile -- env | grep AWS
AWS_VAULT=my-profile
AWS_DEFAULT_REGION=ap-northeast-1
AWS_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=???
AWS_SECRET_ACCESS_KEY=???
AWS_SESSION_TOKEN=???
AWS_SECURITY_TOKEN=???
```

# 終わりに

aws-vault めっちゃ快適。
Ruby on Railsでのdevise導入手順



gemファイルに"devise"の記載

```ruby:Gemfile
gem 'devise'
```

bundelインストールする

```ruby:コマンドライン
$ bundle install
```

deviseのインストール

```ruby:コマンドライン
$ rails g devise:install
```


devise用のモデルを生成、モデル名はaccountとする

```ruby:コマンドライン
$ rails g devise account
```

マイグレーションを行う

```ruby:コマンドライン
$ rails db:migrate
```

コントローラーの作成

```ruby:コマンドライン
$ rails db:migrate
```

account用のviewを作成

```ruby:コマンドライン
$ rails g devise:views accounts
```

account用のcontrollerを作成

```ruby:コマンドライン
$ rails g devise:controllers accounts
```

ルーティングの設定
とりあえず、logins/indexをルートにする

```ruby:config/routes.rb
Rails.application.routes.draw do
  devise_for :accounts
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  root "logins#index" #ここを追加
end
```

ビュー関連の編集

```erb:app/views/layoutes/application.html.erb
<!DOCTYPE html>
<html>
  <head>
    <title>Login</title>
    <%= csrf_meta_tags %>
    <%= csp_meta_tag %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <h2><%= link_to "TOPに戻る",root_path %></h2> <!--追加-->
    <% if account_signed_in? %> <!--追加-->
    <h3><%= current_account.email %>さんでログイン中</h3> <!--追加-->
    <% end %>
    <ul>
    <li><%= link_to "新規登録する",new_account_registration_path %></li> <!--追加-->
    <li><%= link_to "ログインする",new_account_session_path %></li> <!--追加-->
    <li><%= link_to "ログアウトする",destroy_account_session_path,method: :delete %></li> <!--追加-->
    </ul>
    <%= yield %>
  </body>
</html>
```

account_signed_in?：ログイン中かどうか判断する。
ログイン中であれば、<%= current_account.email %>さんでログイン中 を実行

トップページで登録しているユーザー一覧を表示する


```erb:app/views/logins/index.html.erb
<ul>
<% Account.all.each do |account| %>
<li><%= account.email %></li>
<% end %>
</ul>
```

トップページはこんな感じです。

![スクリーンショット 2019-06-15 12.17.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420746/168cec3f-7cf1-b354-a4b8-2b6696c5a268.png)

新規登録画面はこんな感じです

![スクリーンショット 2019-06-15 12.17.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420746/078ca561-3341-a0f1-6467-f11d40091069.png)

ログイン画面はこんな感じです。

![スクリーンショット 2019-06-15 12.17.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420746/754da213-3222-001c-a549-a5b85b5007fe.png)

gemであるdeviseを使うと、こんな簡単に新規登録やログインの機能が実装できます。

## deviseで使用可能なメソッド一覧

[こちらの記事がとても参考になります](https://qiita.com/tobita0000/items/866de191635e6d74e392)
マルチスレッドで圧縮処理を高速化

# はじめに

最近のCPUやストレージは高速なので、zipコマンドで大きなファイルを圧縮するのにそれほどストレスを感じません。

ですが、大きなファイルが幾つもある時は、zipコマンドでアーカイブ&圧縮するのにそれなりに時間がかかると思います。
これは、zipコマンドではCPUのコア数やスレッド数に関わらず、「処理に使っているのは常に1コア」ということが原因だと思われます。

そこで、マルチスレッドを使って圧縮できる"pigz"を使うと、どの程度処理が高速化するのかを試してみました。


# 使用した環境

* OS：CentOS 6.10
* CPU：Core-i3 6100T（2コア4スレッド）
* メモリ：DDR4-8GB（4GB×2枚）
* SSD：NVMe 128GB

# 下準備

* 以下のスクリプトを実行して、100MBのファイルを10個作成します。
 * 10ファイル程度なら、ddコマンドを10回実行するのもありかもしれません...

```shell:mkfile.sh
#!/bin/sh

for i in {1..10}; do
  dd if=/dev/zero of=100M_$i.txt bs=1M count=100
done
```

# テスト方法

* 上記のコマンドで作成した10ファイルを、1つのファイルにまとめて圧縮する際の処理時間を計測しました。
* なお、zipコマンドは「アーカイブ」と「圧縮」の2つの機能を持っていますが、gzipコマンドとpigzコマンドは圧縮機能しか持っていないため、tarコマンドと併用しました。

```shell:zipを使った圧縮
[root@akagi zip_test2]# time zip 1G.zip *.txt
```
```shell:gzipを使った圧縮
[root@akagi zip_test2]# time tar c ./*.txt | gzip > 1G.tar.gz
```
```shell:pigzを使った圧縮
[root@akagi zip_test2]# time tar c ./*.txt | pigz > 1G.tar.gz
```

# テスト結果

* zipコマンドおよびgzipコマンドと比べて、pigzコマンドでは処理時間が約半分ほどになりました。
 * コア数の少ないCore-i3でこれだけの差が出るので、コア数の多いサーバー用CPUではさらに大きな差が付くと思われます。

|zipコマンド|gzipコマンド|pigzコマンド|
|---|---|---|
|0m5.903s|0m6.080s|0m3.239s|

# 補足

* 「-p」オプションを指定すると、pigzコマンドの実行時に使われるスレッド数を指定できます。
* 高速化したいけれども、CPUの全リソースを使われると困る...という時に便利だと思います。

```shell:4スレッドで圧縮する
[root@akagi zip_test2]# time tar c ./*.txt | pigz -p 4 > 1G.tar.gz
```
Python 文字列の操作

# 特定の文字をカウント

文字列中の特定の1文字を探す場合。

```python:count1.py
tokyo = 'toukyoutokkyokyokakakyokukyokakyokutyou'
print(tokyo.count('t')) #=> 3
print(tokyo.count('k')) #=> 12
print(tokyo.count('y')) #=> 7
print(tokyo.count('ky')) #=> 6
print(tokyo.count('kyo')) #=> 6
print(tokyo.count('kyou')) #=> 1
```

文字列から複数種類の文字が合計いくつ含まれているか探す場合。

```python:count2.py
tokyo = 'toukyoutokkyokyokakakyokukyokakyokutyou'
num = 0
for i in range(len(tokyo)):
    if('tky'.count(tokyo[i]) == 1):
        num+=1
print(num) #=> 22
```

文字列の中の特定の複数種の文字の内、連続したものの最大長。

```python:count3.py
tokyo = 'toukyoutokkyokyokakakyokukyokakyokutyou'
num = 0
for i in range(len(tokyo)):
    for j in range(i, len(tokyo)):
        if all('tky'.count(a) == 1 for a in tokyo[i : j + 1]):
            num = max(num, j - i + 1)
print(num) #=> 3
```


all_ドキュメント
https://docs.python.org/ja/3/library/functions.html#all
PythonでDICOM画像を扱う

# PythonでDICOM画像を扱う


研究で医療画像を扱うので、
忘れないように自分の備忘録として残しておきます。

# 表示

dicom ファイルには、とにかくたくさんの情報があります。
各pixelの値だけ必要な時は、`pixel_array` でデータを取得できます。

```.py
import pydicom
import dicom
import matplotlib.pyplot as pat


img = dicim.read_file('----filename----.dcm')
plt.imshow(img.pixel_array)
plt.show()
```

# メーカー名とスライスの厚さの取得

メーカー名を知りたい時は、`Manufacturer`
スライスの暑さは、`img[0x0018,0x0050]`

で取得できます。

```.py

import pydicom
import dicom
import matplotlib.pyplot as pat


img = dicim.read_file('----filename----.dcm')

print(img.Manufacturer)

print(img[0x0018,0x0050])
```
メッセージ系SNSへのダイレクトメッセージシェア機能まとめ

## 検証内容

- アプリがダウンロードされている場合、url scheme によってSNSを起動できるか
- 起動後にテキストとURLリンクがSNSのダイレクトメッセージでシェアできるか

## 結果

| SNS名 |  URL Scheme | アプリの起動ができるか |ダイレクトメッセージできるか |
|:---|:---:|:---:|:---|
|LINE |line://<br>https://line.me/R/ |○ |アプリ：○<br>web：△ユーザーによる選択が必要 |
|FB messanger |fb-messenger:// |○ |○（2019年8月14日まで） |
|What’s app |whatsapp:// |○ |× |
|KAKAO Talk |kakaolink:// |○ |○（未検証） |
|Wechat |ー |× |× |
|QQ |ー |× |× |
未検証の項目は後日更新させてください。

### LINE

- line://　で起動できます。
- 「LINEに送信されるテキストです」という文字列を送信するとします。
→エンコードします。「LINE%e3%81%ab%e9%80%81%e4%bf%a1%e3%81%95%e3%82%8c%e3%82%8b%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%81%a7%e3%81%99」

```html:sample
<a href="https://line.me/R/msg/text/?LINE%e3%81%ab%e9%80%81%e4%bf%a1%e3%81%95%e3%82%8c%e3%82%8b%e3%83%86%e3%82%ad%e3%82%b9%e3%83%88%e3%81%a7%e3%81%99">
  send to LINE
</a>
```

- Webの場合はユーザがLINEアプリ内で「トーク」を選択する必要があります。
- 参考
   - https://developers.line.biz/ja/docs/line-login/using-line-url-scheme/

### FB messanger

- fb-messenger:// で起動可能です。
- 2019年8月15日から、メッセンジャーアプリのアップデート版は、メッセンジャーSDKへの共有をサポートしなくなるそうです。
ユーザーは、自分のデバイスに組み込まれているネイティブの共有機能を使用することでMessengerとコンテンツを共有できます。
- 参考
   - https://developers.facebook.com/docs/sharing/messenger/web
   - https://developers.facebook.com/docs/messenger-platform/changelog/#20190610


### Whatsapp

- whatsapp:// で起動可能です。
- 以前は可能でしたが、最新版でテキストを送るか特定のチャットを開くためのURLスキームのサポートをやめました。今できることは、アプリを開く/連絡先ページに移動することだけです。
- 参考
   - https://apple.stackexchange.com/questions/232759/whatsapp-url-scheme

### KAKAO Talk

- kakaolink:// で起動可能です。
- http://www.kakaotalk.jp/link/  
上記の日本の公式サイトを読むとできそうですが、メンテされてないみたいですね。このドキュメントのとおりに使っても動きませんでした。
- SDKでAPIを呼び出すことで送信できそうです。（すみません、このAPIはまだ検証できてません）  https://developers.kakao.com/docs/js/kakaotalklink#%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%86%A1%EB%A7%81%ED%81%AC


### Wechat

- 以前は利用できましたが、2016年ごろから外部から開始されたURL Schemeリクエストのほとんどをブロックし、少数のホワイトリストに登録されたアプリケーション内の呼び出しのみを許可するように方針を変更したようです。
- 参考
   - https://spacekid.me/weixin-url-schemes/
   - https://stackoverflow.com/questions/45005036/is-there-any-method-to-share-text-from-mobile-web-to-wechat-by-sharing-button
   - https://stackoverflow.com/questions/35425553/how-do-i-link-to-wechat-from-a-webpage

### QQ

- 現在、url scheme は使用できません。
- api は公開されていますが、iOSでcallbackの使用をサポートされてません。
- 参考
   - https://open.mobile.qq.com/api/qzone/index#api:toQQ-iOS-5-7-Android-5-7-
デフォルトメンバ初期化子と初期化子リスト

C++11 から「デフォルトメンバ初期化子」というものができた。

デフォルトメンバ初期化子ってのは

```c++
class foo {
  some_type variable = default_value;
};
```

こういうの。`foo` のコンストラクタではなく、メンバ変数の宣言部に値を書くことができる。

私自身あまり使っていなかったんだけど、先日ふと存在を改めて認識して、使っていこうと思った。

思ったんだけど、じゃあ呼ばれる順序どうなっているの？　ということで、試してみた。

まあソースコードを。

```c++:hoge.cpp
// clang++ -std=c++11 -Wall hoge.cp
#include <iostream>

int foo(char const *title) {
  std::cout << title << "\n";
  return 0;
}

struct dtype {
  dtype() { std::cout << "dtype default-ctor\n"; }
  dtype(char const *label) { std::cout << "dtype " << label << "\n"; }
};

struct btype {
  btype() { std::cout << "btype default-ctor\n"; }
};

struct hoge {
  int a = foo("a");
  btype b;
  int c = foo("c");
  dtype d;
  int e = foo("e-decl");
  hoge()                  //
      : e(foo("e-ctor")), // warning: field 'e' will be initialized after field 'd'
        d("hoge ctor")    //
  {
    std::cout << "in hoge::hoge\n";
  }
};

int main() {
  hoge h;
  return 0;
}
```

メンバ変数は以下の通り：

|名前|宣言順|デフォ(略)子|初期化子リスト順|デフォルトctor|
|:-:|:-:|:-:|:-:|:-:|:-:|
|`a`|1|✅|||
|`b`|2|||✅|
|`c`|3|✅|||
|`d`|4||2||
|`e`|5|✅|1||

出力結果は下記の通り：

```text

a
btype default-ctor
c
dtype hoge ctor
e-ctor
in hoge::hoge
```

まあやる前からわかっていたけどそうなるよね。

で。

* 初期化方法がいろいろ混ざっていても、メンバ変数の宣言順に初期化される
* 初期化子リストにあるものは、初期化子リストのとおりに初期化される
* 初期化子リストにないものは、デフォルトメンバ初期化子の通りに初期化される
* デフォルトメンバ初期化子もなければ、デフォルトコンストラクタが呼ばれる

ということになっている。まあそうじゃないと困る。