OmniAICreator/Qiita-1.07M huggingface dataset:
個人的用語集(WindowsAPI for c++ desktop application)

| 用語 | 意味 |
|:-:|:-:|
| .NET Framework | [Windowsに入ってる、プログラムを動かしたり作ったりする時に使える便利な環境共有言語](https://wa3.i-3-i.info/word13559.html)　　[ランタイム(CLR) と呼ばれるプログラム実行エンジン](https://docs.microsoft.com/ja-jp/dotnet/framework/get-started/)  |
|  DLL(Dynamic Link Library | [(windows OSの場合)オペレーティングシステムの機能の多くを提供するもの　複数のプログラムで同時に使用できるコードとデータを含むライブラリ](https://support.microsoft.com/ja-jp/help/815065/what-is-a-dll)  |
| SDK(Software Development Kit)  | アプリケーションを作成するためのツールセット(機能であるがAPIがないと使えない？)  |
| API (Application Programming Interface)  |  [SDKとかの境界部分と、その境界間での通信ルール(SDKなどを使う時に使用するものであり、そのルールである？)](http://tom-rc.hatenablog.com/entry/2014/12/10/232830) |
|  -stdcall | [windows APIで広く使われている呼び出し規約 (calling convention)の一つ](https://www.keicode.com/winprimer/wp07b.php) |
Laravelでエラーページに対してリダイレクトを設定する


***はじめに***
Laravelで開発している時に、エラーページが出た際に指定のページにリダイレクトをしたかったのですが、Laravelのバージョンが古い事もあり、解決するのに時間がかかったので書いておきます。

***やりたい事***
・ユーザーが存在しないページにアクセスした時に、そのままエラー画面を表示するのではなく、指定のページにリダイレクトさせる。

***バージョン***
PHP 7.2.7 
Laravel Framework 5.4

***やった事***
Handller.phpにステータスコードを指定してあげて、指定ページにリダイレクトさせる。

```app/Exceptions/Handler.php
public function render($request, Exception $exception) {
  if($exception->getStatusCode() == 404) {
    return redirect('URL');
  }
  return parent::render($request, $exception);
}
```

これで無事に(?)リダイレクトするようになりました。
まぁ、通常だったらカスタマイズした404ページを表示する方が殆どだと思いますが・・。
てっきり、ルーティングを指定するweb.phpで管理するのかと思ったけど、エラーを認識するステータスコードを取得する方法が分からずで時間がかかりました。


っとしばらくするとこんなエラーが・・。
```[error] 27225#27225: *59524 FastCGI sent in stderr: "PHP message: PHP Fatal error:  Uncaught Error: Call to undefined method Symfony\Component\Debug\Exception\FatalThrowableError::getStatusCode() in /var/www/inquiry/app/Exceptions/Handler.php:56
```
HTTP以外の例外が来た時にgetStatusCode()を使うとエラーになるらしい。
なので、それを判断する条件分岐を追加しました。

なので、最終的には以下のコードに。

```app/Exceptions/Handler.php
public function render($request, Exception $exception) {
  if($this->isHttpException($exception)) {
    if($exception->getStatusCode() == 404) {
      return redirect('URL');
    }
  }
  return parent::render($request, $exception);
}
```
これで、404ステータスコードが出たページはリダイレクトするようになりました。


***補足***
[ルーティング 5.6 Laravel](https://readouble.com/laravel/5.6/ja/routing.html)
Laravelのバージョンが5.6以上だと、フォールバックルートというメソッドが使用できて、
他のルートに一致しないリクエストが来ると実行できるルーティングを設定出来ます。

[エラーとログ 5.4 Laravel](https://readouble.com/laravel/5.4/ja/errors.html)
上記ソースコードで使用したHandllerクラスは
アプリケーションで発生する例外を管理するクラスみたいです。

***参考***
[Laravelでエラー時に表示するページのカスタマイズ](https://qiita.com/sakuraya/items/af38c4cf84459a8b5967)
    [Laravel5.5で任意のエラー画面を出すときに注意した方がいいこと](http://kkznch.hatenablog.com/entry/2018/08/26/213314)
firebaseでOAuth認証するためのリンクを押しても反応しなくなったときの解決策


FirebasesHostingで管理しているFirebase+Nuxtで作っているアプリケーションのドメインを時前のにしたらログインができなくなった。


## 事象
コンソールには以下のエラー分が表示されていた

```
"This domain (hogehoge.domein.com) is not authorized to run this operation. Add it to the OAuth redirect domains list in the Firebase console -> Auth section -> Sign in method tab."
```

## 解決策
純粋にFirebaseコンソールでドメインの登録をしていないだけだった、エラーメッセージ通りにFirebaseコンソールで
Authentication→認証済みドメイン→ドメイン追加で追加すれば解決する。
【ゲームQA】オシゴト目録

## イントロダクション
いきなりですが、弊社のゲームQAの体制面についてお話ししたい。
全てのタイトルに当てはまるわけでは無く、また「運用安定後」という認識の上、下記の図をご覧頂きたい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/322350/45148a15-e303-8ce9-93c1-7928adb158f1.png)

**《要点》**
・開発とQAはそれぞれ独立した組織
・開発チームとメインでやり取りを行うのは、協力会社（常駐者）の方
・社内アルバイト、スタジオメンバーについては、テストの実施を担当

**《協力会社（常駐者）のオシゴト》**
・定常で回している施策のすり合わせ（プロダクト⇔QAの仕様共有）
・テストケース作成や部分的改修、項目削減
・社内アルバイトやスタジオメンバーとの業務やり取り（橋渡し）

これだけで見たら、ある1つの疑問に行き渡る。
####社員は一体何をやっているんだ!?　と

事実、定常的な施策を回すだけであれば、QA体制の中の「社員」という立場の人間はいらないともいえるし
いなくても回るように、設計されているのである。
もちろんこの体制を築くのが社員のオシゴトとも言えるが、それはまた別の機会に。

#####それじゃあ安定したんだからやることないだろうし、毎日寝そべってただゲームをやってるだけなんでしょ？　

と思われた方。お待ちください。~~そういった方も居るかもしれないが、少なくとも私はそうではない。~~

ではいったい何をやっているのか、という点について本記事で紹介していきたいと思う。
なお、今回はザックリとした紹介であるため、詳細な取り組み内容等は別の機会で紹介したい。

---
###【オシゴト１：業務の効率化、標準化】
業務とは下記一連の流れを示す。
※あくまで業務の一例となる図式のためご留意頂きたい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/322350/81087466-0829-2222-a35a-7234103c8d04.png)


この流れの中において、手がかかっている箇所を効率化、あるいは複雑なフローを経ている箇所を
標準化したりするのが社員のオシゴトである。

###【オシゴト２：検証の効率化】
人によってはオシゴト１の業務効率化にも入る話ではあるが、今回は分けて記載させていただく。
検証とはテスト実施のことである。つまり、テスト実施において手がかかっている箇所を減らす手法を考え、
取り入れるように動いていくことが社員のオシゴトである。

例で挙げるならば、実機で確認をしていた箇所を減らすために、設定値（データ）を直接見て確認する検証に
変えたりするよう取り組む、などである。

###【オシゴト３：障害の分析】
障害が発生するメカニズムには複数の要因が絡んでいる。
弊社ではその複数の要因に対した分類を用意し、定常的にその分類分けを行っている。
その分類分けが正しく行われているか確認することが社員のオシゴトの１つではあるが、
もちろん分ければ満足という訳ではない。

さらに踏み込んで、分類した障害を分析し、どのような施策で、どのような箇所に多く見られるかなど、
傾向を掴み、品質向上や検証効率化に向けた対策を練って取り組むこともオシゴトである。
※分析は開発の方で行っているという会社も多いかと思うが、弊社ではQAを担当する社員のオシゴトにあたる。

###【オシゴト４：開発への業務改善提案】
冒頭の体制図でお話した通り、弊社では開発とQAの部署は独立している。
その為、開発を外（別の部署）から見ることが出来るため、開発工程における非効率的箇所や
品質低下を招きかねない箇所、あるいは品質向上を目論める箇所など、客観的な視点にたって見ることができる。
そこで発見した改善点を、開発に提案するのが社員のオシゴトだ。

例えば、リリース前の本番反映作業の工程で設定値を弄っているなどあれば、
QA後の設定値変更は障害発生リスクが高いため無くすように指摘するなどだ。
開発チームの内部に居れば、**当たり前の認識**になっていることも、外から見たらそれはリスクの高い行いをしているということは往々にしてありえることだ。

もちろん、別の部署ということは、開発内での作業工程全てを把握しづらく、
リスクの高い作業に対して逐一指摘することが難しくなってくるのも事実だ。

品質管理の独立性などについては、[JSTQB](http://jstqb.jp/) のシラバスに記載されているので、そちらを参照してほしい。

##まとめ
弊社QA体制における「社員」のオシゴトを色々と紹介してきたわけだが、
もちろんこれは一例にすぎず、他社においては体制含め、オシゴトの内容や取り組み方は違っているかと思う。

ゆえに、これを読んでいただいた方には、ぜひ貴社におけるオシゴトをコメントいただけると嬉しい。
そのオシゴトは、**「その会社にしかあてはまらない」**というものもあるかもしれないが、同時に**新たな発見につながる可能性**もあると筆者は考える。
本記事を通じて、より多くのゲームQAのオシゴトを共有できたらと思う。
macでライブラリをビルドしてインストールするときはbinutilsに気をつける

# TL; DR

macで静的ライブラリのリンクエラーが発生するときは静的ライブラリの生成に使われている `ar` / `ranlib` がbinutilsのものになっていないか注意したほうが良いという話。

# 事象

mac環境へXGBoostをインストールしようと `pip3.7 install xgboost` を実行したところエラーが発生してインストールに失敗する事象に遭遇しました。

## 環境

|環境|バージョン|
|:--:|:-----:|
|macOS|10.14.1|
|Python|3.7.1|
|pip|18.1|
|XGboost|0.81|

## エラーメッセージ

エラーメッセージを眺めてみるとどうも静的ライブラリのリンクに失敗しているようです。

```shell-session
$ pip3.7 install --user -U xgboost
...
    ld: warning: ignoring file rabit/lib/librabit.a, file was built for archive which is not the architecture being linked (x86_64): rabit/lib/librabit.a
    Undefined symbols for architecture x86_64:
     "_RabitLinkTag", referenced from:
          __GLOBAL__sub_I_c_api.cc in c_api.o
      "rabit::engine::Allreduce_(void*, unsigned long, unsigned long, void (*)(void const*, void*, int, MPI::Datatype const&), rabit::engine::mpi::DataType, rabit::engine::mpi::OpType, void (*)(void*), void*)", referenced from:
          xgboost::LearnerImpl::LazyInitModel()      in learner.o
...
```

# 調査

## 手動でビルドして確認

XGBoost-0.81のtarballをダウンロードして手元で順々にビルドをして調査を行いましたがリンクしようとしている静的ライブラリはちゃんと生成されていてなぜエラーが発生するのか謎は深まるばかりでした。

```shell-session
$ cd xgboost-0.81/xgboost/rabit
$ make && ls rabit/lib
README.md  librabit.a  librabit.so  librabit_base.a  librabit_mock.a  librabit_mock.so
$ file rabit/lib/librabit.a
rabit/lib/librabit.a: current ar archive
```

## ググってみたら

途方にくれながらググってみたら同じような事象に遭遇している方のブログを発見しました。

- [x86_64なアーカイブにリンクできない？と思ったらbinutilsのarとranlibが悪さをしていたらしい話](https://naoyat.hatenablog.jp/entry/2012/01/31/033312)

記事の通り `ar` コマンドを確認してみると自分の環境も確かにbinutilsの `ar` と `ranlib` が使用されているようでした。

```
$ which ar
/usr/local/bin/ar
$ ar V
GNU ar (GNU Binutils) 2.31.1
Copyright (C) 2018 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.

$ which ranlib
/usr/local/bin/ranlib
$ ranlib -v
GNU ranlib (GNU Binutils) 2.31.1
Copyright (C) 2018 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) any later version.
This program has absolutely no warranty.
```

## そして解決

そこで発見したブログ記事と同じように `/usr/bin` にインストールされている `ar` と `ranlib` を使うようにしてみたところ問題解決。
無事にXGBoostをインストールすることができるようになったのでした。

```shell-session
$ which ar; which ranlib
/usr/bin/ar
/usr/bin/ranlib
$ pip3.7 install --user -U xgboost
Collecting xgboost
  Downloading https://files.pythonhosted.org/packages/4f/4c/4969b10939c4557ae46e5569d07c0c7ce772b3d6b9c1401a6ed07059fdee/xgboost-0.81.tar.gz (636kB)
    100% |████████████████████████████████| 645kB 4.4MB/s
Requirement already satisfied, skipping upgrade: numpy in ./Library/Python/3.7/lib/python/site-packages (from xgboost) (1.15.2)
Requirement already satisfied, skipping upgrade: scipy in ./Library/Python/3.7/lib/python/site-packages (from xgboost) (1.1.0)
Installing collected packages: xgboost
  Running setup.py install for xgboost ... done
Successfully installed xgboost-0.81
```

まさかbinutilsが原因になっているとは思いもよりませんでした。
やっぱりmacをLinuxと同じように使うのは辛いのだな……。
昔の人はtableでカドマルを作ってた、ってよ！

cssの普及と発達により、すっかり廃れた手法ですが、今回はそのうちの一つを記録に残すとしましょう。

#【古の技術】テーブルコーディング!!!!!!!

↓よくあるこういうデザイン。
![名称未設定-1.png](https://qiita-image-store.s3.amazonaws.com/0/269200/bf47869d-bf96-7fc0-12b8-acba78600fd1.png)

今ならcssで簡単にできますよね。

```css:css
border-radius: 10px;
```

これをtableで表現したいと思います。

##準備するもの
まず、四隅の角丸画像を4枚を用意します。角画像は背景付で作成します。
↓こういうヤツ
![img04.png](https://qiita-image-store.s3.amazonaws.com/0/269200/9f1628f9-491b-a0bc-f10f-2c3708219d74.png)　![img01.png](https://qiita-image-store.s3.amazonaws.com/0/269200/1e0cfd85-ebff-6f91-7642-f4821057a355.png)　![img02.png](https://qiita-image-store.s3.amazonaws.com/0/269200/9b45cc80-2a04-049e-dd51-1d25ba4e8821.png)　![img03.png](https://qiita-image-store.s3.amazonaws.com/0/269200/e1043a03-b946-f1de-f73f-6caf3cfb74ce.png)


##手順:exclamation:
まず、tableを作り、四隅に画像を配置します。

###**イメージ**
![2.png](https://qiita-image-store.s3.amazonaws.com/0/269200/31008f5f-6268-ca4d-6106-57eb4353b574.png)

そして、

- tableの余白、間隔、ボーダーを全て<font color="red">**「0」**</font>にする。
- 角丸画像と同じ色でテーブルの背景をつける。
- 四隅のテーブルセル(td)に、`align`(left,right)、`valign`(top,bottom)を指定する。
- **tdにそれぞれの横幅(`width`)と高さ(`height`)を指定する。**
- 何も入力のないtdは表示されません。`spacer.gif`を入れるか、`&nbsp;`などを入れましょう。

これだけ。。。だが、意外と面倒くさい :disappointed_relieved:。
tableの横幅を300pxとしたら、真ん中のtdは、横の幅20pxを引いて280pxを指定。画像のサイズを中途半端にしないのがおすすめです。
きっちり計算が合わないと、思わぬ形にズレたりしてしまう場合があるのでちまちま指定しましょう。（※現在は四隅以外の横幅は指定せずともうまくいく場合があります。適宜ブラウザでご確認ください。）

##HTMLコード
```html:html
<table width="300" border="0" align="center" cellpadding="0" cellspacing="0" bgcolor="#ccc">
	<tbody>
		<tr>
			<td align="left" width="10" height="10" valign="top"><img src="images/img01.png" width="10" height="10" alt=""></td>
			<td width="280" height="10">&nbsp;</td>
			<td align="right" width="10" height="10" valign="top"><img src="images/img02.png" width="10" height="10" alt=""></td>
		</tr>
		<tr>
			<td>&nbsp;</td>
			<td width="280" height="150"><p>&nbsp;</p></td>
			<td>&nbsp;</td>
		</tr>
		<tr>
			<td align="left" width="10" height="10" valign="bottom"><img src="images/img04.png" width="10" height="10" alt=""></td>
			<td width="280" height="10">&nbsp;</td>
			<td align="right" width="10" height="10" valign="bottom"><img src="images/img03.png" width="10" height="10" alt=""></td>
		</tr>
	</tbody>
</table>
```
※font-sizeが利いてしまう場合、うまくいかないのでfont-size:0 を指定する必要があります。
※table本来の使い方としては、非推奨ですが、デザインを表現する為の手法として使うしかなかった、という例になります。

###もうこんなことしなくてええやろぉ～
そう思ってたけど、HTMLメールという強敵が :tired_face::tired_face::tired_face:
こいつはイマドキのcssを理解しようとしないやっかいな存在です。
どうしてもガチtableコーディングしないといけない場合があり、そんな中で意外と役に立ったよ、って話。 

tableの中にtableを入れてレイアウトしたり、tableを駆使してhtmlを作成するのもなかなかマニアックですよね。

もうデザインの為にtableを駆使しなくても良くなった時代にバンザイ！:open_hands:
css animationのリスタートを行う場合のハック

Reactなどで、css　animationをかけている要素に対して、
中身の小要素が変わったときにサイドアニメーションをリスタートさせる方法です。　　　

### 課題  
propsが変更されても、中身が変わるだけなのでアニメーションは再実行されない。  

```jsx

const animTarget = (props:Props) => {
 return (
  <Animation>{props.children}</Animation> 
 )
}

const Animation = styled`
 animation: ${xxx} 0.4s 0.6s ease-out forwards;
`

```

### 解決策  
明示的にスタイルをreflowさせてあげることで解決。
クラスの付替えの間にreflow処理を入れてあげる（void e.offsetWidth)

```jsx

const animTarget = (props:Props) => {

  if (document.querySelectorAll('.tar')) {
    Array.from(document.querySelectorAll('.tar')).map(e => {
      e.classList.remove('is-animate')
      //-hack for reflow
      void e.offsetWidth
      e.classList.add('is-animate')
    })
  }
 return (
  <Animation　className='tar is-animate'>{props.children}</Animation> 
 )
}

const Animation = styled`
 &.is-animate{
  animation: ${xxx} 0.4s 0.6s ease-out forwards;
 }
`
```

もうちょっとうまい方法があったら教えてください。
flutter doctor -v

# flutter doctor -v でなかなかOKにならなかったのでメモ

## やっと、No issues found!

なかなか全てチェックできなかったんですが、やっと通りましたのでメモ
<img width="1118" alt="flutter.png" src="https://qiita-image-store.s3.amazonaws.com/0/51116/1022bf19-b877-f6e5-b3d9-761c1fd28338.png">

## 引っかかったところ

1. Javaのバージョン
    - openjdk-11.0.1.jdkでは```flutter doctor --android-licenses```が通らず、**✗ Android license status unknown.***がでてしまってました。jdk1.8.0_192.jdkに変更して解決しました。
    - 一旦OKになってもJAVA_HOMEをJava11に戻すとまたNGになります。
基本情報技術者試験を受ける意義って？

緊張のqiita初投稿です。
よろしくお願いします。


テーマは基本情報技術者試験（以下FE）です。
まったくDMM WEBCAMPらしからぬテーマで申し訳ありません笑
Railsに関する投稿が続くなか、ちょっとしたおやつ程度に考えてください。


10月に受験してきたのですが、文系駆け出しプログラマの私にとっては受ける意義（why）があったと感じられたので、そのことについてアウトプットしておこうと思います。
どのように勉強したか（how）の部分については、参考になるサイトや記事が他にたくさんあるので、今回はwhyの部分に焦点を当ててみようと思います。

<img src="https://qiita-image-store.s3.amazonaws.com/0/316965/4e3407b6-1491-7230-d104-d56984b59759.png" width="450px">




##自己紹介
大学4年生で、商学部に所属しています。学問としてコンピュータに触れたことは（もちろん）一度もなく、プログラマとして働き始めたのもつい最近です。

この仕事を始めてから、「情報工学を大学で専攻しておきたかったな」という思いが少しだけ募ってきています笑

<img src="https://qiita-image-store.s3.amazonaws.com/0/316965/3d64e21b-cfc6-466c-467f-1db48e1d0752.png" width="450px">


##なぜFEを受けるか
※主観的な内容を非常に多く含みます。

今回、私にとってFEを受けた意義は、【コンピュータの仕組みを調べて学習するきっかけになった】ということでした。以下で詳しく書いていきます。

—

文系出身のプログラマである私にとって、web系の仕事を始める上での不安点は、「情報工学などを専攻した人に対してハンディキャップを背負っているのではないか？」ということでした。というか、今でもこの不安は残っています。
同じような気持ちを抱いている文系出身の方もいらっしゃるのではないでしょうか。


確かに、コンピュータを大学で学んでいないぶん、学んでいる人に対しては出遅れているのは事実です。加えて、新しい技術を開発するなどということになれば、高等教育機関や企業等で研究することがほぼ必須になるでしょう。


ただし、だからと言ってまったく勉強しないのは勿体ないことだと私は思います！
コードを書いて動かしている裏側を知らなければ、本当にそのプログラムを理解できているとは言い難いですし、プログラムが動く根幹を理解していれば、予期せぬエラーへの対応をしやすくなるとも言われています。


ということで、コンピュータの勉強をしようとなるわけですが、まったくの未学習者であれば、何を学べばよいのかがわからない状態だと思います。（少なくとも私はそうでした）
そこで、学習の取っ掛かりの知識をつけるのに適しているのがFEであるというわけです。（※個人差があります）


FEの範囲の中には「論理回路」「コンピュータアーキテクチャ」「ネットワーク」「アルゴリズム」などなど…があり、これらを理解することでコンピュータが理解できるようになってきます。これらの分野に関して、かなり基礎の部分についてはFEが概ねカバーしている印象を受けました。


ただ、かなり基礎的な内容であることには変わりなく、自ら知識を補強しないといけないのは確かです。その意味で、この節の冒頭にも書きましたが、【コンピュータの仕組みを調べて学習する“きっかけ”になる】というのがFEの意義なのだと思います。
資格に向けて勉強を進めていくと、コンピュータに関して何を理解すれば良いのかが明確になってきます。そこから先、自分にとって必要な知識を書籍やサイトを使って身につけてこそ、FEの意味があるのだと思います。



##まとめ
あくまで資格の一つとしてFE取得を目指すのもよいですが、コンピュータを理解する第一歩として捉えてみるのも面白いのではないでしょうか。
コードを書けるだけではなく、その構造まで理解できる人材になりたいものです。
react-native link で Cannot read property ‘match’ of undefined

`react-native link react-native-svg` したらこんなエラー出てリンクできませんでした。

```
$react-native link react-native-svg
rnpm-install info Linking react-native-svg ios dependency 
rnpm-install ERR! Something went wrong while linking. Error: Cannot read property 'match' of undefined 
Please file an issue here: https://github.com/facebook/react-native/issues 

Cannot read property 'match' of undefined

TypeError: Cannot read property 'match' of undefined
```

解決方法は `Podfile`の末尾に次の1行を追加すること。

```
# Add new pods below this line
```

参考
https://medium.com/@sroze/react-native-cannot-read-property-match-of-undefined-997091a019ea
備忘録で投稿を始めます。

**エセプログラマのための備忘録**
文系の大学を卒業し，社会人になって始めてプログラムに触れ，もうすぐ10年を迎える。
今まではSASがメインで，まわりのちゃんとした統計家はRも使えるという状態であった。

しかし，業務ががらっとかわることになり，
この度○億行というデータを取り扱うことになった。

使用するツールは，SQLサーバー，R，Python。

主にPythonを一から学ぶ予定なので，備忘録的にアウトプットしていきたいと思う。

SASしか使ったことがない人や私のようなエセプログラマーのような人が参考になる情報になればなと思っています。
【Visual Studio 2017】「コードの生成中にエラーが発生しました。デザイナーで行った変更は、ソースコードに反映されませんでした。ソースファイルを閉じて、もう一度開くことをお勧めします。エラーメッセージは次のとおりです：値が有効な範囲にありません。」の解決方法

#解決法
開いているタブをすべて閉じてください。
#エラー画像
![image.png](https://qiita-image-store.s3.amazonaws.com/0/295196/60679ff7-529c-146e-e192-0ede413e9a9c.png)
#状況
コードを変更し、ビルドしようとすると突然このエラーが発生した。コードのエラーは発生していないし、変更するべきでない場所を編集していない。保存もできないため、VisualStudioを終了しようとするとこのエラーが発生する。
#再現できない……
タブの開きすぎが原因だったので、タブを多く開いても再現できなかった。
#終わりに
エラー内容から解決法が想像できないエラーは辛いです……。
pandasで、特定の列だけを除外したdataframeを作る方法

# 1列だけ除外したdataframeが作りたい。

pandasを扱っていて、この列だけいらない、という状況は結構ある。
この前、ロジスティック回帰をしていて、目的変数の2値のcolumnだけ除外したくなったが、どういったやり方が一番スマートかわからなかった。

例えば、こういうdataframeがあって、bの列だけを消したいと思った時。


```
df = pd.DataFrame([[1,2,3],[4, 5, 6]], columns=list('abc'))
```
||a|b|c|
|:--:|:--:|:--:|:--:|
|0|1|2|3|
|1|4|5|6|


いくつか方法はあると思うが、どうもこれが一番いいようだ。

```
df[df.columns[df.columns != 'b']]
```

||a|c|
|:--:|:--:|:--:|
|0|1|3|
|1|4|6|


ネストの一番内側でTrue、Falseのmaskingを作り、それを使っていらないcolumn以外のcolumnのリストを取得。
それを使って、dataframeを作る。
結構めんどくさい。

---

追記

```
df.drop("b", axis=1)
```

この書き方で十分だった。
PivotalTrackerでスプリント期間をずらす (イテレーションの週を変更する)


# Currentの日付部分をクリックして変更

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/517c20dd-245f-26e7-9859-564c8f418333.png)

分かりくい‥。

[Setting the iteration start day and project start date](https://www.pivotaltracker.com/help/articles/setting_iteration_start_day_project_start_date/)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
お金を貸してと言ったら「といちですよ」といわれたので

お金を貸してといったら、「といちですよ。」といわれて、一体いくらになるのか怖くなったので、
いくらになるか計算するPythonワンライナーを考えてみた。

```python:
lambda days, dept, l=lambda days, dept: True and [globals().__setitem__("t",lambda dept:globals().__setitem__("ret",dept))] and [t(dept)] and [1.1 for x in range(1,days + 11) if x % 10 == 0]: reduce(lambda x, y: [globals().__setitem__("ret", ret * y)] and ret , l(days, dept))
```

_(借りてから経過した日付, 借りたお金)

複利って怖いですね。
MySQLで型の変更をする

毎回検索している気がするのでメモ。

```
ALTER TABLE [テーブル名] MODIFY [カラム名] [型]
```

## 補足
NOT NULL制約が付いている場合上のやり方だと外れる。
そんな時は下の方法で。

```
ALTER TABLE [テーブル名] MODIFY [カラム名] [型] NOT NULL;
```
Rails 5 + Puma で連続して xhr したらハングアップした

Rails アプリの開発中、短時間に連続して xhr する処理を書いたら、Rails のプロセスが必ずハングアップして KILL しかできない状態になってしまった。

デバッガで原因を調査したところ、クラスのオートロード時に呼ばれる `ActiveSupport::Dependencies::Interlock#loading` のあたりで止まってしまっていることがわかった。

Puma はマルチスレッドでリクエストを処理するため、複数のスレッドがこのロックをとることでデッドロックが発生してしまったものと思われる。

これ以上詳しいことはまだわかっていないが、開発時は `RAILS_MAX_THREADS=1` を指定してシングルスレッドで動作させることで、ひとまず問題を回避した。
自分用メモ: DDDのモジュールと、その他モジュールとサブモジュール、パッケージ、リポジトリについて

## 目的
この記事の目的は、DDDのdomain modelやモジュールの構築をする際に、より上手く構築できるよう、理解を助ける為の前提知識を整理するための内容です。

## モジュールとは
そもそもモジュールとはなんでしょう。
[wiki](https://ja.wikipedia.org/wiki/%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)では冒頭にこう書かれています。

> モジュール（英: module）とは、工学などにおける設計上の概念で、システムを構成する要素となるもの。いくつかの部品的機能を集め、まとまりのある機能を持った部品のこと。モジュールに従っているものをモジュラー (英: modular)という。

なるほど、つまり**「機能」の「集合」**であり、その「機能」の「集合」は**システムを構成する為の要素**である。

この場合の「機能」と「集合」は当て字みたいにAとBみたいな感じで使われている所をよく見かけます。

一応jsやpythonでもmoduleを実装しています。
Pythonの場合、moduleは「再利用」を達成するためにあるそうです。jsも多分似たようなものでしょう。
**jsとpythonの文脈に限って言えばimportできる奴がmodule自身です。**
この場合のmoduleとは、「関数やクラス、変数等」の「集合」です。
この仕組みにより、「再利用」「配布」「クラス名の衝突回避」...etc等の恩恵を受けることができます。

しかし、jsとpythonが「関数やクラス、変数等」の「集合」みたいだからと言って、他の言語や設計、文脈ではmoduleの具体的な意味合いが異なることはよくあります。

DDDの文脈でもmoduleって用語はでてきます。
自分はこのmodule === pythonのパッケージシステムと受け取ってましたが、DDDは特定の言語に依存するものではありません。
「pythonの」って考えてる時点でpythonに依存してるマインドだったということです。

## では、「DDDの文脈が言うmodule」とは
DDDの言うmoduleは**「概念」の「凝集」**であり、その「概念」の「凝集」は**システムを構成する為の要素**です。
DDDの文脈が言うmoduleとは、「概念の凝集性」と「概念同士の疎結合性」を実現するためのデザインパターンのようです。

<img width="707" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3838392f38343031653832392d353135362d316239662d313866612d3632323362343334306464362e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/141711/e9edab92-1dfb-975e-20d8-bdb9e167d2db.png">

この図の場合は電源タップももちろん料理で使うケースはありますが、キッチン引き出しとガレージ工具箱のどっちに入れるかと言われると、ガレージ工具箱の方が近いのかなぁと思います。もしかしたら将来的にはもっと適したモジュールが出てきて、そこに入れる可能性もあります。

---

### ここから以下の内容はpythonやjsにおけるモジュールとパッケージのメモです。DDDとは関係ないです

## サブモジュールについて
javascriptとpythonの場合も同じように特定のimportできる奴より深い所にあるimportできるやつがサブモジュール

### 補足
moduleは入れ子になる
import 'A'もできれば、import 'A/B'もimport 'A/B/C'もできる
AもモジュールでBとCはAのサブモジュールとして作られる事が多い。

## パッケージについて (クリーンアーキテクチャ本だとコンポーネントと呼ばれてる
さっきの補足ではimport 'A'ができるとは言ったが、できない場合もある。
それの具体例が以下のような構成の場合だ。
https://www.npmjs.com/package/@vue/cli-plugin-e2e-cypress
https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue

この場合だとimport 'A'はできないが、import 'A/B'又はimport 'A/B/C'ができる事がある
この場合はAはモジュールのコンテナとして働く**パッケージであり**、Bはモジュールであり、CはBのサブモジュールである。

### 補足
基本的に1つのgitリポジトリで1つのパッケージを作ることが多い。
だがtsの@typesやvue-cliの@vue等、1つのリポジトリで複数のパッケージを管理するのも結構多い。

## ケーススタディ
### 1. このディレクトリはパッケージである
https://github.com/k-okina/book-management/tree/master/src/domain/model/user

### 2. このファイルはモジュールである
https://github.com/k-okina/book-management/blob/master/src/domain/model/user/FirebaseUserRepository.ts

### 3. このファイルはモジュールである
https://github.com/k-okina/book-management/blob/master/src/store/containers/index.ts

### 4. このファイルは3のサブモジュールである
https://github.com/k-okina/book-management/blob/master/src/store/containers/loginForm/index.ts
Heroku CLI login をターミナルベースでやりたいときの方法

Heroku CLI login のログインフローのデフォルトがブラウザになったらしい。

### changelog
https://devcenter.heroku.com/changelog-items/1530

## 現在の仕様

```
heroku login
```

と実行すると、以下のようなテキストが出てくる。

```
heroku: Press any key to open up the browser to login or q to exit: 
```

指示通り適当に打ち込んでEnterを押すと、以下のような画面がブラウザで勝手に開くので

![Screen Shot 2018-12-06 at 15.25.25.png](https://qiita-image-store.s3.amazonaws.com/0/109241/67e93c64-d6d8-44ea-cd41-369470502be9.png)

これで Log in すればOK。

## ターミナルベースでやりたいとき

`--interactive` オプションをつければよい。

```
heroku login --interactive
```
Laravelで使えるおすすめパッケージ・ライブラリまとめ


# はじめに

HALアドベントカレンダー6日目を担当する、チセイです。

最近、[HEW](https://www.hal.ac.jp/tokyo/campuslife/event)(HAL Event Week)で使用するLaravelを勉強していて使ったパッケージとライブラリについてご紹介したいと思います。


## LARAVEL-IDE-HELPER
エディタで変換を保管してくれるすげー奴。

これがあるとないとでは、作業効率も変わってくるので必須レベルのパッケージです。

インストールは[こちら](https://github.com/barryvdh/laravel-ide-helper)


## LARAVEL-DEBUGBAR

Laravelでデバック作業したいときにおすすめです。

これがあるだけでそのページのルーティングやクエリ、リクエストなど見れてとても便利です。

インストールは[こちら](https://github.com/barryvdh/laravel-debugbar)



## Laravel Mix

Laravel上で使えるWebPackのラッパー。入れない理由はないですね。

公式ドキュメント、導入手順は[こちら](https://readouble.com/laravel/5.5/ja/mix.html)

## Laravel Collective

 HTMLとFORMのファザードを利用したい方はぜひ[Laravel Collective](https://laravelcollective.com/)をおすすめします。

他にもいくつかの機能が使えますが基本的にはHTML&FROMSを使ってる方が多いそうです。

こちらの[ブログ](https://blog.motikan2010.com/entry/2017/01/28/%E3%80%8ELaravel_Collective%E3%80%8F%E3%81%A7%E3%81%AEHTML%E7%94%9F%E6%88%90%E3%82%92%E7%B0%A1%E5%8D%98%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%BF%E3%82%8B)に使い方など詳しく書かれています。



## Laravel Socialite

ソーシャルログインを実装したい方はこれを使うと爆速で実装できます。

認証対応しているのは、Facebook、Twitter、LinkedIn、Google、GitHub、GitLab、Bitbucket
の７つです。

公式ドキュメント、導入手順は[こちら](https://readouble.com/laravel/5.7/ja/socialite.html)

[こちらの記事](https://www.webprofessional.jp/easily-add-social-logins-to-your-app-with-socialite/)を参考に勉強させていただきました。

## Laravel Scout

[Eloquent](https://readouble.com/laravel/5.3/ja/eloquent.html)モデルに対し、全文検索を提供するパッケージです。

[Algolia](https://www.algolia.com/)のドライバも用意されているため、とても便利です。

公式ドキュメント、導入手順は[こちら](https://readouble.com/laravel/5.3/ja/scout.html)

[こちらの記事](https://qiita.com/avosalmon/items/b7b90c734709093fb927)を参考に勉強させていただきました。



## Carbon

時間を扱うラッパーライブラリです。

PHPで書かれているので非常にわかりやすいです。

公式ドキュメント、導入手順は[こちら](https://carbon.nesbot.com/)

## Laravel Cashier

Laravel上で定期支払いを実装させたいときに、活躍するのがこいつです。

ただし、注意点としまして公式から

> サブスクリプションを提供せず、「一回だけ」の支払いを取り扱う場合は、Cashierを使用してはいけません。StripeかBraintreeのSDKを直接使用してください。

とのこと。

用途にマッチした場合は、ぜひ実装してみると良いでしょう。

公式ドキュメント、導入手順は[こちら](https://readouble.com/laravel/5.7/ja/billing.html)



## Laravel Passport

API認証をするときに便利なのがこいつです。

> Laravelでは古典的なログインフォームによる認証は、簡単に実行できるようになっています。では、APIに関してはどうでしょうか？　通常APIでは、ユーザーの認証にトークンを使用し、リクエスト間のセッション状態は保持されません。Laravelアプリケーションのために、完全なOAuth2サーバの実装を提供するLaravel Passportを使えば、短時間で簡単にAPI認証ができます。

公式ドキュメント、導入手順は[こちら](https://readouble.com/laravel/5.7/ja/passport.html)

## Laravel Queue

Ajaxやりたくない。。。から始まりみつけたのがこれ。

非同期処理で何かしたいときに、活躍してくれるのがこのパッケージです。

このパッケージは、Laravel Scountと組み合わせて使ったり、Laravel　Queue単体で使ったりなど、汎用性が高いのでおすすめです。

ちなみに読み方は（キュー）だそうです。

公式ドキュメント、導入手順は[こちら](https://readouble.com/laravel/5.7/ja/queues.html)

[こちらの記事](https://qiita.com/naoki0531/items/f9b8545b77c643a3fa44)を参考に勉強させていただきました。



## おまけ

以下は、Laravel5.7で実装されたものです。

### 	Laravel Telescope

​		Laravelで使う公式デバックアシスタントです。（~~あれ？Laravel-DEBUGBAR...~~）

​		[こちら](https://blog.capilano-fw.com/?p=2435)の記事に詳しい使い方が乗せられています。

​		公式ドキュメントは[こちら](https://readouble.com/laravel/5.7/ja/telescope.html)

## 最後に

初投稿なのでまだまだ至らない部分があると思いますが、最後まで読んでいただき誠にありがとうございます。
独自ドメインでメールしたいけどどうしたらいいの？


# あらすじ
会社が新しいサービスを始めるので、独自ドメインのメールアドレスが欲しいらしい

# 忙しい人向け
## 必要なもの
・ドメイン　　　　⇒お名前ドットコムで取得
・メールサーバー　⇒さくらサーバーを活用

## やること
①ドメイン購入
②さくらサーバーにドメインを追加　->ドメイン/SSL設定 ->新しいドメインの追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172765/e9e9f466-8f6f-5f85-f70e-92419a9ab189.png)
③お名前ドットコムの WHOIS情報 をさくらサーバーのネームサーバーで上書き
![image.png](https://qiita-image-store.s3.amazonaws.com/0/172765/35416043-00ef-f3bf-036f-66455b556ce2.png)
※これ忘れるとメールがさくらに届かない。
④メールアドレスを作る
fin


# 解説



### 参考
https://help.sakura.ad.jp/hc/ja/articles/206053782--%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E8%A8%AD%E5%AE%9A-%E4%BB%96%E7%A4%BE%E3%81%A7%E5%8F%96%E5%BE%97-%E7%AE%A1%E7%90%86%E4%B8%AD%E3%81%AE%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%92%E5%88%A9%E7%94%A8
Chrome のパスワードマネージャの username は、 <input type="password"> の 直前に入力された値が設定される

注: この記事に解決方法はありません

### 現象

システム上のユーザ名(`email`とする)とパスワードの間に別の入力項目がある場合

```html
<form action="/sign_up">
  <input type="text" name="email" autocomplete="username">
  <input type="text" name="nickname">
  <input type="password" name="password" autocomplete="new-password">
  <button type="submit">sign up</button>
</form>
```

メアドのみ先に送るようなユーザ登録フローでありがちな、 `email` が `readonly` だったりする場合


```html
<form action="/sign_up">
  <input type="text" name="nickname">
  <input type="text" name="email" autocomplete="username" readonly>
  <input type="password" name="password" autocomplete="new-password">
  <button type="submit">sign up</button>
</form>
```


以上のようなフォームを送信した時、 Google Chrome 71 のパスワードマネージャは `nickname` を ID として保存する。どうやら `type=password` の直前の入力をユーザ名として認識する様子。 `autocomplete="username"` なんのためにあるんだろう…

### [Google chrome autofilling all password inputs - Stack Overflow](https://stackoverflow.com/questions/23156578/google-chrome-autofilling-all-password-inputs)

> Chrome auto fills any input with a type of password and then whatever the input before it is

Stack Overflow に同じ悩みの人を発見。 `blur` と `focus` を使って無理矢理 `autocomplete` 自体を動かないようにしてる



### [Password Form Styles that Chromium Understands - The Chromium Projects ](https://www.chromium.org/developers/design-documents/form-styles-that-chromium-understands)
> If you've implemented an "email first" sign-in flow that separates the username and password into two separate forms, include a form field containing the username in the form used to collect the password. You can, of course, hide this field via CSS if that's appropriate for your layout.

Chromium の推奨(?)のサインアップフォームの作り方には、 隠しフィールドとして `autocomplete="username"` を追加せよと書かれているが、この通りにしても上記のようなフォームの username は認識されない。

### その他の参考文献

- [Manage saved passwords - Google Chrome Help](https://support.google.com/chrome/answer/95606)
    - パスワードマネージャの登録項目が間違ってたら手で直せとのこと
- [\<input type=password\> - MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/Input/password)
- [HTML の autocomplete 属性 - MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/autocomplete)

進捗があったら追記する
re:dash の Dashboard で script が動かない原因（ver 5.0.2）

結論から言うと 
https://github.com/getredash/redash/blob/master/client/app/filters/markdown.js
内で利用されている markdown ライブラリが、 タグエスケープしてしまうためです。
なので、 `REDASH_ALLOW_SCRIPTS_IN_USER_INPUT: "true" `を渡しても
Dashboard上で（プレビューも含め）入力したタグがそのまま表示されるだけになってしまう。

モジュールを marked に変えればうまく動きます。
（というか markdown0.5.0 ではどうやっても対応できない。）

# marked に変更する方法
## package.json
https://github.com/getredash/redash/blob/master/package.json#L69
の `"markdown": "0.5.0"` を削除して `"marked": "0.5.2"` に変更。

## client/app/filters/markdown.js
下記に書き換え。

```
// import { markdown } from 'markdown';
import marked from 'marked';

export default function init(ngModule) {
  ngModule.filter('markdown', ($sce, clientConfig) =>
    function parseMarkdown(text) {
      if (!text) {
        return '';
      }

      // let html = markdown.toHTML(String(text));
      let html = marked(String(text));
      if (clientConfig.allowScriptsInUserInput) {
        html = $sce.trustAsHtml(html);
      }

      return html;
    });
}
```

あとは npm run build とかすれば、ちゃんと動きます。

動いてる画像。
<img width="1201" alt="スクリーンショット 2018-12-06 15.24.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/146951/aa8b50bd-7f4c-0f7f-e24c-8367f18762e1.png">

PRでもだすか・・・
OSSのコンプライアンスに関するOpenChainプロジェクト

株式会社 日立製作所　野村祐治

# はじめに
OpenChainはLinux Foundationの公式プロジェクトです。
https://www.openchainproject.org/
OSSのコンプライアンスに関するプロジェクトで、今回はOpenChainプロジェクトの紹介と、日本で活動しているJapanWGの紹介をします。


# OpenChainプロジェクト
OSSサプライチェーン全体にわたる信頼を築くため、サプライチェーンの参加者が各組織内に確立すべきコンプライアンスプログラムの要件を、**OpenChain仕様**として定義し、その活用を推進するプロジェクトです。
OpenChain プロジェクトは、コンプライアンス プログラムの要件を定義する**”仕様”**、仕様への適合を自己認証する**”適合”**、仕様の要求事項の一つである社内教育プログラムに活用することを想定した、PowerPointスライド集の**”カリキュラム”**を3本の柱として活動しています。

2018年12月6日の時点は、以下の企業がPlatinum Memberとして参加が公表されています。
Adobe, Arm, Cisco, COMCAST, GitHub, Google, Harman, 日立, Qualcomm, SIEMENS, ソニー, 東芝, トヨタ自動車, Western Digital

![openchain.png](https://qiita-image-store.s3.amazonaws.com/0/320984/218781ad-fa9e-8512-d9b9-d2d5b726c2d6.png)

# OpenChainプロジェクトの三本柱
- 仕様 (Specification)
企業が組織内に確立すべきコンプライアンス プログラムの要件を定義する
https://www.openchainproject.org/spec
最新版はVersion 1.2
各国語訳 https://www.openchainproject.org/translations

- 適合 (Conformance)
質問に回答することで、上記仕様への適合を自己認証
https://www.openchainproject.org/conformance
自己認証すると会社名とロゴがWebサイトに表示される。

- カリキュラム (Curriculum)
仕様の要求事項の一つである社内教育プログラムに活用することを想定した、PowerPointスライド集


# OpenChain関連のメーリングリスト
以下のメーリングリストが存在します。興味のあるメーリングリストに参加しましょう。

- Main Mailing List
- Specification Mailing List
- Curriculum Mailing List
- Conformance Mailing List
- 日本WGのメーリングリスト (参加方法は下方)


# JapanWG
日本でもコンプライアンスは重要という課題意識の、以下のようなモチベーションで設立したWorking Groupです。
https://wiki.linuxfoundation.org/openchain/openchain-japanese-working-group
- 日本でコンプライアンスの意識を高めよう！
- 日本からアジアに向かってコンプライアンスの意識を高めよう！
- コンプライアンスに対する課題に関して情報交換しよう！
- 日本語で議論が出来る場を設けよう！


# Japan WG活動状況
Japan WGでは、メーリングリストでの議論や、定期的にミーティングを開いて情報交換を実施中です。

- 第1回会合　2017年12月27日(水)　 場所：ソニー本社クリエイティブラウンジ
- 第2回会合　2018年2月22日（木）　場所：日立　品川オフィス
- 第3回会合　2018年4月19日（木）　場所：パナソニック Wonder Lab Osaka（大阪）
- 第4回会合　2018年6月13日（水）　場所：トヨタ自動車名古屋オフィス（ミッドランドスクエア）
- 第5回会合　2018年8月31日（金）　場所：富士通川崎工場（神奈川県川崎市）
- 第6回会合　2018年10月31日（水） 場所：東芝（神奈川県川崎市幸区）
- 第7回会合　2018年12月5日（水）　場所：テュフズードジャパン（東京都新宿）

活動状況は、Japan WGのWikiに纏めていますので、ご参照ください。


# JapanWG活動内容
サブグループを作って、テーマ毎に活動しています。本記事の執筆時点では以下のサブクループで活動しています。

- Planning サブグループ
- FAQ サブグループ
- サプライチェーン上流向けリーフレット サブグループ
- 役割向け教育資料 サブグループ
- 組織間のライセンス情報授受 サブグループ


# 活動への参加方法
誰でも参加できます。まずは、メーリングリストに参加しましょう。メーリングリストへの参加は以下の手順で行います。

- ① https://lists.linuxfoundation.org/mailman/listinfo/openchain-japan-wg にアクセスして、メールアドレス等の情報をご登録ください。
- ② 手順①で登録していただいたアドレスに、Your confirmation is required to join the Openchain-japan-wg mailing list という件名のメールが届きます。 
- ③ 手順②のメールに記載の確認手順を実施してください。
- ④ 依頼メールがML管理者に届き、管理者が承認操作を実施します。
- ⑤ 承認操作が完了しますと Welcome to the “Openchain-japan-wg” mailing list という件名のメールが届きます。これで完了です。

# おわりに
OSSのコンプライアンスは難しいかもしれませんが、仲間が沢山います。是非一緒に活動しましょう。
gdbでデバッグ

Azure Sphereの開発・デバッグはVisual Studioが使えるので、gdbでやりたい人は少ないと思いますが、、、
gdbでも可能です。

# デバイスをデバッグ可能にする

`azsphere device prep-debug`コマンドで、デバイスのデバッグを有効にします。
このとき、設定変更とともに、デバイスにgdbserverがインストールされます。

```
C:\>azsphere device prep-debug
```

# イメージをデバイスに書き込む

`azsphere device sideload delete`コマンドでインストールされているイメージを削除してから、`azsphere device sideload deploy`コマンドでイメージをデバイスに書き込みします。

```
C:\>azsphere device sideload delete
C:\>azsphere device sideload deploy -m -p Mt3620App1.imagepackage
```

# デバッグモードでアプリケーションを起動する

`azsphere device sideload start`コマンドに-dオプションを付けて、デバッグモードでアプリケーションを起動します。このとき、Component IDを指定しなければいけないので、`azsphere device sideload show-status`で確認します。
アプリケーション起動といっても、ここではアプリケーションは実行開始されません。デバッグ開始可能な状態になります。

> この例では、Component IDは`8fdb970b-cd84-44ae-9f83-fdcd70deef28`です。

```
C:\>azsphere device sideload show-status
8fdb970b-cd84-44ae-9f83-fdcd70deef28: App state: stopped

Command completed successfully in 00:00:01.4743683.

C:\>azsphere device sideload start -d -i 8fdb970b-cd84-44ae-9f83-fdcd70deef28
8fdb970b-cd84-44ae-9f83-fdcd70deef28
App state   : debugging
GDB port    : 2345
Output port : 2342

Command completed successfully in 00:00:01.3325013.

C:\>
```

# 出力ウィンドウをモニタリング

TeraTermなどを使って、192.168.35.2:2342をモニタ開始しておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/e820f719-3d6d-71e5-f391-6d42bdc51786.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/bc1526fd-8b34-cfcc-cae4-369f0d4ab8c5.png)

# gdbでアプリケーションを実行開始する

`arm-poky-linux-musleabi-gdb`コマンドでgdbを起動し、`target`、`c`でアプリケーションを実行開始します。

```
C:\>arm-poky-linux-musleabi-gdb Mt3620App1.out
(gdb) target remote 192.168.35.2:2345
(gdb) c
Continuing.
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109634/f85f3710-251b-dc47-a5b0-6fc311d036fc.png)

# まとめ

* Azure Sphereの開発・デバッグにgdb使うことができる。
* 出力ウィンドウのデリミタはLF。
* TeraTermなどで一度接続すると、再度デバッグモードで起動しないと再接続できない。
visual Studio 2017おすすめ拡張機能

#visual Studioおすすめ拡張機能
自分の環境の整理と、拡張依存のコメント等が増えてきたため記録しておきます。
雑な解説ですが許して下さい

##[Dracula Theme](https://draculatheme.com/visual-studio/)

visual Studioのデフォルトのカラースキーマが好きじゃないので自分が一番見やすいと思うエディターの背景とカラースキーム

##[CodeAligment](https://marketplace.visualstudio.com/items?itemName=cpmcgrath.Codealignment)

変数などで行がそろわないといった問題を解決する。

##[Outputenhancer](https://marketplace.visualstudio.com/items?itemName=NikolayBalakin.Outputenhancer)
ログファイルにカラーを付ける、successに緑,errorに赤色,warningに黄色といったように表示される

##[Remarker](https://marketplace.visualstudio.com/items?itemName=GilYoder.Remarker-18580)

コメントのサイズを変えたりコメントの色を変えたりする。
これで書かれたコメントをこの拡張を持っていない人に渡すと、大きな混乱を与える

##[Tabs Studio](https://marketplace.visualstudio.com/items?itemName=SergeyVlasov.TabsStudio-documenttabsmanagerforVisualStudioIDE)

タブに色を付けたり

##[File Path ON Footter](https://marketplace.visualstudio.com/items?itemName=ShemeerNS.FilePathOnFooter)
ファイルパスをフッターに表示
arduino spresense raspberry 比べてみた。

#概要
arduino spresense raspberry 比べてみた。

#比較表


| |Arduino Uno|Spresense|Raspberry Pi 3B|
|:--|:--|:--|:--|
|Processor type|AVR|ARM M4F|ARM A53|
|Bits|8|32|64|
|Number of cores|1|6|4|
|Clock speed|16 MHz|156 MHz|1.2 GHz|
|Operating system|None|Nuttx|Linux|
|Boot time|0|<1 second|~20 Seconds|
|RAM|0.002MB|1.5 MB|1000MB|
|FLASH|0.032MB|8 MB|None|
|SD Card|Shield|On-Board, optional|On-Board, essential|
|eMMC|None|Shield|None|
|EEPROM|0.001MB|Use Flash|Use microSD card|
|Voltage|5v or 6-20V|5V or LiPo(3.7V)|5V|
|Typical Operating Power|50 mW|100mW + low power modes|2400mW|
|audio Quality|Shield|High|Low|
|Microphones|Shield|up to 8 microphone|Stereo|
|Speakers|Shield|Stereo|Stereo|
|GNSS|Shield|GPS & GLONASS|Shield|
|Time|Shield|RTC|Shield|
|IO Pins|14|29 + 4 LED|27|
|IO voltage|5V|5V/3.3V/1.8V|3.3V|
|UART|1|2|2|
|SPI|1|1 (3.3/5v) +1 (1.8V)|1|
|I2C|1|1 (3.3/5V) +1 (1.8V/camera)|2|
|PWM|6|4|1|
|adc Channels|6|6|None|
|Bits|10|10|None|
|Fastest rate|~10 kHz|500 kSPS|None|
|USB|1 device|2 device|4 host|
|Camera|Shield|5M Pixel|8M Pixel|
|Video display|None|SPI up to 360x240 Pixel|HDMI, DSI|
|WiFi|Shield|Shield|802.11n|
|Bluetooth|Shield|Shield|4.1 Classic, Low Energy|
|Ethernet|Shield|Shield|10/100|
|Cellular|Shield|Shield|Shield|
|価格|約3000円|約6000円|約5000円|

以上。
Office365 Excel 右クリックから読み取り専用で開くを有効にする方法

### 環境
* Office365 Excel Buisiness

### 背景
Officeもついに使用するのが365となり、読み取り専用で開くバグ?仕様も直っているかと思いきやぜんぜん直っていなかったため、その方法についてまとめます。基本的に旧Officeとそんなに変わらないように思えます。

Excelファイルを[Shift]キーを押しながら右クリックすると下記のように読み取り専用で開くというメニューが出ます。これはExcelファイルを複数人で使用している場合には非常に有用な機能でExcelをロックせずに開けるので多用します。また一時ファイルを作らないため、他の人から開いていることもわからないです。資料を参照するときに多用します。
ところが、この機能は通常ではなぜか機能しません、レジストリの変更が必要になります。
![](https://qiita-image-store.s3.amazonaws.com/0/160188/7cc61dd4-6e63-62ae-7f1d-764868655af2.png)

### レジストリの変更
~~以下のキーを設定します。旧バージョンでも基本的に同じはずです。~~

~~[HKEY_CLASSES_ROOT] -> [Excel.Sheet.12] -> [shell] -> [OpenAsReadOnly] -> [ddeexec] -> [規定]~~
~~[HKEY_CLASSES_ROOT] -> [Excel.Sheet.8] -> [shell] -> [OpenAsReadOnly] -> [ddeexec] -> [規定]~~
~~[HKEY_CLASSES_ROOT] -> [Excel.Sheet.5] -> [shell] -> [OpenAsReadOnly] -> [ddeexec] -> [規定]~~

~~必要に応じて(*.xlsm)~~
~~[HKEY_CLASSES_ROOT] -> [Excel.SheetMacroEnabled.12] -> [shell] -> [OpenAsReadOnly] -> [ddeexec] -> [規定]~~

```
[open("%1",,1,,,,,,,,,,,,1,,1)]
```

~~上記だけではうまくいかない場合もあり、その場合、同じ階層にある~~
[HKEY_CLASSES_ROOT] -> [Excel.Sheet.12] -> [shell] -> [OpenAsReadOnly] -> [command] -> [規定]
[HKEY_CLASSES_ROOT] -> [Excel.Sheet.8] -> [shell] -> [OpenAsReadOnly] -> [command] -> [規定]
[HKEY_CLASSES_ROOT] -> [Excel.Sheet.5] -> [shell] -> [OpenAsReadOnly] -> [command] -> [規定]
[HKEY_CLASSES_ROOT] -> [Excel.SheetMacroEnabled.12] -> [shell] -> [OpenAsReadOnly] -> [ddeexec] -> [規定]

を以下のように変更する

```
"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE" /h "%1"
↓
"C:\Program Files (x86)\Microsoft Office\Root\Office16\EXCEL.EXE" /r "%1"
```

/hって http用の起動スイッチみたい。完全に読み取り専用と関係なさそう。そして参考のリンク読む限りはExcelには必要なさそう。めちゃくちゃだな。

![](https://qiita-image-store.s3.amazonaws.com/0/160188/ce701bd4-040d-da97-c8c7-3a2f8211d148.png)

commandの値を/rに変更するだけで読み取り専用にできました。
他のバージョンではDDEの値を変更して直した記憶があるんですが、もうよくわからん。

### 参考
http://www.shegolab.jp/entry/windows-excel-read-only
https://support.office.com/ja-jp/article/microsoft-office-%E8%A3%BD%E5%93%81%E3%81%AE%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89-%E3%83%A9%E3%82%A4%E3%83%B3-%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81-079164cd-4ef5-4178-b235-441737deb3a6#ID0EAABAAA=Excel
ヒューマノイドロボットNAOでできること メモ

ヒューマノイドロボットNAOでできることと環境構築の際に参考にしたページのメモ

#⃣NAOの仕様

公式HP

http://www.nao-partner.com/

開発元：ソフトバンクロボティクス株式会社

寸法：574×275×311mm（H×D×W）
重量：5.4kg
機能：WiFi、触覚センサー、指向性マイク、HDカメラ、スピーカー、赤外線センサー、超音波、把握動作が可能な手、感圧抵抗体センサー、慣性ユニット、LITHIUM BATTERY、金属ギア、バンパー

動く：慣性ユニットによりバランスを取ったり、直立や横たわっている状態を理解できます。

感じる：頭や両手足にある複数のセンサーと音波センサーにより、周囲の環境を感知します。

聞く、話す：4つの指向性マイクとスピーカーにより、話を聞いたり話したりすることができます。

見る：形やオブジェの認識を可能にする2つのカメラを搭載しています。

接続する：インターネットに接続できるため、クラウド上の知能や情報を使った表現が可能となります。

カスタマイズする：ソフトウェア「Choregraphe」を使用するとNAOを簡単に動かすことができます。

#⃣NAOを動かすにはコレグラフが必要

コレグラフのダウンロード方法

https://www.softbank.jp/robot/consumer/support/trouble/data/choregraphe/

#⃣ChoregrapheのTips集

https://qiita.com/Ryo87/items/f7792422a14289f00dba

#⃣NAOqi / コレグラフ APIモジュール一覧（ver. 2.3.0）

https://qiita.com/robotstart/items/d89228a8ae2ae431c8cc

#⃣NAOをコレグラフに接続する

https://community.ald.softbankrobotics.com/ja/resources/faq/%E9%96%8B%E7%99%BA%E8%80%85/%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%82%92choregraphe%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F

#⃣バーチャルロボットがNAOにならない時は

https://community.ald.softbankrobotics.com/ja/resources/faq/%E9%96%8B%E7%99%BA%E8%80%85/%E3%82%B3%E3%83%AC%E3%82%B0%E3%83%A9%E3%83%95%E3%81%A7%E3%83%90%E3%83%BC%E3%83%81%E3%83%A3%E3%83%AB%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82

#Pthonを使う

Naoの開発環境（Python SDK編）

http://revast-blog.com/top/?p=59
git pushを楽にしてくれる関数を作った

## 環境

* Mac OSX 10.14.1
* zsh

## めんどくさいと感じていたこと

`master`ブランチと`hoge`ブランチがあったとする。
`hoge`ブランチで作業をし終わって、`hoge`ブランチをリモートにプッシュするときにいつも、ブランチ名をコピーして`git push origin ブランチ名`のようにしていた。

```
$ git push origin ブランチ名
```

## 関数を作った

そこでごくシンプルな関数を作った。

シェルは`zsh`を使っているので、`zsh`の設定ファイル(`.zshrc`)に以下を書けばOK。

```shell
gp () {
  # 現在のブランチ名を文字列として出力した結果を変数BRANCHに格納
  BRANCH=$(git rev-parse --abbrev-ref HEAD)
  git push origin $BRANCH
}
```

これを書いたら、`source ~/.zshrc`とかで設定を反映させてリポジトリのディレクトリまで移動して

```
$ gpb
```
とすれば、現在のブランチをリモートにプッシュ出来る
プログラミングを基礎から学び直す方法＋それを調べるための検索力（ググる力）：社会に共有された情報を検索する

昨日独学会なるもの立ち上げましたaimofです。

* 失業中で時間のあるうちにプログラミングを基礎から再習得したい
* 独学会はいろんな分野の人が集っているので、どの分野でも共通の検索力を整理したい

上記理由から、プログラミングを基礎から再独学する方法をグーグル検索で調べることにしました。
もともと知っていることもないことはないですが、何も知らない体で検索していきます。

## 目的

* プログラミング歴3年、業務経験1年半のプログラマ（サーバサイド）が次の職に備えて改めて習得しておくべきことを調べる
* 上記を実現するためのググり方を実演する

### 注意点

検索方法については、私はこうしているよ！というだけなのでもっといい方法があったらご指摘お願いします！

## プログラミング再習得方法のググり方

1. キーワードのピックアップ
2. それぞれ検索(1０記事目安に読む)
3. 読みながらメモを取る
4. 新しいキーワードを見つけたらリストに追加
5. こんなものかなと思ったらそこで止めてやり方をまとめる

上記手順でやっていきます。

### 初期キーワードたち

![IMG_20181206_135300.jpg](https://qiita-image-store.s3.amazonaws.com/0/140543/8e94a2a2-605f-e316-d5aa-d966df2469ec.jpeg)

質の悪いキーワードが多めです。

### 「プログラミング 基礎 習得」

いきなりのハズレワードでした。（検索力の低さが露呈する……）。業者の広告ばかり……。開いて読みましたが毒にも薬にもならないような当たり障りのないことばかり書かれており、なんかいまいち

次のキーワードに移りましょう。

###「プログラミング 必須 分野」

[あたりっぽい記事](https://www.goethekyodai.xyz/entry/programming-field_)発見。プログラミング習得に必要な分野が、習得順序の関係と一緒に出てきました。

その他の記事（業者記事が多かった）も含めた結論として、

![IMG_20181206_141302.jpg](https://qiita-image-store.s3.amazonaws.com/0/140543/48a1a1b7-6f3f-c4f7-edfb-ac01c39a9fa2.jpeg)

（白い紙の順番はミスった）

必要なバックグラウンド知識（主に数学）を補いながら白い紙のワードを学べば良さそうです。

ただし、これでは理論に偏るので実務的な方も調べてみましょう。

### 「プログラミング 実務 基礎」

業者記事ばかりで良い情報に当たれない……

こういうときには、先輩エンジニアが若手に知っておいてもらいたい実務知識を検索してみましょう。

### 「プログラミング 若手 実務 教えること」

[この記事](https://blog.3qe.us/entry/2016/02/06/205620)経由で[プログラマ能力指標表というPOSTDの記事](https://postd.cc/programmer-competency-matrix/)という記事を見つけました。

…………

グサグサグサッ。
今までのらりくらりやってきた私には刺さる記事です。わからないこと多すぎィ。
こいつ一人でいいんじゃないかなレベルで必要なことがまとまっているぜ。

実務的なことを調べても基礎理論からやれ、という考え方が主流であることが検索からわかったので、億劫がらずに基礎をやることにします。

## 学び直す内容

プログラマ能力指標表のうち独学で満たせるものを埋めていくことにしましょう。
（自分の経験に照らし合わせて基本的には従って良さそうです）

実務で調べて基礎に当たるということは、まず基礎からやれということかと思いますので、実務知識は一旦保留して基礎を最初に学びましょう。

他のワードは大したことなかったので割愛。

## この後！

この後は、見つけた表の足りない部分を埋めていくことになります。
検索方法としては、そのたびに今やった作業を行います。

ただし、記事が古めせいか、自分の経験と照らし合わせて足りない部分が見えます。

* アーキテクチャ
* コンテナ仮想化
* OSS

あたりでしょうか。
上２つはここに書いてある内容に比べて高度な気がするので後に回すとして、OSSとどう関わるべきかを検索しましょう。

### 「OSS 初心者」

検索内容をまとめると

たとえ初心者であってもOSS活動には関わったほうが良い。

関わり方は、

1. ウォッチする
2. 使う
3. Issueを立てる
4. 読む

あたりがとっつきやすそうです。

（補足：もちろん、プルリクや議論で貢献できるならそれも大事です。今から思い返すとゴミのようなプルリクに優しくなぜダメなのか教えてもらったことがあります）

## まとめ

検索しながらプログラミングを再学習する方法を調べてきましたがいかがでしょうか？
私はこれから、リストで書けていたところを埋めていきます。

実務経験の積み方はやはり働くしかなさそうなので、基礎を固めつつ就職のことも考えます。

### 追記

「ドキュメンテーションと情報共有 Advent Calendar 2018」に飛び入り参加させていただきました！
Nextcloud の自動ファイル削除機能

#はじめに
Nextcloud上にファイルを保存していると、使わないファイルが残ったままとなり、無駄なストレージ領域が蓄積されてきます。ファイルサーバやオンラインストレージの全般的な課題かと思いますね。今回は、自動ファイル削除機能を紹介したいと思います。

#プラグイン
いつものように、これです。「Retention」
![画像122.png](https://qiita-image-store.s3.amazonaws.com/0/308127/bfdcad98-ed1e-a6ab-d739-069692829278.png)

管理者画面では、[タグ付け機能](https://qiita.com/mmisu/items/376f1b3dbee819515b26)と同じワークフローの項目です。ここのファイル保持で設定します。
![画像124.png](https://qiita-image-store.s3.amazonaws.com/0/308127/a399974d-6c79-8dd6-d93b-c5ecdce680b7.png)

まず、自動削除するタグを選択します。わかりやすいように、「30日で削除するファイル」という名のタグを設定します。
![画像125.png](https://qiita-image-store.s3.amazonaws.com/0/308127/81c85b8b-8c90-30ae-3824-2c885fb69861.png)

次に、ファイルを保持する期間（自動で削除する日）を設定します。これで作成ボタンを押すだけです。
![画像126.png](https://qiita-image-store.s3.amazonaws.com/0/308127/c601fdb1-7719-dcd4-efb2-84500b861565.png)

このように設定されました。後は、期間が過ぎるのを待つだけです。
![画像127.png](https://qiita-image-store.s3.amazonaws.com/0/308127/0523911d-408d-ae20-39f0-d221e896b6c8.png)

#まとめ
別記事で紹介した、[オートタギング機能](https://qiita.com/mmisu/items/a34195bf9f84728ed66f)と組み合わせれば、よりよいファイル管理ができそうですね。（オートタギングやファイルアクセス制限もですけど、誰がルール考えるんだとは思いますが）

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
[Ruby] "0" から始まるデータを含む CSV ファイルの読み込みには CSV.table ではなく CSV.read を使う

# TL;DR

```ruby
CSV.read(csv_file_path, { headers: true, header_converters: :symbol })
```

# 説明

`ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin17]` にて検証．

### CSV.table を使った読み込み (失敗)

例えば，以下のような住所データの CSV ファイルを読み込んで使いたい場合，

```addresses.csv
zipcode,prefecture,city,town
"0640941","北海道","札幌市中央区","旭ヶ丘"
"0600041","北海道","札幌市中央区","大通東"
"0600031","北海道","札幌市中央区","北一条東"
```

`CSV.table` を使うと "0" から始まるデータが正しく読み込まれない．

```ruby
require 'csv'

CSV.table('./addresses.csv').each do |row|
  puts "#{row[:zipcode]} #{row[:prefecture]} #{row[:city]} #{row[:town]}"
end
```

実行結果

```
640941.0 北海道 札幌市中央区 旭ヶ丘
196641 北海道 札幌市中央区 大通東
196633 北海道 札幌市中央区 北一条東
```

### 原因

`CSV.table` が `CSV.read` を呼ぶときに `converters: :numeric` を指定しているから．

参考 : https://docs.ruby-lang.org/ja/latest/class/CSV.html#S_TABLE

```ruby:lib/ruby/2.5.0/csv.rb
#
# A shortcut for:
#
#   CSV.read( path, { headers:           true,
#                     converters:        :numeric,
#                     header_converters: :symbol }.merge(options) )
#
def self.table(path, **options)
  read( path, { headers:           true,
                converters:        :numeric,
                header_converters: :symbol }.merge(options) )
end 
```

### CSV.read を使った読み込み (成功)

ということで， `CSV.read` に `convertes:` 以外のオプションを指定して呼べばよい．

```ruby
require 'csv'

CSV.read('./addresses.csv', { headers: true, header_converters: :symbol }).each do |row|
  puts "#{row[:zipcode]} #{row[:prefecture]} #{row[:city]} #{row[:town]}"
end
```

実行結果

```
0640941 北海道 札幌市中央区 旭ヶ丘
0600041 北海道 札幌市中央区 大通東
0600031 北海道 札幌市中央区 北一条東
```

# 余談

Shift_JIS で書かれた Windows の改行コード (CR+LF) のファイルを， UTF-8 で Unix の改行コード (LF) に変換するには，nkf に以下のオプションを指定すればよい． (**ファイルを上書きするので注意**)

```
% nkf -w -Lu --overwrite addresses.csv
```
ESXi ホスト側にある特定の VIB を消す

#用途
NSX 環境の更新の際に Guest Introspection のファイルが ESXi ホスト側に残る場合など、不要な VIB ファイルの削除方法。

##ESXiホスト側にある VIB を消す。

###削除リハーサル ※重要

再起動は不要であることが分かる。

```
[root@esxi1:~] esxcli software vib remove -n epsec-mux --dry-run
Removal Result
   Message: Dryrun only, host not changed. The following installers will be applied: [LiveImageInstaller, BootBankInstaller]
   Reboot Required: false
   VIBs Installed:
   VIBs Removed: VMware_bootbank_epsec-mux_6.5.0esx65-5556069
   VIBs Skipped:
```

###削除本番

```
esxcli software vib remove -n epsec-mux
```

以上。
Rails アプリを eager_load! してみることでプロダクション環境での出落ちを未然に防ぐ

#### 環境
Rails 5.2.1.1

## デプロイしたら Rails が出落ちした
ある日いつものように Rails アプリをデプロイすると、未定義の module を include しようとしていたことが原因で Rails がアプリケーションの読み込みに失敗し、`uninitialized constant ... (NameError)` を吐いてクラッシュしてしまいました。

## 開発環境では動いたんだけど…
本番またはステージング環境では、開発環境と違って環境毎の設定ファイルに

```ruby:config/environments/production.rb
config.eager_load = true
```

と書くことで Rails が起動時にアプリ全体を読み込むように設定すると思いますが、このときアプリ全体に少しでも読み込みに失敗するようなコードがあると Rails はクラッシュしてしまいます。</p><p>今回はデプロイ前に RuboCop の警告がないことを確認し、RSpec による単体テストを通してはいましたが、該当部分を通るテストケースがなかったために、読み込めないソースコードが存在することに気づくことができませんでした。

## 出落ちを未然に防いだ
単体テストが Rails アプリの全てのコードが読み込まれる程度にはしっかり書かれているのが理想ですが、完璧に網羅し続ける自信はありません。そこで、CI の Job に以下のコマンドを追加し、CI パイプライン内で Rails がアプリケーションの読み込みでエラーを起こさないことを確認するようにしました。

```bash
bundle exec rails runner Rails.application.eager_load!
```

これでデプロイ前に、少なくとも Rails が読み込みに失敗するようなコードが無いことを CI で保証できるようになりました。別のアプローチとして、以下のようにテスト時に環境変数で `eager_load` を行うかを流し込めるようにするアプローチも見つけました[^1] が、テストケースの失敗とアプリケーションの読み込みの失敗を分けて把握したかったので、一旦上のような形に落ち着きました。

```ruby:config/environments/test.rb
config.eager_load = ENV.fetch('EAGER_LOAD', '0') == '1'
```

[^1]: https://github.com/rails/rails/issues/28736#issuecomment-293822999
[論文メモ] From Word Embeddings To Document Distances

"Word Mover's Embedding: From Word2Vec to Document Embedding"を読むために必要なところだけまとめる。

# 情報
* From Word Embeddings To Document Distances
* この記事の画像は全て上記論文から転載した。


# Abstract
* テキスト間の距離を表すWord Mover's Distance(WMD)を定義する。
* WMDとKNNを組み合わせて文書分類のタスクに取り組む

# Introduction
* 既存の方法（BOW）では下記2つの文は似ているにもかかわらず似ていると判定できない
    * Obama speaks to the media in Illinois.
    * The President greets the press in Chicago.
* 他にも既存の方法として、TFIDF/BOW、LSI、LDAなどがある。

# Word Mover's Distance
### Notation
* word2vecによるembedding: $X \in R^{d \times n}$
* ボキャブラリーサイズ: $n$
* embeddingの次元: $d$
* normalized bag-of-words (nBOW): $d \in R^n$

### nBOW representation.
- nBOWだとintroductionで触れたように意味的には近くても同じ単語を使われていない文章は距離が遠くなるという欠点がある。

### Word travel cost.
- word2vecによるembeddingで単語間の距離を定義する。
- 単語$i$と$j$の距離を$c(i, j)=|| x_i - x_j||_2$ とする。

### Document distance
- 文書$d$の単語$i$と文書$d'$の単語$j$の移動コストを$T_{ij} \geq 0$とする。
- $\sum_j T_{ij} = d_i$
- $\sum_i T_{ij} = d'_j$
- 文書間の距離を$\sum_{i,j} T_{ij}c(ij)$と定める。
- $T_ij$は下記の最小化問題と解くことで求める。

### Transportation problem.
$$\min_{T \geq 0} \sum_{i,j=1}^n T_{ij} c(i, j)$$
subject to:
$$\sum_j T_{ij} = d_i$$
$$\sum_i T_{ij} = d'_j$$
- 実際にこの問題を特には計算コストが非常に高いのでコストが低い問題に置き換える（精度は探る）
### 例 
![スクリーンショット 2018-12-06 13.53.23.png](https://qiita-image-store.s3.amazonaws.com/0/199247/1f470ac7-ebce-c59f-e807-8acfdb2bdc62.png)

# 終わり
- "Word Mover's Embedding: From Word2Vec to Document Embedding"を読むために必要なところだけで良いので一旦ここまで。