OmniAICreator/Qiita-1.07M huggingface dataset:
SSHのたびにDockerコンテナを立ち上げる

[TCPでDockerの標準入出力を提供したい \- Qiita](https://qiita.com/kusano_k/items/161ba8cba1000cbf3510)

↑は失敗。真面目に`docker kill`とかやらないとダメかなと考えていたけれど、そもそもやりたいことは接続ごとにコンテナをリセットすることで、`nc`でなくても良かった。シェルを提供するならSSHを使うほうが良いよね。ということで、SSH接続があったら、コンテナを立ち上げ、そのコンテナを渡す方法。

SSHサーバーを立ち上げるDockerfile。

```Dockerfile
FROM centos

RUN \
  dnf -y install openssh-server passwd && \
  dnf -y clean all

RUN \
  ssh-keygen -t rsa -N "" -f /etc/ssh/ssh_host_rsa_key && \
  ssh-keygen -t ecdsa -N "" -f /etc/ssh/ssh_host_ecdsa_key && \
  ssh-keygen -t ed25519 -N "" -f /etc/ssh/ssh_host_ed25519_key

RUN \
  adduser user && \
  echo p@ssw0rd | passwd --stdin user

# これを消さないと一般ユーザーはログインできない
RUN rm /run/nologin

CMD ["/usr/sbin/sshd", "-D"]
```

nologinを消さないとroot以外はログインできない。

このDockerfileだと`ssh-keygen`のところで生成しているサーバー鍵がキャッシュされるので注意。例えば、後半を書き換えて別のイメージを作り、そのイメージを他人に渡すと、自分の手元のコンテナのサーバー鍵と同じサーバー鍵を他人が持っていることになるので、中間者攻撃とかをされてしまう。これで作ったイメージ自体を公開するのもダメ。

ビルド。

```shell-session
$ docker build -t ssh_server .
```

シェルスクリプトを用意。

```ssh_server.sh
# コンテナを立ち上げ、
cid=$(docker run --rm -d ssh_server)
# IPアドレスを取得し、
ip=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ${cid})
# 標準入出力を${ip}:22に繋ぐ
timeout 3m socat - TCP:${ip}:22
# タイムアウトするか標準入出力が切断されたら、コンテナを終了
docker stop ${cid}
```

このシェルスクリプトは、標準入出力を新しく立ち上げたコンテナのポート22に繋ぐ。

あとはホストの適当なポートで接続を待ち受けて、このシェルスクリプトの標準入出力に渡せば良い。この部分はxinetdでも良い。

```shell-session
$ socat TCP-LISTEN:2222,reuseaddr,fork 'SYSTEM:sh ssh_server.sh'
```

```shell-session
$ ssh user@ssh-server.example.com -p 2222
user@ssh-server.example.com's password:
[user@a73d4676f399 ~]$ echo "hoge" > hoge
[user@a73d4676f399 ~]$ ls -al
total 28
drwx------ 1 user user 4096 Feb 25 15:13 .
drwxr-xr-x 1 root root 4096 Feb 25 15:05 ..
-rw-r--r-- 1 user user   18 Jul 21  2020 .bash_logout
-rw-r--r-- 1 user user  141 Jul 21  2020 .bash_profile
-rw-r--r-- 1 user user  376 Jul 21  2020 .bashrc
-rw-rw-r-- 1 user user    5 Feb 25 15:13 hoge
[user@a73d4676f399 ~]$ exit
logout
Connection to ssh-server.example.com closed.

$ ssh user@ssh-server.example.com -p 2222
user@ssh-server.example.com's password:
[user@0e2465485f42 ~]$ ls -al
total 20
drwx------ 2 user user 4096 Feb 25 15:05 .
drwxr-xr-x 1 root root 4096 Feb 25 15:05 ..
-rw-r--r-- 1 user user   18 Jul 21  2020 .bash_logout
-rw-r--r-- 1 user user  141 Jul 21  2020 .bash_profile
-rw-r--r-- 1 user user  376 Jul 21  2020 .bashrc
[user@0e2465485f42 ~]$ exit
logout
Connection to ssh-server.example.com closed.

$ ssh user@ssh-server.example.com -p 2222
user@ssh-server.example.com's password:
[user@62bc4f4c36ed ~]$ Bad packet length 1237871916.
ssh_dispatch_run_fatal: Connection to xxx.xxx.xxx.xxx port 2222: Connection corrupted
```

新しいファイルを追加しても繋ぎ直したらリセットされているし、接続して放置していると（上記のシェルスクリプト中の`timeout`で）3分で強制切断されるし、どうなってもサーバー側にDockerのコンテナが残ることはない :ok_hand:
Active Strageでファイル形式を指定して保存

今回はrailsでの動画投稿機能実装のアウトプットです。

動画投稿の際にActive Strageでmp4ファイルのみ保存させたかったので、自己流ではありますが今回はcontroller側で制御する形で実装しました。

```posts_controller.rb
class PostsController < ApplicationController
  def index
    @posts = Post.all
  end

  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)
    if @post.valid? && @post.video.content_type == "video/mp4"
      @post.save
      redirect_to posts_path
    else
      render :new
    end
  end

  private
  def post_params
    params.require(:post).permit(:title, :video).merge(user_id: current_user.id)
  end
end
```
```models/post.rb
class Post < ApplicationRecord
  belongs_to :user
  has_one_attached :video

  validates :title, :video, presence: true
end
```

今回はcontent_typeで保存するデータのファイル形式を指定できるということに気づくことが出来ました。
ですが本当は他の書き方で、より効率的に、ファイルサイズ等もまとめて指定して書ける方法があるのだと思います。
モデル側で書く方が正しいのかもしれません。

まだまだ自分は初心者なので、
よりDRYな実装ができるよう更に学習を深めて改善に努めていきたいと思います。
【Vue.js】Vue Devtools導入

# Vue Devtools導入

[Vue.js Devtools/Chrome ウェブストア](https://chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd/related)

# 問題発生
```Vue.js not detected```で使えない・・・


# 解決
[Vue3.0でChrome Vue.js devtoolsを有効にする](https://qiita.com/yosaprog/items/b1305b3e607272e70958)

最後にVueパネルをオープンする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/979873/c9209703-440a-b421-98aa-e2403e1c9e2c.png)
【Python】 初心者による初心者のためのスライス(:)の使い方

はじめに
---
普段は、Ruby on Railsの学習しており、プログラミング歴も４ヶ月程とまだまだひよっこです。
そんな私ですが、数日前からPython学習も始めました。
今回はその中でも「スライス」についてですが...このスライスよく出現するのですが、なかなか難しく毎回調べてしまいます。
なので、記事を書きながら、復習と自身の頭の中の整理に繋がればと思い投稿させていただいております。
<br>

スライス(:)とは
---
配列の一部を取得できる。

使い方の例
---
※前と後ろの表現が出てきますが、0の方が前、9の方が後ろになります。

```python
import numpy as np

# こちらのdataをベースに進めていきます
data = np.arange(0, 10)
print(data)
[0 1 2 3 4 5 6 7 8 9] # 0〜9までを配列として取得
```
#####● :と数字が1つの場合
・[:(数字)]
前から数字の分だけ配列を取得する

・[(数字):]
後ろから数字の分だけ配列を取得する

・[:]
全ての配列を取得する

```python
print(data[:3]) # 前から3つ配列を取得
[0 1 2]

print(data[3:]) # 後ろから3つ配列を取得
[7 8 9]

print(data[:]) # 配列を全て取得
[0 1 2 3 4 5 6 7 8 9]
```

#####● :と数字が2つの場合
・data[始まり : 終わり]
基本的に始まりの数字はそのままの数値、終わりを指定する数字は1つ手前の数値を表しているようです。

```python
print(data[2:6]) #2から5までの配列を取得(6の１つ手前まで)
[2 3 4 5]

print(data[-6:-2]) 
#後ろから6番目の数字から3番目の数字まで取得(後ろから数えて２番目の１つ手前（=後ろから3番目まで)）
[4 5 6 7]
```

#####● ：が2つと数字が3つの場合
・data[始まり : 終わり : スライスの増分]
※ スライスの増分 = 何個おきに配列を取得するかの指定

```python
print(data[2:7:2]) # 2〜6(7の1つ手前)までの配列を2つおきに取得
[2 4 6]

print(data[-7:-2:2]) # 後ろから数えて7番目から3番目の数字まで取得(後ろから数えて２番目の１つ手前（=後ろから3番目まで)）
[3 5 7]
```

#####● ：が2つ連続する場合
・data[::(数字)]
　何個おきに配列を取得するかの指定。
　正の数であれば前から、負の数であれば後ろから開始する。

・data[(数字１)::(数字２)]
　数字１は開始地点の指定。
　数字２は何個おきに配列を取得するかの指定。

```python
print(data[::1]) # １つおきに配列を取得（=全ての配列）
[0 1 2 3 4 5 6 7 8 9]

print(data[::-1]) # 後ろから１つおきに配列を取得（=全ての配列）
[9 8 7 6 5 4 3 2 1 0]

print(data[::2]) # 2つおきに配列を取得
[0 2 4 6 8]

print(data[::-2]) # 後ろから2つおきに配列を取得
[9 7 5 3 1]

print(data[2::2]) # 2から始まり、2つおきに配列を取得
[2 4 6 8]

print(data[-2::-2]) # 後ろから数えて2番目から始まり、2つおきに配列を取得（=2つずつ前に進んでいく）
[8 6 4 2 0]

print(data[6::-2]) # 6から始まり、2つおきに配列を取得（=2つずつ前に進んでいく）
[6 4 2 0]
```


終わり
---
今回は以上になります。
私自身もプログラミング初心者ですが、同じ様な立場の方に少しでも参考になれば幸いです。
また、もし内容に誤りなどがございましたら、ご指摘いただけますと幸いです。
[C#]コンストラクタを呼ばずにインスタンスを作る

以下のようなクラスがあるとき、インスタンスの作成にとても時間がかかってしまいます。

```cs
public class Hoge
{
    private int v;
    public int Value => v;

    public Hoge()
    {
        // Application.isPlayingはメインスレッドで呼ばなければ例外が発生する
        Debug.Log($"Application.isPlaying:{Application.isPlaying}");
        // コンストラクタで重い処理をしている
        v = HeavyFunc();
    }
    
    private int HeavyFunc()
    {
        // 重い初期化処理
        Thread.Sleep(5000);
        // 計算結果
        return 42;
    }
}
```

インスタンスを作成するときにメインスレッドで行ってしまうとUIが止まってしまうのでできれば別スレッドで作成したいところです。
しかし、コンストラクタ内部で`Application.isPlaying`にアクセスしてしまっているため通常はメインスレッドでしか作成することができません。

```csharp
Task.Run(() =>
{
    try
    {
        var h = new Hoge();
        Debug.Log(h.Value);
    }
    catch (Exception e)
    {
        // UnityException: get_isPlaying can only be called from the main thread.
        // Constructors and field initializers will be executed from the loading thread when loading a scene.
        // Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
        Debug.LogException(e);
    }
});
```
このクラスを書いたのが自分であれば修正すればいいですがソースコードを修正できない場合もあります。
そのような場合、最終手段として
[System.Runtime.Serialization.FormatterServices.GetUninitializedObject](https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.serialization.formatterservices.getuninitializedobject?view=net-5.0)
を使うことでコンストラクタを呼ばずにインスタンスを作成することができます。
インスタンスさえ作成できれば後はリフレクションで何とかなります。

```csharp
// privateなフィールド、メソッドにアクセスするためにリフレクションを使用する
var vInfo = typeof(Hoge).GetField("v", BindingFlags.NonPublic | BindingFlags.Instance);
var heavyFuncInfo = typeof(Hoge).GetMethod("HeavyFunc", BindingFlags.NonPublic | BindingFlags.Instance);
_ = Task.Run(() =>
{
    try
    {
        // コンストラクタを呼ばずにインスタンスを作成
        var hoge = FormatterServices.GetUninitializedObject(typeof(Hoge)) as Hoge;
        // HeavyFuncを実行する
        var result = heavyFuncInfo.Invoke(hoge, null);
        // フィールドに値をセット
        vInfo.SetValue(hoge, result);
        // 正しくインスタンスが作成されている
        Debug.Log(hoge.Value);
    }
    catch (Exception e)
    {
        Debug.LogException(e);
    }
});
```
一覧表示（index）に特定のデータを表示させたいとき　（current_userメソッド使用時）

#実装したかったこと
- ログインしていなくても、indexページを表示させたかった
- ログインしているユーザーのデータのみを一覧表示させたかった表示させたかった

# ハマったこと
indexページにログインしているユーザーのデータのみを表示させようとした際に、current_userメソッドを理解できていなく、初歩的なミスに気付けなかった


**BEFORE**

```rb:accounts_controller
class AccountsController < ApplicationController
  before_action :authenticate_user!, except: :index
  
  def index
    @accounts = Account.where(user_id: current_user.id).order('created_at DESC')
  end
---省略---
end
```

**AFTER**

```rb:accounts_controller
class AccountsController < ApplicationController
  before_action :authenticate_user!, except: :index
  
  def index
    if user_signed_in?
      @accounts = Account.where(user_id: current_user.id).order('created_at DESC')
    end
  end
---省略---
end

```

みなさんなら、この違和感にすぐ気づけると思います。。。

勉強あるのみ。。。💪



# 解決策

if をつけることで、ログインしてから判定されるようにした🏄‍♂️

ログインできていない状態で、current_userメソッドが発動するようになっていたので、ここにifを入れることで、ログインしてから発動するようにできました💃

このミスに気付けずかなりハマりました、、、
しんどかった、、、
n進数についてまとめ


現在基本情報技術者試験の勉強をしているのでアウトプットとして吐き出します。

## n進数とは

n進数としてコンピューターの処理でよく扱われるのは4種類あります

* 2進数
* 8進数
* 10進数
* 16進数

普段僕らが使っているのが10進数ですね。

## 2進数

2進数は2になると桁が進む数え方です。0と1の２つしか数を使えないという意味でもあっているはず。

0→1→10→11→100→101→111

みたいな感じで2になると位が上がっていく形になります。

## 8進数

8進数も2進数と考え方は同じで使える数字が8つで8になるとくらいが上がります。

0→1→2→3→4→5→6→7→10

みたいになります。

こんな漢字で16進数も0ーFが数として使える数え方です。



## 8進数と16進数の使われ方

2進数の数字1つで1ビットを表しています。
さらに8は2の3乗、16は2の4乗です。
つまり8進数の数は1桁で3ビット分の情報を表せます。16進数の数字は4ビット分を1桁で表せます。

```sample
0〜7(8進数が1桁で表せる数)
0〜111(8進数が1桁で表せられる範囲の２進数)

0〜15(16進数が1桁で表せる数)
0〜1111(16進数が1桁で表せられる範囲の２進数)
```

という関係から2進数で表すより8進数や16進数を使って書くと楽になるという理解でいいはず。(基本は2進数)


## まとめ

n進数→10進数
10進数→n進数

とかの計算方法もありますが、とりあえず今回はここまで。
コンピューターが動くもとはビット!!!
OpenShift 4.4を構築してアプリを動かしてみる - Worker起動編 -

#OpenShift 4.4を構築してアプリを動かしてみる - Worker起動編 -
worker-0、worker-1はすべて同じ手順です。

## 1.Workerの起動
VMWare ESXiでworkerのVMを起動します。
※ rhcos-installer.isoがマウントされていることを確認ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/566519d4-6068-4d2f-07a1-d93300104f26.png)


## 2. 起動パラメータの修正
### 2.1 Grubパラメータ編集画面
Grubメニューで`e`キーを押して、パラメータ編集画面に切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/12dc9faa-da2d-6331-b16c-60e26be376ab.png)

### 2.2 linux パラメータの追記
以下のパラメータを追加します。
`172.16.0.254`はbastionのipです。

```
coreos.inst.install_dev=sda 
coreos.inst.image_url=http://172.16.0.254:8080/ocp/bios.gz 
coreos.inst.ignition_url=http://172.16.0.254:8080/ocp/ign/worker.ign
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/7d125573-a322-feee-7a77-d7e4e9357d7e.png)


### 2.3 起動
`Ctrl` + `x` を押して起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/8daceca2-4b2b-6fcc-cf25-0e70c417ac02.png)


#### (失敗した場合) 
このような画面が出た場合は、パラメータが失敗しております。
VMを再起動して、もう一度、パラメータを入力し実行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/ba67954f-47aa-d55b-9abf-0e0af7df6c61.png)

## 3. インストール
正常に実行されると`Writing disk image`と出力されます。
インストールが完了すると、`Install complete`と表示されて、自動的に再起動します。
※ 再起動時にisoのアンマウントに失敗する場合があります。  
その場合、再起動後のgrubメニューでVMを停止させisoの接続を解除してからVMを再起動させてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/3240baa9-a117-6b35-3337-d83d088ccda1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/611699e0-00f4-422c-2bc3-2344f886a232.png)
dockerのコンテナ内conflictの解消

<h1>原因</h1>

<p>　docker-compose.yml等で定義したコンテナの名前が、既に存在するコンテナの名前と同一である時に発生します。</p>
<p>　対処法としては、新たに作るコンテナの名前を変更する、既存のコンテナを削除するなどが考えられ、本記事においては既存のコンテナを不要と仮定し、削除を行いconflictを解消する手順について解説します。</p>

<h2>コンテナの情報を確認</h2>

```
docker ps -a
```
<p>上記コマンドで稼働中、停止中全てのコンテナの情報が確認が可能です。</p>
![5260AFE3-5682-41AB-B9D0-FF08DCE673AA_1_105_c.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754176/6ee8ecda-73d2-8535-1e82-666350171c69.jpeg)

<p>　エラーメッセージにあるコンテナのIDをここで確認し控え、削除を行います。</p>


<h2>コンテナの削除</h2>


```
docker rm コンテナID
```

<p>　コンテナが起動中で削除できない場合、docker-compose stopを行うか、下記コマンドにて強制的に削除を行います。</p>

```
docker rm -f コンテナID
```
<p>　削除を行えているかコンテナ一覧から該当のコンテナがないことを確認。なければconflictは解消されているはずです。</p>

```
docker ps -a
```

<h2>おわりに</h2>
<p>　環境構築が簡単な分余計なコンテナが溜まってしまうので、conflict起きていない場合でもこまめに整理を行うことが大切だと思います。</p>
<p>　最後までお読みいただきありがとうございました。</p>
[JavaScript] 変数宣言とデータ形 



#const

constは、後から書き換えることができない変数を定義する書き方です。constの特徴として、再代入、再定義ともに不可という制約があります。

 constで指定する「後から書き換えることのできないデータ」は、正確には「定数」と呼びます。ただし、説明が煩雑になるため、カリキュラムにおいては定数と変数の区別はせずに、双方「変数」で統一します。

【例】コンソール
const sample = "おはよう"

sample = "おはよう"
// 再代入NG →エラーが起こる

const sample = "おはよう"
// 再定義NG →エラーが起こる
constで変数定義をしましょう

---

コンソール
const fruits = "apple"

console.log(fruits)
// => apple と出力される

---
コンソール
const language = "Ruby"

language = "PHP"
// => エラーが起こる


#let

letは、後で書き換えることができる変数を定義する書き方です。letの特徴として、再代入は可能ですが、再定義は不可という制約があります。



【例】コンソール
let sample = "おはよう"

sample = "おはよう"
// 再代入OK

let sample = "おはよう"
// 再定義NG →エラーが起こる
letで変数定義をしましょう

---

コンソール
let color = "white"
console.log(color)
// => white と出力される


#データ型

// Number, String, Boolean, Undefined, Null, Symbol


// 動的型付け言語
let variable = 12;
variable = "str";
variable = false+
variable = undefined;
variable = nil;
variable = symbol("abc");

※symbolとは、不変なデータ型で、オブジェクトのプロパティ識別子として使われたりします。
　プリミティブデータ型です。`Symbol(　) 関数`は、symbol 型の値を返します。

//静的型付け言語
int num = 10;

ー**型の確認**ー
typeof演算子を使って、変数の型を確認できます。
console.log(typeof variable);

例えば
let variable = 12;
console.log(typeof variable);　　　←に差し込めばコンソールには12と出力されます。
variable = "str";

let variable = 12;
variable = "str";
console.log(typeof variable);　　　←に差し込めばコンソールにはstrと出力されます。
C言語学習開始！

##はじめに
機会があって、C言語の学習を始めました。
基礎の部分を現在行っている段階で、ここまでで学んだ内容を備忘録として載せておこうと思います。

##1.C言語とは
C言語とは現在用いられている主流の言語の中で、**もっとも古い言語であり、多くの言語のベース**となっている言語。

**C言語の特徴**
①組み込みソフトやゲーム開発など、何にでも対応できるため汎用性が高い
②ファイルサイズがコンパクトなため、プログラミングに制限のあるハードウェア周辺でも活躍できる
③すべてのコードを機械語に翻訳してから実行するコンパイラ言語のため、実行速度が速い
④他言語に比べると低水準言語（機械語）に近いため、難解

##2.C言語の基本的なプログラムのスタイル
Cプログラムで最も基本的なスタイルは以下のように記述する。

```c
#include <stdio.h>

データ型　関数名(引数)
{
  処理；
}
```
<br>
上記のスタイルに沿って記述すると以下のようになる。

```c
#include <stdio.h>

int main(void)
{
  printf("こんにちは¥n");
　printf("私の名前は%sです。¥n年齢は%dです。¥n","hoge",20);
}
```
このコードを実行するとと以下のように出力される。

```
こんにちは
私の名前はhogeです。
年齢は20です。
```
**記述したコードの内容**
・**#include** : ヘッダファイルを読み込む時に用いる宣言
・**stdio.h** : “stdio”とは“Standard Input/Output”の略で、標準入出力を制御するために必要な基本的な関数、記号定数、マクロなどの定義が記述されたヘッダファイルのこと。 “.h”は、C言語のヘッダファイルの拡張子。
・**int (データ型)** : 整数型で、実行すると戻り値を整数で返す。
・**main (関数)** : 全体を管理する機能を持った関数。
・**void (引数)** : 引数がない場合に用いる。空でもOK。
・**printf(); (処理)** : （）内に記述されているものをコンソールに出力する関数。
・**¥n** : エスケープシーケンスのひとつで、改行を意味している。
・**%s・%d** : 書式指定の一部で、文字列の後にコンマで区切られた値をそこに並べたとおりに入れるもの。 %sは文字列、%dは整数値をそれぞれ表示する。

##3.C言語の変数
C言語で変数を用いたい場合は以下のように行う。

```c
#include <stdio.h>

int main(void)
{
  int a;      //変数を宣言している（aという箱をつくっている)
  a = 1;      //aという箱に1を入れている（最初に値を代入することを”初期化”という)
  int b,c;    //複数の変数を宣言している（bという箱とcという箱を同時につくっている)
  int d = 2;  //宣言と初期化を同時に行っている

  printf("%d ",a); //コンソールには１と出力される
}
```

##4.C言語の条件分岐
条件分岐には**if**・**else**・**else if** を用いる。

```c
#include <stdio.h>

int main(void)
{
  int n  //変数nを宣言
  printf("1か2の値を入力してください");  //コンソールに（）内の文字列を出力
  scanf("%d",&n);  //変数nに入力された文字を代入
  
  if(n == 1){
    printf("one¥n");  //nに１を代入した場合、oneを出力される
  }else if(n == 2){
    printf("two¥n");  //nに2を代入した場合、twoを出力される
  }else{
    printf("不適切な値¥n");  //nに１or2以外を代入した場合、文字列が出力される
  }
}
```

・**scanf();** : 文字列を入力する際に用いる関数。 scanf("いずれはの書式指定", &変数名);とすることで、入力された文字列を変数に代入することができる。


##さいごに
C言語は多くの言語のベースということで、今まで学習してきたRubyの知識とも重なる点があったため、今のところは順調に学べているなーと感じてます。
今回は現在までに学んだことを載せたので、今後もC言語の学習を続け、追記もしくは新たに記事を投稿していきたいと思います。

##参考
以下のサイトを参考にさせていただきました。ありがとうございます。
http://c-lang.sevendays-study.com/index.html
http://www9.plala.or.jp/sgwr-t/
OpenShift 4.4を構築してアプリを動かしてみる - Master起動編 -

#OpenShift 4.4を構築してアプリを動かしてみる - Master起動編 -
master-0、master-1、master-2はすべて同じ手順です。

## 1.Masterの起動
VMWare ESXiでmasterのVMを起動します。
※ rhcos-installer.isoがマウントされていることを確認ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/e09f4380-b5ed-bb57-a75f-d354ff3e8686.png)


## 2. 起動パラメータの修正
### 2.1 Grubパラメータ編集画面
Grubメニューで`e`キーを押して、パラメータ編集画面に切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/4a69abcd-0fe2-8bcd-0edd-b082efd8201a.png)

### 2.2 linux パラメータの追記
以下のパラメータを追加します。
`172.16.0.254`はbastionのipです。

```
coreos.inst.install_dev=sda 
coreos.inst.image_url=http://172.16.0.254:8080/ocp/bios.gz 
coreos.inst.ignition_url=http://172.16.0.254:8080/ocp/ign/master.ign
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/cd91fc3b-1684-7c72-72e6-5ca4204b43af.png)

