OmniAICreator/Qiita-1.07M huggingface dataset:
Understanding the 3D Layout of a Cluttered Room From Multiple Imagesを読み解く

*スマートフォンで撮影した画像から3Dモデルを作りたかった(自分が実装するわけではない)(そしてその内容をさらっと理解しておきたかった)時に概要を把握するために読んだ論文の内容を**非常に簡単に**まとめておきます*
[Understanding the 3D Layout of a Cluttered Room From Multiple Images](http://cvgl.stanford.edu/papers/bao_wacv2014.pdf)


今回は~~忙しいので~~概要把握に努めることを目的にAbstract(要旨)とConclusion(結論)について書いていきます。

-----


### 今回扱う論文について
今回扱う論文は2014年にスタンフォード大学から発表された論文で、題名の通り雑然とした部屋における３Dレイアウトを把握するというものです。

この論文は2018年4月に発表された、単一のRGB画像から区分平面深度マップを復元するディープニューラルネットワーク(DNN)を提唱する論文[Plane Net](https://arxiv.org/pdf/1804.06278.pdf)にも応用されています。

-----



### Abstract(要旨)
*We present a novel framework for robustly understanding
the geometrical and semantic structure of a cluttered room
from a small number of images captured from different viewpoints.
The tasks we seek to address include: i) estimating
the 3D layout of the room – that is, the 3D configuration of
floor, walls and ceiling; ii) identifying and localizing all the
foreground objects in the room. We jointly use multiview geometry
constraints and image appearance to identify the best
room layout configuration. Extensive experimental evaluation
demonstrates that our estimation results are more complete
and accurate in estimating 3D room structure and recognizing
objects than alternative state-of-the-art algorithms.
In addition, we show an augmented reality mobile application
to highlight the high accuracy of our method, which may be
beneficial to many computer vision applications.*

これから、異なる視点で撮影された少ない画像から幾何学的および他の方法によって意味付けされた部屋の構造を理解する強力な新しいフレームワークを提示します。ここで取り組むべき課題には以下が挙げられます。

1.部屋の3次元レイアウト、すなわち床・壁・天井などの配置の推定。

2.部屋の前景に見える全てのオブジェクトの特定。

本論文では多視点の幾何学的な制約と最適な部屋の配置を特定する画像の外観を連携的に使用します。多方面にわたる実験評価が、私たちの推定結果が部屋の3次元構造の推定とオブジェクトの認識において他の最先端アルゴリズムより完璧に近く正確であることを示しています。さらに、ここで私たちが述べる方法の高い精度を強調するために多くのコンピューターヴィジョンアプリケーションで有用であると思われるARアプリケーションを示します。

-----



### Conclusion and future work(結論と今後について)
*In this paper, we proposed a multiview framework to solve
the cluttered room understanding problem. Our solution can
be executed efficiently using a standard computer system. Experiment
results demonstrate that our method produces more
complete and accurate result in estimating room layout and
foreground objects than alternative state-of-the-art methods.
A mobile phone application is given to demonstrate our superior
estimation results have great potential to enable new
markerless augmented reality applications.*

本論文では、雑然とした部屋を把握するという問題を解くために多視点フレームワークを提示しました。私たちの解決策は標準的なコンピューターシステムを用いて効果的に実行することができます。他の最先端のアルゴリズムより私たちの方法が部屋のレイアウトと前景にあるオブジェクトの推定においてより完璧に近く精度が高いということは実験結果が示しています。また我々の優れた推定結果が新しいマーカーレスのARアプリケーションを可能にする大きな可能性を秘めていること実証するため携帯電話向けのアプリケーションが提供されています。

-----



### 最後に
高精度のRGB-D画像ではなく、点群データが取れないような一般的な携帯デバイスから撮影したRGB画像からセマンティックセグメンテーションによって3Dモデルが高い精度で精製できれば今後、部屋に限らずシミュレーションやモデルが必要となる分野で活用できそうです。
Real-time 3D Scene Layout from a Single Image Using Convolutional Neural Networks

またまたSLAMのお話。単眼カメラから3次元のレイアウトを把握するためのもので、人間が歩いているときに物体を認識するようなことを人間が行うの同様にリアルタイムで（歩きながら）ロボットでも行いたい場合などに役立ちます。人間の目は左右に一つずつ合計2つありますが一つの単眼カメラから同様のことをします。

## Abstract
>We consider the problem of understanding the
3D layout of indoor corridor scenes from a single image in
real time. Identifying obstacles such as walls is essential for
robot navigation, but also challenging due to the diversity in
structure, appearance and illumination of real-world corridor
scenes. Many current single-image methods make Manhattanworld
assumptions, and break down in environments that do
not meet this mold. They also may require complicated handdesigned
features for image segmentation or clear boundaries
to form certain building models. In addition, most cannot run
in real time.
In this paper, we propose to combine machine learning with
geometric modelling to build a simplified 3D model from a
single image. We first employ a supervised Convolutional Neural
Network (CNN) to provide a dense, but coarse, geometric class
labelling of the scene. We then refine this labelling with a fully
connected Conditional Random Field (CRF). Finally, we fit line
segments along wall-ground boundaries and “pop up” a 3D
model using geometric constraints.
We assemble a dataset of 967 labelled corridor images. Our
experiments on this dataset and another publicly available
dataset show our method outperforms other single image scene
understanding methods in pixelwise accuracy while labelling
images at over 15 Hz.

私たちはリアルタイムで単眼カメラの画像から屋内廊下シーンの3Dレイアウトを把握する問題を考えます。壁のような障害物を特定することはロボットナビゲーションについて不可欠ですが、実際の廊下の構造、外観、照明の多様性のために困難です。現在の多くの単眼カメラによる方法はマンハッタンワールド仮説を提示し、この型に合わない環境ではうまくいきません。またその手法は、特定の建物モデルを形成するために、画像のセグメンテーションや境界を明確にするために複雑なハンドメイドの機能を必要とすることもあります。さらにほとんどの場合リアルタイムで実行できません。
本論文では、機械学習と幾何学モデルを組み合わせて、単眼カメラによる画像から単純化された3Dモデルを構築することを提案します。はじめにCNNを用いて粗い密度の幾何学的なクラスラベルを提供します。次に、完全に接続されたCRFでこのラベルを改良します。最後に、壁の境界線に沿って線を合わせ幾何学的制約を使用して3Dモデルをポップアップします。私たちは、967個のラベリングされた廊下画像のデータセットを組み立てます。このデータセットと他のパブリックな入手可能なデータセットに対する私たちの実験は、私たちの方法のほうが他の単眼カメラの画像による方法よりも優れていることを示している。

>https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=7487368

>https://www.youtube.com/watch?v=2CvFHy5jk1c
[画像認識]画像分類、画像検出、セマンティックセグメンテーション

画像認識における、**画像分類**、**画像検出**、**セマンティックセグメンテーション**の3つを紹介します。
## 画像分類


