OmniAICreator/Qiita-1.07M huggingface dataset:
特定のポート番号を使用しているプロセスの見つけ方

## 環境
- Windows 10（おそらく7, 8でも同様の手法を使用できるはず）

## 1. ポート番号からPIDを特定
コマンドプロンプトを起動する。
起動方法は、Windowsキー + Rで「ファイル名を指定して実行」を開き、「cmd」と入力してエンター。

下のコマンドを実行する。XXXXは、特定のポート番号を入力する。
```
netstat -nao | find ":XXXX"
```

今回は例として、特定のポート番号は8080でやってみる。

![ポート番号.PNG](https://qiita-image-store.s3.amazonaws.com/0/233011/9d052227-fd79-79f5-2139-331310e85e9a.png)

netstatコマンドは右から、
プロトコル／ローカルアドレス／外部アドレス／状態／PID
という順番で並んでいる。

今回の場合、左から2番目のローカルアドレスのポート番号が8080のPIDが7796ということを特定。

## 2. PIDからプロセスを見つける

タスクマネージャーを起動して、詳細タブを開く。
そこから1. で特定したPIDのプロセスを探す。

![タスクマネージャー.PNG](https://qiita-image-store.s3.amazonaws.com/0/233011/23b02483-f28e-0d67-a21f-57bb8fff2c21.png)

# 雑感
Tomcat起動したときに、たまに別プロセスでポート番号を使っていて起動できないことがある。
年に数回は使う手法で、毎回忘れるので、せっかくなので残しておこうと思いました。
bitanamiAMIでインスタンスを立てたときのwordpressのファイルの場所


AWSでwordpressを入れるとき、bitnamiのAMIで入れるとすでにwordpressが入った状態でインスタンスができます。
https://aws.amazon.com/jp/getting-started/tutorials/launch-a-wordpress-website/


で入れたはいいけどカスタマイズするためにwordpressのファイルがどこにあるんだろうってなったので探しました。


```
/opt/bitnami/apps/wordpress/htdocs
```

この下にwp_adminとかwp-contentが入ってました。
SQLserver環境周りで躓いたところ備忘メモ

SQLserver環境周りで躓いたところメモ。
SQLserverちゃんはちょっとのことで
すぐログイン出来なくなったりするので
とても気難しいなぁと感じる今日この頃。


# 他端末で作成したバックアップファイルを復元した場合のエラー

### ユーザーが既に存在しますと言われる場合

>Microsoft SQL-DMO (ODBC SQLState: 42000)
エラー 15023: ユーザーまたはロール [ユーザー名] は現在のデータベースに既に存在します。

SQLserverで、他端末で作成したバックアップファイルを復元したところ
ユーザーが作れない。

ユーザー作成をしてもそのユーザーはもういます！って言われるし、
createユーザーSQLも上手くいかない。
自分の端末上は、いないんですけど…。

復元したDB内に存在するユーザーは、ユーザー名で紐づいているのではなく
実はIDで紐づいているらしい。(同じユーザーを作成してもエラーになる原因はこれ。)
その場合は、こちらのコマンドをSQLserver上から実施。
復元ファイルに入っていたユーザー情報を、自端末のユーザー情報に紐づけ直すコマンド。

```
Use [DB名]
ALTER USER DBのユーザー名 WITH LOGIN = ログインユーザー名
```

### 既定データベースを開けなくなった場合

他の端末で取得したバックアップを復元した場合、SQL server 4064エラーが出ました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/174609/be706d67-728b-9f9a-17d7-521c6e08970f.png)

前回はユーザーいなかったけど、今回はいるんですけどねー。
同じユーザーに見えますが、異なるIDに紐づいているから入れなくなってしまったのかなぁ。
こちらもALTER　USERで解決。

```
Use [DB名]
ALTER USER DBのユーザー名 WITH LOGIN = ログインユーザー名
```


# batで実行したSQLが上手く実行されない場合
>データ ソース名および指定された既定のドライバーが見つかりません

使用している環境の都合上、32bitのODBCを用意しているし、
インスタンスも消えてないし、環境面は問題なさそうなのに
環境面エラーっぽいエラー文が出る。

調べたら、bat内のコマンドが「osql」で作成されていた事が原因。
osqlコマンドをsqlcmdに記載を変更したら、うまく行きました。

```
sqlcmd -S サーバー名 -U ユーザー名 -P パスワード
```


# SQLサーバーに突如として入れなくなった場合

### ポート絡みがダメだった時の対処
ODBCをいじって再起動した直後、ログインできなくなりました。
これは、SQLserverの「TCP/IP」が外部からの接続を無効化していた事が原因。
SQL Server 構成マネージャ＞SQL Server ネットワークの構成から対象のプロトコルを選択し、TCP/IPを有効化にしたら再度ログインできるようになりました。

これで２時間くらい無駄にした…。



### サービスがダメだった時の対処
そして後日再発。
またログイン出来なくなった。度々ログインできなくなるのなんでなのー。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/174609/8cb4c270-5bd4-2ad5-0602-69895e00bae4.png)
>SQL Server への接続を確立しているときにネットワーク関連またはインスタンス固有のエラーが発生しました。サーバーが見つからないかアクセスできません。インスタンス名が正しいこと、およびSQL Serverがリモート接続を許可するように構成されていることを確認してください。(provider:Named pipes Provider,error:40 -SQL Server への接続を開けませんでした)(Microsoft SQL Server 、エラー:2)


また、ポート絡みかな、とSQLserver構成マネージャーを確認したら全て有効になっている。
どうやら、今回は違うらしい。

前回は問題なかったサービスを念のため確認。

なんのことはない「SQL server」のサービスが開始になっていない…！
なんでや。いつも使っているのは下のサービスなんですけど…。
インスタンスが複数あるのがいけないのかな。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/174609/5e846fd4-83bc-f8a4-a0f7-109347036191.png)
>上のサービスが開始になっていたので、停止。下のサービスを開始しました。


別インスタンスの「SQL Server」サービスを停止して、起動したいインスタンスの「SQL Server」を起動。
無事に入れるようになりました。

夏期休暇あけに起動したらまた再発したので使用しないインスタンスのサービスを無効にしました…。
Pythonを使った機械学習の勉強にはJupyter NotebookをHerokuの無料枠で立ててスマホからでも実行できるようにして共有しよう

# はじめに

社内で週１の機械学習の勉強会を主催しています。G-awaです。

勉強会は👇の本を輪読しながら、プログラムも書いていく方式で進めています。

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/9a389edd-6558-0973-de14-a9fff3015e5c.png)](https://www.amazon.co.jp/dp/B07BF5QZ41/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

プログラムも書きながら勉強会を進行していますし、
毎回いろんな人が参加するので、いちいちその人に合わせて開発環境をととのえるのが面倒でした。
それに、実行した履歴をどう残して振り返ろうかと考えていたのですが、とてもいい方法がありました。

それが**[Jupyter Notebook](http://jupyter.org/)**です。

# Jupyter Notebookとは

Jupyter Notebookは

1. Webページ上でPythonのコードを実行して、
2. それを履歴（ノート）として保存できるツールです。

さらにWebページとして、Markdown形式でのコメントの記述にも対応しているので
勉強会メンバーに共有する際にはもってこいのツールなんです。

[こちら](http://nbviewer.jupyter.org/url/jakevdp.github.com/downloads/notebooks/XKCD_plots.ipynb)をみればJupyter Notebookがどんなものかわかるはずです。

👇は勉強会で実際に書いてみたノートです。matplotlibなどの出力結果も綺麗にグラフとして保存できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/deaf6e0c-af98-cb9a-8050-814ccb579e9b.png)

# Jupyter NotebookはHerokuで動かす

通常は Jupyter Noterbook はローカルで立ち上げて、実行する人がほとんどかと思いますが、
勉強会でやったことをメンバーに共有したいので、どこかしらのサーバで立てられればいいなぁと思っていました。

AWSのSageMakerとかでやると簡単に構築できるのですが、お金がかかりすぎます。
そこで別のクラウドサービスして、わたしが日頃お世話になっているHerokuの無料プランを使用することにしました。

これでタブレットでもpythonを書いて実行する環境が手に入れられますし、電車の中でスマホから勉強会の復習もできちゃいます。

<img src=https://qiita-image-store.s3.amazonaws.com/0/163591/88bb6ca2-51e3-ec75-260f-3dea291f3b55.png width=300> <img src=https://qiita-image-store.s3.amazonaws.com/0/163591/9a4a822d-21d8-ed9a-68d2-26dd1d0565df.png width=300>

## Herokuでのインストール方法

<img src=https://qiita-image-store.s3.amazonaws.com/0/163591/086bf972-3843-ceb4-591c-286fd8462820.png width=300>

前提としてHerokuのアカウントはもう持っているものとします。

今回はこちらのソースを利用させてもらいました。
https://github.com/pl31/heroku-jupyter

まずはこのリポジトリをforkします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/9a673c7d-77f0-1b6a-5fa9-9ec913da6ac0.png)

forkしたら、自分のリポジトリに移動するので、「Deploy to Heroku」ボタンを押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/7616ceb8-7b69-4e83-2841-991d6633f1f9.png)

あとは流れにしたがって入力してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/2e97f9ff-a233-f5f3-a00f-a27b30e3b202.png)

JUPYTER_NOTEBOOK_PASSWORDを入れておくと、JupyterNotebookにログインするパスワードを設定することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/01b416d0-9bed-a44a-b587-636cb147ab48.png)


