OmniAICreator/Qiita-1.07M huggingface dataset:
Jenkins のノードスケジューリング方法はどのように行われるか？

## 動機
Jenkins には Job を slave に流して実行させる機能があります。
slave には 「このスレーブをできるだけ利用する」と「このマシンを特定ジョブ専用にする」という Mode が存在しています。
Job には、「実行するノードを制限」という項目があり、ここで特定の slave または slave にタグをつけておいてそのタグを持つ slave のうちいずれかで実行するということができます。

Job を何回か実行してみるとたとえ同じタグに複数の slave があったとしても同じマシンで実行されていることが気になりました。
雰囲気でJenkins のノードを制限したり、タグを利用していることが多かったので少し調べてみました。

## バージョン
Jenkins: 2.235

## Job 実行までのフロー
![Jenkinsワークフロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250213/2e62ced7-cd95-c6d7-ddaa-094d9d3b3288.png)

Job には実行するノードを制限 「する」場合と「しない」場合があります。
これはユースケースとして、実行するOS（Windows か Linuxか）であったり、ランタイムの相違（Java8 なのか Java11 なのか）や地理的（やネットワーク的に）な場所でノードを選択できるようにすることに利用されます。
ネットワークというのは、Aとタグのついた slave からはサーバX にアクセスできないが、Bというタグのついた slave からはアクセスできるというようなことが考えられます。

Slave には「このスレーブをできるだけ利用する」モードと「このマシンを特定ジョブ専用にする」モードがあります。
これはユースケースとして、セキュリティ的な理由や、ノードのリソースをいつでも利用可能な状態にしておきたいといったことが考えられます。

## slave のスケジューリング
https://wiki.jenkins.io/display/jenkins/distributed+builds#Distributedbuilds-Schedulingstrategy
> Scheduling strategy
Some agents are faster, while others are slow. Some agents are closer (network wise) to a master, others are far away. So doing a good build distribution is a challenge. Currently, Jenkins employs the following strategy:

> 1. If a project is configured to stick to one computer, that's always honored.
2. Jenkins tries to build a project on the same computer that it was previously built.

1. プロジェクトがあるコンピューター専用に設定されている場合は、常にそれを優先します
2. Jenkinsは以前ビルドしたコンピュータと同じコンピュータ上で、プロジェクトをビルドするように試みます

となっています。

## まとめ
Job を複数回連続して実行したときに空いている slave あるにも関わらず同じ slave で実行し続けていたのでなんでだろと思っていました。
Jenkins のビルドは、第三世代CIツールで採用されているコンテナ内で実行し終わったら破棄するというものではなく、環境を使い続ける方法です。そのため、意図せず違う slave で実行されることでビルドに失敗するということを防ぐために、一度成功した環境で再び実行する戦略をとっているのかと考えられます。
そのため、Job が均等に分散されずに一見賢く見えなかったのだと思います。

また、Jenkins のスケジューリング周りの設定については、

* ノードには複数のタグを付与することができるので、OSやランタイムでタグをつけておき、実行するJob の設定で実行するノードを制限することで必要なOSやランタイムを指定する
* リソースを特定のjob に空けておきたい場合は、slave の設定をしたうえで実行ノードを指定する
* 特に気にしない場合は、実行ノードの指定はせず、Job の設定も行わない

というようにすればよいことがわかりました。

## 参考
https://wiki.jenkins.io/display/jenkins/distributed+builds#Distributedbuilds-Schedulingstrategy
https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/Computer.java#L909
https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/model/Executor.java#L321
neovimとvimとdein

#内容
　マニュアルにないので、なんとも言えないがnvimでdeinが動かない

#概要
　私の環境は次のとおりである。

 ``` 
 windows10
 vim 8.2(kaoriyaさんからダウンロード)
 dein
 neovim 0.4.4
 ```
 この環境であれば、vimでインストールしたプラグインが自動的にnvimでも使える？
と思っていると、さにあらず。vimにはpluginが入っているが、nvimを起動してもpuluginは入っていない・・という現象に悩んでいると言うことである。また、nvim側のinit.vimはvimの_vimrcにリンクして使っている。

#原因の調査
　どうなっているかを探っていると、runtimepathの違いを発見した。

　nvimのruntimepathには
　.cache/dein/.cache/init.vim/.dein
 というpathがあり、vimを見てみると
　.cache/dein/.cache/_vimrc/.dein
 となっている。（.cache/deinはdeinの設定として_vimrcで指定した。）フォルダの内容を見ると確かに、_vimrc配下にはpluginがインストールされているが、init.vimの方にはなにもはいっていない。
　どうすれば、ここ(init.vim配下)にpluginが入るようになるのだろうか？もしかすると、init.vimを_vimrcにリンクして使ってしまうとこのディレクトリはなにも作らないのだろうか？それとも、nvimでdein#recache_runtimepath()とかすればいいんだろうか？

#とりあえずの解決策
　現状の解決策としては、_vimrc/.deinの内容をinit.vim/.deinコピーして使っているのだが、新しくpluginを入れると、またコピーしなくてはいけないのでめんどくさい。

　まあ、確かに、pluginの中には、xxx.nvimとしてnvimのみのもののあるわけなので、本当はinit.vimはリンクして使わないのが正解なのかもしれないなあ・・

　どこかにマニュアルがあったら教えていただきたい。
Githubのssh keyを追加した時「Error: Key already in use」となった場合の対処法

