OmniAICreator/Qiita-1.07M huggingface dataset:
Google Formで小テストを作成する

#きっかけ
とある学習塾で教材作成を行った際に、
とても便利だったので、やり方をまとめようと思い至りました。
どなたかの参考になれば幸いです。

#何がいいのか？
この記事を読み進める価値があるのかということを先に書きます。

* ファイルでも紙でもなくURLを伝えられればよい（QRコードとか）
* 採点を勝手にしてくれる
* 集計・分析を勝手にしてくれる

#作り方

##Google Driveを開く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244716/de1f9178-8ea2-c38e-6dc4-0f7ae476961f.png)

##「＋　新規」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244716/071650c2-1d28-cc6a-474d-36953871750f.png)

## [その他]－[Google フォーム]－[テンプレートから]を選択する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244716/49110552-3613-6d07-ae3b-f580940735e0.png)

##「教育」カテゴリの「空白のテスト」を選択する

※他のテンプレート（なんなら「空白のフォーム」）でもいいと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244716/b956bd96-b677-bef2-ebb3-ff6c543673bc.png)

##あとは直感で作成するのみ

ここからはもう直感でできると思います。
（というか一個一個書くのが面倒くさい）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244716/1d5b422b-7416-4b86-bcc3-6261c118fe1f.png)

## 問題ができたら、右上の「送信」をクリック

![a.png](https://qiita-image-store.s3.amazonaws.com/0/244716/f61e1152-8afd-debf-e5b3-e61ad0b62a15.png)

##URLを取得する

初期値はメールで送るようになっていますが、
クリップマークにして、URLでばらまくほうが便利だと思います。
※ここで表示されているURLはもうありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244716/9c6d15fd-1fc0-a7bb-931e-e7ba635e2389.png)

##URLをばらまいて回答を集める

これはLINEグループでもいいですし、SNSに投稿しても、QR印刷してもいいと思います。

##すると・・・

まず回答者は、回答後に即座に正誤を確認できます。
※問題作成時に「正解」を設定する必要があります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244716/5c40dbc3-3c87-493b-0f9e-9a1f0b5d46b5.png)

そして、問題作成者は作成したGoogle フォームを見ると、

![b.png](https://qiita-image-store.s3.amazonaws.com/0/244716/211671d8-1a1e-636f-060c-7b527fb15ffe.png)

回答が集まり、中を見ると、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244716/5f96efff-b396-ae17-fddb-0e49b213aa3c.png)

得点の平均や、誤答の分布などを確認することができます！！

#まとめ

同じことを紙教材でやろうとすると、
「問題作成」→「印刷」→「配布」→「回答回収」→「打ち込み」→「分析加工」→「チェック」が、
Google フォームだと、
「問題作成」→「URL配布」→「チェック」となり、とても楽だと感じた。

ネット環境とブラウザさえ使えれば良いので、
この時代ならほぼ誰でも回答可能かと思われます！

おすすめの設定や使い方あれば、教えてもらえると嬉しいです！
備忘録　CSVで吐かれた複数のファイルからpandas dataframeを生成する

①以下のコードをmy_module.pyに記述する
②使いたいコードで以下のように書いて使う
③元データは縦または横の1次元データを想定
④file_path_listとfile_name_listの順番が対応していること


 ```python:main.py
import my_module as mym
mym.col_csv2df(file_path_list, file_name_list)
mym.row_csv2df(file_path_list, file_name_list)
 ```

```python:my_module.py

# 元データ(1列)が1ファイルづつに分散しているのを統合する関数
def col_csv2df(
		file_path_list:list,
		file_name_list:list,
		usecols:int=[0,1],
		skiprows:int=3,
		nrows:int=20,
		index_col = 0):

	"""元データが1ファイルづつに分散しているのを統合する関数
	返値は列名が元ファイル名のpandas.df
	元データの長さはすべて等しく、縦一列
	pandasで読み込む
	元データのパスとファイル名は、file_selectでリスト化されていればそれを使うのが簡単
	file_path_listでpandasに読ませるファイルを絶対パスで指定
	file_name_listでRenameするときのラベル名を指定
	デフォルト設定はしておけば毎回値を入れるのを省ける
	indexとして一番目に読み込んだファイルを使う
	"""

	# 列データをシリーズ化する関数
	def pd_read_csv(x):
		temp_df = pd.read_csv(
			x,
			usecols=usecols,
			skiprows=skiprows,
			nrows=nrows,
			encoding='shift_jis',
			header=None,
			index_col=index_col
		)
		return temp_df

	# 各データ（series）を読んでリスト化する
	temp_df_list = [pd_read_csv(file_path_list[i]) for i in range(len(file_path_list))]
	print(temp_df_list[0].index)
	# 各データは列のseriesなので横に読み込んでData Frame化する
	# indexを無視って書いてあるけどaxis=1なので無視しているのはColumns
	df = pd.concat(temp_df_list, axis=1, ignore_index=True)

	# 読み込んだファイル名に列ラベルを変換
	# 列番号リスト（range(len(変換したいリスト))）と変換したいリストをzipしてdictに投げる
	columns_dict = dict(zip(range(len(file_name_list)), file_name_list))
	# 行ラベルは正しく取得てきているのでいじらない

	# 列にファイル名をセットしてrename
	# dfに上書きしちゃいたのでinplace='True'
	df.rename(columns=columns_dict, inplace='True')

	#情報書く
	print(col_csv2df.__annotations__)
	print(col_csv2df.__doc__)

	return df

########################
########################


# 元データ(一行)が1ファイルづつに分散しているのを統合する関数
def row_csv2df(
		file_path_list,
		file_name_list,
		usecols=range(2,36,3),
		skiprows=13,
		nrows=1):

	"""元データが1ファイルづつに分散しているのを統合する関数
	返値は列名が元ファイル名のpandas.df
	元データの長さはすべて等しく、横一列
	pandasで読み込む
	元データのパスとファイル名は、file_selectでリスト化されていればそれを使うのが簡単
	file_path_listでpandasに読ませるファイルを絶対パスで指定
	file_name_listでRenameするときのラベル名を指定
	デフォルト設定しておけば毎回読みに行く位置を指定しなくてもよい
	"""

	# 列データをシリーズ化する関数
	def pd_read_csv(x):
		temp_df = pd.read_csv(
			x,
			usecols=usecols,
			skiprows=skiprows,
			nrows=nrows,
			encoding='shift_jis',
			header=None
		)
		return temp_df

	# 各データを読んでリスト化する
	# リストの中はseries
	# 各データは横のseriesなので転置して縦のデータにする
	temp_df_list = [pd_read_csv(file_path_list[i]).T for i in range(len(file_path_list))]

	# 各データが縦のseriesになったので縦に読み込んでData Frame化する
	# 読み込み時にindexを無視しているので、縦横ラベルが読み込んだ順列になっている
	df = pd.concat(temp_df_list, axis=1, ignore_index=True)

	# 読み込んだファイル名に列ラベルを変換
	# 列番号リスト（range(len(変換したいリスト))）と変換したいリストをzipしてdictに投げる
	columns_dict = dict(zip(range(len(file_name_list)),file_name_list))
	# 必要があれば行ラベルも同様に変更する
	index_list = list(itertools.product(
		['A', 'B', 'C'],
		['1st', '2nd', '3rd', '4th']))

	print(index_list)

	index_dict = dict(zip(usecols,index_list))

	# 列にファイル名をセットしてrename
	# dfに上書きしちゃいたのでinplace='True'
	df.rename(index_dict, columns=columns_dict, inplace='True')

	#情報書く
	print(row_csv2df.__annotations__)
	print(row_csv2df.__doc__)

	return df


```
Vue.js の props の type 指定時に String と Number の両方を許容させる

# props の type を複数指定したい・・・場合

