OmniAICreator/Qiita-1.07M huggingface dataset:
セミコロンレスC#

#セミコロンレスC#とは
Javaを習得している者として最早一般常識となりつつあるセミコロンレスJavaですが、
C#のそういう話題をあまり見ないなと思って少しだけ書いてみました。
## Hello, World

```csharp:Hello.cs
namespace SemicolonLess
{
    public class Program
    {
        public static void Main(string[] args)
        {
            if (Encoding.Default.GetBytes("Hello, Semicolon-Less world!\n") is var hellobytes &&
                Console.OpenStandardOutput().WriteAsync(hellobytes, 0, hellobytes.Length) == null){ }
        }
    }
}
```

### 変数の宣言

```VarString.cs
if ("string" is var s) { }
```

変数の宣言は `is` 型パターンで行います。
~~できないだろうなと思ってvarにしたらコンパイル通ったのでびっくりしました~~
もちろん複数宣言したい場合は&で繋げればよいので、

```VarString2.cs
if ("Hello" is var hello && "world" is var world) { }
```

ということになります。
### 標準出力
`Console.WriteLine`を使いたいところですが、`Console.WriteLine`は`void`型なので`if`文内部には使用できません。
なので`Console.OpenStandardOutput()`で標準出力を取ってきて`WriteAsync()`してやればできます。

## 値の加工

```csharp:MultipleDouble.cs
if (1 is var x && (x = x * 2) != 1) { } //Intなので恐らく2倍して1になる数値はない
```

## FizzBuzz

```csharp:FizzBuzz.cs
namespace SemicolonLess
{
    public class Program
    {
        public static void Main(string[] args)
        {
            if (Enumerable.Range(1, 100)
                .Select(a => (a, (a % 3 == 0 ? "Fizz" : "") + (a % 5 == 0 ? "Buzz" : "")))
                .Select(b => (string.IsNullOrEmpty(b.Item2) ? b.a.ToString() : b.Item2) + "\n")
                .Select(Encoding.Default.GetBytes)
                .Select(c => Console.OpenStandardOutput().WriteAsync(c, 0, c.Length)).ToList() != null) { }
        }
    }
}
```

多分考えればもっと簡潔に書けると思いますが、とりあえずセミコロンレスにするだけした感じ。

# 結論

~~セミコロンC#がそんなになかったのはそれなりに理由があった~~

* `is`型パターン
* LINQ
* Task

があればセミコロンがなくても大体のことはできる
qiitactl.vimをちょっと弄る

