OmniAICreator/Qiita-1.07M huggingface dataset:
総和のシグマの範囲は集合と要素で書くべき

カレンダーが空いていたので，以前から思っていたポエミーなことを書いてみようと思います．

# 提案

**提案：総和の記号の要素の範囲を書くときは集合で書こう**

例えば、 $A=\\{a_1, a_2, ..., a_n\\}$ の総和を書くとき......

:thumbsdown: 連番で表記

$$\sum_{i=1}^n a_i$$

:thumbsup: 集合で表記

$$\sum_{a\in A} a$$

# 理由① リーダブルなプログラムの観点から

Qiita ということで，まずはプログラム的な観点から理由を述べます．
（集合ではなくなってしまいますが） `values = [32, 18, ..., 49]`という配列があるとき，

```.js
for (const i=1; i<n; i++) {
    sum += values[i]
}
```

よりも

```.js
for (let value of values) {
    sum += value
}
```

の方がわかりやすいと思います．
この感覚を数式でも適用してほしいという気持ちです．

# 理由② 並び順から開放される

これが一番の理由なのですが， **集合では要素間の並び順は存在しない** ことが明示できます．

$\sum_{i=1}^{n} f(a_i)$ と表すと， **$f(a_1)$ から $f(a_n)$ と順に足し合わせる** と読み取ってしまいます．これでは，和の計算に不要な **並び順** という概念が式に現れてしまいます．

対して， $\sum_{a \in A}f(a)$ と表すと，集合に対しての操作であることがはっきりと読み取れます．こうすることで，読み取るときに一種の写像として捉えることができます．

以下に例を示します．

## 例: テストデータと学習データ

適当な文章を両方の方式で記述して比較してみます．

### 連番で表記した例

10000個のデータ $d_1,d_2,...,d_{10000}$ について，$d_1$〜$d_{6000}$番目を学習データ，$d_{6001}$〜$d_{10000}$をテストデータと分割して実験を行いました．その結果，以下が得られました．

$$\frac{1}{6000}\sum_{i=1}^{6000} f(d_i) \approx \frac{1}{4000}\sum_{i=6001}^{10000} f(d_i)$$

### 集合で表記した例

10000個のデータ $D=\\{d_1,d_2,...,d_{10000}\\}$ について， 学習データを $D_L=\\{d_1,...,d_{6000}\\}$ ，テストデータを  $D_T=\\{d_{6001},...,d_{10000}\\}$ と分割して実験を行いました．その結果，以下が得られました．

