OmniAICreator/Qiita-1.07M huggingface dataset:
Angular /WSL

まだまだ npm に慣れません。
とりあえず、npm version を更新しておきます。nvm などお使いの方は適宜どうぞ。

```sh
$ npm i -g npm
  ...
$ npm -v
5.6.0
```

## Angular

Angular 公式 tutorial をやってみます。
https://angular.io/tutorial

淡々といきます。

```sh
$ npm install -g @angular/cli
$ ng new angular-tour-of-heroes
```

2015 年くらいの DELL xps 13 でやっていますが、node ががんばって cpu は 100% まで使われておりマルチコアを効率よく使っているように見えます。ただし Windows Search Indexer もがんばっていて、そちらは完全に電力のムダ感が強いです。

```sh
$ cd angular-tour-of-heroes
$ ng serve --open
```

何も問題なくブラウザが起動し、ページが表示されました。
VSCode を起動し、つくった angular-tour-of-heroes を "File" > "Open Folder..." で開きます。src/app/app.component.html を変更し保存すると、自動でブラウザに反映されました。Typescript file の変更も自動で検出され、compiler が自動で走ってブラウザが auto reload されます。完璧です。

## Angular Material
気分がよいところで、そのまま最近 version が Angular 本体にあわせられ導入しやすくなった  (個人の感想) Angular Material を導入してみます。これも公式 Getting Started にしたがって進めます。
https://material.angular.io/guide/getting-started

```sh
$ npm install --save @angular/material @angular/cdk
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.3 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
...
$ npm install --save angular/material2-builds angular/cdk-builds
...
```

このへんの警告はあまり気にせず進めます。

- 今回は必須でない Step 2: Animations は飛ばしました
- Step 3: Import the component modules に従って app.module.ts に import, imports 文を追加します
- Step 4: Include a theme に従って、styles.css に文をコピペします
- あとは必須でなさそうなので飛ばしました

以下の例から、Raised Buttons を app.component.html にコピペします。
https://material.angular.io/components/button/examples

```html:app.component.html
<div class="button-row">
  <button mat-raised-button>Basic</button>
  <button mat-raised-button color="primary">Primary</button>
  <button mat-raised-button color="accent">Accent</button>
  <button mat-raised-button color="warn">Warn</button>
  <button mat-raised-button disabled>Disabled</button>
  <a mat-raised-button routerLink=".">Link</a>
</div>
```

何の問題もなく Material ぽいボタンが表示されました。
せっかくなので、ボタンにクリックイベントのハンドラを仕込みます。

```typescript:app.component.ts
  onClick(): void {
    console.log("onClick.");
  }
```
```html:app.component.html
  <button mat-raised-button (click)="onClick()">Basic</button>
```

auto build, auto reload も完全に動作してボタンを押して console log に出力が確認できました。完璧です。

## まとめ
今回確認した範囲では、WSL で Angular + Angular Material + VSCode での開発が快適にできそうでした。Mac でやるのとなんら変わらないです。今回とは別に tutorial を進めたこともありましたが特にハマった記憶はありません。Chrome の debugger extension は試したか忘れました。いろんな module など使ったりなどしていくとハマることはあるかもしれませんが、カンタンな練習などでは WSL でも困ることはなさそうです。
無料でSalesforceの勉強をはじめる

##　きっかけ
最近Salesforceを触っていなかったらLightingとかいうUIができていたりして
設定がわからなくなりはじめた。もう１回ちゃんと勉強しないといけないなと感じたため。
勉強をはじまるまでの手順を記載。

## ０.事前準備
IEよりChromeで動かそう。まずはChromeをインストールして立ち上げるとこから。
そしてChromeのプラグイン【Force.com LOGINS】を入れよう！
https://chrome.google.com/webstore/detail/forcecom-logins/ldjbglicecgnpkpdhpbogkednmmbebec?hl=en

## １．Salesforceの無料のDeveloper Editionにてログイン情報を登録
▼SalesforceのDeveloper Editionページ
https://developer.salesforce.com/signup
 → ユーザ登録するとメールが届く、手順に従いログイン。
※できたら【Force.com LOGINS】を設定してログインの手間を省く

▼注意事項
６ヶ月以上ログインしないと環境が消えるとか制約あり。詳しくは以下に記載あり。
https://developer.salesforce.com/page/JP:Developer_Edition

## ２．TRAILHEADにログイン
https://trailhead.salesforce.com/ja/home
右上のログインを押してSalesforceでログインする→アクセスを許可する

## ３．TRAILHEADで学ぶ
受けた講座一覧。講座によってはSalesfoceを起動させ手を動かしながら学べる。

### Salesforce Classic の CRM の基礎学習 【読物】
・そもそもSalesfoceとはから学ぶ、オブジェクトとかレコードという用語の意味からスタート。
https://trailhead.salesforce.com/ja/trails/getting_started_crm_basics/modules/admin_intro_crm_basics/units/admin_intro_getstart_crm_basics

### Salesforceの基本カスタマイズを学ぶ【読物と操作】
・Salesfoceのデータモデルを学ぶ
https://trailhead.salesforce.com/ja/trails/force_com_admin_beginner

### クイックスタートApex【読物と操作】
・Apexで簡単な顧客更新を学ぶ
https://trailhead.salesforce.com/ja/projects/quickstart-apex/
arduinoでターミナル その4

#概要

arduinoでターミナルやってみる。
２０字４行のLCDとps/2キーボードをつないで、シリアル端末を作ってみる。
テストの為、vtlをarduinoに書いてみた。

#写真
![vtl0.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/16f992a8-7ecd-6d47-3435-5b5c965e93bf.jpeg)

#参考にしたページ
http://middleriver.chagasi.com/electronics/vtl.html

#vtlの仕様

代入しかない。
何＝何の形式のみ。
ダイレクトモードとエディトモードあり
エディトモード
インサートは、10 a=0
デリートは、 10
エディトは、 10 a=100
0は、リスト
実行は、#=1
行番号無しでダイレクトモード
変数は、a,b,c
コードは、256バイト。
+ - * / で、加、減、乗、除。
%は、剰余。
数値は、1バイト整数符号無し。0-255
行番号も同じく。
= < > で論理式、値は０と1を取る
文は、左から順に評価される。2+5*6は、42となる。
＃は、プログラムカウンター
if文は、#=a<100*20でaが100より小さいなら、行20に飛ぶ
？は、プリント文。


#1から10までの総和サンプルコード

```
10 a=1
15 b=0
20 b=b+a
30 a=a+1
40 #=a<11*20
50 ?="souwa="
60 ?=b
```

以上。
matplotlibの初歩


# インポート
まずは，インポート

```python
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
```

# データ作成
テストデータの作成

```python
x = np.linspace(0,100)
y = np.sin(np.radians(x*10))
y2 = np.cos(np.radians(x*5))*0.5
```