[ここ](https://qiita.com/astrorobot110/items/01409ae43fb4eca109fa)のスクリプトをちょっと弄ったので微細なチェックも兼ねてます。

まず最初にソース

```vim:qiitactl.vim
" qiitactlのmarkdown置き場
let s:qiitaCtlDir = ''

function! s:qiitaFetch() abort
	exec 'cd '.s:qiitaCtlDir
	let s:qiitaChk = getline(3)
	let s:isFetchSingle = 0
	if s:qiitaChk =~ '\v^url: https:\/\/qiita\.com.+\x+$'
		echo 'Fetching single post.'
		let s:isFetchSingle = 1
		let s:qiitaCmd = system('qiitactl fetch post --id='.s:qiitaChk[-20:-1])
	else
		echo 'Fetching entire posts.'
		let s:qiitaCmd = system('qiitactl fetch posts')
	endif
	echo s:qiitaCmd.'...done.'
	if s:isFetchSingle == 1 | edit! | endif
endfunction

function! s:qiitaUpdate() abort
	exec 'cd '.s:qiitaCtlDir
	let s:qiitaCmd = system('qiitactl update post '''.expand('%:p').'''')
	echo s:qiitaCmd.'...done.'
	edit!
endfunction

function! s:qiitaGenerate(file) abort
	exec 'cd '.s:qiitaCtlDir
	let s:qiitaCmd = system('qiitactl generate file '''.a:file.'''')
	exec 'new '.s:qiitaCtlDir.'\'.s:qiitaCmd
	%s/\v%(tags:)@<=\s+\[\]/^M- Vim/g	" 正規表現中の^Mは<C-v><CR>に置き換えてください。
endfunction

function! s:qiitaCreate() abort
	exec 'cd '.s:qiitaCtlDir
	let s:qiitaCmd = system('qiitactl create post --tweet '''.expand('%:p').'''')
	echo s:qiitaCmd.'...done.'
	edit!
endfunction

command! QiitaFetch call s:qiitaFetch()
command! QiitaUpdate call s:qiitaUpdate()
command! -nargs=1 QiitaGenerate call s:qiitaGenerate(<f-args>)
command! QiitaCreate call s:qiitaCreate()
```

手が入ったのは`s:qiitaFetch()`で、要は単発Fetchを出来るようにしようってことです。

## 別に、勝手に選んでも構わないのであろう？

VimからQiitaにアクセスするにしても、自分の場合は投稿と更新だけできればいいので、引数を取って柔軟にFetchする必要はないわけです。ただYAML部分から今のバッファがqiitactlのmarkdownであることを確認して、そうであれば単発Fetch、そうじゃなければ全体Fetchをするという方法をとっています。
qiitactlからの単発ページのFetchにはページのIDが必要で、それを確認するために`getline()`を使っているのですが、念の為qiitactlのファイルであることがより確認しやすい3行目を使って確認した後、末尾を切り出してIDを取得します。あとは条件分岐をして、単発のFetchであればリロードもしてあげれば問題ないでしょう。
Unity のプロジェクトで Git LFS を初めて使った所感

# 前提知識
基本的な Git の知識(commit push pull checkout はわかる)

# 概要
Unity のリポジトリを　GitHub で管理する際、バイナリファイルをどうしようか問題が必ずでる。
GitHub + svn で管理した経験はあるが、GitHub + GitLFS で管理は初めてだったので、それの所感でもまとめていきたい。

# Git LFS の仕組み
Git LFS 対象に設定したファイルは、GitHub 上のリポジトリではなく、Large File Storage に保存される。そのファイルの実体が GitHub のリポジトリに保存されるわけではないので、差分のでないバイナリファイルが変更されたとしても、リポジトリの肥大化にはならない。
![スクリーンショット 2018-05-08 11.53.58.png](https://qiita-image-store.s3.amazonaws.com/0/151719/67bb7e97-9ec7-a051-cd41-d30cc7464690.png)

(https://git-lfs.github.com/ より画像引用)
# Git LFS 対象ファイルを設定するには?
Unity のプロジェクトファイルに .png が存在し、そのファイルを　GitLFS 対象のファイルに設定する場合、

```
$ git lfs track "*.png"
```
とコマンドラインを叩けば、 .png はすべて Git LFS 対象となってくれる。
ディレクトリごとにも設定可能で、ディレクトリ単位で設定したければ、そのディレクトリに移動して上記コマンドラインを叩けば、そのディレクトリだけ .png をすべて Git LFS 対象とするなど簡単に設定ができる。

# Git 上では Git LFS 対象のファイルはどう見えているの?

Git 上では は存在しているが、中身は実態ではなく Git LFS のポインタを持っている。

Git LFS 対象にしたファイル(.png)を適当なテキストエディタで開くと以下のようになっている。

実体は無いので、実体を引っ張ってくる作業をする必要がある。

```
version https://git-lfs.github.com/spec/v1
oid sha256:xxxxxxxxe127e0282f9ea8xxxxxxxxx4ee421407ba90d5c588dd0c0xxxxxxxx
size 250820
```
(sha256 の部分は適当にx埋めしたけど意味があるのかな)

# Git のコマンドと Git LFS の挙動について
## git push
これまでの Git と同じ + 変更された Git LFS 対象のファイルも Push する。ただし、Git LFS にはバージョンという概念は存在しないっぽいので、プロジェクト全体に影響を与えるので注意

## git pull
これまでの Git と同じだが、Git pull したときは Git LFS のファイルがローカルに落ちてくるわけではない。なので、Git LFS 対象のファイルは特に変更されない(反映されない)。

# Git LFS のファイルをローカルに落とすには?
## git lfs pull
Git LFS 対象のファイルをローカルにダウンロードする。checkout は自動的にやってくれないっぽいので、pull しただけではローカルのリポジトリに反映してくれない。

## git lfs checkout
Git LFS 対象のファイルをローカルに反映する。

# コマンドラインではどうやるの?
Mac デフォルトの git では、Git LFS を導入したリポジトリを操作すると怒られる(スクショ取るの忘れた)ので、brew でちゃちゃっと git-lfs をインストール。

# Source Tree ではどうやるの?
Source Tree は、元から Git LFS が入っているっぽい。

メニュー > リポジトリ > Git LFS で操作可能
![source.png](https://qiita-image-store.s3.amazonaws.com/0/151719/386f8ae7-a15d-c331-447a-0dc3a3c484c6.png)
iOSで音声再生アプリを作る

自分の備忘メモです。

##バックグラウンド再生をする場合
###Info.plistに以下を追記する
```
<key>UIBackgroundModes</key>
<array>
    <string>audio</string>
</array>
```

##リモートの音声ファイルを使って再生する場合
###Info.plistに以下を追記する
```
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
        <true/>
</dict>
```
これを追記しないと、リモートファイルの読み込みができないで、ハマる。
VS Unityエディタ日本語化

[【Unity】Unityエディターを日本語化する方法（Unity2018.1）](http://tsubakit1.hateblo.jp/entry/2018/05/07/222059)
（※テラシュールブログさんの記事）

対抗して、C言語も日本語化する事にしました。

```c
#define すたんだーどあいおーへっだ <stdio.h>
#define もしも if(
#define だったら )
#define いこーる ==
#define が ==
#define 代入 =
#define に =
#define せみころん ;
#define いれる ;
#define ぷりんと printf(
#define 整数出力 "%d"
#define で ,
#define を )
#define よろしく ;
#define はじまり {
#define おわり }
#define 無 void
#define 整数 int
#define ぜろ 0
#define めいん main
#define 引数無し ()

#include すたんだーどあいおーへっだ


無 めいん 引数無し
はじまり
	整数 a に ぜろ いれる
	もしも a が ぜろ だったら a に 10 いれる
	ぷりんと 整数出力 で a を よろしく
おわり
```

```text:出力結果
10
続行するには何かキーを押してください . . .
```

センスが問われますね（使ってないdefineもあるし・・・)
Angular6 で scss を有効にする方法

# はじめに

つい先日、ついに Angular6 正式版がリリースされました 🎉
ただ、Angular-CLI の設定ファイルである `.angular-cli.json` が `angular.json` へと変更され、それに伴い大幅な仕様変更が入りました。

本記事では、`angular.json` のざっくりとした使い方を、最もポピュラーである 「scss を有効化する」 というケースを想定して紹介してみます。

# angular.json で scss を有効にする

[angular.json の仕様](https://github.com/angular/angular-cli/blob/05fd09d25bfb2b1bd8a599ea83ba223d3b9685dd/docs/documentation/angular-workspace.md) を見てみると、`angular.json` では `projects` プロパティにプロジェクトを設定し、そのプロジェクトの `schematics` プロパティに `@schematics/angular:component` や `@schematics/angular:directive` というキー名で設定したい項目を入力する方式へ変更されたようです。

試しに

```
ng new my-app
```

でサンプルプロジェクトを作成してみたところ下記の `angular.json` が自動的に生成されていました


```json:angular.json
  ...
  "projects": {
    "my-app": {
      "root": "",
      "sourceRoot": "src",
      "projectType": "application",
      "prefix": "app",
      "schematics": {},
      ...
```

この `schematics` に

```json
    "schematics": {
        "@schematics/angular:component": {
            "styleext": "scss"
        }
    }
```

を設定することで、CLI からの新規コンポーネント生成が `scss` を有効とした状態で利用できるようになりました。

```
> ng g c test

CREATE src/app/test/test.component.scss (0 bytes)
CREATE src/app/test/test.component.html (23 bytes)
CREATE src/app/test/test.component.spec.ts (614 bytes)
CREATE src/app/test/test.component.ts (262 bytes)
```

`schematics` は上記例のようにプロジェクト自体に設定することもできますが、「全プロジェクトで `scss` を使うからいちいち設定したくない」 という場合は、`angular.json` の最上位プロパティとすることで全プロジェクトで有効とすることもできます。

# CLI から設定


[CLI から設定する場合はこうする](https://github.com/angular/angular-cli/blob/62232e880308175d3c4878136794d3eb4089bcde/docs/documentation/stories/css-preprocessors.md)ようです。
`ng set` ではなく `ng config` に変更されたましたね。
が、、、6.0.0 ではエラーとなってしまいました。そのうち修正されると思います。


```
ng config schematics.@schematics/angular:component.styleext scss
```

追記：

現状だと json 形式で指定すると CLI からでも設定できるようです

```
ng config schematics.@schematics/angular:component '{ styleext: "scss"}'
```

# 新規作成時

プロジェクトを新規で作成する際は、以前と同じように `--style=scss` を付与することで、 `schematics` の設定された `angular.json` が出力されることを確認しました。（6.0.0）

```
ng new my-app --style=scss
```

# schematics のデフォルト設定項目一覧

- [@schematics/angular:component](https://github.com/angular/angular-cli/blob/v6.0.0-rc.8/packages/%40angular/cli/lib/config/schema.json#L74-L144)
- [@schematics/angular:directive](https://github.com/angular/angular-cli/blob/v6.0.0-rc.8/packages/%40angular/cli/lib/config/schema.json#L145-L186)
- [@schematics/angular:module](https://github.com/angular/angular-cli/blob/v6.0.0-rc.8/packages/%40angular/cli/lib/config/schema.json#L187-L223)
- [@schematics/angular:service](https://github.com/angular/angular-cli/blob/v6.0.0-rc.8/packages/%40angular/cli/lib/config/schema.json#L224-L238)
- [@schematics/angular:pipe](https://github.com/angular/angular-cli/blob/v6.0.0-rc.8/packages/%40angular/cli/lib/config/schema.json#L239-L269)
- [@schematics/angular:class](https://github.com/angular/angular-cli/blob/v6.0.0-rc.8/packages/%40angular/cli/lib/config/schema.json#L270-L279)

あの設定どこに行ったんだ！？ という方は上記を探してみると見つかるかもしれません。
Cognos SDK サンプルのカスタム認証プロバイダでDB接続数増大を防ぐ修正

#概要
Cognos AnalyticsのSDKで、カスタム認証プロバイダーというCognos認証をJavaプログラムで行うサンプルがあります。※カスタム認証に関しては、以下参照。
**Cognos カスタム認証のセットアップ手順**
https://qiita.com/shinyama/items/1f9c7842a3966233a5d7

こちらのサンプルプログラムで、認証ソースのデータベースに接続が延々と増えてしまい、Db2のメモリーが大量に消費されてしまうという問題に最近いくつか遭遇しました。

あくまでこのプログラムはサンプルとして提供しているものなので、本番環境で使うのは自己責任だよ、という前提で提供されているものなのですが、実際使われているプロジェクトは多く、同じ問題に困っているプロジェクトも多いと思いますので投稿します。

#対処
QueryUtil.javaプログラムのqueryImpl()で、以下の「<-追加」の箇所を追加して、statementとresultSetをクローズする事が必要です。
connectionに関しては、プログラム中で明示的にクローズすると認証エラーになるので、明示的なクローズは行いません。
しかしながら、不要になった接続は、Cognosの組み込みのWebSphere LibertyのGCのタイミングで解放されていきます。

```html
		try (final PreparedStatement statement = connection.prepareStatement(sql))
		{
			for (int i = 0; i < parameters.length; ++i)
				statement.setObject(i + 1, parameters[i]);

			try (final ResultSet resultSet = statement.executeQuery())
			{
				if (includeMetadata)
					data.add(QueryUtil.getMetaDataRow(resultSet));

		while (resultSet.next()) 
            		data.add(QueryUtil.getDataRow(resultSet)); 
 
 		resultSet.close(); 　　<-追加
                }
 		statement.close(); 　　<-追加
        } 
        catch (final SQLException ex) 
        { 
            throw new UnrecoverableException("SQL Exception", "An exception was caught while querying the authentication database."); 
        } 


```

<2018/6/29 追記>
上記のSDKプログラムの修正に加えて、Cognos組み込みのWebSphere LibertyのGCポリシーを変更すると、より効率的なGCにより、DBセッションが大量に溜まる前に解放してくれることがわかりましたので追記しておきます。

GCの変更方法は、Linuxの場合以下のファイルの、
/opt/ibm/cognos/analytics/bin64/bootstrap_wlp_linuxi38664.xml

この箇所のgenconを変更してCognosを再起動します。
        \<param condName="${java_vendor}" condValue="IBM">-Xgcpolicy:gencon\</param>

該当の事例では、「Balanced」に変更しました。
https://www.ibm.com/developerworks/jp/websphere/library/was/was8_gc/2.html

カスタム認証のRestorableJDBCSample及びJDBCSampleを使用される場合は、是非この記事を思い出してください。
基本トランザクション マネージャとの通信が失敗しましたの対処

# ■ 環境
- VisualStudio 2017
- 【OS】Windows10
- 【DB】SQL SERVER2005

# ■ 前提
https://blogs.technet.microsoft.com/jpiis/2018/02/05/msdtc-settings/
こちらに記載されている設定はしてあります。

# ■ 経緯
- 分散トランザクションの処理を実装中にエラーが発生。

# ■ ログの内容
- 基になるプロバイダーが Open で失敗しました。 
- 基本トランザクション マネージャーとの通信が失敗しました。
-  MSDTC トランザクション マネージャーは、通信の問題のため、送信元のトランザクション マネージャーからトランザクションをプルできませんでした。<br>
原因として、ファイアウォールが存在していて MSDTC プロセスの例外がないこと、<br>
2 台のコンピューターが NetBIOS 名でお互いを識別できないこと、<br>
または 2 つのトランザクション マネージャーのいずれかでネットワーク トランザクションのサポートが有効になっていないことが考えられます。

# ■ 対応
1. [Windows] ⇒ ［コントロールパネル］⇒ [Windows Difenderファイヤーウォール]を開く
2. 左側にある『Windows Defenderファイヤーウォールを介したアプリ または 機能を許可』を選択する
3. 『分散トランザクション コーディネーター』のチェックを【ON】 合わせて プライベート/パブリックも【ON】
4. [OK]を押す ← 重要
js 配列の正の整数を合計して返す

##題
与えられた配列のすべての正の整数の合計を返してください。

```javascript
function positiveSum(arr) {
  //write your code
}

positiveSum([1,2,3,4,5]);//15
positiveSum([1,-2,3,4,5]);//13
positiveSum([]);//0
positiveSum([-1,-2,-3,-4,-5]);//0
positiveSum([-1,2,3,4,-5]);//9

```


##使ったもの

filter();
length
reduce();

##コード
```javascript

function positiveSum(arr) {
  //正の数の判定
  let positiveNums = arr.filter((e)=>{
    return e > 0
  });
  //正の数の有無の判定
  if(positiveNums.length == 0){
    return 0
  }
  //正の数の合計
  let result = positiveNums.reduce((a,b)=>{
    return a + b;
  });
  return result
}
```

##他コード
```javascript
let positiveSum = arr => arr.filter(x => x > 0).reduce((a, b) => a+b,0);
positiveSum([1,-4,7,12]);//20
```

他にも解答コードある方、コメントへどうぞ
TypeScript Sampleをやってみるその１

## はじめに
MicrosoftがJavaScriptに業を煮やして作ったのがTypeScript、Classを定義できC#やJavaみたいに型を指定できるところがJavaScriptとの違い、JavaScriptからの脱却あるのみ、もちろん他にも手段はあるが、tscコマンドを叩くと～.tsファイルから～.jsファイルができるというおいしいところを選択せずして何をかいわんやです。Microsoftが提供しているサンプルをひとつずつ試してみた備忘録を投稿していきます。

## 前提
* [Visual Studio Code](https://code.visualstudio.com/download)がインストール済み
* [Node.js/npm](https://qiita.com/taiponrock/items/9001ae194571feb63a5e)がインストール済み
* gitから[Sampleをダウンロードして](https://github.com/Microsoft/TypeScriptSamples/archive/master.zip)任意のディレクトリに解凍済み
* OSはWindows7/10を想定

## サンプル amd
ブラウザへ現在の日付と時刻を出力するサンプル。

## ファイル構成
|ファイル名|説明|
|:--|:--| 
|app.css|スタイルシート|
|app.js|app.tsのコンパイルにて作成されたJavaScript|
|app.js.map|app.tsのコンパイルにて作成されたmapファイル|
|app.ts|greeterを実行するTypeScript|
|default.html|ブラウザ出力用のhtml|
|greeter.js|greeter.tsのコンパイルにて作成されたJavaScript|
|greeter.js.map|greeter.tsのコンパイルにて作成されたmapファイル|
|greeter.ts|ブラウザへ日付と時刻を出力するTypeScript|
|README.md|このサンプルの説明と使用方法|
|tsconfig.json|TypeScriptのコンパイルコンフィグファイル|

## クラス図とフローチャート
![TS_002.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/995afcf4-38c5-8708-94a6-defaba189bc5.jpeg)
![TS_003.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/ed68b41d-9f89-5585-98b2-558d28e78482.jpeg)

## 実行
```
cd ./amd
tsc --sourcemap --module amd app.ts
start default.html
```

## 結果
![TS_001.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/0821b652-667d-deed-4384-0a4ca2d0550c.jpeg)

## ポイント
default.htmlにコーディングされている13行目のrequire.jsにこのサンプルのapp.jsを引数として渡して、実行させています。
amdについては[ここ](https://tsuchikazu.net/javascript-module/)。

```default.html抜粋
 <!--
        require.js will use the value of the 'data-main' attribute in the following
        script tag to load 'app.js' after require.js itself loads.
    -->
<script data-main="app" type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.1/require.min.js"></script>
```

## ノート
TypeScrpitのクラスの基本構造をメモしておきます。
constructorはクラスのインスタンスを作成すると呼び出されプロパティの初期化を行います。
![TS_004.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/d247e03a-9731-1576-eaff-c6ceb7ff7e24.jpeg)

## ts-->js変換
肝心のtscコマンドでどのような変換をしているのか、前ソースgreeter.tsと後ソースgreeter.jsを比較してみます。
TypeScriptのシンプルさは抜群です。C#を連想するコーディングは魅力的です。
![TS_005.jpg](https://qiita-image-store.s3.amazonaws.com/0/239597/4e4a4e0e-baab-378e-2407-bf4cdfdbf109.jpeg)
※左greeter.ts、右greeter.js

## まとめ
TypeScriptて何と聞かれたら、伝説のプログラマ[「アンダース・ヘルスバーグ」](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%B3%E3%83%80%E3%83%BC%E3%82%B9%E3%83%BB%E3%83%98%E3%83%AB%E3%82%B9%E3%83%90%E3%83%BC%E3%82%B0)が開発したJavaScriptの[スーパーセット](https://www23.atwiki.jp/sevenlives/pages/1850.html)でかつ[トランスコンパイラ](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)だよと答えましょう。

以上、おそまつ
確率 epsilon で1を出力

## 実施したいこと
確率$\epsilon, (0 \le \epsilon \le 1)$でランダムに1を出力する

## コード
```py
import numpy.random import *

## 0～1までの乱数を設定
tmp = rand()
if tmp <= epsilon:
  output = 1
else:
  output = 0
print(output)
```
とすれば、`output`に確率$\epsilon$で$1$が入りますが、(library importを除き)1行で完結するには

```py
import numpy as np

output = np.random.binomial(1,epsilon)
```
でOK.

## 検証
念のため、やっときましょう。

```py
epsilon = 0.2
N = 100

tmp_list = []
for i in range(N):
    a = np.random.binomial(1, epsilon)
    tmp_list.append(a)

print(sum(tmp_list)/N) #0.22
```

みなさんも`epsilon`を他の値にかけてやってみて下さい。
ただ、サンプル数$N$が小さいと、結構ブレてしまうのは注意です。
パスフレーズ無しのプラットフォームキーを出力する

## 目的
APKファイルの署名にはJKS形式のキーストア(.keystore)を使用するが，Androidプラットフォームのビルド時にAPKファイルへ署名するには，PKCS#8形式の秘密鍵(.pk8)とPEM形式のx509証明書(.x509.pem)を使用する．
ここではデフォルトの設定で署名されるキーストア(debug.keystore)を用いてプラットフォームキーを作成する．


## 筆者の環境
Windows10 64bit
JDK 1.8.0 (8u171)
[OpenSSL](http://slproweb.com/products/Win32OpenSSL.html) 


## 出力方法
JKS形式(.keystore) からPKCS#12形式(.p12) へ変換する．
```keytool -importkeystore -srckeystore debug.keystore -destkeystore keystore.p12 -srcstoretype jks -deststoretype pkcs12```

PKCS#12形式(.p12)からPEM形式(pem)に変換する．
```openssl pkcs12 -in keystore.p12 -out keystore.pem```

PEM形式(.pem)からPCKS#8形式(.pk8)を出力する．
```openssl pkcs8 -in keystore.pem -outform DER -out private.pk8  -topk8 -nocrypt```

PEM形式(.pem)からPEM形式のx509証明書(.x509.pem)を出力する．
```openssl x509 -inform PEM -in keystore.pem -outform PEM -out cert.x509.pem```
MS bot builder-python を動かしてみた

#はじめに
MS Bot Framework の最新版が発表されました
https://blog.botframework.com/2018/05/07/build-a-microsoft-bot-framework-bot-with-the-bot-builder-sdk-v4/  
今回のアップデートで Python 及び Java のサポートが開始されました
Pythonサポートということで、Deep Learning ベースの対話モデルとの繋ぎこみが容易になりそうで非常に楽しみですね(Deepやってないけど...)

今回はローカルのPython実行環境でBot を動かすところまでやったのでその手順を記載します

# 実行環境
Windows7 64bit
Python 3.6
anaconda で仮想環境新しく作成しています

# パッケージのインストール
botbuilder-pythonのリポジトリはこちらです
https://github.com/Microsoft/botbuilder-python

READMEに記載されている以下のモジュールのインストールします
・ botbuilder-core
・ botbuilder-schema
・ botframework-connecrtor

pip コマンドでインストールすることができます
` pip install botbuilder-core `

# サンプルコードをClone する
サンプルコードはbotbuilder-pythonリポジトリの `/samples`の中に格納されているので 任意のフォルダにリポジトリをcloneしました

今回は `botbuilder-python/samples/Echo.Connector.Bot/`を実行します
`python main.py`


#Bot Framework Emulator で動作確認
デフォルトのままであれば、Bot Framework Emulatorで`http://localhost:9000`にアクセスするとbotとの対話が開始されます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/80470/1aebc55d-fdd8-4e59-6182-bdb50d57bde5.png)

このような感じで動いていることが確認できました

#終わりに
今回はMS botbuilder-pythonをローカルで動かす実行環境の準備及び動作テストを行いました
各種機能の確認や、Azureへのデプロイについては引き続き確認してみたいと思っています
なにか分かり次第追記します
Nginxでbasic認証

##　はじめに
webサーバーにNginxを使う機会がありました。
Basic認証をかける必要がありましたので、やってみました。

## 手順



#### 1.パッケージインストール

```
$ sudo apt-get install -y apache2-utils
```

<br>
#### 2..htpasswd ファイルの作成
認証時に使うusernameとpasswordを入力

```
$ sudo htpasswd -c /etc/nginx/.htpasswd username
New password: password
Re-type new password: password
Adding password for user username
```
<br>
#### 3.設定ファイルに追記
```
server {
    location / {
        auth_basic "*******"; # 認証時に表示されるメッセージ
        auth_basic_user_file /etc/nginx/.htpasswd; # .htpasswdファイルパス
    }
}
```
<br>
#### 4.nginxを再起動

```
$ sudo nginx -s reload
```
<br>

#### 5.確認
ページにアクセスして確認します。

<br>
### 参考
- [Nginx で Basic 認証](https://qiita.com/kotarella1110/items/be76b17cdbe61ff7b5ca)
- [ubuntuでnginxの起動と最低限のコマンド](https://joppot.info/2014/03/10/970)
Elasticsearchのスナップショット一覧を見る方法

全てドキュメントに書いてあることですが、知らなかったのでメモします。

* [登録されているレポジトリ一覧](https://www.elastic.co/guide/en/elasticsearch/reference/6.2/cat-repositories.html)

```
GET /_cat/repositories?v
```

* [スナップショット一覧](https://www.elastic.co/guide/en/elasticsearch/reference/6.2/cat-snapshots.html)

```
GET /_cat/snapshots/repo1?v
```

利用している Amazon Elasticsearch Service のスナップショットを見てみました。2週間分保存されてました。

```
GET /_cat/snapshots/cs-automated?v

id                                                        status start_epoch start_time end_epoch  end_time duration indices successful_shards failed_shards total_shards
2018-04-24t00-53-18.07ff6aa0-3f4b-411c-9592-89773a89f7cf SUCCESS 1524531198  17:53:18   1524531224 17:53:44    26.3s       6                26             0           26
2018-04-25t00-53-17.b5a850a5-8745-4403-a5b6-1574a77e9f4a SUCCESS 1524617597  17:53:17   1524617618 17:53:38      21s       6                26             0           26
2018-04-26t00-53-19.b4c2ab99-6aff-4547-b06b-b70f415a4383 SUCCESS 1524703999  17:53:19   1524704061 17:54:21       1m       6                26             0           26
2018-04-27t00-53-17.d1f40f2d-22ee-43df-bf70-7e457cd19b0f SUCCESS 1524790397  17:53:17   1524790412 17:53:32    14.6s       6                26             0           26
2018-04-28t00-53-16.5f9ac394-d46d-4a98-a2f9-1aefd21d9dc0 SUCCESS 1524876796  17:53:16   1524876808 17:53:28    11.7s       6                26             0           26
2018-04-29t00-53-19.a2cbe345-61e5-4720-bb71-3d0101fd092f SUCCESS 1524963199  17:53:19   1524963248 17:54:08    48.9s       6                26             0           26
2018-04-30t00-53-16.a7a32a92-ab32-4359-a7e2-3a954381637f SUCCESS 1525049597  17:53:17   1525049685 17:54:45     1.4m       6                26             0           26
2018-05-01t00-53-18.24035bdd-0a61-41f7-8609-198f58ad6577 SUCCESS 1525135998  17:53:18   1525136085 17:54:45     1.4m       6                26             0           26
2018-05-02t00-53-17.79222d89-bc3f-4dd9-9e02-46b5bbe8dc18 SUCCESS 1525222397  17:53:17   1525222439 17:53:59      42s       6                26             0           26
2018-05-03t00-53-31.009f0903-f611-4931-bfe0-e346c1bf2628 SUCCESS 1525308811  17:53:31   1525308837 17:53:57    25.8s       6                26             0           26
2018-05-04t00-53-17.4aac54c7-308f-41ec-a694-93cdaa080831 SUCCESS 1525395197  17:53:17   1525395226 17:53:46    28.9s       6                26             0           26
2018-05-05t00-53-19.0f78054b-e52d-4e09-9204-cd166b4d3b5c SUCCESS 1525481599  17:53:19   1525481655 17:54:15    56.2s       6                26             0           26
2018-05-06t00-53-18.7a95f4ad-c302-4dd6-a7bc-dfcb3c4390f0 SUCCESS 1525567998  17:53:18   1525568051 17:54:11    52.3s       6                26             0           26
2018-05-07t00-53-19.eb6bbed6-3e3b-4268-b671-fe7be40d2453 SUCCESS 1525654399  17:53:19   1525654430 17:53:50    30.8s       6                26             0           26
2018-05-08t00-53-18.31764198-c155-41c2-be5f-1618852ce2b1 SUCCESS 1525740798  17:53:18   1525740828 17:53:48    30.6s       6                26             0           26
RaspberryPiにおけるIEEE802.1X認証の設定法

#目的
職場や学校のネットワークにIEEE802.1X認証システムが導入されている環境下、GUIで認証設定ができないRaspberry Pi(OS: Raspbian)でネットワークに接続したい

#環境
__認証方法__
EAP-MSCHAP v2

__機器__
Raspberry Pi3 modelB (Raspbian)

#手順1
802.1Xを使用する際に必要なクライアントのサプリカント機能をサポートするツールの設定ファイルを書き換える

```sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
```

```wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=0

network={
        key_mgmt=IEEE8021X
        eap=PEAP
        identity="******"
        password="******" 
        phase1="peaplabel=1"
        phase2="auth=MSCHAPV2"
}
```
identityにIDを、passwordにパスワードを入力する
#手順2
ネットワークの設定ファイルの一部を書き換える

```sudo nano /etc/network/interfaces
```

```interfaces
～～～～～

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

～～～～～
```

#手順3
ターミナルで下記を実行

```sudo wpa_supplicant -i eth0 -c /etc/wpa_supplicant/wpa_supplicant.conf -D wired &
```
処理が終了しない場合、Ctrl+Cで強制終了させる必要があります

#手順4
ターミナルで下記を実行

```dhclient -nw eth0
```

以上で終了です
ホールデムポーカをプログラム化するのが難しい件

# 難しい！
世界で一番遊ばれているポーカーである ノーリミット・テキサスホールデムをコーディングするのが難しい。強いAI を作るのは大変なのはわかる。でもそうじゃないのだ。**ルールブックを忠実にコードに落とし込むだけで難しい**のだ。

[ブラックジャックなんかは初心者プログラマの例題として採用できるくらい簡単](https://qiita.com/hirossyi73/items/cf8648c31898216312e5)だが、ホールデムを初心者プログラマの例題にだしたら泣くと思う。逆に腕に覚えがある人は実装してみるといいと思うよ。

本稿では、自分でホールデムを実装しようとする人向けに、実装上の Tips や、実装上の難所を解説したいと思う。


# ざっくりとしたプログラムの構成要素

**ハンド比較**

ご存知のとおり、7枚から任意に5枚を選んで最大の役を作り、ほかのプレイヤーと比較する。独立性が高い部品であるし、いい腕試しにもなるので、休日にちょろっと実装してみるのも頭の体操になってよい。

**駆け引きの状態遷移**
大きく分けて、プリフロップ、フロップ、ターン、リバーの4つのベッティングラウンドがあるのだが、それぞれのラウンドの中で、相当複雑な状態遷移がある。チェック、フォールド、コール、レイズ、リレイズ、（リリレイズ）、オールインがあり、組み合わせは膨大になる。これらをきちんと交通整理するモジュールが必要になる。

**シリアライゼーション・バリデーション・リトライ**
対戦をしたり、ボット作成時に機械学習をさせるためには、プレイヤーと、ディーラー（システム）を疎結合にして、シリアライズ可能な形に実装しておくのが望ましい。プレイヤーの入力をディーラーは信用せず、各種のバリデーションを仕組んだり、無効な入力があった場合には再入力を求めたり、タイムアウトを実装するなどが必要。

# はまりポイント

大体のルールをみてコーディングを始めると必ずどこかでどんづまる。はまりポイントをあらかじめ押さえておいて、データ構造の変更を最小限にしよう。

**ポットとサイドポッド**
誰かがオールインした後にもベットが続くとき、サイドポットという概念が出てくる。ポットをただの整数値として設計したりしてると後で泣きを見る。サイドポットは一つだけではなく、オールインする人間が複数いればサイドポットもその分だけ増える可能性がある。

**ミニマムレイズ**
レイズの幅にはルールがあり、リリレイズの幅にも別のルールがある。これらを考慮するために、過去のレイズ等を覚えておかなければいけない。データ構造の変更をしないようにあらかじめ設計しておく必要がある。

**ポットの端数**
勝者総取りのゲームではあるが、時には引き分けが発生する。端数が出てきたときにはSBの席から順に弱いものがそのあまりをもらうことになるのがわかりづらい。

**アンティ・レーキ**
ルールブックには書かれていないが、実際にはこれらが存在することが多く、また戦略立案にも影響する。

**ボタン**
基本的には、1ゲームごとに反時計回りにずれるのであるが、誰かがトンだり、離席した場合など、不規則なずれ方をする。プログラミング的には、ずれるのはBBの位置であるとしてコーディングするのがよい。ルール的にはBBが同じ人物に連続して当たってはならない

# コードは？

github で細々と開発してるので興味があればどうぞ。まだ一部のルールを実装しきれていない。

https://github.com/41semicolon/41poker
docker：よく使うコマンド集

# コマンド　
##### コンテナを起動する
```$ docker start test01```

##### 起動中のコンテナに入る
```$ docker exec -it test01 /bin/bash ```
-itオプションはコンテナ内で操作したい場合につけるオプション

##### 起動中のコンテナを終了する
```$ docker stop test01```

##### 起動中のコンテナに入る別の方法
```$ docker attach test01```

##### 実行中のコンテナを表示
```$ docker ps```

##### 起動していないコンテナも含めすべてのコンテナを表示
```$ docker ps -a```

##### イメージを表示
```$ docker images``` 

##### イメージを元にコンテナを作成し起動する
```$ docker run -name test01 -it ubuntu:14.04.1 /bin/bash ```
OSのubuntu:14.04.1を利用し、test01という名前のコンテナを作成する

##### コンテナの削除
```$ docker rm test01```

##### イメージの削除
```$ docker rmi ubuntu:14.04.1```


# メモ
### attach と exec -it の違い
attachは既にあるコンテナのプライマリプロセスにアクセスします。したがって、exitやると、コンテナが消えます。
exec -itは、新規にプロセスを立ち上げて、それを操作するため、exitしても元のプロセスが残っているのでコンテナは動き続けます。
http://willow710kut.hatenablog.com/entry/2018/01/11/224932

### /bin/bash の bash とは
bashとは、オペレーティングシステム (OS) とユーザーとの仲立ちをし、キーボードやマウスをはじめとする入力機器からの情報を解釈して、OSに指示を伝えるプログラム。
http://d.hatena.ne.jp/keyword/%A5%B7%A5%A7%A5%EB

### docker file
イメージと同じもの。自分で追加できる。

### docker-compose
コンテナ管理ツール。 dicker run コマンドの集合体のようなもの。
Cygwin sshdが1803で使えなくなる問題

# Windows 10 1803にアップデートしたら、Cygwin sshdが使えなくなる問題
突然使えなくなった。 ~~**ぎんなん** :anger: :anger: :anger:~~

## 原因
Windows 10 1803より、`OpenSSH sshd`の`(beta)`が外され、晴れてWindows 10の標準機能になった。
この標準のサービスは、`sshd`という名前で1803に上げたタイミングで登録された。

**それにより`ssh-host-config`により、設定してある`sshd`とサービス名が重複し、サービスが上書きされた。**

## 対応策
改めて、`ssh-host-config`をサービス名を指定し、再実行する。

```bash
ssh-host-config --name sshd-cyg
```
Pacemaker2.0の基本(プロセス構成)

#Pacemaker2.0系(corosync+pacemaker)でのプロセスの関連と構成について
2.0系ではPacemaker層のプロセス名が変更になりました。
なお、名称が変わっただけで基本的なプロセスの機能は変更されていません。

運用監視ツールなどで、Pacemaker環境を監視(プロセス名、ログ出力名などが変更)している場合には、今後、注意が必要となります。

![pm2.png](https://qiita-image-store.s3.amazonaws.com/0/80018/bbf992dd-202d-d0d7-9fc4-a8b784ae6ca2.png)
![pm2-libknet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80018/b152718f-ea9d-bd18-3879-b0ea57133c02.png)


## corosync層(2.0系を利用した場合)
 - corosync : corosyncの本体(pacemakerとは別物)
 - cpg : Cluster Process Group Service - corosync配下にグループを作成し、グループ内でメッセージなどを配送するサービス(pacemakerもCPGサービスのクライアント)
 - quorum : Quorum Service - ノード数管理(QUORUM)サービス(pacemakerにQUORUM情報を伝搬)

## corosync層(3.0系を利用した場合)
 - corosync/cpg/quorumなどは同じですが、下位層にさらにlibknetの5つのスレッド(pmtu/dst/rx/tx/heartbeat)が動作します。実際に送受信を実施するのもこのスレッドの3つとなります。corosync層はlibknetに送信を依頼する形となります。
 -  libknetを利用しないcorosyncの動作も可能ですが、クラスタ間のインターコネクトを2本以上利用したい場合には、corosync3系を利用した場合には、libknetの利用が必須となります。
 -  また、libknetを利用した場合には、送信プロトコルとしてsctpも利用可能となります。

## Pacemaker層
Pacemaker自体は、corosyncのCPGサービスのクライアントとして動作する。
クラスタ間のメッセージ送信は、CPGサービスを利用して行う。プロセス間の通信は、IPCを利用して行う。

 - pacemakerd : 各以下pacemakerプロセスを起動、停止、監視するメインコントロール
 - pacemaker-controld : クラスタマネージャー(クラスタ構成の管理などを行う、pacemaker-schedulerdにて作成された状態遷移の実行(自ノードのpacemaker-execdへの依頼、他ノードのpacemaker-controldへの依頼）も行う)
 - pacemaker-based : CIB情報(リソース構成情報やノード状態、リソース状態）の更新、管理プロセス
 - pacemaker-schedulerd：状態遷移を計算するプロセス
 - pacemaker-attrd：属性管理プロセス
 - pacemaker-execd：ローカルリソースマネージャープロセス(自ノードのリソースの起動、停止、モニター)
 - pacemaker-fenced：STONITHプロセス
rarファイル > 解凍できない > ファイル名を英数字だけにする

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1709
7-Zip v18.05(2018-04-30)
```

### 症状

.rarファイルなどで解凍できない場合がある。
自分が遭遇した症状としては、ファイル名に日本語以外の文字が入っていると解凍できない。

### 対処

英数字だけのファイル名に変更すると解凍できるようになる。
Zabbixのバックアップとリカバリー

# 前提
- OS: Ubuntu Server 16.04 LTS
- DB: MariaDB 10.0.34
- Zabbix: 3.4.8
- 管理者権限の作業

# 手順
## バックアップ
下記でZabbixのDBの全データをバックアップする
必要に応じて、cron等を設定する

```
$ mysqldump zabbix > /tmp/backup.sql
```

## リカバリ
一旦、Zabbixサーバーを停止する

```
$ service zabbix-server stop
```

ZabbixのDBを削除する

```
$ mysql -e"drop database zabbix;"
```

DBの不整合なファイルを一旦削除する。該ファイルは、再起動時に再作成されます。
詳しくは、下記を確認して下さい。
[InnoDBの構成](https://dev.mysql.com/doc/refman/5.6/ja/innodb-configuration.html)

```
$ service mysql stop
$ rm /var/lib/mysql/ib_logfile0
$ rm /var/lib/mysql/ib_logfile1
$ rm /var/lib/mysql/ibdata1
$ service mysql start
```

ZabbixのDBを再作成し、権限を付与する。

```
$ mysql -e"create database zabbix character set utf8 collate utf8_bin;"
$ mysql -e"grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';"
```

バックアップしたデータを投入する。

```
$ mysql zabbix < /tmp/backup.sql
```

Zabbixサーバーを起動する

```
$ service zabbix-server start
```
「え！？朝は雨降ってなかったのに！傘持ってきてないよ〜。」を解決するGoogleHome連携アプリを作ってみた

# はじめに
GoogleHomeを使って、帰宅時刻の天気が悪天候であれば毎朝自動で傘を忘れないように音声通知してくれるちょっとしたアプリを作りました。
IFTTTとか使えばLINEやメール、PUSH通知は簡単にできるんだけど、やっぱり音声で教えてくれた方が忘れないし便利だと思うんです。
これで、濡れて帰ることも、突発的にビニール傘で出費することも、雨が止むまで無駄な残業をする必要もなくなります。

サーバーサイドのプログラムはPython、GoogleHome連携はNode.jsのgoogle-home-notifierで開発しました。
GitHubのリポジトリは[こちら](https://github.com/gold-kou/never-forget-umbrella)です。デプロイ方法とかも載せています。

# 完成物の動画
[完成物の動画](https://www.youtube.com/watch?v=UumwTBwXvbU)をYouTubeに投稿しました。

# どうやってGoogleHomeを自発的に喋らせるか
[ここらへんの記事](https://qiita.com/azipinsyan/items/db4606aaa51426ac8dac)を参考に、Node.jsのgoogle-home-notifierというライブラリを使用しました。

# アルゴリズム概要
1. cronで[OpenWeatherMap](https://openweathermap.org/)のREST-APIを利用して指定都市の天気情報取得
2. あらかじめ設定した帰宅時間帯の天気が悪天候（雨、雪、雷のいずれか）であればGoogle Homeに音声通知リクエスト
3. Google Homeが音声通知

<img width="518" alt="2018-05-05 14 00 53" src="https://user-images.githubusercontent.com/19632119/39659853-eba9bd7e-506c-11e8-86e3-ed83885ade90.png">

たった、これだけです。
今回はServerはラズパイを使用しました。

# ソースコード
天気予報情報をOpenWeatherMapのREST-APIを利用して取得して、それをもとにNodeJSファイルを実行するかを判断するメインのプログラムです。

```py:weather.py
import configparser
import datetime
import requests
import os
import logging.config

# コンフィグファイル読み込み
inifile = configparser.ConfigParser()
inifile.read("config.ini")

# ログコンフィグファイル読み込み
logging.config.fileConfig("logging.conf")
logger = logging.getLogger("root")

# 本日の日付を取得
today = str(datetime.date.today())

# 帰宅時間を取得
back_time = inifile.get("back_time", "back_time")

# 天気情報取得パラメータ設定
city_id = inifile.get("openweathermap", "city_id")
app_id = inifile.get("openweathermap", "app_id")
params = {"id": city_id, "APPID": app_id}
headers = {"content-type": "application/json"}

# 天気情報を取得
response = requests.get("http://api.openweathermap.org/data/2.5/forecast", params=params, headers=headers)
data = response.json()

# 本日の帰宅時間の天気情報を抽出
weather_today_back_time = ""
for date_time in data["list"]:
    if date_time["dt_txt"].startswith(today) and date_time["dt_txt"].endswith(back_time):
        weather_today_back_time = date_time["weather"][0]["main"]
        logging.info("The weather of going home time: " + weather_today_back_time)

# もし悪天候であればGoogleHomeを喋らせるNodeJSを実行
if weather_today_back_time == "Rain" or weather_today_back_time == "Snow" or weather_today_back_time == "Thunderstorm":
    js_file = inifile.get("googlehomenotifier", "js_file")
    command = "/usr/local/bin/node " + js_file
    os.system(command)
```

GoogleHomeに音声通知リクエストを実施するプログラムはこちらです。
[この記事](https://qiita.com/ktetsuo/items/8c9cd5714e231aa6ae09)のものをほぼそのまま流用しました。

```javascript:main.js
const googlehome = require('google-home-notifier')
const language = 'ja';

googlehome.device('Google-Home', language);
googlehome.ip("192.168.11.3");
googlehome.notify('今日の帰宅時間頃は天気が崩れそうです。傘を忘れずに。', function(res) {
  console.log(res);
});
```

# 今後
GUIで設定できるようにしたり、電車の遅延を音声通知してくれたりも作ってみたい。
Ubuntu16.04で機械学習開発環境を一から構築

人狼知能開発用のマシンの作成のため

## 1. Ubuntuのセットアップ
[参考記事](https://qiita.com/SUZUKI_Masaya/items/fbc10d437788dd95ad0d)
Linux初心者にはこういう事も大事
#### またUSBメモリが認識されなかったので
```console:USB
$ sudo apt install pmount
$ ls /dev/sd*
#USBを指してもう一度
$ ls /dev/sd*
#新しく出てきたディレクトリを元に
$ sudo pmount /dev/sdb1 flash
```
これで/dev/flash にマウント

## 2. Git 
``` console:git
$ sudo apt install git 
```
## 3. Python <br>
Pythonに必要なライブラリをインストールする

```console:library
$ sudo apt install build-essential libncursesw5-dev libgdbm-dev libc6-dev zlib1g-dev libsqlite3-dev tk-dev libssl-dev openssl libbz2-dev libreadline-dev
```
今回はpyenvでインストールしていく

```console:pyenv
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
$ echo 'eval "$(pyenv init -)"' >> ~/.profile
$ source ~/.profile
```

Python3.6のインストール

```console:python
$ pyenv install 3.6.0
$ pyenv global 3.6.0
#version確認
$ python -V
Python 3.6.0
```
##4. TensorFlow
[NVIDIA CUDA Installation Guide for Linux]
(http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html)
CUDAとTensorFlowのver確認大事
素晴らしい記事を上げてくださっている方がいらっしゃるのでこちらのとおりに導入
[参考記事](https://qiita.com/Lirimy/items/a6f051fbfdac333828ed)
※注意として、公式のTensorFlowガイドがややこしいのだがCUDAコマンドラインツールのインストール場面で
```sudo apt install cuda-command-line-tools```
ではなくて
```sudo apt install cuda-command-line-tools-8-0```
のように最後にバージョンを指定しないとインストールできない。
```sudo apt search cuda-command-line-tools```
で使えるバージョンを探してインストールする。


## 5. Java

```console:Java
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt update
$ sudo apt install oracle-java8-installer
$ java -version
```
## 6. Slackなど <br>

ubuntuでクローム、スラックなどのインストール方法。
GUIでインストールボタンを押しても反応しないのはubuntuのバグ。
CUIでインストールする必要がある。
aptも問題があるので、gdebiをつかう。
```$ sudo apt install gdebi```
debファイルがあるディレクトリへ移動
```$ sudo gdebi パッケージ名.deb```
再起動

##7. ATOM
テキストエディタとしてATOMもインストール

```console:Atom
sudo add-apt-repository ppa:webupd8team/atom
sudo apt update
sudo apt install atom
```
chainerの作法　その12

#概要
chainerの作法、調べてみた。
kaggleのcat&dogやってみた。
Convolution2D使ってみた。


#結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18104/43ef3e2e-8353-2dc8-9e5e-21b282d74f03.png)


#サンプルコード


```
import glob
import chainer
import chainer.functions as F
import chainer.links as L
from chainer import training, datasets, iterators, Chain, optimizers, serializers
from chainer.training import extensions
from PIL import Image
import numpy as np


class CNN(Chain):
	def __init__(self, n_out):
		super(CNN, self).__init__(conv1 = L.Convolution2D(None, 16, 3, 2), conv2 = L.Convolution2D(16, 32, 3, 2), conv3 = L.Convolution2D(32, 32, 3, 2), fc4 = L.Linear(None, 100), fc5 = L.Linear(100, n_out))
	def __call__(self, x):
		h = F.relu(self.conv1(x))
		h = F.relu(self.conv2(h))
		h = F.relu(self.conv3(h))
		h = F.relu(self.fc4(h))
		h = self.fc5(h)
		return h

def main():
	cats = glob.glob('../cats/dogs/cat*')
	dogs = glob.glob('../cats/dogs/dog*')
	data = []
	for i in cats:
		data.append((i, 0))
	for i in dogs:
		data.append((i, 1))
	dataset = datasets.LabeledImageDataset(data)
	def transform(inputs):
		img, label = inputs
		img = img[ : 3, ...]
		img = img.astype(np.uint8)
		img = Image.fromarray(img.transpose(1, 2, 0))
		img = img.resize((32, 32), Image.BICUBIC)
		img = np.array(img, dtype = np.float32).transpose(2, 0, 1) / 255
		return img, label
	dataset = datasets.TransformDataset(dataset, transform)
	train_iter = iterators.SerialIterator(dataset, 100)
	test_iter = iterators.SerialIterator(dataset, 100, repeat = False, shuffle = False)
	model = L.Classifier(CNN(10))
	optimizer = optimizers.Adam()
	optimizer.setup(model)
	updater = training.StandardUpdater(train_iter, optimizer, device = -1)
	trainer = training.Trainer(updater, (5, 'epoch'), out = 'result')
	trainer.extend(extensions.Evaluator(test_iter, model, device = -1))
	trainer.extend(extensions.LogReport())
	trainer.extend(extensions.PrintReport(['epoch', 'main/loss', 'main/accuracy', 'elapsed_time']))
	trainer.run()
	serializers.save_npz('cats1.model', model)

if __name__ == '__main__':
	main()



```


以上。
他のPHPからBEAR.Sundayリソースを利用する

# 概要

他のCMSやフレームワークで作られたPHPアプリケーションからBEAR.Sundayのリソースを利用するのにHTTPリクエストをする必要はありません。composerのパッケージにして他のシステムからrequireしたあとは1行でリソースを利用可能です。

グローバル定数がない完全なDI設計のために複数のBEAR.Sundayアプリケーションが同一のPHPメモリ空間で存在可能です。

# 利用例

リソースを`json`で取得したい場合は文字列評価します。

```json.php
$json = (string) (new \BEAR\Package\Bootstrap)
->getApp('MyVendor\MyProject', 'prod-app')
->resource->uri('page://self/index')(['name' => 'Sunday']);
```

リソースを配列で取得したい場合は`body`プロパティを用います。

```body.php
$body = (new \BEAR\Package\Bootstrap)
->getApp('MyVendor\MyProject', 'prod-app')
->resource->uri('page://self/index')(['name' => 'Sunday'])->body;
```

リソースの要素を取得したい場合は配列アクセスします。

```greeting.php
$greering = (new \BEAR\Package\Bootstrap)
->getApp('MyVendor\MyProject', 'prod-app')
->resource->uri('page://self/index')(['name' => 'Sunday'])['greeting'];
```

リソースをHTMLで取得したい場合は`html`コンテキストを指定します。

```html.php
$html = (string) (new \BEAR\Package\Bootstrap)
->getApp('MyVendor\MyProject', 'prod-html-app')
->resource->uri('page://self/index')(['name' => 'Sunday']);
```

リソースを関数として取得したい場合はメソッドを指定して(get以外の場合）`uri()`で作成されたリクエストオブジェクトを取得します。

```get.php
$get = (new \BEAR\Package\Bootstrap)
->getApp('MyVendor\MyProject', 'prod-app')
->resource->uri('page://self/index');

$json = (string) $get(['name' => 'koriym']);
$greeting = $get(['name' => 'koriym'])['greeting'];
```

```post.php
$post = (new \BEAR\Package\Bootstrap)
->getApp('Polidog\Todo', 'prod-html-app')
->resource->post->uri('page://self/index');

$response = $post(['todo' => 'shopping'];
echo $response->code // 200
```
# 結論

BEAR.Sundayのリソースは再利用性に優れています。複数のアプリケーションを依存パッケージにして１つのアプリケーションにする方法は、マイクロサービス化のように並行開発や疎結合というメリットを享受しながら、開発もテストも管理もディプロイも容易です。
[メモ] ラズパイZEROを、microSDカードリーダの代わりに使う

![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/6be1053d-ee43-24b3-8ac8-43c35989ce14.png)

# 概要
- [Etcherが、1.4.3 から、ラズパイZeroへの直接イメージ書き込みに対応](https://resin.io/blog/etcher-now-with-multi-write-and-compute-module-support/)したってのをみてたら、[usbboot](https://github.com/raspberrypi/usbboot) ってのをつかってるとのことで、使ってみた。
- 電源が入って、microSDに起動できるものがないと、[USB device boot](https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/device.md)になるっぽい。
- ほかのイメージも送り込めるらしい。(未確認)


# 環境
- Windows 10 
- Raspberry Pi ZERO 


# TL;DR
1. Windowsにて
    - https://github.com/raspberrypi/usbboot/raw/master/win32/rpiboot_setup.exe<br>ダウンロード 実行、インストール
2. ラズパイZEROからSDカードを抜いて、WinPCのUSBに接続。
3. デバイスとして認識されたら、microSDを挿入。
4. Winにて、`rpiboot`を実行

=> ラズパイが、マスストレージデバイスとなって、microSDにアクセスできる

# 手順 (詳細)

## Windowsにて、
1. [rpiboot_setup.exe](https://github.com/raspberrypi/usbboot/raw/master/win32/rpiboot_setup.exe)　をダウンロード<br>[![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/f03e086b-a123-715c-895f-9ee5dbbfcfc1.png)](https://github.com/raspberrypi/usbboot/raw/master/win32/rpiboot_setup.exe)

2. 実行、インストール
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/17ec324d-7621-feca-1c2c-bdd7545010d8.png)

    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/2ccbfa71-a507-f89b-4e4d-137e30036f4d.png)

    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/97ea956f-0466-ae73-2e14-7720a467ca47.png)

    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/2e43869d-bd5a-840d-0a84-aa50317b74b1.png)

    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/ad3528bb-8907-6464-4295-baacff63b110.png)

    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/5729d286-96c1-da20-63a9-80af89424628.png)

3. ラズパイZEROからSDカードを抜いて、WinPCのUSBに接続。ドライバーがインストールされるまで待つ
    - ドライバーインストール前<br>![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/aef6e1af-3c2b-ee81-4855-07f3e3fbb65a.png)
    - ドライバーインストール後<br>![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/6be1053d-ee43-24b3-8ac8-43c35989ce14.png)


4. デバイスとして認識されたら、microSDを挿入。
5. Winにて、`rpiboot`を実行
    ![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/25548c48-dcad-fa92-134b-f08fa029ca47.png)
    -  => 実行されて、プログラムがラズパイにダウンロードされると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/4af7b0d2-118d-024b-622d-45491d634d77.png)

6. マスストレージデバイス！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/75594/d9d3de39-a132-542b-a90c-869a17745965.png)
Unity 2017.4.2f2 で、Tile Paletteがうまく表示できなかった件

# 問題
Unity 2017.4.2f2で、スライスしたスプライトを「Tile Palette」を使ってお手軽にレベルデザインをしようとしたが、うまくいかなったのでダウングレード?をして解決した話！

![スクリーンショット-(7).png](https://qiita-image-store.s3.amazonaws.com/0/124063/389609c2-791d-161c-d41b-e058b67de85f.png)
↓↓↓↓↓
![スクリーンショット-(8).png](https://qiita-image-store.s3.amazonaws.com/0/124063/7e7346e0-ce18-203a-bd7d-5c038c0c76a4.png)

# 解決手段
Unityのインストーラを下記のURLよりダウンロードして、バージョンを「2017.4.2」以外でダウングレード or アップデートをすれば解決。
https://unity3d.com/jp/get-unity/download/archive

自分の場合は、2017.4.1に戻しましたが、この記事の作成中には次のバージョンの「2018.1.0」も公開されていた~~ので、こちらでもおそらく直っているのではなかろうか。~~が、どうやら治っていなかった様子。

~~どうやら、このバージョンだけで自分の環境だけの可能性も？~~公式フォーラムで同じ問題の報告は数件あったが、投稿数自体は少なかった。

<b>公式フォーラムのスレッド</b>
https://forum.unity.com/threads/tile-palette.529314/
2018.1.0f2でも同様の報告があったようなので、「2017.4.1」に戻すのが正解かな？ちょっと様子を見てみます。

<b>2018/05/08 さらに更新＞＜</b>
https://unity3d.com/unity/beta-download#release-notes "2D: Fix tiles not rendered in tile palette window (1010103)"
もう一つの選択肢として、思い切ってβ版にアップデートすることでも解決する模様！
機械学習論文読みメモ_125


[One pixel attack for fooling deep neural networks](https://arxiv.org/pdf/1710.08864.pdf)
最近の研究でdeepnetの出力は連続的ではなく、入力に対する小さな摂動に敏感である事が知られている。
ネットワークの推論を狂わせる微小摂動を生成する手法はいくつか提案されてきた。
本論では、遺伝的アルゴリズムに属するdifferential evolutionを利用して探索する事で選ばれる、
微小数のpixelに対する微小摂動を行うだけで
ネットワークの推論を狂わせる事が可能な摂動の生成手法を提案する。
この手法を利用した結果、多くの画像に対して、たったひとつのピクセルを摂動するだけでも、ネットワークの
クラス分類結果を変化させられる事が分かった。
またこうした摂動に対してロバストになる画像は少ない事が分かった。

[First-order Methods Almost Always Avoid Saddle Points](https://arxiv.org/abs/1710.07406)
本論では、幅広い一次オーダーの最適化手法に関して、それらがほぼ全ての初期化条件に関してsaddle pointを回避出来る事を示した。本論では、動的システムの観点から、Stable Manifold Theoremを利用する事で全所的なstabilityの解析を可能にした。

[Dynamic Routing Between Capsules](https://arxiv.org/abs/1710.09829)
capsuleとは物体やその部分などを表現するactivity vectorを持つニューロンのgroupで成り立つパラメータ表現である。
activity vectorの長さはさらに物体の存在、向きを表現している。
一つのactiveなカプセルは遷移行列を通したpredictionsにより次のカプセルのパラメータ表現を獲得する。
複数のパスから得られたpredictionsが同意する場合に、次のカプセルがactiveになる。
このカプセルネットワークを用いた多層パーセプトロンで分類器を学習し、MNISTに関してSOTAを達成。
機械学習論文読みメモ_124


[VPGNet: Vanishing Point Guided Network for Lane and Road Marking Detection and Recognition](https://arxiv.org/abs/1710.06288)
Laneとroad markingの検出を同時に行う事が可能なmulti task networkを提案する。
この手法は様々な環境に関してvanishing pointのガイドに頼りながら推論を行う。
本論では、夜間や雨などの難しい環境でのデータ収集を行った。
提案モデルはlaneとroad、さらにvanishing pointの推論を行う事が可能なVPGnet
を提案する。
本モデルはまた20hzで動作し、高速である。

[SWISH: A SELF-GATED ACTIVATION FUNCTION](https://arxiv.org/abs/1710.05941)
活性化関数の選択はその性能に大きな影響を与える。
最近はReLUが用いられる事が一般的である。
本論では新たな活性化関数としてf(x) = x * sigmoid(x)で表されるSwishを提案する。
Swishは実験により様々な分野のタスクにおいてReLUよりも高い性能が得られる事が示された。

[GSLAM: Initialization-robust Monocular Visual SLAM via Global Structure-from-Motion](https://arxiv.org/abs/1708.04814)
多くの単眼カメラを用いたVSLAMはincremental SfMに基いて提案されてきた。
本論では最近発展しているglobal SfMを取り入れた単眼カメラによるVSLAM手法を提案する。
始めに、rank 1 matrix factorizationを用いたVOを新たに提案する。
このVOは地図初期化時におけるノイズに対してロバストである。
次に、最近のglobal SfMをpose-graph optimizationの枠組みに適用する。
historyから特定のコマンド履歴を消す [Vim]

##消したい行だけ編集で消す

```zsh
#bash
vim ~/.bash_history

#zsh & peco
vim ~/.zsh_history 
```
任意の行で`dd`して`:wq`

これで`history`コマンド以外の履歴は消せるので、あとは
**再ログイン**すれば`history`コマンドからも履歴が消えてるはず


>
[bashでやっちまったコマンドだけhistoryから削除する | CloudAdvisor](https://hacknote.jp/archives/6055/)
PHPStormでcakephp ctpファイルのコード補完を行う方法

##ctpファイルのコード補完を行う方法

普段、PHPStormでphpの編集を行っています。
最近、CakePHP3のフォームヘルパーを使用する際にctpファイルではコード補完ができなかったため対策を調べました。これはその忘備録です。

###コード補完を効かせるために
なぜctpファイルはコード補完が利かなくなってしまうのかという原因は、PHPStormが現在編集しているctpファイルがどのクラスに属しているかを把握していないからということらしいです。
したがって、どのクラスに属しているのかをctpファイルの初めに書いてやる必要があります。

具体的には下記の通りです。（コメントアウトしている部分に記載してOKです）

```php:index.ctp
<?php
/*
*↓↓ctpファイルの初めの行に以下の行を追加する。↓↓
*@var \App\View\AppView $this #←これを追加
*/
```
【Javascript】ボタンを押すとcanvasを画像としてダウンロード

#概要
この記事では、HTMLのボタンを押すと、canvasを画像としてダウンロードできるようになるソースを紹介しています。

#ソース

```html
<canvas id="canvas"><canvas>
<button id="download">download</button>
```

```js
document.getElementById("download").onclick = (event) => {
	let canvas = document.getElementById("canvas");

	let link = document.createElement("a");
	link.href = canvas.toDataURL("image/png");
	link.download = "test.png";
	link.click();
}
```
Vagrant Atlasがいつの間にか無くなってたので移行した

# 何が起こったか
久々にローカルのVMインスタンスを作ろうとしたら、これまで使えていたBoxが軒並みcould not be foundに……
これまでBoxを提供していたVagrant Atlasサービスは、Vagrant Cloudというものに移行する（した）ようです。

Vagrant Cloud Migration Announcement
https://www.hashicorp.com/blog/vagrant-cloud-migration-announcement

updateを利用者に通知できるようになったり、いろいろと機能強化がなされたようです。

必要なBoxは下記URLから検索できるようになったようです。
https://app.vagrantup.com/boxes/search


なお、以降の動作確認はVagrant 1.9.1で行いました。

```
$ vagrant --version
Vagrant 1.9.1
```

# エラーの具体例
下記のようなエラーが出力される場合は、既にAtlas上にBoxイメージが無い可能性が高いです。
「以前はこの設定で出来たんだけどな…」という場合はほぼこれです。

## エラーメッセージ
```
$ vagrant up
Bringing machine 'stdsv1' up with 'virtualbox' provider...
==> stdsv1: Box 'centos/7' could not be found. Attempting to find and install...
    stdsv1: Box Provider: virtualbox
    stdsv1: Box Version: 1803.01
The box 'centos/7' could not be found or
could not be accessed in the remote catalog. If this is a private
box on HashiCorp's Atlas, please verify you're logged in via
`vagrant login`. Also, please double-check the name. The expanded
URL and error message are shown below:

URL: ["https://atlas.hashicorp.com/centos/7"]
Error: The requested URL returned error: 404 Not Found
```

## Vagrantfile（修正前）
下記のVagrantファイルを元にvagrant upを行うと、上記エラーが出ます。

```:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos/7"
  config.vm.box_version = "1803.01"
  config.vm.boot_timeout = 600
  config.vm.provision :shell, :path => "bootstrap.sh"

  config.vm.provider "virtualbox" do |v|
    v.memory = 1024
    v.cpus = 1
  end

  config.vm.network "forwarded_port", guest:22, host:2322
  config.vm.define :stdsv1 do |c1|
    c1.vm.hostname = "stdsv1"
    c1.vm.network :private_network, ip: "192.168.255.11"
  end
end
```

## Vagrantfile（修正後）
「config.vm.box_url」を指定することで、Vagrant Cloud上のファイルを取得することができるようになります。

```:Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos/7"
  config.vm.box_url = "https://app.vagrantup.com/centos/boxes/7"  # ←この行を追加
  config.vm.box_version = "1803.01"
  config.vm.boot_timeout = 600
  config.vm.provision :shell, :path => "bootstrap.sh"

  config.vm.provider "virtualbox" do |v|
    v.memory = 1024
    v.cpus = 1
  end

  config.vm.network "forwarded_port", guest:22, host:2322
  config.vm.define :stdsv1 do |c1|
    c1.vm.hostname = "stdsv1"
    c1.vm.network :private_network, ip: "192.168.255.11"
  end
end
```