あとは、「Deploy app」を押してデプロイすれば完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/163591/1f141935-6562-9aa1-b2c7-c4458517ef6f.png)

無事、立ち上がりました。
先ほどのパスワード（JUPYTER_NOTEBOOK_PASSWORD）を入力してログインすれば使用できます。

# まとめ

1. Jupyter Notebookを使用すればPythonをブラウザから実行できる
2. 他の人に共有したいのでクラウドサービスにデプロイしておこう
3. Herokuだと無料で使用できるよ

以上です。
機械学習の勉強会をやる際にはぜひHerokuでJupyterNotebookを立ち上げてみてはいかがでしょうか？:blush:
Ruby の refinements が分からない

[Rubydoc](https://ruby-doc.org/core-2.5.1/doc/syntax/refinements_rdoc.html) には `module M` とか `class C` とか書かれていて分かりづらかったので、整理してみる。

# 二段階

- Refine用のモジュールを独自定義して、オープンクラスの動作を書いておく ( Refine のためだけに使うモジュール )
- あとで、好きなところで独自モジュールを「利用宣言」して、オープンクラスを「発動」させる

# 定義する

オープンクラスの「動作」を閉じ込めるイメージ。

```rb
# モジュールを独自定義
module MyRefineStringModule
  # あとでオープンしたい既存クラスを書く
  refine String do
    # 処理内容
    def first_5_characters
      self[0..4]
    end
  end
end
```

# 利用する

```rb
# Refinementsの利用宣言
using MyRefineStringModule

p "123456789".first_5_characters # 12345
```

# 感想

実際に使ってみると、やっていることは案外シンプルなんじゃないかという印象。
モジュールにオープンクラス処理を閉じ込めておいて、あとで発動させているんだろうな。


# 環境

- ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]

# 参考

