OmniAICreator/Qiita-1.07M huggingface dataset:
markdown-mode のコードのシンタックスハイライトに Polymode を利用する

## 問題

Emacs で Markdown のドキュメントを書くときに `markdwn-mode` はとても便利なのですが、不満点の１つとしてコードのシンタックスハイライトがされない、という問題がありました。

解決する方法として検索すると、[markdown-mode でコードをシンタックスハイライトする] (https://qiita.com/ichiroc@github/items/4638cda35a94c30c2331) の記事では `mmm-mode` を使用していますが、何故か自分の環境ではうまく動きませんでした……。

そこでもう少し探してみると、[Polymodoe](https://github.com/polymode/polymode) というものがあり、使うと簡単に設定できました。

## 設定

[use-package](https://github.com/jwiegley/use-package) を使用する場合は以下のように設定できます。

```elisp
(use-package poly-markdown
  :ensure t
  :config
  (add-to-list 'auto-mode-alist '("\\.md" . poly-markdown-mode)))
```
これで、シンタックスハイライトされるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/49589/01eea5ba-9865-1d11-14ad-00144a4e6ef2.png)
Matplotlib 論文書くときに使ったやつメモ

# はじめに
論文を書くときにいろいろ調べたのですがまた書くときにまとめておくと楽なので
そのまとめです

# 参考
- https://qiita.com/rnhd/items/325d21621cfe9e553c17
- https://qiita.com/okadate/items/00227316187b60f861f5
- https://qiita.com/nishimuraatsushi/items/2df8542ebf97affa26fb

# グラフの文字系
ここがとにかく大変でした
普通times new romanを使うので
よく言われているこれでやると

```py
plt.rcParams['font.family'] = 'Times New Roman' #全体のフォントを設定
plt.rcParams["mathtext.fontset"] = "stix" 
plt.rcParams["font.size"] = 10
plt.rcParams['axes.linewidth'] = 1.0# 軸の線幅edge linewidth。囲みの太さ
plt.rcParams['axes.grid'] = True
```

この当たりかなと
でもこれだとうまくいかないときがあります
なんか太い文字になったりします


![image.png](https://qiita-image-store.s3.amazonaws.com/0/261584/e294491f-2e91-ca6f-288d-4c851d628d66.png)

なぞだったです
いろいろ調べた結果

```py
del matplotlib.font_manager.weight_dict['roman']
matplotlib.font_manager._rebuild()
```

これをimportしてるところにいれればうまくいくことが判明しました

![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/261584/9518831d-1afe-3b06-f1be-27eb12d94d82.png)

ちょっと論文の形っぽくなりますね

あとはラベルのところ
texの書き方にならっているらしいですが

```py
sample_fig = plt.figure()
sample_axis = sample_fig.add_subplot(111)

sample_axis.set_xlabel('$\it{x}$')
```

って書けばうまくいきます
斜体にするのはitが担ってくれています

ちなみにギリシャ文字等を使いたい時は

```py
sample_fig = plt.figure()
sample_axis = sample_fig.add_subplot(111)

sample_axis.set_xlabel('$\it{x}$')
sample_axis.set_ylabel(r'$\theta$ [rad]')
```

という感じでrをいれてください
こうすることで，r　\tが　関係ないよってことを指示してくれてます
たぶん\itのときもvisual codeで書いてると書き直してねって注意でるかもです

![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/261584/62444c43-545a-c8d7-9937-a58f834e9e23.png)

これでぽくなりました

# 目盛り系
## 目盛りを内側にいれる
さらにっぽくするにはメモリを内側にいれたいなってやつです

これはxtickをいじります

```py
plt.rcParams['xtick.direction'] = 'in'#x軸の目盛線
plt.rcParams['ytick.direction'] = 'in'#y軸の目盛線
```

![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/261584/56685c14-712d-9a6a-e9cc-cfe4bbb54254.png)

## 目盛りの数字をいじる

```py
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

# 前にself.axisを作成してください
self.axis.xaxis.set_major_formatter(FormatStrFormatter('%.2f'))
self.axis.yaxis.set_major_formatter(FormatStrFormatter('%.2f'))
```

これで0.01までの表示になります
0fとかにすると整数のみになります

## 目盛りの間隔をいじる

なんかあんまり使われてないですけど

```py
plt.yticks(np.arange(-2.0, 2.0, 0.5))
```

これで0.5ずつとかになります
xlimとかと併用すれば，目盛りを粗くできます

# グラフのサイズ系と保存
出力したやつを保存すると，なんかwindowサイズとかいじらないとでめんどくさいので
そういうときは
出力したうえで保存する

作成したタイミングで保存する

```py
sample_fig = plt.figure(figsize=(3, 3), dpi=50)# dpiは解像度

...

plt.savefig('sample_1.png'，dpi=50)# こっちのdpiは保存するときのやつ

```

これで保存される
ちなみにfigsizeの単位はインチらしいが

1インチ=2.54cm

だそうです
換算してやってみてください

以上で一通りはできそうです！
Apache CamelのDBコネクションプーリングにHikariCPを使ってみた

# Apache CamelのDBコネクションプーリングにHikariCPを使ってみた

コネクションプーリングはこれまでCommons DBCP2を使っていたのですが、HikariCPが高速だということで使ってみました。

まず、CamelContextのXMLにDataSourceを以下のように記述します。
以下の例はPostgreSQLのものになります。
connectionTimeout、idleTimeout等は設定しなくても使用できるのですが、使いそうなプロパティはデフォルト値で記述してみました。

```xml:pom.xml
	<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
		<property name="jdbcUrl" value="jdbc:postgresql://[IP]:5432/[DB]" />
		<property name="driverClassName" value="org.postgresql.Driver" />
		<property name="minimumIdle" value="1000" />
		<property name="maximumPoolSize" value="1000" />
		<property name="connectionTimeout" value="30000" />
		<property name="idleTimeout" value="600000" />
		<property name="maxLifetime" value="1800000" />
		<property name="username" value="[user]" />
		<property name="password" value="[password]" />
		<property name="connectionInitSql" value="SELECT 1" />
		<!-- <property name="connectionTestQuery" value="SELECT 1" />  --><!-- connectionTestQueryは非推奨 -->
		<property name="validationTimeout" value="5000" />
	</bean>

	<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"
		destroy-method="close">
		<constructor-arg ref="hikariConfig" />
	</bean>

	<bean id="sqlComponent" class="org.apache.camel.component.sql.SqlComponent">
		<property name="dataSource" ref="dataSource" />
	</bean>
```

SQLは別プロパティに記載しています。
sample_testテーブルにインサートするSQLのみです。

```sql.properties
sql.insertSql=insert into sample_test(val, count, insert_date) values (:#val, :#count, current_timestamp)
```

インサートするデータを作成するプロセッサは以下のとおり。
val, countの値をMapに格納しているだけです。

```java
    @Override
    public void process(Exchange exchange) throws Exception {
        Message message = exchange.getIn();
        String idx = message.getHeader("breadcrumbId", String.class);

        Map<String, Object> ret = new HashMap<String, Object>();
        ret.put("val", idx);
        ret.put("count", 0);
        message.setBody(ret);
    }
```

次に、propertyPlaceholderでさきほどのsql.propertiesを読み込んで、10秒ごとに1件のレコードをインサートしています。

```xml
		<propertyPlaceholder id="placeholder" location="classpath:sql.properties" />

		<route id="quartzTest">
			<from uri="quartz2://test/testTimer?cron=0/10+*+*+*+*+?" />
			<process ref="createData" />
			<to uri="sqlComponent:{{sql.insertSql}}" />
			<to uri="log:insertLog?showHeaders=true" />
		</route>
```

pom.xmlは主に以下の2つを追加しています。

```xml:pom.xml
		<dependency>
			<groupId>org.apache.camel</groupId>
			<artifactId>camel-sql</artifactId>
			<version>${camel.version}</version>
		</dependency>
		<dependency>
			<groupId>com.zaxxer</groupId>
			<artifactId>HikariCP</artifactId>
			<version>3.2.0</version>
		</dependency>
```

# おわり

思っていたよりも簡単に実装できました。SQLコンポーネントも初めて使ってみましたが、簡単な処理を書くだけならこの機能で十分だと思います。
Rust製のエディタをビルドするのに1時間ぐらいハマったのでメモしておく

Rust製のエディタに[Sodium](https://github.com/redox-os/sodium)があります。
これをビルドして勉強しようと思ったのですが、思った以上に手間取ったのでメモを残して置きます。


#環境
macOS 10.13.6 (17G65)
Homebrew 1.7.4-65-g2d8d412
cargo 1.29.0 (524a578d7 2018-08-05)

# 問題点
cargo buildでコケる。

エラーメッセージ

```shell
% > cargo build                                                                                                                                                                
   Compiling orbclient v0.3.17
error[E0554]: #![feature] may not be used on the stable release channel
 --> /Users/xxx/.cargo/registry/src/github.com-1ecc6299db9ec823/orbclient-0.3.17/src/lib.rs:3:1
  |
3 | #![feature(alloc)]
  | ^^^^^^^^^^^^^^^^^^

error[E0554]: #![feature] may not be used on the stable release channel
 --> /Users/xxx/.cargo/registry/src/github.com-1ecc6299db9ec823/orbclient-0.3.17/src/lib.rs:4:1
  |
4 | #![feature(asm)]
  | ^^^^^^^^^^^^^^^^

error[E0554]: #![feature] may not be used on the stable release channel
 --> /Users/xxx/.cargo/registry/src/github.com-1ecc6299db9ec823/orbclient-0.3.17/src/lib.rs:5:1
  |
5 | #![feature(const_fn)]
  | ^^^^^^^^^^^^^^^^^^^^^

error: aborting due to 3 previous errors

For more information about this error, try `rustc --explain E0554`.
error: Could not compile `orbclient`.
```

#解決方法
sdl2をインストール、cargoのバージョンをnightlyに変更。私はこれでbuildが通るようになりました。

```shell
> brew install sdl2
> rustup update
> rustup override set nightly
> rustup update nightly
```

この時点でcargoのバージョンは以下のようになっています。

```shell
> cargo -V
cargo 1.30.0-nightly (a5d829494 2018-09-13)
```
UnityAssetStoreのウェブページ上にある「Unityで開く」ボタンを押すとUnityエディターのアセットストアのタブが真っ白になる不具合の対処法

確認環境：
Windows10
Unity2018.2.7f1
他の環境で発生するかどうかわかりませんが、備忘録として。

この不具合はUnityエディターを起動中で、アセットストアのタブを開いていない状態でウェブページのアセットストアの「Unityで開く」ボタンを押すと発生するようです。

Unityエディターであらかじめアセットストアのタブを開いておくことで、この不具合が発生しなくなりました。

一度アセットストアタブが真っ白になってしまうと、タブを閉じてもう一度開いても真っ白なままなので、Unityエディターを再起動するしかなかったです。
at coder beginner 014

B
あなたは買い物をしていて，商品リストからいくつかの商品を選んだ．そして今，その商品の価格を合計しようとしている．
　ところで，とある集合の任意の部分集合を 2 進数を用いて表す方法が存在し，forループで全ての部分集合(組み合わせ)を列挙する際などに用いることができる．
n 個の商品があり， 商品0,商品1,..,商品n−1 があるとする．添字が0から始まることに注意せよ．
部分集合を表す 10 進整数を X とし，その 2 進 n 桁表現をbn−1bn−2…b1b0とする．b0 が最下位ビットで bn−1 が最上位ビットである．先頭の0 を許す表現であることに注意せよ．
そして，この整数 X の 2 進表現を用いて，ある部分集合を以下のように定義する．
b0=1 ならば集合は商品0 を含み，b0=0 ならば集合は商品 0 を含まない．
b1=1 ならば集合は商品1 を含み，b1=0 ならば集合は商品 1 を含まない．
...
bn−1=1 ならば集合は商品 n−1 を含み，bn−1=0 ならば集合は商品 n−1 を含まない．
例えば，n=4,X=5 のとき， b=0101 であり，部分集合は {商品0,商品2} である． 簡単にいえば，Xの 2 進表現において，k(0≦k≦n−1) 番目のビットが立っていれば k 番目のアイテムを含むということである．あるビットが立っているかどうかは，多くのプログラミング言語で容易に判定できるので，各自調べられたい．
　あなたの仕事は，商品の数，それぞれの商品の価格，そして部分集合を表す 10 進整数 X が与えられるので，部分集合に含まれる商品の価格を合計することである．
　※今回の問題には直接関係は無いが，部分集合を上記のように表現することで，大きさ n の集合の全ての部分集合(空集合を含む)を0 ～ 2n−1 の連続した整数で表現できるので，全列挙を行う際には応用するとよい．

いや問題文わかりにく、、
<< 左シフト演算子。

```
unsigned x=1u << 8;//1を8bit左シフトする。x=256
std::cout << "result:"<<x//標準出力にresult:256と出力
```

```
#include <iostream>
using namespace std;
int main() {
	int n, X;
	int a[21];
	int ans = 0;
	cin >> n >> X;
	for (int i = 0; i < n; ++i)cin >> a[i];
	for (int j = 0; j < n; ++j) {
		if (X &(1 << j))ans += a[j];
	}
	cout << ans << endl;
	return 0;
}
```
bitの使い方的な問題。おれもいうてちゃんとわかってない

C

```
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
#include<list>
#include<cmath>
#include<map>
using namespace std;
using ll = long long;
const int INF = 1e9;
#define rep(i,n)for(int i=0;i<n;++i)
#define p pair<int,int>
int main() {
	int N;
	cin >> N;
	int ans = 0;
	int imos[1000010];
	for (int i = 0; i < 1000010; ++i) {
		imos[i] = 0;
	}
	for (int i = 0; i < N; ++i) {
		int a, b;
		cin >> a >> b;
		imos[a]++;
		imos[b + 1]--;
	}
	for (int i = 0; i < 1000010; ++i) {
		if (i > 0) {
			imos[i] += imos[i - 1];
		}
	}
	for (int i = 0; i < 1000010; ++i) {
		ans = max(ans, imos[i]);
	}
	cout << ans << endl;
	return 0;
}
```
いもす法
ラズパイをディスプレイなしでsshだけでリモートセットアップする

ラズパイの初期セットアップにディスプレイやらキーボードを用意してするのが面倒なので、sshだけでセットアップする方法のメモです。

# 使用した環境
- Raspberry Pi 2 Model B
- Micro SDカード 32GB
- 有線LANケーブル(初回のWi-Fi設定が完了するまで)
- macOS High Sierra

## 使用しないもの
- ラズパイにディスプレイは接続しない
- ラズパイにキーボードもマウスも接続しない

#大まかな流れ
1. RASPBIANをSDカードに書き込む
2. sshを許可する
3. 有線LANでWi-Fi設定する
4. LANケーブルを抜いてラズパイをリブート

これで、Wi-Fi越しにsshできるようになる。

では始めます。

# ラズパイOSのダウンロード
RASPBIAN STRETCH WITH DESKTOPを使用。
https://www.raspberrypi.org/downloads/raspbian/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/77444/b51175dd-b69b-88ef-0acf-d860ea89db62.png)

ダウンロードしたzipを解凍するとimgが現れる。これをそのままSDカードにコピーしても認識されないので、イメージ書き込みソフト[etcher](https://etcher.io)を使って、SDカードに書き込む。

書き込みが完了するとSDカードが自動的にアンマウントされるので、もう一度SDカードを抜き差しして、マウントする。

SDカードのルートにsshという空ファイルを作成する。

```:macOS
$ touch /Volumes/boot/ssh
```

SDカードを取り外して、ラズパイに指す。
有線LANに接続したラズパイを起動する。（Wi-Fiにはまだ繋がらないので有線LANで）

1〜2分後で起動しているはずなので、macOSからsshする。

```:macOS
$ ssh pi@raspberrypi.local
```

パスワードを聞かれたら、`raspberry` で接続できるはず。

```:macOS
pi@raspberrypi.local's password: 
```

つながった。

```:Raspbian
pi@raspberrypi:~ $ 
```

###sshでけられたら
繰り返しラズパイをセットアップしていると、DNS名(pi@raspberrypi.local)とIPアドレスが違ってくるので、次のようなセキュリティ警告を受ける場合がある。

```:macOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```
この場合は、macOSに記録されているフィンガープリントを削除する。

```:macOS
$ ssh-keygen -R raspberrypi.local
# Host raspberrypi0.local found: line 3
/Users/hogeuser/.ssh/known_hosts updated.
Original contents retained as /Users/hogeuser/.ssh/known_hosts.old
```
これで有線LANでsshができるようになる。
参考：https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938

# Wi-Fiを有効にする
有線LANでsshできるようになったら、rasp-configを使って、Wi-FiのSSDIとパスフレーズを設定する。

```:Raspbian
$ sudo raspi-config
```
設定箇所は、メニューの「2 Network Options」 > 「N2 Wi-Fi」からたどっていく。画面にしたがってSSIDとパスワードを設定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/77444/fea9348d-2bdd-01a6-f04c-0b6334e4c2a6.png)

SSIDがわからないときはiwlistコマンドで確認できる。

```:Raspbian
sudo iwlist wlan0 scan | grep ESSID
```


LANケーブルを抜いて、ラズパイを再起動する。

```:Raspbian
$ sudo reboot
```
これで、Wi-Fi越しにsshできるようになる。
おしまい。
Debian Jessie以降でDockerをインストールする

Debian Jessie以降で下記コマンドを順に実行するとDockerがインストールできます。

詳細はこちらの[公式サイト](https://docs.docker.com/install/linux/docker-ce/debian/#install-docker-ce-1)を参照してください。


```
sudo apt-get update
sudo apt-get install      apt-transport-https      ca-certificates      curl      gnupg2      software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
# 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88で終わることを確認
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository    "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
# 動作確認
sudo docker run hello-world
```
Grafanaのメール設定で詰まった話

#Grafanaのメール設定で詰まった話

Grafanaでuser追加のためにメールを送信する必要が出てきました。ですが、それが一筋縄では行かなかったので共有します。

まずばデフォルトの状態でメールが送信できるか確認します。

画面左にあるメニューからAlerting→notification channelsを選択します。+NewChannelで送信テストの画面に移動します。
<img width="847" alt="スクリーンショット 2018-09-17 16.21.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/244155/1989302b-ed81-4704-f913-b21ff9034fb0.png">


その状態で送信先のメールアドレスを入力してSendTestボタンを押しましす。
SMTPの設定がうまく行ってない旨のエラーが出ますので、SMTPを設定していきます。

まずは設定ファイルの場所から。
自分はUbuntuでgrafanaを使っているので、UbuntuとGmailで説明していきます。


/etc/grafana/
の中の
grafana.ini
が設定ファイルです。
個人的にviエディタが好みなので、
`$ sudo vi /etc/grafana/grafana.ini`
で入っていきます。
iで入力モードに入っていきます。
設定ファイルの中の[smtp]を設定します。

```
enabled = true
host = smtp.gmail.com:587
user = example0@gmail.com
＃ If the password contains ＃ or ; you have to wrap it with trippel quotes. Ex """＃password;"""
password = example's pass
;cert_file =
;key_file =
skip_verify = false
from_address = example@gmail.com
from_name = Grafana
```


hostのポート設定はTLSなら587、SSLなら465が推奨されていますので、推奨に従います。

ここからがハマりポイントです（少なくとも自分はハマりました）、passwordの設定が少しだけ癖があります。
基本的にはGmailのパスワードを書くのですが、普段使っているパスワードとは別に発行する必要があります。
まずはGmailのパスワードを二段階認証にする必要があります。
改めて説明の必要はないと思いますがGmailの設定からお好きな方法で認証してください。[ここのページから設定できます。](https://myaccount.google.com/)
自分はスマートホンを使っていないので、SMSで認証しました。
認証が済んだら、アプリケーション用のパスワードを発行します。１６桁のパスワードが発行されますので、grafana.iniの

```
trippel quotes. Ex """＃password;"""
password = example's pass
```
example's passの部分に入力します。
escで入力モードから抜けて
`:wq`
で上書き終了します。
`sudo service grafana-server restart`
を入力してgrafanaを再起動することでメールを送信できるようになっています。

ユーザーを追加する方法はこちらを参考にしました。
いんふら女子めも
https://akng-engineer.hatenablog.com/entry/2019/08/14/170157
sublime text3 で構文エラーチェックを行いたかった時の覚書

##Sublime Linterが使える
こんな感じで教えてくれます。
警告の色とかもセッティングで変えられるようです。

<img width="217" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63911/384357c6-5673-736b-d891-0d939649c079.png">
<img width="255" alt="キャプチャ2.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/63911/54d7cc21-e632-398a-b4cf-6bc8507c52bc.png">


##インストールに必要な４つのこと
この記事を参考にして入れてみました。
[Sublime Text3で構文エラーをチェックするプラグインが超絶便利](https://liginc.co.jp/web/js/73704)


###1.Package ControlからSublimeLinterをインストール
Ctrl+Shift+P(MacはCommand)でPackage Controlを開きます。
「<b>Install</b>」と入力して、「<b>Package Control: Install Package</b>」 を選択。

続いて「<b>SublimeLinter</b>」と入力して、選択し、インストールします。


###2.使いたい言語のプラグインをPackage Controlからインストール

>
Javascript：「<b>SublimeLinter-jshint</b>」
Python：「<b>SublimeLinter-flake8</b>」
引用：[Sublime Text3で構文エラーをチェックするプラグインが超絶便利](https://liginc.co.jp/web/js/73704)
※PHPのやり方も元記事に載ってました。ここでは試していないので割愛。

先ほどと同様の手順で「<b>SublimeLinter</b>」と入力する場面で、
使いたい言語のプラグインの名前を入力してください。


###3.別途それぞれの言語のプラグインを導入する
コマンドプロンプトなどで導入してください。

<b>Javascript</b>

```
npm install -g jshint
```


<b>Python</b>

```
pip install flake8
```
>引用：[Sublime Text3で構文エラーをチェックするプラグインが超絶便利](https://liginc.co.jp/web/js/73704)

###4.Sublime Text上での設定
最後にセッティングを行います。
こちらの記事を参考にするのが良いと思います。
(2018/09/17現在)
[SublimeLinterがVer.4になって動かなくなったので対応したよ](https://qiita.com/clustfe/items/8e8f2f433b68d0d7ae78)


####現在のバージョンはver.4
検索してみると他にも様々な記事が上がっていますが、
コピペしてみると、どれもエラーになってしまうようです。

バージョンアップによる書き方の大幅な変更が原因のようですね。




以上です。
最後まで読んでくださりありがとうございました。
Laravel+FontAwesomeの使い方

# Laravel+FontAwesomeの使い方

## バージョン

* Laravel: 5.6
* node: v8.11.4
* npm: 5.6.0
* fontawesome-free: 5.3.1

## 前提条件

* Laravelのセットアップが完了していること
* `npm install`でjavascriptの初期パッケージがインストール済みであること

参考: https://readouble.com/laravel/5.6/ja/mix.html

## FontAwesomeのインストール

npmでインストールします

```
cd /path/to/laravel-project
npm install @fortawesome/fontawesome-free --save-dev
```

## Webpackの設定

```css:resouces/assets/sass/app.scss
// Font Awesome
@import '~@fortawesome/fontawesome-free/scss/fontawesome';
@import '~@fortawesome/fontawesome-free/scss/solid';
@import '~@fortawesome/fontawesome-free/scss/regular';
@import '~@fortawesome/fontawesome-free/scss/brands';
```
solid, regular, brands は必要なものだけでもOK

## アセットコンパイル

```
npm run dev
```
## 使用方法

下記のサイトで適当なアイコンを探してテンプレートに張り付ける
https://fontawesome.com/icons?d=gallery

```html:*.blade.php
<i class="fas fa-check"></i>
```
ActiveAdminで独自Actionを作る

ActiveAdminでとあるリソースに対して独自のActionを定義したいときに見る

### 定義
UserにActionを定義したいとき

``` app/admin/users.rb
member_action :new_action, method: :post do
    # なんらかのresouceに対する操作
  end
end
```

`method:`は適宜

### 定義したActionを呼び出す項目を作る
`action:` をHashで渡さないと`method:`がgetメソッドのparamsに化ける。
https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

``` app/admin/users.rb
action_item :view, only: :show do
  link_to 'Action', { action: :new_action }, method: :post
end
```
Safariでdeleteキーで戻る

commadn+←とか、command+[で戻るのはちょっと面倒。deleteキーで戻れるようにする方法の自分メモ。

追記(2019/8)：現在この方法では設定できなくなっています。macOSのアップデートで塞がれた可能性が高いです。（人類はdeleteキーで戻ることはあきらめたほうがいいのかもしれません）

## 設定方法
ターミナルを開いて設定。Safariを再起動すると有効になる。

```
defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2BackspaceKeyNavigationEnabled -bool yes
```

戻に戻す場合

```
defaults delete com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2BackspaceKeyNavigationEnabled
```

## おまけ
Chromeは拡張機能の[Go Back With Backspace](https://chrome.google.com/webstore/detail/go-back-with-backspace/eekailopagacbcdloonjhbiecobagjci)でOK。ちなみに提供元は本家のGoogleというのが奥ゆかしい。
PHP sort 関数

#sort()#
要素の値でソートを行う。
**配列に元々あったキーは初期化されるためキーが元々から数値の配列に使うのがベスト。連想配列には向かないかと。**

```
$array = ['apple', 'cherry', 'peach', 'banana'];
sort($array);
var_dump($array);
//array(4) { [0]=> string(5) "apple" [1]=> string(6) "banana" [2]=> string(6) "cherry" [3]=> string(5) "peach" }
```
※連想配列で用いた例
テストの点数を悪い順に並べる事ってそうないと思いますけど:sweat:

```
$array = ['math' => '70', 'science' => '90', 'history' => '10'];
sort($array);
var_dump($array);
//array(3) { [0]=> string(2) "10" [1]=> string(2) "70" [2]=> string(2) "90" }
```

![Quits.png](https://qiita-image-store.s3.amazonaws.com/0/264641/a6c0ef6b-b845-2a2a-cad5-361f609d5090.png)

#asort()#
sort関数ではソート時にキーが初期化されたが、asort関数は
**ソートしてもキーと値の関係を保つことができる。**

```
$array = ['math' => '70', 'science' => '90', 'history' => '10'];
asort($array)
var_dump($array);
//array(3) { ["history"]=> string(2) "10" ["math"]=> string(2) "70" ["science"]=> string(2) "90" }
```

#ksort()#
ksort関数は**キーを基準に配列をソートする。**
また**キーと値の関係を保つことができる。**

```
$array = ['lisa' => '420', 'clark' => '350', 'alex' => '480'];
ksort($array);
var_dump($array);
//array(3) { ["alex"]=> string(3) "480" ["clark"]=> string(3) "350" ["lisa"]=> string(3) "420" }
```
キーを基準とするため、連想配列の場合役に立つが通常の配列の場合、キーは元々0、1、2..と割り振られているため活用できる瞬間があまりないように思う。

```
$array = ['a', 'b', 'c'];
var_dump($array); 
//array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" } 
//ksort関数を使ったあともう一度var_dumpしてみる。
ksort($array);
var_dump($array);
//array(3) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" }
//もとから０スタートの昇順キーが振られるため活用できていない。
```

#降順#
降順の場合sort関数系の's'の前に'r'をつけてあげる
つまり
sortの降順  = rsort
asortの降順 = arsort
ksortの降順 = krsort
となる 。
Pythonの日常

# 碧落 #

毎日色々面白いことを試している。

### コードレシピ ###

* openpyxlでExcel編集

   会社でよく使われるExcelを自動で編集する。特に、同じ内容を複数の定型ファイルに更新するときに有効であろう。Excelはいいツールだが、各会社のフォーマットがそれぞれ違う。とはいえ、各社内部のフォーマットはある程度統一されたので、編集用スクリプトを作れば、何回も使われる。長期的に時間の節約はできるだろう。

```python
import openpyxl
wb = openpyxl.load_workbook(path)
ws = wb["Sheet1"]
ws["A1"].value = "X"
wb.save(path)
```

* OWASP ZAP 2.7でセキュリティ診断

   インジェクションなど脅威はシンプルで診断できる。
   サンプルは[ここ](https://github.com/zaproxy/zaproxy/wiki/ApiPython)

```python
import time
from zapv2 import ZAPv2
target = 'http://127.0.0.1:8080'
zap = ZAPv2(apikey=apikey)
scanid = zap.ascan.scan(target)
while (int(zap.ascan.status(scanid)) < 100):
    print 'Scan progress %: ' + zap.ascan.status(scanid)
    time.sleep(5)

```

* Seleniumよく使うメソッド

   ブラウザ自動操作で、退屈な事務作業を減らせよう。

~~~python
from selenium import webdriver
browser = webdriver.Ie() #他のブラウザも同様

browser.back()
browser.forward()
browser.refresh()
browser.current_url
browser.title
browser.page_source
browser.close()
browser.quit()

browser.find_element_by_class_name
browser.find_element_by_id
browser.find_element_by_xpath
element.click()
element.get_attribute("value")
~~~

### zap & selenium & openpyxl  ###

環境:

    Windows 10 64bit
    Excel 2013
    OWASP ZAP 2.7
    Selenium 3.14.0
    EasyBuggy 1.3.9
    IE11

設定:

[参照元(英語)](https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver#required-configuration)
    
    インターネット オプション

        セキュリティタブの「インターネット」「ローカル イントラネット」「信頼済みサイト」「制限付きサイト」の保護モードを同じ設定値にする。
        （全てオンまたはすべてオフ）
        
        詳細設定タブの「拡張保護モードを有効にする*」をオフにする
    
    Windows10 設定 -> ディスプレイ -> 拡大縮小とレイアウト -> 100%にする

    以下のレジストリキー追加(あれば不要)
    HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE
    サブキー iexplore.exe DWORD 0

~~~python
# seleinum で画面キャプチャーを撮って、Excelに保存
import os
from io import BytesIO
from selenium import webdriver
from PIL import Image as pillowImage
import openpyxl
from openpyxl.drawing.image import Image as pyxlImage

ieDriverPath = r"\IEDriverServer.exe" # IE Driver のパス
browser = webdriver.Ie(ieDriverPath)

browser.get("http://www.google.co.jp") # Googleを開いて、pythonを検索
textbox = browser.find_element_by_name('q')
textbox.send_keys('python')
textbox.submit()

screenShot = browser.get_screenshot_as_png() # 画面キャプチャーを撮る
im = pillowImage.open(BytesIO(screenShot))
img = pyxlImage(im)

wb = openpyxl.load_workbook(filename='test1.xlsx') # Excelテンプレート(空ファイル)
ws = wb["Sheet1"]
ws.add_image(img,'D3')
wb.save("test3.xlsx")
~~~

### ライブラリ インストール ###

~~~dos
# python 3.7
python -m pip install --upgrade pip
pip install numpy
pip install pandas
pip install scipy
pip install requests
pip install selenium
pip install openpyxl
pip install pillow
pip install pyautogui
pip install python-owasp-zap-v2.4
pip install pywin32
pip install wmi
~~~

~~~dos
# python 3.6.5
pip install tensorflow
~~~

### その他 ###

* IP設定

   頻繁にIP切り替えが必要な時に有効

~~~dos
netsh interface ip set address [interface name] static [ip] [subnet mask] [gateway]

netsh interface ip set address "イーサネット" static 192.168.100.100 255.255.255.0 192.168.100.1
~~~
Elm版Storybookリリースしました！

# Elm版Storybook, Bibliopolaを作りました！

[Storybook](https://storybook.js.org/)は使ったことありますか？残念ながらわたしはStorybook自体を使ったことはないんですが、Elmで似たようなツールを使ってUI駆動で開発を進めるのが結構いい感じだったので自分用にツールを作ってみました。

`view`を書いたファイルにBibliopolaのmainを書くとその1ファイルだけで使えるツールです

[document](https://package.elm-lang.org/packages/miyamoen/bibliopola/latest/)
![Bibliopola demo](https://qiita-image-store.s3.amazonaws.com/0/74093/0712e28c-9b71-f68c-a1e4-a031f2973cfd.png)

## 特徴

- pure Elm
    - `elm install miyamoen/bibliopola`
    - Elmソースコードに直接Bibliopola用のmain書いて`elm reactor`で開くだけ
- 1ファイルで始めれる
- [elm-ui](https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/)を使っている
    - Bibliopolaを使う人がelm-uiを使う必要はないんですが、ちょっとAPI足りない

## 使い方

See [examples](https://github.com/miyamoen/bibliopola/tree/master/examples).

```HelloYou.elm
module Hello exposing (book, view)

import Bibliopola exposing (..)
import Bibliopola.Story as Story
import Element exposing (Element, text)


view : String -> Element msg
view name =
    text <| "Hello, " ++ name


book : Book
book =
    intoBook "HelloYou" identity view -- : IntoBook msg (String -> Element msg)
        |> addStory (Story.build "name" identity [ "spam", "egg", "ham" ]) -- : IntoBook msg (Element msg)
        |> buildBook -- : Book
        -- |> withFrontCover (view "Bibliopola") -- Add first view of Book


main : Bibliopola.Program
main =
    fromBook book
```

`Book` typeはviewを持ってて、引数の`Story`渡して作ります。`Book`から`Program`が作れるのでそれをコンパイルすればBibliopolaが動く感じです

Atomic Design的にUIを各ファイルに分けているのなら、それぞれのファイルにbookとmainを書いておけば`elm reactor`で実際のviewを引数を変えながらみることができます

Elmでは引数の型も指定されているし、同じファイルに書くことでメンテナンスされないということもないのでそれなりに楽に使えるかな、と思っています

### Shelf

Shelf型もあって作ったbookをまとめて一覧にしたいときはこれを使います

上に貼ったdemoの左にあるファイルツリーがShelfです

## elm-ui以外で使う

elm-cssや普通のcssファイルの読み込みについては特にサポートしてません。Bibliopolaは普通のElmアプリケーションになるので自分でビルド作っていただければ…

基本的にelm-uiで使う想定です

## 終わりに

宣伝ですが、elm-jpでは毎週[オンラインでもくもく会](https://elm-jp.connpass.com/)をやっていたり、ガイドの翻訳をしたりしています

よかったら[ここ](https://scrapbox.io/elm-jp/Elm%E3%81%AA%E3%82%93%E3%81%8B%E4%BD%9C%E3%82%8D%E3%81%86%E4%BC%9A)からDiscordに参加してみてください

不具合とか提案とか聞きたいこととかあったらdiscordでも[twitter](https://twitter.com/miyamo_madoka)でもいいので聞いてください。よろしくお願いします
Raspberry Pi 3B (3B+)にWindows10（Arm64、Not IoT）をインストール

WoA Installerを使用して、Windows10をSDカードにデプロイする。
https://github.com/SuperJMN/WoA-Installer
https://github.com/SuperJMN/WoA-Installer/blob/master/Docs/Raspberry.md

- Windows10 iso (arm64)の取得

https://uup.rg-adguard.net/

![iso.png](https://qiita-image-store.s3.amazonaws.com/0/200022/28494d7a-9c44-99a6-4d67-5b199a308aa2.png)

のように設定し(x86ではなく、arm64用を指定すること)、右のリンクからZipファイルを取得する。
ファイルを解凍し、コマンドプロンプトからcreatingISO.cmdを実行する。
一時間半ほど待つとisoファイルができる。

- WoA installerの実行

https://github.com/SuperJMN/WoA-Installer/releases

からRaspberry Pi用のZipファイルを取得、解凍する。

Core Packagesをあらかじめ

https://onedrive.live.com/?authkey=%21AAg1P7lDOqOnZ9g&id=C8B0DBB75540E8D5%211189489&cid=C8B0DBB75540E8D5

からダウンロードしておく。こちらは解凍しない。

解凍したWoA installerのパッケージから、Installer.Raspberry.Application.exe
を実行する。

![top.png](https://qiita-image-store.s3.amazonaws.com/0/200022/9c1ae332-6412-24d3-5dc1-6a15fa1a056d.png)

Advancedをクリックし、Core PackagesのZipファイルをimportする。

![advanced.png](https://qiita-image-store.s3.amazonaws.com/0/200022/b8881a6c-3508-ef5d-e628-77cb34940d3b.png)

Installer.wimが先ほどのisoファイルの中にあるので、isoファイルをダブルクリックしてマウントし、WoA Installerからこれを指定する。
D:\sources\Installer.wim

SDカードを挿入し、デプロイをクリック。一時間半ほど待つとSDカードにWindows10がデプロイされる。

- Raspberry Piで実行

ブート時はUSBポートには何もつながない（電源のMicroUSBはつないでよい）。
一回目のブートは（結構長い）、ブルースクリーンで失敗するはず（これでよい）。
ほおっておくと再起動する。このとき、セットアップ画面に入るまで
USBポートにキーボードやマウスをつながないこと。

あとは画面の指示に従って設定項目を入力。

インストール後も、ブート時はUSBポートには何もつながない。
ブートが完了してからキーボードやマウスをつなぐこと。

二分程度でブート完了する。意外に早い。
Insider Previewのイメージ（Build 18237）では起動しなかった。
WiFiはつながらない。
有線も繋がらない。
Gnome Terminalのフォントを変更する方法

**Ubuntu20.04でも確認済み**

Ubuntu18.04のGnome Terminalのデフォルト以外のフォントを選択する方法です。
ネットの情報は古かったり、動かなかったりするので自分の備忘録を兼ねてメモしておく。
Cicaフォント（おすすめ）を設定します。
https://github.com/miiton/Cica

``` bash
UUID=$(gsettings get org.gnome.Terminal.ProfilesList default | tr -d \')
gsettings set org.gnome.Terminal.Legacy.Profile:/org/gnome/terminal/legacy/profiles:/:${UUID}/ font "Cica 15"
```


- gsettings get org.gnome.Terminal.ProfilesList `default`　のdefaultがプロファイル名。
- gsettings set org.gnome.Terminal.Legacy.Profile:/org/gnome/terminal/legacy/profiles:/:${UUID}/ font `"Cica 15"`　がフォント名。

Boldの場合はこちら

``` bash
UUID=$(gsettings get org.gnome.Terminal.ProfilesList default | tr -d \')
    gsettings set org.gnome.Terminal.Legacy.Profile:/org/gnome/terminal/legacy/profiles:/:${UUID}/ font "Cica Bold 15"
```

- 2019/10/19 現在も有効
「かな入力」キー配置のカスタマイズがしたい（腱鞘炎にならないためにも）

　私は日本語入力に「かな入力」を使っています。
　タッチ・タイピングで入力したとき、「かな入力」は、右手小指に負担がかかるキー配置になっています。
　
　実に、以下の16種類を右手小指が担当しなければいけません。
　　　　を
　　　　わ
　　　　せ
　　　　れ
　　　　め
　　　　ほ
　　　　け
　　　　ろ
　　　　へ
　　　　む
　　　　ー
　　　　「
　　　　」
　　　　・
　　　　（濁音）
　　　　（半濁音）
　その上、Enterキーと、右Shiftキー、右Ctrlキーも右手小指で押すことが多いでしょう。

　仕方のないことだと諦めていたのですが、キー配置を変えてみては？という考えが湧いてきました。

　変更するのは、下記の5種類です。
　　　　（濁音）
　　　　（半濁音）
　　　　ほ
　　　　ろ
　　　　ー
　変更先は、以下の場所です。
　　　　（濁音）　→　Tabキー
　　　　（半濁音）　→　Tabキー2回
　　　　ほ　→　Shift + は
　　　　ろ　→　Shift + ら
　　　　ー　→　Shift + な


###【理由】
　なぜ、変更先をこの場所に選んだのかと言うと、
　一番の理由は覚えやすさです。
　（濁音）、（半濁音）は、右手小指が左手小指に変わった。
　「ほ」、「ろ」は、Shift+「あ行」押下で「お行」です。
　「ー」は、規則性がないですが、右人差し指が普段置いてある位置（「な」キー）を選びました。
　そして、今ある配置はそのまま置いておくので、一般的な「かな入力」でも入力ができます。

　
###【なぜ投稿したの？】
　私は日本語入力にfcitx-mozcを使っています。
　googleで検索してみましたが、「かな入力」をカスタマイズする方法は見つかりませんでした。
　ソースコードをダウンロードして探してみましたが、それらしき設定ファイルはありませんでした。
　私がやろうとしていることは、単純なことですが、ソースコードを解析して対象箇所を見つけるとなれば、かなりの日数が掛かります。
　この投稿が詳しい人の目に留まり、足掛かり的なコメントをいただけると助かると考えました。


###【私だけなのでしょうか？】
　同じ日本語文章を入力したとき、「かな入力」の方が「ローマ字入力」より鍵打回数が少なくて済みます。なので、あえて「かな入力」を使っている方も居ると思います。長時間、日本語入力を行っていると右手手首の筋が痛くなるのは私だけなのでしょうか？
GKE試行（その6：「StackdriverLoggingでログレベル別にログ表示」）

# お題
[前回](https://qiita.com/sky0621/items/aadeb53a5be2800066de)、GKE上でのアプリ公開まで出来た。
その際、StackdriverLoggingでアプリが標準出力に吐いたログも確認してみたわけだけど、一応、ログレベル別の表記ができることも確認してみたい。
というわけで、[アプリを改修](https://github.com/sky0621/go-webapi-for-gke-study/commit/538150ab35780ceb767c65cf9f13d1964f65a7b1)して、例えば警告レベル、エラーレベルのログも出るようにしてみた。

# 環境
[前回](https://qiita.com/sky0621/items/2faf4f7e6b2c9b269945#環境)と同じ。

<pre>
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"9", GitVersion:"v1.9.7", GitCommit:"dd5e1a2978fd0b97d9b78e1564398aeea7e7fe92", GitTreeState:"clean", BuildDate:"2018-04-19T00:05:56Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"9+", GitVersion:"v1.9.7-gke.6", GitCommit:"9b635efce81582e1da13b35a7aa539c0ccb32987", GitTreeState:"clean", BuildDate:"2018-08-16T21:33:47Z", GoVersion:"go1.9.3b4", Compiler:"gc", Platform:"linux/amd64"}
</pre>

# 前提
- 自前でGCPプロジェクトは契約済み
- gcloudをローカルで使える状態になっている

# 実践
アプリ修正してCloud Buildで再ビルドしてGCRから再デプロイして、再度、サービス公開。
で、アクセスしてStackdriverLoggingでログ確認してみると。。。
![17.png](https://qiita-image-store.s3.amazonaws.com/0/180599/3e94ae47-e1ea-b0e7-90c0-58803d6f3293.png)

うん、Infoレベルと異なる表記（警告は「！」、エラーは「！！」）になっており、severityも"WARNING"、"ERROR"になっているのでフィルタリングもできる。
Eclipseでデバッグするには

# Eclipseでデバッグするには #

 動作を確認したい行の行番号をダブルクリックして●印をつけます。
（●印：「ブレークポイント」といいます）
![debug1.png](https://qiita-image-store.s3.amazonaws.com/0/289322/2b25bb5f-7552-eced-f70c-c4cb70f05992.png)

 「実行」メニューの「デバッグ」を選択するか、ツールバーの「デバッグ」をクリックすると、デバッグ作業が始まります。
パースペクティブはデバッグ用に切り替えます。
![debug2.png](https://qiita-image-store.s3.amazonaws.com/0/289322/0ed1c072-3315-01d3-1536-c8c8a8e8f18a.png)

①行番号に●印をつけた行では、実行前にいったん停止します。
②変数の値や実行順などを確認しましょう。
③ツールバーの「再開」をクリックすると実行を続けます。
④全部の行の確認が終わったら、パースペクティブを「Java」に切り替えましょう。
![debug3.png](https://qiita-image-store.s3.amazonaws.com/0/289322/1974fc79-c882-5b35-795e-484f9e6ead06.png)
isuconでよく使うツールをまとめてみた

昨年のisucon7に続いて、今年もisucon8の予選に参戦した kopug です。
結果は…アレですが、非常に今回も楽しまさせて頂きました。
運営の皆様本当にお疲れ様でした。そしてありがとうございました！

さて、今回はisuconでサクッと使えて、便利なツールたちをまとめてみます。

## [netdata](http://my-netdata.io/)
![netdata](https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2016/08/netdata_dashboard.gif)

### Install
```bash:
$ bash <(curl -Ss https://my-netdata.io/kickstart.sh)
$ sudo systemctl start netdata
```

常に外部モニタで写して状況を確認できるようにしていました。System Overview みて違和感を感じたら詳細を見るみたいな。

## [dstat](http://dag.wiee.rs/home-made/dstat/)
![dstat](https://www.opsdash.com/blog/images/disk-monitoring-dstat.gif)

ある程度当たりをつけて負荷計測 -> 設定 or コード変更をしているときには、netdataではなく dstatを使ってます。

## [Siege](https://www.joedog.org/siege-home/)
```
$ siege -c 300 -t 10S -b -i --log=/tmp/siege.log -f ./urls.txt

Lifting the server siege...
Transactions:                    439 hits
Availability:                 100.00 %
Elapsed time:                   9.83 secs
Data transferred:              58.21 MB
Response time:                  2.05 secs
Transaction rate:              44.66 trans/sec
Throughput:                     5.92 MB/sec
Concurrency:                   91.35
Successful transactions:         446
Failed transactions:               0
Longest transaction:            6.76
Shortest transaction:           0.00

LOG FILE: /tmp/siege.log
You can disable this log file notification by editing
/home/vagrant/.siege/siege.conf and changing 'show-logfile' to false.
```

ab(Apache Bench)に似ていますが、これは複数URLに対して実行ができます。POSTやcookie等も渡せるので、isuconで毎回Portalのベンチマークを実行するにはちょっと待ち時間がかかるので、あたりが付いているときは、これで局所的にベンチをかけて調整をしました。

## [Kataribe](https://github.com/matsuu/kataribe)

Apache/Nginx/H2O/Varnishncsa 等で使えるLog Profilerです。
今回はH2Oだったので、READMEに書いてあるとおりにLogFormatを変更して使いました。
Portalのベンチマークを動かしたらまずはこれで確認をする流れを作っています。

## [pt-query-digest](https://www.percona.com/doc/percona-toolkit/LATEST/pt-query-digest.html)

MySQL の SlowQuery をこれで発見することができます。何が嬉しいかというと slowlogを吐かなくても tcpdumpの結果から解析をすることもできるので、
一時的に見るのが手軽でいいですね

* [pt-query-digestによるパフォーマンス測定](https://tech.studyplus.co.jp/entry/2018/05/14/120029)

## 最後に

今回 isucon8は1人枠ができたので、そちらで参戦をしました。
そこで感じたメリット/デメリットを書いてみます。

* メリット
    * 開発環境を作らなくていい
    * isuconアカウントを自分好みに使える (.vimrc .tmux .zshrc etc)
* デメリット
    * 手が足りない。時間の刻むスピードが3倍早く感じる
    * さみしい。ただひたすら寂しい。笑
        * 思わず Alexaに話しかけてしまう
MacOS X アプリケーションのライフサイクル

#開発環境
- MacOSX HighSierra(10.13.6)
- Xcode Version 9.4.1 (9F2000)
- Swift4.2
- Cocoa

#アプリケーションのライフサイクルを知る
アプリケーションのライフサイクルを知らないと開発できない。
Android開発やiPhone開発のライフサイクルメソッドと同じ考えで良い。
プロジェクト作成時に自動生成されているメソッドの説明をする。

#AppDelegate.swift
AppDelegate.swiftはアプリケーションのライフサイクルメソッドがある。
プロジェクト生成時に以下の２つのライフサイクルメソッドが自動生成される。
他のタイミングで処理したい場合、他のライフサイクルメソッドを利用すること。
詳細はリファレンスで確認できる。
リファレンス : [UIApplication Delegate](https://developer.apple.com/documentation/uikit/uiapplicationdelegate)

- applicationDidFinishLaunching(_:)
アプリケーションの起動が完了したときに呼び出される。
リファレンス : [applicationDidFinishLaunching](https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623053-applicationdidfinishlaunching)

- applicationWillTerminate(_:)
アプリケーションが終了する前に呼び出される。
リファレンス : [applicationWillTerminate] (https://developer.apple.com/documentation/uikit/uiapplicationdelegate/1623111-applicationwillterminate)

#ViewController.swift
ViewController.swiftはViewのライフサイクルメソッドがある。
Main.storyboardにあるView Controllerのこと。
基本的にアプリケーションのウインドウを開いたり閉じたりすると一緒にView Controllerも生成と終了する。
Viewの生成と終了を繰り返せば、その度にライフサイクルメソッドが呼び出される。
詳細はリファレンスで確認できる。
リファレンス : [UIViewController](https://developer.apple.com/documentation/uikit/uiviewcontroller)

- viewDidLoad()
View生成後に呼び出される。
リファレンス : [viewDidLoad()](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621495-viewdidload)

- representedObject
View間のデータ(プロパティ、パラメータ)の受渡しをするときに利用する。
自動生成コメントより、「Update the view, if already loaded.(既にロードされている場合は、ビューを更新します。)」
リファレンス : [representedObject](https://developer.apple.com/documentation/appkit/nsviewcontroller/1434453-representedobject)

#他のライフサイクル処理を作成
既存のライフサイクルを参考にする。
ViewController.swiftにあるviewDidLoad()みたいにsuper.viewDidLoad()を記述すること。
つまり、親クラスの物を呼び出す。super.xxx()の記述を忘れてはいけない。


```swift:ViewController.swift
override func viewDidLoad() {
        super.viewDidLoad()    // ←これ

        // Do any additional setup after loading the view.
    }
```

以上、フォローといいねをお願いします。
Numpyの配列でappendを使うと遅くなる

#Numpyの配列(ndarray)でappendを使っていますか？#
僕は使っています。

```append.py
import numpy as np
tmp = np.array([])

#適当なデータ
data = [0,1,2,3,4,5,6,7,8,9]

for datum in data:
    tmp = np.append(tmp, datum)
print(tmp)

```

結果から言うとNumpyの配列に対してfor文を使って何度も配列を結合する（appendする）処理は重いです。


#パフォーマンスを上げるためにはどうしたらよいのか#
Numpyの配列（ndarray）をPython標準のlist配列にいったん変換してappendを行い、ループを抜けた後にNumpyの配列に変換するのが一番手っ取り早い方法だと思います。

```append.py
import numpy as np
tmp = np.array([])

#適当なデータ
data = [0,1,2,3,4,5,6,7,8,9]

#ここでNumpyの配列をlistに変換
tmp_list = tmp.tolist()

for datum in data:
    tmp_list.append(datum)

#ここでlistからNumpyの配列に変換
tmp = np.asarray(tmp_list)
print(tmp)

```
追加したのは2行ですが、かなり計算速度は速くなります。
パフォーマンスを上げるために処理を増やすというのは直感に反するかもしれませんが、我が家のオンボロPCだと100MBくらいのデータの処理に数時間かかっていたものが数分で終わるようになりました。listとndarray間の変換のコストがそれほど高くないため実現できます。

#遅くなる原因（かもしれない要因）#
Numpyは内部をC言語で書いてあるそうなのでNumpyの配列は固定長配列によって実装されていると思われ、Numpyのappendのメソッドが呼び出されるたびに配列に使うメモリの再確保をしているせいで遅いのかなと勝手に予想しています。一方でPythonのlistは可変長配列であるためappendの処理があらかじめ想定されており、相対的にNumpyの配列よりもlistの方がパフォーマンスがあがるのでしょう。

#最後に#
Pythonの実行速度はかなりコードに依存しているので、よくないパターンを見つけたらできる限り紹介していきたいと思います。
ProphetをWindows上のAnacondaにインストールする

前提条件としてはpipを使わないことを前提としています。condaとpipの混合はどう考えても安全性に乏しいので可能な限りcondaだけでいく前提です。

## 仮想環境の作成

```cmd
conda create -n prophet_env python=3.7
```

## 仮想環境の利用開始

```cmd
conda activate prophet_env
```

## libpythonとm2w64-toolchainパッケージのインストール

```cmd
conda install libpython
conda install -c msys2 m2w64-toolchain
```

## パッケージのインストール

```cmd
conda install numpy cython matplotlib pandas
conda install -c conda-forge fbprophet
```

## pystanのテスト

```python
import pystan
model_code = 'parameters {real y;} model {y ~ normal(0,1);}'
model = pystan.StanModel(model_code=model_code)
y = model.sampling(n_jobs=1).extract()['y']
print(y.mean())
```
ポインタとは

# ポインタとは #

## ポインター（猟犬） ##
![job_hunter.png](https://qiita-image-store.s3.amazonaws.com/0/289322/4a59d9ea-83a9-d72b-5aa5-3c4435376aa6.png)
獲物をガン見して静止することで位置を人間に知らせる猟犬
[YouTube動画](https://www.youtube.com/results?search_query=pointer+dog)

## 指示棒（英語でポインタといいます） ##
![presentation.png](https://qiita-image-store.s3.amazonaws.com/0/289322/1505cdfe-c6a4-e5cb-1cb1-fbf103cc2e7e.png)
プレゼンなどで使う指し棒です

## マウスポインタ ##
![mousep.png](https://qiita-image-store.s3.amazonaws.com/0/289322/b65ff67b-d4ac-829d-c3e1-8e52887200bc.png)
マウスの動きにあわせて画面でうごくやつ

## つまり、ポインタとは・・・ ##
	位置を指し示すもの
ということです。

***

###### [いらすとや](https://www.irasutoya.com/)さん、ありがとうございます ######
ImageMagick でカードゲーム用のカード素材を合成して生成する（＋文字入れ）


# 素材準備

重なり順（上のレイヤーから）

- フレーム
- ロゴ
- 名前枠
- モンスター
- 背景

*素材（モンスターを除く）はすべてカード素材サイズ(480x640)で作成して位置調整が不要で重ねるだけで済むようにしています。*

最後にカード名の文字入れを行いこのようなカードが生成されます。

![1001.png](https://qiita-image-store.s3.amazonaws.com/0/69402/1aebfdd0-a57d-c257-f278-fac4c75b87f5.png "1001.png")

処理（重なり）の順番を変えれば、枠からはみ出るダイナミック演出やロゴかぶりなどお好みで調整できます。

# 画像合成

## 1.背景素材にモンスター画像を重ねる

最初に指定する画像が下に合成されるので 背景 モンスター 画像の順番で指定します。

-gravity オプションで中央、右下、左など基準位置を決めるオプションです。
背景の真ん中にモンスターを配置するため center を指定しています。
出力する画像を -composite オプションで指定します。

```
convert _bg.png _monster.png -gravity center -composite card.png
```

## 2.名前枠を重ねる

背景とモンスターを合成した card.png に更に重ねていきます。

```
convert card.png _name.png -composite card.png
```

## 3.ロゴを重ねる

背景とモンスター、名前枠を合成した card.png に更に重ねていきます。

```
convert card.png _logo.png -composite card.png
```

## 4.フレームを重ねる

最後にフレームを重ねて画像の合成処理は終了です。

```
convert card.png _frame.png -composite card.png
```

# 文字合成

-font で使用するフォントを指定します。
-fill で文字色を指定します。
-pointsize で文字サイズを指定します。
-gravity で位置を指定します。
-annotate で相対位置、カード名を指定します。

> サンプルでは、-gravity で一度カード中央位置を指定したのち、そこから+265で名前枠の位置に重なるように調整しています。
> テキストの中央揃えを行うためという理由もあります。右揃えなら east など適宜対応します。
> +0 が X軸、+265 が Y軸の指定を示します。
> 相対座標は左上を基準として+,-です。

最後の２つの引数が 入力画像(card.png) 出力画像(card.png) です。
例では上書きしています。

```
convert -font meiryob.ttc -fill white -pointsize 20 -gravity center -annotate +0+265 "カード名" card.png card.png
```

以上で合成完了です。

# その他

### 合成用の素材が小さい場合のリサイズ例

```
convert monster.png -resize 800x800 _monster.png
```
Google Cloud のデフォルトサービスアカウントの復元？

Google Cloud Consoleにて、不用意にデフォルトのサービスアカウントキーを削除しました。

そのため、GAEから、Cloud SQLに接続できなくなりました。

有料のサポートを受けていますが、土日祝日はお休みの為、
サポートに連絡をしても、返事がこず。

いろいろと調べいるうちに、App Engine Admin API なるものを発見。

こんなメソッドがあったので、ダメ元で試してみました。

https://cloud.google.com/appengine/docs/admin-api/reference/rest/v1/apps/repair


```
ログイン
$ gcloud auth application-default login
アクセストークンの取得
$ gcloud auth application-default print-access-token
yaxfeajiewafieofjw......(省略)
リペア
$ curl -X POST  -H "Content-Type: application/json" -H "Authorization: Bearer yaxfeajiewafieofjw......(省略)" https://appengine.googleapis.com/v1/apps/プロジェクトID:repair
{
  "name": "apps/プロジェクトID/operations/069xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "metadata": {
    "@type": "type.googleapis.com/google.appengine.v1.OperationMetadataV1",
    "method": "google.appengine.v1.Applications.RepairApplication",
    "insertTime": "2018-09-17T05:00:24.972Z",
    "user": "自分のメアド",
    "target": "apps/プロジェクトID"
  }
}

```

無事、復旧しました！

サービスアカウントキーは不用意に削除するものじゃないですね。。。。
「params」のざっくりした説明

params、ざっくりと説明してみる。
　
　
params、言ってみれば、**HTTPリクエスト~~のPOSTメソッド~~[^1]で送信したデータが格納されたハッシュ[^2]**のこと。
 
[^1]: POSTメソッドでの送信に限らない。詳しくはコメント欄で@scivolaさんが指摘してくださった内容を参照していただきたい。

[^2]: 取り出すときに`ハッシュ['キー']`であるように見えたのでparamsをハッシュと見立てたが、じつはメソッドであるとのこと。こちらも、コメント欄での@scivolaさんの指摘を参照されたい。

 
あらかじめ、トップページ（`/`）にHTMLリクエストのPOSTメソッドが来たときの条件を決めておいたとして、name属性でキーの名前を指定すれば、

```.erb
<form action="/" method="POST">
  <label>名前: <input type="text" name="target_name"></label>
  <input type="submit" value="送信"> 
</form>

<% name = params["target_name"] %>
<%= name %>
```

となり、フォームに入力したら、そのしたに入力した情報が出力される。
git commit したと思ってreset --hardしたらnpm commitと打っていたせいで最新のコードが死んだ件

# 背景
現在とあるスクールで出会ったメンターの下で、
「無限オセロゲーム」を作っています。

その過程でGitを学び、
サーバーサイドをNode.js、
フロントをVue.jsで進めています。

<font color="Red">**プログラミング歴５ヶ月**</font>のぺいぺいです。

「<font color="Red">**何も考えずに手を動かすと死んじゃうよ**</font>」という話。


# やったこと
「テスト駆動開発」なるものにチャレンジしていまして、
実装する前にテストコードを書く習慣をつけることをしています。
全くもって初心者である私には、**意味プー**なのですが、
なんとかひとまずついて行くことに。

課題の一環として、「オセロの駒を置く判定処理」を書いていました。
課題提出も近づき、その日は徹夜で作業。夜中2時を回ったくらいでしょうか、

ひとまず駒を挟んでめくる処理を実装してテスト通ったので、
一度git commitして、プルリク出そうとしました。

Gitなんて昨日めちゃくちゃ勉強したし、
手を実際に動かしてgitなんてもう何回
打ったかわからないほどやりました。

しかし、そのおごりが**致命傷**に。

何も考えずに、いつも通りaddしてcommitしたら
「<font color="Red">**あれ？今まで書いてたコードが消えた?</font>**」という状況に遭遇。

こちらがそのターミナル画面↓↓↓
![Screen Shot 2018-09-05 at 1.09.17.png](https://qiita-image-store.s3.amazonaws.com/0/252687/07ee97ba-0616-dc5e-928b-24e613ce6cd8.png)

git commitするときに、commentを間違えたので単純に、
一度git resetしてもう一度やり直そうと思ったら、
画面が<font color="Red">**先週の状態**</font>に飛んでしまいました。

この時点での私↓↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252687/2bdeee73-9398-4b77-9421-bf94bb93a947.png)

「<font color="Red">**え、何が起こったの・・・・・??**</font>」

もう理解不能に陥りました。

深夜2時、悲しみを通り越して笑いしかでません。

一生懸命ググって調べますが、なぜこうなったかわからない。

![Screen Shot 2018-09-05 at 0.49.10.png](https://qiita-image-store.s3.amazonaws.com/0/252687/175f5d75-8002-61ce-b717-5736af033592.png)
もうresetし過ぎて、こんな状態に。

# 確認して見たら

いろんな人に夜中3時近くにメッセージ飛ばしながら、
解決策見つからず、冷静にターミナル見返しました。

そしたらそこに、答えが！！！

![Screen_Shot_2018-09-05_at_1_09_17.png](https://qiita-image-store.s3.amazonaws.com/0/252687/ff20e63c-ba87-3a6b-6f13-879b93cbb583.png)


なんということだ。。。
なんなんだ、<font color="Red">**npm add**</font>って。。ww
しかも<font color="Red">**npm commit**</font>って!!! lol 

もう改めて笑うしかありませんでした。
そりゃちゃんとgit commitもしてないgit resetしたらコード飛ぶわ！

バカだー、俺。。。
この悔しさをどこにぶつければ良いのだろうか。


# 最後に
結局残りの徹夜時間を使ってコード復旧作業に追われました。
あー、かなり進めれてたはずなのに。。。

まあ、自分が悪いんですけどね。。

それでも、今回は身をもって良い経験をしたと思います。

1. **git resetするときは、しっかり確認してから**
2. **git commitは頻繁にしておくこと**

こういう失敗するともう同じ失敗はしなくなります。
(<font color="Red">そう信じてるww</font>)

私みたいにバカな人は、
gitコマンド使う際は、くれぐれもご注意ください。
requests-htmlでお手軽スクレイピング

[Requests-HTML](https://html.python-requests.org/)を使用してBeautifle SoupやSeleniumを使用せずに簡単にスクレイピングしてみます。


https://jp.reuters.com/article/chile-google-idJPKCN1LT0E0

この記事をスクレイピングしてみます。

```python
from requests_html import HTMLSession

session = HTMLSession()
r = session.get('https://jp.reuters.com/article/chile-google-idJPKCN1LT0E0')
article = r.html.find('.StandardArticleBody_body', first=True)
print(article.text)
```

実行結果

```console
$ python3 scrape_reuter.py 
［サンティアゴ　１２日　ロイター］ - 米アルファベット(GOOGL.O)傘下のグーグルは、１億４０００万ドルを投じてチリのデータセンターを拡充すると発表した。同施設はグーグルにとって中南米唯一のデータセンター。
９月１２日、米アルファベット傘下のグーグルは、１億４０００万ドルを投じてチリのデータセンターを拡充すると発表した。写真はチューリッヒで５日撮影（２０１８年　ロイター／Arnd WIegmann）
今回の投資でサンティアゴ近郊のキリクラにあるデータセンターの規模を３倍の１１．２ヘクタールに広げる。拡張工事に伴い新たに１０００人余りの雇用が発生するほか、完成後に正規に１２０人を採用するという。
同センターはグーグルが１億５０００万ドルで建設し、２０１５年に全面操業を開始。１７年１月からはアタカマ地域の太陽光発電だけで運営されている。
チリのゼネラルマネージャー、エドガルド・フリアス氏は、チリでのデータセンター建設によるインフラの改善が、人工知能（ＡＩ）や機械学習の分野で処理能力向上に役立っていると述べた。
私たちの行動規範：トムソン・ロイター「信頼の原則」
```
HTML5の簡単な紹介

## はじめに
### 対象
HTML５について簡単に触りたい人に対して簡単な基礎知識について紹介します．

### HTML5とは
HTML5とは，HTMLのバージョン5，改訂第5版のことです．
2014年10月28日にHTML5が発表されました．

### 何にが変わった？
HTML4と比べて改善されたところを一言で表すとすれば，
「今まで複雑だった処理が簡単にすることができるようになった!」
改善された箇所は数多くあるのですが，その中から2つをご紹介します．

#### 文書構造がシンプルになった
HTML5では，文書構造を表す新しい要素が加わることで，シンプルに見やすくなっただけでなく，ブラウザや検索エンジンに対してより明確に文書構造を伝えられるようにもなりました．
例えば，ヘッダを示す`<header>`，フッタを示す`<footer>`，一つのセクションであることを示す`<section>`，記事であることを示す`<article>`，ナビゲーションであることを示す`<nav>`などの要素が追加されており，それぞれの役割に応じて適切な要素に割り当てることができるようになりました．

#### 動画や音声の埋め込みが簡単になった
これまでのHTML4では，動画を使うには「Flash」(多少複雑)というものを使っていました．
HTML5では，`<video>`や`<audio>`という「タグ」を使用して，動画や音声をシンプルに扱えるようになりました．
また，PCのみではなく，スマホなどでも再生可能ようになった．
HP制作時などに対応機種を気にする必要がなくなりました．(気楽！)

#### サンプル
下のindex.htmlはHTML5を使って作った簡単なサンプルコードとなっています．

```index.html
<!DOCTYPE html>
<html lang="ja">

<head>
  <!-- ShiftJISの時は"SJIS" -->
  <meta charset="UTF-8">
  <title>HTML5サンプル</title>
</head>

<body id="index">
  <div id="title">
    <header>
      <address>
        <p>TEL：000-0000-0000/E-mail：XXXX@YYY.ZZZ</p>
      </address>
    </header>

    <nav>
      <h2>メニュー</h2>
      <ul>
        <li><a href="index.html">メニュー1</a></li>
        <li><a href="index.html">メニュー2</a></li>
      </ul>
    </nav>
  </div>

  <h1>見出し1</h1>
  <h2>見出し1</h2>
  <h3>見出し6</h3>
  <h4>見出し1</h4>
  <h5>見出し6</h5>
  <h6>見出し6</h6>
  <p>「p」を使用</p>

  <div id="div">
    <h2>「dl」の使い方</h2>
    <dl>
      <dt>dtを使用</dt>
      <dd>ddを使用</dd>
      <dt>dtを使用</dt>
      <dd>ddを使用</dd>
    </dl>
  </div>

  <footer>
    <small id="copy">copyright&copy;2019 著作権者名 Kenta</a></small>
  </footer>
</body>

</html>
```

表示結果：
<img width="413" alt="スクリーンショット 2018-09-17 13.56.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/179248/21617b77-03c8-140b-119b-366c6e26c973.png">

基本的な内容はHTML4と変わらず，先ほど話したようにナビゲーションやフッターなど新しい要素を使って，自分で見たぜひ色々試してください．

今回の「HTML5の簡単な紹介」は以上で終わります．
読んでいただいてありがとうございます．
また今度で会いましょ！
今まで読んだpython関連の教材まとめ

こんにちは！6月からpythonの勉強してきたわけですが、この度Rubyをやり始める前に今までpythonでやってきた教材（ネット教材と書籍）をまとめておこうかなと思います。

# ネット教材
- Progate

皆大好きProgate。8月からスタート。
python以外もちょっと知っておきたいなと思いやってみた。
Twitterとか見てると何周もやってる方いてすごいと思う。僕は1周しかしてません。
忘れてるのも多いです。Rubyもとりあえずここから初めてみようかな。
![ダウンロード.png](https://qiita-image-store.s3.amazonaws.com/0/292031/665c753a-40f7-f239-e2ed-194a13d8984b.png)


- Udemy

3つの講座を買いました。
https://www.udemy.com/python-beginner/
途中までしか見てない。
https://www.udemy.com/machinelearning/
https://www.udemy.com/deeplearning/
夏に安売りしてた時に英語のコース買ってしまった。
これやることでToeicの点数もあげたいなとか思ったけど手をつけてすらいない。さぼりすぎ。
キカガクさんの講座とか気になるけど溜めすぎてもしょうがないから買ってない。

- kaggle

やりたいってずっと言っときながらタイタニックのチュートリアルちょっと触ったっきり放置。kaggleのslackも入ったけど放置。

# 書籍


- pythonエンジニアファーストブック

![zu6.jpg](https://qiita-image-store.s3.amazonaws.com/0/292031/9a5eab18-bb95-2f0e-01fc-04079e8912cd.jpeg)

この本で一番最初にpython触り始めた。
基本的な操作やった後にスクレイピング、クローリングについてと、スクレイピングしてきたデータの整形とかやった。初めてなので写経しただけだったけど。

- 夢見る機械学習＆夢見るディープラーニング

![図1.jpg](https://qiita-image-store.s3.amazonaws.com/0/292031/8ff93c4f-81d6-415b-710a-a7509f7ccc27.jpeg)![図2.jpg](https://qiita-image-store.s3.amazonaws.com/0/292031/4d743cb5-1ad3-b4b6-e216-a8655b0775d1.jpeg)

機械学習とディープラーニングの理論を数学的に説明してくれて、NumpyだけでMNISTの文字判別モデルを実装するって本。僕は数学的に機械学習がどんなことやっているのか知りたかったので面白かったです。誤字が多いのが難点。
多分ゼロからはじめるディープラーニングとかUdemyのキカガクさんの講座も同じようなことやってるんだと思う。

- 将棋AIで学ぶディープラーニング

![図4.jpg](https://qiita-image-store.s3.amazonaws.com/0/292031/6c4673bb-eac4-6a15-bc0a-8cd818a94d3c.jpeg)

書店で見つけて衝動買い。しかしこの本ではGPU使って計算してることを知り萎える。
Google Colaboratory使ってやろうかと思ったけど棋譜のデータをアップするのが面倒で挫折。
結局最初のプログラムを研究室のPCで4日くらい動かし続けて放置してました。

- pythonによるAI・機械学習・深層学習アプリのつくり方

![図3.jpg](https://qiita-image-store.s3.amazonaws.com/0/292031/25fe677e-e462-c9a7-ca12-742df1b72040.jpeg)

いろんな機械学習アプリを実装する本で面白かったです。
しかし自然言語処理のところはMecabがwindowsでインストールできずに挫折した。
バイトでUbuntu入れたから再挑戦してみたい。

- pythonによるスクレイピング＆機械学習

![図5.jpg](https://qiita-image-store.s3.amazonaws.com/0/292031/fae4454a-5eed-a2e5-83db-a8b946c7071d.jpeg)

やろうやろうと思いつつほとんどやってない。Rubyでスクレイピング始めるから結局やらない可能性が高い...



他にも学校の図書館で見つけたpythonの本や機械学習関連の本は気になったらとりあえず借りてるんですが全然読むの追いついてない。
それとnoteの技術記事もいくつか購入してやったりもしてた。
8月中にAidemyさんのブログ記事にあった乃木坂メンバーの顔判別アプリを実装してた。
これに関してはほとんどパクリだけどちょっとだけ変えてみた部分もあるからそのうち記事にまとめようと思ってます。