OmniAICreator/Qiita-1.07M huggingface dataset:
kintone-rest-api-client を使ってみた。レコード編その①

新しく[kintone-rest-api-client](https://github.com/kintone/js-sdk/tree/master/packages/rest-api-client)が公開されたみたいなので、 
まずはシンプルなレコード操作を試して使い方などをまとめてみました。
# インストール

`npm install @kintone/rest-api-client`

# セットアップ

```
const { KintoneRestAPIClient } = require('@kintone/rest-api-client');

const client = new KintoneRestAPIClient({
  host: 'https://example.cybozu.com',

  // パスワード認証の場合
  auth: { username: 'username', password: 'password' }

  // APIトークン認証の場合
  // auth: { apiToken: "API_TOKEN" }

  // セッション認証の場合
  // auth: {}
});

```

# レコードの取得（1 件）

```
client.record
  .getRecord({
    app: '100',
    id: '1'
  })
  .then(resp => {
    console.log(resp.record);
  })
  .catch(err => {
    console.log(err);
  });

```

| パラメータ | 型               | 必須 |
| ---------- | ---------------- | ---- |
| app        | 数値または文字列 | 必須 |
| id         | 数値または文字列 | 必須 |

# レコードの登録（1 件）

```
client.record
  .addRecord({
    app: '100',
    record: {
      文字列1行: {
        value: 'test'
      }
    }
  })
  .then(resp => {
    console.log(resp);
  })
  .catch(err => {
    console.log(err);
  });
```

| パラメータ | 型                   | 必須   |
| ---------- | -------------------- | ------ |
| app        | 数値または文字列     | 必須   |
| record     | レコードオブジェクト | 省略可 |

# レコードの更新（1 件）

```
client.record
  .updateRecord({
    app: '100',
    id: '1',
    record: {
      文字列1行: {
        value: 'test'
      }
    }
  })
  .then(resp => {
    console.log(resp);
  })
  .catch(err => {
    console.log(err);
  });

```

| パラメータ | 型                   | 必須   |
| ---------- | -------------------- | ------ |
| app        | 数値または文字列     | 必須   |
| id         | 数値または文字列     | 必須   |
| record     | レコードオブジェクト | 省略可 |
| revision   | 数値または文字列     | 省略可 |

または

```
client.record
  .updateRecord({
    app: '100',
    updateKey: {
      field: '文字列1行',
      value: 'test'
    },
    record: {
      数値: {
        value: '100'
      }
    }
  })
  .then(resp => {
    console.log(resp);
  })
  .catch(err => {
    console.log(err);
  });
```

| パラメータ | 型                                         | 必須   |
| ---------- | ------------------------------------------ | ------ |
| app        | 数値または文字列                           | 必須   |
| updateKey  | 重複禁止フィールドコードと値のオブジェクト | 必須   |
| record     | レコードオブジェクト                       | 省略可 |
| revision   | 数値または文字列                           | 省略可 |

# レコードの削除（複数）

```
client.record
  .deleteRecords({
    app: '100',
    ids: [1, 2]
  })
  .then(resp => {
    console.log(resp);
  })
  .catch(err => {
    console.log(err);
  });

```

| パラメータ | 型                      | 必須   |
| ---------- | ----------------------- | ------ |
| app        | 数値または文字列        | 必須   |
| ids        | レコード ID の数値配列  | 必須   |
| revisions  | revision 番号の数値配列 | 省略可 |

### つづく
【コマンド】全角文字が含まれるファイルのリストを取得するコマンド

あるフォルダの中のファイルで，全角文字が含まれるファイルのリストを取得したい場合に使えるコマンドです．

OSS公開時などにプロジェクトに日本語のコメントを英語化する必要がある場合などに使えます．

# 全角文字が含まれるファイルのリストを取得する
正規表現によってASCII以外の文字を検出することで実現できます．

```
find [検索対称フォルダのパス] -type f | LANG=C xargs grep -n -v '^[[:cntrl:][:print:]]*$' --binary-files=without-match
```

特定の拡張子のファイルのみ対象としたい場合は，以下のようなコマンドを叩きます．

```
find [検索対称フォルダのパス] -type f -name "*.[検索したい拡張子]" | LANG=C xargs grep -n -v '^[[:cntrl:][:print:]]*$' --binary-files=without-match
```
Docker(docker-compose)でCentOS8のコンテナを利用する場合の注意点

# はじめに

ここでは、[Docker(docker-compose)でCentOS8のコンテナを利用する（ERROR: No container found forの解消）](https://qiita.com/You_name_is_YU/items/f44eef8c2bdeaac789bc)のCentOS8のコンテナを利用しようとした場合に、注意した方がいいなと感じた点をメモとして残します。

# Failed to set locale, defaulting to C というエラーが出る

上記エラーについては、Vagrantなどで構築するVMのCentOS8であれば、`dnf install -y langpacks-ja`のパッケージをインストールすることで解消します。
しかし、Dockerコンテナの場合、私が試した限りでは`export LC_ALL=C`を実行して環境変数`LC_ALL`に`C`をセットすることで解消しました。

localeの設定は基本的には`localectl`コマンドを利用して設定すると思います。（`LC_ALL`はlocalectlではなく環境変数で設定するのですが。。。）
ですが、DockerのCentOS8のコンテナでは、`localectl`や`systemctl`コマンドが使えません。

# systemctlやlocalectlコマンドが利用できない

DockerのCentOS8のコンテナでは、以下のように`systemctl`や`localectl`のコマンドが正常に動作しない。
そのため、CentOS8の環境を色々といじってみたいというような意図でDockerを利用するのは注意が必要だ。
この辺のエラーが出て、CentOS8をただ単に触りたいという思いを優先するため、VagrantでCentOS8の環境を用意して触るようにしましたw。
[Vagrantを使ってCentOS8の環境を立ち上げプロビジョニングによって日本語開発環境として成立させる最小構成](https://qiita.com/You_name_is_YU/items/6b350f99fb90dd4baf3a)

```shell-session
# localectl 
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to create bus connection: Host is down

# systemctl
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
```
mysql ユーザー権限変更

MySQLのユーザー権限の変更について書いていく｡

##ユーザー確認
MySQLにログイン後
まず､ユーザーを確認する｡

ただし､権限のあるユーザーで行う必要がある｡

```
select host, user from mysql.user;
```
これで､hostとuserの一覧がわかります｡


##ユーザーの権限

ユーザーに設定されている権限を確認する

```
show grants for ユーザー名@ホスト名;
```

新しく作成したアカウントの権限を確認すると､

```GRANT USAGE ON *.* TO `ユーザー名```

となり､何も権限がない事がわかる｡


####グローバル権限

```
grant create on *.* to ユーザー名@ホスト名;
```

####データベースレベルの権限

```
grant create on [database名].* to ユーザー名@ホスト名;
```

####テーブルレベルの権限

```
grant select on [database名].[table名] to ユーザー名@ホスト名;
```

####カラムレベルの権限

```
grant select (カラム名) on [database名].[table名] to ユーザー名@ホスト名;
```

####すべての権限

```
grant all on *.* to ユーザー名@ホスト名;
```



以上の権限付与の設定ができるようです｡

ユーザーの権限は
```show grants for ユーザー名@ホスト名;```
で確認してください｡

場合に応じて､ユーザーの権限を付与する際に参考になればいいなと思います｡
実務経験無しの私がRailsで「アイデア投稿サービス」をリリースしてみた

2019/12/21からRailsを使ってオリジナルのwebサービスを開発し始め、2020/1/4にリリースしました。
実務経験の無い私が、独学+スクールで培ったスキルで制作しておりますのでどうか温かい目で御覧ください...


# 制作したWEBサービス
実際に制作したものがこちらになります。

**https://ideaspace-net.com**
![4557bbcb7649a6236d672c9ce5136dd8.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528941/bf20b120-0b6f-e947-be3b-f61d8f05b121.gif)

サービス名は「ideaSpace」で、普段の生活の中で思いついたアイデアをSNS感覚で気軽に「投稿」＆「共有」できるWEBサービスです。

## 何故このサービスを作ったのか？
私含め、個人で何か開発しようと考えた時に、良いアイデアが中々浮かばず悩まされる人って結構多いと思うんです。

そこで、
**「アイデアはあるけど個人の力で実現するのは難しい...」**という人と、
**「実現する力はあるけどアイデアが思い浮かばない...」**という人の両方が活用できるサービスを作ろうと思い、今回アイデア投稿サイトである「ideaSpace」を制作しました。

## 開発環境
*フロント*
Haml / Sass / JS / jQuery
*バックエンド*
Ruby / Ruby on Rails
*データベース*
MySQL
*インフラ*
AWS / nginx / Unicorn / Capistrano


## DB設計
![ideaspace-er.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528941/10f26bc2-dc18-0d67-572b-9badcb8bb879.png)


## 競合となるサイトとの差別化
制作しようと決意してから、同じようなコンセプトのサイトがないか検索したところ、いくつかヒットしました。

まず企業が運営しているこちらのサイト
**[Blabo!](https://bla.bo/)**
<img width="1440" alt="スクリーンショット 2020-01-06 0.52.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528941/e4a2c307-6b5f-6647-e052-77037cb8b73a.png">
こちらのサイトもアイデアを投稿できるサイトですが、特徴的なのは企業や個人から依頼が届き、それに答える形でアイデアを提供するサービスとなっています。
そのため、アイデアをジャンル問わず自由には投稿できないようです。
<br>


次に、個人で運営されていた（現在はアクセスできない）サイトで、
**[HIRAMEKI CAFE](http://kami30k.hateblo.jp/entry/2014/06/11/190911)**というサービスが見つかりました。

アクセス出来なかったので実際に確認はできていませんが、制作者のページを見る限り自由にアイデアを投稿することができ、さらにコメントやグッド（いいねのようなもの）をつけて盛り上がることができるサービスらしいです。
<br>

この２つのサービスと差別化を図る為に、以下の4つを主に重視してサービスを制作しました。

***ジャンル問わず自由にアイデアを投稿できる***
![e7eb6946ea0bdec039071ff2b5273246.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528941/66fcbd61-e65d-0f8f-c546-125a0df2ff95.gif)

---

***コメント、いいね機能は勿論、フォロー機能も加えユーザー同士の繋がりを意識する***
![073bae64742d189af08060adb5ea5d0f.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528941/7fb849ed-2620-f5cf-45a0-3137ca3ef6f8.gif)

---

***検索機能などを付け加えて、いいね順やコメント数順、カテゴリ検索などを行えるようにする***
![e294f09abdeb3aef416cddaebdcd49ee.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528941/69c7c2db-911b-4f98-5c10-90bde2d61483.gif)

---

***なるべくフラットデザインを意識して無駄なビューは省く***
![699ea55415d259b133614b36d09132d5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528941/532c81f7-5f28-87a5-d176-4e340523f430.gif)


## 最後に
制作期間は2週間で、開発を急ぎで進めたので現状は必要最低限の機能しか揃っていない状態です。
（投稿、コメント、いいね、フォロー機能など。）

今後は管理画面を制作したり、DM機能を実装したりなど徐々に機能を増やしていきながら運用していこうと思います...!
最後までご覧いただきありがとうございましたm(_ _)m！！
Vagrantを使ってCentOS8の環境を立ち上げプロビジョニングによって日本語開発環境として成立させる最小構成

# Vagrantを使ってCentOS8の環境を立ち上げプロビジョニングによって日本語開発環境として成立させる最小構成

内容としては[Vagrantを使ってCentOS7の環境を立ち上げプロビジョニングによって日本語開発環境として成立させる最小構成](https://qiita.com/You_name_is_YU/items/96db2d2c60a830709bdb)のCentOS8版です。
CentOS8を触ってみたくて、DockerでCentOS8の環境を利用しようとしたとき、`systemctl`とか`timedatectl`のコマンドが利用できないことがあったので、まずはVagrantでCentOS8を用意しようと思い立ち、せっかくなのでQiitaにまとめました。

## 環境情報

- Vagrant 2.2.6
- CentOS 8

## ローカルのディレクトリ構成

```shell-session
.
├── Vagrantfile
└── provision.sh
```

## 各ファイルの中身

### Vagrantfile

```shell
Vagrant.configure("2") do |config|
  config.vm.box = "centos/8"
  config.vm.network "private_network", ip: "192.168.33.10"
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
  end
  config.vm.provision :shell, :path => "./provision.sh", :privileged => true
end
```

### provision.sh

CentOS8では、`dnf(yum)`のupdateで以下のエラーが出てしまいます。

```
default: Failed to set locale, defaulting to C
```

これを解消するために、`langpacks-ja`もプロビジョニングで最初にインストールします。

```shell
#!/bin/sh

systemctl stop firewalld
systemctl disable firewalld

timedatectl set-timezone Asia/Tokyo
localectl set-locale LANG=ja_JP.UTF-8
source /etc/locale.conf

# langpacks-jaは以下のエラーが出るため必要となるパッケージ
# default: Failed to set locale, defaulting to C
dnf install -y langpacks-ja
dnf install -y vim

# Vagrantfileにsync_folderを指定するとCentOS8でエラーになったので解消するための以下を追記
dnf install -y elfutils-libelf-devel
dnf -y update
```

## vagrant upして色々確認してみる

起動後にvagrant sshで接続し、状態を確認してプロビジョニングが適用されていることが確認できました。

```shell-session
$ vagrant up
$ vagrant ssh

$ cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core) 

$ timedatectl status
               Local time: 月 2020-01-06 07:38:23 JST
           Universal time: 日 2020-01-05 22:38:23 UTC
                 RTC time: 日 2020-01-05 22:38:21
                Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

$ localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: us
      X11 Layout: n/a
```
アナ雪のメロディーに合わせた Golang の歌 - Write in Go - が最高すぎる


[Write in Go - YouTube](https://youtu.be/yhC-361QGJw)

> The schedule's tight on the cluster tonight
> So I parallelized my code
> All these threads and continuations
> My head's going to explode
> And all this bolierplate
> This FactoryBuilderAdapterDelegatelmpl...
> Seems unjustified
> Give me something simple
> Don't write in Scheme
> Don't write in C
> No more pointers
> That I forgot to `free()`
> Java's verbose
> Python's too slow
> It's time to know
> Write in Go!
> Write in Go!
> No inheritance anymore
> Write in Go!
> Write in Go!
> There's no `do` or `while`, just `for`
> I don't care what your linters say
> I've got tools for that
> The code never bothered me anyway
> 
> It's funny how some features
> Make every changes seem small
> An the errors that once slowed me
> Don't get me down at all
> 
> It's time to see what Go and do
> 'Cause it seems too good to be true
> No long compile times for me
> I'm free!
> Write in Go!
> Write in Go!
> Kiss your pointer math goodbye
> Write in Go!
> Write in Go! 
> Time to give GC a try
> I don't care if my structures stay
> on the heap or stack
> 
> My Program spawns its goroutines without a sound
> Control is spiraling through buffered channel all around
> I don't remember why I ever once subclassed
> I'm never going back
> My test all build and pass
> Write in Go!
> Write in Go!
> You won't use Eclipse anymore
> Write in Go!
> Write in Go!
> Who cares what Boost is for?
> I don't care what the tech leads say
> I'll rewrite it all!
> Writing code never bothered me, anyway
【形式手法】すごく分かりやすい資料があった

# すごく分かりやすい資料があった
　「フォーマルメソッド導入ガイダンス」をざっと読み流すつもりでしたが、それでもなかなかのボリューム感がありました。そろそろプログラム触ってみたいと思っていたところ、導入としてすごく分かりやすい資料を発見。作成日も新しい。知りたかったことが、ずばりとまとめられている。嬉しい。とっかかりの人は、この資料から入ると分かりやすいと思います。

- [形式手法について調べてみた](https://builderscon.io/builderscon/tokyo/2019/session/e14fce7f-7ccc-42e5-b240-062e8719fa83)
- [形式手法を使って発見しにくいバグを一網打尽にしよう（動画）](https://youtu.be/D7GccAn6R94)

　ほかにも良い資料・サイトをご存知の方がいらっしゃれば、教えていただければ幸いです。

## やはり使いどころが難しい

　感想としては、形式手法を適用するコストはやはり高く、システム全体に適用するのは現実的ではなさそう。
効果的な箇所に絞って適用するのが良いと思いました。方向性としては、以下のような箇所でしょうか？

- 制御・状態遷移が複雑で、多様な使われ方をするプログラム　→　品質確保が難しそう
- 品質リスクの大きいプログラム　→　品質確保のコスパが高そう
- 他のシステム・プログラムから共通して使用されるプログラム　→　使用頻度が高く、品質確保のコスパが高そう
- 他のプログラムとの境界が明確　→　定義しなければならないルールの範囲が明確

　具体的にいえば、以下のような箇所が良いという印象です。

- フレームワーク
- 共通部品
- API

# 確かに、対象ドメインの知識が必要そう。ハードルが高い
　上記の資料のなかに、形式手法を認証制御に適用検証した事例がありました。
まさにこういう箇所が、適しているという感想です。

　認証制御は私も実装したことがありますが、制御が結構複雑です。全体の制御をきちんと理解して、神経をはりめぐらせていないと、いろんな落とし穴にはまってしまいます。
例えば、管理者が一人しかいない状況で、その管理者がパスワードを忘れるとシステム全体として詰んでしまいます（パスワードを再設定できるのは管理者だけだが、その管理者がいない）。
　こういった仕様バグを抽出するには、制御の全体が分かる人が頭の中で「困ったことが起こらないか」を考えていくしかありませんでした。うまくバグを抽出できるかはその人次第になります。チェックリスト等を作ったところで抽出することはできません。形式手法が適していそうです。

　これを形式手法で定義していくためには、まず「利用者がパスワードを忘れる」という状態を思いつく必要があります。システムの外側（人間側）にある状態なので、認証制御の開発・運用の経験がないと考慮がもれてしまいそうです。
「形式手法の適用には対象ドメインの知識が必要」というのは、こういうことなのかと腹に落ちました。ハードルが高い……。

# いや、そろそろプログラムに触りたくね？

　と、感想ばっかり書いても仕方ないので、プログラムにもう触ります。
　でも仮説をもって技術に触れるのは、検証の観点も明確になっていいことだと思う……という言い訳。
　自分の妄想がどこまであっていたか、プログラムに触りながら答え合わせをしていきたいと思います。
Web Developer Roadmap 2020 が公開されたので解説する

Web Developer Roadmap 2020 が 1月4日 に公開されました。

# Web Developer Roadmapとは

たくさん覚えることがあって、何から勉強していいか分からない人向けに
「この技術をこの順番に学習していくと良いよ」
みたいなことを纏めてくれているサイトです。

https://roadmap.sh/frontend

# 結論

細かい比較や解説はいずれ誰かがやってくれると思うので
簡潔に知りたいひと向けに解説すると

Web Developer Roadmap に則ると、2020年は

- React
- Next.js
- TypeScript

そして

- Web Components

を学習するのが良いんじゃないかなと思います。

# 理由

前年と比較すると追加された項目は

- Web Components
- Web Security Knowladge

ぐらいで、
その他は、元々ロードマップに含まれていたが、非推奨になったものが多かった印象です。

例えば
`Type Checkers` では `Flow` が非推奨となり
`Server Side Rendering` では `After.js` が非推奨となったため、
TypeScript 及び Next.js が一強となりました。

## 前年と比較

### TypeScript

![スクリーンショット 2020-01-06 5.21.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124296/86811f92-d37c-adf7-2093-02299c31e98b.png)

### Server Side Rendering

![スクリーンショット 2020-01-06 5.21.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124296/f956dd66-6408-d94d-0344-64cbbb5252da.png)

※グレーアウトは「非推奨」という意味

## React × TypeScript

State of JS 2019 の結果からみても
React × TypeScript はメインストリームであることに間違いありません。
※全ての案件で React × TypeScript 一択という意味ではありません

個人的には、 `create-react-app` であれば
コマンド一発で React × TypeScript の雛形が作れるので
まずはそこから始めるのがよいんじゃないかなと思います。

```hash
# React × TypeScript の雛形が作られる
npx create-react-app my-app --template typescript
```

https://create-react-app.dev/docs/adding-typescript

## Web Components

ただまあ、 React × TypeScript だけを学習するんじゃ芸がないんで
今年新しく追加された項目 `Web Components` も学習していくのが
いいんじゃないかなと思います。

![スクリーンショット 2020-01-06 4.03.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124296/6e550479-02b5-6cc0-8af0-2aa269233033.png)


Web Components とは、ブラウザ標準で搭載されている
オリジナルのHTMLタグを作成したり、カプセル化したりする技術の総称です。

まだ賛否ありますが
非常に再利用性の高いコンポーネントを作成することができます。

※React で Web Components を使うこともできます
https://ja.reactjs.org/docs/web-components.html

## Apple Music でも Web Components が使われている

ちなみに、昨年9月に公開された Apple Music の Web版でも
Web Components が使われているので、世界的な企業も関心を寄せていることが分かります。

![スクリーンショット 2020-01-06 0.54.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124296/e55f28fd-d0e3-bb26-70b3-6e21ba9f7ce2.png)

※ `shadow-root` は Shadow DOM を使っていることを意味します

この先どうなるかは分かりませんが、
Web標準とされる機能を学習することに無駄はないと思います。

# まとめ

Web Developer Roadmap に則ると、2020年は

- React
- Next.js
- TypeScript
- Web Components

を学習するのが良いと思われるという話。

ちなみに、 今週の「土曜日のフロントエンドエンジニア」は
その Web Components で実際に簡易アプリを作っていきますので
チャンネル登録をしてくれると飛んで喜びます:relaxed:

動画解説版： https://youtu.be/rlA6NXmJPxU
2020年始に確認した、Mapbox さんがベクトルタイル仕様のオープン性について言っていること

[vector-tile-spec](https://github.com/mapbox/vector-tile-spec)のオープン性について Mapbox さんがおっしゃっていることを改めて確認してみました。

### [https://docs.mapbox.com/vector-tiles/reference/](https://docs.mapbox.com/vector-tiles/reference/)

> Vector tiles are an open standard under a Creative Commons Attribution 3.0 US License. We support vector tiles across our products and there is a large list of vector tile implementation by other vendors.

> Read the Mapbox Vector Tile Spec on GitHub and get in touch with us there with feedback and improvements.

- CC-BY の **オープンスタンダード** である。
- 自社プロダクトでサポートしている。
- 他のベンダによる実装のリストがある。
- GitHub レポジトリを読め。

ということをおっしゃっていますから、GitHub レポジトリのほうも読んでみます。

### [https://github.com/mapbox/vector-tile-spec](https://github.com/mapbox/vector-tile-spec)

> The text of this specification is licensed under a Creative Commons Attribution 3.0 United States License. However, the use of this spec in products and code is entirely free: there are no royalties, restrictions, or requirements.

- この仕様のテキストは **CC-BY** である。
- この仕様の利用は完全に自由である。すなわち、**ローヤリティ、制限、要求はない**。

その他、よりカジュアルなチャンネルではもう少しディテールが語られているところもあったかもしれませんが、公式性の高いチャンネルでは、上記のようなことをおっしゃていると理解しています。ナイーブな考えに基づいてこうなっているというよりは、深慮と経緯があって、このような形に落ち着いていると理解しています。（例えば、GeoJSON や GeoJSON Text Sequence は RFC になっています。）オリジネータの意向は尊重しながら、技術の発展をうまく進めていきたいと私は思っています。
最新の Python を Mac にインストールする方法

Python のバージョン管理（ 使い分け ）には [pyenv](https://github.com/pyenv/pyenv) を使うのが、定番のようですが、

基本的に、最新のものしか使わないのであれば、[Homebrew](https://brew.sh/) でインストールして、管理してしまうというのもアリなのではないでしょうか？

仮に、特定のバージョンの Python 環境が必要になった場合には、[Docker](https://www.docker.com/) を利用するのがオススメです。

https://qiita.com/normalsalt/items/9c10b2e046a5c103f626

Docker さえ使いこなせれば、どんな環境でも必要に応じて使い分けられますからね。

```
% docker run --rm python:2 python -V
Python 2.7.18
```

:::note info
ちなみに、M2 MacBook Pro[^1] にプリインストールされていた Python のバージョンは、以下の通り。

[^1]: [MacBook Pro (14-inch, 2023)](https://support.apple.com/kb/SP889?locale=ja_JP)・macOS Ventura 13.3.1

```
% python3 -V
Python 3.9.6
```

次の PATH にあるようなので、一応、覚えておきましょう。

```
% which python3
/usr/bin/python3
```

もしかすると、何らかのエラーを解決するために、デフォルトのものを使うように気を遣わなければならない場合などもあるかもしれません。
:::

というわけで、次の記事で「 最新の Git を Mac にインストール 」した時と同様に、

https://qiita.com/normalsalt/items/f200ba50363ebfd46df0

次のコマンドを実行して、インストールしておけば、

```
% brew install python
```

以後、バージョンを上げる際には、次のようなコマンドを実行するだけで、簡単にアップグレードできます。

```
% brew upgrade python
```

:::note info
Homebrew のインストールについては、公式サイトを参照してください。

https://brew.sh/

今回、利用した Homebrew のバージョンは、以下の通りです。

```
% brew --version
Homebrew 4.0.16
Homebrew/homebrew-core (git revision 15bc37bb1ce; last commit 2023-02-17)
Homebrew/homebrew-cask (git revision b17568b22a; last commit 2023-02-17)
```

ちなみに、次のコマンドを実行すれば、Homebrew 自体をアップデートできます。

```
% brew update
```
:::

ただし、インストールした直後だと、新しい方の Python は、まだ認識されていないかもしれないので、ターミナルを再起動するか、新しいウィンドウを開くか、

あるいは、次のようなコマンドを実行するなどしてみてください。

```
% exec $SHELL -l
```

これで、改めてバージョンを確認してみれば、ちゃんと新しくなっているはずです。

```
% python3 -V
Python 3.11.3
```

:::note info
また、以下のコマンドを実行するなどして PATH を追加しておけば、`python` や `pip` などのシンボリックリンクも利用できるようになるので、便利かもしれません。

```
% echo 'export PATH="$(brew --prefix python)/libexec/bin:$PATH"' >> ~/.zshrc
% source ~/.zshrc
```

これで、`python3` と書かなくても `python` だけでコマンドを実行できます。

```
% python -V
Python 3.11.3
```

Homebrew と Python の詳細については、次のページを参照してください。

https://docs.brew.sh/Homebrew-and-Python
:::
OCIで(Always Freeなどで)「Out of host capacity.」が出た時には、時間をおいてから再トライ

# 概要

タイトルの通りのエントリです。

# 事象

Oracle Cloud Infrastructure(以降"OCI")で、「コンピュート・インスタンスの作成」を実施する場合で、仮想マシンの各種設定をして「作成」ボタンを押したときに下図のようなエラーメッセージ「Out of host capacity.」が表示されることがありました。

![oci-inst-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/62c8ab8d-b075-9456-0808-9380c23389aa.png)

上のエラーメッセージが表示されたのは、2020年1月頭のJapan East(Tokyo)リージョンで作業した場合の例です。

# 原因

Oracleのサポートサイトで同じ文字列で検索すると、同じ内容で質問をしているものがありました。

- [unable to create instance Out of host capacity.](https://cloudcustomerconnect.oracle.com/posts/f9526da547)
- [Out of host capacity](https://cloudcustomerconnect.oracle.com/posts/657117a494?commentId=295680#295680)

Free Tier用のインスタンスのキャパシティを超えている場合に出るエラーのようです。

# 対応

しばらく待ってから再トライしてみることにします。

# 補足

## OCIのホームリージョン

OCIでは、世界各地に[「リージョン」](https://docs.oracle.com/cd/E97706_01/Content/General/Concepts/regions.htm)があります。アカウント作成時、ホームリージョンとしてそのうちの一つを選ぶことになります。

[「Always Free」](https://www.oracle.com/jp/cloud/free/)の無料サービスを使えるのは、この[ホームリージョンのみとなる点に注意](https://blogs.oracle.com/otnjp/en_article_03)が必要です。

![oci-out-of-resource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65002/98f476b0-de40-3068-8d5e-50120d905518.png)
AWS Elastic Beanstalk-なぜコマンドにleader_onlyを使用するのですか？

https://ja.programqa.com/question/19754812/
> 技術的な観点から見ると、Elastic Beantalkは自動スケーリンググループであり、何かをデプロイする場合、複数のec2インスタンスでコマンドを同時に実行できる可能性があると想定する必要があります。
> 
> leader_onlyオプションの主な目的は、コマンドが1つのec2インスタンスでのみ実行されるようにすることです。 db移行スクリプトの実行、dbの作成など、1つのec2で一度だけ実行する必要があるユースケースに役立ちます。そのため、 leader_onlyは単なるマーカーであり、一部のコマンドはこのインスタンスでのみ実行されます。
> 
> ただし、リーダー属性は環境の作成時に一度設定され、リーダーが死亡し、自動スケーリンググループにリーダーがいないときに新しいインスタンスの可能性のある状況に置き換えられた場合に備えて設定する必要があります。
自作プロトコルマークアップ言語　vmmj言語の紹介

#前回シールド言語の評価が良かったのでそれのサブ言語としてプロトコルとデータ記述用言語があれば便利がいいと思い作ってみました。
名前は**VMMJ言語**です。暗号化すると**VMMJS言語**となりインタプリタにより解読されます。

```ex.vmmj
<@ コレハコメントデス@>
@コレモコメントデス
Includes !vmmjs://#aegialina/lang/shield/dats/vak <@ Includes !vak_freamworkでもOK@> @既にタグが定義されている
Includes !vmmjs://#aegialina/lang/shield/dats/withshield <@ Includes !vak_shield_coreでもOK@>
Call 始めよう -newGls
ecro !コレハテストデス
give with Get_Dir !Vak.shie begin
set width,height to 797,931 @データ受け渡しset 名前 to 数値 空リストを渡すときはset 名前 to ,
set sizeini to Nil
end
<@主な演算子vmmjsにおけるもの(他言語におけるもの) 
set~to(代入) eq(==) add(+) addto(+=) pull(-) pullto(-=) prod(*) prodto(*=) div(/)divto(/=) pow(べき乗) powto(べき乗=)
noeq(!=) gt(>) gteq(>=) lt(<) lteq(<=) and(and/&&) or(or/||) xor(xor/^^) not(not/!) 
シールド言語よりも少なめなので覚えやすい@>
@データ作成
set dats 1
set dats2 !Fine @文字列
plus
set A to Red.ads #adsで自身の名前を取得
get A #!Red
van Lists(to 40) @40ノリスト空の場合 make List(要素最小値 to 要素最大値) as 型名(List(デフォルト),Tuple等) 初期値 to 最終値
set That For lst in Lists to Nil
set Tuples to Nil @空オブジェクト
set Tuples to van T(10 to 40) as Tuple @後から入れることも可能
@主な型Integer,Boolean,Character(0以上の数),String,Double,Object,Variant,List,Tuple,Array,Type_Nil(基本は省略可能限定時は必要)
@if関数
set dats to If dats2 eq !Fine Then 3 Elseif dats 2 Then 5 Else Then !Ham end
@for関数
set Lists(That) For i in nList(5) to If i is dats Then True else Then False end next
@こちらを推奨
=>set Lists(with 5 do i) i is dats when True default False next
@zip set start 値 with 値 set step 値モアル
@while関数 
set i to 0
set 値 to While Lists(i) is not True Do pass Next else ret i End
[!My_shield_core](!vmmjs://#aegialina/lang/shield/dats/withshield)
[!Window Title]<!Vak.shies`title>
fun Myfun -Gls,a begin @最初必ず制御文を確認するタメ-NewGlsガヒツヨウ
-Gls ret a add 5
end fun
def Newtag has protocol is option attribute is Nil @タグノサクセイ
Newtag !新しいタグ
def Newtag2 has protocol is option attribute eq has_end @タグノサクセイ
Newtag2 begin
	!新しいタグ
Newtag2 end 
Newtag2 begin !新しいタグ Newtag2 end @一行で書くこともできる
Call 終わろう -newGls
def Newtag3 has protocol is option attribute set restriction to value is gt 5
van ListA(to 30)
set ListA(with 30 do i) when RNDFLT() * 10 next @10以下の浮動小数点
ecro ListA as L do when L is #Newtag3 next @ハッシュタグ(中に条件つきタグを入れることができる)when前置き表記
ecro ListA(#Newtag3) @上と同じ結果になる。
```

見てわかると思うのですが,全てはタグ,コマンド,関数でできているため,非常に分かりやすいですよね。簡易xmlとしても機能します(htmlに対するMarkdown)。シールドスクリプトに埋め込んでメイン処理をシールド言語側で処理させることもできます。簡易処理を書くことができるのも長所です。

#var0.1
getコマンドを許可しました(安全に処理が可能です)。
Windows10でキーボードの無変換と変換を変更し、かな入力切り替えをmac仕様にする

いちいちキーボードの左上の半角全角キーに手を伸ばして入力方式を変えるのは面倒ですよね。確認もできないですし。
なので、文章入力時にmac方式にしてしまいましょう。
スペースキーの左右に配置されている無変換と変換を入力切替に使います。
![Inkedfullkeybw_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/69f8ab29-1d42-09cc-f774-d77c712b183d.jpeg)

無変換を押したときに英数字入力に
変換を押したときに日本語入力になればよいです。

まず、文章を入力しているとき画面下側のメニューバーの右に出てくる
「あ」もしくは「A」のマークをを右クリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/5eee083d-f7e1-6706-6557-115c7567e543.png)

するとこのようなものが出てくるのでプロパティをクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/9792febe-23fe-a2e8-cbdf-430c250caad4.png)
すると、IMEの設定というものが出てくるので詳細設定をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/5e1029e9-0995-ce85-4833-44cd88ac56b7.png)
ここから無変換と変換が押されたときの動作を変更します。
まず、「無変換」キーの「入力/変換済み文字なし」の部分をダブルクリックして「IME-オフ」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262130/d82e985d-68e9-1480-11ce-a6e4439a8609.png)
次に「変換」キーの「入力/変換済み文字なし」の部分をダブルクリックして「IME-オン」を選択してください。
そして適応をすると押しただけで変更できます。