$$\frac{1}{\\# D_L}\sum_{d_l\in D_L} f(d_l) \approx \frac{1}{\\# D_T}\sum_{d_t\in D_T} f(d_t)$$

集合で表記することで，式の主張が読み取りやすくなるのではないでしょうか．
（特に時系列のデータなどの順序が印象付けられやすいものでは，集合で表すことで新しい視点を得られたりすることが多い気がします．）

# おわりに

**集合と写像の考え方っていいよね** というポエムでした．
お付き合いいただきありがとうございました :christmas_tree:

#### 変更履歴

2020/04/08 例を追加して，文章も少し修正しました
【初心者必見】機械学習に入れるための画像データの変換をやってみた➀

## なにをしたか？
### →画像データを1次元配列に変換
機械学習で画像データをインプットするときには、入力の次元数に合わせてデータを変換して投入する必要があります。以下では、画像データを1次元の配列に変換してみました。

### <実施手順>
1. 必要なライブラリーのインポート
2. PILを使って画像ファイル読み込み
3. Numpyを使用して画像ファイルをピクセル値で入力
4. 正規化
5. 2次元 → 1次元データに変換

## 実際にやってみた

JupyterNotebookを使用して以下を実行しました

### 1. 必要なライブラリのインポート

~~~Python
import numpy as np    #numpyのインポート
from PIL import Image #PILのインポート
~~~


### 2. PILを使って画像ファイル読み込み

~~~Python
image1 = Image.open('./data/pict/image1.jpg')
image1
~~~

![スクリーンショット 2018-11-28 23.49.22.png](https://qiita-image-store.s3.amazonaws.com/0/317125/cf72c132-3d22-f626-6454-f8b49e459794.png)



### 3. Numpyを使用して画像ファイルをピクセル値で入力

~~~Python
image1_px = np.array(image1)
print(image1_px)
~~~

![スクリーンショット 2018-11-28 23.52.59.png](https://qiita-image-store.s3.amazonaws.com/0/317125/2b5e5b77-bde5-583a-5d85-ba59d8bc124c.png)

![スクリーンショット 2018-11-28 23.53.24.png](https://qiita-image-store.s3.amazonaws.com/0/317125/a5544d5a-fbcd-0af9-f1cb-5b90bfd6e915.png)

#### ピクセルの値を確認
~~~Python
print(image1_px.shape)
# (300,500,3)
~~~
![スクリーンショット 2018-11-29 0.06.43.png](https://qiita-image-store.s3.amazonaws.com/0/317125/dae2168f-3e4c-97f6-663c-cbfbabc697f6.png)

上記の出力されたimage1_pxが300(行)×500(列)のカラーチャンネル3であることを確認できました。




### 4. 正規化

~~~Python
image1_nor = image1_px.astype(np.float32)/255.0
print(image1_nor)
~~~

![スクリーンショット 2018-11-28 23.55.56.png](https://qiita-image-store.s3.amazonaws.com/0/317125/9f843a39-96fb-2182-d052-c4219913a670.png)
![スクリーンショット 2018-11-28 23.56.13.png](https://qiita-image-store.s3.amazonaws.com/0/317125/595c6280-2abc-1b7f-a657-579c67fe36cc.png)

正規化されて0〜1になっていることが確認できました。


### 5. 2次元 → 1次元データに変換

~~~Python
image1_fl = image1_nor.flatten()
print(image1_fl)
~~~

![スクリーンショット 2018-11-29 0.22.06.png](https://qiita-image-store.s3.amazonaws.com/0/317125/f375b4f9-172d-0304-1359-5a61767469f8.png)


1次元のデータが出力されていることが確認できました。
VisualStudioCodeプラグイン

# 

## Indentation Level Movement
同じインデント幅のところにジャンプできる。
次の同じインデント幅のところまで範囲選択もできる。
インデント幅でジャンプするので、HTMLのタグの始点と終点へジャンプできるようになるので非常に便利。

## Indent-Rainbow
インデント幅で色が付く。カラフル。

## Live HTML Previewer
VSCの中でHTMLのリアルタイムにプレビューができる。
が、総合力では↓のが多分高い。（ブラウザを自動でリロードしてくれるようになる）
[BrowserSyncの使い方](https://qiita.com/niusounds/items/a95978f9a1cb328d3021)

## Calculate
数式評価。
標準のEmmetにも数式評価はあるが、小数点の計算結果が凄いことになるので、こちら推奨。
"Calculate and Replace"で選択範囲を計算結果で置換する。
overflow

#overflowについて

##*overflowの概念*
決められた箱（width&height）のから溢れ出た中身(テキスト)についてどうしてあげるかを指示するコードである
種類は以下の通り

|コード|意味|
|:-----------|------------:|:------------:|
|auto　|スクロールバーを内容量に応じて自動生成してくれるが、PCの機種に依存する|
|visible　　　|溢れ出た部分をそのまま表示してくれる|
|scroll　　|溢れ出た部分を非表示にしてくれるとともにスクロールバーが常に表示される※プリンターは溢れた部分を表示して印刷する可能性がある|
|overlay　　　　|autoと同じ動きをしてくれるが表示されるブラウザがサファリとチャロメとopera|
|hidden　　　　|通称禁術　一応性質としては自分が囲っている要素を認識してそれ以外は切り落とす。高さを算出して出してくれる|

<dl>コードを記載するときに気をつけたいのが

<dd>横幅＆高さは確保したのか</dd>
<dd>どういうスクロールにしたいのか</dd>
<dd>クラスをどこにつけるのか</dd>
<dd>きちんとスクロールしたい範囲を指定できているか</dd>
<dd>そこにかけているか</dd>
<dd><strong>hidden</strong>を使用する場合は親要素にコードを記載したのか</dd>
</dl>

##overflow: hidden;の使い方**禁術ver**
・　困ったらこれを使おう
・:exclamation:何故か解決してくれる訳がわからない子:exclamation:
・どのように表示したいかによってどこに入れるかが変わる
・親に指定した場合は子供は親の高さ指定の中でしか表示されない
・子供に指定した場合は親の高さに影響されないで表示
**・親に高さ指定していない状況で子供にfloatがされているときに親にoverflow:hidden;を指定すると子の高さ幅の分だけ拡張される
・子に高さ幅が指定されている状況で中身がはみ出しているときに親にoverflow:hidden;を指定すると親の高さと幅は子の高さと幅と同じになる**
【Twilio超入門】Twilioを使用して固定電話や携帯電話へ"ロボット音声"電話を送る方法

#Twilioとは

簡単に言えば音声ロボットを作って
そのロボットに電話を任せることが出来ます。

"宅配便の再配達"電話等の
ロボットによる電話サービスを作れます。

#[参考URL](https://jp.twilio.com/docs/voice/quickstart/node)
[Programmable Voice クイックスタート for Node.js](https://jp.twilio.com/docs/voice/quickstart/node)

#コマンドプロンプトの実行手順(上記URL参考)

今回はWindowsで使用します。

```:command_prompt (node.jsのバージョンを確認)
C:\WINDOWS\system32>node –version
v8.11.4
```

```:command_prompt (パスを変更)
C:\WINDOWS\system32>cd C:\Users\wafuu\Desktop\node
```

```:command_prompt (twilioをインストール)
C:\Users\wafuu\Desktop\node>npm install twilio
npm WARN deprecated scmp@0.0.3: scmp v2 uses improved core crypto comparison since Node v6.6.0
npm WARN saveError ENOENT: no such file or directory, open 'C:\Users\wafuu\Desktop\node\package.json'
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN enoent ENOENT: no such file or directory, open 'C:\Users\wafuu\Desktop\node\package.json'
npm WARN node No description
npm WARN node No repository field.
npm WARN node No README data
npm WARN node No license field.

+ twilio@3.24.0
added 81 packages in 7.55s
```

```:command_prompt (make_call.jsを実行)

C:\Users\wafuu\Desktop\node>node make_call.js
CA6f152f91422b4d3cbb32c899cc24c94d

C:\Users\wafuu\Desktop\node>
```

#make_call.jsの中身


```js:make_call.js
// Download the helper library from https://jp.twilio.com/docs/node/install
// Your Account Sid and Auth Token from twilio.com/console
const accountSid = 'AC〇〇'; // 変更箇所
const authToken = '〇〇'; // 変更箇所
const client = require('twilio')(accountSid, authToken);

client.calls
      .create({
         url: 'http://demo.twilio.com/docs/voice.xml', // 通話で実行するURL
         to: '+81〇〇', // かける電話番号
         from: '+81〇〇' // サービスに登録した電話番号
       })
      .then(call => console.log(call.sid))
      .done();
```

このコードは**`C:\Users\wafuu\Desktop\node`**フォルダの中に置いてある。
このコードを実行すると登録した電話番号に電話がかかる。

#[voice.xml](https://demo.twilio.com/docs/voice.xml)の中身

```xml:voice.xml
<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say voice="alice">Thanks for trying our documentation. Enjoy!</Say>
    <Play>http://demo.twilio.com/docs/classic.mp3</Play>
</Response>
```

かかってきた電話に出ると、
**[classic.mp3](http://demo.twilio.com/docs/classic.mp3)**が再生される(音声ファイル)

以上、導入方法でした。
[cocoa][swift]関東swift勉強会2018-03 を振り返る

<p>2018年3月16日（金）の夜間、東京都豊島区の<a href="http://co-forest.com/">池袋コワーキングスペース OpenOffice FOREST</a>におきまして、「関東swift勉強会2018-03」を開催致しました。</p>

<p>勉強会では、過去、複数のconnpassグループ毎に申し込みページを用意していました。<br />ただ、申し込み側からみれば実質同じ人間が運営しているのに、主催グループが変わっているなんてどうでもいいこと。<br />単に混乱が発生しているだけということで、今年になってconnpassグループは一本化しました。</p>

# 勉強会について
<ul>
<li>Cocoa勉強会 関東 Swift分科会 です。</li>
<li>ほぼ毎月、池袋コワーキングスペース OpenOffice FOREST で開催してます。</li>
<li>macOS/iOS/watchOS/tvOSプログラマーのための勉強会です。</li>
<li>プログラムに関する知識や経験を共有を目的としています。</li>
<li>会の活動内容や発表資料、サンプルコードは公開を前提としています。</li>
<li>申し込みは、connpassから。<br /><a href="https://cocoa-kanto.connpass.com/">https://cocoa-kanto.connpass.com/</a></li>
</ul>

# 概要
<ul>
<li>発表資料は<a href="https://mosa.connpass.com/event/80071/">connpassページ</a>からどうぞ！</li>
<li>会場の様子は、ハッシュタグ『#cocoaswift #cocoastudy #bukuroswift』でtweetしています。</li>
</ul>

# キーイベント処理
<p>スライドが用意できなかったということでホワイトボードを使った発表となりました。<br />
macOSのアプリで、標準的なショートカットでない手段でキーボード操作を実現するための方法。例えばCMDキーの二重押下や長押しに対応するために行った手法が説明されました。<br />
macOSアプリについて詳しくないので、自分もちょっと調べて見ようかなと思って聞いていたのですが、やりたい事ばかりなので、果たしていつ実現できるのか？</p>

# 独自Documentクラス
<p>発表者のTIPSとして、独自のDocumentクラスを用意する方法が紹介されました。</p>

# NSTableVIew macOS 10.7以降
<p>行をドラッグ＆ドロップで入れ替える操作の対応について、macOS 10.7以降のモダンな手法が紹介されました。資料とサンプルコードは、AirDropで配布となりました。</p>

# Developer’s Tech Lab 『Swiftでフレームワークを作る方法について』
<p>MOSA de BBで質問があって、Swiftでフレームワーを作る方法について、調べたことの発表について、参加者と意見を交換しました。</p>

# Developer’s Tech Lab 『DocumentクラスとNSFileWrapperについて』
<p>独自のDocumentクラスでもNSFileWapperを使いたいのですが、その方法について、参加者と意見を交換しました。</p>

# Developer’s Tech Lab 『iPhone X画面対応について』
<p>iPhone X画面対応について、参加者と意見を交換しました。</p>

【関連情報】
<a href="https://qiita.com/advent-calendar/2018/cocoa">Cocoa Advent Calendar 2018</a><br />
<a href="https://mosa.connpass.com/event/80071/">関東swift勉強会2018-03</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
wordpressをgitとcomposerで管理

Bedrock(https://github.com/roots/bedrock) が便利そうだったので使ってみる

## 1. インストール
```sh
$ composer create-project roots/bedrock hello_bedrock
$ cd hello_bedrock
```

## 2. ディレクトリ構成
```
.
├── .env
├── .env.example
├── .gitignore
├── CHANGELOG.md
├── CODE_OF_CONDUCT.md
├── LICENSE.md
├── README.md
├── composer.json
├── composer.lock
├── config
│   ├── application.php
│   └── environments
├── vendor
│   ├── autoload.php
│   ├── bin
│   ├── composer
│   ├── johnpbloch
│   ├── oscarotero
│   ├── roots
│   ├── squizlabs
│   └── vlucas
├── web
│   ├── app
│   ├── index.php
│   ├── wp
│   └── wp-config.php
└── wp-cli.yml
```

## 3. 環境ファイルを書き換える
DBを作成し、.envに情報を記載

```txt:.env
DB_NAME=database_name
DB_USER=database_user
DB_PASSWORD=database_password

WP_HOME=http://localhost:8000
```

## 4. ビルトインサーバーの起動

```sh
$ php -S localhost:8000 -t web
```
<img width="1520" alt="WordPress_›_Installation.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/2469/26c37e70-3024-39dd-24e5-0bc7f04f8de2.jpeg">


## 5. プラグインのインストール
https://wpackagist.org/ にあるものはインストールできる

```sh
$ composer require wpackagist-plugin/akismet
```
【Python】importしたモジュールやパッケージの場所を調べる

半年に1回くらい特殊な状況(Jetsonとか環境魔改造したとか)で場所を
調べることがあるためメモ。

######モジュール本体か\_\_init\_\_.pyの場所を取得

```python:
import tensorflow
print(tensorflow.__file__)
```
　実行例：C:\Users\XXXXXXXX\Anaconda3\envs\OpenCV_3_4_1\lib\site-packages\tensorflow\\\_\_init\_\_.py


######パッケージの場所を取得

```python:
import tensorflow
print(tensorflow.__path__)
```
　実行例：['C:\\Users\\XXXXXXXX\\Anaconda3\\envs\\OpenCV_3_4_1\\lib\\site-packages\\tensorflow']

以上。
Raspberry Pi 3 B で Minecraft 1.12.2 を動かす

# 概要
Raspberry Pi 3B で、Minecraft 1.12.2 を動かしたので、その備忘録になります。
なお、ほぼ下記の記事を整理しているだけです。
原文もあわせて参照ください。

[How to setup Minecraft 1.12.1 on Raspberry Pi 3](https://www.raspberrypi.org/forums/viewtopic.php?f=78&t=186547&sid=7837bee8cbb0905a5d4e8649d408be80)

# 手順

## 1. システムのアップデート

```
sudo apt-get update && sudo apt-get -y upgrade
```

## 2. GL Driverの有効化

下記のConfigユーティリティを開き、「Advanced Options」を選択し、「GL Driver」を選択してから「Enable」を選択し、最新のユーティリティで「GL（Full KMS）」を選択する。

```
sudo raspi-config
```

## 3. OpenAL Audio & glxgears demo のインストール
```
sudo apt-get -y install libalut0 libalut-dev && sudo apt-get -y install mesa-utils
```

## 4. glxgearsを使ってテスト
60fps出ていることを確認する。

```
glxgears
``` 

## 5. Minecraftのダウンロード

```
mkdir ~/Minecraft; mkdir ~/Minecraft/Natives; cd ~/Minecraft && wget https://s3.amazonaws.com/Minecraft.Download/launcher/Minecraft.jar
```

## 6. ランチャーの起動
下記のコマンドでランチャーを起動する。

```
cd ~/Minecraft && java -jar Minecraft.jar
```

その後、下記の手順で1.12.2をダウンロードする。

1. メールとパスワードでログイン
2. 「プロファイルを編集」をクリックし、「1.12.2」を選択し、「プロファイルを保存」を行う
3. Playクリックして、ゲームをインストールする
4. その後、エラーが表示されます（想定通り）
5. ランチャーを閉じる


## 7. ライブラリのダウンロード

```
cd ~/Minecraft/Natives && wget https://www.dropbox.com/s/4oxcvz3ky7a3x6f/liblwjgl.so && wget https://www.dropbox.com/s/m0r8e01jg2og36z/libopenal.so
```

## 8. `OptiFine` をダウンロード

[https://optifine.net/downloads](https://optifine.net/downloads)より、 `OptiFine 1.12.2 HD U C9.jar`をダウンロードする。

## 9. `OptiFine` のインストール

1. ダウンロードしたフォルダに移動して、下記のコマンドを実行する。
2. インストール処理を行う。

```
java -jar OptiFine_1.12.2_HD_U_C9.jar
```

## 10. Minecraftを実行

1. ランチャーの起動
2. OptiFine profile になっていることを確認の上、Playする。
3. クラッシュする（想定通り）

```
cd ~/Minecraft && java -jar Minecraft.jar
```

## 11. スクリプトのダウンロード

下記のコマンドから、スクリプトをダウンロードする。

```
cd ~/Minecraft/ && wget https://www.dropbox.com/s/trsel8nhan34b8q/runOptifine1_12_2.sh && sudo chmod +x runOptifine1_12_2.sh
```

## 12. runOptifine1_12_1.sh を変数

下記の内容を自分の情報に書き換える。（自分はこれをやってないけど、動いたな）

* MINECRAFT_LOGIN
* MINECRAFT_USERNAME
* MINECRAFT_PASSWORD

## 13. スクリプトからMinecraftを起動

ターミナルから、下記のコマンドを叩くことで、Minecraft1.12.2が起動する。

```
/runOptifine1_12_1.sh
```

なお、自分は起動時に解像度を下げていなくて、フリーズしました。
再起動後、下にあるように解像度を下げて起動したら、問題なく動いた。

```
xrandr --output HDMI-1 --mode 1280x720
```

# 注意事項

* フルスクリーンにするとクラッシュするらしいです。
* （Lan公開して）マルチプレイしたらクラッシュしました。

# 追記（未検証）
一発で動きそうなスクリプトを書いている人がいました。
こっちのほうが楽かも。

[https://github.com/Minecraft4Pi/Minecraft1.12.2](https://github.com/Minecraft4Pi/Minecraft1.12.2)
Node.jsで実行できるスクリプトをTypeScriptで書くテンプレート


# 概要
Node.jsで実行できるスクリプトをTypeScriptで書ける環境を作り，テンプレートにしました．

# 場所
https://github.com/kabosu3d-lab/typescript-cli-template

# 使い方
```sh
git clone https://github.com/kabosu3d-lab/typescript-cli-template.git tool
cd tool
npm install # インストール
npm run build # ビルド
node dist/main.js # 実行
```

# 以下，詳細な環境構築手順
## 検証環境
Macbook pro

## 環境構築
```sh
mkdir tool
cd tool/
git init
curl https://raw.githubusercontent.com/github/gitignore/master/Node.gitignore > .gitignore
npm init # 質問にはお好みに回答
npm install --save-dev webpack webpack-cli typescript ts-loader @types/node
./node_modules/typescript/bin/tsc --init
```

webpack.config.jsを作成

```js
module.exports = {
  entry: './src/index.ts',
  target: 'node',
  module: {
    rules: [
      {
        test: /\.ts$/,
        use: ['ts-loader'],
        exclude: /node_modules/
      }
    ]
  },
  resolve: {
    extensions: [ '.tsx', '.ts', '.js' ]
  }
};
```

package.jsonのscriptsを下記のように変更する．

```json
{
    "scripts": {
        "build": "webpack",
    },
}
```

```sh
mkdir src
touch src/index.ts # ここへコードを書く
```

## ビルドと実行

```sh
npm run build # ビルド
node dist/main.js # 実行
```

## 参考
[TypeScriptでCLIツールを作って、npmパッケージにする](https://qiita.com/suzuki_sh/items/f3349efbfe1bdfc0c634)．
Q. 同一ドメインで複数サイトを運営する場合のGAのプロパティは分けるべきか？

# A. わけない方が良さそう
 - サイト間移動は内部リンク扱いとなりリファラを取らない（ただしサブドメイン間移動はGAでは外部リンク扱い）
 - プロパティ（トラッキングID）を分けると行動フローが取れなくなる
 - よって、サイトAからサイトBにどういう経路で移動したかが一切見えなくなる

# 対処法

## プロパティを統合してビューで分割
ディレクトリでサイトを分けているのであればディレクトリ追加・除外の設定が可能
https://idotdesign.net/blog/marketing/analytics/ga-usage/

## プロパティを統合したくない場合
以下の様な方法もある
https://www.ja.advertisercommunity.com/t5/%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E8%A8%AD%E5%AE%9A/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E5%86%85%E3%81%A7%E8%A4%87%E6%95%B0%E3%82%B5%E3%82%A4%E3%83%88%E3%81%8C%E6%9C%89%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E8%A8%88%E6%B8%AC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/td-p/12469
Windows10でScalaの開発環境を作るためにやったこと

##開発環境
- Windows 10

##参考資料

- [まずはここから！Scalaをインストールする方法【初心者向け】](https://techacademy.jp/magazine/16189)

基本的には、上記のサイトを参考にしました。
2017/05/22時点の記事のようなので、インストーラの画面など一部変わっている部分もありました。


##1. Javaのインストール
[Windows版Javaのダウンロード](https://java.com/ja/download/win10.jsp)
投稿時点でインストールしたのは「Version 8 Update 191」


##2. IntelliJ IDEA Communityのインストール
[Download IntelliJ IDEA](https://www.jetbrains.com/idea/download/#section=windows)

- 「32-bit launcher以外」にチェックを入れる

投稿時点でインストールしたのは下記のバージョン。
Version: 2018.3　
Build: 183.4284.148
Released: November 21, 2018



##3. IntelliJ IDEA Community Editionを起動

- 「Do not import setting」にチェック
- 「Skip Remaing and Set Defaults」をクリック

##4. Scalaプラグインのインストール

- Configure → Plugins
- 「Scala」で検索して、Install
- 「Restart IntelliJ IDEA」をクリック
- 「Create New Project」をクリックして、左側に「Scala」と表示されればインストール成功
Spring-Bootネタ

# SpringとSpring-Bootの時間経過で忘れてしまいそうな事をとりあえずメモしておくページ

## 開発環境系

### ソース（リソースも含む）更新時にオートリロードさせる

spring-boot-devtoolsを使う。
maven or gradle の dependencies に設定する。
設定記述内容は↓参照。
[Spring公式](https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html)

※公式の設定通りにやっておけば、jar で固めた時、jar の中に devtools の jar は入らない（大事）。

### EclipseからSpring-Bootを起動させる。

1. STSを入れて、ツールバーのBootダッシュボードを開く 
2. ダッシュボード内のプロジェクトを右クリックして起動

※ツールバーの赤枠部分がダッシュボード↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/299475/6f057f8e-57e0-5398-dd9b-b455ff5cc60f.png)

※ツールバーにBootのダッシュボードがない場合は、
メニューのウインドウ > ビューの表示 > その他 で ダッシュボード で検索

※ダッシュボードはSpring-Bootのプロジェクトが勝手に認識される↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/299475/ea90142c-9db0-716c-2565-f07e80aec392.png)

## 実装系

### ＠Configurationではなく、＠importを使う

＠SpringBootApplication に ＠Configuration がついてるので、自分で作るConfig系のクラスは全部、＠SpringBootApplication が付与されているクラスから ＠Importで呼び出すことにして、＠Confiurationをつけないこと

※実際には＠Confiurationでも問題なさげだけど、知ってる人感がでる。

### Starterが使用するBeanの設定＠myBatis-starterでhikariCPを使いたくないとか

Starterは必要なBeanがDIコンテナに有るか無いかを判断して、なければ必要なBeanを生成するっていう動作になっている。
[参考ページ：Spring BootのAutoConfigureの仕組みを理解する](https://qiita.com/kazuki43zoo/items/8645d9765edd11c6f1dd)
※もしくは、Starterのソースを見る

なので、自分でBeanを作るとデフォルトで作られるBeanを打ち消せる。

例えば、MyBatisのstarterではDatasourceがない場合、HikariCPのDatasourceを作るようになっているが、HikariCPを使いたくない時は自分でDatasourceのBeanをDIコンテナに登録してしまえばOK。

例）↓をしておくと、HikariCPを使わなくなる。

```Java
@Bean
public DataSource datasource() {
	MysqlDataSource ds = new MysqlDataSource();
	// ～略～
	// ※Datasourceの設定を普通に書く
	return ds;
}
```


## 起動＆リリース系

### gradleで実行可能jarを作る＆起動＠eclipse

"gradleタスク"ウインドウの中から、

```
build > boorJar
```
を実行。

build/libs の中に jar でできてるので、その jar を使って、

```
java -jar 生成したjarファイル
```
で起動。

### 実行可能jarに引数で使用したいpropertiesファイルを指定する

```
java -jar jarファイル --spring.config.location=classpath:/default.properties
```

ちなみに、jarファイルがあるディレクトリに application.properties を置くと、置いた application.properties を読み込む。
※--spring.config.location の指定は不要
※とかっていう application.properties の読み込み優先順位も↓に書いてある

[Spring公式](https://docs.spring.io/spring-boot/docs/1.4.1.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-external-config-application-property-files)
Pandas を用いて複数シートからなるエクセルファイルをデータフレームに取り込む

##### 以下のような2枚のシートからなるエクセルファイルをデータフレームに取り込む場合

######Excelsampledata.xls[sheet1]
![sheet1.png](https://qiita-image-store.s3.amazonaws.com/0/319484/613cae19-45d8-3e37-7745-6b18ecb8be66.png)
######Excelsampledata.xls[sheet2]
![sheet2.png](https://qiita-image-store.s3.amazonaws.com/0/319484/48ffd882-7a4a-ae6e-ea4d-cc699d041fa5.png)

#####サンプルプログラム
```sample.py
import pandas as pd

#エクセルファイルを読み込み
input_file = pd.ExcelFile("Excelsampledata.xls")
#シート名を格納
input_sheet_name=input_file.sheet_names
#シートの枚数を確認
num_sheet=len(input_sheet_name)

#de_listというリストを作成し、エクセルのシートをリストに格納していく。
df_list=[]
for sheet in input_sheet_name:
    df_list.append(input_file.parse(sheet))

#カラムを並び替えないで、読み込んだエクセルのシートを連結し、データフレームに格納する。
df=pd.DataFrame()
for i in range(num_sheet) :
    df=df.append(df_list[i])[df_list[0].columns.tolist()]

#欠損値を削除する。
df=df.dropna()
```
#####結果（データフレーム（df））
![result.png](https://qiita-image-store.s3.amazonaws.com/0/319484/3f37085f-93a7-d693-357e-17ce5a2118fa.png)
Windows7リカバリーディスクで起動できなくなった場合の備忘録

X220のHDDをSSDに変える準備で、USBリカバリーディスクを作るも起動できず。

こちらの手順で作成。
https://support.lenovo.com/us/ja/solutions/ht004960

どうやらこちらのおまじないで、パーティションを作っておく必要があるようです。
https://support.lenovo.com/ng/ja/solutions/ht002724

参照元
https://www2.kokoro-navi.com/diary4/2016/03/thinkpad-x1-carbon-recovery/
http://rayfactory.cocolog-nifty.com/blog/2013/05/thinkpad-edge-3.html
Vagrantでのgitのバージョンを更新する

##はじめに
dotinstallでwindowsの環境構築をするとgitのバージョンが1.7.1になってしまうので
gitのバージョンを更新するため自分用メモ

##gitのバージョンを更新するコマンド

```
$ sudo yum remove git
$ sudo yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
$ cd /usr/local/src/
$ sudo wget https://www.kernel.org/pub/software/scm/git/git-2.9.5.tar.gz
$ sudo tar xzvf git-2.9.5.tar.gz
$ cd git-2.9.5/
```

ここまでは問題なく実行できたが、以下二つのコードを書いた際にエラーが発生。

```
$ sudo make prefix=/usr/local all
$ sudo make prefix=/usr/local install
```

なので、以下を実行すれば解決しました。

```
$ sudo yum install perl-ExtUtils-MakeMaker
```

これで`git --version`を確認するとバージョンが更新されている。

##参考記事
- http://st-hakky.hatenablog.com/entry/2018/02/26/133116
- http://endok.hatenablog.com/entry/2014/07/05/232546
Sequel proの代わりを探すためにTeamSQL、TablePlus、DBeaverを使ってみた結果

「mac DB」検索すると５番目くらいに出てくる「[Sequel Pro](https://www.sequelpro.com/)」を使ってたけど、
MySQl8.0に対応していないので、案件によっては使えない。

接続できるっぽい情報もあったがこちらでは再現出来ず・・。

- [MySQL8.0でSequel Proを使えるようにする](https://qiita.com/KeisukeToyota/items/1c128729127feed7597f)
- [Sequel ProからMySQLにログインできないエラーを解決](https://yuap.jp/blog/723)

そこで代わりになるツールを調べました。

## 選定ポイント
- 無料で利用可能か？
- ssh接続で、2台先のDBに接続できるか？
    - ポートフォワードをコマンド実行するのは面倒。.ssh/configを使って簡単につなぎたい。
    - イメージ　→　[踏み台サーバ越しにあるMySQLにSequel Proでつなぎにいく](https://qiita.com/wapa5pow/items/bd047181728c5cb6b774)
- テーブルの中身が簡単に見れるか？
- Excel感覚で表示したデータを書き換えて更新できるか？
- CSVでエキスポートできるか？

## TeamSQL
最初に見つけたのがこのツール。
[Sequel Proを超えるGUIツールが出てきたぞ](https://qiita.com/shunichi_com/items/b07ae8c678aa7c0e2ff6)
を見て知りました。

### 使ってみた
- 全機能を無料で利用できそう。
- ssh接続できるが、1台先まで。
    - .ssh/configを設定する場所はなさそうだった。
- 他のツールより動作が重い（テーブル名を選択してからデータが表示されるまでに一瞬待つ）のが気になる。
- 表示したデータの値を直接変えることはできなさそう。
- CSVのエキスポート機能はあった。
- 会員登録が必要なのが若干面倒。

## TablePlus
[TablePlusを使ってみる。シンプルでモダンなSQLクライアントツール](https://tech-blog.s-yoshiki.com/2018/09/663/)

### 使ってみた
- 一部無料。無料だと同時に２タブまで表示可。３タブ目を開こうとするとエラーが表示される。
- .ssh/configの設定が使えるので、2台先のDBにも接続できる。
- 動作が軽い（テーブル名をクリックすると、すぐにデータが表示されるなど）
- Excel感覚で表示したデータの値も更新可能。
- CSVなどのエキスポート機能あり。（区切り文字も細かく指定ができる。）
- 会員登録不要。ダウンロードしてすぐに使える。

## DBeaver
[複数のデータソース(Redshiftや主要RDBMS等)及びOS(Mac/Windows/Linux)対応の無償SQLクライアントツール『DBeaver』](https://dev.classmethod.jp/tool/dbeaver-is-free-universal-sql-client-tool/)

### 使ってみた
- 無料でも制限なしで利用可能。
- 接続する画面を見る限りでは、.ssh/configを指定する項目がないので、おそらく未対応。
- JDBC接続するので、別途専用ドライバーのインストールが必要になる。
    - ドライバー周りでエラーが出て先に進めず・・。

## 結果
今は、TablePlusを使ってます。
UNITYのCollisionを作る

## 初めに障害を作るです。

↓は障害の設定です。

![Screenshot_3.png](https://qiita-image-store.s3.amazonaws.com/0/286746/12c38ae9-5f1f-af96-0300-1f13918380b5.png)


## 新しいColisionのスクリプトを作る

この新しいシクリッドはプライヤーのオブジェクトに上げる。

↓は新しいスクリプトのコードです。

```
using UnityEngine;

public class PlayerCollision : MonoBehaviour {

    public playerMovement movement;　//このはプライヤーの動きスクリプトです。

	// Use this for initialization
	void OnCollisionEnter (Collision collisionInfo) {
        if(collisionInfo.collider.tag == "Obstacle")
        {
            movement.enabled = false;　//このスクリプトは動くのスクリプトはDisabledするためです。
        }
	}
	
}
```

↓は変数の設定です、変数はプライヤー動きのスクリプトを設定する。

![Screenshot_2.png](https://qiita-image-store.s3.amazonaws.com/0/286746/665bd3ed-9069-16bb-b6e5-88a3f215d9ff.png)



GITHUB　：https://github.com/andybit-okutama/Unity_Learn/tree/feature/collision
Firebase authで電話番号(SMS)認証を行う方法 (Web)

## 概要

認証にFirebase authを使っているWebサービスで、アカウントに対して電話番号認証をさせ認証情報をリンクさせる仕組みを導入します。

## 動機

Webサービスにおいて一人にたくさんのアカウントを作られることを防ぎたいというのは割とよくあるケースだと思います。

このときに使える方法のひとつが電話番号(SMS)認証です。SMSで4桁とか6桁の数字を送ってユーザーに入力させるアレです。
メールアドレスとちがい電話番号は無料でいくらでも作るということはできないので、アカウントの開通に電話番号の確認を要求するようにすることは有効な手段です。

ちなみにFirebase authでは電話番号をログイン情報に使うこともできますが、今回はログインはあくまでGoogleやGithubなどOAuthを使い、電話番号認証は既存のアカウントに紐付ける方法についてです。

## リポジトリ

https://github.com/k5trismegistus/firebase-auth-sms-2fa-demo

今回作成したデモアプリはこのリポジトリにあります。

さくっと動かすためにNuxt.jsを使っています。

## 流れ

Firebase authで既存アカウントに対して電話番号認証を行う際の流れは次のようになります。

1. ユーザーに電話番号を紐付ける対象のアカウントでログインしてもらう
2. ユーザーに電話番号を入力させる
3. 入力された電話番号に確認コードを送信する
4. 2の時点で払い出されるトークンと、SMSを受け取ったユーザーが入力する確認コードを使って認証を行う
5. 得られた認証情報をアカウントとリンクさせる

## 実装

1については詳細を省略します。

### 2. ユーザーに電話番号を入力させる & 3. 入力された電話番号に確認コードを送信する

これは意外に思ったのですが、電話番号認証はポップアップなりリダイレクトなりでGoogleの用意したUIを使うのではありませんでした。電話番号や確認コードの入力フォームは自分で用意する必要があります。

ユーザーに確認コードを送信すると、その確認コード送信に対応するトークンが払い出されます。
確認コードを入力してもらったときに、このトークンもあわせて必要になりますので、どこかに保存しておく必要があります。

サンプルコードでは、Vue.jsコンポーネントのdataに格納しています。
(confirmationResultに入っている)

```vue.js
async sendSmsVerification() {
    try {
        const confirmationResult = await firebase.auth().signInWithPhoneNumber(this.phoneNumber, this.recaptchaVerifier)
        this.confirmationResult = confirmationResult
        this.waitingVerify = true
    } catch(error) {
        console.error(error)
    }
},
```

### 4. 2の時点で払い出されるトークンと、SMSを受け取ったユーザーが入力する確認コードを使って認証を行う & 5. 得られた認証情報をアカウントとリンクさせる

さきほどの電話番号のとき同様にユーザーに確認コードを入力してもらうフォームも自分で作成する必要があります。
そのフォームに確認コードを入れてもらったら、さきほど保存したトークンと一緒にFirebaseに送信すると、電話番号の認証情報が得られます。

この認証情報をFirebaseのユーザーオブジェクトに生えている`linkAndRetrieveDataWithCredential`メソッドに渡すと、既存のアカウント情報に電話番号認証情報がリンクされます。

```vue.js
async confirmVerification() {
    const credential = firebase.auth.PhoneAuthProvider.credential(this.confirmationResult.verificationId, this.verificationCode)
    const userCred = await this.user.linkAndRetrieveDataWithCredential(credential)
    this.auth.phoneNumber = userCred.user.phoneNumber
}
```

電話番号認証が終わると、Firebase authのコンソールが次のような表示になっているはずです。

![Screenshot from 2018-11-28 22-21-31.png](https://qiita-image-store.s3.amazonaws.com/0/133157/ed403c47-7630-05a5-41bc-c3f7c6b59f61.png)

Googleアカウントと電話番号が紐付けられました。
[Unity] 最新のNDKでgradleビルドが通らない問題に対処する

UnityのAndroidビルドで、`Build system`を`gradle`にした際、以下のビルドエラーが発生する件

```
No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
```

https://forum.unity.com/threads/commandinvokationfailure-gradle-build-failed.559963/


このエラーでググると、Unityに限らずAndroidのビルドで同じ問題が発生している記事等が色々出てきます。
エラーの原因としては、メッセージの通り、toolchainsの "mips64el-linux-android" ディレクトリが最新のNDKでは削除されたことのようです。
Unityの`build.gradle`では `ndk.abiFilters` でそもそもmipsは含まれていませんが、abiFiltersに関わらず発生します。

対処方法はいくつかあります。なお、2017.4.13f1で確認しています。

## 1. Gradle plugin のバージョンを上げる（要Export）

Unityが使う `build.gradle`では、Gradle pluginのバージョンが、2.3.0 になっています。

```
buildscript {
...
	dependencies {
		classpath 'com.android.tools.build:gradle:2.3.0'
	}
}
```

これを`3.1.3`以上に上げるとビルドが通るようになります。

```
classpath 'com.android.tools.build:gradle:3.1.3'
```

ただし、一旦プロジェクトをエクスポートしてからビルドする必要があります。
Unityで直接ビルドした場合は以下のビルドエラーが発生しました。

```
A problem occurred evaluating root project 'gradleOut'.
> Failed to apply plugin [id 'com.android.application']
   > Minimum supported Gradle version is 4.4. Current version is 4.0.1. If using the gradle wrapper, try editing the distributionUrl in <ProjectDir>/Temp/gradleOut/gradle/wrapper/gradle-wrapper.properties to gradle-4.4-all.zip
```

Unity 2017.4.13f1 が使うGradleのバージョンは `4.0.1` のようですが、`4.4`以上が必要になります。
なお、2018.2.17f1 でも`4.2.1`のようなので、こちらも直接ビルドは無理そうです。


## 2. `ndk.dir`のパスを指定する

Unityが出力する `local.properties` ファイルには `ndk.dir`が指定されていませんが、この`ndk.dir`を指定すると
AndroidStudioにバンドルされているNDKを参照しなくなるようで、ビルドが通るようになります。
UnityのIL2CPPでは古めのNDK（2017だと`r13b`）を使うよう指定されているので、もしIL2CPPを使っている場合は
このNDKのディレクトリを指定すると良いです。
（なお、`ndk.dir=` という感じでパスが空でもビルドが通りました）

とはいえ、Unityは `local.properties` をビルド時に自動で生成するので、直接編集することはできません。
そのため以下のコードを `mainTemplate.gradle` の一番上に追記することで、ビルド時に値を設定するという方法をとります。

```gradle
def properties = new Properties()
def propFile = project.rootProject.file('local.properties')
properties.load(propFile.newDataInputStream())
properties.setProperty('ndk.dir', '<NDK_PATH>/android-ndk-r13b')
properties.store(propFile.newWriter(), null)

...
```



なお、`mainTemplate.gradle` は、AndroidのPlayerSettingsで、`Custom Gradle Template` にチェックを入れると生成されます。

<img width="380" alt="Android PlayerSettings" src="https://qiita-image-store.s3.amazonaws.com/0/19872/d9f1237a-ea66-af81-e524-fff567b7cf64.png">

これが build.gradle のベースとなります。



## 3. `SDK Tools`から`NDK`を削除する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/19872/054fcabc-fdbd-0525-2c50-079d8a2741d9.png)

`NDK`のチェックを外し、アンインストールします。これだけでビルドが通るようになります。
IL2CPPでビルドしている場合でも、Unityは別途インストールしたNDKを使うため問題ありません。
Unity以外のAndroidプロジェクトでNDKを使っている場合は困りますが、そうでない場合は一番手っ取り早いです。


## 4. `mips64el-linux-android` ディレクトリをでっちあげる

`mips64el-linux-android` ディレクトリがないのが問題なのだから、ディレクトリ作れば良いだろうという方法です。
以下のように、他のディレクトリにシンボリックリンクを張るか、丸ごとコピーするとかします。

```bash
cd ~/Library/Android/sdk/ndk-bundle/toolchains/
ln -s x86_64-4.9 mips64el-linux-android
```


***


どれか好きな方法で対処してください。そのうちUnityのバージョンアップで対応されると思います。
ubuntu18.04LTS で dockerd の dns を設定する

## 環境

- Ubuntu 18.04LTS
  - systemd で resolv.conf 管理したり dockerd 起動したりしてる linux distribution
- docker-ce 18.09
- Public network `8.8.8.8` に直につなげない環境下で独自の nameserver を利用している

## やりたいこと

systemd で起動する dockerd に対して dns (nameserver) のアドレスを設定したい.

## 読み飛ばしてもよい背景

何も設定していない状態の dockerd では，ホストの `/etc/resolv.conf` をマスク（上書き）したファイルがコンテナ内部の `/etc/resolv.conf` として mount される.

[コンテナの DNS を設定 — Docker-docs-ja 1.10.0b ドキュメント](http://docs.docker.jp/engine/userguide/networking/default_network/donfigure-dns.html)

[こちら](https://qiita.com/hirosemi/items/0574a4b044f46c6ac5af)に書かれている通りホストの `/etc/resolv.conf` が未設定の状態だと `8.8.8.8` へ強制的に飛ばされるのだが，`8.8.8.8` へ到達できない環境下だと外部のアドレスが解決できなくなり困る.

16.04LTS だと dns のアドレスを `/etc/systemd/system/docker.service.d` 配下に `ExecStart` で書いたり, 或いは何もしなくても resolv.conf の設定がうまいことコンテナ上の `/etc/resolv.conf` に反映されていた. のだが, 18.04LTS へ新たにインストールしなおしたところ, それらの設定がうまく反映されなくなってしまったので，対処法を調べた.

## 正攻法（恐らく）

`/etc/docker/daemon.json` を編集する.

https://docs.docker.com/config/daemon/systemd/

曰く `http_proxy` など一部の設定を除いては daemon.json に書けとのこと.
（当初 /etc/systemd/system/docker.service.d 配下に ExecStart を記述しようとしたがサービスの起動に失敗した）

編集したら以下のコマンドで再起動する.

```
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
```

## 邪道？

/etc/resolv.conf のリンク先を書き換える.

```
$ cd /etc
$ sudo rm resolv.conf
$ sudo ln -s resolv.conf ../run/systemd/resolve/resolv.conf
```

この方法は `systemd-resolved` で dns 設定が `../run/systemd/resolve/resolv.conf` に反映されていることを前提としている. dockerd の再起動は不要.

#### 言い訳

まっさらからインストールした Ubuntu 18 だと `/etc/resolv.conf` は `../run/systemd/resolve/stub-resolv.conf` のシンボリックリンクとなっている（Ubuntu 16 或いは 16 から移行した環境では `../run/systemd/resolve/resolv.conf` となっている）.

参考：[Systemd 時代のresolv.conf](http://takuya-1st.hatenablog.jp/entry/2018/02/26/000000)

`../run/systemd/resolve/stub-resolv.conf` の中身はこうなっている.

```
nameserver 127.0.0.53
```

どうも systemd が `systemd-resolved` サービスを経由して dns 解決するような変更が加わったらしい. （`systemd-resolved` は `/etc/systemd/resolved.conf` の設定を参照して, 代理のローカル nameserver を `127.0.0.53` に立ち上げる）

この状態で `docker run` すると `127.0.0.53` がマスクされる. 代わりに `8.8.8.8` で上書きされ, 外部ネットワーク上のアドレス解決ができなくなってしまう.

## 参考にしたページ

- [systemd起動のDockerでdnsオプションを有効にする - Qiita](https://qiita.com/hirosemi/items/0574a4b044f46c6ac5af)
- [Systemd 時代のresolv.conf - それマグで！](http://takuya-1st.hatenablog.jp/entry/2018/02/26/000000)
- [コンテナの DNS を設定 — Docker-docs-ja 1.10.0b ドキュメント](http://docs.docker.jp/engine/userguide/networking/default_network/donfigure-dns.html)
- [Control Docker with systemd | Docker Documentation](https://docs.docker.com/config/daemon/systemd/)
- [Dockerデーモンをチューニングする - Qiita](https://qiita.com/matyapiro31/items/cf5f436c40a6f77227c3)
- [Ubuntu 18.04 + Docker 17.12.1-ce break DNS resolution · Issue #2187 · docker/libnetwork](https://github.com/docker/libnetwork/issues/2187)
AUTOSAR（Adaptive 18.10）を読んでいく（4）

やっと4章（OSの話）。といってもPOSIX準拠のOSなのである程度は理解しやすい。
年末までにはPlatformDesignを読み終わりたいなぁ。。。

# Overview

OSは以下の責務を持つ。
また、OSはExecution Management（PlatformやOSの初期化をするもの）と併せて動作する。

- ランタイムスケジューリング
- リソース管理（メモリのポリシングや時間制約を含む）
- Adaptive上で動作する全アプリケーションのプロセス内通信

Adaptiveでは、高性能なプロセッサを用いたOSに関する仕様ではなく、
Adaptive Applicationに提供スべき実行コンテキストやOSIを定義している。
（たぶん、リアルタイムシステムだよ、と言いたいのでは）

OSIの仕様は、ARA（Adaptive Applicationの標準インターフェース仕様）の
Application Interface（の一部）を包含している。
OSは、それとは別のInterfaceを提供する（例えば、プロセスの生成）。

OSIはCとC++のInterfaceを提供する。

- Cの場合：POSIX標準であるPSE51のInterfaceを提供する
- C++の場合：標準C++ライブラリと標準C++で定義されている機能を提供する

# POSIX

市場にはLinuxとかPOSIXとか色々なOSがあるが、アプリにはOSに提供するAPIに比べ、より厳密なAPIが必要である。（ユーザーアプリがPSE51のInterfaceを使っている一方で、PlatformのアプリはPOSIXを使っているかもしれない、ということ）
POSIXコールの使い方の塩梅などについては実装者の自由であり、APの範囲外。

# Scheduling

マルチスレッド、および、マルチプロセスに対応している。
標準的なスケジューリングポリシはSCHED_FIFOとSCHED_RR（POSIXで定義）。
それ以外では、SCHED_DEADLINEもしくは、OSの仕様で認められているスケジューリングポリシも使える。

# Memory management

マルチプロセスをサポートするためには、それぞれのアプリケーションが独立したアドレス空間で動作できることが必要（あたりまえ）。

# Device management

Device ManagementはPOSIX PSE51のInterfaceに含まれるので、そちらの仕様を見ろ、とのこと。
CSVファイルからエクセルで見やすくする

sakuraエディタなどに、CSVファイルをドロップドラッグ
全選択して⇒「置換」
⇒「,」を「　」(***タブ文字***)に交換。

全選択してコピー。
別のエクセルに張り付け。
でOK
rails5.2 bundle installがこけるので原因を調査してみた

rails newしたのですが、bundle installの部分でこけました。

```
$ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching source index from https://rubygems.org/

Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Retrying fetcher due to error (3/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Retrying fetcher due to error (4/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Could not fetch specs from https://rubygems.org/
```


ググったらgem updateしろと出てきたのでしてみましたが、こちらもNG

```
$ gem update -V --system
ERROR:  While executing gem ... (Gem::RemoteFetcher::UnknownHostError)
    timed out (https://api.rubygems.org/specs.4.8.gz)
```

wgetもできない

```
$ wget https://api.rubygems.org/specs.4.8.gz
--2018-11-28 21:49:23--  https://api.rubygems.org/specs.4.8.gz
api.rubygems.org (api.rubygems.org) をDNSに問いあわせています... 2a04:4e42:400::70, 2a04:4e42::70, 2a04:4e42:200::70, ...
api.rubygems.org (api.rubygems.org)|2a04:4e42:400::70|:443 に接続しています... 失敗しました: Operation timed out.
api.rubygems.org (api.rubygems.org)|2a04:4e42::70|:443 に接続しています... 失敗しました: Operation timed out.
api.rubygems.org (api.rubygems.org)|2a04:4e42:200::70|:443 に接続しています... ^C
```

IPv6での通信ができないのか？と思いググったらそうっぽい


>api.rubygems.org is currently experiencing issues with IPv6 setup: this hostname has 4 IPv6 addresses, but responds on neither of them. Neither to ping, nor to TCP connection attempts. "

https://stackoverflow.com/questions/49800432/gem-cannot-access-rubygems-org

4つのIPv6アドレスを持っているがどれも応答しないとのこと

rubygems.orgのIPv4アドレスを調べてhostsに記載して無事解決！

```
$ host rubygems.org
rubygems.org has address 151.101.128.70
rubygems.org has address 151.101.64.70
rubygems.org has address 151.101.0.70
rubygems.org has address 151.101.192.70
rubygems.org has IPv6 address 2a04:4e42:600::70
rubygems.org has IPv6 address 2a04:4e42::70
rubygems.org has IPv6 address 2a04:4e42:400::70
rubygems.org has IPv6 address 2a04:4e42:200::70
rubygems.org mail is handled by 10 mxa.mailgun.org.
rubygems.org mail is handled by 10 mxb.mailgun.org.
$ sudo vi /etc/hosts
$ bundle install
Fetching source index from https://rubygems.org/

--- 省略！ ---

Bundle complete! 19 Gemfile dependencies, 81 gems now installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
```
子供向けプログラミング教育系の情報サイト まとめ

* 新しいサイトを発見したら随時追加します
* 間違いや、他の情報源があれば教えてください :bow: 

# リスト(順不同)

* ICT教育ニュース
  * https://ict-enews.net/
  * RSS,Twitter,Facebook

* ReseMom(リセマム) → 教育ICT
  * https://resemom.jp/category/it-education/
  * RSS,Twitter,Facebook

* こどもとIT
  * https://www.watch.impress.co.jp/kodomo_it/
  * RSS

* EdTechZine
  * https://edtechzine.jp/
  * RSS,Twitter

* ICT toolbox
 * https://ict-toolbox.com/
 * Twitter,Facebook

* ベネッセのプログラミング教育情報
 * https://beneprog.com/
 * Twitter,Facebook

* 小学校を中心としたプログラミング教育ポータル
  * https://miraino-manabi.jp/

* ICT CONNECT 21
  * https://ictconnect21.jp/
  * Facebook

* コエテコ
  * https://coeteco.jp/
  * Facebook

* VaLEd.press（バレッドプレス）
  * https://valed.press/
  * Twitter,Facebook,Instagram


* 小学校で必修化！子どもと始めるプログラミング - デジタル - 日経トレンディネット
  * https://trendy.nikkeibp.co.jp/digital/prog/

* 小学校を中心としたプログラミング教育ポータル Powered by 未来の学びコンソーシアム
  * https://miraino-manabi.jp/
Pythonで競プロに挑む日誌 vol.23 ~計算量つづき~

# 現在の目標
* 2018年内に茶色になる**←イマココ**
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の A, B 問題を全部解く
* 2018年度内に緑色を取得する
 * [ABC](
https://kenkoooo.com/atcoder/?user=&rivals=&kind=category) の C 問題を全部解く
* (水色になったら, [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す)

# 今日のおはなし
### 結論
標準入力の受け取り方ひとつで, 計算量を減らすことができる.

#### 解いた問題
[B - Trained? ](https://beta.atcoder.jp/contests/abc065/tasks/abc065_b)

#### 標準入力の受け取り方で実行時間に大きな差が出た
```naswer1.py
# coding: utf-8
import sys

N = int(input())
lst = [int(input()) for _ in range(N)]

btn = 1
cnt = 0
for a in lst:
    btn = lst[btn-1]
    cnt += 1
    if btn == 2:
        print(cnt)
        sys.exit()
print(-1)

# 実行時間：195ms
# メモリ　：7084 KB
```
```naswer2.py
# coding: utf-8
import sys

N = int(input())
lst = [int(i) for i in sys.stdin]

btn = 1
cnt = 0
for a in lst:
    btn = lst[btn-1]
    cnt += 1
    if btn == 2:
        print(cnt)
        sys.exit()
print(-1)

# 実行時間：68ms
# メモリ　：7084 KB
```
一回ずつ標準入力から値を取ってちびちびメモリを確保するよりは, 一気にメモリを確保したほうが早いということなのでしょうか. 

# むすび
制約が大きい時, sys.stdin は役立ちそう.
Turbolinks管理下でReactを使う

いつの間にかTurbolinksおじさんと化している気もするのですが、今回はTurbolinksを使っているプロジェクト内にReactで作ったウィジェットを埋め込んだ話をしていきます。

## Turbolinks～SSRとは逆向きから

JavaScriptで全ページを構築するSPAではファーストビューが遅いという問題があって、JavaScriptをサーバサイドでも実行するSSRを行うことでファーストビューを改善しています。

一方で、Turbolinksは出発点が「HTMLで書かれたWebページ」で、JavaScriptではページ遷移だけに介入して別なHTMLを生成することで、HTML全体のリロードを回避する、という構成になっています。

## ちょっとだけReact

[以前に書きました](https://qiita.com/jkr_2255/items/0de3e308dce513786289)が、React.jsはページ全体に対して組み込むだけではなく、ページのパーツとして一部だけに組み込むことも可能です。

## ライフサイクルを見計らって

ただ、途中でページが入れ替わる以上、普通はあまりする機会の来ない「ページからの撤去」も必要となります。まずは、HTMLの生成・変更・削除に関連するライフサイクルを洗い出してみます。

|ライフサイクル|遷移前のDOM|遷移後のDOM|
|:--|:--|:--|
|`turbolinks:before-cache`|ここのイベントで変更したあとのものがキャッシュされる|（まだ存在しない）|
|`turbolinks:before-render`|この直後に画面から消える|裏画面としてDOM操作が可能|
|`turbolinks:render`|（画面から消えている）|`document.body`として表示される|

### ノーマルコース

新しいページにはめ込むコンポーネントを`turbolinks:render`ではめ込むことにした場合、比較的使いやすい感じになります。ただし、いったん表示されてからマウントするので、チラツキが発生します。

セットしたまま遷移すると、ページに存在しないコンポーネントだけが残ってしまったり、（Reactの場合はそこまで問題ないかもしれませんが）イベントが消えたDOMノードだけがキャッシュされたりといった不都合が生じるので、アンマウントが必要となります。`turbolinks:before-cache`と`turbolinks:before-render`の両方で`ReactDOM.unmountComponentAtNode`しておけばいいでしょう（`ReactDOM.unmountComponentAtNode`は、Reactがマウントされていないエレメントに対して実行しても何も起きません）。

### 上級コース

`turbolinks:before-render`では、遷移先の画面の`<body>`が形成されて、`e.target.newBody`としてイベントからも取れるので、ここでマウントすれば、表示前にReactを構築してしまうことができます。

ただ、マウントされた`<body>`は`document.body`ではないので、Reactの中から`document.getElementById`などのようなことをしている場合、うまく動かなくなるのは要注意です。
JavaScriptのDateの挙動（Safari）

Dateの挙動がChromeとSafariで違うことに今日気がつきました...

```javascript
var dt = new Date('2018-11-28T11:30:30+0900');
```

# ブラウザごとの挙動

## Chrome
<img width="347" alt="Chrome" src="https://qiita-image-store.s3.amazonaws.com/0/51116/679c663f-1206-98c7-e122-136f9d051982.png">
ふつーに動きますね。

## Safari
<img width="347" alt="Safari" src="https://qiita-image-store.s3.amazonaws.com/0/51116/7fc44831-b035-a5b3-8c3a-7febc5738a81.png">
あれ？ダメです。

## 仕様を調査

[Date - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date)を見てみます。

#### 構文

> new Date();
> new Date(value);
> new Date(dateString);
> new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);

```new Date(dateString);```のdateStringはISO8601形式を認識するとのことなんですけどねぇ...

# 対応策

結局この方法で対応しました。(2018-11-29コメントを受けて修正)

```javascript
var at = '2018-11-28T11:30:30+0900';
var dt = new Date(at.replace(/([\+|\-])([0-9]{2})([0-9]{2})$/,"$1$2:$3"));
```

タイムゾーンの+hhmm部分を+hh:mmにするとSafariでも正しく認識してくれるとのことなので、+0900を+09:00に変換するようにしました。

Firefoxでも確認しましたが大丈夫でした。
Flutterのサンプルアプリをビルドする際に依存関係エラーが出た場合

Flutterのexampleに含まれているサンプルアプリをビルドしようとした際に、以下のようなエラーが出力され、ビルドができませんでした。


    Because test_core <0.2.0 depends on test_api 0.2.0 and flutter_gallery depends on test_api 0.2.1, test_core <0.2.0 is forbidden.
    So, because flutter_gallery depends on test_core 0.1.0, version solving failed.
    
    pub get failed (1)

どうやらこれは依存関係のエラーのようなので、以下のコマンドを実行し、最新のパッケージを取得します。


    flutter update-packages

これで、Flutterのサンプルアプリをビルドすることができるようになりました。
powershellの自作コマンドレットを使う

##はじめに
IT企業に入社しましたが運用系にいるため開発は趣味として行っています。
まだプログラミング経験も半年だけなので分からないこと、間違ったことたくさんあると思うので
ご指導、ご指摘の程よろしくお願いします。

Ubuntu18.04を使っています。


##問題・やりたいこと
>Powershellの自作コマンドレットを使う

ExchangeOnelineを使うためにコマンドコピペを繰り返したりしているのを一発でやりたい

##解決策・実施したこと
・コマンドレットを作成する > psmファイル
コマンドレットを作成するときはpsmファイルに記述しこれをImport-Moduleする

```PowerShell:OriginalCmd.psm1
function Setup-Exo {
     $Cred = import-Clixml PassFile.xml
     $Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $Cred -Authentication Basic -AllowRedirection
     Import-PSSession $Session -AllowClobber
}
```

といった感じにコマンドレットを定義します。

```PowerShell
import-Module ./OriginalCmd.psm1 -function *
```

コマンドレットをインポートした後に実行する

```Powershell
PS /home/Office/PowerShell> Setup-EXO  
 ModuleType Version    Name                                ExportedCommands                                               
  ---------- -------    ----                                ----------------                                                 
Script     1.0        tmp_4rbiyq0d.ytl                    {Add-AvailabilityAddressSpace, Add-DistributionGroupMember, A...

```
OK!

##おわりに
次は高度な関数の定義がしたい。。。
[Flutter] animationを使って試してみた。

こんばんは。
アニメーションを使ってますか？
試してみるとFlutterは簡単でよかったです。

# 心。
最初はツイッターアプリ起動する時の画面をつくってみたかった。

# コード
```dart:flutter
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage>
    with SingleTickerProviderStateMixin {
  Animation<double> animation;

//  Animation<Color> animation;
  AnimationController animationController;

  @override
  void initState() {
    // TODO: implement initState
    super.initState();

    animationController = AnimationController(
        vsync: this, duration: Duration(milliseconds: 5000));
    //animation = Tween<double>(begin: 20.0, end: 100.0).animate(animationController);

    animation =
        Tween<double>(begin: 0.0, end: 1.0).animate(animationController);

    animation.addListener(() {
      setState(() {
        print(animation.value.toString());
      });
    });

    animation.addStatusListener((status) => print(status));
    animationController.forward();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: AnimatedLogo(
        animation: animation,
      ),
//        child: Container(
//          height: 150.0,
//          width: 150.0,
//          color: animation.value,
//          child: FlutterLogo(),
//
//        )
//
    );
  }
}

class AnimatedLogo extends AnimatedWidget {
  final Tween<double> _sizeAnim = Tween<double>(begin: 0.0, end: 500.0);

  AnimatedLogo({Key key, Animation animation})
      : super(key: key, listenable: animation);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    final Animation<double> animation = listenable;
    return Transform.scale(
      scale: _sizeAnim.evaluate(animation),
      child: FlutterLogo(),
    );
  }
}

```

# ローテーション。

<blockquote class="twitter-tweet" data-lang="ko"><p lang="und" dir="ltr"><a href="https://twitter.com/hashtag/flutter?src=hash&amp;ref_src=twsrc%5Etfw">#flutter</a> <a href="https://t.co/WWx8ac8WRz">pic.twitter.com/WWx8ac8WRz</a></p>&mdash; Dreamwalker (@jaichangpark) <a href="https://twitter.com/jaichangpark/status/1067753526523117569?ref_src=twsrc%5Etfw">2018년 11월 28일</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
URLから取得したクエリを利用してAPIを呼び出す

## 概要
APIのパラメータ設定が面倒で、URLから取れないかなぁと思って試しました。
Redmineのチケットをフィルタリングする部分で利用しました。
Redmine APIのissue.filter関数以外でこの方法を使用できるかどうかは未知数です。
誰か試したら教えてください。

## 内容
urllibのparse関数を利用します。

```get_query.py
import urllib.parse
import re

def get_params(query_url):
    # URLをパースする
    parsed_url = urllib.parse.urlparse(query_url)
    # クエリ部分をさらにパースする
    parsed_query = urllib.parse.parse_qs(parsed_url.query)
    # Redmine APIはプロジェクトidも必要なのでページパスから取得します。
    parsed_query['project_id'] = re.findall(r"projects/(.+?)/issues", query_url)
    return parsed_query
```

```main.py
from redminelib import Redmine

redmine = Redmine("http://your redmine home URL", key="your access api key")
query_url = r"http://your redmine query URL"

#get_params関数の返り値は辞書型で帰ってくるので、可変長引数(**)を利用してAPIへ渡します。
issue_list = redmine.issue.filter(**get_params(query_url))
print(issue_list)
```


## 参考

- [urllib.parse — URL を解析して構成要素にする](https://docs.python.jp/3/library/urllib.parse.html)(公式)
- [Issue — Python-Redmine documentation](https://python-redmine.com/resources/issue.html)(公式)
- [PythonのURLとクエリパラメータのパースまとめ](https://qiita.com/yagays/items/e59731b3930252b5f0c4)
- [Pythonの可変長引数（*args, **kwargs）の使い方](https://note.nkmk.me/python-args-kwargs-usage/)

## 最後に
~~またRedmineネタだけどほんとはJiraとか使いたい。~~
内容に間違いや不明な点があればご指摘ください。
【Python】漢字をひらがなに変換する

#使用しているライブラリ「Pykakasi」
[miurahr/pykakasi: pykakasi is re-imprelemtation of kakasi library in Python.](https://github.com/miurahr/pykakasi)

##漢字をひらがなに変換するコード

```py
from pykakasi import kakasi

text = "形態素解析"

# オブジェクトをインスタンス化
kakasi = kakasi()
# モードの設定：J(Kanji) to H(Hiragana)
kakasi.setMode('J', 'H') 

# 変換して出力
conv = kakasi.getConverter()
conv.do(text)  # => けいたいそかいせき
```

##Options

| Option | Description | Values | Note |
|:--|:--|:--|:--|
| K | Katakana convertion | a,H,None | roman, Hiragana or noconversion |
| H | Hiragana convertion | a,K,None | roman, Katakana or noconversion |
| J | Kanji conversion | a,H,K,None | roman or Hiragana, Katakana or noconv |
| a | Roman conversion | E,None | JIS ROMAN or noconversion |
| E | JIS ROMAN conversion | a,None | ascii roman or noconversion |
React Nativeでカスタムフォント(FontAwesomeなど)を2行で利用する方法

## これは

多くの文献でassetsの下にfontsを作り、その中でttf拡張子のファイルを入れてカスタムフォントを使う方法が利用されています。

```ターミナル
├── App.js
├── app.json
├── assets
│      ├── fonts←これですね
│      │     ├── fa-solid-900.ttf
│      │     └── fontawesome-webfont.ttf
│      ├── icon.png
│      └── splash.png
│ 
├── babel.config.js
├── node_modules
│   ├── @babel
│   ├── @expo
│  いろいろ
├── package-lock.json
├── package.json
└── src
    ├── components
    ├── elements
    └── screens

```

しかし、上記の方法を利用すると、importだけではなくたくさんの処理を記述する必要があります。

**今回は、expoが標準で用意してるvector-iconsを利用して、たった2行でFontAwesomeなどのカスタムフォントが利用する方法をご紹介します！**
※npmやyarnで何かをinstallする必要もありません。

## 使い方

### 使用したいfontを選ぶ

vector-iconsが対応しているfontにどのようなものがあるか調べていきます。

[URLはこちらです！](https://expo.github.io/vector-icons/)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/5e28065b-c312-a42f-2b6a-8498fc808e05.png)

検索窓があるため、希望のfontを探せます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/178b980f-59ce-e24a-9ba2-fd3e3221a182.png)

### 使用する

vector-iconsから使用したいfontをimportします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/150094/4c431d1c-172a-85c4-c275-bd0425255e7d.png)

例えば、上記の画像と同じfontを利用したい場合は、このように書きます。

```App.js
import { Entypo } from '@expo/vector-icons';

class FontElement extends React.Component{
    render(){
        return(
            <View style={styles.container}>
                <Entypo name="pencil" size={希望の大きさ} />
            </View>
        );
    }
}

export default FontElement;

```

どの方法よりもこのやり方が簡単なので、是非ご利用ください！

## 最後に

他にもoptionがあるようなので、是非気になる方は調べてみてください！