OmniAICreator/Qiita-1.07M huggingface dataset:
『新しいLinuxの教科書 』を読んだまとめ

## 操作コマンド

### カーソル移動

|やりたいこと| コマンド |
|:--------|:------:|
|後ろへ1文字移動|`Ctrl+b`|
|前へ1文字移動 |`Ctrl+f`|
|行頭へ移動| `Ctrl+a`|
|行末へ移動| `Ctrl+e`|

### 単語単位でカーソル移動

|やりたいこと| コマンド　|
|:--|:--:|
|後ろへ単語1つ分移動|`Alt+b` or `Esc+b`|
|前へ単語1つ分移動|`Alt+f` or  `Esc+f`|

### 文字の削除

|やりたいこと| コマンド|
|:--|:--:|
|後ろへ1文字削除|Ctrl+h|
|カーソル位置の1文字を削除|Ctrl+d|
|1単語丸ごと削除|Ctrl+w|

### カットとヤンク

|やりたいこと|コマンド|
|:--|--:|
|行末までカット|`Ctrl+k`|
|行頭までカット|`Ctrl+u`|
|ペースト（ヤンク）|`Ctrl+y`|

## トラブル発生！

### 何を打ち込んでも表示されない！

画面がロックされている可能性がある。無茶苦茶に打ち込む前にそっと`Ctrl+q`しましょう。
画面表示をロックする`Ctrl+s`を打ち込んでしまった可能性がある。

### コマンドが終了しない！

- pingなど

`Ctrl+c`で強制終了。

### プロンプトが文字化け

1. `Ctrl+l`で画面を消去。
2. それでもダメなら`reset`
3. 最後にはログアウトして、再度ログイン

## 補完機能

bashの補完機能はTabを押すことで使用できる。

|やりたいこと|コマンド|
|:--|:-:|
|echo|ec|

## コマンド履歴

|やりたいこと|コマンド｜
|:--|:-:|
|ひとつ前|`Ctrl+p`|
|次|`Ctrl+n`|
|履歴を検索|`Ctrl+r`|

検索したあと

|やりたいこと|コマンド｜
|:--|:-:|
|１つ前の検索結果|`Ctrl+r`|
|実行|`Enter`|
|検索結果を修正|`Esc`|
|戻る|`Ctrl+g`|

## ファイルとディレクトリ

- Linuxはファイルからできている
- システム全体で１つのディレクトリツリーしか持たない
 - ディスクをディレクトリにくっつけることを「マウント」と呼ぶ
- `.`はカレントディレクトリ
- `..`は親ディレクトリ

|やりたいこと|コマンド|
|:--|:-:|
|カレントディレクトリ確認|`pwd`|
|カレントディレクトリ変更|`cd`|
|中のファイルを表示|`ls`|


- パス名もTab補完できる

|やりたいこと|コマンド|
|:--|:-:|
|ホームに戻る|`cd ~`|

### lsコマンド

- パス名展開ができる

|やりたいこと|コマンド|
|:--|:-:|
|文字列|`*`|
|１文字|`?`|

```bash
$ ls ba*
base64 basename bash bashbug bashbug-64
```
```bash
$ ls *.html
about.html index.html info.html report.html top.html
```
```bash
$ ls ba??
bash
```

|やりたいこと|コマンド|
|:--|:-:|
|詳細表示|`ls -l`|
|ファイル種別表示|`ls -F`|

### catコマンド

|やりたいこと|コマンド|
|:--|:-:|
|行番号を表示|`cat -n`|

### lessコマンド

|やりたいこと|コマンド|
|:--|:-:|
|１画面下にスクロール|`Space`|
|１画面上にスクロール|`b`|
|終了|`q`|

- ファイル内検索

|やりたいこと|コマンド|
|:--|:-:|
|下に検索|`/`|
|上に検索|`?`|
|次の検索結果へ|`n`|
|前の検索結果へ|`N`|

### lnコマンド

- Linuxではファイルに別名をつけられる
- 長いパス名を省略する
- 複数バージョンがあるときにlatestをリンク管理する

|やりたいこと|コマンド|
|:--|:-:|
|シンボリックリンクを作成する|`ln -s`|
|シンボリックリンクを確認する|`ls -l`|

## 探す、調べる

### findコマンド

`find <検索開始ディレクトリ> <検索条件> <アクション>`

|やりたいこと|コマンド|
|:--|:-:|
|ファイル名でさがす|`-name` or `-iname`|
|種類でさがす| `-type`|


- *や?を使うときはシングルクォートを必ずつける
- bashのパス名展開とかぶるため
- 並べて書いてもAND検索となる

### locateコマンド

`locate [オプション] <検索パターン>`

- findより検索が早い
- データベースだけを検索するため
- データベースは１日１回作成される
- **作成後しばらく経ったファイル**を見つけるのに向く
- 複数指定するとOR検索となる

|やりたいこと|コマンド|
|:--|:-:|
|大文字小文字を無視|`-i`|
|ファイル名のみ検索|`-b`|
|AND検索|`-A`|
Unhandled rejection Error: EISDIR: illegal operation on a directoryが出たときにやったこと

#はじめに
npm installでUnhandled rejection Error: EISDIR: illegal operation on a directoryというエラーが出たときにやったことをメモしておきます。

#原因
調べた結果、私の場合はnpmのバージョンに比べてnode.jsのバージョンが古いことが原因でした。

```
$ node -v
v8.8.1
$ npm -v
6.10.0
```

#やったこと
1.nodebrewがインストールされているか確認

```
$ nodebrew -v
nodebrew 0.9.7
```
2.node.jsの最新版をインストール

```
$ nodebrew install-binary latest
```
3.インストールの確認

```
$ nodebrew list
v8.8.1
v12.6.0

current: v8.8.1
```
4.インストールしたnode.jsのバージョンを有効にする

```
$ nodebrew use v12.6.0
use v12.6.0
```