- [File: refinements.rdoc [Ruby 2.5.1]](https://ruby-doc.org/core-2.5.1/doc/syntax/refinements_rdoc.html)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[WIP] Good CSS, Bad CSS

## !important
- Good CSS
  - 使われている箇所が少ない
  - インラインスタイルを打ち消していない
  - なぜ!importantを使っているのか、すべての箇所について説明できる
- Bad CSS
  - 使われている箇所が多い
  - CSSファイルの先頭の方に書かれている（normalize等は除く）
  - なぜ!importantなのかを説明することができない
  - 同じクラスに対して何度も!importantが使われている
  - スペルミスしている箇所があり、本当に有効な状態かわからない箇所がある

## float: left; & display: flex;
- Good CSS
  - floatではなくdisplay: flex;が使われている
  - justify-contentを使って、左揃え、右揃え、中央揃えをしている
  - align-items, align-selfを使って上下の揃えをしている
- Bad CSS
  - float: left !important;が乱立している
  - float: left;, float: right;を駆使して、左右に配置している(justify-content, align-itemsで代用できます)
  - floatが指定されている要素の親要素にclearfixを付け忘れている
機械学習論文読みメモ_132

[Distilling a Neural Network Into a Soft Decision Tree](https://arxiv.org/abs/1711.09784)
deepnetは分類問題に対して有効な手段として知られている。
しかし、学習されたモデルは、その予測の根拠を説明する事が難しい。
そこで、hierarchical decision treeのような形にモデルを変換し、
説明を可能にする事ができる事は望ましい。
本論では、学習済のdeepnetをもとにsoft decision treeの
形式で学習データの入力から直接説明可能なdecision modelでかつもとのdeepnetと同等以上の性能を実現
する手法を提案する。

[Knowledge Concentration: Learning 100K Object Classifiers in a Single CNN](https://arxiv.org/abs/1711.07607)
粒度の高い画像ラベルは基本的には望ましい事である。
しかし大量の種類のラベルが存在する場合、その学習は困難になる。
そのため一般的には、ある特定の種類のクラスに絞ったモデルを
複数学習し、それらを組み合わせて利用する。
しかしこのやり方ではスケールさせる事が難しくなる。
本論では、この問題に対処する手法として、
Knowledge Concentrationを提案する。
この手法は、学習された特化型のモデル群を用いて、
それを一つのモデルに対してdistillationを行う事により、
大量のクラスに対する分類を一つのモデルにて実現する。

[VoxelNet: End-to-End Learning for Point Cloud Based 3D Object Detection](https://arxiv.org/abs/1711.06396)
自動運転などを始めとして、3D point cloudを用いた
高精度な物体検出は重要である。
画像認識で用いられるregion proposal network(RPN)を
スパースなpoint cloudと組み合わせる試みは、
bird's eye view projectionなどの人手で作られた特徴に依存している。
本論では、そうした人手による特徴抽出に頼らない手法として
VoxelNetを提案する。
この手法はpoint cloudから物体検出までを一貫してend to endに行う。
この手法では、point cloudを空間を等分して作るvoxelによって分け、
新たに提案するvoxel feature encoding layerを用いて各voxelに含まれる
点群に対する特徴抽出を行う。
この特徴は空間的な表現であって、これをＲＰＮと組み合わせる事で
物体検出を実現する。
機械学習論文読みメモ_131

[ADVERSARIAL DROPOUT REGULARIZATION](https://arxiv.org/abs/1711.01575)
ラベルの十分あるdomain sourceよりラベルなしのdomain sourceへneural represenationを写像する手法を
提案する。
Adversarial methodはドメインに関する分類器を騙すような写像器を学習させる事でこの問題を
扱ってきた。
しかしこのアプローチの問題点として、分類器が単純にあるドメインかどうかを判別する単純な
基準しか持たない事にあった。
この場合、クラス間の境界をあまり考慮できず、境界付近に属する
曖昧な特徴写像がされやすくなってしまう。
本論で提案するAdversarial Dropout Regularizationは写像器が
より判別性の高い特徴写像を可能にできるようにする。
この手法は分類器に対してdropoutを用いる事で、
Non-discriminative featureを検知する。
そして写像器に対しそうしたnon-discriminative featureが存在する
空間を避けるように学習させる。

[Recontstruct & Crush Network](https://nips.cc/Conferences/2017/Schedule?showEvent=9232)
データに対してadversarialなenergy-based modelを提案する。
つまり、positive exampleに対してenergyを最小化しつつ、negativeあるいはunlabeled exampleに対するenergy
を最大化する学習を行う。
モデルはautoencoderを利用し、再構成誤差をenergy functionで表現、またその誤差がunknown dataに対する距離を表している。
結果、学習されたモデルはpositive sampleに対してはその再構成を、negative (unlabeled) sampleに対してはそれを壊してしまうような挙動を持つ。
このモデルはpositive and unlabeled learningや、covariance shift問題に対して用いる事ができる。
特に、imbalancedなデータに対して有効である。

[Self-Supervised Intrinsic Image Decomposition](https://arxiv.org/abs/1711.03678)
Visual scene understandingなどにおいて、そのタスクはただobjectの位置とクラスを検知するだけでなく、
その形、照明、色合い等のより具体的な要素まで検出する事も大事である。
このような要素まで物体を分解して検出するタスクをintrinsi image decompositionと呼ぶ。
従来、このタスクは教師あり学習の文脈で扱われてきた。
本論は、これに対してself-supervisedな手法を提案する。
この手法では、物体の反射、形、照明を画像から推定する。
この際、物体の要素への分解だけでなく、要素から物体の復元も学習する事で、
再構成誤差を利用したself-supervised learningが可能になる。
機械学習論文読みメモ_130

[XGAN: UNSUPERVISED IMAGE-TO-IMAGE TRANSLATION FOR MANY-TO-MANY MAPPINGS](https://arxiv.org/abs/1711.05139)
Style transferではstyle画像のcolorとtextureをもう一つのcontent画像へ
そのstructureを変えることなく適用する。
本論ではそれをより一般化したsemantic style transferを扱う。
この問題では、pair化されていない２つのドメインの、コンテンツは共有された画像群に対して、
Corpus-level(ドメインレベル？）のstyle transferを行う。
本論で提案するXGANはdual adversarial autoencoderであり、
このモデルはdomain共通なsemantic contentをshared representationに獲得しつつ、
Domain-to-domain mappingをさらに学習させる。
この手法はdomain adaptationの文脈を参考にsemantic consistency lossを導入することで、
学習された埋め込み空間内におけるsemanticsを維持するよう誘導する。

[High-dimensional dynamics of generalization error in neural networks](https://arxiv.org/abs/1710.03667)
本論はgradient descentを用いた大きなneural networkのgeneralizationに関してaverage case analysisの観点から分析した。
特にデータサンプル数よりもパラメータの数が多くなるような高次元設定を扱う。
Random matrix theoryやlinear modelの厳密解を用いる事で、学習時における
汎化誤差及び学習誤差の動的な特徴を導出した。
そしてそれらがタスクのS/N比とデータの次元にどのように関連しているかを明らかにした。
結局、gradiant descentを用いた学習は、その挙動の特徴により、overfittingとovertraningを防いでいる
事がわかった。
さらにパラメータ数がデータ数と同じ時にovertraningはworstになるが、
パラメータ数を少なく、あるいは多くする事でovertraningを軽減させる事が可能になる。
また、高次元なモデルの学習において、低い汎化誤差を得るためには、
パラメータの初期値を小さい値からスタートさせる事が重要である事がわかった。
一方非線形ネットワークにおいて、そのサイズを大きくする事は汎化性能に悪影響を
与えない事がわかった。
逆に、サイズを大きくする事でovertraningを防ぐ効果がある事が判明した。
このようなネットワークにおいて判明したのは、ネットワークのいくつかの部分空間は
使われておらず、学習において更新されない事。また高次元モデルの統計的性質は
入力の特徴をwell-conditionedな形で捉え、それがovertrainingを防ぐ役目を果たしている事である。

[THREE FACTORS INFLUENCING MINIMA IN SGD](https://arxiv.org/abs/1711.04623)
Stochastic gradient descentの特性に関する研究を行った。
SGDをstochastic differential equationにより近似する事で、
損失の勾配の分散に対して等方性を仮定した場合に得られる
SDEのBlotzmann-Gibbs equilibrium distributionを考える。
このdistributionを分析する事で、３つの要素：
Learning rate, batch size, 及び損失勾配の分散によって、
SGDの局所解の深さ及び幅のトレードオフが決まる事が分かった。
この時、learning rateとbatch sizeは直接コントロールが可能だが、
Loss varianceはモデルか決まる。
またequilibrium distribution上はlearning rateはbatch sizeの比としてのみ出現
するため、この比を保ったまま学習中にリスケーリングが可能という事になる。
Lambdaの最大ペイロードサイズについて

# 1. まとめ

Lambdaのペイロードサイズについて確認する．2018/7/2現在，Lambdaのリクエストボディの最大ペイロードサイズは6MBとなっている．本記事では，6MBを超えたときの挙動を確認する．リクエストのペイロードサイズが6MBを超えると，`{"message": "Request Too Long"}`のエラーが返却される．

# 2. 目次

- 1 まとめ
- 2 目次
- 3 確認
- 4 参考リンク

# 3.　確認

Lambdaのリクエストボディの最大ペイロードサイズについて確認する．2018/7/2現在，Lambdaのリクエストボディの最大ペイロードサイズは6MBとなっている．[AWS Lambda の制限](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/limits.html)にて確認出来る．実際に6MB以上のファイルを送った場合にどうなるか確認する．

6MB以上のでかい画像ファイルを準備する．

```bash
$ du -sh scene_large.jpg
8.1M	scene_large.jpg
```

[API Gateway+Lambdaでバイナリデータを処理](https://qiita.com/akatsukaha/items/024fbabc9a321665cb23)を参考に環境を構築する．

上記で準備した6MBサイズ以上の画像データをAPIGatewayにPOSTする．API Gatewayのペイロードサイズは10MBなので，API Gatewayは通る．Lambdaはリクエストボディの最大ペイロードサイズが6MBなので容量が大きすぎるというメッセージが返却される．

```bash
$ curl -X POST -H 'Content-type: image/jpeg' --data-binary "@scene_large.jpg" https://xxxxxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/v1/upload

{"message": "Request Too Long"}
```

# 4. 参考リンク

- [AWS Lambda の制限](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/limits.html)
Python3 覚え書き: インタラクティブモードで pythonスクリプト (main) を実行するには？

## はじめに

最近少しずつpythonを使って書くようにしています。
今回は、本当に覚え書き程度です。

### やりたいこと

表題の通りです。

### どうしてそうしたいの？

もう少し背景を説明しますと...。

最近は学習のため、ちょっとしたスクリプトでもクラスを作って処理を書くようにしています。
その分、確認のために細かい単位でメソッドを用意して、インタラクティブモードでメソッド単位での動作をチェックしながら、少しずつ書いています。

さて、最終的には、コマンドラインから python xxxx.py と実行する形になりますので、スクリプトに main()の処理を添えていきます。
せっかくなので、別にターミナルを開かなくとも、インタラクティブモード内でimportしたスクリプトmainが実行できないかしら？と考えました。

### やってみる

以下、簡単ですが覚え書き。
まずはスクリプト。
hello.py という名前で保存してみます。

```python

class Usausa:
    def __init__(self, name):
        self.name = name;

    def greeting(self):
        print("こんにちは、{name} です〜。呼んでくれてありがとう".format(name=self.name))

    def greeting_with_real_name(self):
        print("こんにちは！ほんとの名前は Usausa-{name}です！".format(name=self.name))

if __name__ == '__main__':
    usa = Usausa('2号')
    usa.greeting()
    usa.greeting_with_real_name()

```

### インタラクティブモードで呼んでみる

こちらを、インタラクティブモードで動かしてみます。

- まずは、作成したhello.pyを読み込みます (from hello import Usausa)
- Usausaクラスのインスタンスを作ります
- インスタンスメソッドを実行します

```python

PyDev console: starting.

Python 3.6.4 (default, Mar 22 2018, 14:05:57) 
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
>>> from hello import Usausa 
>>> usa = Usausa('1号')
>>> usa.greeting()
こんにちは、1号 です〜。呼んでくれてありがとう

>>> usa.greeting_with_real_name()
こんにちは！ほんとの名前は Usausa-1号です！

```

エディタからインタラクティブモード (python consoleなどという感じ）を呼び出し、このようにメソッド単位で呼び出したりデバッグしたりします。

### subprocessモジュールを使ってみる

同じ内容を、main()として定義しているので、今度は表題のことを、[subprocess](https://docs.python.org/ja/3/library/subprocess.html#module-subprocess)モジュールを使ってやってみます。
結局、特に凝った方法ではなくてごめんなさい...

- rubyだとsystemやIO.popenになります

> subprocess モジュールは新しいプロセスの開始、入力/出力/エラーパイプの接続、リターンコードの取得を可能とします。このモジュールは以下の古いモジュールや関数を置き換えることを目的としています
(上記のpython documentから引用)

ということで実行。


![subprocessを使ってみる.png](https://qiita-image-store.s3.amazonaws.com/0/27976/47bd2649-d44c-c64e-66bb-2c1546b52037.png)

subprocessでの実行結果（標準出力）を変数に入れたい場合は、communicate()を利用します。

まずは普通に実行。

```python

>>> import subprocess
>>> subprocess.Popen("python hello.py",shell=True)
<subprocess.Popen object at 0x101a2eac8>

こんにちは、2号 です〜。呼んでくれてありがとう
こんにちは！ほんとの名前は Usausa-2号です！
```

出力やエラーをいったん受け取りたい場合は PIPEを使い、communicate()で呼び出して格納します。

```python

>>> value = subprocess.Popen("python hello.py",shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

>>> stdout_data, stderr_data = value.communicate()
>>> print(stdout_data.decode('utf-8'))
こんにちは、2号 です〜。呼んでくれてありがとう
こんにちは！ほんとの名前は Usausa-2号です！
```

以上、またまた簡単な覚え書きでした。

popenについてももっとドキュメントを読むこと、それ以上にそもそものプロセスの実行の仕組みを、ちゃんと理解しないといけない、という課題が出てきましたので、引き続き頑張ります。

間違いや「こうした方法があるよ！」といったご指摘、コメントも頂けると幸いです。
OculusgoにQi充電シートを貼ってワイヤレス充電

OculusGOの充電を忘れることが多かったのでqi充電シートをつけました。OculusGOはmicrousb給電なので、microusb給電のQiシートを接続すればワイヤレス充電できるようになります。

## OculusGO有線充電っ？？？
せっかくワイヤレスなのに充電だけワイヤードってださいですよね。
普段viveとか触っててたまにOculusGO触るかってなると充電切れてること多いです。それで充電しながら使ってたらケーブル挿すからスタンドアローンの利点とは？？ってなります。それで[OculusGOでbeatsaberやってたとき](https://qiita.com/Hasshi7965/items/ee9214e814cfc548a495)最初ケーブル挿してやってたんですけど、充電間に合わなくてすぐ電池切れたので充電ある程度終わるまで待ってからやってたんですよね。そのせいで午前5時まで起きてるみたいなことになるのでハイパー不健康です。

その点ワイヤレス充電っていいです。わざわざケーブル刺さなくていいので楽ちんですし、気がついたら充電満タンですし。というわけでやりました。


# 買ったもの
[Qi充電レシーバー](https://www.amazon.co.jp/gp/product/B07CWPZZCZ/ref=oh_aui_detailpage_o02_s00?ie=UTF8&th=1)
[Anker PowerPort Wireless 5 Pad](https://www.amazon.co.jp/Anker-PowerPort-Plus、GalaxyS9-その他Qi対応機種-ワイヤレス充電各種対応/dp/B075SS87X7/ref=sr_1_3?s=electronics&ie=UTF8&qid=1531082000&sr=1-3&keywords=anker+wireless+charger)

# 注意
Qiシートには裏表はありませんが、microusbには向きがあるので買う端子の向きを間違えると残念なことになります。

僕は間違えました。(一応買ったものリストのリンクは正しい方にしておきました)
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">シート自体に裏表なくてもmicro-usbにはあるのでこんな感じに <a href="https://t.co/CJndGzhjUQ">pic.twitter.com/CJndGzhjUQ</a></p>&mdash; はっしー（BB） (@Hasshi7965) <a href="https://twitter.com/Hasshi7965/status/1016045381593862144?ref_src=twsrc%5Etfw">July 8, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

##ちなみに充電中 (2018/07/09. 8:30)
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">やっぱりこうしないと充電できないんですけどusbって直流だから裏表逆だと電流逆向きに流れるとかないですか？ <a href="https://t.co/QodCfa2mQw">pic.twitter.com/QodCfa2mQw</a></p>&mdash; はっしー（BB） (@Hasshi7965) <a href="https://twitter.com/Hasshi7965/status/1016101227086602240?ref_src=twsrc%5Etfw">July 8, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

普通に置くと電流が逆向きに流れて~~マッハで~~普通に電池なくなります。

ちゃんとした向きのシート買いました。
## さらに更新 (2018/07/09. 8:36)
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">ねじれ</p>&mdash; なむれす911 (@nameless911) <a href="https://twitter.com/nameless911/status/1016102680329007104?ref_src=twsrc%5Etfw">July 8, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


解決策をもらったのでさっき注文したシートはキャンセルしました

#注意2
充電中はどうしてもシートが発熱します。oculusgoの平面の部分は放熱板の機能を果たしているらしいので、充電しながらOculusGOに負荷がかかるゲームをすると不具合が起こるかもしれません。

どうやったらQi充電しながらゲームできるのかは知りませんが。

## まとめ
OcukusGOにQi充電のシートを貼るとワイヤレス充電できるようになってケーブルの抜き差しが要らなくなって良いです。
シートと充電器合わせて3000円とちょっとなので買ってみてもいいと思います。
non-rootユーザでchrootしてCentOS5上でCentOS6を動かす

管理者権限を持っていたら、普通にchrootすればよいのだけど、共用パソコンなどでroot権限なしで頑張る方法。
dotnet coreをCentOS5でも動かしたくて頑張ってみた。惜しいところまではいったけど、途中で力尽きた。
ちなみに、chrootでOSのバージョンを疑似的に上げられるのは、ホストLinuxカーネルが対応している最大のglibcのバージョンまで。
CentOS5->6は可能だけど、5->7は無理。
必要なもの：fakeroot, fakechroot
https://github.com/mackyle/fakeroot
https://github.com/dex4er/fakechroot/wiki

それぞれgit cloneして、configure, make, make installだったと思う。(適当)

これらをインストールした先は
/opt/fakeroot
/opt/fakechroot
とする。

CentOS6のファイルたちは適当にdockerあたりで最小構成でpullして
docker run -it centos:centos6 /bin/bash
で起動して、
/bin
/etc
/lib
/lib64
/sbin
/usr
/var
辺りをコピーしてくる。細かいところは普通にchrootするときにmknod, mountしないといけないファイル以外全部取ってくればよい。
最低限chrootバイナリを持っているイメージを使用すること。持っていたら/usr/sbin/chrootにある。

取ってきたファイルは、CentOS5では
/opt/centos6
に置くとする。
fakechrootの場合、mknod, mountは出来ないので、その代わり
ln -s /dev /opt/centos6/dev
ln -s /proc /opt/centos6/proc
などとすれば、fakechroot後にそのディレクトリが見える。

いよいよ疑似CentOS6に入る。

```shell
FAKECHROOT_ELFLOADER=/opt/centos6/lib64/ld-2.12.so LD_PRELOAD=/opt/fakeroot/lib/libfakeroot.so:/opt/fakechroot/lib/fakechroot/libfakechroot.so /opt/centos6/lib64/ld-2.12.so --library-path /opt/centos6/lib64:/opt/centos6/lib:/opt/centos6/usr/lib64:/opt/centos6/usr/lib --inhibit-rpath /lib64:/lib:/usr/lib64:/usr/lib /opt/centos6/bin/bash
```
これで、疑似的にrootになったCentOS5のシェルに入れる。
で、最後にchrootしてCentOS6へ。

```sh
export LD_LIBRARY_PATH=/opt/centos6/lib:/opt/centos6/lib64:/opt/centos6/usr/lib64:/opt/centos6/usr/lib 
/opt/centos6/usr/sbin/chroot /opt/centos6
```

そのあと、gccを入れ替えないとdotnet coreが動かないのでソースからgccをコンパイルして入れ替えたけど、まだ、

```sh
bash-4.1# /opt/dotnet/dotnet
realpath(): Too many levels of symbolic links
Failed to resolve full path of the current executable [/proc/self/exe]
```
となってしまって、dotnet coreは動いていない。
dotnet coreは何やら/proc/self/exeに作られたシンボリックリンクから自分の実行ファイル名をとってきているっぽい。
そこで、/procはもとのCentOS6のイメージからフォルダごとコピーしちゃって、/opt/dotnet/dotnetのシンボリックリンクを/proc/self/exeに作る。
すると、

```sh
bash-4.1# /opt/dotnet/dotnet

Usage: dotnet [options]
Usage: dotnet [path-to-application]

Options:
  -h|--help            Display help.
  --version         Display version.

path-to-application:
  The path to an application .dll file to execute.
```
動いた！

ただ、動かしたいC#のプロジェクトに入って、/opt/dotnet/dotnet runすると、

```sh
bash-4.1# /opt/dotnet/dotnet run
Failed to load3▒++, error: /opt/centos6/lib64/libc.so.6: version `GLIBC_2.14' not found (required by /opt/centos6/opt/dotnet/host/fxr/2.0.0/libhostfxr.so)
The library libhostfxr.so was found, but loading it from /opt/dotnet/host/fxr/2.0.0/libhostfxr.so failed
  - Installing .NET Core prerequisites might help resolve this problem.
     http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
```

となる。GLIBCを2.14以上に上げたCentOS6イメージからとってくれば良さそうではある。。。
まだ目的は達成していないけど、yumも使えるし、non-rootでrootっぽい雰囲気は味わえる。
ところどころ元のパス名(/opt/centos6)が見えたりするのが不安なfakechrootではあるけど、CentSO6のバイナリが動いているところもあるので、誰かの役に立てばと思い公開。
【C++】boost::timerを使おうとしてコンパイルで詰まった話

#はじめに
諸事情により，C++でタイマー処理を書きたくなった．
環境はMacOSであるため，WINAPIなるものを使うことは出来ません．
さて，どうしましょう？ 
ということでBoostライブラリを利用したが，コンパイルで詰まったので個人的にメモしておく．
(情報・表現の正確性は保証しません)

#Let's Boost!
「Boost （ブースト）とは、C++の先駆的な開発者のコミュニティ、およびそのコミュニティによって公開されているオープンソースライブラリのことを指す。」 (Wikipediaより引用)
研究でBoostライブラリに依存した某シミュレータを使っている関係上，真っ先にBoostライブラリが思い付いた．
調べたらやっぱりタイマー処理が良い感じに出来るみたいなので使っていきましょう．

#Boostのインストール
```
brew install boost
```

インストールしたらPATHを通さなきゃいけないみたい．
`.bash_profile`に以下の内容を追記する．

```
export PATH=$PATH:/usr/local/Cellar/boost/1.65.1_1/include
export PATH=$PATH:/usr/local/Cellar/boost/1.65.1_1/lib
```
Homebrew使って入れたなら`/usr/local/Cellar/boost/`あたりに入っていると思うので適宜書き換えてください．
見つからなかったら`sudo find / -name '*boost*'`とでも打って検索すれば良いんじゃないですかね？

#実行してみる
とりあえず動作確認してみる．
コードは https://boostjp.github.io/tips/timer.html から引用しました

```timer.cpp
#include <iostream>
#include <cmath>
#include <boost/timer/timer.hpp>

int main()
{
    boost::timer::cpu_timer timer; // 時間計測を開始

    for (long i = 0; i < 100000000; ++i) {
        std::sqrt(123.456L); // 時間のかかる処理
    }

    std::string result = timer.format(); // 結果文字列を取得する
    std::cout << result << std::endl;
}
```

実行結果は以下の通り．

```
$ g++ timer.cpp
Undefined symbols for architecture x86_64:
  "boost::timer::auto_cpu_timer::auto_cpu_timer(short)", referenced from:
      _main in timer-4497dd.o
  "boost::timer::auto_cpu_timer::~auto_cpu_timer()", referenced from:
      _main in timer-4497dd.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation
```

コンパイルエラーです．困った． (wscriptが予め入っていて`./waf`でよしなにやってくれる某シミュレータとは勝手が違いますね......)
ということで調べてみると，私と同じところで詰まった人がいたみたい．
https://stackoverflow.com/questions/10565117/undefined-reference-to-boosttimerauto-cpu-timer

要するに`-lboost_timer`って書いてboost_timerへリンクしてあげないといけないみたいです．
ということで以下のようにして実行

```
$ g++ timer.cpp -lboost_timer
$ ./a.out
 0.323706s wall, 0.320000s user + 0.000000s system = 0.320000s CPU (98.9%)
```

ちゃんと動いた．めでたしめでたし．

Boostで他の機能を使う場合に`-lboost_system`とか書く場合もあるらしい．
あとBoost.Pythonを使うときには`-lboost_python`とか書く．
とりあえずPATH通してても動かなかったら `-lboost_<name>`みたいなコンパイルオプション調べれば良さそう？
SlickでasNavForしたときにうまく動かない

slickプラグインでasNavForを使ったときに、

* クリックしても動かない
* 一応動くけど、挙動がおかしい

など、起きたことないでしょうか？

調べると、**slickGoToを使って解決**や、**accessibility: falseで解決**。
みたいなのを見かけたんですが、私は直りませんでした。

とりあえず私が解決した方法でご紹介

## 原因
**公式の使い方と違う使い方をしている。**

公式には(http://kenwheeler.github.io/slick/)

```html:correct.html
<div class="your-class">
  <div>your content</div>
  <div>your content</div>
  <div>your content</div>
</div>

<script type="text/javascript">
  $(document).ready(function(){
    $('.your-class').slick({
      setting-name: setting-value
    });
  });
</script>
```
とあります。（少し端折ってますが）
これにアレンジを加えて

```html:wrong.html
<div class="your-class">
  <div class="slick-slide">your content</div>
  <div class="slick-slide">your content</div>
  <div class="slick-slide">your content</div>
</div>
```
といったようにやってないでしょうか？

読み込むまで縦並びになるのがいやで、予め入れてたりしていたのですが、**`slick-slide`を小要素につけてしまうとバグてしまうようです。**

## 解決
**小要素にクラス名`slick-slide`を使わなければ大丈夫です。**

なので、読み込み終わるまで縦並びにしたくない場合は

```html:toriaezu.html
<style>
  .your-class .your-class-child {
    display: none;
  }
  .your-class .slick-slide .your-class-child {
    display: block;
  }
</style>

<div class="your-class">
  <div class="your-class-child">your content</div>
  <div class="your-class-child">your content</div>
  <div class="your-class-child">your content</div>
</div>
```
など、オリジナルのクラスをつけてスタイルをつけてしまいましょう。

参考サイト様 ( https://github.com/kenwheeler/slick/issues/475 )
map((3 <= n)次元, 2次元)

「Computerが普及する以前，(3 <= n)次元座標の存在を2次元化する技法が隆盛を極めた」と歴史家が評するのはいつ頃になるのだろうか．

音符にしても数式にしても，棄てられている情報がある．

8分音符で表されたtoneを弦楽器で弾いた場合，音量を記録するLoggerが表すgraphは，特殊な奏法を用いない限り，水平線にはならない．

結果をcaptureするvariableに1を+=しようが10を+=しようが，かかるvariableが0からnとなる尺は一緒．

業務用アプリばかりつくってきて，animationをprogrammingしようとしたら，そんなことにきづいた．
CordovaのAndroid版アプリでもYoutubeの自動再生を可能にする


## まえがき

モバイルアプリケーション開発においてYoutube等のメディア自動再生とその他機能(※)は
不必要な通信を防ぐためにOFFになっており、それはネイティブアプリ開発時だけでなく
JavaScript+Cordovaを使用してハイブリッドアプリを開発するときも同様です。


※自動再生だけでなく、ユーザが最初に再生ボタンを押してからでないと
再生停止ジャンプその他様々なメディアコントロールをコードから行うことが出来ません。


これをONにするための[Cordovaのオプション](https://cordova.apache.org/docs/en/latest/config_ref/index.html)はiOSに存在するもののAndroidにはありません。
とはいえ、「じゃーCordova使った開発ではAndroidだけYoutube自動再生できないのかよ :cry: 」
といえばそうでもなく、Androidのネイティブアプリ設定APIにある
`setMediaPlaybackRequiresUserGesture(true/false)`というメソッドを叩くことで
有効化出来ます。

## コード修正

いじるファイル(com/example/hogeはアプリ名と名前空間です。適宜読み替えて下さい。)

platforms/android/app/src/main/java/com/example/hoge/MainActivity.java

```java
import android.os.Bundle;
import org.apache.cordova.*;
import android.webkit.WebSettings; // ★追加
import android.webkit.WebView; // ★追加

public class MainActivity extends CordovaActivity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        // enable Cordova apps to be started in the background
        Bundle extras = getIntent().getExtras();
        if (extras != null && extras.getBoolean("cdvStartInBackground", false)) {
            moveTaskToBack(true);
        }

        // Set by <content src="index.html" /> in config.xml
        loadUrl(launchUrl);
        
        // ★追加
        WebView wv = (WebView) appView.getEngine().getView();
        WebSettings ws = wv.getSettings();
        ws.setMediaPlaybackRequiresUserGesture(false);
    }
}

```

## 蛇足

platforms以下をGit管理下に置きたくないという場合は別の場所にMainActivity.javaファイルを保存して
そちらをバージョン管理し、Cordovaのhook機能を使ってビルド前に移動するのが良いと思います。


config.xml

```xml
<platform name="android">
  <hook type="before_build" src="scripts/updateMainActivity.sh" />
  ...
```

scripts/updateMainActivity.sh

```bash
#!/bin/bash

# 例えばnative_codesにMainActivityを置いている場合
cp native_codes/MainActivity.java platforms/android/app/src/main/java/com/example/hoge/MainActivity.java
```
コーディングのタイピング練習ができる！ typing.io の紹介

先日、会社でタイピング大会を行いました。
タイピング大会といえば、 `e-typing` のように日本語のタイピングを想像する人が多いと思います。

ただ、それではつまらないので、エンジニアらしく、コーディングのタイピング速度を競う大会にしました。

今回はそこで利用したプログラミング言語のタイピングサイト `typing.io` を紹介します。

https://typing.io/

# やり方

![スクリーンショット 2018-07-09 01.56.40.png](https://qiita-image-store.s3.amazonaws.com/0/67424/ed542d2b-5f95-fec9-a9b7-9c4e7de9f4e2.png)

まずは、 https://typing.io/ を開きます。
Googleアカウントでログインする必要があるので、 `sign in` からGoogleアカウントでログインします。

その後、 `lessons` をクリックします。

![スクリーンショット 2018-07-09 01.56.57.png](https://qiita-image-store.s3.amazonaws.com/0/67424/dd99c988-da09-90d7-17c7-88f16d22f201.png)

上記のように、様々なコードが最初から用意されており、課金すれば自分でコードを上げて練習できます。（$9.99/month)

試しに Rails のコードを選択してみます。

![スクリーンショット 2018-07-09 01.57.17.png](https://qiita-image-store.s3.amazonaws.com/0/67424/224b4811-2681-f24a-952b-04b6b72381e0.png)

上記のように、コードが表示され、画面に従ってタイピングしていきます。
間違えると、ちゃんとバックスペースで間違えた部分まで戻る必要があるというもので、本当にコーディングしているかのようにタイピングできます。

![スクリーンショット 2018-07-09 01.59.26.png](https://qiita-image-store.s3.amazonaws.com/0/67424/798e5c2b-d3e9-f08e-ca4e-3f334d79caf6.png)

終了すると、上記のようにサマリーが表示され、結果がわかります。

# 終わりに
結構楽しいので皆さんやってみてください。
弊社のタイピング大会は大盛況でした。私は負けてしまいましたが…。

タイピング速度とエンジニアの能力には、おそらく相関はないと思いますが、速いに越したことはないので、皆さんこの機会に練習してみてはいかがでしょうか。たぶん 70 wpm 平均で出せるようになればかなり速いと思います
（私はそこを目指して日々練習中です（ergodox ezを買ったばかりで配列に慣れる意味も込めて練習してます)
CircleCI 2.0設定例 (rails 5.2 + webpacker + rspec + mysql)

## はじめに

https://circleci.com/

> Support for CircleCI 1.0 will end on August 31, 2018. Gain more flexibility with workflows, customize your environment with Docker, and access more powerful resources with CircleCI 2.0.

今までのCircleCI 1.0の設定で動くので8月までなので、CricelCI 2.0の設定に書き直す必要が出る。

## 設定例

```:.circleci/config.yml
version: 2

jobs:
  build:
    working_directory: ~/app
    docker:
      - image: circleci/ruby:2.5.1-node-browsers
        environment:
          RAILS_ENV: test
      - image: mysql:5.7
        environment:
          MYSQL_ALLOW_EMPTY_PASSWORD: yes
    steps:
      - checkout
      - restore_cache:
          keys:
            - app-{{ checksum "Gemfile.lock" }}-{{ checksum "yarn.lock" }}
            - app-
      - run: bundle install --path vendor/bundle
      - run: yarn install
      - save_cache:
          key: app-{{ checksum "Gemfile.lock" }}-{{ checksum "yarn.lock" }}
          paths:
            - vendor/bundle
            - node_modules
      - run: cp config/database.yml.circleci config/database.yml
      - run: bundle exec rake db:create db:schema:load
      - run: bundle exec bin/webpack
      - run: bundle exec rspec
 ```

```:config/database.yml.circleci
test:
  adapter: mysql2
  encoding: utf8
  pool: 5
  database: app_test
  username: root
  password:
  host: 127.0.0.1
```

## 引っかかったところ

* database.ymlのhostは`localhost`だと接続できない
* mysqlにパスワードなしで接続する場合は`MYSQL_ALLOW_EMPTY_PASSWORD`を`yes`に設定しておく
gcc8でのDPの境界条件について


gcc8の-O3でDPの挙動が怪しくなる模様。

yukicoder No324 落ちてた閉路グラフのはまやんはまやんさんのソースを使います(注：https://twitter.com/yukicoder/status/1015940088423841793 に書かれているものですが、取り急ぎです。後ほど自作のソースに置き換える予定。)

-O3に未定義動作を送るとコードが潰されるのは有名な話ですが、このソースの`if(j)dp[j-1]`は上流でjの範囲を指定している(よってj!=0ならばj>0がいえる)にもかかわらず未定義動作になるようであるのが原因。そこで`if(j>0)`に置き換えると直ります。

https://yukicoder.me/submissions/271462

しかし、`if(j!=0)`としている答案って結構多そうなので、影響大きそうです。
Gmailの下書きをMarkdownで書くためのアプリをelectron-vueで作る

勤務先では日報をメール（Gmail）で出すこととなっているのですが、いちいちメール画面を開いて記録つけてると気が散るしいまいち編集画面が使いやすくない（※個人の感想です）ので、自分は下書きは自動バックアップ機能のあるVisual Studio Codeで書いていたり。

それだと書式が付けられないので、Markdownで清書するアプリを書いてみます。

ソースはこちら。
https://github.com/kuinaein/md-gmail/compare/0b4913e...3d66c13

なお、Node.jsでのGmail APIの呼び出し方は下記の記事にも書いたのでそのあたりは割愛します。

* Electron単体でGoogle APIを叩く<br>https://qiita.com/kuinaein/items/7bece719d8cd8624460c
* NodeでGmailの下書きにパスワードをかけた添付ファイルを突っ込む<br>https://qiita.com/kuinaein/items/dd3a072f322b7b50ebdc

# ライブラリのインストール
Markdownライブラリはmarkedを使うことにします。

```bash
vue init simulatedgreg/electron-vue md-gmail
cd md-gmail
yarn add --dev pug-html-loader
yarn add googleapis urlsafe-base64 moment marked html-escaper
yarn add bootstrap-honoka
```

# Markdownプレビュー画面
[Googleアカウントの認証については別の記事で書いた](https://qiita.com/kuinaein/items/7bece719d8cd8624460c)のでざっくり飛ばします。

Markdownの整形自体はmarkedがやってくれるので画面自体はシンプルなものです。
ただmarkedはテーブルタグに枠線を付けてくれないので、表示画面ではひとまずスタイルシートで補っています。vue-loaderは画面にない要素へのスタイル定義を削ろうとするので、「>>>」で子要素へ影響するものと指示しておきます。

```vue
<template lang="pug">
.container
  textarea(v-model="md" rows="15" style="width:90vw")
  p プレビュー：
  div(id="formatted" v-html="formatted")
  button.btn.btn-primary(type="button" @click="saveAsDraft") Gmail下書きに保存
</template>

<style scoped>
#formatted >>> table {
  border-collapse: collapse;
}
#formatted >>> th, #formatted >>> td {
  border: solid 1px black;
}
</style>

<script>
import moment from 'moment'
import URLSafeBase64 from 'urlsafe-base64'
import { google } from 'googleapis'
import marked from 'marked'
import { escape as escapeHtml } from 'html-escaper'

const BOUNDARY = 'MY_BOUNDARY_GX9900'

export default {
  data () {
    return {
      md: ''
    }
  },
  computed: {
    formatted () {
      return marked(this.md)
    }
  },
  // 後略
}
</script>
```

# Gmailの下書きへ保存
markedの出力結果を保存するだけ……なのですがいくつか注意点があります。

* Gmail APIにはRFC822に沿った生のメールデータをURLセーフなBase64形式にして渡す必要がある。
* HTMLメールの場合は`Content-Type: multipart/alternative`として送る必要がある。全体を`text/html`にしてもダメ。
    * ただし、テキスト形式の本文を含める必要はない。
* HTMLメールにしても&lt;head&gt;タグの内容は無視される。style属性等に書き換える必要がある。

また、本文のMarkdown形式でのソースも残しておきたいので、それも文中に含めることとします。

```javascript
const body = this.formatted.replace(/<table>/g,
  '<table border="1" style="border-collapse:collapse">') + `
<br/><br/>
<small>Markdownソース:
<textarea readonly rows="1" cols="1">${escapeHtml(this.md)}</textarea></small>
`
const subject = '【日報】' + moment().format('YYMMDD')
const email = `Subject: =?UTF-8?B?${URLSafeBase64.encode(Buffer.from(subject))}?=
Content-Type: multipart/alternative; boundary="${BOUNDARY}"

--${BOUNDARY}
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: base64

${Buffer.from(body).toString('base64')}
--${BOUNDARY}--`
gmail.users.drafts.create({
  userId: 'me',
  resource: { message: { raw: URLSafeBase64.encode(Buffer.from(email)) } }
})
```
ProMicroでフルカラーLEDを制御する

# フルカラーLEDとは

　Red/Green/Blueの3色の色を1つのLEDで表現できるLEDです。
　普通のLEDが2本の線に対し、フルカラーLEDは4本の線を制御して、表示します。

# フルカラーLEDの各線について

![写真 2018-07-09 0 55 50.jpg](https://qiita-image-store.s3.amazonaws.com/0/213990/4e0c8b2b-3886-5689-9ee1-00e1ae13e841.jpeg)

　規格化されているのかは分かりませんが、一番長い線がカソード（GNDに繋がる線）で、左から順番に青のアノード、緑のアノード、赤のアノードとなります。3本を別々に制御するためには3本のピンが必要です。

# 回路イメージ

![写真 2018-07-09 0 30 52.jpg](https://qiita-image-store.s3.amazonaws.com/0/213990/e36fced6-ffac-dbc5-3486-7ee17b129f2a.jpeg)

　3つのタクトスイッチをそれぞれ、R・G・Bの制御用に割り当てます。ボタンは14～16番ピンを使用します。
　また、出力用に6, 7, 9番のピンを使用します。単純にLチカをしたときはdigitalWriteを使いましたが、今回は明るさを制御したいためanalogWriteを使います。
　analogWriteを使う場合は、対応したピンを使う必要があり、https://learn.sparkfun.com/tutorials/pro-micro--fio-v3-hookup-guide によると、4, 6, 8, 9, 10, 18, 19, 20, 21が対応しているピンになります。

　抵抗は230Ωのものを3つ、各アノードに接続しています。

　一点問題があり、RとBのつもりでボタンを押しているのですが、お互いが反転しています。
　回路的にはあっているはずなので、まだ原因は謎です。

# ソースコード

```c++
#include <Arduino.h>

#define BUTTON_1 14
#define BUTTON_2 15
#define BUTTON_3 16
#define LED_R 6
#define LED_G 8
#define LED_B 9

int r_value = 0;
int g_value = 0;
int b_value = 0;
char buffer[256];

void setup()
{
    pinMode(BUTTON_1, INPUT_PULLUP);
    pinMode(BUTTON_2, INPUT_PULLUP);
    pinMode(BUTTON_3, INPUT_PULLUP);
    pinMode(LED_R, OUTPUT);
    pinMode(LED_G, OUTPUT);
    pinMode(LED_B, OUTPUT);
    Serial.begin(9600);
}

void loop()
{
    if (digitalRead(BUTTON_1) == LOW)
    {
        r_value = (r_value + 16) % 256;
        delay(300);
    }

    if (digitalRead(BUTTON_2) == LOW)
    {
        g_value = (g_value + 16) % 256;
        delay(300);
    }

    if (digitalRead(BUTTON_3) == LOW)
    {
        b_value = (b_value + 16) % 256;
        delay(300);
    }
    sprintf(buffer, "R = %d, G = %d, B = %d", r_value, g_value, b_value);
    Serial.println(buffer);

    analogWrite(LED_R, r_value);
    analogWrite(LED_G, g_value);
    analogWrite(LED_B, b_value);
}
```

# 動作イメージ

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">フルカラーLED繋いで、各ボタンでR/G/Bの出力値変更するプログラムを書いてみた。RとBは128を超えないと明るさに反映されないし、Rのボタン押したら青くなるし（左のボタンが赤のつもり）Bのボタンを押したら赤くなるしで、色々おかしい。 <a href="https://t.co/r83TYrby1S">pic.twitter.com/r83TYrby1S</a></p>&mdash; Toshio Maki (@Kirika_K2) <a href="https://twitter.com/Kirika_K2/status/1015984732226514944?ref_src=twsrc%5Etfw">2018年7月8日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<input type="file">で同じファイルを選択してもchangeイベントをトリガーさせる


`change`、`onchange`イベントは、入力欄の内容を変更した時の発火されるイベント
しかし、同じファイルを選択した場合、`change`イベントは発生しません😓

## 解決策

```html
<input id="file" type="file" onchange="myFunction()"/>
```

```javascript
function myFunction() {
 // ・・・
 document.getElementById("file").value = '';
}
```

`change`イベント時に該当要素の`value`(ファイルパス)を空にします
これにより同じファイルを選択しても、`change`イベントがトリガーされます✌️

## jQueryを使用する場合

```html
<input id="file" type="file"/>
```

```javascript
$('#file').change(function(){
 // ・・・
 $(this).val('');
});
```
## valueについて

`value`への空文字の設定が認められているブラウザは、
`value=''`とすればvalueの値はクリアされますが、それ以外のブラウザにも対応させるには別のやり方が必要になります💦

## セキュリティ上の理由による制約

`type="file"`の`value`プロパティへのアクセスには、
**セキュリティ上の理由により制約が設けられています** 

ブラウザが設定できないように決めているため、ブラウザ毎で微妙に挙動が変わってきます😱
ブラウザによっては下表のように違いがある✅

|ブラウザ|取得結果の書式|空（設定）|空文字以外（設定）|
|:-----------------|:------------------|:------------------|:------------------|
|Google Chrom|`C:\fakepath\filename`|○|×|
|Mozilla Firefox|`filename`|○|×|
|Safari|`C:\fakepath\filename`|○|×|
|Opera|`C:\fakepath\filename`|×|×|
|Internet Explorer 6,7,8,9|`C:\fakepath\filename`|×|×|

- 取得: `C:\fakepath\filename` のパスのみ
- 設定: 空文字とnullのみ


※`form.reset（）`を使用してファイル入力のファイルリストをクリアすることができますが、
この場合すべてのフィールドがデフォルト値にリセットされるので、フォームの`type="file"`のみをクリアすることはできません😓


##参考

[How to detect input type=file "change" for the same file?](https://stackoverflow.com/questions/4109276/how-to-detect-input-type-file-change-for-the-same-file)
FFTで口笛をMIDIに変換する


# KUCHIBUE_MIDI

## FFTクチブエtoMIDIコンバーターfor AVR

Atmega328を使いマイクから入力された口笛をFFTで解析し、シリアルからMIDIのNOTEオンNOTEオフとして出力するArduinoIDEのスケッチです。

### 入力
CRのローパスフィルタとOPアンプのハイパスフィルタを通してC0(ArduinoならアナログPIN0)でAD変換した値をサンプリングしています。



入力の閾値は#define THRESHOLD_LEVELで調整します
マイク入力には秋月のコンデンサマイク(アンプ付き)キットを使用しました
###### 回路図
![kuchibue_MIDI2CE3.PNG](https://qiita-image-store.s3.amazonaws.com/0/205783/21fba1bc-ff34-6ac1-e1dc-6579c99a06a4.png)
![SANY0093.JPG](https://qiita-image-store.s3.amazonaws.com/0/205783/dd68da8c-7672-9141-a442-50fee51a9cd0.jpeg)

### 出力
MIDIのノートオン、ノートオフのみシリアルから出力します  
BaudRateはsetup()の中でSerial.begin()で2種類設定し起動時にPB3の入力で選択されます。  
音域の入力はA#2からC5までに対応しておりボタンを押すことにより１オクターブUPさせてC6まで出力できます。


### コマンドその他
 PB0～PB2ピンをGNDへ落とすことにより以下の機能を割り当てています

- PB0 "PROGRAM CHANGE"　(YMF825MIDI_CONTROL_for_Arduinoのみ)音色変更のシステムエクルシーブメッセージをYMF825へ送ります  
- PB1 "octave_up" GNDへ落としている間1オクターブ高いNOTEオンを出力します
- PB3 リセット後のUARTの速度選定,シリアル出力をUSBtoSerialデバイスなどでPCへ送りSerialMIDI変換ソフトでMIDI入力として使用出来ます。

### FFTのサンプリング方法
音域と時間当たりの解析数を上げるため、高音と低音用の異なるサンプリングデータのリングバッファへ保存し、FFT解析用のバッファを2組用意して、解析中に他のバッファの組へデータを転送しています、１つのサンプリングレートで解析を行うと低音部に十分な解像度を得ようとすると時間窓を長くしなければならず、Step数を上げれば高音部は不要な解像度になるため低音用のバッファは２倍のレートで書き込み合計して２オクターブ強の範囲をカバーしました。

時間窓長とサンプリングレートは分解能と処理速度が問題となり、試行錯誤の末に、Step数128,サンプリング間隔226uSと452uS,時間窓長28.9ms(34.6Hz)と57.9ms(17.3Hz)の解析用バッファの組を交互に解析と転送に用います。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/205783/339d1751-645c-60bb-8901-5c6fb16aa1dd.png)
buffer1へ書き込みが終わったらbuffre2へ書き込みを開始し、その間にFFTの解析ルーチンを走らせMIDIコマンドにしているので14.5msごとに解析を行い我慢できるぐらいの遅延でMIDIコマンドを送信出来ています。

FFTのプログラムはArduinoのライブラリのfixfttを参考に128Step固定,リバース無しで計算の一部をテーブル化などを行い高速化しました。　　
### 入力音(口笛)の変換について
口笛に関しては綺麗な音で鳴らすより、多少濁っても音程が正しく吹くようにしてください、一音を一定の息遣いで鳴らすようにすれば連続音としてなりますが音が乱れると連符になってしまいます。  
KUCHIBUE-MIDI-AVR.inoでFFTのピーク値を変換テーブル(note_no[],note_no_lo[])を用いMIDIのノートナンバーへ変換しているのですが、癖に合わせてここを変更すれば認識率が上がると思います。
### 用途
以前作成したYMF825boardを使ったMIDI音源へ繋ぎ単独で楽器として鳴らして遊んでいますが、単にシリアルからMIDIのノートオン、オフを出力しているだけなので、SerialMIDIブリッジソフトを使えばMIDIの入力デバイスとしても利用できます。
8bitAVRでなく32bitデバイスで作れば十分な反応速度と解像度を得ることも可能と思われますので、どなたかチャレンジしてみませんか？
![SANY0092.JPG](https://qiita-image-store.s3.amazonaws.com/0/205783/13734424-a56b-c75c-47dd-82682be455e6.jpeg)


ソース置き場(GitHub)
https://github.com/shigosenCCneko/KUCHIBUE_MIDI.git
演奏した動画(YouTube)
https://www.youtube.com/watch?v=GYY5uESVZcU
php_cording_20180708

# PHP コーディング 備忘録

```php:lesson2_3.php
~
$sum = $price + $price * $taxRate;
# "で記載すると変数の中身を呼べる。
echo "税込価格は{$sum}円です";
```
```php:lesson2_3_ex1.php
echo '税込価格は{$sum}円です';
```
上記のように「’」で記載をしてしまうと、出力結果は「税込価格は{$sum}円です」と表示される。

連想配列
これもなかなか覚えられない。

```php:lesson2_7.php
~
$menu = array('name' => 'CURRY', 'price' => 900);
~
echo "{$menu['name']}は{$menu['price']}円です";
~
```
$配列名['key値']で値をよびだす。
健康で文化的な最低限度の生活のためのChromebook設定（１）

# 概要
Asus Chromebook Flip C101PAを買って3ヶ月程たったので使い物になる（とおもう）設定方法のまとめ．

簡単な設定と端末をUnixぽく動かして pythonとLaTeXするくらいまで構築する．

基本方針として，Chromebookの上にLinuxを入れるとかはせず，分解もせず，あるがままでできるだけ頑張る．デベロッパーモードだけは入らないと（現状では）難しいのでそこだけはやることにした．　今後，crostini になると変わる予定だけど，この手順でインストールしたらクリーンな状態から，数時間で仕事できる環境を構築できる．ネットワーク越しにファイルをたくさん取得するので，このときモノを言うのはネットワークの速度である．


# 開発者モードでの立ちあげ
開発者モードに移行するときに，中身がぜんぶ消えて初期化されるので最初にやる.
ブート時に ESC+再読込（ぐるぐる回るボタン）を押すと「Developer mode」で立ち上げるか聞かれる．
そこでCtrl-Dを押すと開発者モードでブートする．
このとき，中身ぜんぶ初期化されるんでまっさらなChromebookではじめる人以外はバックアップとか忘れないこと．
あとは何度か，EnterかCtrl-Dを押すように要求されるんで，素直に従って開発者モードで起動して普通にハードウェアの設定を行う．
ここまでが前提条件でこれをやらないとシェルに抜けられない．

# シェルを立ち上げる
　Ctrl-Alt-t でcrosh というタブが立ち上がる．　ここで `shell` と打ち込むと bashが立ち上がる．普通の状態では `/etc`を書き換えられないのでユーザ名とか，ログインシェルは変更できないと思うほうがいい．　bash が立ち上がったらそこから先はLinuxやMacOSと同じように環境を構築できる．

# キーボード
 僕のは英語モデルなので，英語キーボード・日本語入力を選択する．日本語キーボードの人は日本語を選ぶこと．
検索キー（Aの横）はCtrlとかAltとかに割当できる．　その他 Alt,Ctrlも割当の変更が可能．とはいえ左右のキーを区別できないとか柔軟性がたりないので妥協する必要あり．　(個人的理由により)句読点の設定を論文用（全角カンマとピリオド）にしておく．　その他のショートカットとかは拡張などを試したけど簡単には変更できないようだ．
![1000-2.png](https://qiita-image-store.s3.amazonaws.com/0/35410/b67c4777-d856-ae84-c048-6e248ef309c9.png)



# [Chromebrew](https://github.com/skycocker/chromebrew)
Chromebook用のパッケージインストーラで，CUIアプリをインストールするのに使う．Unix-likeなツールを入れるのに便利．
Macな人は homebrew の chromebook版だとおもえばだいたいあってる．
インストール方法は２種類でてくるが，最近のshellは デフォルトではwgetがないので curlを使うほうで行う
 これが入るとコンソール環境でいろんなアプリが動かせるようになる．

	curl -Ls git.io/vddgY | bash
 

## chromebrew でインストールするアプリについて

chromebookではexecbit が立てられるファイルシステムが決まっているので ~/ 直下にインストールしない
 なんでも `/usr/local/bin` 以下あたりにインストールすると良いようだ
 tmpが足りない場合もあるので /usr/local/bin/tmp を作成して使うと良いことがある．
 /usr/local/bin の中に作るのは ディレクトリ単位で実行権限が切られているので，実行も出来るところにしておく必要がある（かもしれない）
	`TMPDIR=/usr/local/bin/tmp pyenv install ...`  とか

### ssh
最初から入っているので普通に使える
ssh-keygen してキーをgithubとかサーバとかに登録しとけばOK（難易度：ふつう）

### zsh
chromebrew でzshをインストールできる．ｚｓｈのコンフィグは人それぞれなので，あとは好みで色々インストールする
ただし，最初に立ち上がるシェルは必ず bashなのでそのあとで zshを立ち上げる必要があるので注意．/etc/ の中は書き換えるために本体を分解する必要があったりするので，非常に困難であると思ったほうがいい（僕はやっていない）

以下は zplug使う場合

	crew install zsh
	export ZPLUG_HOME=/usr/local/bin/.zplug
	git clone https://github.com/zplug/zplug $ZPLUG_HOME

（２）に続く（予定）
Promise - 見た目もスッキリ！順番通りに処理する方法

![promise.gif](https://qiita-image-store.s3.amazonaws.com/0/268390/80108066-2c52-2bcb-06d0-2a186d2cfcb0.gif)

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　※脚色を含みます。
#はじめに

この記事では、Promiseを使って、狙い通りに処理を順番に実行する方法を紹介します。
JavascriptでFirebaseを使用する際などに、何かと必要になるのが、このPromiseです。

#Javascriptの特性
##Javascriptは非同期処理言語
Javascriptは非同期処理の言語です。
ソースコードの記述通り、1行目から最終行目まで順に処理が開始されますが、
各処理の間に、「完了 → 開始」の関係があるわけではありません。
そのため、前の処理が時間のかかるものであれば、後に書いた処理の方が先に完了してしまうことがあります。

やっかいな、と思われるかもしれませんが、この仕組みが高速レスポンスを実現している面もありますので、やむを得ません。

##Promiseの出番
しかし、プログラマにとって、順番を決めて動いてもらわないと困るシーンはたくさんあります。
時間のかかる処理の代表格が、データベース操作などのサバー処理です。
「データベースには確かに値が登録されていているのに、ページに表示されない！ なんで？？」といった問題は、Promiseを使うことで解決する可能性があります。

#Promiseの使い方
Promiseにはいくつかの処理をまとめて行う、並列処理もありますが、ここでは直列処理を紹介します。
その名の通り、順番に処理させる書き方です。

```javascript:promise.js
        Promise.resolve()
        .then( () => 処理1 )
        .then( () => 処理2 )
        .then( () => 処理3 );
```
このように、Promise.resolve()の後に、.then()を数珠のように必要な分だけつなぎ、
最後にセミコロンを記述します。
このように書けば、「処理1の完了 → 処理2の開始・・・」と処理3の完了まで順番通り実行されます。

「処理2と処理3の間に2秒間置きたい」場合には、次のように書くことで実現できます。

```javascript:promise.js
        const wait = (milliseconds) => new Promise((resolve) => setTimeout(resolve, milliseconds));
        Promise.resolve()
        .then( () => 処理1 )
        .then( () => 処理2 )
        .then( () => wait(2000) )
        .then( () => 処理3 );
```
Promiseオブジェクトを返す関数を作成し、wait(ミリ秒)で時間を置けるようにしています。
※const wait〜は関数式です。シンプルに記述することができます。
CSSアニメーション処理を途中で挟むために、classをaddしてremoveするときにも重宝します。

また、途中でif文を使用したい場合は次のように{}で囲みます。

```javascript:promise.js
     Promise.resolve()
            .then( () => 処理1 )
            .then( () => {if( ~ ) {
                                  処理2
                                 }
                         })
            .then( () => 処理3 );
```

{}で囲むことで、if文に限らず、複数の処理を書き込むことが可能になります。

#さいごに
Promiseを使いこなせるようになると、Javascriptでの表現の幅を広げることができます。
並列処理をはじめ、ここで紹介できていない方法もたくさんあり、私も引き続き学んでいこうと思います。

この記事ではPromiseの仕組み等について詳細な解説はしていません。
下記のサイト、記事が分かりやすくまとめられていると思いましたので紹介します。

[setTimeoutはダサいぞ。JavaScript Promiseを使って処理を順番に実行しよう](https://liginc.co.jp/344056)
[new PromiseとPromise.resolveの違い](https://qiita.com/ueokande/items/807a6c9a64c3874a0f83)

参考：
[Javascript初心者がsetTimeoutを使ったとき行き詰ったこと](https://qiita.com/tontoko/items/7fae6242305434f4a297)
Rubyist あがりの python 初心者がループ中の next に殺られた件

#問題：次の Ruby プログラムを Python に移植しなさい
（※１）

```ruby
for i in 0..4
    if 0 == i % 2
        next
    end
    puts i
end
```

実行結果 =>

```ruby
 1
 3
```
・・・このように奇数が出力されれば正解。

#移植例（誤）

```python
for i in range(5):
    if 0 == i % 2:
        next
    print(i)
```
実行結果 =>

```python
0
1
2
3
4
```
**な、なんで、偶数も奇数も全部出てくるねーん！？
(私は、この種のバグで数時間、殺られました。)**

試しに Python コマンドのインタラクティブモードで実行すると、

```
>>> for i in range(5):
...     if 0==i%2:
...         next
...     print(i)
...
<built-in function next>
0
1
<built-in function next>
2
3
<built-in function next>
4
>>>
```
・・・なんじゃこの、中途半端な警告？は！？
アカンなら最初からハッキリ、エラーだと言ってほしかったョ。。

#移植例（正）

```python
for i in range(5):
    if 0 == i % 2:
        continue
    print(i)
```
実行結果 =>

```python
1
3
```
・・・奇数だけが出力された。　めでたし！

**おそらく、Perl 使いも同様に、数千人がこの件で戦死したのではないだろうか？**

#注釈
※１
生粋の Rubyist なら、最初のやつはこんなふうに書くかな。

```ruby
5.times do |i|
    next if 0 == i % 2
    puts i
end
```
まあ今回は、Rubyist を嵌める目的で、Python にもある文法の for を用いました。
rubyでRPGっぽいのを作ってみる　その2

プレイヤーの名前を入力するところまで作成してみました。

```status.rb

class Status
    attr_accessor :name
    attr_accessor :job
    attr_accessor :level
    attr_accessor :life
    attr_accessor :atacck
    attr_accessor :defence
    
    def initialize
        puts "あなたの名前を入力して下さい"
        self.name = gets.chomp
        
        while true
            print "あなたの名前は#{self.name}でいいですか(y/n)？"
            response = gets.chomp
            if response == "y" || response == "Y"
                break
            else
                puts "あなたの名前を入力して下さい"
                self.name = gets.chomp
            end
                
        end
        
    end
end
```

もっとスマートなやり方があるのかもしれないけど、今はこれが限界。
あと、ステータスを決めるためにクラスにjobを追加したけど、各職業の能力値もクラスで管理した方がいいのだろうか？
phina.js の Shape での origin による座標計算は padding を含む

[phina.js](http://phinajs.com/) の小ネタです。

以前に調べて知っていたはずなのに、久しぶりにまた引っかかったので記事に残しておきます。

実のところタイトルがほぼ全てなのですが、それでは寂しいので少し解説を書いてみます。

## origin について

`Object2D` を継承している各クラスは `origin` で座標の基準を指定することが出来ます。
(0.0, 0.0) で左上が、(0.5, 0.5) で真ん中が、(1.0, 1.0) では右下が基準になります。
0.0 ～ 1.0 の範囲外を指定することで図形の外に基準を置くことも出来ます。
ちなみにデフォルトは (0.5, 0.5) です。

参考: [[phina.js-Tips] Shapeの原点を変更する](https://qiita.com/alkn203/items/d0954528f23f8c63766d)

## Shape の origin

ここからが本題です。

`RectangleShape` などの各 `Shape` も `Object2D` を継承していますので、もちろん `origin` を指定できます。

ただし `Shape` を継承したクラスの場合は `origin` による座標の計算時に `width` や `height` だけでなく `padding` も考慮されます。

例えば `RectangleShape` の場合 `origin` の (0, 0) は矩形の左上ではなく矩形からさらに `padding` 分左上の位置になります。

こんな感じです。

```javascript
phina.globalize();

phina.define('MainScene', {
  superClass: 'DisplayScene',

  init: function(params) {
    this.superInit(params);

    // シーンの背景を赤にしておく
    this.backgroundColor = "red";

    // シーンと同じ大きさの矩形を左上に合わせて追加(したつもり)
    var rect = RectangleShape()
    　.setOrigin(0.0, 0.0)
    　.setPosition(0, 0)
    　.setSize(this.width, this.height)
      .addChildTo(this);
  },
});

phina.main(function() {
  // 結果を見やすくするためにゲームサイズを小さくする
  GameApp({
    width: 100,
    height: 100,
    startLabel: 'main'
  }).run();
});
```

実行結果:
![RectangleShape.png](https://qiita-image-store.s3.amazonaws.com/0/216450/265400e9-d8c1-2982-4f13-72090fc90c9a.png)

コードだけ見るとシーン全体を矩形で埋め尽くしそうな気がしますが、実際には `padding` 分右下にずれて描画されました。

ちなみに `padding` のデフォルトは 8 です。

## padding について

上の例では `padding` を 0 にすることで矩形がシーンにぴったり重なるようになります。

しかし `padding` のデフォルトがなぜ 0 ではないのか? あるいはそもそも `padding` の役割は? といった話はググっても全然ヒットしませんでした。

なので、元の話題からちょっと派生して `padding` についても簡単に書いておきます。

`Shape` の派生クラスでは `stroke` と `strokeWidth` で枠を描画することが出来ます。
そしてこの枠は  `strokeWidth` の半分の幅で元の図形の**外側**に描画されます。

例えば、

```javascript
var rect = RectangleShape({
  width: 100,
  height: 100,
  stroke: "red",
  strokeWidth: 10
});
```

と指定すると、縦横 100px の矩形の外側に幅 5px の赤い枠が描画されます。

ここでもし `padding` を 0 にしてしまうと、この赤い枠が描画されなくなります。

なぜなら `RectangleShape` では、`width` および `height` で指定された範囲 + `padding` 分の領域だけシーンに描画される仕組みになっているためです[^1]。

`padding` のデフォルトは 8 でしたので、`strokeWidth` が 16 を超えると、それ以上いくら数字を大きくしても枠は太くなりません[^2]。
この場合 `padding` をその分大きくすることで描画されるようになります。

なお `shadow` と `shadowBlur` を指定する場合も同様です。 

[^1]: `Shape` から派生している他のクラスも基本的に同様です。
[^2]: 丸い角が直角になるという変化はあったりします。