# 全体設定
- [matplotlib と Seaborn の軸の日本語設定](https://qiita.com/kshigeru/items/0cfc0778bab197687967)を参考にして，日本語フォントを設定した。
 - 参考ページでは，IPAで検索していたが，ipaとした。
- グラフサイズはA4として設定した。
 - 単位はインチのため，25.4cmで割る

```python
plt.rcParams['font.family'] = 'IPAexGothic' #全体のフォントを設定
plt.rcParams["figure.figsize"] = [210/25.4, 294/25.4]
plt.rcParams['font.size'] = 10 #フォントサイズを設定 default : 12
plt.rcParams['xtick.labelsize'] = 10 # 横軸のフォントサイズ
plt.rcParams['ytick.labelsize'] = 10

```

# プロットしてみよう
## 余白の設定
`subplots_adjust`で設定する。
単位は割合となる。左下が原点となっている。


```python
# 余白の設定
# 余白は割合で設定する。
# 左下が原点となる。
# サイズをA4縦として余白(left,right,top,bottom)を設定
plt.subplots_adjust(left=30/210, 
                    right=(210-20)/210, 
                    top=(294-20)/294, 
                    bottom=20/294, 
                    wspace=0.2, hspace=0.5)
plt.subplot(211)
plt.plot(x, y, label='sin')
plt.plot(x, y2, label='cos')
plt.legend()
plt.ylabel('ｙ軸')

plt.subplot(212)
plt.hist(y, label='y')
plt.legend()
plt.savefig('matplot_a4.pdf')
```
![output_7_0.png](https://qiita-image-store.s3.amazonaws.com/0/117425/4b871160-97e8-fb7d-1182-a6c239f86926.png)
CentOS7のyumグループを確認する

環境
Windows 10 Pro 1709(16299.192)
Docker version 17.12.0-ce, build c97c6d6
CentOS Linux release 7.4.1708 (Core)

## 前提
・「Docker for Windows」のインストール済み
・「CentOS7」の「Dockerイメージ」をダウンロード済み または 作成済み
Refer to [Window10にCentOS7のdockerコンテナを作ってみた](https://qiita.com/0ashina0/private/f8b960e822a40a6a2eed)
・Docker Container 起動済み

> *参考* **Containerを作成し起動**
> 
> ```:PowerShellで実行
> PS C:\Users\UserName>  docker run -i -t centos /bin/bash
> ```
> Refer to [Docker run リファレンス](http://docs.docker.jp/engine/reference/run.html)

> *参考* **(作成済みの)Containerを起動**
> 
> ```:PowerShellで実行
> PS C:\Users\UserName>  docker start <コンテナID> -a
> ```
> Refer to [Docker リファレンス start] (http://docs.docker.jp/engine/reference/commandline/start.html)


## yumグループを確認する

```:CentOSで実行
[root@3c3c80fea430 /]# yum grouplist
Loaded plugins: fastestmirror, ovl
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
base                                                                                                             | 3.6 kB  00:00:00
extras                                                                                                           | 3.4 kB  00:00:00
updates                                                                                                          | 3.4 kB  00:00:00
(1/4): base/7/x86_64/group_gz                                                                                    | 156 kB  00:00:00
(2/4): updates/7/x86_64/primary_db                                                                               | 6.0 MB  00:00:00
(3/4): extras/7/x86_64/primary_db                                                                                | 166 kB  00:00:00
(4/4): base/7/x86_64/primary_db                                                                                  | 5.7 MB  00:00:09
Determining fastest mirrors
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
Available Environment Groups:
   Minimal Install
   Compute Node
   Infrastructure Server
   File and Print Server
   Basic Web Server
   Virtualization Host
   Server with GUI
   GNOME Desktop
   KDE Plasma Workspaces
   Development and Creative Workstation
Available Groups:
   Compatibility Libraries
   Console Internet Tools
   Development Tools
   Graphical Administration Tools
   Legacy UNIX Compatibility
   Scientific Support
   Security Tools
   Smart Card Support
   System Administration Tools
   System Management
Done
[root@3c3c80fea430 /]#
```
WSL (Windows Subsystem for Linux) を開発 playground に。

近年、Mac は安定した UNIX であるうえに見た目・使い勝手もよく、ハードウェアも安定供給されており特に Web 開発などですっかり開発環境としての地位を確立しています。いっぽうで家で趣味で使う PC はゲームをしたいとかハードウェア選択の自由度が高いなどの理由で Windows を使いたいという希望もあり、わたし個人的にはすっかり Mac=仕事、Windows=趣味 という、数年前とはまったく逆のイメージになりました。

ところで最近 Windows では WSL が使えるようになり、使いようによっては Mac での開発と同様のことができるようになってきています (できるとは言ってない)。以前は VMWare、VirtualBox などを使ってゲスト OS を入れないとできなかったようなことが、少ないマシンリソースで無理なくできるようになっています。しかしまだそういった使い方をする人が少なくハマる点が多いため、ここにメモを残しておきます。

### 目標
- WSL で趣味的な開発をしてみる

### 前提 (よそにたくさん情報があります)
+ WSL の導入はすでにできているものとします。
+ Linux は Ubuntu を使っているとします。

### 共通する項目
- file system は Windows として扱う
 - WSL から Windows FS は /mnt/c のように見えます (drvfs)
 - Windows から WSL のファイルを触ろうとするとハマります
 - cifs として mount したほうが効率がよかったりするのかもしれません
 - こちらとかが詳しいです → [Windows Subsystem for Linuxのファイルシステムにおける注意点](https://qiita.com/lefb766/items/ca2be2590bd7c22395fd)
- Windows Defender の除外設定
    - やってみよう: React Native を参照してください
- 別の Terminal を使う
- Java + Gradle を使う
- node (npm) を使う
- ...

### WSL でやってみよう
- [Angular](https://qiita.com/odistagon/items/dab9c7afa41023aea662) ★★★★ 実用レベル
- [React Native](https://qiita.com/odistagon/items/e4a1b3bc8c17664c9356) ★★★ 難あり
- [Flutter](https://qiita.com/odistagon/items/6e3f3aa4747c093344cd) ☠ 無理

### 忙しい人への結論
個人的な意見になりますが、現状 2018年2月 の WSL は何をするにもまだまだハマるポイントが多く、あたらしいことをしようとするたびに環境構築のほうに時間をとられがちになります。罠をたのしむ余裕がなければ実績のある方法をおすすめします。
React Native /WSL

WSL 環境で React Native での開発を試してみます。

React Native は (現時点 2018/01 では) npm 5.x を support してないらしいので、npm 4.x 系を入れます。いろいろ考えるのはめんどうなため手っ取り早く以下のようにしました。

```shell
npm install -g npm@4.6.1
```

試すのは、React Native 公式の Getting Started https://facebook.github.io/react-native/docs/getting-started.html です。書かれているまま進めてみます。

```shell
npm install -g create-react-native-app
create-react-native-app AwesomeProject
cd AwesomeProject
npm start
```

起動時に以下のような警告が出ますが気にしないことにします。

```shell
Warning: Unable to run `sysctl fs.inotify.max_user_watches`. If you encounter issues, please refer to https://git.io/v5vcn
```

Expo app で使う URL が表示されますが、iOS/Android 端末とおなじネットワークに属する必要があり、ご利用のネットワーク環境によっては別のネットワークが検出されてしまうかもしれません。サーバーのアドレスを指定するには以下のようにします。PC (WSL) 側のアドレスは ifconfig コマンドなどで、端末側のアドレスは設定などで確認します。

```shell
export REACT_NATIVE_PACKAGER_HOSTNAME=192.168.56.1
```

また、実端末など PC の外からこのアドレスへ通信する場合は、受付のために Windows Defender で許可ルールを追加しておきます。Windows メニューで "Windows Defender Firewall with Advanced Security" で検索し、開いたアプリケーションを使って "Inbound Rule" を追加します。
(ここに少し絵つきで説明があります https://github.com/expo/expo/issues/438)

こちら https://expo.io/tools から Expo app を download し、端末にインストールします。たとえば Android なら、端末を USB などで接続して以下のようにします。(adb はAndroid SDK に含まれています)

```shell
adb install Exponent-2.3.0.apk
```

以下のようにして development server を起動します。

```shell
npm start
```

AA で QR コードが表示されるので、端末で Expo app を起動し、QR コードを読み取って起動します。Expo app はコピーした URL 文字列からも起動ができますが、なぜか URL 直接入力はできないようです。できたほうが便利ですよね。

この状態で開発するアプリのテストが可能で、先程作成した AwesomeProject 直下にある App.js の内容を書き換えて保存することで変更が自動的に反映されるようになります。

### WSL 環境での罠
わたしの手元では、Windows からのファイル変更が自動反映されませんでした。たとえば Windows 版 VSCode で js を快適に編集して保存し結果を確認するということができません。WSL の Linux 側で変更を保存すると自動反映されるので、惜しいところです。上であった inotify の警告が関係しているような気もしますがわかりません。また、Angular でおなじことをすると自動反映したと思うのですがちゃんと確認していません。
英語中級者がTEDを使ってリスニングを鍛えるためのchrome拡張機能

## 概要
TEDで英語リスニング学習をサポートするchrome拡張機能（TEDxEnglish）を作りました。
動画視聴時に英語を聞き取れなかった時、**`i`** を押すとスクリプト内の英文をハイライトできます。
ハイライトされた英文をクリックすると動画がジャンプするので、復習に便利です。

- chrome拡張機能: https://chrome.google.com/webstore/detail/tedxenglish/mbeigacaigcgaklfpkjlgbmcaollpbgd?hl=ja
- ソースコード: https://github.com/elecshiba/TEDxEnglish


下の画像のように、`i`を押すと英文が赤くハイライトされます。

![pv4.jpg](https://qiita-image-store.s3.amazonaws.com/0/235694/683d0ccf-8f5b-637e-2441-24f1d06410ac.jpeg)


## 背景
英語のリスニング勉強材料は**モチベーションのキープ**と**学習効率の高さ**の
両方を満たすことがとても重要だと思うが、

- モチベーションのキープ → **自分が理解できるレベルのコンテンツ**
- 学習効率の高さ → **自分が知らない英語表現が多いコンテンツ**

となってしまい、両方を実現できる学習方法があればいいなと常々考えていた。


自分の英語レベルだと、TEDの動画は面白いしほぼ理解できるものの知らない表現も多いので、
**動画を楽しみつつも知らない表現だけを勉強**できる上手い方法があれば効率的だなと思った。


## TEDxEnglishを使った勉強方法
1. 動画を視聴しながら、聞き取れなかった時に**`i`**を押す。
2. 視聴後ハイライトされた英文をクリックし、復習する。

この方法だと、聞き取れなかった箇所をピンポイントで復習できます。
Numpy > arctans2 > Array of angles in radians, in the range [-pi, pi]. > [-pi, pi)の意味だろうか

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
```

https://docs.scipy.org/doc/numpy/reference/generated/numpy.arctan2.html
に書いている下記

> Returns:	angle : ndarray
>      Array of angles in radians, in the range [-pi, pi].

上記の`[-pi, pi]`の意味は[open`(`とclosed`[`interval記号](https://en.wikipedia.org/wiki/Interval_(mathematics)) で表すと下記になると考える。

`[-pi, pi)`

理由としては、piが返る条件では実際には-piが返るため、piが返ることはないと考えた。

では、なぜ`[-pi, pi]`という記載なのか。
Pythonではrangeを使う場合に最後の値は含まれないということが関係するのかもしれない。

https://ideone.com/Q7tYr7

```py
for elem in range(1,5):
	print(elem)
```

```txt:run
1
2
3
4
```

### 誰向けのドキュメントなのか

- arctans2のドキュメントが`[-pi, pi]`の場合の想定される感想
    - 数学者(Python非利用者): この範囲の説明はおかしいのでは
    - その他のPython利用者: なるほど
- arctans2のドキュメントが`[-pi, pi)`の場合の想定される感想
    - 数学者(Python非利用者): なるほど
    - その他のPython利用者: "]"の誤植かな?
Juliaでグラフラプラシアンの固有値を求めて描画する

# 内容
- 有向グラフの隣接行列 $A$から、次数行列 $D$ を計算する
- 最大の次数 $\Delta$ のとき、中心 $(\Delta, 0)$ 半径 $\Delta$ の円を描画する
- グラフラプラシアン $L = D - A$の固有値をJuliaで求めて二次元プロットする

# 例題
- 隣接行列 $A = \begin{pmatrix}
0 & 0 & 0 & 1 & 0 \newline
1 & 0 & 1 & 0 & 0 \newline
0 & 0 & 0 & 0 & 1 \newline
0 & 1 & 0 & 0 & 0 \newline
1 & 0 & 0 & 0 & 0
\end{pmatrix}
$

- 出力

![output1.png](https://qiita-image-store.s3.amazonaws.com/0/7181/13b44412-5a8a-a2f9-68fb-d687604c1ab6.png)


# コード
```julia
# -*- coding: utf-8 -*-
# graph laplacian and visualization of eigen values

using PyPlot
using PyCall
@pyimport matplotlib.patches as patch

# adjacency matrix
A = [0 0 0 1 0;
     1 0 1 0 0;
     0 0 0 0 1;
     0 1 0 0 0;
     1 0 0 0 0]

# degrees, maximum degree and laplacian L
D = diagm(squeeze(sum(A, 2), 2))
Δ = maximum(D)
L = D - A

# eigen values
evs = eigvals(L)
for cv in evs
    println(real(cv), ",", imag(cv))
end

# plot
figure(figsize=(5, 5))

# circle
c = patch.Circle([Δ, 0.0], Δ, fc="red", zorder=0, alpha=0.3)
ax = gca()
grid(true)
ax[:add_patch](c)
for cv in evs
    plot(real(cv), imag(cv), "rx")
end
xlim(-0.1, 2*Δ+0.1)
ylim(-Δ-0.1, Δ+0.1)
tight_layout()
show()
```
windows 突然アプリケーションが最小化 備忘録

windowsのタイトルバーを少し動かしただけでいきなり開いていたアプリケーションが最小化される問題について書く。
これはエアロシェイクという機能らしいのでそれだけの対処法を記す。

- windowsキー + rにてファイル名を指定して実行を起動する
- regeditと打ち込みok（レジストリエディタのこと）
- HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced
- まできてDisallowShakingという名前でDWORD32を選んでファイルを新規作成しその値に16ビット1を設定すると完了

参考

- https://www.teradas.net/archives/20665/
Raspberry Pi 更新

# Raspberry Pi 更新
最新化。
## 原状確認

```
$ uname -a
Linux raspberrypi 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l GNU/Linux
```
## パッケージリストの更新

```
$ sudo apt-get update
```
## パッケージ更新

```
$ sudo apt-get upgrade
```
## カーネル更新

```
$ sudo apt-get dist-upgrade
```
## ファームウェア更新

```
$ sudo rpi-update
```
## 再起動

```
$ sudo reboot
```
## 結果確認

```
$ uname -a
Linux raspberrypi 4.9.79-v7+ #1086 SMP Wed Jan 31 18:03:34 GMT 2018 armv7l GNU/Linux
```
AtCoderで強くなりたい

# どうでもいい前置き
プログラミングの勉強が続かん
　↓
楽しいものがあったら続くんじゃね？
　↓
[AtCoder](http://atcoder.jp/)でレーティング上げれたら楽しいんじゃね？
　↓
よし、やるか

# ひとまずの目標(2018年中)
・20回参加
・レーティング1500

# 環境・言語
Windows10
Python3.6

# Qiitaでやりたいこと
自分のコードと他人のものを比較して気づいたことをメモする
考えたことを言葉として出力する

# 現在地
| 　　　日付　　　 |       レーティング   |    等級     |
|:---------------:|:------------------:|:------------------:|
| 2018/02/02      |              13    |    スライム級    |
TCPの信頼性について

# ■初めに
TCPはOSI参照モデルのトランスポート層にあたるプロトコルであり、他にはUDPなどがある。

- TCP.... 送信したデータを相手が受け取った事を確認する仕組みがある。
- UDP.... 送信したデータを相手が受け取ったかは確認しない。

今回はTCPの信頼性の要と言える機能として、確認応答と再送制御に関して考察してみました。

#■確認応答とはデータの到達確認
正常時の通信フローが下記になります。

```
【ホストA】      【ホストB】
 データ送信→データ受信       
 確認応答受信←確認応答送信
```
データを受信した、ホストBは確認応答をホストAへ送信する。
ホストBから送信された、確認応答をホストAが受信する。

確認応答の事を、Ackパケットとも言う。

#■再送制御
送信中のデータが喪失した場合や、確認応答が喪失した場合には、再送処理をする仕組みがある。

【データ喪失パターン】

```
【ホストA】      【ホストB】
 データ送信→喪失.....

 一定時間待っても確認応答が来ない.....
　
 データ再送→データ受信
 確認応答受信←確認応答送信
```
一定時間を待ってもホストBから確認応答が来ない場合はホストAがデータを再送する。

【確認応答喪失パターン】

```
【ホストA】      【ホストB】
 データ送信→データ受信
       喪失←確認応答送信
       
 ホストBはデータを受信していて
 確認応答も送信しているが、ホストAから見ると
 データが届いてないのか、データが届いてないのか確認応答が来てないのかはわからない。
 
 一定時間を待ってもホストBから
 確認応答が来ない場合はデータを再送する。
       
 データ再送→データ受信
 確認応答受信←確認応答送信
```
再送されたデータに関しては受信済みの為、厳密には下記の様な挙動となる。
受信済みのデータの識別にはシーケンス番号を使用している。

```
【ホストA】      【ホストB】
  データ送信(シーケンス番号:1)→データ受信
  喪失←応答確認送信
       
  データ再送(シーケンス番号:1)→既に受信しているので、破棄
  確認応答受信←確認応答送信
```

#■まとめ
簡単ではありますが、確認応答と再送制御に関してまとめました。
Pythonのプログラムでエラー通知をどのように実装するか

プログラムを実行するうえでエラーはつきものなので、エラーが発生した場合にそれををどのように上位層へ通知するかを考慮しなければなりません。
プログラムを書いているなかで、ある処理を関数に切り出した際にエラー通知をどのようにするのが適切か迷うことがあったため、実装したプログラムが別のプログラムから呼び出されるという観点から、どの方法が適切なのかをまとめてみました。

なお、タイトルで「Pythonのプログラム」としていますが、他の言語にもある程度適用できる考え方かと思います。

## エラー通知の方法

代表的なエラー通知の方法は次の2つがあるかと思います。

- 戻り値による通知
- 例外による通知

### 戻り値で通知

Cでよく使われるようなint型の戻り値でエラーを通知する方法。

```sample_1.py
def sample_1(a, b):
    :
    if a > b:
        return -1
    :
```

戻り値にエラー有無と処理結果をタプルで返す方法。

```sample_2.py
def sample_2(a, b):
    :
    if a > b:
        return False, None
    :
```

あるいはNoneを返すことでエラーを表すケースもあると思います。

```sample_3.py
def sample_3(a, b):
    :
    if a > b:
        return None
    :
```

### 例外で通知

戻り値を使わずにエラー通知を例外に任せる方法です。
通常のシステム例外、あるいは意図的に例外を送出することで呼び出し元にエラー通知をすることができます。
意図的に例外を送出する場合、Pythonでは `raise` 文を使って次のように書きます。

```sample_4.py
def sample_4():
    :
    if a > b:
        raise Exception('Error!')
    :
```

## 呼び出し側でのエラーの受け取り方

戻り値でエラーを通知する場合、呼び出し元のプログラムでエラーチェックを適切に行う必要があります。
上記のsample_3.pyを例にすると、エラーの際に `None` を返す関数を呼び出した場合、次のようにエラーチェックの実装をします。
このエラーチェックを行わない場合、`sample_3`の処理中に何らかのエラーが発生したとしてもプログラム自体はエラーにならず、そのまま処理が継続されます。

```sample_5.py
result = sample_3()
if result is None:
    print('Error!')
    sys.exit(1)
```

反対に例外でエラーを通知する場合は、上記のようなエラーチェックを明示的に行わなくてもエラーが発生した時点で例外が送出されてプログラムが停止します。
処理を継続したい場合はtry文を使って例外をキャッチすることができます。

```sample_6.py
try:
    result = sample_3()
except Exception:
    <何らかの処理>
```

呼び出し側の目線で考えると、それぞれ次のような特徴があります。

- 戻り値による通知
    - エラーチェックを明示的に行う必要がある
    - エラーチェックを行わないことでプログラムが継続する　
- 例外による通知
    - 明示的なエラーチェックは必要ない
    - 例外をキャッチすることでプログラムが継続する

## どちらの方法が適切なのか

結論としては、Pythonにおいては基本的に例外を使うのがよいと思います。

理由は、例外による通知は暗黙的にエラーが無視されることがないためです。
例外が発生すると通常プログラムはその時点で停止します。エラーが発生した異常状態のプログラムがそのまま動き続けると、予期しない他の重大なエラーを発生させる可能性があります。
そのため、異常状態になったプログラムは一刻も早く停止させるべきであり、それを考慮するとエラーが発生した時点で停止するプログラムはエラーによる二次障害のリスクを抑えた設計であるといえます。

エラーが発生した後もプログラムを継続したい場合はtry文を使って例外をキャッチして処理を継続させることができますが、重要なのはそのために例外処理のコードを明示的に書かなければいけない点です。

戻り値を使ったエラー通知の場合、呼び出し元で明示的にエラーチェックの処理を実装しなければならず、その実装を省くことで簡単にエラーを無視できていしまいますし、例外を使った場合とは反対にその状況というのは無意識のうちに発生しうるものです。

上記のような理由から、Pythonによるプログラムのエラー通知としては例外を利用するのがよいと考えます。

## まとめ

Pythonプログラムにおけるエラー通知の適切な方法について、安全性を重点においた考え方で自分なりに解を出してみました。
間違いなどありましたらコメントいただけると幸いです。

## 参考文献

- [EffectivePython](https://www.oreilly.co.jp/books/9784873117560/)
- [エラー処理を書いてはいけない](http://tanakh.jp/pub/pfi-seminar-2011-12-08.html)
- [Railsアプリケーションにおけるエラー処理（例外設計）の考え方](https://qiita.com/jnchito/items/3ef95ea144ed15df3637)
- [潜在するバグに対処するための　エラー処理の考え方](http://gihyo.jp/dev/serial/01/skillful_method/0002)
- [.NETの例外処理 Part.1](https://blogs.msdn.microsoft.com/nakama/2008/12/29/net-part-1/)
ansible-lint を CI に組み込む

　この記事では ansible の linter である [`ansible-lint`](https://github.com/willthames/ansible-lint) を実際にどのように CI に組み込んでいるかをご紹介します。といっても、大した内容ではないのですが、あまり記事が出回ってなかったので、`ansible-lint` 良いぞという気持ちも兼ねて僭越ながら手短にまとめてみました。

## ansible-lint の導入

　`requirements.txt` を以下のように ansible リポジトリにコミットしておき、 `pip install -r requirements.txt` でインストールしています。

```
ansible==2.4.3
ansible-lint==3.4.20
```

## .ansible-lint の設定

　実運用上、なかなか標準ルールすべてを満たすのは大変だったり、ちょっと面倒だったり、別にこれはいいんじゃないのみたいなものがあったりします。そんなときには、`.ansible-lint` の `skip_list` に対象のルールを記載しておけばベンリな感じに対象のルールを無視してくれます。

```
parseable: true
quiet: false
use_default_rules: true
skip_list:
  - ANSIBLE0006
  - ANSIBLE0007
verbosity: 1
```

　特に既存の ansible に新たに ansible-lint を導入すると大量の警告がでてしまうというケースは多いかと思うので、ひとまず警告の出ているルールをすべて追加しておき、隙間時間に簡単そうなルールに順次対応していくとよいのではないかと思います。そういったリファクタリングフェーズでは ansible-lint の `-c` オプションで適用する `.ansible-lint` ファイルパスを指定することができるので便利です。

## travis を利用して pull request 時に ansible-lint を走らせる

　次のような感じで lint をかけたい対象の playbook を指定すれば良いと思います。include, import している各 yaml をトラバースしてくれます。

```
language: python
python:
  - "2.7"
script:
  - pip install -r ./requirements.txt
  - ansible-lint *_playbook.yml
```

## drone を利用して pull request 時に ansible-lint を走らせる

drone を使っている方は `.drone.yml` をこんな風に書いてオワリ

```
pipeline:
  test:
    image: python:2.7
    commands:
      - pip install -r requirements.txt
      - ansible-lint *_playbook.yml
```

## まとめ

導入は 5 分でできるので、ansible を使っているみなさま、ぜひ `ansible-lint` を使ってみると良いと思います。良さみがあります。
Macの日本語キーボードでColemak

Macの日本語キーボード用のColemakキー配列を作った。

# はじめに
Macの日本語キーボードユーザーがColemakを使用するにあたってはいくつかの問題があった。

- 初期導入されているColemakでは大文字のオー「O」が入力できない。（macOS 10.13.3現在）
- 初期導入されているColemakでは記号の配列は日本語用のまま
- ネットで配布されているレイアウトは英字キーボード用ばかりで，チルダ「~」やグレイヴ・アクセント「`」が打てない。


# ダウンロード
[Colemak_jp.keylayout](https://drive.google.com/uc?export=download&id=15Y4dJkNesIJ-eM2Mkifhoi9ebnfKE_Oe)
[Colemak_jp.pdf](https://drive.google.com/uc?export=download&id=1jQFyonXAnmjQaD9L9fGgWN-PqgntQe4X)

ダウンロードした Colemak_jp.keylayout を`/Library/Keyboard Layouts/`というフォルダ下に置けば、"キーボード"環境設定から選べるようになります。`Keyboard Layouts`フォルダがない場合は自分で作成して構いません。


#レイアウト
- 英字用配列を基本にチルダ「~」やグレイヴ・アクセント「`」を追加。
- オプションキー「⌥」でギリシャ文字やローマ数字，その他数学記号


<img src="https://qiita-image-store.s3.amazonaws.com/0/231104/517d01fd-87f3-48d2-d05c-378e3e2008c8.jpeg" width=80%>
<img src="https://qiita-image-store.s3.amazonaws.com/0/231104/91aeca3d-62bd-e383-1a2e-8cfbc092ebc0.jpeg" width=80%>
<img src="https://qiita-image-store.s3.amazonaws.com/0/231104/6611214d-708d-30f9-1fb2-0650c8a2b25d.jpeg" width=80%>
Pythonの開発環境を作るときのメモ

## 結論
- Pythonをインストールするときにはpyenvを使う
- プロジェクト単位で環境を独立させたいときはvenvを使う
- venvで作ったディレクトリは一箇所にまとめておく

## 補足
### Pythonをインストールするときにはpyenvを使う
正直パッケージマネージャーを使いさえすればなんでも良いと思います。
迷うならpyenvで良いと思います。
[pyenv](https://github.com/pyenv/pyenv)

### プロジェクト単位で環境を独立させたいときはvenvを使う
python3.3以降であれば、もともと仮想環境構築用のvenvというモジュールが存在します。
パッケージの依存などをプロジェクトごとに管理する場合は、venvの使用が推奨されているっぽいですね。
公式に従っておきましょう。
[venv](https://docs.python.jp/3/library/venv.html)

### venvで作ったディレクトリは一箇所にまとめておく
venvモジュールを使用すると、仮想環境の起動/停止を行う実行ファイルなどを含んだディレクトリが生成されます。
最初はこれどこに置くべきか迷ったんですが、ふらっと見かけた[djangoのドキュメント](https://docs.djangoproject.com/ja/2.0/intro/contributing/#getting-a-copy-of-django-s-development-version)に

```
ホームディレクトリの .virtualenvs/ 以下に、すべてのvirtualenvを 1 箇所においておくといいです。もしまだそのフォルダが存在しないなら作成しましょう。
```

って書いてあったのでそうしてます。
まぁ場所はどこでも良いんでしょうけど。


## その他
環境構築作るのに手間取るとやる気なくなりますよね。。環境作るだけで割りと満足しちゃったりもするし。
Vim patchダイジェスト [2018/01]

[Vim](http://www.vim.org/) patchダイジェスト \[2018/01]
([8.0.1428](https://github.com/vim/vim/commit/200ea8ffaa90e1ccc156b24ee097be87acdd5214) ～ [8.0.1451](https://github.com/vim/vim/commit/94073167e3aa8cbe18380e93a2fc8e8165438cc8))

* [8.0.1451](https://github.com/vim/vim/commit/94073167e3aa8cbe18380e93a2fc8e8165438cc8): :four_leaf_clover: `$PYTHONHOME`をPython 2.7と3.5で同時に設定できない件を修正しました。`'pythonhome'`と`'pythonthreehome'`を追加しました。
* [8.0.1450](https://github.com/vim/vim/commit/1dd45fb4f3371f0256653b2186c8b4b3d26b3f41): GTK2: gui_mch_stop_blink()が呼ばれた時に無限ループになることがある件を修正しました。
* [8.0.1448](https://github.com/vim/vim/commit/37badc898b8d167e11553b6d05908ffd35928a6e): `:rubyfile`で例外が投げられると落ちる件を修正しました。
* [8.0.1445](https://github.com/vim/vim/commit/153b704e20f9c269450a7d3ea8cafcf942579ab7): :four_leaf_clover: autocmdイベント`CmdlineChanged`を追加しました。
* [8.0.1441](https://github.com/vim/vim/commit/ce46d934af35d0f774be7f996001db03cf0b894a): `:undo 0`を使用すると、取り消しがおかしな状態になる件を修正しました。
* [8.0.1440](https://github.com/vim/vim/commit/b50773c6df0bc2c9c2ab1afecc78083abc606de0): vtermの応答が遅延する場合がある件を修正しました。(関連URI: [vim-jp/issues/1140](https://github.com/vim-jp/issues/issues/1140))
* [8.0.1439](https://github.com/vim/vim/commit/1274d33493efb6250470a37b9f4432bb31e87d64): `cscope`の検索に失敗した時にVimがハングする件を修正しました。
* [runtimeファイル更新](https://github.com/vim/vim/commit/40962ec9c0e7b8699e101182b06ddd39dc0e1212): typo修正。todo更新。他
* [8.0.1436](https://github.com/vim/vim/commit/84b242c369a22b581c43de9de0152f0baedd71ab): :four_leaf_clover: 動作するPythonのバージョン情報が不十分だったので、`has()`に "python_compiled", "python3_compiled", "python_dynamic" および "python3_dynamic" を追加しました。
* [8.0.1432](https://github.com/vim/vim/commit/2ec364e94dbc080ccdf6c5dfc6f1653b5b7ded64): `:copen`実行後にquickfix windowのwindow-IDが取得できない件を修正しました。
* [8.0.1431](https://github.com/vim/vim/commit/0cbcd949e15ad95171e5b33881d3a30f17073dda): Windows: `%TMP%`や`%TEMP%`に`&`や` `が含まれているとvimtutorが機能しない件を修正しました。
* [8.0.1429](https://github.com/vim/vim/commit/ede35bbbd05306097bf3f4d603f2248ed1f4c5f1): `term_start()`の第1引数に空文字を渡すとクラッシュする件を修正しました。(関連patch: [8.0.1430](https://github.com/vim/vim/commit/4aad53c36998c77ee119c6a46d002460876c2cbb))

---
#### 凡例

|表記|意味|
|:------|:------|
|:four_leaf_clover:|新機能、大幅な仕様変更|
|`'hoge'`|オプション (`:h options`参照)|
|`:hoge`|Exコマンド (`:h :index`参照)|
|`hoge()`|組み込み関数 (`:h functions`参照)|
|`v:hoge`|Vim定義済変数 (`:h v:`参照)|
|`+hoge`|feature (`:h +feature-list`参照)|

---
#### 方針
[こちら](http://qiita.com/h_east/items/23cd0d10932505072e6b#%E6%96%B9%E9%87%9D)を参照。
🍺Python3でLRUキャッシュを用いてプログラムを高速化

　卒論でPythonのプログラムを回していたが時間がかかりすぎてうんざりしていた。Python初心者の僕がいろいろ調べていたら高速化のために以下の二つに関するポストが頻繁に見られた。

- Numba [Pythonを速くしたいときにやったこと -Numba編-
](https://qiita.com/open_cans/items/b6cde6c28f8eacba0ca1)など    
- Cython [Cythonの書き方入門[備忘録]](https://qiita.com/R-Imai/items/20c1a0a74824b6158fd4)など

　しかし、僕のプログラムに対してはこれらの高速化はそれほど効果はなかった。forで1万回、回したりするプログラムには効果が大きいっぽい。僕のプログラムはscipyの積分を多く回すようなプログラムで、積分の処理がボトルネックになっていると思われて効果は薄かった。

　そこで、**lru_cache**というものを発見した。

## LRUキャッシュ

　LRUとは、Least Recently Used の略である。メソッドのある引数に対する計算結果を保存しておき、後で同じ引数が与えられた時、計算結果を再利用するというものである。使い方はとても簡単で、ライブラリをimportしたあとに```@lru_cache```と関数の頭にデコレータをつけるだけでよい.```maxsize=None```はキャッシュできる量を表している。

　例えば、ポアソン分布を計算するループに関する実験を行う。jupyterでは、```%time```を実行するときつければ実行時間を計測してくれる。


```python3
from functools import lru_cache
# 上がうまく使えない場合、以下を使う(僕はうまくいかなかったのでこっちを使った)
# from functools32 import lru_cache 

@lru_cache(maxsize=None)
def poisson_probability_with_lru(n, t, lambda_poisson):
    return math.e**(-lambda_poisson * t) * (lambda_poisson * t)**n / math.factorial(n)

def poisson_probability_without_lru(n, t, lambda_poisson):
    return math.e**(-lambda_poisson * t) * (lambda_poisson * t)**n / math.factorial(n)

def test_with_lru():
    test_range = [10,20,30,10,20,30,40,50,60]*1000000
    count = 0
    for i in test_range:
        count += poisson_probability_with_lru(i, 10, 1)
    print count
    
def test_without_lru():
    test_range = [10,20,30,10,20,30,40,50,60]*1000000
    count = 0
    for i in test_range:
        count += poisson_probability_without_lru(i, 10, 1)
    print count

%time test_with_lru()
%time test_without_lru()

# ----------　出力------------

253952.576403
CPU times: user 7.35 s, sys: 103 ms, total: 7.45 s
Wall time: 7.46 s
253952.576403
CPU times: user 28.9 s, sys: 509 ms, total: 29.4 s
Wall time: 29.1 s

```

　ポアソン分布がどのような計算かわからなくても、LRUキャッシュによって高速化されていることがわかると思う。LRUキャッシュを用いた場合では実行時間7.45秒で、LRUキャッシュを用いない場合では実行時間は29.1秒である。積分の結果をキャッシュに保存すれば、実行時間を大きく短縮できることも期待できる。

[ポアソン分布については詳しくはこちら](https://qiita.com/k33asby/items/cb5857c7d96dae6832c6)
htmlのセレクトのオプションで改行(jQuery-ui widget)


#セレクトのオプションで改行
htmlのセレクトボックスの選択肢で改行するのは、デフォルトではサポートされていないのでjavascriptを使う必要があるみたいです。調べたところ、2つのjQuery-uiの拡張が見つかりました。

- Selectmenu: https://github.com/fnagel/jquery-ui/wiki/Selectmenu
- multilineSelectmenu: https://github.com/ainterpreting/jquery-multilineSelectmenu

シンプルな後者を使ってみます。これはjQuery-uiのwidgetの拡張を利用したものです。

<p data-height="265" data-theme-id="0" data-slug-hash="xYZrEy" data-default-tab="html,result" data-user="NomuraS" data-embed-version="2" data-pen-title="example" class="codepen">See the Pen <a href="https://codepen.io/NomuraS/pen/xYZrEy/">example</a> by NomuraS (<a href="https://codepen.io/NomuraS">@NomuraS</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

optionをjavascriptで後から追加した場合、下のようにdestroyを使ってリセットする必要があります([stackoverflow](https://stackoverflow.com/questions/48554875/how-to-handle-added-options-with-multilineselectmenu-jquery-ui-widget))。

```js:
$('#button').click(function(){
    $('#select').append($('<option>').html('line1 |  line2'))
    $("#select").multilineSelectmenu('destroy');
    $("#select").multilineSelectmenu();
})
```

#changeイベント
changeイベントの追加は、(multilineSelectmenuのベースである)jQuery-uiのselectmenuの場合は

```js
$('#select').on('selectmenuchange',function(){
     ...
})
```
で使えます([公式ドキュメント](https://api.jqueryui.com/selectmenu/))。追加optionに対してでなければ、

```js
$('#select').multilineSelectmenu({
    change: function(event,data){ 
        ...
    }
})
```


で使えます。ただ、独自のwiedgetで追加optionに対してchangeイベントを与える正当な方法がよく分かりませんでした。下記は、とりあえずの対処法で、ライブラリの3行目に処理を書きます。これでchangeイベントの同じ扱いができます。

```js
var multilineSelectmenu = $.widget("ui.multilineSelectmenu", $.ui.selectmenu, {
	_setText: function (element, value) {
        console.log($('#select').val()) // オプションを変更するたびに、$('#select').val()の値が変化する
		if (value) {
			if (value.indexOf('|') !== -1) {
				var lines = value.split('|');
				value = '<span class="ui-selectmenu-menu-item-header">' + lines[0].trim() + '</span>';
				for (var i = 1; i < lines.length; i++) {
					value = value + '<span class="ui-selectmenu-menu-item-content">' + lines[i].trim() + '</span>';
				}
			}
			element.html(value);
		} else {
			element.html("&#160;");
		}
	}
});
```

付け加えておくと、上の'|'(パイプ)を変更すれば改行する記号を変更できます。例えば、%などでも改行できます。
テキストエディタ「Atom」のカスタマイズ

# はじめに
Atomを数日使ってみて、使い心地がちょっとしっくりしてきたので、現時点（2018.2）でのカスタマイズをメモしておきます。
現時点でのAtomの用途は、主にMarkdown記法でのプログラミング学習のまとめや、Qiitaの下書きです。

# カスタマイズ内容
## Themes
### UI Theme
* [One Dark](https://atom.io/themes/one-dark-ui)（インストール済）：黒ベースのテーマ

### Syntax Theme
* [Kingfisher](https://atom.io/themes/kingfisher-syntax)：黒ベースのテーマ

## Editor
### Font Family
* [Myrica M](https://myrica.estable.jp/)：源真ゴシックをベースとした、半角と全角の横幅比が 1:2 のフォント（Myrica.ttc）

## Packages
### Community Packages
* [highlight-line](https://atom.io/packages/highlight-line)：選択行をハイライトしてくれる
* [highlight-selected](https://atom.io/packages/highlight-selected)：選択した単語が同じファイル内に複数あれば、それらをハイライトしてくれる
* [markdown-preview-enhanced](https://atom.io/packages/markdown-preview-enhanced)：Markdown＋α（図や数式）を表示できる
* [markdown-table-editor](https://atom.io/packages/markdown-table-editor)：Markdownでのテーブル作成が簡単にできる
* [minimap](https://atom.io/packages/minimap)：テキスト全体の位置を表示してくれる
* [minimap-autohide](https://atom.io/packages/minimap-autohide)：テキスト入力中はminimapを非表示にしてくれる
* [show-ideographic-space](https://atom.io/packages/show-ideographic-space)：全角スペースを可視化してくれる

### Core Packages
* [markdown-preview](https://atom.io/packages/markdown-preview)（無効）：markdown-preview-enhancedと競合するので無効にしておく
* [spell-check](https://atom.io/packages/spell-check)（無効）：文字の下に赤い点線が出るのがうざいので、無効にしておく

## その他
* [GraphViz](http://www.graphviz.org/)：markdown-preview-enhancedでPlantUMLを使用するためにインストールしておく

# おわりに
見た目はこんな感じです。
![0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/230850/12ee4016-65fd-5cb8-65bd-3492dcce00c0.jpeg)

やりだすとカスタム沼から抜けなくなってやばいです。
Eclipseをはじめてさわった時もそうでした。
ほどほどにしておきます。。。
【Java】Graphicsによるボタンの雛形クラス


Graphicsによるボタンの雛形クラス
プロパティXとYはボタンの中心位置
影，ホバーメソッド，プレスメソッド，クリック判定
抽象クラス化して，クリックメソッドつけてもOK



```GraphicBtn.java
public class GraphicBtn {
	int X, Y; //ボタン中心位置
	int w, h; //ボタン横幅，高さ
	String text; //ボタンテキスト
	Color btnC, textC; //ボタン色，文字色
	Font font; //テキストフォント
	boolean hover, press; //ホバー，プレス

	//コンストラクタ
	public Button(Game game,int x,int y,int w,int h,
					String text,Color btnC,Color textC,Font font) {
		X = x;
		Y = y;
		this.w = w;
		this.h = h;
		this.text = text;
		this.btnC = btnC;
		this.textC = textC;
		this.font = font;
		hover = false;
		press = false;
	}
	//描画メソッド
	public void draw(Graphics g,Canvas canvas) {
		g.setColor(btnC.darker());
		g.fillRoundRect(X-w/2, Y-h/2+5, w, h, 10, 10);
		g.setColor(btnC);
		g.fillRoundRect(X-w/2, Y-h/2+(press?2:0), w, h, 10, 10);
		g.setColor(textC);
		if(hover) setAlpha(g,180);
		drawStrCenter(g,X,Y+(press?2:0));
	}
	//テキストの中央表示
	public void drawStrCenter(Graphics g,int x,int y){
		g.setFont(font);
		FontMetrics fm = g.getFontMetrics();
		Rectangle rectText = fm.getStringBounds(text, g).getBounds();
		x = x-rectText.width/2;
		y = y-rectText.height/2+fm.getMaxAscent();
		g.drawString(text, x, y);
	}
	//アルファ値のみ変更
	public void setAlpha(Graphics g, int alpha) {
		int R = g.getColor().getRed();
		int G = g.getColor().getGreen();
		int B = g.getColor().getBlue();
		g.setColor(new Color(R, G, B, alpha));
	}
	//ホバーメソッド
	public void mouseMoved(int x,int y) {
		if(X-w/2 < x && x < X+w/2 && Y-h/2 < y && y < Y+h/2) {
			hover = true;
		} else {
			hover = false;
			press = false;
		}
	}
	//プレスメソッド
	public void mousePressed(int x,int y) {
		if(hover) press = true;
	}
	//リリースメソッド
	public void mouseReleased(int x,int y) {
		press = false;
	}
	//クリック判定
	public boolean isClick(int x,int y) {
		if(X-w/2 < x && x < X+w/2 && Y-h/2 < y && y < Y+h/2) {
			return true;
		}
		return false;
	}
}
```
TwitterKit iOS 利用時の Request failed: forbidden (403) への対処

TwitterKitを用いて開発を行っている際にTwitterのAPIを叩くと、下記のようなエラーが発生することがある。

```
Error 
  Domain=TwitterAPIErrorDomain
  Code=99 "Request failed: forbidden (403)" 
  UserInfo={
    NSLocalizedFailureReason=Twitter API error : Unable to verify your     credentials (code 99), 
    TWTRNetworkingStatusCode=403,
    NSErrorFailingURLKey=https://api.twitter.com/oauth2/token, 
    NSLocalizedDescription=Request failed: forbidden (403)
}
```

設定は正しいはずなのにこのエラーが頻発する際は、アプリ内で使用しているConsumerKeyを再生成し、設定し直すことで直る。


また、iOS Simulator での開発中であれば
`Hardware` > `Erase Al Content and Setting`
から端末リセットを書けることでも直る。

<img width="283" alt="Screen Shot 2018-02-03 at 0.34.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/37053/7aae61bc-50c9-b6ef-cd3f-c5623d40790c.png">



---

[参考]
https://stackoverflow.com/questions/44535636/twitter-kit-error
縦横ローテーション


代入は定数のみという縛り.

```rb:tyama_henaf09.rb
#!/usr/bin/env ruby
#https://qiita.com/Nabetani/items/61e13fa5cf0abe5979be
#http://nabetani.sakura.ne.jp/hena/ordf09rotbox/

T={
'a'=>lambda{|e|e.tap{|_|_[0].rotate!(1)}},
'b'=>lambda{|e|e.tap{|_|_[1].rotate!(1)}},
'c'=>lambda{|e|e.tap{|_|_[2].rotate!(1)}},
'd'=>lambda{|e|e.transpose.tap{|_|_[0].rotate!(-1)}.transpose},
'e'=>lambda{|e|e.transpose.tap{|_|_[1].rotate!(-1)}.transpose},
'f'=>lambda{|e|e.transpose.tap{|_|_[2].rotate!(-1)}.transpose},
'g'=>lambda{|e|e.tap{|_|_[2].rotate!(-1)}},
'h'=>lambda{|e|e.tap{|_|_[1].rotate!(-1)}},
'i'=>lambda{|e|e.tap{|_|_[0].rotate!(-1)}},
'j'=>lambda{|e|e.transpose.tap{|_|_[2].rotate!(1)}.transpose},
'k'=>lambda{|e|e.transpose.tap{|_|_[1].rotate!(1)}.transpose},
'l'=>lambda{|e|e.transpose.tap{|_|_[0].rotate!(1)}.transpose},
}

$<.each{|e|($><<e.chomp.chars.reduce([[1,2,3],[4,5,6],[7,8,9]]){|s,e|T[e][s]}.map{|e|e*''}*'/'+"\n").flush}
```
gcloudの自分用メモ

#自分用GCPメモ
###初めてGCPを触ったので、その時に使ったコード諸々の自分用のメモです（間違ってるのもあるかも）

##共通

###デフォルトプロジェクトの切り替え
```
$gcloud config set project プロジェクト名
```

###アカウントの切り替え
```
$gcloud config set account アカウント名
```

###アカウントの認証
```
$gcloud auth login
```

###認証済みのアカウントのリストを見る
```
$gcloud auth list
```

##GAE編

###アプリをデプロイする
```
$gcloud app deploy
```

###サーバーを立ち上げて、アプリをテストする
```
$dev_appserver.py
```

##GCE編

###[INSTANCE_NAME]にSSH接続する
```
$gcloud compute ssh インスタンス名
```

###SSHキー(暗号化方式はRSAで)の発行
```
$ssh-keygen -t rsa -C アカウント名
```

###既存のSSHキーの確認
```
$ls -al ~/.ssh
```
vue-routerやnuxt.jsのqueryでの遷移で再レンダーが走らない時の対処法

# 下記の様なリンクを作ったときに再レンダーしない時の対処法
```
<router-link :to="{path: hoge, query: {name: `${fuga}`}}">
  {{ fuga }}へ
</router-link>
```

## vue-routerの場合
```
<router-view :key="$route.fullPath" />
```
とすると良いらしい。

## nuxt.jsの場合
layoutディレクトリの`<nuxt />`に設定する

``` default.vue
<template>
  <nuxt :nuxt-child-key="$route.fullPath" />
</template>
```

nuxtで動的ページ扱いにすればいい話なんだけど、検索クエリでも再レンダーしたくて困ったけど解決できた。
数値計算を自力でしているコードをNumPyにさせるようにしたら700倍速くなった話

# 話の経緯

某「○○さんのプログラムブラッシュアップしてほしいんだ」
私（ブラッシュアップとはまた抽象的な）「わかりました」

で、

○○さん「・・・ということをするプログラムなんです」
私「なるほど。で、（引数が多すぎるとかいろいろツッコミたいのは置いといて）ブラッシュアップって具体的に何したらいいんだろう」
○○さん「何したらいいんですかね。あ、このプログラムすごい実行に時間がかかるんですが」
私「ほうほう（プログラムを眺める）」

```py:大体こんな感じのコードが書かれてました
def calc(d, a, x1, x2, x3):
    sum_ = 0
    for i in range(len(d)):
        sum_ += (d[i] - (a[0]*x1[i] + a[1]*x2[i] + a[2]*x3[i]))**2
    return sum_
```

私（´・ω・｀）
○○さん（´・ω・｀）
私「この、d, a, x1, x2, x3って（話聞いてる限りだと）NumPy配列だよね」
○○さん「ええ多分」
私「なんで自力で計算してるの？」
○○さん「え？」

というわけで上記のコードを爆速化する方法です。

# 行列演算に直すんだ！

私「Pythonは遅い。特に関数呼び出しはすっごく遅い。後、この要素アクセスなんだけどこれ実体はメソッド呼び出しだからむっちゃコストがかかってる。一方でNumPyは速い。数値計算を速くするために作られたものだからすごい速い。つまり、Pythonの世界に持ってきて自分で計算なんてしないでNumPyにやらせればいい。これって積和の計算だからNumPyで計算できるはず」
○○さん「はあ」
私「えーと、aが3要素で、x1, x2, x3は、iでインデックスしてるんだしdと同じ要素数か（Nとする）。てことは、こいつらまとめて3×N行列にできるよね（Xとする）。そうすればaとXで行列計算できる」
○○さん「はあ」
私「後はx1, x2, x3を一つの行列にまとめる方法がわかればいいんでけど、concatenateか？んー、shapeが(N,)だからうまくいかない、(1,N)にreshapeすればいいかな」
○○さん「・・・」
私「行列計算により、1×N行列、まあN要素のベクトルになるわけだけど・・・、dから計算値を引くのも、差分を二乗するのも、和を取るのもNumPyで完結できるな」
○○さん「・・・・・・」
私「まあ私が書いちゃうと、こんな感じ」

```py
def calc_improve(d, a, x1, x2, x3):
    x = np.concatenate((
        x1.reshape(1, -1),
        x2.reshape(1, -1),
        x3.reshape(1, -1)
    ))
    return np.sum((d - np.dot(a, x))**2)
```

# 本当に速くなったか計ってみよう

さてというわけで自力で書いてたコードをNumPyだけで計算が完結するように書き換えました。時間の都合で○○さんプログラムでは速度比較できなかったのですが`calc`と`calc_improve`でどれぐらい速くなったか比べてみましょう。え？タイトルでネタバレしてる？(笑)
念のため、計算結果が変わらないかも確認しましょう。なお実行時間だけわかればいいので計算させてるデータは適当です。

```py
LOOP = 100
SIZE = 10000
d = np.arange(0, SIZE*0.1, 0.1)
x1 = np.arange(SIZE*1*0.1, SIZE*2*0.1, 0.1)
x2 = np.arange(SIZE*2*0.1, SIZE*3*0.1, 0.1)
x3 = np.arange(SIZE*3*0.1, SIZE*4*0.1, 0.1)
a = np.array([1, 2, 3])

print(calc(d, a, x1, x2, x3))
print(calc_improve(d, a, x1, x2, x3))

import time

elapsed = []
for l in range(LOOP):
    start = time.time()
    calc(d, a, x1, x2, x3)
    end = time.time()
    elapsed.append(end - start)
print(np.average(elapsed))

elapsed = []
for l in range(LOOP):
    start = time.time()
    calc_improve(d, a, x1, x2, x3)
    end = time.time()
    elapsed.append(end - start)
print(np.average(elapsed))

```

結果です。

```
2743250833749.798
2743250833749.2515
0.7366799211502075
0.0009990835189819336
```

計算結果（上2行）微妙にずれてるけど、まあ誤差の範囲だしむしろ自力計算の方が間違ってる気はする。
で、実行時間ですが、

```
>>> 0.7366799211502075 / 0.0009990835189819336
737.3556936469981
```

圧倒的ですね。ここまで速くなるとは思いませんでした。

# おわりに

というわけで今回は改善をお願いされたプログラムを爆速化してみました。
まあ爆速化というよりそもそもNumPyのことがわかってなくて自力で書いていたのが原因ですが、NumPyだけで計算が完結できるように書くと非常に高速に計算ができるいうことがおわかりいただけたかと思います。
Badam ke fayde

इस पोस्ट में आपको  <a href="https://hindiinformations.com/badam-ke-fayde">Badam ke fayde</a> बताऊंगा | बादाम खाने के कई फायदे हे बादाम खाने से दिमाग तेज होता हे और भी कई फायदे हे रोजाना बादाम खाने से सेहत अच्छी बनी रहती हे बादाम में कई पोषक तत्व होते हे तो आपकी हेल्थ को अच्छा बनाते हे
WPFでSizeToContentを使うとLoadedイベントが呼ばれないことがある

# Loadedイベントの処理がなぜか動かない
なぜかWPFのある画面でだけLoadedイベントの処理が呼ばれず、エラーにもならないという現象が発生しました。全然理由が分からなかったのですがどうも以下の現象のようです。

[Existence of SizeToContent in XAML breaks Loaded Event of window](https://github.com/Microsoft/dotnet/issues/429)

日本語の情報がなさそうだったので、もしかしたら同じ現象に遭遇した方の助けになるかもしれないので記事に残しておきます。

# 現象の起きる条件
上記のGithubのページによると、以下を満たしている時に、Loadedイベントの処理が呼ばれないことがあるようです。

* SizeToContentプロパティでManual以外を指定している
* EventTriggerでLoadedイベントをフックしている
* ~~.NET Framework 4.7より前？（厳密なバージョンは不明です）~~ [^1]

残念ながら上記の条件は完全ではないようで、上記を満たしていてもコードの書き方によっては起きなかったりもします。現象の本質としてはLoadedイベントが呼ばれていないのではなく、Loadedが起きてからイベントがバインドされてしまっているのだと推測されます。そのため、微妙な書き方の差で起きたり起きなかったりするのだと思われます。上記のGithubのIssueに添付されているサンプルプロジェクトは社内の.NET 4.6.2環境でも現象が再現しました。

# 対処法
以下のような対処法が考えられます。
※すみませんが責任は負いかねますので、採用するかは各自ご判断ください。

1. ~~.NET 4.7以降にする？（絶対直るのかは不明・・・）~~　[^1]
2. SizeToContentを使うのをあきらめる
3. LoadedではなくContentRenderedイベントを使う
4. EventTriggerではなくコードビハインドでLoadedイベントを実装する

[^1]: コメント欄にてご共有いただきましたが、.NET Framework 4.7.1でも発生するようです。そのため、こちらは対処法とは捉えない方が無難そうです。
Processing - 05 - textとrandomを使った描画

![スクリーンショット 2018-02-02 23.06.57.png](https://qiita-image-store.s3.amazonaws.com/0/45520/1ef143ce-3204-fa97-0ab3-2ac448777f2e.png)


```java
void setup() {
  size(500, 500);
  background(255);
  frameRate(20);
}

void draw() {
  fill(random(70,250),50);
  textSize(random(10, 36));
  text(int(random(10)), random(width), random(height));
}
```
MacにPython3をインストールしようとしたら2.7だったのでバージョン変更したよ

# オライリージャパンの手順にしたがってPythonをダウンロードしてみる
AIを勉強したいと思い、いろいろとイベントを探っていたら、こちらの本は必須とのことだったので、読むことにした。
![o'reilly-DeepLerning.jpg](https://qiita-image-store.s3.amazonaws.com/0/222672/d0599a73-4427-ed47-1a08-34dba7e8bf3d.jpeg)

http://amzn.asia/2ZxyGc1

## バージョンを確認したら2.7と出た
機械学習ならPythonということで、Pythonをダウンロードすることに。

書籍が推奨するanacondaにて、これまた推奨のPython3をダウンロード。

ベージョンチェックすると…Python2.7と出る。

え？どうして？？？

## Macにはデフォルトで2.7がダウンロードされているらしい

いろいろ調べていたら、MacにはデフォルトでPythonがダウンロードされた状態なんだと。

Macは購入時に余計なソフトとか入っていない点が好きな理由の一つだったけど、実は色々入ってるんだ！と初めて知った。

ちなみに記事を書いている時点では、Python2.7がデフォルトでした。

Python2.7は、2020年までサポート対象らしいですよ。

## 便利な記事を見つけて無事Python3にバージョン変更できた。
バージョン2.7→3に変更したかったので、いろいろ調べていたら、とっても便利な記事を見つけました。グラフブースの中山さん、ありがとうございます。
参照：http://graphbooth.com/2017/05/31/pythonmac.html
>
### おおまかな流れ
1.念のためバージョンの確認
2.Xcodeをインストール
3.Homebrewをインストール
4.pyenvをインストール
5..bash_profileの編集
6.pyenvでPython3.xをインストール
7.最後に確認
>
### 手順
1. SierraにインストールされているPythonのバージョンを下記コマンドで確認 
```python --version```
Pyton2.xで返ってきたら3.xをインストールする準備へ。
>
2. Xcodeをインストールしていない場合は、App Storeからダウンロード
導入が終わったらCommand Line Toolsもインストールしておきます。
```xcode-select --install```
>
3. つぎにHomebrewをインストール
Homebrewはソフトやライブラリを簡単にインストール＆アンインストールできるmacOS用パッケージマネージャーです。とても便利なのでいれておきます。ターミナルに下記コマンドをコピペ+enterでインストールが開始されます。 
```/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" ```
終わったら正常にインストールされているか確かめます。
```brew -v```
バージョンが返ってくればOK。
>
導入エラーチェックをするときは
```brew doctor```
>
4. pyenvをインストール 
pyenvはPython環境を管理できるツールです。これをいれておくと複数のバージョンのPythonのインストールや切り替えが簡単にできます。 
```brew install pyenv```
>
5. .bash_profileの編集 
「.bash_profile」はbashシェル実行時に読まれる環境設定ファイルです。これを編集しておかないと、Python3.xを入れても動いてくれません。 
.bash_profileがあるか確認します。
```ls -la```
あれば問題無し。
なかったら下記コマンドで作っておきます。
```touch .bash_profile```
viで編集。
```vi .bash_profile```
下記のコマンドを書き込んで保存します。
```export PATH="$HOME/.pyenv/shims:$PATH"```
編集した内容を反映させます。
```source .bash_profile```
編集したpathが通っているかを確認。
```echo $PATH```
pathが通っていればOKです。
>
6. pyenvでPython3.xをインストール
インストール可能なPythonのバージョンを見ます。
```pyenv install -l```
例えば、バージョン3.5.1を入れたい場合は
```pyenv install 3.5.1```
インスートールが終了したらPython3.5.1を実際に使える状態にします。
```pyenv global 3.5.1```
>7. 最後に確認
正常にインストールできたかを確かめます。
```python -V```
指定してインストールしたpythonのバージョンが返ってくればOK。

## 僕はここでひっかかった
上述の3
>例えば、バージョン3.5.1を入れたい場合は
>pyenv install 3.5.1

このコマンドを入れた後に、
```continue with installation? (y/N) ```
と、説明が出ているので、見逃していた。

```y + Enter```
でインストールが始まった。よかった。

やっとPythonを使って実践に入れます。長かった。

そして、憧れのQiita初投稿。地元名古屋の雄A-Team傘下になったのもQiitaを使おうと思っている理由の一つ。
repoのインストール 2018年最新版

repoのインストール方法の2018/2/2付の最新版

端末から
$ repo init
と打ち込むだけ

```shell-session
admini@admini-VirtualBox:~$ repo 
error: repo is not installed.  Use "repo init" to install it here.
admini@admini-VirtualBox:~$ repo init
Get https://gerrit.googlesource.com/git-repo/clone.bundle
Get https://gerrit.googlesource.com/git-repo
fatal: manifest url (-u) is required.
admini@admini-VirtualBox:~$ repo version
repo version v1.12.37
       (from https://gerrit.googlesource.com/git-repo)
repo launcher version 1.23
       (from /home/admini/bin/repo)
git version 2.7.4
Python 2.7.12 (default, Nov 20 2017, 18:23:56) 
[GCC 5.4.0 20160609]
```
Python の with 文のためのクラス

処理を終える際に実行すべき処理を書く構文が多くの言語にある。

Java なら try with resources。
C# なら using ステートメント。

Python には with ステートメントがある。

with ステートメントに供するクラスは２つのメソッド `__enter__` と `__exit__` を用意する必要がある。

# with + コンストラクタ

```python:python
class WithClass:
  def __init__(self):
    print("init")

  def hoge(self):
    print("hoge")

  def __enter__(self):
    print("enter")
    return self

  def __exit__(self, ex_type, ex_value, trace):
    print("exit: ", ex_type, ex_value, trace)

with WithClass() as w:
  w.hoge()
```

こんな感じになる。

実行すると

```
init
enter
hoge
exit:  None None None
```

と出力される。

私が最初気づかなかったのは、 `__enter__(self)` の返戻値が `w` の値になるという点。
だから、 `return self` は必須。

# with + 非コンストラクタ

もうひとつのパターンは、`with open(filename) as f:` のように、コンストラクタではないメソッドがある場合。

```python:python
class WithClass:
  def __init__(self):
    print("init")

  def hoge(self):
    print("hoge")

  def __enter__(self):
    print("enter")
    return self

  def __exit__(self, ex_type, ex_value, trace):
    print("exit: ", ex_type, ex_value, trace)

def creator():
  return WithClass()

with creator() as w:
  w.hoge()
```

こんな具合。
このパターンでも `__enter__(self)` は必須。
`w`の値は `__enter__(self)` の返戻値になる。 `create()` の返戻値ではない。

というわけで、出力されるのは

```
init
enter
hoge
exit:  None None None
```

と、最初の例と同じになる。

`__enter__(self)` の返戻値を `self` 以外にしたくなる局面が思いつかないんだけど、きっとなにかあるんだろう。

# 例外が起きる場合

で。例外を起こしてみる：

```python:python
class WithClass:
  def __init__(self):
    print("init")

  def hoge(self):
    print(1/0) # ゼロ除算！

  def __enter__(self):
    print("enter")
    return self

  def __exit__(self, ex_type, ex_value, trace):
    print("exit: ", ex_type, ex_value, trace)
    print("---")

with WithClass() as w:
  w.hoge()
```

すると、出力はこんな風に

```
init
enter
exit:  <class 'ZeroDivisionError'> division by zero <traceback object at 0x1092539c8>
---
Traceback (most recent call last):
  File "with3.py", line 16, in <module>
    w.hoge()
  File "with3.py", line 6, in hoge
    print(1/0)
ZeroDivisionError: division by zero
```

なる。
ここで、 `__exit__(self,略)` で `True` を返すと例外を握りつぶしてくれる。

こんな具合：

```python:python
class WithClass:
  def __init__(self):
    print("init")

  def hoge(self):
    print(1/0) # ゼロ除算!

  def __enter__(self):
    print("enter")
    return self

  def __exit__(self, ex_type, ex_value, trace):
    print("exit: ", ex_type, ex_value, trace)
    print("---")
    return True

with WithClass() as w:
  w.hoge()
```

出力は

```
init
enter
exit:  <class 'ZeroDivisionError'> division by zero <traceback object at 0x10885e9c8>
---
```

となっていて、例外が握りつぶされていることがわかる。

# 参考サイト：

http://shin.hateblo.jp/entry/2013/03/23/211750
http://reiki4040.hatenablog.com/entry/20130331/1364723288
V-USBでタイミングクリティカルな処理を行う。

###V-USBを使ってタイミングクリティカルな処理を行う方法。
V-USBを使用するにあたってインタラプト転送で使用する場合約10msごとにUSBの割り込みが発生し他のデバイスなどと通信中に割り込みが発生すると問題が起きるので、処理を割り込みに同期させて問題を回避しました。

例えばAppleの旧規格のキーボード(ADB)のUSBコンバーターなどを作ろうとすると、キーボードにコマンドを送信してデータの受信までにUSBの割り込みが発生した場合データを取りこぼしてしまいます。
これを避けるためUSBの割り込み発生時にフラグを立て、次の割り込みが発生する前に処理を終了させることで問題を回避させてみました。

V-USBはかなりタイミング的にシビアなコードなのでフラグを立てるコードで問題が起きないようにvusb/usbdrv内のusbdrvasmXXX.inc（クロック依存のインクルードファイル）内でUSB_INT_VECTOR:のすぐ後で最初のタイミング合わせている辺りが良いでしょう。

```usbdrvasmXXX.inc

waitForJ:
    inc     YL
    sbis    USBIN, USBMINUS
    brne    waitForJ        ; just make sure we have ANY timeout
waitForK:
;The following code results in a sampling window of 1/4 bit which meets the spec.

     ldi x4,1        ＜ここでフラグを立てる
     sts adbSend,x4

    sbis    USBIN, USBMINUS
    rjmp    foundK
    sbis    USBIN, USBMINUS
    rjmp    foundK
    sbis    USBIN, USBMINUS
    rjmp    foundK
    sbis    USBIN, USBMINUS
    rjmp    foundK
    sbis    USBIN, USBMINUS ;[0]
    rjmp    foundK          ;[1]
```


usbdrvasmXXX.incはusbdrvasm.Sでインクルードされるのでフラグの変数をexternしておきます。

```usbdrvasm.S

    extern  usbRxBuf, usbDeviceAddr, usbNewDeviceAddr, usbInputBufOffset
    extern  usbCurrentTok, usbRxLen, usbRxToken, usbTxLen
	extern  usbTxBuf, usbTxStatus1, usbTxStatus3
	extern  adbSend  ＜これ
```

main.cでフラグの宣言しておきます、volatile宣言を忘れずに。

```main.c
volatile uchar adbSend = 0;
```

main内でフラグが立ったら割り込みから復帰直後と判断しフラグをクリアして処理を行います、次の割り込みまでの8msぐらいの処理ならこの様にして同期すれば問題は起きません。

```main.c
	  usbPoll();
	  if (usbConfiguration && usbInterruptIsReady()) {
	  
	    if(adbSend == 1){
	 
	      adbSend = 0;   /*フラグをクリア*/
             メインの処理
```

Atmega328を使ったADBtoUSBコンバーター
![SANY0056.JPG](https://qiita-image-store.s3.amazonaws.com/0/205783/eccf3ea1-1174-da0e-c864-69c90edfa71b.jpeg)
WebUIにおける操作を自動化したい

#目的
##WebUIにおける操作を自動化したい
#モチベーション
##限定された環境下で作業を効率化したい
Webから色々操作する社内ツールがありがちだが
正直マウスでカチカチやるのは疲れる。
特に定常的に行う作業などは、ツールで単純化したいと思った。
社内だとツールの制限等があり、デフォルトの状態のマシンで
行えるコマンドのみで、目的の達成を果たす。
環境としては、Linuxが使えることを想定する。

#シーン想定1
##特定のWebサイトの情報を一部抜粋して表示
###方法

curlで取得する

```shell:bash
curl http://hogehoge.com
```

#シーン想定2
##特定のWebサイトの情報を一部抜粋して表示(認証付きページ)
###方法

curlで認証情報を取得後、本来みたいページを取得
認証に必要な情報を送信することで、クッキーとして認証情報が受け取れる場合の例

```shell:bash
curl http://authhoge.com -c cookie -X POST -d "認証に必要な情報" 
curl http://lockedhoge.com -b cookie
```