OmniAICreator/Qiita-1.07M huggingface dataset:
MNCTF2017 攻撃痕跡☆☆★

#問題

http://mnctf.info/mnctf2017/top.php

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/f1a5d421-9d1a-ff75-b411-cbc64f5a8345.png)

#解いてみた

EDRのログを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/331ae701-ae61-b77d-8f00-04bf28ba3cca.png)

タイムラインみたいです。
攻撃者が残したファイルは以下でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e45a6fd5-f06d-56fb-0513-1843be2c9a91.png)

とっかかりがよくわからないので、ファイルリストの最初のpowershellをEDRログから検索してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/2060798e-8e2a-3df4-85a2-b0bf2c05f7cb.png)

1か所だけ見つかりました。
ダウンロードして実行してるのでこれは怪しい処理ですよね。

あぁ攻撃者が残したファイルのMD5を調べて、それがEDRログと一致する処理を見たら怪しい一覧ができそう。
ということでまとめてみると。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6849e211-0cc8-7c54-0b0c-3708efa33e28.png)

デスクトップにあるxlsx全部とかtempにあるログ全部とか、どれも重要そうですが、「もっとも重要なファイル」ではなさそうです。
そもそもファイル名がわからないので回答できない。

ただ、Parent PIDが45632になってるのは全部犯人が実行したコマンドっぽいことはわかります。
ちなみにPID 45632はというと

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/b867448e-8048-1ade-65ef-27fe8233f483.png)

cmdです。
Parent PID 45632で絞ると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4f167163-921f-79b7-6333-cc9e1ae68ce7.png)

です。

そういや

```
-hpFnckyou123
```

ってrar.exeのパスワードつけるときのオプションだったな。
と思い出した。

つまり

```
C:Program Files (x86)\Java\jre7\bin\client\jvm.dat
```

はrarファイルなんだと。
jvm.datは犯人が残していったファイルの一覧に入っていたので、この拡張子をrarに変えて解凍してみる。

解凍できた。
解凍されたファイルを見てみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/6891e490-20cd-8134-cb23-3364df695938.png)

ひとつパスワード系のファイル名があったのでこれが「もっとも重要なファイル」と思われます。
ということで正解でした。
AtCoder の過去問を解くときに、指定の言語で AC した提出回答一覧を見やすくしたい

## はじめに

AtCoder の過去問に取り組んでいると、他の人がどんなコードを書いて AC したのか参考に読みたくなることがあります。特に、自分の使っている言語を他の人がどう書いているのかを確認したくなります。

そこで、他の人の提出を絞る手間を少し減らす方法を考えたので紹介します。

## 課題

対象の過去問に提出された回答を、指定の言語で AC したものに絞るときは、以下の手順を画面上で実施する必要がありました。

* AtCoder Problems から過去問リンクを開く
* [提出一覧] -> [全ての提出] をクリック
* 検索エリアで、問題、言語、結果を指定して [検索] をクリック

過去問ごとにこの手順を踏んでいたので、少し手間を感じていました。そのため、以下のような手順にショートカットしたいと思っていました。

* AtCoder Problems から過去問リンクを開く
* 指定の言語で AC した提出回答一覧ページに遷移する

## tl;dr

AtCoder の過去問をまとめているサイト、[AtCoder Problems](https://kenkoooo.com/atcoder#/table/) をブラウザで開き、開発者コンソールで以下を実行します。
すると、各問題のリンク先が、指定の言語で AC した提出回答一覧ページになります。

```javascript
// 利用したい言語によって修正（3013 = Golang）
const language = 3013

Array.from(document.getElementsByTagName('a')).filter(
  	elem => /https:\/\/atcoder.jp\/contests\/.+\/tasks\/.+/.test(elem.href)
).forEach(
	elem => {
      let url = elem.href
      let contest = url.match(/(?<=https:\/\/atcoder.jp\/contests\/).+(?=\/tasks)/)[0]
      let task = url.match(/(?<=\/tasks\/).*/)[0]
      let submissions = `https://atcoder.jp/contests/${contest}/submissions?f.Task=${task}&f.Language=${language}&f.Status=AC&f.User=`
      elem.href = submissions
    }
)
```

例えば以下ですと、

https://atcoder.jp/contests/abc138/tasks/abc138_a

以下のような URL になります。

https://atcoder.jp/contests/abc138/submissions?f.Task=abc138_a&f.Language=3013&f.Status=AC&f.User=

## ざっくり解説

AtCoder の各問題では、以下で提出された回答を絞り込むことができます。

* 問題
* 言語
* 結果
* ユーザー

例えば ABC138 の A問題ですと、
https://atcoder.jp/contests/abc138/tasks/abc138_a

* ABC138 のA問題 の
* Golang で書いてある
* AC した提出回答のうち
* ユーザーは任意(=未指定)の回答

と検索した場合、URL は以下のようになります。

https://atcoder.jp/contests/abc138/submissions?f.Task=abc138_a&f.Language=3013&f.Status=AC&f.User=

それぞれのパラメータは以下のようですね。

* f.Task: 問題
* f.Language: 言語
* f.Status: 提出結果
* f.User: ユーザー

上記の URL に、AtCoder Problems の過去問 URL から変換し、リンク先を書き換えるスクリプトを書きました。

## おわりに

こちらで少し手間を省くことができました。例は Golang ですが、言語の数字の部分を切り替えれば他の言語も確認できると思います。

よかったら使ってみてください。またもし気になる点ありましたら教えて下さい。
UE4 ライブコーディングを試してみる

# 概要
UnrealEngine の LiveCoding を試してみたメモ書きです。
しばらく使ってみた感想を書いています。


## 環境
Windows10
Visual Studio 2017
UnrealEngine 4.22


## 参考
以下を参考にさせて頂きました、ありがとうございます。

[UE4 Live++による高速ライブコーディングについて](http://unrealengine.hatenablog.com/entry/2019/03/24/170336)


# Live Codingとは
UnrealEngine4.22にて追加された機能で、実行中のエディタやスタンドアロンゲームに対しC++コードの修正を適用することができる機能です。
（Live++というミドルウェアを統合しているようです）
ホットリロードとあんまり変わらないように思えますが、公式リリースノートによると、ホットリロードのメカニズムとは異なっており、個々の機能に変更パッチを適用するとのことです。
また、ライブコーディングは4.22現在、実験的機能となっています。



# 実行準備
ライブコーディングを使うための設定です。

## エディタ設定
[エディタの環境設定] -> [一般 - Live Coding] の [Enable Live Coding] にチェックを入れる。（エディタの再起動が必要です）

![setting.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/8c178fbf-0629-c5d6-30fe-095b61e08c47.jpeg)

エディタ再起動後、ライブコーディング用のコンソールが表示されます。
![Console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/237df200-0c37-7046-7324-f6dc5d7405ad.png)

以前にホットリロードをしていた場合、LiveCodingが上手く働かないようです。
その場合、[Binaries]フォルダにある dllやpdbファイルを全て消してから再度起動すると良いようです。


## ライブコーディング実行

C++のコードを書き替えてから、ツールバーの[コンパイル]もしくは、コンソールにて [CTRL] + [ALT] + [F11] でコンパイル＆差し替えが実行されます。

画面上にコンパイル中の表示がでます。エディター実行中でもいけます。
![compile.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/9f75ec25-cb8d-0e67-59ae-a71a69e621cc.jpeg)


エラーなくコンパイルが終われば、即パッチが作成され適用されます。
![patchcreation.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/5811a843-582c-7742-63fa-7772c5894bc2.jpeg)


[Binaries]フォルダは以下ような感じになっています。パッチファイルが作成されているのがわかります。
![patch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/fbc23a47-d6bf-f469-1dcd-e115b85fe232.png)



# 所感
使ってみた所感です。
4.22時点では実験的な機能ですが、大きな問題には遭遇していません。（たまにエディターが落ちますが）

### 反映が速い
厳密に測定をしているわけではありませんが、従来のホットリロードに比べると確かに速いです。（公式リリースコメントの差分ビルド最大350％早くなるという感じはないです:sweat:）

### 起動中のまま変更が反映される
大幅な修正は試していませんが、UE_LOGを入れたり、メンバ変数の計算を変更する程度の小さい修正は問題なく反映されました。

### UE4のEngine側のコアモジュールやPluginのコードまでを適用対象含めると動作が不安定になる
上記のことをリリースノートに記載されているようですが、よくわかりませんでした、変更が小さい場合は影響が少ないかもです。
コアモジュールやプラグインコードを含めなくても落ちる場合はありました。

![Error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/590a1c9d-5adc-f34f-ab22-1848e6aadecd.png)
↑のような状態になるとエディターの再起動が必要な感じです。（コンパイルボタンが押せない）


### ホットリロードの残骸が生まれない
ホットリロードを使っていると稀に[HOTRELOAD_***]といったファイルが生成されそれを参照している場合があります。このような事が（今のところ）起きていません。

### Live Codingのログウィンドウが少し邪魔
Live Codingのログウィンドウがエディターと別なので普段は少し邪魔です。
あと文字化けします。VisualStudioがShift-JISであるためかと思われます。英語版にすれば直るかもしれません（未検証）。

![ErrorLog.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/303806/0d9f3675-cb24-9369-d0bd-a0c703d3f7af.png)


### VisualStudio側でのビルドが失敗する
一度、LiveCodingを行うとVisualStudioでのビルドに失敗します（正確にはゲームDLLが開けないというエラーでリンクに失敗します）
ホットリロードとは併用不可なので仕方ないです。

### 不意にエディターが落ちる
頻発というほどではないのですが、不意にエディターが落ちることがあります。コード修正量が多いというわけではなく、数行だけ書き換えて落ちることもあります。ここらへんは実験的機能なので仕方ない所です。


# まとめ
ホットリロードでの不満点が改善されているのであれば今後も使っていきたいと思います。実験的機能がいつまでなのかが気になりますが。。:confused:

しばらく使ってみて、実用に困るほど落ちるわけではないのですがやはり謎のエディター落ちに遭遇します。（クラッシュレポートもローカル修正と関係ない箇所で落ちています）
今後の安定性アップに期待です。
WindowsでカスタムURLスキーマを設定し、引数付きで起動できるようにする

# 目的
ブラウザからカスタムURLを叩いてwindows端末にインストールされているローカルアプリを**引数付き**で起動したい。

本稿では以下の例の実装方式を記載する。
例：ブラウザにnote:sample.txtをを入力するとメモ帳アプリが起動しsample.txtが開くようにする

# 方法
以下のtest.regを作成し、regeditの「ファイル」→「インポート」からインポート

```test.reg(ファイル名は自由、regeditには中に記載された「note」という名前で設定が保存される）
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\note]
@="url:note protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\note\shell]