### 2.3 起動
`Ctrl` + `x` を押して起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/8d2382f8-861d-086a-029c-76f7d1c7a1d4.png)


#### (失敗した場合) 
このような画面が出た場合は、パラメータが失敗しております。
VMを再起動して、もう一度、パラメータを入力し実行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/ba67954f-47aa-d55b-9abf-0e0af7df6c61.png)

## 3. インストール
正常に実行されると`Writing disk image`と出力されます。
インストールが完了すると、`Install complete`と表示されて、自動的に再起動します。
※ 再起動時にisoのアンマウントに失敗する場合があります。  
その場合、再起動後のgrubメニューでVMを停止させisoの接続を解除してからVMを再起動させてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/cbdc823f-fce9-88bf-2c41-d5ffa181c1a5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/52def8dd-91cc-409a-48a3-b146d2b59f06.png)
OpenShift 4.4を構築してアプリを動かしてみる - Bootstrap起動編 -

#OpenShift 4.4を構築してアプリを動かしてみる - Bootstrap起動編 -

## 1.Bootstrapの起動
VMWare ESXiでbootstrapのVMを起動します。
※ rhcos-installer.isoがマウントされていることを確認ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/bc4d9d48-b93a-ebd1-a497-769397253903.png)

## 2. 起動パラメータの修正
### 2.1 Grubパラメータ編集画面
Grubメニューで`e`キーを押して、パラメータ編集画面に切り替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/08f76312-7073-f9da-a693-5580b53c5b08.png)

