OmniAICreator/Qiita-1.07M huggingface dataset:
マウスを使わずに新規ファイル作成

いまこんなツイートが。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">Add a new file in navigation bar item or popup <a href="https://twitter.com/hashtag/DriveToDevelop?src=hash">#DriveToDevelop</a> <a href="https://t.co/3tw2cOPMYH">pic.twitter.com/3tw2cOPMYH</a></p>&mdash; PhpStorm (@phpstorm) <a href="https://twitter.com/phpstorm/status/874250366468206592">2017年6月12日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# どういうこと?

エディタにフォーカスがあると普通 `Cmd + N` はこうなりますよね。

<img width="487" alt="スクリーンショット 2017-06-12 22.16.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/11525/c3bd78d6-7429-a529-9a48-f5d35ba56a4b.png">

ここで `Cmd + ↑` でナビゲーションバーへ。

<img width="478" alt="スクリーンショット 2017-06-12 22.17.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/11525/d4c0d94e-a2cf-e829-9de4-2bea0423b0c5.png">

`Cmd + N` どーん。

<img width="481" alt="スクリーンショット 2017-06-12 22.18.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/11525/f65b04df-c1cb-44c2-e4d5-d7aca82da6ef.png">

ナビゲーションバーで左右に移動してれば、選択していたフォルダにあわせて適切なオプションで新規作成ダイアログが開きます。

<img width="574" alt="スクリーンショット 2017-06-12 22.18.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/11525/55927f91-8d4d-78f8-4fa7-75c3dc6542c3.png">

## 結論
べんり。
Windows Server 2016 USBインストール

OS無しのサーバにWindowsServer2016をインストールしようとして四苦八苦した記録です。

# 概要
- USBメモリからインストールしようとした
- インストールISOファイルの全ファイルをUSBドライブにコピーすればよいはずだったが、大きすぎてコピーできないファイルがあった
- NTFSやexFATではブートしなかった
- 大きいファイルを分割したらインストールできた

# 手順
- 作業PCにUSBメモリを挿し、FAT32でフォーマット
- WindowsServer2016インストールISOファイルを作業PCにマウントし、ファイルをUSBメモリにコピー

※```\sources\install.wim```がコピーできないというエラーが表示されるがスキップしてそれ以外のファイルをコピー

- コマンドプロンプトを管理者として、立ち上げ以下のコマンドを実行

```
Dism.exe /Split-Image /ImageFile:<マウントしたISOのドライブ名:\sources\install.wim /SWMFile:<USBメモリのドライブ名>:\sources\install.swm /FileSize:4096

例）DドライブがインストールISO、FドライブがUSBメモリの場合
Dism.exe /Split-Image /ImageFile:D:\sources\install.wim /SWMFile:F:\sources\install.swm /FileSize:4096
※windows7 32bit機ではSplit-Imageオプションがないとエラーになった。
```

- USBメモリをサーバに挿し電源ON

> 参考URL
https://msdn.microsoft.com/ja-jp/library/windows/hardware/dn938329(v=vs.85).aspx

# おまけ。オフラインでライセンス認証
## プロダクトキー入力
1. 設定＞更新とセキュリティ＞ライセンス認証＞プロダクトキーを変更します をクリック
1. プロダクトキーを入力
1. 次へ
1. 閉じる

## 電話認証
1. コマンドプロンプトで```slui 04```と入力
2. 画面の指示に従う
Typescriptをavaでテストしてnycでカバレッジ

結構詰まった。備忘。Node.js環境。

# テストをビルドする
ちなみに`tsconfig`は`tsc -p tsconfig.json`で指定できる。

```json:tsconfig.json
{
  "compilerOptions": {
    "target": "es6",
    "module": "es6",
    "outDir":"./test",
    "moduleResolution": "node",
    "inlineSourceMap": true
  }
}
```

`inlineSourceMap`が重要。ソースマップがビルド結果のファイル内に含まれる。
なぜか`sourceMap`ではうまく行かなかった。

# テスト

`ava`で`es6`のテストはそのままでは動かなかった。
もっといいやり方がありそう。

```json
{
  "babel": {
  "presets": [
      "es2015",
      "stage-2"
    ]
  },
  "ava": {
    "require": [
      "babel-register"
    ],
    "babel": "inherit"
  }
}
```

テストのファイル指定は必要に応じて。

```bash
$ nyc ava
```

以上。
`nyc`は自動的に`sourcemap`を辿って`ts`のカバレッジを出してくれるっぽい？
モバイル版Googleの履歴削除

# Googleの履歴について  
  
Googleは利用者の様々な履歴データを収集していますが、ここではページ履歴と検索バーに表示される履歴を削除します。  

<img width="375" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/106314/b7f0b18e-4505-819b-ef85-ab95dceb4def.png">  
  
検索バー履歴は☓ボタンから一つ一つ消すこともできますが、面倒です。

## 設定方法(テキスト)  
「スマホ版Chrome」→「設定」→「プライバシー」→「履歴の削除」→「閲覧履歴」、「Cookie、サイトデータ」を最低限チェックして削除

## 設定方法(画像)　　

###1. 右の設定
<img width="375" alt="02.png" src="https://qiita-image-store.s3.amazonaws.com/0/106314/4e92cf8c-bf21-248a-e30e-a38364c9b74c.png">

###2. プライバシー
<img width="375" alt="03.png" src="https://qiita-image-store.s3.amazonaws.com/0/106314/2655f497-3993-5e4e-be17-ad86400a6f38.png">


###3.  履歴の削除
<img width="375" alt="04.png" src="https://qiita-image-store.s3.amazonaws.com/0/106314/81dd8c85-a752-f580-a390-d74221aa20be.png">


###4. 「閲覧履歴」、「Cookie、サイトデータ」を最低限チェックして削除

- [x] 閲覧履歴  
- [x] Cookie、サイトデータ
- [ ] キャッシュされた画像とファイル
- [ ] 保存したパスワード
- [ ] 自動入力データ

<img width="375" alt="05.png" src="https://qiita-image-store.s3.amazonaws.com/0/106314/f7be514f-5209-ea0d-677b-9f9656c8930e.png">

すべての履歴を消す場合は全部チェックします。
Node.js/nvm環境構築備忘録

2017/06/12に環境構築した時のログ

# nvm
リポジトリ： https://github.com/creationix/nvm

```bash
$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
```

pathまで勝手に通してくれるらしい。

あとで気づいたがHomebrewでも入る。

```bash
$ brew install nvm
```
パスは自分で通す。インストールのログに書いてあるのでコピペすればいい。

# node

```bash
$ nvm install node
```
で最新版が入る。

バージョン固定

```bash
$ nvm use v8.1.0
```
`npm`は一緒に入る。

# yarn
`nvm`をbrewで入れた場合、`--ignore-dependencies`しないとbrewでも`node`が入ってしまう。

```bash
brew install yarn --ignore-dependencies
```
基礎

## generateコマンド

  rails generate controller **home top**

① views/home/top.html.erb
 　 **home**フォルダと**top**.html.erbファイルが作成される。

② controllers/home_controller.rb
　コントローラーファイルの中に**home**_controller.rbというファイルが作成され、ファイルの中に**top**メソッドが追加される。
 
呼び出すときはURL/home/topにより、
**home**コントローラーの**top**アクションを呼び出す。　

※ページが表示されるまでに、ルーティング→コントローラ→ビューという順で処理が行われていることを理解する。

## route
 設定
```
Rails.appliovation.routes.draw do
　get "top"=>"home#top"
end
```
上記の用に記載することで
URL/topで呼び出し可能。
"**/**"にすることでURLで呼び出し可能。


## memo 
app…アプリケーションのメインフォルダ
config…設定情報に関するフォルダ
db…データベースに関するフォルダ
app/asset…image,JS,cssのリソースフォルダ
SQL Serverのテーブルのデータをダブルクオート（"）を付けてCSVにエクスポートする方法

SQL ServerのデータをCSVエクスポートする方法はいくつかありますが、
「カンマ(,)」や「改行」が含まれるテキストがある場合、ダブルクオートで括る方法が
見当たらなかったので、PowerShellを利用してエクスポートしました。