[HKEY_CLASSES_ROOT\note\shell\open]

[HKEY_CLASSES_ROOT\note\shell\open\command]
@="C:¥¥Windows¥¥System32¥¥cmd.exe /k set myvar=%1&call set myvar=%%myvar:note:=%%&call start notepad.exe %%myvar%%"
```

# 説明
ブラウザで`note:`と打ち込むと[HKEY_CLASSES_ROOT\note\shell\open\command]の欄に設定された命令が実行される。
なので単純にメモ帳を起動するだけなら

``` test2.reg
・・・
[HKEY_CLASSES_ROOT\note\shell\open\command]
@="C:¥¥Windows¥¥System32¥¥notepad.exe"
```

とかけば良い

プロトコル部分の`note:`以降のsample.txtを抽出して引数に渡したい場合が厄介で、以下の設定でURLスキーマを参照する事はできるのだが

``` test3.reg
・・・
[HKEY_CLASSES_ROOT\note\shell\open\command]
@="C:¥¥Windows¥¥System32¥¥notepad.exe %1"
```

regedit備え付けの引数`%1`はURLスキーマ全体を渡すのでnote:sample.txtをブラウザに打ち込むと以下のような処理が実行され、note:sample.txtというファイルを開こうとしてしまう。

``` test3.regを設定した場合、実行される命令
C:¥¥Windows¥¥System32¥¥notepad.exe note:sample.txt
```

なので以下の設定ではブラウザURLから直接notepadを起動するのをやめ、代わりにコマンドプロンプト(cmd.exe)を起動し、コマンドプロンプト内で`myvar`という変数に`%1`の引数を渡して文字変換をした上でメモ帳(notepad.exe)起動をしている。

``` test.reg（再掲）
・・・
[HKEY_CLASSES_ROOT\note\shell\open\command]
@="C:¥¥Windows¥¥System32¥¥cmd.exe /k set myvar=%1&call set myvar=%%myvar:note:=%%&call start notepad.exe %%myvar%%"
```

`%1`を引数にとって起動する記事はたくさんあったが、パラメータ部分のみ取得する記事はなかったので投稿、文字変換をもっと緻密に記載すれば`note://sample.txt?parm1=aaa&param2=bbb`みたいなURLにも対応できるが今はここまで

# 参考
https://superuser.com/questions/136838/which-special-variables-are-available-when-writing-a-shell-command-for-a-context/473602#473602
【5分で出来る】Androidスマホ×Python

※2019年8月時点の日曜エンジニアによる情報。

##やること
通勤途中にPythonで楽になるツールを作るための環境を作る