### 2.2 linux パラメータの追記
以下のパラメータを追加します。
`172.16.0.254`はbastionのipです。

```
coreos.inst.install_dev=sda 
coreos.inst.image_url=http://172.16.0.254:8080/ocp/bios.gz 
coreos.inst.ignition_url=http://172.16.0.254:8080/ocp/ign/bootstrap.ign
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/ac8c259c-af5a-52e0-6b29-d35f620b1c0d.png)

### 2.3 起動
`Ctrl` + `x` を押して起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/5351f1b6-0c85-71cd-0b6f-54d8e7eca2ca.png)

#### (失敗した場合) 
このような画面が出た場合は、パラメータが失敗しております。
VMを再起動して、もう一度、パラメータを入力し実行してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/ba67954f-47aa-d55b-9abf-0e0af7df6c61.png)

## 3. インストール
正常に実行されると`Writing disk image`と出力されます。
インストールが完了すると、`Install complete`と表示されて、自動的に再起動します。
※ 再起動時にisoのアンマウントに失敗する場合があります。  
その場合、再起動後のgrubメニューでVMを停止させisoの接続を解除してからVMを再起動させてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/c519e6ae-59e9-0ec6-6e0b-5b718d9edba8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658425/a82aa818-45e3-8acd-0918-44a1f684b5bc.png)
ラズパイのUSB起動

##ラズパイのUSB起動

RaspberryPiを使っているともしも壊れた時のために、
MicroSDのコピーを作って安心したいですよね。

でもMacのDDコマンドでコピーするのって精神的にめちゃくちゃしんどい・・・

「ラズパイ　SDコピー　DD以外」　とかググったけどすごいマシーンしか出てこなかったので、ラズパイからSDをコピーしていたのですが、そもそもMicroSDからMicroSDではなくUSBにコピーができるらしい。
そんなUSB起動について学んだのでアウトプット！

### ラズパイのUSB起動とは
ラズパイはMicroSDの中にOSを入れて動かすのですが、そもそもMicroSDじゃなくてOSの入ったUSBをブスッとさしてUSBから動かすことができる。

### ラズパイのUSB起動のいいこと
1. USBの方がMicroSDより壊れにくい（気がする）
2. USBだとコピーしやすい
3. USBの方が扱いやすい（紛失しにくい）

きっと他にも何かあると思うのですが、あまりレベルの高くない私にはDDコマンドじゃなくてラズパイの中身がコピーできて、バックアップを作りやすいっていうだけでもう十分！！！

### ラズパイをUSB起動するための準備と知っておいて欲しいこと
+ ラズパイ3で実行したものです
+ ラズパイ4はUSB3.0ですが、ラズパイ3はUSB2.0なので、SDカードよりもOSの起動が遅いので注意
+ ラズパイ4は64bit CPU、 ラズパイ3は32bit CPUなのでラズパイ3に64bitを入れても動きません（←これやった）
+ [RaspberryPiの公式ページ](https://www.raspberrypi.org/software/operating-systems/)からデスクトップ版をダウンロードしてきましょう（Raspberry Pi OS with desktop）
+ 最初はMicroSDで作りましょう↑でダウンロードしたものをRaspberry Pi ImagerでMicriSDに入れます<br>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282291/1c17a272-8cc9-3d1a-894c-f897100a458b.png" width="60%">


### ラズパイをUSB起動する方法
+ ラズパイの初期設定は済ませたものを起動（SSHでもVNCでもなんでも大丈夫）
+ ラズパイのターミナルを立ち上げて現在のotpの値を確認します

```
$ vcgencmd otp_dump | grep 17:
```
これを打つとこんなふうにかえってきます
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282291/ef946bd8-8287-96be-e077-e7f07f3de29f.png" width="60%">


```
17:1020000a    →OFFになっている
17:3020000a    →ONになっている
```
otpの値がOFFになってるので、ONにします↓のコマンドを打ちましょう

```
echo "program_usb_boot_mode=1" | sudo tee -a /boot/config.txt
```
見た目には何も起きません
これでもう一回↓これを入れる

```
$ vcgencmd otp_dump | grep 17:
```
17:3020000a とかえってきたので、ONになりました！
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282291/f696a1bb-b547-17b3-2ca3-e935545e7383.png" width="60%">

これでUSB起動ができるので一度電源を落として、MicroSDを抜き、USBをさして起動できる様になります！

### まとめ
USB起動の利点はきっともっとあると思うのですが、複数作らないといけない人（バックアップを作っておきたい人）にはUSBというだけで胃に優しいのでぜひお試しください

### コメントいただきました
ラズパイ4の場合eepromのバージョンによって事情ちがうとのこと
最新eeprom適用したうえで
[Raspberry Pi4ブートローダー構成\-RaspberryPiドキュメント](https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2711_bootloader_config.md)を見るとよいと教えていただきましたー

### 教えてもらったところ
[Raspberry Pi 4をUSBメモリやSSDで起動する：\- ITmedia NEWS](https://www.itmedia.co.jp/news/articles/2012/28/news030.html)
[ProtoOut Studio（プロトアウトスタジオ）](https://protoout.studio/)
javascript　配列を操作するメソッド

javascriptにおいて配列を操作するメソッドです。

# 1. forEachメソッド
- `forEachメソッド`とは、要素を１つずつ取り出して、全てに繰り返し処理を行うメソッドです。

```javascript:example.js