#参考記事
[Macにnode.jsをインストールする手順。](https://qiita.com/akakuro43/items/600e7e4695588ab2958d)
Google Cloud Functionsでpuppeteerを動かした話

さて、前回の記事の通り、puppeteerはWindowsサーバー上ではなくFaaS上で動かしたいです。

[nodejsプログラムの作成(puppetter) - Qiita](https://qiita.com/teraco/items/4fab0247dee886e39455#serverless%E3%81%A7%E5%8B%95%E4%BD%9C%E3%81%95%E3%81%9B%E3%82%8B)

いろいろ3大FaaSを比較した結果、Google Cloud Functionsで動かしました。

- Azure Function
    - Headless Chromeがそもそも動かない環境ぽいので断念
        - [Azure FunctionsでPuppeteerが使えない - Qiita](https://qiita.com/daichiiiiiii/items/0d366efdc9d10f2ad2c6)
- AWS Lambda
    - Lambda上で @serverless-chrome/lambda を使わねばならず、めんどくさそう
- Google Cloud Functions
    - 公式にPuppeteerをサポートしており、puppetterに組み込まれているchrominiumをそのまま使える。普通にPC上で動かすために書いたコードと、Cloud Functions上で動かすためのコードがそこまで変わらない。

やり方は、以下のサイトを見れば簡単にできました。

[Cloud Functions with Puppeteer + Google Apps Script でスクレイピングサーバーをサクッと作る - Qiita](https://qiita.com/howdy39/items/2f355fea8340a35aa5da)

特筆すべきことは…

- Memory allocatedは2GBにした
    - ケチって256MBとかだとpuppeteerが起動できずエラーとなったため
- SourceCodeはInlineEditerに
    - 今回はコード量も少なかったので直接書いた
    - コード量が多いものをFaaSで実行すべきか、という議論は後述
- Function to Executeはちゃんと設定しましょう

## Google Cloud Functionsの特徴

HTTPSトリガーしか存在しないこと。

Azure FuctionならHTTPSトリガーに加えてタイマートリガーやら、ストレージキュートリガーなどありますが、Google Cloud FunctionsはHTTPSをたたいてやらないと起動しません。よって、上記の参考にした記事ではGoogle Apps Scriptを使ってHTTPSをたたいていますが、これはそれぞれ使い慣れたツールでよいので、私はAzureのiPaaSであるLogicAppsを使いました。

[Logic App Service | Microsoft Azure](https://azure.microsoft.com/ja-jp/services/logic-apps/)

- Google Cloud FunctionsをたたくとJSONで値を返すようにする。
- その状態で、LogicAppsでGoogle Cloud Functionsをたたき、戻り値のJSONを料理する

ご参考まで。

## FaaS利用の考え方

HTTPSトリガーしか存在しないGCFを利用して改めて思ったことですが、FaaSはあくまでパーツの集まりとして、それらを利用(実行)するロジックは他で作成するのがいいのでは、という話です。

GCFはまだいいですが、AWS Lambdaなどは、ローカル実行時とFaaSでの実行時でコードが結構変わってしまって、長いコードだとローカル実行 → FaaS実行で差異が出そうでヤな感じ。単機能のパーツとして実装すればデバッグもしやすい。

私自身も「取得した情報をDBに投入する」というGCFの作成を進めていましたが、これでも

- 情報を取得する
- DBに投入する

の2機能がセットになっているので、前述のLogic Appsで「GCFをたたく→DBに投入する」の2パーツを接続するような形としました。(余談ですがDBに投入する機能はLogic Appsの組み込みを使った。こういうのができるのがiPaaSのいい所)
Markdown記法

#はじめに
未来電子テクノロジーでインターンをしています。坂本です。。
プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。
#目次

1．見出し、フォントサイズ
2．フォントカスタマイズ
3．コード挿入
4．まとめ
#1.見出し、フォントサイズ
見出しを書くには以下のようにします。
>```
#見出し
```
サイズ設定するには#の数を変えればいいです。
#数を増やすほど、サイズが小さくなります。
#1つから5つまで増やしてみます。
#見出し
##見出し
###見出し
####見出し
#####見出し
た、楽しいですね

#2．フォントカスタマイズ
次のようにすることでフォントを変えることができます。
italicを紹介します。
>```
I am *king*
```
出力：I am *king*

boldを紹介します。
>```
I am **king**
```
出力：I am **king**

便利です。
#コード挿入
以上の黒帯のようにコードを挿入する方法を紹介します。
挿入したいコードを「`」で囲むことで挿入できます。

4．まとめ
簡潔にMarkdown記法について学んだ基本を紹介しました。
GPSカー その13

#概要

GPSで自動走行する、コンテストがある。
実機を借りて、アプリから操作する部門が今年は無いらしい。
実機を作ってみた。
ログ取れないと、捗らないので、bluetoothでandroidでログ取ってみた。

#写真

![device-2019-07-17-071454.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/db6f4056-55ba-5539-6662-4532ffa61787.png)

#回路図

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/77f399a7-227b-c894-1011-a28024fb851c.png)

#仕組み

wemosのserialにbt04を繋いでログをbluetoothで垂れ流す。
androidで、bluetoothでbt04に繋いで、ログを表示する。


以上。
Proxmox 6

## 参考

* [Upgrade from 5.x to 6.0 - Proxmox VE](https://pve.proxmox.com/wiki/Upgrade_from_5.x_to_6.0) 公式
* [How To Install Proxmox VE 6 on Debian 10 (Buster) - Computing for Geeks](https://computingforgeeks.com/how-to-install-proxmox-ve-on-debian/)

## Proxmox 5->6に更新手順

```sh
# 最新のProxmox5に更新
apt update
apt dist-upgrade --download-only

# 最新のProxmox5に更新
apt dist-upgrade

reboot
```

```sh
# checkerを実行
pve5to6
```

* [Package Repositories - Proxmox VE](https://pve.proxmox.com/wiki/Package_Repositories)

```sh
# Promxox 6にリポジトリを変更
sed -i 's/stretch/buster/g' /etc/apt/sources.list

echo "deb http://download.proxmox.com/debian/pve buster pve-no-subscription" > /etc/apt/sources.list.d/pve-enterprise.list
```

```sh
apt update

apt dist-upgrade --download-only

# Proxmox6に上げる
apt dist-upgrade
```

* /etc/systemd/logind.conf を置き換える場合は [モニターを閉じるとサスペンドされるのを防止 - Qiita](https://qiita.com/tukiyo3/items/9db97f9ffea8a26b364b) にも注意。

```sh
apt -f install
```

## LXCのリストアに失敗する場合

> tar: ./var/spool/postfix/dev/urandom: Cannot mknod: Operation not permitted
> tar: ./var/spool/postfix/dev/random: Cannot mknod: Operation not permitted

![スクリーンショット_2019-08-22_11-06-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/d8b0efcd-8e7d-ca76-80d7-889ee6cda0a3.png)

* 該当 : [Cannot mknod: Operation not permitted : Proxmox](https://www.reddit.com/r/Proxmox/comments/bgt2we/cannot_mknod_operation_not_permitted/)

```sh:
# 原因のファイルが存在することを確認。
ls -lh /var/spool/postfix/dev/urandom
ls -lh /var/spool/postfix/dev/random
# 設定ファイルのバックアップ
mkdir ~/backup/
cp -a /etc/postfix/ ~/backup/

# postfixの停止
apt-get remove postfix
dpkg --purge postfix
# 原因のファイルが消えたことを確認。
ls -lh /var/spool/postfix/dev/urandom
ls -lh /var/spool/postfix/dev/random

# postfixの起動
apt-get install postfix
cp -a ~/backup/postfix /etc/
```

* バックアップし、リストアが成功することを確認。
Goで外部コマンドを呼び出すのをHTTPリクエスト越しに実行してみる(Ginを使って)

# 概要

このエントリは、Goを使い、外部コマンドを呼び出すこと、それをHTTPリクエスト越しに実行してみることをやってみたので、メモとして残すものです。コンテナにもできます。
表題のことをやってみようかなと思った方への参考の一つとして紹介します。

# 前提

## 想定読者

- Go言語で、"A tour of Go"を少しやったことがある人

## 利用するもの

以下を利用します

- HTTPサーバとして、[gin](https://gin-gonic.com)
- 動作環境は*nix系(コマンド実行)

## ソース

リリースv0.1.0がGitHubにあります。
https://github.com/hrkt/cmd-exec-server/releases/tag/0.1.0

## ベースとなるもの

以前書いたQiitaのエントリ「[Go-lang+GinでAPIサーバを作る一歩目～EHW2018「アプリ②」](https://qiita.com/hrkt/items/a524910b14fc8c05038f)」で作ってあったものをforkしました。

# 今できること

0. app-settings.jsonを編集して

see: "app-settings.json" paragraph in this README. 

1. サーバを実行して

```
$ make run
```

2. サーバ側でコマンドを実行するため、ボディに標準入力を渡し、HTTP POST リクエストを飛ばすと、標準出力がJSONファイルの中の文字列として返ってきます。
（バッファサイズは2048byteに絞ってあります）

```
$ curl -X POST localhost:8080/api/exec -d "some input"
{"result":"SOME INPUT"}
```

(で、README.mdにあるように"make build-container"すると、コンテナになります)

# 書いたもの

## Router

"/api/exec"でコマンドを実行できるように指定しています。

POSTリクエストを受け取り、リクエストのボディ部をstringとして格納しています。
(ここのバッファは今は固定長。2048byte。)

```golang

func setupRouter() *gin.Engine {
	router := gin.Default()

	// Global middleware
	router.Use(gin.Logger())

	// Routing
	router.StaticFile("/", "./index.html")

	router.POST("/api/exec", func(ctx *gin.Context) {
		buf := make([]byte, RequestBodyBufferSize)
		n, _ := ctx.Request.Body.Read(buf)
		body := string(buf[0:n])

		res := executeIt(body)

		ctx.JSON(200, gin.H{
			"result": res,
		})
	})

	return router
}
```

## 外部コマンドの実行

app-config.jsonで指定したコマンドを実行します。

Go-langの[os/exec](https://golang.org/pkg/os/exec/#Command)を使います。

(今の実装では出力を区切っていないため、出力が多いコマンドだとサーバが止まるでしょう)

```gaoling
func executeIt(requestBody string) string {
	cmd := exec.Command(appConfig.Command, appConfig.Arguments[:]...)
	cmd.Stdin = strings.NewReader(requestBody)
	var out bytes.Buffer
	cmd.Stdout = &out
	err := cmd.Run()
	if err != nil {
		log.Fatal(err)
	}
	return out.String()
}
```

# おわりに

このエントリでは、Goで外部コマンドを呼び出すのをHTTPリクエスト越しに実行してみることを紹介しました。何かのご参考になれば幸いです。

## 補足：エントリを書くきっかけ

Pythonで、"$ python -m CGIHTTPServer"などでお手軽サーバを作るような感じをGoでやったらどうなるかなと思って書いてみました。
C#の全プロジェクトに便利な設定を一括反映する

# はじめに

本稿は、Visual Studio の C# のソリューションで多くのプロジェクトを管理している場合に、便利な設定を一括反映する方法の紹介です。
お勧めの設定内容は以下です。私のプロジェクトでは、次の2つの設定を全プロジェクトに反映しています。

- C# 8.0 を利用(2019年7月時点でC# 8.0はPreview版であるため、プロジェクトごとに設定が必要)
- 決定論的ビルドの有効化(同じソースコードから常に同じバイナリを生成する)

C# 8.0は[以前の記事](https://qiita.com/kojimadev/items/d2ee29e85c4c0859275a)に書いた通りnull安全などで有効です。
決定論的ビルドは無条件で設定しておいた方が良い設定です。
(決定論的ビルドはVisual Studio 2017以降で新規作成した.NET StandardかCoreのプロジェクトはデフォルトで有効になっていますが、それ以外のプロジェクトはデフォルトで無効になっています)

# 手順
手順はとても簡単です。以下の文字列を書いたファイルを「Directory.Build.props」という名前でslnファイルと同じフォルダに格納します。

```xml
<Project>
 <PropertyGroup>
   <Deterministic>true</Deterministic>
   <LangVersion>preview</LangVersion>
 </PropertyGroup>
</Project> 
```

# 解説
Directory.Build.propsに記述した内容は、格納したフォルダ以下のすべてのcsprojファイル(プロジェクトファイル)に自動的に反映されます。
`<LangVersion>preview</LangVersion>` と記述すると、Preview版のC# 8.0が利用できるようになります。
`<Deterministic>true</Deterministic>` と記述すると、決定論的ビルドが有効になります。これが無効のままだと、同じソースコードでもビルドした時刻によって異なるバイナリになります。これが有効であれば、ビルド結果のキャッシュが効きやすくなり、テスト実行が高速化されたりします。CI/CD 環境でのテストもおそらく早くなると思います。

詳細な解説については、以下のサイトを参照ください。

Directory.Build.propsについての詳細は以下参照。
[Directory.Build.* |  ++C++;](https://ufcpp.net/blog/2018/12/directorybuild/)
決定論的ビルドの詳細は以下参照。
[C# で、同じソースコードから常に同じバイナリを生成する](https://ufcpp.net/blog/2019/5/deterministicbuilds/)

# まとめ
C#の全プロジェクトに便利な設定を一括反映する方法を紹介しました。
本稿の内容を活用して [こちら](https://www.lightning-review.com/) のツールを作ったりしています。
【GIMP】UnityのSkyBox作り（３６０度　全天球）

環境メモ
⭐️GIMP 2.10


完成内容↓↓↓
https://twitter.com/nonnonkapibara/status/1151245042805137409
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">💡WebVR💡A-Frame<br>Unityの✨SkyBox✨作り⚖️Inkscapeと💕GIMPを使って⛪️ステンドガラス⛪️の絵を描いて<br>🎀360度🎀全天球で作ってみたよぉ👍<br>A-FrameのWebブラウザでVR表示😊<br>VRゴーグルで見てみた。とってもいい感じ👯‍♀️<a href="https://twitter.com/hashtag/VR?src=hash&amp;ref_src=twsrc%5Etfw">#VR</a> <a href="https://twitter.com/hashtag/WebVR?src=hash&amp;ref_src=twsrc%5Etfw">#WebVR</a> <a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://t.co/0UNN72PkYn">pic.twitter.com/0UNN72PkYn</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1151245042805137409?ref_src=twsrc%5Etfw">July 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


1.A-FrameのWebブラウザでVR表示する場合は
GIMPで幅３６００×１８００ピクセル　解像度６００で
拡張子.jpg形式でエクスポートする。
<img width="1097" alt="スクリーンショット 2019-07-17 5.20.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/abc325a1-66b5-7214-07d0-4b0711ead62c.png">

２.A-FrameのWebブラウザでVR表示するHTMLを記述する

HTMLのindex.html

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>A-Frame360度全天球</title>
    <meta name="description" content="A-Frame Stained Glass SkyBox">
    <script src="https://aframe.io/releases/0.9.0/aframe.min.js"></script>
  </head>
  <body>
    <a-scene>
      <a-sky src="non/stainedglass.jpg" rotation="0 170 0"></a-sky>
    </a-scene>
  </body>
</html>
```

3.これをサーバーにUPで完了。
類似内容↓
【WebVR】360度全天球を試してみた。A-FrameでWebVR 表示してみたよぉ。
https://qiita.com/nonkapibara/items/1419e55bae2c4c611523



4.UnityのSkyBoxにする場合は、
GIMPで幅３６００×１８００ピクセル　解像度６００で
拡張子.hdrでエクスポートする

5.Unity側で、取り込む
<img width="417" alt="スクリーンショット 2019-07-17 7.08.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/04ad42df-2853-d3fb-c47e-50a703004695.png">

5.新しいMaterialを作成し、SkyBoxにする
<img width="500" alt="スクリーンショット 2019-07-17 7.11.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/c48040aa-413d-3163-19f8-4a349118811b.png">

完了！

類似内容↓
【Unity】360度全天球をSkyBoxに設定する（Skybox/Cubemap）
https://qiita.com/nonkapibara/items/27aac80da1fb4ff03d0f
【GIMP】GIMPでパターンを追加する

環境メモ
⭐️GIMP 2.10


GIMPでステンドガラスのパターンを作って作成した内容
https://twitter.com/nonnonkapibara/status/1151245042805137409
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">💡WebVR💡A-Frame<br>Unityの✨SkyBox✨作り⚖️Inkscapeと💕GIMPを使って⛪️ステンドガラス⛪️の絵を描いて<br>🎀360度🎀全天球で作ってみたよぉ👍<br>A-FrameのWebブラウザでVR表示😊<br>VRゴーグルで見てみた。とってもいい感じ👯‍♀️<a href="https://twitter.com/hashtag/VR?src=hash&amp;ref_src=twsrc%5Etfw">#VR</a> <a href="https://twitter.com/hashtag/WebVR?src=hash&amp;ref_src=twsrc%5Etfw">#WebVR</a> <a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://t.co/0UNN72PkYn">pic.twitter.com/0UNN72PkYn</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1151245042805137409?ref_src=twsrc%5Etfw">July 16, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



1.GIMPのパターン画像を用意する

<img width="550" alt="スクリーンショット 2019-07-17 5.56.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/396c7fc8-d506-62ea-88e6-66303c82459b.png">

2.拡張子.pat形式で保存する
<img width="884" alt="スクリーンショット 2019-07-17 5.56.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/8f648117-70c5-6c4e-79f5-2e6cb0700815.png">

3.GIMPのディレクトリを開く
<img width="609" alt="スクリーンショット 2019-07-17 5.51.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/d9987374-27f1-3caf-387f-1e9585d4b50e.png">

右クリックで、「パッケージの内容を表示」を開く
<img width="526" alt="スクリーンショット 2019-07-17 5.52.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/f9948ba9-f3d3-0e46-967d-c4a3d345b4ef.png">

GIMPのディレクトリ 「patterns」配下に、先ほどのパターン.pat形式を配置する
<img width="1278" alt="スクリーンショット 2019-07-17 5.54.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/b3a8d802-467c-ab45-c80d-c98e60e3bdfb.png">

4.GIMPのパレットに、追加される
<img width="340" alt="スクリーンショット 2019-07-17 6.52.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/8ad15aa5-84af-c0c3-eaa9-e8e9eee2b86d.png">


完成！
＜初心者＞vue.jsで作ったサービスのコンポーネントを分割してみた。

webサービスの詳細はこちらの記事参照ください。「[レファレンス協同データベースの記事をランダムに表示するWEBサービスをvue.jsで作りました。](https://qiita.com/basho/items/3951e56e737fb653a958)」

#やったこと
元はトップページ1枚全て（上下のheaderとfooterは除く）Home.vueという1つのコンポーネントで作成していました。このほか、記事詳細画面用のDetail.vueがあります。
![アートボード 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89564/d2269c07-ab7e-29b8-d470-1e7c7dc9287e.png)

今回行ったのはHome.vueから機能ごとにA・B・C、計3つのコンポーネントへ分離することです。
![アートボード 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89564/4d458f04-61e1-2f66-0511-606e44c30ad4.png)

トップで使用していたHome.vueは647行から210行まで減りました。

#大変だったこと。
一番時間がかかったA.検索機能の分割について備忘録も兼ねて書きます。（※まだ知識が浅いところが多いので、間違いもあるかもしれません。お気づきの点ありましたらコメントいただけるとありがたいです。）

検索機能は実質3つ用意されています。
**1.検索ボックス**
この記事では深くは突っ込みません。直接入力or上部レコメンドのクリック→検索ボックスへ入力の2パターンあります。
**2.ランダムに表示ボタン**
この記事では深くは突っ込みません。
**3.記事詳細画面のキーワードタグをクリックして遷移**
これが問題です。

1は検索ボックスエリアのwatchによる監視で2パターンとも対処。2のランダム表示ボタンも親コンポーネントが同一なので検索の実行は簡単。
しかし、3は別の画面からの遷移です。

記事詳細画面がkeywordをパラメーターとして投げて⇒受け取り⇒検索を実行、と3つのコンポーネントをまたぐ処理です。検索ボックスにキーワードを反映するのは1と同様なので、同じく検索ボックスの監視ではうまくいくと思っていたら検索実行の可否決定で少し詰まりました。

まず、パラメーターとして投げて⇒受け取るところまでは以下の実装。

リンク元のタグ。

```
<a v-bind:href="'https://testreftika.web.app/keyword/' + keyword">{{keyword}}</a>
```

ルーター

```router.js
routes: [
    {
      path: '/',
      name: 'home',
      component: Home
    },
    {
      path: '/keyword/:keyword',    ←新たに追加
      name:'keyword',
      component: Home
    },
    省略
}
```
リンク先ではurlのチェックを行い/keyword/とマッチした場合はパラメーターを取得し、検索ボックスへ入力します。

```
    if (location.pathname.match(/\/keyword\/./)) {
      this.keyword = this.$route.params.keyword
    }
```

この後、Aコンポーネントで検索を実行します。

ここで、初めは「created:functionの処理として、keywordがある場合は検索を実行」という方法をとりました。しかし、戻るボタンでトップページに遷移してきたときにも検索を実行してしまうためよくありません。

そこで別の方法として、Bコンポーネントの検索結果データがあるかどうかによって判断することにしました。そのために、もともとコンポーネントのdataで管理していた検索結果をstoreに移動。コンポーネントのdataはバッファとして利用することにしました。

![アセット 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89564/4bf4458f-5de8-967e-50a9-7981e0e49508.png)

こうすることで、キーワードの有無ではなく、storeにデータがあるかないかによって検索を実行の可否を決定することができます。storeはpageリフレッシュ時とurlが変わった際に消えてしまうので、詳細ページからの遷移時には新たに検索を実行してくれるからです。（と理解しています。）
pythonで自己登録制の英和辞書＆テスト作ってみた

jsonファイルはそっちで用意しないとダメかもです。（すみません）
import json
import random
import sys

while True:
    select=int(input("1:登録 ２：内容確認 ３：削除 4:テスト　5:終了"))
    if select==1:
        print("終了時quitを入力してね")
        while True:
            eng=input("英語は？")
            if eng=="quit":
                break
            jap=input("日本語は？")
            if jap=="quit":
                break
            with open("english.json","r") as fp:
                dic=json.load(fp)
                dic[eng]=jap
            with open("english.json","w") as fp:
                json.dump(dic,fp)

        
        
    if select==2:
        with open("english.json","r") as fp:
            r=json.load(fp)
            print("現在登録されているのは"+str(r)+"です")

    if select==3:
        del_eng=input("消したい英語を入力してね")
        with open("english.json","r") as fp:
            dic_del=json.load(fp)
            del dic_del[del_eng]
        with open("english.json","w") as fp:
            json.dump(dic_del,fp)
    
    if select==4:
        print("終了時quitを入力してね")
        while True:
            with open("english.json","r") as fp:
                dic=json.load(fp)
            que=random.choice(list(dic.keys()))
            print(que)
            command=input("日本語を表示")
            if command=="quit":
                break
            print(dic[que])

    if select==5:
        sys.exit()
図形の数を自動で数える

![sikaku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165847/0f937da2-fc95-b813-c47f-91dba61d6d54.png)
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/165847/710303a4-22f2-04c7-9dac-4446cf0f18e6.png)


```python

import cv2
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

filename = input()
img = cv2.imread(filename)
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
contours, hierarchy = cv2.findContours(gray,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

def draw_contours(ax, img, contours):
        ax.imshow(img)
        ax.set_axis_off()
        for i, cnt in enumerate(contours):

                # 形状を変更する。(NumPoints, 1, 2) -> (NumPoints, 2)
                cnt = cnt.squeeze(axis=1)

                # 輪郭の点同士を結ぶ線を描画する。
                # ax.add_patch(Polygon(cnt, color="b", fill=None, lw=1))

                # 輪郭の点を描画する。
                # ax.plot(cnt[:, 0], cnt[:, 1], "ro", mew=0, ms=2)

                # 輪郭の番号を描画する。
                ax.text(cnt[0][0], cnt[0][1]-15, i+1, color="orange", size="20")

fig, ax = plt.subplots()
draw_contours(ax, img, contours)
plt.savefig('result.png')
print(len(contours))
plt.show()

```
fedoraでクーロンがなかった


###クーロンがない
クーロン起動できなかった　辛い

```
$ service crond status
```
> -bash: service: command not found

```
$ /etc/rc.d/init.d/crond status
```
>-bash: /etc/rc.d/init.d/crond: No such file or directory

###多分解決策
https://docs.fedoraproject.org/en-US/fedora/rawhide/system-administrators-guide/monitoring-and-automation/Automating_System_Tasks/
####ステータスをみる
```
$ systemctl status crond.service
```

####クーロン起動
```
$ systemctl start crond.service
```
####クーロン停止
```
$ systemctl stop crond.service
```
####起動してる時　

```
(●が緑)
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-07-15 18:51:28 JST; 1 day 8h ago
 Main PID: 923 (crond)
    Tasks: 1 (limit: 2351)
   Memory: 3.0M
   CGroup: /system.slice/crond.service
           └─923 /usr/sbin/crond -n
(中略)
```
####起動してない時
```
(●が灰色)
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Wed 2019-07-17 03:47:52 JST; 8s ago
  Process: 923 ExecStart=/usr/sbin/crond -n $CRONDARGS (code=exited, status=0/SUCCESS)
 Main PID: 923 (code=exited, status=0/SUCCESS)
```
サブドメインを洗い出す正規表現でのgrepコマンド

サブドメイン、洗い出してますか。

```shell:
grep -rnle "http://.*your-domain\.com" .
```

.=なんでもいい1文字
*=直前の文字がない、または1つ以上連続

-r=再帰的にgrep
-n=行数表示
-l=ファイル名のみ表示
-e=正規表現を用いることを明示

以上。
python/matplotlibで円を描く

意外と簡単で、sinとcosを対応させてあげるだけ。

![circle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170241/fa771ba1-2a8d-14c5-1b89-14ebfd69db96.png)

```python:circle.py
import matplotlib.pyplot as plt
import math
import numpy as np

x,y=[],[]

for _x in np.linspace(-180,180,360):
    x.append(math.sin(math.radians(_x)))
    y.append(math.cos(math.radians(_x)))

plt.plot(x,y)

plt.title('circle')
plt.xlabel('sinx')
plt.ylabel('cosx')

plt.axes().set_aspect('equal','datalim') # 楕円に見えてしまうため縦横比を調整

plt.show() 
```
ec2運用のrailsアプリでcronの実行時間がズレる

ec2で運用のrailsアプリでcron使って定期的にプッシュ通知を送りたい。そこで以下のように書いてみる。

```ruby:
schedule = PeriodicNotification.where(status: 0).find_by("schedule_date <= ?", Time.now)
```

wheneverを使ってcron登録し運用してみたところutc時間で送られているようだ。以下のように直した。

```ruby:
schedule = PeriodicNotification.where(status: 0).find_by("schedule_date <= ?", Time.current)
```

`Time.now`だと環境依存の時間、`Time.current`だとアプリ依存の時間が取れるらしい。

以上。
ローン/リボ払い/返済シュミレータ/Ruby

ローン、リボ払いのシミュレータをrubyで作ってみた
コメントで補足もつけているためコードを参照されたし。

```ruby:ご利用は計画的に.rb
puts "借入額を入力してください"
borrow_money = gets.to_f
puts "月々の返済額を入力してください"
monthly_pay_money = gets.to_f
puts "年利を複利計算(%)で入力してください"
interest_rate = gets.to_f / 100 + 1 # 年利を入力
monthly_interest_rate = interest_rate**(1.0/12.0) #　月利に変換

pay_month,pay_money = 0,0

while borrow_money > 0
  borrow_money -= monthly_pay_money
  borrow_money *= monthly_interest_rate # 月利を複利で計算
  pay_month += 1
  pay_money += monthly_pay_money # 現状返済額は最後の月まで一定で仮定しているため若干ずれるが、月々の支払いが大き過ぎない限りあまり問題はない
end

puts "ーーーーーーーーーーーーーーー"
puts "返済期間は#{pay_month/12}年#{pay_month%12}ヶ月、合計返済額は#{pay_money}円です"
```
JavaScript letを使った方がいい事例を観測しました

Twitter上で質問を受けて不思議な挙動のコードに出会いました。ドキュメントとかあんまり読まないのでガバガバな説明ですがどうしても共有したい事例だったので書かせていただきます。ご容赦ください。

スコープを限定しないからダメとよくいわれる`var`を使って事故が起きたので、スコープを限定する`let`を使おうというお話です。(2019/7/18 追記: スコープの問題と言えるものの、当方の認識に誤りがあるかもしれません。現在確認中です)

```javascript:JavaScript
let elm = document.createElement("div");

var status = ["hoge", "fuga"];

Array.prototype.forEach.call(status, (t)=>{
  elm.innerHTML += t + "<br />";
});

document.body.appendChild(elm);
```

このコード、あえて`var`と`Array.prototype.forEach`を使用しました。

`var`を`let`にした場合とで挙動が異なっています。

```plane:var_status
h
o
g
e
,
f
u
g
a
```

```plane:let_status
hoge
fuga
```

`window.status`はすでに変数として存在している[^1]ため、`var`での宣言では再代入となります。その結果暗黙の型変換が行われ、文字列配列が文字列となってしまいます。結果としてこのような想定外の挙動をとったのでした。

つまるところ`var status`のほうは次のコードとほぼ等価です。

```javascript:JavaScript
let status = ["hoge", "fuga"].toString();
```

`var`を使うとこんな恐ろしいバグに出くわすのですね。。くわばらくわばら...

まぁ今回の場合、`status`を予約語とみなして回避するのがベストとも取れるんですけどね。

とりあえず他のケースでも似たようなことが起きないようにするために、自戒としてやっぱりこれからは積極的に`let`を使いたいなと思ったのでした。

駄文失礼しました。ここまで読んでくださりありがとうございました。m(_ _)m

[^1]: 存在意義がよくわからなかったです... [window.status - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Window/status)
キッチンタイマープログラム　完成版

#キッチンタイマープログラム
以前、初投稿時に作成したキッチンタイマープログラム。未完成品ではあったもののアドバイスを基に改善することができました。

#プログラムコード
授業課題で提出予定のプログラムです。

```

from time import sleep
import time
import pygame.mixer

minute_to_second=60

def alert():
    print("時間です")
    Sound()
    exit()

def Sound():
    pygame.mixer.init()
    pygame.mixer.music.load("Onmtp-Ding04-2.mp3")
    pygame.mixer.music.play(-1)
    input()
    pygame.mixer.music.stop()

while True:
    print("タイマーを設定する時間を指定してください")
    min=input("何分に設定するか選択してください。（minかsecがqで終了）:")
    sec=input("何秒に設定するか選択してください。（minかsecがqで終了）:")
    if min=="q" or sec=="q":
        print("設定を中断しました。")
        break

    try:
        minute=int(min)
        if 0<=minute<=99:
            wait_time1=(minute*minute_to_second)
        else:
            if 0>minute or 99<minute:
                print("minで入力できる数字は0から99までです。")
                continue
    except ValueError:
        print("数字以外は入力しないでください。")

    else:
        try:
            second=int(sec)
            if 0<=second<=59:
                wait_time2=wait_time1+second
                print(min+"分"+sec+"秒にタイマーをセットしました。")
                sleep(wait_time2)
                alert()
            else:
                if 0>second or 59<second:
                    print("secで入力できる数字は0から59までです。")
                    continue
        except ValueError:
            print("数字以外は入力しないでください。")
```
### 感想
これを口頭で説明するのって難しいですよね、、、。
でも、自力で50行程度のコードを書いたことは無かったので少しずつ成長が実感できますね！
graphvizがインポートできない

anaconda経由でgraphvizをインストール。

```shell:shell
$ conda install graphviz
```

意気揚々と

```python:hoge.py
import graphviz
```

をしてみるも、

```
ModuleNotFoundError: No module named 'graphviz'
```

おかしいなと思いつつ調べたところ、pipでラッパーをインストールすれば解決するとのこと。

```shell:shell
$ pip install graphviz
```

上記で無事インポートできるようになりました。
genkernel-nextなGentooで、nvidia-driversをEarly KMS Startさせる

# TL;DR
以下の行を書き足すべし。

```conf:/usr/share/genkernel/arch/x86_64/modules_load
MODULES_GRAPHICS="nvidia nvidia_modeset nvidia_uvm nvidia_drm"
```
ほんとは/usr/share上のファイルにディストリビューターじゃない人間が手を入れるのは良くないのだろうが、/etc/genkernel.confとかに同じように書いてうまくいく自信がないのでこうしている。

# 他に必要なこと
カーネルコマンドラインに`nvidia-drm.modeset=1`が必要だとArchWikiは言っている。しかしどのバージョンからのことかは不明ながら少なくとも現在Gentooにおいてstabilize済みである430.26ではわざわざ書かなくともDRMのKMS自体はデフォルトで有効な模様。
言い換えると古いドライバを使っているのでない限りTL;DR以外には何も作業せんでよろしいということらしい。

# 参考資料
[ArchWikiのNVIDIA記事](https://wiki.archlinux.jp/index.php?title=NVIDIA&oldid=14826#DRM_.E3.82.AB.E3.83.BC.E3.83.8D.E3.83.AB.E3.83.A2.E3.83.BC.E3.83.89.E3.82.BB.E3.83.83.E3.83.86.E3.82.A3.E3.83.B3.E3.82.B0)
[ArchWikiのKMS記事](https://wiki.archlinux.jp/index.php?title=Kernel_Mode_Setting&oldid=14757#Early_KMS_start)
[Genkernel-nextのGitHubより、モジュール読み込み周り](https://github.com/Sabayon/genkernel-next/blob/8aa1858f0c8900433276697498f047cff3cdc478/genkernel#L110)
Unity 2019.1xのPackage ManagerにおけるGitHubリポジトリとの関係

## はじめに

Package Managerのことをわかったつもりで分かってなかったので、自分用のふわっとしたまとめです。バージョンによってガンガン状況が変わると思うのでご注意ください。

## 前提

- Unity2018.3あたりからGitHubのURL指定でPackageを導入できるようになった
    - ref: [PackageManagerで自作ライブラリを作成する方法 - Qiita](https://qiita.com/frost224/items/9832625f9f1671dd033b)
- PackageManagerを使って利用するライブラリが登場しはじめている
    - ref: https://github.com/5argon/NotchSolution

### 動作確認環境

- macOS 10.14.4（18E226）
- Unity 2019.1.9f1


## Packageの導入方法

インポートしたいUnityプロジェクトのルートから`/Packages/manifest.json`を開く

`dependencies`に`[package名]: [GitHubのURL]`を追加する。

```manifest.json
{
  "dependencies": {
    "com.e7.notch-solution": "git://github.com/5argon/NotchSolution.git",
    ...
  }
}
```

この状態でUnityエディタを開くとPackageの再読込が走り、Packagesに該当アセットが追加される。

<img width="942" alt="スクリーンショット 2019-07-17 1.07.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/8c443c03-c39a-0853-01f1-848f79898d26.png">


PackageManagerのウィンドウに表示されている情報は、配布Packageのルートにある`package.json`に記述されている内容。(ref: https://github.com/5argon/NotchSolution/blob/master/package.json)

## Packageのバージョン指定

GitHub経由でインストールしたPackageのバージョン指定はGUI上から行うことが出来ない。

`manifest.json`を開き直すとバージョンに関する記述が追加されている。

```manifest.json
{
  "dependencies": {
    "com.e7.notch-solution": "git://github.com/5argon/NotchSolution.git",
    ...
  },
  "lock": {
    "com.e7.notch-solution": {
      "hash": "357f59ce20808dcd161dbb2c493e87fa74d193c7",
      "revision": "HEAD"
    }
  }
}
```

`hash`にかかれている`357f59ce20808dcd161dbb2c493e87fa74d193c7`はコミットのハッシュ値となっている。(ref: https://github.com/5argon/NotchSolution/commit/dd22b4bc702e2bd48851186df7417861ba2c71e2)

以前のバージョンを使用したい場合は、該当するコミットを見つけてきて`hash`の値を書き換えることで再度読み込みが走り、バージョンが切り替わる。(ref: https://github.com/5argon/NotchSolution/commit/357f59ce20808dcd161dbb2c493e87fa74d193c7)

<img width="816" alt="スクリーンショット 2019-07-17 1.27.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/55365/a53ec087-3981-c0ed-f201-f39607ad71c5.png">

## 最後に

微妙に物足りない感じですが、`.unitypackage`との比べてライブラリのバージョン依存が明確になるところは結構大きな利点かなと感じました。現状だとPackage間の依存等を定義出来ない等のデメリットも多く残っていますが、なんとか使える段階ではあると思いました。

他の手段として、少し煩雑ではありますがnpmjsクローンを自前で立てることで大体のことは解決できるみたいです(ref: [Unity 2019.1 で Unity Package Manager が 90% くらい民主化された件について - もんりぃ is undefined.](https://monry.hatenablog.com/entry/2019/04/17/024205))。併せてご検討ください。
俺たちは何を間違えているのか？

##はじめに
Qiitaの記事を読んでいて、たまに目にする「お前らの ~~ は間違っている」
というタイトル。
様々な内容について私たちの間違いを指摘してくれているが、私たちはどんなジャンルのものを間違えてしまうのだろう。
と思ったので、Pythonを使ってどんなタグについてよく間違えているのか抽出してみた。

##開発環境
macOS Mojave 10.14.5
Python 3.7.3
beautifulsoup4
matplotlib
##コード
実際に書いたコードをこちらに添付する。
コードの中身としては、検索URLベタ書きしてスクレイピングを行うだけの簡単なものになっている。

```getQiita.py
import time
import json
import urllib.request
import numpy as np
import collections
import matplotlib.pyplot as plt
from bs4 import BeautifulSoup

paging = 1
first = 'title:'+'お前ら'
second = 'title:'+'間違っている'
speace = ' '
tagText = []

#検索文字をパース
parseFirst = urllib.parse.quote(first)
parseSecond = urllib.parse.quote(second)
parseSpeace = urllib.parse.quote(speace)

def getSoup(page):
    url = 'https://qiita.com/search?page='+str(paging)+'&q='
    #URL作成
    scrap = urllib.request.urlopen(url + parseFirst + parseSpeace +parseSecond)
    #取得したURLでBeautifulSoupを使う
    soupbase = BeautifulSoup(scrap)
    return soupbase

soup = getSoup(paging)
#webページをタグで検索
itemCount = soup.find("span", attrs= {"class":"badge"})
#ページ数の取得(切り上げ)
maxPaging = -(-int(itemCount.text) // 10)+1

for i in range(paging,maxPaging):
    #ページング用
    paging = i
    soup = getSoup(paging)

    tagList = soup.find_all("li", attrs={"class": "tagList_item"})
    #tagList_itemのテキストを取得
    for tags in tagList:
        tagText.append(tags.text)
    #スクレイピング間隔を開ける
    time.sleep(1)

#取得したタグを降順にソートして10位以上のものを取得
countTags = collections.Counter(tagText).most_common(10)
for k,v in countTags:
    plt.bar(k,v)

#matplotlibを用いて結果のグラフを出力
plt.title('間違えているランキング')
plt.xlabel('登録タグ')
plt.ylabel('登場回数')
plt.show()
```

##出力結果
実行結果は棒グラフとして出力される。
「おまえらの」　「間違っている」をタイトルに含む投稿の上位10タグは以下の通りとなった。
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/426774/5d7558d3-4d91-7188-f5e4-23b96e623723.png)

##感想
~~全然投稿されてない~~思っていたよりも投稿された記事数が少なかったです。 
普段目にしていたのは検索エンジンの方だったのかも知れません。
とりあえず書いて動かしてみただけなので、もっと綺麗な書き方があると思います。

ここはこうした方が良い、コードが汚い等の指摘を頂けると筆者の励みになりますので、ぜひお願いします！
ICPで作業者毎にkubectlのデフォルトのNamespaceを分けたい

IBM Cloud Privateで、Bootノードや運用管理用のサーバーから `kubectl` コマンドを使用していて、その際に複数の作業者がOSユーザーを共有していると、他の人の操作によっていつの間にかデフォルトのNamespaceが書き換わってしまうということが起こります。OSユーザーを分けるとか、Bootノードではなく手元の端末から `kubectl` を実行するとかできればいいのですが、それができない場合にデフォルトのNamespaceを使い分けたい場合のTipsです。

## 課題

ICPでは、`cloudctl login`すると、認証トークンなどがダウンロードされ、`$HOME/.kube/config`に書かれます。

- `mycluster`というクラスターと`mycluster-user`というユーザー情報（クレデンシャル）が作成される
- `mycluster`と`mycluster-user`を参照する`mycluster-context`というコンテキストが作られる
- さらに現在のコンテキストが`mycluster-context`に設定される

```shell-session
$ cloudctl login -a https://mycluster.icp:8443 --skip-ssl-validation -u admin -p admin -c id-mycluster-account -n default
Authenticating...
OK

Targeted account mycluster Account (id-mycluster-account)

Targeted namespace default

Configuring kubectl ...
Property "clusters.mycluster" unset.
Property "users.mycluster-user" unset.
Property "contexts.mycluster-context" unset.
Cluster "mycluster" set.
User "mycluster-user" set.
Context "mycluster-context" created.
Switched to context "mycluster-context".
OK

Configuring helm: /home/isecloud/.helm
OK
$
```

`kubectl`コマンドはこのファイルを見ています。

```yaml:$HOME/.kube/config
apiVersion: v1
kind: Config
preferences: {}
current-context: mycluster-context
contexts:
- context:
    cluster: mycluster
    namespace: default
    user: mycluster-user
  name: mycluster-context
clusters:
- cluster:
    certificate-authority: mycluster/ca.pem
    server: https://9.188.124.130:8001
  name: mycluster
users:
- name: mycluster-user
  user:
    token: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdF9oYXNoIjoiOThiZTMwYjA0MWY0MDRlMDgxMTU5YWRjODY3NjVmNTg1Yzg3OGFmMiIsInJlYWxtTmFtZSI6ImN1c3RvbVJlYWxtIiwidW5pcXVlU2VjdXJpdHlOYW1lIjoiYWRtaW4iLCJpc3MiOiJodHRwczovLzEyNy4wLjAuMTo5NDQzL29pZGMvZW5kcG9pbnQvT1AiLCJhdWQiOiI0MzRkYzNiYTUwY2ExNDcxYTJlODhmNmNlM2MwMjdkMSIsImV4cCI6MTU2MzI3MDI2MCwiaWF0IjoxNTYzMjQxNDYwLCJzdWIiOiJhZG1pbiIsInRlYW1Sb2xlTWFwcGluZ3MiOltdfQ.CwrXfZCEeffl5WJlgcmxUOEpFhaeJgnmedNurDIpQ0b7fUlZTTqVPkimbf9y3VBYGEoJJiPZKW7r7TjT4-uC8X-UwbmaUpEXm8gwaa0tFXG1jj-YuL25wc4NDXU9hZ-ulaM81BDWmwb8mccqmR-1lynV48RMeu_4lva4vTt_VWufKKIqOOpAhNGu2TpItInSm4yboWHYtX3pUi-1XRuLSYZGN_-f98zM2NJZlfa7ngZBFKDx59kveRVMBy4z6zsj7PaXtQAkAdHRWOAQSmZQEXd8M8ujbyjfkKG3nlQIvRuUPbJiZbTDGujlY9IR6yAxlALJOTR5FNn2QOJMBts_qg
```

複数のユーザーが同じOSユーザーで`kubectl`の操作をしていると、同じ`$HOME/.kube/config`を参照しているため、あるユーザーがこのファイルに変更を加えると、例えばデフォルトのNamespaceを書き換えると、他のユーザーのデフォルトのNamespaceも変わってしまいます。

## Tips

`KUBECONFIG`環境変数を使って、`kubectl`が参照する接続情報定義ファイルを変更できます。Namespace毎や作業者毎に例えば以下の様なエイリアスを用意しておくと便利かもしれません。

```shell
alias login-ns1='export KUBECONFIG=~/.kube/config-ns1; cloudctl login -a https://mycluster.icp:8443 --skip-ssl-validation -u admin -p admin -c id-mycluster-account -n ns1'
alias login-ns2='export KUBECONFIG=~/.kube/config-ns2; cloudctl login -a https://mycluster.icp:8443 --skip-ssl-validation -u admin -p admin -c id-mycluster-account -n ns2'
alias login-ns3='export KUBECONFIG=~/.kube/config-ns3; cloudctl login -a https://mycluster.icp:8443 --skip-ssl-validation -u admin -p admin -c id-mycluster-account -n ns2'
```
MySQLのインストールと基本的な使い方

#MySQL
MacでMySQLを扱う方法を紹介していく．
MacOSのバージョンは`10.14.5`で，MySQLのバージョンは`8.0.16`である．

##MySQLのインストール
Homebrewでインストールする．

```Shell
$ brew install mysql
```

上記コマンドが打てたら，MySQLがインストールされていることを確認する．

```Shell
$ mysql --version
mysql  Ver 8.0.16 for osx10.14 on x86_64 (Homebrew)
```
上のようにバージョンが表示されればOK．

##MySQLの起動と接続
インストールが完了したら実際に起動してみる

```Shell
$ mysql.server start
Starting MySQL
.. SUCCESS!
```
上記のようにSUCCESS!と表示されれば起動している．
止めたいときはstop,リスタートしたい場合はrestartとすれば良い．

```Shell
$ mysql.server stop
Shutting down MySQL
.. SUCCESS!

$ mysql.server restart
Shutting down MySQL
.. SUCCESS!
Starting MySQL
.. SUCCESS!
```

起動したら接続をしてみる．

```Shell
$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.16 Homebrew

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql> exit
Bye
```
このように表示されれば接続できている．抜けたいときには`exit`と入力する．

##基本的な操作
まずrootに接続した場合これから使うデータベースを指定しなければならない．
その前にまず，データベースの確認を行う．

###データベースの関連の操作
```SQL
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)
```
自分でデータベースを作成しても，既存のデータベースを使用しても良い．
データベースを作成する場合は，

```SQL
mysql> CREATE DATABASE hoge;
```
で作成できる．また，データベースを削除したいときは，

```SQL
mysql> DROP DATABASE hoge;
```
で削除できる．ただし，確認もなく削除されるので安易に使用しないように．

使いたいデータベースが決まったらそのデータベースへ接続する．

```SQL
mysql> USE hoge;
```
また，現在使用しているデータベースが知りたかったら，

```SQL
mysql> SELECT DATABASE();
+------------+
| database() |
+------------+
| test       |
+------------+
1 row in set (0.00 sec)
```
と入力すると，現在使用しているデータベースの名前が表示される．
どこのデータベースも使用していない場合はNULLとなる．

###テーブル関連の操作
データベースに接続ができたらいよいよテーブルの作成である．

```SQL:example.sql
CREATE TABLE hoge (
foo int,
bar text
);
```
データベース内に存在するテーブルの一覧は以下で取得できる．

```SQL
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| test2          |
+----------------+
1 row in set (0.00 sec)
```
##おわりに
MySQLのインストールから基本的な動作はこれで行えるはずである．
（url）では実際にcsvからデータを読み込み，クエリを実行してみる．
Blenderの使い方！[Xくんへ！]

# はじめに
友達にBlenderどうやって勉強したの？って聞かれたので，最初の面倒くさい導入部分をまとめるよ！

# 環境
Windows 10 pro

# 本題
## インストール！
ここから．https://www.blender.org/download/releases/2-80/
ver2.8
まだベータ版．そろそろリリースらしい．
zipを解凍してexeファイル実行．

## 環境を整えていくよ〜！
立ち上げると最初はこんな画面．
<img width="1372" alt="Screen Shot 2019-07-17 at 0.49.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394152/a44181b8-917d-05ed-4ffa-db8f13261a5f.png">

作業しづらいのでとりあえず4分割画面に．（好みもあるかも）
ショートカットでCtrl+Alt+Q
<img width="1369" alt="Screen Shot 2019-07-17 at 0.52.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394152/a767960c-5361-abe2-69da-bedb0dfca04a.png">

環境整えるところあんまりなかったな...
デフォルトでこの画面にしたかったら， File > Defaults > Save Startup File でできたはず？

## 操作！
移動とかは多分適当オブジェクト触ってたらできるよ〜
とりあえず，以下だけ
- スクロールで拡大縮小
- 右上の3Dウィンドウでスクロールボタン押しながら動かすと見る角度変えられる
- Shiftキー押しながら ＋ スクロールボタン押しながら動かすと視野の位置を変えられる

## オブジェクト追加
左上らへんのAddからできるよ．
<img width="1371" alt="Screen Shot 2019-07-17 at 1.04.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394152/3578ee47-e052-88cb-6e28-b7bedcf1f0f9.png">

## オブジェクト効果
右下のパネルから色々できるよー
色変えるのはこの辺．
<img width="1373" alt="Screen Shot 2019-07-17 at 1.03.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394152/4ffb8629-f693-f05c-96d2-6caade1d05d2.png">

## レンダリング・画像保存
透過処理は右下パネルのrenderタブのFilmってとこのTransparentにチェック
<img width="228" alt="Screen Shot 2019-07-17 at 1.07.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394152/540e8570-da48-497e-1ab3-dab1e07a8e28.png">

F12でRenderできるよー
保存は適当にー
<img width="1367" alt="Screen Shot 2019-07-17 at 1.08.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394152/54b54828-a71a-1e8c-0df0-8ac58f2da52d.png">

## カメラ位置の調整←これめっちゃ大切
普通にカメラオブジェクト動かしてカメラ位置調整めっちゃめんどいんよ〜，，，
そんな時にCtrl + Alt + Numpad 0やると右上で見てる角度と視野(に近い感じ)にカメラ位置を移動してくれるよ〜便利！
- カメラ視野が狭いからちょっと引き気味でやってちょうどいいくらいになるよ〜
- テンキーがないとショートカットできないかもだからそん時はGUIで．
<img width="1152" alt="Screen Shot 2019-07-17 at 1.12.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394152/7eddcac6-f8b1-65c9-e514-f9827d629ec0.png">

近いとこうなるw
<img width="1362" alt="Screen Shot 2019-07-17 at 1.17.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/394152/6732e2cd-0819-f114-133e-59852007c8d2.png">

## python scriptも使えるよ〜！
公式ドキュメント〜
https://docs.blender.org/api/2.80/bpy.ops.mesh.html?highlight=bpy%20ops%20mesh#module-bpy.ops.mesh

# さいごに
わからんとこあったら聞いてー
また暇なときにArrayのやり方とか適当に書き足しとく〜
C++でもNull条件演算子的なことがしたい

# Null条件演算子とは

> Null条件演算子とは、第一項がヌルポインタ (null pointer)でない場合に第二項の結果を返し、そうでない場合にnullを返す演算子である。nullでないことのチェックを回避し、メソッドチェーンやプロパティチェーンを行うために用いられる
https://ja.wikipedia.org/wiki/Null条件演算子

例えばC#の場合は以下のように`?.`演算子を使用する

```c#
Result ｃ = hoge?.piyo()?.foo()?.bar();
```

単なるメソッドチェーンで行う場合は、過程のメソッドでもしnullが返った場合エラーになってしまうのでnullチェックが必要になる。
その場合メソッドチェーンが使用できず、一時変数やif文が大量に入るということだ。
関数にして早期リターンするのが難しい場合はネストが深くなることもあるだろう。

```c#
Piyo piyo = hoge.piyo();
if(piyo != null) {
  Foo foo = piyo.foo();
  if(foo != null) {
  ...
  }
}
```

# C++にはNull条件演算子はない

そんな便利なNull条件演算子であるが残念ながらC++にはない。
なので、先ほどあげたように随時nullチェックをするしかない

```cpp
if (auto * piyo = hoge->piyo()) {
	if (auto * foo = piyo->foo()) {
		...
	}
}
```

ちょっとめんどくさい。

# Null条件演算子的なものを作った

本題。
### 実装
細かい型チェックなどは省いているが、ラムダで遅延評価にしつつ、先にnullチェックだけするようなシンプルなものを作った

```cpp:safe_navigation.hpp
#pragma once

namespace safe_navigation
{
	template<class T, class U>
	auto operator | (T&& p, U&& func)->decltype(func(*p))
	{
		if (!p) {
			return nullptr;
		}
		return func(*p);
	}
}
```

一応これで生ポインタ、スマートポインタは対応できた。
`std::optional`は未対応だが、必要な場合は返り値の型をチェックして`nullopt`を返せばいい

### 使用方法

使いたい時は`using safe_navigation::operator|`をすることで使用できるようになる。

```cpp:main.cpp
int main()
{
	using safe_navigation::operator|;

	Hoge* hoge = nullptr;

	if (auto * foo = hoge
		| [](auto& hoge) { return hoge.piyo();}
     	| [](auto& piyo) { return piyo.foo(); }
	) {
		// foo something
	}

	return 0;
}
```

これでネストが深くなったりチェック用のローカル変数ができることもなくチェックができる
が、う～ん冗長な気もする

### マクロにしてみる
え～い、マクロにしちゃえ～～

```cpp:safe_navigation.hpp
#define SAFE_NAVIGATION(method) [](auto& value){return value. method ;}
#define SAFE_NAVIGATION_T(type, method) [](type & value){return value. method ;}
```
C++11以前はジェネリックラムダが使用できないので、型を明示できるようにもした

```cpp:main.cpp
int main()
{
	using safe_navigation::operator|;

	Hoge* hoge = nullptr;

	if (auto * foo = hoge
		| SAFE_NAVIGATION_T(Hoge, piyo()) // C++11以前
		| SAFE_NAVIGATION(foo()) // C++14以降
	) {
		// foo something
	}

	return 0;
}
```

多少はましになったかもしれない。

# まとめ
- C++でもNull条件演算子的なものが欲しい！！
- ラムダとか使えば無理やりそれっぽいことはできる
正規表現についてまとめ

#正規表現とは
特殊な文字を組み合わせてパターンを作ることで、ある文字列に特定の文字が含まれているかを確認することや、特定の文字を取り除くなどの操作を行うことができます。

##正規表現の記号と意味
|記号|記号の説明            |例    　     |例の説明    　　　  　　　      |
|:----:|:----------------|:------------|:----------------------------|
|.     |任意の一文字     |.+           |任意の文字列と一致                     |
|*     |直線の一文字の0回以上の繰り返しと一致     |ruby*           |rubyもしくはrubyy..と一致                    |
|^     |行の先頭     |^[a-z]           |行頭が小文字のアルファベットと一致                    |
|$     |行の文末     |rb$           |文末がrbと一致                     |
|[]    |[]内の任意の文字と一致     |[a-z]           |小文字のアルファベットと一致                     |
|[^]   |[]内の任意の文字と不一致   |[^a-z]           |小文字のアルファベット以外と一致                     |
|+     |直前の文字の１個以上の繰り返し     |cs+           |CSS..と一致                     |
|?     |直前の文字が0個または１個以上の場合一致     |Windows?           |WindowまたはWindowsと一致                     |
|{}     |{}内の数値の繰り返しと一致     |{n}           |直前の文字のn個の繰り返しと一致                     |
|{}     |{}内の数値の繰り返しと一致     |{,n}           |直前の文字のn個以下の繰り返しと一致                     |
|{}     |{}内の数値の繰り返しと一致     |{m,}           |直前の文字のm個以上の繰り返しと一致                     |
|{}     |{}内の数値の繰り返しと一致     |{m,n}           |直前の文字のm個以上、n個以下のの繰り返しと一致           |
|&#124; |&#124;の直前と直後どれかに一致     |Ruby&#124;Java           |RubyまたはJavaに一致                     |
|()     |カッコ内をグループ化     |-           |-                     |

## 文字を表す正規表現
|記号|意味|
|:---:|:---:|
|.|任意の1文字|
|\d|数字1文字|
|\D|数字以外1文字|
|\w|アルファベット、数字、アンダスコア（ _ ）のどれかの1文字|
|\W|アルファベット、数字、アンダスコア以外の1文字|
|\s|半角スペース、タブ、改行のどれか1文字|
|\S|半角スペース、タブ、改行以外のどれか1文字|
|\t|タブ|
|\r|キャリッジリターン(カーソルを文頭に戻す)|
|\b|単語の境界|
|\文字|特殊文字のエスケープ|

##正規表現の使い方
正規表現をプログラミングする方法は２種類あります。
１、正規表現のパターンを直接指定する**リテラル**を使用する方法
２、**コンストラクタ**を使用する方法

###１、正規表現のパターンを直接指定する**リテラル**を使用する方法
例えば携帯電話番号のフォーマットチェックを行う場合は、以下のように使用します。

```
var phone_number = /^\d{3}-?\d{4}-?\d{4}$/;
```
^\d{3}-?\d{4}-?\d{4}$を先頭から
　1. ^\d{3}
　2. -?
　3. \d{4}
　4. -?
　5. \d{4}$
に分解してみていきます。

1. 先頭が数字が連続して3文字となっているかをチェックします。
2. ハイフンあり・なしどちらで入力されてもいいように、-の後ろに?がつきます。
3. 1とほぼ同じで、数字が連続して4文字となっているかをチェックします。ここは先頭ではないため、^は不要です。
4. 2と同様
5. 1、3とほぼ同様ですが、末尾なので、$がつきます。

###2、**コンストラクタ**を使用する方法
以下のように、RegExpの引数に文字列の正規表現を指定して使用します。

```
var phone_number = new RegExp('^\d{3}-?\d{4}-?\d{4}$');
```

##どちらの方法を使用したほうが良いのか
プログラムの途中で正規表現のパターンが変更される場合や外部から取得される場合は、RegExpコンストラクタを使用するほうが良いとされています。
逆に、正規表現のパターンが全く変わらないのであれば、直接リテラルを使用するほうが良いとされています。
[Swift] UserDefaults使い方(データ保持) - 自作アプリを例に解説

# 挙動
BitflyerLightningで価格取得と注文を行うために`APIKey`と`APISecret`を保存し
**次回以降の起動では再度取得しなくてもいいようにする**
※`UserDefaults`では**アプリを閉じてもデータを保持しておきたい**場合に使用する

### 定義

```AppDelegate.swift
let userDefaultsAPIKey = UserDefaults.standard
let userDefaultsAPISecret = UserDefaults.standard
```

### 保存と同期

設定画面で`APIKey`と`APISecret`をtextFieldに入力させ
Doneボタンを押した時、**保存と同期を行う**

```APISetupViewController.swift
@objc func pushSetupDoneButton(sender: UIButton) {
   //保存
   userDefaultsAPIKey.set(BitFlyer.apiKey, forKey: "APIKey")
   userDefaultsAPISecret.set(BitFlyer.apiSecretKey, forKey: "APISecret")
　　//同期
   userDefaultsAPIKey.synchronize()
   userDefaultsAPISecret.synchronize()
　　//取引画面に遷移
   dismiss(animated: true, completion: nil)
}
```

### 取得

空じゃなければ保存してあるところから取ってくる

```ViewController.swift
if userDefaultsAPIKey.object(forKey: "APIKey") != nil{
            BitFlyer.apiKey = userDefaultsAPIKey.object(forKey: "APIKey") as! String
        }
if userDefaultsAPISecret.object(forKey: "APISecret") != nil{
            BitFlyer.apiSecretKey = userDefaultsAPISecret.object(forKey: "APISecret") as! String
        }
```

# 引用
**・[jbnkk40/use-flyer](https://github.com/jbnkk40/use-flyer)**
**・[UserDefaultsの概要と操作方法(Swift) - Qiita](https://qiita.com/uhooi/items/429cac9b798b9c0937ae)**
JavaScriptでFactory Pattern

# Factory pattern
生成する時、最中などに生成するクラスを決定するデザインパターン。

## 本記事の目的
サーバサイドのNode.jsでDDDで開発したくて、使える自分用のテンプレートとして記述。

## 使いどころ
処理から呼び出している複数のメソッドの中に同じような分岐（if, switch）がでてきて、もう同じものを見たくない時に使えるやつです。

## 免責事項
純粋なFactoryパターンの場合では以下のmainclass.jsは不要だと思います。
こちらはサーバサイドのNode.jsで動かしています。
フロントエンドでは動作確認しておりません。

## お願いごと
間違っている個所などあれば、ご指摘いただければ幸いです。

## Directory
※すべて同じディレクトリ

    index.js　//試す時はこれを実行する
    factoryClass.js
    mainclass.js
    subclass_a.js
    subclass_b.js

## Source

```javascript:index.js
const factory = require('./factoryClass');

// constの部分を差し替えてみると生成されるクラスが違うのがわかる
// const type = "main" 
// const type = "subA"
const type = "subBB"
let name = factory.init(type);
console.log(name.getString());
```

```javascript:factoryClass.js
const main = require('./mainclass');
const subA = require('./subclass_a');
const subBB = require('./subclass_b');

class factory {

    init(type){
        if(type === "main"){
            return new main(type)
        }

        if(type === "subA"){
            return new subA(type)
        }

        if(type === "subBB"){
            return new subBB(type)
        }
    }
}

module.exports = new factory();
```


```javascript:mainclass.js
class mainclass {
    constructor(obj){
        this.obj = obj;
    }

    getString(){
        return "from main obj" + this.obj;
    }
}

module.exports = mainclass;
```

```javascript:subclass_a.js
const main = require('./mainclass');

class subClassA extends main {
    constructor(obj){
        super(obj)
    }

    getString(){
        return "from subClassA" + this.obj;
    }
}

module.exports = subClassA;
```

```javascript:subclass_b.js
const main = require('./mainclass');

class subClassBB extends main {
    constructor(obj){
        super(obj)
    }

    // getString(){
    //     return "from subClassBB" + this.obj;
    // }
}

module.exports = subClassBB;
```

## 動かし方
```cmd:
node index.js
```

## 参考にさせていただいた記事
[デザインパターン「Factory Method」](https://qiita.com/shoheiyokoyama/items/d752834a6a2e208b90ca)