OmniAICreator/Qiita-1.07M huggingface dataset:
PyMieScatt > example > ScatteringFunction() > SL, SR, SU

```txt:Environment
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
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
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

### Reference

- Bohren C.F. and D. R. Huffman, "Absorption and Scattering of Light by Small Particles", John Wiley, New York, NY (1983)
- PDF: [MATLAB Functions for Mie Scattering and Absorption, Research Report No. 2002-08, June 2002](https://omlc.org/software/mie/maetzlermie/Maetzler2002.pdf) by Christian Mätzler


### ScatteringFunction

http://pymiescatt.readthedocs.io/en/latest/forward.html#ScatteringFunction


### code

On Jupyter Notebook

```py:test_ScatteringFunction_180407.ipynb
%matplotlib inline
import PyMieScatt as PMS
import matplotlib.pyplot as plt
import numpy as np
from pylab import rcParams

# to enlarge figure
rcParams['figure.figsize'] = 10, 4
rcParams['figure.dpi'] = 110

m = 1.55 + 0.001j
wavelength = 10.
diameter = 5.

res = PMS.ScatteringFunction(m, wavelength, diameter)
thetas, SLs, SRs, SUs = res

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

ax.plot(thetas, SLs, label='SL')
ax.plot(thetas, SRs, label='SR')
ax.plot(thetas, SUs, label='SU')

ax.set_title('SL, SR, SU (m=1.55 + 0.001j, wv=10nm, dia=5nm)')
ax.set_xlabel('Theta(rad)')
ax.set_xlim(0, np.pi)
ax.legend()

```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/48f402b4-905a-1f58-04a3-bbc372b8563a.png)
都道府県名、区市町村名から市町村コードを吐き出す関数を考えてみたものの

[市町村コードの対応データをjsonで書きだしてみる \- Qiita](https://qiita.com/sin164/items/f33bf2d0ec3d43994228)で全国地方公共団体コードjsonができたので、都道府県名、区市町村名から市町村コードを吐き出す関数を考えてみた。

```php:address2citycade.php
<?php
function address2citycade($prefname, $cityname)
{
$req =  'citycode.json';
$json = file_get_contents($req);
$json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
$addcode = json_decode($json, true);
$prefid = array_search($prefname, array_column($addcode,'pref-name', 'pref-code'));
$sitycode = strval(array_search($cityname, array_column($addcode[$prefid]['data'],'name', 'id')));
return $sitycode;
}

echo address2citycade("東京都","新宿区");
```
こんな感じで良いかな、と思っていたら、同一都道府県に同一名称の区があるところがあるんですね。
[同一都道府県内の同一名称の市区町村（市区町村雑学）](https://uub.jp/zat/kendoitsumei.cgi)
神奈川県の横浜市南区と相模原市南区
同じく横浜市緑区と相模原市緑区
大阪府の大阪市西区と堺市西区
大阪市北区と堺市北区

以上4組

同一都道府県の同一市町村名に関しては、以前はあったらしいけれど、現在はないらしいので良さそう。

それにしても、さてどうしましょ？
新人向けの記事をみて触発されて（以下略

現場でJBoosEAPにEclipseから接続できなくて四苦八苦している新人エンジニアです。
みなさまこんにちは

[前回](https://qiita.com/aniAsWhiz/items/15a8cfcc90efd08c9ff2)の投稿に反応いただいた方ありがとうございました。
「具体的なスケジュールを組んでおかないと実現は難しいんじゃないか？」
というご指摘をいただきました。誠にその通りです。
投稿に対してなにか反応があるというのはとても嬉しいですね！

という訳で、今回は目標のスケジュールと、環境構築の途中まで書きます。

#目標達成に向けてのスケジュール
[これ](https://qiita.com/aniAsWhiz/items/15a8cfcc90efd08c9ff2)の投稿て記載した目標について、半期で達成するためのスケジュールを組んでみます。
項目は前投稿と同じです。

１.エンジニアの友達を作る
　のっけからスケジュールが立てずらい（笑）
友達ができるかは時の運なので、そのための行動を考えます。
4月中は何かと忙しそうなので、5月のGW明け頃にまず一回勉強会に参加したいと思います。
5月中に二回はそういった集まりに参加して、様子を見て継続して参加するか、別のアプローチをするのかを考えることにします。

２．自宅にwedサーバーとアプリケーションサーバーを立てる
　これに関しては着手し始めてしまっているのですが、
研修で一度やったことがあるらしいので（当時は何をしていたのか全く理解できていなかったため忘れていた）
Webサーバに関しては構築事態はそんなに大変じゃないかと思うのですが、どんなものがいいかを選定する時間を取りたいです。
なので、4月中旬くらいまでに立てられればいいかなと思います。
あと、次の目標で必要になるDBの構築もやってしまいたいなと思っています。

３．javaで動くwedアプリをサーバーで動かしてみる
　前回、何を動かすかに全く触れなかったのですが、研修でサーブレットとjspを使った掲示板もどきを作っています。
当時はeclipse上のTomcatで動かすだけだったので、練習がてらこれをサーバ上で動かしてみたいと思います。
ものとしてはフォームに入力して登録を押すとDBに登録されて一覧に出るようになる～くらいのものなので、
セッションの追加やログイン機能の追加なんかがついでにやれたらいいなと思っています。
期間は5月いっぱいか、6月頭くらいまでにできたらいいかなと思います。

４．java以外の言語を味見してみる
　具体的にどの言語をやるかまだ決まっていないのですが、これは目標３．が終わった後からの着手の予定です。
javaも初心者なのに一度に別の言語勉強し始めたら頭が爆発してしまうのでね！
このころにはLinuxサーバなどなど使えるようになっていると期待して、簡単なWebアプリ作成までこぎつけたいですね。
ボタン押したらHello World!!ってでるだけでも良いので。
これはみっちり時間をかけて、6月から9月まで、半期いっっぱいやろうかと思います。

５．GoogleHomeとアレクサを使って自宅のスマートhome化を進める
　これに関してはおまけくらいの感じなので、暇をみてちまちま進めていきます。
学習リモコン自作をほんとにやるなら、まとまった時間ほしいからGW中かな…
電源抜かれっぱなしだったアレクサ氏はさっき久々に電源さしてあげました。
~~（もし夜中に笑い出したら息の根を止めてやる）~~

さてさて、長くなりましたがスケジュール感はこんな感じで行きたいと思います。
Qiita投稿も、週１以上くらいのペースでできるように作業を進めていきたいです。
（作業進まないとポエム投稿だらけになるからね）

#目標進捗
ほんとは今回の投稿はこれがメインコンテンツの予定だった…‼
長くなりすぎたので分けます…
ざっくりと

作業環境構築（物理）
  ‐電源確保と机移動
↓
作業環境構築
  ‐eclipseインストール
  ‐VMwearインストール
  ‐CentOS使ってLinuxVMの立ち上げ

ここまで終わりました！

wedサーバー立てるところまではスムーズに行きたい！

以上長くなりましたがここまで読んでいただいてありがとうございます。
サーバー立てるぞー！！
【Sublime Text3】少しでも快適にコーディングをするためにしてる設定

# ◯ショートカットキー
「Preferences」>「Key Bindings」
デフォルトで設定されているものを上書きしてる形です。

・**フォルダを開く（Alt + g）**
```"keys": ["alt+g"], "command": "prompt_open_folder"```

・**サイドバーにフォーカスを当てる（Alt + s）**
```"keys": ["alt+s"], "command": "focus_side_bar"```

・**サイドバーを閉じる（Alt + x）**
```"keys": ["alt+x"], "command": "toggle_side_bar"```

# ◯Sublime自体の設定
「Preferences」>「Settings」

・**エディタをまっさらな状態で起動させる**
```"hot_exit": false,
"remember_open_files": false,
```
デフォルトの設定では、起動時は
前回エディタを閉じたときの状態が復元される形になります。
（続きから作業するのが楽になります。）

## ◯終わりに
必要最低限、、、
とはいえ、これ以上要る？ってのが現状でもあります。。
市町村コードの対応データをjsonで書きだしてみる

住所から市町村コードを取得したいと思っていろいろ試行錯誤中。

そのあたりのライブラリがありそうだと思うのですが見つけられませんでした。

とりあえずまずは全国地方公共団体コードの対応データが必要かなと思って探してみたら
[【JSON】都道府県市区郡一覧作ってみた \- Qiita](https://qiita.com/next1ka2u/items/1d7e63c37d9a205219b6)
も見つけたのですが、欲しかったのが郡でなく町村だったので探索続行。

しばらく探してみると
[都道府県内市区町村一覧取得API　｜　国土交通省　土地総合情報システム](http://www.land.mlit.go.jp/webland/api.html#todofukenlist)
を見つけたので、このAPIから市町村コードの対応データをjsonで書きだすPHPを書いてみました。

```php:citycode.php
<?php
$pref_ids= array(
  "01" => "北海道",
  "02" => "青森県",
  "03" => "岩手県",
  "04" => "宮城県",
  "05" => "秋田県",
  "06" => "山形県",
  "07" => "福島県",
  "08" => "茨城県",
  "09" => "栃木県",
  "10" => "群馬県",
  "11" => "埼玉県",
  "12" => "千葉県",
  "13" => "東京都",
  "14" => "神奈川県",
  "15" => "新潟県",
  "16" => "富山県",
  "17" => "石川県",
  "18" => "福井県",
  "19" => "山梨県",
  "20" => "長野県",
  "21" => "岐阜県",
  "22" => "静岡県",
  "23" => "愛知県",
  "24" => "三重県",
  "25" => "滋賀県",
  "26" => "京都府",
  "27" => "大阪府",
  "28" => "兵庫県",
  "29" => "奈良県",
  "30" => "和歌山県",
  "31" => "鳥取県",
  "32" => "島根県",
  "33" => "岡山県",
  "34" => "広島県",
  "35" => "山口県",
  "36" => "徳島県",
  "37" => "香川県",
  "38" => "愛媛県",
  "39" => "高知県",
  "40" => "福岡県",
  "41" => "佐賀県",
  "42" => "長崎県",
  "43" => "熊本県",
  "44" => "大分県",
  "45" => "宮崎県",
  "46" => "鹿児島県",
  "47" => "沖縄県"
);  
 