const numbers = [1,2,3];
console.log(numbers);
//出力結果 [1,2,3]

numbers.forEach((number) => {
  console.log(number);
});
//  出力結果
//  1
//  2
//  3

```

という結果になります。

```javascript:example.js

numbers.forEach((number) => {
  console.log(number);
});

```

こちらの記述に注目します。
このように引数に関数を入れたものを`コールバック関数`と呼びます。
コールバックとは関数の中に違う関数を入れて関数を呼びだすための関数を指定することです。

# 2. pushメソッド
- `pushメソッド`とは、配列の最後に新しく要素を追加できるメソッドです。

```javascript:example.js

const numbers = [1,2,3];
console.log(numbers);
//出力結果 [1,2,3]

numbers.push(4);
console.log(numbers);
//出力結果 [1,2,3,4]

```

という結果になります。
ここは問題ないかと思います。

# 3. findメソッド
- `findメソッド`とは、条件式に合致した最初の要素だけを取り出すメソッドです。

```javascript:example.js

const numbers = [1,2,3];
console.log(numbers);
//出力結果 [1,2,3]

const evenNumber = numbers.find((number) => {
  return number % 2 === 0;
});
console.log(evenNumber);
//出力結果 2

```

という結果になります。
こちらでもコールバック関数が使われています。
`number % 2 === 0`は、とある値を２で割った余りが０。
すなわち偶数を条件としています。
そして、順番に条件を当てはめていき、最初に当たった数字が２なので、出力される値は２となります。
注意としては、`return`を使用して、処理を終了させましょう。


# 4. filterメソッド
- `filterメソッド`とは、条件式に合致した要素を全て取り出すメソッドです。

```javascript:example.js

const numbers = [1,2,3];
console.log(numbers);
//出力結果 [1,2,3]

const oddNumber = numbers.filter((number) => {
  return number % 2 !== 0;
});
console.log(oddNumber);
//出力結果 [1,3]

```

という結果になります。
こちらでもコールバック関数が使われています。
また、find同様`return`を使用して、処理を終了させましょう。

`number % 2 !== 0`は、とある値を２で割った余りが０ではないもの。
すなわち奇数を条件としています。
そして、順番に条件を当てはめていき、当たった数字が１と３なので、出力される値は[1,3]となります。

# 5. mapメソッド
- `mapメソッド`とは、配列の要素全てに処理を行い、新しい配列を作り出すメソッドです。

```javascript:example.js

const numbers = [1,2,3];
console.log(numbers);
//出力結果 [1,2,3]

const tripleNumber = numbers.map((number) => {
  return number * 3;
});
console.log(tripleNumber);
//出力結果 [3,6,9]