下記サイトを参考にさせてもらいました。
https://webph0t0.exblog.jp/24595420/
各種 IaC ツールアップデート方法

## 目次

 * Terraform
 * AWS CLI
 * k9s

（以下は今後各予定）
  
 * Ansible
 * Azure CLI
 * GCP gcloud CLI
 * Chef

## Terraform アップデート方法(tfenv インストール済みの場合)

・最新版インストール方法

```
$ tfenv install latest
```

・現在選択中のバージョン確認

```
$ tfenv list
* 0.12.18 (set by /c/Users/harashun/.tfenv/version)
  0.12.16
```

## Terraform アップデート方法（公式サイトからダウンロードする方法）

下記サイトからダウンロードし、パスの通った場所に配置

[Download Terraform - Terraform by HashiCorp](https://www.terraform.io/downloads.html)


## AWS CLI アップデート方法

下記サイトからインストーラーをダウンロードし、実行

[AWS CLI バージョン 1 のインストール - AWS Command Line Interface]
(https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv1.html)

▼ Before

```
$ aws --version
aws-cli/1.11.154 Python/2.7.9 Windows/8 botocore/1.7.12
```

▼ After

```
$ aws --version
aws-cli/1.16.310 Python/3.6.0 Windows/10 botocore/1.13.46
```

## k9s アップデート方法（※Linuxbrewインストール済みの場合）

・アップデートコマンド

```
$ brew upgrade derailed/k9s/k9s
```

▼ Before

```
$ k9s version
 ____  __.________       
|    |/ _/   __   \______
|      < \____    /  ___/
|    |  \   /    /\___ \ 
|____|__ \ /____//____  >
        \/            \/ 

Version:  0.9.3
Commit:  XXX
Date:  YYY
```

▼ After

```
$ k9s version
 ____  __.________       
|    |/ _/   __   \______
|      < \____    /  ___/
|    |  \   /    /\___ \ 
|____|__ \ /____//____  >
        \/            \/ 

Version:  0.11.0
Commit:  XXX
Date:  YYY
```

## 参考記事

[tfenvでTerraformのバージョン管理をする - Qiita](https://qiita.com/kamatama_41/items/ba59a070d8389aab7694#tfenv-installuninstall)
【機械学習】Turi Createのインストール

環境メモ
⭐️Mac OS Mojave バージョン10.14

Anacondaで作成した仮想環境で、Turi Createをインストールする
（前提として、Anacondaで仮想環境をOpen Terminalを選択し、ターミナルを起動する）


【機械学習】Anacondaのインストール
https://qiita.com/nonkapibara/items/1333a1b1b31259c3dd6c

【機械学習】Jupyter Notebookのインストール
https://qiita.com/nonkapibara/items/64251fb68ebf8cc479af


事前に、Turi Createの最新バージョンを確認する

Turi Createの最新バージョン
https://github.com/apple/turicreate/releases

2020.01時点の最新バージョンは、Turi Create 6.0

<img width="951" alt="028 Turi Create.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/4488bb75-741e-6a2d-7d77-001f42f0e004.png">

Turi Createのインストールコマンド
バージョンを指定してインストールする

```
pip install -U turicreate==6.0
```

<img width="450" alt="029.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/8c0b63d8-5468-47e7-4908-0e274e6ce5c1.png">

完了！！
【機械学習】Jupyter Notebookのインストール

環境メモ
⭐️Mac OS Mojave バージョン10.14

Anacondaで作成した仮想環境で、Jupyter Notebookをインストールする
（前提として、Anacondaで仮想環境をOpen Terminalを選択し、ターミナルを起動する）

【機械学習】Anacondaのインストール
https://qiita.com/nonkapibara/items/1333a1b1b31259c3dd6c


Jupyter Notebookインストールコマンド

```
conda install jupyter
```

<img width="574" alt="024 JupyterNotebook.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/5043ecc2-cce7-eb78-ca63-2e7d7eef126a.png">

インストールが開始する
<img width="499" alt="025.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/a6c273ce-6d2e-ccb8-14b5-93285de772d0.png">

Proceedが出るので「y」で進む。
<img width="490" alt="026.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/aa78d419-8e36-0f54-9bd5-e46ec53ca823.png">

<img width="565" alt="027.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/bbe2bfd1-3f22-59cf-4181-b1c09e31c8ad.png">

インストール完了
【初心者】Java　変数／論理演算子／拡張for文【備忘録２２】

##12月中盤でしていたこと
###Webページ初作成
html/css,java script,jQueryの学習が一段落したので
一度自身のプロフィールや、今までの仕事の事、周りの事をまとめた
Webページを作成しました。簡単なページになるのですが
初めてということで3週間ほどゆっくり時間を使いました。

hoverやアコーディオンを使いながら、作成したが
アコーディオンに少し苦戦したので、また作成する際は必ず
使うようにし、慣れるよう心掛ける。

次はアプリを作れるよう、Javaの学習を進めていく。

##Java
###メソッド／出力

基本の書き方が決まっており、クラス部分の中にメソッド部分があり、その中で
出力を行う形となっている。

```java

System.out.println("出力したい数値");

```

上記が出力部分の書き方。
数値は数式には""は不要！！（付けてしまうと文字列として判断してしまう。）


###変数

基本的にデータ型＋変数名で構成される。
変数＝値（データ）を入れる箱のようなもの。
データ型というのは変数に入れる値によって変わるので気を付ける！

例えば、数値を入れる場合は「int」。そのあとに続く変数名は
見てわかりやすいものが良いので、数値の場合などは「number」などにしておくと良い。
他にもいろいろなデータ型があるので、一部ではありますが
下記に記しておきます。

よく使いそうなデータ型
・int⇒整数
・double⇒小数
・boolean⇒trueかfalseの時（真偽値）
・char⇒1つの文字（イニシャルなどを使う際）
・String⇒文字列（はじめ大文字なのを）

*どのデータ型の前にも「final」を付ける事によって
そのあとの代入で上書きができなくなる。


###論理演算子
「かつ」「または」「ではない」を表現するもの。
・&&⇒かつ
・||⇒または
・!を付ける⇒ではない
＜例＞

```java
!(x<=30)
/* xが30以下ではない　という意味を示す */

```

###if文／switch文
・if文⇒else ifと一緒に使用することが多い
「もし○○の時は」⇒出力
「そうでなく、○○の時は」⇒出力　
というように、場合によって出力を変える事ができる。

```java
int x=8;
if(x%2==0){
 System.out.println("偶数");
}else if(x%2==1){
 System.out.println("奇数");

```

・switch文
先ほどの文章の書き換えが可能

```java
int x=8;
switch(x%2){
 case 0: /*　←この値に一致した場合、下記の処理が実行される　*/
  System.out.println("偶数");
  break;　/*　←これを忘れないよう、気を付ける*/
 case 1:
  System.out.println("奇数");
  break;
}　
```

・default
どのcaseにも一致しない場合を設定できる

```java
....
 default
  System.out.println("それ以外");
  break;
}
```

###while文／for文
・while文
繰り返しを行う際に使われる。

```java
int i = 1;
while(i<=10){
 System.out.println(i+"回表示されます。");
 i++;
```

上記の場合だと「1回表示されます。」から「10回表示されます。」まで
続けて表示される。【i++;】がないと無限ループとなり、かなり負担がかかるので忘れない！

・for文
先ほどのwhile文をfor文で書き換える事が可能。

```java
for(int i=1;i<=10;i++){
 System.out.println(i+"回表示されます。");
```

###配列／拡張for文
作り方としては、以前にやったものと似ているが
気を付けないといけないのがデータ型の後に[]を忘れないこと！

```java
String[] names={"Nana","Hana","Mana"};
```
・for文を使って配列を順に表示させる。

```java
String[] names={"Nana","Hana","Mana"};
for(int i =0;i<names.length;i++){
 System.out.println(names[i]);
}
```

・さらに拡張for文で書き換える

```java
string[] names={"Nana","Hana","Mana"};
for(String name:names){
 System.out.println(name);
}
```

###奇数と偶数をそれぞれ取り出して足していく書き方
・拡張for文を使って書いてみた

```java
/*....略*/

int[] numbers={1,4,6,9,13,16};
 int oddSum = 0;
 int evenSum = 0;
/*まず配列を代入し、oddSum(奇数)evenSum(偶数)に0を代入し初期化*/

for(int number:numbers){
　if(number%2==0){
  　evenSum+=number;
  }else{
    oddSum+=number;
  }
}

/*number%2の式で偶数か、そうでないかのif文を作り、それぞれに足していく指示を書く*/

  System.out.println("奇数の和は" + oddSum + "です");
  System.out.println("偶数の和は" + evenSum + "です");

... 

```

これによって
「奇数の和は23です」
「偶数の和は26です」
と出力される。


###気を付ける事／振り返り
基本はすぐ理解できるのだが、応用になってしまうと
融通が利かなくなることが多いので、本当に理解できていないのではないかと思う。
なので、再度おさらいと、忘れたころに演習をやると効果的かと思うので
また時間が経ったころに実践の演習をするように心がける。

配列を代入する際は、何度も「データ型の後の[]」を忘れてしまったので気を付ける。
DoorkeeperのAccessTokenが必要なリクエストをテストする

doorkeeper-gem を使用している環境で、発行される AccessToken を Header に必要とする API アクセス (Request Spec) をテストするときの設定方法を備忘録として残します。

## 前提の環境
- [Doorkeeper](https://github.com/doorkeeper-gem/doorkeeper)
- RSpec
- FactoryBot

コントローラとルーティング例はこんな感じ [※ 公式 Doc から少しいじってます](https://doorkeeper.gitbook.io/guides/ruby-on-rails/protecting-your-resources)

```rb:app/controllers/api/v1/credentials_controller.rb
class Api::V1::CredentialsController < Api::V1::ApiController
  before_action :doorkeeper_authorize!
  respond_to :json

  # GET /api/v1/credential
  def show
    respond_with current_resource_owner
  end

  private

  def current_resource_owner
    User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
  end
end
```

```rb:config/routes.rb
Rails.application.routes.draw do
  use_doorkeeper
  namespace :api do
    namespace :v1 do
      resource :credential, only: [:show]
    end
  end
end
```

## Factory を用意

```bash:ディレクトリ構成
spec
└── factories
    └── doorkeeper
        ├── access_grants.rb # 今回は使わない
        ├── access_tokens.rb
        └── applications.rb
```

```rb:spec/factories/access_grants/applications.rb
FactoryBot.define do
  factory :doorkeeper_application, class: 'Doorkeeper::Application' do
    sequence(:name) { |n| "Application #{n}" }
    redirect_uri { 'https://app.com/callback' }
  end
end
```

```rb:spec/factories/access_grants/access_grants.rb
FactoryBot.define do
  factory :doorkeeper_access_grant, class: 'Doorkeeper::AccessGrant' do
    transient do
      user { build :user }
    end

    association :application, factory: :doorkeeper_application
    resource_owner_id { user.id }
    redirect_uri { 'https://app.com/callback' }
    expires_in { 100 }
    scopes { 'read public' }
  end
end
```

```rb:spec/factories/access_grants/access_tokens.rb
FactoryBot.define do
  factory :doorkeeper_access_token, class: 'Doorkeeper::AccessToken' do
    transient do
      user { build :user }
    end

    association :application, factory: :doorkeeper_application
    resource_owner_id { user.id }
    expires_in { 2.hours }
    scopes { 'read public' }
  end
end
```

## リクエストをテスト

Request Spec を書く

```rb:spec/requests/api/v0/credential_spec.rb
require 'rails_helper'

RSpec.describe 'Credential API', type: :request do
  let(:user) { create :user }
  let(:oauth_app) { create :doorkeeper_application }
  let(:access_token) { create :doorkeeper_access_token, application: oauth_app, user: user, scopes: 'read' }

  describe 'GET /api/v1/credential' do
    context 'with authorized access' do
      let(:headers) {{ 'Authorization': "Bearer #{access_token.token}" }}
      before { get api_v1_credential_path(format: :json), headers: headers }

      it 'responds with 200' do
        expect(response).to have_http_status '200'
      end
    end
  end
end
```

```zsh
$ bundle exec rspec spec/requests/api/v1/credential_spec.rb
1 example, 0 failures
```

以上です。
ubuntuでconda installしようとするとNotWritableErrorが出る

UbuntuにAnacondaをインストール後、`conda install update`とかをしても以下のようなエラーが出た。

```
Collecting package metadata (current_repodata.json): failed

NotWritableError: The current user does not have write permissions to a required path.
  path: /home/user_name/.conda/pkgs/urls.txt
  uid: 1000
  gid: 1000

If you feel that permissions on this path are set incorrectly, you can manually
change them by executing

  $ sudo chown 1000:1000 /home/user_name/.conda/pkgs/urls.txt

In general, it's not advisable to use 'sudo conda'.
```

`/home/user_name/.conda/pkgs/urls.txt`のアクセス権を与えてやればいいと思ったがそもそもこのパスが存在しなかった。

# 解決法
`/home/user_name/anaconda3`のアクセス権を付与すればよかった。

```
sudo chown -R user_name /home/user_name/anaconda3
```
この後`conda install update`とかが正常にできるようになった。
Eloquentのモデルをセッションで引き回す時、リレーション先の内容が更新されないんですが

# 症状
例えばレンタカーの予約フォームを作るとして、予約モデルを作成して入力した値をfillしセッションに保存しながら最終画面で`save()`し、DBに反映させるとします。
予約モデルは車モデルとリレーションをはってると思いますが、戻るなどして違う車を選んだ場合、モデルにcar_idをfillしなおしたにも関わらず、viewなどで`$reservation['car']['name']`としても前に選択した車の名前が表示されてしまします。

# 対処法
そういう時は、`$reservation->setRelations([])`を入れてやりましょう。
キャッシュされてたcarの中身がクリアされ、新しい内容が反映されます。

```php:App/Reservation.php
...
class Reservation extends Model
{
    protected $fillable = ['car_id'...];

    public function car()
    {
        return $this->belongsTo(Car::class);
    }
    ...
}
```

```php:OrderController.php
...
class OrderController extends Controller
{
    public function input1(Request $request)
    {
        $reservation = Session()->get('Reservation') : app(Reservation::class);
        return view('order/input1', [
            'cars' => Car::all(),
            'reservation' => $reservation
        ]);
    }

    public function store1(Request $request)
    {
        $data = Validator::make($request->all(), [
            'car_id' => 'required',
        ])->validate();
        $reservation = Session()->get('Reservation');
        $reservation->fill($data);
        $reservation->setRelations([]);  //これ！！リレーション先をクリア。
        Session()->put('Reservation', $reservation);
        return redirect('order/input2');
    }

    public function input2(Request $request)
    {
         ...
    }
    ...
    public function storeN(Request $request)
    {
         ...
        $reservation = Session()->get('Reservation');
        $reservation->fill($data)->save();
        return view('order/gooooal');
    }
    ...
}
```

# おわりに
ソースがテキトウですが、備忘録的なメモです。

## 参考
https://knight-9999.hatenablog.com/entry/20131225/1387951418
作ったプロジェクトを GitHub の新規レポジトリに

書いたプロジェクトをGitHubに新規アップロードするフロー。いつも忘れたころに「どうやるんだっけ？」と毎度調べてしまうので、ここにもメモしておく。

##### 1. GitHubサイトで新規レポジトリ追加

ここでは `my-project-repos` とする。

##### 2. 作ったプロジェクトのディレクトリで `git init`

##### 3. 必要であれば `git config`

```bash
$ git config user.name "my-user"
$ git config user.email "myusermail@mymail.com"
$ git config credential.helper my-cred-store
```

##### 4. git リモート追加

   ```bash
   $ git remote add origin https://github.com/my-user/my-project-repos.git
   ```
##### 5. `git pull`

```bash
$ git pull origin master
```

##### 6. まだやってなければ `.gitignore` 作成し、アップロード無視するファイルやディレクトリ等を設定。

##### 7. レポジトリにプロジェクトのファイルやディレクトリを `add` する

```bash
$ git add .
```

##### 8. `commit` する

```bash
$ git commit -m "コミットメッセージ"
```

##### 9. `push` する

```bash
$ git push origin master
```
------------------

### 追記その１: `--allow-unrelated-histories`

上記フローで注意すべきなのは、`add`, `commit`, `push`する前に `pull` すること。順番を間違えるとエラーが返ってくる。リモートから `pull` する前にローカルレポジトリにコミットしてしまった場合は、 `--allow-unrelated-histories` を追加すると良い：

```bash
$ git pull origin master --allow-unrelated-histories
$ git push --set-upstream origin master
```

### 追記その２: `git clone` してプロジェクトの中身をコピー

もしくは GitHub レポジトリ作成後、`git clone`してできたディレクトリにプロジェクトの中身を移動して `add`,`commit`,`push` するのも良いのかも。
ファイル名を指定して実行でサクラエディタを開く方法

# 手順
1. レジストリエディターを開く
2. **[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths]**まで辿り、キーを新規作成
3. 名前は**sakura.exe**
4. （規定）を右クリックし、修正ボタンを押下し、値のデータに **C:\Program Files (x86)\sakura\sakura.exe**を入力<br>※sakura.exeがあるフルパスを入れて下さい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528240/f8ebfdbc-7f1c-3f09-7e96-1f45468c34fc.png)

# 結果
**ファイル名を指定して実行**でサクラエディタが起動できるようになりました。
こんな感じで[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths]にアプリを登録すればファイル名を指定して実行で開けるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528240/1f5f3a57-6217-4fd3-0e14-f9252a937d01.png)
C++初心者

s = input("名前を記入しなさい ;") 
y = int(input(f"よくぞ来た勇者{s}よ！。先ずは年齢を記入しなさい ;"))

このpythonのプログラムをC++での書き方を教えてください。
C++でpythonのformatにあたるのはどの関数ですか？
Vimで定型文の補完を行う簡易な方法


# 問題
vimで定型文の補完を行いたい。
プラグインを使え、という指摘も聞こえてきそうだが、簡便に実現する方法を考えてみた。
追記 2020/01/13 [Vimで定型文の補完を行う簡易な方法（２）](https://qiita.com/thino-rma/items/3c1e577425588e8b3b0b) に、改善したスクリプトを紹介しています。

# 対処
以下を、~/.vimrcに追加する。

```console
function! s:CompleteFrom(files)
  let lines = []
  for f in a:files
    let inputfile = expand(f)
    for line in readfile(inputfile)
      call add(lines, line)
    endfor
  endfor
  call complete(col('.'), lines)
  return ''
endfunction

inoremap <F10> <C-R>=<SID>CompleteFrom(["$HOME/mydict.txt"])<CR><C-P>
nnoremap <F10> i<C-R>=<SID>CompleteFrom(["$HOME/mydict.txt"])<CR><C-P>
inoremap <F11> <C-R>=<SID>CompleteFrom(["$HOME/mydict2.txt", "$HOME/mydict3.txt"])<CR><C-P>
nnoremap <F11> i<C-R>=<SID>CompleteFrom(["$HOME/mydict2.txt", "$HOME/mydict3.txt"])<CR><C-P>
```

上記で示すvimscriptは、次の仕様になる。

- 利用方法
  - テキストファイルに、補完候補として表示したい文字列を保存する。
     - 例として、以下のようにしている。<br />
       １つ目のテキストファイルを```$HOME/mydict.txt```として、適当に定型文を保存<br />
       ２つ目のテキストファイルを```$HOME/mydict2.txt```として、適当に定型文を保存<br />
       ３つ目のテキストファイルを```$HOME/mydict3.txt```として、適当に定型文を保存
     - なお、完全な空行（長さ0の文字列）は候補としては無視される。（vimの候補表示機能の仕様）
  - キーマッピングを定義し、候補リストを表示する。
     - F10キーで、```$HOME/mydict.txt```の定型文を補完候補としてリストする<br />
       INSERTモードでF10を押下すると、補完候補をリストする。<br />
       NORMALモードでF10を押下すると、INSERTモードに移行して、補完候補をリストする。<br />
     - F11キーで、```$HOME/mydict2.txt```と```$HOME/mydict3.txt```の定型文を補完候補としてリストする<br />
       INSERTモードでF11を押下すると、補完候補をリストする。<br />
       NORMALモードでF11を押下すると、INSERTモードに移行して、補完候補をリストする。<br />
     - 最後に```<C-p>```を付けると、ポップアップメニュー表示直後に、候補選択されない状態（バッファは変更されていない状態）となる。こうしておくことで、候補表示直後にESCキーでキャンセルしても、バッファに影響がない。
     - 最後に```<C-p>```をつけない場合は、ポップアップメニュー表示直後に、一番上の候補が選択された状態（バッファも変更された状態）となってしまう。
  - vimデフォルトのキー定義で操作する。
     - ```<CR>```（エンターキー）で「現在の選択した候補を挿入する」
     - ```<C-E>```でキャンセルする。（バッファをもとに戻す）
     - ```<ESC>```（ESCキー）でキャンセルする。（バッファをもとに戻さない）
     - ```<C-N>```・```<C-P>```で「次・前の補完候補」（バッファを変更する）
     - （邪道かもしれないが）上・下キー（カーソルキー）で「上・下の候補を選択」（バッファを変更しない）
     - （邪道かもしれないが）左・右キー（カーソルキー）で候補ポップアップメニューを消す（カーソルを移動する）

- 補足
  - vimの候補表示機能の仕様として、候補を表示している状況で文字列を入力すると、候補が自動的に絞り込まれる。よって、定型文でよいなら、候補を表示してから入力し、選択するのが得策。
  - vimのcomplete()関数で、候補の表示をカスタマイズできる。<br />
    参考URL [vimで独自の補完を設定する(complete関数の使い方)](https://www.xmisao.com/2014/05/01/vim-complete.html)
tsyringeでエラーになるメモ（es6のせい？）

今vue.js + typescript + pixi.js + tsyringeをいじっているが、tsconfig.jsonのcompilerOptions.targetをes5からes6に変えると以下のようなエラーが出るようになった。

```
TypeError: Class constructor PlayerCharacter cannot be invoked without 'new'
```

原因はわからないが、es5に戻せばエラーはでなくなった。
【そも×2シリーズ】プログラムが動く仕組み～コンパイラの働き～

#####◇記事を書いた動機
普段の業務ではJavaでプログラムをしていますが、ある日、コンパイルした時のJDKのバージョンと実行する時のJREのバージョンが異なっていたことでコンパイルエラーとなりました。そのとき、「そもそもコンパイルって何してるんだっけ？」とふと思ったので、調べてみました。

#### そもそもコンパイルって
コンパイルとは、プログラムソースファイルから実行ファイルを作成する処理のこと。
もう少し難しい言い方をすると、javaやC言語などの高級言語で記述されたソースコードをネイティブコード(*1)に翻訳すること。
そして、コンパイルを実行してくれるプログラムのことをコンパイラと言う。
コンパイラの中では、ソースコードとネイティブコードの対応表があり、それに基づきながらソースコードの字句解析/構文解析/意味解析を実施し、最終的にネイティブコードを生成する。また、コンパイラはプログラミング言語の種類によって専用のものが必要だが、CPUの種類によっても専用のものが必要になる。

(*1) ネイティブコードとは
マシン語のこと。難しい言い方をすると、コンピュータのCPU（MPU/マイクロプロセッサ）が理解できる形式で記述されたコンピュータプログラム。

#####◇感想・気付き
・コンパイルはプログラムを動かす上で重要な働きをしているが、そもそもソースコードからプログラムの実行まで、どのような仕組み・フローで制御されているのか知りたくなった。次回以降のトピックにしたい。
AndroidカスタムROMで4G通信(KDDI)

今回は以下の環境で確認しました。OSや端末によっては出来たり出来なかったりするかもしれません。
また、通話に関しては契約してないので検証できてません。
SMSは受信確認しました。

|項目||
|:--|:--|
|端末|UMIDIGI F1|
|OS|Ressurection Remix v7.0.1(Android Pie)|
||Havoc OS 3.8 Official gsi(Android 10)|
|通信会社|KDDI|
|SIM|mineo Aプラン VoLTE非対応 データ通信+SMS|

# 1.アクセスポイント名の設定
これをしないことには電話もできません。
設定アプリのネットワークとインターネット＞モバイルネットワーク＞詳細設定＞アクセスポイント名をタップしてください
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318871/35f7a0e7-5fee-7bf0-9df9-843649a34a5f.png">
+をタップして各社の指示通り入力してください。mineoだとmineo APNとかで検索してAndroid用のページを見ると書いてあります。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318871/34092969-4251-50ca-79d8-1aa1ab8c8f73.png">
今回はAPNがmineo.jp、ユーザー名がmineo@k-opti.com、パスワードがmineo、認証タイプがCHAPでした。
名前はお好きにどうぞ。
できたら上の点3つを押して保存してください。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318871/68b19b34-859c-38c3-6059-515c70e1d6e9.png">
そしたら横のラジオボタンを選択状態にしておいてください。

# 2.もう一つアクセスポイント名を登録
きっと1の作業をすればアンテナは立ったと思います。ただ4GとかLTEとかの表示はないですよね。
ということで設定します。
1と同様にAPNを追加。もう一度+をタップしてください。
そして以下の通りに設定してください。

|項目||
|:--|:--|
|名前|ims|
|APN|ims|
|APNタイプ|ims|
|APNプロトコル|IPv4/IPv6|
|ベアラー|LTE|

今回は名前は任意ではないので注意してください。
そしたら上の点3つをタップして保存です。
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318871/2c394d6a-2127-85d5-b5c9-8a8904b8464f.png">
すると保存した途端4GとかLTEとかの表示が出ると思います。

# 4Gが出なくなった
APNのimsを設定した後一度出たのに出なくなってしまった！というときはAPNの設定を開いてimsをタップして編集画面を出して保存してみてください。読み込み直して繋がるようになります。

# 参考にしたページ
https://www.itmedia.co.jp/mobile/articles/1701/13/news110.html
AWSのcloud9のWordPressが使えなくなった件の速報

今日、AWSのcloud９にインストールしたWordPressが使えなくなった件で、一度復旧できたのに、再び使えなくなり色々と調べていました。

その中で、二つ重要なことを忘れていました。

-　MySQLのルート・ユーザーに、パスワードを付けること。
-　データーベースのユーザーに、権限をつけていなかったこと。

この二つを忘れていたことに気がついたので、また、作り直しました。

こちらの記事が、AWSのcloud９の設定と、WordPressのインストールが分かり易かったです。
https://blog.simmon.design/aws-cloud9-tutorial-new-instance/
特に、セキュリティの設定などのところは、重要だと思います。
パブリックIPアドレスで、固定Ipアドレスを設定することで、一度停止した後でも、正常に使えるようになります。

それから、一度MySQLのルートでログインした後に、パスワードを付ける方法は、こちらの記事で確認しました。
https://qiita.com/TeamDowel/items/6b3d7b3828a2b28f16e3

AWSのcloud9でMySQLを使う際に、役立つ記事です。
https://qiita.com/acecrc/items/a72992a17968d3d9bc00

それからMyAdminよりも軽くて、同じような事ができるものを知りました。
https://www.adminer.org/en/editor/

##IPアドレス：8080/
このパブリックIPアドレス：8080/に続けてアプリケーション例えばWordPressのindexページにアクセスすることで、無事に使えます。

cloud9の接続に関するドキュメントを読むと、この辺りの説明があります。
そのため、cloud9のブレビューではアクセスできないけど、ブラウザで、パブリックIPアドレスに続けてURLを指定すると、正常にアクセスできます。

下記の公式ドキュメントも、参考にしてみてください。
https://docs.aws.amazon.com/cloud9/latest/user-guide/vpc-settings.html
Google ドライブ で2台のPCの複数のローカルディレクトリを同期する

# できること

- 2つのPCの複数のディレクトリ（C:\example1, D:\example2）を同期
- A に追加したファイルは B に、Bに追加したファイルは A に追加される（削除も同様）

PC A (Google アカウント `A`)

```
C:
|-- example1
    |-- （ここが同期される）
D:
|-- example2
    |-- （ここが同期される）
```

PC B (Google アカウント `B`)

```
C:
|-- example1
    |-- （ここが同期される）

D:
|-- example2
    |-- （ここが同期される）
```

# 前提条件
- [バックアップと同期](https://www.google.com/intl/ja_ALL/drive/download/backup-and-sync/) を2台のPCにインストール
- Google アカウント を2つ用意

# バックアップと同期 について

事前に各PCに [バックアップと同期](https://www.google.com/intl/ja_ALL/drive/download/backup-and-sync/)  をインストールしておく

## バックアップ

- PCの任意のディレクトリのバックアップができる
- 別の Google アカウント に共有することが可能

今回はバックアップの機能を利用

## 同期

- Google ドライブ を 指定したローカルディレクトリ に同期できる
- Google ドライブ の中から同期するディレクトリを選択可能

同期でも複数台PCでの同期は可能だが複数のディレクトリはできない

# 手順

## PC A での作業（Google アカウントは `A`）

1. バックアップと同期（PCのローカル）の設定
    1. バックアップと同期 の設定画面を開き、左側メニューのパソコン名をクリック
    1. バックアップするフォルダの設定で同期したいディレクトリ（`C:\example1`, `D:\example2`）を追加

1. Google ドライブ (ブラウザ)の設定
    1. Google ドライブ の 左側メニューのパソコンから PC A のパソコン名をクリックするとバックアップの設定をしたディレクトリ（example1, example2）が表示される
    1. 対象ディレクトリを Google アカウント `B` に共有する

## PC B での作業（Google アカウントは `B`）

1. Google ドライブ (ブラウザ)の設定
    1. Google ドライブ の 左側メニューの共有アイテムをクリックし、Google アカウント `A` で共有したディレクトリ（example1, example2)を表示しておく
    1. 左側メニューのパソコンを展開して PC B のパソコン名表示しておく
    1. 同期対象のディレクトリを左メニューの パソコン名 にドラッグ＆ドロップする

    ※左側メニューに パソコン が表示されていなければ、バックアップと同期 で適当にバックアップの設定を行う（後に解除する前提）

1. バックアップと同期（PCのローカル）の設定
    1. バックアップと同期 の設定画面を開き、左側メニューのパソコン名をクリック
    1. バックアップするフォルダの設定で同期したいディレクトリ（`C:\example1`, `D:\example2`）を追加
    1. 「ドライブ内の既存のフォルダと統合しますか？」の警告が表示されるので、続行をクリック
PHP: fputcsv: delimiter must be a single character エラー

## エラーメッセージ

```
PHP Notice:  fputcsv(): delimiter must be a single character in /work/app/sample.tsv on line 4
```

## 問題のコード

```php:sample.php
<?php

$handle = fopen('sample.tsv', 'w');
fputcsv($handle, ['apple', 'banana', 'lemon'], '\t');
fclose($handle);
```

## 問題点

シングルクォーテーションで囲んでいたのが問題でした。

```php:sample.php
fputcsv($handle, ['apple', 'banana', 'lemon'], "\t");
```

`'\t'` を `"\t"` と変更するとエラーメッセージがなくなりました。
Vue Composition APIで$nextTick()を使う方法

# 注意
この記事ではVue 3.0リリース前の「@vue/composition-api@0.3.4」を使用しています。

**[2021/04/07追記]**
この方法１で行っているsetupの第二引数のcontextからrootを呼び出すことは今でも動きはしますが、現在非推奨なようです。https://github.com/vuejs/composition-api/issues/28#issuecomment-802402125
現在は追記した方法３が主流なようですが自分はまだ試せておらず、Vue2系でcomposition-apiだけを入れて使っているプロジェクトに対して有効な手段かどうかは確認は出来ていません。
また、composition-apiから直接importできるらしいコメントも見られます。
https://github.com/vuejs/composition-api/issues/28#issuecomment-802615851
自分は今直接できる環境がないので、確認出来た方がいたらコメントいただけると幸いです。

# 方法１　context.rootから参照する

```.js
setup(_, { root }) {
  root.$nextTick(() => console.log('hi'));
}
```

# 方法２　グローバルAPIから参照する
参照
https://jp.vuejs.org/v2/api/index.html#Vue-nextTick

```.js
import Vue from 'vue'

Vue.nextTick(() => {
  window.scrollTo(0, document.body.clientHeight)
})
```

# [2021/04/07追記]方法３ Vueからimportして使う
```.js
import { nextTick } from 'vue'

setup(_) {
  nextTick(() => console.log('hi'));
}
```


# どっちがよいの？
https://github.com/vuejs/composition-api/issues/28

このissueでvueのcoreチームのお方が、「方法２も全然悪くはないがVue3.0でどうなるかわからないので方法1の方が安全だね」とおっしゃっています。
僕は1で行きました。