OmniAICreator/Qiita-1.07M huggingface dataset:
リストのリストを作成するときの注意点

# 結論
リストのリストを作成するときは
[[]] * n
ではなく
[[] for _ in range(n)]
を使おう。

# 詳細

```python
list_of_list = [[]] * 3
print(list_of_list)
```

とすると

```python
 [[], [], []]
```

が表示されます。
リストのリストの初期化方法としてお手軽で良さそうですが、ダメです。
例えば

```python
list_of_list[1].append(100)
print(list_of_list)
```

とすると想定は

```python
 [[], [100], []]
```

ですが、実際は

```python
 [[100], [100], [100]]
```

となってしまいます。
[[]] * n でリストを作ると内部のリストは中身を共有するみたいです。
Python詳しい人にとっては当たり前かもしれませんが、
遭遇した時は驚きました。

改善するには

```python
list_of_list = [[] for _ in range(n)]
```

とします。
これで想定通りの動きをしてくれます。

以上です。
amazon SageMaker sample をひとつひとつ検証してみる [1]

#BlazingText
　Word2vec とテキスト分類アルゴリズムの高度に最適化された実装を提供してくれて、そのWord2vec アルゴリズムは、単語を高品質の分散ベクトルにマッピングしてくれるものだそうです(よくわかっていません)。

　要するに、似たような単語は似た値のベクトルを持っているので、それを分類しましょうていう感じ。これが出来ると、単語の分類とか文章の意味解析なんかが出来るようになる、と。

 詳細はこちら[BlazingText アルゴリズム](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/blazingtext.html)
 
##1.blazingtext_hosting_pretrained_fasttext.ipynb

 BlazingTextが事前トレーニング済みのテキスト分類とWord2VecモデルのFastTextモデルのホスティングをサポートする方法を示します。


　説明は英語で書いてあるので、随時Google翻訳で何をやっているのか確認。
基本はサンプルコードをそのまま実行していきます。


**Introduction**

パラメータの指定
<img width="979" alt="スクリーンショット 2019-10-07 14.19.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254218/f6bffdaa-4a12-0901-d1e0-0988adc02d9b.png">

<img width="840" alt="スクリーンショット 2019-10-07 14.42.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254218/f0e96870-3a93-6c0d-91f1-ec7bc9e85cbf.png">

**Hosting the Language Idenfication model by FastText**
言語識別のために、FastTextで利用可能な事前トレーニングモデルを活用する

FastText Webサイトから言語識別（テキスト分類）モデル[1]をダウンロードします。
<img width="843" alt="スクリーンショット 2019-10-07 14.49.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254218/268863f8-9637-58a2-d0b2-31d957f5414c.png">

次に、モデルをtarで圧縮し、Python SDKから利用可能なユーティリティを使用してS3にアップロードします。 データのローカルコピーは不要になったため、削除します。

<img width="847" alt="スクリーンショット 2019-10-07 14.50.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254218/fa8e4075-3ffb-7672-763e-3ada8c1e1c12.png">
model.binができました。