#ssh keyが別のアカウントで使われてる？？
[permission deniedでgit clone 出来ない問題は、大体SSHがGitHubに登録されていないから](https://qiita.com/kokogento/items/35d0ff204ce58312a2e0)
:point_up:こちらの記事を参考に、ssh keyをGithubに追加しようとすると、**まさかのエラー！！**
![スクリーンショット 2021-03-22 22.00.48.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167220/4a6cd0d4-d2de-8b42-2b8e-1c1df3d0974f.jpeg)

**既に使われてるって、どゆことだ？？？**

#どのアカウントで使われてるか確認する
https://docs.github.com/en/github/authenticating-to-github/error-key-already-in-use#finding-where-the-key-has-been-used

下記のコマンドを実行する

```console
MacBook-Pro:.ssh gen$ ssh -T -ai ~/.ssh/id_rsa git@github.com
Enter passphrase for key '/Users/gen/.ssh/id_rsa': 
Hi anotherUserName! You've successfully authenticated, but GitHub does not provide shell access.
```

もしアカウントに紐付けられてるなら`anotherUserName`の部分に、あなたのssh keyが追加されてるGithubアカウントの`username`が表示されます。

もしリポジトリーの[deploy key](https://docs.github.com/en/developers/overview/managing-deploy-keys#deploy-keys)として紐付けられているのなら、`anotherUserName/repo`となるようです。

**私の場合、共同で個人開発をしてる友達のGithubアカウントが表示されたので、彼にLINEで「俺のssh key削除して」と伝えるだけで解決しました。。。**

どうやらPCを買い替えてから自分のGithubアカウントに追加する前に、友達のアカウントに追加してしまってたようです:sweat_smile:
カスタムフィールドのインストールから出力方法のまとめ

#どうも7noteです。カスタムフィールドのよく使う項目の使い方をまとめました。

https://ja.wordpress.org/plugins/advanced-custom-fields/

プラグインの**「Advanced Custom Fields」のインストールから、phpでの出力方法まで**を私が分かりやすく私が使いやすい用に私が良く使うものだけをまとめた記事です。

※すべての機能や変数は紹介しておりません。すべての出力が知りたい方はこちらの記事がわかりやすかったのでこちらへどうぞ。
https://bazubu.com/advanced-custom-fields-36452.html

## ①「Advanced Custom Fields」のインストールから準備

1. Wordpressの管理画面から**「プラグイン」→「新規追加」から、検索覧に「ACF」**と打ち**「Advanced Custom Fields」をインストールし有効化**。
2. 同じく管理画面、**サイドメニューの「カスタムフィールド」**をクリック。
3. **「新規追加」を押し、追加したいフィールドを作成**。完了したら「位置」の欄で表示したい投稿タイプを設定。
4. 設定したフィールドに値を入力。

これで準備OK。出力方法へ↓↓↓

## ②「Advanced Custom Fields」をPHPで出力する方法

### 「基本」

**取得する**もしくは**表示する**の2つの方法がある。

```index.php
/*～～～取得する方法～～～*/
$hogehoge = get_field("フィールド名を入れる");

/*～～～表示する方法～～～*/
the_field("フィールド名を入れる");
// もしくは取得して表示
echo get_field("フィールド名を入れる");
```

### 「応用」

#### 配列になっている値の取得

```php
/*～～～画像（※出力方法：配列）～～～*/
$hogehoge = get_field("画像のフィールド名")["url"] //画像URL

/*～～～ラジオボタン・セレクトボックス～～～*/
$hogehoge = get_field("フィールド名")["value"] //Value値(英語)
$hogehoge = get_field("フィールド名")["label"] //label値（日本語化）

/*～～～チェックボックス（※チェックされているものすべて取得）～～～*/
$items = get_field('フィールド名');
if( $items ){
  foreach( $items as $item ){
    echo $item['value'];
    echo $item['label'];
  };
};
```

#### グループ化した情報の取得

```php
$hogehoge = get_field("Groupのフィールド名")["子フィールド名"];
// 
$hogehoge = get_field("Groupのフィールド名")["子Groupのフィールド名"]["孫フィールド名"];
```

## まとめ

まだまだあるので随時更新予定です。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
【Git】HEADとは何か

#プログラミング勉強日記
2021年3月22日

#HEADとは
　現在のブランチの最後のコミットの代名詞のこと。現在使用しているブランチの先頭を表す。デフォルトではmasterの先頭を表していて、HEADが移動することで使用するブランチが変更される。

#HEADの使い方
　コミットを指定するときに`~`(チルダ)と`^`(キャレット)を使って、あるコミットからの相対位置で指定することもできる。`~`を後ろに書くと行くつ前の親かを指定することができ、`^`はブランチのマージがオヤッが複数ある場合に何番目の親化を指定できる。

```:最後にコミットした内容を見る方法
$ git show HEAD
```

```:最後の1つ前のコミットを見る方法
$ git show HEAD^
```

```:最後の2つ前のコミットを見る方法
$ git show HEAD^^
$ git show HEAD~2
```



#参考文献
[Git初心者に捧ぐ！Gitの「これなんで？」を解説します。](https://kray.jp/blog/git-why-explanation/)
[ブランチの切り替え](https://backlog.com/ja/git-tutorial/stepup/03/)
デザインど素人がデザインに困った時に使うツールちょいまとめ

#概要
デザインに困った時によく利用するツールをメモします。

#ツール
##Canva
https://www.canva.com/

いい感じのデザイン素材を色々用意してくれています。
困ったときはCanvaにある素材を組み合わせてロゴとかも作れちゃいます。

##Dribbble
https://dribbble.com/

デザイナーが実際に作ったWebデザインを見ることができます。
機能や配色ごとに調べられるので、重宝しています。

##Coolors
https://coolors.co/

それっぽい配色パターンを生成してくれるツールです。
spaceボタンぽちぽちと押すだけでいい感じの配色を提案してくれます。

##ColorZilla
https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp?hl=ja

chrome拡張機能
webページ上の色を教えてくれます。

##Measure-it
https://chrome.google.com/webstore/detail/measure-it/jocbgkoackihphodedlefohapackjmna?gl=JP&hl=ja

chrome拡張機能
webページのサイズをpx単位で測ることができます。
dockerコンテナの中でviが使えない場合

## 環境
docker desktop for windows 
AWS EC2+docker

## 現象
docker execでコンテナの中に入ったらviが使えなかった。。

## 手順
下記の手順でviが使えるようになりました。

1. docker exec -it `{apache00}` bash
2. apt-get update
3. apt-get install vim

## appendix
### Centos系
yum install vim
OctaveをVSCodeで走らせたい

#OctaveをVSCodeで走らせたい
### Octaveを使い始めた理由、感じたこと
Couseraでスタンフォード大学のAndrew Ng先生のMachine Learningを受講しています。
Andrew先生のご意向~~（趣味）~~で授業のプログラミング課題にはJava, C++, Pythonなんかよりも学生の理解が早いと噂のGNU Octaveを使います。要はMatlab互換言語です。

https://www.gnu.org/software/octave/index

Windows, Mac OS, LinuxそれぞれにGNU Octave GUIが提供されていますが、GUIが正直な感想とても使いずらい。なのでVS Code上でコード実行したいと思いました。
しかしながら、TerminalでOctaveと叩いてもCommand not foundと怒られてしまいます。

###試した環境
* Computer: Apple MacBook Air Late 2020 M1 (Apple Silicon ARM)
* OS: Mac OS Big Sur version 11.2.3
* VS Code: version 1.54.3 (Apple Silicon最適化バージョンですのでRosetta2非使用)
* GNU Octave: version 6.2.0 

### 自家醸造
まずはHomebrewをインストールしました。リンク先ページのコマンドをMac、LinuxのTerminalに貼り付けたら勝手に始まります。

https://brew.sh/index_ja

色々インストールが走るのでしばらく放置し、インストールが終わったらHomebrewのコマンドが使えるようにPATHを通します。

```bash
$ export PATH="$PATH:/opt/homebrew/bin/"
```
PATHが通ったら、Octaveをインストールします。

```bash
$ brew install octave
```

Octaveを自家醸造する際にGNU Octave GUIのアンインストールは特にしていないですが、不具合は特に起きていません。

Octaveのインストールが終わると、Terminal上でOctaveが実行できます。
確認のために実行してみます。

```bash
$ octave
```

上記コマンドを入力するとOctaveが起動します。
簡単な計算や、行列の定義をして動いていることを確認します。

```bash
GNU Octave, version 6.2.0
Copyright (C) 2021 The Octave Project Developers.
This is free software; see the source code for copying conditions.
There is ABSOLUTELY NO WARRANTY; not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  For details, type 'warranty'.

Octave was configured for "x86_64-apple-darwin20.3.0".

Additional information about Octave is available at https://www.octave.org.

Please contribute if you find this software useful.
For more information, visit https://www.octave.org/get-involved.html

Read https://www.octave.org/bugs.html to learn how to submit bug reports.
For information about changes from previous versions, type 'news'.

octave:1> 1+1
ans = 2
octave:2> X=ones(3)
X =

   1   1   1
   1   1   1
   1   1   1
```

Octaveを終了するには次のコマンド。

```bash
octave:3> exit
```

### VS Codeの設定
VS Codeでは次の拡張機能をインストールしました。

https://marketplace.visualstudio.com/items?itemName=leafvmaple.octave

インストールすると右上にOctaveアイコンが表示されます。このアイコンを押下するとプログラムが実行されます。
また、カレントディレクトリはワークスペースから開いたOctaveファイルの場所です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1230168/1d44957b-c074-5977-8e0d-41c6b18fe19e.png)

グラフの描画もできています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1230168/8c07871c-6f6d-65c3-f618-19c4ee447b24.png)

このプログラムの最後で、決定境界を描くのですがプログラムがポーズされずに終了してしまいました。
VS Code上のTerminalからだと問題ないのですが・・・。
Octaveコードを修正する（最後にPauseしてやる）か結局TerminalでOctaveを起動してやるかどちらかが必要でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1230168/a30fcb63-193e-1a96-9982-d93f2bc18c82.png)
サインアップview イメージ（自分用）

<h2>Sign up</h2>

<%= form_with model: @user, url: user_registration_path, class: 'registration-main', local: true do |f| %>

  <%= render 'devise/shared/error_messages', model: f.object %>
  <div class="field">
    <%= f.label :name %><br />
    <%= f.text_field :name, autofocus: true, autocomplete: "name" %>
  </div>

  <div class="field">
    <%= f.label :email %><br />
    <%= f.email_field :email, autofocus: true, autocomplete: "email" %>
  </div>

  <div class="field">
    <%= f.label :password %>
    <% if @minimum_password_length %>
    <em>(<%= @minimum_password_length %> characters minimum)</em>
    <% end %><br />
    <%= f.password_field :password, autocomplete: "new-password" %>
  </div>

  <div class="field">
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation, autocomplete: "new-password" %>
  </div>

  <div class="actions">
    <%= f.submit "Sign up" %>
  </div>
<% end %>

<%= render "devise/shared/links" %>
フォームを使ってv-modelを理解する

## v-model
```App.vue
    <input 
      type="text" 
      id="text"
      v-model="eventData.title"
    >
    <p>{{eventData.title}}</p>
<script>
export default {
  data() {
    return {
      eventData: {
        title: "タイトル"
      }
    }
  }
}
```

v-modelはdataの中の値を参照することができます。

## 修飾子について
lazy修飾子

```
v-model.lazy
```
lazy修飾子はinput要素に大してフォーカスが外れた瞬間に発火するようになります。
フロントエンドのバリデーションをかける際などに使われるイメージです！

number修飾子

```App.vue
   <input 
      type="number" 
      id="text"
      v-model.number="eventData.maxNumber"
    >
    <p>{{eventData.maxNumber}}</p>
  </div>
<script>
export default {
  data() {
    return {
      eventData: {
        title: "タイトル",
        maxNumber: 0
      }
    }
  }
}
</script>
```
v-model.numberとするとフォームの値が更新された際も値がnumberになります。
input要素は最初がnumberでも値が更新されるとstringになるといった性質があります。v-model.numberとすることでこの値はnumberだよと言うことを明示づけてくれるわけです。

trim修飾子
こちらは前後の空白を取り除く修飾子です
```
v-model.trim
```
とするとフォームの前後の空白がなくなります。


## テキストエリアの場合
textareaを使う場合も基本的には変わらないです

```App.vue
<template>
<textarea id="detail" v-model="eventData.detail"></textarea>
<pre>{{eventData.detail}}</pre>
</template>
<script>
export default {
  data() {
    return {
      eventData: {
        title: "タイトル",
        maxNumber: 0,
        subTitle: "",
        detail: "",
      }
    }
  }
}
</script>
```
こんな感じです。
ちなみにpreタグを使うとテキストエリアの改行などを判断することができます！

## checkboxの場合

```App.vue
<template>
<div>
  <input type="checkbox" id="isPrivate" v-model="eventData.isPrivate">
  <label for="isPrivate"></label>
  <p>{{eventData.isPrivate}}</p>
</div>
</template>

<script>
export default {
  data() {
    return {
      eventData: {
        title: "タイトル",
        maxNumber: 0,
        subTitle: "",
        detail: "",
        isPrivate: false
      }
    }
  }
}
</script>
```

チェックボックスはbooleanを返します！
あとはidとforで紐づけるだけですね！


## 複数のチェックボックスの場合

```App.vue
<div>
<p>参加条件</p>
  <label for="10">10代</label>
  <input type="checkbox" id="10" value="10代" v-model="eventData.target">
  <label for="20">20代</label>
  <input type="checkbox" id="20" value="20代" v-model="eventData.target">
  <label for="30">30代</label>
  <input type="checkbox" id="30" value="30代" v-model="eventData.target">
  <p>{{eventData.target}}</p>
</div>

<script>
export default {
  data() {
    return {
      eventData: {
        title: "タイトル",
        maxNumber: 0,
        subTitle: "",
        detail: "",
        isPrivate: false,
        target: []
      }
    }
  }
}
</script>
```

複数のチェックボックスの場合はbooleanではなく配列を返します。
チェックを入れたものだけが配列に代入されていくイメージです。

## ラジオボタン

```App.vue
<div>
<p>参加費</p>
  <input type="radio" id="free" value="無料" v-model="eventData.price">
  <label for="free">無料</label>
  <input type="radio" id="paid" value="有料" v-model="eventData.price">
  <label for="paid">有料</label>
  <p>{{eventData.price}}</p>
</div>
<script
export default {
  data() {
    return {
      eventData: {
        title: "タイトル",
        maxNumber: 0,
        subTitle: "",
        detail: "",
        isPrivate: false,
        target: [],
        price: ""
      }
    }
  }
}
</script>
```

ラジオボタンも同様に実装できます。

お疲れ様でした！
THE文系の俺が機械学習コース無職転生 ~Part3 GitHubにリポジトリ作ってあげてみた~

# どんなモチベーションですか？
いつも通り詳しくは書けませんが、最初の頃に悩んでいたので・・・。
同じ悩みを抱えている同志(文系初学者、PC普段触りませんが何か)の方がいるのではないかと思い、作りました！

超超超初学者向けです。もし間違えてたら教えて下さい・・・m(_ _)m

# GitHubに作ったファイルをあげてみたいよね？
というより、いずれあげないといけなくなる日がきます。
そして、その時に勢いで、慌ててやると取り返しのつかない(つくんでしょうけど)ことになります。

なので、本当に触りだけ、ざっくりと！ご紹介したいと思います！！

# それではここから流れです

![スクリーンショット 2021-03-22 20.27.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031281/c9d0989e-296a-8c4e-afdd-9a360682aa66.png)

自分のGitHubを開くと、こういう画面(左上の一部ですが・・・)になりますよね？
(急に始めてすみません。。。)


さくっと[New]ボタンを押してしまいましょう！

![スクリーンショット 2021-03-22 20.29.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031281/260cbcaa-8ad4-87a4-ec79-93c62c24eb1b.png)


ちょっと写真大きくて見辛いかもしれませんが、この画面に遷移すると思います。
そうしたら・・・

①Repository nameのところにお好きなリポジトリ名をどうぞ！
②Publicのままでいいと思います。Privateでもいいですが。(個人情報あげないように注意！APIキーとか気をつけて！)
③その下のチェックボックスは入れなくても大丈夫です。
④そしたら、[Create repository]をクリックして下さい！

![スクリーンショット 2021-03-22 20.39.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031281/b0b4c0ba-0142-7437-3bb1-9d03fb3a8b05.png)


こういう画面になりましたか？？あとで、真ん中下らへんのSSHの隣にあるURLを使います！

# 一旦ターミナルにいきましょう！
ターミナルがわからない方は、ここでは説明しないので、他の方のを見てほしいです！

で、ここで大切なのは

##### ①GitHubにあげたいファイルのところまでちゃんと移動すること

Aというフォルダの中にある、BというファイルをGitHubにあげたかったら、Aの中にまで、
[cd]とか[ls]を使って今自分がいる場所を移動するんです。ターミナルを使いながら。


これ・・・見辛いんですが、ターミナルの一部分です。

![スクリーンショット 2021-03-22 20.52.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031281/9bb8420c-72b1-a614-2114-5ef15b1573f0.png)

こうやって、いきたいファイルのところへ
[cd いきたいファイル名]
って打ち込んでいくと自分が今いる場所が移動します。一気には飛べないので、一つずつ進んでいきましょう。コツコツと。

![スクリーンショット 2021-03-22 20.53.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031281/2195b68e-3bae-b7c8-4543-1242281a1a2a.png)

今回私の場合は[sugukesuyo]ファイルの中に、あげたいファイルがあるので、そこまで入っていきます。

ここまできたら・・・

# もうすぐ終わりますよ！

さっきの、

![スクリーンショット 2021-03-22 20.56.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031281/146f950e-b403-644e-9ccd-6565787349d7.png)


SSHの話をしたところに戻ります！

①右の方にある、回覧板(死語？)みたいなところをクリックして、 URLをコピーします
②そうしましたら、またターミナルに戻って下さい！

下記のを順々にターミナルに打ち込みます・・・！

③git init(今いるファイルのところで、gitと連携する鎖みたいな・・・)
④git remote add origin さっきのURL(その鎖と、GitHubをつなげます！)
⑤git add .(とりあえず、フォルダに入っているファイル全部あげちゃうぜ！っていうコマンド)
⑥git commit -m'1st commit'(どんなつもりであげたのが、宣言します！''の中は色々と工夫いるみたいです)
⑦git push origin master(このコマンドを打ち込めば・・・！)

③〜⑦まで、ターミナルで次々に打ち込み続ければあら不思議・・・！(不思議では困る)

![スクリーンショット 2021-03-22 21.01.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031281/5891ad12-49a6-15c0-0325-a45c3812dc5b.png)

先程のGitHubを更新すれば、これが出来ている・・・はず！！！出来たよね？！

# 結論
１〜２ヶ月前くらいに死ぬほど分からなくて、山程失敗して、知り合いに迷惑かけて。。
最終的にはYOUTUBEの「いまにゅプログラミング塾」を見ながら色々作って遊んでいたら、少しGitHubへの怖さは薄らいできました。

今もまだまだ全く分かってないのですが、少しずつ簡単に知っていることを皆さんに提供して、何かしらのきっかけになればと思ってます・・・・！

初学者がんばれー！一緒に頑張りましょー！＼(^o^)／
～ 入力 ～ チートシート

#目次
[入力が１つのみの場合](#入力が１つのみの場合)　`N = int(input())`
[入力が１行で複数の場合](#入力が１行で複数の場合)
　入力が１行で数個の場合　`X,Y = map(int,input().split())`
　入力が１行で多数の場合　`mat = list(map(int, input().split()))`
[入力が複数行で各行に１つずつの場合](#入力が複数行で各行に１つずつの場合)　`mat = [int(input()) for _ in range(N)]`
[入力が複数行で複数の場合](#入力が複数行で複数の場合)　`mat = [list(map(int, input().split())) for _ in range(N)]`

#はじめに

チートシートの扱いついては[ここ](https://qiita.com/ysys_Ba/items/d27282b888abbd1f43e7#%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を読んでください

#入力が１つのみの場合

```python:input.py
N = int(input())
```

入力の型に応じて`int`の部分を str とか float とかに変更

#入力が１行で複数の場合

##入力が１行で数個の場合

```python:input.py
X,Y = map(int,input().split())
```

`X,Y`の部分を、入力と同じ数の任意の変数に変更

##入力が１行で多数の場合

```python:input.py
mat = list(map(int, input().split()))
```

入力数に関わらず自動で１次元配列が作成され、入力が要素として順に格納される

#入力が複数行で各行に１つずつの場合

```python:input.py
#N = int(input())
mat = [int(input()) for _ in range(N)]
```

下のやつよりもこっちのほうが楽ですね
そもそもこういうタイプの入力はあまりAtcoderでは見ない気がするけど.....

```python:input.py
N = int(input())
mat = [0]*N
for i in range(N):
  mat[i] = int(input())
#print(mat)
```

for文で[入力が１つのみの場合](#入力が１つのみの場合)を回して、用意した配列に順に格納していくだけ

#入力が複数行で複数の場合

```python:input.py
N = int(input())
mat = [list(map(int, input().split())) for _ in range(N)]
```

こんなのあったんですね（記事書くために調べてたら出てきた）
ちゃんと体系的にpythonを学習していないのでこういうことが多い...
入力と同時に操作しないならこれで十分

```python:input.py
N,M = map(int,input().split())
mat = [[0] * M for i in range(N)]
#     [[0] * 横 for i in range(縦)]
for i in range(N):
  tmp = list(map(int, input().split()))
  for j in range(M):
    mat[i][j] = tmp[j]
#[print(*mat[i]) for i in range(len(mat))]
```

[入力が複数行で各行に１つずつの場合](#入力が複数行で各行に１つずつの場合)と同じことを２次元配列でやる
２次元配列を使うと行と列を混合しやすいので注意

```python:input.py
N = int(input())
X = [0]*N
Y = [0]*N
for i in range(N):
  x,y = map(int,input().split())
  X[i] = x
  Y[i] = y
#print(X)
#print(Y)
```

２次元配列を使うと混乱しやすいので、入力が数種類ならそれぞれ別に配列を作成して格納する方が楽

```python:input.py
H,W = map(int,input().split())
mat = [[0] * W for i in range(H)]
#     [[0] * 横 for i in range(縦)]
for i in range(H):
  tmp = str(input())
  for j in range(W):
    mat[i][j] = tmp[j]
#[print(*mat[i], sep='') for i in range(len(mat))]
```

Atcoderでよくある`#`と`.`で地図とかを表すような入力用（入力が数字か文字列かの違い）
出力でこの形式を使わないなら、最初に扱いやすいよう0/1とかに変換しといた方がいいかも
ログインしているとき（条件分岐）

<% if user_signed_in? %>
A
<% end %>

ログインしているなら、Aを表示させる



<% if user_signed_in? && current_user.id == @tweet.user_id %>
B
<% end %>

ログインしていて、かつあなたのuser.idがそのツイートをしたuserのidと一致していたら（あなたがそのツイートの投稿主なら）　Bを表示させる。
Windows 10 ProのWindows To Go風USBメモリを作る

備忘録のため簡素なメモ。
自己責任でご利用ください。
rufusはかなり不安定だったので、別の方法を探してうまくいった結果。

# Windows 10のisoを落とす
「Microsoft Windows and Office ISO Download Tool」（Microsoft公式サイトからのisoダウンロードヘルパー)などで、ISOを落とす。

# install.wimを加工する
デフォルトでは、Homeがインストールされてしまう。
install.wimを加工して、Proにしよう。

isoをマウントする。

sourceindexを調べる。
```
   DISM.exe /Get-WimInfo /WimFile:D:\sources\install.wim
```

install.wimを作り直す
```
Dism /Export-Image /SourceImageFile:"D:\sources\install.wim" /SourceIndex:3 /DestinationImageFile:"C:\install.wim"
```

# isoを書き換える
元のisoのsources/install.wimを消して、上で作ったものに差し替える。
Any burnを使えばよい: https://www.anyburn.com/tutorials/edit-iso-file.htm


# iso2discでWindows to go風をUSBに書き込む
iso2discは https://www.top-password.com/iso2disc.html
から入手できる。

書き込めばおしまい。

# 参考

- Windows 10のinstall.wimからProのみのイメージを取り出す: https://morokoshi.hateblo.jp/entry/2018/07/14/000000
環境構築周りの知識

#本記事について
プログラミング初心者がWebに関する知識を学んだので、その備忘録として載せております。

どうかお手柔らかにお願いいたしますm (- -)(_ _)ペコリ

##シェル
・ターミナルで実行されたコマンドを読み取りOS（コンピュータ）に指示を出すプログラム
→OSは指示を受けてコマンドにあったアプリケーションを動作させる

・ターミナルとOSを繋ぐ窓口役、中間役、介在人

・ターミナルから入力されたコマンドを読み取ってOSに対して指示を渡し、結果をターミナルに返して表示や実行などの操作をさせている。

##zsh
・シェルの種類の1つ。

・人間からの入力をコンピューターに伝えるプログラム

・アルファベット最後のzを使っていることもあり自称最強のシェル

・「.」から始まるドットファイルを作成編集することで設定を行うことができる。
環境構築では.zshrcに設定を記述してPATHにアプリケーションの場所を示すことでコマンドを使用可能にしていた。

・ターミナルでecho $SHELLと打つとシェルがzshであることがわかる

##bashとzshのプロンプト
・bashのプロンプト　$

・zshのプロンプト　%

##環境変数
・コンピューターが持っている値を入れておく箱（変数）

・OSが動いている時に使える変数

・すべてのプログラムで使える変数

##PATH
・「環境変数」というOS用の変数

・複数の絶対パスの情報が保存されている

・コマンドが入力された時に、シェルはPATHに記述されたパスのディレクトリ内のファイルを検索する。PATHがファイルの在り処を示す行先、住所。

##PATHを通す
・プログラム名だけで実行できるようにすること

・PATHに絶対パスを保存してアプリケーションの在り処を示し、全てのディレクトリからコマンドを使用可能にすること
→PATHが保存されているので、PATHを指定せずともプログラム名だけで実行できる

##echoコマンド
・'>>'につ続けてファイル名を指定することでファイルに文字を追加できるLinuxコマンド

.zshrcにrbenvの設定を反映するためのコマンドを記述することでPATHを通している。

##コマンドラインツール
・コマンドで操作するアプリケーションのまとまり

・キーボードで入力することで命令する（操作する）プログラム

・OSが始めからコマンドで操作できるアプリケーション以外のアプリケーションをPCにインストールできる。

##Command Line Tools
・macOS専用のコマンドラインツール

・Linuxコマンド以外で操作するアプリケーションの多くはCommand Line ToolsのインストールによりまとめてPCに導入できる。
→Linuxコマンド以外のコマンドも使用できる

##Linuxコマンド
・PCへ操作を命令するためのコマンド

・ターミナルではLinuxコマンドの入力でPCに様々な命令を出す。

##依存関係
あるファイルやライブラリが正常に動作するために、別のファイルやライブラリによる処理と結果が必要になる状態を依存と呼び、依存している関係のことを依存関係
→あるファイルが成り立っているのは他のファイルの処理や結果があるためである。


##依存関係を保つために
・いずれかのバージョンを上げすぎないようにすること

・一方の更新に伴ってもう一方のライブラリのバージョンを更新する

##パッケージ
・プログラムや処理をひとまとめにしたもの

・パッケージは複数のライブラリをまとめていることもある。
→関連する何かを一まとめにしたもの
→１つにまとめたもの

##パッケージ管理
・パッケージやパッケージが持つライブラリなどの依存関係を考慮して、インストールやバージョンアップを行う管理のこと（バージョンの保存と切り替え）

・外部からインストールできる処理のまとまりにはバージョンがあり、互いに複雑な依存関係を持っている。パッケージ管理では依存関係を考慮して管理する。

・GemfileとBundlerによっていGem（パッケージ）を管理していたものもパッケージ管理になる。

##パッケージ管理ツール（パッケージマネージャー）
パッケージ管理を自動的に行ってくれるツール
依存関係を考慮してパッケージをインストールする

##Homebrew
macOSのパッケージ管理ツール
→依存関係のあるパッケージが正しく動作するよう、複数のパッケージのバージョンをコントロールしインストールが可能

##Node.js
本来ブラウザ上で動くJavaScriptをサーバーサイドで動作させる実行環境
→ブラウザでの環境を移してサーバーでの環境でJavaScriptを動作させる。

##実行環境
環境のこと。プログラムを動かすために必要なものが揃った場

##Yarn
Javascriptのパッケージ管理ツール。Node.jsの環境上で動作するパッケージを管理する。

##npm
パッケージマネージャー

##バージョン管理
・プロジェクトや言語のバージョンを管理する。

・変更したバージョンを記録あるいは外部から保存して、過去のバージョンや最新のバージョンを切り替えることなど。
→バージョンを管理することでパッケージとの依存関係の問題を解消したり、変更して問題が発生したプロジェクトを過去の安定したバージョンに切り替えるなどの対応ができる。

・Gitによるディレクトリ、プロジェクトn変更履歴の管理もバージョン管理に含まれる。

##rbenv
・Rubyのバージョンを切り替えるためのバージョン管理ツール

・複数のバージョンのRubyをダウンロードしておいて、使用するRubyにバージョンをディレクトリごとに指定することも可能になる。

・Rubyのバージョン変更に伴う依存関係の問題（バージョン管理ツールを使用しない場合、RubyのバージョンはすべてPC内で共通となっているので）を回避できる。
Devise 導入の流れ

復習も兼ねて

①　gem 'devise' をGemfileに記述

②　% bundle install

③　% rails s

④　% rails g devise:install

⑤　% rails g devise user

⑥  マイグレーションファイルに必要なカラムなどを記述

⑦　% rails db:migrate

⑧　% rails g devise:views
docker/docker-composeをAWS AmazonLinux 2にインストール

#概要
タイトル通りですが、普段使用しているLinuxと少し違っていたので備忘録として記載します

#前提条件
AWS EC2(t2-micro/Amazon Linux2 Kernel 5.10)

#Dockerのインストール
yum install でdockerを指定すれば使えるようになります。

```
$ sudo yum -y update
$ sudo yum -y upgrade

$ sudo amazon-linux-extras install docker
```

#docker-composeのインストール

こっちが少しだけ手こずりました。

```
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

$ sudo chmod +x /usr/local/bin/docker-compose

$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
```

#Dockerの起動
```
$ sudo service docker start
```

#Visual Studio CodeのDocker拡張機能の適用
そのままだとDocker拡張機能で"Error: connect EACCES /var/run/docker.sock"と表示されてしまいます。
/var/run/docker.sock　のパーミッションを変更すれば良いようです。

```
$ sudo chmod 666 /var/run/docker.sock
```
AWS　インフラ構築　学習まとめ

#はじめに
本記事を書いた理由は、
AWSのデプロイができたことに満足しただけで現状の知識は0であった。
そのため、せっかくAWSでインフラ構築できたのだから説明できるくらいの理解度は持っておきたいので復習という目的で書いた。
###構成図
![インフラ２](https://user-images.githubusercontent.com/68407983/106387734-76cee880-641e-11eb-97c3-b96895c93ad0.png)
###サーバー環境
【Web サーバー】 Nginx
【アプリケーションサーバー】 Puma

###使用したAWSのサービス
VPC(Amazon Virtual Private Cloud)
RDS(Amazon Relational Database Service)
EC2(Amazon Elastic Compute Cloud)
Route 53
ACM(Certificate Manager)
ALB(Application Load Balancer)
S3(Amazon Simple Storage Service)
IAM(AWS Identity and Access Management)

###月額料金
AWSを使用し始めた月が約1000円
翌月から１００円
理由は分かりませんが、アクセスが少ないからだと思っています。

##簡単にAWSサービス説明

### VPC(Amazon Virtual Private Cloud)
ユーザー専用のプライベートなネットワーク環境を提供するサービス。
VPCの中に、EC２とRDSを構築する。
### EC2(Amazon Elastic Compute Cloud)
インスタンス（仮想マシーン）
EC2ではLinuxやWindowsなど、OSの仮想サーバーを実行できる環境を用意することができる。
### RDS(Amazon Relational Database Service)
データベースサービス

### Region（リージョン）
データセンター。いろんな地域にリージョンは存在する。
AWSで仮想サーバーを構築するには、どのリージョンに作成するか決める。
日本で運用するなら基本東京リージョン。

### サブネット
VPCの中に、小さいネットワークの集まりを作ることができる。
パブリックとプライベートがあり
パブリックはEC2など
プライベートは、外部からのアクセスを遮断したいデータベースなどで使われる
### Elastic IP
固定されたIPを割り当てる。
EC２作成時のIPアドレスは、EC２を再起動したりすると固定化されてないため変更される。
なのでElastic IPを紐付ける。
サイトを公開するなら必要。独自ドメイン取得する時も必要。

### インターネットゲートウェイ
VPCをインターネット接続できるようにする「出入り口」
### ルートテーブル
ネットワークの経路を設定する。
インターネットゲートウェイを使って、サブネットにアクセス可能にしても接続できない。
そこで、ルートテーブルで指定先を明確にする。
### セキュリティグループ
インスタンスごとに許可する通信を設定する

### Route 53
DNSサービス
DNS（Domain Name System）とは→IPアドレスとドメインを結びつける
IPアドレス＝111.111.11
ドメイン＝qiita.comみたいなの
### ACM(Certificate Manager)
HTTPS化に必要
SSL/TLS サーバー証明書を取得できる

### ALB(Application Load Balancer)
HTTPS化に必要
負荷を分散させる役割。

### IAM(AWS Identity and Access Management)
AWSアカウント（ルートユーザー）は、AWS全ての操作、クレジットの登録・変更ができる。
ルートユーザのみでは、情報漏洩すれば不正利用される恐れがある。
そこでIAMユーザーを使う。
IAMは、操作が制限されていて必要な操作のみできる。最悪不正アクセスされても最小限で抑えられる。

##インフラ構築理由

###なぜAWS
初学者は「Heroku」を使用したデプロイが多いため、差別化したかった
インフラ設計・構築がどうやるのか気になった
業務で使用されることが多いから

###Route 53
独自ドメイン取得のために、「お名前.com」を利用
Route 53では、取得したドメインをIPアドレスに変換できる
つまり、取得したドメインをALBに結びつけるためにRoute 53を使用
↓ドメインを取得した私のポートフォリオです
https://re-life.work/

###ALB、ACM（HTTPS化）
ACMでSSL/TLS サーバー証明書を取得
SSL/TLS サーバー証明書をALBに結びつけることで、HTTPS化できる。
Route53の設定も色々あります。

SSLサーバー証明書とは、「安心できるサイトです」という証明書
SSL化（HTTPS化）するメリット
・サイトのデータが暗号化される。
・GoogleがSSL化を推奨している。
https://qiita.com/nakanishi03/items/3a514026acc7abe25977

###EC2サブネット２つ用意
ALBでサブネット2つ以上選択する必要があった。
ロードバランサーの可用性を高めるために必要らしく、おそらく負荷を均等にするために必要なのかと思ってます。

###RDSサブネット2つ用意
マルチAZ構成時に必要のため、作成。
AZ（アベイラビリティゾーン）とはひとつ以上のデータセンターのことで
マルチAZは、複数のデータセンターを利用するということとほぼ同じなので、高い可用性を維持できる。
今回は、低コストに抑えたいため冗長化はしてないです。
RDSのバックアップのために、スナップショットは作成済。
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_CreateSnapshot.html

###S3
S３は高い耐久性、安価、データ量無制限という特徴があるみたいです。
使用理由は、ポートフォリオの画像アップロード機能とバックアップ保存のため
RailsでActiveStorageという機能を使ってパソコン上に画像を保存していたが、本番環境ではクラウドにデータ保存するように設定するため

##終わり
インフラの知識を復習したら、忘れてること・新たに知ったことがあった。
今回は、インフラ構築から２ヶ月ほど経っていたが、アウトプット後は直ぐに復習する方が思い出しやすく効率が良さそう。
また、学習の定着はインプットではなく、思い出そうとした際に定着するらしい。
インプットしながらのアウトプットで学習してきたが、アウトプットの復習は今回が初めてで、復習することで以前より理解度が深まったことから復習の重要性を再確認できた。以上。
デザインシステムのコンテキスト作成

[(原文) Creating Context for Design Systems: A Comprehensive Approach to Documentation](https://www.uxpin.com/studio/blog/creating-context-design-systems-comprehensive-approach-documentation/?utm_source=Blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E4%BD%9C%E6%88%90)

デザインシステムという言葉を聞いたことがあると思います。

おそらくあなたは持っているでしょう。もし持っていなければ、持つことをおすすめします。

しかし、プロジェクト、クライアント、または組織の文脈の中では、それなりに定義されているかもしれない他の名前もあります。これらの名前は、業界の外でもしっかりとした定義を持っています。フレームワーク、ソフトウェアデザインガイド、パターンライブラリ、コンポーネントシステム、UIキット、スタイルガイド、デザイントークンなどです。

普遍的で合意された定義はありません。また、それらの間には多くのグレーゾーンや重複、ギャップがあります。しかし、「デザインシステム」という言葉は、最高レベルの包括的な記述子であることを意図しているということは、少なくとも広く受け入れられている前提があります。

ここでは、デザインシステムとそれをサポートする文書の構造をより完全なものにして、ギャップを埋める方法を探ってみましょう。

## ギャップを埋める
私が遭遇する典型的なデザインシステムの一般的な階層は次のとおりです。

デザインシステム

* 原則
* アクセシビリティ
* UI
  <dd>グローバルスタイル</dd>
  <dd>テンプレート</dd>
  <dd>コンポーネント</dd>
  <dd>スタイル</dd>

しかし、それだけでは必ずしも十分ではありません。製品の表面的な部分だけでなく、もっと踏み込んだ部分も必要です。例えば、特定の要素については、以下のような定義も必要です。

* ドキュメントの構造とネスティング
* 適切な親コンテナ要素
* 属性、役割、マイクロフォーマット
* テキストのウェブスタンダードとアクセシビリティの基準
* 翻訳やローカリゼーションへの配慮

UIデザインだけでは、デザインシステムの基礎にはなりません。

実際には、システムのアウトプットとしての役割の方が大きいのです。したがって、システムにはインプットが必要です。それらのインプットは意思決定のためのコンテキストを提供します。

それらを含めるのです。ある決定は、研究によって十分な情報を得ているかもしれません。また、説明の必要のない決定もあるでしょう。また、説明したり擁護したりするのが難しい決定もあるでしょう。しかし、いずれも記録することが重要です。

*"すべての製品を見て"......そして、すべてに対して1つのデザインシステムを設計します。しかし、なぜそのような決定がなされたのかを調べ始めると、その設計システムでは解決できないローカルな知識が明らかになることがよくあります。" - ルネ・マドセン*

## ワンランク上を目指す: デザインシステムのコンテクストを表現する
どんなデザインシステムも、以下のようなコンテクストのインプットに大きく影響されます。

* 組織の制度的な知識、遺産、文化、信念、偏見（顧客のためにシステムを作成する場合は作成者も含む
パターンがどのように命名され、どのような問題を解決するのかという洞察力
* クラス名やセレクタの決定方法に関する慣習（大文字、小文字、セパレータ、深さ、特異性など）。
* デザインシステムの成功基準
* デザインシステムの決定を支えるユーザー調査、ユーザビリティ調査、そしてその結果としてのデータとテーマ

これらはすべて、実際の決定に加えて、意思決定の基準を表しています。

## デザインシステムのメタファー
では、このコンテキストをどのように捉えればよいのでしょうか。

HTMLでは、すべての文書は*head*で始まります。

head要素は、ドキュメントのメタデータの集合体を表しています。デザインシステムは、そのコンテキストを記述するために*head*が必要です。

例えば、プロセス、ソース管理、ガバナンスは一般的にデザインオプス（運用）の役割に該当しますが、それでも文書化する必要があります。

ここでは、包括的なメタデータと、より完全なデザインシステムのための構造を紹介します。

*head*
リサーチ＆インサイト
理念と倫理
プライバシーとセキュリティ
問題提起
方法論とプロセス
定義
使用ガイド
その他の基準
エコシステム
ローカライズ
パフォーマンス予算
ソースコントロール
ガバナンス
著作権・ライセンス
*/head*

*body*
デザインシステム
1. 原則
2. アクセシビリティ
3. プラットフォームとチャネル
4. 入力
5. UI
5.1. ボイス＆トーン
5.2. コンポーネントとパターン
5.3. スタイル
5.4. モーション
6. コンテンツ
7. ローカライズとバリアント
8. パフォーマンス予算
9. マークアップ
9.1 ソースコントロール
10. ホスティング
11.  ウェブビュー
*/body*

## まとめ
すべてのデザインシステムにははじまりの物語があり、反復して進化していきます。変更されたものは、新しい学習の結果です。それをどこかに記録しておきましょう。

*head*は、デザインシステムに関するすべてのメタデータを抽象化するために必要な層を表す完璧なメタファーであるように思えます。

UXPinは、世界中の製品チームがアイデアをより早く製品化するためのデザインプロセスツールです。

UXPinの革新的なテクノロジーである[Merge](https://www.uxpin.com/studio/merge-jp/?utm_source=Blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E4%BD%9C%E6%88%90)により、PayPalのような企業はDesignOpsの課題を容易に解決することができます。UXPin Mergeでは、Reactコンポーネントを使ってデザインし、最終製品との完全な一貫性を実現することができます。

**本記事は2017/12/8投稿、2021/1/20更新を翻訳したものです**
IDCF CDNのGzip圧縮設定をfastly APIで有効化する

IDCFのCDNサービスにおいてfastly APIを使ってGzip圧縮設定を有効化する方法です。
まとめてしまうと次の2つのURLで実現できますがそこに至るまで試行錯誤紆余曲折だったので記録しておきます。
※IDCF互換方式のAPIはここでは触れません

[APIs - API Docs | IDCFクラウド](https://www.idcf.jp/api-docs/apis/?id=docs_cdn_request)
[Gzip  |  Fastly Developer Hub](https://developer.fastly.com/reference/api/vcl-services/gzip/)

## 事前準備
* CDN管理画面(ダッシュボード)の基本設定から、対象サービスのID(22桁くらいの英数字)を覚えておきます
* 管理画面左のメニュー "API" からFastlyとアカウント連携し、APIキー(43桁くらいの英数記号)を取得します

## 手順
* 対象サービスの現行バージョンを「クローン」します
* コンソールからcurlを使ってAPIを叩きます

※ 以下の例ではcssとjsを圧縮対象としています
※ エラー文言的なjsonが返ってこなければ成功です。

```console
$ curl -X POST https://cdn.idcfcloud.com/api/v1/service/{対象サービスID}/version/{クローンしたバージョン番号}/gzip \
 -H 'X-IDCF-CDN-APIKEY: {APIキー}' \
 -H 'Accept: application/json' \
 -d '{"name":"gzip-config-name-sample", "extensions":"css js", "content_types":"text/css application/x-javascript"}' 
```

* クローンした新しいバージョンを「有効」にします
* どこか外部のGZIP圧縮確認サイトなどで圧縮が効いているか確認できたら完了です

## 蛇足
* 新バージョンのVCLには vcl_fetch ブロックに圧縮設定のコードが追加されます。
このコードがあれば動くのか、と別サービスにコピペしてみましたが効果はありませんでした。残念…
* 設定できたはずなのにGZIP圧縮確認サイトで失敗する、というときはキャッシュが効いてる可能性があります。ソフトパージして再度確認しましょう。
駆け出しエンジニア用！結構業務で出てくる単語②

## 対象
駆け出しエンジニア
エンジニアになりたい！

## 概要
業務で出てくる用語で知らない単語をまとめていくシリーズになります。
経験者からしたら、え？？そんなのも知らないの？？笑
ってなりますが、特に異業種未経験から入社すると知らない単語ばかりです。

逆に言うとこれからエンジニアになりたい方は覚えておいて損はないと言うことです！笑
今回はちょっとマーケティングよりの話になってくるかもしれないです。

##CPAって
新規顧客を獲得するのにかかった一人あたりの単価を表す略語です！

例えば広告に100万かけて会員数が1万人増えたとします。
そうするとCPAは100円になります！！


## リタゲって？
リターゲティングの略です。
いやそんなんも知らないんかい！笑
って感じですよね笑

これはwebサイトなどで過去に訪問したことのあるユーザーに広告を表示することです。
大体Cookieを使用して判断することが多いそうです。
同じユーザーに何度も広告が表示されないようにするなどこちらは注意が必要です。

## コンバージョン
いやそれも知らないんかい！笑
コンバージョンとはサイトごとにゴールを決めて、そのゴールに対してのアクションがどれくらいだったかを表します。

ゴールが、会員登録をするであれば、会員登録をした人をコンバージョンとしてカウントしていきます。


お疲れさまでした！！
ZFSのsnapshotを効率的に削除する

# はじめに
微妙なライセンスの関係でイマイチ日の目を見れていないzfsですが、使ってみるととても便利この上ないです。
そんなzfsのsnapshotの効率的な削除の方法を紹介したいと思います。

みんみんさんの記事で [ZFSのsnapshotをまとめて削除する](https://qiita.com/belgianbeer/items/822733b30200a2b6727f)もございますので、合わせて見てもらえればと思います。

ちなみに私は紹介記事です。

## ZFS Prune Snapshots
[こちら](https://github.com/bahamas10/zfs-prune-snapshots)が公式です

このスクリプトを使う事で秒分時日週月年単位によるsnapshotの始末ができます。

まんまですが、1週間より前のsnapshotを削除する場合は

~~~
# zfs-prune-snapshots 1w
~~~
で終わり。ちなみにzpool内の全てのsnapshotが対象です。

データセットを指定する事ももちろん可能。並べれば複数同時にもできます。
tank1およびtank2/backupの3週間より前のsnapshotを削除します。

~~~
# zfs-prune-snapshots 3w tank1 tank2/backup
~~~

snapshotの名前でも指定できます。
"autosnap_"で始まる1ヵ月より前のsnapshotを削除します。

~~~
# zfs-prune-snapshots -p 'autosnap_' 1M
~~~

prefixがあるという事はsuffixもあります。
"_frequent"で終わる2か月より前のsnapshotを削除します。

~~~
# zfs-prune-snapshots -s '_frequent' 2M
~~~

### 日時の引数
`s` 秒
`m` 分
`h` 時
`d` 日
`w` 週
`M` 月
`y` 年
となっています。

### Dry run
そして素敵機能ドライランが出来ます。 `n`オプションで削除するsnapshotを確認できます。

1週間より前のsnapshotを削除するリストを確認する。

~~~
# zfs-prune-snapshots -vn 1w
~~~

## おわりに
こういった痒い所に手が届くツールは本当にありがたく使わせて頂いております。
ますますzfsが手放せなくなりますね！
グレイコード

### グレイコード(gray code)とは
2進数の表現の一つである。数が1増減したときに常に1ビットしか変化しないという特徴がある。変化が1ビットのみなので、誤作動を起こしづらくなるため、ディジタル回路などに利用される。

### バイナリコード
通常のコンピュータ上で扱う２進数表現のこと（10進数の3は2進数では11）

###  なぜ必要か
バイナリコードでは、数が増減する時、複数のビットが変化することがある。例えば７->８に変化する時は
0111
1000
なので、4ビット分変化することになる。ディジタル回路において、4ビット分変化する時、変化速度によっては0111->0000になる状態や0111->1111になる状態が存在することになり、誤ったデータとして処理してしまう可能性が高くなる。数が増減する時のビット変化をできるだけ少なくした方が誤作動を起こしにくくなる。

### バイナリコードとグレイコード比較
| 十進数 | Binary Code | Gray Code |
| :---: | :---: | :---: |
| 0 | 0000 | 0000 |
| 1 | 0001 | 0001 |
| 2 | 0010 | 0011 |
| 3 | 0011 | 0010 |
| 4 | 0100 | 0110 |

### バイナリコードからグレイコードへの変換
グレイコードは、バイナリコードを右シフトし、XORを取ったものと定義する。

```cpp
//BinaryCode -> GrayCode
unsigned int convertBinaryToGrayCode(unsigned int n) {
    return n ^ (n >> 1);
}
```

### グレイコードからバイナリコードへの変換
グレイコードからバイナリコードに変換する場合は以下の規則に従う。
1. 最上位桁の1は同一
2. 以下、上位から2桁ずつ見ていき、
3. 1か0が連続していればグレイコードは0、連続していなければ1とする。

![greycode.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118025/82ce58f9-61e0-6aa6-6c07-11ee541f2bfa.png)


という定義なのだが、コードで表現する際は以下のようにすればよい。

```cpp
//GrayCode -> BinaryCode
unsigned int convertGrayToBinary(unsigned int n) {
    unsigned mask = n;
    while (mask) {
        mask >>= 1;
        n ^= mask;
    }
    return n;
}
```

### 確認用
1~10までをグレイコードに変換するコードを以下に記す。

```cpp
#include <iostream>
#include <bitset>
#include <time.h>
using namespace std;
#define rep(i,s,n)for(ll i = s;i<n;i++)

//BinaryCode -> GrayCode
unsigned int convertBinaryToGrayCode(unsigned int n) {
    return n ^ (n >> 1);
}

//GrayCode -> BinaryCode
unsigned int convertGrayToBinary(unsigned int n) {
    int mask = n;
    while (mask) {
        mask >>= 1;
        n ^= mask;
    }
    return n;
}

int main() {
    int p = convertBinaryToGrayCode(13);
    int a[10];
    cout << "BinaryCode -> GrayCode" << endl;
    for (int i = 0; i < 10; ++i) {
        //変換
        a[i] = convertBinaryToGrayCode(i);
        //Bitsetを使用して表示
        cout << i << "=" << bitset<4>(i) << ":" << bitset<4>(a[i]) << endl;
    }
    cout << endl;

    cout << "Graycode -> Binarycode" << endl;
    for (int i = 0; i < 10; ++i) {
        //変換
        int x = convertGrayToBinary(a[i]);
        //Bitsetを使用して表示
        cout << bitset<4>(a[i]) << ":" << bitset<4>(x) << "=" << x << endl;
    }
}
```
実行結果

```
BinaryCode -> GrayCode
0=0000:0000
1=0001:0001
2=0010:0011
3=0011:0010
4=0100:0110
5=0101:0111
6=0110:0101
7=0111:0100
8=1000:1100
9=1001:1101
10=1010:1111

graycode -> binarycode
0000:0000=0
0001:0001=1
0011:0010=2
0010:0011=3
0110:0100=4
0111:0101=5
0101:0110=6
0100:0111=7
1100:1000=8
1101:1001=9
1111:1010=10
```
backgroundとbackgroundTintの違い

# `android:background`

背景として使用するドローワブルで、描画可能なリソース（PNG画像、9パッチ[^2]、 シェイプドローワブル[^1]、色を指定します。

色の形式は「`#rgb`、`＃argb`、`＃rrggbb`、`#aarrggbb`」があります。

#`android:backgroundTint`

backgroundにカラーフィルターをかけて色を変化させることが出来ます。

例えば、`android:background="#FF0000"`（赤）で、`android:backgroundTint="#00FF00"`（緑）を指定すると、`#FFFF00（黄色）`になります。

> [３原色と色度図より](https://www.shokabo.co.jp/sp_opt/spectrum/color3/color3.htm)

<img src="https://www.shokabo.co.jp/sp_opt/spectrum/color3/rgb-s.gif" />

色の形式は`android:background`と同じく、「`#rgb`、`＃argb`、`＃rrggbb`、`#aarrggbb`」があります。

`backgroundTint`には、`android:backgroundTintMode`というものがあり、色合いの「ブレンディングモード」を設定することが出来ます。

## `android:backgroundTintMode`

### `android:backgroundTintMode="add"`

色合いと描画可能なカラーおよびアルファチャネルを組み合わせて、結果を有効なカラー値にクランプ（合わせるみたいな意味？）します（S + D）

### `android:backgroundTint="multiply"`	

ドローアブルのカラーチャンネルとアルファチャンネルに色合いのチャンネルを掛けます。 [Sa * Da、Sc * Dc]

### `android:backgroundTint="screen"`

[Sa + Da - Sa * Da, Sc + Dc - Sc * Dc]

### `android:backgroundTint="src_atop"`

色合いはドローアブルの上に描画されますが、ドローアブルのアルファチャネルが結果をマスクします。 [Da、Sc * Da +（1-Sa）* Dc]
 
### `android:backgroundTint="src_in"`

色合いは、ドローアブルのアルファチャネルによってマスクされます。ドローアブルのカラーチャンネルは破棄されます。 [Sa * Da、Sc * Da]

### `android:backgroundTint="src_over"`

ドローアブルの上に色合いが描かれています。 [Sa +（1-Sa）* Da、Rc = Sc +（1-Sa）* Dc]

[^1]: 色やグラデーションなどを含む図形を定義するXMLファイル）などの状態ファイル
[^2]: コンテンツや画面の大きさに合わせて、サイズが伸縮するビットマップ画像
Windows10のキーマッピングを変更して、AppleMagicなどのUSキーボードで使いやすくする。

#想定読者
普段Macを使っているのだが、ひょんなことでWindows10を使う必要が出てきた人。

#背景
会社から借りているMacBook Air（キーボードはUS配列）が故障。代替機としてVAIO（JIS配列）の貸与を受ける。
日本語入力切替やコピペなどのショートカットがだいぶ違うのでしんどい。
Apple Magic Keyboardがあるので、これでMac風の使い方ができないか模索。

#手順
1. Windows OSのキーボード割り当てをUSキーボードに変更する。
2. Microsoft PowerToysをインストールする。
3. PowerToysで、キーアサインを変更する。

## WindowsOSのキーボード配列をUSキーボードに変更する。

[Start]
->[設定]
->[時刻と言語]
->[言語]
->[優先する言語]
->[日本語]
->[オプション]
->[ハードウェアキーボードレイアウト]
->[レイアウトを変更する]
->[英語キーボード(101/102キー)]

深い...

## Microsoft PowerToysをインストールする。
Google検索をするとシェアウェアが上位に出てくるが、Microsoft公式のほうが安心。
PowerToys
https://docs.microsoft.com/ja-jp/windows/powertoys/install

## PowerToys でキーボードショートカットを変更する。
変更内容

| MagicKeyboardのキー | Windowsでの認識 | PowerToysでのマッピング | 狙い |
| :-- | :-- | :-- | :-- |
| ``Command`` | ``Windows`` | ``Ctrl`` | キーボードショートカットをいつもの感じで |
| ``Command+Space`` | ``Ctrl+Space`` | ``Alt+`（アクサンクラーブ）`` | IME切り替えもいつもの感じで。``Command/Windows``の``Ctrl``変更が効いていることが前提 |

設定した画面は以下。
![powertoys.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43829/91d0ca7b-e18f-7980-2bdb-993dd6bf1d43.png)

# 最後に
VAIOなどノートパソコンでは、本体付属のキーボードがほぼ使い物にならない。
外出時などは、PowerToysを終了するか。

MacBook Air 2020は、故障が多いのではないだろうか。
今回の症状は左スピーカーの音割れだが、どうもUSB-Cポートにさしていたアダプタを抜いた瞬間にバスっといって以降、割れだしたような。
USB-Cを抜いたタイミングで、異常終了したこともあった。
その前に使っていたMacBook Air 2013は、異常終了なんてほぼなかった記憶だが。
ドラクエウォークのモンスターをk-meansでクラスタリングしてみた

YouTubeのゲーム実況などを見てると「このモンスターはあのモンスターと似てますね」という発言を聞くことがあるが、そのたびに、よく頭に入ってるなぁと感心する。ドラクエウォークはモンスターを倒すと稀に「こころ」を入手でき、身につけるとHPが高くなるなど効果があるが、この8つのパラメータをk-meansでクラスタリングすると、似たようなことができるんじゃないだろうか。

まず、こんなCSVファイルを用意する。（別に作ったやつの流用なので、ちょっと古い）

```
name,cost,color,hp,mp,power,defense,attack,recover,speed,skill
フレイザードA,99,紫,90,85,15,26,64,25,47,69
暴嵐天バリゲーンA,99,黄,110,44,51,79,29,29,28,44
アカイライS,99,青,79,47,55,52,25,23,72,72
ホロコーストS,99,紫,74,87,14,46,72,29,54,63
ガーゴイルA,98,赤,73,31,68,41,11,11,60,53
```

これをpandasで読み込みscikit-learnのKMeansでクラスタリングする。とりあえず10個に分類してみた。

```py
import pandas as pd
import pprint
from sklearn.cluster import KMeans

n_cluster = 10

monsters = pd.read_csv("monster.txt", sep=',', na_values=".")
df = monsters.drop('name',axis=1).drop('color',axis=1)
kmeans_model = KMeans(n_clusters=n_cluster).fit(df.iloc[:, 1:])
labels = kmeans_model.labels_

monster_type = []
for i in range(n_cluster):
    monster_type.append([])

n = 0
for i in labels.tolist():
    name = names.iloc[n]['name']
    monster_type[i].append(name)
    n = n + 1

pprint.pprint(monster_type)
```

これを見やすく整形してみたのがこちら。ちょっとクラスタ数が10だと大雑把すぎるかもしれない。

![スクリーンショット 2021-03-22 18.05.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/80272c8a-f627-947d-2c28-faf29e1b1b9c.png)

参考にした記事で色分けして表示していたので、同じように表示してみた。
https://qiita.com/maskot1977/items/34158d044711231c4292

```py
# https://www.color-site.com/separate_hues
color_codes = {
    0:'#BA7836',
    1:'#ADBA36',
    2:'#5EBA36',
    3:'#36BA5E',
    4:'#36BAAD',
    5:'#3678BA',
    6:'#4336BA',
    7:'#9236BA',
    8:'#BA3692',
    9:'#BA3643',
}
colors = [color_codes[x] for x in labels]

import matplotlib.pyplot as plt
from pandas import plotting

plotting.scatter_matrix(
    df[df.columns[1:]],
    figsize=(6,6),
    color=colors,
    alpha=0.8, 
    diagonal='kde'
)
plt.show()
```

![スクリーンショット 2021-03-22 17.48.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/a35f9538-b4a7-186c-5a06-220bcb9b31b4.png)

データ一式は下記に置いているので試したかったらgit cloneしていただければ。

https://github.com/usop4/dqw_kmeans
【超かんたん】Railsのscopeってなんぞや？

scopeの使い方をレシピアプリを例に解説、設定していきます。

##scopeとは
そもそもscopeとは何なのか？ [Railsガイド](https://railsguides.jp/active_record_querying.html#%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97)では以下のように説明されています。
>スコープを設定することで、関連オブジェクトやモデルへのメソッド呼び出しとして参照される、よく使用されるクエリを指定することができます。スコープでは、where、joins、includesなど、これまでに登場したすべてのメソッドを使用できます。どのスコープメソッドも、常にActiveRecord::Relationオブジェクトを返します。このオブジェクトに対して、別のスコープを含む他のメソッド呼び出しを行なうこともできます。
単純なスコープを設定するには、クラスの内部でscopeメソッドを使用し、スコープが呼び出されたときに実行して欲しいクエリをそこで渡します。
出典：[Railsガイド](https://railsguides.jp/active_record_querying.html#%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%97)

むむ、なんか難しそう...
と思われる方も多いかもしれませんが**簡潔にまとめるとscopeとはwhere、order、limitなどの複数のクエリをまとめたメソッド**になります。

文章だけでは難しく感じると思うので実際にコードを見ていきましょう。

####scopeの使い方の例
例えば以下のようにしてレシピ情報を取得するとします。

```ruby:app/controllers/recipes_controller.rb
class RecipesController < ApplicationController
...
  def index
    @recipes = Recipe.order(created_at: :desc).limit(10)
  end
...
end
```
上記のコードの`order(created_at: :desc).limit(10)`の部分をrecentと命名しモデルにまとめていきます。

```ruby:app/controllers/recipes_controller.rb
class Recipe < ApplicationRecord
...
  scope :recent, -> {order(created_at: :desc).limit(10}
...
end
```
上記で定義したscopeを使用します。

```ruby:app/controllers/recipes_controller.rb
class RecipesController < ApplicationController
...
  def index
    @recipes = Recipe.recent
  end
...
end
```
以上が使い方の例になります。

####scopeのメリット
scopeを使うことによって以下のようなメリットがあります。
**・ コードが簡潔になる
・ 修正する場合修正箇所が少なくなる
・ 自分で命名できるので直感的に扱いやすくなる**

先ほどの例で説明すると以下のコードは同じ意味になりますが、scopeを使用した方がより簡潔になります。

```ruby:app/controllers/recipes_controller.rb
class RecipesController < ApplicationController
...
  def index
    #scopeを定義しなかった場合
    @recipes = Recipe.order(created_at: :desc).limit(10)
    #scopeを定義した場合
    @recipes = Recipe.recent
  end
...
end
```

##scopeの設定方法
scopeがどんなものか理解できてきたと思うので、設定の仕方について説明していきます。
####基本的な設定方法

```ruby
class モデル名 < ApplicationRecord
  scope :スコープ名, -> { 条件式 }
end
```
第一引数にシンボルを使ってスコープ名設定し、第二引数は-> { 条件式 }とします。
先ほどの例でいうと条件式は`order(created_at: :desc).limit(10)`になります。

####引数を使う場合
->のあとに引数を定義すると引数を渡すことができます。

```ruby
class モデル名 < ApplicationRecord
  scope :スコープ名, -> (引数) { 条件式 }
end
```
先ほどの例で説明するとlimitで取得したい数を引数にします。

```ruby:app/controllers/recipes_controller.rb
class Recipe < ApplicationRecord
...
  scope :recent, -> (count) {order(created_at: :desc).limit(count)}
...
end
```

```ruby:app/controllers/recipes_controller.rb
class RecipesController < ApplicationController
...
  def index
    @recipes = Recipe.recent(10)
  end
...
end
```
Qiita記事の書き方

###Qiita 記事（よく使う記法）の書き方をまとめました。
これだけ知っておけばまあまあの記事は書けるかな。（自分用の忘備録です。）
-------------

#1.0　見出し
##### #の数で調整可能
>例：####これはh4の見出しです。
####これはh4の見出しです。

-------------




#2.0　水平線の書き方
#####\*\*\* または \-\-\- を書く
>例：（省略）

-------------




#3.0 太字とイタリック
\*\*と\*\*で文字をはさむとstrongタグと同じく太字になる
ちなみに\*と\*ではさむとイタリック体になる
例：文字を**強調**します。これは*Italic*です　



-------------





#4.0　コードの挿入　ファイル名付(C#の場合)
#####\`\`\` と \`\`\` でくくる
注意１：　\`はバッククオート（@とShift）です。クォーテーション'ではないので注意必要
注意２：　\`\`\`の後に続けてc#:〇〇〇.cs （〇〇〇はファイル名）
注意３：　\`\`\`は単独行とする
注意４：　コード挿入前に1行空ける（とうまくいく場合がある）
>例：
\`\`\`c#:test.cs
Debug.Log("Consoleに表示");
\`\`\`

```c#:test.cs
Debug.Log("Consoleに表示");
```
-------------




#5.0　画像埋め込み
#####ファイルをドラッグ＆ドロップ（もしくは上部中央の画像アイコンを使いファイルを選択）
>例：
![悠悠自適 小.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352037/449d0d73-4758-72d8-36c6-0e20ea25345f.jpeg)

👍**ポイント**
**画像のサイズを調整したいときはimgタグにする（markdownではサイズ調整なし）**
\<img src="画像のURL" width="横幅で調整する場合">

-------------






#6.0　URLリンク
#####  リンクしたいテキストを[]で囲む
>例：\[リンク用テキスト] (URLアドレス "タイトル")
[Qiita](http://qiita.com "QiitaのHomepage")

-------------


#7.0　コメントアウト（？）
#####記号の前に\を書く
>例：\\*\\*\\*　→　\*\*\*

-------------


#8.0　自動保存
#####記事を編集した場合、自動で下書きに保存される
---
Chromebookでの開発と相性がよいcode-serverを自動起動設定

2021-03-30追記

https://qiita.com/shin1kt/items/acf44cb7e8112e2b6a18

こちらに、日本語環境からcode-serverの構築までの記事をまとめました。
よろしければこちらもどうぞ。

---

Chromebookでコードを書くときに、Crostini（ChromeOSのLinuxコンテナ）で、code-serverを立ち上げて、Chromeブラウザからアクセスすることで、スタンドアロンのVS-Codeのように使うのがとても相性がよいです。
興味ある人は 参考サイト [^1] をどうぞ

# 自動起動が便利だったので設定メモ

Crostini を起動したときに自動的に開始するようにサービスに登録します。

### 起動コマンドを作る

```sh:/opt/code-server.sh
#!/bin/bash

/usr/bin/code-server /home/[ユーザー名] --port=任意のポート番号 --config="/home/[ユーザー名]/.config/code-server/config.yaml"
```
- コマンド含めてフルパスで指定
- 初期ディレクトリはとりあえずホームを指定しましたが他のでも良いと思います。
- 任意のポートは指定しなければデフォルトのになります（8080）
- `--config` は設定ファイルの位置。初回起動したときに作られていると思います。

ポート: 8081 ユーザー名: myname だとしたら

```sh:/opt/code-server.sh
#!/bin/bash

/usr/bin/code-server /home/myname --port=8081 --config="/home/myname/.config/code-server/config.yaml"
```

作ったら実行権限を付与

```ターミナル
$ sudo chmod +x /opt/code-server.sh
```

### サービスを作る

```sh:/etc/systemd/system/code-server.service
[Unit]
Description = code-server daemon

[Service]
ExecStart = /opt/code-server.sh
Restart = always
Type = simple
User = [ユーザー名]
Group = [ユーザーグループ名]

[Install]
WantedBy = multi-user.target
```
- `User`と`Group`はユーザー名で良いと思います。これを設定しないとcode-server内でターミナルを開いたときにrootユーザーで開いてしまい色々不便です。

### サービスの起動

```ターミナル
systemctl start code-server
systemctl enable code-server
```

停めたくなったら。

```ターミナル
systemctl stop code-server
systemctl disable code-server
```

（※）あくまでChromebook内でお手軽＆ローカルに使うことを前提としていますので、公開サーバでやるときは、ちゃんとした設定が必要です！


# 使った感想をメモ


## よかったところ

- __日本語入力__：通常ChromebookでLinux版VS-Codeを使うと、日本語入力もLinuxのMozcなどに頼ることになりますが、code-serverならChromeOSのデフォルトの日本語入力が使えます。地味に嬉しいです。
- __画面__：PWAとしてインストールすることでデスクトップアプリのように動きます。Chromeブラウザでの表示なので、ディスプレイ環境によってはLinux版よりも解像度がきれいに表示されて見やすいです。

## よくないところ
- __拡張機能が少ない__：公式のVS-Codeよりも拡張機能が無い/古いです。ただ、やリ方はあるみたいで、[リモートサーバー上でvscodeを動かしてブラウザからアクセスする ―code-serverのススメ](https://qiita.com//canonrock16/items/b043a996fe1175298207)でいろいろ学べるのでいろいろチャレンジしてみたい。
- __キーバインド__：キーボードショートカットの設定ができるんですが、ChromeOSのキーバインドに邪魔されたりしてちょっと大変です。使い心地よくなるまで地道に設定していくしかないかな。
- __設定の反映__:PWAだからなのか、キーバインドの設定画面で、新しいキーを登録してもすぐに画面に反映されず再起動が必要なことがありました。PWAだから画面キャッシュみたいのが効いているのかな。（ただ、画面の再読み込みするだけなのでそれほど気になりません）

いろいろ不便はありますが、自分は拡張機能とかをあまり入れない派なので、いまのところ快適に使えています。

# 参考

以下の記事を参考にしました。ありがとうございました。

code-server関連の情報をいただいた参考サイトです。

- [本家リポジトリ](https://github.com/cdr/code-server)
- [Chromebookには、VS Code より code-server がオススメ](https://note.com/digzero/n/n70ee0402a92b)
- [リモートサーバー上でvscodeを動かしてブラウザからアクセスする ―code-serverのススメ](https://qiita.com//canonrock16/items/b043a996fe1175298207)
- [ブラウザ上でVScodeが使えるcode-serverを試してみる](https://www.cleartex.net/entry/2019/04/23/codevsc)

Linuxのサービスについて

- (systemdの.serviceファイルで、実行ユーザーを指定する)[https://qiita.com/todanano/items/f66f1a3ad76f76de0772]

[^1]: ↑に参考サイトに非常に詳しく書いてあります
EC2 エラー解消例

```
Capfile locked at 3.11.0, but 3.16.0 is loaded
```

EC2の設定でターミナルに上記のエラーが表示された場合、
config/deploy.rb の最初の方にある lock '3.11.0' という行を lock '3.16.0' 
に書き換えれば エラー解消されます。
marv_techアカウントを作成しました。

# marv_techアカウントを作成しました。

### こんにちは @marv_techです。
### この度Qiitaにてアカウントを開設しました。
### 今後の展望としましては、プログラミングに関する情報を配信して行きたいと思います。
### 皆様　どうぞよろしくお願いします。