```

という結果になります。
こちらでもコールバック関数が使われています。
また、find,filter同様`return`を使用して、処理を終了させましょう。
素人が量子プログラミングをやって感じたこと

# 今回はコーディングや数式はないです。

Qiitaに初めて量子コンピュータのプログラミング記事を投稿したのが
`2020/12/17`
でした。そこから2ヶ月。手を動かして感じたことを書いてみます。[^1]
量子力学を専門的に学んだこともないですし、pytyonも書けない状況からスタートしました。

# 量子プログラミングは、ひたすら面倒。
量子プログラミングは、ひたすら面倒です。何が面倒かというと、

- 非常に低レベルな部分からのフルスクラッチを強いられる

ということが、まだそれなりにあるということです。AND,OR,XORなどを並べて
アルゴリズムを実装しているような感じです。これだけでも面倒です。

# ライブラリを使うのにもある程度知識は必要

幸いにも、ライブラリがあったりします。ただライブラリといっても `optimize()` みたいな
ものではなく、アルゴリズム１つ１つが存在します。
なので、そのアルゴリズムが何を解くもので、何を入力として、何を出力とするのかを
理解していないと使えないというケースが多くあります。

# 地獄のデバッグ

量子状態は、量子ビット数に対して空間が指数的に広いという特徴があります。
ただ広いだけでは困ってしまうのですが、構造をうまく使ったり縛りを入れることで
半ば裏道のような経路を通って答えにたどり着けたりします。
式変形を紙の上で追うと結構すっきりしているアルゴリズムも多いのですが、

`AND,OR,XORなどを並べてアルゴリズムを実装しているような感じ`

ですから、、結構な量（数十～数百）の論理演算の組み合わせとなり、typoも発生する可能性が十分あります。
しかし `空間が指数的に広い` ので、どこが間違っているか以前に、「そもそも間違っているのか？」を判断することも容易ではありません。
例えば10量子ビットの回路の場合、ある論理演算の組み合わせは1024 x 1024 の(1つの)複素行列になります。
この成分1つ1つが理論式通りの係数になっているか確認することはほぼ不可能です。
そして、どこの論理演算が間違っているから行列が間違っているのか　を特定することも非常に難しいです。

いまはシミュレーターで動作確認できる規模しか扱わない（実機の量子コンピュータがそもそも大規模問題がほぼ出来ないレベル）ので
まだいいですが、シミュレーターで扱えない規模の量子コンピュータになってきますと、「そもそもどうやってデバッグするのか（理想的な挙動が分からない）」という問題が出てきます。

# 日本の量子コンピュータ技術者は圧倒的に少ない気がする

量子プログラミング自体は、量子力学がわからなくてもできると思います。
ほぼ力学の話は出てきません。代わりに行列とベクトルを多用します。基本的にゴリ押しでいけるっちゃいけます。
ただ、行列とベクトルを多用することに抵抗感がある方も多いですし、量子アルゴリズムを見ても「xxに使えそう！」ということが
自明ではないようなものが多いです。
そういうこともあって、ハードルが高く、基本アルゴリズムのところで諦めている方も多いんじゃないかと思われます。
（よって、人口があまり増えず、結構な頻度で見知った人に遭遇する）

これは、教育カリキュラムが整備されていない状態であるためと思います。
しかし、量子はまだお金になるのかどうかわからない上に、日本企業も本腰という感じはあまりないので、
正直、死に体の日本の大学では手を出す余裕もない環境かもしれません。（個人の印象です）

# プログラミング環境は整えやすい

よくもわるくも、現状の量子プログラミングはまだ低級言語です。
なので、python１つあればいいし、そんなに多数の機能は使わないと思います。
「pythonで機械学習」と言われても私は全くわかりません。
それでも「pythonで量子プログラミング」が出来ているのは
「listとarrayとprintぐらいがわかればなんとかなっちゃう」というぐらいに「ほぼ関数電卓」なのが大きいと思います。
私はpythonをやるモチベーションが量子プログラミングにありましたが、これは結構いいやり方だったかもしれない。
そんな人、あまりいないとは思いますが。

# ちょっと勉強するだけでもリテラシーが上がっていく

量子コンピュータ関連、各社が自分たちに都合のいいことを言っているケースがすごく多いです。[^2]
「嘘でない範囲で話しを盛る」　のが普通な感じです。量子以外でもよくあることですが、度合いが結構ひどいと思います。
それを見抜く力は、解説本を読むだけでは身につかないと思います。
一次ソースである論文とか教科書をやって、自分で判断していくしかないです。
量子コンピュータを勉強している人は珍しいので、ちょっと勉強するだけでもリテラシーは（偏差値として）かなり上がります。
量子プログラミングしていると、量子ビットとか、エンタングルメントとか、怖がる暇がないというか、飽きるぐらい当たり前に
使っていきますので、第三者から見れば「つよい・・・」という感じになります。

私自身、エンタングルメントとは何かということをよくきかれるのですが、これを自分の言葉で説明できるというのは
良いことです。

# (今の）量子コンピュータでできること、できないこと　がちょっとわかる

今の量子コンピュータでできること、できないことがちょっとわかるようになります。
「何ができるようになったら革新が起きるのか」もちょっとわかるようになります。
ただ量子コンピュータは量子情報理論やデバイスとも密接に関係していて、非常にディープな分野ですので、
「地図を見ながら歩けるようになる」レベルですら相当の努力が必要でしょう。

# 結論
こんな人は量子コンピュータに向いていると思う。

- 線形代数が好き
- 量子コンピュータにロマンを感じる
- とにかく勉強することが好き
- ドヤりたい

上記が私ですね。

### 追記
多くの方に読んでいただけているようです。
ありがとうございます。
結構過激な記述もありますが、あえて編集などはしないことにします。

[^1]: ここでは量子ゲートのプログラミング、即ちqiskit,pytket,qulacs,blueqat等です。
[^2]: 賛否両論あるかと思いますが・・・
AWS12ヶ月無料枠オススメ3選

##始めに
プログラミング勉強をしていて、AWSの無料枠にはお世話になったのですが、そこで使って良かったもの・使用してみたいものを個人的に残しときたいなと思い書きました。

##AWSの12ヶ月無料枠とは
AWSのアカウント登録をしてから、12ヶ月間のみ無料で使用できるサービスのことです。

##AWS12ヶ月無料枠①Amazon EC2
AWSを使う大体の人が使うサービスだと思います。AWS上に仮想サーバーを構築して自由に利用できるのが特徴です。ユーザーの必要に応じてスペックを変更できるのがEC2の魅力です。

<strong>750時間の使用時間と20GBのディスク容量が無料で使用できます。</strong>

※Amazon Linuxが無料利用枠の対象である一方で、Windowsは対象とはなっていません。

##AWS12ヶ月無料枠②Amazon RDS
データベース機能を提供するサービスです。RDSの場合はサーバの準備が不要で、構築後すぐにデータベースの利用が可能となります。
MySQL、PostgreSQL、MariaDBなどの一般的なデータベースを、簡単な操作で作成することができます。

<strong>750時間の使用時間と20GBのディスク容量および20GBのスナップショットが無料で使用できます。</strong>

※microインスタンスのみが対象となります。

##AWS12ヶ月無料枠③Amazon S3
データ容量を気にすることなく保存することができるサービスです。その場に応じて自由な使い道が想定され、より柔軟なデータ保存が実行できるのが特徴となっています。
ウェブサイト、バックアップおよび復元、アーカイブなど、様々な用途に対応することができます。

<strong>5GBの標準ストレージと20000回のアップロード・2000回のダウンロードが無料で使用できます。</strong>

※僕自身この機能は使用したことがないので使用してみたいです。

##参考
[AWSの無料枠でできること3選｜AWS無料枠を使用する際の注意点3つ]
(https://www.fenet.jp/infla/column/technology/aws%E3%81%AE%E7%84%A1%E6%96%99%E6%9E%A0%E3%81%A7%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%93%E3%81%A83%E9%81%B8%EF%BD%9Caws%E7%84%A1%E6%96%99%E6%9E%A0%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E9%9A%9B/#AWS%E7%84%A1%E6%96%99%E6%9E%A0%E3%81%AE%E6%B3%A8%E6%84%8F%E7%82%B91%EF%BC%9A12%E3%83%B6%E6%9C%88%E5%88%86%E7%84%A1%E6%96%99%E3%81%A8%E3%81%AF1%E5%B9%B4%E9%96%93%E7%84%A1%E6%96%99%E3%81%A8%E3%81%84%E3%81%86%E6%84%8F%E5%91%B3%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%84)
参考にさせていただきました！ありがとうございます！

##最後に
12ヶ月間の有効期限が切れた後やサービス使用量が制限を超えた場合は、料金を支払う必要があるので注意してください！
変数・定数・関数宣言方法

#変数の書き方
```
const testScope = (scope) => {
  if (scope === 'block') {
    let message = 'ブロックスコープ'
    console.log(message)
  }
  // console.log(message)//letの場合ブロック内{}のみ参照可能
//よってこちらはエラーになります
//ReferenceError: message is not defined 
}
testScope('block')

let mutableText = 'let変更前';
mutableText = 'let変更後';  //再代入可能
console.log(mutableText);
```

#定数の書き方
```
const immutableText = 'const変更前';
immutableText = 'const変更後' //再代入不可
console.log(immutableText);

const mutableArray = [1,2,3];
mutableArray.push(4)
console.log(mutableArray);//結果[1,2,3,4]
配列やオブジェクトは定数宣言しても変更可能

const mutableObject = {id: 'hoge', value: 'fuga'}
mutableObject['name'] = 'bar'
console.log(mutableObject)
//結果 
Object {
  id: "hoge",
  name: "bar",
  value: "fuga"
}
```
#アロー関数の書き方
```
function nameFunc(message){
  console.log(message)
}

nameFunc('これは名前付き関数です')

const arrowFunc = (message) => {
  console.log(message)
}

arrowFunc('これはアロー関数です')

const oneLineArrowFunc = (message) => console.log(message);
oneLineArrowFunc('これは１行で書いたアロー関数です')

const users = {
  hoge: 'Hallo Bob'　//hogeというユーザーIDはHallo Bobというユーザーネームを持っている
}
const getUsername = (userId) =>{
  return users[userId]; //returnを省略できる
} 
const username = getUsername('hoge')
console.log(username)


```

getUsernameという関数を実行
getUsernameにはhogeという文字列を渡した
関数の中でhogeがuserIdとして引数で渡されて
usersっていうオブジェクトのhogeというキーの値を返すという形になります。
usersのhogeというキーはvalueはHallo Bob

ざっくりですが復習しました。
そうだ、SQLの勉強をしよう19

#はじめに
テーブルを作成するタイミングで制約をつけるので、DB設計の段階で漏れが無いように考えておかなければならないと感じました。

##主キー制約

```sql
CREATE TABLE テーブル名(
列名 型 PRIMARY KEY
)
```

```sql:例
CREATE TABLE 教科(
ID INTEGER PRIMARY KEY
名前 VARCHAR(10)
)
```
`ID`列を主キーとしてします。

##外部キー制約

```sql
CREATE TABLE テーブル名(
列名 型 REFERENCES 参照先のテーブル名(参照先の列名)
)
```

```sql:例
CREATE TABLE 成績表(
名前 VARCHAR(20)
教科ID INTEGER REFERENCES 教科(ID)
)
```

`教科ID`列は教科テーブルのID列を参照しています。
Modelerデータ加工Tips#01コード



## Modelerデータ加工Tips＃01 出題用サンプルコード


```ruby:python
stream = modeler.script.stream()

node1 = stream.create("userinput", "Money")
node1.setXYPosition(100,100)
node1.setPropertyValue("names", ["money"])
node1.setKeyedPropertyValue("data", "money", "'1,458,200''778,800'")
node1.setKeyedPropertyValue("custom_storage", "money", "String")

