OmniAICreator/Qiita-1.07M huggingface dataset:
VueやReactでコンポーネントやモジュールの依存関係を把握する

## はじめに
なんかこのコンポーネント誰に依存されているかわかんないの、変更した時不安(´；ω；｀)
って声があったので、コンポーネント間の依存関係を出すツールを調べて使ってみました。
結果かなり良かったです。

## [madge](https://github.com/pahen/madge)
### DEMO
[DEMO](https://asciinema.org/a/l9tM7lIraCpmzH0rdWw2KLrMc?autoplay=1)

### 概要
madgeはtsconfigやwebpackの設定を与えて、何をさせるのか指定します。
例えば、依存グラフをsvgで出力させたり、vg形式で出力させたりできます。
また、循環依存があるファイルリスト、依存されているのが1つ以上あるリスト、逆にどれにも依存されていないリストを出したりできます。
cliで軽くやるのからnodeでフルコントロールもできるのでかなり細かい事ができ、例えばこのモジュールはここからしか依存させないなどの設定をCIやエディターに簡単に組み込ませたりできます。(例：クリーンアーキテクチャーが持つポリシーの1つである、レイヤーを通り越して依存するの禁止等が簡単に実現できます。

### React
一応jsxはtypescriptが標準サポートしているので、jsx間の依存は簡単に見れる。
![graph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/4568f479-8e94-71aa-612e-d347f2079086.jpeg)

ちょっとボリュームのあるこのリポジトリの依存!
も出してみる。
![graph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/28906140-35fc-6db6-043c-5a7da79a1bc6.jpeg)
見やすくてかなり良い感じだと思います！

### Vue
https://github.com/pahen/madge/issues/122
vueファイル間の依存を出したかったんですが、それはまだできないっぽいです(´；ω；｀)


## [dependency-cruiser](https://github.com/sverweij/dependency-cruiser)
dependency-cruiserは標準でvueの依存グラフを出せますし、madgeと同じように循環依存検知等色々できます。
また、出力はdot言語なので、dot言語のレイアウトエンジンを調整すればいろいろできます。

こちらのリポジトリをサンプルに依存グラフを出します。
https://github.com/kahirokunn/book-management

これがサンプルです
![CreateBookForm_dependencygraph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/36b5a1b4-96fe-dbbb-5d17-9afdce581089.jpeg)

特定コンポーネント単位なら割といけますね。

ちなみにデフォルト設定で全部出すとめっちゃカオスです
叩いたコマンドはこれです

```sh
$ depcruise --webpack-config ./node_modules/@vue/cli-service/webpack.config --exclude "^node_modules" --output-type dot src | dot -T jpg > dependencygraph.jpg && open ./dependencygraph.jpg
```

![dependencygraph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/18141a1d-09fc-8f77-8dfb-a935c007568e.jpeg)

レイアウトエンジンに関してはこちらの記事を見ていただきたいです
http://melborne.github.io/2013/04/02/graphviz-layouts/

デフォルトレイアウトエンジンはdotで、あまり見やすくないですね。。。
自分の好みはneatoです。
こんな感じになります。

![dependencygraph.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141711/7d7aa853-f906-c57b-22b8-46e5b2dbbfb4.jpeg)

まぁカオスには変わりないですが、まだまし、、、？なのかなって(´；ω；｀)


## まとめ
現状の依存グラフのエコシステムだとこの辺までできるようです。
もしもっとこういうのもあってこうできるよ！とか、いろいろありましたら教えていただけると幸いです。

## 参考資料
https://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d#edge
http://melborne.github.io/2013/04/02/graphviz-layouts
Googleスプレッドシートのデータ構造図の書き方

##はじめに
私はS3データ構造をグーグルスプレッドシート（以下GS）で作成することになりました。エクセルだとSmartArtを使えますが、GSにはありません。ググると、組織図（挿入→グラフ→組織図）が使えそうです。

##親子関係を記述する
この方法が最適とは思えませんが、私はひたすら親子関係を記載しました。
表の列名に親、子、備考と書き、ひたすら埋めていきました。その後グラフエディタで親の部分に親の列を、識別子の部分に子の列を当てはめると完成です。

コツをつかむまで少し時間がかかりましたが、個人的にポイントは組織図上のデータの階層をイメージしひたすらコピペで親子関係に当てはめていくことでした。

おわり
Edge TPUのモデルを作成するための基本的なワークフロー

![0_Btbl4v5whp9LZV3C.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448511/4ad97ca6-ec5d-7398-e7f0-780b2a33f932.png)
Edge TPUのモデルを作成するための基本的なワークフロー

Coral の開発ボードは、Edge TPU を搭載したリムーバブル System-On-Module（SOM）を含むシングルボード Linux コンピュータです。そのため、アプリケーションのプロトタイピングを行ってから、独自の端末に SOM を含めて生産用にスケールアップすることができます。Coral USB アクセラレータは、Edge TPU を対応する Linux コンピュータに接続する USB アクセサリです。Raspberry Pi Zero にちょうど合うように設計されています。

Coral は新しいプラットフォームですが、TensorFlow とシームレスに連携できるように設計されています。Coral で TensorFlow モデルを使う場合は、TensorFlow Lite を使います。TensorFlow Lite は、Edge TPU を含むエッジデバイスやスマートフォン、マイクロコントローラで機械学習推論を実行するためのツールキットです。

代理店：https://store.gravitylink.com
EC CUBE3 並べ替え機能に「お気に入り登録数順」を追加する

# テーブル mtb_product_list_order_by に項目を追加

「お気に入り登録数」の項目を追加
rankを設定

# src/Eccube/Repository/ProductRepository.php

```
// お気に入り登録数順
		} else if (!empty($searchData['orderby']) && $searchData['orderby']->getId() == 8) {
			$qb->addSelect('COUNT(cfp.id) as HIDDEN favorite'); // カウント（お気に入り登録）を favoriteに代入
            $qb->innerJoin('p.ProductClasses', 'pc');
			$qb->leftJoin('p.CustomerFavoriteProducts', 'cfp');  // leftjoin でテーブルの外部結合 どちらか片方のテーブルにデータがあればレコードが取得される。
            $qb->groupBy('p.id');
            $qb->orderBy('favorite', 'DESC'); // お気に入り登録（降順）
            $qb->addOrderBy('p.id', 'ASC'); // 品番（昇順）
```
 
カウント（お気に入り登録）をfavoriteに代入

leftjoin でテーブルの外部結合
どちらか片方のテーブルにデータがあればレコードが取得される。

以上で、商品一覧ページのドロップダウンに「お気に入り数順」が追加され、選択するとお気に入りに追加された数の多い商品順にソートされる。
[UE4]命名規則に応じたアセットリネーム

GTMF2019にてPython / BlueprintによるUnreal Engineの自動化という内容で講演いたしました。
本記事はその中で紹介した実装例、命名規則に応じたアセットリネームのサンプル公開用記事です。

発表内容については以下のスライドをご覧ください。
[GTMF2019] Python / BlueprintによるUnreal Engineの自動化
https://www.slideshare.net/EpicGamesJapan/gtmf2019-python-blueprintunreal-engine/1

アセットに対して命名規則を設けるのは大規模開発では非常に重要になってきますが、大量のアセットの中から命名規則から外れたアセットを見つけて一つ一つ修正していくのは大変です。

そこで、UE4.22から追加されたEditor Utility WidgetとBlueprintを使って簡単な命名規則修正ツールを作ってみました。

##事前準備
検証バージョンはUE4.22です。

PluginのEditor Scripting Utilitiesを有効にしておく必要があります。
![2019-07-04_18h47_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/15cb288f-5d95-d559-13bc-bad62fafd8bb.png)


##Editor Utility Widgetによるアセットリネーム
実際に動作している様子がこちらになります。
![Rename.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/cd16963b-82d1-47c4-e899-d8f7bf261de8.gif)

以下にEditor Utility Widgetの.uassetをアップしてあります。
エクスプローラでProject\Content直下に配置してください。
https://epicgames.box.com/s/w58n23w0434m8k6fnlcluvzcc2aywzq6


アセットを右クリック>Run Editor Utility Widgetを押すと起動します。
![2019-06-30_15h02_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/ec1c8632-d647-f921-52a3-045cf3f20f15.png)
リネームしたいアセットを選択した状態で、右下のRenameボタンを押すとリネーム処理が走ります。
![2019-07-10_17h52_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/e5782466-1591-524a-a92e-ae9812586a7d.png)
テキストボックスに入力されているプレフィックスは、自分好みに変更してもその通りにリネームされます。

##リダイレクタについて
アセットリネームを行うとリダイレクタというものが生成されることがあります。
![2019-07-11_14h46_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/0bb3cb89-317c-bf15-75e9-14a0650f903b.png)
これはアセットの名前が変わることで他アセットなどからの参照が途切れないようにするために生成されるものです。
普段は見えない状態になっていますが、コンテンツブラウザのFilters > other Filters > Show Redirectorsにチェックを入れることで可視化されます。
![2019-07-11_14h51_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/5b74264d-aba0-9a62-b4c2-f722a5f2ad2c.png)
そのままにしておくとリネームやフォルダ移動するごとにどんどん増えてややこしいことになってしまうので、リダイレクタは定期的に整理しておきましょう。
右クリックからFix Upで修正(リダイレクタを削除)することができます。
![2019-07-11_14h46_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/369485/a96c0a75-b92c-8ce9-5bb2-d3658774c63f.png)



##参考
[UE4]エディタ上で動作するツール・エディタ拡張をUMGで簡単に作れる Editor Utility Widget について
https://qiita.com/EGJ-Kaz_Okada/items/9f530db3b53d0fde3f20
[UE4]Editor Utility Widgetでツール・エディタ拡張を作る際のUndo/Redoの実装方法について
https://qiita.com/EGJ-Kaz_Okada/items/985b98fb934d751f4f69
シェルって何？とりあえず調べてみた。

こんにちは！
現在プログラミング勉強中のものです。
インターン先のカリキュラムの中で「シェル」について調べないといけないのでこの記事を書こうと思います！

##シェルって何？
「シェル」とは**ユーザーが打ち込んだコマンドをOSに伝えてくれる役割を持ったプログラム**のことです。
Linuxの中核には「カーネル」というものがあります。
ユーザーはシェルにコマンドを入力することで、カーネルのプログラムを実行することができます。

そこで、カーネルって何？ってなると思います。

カーネルとはハードウェアとソフトウェアの仲立ちをしてくれるOSの中核をなすものです。

このカーネルに命令を伝えるためにシェルが存在しています。

##Bash Zshの違いについて
そして、このシェルの中には種類があり、今回はBashとZshの違いについてご紹介します。

**・Bashって何？**
Bashはシェルとして使うことができます。
BashはLinuxで標準で採用されていて、shというシェルを強化したものらしいです。
また変数や関数などの機能も兼ね備えているので、ちょっとしたプログラムなら実行することもできます。

**・Zshって何？**
Zshは同様にシェルとして使用できます。
調べてみたところ、今までのシェルで導入されてきた機能を兼ね備えているものらしいです。
Bashの上位互換的存在なのでしょうか。

##TMUXって何？
最後にTMUXについて紹介します。
TMUXとは仮想端末管理ソフトウェアのことらしいです。
複数のサーバーに接続するときにはターミナルも複数起動する必要があります。
しかし、これはどう考えても生産性が悪いです。
そこで、TMUXです。
TMUXを使用することでターミナルを複数開くこともなくサーバーにログインすることができるのです。
つまり、ターミナル上での作業効率を大幅に向上させるもののようです。

##参考文献
[【初心者向け】Linuxカーネルって一体なんだ？](https://qiita.com/uguis410/items/17ec1e447e9716bfdca7)
[Shellってなに？BashとZshの違いとTmuxも](https://qiita.com/takamin3106/items/c610ec42a8ea17b91d69)
[zshとは](https://qiita.com/munazo/items/fa010d9815a04578658c)
[初心者が調べた。shellとは](https://qiita.com/ycoda/items/87d23b818cb06ba1c348)
[Bashとは](https://wa3.i-3-i.info/word11786.html)
[TMUXとは何か](http://monopocket.jp/blog/programming/1845/)
[シェルとは？Bashなどどんな種類がある？](https://academy.gmocloud.com/keywords/20170324/4010)
Cognos Analytics 11.1.3 のリリース

#Cognos Analytics 11.1.3 のリリース
2019/7/9にCognos Analytics 11.1.3がリリースされました。

マニュアルに変更点がのってますので、主たる変更点を紹介します。
https://www.ibm.com/support/knowledgecenter/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_new.doc/c_ca_nf_11_1_3_container.html

#レポート系の新機能
私としてはこれがうれしいですね。やっとかよ！感はありますが。
**11.1の視覚化、つまり以下のRAVEグラフですね、でドリルスルーができるようになった**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/eb6556e9-1e77-6a11-1cd5-0d4c69657bba.png)
https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_new.doc/c_drill_thru_11.1_viz.html

**目標値というカテゴリにアイテムを置いて、目標線を棒グラフで表示できる**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/590687ae-21d2-6a28-f7da-b84a67d66f97.png)
https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_new.doc/c_ca_nf_11_1_3_targetforbarandcolumn.html

**カスタムフィルターに検索の機能が付いた**
https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_new.doc/c_create_custom_filter.html

**レポート表示画面から直接メールを送信して共有できる**
https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_new.doc/c_ca_nf_11_1_3_share_content_by_email.html



#Cognos Analytics on CloudからオンプレのDBにSecured Gatewayで接続できる
これはクラウド版Cognos Analyticsの話ですが、お客様オンプレ環境で使用しているデータベースをCognos Analyticsのデータソースとするため、セキュアーに接続できる機能が追加されました。
詳しい設定方法はこちらのyoutube動画で紹介していますので、見てみてください。
**Accessing On-Premises Data with IBM Cognos Analytics on Cloud 11.1.2.2+**
https://www.youtube.com/watch?v=44VB1408hSU

#閲覧の機能の拡張
閲覧の機能については、過去のこちらの記事をご参照ください。
**Cognos Analytics 11.1 新機能 - 閲覧ビューの機能の紹介**
https://qiita.com/shinyama/items/d2a86dcfafbc5c483919

**Driver AnalysisとSpiralで目的変数に数値変数もカテゴリ変数も使えるようになった**
https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_new.doc/c_ca_nf_11_1_3_supportcatgoricaltargets.html

**自然言語入力で分析を提案してくれる機能で、自然言語入力時のタイプアヘッドが新機能として追加された**
https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_new.doc/c_ca_nf_11_1_3_assistant.html

**閲覧ビューの分析結果を直接ストーリーのコンテンツに変換できる**
https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_new.doc/c_ca_nf_11_1_3_stories_save_explore_as_a_story.html

#データモジュールの拡張
何点かデータモジュールに対する拡張が記載されています。
**・データアップロードの際に使ったExcelのセルに指定しているデータフォーマット(%とか日付とか)が、データモジュールにアップロードデータを取り込んだ時に、デフォルトのフォーマットとして使える。**
**・データモジュールが問題ないかチェックする「検証」の機能が改善された。**
https://www.ibm.com/support/knowledgecenter/en/SSEP7J_11.1.0/com.ibm.swg.ba.cognos.ca_new.doc/c_ca_nf_11_1_3_modeling.html
プロファイラーを使ってOculus Quest実機での性能を計測する

#はじめに
Oculus Questの実機でボトルネックになってる原因を確認したいなと思ったので、手順を残しておきます。
計測されたデータの分析については書きません。
参考：[最適化をする前に覚えておきたい技術](https://www.slideshare.net/UnityTechnologiesJapan/unite-2017-tokyo-75775983)
#前提
自分で作成したapkをOculus Questで実行できていること

#環境
・Unity 2018.3.8f1
・USBでQuestに接続

#手順
###1. Autoconnect Profilerにチェックを入れてビルド
計測したい対象のアプリケーションをビルドする際にDevelopment BuildとAutoconnect Profilerにチェックを入れてビルドします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60734/a4338358-880b-6378-1193-166d7d0b042b.png)
###2. apkファイルをQuestにインストール
作成したapkファイルをQuestに`adb install`でインストールします
###3. プロファイラの情報に接続するためのコマンドを実行
`adb forward tcp:34999 localabstract:Unity-{insert bundle identifier here}`のコマンドを実行
※1 bundle identifierはPlayer Settings → Other SettingsのPackage Nameを設定（下の図の場合com.Sample.Test）となり、`adb forward tcp:34999 localabstract:Unity-com.Sample.Test`のコマンドになる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60734/d6917d41-654d-66f9-8975-67dfc3f7234f.png)
※2 Build And Runでインストール、アプリ起動する場合は内部的にこのコマンドを実行してくれますが、私は普通にインストールしてこのコマンドを実行する方が好きです。

###4. プロファイラウィンドウを開く
Window → Analysis → Profilerを選択し、プロファイラウィンドウを開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60734/dfd49c3e-904f-f7d7-d1b6-e5018e406d30.png)

###5. アプリを実行、計測する
USBを接続したままでアプリを実行します。そしてプロファイラウィンドウのEditor → AndroidPlayerを選択します。あとは計測したいタイミングでRecordのボタンを押せば計測された情報が流れてきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60734/a3118550-96b3-d771-cdfa-5d3b8bc51cfb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60734/5d843d8a-a179-ae3b-9dd1-d4949003ea40.png)

あとはプロファイラを操作してボトルネックの箇所を特定しましょう！
Azure Kubernetes Service(既存仮想ネットワーク)をAzure CLIで構築する

Azure Kubernetes Serviceを既存仮想ネットワーク上に作成します。
ついでに、サービスエンドポイント経由でAzure SQL Databaseに繋がる環境も構築します。

# この手順で出来上がるリソース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180335/1669103e-200a-0ec9-4f27-32c528fd3db8.png)

# 環境構築

## PowerShell起動
* PowerShellでAzure CLIを実行します。Linuxの場合は適宜置き換えてください。

## Azure login

```
az login
```

## 環境変数設定

```
$RG = "[Resource Group Name]"
```

## リソースグループ作成

```
az group create -l japaneast -n $RG
```

## vNet作成

```
az network vnet create -g $RG -n [vNet Name] --address-prefix 192.168.1.0/24 --subnet-name [Subnet Name] --subnet-prefix 192.168.1.0/24
```

## vNet Service Endpoint作成

```
az network vnet subnet update -g $RG --vnet-name [vNet Name] -n [Subnet Name] --service-endpoints Microsoft.Sql
```

## ACR作成

```
az acr create -n [ACR Name] -g $RG --sku Basic
```

## サービスプリンシパル作成

* コマンド実行後に表示されるappIdとpasswordは後の手順で使います。

```
az ad sp create-for-rbac -n "[Service Principal Name]" --skip-assignment --years 10
```

## サービスプリンシパルにACRPull権限付与

```
$APP = "[appId]"
$SECRET = "[password]"
$ACRID = az acr show -n [ACR Name] --query id --output tsv
az role assignment create --assignee $APP --scope $ACRID --role acrpull
```

## Log Analytics作成
* Azure CLIでは作れないので、Azure PortalまたはARM Templateから作成します。  
[Azure ポータルで Log Analytics ワークスペースを作成する](https://docs.microsoft.com/ja-jp/azure/azure-monitor/learn/quick-create-workspace)

## Log Analytics WorkSpace ID取得

```
$WORKSPACE = az resource list -l japaneast -n [Log Analytics Name] -g $RG --query [].id -o tsv
```

## サブネットID取得

```
$SUBNETID = az network vnet subnet show -n [Subnet Name] -g $RG --vnet-name [vNet Name] --query id -o tsv
```

## AKS作成

```
az aks create `
    -n [AKS Cluster Name] `
    -g $RG `
    -s Standard_B2s `
    --node-count 2 `
    --service-principal $APP `
    --client-secret $SECRET `
    --generate-ssh-keys `
    --kubernetes-version 1.13.5 `
    --dns-name-prefix [DNS Prefix] `
    --vnet-subnet-id $SUBNETID `
    --network-plugin azure `
    --service-cidr 172.16.100.0/24 `
    --dns-service-ip 172.16.100.10 `
    --docker-bridge-address 172.16.101.1/24 `
    --workspace-resource-id $WORKSPACE `
    --enable-addons monitoring
```

## SQL Server作成

```
az sql server create -g $RG -n [SQL Server Name] -u [Admin User Name] -p [Admin User Password]
```

## SQL Server FW設定

```
az sql server firewall-rule create -g $RG -s [SQL Server Name] -n [FW Rule Name] --start-ip-address [Start IpAddr] --end-ip-address [End IpAddr]
```

## SQL Server仮想ネットワークルール追加

```
az sql server vnet-rule create -g $RG -s [SQL Server Name] -n [Network Rule Name] --subnet $SUBNETID
```

## SQL Database作成

```
az sql db create -g $RG -s [SQL Server Name] -n [SQL Database Name] --service-objective Basic
```

※ 照合順序をデフォルトから変えたい場合は、Azure PortalかARM Templateから作るしかなさそうです。
Monaco Editorでprettierをフォーマッタとして登録する

[技書博](https://gishohaku.dev)では[東京ラビットハウスというサークルでEffective React Hooks](https://gishohaku.dev/circles/G575OcbxkbvhlBzX8Bu4/)という本を出そうと執筆中のerukitiです。今回はその執筆過程ででてきたものを記事にしています。

[Monaco Editor で CMD/CTRL \+ S をセーブっぽい挙動にする \- Qiita](https://qiita.com/erukiti/items/1720711dd46a9df3d332)と関連する記事なのですが、タイトルの通りです。

## Monaco Editorにフォーマッタを登録する

```typescript
monaco.languages.registerDocumentFormattingEditProvider('javascript', {
  async provideDocumentFormattingEdits(model) {
    const prettier = await import('prettier/standalone')
    const babylon = await import('prettier/parser-babylon')
    const text = prettier.format(model.getValue(), {
      parser: 'babel',
      plugins: [babylon],
      singleQuote: true,
      tabWidth: 2
    })

    return [
      {
        range: model.getFullModelRange(),
        text
      }
    ]
  }
})
```

`monaco.languages.registerDocumentFormattingEditProvider`を呼び出して、フォーマットするコールバックを登録するだけです。

`babylon`は、Babelのパーサーの以前の名前です。そのため、`{parser: 'babel'}`を指定するのですが、プラグインの名前は未だに`prettier/parser-babylon`というのが解せないですが、そういうものです。たぶん。

ここで登録するプロバイダ関数は、編集履歴を配列に入れて返す物です。`{range: model.getFullModelRange()}`によってエディタのテキスト全体を、変換済みの`text` でリプレースするというものです。

もちろん、rangeを別のものにすれば、特定の範囲を削除、置換したり、追記したりすることができますが、インクリメンタルパーサーの仕組みとかを使っていれば話は別かもしれませんが、`FormattingEditProvider`でそういうことをする機会はあまり無いでしょう。
Show docker load progress bar over SSH

SSH上でもdocker loadのプログレスバーを表示する

## Introduction

I often load large (several gigabytes) docker images over SSH. Locally I can see progress bar saying "Loading layer". However the it is gone when docker is loaded over SSH.

## Method and Result

### Understanding internal state

Firstly I analyzed docker.sock packet. Since unix domain socket is used to communicate with docker backend, usual wireshark does not work well. So, after `sudo mv /var/run/docker.sock /var/run/docker.sock.temp`, I used two proxies to utilize wireshark `tcp.port == 10000`.

```
sudo socat UNIX-LISTEN:/var/run/docker.sock,mode=777,reuseaddr,fork TCP-CONNECT:localhost:10000
socat -v TCP-LISTEN:10000,fork UNIX-CONNECT:/var/run/docker.sock.temp
```

Then, while I `ssh localhost docker load < img.tar`, in wireshark I see `POST /v1.30/images/load?quiet=1 HTTP/1.1` packet. This indicates that quiet mode was specified even though I'm not specifying `-q`.

### Understanding the call stack

```
[backend]
components/engine/image/tarexport/load.go Load()
components/engine/daemon/image_exporter.go LoadImage()
components/engine/api/server/router/image/image_routes.go postImagesLoad()
[frontend]
components/cli/cli/command/image/load.go runLoad()
```

Now I understand that runLoad()'s `dockerCli.Out().IsTerminal()` controls the state.

### How is the terminal checked?

In components/engine/pkg/term/term.go `IsTerminal()`, I see `return tcget(fd, &termios) == 0`. If this condition becomes true, the console output should be recognized as terminal.

## Conclusion

I found that tcget is the key to get the progress bar back. But I cannot find how to achieve it yet. This is not a personal project, so (unlike [cTouch's safariextz signing date hack](https://github.com/cielavenir/ctouch/blob/master/Makefile)) custom LD_PRELOAD cannot be used. I also tried unbuffer as described in https://unix.stackexchange.com/questions/249723/how-to-trick-a-command-into-thinking-its-output-is-going-to-a-terminal , but it does not work well either. Suggestions are welcomed...

## PS

angel_p_57's method worked like a charm!
Centos7にMongoDBをインストールでReadaheadのWARNING

CentOS7にMongoDBをインストールしたら以下のWarningが出た

```
** WARNING: Readahead for /var/lib/mongodb is set to 4096KB
**          We suggest setting it to 256KB (512 sectors) or less
```

Tunedをつかって回避
```bash
vi /usr/lib/tuned/virtual-guest/tuned.conf
```
追記

```bash
[disk]
readahead=>256
```
有効
```bash
tuned-adm profile virtual-guest
```

参考にさせていただいた記事
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/performance_tuning_guide/chap-red_hat_enterprise_linux-performance_tuning_guide-tuned
https://runble1.com/centos7-wordpress-tuned/
HUAWEI MS2372(MS2372h-607) LTE USB Stick をwindows10で使う方法

# HUAWEI MS2372(MS2372h-607) LTE USB Stick をwindows10で使う方法

## 必要なもの

- HUAWEI MS2372(MS2372h-607) LTE USB Stick
- NTT DoCoMo系のSIM
  - SIMのサイズは標準SIM (microSIMやnanoSIMではないので注意)
  - 今回はSORACOMのSIMを使用
- Windows10 をインストールした端末

## 手順

1. MS2372を箱から出す
2. Ms2372に同封されているQuick StartのPage 4に従ってSIMを挿す
3. SORACOM公式からドライバをダウンロードする
    1. メーカー公式のドライバはダウンロード時に破損しやすいので非推奨
    2. リンク先は当ページ下部参考資料
4. ダウンロードしたドライバ(MS2131_Win_5.01.13.00.zip)を解凍する
5. 解凍したドライバのDriverSetup.exeを実行する
    1. 公式にはWindows7 / Windows8対応(Windows10に関する記述なし)なので、インストールに失敗する場合はDriverSetup.exeを右クリックして「プロパティ」の「互換性」タブから「***互換モードでこのプログラムを実行する*** : ***Windows8***」と「***管理者としてこのプログラムを実行する***」に設定変更を行う
6. ドライバインストール時は特に表示などはされないので、install.logがおよそ16KBになるまで待つ
    1. install.log中にエラーコードが出力されるがfile not found系は無視してよい
7. MS2372をWindows10端末の空いているUSBポートに挿す
8. 「デバイスマネージャ」を開き、「モデム」から「HUAWEI Mobile Connect - 3G Modem」を右クリックし、「プロパティ」を開く
9. 「モデム」タブを開き、「ポート : COM x」のxの値をメモする
10. TeraTermやPuttyなどのシリアル通信が可能なターミナルソフトウェアで、先ほどの「Com x」に接続する
  1. ボーレートは標準の9600でよい
  2. 「ポート(COM と LPT)」側のCom x(3G Application InterfaceやPC UI Interface)は***使用しない***
11. 公式が指定しているATコマンド2つを投入する
  1. AT+CGDCONT=0,"IP","soracom.io"
  2. AT+CGDCONT=1,"IP","soracom.io"
  3. コマンドはコピーアンドペーストでよい、コマンドが通るとOKと表示される
12. MS2372のLEDが緑色に点滅し始めるのを待つ
13. Windows10の「設定」から「ネットワークとインターネット」へと進み「携帯電話」を開く
14. APNなど必要な設定を行う
  1. プロファイル名: SORACOM Air (任意の文字列可)  
  2. APN: soracom.io  
  3. ユーザ名: sora  
  4. パスワード: sora  
  5. サインイン情報の種類: なし  
  6. このプロファイルを適用する: チェックを付ける  

## 嵌りどころ

いちばん嵌るのはドライバーのインストール。失敗したらDriverInstall.exeと同じ場所にあるアンインストーラーを管理者権限で叩いてから再度DriverInstall.exeを叩き直すこと。
DriverInstall.exeを右クリックしてプロパティを開き、互換性タブの中にある「互換モード:Windows8」と「管理者権限で実行」を忘れない事。右クリックして「管理者権限で実行」をするのではなく、プロパティのパラメータで管理者権限で実行を指定しないとうまくいかない。

あとはCOMポートの指定。COMポートは「モデム」の方のCOMポート。「ポート(COM と LPT)」側は両方とも外れ。

## 参考資料

- [SORACOM : LTE 対応データ通信端末 Huawei MS2372h-607](https://soracom.jp/products/module/ms2372h_607/)
- [SORACOM : 日本でもグローバルでも利用可能なUSBドングルタイプのLTEデバイス「MS2372-607」の取り扱いを開始しました！](https://blog.soracom.jp/blog/2018/08/17/ms2372/)
- [HUAWEIパートナー公式サイト : Drivers pour Windows (v5.01.13.00)](http://www.eurocomposant.fr/fr/Connectivite-m2m/Module-Wireless-Plug-Play/MS2131)
Git Ignoreを作成して、要らないファイルを管理させない



Git管理で、必要なファイルを纏めて管理外にするには、~/.gitignoreを作成して置くのは良いでしょう。

```Teminal:~/.gitignore
puts 'code with syntax'
# Folder view configuration files
.DS_Store
Desktop.ini

# Thumbnail cache files
._*
Thumbs.db

# Files that might appear on external disks
.Spotlight-V100
.Trashes

# Compiled Python files
*.pyc

# Compiled C++ files
*.out

# Application specific files
venv
node_modules
.sass-cache

```
Monaco Editor で CMD/CTRL + S をセーブっぽい挙動にする

[技書博](https://gishohaku.dev)では[東京ラビットハウスというサークルでEffective React Hooks](https://gishohaku.dev/circles/G575OcbxkbvhlBzX8Bu4/)という本を出そうと執筆中のerukitiです。今回はその執筆過程ででてきたものを記事にしています。

[Monaco Editor](https://microsoft.github.io/monaco-editor/)使ってますか？VSCodeのエディタ部分を切り離して公開されているOSSのエディタです。（というか、元々はMonacoが先に公開されていたような記憶）

[Ace](https://ace.c9.io/)とか、ウェブアプリケーションに組み込めるテキストエディタモジュールは色々とありますが、Monacoは頑張ればIntelliSenseを組み込んだりもできます。

Monacoの使い方自体は他の記事なりなんなりをご覧ください。

## CMD/CTRL+Sにコマンドを登録する

さて、ウェブアプリにエディタを組み込んだときに問題となるのが、「ついついクセでCMD/CTRL+Sを押してしまう」という現象です。[CyberDojo](https://cyber-dojo.org/)とかでもついついCMD+Sを押して、ウェブページの保存をしてしまいそうになることありませんか？僕はあります。

```typescript
editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_S, () => {
  editor.getAction('editor.action.formatDocument').run()
  console.log('saved')
})
```

`editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Key_S, コールバック関数)`で、色々なアプリケーションでセーブに割り当てられているショートカットキーを押したときに実行するコマンドを登録できます。

この事例では、エディタのテキストを整形する `editor.action.formatDocument`コマンドを実行しています。
Homebrew Caskで簡単にOS X アプリをインストールする


Homebrew CaskはOSX上いろんなアプリ（例えGoogle Chromeや、Dropbox等）を簡単にインストールしたり、管理できるツールです。
#### Homebrew Caskのインストール
Homebrew Caskを使いたい場合は、Homebrewを利用して簡単にインストールできます。
Homebrewのインストール方法は以下[このリンク]
(https://qiita.com/ENIX/items/39664c2936ea3cf9c13d)をご参照してください。

``` Terminal:
$ brew install caskroom/cask/brew-cask
```
もし、GoogleのChromeをインストールした場合は、以下のコマンドでインストール可能です。

``` Terminal:
$ brew cask install google-chrome
```
Homebrew-cask の更新他のパッケージの管理とまったく同じで以下のコマンドで直接更新可能です。

``` Terminal:
$ brew update && brew upgrade brew-cask && brew cleanup 
```
#### Caskのアプリを検索
必要なアプリが存在するかは、直接[caskroom.io] (http://caskroom.io/)Webサイトから検索して見てください。

#### Caskの運用事例
開発する際にはいろんなファイルプレビュープラグインがインストールされたらすごく便利ですよね？
以下、いくつのプレビューツールを纏めましたので、使えると思ったらご利用ください。

``` Terminal:
$ brew cask install qlcolorcode
$ brew cask install qlstephen
$ brew cask install qlmarkdown
$ brew cask install quicklook-json
$ brew cask install qlprettypatch
$ brew cask install quicklook-csv
$ brew cask install betterzipql
$ brew cask install webpquicklook
$ brew cask install suspicious-package
```
又、いくつのGUIアプリのインストールコマンドも追記して置くます。

``` Terminal:
$ brew cask install alfred
$ brew cask install appcleaner
$ brew cask install cheatsheet
$ brew cask install dropbox
$ brew cask install google-chrome
$ brew cask install onepassword
$ brew cask install sublime-text
$ brew cask install totalfinder
```
CentOS7にTensorFlowとKerasをインストール

機械学習の環境構築のためにTensorFlowとKerasをインストールしました．PythonのインストールにはAnacondaを使用します．

なお，使用するAnaconda，Tensorflow，Kerasのバージョンは次の通りです．
- Anaconda  ：4.4.0
- TensorFlow：1.1.0
- Keras     ：2.0.5
バージョンが異なると正しく動作しない場合があるので注意してください．




#pyenvのインストール
Anacondaをインストールする前にpyenvをインストールします．pyenvはPythonのバージョンを管理するツールであり，Pythonの2系と3系などバージョンを切り替えることができます．CentOSにはもともとPython2系が入っているので，一応pyenvをインストールしました．


```
git clone https://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc
```
#Anacondaのインストール
続いてAnacondaのインストールです．以下の方法でインストールするとPython3.6系がインストールされます．

```
pyenv install anaconda3-4.4.0
pyenv rehash
# anacondaをpythonのデフォルトに設定
pyenv global anaconda3-4.4.0
echo 'export PATH="$PYENV_ROOT/versions/anaconda3-4.0.0/bin/:$PATH"' >> ~/.bashrc
source ~/.bashrc
```

`pyenv install anaconda3-4.4.0`を実行すると

`BUILD FAILED (CentOS Linux 7 using python-build 1.2.13)
`
というエラーが出ました．このエラーは，

```
yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz
```
を実行すると回避できます．

#TensorFlowのインストール

```
conda install -c conda=forge tensorflow=1.1.0
```

#Kerasのインストール

```
pip install keras==2.0.5
```

#確認
正しくインストールができたか確認します．Pythonを対話モードで起動し，以下を記述します．

```python
>>> import tensorflow as tf
>>> import keras
Using TensorFlow backend
```

特にエラーがなく，Using TensorFlow backend が表示されれば正しくインストールできています．


#参考
- [CentOSにAnacondaをインストールしてデータサイエンスに踏み込んでみる](https://www.techbox.jp/entry/datascience-anaconda)
- [pyenv + virtualenv を使ってみる](https://goodbyegangster.hatenablog.com/entry/2016/10/04/090734)
FlutterでiOSのbuild + 実機installまでにハマったことの覚書

#はじめに
flutterから実機確認~iOSの審査までを行なったので、覚書です。
2回目以降は早そうですが、1度目なので、ちょいハマりました...。合わせてまとめてます。


##1.試しに、build iosしてみると...
```
$flutter build ios
```

![help.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/66615d04-4813-373a-acab-82bee9a07e31.png)

...と怒られる。

##2.Provisioning Profileを入れる
Runnerというプロジェクトファイルを開く

![スクリーンショット 2019-06-27 14.57.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/9a11d2a3-213a-4097-52aa-8514ed6d0395.png)

iOS developerの方の操作は、割愛。
いつものようにAppIDを作って、デバイスを登録して、ProvisioningProfileを作って、登録する流れ。

![スクリーンショット 2019-06-27 15.28.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/7e524f4f-79f0-069c-710f-96d9d9e1a8dc.png)

##3.気を取り直して、再度build ios

```
$flutter build ios
```

成功すると下記のような差分が作られる
<img width="688" alt="スクリーンショット 2019-06-27 16.12.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/5914e2a5-2bdf-0188-0302-0a22d707c68d.png">

<img width="530" alt="スクリーンショット 2019-06-27 16.12.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/4abb0cd6-1389-c166-b347-2bc307be2f13.png">

##4.実機にinstall

実機をUSBで接続して、

```
$flutter decices
```

するがデバイスが見つからず...

```
$flutter doctor
```

すると...

![スクリーンショット 2019-06-27 16.25.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/75e08e29-4652-07db-b460-bb91948988b7.png)

iOS  toolchai関連がごっそり抜けてた....
ので上から順番に実行。

```
brew update 〜 brew install ios-deploy 
```

![スクリーンショット 2019-06-27 16.44.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/ec067a05-ef33-f311-8c57-83768724aa82.png)

無事見つかった。

```
$flutter install
```

すると無事実機にinstall完了。


#そのほか Firebaseを利用していた場合..

Unhandled Exception: PlatformException(google_sign_in, Your app is missing support for the following URL schemes: com.googleusercontent.apps.xxxxx

->

Runner.xcworkspaceを開く
REVERSED_CLIENT_IDの中身をRunner->URLType(1)のURLSchemesに入れる
![スクリーンショット 2020-04-20 15.32.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43766/c2e5f04f-22cd-cf87-8934-05f4721abd37.png)
DB Browser for SQLiteでDBのデータを変更した後にブラウザ更新しても反映されない場合の対策

## 環境
Laravel Framework 5.6.26

DB Browser for SQLite
↓
Version 3.10.1
Qt Version 5.7.1
SQLCipher Version 3.15.2
 
## 状況
DB Browser for SQLite使ってデータ追加したり変更した後にブラウザ更新しても反映されない。

## 解決方法
「Open Database」選択して同じsqliteのファイルを選択し直した後に
ブラウザを更新すると、変更結果が反映されました。

逆に、laravelからマイグレーションでテーブル生成してもそのままではDB Browser for SQLiteでは反映されないので、
再度上記と同じようにsqliteファイルを選択しなおしたら反映されます。
kubernetesでpodのstatusがREADY 0/1になっててどうすればいいか分からなくて困った、というかログの確認方法が分からなかった

## はじめに
kubernetes触り始めました！！
全然興味なかったんですけどやってみると楽しいですね。
結局どんなアプリケーションを動かすかが大事だと思ってたんでインフラ系は興味ナッシンだったのですが、環境つくるの楽しい。まだはじめの一歩どころか小指の爪切ったくらいのレベルなんですけども。


で、色々チュートリアルしたりしてたんですけど、PodがRunningにならないの。。

どうすればいいか分からなくて泣いた。


## Errorログどこに出るの

私もね、一応SEなんでね、ログをみて原因を探ろうとしましたよ。
さすがにログも見ないで助けを求めちゃうようなゆとり社員じゃないですから。


<br>
<br>
###どこでログみるの！！？？###
<br>
<br>

結局ログ見ないまま先輩に聞きました。
##エラーログの出し方##
ということで学んだ内容を共有します。
kubernetesでは、ログを出すとき以下2つのコマンドが使えます。

1個目： logs 
コンテナが出力しているログを確認する方法。コンテナ内で起動してるアプリケーションに原因がある場合はこちら。

2個目： describe
podのイベントを出力する。メモリ足りない！とかマウント失敗！などのkubernetesの設定に問題がある場合はこちら。

流れとしては、問題のあるpodの名前を調べて、上記のコマンドを実行します。

まずは調べたいpodの名前を調べます。

```terminal
$ kubectl get po 
NAME                        READY   STATUS    RESTARTS   AGE
guestbook-v1-544fbbc99b-d   0/1     Pending   0          23h
```

**poはpodの短縮名称です。**短縮名知ったら使いたくなる。
上記の例だと、**guestbook-v1-544fbbc99b-d** がpodの名前です。


podの名前が分かったので、describeないしlogsコマンドでログをGETできます。

```terminal
$ kubectl describe pod guestbook-v1-544fbbc99b-d 
$ kubectl logs guestbook-v1-544fbbc99b-d47t5
```

describeの場合は、リソースタイプを指定する必要があるので、pod [pod名]と指定する必要があります。
pod以外でも、リソースタイプを指定すればログをとれます。

```terminal
$　kubectl describe pv pv名
$　kubectl describe svc サービス名
```
などなど。
##参考
エラーの原因がわかった後は、以下の記事を参考に解決すると良いかも。
[Kubernetesのポッドが起動しない原因と対策](https://qiita.com/minodisk/items/547741b73763f2bab6b8)

##さいごに
kubernetes楽しい。名前変だし勝手に避けてたけど、だんだん名前もかっこよく思えてきた。
けどやっぱり、開発のが楽しいかな。。
どこで動かすかより、何を動かすかのが大事だよね。。
一生畑を耕して、野菜植えないみたいなことにはなりたくないので、私は耕し屋さんではなく、野菜を育てるところまで頑張って、立派な農家を目指したいと思います！！
清華大学の科学研究におけるWebスクレイピングの役割

2017年から、[Octoparse](https://www.octoparse.jp/)は清華大学と共同で社会科学および経済関連分野の科学研究を行っています。清華大学の中で、経済研究所は社会科学部およびデータサイエンス研究所と連携して、インターネットから有用なデータを収集し分析することを目的とした「iCPI研究グループ」と呼ばれる共同研究チームを組織して、研究活動を行います。Octoparseがビッグデータを大規模に収集し、清華大学はビッグデータを分析することによって、社会に適用される可能性のある行動を説明するために、科学法と理論を確立しようとしています。

#iCPI研究に関する基本紹介 

##iCPIとは？

iCPIはインターネットベースの消費者物価指数です。経時的な生活費の追跡に使用される通常のCPIと比べて、iCPIは、リアルタイムのオンラインデータに基づいて、数十億のオンラインマーチャント取引における消費者の行動と急激な価格変動を調べることによってインフレを予測するように設計されています。 

##期待される結果：

Octoparseの力を借りて、清華大学のiCPI研究チームはプロジェクトに専念することを可能にし、重要な進歩を遂げました。リアルタイムのiCPIインデックス分析により、財務、経済データアナリスト、学校の研究者はデータを簡単に参照することができます。
![icpi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/c46a115a-55db-36b0-1235-2599655a3aeb.png)
 

#研究の手順：

 
##ステップ1：変数を定義する

中国国家統計局（NBS）によると、CPIバスケットには8つの主要なカテゴリーがあります。食物、アルコール＆タバコ、住居、衣類、交通＆通信、健康、家庭用耐久財＆サービス、教育＆娯楽、その他のカテゴリです。各カテゴリーに含まれるサブコンポーネントもあり、例えば食品カテゴリーの穀物、豚肉、野菜のサブコンポーネントなどです。


清華大学の研究グループは、複数のプラットフォームで最大のオンライン市場シェアを持つ、販売価格の安定したカテゴリとサブコンポーネントを選択する必要があります。
 

##ステップ2：データを収集する

iCPIの調査研究は、通常のCPIの研究とは異なります。実験の実施、参加者の観察、調査、既存のリソースなど、従来の方法ではデータを収集することはできません。清華大学の研究チームは、マクロ経済の判断基準として信頼できるiCPIパターンを生成するために、インターネット上の価格と商品に関する大量の情報を必要としています。したがって、データの収集は、手動のコピペは無理で、自動Webスクレイピングの形式で行う必要があります。

 

##ステップ3：相関分析

iCPI
カテゴリー
サブコンポーネント
 

##ステップ4：指数計算

毎日インデックス
毎週インデックス
毎月インデックス
 

#Octoparseが選ばれる理由

iCPIの研究チームは研究を支援するために大量のデータを必要とします。それに研究メンバーがこのような量のデータを入手するには相当難しいです。

この作業に、コードを書くことを含む高度なデータ分析スキルが必要です。プログラミングのスキルが不足している研究メンバーにとっては困難な作業になります。

それに、データ収集のプロセスにおける量、質、効率、そして自動化を考える必要があります。スクレイピングが速すぎる場合、Webサイトがそれ以上のスクレイピングをブロックするための防止メカニズムを設定する可能性が非常に高いです。

結果として、チームメンバーがコーディングなしでスクレイピングできるようにし、同時にブロックすることを防ぐことが必要です。


Octoparseは、コードを1行も書かずにブロック防止機能を備えたWebスクレイピングツールです。他のスクレイピングツールと比べて、Octoparseは以下の特徴を持っています：

1. Octoparseの最も目立つ機能は[スクレイピングテンプレート](https://www.octoparse.jp/blog/a-revolutionary-web-scraping-software-to-boost-your-business-easier/)です。ソーシャルメディア、Eコマース、google scholar、金融などを含む12の異なるカテゴリをカバーするテンプレートが45個あります。
![タスクテンプレート.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/bc154801-9352-ec8f-b508-444667ab5c80.gif)

2. 内蔵ブラウザ：Web閲覧プロセスをシミュレートすることで、スクレイピングプロセスを視覚化します。そのため、Webページ構造についての知識がまったくない人は、Webスクレイピングを実行するために大量のHTMLコードを処理する必要はありません。

3. IPローテーション：1つのWebサイトから大量のデータを取得する予定の場合は、IPアドレスを頻繁に変更する必要があります。これは、Webサイトが1つのIPアドレスから発生した異常な動作を検出し、同じIPアドレスからの過剰なリクエストを禁止するためです。IPローテーションは、IPプロキシを自動的に切り替えるように設計されているため、追跡されるやアクセス拒否される可能性は最小限にされます。

4. ユーザーエージェントの切り替え：ユーザーエージェントは、ブラウザがWebサイトにリクエストを送信するために使用される名前タグです。Webサイトによっては、あるユーザーエージェントがWebサイトへのアクセスを許可されていないこともあります。Octoparseはこのような状況を避けるために9つのユーザーエージェントを提供しています。 

5. Cookieの自動削除：抽出プロセスを加速することができます。
![block.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/1b2e00dc-3551-c566-d2d0-474656c58aa0.png)




#まとめ
Octoparseはリリースされて以来、学校や教育機関を支援し、学割プログラムを実施しています。学割といえど在学中の学生だけでなく、教員の方も対象です。学割を申し込むには、学校名や学生証の提示、教育機関専用のメールアドレスが必要となります。対象となる方は学生・教職員価格で購入して、割引を受けましょう。
Mac にHomebrew を導入する

[Homebrew](https://brew.sh/)はMacのOSXなか一番人気が集まっているパッケージ管理ツールである。
### 事前準備：
Homebrewのインストールには、Xcode Command Line Toolsのインストールが必要
もしXcode Command Line Toolsがインストールがインストールされ中たら以下のコマンドでインストールして置きましょ

```terminal:
xcode-select --install
```
### インストール：
Homebrewは以下のコマンドで直接インストールできます。

```terminal:
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
次に/usr/local/binを$PATH環境変数に追加するのを忘れましょう

```terminal:
$ echo 'export PATH="/usr/local/bin:$PATH"' >> ~/.bash_profile
```
上記、手順が終わったら、以下のコマンドでHomebrewが正しくインストールされている事を確認しましょう

```terminal:
$ brew doctor
```
### 使用方法：
あるパッケージをインストールしたい場合は簡単に以下ようにコマンドを叩きます。

```terminal:
$ brew install <package_name>
```
もし、Homebrewのパッケージリストを更新したい場合は

```terminal:
$ brew update
```
インストールされたパッケージに更新が必要なパッケージがあるかないか確認するには

```terminal:
$ brew outdated
```
パッケージ名を指定して更新したい場合は

```terminal:
$ brew upgrade <package_name>
```
キャッシュされた古いパッケージをクリアするには

```terminal:
$ brew cleanup
```
インストールされたパッケージのリストとパージョンを確認するには

```terminal:
$ brew list --versions
```

以上、Homebrewのインストール方法と簡単な運用方法を纏めました。

>iOS、Androidアプリの制作なら、hq7781@gmail.comまで、
>法人並みに、信頼且つ満足できる製品を納品いたします
TRN-pytorch をローカルで動かしてみた

# はじめに
人の動きを動画から判別したかったので、試しにTRN-pytorchをローカルで動かしたかったが、躓いてしまったので、参考になればと。
実際Google ColabとかGPUがある環境で動かせばすぐに動いたんじゃないかなとは思うが。。。

# 準備
gitからTRN-pytorchをダウンロードして、必要なモジュールをインストール

```
git clone --recursive https://github.com/metalbubble/TRN-pytorch
cd TRN-pytorch/pretrain
./download_models.sh
cd ../sample_data
./download_sample_data.sh
```
# 実行
いざ実行

```
./test_video.sh
```
動かない...。

```
RuntimeError: Error(s) in loading state_dict for InceptionV3:
        size mismatch for conv_batchnorm.weight: copying a param with shape torch.Size([1, 32]) from checkpoint, the shape in current model is torch.Size([32]).
        size mismatch for conv_batchnorm.bias: copying a param with shape torch.Size([1, 32]) from checkpoint, the shape in current model is torch.Size([32]).
        size mismatch for conv_batchnorm.running_mean: copying a param with shape torch.Size([1, 32]) from checkpoint, the shape in current model is torch.Size([32]).
        ...
```
長々とsize mismatchと出ます。調べたら以下に載っていました(https://github.com/metalbubble/TRN-pytorch/issues/10) 。
まず、[ここ][link-1]からダウンロードします。
[link-1]:http://data.lip6.fr/cadene/pretrainedmodels/bn_inception-52deb4733.pt
ダウンロードしたものをTRN-pytorch/model_zoo/bninception/に配置し、TRN-pytorch/model_zoo/bninception/pytorch_load.py の35行目を修正します。


```pytorch_load.py
# self.load_state_dict(torch.utils.model_zoo.load_url(weight_url))
new_state_dict = {}
temp2 = torch.load('model_zoo/bninception/bn_inception-52deb4733.pth')
for k, v in temp2.items():
    if(k.split(".")[0] == 'last_linear'):
        new_state_dict['fc.' + k.split(".")[1]] = v
    else:
        new_state_dict[k] = v
self.load_state_dict(new_state_dict, strict=False)
```
修正し、実行

```
RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_location='cpu' to map your storages to the CPU.
```
エラーは変わった。ローカルなのでcudaは確かにいらない。エラー通りに修正。
今回はTRN-pytorch配下のtest_video.py の107行目を修正。

```test_video.py
checkpoint = torch.load(args.weights, map_location='cpu')
```

そろそろ...

```
AssertionError: Torch not compiled with CUDA enabled
```
はい、cudaね。test_video.pyの110行目と134行目に.cuda()があるので、.cuda()だけを削除し、再び実行。

```
Multi-Scale Temporal Relation Network Module in use ['8-frame relation', '7-frame relation', '6-frame relation', '5-frame relation', '4-frame relation', '3-frame relation', '2-frame relation']
Freezing BatchNorm2D except the first one.
Loading frames in sample_data/juggling_frames
RESULT ON sample_data/juggling_frames
1.000 -> juggling
0.000 -> catching
0.000 -> balancing
0.000 -> spinning
0.000 -> performing
```
結果が出力されましたね。
Google Colabとかでやれば、はじめの修正だけでいけると思います。後日やってみたいと思います。
JS  ES6のクラスの基本をまとめてみる。part1




#クラスについて
クラスとはオブジェクト（データ）を作成するための設計図

```main.js
class Data{   //クラス名は大文字で表記
  
}
```

#インスタンス
クラス内指定されたオブジェクトのこと,
newでインスタンスを指定する

```main.js
class Date{

}
 const data = new Data();
console.log(data);
```
クラスに処理の仕方をなにも指定していないので、空のオブジェクトData{}が出力される

#コンストラクター
インスタンスに処理を指定すためのもの、クラス内にconstructor(){}と記述する。

```main.js
class Date{
    constructor(){
     console.log("イチロー")　//➀
 }
};
const data = new Data();　　//➁　➀が実行されコンソール画面に"イチロー"と出力
```
コンストラクターはインスタンスが読み込まれた瞬間に実行される。


###まとめ
プロゲートで学んだクラスの基礎まとめてみました。
プロゲートから察してもらって構わないが、筆者である自分はまだプログラミング2か月の初心者で、自分の理解度向上のために記事を書いているので、参考にはしないでほしい。
NuxtとStorybookで.sassを使う

Parcelばっかり書いてて久しぶりのWebpackに戸惑った。

ちゃんと`indentedSyntax`指定しないと`<style lang='sass'>`指定でもエラーが出る。

```webpack.config.js
// 略
config.module.rules.push({
  test: /\.sass$/,
  loaders: [
    'style-loader',
    'css-loader',
    {
      loader: 'sass-loader',
      options: {
        indentedSyntax: true
      }
    },
  ],
})
//略
```

## 参考にさせていただいたサイト

[Nuxt.jsへのStorybookの導入と、Sassの変数や共通CSSを読めるようにする設定 - tacamy--blog](http://tacamy.hatenablog.com/entry/2019/05/27/113131)
"-(ハイフン)"在りのシートを他シートから参照する

## 経緯

エクセルで他シートのセルを参照しようとしたところいつも通り記載したらエクスプローラが起動したので備忘もかねて投稿。

## TL;DR
- シングルクオーテーション''で該当シート名を囲ってあげる
- 書き方

```
='シート名'!セル名
```

## 記載例

### シート名に - が含まれない場合

- 参照元
![ref01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198480/a95ba568-d129-8e27-5f60-6411776c9339.png)

- 参照先
![ref02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198480/f3482d8c-9e6e-7d27-ace3-d334e0d723c9.png)


### シート名に - が含まれる場合

- 参照元
![ref03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198480/e48596cc-22b6-ad68-f0b2-78e920f79be2.png)


- 参照先

![ref04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198480/5ec3ac7c-9ea1-0ef4-9090-8b8cd35cb2dc.png)
JavaScript～コールバック関数の基礎



#JavaScript～クラスの基本
コピペして使ってください。
ES6を対象としています。

###コールバック関数
```javascript:sample.js
//関数の定義
const greet = () => {
  console.log("Hello");
};

const call = (callback) => {
  console.log("コールバック関数の呼び出し");
  callback();
};

//関数の呼び出し
call(greet);
```
```console
(出力結果)
コールバック関数の呼び出し
Hello
```

###コールバック関数（引数つきの関数を渡す）
```javascript:sample.js
//関数の定義（コールバック時に引数を渡す）
const call = (callback) => {
  callback("John", 14);
};

//関数の呼び出し（関数を引数にもつ）
call((name, age) => {
  console.log(`${name}は${age}歳です。`);
});
```
```console
(出力結果)
Johnは14歳です。
```
デザインスキル皆無のバックエンドエンジニアがポートフォリオ作ってみた


表題のとおりですが現在WEB制作現場に在籍していて主な業務内容はバックエンド実装というデザインスキルが乏しい私が試行錯誤しながらポートフォリオサイトを作成、公開するまでの道のりをここに記させて頂きます。

## Links
~~LINK~~
~~GitHub~~
※現在公開を停止しています。

## Program
* HTML
* CSS
* JavaScript

## Library&Framework
* [itypedjs](https://mattboldt.com/demos/typed-js/)
* [jQuery](https://jquery.com/)
* [chartjs](https://www.chartjs.org/)
* [fakeloader](http://joaopereirawd.github.io/fakeLoader.js/)
* [jquery.matchheight](http://brm.io/jquery-match-height/)
* SVG-Car-Drift-Loader
* [materialize.css](https://materializecss.com/)

## Tools
* [Git](https://git-scm.com/)
* [GitHub](https://github.co.jp/)

## 事前準備

### コーディングフレームワークの選定
1からコーディングするのは作業日数的な問題等があったのでまずフレームワークの選定から入りました。
色々探してみた結果Bootstrapかmaterialize.cssで迷いました。
どちらもシンプルな実装が可能でポートフォリオサイトに最適なので、かなり悩んだのですがBootstrapは過去に実装経験があったので今回はmaterialize.cssを選択しました。

### 公開方法の選定
ポートフォリオサイトなので外部に公開しなければ自己満足で終わってしまうと思い

* GitHubPages
* Netlify
* Heroku
* レンタルサーバー
* AWS

上記5つで考えた結果コード管理をGitHubで行う予定だったのでそのままGitHubPagesを採用しました。
(GitHubPagesでポートフォリオ公開しているエンジニア様が多かったってのもあります。)
公開方法に関しては下記の記事参考にさせて頂きました。
[GitHub Pages を使った静的サイトの公開方法が、とても簡単になっていた](https://www.tam-tam.co.jp/tipsnote/html_css/post11245.html)

### バージョン管理フローの選定
GitHubを普段から使用していたので大まかなフローは
ローカルで作業->リモートにpush
だったのですが
[未経験がWeb系転職成功したいならgithubでissue管理して開発しよう](https://qiita.com/fukubaka0825/items/c7710b4e87d478c8ba3b)
を読みましてどうせならbranch切ってissue管理しようと試みました。
正確には作業中盤からissue管理を行いましたが、Gitにおけるプルリクエストに関する理解が深まり大変良い経験が出来ました。
(諸々の事情でmasterに直接コミットしているログがあるのは内緒です。。。)

<img width="1038" alt="Qiita01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323216/49f5b3c5-46cf-122a-f18d-98bb24a08321.png">


### ワイヤーフレーム＆仕様書の作成
正直に言います………
**作成してません**
理由としては

* 大体のイメージがあった(シンプルかつ単ページのサイト)
* ページ内の動きは調べて勉強がてら実装しようという甘い試み

ですが振り返るとある程度の実装内容を決めておかないと「あれもしたいこれもしたい状態」になりサイト完成が異常に延期されます。
また主にCSS JavaScriptの構造が乱れる原因になります。
上記の理由でこれからポートフォリオ作ってみようという方はある程度の実装内容を定めた上で作業される事をおすすめします。

## 作業フロー
### materializecssテンプレートを理解
フレームワークを使用する際にまずは独自の文章構造の理解から入ったほうが良いかと思いテンプレート内の記述を閲覧して慣れる事から始めました。

[テンプレート置き場](https://materializecss.com/getting-started.html)

<img width="1354" alt="Qiita02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323216/77443737-7e80-4b50-a4c5-9869cbfb45a3.png">


これによりmaterializecssに最初から搭載されているクラスの役割の理解やスムーズなレスポンシブコーディングが行えました。

### 大まかなレイアウトを決める
今回は大きく分けて

* TOP画面
* 自己紹介エリア
* スキルグラフエリア
* 制作物エリア
* コンタクトエリア
で考えました。
あまりページの長さを長くしすぎるのは避けたかったので「お問い合わせフォーム」等は入れませんでした。

### コーディング
各々のエリア内に入れる要素を考えながらコーディングを行いました。
特に気合を入れたのがTOP画面のタイプライターアニメーションです。

![Qiita03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323216/b54a1c2a-a357-069e-49e4-d50254ce496b.gif)

ローディングアニメーション
↓
タイプライターアニメーション
↓
ナビをフェードイン
は気に入ってる動きです。

### 不具合対応
実装しては検証して実装しては検証してと作業を行っていたのですがある程度作業が完了したあとにデバッグしてみると
レイアウトのズレやユーザビリティの低さが浮き出てきたのでGitHubでissue作成して１つずつマージしていきました。

### 公開作業
事前準備で選定していたGitHubPagesで公開して完了です。
[公開方法の選定](#公開方法の選定)

## 振り返り
ポートフォリオ作成するに当たって「自分がどれくらいのスキルを有しているのか」や「今までの生き方」などの振り返りを行えました。
単純にポートフォリオという成果物、というだけではなく今後の課題や成長につながる経験が出来たと思います。
長々とご閲覧頂きありがとうございました。
JavaScript～配列の基本


#JavaScript～配列の基本
コピペして使ってください。
ES6を対象としています。

###配列に追加（pushメソッド）
```javascript:sample.js
//配列の定義
const characters = ["a", "b", "c"];
// pushメソッドを使って配列の最後尾に追加
characters.push("d");
```

###配列の繰り返し処理（forEachメソッド）
```javascript:sample.js
//配列の定義
const characters = ["a", "b", "c"];
// forEachメソッドを使って、配列charactersの中身をすべて出力
characters.forEach((character)=>{
  console.log(character);
});
```

###条件にあう１つ目の要素を取り出す（findメソッド）
```javascript:sample.js
//配列の定義
const numbers = [1, 3, 5, 7, 9];

// findメソッドを使って3の倍数を見つける
const foundNumber = numbers.find((number)=>{
  return number%3===0;
});
console.log(foundNumber);
```

###条件にあう全ての要素を取り出す（filterメソッド）
```javascript:sample.js
//配列の定義
const characters = [
  {id: 1, age: 14},
  {id: 2, age: 5},
  {id: 3, age: 100}
];

// charactersから20歳未満を取り出す
const underTwenty = characters.filter((character)=>{
  return character.age<20;
});
console.log(underTwenty);
```

###新しい配列をつくる（mapメソッド）
```javascript:sample.js
//配列の定義
const names = [
  {firstName: "Kate", lastName: "Jones"},
	{firstName: "John", lastName: "Smith"},
	{firstName: "Denis", lastName: "Williams"},
	{firstName: "David", lastName: "Black"}
];

// 定数namesにmapメソッドを使って新しい配列を作る
const fullNames = names.map((name)=>{
  return name.firstName + name.lastName;
});
console.log(fullNames);
```
【Basic認証】設定方法

# ベーシック認証とは
基本認証とも呼ばれる最も簡単な認証方法の一つで、Base64という64種類の英数字（A-Z、a-z、0-9）のみを使用して設定を行うので改ざんが容易である。
セキュリティ面では問題がある為、重要でないテストページ等に使用する。
## 使用方法
設定は.htaccessファイルと.htpasswdファイルを作成し認証をかけたいフォルダに置く。
（Macでは先頭に.が付くファイルは不可視扱いされるので、ショートカットキーのcommand + shift + .(ドット)で可視化しておくと分かりやすいかと思います）
## .htaccessファイルの設定
```
AuthUserFile /home/◯◯◯◯/◯◯◯◯/public_html/.htpasswd
AuthGroupFile /dev/null
AuthName "Secret Area"
AuthType Basic
require valid-user
<Files ~ "^.(htpasswd|htaccess)$">
    deny from all
</Files>
```
AuthUserFile
Basic認証するためのユーザーとパスワードを管理するファイルのパスを指定。
もしうまく認証されない場合はパスが間違っている可能性が高いです、サーバー情報で確認してください。

AuthGroupFile
グループごとのアクセスを許可する指定、/dev/nullは設定しないという意味。

AuthName 
Basic認証時のダイアログに表示される文字列。日本語は文字化けするので日本語以外を使用する。

AuthType
BASICと指定することでBasic認証となる(Digestもある)

require 
valid-userを指定すると、すべてのユーザーに対してBasic認証をかける。

## .htpasswdファイルの設定
```
aaaa:17i2JUPq3H.L2
```
ID名:PWで設定します。
上記の例ではaaaa:appleでパスワードを生成しました。
パスワードを生成する時は[パスワード暗号化ツール](http://www.luft.co.jp/cgi/htpasswd.php)を使用しました。

これで該当のフォルダ内のファイルを閲覧するときはIDとパスワードの認証が行われます。
パスワードは.htpasswdに記述したコードではなく、最初に自分の考えたパスワード(例ではapple)を使います。

## あとがき
以上、今回はBasic認証についてまとめてみました。
パスの書き方は結構間違いやすいので注意した方が良さそうですね、、:japanese_ogre:
OculusGo/Questのアプリを外部から無線で立ち上げる方法

イベントのデモなんかで体験者にアプリ起動方法を説明するのがメンドイので、なんとかできんかなぁと思ってたら普通にできたので、残しておきます。

## 準備
Oculus Go / QuestとPCをUSBで有線接続し、adbを実行できる状態にしておきます。
adbを実行するための環境はこれを読んでる方なら大体終わってると思うので割愛します(ネット上にいくらでも書いてあるし)

## adbコマンドを打ち込んでいく

### 1. デバイスのIPアドレスを取得


```cmd.bat
adb shell ifconfig wlan0
```

出力に"inet addr:192.168.x.x"みたいなのが出るのでそれがデバイスのIPアドレスです。
↓で使うのでコピーしておく。

### 2. TCP/IP接続

```cmd.bat
adb tcpip 5555
adb connect 192.168.x.x:5555
```

上記connectが成功するとwifi経由でデバイスに対してコマンドを送れるようになったので、PCとデバイスのUSB接続を切断しておｋです

### 3. 実行するアプリケーションのパッケージ名を取得する

``` cmd.bat
adb shell pm list package
```

これはビルド時に自分で命名しているので、わかっている場合は飛ばしておｋ。
売り物のアプリでパッケージ名が分かりませんってな時にでも使ってください。
上記を実行するとデバイス内にインストールされたパッケージ名の一覧がドバーっとでるので
その中からお目当ての物を自力で探してください。

### 4. 実行するアプリケーションのクラス名を取得する

``` cmd.bat
adb shell pm dump パッケージ名
```

上記を実行すると、これまたドバーっと色々情報が表示されて嫌になりますが、見るのは上記を実行した行の上から5行目辺りだけ。

``` cmd.bat
adb shell pm dump パッケージ名
DUMP OF SERVICE package:
  Activity Resolver Table:
    Non-Data Actions:
        android.intent.action.MAIN:
          xxxxxxx パッケージ名/クラス名 filter xxxxxxx // ←ここ
            Action: "android.intent.action.MAIN"
            Category: "android.intent.category.INFO"
            AutoVerify=false
```

上記の「パッケージ名/クラス名」の部分に書かれている文字列をコピペしておいてください↓で使います。filter xxxとかは要りません。
ちなみに、クラス名はUnityでOculusGo/Quest向けにビルドしている場合は`com.unity3d.player.UnityPlayerActivity`になります。
なので、毎回この手順が必要というわけではないです。

### 5. アプリを実行する

``` cmd.bat
adb shell am start -n パッケージ名/クラス名
``` 

はい。これでOculusGo /Quest でアプリを外部から無線で立ち上げられたはずです。ヤッター

### 6. アプリを終了する

```
adb shell am force-stop パッケージ名
```

上記でアプリを強制終了できる
virtualenvwrapperで仮想環境を作成してからjupyter kernelに追加するまで

# 目的
virtualenvwrapperを用いて作成した仮想環境をjupyterで利用するために必要な手順をまとめました．
（仮想環境の作成部はvirtualenvやvenvで行っても問題ありません．ただ，ここではvirtualenvwrapperのコマンドのみを記載します．）
（ここではjupyter notebookを扱っていますが，jupyter labなどでも同様の手順でカーネル追加できるはずです．）

# 想定環境
* （何らかの環境に）jupyter (notebook) がインストール済
* virtualenvがインストール済
* virtualenvwrapperがインストール済

# 手順
## 仮想環境の作成
root環境のインストール済パッケージを用いる場合

``` shell
$ mkvirtualenv --system-site-packages --python=python3 hoge_env
```

root環境のインストール済パッケージを**用いない**場合

``` shell
$ mkvirtualenv --no-site-packages --python=python3 hoge_env
```

## 仮想環境への`ipykernel`のインストール
もし仮想環境に入っていない場合は，仮想環境に入ります．

``` shell
$ workon hoge_env
```

その後，`ipykernel`をインストールします．

``` shell
(hoge_env) $ pip install ipykernel
```

## jupyterへのカーネル追加

``` shell
(hoge_env) $ ipython kernel install --user --name=hoge_env
Installed kernelspec hoge_env in <new kernel path>
```

# カーネル追加の確認
カーネルに追加できているか確認する場合，jupyter notebookを立ち上げる環境（自分の場合root環境）でカーネルのリストを確認します．

``` shell
$ jupyter kernelspec list
Available kernels:
  hoge_env    <kernel_dir_path>
  ...
```
この`<kernel_dir_path>`はカーネルの情報が格納されたJupyterによって作成されたディレクトリです．

また，正しく想定した仮想環境のカーネルが追加されているかどうか確認するためには，各カーネルのディレクトリ内にある`kernel.json`を確認します．

``` json:(kernel_dir_path)/kernel.json
{
 "argv": [
  "<home_path>/.virtualenvs/hoge_env/bin/python3.6",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "display_name": "hoge_env",
 "language": "python"
}
```
この`"argv"`の一行目はkernelの実行に使う環境のpythonのパスを表しており，環境`<home_path>/.virtualenvs/hoge_env/`がkernelに追加しようとした仮想環境と一致しているかどうか確認してください．

### `kernel.json`に記されたｐｙthonのパスの環境が追加したい仮想環境と異なる場合

`kernel.json`に登録されるpythonのパスは，先ほど

``` shell
(hoge_env) $ipython kernel install ...
```

と実行した際にipythonが依存するpythonのパスとなります．
そのため，カーネル登録に用いる`ipython`が正しく仮想環境にインストールされた`ipython`であることを確認してください．

``` shell
(hoge_env) $ which ipython
# OK: <home_path>/.virtualenvs/hoge_env/bin/ipython
# NG: /usr/local/bin/ipython
```

このような症状は，新しく仮想環境を作成した際に新たに`ipykernel`のインストール

``` shell
(hoge_env) $ pip install ipykernel
```
をし忘れた場合に起こりがちです．


## jupyter notebookの起動
jupyterを起動したい環境でjupyter notebookを起動します．

``` shell
$ jupyter notebook
```

以上の手順で，各notebookから`Kernel -> Change kernel`で仮想環境も指定できるようになっているはずです．


# （番外編）
## jupyterからのカーネルの削除
[カーネル追加の確認](#カーネル追加の確認)と同じ手順でjupyterに追加されたカーネルのディレクトリ(`<kernel_dir_path`)を調べ，そのディレクトリを削除するだけでOKです．

## 作成した仮想環境の削除
一旦

``` shell
(hoge_env) $ deactivate
```
によって仮想環境から抜けた後，

```
$ rmvirtualenv hoge_enc
```
で仮想環境が保存されたディレクトリを削除します．