* 公式の事例 [プロパティのバリデーション](https://jp.vuejs.org/v2/guide/components-props.html#プロパティのバリデーション)

```vue:official
<script>
  ・・・
  props: {
    // 複数の型の許容
    propB: [String, Number]
  }
  ・・・
</script>
```

既存実装などでそもそも渡される型の指定がないけれど、どうも数値とみなされる値が渡されてるっぽい・・・というときに・・・
`type` に直接 `String` や `Number` を渡すのではなく、配列に格納すると
どうも指定した型が許容されるようです。

```vue:multiple-types-props.vue
<template lang="pug">
  span {{ puroppu }}
</template>

<script>
import Vue from 'vue';
export default Vue.extend({
  props: {
    puroppu: {
      // 文字列、数字両方
      type: [String, Number],
      // 数字のみ `type: Number` と同義
      //type: [Number],
      // 文字列のみ
      //type: [String],
      default: () => 0,
    },
  },
});
</script>
```

墓穴掘ってる感あるのですが子コンポーネント側で `:value` `@input` を定義してあり
`v-model` に渡す変数の型がふらふらしているような場合には効果があるかも・・・しれません
Active Recordのhas_and_belongs_to_manyとhas_many :throughについてもくもく考える会その3【結論出す会】

### はじめに :snowman2: 
こんばんは。
昨日は体調が悪すぎてリモート勤務が終わるとともに布団に入って寝てしまいました。
1日いちqiitaをやると決めて初めて何も投稿しない夜だったので朝起きて一番最初に大変残念に感じました。
でもよく寝たらすっきりしたので今日もぼちぼち書いていこうと思います。 :pen_ballpoint: 
体調管理、気をつけていきたいです。 :bed: 

### 今日書くこと :fish: 
以前Active recordのassociationの扱いについて
`has_and_belongs_to_many` と `has_many :through` についてのソースコードを読んだのですが、
その上で感じた「２つのメソッドの違い」と、「どちらを使ったほうがいいのか」ということをもくもくと考えてこのテーマについての記事は一区切りとしたいと思います。

### 2つのメソッドの違い :tent: 
#### has_and_belongs_to_many
```rb
# Human(人間)とLanguage(言語)は多対多の関係を想定
class Human < ApplicationRecord
  has_and_belongs_to_many :languages 
end

class Language < ApplicationRecord
  has_and_belongs_to_many :humans
end
```


#### has_many :through

```rb
# Human(人間)とLanguage(言語)は多対多の関係を想定
# Resume(履歴書)によって人と言語の関連状況を管理する。
class Human < ApplicationRecord
  has_many :resumes
  has_many :languages, through: :resumes
end

class Resume < ApplicationRecord
  belongs_to :language
  belongs_to :human
end

class Language < ApplicationRecord
  has_many :resumes
  has_many :humans, through: :resumes
end

```
このモデルを見比べるとわかるように `has_and_belongs_to_many` の場合、中間モデルは存在していません。そのかわり、結合用のテーブルが存在するのですが、
「もくもく考えるかいその1」で書いたとおり、動的にクラスを作成しているという部分は、`active record` がやってくれることなのでアプリケーション上のモデルの記述では(上記に記述したとおりだが) **has_and_belongs_to_many をつけたという事実しか残らない**。
その中間クラスの名前も **明示的にモデル内の記述で表現することには成功していない。**


対して、 `has_many :through` はモデルに情報が全て明示的に残されている。
例えば、 `has_and_belongs_to_many` の場合、モデルの名前を変えたいと思った時にどうしたらいいだろうか？どのようなclass名が動的に生成されるかモデルに書かれた内容だけで想像できるだろうか？（私は個人的に一瞬おそらく答えに詰まる
#### 2つのメソッドの違いは、
①明示的に書けるかどうか
②(結合テーブルをもつか、開発者が管理するモデルの中で、結合モデルが存在するかどうか) :arrow_backward:  コードを読まずとも最初からそういう違いというのはRailsガイドにて言及されている。

### どちらを使ったほうがいいのか個人的な結論 :smiley: 
[Railsガイド#belongs-toとhas-oneのどちらを選ぶか](https://railsguides.jp/association_basics.html#belongs-to%E3%81%A8has-one%E3%81%AE%E3%81%A9%E3%81%A1%E3%82%89%E3%82%92%E9%81%B8%E3%81%B6%E3%81%8B)
にて既に言及されていることにかぶる部分もあるのですが、
自分は個人的には **has_many :through を今後「多対多」に関しては使っていこう**とこのもくもく会をやって思いました。

#### 理由としては以下
`has_and_belongs_to_many` 

- 内部で結局結合用のクラスを動的に作って処理をしていたという裏側を知ったこと(しかも明示的に書けた記憶はないままに勝手に

- id(プライマリーキーの意味としたい)をもたせる事ができないので、indexをはることができない。レコード量が多いとき時間かかりそうな予感。。

- ソフトウェアが将来どうなるか予想するのはとても難しい。少なくとも結合テーブルの属性が増える可能性は十分にある。でも `has_and_belongs_to_many` はそこを許容できない。

- 関連情報をレコードとしてわざわざ結合テーブルに入れる意味がある？という疑問
入れないといけない理由がすぐに見つけられない。

`has_many :through`
 
- モデルが明示的に書けるのやはりいい。何か結合モデルに独自の属性を追加しようとしたときもできる。( `has_and_belongs_to_many` は関連を持つモデルのidをセットでレコードとして入れていくのでこの辺りの柔軟性がない。あくまでテーブル。モデルではない ) 

- モデルなので、validation, もちろんcallbackもつかえる。


ソフトウェアは変化するもので、誰にもその将来の形は分からない。
なので、今できることは将来になるべく多くの選択肢を残すということではないかと思います。
その意味で「多対多」は `has_many :through` を選びたいと思います。 :bow:

PS: やはりOSSのコードを読むというのは勉強になることが多い。量は調整しつつも続けて習慣化したい。
コンビニの年齢認証パネルのやりとりを実装して納得してみる

定期的に話題になるコンビニの年齢認証パネル。

[年齢確認タッチパネルを拒み続ける「大人」たち　トラブル経験のコンビニは2割弱も](https://www.j-cast.com/2018/11/04342751.html)

それっぽく実装して納得してみよう。

## 年齢認証パネルがない時

```javascript
function cashierOperation(items, guest) {
  // 商品の合計を計算しつつ、酒類の商品をチェックする
  let total = 0
  let alcoholic = false
  items.forEach(item => {
    total += item.price
    if (item.alcoholic) {
      alcoholic = true
    }
  })

  // 酒類があった時の処理
  if (alcoholic) {
    // 見た目で確認してみる。this(店員)の力量が試される
    const checked = checkaApearance(guest)
    if (checked < 20) {
      // 20歳未満と判定されれば身分証を見せてもらう
      // 同期処理で5分ぐらいかかる
      const id = guest.getId()
      if (!id) {
        // 身分証を持ってなければ売らないで終了
        return false
      }
    } else {
      // ここにきた時に、実は未成年の場合非常にまずい
    }
  }
  return true
}
```

## 年齢認証パネルがある時

```javascript
function cashierOperation(items, guest) {
  // 商品の合計を計算しつつ、酒類の商品をチェックする
  let total = 0
  let alcoholic = false
  items.forEach(item => {
    total += item.price
    if (item.alcoholic) {
      alcoholic = true
    }
  })

  // 酒類があった時の処理
  if (alcoholic) {
    // 年齢認証パネルでお客さんに年齢を提示してもらう
    const checked = guest.isAdult()
    if (!checked) {
      return false
    } else {
      // ここに来た時に実は未成年だったとしても、お客さんが嘘ついたので、
      // 仕方ないのではないか
    }
  }
  return true
}
```

## 比較

個人的には、処理が単純になっているし、嘘をつく必要もないので、年齢認証パネル対応は賛成。
トラブルになるケースは、`guest.isAdult()`で、`俺が未成年に見えるか Exeption`が飛んでくるようなもの。
わざわざキャッチしたくない。
しかも、例外を飛ばしてくるのは、具象クラスなので、把握しきれない。`guest instanceof 山田太郎`みたいな判定が増えていく事になる。

理想は、全ケース`guest.getId()`の実施だが、時間がかかるので、別の問題が発生しそう。
入場時認証などで、会計前に認証済みになっているので一番いいかも。

## 結論

みなさん大人しく押しましょう。
特別扱いはめんどくさいのです。
C# × Docker で基礎学習 Part2 〜WEBアプリ編〜

[前回(コンソールアプリ編)](https://qiita.com/MasanoriIwakura/items/2dc252acf0b41350a6b2)ではDockerで実行すると文字が表示されるだけの簡単なアプリを作成しました。
今回はWEBアプリ（ASP.NET MVC）を使用して構築を行いたいと思います。

今回構築するアプリを使用して次回以降でDBとの連携も行おうと思います。
では早速、構築してみます。

# 開発環境

- macOS High Sierra
- Docker for Mac Version 18.06.1-ce-mac74
- .Net Core 2.1.4
- Visual Studio Code

# ASP.NET Core MVCの準備

前回同様、ASP.NET Coreのテンプレートを使用してコマンドラインで雛形を作成します。

```bash
# 以下のコマンドをアプリを作成したいフォルダ内で実行する
$ dotnet new mvc
```

今回も「App」フォルダ内で実行したため、以下の構成となりました。

```bash
.
├── App.csproj
├── Controllers
│   └── HomeController.cs
├── Models
│   └── ErrorViewModel.cs
├── Program.cs
├── Startup.cs
├── Views
│   ├── Home
│   │   ├── About.cshtml
│   │   ├── Contact.cshtml
│   │   └── Index.cshtml
│   ├── Shared
│   │   ├── Error.cshtml
│   │   ├── _Layout.cshtml
│   │   └── _ValidationScriptsPartial.cshtml
│   ├── _ViewImports.cshtml
│   └── _ViewStart.cshtml
├── appsettings.Development.json
├── appsettings.json
├── bundleconfig.json
├── obj
│   ※省略
└── wwwroot
    ※省略
```

実行してみます。

```bash
$ dotnet run
Hosting environment: Production
Content root path: /Users/XXXX/App
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
```

http://localhost:5000 にアクセスすると以下のページが表示されます。

<img width="1000" alt="スクリーンショット 2018-11-07 22.32.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/199056/9c27f9ff-8f00-09f7-74b7-131df3a6f42c.png">

以上でC#側のセッティングは完了です。

# Dockerの準備

Dockerfileを作成します。

```bash
FROM microsoft/dotnet:2.1-sdk
WORKDIR /app

# csprojをコピーし、依存パッケージを取得
COPY *.csproj ./
RUN dotnet restore

# プログラムのコピー
COPY . ./

# リリース資材をoutフォルダに出力
RUN dotnet publish -c Release -o out

# プログラム実行
ENTRYPOINT ["dotnet", "out/App.dll"]
```

はい。コンソールアプリの時と内容は全く同じです。

ビルドします。

```bash
# -tオプションはリポジトリ名を指定（好きな名称でOK)
$ docker build -t dotnet-mvc .
```

実行します。

```bash
$ docker run -p 8080:80 --rm dotnet-mvc
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {6fe44792-8387-4765-b497-59b96bab297e} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
```

-p オプションでコンテナのポート番号とホストのポート番号をマッピングします。
何も指定せずにPublish(公開)状態でコンテナ内で実行しているため、
コンテナ内のポート番号は80番で実行されています。

http://localhost:8080 にアクセスするとローカル実行時と同様の画面が表示されます。

<img width="1000" alt="スクリーンショット 2018-11-07 23.00.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/199056/92173a1f-da8b-8e81-2c12-8e27a5f0178c.png">

以上でC# × DockerのWEBアプリ(MVC)の構築は完了です！
次回はデータベースとの連携を行います。
MS製品だとSQL Serverですが、一般的なRDBは全て記載したいと思います。
Vue.js + Sass で scoped の style で import したファイルを deep により子コンポーネントに効かせる

# scoped な親コンポーネントの style で import したファイルを子コンポーネントに効かせたい

[Vuejsでコンポネント内のCSSを親コンポネントから変更したい場合はdeep selectorを使おう](https://qiita.com/totto357/items/f42caf4c3935cc52b4c4)などの記事にて
`deep` セレクターを使えば `scoped` 指定の親コンポーネントの `style` 定義が子コンポーネントにも反映されるとあるのでそれを参考に・・・ `/deep/` 配下で `@import` をしてしまう

```vue:red-parent
<style lang="sass" scoped>
/deep/
  @import "~/static/red.sass"
</style>
```

```vue:red-child
<template lang="pug">
  .page Red Child
    span span
</template>

<style lang="sass" scoped>
.page
  background: green
</style>
```

```sass:red.sass
span
  background: red
```

`span` には `red.sass` で定義した `background: red` が適用されており・・・

![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/116435/f1993bc4-02cd-8394-bd0e-3304fef4f2c2.jpeg)

`red-parent.vue:18` のリンク先では前述の `/deep/` 配下での `@import` が反映されていました。

![test.jpg](https://qiita-image-store.s3.amazonaws.com/0/116435/9d637839-fa77-2c01-1d78-37156ecd5a81.jpeg)

これは `lang="scss"` でもできるのかな・・・？

## SCSS でもできるもよう・・・だが・・・

[Scope Bootstrap Css in Vue - StackOverflow](https://stackoverflow.com/questions/49653931/scope-bootstrap-css-in-vue#answer-49654061)

> BUT, I gotta say, importing the entire Bootstrap CSS is a really bad practice. Try to import only and exactly what you are going to use from bootstrap-sass instead.
> 
> This solution is hacky. But it's the only way I know that can work for your use case.

ざっくりと

> ただし、 Bootstrap の CSS をまるごと import するのは bad practice だよ
> きみが本当に import したいものを bootstrap-sass のほうで限定するべきだ
> hacky だけどこれしか解決方法がないっぽい

まあせっかくコンポーネントに分けているのに分けた先でどかっとよみこむのはオカシイデスヨネ
RubyでOpenCVを動かす

OpenCVはC++やPython、Javaなどが公式でサポートされてますが、RubyでOpenCVを動かすことができる[ruby-opencv](https://github.com/ruby-opencv/ruby-opencv)を見つけたので試してみたのでメモ。  

## ruby-opencvの導入
今回はOS X El Capitanの環境で試してみました。
[OpenCVの環境構築](https://qiita.com/thomi40/items/14d796493d3b5ea1db36)を事前に行い、以下のコマンドでruby-opencvをインストールします。  

```sh
gem install ruby-opencv -- --with-opencv-dir=/path/to/opencvdir
```

## ruby-opencvの実行

グレースケール変換と二値化処理で動作を確認してみます。

```ruby
require 'opencv'
include OpenCV

src = CvMat.load('Sailboat.bmp')

gray = src.BGR2GRAY
bin = gray.threshold(128, 255, :binary)

GUI::Window.new('src').show(src)
GUI::Window.new('gray').show(gray)
GUI::Window.new('bin').show(bin)

GUI::wait_key
```

## 実行結果
<img width="861" alt="ruby_opencv_sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/134341/e6e527ed-b83a-e242-3d68-ca90ab9da753.png">

[ドキュメント](https://www.rubydoc.info/gems/ruby-opencv/)を見る限り他にもOpenCVの様々な機能が使えるとのことなので、気になる方はぜひ試してみてください。

## 参考記事
RubyとOpenCVで始める画像処理
https://techblog.gmo-ap.jp/2016/11/28/ruby%E3%81%A8opencv%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86/
Nuxt.jsでVueコンポーネントでもVuexでもdate-fnsを使う

# はじめに

[Nuxt.jsのvuexでMoment.jsを利用する](https://qiita.com/idani/items/096284a6715c694f0988)を作成したあとに、Vue.jsのslackコミュに投げました。

そしたら、時代は、[moment.js](https://momentjs.com/)ではなくて、[date-fns](https://date-fns.org/)ということを教えていただきました。

そしたら同様にNuxt.jsで使いたいのでプラグインを作っていきます。

# date-fnsの使い方

## 書式整形

日付の書式変更は、formatを使うらしい。
https://date-fns.org/v1.29.0/docs/format

以下のような感じで使います。

```js
import format from 'date-fns/format'
import jaLocale from 'date-fns/locale/ja'
const result = format(
  new Date(2014, 6, 2),
  'YYYY/MM/DD HH:mm:ss',
  {locale: jaLocale}
)
//=> '2014/02/11 00:00:00'
```

## Date型変換

日付の文字列などをDate型に変換する場合は、parseを使うらしい。
https://date-fns.org/v1.29.0/docs/parse

```javascript
import parse from 'date-fns/parse'
// Convert string '2014-02-11T11:30:30' to date:
const result = parse('2014-02-11T11:30:30')
//=> Tue Feb 11 2014 11:30:30
```

# Nuxt.jsに組み込む

Moment.jsのプラグインを作成したように、date-fnsのformatのプラグインを作成する

```plugins/date_format.js
import format from 'date-fns/format'
import ja from 'date-fns/locale/ja'
import parse from 'date-fns/parse'

export default ({ app }, inject) => {
  inject('date_format', (date = new Date(), formatStr) => {
    return format(parse(date), formatStr, { locale: ja })
  })
}

```

組み込みます。

```nuxt.config.js
module.exports = {
・・・
plugins: [
  '@/plugins/vuetify',
  '@/plugins/axios',
  '@/plugins/date_format' ＜ーこれを追記
],
・・・
}
```

# 使い方

## Vuex

```store/posts.js
export const actions = {
  async publishPost({ commit }, { payload }) {
    const created_at = this.$date_format(new Date())
  }
}
```
## Vueコンポーネント

```js
  computed: {
    showPosts() {
      return this.posts.map(post => {
        const tmp = { ...post }
        tmp.created_at = this.$date_format(
          post.created_at,
          'YYYY/MM/DD HH:mm:ss'
        )
        return tmp
      })
    }
  }
```

ちなみに、サイズも41KiBほど小さくなりました。

```console
Moment.js：　6421c4c6c45adabb8508.js    **419 KiB**       9  [emitted]  [big]  vendors.app
date_fns：   63ab1334cce23066f889.js    **378 KiB**       9  [emitted]  [big]  vendors.app
```

# 参考文献

* [npm ライブラリの date-fns で文字列 '2018-09-01 00:00:00' と '2018-09-18 00:00:00' が何日離れているか計算する](https://qiita.com/superyusuke/items/5c851c579886a06b79b8)
* [日付処理ライブラリ「date-fns」でプレミアムフライデー！](https://qiita.com/garakuta/items/6f5f3feeb4dd376850af)
【Rails】deviseを導入してみる

#deviseとは
Rubyのgem(ライブラリ)の1つ。
ログイン機能の実装を簡単にしてくれるgem
今回私はFacebookAPIを使用したログインを実装するために使ってみた。

#使ってみる
実際にdeviseを使用してログイン周りのページを作成していく
## インストール
Gemfileに追記

```ruby:Gemfile
gem 'devise'
```
bundle install実行

```
$ bundle install
```
依存するファイルも一緒に作成

```
$ rails g devise:install
```

## Usersモデルを作成

```
$ rails g devise user
```
マイグレーションファイルを見てみると、
emailとパスワード用のカラムは自動で生成されるようになっているので、
他に追加したいものがあればここでマイグレーションファイルに追記。

マイグレーションを実行。

```
$ rake db:migrate
```
ここまででとりあえず<a href="http://localhost:3000/users/sign_in">http://localhost:3000/users/sign_in</a>を開くと
最低限のログインページは完成する。

しかし、ビューなどをカスタマイズしたい場合は加えて次項以降の作業も必要。

## deviseに対応したビューの作成
コマンドで一発

```
$ rails g devise:views users
```
ビューをカスタマイズしたい場合はここで生成されたファイルを編集すれば良い。

## deviseに対応したコントローラの作成
同様にターミナルでコマンドを実行

```
$ rails g devise:controllers users
```
今回自分は会員登録後のリダイレクト先をユーザのプロフィール画面に変更したかったので、以下のように修正。

```app/controllers/users/registrations_controller.rb
# プロフィール画面用のアクションを追加
def detail
  @user = User.find_by(id: params[:id])
end

# protected

# ここのコメントアウトを外してリダイレクト先を指定
# ルートパス名でも良い
# The path used after sign up.
def after_sign_up_path_for(resource)
  "/user/#{current_user.id}"
end
```
ログイン後のリダイレクト先もついでに変更してみる。

```ruby:application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  # このアクションを追加
  def after_sign_in_path_for(resource)
    "/user/#{current_user.id}"
  end
  
  protected

  # 入力フォームからアカウント名情報をDBに保存するために追加
  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
  end
end

```

## ルーティングの編集
routes.rbに以下の記述を追加。

```ruby:route.rb
devise_for :users, :controllers => {
  :registrations => 'users/registrations',
  :sessions => 'users/sessions'   
} 

devise_scope :user do
  get "user/:id", :to => "users/registrations#detail"
  get "signup", :to => "users/registrations#new"
  get "login", :to => "users/sessions#new"
  get "logout", :to => "users/sessions#destroy"
end
```

## ビューファイルと対応するページ
|ファイルパス|機能|
|:-----------------|:------------------|
|sessions/new.html.erb|ログイン画面|
|registrations/new.html.erb|ユーザ登録画面|
|registrations/edit.html.erb|プロフィール情報変更画面|
|passwords/new.html.erb|メール送信画面(パスワード変更用)|
|passwords/edit.html.erb|パスワード変更画面|
|confirmations/new.html.erb|メールによる認証を行う画面|
|unlocks/new.html.erb|アカウントのアンロック画面|

## 加えて
ログインユーザのIDは、
**current_user.id** で取得することができる。
また、ユーザがログイン済みかどうかは、
**user_signed_in?** によってtrueかfalseを得ることができる。
H8/3069でuClinuxを動かしてみる

組込みLinuxを勉強するため「はじめる組込みLinux」の本をやってみた
将来的には任意のマイコンにLinuxを移植できるようにしたい
出来合いのraspbian&armの組み合わせをやってても退屈だから
人が作ったもの(raspbian.img)をやって(raspberrypiを動かすこと)楽しいですか

以下は今後内容を充実させる予定である
条件
Virtualbox、windows10(64bit,4096MB)、ubuntu12.04(32bit版)
①uclinuxのカーネルソースをダウンロードする
②カーネルソースを展開する
③開発ツールをダウンロードし展開する
④gcc類にパスを通す
⑤make menuconfig
→ターゲットボードのベンダーと評価ボードを設定する
　→vendorをakizukiにproductsをAE3068にする
→カーネル/ライブラリ/デフォルトセレクションを設定する
　→カーネルバージョンをlinux-2.4.xにlibcバージョンをuClibcにする
　→デフォルトオールセッティングとカスタマイズオールセッティングにチェックする
　→exitを二回する
　→ネットワークオプションのTCP/IP networkingのチェックを外す
　→exitを二回する
　→yesで終わる
⑦$ make dep
⑧$ make
⑨uclinux-distの中のimageフォルダの中のaki3068net-image.binをTFTPかXMODEMでH8/3069に転送する(当方はwindows用のTFTPDソフトの「Tftpd64 by Ph.Jounin」を使用し転送した
⑩exec -c console=ttySC1,38400n81
⑪起動される
以下はログ

RedBoot> load -r -v -m TFTP -b 0x400000 aki3068net-image.bin
/
Raw file loaded 0x00400000-0x004b7c63, assumed entry at 0x00400000
RedBoot> exec -c console=ttySC1,38400n81
Now booting linux kernel:
 Entry Address 0x00400000
 Cmdline : console=ttySC1,38400n81
Linux version 2.4.31-uc0 (a@localhost) (gcc version 3.4.3) #2 2018? 11ｷ・7ﾆ・ｿ袁ﾋﾆ・13:07:57 JST

uClinux H8/300H
Target Hardware: AE-3068
H8/300 series support by Yoshinori Sato <ysato@users.sourceforge.jp>
Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne
On node 0 totalpages: 1536
zone(0): 0 pages.
zone(1): 1536 pages.
zone(2): 0 pages.
Kernel command line: console=ttySC1,38400n81
virtual vector at 0x00fffd20
Calibrating delay loop... 3.26 BogoMIPS
Memory available: 1116k/1432k RAM, 0k/0k ROM (442k kernel code, 167k data)
Dentry cache hash table entries: 1024 (order: 1, 8192 bytes)
Inode cache hash table entries: 512 (order: 0, 4096 bytes)
Mount cache hash table entries: 512 (order: 0, 4096 bytes)
Buffer cache hash table entries: 1024 (order: 0, 4096 bytes)
Page-cache hash table entries: 2048 (order: 1, 8192 bytes)
POSIX conformance testing by UNIFIX
Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039
Initializing RT netlink socket
Starting kswapd
SuperH SCI(F) driver initialized
ttySC0 at 0x00ffffb0 is a SCI
ttySC1 at 0x00ffffb8 is a SCI
ttySC2 at 0x00ffffc0 is a SCI
ne.c:v1.10 9/23/94 Donald Becker (becker@scyld.com)
Last modified Nov 1, 2000 by Paul Gortmaker
NE*000 ethercard probe at 0x200000: 00 02 cb 03 d7 00
eth0: NE1000 found at 0x200000, using IRQ 17.
Blkmem copyright 1998,1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0: 499FE4-4D43E3 [VIRTUAL 499FE4-4D43E3] (RO) <ROMFS>
VFS: Mounted root (romfs filesystem) readonly.
Freeing unused kernel memory: 20k freed (0x478000 - 0x47c000)

Shell invoked to run file: /etc/rc
Command: hostname AE3068
Command: mount -t proc proc /proc
Command: cat /etc/motd
Welcome to
          ____ _  _
         /  __| ||_|
    _   _| |  | | _ ____  _   _  _  _
   | | | | |  | || |  _ \| | | |\ \/ /
   | |_| | |__| || | | | | |_| |/    \
   |  ___\____|_||_|_| |_|\____|\_/\_/
   | |

![uclinux.jpg](https://qiita-image-store.s3.amazonaws.com/0/190551/3818d398-f515-9b38-7bd6-63f1b59c1c2a.jpeg)
備忘録　GUIから選択したファイル名を取得するモジュール

①以下のコードをmy_module.pyに記述する
②使いたいコードをmain.pyに書いて使う

 ```python:main.py
import my_module as mym
mym.file_select()
 ```

```python:my_module.py

# 指定したファイルのFullパスとファイル名をリストにして返す
def file_select(
		file_type:str='*.bmp;*.jpg;*.tif;*tiff;*,png; *.csv; *.dat; *.avi',
		file_path:str='C:/Users/username/Desktop/',
		message:str='ファイル選択ダイアログ'):
	"""
	# 指定したファイルのFullパスとファイル名をリストにして返す
	# 引数は
	# 	第一　ファイル種類限定　file_type='*.bmp;*.jpg;*.tif;*tiff;*,png'
	# 	第二　ホームフォルダ指定　file_path=
	# 返値は①Fullパスのリスト、②ファイル名のリスト
	# アンパックするなら左辺を  file_full_path, file_name = file_select(xxxx)　と書く
	"""
	root = tkinter.Tk()
	root.withdraw()
	fTyp = [("", file_type)]
	iDir = os.path.abspath(file_path.replace('/', os.sep))
	tkinter.messagebox.showinfo(message, '処理ファイルを選択してください！')
	file = tkinter.filedialog.askopenfilenames(filetypes=fTyp, initialdir=iDir)

	# fileは取得したものがタプルになっているのでリストに変換
	file_list = list(file)

	# パスからファイル名を取得
	file_name =[file_list[i].rsplit('/', 1)[1][0:-4] for i in range(len(file_list))]

	# 確認のためファイル名を表示
	tkinter.messagebox.showinfo(message, file_name)

	# 情報書く
	print(file_select.__annotations__)
	print(file_select.__doc__)

	return [file_list, file_name]

```
Ubuntu 18.04.1でBitZenyマイニング

Ubuntu 18.04.1でBitZenyをマイニングしたときの備忘録です。
##環境
####OS
Ubuntu 18.04.1 LTS

##Gitのインストール
Gitのインストールをします。

```
sudo apt-get install git
```


##BitZenyマイナーのダウンロード
マイニングをするために、マイナーをダウンロードします。

```
git clone https://github.com/bitzeny/cpuminer.git cpuminer
```


#####移動
ダウンロードが終わったら、マイナーをダウンロードしたディレクトリに移動します。

```
cd cpuminer
```


##必要なパッケージのインストール
```
sudo apt-get install libcurl4-openssl-dev gcc-mingw-w64 automake gcc make
```
####インストールに失敗したら
OSにリポジトリが追加されていない可能性がありますので、リポジトリを追加します。

- Universeの追加

```
sudo apt-add-repository universe
```

- Multiverseの追加

```
sudo apt-add-repository multiverse
```

##マイナーのインストール
```
./autogen.sh

./configure CFLAGS="-O3 -march=native -funroll-loops -fomit-frame-pointer"

make
```

##マイニング
例として、Lapoolというプールでマイニングしてみます。

```
./minerd -a yescrypt -o stratum+tcp://jp.lapool.me:3014 -u ユーザ名.ワーカー名 -p パスワード
```
######難易度(Difficulty)
ちなみに、LapoolでBitZenyをマイニングする際は難易度をIPの後ろのポートによって設定することができます。マイニングするCPUに適した難易度を設定します。

######一覧表
|アドレス|難易度|説明|
|:--|--:|:--:|
|stratum+tcp://jp.lapool.me:3013|0.000001|古いCPU
|stratum+tcp://jp.lapool.me:3113|0.0001|古いCPU
|stratum+tcp://jp.lapool.me:3014|0.1|新しいCPU
|stratum+tcp://jp.lapool.me:3114|1|新しいCPU

##シェルスクリプトにする
その都度コマンドを打っていては面倒くさいので、スクリプトにします。

#####空のスクリプトを作成
hogehogeの部分は任意の名前をつけていただいて大丈夫です。

```
touch hogehoge.sh
```

#####スクリプト作成
viで編集

```
vi hogehoge.sh
```
書き込む

```hogehoge.sh
./minerd -a yescrypt -o stratum+tcp://jp.lapool.me:3014 -u ユーザ名.ワーカー名 -p パスワード
```
実行

```
sh hogehoge.sh
```



---
#####引用
https://bombox.net/cryptocurrency/bitzeny-on-ubuntu/
https://sqlazure.jp/r/ubuntu/857/
https://lapool.me/bitzeny/index.php
EclipseにRuby On Railsのプラグインを入れようとして詰まった話

Ruby On Railsの開発を始めるにあたってどうにも良さげなIDEが見つからなく、しかたなくEclipseにRedRailsプラグインをインストールしようとして、引っかかった話。

# なんで？(殺意)
色々なサイトで紹介されている以下の方法
1. eclipseの「ヘルプ」→「新規ソフトウェアのインストールに**http://download.aptana.com/studio3/plugin/install**を入力
2. その後表示されるAptena Studio3をインストール

**そもそも2のAptena Studio3が表示されない。(憤怒)**

AptenaStudioのWebサイトが打ち捨てれていた。
ダメみたいですね...。

# た い さ く
上記のURLではなく、以下のURLを入力する。
**http://preview.appcelerator.com/aptana/studio3/plugin/update/rc/**
AUTOSAR（Adaptive Platform 18.10）を読んでいく（1）

# きっかけ
今まで特に関わったことはなかったが、なぜか自動車関連業務に携わることになった。
自動車業界では、どうやらAUTOSAR仕様が標準らしく、
つい先日最新版（Adaptive Platform 18.10）が出た、
とのことで、これを契機として勉強していく。

# 仕様書の入手元
[AUTOSAR公式](https://www.autosar.org/)の下方にあるリンクから入手可能。
Classic PlatformとかAdaptive Platformとか色々な仕様があるようだが、
今回は勉強対象のAdaptive Platformのリンク先にあるzipファイル一式を取得＋解凍

# 解答したファイルを見てみる
本文書を残している段階では、以下のディレクトリが存在。
AUTOSARに関してはズブのド素人なので、まずは概要が知りたい。
ということで、概要がわかりそうなGeneralから攻めることに。

- AdaptiveFoundaton
- AdaptiveServices
- General
- MethodlogyAndManifests
- ReleaseDocumentation

# Generalディレクトリの中身
- AUTOSAR_EXP_AdaptivePlatformInterfacesGuidelines
- AUTOSAR_EXP_ParallelProcessingGuidelines
- AUTOSAR_EXP_PlatformDesign
- AUTOSAR_EXP_SafetyOverview
- AUTOSAR_RS_CPP14Guidelines
- AUTOSAR_RS_General
- AUTOSAR_SWS_CoreTypes
- AUTOSAR_SWS_General
- AUTOSAR_TR_AdaptivePlatformSystemTests
- AUTOSAR_TR_FunctionalClusterShortnames

とまあ、これまたたくさんのPDFファイルが見つかったので、
どのPDFから攻めるかを考える。
その前に、ファイル名のプリフィックス（と思われる）EXP,RS,SWS,TRが気になったので
何を示すのか調べることに。PDF内に情報ないかな、と思ってとりあえず、
AUTOSAR_EXP_AdaptivePlatformInterfacesGuidehiralines
を開き、EXPで検索。
5章のReferenceに
> Explanations of Adaptive Platform Design, AUTOSAR_EXP_PlatformDesign.pdf.

とあったので、Explanation（説明）だろう、と推察。

同様の方法で調べたり、ファイル開いた時のタイトル見たりすると、
- Main Requirements → AUTOSAR_RS_Main
- General Specification of Adaptive Platform → AUTOSAR_SWS_General
ということから、RSは「Requirements」,SWSは「SoftWare Specification」
であろうと推察。TRはよくわからなかった（Technical Referenceかな？）

# 最初に見るPDFの選別
ファイル名がわかったところで、どこから読もうかを考える。
仕様が見たい（Requirementsはいらない）ので、以下が候補。

- AUTOSAR_EXP_PlatformDesign
- AUTOSAR_SWS_General

まずは、後者から見てみることに。

# AUTOSAR_SWS_General
開いてみると、10ページくらいしかない。なんとも拍子抜け。
しかも、非機能要求（Non-functional Requirements）しか書いていない。
内容は以下の2つ。
1. #include文は``` #include "ara/fc/header.h" ```のように書くこと。
　（つまり、Linuxみたいに、きちんとディレクトリ切ってファイル分けしろ、といっている）
2. インクルードガードを使って、ヘッダファイルが複数回インクルードされないようにしろ


---
事前準備諸々に戸惑ったりしたので今日はここまで。
次回AUTOSAR_EXP_PlatformDesignを見る予定。
定期的に更新していきたい。
Homebrewをインストールする

# 環境
MacOS 10.12以上

# インストール
[Homebrewのサイト](https://brew.sh/index_ja)に書かれているインストールコマンドをターミナルに貼り付けて実行する

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

Command Line Toolがインストールされていない場合はインストーラが起動するので一緒にインストールする

MojavaでCommand Line Toolインストールに失敗する場合はApple DeveloperからCommand Line Tool(MacOS 10.14)をダウンロードしてインストールする

```brew doctor```を実行して、インストールを確認する

``` bash
$ brew doctor
```

# アンインストール
アンインストールコマンドをターミナルに貼り付けて実行する

```
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
```
iPhoneでGmailを利用してテキスト形式のメールを送る

# 経緯
1. iPhoneのGmailアプリからメールを送信するとHTML形式になってしまう
1. iPhoneのGmailアプリではPCのように、プレーンテキストモードの選択が行えない
1. HTML形式はセキュリティ上もマナー上も、よろしく思われない
1. iPhoneからGmailを利用してテキスト形式でメールを送る方法を模索

# 手順
1. Safariを起動する
2. Gmailのログイン画面を表示する
3. 右上のURLバーの更新ボタンを長押しする
4. "デスクトップ用サイトを表示"を押す
5. ログインを行う
6. PCで開いたときと同様のGmail画面が起動される
7. あとは、メールの新規作成や返信でプレーンテキストを選択してメールを送ればOK
リダイレクト先のURLと、設定したいURLが合致するか確認する.py

# リダイレクトのテスト
## 概要
現URLへアクセスし、リダイレクト先のリストと、要望されているリダイレクト先のリストを突き合わせて、正しいか判別します。

## 目的
ウェブページのリダイレクト変更テストを行う際、スプレッドシートで確認できますが、10や100にもなると、作業量は増え生産性は落ちてしまいます。
そこで、Pythonさんに活躍してもらおうと、勉強を兼ねて作成しました。

## 成果物

```python
# -*- coding: utf-8 -*-
import requests

#アクセスするURL
urls = ["https://qiita.com/logout/"
,"https://yahoo.co.jp"]

#＊リダイレクト先の正しいURL＊（架空）
reurls =['https://qiita.com/mypage/', 
'https://www.yahoo.co.jp/']

#リダイレクト時のURLを格納するリスト
newurl = []

def match():
    for url in urls:
        r = requests.get(url) 
        # ステータスを格納
        status = r.status_code
        # 新しいURLを格納
        redirect_url = r.url
        # リダイレクトの履歴を格納
        redirect_status = r.history
        # テストのため出力
        print(status)
        print(redirect_url)
        print(redirect_status)
        # newurl のリストに入れる
        newurl.append(redirect_url)
   
    if reurls == newurl:
        print("リダイレクトは完全一致")
    else:
        for i in range(len(reurls)):
            if reurls[i] != newurl[i]:
                print("問題は " + urls[i] + " です")

if __name__ == '__main__':
    match()
```

これを実行した場合、
```問題は https://qiita.com/logout/ です ```
と表示されます。
対象となるURLが増えたときには有効なスクリプトかと思います。

---
もっときれいな書き方があるんだろうな、と思いながらも、
割とすんなりできたのでとても嬉しいです。
p2 物理エンジンではまった


```ts
const b = new p2.Body({position:[x, y]});
b.addShape(new p2.Box({width: w, height: 1}));
```

この場合のBodyの衝突範囲は下記になる

```json
{
 left:  x - w / 2,
 top:   y - h / 2,
 right: x + w / 2,
 bottom: y + h / 2
}
```

下記だと勘違いしていた

```json
{
 left:  x,
 top:   y,
 right: x + w,
 bottom: y + h
}
```
numpy.dot の挙動

numpy.dot の挙動で直感通りの動きとならない場合がありました。よくよく調べると、与える配列の次元数ごとに異なる挙動をする仕様になっていたので、ケースごとにどうなるか調べてみました。

なお、公式ドキュメントにケースごとにどのような挙動になるか書かれています。
https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html

以下は、実際に例を出しての説明になります。

### A, B が 1 次元配列の場合は、内積になる

A、B として次の例を考えます。

```math
A = (1, 2, 3)
```

```math
B = (2, 4, 6)
```

この場合、次の式の計算を行います。

```math
A_{1} B_{1} + A_{2} B_{2} + A_{3} B_{3}
```

よって、A、B の要素数が異なるとエラーになります。
コードの例は次の通りです。

```python
>>> A = np.array([1, 2, 3])
>>> B = np.array([2, 4, 6])
>>> np.dot(A, B)
28
```

### A, B が 2 次元配列の場合は、行列積になる

A、B として次の例を考えます。

```math
A = 
\left(
\begin{matrix}
1 & 1 \\
2 & 2 \\
3 & 3
\end{matrix}
\right)
```

```math
B = 
\left(
\begin{matrix}
1 & 2 \\
3 & 4
\end{matrix}
\right)
```

この場合、次の式の計算を行います。

```math
\left(
\begin{matrix}
A_{11} B_{11} + A_{12} B_{21} & A_{11} B_{12} + A_{12} B_{22} \\
A_{21} B_{11} + A_{22} B_{21} & A_{21} B_{12} + A_{22} B_{22} \\
A_{31} B_{11} + A_{32} B_{21} & A_{31} B_{12} + A_{32} B_{22}
\end{matrix}
\right)
```

よって、A の列数、B の行数が一致している必要があります。
コードの例は次の通りです。

```python
>>> A = np.array([[1,1], [2,2], [3,3]])
>>> B = np.array([[1, 2], [3, 4]])
>>> np.dot(A, B)
array([[ 4,  6],
       [ 8, 12],
       [12, 18]])

# 次の表記でも同じことができます。
>>> A @ B
array([[ 4,  6],
       [ 8, 12],
       [12, 18]])
```

### A, B のどちらかがスカラの場合は、掛け算となる

A、B として次の例を考えます。

```math
A = 
\left(
\begin{matrix}
1 & 1 \\
2 & 2 \\
3 & 3
\end{matrix}
\right)
```

```math
B = 5
```

この場合、次の式の計算を行います。

```math
\left(
\begin{matrix}
A_{11} B & A_{12} B \\
A_{21} B & A_{22} B \\
A_{31} B & A_{32} B
\end{matrix}
\right)
```

コードの例は次の通りです。

```python
>>> A = np.array([[1,1], [2,2], [3,3]])
>>> np.dot(A, 5)
array([[ 5,  5],
       [10, 10],
       [15, 15]])

# 次の表記でも同じことができます。
>>> A * 5
array([[ 5,  5],
       [10, 10],
       [15, 15]])
```


### A が 2 次元配列、B が 1 次元配列の場合

A、B として次の例を考えます。

```math
A = 
\left(
\begin{matrix}
1 & 1 \\
2 & 2 \\
3 & 3
\end{matrix}
\right)
```

```math
B =
\left(
\begin{matrix}
7 & 8
\end{matrix}
\right)
```

この場合、次の式の計算を行います。

```math
\left(
\begin{matrix}
A_{11} B_{1} + A_{12} B_{2} & A_{21} B_{1} + A_{22} B_{2} & A_{31} B_{1} + A_{32} B_{2}
\end{matrix}
\right)
```

よって、A の列数、B の要素数が一致している必要があります。
コードの例は次の通りです。

```python
>>> A = np.array([[1,1], [2,2], [3,3]])
>>> B = np.array([7, 8])
>>> np.dot(A, B)
array([15, 30, 45])
```
Pandasで『Install xlrd >= 0.9.0 for Excel support』の解決方法【Python】

# _ImportError: Install xlrd >= 0.9.0 for Excel support_

## エラーについて

Pandas にて Excel ファイル（_.xls_）などを読み込む際に、

```python
import pandas as pd

pd.read_excel("file.xls")
```

以下のように、`xlrd`が必要であるとimportエラーが出ることがある。

```python
ImportError: Install xlrd >= 0.9.0 for Excel support
```


## 解決方法

単純に`xlrd`をインストールすると解消される。

```bash
pip install xlrd
```

（pip を pip3 で読み出している環境では`pip3 install xlrd`とすれば良い。）


## 補足： **`xlrd`**とは

[公式ページ](https://pypi.org/project/xlrd/)では、

> Library for developers to extract data from Microsoft Excel (tm) spreadsheet files
> > Excel ファイルからデータを抽出するためのライブラリ

と説明されている。
Redmineのメール通知に表示されるフィールドをカスタマイズする

ずーっと悩んでましたが、結局のところ「ソースを直接修正する」のがベストだという結論に達したので。

「[Redmineをインストールしたディレクトリ]/apps/Redmine/htdocs/app/helpers」ディレクトリ内の「issues_helper.rb」に記述されている「email_issue_attributes」関数を修正することで、メール通知の文面に表示されるフィールドをカスタマイズできます。

## 標準フィールドの表示項目を編集する

関数の2行目、`(author status priority assigned_to category fixed_version)`が、表示される標準フィールドを列挙した部分です。ここに必要なフィールドを追記し、不要なフィールドがあれば削除します。

## カスタムフィールドを表示しないようにする

関数の後半、`issue.visible_custom_field_values(user).each do |value|`から`end`までが、カスタムフィールドを順に表示させる部分です。カスタムフィールドの表示が不要なら、これをすべてコメントアウトしましょう。

## こんな感じにしてみてはどうでしょう

```
def email_issue_attributes(issue, user, html)
  items = []
  %w(author status priority assigned_to category fixed_version start_date due_date).each do |attribute|
    unless issue.disabled_core_fields.include?(attribute+"_id")
      if html
        items << content_tag('strong', "#{l("field_#{attribute}")}: ") + (issue.send attribute)
      else
        items << "#{l("field_#{attribute}")}: #{issue.send attribute}"
      end
    end
  end
# issue.visible_custom_field_values(user).each do |value|
#   if html
#     items << content_tag('strong', "#{value.custom_field.name}: ") + show_value(value, false)
#   else
#     items << "#{value.custom_field.name}: #{show_value(value, false)}"
#   end
# end
  items
end
```

こうすると、文面に開始日(`start_date`)と期日(`due_date`)が表示され、すべてのカスタムフィールドが表示されなくなります。文面スッキリ。

ほんとはいいプラグインがあればいいんですが。
urllib3とcertifiを使って、PDFをダウンロードする

##背景
大量にPDFをダウンロードする必要が出て、マクロを組んだが、windows10に移行したことにより（？）うまく動かなくなった。会社のプロキシなどの影響でこの通りに動かないかもしれないが、家の環境でPDFをダウンロードできることを確認する。

##urllib3のみで画像をダウンロード

```python

import urllib3

download_url = 'https://s3-ap-northeast-1.amazonaws.com/samurai-blog-media/blog/wp-content/uploads/2017/08/python-640x366.jpg'
request_methods = urllib3.PoolManager()
response = request_methods.request('GET', download_url)
f = open('result.jpg', 'wb')
f.write(response.data)
f.close()
```



これを実行すると、以下の画像がダウンロードされる
![python-640x366.jpg](https://qiita-image-store.s3.amazonaws.com/0/212901/7e7e4206-9438-c0f0-570c-ba0334ac986d.jpeg)

ただし、以下の警告文が出る。
> C:\Users\ユーザー名\Anaconda3\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  InsecureRequestWarning)

 証明書の内容の確認（certificate verification）を追加することを強く要望されている。リンク上でコードを確認して、次はPDFをダウンロードした。PDFは適当。

##PDFをダウンロード


```python

#追加
import certifi
import urllib3

#https://~~でも問題ない
download_url = 'http://www.nistep.go.jp/wp/wp-content/uploads/NISTEP-STT134J-2.pdf'

#変更点
request_methods = urllib3.PoolManager(cert_reqs='CERT_REQUIRED',
                          ca_certs=certifi.where())
response = request_methods.request('GET', download_url)
f = open('result.pdf', 'wb')
f.write(response.data)
f.close()
```
これで動くようになる。これでも動かない場合は、

```python
pip install urllib3[secure]
```
urllib3[secure]をpipでinstallする必要がある。私はこれでPDFをダウンロードできた。

PDFはダウンロードできるのは確認できたが、私が欲しいデータはIDとパスワードを入力しないと入れないサイトなので、それをpythonで突破しないといけない。次はそれを試していこうと思う。そうすれば、どんなサイトのPDFもダウンロードできるはずだ。


##追記
やはり会社のプロキシが邪魔をしたため、会社の環境だと上記のコードでは落とすことができなかった。
そこで、urllib3でプロキシ認証を通す。
[python urllib3 を使った通信で認証プロキシを通す](https://qiita.com/shinno21/items/4798ee7f1e41811ae2a4)が非常に参考になった。

```python

import certifi
import urllib3

#コロンで区切って、ユーザIDとパスワードを記入。ID:password
PROXY_BASIC_AUTH = "id:password"

#プロキシのURLとport
PROXY_URL = "http://proxy:port"

#https://~~でも問題ない
download_url = 'http://www.nistep.go.jp/wp/wp-content/uploads/NISTEP-STT134J-2.pdf'

headers = urllib3.util.make_headers(proxy_basic_auth=PROXY_BASIC_AUTH)

http = urllib3.ProxyManager(proxy_url=PROXY_URL,
                            proxy_headers=headers,
                            cert_reqs='CERT_REQUIRED',
                            ca_certs=certifi.where())

#ダウンロードの準備
response = http.request('GET', download_url)

#ファイル名を決める。
f = open('result3.pdf', 'wb')

#ファイルの保存
f.write(response.data)
f.close()
```
目的のユーザIDとパスワードが必要なサイトのPDFをこれでダウンロードしようとしたが、やはりだめだった。pythonでそのサイトにアクセスできるように改造する。
Dockerの実装確認 - cgroups編 -

![Q9jiI1pL_400x400.jpg](https://qiita-image-store.s3.amazonaws.com/0/258841/38933ea0-9cf8-7c12-75ad-bb99889a0850.jpeg)

# 背景

カーネルにはコンテナという機能はなく、
Dockerはカーネルの機能の組み合わせで実装されている。
その中でも主要なものが「cgroups」と「namespace」である。

今回はcgroupsについて調べてみたことを記載します。

# cgroupsって？

cgroupsは control groups の略でタスクをグループ化したり、
そのグループ内のタスクに対して様々なリソース制御を行うための仕組みです。
namespaceとの違いは名前空間の制御ではなくCPUやメモリといった物理的なリソースを
制御する機能である点。

具体的には各コンテナに対するCPU時間の割り当て優先度や、メモリ使用量、
データ転送に伴う帯域などを調整している。

# 大正義wikipedia様より引用

ちょっと正確に知りたい方用へcgroupsについて引用

> cgroups (control groups) とは、プロセスグループのリソース(CPU、メモリ、ディスクI/Oなど)の利用を制限・隔離するLinuxカーネルの機能。"process containers" という名称で Rohit Seth が2006年9月から開発を開始し[1]、2007年に cgroups と名称変更され、2008年1月に Linux カーネル 2.6.24 にマージされた[2]。それ以来、多くの機能とコントローラが追加された。

# 実際に制御可能なリソース

/sys/fs/cgroup 以下に仮想的なファイルシステムとしてのインタフェースが提供されています.
ここでファイル/ディレクトリ操作をすることで様々なリソース制御を行います。

``` bash
$ ls -l /sys/fs/cgroup/
total 0
dr-xr-xr-x 6 root root  0 Nov  3  2016 blkio
lrwxrwxrwx 1 root root 11 Nov  3  2016 cpu -> cpu,cpuacct
lrwxrwxrwx 1 root root 11 Nov  3  2016 cpuacct -> cpu,cpuacct
dr-xr-xr-x 6 root root  0 Nov  3  2016 cpu,cpuacct
dr-xr-xr-x 3 root root  0 Nov  3  2016 cpuset
dr-xr-xr-x 6 root root  0 Nov  3  2016 devices
dr-xr-xr-x 3 root root  0 Nov  3  2016 freezer
dr-xr-xr-x 6 root root  0 Nov  3  2016 memory
dr-xr-xr-x 3 root root  0 Nov  3  2016 net_cls
dr-xr-xr-x 6 root root  0 Nov  3  2016 systemd
```

これらはサブシステムと呼ばれています。
それぞれについては下記をご参照ください。

|サブシステム|概要|
----|----
|blkio|ブロックデバイスの入出力
|cpu|CPUリソースの割り当て・制限
|cpuacct|タスクが消費するCPU時間をレポート
|cpuset|グループへのCPU，メモリノードの割り当て
|devices|デバイスへのアクセス制限
|freezer|グループに属するプロセスの一時停止/再開
|hugetlb|cgroupからのhugetlbの使用
|memory|タスクが消費するメモリリソースのレポートと制限
|perf_event|cgroup単位でのperfツールの使用

# cgroupの実装

実際にコードを読もう！って思ったのですが特にやる気が起きませんでしたので割愛
読むとしたら

* kernel/cgroup/cgroup.c
* security/device_cgroup.c
* mm/hugetlb_cgroup.c

あたりでしょうか(詳しい方教えてください)

# ちょっとだけ詳しく

Linux のプロセスは、task_struct 構造体というデータ構造で表現されている。
その構造体のメンバである「css_set」がcgroupを管理するための構造体。

``` c:include/linux/sched.h
#ifdef CONFIG_CGROUPS
  /* Control Group info protected by css_set_lock */
  struct css_set __rcu *cgroups;
  /* cg_list protected by css_set_lock and tsk->alloc_lock */
  struct list_head cg_list;
#endif
```

この構造体を追っていけば処理は見えそうです。(追いませんが)

# まとめ

dockerで実装されているcpu 割り当てだったりリソースの割り当てが
どのように行われているかの概要だけでもつかめたので個人的には満足。

これ以上は深入りしない(できない)
[Windows7]electron-vueのbuildエラーの解決策

## 環境  
OS: Windows 7
electron-builder 20.31.2

## はじめに 
electron-vueで`npm run build`したときに高確率で発生する以下のエラーでめちゃくちゃハマってつらみだったので解決策をメモしておきます。
このエラー、あくまでもビルドのエラーで、`npm run dev`はちゃんと動くんです。でもビルドはできない。なんやねん！
多分Windows限定な気がする。たぶん。
てかググっても英語ですら情報全然出ないの何でなん？このエラー世界でおれだけなん？
解決策がアレすぎてたまたま見つかって良かったですが、なかなか辛かったです。
詳しい発生条件は分かっていませんが、新しいライブラリをインストールした後に高い確率で発生します。
詳しいこと知っている人いたら教えてください！
ちなみにnpm scriptsはテンプレート通りなので以下の通りです。。
`"build": "node .electron-vue/build.js && electron-builder"`

## エラー内容  
```  
npm run build
?[31m  ⨯?[0m remove D:\hoge\build\win-unpacked\resources\app.asar: The process cannot access the file because it is being used by anothe
r process.
github.com/develar/app-builder/vendor/github.com/develar/go-fs-util.EnsureEmptyDir
        /Users/develar/go/src/github.com/develar/app-builder/vendor/github.com/develar/go-fs-util/fs.go:101
github.com/develar/app-builder/pkg/electron.unpackElectron.func1.1
        /Users/develar/go/src/github.com/develar/app-builder/pkg/electron/electronUnpack.go:39
github.com/develar/app-builder/pkg/util.MapAsyncConcurrency.func2
        /Users/develar/go/src/github.com/develar/app-builder/pkg/util/async.go:67
runtime.goexit
        /usr/local/Cellar/go/1.11.1/libexec/src/runtime/asm_amd64.s:1333
Error: D:\hoge\node_modules\app-builder-bin\win\x64\app-builder.exe exited with code 1
    at ChildProcess.childProcess.once.code (D:\hoge\node_modules\builder-util\src\util.ts:253:14)
    at Object.onceWrapper (events.js:317:30)
    at emitTwo (events.js:126:13)
    at ChildProcess.emit (events.js:214:7)
    at maybeClose (internal/child_process.js:925:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:209:5)
```
（以下省略）

## 解決策  
シンプルに「PC再起動」で解決します。
困ったときの再起動はほんと最強ですね。

## おわりに  
しょうもない解決策でごめんなさい。
でもこれハマってる最中の自分に教えてあげたら泣いて喜ぶ情報なのですみませんが書かせてください。
ただ他にもっと効率の良い解決策がある気がする。
毎回再起動するのも大変なので良い解決先をご存知の方がいればぜひ教えて頂けると助かります。

ではでは。現場からは以上です。
【挫折する前に】Ruby 引数がイマイチわからない人へ　発展編

この記事は前回書いた記事[【挫折する前に】Ruby 引数がイマイチわからない人へ](https://qiita.com/yossy_sa/items/e625918df8a0f2dae59a)の発展編です。
前回の記事では初歩的な解説をしましたので、前回の記事→本記事
の順で読むと理解が深まるのではないかと思います。


###本記事の内容
- 前回の記事[【挫折する前に】Ruby 引数がイマイチわからない人へ](https://qiita.com/yossy_sa/items/e625918df8a0f2dae59a)で省略した部分の解説をしていきます。

###この記事が参考になりそうな人
- 前回の記事を読んでいただいた方
- 「引数がわからなくて挫折しそう！」という初心者の方
- 「引数がイマイチわからない」という方

##前回のおさらい
前回の記事ではイメージを掴んでいただくことを優先して、用語やコードの動きを極力省いて解説しましたが、今回はそれの補足をしていきたいと思います。
前回書いたコードは以下のようなものでした。

```ruby:sample.rb
def tashizan(hikisu, hikisu2)
hikisu + hikisu2
end

puts tashizan(10, 20)
=>30
```
「tashizan」メソッドに引数(hikisu)と(hikisu2)を渡して、そこに10と20という数字を入れた結果、30という値を得ることができました。
この部分に関して、前回の記事を読んでいただいた方の中には、もしかしたら「おおよそのイメージはできたけどコードがどういう動きかイマイチ理解できない」
という方もいたと思うので解説します。
この部分を理解するには**戻り値(返り値)**というものを理解する必要があります。

##戻り値(返り値)とは
元々Rubyには**メソッドの値を返す**という特性があります。
もし値が空だった場合でもnilという値を返してくれます。

では上記のコード(sample.rb)でどこに値が戻っているかというと、**２行目の部分に戻っています。**
実はここには下記のように**「return」**が省略されています。

```ruby:sample.rb
def tashizan(hikisu, hikisu2)
return hikisu + hikisu2
end

puts tashizan(10, 20)
=>30
```
このreturnは省略することができるので書いていませんでしたが、これによって、実際は４行目のメソッドが呼ばれた時に1行目の引数に値が渡され、２行目の値に戻っていたことがわかるかと思います。

ちなみにメソッド複数の値がある場合、**そのメソッドの中で最後に得られる値が戻り値となります。**
文章だけではイメージしにくいかと思うのでコードをみてみましょう。
先ほどの足し算の文の下に掛け算の文を追加してみます。

```sample.rb

def tashizan(hikisu, hikisu2)
hikisu + hikisu2
hikisu * hikisu2
end

puts tashizan(10, 20)
=>200
```
3行目の掛け算の方の値が結果として返ってきていますね。
これが先ほど説明した、**そのメソッドの中で最後に得られる値が戻り値となる。**ということです。

#仮引数と本引数
return文がわかったところで話を引数に戻します。

引数を理解する上で、まず**２種類の引数**があることを理解する必要があります。
**１.仮引数**
**２.本引数(実引数)**
です。

仮引数は**メソッドを定義する際に使う引数**のことで、
本引数は**そのメソッドを実際に呼び出す際に使う引数**のことです。
実際のコードで説明すると、**１行目が仮引数**、**５行目が本引数**となります。

```ruby:sample.rb
def tashizan(hikisu, hikisu2)
return hikisu + hikisu2
end

puts tashizan(10, 20)
=>30
```
先ほどのreturnの流れを思い出してみてください。
１行目で**"定義した"**tashizanメソッドの引数が、5行目で**"呼び出されて"**値が戻っていましたよね。
つまり、「仮引数はメソッドを定義する際の引数」で本引数は「メソッドを呼び出す際の引数」ということになります。

ここで大事なポイントがあります。
それは、**仮引数の名前は本引数と同じでなくてOK**ということです。
ここで「どういうこと？？？」となる人が多いと思うので事項で解説していきます。

##仮引数をもう少し深掘る
「仮引数」という名前のとおり、仮なので**どんな名前にしても値は渡ります。**以下のコードをみてください。
※今回はイメージを掴んでもらうことを優先しています。本来は、英語かつ他の人がみてもわかる引数名にするのがベストです。

```ruby:sample.rb
def tashizan(hikisu) 
puts hikisu + hikisu  # =>20が出力される
end

hikisu = 10

tashizan(hikisu)
```
例によってtashizanメソッドを定義しました。
簡単にコードの流れを説明します。
※大前提として、**プログラミングのコードは上から順に読まれていく**ことを理解しておいてください。

1~3行目はメソッドを定義していますが、この時点ではメソッドが呼び出されていないため、実行されず、次の行に処理が移ります。
５行目で**数値10を左の"hikisu"に代入**しています。
その"hikisu"を**８行目の本引数**に渡し、先ほど同様、**1行目の仮引数に値が渡って出力**されます。

では、先ほど説明した**本引数と仮引数の名前は同じでなくてもOK**というのはどういうことか？コードでみていきます。

```ruby:sample.rb
def tashizan(abc) 
puts abc + abc  # =>20が出力される
end

hikisu = 10

tashizan(hikisu)
```
仮引数の値が本引数と異なっていても値が渡るか調べるため、**1行目の引数名を"hikisu"から"abc"に変更**してみました。
無事、先ほどと同じように20が出力されていますね。

このことから、呼び出す際のメソッド名(tashizan)が合っていれば、仮引数と本引数の名前は必ずしも同じでなくても値は渡るということがわかったかと思います。

##まとめ
上記の例で仮引数の名前を変更しても値が渡ることがわかりました。
これはつまり、**本引数(hikisu)は数値１０を渡す式であり、その値が仮引数(abc)にコピーされているイメージです。**
よって、仮引数の名前を変更しても本引数には反映されないということを表しています。

今回は引数のイメージにフォーカスして、なるべく伝わりやすく書いたつもりです。
引数を理解できると様々なことに応用できるようになるので、慣れるまで復習し続けることが大切だと思います。
どうやらWindowsのICSがアップデートでうまく動作しなくなったらしい

## はじまり
業務で使っているWindows10のマシンでは、いつもICSを使って検証機上にあるマシンに接続しているのですが...困ったことに突然使えなくなって焦ったのでその原因と対応についてここに書き留めます。

## そもそもICSって
- `Internet Connection Sharing`の略です。  
日本語でいうとインターネット共有。  

Windows機と接続された他の機器に、Windows機のネットワークを共有して外との通信を可能にしますよという機能のことです。  


## 何が起こったの  
Windowsがアップデートした途端にICSできなくなった...何でだ...MS...

- 構成  
WiFiで接続しているWindows機の有線LANポートに別マシンを接続してインターネットを共有するようにしてます。

```
                 WiFi接続                          有線接続
[ Internet ] <------------> [ WindowsMachine ] <------------> [ Target ]
おそとに行くよ                 今使ってるマシンだよ               くっついてるやつ
```  

- 普段  
このような感じでIPが振られます。

```
[ Internet ] <------------> [ WindowsMachine ] <------------> [ Target ]
                [WiFi]172.16.xxx.xxx | [eth]192.168.137.1  
              [WiFiがDHCPを振る]      |           [ICSのDHCPがIP振る]
```  


- 起こったこと  
どうやら、Windows機がDHCPでIPを割り振ってくれなくなってしまった...共有は有効になっているのに接続はできなくなってしまった。心当たりがあったのは、少し前に降ってきたWindowsUpdateしかない...  
（ちなみに、自分の会社はシステム管理部門がGoサインを出さないとアップデートされないので少し古いアップデートをされたっぽい。）

```
[ Internet ] <------------> [ WindowsMachine ] <------------> [ Target ]
                [WiFi]172.16.xxx.xxx | [eth]None...           
           [WiFiがDHCPでIP振る]       |      [ICSのDHCPがIP振ってくれない]
``` 

## 原因

Windows 10 Pro Version 1803にアップデートすると、ICSがストップしてしまう現象が起こる。  
これについては、起こったことそのままにICSで動作しているDHCPが問題を起こしているっぽい...

※翌日再度確認してHyper-Vの仮想NICでWinNAT使ってるからそれの可能性もあるとわかりました。Hyper-Vを無効にできる人は仮想スイッチを全部落としてリトライしてください。Hyper-Vを使っていてそれができないなどの理由があれば、以下を試してみてください。

## 対応
MicrosoftのWindowsSupportで解決方法があったのでやってみたら、うまくいった。

**この操作はレジストリを操作します。最悪Windowsが起動しなくなる恐れがあります。**
**この操作による損害については、責任を負いかねます。**

>To fix this issue, set the following registry subkey:
Path: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\SharedAccess
Type: DWORD
Setting: EnableRebootPersistConnection
Value: 1  

参照：[Windows support ICS doesn't work...](https://support.microsoft.com/en-ca/help/4055559/ics-doesn-t-work-after-computer-or-service-restart-on-windows-10)  


 1. レジストリエディタを立ち上げる  
   [Windowsキー]と[Rキー]を押して[ファイル名を指定して実行]ウィンドウを立ち上げ  
   名前：[ `regedit` ] を入力して[OK]を押します。  
  （暗点して権限画面が出ますので許可してください）  

 1. 引用通りにパスを辿ります  
    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\SharedAccess


 1. `EnableRebootPersistConnection`というパラメータはおそらくありませんので作成します。  
   1. マウス右クリック>新規(N)>DWORD(32ビット)値(D)の順に選択。
   2. `新しい値#1`と表示されたら`EnableRebootPersistConnection`に書き換えて確定。  
   3. 値のデータを16進表記を選択した状態で`1`とする。
   4. [OK]を押して抜ける  
  
 1. 後は再起動していつも通りにICSさせると...やっとIP振ってくれた...


## 結論
### ICSは便利なので同じような症状でつまづいていたらお試しあれ😇