node2 = stream.create("userinput", "Log")
node2.setXYPosition(100,300)
node2.setPropertyValue("names", ["Log"])
node2.setKeyedPropertyValue("data", "Log", "'931 INFO  [LmtpServer-99] ;mid=149083; mailop - Adding Message: id=191'")
node2.setKeyedPropertyValue("custom_storage", "Log", "String")
```

出題は以下

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-01/
Web API

##XMLの利用

getElementsByTagName()
getAttribute()

##JSONの利用

Request → Respnse.json() → data

リスト：[]
→要素数を指定してあげる。先頭のデータなら[0]をつける
辞書：{}
→ドットでつなぐ

##JavaScriptでの利用方法

#####1 . fetch
#####2 . axios
vimで使うキー

#目次


#ファイル操作
| ショートカット | 動作 |
|:-----------|:------------|
| ESC, wq | 保存して終了 |
| ESC, q | 終了 |
| ESC, q! | 保存せず終了 |
| ESC, w | 保存 |

#編集
| ショートカット | 動作 |
|:-----------|:------------|
| i | 挿入 |
| x | 一文字削除 |
| dd | 一行削除 |


#移動
| ショートカット | 動作 |
|:-----------|:------------|
| h | 左に移動 |
| j | 下に移動 |
| k | 上に移動 |
| l | 右に移動 |
| w | 単語の先頭 |
| b | 前の単語の先頭 |
| e | 単語の末尾 |
| ge | 前の単語の末尾 |
| h | 左に移動 |
| { | 段落の先頭 |
| } | 段落の末尾 |
| ^ | 行頭移動 |
| $ | 行末移動 |
| gg または :1 | ファイル先頭 |
| G または :$ | ファイル末尾 |
| ctrl + f | 画面下に一画面スクロール |
| ctrl + b | 画面上に一画面スクロール |

#検索
| ショートカット | 動作 |
|:-----------|:------------|
| n | 右方向に検索 |
| N | 左方向に検索 |
SkyBoxのフェード切り替え

# はじめに
SkyBoxを別のテクスチャにフェードで切り替えたい。
しかし、ビルトインシェーダー内に、２つのCubeMapをブレンドして表示するようなシェーダーはなかったため、もともと入っているシェーダーを改造して作ることにする
# やりかた
Unityのあらかじめ入っているシェーダのソースコードは、[Unity ダウンロード アーカイブ](https://unity3d.com/jp/get-unity/download/archive)から指定バージョンのダウンロードボタンを押すとできます。「ビルトインシェーダー」を押して、ダウンロードします。今回は例として、2019.4.6を落とします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321577/b55cefc1-4c2a-301b-8263-4236f0015fd5.png)

さっそく改造しようと思ったら、なんか初めからできそうなのがはいってる。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321577/44f645e9-f0b3-8e21-db21-a4fb7e6d9b95.png)

これを使えば解決しました笑
マテリアルにCubeMapを2つ指定して、Valueを動かすとブレンドされます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321577/27dfd1fc-61a6-980b-f6f8-3354b1e8355c.png)


# その他のアプローチ
カメラを２つ使って、RenderTextureでフェードするのも手
# 参考
UnityのStandardシェーダーのソースコードを取得する
https://bluebirdofoz.hatenablog.com/entry/2019/07/25/093410
ビルトインシェーダガイド
http://www.mikame.net/sample/unity_documentation/Components/Built-in%20Shader%20Guide.html
【Excel】書式設定

# クリア
　セルの情報を初期化する。

| プロパティ | 意味 |
|:--|:--|
| Range().Clear  | 数式や書式等、全て  |
| Range().ClearContents  | 数式と文字  |
| Range().ClearComments  | コメント  |

# フォーマット
## Range().NumberFormatLocal
### 例
| 書式 | 意味 |値 | 表示 |
|:--|:--|:--|:--|
| @  | 文字列 |1 + 2  | 1 + 2 |
| #,###  | 3桁区切り |123456789  | 123,456,789  |
| &yen;#,###  | &yen;付き3桁区切り |123456789 <br> 0 <br> "" | &yen;123,456,789 <br> &yen; <br> ""|
| &yen;#,##0  | &yen;付き3桁区切り |123456789 <br> 0 <br> "" | &yen;123,456,789 <br> &yen;0 <br> ""|
| 0.00  | 桁数指定 |1.2345  | 1.23  |
| yyyy/mm/dd  | 日付フォーマット |2020/1/2  |  2020/01/02  |


# 文字位置
| プロパティ | 意味 |　値| 意味|
|:--|:--|:--|:--|
| HorizontalAlignment  |横方向の文字位置| xlCenter  |中央ぞろえ|
| VerticalAlignment  |縦方向の文字位置| xlBottom  |下ぞろえ|

# フォント
## Range("A1").Font

| 1 | 2 |
|:-:|:-:|
| Bold  | 太字  |
| Italic  | イタリック  |
| Size  |  文字サイズ |
| Color | 文字色  |  

# 枠線
```vb
  ' すべての枠線
  With Range("F4:G8").Borders
      .LineStyle = xlContinuous
      .ColorIndex = xlAutomatic
      .Color = RGB(0, 255, 0)
  End With
  
  ' 周りの枠線
  Range("F4:G8").BorderAround Weight:=xlThick
```

# 数式
## 定義
セルに値ではなく数式を格納することができる。

| パラメタ | 説明 | 記述例|
|:-|:-|:-|
| Formula  | 非R1C1形式で数式を記述| = "B1+C1"  |
| FormulaR1C1  | R1C1形式で数式を記述  | "=RC[1]+RC[2]" |

## R1C1記法

| パラメタ | 説明 |
|:-|:-|
| R or C  | 数式のセルと同一行 or 同一セル  |
| R1, C1 | 絶対参照 |
| R[1], C[1] | 数式のセルからの相対参照。(マイナスも指定可能) |
　・RはRow, CはCell
　・D4にたいしてR[1]C[1]はOffset(1, 1)と同じ
　・D4にたいしてR[2]C[-2]はOffset(-2, 2)と同じ
## 数式⇒値変換
```vb
  range1.Value = range1.Value
```


### 参考サイト
 クリア : [エクセルの神髄](https://excel-ubara.com/excelvba1/EXCELVBA339.html)
 フォーマット : [エクセルの神髄](https://excel-ubara.com/excelvba1/EXCELVBA331.html)
 文字位置 : [エクセルの神髄](https://excel-ubara.com/excelvba1/EXCELVBA332.html)
 フォント: [エクセルの神髄](https://excel-ubara.com/excelvba1/EXCELVBA333.html)
 枠線 : [エクセルの神髄](https://excel-ubara.com/excelvba1/EXCELVBA335.html)
sshユーザー追加 -- raspi

## 目的

raspiに秘密鍵でssh接続できている環境で、新たなユーザーにsshの権限を与えたいときの手順。
そもそもの設定を知りたい場合は[こちら](https://qiita.com/memezie/items/5934cbf7d2cb1c0379f5)

## 目次
1.ユーザーの作成
2.sshの設定
## 内容

**1.ユーザーの追加**

まずは、raspiに新たなユーザーを作る。

```terminal

# 'まずはrootユーザーになる'
　su -
# 'adduser [ユーザー名で作成]'
　adduser newuser
# 'なんか色々聞かれるがpassword以外は空白のままでOK'
# '作成できたらsudo権限を付与する(これは必要なければスキップ)'
　gpasswd -a newuser sudo

```

これで作成は完了。

**2.sshの設定**

作成したユーザーとしてログインし、秘密鍵でアクセスするための設定を行う。

```terminal

# '作成したユーザーとしてログイン'
　su - testuser
# 'ホームディレクトリに.sshディレクトリを作成'
　mkdir .ssh
#　'パーミッションの変更'
　sudo chmod 700 .ssh
# 'authorized_keysの作成（もしくは作成した公開鍵のファイル名を変更してください）'
#　'ここでは省略しますが、作成後公開鍵の内容を貼り付けます'
　touch authorized_keys
#　'パーミッションの変更'
　sudo chmod 600 authorized_keys

```

あとは、外からアクセスできれば完了！
ACM会員特典のO'Reilly読み放題にアクセスできなくなったときの対処法

## 概要

対処法： ACM のサポートにO'Reillyアクセス権の復旧を依頼してください。

## 詳細

### 背景

ACMの会員特典にO'Reilly読み放題サービスへのアクセスがあります。

ACM会員はO'Reilly読み放題サービスのログイン画面でE-mail入力欄に自身の acm.org のメールアドレスを入力すると、パスワード入力欄が消えてACMサイトへのログインページへ飛ばされるようになります。このログインは、飛ばされた先のACMサイトで認証に成功したあと、コールバックで O'Reilly読み放題のサイトへ戻される、というものです。

### 発生する問題

ACMのログインページに飛び、ACM側での認証に成功したあとコールバックで O'Reilly読み放題のサイトに戻ってきたとき `We can't find your account` と表示されてコンテンツにアクセスできなくなる事象が発生することがあります。

### 対処法

現時点では ACM Customer Support <acmhelp@acm.org> に復旧を依頼するしか解決方法はありません。次のような文面でメールを送れば良いでしょう。（もしかしたら日本語でも対応してもらえるかも？試してません）

```
Subject: Can't use O'Reilly via ACM single sign on
```

```
Hi there,

I can't use O'Reilly via ACM single sign on.
Would you help me?

FYI: Reproduction steps are as follows:
1. Go to https://oreilly.com/member/login
2. Enter my email address "...@acm.org" on the "Email Address" form and click "Sign In with Single Sign On"
3. Redirected to https://idp.acm.org
4. Enter my "Username" and "Password" on the form then click "Sign in"
5. Callback to learning.oreilly.com but "Log in Failed" is displayed ( https://learning.oreilly.com/unify-auth/fail )
6. Then, "We can't find your account" page pops up.

Best regards,
```

なお、ACMの会員アカウントを開設した直後に、専任のサポート担当者の方からメールが来ているはずなので、その方宛にメールを送ってもOKです（↑のようにサポートに送っても、その方が対応してくれます）

