OmniAICreator/Qiita-1.07M huggingface dataset:
[VS2017][C#] MsTestで単体テストを行なう方法

VS2017のC#プロジェクトでMsTestの単体テストを作成する方法メモ

# テストの追加方法
C# .NET プロジェクトでは以下の操作を行なう

+ ファイル => 追加 => プロジェクト を選択
+ Visual C#/テスト => 単体テスト プロジェクト(.NET Framework)　を選択
+ 作成された単体テストプロジェクトの、参照を右クリック => 参照の追加を選択
+ プロジェクト => ソリューション からテスト対象のプロジェクトへの参照を追加

# 基本的な使い方
以下の記事でほとんど説明されているため、以下を参照すると良いと思います。

[MsTestによるユニットテストの解説 - Qiita](http://qiita.com/mima_ita/items/55394bcc851eb8b6dc24)

公式(MSDN): [単体テストの基本](https://msdn.microsoft.com/ja-jp/library/hh694602.aspx)

# テストユーティリティ
## Chaining Assertion
プライベートメソッドとかパラメータを使ったテストとかを書きやすくできるらしい（検証中）

[Chaining Assertion - Home](http://chainingassertion.codeplex.com/)
[neuecc/ChainingAssertion: Method Chaining base UnitTesting Extension Methods and Dynamic Private Accessor for MSTest, NUnit, xUnit.net.](https://github.com/neuecc/ChainingAssertion)
[MSTestでプライベートメソッドのテストを行う（自力） - なか日記](http://blog.nakajix.jp/entry/2013/04/04/232625)

# 既知の不具合
## MSTestのテスト項目がテストエクスプローラーに表示されなくなる
`%TEMP%\VisualStudioTestExplorerExtensions` を削除すると表示されました。
`%TEMP%` は `C:\Users\username\AppData\Local\Temp` あたりになっているはずですが、環境変数を確認してください。

参考：
[c# - Unit Tests not discovered in Visual Studio 2017 - Stack Overflow](https://stackoverflow.com/questions/42861930/unit-tests-not-discovered-in-visual-studio-2017)

### ReShaperで同様にテストが実行できなくなる
`%TEMP%\JetBrains\ReSharperPlatformVs15\vAny_XXXXXX` を削除すると表示されました。

## .NET 4.5 から .NET 4.6 環境に上げるとでVisualStudioで動作しなくなる（コマンドラインからは実行できる）
NuGetのパッケージで以下のパッケージの両方が入っているか確認してください。
（自分の場合はMSTest.TestAdapterだけが入っていなくて動作しませんでした）

+ MSTest.TestFramework 
+ MSTest.TestAdapter

# 関連
[[C#][.NET][WPF] WPFと関連知識まとめ - Qiita](http://qiita.com/koara-local/items/c58ca6b83e46b7c6125c)
よく使うDockerコマンド

Docker初心者がインストールしてから実行したコマンドをまとめます。

# Docker インストールから起動まで
``` linux:command
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
yum -y install http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm
yum -y install docker-io
service docker start
```

# pull - イメージの取得
``` docker:command
docker pull ｛イメージ名｝:｛タグ名｝

e.g.
docker pull centos:latest
```

タグ名は省略することができます。
省略した場合はlatestと同じになります。

# images - 取得したイメージの一覧表示
``` docker:command
docker images
```

# rmi - 取得したイメージの削除
``` docker:command
docker rmi リポジトリ名:タグ
or
docker rmi イメージID
```
下記エラーがでることがあるが、削除対象のイメージから別のイメージを作成した場合は削除できないようです。その場合は、削除対象のイメージから作ったイメージも削除する必要があるので注意。

> Error response from daemon: conflict: unable to delete d95b5ca17cc3 (cannot be forced) - image has dependent child images


# tag - 取得したイメージのタグ付け(イメージ名変更)
``` docker:command
docker tag リポジトリ名:タグ 新イメージ名:タグ
or
docker tag イメージID 新イメージ名:タグ
```
この場合、元のイメージと新イメージの2つできる。
不要であれば、イメージの削除で元のイメージを削除する。


# run - コンテナ作成
以下のコマンドはbashを起動する。起動後にexitコマンドを実行するとコンテナを終了する。
Control + p + q とするとコンテナを起動したままコンテナを抜けることが出来る。

``` docker:command
docker run -i -t centos /bin/bash
```

# ps - 起動中のコンテナ確認
``` docker:command
docker ps
```
-a オプションを使うと起動中と停止中のコンテナが表示されます。

# stop - コンテナ停止
``` docker:command
docker stop コンテナID
```
コンテナIDは ps コマンドで確認してね。
コンテナIDは識別できるところまで入力すればよい。

# start - コンテナ起動
``` docker:command
docker start コンテナID
```

# attach - 起動中のコンテナに接続
``` docker:command
docker attach コンテナID
```

# rm - コンテナ削除
``` docker:command
docker rm コンテナID
```
停止後にコンテナを削除したい場合は以下。

``` docker:command
docker run -rm
```


# logs - ログ確認
``` docker:command
docker logs コンテナID
```


# top - コンテナのプロセス確認
``` docker:command
docker top コンテナID
```


もっと細かいことあるけど、別の記事で書くことにします。
mod_wsgiでhello worldを描画する

## はじめに
ゴールは「mod-wsgiを使用して"Hello World"を描画すること」です。[mod-wsgiとは?](http://www.weblio.jp/content/mod-wsgi)
Python製WebFramework Djangoを使用する上でも使用します。

前提として以下を行なっているものとします。
- [pyenv と pyenv-virtualenv をインストールする
](http://qiita.com/shigechioyo/items/198211e84f8e0e9a5c18)

環境
OS: Debian 9.0 stretch
Python: 3.6.3

## apache2のinstall
apache2をインストールします

```bash
sudo apt install -y apache2 apache2-dev
```

## mod-wsgiのinstall
少し注意が必要です。というのも、インストールする方法がapt-getとpipの二通りあるからです。
apt-getの場合、インストールされるのはapache2のlibapache2-mod-wsgiなのですが、こいつは後にコンパイルされたPythonと実行しているPythonの違いによるwarningを吐き出すことになります。
ということで、pipを使ってインストールすることをオススメします。

まず、使用したいpythonのバージョンが選択されているか確認してください

```
pyenv versions
```

確認できたら、mod-wsgiのinstall

```bash
pip install mod-wsgi
```

念のために確認

```bash
pip freeze | grep wsgi

mod-wsgi==4.6.5
```
OKです。

# apache2の設定
libapache2-mod-wsgiをインストールした場合とは違い、少し設定が必要になります。
pipでのmod-wsgiインストール時に下記のファイルが作成されています。

```
/home/USERNAME/.pyenv/versions/3.6.3/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
```

このファイルをapache2に認識させてあげましょう。

```bash
sudo vim /etc/apache2/mods-available/wsgi.load
```

以下の一行を書き込みます。USERNAMEを置き換えるのを忘れないでください。

```
LoadModule wsgi_module /home/USERNAME/.pyenv/versions/3.6.3/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
```

その後、wsgiを有効化しましょう。

```bash
sudo a2enmod wsgi
```

以下のようなコメントが出ればOKです。

```
Enabling module wsgi.
To activate the new configuration, you need to run:
  systemctl restart apache2
```

apache2を再起動してください。

```bash
sudo service apache2 restart
```

## Apache2の設定
Apache2の設定ファイル群(/etc/apache2/)をいじりますが、念のためにバックアップをしておきましょう。

```bash
cd /etc/apache2/sites-available
sudo cp 000-default.conf 000-default.conf.bk
sudo vim 000-default.conf
```

以下を最後の行に追加します。
ちなみに、vimでは`G(shift + g)`で最終行に移動しますね。

```
WSGIScriptAlias /test_wsgi /var/www/html/test_wsgi.py
```


## test_wsgi.pyを作成
上のWSGIScriptAliasで指定したtest_wsgi.pyファイルを作成します。

```bash
sudo vim /var/www/html/test_wsgi.py
```

ファイルの中身は以下の通りにしてください。

```python
def application(environ, start_response):
    status = '200 OK'
    output = b'Hello World!'

    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]
```

## apache2のリスタート
上記が完了したらapache2をリスタートします。

```bash
sudo service apache2 restart
```

この後、ドメイン名(またはIP)/test_wsgiにアクセス(Http←気をつけて)するとHello Worldが表示されるはずです。
Framerの醍醐味！Moduleを使いこなす

Framerの魅力の一つに**拡張性の高さ**が挙げられます。
AtomやSublimetextのように、世界中の開発者、デザイナーたちが作成した拡張機能を、皆が使うことができるのです。
![スクリーンショット 2017-03-12 8.41.45.png](https://qiita-image-store.s3.amazonaws.com/0/54076/70f09f86-fe4f-b96d-fc73-ae0b8fce6898.png)
[こちら](https://framer.com/getstarted/resources/#modules)の公式サイトのModuleコーナーには、人気のモジュールがリストアップされています。

今回は、framer-material-kitを例に、**世に公開されているモジュールを、自分のFramerプロジェクトに導入する方法**をお伝えします。

## framer-material-kitとは
![スクリーンショット 2017-03-12 8.46.25.png](https://qiita-image-store.s3.amazonaws.com/0/54076/50e8ed9d-0b8d-b95f-0853-f1286240633b.png)

dialogやtoast, toolbarなど、マテリアルデザインに準拠したアプリなら使うことが多いであろう要素をモジュール化して使いやすくしてくれています。

## ①　プロジェクトをダウンロードしてくる
FramerのモジュールはGitHubで公開されていることが多いです。モジュールのページにアクセスして、ダウンロードボタンを押します。
![Group.png](https://qiita-image-store.s3.amazonaws.com/0/54076/6cdb7301-b2e5-0534-1fc4-418e683f4872.png)

## ②　FramerのModuleフォルダにmoduleをコピーする
ダウンロードしたらzipファイルを解凍し、`framer-material-kit-master/Material Kit Module`の中身を、自分のFramerプロジェクトの`プロジェクト名.framer/modules`の中にコピーします。
![Group.png](https://qiita-image-store.s3.amazonaws.com/0/54076/e90605e2-1508-7dfa-98d6-f213a8b54b85.png)

## ③　Moduleの呼び出し方を確認する
たいていのModuleのgithubにはそのmoduleの呼び出し方が載っています。(READMEを参照)
ここでは、Framerの中で`m = require 'material-kit'`と打つことでmoduleを呼び出すことができると[書いてある](https://github.com/k-vyn/framer-material-kit?utm_content=buffer18837&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer#setup)ので、それに従います。この場合の"m"に入る文字は、なんでも任意の文字列を設定してもらって構いません。あとでmoduleを使う時に、ここで設定したインスタンス名を使うことになります。

## ④ Moduleを使う
試しに[Dialog](https://github.com/k-vyn/framer-material-kit?utm_content=buffer18837&utm_medium=social&utm_source=twitter.com&utm_campaign=buffer#dialog)を使ってみましょう。
Dialogの説明を見ると、使用例が書いてあります

```
dialog = new m.Dialog
    title:"Warning"
    message:"Don't do this"
    actions:["OK", "Cancel"]
```

どうやら、`dialog = new m.Dialog`と打ち込むと、マテリアルダイアログが表示されるようです。
![module.gif](https://qiita-image-store.s3.amazonaws.com/0/54076/5dbe014e-a5d9-48b8-d316-23bbfd70b9c1.gif)

さらに`title`や`message`、`actions`までテキストで打ち込めるようです。
![module２.gif](https://qiita-image-store.s3.amazonaws.com/0/54076/bb859700-3eda-fc94-b081-7fa3a54862e2.gif)

このように独力で作ると30分くらいかかりそうなものでも、モジュールを使えば2分で作れるので、積極的に活用することをお勧めします。
EXCELでは論文を書けない　計算が正しくないから

##これまでのEXCELの悪行の数々
[「ごめんなさい」では済まされない！　財政切り詰め策の根拠となった論文に誤り　欧州連合の方針に疑問](http://markethack.net/archives/51871682.html)
[Excel使うな](https://oku.edu.mie-u.ac.jp/~okumura/blog/node/2287)
[Excelが遺伝子研究の誤りのもとになっていると研究者が指摘](http://gigazine.net/news/20160829-excel-gene-name-error/)
[表計算をマジなことに使わないほうがいいよ（マジで） ](https://cpplover.blogspot.jp/2014/05/blog-post_29.html)
> だいたい、表計算というものは手早いやっつけ仕事には向いているものの、真面目で重要な作業には向いていないのだ。
>
 - まともなソフトウェアには詳細なテストが付随するべきである。テストなしで、どうして自分の書いた機能が、自分が意図する通り正しく動作すると言えるのだ？　表計算は、テストをサポートしていない
 - 表計算は、コードレビューを困難にする。コードは何十、何百もの小さなセルの中に散らばっている。コードを自分で注意深く検証できず、また他人による検証も難しい状況で、どうして信頼できようか？
 - 表計算はコピペプログラミングとやっつけ仕事を自然と行わせてしまう。コードの検証、テスト、保守を難しくする。

奥村教授はブログだけではなく論文も出されている

>LaTeX解説書籍でも知られる三重大学の奥村教授が、「ネ申Excel問題」というタイトルの論文を出している（論文PDF）。「ネ申Excel」というのは、データの再利用を考えずに見栄えだけをそろえたExcelデータのことで、「紙への出力しか考えていないExcel」という意味も含んでいるという。
 論文では実例とともに「ネ申Excel」について紹介するとともに、なぜこれが問題なのかや対策について解説されている。とはいえ、このように説明されても、なぜこれが問題なのか理解できない（もしくは理解しようとしない）人は多くいそうだ。 

[「ネ申Excel」はなぜ問題なのか -　スラド](https://it.srad.jp/story/13/10/23/037221/)
[論文PDF](http://oku.edu.mie-u.ac.jp/~okumura/SSS2013.pdf)
>表計算ソフトで機械可読なデータを作成するには，セル結合・罫線・文字飾りなどの視覚的効果にデータとしての意味を持たせず，一定の方式（通常は1 行目に項目名，2 行目以降にデータ）で入力する。その際に，数値データは（単位を付けず）数値として，日時データは日時として解釈できる文字列（例えば2013/07/01 12:34:56）として入力する。保存は，CSV などの軽いファイル形式にするのが望ましいが，Excel 形式（特に*.xlsx）で保存しても，オープンソースのライブラリ（例えばR のXLConnect）を利用して，CSV と同様に読めることが多い。以上の作業に，技術的に難しい箇所はまったくなく，むしろ作業時間は減るはずである。いったん機械可読な形式で保存できれば，同じデータを人間が何度も再入力しなくても，さまざまな形での解析が可能になる。このことは，情報教育の中で何らかの自動処理を体験していれば，想像に難くない。

というわけで、EXCELを使うためには

-  関数をすべて自分で定義してテストしてから使う。
-  セル結合・罫線・文字飾りなどの視覚的効果にデータとしての意味を持たせない
-  特にEXCELが用意している関数をそのまま使うと検証できない
-  ソースコードは公開する
-  関数電卓はCannonを使い、検証する。
[やけに内部演算精度が高い関数電卓：キヤノン F-718SA](http://blog.goo.ne.jp/ktonegaw/e/d284d6eb8326dfd0338b6cbe4aab6227)
- ***一度電卓で打ってみる（ネットでは評判が悪いが。）***
-  十進計算はCOBOLを使う（非現実的だが）。二進化十進法（BCD)を使えるため、十進計算ですら悩むEXCELはお呼びではないのである。

といった対策をしないと、国の運命を誤らせてしまうようだ。
C言語で文字列内の数字文字を消すプログラム（自作）

```c
#include <stdio.h>

void delnum(char s[])
{
    int i = 0;
    int j;    

    while (s[i]) {
        while ('0' <= s[i] && s[i] <= '9') {
            j=i;
            while(s[j]!='\0'){
                s[j]=s[j+1];
                j++;
            }
        }
        i++;
    }
/* いい線いってると思うけど・・・ */
}

int main(void)
{
    char str[] = "3Hello2Wo1ld9!";
    printf("%s\n", str);
    delnum(str);
    puts("チェーーーンジ!!!");
    printf("%s\n", str);
    return 0;
}
```
[閲覧注意]スクショだらけのデスクトップダサくね？

#！！！！！！閲覧注意！！！！！！
この記事を読むと作業効率が上がりすぎます。

##この記事でできること

所要時間５分
・スクリーンショットの保存先変更
・スクリーンショットの保存名変更
・[おまけ]保存時の拡張子変更

##背景
macpcでスクリーンショットを撮るとデスクトップに保存されるから、定期的に削除したり整理が面倒と感じたことはないですか？
ないならここで記事終了です。
実際私はドキュメント作成でスクショ祭りしてた時にすごくすごくすごーーく面倒でした。
ファイル名もダサいし。
っていう時に「スクショの保存先も保存名も変えれば良いじゃん？」って記事です!

##スクリーンショットの保存先変更
今回は保存先をデスクトップからScreenShotというディレクトリに変更します。

```
保存先ディレクトリ作成
$ mkdir ~/Pictures/ScreenShot

保存先変更
$ defaults write com.apple.screencapture location ~/Pictures/ScreenShot

SystemUIServerを再起動し、設定を反映
$ killall SystemUIServer
```

ちなみに、保存先をデフォルト（デスクトップ）に戻す場合は下記です

```
保存先変更
$ defaults delete com.apple.screencapture location

SystemUIServerを再起動し、設定を反映
$ killall SystemUIServer
```

##スクリーンショットの保存名変更
スクリーンショットのファイル名は構造が下記のようになっています。

>文字列　現在時間.png

まずは文字列の部分を自分好みに変更しましょう。

```
ファイル名の文字列部分を「ScreenShot」に変更
 $ defaults write com.apple.screencapture name ScreenShot
　　　　　=>　「ScreenShot　0000−00−00　00.00.00」

先頭の名前を非表示
 $ defaults write com.apple.screencapture name ""
　　　　　=>　「0000−00−00　00.00.00」

デフォルトに戻す
　　$ defaults write com.apple.screencapture name スクリーンショット
　　　　　=>　「スクリーンショット　0000−00−00　00.00.00」
```

次は現在時間の表示非表示の設定をします。

```
ファイル名に日付を入れない
$ defaults write com.apple.screencapture include-date -bool false
　　　　　=>　「ScreenShot.png」
※日付を入れない場合は、保存名の終わりに連番で数字がきます。
　　　　　=>　「ScreenShot.png」, 「ScreenShot 1.png」, 「ScreenShot 2.png」

デフォルトに戻す
$ defaults delete com.apple.screencapture include-date
```

##[おまけ]ファイル形式も変えれる

```
$ defaults write com.apple.screencapture type ファイル形式
選択できるファイル形式
　=>jpg, gif, pdf, png, bmp, tiff

SystemUIServerを再起動し、設定を反映
$ killall SystemUIServer
```

##おわり
これでデスクトップが綺麗に整頓できると思います！
整理する時間が勿体無いのでやってない方は是非試して下さい！
脳科学

1. 脳は記憶したモノをすぐ忘れてしまうものです。

2. １日後７０％が忘れてしまいました、悪いのは君じゃない。記憶のメカニズムをGoogleしましょう

3. 復習すれば、記憶は定着していきます。１日、２日、４日、８日、１６日。。。。　定期的に復習しましょ

4. 記憶の定着は寝ている間です。夜１０時から深夜２時までは一番効率良い時間と言われています。

5. 朝４時から１０時までは勉強の一番効率良い時間です。

6. 脳はマルチタスクに向いてない、簡単且つ大量の作業は一番効率が良いです。だから、勉強のタスクを分解しましょう。

7. 共通のモノを作りましょう。脳は関連しているものを記憶しています。例えば英単語の勉強、スペク、発音、語彙、「スペクを見て、発音しよう」、「スペクを見て、語彙を覚えましょう」のペアで勉強しましょう、脳は自動的に「発音＝語彙」に変換してくれるんです。

8. その場で強制記憶をやめましょう、君が暗記に苦手ではありません。１単語を時間空けて、１５回チラと見るだけで、脳は勝手に覚えてしまうです。
WPFメモ　ウィンドウ位置・サイズ保存

# <i class="fa fa-cubes" style="font-size:1em;"></i> 概要

WPFプログラムでウィンドウの位置・サイズを保存する方法。

プログラム終了時に`GetWindowPlacement` APIで`WINDOWPLACEMENT`構造体の情報を取得・保存し、
起動時に保存してた設定を読み込み、`SetWindowPlacement` APIに渡してウィンドウ状態を復元するという流れ。
スナップ表示は復元されないが、OS標準アプリ等の挙動を確認し、

* スナップ表示は一時的な表示状態
* よってスナップ状態・スナップ時のウィンドウ位置やサイズは保存しないのが正解

と判断した。

# <i class="fa fa-cloud-download" style="font-size:1em;"></i> ダウンロード

サンプルソースはここでダウンロードできる。
[ウィンドウの配置状態の保存のサンプル - MSDN](https://msdn.microsoft.com/ja-jp/library/aa972163(v=vs.90).aspx)

# <i class="fa fa-cubes" style="font-size:1em;"></i> サンプル修正

サンプルだとGUIの設定画面から扱えない型を使っていて使いづらいので修正。

XML形式の文字列で保存するように修正
![wpf_winsize01.png](https://qiita-image-store.s3.amazonaws.com/0/142879/63f2eb64-c017-3991-4abb-e95ca447b5eb.png)


```CSharp:保存処理の修正箇所
// ウィンドウ表示状態取得
GetWindowPlacement(hwnd, out wp);

using (var stream = new System.IO.MemoryStream())
using (var writer = new System.Xml.XmlTextWriter(stream, Encoding.UTF8))
{
    var serializer = new System.Xml.Serialization.XmlSerializer(typeof(WINDOWPLACEMENT));
    serializer.Serialize(writer, wp);
    byte[] buf = stream.ToArray();
    string windowPlacementStr = Encoding.UTF8.GetString(buf);

    // windowPlacementStrを保存する処理をここに書く
}
```

```CSharp:復元処理の修正箇所
// windowPlacementStrを読み込む処理をここに書く

WINDOWPLACEMENT wp;
using (var stream = new System.IO.MemoryStream(Encoding.UTF8.GetBytes(windowPlacementStr)))
{
    var serializer = new System.Xml.Serialization.XmlSerializer(typeof(WINDOWPLACEMENT));
    wp = (WINDOWPLACEMENT)serializer.Deserialize(stream);
    
    ：
    ：
    
    // ウィンドウ表示状態設定
    SetWindowPlacement(hwnd, ref wp);
}
```
[めも]cssで、aタグに付ける:visitedなどの順番に気を付けよう！[初級編]

#期待通りの動作をする順番は

```
:link
:visited
:hover
:active
```

忘れていると、はまります！

順番をあえて変えてみるのも・・というのは、(実質的に使われない)無駄なセレクタが増えるので、実験程度に。

#なぜ、この順番？
後ろの方が優先されるので、

linkだけど、visitできるよ！
visitedだけど、hoverできるよ！
hover状態だけど、activeになれるよ！

ということ。

・・・後から足した時など、うっかり変な位置に書いてたりしますよね。

今日の教訓：単純なトラップほど怖い。

##そんなの大丈夫！常識でしょ？と思った時はきっと・・
罠にはまる1歩手前。

`a:hover`とか`a:active`を設定した後に、`#id名:visited`とか`.クラス名:visited`とか書いていませんか?

**ここ重要！**
`#id名:visited`と書いた後には、
`#id名:hover`と`#id名:active`も書きましょう。
(クラスの時も、似た感じでね！)

書かないと・・
`a:hover`したよ！　だが`#id名:visited`になりたいんだ。
という感じに、おかしな事になります。要注意。

#参考
[MDN - :visited](https://developer.mozilla.org/ja/docs/Web/CSS/:visited)
npmのデプロイ環境を切り分けてDockerでビルドする方法

##やりたいこと
`docker build`するときにデプロイ環境（production/staging/development）を分け、それぞれの環境ごとに別々の環境変数を使ってnpmでビルドしたい。

##やりかた
### docker build
`docker build`に引数を渡す。Docker1.9以降なら、--build-argで引数が渡せる。
（例）`docker build --build-arg NPM_DEPLOY_ENV=prod .`

### Dockerfile
1.の引数を`npm run`に渡すようにDockerfileを変更する。

```
FROM node:7.3.0
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev libkrb5-dev
RUN mkdir /myapp
WORKDIR /myapp
ADD package.json /myapp/package.json
RUN npm install
ADD . /myapp
ARG NPM_DEPLOY_ENV
RUN npm run deploy:${NPM_DEPLOY_ENV}
```
Dockerfileの例。最後の２行が引数に関する箇所。

### package.json
package.jsonにそれぞれのデプロイ環境用のスクリプト（depoy:production, deploy:staging, deploy:development）を書く。

```json
{
  "scripts": {
    "clean": "rimraf dist",
    "compile": "better-npm-run compile",
    "deploy:prod": "better-npm-run deploy:prod"
  },
  "betterScripts": {
    "compile": { 
      "command": "babel-node bin/compile",
      "env": {
        "DEBUG": "app:*"
      }
    },
    "deploy:prod": {
      "command": "npm run clean && npm run compile",
      "env": {
        "NODE_ENV": "production",
        "API_URL": "YOUR_API_URL",
        "DEBUG": "app:*"
      }
    }
  }
}
```
DockerでローカルExpress環境を立ち上げhello worldするまでの全て

# 環境
- OS X El Capitan 10.11.6
- Docker 17.03.0-ce-mac2
- Express 4.15.2

# 手順
## Dockerイメージを取得
```docker pull node:7.7.2-alpine```

- `:`以降は、好きなバージョンを指定
- alpineだと軽量らしい（小並感）
- imageの情報は、https://hub.docker.com/_/node/ などを参照

## Dockerイメージを立ち上げてみる
```
docker run -it -v /Users/jumpei/jumpage/app/:/app -p 8080:3000 node:7.7.2-alpine /bin/sh
```

- -it: インタラクティブモード&デバイスを確保
- -v: volumeを共有するフォルダを指定
    - ホスト側(Mac)とコンテナ側(Docker)で、フォルダを共有できる
        - Mac上の好きなエディタで、コンテナ側のファイルを編集できるようになる
    - 絶対パスで指定
    - 引数は`[ホスト側パス]:[コンテナ側パス]`
- -p: ポート番号の対応を指定
    - 引数は`[ホスト側ポート]:[コンテナ側ポート]`
- node: イメージ名
- /bin/bash: 実行コマンド

## コンテナ側でpackage.jsonを作成
- コンテナ側で実行

```
cd [コンテナ側パス]
npm init
```
- いろいろと質問に答えるとpackage.jsonができる

```package.json
{
  "name": "jumpage",
  "version": "1.0.0",
  "description": "jumpei_ikegami's page",
  "main": "index.js",
  "scripts": {
    "test": "echo 'Error: no test speciﬁed' && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jumtech/jumpage.git"
  },
  "keywords": [
    "jumpage"
  ],
  "author": "jumpei ikegami",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/jumtech/jumpage/issues"
  },
  "homepage": "https://github.com/jumtech/jumpage#readme"
}
```

## Expressをインストール
- コンテナ側で実行

```
npm install --save express@4.15.2
```

- --saveを付けるとpackage.jsonに追記される

## index.jsを作成
- ホスト側の好きなエディタで、共有フォルダ内にindex.jsを作成
    - index.jsは、npm init時に指定したentry point

```index.js
var express = require('express');
var app = express();

app.get('/', function(req, res) {
  res.send('hello world');
});

app.listen(3000);
console.log("server starting...");
```

- コンテナ側の共有フォルダにもindex.jsがあることを確認

## サーバ実行
- コンテナ側で実行

```
node index.js
```

- ホスト側のブラウザで、localhost:8080にアクセス
    - ポート番号は、docker run時に指定したもの
- "hello world"の表示を確認

## Dockerfileを作成
- 書式
    - FROM: 元となるimage
    - RUN: build時に実行されるコマンド
    - CMD: run時に実行されるコマンド

```Dockerfile
# 元になるimageを指定
FROM node:7.7.2-alpine

# 各種インストール
## expressコマンド
RUN npm install -g express-generator

## ファイル変更時に自動でサーバ再起動してくれるdemon
RUN npm install -g nodemon
```

- -gを付けるとグローバルにインストールされる

## Dockerfileの内容で自作imageを作成
```
docker build -t jumpage ./
```
- -t: 自作イメージ名を指定

## 自作imageを使ってhello world
```
docker run -it -v /Users/jumpei/jumpage/app/:/app -p 8080:3000 jumpage /bin/sh
```

- コンテナ側で実行

```
cd [コンテナ側パス]
nodemon index.js
```

- ホスト側のブラウザで、localhost:8080にアクセスし、hello worldを確認
- index.jsを書き換え、nodemonが自動で再起動してくれることを確認

## コマンドをshファイルに記録
- コマンド覚えるの面倒なので、ファイル化する

```docker_run.sh
docker run -it -v /Users/jumpei/jumpage/app/:/app -p 8080:3000 jumpage /bin/sh
```

# ここまでのディレクトリ構造
```
jumpage/
  ├ app/
  |  ├ node_modules/
  |  ├ index.js
  |  └ package.json
  ├ scripts/
  |  └ docker_run.sh
  └ Dockerfile
```
https://github.com/jumtech/jumpage

# 続き
- [Docker上にExpressの最初構成を整えるまでの全て](http://qiita.com/jumtech/items/50039d3de31a42949eb5)
Browser-Solidityで"Error encoding arguments: SyntaxError:"JSONが出る問題

以下に移行しました<br><a href="http://block-chain.jp/tech/browser-solidity-error-encoding-arguments-syntax-error-json/" title="Browser-Solidityで&quot;Error encoding arguments: SyntaxError:&quot;JSONが出る問題">Browser-Solidityで&quot;Error encoding arguments: SyntaxError:&quot;JSONが出る問題</a>
Mac OS X 10.12 (Sierra) + gdb でコード署名を確認しろと怒られる



**エラー内容**
    please check gdb is codesigned - see taskgated(8)


**原因**
gdbにコード署名がされていない

**解決手順**
以下はたまたまうまくいった手順なのでもっと適切な設定があるかもしれない。

    % open -a "Keychain Access.app"

    キーチェーンアクセスが開く >> 証明書アシスタント >> 証明書を作成...
    | 名前               : gdbcert        |
    | 固有名のタイプ     : 自己署名ルート |
    | 証明書のタイプ     : コード署名     |
    | デフォルトを無効化 : [x]            |
    >> [続ける] >> [続ける]

    証明書情報
    | シリアル番号     :   1 |
    | 有効期間（日数） : 365 |
    >> メールアドレスとかは何も入れずに [続ける] >>

    鍵ペア情報
    | 鍵のサイズ   : 2048ビット |
    | アルゴリズム : RSA        |
    >> [続ける]

    鍵用途拡張領域
    [x] 鍵用途拡張領域を含める
    [x] この拡張領域は重要
    [x] 許可される操作：署名
    >> [続ける]

    拡張鍵用途拡張領域
    [x] 拡張鍵用途拡張領域を含める
    [x] この拡張領域は重要
    [x] 許可される操作：コード署名
    >> [続ける]

    基本制約拡張領域
    [ ] 基本制約拡張領域を含める
    >> [続ける]
    
    サブジェクト代替名拡張領域
    [x] サブジェクト代替名拡張領域を含める
    [ ] この拡張領域は重要
    >> [続ける]

    証明書の場所を指定
    | キーチェーン : システム |
    >> [作成]
    >> パスワード入れて[完了]

    キーチェーンアクセスのウィンドウ >> 左ペインのシステム >> gdbcertをダブルクリック
    | コード署名 : 常に信頼 |

    # gdbに署名する
    % codesign -s gdbcert /usr/local/Cellar/gdb/7.12.1/bin/gdb
    # taskgatedを再起動
    % sudo pkill -KILL taskgated


**環境**
- OS X Sierra 10.12.3
- gdb 7.12.1
Mac OS X への Google Test + Mock 導入手順


Google Test に Google Mock が含まれているようだ。

```実施したコマンド羅列
# cmake が必要である。入っていなかったら入れておく
% wget https://cmake.org/files/v3.8/cmake-3.8.0-rc2.tar.gz
% tar zxvf cmake-3.8.0-rc2.tar.gz
% cd make-3.8.0-rc2
% ./bootstrap && make && make install

# googletest のビルド
% git clone https://github.com/google/googletest.git
% cd googletest
% cmake ..
% make

# 今回はインストール先の例として ~/program を採用した
% cd ..
% mv googletest ~/program

# 導入完了
```

```おまけ
# 各種リソースのインストール先の確認手順
% cd ~/program/gooletest

% find . -name '*.a'
# 出力
./googlemock/gtest/libgtest.a
./googlemock/gtest/libgtest_main.a
./googlemock/libgmock.a
./googlemock/libgmock_main.a

% find . -name 'gtest.h'
# 出力
./googletest/include/gtest/gtest.h
./googletest/include/gtest/internal/custom/gtest.h

% find . -name 'gmock.h'
# 出力
./googlemock/include/gmock/gmock.h


# 必要に応じて環境変数セット
% vi ~/.zshrc
# 以下のような記述を追加する
export GMOCK_DIR=~/program/googletest/googlemock
export GTEST_DIR=~/program/googletest/googletest
```

**環境**
- OS X Sierra 10.12.3
Railsのauto_loadの仕組み

[注意]この記事はRails 4.2.6について書かれている。Rails 5では大きく変わっている。

今、とあるRails 4プロジェクトでproductionでも

```
config.cache_classes = false
```

にして運用している。つまりdevelopmentと同様に、ソースファイルに変更を加えると、次回のリクエストのときに自動的に再読込される。

もちろん最初はパフォーマンス低下を心配したが、測定してみると数ミリ秒の差もなかったのでこれで数ヶ月運用を続けている。

今回ふと思い立って、このオートロードの仕組みを調べてみた。

基本的には[RailsじゃなくてもActiveSupportの自動require機能を使う - 昼メシ物語]
(http://blog.mirakui.com/entry/20100924/active_support)にも書かれているように、`const_missing`をフックしてファイルを読み込んでいる。

しかし、2回目以降のリクエストの場合はすでにクラスが定義されていて`const_missing`は発生しないはずである。そこはどうやっているのだろうか？

結論から言うと、オートロードで読み込んだファイルのリストを記録しておき、リクエストのときにそのいずれかに変更があれば`remove_unloadable_constants!`で定数定義を削除している。それによって`const_missing`が発生するようになる。

また`config.cache_classes = false`の場合は`ActiveSupport::Dependencies.mechanism == :load`になり、`require`でなく`load`でファイル読み込みをするようになる。

```
[41] pry(main)> ActiveSupport::Dependencies.mechanism
=> :load
```

呼び出し関係はこのようになる：

```
ActionDispatch::Reloader（Rack ミドルウェア）
    ActiveSupport::FileUpdateChecker#execute
        ActiveSupport::Dependencies.clear
            ActiveSupport::Dependencies.remove_unloadable_constants!
```

以上の理解が正しければ、

- リクエストがあったときにオートロード対象のいずれかのファイルに変更があれば、それら全てがクリアされる。したがって、`const_missing`が発生し、遅延が生じる可能性がある（以降のリクエストも含めて）。
- どのファイルにも変更がなければ、ファイルのタイムスタンプをチェックするだけなので、ほぼ遅延は生じない。

実験してみたらその通りになった。

# 参考

[Rails autoloading — how it works, and when it doesn't](http://urbanautomaton.com/blog/2013/08/27/rails-autoloading-hell/)
auto_loadは便利さと引き換えに複雑さとトラブルをもたらすという話

[Tracing the Rails Autoloader](http://randycoulman.com/blog/2014/12/16/tracing-the-rails-autoloader/) 
`log_activity`などauto_loadのデバッグに便利なあれこれ

```
[1] pry(main)> ActiveSupport::Dependencies.log_activity = true
[2] pry(main)> ActiveSupport::Dependencies.logger = Logger.new(STDOUT)
```
Mac OS X 10.12 (Sierra) + Qt 5.8 の環境下でプログラムのビルド時に TargetConditionals.h がないと怒られる


**エラーメッセージ**

```
/Users/XXXX/Qt/5.8/clang_64/lib/QtCore.framework/Headers/qsystemdetection.h:95:12: fatal error: 'TargetConditionals.h' file not found
```

**原因**
MacのSDKのバージョンが10.12よりも古いものが指定されている

**解決手順**

```MacのSDKのバージョンを強制的に書き換える
% cd ~/Qt/5.8/clang_64/mkspecs/features/mac
% cp sdk.prf sdk.prf_original  # 念のためバックアップ
% vi sdk.prf # 直接編集して次の変数をオーバーライトすればOK

QMAKE_MAC_SDK_PATH = $$system("xcodebuild -version -sdk | grep '^Path.*MacOSX' | cut -d ' ' -f 2")
```

**（参考）system関数に渡した引数**

```Xcodeの利用可能なSDKの中からMac用のものを探してそのパスだけ抽出する
% xcodebuild -version -sdk | grep '^Path.*MacOSX' | cut -d ' ' -f 2

# 出力
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk
```

**環境**
- OS X Sierra 10.12.3
- Qt 5.8.0 (インストーラ : qt-unified-mac-x64-2.0.5-online.app)
Mac OS X 10.12 (Sierra) + Qt 5.8 のセットアップの途中で Xcode 5 を入れろと怒られる


**原因**
Xcode 側で Command Line Tools の設定が未設定な状態にある

**解決手順**
Xcode を起動する >> Xcode >> Preferences >> Locations >> Command Line Tools: ドロップダウンメニューで Xcode 8.2.1 (8C1002) を選択する >> パスワード入れる >> Xcode を終わらせる

**環境**
- OS X Sierra 10.12.3
- Qt 5.8.0 (インストーラ : qt-unified-mac-x64-2.0.5-online.app)
日本語プログラミング言語「Mind」最新版をリリースしました

日本語プログラミング言語 Mind の最新版 Version 8 をフリーソフトとしてリリースしました。
Windows / Linux 同時リリースになります。
個人用途・商用を問わずご自由にお使いください。

以下のURLからダウンロードできます。(初回告知でURL間違いあり訂正)
http://www.scripts-lab.co.jp/mind8download/download.html

Mindについてはこちらで。
http://www.scripts-lab.co.jp/mind/whatsmind.html

Mindに関するご質問がありましたら、タグ「mind」を付けてご質問ください。できるだけお答えします。

MindはFORTHの流れをくむプログラム言語で1985年に開発しました。
自然な日本語に近い表記でソースコードを書けるもので、コンパイラにより中間コードを生成、それをランタイムが実行します。出来上がったオブジェクトコードは高速で動作し小さく配布も容易です。

ソースコードはたとえばこんな感じです。

```
住所から　３文字を　取り出し　「東京都」に　等しい文字列
　　　　ならば　・・・する
　　　　つぎに
```

視線が左から右に流れるように読めることと、たとえプログラマでなくても誰が見ても何をしようとしているのかが分かるのが一番の利点です。
オンラインマニュアルもありますので、マニュアルだけでもぜひご覧ください。
なぜソースコードにコメントを書くべきか？

[プログラムにコメント書かない文化もあるよって話](http://nzmoyasystem.hatenablog.com/entry/no_comment_culture)
という話があるらしい。

自分は逆の考え方だ。
「コードを読まなくてもコメントだけ読めば概略が分かるように」を心がけてる。ちょうど、見出しだけ読めば何が書かれているか分かるのがいい文章であるように。

コメントの有用性を理解したければ、Rubyのgem、active_supportのソースを読むといい。このソースにはコメントが豊富だが、コメントなしで理解できるか？壊さずに変更を加える自信はあるか？
Ruby: なぜ明示的にreturnを書くべきか？

下記のメソッドはActiveSupportのソース`activesupport-4.2.6/lib/active_support/file_update_checker.rb`からの抜粋である。メソッド内の3箇所から`true`または`false`を返している。

```rb
    # Check if any of the entries were updated. If so, the watched and/or
    # updated_at values are cached until the block is executed via +execute+
    # or +execute_if_updated+.
    def updated?
      current_watched = watched
      if @last_watched.size != current_watched.size
        @watched = current_watched
        true
      else
        current_updated_at = updated_at(current_watched)
        if @last_update_at < current_updated_at
          @watched    = current_watched
          @updated_at = current_updated_at
          true
        else
          false
        end
      end
    end
```

このような書き方をされると、読む側としては「えーと、ここで戻り値っぽいのが書かれているけど、この後確かに値が評価されていないな。ウン、だからこれが戻り値になるんだな」と先の方まで読まないと確信が持てなくなってしまう。読み手に不要な労力をかけることになる。
link > Q-learning with 2D actions and 2D states / Q学習

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

TensorFlowを使った100 input nodes, 100 output nodesの学習について検討中。

[Q-learning with 2D actions and 2D states](http://stackoverflow.com/questions/40115282/q-learning-with-2d-actions-and-2d-states)

- water flowとfan speedを調整する
- current temperatureとamount of emissionsを受け取る

Q-learningというキーワードを知った。

@Ugo-Nama さんの記事にQ-learningが詳細に紹介されている。
[DQNの生い立ち　＋　Deep Q-NetworkをChainerで書いた](http://qiita.com/Ugo-Nama/items/08c6a5f6a571335972d5)
Eclipse Neon でプロジェクトファセットを有効にする方法

# 手順

1. Help -> Install New Software
2. Work with: で `Neon - http://download.eclipse.org/releases/neon`　を選択
3. type filter text で　`EMF Facet SDK`　を検索しチェックボックスにチェックを入れる
4. `Web, XML, Java EE and OSGi Enterprise Development` 全体にチェックボックスを入れる
5. インストールする

# 用途

GitHubからソースをEclipseにインポートした時にGeneralのProjectとして認識されてしまう。
これを言語毎のプロジェクトに変換する時などに。

## 参考

プロジェクトファセットを用いずに.projectファイルを直接修正する方法もある。

http://www.javaroots.com/2013/02/how-to-import-git-project-as-java.html


ファセットを有効にする方法は以下URLを参考にした。

http://stackoverflow.com/questions/13235275/eclipse-doesnt-have-project-facets-after-install-of-jboss-wtp-adapter
VMware Horizon Deep Security併用環境でAMオフラインが発生する

以下の現象が発生する事がある。

・Deep Security Manager(以下、DSM)のメモリの使用率が高騰する
・仮想マシンのステータスが「オフライン」になる
・仮想マシンのステータスが「不正プログラム対策エンジンのオフライン」など、機能別のオフラインになる

仮想マシンに対する一斉処理を減らすよう検討することが吉。
目安としては1回につき500台以下とのこと。

上記にて事象が回避できない場合や運用の変更が難しい場合は、
以下サイジングの変更を検討する。

・DSMのメモリを増強する
・DSMのノードを増やす

特に以下サイジング資料は必読。DSMのメモリの設定方法に留意する必要がある(p5)

==抜粋==
使用可能メモリについて
– DSMは標準インストール状態ではOSが持っているメモリ量に関わらず、4GBまでしかメモリを使用す
ることができません
– 多くのユーザケースでDSMをインストールしたOSに大量のメモリを割り当てているにも関わらず、
DSMのメモリ設定が変更されていないケースが発生しているため、DSMの最大使用可能メモリ設定が意
図通り行われているか確認してください。

==参考==
Deep Security サイジングの留意事項

http://campaign.vmware.com/imgs/apac/jp_dwn/PDF/techresources/NSX-VDI_Important_Point.pdf?elqTrackId=c3c0098993384ec88fab1f3eebcb7075&elqaid=979&elqat=2


VDI環境で再構成(Recompose)、更新(Refresh)、再分散(Rebalance)を実施する際の注意事項
http://esupport.trendmicro.com/solution/ja-JP/1114930.aspx

==

あるいは、
一時手段として、VMware環境のDRSを手動に変更する。
合わせてTrend Micro Deep Security 9.6 Service Pack 1 Patch 1 Update 6 以降にする。
VMware Horizon Deep Security併用時のtips

Guest Introspection SVM（以下USVM）が展開されている環境で、各仮想マシンのVMware Tools 内にNSX Network Introspection Driver(vnetflt.sys)がインストールされていると、VMware KB:2148218 にて報告されている、USVMのメモリ不足によりネットワーク接続断が発生し仮想マシン上の通信に影響が出る。

https://kb.vmware.com/kb/2148218 

対処策は以下の通り。

1.この問題はVMware NSX for vSphere 6.3.0で解決されているのでアップグレードする

2.アップグレードできない場合は、VMware ToolsからNSX Network Introspection driverを無効にする

下記手順にて仮想マシンにVMware ToolsをインストールするときにNetwork Intorospectionを無効にする。

対象となる仮想マシンあるいはマスターVMでVMware Tools インストーラをマウントする。
[Control Panel] > [Programs and Features] に移動する。
[VMware Tools] > [変更] を右クリックする。
[完全インストール] を選択する。
[NSX File Introspection] を検索する(Network Introspection 専用のサブ フォルダがある)
Network Introspection を無効にする。

マスターVMで実施した場合はスケジュールの上再構成を実施する。

尚、副作用としてNSXの機能であるIDFW、Activity Monitoringが使えないことがあるが
TrendMicroの不正プログラム対策、自動隔離の目的で使っている場合には実害はない。

IDFWを利用している場合は、vnetflt でlogon eventを拾うのではなく、
Log Scraper 方式に変更すれば良い。
技術英語 > Here's how to make a range [from 2 down to 0]:

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2278 / 12833)

> Here's how to make a range **from 2 down to 0**:

http://ideone.com/8Tpzei

```py
for x in range(2, -1, -1):
	print(x)
```

```txt:結果
2
1
0
```

関連 [技術英語 > first, second, and so on [down to the last]. / to the bitter end](http://qiita.com/7of9/items/83f688cc48c3a4f876da)

こちらのdownと上記のdownは厳密には違う使われ方のような気はする。
上のdownは実際に「下がる」というニュアンスがあるような。
OpenGoddard使い方３-非線形最適制御・軌道生成のためのpythonライブラリ

https://github.com/istellartech/OpenGoddard
https://istellartech.github.io/OpenGoddard/

[OpenGoddard使い方１](http://qiita.com/ina111/items/ec73bc77ad45dd65ac1e)
[OpenGoddard使い方２](http://qiita.com/ina111/items/20963133988c27d84748)
[OpenGoddard使い方３](http://qiita.com/ina111/items/486aa2a24a1723081b91)←いまここ
[OpenGoddard使い方４](http://qiita.com/ina111/items/60f75d90e5376d34a0ef)


## ロケットの最適上昇（１段）

これまでで試した正規化（スケーリング）とknotting methodの合せ技として、実際のロケットに近い値で推力制御最適化を行います。

参考問題として以下の論文に書いてあるロケットの最適上昇問題を参考にします。これも中身のアルゴリズムはOpenGoddardと同じLegendre-Gauss-Lobattoの擬スペクトル法を用いています。

Rea, Jeremy Ryan. A legendre pseudospectral method for rapid optimization of launch vehicle trajectories. Diss. Massachusetts Institute of Technology, 2001. http://hdl.handle.net/1721.1/8608

運動方程式は[使い方２](http://qiita.com/ina111/items/20963133988c27d84748)とほぼ同じです。
値だけを変えます。値を変えると正規化のための数字が必要になるので、正規化を忘れないようにします。

あとは良い感じに書いていって、
SOLVE!

![3_Single_.png](https://qiita-image-store.s3.amazonaws.com/0/40132/1869b277-7143-7232-5d72-7c118896d924.png)


論文と同じようなグラフになりました。（収束値の設定の仕方のために微妙には異なります）

## ロケットの最適上昇（２段）

knotting methodを用いて、２段ロケットの推力制御最適化を行います。
主に変更するのは以下のところです。初期設定の解（Guess部分）も少し変えています。

```python
time_init = [0.0, 300, 600]
n = [25, 25]
num_states = [3, 3]
num_controls = [1, 1]
max_iteration = 30
prob = Problem(time_init, n, num_states, num_controls, max_iteration)
```


```python
prob.dynamics = [dynamics, dynamics]
prob.knot_states_smooth = [False]
```

状態変数（ここでは質量）を不連続と定義しています。拘束条件（equality）に以下を付け加えます。

```python
# knotting condition
R1 = prob.states(0, 0)
v1 = prob.states(1, 0)
m1 = prob.states(2, 0)
R2 = prob.states(0, 1)
v2 = prob.states(1, 1)
m2 = prob.states(2, 1)
result.add(R1[-1] - R2[0])
result.add(v1[-1] - v2[0])
result.add(m1[-1] - m2[0] - 1200)
```

をいれると、高度や速度は連続で、分離時の質量減少（不連続）を定義できます。

![3_TwoStage_.png](https://qiita-image-store.s3.amazonaws.com/0/40132/45dd7c94-3187-3be4-8363-68843611f5fd.png)


## ２次元座標での２段ロケット

OpenGoddardのexampleには２次元（極座標系）でのロケットの地球低軌道への軌道投入を想定した例を入れています。

![3_TSTO_-0.png](https://qiita-image-store.s3.amazonaws.com/0/40132/127cd7f5-f95e-17e3-fcf8-3cfd77207a14.png)
![3_TSTO_-1.png](https://qiita-image-store.s3.amazonaws.com/0/40132/5d541503-df75-14cc-fda8-2398dc2eb535.png)

OpenGoddardでは軌道投入するには上段ロケットは途中で止めて再着火をするのが最適という結果が得られます。
世界中の宇宙工学者はこういった最適軌道の結果から、ロケット等の開発を進めています。

## ちなみに
再着火を行わない方式をダイレクトバーン方式といいますが、ダイレクトバーンの方が必要技術レベルは低く、現実には地上との通信や技術の問題でダイレクトバーンが採用されることがあります。現実では色々な拘束条件を入れて軌道を作っていくことが求められます。
VMware Horizon USBテンキー入力が正常に動かない

各USBテンキーメーカの製品情報のページに『「NumLock問題」をハードウェアで解決 』という様な機能紹介がされている製品を使用した場合、テンキー入力が正常におこなわれない(数字入力ではなくカーソル入力)現象が発生する。

VMware KB2045533 の手順を実施する事で、現象の発生を抑止できるが、
[NumLock]キーではなく、[ Ctrl+Alt+N ] キーの入力によって、NumLockのOn/Offを切り替える運用の変更が発生する。

https://kb.vmware.com/kb/2045533 

また、[ Ctrl+Alt+N ]でのOn/Off切り替えはノートPC本体のキーボード側のNumLockも連動してしまうため物理端末側の操作にも影響を与えてしまう。

BIOS設定の中にNumLockに関する動作の設定があり、[Fn]キーを押しながらキー入力を行った場合のみ数字入力ができる設定とした場合は、ノートPC本体のキーボード側は[Fn]キー入力が必要となり、USBテンキー側は[Fn]キー不要となる為、初回の[ Ctrl+Alt+N ]での切り替え後は、USBテンキー側のみが数字入力ができる従来の利便性を維持できる。

■ BIOS設定箇所
[Post Behavior] - [Keypad(Embedded)]  - [Fn Key Only]
VMware Horizon SSOされずにパスワード入力が求められる


Horizon View Administratorのグローバル設定 『ユーザーがキーボードとマウスを使用しなくなった場合に、アプリケーションを切断し、SSO 認証情報を破棄する』 は、公開アプリケーションだけではなく、公開デスクトップ時にも機能する。

ここで設定した時間を経過すると、Connection Server上でのSSO情報が破棄され、
再度Horizonのログイン画面が表示される。

他にも以下の画面ロックの操作を実施すると、
次回HorizonClientによる接続時にWindowsのログイン画面(パスワードがブランク)が表示され、SSOによる自動認証ではなくパスワードの入力が必要となる。

1. ユーザがRDSH上でロックをかける
2. RDSHの電源モードを『バランス』かつ、デスプレイの電源を切るを『有効』 ⇒ 結果としてロックがかかるため
VMware Horizon RESASの閲覧時に一部の地図が正常に表示されない

自治体で利用されているRESASはChromeだけがサポートとのこと。
クライアントOS以外の場合はRESASの閲覧時に一部の地図が正常に表示されないようです。

対処策は以下の通り。

- Windows2012R2の場合はChromeの”ソフトウェア レンダリング リストをオーバーライド ”の有効化が必要
- LinuxVDIの場合はChromeの”ハードウェア アクセラレーションによる動画デコード”の有効化が必要

上記Chromeの設定項目は、Chromeのアドレスバーに「chrome://flags/」と入力すると試験運用機能のメニューが表示され、そこに設定箇所があります。
VMware Horizon RDSH接続時に入力設定がEN(英語)となる

Horizon Agent側（Win2012R2)に下記レジストリ設定し、Horizon Agent側OSを再起動をする事で回避できるようです。

1.
Horizon Agent側で、 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard\IgnoreRemoteKeyboardLayout 　を REG_DWORD で作成し、値を 1 に設定

2. OSを再起動
VMware Horizon RDSHでIEから他のプログラムを呼び出すのが遅い

Horizon 7.0.1以降のRDSHでIEをアプリ公開している環境で、IEからエクスプローラ等の他のプログラムを呼び出した場合に、数分程度の時間を要する場合、以下の設定が有効。

同様にExplorerを公開していて、Explorerから他の公開アプリを呼び出す場合にも
有効なはず。

■ Horizon Agent　側の設定（Win2012R2）

1. HKLM\Software\VMware, Inc.\VMware VDM\VMware Unity\ShellCreateDesktop を REG_SZ で作成し、値を false に設定

2. OSを再起動
VMware Horizon Thinprintの印刷処理で一部が文字化けする

Win10 , Win2012R2 等の仮想デスクトップ環境でThinPrintで印刷処理をしているときに文字
化けがある場合以下を試す。

https://kb.vmware.com/kb/2106308

Windows クライアント（端末側）で、次のレジストリキーを設定します：

For 32-bit OS: HKLM\SOFTWARE\ThinPrint\TPView
For 64-bit OS: HKLM\SOFTWARE\Wow6432Node\ThinPrint\TPView
EnableLegacyFonts (REG_DWORD) の値を 1 に設定します。


改善されなければ、とにかく最新のHorizon Client 4.3を試してみることが吉。
VMware Horizon  Thinprint設定画面は日本語表示に変更できるか？

ディフォルトで仮想プリンタ/ThinPrintの設定画面は英語表記となっています。
ThinPrint印刷時の設定画面（カラーや印刷向きを設定する画面）を日本語にする方法は以下の通りです。


1. 仮想デスクトップ(Win7/10やWin2012R2)へログインし、regedit を管理者として実行する。
2. 次のレジストリを編集。

   HKEY_LOCAL_MACHINE\Software\ThinPrint\Lang
   修正前: enu
   修正後: jpn

hkey_local_machine\software\ThinPrint\Lang を jpn に変更する


==参考==

https://download.cortado.com/docu/ThinPrint/WebHelp/en/ThinPrint_docu/ThinPrint_Engine_on_print_servers/ThinPrint_Output_Gateway1.htm?rhsearch=jpn&rhsyns=%20

===
Chocolatey-Python と公式Windows向けmsi-Python の conflict

## 状況

1. OSはWindows
1. Chocolatey で Pythoh をインストール
1. Jupyter Notebook を `--user` オプションを付けて `%AppData%`以下にインストール
1. `pip install jupyter_contrib_nbextensions --user`
1. `jupyter contrib nbextensions install --user`

として Jupyter Notebook Extensions をインストールしようとしたのだけどエラーが出る。

## 結論

* `jupyter contrib extensions install --user` のエラーログからは `%AppData%`以下にPython環境が展開されているとみなして必要なファイルのコピーを行おうとしている用に見えた。
* 一方、`which python`でどの`python`がデフォルトで使われているかを確認したところ`C:\ProgramData`以下にある`Chocolatey`がインストールしたPythonを見ていた。
* `Chocolatey uninstall python3` をした後、公式サイトのWindows用インストーラー経由でPythonを入れ直して上記の4番以降の処理をやり直す。

## 後記

大したTipsではないですが、ドンピシャの情報が見つからなかったので書きました。
VimでALEを使ってvueファイルにeslintとstylelintを使う

ALEは標準ではJSファイルやCSSファイルにしか対応していません。

Linterなしでコードを書くのは辛いので非同期でlinterを実行してくれるvimのALE上で実行できるように設定しました。

方針としてはeslintやstylelintのプラグインやプロセッサーを通してとりあえずvueファイルに対してeslintとstylelintが実行できるようにします。

その後ALEの設定でvueファイルに対して各々のLinterを実行するようにします。以下がおそらく最小構成です。

```shell
$ npm install --save-dev eslint eslint-config-airbnb eslint-config-vue eslint-plugin-import eslint-plugin-jsx-a11y eslint-plugin-vue stylelint stylelint-config-standard stylelint-processor-html
```

```yaml:.eslintrc
---
extends: airbnb
plugins:
- vue
```

```yaml:.stylelintrc
---
processors: stylelint-processor-html
extends: stylelint-config-standard
```

```vim:.vimrc
Plug 'w0rp/ale'
Plug 'posva/vim-vue'

let g:ale_linters = {
      \ 'html': [],
      \ 'css': ['stylelint'],
      \ 'javascript': ['eslint'],
      \ 'vue': ['eslint']
      \ }
let g:ale_linter_aliases = {'vue': 'css'}
```
kivyの環境構築

#基本的な環境

- Anaconda3(公式は現在3.6だけど自分が使用しているのはpython3.5.2)
- Windows10(64bit)
- エディタはVScode

#kivy導入（自分がやったこと）
kivyのホームページ
https://kivy.org/#home

- 環境に合わせて飛ぶ
自分の場合Windows10(64bit)なので
https://kivy.org/docs/installation/installation-windows.html

記事に沿ってcmdから
1. python -m pip install --upgrade pip wheel setuptools
2. python -m pip install docutils pygments pypiwin32 kivy.deps.sdl2 kivy.deps.glew
3. python -m pip install kivy.deps.gstreamer
4. python -m pip install kivy.deps.angle
5. python -m pip install kivy

たぶんこれで導入終わり

2か3でエラーメッセージでてたけど試しにもう一回コマンド試したら入ったのでよしとする←

5のところは以前に非公式バイナリの
**http://www.lfd.uci.edu/~gohlke/pythonlibs/#kivy**
から
**Kivy-1.9.1+sdl2-cp35-cp35m-win_amd64.whl**
を入れてたみたいなので　もう入ってるよ的なメッセージが出てた。

#kivy導入がすんだので早速

チュートリアルのビデオがあるみたいなのでそれを見ながらウィンドウを表示するプログラムを作成

```python:tutorial.py
from kivy.app import App
class TutorialApp(App):
    pass

if __name__ == "__main__":
    TutorialApp().run()
```

これだけでウィンドウは完成。

補足:passっていうのはここでは何もしないよって意味らしい。tkinter少しやってた時にどこかのサイトで言ってた。

とりあえずはチュートリアルを進めてみる。

tutorialのyoutubeはここ
https://www.youtube.com/watch?v=F7UKmK9eQLY&list=PLdNh1e1kmiPP4YApJm8ENK2yMlwF1_edq

テキストならこっち
http://inclem.net/2014/01/09/kivy-crash-course/1_making-a-simple-app/

英語の文字は見てても自分はチンプンカンプンなので自分はビデオ見ながらやっていきます。
python初心者がんばります。

#すべてはここから始まった
```python:hello.py
print("Hello, MontyPython!")
```
#自己紹介
名前:APTXとでも呼んでください（某死神の毒薬からもってきています）

年齢:永遠の（ｒｙ　※お酒は飲めます

プログラミングレベル：興味を持ったのは数年前だが超絶初心者

主にpython3系使ってます
理由は・・・**書くのが楽だから！！**
最終目標としては自分で作りたい人工知能を作れるようになりたい。
今興味があることといえばPSVRやHoloLens（?）のようなAR・VR開発もやってみたい！

#Pythonはどのくらいのレベルか

```python:hello.py
#簡単なタイマーアプリ（？）
#coding: utf-8
import time
timer = int(input("時間を入力してください"))
time.sleep(timer)
print("時間です")
```

ほぼこのくらいのレベルです。

ネットサーフィンしてたら**ニコニコ動画をダウンロードして保存する**っていうのがあったので最近やったのが、それをもとにtkinterっていう標準のライブラリを使用してGUIにおこしたこと。でもそれはtkinterでウィンドウつくってボタン押すとこまではコピペじゃなく自分で書いたけど、**ダウンロードして保存するよ**って処理はまんまコピペ。

でも**tkinter**は調べてみるとダサいっていわれてたりして悲しいからモダンって言われててかっこいい**kivy**の勉強することにした。てかさっき決めた。

敷居は高いけどやる気があればなんでもでき（ｒｙ

とりあえずしばらくは何作ろうか考えながらkivyの勉強していきます。
FramerでScroll要素を作る ~Twitterのタイムラインを例に~

プロトタイプ制作でScroll要素を作りたいシーンはかなりあると思います。

スクロール要素を作るのに必要なのは、
ざっくり言ってこの２つです。

- ScrollComponent（スクロール要素の入れ物）を作る
- スクロールさせたい要素をcontentレイヤーの子要素に指定する

![scroll.gif](https://qiita-image-store.s3.amazonaws.com/0/54076/e1df0538-6900-d9e8-97de-8fff7269d4c9.gif)


Twitterのタイムラインを例に見ていきます。

![twitter.gif](https://qiita-image-store.s3.amazonaws.com/0/54076/da901a67-f6c7-acc9-3467-61758e057dab.gif)
[サンプルFramer](https://framer.cloud/Bgznu)　[サンプルSketch](https://drive.google.com/open?id=0B9aCukJROnQGRDRJRzE3c1o3T2s)
※ sketchファイルは[TwitterUIKit](https://www.sketchappsources.com/free-source/2109-ios-twitter-mockup-sketch-freebie-resource.html)を元に作成しています。

# ScrollComponentの作成
まずはScrollComponentを作成します。
要素を詰め込む入れ物だと思ってください。下のような書き方で指定していきます。

```coffeescript
scroll = new ScrollComponent
	width: Screen.width              # <=①
	height: Screen.height - sketch.navbar.height - sketch.tabbar.height # <=②
	y: sketch.navbar.height          # <=③
	scrollHorizontal: false          # <=④
```

1. 横幅はScreen.width、つまりスクリーンの横幅に合わせます。
2. スクロールエリアの高さは下の図のように定義したいので、スクリーン全体の幅から、navbarとtabbarの高さを引いています。
![スクリーンショット 2017-03-12 2.59.24.png](https://qiita-image-store.s3.amazonaws.com/0/54076/ddbd3ec0-79f4-de9f-4da8-2f8d3faf61f0.png)

3. スクリーンの一番上(y=0)からnavbarの高さ分下がったところにスクロール要素のy座標を設定します。
4. `scrollHorizontal: false`は水平方向のスクロールをなくすために指定することができます

これでScrollComponentが設定できました。scrollという名前のレイヤーの中に`.content`という名前のレイヤーがあることにも注目してください。

# スクロールさせたい要素をscroll.contentレイヤーの子要素に指定する
scroll.contentの子要素になったレイヤーは、スクロールできるようになります。
ScrollComponentそのものではなく、`.content`というレイヤーを親要素とすることに注意です。
レイヤーの`.parent`または`.superLayer`というプロパティを取り出してくることで子要素への追加が可能になります。

```coffeescript
sketch.tweet1.parent = scroll.content
sketch.tweet2.parent = scroll.content
sketch.tweet3.parent = scroll.content
sketch.tweet4.parent = scroll.content
sketch.tweet5.parent = scroll.content
sketch.tweet6.parent = scroll.content
sketch.tweet7.parent = scroll.content
sketch.tweet8.parent = scroll.content
```

tweet1~7の親要素をscroll.contentの中に集約することでtweet1~7がスクロールレイヤーの中に組み込まれました。

これで最低限、スクロール要素が実装できたことになります。

## 発展編
ところで、上で書いた、子レイヤーを指定する箇所、いちいち8行も同じようなコードを書くの、面倒ですよね。

```coffeescript
sketch.tweet1.parent = scroll.content
sketch.tweet2.parent = scroll.content
sketch.tweet3.parent = scroll.content
sketch.tweet4.parent = scroll.content
sketch.tweet5.parent = scroll.content
sketch.tweet6.parent = scroll.content
sketch.tweet7.parent = scroll.content
sketch.tweet8.parent = scroll.content
```

実は、for文を使うと、このように一行でシンプルに書き換えることができます。

```coffeescript

for i in [0..7]
	sketch.Timeline.children[0].parent = scroll.content
```
Swiftで入力された文字をカタカナに変換して取得する

# これはなに？
- iOSの連絡帳のように姓名を入力したら、ふりがなが同時に入力されてほしい
- 既に実践されている方のコードはあったが、情報が古かったり、強制キャストなどで SwiftLint がエラーを出す
 - http://tizio1976.blogspot.jp/2016/03/swift.html
 - http://ameblo.jp/bitz/entry-11859904155.html
- 最新のSwiftに対応して、かつ SwiftLintがエラーを出さないようにしたい

# String の Extension でやってみる

```Swift
import Foundation

extension String {
    
    public func hiraganaToKatakana() -> String {
        
        if #available(iOS 9.0, *) {
            guard let prefLang = Locale.preferredLanguages.first else { return self }
            if prefLang.hasPrefix("ja") {
                // 言語設定が日本語の時のみ
                if let kana = self.applyingTransform(.hiraganaToKatakana, reverse: false) {
                    return kana
                } else {
                    return self
                }
            } else {
                return self
            }
        } else {
            return self
        }
    }
    
    public func katakanaFurigana() -> String {
        
        guard let prefLang = Locale.preferredLanguages.first else { return "" }
        if prefLang.hasPrefix("ja") {
            
            // 言語設定が日本語の時のみ
            let inputText: NSString = self as NSString
            let furigana = NSMutableString()
            
            let range: CFRange = CFRangeMake(0, inputText.length)
            let locale: CFLocale = CFLocaleCopyCurrent()
            let tokenizer: CFStringTokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, inputText as CFString, range, kCFStringTokenizerUnitWordBoundary, locale)
            
            var tokenType: CFStringTokenizerTokenType = CFStringTokenizerGoToTokenAtIndex(tokenizer, 0)
            
            while tokenType != CFStringTokenizerTokenType(rawValue: 0) {
                let latin: CFTypeRef = CFStringTokenizerCopyCurrentTokenAttribute(tokenizer, kCFStringTokenizerAttributeLatinTranscription)
                
                guard let romanAlphabet: NSMutableString = latin as? NSMutableString else { continue }
                CFStringTransform(romanAlphabet as CFMutableString, nil, kCFStringTransformLatinHiragana, false)
                
                furigana.append(romanAlphabet as String)
                tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)
            }
            
            let outputText: String = furigana as String
            return outputText.hiraganaToKatakana()        

        } else {
            return ""
        }
    }
}
```

# 補足
- 言語設定が日本語の時のみにしておかないと、英語などになるとクラッシュします
- iOSの連絡帳も言語設定が英語になると、ふりがなは表示されませんでした

# 参考資料
- http://tizio1976.blogspot.jp/2016/03/swift.html
- http://ameblo.jp/bitz/entry-11859904155.html
[.NET Core].NET Coreで実行ファイルを作成する

.NET Core3.1で実行ファイルを作成するためのメモ

実行ファイルを作成するといっても事前にネイティブコードにビルドする**AOT**ではなく.NET Coreの本体ごと配布する**Self-contained deployments (SCD)**です。

下記のサイトに全部記載されているので詳細はそこで確認してください。
[.NET Core Application Deployment](https://docs.microsoft.com/dotnet/articles/core/deploying/)

## プロジェクトの作成

```bash
$ mkdir sample
$ cd sample
$ dotnet new console
Content generation time: 342.4191 ms
The template "Console Application" created successfully.
$ ls
Program.cs    sample.csproj
```

## .csprojを編集

`PropetyGroup`に`RuntimeIdentifiers`を追加します。
今回はMac向けのバイナリを作成するために`osx.10.11-x64`を追加しました。
使用できる`RuntimeIdentifier`は[ここ](https://docs.microsoft.com/dotnet/articles/core/rid-catalog)に記載されています。
複数指定したい場合は`;`で区切ります。

```xml
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
    <RuntimeIdentifiers>osx.10.11-x64</RuntimeIdentifiers>
  </PropertyGroup>
</Project>
```

## ビルド&配置
```bash
$ dotnet publish -c release -r osx.10.11-x64
```

## 実行
ビルド結果は`bin/release/netcoreapp3.1/osx.10.11-x64/publish`にあります。
(`release`, `netcoreapp3.1`, `osx.10.11-x64`の部分は設定によって違います。)

```bash
$ cd bin/release/netcoreapp3.1/osx.10.11-x64/publish
$ ./sample
Hello World!
```
Raspberry Pi 3B（Raspbian）に最新Node.jsをインストールする

# はじめに

Raspberry Pi 3B（Raspbian）において、apt-get install nodejsでインストールされるNode.jsのバージョンはv0.10.29でとても古く、最新のパッケージが使えない。
そこで最新のNode.jsをインストールしようと思う。

なお、以降ではpiユーザーでログインしていることが前提となっている。

# パッケージの入手

https://nodejs.org/ja/download/ からダウンロードすればパッケージは入手できる。
パッケージはLTS（安定版）と最新版があるが、安全路線で安定版を選択すると良い。
Raspberry Pi 3BのCPUをcat /proc/cpuinfoで調べると、ARMv7と表示されるので、このCPUに合ったものを以下のコマンドでダウンロードする。
（今回はnode-v6.10.0-linux-armv7l.tar.xzをダウンロードした。）

```
$ cd ~/Downloads
$ wget https://nodejs.org/dist/v6.10.0/node-v6.10.0-linux-armv7l.tar.xz
```

# インストール

ダウンロードしたパッケージを以下のコマンドで展開する。

```
$ cd /usr/local
$ sudo xzcat ~/Downloads/node-v6.10.0-linux-armv7l.tar.xz | sudo tar xvf -
$ sudo mv node-v6.10.0-linux-armv7l nodejs
```

# PATH設定

$HOME/.profileに以下を追記してnode、npmなどのコマンドにパスを通す。

```
if [ -d "/usr/local/nodejs/bin" ] ; then
    PATH="/usr/local/nodejs/bin:$PATH"
fi
```

ログインし直すと、nodeコマンドがどこからでも使えるようになる。

```
$ node -v
v6.10.0
```

# Express追加

試しに、以下のコマンドを実行して、正常にパッケージがインストールされるかを確認する。

```
$ sudo npm install express-generator -g
$ express --version
4.14.1
```