**Creating SageMaker Inference Endpoint**
 推論用[エンドポイント](https://kotobank.jp/word/%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88-1863)の作成を行います。


次に、さまざまな言語のエンドポイントにいくつかの文を渡して、言語の識別が期待どおりに機能することを確認します。
<img width="1055" alt="スクリーンショット 2019-10-07 15.08.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254218/250d0989-9f71-3578-c5e1-ba436a3f005d.png">

・・・・・・恐らく上手く行っているんだと思われます。
推論-エンドポイント設定やエンドポイントのページで、エンドポイントが無事作成されていることを確認しました。

**Stop / Close the Endpoint (Optional)**
リアルタイム予測を提供するためにエンドポイントを実行し続ける必要がない場合、ノートブックを閉じる前にエンドポイントを削除します。
<img width="1058" alt="スクリーンショット 2019-10-07 16.03.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254218/6e27d459-54be-3990-93d7-e703d25e2cb8.png">

同ページから、作成されていたものが消えていれば完了。
最も簡単に学習効率を上げる訓練は、なんだかんだタイピング練習

## 概要
新たにプログラミングを勉強し始める人の中には、当然それまで日常的にPCには触れてこなかったもしくはタイピングが遅いという人も大勢いますよね。
<br>

とにかく手を動かすことから学習が始まるプログラミングでは、タイピング速度を上げるだけでも何かを作ってみたり試してみたりと試行できる回数が増えます。
<br>

なので学習効率は格段に上がりますし、「**頑張っている感**」「**疲労感**」みたいなストレスも減るのでプログラミング学習と並行してタイピング練習もしたいところです。
<br>

そこでタイピングが遅くて学習効率が上がらないという悩みを持つ人に対して、タイピング力UPのアドバイスを書いてみました。
<br>

## 1.我流ポジションをやめる
タッチタイピング(ブラインドタッチ)の速度に伸び悩む人にありがちなのが「**我流のポジションでタイプしている**」ことです。
<br>

主に利き手の人差し指や中指といった、打ちやすい指だけで全てのキーをタイプしようとするので、手がタイプ中にあちらこちらに動いてしまいます。
<br>

これでは疲れますし指で位置を覚えることができていません。
なので打ち間違いが増えて結果的にタイプが遅くなるのです。
<br>

まずは**ホームポジションをしっかり守りましょう**。
両人差し指をFとJに置き、全てのキーをもっとも近い指だけでタイプし、一つタイプしたらホームポジションに戻す癖をつけましょう。
<br>

上達の早い人は、この時点で普段使っていないであろう、利き手でない方の薬指と小指が疲れるはずです。
この二指の操作に慣れることが肝心と言えます。
<br>

## 2.ホームポジションを維持しやすいようショートカットを活用しよう
また、右手の小指で`backspace(delete)キー`を押すことが、大変煩わしくなってくると思います。
<br>

そこでMacユーザーの方は`Emacsキーバインド`を使いましょう。
<br>

「**`control + H`**」の組み合わせで文字を削除できるので、ホームポジションを崩さないまま**`delele`**ができます。
<br>

Windowsの方は、使用していないであろう「**`無変換キー`**」に`backspace`を割り当ててみるといいでしょう。
<br>

https://uguisu.skr.jp/Windows/emacs.html
<br>

## 3.速さより正確さを意識しよう
速さを求めて自分の認識より早くタイプをすると、返ってミスタイプが増えて平均速度は遅くなってしまいます。
なので1キー1キー意識した方が結果的にやや早くなります。
<br>

具体例をあげましょう。
<br>

Aさんは速く打とうとすると0.3秒で1キーを打つことができ、ゆっくり打とうとすると0.6秒かかるものとします。
速く打つときは頻繁に間違いが起こり、ゆっくり打つときは間違いが滅多に起こらないものと仮定します。
<br>

速く打とうとして打ち間違いをすると「**打ち間違い→backspace→打ち直し**」と、**3回も打つ必要がある**のです。
かかる時間は0.9秒です。
ゆっくり1キーを打って間違いがなければ、0.6秒のみで済みます。
<br>

よって、平均的な速度はゆっくり正確に打った方が結果的に速くなるのです。
<br>

## 4.正確さのための練習
有名なタイピングゲーム「**寿司打**」には、「**正確重視**」モードがあります。
<img width="1440" alt="スクリーンショット 2019-10-07 15.18.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506573/3c12ab8e-7224-6585-d9ba-ef262e4ef2bd.png">
> 引用：寿司打 WebGL版
http://typingx0.net/sushida/play.html?soundless

<br>

これは一度でもミスタイプをするとスコアがリセットされるシビアなモードですが、正確さを鍛えるには最適です。
このモードを忍耐強く遊んでミスタイプを減らすよう意識してみるといいでしょう。
<br>

## まとめ
- **ホームポジション**を守ってタイピングできるようにしよう(指ごとのキーのタイプ範囲を覚える)
- **Emacsキーバインド**を使おう
- タイピングは早く打つことよりも**間違えないように打つ**方が速度UPにつながる
- プログラミングの学習と並行して**毎日練習**しよう

<br>

+αで、HTMLやCSSを学習しているよという人はぜひ**`Emmet`**を覚えながら学習しましょう。
`Emmet`は入力補完のプラグインです。
タイピングが苦手でも記法を覚えれば、**比較対象が現役エンジニア**でも`Emmet`を使わない人なら**大抵の人より早くコーディング**できます。
<br>

テキストエディタ「**Visual Studio Code**」では標準搭載なのでおすすめです。
<br>

Atomなど他のエディタでも外部プラグインとして導入は可能です。
<br>

タイピング練習でもEmmetを覚えることでも、とにかく練習するということが一番重要です。
練習メニューとして参考にしていただければ幸いです。
<br>

## 参考
- 寿司打(http://typingx0.net/sushida/)
- Visual Studio Code(https://code.visualstudio.com/)


この記事は**CodeShip**内での実際の質疑応答や指導・アドバイスの一部を基に作成しています。
gitコマンドメモ

# git
[いつやるの？Git入門](https://www.slideshare.net/matsukaz/git-17499005)

### gitのメリット
- コミット対象を自由に選べる
- コミット内容を後から修正できる。
- ほとんどの作業をローカルで完結できる
- ブランチやタグ操作が高速
- 効率的にリポジトリ内のデータを保持

### 最低限のコマンド
```git:ローカルからリモートへ
git add <filepattern>
git commit -m <msg>
git push <remote> <refspec>
```

```git:branch作成
git branch [<old>] <new>
git checkout <branch>
git checkout -b <new> <old>
```

```git:リモートからローカルへ
git clone <url>
git fetch
git pull <remote> <refspec>
```

### ローカル環境で使う基本的なGitコマンド
>commitするまで編集は記録されず、pushしなければリモートリポジトリに反映されない

#### `git init`
 *gitの管理を開始する*

#### `git add <filepattern>`
 *リポジトリに追加したい対象を指定する*

#### `git commit -m <msg>`
 *更新内容にコメントをつけてリポジトリに登録する*
 >リモートリポジトリにpushする内容を決定し、コミットIDが発行される。コミット毎に内容が記録されていく。

#### `git rm <file>`
 *ファイルを削除する*

#### `git rm -r <directory>`
 *ディレクトリを削除する*

#### `git reset HEAD <file>`
 *ステージングエリアをGitリポジトリ(コミットした)の状態に戻す*
 [HEADについて](https://qiita.com/chihiro/items/d551c14cb9764454e0b9)
 HEADの指定方法
- チルダ<sap>~</sap> 人世代前のコミットを指定
- キャレット<sap>^</sap> 複数の親がいる時の親コミットを指定できる

#### `git checkout --<file>`
*ワークツリーをステージングエリアの状態(addした状態)に戻す*

#### `git reset --<mode> <commit>`
*データ領域を指定commitの状態に戻す*
[git resetオプション](http://d.hatena.ne.jp/murank/20110327/1301224770)

#### `git status`
*ツリーの状態を確認する*

#### `git log`
*コミットログを見る*

#### `git diff`
*ワーキングツリーとインデックスの差分を表示する*

>`git diff --cached`
 *HEADとインデックスの差分を表示する*

## リモート環境と関連して使う基本コマンド
#### `git branch [<old>] <new>`
*branchを作成する*
>注意:HEAD(作業中のブランチ)は変わらない

#### `git checkout <branch>`
*HEAD(作業ブランチ)を変更する*
>git checkout -b <new> old
>>branchを作成し、作成したブランチを作業ブランチに切り替える

#### `get merge <branch>`
*現在のブランチに指定ブランチをマージする*

#### `git rebase <branch>`
*現在のブランチを指定ブランチからリベースする*

#### `git clone <url>`
*リモートリポジトリをローカルに複製*

#### `git push <remote> <refspec> `
*リモートリポジトリに変更を送信*

#### `git fetch <remote> <refspec>`
*ローカルブランチをリモートブランチの最新の状態に更新*

#### `git pull <remote> <refspec>`
*ローカルブランチをリモートブランチの最新の状態に更新してマージする*

#### `git pull <remote> <refspec> --rebase`
*ローカルブランチをリモートブランチの最新の状態に更新してリベースする*

## 心がける使い方
- *基本ローカルで作業*
- *push,pullは必要以上に行わない*
- *データ領域を意識して作業する*

#参考-リスペクト
- [いつやるの？Git入門](https://www.slideshare.net/matsukaz/git-17499005)
- [HEADについて](https://qiita.com/chihiro/items/d551c14cb9764454e0b9)
- [git resetオプション](http://d.hatena.ne.jp/murank/20110327/1301224770)
[ Android Studio ] ボタン押下による画像の切替

　前回に引き続き、ボタンでクリックイベントを取得し、画像の表示、非表示を行ってみた。

##ボタン作成
 前回同様xmlファイルからボタンを配置。
　以下の2種のボタンを作成。
　・DISPLAY（id：display）：表示用ボタン
　・HIDE（id：hide）：非表示用ボタン

##画像表示用レイアウト

###画像ファイル管理
　表示したい画像ファイルは「res」→「drawable」パッケージ内で管理する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/f07dcad1-9a94-1170-6ae3-d580e6614250.png)


###画像表示
  xmlファイル、「デザイン」のパレット上「common」→「ImageView」をレイアウト上にドラッグし、表示したいdrawable上のファイル名で検索して完了。今回ファイル名は「bluepaint.png」、idは「imageBluePaint」
　Constrainの指定も忘れずに。

　ちなみにテキスト表示の場合はこんな感じ。

~~~
    <ImageView
        android:id="@+id/imageBluePaint"
        android:layout_width="375dp"
        android:layout_height="491dp"
        android:layout_marginStart="80dp"
        android:layout_marginTop="88dp"
        android:src="@drawable/bluepaint"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
~~~



##画像を取得し表示するプログラム
　setImageResourceでリソースIdを取得する。

~~~
            ImageView imageView = findViewById(R.id.imageBluePaint);
            imageView.setImageResource(R.drawable.bluepaint);
~~~

##サンプルプログラム
　以下のソースコードで実行。
 （applicationtestパッケージで管理しているので、一番上のパッケージ文はひとそれぞれ。）

~~~
package com.example.applicationtest;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;


public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageDisplayInitialize();
    }

    /*
     表示非表示ボタンの実装
     */
    public void imageDisplayInitialize() {
        //クリックイベントを取得するボタン
        Button displayButton = (Button) findViewById(R.id.display);
        Button hideButton = (Button) findViewById(R.id.hide);

        //画像表示
        ImageView imageView = findViewById(R.id.imageBluePaint);
        imageView.setImageResource(R.drawable.bluepaint);

        //ボタンにOnClickListenerインターフェースを実装
        //表示用ボタンの機能実装
        displayButton.setOnClickListener((View v) -> {
            imageView.setVisibility(View.VISIBLE);
        });

        //非表示用ボタンの機能実装
        hideButton.setOnClickListener((View v2) -> {
            imageView.setVisibility(View.INVISIBLE);
        });
    }
}

~~~

 結果…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/aaee2c9b-2886-a5a2-8706-fee4378b89cf.png)

　成功。
「AWS IAMのマニアックな話」は「IAM初心者」にこそちょうどいい

# はじめに
先日開催された[技術書展7](https://techbookfest.org/event/tbf07)で発売された[「AWS IAMのマニアックな話」(IAM本)](https://booth.pm/ja/items/1563844)を購入して読み進めています。
本の中身に関しては読了してから勉強記事としてまとめようと思いますが、その前にIAM本をオススメしたくこの記事を書いています。

# おすすめポイント
今回オススメするポイントは下記の2つです。

1. **IAM関連の用語や考え方が「平易な言葉で簡潔に」説明されている**ので、基礎レベルの理解がスムーズに進む
2. IAM周りのデザインパターンやIAM設計・運用のベストプラクティスも記載されているので、**「基礎レベルの知識を踏まえて」実践的な内容を学習できる**

上記の点から、「AWS IAMのマニアックな話」は**IAM初心者こそ読んだ方がいい**一冊だと感じました。

# 本の詳細
## 著者
佐々木拓郎さん
([Amazon Web Services パターン別構築・運用ガイド](https://www.amazon.co.jp/gp/product/B00UWCYRZK/ref=dbs_a_def_rwt_hsch_vapi_taft_p1_i8)の筆者でもあります。)

## 購入サイト
ダウンロード版をBoothで購入することができます。
->[【ダウンロード版】AWSの薄い本　IAMのマニアックな話](https://booth.pm/ja/items/1563844)

## 目次
```
はじめに
第1章：AWSとIAM 　
第2章：IAMの機能 　
第3章：IAMチュートリアル
第4章：IAMポリシーのデザインパターン
第5章：IAMグループのデザインパターン 
第6章：IAMとセキュリティ 
第7章：IAMの運用 　
第8章：IAMとCloudFormation 
第9章：IAMのテンプレート集 　
第10章：IAM以外のAWS サービスの活用 　
付録A：アカウント開設時の設定チェックリスト
```

第1〜3章では、ユーザー、ロール、ポリシーなどの基本用語を説明した上でIAMのチュートリアル(ポリシーの作成、グループとポリシーの紐付け etc.)を行います。

第4〜6章では、IAMポリシー、IAMグループのデザインパターンなど**IAMを実際に設計する際に利用可能なパターンやTips集**がまとめられており、より実務的な内容になっています。

第7〜8章では、運用設計の概要やCloudFormationの活用といった**IAMの運用管理の観点でのベストプラクティス**がまとめられています。

# 本の内容について
当記事の筆者はIAM初心者で、具体的には下記のようなレベル感です。

- ユーザー、ロール、グループなどのIAM関連の用語の意味は理解している
- IAM周りの設計は未経験 (設計の勘所なども明確に理解していない)

上記のような人間が、IAM本をある程度読んだ上で本の内容と感想を簡単に紹介します。

## 基礎レベルの内容
第3章のIAMのチュートリアルでは、ポリシー作成からユーザーにIPアドレス制限付きの権限を付与するまでが順序立てて説明されています。
そのため、**IAMポリシーやグループ、ロール自体の理解**や**それらの関係性**をきちんと理解するには、特に第3章の内容が役に立ちます。
各用語の説明も簡潔に記載されており、最初の理解の段階でつまづきにくいように書かれていると感じました。

また、第3章までの内容にも少し応用的・実践的な内容も含まれているので、基礎を理解している人は応用部分を掻い摘んで読むくらいでも十分だと思います。

- 管理ポリシーとインラインポリシーの違い
- クロスアカウントロールについて
- AWS管理ポリシー・カスタマー管理ポリシーの使い分け 

## 実践的な内容
第4〜8章までは実践的な内容が続きますが、個人的にこの部分が最も勉強になりました。
IAMの基礎部分を理解した上で、設計時には考慮すべき部分がいくつか出てきます。

- ブラックリスト形式・ホワイトリスト形式のどちらでポリシーを書くべきか？
- 各ポリシーはどのくらいの粒度でまとめるのが望ましいか？
- IAMポリシーではなくサービス自体のセキュリティ機能にどこまで任せるか？ etc...

このような設計時の考慮点は、「状況に応じて正解が変わる」ことがほとんどです。
そのため、**パターンとユースケースを紐付けて理解すること**が求められます。

ポリシーの書き方のパターン (ブラックリスト形式) を例に挙げると、IAM本の中では下記のようにまとめられています。

- ブラックリスト・パターンの説明
- ブラックリスト・パターンの**メリット**
- ブラックリスト・パターンの**デメリット**
- ブラックリスト・パターンの**ユースケース**

パターンの説明に加えて、Pros & Consと利用されるユースケースが記載されています。
パターン自体の理解に加えて、**パターンの選択基準**も理解できるような構成になっています。

# 終わりに
勉強の足がかりとなる一冊としてはぴったりだと思います。
これからも、IAM周りを勉強していきたいと思います。(まずはIAM本の読書メモをQiitaにあげるところから...)
NSScrollView内のNSTextViewにPaddingを与える

# 概要

- 文字が重なるのがちょっと窮屈のため、スクロールバー用に余白を取りたい

![-w361](https://i.imgur.com/mVLeEll.jpg)

- 以下がゴール

![-w358](https://i.imgur.com/wb4lSTO.jpg)


# 参考

- [objective\-c – NSTextViewにパディング/マージンを与える](https://codeday.me/jp/qa/20190228/295705.html)
- [\[Objective\-C\] テキスト量に応じてTextViewを可変対応させる](https://qiita.com/edo_m18/items/a345a8d1d551e88d4013)

# コード

- `NSTextView`のカスタムクラスを作成する。
- イメージとしては…
    - 周りに余白をとる（上下・左右がそれぞれ対象）
    - 原点を移動させる（これで非対称）
- `10`*2で20のマージンを与える

``` ObjectiveC
#import "MyTextView.h"

@implementation MyTextView

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];
    
    // Drawing code here.
}

- (void)awakeFromNib {
    [super setTextContainerInset:NSMakeSize(10, 0)];
}

- (NSPoint)textContainerOrigin {
    NSPoint origin = [super textContainerOrigin];
    NSPoint newOrigin = NSMakePoint(origin.x - 10, origin.y);
    return newOrigin;
}
```

# 右側のみ間隔を開けるのに使える手法

- 邪道かも

![-w382](https://i.imgur.com/Lj0btlk.jpg)

```objc
// スクロールバー分のマージンを確保する
NSSize textViewSize = _textView.superview.frame.size;
textViewSize.width -= 15;
[_textView setFrameSize:textViewSize];
```
今日学んだ基本情報の勉強内容(3)

##RAID
RAIDは複数のハードディスクを組み合わせることによってハードディスクの高速化や信頼度を向上させることが目的である手法。
ここでは代表的な種類だけを紹介する。

###RAID0(<font color="Red">ストライピング</font>)
RAID0は以下のように1つのデータを2台以上のディスクに分散させる方法。

<b>利点</b> : 分散させて書き込むので高速化することができる。
<b>欠点</b> : いずれか1台が故障すると全ファイルが失われることになり信頼性が低い
![1570427347349.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/6b8734d9-5825-442c-9738-80fdeec8a62a.jpeg)


###RAID1(<font color="Red">ミラーリング</font>)
RAID1は2台以上のディスクに同じ内容を書き込むので常にバックアップを取った状態になっている。

<b>利点</b> : いずれか1台が故障してもそのまま使えるので信頼性が高い
<b>欠点</b> : 同じことを書き込んでいるので使用できるディスク領域は半分以下になる
![1570426790362.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/1556e9d4-a59e-12ed-a7bf-10db47be39ec.jpeg)

###RAID5
RAID5では3台以上のディスクを用いてデータだけでなくパリティと呼ばれる誤り訂正符号も分散させる。
以下のようにパリティを他のディスクに保存することによって、いずれか1台が故障しても他のディスクにあるパリティを基に復元することができる。

![1570427206096.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482973/77827b79-9006-2d52-ad57-dee5f4a8c626.jpeg)


##補助記憶装置
ここは図よりも言葉が多めになってしまう
###光ディスク
光ディスクはレーザー光線によってデータの読み書きを行う

<b>CD</b> : 記憶容量は650MBか700MBの2種類であり、CDには読み込み専用の<font color="Red">CD-ROM</font>、一度だけ書き込める<font color="Red">CD-R</font>、何度でも書き換えられる<font color="Red">CD-RW</font>がある。

<b>DVD</b> : 記憶容量は片面1層の時4.7GBで片面2層のときは8.5GBであり、両面になるとそれぞれ容量も倍になる。DVDにもCDのように読み込み専用の<font color="Red">DVD-ROM</font>と一度だけ書き込める<font color="Red">DVD-R</font>、何度でも書き換え可能な<font color="Red">DVD-RW</font>、<font color="Red">DVD-RAM</font>がある。

###光磁気ディスク
光磁気ディスクはその名前の通りレーザと磁気によってデータを記録し、レーザを用いて読み取ることができる装置。

###磁気テープ
磁気テープ装置はテープ状のフィルムを磁気を用いることによってデータを読み書きを行う装置。
この中でもブロックごとに連続してデータの読み書きを行うものを<font color="Red">ストリーマ</font>と呼ぶ。

###フラッシュメモリ
メモリカードやUSBなどがあたり、電気的にデータを書き換える。


##参考文献
- [キタミ式イラストIT塾　基本情報技術者　平成28年度]
関数doubleについて-java

```java:sample
		double d = 5/10;
		System.out.println(d);
```
dの結果は0.0になります。
0.5ではありません。
リテラルがどちらもint型だからです。

```java:sample
		int d = 5/10;
		System.out.println(d);
```
の結果が0なのでdouble型にキャストされ0.0になります。

int型同士の計算では計算結果がintになるので
どちらかをdoubleリテラルにします。

```java:sample
		double d = 5.0/10;
		System.out.println(d);
		または
		double d = 5/10.0;
		System.out.println(d);

```

結果は
0.5になります。
【MySQL】SQLダンプファイルをコマンドで実行。(Database作成込でdumpをインポートする。)

メモとして残します。



#■やり方
ログイン済であることが前提条件です。

```shell
source ダンプファイルパス
```
特定のデータベースで実行する場合は、USEでカレントデータベース選択後に上記のコマンドを実行する。
[Swift] クラスとインスタンスについて

# はじめに
私は未経験からiOSをメインにエンジニアをしていました。
2年を過ぎて、基礎をまるで理解できていなかったことに気がつき改めて勉強しました。
この記事は自分用のメモとして書いていますが、どなたかの助けができたら幸いです。

## 概要
今回は**クラスとインスタンス**について書きます。

## クラスって何？
**クラス = テンプレート**
クラスとは、必ず使うであろう基礎機能をまとめてテンプレートにすることです。
Appleが作ったUIButtonクラスやUIViewControllerなどもクラスになります。
これらのクラスは、プログラマーがボタンなどのUIパーツを毎回1から作らなくてもいいように、ある程度の基礎機能をまとめてくれています。
また、クラスは自分たちで独自のクラスを作ることもできます。
独自で作ったクラスもまた、テンプレートとして自分のアプリ内で使用することが可能になります。


## インスタンスって何？
**インスタンス = 実体**
インスタンスとは、クラスを元に生成される実体のことです。
UI部品のボタンで例えると、クラスはボタンがどういった見た目でどういった機能を持つかが書かれたもので、インスタンスはユーザが実際に触るボタンのことです。
つまり、**クラスは必ずインスタンス化をしないと意味がない**ものです。


## クラスとインスタンスの関係って？？
**クラスを使いたかったらインスタンス化しろ**
ってことです。

「え？じゃあXcodeに最初からあるViewControllerとかってインスタンス化してなくない？？」

いい質問です。(私も同じことを思いました)
ViewControllerのインスタンス化、つまり画面の生成は、**Swiftで書かれたクラス(ソースコード)を元にiOSが生成しています。**
しかし、これは画面生成だけではありません。
私たちが書いた全てのクラスは、iOSによって全てインスタンス化(実体化)されています。

つまり、
`プログラマ → クラス(ソースコード) → iOS → インスタンス(アプリ) → ユーザ`
という仕組みです。

プログラミングから少し離れてレストランで考えてみましょう。
`オーナー → レシピ → 従業員 → 料理完成 → お客さん`
という感じです。イメージ湧きましたでしょうか。



## 最後に
いかがでしたでしょうか？
クラスとインスタンスの関係を知った上で、ぜひ自分が作ったアプリのソースコードを見ながら考えてみてください。
より理解が深まると思います。

最後まで読んでいただきありがとうございました。
AngularでFirebase（Firestore）からドキュメントの数を取得

#Firestore内のドキュメントの総数を取得



もしログインしているユーザーが作成したイベントの数を知りたければ

```typescript
import { Component, OnInit } from '@angular/core';
import { User } from '../auth/auth.service';
import { AngularFireAuth } from '@angular/fire/auth';
import { AngularFirestore } from '@angular/fire/firestore';

@Component({
  selector: 'app-my-page',
  templateUrl: './my-page.page.html',
  styleUrls: ['./my-page.page.scss'],
})
export class MyPagePage implements OnInit {
  private currentUser: User;
  private myCount: number;

  constructor(
    private afAuth: AngularFireAuth,
    private db: AngularFirestore
  ) { }

  ngOnInit() {
    this.afAuth.auth.onAuthStateChanged((user) => {
      if (user != null) {
        this.currentUser = user;
        this.db.collection(`users/${user.uid}/events`)
          .snapshotChanges().subscribe(c => {
            this.myCount = c.length;

         // 今ログインしてるユーザーが作成したイベントの総数をコンソールに表示
            console.log(this.myCount);
            return c.length;
          });
      }
    });
  }
}
```


Firestore内はこんな感じ。

<img width="793" alt="スクリーンショット 2019-10-07 19.08.11.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/04fa407c-bdfa-9734-6064-7f60f0b817af.jpeg">

#ちなみに、「ドキュメント」とは

**ドキュメント**とはここでは**書類の事ではなくて**、Firestore内での**データ１つ分**の事を言う。

そしてドキュメントの集まりを**「コレクション」**と言う。

上の画像の例で言えば、usersとeventsがコレクション。

そのコレクション内にあるユニークid１つ１つのことを**「ドキュメント」**と呼んでいる。

まぁ知っといて損はないかと。。。。

#参考
https://firebase.google.com/docs/firestore/data-model?hl=ja
php で firestore 使うときのメモ

毎回わからなくなるし調べるのしんどいのでメモ

## ドキュメントID

（Firestore 全般） 使えない文字列がある。

/ とか . とかは入れたらダメ。

>
ドキュメント ID に . と .. は使用しないでください。
ドキュメント ID に /（スラッシュ）は使用しないでください。
https://firebase.google.com/docs/firestore/best-practices?hl=ja#document_ids

なのでパスとかはそのまま使えない。

## データ登録

### 基本

```php
use Google\Cloud\Firestore\FirestoreClient;

$collection = 'test';
$documentId = 'id';

$db = new FirestoreClient();
$docRef = $db->collection($collection)->document($documentId);
$docRef->set([
    'field1' => "aaaa",
    'field2' => "bbbb"
]);
```

### ドキュメントIDを指定せずに自動で振る

set ではなく add を使う

```php
use Google\Cloud\Firestore\FirestoreClient;

$collection = 'test';

$db = new FirestoreClient();
$docRef = $db->collection($collection)->add([
    'field1' => "aaaa",
    'field2' => "bbbb"
]);
```

https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja#add_a_document
dbpediaの研究 その6

#概要

dbpediaが難解なので、手出してみる。
結果を整形してみた。

#結果


```
[
  {
    "color_name": {
      "type": "uri",
      "value": "http://ja.dbpedia.org/resource/鹿毛"
    },
    "color": {
      "type": "typed-literal",
      "datatype": "http://www.w3.org/2001/XMLSchema#integer",
      "value": "27"
    }
  },
  {
    "color_name": {
      "type": "uri",
      "value": "http://ja.dbpedia.org/resource/黒鹿毛"
    },
    "color": {
      "type": "typed-literal",
      "datatype": "http://www.w3.org/2001/XMLSchema#integer",
      "value": "11"
    }
  },
  {
    "color_name": {
      "type": "uri",
      "value": "http://ja.dbpedia.org/resource/栗毛"
    },
    "color": {
      "type": "typed-literal",
      "datatype": "http://www.w3.org/2001/XMLSchema#integer",
      "value": "10"
    }
  },
  {
    "color_name": {
      "type": "uri",
      "value": "http://ja.dbpedia.org/resource/芦毛"
    },
    "color": {
      "type": "typed-literal",
      "datatype": "http://www.w3.org/2001/XMLSchema#integer",
      "value": "2"
    }
  },
  {
    "color_name": {
      "type": "uri",
      "value": "http://ja.dbpedia.org/resource/青鹿毛"
    },
    "color": {
      "type": "typed-literal",
      "datatype": "http://www.w3.org/2001/XMLSchema#integer",
      "value": "2"
    }
  },
  {
    "color_name": {
      "type": "uri",
      "value": "http://ja.dbpedia.org/resource/青毛"
    },
    "color": {
      "type": "typed-literal",
      "datatype": "http://www.w3.org/2001/XMLSchema#integer",
      "value": "1"
    }
  },
  {
    "color_name": {
      "type": "uri",
      "value": "http://ja.dbpedia.org/resource/栃栗毛"
    },
    "color": {
      "type": "typed-literal",
      "datatype": "http://www.w3.org/2001/XMLSchema#integer",
      "value": "1"
    }
  }
]
```

#成果物

http://embed.plnkr.co/BDqAwMTIdpyxQkx3Rtci/

以上。
HTML <head>に書くタグ

HTMLの＜head＞要素に書くタグをまとめてみました

####文字コードの設定

```
<meta charset="utf-8">
```

####viewportの設定
**レスポンシブデザイン**（PC・スマートフォン・タブレット端末の、どの表示にも対応出来る表示）には必須！

```
<meta name="viewport" content="width=device-width, initial-scale=1">
```

####電話番号の自動リンク機能を無効
スマートフォンで数字が羅列していると、**そこが電話番号でなくても勝手に電話番号と認識されてしまう恐れがある**のでそれを無効化する

```
<meta name="format-detection" content="telephone=no">
```

####サイトのタイトル

```
<title>サイトのタイトルを入れる</title>
```

####メタディスクリプション
ページの概要を表すテキスト情報のこと。検索結果・クリック数に関係する。

```
<meta name="description" content="120文字程度でそのページの内容をまとめた唯一無二の文章を入れる">
```

####faviconの設定
![20191024_favicon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509471/b5f3e130-f337-1b76-c2b2-4a2a7dbe9106.jpeg)
赤枠で囲んであるのがfavicon

```
<link rel="icon" href="favicon.ico">
```



####外部ファイルを呼び出して適用する

```
<link rel="stylesheet" href="css/styles.css">
<scipt　type="text/javascript" src="js/XXXX.js>
```
オンプレからAWSの移設で失敗した体験をお話しよう。

はじめに
---------------------------------------
なぜ失敗した話をしようと思ったかというと、これからオンプレからAWSの移設の案件も増えてくることかと思います。
そんな中ネットやAWSの参考書には生の失敗談といったものがほぼ掲載されていない。
これからAWSへの移設を行う人達に対して同じミスをして欲しくないと思い執筆いたします。

前提知識、条件
---------------------------------------
・AWSとオンプレの接続はダイレクトコネクト。簡単にいうとAWSと自社を専用線で接続すること。
・BGP接続。BGPというのは簡単にいうと企業と企業のシステムを接続する時にお互いのシステムの情報(ルーティング)をやりとりする方式。
・開発環境で試すことができない環境の為いきなりの本番作業であった。

移設の流れ
---------------------------------------
※抜粋して簡易的に説明
①専用線回線を物理的に接続
②仮想インターフェースの状態確認
③BGPのセッション確率　※簡単に言うとAWS側のルータと自社のルータ間でシステムの情報(ルーティング)を実際にやりとりし始めること
④疎通確認

起きたこと
---------------------------------------
①の回線の接続が完了し②の仮想インターフェースの状態の想定としては「pending」⇒「down」⇒「available」となっていると思ったが
実際には「down」のままだった。
業務影響を考慮し夜間作業であった為AWS側のサポートにも連絡がつかず。。
移行作業には厳しい基準が設けられていた為その日は断念し次の日の予備日にて再作業を行って事なきを得た。

原因
---------------------------------------
原因として、この仮想インターフェースの仕様を理解していなかったのだが、物理的なインターフェースと同じように、回線を接続したらアップになると思い込み「available」と想定してしまった。
実際には通信可能な状態になると「available」となる仕様です。
×「通信のやりとりが可能」＝「回線接続後」
○「通信のやりとりが可能」＝「BGPによりお互いのシステム情報を伝達後」

最後に
---------------------------------------
これからオンプレからAWSへ回線をひき、移設する企業や担当エンジニア様がいると思うが、是非とも手順や想定記述する際には参考にしてほしい。
ちなみにもともと予備日程期間を3週間ほどの猶予があった為、予定通り作業が完了いたしました!(^^)!
自己証明書でsecureなgrpc server/client をつくる

# 動機
 業務でtls利用したgrpcサーバを建てる必要があったがサンプルを探してもinsecure channelを利用した例しか見つからなかったので調べた。

# 証明書用意
```bash
# 秘密鍵と公開鍵を作成
$ openssl req -x509 -nodes -newkey rsa:2048 -days 365 -keyout privkey.pem -out cert.pem -subj "/CN=127.0.0.1"
# 公開鍵でroot証明書を作る
$ openssl  x509 -in cert.pem -out root.crt
```

# .proto
```test.proto
syntax = "proto3";

message EchoRequest {
    string message = 1;
}

message EchoResponse {
    string message = 1;
}

service AVRGateway {
    rpc Echo (EchoRequest) returns (EchoResponse) {}
}
```

# スタブ作成
```bash
$ pipenv shell --three
$ pipenv install grpcio-tools
$ python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./test.proto
```

# サーバ作成
```python

from concurrent import futures
import grpc
import test_pb2_grpc
import test_pb2

class Servicer(test_pb2_grpc.AVRGatewayServicer):
  def Echo(self, request, context):
    return test_pb2.EchoResponse(message = "hoge")

def serve():
    pkey=open("privkey.pem", "rb").read()
    chain=open("cert.pem", "rb").read()
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=2))
    test_pb2_grpc.add_AVRGatewayServicer_to_server(
        Servicer(), server)
    cred = grpc.ssl_server_credentials([(pkey, chain)])
    server.add_secure_port('localhost:51011', cred)
    server.start()
    server.wait_for_termination()

if __name__ == "__main__":
    serve();

```

# クライアント作成
```python
import grpc
from test_pb2_grpc import AVRGatewayStub
from test_pb2 import *

if __name__ == "__main__":
    message = sys.argv[1]
    root = open("root.crt","rb").read()
    cred = grpc.ssl_channel_credentials(root_certificates=root)

    with grpc.secure_channel("localhost:51011", cred) as channel:
        stub = AVRGatewayStub(channel)
        response = stub.Echo(EchoRequest(message=message))
        print(response)

```

# テスト
```bash
$ python server.py &
$ $ python client.py hoge
message: "hoge"
```

# 参考
[リファレンス](https://grpc.github.io/grpc/python/grpc.html)
https://qiita.com/qiita_kuru/items/4d51b11f76dc0eafba7f
https://grpc.io/docs/tutorials/basic/python/
https://qiita.com/ike_dai/items/1a28f6a42c4a0d3a49d0
IDCSの無償機能と有償機能

# 調べたこと
IDCSの2要素認証(MFA)は、有償なのか無償機能なのか明記されてる公式ドキュメントを調べた。

# 結果
IDCSで2要素認証する場合は、有償ライセンスが必要。コンソール接続へのIP制限は無償版の機能に含まれるよう。
無償で2要素認証したいので、OCI側の機能を使うか。。

# ソース
[About Oracle Identity Cloud Service Pricing Models
](https://docs.oracle.com/en/cloud/paas/identity-cloud/uaids/oracle-identity-cloud-service-pricing-models.html#GUID-05F56DF0-0F71-436C-A103-3A10AEB38650)

# 内容
IDCSには、以下2つのライセンスがあり、Foundationのほうは無料
・Oracle Identity Cloud Service Foundation
・Oracle Identity Cloud Service Standard

>・For this pricing model, Oracle Identity Cloud Service has two pricing tiers:
>Oracle Identity Cloud Service Foundation: Oracle provisions this free version of Oracle Identity Cloud Service for customers that subscribe to Oracle Software-as-a-Service (SaaS), Oracle Platform-as-a-Service (PaaS), and Infrastructure-as-a-Service (IaaS) applications. A customer can use this version to provide basic identity management functionalities, including user management, group management, password management, and basic reporting. For additional features, as indicated in the table below, a subscription to Oracle Identity Cloud Service Standard is required.

>・Oracle Identity Cloud Service Standard: This licensed edition provides customers with an additional set of Oracle Identity Cloud Service features to integrate with other Oracle Cloud services, including Oracle Cloud SaaS and PaaS, custom applications hosted on-premises, on Oracle Cloud, or on a third-party cloud, as well as third-party SaaS applications. Features listed in this pricing tier are applicable for both Enterprise users and Consumer users.

んで、MFAはStandardライセンスのみに含まれている。
![mfa-license.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/b4ac3281-1518-424d-6747-2bb3700835cc.png)

IP制限は、無償版でいけるようだ。
![network-perimeter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456818/05b1322c-ac18-4ab1-6760-c7c367fc0f64.png)
Twitterリツイートキャンペーンを行なう場合の注意点

# Twitterリツイートキャンペーンを行なう場合の注意点

これまでいくつかのTwitterキャンペーンを実施してきた経験を元に、Twitter キャンペーンをする場合の私なりの注意点をまとめました。

Twitterページでは、RTしてくれた人の情報をすべて確認できないようになってます。

下記は、実際にTwitter公式アカウントのツイートになります。

![1180163579561091072.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509295/3f85837c-0a0f-4bbd-9c50-d5f5523d12db.jpeg)



「7,435件のリツイート」をクリックするとRTした人のリストが表示されますが、7,435件すべて表示はされません。

![twitter.com_Twitter_status.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509295/94c31705-12b4-3180-10e9-8d78b4d538a9.jpeg)


## すべてのリツイートを取得するにはどうすればよいか？

外部サービスを使うというのも方法としてありますが、外部サービスもTwitter APIを利用しているものがほとんどなので、無料版と有料版の違いはありますが、検索できる期間に決まりがあります。

公式サイト
https://developer.twitter.com/en/pricing.html

![developer.twitter.com_en_pricing.html.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509295/5dec2cbc-cb32-0325-ff66-9e79fd3ecb88.jpeg)


「Standard (free)」は7日前までしか検索できないため7日以上行なう場合は、キャンペーン開始と合わせてRTデータを収集してデータベース等に貯めていく必要があります。


# すべてのRTを収集できるわけではない

最新のRT情報を収集し続けるシステムがあったとしても、すべてのRTを収集できるわけではありません。
一時的にアカウントにフィルタがかかっていたり、制限されているアカウントやツイート、RTは検索してもヒットしないケースがあります。

Twitterの公式サイトの「検索のルールと留意点について」では、「検索結果の質を保つために、一部のツイートやアカウントが検索結果から除外されることがあります。」と書いてあります。

https://help.twitter.com/ja/rules-and-policies/twitter-search-policies

![help.twitter.com_ja_rules-.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509295/14baa0d6-3dd4-9b64-2638-1ec451309fd8.jpeg)


Twitter公式の「キャンペーンの実施についてのガイドライン」では、「すべての応募を確認できるように、主催者の@ユーザー名を含めてツイートしてもらう」という箇所に「検索品質の向上のために応募ツイートが検索から除外される場合があります。」とあります。

https://help.twitter.com/ja/rules-and-policies/twitter-contest-rules

![help.twitter.com_ja_rules-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509295/5f6ca572-0f7b-9560-4597-1e9e0fe0bbe1.jpeg)


参加ユーザーのアカウントがフィルタが架からないように保護するためには、RTによる応募は1日1回までに制限したり、同一ユーザが複数アカウントで応募するのも控えてくださいという内容になります。


## ツイートキャンペーンの場合

Twitterは「キャンペーンの実施についてのガイドライン」にて、「当選者を決めるには、すべての応募者を確認する必要があります。」と書いてます。ツイートキャンペーンに関しては、APIで収集する仕組みをわざわざ利用したり、新しく構築しなくても、すべての応募者を確認できる方法を残してしてくれてます。

それは、「すべての応募を確認できるように、主催者の@ユーザー名を含めてツイートしてもらう」という方法です。主催者のメンションを付けた投稿は、主催者に届くため検索をしなくても確認が可能になります。

ただ、キャンペーンの参加条件として、ダイレクトメッセージで当選発表するケースも考慮して、主催者をフォローして貰う必要がほとんどですが、当選者が主催者をフォローしてるかどうかは、目視で確認する必要があります。
かみ砕いてみたC#(ファイルの読み書き)

javaなら下記のようにfisfosでしたが・・

```java

package fileconvert;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Convert {

    public static void main(String[] args) throws IOException{
        //ファイルの読み込み
        FileInputStream fis=new FileInputStream("assets/sample.txt"); 
        InputStreamReader isr=new InputStreamReader(fis,"sjis");
        BufferedReader br=new BufferedReader(isr);
        //ファイルの書き込み
        FileOutputStream fos=new FileOutputStream("assets/sample2.txt");        
        OutputStreamWriter osw=new OutputStreamWriter(fos,"utf-8");
        BufferedWriter bw=new BufferedWriter(osw);

        String line;
        while((line=br.readLine())!=null) {
            bw.append(line);
            bw.newLine();
        }
        br.close();
        bw.flush();
        bw.close();
        System.out.println("done!");
        /*
        while(true) {
            String line=br.readLine();
            if(line == null) {
                break;
            }
            System.out.println(line);
        }
        */

    }

}
```

#C#だとこんな感じで使う

```C#
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WeightApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var path=@"./log.txt";
            while (true)
            {
                Console.WriteLine("操作を入力してください操作を入力してください1...体重を入力、2...一覧を見る、3...終了>");
                var select = Console.ReadLine();
                switch (select)
                {
                    case "1":
                        Console.Write("体重を入力してください>");
                        var weight = double.Parse(Console.ReadLine());
                        using (var writer = new StreamWriter(path, true))

                        {
                            writer.WriteLine($"{DateTime.Now.ToString()} {weight}kg");
                        }
                        break;
                    case "2":
                        var file = new FileInfo(path);
                        //あるかないか
                        if (file.Exists)
                        {
                            using (var reader = new StreamReader(path))
                            {
                                string line;
                                while ((line = reader.ReadLine()) != null)
                                {
                                    Console.WriteLine(line);
                                }
                            }

                        }
                        else
                        {
                            Console.WriteLine("まだデータがありません。");
                        }
                        break;
                    default:
                        Console.WriteLine("アプリを終了します。");
                        return;
                }
            }
        }
    }
}

```

って認識です。
自慢ではありませんがfisfosだけは仕組みを理解して暗記できてます。

自分でも謎ですが。。
ターミナルの使い方まとめ

この記事では、ターミナルについて学んだことや、使えそうなことを随時追加していきます。
使えそうならいいね！お願いしま〜す:boy_tone1:


#コマンド

##ディレクトリの移動
ルートディレクトリへ移動

```
 > cd /
```

ホームディレクトリへ移動

```
> cd
あるいは
> cd ~
```

##ファイル名を表示させたい
カレントディレクトリにあるファイル、フォルダを表示

```
> ls
```


#便利機能

##フォルダやファイル名の補完機能
フォルダやファイル名を入力中に tab を押す
２回押すと候補リストが表示される
train_test_splitで3つ以上の分割を行う

テストにどのデータが行ったかを確認したいことが稀にあるので

```python
from sklearn.model_selection import train_test_split

if __name__ == "__main__":
    data = [[1, 1], [2, 2], [3, 3]]
    label = [1, 2, 3]
    name = ["one", "two", "three"]

    (train_data, test_data,
     train_label, test_label,
     train_name, test_name) = train_test_split(data, label, name)

```
【jQuery】MaterializeのsideNav()が働かない

<br/>

## MaterializeのjQuery関数が動かない

マテリアライズ のNavbarはとてもオシャレですが、そのままではスマホサイズの時にメニュー一覧が表示されません。

<br/>

![スクリーンショット 2019-10-07 13.31.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501231/221127a0-d555-8274-e0c4-85f053d70ff8.png)

<br/>

↓画面を小さくすると、こんな感じで右側にあったメニューが消えます。

![スクリーンショット 2019-10-07 13.31.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501231/e3b1f354-69b6-4a42-4f4e-74c11d851477.png)

<br/>


Materializeには、このように、メニューボタンを押すことで、メニュー一覧を別途開けるタイプがあります。

<a href="https://gyazo.com/2ec701ac108eaea2846cc2c7e3901b1d"><img src="https://i.gyazo.com/2ec701ac108eaea2846cc2c7e3901b1d.gif" alt="Image from Gyazo" width="200"/></a><br/>


こちらの勝手が良さそうなので、使ってみようと思い、Materializeの公式に載っている通りにHTMLを記載し、JavaScriptのファイルに次を追記しました。

```javascript

 $(".button-collapse").sideNav();
```

<br/>


しかし、自分の環境では、メニューボタンを押してもメニューが表示されませんでした。
デベロッパーツールで確認したところ、「sideNavは関数ではありません」との記述が出てしまっていました。

<br/>


## 解決策：　jQueryの読み込みとMaterializeの読み込みの順を逆にした

こちらのサイトに解決策が載っていました。
https://stackoverflow.com/questions/43994931/typeerror-sidenav-is-not-a-function

jQueryとMaterializeの読み込み順が逆だとうまくいかないようです。

<br/>

```html
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css">

    <!-- Compiled and minified JavaScript -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>

    <script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script>
```

上のように、jQueryのCDNが下Materializeのものより下に記述されていると動きません。なので順番を変えます。

<br/>

```html
 <script src="https://code.jquery.com/jquery-3.4.1.js" integrity="sha256-WpOohJOqMqqyKL9FccASB9O0KwACQJpFTUBLTYOVvVU=" crossorigin="anonymous"></script>

    <!-- Compiled and minified CSS -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/css/materialize.min.css">

    <!-- Compiled and minified JavaScript -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/0.100.2/js/materialize.min.js"></script>
```

このように、jQueryのCDNを先にMaterualizeのものよりも先に持ってきたところ、無事動きました。

<br/>

<a href="https://gyazo.com/f39654ccde65e37b0fba635da82d1e99"><img src="https://i.gyazo.com/f39654ccde65e37b0fba635da82d1e99.gif" alt="Image from Gyazo" width="200"/></a>

<br/>


## 学び: 英語のリファレンスもちゃんと読む
Materializeを上手に扱う上では欠かせないな〜と感じました。
2019-10-07 CentOS7.7 > ホームディレクトリ以下のフォルダ名を日本語から英語に変更する

```txt:動作環境
CentOS Linux release 7.7.1908 (Core)
```

### 概要

- 日本語環境としてセットアップ
- ホームディレクトリ以下のフォルダ名が日本語で移動しにくい
    - 例: ダウンロード、デスクトップ、ドキュメント
- 英語フォルダ名に変更したい

### 類似処置

- [Ubuntu > link > Ubuntuでデスクトップのディレクトリ名を「Desktop」にする](https://qiita.com/7of9/items/bce26992a19766f5f536)

### 実施

1. 日本語環境から英語環境へ変更
    - 設定 > 地域と言語 > 言語(L) において、「日本語」から「English (United States)」へ変更
2. ログアウト
3. ログイン
4. 「Update standard folders to current language?」というメッセージ付きのダイアログが表示されるので、英語フォルダに更新する方を選択する
ホットリロードで毎回ビルドする方法(nodemon)

# はじめに
`webpack-dev-server`はどうやらビルドを毎回してくれないみたい(速度の関係上?)なので、`.ts`や`.tsx`を変更すると`dist/main.js`が毎回生成されるようにしたかった。
`webpack`は導入済みを前提として書いていきます。
# バージョン

- nodemon - 1.19.3

# 解決法
`nodemon`というソースを監視して自動でサーバーを再起動してくれるツールがあるみたい。(参考: [Qiita - nodemonとは? @mitsuhiro_K](https://qiita.com/mitsuhiro_K/items/429ca479b4e191bfea4d))
この`nodemon`をインストール

```console
$ yarn add nodemon -D
```

`package.json`のスクリプトに追加

```json:./package.json
"scripts": {
    "build": "webpack",
    "watch": "webpack -w",
    "nodemon": "nodemon"
}
```

`nodemon.json`を作って、以下の記入

```json:./nodemon.json
{
  "watch": ["src"],   
  "ext": "ts,tsx",   
  "exec": "webpack"  
}
```

これで、`src`ディレクトリの`.ts`と`.tsx`を監視して、変更されたら`webpack`を実行してくれるらしい。

### nodemonの実行

```
$ yarn nodemon
```

# 参考

- [Qiita - nodemonとは? @mitsuhiro_K](https://qiita.com/mitsuhiro_K/items/429ca479b4e191bfea4d)
コールバック関数メモ

<h1>コールバック関数</h1>

```
// hogeに文字列が代入された後にコールバック関数を実行する関数
function hogeWithCallback(callback) {
  var hoge;
  setTimeout(function() {
    hoge = 'hoge';
    callback(hoge);　//ここで下で定義した関数の処理が始まる
  });
}

// 引数をログに出力する関数
var putLogParam = function(param) {
  console.log(param);
}

// ログを出力するコールバック関数を渡す
hogeWithCallback(putLogParam);  // => 'hoge'

// 引数をアラートに表示する無名関数をコールバック関数として渡す
hogeWithCallback(function(param) {
  window.alert(param);  // => 'hoge'
});
```

コールバック関数は引数として渡される関数である。
"関数"とついているので始めは、処理を実行するためのものと思い込んでいて、よく理解できなかった。
しかし引数というのなら、普通の変数としてとらえてみることにしたら理解できた。
どこかの関数で、コールバック関数が引数として渡されたら、それは呼び出した関数の中で、呼び出されるまではなにも仕事をしない。
当たり前なのだが、今までは引数として渡された瞬間に、コールバック関数が実行されるのかと思っていた。

つまりコールバック関数もただの変数"x"と同じことで、値の代わりに処理が入っているだけである。
【Xcode10】Simulatorのスクリーンショットを撮る方法

備忘録です。
今回は、Simulatorのスクリーンショットを撮る方法についてです。

###バージョン
・Xcode 10.2.1
・Macbook Pro(macOS:Mojave10.14.6)
###1. スクリーンショット(画面枠内のみ)
「Simulator」 → 「File」 → 「New Screen Shot」を選択すればスクリーンショットが撮れます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480691/5153f6b7-d532-940e-a4e5-d01a844d4b33.png" width=50%>

以下のスクリーンショットが撮れました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480691/f5df0633-2ad0-8e96-0887-c54b9d17c5c2.png" width=30%>

ただし、この場合だとiPhoneの枠側の部分はスクリーンショットの対象外となります。

###2. スクリーンショット(画面枠外含む)
対象のウィンドウ全体をスクリーショットする方法です。

【Mac】「cmd」+「shift」+「4」+[space」→ 対象のウィンドウをクリック
【Windows】対象のウィンドウをクリック →「alt」＋「print screen」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480691/7b8b0136-a2a6-9130-1c9b-4c21ac7c259a.gif" width=30%>

この方法ならiPhoneの枠の部分も含めてスクリーンショットを取ることができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480691/13692558-bfd7-78da-aa3a-5772b9ff786d.png" width=30%>

以上になります。
もし不明点や間違い等があればコメントくださいm(_ _)m
Google Apps Scriptでhtmlメール送信ツール作ってみた

#はじめに
社内イベントのインビテーションとして、Gmailでhtmlメールを複数のメンバーに一斉送信したいという依頼を受け、非エンジニアの方でも簡単にhtmlメールを送れるようなツールを作成しました。


#Google Apps Scriptとは
G Suiteプラットフォームでの軽量アプリケーション開発のためにGoogleが開発したスクリプトプラットフォームです。
スクリプトの言語は、JavaScriptがベースで、Googleが提供するサービス(スプレットシート、Gmailなど)と容易に連携できます。
利用する際は、Googleアカウントが必須となっています。


#ツール概要
スプレッドシートで入力した送り先メールアドレス、CCメールアドレス、送信者メールアドレス、件名を取得し、htmlメールを送信。
※送信用のhtmlは別途用意。


#送信手順
##1.スプレッドシートに必要項目を入力
![スプレットシート.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448435/29a92733-2a29-4c6c-f257-0d8f0938f00f.png)

##2.送信
スクリプトを開き、下記画像赤線の実行ボタンを押下。
![スクリプト2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/448435/79931bf0-e999-f54d-e064-7ba8dbd49672.png)



#コード
##スクリプト
```JavaScript:sendMail.gs
function sendMail() {
 
  /* 送信用情報をスプレッドシートから取得 */
  var mailSpreadsheet = SpreadsheetApp.openById('スプレッドシートID'); //メアド入力用スプレッドシート取得
  var mailSheet = mailSpreadsheet.getSheetByName('シート1'); //シート取得

  var mailLastRow = mailSheet.getLastRow(); //最終行数取得
  var arrayToAddress = mailSheet.getRange(2,1,mailLastRow-1,1).getValues(); //送信先メールアドレスリスト取得
  var toaddress = arrayToAddress.join(','); //配列をカンマ区切り文字列に変換

  var ccLastRow = mailSheet.getRange('B:B').getValues().filter(String).length; //CC入力行数取得
  if (ccLastRow == 1) { //CCのアドレスがなければ、CCアドレスを空にする。
    var ccAddress = ''
  }
  else {
    var arrayCcAddress = mailSheet.getRange(2,2,ccLastRow-1,1).getValues(); //CCメールアドレスリスト取得
    var ccAddress = arrayCcAddress.join(','); //配列をカンマ区切り文字列に変換
  }

  var fromAddress = mailSheet.getRange('C2').getValue(); //送信元メールアドレス取得

  var subject = mailSheet.getRange('D2').getValue(); //メール件名取得


  /* メールを送信 */
  var html = HtmlService.createHtmlOutputFromFile("test").getContent(); //送信用メールテンプレ取得
  GmailApp.sendEmail(
    toaddress, //宛先
    subject, //件名
    'お知らせ', //本文
    {
      from: fromAddress, //送り元
      cc: ccAddress, //CC
      htmlBody: html //mailテンプレ
    }
  );
}
```
※スプレッドシートIDには、スプレッドシートのURLのxxxxの部分を指定。
https\://docs.google.com/spreadsheets/d/xxxx/


##送信用メールテンプレ
```test.html
<!DOCTYPE html>
<html>
  <body>
    test
  </body>
</html>
```


#補足
今回は、送信タイミングが不定期だったため、作成しませんでしたが、
タイマーを用いての定期実行やスプレッドシートを開く等のアクションを起点とするトリガーを設定できるようです。
詳細は、下記参考資料をご確認ください。


#参考資料
- https://developers.google.com/apps-script/?hl=ja
- https://tonari-it.com/google-apps-script-manual/
【Rails】RSpecの導入方法

#概要
RspecとはRuby on Railsの代表的なテストフレームワークです。
RailsとRspecでは記述方法がかなり異なるので意味不明かと思います。
しかし、少し覚えると簡単に使えるので頑張って理解しましょう。
実装でコードをゴリゴリ書いていくことも大切ですが、同じくらいテストも大切ですので
この記事で導入しましょう！！

#インストール
Rspecを導入するためにはrspec-railsをインストールしなければなりません。
##Gemfile
Gemfileの`:development`と`:test`のグループに記述します。
下記の記述をGemfileに追記してください。

```:Gemfile
group :development, :test do
  gem 'rspec-rails'
end
```

##bundle install
gemをインストールするためにターミナルから`bundle intall`しましょう

```:ターミナル
$ bundle install
```

`bundle install`完了後、RSpecをインストールしましょう

```:ターミナル
$ rails generate rspec:install
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb
```

インスール完了するとフォルダができています。
これでRSpecのインストールが完了です。

今の状態でモデルを作成すると以下のようにファイルが作成されます。
以下が`user`モデルを作成した時の実行結果になります。
`spec/models/user_spec.rb`がテストに関するファイルです。
コントローラーを作成する時も同様に作成されます。


```
$ rails generate model user
      invoke  active_record
      create    db/migrate/20181017040312_create_users.rb
      create    app/models/user.rb
      invoke    rspec
      create      spec/models/user_spec.rb
```

既存のモデルに対するテストファイルを作成する方法について説明します。
以下が既存のuserモデルに対してテストファイルを作成した実行結果です。
コントローラーもモデルと同様に作成することができます。
`model`、`controller`の前に`rspec:`をつけてください。

```
$ rails generate rspec:model user
      create  spec/models/user_spec.rb
```

以上でRSpecの導入は完了です。

**疑問、気になることがありましたら、質問、コメントよろしくお願いします！！**
営業組織形成

#なぜ組織を持つか
組織として安定的な売り上げを上げていくためには、突出した一個人の能力を重宝しすぎるより、誰がやってもある程度の成果を出せる仕組みを確立した方が長期的な利益になる
#教育の難しさ
新入社員の教育についても、先輩営業任せでは後々問題が発生する率が高くなる。そもそも、スポーツでも良い選手が良い指導者になるとは限らないように、営業も良い成績を上げている者が同じく成果を上げられる後輩を育てられるとは限りません。「無意識に」売れる営業センスがある人は、その一つ一つの過程をうまく言語化できず「もっとしっかり」「なんでできないの」などと抽象的な指導になってしまいがち。さらに、それぞれが「自分の手法」を伝えていくため、やり方や気性の合う先輩と組めた新人は伸びていきますが、どちらか、あるいはどちらも合わない新人は成績が伸び悩んでしまうおそれがあります。



##営業組織強化のための具体的な方法とは
###個人のスキルを伸ばす
マネージャーだったら自分の数字だけではなく、営業部全体を観れる視野の広さ。
どんなプレも決めれる営業力の高さ
どんな営業マンにも適切な指導をできる指導力

###フィードバックする場を増やす
=>フィードバックの機会を増やすことは、それだけ改善点に気づくポイントが増えるということ
=>改善点や方法をわかりやすく提案する、もしくは本人と相談して具体的解決策を探るなど、次の目標にコミットするためのプラス要素に持っていく作業が大切です。

###マネージャー自身が率先して行動する
自分自身がもし部下だったとしたら、口ばかり出して何もしないリーダーと、率先して自ら行動するリーダーとではどちらの意見を素直に受け入れるか。
人には向き不向きもあり表に出ればいいというわけではありませんが、率先して実行している姿を見せることで、自ずと部下からの視線も変わってくるはず

###目標にコミットする
目標にコミットすることで、チーム単位個人単位での競争を激化させることができる
各々に様々な面から意識上げをすることができる

###周りに感謝する
結局感謝の気持ちを忘れた時に人は一人歩きをし始める。
ビジネスの世界で誰に対しても感謝の気持ちを忘れたやつは成功しない

#新人営業マンに対して


●マインドセット(2-3時間)
- 営業とは
- なんでこの営業か
- codevillageを自信持ってもらい、好きになってもらう
- 自分自身のストーリ作成
- 身の回りの既存のリストアップ

●同行が結局伸びる
アポ見学プレ見学、営業指導徹底


#営業組織の現状チェックリスト（抜粋）

営業担当
□営業担当としての役割を明確に認識していない
□ターゲット顧客や優先順位が決められない
□目標達成計画や営業計画が立てられない
マネージャー
□マネジメントの役割を明確に認識していない
□組織や自身について「変革」の必要性の認識が弱い
□自身も営業経験がなく、活動の是非の判断ができない
仕組み
□自組織の目指す姿が不明確、または伝達されていない
□営業プロセスを進捗管理・評価する仕組みがない


**「勝ちパターン」を知ることで個人の成果が上がり、チーム全体の営業力も底上げされる**



##目標管理
経営目標で掲げられた数字を、部門、チーム、個人の目標設計に落とし込みます。

個人の目標については、「どうしてその目標数字になったか」という根拠をしっかりと説明することで目標を達成することの意義が理解でき、営業メンバーが目標に対してコミットすることで、パフォーマンスを向上させることができる

**また、「少し高めの数字に設定」することで、成長を促すことも大切**

ⅰ）目標数値に納得感があるか
ⅱ）目標数値はストレッチ（背伸びした目標）したものを要望できているか
ⅲ）目標達成に対する合意とコミットを得れているか

##行動管理
営業の行動を数値にもとづいて管理することが、行動管理

目標達成できなかったという結果だけを見て「なぜ売れなかったんだ」と詰めるだけでは、何の解決にならない

まずはプロセスごとの数字を分析してボトルネックを見つけます。例えば、ここで繋げ率が低いことが分かったとします。

その際に、クロージングができなかった理由や仮説（競合に負けた、など）を立て、打ち手を実行していく。このようなPDCAを回していくことこそが、根本的な課題の解決と営業力の強化に結びつくのです。




##モチベーション管理
モチベーションのない営業が成果を上げることはできません。しかし、そのモチベーションの源泉が「成果を上げていること」だったりします。

**まずは小さな目標を達成させることでモチベーションを上げること**

モチベーションの上げ方については、本も多数出ているので、自分に合ったやり方を見つけるしかない。
*効果的な方法は自分の経験談や持論を押し付けないことです。*

仕事に対する考え方や意欲などは人によって違いますので、一人ひとりに合った関わり方をするように心がけよう

「目標管理」「行動管理」「モチベーション管理」をすることで、入力や確認作業など面倒な仕事をできる限り減らし、営業が成果を出しやすく、働きやすい環境をつくることができます。
【VBScript】Excelをひとつひとつ開いてなにかしらの処理を自動化する方法

#はじめに
業務中に発生した以下のような要望をVBScriptを用いて解決できたので、その方法をご紹介します。(Windows限定)
●大量にあるExcelをひとつずつ開いてデータを取得したい！
●大量にあるExcelをひとつずつ開いて修正したい！
●大量にあるExcelをひとつずつ開いて...etc

※本記事ではExcelをひとつひとつ開いて、特定のセルにコマンドライン引数で与えたデータを挿入するところまでをご紹介します。

私と同じく1日中Excelとにらめっこしている方の手助けになればと思います。

#完成図
<img width="700" alt"完成図.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509479/7b336748-157a-f2f3-1e2f-3c4aa6f21aba.gif">
#1.ファイル作成
VBScriptを書くためにvbs形式でファイルを作成します。
今回は"__test.vbs__"というファイルを作成します。

次にvbsファイルを連続実行するためにbatファイルを作成します。
今回は"__test_run.bat__"というファイルを作成します。

流れとしてはbatファイルからVBScriptを繰り返し実行していきます。
<img width="700" alt="01_バッチ作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509479/4369844b-e790-19af-2f5d-8e4efa31eca4.png">

#2.VBScriptを書いていく
先ほど作成した"__test.vbs__"をエディタで下記のように修正します。

```VBScript:test.vbs
Dim excel_obj
Dim workbook
Dim worksheet

'Excelの機能を利用するために必要
Set excel_obj = CreateObject("Excel.Application")

'Excelを可視化
excel_obj.Visible = True

'開きたいExcelファイルを指定(絶対パス)
Set workbook = excel_obj.Workbooks.Open(WScript.Arguments(0))

'シートを指定(名前Or番号で指定)
Set worksheet = workbook.Sheets(1)

'シート(1)の"A1"セルに値を入れる
worksheet.Range("A1").Value = WScript.Arguments(1)

'上書き保存
workbook.Save

'ワークブックを閉じる
workbook.Close

'Excelを閉じる
excel_obj.Quit
```

#3.batファイルを書いていく
"__test_run.bat__"をエディタで開きます。

タブ区切りで、"__test.vbsのパス__"  "__開きたいExcelのパス__" "__セルに入れたい値__"を指定します。
下記のフォルダ構成ならば
<img width="700" alt="batファイル作成.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509479/4677c792-0b00-4d2f-4b0d-403c4a5294da.png">

こんなかんじです。

```bat:test_run.bat
C:\Qiita_Test\test.vbs	C:\Qiita_Test\abc_01.xlsx	test_01
C:\Qiita_Test\test.vbs	C:\Qiita_Test\abc_02.xlsx	test_02
C:\Qiita_Test\test.vbs	C:\Qiita_Test\abc_03.xlsx	test_03
C:\Qiita_Test\test.vbs	C:\Qiita_Test\abc_04.xlsx	test_04
C:\Qiita_Test\test.vbs	C:\Qiita_Test\abc_05.xlsx	test_05
C:\Qiita_Test\test.vbs	C:\Qiita_Test\abc_06.xlsx	test_06
C:\Qiita_Test\test.vbs	C:\Qiita_Test\abc_07.xlsx	test_07
C:\Qiita_Test\test.vbs	C:\Qiita_Test\abc_08.xlsx	test_08
C:\Qiita_Test\test.vbs	C:\Qiita_Test\abc_09.xlsx	test_09
C:\Qiita_Test\test.vbs	C:\Qiita_Test\abc_10.xlsx	test_10
```

#4.実行
"__test_run.bat__"をダブルクリックして実行します。
実行するとコマンドプロンプトが起動し、順次Excelが立ち上がり、処理が実行されます。
コマンドプロンプトが閉じたら、すべての処理が終わった合図です。
実施後にExcelを確認すると、値がきちんと挿入されていることが分かると思います。

#おわりに
今回ご紹介した内容は必要最低限の処理のみとなります。
これを応用すれば基本的なデータの取得、加工などができるようになると思います。
この記事がだれかのお役に立てばいいなと思います。