OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby】Rumaleでクラスタリング - DBSCAN - 

Rubyの機械学習ライブラリRumaleには、クラスタリングのアルゴリズムDBSCANも搭載されているので試してみました。
https://github.com/yoshoku/rumale

![BEFORE-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/93ecbffc-989f-7022-8022-e12075be5b16.png)![AFTER-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/3361c7eb-d9c1-bc09-cdde-de768b1676dd.png)
![BEFORE-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/ae4cb45d-4932-0844-3fc3-dcb7ec87cb33.png)![AFTER-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/ea2f80d6-5066-88f7-33f6-4af7fb01db8e.png)

名前のつけかたがよくないですが、BEFOREが元のデータで、AFTERがクラスタリングしたあとの結果です。
AFTER-1をみると、3つに分類されているようですが、だいたいうまくいっているみたいですね。

```ruby
require 'numo/narray'
require 'numo/gnuplot'
require 'rumale'

DFloat = Numo::DFloat
NMath = Numo::NMath

def main
  all_sample, s1, s2 = create_toydata_1
  run(all_sample, s1, s2, "1")

  all_sample, s1, s2 = create_toydata_2
  run(all_sample, s1, s2, "2")
end

def run(sample, s1, s2, name)
  plot [s1, s2], "BEFORE-#{name}"

  analyzer = Rumale::Clustering::DBSCAN.new(eps: 0.5, min_samples: 5)
  result = analyzer.fit_predict(sample)

  samples = split_sample(sample, result)
  p クラスタの数: samples.size
  plot samples, "AFTER-#{name}"
end

def plot(samples, name)
  Numo.gnuplot do
    reset
    set term: "pngcairo size 400,400"
    set output: "#{name}.png"
    set title: name
    set key: "right bottom"

    data_for_gnuplot = samples.map.with_index do |s, i|
      x = s[true, 0]
      y = s[true, 1]
      [x, y, pt: 6, lw: 2, t: i.to_s]
    end

    plot *data_for_gnuplot
  end
end

def create_sample(x1, y1, x2, y2)
  s1 = DFloat.vstack([x1, y1]).transpose
  s2 = DFloat.vstack([x2, y2]).transpose
  sample = s1.concatenate s2
  [sample, s1, s2]
end

def split_sample(sample, result)
  clusters = result.to_a.uniq
  clusters.map do |i|
    sample[result.eq(i).where, true]
  end
end

def create_toydata_1
  x1 = DFloat.new(100).rand_norm(-1, 0.5)
  y1 = DFloat.new(100).rand_norm(-1, 0.5)
  x2 = DFloat.new(100).rand_norm(1, 0.5)
  y2 = DFloat.new(100).rand_norm(1, 0.5)
  create_sample(x1, y1, x2, y2)
end

def create_toydata_2
  x1 = DFloat.new(100).rand(0, Math::PI)
  y1 = NMath.sin(x1) + DFloat.new(100).rand_norm(0, 0.1)
  x1 -= Math::PI / 4.0
  x2 = DFloat.new(100).rand(-Math::PI, 0)
  y2 = NMath.sin(x2) + DFloat.new(100).rand_norm(0, 0.1)
  x2 += Math::PI / 4.0
  create_sample(x1, y1, x2, y2)
end

main
```

Rumaleを呼びだすところよりもサンプルデータを作るところの方が行数が長くなる傾向。

