OmniAICreator/Qiita-1.07M huggingface dataset:
onnx-go で tiny-yolov2 が動く様になった

# はじめに

1ヶ月程前に「[Go による機械学習 推論フレームワークの最新動向 2019](https://qiita.com/mattn/items/b01f9bb5c2fa3678734a)」という記事を書きました。onnx-go はバックエンドとして gorgonia を使う Pure Go なニューラルネットワークのライブラリなのですが、前回紹介させて頂いた時にはまだ mnist 程度の簡単なモデルしか動作しませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665/7b7731f5-ea9b-d73e-7c9e-14594888f5c8.png)

# tiny_yolov2 が動いた

昨日マージされた変更により、tiny-yolov2 が動く様になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665/d94a5a2d-818a-d4f2-7397-77f7157a45ce.png)

examples/tiny_yolov2 ディレクトリに移動し `go build` すると `tiny_yolov2` が出来上がります。モデルファイルは以下からダウンロードして下さい。

https://github.com/onnx/models/tree/master/tiny_yolov2

```
$ ./tiny_yolov2 -img file.jpg -output output.jpg
```

この様に実行するとマーカーが描画された画像が出力されます。

![output.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665/d48f92bf-b27e-4c0f-9cfa-85be6f9af9d8.jpeg)

リアルタイムに推論はまだ遅くて使えないと思いますが、アップロードされた画像から物体を検出して何か処理を行う程度には使える様になりました。

# 今後の onnx-go

これまで Go で学習済みモデルを使えるニューラルネットワークと言えば TensorFlow の Go binding、TensorFlow Lite の Go binding (go-tflite)、PFN 社の menoh を使うしかなく、またいずれも cgo の為、ビルドのハードルが高いのが問題でした。ですが、onnx-go が Pure Go で実現した事により `go get` で機械学習ライブラリが手に入れられる様になりました。また Pure Go なのでクロスプラットフォームでビルドできる様になりました。とても良い話です。

とは言え、全てのオペレータが揃ったという事ではありません。まだ足りないオペレータもあります。皆さんからのコントリビュートをお待ちしています。
(僕も onnx-go の push 権限を頂いたので、もっとコントリビュートしようと思います。)
AutoHotKeyで日本語配列(106/109)→英語配列(101/102)

# 概要

手持ちのノートPCが日本語キーボード配列(106/109)だったのですが、
英語配列(101/102)の外付けキーボードを併用したかったので、AutoHotKeyで英語配列化しました。

# 前提
使用キーボードは次の通り。

|キーボード種別|使用機器|
|:----|:----|
|日本語|Dell Latitude 7490の日本語配列|
|英語|HHKB Professional BTの英語配列|

# 設定

①下記リンクからAUtoHotKeyをダウンロード＆インストール
AutoHotkey公式
https://www.autohotkey.com/

②AutoHotKey.ahkを下記内容にて作成し、AutoHotKeyのインストール先フォルダに配置。
デフォルト→`C:\Program Files\AutoHotkey`

AutoHotKey.ahk

~~~md
#UseHook

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; 1段目
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 VKF4::Send,{``}    ;         半角/全角     -> `
 +VKF4::Send,{~}    ; Shift + 半角/全角     -> ~
 +2::Send,{@}       ; Shift + 2         ["] -> @
 +6::Send,{^}       ; Shift + 6         [&] -> ^
 +7::Send,{&}       ; Shift + 7         ['] -> &
 +8::Send,{*}       ; Shift + 8         [(] -> *
 +9::Send,{(}       ; Shift + 9         [)] -> (
 +0::Send,{)}       ; Shift + 0         [ ] -> )
 +-::Send,{_}       ; Shift + -         [=] -> _
 ^::Send,{=}        ;                   [^] -> =
 +^::Send,{+}       ; Shift + ^         [~] -> +

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; 2段目
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 @::[              ;                   [@] -> [
 +@::{             ; Shift + @         [`] -> {
 [::]              ;                   [[] -> ]
 +[::Send,{}}      ; Shift + [         [{] -> }

 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ; 3段目
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 +;::Send,{:}      ; Shift + ;         [+] -> :
 :::Send,{'}       ;                   [:] -> '
 *::Send,{"}       ; Shift + :         [*] -> "
 +]::|             ; Shift + ]         [}] -> |
 ]::\              ;                   []] -> \

~~~

# 参考

下記ページを参考にしました。ありがとうございます。

- [AutoHotKey Downloads](https://autohotkey.com/download/) 
- [AutohotkeyでJIS配列をUS配列化して使ってる](https://gnarl.hatenadiary.org/entry/20090429/1240996300)
HTML初心者の自分のための備忘録

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427131/a7b5dc31-0c32-8a09-ac68-b8def83dcce9.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427131/3b200f33-2d10-bcfd-fc14-3efbfb30cc13.png)
AWSボリュームの暗号化の必要性について

# AWSボリュームに暗号化は必要なのか？
当初、実際にAWSのデータセンターの実サーバーに物理的に侵入された場合や、AWSの管理システムへのハッキングした時くらいにデータを守れるという認識だったのでそれが正しいのかどうかAWSサポートに問い合わせをしてみた.

# AWSサポート問い合わせ結果(原文は載せれないので要約)

#### 1. お客様のセキュリティあるいはコンプライアンス要件を満たせるようにご用意している機能
多くのユーザーはこのコンプライアンス基準へ準拠のためだけに、ストレージ暗号化の機能を利用しているのが現実らしい

#### 2. AWSのデータセンターに対して物理的な侵害が発生した場合に、保護する事が可能になる
これは想定していた当然のメリットである.

#### 3. EBS と EC2 インスタンスとはネットワークを経由で通信するが、暗号化ボリュームを使用している場合この通信経路上も暗号化される
これは少しびっくりしたが、よく考えてみたら当然でEC2とEBSはネットワーク経由で通信しており、暗号化していない場合はそのネットワーク間は覗けてしまう状態らしい(誰かがここを傍受できる環境にはなっていないと思われるが)

#### 4 KMSに対するキーポリシーで制御することでセキュリティへの多層防御を実現するための一つの層として機能する
通常はIAM などでのアクセスコントロールを行うがそれに加え、暗号化した場合KMSに対するキーポリシーで制御することで多重防御セキュリティとなる
e.g)
機密レベルに応じて KMS の CMK を使い分けることで、その鍵へのアクセスを制御するキーポリシーで一括してアクセス可能な先をコントロールするという方法などがある

さらに、KMS には API のコールログを記録する機能あるので、証跡として残すことが可能になる

#ストレージデバイスが製品寿命に達した際の廃棄プロセスについても聞いてみた
AWS の処理手順には、ストレージデバイスが製品寿命に達した場合に、顧客データが権限のない人々に流出しないようにする廃棄プロセスが組み込まれており、AWS は、DoD 5220.22-M（「National Industrial Security Program Operating Manual（国立産業セキュリティプログラム作業マニュアル）」）または NIST 800-88（「Guidelines for Media Sanitization（メディア衛生のためのガイドライン）」）に詳細が記載されている技術を用いて、廃棄プロセスの一環としてデータを破棄される.廃棄された磁気ストレージデバイスはすべて業界標準の方法に従って消磁され、物理的に破壊しているとのこと

参考資料: 
https://d0.awsstatic.com/International/ja_JP/Whitepapers/AWS%20Security%20Whitepaper.pdf 

https://docs.aws.amazon.com/ja_jp/kms/latest/developerguide/control-access-overview.html#managing-access 

# 総評
AWSやGCP、Azureなどの大手クラウドサーバーを利用する場合、既にほぼ守られており、そこを突破した攻撃が来た場合、どちらにしろ防ぎようがないと思っているので、ボリュームの暗号化の必要性をあまり感じていなかったが、今回の問い合わせによって、不明確だった部分の知識を得た.
多重防御し、いつどのようにくるかわからない攻撃に耐えられる確率を少しでも上げることが大事.

# 余談
このあたりの話はTwitterで意見を募ったがあまり的確な回答がなかったので、あまり世の中に周知されていない部分なのかもしれないと思い初めて記事を書いてみました.

意見あればコメント下さい.
エクセルでJAVAアプリを超簡単生成！「ワンダーロボ」エクスポート、インポートの設定方法

###ステップ1.　エクスポート設定
###ステップ2.　インポート設定

---
###ステップ1.エクスポート設定
最初に、エクスポート設定の説明をします。例として、「画面設計_集計・帳票管理」の「請求書一覧CSV出力」で説明します。

####1-1.画面設計書に記載
まずは、画面設計でエクスポートボタンを設定します。セルの外枠罫線を7,8,9,10任意的に設定します。そして、shapeで「エクスポート」を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/ecb29212-db4c-451c-801b-7018cc35fe7d.png)