$city_code = [];
foreach ($pref_ids as $key => $value) {
  $req =  'http://www.land.mlit.go.jp/webland/api/CitySearch?area='.$key;
  $json = file_get_contents($req);
  $json = mb_convert_encoding($json, 'UTF8', 'ASCII,JIS,UTF-8,EUC-JP,SJIS-WIN');
  $addcode = json_decode($json, true);
  $city_code += array($key =>array("pref-code" => $key , "pref-name" => $value ,'data' => $addcode['data']));
}
 
$arr = json_encode($city_code,  JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
file_put_contents("citycode.json" , $arr);
```
これでとりあえずは全国地方公共団体コードjsonができたので、これを使って住所から市町村コードを取得できないか考えてみます。
Vsual Studio Codeでわからないこと

MacOS中心ですが，Visual Studio Codeでわからないこととわかったことをまとめてゆきます。


# Index

- 分からないこと
 - 改行マークの出し方
 - 用語
- 分かったこと
 - 設定ファイルの場所

# 分からないこと

## 改行マークの出し方が不明

この改行マークをどうやって出すのだろうか？（SSはSpacemacs）

![スクリーンショット 2018-04-07 9.22.24.png](https://qiita-image-store.s3.amazonaws.com/0/120396/209ada25-cec8-fdb1-a221-7326606ec55e.png)

Whitespace+でTrailを出せば擬似的に出ることは出ます。ただし縦棒になるのでカーソルを見失うのですよね。（SSはWhitespace+）

![スクリーンショット 2018-04-07 9.58.56.png](https://qiita-image-store.s3.amazonaws.com/0/120396/2b5f1037-d90c-34f1-a9d7-3e5a0c876ccc.png)

## IMEの状態に応じたカーソル変更方法が不明

やりたいことは，下記のように日本語入力状態に応じてカーソルの色を変えたい。
さらに言えばInsert状態でもカーソルを変えたい。

- 日本語入力＆挿入状態の時，カーソルを黒の棒
- 日本語入力＆上書き状態の時，カーソルを黒のブロック
- 英語入力＆挿入状態の時，カーソルを赤の棒
- 英語入力＆挿入状態の時，カーソルを赤のブロック



## 用語

エディタ？エディタグループ？ウィンドウ？パネル？ワークスペース？ペイン？

これが全然わからない。

分割した後分割やめるのもわからない。

グループは3個しか作れない？その内側にエディタ分割できる？



エディタ，サイドバー，パネルについて
http://www.atmarkit.co.jp/ait/articles/1507/10/news028_2.html


```
VS Codeでは実際に編集を行うファイルやウエルカムページなどを表示した1つ1つのタブのことを「エディタ」と呼び、それらを論理的なグループにまとめたもののことを「エディタグループ」と呼ぶ。
```

- エディタグループとグループは同じ？省略語？（グループというのはキーボード設定に出てくる言葉）

- 分割はグループ内とグループ間がある？
「エディタの分割」はどっちのこと？
＞右上アイコンによる「エディタの分割」は最大3個にしか分割できないので，グループが増える感じか？

この資料によるエディタグループというものは違う意味を示している気がする。
https://vscode-doc-jp.github.io/docs/getstarted/userinterface.html

図が悪いだけで同じことか。

```
エディターを分割(Split Editor, Open to the Side)することで、エディタグループを配置する新しいレイアウトを作成できます。VS Codeは左、中央、右の3つのエディタグループまで作成できます。
```

```
⌥⌘→ 次のエディターで開く
⌥⌘← 以前のエディターを開く
⌃Tab グループ内の最近使用したエディターのうち次のエディターを開く
⌃⇧Tab グループ内の最近使用したエディターのうち前のエディターを開く
⌘1 最初のエディタ グループにフォーカス
⌘2 2番目のエディタ グループにフォーカス
⌘3 3番目のエディタ グループにフォーカス
⌘K ⌘← 前のグループにフォーカス
⌘K ⌘→ 次のグループにフォーカス
⌘W エディターを閉じる
⌘K W グループ内のすべてのエディターを閉じる
⌘K ⌘W すべてのエディターを閉じる
```

次のエディタとか，以前のエディタの意味がわからないんだよね。
左のエディタとか右のエディタとかではないのかね？

「アクティブなエディタグループを閉じる」とかないのかね？

ファイルをドロップした時に勝手にエディタグループを作るのはなんでだろ？
＞タブのところに置くとエディタグループを作らないので，方法はあるはず。
＞エディタグループを作ってファイルを開くのがデフォルトっていうのが理解不能だし使いにくい。
＞なぜ分割しちゃうのがデフォルト？タブを増やすだけにしてほしい。

タブとエディタは同一なのかそうでないのか？
＞Emacsで言う所のバッファ，ウィンドウ，フレームの関係では整理できないのか？


# 分かったこと

## 設定のバックアップの仕方

よく話題に出るのは「Settings Sync」という拡張機能です。Githubを利用して拡張をそこに保存するという方法ですが，それすら自分には面倒臭いと思っているので設定ファイルの場所を調べました。

上から順番に，設定，キーバインド設定，拡張機能のインストール先です。これをコピーすれば設定をコピーできます。

```
~/Library/Application\ Support/Code/User/settings.json
~/Library/Application\ Support/Code/User/keybindings.json
~/.vscode/*
```
Rails/RSpec でテスト対象に応じて Log Level を切り替える

- 全体で RSpec を流したい時は `config.log_level = :warn`
- コケた Spec を単独で流したい時は `config.log_level = :debug`

としたい時、

```ruby
config.log_level = ARGV.length > 0 ? :debug : :warn
```

とすると切り替えできる。
Atom 32bit-uefi PCに64bit Ubuntuをインストールする 

#はじめに

Bay Trail、Cherry Trail世代のAtom 64bit PCのなかには、32bit-uefiを持つものがあり、Ubuntuのインストールを難しくしていた。

ここでは、Debian multiarchのブートローダをコピーして64bit Ubuntuをインストールする方法を紹介する。

#参考リンク

https://researchmap.jp/josqq508b-26434/ （32bit Ubuntuのインストール）

#手順

- 32bit-uefi PCのBIOSのSecure Bootをoffにする
- fat32でUSBメモリをフォーマット
- 64bit Ubuntu、Debian multiarchのisoをダウンロードする（今回はLubuntuを使った）
- 別のUbuntu機でisoをマウントする

sudo mkdir /mnt/ubuntu64
sudo mkdir /mnt/debian-multiarch

sudo mount -o loop lubuntu-17.10.1-desktop-amd64.iso /mnt/ubuntu64/
sudo mount -o loop debian-9.4.0-amd64-i386-netinst.iso /mnt/debian-multiarch/

- USBメモリにコピー

rsync -rL --exclude=/ubuntu /mnt/ubuntu64/ （USBメモリの path）/
cp /mnt/debian-multiarch/efi/boot/bootia32.efi （USBメモリの path）/EFI/BOOT/
rsync -r /mnt/debian-multiarch/boot/grub/i386-efi （USBメモリの path）/boot/grub/

- USBメモリで32bit-uefi PCをブート
- 「インストールせずLubuntuを使用」を選ぶ
- デスクトップが起動したらインストーラを起動し、Lubuntuをインストールする

当方の環境では、do-release-upgradeしても問題なく起動できることが確認できた。
ポリゴンリダクションのアルゴリズム

# ポリゴンリダクションとは
モデルのポリゴンを削除すること。
実際の実行結果↓
（左から約4000ポリゴン、約2000ポリゴン、約1000ポリゴン、約200ポリゴン）
![IMG_0170.PNG](https://qiita-image-store.s3.amazonaws.com/0/214313/14700ec8-38b8-38ac-bde7-6a5cfed779cd.png)

# Level of Detail
同じオブジェクトに対して、構成するポリゴン数が異なるモデルを複数用意する。
カメラとオブジェクトの距離が近い場合は、ポリゴン数が多いモデルを表示する。
逆に遠い場合は、ポリゴン数が少ないモデルを表示する。
結果的に、GPUの負荷の低減になる。

# 実装する必要性
端末に最適化されたLevel of Detail を実現するため。
当然3DCAD上でポリゴンリダクションは可能。
しかし、複数のモデルを用意するのが面倒。
アプリ上でポリゴンリダクションを実行することで、端末の画面や計算能力に応じて、最適なポリゴン数での表示ができる。
アプリ初回起動時に実行して保存する。

# ポリゴンリダクションのアルゴリズム
ポリゴンリダクションの処理前と後
![スライド1.png](https://qiita-image-store.s3.amazonaws.com/0/214313/ea40d603-1852-f388-8c71-4d3b0b9376f2.png)

１回のポリゴンリダクションの処理をすると、
・１つの辺を１つの頂点にマージ(l0 -> P)
・２つの辺を削除
・２つの面を削除(H1, H5)
・２つの頂点を削除(P0, P1)

# マージする辺の決定方法
QEM(Quadratic Error Metrics)を計算する。

## QEMの計算方法
辺をマージした後の新しい頂点候補の点：P
マージされる辺の１近傍の面：H1 ~ Hn
HiとPの距離をDi、Qi = Di ^2
QEM = ΣQi

## 辺をマージした後の頂点の最適化
マージする辺上の点Pにマージする。
（UVマップの値も同時に決定したいため）
平面：Hi = ai*x + bi*y + ci*z + di = 0 
(法線方向のため√(a^2 + b^2 + c^2) = 1)
辺：始点P0、終点P1、線分上の点P(X, Y, Z)
ここでP = k(P1 - P0) + P0 (k:定数) 
u = (P1 - P0)とおくと、P = k・u + p0
PとHiの距離をDi、Qi = Di^2、QEM = ΣQi
QEMを最小にするkのときPは最適な頂点
kを求める
Di = |ai・X + bi・Y + ci・Z + di| / √(a^2 + b^2 + c^2) = |ai・X + bi・Y + ci・Z + di|
Di=(ai, bi, ci, di)・(X, Y, Z, 1)^t
ni = (ai, bi, ci, di), v = (X, Y, Z, 1)とおくと
Qi = Di^2 = (ai・X + bi・Y + ci・Z + di)^2
= (ni・v^t)^2 = v・ni^t・ni・v^t
Ai = ni^t・ni、A = ΣAiとおくと
Qi = v・Ai・v^t
QEM = ΣQi = v・ΣAi・v^t = v・A・v^t
QEM = (k・u + P0)・A・(k・u + P0)^t
= (k・u + P0)・A・(k・u^t + P0^t)
= k^2・u・A・u^t + k(u・A・P0^t + P0・A・u^t) + P0・A・P0^t
QEM' = 2k・u・A・u^t + u・A・P0^t + P0・A・u^t
u・A・u^t > 0より、QEM' = 0のとき、QEMが最小
k = - (u・A・P0^t + P0・A・u^t) / 2(u・A・u^t)
よって、QEMを最小にする点Pは下式となる。
P = k(P1 - P0) + P0
(k = - (u・A・P0^t + P0・A・u^t) / 2(u・A・u^t))

## ポリゴンリダクションの実行手順
手順
①：各辺について、QEMを計算する。
②：QEMが最小の辺をマージする。
③：①に戻る。

# QEMを求めるために必要なデータ
k = - (u・A・P0^t + P0・A・u^t) / 2(u・A・u^t)
上のkについてを眺めると、P0、P1の座標と、その２頂点の近傍の平面の方程式で解ける。
平面の方程式は、法線方向と1頂点から求める。
CADでモデルを出力する際に、法線方向のデータを含ませておけばOK
wgetコマンド

#概要
URLを元にサイト情報を構築しているファイルを取得する

#コマンド

```zsh
#基本的にその場にダウンロードするのでまず任意のディレクトリへ移動
cd <ディレクトリ>

#サイト情報ファイルを丸ごとダウンロード
#wget -rpkK –random-wait URL
wget -rpkK –random-wait https://www.xxxxx.co.jp/index.html 

#指定のファイル単体をダウンロード
wget URL
wget -np URL/test.png

#png画像のみダウンロード
wget -A .png https://www.xxxxx.co.jp/index.html 

#FTPサーバーからファイルダウンロード（リトライ回数：3）
wget -t 3 ftp://ftp.xxxxxx.co.jp/hoge.txt

#robots.txtを無視する
wget -e robots=off
```

#オプション抜粋

| 　引数（略式表記）　 |引数| 内容 |
|:--|:--|:--|
| -r | --recursive | 再帰的に取得する。ただし、robots.txtで拒否されている場合は、指定したページだけしか取得できない。 |
|-p|	--page-requisites	|ページの表示に必要な画像やcssなどを合わせてダウンロードする。|
| -k | --convert-links | ダウンロードしたhtmlファイルからのリンクや画像のパスをうまく表示できるように変換する |
| -K | --backup-converted | .origをつけて変換前のファイルを残す |
| -E | --adjust-extension | mod_rewriteされてたりクエリーストリングによってコンテンツが変わるサイトの場合、.htmlをつけて保存する。古いバージョンのwgetでは--html-extentionだったらしい。 |
| -N | --timestamping | ローカルに同名のファイルがあって、ファイルサイズが同じ場合に、更新日時を比較してリモートのほうが新しければダウンロードする。 |

#参考
>
[Macにwgetコマンドが無かったのでMacPortsで入れた - kanonjiの日記](http://d.hatena.ne.jp/kanonji/20121011/1349931815)
[wgetが超絶便利なwebクローラー、クローリングツールだとは知らなかった・・・！](http://girigiribauer.com/archives/925/)
[wgetの使い方いろいろ](https://qiita.com/katsukii/items/ef251830776cbe108cfb)
[wgetでサイト全体をまるごとダウンロードする(認証後ページも)](https://qiita.com/suin/items/7241135f1684636652ac)
FlutterでIntent.FLAG_ACTIVITY_CLEAR_TOPてきなことをやる

自分用めも

## push/pop じゃないナビゲーションが使いたい

Androidだと `Intent.FLAG_ACTIVITY_CLEAR_TOP` とか使って実現するやつ。

![Slice.png](https://qiita-image-store.s3.amazonaws.com/0/74571/85535a1d-850c-3192-5a00-f330d0149377.png)


### pushAndRemoveUntilを使うといいらしい

```dart
    child: new FlatButton(
      onPressed: () {
        Route routeToTop = new MaterialPageRoute(builder: (context) => new FirstScreen(data: "OK from Confirmation:$data"));
        Navigator.of(context)
            .pushAndRemoveUntil(routeToTop, (route) => false);
      },    
```

### screenshot

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/74571/9c25556f-4be9-e8d6-9db9-5d10edc645a0.gif)


## 参考

* https://gitter.im/flutter/flutter?at=5913f7e08a05641b116ea678
* https://tutel.me/c/programming/questions/46259751/register.html

## おためしソース

https://github.com/YusukeIwaki/flutter_navigation_playground
Sympyを使って単振動の微分方程式の解をAsin(t)+Bcos(t)の形に変形してみよう

どうも、こんにちは森の生活者のガマ仙人です。
単振動の微分方程式
$$\frac{d^{2}}{d t^{2}}  x{\left (t \right )} = - ω^{2} x{\left (t \right )}$$

をsympyで解くと次のようになります。

```python
from sympy import *
init_printing(use_latex=True)

x = Symbol('x') #振動の位置
w = Symbol('ω') #角速度
t = Symbol('t') #時間

#単振動の微分方程式を定義する
eq = Eq(x(t).diff(t,2), -w**2*x(t))

#微分方程式を解いてみよう
ans =dsolve(eq,x(t))

#結果を表示してみる
display(ans)

```
```math
{x{\left (t \right )} = C_{1} e^{- i t ω} + C_{2} e^{i t ω}}
```
これだと慣れている人にはいいのですが
ワシのような一般人にはちょっと目に痛いです。
sin(t)とcos(t)が入り混じった式のほうが親近感がありますよね。

そこで
これを置き換えてみようと思ったのでした。
で、オイラーの公式

```math
e^{i x}=cos{x}+isin(x)
```
を使って置き換えのため.replaceメソッドでいろいろやってはみたのですが

```python
eix=lambda t: (cos(t) + i*sin(t))
ans.replace(exp(i*x),eix)
```
こういう書き方はできないようっすね
絶望的な気分でリファレンスを読んでいたらいいのを見つけました。
.rewariteメソッドです。
これを使うとexp->sinとか
またその逆とかいろいろできそうなんです。

```python
ans.rewrite(sin)
```
ってやると、あら不思議。
こんな感じで変換されるのね。
ちょっと感動してしまった。

```math
x{\left (t \right )} = C_{1} \left(- i \sin{\left (t ω \right )} + \cos{\left (t ω \right )}\right) + C_{2} \left(i \sin{\left (t ω \right )} + \cos{\left (t ω \right )}\right)
```

というわけで、とりあえずはこれでOKなんだけどね
せっかくだからもう少しシンプルにしたいですよね。
そこで積分定数C1,C2を複素共役でくくってやればよいわけですよね。
C1=(a+ib)/2
C2=(a-ib)/2
これを式に代入してやると次のような結果になります。

```python
a,b,C1,C2 = symbols(['a','b','C1','C2'])
ans3 =ans2.subs([(C1,(a+I*b)/2),(C2,(a-I*b)/2)])
ans3
```
```math
x{\left (t \right )} = \left(\frac{a}{2} - \frac{i b}{2}\right) \left(i \sin{\left (t ω \right )} + \cos{\left (t ω \right )}\right) + \left(\frac{a}{2} + \frac{i b}{2}\right) \left(- i \sin{\left (t ω \right )} + \cos{\left (t ω \right )}\right)
```

でこれをsimplifyで簡略化しますと

```python
ans4=simplify(ans3)
ans4
```
```math
x{\left (t \right )} = a \cos{\left (t ω \right )} + b \sin{\left (t ω \right )}
```

となるわけです。
いわいる普通の振動の式になりましたね。
めでたしです。
いやあ、ここまでくるのに結構時間がかかりました。

おまけですが
結果をグラフにしてみましょう。
ω=2,a=1.b=1としたグラフです。

```python
plot(ans4.rhs.subs([(w,2),(a,1),(b,1)]),(t,0,10))
```


![download.png](https://qiita-image-store.s3.amazonaws.com/0/247185/3f6ecabd-1ff9-77e0-0bd1-f9ab94401d6e.png)

ちょっと駆け足で説明してしまいましたが
補足説明が必要な部分もありそうです。
気が付いたら加筆、修正しますね。

以上。
［初投稿］TOEICのスコアを10ヶ月で460→700に上げた話

# はじめに

私は電機メーカー勤めのソフトウェア系の仕事をしている新卒3年目のものです。
あと、この記事は

https://qiita.com/sheepland/items/6540c4e32eed12807689

この方のオマージュというかリスペクトというかそんな感じです。

点数の伸び幅は普通に負けていますが、上司にすごい褒められたので書くことにしました。

英語学習の実績と少しオススメを書きます。

# 動機

以下が主なモチベーションです。

・ 英語のサイトを読みたい
・ 英語ができないとうちの会社で職がなくなるかもしれない
・ ずっとコンプレックスだった

# きっかけ

お世話になったものを紹介したかったです

# 目標

とりあえず1年間でTOEIC650を目標としてました。
うちの会社でこのくらい求められるからです。

# 英語勉強を始める前の英語力

社会人1年目はTOEIC330でした。
大学受験も英語を使ってないんで、多分センター試験受けたらまず半分は絶対取れない感じです。

# TOEICスコアの履歴

2017/2 460
2017/9 560
2017/10 565
2017/11 595
2018/1 680
2018/3 700

2017/6から勉強したので10ヶ月です

# 学習戦略

自分は大学受験の時から、
武田塾 https://www.takeda.tv/
や
大学受験塾ミスターステップアップ https://mrstepup.jp/
の信者でした

なので、この辺の英語の勉強法を実践しています。

どちらも共通するのは、「一冊を完璧に」です。

一冊一冊をかなり丁寧にやり込み、復習を重点とした勉強をしています。

しかし、TOEICのことはわからなかったので、AEONと
TRAアカデミー http://tra-academy.jp/
に行ってました。

AEONは2017/6～2018/1くらいまで、TRAアカデミーは2017/8に1週間くらい集中して通いました。

AEONはモチベーション維持に、TRAアカデミーはTOEICの勉強法を教わって、信者になりました。

どの本を勉強すべきか、TOEICの解き方はどうするのかはTRAアカデミーで学び、実践しています。

# 使った教材

## 発音

特になし
ちょくちょく勉強したけど、しっかりはやっていない

## 音読

公式問題集
本番と同じ声で覚えるといいらしいです。
まだ足りてないのでこれからもやりたい
やり方はシャドーイングをひたすらしました
リーディングも速くなった気がします。
1日30分くらいづつやりました。めんどくなってやってない日もまあまああります笑

## 文法

TOEIC TEST 英文法 出るとこだけ！

文法も間違えた問題はしっかりと解き直して、本番では間違えないようにします。
TOEICの点数に繋がらなさそうなので、そんなに文法には時間かけていません。

## 精読

何故かここは大学受験の時にしっかりやったので、TOEIC対策は全くやってません。

## 英単語

ゴロ合わせが好きなので、ゴロのある単語帳を2冊やっています。

新TOEICテスト最重要英単語500
イラスト記憶法で脳に刷り込む英単語1880

あとは英単語覚えるのが好きなので、別にやらなくてもいいんですけど、990目指すやつもやりました。

キクタンTOEIC TEST SCORE 990

英単語の覚え方少しだけ書きます。
まず目標は英単語→日本語を1義だけ覚えます。
また、勉強するのは、1義も知らない英単語だけを抜き出します。
一気にたくさん覚えるのは不可能なので、10個ずつ覚えます。
10個でなくても構いません、自分の覚えやすい数をセットで覚えてください。
10個の覚え方は好きな方法で構いません。自分はひたすら隠して思い出してを繰り返してます。ゴロとか英文とかも読んで、思い出しやすくしています。
10個を勉強したら、必ず10個覚えたかテストをします。
10個正解したら、次に進みます。

次に英単語の復習の仕方です。
忘却曲線を使います。
個人差があると思うのですが、自分は
1日後、4日後、20日後、2ヶ月後、3ヶ月後、4ヶ月後
の周期で復習しました。
ここで大切なのは、覚えていないものは忘却しないということです。
必ずテストして、覚えたか確認しましょう。

ちなみに、英単語は、英単語帳からだけでなく、公式問題集のわからない単語もすべて覚えました。

## リスニング

公式問題集しかしていません。

## ディクテーション

公式問題集のpart1とpart2はディクテーションも結構しました。
シャドーイングが嫌になったらディクテーションすると意外と楽しかったです。

## リーディング

公式問題集のみ
でもまだまだめちゃくちゃ遅いので、まだまだやりたいと思っています。
新精選問題集のリーディングとか良さそうだなー

# 勉強時間

勉強を始めたときは、1時間やるのも相当きつかった記憶があります。
だんだんと慣れてくると、2時間3時間できるようになりました。
土日は10時間くらいやってる日もあります。
でも飲み会とか遊びとか、やる気がなかったりで普通にやってない日や時期も多かったです。
1日平均すると2時間くらいかと思います。測ってないんでわからないんですが

# 学習を毎日続けるため何をしたか

カフェに行って勉強していました。
勉強するんだから高いものを飲むんだと、400円くらいのカフェモカを飲みに行くために、勉強という言い訳を作ってたというか、よくわからないけどそんな感じです。

# 700点を超えてどうなったか

周りに伝えることで、英語の仕事がまわってくるようになりました。
英語を仕事で使うことで、プライベートの時間の勉強をもっと減らしたいと思っています。
また、自分のコンプレックスが少し消えて自身がつきました。

英語のニュース記事はまだ全然読めません。単語もわからないし、読むのおそすぎて辛いです。

英語は話せません。

洋楽も聞けません。サビだけ少し意味がわかりました。
早口で話されると、聞き取れません。
集中して話の意味が少しわかります。結構すぐ疲れます。

# まとめ、感想

はやく機械翻訳の精度よくなってほしいですね。
英語の勉強は辛いし、正直ストレスだし、はやく要らない社会になってほしいです。

自分の強みを再認識しました。
周囲の方々は、英単語を覚えるという宿題が全然できない中、自分だけはいつも満点を取れていたので、暗記する技術は一生ものだと感じました。

本に関しては公式問題集が最強だそうです。
公式問題集に始まり公式問題集に終わります。
公式問題集は新形式の4冊は全てやりました。
あと英単語帳をしっかりやるとめちゃくちゃ点数伸びます。
やはり英単語→日本語が素早いと、速読にも、リスニングにもとても良い影響を与えます。
公式問題集:単語:リスニング:その他=3:5:2:0.01 くらいの勉強時間がいいと思います

もちろんこれからも英語勉強します。
なんとなく英検1級くらいまで勉強したいと思っています。
英語の勉強をやめようとしたら、なんだがやることがないことに気づきました笑
まあそこそこ楽しく英語の勉強やっていきたいと思います。

駄文だしパクリだし、実績もそんなにすごくありませんが、読んでいただいた方、ありがとうございます。
１ツイートに収まる15パズル.html

## イメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/62215/f63298de-032d-7d9a-5676-8115ace3a1bd.png)

## 注意
- Chrome でのみ動作確認
- 矢印キーで操作
- 文字が小さいので、拡大はセルフサービス

## v2

```html
<pre id=p><script>a=`①②③④
⑤⑥⑦⑧
⑨⑩⑪⑫
⑬⑭⑮　
`.split``
q=18
M=d=>!a[Q=q-(d&1?d*5-9:d)+1]||Q%5>3||d&-4||(a[q]=a[Q],a[q=Q]=`　`)
A=a+``
S=_=>p.innerHTML=a.join``+(a==A)
for(i=334;i--;)M(Math.random()*4|0)
for(i=6;i--;)M(i&1)
S(onkeydown=e=>S(M(e.keyCode-37)))</script>
```

- 操作性のため `onkeyup` -> `onkeydown` に
- 座標を１つにまとめた
- 初期位置を右下にする余裕ができた

## v1

```html
<pre id=p><script>
a=`①②③④
⑤⑥⑦⑧
⑨⑩⑪⑫
⑬⑭⑮　
`.split``
r=c=3
M=d=>(d|(R=r,C=c,d&1?R-=d-2:(C-=d-1)))&-4||(a[r*5+c]=a[R*5+C],a[(r=R)*5+(c=C)]="　")
A=a+""
S=_=>p.innerHTML=a.join``+(a==A)
for(i=334;i--;)M(Math.random()*4|0)
S(onkeyup=e=>S(M(e.keyCode-37)))
</script>
```

---

```html
<pre id=p>
```
閉じタグがなくても動きます。`id` に `hoge` を設定することで、その要素を `window.hoge` で参照できます。クオーテーションは不要です。`<pre>` にしたのは、改行をそのまま出力するためです。

---

```js
a=`①②③④
⑤⑥⑦⑧
⑨⑩⑪⑫
⑬⑭⑮　
`.split``
```

`r` 行目 `c` 列目の要素に、`a[r*5+c]` でアクセス出来るようにします。
``` .split`` ``` は「タグ付きテンプレートリテラル」と呼ばれるもので、JavaScript のコードゴルフでは `split` や `join` と組み合わされることで威力を発揮します。

---

```js
r=c=3
```

空白部分の座標です。

---

```js
M=d=>(d|(R=r,C=c,d&1?R-=d-2:(C-=d-1)))&-4||(a[r*5+c]=a[R*5+C],a[(r=R)*5+(c=C)]="　")
```

これはわかりづらいので、優先順位などを考慮して見やすくすると

```js
M = d => {
  R = r;
  C = c;
  _RC = (d & 1) ? (
    R -= d - 2
  ) : (
    C -= d - 1
  );
  (d | _RC) & -4 || (
    a[r*5+c]=a[R*5+C],
    a[(r=R)*5+(c=C)]="　"
  );
};
```

`M` は移動のための関数です。
まず `(r, c)` を `(R, C)` として保持します。
移動方向 `d` は `0 1 2 3` のいずれかであると仮定して、それぞれ `← ↑ → ↓` を割り当てます。「`d` が奇数なら行番号を `d - 2` 減らし、偶数なら列番号を `d - 1` 減らす」という操作は、実際に追ってみると正しいことがわかります。
ここで、「`d` が `0 1 2 3` のいずれでもない場合」「`R` または `C` （変化した方が `_RC` に入る）が `0 1 2 3` のいずれでも**なくなった**場合」が考えられます（`d` については後述）。
これを `(d | _RC) & -4` で、「`d` か `_RC` の下位2ビット以外にビットが立っているかどうか」という判定をします。
`hoge || fuga` は `if (!hoge) { fuga }` のようなものです。つまり、「`d` か `_RC` の下位2ビット以外にビットが立っていなければ」⇔「`d` か `_RC` が両方とも `0 1 2 3` に収まっていれば」、次を実行します。
この条件次第で、`(r, c)`（遷移前）と `(R, C)`（遷移後）の入れ替え操作が行われます。

---

```js
A=a+""
S=_=>p.innerHTML=a.join``+(a==A)
```

`a` を文字列化したものを `A` に保存しておきます。
`S` は表示のための関数です。`==` はゆるい比較演算子なので、`a == A` で `a` は文字列に型変換され、初期状態と一致しているかが判定されます。

---

```js
for(i=334;i--;)M(Math.random()*4|0)
```

`Math.random()*4|0` は `0 1 2 3` のいずれかをランダムに返します。これで好きな回数だけ空白をかき混ぜます。

---

```js
S(onkeyup=e=>S(M(e.keyCode-37)))
```

`window.onkeyup` 時に、キーコードを読み取って `M` し、`S` します。
`← ↑ → ↓` に `37 38 39 40` が割り当てられているため、`37` を引いて `M` に渡せば、前述のようにバリデーションしてくれるというわけです。
最後に初期状態を `S` して終わりです。

## 最後に
Twitter の文字数制限が変更されて、いい感じにプログラムが収まる程度になったので、みなさんもいろいろ挑戦してみてください。
google カレンダーに一週間分の天気予報を埋め込む

# はじめに
ランニングやドライブなど、外出する予定をGoogle カレンダーに追加する時、
その日の天気がカレンダーで表示されたら便利だと思いチャレンジしてみました。

# 追加方法
追加方法はとても簡単です。
しかし、Google カレンダーのUI周りの変更があったため、
`カレンダー設定` に `場所` を追加する方法は使えなくなってました。
今回は、`livedoor weather` を使って天気予報を埋め込んでみます。

1. [iCal天気](http://weather.livedoor.com/weather_hacks/ical) から表示したい地域を探し、 `ical` と表示されているリンクをコピーする。
2. Google カレンダーのページから、設定アイコンをクリックする。
3. `カレンダーを追加` から `URLで追加` をクリックし、先程コピーしたリンクを貼り付け追加する。

以上でGoogle カレンダー上に1週間分の天気予報が表示されるようになります。
ディレクトリ内のすべてのファイルをループする

TL;DR
=====
```bash
while read -d $'\0' file; do
    "${file}" に対して処理
done < <(find ディレクトリ -mindepth 1 -maxdepth 1 -print0)
```

よく見るやり方
===
シェルスクリプトでディレクトリ内のすべてのファイルをループする方法をぐぐると、次の二つの方法が出てくるのですが、どちらも意図通りに動かない場合があります。

1. **ワイルドカードをfor**  
`for file in ディレクトリ/*; do`  
という書き方。  
ディレクトリが空だったときにうまく動きません。zshだと"no matches found: \*"的なエラーとなりますし、bashだと"\*"という値を`file`に渡してきます。  
先にディレクトリが空かどうか判定すればいいのではないか、まあそれで99.9%くらいOKなんですが、レースコンディションが気になって夜も眠れなくなる人はもう少し読み進めていただければ。
2. **lsもしくはfindでfor**  
`for file in $(ls ディレクトリ); do`  
もしくは  
`for file in $(find ディレクトリ -name * -depth 1); do`  
という書き方。  
空ディレクトリ問題があっさり解決します。  
しかし、ファイル名がホワイトスペースや引用符文字を含んでいる場合に誤ったファイル名を受け取ってしまうことになります。

行ごとにループを回す発想
===
後者のlsまたはfindの結果を使う方法、ホワイトスペース区切りでループしようとしたので問題となっていました。
しかしlsの出力は一行に一エントリ結果が入っているのだから、行ごとにループするというシェルスクリプトの普通のやり方に持ち込めばそういう問題になりません。
行ごとにループするには、`while read line`でしたね。

そこでまずこう書いてみます。

```bash
while read file; do
    "ディレクトリ/${file}" に対して処理
done < <(ls -A -1 ディレクトリ)
```

lsの`-A`は`.`, `..`以外のすべてのファイルを表示せよ、`-1`は1行に1ファイルで区切れというオプションです。
パイプではなく無理やりリダイレクションの形にしてあるのは、パイプで書いてしまうとループ内で書き込んだ変数がループ外へ持ち出せなくなるためです。
うまく動きましたか？
しかしまだ問題が。
改行文字を含むファイル名が2行に切られます。

行区切りをnull文字にする
====
改行コードはファイル名に含まれうるのが問題でした。
それならファイル名に使えない文字を行区切りにしましょう。null文字です。

findコマンドは`-print0`オプションを使うことでnull文字を区切りに出力してくれます。
readコマンドは`-d`オプションで区切り文字を指定できます。

そこで最初に書いたこのコードです。

```bash
while read -d $'\0' file; do
    "${file}" に対して処理
done < <(find ディレクトリ -mindepth 1 -maxdepth 1 -print0)
```
プログラミングとビールとわたし

![IMG_4639.jpg](https://qiita-image-store.s3.amazonaws.com/0/149269/0478d299-d5e0-f33a-0829-391a8218a6dd.jpeg)





大きくなったらなにになるの？

周りの大人にいつも聞かれたけれど

ふと気づいたら

暗い話にばかりやたら詳しくなったもんだ

ひとも、街並みも変わるけど

今日も元気だ ビールがうまい
[Numpyを使用]等間隔の数値を生成する方法~グラフ描写に便利~

matplotlibを用いてグラフを書くときグラフの範囲（x軸０〜2πなど）を設定するために必要になる関数についてまとめる.もしこれを読んだら[この記事](https://qiita.com/techiromen0/items/cc88695f953097a6ab37)を読んでグラフを描写してみてほしいです.

#今回紹介する関数
>
1. numpy.arange()
始まりから終わりの直前までの`数値を指定した間隔` で返します。
2. numpy.linspace()
に初め、終わり、分割したい個数の数値を渡すと、`指定した個数に分割する点`を返します。

#1. numpy.arange()
![numpy.arange().jpg](https://qiita-image-store.s3.amazonaws.com/0/240708/45ceed0c-dda1-317c-342a-e214dedea02f.jpeg)


各自print(x)でお好きな数字を表示させてみてください.

#2. numpy.linspace()

![numpy.linspace.jpg](https://qiita-image-store.s3.amazonaws.com/0/240708/a09805d1-5554-361a-04ba-13b430c20d95.jpeg)

各自print(x)でお好きな数字を表示させてみてください.

#まとめ
* numpy.arange()を使用する際は第２引数の直前の値までしか含まれないことを注意する.
* numpy.linspace()は、第3引数を使用した際に等間隔に値を取れるので折れ線グラフを使用したいときなどに使える.
iPadでRubyの準開発環境を作る

今年に入ってから，帰宅してはハンター稼業かZ戦士と一緒に武闘家としての活動することが多くなってしまったので，開発する時間がなくなりつつあります(少なくとも，去年に比べると確実に減りました)．
もちろん，上の時間は大事な時間なので，減らすことはできても無くすことはできません．
なので，帰宅する前に時間を作ることにしたのですが，iPadを持っていてこれでRubyの開発環境ができるとかできないとか聞いたことがあるので，それができればスキマ時間に開発できると思いやってみました．

# 注意
* タイトルにある通り，**準**開発環境です．  
投稿時点では，PCと同等の開発環境はできてないので，ご了承ください・・・
* なので，以降のお話も投稿時点でのお話になります．  
いいものが出てきたら，都度更新していく予定です

# 前提条件(というよりも方向性?)
iPhoneのインターネット共有を使うので，通信量が可能な限り抑える様にしています．
なので，クラウドIDE，リモートデスクトップなど，通信量が膨大になりそうな方法は見送ってます(私はやったことないので，そんなことないよ!という方はコメントで教えてください・・・)．
ただし，ソースをcloneして発生する膨大な通信は1回すれば終わりなので，これは除きます(あくまで普段使いで抑える)

普段からどこでも開発したいので，大体の職場で持ち込み禁止されているであろうノートPCも見送っています．

ポケットWi-Fiも契約していないので(ry

# ほしいことリスト
## できないといけないこと
これがないと，そもそも開発ができないレベルのものです．

* Rubyの実行環境
* Gitが使えるツール
  * checkout fetch merge pushなど，基本的なコマンドが実行可能
  * 今使っているBitbucketに対応
* Rubyに対応したテキストエディタ(ハイライトができればOK)

## できてほしいこと
あったら，よりPCの開発環境に近づくからほしい程度で，上に比べたらそこまで必須じゃないものです

* gemで追加されているライブラリが使える
* GitのGUIツール

# 導入したもの
2018/4/11時点で導入したものです

## Ruby実行環境
### [RubyPico](http://rubypico.ongaeshi.me/ja/)
* 基本的には何でもできます
  * `require`が必要なライブラリは公式がサポートしているものに限ります(これが割と曲者?)
  * ココ最近のアップデートでPOST通信ができるようになったので，LINE APIを試すことができる(はず)!
  * gemで手に入れたライブラリは使えません
* Gitには未対応，iPad上のフォルダの参照ができないので，ファイルの管理が面倒です
* ソースを実行する度に別窓が開き，そこに`puts`の出力がされるので，テンポの悪さがあります

POST通信ができるのはとてもいいのですが，かゆいところに手が届かない感じがあります・・・

気になる点は`require 'json'`と書くとそこでエラーになってしまうことです．
RubyPico環境では`json`はサポートしていると明言されているので，書く必要が無いっぽいです．
気軽に使えるという意味ではいいですが，実際の環境では書かないといけないので，ちょっと気をつけておかないといけないですね．

### [rubyi](https://itunes.apple.com/jp/app/rubyi-run-code-autocomplete/id581732143?mt=8)
* 見た目があまりイケてないので，自分で設定するところから(設定はできます)
* 標準であるライブラリも含め，`require`するとエラーになります
  * そのまま`JSON.parse`を使うと，そこでエラーになるので，Jsonデータは使えません
* 使い方が悪いのか(?)，ファイルのopenもできない(そこでエラーになります)

ファイルが使えないのも辛いですが，何よりJsonデータが扱えないというところがもっと辛いです・・・
当分は使うことは無いでしょう・・・

## Git
### [Working Copy](https://workingcopyapp.com/)
* GUI付きです
* `pull`や`checkout`，ステータスの確認はできますが，`push`など一部の機能は有料(1800円)になってます
* エディタ付きで，簡易的な編集ができます
  * 編集機能があるので，差分も見られます

Gitのツールとしては申し分なしだと思います．
TextasticやGoCoEditなどのテキストエディタがWorking Copyと連携されているので，エディタの機能がもうちょっと欲しいときはそれを使うのもありです．

# 問題点
## 実行環境とファイル間の連携
実行環境，ファイル管理はどちらもあるのですが，これらの連携が弱いです・・・
Gitからソースを持ってきても，手作業で実行環境に持っていかないといけない状態です(その逆も然り)．
結構面倒です・・・

## PCに近い環境にするには投資が必須レベル
今の自分のPCの開発環境はタダでできているので，それ基準に考えるとできれば投資はしたくないです．
PCと同等の環境にするには，高くても3000円くらいだと思っているですが，ちょっとでも払う時点で抵抗があります．
まぁ逆に言えば，PCがタダでできる方がおかしいのかもしれませんが・・・

# 気になっているもの
## [Codeanywhere](https://codeanywhere.com/)
[iPadで「どこでも」プログラミングしよう](https://qiita.com/ShinoTatwu/items/06cca8aba7e768677909)で見つけました．
クラウドIDEだったので，スルーしようかと思いました・・・
だがしかし，公式を見てみると，[Android](https://play.google.com/store/apps/details?id=com.codeanywhere.mobile)や[iOS](https://itunes.apple.com/us/app/codeanywhere-mobile/id1330643736?mt=8)のアプリが配信されているのです．
私の中のクラウドIDEをPCで使うときはブラウザを使い，その窓の中にテキストエディタやターミナルがあってそこで開発が進むものと思っていたので，新鮮でした．
専ブラみたいと言ったらそうかもしれませんが，他のIDEは無いっぽいので珍しい気がします．
問題は通信量・・・w

# 最後に
日々新しいアプリが登場するので，暫くの間は目を光らせておきます．
より良いアプリや問題点が解消できるようなアプリがあれば，是非是非教えてください!

# 余談
開発環境構築をググっている間に，\# TypeというiPhone，iPad用のMarkdownエディタを見つけました．
QiitaやGithub，Gistに投稿機能付きなので，おすすめです(次回はここから投稿したい)

# 更新履歴
* 4/11
  * RubyPicoをより詳細にしました
  * 新たに「rubyi」を導入，使用感を追記しました
  * 「気になっているもの」を追加しました
jQueryでゲームによくある体力ゲージを作成してみた。

## はじめに
現状、ゲーム制作をしていて、体力ゲージの作り方が見つからなかったので、
考えて、以下のやり方で作成した。

同じ悩みを抱えている初心者エンジニアの役に立つことを願って書き込む。

##利用するHTMLタグ
・meter　： 体力ゲージ表示に便利
　![ゲージ.png](https://qiita-image-store.s3.amazonaws.com/0/23810/7efff858-63cb-b662-766b-7e6302bf722c.png)

参考リンク
 https://developer.mozilla.org/ja/docs/HTML/Element/meter

・HTML

```html
<meter max="100" low="20" high="40" value="100"></meter>
```
## 利用するJavaScript
・setTimeout　　・・１回限りの時間処理
・clearTimeout ・・時間処理を止める

参考リンク
[JavaScriptでsetTimeoutを使う方法【初心者向け】 | TechAcademyマガジン](https://techacademy.jp/magazine/5541)

## 利用するjQuery
・valメソッド

参考リンク
　http://semooh.jp/jquery/api/attributes/val/val/

・HTML

```html
<meter class="test" max="100" low="20" high="40" value="100"></meter>
```

・JavaScript / jQuery

```html
<script>
    var count = 0;
    var countup = function(){
      console.log(count++);
      var power = setTimeout(countup, 1000);
      $(".test").val(power); //体力回復 jQuery部分
      if(count > 100){　
        clearTimeout(power);　//clearTimeoutで時間処理STOP
      }
    }
    countup();
   </script>
 ```

以上
puma (rails/capistrano) + nginx + https対応のためのnginx conf 設定

良く忘れるというか毎回調べるのでメモとして。
これで正しいとかそうゆうことではなく、とりあえず困らないだろうという設定のはず。

```bash:良く使ったコマンド
vim /etc/nginx/conf.d/app.conf
nginx -t
/etc/init.d/nginx restart
```

# /etc/nginx/conf.d/app.conf
```:変数説明
<app_name>: アプリケーション名(なんでもいい)
<puma-socket-path>: pumaが管理するソケットファイルパス
<domain_name>: なんでもいいかも？
<ssl_certificate_name>: ssl_certificate ファイル名
<ssl_certificate_key_name>: ssl_certificate_key ファイル名
```

```conf:/etc/nginx/conf.d/app.conf
upstream <app_name> {
  server unix:<puma-socket-path> fail_timeout=0;
}

server {
  listen 80;
  listen 443 ssl;
  server_name <domain_name>;

  ssl on;
  ssl_certificate /etc/nginx/conf.d/<ssl_certificate_name>.crt;
  ssl_certificate_key /etc/nginx/conf.d/<ssl_certificate_key_name>.key;
  ssl_protocols SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!MD5;

  root /var/www/<app_name>/current/public;

  location / {
    try_files $uri/index.html $uri.html $uri @<app_name>;
  }

  location @<app_name> {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Server $host;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_redirect off;
    proxy_pass http://<app_name>;
  }

  location ~ ^/assets/ {
    root /var/www/<app_name>/current/public;
  }

  index index.htm index.html;
  error_page 500 502 503 504 /500.html;
  client_max_body_size 100m;
  keepalive_timeout 5;
}

```

# /etc/nginx/nginx.conf
 - ほとんど触ってないgzipとuserくらい

```conf:/etc/nginx/nginx.conf
# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user  root;
worker_processes  1;

error_log  /var/log/nginx/error.log;
#error_log  /var/log/nginx/error.log  notice;
#error_log  /var/log/nginx/error.log  info;

pid        /var/run/nginx.pid;


events {
  worker_connections  1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  access_log  /var/log/nginx/access.log  main;

  # sendfile   on;
  # tcp_nopush on;

  keepalive_timeout  65;

  gzip  on;

  # Load modular configuration files from the /etc/nginx/conf.d directory.
  # See http://nginx.org/en/docs/ngx_core_module.html#include
  # for more information.
  include /etc/nginx/conf.d/*.conf;

  index   index.php index.html index.htm;

  # for when servername is too long
  # server_names_hash_bucket_size 128;
}
```


# 解決できなかった課題
 - ssl通信ポートを独自ポートにしたかったけど、devise gemがポート変更するとうまく動作しなくなったのでデフォルトポートで妥協した
 - 管理画面とapiを兼用しているので、api通信用ポートと制限、管理画面のポートと制限とうまくやりたかった。（１つのサーバーで役割多すぎ問題ってのは置いておく）
AV1 specification を読む 2018-03-26 (7.1 General Decoding Process)

#AV1 specification 日本語訳 (2018-03-26)

7章はデコード処理についての規定です。

汎用デコード・タイルデコードの2種類の規定があります。

汎用デコードは、ビットストリームを先頭から順番に解釈してフレーム全体をデコードする方法です。
タイルデコードは、タイル単位に別個にデコードする方法です。
デコード処理にタイル間の依存は無いので、ビットストリームさえ同時に供給することができれば、並列に処理することができます。

ループフィルタについては、フレーム単位の処理なので、フレームを構成するタイルが全て揃うのを待つ必要があります。

----

# 7. Decoding Process

>AV1 contains two operating modes:
>
> 1. General decoding (input is a sequence of OBUs, output is decoded frames)
> 2. Large scale tile decoding (input is data for a specific tile, output is decoded content of just that tile)
>
>The general decoding process is specified in section 7.1.
>
>The large scale tile coding process is specified in section 7.2.

AV1には2つの動作モードがあります。

1. 汎用デコード処理（OBUのシーケンスが入力で、デコードされたフレームが出力）
2. 大規模タイルデコード処理（特定のタイルのデータが入力で、そのタイルのデコードされた内容だけ出力）

汎用デコード処理を、7.1節で規定します。
大規模タイルデコード処理を、7.2節で規定します。


## 7.1. General Decoding Process

> Decoders shall produce output frames that are identical in all
> respects and have the same output order as those produced by the
> decoding process specified herein.
> 
> The input to this process is a sequence of open bitstream units (OBUs).
> 
> The output from this process is a sequence of decoded frames.
> 
> For each OBU in turn the syntax elements are extracted as specified in
> section 5.1.
> 
> The syntax tables include function calls indicating when the remaining
> decode processes are triggered.

全てのデコーダは、ここで規定されるデコード処理で生成される出力フレームと、全ての側面で同一のフレームを生成し、同じ順番で出力しなければなりません。
この処理の入力は、OBUです。
この処理の出力は、デコードされたフレームのシーケンスです。
それぞれのOBUについて、5.1節で規定されたように、順番にシンタックスエレメントを抽出します。
関数呼び出しを含むシンタックステーブルは、後述するデコード処理を呼び出すことを示しています。
Scala：Twilioを使ってみる

# 始めに
- [Twilio for KWC 5th Anniversary Event](https://twilio.kddi-web.com/) らしいです。
- ユーザー向けサービスではなく特別な社内のアラート通知用としてTwilioを活用しています。

# 前提
- Twilioのアカウントがあること（無料トライアルでも可）
- 音声メッセージ作成していること（TwiMLを作成）
 - https://www.twilio.com/labs/twimlets/echo


# コード

```build.sbt
 "com.twilio.sdk" % "twilio" % "7.+",
```


```twilio.scala
import com.twilio.http.TwilioRestClient
import com.twilio.rest.api.v2010.account.Call
import com.twilio.rest.api.v2010.account.CallCreator
import com.twilio.`type`.PhoneNumber //typeが予約語のためバッククォート「`」でくくる

import java.net.URI

object Twilio{

    val accountSID:String = "アカウントID"
    val authToken:String  = "アクセストークン"

    val client:TwilioRestClient  = new TwilioRestClient.Builder(accountSID, authToken).build()

    //発信元
    val from=new PhoneNumber("+815011112222") //電話番号 050-1111-2222 であれば　+815011112222

    def call{

        //発信先リスト（復数の発信先があったためにListにしただけ）
        val toList:List[PhoneNumber]=List(
            new PhoneNumber("+819011112222") //電話番号 090-1111-2222 であれば　+819011112222
        )

        //音声メッセージのURL
        val uri= new URI("http://twimlets.com/echo?Twiml=再生したいTwiML")

        //発信先リストに対して
        toList.foreach(to=>{
            val call:Call= new CallCreator(to, from, uri).create(client)
        })

    }
}
```

```main.scala
object MainObject{

  def main(args: Array[String]){
    Twilio.call
  }

}
```

簡単！
環境構築不要のPython実行環境「Google Colaboratory」を試してみる

プログラミングを勉強してみたい！と思っている方にとって最初の難関になるのが環境構築ではないでしょうか？
機械学習やデータ解析に使われることが多いpythonにはAnacondaなど比較的簡単に構築できる環境がありますが、それでも全くの初心者には難しいかもしれません。

そこでおすすめなのが「[Google Colaboratory](https://colab.research.google.com/
)」です。

ColaboratoryはそのJupyter notebookを元に「ブラウザで実行」「ファイルはGoogleドライブに保存」「共同編集」などの機能を加えて作成されたツールです。
*Jupyter notebook -> ブラウザ上でpythonコードの実行ができる。Anacondaをインストールすると使えるようになる。

##まずは「Hello, Colaboratory」から
Jupyter notebookを使ったことがない方はまずは「Hello, Colaboratory」に一通り読んでみてください。

Hello, Colaboratoryを開くには・・・

ファイル - 最近のノートブックを開く - Hello, Colaboratory


![スクリーンショット 2018-04-06 23.25.32.png](https://qiita-image-store.s3.amazonaws.com/0/19516/97d0be71-ade7-d7f6-be4c-571fe12537ca.png)

![スクリーンショット 2018-04-06 23.25.52.png](https://qiita-image-store.s3.amazonaws.com/0/19516/674e07d5-8ebf-50a2-0ee8-246b3cd61995.png)

![スクリーンショット 2018-04-06 23.26.08.png](https://qiita-image-store.s3.amazonaws.com/0/19516/49ee616c-1910-a909-f010-fdbf909031eb.png)

Google ColaboratoryはTensorFlowの実行環境としてもおすすめです。
なぜなら「GPUアクセラレーション」が利用できるからです。

TensorFlowでまともなモデルを構築しようとするとどうしてもGPUが必要になります。
「TensorFlowを使ってみたいけどGPUが乗った計算機を持ってない！」という方にとってはとてもありがたいことではないでしょうか？

GPUアクセラレーションを有効にするには・・・
編集 - ノートブックの設定 - ハードウェアアクセラレーション
![スクリーンショット 2018-04-06 23.34.21.png](https://qiita-image-store.s3.amazonaws.com/0/19516/ec5b4d1a-784f-1c9a-e1f6-a68fb912b1d2.png)

![スクリーンショット 2018-04-06 23.34.35.png](https://qiita-image-store.s3.amazonaws.com/0/19516/f451ef3d-fec3-70bc-2cf9-97f9c8657ead.png)

「Hello, Colaboratory」の他にもmatplotlibやseabornを使ったグラフの書き方ガイドなどいろいろなノートブックが用意されています。
もちろん外部からのデータ読み込み、ローカルファイルやGoogleドライブなどへのダウンロードも可能です。
Swift4 Xcode TextFieldの二種類のピッカーによる条件選択

この記事は質問になります。
プログラミング 初心者です。

TextFieldを押して下からニョキと出てくるピッカー(ドラム）を二種類表示させてます
よくある地域の選択のページなのですが、色々調べたのですがわかりません

１つのピッカーには、日本の大まかな地域を表示（関東、関西、四国 etc)
もう１つのピッカーには47都道府県全てを表示させています。

大まかなピッカーで選択したエリア内の”県名だけ”を２つ目のピッカーに表示させたいのです
例　四国を選択→愛媛県、徳島県、香川県、高知県


なんとなくifを使うのかなって思うんですが、わかる方がいらしたらご教授お願いします。

以下コードです。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー




import UIKit

class SecondViewController: UIViewController, UITextFieldDelegate, UIPickerViewDelegate, UIPickerViewDataSource {

    @IBOutlet weak var text_field_daieria: UITextField!
    @IBOutlet weak var text_field_chueria: UITextField!

    let daieria_arr = ["","北海道地方","東北地方","関東地方","中部地方","関西地方","中国地方","四国地方","九州地方","沖縄地方"]
    
    let chueria_arr = ["","北海道","青森県","岩手県","宮城県","秋田県","山形県","福島県","茨城県","栃木県","群馬県","埼玉県","千葉県","東京都","神奈川県","新潟県","富山県","石川県","福井県","山梨県","長野県","岐阜県","静岡県","愛知県","三重県","滋賀県","京都府","大阪府","兵庫県","奈良県","和歌山県","鳥取県","島根県","岡山県","広島県","山口県","徳島県","香川県","愛媛県","高知県","福岡県","佐賀県","長崎県","熊本県","大分県","宮崎県","鹿児島県","沖縄県"]
    
    let my_pickerView = UIPickerView()
    
    var current_arr : [String] = []
    
    var active_textfield : UITextField!
    
    override func viewDidLoad() {
         super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        text_field_daieria.delegate = self
        text_field_chueria.delegate = self
        
        my_pickerView.delegate = self
        my_pickerView.dataSource = self
        
        text_field_daieria.inputView = my_pickerView
        text_field_chueria.inputView = my_pickerView
        
        create_toolbar()
    }
    
    func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
        active_textfield = textField
        
        switch textField {
        case text_field_daieria :
            current_arr = daieria_arr
        case text_field_chueria :
            current_arr = chueria_arr
        default:
            print("default")
        }
        my_pickerView.reloadAllComponents()
        
        return true
    }
    

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return current_arr.count
    }
    
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return current_arr[row]
    }
    
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        print(current_arr[row])
        active_textfield.text = current_arr[row]
    }
swagger.json を 静的html やPDFに変換するCircleCI 2.0 workflow

swagger.json を ドキュメント化して参照したいけどSwagger UIは使わない(運用したくない)。S3などで静的なHTMLサイトとして配信して楽したい。

https://github.com/nikushi/test-swagger-json-to-static-html

は circle yml のexample。

CircleCIのビルドパイプライン(workflow)でswagger.json -> asciidoc -> html -> S3 upload の順にビルドする流れ。git push してほったらかすといい感じドキュメントが仕上がる。

* swagger.json -> asciidoc は [Swagger2Markup-Cli](https://github.com/Swagger2Markup/swagger2markup-cli) で変換
* asciidoc -> html は [asciidoctor](https://github.com/asciidoctor/asciidoctor/blob/master/README-jp.adoc) で変換
* aws s3 コマンドでupload (未実装)

htmlではなくPDFなど他のフォーマットで生成するときは asciidoctor の引数を変更すればOKそう。

それぞれ dockerimage が用意されていたので簡単だ。
Android Studioで NDK が unsupported とかいって run できないケースの一つの対処

もう解決したからエラーメッセージを紛失したのだけど、以下のようなエラーが出た時

```
Android NDK: android-10 is unsupported. Using minimum supported version android-14.
```

- gradle.properties の PROP_COMPILE_SDK_VERSION　を高くする(俺は23にした)
- bundle.gradle の buildToolsVersion を最新にする(俺は26.0.2にした)
- clean project する（重要）
FESSの動作確認にはデバッグログが必須だと解りました

[FESS](https://fess.codelibs.org/ja/)からRedmineをクロールしようとして、インデックスが作られない問題に遭遇しました。

# 現象

[FESS](https://fess.codelibs.org/ja/)からRedmineをクロールすべく、「[FessでRedmineを検索するための認証方法](https://tottoto.net/fess-redmine-api-certification/)」を参考にして、リクエストヘッダにX-Redmine-API-Keyを設定する方法で、クローラを設定しました。

しかし、Default Crawlerを手動で実行するのですが、インデックスが全く作られません。ゼロです。この時、[FESS](https://fess.codelibs.org/ja/)の管理画面では障害は見当たりません。

# 調査のためにやったこと

## robots.txtの制限？

fess-crawler.logを見ると、robots.txtを参照した後クロールが終わっているように見えたので、robots.txtでアクセス制限がかかっているものと思い込み（これは間違いでした）、「[Add crawler.ignore.robots.txt=false to fess_config.properties](https://github.com/codelibs/fess/issues/568)」等に記されている方法を真似て、fess_config.propertiesや設定パラメータに ``crawler.ignore.robots.txt=true`` として見ましたが現象は変わりませんでした。

## デバッグログを見た

[FESS](https://fess.codelibs.org/ja/)は、インストール直後ログ出力レベルが（log4jの）INFOになっているようなので、DEBUGレベルにしてログを見てみました。

そこで解ったのは、Redmineの認証が失敗していることでした。HTTPではエラーであっても、[FESS](https://fess.codelibs.org/ja/)では障害として認識されないので注意しなければいけないことがわかりました。

# 対策

BASIC認証にして解決しました。

# 環境

  * ホストOS :　Windows 10 Pro Version 1709
  * 仮想化　：　VirtualBox 5.2.6
  * ゲストOS ： CentOS 6.9 / CentOS 7.4
  * Fess ： Fess 12.1.1
  * Elasticseach ： 6.2.1
Android Java 日付のみを比較する(時間は除外)

Javaで日時を比較する際に、時間は除外して日付のみを比較したかった。
"2018/04/06 12:15:27" と "2018/04/06 20:47:55" を比較して同じ日かのみを(時間は除外して)判定したかったのでメモ。

なんかすごく泥臭いやり方のような気がするけど、元がタイムスタンプでもDateクラスでもとりあえずCalendarクラスのインスタンス化し、時分秒ミリ秒に0をセットして、CalendarクラスのcompareTo()メソッドで比較するだけです。
なんかもっとスマートなやり方無いのでしょうか(Java初心者の小言)


```java
// 適当な日時のタイムスタンプから00:00:00:000のCalendarインスタンス作成
int oneDayTimeStamp = 1523017440;
Calendar oneDayCal = Calendar.getInstance();
oneDayCal.setTimeInMillis(oneDayTimeStamp * 1000L);
// 時分秒ミリ秒に0をセット
oneDayCal.set(Calendar.HOUR_OF_DAY, 0);
oneDayCal.set(Calendar.MINUTE, 0);
oneDayCal.set(Calendar.SECOND, 0);
oneDayCal.set(Calendar.MILLISECOND, 0);

// 現在日時の00:00:00:000のCalendarインスタンス作成
Calendar now = Calendar.getInstance();
// 時分秒ミリ秒に0をセット
now.set(Calendar.HOUR_OF_DAY, 0);
now.set(Calendar.MINUTE, 0);
now.set(Calendar.SECOND, 0);
now.set(Calendar.MILLISECOND, 0);

if (oneDayCal.compareTo(now) == 0) {
    // 0だと日付が同じ
}
```
　    
  
  

@swordone さんにコメント頂きまして、こちらが断然スマートです！  

```java
public int compareByDate (Calendar c1, Calendar c2) {
    int result = c1.get(Calendar.YEAR) - c2.get(Calendar.YEAR);
    return (result != 0) ? result : c1.get(Calendar.DAY_OF_YEAR)- c2.get(Calendar.DAY_OF_YEAR);
}
```
　    

@Luice さんからのコメント頂いた方法です。ライブラリを追加する必要がありますが、truncatedCompareToメソッドだけで済みます。truncatedCompareToメソッドが中でやっているのは、時分秒ミリ秒を0にするのtruncateメソッドを実行して、その後にCalendarオブジェクトからタイムスタンプを取得して比較しています。
AndroidのAPIとしてtruncatedCompareToメソッドが元々あって欲しいな〜と思ったり。(Kotlinはどうなんだろう)

```
// commons-lang3-3.7.jarをlibsフォルダにいれてbuild.gradleに以下記述を追加
compile files('libs/commons-lang3-3.7.jar') 
```


```java
// Calendar : c1, Calendar : c2
if (DateUtils.truncatedCompareTo(c1, c2, Calendar.HOUR_OF_DAY) == 0) {
    // 0だと日付が同じ
}
```
Getting convex hull in python

```python
COUNTER_CLOCKWISE = 1
CLOCKWISE = -1
ONLINE_BACK = 2
ONLINE_FRONT = -2
ON_SEGMENT = 0
#occw = {"COUNTER_CLOCKWISE":1, "CLOCKWISE":-1, "ONLINE_BACK":2, "ONLINE_FRONT":-2, "ON_SEGMENT":0}
def ccw(p0, p1, p2):
    a = np.array(p1)-np.array(p0)
    b = np.array(p2)-np.array(p0)
    #print("==p0,p1,p2,a,b==")
    #print(p0,p1,p2,a,b)
    #print("==corss,dot==")
    #print(np.cross(a,b),np.dot(a,b))
    if (np.cross(a,b) > np.finfo(np.float).eps):
        return COUNTER_CLOCKWISE
    if (np.cross(a,b) < - np.finfo(np.float).eps):
        return CLOCKWISE
    if (np.dot(a,b) < - np.finfo(np.float).eps):
        return ONLINE_BACK
    if (np.linalg.norm(a)**2 < np.linalg.norm(b)**2):
        return ONLINE_FRONT
    return ON_SEGMENT

def andrewScan(s):
  u = []
  l = []
  if (len(s) < 3):
      return s
  #print(s)
  #s = np.sort([s])
  s = sorted(s)
  #print(s,len(s))
  u.append(s[0])
  u.append(s[1])
  l.append(s[len(s)-1])
  l.append(s[len(s)-2])
  for i in range(2,len(s)):
      for n in range(len(u),2-1,-1):
          if (ccw(u[n-2], u[n-1], s[i]) in [ONLINE_FRONT,CLOCKWISE]):
            break
          u.pop()
      u.append(s[i])
  #print(u)
  for i in range(len(s)-3,-1,-1):
      for n in range(len(l),2-1,-1):
          ret = ccw(l[n-2],l[n-1],s[i])
          if (ret in [CLOCKWISE,ONLINE_FRONT]):
              break
          l.pop()
      l.append(s[i])
  l = l[::-1]
  for i in range(len(u)-2,0,-1):
      l.append(u[i])
  return l

s = []
n = input()
for i in range(n):
    a = []
    a.append(map(int, raw_input().split()))
    for aa in a:
        x = aa[0]
        y = aa[1]
        s.append([x,y])

ret = andrewScan(s)
print(str(len(ret)))
out = ""
for x in ret:
    if (out):
        out = out + "\n"
    _out = ""
    for xx in x:
        if (_out):
            _out = _out + " "
        _out = _out + str(xx)
    out = out + _out
print(out)
```

```
7
2 1
0 0
1 2
2 2
4 2
1 3
3 3
5
0 0
2 1
4 2
3 3
1 3
```

* In getting convex hull, you must compare the return of ccw with ONLINE_FRONT also, I think.

# Refs.
* [append](https://www.pythonweb.jp/tutorial/list/index6.html)
* [C style For loop in Python](https://bdhacker.wordpress.com/2010/11/13/c-style-for-loop-for-python/)
* [定数](http://www.tohoho-web.com/python/variables.html)
* [pop](https://www.pythonweb.jp/tutorial/list/index8.html)
* [Python range() with negative strides
](https://stackoverflow.com/questions/9910090/python-range-with-negative-strides)
* [sorted](http://sota1235.com/blog/2015/04/23/python_sort_twodime.html)
* [if in list](https://www.pythonweb.jp/tutorial/list/index10.html)
電気系プログラミングガチ素人学生がC#のクラスを勉強する話　二日目　~メソッドとオーバーロード~

#まえがき
このレポートはSkype勉強会での活動を「書面としてアウトプットする」こと、「電気系の学生の成果物を作るための意識高い系のレポート」です。完全初心者なので、勉強会参加者の先輩たちから様々なツッコミを頂きながら書いております。それゆえに先輩たちの目から外れた誤字脱字等ございますが、ぜひともツッコミいただいて、私の勉強にさせていただければと思います。

## メソッドについて
以下のプログラムではShowの記述部分がメソッドに当たります。メソッドとは、クラスの動作、処理を示すものです。
クラスの中でどのような動作をするかどうかを設定する方法です。

```C#
using System;

namespace list_7._2
{
    class Person{
        public string FirstName{set;get;};
        public string LastName{set;get;};

        public string Show(){//パスカル記法に基づいて命名、今回は引数はなし
            return $"名前は{this.LastName}{this.FirstName}";//例の如く、this.LastName,this.FirstNameが展開されるように$を入れる。戻り値がこれにあたる。
        }
    }
    class Program
    {
        static void Main(string[] args)//先にMainメソッドが実行
        {
           var p = new Person();//Parsonクラスがコンストラクトされる。

           p.FirstName="太郎";
           p.LastName="山田";
           
           Console.WriteLine(p.Show());//ParsonクラスのなかのShowメソッドが呼び出される。

        }
    }
}
```

##命名規則について
C#はPascal記法、Java、PHP、Rubyなどでは、camelCase記法なので、先に後者の言語を学んだ方は注意です

##オーバーロードの注意
1.　同じ名前のメソッドがあることが許されない。
2.「引数の個数」もしくは、「引数のデータ型」が異なる場合のみ、許される。
→フィールドが名前で識別されるが、メソッドは名前以外にも、引数の型・並び（この並びのことをシグニチャという。）までを見るため。

2の条件を満たした状態でのコンストラクトのことをオーバーロードという。

#あとがき
以前の回でご指摘頂いた方、ありがとうございます。もう少し、時間をください。「プロパティ」習ったときに直しを入れて、もう一度投稿いたします。
今回は、オーバーロードを学習し、C言語ならった当方としては、すこし、分かりづらい部分もあったんですが、みなさんが修正や、説明を入れてくれるおかげで理解が早まっています。
まだまだ、先が長いですが、見通しもつきはじめまして、これからも学習を続けていきます。
それでは、またﾉｼ