## 参考資料
[scikit-learnでDBSCAN(クラスタリング)](https://qiita.com/takechanman1228/items/c7f23873c087630bab18)
MkDocs個人的まとめ

# 調査結果
- mkdocsはWindowsマシンへインストールして動作させることができる。mkdocsの動作にはpythonが必須でこれもインストールする必要あり。  
  - pythonのインストール  
    右のサイトからインストーラをダウンロードしてインストール。https://www.python.org/
  - mkdocsのインストール  
    pythonをインストールしたマシン上のターミナルで右のコマンドを実行`pip install mkdocs`
- mkdocsを使うにはまず「プロジェクト」の作成が必要
  - ターミナルでプロジェクトを作成したいフォルダ(フォルダAとする)へ移動し、`mkdocs new <プロジェクト名>`と打つと以下の構成でフォルダ、ファイルが生成される
  
```
       /<フォルダAへのパス>/<プロジェクト名>/
                                           mkdocs.yml        - 設定ファイル
                                           docs/
                                                index.md     - index.htmlに相当するファイル
                                           
```

- markdownのみをインプットとしてWebサイトを公開できる模様
  mkdocs.ymlがある階層へ移動してコマンド``mkdocs serve``を実行
  →ローカルでサーバーが立ち上がり　http://127.0.0.1:8000
     でアクセス可能になる
    
- markdownからhtmlへの変換が可能
  - mkdocs.ymlがある階層へ移動してコマンド``mkdocs build``を実行    
     /<フォルダAへのパス>/<プロジェクト名>/配下に「site」ディレクトリが作成され、  
     siteディレクトリ配下にhtmlやらなんやらが出力される。  
    - mkdocs.ymlに出力設定ができる？

- 各ファイルは UTF8 + LFで記載する模様。そうしないと各コマンド実行時にエラーが出る。

# 残調査タスク
- 順番指定できない？
- ヘッダ、フッタの設定はできない？

## 参考
https://qiita.com/wamisnet/items/ed725d74f945f7c06b91
RCSB PDB の REST API の使い方

[RCSB PDB](http://www.rcsb.org/) の [REST API](https://www.rcsb.org/pdb/software/rest.do) の使い方が微妙に分かりにくいので、今後のために使い方を記録しておきます。

1. [Advanced search](https://www.rcsb.org/pdb/search/advSearch.do) で検索条件を入力します。
2. 検索結果ページ左側ペインの [Query details](http://www.rcsb.org/pdb/queries/queryDetails.do) ボタンを押します。
3. XMLが表示されるので、コピペで保存します (ここでは仮に `rcsb_pdb_rest.xml` として保存します)。
4. [Advanced search API](https://www.rcsb.org/pdb/rest/search) に POST リクエストで先程の XML を送りつけます。ここでヘッダーに `Content-type: text/xml` と**付けてはいけません**。

```bash
cat ./rcsb_pdb_rest.xml | curl -X POST -d @- 'https://www.rcsb.org/pdb/rest/search'
```
以上です。

追記:
肝心のPDBファイルは `https://files.rcsb.org/download/[ID].pdb` とか `https://files.rcsb.org/download/[ID].pdb.gz` とかから取得します。
FASTAは `https://www.rcsb.org/pdb/download/downloadFastaFiles.do` のエンドポイントを使います。これらのAPIのドキュメントは [こちら](https://www.rcsb.org/pages/download/http) です。
Cognos Analytics レポートで条件により表示コンテンツを切り替える条件ブロック

#表示コンテンツを切り替える条件ブロックの使い方
選択条件により表示コンテンツを切り替える事ができる「条件ブロック」の作成方法を学びます。

プロンプトで「リスト」を選択するとリストが表示される。
![016.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/560fb35c-d590-01a9-16e3-6784566094c7.jpeg)

「グラフ」を選択するとグラフが表示される。
![017.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/aa58c712-d868-831c-b2a7-39d508556709.jpeg)


#手順
A1.Reportを開始点とする。
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/cbecba7b-f7d8-b23e-6271-4bb7e5b71527.jpeg)

「値のプロンプト」を配置し、新規パラメーターを作成で「pDISP」と入力し「終了」。
![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/360263ab-ee20-ad50-68f7-66adbff949c8.jpeg)

「値のプロンプト」のプロパティから、「固定値の選択」を選択し、ウィンドウで変数のプルダウンから「新しい文字列変数」を選択。
![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/0bafdc88-a111-96ce-3bae-10a0f73d05d0.jpeg)

名前を「vDISP」と入力。※先ほどのpDISPはパラメーターで、ここのvDISPは変数なので、同じものではない。
「+」ボタンを選択し「リスト」と「グラフ」を追加する。
これにより変数vDISPの値として「リスト」と「グラフ」が作成される。「OK」を選択。
![004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/52dfbfc5-ce66-fa4e-d5e2-92edb1ba5e15.jpeg)

この画面が表示されるので、赤枠のパラメータータブで「pDISP」を式の定義にドロップ後「OK」。
![005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8b552a47-0ac5-1a98-e836-6f2c2ed6fc26.jpeg)

この画面で「+」をクリックし、使用する値に「リスト」と「グラフ」を入力し作成。
これにより、値のプロンプトの選択肢としての「リスト」と「グラフ」が作成される。
![006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/74658de5-0e08-33b0-213f-897a31c297b0.jpeg)

「条件ブロック」を配置。
![007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/0322f058-01f4-d638-b697-103910d7d696.jpeg)

「条件ブロック」のプロパティから「ブロック変数」を選択し、変数で「vDISP」を指定し「OK」。
![008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/a70c587a-15f7-c7c7-c5b8-d23897980d7a.jpeg)

現ブロックで「リスト」を選択。
これは変数「vDISP」で「リスト」が選択されている時に、今の条件ブロックに配置されているものを表示する、という意味。
![009.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/0edf102c-85a9-74d0-3b50-e6b8e967c7bf.jpeg)

「リスト」をドラッグ&ドロップで、条件ブロックの中に移動。
![010.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/50d18436-d165-628c-f548-181ebbad446b.jpeg)

現ブロックで「グラフ」を選択。
※条件ブロックの中が何もなくなっている事がわかる。
![011.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/46a729ea-424f-5410-2e28-2a2a4caa4db1.jpeg)

「視覚化」を条件ブロックに配置し、適当なデータアイテムを入れる。
![013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/4934973c-e104-d4bb-e541-368798c75ad9.jpeg)

「値のプロンプト」で自動送信を「はい」に指定。
![014.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/28fdf0e7-32a0-9c60-31cf-596259951fdc.jpeg)

プロンプトで「リスト」を選択。
![015.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/de7c6fa2-8533-6c86-45ef-4db5a63b659e.jpeg)

「リスト」が表示される。
![016.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/679c4d77-ea3b-fe72-13fd-cfeb169eb370.jpeg)

プロンプトで「グラフ」を選択すると「グラフ」が表示される。
「![017.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/57d8c315-81e6-36b0-59df-73960701ac6c.jpeg)


#自己学習記事一覧
**Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト**
https://qiita.com/shinyama/items/95885c7246dc413b6448
GitKrakenでGitLabからPullができるがPushができない件

#GitKrakenでGitLabからPullができるがPushができない件

##環境
- windows10Pro
- gitKraken 5.0.4
- git 2.16.1.windows.4

##症状
gitKrakenで作業を行った後いざpushしようとした所

gitkraken access denied make sure you have access to do that action on that remote and try again

と表示されpushができない。

グーグル翻訳通り「アクセスが拒否されましたそのリモートでそのアクションを実行するためのアクセス権があることを確認してからやり直してください」とのこと。

##原因
GitlabはDevelopper権限だとpushをすることができない。

昨日まではリポジトリを作成したアカウントで作業を行っていたためMaintainer権限だったのでpushができたが今日アカウントを増やしたのと同時にGitKrakenを導入したことが混乱の原因だった。(もしかしてと思い、コマンドラインからも試したところ不可能だったので気が付いた)

##行ったこと
- gitLabからリポジトリをクローンした(https and SSH)
- SSHがうまくいっていないのかなと思い何度か鍵を作り直した。
- [これ](https://support.gitkraken.com/integrations/gitlab-self-hosted/)を参照してgitLabのPATの設定を行った。
- ダメだった。

##解決策
[この方のページ](https://urashita.com/archives/16808)を参照にして設定を変更したい所であったが、settingからProtected Branchesの欄が見当たらなかったため今使っているアカウントをMaintainer権限にする脳筋プレイでクリアした。
Oracle Database 19cのインストールを試す

オンプレミス版のOracle Database 19cがダウンロードできるようになったため、インストールしてみました。インストール・メディは[こちら](https://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html)からダウンロードできます。Linux x86-64 版の[インストール条件](https://docs.oracle.com/en/database/oracle/oracle-database/19/ladbi/operating-system-requirements-for-x86-64-linux-platforms.html#GUID-3F647617-7FF5-4EE4-BBA8-9A5E3EEC888F)はOracle Database 18cと大きく変わりませんが、バージョンとして Oracle Linux 6 / Red Hat Enterprise Linux 6 はサポート対象外となり、Oracle Linux 7 / Red Hat Enterprise Linux 7 も7.4（または7.5）以上が必要になります。

# 事前準備
Oracle Linuxを使っている場合の事前準備は、[Oracle Linux Public Yum](http://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/index.html)からoracle-database-server-12cR2-preinstall-1.0-2.el7.x86_64.rpmをダウンロードして利用する方法が最も簡単です。
Red Hat Enterprise Linux の場合はインストール・ガイドからインストール要件を確認して設定を行います。
必要なパッケージ等の要件は、Oracle Database 18c とほとんど変化がありません。

# インストール
インストール方法は以前のバージョンと変わっていません。ただし、Oracle Database 18cからインストール専用メディアは提供されず、Oracle Home ディレクトリにzipファイルを展開するだけになっています。

```
$ export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
$ mkdir -p $ORACLE_HOME
$ cd $ORACLE_HOME
$ unzip ~/LINUX.X64_193000_db_home.zip
```

展開が終わったらGUI環境でインストーラーを起動します。

```
$ cd $ORACLE_HOME
$ ./runInstaller
```
インストール後にDBCAを実行するかを設定します。

![Screenshot from 2019-04-26 12-42-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/9e5dc5e1-4287-d67a-ff9c-9c0216fda38f.png)

次の画面は、シングル環境かReal Application Clusters環境かを指定します。次はエディションの指定です。Standard Edition 2 (SE2) または Enterprise Edition を選択します。

![Screenshot from 2019-04-26 12-42-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/54d2f55d-b5a9-5c41-5dab-ae6c6d52b20c.png)

次にインストール先（ORACLE_BASE)、インベントリの保存先を指定する画面を経て、管理グループを指定する画面が表示されます。

![Screenshot from 2019-04-26 12-44-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/96e2d36e-482e-c702-80fc-af61191fce37.png)

次の画面は事前チェックの画面です。画面はわざと古いバージョンのLinuxで検証しているため、パッケージが古い警告が表示されています。またスワップ・ファイルの警告も表示されています。

![Screenshot from 2019-04-26 12-44-57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/fcdd5069-8d98-88d7-e4dd-ec01799ca5a6.png)

最後に確認画面とrootユーザーでスクリプトを実行することを促す画面が表示されてインストールは完了します。

# データベースの作成
データベースの作成も従来とかわらずDBCAを使います。

![Screenshot from 2019-04-26 12-56-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/139dc8c1-de40-c493-d98f-5f7108095497.png)

DBCAの画面はOracle Database 18cとほぼ変わりません。下記は、データベースが利用するオプションを指定する画面です。

![Screenshot from 2019-04-26 13-01-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/181284/2047c0af-320a-0a84-9ec8-2b09415d3a1d.png)
テストで適当なドメインを入力するのはマナー違反

# ついやってしまいがちなマナー違反

入力画面などのテストを実施するときに、適当なドメインのメールアドレスを入力していませんか？
実はそれマナー違反なんです。

# 全部実在しますよ！（一例）

適当なドメインとか言っちゃってごめんなさい。

* aaa.co.jp
* xxx.co.jp
* yyy.co.jp
* zzzz.co.jp
* test.co.jp

テスト用の登録完了メールが他所の会社さんへ飛んでしまうのは大問題です。マナー違反で済むレベルじゃなかった。

# じゃあどうすればいいのさ

例示用に予約されているドメインを使用しましょう。これらは誰かの持ち物というわけでもないので、テスト用に使用しても問題ありません。

## JPドメイン

example.jpなどのドメインが予約済みとなっています。

> [JPドメイン名の活用について](https://jprs.jp/faq/use/)
>
> Q. 例示に使用可能なドメイン名はありませんか？
> A. 次の文字列のJPドメイン名は、例示としてご利用いただけます。
>
> "EXAMPLE"を用いたもの 
> 例： EXAMPLE.JP
> 　　 EXAMPLE.CO.JP
> 　　 EXAMPLE.NE.JP
>
> "EXAMPLE"の後に1桁の数字（""0""から""9""）がつく文字列を用いたもの
> 例： EXAMPLE1.JP
> 　　 EXAMPLE2.CO.JP
> 　　 EXAMPLE3.NE.JP
>
> 次の日本語ドメイン名
>
> ドメイン名例.JP （日本語JPドメイン名）
> XN--ECKWD4C7CU47R2WF.JP （「ドメイン名例.JP」のpunycode表記）

## gTLD

example.com とかもRFC 2606で例示用として予約されていますので、こちらも問題ありません。

> [RFC 2606: 最上位 DNS 名の予約 (Reserved Top Level DNS Names)](http://suika.fam.cx/rfc/ja-translations/rfc2606-ja.html)
>
> 3 . 予約例示第二位ドメイン名
>
> Internet 割当番号事務局 (IANA) は現在次の第二位ドメイン名も例示に使えるように予約しています。
>
> example.com
> example.net
> example.org

# 入力例を示す場合も注意

画面サンプルや利用者向けマニュアルなどからメールが飛んでしまうことはありませんが、ちょっと格好悪いです。やはり例示用に予約されているドメインを記載すべきでしょう。

# まとめ

いかがでしたか？
Chrome Developer ToolでHTMLをドラッグアンドドロップで動かせた

タイトル通りです。できると思ってなかったけどやってみたら出来たので。
ちょっとリストの上下変えて見てみたいんだよなとかの時に便利そうです。

![画面収録-2019-04-26-17.59.35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/04d0914e-67ff-2776-24b2-38030345eea1.gif)
パブリッククラウドのストレージってどうなってるの？

少し仕事で話題に出たので調べてみました

### パブリッククラウドにはいろいろな種類のストレージがある
・オブジェクトストレージ
Amazon S3、Azure BlobStrage、Google Cloud Strage がこれに当たる
データへのアクセスはREST API

メリット；容量の拡張性に優れており無停止で拡張可能
　　　　　同じデータを複数のストレージに分散して記録するため、RAIDなどの高可用性技術を準備しなくても良い
デメリット：データの部分的な読み書きができないため、頻繁なデータ更新や高速I/Oのトランザクションには適さない


・ファイルストレージ
Amazon EFS、Azure Files,Azure NetApp Files、Google Cloud Filestore　がこれに当たる
接続方式はCIFSやNFS

メリット：フォルダを分けて階層構造でデータを保存
　　　　　ファイルアクセスや検索が得意
デメリット：システムの処理能力が限られているため、一定の容量を超えるとパフォーマンスが低下する

・ブロックストレージ
Amazon EBS、Azure Block Blob、Google Persistent Disk がこれに当たる
接続方式はFCやiSCSI

メリット：データをブロック単位で分けて保存する方式
　　　　　データの特敵が容易なため比較的アクセス頻度が高いDBなどに向いている
デメリット：データ毎に属性情報の保持や共有ができないため、非構造化データの管理には不向き
　　　　　　コストが高い


### NVMe接続って
NVMe (Non-Volatile Memory Express) は、ストレージ インターフェイスの標準規格。
コマンド発行回数が少なくキュー数が多いため、IO の並列処理性能が大幅に向上し、低レイテンシーの優れたパフォーマンスが実現されるほか、使用する CPU サイクルが少なくなるメリットもあります。([参照](https://tintri.co.jp/blog/blog-2017-03-nvme/))


### パブリッククラウドでも使えるの？
AWS、Azure、GCPすべてローカルディスクとして利用可能
とはいえお高いので用法・用量を守って正しくお使いください
ホストOSにインストールされていないコマンドを、Dockerコンテナ経由で使う

# TL;DR

* OSにインストールされていないコマンドを使いたい
* ホストOSにインストールして環境を変えてしまうのは避けたい
* Dockerが使えるなら、コンテナをコマンドとして使ってもいいのでは


# 動機

TL;DRのまま。

ホストOSに入っていないコマンドを使いたかったのだけれど、ホストOSにコマンドをインストールして環境を変更するということは避けたかった。

Dockerは使ってもOKという状況下。


# `docker container run -i --rm`を使う

で、これをうまいことするには、Dockerコンテナを使ってコマンドを実行してあげればいいのでは、と。

`docker container run`のオプションで、`-i`と`--rm`を使えばよいでしょう。

オプションの意味は、以下のとおり。

* `-i`（`--interactive`） … 標準入力を受け取る
* `--rm` … 終了時にコンテナを削除する

[docker container run](https://docs.docker.com/engine/reference/commandline/container_run/)

例えば、こんな感じで使います。

Ubuntu Linux 18.04に含まれているPerlを使う。

```shell
$ echo 'Hi! my name is taro' | docker container run -i --rm ubuntu:18.04 perl -wp -e 's/taro/jiro/'
Hi! my name is jiro
```

終了時にはコンテナも削除されるので、後始末も気にする必要はありません。

初回は、Dockerイメージをpullする時間はかかりますけどね。

他の例。MeCabを使ってみるなど。

```shell
$ echo 'すもももももももものうち' | docker container run -i --rm kimtaro/mecab mecab
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```

覚えておくと、小ネタとして使えるかもしれません。

よく使うコマンドなどあれば、`alias`として登録してみるなどありかもでしょうね。
Windows Subsystem for Linux (WSL) にAzure CLIとkubectl を入れる

# 概要
- AzureでKubernetesを動かす準備をする
- WindowsのPCにWindows Subsystem for Linux(WSL)にUbuntu 18.04 を入れる
- UbuntuにAzure CLIとkubectlを入れ、azコマンドでkubectlを使えるようにする

# 参考書籍
- [しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識
](https://www.shoeisha.co.jp/book/detail/9784798157849) 阿佐志保 著
    - 2.2 開発環境の準備


# Windows Subsystem for Linux(WSL)にUbuntu 18.04 を入れる

- 「Windowsの機能の有効化または無効化」で、「Windows Subsystem for Linux」を有効化(PCの再起動が必要)
- 「Microsoft Store」(アプリ)を起動
- 検索ボックスで「ubuntu 18.04」を検索して入れる
- スタートメニューから起動
- Ctrl + Shift + Cでコピペできるように、プロパティで「Ctrl+Shift+C/Vをコピー/貼り付けとして使用する」にチェックを入れる
- アップデートとか
    - ```sudo apt update```
    - ```sudo apt dist-upgrade```
    - ```sudo apt autoremove```

# Azure CLI のインストール

「[apt での Azure CLI のインストール](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-apt?view=azure-cli-latest)」を見ながら、インストールする


- 必要なパッケージを取得
 
```
sudo apt-get update
sudo apt-get install curl apt-transport-https lsb-release gpg
```

- Microsoft の署名キーをダウンロードしてインストール

```
curl -sL https://packages.microsoft.com/keys/microsoft.asc | \
    gpg --dearmor | \
    sudo tee /etc/apt/trusted.gpg.d/microsoft.asc.gpg > /dev/null
```
- Azure CLI ソフトウェア リポジトリを追加

```
AZ_REPO=$(lsb_release -cs)

echo "deb [arch=amd64] https://packages.microsoft.com/repos/azure-cli/ $AZ_REPO main" | \
    sudo tee /etc/apt/sources.list.d/azure-cli.list
```

- リポジトリ情報を更新し、azure-cli パッケージをインストール

```
sudo apt-get update
sudo apt-get install -y build-essential libssl-dev libffi-dev python-dev
sudo apt-get install azure-cli
```
(なぜか「Unpacking azure-cli (2.0.63-1~bionic) ...」で30分待ってもディスクアクセスしっぱなしだったので、途中で止めて```build-essential libssl-dev libffi-dev python-dev```を入れました)

参考：[Installation of azure-cli 'hangs' on unpacking #2775](https://github.com/Microsoft/WSL/issues/2775)


# Azure へのログイン

```
az login
```
ブラウザが開くので、ログインします。

# Azure CLIの初期設定

- az configure で、出力形式を「3: table」にしておく。
- リソースプロバイダを有効にする
    - ```az provider register -n Microsoft.Network```
    - ```az provider register -n Microsoft.Storage```
    - ```az provider register -n Microsoft.Compute```
    - ```az provider register -n Microsoft.ContainerService```

# kubectl のインストール

```
sudo apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo touch /etc/apt/sources.list.d/kubernetes.list
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
```

```kubectl version``` でバージョン確認。

# azコマンドでkubectlを使えるようにする
```
sudo az aks install-cli
```
material icon で outlined のアイコンを使用する方法

## これは何
フォントとして読み込んで便利なアイコンとして使えるMaterial Iconについての小ネタ。
公式： https://material.io/tools/icons/?style=baseline

名称を指定したときにデフォルトだとFilledのアイコンが使われるが、どうやったらoutlineｄのアイコンが使えるかというのを調べたことを書いておきます。

## 基本的な使い方
みためこんな感じのアイコン。`book`を使います。画像はデフォルトのfilledのもの。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/3ef8c17b-5430-b16a-ab74-d9e61b7176b9.png)

フォントとして読み込みます。

```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
```

classに 指定します。

```html
<i class="material-icons">book</i>
```


## outlined のアイコンの使い方
みためこんな感じになるやつ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144064/33453ea6-58da-a696-dddd-b166ba60c027.png)

公式ページからSVGとしてダウンロードして使ってもいいのですが、面倒なのでFilledと同じ方法で使えないのか？と思って調べてみたら、簡単な方法がありました。

以下のように`Material+Icons+Outlined`も読み込みます。

```html
<link href="https://fonts.googleapis.com/icon?family=Material+Icons%7CMaterial+Icons+Outlined" rel="stylesheet">
```

クラス名も -outlined をつけます。

```html
<i class="material-icons-outlined">book</i>
```

## もっと簡単な方法で使える方法？
error とか、よくある16個の図形は、フォントとして追加で読み込まないでクラス名もそのままで使えるとか。ただし、error_outline のようにアンダーバーで名前を変える。

```html

<i class="material-icons">error_outline</i> 
```

参考: https://stackoverflow.com/questions/50303454/how-to-use-the-new-material-design-icon-themes-outlined-rounded-two-tone-and
Unityプロジェクトのフォルダ階層を簡単に準備できる機能

#動機
プロジェクトによってフォルダ構成は基本的に決まっていると思います。毎度作り直す手間を惜しんで拡張機能を作ってみました。
また１つのプロジェクトに複数のゲームを含める企画などにも使えるかもしれません（そっちが本来の用途でした）。
今回のフォルダ構成は[Unityフォルダ構成のルールについて](https://qiita.com/takish/items/8608ba9070755da3ae6d)を参考にしました。

#実装
```C#
using System.IO;
using UnityEngine;
using UnityEditor;

public static class CreateProjectFolder
{
    // フォルダー名の一覧
    private static readonly string[] folders = new string[]
    {
            "Scenes",
            "Prefabs",
            "Scripts",
            "Animations",
            "Materials",
            "PhysicsMaterials",
            "Fonts",
            "Textures",
            "Audios",
            "Resources",
            "Editor",
            "Plugins",
    };

    [MenuItem("Tools/Create Project Folder")]
    private static void Excute()
    {
        // 作成先となるフォルダーのパスを取得
        var target = EditorUtility.OpenFolderPanel("Select Project Folder", Application.dataPath, "Project");

        // プロジェクト以下にフォルダを作成
        foreach (var folder in folders)
        {
            var path = target + "/" + folder;
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
        }

        // エディターの更新
        AssetDatabase.Refresh();
    }
}
```
Linux Docker コンテナに New Relic .NET Coreエージェントをインストールする方法

公式ドキュメントに記載されていますが、まず.NET CoreおよびDockerコンテナ利用時の前提条件を確認しましょう。

[.NET Coreエージェントの互換性と要件](https://docs.newrelic.co.jp/docs/agents/net-agent/installation/compatibility-requirements-net-core-agent)
[Install on Docker container](https://docs.newrelic.co.jp/docs/agents/net-agent/installation/install-docker-container)

主だった条件としては次のものがあります。

- .NET Core 2.0以降。ただし、[tiered complication](https://devblogs.microsoft.com/dotnet/tiered-compilation-preview-in-net-core-2-1/)は無効化されます。
- ASP.NET CoreでKestrelで動かす必要があります。Kestrelでない場合は[カスタムインストゥルメンテーション](https://docs.newrelic.co.jp/docs/agents/net-agent/custom-instrumentation/introduction-net-custom-instrumentation)を行う必要がありますが、こちらは別の記事にしたいと思います。
- エージェントはアプリと同じコンテナにインストール必要があります
- 必須の環境変数を設定する必要があります。この例ではDockerfileに全て指定していますが、起動時でも構いません。
- エージェントのファイルは.NET Coreプロセスからアクセスできる必要があります
- ブラウザモニタリングは自動では有効化されません。こちらも別の記事で説明します。
- (上のドキュメントにはないですが）.NET Core Profile APIを利用しているため、Profile APIを使う他のソフトウェアを同時に使うことはできません。Profile APIを使うものは、例えばスナップショットデバッガーがあります。

エージェントは [https://download.newrelic.com/dot_net_agent/latest_release/](https://download.newrelic.com/dot_net_agent/latest_release/) からディストリに適したインストーラー形式を選び、インストールします。Microsoftが提供しているASP.NET Coreのコンテナにインストールする場合のDockerfileは次のようになります。

```Dockerfile:Dockerfile
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2 AS base
ENV CORECLR_ENABLE_PROFILING=1 \
CORECLR_PROFILER={36032161-FFC0-4B61-B559-F6C5D41BAE5A} \
CORECLR_NEWRELIC_HOME=/usr/local/newrelic-netcore20-agent \
CORECLR_PROFILER_PATH=/usr/local/newrelic-netcore20-agent/libNewRelicProfiler.so \
NEW_RELIC_LICENSE_KEY=<New Relicライセンスキー> \
NEW_RELIC_APP_NAME=<アプリの名前>
ARG NewRelic=./newrelic
COPY $NewRelic ./newrelic

RUN dpkg -i ./newrelic/newrelic-netcore20-agent*.deb
COPY newrelic.config /usr/local/newrelic-netcore20-agent/

WORKDIR /app
EXPOSE ８０

FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS publish
WORKDIR /src
COPY . .
RUN dotnet publish <csprojファイルのパス> -c Release -o /app

FROM base As final
WORKDIR /app
COPY --from=publish /app /app
ENTRYPOINT [ "dotnet", "<publishしたdllのファイル名>" ]
```

ディストリはDebianベースなので`*.deb`のインストーラーをDockerfileのあるディレクトリの`.newrelic`ディレクトリに配置しています。Dockerのビルドの制約上、Dockerfileおよびそれ以下のディレクトリと別の場所にあるファイルはCOPYできないので注意してください。`newrelic.config`を編集したい場合はインストールした後に生成されるデフォルトのconfifgを上書きして対応します。この場合、このDockerイメージ内全体に適用されます。例えば、ログレベルと出力先を変更したい場合は以下のように変更したnewrelic.configを用意します。コンソールに出力することで、`docker logs`コマンドで確認できるようになります。

```xml:newrelic.config
<configuration xmlns="urn:newrelic-config" agentEnabled="true">
    <log level="debug" console="true"/>
<!--以下略-->
```

Dockerfile内のポート開放や`dotnet publish`などは適宜書き換えてください。これで、`docker build`して実行すれば監視されるはずです。New Relic上にメトリクスが表示されない場合はログを確認してみましょう。
Clipkitで記事の祖先カテゴリー名を取得する

通常の``` {{ article.category.name }} ```では記事が直接属するカテゴリー名しか取得できませんが、そのカテゴリーに祖先カテゴリーがある場合、以下の記述で祖先カテゴリー名を取得することができます。

#記述方法
第1階層カテゴリー名
```{{ article.category.ancestors[0].name }}```

第2階層カテゴリー名
```{{ article.category.ancestors[1].name }}```

第3階層カテゴリー名
```{{ article.category.ancestors[2].name }}```

上記のように```[]```内の数字によって取得できるカテゴリーの階層が変化します。

#例：記事詳細ページ内で記事が属しているカテゴリー名をすべて表示する
日本 > 東京 > 新宿 と階層化しているカテゴリーの「新宿」に記事が属している場合

```sample_01.html
<ul class="categories">
  <li>{{ article.category.ancestors[0].name }}</li> <!-- 第1階層カテゴリー名 -->
  <li>{{ article.category.ancestors[1].name }}</li> <!-- 第2階層カテゴリー名 -->
  <li>{{ article.category.name }}</li>              <!-- 記事が直接属するカテゴリー名 -->
</ul>
```
上記の記述の出力結果は以下になります。

```sample_02.html
<ul class="categories">
  <li>日本</li> <!-- 第1階層カテゴリー名 -->
  <li>東京</li> <!-- 第2階層カテゴリー名 -->
  <li>新宿</li> <!-- 記事が直接属するカテゴリー名 -->
</ul>
```
ただし、```{{ article.category.ancestors[x].name }}```では、記事が直接属するカテゴリー名の取得はできないので注意してください。

あくまで「記事が直接属するカテゴリー」の「祖先カテゴリー」の取得なので、記事が直接属するカテゴリー名を取得する場合は```{{ article.category.name }}```を使用してください。

また、今回は名称を例に説明しましたが、他にも
```{{ article.category.ancestors[x].url }}```などで使用できます。
恥ずかしがり屋の国土数値情報サイトの更新をRSSで取得できるようにしてみた

:::note warn
この記事で用いているfeed43というRSSサービスは2023年初頭にサービス終了してしまいました、また、国土数値情報のページもUpdateされました。ですので改訂版の記事をいずれ書きますm(_ _)m
:::

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/afaa676c-8ff0-df9c-2d40-45ebb78f7ecd.png" width=75%>


### はじめに
ニッチな雑Tipsです、すみませんすみません。

さて、公開に差し支えない(原文ママ)様々な行政系GISデータを発信してくれている[国土数値情報ダウンロードサービス](http://nlftp.mlit.go.jp/ksj/)という国土交通省さんのサイトがあります。

15年くらい使っていまして、いつも助かっています。中の人いつもありがとうございます。

しかし、このサイトは伝統的体裁で恥ずかしがり屋なのかいつもひっそりと更新されており、「新着情報」フレームで更新情報が出ているだけなので、半年ぐらいたってから「[えええっ！こんなGISデータ公開されてたっていうのかい！？](https://www.google.com/search?biw=1427&bih=766&tbm=isch&sa=1&ei=M7nCXMCFHbzFmAXjgZ_oDw&q=%E3%83%9E%E3%82%B9%E3%82%AA+%E3%81%88%E3%81%88%E3%83%BC&oq=%E3%83%9E%E3%82%B9%E3%82%AA+%E3%81%88%E3%81%88&gs_l=img.1.1.35i39j0l3j0i24l2.2073.2196..4223...0.0..0.89.175.2......1....1..gws-wiz-img.wadfd071t3o)」なんてことも何回もありました。

こんなことを防ぐためにRSSフィードとかあればいいのにと思ったのですが、いまだないようなのでさっきこさえました。

### こんなかたにこの記事はおすすめします
- 国土数値情報のデータをけっこうよく使う
- 国土数値情報の更新を誰よりもいち早く知りたい
- いつも[何かに追われている](https://www.google.com/search?biw=1427&bih=766&tbm=isch&sa=1&ei=OLnCXNipJNKKr7wPj5eqyAw&q=%E3%81%B9%E3%81%A8%E3%81%B9%E3%81%A8%E3%81%95%E3%82%93&oq=%E3%81%B9%E3%81%A8%E3%81%B9%E3%81%A8%E3%81%95%E3%82%93&gs_l=img.3..0l10.1073203.1074604..1074939...0.0..0.103.1118.11j1......1....1..gws-wiz-img.......0i4.k9YXC-6EggQ)気がする
 
### こんなかたにこの記事はおすすめしません
- 投影法定義ファイルが入ってなくて心が折れる
- データのライセンスをひとつひとつ確かめるのが腰に来る
- 大量のDLリンククリックしすぎて腱鞘炎になった

### 成果
FEED URLはこちらです
```https://feed43.com/1233452574744525.xml```
※フリーのサービスなので６時間ごとのチェックになります
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100567/b0364bc6-0f8e-6466-dd4e-83104a81b6f8.png" width=75%>
feedlyでの表示例



### 使い方
- RSSリーダーを使っている方は上記のxmlアドレスをリーダーに投入してください
- Slackをお使いの方は[このやり方](https://get.slack.help/hc/ja/articles/218688467-Slack-%E3%81%AB-RSS-%E3%83%95%E3%82%A3%E3%83%BC%E3%83%89%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)を参考にして特定のチャンネルや自分宛てに自動でメンションが来るようにするのもありです（わたしはそうやっています）

### 作り方
ちょっとなつかしいかんじのHTMLソースをたどっていくと、[新着情報だけを更新しているページ](http://nlftp.mlit.go.jp/ksj/info.html)がありまして、[このサイト](
http://hikaruryugaku.hatenablog.com/entry/2018/08/06/103200)を参照に[Feed43](https://feed43.com/)というサービスでRSSを作成しました。
なんも工夫してません、すみません

### おわりに
新着情報を眺めていると

>2019/03/01 アンケート画面について、1度回答すると2回目以降はスキップされるように改修しました。

という素晴らしい改修情報があったのでおぉ！と思ったのですが、続きがありまして

>なお、回答から1日が過ぎると再びアンケート画面が表示されます。

とのことでした、ええまあはい。
マネーフォワードの勤怠管理を一括で入力するブックマークレット

※ 使用は自己責任でお願いします。

例えば平日の10:00-19:00に出勤した場合に使えます。

## デモ

![out.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186574/567fd5d2-058c-bed1-670e-f3c50087608d.gif)

## 使い方

以下のコードをブックマークレットとして登録し、 [勤怠管理ページ](https://payroll.moneyforward.com/my/multiple_timesheet_employee_daily_records/edit) で実行すれば使用可能です。

```javascript:bookmarklet
javascript: $('#js-multiple-timesheet-employee-daily-records-table tbody tr').each(function(i, el) {
  if (!$(el).text().match('休日')) {
    $(el).find('.pa-btn-dec-add').trigger('click');
    $('#js-multiple-timesheet-employee-daily-records-table tbody tr .box-attendance-time .input-times').each(function(i, el) {
      if (i % 2 == 0) {
        $(el).val('10:00');
      } else {
        $(el).val('19:00');
      }
    });
  }
});
console.log('done');
```
kustomizeのconfigMapGeneratorでファイルを設置する

## 背景

公式のサンプル（[Real World Example: Configuring Redis using a ConfigMap](https://kubernetes.io/docs/tutorials/configuration/configure-redis-using-configmap/)）通りに進めた。

ただ、この例だと `kustomization.yaml` と同じ階層にRedisの設定ファイルを置く必要があって、
やりたいことと違った。

`./redis/config/redis.conf` とか、好きなところに置きたい。

## 結論

[define-the-key-to-use-when-generating-a-configmap-from-a-file](https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#define-the-key-to-use-when-generating-a-configmap-from-a-file) に書いてあるとおりっぽい。

### kustomization.yaml
```
resources:
- redis-pod.yaml
configMapGenerator:
- name: example-redis-config
  files:
  - redis-config=<<好きなところ>>
```

## その他はまったこと

- Replication ControllerのPodでmountしてたらエラーになった（ReplicaSetを使ったら直った）
挫折しないためのプログラム記録[初学者]

# 挫折してしまった理由
勉強言語：python,html,css
pythonを始めたが、スクレイピングで行き詰まり、htmlへ
ドットインストールを使用して、学び始める
動画は良かったのだが、この頃から私自身が完全に迷走

自分が何をしたいのか、がよくわからなくなってきた

# 目的は
プログラムを本業にしたかった
理由あって、現在の仕事を放り出すわけにはゆかない
まずは趣味＆副業から、と思ったのがまずかったのだろう
モチベーションが下がったら、下がりっぱなしになってしまった
作りたいものを決める必要がある

# 何を作る？
HPを作る

# 始めよう！
作りたいものが決まったので<a href="https://prog-8.com/">progate</a>で勉強を開始する
Qiitaは勉強の記録とし、最低、週に１度は投稿する

# 自己紹介
２０代のころにC言語をかじり、VisualBasicでほんの少しだけ仕事
結局、その後は別のことを
２０年ぶりに好きなことをしたくて、もう一度、プログラムの門を叩きました
始めるのも自分、逃げるのも自分、誰にも遠慮しなくていいから、好きなことをする！の気持ちで学習を続けたく思っています
「システムプログラムの問題が見つかりました」を消す方法

# 実行環境
ubuntu 16.04 LTS

# 起こったこと
「システムプログラムが発生しました」というダイアログが出るようになった。
#起こるまで

ubunutuをクリーンインストールして、

```
$ sudo apt update
```
したら、Promlem executing scriptsエラーが出てupdateできなかったので、[ここ](https://sekisuiseien.com/computer/10530/)を参考に、以下を実行して解決した。

```
cd /tmp && mkdir asfix
cd asfix
wget https://launchpad.net/ubuntu/+archive/primary/+files/appstream_0.9.4-1ubuntu1_amd64.deb
wget https://launchpad.net/ubuntu/+archive/primary/+files/libappstream3_0.9.4-1ubuntu1_amd64.deb
# .debパッケージをインストール
sudo dpkg -i *.deb
```
するとダイアログが出るようになった。ちなみにappstreamは、以下を参照。
https://kledgeb.blogspot.com/2016/05/ubuntu-1604-58-appstream.html
「AppStream」は「Ubuntu/GNOMEソフトウェア」の基盤となるソフトウェア。ubuntu gnomeはグラフィカルシェル(デスクトップの上側にタスクバーがあり、左端にアクティビティ、中央に時計とカレンダー、右端に通知メニューとチャットメニューが表示されるなどの画面のレイアウト的な話かな多分)
参照：https://ja.wikipedia.org/wiki/GNOME_Shell

ちなみにこれでapt updateはできるようになった。

# 解決方法
話が逸れたが、今回はダイアログを消す方法について。
/var/crash内のファイルを消す必要があるらしい。
https://qiita.com/naoyukisugi/items/d0a30f1e7b9761fdf3e9
コマンドラインで以下を実行。

```
$ sudo rm /var/crash/*
```
自分の場合、/var/crash内に
_usr_bin_appstreamcli.0.crash
というファイルがあった。

# 追記
以下に参考にした記事を載せる。
http://grainrigi.hatenablog.com/entry/2017/08/26/232405
https://www.hiroom2.com/2016/05/20/ubuntu-16-04のapt-updateでappstreamcliが固まる/

下の記事から引用：
2016年5月20日現在、apt updateで処理が進まなくなる問題が発生しています。
この問題は「ソフトウェアの更新」からは発生しないようです。
appstream 0.9.4-1パッケージに問題があるようです。
Ubuntu 16.04でも修正版がリリースされました。
問題はパッケージが修正されてもapt updateで固まってインストールできない点です。
ここでは修正されたappstreamをインストールする手順を記載します。

バグありのappstreamが初期でインストールされるubuntuがあるらしい。それだとapt updateすると引っかかる。
調べたところ、一度updateできれば、そのあとはエラーが起こることはないという。
上の記事より、appstreamcliを無効にしてから、apt updateし、続いてappstreamを有効化してもう一度apt updateすればうまくいくらしい。

```terminal
# appstreamを無効化
$ sudo killall -KILL apt.systemd.daily
$ sudo mv /etc/apt/apt.conf.d/50appstream /etc/apt/apt.conf.d/50appstream.disable
# apt update/upgradeを実行
$ sudo apt update -y
$ sudo apt upgrade -y
# appstreamを有効化して再度update
$ sudo mv /etc/apt/apt.conf.d/50appstream.disable /etc/apt/apt.conf.d/50appstream
$ sudo apt update -y
```
今回は、無効化とかはしなかった。wget ~ dpkgのところでバグってないバージョンのappstream入れなおしたから、無効化しなくてもできるようになったんだと思う。一度でもapt update失敗したから、appstream関連のクラッシュファイルが/var/crash内に作られて、ダイアログが出るようになったんだと思う。
form_forからform_withってどう書き換えるの？ (同時に2つのモデルを変更する場合　例：ネスト)

#答え

```
<%= form_for([@post.group, @post], local: true, url: choose_new_or_edit) do |f| %>
↓
<%= form_with(model:[@post.group, @post], local: true, url: choose_new_or_edit) do |f| %>
```

↑**「model:」**を付ける。

#余談
「えっ！？ forの方が短くていいじゃん」

```
<%= form_for([group, post, comment], remote: true) do |form| %>
↓
<%= form_with(model:[group, post, comment]) do |form| %>
```

↑**「remote: true」**を付けなくていい。
ruby で twitter の自分のプロファイルを表示

```rb:show_my_profile.rb
#! /usr/bin/ruby
#
#	show_my_profile.rb
#
#						Apr/26/2019
# ---------------------------------------------------------------------
require 'twitter'
require 'dotenv'

# ---------------------------------------------------------------------
def show_my_profile_proc
    puts @client.user.screen_name   # アカウントID
    puts @client.user.name          # アカウント名
    puts @client.user.description   # プロフィール
    print 'ツイート	'
    puts @client.user.tweets_count
    print 'フォロー	'
    puts @client.user.friends_count
    print 'フォロワー	'
    puts @client.user.followers_count
    puts @client.user.website
end

# ---------------------------------------------------------------------
STDERR.puts	"*** 開始 ***"
#
Dotenv.load
@client = Twitter::REST::Client.new do |config|
  config.consumer_key        = ENV["CONSUMER_KEY"]
  config.consumer_secret     = ENV["CONSUMER_SECRET"]
  config.access_token        = ENV["ACCESS_TOKEN"]
  config.access_token_secret = ENV["ACCESS_TOKEN_SECRET"]
end
#
show_my_profile_proc
#
STDERR.puts	"*** 終了 ***"
# ---------------------------------------------------------------------
```

```text:.env
CONSUMER_KEY = '******'
CONSUMER_SECRET = '******'
ACCESS_TOKEN = '******'
ACCESS_TOKEN_SECRET = '******'
```

参考情報
[Class: Twitter::User](https://www.rubydoc.info/gems/twitter/Twitter/User)
AWS Cloud9でphpMyAdmin をインストールする方法


## MySQLのGUIツール「phpMyAdmin」のインストール方法

本来であれば、rootのパスワード設定や別のユーザーでセキリティ強化が必要ですが、ここでは割愛し、phpMyAdminのインストール方法のみにします。

#### 最新バージョンを確認

https://www.phpmyadmin.net/downloads/ にアクセスしてphpMyAdminの最新バージョンを確認

#### ターミナルから、下記の`wget`コマンドでダウンロード

（2019/4/26時点の最新バージョンが4.8.5でした）

```
$ sudo wget https://files.phpmyadmin.net/phpMyAdmin/4.8.5/phpMyAdmin-4.8.5-all-languages.zip
```

#### `unzip`コマンドで解凍

```
$ sudo unzip phpMyAdmin-4.8.5-all-languages.zip
```

#### `mv`コマンドでフォルダ名を`phpMyAdmin`変更する

```
$ sudo mv phpMyAdmin-4.8.5-all-languages phpMyAdmin
```

または、
`phpMyAdmin-4.8.5-all-languages`フォルダを 右クリックで`phpMyAdmin`に変更でも可能


#### 設定ファイルを有効化

### `mv`コマンドで、`config.sample.inc.php` を `config.inc.php` にファイル名変更する

```
$ sudo mv phpMyAdmin/config.sample.inc.php phpMyAdmin/config.inc.php
```

または、
phpMyAdminフォルダの `config.sample.inc.php`ファイルを 右クリック→Renameで `config.inc.php`にRenameでも可能

#### `chmod` でファイルの実行権限を変更し、編集できるようにする

```
sudo chmod 777 phpMyAdmin/config.inc.php
```

#### `config.inc.php`の`['AllowNoPassword']`を `false` → `true` に変更

MySQL側で、root のパスワードを設定していない場合は、`true`にするとphpMyAdminからでもノンパスでログインできるようになります。

![Cloud9](https://i.gyazo.com/070ed11a18d8e97613468eb9c2693a43.png)

#### `chmod` でファイルの実行権限を変更し、誰でも上書きできないようにする

```
sudo chmod 755 phpMyAdmin/config.inc.php
```

#### MySQLを起動

```
$ sudo service mysqld start
```

#### PHPのサーバーを起動 

```
$ php -S $IP:$PORT
```

RunnerをPHP（build-in web server） にしてRunボタンからでもOK

![Image from Gyazo](https://i.gyazo.com/513e9d451a719bb669fcd96bf745f154.png)

#### プレビューする

`phpMyAdmin/index.php` を 開いて、 Preview Running Application をクリック

![Image from Gyazo](https://i.gyazo.com/ee0f636c6ddd02eb0abfc02a3f57f3f0.png)

#### phpMyAdmin/index.php にアクセス (Cloud9の編集ページ内のPreviewではなく、新しいタブでPreviewを開きましょう)

https://XXXXX.vfs.cloud9.XXXXX.amazonaws.com/phpMyAdmin/index.php

＊XXXXXはリージョンやワークスペースによって変わります。

#### アクセスできたら、ログインしましょう

![Screenshot from Gyazo](https://gyazo.com/284311920f7e10c541d91989ee158a4c/raw)

#### ログイン！！

![Image from Gyazo](https://i.gyazo.com/282587d00aa8bbbebee8c6d7e9d69b0d.png)

コマンドしていたデータベース作成やテーブル作成が、GUIでクリック操作できるようになります。

詳しい使い方は、 https://www.dbonline.jp/phpmyadmin/ をご参照
error_log関数と指定したファイルにエラーログを表示する方法！

# この記事で分かること
- エラーログとは何か
- error_log関数について
- 指定したファイルにエラーログを出力する方法

※ご紹介する記事内容は`MAMP`での開発環境になります

# 開発環境
- PHP7.3.1
- MAMP
- Mac

# エラーログとは
- エラーが発生した時にエラーの内容がエラーログとして記録すること

## エラーログの役割
- 期待した通りに動作が動かないときに、エラーのログを見ることで、問題の状況や原因を推測することができる

# error_log関数の書き方

```php:index.php
bool error_log (string $message[, int $message_type = 0[, string $destination
     [, string $extra_headers ]]] )
```

## パラメーター（引数）

```
第一引数：$message - 記録するエラーメッセージを指定します
第二引数：$message_type - メッセージのタイプを指定します
第三引数：$destination - メッセージの送信先を指定します
第四引数：$extra_headers - 追加のヘッダ(メッセージタイプが1の場合のみ)を指定します
```

## メッセージタイプの種類（第二引数）


|メッセージタイプ  |詳細  |
|:-:|:-:|
|0|php.iniファイルの「error_log =」で指定したファイルに出力する。|
|1|第3引数で指定したメールアドレスにメールが送信されます。 |
|2|※このオプションは使用不可  |
|3|第3引数で指定したファイル名にエラーメッセージが追加されます。また、エラーメッセージの最後に改行が追加されません。 |
|4|エラーメッセージをSAPIログ出力ハンドラに送信します。 |

## error_log関数のコード例

```php:index.php
 error_log("[".date('Y-m-d H:i:s')."]"."入力エラー", 0);
```

## 出力結果
```php:php_error.log
[2019-04-26 06:41:05]入力エラー
```
### 解説
- メッセージタイプが「0」の場合`php.ini`で指定したファイルに出力されます。

```php:php.ini
error_log = /Applications/MAMP/logs/php_error.log
```
### 【補足】php.iniファイルの場所を確認する方法
- MAMPでphp.iniファイルの場所を確認する方法について書きます。

#### 1.MAMPを開いて、「Open WebStart page」をクリックする
<img width="526" alt="MAMP01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/d9d19893-14c4-8311-d00a-37303d14aae3.png">

#### 2.「TOOLS」、「PHPINFO」をクリックする
![MAMP02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/d633e89b-19a7-6013-1a56-1abb9d1470b4.png)


#### 3.phpinfoが表示され、php.iniファイルの場所が確認できます
![MAMP03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392565/eb7bc523-8d86-a972-59d7-21658189f2c8.png)


# 指定したファイルにエラーログを出力する方法

※`/Applications/MAMP/htdocs/src/log/log.txt`ファイルにエラーログを出力する場合を想定します。


## コード例

```php:index.php
error_log("[".date('Y-m-d H:i:s')."]"."入力エラー" . "\n", 3, "/Applications/MAMP/htdocs/src/log/log.txt");
```

## 出力結果
```php:log.txt
[2019-04-26 06:41:05]入力エラー
```

### 解説
- メッセージタイプが「3」の場合、第3引数で指定したファイル名にエラーメッセージが追加されます。

- 改行がされないので、改行コードを指定する必要があります。
Install  Ubuntu 18.04 LTS on VM VirtualBox into Macbook Pro

# Hardware
MacBook Pro 2018, OSX Mojave 10.14.4

# VM VirtualBox
Download version 6.0.6
https://www.oracle.com/technetwork/server-storage/virtualbox/downloads/index.html?ssSourceSiteId=otnjp
Install VM VirtualBox

# Ubuntu 18.04 LTS
Download version 18.04.2
https://www.ubuntu.com/download/desktop

# Install Ubuntu on VM VirtualBox
Select 'New' →　Chose Linux on type and Ubuntu (64-bit) on version, then go to next
Assign 4096MB for memory size, then go to next
Assign 32GB for virtual hard disk
Assign ISO image file and start Ubuntu installation

# Optimization of Ubuntu
1) Optimization of screen size and resolutions to insert Gust Additions CD
2) Change font size in the Universal access application
3) Share clip board with host OS and guest OS by the setting in VirtualBox
4) Set share folder with host OS

# Update Ubuntu
1) Sudo apt-get update
2) Sudo apt-get upgrade
3) Sudo apt-get install emacs
Craft CMS で任意のステータスのエントリを取得する

Craft CMS のエントリは4つのステータスを持っている。

<img width="474" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3936/0337e04b-0c27-20a6-838b-c40932fdb78e.png">

それぞれの状態は、一覧ページのタイトル左側に表示されるアイコンの色で判別できる。

| アイコンの色 | ステータス値 | エントリの状態 |
|------------|----------|--------------|
| 緑         | live     | 公開中の有効なエントリ（デフォルト値） |
| オレンジ    | pending  | 公開待ちのエントリ（予約投稿など） |
| 赤         | expired  | 有効期限切れになったエントリ |
| 白         | disabled | 無効なエントリ（下書きなど） |

このステータス値を利用して、エントリを絞り込むことができる。
一般的には `有効なエントリのみ` で事足りるが、フロントエンドでカスタムデザインの管理画面を用意するといったケースで利用することになる。

## 公開待ちのエントリを取得

```twig
{% set entries = craft.entries.status('pending').all() %}
```

## 有効、または、公開待ちのエントリを取得

```twig
{% set entries = craft.entries.status(['live', 'pending']).all() %}
```

引数を配列にすることで、いずれかの条件にあてはまるものを取得対象にできる。
ruby で twitter のタイムラインを取得する

ライブラリーのインストール

```bash
gem install twitter
gem install dotenv
```

```rb:et_timeline.rb
#! /usr/bin/ruby
#
#	get_timeline.rb
#
#						Apr/26/2019
# ---------------------------------------------------------------------
require 'twitter'
require 'dotenv'

# ---------------------------------------------------------------------
def get_timeline_proc
  @client.home_timeline.each do |tweet|
    puts "\e[33m" + tweet.user.name + "\e[32m" + "[ID:" + tweet.user.screen_name + "]"
    puts "\e[0m" + tweet.text
  end
end

# ---------------------------------------------------------------------
STDERR.puts	"*** 開始 ***"
#
Dotenv.load
@client = Twitter::REST::Client.new do |config|
  config.consumer_key        = ENV["CONSUMER_KEY"]
  config.consumer_secret     = ENV["CONSUMER_SECRET"]
  config.access_token        = ENV["ACCESS_TOKEN"]
  config.access_token_secret = ENV["ACCESS_TOKEN_SECRET"]
end
#
get_timeline_proc
#
STDERR.puts	"*** 終了 ***"
# ---------------------------------------------------------------------
```

```text:.env
CONSUMER_KEY = '******'
CONSUMER_SECRET = '******'
ACCESS_TOKEN = '******'
ACCESS_TOKEN_SECRET = '******'
```

参考情報
[The Twitter Ruby Gem](https://www.rubydoc.info/gems/twitter)

>Fetch the timeline of Tweets from the authenticated user's home page

>client.home_timeline
Serverless FrameworkプラグインのServerless-DynamoDB-localが作動しないとき

# 更新
この問題修正されました。
(2019/10/xx)

# 環境

- Windows10
- Serverless Framework 1.41.0
- serverless-dynamodb-local 0.2.37

# Dynamoをスタートできない
serverless-dynamodb-localがちゃんとインストールされていれば通常は以下のコマンドで動くはず……

```bash
sls dynamodb start
```
DynamoDB-localのポート設定が8000番の場合、以下のコマンドで表示されるはず

```bash
netstat -ano | find "8000"
```

しかし何も表示されず……ブラウザからシェルも開けない。

# ダウングレードする

検索すると、ダウングレードしたら動いたという報告がありました。
自分の場合は変化なしでしたが、一応紹介しておきます。

```
	yarn remove serverless-dynamodb-local
	yarn add serverless-dynamodb-local@0.2.35
	sls dynamodb install
```


# それでも動かない場合
`node_modules`に保存されたserverless-dynamodb-localの`starter.js`のコードを書き換えます。

場所は通常以下の場所にあります
`~\node_modules\dynamodb-localhost\dynamodb\starter.js`




■変更前(38行目辺り)

```javascript
        var child = spawn('java', args, {
            cwd: db_dir,
            env: process.env,
            stdio: ['pipe', 'pipe', process.stderr]
        });
```

■変更後

```javascript
        var child = spawn('java', args, {
        	shell: true,
            cwd: db_dir,
            env: process.env,
            stdio: ['pipe', 'pipe', process.stderr]
        });
```


# 参考
[ECONNREFUSED for sls dynamodb start](https://github.com/99xt/serverless-dynamodb-local/issues/194)
WindowsにAzure CLIを入れる

# 概要
以下の本を見ながら、AzureでKubernetesを動かすための準備をする。
- [しくみがわかるKubernetes Azureで動かしながら学ぶコンセプトと実践知識
](https://www.shoeisha.co.jp/book/detail/9784798157849) 阿佐志保 著

# 結論
- 上記の本では、記載の例がコマンドプロンプトではなくWindows Subsystem for Linuxを使う記述になっているので、WindowsにAzure CLIを入れなくてよい。


# 環境
- Windows 10 Pro、メモリ8GB

# 準備
- Git入れる
- Docker for Windows入れる
    - 「Windowsの機能の有効化」でHyper-Vを有効化してPC再起動
    - https://docs.docker.com/docker-for-windows/install/ から「Docker for Windows Installer.exe」をダウンロードして実行(ユーザ登録が必要)(インストール後にPC再起動が必要)
- VS Code 入れる
    - 拡張機能で「Docker Support for Visual Studio Code」(Microsoft)入れる
    - 拡張機能で「Visual Studio Code Kubernetes Tools」(Microsoft)入れる(「Kubernetes」という名前なので注意。「ms-kubernetes-tools.vscode-kubernetes-tools」

- [Install kubectl on Windows](https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-kubectl-on-windows) から、kubectl.exe をダウンロードして、```C:\Program Files\kubernetes-tool\``` とかフォルダを作ってそこにコピー。Windowsの「システム環境変数の編集」でPATHを通しておく。


- https://azure.microsoft.com/ja-jp/free/ でAzureのアカウントを作成(クレジットカードが必要)

- https://aka.ms/installazurecliwindows から「Azure CLI」を入れる([Windows での Azure CLI のインストール](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli-windows?view=azure-cli-latest) を参照)


# Helmをインストールする

- [Helm のGitHubページ](https://github.com/helm/helm/releases)からダウンロード
    - 適当なフォルダ(`C:\Program Files\helm`とか)に展開し、PATHを通しておく

# CLIでAzureにログインして初期設定
- コマンドプロンプトから ```az --version``` でバージョン確認
- ```az configure``` で、出力形式を「3 table」にしておく。
- ```az login``` を実行して、ブラウザからログインする
- リソースプロバイダを有効にする
    - ```az provider register -n Microsoft.Network```
    - ```az provider register -n Microsoft.Storage```
    - ```az provider register -n Microsoft.Compute```
    - ```az provider register -n Microsoft.ContainerService```
Vue を書く時に利用していた pug を捨てた理由

Vue.js で単一ファイルコンポーネント機能を用いて `*.vue` 形式でコンポーネントを記述する場合は、下記のように書くことが出来ます。

```vue:some-template.vue
<template lang="pug">
.some-template
  a(href="/") Top
  h1 Hello world!
</template>

<script>
import Vue from 'vue';

export default Vue.extend({
  name: 'SomeTemplate',
});
</script>
```

ここで利用されている [pug](https://pugjs.org/api/getting-started.html) と呼ばれるものは、以前 `jade` と呼ばれていた HTML のプリプロセッサ言語です。

上記のテンプレートは、下記のように HTML 展開されます。

```html
<div class="some-template">
  <a href="/">Top</a>
  <h1>Hello world!</h1>
</div>
```

HTML を書くのに比べて、上記例では文字数を **約 35 % 少なく** 記述することが出来ています。

小さいスケールでコードを書き始める時、出来るだけコードの文字数は減らしてサクサクと書いていきたいものですから、私のプロジェクトでは `pug` を採用して一気にゴリゴリコンポーネントを増やしていました。

しかし、全体のコード量が増え、メンバーが増え、運用のフェーズに入った時、この書き方には問題があることに気づきました。

## `pug` を捨てた理由

現代的なプログラミングは、 IDE やエディタによる **多大なサポートによって最適化されている** ことがメリットとして挙げられます。

しかし、この `pug` を使うと、 **静的解析ツールのサポートを受けられない** ことに気づいたのです。

現在 Vue ファイルの lint を行うものといえば、 [vue-eslint-parser](https://github.com/mysticatea/vue-eslint-parser) を利用し、 [eslint](https://eslint.vuejs.org/) で行うことがメジャーではないでしょうか。

しかし、 [この issue#29](https://github.com/mysticatea/vue-eslint-parser/issues/29) にある通り、現段階(2019/04)で `vue-eslint-parser` は `pug` 言語のパースには対応していないため、 `eslint` で解析を行うことが出来ません。

それはどういうことを意味するかというと、 **[eslint-plugin-vue で利用可能なたくさんのルール](https://eslint.vuejs.org/rules/) をエラーチェック・自動修正出来ない** ということです。

特に [Vue のスタイルガイド](https://jp.vuejs.org/v2/style-guide/)は非常に優秀で、コンポーネントを書く時に悩ましい部分をあらかた解決してくれる存在です。

`eslint-plugin-vue` はそのスタイルガイドに基づいて、多くの項目を自動で修正してくれます。

このサポートを受けれないとなると、 `<template>` 内のコードの信頼性を仕組みで向上することが出来ないつらい状態です。

vscode の強力な Vue 拡張である Vetur も [issue#527](https://github.com/vuejs/vetur/issues/527) のようにフォーマッタが実装されていません。

かろうじて [vue-format](https://marketplace.visualstudio.com/items?itemName=febean.vue-format) が自動でフォーマットしてくれるかな、程度です。つらい。

## 一括して修正する

幸い `pug` は [API を提供している](https://pugjs.org/api/reference.html)ので、その API を利用すれば簡単に HTML に変換することが可能です。

[leo-buneev/pug-to-html: CLI tool to convert your pug code to html code. Supports Vue Single File Components!](https://github.com/leo-buneev/pug-to-html)

このあたりのライブラリを使えば、一括で修正が可能です。その後に `eslint --fix` を実行すれば、ほとんどのエラーは解消出来ると思います。

全てのエラーを自動で解消出来るわけではないので、その後はチマチマ 1 ファイルずつ点検していくことにはなりますが、一度やってしまえば終わりなので許容出来る量のうちにやっておいた方が良いですね。

## 「記述するコード量が増える」問題に対処する

「記述するコード量が増える」という問題は、例えば vscode ではデフォルトで有効になっている [Emmet 記法](https://emmet.io/) を用いることでほぼ解決出来ます。

この Emmet 記法は、 `pug` っぽく HTML の要素を記述して展開を実行することで、少ないコード量から HTML を生成出来るものです。

```
#page>div.logo+ul#navigation>li*5>a{Item $}
```

こう書いて展開を実行すると、

```html
<div id="page">
    <div class="logo"></div>
    <ul id="navigation">
        <li><a href="">Item 1</a></li>
        <li><a href="">Item 2</a></li>
        <li><a href="">Item 3</a></li>
        <li><a href="">Item 4</a></li>
        <li><a href="">Item 5</a></li>
    </ul>
</div>
```

このようになります。

記法は `pug` や jQuery のクエリセレクタに似ているので覚えやすいですね。それに、別にこの記法を用いなくても良いわけなので、デベロッパフレンドリーです。

---

事前に保守する時のことを考えて、こういった Linter サポートなどがしっかりしているかどうか調べてから技術を利用するようにしましょう(教訓)。