・エクスポート元テーブル：エクスポート関連テーブル
・対象フィールド：エクスポートテーブルの対象項目。（関連テーブルの全項目を対象にしたい場合は、対象フィールを「*」に設定します。）指定する場合は、記述が必須です。
・エンコード：「UTF-8」、日本語(MS932)、日本語(シフトJIS)、日本語(EUC)が指定可能です。
・形式：出力形式。「固定長」「EXCEL」「CSV」の3形式。

※エクスポート元テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/94334aef-496d-2100-8ada-da46a154aee6.png)



####1-2.設計書ファイルをインポートして確認
SaaSForceの開発環境にログインし、設計書ファイルをインポートします。そして、利用画面で反映されているか確認して完了です。
###ワンダーロボの取り込み先はこちら↓
 手順は　**SaaSForceシステム**===>**「システム」**===> **「開発設定」**===> **「システム自動構築」**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/b5df5670-4b37-4fee-e91c-ba295891244c.png)
**ユーザー利用画面表示例↓**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/5336dd14-067e-4638-e63e-c994585a3b41.png)
**「請求書一覧CSV出力」ボタンをクリックすると、実際に出力されたCSVファイル↓**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/2424d3b9-7af9-8385-1e99-85b4918b5dcd.png)

---
###ステップ2.インポート設定
次に、インポート設定の説明をします。例として、「会社」の「会社インポート」で説明します。インポートもエクスポートと同様に、画面設計書で記載します。

####2-1.画面設計書で記載
まずは、画面レイアウト設計でインポートボタンを設定します。セルの外枠罫線を7,8,9,10任意的に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/a445a1f4-311f-c7bb-2f39-1a4425a433c8.png)
**画面詳細設計に設定**
・インポート元テーブル：インポート関連テーブル
・対象フィールド：テーブルのフィールド順に従ってインポートファイルのデータ順を設定します。
・エンコード：「UTF-8」、日本語(MS932)、日本語(シフトJIS)、日本語(EUC)が指定可能です。
・形式：固定長、CSV、PDF、Excel、ファイルインポートが指定可能です。


<img width="1128" alt="72.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/f9ed55cf-83f6-d2bd-8ef0-442e299a911f.png">

※インポート元テーブル
<img width="1128" alt="73.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/f32b99ac-2e2a-1728-00ee-be880e884d36.png">

####2-2.設計書ファイルをインポートして確認
SaaSForceの開発環境にログインし、設計書ファイルをインポートします。そして、利用画面で反映されているか確認します。
・「会社インポート」ボタンを押し、CSVファイルを選択しアップロードします。
・zipファイルがアップロードされると、zipファイルは自動的に解凍され、抽出されたファイルは指定されたインポート定義に従ってインポートされます。
<img width="1128" alt="76.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/5864bee2-522e-407d-244d-13c0c1204e97.png">
※例)会社CSVファイル
<img width="1128" alt="79.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/f9263ab9-efb9-5934-cdad-2bebcc7621e7.png">
#####データとフィールドをマッピングして、「インポート」ボタンをクリックします。
一括マッピング：全ての情報をマッピング
個別マッピング：任意の項目を個別でマッピング
マッピング解除：任意の項目のマッピングを解除
一括解除：全てのマッピングを解除
<img width="1128" alt="77.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/04edeca9-0319-d66f-c878-4a9a4e7bc83c.png">


そして、正常にインポートされたのを確認したら完了です。
**ユーザー利用画面表示例↓** 
<img width="1128" alt="78.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/19a975a1-ba8b-9a7c-48a5-45012b3e07d0.png">
RegularExpressionで正規表現の否定を使いたかった話

結果だけ言うとできない。
なのでカスタム属性を作るなりめんどくさい正規表現を組むなりの手法を使う必要がある。

カスタム属性を作ってクライアントサイドのjs構築まで手を出そうとするには時間コストが取れなかったので
今回はめんどくさい正規表現で逃れることにした。
この際、RegularExpressionAttributeの仕様でちょっと躓いたのでこの記事を書くことに。

System.ComponentModel.DataAnnotations.RegularExpressionAttributeは
patternパラメータに設定した正規表現にマッチしない場合、
ErrorMessageに設定したメッセージをエラーとして設定してくれる属性となっている。

# 要件
数字のみ6桁以上の文字列はNGとして弾く

# 最初に書いた正規表現
`^.{1,5}$|\D`
1. 5桁まではなんでもOK
2. 数字以外が現れた場合はOK

としたかったが、結果NG。
これは何故かというとRegularExpressionAttributeのIsValidメソッドの判定以下のようになっているため。

``` RegularExpressionAttribute.csより一部抜粋
Match m = this.Regex.Match(stringValue);
return (m.Success && m.Index == 0 && m.Length == stringValue.Length);
```

つまり全文マッチしていないと許されないらしい。

# なので全パターン書く
`(^.{1,5}$|^[\D]+[\d]*.*$|^[\d]*[\D]+.*$)`

1. 5桁まではなんでもOK
2. 数字が現れる前に数字以外が存在していればOK
3. 数字が現れた後に数字以外が存在していればOK

この考え方で正しく通った。

# ソース引用元
https://github.com/microsoft/referencesource/blob/master/System.ComponentModel.DataAnnotations/DataAnnotations/RegularExpressionAttribute.cs
`nuxt-link` タグのリンクをStorybook上で確認する方法

# 背景

- Storybook上で `nuxt-link` がリンクとして認識されない
- リンク設定をStorybook上で確認できたら良いな

以上の理由より、Storybook上で Nuxt のタグ `nuxt-link` がリンクと認識されるようにStorybookの設定を調整しました。

# 環境

Nuxt: v2.8.1
@storybook/vue: v5.1.8
@storybook/addon-actions: v5.1.8

# 設定
## インストール
まず、 `@storybook/addon-actions` をインストールします。

```bash
npm i -D @storybook/addon-actions
```

## Storybook 設定
次に、`.storybook` ディレクトリにある addons.js ファイルに1行書き加えます。

```javascript
// /.storybook/addons.jsに1行追記
import '@storybook/addon-actions/register'
```

最後に、`config.js`に `import { action } from '@storybook/addon-actions` を加えて `nuxt-link` コンポーネントをVueに登録します。

```javascript
// /.storybook/config.js
import Vue from 'vue'

import { configure } from '@storybook/vue'
import { action } from '@storybook/addon-actions'

Vue.component('nuxt-link', {
  props:   ['to'],
  methods: {
    log() {
      action('link target')(this.to)
    },
  },
  template: '<a href="#" @click.prevent="log()"><slot>NuxtLink</slot></a>',
})

const req = require.context('../src/stories', true, /\.stories\.js$/);
function loadStories() {
  req.keys().forEach(filename => req(filename));
}

configure(loadStories, module);
```

以上で設定終了です。

これでStorybook上で、すべての`nuxt-link`インスタンスがアンカー要素に置き換えられ、クリック可能なリンクが表示されるようになりました。
クリックするとActionsパネルにリンク情報が出力されます。
![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419907/4a2061bc-918c-0f73-fabb-4958f45091a9.png)

