OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonでコンテンツベースフィルタリングを実装する

#コンテンツベースフィルタリングとは
コンテンツベースフィルタリングはユーザーが評価したデータをもとに、そのユーザーの嗜好に合ったコンテンツを勧める方法のことです。
例えば、今まで見たアニメのなかで、「ソードアートオンライン」と「ダンジョンに出会いを求めるのは間違っているだろうか」を高評価にしているユーザー（自分とか）は「ファンタジー」「バトル」を嗜好としているため、2019年冬アニメは「盾の勇者の成り上がり」をみるといいかもしれない。
協調フィルタリングとは違い、他のユーザーのデータを必要としません。
#コンテンツベースフィルタリングの実装
コンテンツベースフィルタリングは以下の方法で実装していきます。
1. 単語がアイテムの中でどれだけ重要かを求め、これを並べて特徴ベクトルをつくる
2. 求めた特徴ベクトルを他アイテムの特徴ベクトルと比較してコサイン類似度を求める
3. 類似度の高いデータをレコメンドする
##特徴ベクトルを抽出する
文書中に含まれる単語の重要度を評価する手法の1つにtf-idfがあります。
tf-idfはtf(term Frequency、単語の出現頻度)とidf(Inverse Document Frequency、逆文書頻度)の２つの指標に基づいて計算されます。tfとidfは以下の式で計算できます。
$$TF=\frac{文章中に含まれる調べたい単語の出現回数}{文章に含まれる全ての単語の出現回数の和}$$
$$ITF=log\frac{総文書数}{その単語が出現する文章の数}+1$$
Pythonでコードを書くと以下の通りになります。

```py:tf-idf.py
import numpy as np
import math

docs = [
    ['ラノベ','ゲーム','仮想','RPG','オンライン','最強','人工知能','仮想','ゲーム','ファンタジー','近未来','バトル','剣','戦闘','プレイヤー']
    ,['ラノベ','ラブコメ','ファンタジー','ダンジョン','最強','バトル','異世界','コミカル','ライバル','必殺技','熱い']
    ,['異世界','召喚','バトル','ファンタジー','勇者','裏切り','冒険','戦闘','ラノベ','仲間','２クール','魔法','召喚','成長','決闘']
]
data = []

def tf(docs):
    words = set(docs)
    tf_values = np.array([docs.count(doc) for doc in words])
    tf_list = (tf_values/sum(tf_values)).tolist()
    return tf_list

def idf(words, docs):
    words = set(words)
    idf_list = np.array([math.log10((len(docs)+1)/(sum([word in doc for doc in docs])+1)) for word in words])
    return idf_list

tf = tf(docs[0])
idf = idf(docs[0], docs)
tfidf = tf*idf
for i,word in enumerate(set(docs[0])):
    data.append([word, tfidf[i]])
data = sorted(data, key=lambda x: x[1], reverse=True)
print(data)
```

Pythonだとscikit-learnのTfidfVectorizerを使うことでtf-idfを計算できます。
こちらのほうが高速で正確かと思います。
##類似度を判定する
コサイン類似度を使って特徴ベクトルの類似度判定を行います。
三角関数のコサインより、１に近ければ類似しており、0に近ければ似ていないということになります。

```py:cos_sim.py
import numpy as np

def cos_sim(v1, v2):
    return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))

X = np.array([5, 2, 3, 0, 1, 2])
Y = np.array([2, 1, 5, 0, 5, 4])

print(cos_sim(X, Y)) #=>0.7239300246860821
```