なお、 事象が発生したときの O'Reilly 読み放題サービスの画面には O'Reillyカスタマーサポートへメール連絡するよう記載されていますが、そちらに連絡しても「ACM側で利用権がキャンセルされてるので、ACM側に直接問い合わせていただく必要があります」という定形が返ってくるだけですので、O'Reilly への問い合わせは不要です。

### 予防策

ACM会員へのO'Reilly読み放題サービスは数ヶ月（ACM 曰く `several months` ) アクセスを行わないと、利用権が自動的にキャンセルされます。少なくとも月に1回はアクセスするようにすれば、この事象は発生しないでしょう。

## 個人的な所感

ここからは根拠のない、完全に私の妄想ですが、おそらくO'ReillyとACMの間の契約では、O'Reilly読み放題サービスの利用権を付与されたACMユーザの数に基づいて料金支払いが行われているのではないでしょうか。そうであれば、ACMとしてはO'Reilly読み放題を利用していないユーザの利用権をキャンセルしたくなるのは理解できます。

理想としては、O'ReillyとACMには、実際の利用ユーザ数に基づいて課金するよう契約を見直すなどして、ユーザからは完全に問題を隠蔽してほしいです。

そこまでできないとしても、ACMにはセルフサービスで回復できるようにしていただきたいところです。
Ruby on Rails の each文をマスターしよう！！（初投稿）


### アジェンダ
- この記事の対象者
- 開発環境
- シンプルなコード例
- コード全体の流れ
- よくある記述ミス
- つまづきがちなエラー
- ここで抑えるべき用語
- 最後に

### この記事の対象者
- Railsを学び始めて1か月程度
- each文って結局どのように動いてるのかわからない

### 開発環境
- Rails5
- windows10
- vagrant

### each文の最もシンプルなコード例と出力
```投稿内容.
id: 1
title: タイトル
body: ボディ

id: 2
title: title
body: body

id: 3
title: たいとる
body: ぼでぃ

```


``` test.controller.rb
def index
  @books = Book.all
end
```

```index.html.erb
<% @books.each.do |book| %>
  <%= book.id %><br>
  <%= book.title %><br>
  <%= book.body %>
  ------------
<% end %>
```

```表示.
1
タイトル
ボディ
------------
2
title
body
------------
3
たいとる
ぼでぃ
------------


```

### 全体の流れ
1. @booksに投稿をすべて格納する(Book.all)
2. <% @books.each do |book| %>によって投稿をひとつひとつにわけて|book|に格納する
3. book.title等で、ひとつひとつのレコードを順番に取り出す

※each do ~ endまでにあるものを投稿の数だけ繰り返す。
（上記コード例で「------------」が三回繰り返されている）

### よくある記述ミス
- <%= @books.each do |book| %>としてしまう
  - カラム名など余計なものも表示されてしまう（ここでは割愛するが、実際に自分でやってみるとよい）
- @books をcontrollerで定義していない
  - viewファイルとcontrollerの該当アクションのインスタンス変数の数が同じかどうかを確認すること
- <% end %>がない
  - syntax errorがでてしまう

### つまづきがちなエラー
#### undefined method `each' for nil:NilClass
- @books.each do の場合@booksに変数が入っていないことが多い<br>
これはeachだけでなくエラー文作成の際に起こるundefined method `errors' for nil:NilClassなどにもいえる。<br>controllerを再度確認すること。

### 用語
- ブロック変数　→　|book|のこと。

### 最後に
each文は初学者のつまづきやすいポイントです。<br>ただ一回イメージをつかめればなんてことないもので、使えればとても便利なものなので必ず習得しましょう！

　また、初投稿のため抜け落ちている部分、間違っている部分等あるかもしれませんが、
その際はご指摘いただけると嬉しいです！<br>ご覧頂きありがとうございました。<br>
（もし気に入っていただけたらLGTMお願いします:bow::sweat_drops:）
【python3】import, from, as の違いについて

# pythonの上に付いてる謎のやつ
importしか使っていなかったがfrom・asって一体なんぞや。ということで記入。
既に同じような記事があるかと思う。。

## 記事内容
1. import
2. from
3. as

### import
pipでインストールしたパッケージ導入時に使用。以下の例の様にpythonにそもそもないものを使う時に使用する。
python使ってれば結構使うことになると思われ。てか直ぐ使うことになる。

```python
import datetime

datetime.datetime.now()
```

### from
ここの階層に移動するとソース・ファイルがあるよーってのを教える時に使用する。
※ fromを使用する場合は.py付けない

```python
# 同一階層のhage.py を使用(関数aaaを呼び出す)
import hage
hage.aaa()

# aaa/hige.py を使用(関数aaaを呼び出す)
from aaa import hige
hige.aaa()

# 1つ上の階層のhuge.py を使用(関数aaaを呼び出す)
from .. import huge
huge.aaa()
```

### as
import, from で指定した内容を省略・名前変更する時に使用する。

```python
import datetime as dt
from ./ import hage as hage_light

# 上のimportの例と同じだけど、このように短縮可能
dt.datetime.now()
```

# 結論
実際使った方が早いと思う。
productionモードでサーバーを立ち上げるとcssが反映されない。

##producition用のデータベース作成
```
rails db:create RAILS_ENV=production
```

##アセットのプリコンパイルを行います
```
rails assets:precompile RAILS_ENV=production
```

##サーバー起動
```
rails s -e production -b 0.0.0.0
```


...cssが反映されない。。



##解決策
config/enviroments/production.rbの

```
config.assets.compile = false
```

```
config.assets.compile = true
```

に変更したらうまくいきました。
アセットファイルがないときにファイルを探して自動コンパイルしてくれる設定のようです。
GitHubのrevertでコンフリクトが起きた時

普段、GitHubのrevertは一度マージして環境に入ったPRを何かしらの理由で外す時に使ってます。

![unnamed-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/066065fd-2b98-7008-012a-0cf98a6157d5.png)

revertのやり方は特に難しい話ではないと思うのですが、（[過去にも記事](https://qiita.com/hisashi_matsui/items/f27033dd73033446eca3#%E3%83%9E%E3%83%BC%E3%82%B8%E3%81%AE%E5%8F%96%E3%82%8A%E6%B6%88%E3%81%97)にしてます）今回ちょっとイレギュラーなケースが起きたので、備忘録として記事にしました。


１週間ほど前にとある機能を実装して、無事にマージされたPRがあったのですが、テストが追いついてないからXX日のリリース対象から外したいのでrevertしてほしいとPMから言われる。

いつものようにrevertしようとしたら、こんなエラーメッセージが。。。
![スクリーンショット 2021-02-24 20.39.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/bf86e249-ad05-5c0b-7e67-20643ed743c7.png)

content may have changed since it was merged
マージされてから差分が出てるから自動でrevertは無理ですよって。。
実際このPRが入ってから別のPRが次々マージされてしまったのが原因。

通常のrevertはGitHub上で自動で簡単にできますが、revertによってコンフリクトが発生する場合はGitHub上ではできないらしいです・・・


今回はこうしたrevertによってコンフリクトが起きた場合に、コンフリクトを解消しつつ、revertする方法を紹介します。（他にもやり方色々あると思いますが、個人的にこれが一番シンプルでやりやすいと思いました。）


####手順：

1) まず、Revert用に新しくブランチを切ります。（ブランチ名はrevert-hogeとかお好きなように）


2) ターミナルでコマンドを実行

```
git revert <commit hash>
```
このcommit hashはrevertするPRがマージされた時のcommit hashです。
PR見るのが一番確実。
![unnamed.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173182/f6d3fae6-1676-b346-6bc8-0ca6b9d88b60.png)




すると、warning出ます、つまりコンフリクト解消してねって事です。

```
error: could not revert 98b44b2e6... コミットメッセージがここに出ます (#6007)
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
```

3) コンフリクト解消します。これは通常のコンフリクト解消と全く同じ。

コンフリクトしなかったファイル達は自動でStagingされます。
（revertなので、自分の書いたコードが消える逆の変更が入ります。）


4) いつものように、add, commitし、リモートにPushします。

5) プルリクを作れば、普段GitHub上で自動で作られるrevert PRと同じものが完成です。

あとはReview依頼出して、マージされたら完了。


というわけで、最初に見慣れないエラーが出て焦りましたが、意外とシンプルに解決できました。

revert自体普段そんなにやらないし、こういうたまにしかやらない事はドキュメント化しておかないと次同じ状況になった時に困るので、備忘録として記事にしました。
MaterialDesignでGroupBoxのColorZoneを動的に変更する

#はじめに
MaterialDesignを使用していて、GroupBoxを使う場合、ColorZoneAssist.Modeで色を変更することができます

```C#
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"

<GroupBox x:Name="SampleGroupBox" Header="グループボックス"
          materialDesign:ColorZoneAssist.Mode="PrimaryLight"/>
```
こんな感じのGroupBoxになります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/75da73b2-4160-b5c1-2854-4b48ef09f48b.png)

#今回の課題
で、今回は、このGroupBoxのカラーをCheckBoxがチェックされたときに変更したいと思いました。

たとえば、チェックがあったときに、Backgroundを変える場合はこんな感じでできます

```C#
    <GroupBox x:Name="SampleGroupBox" Header="グループボックス"
            materialDesign:ColorZoneAssist.Mode="PrimaryLight">
        <GroupBox.Style>
            <Style TargetType="{x:Type GroupBox}" BasedOn="{StaticResource MaterialDesignGroupBox}">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=IsChecked, ElementName=SampleCheck}" Value="True">
                        <Setter Property="Background" Value="PaleGreen"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </GroupBox.Style>
        <CheckBox x:Name="SampleCheck"
                Content="チェック"
                HorizontalAlignment="Left"/>
    </GroupBox>