# 参考したページ
[An (almost) comprehensive guide on using Storybook with Nuxt.js](https://medium.com/js-dojo/a-guide-on-using-storybook-with-nuxt-js-1e0018ec51c9)
[CSS]ブレイクポイントの決め方（レスポンシブ対応）

# ブレイクポイントとは？
レスポンシブデザインの場合、メディアクエリを使って画面サイズ別にスタイルを切り替えます。
適用させるスタイルを切替える、この境目を『ブレイクポイント』といいます。

## ブレイクポイントの決め方
決め方の正解は一つではない。サイト目的、ターゲットによって最適解を出す。

【参考記事】ブレイクポイントの決め方
https://haniwaman.com/breakpoint/
https://www.aiship.jp/knowhow/archives/3376

各デバイスの画面サイズはこちらが参考になりました。
https://www.seojuku.com/blog/responsive-mediaquery.html


## メディアクエリとは？
こちらの記事を参考にしました。
https://sole-color-blog.com/blog/71/
【学習メモ】Linuxコマンド

|コマンド       |説明　　　　　　　 |備考          |
|:--------------------------|------------------------:|:------------------:|
| cd A                      |      ディレクトリAに移動 |                |
| cd ..                     |         1つ親のディレクトリへ移動    |「cd 1つ親のディレクトリ名」としても移動することができない       |
| cd                        |              ホームディレクトリに移動 | ホームディレクトリは、「~」で表される|
| mkdir A                   |           ディレクトリAを作成 |             |
| touch A                   |                ファイルAを作成 |                  |
| cat A                     |             ファイルAの中身を表示 |              |
| pwd                        |            カレントディレクトリを表示|             |
| ls                        |            ディレクトリの中身を表示|             |
| mv A B          |           AをBに移動|             |
| cp A B          |           AをBにコピー|cp -r ディレクトリA ディレクトリB             |
| rm A          |           Aを削除|rm -r ディレクトリA             |
phoenixフレームワークのjs-yamlのバージョンをあげる

phoenixのチュートリアルやってみようと思い立ち、
とりあえずgithubにrepo作ってfirst commitしておいたんですが、
security alertが出ていた。
<img width="762" alt="スクリーンショット 2019-06-20 10.26.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12037/5d12ddcb-8f9b-393d-697b-357357a7c15d.png">
js-yamlのバージョンをあげなさい、と。
素直に従う。
assets/package.jsonの最後尾にこいつを追加するだけ。

```
"js-yaml": ">=3.13.1"
```

追加したらassets配下で

```
npm install
```
実行すると、assets/package-lock.json内のjs-yamlのバージョンが上がってるはず。
この状態でcommit&pushで、githubのsecurity alertは消えた。
@angular/fireのAuth Guardsで認証チェックをする

# 概要
@angular/fireのv5.2.0でAuth Guardsが追加されました。
これにより、自前でguardを書かなくても認証チェックが可能になりました。
ただ、v5.2.1の時点では上手く動かない問題がありました。

# 基本的な使い方
まずapp.module.tsのimportsにAngularFireAuthGuardModuleを追加します。
あとはguardを指定するだけでログイン済みかどうかチェックすることができます。
コードとしては下のようになります。

```ts
import { AngularFireAuthGuard } from '@angular/fire/auth-guard';

export const routes: Routes = [
    { path: '', component: AppComponent },
    { path: 'items', component: ItemListComponent, canActivate: [AngularFireAuthGuard] },
]
```

# カスタマイズ
デフォルトではログイン済みかチェックするだけですが、authGuardPipeを使ってカスタマイズすることもできます。
リダイレクト先の変更や、custom claimsのチェックなどが提供されています。

```ts
import { canActivate, redirectUnauthorizedTo } from '@angular/fire/auth-guard';

const redirectUnauthorizedToLogin = redirectUnauthorizedTo(['login']);

export const routes: Routes = [
    { path: '', component: AppComponent },
    { path: 'items', component: ItemListComponent, ...canActivate(redirectUnauthorizedToLogin) }
];
```

# 問題
v5.2.1の時点で認証をカスタマイズした場合、production buildでうまく動きませんでした。
canActivate関数を使わずに下のように書くとちゃんと動きました。

```ts
const redirectUnauthorizedToLogin = () => redirectUnauthorizedTo(["login"]);

const routes: Routes = [
  {
    path: "items",
    component: ItemListComponent,
    canActivate: [AngularFireAuthGuard],
    data: { authGuardPipe: redirectUnauthorizedToLogin }
  }
]
```

# 参考
https://github.com/angular/angularfire2/blob/master/docs/auth/router-guards.md
ニートの自然言語処理100本ノック:39

とりあえず頻度を順序に変換する。
そして、x座標y座標共にlogの設定をグラフ作成関数にさせた。
またgrid optionを入れた。
出力結果があってるかわからないがとりあえず上げる(日曜日にでも確認する)。
てかまず実父の法則ってなんやねん...

```python
"""
39. Zipfの法則
単語の出現頻度順位を横軸，その出現頻度を縦軸として，両対数グラフをプロットせよ．
"""

import MeCab
from pprint import pprint
import collections
from n30_execise import maping_morphology
from n31_execise import load_mecab_file
from n36_execise import extract_type_all,extract_frequent_words
from n37_execise import create_words_frequency_graph
import matplotlib.pyplot as plt
import pandas as pd


#  TODO:freq_count　出現頻度の順序化
def freq_to_order(freq_count):

    freq_count = list(freq_count)
    uniq_freq = list(set(freq_count))
    uniq_freq.sort(reverse=True)

    freq_order_list = []

    for index,_uniq in enumerate(uniq_freq):
        for _frequency in freq_count:
            if _uniq == _frequency:
                freq_order_list.append(int(index+1))
            else:
                continue
    
    return freq_order_list


if __name__ == "__main__":
    
    # ファイルパス
    mecab_file = "neko.txt.mecab"

    # neko.txt.mecabを読み込む
    mecab_text = load_mecab_file(mecab_file)

    # 形態解析後のマッピングリスト
    analyzed_list = maping_morphology(mecab_text)
    # 表層形だけを取り出したリストを作成する
    surface_list = extract_type_all(analyzed_list)
    # 出現頻度の高い値とその回数を取り出す
    freq_value,freq_count = extract_frequent_words(surface_list)
    print(freq_count)
    freq_order_list = freq_to_order(freq_count)
    print(freq_order_list)
    # グラフ作成
    create_words_frequency_graph(freq_order_list,freq_count,graph='line',title="出現頻度順序と出現頻度の両対数グラフ(Zipfの法則)",xlabel="出現頻度の順序",ylabel="出現頻度",log_log=True,_grid=True)
    # HACK:イメージとしてデータがある場所の上に値が表示されるようにしたい。
```

# 出力結果
![スクリーンショット 2019-06-20 10.10.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263492/f36df495-f717-bbde-83f1-b1ded18a7ace.png)
【PL/SQL】処理中に直接TRUNCATE TABLEを実行する(EXECUTE IMMEDIATE TRUNCATE TABLE)

#処理中に直接TRUNCATE TABLEを実行する

##やりたいこと
PL/SQLの文中で「TRUNCATE TABLE」を実行したい。

通常PL/SQLの文中で「TRUNCATE TABLE」を行おうとすると、コンパイルエラーとなってしまいます。


```sql
-- TRUNCATE
TRUNCATE TABLE {テーブル名};

警告: プロシージャが作成されましたが、コンパイル・エラーがあります。
```

そこで動的SQLを使用し、以下のように実装することで「TRUNCATE TABLE」を実現します。

```sql
-- TRUNCATE
EXECUTE IMMEDIATE 'TRUNCATE TABLE {テーブル名}';
```

##コード
注意点としては、実行後に暗黙コミットが行われるため、実施前の状態に戻せないということです。
DDLのため、件数確認やロールバックを行いたい場合には「DELETE」文を使用したほうが良さそうです。

```sql
EXECUTE IMMEDIATE 'TRUNCATE TABLE USER_MST'
```
エクセルでJAVAアプリを超簡単生成！「ワンダーロボ」印刷ボタンの設定方法

印刷ボタンの設置方法を説明します。
帳票を印刷する際に使用するもので、システムからの出力情報を紙媒媒体に表示、システムへの入力情報を表示させたりするものです。

###ステップ1.　Excel画面設計書で設定
###ステップ2.　ワンダーロボに取り込む


###ステップ1.画面設計書で設定
今回は、「注文管理検索」の「見積書台帳」を使って説明します。
まずは、画面レイアウト設計で印刷ボタンを設定します。セルの外枠罫線を7,8,9,10任意的に設定します。
<img width="1128" alt="63.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/d48edab4-ab31-9ffc-216a-dbc5f7692834.png">

####1-1.画面詳細設計に設定
「印刷」と記載し、その後に「セル」「設計書」「印刷タイプ」を設定します。
・セル：印刷ボタンを設置する場所
・設計書：帳票の名前
・印刷タイプ：EXCEL/PDF帳票を選択可
<img width="1128" alt="64.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/082f6280-f093-4905-9ecb-a443f2ad1785.png">
####1-2.帳票設計に設定
**データベース関連**：［会社.会社名］のように、データベースと関連できます。
**＠content**：“＠content”を付けると、データ循環使用サイクルになるので、絞り込むデータを同じシートに出力可能となります。
**shape**：帳票にて参照ビューがある場合、項目「検索フィールド」「結合テーブル」「結合条件」の内容記述が必須となります。印刷の出力条件、ソート順、リスト設定、グループ化も設定できます。（帳票の印刷効果を守るために、shapeを非表示にします。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/52e6846d-f3f4-9d8b-86dd-0e1c54d7b06b.png)


###ステップ2.　ワンダーロボに取り込む
###ワンダーロボの取り込み先はこちら↓
 手順は　**SaaSForceシステム**===>**「システム」**===> **「開発設定」**===> **「システム自動構築」**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/b5df5670-4b37-4fee-e91c-ba295891244c.png)
####2-1.設計書ファイルをインポートして確認
SaaSForceの開発環境にログインし、設計書ファイルをインポートします。そして、利用画面で反映されているか確認して完了です。

**ユーザー利用画面表示例↓** 
<img width="790" alt="66.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/99547ab0-2abb-bb59-5b97-0d41226768d9.png">