![classification](https://d3sw39zdfkajdx.cloudfront.net/art_img/adbbe877-4a1a-493e-90e2-424dbfeb0369png)
画像分類は取り込んだ画像を学習データから種類別に分類するのが目的です。この場合は読み込んだ画像に写っているものが猫か犬かマグカップか帽子かの種類分けをします。
## 画像検出



![detection](https://d3sw39zdfkajdx.cloudfront.net/art_img/30e0bbe2-52e6-4e3d-93e6-f01bdec7c51fJPG)
画像の中から**何が**・**どこに**あるのか見つけることができます。上の画像では、読み込ませた写真の中の目の位置から顔を推定して人の正面顔(front-face)がどこにあるかを見つけ出しています。飛鳥ちゃんと白石さんをちゃんと見つけられていますね。
## セマンティックセグメンテーション


![segmentation](https://d3sw39zdfkajdx.cloudfront.net/art_img/b36afb1b-c26b-4168-a10d-716c5560d505png)
画像検出とは異なり、ピクセルごとに意味付けをして領域ごとの意味付けを行います。上の画像でバイクとライダーがしっかり区別されて検知されました。
ドメインに参加している Windows Server 2008/R2 の列挙

#はじめに
　**2020年1月14日に Windows Server 2008/R2 の延長サポートが終了**します。このサポート終了への対応として [**Microsoft Azure へ移行すると無償セキュリティ更新プログラムを3年間延長**](https://pcp.azurepower.co.jp/ws2008eos/)して利用できます。

#利用状況の把握
　本記事ではドメインに参加している Windows Server 2008/R2 の一覧を取得する事で、移行が必要な対象サーバーを簡単に把握する方法を記載します。

#手順
1. ドメインコントローラー(AD) に管理者としてログインします。
2. PowerShell で以下のコマンドを実行します。

```powershell
Get-ADComputer -Filter 'OperatingSystem -like "Windows Server*2008*"' -Properties OperatingSystem | FT Name, OperatingSystem
```

　結果として、次のような対象サーバーの出力（例）が得られます。

```powershell
Name      OperatingSystem                  
----      ---------------                  
websvr001 Windows Server 2008 R2 Datacenter
websvr002 Windows Server 2008 R2 Datacenter
dbsvr001  Windows Server 2008 R2 Datacenter
dbsvr002  Windows Server 2008 R2 Datacenter
.............
..........
```
#ファイルへの出力
　結果をファイルに出力する場合は、次のコマンドで**全ての属性情報**を CSV ファイルへエクスポート可能です。出力先のパスは環境にあわせて指定してください。

```powershell
Get-ADComputer -Filter 'OperatingSystem -like "Windows Server*2008*"' -Properties * | Export-Csv -Path C:\temp\server-list.csv
```

#最後に
　現在オンプレミスで稼働している Windows Server 2008/R2 の Azure への移行をご検討の方は、[**移行支援パートナによる Azure 移行サービス**](https://pcp.azurepower.co.jp/ws2008eos/) 等をご検討ください。
汎化性能とは？

勉強しているときによく出会う語句について。
### 汎化性能って？
機械学習と呼ばれるものを勉強しているとよく**汎化能力**・**汎化性能**という言葉に遭遇するが、普段の生活では出会わず聞きなれない言葉だと思う用語なので簡単にメモ書きしておく。

そもそも機械学習における学習とは、学習に対する識別関数のoutputと教師データのerrorが最小になるように識別関数のパラメータを設定することです。しかし、トレーニングデータに対して上手く予測が行えたとしてもテストデータに対して同様に予測を行えるとは限りません。なぜならトレーニングデータに対してのみoverfitting（過適合）してしまっていることがあるからです。ここで、未知のテストデータに対する識別能力を**汎化能力**といい、識別関数がその能力が高いと**汎化性能**が高いということになります。

わかりやすく受験を例に言い換えてみます。
>受験生A君は志望校の受験に向けてある問題集(トレーニングデータ)を勉強しているとします。この受験生A君は努力の末、今扱っている問題集を暗唱できるほど完璧に暗記したとします。しかし、試験当日、志望校の入試問題(テストデータ)はA君が完璧にしてきた問題集にあった問題と同じものは出題されませんでした。A君は自分が勉強していた問題集から入試問題が出題されていれば当然満点を取れましたがそうはならなかったため点数が取れず残念ながら不合格になりました。

この例は、「受験生A君が問題集(トレーニングデータ)にのみ過適合していたため入試問題(テストデータ)に対する汎化性能が低かった」と言えます。
こう考えるとなんだか他人事じゃないような気がしてきますね！
【Facenet】特徴量抽出:顔認識と分類のための統一的な埋め込み

顔認識と分類のための統一的な埋め込み

[FaceNet: A Unified Embedding for Face Recognition and Clustering](https://arxiv.org/pdf/1503.03832.pdf)

## Abstract
>Despite significant recent advances in the field of face
recognition [10, 14, 15, 17], implementing face verification
and recognition efficiently at scale presents serious challenges
to current approaches. In this paper we present a
system, called FaceNet, that directly learns a mapping from
face images to a compact Euclidean space where distances
directly correspond to a measure of face similarity. Once
this space has been produced, tasks such as face recognition,
verification and clustering can be easily implemented
using standard techniques with FaceNet embeddings as feature
vectors.
Our method uses a deep convolutional network trained
to directly optimize the embedding itself, rather than an intermediate
bottleneck layer as in previous deep learning
approaches. To train, we use triplets of roughly aligned
matching / non-matching face patches generated using a
novel online triplet mining method. The benefit of our
approach is much greater representational efficiency: we
achieve state-of-the-art face recognition performance using
only 128-bytes per face.
On the widely used Labeled Faces in the Wild (LFW)
dataset, our system achieves a new record accuracy of
99.63%. On YouTube Faces DB it achieves 95.12%. Our
system cuts the error rate in comparison to the best published
result [15] by 30% on both datasets.
We also introduce the concept of harmonic embeddings,
and a harmonic triplet loss, which describe different versions
of face embeddings (produced by different networks)
that are compatible to each other and allow for direct comparison
between each other.

次にあげるもの[10, 14, 15, 17]は近年の顔認識の分野における大きな進歩ですが、大規模な場合では現在のアプローチには顔の検証および認識を効率的に行うことに大きな課題があります。この論文ではFacenetと呼ばれるシステムを紹介します。このシステムは、距離が顔の類似性の尺度に直接対応する小さなユークリッド空間への顔画像からのマッピングを直接学習します。一度このユークリッド空間が生成されると顔の認識、検証、クラスタリング(分類)などのタスクがFacenetの埋め込みを特徴ベクトルとする標準的な手法を用いて簡単に実行できます。私たちの方法では、deep convolutional networkを使用して、以前のdeep learningのアプローチのように中間ボトルネック層ではなく埋め込み自体を直接最適化するようにされています。訓練のために、私たちは、新しいオンライントリプレットマイニング手法を使用して生成された、ほぼ整列したマッチング/非マッチングのface patchのトリプレットを使用します。私たちのアプローチ優れている点は、表現効率がはるかに優れている点です。1つの顔に128bytesしか使用しない最先端の顔認識性能を達成しています。広く使われているラベル付顔データセットのワイルド（LFW）データセットでは、99.63%という精度の新記録を達成しています。YouTubeの顔データベースでは95.12%を達成しています。私たちのシステムは上記の両方のデータセットで最高のものとして公表された結果[15]と比較してエラー率を30%削減します。また私たちはお互いに互換性があり、お互いの直接の比較を可能にする顔埋め込み（異なるネットワークによって生成される）の異なるバージョンを記述するharmonic embeddingsとharmonic triplet lossの概念についても紹介します。

## 概要
* 顔画像から距離が直接顔の類似度とするようなユークリッド空間へのマッピングを学習
* 埋め込みをオンラインのトリプレット処理によって直接最適化
* 顔の認識：誰の顔か
* 顔の検証：画像が同じか
* 顔の分類：類似の画像
* 認識はk-NN分類問題でクラスタリングはk-meansなどを用いて達成できる
Epipolar geometry-エピポーラ幾何学-

**多視点幾何学の概要理解のためにエピポール、エピポーラ線、エピポーラ拘束について書いていきます。**
## エピポーラ幾何学

エピポーラ幾何学は、多視点画像から三次元構造を理解するために用いられる幾何で主にコンピュータービジョンの分野で用いられています。
## 今回の内容

![タイトル](https://d3sw39zdfkajdx.cloudfront.net/art_img/a6c803ec-f625-48f2-a01c-3a10ec97b8c8png)
([wikipedeiaより画像引用](https://en.wikipedia.org/wiki/Epipolar_geometry))
ご存知の通り、一般的なRGBカメラで撮影された写真は、三次元空間を切り取って二次元に映し出します。そのため、三次元空間上にあった距離などの情報が失われているため一枚の写真からは写真に映されている三次元空間を把握することができません。では、2枚の写真ではどうでしょうか？

上の画像を使って説明します。この画像では、物体XをLeft viewとRight viewの視点にある二台のカメラで撮影しているところを表しています。点OLと点ORは左右それぞれのカメラの中心を表しています。これから説明することは点X点OL点ORの三点を結んでできる**エピポーラ面**で起こる出来事です。

今、一枚(Left view視点)の写真を見ているとします。写真に撮った物体Xは直線OL,XLの直線延長線上にありますが点OLから見た場合その距離はわかりません。そこで点ORから撮影されたRight viewを使うことにしましょう。Right viewからだと、直線OL,XLの直線延長線上に存在しているはずの点XがRight view上に映された直線OL,XL、つまり赤線上に見つけられます。この赤線を**エピポーラ線**と呼びます。長々と書いてきましたが、Left viewにおける点XLを見つけるためにはRight view上の**エピポーラ線**を探せば見つけられます。これを**エピポーラ拘束**と言います。このように、異なる視点から撮影した写真はエピポーラ線を持つのでそいつを見つけてあげましょう。さてここで、異なる視点の画像から一枚の画像では把握できなかった物体Xの位置がもう一枚の画像から見つけられるのはわかったけどLeft viewとRight view自体はどうやって位置づけるのかがわかりません。ではLeft viewとRight viewの位置を把握するために**エピポール**について調べます。上の図で点OLとORを結んだ直線を見てください。この直線上に存在する点eL点eRがそれぞれエピポールと呼ばれるものです。エピポールは左右それぞれの中心を結ぶ直線と画像平面の交点に存在します。点eRは点OLのRight viewに対するエピポールで点eLは点ORのLeft viewに対するエピポールです。このエピポールは全てのエピポーラ線が通る点でもあるので複数のエピポーラ線の交点を探すとエピポールが見つけられます。

今回は点Xについて調べましたがこれを複数の点において行うことでより正確に多視点画像から三次元を把握することができるようになります。
ARkitから3Dモデルの復元はできるか

[前記事](https://qiita.com/YosukeHoshi/items/f248e458fc6440aff982)に記述した通り、ARkitではポイントクラウド(点群)を取得して平面検出を行うことができる。
### 仮説(希望)
ポイントクラウド(点群)を取得できるのなら、[point net](https://arxiv.org/pdf/1612.00593.pdf)のように点群情報をもとにsemantic segmentationとobject detectionが行えるのではないだろうか。(できたら嬉しいな)

### 実際のところ
前記事でもあげたようにARkitでは、1秒間に精度がいい時で数百点の点群を取得できるそう。果たしてこれは十分な量なのだろうか。
[ARKit 3d point cloud - House walk through](https://www.youtube.com/watch?v=Pb4uv4FSWKI)
これは家の中を歩き回ってARkitで取得した点群を元に三次元を復元した動画だが、この動画を見る限り部屋の内部が精密に復元できてるとは言い難い。これ自身がpoint netを使用している訳ではないだろうがARkitが取得する点群データはあくまで平面検出をするのに十分な量であって、三次元復元には耐えかねるのかもしれない。
photon voice2で「The imported type `Newtonsoft.Json.Linq.JObject' is defined multiple times」って出た

#環境
・unity2018.2
・photon voice2をアセットストアからインポート

#症状
・「The imported type `Newtonsoft.Json.Linq.JObject' is defined multiple times」って出る

#対策
・dllが被ってるので「Asset/Photon/PhotonUnityNetworking/Code/Editor/Newtonsoft.dll」を選択して
　インスペクターのEditorからチェックを外してプロセス押す

※とりあえず動かしたかったので急ぎやっつけで正解じゃないと思う
ARkitできることまとめメモ

2018年5月24日時点調べ
## できること
### ポイントクラウド（点群）取得
三次元空間の点座標の情報の取得だが、調べた限り1秒間に精度がいい時で数百点取得できるそう。ただ、あくまでカメラからの推定になるので単色で特徴のない場所だと精度が落ちることもある。またたまにノイズが混ざって空間上に点が表示されてこともある。
### 平面の検出
先にあげた点群情報によって、三次元空間上の床や床と言った平面を検出できる。垂直面は検出できないとの情報があったがtwitterより[検出例](https://twitter.com/rakusan/status/889711153353445379)を見つけた。
### ポジショントラッキング
三次元空間内でのデバイスの移動の検知が可能になった。カメラとセンサー情報を元に構成した三次元空間での相対位置を把握する。
### 現実空間への当たり判定（ヒットテスト）
点群で検出した平面を利用して現実空間との当たり判定を行うことができる。またARkitで認識していなかった面についてもその場で認識して平面か点か認識して当たり判定を行える。
エスケープ処理していないところで、スクリプトを動かしてみる

#結論
bladeでデータ表示するときは、

- `{{ }}`でくくっておけば基本困らないよ。（laravel5以降）
- `{!! !!}`はエスケープしないから、気をつけて使おうね！

#環境
- laravel5.5

#入力値
`textarea`タグで入力してDBに保存する。
<img width="1006" alt="スクリーンショット 2019-03-19 14.54.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/266720/532ad88c-e9b3-8b61-fbf1-5062aa5d2088.png">


#表示するその1（pタグ）
```html:article.blade.php
<div class="card-body">
    <p>{{ $article->body }}</p>
</div>
```
こうかな？
<img width="746" alt="スクリーンショット 2019-03-19 14.59.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/266720/d474e99e-8734-51b1-d111-4daa212c2942.png">
改行が出来てない。

#表示するその2（preタグ）
```html:article.blade.php
<div class="card-body">
    <pre>{{ $article->body }}</pre>
</div>
```
こっちのほうがいいかな？
<img width="746" alt="スクリーンショット 2019-03-19 14.56.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/266720/b1b98b43-afeb-75d7-2ae7-122b432bb76d.png">
見切れてしまいました。横にスクロールは出来ますが、折り返してほしいところです。

#表示するその3（nl2br）
```html:article.blade.php
<div class="card-body">
    {!! nl2br(e($article->body)) !!}
</div>
```
`{!! !!}`でエスケープをしないようにして、`e()`でエスケープしつつ`nl2br()`で改行させます。
<img width="746" alt="スクリーンショット 2019-03-19 15.12.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/266720/1b13c069-50d6-ee26-3fd1-3c921870209f.png">
good!

#表示するその4（xss）
```html:article.blade.php
<div class="card-body">
    {!! nl2br($article->body) !!}
</div>
```
さて、本題です。
さっきのものを`e()`しないとどうなるかというと。。。
<img width="459" alt="スクリーンショット 2019-03-19 15.21.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/266720/69b60e16-0b4b-b931-353d-e77d2614ef6c.png">
ばっちりスクリプトが動いてしまいました。
<img width="741" alt="スクリーンショット 2019-03-19 15.23.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/266720/92589439-ccdb-65d6-85b5-84fedae4afee.png">
当然html上での二行目の表示はされなくなります。

#参考
- [Laravel5(Blade)のViewで改行させたいだけなのに少し悩んだ](https://qiita.com/noratmt/items/f5dee008ba8138ce6c22)
- [LaravelのBladeで改行したいとき](https://qiita.com/shosho/items/6abceaedcf4cca910f65)
ESLint/Prettier併用で<img />が怒られる問題

# 解決したいこと
コード検証にESLintとPrettierを併用しています。
今回、HTMLのvoid elements(area,hr,img,input...)周りが競合して以下のようなエラーになって困っていました。

```
warning  Disallow self-closing on HTML void elements (<img/>)  vue/html-self-closing
error    Insert `/`                               prettier/prettier
```

ESLintはvoid elementsでのself-closingを許容していない。
でも、Prettierはvoid elementsに"/>"をつけて閉じたい。
結果、競合が発生してエラーが起きていました。

eslint-config-prettierを使っているのでESLintの設定はリセットされているはずだと思ってましたが、どうもうまく行かず。。。

# 解決方法（暫定）
HTML5ではvoid elementsのself-closingは許容しているようですし、
結局、ESLint側のルールを見直して対応しました。

```json:.eslintrc.js(一部抜粋)
  rules: {
     "semi": [2, "never"],
     "no-console": "off",
     "vue/max-attributes-per-line": "off",
+    "vue/html-self-closing": ["error", {
+      "html": {
+        "void": "always",
+      }
+    }],
     "prettier/prettier": ["error", { "semi": false }]
   }
```

self-closing関連の設定詳細は[こちら](https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/html-self-closing.md)です。

# まとめ
少しモヤモヤしますが、void elementsのself-closingはPrettierにお任せすることが出来ました。
Jupyter(Ansible Kernel)で無理矢理inet-henge表示させてみた

# はじめに
以前nwdiagをJupyter Notebookに表示させる記事を書きましたが、
[nwdiag × Ansible plugin × Jupyter でNWトポ図の生成](https://qiita.com/t-tkgh/items/d367a8d217abe3df54b5)
NW自動化で自動構成図生成を進めるにつれてL3のNWトポロジー図だけでは表現できないユースケース(BGPトポロジなど)があり、
そこでinet-hengeを使ってBGPトポロジを表現して補完するようにしてみました。

また、Jupyter NotebookのAnsible Kernel上で実行することで、
NWトポロジー図の作図した構成情報を流用して、NW機器への設定投入自動化も可能にしました。

# Inet-hengeについて
Nwdiagとは違い、InteropのShowNetのトポロジー図のようなノード間の繋がりの表現に特化したトポロジーが描けるjsライブラリです。
https://github.com/codeout/inet-henge

git cloneして、pythonなどで簡易httpサーバを立てるとexampleのトポロジー図が確認できます。


# Jupyter Notebook(Ansible Kernel)について
Juputer Notebookは通常はPythonかShellでの対話式プログラム実行となりますが、
Jupyter Notebook(Ansible Kernel)は
ansibleのPlaybookにおけるtaskごとに対話式に実行できるようになっています。

詳しい使い方は公式のgithubページを参照ください。
https://github.com/ansible/ansible-jupyter-kernel

# Dockerfile
Inet-henge + nwdiag(おまけ)をJupyter Notebook(Ansible kernel)のコンテナ上に構築するDockerfileは以下になります。
残念ながら、配布されているDockerImangeはまだPython2.7でしか提供されていないようです。

```bash:shell
FROM benthomasson/ansible-jupyter-kernel
  
USER root
RUN yum install -y git ansible
RUN pip install nwdiag runipy textfsm jmespath
RUN git clone https://gist.github.com/a8e8269d4331b6b93e7ef90744fe0b3b.git
RUN git clone https://github.com/t-tkgh/nwdiag_filter.git
USER notebook
RUN git clone https://github.com/codeout/inet-henge.git
```
# Dockerの構築
- 作成したDockerfileのディレクトリ上でビルドします。

```bash:shell
docker build ./ -t jupyter-inet
```
- ビルドしたDockerImageをデプロイします。
※ホスト側のポートが重複する場合は任意のポート番号にそれぞれ置き換えてください。
例：-p 18000:8000など

```bash:shell
docker run -idt --name notebook -p 8888:8888 -p 8000:8000 jupyter-inet
```
- 作成したDockerインスタンスへログインして、jupyter notebookのtoken情報を取得する。 
```bash:shell
docker exec -it  notebook /bin/bash
jupyter-notebook --list
```


# demoについて
※nwdiagもAnsible Kernelで動く

- inet-hengeを表示するJupyter Notebookのデモを公開しています。
以下のgistのipynbをJupyter Notebook上にUploadして実行してください。
https://gist.github.com/t-tkgh/cd777a3423f995295b6ca49858b2e83c
以下のような図が生成されます。

    - inet-hengeで自動生成したBGPトポロジ図
![Screenshot-2019-3-19 demo.png](https://qiita-image-store.s3.amazonaws.com/0/97185/b6996be4-2b3e-f43f-1566-06e6c3c72c95.png)

    - nwdiagで自動生成したL3トポロジ図
![Screenshot-2019-3-19 demo(1).png](https://qiita-image-store.s3.amazonaws.com/0/97185/3d33ae21-d1ce-3d07-a565-fa11f45bf54a.png)


- コンテナデプロイ時に-p 8000:8000からホストのポートを変更している場合は、
In [9]: の以下のlocalhost:8000の部分を変更したポート番号へ変更してください。

```bash:shell
HTML(r'<iframe width="1024" height="560" src="http://localhost:8000/example/" frameborder="0" allowfullscreen></iframe>')
```

---
時間が作れたらpy_d3で直接inet-henge実行して、svgファイルで保存して参照する形にしてみます。
ionic v3でiosのSanfrancisco fontが適用されない問題をfix

# はじめに

Sanfrancisco Fontはios9から新しく追加されたfontであり-apply-systemで読み込む事ができる
　参照：[CSSでSan Franciscoを指定する(2017年版)](https://qiita.com/raryosu/items/9093660096e3fedfc333)

Sanfrancisco Fontが-apple-sysytem fontで読み込まれるというのでほったらかしにしていたが数字の表記をしっかり確認したとことどうやら読み込まれてないことに気づいた

最初はionic v3によるfont-familyの指定の仕方かと思ったので以下のように変更してみた

もともと

``` scss
$font-family-base: -apple-system, BlinkMacSystemFont, "Hiragino Sans",
"Helvetica Neue", Roboto, sans-serif;
```
で指定していたがv3からは↓のように指定しないと適用されないらしい

``` scss
$font-family-md-base: -apple-system, BlinkMacSystemFont, "Hiragino Sans",
"Helvetica Neue", Roboto, sans-serif;
$font-family-ios-base:  -apple-system, BlinkMacSystemFont, "Hiragino Sans",
"Helvetica Neue", Roboto, sans-serif;
$font-family-wp-base: -apple-system, BlinkMacSystemFont, "Hiragino Sans",
"Helvetica Neue", Roboto, sans-serif;
```
参照:[ionic v3のfontの指定](https://forum.ionicframework.com/t/font-family-base-not-overriding-default-value/55373)

だが上記で読み込み方を変えても全く意味がなかった
適用されない

なのでSanfrancisco Fontをプロジェクトに保存してscssで読み込むしかないという結論に至った

``` scss
/** Regular */
@font-face {
  font-family: "sf display";
  font-weight: 400;
  src: url("../assets/fonts/sfdisplay/sf-display-regular.woff") format("woff");
}

/** Medium */
@font-face {
  font-family: "sf display";
  font-weight: 500;
  src: url("../assets/fonts/sfdisplay/sf-display-medium.woff") format("woff");
}

/** Semibold */
@font-face {
  font-family: "sf display";
  font-weight: 600;
  src: url("../assets/fonts/sfdisplay/sf-display-semibold.woff") format("woff");
}
```
<img width="311" alt="スクリーンショット 2019-03-19 15.29.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/214581/6ca3aff9-02a0-aa8a-b7d5-c932dcbd1ac8.png">

fontsディレクトリ下にwoff形式のSanfrancisco Fontを配置した
今回は数字の表記だけデザインと同等に表示するためにサブセット化し、軽量化のためにwoffに変換をした

Sanfrancisco Fontは[こちら](https://github.com/miyabiya/sanfrancisco-font-only-num-special)からダウンロード
Juliaはじめてみた

# Juliaとは
一言で言うと、 **Python +  R + Go** で、それぞれの言語のいいとこ取りをした言語。
JuliaはMITが開発した言語として、2012年に登場しました。
2018年に安定版の1.0.0がリリースされ、2019年3月現在では1.1.0が最新版となっています。
元々は、複雑でデータ量が巨大な科学計算を行うのを特に得意としていますが、
Pythonのような汎用プログラミング言語としても利用でき、
単純なループを５万回処理させただけでも速度はPythonの約5倍にもなる実験例もあります。
R言語やPythonのpandasのような機械学習や統計処理を超高速に行うことができ、
また、Go言語のような並列処理も得意としています。

パフォーマンスはGo言語と肩を並べるくらいいい勝負をしていて、
それならGoでいいのではと感じる瞬間もあったりはしたんですが、
Go言語を少し勉強していた頃、最もハードルに感じたのは、常に **型** を意識しないといけない事でした。
**静的型付け言語** に慣れていたり、エンジニア歴の長い方であれば、何を言っているんだと思われそうですが
Pythonのような動的型付け言語に慣れていて、エンジニア歴も浅い私としては
『静的型付けって難しいし、慣れないなぁ』と...
でも、Juliaは **動的型付け言語** なので、 Go言語 **ほどは** 気にしなくていいんです！
ただ、あくまで「ほど」です。
JavaやGo言語ほどは気にしなくていいけど、Pythonよりは意識する場面も多いのかなと言った印象です。

# 公式ドキュメント
日本語：http://docs.julia.tokyo/ja/latest/
情報は古いけど参考にしたもの：https://www.dropbox.com/s/lk7y8lifjcr1vf2/JuliaBook-20151201.pdf

# Juliaインストール
https://julialang.org/downloads/platform.html

# Juliaの面白いところ
『Julia面白い！勉強してみよう！』と感じたきっかけになったものを少しだけ紹介。

* Unicodeへの対応 

```julia
julia> こんにちは = 1
1
julia> println(こんにちは)
1
```

初めてみたとき衝撃的で、この強烈なキモさが面白さでもあります。

* 数学的感覚で記述できる

```julia
julia> x = 10
10
julia> y = 2x+1
21
```

Pythonだとこう言うとき、 `y = 2 * x + 1` って書かないといけないとが面倒だったので、
Juliaめっちゃ楽だな〜

もっともっと面白いのはあるけど、それはまた別の記事に...

# Juliaは今後どうなる？
初回版から今年で７年しか経っておらず、まだまだPythonのpandasに敵わない部分も多いと言われていますが、
かなり可能性を秘めた言語なんじゃないかなと。
Julia人口はまだまだ少なく、参考書や詰まった時に助けてくれる記事を探すのも大変だったりしますが
ビッグデータが当たり前になっている中で、これだけの速度で処理できる言語はとても魅力的。
コマンドの履歴を見てサクッと実行する方法

## コマンドの履歴表示

```
history
```
<img width="546" alt="スクリーンショット 2019-03-19 14.58.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/88533/48ffaa7e-8138-7979-0106-eec0a8f6fe32.png">


## サクッと昔のコマンド実行

たとえば、上記の1122を実行したいなら、

```
!1122
```

でEnterを押すと、
1122のLANG="ja_JP.SJIS"が実行される。

便利！！！
[簡単!!!]誰でもできる「いいね👍」機能

##はじめに
今回は前提としてUser, Postが既にあり、Likeを加えた３つのモデルでできるアプリとします。


1.Likesモデルの追加
2.アソシエーション
3.Likesコントローラの追加
4.Likesコントローラの設定
5.Postsコントローラの設定
6._like.html.erbの追加


##Likesモデルの追加

```console:ターミナル
$ rails g model like post:references user:references
$ rails db:migrate
```

##アソシエーション

```ruby:like.rb
class Like < ApplicationRecord
  belongs_to :user
  belongs_to :post 
end
```
post.rbの最後の行はlikesテーブルを中間テーブルとして経由してuserテーブルから情報を取ってくると言うことを表してます。
liked_usersにしていますが、ここはわかりやすい名前にして下さい。

```ruby:post.rb
class Post < ApplicationRecord
  belongs_to :user
  has_many :likes
  has_many :liked_users, through: :likes, source: :user
end
```

post.rbと同様でlikesを経由してpostテーブルから情報を取ってきてliked_postsと言う名前で使用できます。

```ruby:user.rb
class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :posts, dependent: :destroy
  has_many :likes, dependent: :destroy
  has_many :liked_posts, through: :likes, source: :post

  #ユーザーが投稿に対して既にいいねしているか
  def already_liked?(post)
    likes.exists?(post_id: post.id)
  end
end
```

##Likesコントローラの追加

```console:ターミナル
$ rails g controller likes
```

##Likesコントローラの設定

1. create:
ログインユーザーがあるpostに対してlikeする

2. destroy:
ログインユーザーがlikeしたpostを探して削除

3. set_post:
JSでなんとか出来るけどとりあえずいいねしたらredirectでpost#showへ遷移。
しかし、今のままではlikes_controllerで@postは使えないのでprivate下で@postを定義する。


```ruby:likes_controller.rb
class LikesController < ApplicationController
  before_action :set_post, only: [:create, :destroy]
  def create
    @like = current_user.likes.create(post_id: params[:post_id])
    redirect_to post_path(@post)
  end

  def destroy
    @like = Like.find_by(post_id: params[:post_id], user_id: current_user.id)
    @like.destroy
    redirect_to post_path(@post)
  end

  private
  def set_post
    @post = Post.find(params[:post_id])
  end
end

```

##Postsコントローラの設定
今回はPosts#showでいいね出来るようにするのでshowアクションに以下を付け加える。

```ruby:posts_controller
def show
   @post = Post.find(params[:id])
   @comments = @post.comments.includes(:user)
--------↓これを加えてください-------
   @like = Like.new
end
```

##_like.html.erbの追加

**1行目:**user.rbで作った、記事に対していいねしているかどうかのメソッドです。

ログイン中のユーザーがあるpostにいいねしているのなら2~4行目の処理に行きます。

まだいいねしていないのなら6~8行目の処理に行きます。


**2~4行目:**いいね削除メソッドで、fontawesomeの❤️アイコンとdeleteメソッドをブロックを使って一体化しています。

またremote: trueを記述することで非同期でいいねすることができます。

**6~8行目:**いいねメソッドです。それ以外は2~4行目と同じです。

**10行目:**ある記事に対していいねされた数をカウントします。

```erb:_like.html.erb
<% if current_user.already_liked?(@post) %>
  <%= link_to post_like_path(@post), method: :delete, remote: true do %>
    <%= fa_icon 'heart', id: "heart__red" %>
  <% end %>
<% else %>
  <%= link_to post_likes_path(@post), method: :post, remote: true do %>
    <%= fa_icon 'heart', id: "heart__normal" %>
  <% end %>
<% end %>
<%= @post.liked_users.count %>

```

##最後は
部分テンプレートを使って_like.html.erbを呼び出します。

```erb:show.html.erb
<div class="post__like">
   <%= render 'likes/like' %>
</div>
```


##参考

[Railsでいいね機能を実装しよう
](https://qiita.com/nojinoji/items/2c66499848d882c31ffa)

[【Rails】いいね機能の実装(.js.erbを用いない方法)【プログラミング学習165日目】
](https://qiita.com/fuku_tech/items/c9835b7d90bd5effe8ad#_reference-1cce3046883b3fc76049)
安定版のSubstrateをインストールする方法

# 最新版の落とし穴
Substrateは毎日更新されているのでエラーも頻発。チュートリアルで最初に見かける```curl https://getsubstrate.io -sSf | bash```は問答無用で最新のバージョンを取得するため、予期せぬエラーが起こりやすい。僕もAlice無一文エラーに遭遇したので、安定して動作するSubstrateのインストール方法をご紹介します。

追記2019/3月31日：
AliceのBalanceがゼロになるエラーは、Substrate上の暗号が`ed25519`から`sr25519`に変更になった事により起こったっぽいです。`ed25519`でRaw-SeedにAliceと入力してアカウント作れば使えるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/380311/1091d006-d4d1-fde5-8db3-83eecd23c81a.png)


# インストール方法:
 * `git clone https://github.com/shawntabrizi/substrate-package`
  で安定バージョンをクローン。
 
 * substrate-packageに移動後、
   `./get-substrate-dependencies.sh`
   を実行。
    * 必要な外部ディペンデンシーをインストールします。
    * This installs some external dependencies, take a look at the script
    * Windowsの場合は [こちら](https://github.com/paritytech/substrate#61-hacking-on-substrate) を参照。

 * `./substrate-package-rename.sh <プロジェクト名> <Auth名>`
 を実行。
    * プロジェクトフォルダーとランタイムをコンパイルしたときに作られるバイナリファイルの名前変更をします。

 *  `<プロジェクト名>` フォルダに移動後、以下を実行:
    * `./build.sh`　Wasmのビルド
    * `cargo build --release`　バイナリのビルド
    * `./target/release/<プロジェクト名> purge-chain --dev`　チェーンのデータを全消去（しておくとエラーが起こりにくい）
    * `./target/release/<プロジェクト名> --dev`　チェーンの初期化とノード起動。ブロックが自動生成され始めます。
 
 * UIアプリ [PolkadotAppUI](https://polkadot.js.org/apps/#/transfer)
    * 左タブのSettings> `remote node/endpoint to connect to`を `Local Node`に設定。
    *  `Save&Reload`ボタンを押して設定を適応＆更新。

 * または、`<プロジェクト名>-ui` フォルダに移動後、以下を実行でローカルサーバー立ち上げ:
    * `yarn install`
    * `yarn run dev`
    * `localhost:8000` でローカルサーバーが立ち上がります。
    * ```subkey inspect 0x416c696365202020202020202020202020202020202020202020202020202020```
    を実行で公開鍵とアドレスを確認できます。```subkey restore```はなくなったみたいです。
![ssterminal.png](https://qiita-image-store.s3.amazonaws.com/0/380311/d4f66906-42fb-84b2-9e15-983f9c359d56.png)
***左上でブロック生成、左下でsubkey inspect、右でローカルサーバー立ち上げています。

Source:[shawntabrizi](https://github.com/shawntabrizi/substrate-package)
UnityのHingeJointでオブジェクトを動的に接続する。

#1 やりたいこと
 オブジェクトAがオブジェクトBに接触した時に回転可能に連結される。
![Joint.jpg](https://qiita-image-store.s3.amazonaws.com/0/245844/f54e61bc-2b2e-0bae-e782-2ee8c649442a.jpeg)



#2 方法
 オブジェクトAがオブジェクトBに接触した時に、オブジェクトAの座標を接続したい位置にセットし、Hingejointを追加。
Hingejointはデフォルトのままでよい。Auto configure connected anchorがtrueなので、HingeJointを追加する前にオブジェクトAの位置を決めておけばanchor(接続する位置)やconnected anchor(接続される位置)が自動設定される。

#3 コーディング例

```c#:sample.cs
                CircleCollider2D CC2 = collision.gameObject.GetComponent<CircleCollider2D>();
                gameObject.transform.position = collision.gameObject.transform.TransformPoint( new Vector3(CC2.offset.x,CC2.offset.y,0));
                HingeJoint2D HJ = gameObject.AddComponent<HingeJoint2D>();
                HJ.connectedBody = collision.attachedRigidbody;
                collision.gameObject.tag = "Untagged";
```
 上の例では、onTriggerEnter2D内で次のような処理を行なっている。
 ・collisionから接触したgameObjectの参照を得る。
 ・接触したオブジェクトのCircleColliderの参照を取得する。
 ・CircleColliderの中心に位置を合わせてから、HingeJointを追加する。
 ・HingeJointのconnectedBodyを設定。

最後のタグの書き換えは、何かが接続されたオブジェクトは接続の対象から外して最後尾のみに連結できるようにするため。
連結を解除したいときは、GameObject.Destroy(HJ);。


#4 使用例
https://unityroom.com/games/chocogakehouseg00002
WordPressのお引っ越し

# 1. はじめに
個人で使っているVPSをAmazon Lightsailに移行しています。
今回はWordPressで作成しているWebサイトの引っ越しをします。
移行先のサーバーのhttpdとMySQLの基本的な設定は済んでいる状態です。
引っ越し用のプラグインは使用せず、コンテンツファイルをコピー、DBのデータをリストアする手法を使います。
移行元、移行先共にVPS1台構成でcentos7、Apache HTTP Server、MariaDBの環境です。

# 2. 移行元での作業
* DBのデータをダンプします。

`# mysqldump -u root -p --single-transaction DB名 > /tmp/wordpress.sql`

* コンテンツを固めます。

`# tar cvzf /tmp/wordpress.tar.gz /var/www/html/対象のディレクトリ/`

* dumpファイル、コンテンツ、httpdのコンフィグを移行先へコピーします。

`# scp -r -P ポート番号 /tmp/wordpress.sql ユーザー名@移行先のIPアドレス:/tmp/`
`# scp -r -P ポート番号 /tmp/wordpress.tar.gz ユーザー名@移行先のIPアドレス:/tmp/`
`# scp -r -P ポート番号 該当のバーチャルホストのコンフィグファイル名 ユーザー名@移行先のIPアドレス:/tmp/`

# 3. 移行先での作業
* WordPress用のDBユーザーを作成します。

`MariaDB [(none)]> grant all on WordPressのDB名.* to 'WordPressのユーザー名'@'localhost' identified by 'パスワード';`

* WordPress用のDBを作成します。

`MariaDB [(none)]> create database WordPressのDB名;`

* dumpファイルからリストアします。

`# mysql -uroot -p -D WordPressのDB名 < /tmp/wordpress.sql;`

* コンテンツファイルを解凍して配置します。

`# tar xvzf /tmp/wordpress.tar.gz`
`# cp -a コンテンツのディレクトリ名のフルパス /var/www/html/`

* httpdコンフィグファイルを配置します。

`# cp -a /tmp/コンフィグファイル名 /etc/httpd/conf.d/vhosts/`

* 必要に応じてコンフィグ修正

`# vi /etc/httpd/conf/httpd.conf`
「Include conf.d/vhosts/*.conf」の1行を追加します。

* httpdを再起動します。

`# systemctl restart httpd`

# 4. DNSレコードの変更
移行対象のバーチャルホストを移行先に向けます。
私はお名前.comでドメインを取得しているので、「お名前.com Navi」のWebコンソール上から設定変更をしました。
反映が早くなるので事前に該当レコードのTTLを短くしておくと良いと思います。

# 5. 結果
TTLが3600だったので、次の日にWebサイトを確認しました。
コンテンツが問題なく表示されることを確認しました。
また、移行先のアクセスログを確認して、移行先にアクセスが向いていることを確認しました。
WordPressの管理画面にログイン出来ることを確認しました。
特段問題は発生していないため移行は成功したと判断します！
オプショナルバリューについて

## オプショナルバリューについての備忘録
最近になって研修ぶりにswiftを触る機会が多いのですが、
「いまだにswiftって!とか?とかなんか多いしよくわからない」というような状態だったので、
改めて勉強してみました。初心者なので間違い多々あるかと思います！

## オプショナルバリューって・・・？
オプショナル型でラッピングすることで変数にnilを入れられるようにする


## 基本的な書き方
```swift:test1.swift
var afternoon1:Optional<String> = "こんにちは！"
afternoon1 = nil        //エラーにならない

//afternoon1と同じ処理を簡単に書くのが、型名の後に「？」をつける
var afternoon2:String? = "こんにちは！"
afternoon2 = nil        //エラーにならない
```

**「Optional < String>」を簡単にしたのが「？」**


## オプショナルバリューの使い方
```swift:test2.swift
let message1:String = "ハロー"
let message2:String? = "ワールド"
print(message1)
print(message2)             //オプショナルバリューで出力しようとするのでStringで表示されない
print(message1 + message2)  //片方がオプショナルなので連結できずエラー
//強制アンラップ：変数名の後ろに「!」をつける
print(message1 + message2!) //message2がnilの時はエラーになるのであまりよくない
```
**「！」＝強制アンラップになるので、むやみに使うのはよくない**


## オプショナルバインディングで安全にアンラップする
```swift:test3.swift
var str:String?
if let msg = str{
    //strがnilでないならmsgにstrの値を代入して出力。msgにはアンラップされた状態で入っている
    print(msg)
}else{
    //strがnilの場合
    print("オプショナルバリューはnil")
}
```
**guard-else文でのオプショナルバインディングも値がnilか判定している**
日本語のWikipediaの全文データを使ってWord2vecを訓練する

日本語のWikipediaの全文データを使ってWord2vecを訓練する方法についてまとめます。
Udemy【TensorFlow・Keras・Python3で学ぶ】時系列データ処理入門（RNN/LSTM, Word2Vec)の内容です。


## 環境
`Ubuntu18.04`



## データをダウンロード


https://dumps.wikimedia.org/jawiki/latest/ から`jawiki-latest-pages-articles.xml.bz2`をダウンロードし、解凍する。

## wp2txtを使って、xmlからテキストファイルを生成する
　wp2txtはrubyのgemなので、rubyがインストールされているかを確認する。

```
 $ ruby -v
 ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu]
```

　ruby-devをインストールしないとエラーが出るので、rubyのバージョンを確認し、ruby-devをインストールする。

```
 $ sudo apt-get install ruby2.5-dev
```
　wp2txtを使って、`jawiki-latest-pages-articles.xml`をtxtファイルに変換する。少し時間がかかる。

```
 $ wp2txt --input-file ./jawiki-latest-pages-articles.xml 
```

生成された複数のテキストファイルを`jawiki.txt`にまとめる。


```
 $ cat jawiki-latest-pages-articles*.txt > jawiki.txt
```


## MeCabで分かち書きファイルを生成
`jawiki_wakachi.txt`という分かち書きファイルを生成する。これも時間がかかる。

```
mecab -b 100000 -Owakati jawiki.txt -o jawiki_wakachi.txt
```
`'utf-8' codec can't decode bytes in position invalid continuation byte mecab`というようなエラーが出た場合は

```
mecab -d /var/lib/mecab/dic/ipadic-utf8 -b 100000 -Owakati jawiki.txt -o jawiki_wakachi.txt
```
として、UTF-8の辞書を指定する。

## word2vecで訓練する
Word2vecに`jawiki_wakachi.txt`を学習させる。

```
from gensim.models import word2vec
data = word2vec.Text8Corpus("jawiki_wakachi.txt")
model = word2vec.Word2Vec(data, size = 100)
```

このコードは実行に１日ほどかかる。



# 参考

[Udemy【TensorFlow・Keras・Python3で学ぶ】時系列データ処理入門（RNN/LSTM, Word2Vec)](https://www.udemy.com/tensorflow_rnn/learn/v4/t/lecture/7895510?start=34)
[wp2txtでハマった話](https://qiita.com/daikw/items/31acdc75632f22afcd7d)
[Ubuntu 18.04 LTSのPythonでMeCabを動かす方法](https://qiita.com/SUZUKI_Masaya/items/685000d569452585210c)
Goで週報（Github, asana, esa）の自動生成ツールを開発しました

ご存知の方多いと思いますが、うちの会社で週報という文化があります。
メンバーが一週間の作業のサマリを同僚やマネージャ向けに共有するドキュメントです。

週報、すごく意義があるのですが、
きちんと読みやすい形で伝えるにはコストが高く辛いなと思っていました。
エウレカさんのGoもくもく会を通して、
3ヶ月ぐらい細々と開発を続けてようやくツールとして完成させました。
集大成としてLTで発表してきました。

https://speakerdeck.com/tetsuyanh/weekly-report-gen

コードも公開しております。
https://github.com/tetsuyanh/weekly-report-gen

抽象化を意識して設計したので、色々なカスタマイズできる余地を残してます。
ぜひ使ってみてください。
週報は人や会社によって違うので、forkしてもらって独自発展していくと良いかもです。
Arrayで手軽にリングバッファ風の処理をする

独自クラスやモンキーパッチを用意するほどでもない規模の処理向けです。
ループにおいて、繰り返し回数より小さいサイズのArrayからデータを抜きだすけど、Arrayの終端に達したら先頭からやり直したい時程度の規模で使えそうです。

追記：
素敵な回答をコメント頂いたのでそちらもご参照ください。

```ruby
ary = [1,2,3,4]
enumerator = ary.to_enum

10.times do |i|
  begin
    puts enumerator.next
  rescue StopIteration
    # ary末尾に到達したので先頭に戻して同じ処理
    enumerator.rewind
    puts enumerator.next
  end
end

出力
1
2
3
4
1
2
3
4
1
2
```
Swift Alamofire Response のリターン結果待つ　Closure利用の例

###Closure パラメータの関数を用意

```swift
func postRequest( urlSuffix : String, params:[String : AnyObject]?, filterParams : [String]?, 
success: (response: AnyObject!) -> Void, failure: (error: NSError?) -> Void)
{
    Alamofire.request(.POST, webServicesURLPrefix + urlSuffix, parameters: params, encoding: .JSON, headers: self.headers)
    request?.responseJSON { response in
        switch response.result
        {
        case .Success:
            success(response: response.result.value)
        case .Failure(let error):
            failure(error: error)
        }
    }
}
```
###関数を呼び出し

```swift
self.postRequest("do-registration.php", params: params, filterParams: nil, success: { (response) -> Void in
        self.afterResponse(response)
        }) { (error) -> Void in
            failure(error: error)
    }

```
Ubuntu 16.04 のCUIでの文字化け♦♦を直すメモ

Ubuntuをインストールした際，言語を日本語にしたので，
CUI(`Ctrl`+`Alt`+`F1`)画面でエラー吐かれても♦♦♦♦ばかりで読めない。

ログインループに悩まされていたのでとても困った。

##文字化けを直す方法

.bashrcというファイルに，設定を書くことで解決。

```ruby:.bashrcを開く
vi ~/.bashrc
```
文末まで移動して，以下の文を入力する。

```ruby:入力
case $TERM in
      linux) LANG=C ;;
      *)       LANG=ja_JP.UTF-8;;
esac
```

入力したら，CUIの画面の場合は`ESC`を押すと入力終了になるらしい？
(ならなかった…:pensive:再起動した)。
読めるようになった！

もし入力終了になったら，以下を入力すると反映されるらしい

```ruby:反映
source ~/.bashrc
```
Vue.jsを使い始めてハマったポイント

# はじめに
Vue.jsとElementUIを初めて使用してハマったポイントを書きました。

# 「v-bind」は「：」に、 「v-on」は「＠」に省略できる

公式サイト：https://jp.vuejs.org/v2/guide/syntax.html#%E7%9C%81%E7%95%A5%E8%A8%98%E6%B3%95

## （例）ボタンの場合

```

<!-- 完全な構文 -->
<el-button v-on:click="onClickSubmitButton">登録する</el-button>

<!-- 省略記法 -->
<el-button @click="onClickSubmitButton">登録する</el-button>

```

# ：（コロン）の付け忘れに注意！
## （例）ボタンにdisabled属性を設定した場合

ElementUIが提供している`<el-button>`タグは、disabled属性を指定すると、クリック可能・不可を指定することが出来ます。
公式サイト：https://element.eleme.io/2.4/#/en-US/component/button#disabled-button

**：をつけないと文字列**として認識されるため、「ボタン１」と「ボタン２」は、どちらもクリックが可能となる。

**：をつけると式**として認識されるため「ボタン３」はクリックが可能、「ボタン４」はクリックが不可となる。


```
<!-- ボタン１：クリックできる -->
<el-button disabled="true">ボタン１</el-button>

<!-- ボタン２：クリックできる -->
<el-button disabled="false">ボタン２</el-button>

<!-- ボタン３：クリックできる -->
<el-button :disabled="true">ボタン３</el-button>

<!-- ボタン４：クリックできない -->
<el-button :disabled="false">ボタン４</el-button>
```

同じようにハマった方がいらっしゃいました
https://stackoverflow.com/questions/52517136/disable-close-on-click-modal-in-element-ui


# $emitで子から親にデータが渡せない

## キャメルケースではなくケバブケースで書かないといけない

$emitを使用し、子コンポーネントから親コンポーネントにイベントを渡す場合、キャメルケースではなく**ケバブケース**で書かないとうまく動かない

```
NG ↓

<!-- 子コンポーネント -->
this.$emit('childEvent', item);

<!-- 親コンポーネント -->
<Child @childEvent="onChangeItem"></Child>

※onChangeItemはキャメルケースでok

```

```
OK ↓

<!-- 子コンポーネント -->
this.$emit('child-event', item);

<!-- 親コンポーネント -->
<Child @child-event="onChangeItem"></Child>

```

公式サイト：https://jp.vuejs.org/v2/guide/components-props.html#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E5%BD%A2%E5%BC%8F-%E3%82%AD%E3%83%A3%E3%83%A1%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9-vs-%E3%82%B1%E3%83%90%E3%83%96%E3%82%B1%E3%83%BC%E3%82%B9



## 受け取りたいコンポーネントで受け取る
親コンポーネントでイベントを受け取る場合、**受け取りたいコンポーネントタグ**でイベントを受け取らないとうまく動かない

```
NG ↓

<!-- 子コンポーネント -->
this.$emit('child-event', item);

<!-- 親コンポーネント -->
<div @child-event="onChangeItem">
  <Child></Child>
</div>

※onChangeItemはキャメルケースでok

```

```
OK ↓

<!-- 子コンポーネント -->
this.$emit('child-event', item);

<!-- 親コンポーネント -->
<div>
  <Child @child-event="onChangeItem"></Child>
</div>
```

# v-ifとv-forは一緒に使えない
v-ifとv-forは**同じ要素に使用できない**ため、親要素もしくは子要素に**どちらか片方を指定**して使用する

```
NG ↓

<div
  v-for="item in itemList"
  v-if="item.displayFlag"
  :key="item.id">
   <el-button 
     @click="onClickItemButton(item)">
     {{ item.name }}
   </el-button>
</div>
```

```
OK ↓

<div
  v-for="item in itemList"
  :key="item.id">
   <el-button 
     v-if="item.displayFlag"
     @click="onClickItemButton(item)">
     {{ item.name }}
   </el-button>
</div>
```
アルゴリズム変更(Substitute Algorithm)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/fdaf5b9d-a029-52fa-35b6-44022684defa.png)


1つずつリファクタリング技法まとめ
個人的に簡単かつ取り入れ易いと思うものから

## 目的
すぐ引き出せるようにする

## 基本作業サイクル
- システムを動かして仕様を精査
- テストメソッドを作成
- テストの失敗を確認
- テストの成功を確認
- 小さい変更、随時テスト実行(パターン追加失敗確認->成功確認)
- 最後テスト実行
- 最後動作確認

## 引数オブジェクトの導入(Introduce Parameter Object)とは
分かりやすいアルゴリズムでメソッドの中身を書き換えること
 
## ポイント
- テストに対して新しいアルゴリズムを実行し、結果が同じになることを確認する
- 実装時は新旧両方の結果に着目し、テストケースと失敗の関係性を理解する

## 例

```
def members(people) 
  members = [] 
  people.each do |person|
    if (person == 'Luffy')
    end
    if (person == 'Zoro')
    end
    if (person == 'Sanji')
    end
  end
  members
end
```
　　　↓

```
def members(people) 
  people.select do |person|
    %w(Luffy Zoro Sanji).include? person
  end
end
```

## 書籍情報
Jay Fields (著), Shane Harvie (著), Martin Fowler (著), Kent Beck (著),
長尾 高弘(訳), リファクタリング:Rubyエディション
https://amzn.to/2VlyWML

## 雑感
単純なアルゴリズムだけにまず抽出して、書き換え時の考慮範囲を限定的にする。
Unity TextMeshPro 日本語表示＋アウトライン

Unityで新規プロジェクトを作成
↓↓↓
###Font Asset Creatorを起動する

（下記参照）
![手順１.png](https://qiita-image-store.s3.amazonaws.com/0/17904/28edb7dd-55d1-dfbf-d2af-8ff5760e720a.png)

###作る前に日本語のフォントを用意する
フォントのURL
https://www.google.com/get/noto/

この中の**Noto Sans CJK JP**をダウンロードして

ファイルを解凍すると、中にフォントデータがいっぱい入っている。
**NotoSansCJKjp-Black.otf**を使いました。どれが良いとかは謎


下記URL参考にして上記手順を行いました。
https://qiita.com/squall22446688/items/0af50b957aca8a4b3881

###Font Asset Creatorを設定する

※設定関係はこちらのURLを参照、とても役に立ちます。
（ https://qiita.com/hinagawa/items/b606c6a2fd56d559a375 ）

●SourceFontStyleに先ほど落としてきたフォントを設定する。

●Padding：小さいとアウトラインができなくなる。

●Atlas Resolution

**Atlas Resolutionは要注意！（めっちゃはまりました）**
8192*8192にすると何故か真っ白になる、
なので**4096*4096**にする。

下記、同じ悩みの方の内容を参照の事
https://teratail.com/questions/175869#_=_

![2019-03-19 (3).png](https://qiita-image-store.s3.amazonaws.com/0/17904/caf26806-b90d-bdd4-045e-df2aa677417e.png)


●Character Set
**CustomRange**でやってますが色々やりかたがあります。

私は下記のファイルの内容をコピーしてCharacter Sequenceエリアに貼り付けました。

https://gist.github.com/thorikawa/2856a7cf912349c0b6b7

数字の部分です。

********************
（注）自分のプロジェクトの利用規約で表示できない漢字が出てきたので漢字を追加
　　　**Character Sequence**エリアに **32-65535** を入力、
　　　Atlas Resolutionを増やさないと表示されない漢字が出てきたので**4096*8192**にする。
　　　**※アトラスのサイズが32Mになったのでヤバい**、要所要所で使う方が建設的

（もう１つのやり方）
　　　どの文字を使うか決まっているなら、**Custom Characters**に切り替えて
　　　ダブってもいいのでアプリ内で使用する全部の文字をメモ帳に全部貼っておき
　　　それを**Custom Character List** のエリアに貼って出力すると最低限の容量に調整しやすい
　　　その時は**Atlas Resolution** を減らして行けばアトラスサイズの削減につなげられる
********************

●Render Mode
は **Distance Field 16** で良いかと思います。


●Generate Font Atlasをクリック

しばらく待つと右側のウインドウがにフォント文字列が表示されます。
**※真っ白の画像になった場合は失敗してます。**

![2019-03-19 (4).png](https://qiita-image-store.s3.amazonaws.com/0/17904/b0b6e0a1-9ffc-a025-7dd5-52950ad19a0d.png)

●名前を付けてSave・Save as　で保存


## 表示してみましょう。（※アウトラインの説明は後ほど）

ヒエラルキー上で「UI」⇒「TextmeshPro Text」で追加できます。

![TextMeshProの追加.png](https://qiita-image-store.s3.amazonaws.com/0/17904/0fe7295e-516c-19be-9bd0-794e2651471b.png)


●アウトライン
**Text Mesh Pro uGui**コンポーネントにある。
OutlineにあるThickness、FaceにあるDilateを同じぐらいの値にして調整する。

細かい使い方は下記URLを参照してください。
http://tsubakit1.hateblo.jp/entry/2017/09/20/220000


![2019-03-19 (5).png](https://qiita-image-store.s3.amazonaws.com/0/17904/16b1ebbe-2880-2ea4-b237-6ec5043f77ae.png)


◆参考URL
https://www.youtube.com/watch?time_continue=80&v=kfODpwcNsoE
http://www.izayoi.co.jp/blog/20170630-unity-text-font-outline.php
agora.io + NWJS

#NW.jsでagora.ioのWebSDKが動作するか確認してみました。

##開発環境
macOS Mojave 10.14.1
VisualStudioCode 1.29.1
AgoraVideoSDK for Web 2.5.2
NW.js 0.37.0



##NW.jsのインストール
今回はnpmで実行しました。

```
$ npm install -g nwjs
$ nw list-remote //バージョンの確認
$ nw install 0.37.0
```

##package.jsonの作成
以下のようにpackage.jsonを作成します。

```json
{
  "name": "Agora Web Sample",
  "main": "index.html"
}
```

##HTMLの準備
今回は[SDK](https://docs.agora.io/en/Video/downloads)に含まれているサンプルをそのまま使います。

```html
<!DOCTYPE html>
<html>
<head>
<title>Agora Web Sample</title>
・・・
```

##実行
```
$ nw .
```

これだけで簡単に作成することができます。
<img width="910" alt="スクリーンショット 0031-03-19 13.20.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/300377/820ad131-4d3d-3b3f-1c46-07dbe95fd24a.png">

[こちら](https://github.com/fu-jimoto/AgoraIO-NWJS)にサンプルコードをあげています。
又、Electronでも同様の事ができます。サンプルは[こちら](https://github.com/fu-jimoto/AgoraIO-Electron)。



#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=e79a263ae1825b8f1358)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=e79a263ae1825b8f1358)
Webpack・TypeScript入門

# この記事のターゲット
- Webpackってよく聞く
- TypeScriptが良いっていろんなところで言ってる
- バニラJSはある程度わかる

# Webpackとは
誤解を恐れずに言えば複数のファイルを一つにまとめるツール。
これによって管理しやすい形に分割されたJSファイルやCSSファイルをリリース時には一つにまとめてローディングの負荷を下げることができる。
また、後述のTypeScriptをファイルをまとめるついでにJavascriptにトランスパイルすることもできる。
https://webpack.js.org/

こちらが詳しいです。
[【５分でなんとなく理解！】Webpack入門](https://qiita.com/Shagamii/items/698a67bab0cd5eefcb4f)


# TypeScriptとは
Javascriptに型の概念を追加するJavascript拡張。
これによってエディターが静的に構文解析して事前にエラーを検知してくれる。
また、他人が作った関数やclassも型の情報を表示してくれたりするのでメンテナンス性が向上する。
https://www.typescriptlang.org/

詳しくはこちら
[TypeScriptの型入門](https://qiita.com/uhyo/items/e2fdef2d3236b9bfe74a)

# さっそく使うよ

### npmの導入
WebpackとTypescriptの導入にnpmを利用するので入ってない方はinstallしてください。

以下参照。
[Node.js / npm をインストール (Mac環境)](https://qiita.com/PolarBear/items/62c0416492810b7ecf7c)

### Webpack導入

ディレクトリを作ってwebpackを入れましょう。

```sh

# ディレクトリ作成
mkdir my-project
cd my-project

# npm プロジェクト初期化
npm init -y

# webpack install
npm install webpack webpack-cli --save-dev
```

### TypeScript導入

先ほど作ったディレクトリでTypescriptを入れます。
webpackからTyepscriptをトランスパイルするためにwebpackのプラグインであるts-loaderもinstallします。

```sh

# typescript install
npm install typescript ts-loader --save-dev

```

### Webpackの設定

webpackの設定を書きます。
設定ファイルを新規作成して中身を書きましょう。

```
touch webpack.config.js
```

```js

module.exports = {
  mode: 'development',
  entry: './index.ts', //ファイルをまとめる際のエントリーポイント
  output: {
    path: __dirname,
    filename: 'bundle.js' //まとめた結果出力されるファイル名
  },
  resolve: {
    extensions: ['.ts', '.js'] //拡張子がtsだったらTypescirptでコンパイルする
  },
  module: {
    rules: [
      {
        test: /\.ts$/,
        loader: 'ts-loader' //ts-loader使うよ
      }
    ]
  }
}
```

### TypeScriptの設定

Typescriptの設定を書きます。
これまた設定ファイルを新規作成して中身を書きます。

```
touch tsconfig.json
```

```json
{
  "compilerOptions": {
    "target": "esnext", #esnextに変換する
    "module": "commonjs", #commonjs方式のモジュールシステム(import/export)を使う
    "noImplicitAny": true, #TypeScriptでは型定義がない変数はany型になる(暗黙のany型)のでこれを禁止する
  }
}
```

### TypeScript書いてみる

webpackの設定でindex.tsから読みこむことにしたので同じ名前でファイルを作って適当にサンプルをかいてみます。

```sh
touch index.ts
```

```typescript

const sayHello = (name: string) : string => {
  return `Hello ${name}!`
}

console.log(sayHello('TS!'))
```

関数の引数と戻り値にstringを明示しました。
呼び出し側でnumberを入れたりすると怒られるはず。

### いざコンパイル
webpackのコマンドを呼ぶためにpackage.jsonのscriptsにちょろっと書きましょう。
（package.jsonに書くとnode_mudulesにパスが通っているので呼び出しやすい）

```json
  "scripts": {
    "start": "webpack --watch"
  },
```

それではいざコンパイル。

```
npm start
```

bundle.jsというファイルが吐き出されて入れば成功！

# まとめ
正直なところ、webpackやtypescriptの設定は種類が多すぎて全然わかってないです。
とはいえとりあえず一度動かしてみたという経験は大きな糧になるはず！
まずは小さく導入して少しずつ学んで行きましょう。
CSSの "display: none" と画像ロード処理について

CSSの `display: none` で画像を非表示にした場合に、「画像ファイルのロード処理が発生するか否か」についてブラウザ間で若干の差異があったため、下記にまとめました。

```html:HTML
<!-- [1] <img>要素に対して "display: none" -->
<img src="1.jpg" style="display: none;">

<!-- [2] background-imageを指定した要素に対して "display: none" -->
<span style="background-image: url(2.jpg); display: none;"></span>

<!-- [3] <img>要素の親要素に対して "display: none" -->
<p style="display: none;"><img src="3.jpg"></p>

<!-- [4] background-imageを指定した要素の親要素に対して "display: none" -->
<p style="display: none;"><span style="background-image: url(4.jpg);"></span></p>
```

|                              | [1] | [2] | [3] | [4] |
|:-----------------------------|:-:|:-:|:-:|:-:|
| Chrome (74.0.3729.131)       | ● | ● | ● | - |
| Firefox (66.0.4)             | ● | - | ● | - |
| Safari (12.1)                | ● | - | ● | - |
| Edge (42.17134.1.0)          | ● | ● | ● | - |
| Internet Explorer (11.0.120) | ● | ● | ● | - |
●: 画像ファイルがロードされる

主要ブラウザにおいては、
**画像を background-image として指定し、その親要素を display: none にする**
という条件では画像ロードが発生しないようです。
EC2のWindowsインスタンスにsshポートフォーワードで接続する ～ 認証プロキシを越えて

## 1. ~/.ssh/config に一行記述する

```bash
ProxyCommand env CONNECT_USER={プロキシユーザー名} CONNECT_PASSWORD={プロキシパスワード} connect -H {プロキシサーバー名}:{プロキシポート} %h %p
```

## 2. ポートフォワードの開始

```bash
ssh -i {pemファイルのパス} -L 13389:{WindowsインスタンスのローカルIP}:3389 ec2-user@{踏み台Amazon LinuxのパブリックIP}
```

## 3. mstscでRDP接続

```text
localhost:13389
```