##材料
Androidスマホ(Android Ver.9)
(入力を時短したい人は スマホに入出力的な意味で繋がるキーボードがあると尚良い
 キーボード単品は無いけどPCならあるって人は、
 [APowerMirror](https://play.google.com/store/apps/details?id=com.apowersoft.mirror&hl=ja)とかの操作ミラーリングアプリ使えばいい)

##但し書き
自分の環境を再構築する時用の備忘録を兼ねるので
手順2のライブラリは一般的で無いものも含む

##手順概要
1.Qpythonインストール
2.必要パッケージインストール

##手順詳細
###1.Qpython3インストール
[Google Playストア](https://play.google.com/store/apps/details?id=org.qpython.qpy3&hl=ja)でGet

はい、この時点でもうPythonは使える。
疑ってる人は下記コマンドを試すべし。

```
import sys
print(sys.version)
```

自分の環境では3.6.6が表示された。


が、これだけだと使い勝手が悪いので手順2に進む

###2.必要パッケージインストール
起動画面のメニューパネル、左上のコンソールをタップ。

ってことでおなじみの真っ黒な画面が開く。
Anacondaから使うJupyter Notebookとかとは違ってコアパッケージしかinstallされてないので、以下を入力。
各パッケージの説明は[こちら](https://qiita.com/ryuichi1208/items/cb5f850a9811d2a4bc3a)

```
import pip
pip.main(['install','selenium'])
pip.main(['install','beautifulsoup4'])
pip.main(['install', 'python-fire'])
```

numpyを始めとしたいくつかのパッケージは相性が悪くコマンドラインからは入らない。
そのためコンソール画面をquit()で出て、
メニューパネルの右真ん中、金槌マークをタップ。
パッケージをタップで選べるQPYPl経由(上)をタップ。
numpy,pandas,scipy,matplotlibあたりを入れる。
以上、あとはお好きに。

#感想
一瞬でPython実行環境が整えられるのは良い。
が、仮想環境化したいなーとか欲張りだすと
Androidスマホをサーバ化してSSH接続する必要がある。
そのため、Termuxに乗り換える予定。
暫定的にPythonコードを書きたい、実行したい人はQpython3で十分。
Chainerの「ディープラーニング入門」をやってみた。（第１章）

（Pythonを軽く実務で使った経験があり、大学では軽く統計を学んで、情報系とは関係のない専攻で理系の大学院を卒業した程度の）私でも手軽に学べて触れる機械学習のサイトか何かないかなと思っていたところ、面白そうなサイトがあったので実際に使ってみました。

https://tutorials.chainer.org/ja/tutorial.html

自分のメモも兼ねて、やってみた感想や憶えておきたいことなどメモしていきます。（Qiita初投稿なので、読みにくいなどありましたら、すみません）

# Step1. 準備編
## 1. はじめに
主にやることは、Google Colaboratoryの環境導入だけで、指示に従っていけばすんなり導入できます。Jupyter Notebook環境をクラウド上で提供するGoogleのウェブサービスということで、GPUを無料で使うこともできるようです。
また、Pythonの学習ではJupyter Notebookを使っていたので、安心感がありました。

## 2. Python入門
基本的に、コードは既に入力されているので、あとは自分で実行するだけで進めます。特に計算に関わるPythonの基礎知識が中心ですが、一通り目は通しました。忘れたところは、あとで調べることにはなりそうですが。「クラス」「継承」のパートがすっきりまとまっていて改めて頭が整理できました。

### クラスの復習
オブジェクト指向プログラミングにおいて重要なクラス周りの考え方について。

- クラス：核となる全体の設計図（__init__()はクラスからオブジェクトを作成、つまりインスタンス化する際に自動的に呼ばれる）
- オブジェクト：クラスを基に作成した実体（メソッド、つまりクラス側の関数を呼び出したり、属性つまりオブジェクト内の変数を格納する）

## 3. 機械学習に使われる数学

機械学習の考え方について大枠の説明です。

### 機械学習とは
与えられたデータから未知のデータにも当てはまるような規則やパターンを抽出し、それを基に未知のデータを分類したり予測する手法を研究する学術領域。

#### 教師あり学習
機械学習の代表的な問題設定。あらかじめ問題に対する答えを用意しておき、その関係性を予想し（直線近似など）、問題に対する予想値と実際の値の差がなるべく小さくなるようにする。

- 汎化性能（generalizability）：未知のデータに対する予測の精度
- モデル：データの特徴や関係性を表すもの。この説明の例だと、*f(x)=wx+b*のような直線の計算式。（ただし、様々な考え方があり、統一的な意味で用いられているわけではない）

### 目的関数
何が良いパラメータかを定義する指標を表す関数。
**入力値** *x*と、**目標値**（実際の答え）*t*があり、適当なモデル（この場合、*wx+b*）から計算できる**予測値** *y*がある。目的関数はそのモデルの予測値と目標値を受け取って、その間の差異を測って返す関数。

#### 二乗誤差関数
予測値と目標値の間の差の二乗によって予測値の正確さを測る。
二乗誤差の平均が、平均二乗誤差と呼ばれる。この値が小さければ小さいほど、最適なパラメータであると言える。

## 4. 微分の基礎
基本は高校数学の復習になります。

## 5. 線形代数の基礎
初見は難しいと思われますが、一度学んだことがあるからか、かなりわかりやすく簡潔にまとまってると思いました。
5.5以降のベクトル値関数の微分で、4章で学んだ偏微分の知識などが活きてきます。

## 6. 統計の基礎
前半は確率の復習です。「条件付き確率」などわかっていれば、単語が初めて聞いたものだったとしても、理論は理解できるかと思います。
後半（尤度～MAP推定）は初めて聞く単語もあり、概念中心の説明だったので、難しく感じました。雰囲気がつかめればとりあえずいいのかな・・・？
最後の統計量の説明は、読めばわかるかと思います。

### 初めて知った単語など
- **周辺化**：同時確率（例：サイコロA,Bを二つ転がす）が与えられたときに、着目していない方（例：サイコロB）の確率変数がとりうるすべての値について、同時確率を計算してその和を取ること。その確率は**周辺確率**と呼ばれる。周辺確率を一覧にしたのが**周辺確率分布**。2つの確率変数の同時確率を一覧にしたのが**同時分布**。
- **ベイズの定理**：条件付き確率とは逆で「ある”結果”が観測されたときに、ある事象が”原因”となっている確率」。例：https://bellcurve.jp/statistics/course/6444.html （統計WEB）
- **尤度（ゆうど）**：観測データからもっともらしい事象の確率を推定すること（？）（例えば、コインをトスする試行を1000回繰り返し（つまりデータを掛け合わせていくということ）、コインが表になるもっともらしい確率を予測して、推定した値。的な？尤度の正規分布を考えれば、微分の値が0になるところが最大値になる。この推定が**最尤推定**と呼ばれるもの？）
- **MAP推定**：事前分布（ある前提条件で考えられる計算式を基にした分布的な？）から、パラメータ（最尤？）を推定すること。
- **不偏分散**：標本集団（母集団のうち作為的に抽出した集団）のデータ数が少ないときに、標本分散は母集団の分散よりも小さくなるため、その差分を補正した分散（データ数が多ければ値は標本分散とほぼ一緒になる）。

演習問題は飛ばします。ここまでは基礎をただただ勉強する感じでしたね。。。
次は、第２章「機械学習とデータ分析入門」に入ります。


# 参考
- Chainerが作った「ディープラーニング入門」が凄すぎる！https://qiita.com/DogFortune/items/221c182bc872025a57e7
- 人工知能（AI）ニュース
【Chainer】ディープラーニング初学者向けのチュートリアルを無償公開。Pythonの使い方から実装までの流れを学べるhttps://ledge.ai/chainer-tutorial/
【React,@media,メディアクエリ】Reactでレスポンシブデザインにする時、「react-responsive」パッケージが便利

# react-responsiveとは

Reactをレスポンシブ対応させる時、メディアクエリ（`@media`）をcssにセットして
要素ごとに表示を切り分けると、ソースが煩雑になります。

npmの「react-responsive」パッケージを使うと、下記のように
とてもわかりやすくメディアクエリをReactに導入することができます。

```react:reactive.js
  import MediaQuery from "react-responsive";

  <MediaQuery query="(max-width: 767px)">　// iPadの横幅を分岐点にしている
    <div>ここにスマートフォン向けの要素を書く</div>
  </MediaQuery>
  <MediaQuery query="(min-width: 768px)">　// iPadの横幅を分岐点にしている
    <div>ここにPC向けの要素を書く</div>
  </MediaQuery>
```

# パッケージのインストール方法
package-jsonのあるディレクトリでreact-responsiveをインストールします。

```
$ npm install react-responsive --save
```

# 詳細について
下記「参照URL」に詳しい使用方法の記載がありますので、そちらをご覧ください。


### 参照URL
- [公式 npm:react-reactive(英語のサイトです)](https://www.npmjs.com/package/react-responsive)
Python のリストをスタックやキューとして使う

# Python のリストをスタックやキューとして使う

Python には `collections.deque` があり、スタックやキューを使いたい場合それを使えば良いのだが、如何せん `from collections import deque` をググらずに空で書ける気がしないし、popleft も出てくるか怪しいので、リストで代替できるときはしてもいいかなって思った. 時間節約のために.

## スタックとして使う

### Push

特に問題ない.

```python
s.append(v)
```

### Pop

メソッド名もそのままでバッチリ.

```python
v = s.pop()
```

## キューとして使う

### Enqueue

まあ、問題ない.

```python
q.append(v)
```

### Dequeue

どうということもない.

```python
v = q.pop(0)
```
VBScriptでcURL

VBScriptでcURLを行うには、WinHttp.WinHttpRequestオブジェクトを使用します。

# GET

```vb:curl_get.vbs
Dim http: Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

Dim petId: petId = 1
Dim url: url = "https://petstore.swagger.io/v2/pet/" & petId

With http
	.Open "GET", url, False
	.Send
	Wscript.Echo .Status & " " & .StatusText
	Wscript.Echo .ResponseText
End With
```

```
>cscript /nologo curl_get.vbs
200 OK
{"id":1,"category":{"id":0,"name":"DOGS"},"name":"doggie","photoUrls":["string"],"tags":[{"id":0,"name":"string"}],"status":"available"}
```

# POST

```vb:curl_post.vbs
Dim http: Set http = CreateObject("WinHttp.WinHttpRequest.5.1")

Dim url: url = "https://petstore.swagger.io/v2/store/order"

Dim data: data = "{ ""id"": 1, ""petId"": 1, ""quantity"": 0, ""shipDate"": ""2019-08-24T04:07:54.083Z"", ""status"": ""placed"", ""complete"": false}"

With http
	.Open "POST", url, False
	.SetRequestHeader "Content-Type", "application/json"
	.Send data
	Wscript.Echo .Status & " " & .StatusText
	Wscript.Echo .ResponseText
End With
```

```
>cscript /nologo curl_post.vbs
200 OK
{"id":1,"petId":1,"quantity":0,"shipDate":"2019-08-24T04:07:54.083+0000","status":"placed","complete":false}
```

---

WinHttpRequestオブジェクトの詳細なリファレンスは[コチラ](https://docs.microsoft.com/en-us/windows/win32/winhttp/winhttprequest)
prettier-ruby VSCode Formatterがprettier-vscode 1.10.0でぶっ壊れた？時にやってみる改善方法

# 問題

### 環境

- VS Code Version: 1.37.1
- prettier-vscode 1.9.0
- plugin-ruby 0.15.0

[prettier-ruby VSCode Formatter設定][2]
このやり方で問題なく動いていたが、

- prettier-vscode 1.10.0

に上がったのが影響したようで、prettierがrubyで効かなくなってしまった。

# やってみた事

1. `~/.vscode/extensions`配下をとりあえず全コピー
2. `~/Library/Application\ Support/Code`配下をとりあえず全コピー
3. オリジナルの`extensions`、`Code`フォルダを消し、VS Code再起動、これでまっさらの状態に
4. prettier-vscode 1.10.0を入れる
5. .prettierrcを適当なフォルダに作る
6. 下のようなsample.rbをそのフォルダへ
7. このフォルダ内で`yarn add --dev prettier @prettier/plugin-ruby`をする
8. 最終的にはこう言う構成  
![sample_rb_—_xxx.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16757/c8dd6aaa-b2c0-9806-5774-df2860e22516.png) 
9. `settings.json`を[編集して][1]、`"editor.formatOnSave": true`を追加
10. VS Code再起動
11. sample.rbをsaveしてみる
12. おかしいと思えば、最初にコピーした`extensions`、`Code`を元に戻す



```ruby:sample.rb
        d=[30644250780,9003106878,
    30636278846,66641217692,4501790980,
 671_24_603036,131_61973916,66_606629_920,
   30642677916,30643069058];a,s=[],$*[0]
      s.each_byte{|b|a<<("%036b"%d[b.
         chr.to_i]).scan(/\d{6}/)}
          a.transpose.each{ |a|
            a.join.each_byte{\
             |i|print i==49?\
               ($*[1]||"#")\
                 :32.chr}
                   puts
                    }

```

# 解決策

[prettier-ruby VSCode Formatter設定][2]との違いとしては[plugin-ruby][3]を入れる場所。
どうもprettier-vscodeがある場所ではなく、プロジェクトのフォルダに入れておく必要があるっぽい。
(globalに入れてもみたけど、これだと動かない様子)

`prettier-vscode 1.10.0`になってprettierがrubyで動かなくなったら、

```bash
cd /to/your/project/folder
yarn add --dev prettier @prettier/plugin-ruby

```

を試してみると直るかも知れません。


[1]: https://qiita.com/koshilife/items/c112c57673721e3d0015#step3-vscode%E3%81%AE-settingsjson-%E3%81%AB%E5%8A%A0%E7%AD%86
[2]: https://qiita.com/koshilife/items/c112c57673721e3d0015
[3]: https://qiita.com/koshilife/items/c112c57673721e3d0015#step2-ruby%E7%94%A8%E3%81%AE%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
[Houdini] VEXで剛体の回転を正確にアニメーションする

# 動機
Houdiniには剛体をアニメーションする機能として、BulletとかHoudini RBDとかODEという剛体エンジンを使ったDOPノードが用意されているのですが、所詮ブラックボックスなので、中身を自由に改造して機能を拡張することは難しかったりします。

そこで、VEXというHoudiniに内蔵されている言語を使って、剛体のソルバを自作してみました。この記事では慣性テンソルを使った正確な剛体の回転をVEXで書く方法について解説したいと思います。


GitHubに*.hipファイルをアップしていたので適宜参考にして下さい。
https://github.com/nobuyuki83/houdini_vex_rigidbody

![rb.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242575/47b46bb7-2ab7-0e16-ff11-2644e3cc45ad.gif)



# 剛体の運動方程式

剛体とは回転と並進の自由度だけで記述される（つまり弾性変形しないような）質点の集合です。ここでは、基準配置からの回転がと並進がそれぞれ、直行行列$R\in SO(3)$と、３次元ベクトルで$P$を用いて表現されるとしましょう。つまり、基準配置で$p_0$の位置にあった点は、剛体変形後に$p=R p_0+P$の位置にあるとしましょう。

剛体の角速度については２通りの異なる定義があるのですが、ここでは以下のように角速度ベクトル$\Omega$を定義します:

```math
\dot{R} = R\tilde{\Omega}
```

$\Omega$の上にチルダが乗っていますが、これはベクトル$\Omega$から作られる反対称(anti-symetric)な行列を意味しています。要するには外積を行列表記にしたものですね。詳しくはWikipediaの記事を参考にしてください:[Wikipedia: 交代行列](https://ja.wikipedia.org/wiki/%E4%BA%A4%E4%BB%A3%E8%A1%8C%E5%88%97)

ここでは詳しくは解説しませんが、この角速度ベクトルは次のように時間発展します（外力＝０とします）。

```math
\dot{\Omega} = I^{-1} (\tilde{\Omega} I \Omega)
```
ここで出てくる$I$は3x3の行列で、慣性テンソルと呼ばれるものです。Houdiniの``RBD Object``では``Rotational Stiffness``という名前のパラメータです。慣性テンソルを使うと回転のエネルギー$W$は

```math
W = \frac{1}{2}\Omega^T I \Omega
```

のように書くことができます。例えば、ある軸$u$を考えたときに、$u^T I u$が大きければ、「その軸回りに回転させるのには大きなエネルギーが必要」なので「軸$u$の周りには回転しにくい」ということです。

慣性テンソルは必ず正定値対称なので、互いに直行する慣性主軸とう軸を持ちます。慣性主軸と$\Omega$が並行だと、$\Omega$と$I\Omega$が並行になるので、外力が無いと$\dot{\Omega}=0$となり、角速度は変化しません。一定の速度で一定の向きに回転します。逆に、慣性主軸と$\Omega$が並行でないと、角速度が時間変化します。これを歳差運動(Procession)といいます。

これは私の個人的な意見ですが、この歳差運動が有ると、剛体の回転の「動きのリッチさ」が増します。なので、慣性テンソルを考えて正確にアニメーションすることは結構重要なんじゃないかと思っています。


# VEX プログラミング
### アトリビュートの生成

XYZ軸に直行するような、X辺、Y辺、Z辺の長さがそれぞれ、１，２，３である直方体がランダムな初期角速度で回転することを考えましょう。この直方体の慣性テンソル$I$は次のように書けます。

```math
I = \left[\begin{array}{lll}
13 & 0 & 0\\
0 & 10 & 0\\
0 & 0 & 5\\
\end{array}\right]
```
次のようにVEXを書くと、頂点のアトリビュートとして、慣性テンソルや質量、角速度、初期姿勢を生成できます。

```cpp
v@W = set(1.0*rand(@ptnum*2)-0.5, 
          4.0*rand(@ptnum*4)-2.0, 
          4.0*rand(@ptnum*8)-2.0); // initial Angular velocity
p@orient = {0,0,0,1}; // initial orientation in quaternion
vector ex = set(1,0,0);
vector ey = set(0,1,0);
vector ez = set(0,0,1);
matrix3 Ix = outerproduct(ex,ex);
matrix3 Iy = outerproduct(ey,ey);
matrix3 Iz = outerproduct(ez,ez);
3@I = 13*Ix + 10*Iy + 5*Iz; // inertia tensor
```

## 角速度の速度

前章の式をそのままVEXに書き起こすと、角速度の速度は以下のように計算できます。

```cpp
vector dw = invert(3@I)*cross(v@W, 3@I*v@W);
```

##前進オイラー法

前進オイラー法を使うと、姿勢と角速度は次のように更新されます。

```cpp
@orient = qmultiply(@orient, quaternion(@TimeInc,v@W) );
v@W = v@W + dw*@TimeInc;
```

#おわりに

前進オイラー法は時間ステップが大きくなると不安定になります。GitHubのコードでは４次のRunge-Kutta法を使って時間積分をしていますので、ぜひ参考にして下さい。

## 参考

理論と実践で学ぶHoudini -SOP&VEX編-
https://www.amazon.co.jp/dp/4862463592/
DjangoでImageFieldを使おうとしたらPillowがないらしかった

こんにちはやっしーです。
Djangoで画像アップロードを実装しようとしたら、
## 問題　pillowをインストールしたのにないってさ！
```
SystemCheckError: System check identified some issues:

ERRORS:
blog.Image.image: (fields.E210) Cannot use ImageField because Pillow is not installed.
        HINT: Get Pillow at https://pypi.org/project/Pillow/ or run command "pip install Pillow".
```

と出てしまった！
ちなみにPillowもインストールしてある。



```
pip show pillow

---
Metadata-Version: 2.0
Name: Pillow
Version: 6.1.0
Summary: Python Imaging Library (Fork)
Home-page: http://python-pillow.org
Author: Alex Clark (Fork Author)
Author-email: aclark@aclark.net
License: UNKNOWN
Location: /Users/shoichi/.pyenv/versions/anaconda3-2.4.1/lib/python3.5/site-packages
Requires: 
```

## 原因　pip listしても出るのに！？
[Django ImageFieldの公式ドキュメント](https://docs.djangoproject.com/en/2.2/ref/models/fields/#imagefield)みても、バージョンの依存性はないのになんでだろうなあと思っていて探していたらどうやら
インストールしている場所と仮想環境が参照しているところが違うみたい、、、？

## 解決
これを参考に
https://www.haya-programming.com/entry/2018/09/09/202711

とにかくこれやったら解決した

```
python3 -m pip install pillow
```

それでImageField使ってるやつマイグレーションしたら、

```
Migrations for 'blog':
  blog/migrations/0004_image.py
    - Create model Image
```
やったーーーーーー


ーーーーーーーーーーーーーー
Name:やっしー
大学生。新卒即戦力という矛盾を達成するため日々勉強中。2020年卒業見込み。
研究：少ないデータでの機械学習(一般物体認識、GAN等)
言語：Vuejs,Nuxt,Vuex, Django,Laravel
TwitterID: @Yasshieeee
githubID: [YaCpotato](https://github.com/YaCpotato)
ーーーーーーーーーーーーーー
mecab-skkserv-0.03の辞書を最新版のMeCabでビルドする手順

MeCabを用いたシンプルな仮名漢字変換サーバである[mecab-skkserv-0.03](http://chasen.org/~taku/software/mecab-skkserv/)の辞書を最新版のMeCabでビルドしようとしたらすんなりといかなかったので手順をメモします。

## mecab-skkserv-0.03のダウンロード & 解凍 & ディレクトリ移動
```console
$ curl -O http://chasen.org/~taku/software/mecab-skkserv/mecab-skkserv-0.03.tar.gz
$ tar -xzvf mecab-skkserv-0.03.tar.gz
$ cd mecab-skkserv-0.03
```

## 辞書の生成

そのまま`mecab-dict-index`で辞書を生成しようとするとエラーが出て生成出来ません。

```console
$ `mecab-config --libexecdir`/mecab-dict-index -c utf-8 -f euc-jp
dictionary.cpp(258) [factor > 0] cost factor needs to be positive value
```

これは`dicrc`に`cost-factor`の項目がないためなので追加します。

```console
$ echo 'cost-factor = 800' >> dicrc
```
もう一回挑戦。

```console
$ mecab-dict-index -f euc-jp -c utf-8
./pos-id.def is not found. minimum setting is used
reading ./unk.def ... 2
emitting double-array: 100% |###########################################| 
./model.def is not found. skipped.
./pos-id.def is not found. minimum setting is used
reading ./dic.csv ... 446035
emitting double-array: 100% |###########################################| 
reading ./matrix.def ... 1281x701
emitting matrix      : 100% |###########################################| 

done!
```
生成できた！

## 辞書の確認

```console
$ echo 'きみはだれ？' | mecab -d .
きみ	君
は	は
だれ	だれ
？	？
EOS
```
うまくいきました！

なお、mecab-skkservのサーバ本体はいろいろいじってコンパイル通るところまでいきましたが、文字列を与えても何も結果が返ってこない状態なので諦めました……。
予測器毎のcoef_、feature_importances_属性の保持状況を調べてみた

# はじめに
scikit-learnにおいて、予測に有効な特徴量を確認したり、sklearn.feature_selection.RFE を使って特徴量選択を行う場合等に、予測器が保持する coef_ 属性または feature_importances_属性が使われる。
coef_は線形回帰モデルの係数であることや、feature_importances_はアルゴリズムによっては生成されないなど、予測器によって保持状況が異なると思われる。
そこで今回、各予測器毎にこれらの属性の保持状況を調べてみた。

# 環境
- scikit-learn 0.21.2

# 調査した予測器
調べたものは以下のもの。XGBCRegressor、LGBRegressor、CatBoostRegressor はscikit-learnにもともと用意されている予測器ではないが、scikit-learnのインターフェースが用意されているため、合わせて調査した。また、分類器があるものは大体回帰器も用意されていることが多いため、今回回帰器のみピックアップした。

- LinearRegression
- Ridge
- Lasso
- ElasticNet
- SGDRegressor
- PLSRegression
- SVR(カーネルは"linear"、"rbf"で試す）
- RandomForestRegressor
- ExtraTreesRegressor
- AdaBoostRegressor
- XGBRegressor
- LGBMRegressor
- CatBoostRegressor
- MLPRegressor


# コード
調査のために作成したコードは以下の通り。ポイントとしては、fit()メソッドを実行しないと、
coef_、feature_importances_属性にアクセスできないため、irisデータを使って予測モデル作成したあとにhasattr関数を使って調査した点。

```RegressionFeatureImportanceCheck.py

from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet, SGDRegressor
from sklearn.cross_decomposition import PLSRegression
from sklearn.svm import SVR
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor, AdaBoostRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor
from sklearn.neural_network import MLPRegressor
from sklearn.datasets import load_iris
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)

def main():

    estimators = [LinearRegression(), Ridge(), Lasso(), ElasticNet(), SGDRegressor(), PLSRegression(),
                  SVR(kernel='linear'), SVR(kernel='rbf'), RandomForestRegressor(), 
                  ExtraTreesRegressor(), AdaBoostRegressor(), XGBRegressor(), LGBMRegressor(), 
                  CatBoostRegressor(), MLPRegressor()]

    iris = load_iris()
    y = iris.target
    X = iris.data

    for estimator in estimators:
        estimator.fit(X, y)
        print("|{0}|{1}|{2}|".format(
            estimator.__class__.__name__,
            hasattr(estimator, "coef_"),
            hasattr(estimator, "feature_importances_")
        ))

if __name__ == "__main__":
    main()
```

# 結果
結果は以下の通り

|分類器|coef_|feature_importances_|
|-----|-----|----|
|LinearRegression|True|False|
|Ridge|True|False|
|Lasso|True|False|
|ElasticNet|True|False|
|SGDRegressor|True|False|
|PLSRegression|True|False|
|SVR(kernel="linear")|False|False|
|SVR(kernel="rbf")|False|False|
|RandomForestRegressor|False|True|
|ExtraTreesRegressor|False|True|
|AdaBoostRegressor|False|True|
|XGBRegressor|False|True|
|LGBMRegressor|False|True|
|CatBoostRegressor|False|True|
|MLPRegressor|False|False|


#考察
今回調べた中での結果は以下の通り。

- coef_属性は全ての線形モデルの予測器が保持していた。逆にそれ以外は保持していなかった。
- feature_importances_属性は、全てのアンサンブルモデルが保持していた。それ以外は保持していなかった。
- SVR(kernel="rbf)および、MLPRegressorは、どちらも保持していなかった。

おおよそ予想通りの結果となった。
テスト仕様書レビュー観点

# テスト仕様書レビュー観点
- 仕様か、バグか
  →仕様の場合は、テスト仕様書不要

- テスト仕様書から、テストケースが読み取れるか
- 修正箇所に対してすべてのパターンを記載しているか
- 境界系を確認しているか
- 異常系を確認しているか

- CRUD単位での確認を行っているか
  →保存されていること、更新されていること

- アクション毎の確認を行っているか
  →ボタン押下、リンク押下、フォーカスアウト、フォーカスイン

- データに該当の入力内容が反映されているか
- 画面遷移がある場合は、表示想定の画面を明記しているか
- 重複のケースパターンが除外されているか
- 誤字脱字がないか
javascriptで日付を取得しhtml内で表示

headに、

```html
<script src="javascript/script.js"></script>
```
bodyに

```html
<span id="month"></span>
<script type="text/javascript">					
	printMonth();
</script>
月
<span id="day"></span>
<script type="text/javascript">
	printDay();
</script>
日
```

みたいにかけた。
↓javascript

```javascript
/*今日の日付表示*/

function printMonth(){
    document.getElementById("month").innerHTML=getMonth();
}

function getMonth(){
    var today=new Date();
    var mon=today.getMonth()+1;
    return mon;
}

function printDay(){
    document.getElementById("day").innerHTML=getDay();
}

function getDay(){
    var today=new Date();
    var day=today.getDate();
    return day;
}
DonkeyCar 3.1.0 MPU6050を搭載してデータを可視化する

#準備
車にMPU6050を取り付ける
![IMG_1283s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263672/30371563-d123-0815-bb23-e1d2c637c5fb.jpeg)
![IMG_1283s2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263672/b0a8a130-b6fd-95b1-1913-2b4c3ffa2897.jpeg)

VCC,GND,SCL,SDAをCPUボードのI2Cに接続

myconfig.py の
＃ HAVE_IMU = False
を
HAVE_IMU = True
に書換える

ホストPCの
~/projects/donkeycar/donkeycar/management/makemovie.py
の
def draw_user_input(self, record, img):
の最後に以下を追加

        if 'imu/acl_x' in record:
            imu_acl_x = float(record["imu/acl_x"]) / 10
            imu_acl_y = float(record["imu/acl_y"]) / 10
            imu_acl_z = float(record["imu/acl_z"]) / 10
            imu_gyr_x = float(record["imu/gyr_x"]) / 100
            imu_gyr_y = float(record["imu/gyr_y"]) / 100
            imu_gyr_z = float(record["imu/gyr_z"]) / 100

            textFontFace = cv2.FONT_HERSHEY_SIMPLEX
            textFontScale = 0.4
            textColor = (255,255,255)
            textThickness = 1

            cv2.putText(img,str(round(imu_acl_x,2)),(0,29),textFontFace,textFontScale,textColor,textThickness)
            cv2.putText(img,str(round(imu_acl_y,2)),(0,39),textFontFace,textFontScale,textColor,textThickness)
            cv2.putText(img,str(round(imu_acl_z,2)),(0,49),textFontFace,textFontScale,textColor,textThickness)
            cv2.putText(img,str(round(imu_gyr_x,2)),(0,79),textFontFace,textFontScale,textColor,textThickness)
            cv2.putText(img,str(round(imu_gyr_y,2)),(0,89),textFontFace,textFontScale,textColor,textThickness)
            cv2.putText(img,str(round(imu_gyr_z,2)),(0,99),textFontFace,textFontScale,textColor,textThickness)

            cv2.line(img,(width//2,0),(width//2,height-1),(255,255,0),1)
            cv2.line(img,(0,height//2),(width-1,height//2),(255,255,0),1)

            x=int(round(width/2+width/2*imu_acl_y))
            y=int(round(height/2))
            img = cv2.circle(img,(x,y),2,(0,255,0),-1)
            x=int(round(width/2))
            y=int(round(height/2+height/2*imu_acl_x))
            img = cv2.circle(img,(x,y),2,(0,255,0),-1)

            x=int(round(width/2+width/2*imu_gyr_y))
            y=int(round(height/2))
            img = cv2.circle(img,(x,y),2,(255,0,0),-1)
            x=int(round(width/2))
            y=int(round(height/2+height/2*imu_gyr_x))
            img = cv2.circle(img,(x,y),2,(255,0,0),-1)

            x=int(round(width/2+width/2*imu_gyr_z))
            y=int(round(height/2))
            img = cv2.circle(img,(x,y),2,(0,0,255),-1)

注：基板の取り付け方向をシルクのx-yの向きに合わせたが表示を見ると違和感があったのでｘとyを入れ替えている（24,25,28,29行目）
#動画生成
教師データを作成してホストPCに転送

ホストPCで
donkey makemovie --tub ./data/ --out ./movie.mp4
を実行する
ABC 116 C-Grand Garden



#ABC116 C Grand Garden
##問題概要
要素数Nの配列{h[0],h[1],....,h[N-1]}が与えられる。これを、1が連続して現れる配列の和として表すとき、必要な配列の個数の最小値はいくつか？

##考えたこと
例えば、h={3,1,2,3,1,1,2}とすると、
```(3,1,2,3,1,0,2)
=(1,1,1,1,1,1,1)
+(0,0,1,1,0,0,0)
+(0,0,0,1,0,0,0)
+(1,0,0,0,0,0,0)
+(1,0,0,0,0,0,0)
+(0,0,0,0,0,0,1)
```
という風に、配列hは6つの連続する配列の和として書ける。以下、1が連続する配列を1配列と呼ぶことにする。
コード実装のアイデアとしては、まず配列hを先頭から順に見て行って、h[i] != 0なら、1配列に対応する区間をスタートし、h[i]=0になるか hの最後まで見終わったら区間を終了する。なお、区間中の0でない要素をそれぞれ1減らしていく。
この操作をhの全ての要素が0になるまで繰り返した時の、区間の数の合計が答えとなる。
##ソースコード
```c++
#include <bits/stdc++.h>
using namespace std; 

int main() {
  int N;
  cin >> N;
  vector<int> h(N);
  for(int i = 0;i<N;i++){
    cin >> h[i];
  }
  int res = 0;
  while(*max_element(h.begin(),h.end()) >0){//hの全要素が0になるまでやる
    for(int i = 0;i<N;i++){
      if(h[i] != 0){//高さが0でなかったら区間スタート
        res++;
        while(i<N){
          if(h[i] != 0){
            h[i]--;//高さが0でない要素から1を引いていく
            i++;
          }
          if(h[i] == 0) break;//0なら区間終了
        }
      }
    }
  }
  cout << res << endl;
}

```
kotlin + coroutine + リサイン(resign)

最近はkotlin + coroutineが主流になってきているので流れに乗っかって開発をしていたときに踏んだ地雷です。
同じ地雷を踏んだ方の参考になれば幸いです。

#起きた問題
・リリース用apkを出力後、リサインを行った場合に100%クラッシュが発生していた。
・手元の端末（Pixel3 OS: 9）でリサインされる前のリリース用のapkをインストールした場合は正常に動作する。
ログに出力されたエラーは以下の通り（一部抜粋）
`IllegalStateException: Module with the Main dispatcher is missing. e.g. 'kotlinx-coroutines-android'`

#proguardについて
以下の内容は記載済み

```ruby:proguard-rules.pro
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepnames class kotlinx.coroutines.android.AndroidExceptionPreHandler {}
-keepnames class kotlinx.coroutines.android.AndroidDispatcherFactory {}

-keepclassmembernames class kotlinx.** {
    volatile <fields>;
}
```

#原因
リサインする際にapkファイルが保持している`META-INF`ディレクトリを丸ごと削除しているのが原因。
(`META-INF`の内容を確認したい場合は、apkファイルの拡張子を`.zip`へ変更後、コマンドから`unzip test.zip`を行えば確認することができます)

■参考
・https://github.com/mozilla-mobile/reference-browser/issues/591
・https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html

#理由
`MainDispatcherLoader`が`ServiceLoader`を使用していて、`ServiceLoader`は`META-INF/services`ディレクトリ内にある情報を取りに行き、リサイン後は署名ファイルだけの状態になっていて必要な情報がなくなっているため。

■参考
・https://medium.com/@hanru.yeh/quick-note-kotlin-coroutine-dispatcher-gets-android-main-dispatcher-by-serviceloader-29b88cb0df8b

#対処方法
- リサインを行う際にMETA-INFディレクトリは削除せず署名ファイルだけを削除して追加し直す。(おそらく一番ベスト)
- META-INFディレクトリは削除するがリサイン前に中身を一旦別ディレクトリへ退避して、リサイン後に必要な情報（署名ファイル以外）をMETA-INFディレクトリへ追加する（申し訳ないのですが試していないので出来るかどうかは不明）
- リサインを行わない。
- coroutineを使わない。
- `ServiceLoader`が`META-INF/services`へ情報を取りに行く箇所を洗い出してリサインされても大丈夫なように処理を作る。

最後3つは現実的ではないので難しいところですね。。。
coroutineが流行ってて導入してるのにcoroutineを使わないって。。。

こんな方法で解決したよ！！なんて方がいれば教えていただけますと幸いです。
Visual Studio Codeでgorenameが使えない問題に対処する

Visual Studio Codeでgolangを使っていると、F2キーでシンボルの名称を変更することができるらしいのですが、実際に実行してみると、

```
Rename failed: gorename: can't find package containing ......main.go 
```

と怒られてしまいます。下記の2点を行えば解決します。

1. 設定に`"go.useLanguageServer": true`を追加する
2. VS Codeからサジェストされる`gopls`インストールする

Goland使いたい。。。
サクラエディタでコマンドラインから文字列置換する方法

# サクラエディタを利用して、コマンドラインから文字列置換の方法を調べてみました。



【注意】

個人的に作成したBatのサンプルです。
使用の際は、各自で必ずテストをしてから使用してください。責任は負いかねます。


▼マニュアル

https://sakura-editor.github.io/help/HLP000109.html



▼ナレッジ情報

https://arimasou16.com/blog/2017/03/17/00211/

https://sourceforge.net/p/sakura-editor/patchunicode/762/




▼サンプル

```
set target_path=C:\WORK\test
set sakura="C:\Program Files (x86)\sakura\sakura.exe"
%sakura% -GOPT=U -GREPMODE -GKEY="http://old" -GREPR="http://new" -GFOLDER="%target_path%"
%sakura% -GOPT=U -GREPMODE -GKEY="3333old" -GREPR="3333new" -GFOLDER="%target_path%"
```


検索文字列： -GKEY=

置換後文字列： -GREPR=

対象ファイルの配置パス： -GFOLDER=



やり方は、BATファイルを作成して、

置換キーワード個数分のコマンドをBATファイルに記載しておき、

後は、BATを実行するだけで、行けると思います。
サーバー作業中にたまに使うコマンド集

# サーバー作業中で使うコマンド
サーバー作業中にたまに使用するときに都度調べるコマンド。

## ディスク容量・ファイルシステム

```
df -h
```
- df:パーティション別の総容量、使用量、空き容量、利用率を調査
 - h:SI単位「k」「M」「G」の単位を使って表示

```
du -s /* -x |sort -nr
du -s /* -x |sort -nr | head -10

du -sh /* -x
du -sh /* -x
```
- du:指定したファイルやディレクトリの使用容量を集計
 - s:ディレクトリの総計
 - h:単位を見やすい形に
 - x:別のファイルシステムのディレクトリを除外（マウントしている外付けなど）

- sort
 - n:数値として並べ替え
 - r:降順

- head
 - 10:上位10

## メモリ使用率
```
free [オプション]
```
**オプション**

| -b | メモリの容量をバイト単位で表示します。 |
|:--|:--|
| -k | メモリの容量をキロバイト単位で表示します。 |
| -m | メモリの容量をメガバイト単位で表示します。 |
| -s | 指定した秒間隔で表示を続けます。 |
| -t | 物理メモリとスワップメモリの合計も表示します。 |
| -V | バージョン情報を表示します。 |

## ファイル検索
https://eng-entrance.com/linux-command-find#find-2

## コマンド場所確認
コマンドが置かれているディレクトリを調べる。

http://www.atmarkit.co.jp/flinux/rensai/linuxtips/163wherecomd.html

```
which [オプション] [調べたいコマンド]
which ls
which -a ls
```
- which:環境変数のPATHに設定されているディレクトリ順に調べ、最初に見つかったコマンドを表示
 - a:PATHに設定されている全ディレクトリを調べる

## vi
### 文字列置換

```
置換確認なし
:s/置換対象文字列/置換後文字列/
置換確認あり
:%s/置換対象文字列/置換後文字列/gc
```

## cat
ディレクトリ配下のファイルをすべてcat

```
find -type f -print0 | xargs -0 more | cat
```
Yahoo のローカルmap Apiをpythonでたたいてみた

#目的
PythonからWeb apiを呼び出す練習として、Yahoo のローカルmap Apiを使ったが、ちょっと詰まったので共有

#前提 
* Windows 10
* Python 3.7.3

#コード
```rb
import urllib.request
import urllib.parse
import urllib.error


serviceurl = 'https://map.yahooapis.jp/search/local/V1/localSearch?'
searchWord = input('検索ワード:')
encodeSearchWord = searchWord.encode()

# param作成
parms = dict()
parms['appid'] = 'dj00aiZpPWJjSkFpcHQ2WlJmZSZzPWNvbnN1bWVyc2VjZXZXZng9MjM-'#プライバシー保護のため一部変更してます
parms['query'] = encodeSearchWord
parms['results'] = 100
parms['output'] = 'xml'

url = serviceurl + urllib.parse.urlencode(parms)

print('Retrieving', url)
uh = urllib.request.urlopen(url)
data = uh.read().decode()
print('Retrieved', len(data), 'characters')
# print(data[:200])


# 書き込み
file = open('result.xml', 'w', encoding='UTF-8')
file.write(data)
file.close()

```

#解説
基本的に以下の公式url通りで問題ない
url:https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/localsearch.html

ただし、以下の注意が必要

* アプリケーションId(コードのappid)は、確認画面では「ClientId」と記載されているため、アプリケーションIdどこや！となる
* 検索ワードはencode(searchWord.encode())しないといけない。str型ではだめ

ほかにもいろいろな検索パラメータがあるので、興味のある人はぜひ
ADX2LEでヘッドフォンバーチャルサラウンドを試す

# 試してみた
ADX2LEのエフェクトに「[ヘッドフォンバーチャルサラウンド](https://game.criware.jp/manual/adx2_tool/jpn/contents/criatom_tools_atomcraft_dsp_headphonvertualsurround.html)」というのがあったので試してみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/a7d374e5-1a9c-7df0-6202-e21bc00ea665.png)

ヘッドフォン向けにチューニングされている様子。

# 音を鳴らしてみたところ

https://youtu.be/xZYA4mLZMB0


https://twitter.com/tatmos/status/1165076907584454656?s=20

最初は通常の3Dポジショニング
途中でDSPバス設定を切り替えています。

微妙にディレイ成分が変化しているのと、レベルメータの振れ方が違うようです。

# マトリクスエフェクト

ヘッドフォンバーチャルサラウンドを通しているのですが、なぜかサラウンド側に音がもれてしまうようなので、
マトリクスエフェクトでLs,Rsの出力をL,Rに出力するように変更しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/96808/73ea26ad-de19-6f55-2d4a-665a268756df.png)

io40 (4がLs,0がL) とio51 (5がRs,1がL)に出力チャンネルを変更。

# Unityで試してみる

と思ったのですが、うまく動かないようでした。
UnityはVer.2017.4.28f1
ADX2LE Ver.3.40.17

うむむ（製品版だと動くのだろうか・・・）
->バスを増やすと動くらしい　ダミーでよいのでとりあえずバスを増やそう
chmodの意味

# はじめに
chmodをやってもらう機会があったので、まとめてみました。

# chmodの意味

change mode の略。
ファイルへの権限変更するときのLinuxコマンド。

# 具体的なコード

```terminal:全権限を全ユーザに付与
$ touch test.txt

$ chmod 777 text.txt
```

```確認
$ ls -l

-rwxrwxrwx      1 hajime  staff     0B Aug 24 11:18 test.txt
```
確認では lsコマンドの -l オプションを使って、ファイルの詳細を表示する.

左から順に

* ファイルタイプ（「-：ファイル」「d：ディレクトリ」「l：シンボリックリンク」）
* パーミッション
* ハードリンクの数
* オーナー名
* グループ名
* バイトサイズ
* タイムスタンプ
* ファイル名

となっている

パーミッションの部分に着目すると、

rwxrwxrwx 

となっている。

# 覚え方

覚えなくてもいいと思うのですが、

4 が読み取り権限を表し、rで表される
2 が書き込み権限を表し、wで表される
1 が実行権限を表し、xで表される

chmodコマンドのあとの「3桁の引数」で数字を指定することによって、誰にどの権限を渡すか指定します。
3桁の引数では
一番左の数字が、所有者の権限を表し、
真ん中の数字が、グループ権限を表し、
一番右の数字が、その他のユーザの権限を表す。

```terminal:全権限を全ユーザに付与
$ chmod 777 test.txt    → 7は（4+2+1）なので、全権限
```
これだと全権限を全ユーザに付与することになる

```terminal:所有者に読み取り権限のみ付与
$ chmod 400 test.txt

$ ls -l

-r--------      1 hajime  staff     0B Aug 24 11:18 test.txt
```
これだと所有者に読み取り権限のみ

AWSのEC2にsshするときとか、これにしました。

# まとめ
基礎of基礎ですが、誰かの役に立てば。
分類器毎のdecision_function、predict_probaの保持状況を調べてみた

# はじめに
分類問題でROC曲線を書いたり、ROC-AUCスコアを計算する場合に、しきい値が必要となり、scikit-learnでは分類器の decision_function()やpredict_proba()メソッドが利用される。一般にscikit-learnの分類器はこれらのメソッドのどちらかを保持しているという記載を本でみたため、実際に調べてみた。

# 環境
- scikit-learn 0.21.2

# 調査した分類器
調べたものは思いついた以下のもの。XGBClassifier、LGBMClassifier、CatBoostClassifier はscikit-learnにもともと用意されている分類器ではないが、scikit-learnのインターフェースが用意されているため、合わせて調査した。

- LogisticRegression
- SGDClassifier
SVC
- RandomForestClassifier
- ExtraTreesClassifier
- AdaBoostClassifier
- XGBClassifier
- LGBMClassifier
- CatBoostClassifier
- MLPClassifier

# コード
```ClassificaitonScoreFunctionCheck.py
from sklearn.linear_model import LogisticRegression, SGDClassifier
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier, AdaBoostClassifier
from xgboost import XGBClassifier
from lightgbm import LGBMClassifier
from catboost import CatBoostClassifier
from sklearn.neural_network import MLPClassifier


def main():

    estimators = [LogisticRegression, SGDClassifier,SVC,RandomForestClassifier,
                  ExtraTreesClassifier, AdaBoostClassifier, XGBClassifier,
                  LGBMClassifier,CatBoostClassifier,MLPClassifier]

    for estimator in estimators:
        print("{0},{1},{2},{3}".format(
            estimator,
            hasattr(estimator, "predict"),
            hasattr(estimator, "predict_proba"),
            hasattr(estimator, "decision_function")
        ))

if __name__ == "__main__":
    main()

```

# 結果
|分類器|predict_proba()|decision_function()|
|-----|-----|----|
|LogisticRegression|True|True|
|SGDClassifier|True|True|
|SVC|True|True|
|RandomForestClassifier|True|False|
|ExtraTreesClassifier|True|False|
|AdaBoostClassifier|True|True|
|XGBClassifier|True|False|
|LGBMClassifier|True|False|
|CatBoostClassifier|True|False|
|MLPClassifier|True|False|

#考察

predict_proba()メソッドは全ての分類器が保持していたが、decision_functionについては、保持しているものが4つ、保持していないものが5つという結果になった。
この結果からROC-AUCスコアを計算する場合のしきい値にどちらを使うかについて、以下の方針が考えられる。

- decision_function()がないものについては、predict_proba()メソッドを使う
- decision_function()とpredict_proba()の両方があるものについては、各分類器で推奨されている、またはよく使われているメソッドを使う。
webarenaでubuntu その27


#概要

webarenaでubuntu18.04やってみた。
php7.2やってみた。
mbstringを使う。

#インストール

```
sudo apt-get install php7.2-mbstring
```

#php.iniの修正

```
extension=mbstring
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.encoding_translation = Off
mbstring.detect_order = UTF-8,SJIS,EUC-JP,JIS,ASCII
mbstring.substitute_character = none
mbstring.func_overload = 0
mbstring.strict_detection = Off
```

以上。
逆強化学習GAILの概要イメージ

# この記事について

逆強化学習に分類される手法の一つである[GAIL (Generative Adversarial Imitation Learning)](https://arxiv.org/abs/1606.03476)のイメージをまとめます。

# 図解

## 推定したいもの

![policy2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86216/d5e32598-539a-16e3-d076-3d013dd38af9.png)

- 方策関数$\pi(a|s)$は、状態$S(t)=s$において行動$A(s)=a$を起こす確率を表す関数です
- 推定したい物は、初期状態$S_{0}$から目指すべき状態$S_{t}$へ期待通り遷移できるように調整された$\pi(a|s)$です
- $\pi(a|s)$は基本的には初等関数のような簡単な関数とはならず推定が困難なため、ディープラーニングで関数を近似します

## 学習で求めるモデル

![base2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86216/4647e0a9-aca3-0e42-e738-421e2e3cbcbe.png)


- $S(t)$は、システムがセンサにより把握する現在の環境状態に相当します（e.g. 障害物までの距離等）
- $A(s)$は、システムに対して出す制御指示に相当します（e.g. ハンドル制御角度等）
- 制御の結果、システムが動き、次の状態$S(t+1)$に遷移します
- $G(s)$は、推定したい方策$\pi(a|s)$を近似したものとなります

## 逆強化学習のアプローチ

![policy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86216/462738ce-04d6-9398-640e-dfac0b873a8d.png)

- 強化学習では状態$S(t)$で得られる報酬$r(t)$を人が設計します
- 問題が複雑になるにつれ、適切な報酬設計が困難になり、強化学習が上手く回らなくなります
- 逆強化学習では、人手によるエキスパート情報により、報酬関数を推定します


## GAIL

![GAIL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86216/c17f6f6e-bad7-ae3a-3d69-35e1bbe6e75c.png)

- GANを応用した逆強化学習の手法です
- エキスパートの行動と、PROが出力する行動を判別する判別器Dを配置します
- Dは入力されたものがエキスパートからの出力である確率(0～1)を出します
- PROは自身が出力した結果をDがエキスパートだと誤判定するように学習します
- そのため、Dの出力はPROへの報酬と捉えることができます

## 注意点

- 目標とする状態(e.g. 位置等)が変化するようなタスクでは学習が困難になる可能性があります
    - 報酬はエキスパートの方策と似ているかどうかのみから決定されます
    - PROが行った行動に対する環境(シミュレータ)のフィードバックは得ていません
    - PROは自分の行動が環境にどのような影響を与えるのかを知ることができません
- 報酬の設計情報はDのモデルに隠蔽されているため、報酬設計を抜き取るのは困難です
- エキスパートを用意するために人が使った情報(S)と、PROへの入力情報(S)が同じでないと方策$π(a|s)$が学習できない可能性があります
AWSをほぼ無料でお勉強：コンソールログインを検知したい（その５）

少し時間が空いてしまいました。
コンソールログイン検知の仕組みですが、いろいろ考えて完全無料というのは難しいと判断して、今まで設定してきました。

その１
https://qiita.com/auf/items/9eb47a4fb5ba0f9f26fe
その２
https://qiita.com/auf/items/25b3f52ea74ff9f152c6
その３
https://qiita.com/auf/items/92c1e2b5f202a4894c71
その４
https://qiita.com/auf/items/c4309829e3385f69b1e4

さて、本題に入る前に今一度確認。


###コンセプト
・お金かけてまでやりたくないので基本的に無料でAWSを勉強する
　→ちょっとしたサービスを起動すると結構高額になりやすい。
・高いレベルのセキュリティ確保を目指す
　→アカウントを不正に使われるととんでもない額を請求されるので防ぐ

まあ、もう無料ではなくなってしまったので、タイトルは「ほぼ無料」に変えましたけどね。。。

###結局いくらかかっているの？
実際設定を入れてどうなったかなんですが、
![201908241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480659/87aa3223-2d4f-c53b-f475-5101391a2478.png)

こんな感じです。おー！実験はじめたところから（グラフがはじまっているところ）課金されていますね。約半月で0.44ドルなので、１ヶ月でも1ドルくらいの計算になります。まあ、これなら許容範囲ですかね。

で、結局何でお金がかかっているのかをもう少し分析してみます。
![201908242.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480659/5b039e49-4ee2-c294-dd98-a14022c54513.png)

はじめはCloudwatchとかS3かなと思っていたのですが、実はほぼ全額がKMSでした。まぁ安全にAWSを使うにはKMSは必須ですし、使わないわけにはいかないと思うのでよしとしますか。

一旦ログイン検知シリーズはこれにて終了することにします。ちなみに、コンソール操作を沢山行ったりするとログ量が増えてもっと違った課金になってくるかもしれないですね。現状、週末にちょっとお勉強で触るくらいなので、当面変わらないかなぁとは思っていますけど。
Tensorflow1.14.0の導入

Tensorflowの導入方法の説明

Tensorflowの導入はTensorflowのバージョンとCUDAのバージョンを合わせることが重要です。

バージョン対応表
https://www.tensorflow.org/install/source?hl=en#tested_build_configurations

今回は以下の組み合わせで導入します。

 - CUDA：10.0
 - cuDNN v7.6.2 (July 22, 2019), for CUDA 10.0
 - Tensorflow-gpu 1.14.0

CUDAのダウンロード。旧バージョンのダウンロードは以下から行える(2019/8時点)
https://developer.nvidia.com/cuda-toolkit-archive

CuDNNのダウンロード。アカウントが必要
https://developer.nvidia.com/rdp/form/cudnn-download-survey

Tensorflowのインストール

```
pip install tensorflow-gpu==1.14.0
```
書式付き文字列ライブラリ(fmtlib)のサンプルコードと結果

# tl;dr;
セキュリティの問題もありc++ではprintfは使いたくない。c++20では、c++ベースの書式フォーマット(std::format)の採用が決まったけど、コンパイラはc++20対応中ということで、過渡期の対応として[fmtlib](https://fmt.dev/latest/index.html)がおすすめ。ヘッダオンリーで使える。ところが、社内からはなぜか "https://fmt.dev/latest/syntax.html" にアクセスできなくなってしまったので、簡単に調べられるようにここにサンプルコードと結果をあげておくことにした。

# 浮動小数点サンプルコード
```c++
#include "fmt/format.h"
#include <chrono>
#include <fmt/chrono.h>
#include <fmt/time.h>


int main()
{
	fmt::print("浮動小数\n");
	fmt::print("{}\n",1234.567f);	     //基本
	fmt::print("{:.3f}\n", 1234.567f);   //小数部桁指定
	fmt::print("{:.4f}\n", 1234.567f);   //小数部桁指定
	fmt::print("{:0.4f}\n", 1234.567f);   //小数部桁指定　0パティング
	fmt::print("{:10.3f}\n", 1234.567f); //桁指定
	fmt::print("{:>10.3f}\n", 1234.567f);//右寄せ
	fmt::print("{:<.3f}\n", 1234.567f);  //左寄せ
	fmt::print("{:010.3f}\n", 1234.567f);//0パディング
	fmt::print("{:10.4f}\n", 1234.567f); 
	fmt::print("{:6.4f}\n", 1234.567f);  //ちなみに指定した桁が不足の場合
		
	fmt::print("{:10.3f}\n", -1234.567f); //桁指定
	fmt::print("{:e}\n", 1234.567f);
	fmt::print("{:.4e}\n", 1234.567f);


	return 1;
}

```
```console
1234.57
1234.567
1234.5670
1234.5670
  1234.567
  1234.567
1234.567
001234.567
 1234.5670
1234.5670
 -1234.567
1.234567e+03
1.2346e+03
```

以下行のみ。

# 整数サンプルコード
```c++
fmt::print("{}\n",123);
fmt::print("{:4d}\n",123);
fmt::print("{:04d}\n", 123);
fmt::print("{:0{}d}\n", 123,5);
fmt::print("{0:0{1}d}\n", 123, 5);
```
```console
123
 123
0123
00123
00123
```

# 文字列サンプルコード
```c++
fmt::print("{}\n","abc");
fmt::print("{:s}\n", "abc");
```
```console
abc
abc
```

# 引数順序指定サンプルコード
```c++
fmt::print("{}-{}\n", "abc",456);
fmt::print("{0}-{1}\n", "abc", 456);
fmt::print("{1}-{0}\n", "abc", 456);
fmt::print("{0:d}=0x{0:x}\n", 255);
fmt::print("{0:d}=0x{0:X}\n", 255);
```
```console
abc-456
abc-456
456-abc
255=0xff
255=0xFF
```

# 時間表現サンプルコード
```c++
//事前にインクルードしておく
#include <chrono>
#include "fmt/format.h"
#include <fmt/chrono.h>
#include <fmt/time.h>

std::chrono::seconds secs(90);
fmt::print("{}\n", secs);
fmt::print("{:%H:%M:%S}\n",secs);

std::chrono::minutes mins(90);
fmt::print("{}\n", mins);
fmt::print("{:%H:%M:%S}\n", mins);

auto sc_now = std::chrono::system_clock::now();
auto tm_now = std::chrono::system_clock::to_time_t(sc_now);//time_t型に変換
fmt::print("{:%Y-%m-%d}\n", *std::localtime(&tm_now));

auto tm_now2  = std::time(nullptr);
fmt::print("{:%H:%I:%S}\n", *std::localtime(&tm_now2));
```

```console
90s
00:01:30
90m
01:30:00
2019-09-02
18:06:54
```

# 履歴
2019/8/24 初版
2019/9/2　時間表現を追加
rest connectorの通信をnockでmocking

loopback4でapiをつくってるんですが、さらに開発中のcakephp3でつくているapiを呼んでいます。
cake側のapiは開発が後回しになっているので、lb4での開発中はスタブを呼ぶことにしました。
とりあえず、お客さんにapiの仕様だけを見せないといけないので。
※swagger uiを見せる予定。

rubyのfaraday+webmockみたいなのを目指しました。

# いまいちだった方法
## http-caching-proxyを使う
テキストファイルにレスポンスがキャッシュされるということで無理やりコントローラ
あたりに埋め込みました。
ですが、なんかうまく動かないし、そもそもキャッシュファイルはあらかじめ用意したいですが、
ファイル名が長い暗号みたいな文字列なので、作成の仕方もわからないのでやめました。

# ということでnockを使う
https://github.com/nock/nock
lb4に組み込まれている機能はあてにせずにnockを使うことにしました。

src/index.tsに埋め込んで、期待通りの事ができました。
これ、その上の階層のindex.tsでもいい気がしてきました。
#VsCode で複数ファイルを一斉置換するショートカットは  Ctrl + Shift + H / Command + Shift + H

The shortcut to simultaneously replace multiple files with #VsCode is Ctrl + Shift + H / Command + Shift + H


コマンドパレットからもひらけます

![image](https://user-images.githubusercontent.com/13635059/63626964-53f0b000-c640-11e9-88cd-a9c55afec77f.png)


![image](https://user-images.githubusercontent.com/13635059/63626968-5f43db80-c640-11e9-8872-e198f244899c.png)

実行するにはこのちっちゃなボタンを押しなさい。

![image](https://user-images.githubusercontent.com/13635059/63626929-36bbe180-c640-11e9-85cb-054f088b03ad.png)
![image](https://user-images.githubusercontent.com/13635059/63626940-3cb1c280-c640-11e9-8e1a-0c237e58349e.png)




# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2325








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Git BashでAnaconda, Pythonインタプリタを使う

#はじめに
Windowsのコマンドプロンプトが使いにくいのは周知のとおり。Gitを導入したらGit Bashというものが使えるようになる。grep等、linuxの便利なコマンドも使える。というわけで、早速このGit bash上でAnaconda, Pythonインタプリタを使えるようにしたので、メモしておく。


#環境
- Windows10 
- git 2.23.0.windows.1
- git-gui 0.21
- Anaconda3

#方法
ホームディレクトリに、以下の.profileファイルを置いておきGit Bashを起動すればよい。通常は```C:\Users\<ユーザ名>```にフォルダになっていると思われる。わからなければGit Bash上で、```echo $HOME``` 等で確認できる。

```.profile
. /c/ProgramData/Anaconda3/etc/profile.d/conda.sh
alias python='winpty python.exe'
```

なお、1行目は、自身のAnacondaの環境に読み替えてください。

# 注意点
上記によってcondaコマンドは使えるようになるが、activate.batにはパスが通っていないため、activateは ```conda activate <仮想環境名>``` のように実行する必要がある。
No space left on deviceが起きたら

# No space left on deviceが起きたら、何を見たらいいのか？

## 見るべきもの

### ディスクの空き容量
`df -h`とかでFREEがあるかどうか。
FREEが無ければ、不要なファイルやディスクを喰いつぶした原因を特定しよう。

### inodeの空き容量
`df -i`で`IUse%`が100%になっていないかどうか。
100%になっている場合は、やはり不要なファイルやinodeを喰いつぶした原因を特定しよう。

### セマフォの枯渇
`ipcs -s`で行数をカウントしよう。

`ipcs -s|wc -l`を実行して表示された数字を覚えておく。
`cat /proc/sys/kernel/sem`を実行してから、最後の4項目目の数字と比較する。

```
[root@wktksv (rhel7) 09:31:02 tmp]# ipcs -s | wc -l
519
[root@wktksv (rhel7) 09:31:06 tmp]# cat /proc/sys/kernel/sem
250     32000   32      1024
[root@wktksv (rhel7) 09:31:08 tmp]# 
```

こんな感じになる。
セマフォが枯渇している場合は、`/etc/sysctl.conf`で以下のように記述してから、`sysctl -p`するといい。
`#`の部分は過去の修正履歴。担当しているシステムは、よく枯渇する。

```
#kernel.sem = 250 32000 32 256
#kernel.sem = 250 32000 32 512
kernel.sem = 250 32000 32 1024
```