「見積書台帳」ボタンをクリックすると、実際に印刷された**Excel**↓
<img width="1128" alt="67.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184885/3add9dbf-ade5-7207-a424-196e4ab8b585.png">
ニートの自然言語処理100本ノック:38

ヒストグラムを作ってみたがめっちゃ醜い(見にくい)。
binも設定してないのでテストで行ったら7/100点ぐらいのコードだがとりあえず投稿

```python

"""
38. ヒストグラム
単語の出現頻度のヒストグラム（横軸に出現頻度，縦軸に出現頻度をとる単語の種類数を棒グラフで表したもの）を描け．
"""

import MeCab
from pprint import pprint
import collections
from n30_execise import maping_morphology
from n31_execise import load_mecab_file
from n36_execise import extract_type_all,extract_frequent_words
from n37_execise import create_words_frequency_graph
import matplotlib.pyplot as plt
import pandas as pd


if __name__ == "__main__":
    
    # ファイルパス
    mecab_file = "neko.txt.mecab"

    # neko.txt.mecabを読み込む
    mecab_text = load_mecab_file(mecab_file)

    # 形態解析後のマッピングリスト
    analyzed_list = maping_morphology(mecab_text)
    # 表層形だけを取り出したリストを作成する
    surface_list = extract_type_all(analyzed_list)
    # 出現頻度の高い値とその回数を取り出す
    freq_value,freq_count = extract_frequent_words(surface_list)
    # グラフ作成
    # FIXME:hist グラムが雑すぎる　とりあえずこれで一回通す
    create_words_frequency_graph(freq_value,freq_count,graph='hist',title="出現頻度の高い単語のヒストグラム",xlabel="出現頻度",ylabel="出現頻度をとる単語の種類数",y_lim=[0,9000])
    # HACK:イメージとしてデータがある場所の上に値が表示されるようにしたい。
```
Dive into sidekiq

enqueue


- Sidekiq::Worker
    - Sidekiq::Client
        - redis list push



dequeue

- Sidekiq::Launcher#run
    - Sidekiq::Launcher#heart_beat
        - WIP
    - Sidekiq::Poller#start
        - WIP
    - Sidekiq::Manager#start
        - Sidekiq::Processor#run
            - loop
                - Sidekiq::Processor#process_one
                    - Sidekiq::BasicFetch#retrieve_work
                       - redis list pop


## enqueue_at
- Sidekiq::Worker
    - Sidekiq::Client
        - redis sorted set add

## dequeue_at(= re-enqueue)
- Sidekiq::Scheduled::Poller#start
    - polling 
        - Sidekiq::Scheduled::Enq#enqueue_jobs
            - Sidekiq::Client#push
                - redis list push
Oculus Questのアプリを作りたい(2)

前回→ https://qiita.com/takeru@github/items/4ea55c8426c0e8fb0ec0


![out1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16626/f36e146f-3a4b-ebd7-a47b-55d7c94083ca.gif)


![out2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16626/270b85d8-cd54-1b6a-6687-973bab1df87e.gif)

![out3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16626/afdabb22-2297-c453-b60c-1276aeb0940d.gif)


https://www.youtube.com/watch?v=sPBWaZdezyM&t=84s

## git設定
https://qiita.com/cs1000/items/07368892a599b2b7b836

元からtext設定になっていたのでOK。
gitignoreを設定。


## Oculus Integration
AssetStoreから入れられる。
Tutorialで作ったPlayerController.csとOculus Integrationの中のファイルの名前がかぶっててインポートが失敗する。
作ったファイルをPlayerController0にリネームした。


### 中身の解説
https://qiita.com/rkgy/items/265b836d4826575b0ac2


### サンプルのシーンがいっぱいある
[Build Settings] の [Scenes In Build]にシーンをドラッグしてからBuildする。
Buildに結構時間かかる。

モノをもったり、移動したりするサンプルもある。
だいたい動くが、たまにぶっ飛んで行方不明になったりする。

https://qiita.com/nkjzm/items/58a696f66c4989e5a35c


## AvatarGrab
https://developer.oculus.com/documentation/unity/latest/concepts/unity-sf-avatargrab/

https://raspberly.hateblo.jp/entry/OculusQuestGrabberGrabbable

https://note.mu/kirin_zzzzz/n/n2887a0d98158

LocalAvatarWithGrabを使えばかんたん

https://www.youtube.com/watch?v=sPBWaZdezyM&t=84s

## todo
- 本を買う(教科書2019/ひよこ2019)
- 動的にオブジェクトを作る
- VSCode設定
- Beat Saberみたいにギラギラの色にする
- 音を出したい
- 薄い板を落とすと地面をすり抜けるぽい
- 投げるのが難しい。飛ばない。
- 重力、重さなど調整
- リセットボタン
- ものを持って移動させるとけいれん
Redmineが起動しない原因に驚愕！涙が止まらない・・・

# 概要
bitnami Redmineが動かなかった原因は~~憎き~~ウイルスバスターでした。

# 経緯
今現在社内でのプロジェクト管理は基本的にすべてExcelで行われています[^1]。
私一人でも抵抗してみようということでRedmineを触ってみることにしました。

bitnami Redmineならば設定不要ということでこちらを採用します。

# 環境
 * Windows 7[^2](!!?)
 * bitnami Redmine 4.0.4