#参考
[TF-IDF で文書をベクトル化。python の TfidfVectorizer を使ってみる](http://ailaby.com/tfidf/)
[scikit-learnでtf-idfを計算する](https://qiita.com/katryo/items/f86971afcb65ce1e7d40)
[自然言語処理の基礎技術！tf-idfを簡単に解説！](https://www.sejuku.net/blog/26420)
[【Python】コサイン類似度](https://qiita.com/Qiitaman/items/fa393d93ce8e61a857b1)
factory_botでhas_many throughアソシエーションを作成

# はじめに
rspecでモデルスペックを作成してるときにhas_many_throughのアソシエーションを持ったfactoryを作成しようとして作成の仕方がわからずかなりハマったので備忘録としてまとめます

# テーブル構造
<img width="702" alt="スクリーンショット 2019-08-21 0.38.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281558/2274b76e-8556-601e-47dd-d4110de45691.png">

```ruby:models/article.rb
class Article < ApplicationRecord
    has_many :article_categories
    has_many :categories, through: :article_categories

    validates :title, presence: true
    validates :body, presence: true
    validate :select_categories

    def select_categories
      errors.add(:article_categories, 'を1つ以上選択してください') if article_categories.size.zero?
    end
end
```

```ruby:models/category.rb
class Category < ApplicationRecord
    has_many :article_categories
    has_many :articles, through: :article_categories
end
```

```ruby:article_category.rb
class ArticleCategory < ApplicationRecord
    belongs_to :article
    belongs_to :category
end
```

今回はarticleとcategoryが多対多の関連を持っており、さらにarticleは作成する際１つ以上のcategoryをもつ必要のあるバリデーションが存在するような状況です


# factoryの作成
```ruby:spec/factories/articles.rb
FactoryBot.define do
  factory :article do
    title { 'タイトル' }
    body { 'テキストテキストテキストテキストテキスト' }

    after(:build) do |article|
      category = create(:category)
      article.article_categories << build(:article_category, article: article, category: category)
    end
  end
end
```


```ruby:spec/factories/categories.rb
FactoryBot.define do
  factory :category do
    name { 'カテゴリー名' }
  end
end
```

```ruby:spec/factories/article_categories.rb
FactoryBot.define do
  factory :article_category do
    article
    category
  end
end
```

上記のように記述することでarticle作成と同時に関連テーブルまで作成し、バリデーションを通過させることができます

# テスト結果

```spec/models/article_spec.rb
require 'rails_helper'

RSpec.describe Article, type: :model do
  it "有効なarticleを生成できる" do
    expect(create(:article)).to be_valid
  end
end
```

```console
$ rspec --example '有効なarticleを生成できる'
.

Finished in 0.03327 seconds (files took 2.8 seconds to load)
1 example, 0 failures

```

無事テストが通ることが確認できました！
factory_girlからfactory_botに名前変更してからfactory_botの記事がほとんど見つからなくて泣いてますw
これ以外にもっと良いやり方を知ってる方いたらコメントなどで教えていただけると嬉しいです！

# 参考文献
### factory_bot公式ドキュメント `GETTING_STARTED.md`
https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md

### stackoverflow
https://stackoverflow.com/questions/32383895/factory-girl-has-many-through-validation-deadlock/32410038#32410038
サーバ自動ログインのTeraTermマクロで初回パスワードを間違えたときの対処法

## 概要
サーバ自動ログインのTeraTermマクロを使って
初回のパスワードボックス入力を間違えてしまったけど、
パスワード保存ファイルが指定したところに見当たらない場合の対処法です。

完全に過去の自分向けレベルのニッチな記事ですね。

## 結論

`%LOCALAPPDATA%\VirtualStore\Program Files (x86)\teraterm`
を探そう。

32bit版OSなら下記。
`%LOCALAPPDATA%\VirtualStore\Program Files\teraterm`

## 環境
Windows 7 or 10（厳密にはVista以降）
TeraTerm インストール版

## 発生条件

[Tera Termマクロ活用入門(1)](https://mag.osdn.jp/10/01/08/0825239) のパスワード保存版みたいに
パスワードをpasswdfileに保存する設定にしていて、
下記のようにインストールフォルダ配下のファイルを指定しているとき。

> passwdfile = 'C:\Program Files (x86)\teraterm\passwd.dat'


## 何が起こっているのか

WindowsのVirtualStore機能により別の場所に保存されています。

TeraTermヘルプページの説明は下記。
どちらかといえばssh_known_hostsとかの方が被害を受けやすいのかな。
https://ttssh2.osdn.jp/manual/ja/usage/tips/virtual_store.html

~~相変わらずヘルプは検索性が悪い~~
.NET Coreでテスト用のWebサーバを構築する

# 概要
HTTPクライアントを用いてテストを行う際、ダミーのエンドポイントとなるWebサーバを構築します。
.NET CoreにはKestrelというWebサーバがあるため、折角なので利用してみました。

# 環境
- Windows10
- Visual Studio 2019
- .NET Core 2.2
- Docker for Windows

# コードサンプル
サンプルコードを Github にアップしています。
https://github.com/tYoshiyuki/dotnet-core-mock-web-server

# 解説
コンソールアプリケーションをベースにASP.NET Coreでお馴染みのIWebHostBuilderを作成します。

```C#

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();

```

HTTPのパイプライン処理にロジックを追記します。
HTTPアクセス時のヘッダやボディ情報等を出力します。

```C#

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.Run(async (context) =>
    {
        var req = context.Request;

        var output = new List<string>
        {
            "-------------Request Information Start-------------",
            $"Time[{DateTime.Now}]",
            $"Scheme[{req.Scheme}]",
            $"Path[{req.Path}]",
            $"QueryString[{req.QueryString}]",
            $"Method[{req.Method}]",
            $"ContentLength[{req.ContentLength}]",
            $"ContentType[{req.ContentType}]",

            "-------------Body-------------"
        };
        using (var reader = new StreamReader(req.Body))
        {
            var body = reader.ReadToEnd();
            output.Add(body);
        }

        output.Add("-------------Headers--------------");
        output.Add($"Headers Count[{req.Headers.AsEnumerable().Count()}]");

        foreach (var h in req.Headers.AsEnumerable())
        {
            output.Add($"{h.Key}[{h.Value}]");
        }
        output.Add("-------------Request Information End-------------");
                        
        _logger.LogInformation(string.Join(Environment.NewLine, output));

        await context.Response.WriteAsync("Request Success");
        await context.Response.WriteAsync(Environment.NewLine);
        await context.Response.WriteAsync(string.Join(Environment.NewLine, output));
    });
}

```

デバッグ起動しブラウザでアクセスすると、アクセス時の情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353069/66d1c354-39c9-e584-8345-96d24622ca6d.png)

# Dockerイメージ
DockerイメージをDocker Hubに登録しました。Dockerfileの生成はVisual Studioの機能を利用して実施しています。
上記、Githubのページにdocker-compose.ymlを同梱しています。

```
docker-compose up -d
```

30080ポートでアクセスすると、アクセス時の情報が表示されます。
【UE4】UnrealEditorのショートカット

Unreal Engineのキーボードショートカットにかなり苦戦したので、個人的によく使うショートカットをまとめてみた。

## 開発環境
- マシン: Mac OS 10.14
- バージョン: Unrela Engine 4.22

## ビューポート
<img width="400" alt="8e92168941343ecef63907412d50c53a.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74237/827f9cb4-86ab-148a-0b27-5d3f87f97136.jpeg">

### オブジェクトの選択方法
<img width="108" alt="JankenGame_-_Unreal_Editor.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74237/9b3266cf-30d3-bdd6-82b0-436929e99189.png">
オブジェクトを選択している状態で以下のショートカットキーを実行

|ショートカットキー|動作|
|:-----------------|:------------------|
|W|オブジェクトを選択して移動|
|E|オブジェクトを選択して回転|
|R|オブジェクトを選択して拡大縮小|
|F|選択したオブジェクトにカメラをフォーカスさせます。|

### 画面の操作

|ショートカットキー|動作|
|:-----------------|:------------------|
|左マウスボタンをクリック + ドラッグ|カメラを前後に移動させ、左右に回転させます。|
|option + 左マウスボタンをクリック + ドラッグ|オブジェクトを中心にカメラを前後左右に回転させます。|
|control + 左マウスボタンをクリック + ドラッグ|カメラを回転することなく、前後左右にカメラを移動します|

## イベントグラフ
<img width="400" alt="BP_JankenGameController.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74237/e38f28e6-49ef-3b56-87bd-0c3a2ce5d872.png">

|ショートカットキー|動作|
|:-----------------|:------------------|
|control + 左マウスボタンをクリック + 上下にドラッグ|ズーム設定|
データセンターの基礎知識

# データセンターの基礎知識
夏のISに参加する際に、データセンターについての知識を少しでもつけようと思い、備忘録として残すことにする。筆者はJDCC(Japan Data Center Council)を知らなかったレベルである…
## データセンターとは
データセンターとは、インターネット用のサーバやデータ通信、固定・携帯・IP電話などの装置を設置・運用することに特化した建物の総称。
つまり、<b>分散するIT機器を集約設置し、効率よく運用するために作られた専用施設</b>。1995年の阪神淡路大震災を契機として、ニーズや関心が高まった。
## 特徴
- 多くの通信回線が引きこみ済
- 複数の通信業者の通信回線が利用可能
- 地震に強い構造
    - 耐震：構造自体が頑丈(揺れに耐える)
    - 免震：免震ゴムやすべり支承などで揺れを抑える(揺れを遮断)
    - 制震：制震ダンパーで揺れを抑える(揺れを吸収)
- 大容量蓄電池や自家発電装置がある
- 停電時のために無停電電源装置(UPS)
- 火災対応は二酸化炭素やフロンガスによる消化

## メリット
### セキュリティー
- 内部ＩＴ統制・情報漏洩対策
- 事業継続計画(BCP)対策

### コスト削減
- アセットレス経営(オフバランス化)
- IT部門のアウトソース化
- 基本的に従量制課金方式

### 省エネ
- サーバの負荷に応じた空調コントロール
- フリーアクセスフロア
- ホットアイル/コールドアイル分離
- CO2削減

## 利用方法
### ハウジング(施設のスペースを借りる)
コロケーション/ケージングともいう。自社で使用したい機器を持ち込めるというメリットがある。ラック等を借りるタイプと、スペース自体を借りるタイプがある。
### ホスティング(事業者側が用意したものをレンタルする)
いわゆるレンタルサーバーである。事業者が用意したサーバやストレージ機器を共有又は占有で利用する。スペックや利用時間に応じて課金される。
## クラウド活用のリスク
- 特権ユーザによるアクセス
- コンプライアンス
- データの隔離方法についての把握
- データ復旧時間/完全リストアの有無
- 特定の調査や証拠開示におけるベンダの協力有無
- 買収・合併吸収後のデータ回収方法及び後継への移植可否

## 日本国内の現状について
### メリット
- 治安が良く、政情不安定のリスクが少ない
- 電力供給・通信インフラが安定
- 高品質な運用を担う人材が豊富

### 課題
- 政府・自治体等との施策との連動強化
- 国内事情にあっていない海外発ガイドライン流布
- データセンターに特化した人材育成・ガイドラインなし

## 「ガラパゴス」化とは
調べているとよく出てくるので記載しておく。
日本で生まれたビジネス用語であり、孤立した環境で最適化が著しく進行すると、エリア外との互換性を失い孤立して取り残される。そして、外部から適応性と生存能力の高い種が導入されると最終的に淘汰される危険に陥ること。
要約すると、<b>日本市場に合わせすぎると海外に適応できなくなるだけでなく、海外から汎用性が高く低価格の製品や技術に勝てなくなる<b>ということである。

## 参考文献
>https://cloud.watch.impress.co.jp/docs/cdc/special/1183705.html
Class 'hogeClass' has no initializers って出た時の対処法[Swift]

# 原因
classっていちいち`init()`せなダメだっけ？と思っていたところ原因はこれだった

**定義してた変数がオプショナル型でなかった**
→`nil`を許して！→初期化して！　ということらしい

# 対処
オプショナル型にする(`hogehogeDelegate`→`hogehogeDelegate?`)

```swift
class hogeClass {
    
    private var delegate: hogehogeDelegate?
//private var delegate: hogehogeDelegate だとエラー出る
  
}
```

# 参考
**・[swift初心者:「Class 'ViewController' has no initializers」の対処方法 - Qiita](https://qiita.com/Atsushi_/items/0d2eb4124e2ef5ed7d05)**
VisualStudio＋Phaser3(TypeScript)でソースファイル分割

#やりたいこと
Phaser3(TypeScript)で、Cで言うincludeとか、Javaで言うimportとかしたかった。
かっこよくなくなるので、できればhtmlにscriptタグ羅列するのではなくTypeScriptのソース内で完結させたい。
めんどくせえからビルドなんていちいち叩きたくないのでなんかIDEの上の方にあるみどりのさんかくおしただけでうごいてほしい
#ハマった！
えーとexportsのメンバに入れるのか‥‥‥？　requireで？　importってのもあるのか？　あれ？require.jsがいるの？
TypeScriptではファイルの先頭に ```///<reference path="PATH"/>```いれないといけないのか？　これでいける‥‥‥？
定義されていない‥‥‥？　ナンデ？
#解決した！
~~参照する側の.tsファイルにて、~~

~~```///<reference path="hoge.ts" />```~~

~~と記述し（自動補完が効きました。IDE凄い！）、~~
どうもここは必須ではないみたいです

VisualStudioにて、ソリューションのプロパティ→TypeScriptビルド　で
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/461661/3437dd7d-b18b-099b-83dc-26a11b793d9f.png)
ここのチェック入れてファイル名指定すると全部のtsファイルを一つのjsファイルに結合して出力できるんですね。
referenceタグの関係を見て、きちんとした順番で結合してくれるみたいです。
それだけで解決しました。
あとはnamespace内に入れてexportするなりグローバルに全部置くなりでなんとかなります。
VisualStudio完全に理解しました。

備忘録のために載せておきます。
Python勉強の記録_190820

#やったこと
- [AtCoderの問題を分類しました](https://qiita.com/KoyanagiHitoshi/items/32dc42d8c5ee75339e54)の続き

#学び
- join関数

```py
lst = ["a","b","c","d","e"]
hoge = " ".join(lst)
print(hoge)
#a b c d e
hoge = ",".join(lst)
print(hoge)
#a,b,c,d,e

#リストの要素がintなら
lst_2 = [1,2,3,4,5]
map_lst_2 = map(str, lst_2)
hoge = " ".join(map_lst_2)
print(hoge)
#1 2 3 4 5
```
RaspberryPi 3 とCentOS「自分用備忘録」

執筆時点での最新イメージ

 ~~http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/7.6.1810/isos/armhfp/~~
バージョンが変わったのでリンク先にファイルはない。

山形大学のリンクにはなるが、
http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/7/isos/armhfp/
http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/8/isos/armhfp/


の下にファイルがあるはず。

最初にrootfs-expandを実行しないと/パーティションが2GBしかない。
testバージョンと違って/usr/local/bin/rootfs-expandではないので要注意

rootログイン後にREADMEファイルが置いてある場合にはそちらを参照すると幸せになれるはず

rootにログイン後の/rootにて

rootfs-expand
と入力すれば容量が増える。


実行後dfコマンドで確認すると容量が増えているはず。

testバージョンと違い最初からyum/dnfが使える

なお、2020/05/18現在centos8をRaspberryPi 3に
CentOS-Userland-8-armv7hl-generic-Minimal-1911-sda.raw.xz
をインストール、dnf updateをかけ、再起動を行うと各デバイスが認識されなくなる。(勿論NICも認識されないのでNWに繋がらない)
centosを利用する場合には7を使用したほうがよいだろう。


以上
Mermaid.js Live Editorのテーマを変更する


# はじめに
最近フローチャートを描くために使っている、Mermaid.jsのLive Editor。
何もインストールせずにつかえて、書き終わったらリンクを送るだけでいいので仕事で重宝しています。

https://mermaidjs.github.io/mermaid-live-editor

# テーマ変更方法

Mermaid configurationを変更します。

``` js
{
  "theme": "neutral"
}
```

# テーマの種類

themeはいまのところ4種類あります。

|theme|色|
|---|---|
|dark|<img width="360" alt="mermaidjs-dark-theme.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67320/84150144-a86f-2438-73c8-25eca50f94a5.png">|
|default|<img width="351" alt="mermaidjs-default-theme.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67320/178aa3df-9a36-26d1-b7ef-3087313c226d.png">|
|forest|<img width="346" alt="mermaidjs-forest-theme.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67320/b9a30c90-9343-39f7-7c22-057ddf53152b.png">|
|neutral|<img width="333" alt="mermaidjs-neutral-theme.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67320/95a3136d-fe79-7c1a-eaab-86fa6f5045ca.png">
|

## 参照

[mermaid.jsのドキュメント](https://mermaidjs.github.io)
[Live Editorのソースコード](https://github.com/mermaidjs/mermaid-live-editor)
NSRangeからSwiftのRangeへの置換方法

# はじめに

NSRangeはlocation（位置）とlength（長さ）の2つを持つ、範囲を表す構造体です。
SwiftではRangeとして範囲の扱いについて再定義されています。
NSを外せば置き換えられません。別物といってもいいくらいです。

# 対比表

とりあえずNSRangeからRangeに置き換えたいときは、この対比表で置き換えてください。

|        | NSRange  | Range      |
|--------| ---------|------------|
|開始位置 | location | startIndex |
|長さ    | length   | count      |


## NSRange

文字列から取得する方法

``` objc
NSString *text = @"つれづれなるままに";
NSRange rangeTest = [text rangeOfString:@"ままに"];
```

また、`NSMakeRange` で作成することもできます。

``` objc
NSRange range = NSMakeRange(3, 5);
```


# 参照

[NSRange - Foundation | Apple Developer Documentation](https://developer.apple.com/documentation/foundation/nsrange?language=objc)
[Range - Swift Standard Library | Apple Developer Documentation](
https://developer.apple.com/documentation/swift/range)

[NSRangeの使い方 - Object for cutie](https://tanaponchikidun.hatenadiary.org/entry/20120814/1344916945)
[swift - How to convert Range in NSRange? - Stack Overflow](https://stackoverflow.com/questions/43233070/how-to-convert-range-in-nsrange?rq=1)
[[Swift2]Stringの Range と NSRange の変換 : 永遠日誌](http://blog.livedoor.jp/eienf/archives/1067296848.html)
AngularのReactive Formsに型を追加する ngx-type-safe-reactive-form を公開しました

こんにちは。
みなさん、AngularのReactive Formsは使ってますか？

僕は仕事でも活用していて、めっちゃお世話になっています。
めっちゃ便利ですよね、Reactive Forms。
しかし、こんなことありませんか？

**フォームのvalueにアクセスするとき、型が欲しい～～～～**

**valueChangeをsubscribeしたときに型がないのつれぇ～～～～**

**FormGroupの子フォームにcontrolsでアクセスしたらタイポして実行時に怒られた。。。**

これらは全部僕の体験談ですが、同じ苦しみを感じているのは僕だけではないはず！

ということで、Reactive Formsに型を追加したngx-type-safe-reactive-formというライブラリをnpmで公開しました。

*※念のため、[弊社ブログ](https://blog.suzukishouten.co.jp/archives/1807)にも全く同じ記事がありますが、コピーコンテンツではなく同一著者です。*

# 対象読者

AngularのReactive Formsを使っているけど、型がなくて辛い人

# 使い方

[リポジトリ](https://github.com/itigoore01/ngx-type-safe-reactive-form)に使い方は書いていますが、一応こちらでも書いておきます。

インストールします。

```bash
npm install --save ngx-type-safe-reactive-form
```

もし `ReactiveFormsModule` をインポートしていない場合は、インポートします。

```typescript
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { ReactiveFormsModule } from '@angular/forms';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    ReactiveFormsModule,
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
```


コンポーネントを書いていきます。
ほとんど通常のReactive Formsと同じですが、`FormBuilder`の代わりに`TypeSafeFormBuilder`を使用しています。
`TypeSafeFormBuilder`の使い方は`FormBuilder`と同じです。

```typescript
import { Component } from '@angular/core';
import { TypeSafeFormBuilder } from 'ngx-type-safe-reactive-form';

@Component({
  selector: 'app-root',
  template: `
  <form [formGroup]="form" (submit)="submit()">
    <input placeholder="Username" formControlName="username">
    <input type="password" placeholder="Password" formControlName="password">
    <input type="checkbox" formControlName="rememberMe">
    <button type="submit">Output console</button>
  </form>
  `,
  styles: []
})
export class AppComponent {

  readonly form = this.formBuilder.group({
    username: '',
    password: '',
    rememberMe: false,
  });

  constructor(
    private formBuilder: TypeSafeFormBuilder,
  ) { }

  submit() {
    const { username, password, rememberMe } = this.form.value;

    console.log(
      `Username: ${username}\n` +
      `Password: ${password}\n` +
      `Remember me: ${rememberMe}`
    );
  }

}
```

以下のとおり、ちゃんと型が効いています。

![capture.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75063/579ed63f-0c96-b2c1-b152-20b3355777bd.gif)

今回の例だと`rememberMe`が`boolean`型ではなく`false`になっているので、必要であれば型アサーションを使用します。

```typescript
    // as booleanを追加する
    rememberMe: false as boolean,
```
SSH接続方法まとめ

## 概要
ちょくちょく聞かれる内容を記事として残しておきます

## 鍵の生成
```
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/key-name -C "user-name@host-name"
```
コメントを削除したい場合は-C ""とすればよい

## SSH接続
### 基本
```
$ ssh user-name@host-name 
```

### よく使うオプション
- -i 秘密鍵
- -p ポート番号

## configファイルを利用したSSH接続
configファイルを使う事で入力を簡略化する事が可能

### configファイルの作成と権限の調整
```
$ touch ~/.ssh/config
$ chmod 600 ~/.ssh/config
```

### 設定例
```config
Host ec2_test
  HostName xxx.xxx.xxx.xxx
  port 22
  User ec2-user
  IdentityFile ~/.ssh/aws-key
```

警告メッセージを出したくない場合は下記の設定を加えておくとよい

```config
Host *
  StrictHostKeyChecking no
  UserKnownHostsFile=/dev/null
```

### 接続コマンド
configのHostで指定した値を使う事でコマンドの省略が可能

```
$ ssh ec2_test
```
php-master-changes 2019-08-19

今日は arginfo を PHP スタブへ移行する修正があった！

# 2019-08-19
## iNem0o: Add md5 arginfo stubs
- https://github.com/php/php-src/commit/ff7900f551908e43348b10b5dc2ec20267a0ffbd
- [md5()](https://www.php.net/manual/ja/function.md5.php)、[md5_file()](https://www.php.net/manual/ja/function.md5-file.php) の arginfo を PHP スタブへ移行

## iNem0o: Add metaphone arginfo stubs
- https://github.com/php/php-src/commit/b7c4d8e8467cdd75f0910618e3cdfcff08ab2a04
- [metaphone()](https://www.php.net/manual/ja/function.metaphone.php) の arginfo を PHP スタブへ移行

## iNem0o: Add pageinfo arginfo stubs
- https://github.com/php/php-src/commit/8150c65ae4f72545eac40d0374e1d34f215f27bc
- getmyuid() や [getmyinode()](https://www.php.net/manual/ja/function.getmyinode.php) など、pageinfo の関数の arginfo を PHP スタブへ移行

## iNem0o: Add sha1 arginfo stubs
- https://github.com/php/php-src/commit/baeb10d736f45a1ab84df78e65483f732f4fbbca
- [sha1()](https://www.php.net/manual/ja/function.sha1.php)、[sha1_file()](https://www.php.net/manual/ja/function.sha1-file.php) の arginfo を PHP スタブへ移行
WebElement 内部を find_element_by_xpath() で再検索した時のつまずき

python selenium の WebDriver でブラウザテストを作成しているときにWebElement 内部 の検索にfind_element_by_xpath を使った際につまずきましたのでまとめます。

## つまずき1：要素内部についての find_element_by_xpath() 検索のはずなのに、別の要素の値が取れてしまう

```browserTest.py
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.chrome.webdriver import WebDriver

def printUserEmails(driver:WebDriver)->None:
    UserTables = driver.find_elements_by_xpath('//table[start-with(@name, "user")]')
    if len(UserTables) == 0:
        print('Userが表示されていません。')
        return
    for UserTable in UserTables:
        emailElement = UserTable.find_element_by_xpath('//input[@type="text" and @name="email"]')
        print(emailElement.get_attribute('value'))

```
```結果.txt
user1@aaa.bbb
user1@aaa.bbb
user1@aaa.bbb
user1@aaa.bbb
.
.

```

■状況
「一度 find_elements_by_xpath()　でとった WebElement の List について for ループを回しているにも関わらず**一番最初の要素**の同一の値が取れてしまう」という現象につまずきました。

## ■原因：XPath の文字列の最初の「//」が「HTML内の全要素」という意味のため再検索していた
xpath「//」←「HTML内の全要素」から検索するの意味
（こちらの記事に詳細に記載して頂いておりましたので参考にさせて頂きました。
https://www.techscore.com/tech/XML/XPath/XPath3/xpath03.html/#xpath3-2
）


```python
element.find_element_by_xpath('//tag名') #  →　Rootから検索するので同じデータが取得されてしまう
element.find_element_by_xpath('tag名') # →　対象要素から検索できる

```
## ■対応：xpath の文字列 から最初の「//」を消す

```browserTest.py

#ーー中略ーー
    for UserTable in UserTables:
        emailElement = UserTable.find_element_by_xpath('input[@type="text" and @name="email"]')
        print(emailElement.get_attribute('value'))


```
これでルートHTMLから検索されることはなくなりました。



## つまずき2：要素からEmailが見つからなくなってしまった。
上記の対応で、「//」を消して、root からの検索をしないようにしたのですが、今まで取得できていた、検索がかからなくなり失敗するようになってしまいました。

## ■原因：「//」が特殊で、通常XPathは全パスを指定しないといけないため。
通常XPath は**HTML からの全要素を指定して記述することで、DOMを解析し要素を特定する**ようで（**「//」が特殊で全要素を読み込むという意味**）
User の table タグ直下に input が存在しないため、検索に失敗しまいました。

```python
element.find_element_by_xpath('tag名') 
# →　対象要素直下に検索対象のtagがないと検索失敗となる。
```


## ■対応：子要素　の 内部 全検索は「.//検索条件」
```python
element.find_element_by_xpath('.//tag名') 
# →　対象要素直下に検索対象のタグがあれば取得する

```

要素.find_element_by_xpath('.//検索条件') で記述するようにすることで、**current node からの検索として、全検索できるようでした。**
https://stackoverflow.com/questions/21578839/how-to-find-the-element-within-element-in-selenium 




```browserTest.py
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.chrome.webdriver import WebDriver

def printUserEmails(driver:WebDriver)->None:
    UserTables = driver.find_elements_by_xpath('//table[start-with(@name, "user")]')
    if len(UserTables) == 0:
        print('Userが表示されていません。')
        return
    for UserTable in UserTables:
        emailElement = UserTable.find_element_by_xpath('.//input[@type="text" and @name="email"]')
        print(emailElement.get_attribute('value'))

```

```結果.txt
user1@aaa.bbb
userDummy@aaa.bbb
aaa@aasdfaa.bbb
e1@aaa.bbb
.
.


```


以上です。
Pythonってなんだろう(随時更新)

# Pythonって何?　![Python_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185247/f3f119f0-975f-212f-bfc7-ca144b725104.png)

Python = 汎用プログラミング言語[^1]、スクリプト言語[^2]、Google三大言語[^3]の一柱
[^1]: 特定の用途に向けて作られた言語ではなく、何でもできる言語
[^2]: 簡易な記述ができるプログラミング言語、その分実行速度はコンパイル言語に比べると遅くなる
[^3]: Google三大言語の残りの2つはC++とJava

- AI、ML(機械学習)、DL(深層学習)に特に向いている(ライブラリが揃っている)
- 本格的なWebサービスが作れる
- ライブラリが豊富
- 可読性に優れている
- コードの書き方が個人に依存しない

# こんなところにPythonが!!
PythonはGoogleが使用する主要言語になっているように、さまざまなWebサービス/アプリケーションに用いられています。
事例(私が使っている範疇のもので)

- Anki
- シヴィライゼーション4
- World of Tanks
- Instagram
- Pinterest
- Google App Engine
- Pepper

## 特に科学関連のライブラリが豊富
数学ライブラリとして　Matplotlib, Numpy, SymPy, Sage
科学ライブラリとして　Scipy, scikit-learn, Mlpy
などがある。
仮想PCの構築

よくわかってないが仮想環境について勉強する。

■目的
・仮想環境の概念を理解すること
・仮想N/Wを理解すること
・N/Wがらみの実験を


■メモ欄
・早速躓いたが、VirtualPCはWIn7じゃないと無理みたい(https://okwave.jp/qa/q9635642.html)
AWSソリューションアーキテクト資格勉強のメリットとその方法

# 記事概要

- AWS認定ソリューションアーキテクト アソシエイト資格を勉強するメリットの紹介
- 実際に合格するまでにおこなった勉強法の紹介

# 対象読者

- これから、AWS認定ソリューションアーキテクト アソシエイトを受験しようと考えている方
- 資格試験の勉強なんて本当に意味あるの？と懐疑的な方
- どうやったらソリューションアーキテクト アソシエイトって合格できるの？と疑問をお持ちの方

# 勉強するメリット
ソリューションアーキテクトの勉強する最大のメリットは、AWSの体系的な知識が効率的に学べる点だと考えています。
私自身がそうでしたが、「AWSは使ったことがあるものの、EC2・RDS・S3・Route53くらいしか分からない」という方は多いのではないかと思います。
いざ勉強しようと思っても、書店に並んでいるものはクラウドデザインパターンだったり、実例集のようなものが多く、AWS全体の俯瞰図を得るにはやや物足りないという印象です。
そんな人には、是非ソリューションアーキテクト資格の勉強をおすすめしたいです。

ソリューションアーキテクトでは、「設計者」という立場からシステム全体の構成を問う問題が多く出るので、必然的に幅広いサービスの概要と特徴をおさえることになります。なので、仮に試験を受けなかったとしても、現在、各出版社から出ている試験対策の教科書をとりあえず一周読むだけでも効率よく多くのサービスを知ることができます。
正直、私も最初は受験しようと思って勉強したわけではありませんでした。不合格だったとしても労力に見合った知識は身についたので満足していたと思います。

で、実際に勉強してみて実務で役に立つの？という疑問は当然あるかと思うので、そちらに回答すると、合格する前の時点でもかなり役立ちました。
私は、会社のプロジェクトで開発リーダーを務めていることもあり、システムの設計にも関わるタイミングがありました。その際、EC2 + RDSという構成のWeb APIサーバをAPI Gateway + Lambda + DynamoDBのサーバーレスアーキテクチャへ移行する提案をおこなったのですが、サーバーレス以降へのメリットやAPI Gateway + Lambda + DynamoDBのスケーラビリティやDynamoDBの冗長性についてはかなり説得力のある説明ができたと感じました。

それ以外でも、社内で散逸している開発部ごとのAWSアカウントの管理方法に関する助言や、ACMを使ったSSL証明書の管理、ELB + EC2の組み合わせにおけるAutoScalingに関する提案など、社内AWSコンサルタントとして認知度が上がったという実感があります。
ソリューションアーキテクト試験の勉強で万遍なく知識を入れておくと、サービス選定の「WHY」に曇りなく答えることができるので、自分の関わるプロジェクトでもサーバー構成に対する不安が軽減します。

# 勉強法
## 使用した教材
- 徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書、インプレス、2019年　(https://www.amazon.co.jp/dp/4295005495)
- AWS公式の模擬試験(https://www.aws.training/certification?src=cert-prep)

これだけです。合格者の体験記を読んでいると、ホワイトペーパーを読んでいる方も多く見かけましたが、特に必要性は感じませんでした。

## 学習手順
- 教科書を1回通読。よくわからないサービスがあってもあまり気にせず1週間くらいで読み通す。章末のテストもちゃんと解く。
- 教科書購入者は、インプレス社が提供している模擬試験のPDFが手に入るので、解く。
- 上で、間違えた問題は解説を読む。正解を選ぶ上でのキーワードは、エディタでもノートでも良いのできちんとまとめておく。
- 教科書を再度通読。2周目にも関わらず親しみを覚えないサービスは、きちんと暗記用にまとめておく。
- AWS公式の模擬試験(有料。税込み(8%)2160円)を受験する。
- 上で、スコアレポートに各分野の得点率が出るので、それを元にして教科書を復習する。
- 試験前日に、インプレス社の模擬試験を解いて、自信をつける。

こんな学習法で見事合格しました。

# さいごに
勉強するか迷っている人は、勉強して損はないので是非勉強してみてください。
勉強してみて、腕試ししたいという気持ちになったら、受験してみたらいいかと思います。

偉そうに、書きましたがAWSのサービスは幅広く、まだまだ触ったことのないサービスだらけです。
ソリューションアーキテクト アソシエイト試験の合格を機に、様々な知見を得られるようにトライしていきたいです。
Python勉強の記録_190819

#やったこと
- 競技プログラミング続き
- やさしく始めるラズベリー・パイを読み始めた


#学び
- Global

```py
#local
a = "before"
def sample():
    a = "after"
print(a) #before
sample()
print(a) #before

#global
a = "before"
def sample():
    global a
    a = "after"
print(a) #before
sample()
print(a) #after
```
- リストのcountとindex

```py
lst = [1,1,4,6,7]
print(lst.count(1))
#2
print(lst.index(6))
#3
print(lst.index(1))
#0（最初にある要素のインデックスを表示）
print(lst.index(0))
#エラー
```
素人による "and return unless"

# [Railsチュートリアル11章リスト11.40](https://railstutorial.jp/chapters/account_activation?version=5.1#sec-exercises_activation_test_and_refactoring)にて
　以下のコードがあった。

```ruby
  def show
    @user = User.find(params[:id])
    redirect_to root_url and return unless @user.activated?
  end
```

　このコードの中の`and return unless`の挙動が分からなかったので、調べて考えたことをまとめておく。

# `and return`について
　まずは`and return`について見てみよう。[Railsガイド](https://railsguides.jp/layouts_and_rendering.html#%E4%BA%8C%E9%87%8D%E3%83%AC%E3%83%B3%E3%83%80%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E9%81%BF%E3%81%91%E3%82%8B)にて以下の解説と参考コードがあった。
>Rails開発をやっていれば、一度は "Can only render or redirect once per action" エラーに遭遇したことがあるでしょう。いまいましいエラーですが、修正は比較的簡単です。このエラーはほとんどの場合、開発者がrenderメソッドの基本的な動作を誤って理解していることが原因です。

```ruby
def show
  @book = Book.find(params[:id])
  if @book.special?
    render action: "special_show"
  end
  render action: "regular_show"
end
```

　上のコードでは、`@book.special?`が`true`の時、`if`文内の`render`とその外の`render`も実行されてしまい、二重レンダリングというエラーになる。そこで、`and return`を使って明示的にメソッドを抜けることで二重レンダリングを避ける。

```ruby
def show
  @book = Book.find(params[:id])
  if @book.special?
    render action: "special_show" and return
  end
  render action: "regular_show"
end
```

　挙動としては、`render`や`redirect_to`の戻り値が`true`なので、`and`の後ろの`return`が実行されるということだ。

　なお、`&& return`を使うとこの場合正しく動作しない。というのも、`&&`は優先度が高いので`render action: ("special_show" && return)`ということになるからだろう。一方の`and`の優先度は超低い。`and return`はこの`and`の優先度の低さを上手に利用している。

# `and return unless`について
　`and return`の働きと`and`の優先度について書いたので、あとはそれを組み合わせるだけだ。もう一度最初のコードを見てみよう。

```ruby
  def show
    @user = User.find(params[:id])
    redirect_to root_url and return unless @user.activated?
  end
```

　`and`の優先順位は低いので、`redirect_to root_url`が先に評価されるので、`and`が評価するのは`redirect_to root_url`と`return`になる。（）でくくってやると以下のようになる。

```ruby
(redirect_to root_url) and (return)
```

  あとは、上のカタマリがunlessの後置修飾がついているだけだ。つまり、`redirect_to root_url and return unless @user.activated?`は以下と同じになる。

```ruby
unless @user.activated?
  redirect_to root_url and return
end
```

# おわり
　`and return unless`というカタマリで見てしまったので挙動が見えず分からなくなってしまったが、ひとつずつ分解して見てみるとそこまで恐ろしいものでもなかった。「巨大で恐ろしい相手でも、ひとつひとつは取るに足らないものだぞ」と人生の教訓をプログラミングが教えてくれた。
Leetcode #609: Find Duplicate File in System

```swift
func findDuplicate(_ paths: [String]) -> [[String]] {
    var dict = [String: [String]]()
    for path in paths {
        let components = path.components(separatedBy: " ")
        for i in stride(from: 1, to: components.count, by: 1) {
            var file = components[0] + "/"
            var str = Array(components[i])
            var index = 0
            while str[index] != "(" {
                file += "\(str[index])"
                index += 1
            }
            index += 1
            var content = ""
            while str[index] != ")" {
                content += "\(str[index])"
                index += 1
            }
            if let value = dict[content] {
                dict[content] = value + [file]
            } else {
                dict[content] = [file]
            }
        }
    }
    var answer = [[String]]()
    for key in dict.keys {
        if dict[key]!.count != 1 {
            answer.append(dict[key]!)
        }
    }
    return answer
}
```
kubectl diffを使ってみる

# kubectl diffを使ってみる

[kubernetesのドキュメント](https://kubernetes.io/docs/concepts/overview/working-with-objects/object-management/)を読んでて、`kubectl apply -f hoge.yml`はよく使うけど、 `kubectl diff`を使ってなかったので、どのように表示させれるか気になって試した。


## 使用した環境

* GKE
* version 1.13.7-gke.19

## 試す

### 変更前のmanifest

```yml:deployment_old.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
```

### 変更後のmanifest

```yml:deployment_new.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3 # <- ここを変更する
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
```

### deployment_oldのapply

```shell
$ kubectl apply -f deployment_old.yml
deployment.apps/nginx-deployment created

$ kubectl get pod
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-76bf4969df-c7btx   1/1     Running   0          2m7s
nginx-deployment-76bf4969df-jvnjx   1/1     Running   0          2m7s
```


### deployment_oldとdeployment_newとのdiff

`$ kubectl diff -f deployment_new.yml`をしたところ・・・
普通にdiffだった。

```diff

diff -u -N /var/folders/3p/67s9vdms1vqd95dyynttcvyr0000gn/T/LIVE-194678655/apps.v1.Deployment.default.nginx-deployment /var/folders/3p/67s9vdms1vqd95dyynttcvyr0000gn/T/MERGED-809569490/apps.v1.Deployment.default.nginx-deployment
--- /var/folders/3p/67s9vdms1vqd95dyynttcvyr0000gn/T/LIVE-194678655/apps.v1.Deployment.default.nginx-deployment	2019-08-20 22:52:12.000000000 +0900
+++ /var/folders/3p/67s9vdms1vqd95dyynttcvyr0000gn/T/MERGED-809569490/apps.v1.Deployment.default.nginx-deployment	2019-08-20 22:52:12.000000000 +0900
@@ -6,7 +6,7 @@
     kubectl.kubernetes.io/last-applied-configuration: |
       {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},"spec":{"replicas":2,"selector":{"matchLabels":{"app":"nginx"}},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.7.9","name":"nginx","ports":[{"containerPort":80}]}]}}}}
   creationTimestamp: "2019-08-20T13:45:17Z"
-  generation: 1
+  generation: 2
   name: nginx-deployment
   namespace: default
   resourceVersion: "1135"
@@ -14,7 +14,7 @@
   uid: bef21344-c350-11e9-8bb0-42010a92004b
 spec:
   progressDeadlineSeconds: 600
-  replicas: 2
+  replicas: 3
   revisionHistoryLimit: 10
   selector:
     matchLabels:
exit status 1
```

## 感想

CDのパイプラインでも、diffで確認したあとに、applyってしたほうが安全だし、変更点に気づきやすいんじゃね？と思った。
[Scala] 標準入力取得方法について 個人的まとめ

普段の業務では標準入力の値を取得することがないのですが、paizaのスキルチェックをやったときに、Aランクあたりから標準入力の形式が複雑になり、手間取ったので、方法をまとめてみました。

「もっと良い方法があるよ！」という方はコメント頂けると幸いです。

# 一行取得
Dランク~Bランクでよくある

```
// 一行取得
val line = scala.io.StdIn.readLine

// 1文字ずつ分割
val split = line.toList
```

# 複数行取得
Bランク~でよくある

## 全行同一の型、入力数

入力例

```
10 1 30
33 3 3
22 1 4
13 4 5
```

```
object Main extends App {
  // 受け取りたい型に合わせて型を指定
  val tempList: Seq[(Int, Int, Int)] = {
    for(line <- io.Source.stdin.getLines()) yield {
      // Stringのリストを作る場合は、.map(_.toInt)を抜く
      val rowData = line.split(' ').map(_.toInt)
      (rowData(0), rowData(1), rowData(2))
    }
  }.toSeq

  // 標準入力を変数にセット
  val (l, m, n) = tempList.head
  val list = tempList.tail

  println("l:" + l + ", m:" + m + ", n:" + n)
  println(list)
}

// 出力
// l:10, m:1, n:30
// List((33,3,3), (22,1,4), (13,4,5))
```

## 一行目と二行目以降で扱いが違うケース

入力例

```
A B C D
33 3 3
22 1 4
13 4 5
```

```
object Main extends App {
  // 受け取りたい型に合わせて型を指定
  val tempList: Seq[Seq[String]] = {
    for (line <- io.Source.stdin.getLines()) yield {
      line.split(' ').toSeq
    }
  }.toSeq

  // 標準入力を変数にセット
  val (k, l, m, n) = (tempList(0)(0), tempList(0)(1), tempList(0)(2), tempList(0)(3))
  val list = tempList.tail.map(l => l.map(_.toInt))

  println("k:" + k + ", l:" + l + ", m:" + m + ", n:" + n)
  println(list)
}

// 出力
// k:A, l:B, m:C, n:D
// List(List(33, 3, 3), List(22, 1, 4), List(13, 4, 5))
```

## 区切り文字がない場合

入力例

```
10 3
000100
110000
111100
```

```
object Main extends App{
  // 受け取りたい型に合わせて型を指定
  val firstRow = scala.io.StdIn.readLine.split(' ').map(_.toInt)
  // 標準入力を変数にセット
  val (m, n) = (firstRow(0), firstRow(1))

  // nが行数を表しているとする
  val list = for (i <- 1 to n) yield (scala.io.StdIn.readLine.toList)

  println("m:" + m + ", n:" + n)
  println(list)
}


// 出力
// m:10, n:3
// Vector(List(0, 0, 0, 1, 0, 0), List(1, 1, 0, 0, 0, 0), List(1, 1, 1, 1, 0, 0))
```
Object.values()を使用してmapする

#はじめに

JavaScriptや[TypeScript](https://www.typescriptlang.org/)ではmapというものをよく使うと思います．mapを使うときに[Object.values()](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/values)を使うとオブジェクトから値の配列を取り出しmapすることができたのでメモ程度ですが書いておきます．

# 例えば...
```
"monday" : {
  "date" : "2019-06-10T01:29:27.164Z",
  "attendance" : {
    "feeling_id" : "id_1",
    "is_input" : true
  },
  "leaving" : {
    "feeling_id" : "id_2",
    "is_input" : true
  }
},
"tuesday" : {
  "date" : "2019-06-11T01:29:27.164Z",
  "attendance" : {
    "feeling_id" : "id_3",
    "is_input" : true
  },
  "leaving" : {
    "feeling_id" : "id_5",
    "is_input" : true
  }
},
"wednesday" : {
  "date" : "2019-06-12T01:29:27.164Z",
  "attendance" : {
    "feeling_id" : "id_4",
    "is_input" : true
  },
  "leaving" : {
    "feeling_id" : "id_3",
    "is_input" : true
  }
},
"thursday" : {
  "date" : "2019-06-13T01:29:27.164Z",
  "attendance" : {
    "feeling_id" : "id_3",
    "is_input" : true
  },
  "leaving" : {
    "feeling_id" : "id_3",
    "is_input" : true
  }
},
"friday" : {
   "date" : "2019-06-14T01:29:27.164Z",
   "attendance" : {
     "feeling_id" : "id_2",
     "is_input" : true
   },
   "leaving" : {
     "feeling_id" : "id_5",
     "is_input" : true
   }
}
```
こんなデータがあった時，曜日は違うけどその中身は一緒だからmapを使って中身を使いたいと思ってもmapは使えない．そんな時に使うのがObject.values()です．
 
#Object.values()とは？
objectに直接存在する列挙可能な値が配列要素の文字列に対応した配列を返します．プロパティの順序はマニュアル操作でオブジェクト内のプロパティに対してループさせた時の順序と同じになります．

と言われてもよくわからない

```example.ts
var obj = { foo: "bar", baz: 42 };
console.log(Object.values(obj)); // ['bar', 42]
```
これを見てわかるように簡単にいうとobjectの中身を配列にして返してくれるものだ．
ではどうやって使うか...?

# 使い方
前述したデータを使うとき

```WeekData.ts
type WeekData = {
  monday: {
    date: string;
    attendance: {
      feeling_id: string;
      is_input: boolean;
    };
    leaving: {
      feeling_id: string;
      is_input: boolean;
    };
  };
  tuesday: {
    date: string;
    attendance: {
      feeling_id: string;
      is_input: boolean;
    };
    leaving: {
      feeling_id: string;
      is_input: boolean;
    };
  };
  wednesday: {
    date: string;
    attendance: {
      feeling_id: string;
      is_input: boolean;
    };
    leaving: {
      feeling_id: string;
      is_input: boolean;
    };
  };
  thursday: {
    date: string;
    attendance: {
      feeling_id: string;
      is_input: boolean;
    };
    leaving: {
      feeling_id: string;
      is_input: boolean;
    };
  };
  friday: {
    date: string;
    attendance: {
      feeling_id: string;
      is_input: boolean;
    };
    leaving: {
      feeling_id: string;
      is_input: boolean;
    };
  };
};

export default WeekData;
```
上記のようなモデルを定義し，

```
Object.values(WeekData).map(day => ...)
```
とすると

mondayだったところが配列の0番目，tuesdayが１番目...というような配列として扱うことができるようになり，それをmapするとday.dateやday.attendance，day.leavingを使うことができる．

# おわりに
今回はObject.values()を使ってみました．これを使うことで冗長なコードがスッキリするのでぜひ使ってみてください．
Leetcode #529: Minesweeper

```swift
func updateBoard(_ board: [[Character]], _ click: [Int]) -> [[Character]] {
    var board = board
    if board[click[0]][click[1]] == "M" {
        board[click[0]][click[1]] = "X"
        return board
    }
    helper(&board, click[0], click[1])
    return board
}

private func helper(_ board: inout [[Character]], _ i: Int, _ j: Int) {
    if i < 0 || i >= board.count || j < 0 || j >= board[i].count || board[i][j] != "E" {
        return
    }
    var count = 0
    if i-1 >= 0 && j-1 >= 0 && board[i-1][j-1] == "M" {
        count += 1
    }
    if i-1 >= 0 && board[i-1][j] == "M" {
        count += 1
    }
    if i-1 >= 0 && j+1 < board[i].count && board[i-1][j+1] == "M" {
        count += 1
    }
    if j-1 >= 0 && board[i][j-1] == "M" {
        count += 1
    }
    if j+1 < board[i].count && board[i][j+1] == "M" {
        count += 1
    }
    if i+1 < board.count && j-1 >= 0 && board[i+1][j-1] == "M" {
        count += 1
    }
    if i+1 < board.count && board[i+1][j] == "M" {
        count += 1
    }
    if i+1 < board.count && j+1 < board[i].count && board[i+1][j+1] == "M" {
        count += 1
    }
    if count == 0 {
        board[i][j] = "B"
        helper(&board, i-1, j-1)
        helper(&board, i-1, j)
        helper(&board, i-1, j+1)
        helper(&board, i, j-1)
        helper(&board, i, j+1)
        helper(&board, i+1, j-1)
        helper(&board, i+1, j)
        helper(&board, i+1, j+1)
    } else {
        board[i][j] = Character("\(count)")
    }
}
```
Qiitaの書き方まとめ

#見出し

##▼書き方

・「#」で見出しとして表示させる。
・個数によって大きさも変わる。

`#見出し1`
`##見出し2`
`###見出し3`

▼例
#見出し1
##見出し2
###見出し3



##▼ソースコードの挿入

▼書き方
``````Java:HelloWorld.java
public class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello World!!");
    }
}```
```

▼例

```java:HelloWorld.java
public class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello World!!");
    }
}
```
【RDS for Oracle】18cが利用可能に


# RDS for Oracleで18cが利用可能
- RDSでOracle Database 18cが利用可能になりました。
- 東京リージョンでも使えます。
- 18cは従来でいう12.2.0.2に相当します。

# 18cからのリリースサイクル
|       |       説明 |
|:-----------------|------------------|
| 従来             |数年ごとのメジャーリリースサイクル<br>（例）11g R2 -> 12c R1 -> 12c R2|
| 18cから           |年次リリース<br>2018年にリリースされたので18c。<br>2019年にリリースされたら19c |

# 12.2からパッチも変更
- RU（Release Update）とRUR（Release Update Revisions）の2つに変わりました

|   パッチの種類    |       説明 |
|:-----------------|------------------|
|RU |四半期ごとの修正パッチ。<br>従来でいうPSU相当。|
|RUR|RUに対するセキュリティおよびリグレッションの修正が含まれる。<br>RURを適用することでRUを最新のセキュリティレベルに保つ。|
|個別パッチ|リクエストによりつくられる|

- RUもRURも従来の PSU/BP と同様 1月、4月、7月、10月にリリース
- RURは、対応するRUを適用している状態でのみ適用可能。
    - 既存のRUに対しRURを適用。
    - 既存のRUに対し最新のRUを適用。

# バージョンの読み方
<img width="1087" alt="スクリーンショット 2019-08-20 22.17.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/b185b878-989c-8b1a-4174-73f142fe0c19.png">

# RUとRUR
<img width="1083" alt="スクリーンショット 2019-08-20 22.18.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/511d978f-fed9-3d62-722b-672be3f4d433.png">


<img width="1103" alt="スクリーンショット 2019-08-20 22.19.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/b796f1bf-f643-e5df-7861-b3a97725dcbd.png">

<img width="1103" alt="スクリーンショット 2019-08-20 22.20.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/c3aeb005-9c2e-7c94-e6dd-7fe97947b1f9.png">

#参考
[Oracle Database 18c テクノロジーシリーズ 1 「DB Core と Oracle Multitenant の進化」~ DB Core ~](http://otndnld.oracle.co.jp/ondemand/technight/19-1_CoreInstUpgr_DL_final.pdf)

[ORACLE RELEASE MODEL, RELEASE UPDATES (RU), AND RELEASE UPDATE REVISIONS (RUR)](https://www.buckenhofer.com/2017/10/oracle-release-model-ru-rur/)

[Amazon RDS now supports Oracle Database 18c
](https://aws.amazon.com/jp/about-aws/whats-new/2019/08/amazon-rds-now-supports-oracle-database-18c/)
WebApollo 一発処理集

## 特定のorganismの全てのuser annotationを除去する

Apollo-2.4.1/docs/web_services/examples/groovy

などに移動して

groovy ./delete_annotations_from_organism.groovy \
-organismname "Organismname" \
-destinationurl http://localhost:8080/apollo-2.4.1 \
-adminusername admin@mail.hoge \
-adminpassword password


## gff3ファイルの中身を全てuser annotationに入れる

Apollo-2.4.1

に移動して

perl ./tools/data/add_features_from_gff3_to_annotations.pl \
-U localhost:8080/apollo-2.4.1 \
-u admin@mail.hoge \
-p password \
-i /match.gff3 \
-t match \
-e match_sub \
-o "Organismname"  -X
vSphere PowerCLI でのフルクローンプール作成など覚え書き

#手動プール登録について覚え書き

以下の例はプールID「PL01W10」
VDI仮想マシン名「VDI01～03」
VDI接続用ユーザー「vdiuser01」
を想定しています。

##プール追加
「Add-ManualPool」コマンドレットにて作成
「Get-Pool」コマンドレットで取得出来る情報は大体設定可能
同じようなフルクローンプールをいっぱい作るような場合に便利

```powershell
Add-ManualPool -Pool_id "PL01W10" -DisplayName "シンクライアント" -Description "" -Persistence "Persistent" -FolderId "/" -AutoLogoffTime "Never" -DefaultProtocol "PCOIP" -AllowProtocolOverride $false -FlashQuality "LOW" -FlashThrottling "AGGRESSIVE"
```


なお作成の際にのみプールにデスクトップを追加出来るようです

```powershell
Get-VM "VDI01" | Add-ManualPool -Pool_id "PL01W10"
```

複数台追加する場合はこんな感じにやったら出来たはず(メモなので実機検証出来たら更新したい)

```powershell
$MyDesktop = @()
$VMs = ("VDI01","VDI02","VDI03")
foreach ($VM in $VMs){$MyDesktop  += Get-DesktopVM -Name $VM}

$MyDesktop | Add-ManualPool -Pool_id "PL01W10"
```

ちなみに「Update-ManualPool」で作成後に追加は出来ない様子
素直Horizon Administratorから追加しよう

```コレはダメ.ps1
(Get-DesktopVM -Name "VDI01").id | Update-ManualPool -pool_id "PL01W10"
```

##プールへの資格追加
プールへの接続資格割当てもコマンドで実行可能

```powershell
$sid = (get-user -Name "vdiuser01").sid
Add-PoolEntitlement -Pool_id "PL01W10" -sid $sid
```

##専用デスクトッププールのデスクトップへのユーザー割当て
```powershell
Update-UserOwnership -machine_id (Get-DesktopVM -Name "VDI01").machine_id -sid (Get-User -name "vdiuser01").sid
```

色々組み合わせると自動化とかバックアップからの復元とか出来ると思う
Unity勉強メモ2 ～Collider続き～

## はじめに
この記事は5日前にUnityを触り始めた人の勉強メモです。過度な期待はしないでください。
誤った内容が含まれる可能性が多々あります。誤りに気付いた方は、コメントにて脇腹をつついてください。

### kanatatara、MeshColliderやめるってよ
前回の記事で「ええやん、MeshCollider」と話していたkanatataraさん。
冒頭でMeshCollider使うのやめる宣言。乱心！乱心じゃー！
・・・というのも、Unityのマニュアルで、以下の記述を見つけちゃったのです。

![2_1_コライダー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483109/b64374e3-b8d8-3b3e-7b7b-6ebf58c81e26.png)

「MeshColliderは処理重くなるから極力使わんほうがええよー！」
「複合プリミティブコライダー推奨やよー！」ってことらしい。

### なるほど。で、意味は？
「複合プリミティブコライダー　意味」でGoogle先生に聞いてみるものの、
「複合プリミティブコライダー」という単語自体がUnityのマニュアルでしか出てきていない・・・。
「ふくごーぷりみてぃぶこらいだー？？？？？」とあほ面してたのですが、どうやら以下の意味みたいです。

■プリミティブコライダー
以下のような、単純でプロセッサ負荷の小さいコライダーのこと
　Box Collider、Sphere Collider、Capsule Collider

■複合プリミティブコライダー
プリミティブコライダーを複数組み合わせて作るコライダーのこと

### MeshColliderを使おうとして、やめた理由
VRで物を掴みたい　→　正確な衝突判定が必要　→　ならMeshCollider必要やん？
という思考プロセスの元、MeshColliderに行き着いたのですが、
別に全身の衝突判定を綺麗に行う必要性がなかったので、必要性を感じなくなったのです。
更にVRの場合、アセットが用意されており、そちらを使うのが得策なんだなと気づきました。
（私の場合、Oculus Rift Sを使用しているので、「OVR Grabber」「OVR Grabbable」が該当します。）

### 微速前進！ヨーソロー！
・・・とまあ、「とりあえず触ってみては失敗して」を繰り返す感じですが、
少しずつでも前進できているのは良いことなのかなと思っています。
とりあえずUnityでMMDモデルを使って、バ美肉して、手をグッパーするところまでは進みました。
次はUnity内に何かしらの空間を作って、バ美肉度を高めていきながら勉強したいな、と思います。

Unityは成果が目に見えて現れるので、インフラおじさんとしては、とても楽しいです・・・！
DockerでCPUの使用量制限をする(--cpus)

#概要
Dockerには使えるCPUのコア（スレッド）数を制限する機能があります。

```bash:0.1コア分だけ使用する
docker update --cpus 0.1 container 
docker create -it --cpus 4.5 --storage-opt size=120G fedora /bin/bash
```

最小単位が0.01から、最大で搭載しているコアの数まで上げられます。
これと言って特定のコアにやらせるわけではないので、OSが勝手に実際に使うコアを指定します。

docker updateの場合には即座に制限が有効になるようです。
#仕組み
例えば、

```bash
docker update --cpus 0.1 container 
```
とした場合、

```bash
docker inspect container 
・・・
"HostConfig": {
 "NanoCpus": 100000000,
・・・
```
とされます。

NanoCPU　つまり 

```
100000000 NanoCPU = 0.1 CPUコア
```
という等式が成り立ちます。

NanoCPUというのは

>  CPU quota in units of 10<sup>-9</sup> CPUs.

1CPUを10<sup>9</sup>区切りにした値のようです。
ところが、なぜこのような奇妙な分け方をするのは明らかではありません。
小数点を入れないようにするためでしょうか。

#関連記事
- [Dockerコンテナで利用できるリソースや権限を制限する（Dockerの最新機能を使ってみよう：第3回）
](https://knowledge.sakura.ad.jp/5118/
)
- https://qiita.com/hoto17296/items/43d8c2d695c8724b99aa

#参考文献
- https://docs.docker.com/engine/reference/commandline/create/
- https://docs.docker.com/engine/reference/commandline/update/
- https://github.com/moby/moby/issues/24713
- https://github.com/moby/moby/pull/27958
妄想プロダクト室「線香花火（室内用）」のプロトタイプ




# つくったモチベーション
夏が来た！！
海！！花火！！浴衣！！！！
ん？　あれ、、、
どれもまだ、楽しんでない、、、😂
このままでは夏が終わってしまう！
そうだ、夏が終わる前に、どこでも楽しめる線香花火をつくろう！



# 「線香花火（室内用）」概要
IoTデバイスの揺れに応じて、スマホに表示されている線香花火の状態が変化する。
デバイスを揺らしすぎると、線香花火の火が消えてしまう。
加速度センサーより取得した値により、読み込まれる画像が変わる仕組み。

![名称未設定-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420554/ee74972c-641c-c59e-7de3-da0128ee7799.jpeg)

↓デモ動画を後日上げます。。。


## 技術・素材
- LINE Things LIFF
- javascript
- html/css
- obnize
- 加速度センサー

## 構成図
![IMAGES.001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420554/3a0a6b6c-5a90-2309-97f9-f1ffd5143724.jpeg)

## 今後の課題
GIFで表現している線香花火をアニメーションで動的に処理したい
Leetcode #1011: Capacity To Ship Packages Within D Days

```swift
func shipWithinDays(_ weights: [Int], _ D: Int) -> Int {
    var start = weights.max()!
    var end = weights.reduce(0,+)
    while start < end {
        let mid = start + (end - start) / 2
        let days = shipDays(weights, mid)
        if days == D {
            end = mid
        } else if days < D {
            end = mid
        } else {
            start = mid + 1
        }
    }
    return start
}

private func shipDays(_ weights: [Int], _ limit: Int) -> Int {
    var i = 0
    var sum = 0
    var days = 1
    while i < weights.count {
        if sum + weights[i] > limit {
            sum = weights[i]
            days += 1
        } else {
            sum += weights[i]
        }
        i += 1
    }
    return days
}
```
なぜBigDecimalでは高い精度で10進数を扱えるのか

- 「Floatだと丸め誤差が発生するから10進数を扱う精度が低い」
- 「BigDecimalだと丸め誤差が発生しないから10進数を扱う精度が高い」

という話に触れたのだが、その理由がぱっと理解できなかったので、ちょっと整理して考えてみた。((Rubyに限ったトピックではないが、ここではRubyをベースにした言葉をつかう。))

<!-- more -->

### (前提)10進数の整数は2進数で正確に表現できる

10進数の1も10000000も-12345も、2進数で正確に表現できる。((データの固定長による制約とかはここでは無視する。))

### 10進数の小数はFloatでは正確に表現できない

10進数の0.1(0d0.1と表記する)を数直線上で表すと以下。

```
0  0d0.1                                  1
|----|------------------------------------|
```

一方、Floatがつかう目盛りは以下(2進数の0.1を0b0.1と表記する)。

```
0         0b0.01                            1
|-----|-----|----------|--------------------|
   0b0.001           0b0.1
```

2進数の世界からみると0d0.1というのはめちゃくちゃ曖昧な値なので、なんとかして2進数の組み合わせで表現しようとする(無限小数)。

しかしバイト数には制約があるので一定以下の桁の情報は捨てられる。

よって2進数では0d0.1を不正確にしか表現できない。

### 10進数の小数はBigDecimalでは正確に表現できる

BigDecimalでは、10進数の小数を直接2進数の小数で表現しようとはせず、以下の流れを経る。

```
0d0.1を表現したい
↓
それってつまり1*(10**-1)
↓
基数部の1と指数部の-1という情報によって0d0.1を表現する
```

一般化すると以下。

```
10進数の小数を表現したい
↓
それってつまりa*(10**b)  (10進数の小数は必ず整数a,bによりこの形で表現できる)
↓
基数部のa(整数)と指数部のb(整数)という情報によって10進数の小数を表現する
```

`a*(10**b)`に言い換える時点で、何も情報は失われていない。

そして基数部と指数部の整数は、コンピュータ上で2進数で処理されたとしても、何も情報は失われない。

(なぜなら上述したとおり「10進数の整数は2進数でも正確に表現できる」から。)

よってBigDecimalでは10進数の小数を正確に表現することができる。