```
チェックすると背景色が変わっているのが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/bd8e0bae-aa8e-18c1-aa0a-1ac78b09b7f5.png)
そこで、Setter Property="materialDesign:ColorZoneAssist.Mode" Value="Accent"としたらどうかなと思いました。

```C#
           ...中略...
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=IsChecked, ElementName=SampleCheck}" Value="True">
                        <Setter Property="materialDesign:ColorZoneAssist.Mode" Value="Accent"/>
                    </DataTrigger>
                </Style.Triggers>
           ...中略...
```
ところがこれはうまくいきませんでした。

#コードビハインドで解決させました
他に何か方法があるのかもしれませんが、結局思いついたのは、コードビハインドで行うことでした。

まずはxaml側

```C#
    <GroupBox x:Name="SampleGroupBox" Header="グループボックス"
                materialDesign:ColorZoneAssist.Mode="PrimaryLight">
        <CheckBox x:Name="SampleCheck"
                    Content="チェック"
                    Checked="SampleCheck_Checked"
                    Unchecked="SampleCheck_Unchecked"
                    HorizontalAlignment="Left"/>
    </GroupBox>
```
CheckBoxでCheckedとUncheckedを使用します
コードビハインド側は以下の通り

```C#
        private void SampleCheck_Checked(object sender, RoutedEventArgs e)
        {
            MaterialDesignThemes.Wpf.ColorZoneAssist.SetMode(this.SampleGroupBox, MaterialDesignThemes.Wpf.ColorZoneMode.Accent);
        }

        private void SampleCheck_Unchecked(object sender, RoutedEventArgs e)
        {
            MaterialDesignThemes.Wpf.ColorZoneAssist.SetMode(this.SampleGroupBox, MaterialDesignThemes.Wpf.ColorZoneMode.PrimaryLight);
        }

```
MaterialDesignThemes.Wpf.ColorZoneAssist.SetModeでColoZoneAssistをセットするコントロールと値を設定します
これで以下のように表示を動的に変更できるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/956246/adc195a3-4488-7f50-ceb2-af62983edfb4.png)
ターミナルでvscodeを開けない

Visual Studio Codeの場合「code」コマンドなのだが，codeコマンドがインスールされていなかった。
VSCodeを起動してcommand + shift + Pでコマンドパレットを開き、「shell command install」で検索。
「シェルコマンド: PATH内に ‘code’ コマンドをインストールします」と表示されるので選択します。
右下に「シェルコマンド ‘code’ がPATHに正常にインストールされました。」と表示されれば成功
[自分用メモ] IIAS ユーザー・ロール まとめ

#1. はじめに

IIAS のユーザーには、**データベース・ユーザー**、**プラットフォーム・ユーザー**、**内部システム・ユーザー** の3種類が存在します。

|ユーザー|説明|
|:---:|:---|
|**データベース・ユーザー**|データベースの管理・操作を行うユーザー。 デフォルトで**bluadmin**が存在する。|
|**プラットフォーム・ユーザー**|アプライアンスの管理・アクセスを行うユーザー。デフォルトで**apuser**が存在する。|
|**内部システム・ユーザー**|アプライアンスによって 内部的に管理・使用されるユーザー。非公開ユーザーで、基本的に使用しない。|

Knowledge Center：（IBM Integrated Analytics System） IIAS でのユーザーおよび認証
https://www.ibm.com/support/knowledgecenter/ja/SSHRBY/com.ibm.swg.im.iias.admin.doc/doc/appl_users_groups.html

ここでは、**データベース・ユーザー**（以下「*ユーザー*」と表記） についてまとめます。

#2. ユーザーの種類

ユーザーには、大きく以下２種類が存在します。

- **一般ユーザー**
- **データベース管理者**

**一般ユーザー**は**bluusers**グループに所属し、DBに接続しSQLを実行するなどの操作ができます。
**データベース管理者**は**bluadmin**グループに所属し、一般ユーザーが実行可能なすべての操作ができ、ユーザーを作成するなどのユーザー管理なども行います。

##2-1. デフォルト・ユーザー

IIASには デフォルト・ユーザーとして **bluadmin**が用意されています。
**bluadmin**ユーザー は、**bluadmin** グループのメンバーであり、デフォルトのデータベース管理者です。


Knowledge Center：（IBM Integrated Analytics System）接続
https://www.ibm.com/support/knowledgecenter/ja/SSHRBY/com.ibm.swg.im.iias.getstart.doc/doc/app_login.html

￼
##2-2. 任意で作成するユーザー

デフォルトユーザーの他に、任意でユーザーを作成することができます。
ユーザーを作成する際には、**データベース管理者(Administrator)**か**一般ユーザー(User)** のいずれかを選択します。

ユーザーはWebコンソールの 左上メニュー[SETTINGS] > [UsersandPrivileges] から作成することができます。

Knowledge Center：（IBM Integrated Analytics System）データベース・ユーザー管理
https://www.ibm.com/support/knowledgecenter/ja/SSHRBY/com.ibm.swg.im.dashdb.security.doc/doc/user_mgmnt.html



#3. ロール

##3-1. 概要

第２項 では、IIASには**bluadmin**グループ(データベース管理者ユーザーが所属)と**bluusers**グループ(一般ユーザーが所属)の2つのグループがあり、ユーザーはどちらかのグループに所属するということを説明しました。

より細かな権限の設定をしたいときは、ユーザー定義の**ロール**（役割）を作成します。

ロールに DBオブジェクト(表、ビューなど)に対する権限を付与し、
ユーザーに ロールを付与することで 権限を管理します。

ユーザーに直接 権限を付与することも可能ですが、
複数ユーザーに同じ権限を付与する場合、ロールでまとめて 権限付与する方が より効率的に管理できるようになります。

Knowledge Center：（IBM Integrated Analytics System）ユーザー定義のユーザー・ロール
https://www.ibm.com/support/knowledgecenter/ja/SSHRBY/com.ibm.swg.im.dashdb.security.doc/doc/udef_user_roles.html



##3-2. ロール作成方法

ロールの大まかな設定の流れを示します。

###① ロール作成

CREATE ROLE コマンドでロールを作成します。
構文は以下の通りです。

```
CREATE ROLE <ロール名>;
```

###②  ユーザーにロールを付与

GRANT ROLE コマンドで、ユーザーにロールを付与します。
構文は以下の通りです。

```
GRANT ROLE <ロール名> TO USER <ユーザー名>;
```

###③ 特権をユーザー定義ロールに付与

GRANT 
構文は以下の通りです。

```
GRANT <特権> ON <オブジェクト> TO ROLE <ロール名>;
```


#参考情報

Knowledge Center：IBM Integrated Analytics System
https://www.ibm.com/support/knowledgecenter/ja/SSHRBY/com.ibm.swg.im.dashdb.kc.doc/welcome.html
[CSS] calc( ) の使い方

#calc( ) とは？
CSSのcalc( )関数は、プロパティの値を計算式で実行することができます。
単位を揃える必要はなく、px, %, em, rem, vw, vhなどの相対単位でも、異なる単位の計算式で値を指定できます。
レスポンシブ対応のWebサイトなどを制作するのに便利です。

calcは `calculation = 計算` の略です

#使い方
##ルール
1, 計算式内では四則演算（加算、減算、乗算、除算）が使用できます。
2, 常に演算子（+, -, *, /）をスペースで区切らなければいけません。 
3, 入れ子が使用できます。

##calc( )の使用例
###ある要素の幅を親要素の1/3にしたい時
calc()関数を使わないと、 `width: 33.33333%` などと指定すると思います。
calc()関数を使用すると以下のように指定することができます。

```:css
.item {
    width: calc(100% / 3);
}
```

##カラムのデザインで、一方の幅が固定、もう一方が可変の時
`.box` 内の `ボックスitem1` を150pxで固定、 `ボックスitem2` は可変で横並びが崩れない状態で配置したい時に、calc()関数を使用すると以下のように指定することができます。

```:css
.box{
  width:100%;
}

.item1{
  width:150px;
}

.item2{
  width:calc(100% - 150px);
}
```


##入れ子を使う書き方

```:css
.item {
    width: calc(100% / calc(100px / 2));
}
```

上記以外にも工夫すれば色々使うことができます。
HerokuでSpring + PostgreSQLでflywayを動かす時に困った

2時間くらい溶かしてしまったので備忘録に
### 問題
herokuのpostgresqlのコンソールにはURLが
`postgres://[username]:[password]@[host]:[port]/[database name]`
という形で書かれており、環境変数のDATABASE_URLにもこの形で格納される。
これをこのままapplication.propertiesに
`spring.datasource.url=${DATABASE_URL}`
と入れても起動のタイミングでflywayがエラーを出してしまった。

### 答え
[これ](https://devcenter.heroku.com/articles/connecting-to-relational-databases-on-heroku-with-java#using-the-database_url-in-plain-jdbc)
元々のURLを元にDATABASE_URLを
`jdbc:postgresql://<host>:<port>/<dbname>?user=<username>&password=<password>`
と書き換えてあげるとよい。
DATABASE_URLは書き換える際にはdetachする必要があるので注意。(detachしないとエラーが出て書き換えられない)