# ダウンロード~インストールまで
[ここ](https://bitnami.com/stack/redmine/installer)からダウンロード。
インストール手順は道なりで。

これで自動で起動されるはずですが...?

# [問題発生]Redmineが起動しない！
 ブラウザが立ち上がるが`サイトにアクセスできません`とのこと。

インストール時に作成されたmanager-windows.exeを起動してみると以下のようになっています。

![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272867/7bd4c185-a394-dd7b-669e-f86e94421b1d.jpeg)
Apache Web Serverが止まってますね。Start押せばいいのん？⇒だめでした。

# 原因究明
というわけで原因を探っていきます。

## ポート番号
デフォルトで80番ポートを使用するようなので困ったときのnetstatコマンドを実行します。
ここで80番を使用しているものを探しますが、__見つかりませんでした[^3]。__

## エラーログ確認
エラーログが出ているようなので確認してみます。
```[ssl:warn] [pid 4956:tid 132] AH01909: localhost:443:0 server certificate does NOT include an ID which matches the server name```
SSLの証明書が無いよって怒られているんでしょうか。しかし今回はそれ以前の問題なので__関係なさそうです__。

## ウイルス対策ソフトの停止
そういえばこのPCにはウイルスバスターがインストールされているんでした。止めてみましょう。

![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272867/e07b8b2a-c3f4-e61b-2cbd-e6aca3ecfe76.jpeg)
やったぜ。

# 結論
~~いかがでしたか？~~
ウイルス対策ソフトを疑うことは基本とは思いますが、エラーが発生したときにきちんと対応できる知識が必要ですね。


[^1]: Qiitaユーザの皆様には呆れられると思います。
[^2]: 少し前まではメモリ4GBだったので開発どころではありませんでした。
[^3]: WindowsなのでIISかSkypeかなと思ったのですが...。
Ubuntu 18.04・Anaconda環境にNuPICをインストールする

#NuPICとは
numenta社がgithub上で[https://github.com/numenta/nupic](https://github.com/numenta/nupic)公開しているHTM学習アルゴリズムのPython実装です。今はやりのディープラーニングとは異なり、生物学的なアプローチでニューラルネットワークの学習を行います。
#どんなことができるの？
HTMは、Hierarchical Temporal Memoryの頭字語です。日本語で言えば階層的時間記憶です。
HTMアルゴリズムは、時間的なパターンを記憶し、これまでの入力の時系列的な文脈に基づいて次の入力を予測することができます。
### Hot Gym Prediction Tutorial
[https://www.youtube.com/watch?v=S-0thrzOHTc](https://www.youtube.com/watch?v=S-0thrzOHTc)
Youtubeのビデオチュートリアルです。
こちらの例ではスポーツジムの電力消費量を予測しています。
#インストール方法
1. Anacondaをインストールする
[https://www.anaconda.com/distribution/](https://www.anaconda.com/distribution/)からlinux用のAnacondaをインストールしてください。詳細は他記事にお譲りします。。

2. Python2.7の仮想環境を作成する
余計なパッケージを入れるとエラーが出るので、入れるのはpipだけです。

```
$ conda create -n [仮想環境名] python=2.7 pip
```

3. pipでnupicをインストール

```
$ pip install nupic
```

#デモを動かしてみる
元github[https://github.com/numenta/nupic](https://github.com/numenta/nupic)にあるデモ(cpu.py)を動かしてみます。まずはgit cloneします。

```
$ git clone https://github.com/numenta/nupic
$ cd nupic
$ cd examples/opf/clients/cpu
$ python cpu.py
```
このようなデモが走れば成功です。このデモではCPU使用率をリアルタイムで予測しています。
![Screenshot from 2019-06-20 09-57-53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442000/cd02f60c-7a38-4849-a742-37123e9c2c55.png)
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

## 概要
AWSの踏み台サーバにアクセスしようとしたら出来なくなった。

## エラー内容
```
$ ssh -i bastion.pem user@22.19.39.129
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
```

何だこれって感じですが同じIPで同じポートに接続しようとすると
フィンガープリントのゴミが溜まって発生してしまうようです。

## 対応方法
ファイルを開く

```
$ vi ~/.ssh/known_hosts
```

該当IPについての記載がある行を削除して保存する

これだけで接続出来る様になりました。

これからも発生しそうだけど、忘れそうなのでメモ

## 参考
- [SSH接続で WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! って言われて接続を拒否られるとき](https://qiita.com/wnoguchi/items/690f3f4651f8f11e4ed3)
Django チュートリアル[その２]

[公式Djangoドキュメント　チュートリアル２](https://docs.djangoproject.com/ja/2.2/intro/tutorial02/)
#要約
##データベースの設定(phpMyAdmin, MySQL, Django==2.1)
```python
import pymysql
pymysql.install_as_MySQLdb()
DATABASES = {
    'default': {
        #'ENGINE': 'django.db.backends.sqlite3',
        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        "ENGINE": 'django.db.backends.mysql',
        "NAME": "tutorial",#任意(phpMyAdmin側で作成したdb名)
        "USER": "root",
        "PASSWORD": "root",
        "HOST": "127.0.0.1",
        "PORT": "3306",
    }
}
```

データベースにテーブルを作る

```python
$ python manage.py migrate
```

##モデル作成
`[pythonコードで使える名前] = models.[データ型指定]Field(引数)`
`models.ForeignKey([結びつけたいモデル名], on_delete = models.[紐づけられたオブジェクトをどうするのか])`
それぞれの Choice が一つの Question に関連付けられることを Django に伝えます。
[(on_deleteの色々はここ)](https://www.djangobrothers.com/blogs/on_delete/)

```python
#polls/models.py
from django.db import models

class Question(models.Model):
	question_text = models.CharField(max_length = 200)
	pub_date = models.DateTimeField("date published")

class Choice(models.Model):
	question = models.ForeignKey(Question, on_delete = models.CASCADE)
	choice_text = models.CharField(max_length = 200)
	votes = models.IntegerField(default = 0)
```

##モデルを有効にする
```python
#mysite/settings.py
INSTALLED_APPS = [
    "polls.apps.PollsConfig",#追加
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]
#------------------------------
# polls/apps.py
from django.apps import AppConfig

class PollsConfig(AppConfig):#ここを参照して追加
    name = 'polls'
```

`makemigrations`で、モデルに変更があったことをDjangoに伝える。

```python
$ python manage.py makemigrations polls
```

`migrate`を再度実行し、 モデルのテーブルをデータベースに作成する。


```python
$ python manage.py migrate
```

##以下の３ステップが重要

- モデルを変更する (models.py の中の)
- これらの変更のためのマイグレーションを作成するために `$ python manage.py makemigrations` を実行します。
- データベースにこれらの変更を適用するために `$ python manage.py migrate` を実行します。

##def __str__(self): ↩︎ return self.question_text
下記のようにしておくことで、`Question object (1)`とならずに済む。(チュートリアル通りにやれば、`What's up?`と表示される)
[参考](https://code-schools.com/django-str/)

```python
#polls/models.py
class Question(models.Model):
	question_text = models.CharField(max_length = 200)
	pub_date = models.DateTimeField("date published")
	def __str__(self):#追加
		return self.question_text#追加

class Choice(models.Model):
	question = models.ForeignKey(Question, on_delete = models.CASCADE)
	choice_text = models.CharField(max_length = 200)
	votes = models.IntegerField(default = 0)
	def __str__(self):#追加
		return self.choice_text#追加
```
[JAVA][Spring][MyBatis]SQLビルダーで IN() を使う


## 要求
* Java の Springフレームワークを使ってDB操作したい。
* mybatis のアノテーションとSQLビルダーを使う。
* XMLを使いたくない。Javaで完結させたい。
* IN句での検索条件指定を使いたい。

## サンプル

以下のようなテーブル「shops」があるとする

| shop_cd | name   |
| ------- | ------ |
| 0001    | 本店   |
| 0002    | 辞書店 |
| 0003    | 文庫店 |
| 0004    | 絵本店 |

`WHERE shop_cd IN (0001, 0002)`を指定して店舗一覧がほしい。

### データを保持するクラス
```java
@Getter
@Setter
public class Shop {
  private String shopCd;
  private String name;
}
```

### マッパー
```java
public interface ShopMapper {
  /**
   * 店舗コードのリストを受け取って店舗のリストを返す
   */
  @SelectProvider(type = SqlProvider.class, method = "selectByShopCodes")
  List<Shop> selectByShopCodes(List<String> shopCodes);

  class SqlProvider {
    public String selectByShopCodes(List<String> shopCodes) {
      final String inParams = getInPhraseParamString(shopCodes, "shopCodes");
      SQL sql = new SQL() {
        {
          SELECT("*");
          FROM("shops");
          WHERE(String.format("shops.shop_cd IN (%s)", inParams));
          ORDER_BY("shop_cd ASC");
        }
      };
      return sql.toString();
    }

    /**
     * リストを受け取って IN () 句で利用するパラメータ文字列を返す
     * 例: #{shopCodes[0]}, #{shopCodes[1]}, #{shopCodes[2]}
     */
    private String getInPhraseParamString(List<String> values, String paramName) {
      String paramString = "";
      int i = 0;
      for (String value : values) {
        if (i != 0) {
          paramString += ",";
        }
        paramString += String.format("#{%s[%s]}", paramName ,i);
        i++;
      }
      return paramString;
    }
  }
}
```

### コツ
* `#{リスト[0]}, #{リスト[1]}, #{リスト[2]} ...` という文字列をリストの長さに合わせて作成しIN句で利用する。
* 引数名（サンプルでは「shopCodes」）とSQL内での指定変数名（サンプルでは「#{shopCodes[0]}」）とを一致させること。
Amazon Managed Blockchainを利用するときの参考記事まとめ

AWSが提供するブロックチェーン構築・運用のフルマネージドサービス「Amazon Managed Blockchain」とブロックチェーンフレームワーク「Hyperledger Fabric」を利用する際によく参考に記事をまとめています。

自分用なので、自分記事が若干多めです。随時更新

この記事良かったよーとか、教えていただけると助かります。


## 情報まとめ

ブロックチェーンをざっくりと把握するのに参考にした情報まとめ - Qiita
https://qiita.com/kai_kou/items/c419b32cec12d0499453

Amazon Managed BlockchainがリリースされたのでHyperledger Fabricも合わせて情報をまとめてみた - Qiita
https://qiita.com/kai_kou/items/5a968f42c5f96296f6fe


## 構築

Amazon Managed BlockchainでHyperledger Fabricのブロックチェーンネットワークを構築してみた - Qiita
https://qiita.com/kai_kou/items/e02e34dd9abb26219a7e

AWS SDK for Python(boto3)でAmazon Managed Blockchainのブロックチェーンネットワークを作成してみた - Qiita
https://qiita.com/kai_kou/items/9e16274b6a5c30aa6086

[Hyperledger Fabric] Amazon Managed Blockchain使ってみる - Qiita
https://qiita.com/YuasaJunki/items/ee66eb262b124679f3dd


## 設計・開発


Hyperledger Fabricでアプリケーション設計するのに参考にした情報 - Qiita
https://qiita.com/kai_kou/items/8314e8e18c3d679947c0


Amazon Managed Blockchainで作成したブロックチェーンネットワークにHyperledger Fabric SDK for Node.jsでアクセスしてみる - Qiita
https://qiita.com/kai_kou/items/5a6b0fc148f04857a878

AWS LambdaとHyperledger Fabric SDK for Node.jsを利用してAmazon Managed Blockchainのブロックチェーンネットワークにアクセスする - Qiita
https://qiita.com/kai_kou/items/a38b65c70739b24852f4

Hyperledger Fabricのチェーンコード(Node.js)をTypeScriptで実装できるようにしてみた - Qiita
https://qiita.com/kai_kou/items/0726c9a462bdcaf3856c


## ツール

Hyperledger ExplorerでAmazon Managed Blockchainのブロックチェーンネットワークを可視化してみた - Qiita
https://qiita.com/kai_kou/items/832cc21d41d0730006fc


## ハマった系

Amazon Managed BlockchainのPeerノードでディスク容量が枯渇してハマった - Qiita
https://qiita.com/kai_kou/items/1886ebdbccaa5407a352


Hyperledger Fabricのチェーンコードで`getStateByRange` の仕様が微妙っぽかったので調べてみたら微妙だった - Qiita
https://qiita.com/kai_kou/items/94ee468cea48fb7856f6

Amazon Managed Blockchainで構築したブロックチェーンネットワークで`deleteState` が機能してない？ - Qiita
https://qiita.com/kai_kou/items/c45aff1a9bef7334b877
gusuku Customineで添付ファイルの登録有無を判定する方法

kintoneでカスタマイズする場合に[gusuku Customine](https://customine.gusuku.io/ja/)を利用するシーンが増えてきました。
これまでは躓くことはなかったのですが、今回盛大に躓いたのと同じことやりたい人がいそうなので共有します。

# やりたいこと
レコード保存時に添付ファイルの登録有無で処理を分けたい
判定するアプリと添付ファイルを登録するアプリが同じ場合と違う場合の2パターンで確認

# 1. 添付ファイルフィールドが自アプリの場合
自アプリの場合は[サポートページ](https://support.gusuku.io/ja-JP/support/solutions/articles/36000151188-%E6%B7%BB%E4%BB%98%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%BF%85%E9%A0%88%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF)にも紹介されていました。

## 結果
![495ea77553e3fe44ea727d3efefaa9e7.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102790/6f5a1b70-2103-b977-941c-37917b1281ac.gif)


## gusuku Customineの設定
![添付ファイル有無（自アプリ） のカスタマイズ-(1-1)-ページ (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102790/50f34eb3-5a3c-2689-ede2-39afbf5258b2.png)

## ポイント
条件をレコード保存後にするのがポイントです。
レコード保存前では添付ファイルが登録されているかどうかはわかりません。（kintoneの仕様）



# 2. 添付ファイルフィールドが別アプリの場合
## 前提
2つのアプリは1:1で紐づく

## 結果
別アプリのデータはこんな感じです。
![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102790/1c406290-092e-d3c4-057a-5126bacde5b0.png)


![a16965b5171dabea143df8f5256a4325.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102790/5021e3f6-4aa0-469b-7e07-d07c614b7212.gif)

## gusuku Customineの設定
![添付ファイル有無（別アプリ） のカスタマイズ-(1-1)-ページ (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102790/7f666cab-ae6b-3ec3-a7f9-7abc3b135f0d.png)

## ポイント
何も入力しない文字列1行フィールドを用意して、この文字列1行とアクションの結果を比較するのがポイントです。
AppDelegateとUIViewControllerのメソッドの呼出順序

# はじめに
iOSでAppDelegateのメソッドの呼ばれる順番とUIViewControllerのメソッドの呼ばれる順番の関係がわからなかったので、実装して試しました。iOSのバージョンによって変わる可能性もあるので、実装のサンプルは、[github](https://github.com/hoge-san/sample-swift-life-cycle)においてあります。

# 実装した環境
- Xcode 10.2.1
- SWIFT 5
- ios 12

# アプリライフサイクルとUIViewController
## アプリの起動時
アプリの起動時は、`didFinishLaunchingWithOptions`と`applicationDidBecomeActive`の間に、UIViewControllerの`viewDidLoad`などが呼ばれます。

- application(_:willFinishLaunchingWithOptions)
- application(_:didFinishLaunchingWithOptions:)
- viewDidLoad()
- viewWillAppear(_:)
- viewDidAppear(_:)
- applicationDidBecomeActive(UIApplication)

## アプリの終了時、バックグランド時
アプリの終了時やバックグランド時には、`viewWillDisappear`が呼ばれると思っていたのですが、アプリ起動時以外は、UIViewControllerのメソッドが呼ばれていませんでした。

## アプリライフサイクルとUIViewControllerの呼ばれる順番

<img width="700" alt="20190620-ios-lifecycle-viewcontroller.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404406/53b420e7-6d89-0e8d-4395-351d6daf791b.png">


# 参考文献
[Appleリファレンス UIViewController](https://developer.apple.com/documentation/uikit/uiviewcontroller)
Zendframework 3　認証に必要なパッケージ


# 目的
業務効率化

# セッションとは
ユーザーがログインしたデータを保持、サイト接続から離脱までの一連の動作こと

zend framework3でセッションを扱うには、zend-sessionパッケージが必要

zend-sessionパッケージを取得していない場合は、以下のコマンドをcomposer.jsonファイルがあるフォルダで実行すること

````php5

composer require zendframework/zend-session
```


# 認証とは

「idとパスワード」を入力されたら、
それが正しいかどうかを検証する仕組みのことです。
認証された人は、適切なroleに割り当てられ、セッションに保存されます。その後、ACLから、その人がアクセスできる場所を特定する、といった流れになります。

zend framework3で認証を扱うには、zend-authenticationパッケージが必要
セッションと同様、パッケージを取得する際は、以下のコマンドをcomposer.jsonファイルがある場所で入力してください

```php5

composer require zendframework/zend-authentication
```

# 参考
[https://rakulack.net/archives/555](https://rakulack.net/archives/555)
[https://olegkrivtsov.github.io/using-zend-framework-3-book/html/en/User_Management__Authentication_and_Access_Filtering/Implementing_User_Authentication.html](https://olegkrivtsov.github.io/using-zend-framework-3-book/html/en/User_Management__Authentication_and_Access_Filtering/Implementing_User_Authentication.html)
AWS Chaliceのオンラインセミナー受けてみた

「[AWS Black Belt Online Seminar Dive Deep into AWS Chalice](https://www.slideshare.net/AmazonWebServicesJapan/20190619-aws-black-belt-online-seminar-dive-deep-into-aws-chalice)」の自分向けメモ
AWS Chaliceって何？......レベルの人向け


## Chaliceとは
 - Python製OSSサーバーレスアプリケーションフレームワーク
 - API GatewayとLambdaを使用するアプリケーションを迅速に作成、デプロイすることが可能

### 使い方
#### スケルトンプロジェクトを作成
 - chaliceをインストールする
 - プロジェクトのひな型を作成
    - .chalice：設定ファイルを配置
    - requirements.txt：依存ライブラリを記述
    - app.py：処理を記載

#### アプリケーション
 - Chalicelibraryをインポート
 - 起点となるアプリケーションオブジェクト生成
 - ルートデコレータ：@app.route('/')でエンドポイントを設定
    - デコレータへ渡した情報が呼び出し元のAPI Gatewayに渡される
 - returnでレスポンスボディを返却する

#### デプロイ
コマンドを実行すると以下が自動実行される

 - デプロイパッケージ作成
 - IAMロールを設定
 - Lambadaをデプロイ
 - API Gateway作成

### 構成
 - app.pyのコードはそのままLambadaコードになる
 - デコレータのAPI Gatewayがトリガーとして設定される
 - デコレータの設定が反映されてAPI Gatewayが作成される
 - IAMポリシーの自動生成
    - LambdaとCloudWatch Logsがデフォルトで付与されている
    - 仮にDynamoDBを記述した場合はポリシーにDynamoDBの操作権限が付与される
    - boto3.resource()は非対応
    - サードパーティの定義も非対応
    - 現状では試験的な機能

### まとめ
 - シンプルな実装でAPI Gateway + LambdaのAPIを定義可能
 - 2つの関連性を別途管理する必要がなくなる

## 基本機能
### リクエストハンドリング
#### URL Parameters
 - 可変的なURLパスを定義可能
 - パスによって、引数で処理分岐

#### HTTP Methods
 - HTTPメソッドを明示してエンドポイントを定義可能
 - メソッドごとに異なる関数を同一URLパスで定義可能
 - 1つのURLに複数のメソッドを定義できない

#### Request Metadata
 - app.current_request.～に文字列として、データが入っている
    - ～.method
        - HTTPメソッドを取得
    - ～.headers
        - HTTPヘッダーを取得
        - dict互換
        - 独自拡張クラスで大文字小文字区別なしにアクセス可能
        - リードオンリー
    - ～.query_params
        - クエリストリングを取得
        - dictとして格納
        - 同じキー名の場合は、後勝ち
    - ～.uri_params
        - urlパスを取得
        - dictとして格納
        - 仮引数と同じ値
    - ～.raw_body
        - リクエストボディを取得
        - byte型で格納
    - ～.json_body
        - リクエストボディをJSON形式で取得
        - JSON型文字列で格納

### レスポンスハンドリング
#### Custom HTTP Response
 - 暗黙的には200 OKで返却
 - Response()で定義した内容でレスポンスを返却できる
 - エラーを返却することも可能
    - 任意のメッセージを生成できる

#### Error HTTP Response
 - 任意のエラーを返す例外クラスをraiseする

## 他機能
### 認証認可
 - IAM、Cognitoと容易に連携
 - 独自認証実装とも連携可能
 - CORSサポート
 - GZIP圧縮によるレスポンス可能
 - Blueprints　←　インタフェースが変わる可能性がある

### 他サービスとの連携
 - デコレータに以下を設定することが可能
    - CloudWatch Events
    - S3
    - SQS
    - SNS

### Local Modeローカルモード
 - デプロイせずともローカルで起動可能

## 実践的開発プロセス
### ユニットテスト
#### テストプロジェクトを作成
 - pytestのchaliceプラグインを使って記述する
 - 任意のプロジェクトを引数にtestsディレクトリを作成
    - test_app.py：テストを記述
 - pytestchaliceをインストール

#### 記述
 - pytest -vv コマンドを実行
 - テスト用のclientでリクエストを投げる
 - assertでresponse.status_codeを確認
 
### CI/CD
#### Source
 - ロジック実装
 - テスト実装
 - ブランチ管理
 - プルリク
 - ピアレビュー

#### Test
 - py.testでユニットテスト
 - Flake8でLintチェック
 - mypyで静的型チェック

#### Packgae
 - デプロイパッケージ作成
 - S3にアップロード

#### deploy
 - CloudFormation
 - chalice deployをチーム開発で利用は非推奨
 - chalice package を利用する

#### CI/CDテンプレート
 - generate-pipelineでCloudFormation templateを生成可能（builldspec.yml）
 - -bオプションでymlを出力し、構成を管理できる
 - ymlをコードコミットにpullするとパイプラインが流れてデプロイ
リファクタリング入門

## はじめに
本記事は、以下の書籍を見ながら記載した資料です。

* 新装版 リファクタリング 既存のコードを安全に改善する
  - Martin Fowler [著]

## リファクタリングの定義
書籍では以下のように定義されています。

__「外部から見たときのふるまいを保ちつつ、理解や修正が簡単になるようにソフトウェアの内部構造を変化させること」__


## リファクタリングのコツ
書籍に記載されているリファクタリングのコツを紹介させていただきます。

* 小さな単位で行うこと
  - 失敗する(バグを埋め込む)可能性を軽減できる

* 新規追加の作業とリファクタリングの作業を同じ作業単位(コミット)で行ってはならない。必ず分けること
  - コード差分がどちらなのか、すぐにわかりません
  - バグを埋め込んだときに原因がどちらなのか、すぐにわかりません

## リファクタリングアンチパターン
まず、よくないと思うリファクタリング事例を紹介させていただきます。

#### Case 1 : コードが(とても)わかりにくいから、コメントを(たくさん)書こう
これは、自分が過去に正しいと思っていたアンチパターンです。

本ケースのアンチパターンを実行する真の理由は、「コードの可読性を上げる」ではありません。
おそらく以下のどちらかです。

* そうしないとコードの理解に非常に時間がかかる
* そうしないと__コードを書いた自分でも理解できなくなる__

汚いコードを隠蔽するために、コメントを消臭剤のように使うのはやめましょう。

![汚いコードを隠蔽.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293729/5461abf5-1428-e514-11c9-318ebbd95674.png)

汚いコードに付与されたコメントはだいたい保守されません。想定される原因を以下に記載しました。

* 汚いコードに埋め込まれたバグを修正したが、コメントは修正されなかったため
  - たくさん記載されているコメントを矛盾なく修正するのは相当ハードルが高いです・・・
* たくさん記載されているコメント自体を理解できなくなり、コメントの保守が不可能になったため

####  Case 2 : 新機能追加・機能修正のついでに、リファクタリングも同じコミット(作業単位)でしてしまおう
これは今でも自分がよく行ってしまうアンチパターンです。

個人で作成しているプログラムであればそれでもいいのですが、仕事(複数人がかかわる)だと困る場合が発生します。

困るケースを以下に記載します。

* コードレビュー時、コード差分がどちら(新機能追加・機能修正部分 or リファクタリング部分)なのかすぐにわからない
* バグを埋め込んだ時に、原因がどちら(新機能追加・機能修正部分 or リファクタリング部分)なのかすぐにわからない

コミット単位では、作業は以下のどちらか１つにしたほうが無難だと思います。
1. 新機能追加・機能修正
2. リファクタリング

## リファクタリングトピック集
書籍のリファクタリング事例を紹介させていただきます。

### 巨大なクラス
1つのクラスがあまりにも多くの仕事をしている場合は、たいていインスタンス変数を持ちすぎています。
インスタンス変数が多すぎると、重複コードが存在する可能性が高くなります

#### 長すぎるパラメータリスト
長すぎるパラメータ(データの群れ)は、保守しにくいです。

パラメータリストをオブジェクト(クラス、もしくは構造体)にしましょう。

#### switch文に気をつけろ
他のオブジェクトの属性を調べるswitch文処理を書くことは常に間違いです。

switch文処理は、他のオブジェクトについてではなく、自分自身のオブジェクトの情報について行うべきです。

#### データの群れ
数個のデータがグループとなって、クラスのフィールドやメソッドのシグニチャなど、さまざまな箇所に現れることがあります。

こうした群れをなしたデータはオブジェクトとして、1つにまとめるべきです。

属性や操作のパラメータの数を絞り込むことはコードの不吉なにおいをなくすのに役立ちます。

#### 特性の横恋慕
処理の際に、他のオブジェクトのgetメソッドを何度も何度も呼び出している間違ったメソッドがよく見受けられます。

処理、および処理に必要なデータを1つにまとめます。


## あとがき
リファクタリングは学習中であるため、この記事は頻繁に更新されます。
ご了承ください。<(_ _)>
Django チュートリアル[その１]

[公式Djangoドキュメント　チュートリアル１](https://docs.djangoproject.com/ja/2.2/intro/tutorial01/)
#要約

```python
#polls/views.py
from django.http import HttpResponse

def index(request):
	return HttpResponse("Hello, world. You're at the polls index.")
#------------------------------
#polls/urls.py
from django.urls import path
from . import views

urlpatterns = [
		path("", views.index, name = "index")
]
#------------------------------
#mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("polls/", include("polls.urls")),
    path('admin/', admin.site.urls),
]
```

`path("", views.index, name = "index")`
「http://localhost:8000/polls/ 」だった時、「polls/views.py」にある、`def index(request)`を呼び出す。
（関数名が`index`である必要は特になし）

`path("polls/", include("polls.urls"))`
「http://localhost:8000/polls/ 」は「polls/urls.py」と繋がっているということを全体に伝える。

##つまり

```python
#polls/views.py
from django.http import HttpResponse

def indexaaa(request):#変更
	return HttpResponse("Hello, world. You're at the polls index.")
#------------------------------
#polls/urls.py
from django.urls import path
from . import views

urlpatterns = [
		path("", views.indexaaa, name = "index")#変更
]
#------------------------------
#mysite/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path("polls/", include("polls.urls")),
    path('admin/', admin.site.urls),
]
```
としても、正常に動作する。
ROCm2.5がリリースされたので検証及びベンチマーク

https://github.com/RadeonOpenCompute/ROCm

最近ROCm2.5がリリースされました。


#変更点について

##rocm-smi

 rocm-smiでVRAM使用量の項目などが増えました
https://github.com/RadeonOpenCompute/ROC-smi

```
========================ROCm System Management Interface========================
================================================================================
GPU  Temp   AvgPwr  SCLK    MCLK    Fan     Perf  PwrCap  VRAM%  GPU%  
0    41.0c  18.0W   809Mhz  351Mhz  22.75%  auto  250.0W    0%   0%    
================================================================================
==============================End of ROCm SMI Log ==============================
```

他にもドライババージョンも見れるようになった

```
 rocm-smi --showdriverversion


========================ROCm System Management Interface========================
Driver version: 19.10.9.418
==============================End of ROCm SMI Log ==============================
```



#バージョンチェック
```
$ apt show rocm-libs -a
Package: rocm-libs
Version: 2.5.27
Priority: optional
Section: devel
Maintainer: Advanced Micro Devices Inc.
Installed-Size: 13.3 kB
Depends: rocfft, rocrand, hipblas, rocblas
Homepage: https://github.com/RadeonOpenCompute/ROCm
Download-Size: 768 B
APT-Manual-Installed: yes
APT-Sources: http://repo.radeon.com/rocm/apt/debian xenial/main amd64 Packages
Description: Radeon Open Compute (ROCm) Runtime software stack
```


#ベンチマーク
![(TF1.13.3)ROCm2.3+(TF1.13.3)ROCm2.4(RadeonⅦ）+(ROCm2.4+TF2.0 RadeonⅦ）+RadeonⅦ (ROCm2.5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232732/83b8246f-38a3-51fa-73ab-0c70951d6bf9.png)
図1 ROCm2.3から2.5までのベンチマーク

https://qiita.com/T_keigo_wwk/items/355866c49cf867946b48
ベンチマークは以上の方法で取得、Tensorflow-rocm 1.13.3で測定。

まとめると特に2.4に対して速度上の優位性は特に認められませんでした。
今回のアップデートはあくまでも機能面での改善がメインでパフォーマンスチューニングなどはなかったようです。
Swagger (OpenAPI) を始める

こんにちは。

初めてSPAをイチから作っています。前の案件もSPAでしたが、入社した時点でAPIのほとんどは実装されていました。

しかし、今回は新しい案件です。バックエンドの実装を別の人がやってるので、今はスプレッドシートでAPIをざっと決めてやり取りしていますが、Swaggerも触ってみたい。

ということで、Swaggerを触り始めた初心者の初心者による初心者のための記事です。

## Swagger (OpenAPI) ？

平たくいえば、APIの仕様をドキュメントにするための仕様です。細かい説明は誰かの記事に譲ります。

[Swaggerの概要をまとめてみた。 - Qiita](https://qiita.com/gcyata/items/342073fa7607fd4082bd)

## 仕様書を書き始めよう

API仕様書はYAMLかJSONで書きます。

最小構成は以下の通り。

```yaml
swagger: "2.0"
info:
  title: "Hello World"
  version: "1.0.0"
paths:
  /:
    get:
      responses:
        200:
          description: "success"
```

Swagger Editorの例だとpathsが多すぎてよくわかりませんが、とりあえず「どこにアクセスすると、どんなステータスが返ってくるのか」を書きます。はじめの一歩です。今後も、pathsにpathを追加する場合はresponsesから書き始めるといいでしょう。

プレビューで見てみると、次のようになります。

![スクリーンショット 2019-06-20 6.27.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/231460/14b91825-9911-2705-682d-b940f2c2218a.png)

## プレビューからリクエストを送信しよう

生成されたドキュメントで「Try it out」ボタンをクリックすると、パラメーターの入力フォームや「Execute」ボタンが表示されて、定義したAPIにリクエストを送信できます。

デフォルトの送信先は、相対パスの / です。つまり、Swagger Editorで開いている場合は https://editor.swagger.io/ で、このままではEditorから叩いても自分たちのサーバーには送信できません。送信先を設定しましょう。

送信先の設定は host と basePath です。自分たちの環境に合わせて設定してください。

実際に設定すると以下のようになります。

```yaml
swagger: "2.0"
info:
  title: "Hello World"
  version: "1.0.0"
host: "hoge.example.dev"
basePath: "/api/v1"
paths:
  /:
    get:
      responses:
        200:
          description: "success"
```

## 仕様書を拡張しよう

この記事はここまでです。

次は、pathのsummaryやparameters、responses.schemaを追記していくことになります。つまり、pathの概要と、入力、出力の詳細な定義です。

他にもinfo.description（詳細な説明）やtags、definitionsなどの仕様が山ほどありますが、それらはオプションです。とにかく初めはそれぞれのパスと入出力を書いていって、重複をtagsやdefinitionsに移していくことになるでしょう。

それでは。

---

公式サイト: https://swagger.io/

この記事は私の個人ブログからの転載です。
Rubyのメソッド公開レベル（public, protected, private）

Rubyのメソッド公開レベルについて、初心者でも理解できる記事が見つけられなかったので、少々情報が正しいか不安ですが、投稿させていただきます。
Ruby初心者が、どうにかこうにかしてまとめたものなので、下記情報は過度に信じないようお願いいたします。
間違いありましたら、更新しますので、お気軽に教えていただけますと幸いです。

---

まず、下記、[るりま](http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fdef.html#limit)の説明を少々いじったものになります。
- public に設定されたメソッドは制限なしに呼び出せる（特に指定しない場合は「public」に設定される）
- private に設定されたメソッドは関数形式でしか呼び出せない（レシーバの利用ができない）
- protected に設定されたメソッドは、そのメソッドを持つオブジェクトがselfであるコンテキスト(メソッド定義式やinstance_eval)でのみ呼び出せる


まず、いきなりですが、まとめから入ります。
その後、各項目について見ていきます。

## まとめ

|公開レベル|外部から隠す（全体へは非公開）|自クラス及びサブクラスから <br>関数形式での呼び出し| 自クラス及びサブクラスから<br>レシーバ形式での呼び出し|
|------|:-------------:|:------:|:------:|
|public|×|○|○|
|private|○|○|×|
|protected|○|○|○|


ポイントは、privateはレシーバ形式での呼び出しができない（関数形式でのみ呼び出し可能）ということ。
protectedであればレシーバ形式での呼び出しが可能になるということ。

```ruby
hoge = Hoge.new
hoge.protected_method # protectedのメソッドならOK
hoge.private_method   # privateのメソッドではError
```

外部には公開したくないが、同じクラスやサブクラスの中でレシーバ付きで呼び出せるようにしたい時にprotectedを使う。


## public

publicメソッドは、クラスの外部からでも呼び出せる。
(initializeメソッド以外のインスタンスメソッドはデフォルトでpublicメソッドになる。
※インスタンスメソッドとは、クラス構文の内部で定義するとつくることができるメソッドで、そのクラスのインスタンスが呼びだすメソッド。）

## private

privateメソッドは、クラスの外部からは呼び出せず、クラスの内部でのみ使用できるメソッド(サブクラスでも呼び出し可能)。厳密には、レシーバを指定して呼び出すことができないメソッド。
<font color="Silver">そのため、クラスの内部でレシーバを指定して呼び出そうとしても呼び出せない（selfというレシーバをつけて呼び出したことになるため。selfを省略して呼び出せばエラーは発生しない）。(補足：レシーバとは、bird.flyと書いた場合、birdが（flyメソッドの）レシーバになる。（birdにflyのメッセージ（処理の内容）を送るという考え方により、受け取り側のbirdがレシーバになる。）)クラス内でprivateと書くことで、そこから下で定義されたメソッドはprivateメソッドになる。privateメソッドになるのは、インスタントメソッドのみであり、クラスメソッド（例：self.hello）はprivate以下に定義してもprivateにならない。クラスメソッドをprivateにする場合は、class << self の構文を使うか、private_class_methodでクラスメソッド定義後に公開レベルを変更する方法がある。また、後からメソッドの公開レベルを変更する方法もある（private :hello のようにprivateメソッドに引数（既存のメソッド名）を渡す）。privateメソッドはサブクラスでも呼び出し可能なのでオーバーライド可能。</font>

## protected

protectedメソッドは、そのメソッドを定義したクラス自身と、そのサブクラスのインスタンスメソッドからレシーバ付きで呼び出せるメソッド。



以上。
Installing PureScript tooling in 2019

In 2019, we have some various easy ways to install PureScript and its tooling.

As a new user, you will only need to install the PureScript compiler and the build tool Spago.

## Installation

### npm

First, please make sure you have

* Node 10.x or greater
* npm prefix set to a folder you own

To set the npm prefix, you should either run

```
$ npm set prefix ~/.npm
```

Or set the file `~/.npmrc` to have `prefix=/home/your-user/.npm`.

**Do not ever run npm with sudo.**

Then you can run `npm install --global purescript spago` to install the PureScript compiler and the Spago build tool.

### Nix

Clone Easy-PureScript-Nix from <https://github.com/justinwoo/easy-purescript-nix>

Then install PureScript and Spago to your path by using the derivations, e.g.

```
$ nix-env -if purs.nix

$ nix-env -if spago.nix
```

### Manually

Go to <https://github.com/purescript/purescript/releases> and <https://github.com/spacchetti/spago/releases>, and download the appropriate binaries for your platform. Then place these in a directory in your PATH.

## Hello World

Create a new directory and run `spago init`

```
$ mkdir new-ps-project-2019
$ cd new-ps-project-2019
$ spago init
```

Then you will have the initial Spago project setup. Then run `spago run` to see the project in action.

```
$ spago run
Installation complete.
Build succeeded.
🍝
```

There you have it, a working PureScript project ready for 2019.

## Links

* Example repo: <https://github.com/justinwoo/new-ps-project-2019>

* Spago: <https://github.com/spacchetti/spago>
MySQLを視覚化できるアプリ

# MySQLを視覚化できるアプリ

## Sequel Pro の導入

```
$ brew cask install homebrew/cask-versions/sequel-pro-nightly
```

Homebrew 経由でインストールした Sequel Pro でないとDocker の MySQL にアクセスができない。

## 使い方

<img width="512" alt="Sequel Pro.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434376/2a771038-7934-a5a2-51b4-bf6e73c01113.png">

<img width="512" alt="Sequrel Pro2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/434376/317043a0-c331-cf86-6ee6-70c5897ebbe9.png">


以上！！