SQL Server Management Studioではオプションで「カンマ(,)」を含むデータを「ダブルクオート(")」で括るオプションはありますが、改行には対応していません。


データベース名を右クリックして、[タスク]-[データのエクスポート]をし、SSISを使用する方法もありますが、マッピング編集が面倒であったり、環境依存文字を含むデータの文字コード変換に失敗したり、うまくいかないことがあります。

Windows PowerShell ISEを開いて次のコードを貼り付けて実行すると、C:\temp以下にファイルがエクスポートされます。変数は適宜修正してください。

```

[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo")
$sqlsvr = 'データベースサーバー名'
$dir = 'c:\temp\' #エクスポートディレクトリ
$database = 'データベース名'
$diagnostics = 1
$sqlserver = New-Object Microsoft.SqlServer.Management.Smo.Server($sqlsvr)
$db        = $sqlserver.databases[$database]
$TableName    = "テーブル名"
$Header = 1

$Delimiter = ','    # ifs_ExportTables.Delimiter
if ($diagnostics = 1) 
   {write-host -ForegroundColor Green "Creating Table $TableName to path $dir$TableName.csv" }
$sqlserverR = New-Object Microsoft.SqlServer.Management.Smo.Server($sqlsvr)
$dbR = $sqlserverR.databases[$database]
$TablesR = $dbR.ExecuteWithResults("Select * FROM $TableName")

$result = $TablesR[0].tables.item(0)
if ($Header -eq '1')
{$result |export-csv -Delimiter $Delimiter –notype -path $dir$TableName.csv  -Encoding Default}
else
{$result | ConvertTo-Csv -NoTypeInformation -Delimiter $Delimiter | Select-Object -Skip 1 | Out-File -FilePath $dir$TableName.csv  -Encoding Default}
```
FFmpegで5.1ch音声をモノラル音声6つに切り出す(Channel Layoutのメモ)

# 経緯
Unityで360°動画を再生したい!
音声も3Dにしたい！
AudioSourceを周囲に配置しなきゃ!
音声をchannel毎に切り出さなきゃ…？

# 前提
`ffmpeg version 3.2.2`

# やり方

```
ffmpeg -i in.mov -filter_complex 'channelsplit=channel_layout=5.1[FL][FR][FC][LFE][SL][SR]' -map '[FL]' front_left.wav -map '[FR]' front_right.wav -map '[FC]' front_center.wav -map '[LFE]' lfe.wav -map '[SL]' side_left.wav -map '[SR]' side_right.wav
```
filter_complexオプションのchannelsplitでチャンネルの切り分け方を指定する。

## 5.1ch以外のパターン
まずAudioの形式を調べる

```
$ ffmpeg -i in.mov
(省略)
    Stream #0:0(eng): Audio: pcm_s24be (lpcm / 0x6D63706C), 48000 Hz, 4.0, s32 (24 bit), 4608 kb/s (default)
(省略)
```
`48000 Hz`の後の4.0で4.0chとわかる
4.0chのChannel Layoutは`FL+FR+FC+BC`なので、

```
ffmpeg -i in.mov -filter_complex 'channelsplit=channel_layout=4.0[FL][FR][FC][BC]' -map '[FL]' front_left.wav -map '[FR]' front_right.wav -map '[FC]' front_center.wav -map '[BC]' bc.wav
```
で切り出せる。
めでたしめでたし。

# Channel-Layout

channel layoutいろいろあるのでまとめ
https://www.ffmpeg.org/ffmpeg-utils.html#Channel-Layout

## channelのリスト
| id | channel |
|:-----------------|:------------------|
| FL | front left |
| FR | front right |
| FC | front center |
| LFE | low frequency |
| BL | back left |
| BR | back right |
| FLC | front left-of-center |
| FRC | front right-of-center |
| BC | back center |
| SL | side left |
| SR | side right |
| TC | top center |
| TFL | top front left |
| TFC | top front center |
| TFR | top front right |
| TBL | top back left |
| TBC | top back center |
| TBR | top back right |
| DL | downmix left |
| DR | downmix right |
| WL | wide left |
| WR | wide right |
| SDL | surround direct left |
| SDR | surround direct right |
| LFE2 | low frequency 2 |

# channel layout のリスト
| id | channel layout |
|:-----------------|:------------------|
| mono | FC |
| stereo | FL+FR |
| 2.1 | FL+FR+LFE |
| 3.0 | FL+FR+FC |
| 3.0(back) | FL+FR+BC |
| 4.0 | FL+FR+FC+BC |
| quad | FL+FR+BL+BR |
| quad(side) | FL+FR+SL+SR |
| 3.1 | FL+FR+FC+LFE |
| 5.0 | FL+FR+FC+BL+BR |
| 5.0(side) | FL+FR+FC+SL+SR |
| 4.1 | FL+FR+FC+LFE+BC |
| 5.1 | FL+FR+FC+LFE+BL+BR |
| 5.1(side) | FL+FR+FC+LFE+SL+SR |
| 6.0 | FL+FR+FC+BC+SL+SR |
| 6.0(front) | FL+FR+FLC+FRC+SL+SR |
| hexagonal | FL+FR+FC+BL+BR+BC |
| 6.1 | FL+FR+FC+LFE+BC+SL+SR |
| 6.1 | FL+FR+FC+LFE+BL+BR+BC |
| 6.1(front) | FL+FR+LFE+FLC+FRC+SL+SR |
| 7.0 | FL+FR+FC+BL+BR+SL+SR |
| 7.0(front) | FL+FR+FC+FLC+FRC+SL+SR |
| 7.1 | FL+FR+FC+LFE+BL+BR+SL+SR |
| 7.1(wide) | FL+FR+FC+LFE+BL+BR+FLC+FRC |
| 7.1(wide-side) | FL+FR+FC+LFE+FLC+FRC+SL+SR |
| octagonal | FL+FR+FC+BL+BR+BC+SL+SR |
| downmix | DL+DR |

# まとめ

FFmpegは奥が深いなぁ…

# 参考

channelsplit
https://ffmpeg.org/ffmpeg-filters.html#channelsplit
Channel Layout
https://ffmpeg.org/ffmpeg-utils.html#Channel-Layout
WindowsとUbuntuのデュアルブートが死んだ（2ヶ月ぶり）ので，Windowsを別ドライブに再インストールした。

# 論文提出締め切り4日前の事件

まずUbuntuが起動しなかったので，GrubからRecovory Modeを立ち上げて，fsckやGrub再構成を繰り返してubuntu起動復帰。
そこでWindowsを起動すると「回復」「Recovory」の画面から他に行けなくなる。
windowsのインストールディスクを入れても症状は同じ。
そしてwindowsの起動を試すたびに毎回ubuntuもまたおかしくなる。

朝3時代という早朝に出勤して来たのにググりながら色々試しても昼過ぎに諦める。
ギリギリ起動ディスクさえBIOSから選択すればubuntuは起動できる状態だったので，両方が死ぬ前にwindows再インストールすることにした。

# インストール先

これまではM.2接続されている512GBSSDのパーティションをいじってwin10とubuntu16.04をインストールしていた。2ヶ月前におかしくなってwin再インストールして問題なく使えていたが，今回の件があったので，インストール先は変えてみる。

データ用にSATA1接続していたSSD，中身はDropboxとEvernoteとGithubなどでクラウド上でデータはバックアップされている状態だったので思い切ってSATA1のSSDを全て削除して新規にインストールすることにした。

問題が起きるのは基本的にはwindowsのアップデートやubuntuのアップデートをした時に違うOSに影響してしまう（特にブート関係の部分）ようなので，いままでみたいにubuntuのGrubからwindows起動したり，windowsのブートオプションからubuntu選べるようにするのをやめて，BIOSから起動ディスク選べるようにすればもっと問題起きなくなるのではという考え。

# インストール

まずBIOSの設定も初期設定に戻しておいた。起動の優先のSSDは元はM.2の方だったけれども，問題が起きているうちにBIOSでそちらを優先ディスクに選択できなくなった。故にこちらも初期設定に。BIOS起動直後にF11キーを押して起動ディスクを選べばM.2の方を選択できる。（これで起動するとGrubが立ち上がる）

windows10インストールは1〜2時間ぐらい。更新の反映に時間がかかる。

# 共有ディスク
これまでwindowsがインストールされていたパーティションを共有ディスクにしようとする。
GPartedでexfatにフォーマットしてLAN経由でmacbookproからもアクセスできるようにしようとしたら，exfatが選択できず。必要なパッケージを入れようとするとエラーが起きる。このエラーがlinux-genericなんとかのインストールがうまくできてないものと関係しているようで，これがいろんなOS関係のエラーを引き起こしているような感じがあるので解決に務める。

##　dpkg　--configureがうまくいかない問題


```
 sudo dpkg --configure -a
```
がうまくいかない問題。
http://ikkuntech.blogspot.jp/2012/03/apt-get.html
http://mypace75.blog92.fc2.com/blog-entry-279.html
とかをみながら.postinstとかもろもろ削除したらいけた。

## exfat-utils, exfat-fuse

```
sudo apt-get install exfat-utils exfat-fuse
```
できた。ただし結局ubuntuからexfatの設定ができなかったので，fat32でフォーマットした。
Win Mac Ubuntuからほぼ問題なくアクセスするためにはfat32でよいとおもう。

# 完了

無事できた。
windowsの作業環境セットアップが面倒だが最低限頑張ろう。texやプログラミング環境は締め切り後まであとまわしでとりあえずubuntuとmacにまかせる。CADとAdobe系、オフィス系は入れる必要あり。
Unity2017でawaitしないasyncのwarningを消す方法

##awaitしないasyncメソッドの警告

Unity2017になって、C#6.0が試験的とはいえ使用できるようになりました。
C#6.0といえば非同期処理としてasync, await記法が使えるバージョンですね！
さて、asyncを利用しているとよく見かけることになる警告があります。

![warn.png](https://qiita-image-store.s3.amazonaws.com/0/161633/16b4e041-c0b6-bc76-6ae3-08c08efc8895.png)

```
warning CS1998: Async block lacks `await' operator and will run synchronously
```

これは以下のようなコードで再現します。

```csharp
public async Task NoAwait()
{
    Debug.Log("do something without await...");
}
```

##警告の対処法

ようは、関数に`async`をつけているのに何も`await`しないで終了するよ！という警告です。
この警告はうざったい！ということで、ググるとこいつを消す方法がいろいろ出てきます。
一例はこちら

```csharp
#pragma warning disable 1998
public async Task NoAwait()
{
    Debug.Log("do something without await...");
}
#pragma warning restore 1998
```

はい、警告は出なくなりました。でもこれでは該当する箇所に全部書かないといけません。面倒ですね。
では、プロジェクト設定で無視するようにしましょう。

Visual Studioのプロジェクト設定、ビルドの項目にエラーおよび警告という設定項目があります。
表示しない警告に1998を設定しましょう。

![projsetting.png](https://qiita-image-store.s3.amazonaws.com/0/161633/f3b74f2c-e13d-763d-6a6d-f194fa170342.png)

これで警告が無視できるようになるのであればこれで問題ありません。
ただ、Unityと連携しているとそもそもプロジェクト設定が開けなくなっていたりします。

##mcs.rspについて

`mcs.rsp`というファイルがあります。これは古いバージョンでは`smcs.rsp`という名前でした。
Unityプロジェクトの`Assets`直下に配置することで、defineシンボルの定義を設定することができます。
defineシンボルを定義する使い方は[こちらを参照](https://docs.unity3d.com/ja/current/Manual/PlatformDependentCompilation.html)してください。
ここでは警告を無視する使い方を紹介します。

```Assets/mcs.rsp
-nowarn:1998
```

これだけ書いた`mcs.rsp`ファイルを`Assets`直下に配置するだけで、表題の警告は出なくなります。

##余談

`smcs`の実体はUnityをインストールしたディレクトリに存在していて、windowsなら`Unity/Editor/Data/Mono/lib/mono/unity/smcs.exe`にあります。
`smcs.exe -help`を実行するとその他のオプションも全て出てきます。
nGUI UIPanel のインスペクターにあるオプションの効果メモ

# nGUI UIPanel のインスペクターにあるオプションの効果メモ

![スクリーンショット 2017-06-12 20.16.15.png](https://qiita-image-store.s3.amazonaws.com/0/45211/5f7f1941-9dd4-fcb2-4809-9bf46ce3d52d.png)

*nGUI v3.11.1*

**公式ドキュメント**

[http://tasharen.com/ngui/docs/class_u_i_scroll_view.html](http://tasharen.com/ngui/docs/class_u_i_scroll_view.html#a786c4be2d93f1f221a1dbd4aef975dd4)


## Scroll Wheel Factor [=0.25f]

Effect the scroll wheel will have on the momentum.

マウスホイールでのスクロール量にかかる係数。スクリーンドラッグには影響しない。


## Momentum Amount [=35f]

How much momentum gets applied when the press is released after dragging.

慣性スクロールの効果値。大きいほど強くかかる。


## Restrict Within Panel [=true]

Whether the dragging will be restricted to be within the scroll view's bounds.

スクロールの範囲を `ScrollView` の範囲に制限する。スクロール要素の両端で止めるかどうか。


## Constrain On Drag [=false]

Whether the scroll view will execute its constrain within bounds logic on every drag operation.

スクロールの範囲を `ScrollView` の範囲に制限する。[Restrict Within Panel](#restrict-within-panel-true) と同じ意味だが、こちらは `DragEffect.MomentumAndSpring` が設定されている場合には効果がない。


## Cancel Drag If Fits (disableDragIfFits) [=false]

Whether dragging will be disabled if the contents fit.

`ScrollView` が親 `Panel` 内に納まっている場合はスクロールを無効にする。


## Smooth Drag Start [=true]

Whether the drag operation will be started smoothly, or if if it will be precise (but will have a noticeable "jump").

ドラッグ処理時にタップ位置との差を加えてスクロール開始時のガクつきをなくす。 `OFF` にするとドラッグ開始時にタップ位置との差が一気に反映される。 `UICamera` の Thresholds が小さければ気にならないかもしれない。

## iOS Drag Emulation [=true]

Whether to use iOS drag emulation, where the content only drags at half the speed of the touch/mouse movement when the content edge is within the clipping area.

iOS のスクロールの振る舞いをエミュレートする。スクロールの端に到達した場合スクロール量を半分にして全体が描画領域外になるのを抑制する。

---

以上
Flask で MariaDB を使う

![flask_jun12.png](https://qiita-image-store.s3.amazonaws.com/0/179446/d3a59da9-d941-3fb7-ebb5-9b7130114fe8.png)

フォルダー構成

```text
$ tree 
.
├── mariadb.py
└── templates
    ├── hello.html
    └── layout.html
```
              
```py3:mariadb.py
# --------------------------------------------------------------------
#	mariadb.py
#
#						Jun/12/2017
#
# --------------------------------------------------------------------
from flask import Flask, render_template
import sys
import mysql.connector

app = Flask(__name__)

@app.route('/')
def hello():
	name = "皆さんこんにちは"
	return name


@app.route('/mariadb')
def mariadb():
        sys.stderr.write("*** mariadb() *** start ***\n")
	host_aa='localhost'
	data_base = 'city'
	user_aa ='scott'
	password_aa = 'tiger123'
	conn = mysql.connector.connect(user=user_aa, password=password_aa, \
                              host=host_aa,database=data_base)
#
	cursor = conn.cursor (dictionary=True)
#
	sql_str="select id, name, population, date_mod from cities order by id"
	cursor.execute (sql_str)
	rows = cursor.fetchall ()
#
	cursor.close ()
	conn.close ()
        sys.stderr.write("*** mariadb() *** end ***\n")
#
	return render_template('hello.html', title='MariaDB', cities=rows)

#
if __name__ == "__main__":
	app.run(host='0.0.0.0',debug=True)
```

```html:templates/hello.html
{% extends "layout.html" %}
{% block content %}
<blockquote>
<h3>都市一覧</h3>
</blockquote>
<table>
<tr>
<th>id</th>
<th>name</th>
<th>population</th>
<th>date_mod</th>
</tr>
{% for city in cities %}
        <tr>
        <td>{{ city.id}}</td>
        <td>{{ city.name}}</td>
        <td>{{ city.population }}
        <td>{{ city.date_mod }}
        </tr>
{% endfor %}
</table>
{% endblock %}
```

```templates/layout.html
<!doctype html>
<html>
<head>
<title>{{ title }}</title>
<body>
{% block content %}
<!-- ここにメインコンテンツを書く -->
{% endblock %}
</body>
</head>
```

サーバーの実行

```bash
$ python mariadb.py 
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 197-707-221
```

クライアントは、
http://localhost:5000/mariadb
にアクセスする。

データベース
>ホスト　localhost
>データベース　city
>ユーザー　scott
>パスワード　tiger123

```text
MariaDB [city]> select * from cities;
+-------+--------+------------+------------+
| id    | name   | population | date_mod   |
+-------+--------+------------+------------+
| t3321 | 岡山   |     645927 | 2017-05-30 |
| t3322 | 倉敷   |     791835 | 2003-02-15 |
| t3323 | 津山   |     163754 | 2003-08-18 |
| t3324 | 玉野   |     369172 | 2003-01-09 |
| t3325 | 笠岡   |     237451 | 2003-03-04 |
| t3326 | 井原   |     518397 | 2003-05-21 |
| t3328 | 高梁   |     478294 | 2003-10-26 |
| t3329 | 新見   |     863751 | 2003-12-15 |
+-------+--------+------------+------------+
```

次のバージョンで確認しました。

```text
$ flask --version
Python 3.11.2
Flask 2.2.2
Werkzeug 2.2.2
```

Ubutu 23.04 で必要なライブラリーのインストール

```bash
sudo apt install python3-flask
sudo apt install python3-mysql.connector
```
PHPカンファレンス福岡2017に参加してきました。

この記事は[cloudpackあら便利カレンダー](https://cloudpack.github.io/benri2017/)の9日目の記事です。

先日行われた[PHPカンファレンス福岡2017](http://phpcon.fukuoka.jp/2017/)に参加してきましたので、
参加メモですがここに残します。

# PHP7で堅牢なコードを書く

## DB情報が変更されるとエラーでるよね

不具合の発見が遅れれば遅れるほど傷は深くなる
- 要件定義の段階で発見できれば傷は浅い

## 予防的プログラミング

- 間違った予防法
is_null() やら is_array() やら array_key_exists() やら

- 正しい予防法
インタフェース設計をする: 誤った使い方をすることが困難
== そもそも間違った使い方ができない

タイプヒントで `int` `string` で縛ればそもそも is_int() とかは不要
Enumつかってとりうる値を制御するのもアリ
PHPで列挙型を作る@hiraku

-  責務を増やしすぎない
  - DIで責務をバランシングする
    - 作る人: new PDO()
    - 設計する人: DI
    - 利用する人: $pdo->execute()

_予防にまさる防御なし_


## 攻撃的プラグラミング

### fail fast
早めにクラッシュさせること
疑いがあればすぐに停止させるべき

### 正当性と堅牢性
- 正当性
  不正確な結果を返すくらいなら何も返さない方がマシ
  個々のクラスで担保
- 堅牢性
  多少なんかあってもソフトウェアの実行が継続するようにする
  アーキ・FWで担保

### 戻り値ではなく例外を使う
`PDO::ERRMODE_EXCEPTION`: 何かしくるとErrorになる（その前はWarningくらい）


### 表明プログラミング
`怒るはずがない` をコードで表す == assertion
assert(評価式)
このままだと警告出すだけで落ちない
php.iniで `assert.exception = 1` によって表明違反でおちる is 最高
`zend.assertions` で実行時の挙動を変更できる

暗黙の前提を明示的なコードにすることで読み手が理解しやすくなる

### 例外と表明の使い分け
例外は起こり得るものに
表明は起こり得ないものに
それぞれつかう


## 契約プログラミング
誰の責務化はっきりさせる契約による設計
- 事前条件違反は呼び出し側に問題がある
- 事後条件違反は供給者側に問題がある

AssertionError/LogicExceptionはcatchするのはまちがい
はやめに落としてなおしにいくべき

Exceptionの第三引数はstacktraceをつなげる役目がある

```php
try{

} catch (\PDOException $e) {
  throw new LogicException($e->getMessage(), $e->getCode(), $e);
}
```



# ADR

Request -> BusinessLogic -> View

MVCとほぼおなじ

Controller <-> Action
Model <-> Domain
View <-> Responder

## Action
- レスポンスを返却する責務がない
- 1つのClassで1つのリクエストを担当（GETならGETのClassを作る）
- Domain と Responderを接続する
- Closureや__invoke()で実行すべき
- Middlewareでよくつかう手法

## Domain
- DDDのDomainを例に解説

## Responder
- Actionに対するResponderを個別に用意
- ヘッダの設定とかも
- テンプレートを組み込んでもおｋ

## ADRは何を目指すか
_小さく、最小単位に_
単一責任の原則

## 依存を逆転してもアプリケーションは動かないといけない

サービス要件とシステム要件をちゃんとわけて考えられているか

## Specification Pattern
- 仕様パターン
このRepositoryには何を与えればいいかを定義

## Domain Service Class
- バルク時の割引はEntityで表現できないよね〜みたいなときにつかう

1Action, 1Domain


# 1,800Req/s

就職活動支援系アプリのAPIの話
- 構成
  - EC2: m4.xlarge x 2
  - RDS: m3.xlarge

- ミドルウェア
  - Ubuntu
  - PHP
  - cakephp
  - apache

1. 負荷を想定
2. 仮構成を作成
3. 負荷試験 + 調整

- やばかったら？
  - EC2はスケールアウトで対応
  - DBはスケールアップ

## PV -> APIコールの変換
- ユーザシナリオ
- シナリオの各ステップでのAPIコールをリストアップ
- その時のPVとAPIコールの比率をとる

3000PV/sec -> 1800call/sec

## 負荷テストで死んだ
APIコールのシナリオを見直す
- 静的化できるもの(config系)は積極的にキャッシュ: PHPを使わずApacheだけで完結させる
- m4.4xlarge x 16台構成に変更

## 本番稼働
- APIの静的化でDBコネクションの張り付きを逃れる


# PHP-ML

いろんなアルゴリズムが実装されてる
でも対応状況はまだまだ

## Pythonでは
- scikit-learn
- madplot-libで描画してる


# 機械学習
各種紹介にとどまる
sympyで「Python - 数値積分 台形法 & シンプソン法」を参考にした

(参考)Python - 数値積分 台形法 & シンプソン法
http://qiita.com/popondeli/items/fbc602b80223227f3d0e

```python
from sympy import *
var("x a b")
f=x**5
print(integrate(f))
print(integrate(f, (x, a, b)))
a=0
b=2
print(integrate(f, (x, a, b)))
print(float(integrate(x**5, (xx**6/6

# x**6/6
# -a**6/6 + b**6/6
# 32/3
# 10.666666666666666
```

(参考)Wolfram|Alpha: Computational Knowledge Engine＞int(x^5)
http://www.wolframalpha.com/input/?i=int(x%5E5)
x^6/6
(参考)Wolfram|Alpha: Computational Knowledge Engine＞Integrate[x^5, {x, 0, 2}]
http://www.wolframalpha.com/input/?i=Integrate%5Bx%5E5,+%7Bx,+0,+2%7D%5D
integral_0^2 x^5 dx = 32/3≈10.667
PDIでKuromojiを使って形態素解析をする

#経緯など
Pentaho Data Integartion(PDI)上で形態素解析する必要があったので調査とメモ。

PDIがJavaで実装されているため呼び出しやすいようにJavaの形態素解析器を調べたところ、Kuromojiがあったので、そちらを利用させていただくことにしました。
ただ、Javaで書いてPDIで呼ぶのも面倒だったので、結局Jython経由で利用しています。

#使用環境
PDI 7.1
Java Version 8 Update 131
Kuromoji 0.7.7
Jython 2.7.0

#設定手順
PDIは[こちら](http://community.pentaho.com/)からダウンロードしてきたZIPファイルを適当な場所に解凍しておくだけでよい
※解凍すると"data-integration"というディレクトリができるがこの辺りは割愛
※あとJavaが必要なので事前にインストールしておく


Kuromojiを[GitHub](https://github.com/atilika/kuromoji/downloads)からZIPファイルをダウンロードして解凍し、以下に置く。

```
$ pwd
~/data-integration/lib
$ ls kuromoji-0.7.7.jar
kuromoji-0.7.7.jar
$
```

Jythonを[こちら](http://www.jython.org/downloads.html)からStandaloneJarをダウンロードして、以下に置く。

```
$ pwd
~/data-integration/lib
$ ls jython-standalone-2.7.0.jar
jython-standalone-2.7.0.jar
$
```

#実行
PDIを起動。

```
$ pwd
~/data-integration
$ ./spoon.sh
```

起動したら、以下のように設定する。詳細はイメージの下に記載。
<img width="1272" alt="pdi_kuromoji_ktr.png" src="https://qiita-image-store.s3.amazonaws.com/0/186651/8b7168f5-6fe9-8b21-3be4-1745ef5a5eca.png">

「Data Grid」ステップは、適当な文章をいくつか設定しておく。今回は以下のようにした。
・テストします。
・Jythonで形態素解析します。
・Kuromojiを使っています。

「Script」ステップは、以下のように設定。また、ステップ名を「〜.python」としておく必要があるので注意する。

```
from org.atilika.kuromoji import Tokenizer
builder = Tokenizer.builder();

normal = builder.build();
TokensNormal = normal.tokenize(txtdata);

rslist = []
for token in TokensNormal:
  rslist.extend([token.getSurfaceForm() + "," + token.getPartOfSpeech() + "|"])

rs = ''.join(rslist)
```

「Script」ステップの下部の"Fields"には、最終的に返却したいフィールドを設定する。ここでは、"rs"。
<BR>
ここまで設定したら、「Script」ステップ上でプレビュー実行を行うと、以下のようになります。
<img width="945" alt="pdi_kuromoji_ktr_result.png" src="https://qiita-image-store.s3.amazonaws.com/0/186651/08daeaec-3d3f-43d1-cc70-604458d87cb0.png">

複数の文字列を連続して処理しているので、１つの文字列を形態素解析した結果は、"|"でつないでます。
形態素解析とPDIでの処理を別々でやっていて、煩わしさを感じている場合などに使えるのではないかと思います。

#参考
http://d.hatena.ne.jp/knaka20blue/20151224/1450943656
https://www.atilika.com/ja/products/kuromoji.html
systemdsucks とは何者か

最近 [@systemdsuck](https://twitter.com/systemdsucks) というアカウントにいいねされたのでちょっとだけ調べてみた。

https://github.com/systemdsucks/systemd-free-license

> At best we're on track for a new xorg-like mess. Helping sysadmins vent since 2016. Save the Linux world: 

どうやらSystemdの中央集権的な設計やライセンス？が嫌いで、徹底的に攻撃する団体のようだ。

![image](https://qiita-image-store.s3.amazonaws.com/0/103885/4e9c80fa-184a-dc2e-d407-410941ded2af.png)

ツイートを見ていると、とにかくsystemdが嫌いというのが伝わってくる。

![image](https://qiita-image-store.s3.amazonaws.com/0/103885/61697bfa-1191-e668-7961-7f3e12774e79.png)

![image](https://qiita-image-store.s3.amazonaws.com/0/103885/e611e8a2-9e7e-766e-3465-5ad3b3f2c651.png)

Redditでもこんな調子だ。

![image](https://qiita-image-store.s3.amazonaws.com/0/103885/da2371ab-9ca1-28fb-da9d-85786c9df452.png)


なんだかよく分からない。
Sublime TextでDefault設定を編集する方法

普段、コーディングに使用しているSublime Text。
Sublime Textで日本語検索とtabで漢字変換が出来ず、
Defaultの設定編集に手間取ったので仕様と変更方法をまとめておきます。

設定のあれこれは、
Sublime Text > Preferences > Key Bindingsで変更出来ます。

![名称未設定-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/139029/0f1ec4d8-053d-6846-a0e4-31d64c50f8ee.jpeg)


・Default (OSX).sublime-keymap - Default
デフォルトの設定
・Default (OSX).sublime-keymap - User
ユーザーが定義する設定

設定を追加する場合はUserの方を変更すればOKですが、
Defaultの方は初期変更が出来ないようになっています。

今回、日本語検索とtabで漢字変換する設定にするには、
Defaultの設定をコメントアウトしなければいけなかったので、
編集出来るようにしなければいけませんでした。

#Default (OSX).sublime-keymap - Defaultを編集する方法

まずはSublime Text > Preferences > Key Bindingsで、
Default (OSX).sublime-keymap - Defaultを開きます。

そのまま上書き保存。

以上！

一度ファイルを閉じてから、
再度開けば編集が出来るようになります。

簡単すぎて「なぜ手間取ったのか？」と思いますよね。
理由はこうです。

## なぜ手間取ったのか？
今回、Defaultの中身を編集するために、
そのまま上書き保存ではなく、
データファイルごと複製して編集しようとしていたからでした。

Sublime Textを立ち上げ直してもうまくいかず、
手動で変更したファイルと、Preferencesから開いたファイルの内容が異なっていました。
詳しい原理？は分かりませんでしたが、
「そのまま上書き保存」がミソのようです。

これで、2回目からは編集が出来るようになりました！

日本語検索とtabで漢字変換する方法は、
以下のページを参考にして設定しました。
■参考
[Sublime Text 3 で使っているキーバインディングの設定](http://qiita.com/noanoa07/items/3a32ab2bc22da5ddb8be)
DensityPlotで作った複数の図に透明度を持たせて重ねたいとき

全体に透明度を持たせるなら
**BaseStyle->Opacity[0.5]**
などでOK。
値によって透明度を変化させたいときはColorFunctionのオプションで以下のようにする。例えば値が最小のとき透明で最大のとき不透明なグレースケールは
**ColorFunction ->( {Opacity[#],Blend[{White,Black},#]}& )**で作れる。
なお()は評価順序の都合のため必要。
例

```
density=DensityPlot[Tanh[x],{x,-3,3},{y,-3,3},
  ColorFunction->({Blend[{White,Black},#],Opacity[#}}&),
  FrameTicks->None,
  PlotPoints->100,
  ImageSize->300
];
wave=DensityPlot[Sin[(2 Pi x)/0.5]*Exp[-x*x-y*y],{x,-3,3},{y,-3,3},
  ColorFunction->(Blend[{Blue,White,Red},#]&),
  FrameTicks->None,
  PlotPoints->100,
  ImageSize->300
];
Overlay[
  {density,wave}
];
```

![overlaywithalpha.png](https://qiita-image-store.s3.amazonaws.com/0/178902/2e973aa5-83c5-7e59-378a-c7c4090d480e.png)
Backend変更(Initialization and setup)

# 目的
* backendをlocalからs3に変更
![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/58788/ff705864-c839-f8a1-ec9d-3ca7a07e4394.png "Untitled.png")

# 設定
* `main.tf`にBackendConfigurationを記述する

```main.tf
// config
provider "aws" {
  region  = "ap-northeast-1"
  profile = "terraform-user"
}
terraform {
  backend "s3"  {
    bucket  = "<bucket-name>"
    key     = "<bucket-name>/<prefix>/terraform.tfstate"
    region  = "ap-northeast-1"
    profile = "terraform-user"
  }
}
```

* 指定したバックエンドを使用するように設定

```terraform_remote_state.tf
# !!!!!!上書き注意!!!!!!
data "terraform_remote_state" "<example>" {
  backend = "s3"
  config  {
    bucket  = "<bucket-name>"
    key     = "<bucket-name>/<prefix>/terraform.tfstate"
    region  = "ap-northeast-1"
    profile = "terraform-user"
  }
}
```

# 初期化&セットアップ
* `terraform init`でバックエンド設定の変更を自動検出し、既存の状態を移行されます。

* 「初期化せよ」とアナウンスがあります

```bash
$ terraform plan
Backend reinitialization required. Please run "terraform init".
Reason: Initial configuration of the requested backend "s3"

The "backend" is the interface that Terraform uses to store state,
perform operations, etc. If this message is showing up, it means that the
Terraform configuration you're using is using a custom configuration for
the Terraform backend.

Changes to backend configurations require reinitialization. This allows
Terraform to setup the new configuration, copy existing state, etc. This is
only done during "terraform init". Please run that command now then try again.

If the change reason above is incorrect, please verify your configuration
hasn't changed and try again. At this point, no changes to your existing
configuration or state have been made.

Failed to load backend: Initialization required. Please see the error message above.
```
* 初期化

```bash
$ terraform init
Initializing the backend...
Do you want to copy state from "local" to "s3"?
  Pre-existing state was found in "local" while migrating to "s3". No existing
  state was found in "s3". Do you want to copy the state from "local" to
  "s3"? Enter "yes" to copy and "no" to start with an empty state.

  Enter a value: yes



Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your environment. If you forget, other
commands will detect it and remind you to do so if necessary.
```

# 構成
* カレントに`.terraform`が掘られて、`terraform.tfstate`が置かれます
	* カレントにあった`terraform.tfstate`は内容が削除されます

```bash
.
├── .terraform
│   └── terraform.tfstate
```

# 所感
* terraform remote commandsが削除され、tfファイルにBackendが設定できるようになったことは私にはとても刺さりました。
StatusCake でのメンテナンスの登録のやり方

# ０．はじめに

サイト監視で利用している StatusCake というサービスのメンテナンスの登録のやり方

# １．StatusCake へのメンテナンスの登録

1. StatusCake へログイン。
    * [StatusCake - Join Now](https://app.statuscake.com/Login/?redirect=/&nosession=true)
<br><br>
1. 左側ペインから「Maintenance」をクリック。
    * ![StatusCake_0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/61b6e195-a6cd-506f-63d7-46a0bde59a6c.jpeg)
<br><br>
1. 「Maintenance Windows」が表示されるので、以下の事項を入力し、「SCHEDULE MAINTENANCE」ボタンを押下。
    * Title … タイトルです。
        * ※任意 (リソースタイプの略、間隔、時間帯などを入れると解り易い)
    * Window Period … メンテナンス日時の設定です。
        * Start Time : 開始日時
        * End Time : 終了日時
        * Follow Daylight Saving Time : 
            * ※夏時間のことらしいです。日本では関係ないので、未チェック
    * Recurrence … 繰り返しの設定です。
        * One-Off : 臨時のメンテナンスなど
        * Recur Daily : 日時の定期メンテナンスなど
        * Recur Weekly : 週次の定期メンテナンスなど
        * Recur Biweekly : 隔週の定期メンテナンスなど
        * Recur Monthly : 月次の定期メンテナンスなど
    * Affected Tests : サイト単位の指定
    * Affected Tags : タグ単位の指定
<br><br>
    * ![StatusCake_0002.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/e215634a-f7e3-4ea9-225c-b485908a4144.jpeg)

# ９９．ハマりポイント

* 複数サイトのメンテナンスの場合は、タグを作成しておいた方が便利。サイトがたくさんあると、お目当のサイトがリストで探しづらい…。

# ＸＸ．まとめ

StatusCake は結構使えるんじゃないかと思います。
Site24x7 でのメンテナンスの登録のやり方

# ０．はじめに

サイト監視で利用している Site24x7 というサービスのメンテナンスの登録のやり方

# １．Site24x7 へのメンテナンスの登録

1. Site24x7 へログイン。
    * [Site24x7:ログイン](https://www.site24x7.com/login.html)
<br><br>
1. 左側ペインから「スケジュールメンテナンス」をクリック。
    * ![Site24x7_0001.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/c7d6edc6-bc3e-a9f4-ca4a-3e6eb42889cc.jpeg)
<br><br>
1. 「スケジュールされたメンテナンス」画面の右上の「スケジュールメンテナンス」ボタンを押下。
    * ![Site24x7_0002.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/e593785e-af77-7264-a6aa-8536df62d28f.jpeg)
<br><br>
1. 「スケジュールメンテナンス」ダイアログが表示されるので、以下の事項を入力し、「保存」ボタンを押下。
    * 表示名 : ※任意 (リソースタイプの略、間隔、時間帯などを入れると解り易い)
    * 説明 : ※任意
    * 間隔 : ※以下のいずれかを ☑︎
        * 一回 : 臨時のメンテナンスなど
        * 毎日 : 日時の定期メンテナンスなど
        * 毎週 : 週次の定期メンテナンスなど
        * Monthly : 月次の定期メンテナンスなど
    * 開始時間
    * 終了時間
    * リソースタイプの選択 : ※以下のいずれかを ☑︎
        * 監視 : サイト単位の場合に ☑︎ し、リストを選択
        * モニターグループ : モニターグループ単位の場合に ☑︎ し、リストを選択
<br><br>
    * ![Site24x7_0003.jpg](https://qiita-image-store.s3.amazonaws.com/0/161939/542ad9d4-8583-df7d-e972-a339e38a7356.jpeg)

# ９９．ハマりポイント

* 複数サイトのメンテナンスの場合は、モニターグループを作成した方が便利。サイトがたくさんあると、お目当のサイトがリストで探しづらい…。

# ＸＸ．まとめ

Site24x7 は結構使えるんじゃないかと思います。
階層が深いフォルダ内のファイル検索は EnumerateFiles メソッドが早い！

#はじめに
企業内のファイルサーバには多数のフォルダ・サブフォルダが作成されていますし、個人のパソコン内にもフォルダが複雑に作成されています。
.NET Framrwork では、サブフォルダ内のファイルも列挙してくれる [System.IO.Directory.GetFiles(path, pattern, System.IO.SearchOption.AllDirectories)](https://msdn.microsoft.com/ja-jp/library/ms143316.aspx) メソッドがありますが、こちらはすべてを列挙しつくすまでメソッドを抜けないため時間がかかりますし、一気に結果を返すので検索処理中にはメモリをそれなりに消費します。
.NET Framework 4.0 以降をアプリケーションで使用する場合、IEnumerable<string> 型で返す [System.IO.Directory.EnumerateFiles(path, pattern, System.IO.SearchOption.AllDirectories)](https://msdn.microsoft.com/ja-jp/library/dd383571.aspx) を使うことで、前述の弱点を解消できます。

#サンプルコード
指定のフォルダ内（サブフォルダを含む）から、サイズ 0 のファイルを3つ探します。

```C#
using System;
using System.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var dtStart = DateTime.Now;
            System.IO.Directory.GetFiles("\\\\fileserver\\shared", "*.*", System.IO.SearchOption.AllDirectories)
                .Where(e => (new System.IO.FileInfo(e)).Length == 0)
                .Where(e => { Console.WriteLine(e); return true; })
                .Take(3).ToArray();
            var dtEnd = DateTime.Now;
            Console.WriteLine();
            Console.WriteLine("処理時間は " + (dtEnd - dtStart).TotalSeconds.ToString() + "秒");
            Console.Read();
        }
    }
}
```

##結果の例
150GBバイト超ある共有フォルダを対象に、EnumerateFiles メソッドで検索させた結果...

![p1.png](https://qiita-image-store.s3.amazonaws.com/0/100206/90336b45-3580-d671-81ef-736a6eae2214.png)

GetFiles メソッドを使用した場合...

![pp.png](https://qiita-image-store.s3.amazonaws.com/0/100206/77780d0d-7690-b244-97bb-32005aec3ed4.png)
JSONデータの書式設定方法

これらのツールはJSONでの作業に役立ちます。

1. https://codebeautify.org/jsonviewer for JSON View
2. https://jsonformatter.org for JSON Formatting
3. https://jsonformatter.org/json-editor for JSON Editing
4. https://codebeautify.org/jsonvalidator for JSON Validator.
画面を１秒後にブランクにするバッチ

<p>1秒後ブランクになります
マウス移動等で復帰します。
すぐに画面を真っ暗にしたい時に。
</p>
```bat:filename.bat
timeout 1 > nul
C:\Windows\SysWOW64\scrnsave.scr /S
```
Xamarin の Visual Studio 項目テンプレート作成上のメモ

#### はじめに
- Xamarin.Native の項目テンプレートを作成するときの設定値のメモ
    - Xamarin.Native の項目テンプレートを作成しようとしたきに、通常の C# のテンプレートで作成すると、Xamarin.Android のプロジェクトに新規項目を追加しようとしても、作成したテンプレートが Visual Studio 上で選択できなかった。
    - 調査したところ、.template ファイルで TemplateGroupID を設定することで、Visual Studio 上でテンプレートを選択できるようになった。

#### 予備知識
Visual Studio での項目テンプレートの作成方法（テンプレートの作成、配布用の VSIX プロジェクトの作成など）は、以下サイトなどを参照してください

- [カスタムのプロジェクトおよび項目テンプレートを作成します。](https://msdn.microsoft.com/ja-jp/library/ff527340.aspx)

#### 方法
項目テンプレートの .template ファイルで、TemplateGroupID を設定します
以下に Android、iOS の設定を記載します

|プラットフォーム|設定値|
|:---|:---|
|Android|MonoAndroid|
|iOS|Xamarin.iOS|

以下に、Android 用の項目テンプレートの .template ファイルの例を示します。

```
<?xml version="1.0" encoding="utf-8"?>
<VSTemplate Version="3.0.0" Type="Item" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" xmlns:sdk="http://schemas.microsoft.com/developer/vstemplate-sdkextension/2010">
  <TemplateData>
    <Name>XamarinItemTemplateSample.Android</Name>
    <Description>XamarinItemTemplateSample.Android</Description>
    <Icon>XamarinItemTemplateSample.Android.ico</Icon>
    <TemplateID>59ba9664-372a-42d9-82a1-e8a49580f757</TemplateID>
    <ProjectType>CSharp</ProjectType>
    <TemplateGroupID>MonoAndroid</TemplateGroupID>
    <NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>
    <DefaultName>Class.cs</DefaultName>
  </TemplateData>
  <TemplateContent>
    <References>
      <Reference>
        <Assembly>Mono.Android</Assembly>
      </Reference>
    </References>
    <ProjectItem SubType="Code" TargetFileName="$fileinputname$.cs" ReplaceParameters="true">Class.cs</ProjectItem>
  </TemplateContent>
</VSTemplate>
```
#### 確認
シンプルな VSIX プロジェクトを作成して、Android, iOS 用のテンプレートを作成し、動作確認した結果は以下の通り。

![Install-gapps](https://gist.githubusercontent.com/tafuji/94bbfc1f4c81add5373b02312c41b814/raw/8687924860d27b7e3b554544f73cf6522f5702e3/01-AddItemTemplate.gif)
実例によるkotlinx.coroutinesガイド（日本語訳）

kotlinx.coroutines v1.4.0 のドキュメント「Guide to kotlinx.coroutines by example 」を翻訳しました。

この文書は[GitHub](https://github.com/pljp/kotlinx.coroutines/blob/japanese_translation/docs/coroutines-guide.md)で管理しています。
元の文書が複数のファイルに分割されてしまったので、こちらには掲載しませんのでGitHubの方でご覧ください。
IAM Note


# To download RDS logs
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds:DescribeDBLogFiles",
                "rds:DownloadDBLogFilePortion",
                "rds:DownloadCompleteDBLogFile"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```
yarn と local modulesでテスト関連の依存を一つにまとめる


テスト実行しようとすると devDependency がカオスになりがちで、どれがどれ関係の依存だったのかよくわからなくなりがちです。

なるべく同種の依存は一つのカテゴリでまとめてしまいたいので、ローカルモジュールを利用して一つにまとめてしまおうと思います。

今回は karma の導入で必要なモジュール群をひとまとめに。

````
$ mkdir -p local_modules/karma-test
$ cd local_modules/karma-test
$ npm init
$ yarn add karma karma-mocha karma-phantomjs-launcher karma-webpack mocha power-assert 
````

devDepencency に追加すると、メインのプロジェクトから参照した際にモジュールが読み込まれなくなるので注意。

続いてメインのプロジェクトにて

````
$ yarn add file:./local_modules/karma-test --dev
````

npm の場合、`npm i local_modules/karma-test`で行けるそうですが、 yarnの場合 `file:` の記述が必要になります。

うまく行けば `yarn.lock` `node_modules` の中に テスト関連のライブラリの姿を確認することが出来ます。

参考

http://efcl.info/2014/10/04/npm2-local-module/

https://stackoverflow.com/questions/40102686/how-to-install-package-with-local-path-by-yarn-it-couldnt-find-package
node.js+botkit+yukkuroidでslackのメッセージをゆっくり読み上げさせてみた

最近ゆっくり動画にハマっているので、自分でも何かをしゃべらせてみたいと思ったのでやってみました。
よくslackを利用しているので、読み上げさせてみようかな

ゆっくりしていってね

##　環境
MacBook Pro OS X El Capitan 10.11.6
yukkuroid 0.6 ( http://www.yukkuroid.com/ )

## 参考サイト
http://dev.classmethod.jp/etc/yukkuri/

## ゆっくり作る

yukkuroid.dmgをダウンロードして、インストールし起動しておく。

nvmインストール

```
brew install nvm
```

yukkuroidとnode.jsのやりとりにNodObjCを使っているので、nodeのバージョンは0.x系が必要
ここではv0.12.18を使用している

```
nvm install v0.12.18
nvm use v0.12.18
```

ゆっくりのディレクトリを作る

```
mkdir yukkuri
cd yukkuri
npm init
```

NodObjCインストール

```
git clone git@github.com:TooTallNate/NodObjC.git
npm install ./NodObjC --save
git clone git@github.com:node-ffi/node-ffi.git
npm install ../src/node-ffi --save
```

botkitインストール

```
npm install botkit
```

yukkuri.jsを置く（参考サイトさんから頂きました）

```
var $ = require('NodObjC');
$.import('Foundation');
$.import('Cocoa');

var processName,
  host,
  proxy,
  pool;

/**
 * 初期化処理.
 * ここで自動解放プールの作成と必要なNSStringの作成.
 */
exports.init = function() {
  pool = $.NSAutoreleasePool('alloc')('init');
  processName = $.NSString('stringWithUTF8String', 'com.yukkuroid.rpc');
  host = $.NSString('stringWithUTF8String', '');
  proxy  = $.NSConnection('rootProxyForConnectionWithRegisteredName',processName,'host',host);
};

/**
 * 終了処理.リソースを解放する.
 */
exports.release = function() {
  pool('drain');
};

/**
 * NSConnectionを取得する.
 */
exports.getProxy = function() {
  return proxy;
};

/**
 * 通常テキスト欄に値をセット.
 */
exports.setKanjiText = function(jsStr) {
  var objCStr = $.NSString('stringWithUTF8String', jsStr);
  proxy('setKanjiText',objCStr);
};

exports.getKanjiText = function() {
  return proxy('getKanjiText');
};

/**
 * 音声を再生する.
 */
exports.play = function() {
  proxy('pushPlayButton',0);
};
```

app.jsを置く

```
//app.js
var yukkuri = require('./yukkuri');
const Botkit = require('botkit');
var word;

if (!process.env.token) {
  console.log('Error: Specify token in environment');
  process.exit(1);
}

const controller = Botkit.slackbot({
    debug: false
});

controller.spawn({
    token: process.env.token
}).startRTM(function(err){
    if (err) {
        throw new Error(err);
    }
});

controller.hears(['(.*)'], 'ambient,message_received', function (bot, message) {
    //初期化
    yukkuri.init();

    yukkuri.setKanjiText(message.match[1]);
    var text = yukkuri.getKanjiText();
    console.log("log:",text);

    //再生
    yukkuri.play();
    //後処理
    yukkuri.release();

});
```

app.jsを起動する。

```
token="xoxb-xxxxxxxxxxxxxx-xxxxxxxxxxxxxx" node ./app.js
```

## 動作
使っているtokenが参加しているチャネルで発言するとゆっくり読み上げてくれる。

## 今後やろうとしていたり、うまくできていないもの
・改行してると切れるのをなんとかエスケープさせたい（無理そうならスペースにでも置換しようかな）
・英語関連の読み上げが弱くてアルファベットを読み上げるので、mecab+発音記号変換＋カタカナ変換を試そうとしている。
・たまに変な読み方をするので、辞書と連携させてみる
・自分のslack tokenを使うと既読になってしまうのを未読のままにする
・マイ辞書的な変換ができるようにさせたい
画像を使わずに枠線（ボーダー）つきの矢印をcssで表現する


cssで矢印を表現するためのコードを紹介してるサイトは結構ありますが、
ボーダーあり矢印→のコードを紹介しているとこが少ないので、べた塗りと枠のみ両方メモしておきます。
![arrow_01.JPG](https://qiita-image-store.s3.amazonaws.com/0/170851/824d4d71-9ab7-2fa6-8c84-84312f3abdf0.jpeg)

---

矢印の三角部分が長方形の高さよりはみ出る部分はボーダーが見えて
長方形に繋がる部分はボーダーを隠す必要があるので、
擬似要素にz-index:で重ね順を持たせて、長方形が上、三角形が下になるようにします。
さらに、長方形と三角形が重なる面のborderのカラーを背景色（中の色）にして、
ボーダーの分をずらして重ねて出来上がり。

＜べた塗り矢印＞
![arrow_02.png](https://qiita-image-store.s3.amazonaws.com/0/170851/60e39896-eee3-52e7-ba7d-96253608604c.png)


＜ボーダーのみの矢印＞
![arrow_03.png](https://qiita-image-store.s3.amazonaws.com/0/170851/dc109ec8-f4ec-a847-237c-0fc995b63645.png)


---

コード例はこちら

HTML

```html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>CSS arrow</title>
    <link rel="stylesheet" type="text/css" href="arrow_sample.css">
 　 <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
  </head>
  <body>
    <div class="arrow_on"><span>矢印　べた塗り</span></div>
    <div class="arrow_off"><span>矢印　枠のみ</span></div>
  </body>
</html>
```
 
 CSS
 
```css

/* 矢印べた塗り */
.arrow_on {
    display:inline-block;
    height:25px;
    width:170px;
    background-color:#00783c;
    position:relative;
    margin: 20px 40px 0 0;
}
.arrow_on:before {
    position:absolute;
    content:"";
    width:0;
    height:0;
    border:25px solid transparent;
    border-left:25px solid #00783c;
    left:170px;
    top:-13px;
}
.arrow_on span{
    font-size: 14.4px;
    font-weight: 600;
    color: #FFF;
    display: block;
	margin: 3px 0 0 10px;
}
/* 矢印枠のみ */
.arrow_off {
    display: inline-block;
	height: 28px;
	width: 174px;
	background-color: #FFF;
	position: relative;
	margin: 20px 40px 0 0;
	-webkit-box-sizing: border-box;
	-moz-box-sizing: border-box;
	box-sizing: border-box;
	border: 2px solid #00783c;
	border-right-color: #FFF;
	z-index: auto;
}
.arrow_off:before {
    position:absolute;
    content:"";
    width:0;
    height:0;
    border:25px solid transparent;
    border-left:25px solid #00783c;
    left:170px;
    z-index: -1;
    top:-13px;
}
.arrow_off:after {
    position:absolute;
    content:"";
    width:0;
    height:0;
    border:20px solid transparent;
    border-left:20px solid #FFF;
    left:172px;
    top:-8px;
    z-index: -1;
}
.arrow_off span{
	font-size: 14.4px;
	font-weight: 600;
	color: #666;
	display: block;
	margin: 3px 0 0 10px;
}
```
レシーバの暗黙の型変換についてのメモ

Scala 2.11.7

# Example code

```scala
class A {
  def meth() = println("A.meth()")
}
object A {
  implicit def bool2A(b: Boolean): A = new A()
}
```

# コンパニオンオブジェクト
レシーバの場合、変換先のコンパニオンオブジェクトで定義した`implicit`はタダでは使えないので、`import`か型注釈を追加する必要がある。（変換元なら問題なし）

```scala
object Main extends {
  import A._
  def main(args: Array[String]) = {
    true meth // import無しではエラー
    (true: A) meth
  }
}
```
おそらくメソッドから変換先の型を推論するので、`import`したコンパニオンオブジェクトだけを対象とすることで探索が複雑にならないようにしているのだと思う。

# implicitの候補が複数ある場合
## 親子

```scala
object Main extends {
  import A._
  import B._
  def main(args: Array[String]) = {
    true meth
  }
}

class B extends A {
  override def meth() = println("B.meth()")
}

object B {
  implicit def bool2B(b: Boolean): B = new B()
}
```

`import`の順序を変えても`B.meth()`が呼ばれるので、サブクラスを優先するものと思われる。（ちなみに引数の変換の場合は、引数の型に依存）

## 兄弟

```scala
object Main extends {
  import B._
  import C._
  def main(args: Array[String]) = {
    true meth
  }
}

class B extends A {
  override def meth() = println("B.meth()")
}

object B {
  implicit def bool2B(b: Boolean): B = new B()
}

class C extends A {
  override def meth() = println("C.meth()")
}

object C {
  implicit def bool2C(b: Boolean): C = new C()
}
```
曖昧なのでコンパイルエラー。

```
ImplicitConversion.scala:5: error: type mismatch;
 found   : Boolean(true)
 required: ?{def meth: ?}
Note that implicit conversions are not applicable because they are ambiguous:
 both method bool2B in object B of type (b: Boolean)B
 and method bool2C in object C of type (b: Boolean)C
 are possible conversion functions from Boolean(true) to ?{def meth: ?}
    true meth
    ^
```
Cisco IOS/IOS-XE/NX-OSでコンフィグのDiffを取る

# きっかけ

ビルの全館停電対応で、ルータやスイッチの電源を切る前に `running-config` が保存されているか調べる必要が生じたことによります。構成管理しろという話ですね。

わざわざターミナルエミュレータでログ取ってローカルの diff にかけるのも面倒だと思って調べたら、ビルトインのコマンドで実行できることがわかりました。

# 動作確認した環境

- Cisco ISR 2900 w/ IOS 15.0
- Cisco ASR 1000 w/ IOS-XE 03.15 (IOS 15.5(2)S)
- Cisco Nexus 7000 w/ NX-OS 6.2

多分 IOS 12.x 世代でも動きます。

# 実際
## IOS/IOS-XE

基本形はこちら。

```shell-session
# show archive config differences <ORIGINAL> <MODIFIED>
```

今回は `startup-config` と `running-config` を比較するのでこうします。この例では `no ip domain lookup` が追加されたことがわかります。

```shell-session
# show archive config differences nvram:startup-config system:running-config
!Contextual Config Diffs:
+no ip domain lookup
```

比較元・比較先には IOS/IOS-XE がファイルシステムとして認識できるものが設定できます。

```shell-session
# show archive config differences ?
  archive:  [file1 path]
  cns:      [file1 path]
  flash0:   [file1 path]
  flash1:   [file1 path]
  flash:    [file1 path]
  ftp:      [file1 path]
  http:     [file1 path]
  https:    [file1 path]
  null:     [file1 path]
  nvram:    [file1 path]
  rcp:      [file1 path]
  scp:      [file1 path]
  system:   [file1 path]
  tar:      [file1 path]
  tftp:     [file1 path]
  tmpsys:   [file1 path]
  xmodem:   [file1 path]
  ymodem:   [file1 path]
  |         Output modifiers
  <cr>
```

## NX-OS

NX-OS ではもっと簡単です。

```shell-session
# show running-config diff
```
Cognos レポートPDF出力のパフォーマンスチューニングパラメーターの検証結果

##概要
レポートをPDF出力する時に、Report ServiceやBatch Report Serviceのパラメーターで、PDFの出力のフォントや圧縮を調整できるCognos Administrationのパラメーターがあります。
以下の画面の4つのパラメーターですが、これを調整した時の出力PDFファイルサイズや、実行時間に関する検証をやってみましたので投稿します。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/14cc97b3-e7e9-fe06-4ebf-217516d7c951.png)

各パラメーターの説明は、マニュアルのこちらをご参照下さい。
**PDF ファイルの設定**
https://www.ibm.com/support/knowledgecenter/ja/SSEP7J_10.2.2/com.ibm.swg.ba.cognos.ug_cra.10.2.2.doc/c_pdffilesettings.html#PDFFileSettings

##結果1.リストレポート
文字ばかりのレポートで検証してみたかったので、リストに以下のようなGO Warehouseのサンプルデータアイテムを配置して、検証実施してみました。
容量的には、PDFで4128ページの出力です。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/cfe7e314-26f6-745c-5ee1-3d0e3ca24ad7.png)

**結果まとめ**
「生成したPDFドキュメントへのReportサービスによるフォントの埋め込みを許可するオプション」は、今回は除外しました。
![006.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/86f20f9f-9c4e-c1cb-7a2f-23d16a4dc87c.png)

**Report サービス用の PDF 文字エンコード方式**
「フォント」を指定したところ、マニュアルの記載では「自動」の方が遅いという話でしたが、「フォント」の方が時間を要しました。
「Windows1252」の設定は、以下のように日本語が全て文字化けしてPDF出力されました。
![004.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/ae7bc592-65de-2e8f-6434-de1e9f5e7bcc.png)

**Report サービスで作成する PDF 文書の PDF 圧縮タイプ**
圧縮タイプの変更による、実際のファイルサイズの削減は微量で、多くても1%程度でした。
マニュアルでは、圧縮率が高い方がパフォーマンスは悪いという記載でしたが、実際にはデフォルトの「クラシック」が最も遅く、なんらか圧縮率を高めたタイプはより高速な結果になりました。
とはいえ、劇的に早くなったわけではないので、1秒を争うSLAの環境じゃないと、あまりうれしくないレベルです。

**Report サービスで作成する PDF 文書のコンテンツ圧縮レベル**
デフォルトが「9」で最大なので、設定変更は値を低くするだけなので、思い切って最小の「0」に設定してみました。
結果は、ご参照の通りで、PDFファイル容量は膨大な増加を示し、パフォーマンスもやや悪くなりました。

##結果2.横棒グラフレポート
今度は何でも良いのでグラフのテストをしてみたいと思い、PDF複数ページにまたがる横棒グラフを検証してみました。
![005.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/5e83fb0e-0f02-8de7-4a66-1b9c55d0b825.png)

**結果まとめ**
![007.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/0b69959f-87f7-d5d2-7435-dc48cdf7556b.png)

**Report サービス用の PDF 文字エンコード方式**
「自動」が一番遅い、マニュアル通りの結果になりました。
「Windows1252」は、やはり文字化けしました。
![008.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/aa7697eb-2847-1708-03dd-aeb1600a2b12.png)

**Report サービスで作成する PDF 文書の PDF 圧縮タイプ**
「最大」が特に顕著な改善を示しました。
PDFファイルサイズも大きく減り、実行速度も最速でした。

**Report サービスで作成する PDF 文書のコンテンツ圧縮レベル**
リスト同様、デフォルトの「9」から変更するメリットは見受けられませんでした。

##まとめ
**「Report サービス用の PDF 文字エンコード方式」**は、日本語の環境で使用する限りは、「Windows1252」を選択する事は無さそうで、デフォルトの「自動」から変更するメリットは特に感じられませんでした。
**「Report サービスで作成する PDF 文書の PDF 圧縮タイプ」**は、マニュアルの記載と違い、圧縮率が高まっても、処理速度はむしろ速くなるので、「最大」を試してみる価値はありそうです。
**「Report サービスで作成する PDF 文書のコンテンツ圧縮レベル」**は、デフォルトの「9」のままで、触らなくて良いかと思います。
イカれたバックアップシステムを紹介するぜ！

オンプレにあるバックアップデータをAWSに持っていくための基盤を用意する話

## AWS側の基盤作り
AWSにデータをバックアップするための基盤が必要
色々やってみた結果、EC2インスタンスは必須で

- LVMのSnapshotをデータソースにし気合でrsyncでバックアップする！！！
- インスタンスは使い終わったら破棄したい
- できるだけ運用コストがかからない構成を考える 

SAの方に相談したところStep Functionsが使えるとのことで、
State Machineを定義しLambda Functionを7個くらい書く

- sc1 volumeでコストを抑える

夜間しか使わないので、これで間に合えばOK

## SFNと連携するActivityアプリケーションの開発
State Machineに対してget activity task APIでポーリングし、
トークンと前段のLambdaからインスタンス情報を受け取りバックアップを実行するシンプルなもの。

- Rubyで実装しました
- 長時間ポーリングするとタイムアウトしてしまう

必要な場合は、Net::ReadTimeout, Seahorse::Client::NetworkingErrorをrescueしてretryすることで
長時間ポーリングしていられる

## バックアップ方法の変更と移行
- Activityアプリケーションはchefで配布し、cronもセットできる

Activity名をホスト名などの固有値にしておくと明示的に書かなくて良いので楽

- rsyncの場合、初回同期に膨大な時間がかかる

まずは適当なインスタンスを用意し、バックアップサーバーからインスタンスへある程度同期させておく

## スライド
[![IMAGE](https://image.slidesharecdn.com/backup-stepfunctions-170612063838/95/aws-step-functions-1-638.jpg?cb=1497251169)](https://www.slideshare.net/slideshow/embed_code/76855563)