OmniAICreator/Qiita-1.07M huggingface dataset:
IBM Kubernetes Service GUI 操作 (Deployment を Scale)


##### はじめに

IKS (IBM Cloud Kubernetes Service) は Kubernetes Dashboard で コンソール上での操作も可能です。

[IBM Cloud Docs の IKS ](https://cloud.ibm.com/docs/containers?topic=containers-getting-started&locale=en) の内容を眺めていると、GUI が使えるということを認識しにくく、GUI で Scaleなどの操作を行うということにわたし自身が気づくのが遅かったので、(当たり前と言えば当たり前ですが) そういえば IKS 操作は GUI も使えますよ、という意味合いで当記事でメモしておきます。

----

##### 環境
・　IBM Cloud Kubernetes Service (無料クラスターを使用)


----

##### 準備

1) IKS にテスト用の Deployment (testpod.yaml) を適用。

testpod.yaml の内容は以下。

```testpod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: testpod
spec:
  replicas: 1
  selector:
    matchLabels:
      app: testpod
  template:
    metadata:
      labels:
        app: testpod
    spec:
      containers:
      - name: testpod
        image: nginx
```


IKS にCLIで接続して適用。

```
$ kubectl apply -f testpod.yaml
deployment.apps/testpod created
```

```
$ kubectl get deployment
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
testpod   1/1     1            1           67s
```


---

##### GUI で操作

IBM Cloud のコンソールにログインし、対象のクラスターの画面へ移動。

Kubernetes ダッシュボードを押します。

![図1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/a264374c-2efe-4f59-9065-e63420c9c808.jpeg)

Deployments に testpod (1/1) が存在することを確認。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/25ee5cc0-b2f4-8faa-8506-f1da1960978c.png)

右側の・・・を選択肢、「Scale」 を押します。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/ae538b3d-99cb-3367-239d-cb87d07cc616.png)

Derised replicas を 1 -> 2 に。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/e7c4247c-4dec-1d55-9dab-e569bfad4929.png)

Pods が正しく 2つになりました。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/54b29040-bbf7-0bf5-a62c-83531239f685.png)

次は 0 にします。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/d2ce4e6a-b129-7089-0864-7074317389e6.png)

Deployments は 0/0 に。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/9a95a1a7-5926-1012-cf5f-cccc84aa55eb.png)

```
$ kubectl get deployments
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
testpod   0/0     0            0           36m
```


Pods も無くなりました。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/14813c07-1c17-cd67-8efe-e394309db5a5.png)

```
$ kubectl get po
No resources found in default namespace.
```

----

GUI だとコンポーネントが一覧で見えるのでわかりやすくて良いですね。

以上です。ご参考まで。
scoop 環境下での python 周りの SSL エラー

scoop で anaconda や python を入れていたら SSL エラーが出るように。具体的には pip や anaconda (conda コマンド) で https につないだ通信でエラーになる。

`certificate verify failed` とか

```
$ conda update anaconda-navigator
Collecting package metadata (current_repodata.json): failed

CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/current_repodata.json>
Elapsed: -
```

とかが発生する。

# 解決法

家の環境では↓で直った。

- https://www.jianshu.com/p/b59296fe43be

```
$ scoop install openssl
$ pip install pyopenssl
$ conda update conda
```

再発したときに忘れてそうなのでメモ。
Webデザインについて思う事（独自

HTMLやcssコーディングを主にしてきて、独自の見解ですがまとめ。
※プロモーションサイトのようなデザインではなく、商業サイトやデザインシステム寄りな見解ですのでご留意ください。

#「伝えたいこと」を「デザイン」する

まずこれが大前提じゃないでしょうか。
私が常々思っている、「見出し」「本文」「飾り（画像）」「リンク」が素人が見ても一目で分かるデザインは素晴らしいと思います。
最近は、SEO的に文書構造をより機械的に理解してもらう方向でも、HTMLの構造には重点を置き、より正確なマークアップが求められます。
極端に言うと、cssが全くきかない状態でも、内容は伝わるように作らないといけません。
そのため、素人目にも要素の分類が「わかる（認識できる）」デザインは、プロダクトデザインとしては優れていると思います。

# 意図した方向にユーザーを導くデザイン

ユーザーの動向が思い通りであれば、してやったり感ありますよね。
昔見た、どこかのホテルのLPで、体験談をオムニバスに配置してあって、その記事の要所要所で「詳細を見る」ボタンが配置されていて、思わず押したくなった記憶があります。引き込む力がすごかった。
LPは、そういう事もできますが、他サイトデザインともなると、ユーザー目線や興味をそそる内容をどこに配置するか、目線をどう誘導するかなど、データに基づいていろいろ想像を膨らませないとダメですね。ターゲットや目的にそったデザインは素晴らしいですね。

# 一貫されたデザイン

きちんと統制された、一貫性のあるデザインだと、ユーザーは心理的に安心します。
また、同じ機能が同じデザインだと、使う側も慣れてきて使いやすいですよね。
ボックスレイアウトでは、上余白か下余白で一貫しないと、パターン増えた時に対処できなくなる場合があります。
上下や幅のサイズは、「5」で割り切れる数字が良い（10px,15px,300px,320px,640pxなど）と言われてましたが、最近は「8」で割り切れるのもアリらしいですね。個人的には、5の方がやりやすいです。リッチ感を出すなら、やっぱ8なのかなー。
デザインをきちんと学んだわけではないですが、ボーダーや影を除いて上下間隔が11pxとか、疑似要素的なものをデザインの計算にいれると、どんどん狂っていくと感じています。
（そのような場合でも、ボーダーを含んで割り切れる数字になる、とかどこかでつじつまを合わせますが）
なので、数値は割り切れる数で統一したほうが良い、と個人的な見解です。


# 繰り返し使えるデザイン

同じ要素を同じデザインで何度も使いまわしやリピートできるのが、コーディングもしやすいし、ユーザーも混乱しないのでみんなハッピー。

このあたりのデザインルールは、アトミックデザインを取り入れる＆ガイドライン作成に伴った苦労話として、また別記事にて書こうと思います。
ROS2 FoxyでURGを使う

ROS2 Foxyで北陽電機のLiDAR URG-04LX-UG01を使用する手順です。

URG-04LX-UG01
https://www.hokuyo-aut.co.jp/search/single.php?serial=17

# urg_nodeのインストール

```bash
$ sudo apt update
$ sudo apt install ros-foxy-urg-node
```

# 実行

URGをUSBケーブルでPCに接続します。

ターミナルを開いて以下を実行し、デバイスに権限を付与

```bash
$ sudo chmod 777 /dev/ttyACM0
```

以下でurg_nodeを実行

```bash
$ ros2 run urg_node urg_node_driver --ros-args -p serial_port:=/dev/ttyACM0
```

別のターミナルで以下を実行し、/scanトピックが出ていればOK

```bash
$ ros2 topic echo /scan
```


# データの可視化

別のターミナルを開いてrviz2を起動

```bash
$ rviz2
```

`Fixed Frame` を`laser`に設定

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/37e324f8-9cf5-6343-177a-bfe642010dc8.png)

左下の`Add`ボタンをクリック
一覧から`LaserScan`を選択してOKをクリック

![Screenshot from 2021-02-25 16-37-44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/f72b9311-aa88-9333-b153-8f00521e6207.png)

/scanの点が表示されれば成功

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399606/8a4e3c38-a4d5-6099-2e58-1a6ca11c1f49.png)

# launchファイルから実行

設定をyamlファイルで記述してlaunchファイルから起動する方法

ワークスペース以下に適当にパッケージを作成

```bash
$ cd ~/ros2_ws/src
$ ros2 pkg create urg
```

設定ファイルとlaunchファイルを置くディレクトリを作成

```bash
$ cd urg
$ mkdir launch config
```

configディレクトリ以下に以下の設定ファイルを作成

```yaml:urg.yaml
urg_node:
  ros__parameters:
    angle_max: 3.14
    angle_min: -3.14
    serial_port: /dev/ttyACM0
    serial_baud: 115200
    laser_frame_id: "laser"
    calibrate_time: false
    default_user_latency: 0.0
    diagnostics_tolerance: 0.05
    diagnostics_window_time: 5.0
    error_limit: 4
    get_detailed_status: false
    publish_intensity: false
    publish_multiecho: false
    cluster: 0
    skip: 1
```

launchディレクトリ以下にlaunchファイルを作成

```python:urg_launch.py
import os

from ament_index_python.packages import get_package_share_directory

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    ld = LaunchDescription()

    param_file = os.path.join(
            get_package_share_directory('urg'), 'config',
            'urg.yaml')
    print(param_file)
    hokuyo_node = Node(
        package='urg_node', node_executable='urg_node_driver', output='screen',
        parameters=[param_file]
        )

    ld.add_action(hokuyo_node)
    return ld
```

CMakeLists.txtに以下を記述

```txt:CMakeLists.txt
install(
  DIRECTORY launch config
  DESTINATION share/${PROJECT_NAME}
)
```

ビルドして実行

```bash
$ cd ~/ros2_ws
$ colcon build
```

```bash
$ source install/setup.bash
$ ros2 launch urg urg_launch.py
```









# 参考

https://index.ros.org/p/urg_node/

https://blog.browniealice.net/post/how_to_use_urg/
コーディングレビューを受けた話

とある企業さんで丁寧にコーディングレビューの機会を設けて頂けてそれがとても感動&勉強になったので記録します。


## 問題
引数で与えられた文字列を空白の区切りごとに頭文字だけ大文字にするというものです。

例：hello programming world→→→Hello Programming World

私はRubyで挑戦しました。

```Ruby:Ruby

def LetterCapitalize(str)

//ここに処理を書く

end

puts LetterCapitalize("hello programming world")
```

## 考え方

ご教授頂いたことで勉強になった事は考え方です。

「まずやりたいことを細かく分けて考えよう。コードを書きながら頭を整理する感じで書いてみるといいよ。」
「実際の現場では内容よりも先にコードを見て、その後に内容を詳しく話すことも多いから変数名やメソッド名はできるだけ分かりやすく、何を表しているのか誰が見ても分かるようにしよう。」
「そのほうが自分も何を実現したいのか頭が整理されて考えやすくなるよ」

ととても丁寧にご教授頂きました。
感動して勉強になり過ぎて泣きそうでした。

では実際にやってみます。


## 文字列を空白ごとに分ける

`split`を使って空白ごとに文字列を分けます。
[公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/String/i/split.html)

```Ruby:
words = str.split
```

このsplitを使って文字列を分けたんだということが分かるように`words`という変数名にしました。
ちなみにsplitは引数に(,)のように指定すればカンマごとに分けることもできるみたいです。

`split`によっての出力結果は以下のようになりました。

```Ruby:
hello
programming
world
```

はい。分けることができました。


## 分けた文字列の頭文字を大文字にする

`capitalize`を使って頭文字を大文字にします。
[公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/String/i/capitalize.html)

```Ruby:
words = str.split
words.map do |word|
  word.capitalize
end
```

`words`は配列になっているのでそれに対して1つずつ処理ができるよう`map`を使います。
`map`は配列の要素の数だけブロック内の処理を繰り返し値を書き換えるメソッドです。
公式がちょっと分かりにくかったのでこちら参考にしました→[Rubyのmap, map!メソッドの使い方](https://uxmilk.jp/21695)

そうすると出力結果は下記のようになります。

```Ruby:
Hello
Programming
World
```

はい。全て頭文字を大文字にできました。


## 配列を結合させる

今は

```Ruby
words = [Hello, Programming, World]
```

という中身の配列になっているのでこれを結合します。

`join`を使います。
[公式リファレンス](https://docs.ruby-lang.org/ja/latest/method/Array/i/join.html)
`join(' ')`とすれば空白で区切りかつ結合できます。

でもここでこのまま

```Ruby:
words.join
```

とすると

```Ruby:
hello programming world
```

と出力されてしまいます。

これは`map`が破壊的メソッドではないためmapで処理をした外に出ると、元々の文字列が書き換わっている訳ではないので元に戻ってしまっているのです。

ですので書き換えます。

```Ruby:
words = str.split
words.map! do |word|
  word.capitalize
end

words.join(' ')
```

上記のようにしてみると下記のように出力されます。

```Ruby:
Hello Programming World
```

はい。できました。
ただし、破壊的メソッドは元の値をそもそも書き換えてしまうので使い方によっては危険であるという認識を持つようにとご教授頂きました。


## 番外編

じゃあ、もし`capitalize`がなかったらどうする？
自分で全て処理を書くとしたらどうするか？とワクワクする問題を出されて考えてみました。

```Ruby:
def LetterCapitalize(str)

  words = str.split
  words.map! do |word|
    letters = word.split('')
    letters[0].upcase!
    letters.join
  end

  words.join(' ')

end

puts LetterCapitalize("hello programming world")
```

まずwordsをmap!で繰り返すのは変わらず。
そのwordsの中身の[hello, programming, world]をさらにsplitで一文字ごとに分けます。
そしてupcaseで頭文字を大文字に変換します。
joinで文字を結合させます。
最後に文字列を結合させて完成です。

できた！
楽しい！

私はつい「これを実現するメソッドあるかな？」と探してしまうのですが、
今回みたいにメソッドがなくても実現できることにとても面白さを感じました。

メソッドに頼るから考えが浅いのだと痛感したので、今回を教訓にロジカルシンキングを鍛えて行こうと思います！

本当にこの企業さん神様みたいな対応してくれて感謝しております。

以上です。
Ruby on Rails ログアウトすると、Couldn't find User with 'id'=sign_out となってしまう

#開発環境
ruby '2.6.5'
rails '6.0.0'

#エラー内容
###状況
アカウント情報をもったユーザーがログアウトするとエラー画面になってします。
また、ブラウザを一度消してから再度立ち上げると、通常通りの新規登録の画面が出現する。しかし、再びログインした後ログアウトすると、同じエラー画面になってしまう。


###エラー画面
![スクリーンショット 2021-02-25 17.55.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792954/8a4f6cef-399e-0cb2-e1a8-9f42b613da28.png)

#解決方法
その他の記述も特に不備が見られなかったので、解決法を調べていました。
httpメソッドの記述が違うという記事を見つけました。

それによるとdevise.rbのメソッドに問題があるのではないのか？ということだったので早速やって見ます。メソッドをdeleteからgetに修正します。

写真の269行目を編集します。
![スクリーンショット 2021-02-25 18.11.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792954/a6660b9d-8d85-935a-ec62-76b2fbce4019.png)

#変更箇所
```ruby:config/initializers/devise.rb　　
  config.sign_out_via = :delete　　　修正前
    ↓  ↓  ↓  ↓  ↓  ↓  ↓  ↓  ↓
  config.sign_out_via = :get        修正後
```

#再起動
最後にサーバーの再起動をしてあげることで無事エラーから抜け出せることが出来ました。
![スクリーンショット 2021-02-25 18.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/792954/a8d9be19-d2d2-354e-2662-2cd1440807bc.png)


#まとめ
Railsの勉強を開始してから半年、扱いにも少し慣れてきたところで、思いがけぬエラーでした。今回は忘備録として残しておきます。
最後に、今回のエラーに関して参考にした記事を貼っておきます。

【参考記事】
https://qiita.com/chisaki0606/items/f1f03a6c226e49b5f7b3
wicked_pdfでコンソールからPDFを作成したい

# はじめに

wicked_pdfでコンソールからPDFを作成したいシチュエーションに遭遇したので、備忘録も兼ねてQiitaに記事を残します。

# 環境
Ruby 2.6.5
Rails 5.2.4
wicked_pdf 1.1.0

# wicked_pdfとは？

RailsでPDF出力をしたい時に用いるGemで、HTMLを書くようにPDFを作成することができます。
PDFを作成するGemには[Prawn](https://github.com/prawnpdf/prawn)もありますが、PrawnはゴリゴリのDSLなので、自由度は高いですが学習コストがかかります。

wicked_pdf本家リポジトリはこちら
https://github.com/mileszs/wicked_pdf

# 前提

app/views/users/profile_pdf.pdf.slimというファイルがあり、中身が

```slim
h1 = @user.name
h3
  メールアドレス
p = @user.email
h3
  プロフィール
p = @user.profile
```

のようになっているとします。(雑でごめんなさい、、、)

Userモデルにはnameとemailとprofileがあるとします。

# 手順

```ruby
$ rails c

controller = ActionController::Base.new # コントローラーのインスタンスを生成(ActionView::Baseのインスタンス生成に必要なため)
view = ActionView::Base.new(Rails.root.join('app', 'views'), {}, controller) # ビューインスタンスの生成。renderメソッドを呼ぶために使う
view.extend(ApplicationHelper) # viewファイルでHelperを使っている場合に使う。ApplicationHelper以外にもHelperファイルがある場合は、そちらもextendする

pdf = WickedPdf.new.pdf_from_string(
  view.render(
    template: "users/profile_pdf.pdf.slim", # 自動でviews/配下のファイルを探しに行くため、users/profile_pdf.slimでOK
    layout: 'layouts/base_pdf_layout.pdf.slim', # layoutファイルを使わない場合は指定の必要なし
    locals: { @user => User.first }, # slimファイル内で変数を使う場合に指定する。
    encoding: 'UTF-8'
  )
).force_encoding("UTF-8")

save_path = Rails.root.join('tmp', "#{User.first.name}_profile.pdf") # 保存するpathを作成

# Fileクラスを使って保存する処理
# 参考: https://github.com/mileszs/wicked_pdf#super-advanced-usage
File.open(save_path, 'wb') do |file|
  file << pdf
end
```

localsは@userのみを渡していますが、変数は複数渡すことができます。

force_encodingを行わない場合、文字化けが発生します。(何十分か溶かしました)

生成されたファイルがこちら

![スクリーンショット 2021-02-24 16.48.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/884609/77e805f7-7828-b515-623d-fa2822ffcfe5.png)

# まとめ

先ほど紹介したPrawnを用いる場合ですと、ActionControllerやActionViewに頼らずにコンソールからPDF出力ができるのですが、wicked_pdfでとなるとActionControllerやActionViewに頼らないと厳しいのかなと思いました。

「PDFを一括で出してほしい」のような依頼は意外とありますので、誰かの参考になればと思います。
新人研修後の講義資料

# 新人研修後の講義資料
少し前ですが、前職をやめる直前に行った講義の資料を共有してみます。
(すべてSlideshareです)

| タイトル | 概要 |
|:-:|:-:|
| [なぜオブジェクト指向？](https://www.slideshare.net/KenjiroUehara/ss-238830176) | オブジェクト指向でつくる動機づけのための講義資料(部内でオブジェクト指向が浸透していなかったため) |
| [デザインパターン入門](https://www.slideshare.net/KenjiroUehara/ss-238786583)| まずはデザインパターンの一部でも使い、広めていくための講義資料 |
| [C#とJavaの違い](https://www.slideshare.net/KenjiroUehara/cjava)| 新人研修ではJavaしかやっておらず、配属後はC#なので勉強の動機づけのための講義資料 |
| [ドメイン駆動設計入門](https://www.slideshare.net/KenjiroUehara/ss-243402936)| 設計スキル向上に対する動機づけのための講義資料 |

配属直後の新人に対する講義のふりをして、実は旧人たちに講義をするのが目的でした。
どの程度届いたかは分からないですが・・・
要は、プログラマーたるもの、常に勉強し続けようね、という内容です。
Xcodeでアプリを固める方法

# 概要
Archiveとかipaファイルで調べても、現場で使ってるアプリの固め方が見つからないし、
先輩に何度も聞くわけにもいかない。

走り書きレベルなので読む時には注意してください。

#Xcodeのバージョン : 11.1
現在、私が使用しているバージョンです。もしかするとバージョンによっては多少手順が前後する可能性があります。

#固め方

! 注意 ！
手順4の「Enterprise」は別の名前になったりします。環境次第？

1. Clean buildする
2. Singing&CapabilitiesのWifiを消す。消さないとエラーが起きるらしい。（ここは項目があれば消す、くらいの感覚）
3. ビルドデバイスを「Generic iOS Device」、もしくは「Any iOS Device」にする
4. ツールバーの「Product > Scheme > Edit Scheme」の「Build > Info」で「Build Configulation」を「Enterprise」にする
5. 「Product > Archive」を押下
6. アーカイブが作成し終えると新しいウィンドウが出てくるので、今作成したアプリを選択しているか確認して「Distribute App」を押下
7. 次のウィンドウの「Enterprise」を押下
8. 次はいじらなくてOK
9. 次のウィンドウの「Distribution Certificate」とその次の項目を変更する。変更できたらNextボタンが押せる。
 - Distribution CertificateはDefault以外のものにする
 - .AppはEnterpriseを選択
10. Exportを押下
11. 名前をつけてデスクトップに保存する。保存場所はどこでもいいと思うけどわかりやすいところがいいと思う。
12. おわり


これでアプリを固められるはず。おそらく相当丁寧な手順と思われます。省ける手順も存在します。

##後書き
他の人が掲載している方の固め方も試してみる。何が違うのかあんまりよくわかってない。

間違っているところがあれば、ご指摘お願いします。
Web技術の備忘録

##目的
Web技術について学習し、理解するために学んだ内容をまとめる

##Web
World Wide Webの略。
Web上の文書はハイパーテキストで構成されている。
ハイパーテキストにはハイパーリンク（所謂リンク）を埋め込むことができる。
これによってあるWebページから別のWebページへと移ることができる。
ネットサーフィンができるのもこれのお陰。

##HTML
ハイパーテキストを記述する為に使用される。
タグを使用して記述する。
ハイパーリンクはaタグを使うことで埋め込むことができる。
HTMLで書かれたページはWebブラウザを通すことでWebページとして表示される。

##HTTP
WebブラウザはWebサーバーに表示したいハイパーテキストを要求し、Webサーバーは要求されたハイパーテキストをWebブラウザへ渡す。
このやり取りの際の手順は世界共通で決められており、それをHTTPと呼ぶ。
HTTPがあるからブラウザWebサーバーの種類を問わずにやり取りができる。

##静的ページ
誰がいつ見ても、常に同じ内容が表示されるようなページを静的ページと呼ぶ。
静的ページはページの制作者が編集しない限り変更されない。

##動的ページ
Twitterのように、常に最新のツイートを取得し表示する仕組みや、ユーザーごとで表示されるものが変わるようなページを動的ページと呼ぶ。
Webアプリケーションは、ほとんどが動的である。
静的ページと違い、ユーザーの入力等によって表示内容が変わる。
Kaggleの公式講座「機械学習入門」 を解説：Lesson2 「データ理解の基礎」


この記事はKaggleが提供している講座(Corses)の「Intro to Machine Learning」のLesson１について解説します。英語が弱くて機械学習のことよく知らない！！という人向けの記事です。  
英語もしくは機械学習のどちらか一方が分かる人にとっては勉強になると思いますので、原著をオススメします。
[こちら原著です](https://www.kaggle.com/learn/intro-to-machine-learning "Intro to Machine Learning")  
英語も機械学習も分かる人には、原著もこの記事も読む必要はないかと思います。

Lesson1へは　[こちらをクリック](https://qiita.com/tshi/items/69b17a86857bb1e02f99 "Lesson1") 

#＜Lesson2＞　データ理解の基礎
###・データ理解のためにPandasを使おう
機械学習によるデータ分析においてまずやることは、データについてよく知ることです。データについての理解を深めたり、データの操作を行うのにPandasというライブラリが便利でよく使われます。Pandasの最も重要な特徴は、データフレームと呼ばれるデータを格納するための入れ物を持っていることです。具体的には以下のような形式です。
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501636/5c385547-6149-eb7a-ac71-e08c0e9498d9.png">


１行に１つの住宅のデータが格納されています。１番左の0,1,2,...は住宅のインデックスです。上に書いてあるSuburb(郊外）・Address（住所）・Rooms（部屋の個数）などは、何についてのデータか（特徴量の種類）で、列名とも言ったりします。特徴量というのは、そのデータ（今回ならば住宅）の特徴を数値や文字列で表したものです。


<br>

このデータは[メルボルンの住宅価格の予測のコンペ](https://www.kaggle.com/dansbecker/melbourne-housing-snapshot "メルボルンの住宅価格の予測") にあるデータです。実際に表示させたい人は、[ここ](https://www.kaggle.com/dansbecker/melbourne-housing-snapshot "メルボルンの住宅価格の予測")から飛んでNew Notebookを押してください。
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501636/9e740b39-0870-7022-6e04-934b5b08edaa.png">

<br>

このようにコードを書くと表示されます。

```python:display.py
import pandas as pd
df = pd.read_csv('../input/melbourne-housing-snapshot/melb_data.csv')
df #df.head()とすると上から５行のみが表示される
```

<br>
<br>

次に数値データの統計量を出します。

<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501636/dd7148f9-285d-b90e-3bc5-b08e09e0551f.png">


列名は特徴量の名前で、行名は統計量の名前になっています。統計量について簡単に説明しておきます。

| 1 | 2 |
|:-:|:-:|
| count  | 欠損データ（NaN）でないデータの個数  |
| mean  | データの平均  |
| std  |  データの分散 |
| min  | 最小値  |
| 25%  | 小さい方から２５％にあるデータ  |
| 50%  | 小さい方から５０％にあるデータ（中央値）  |
| 75%  | 小さい方から７５％にあるデータ  |
| max  | 最大値  |


<br>
以下のようなコードで表示されます。

```python:statistic1.py
df.describe()
```  

<br>
ちなみにKaggleの講座にはないですが、カテゴリデータの統計量も出せます。
<img width=100% src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501636/3fa52834-2c1c-bc67-4c58-19ed0432553b.png">

<br>

統計量について簡単に説明しておきます。

| 1 | 2 |
|:-:|:-:|
| count  | 欠損データ（NaN）でないデータの個数  |
| unique  | データの種類数（一意なデータの個数）  |
| top  | 最頻値  |
| freq  | 最頻値の出現回数  |

uniqueは例えば、ある列のデータが　a, a, c, d, e, e, e　ならばデータの種類はa, c, d, e　の４種類なので４となります。

<br>
以下のように書けば表示されます。

```python:statistic2.py
df.describe(exclude='number')
```

<br>
以上がLesson2のデータ理解の基礎となります。次は[Lesson3](https://qiita.com/tshi/items/07e1fa6bed288bf4c3e0 "Lesson3")ですね。頑張っていきましょう！

Lesson3は[こちら](https://qiita.com/tshi/items/07e1fa6bed288bf4c3e0 "Lesson3")になります。
git bash起動時のカレントディレクトリディレクトリの設定・ホームディレクトリの設定

# 環境
* windows10
* gitbash

#git bashの起動時のディレクトリ
目標「２の状態を１にしたい」

```:1
ユーザ名@DESKTOP-**** MINGW64 ~
$ pwd
/c/Users/ユーザ名
```
```:2
ユーザ名@DESKTOP-**** MINGW64 /
$ pwd
/
```

###2の場合
####タスクバーにショートカットがある時
１．エクスプローラーにおいてショートカット一覧のディレクトリへいく。

```:path
C:\Users\ユーザ名\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
```
にショートカットがあるのでここにあるGitBahのプロパティを開く。

２．プロパティからリンク先を変更する。

```:リンク先
"C:\Program Files\Git\git-bash.exe" --cd-to-home

// --cd-to-homeを消す
"C:\Program Files\Git\git-bash.exe" 
```
３．作業ファルダのパスを書き換えるまたは付け足す。

```:作業フォルダー
%HOMEDRIVE%%HOMEPATH%
```

####タスクバーにショートカットがない時
１.まずどこでもいいのでショートカットを作成して、エクスプローラーの作成した場所へいく。
２．タスクバーにショートカットがある時の２以降と同様に従う

#Git bashのホームディレクトリを変更する
```:gitbash
$ cd ~
$ pwd
/c/Users/ユーザ名
```
<br>
更に場所を指定する方法
(例)初期カレントディレクトリをDesktopにする

```:gitbash
$ setx HOME "C:\Users\ユーザ名\desktop"

$ cd ~
$ pwd
/c/Users/ユーザ名/desktop
```
Rubyについて

本日はRubyについて。。。
志望している会社でRubyに力を入れていらっしゃったので、復習というより知識をつけようと。

##Rubyって何？
・プログラミング言語
・Webアプリ開発に特化
・DBと繋がりやすい
・幅広く使われている
・文法が覚えやすい

ってな感じ。

そもそもプログラムって実行しなきゃメモ用紙なのよねえ。＝Excel的な。

##Ruby on Railsって何？
最初、「どっちもRubyやん。違いが分からん」という感じでした。

結論は、「Rubyのフレームワークの一つ」ということ。。
フレームワークとは、要は「頻度の高いツールのハッピーセット」的なものだと考えてる。
それぞれを単品で細かく頼むより楽だし、早いし。
つまり、Ruby（🍔）のハッピーセットがRuby on Railsって名前で売ってある的な。わかりずらいか。

もちろんRubyのフレームワークは他にも「Sinatra」や「HANAMI」なんて可愛い名前のものもある。
それぞれ特徴があるが、一番使われているのが「Ruby on Rails」とされているんだと。

参考はこちら
https://eng-entrance.com/ruby-framework

##まとめ

Railsっていう、Webアプリが作りやすくてみんな使ってる言語の一つで、ツールがあらかじめセットになってるものがRuby on Rails。

つまり、Railsハンバーガーのハッピーセット（おもちゃがRails）を頼んでるってことね。
[Rails6]Sprockets::Rails::Helper::AssetNotPrecompiled in エラーが出た

#結論
`app/assets/config/manifest.js`ファイルにコードを一行追加したら解決しました。

```r:app/assets/config/manifest.js
//= link_tree ../images
//= link_directory ../stylesheets .css

#以下を追記
//= link application.css
```

#環境
- macOS Catalina
- Ruby 2.7.2
- Rails 6.0.3


実際には下記の記事通りに環境構築をしています
>[[Docker] Ruby2.7.2 / Rails6.0.3 / MySQL8.0の開発環境構築できたメモ](https://qiita.com/ayalikesweb/items/4167c8a8e40441b10cfe)



#参考
このサイトで「rails 6」でページ検索して出てきた解決案のひとつがうまくいきました！

>[【**Stack Overflow**】Rails: Sprockets::Rails::Helper::AssetNotPrecompiled in development](https://stackoverflow.com/questions/35683185/rails-sprocketsrailshelperassetnotprecompiled-in-development)

#他に試したこと
- `config/initializers/assets.rb`ファイルに追記
 1. `Rails.application.config.assets.precompile += %w( application.css )`この一行を追記
 2.  `rails assets:precompile` コマンド実行後サーバー再起動

- 画像を再取り込み？（SVGリンク切れ？）

いくつか試しましたが、Railsのバージョン違いなのか、これではエラー解消できませんでした。
（前提としては、タイトルのエラー文が出て、画像表示がうまく動作していなかったようです）

#さいごに
###**[Railsガイド - アセットパイプライン](https://railsguides.jp/asset_pipeline.html)**

**原因**はこれかな？
このあたりを読めば、**仮説**と**検証**を考えながら解決できそう。
用語翻譯對照 - 臺灣 vs 大陸

Updated: 10/31/2022

```
English           大陸            臺灣
------------------------------------------------------------------
source code       代碼            程式碼
project           項目            專案
advanced          高級            進階
active            激活            啟用
video             視頻            影片
printer           打印機          列印機
software          軟件            軟體
hardware          硬件            硬體
laser             激光            雷射
call              調用            執行
config            配置            設定
component         組件            元件
view              視圖            頁面
save              保存            儲存
                  優化            改善
menu              菜單            選單
```
Google翻訳の抑制

# Google翻訳の抑制

Chromeを使ってる時、
（中国語に）「翻訳しますか？」などと出てくる場合がある。
日本語サイトなんですけど・・・


## 対策

```conf:以下タグを使う
# まずはこれを試す
<html lang="ja">

# それでもだめならこれを試す
<meta http-equiv="content-language" content="ja">

# それでもだめならこれを試す
<meta name="google" content="notranslate" />
```
CSSのアニメーションの基本

# 1.transiton
## 本体に設定すること
### 何に対してAnimationを適用させるか
```css
.box{
	transition-property: 適用させる全てのcss;
/* 	適用させるCSSの例：transform, border-radius */
/* 	初期状態はall */
}
```
### Animationに要する時間
```css
.box{
	transition-duration: 0.3s;
```
### Animationに開始までの時間
```css
.box{
	transition-delay: 時間s;
```
### Animationする基準点
```css
.box{
	transform-origin: top left;
```

### 一括指定
```css
.box{
	transform: 順不同(時間sは1つ目がdurationn);
```

## 疑似クラスにつけるAnimation設定
### transform
```css
.box:hover{
	
　/* 移動 */
  transform: translate(50px, 20px);
	
　/* 回転 */
  transform: rotate(30deg);
	
　/* 拡大縮小 */
  transform: scale(.5, 2);

　/* 組合せ　前から順に適用 */
  transform: translateX(100px) rotate(30deg);
  transform: rotate(30deg) translateX(100px) ;
```
<br><br>

# 2.animation
## アニメーションの基本設定
```css
@keyframes アニメーション名{
  /* animation-duraton時間の% */
  0%{ 
    transform: none;
  }
  /* 同じ内容を複数指定可能 */
  20%,80%{
    transform: translateX(200px) rotate(360deg);
  }
  100%{
    transform: translateX(500px) rotate(360deg);
	/* ↓下に要素があると重なるので終わったら存在を消す必要ある時 */
	pointer-events: none;
  }
}

/* 回転(無限にやらせる)の時 ％ではなくfrom-toも使える */
@keyframes spin{
  from{
    transform: none;
  }
  to{
    transform: rotate(360deg);
  }
}
```
## 本体に設定すること
### アニメーションの適用
```css
.box{
	animation: アニメーション名;
}
```

### アニメーション時間
```css
.box{
	animation-duration: アニメーション時間s;
}
```

### アニメーションを開始するまでの時間
``` css
.box{
	animation-delay: 開示までの時間s;
}
```

### アニメーション名の最後で停止させる(＝初期値に戻らないようにする) 
```css
.box{
	animation-fill-mode: forwards;
}
```

### アニメーションの繰り返し
```css
.box{
	animation-iteration-count: infinite;
}

/* 数字で回数、無限：infinite */
```

### アニメーションの方向(行ったり来たり)
- alternate：行ったり来たり
- reverse：ただ逆にするだけ
- alternate-reverse：逆にして行ったり来たり

```css
.box{
	animation-direction: alternate; 
}
```

### アニメーション一括指定 
```css
.box{
	animation: move 2s infinite 1s;
}
/* transitionと同様に順不同 */
```
<br><br>

# 3.動きの緩急の設定
- ease(初期状態)
- ease-in：小さいものが動く感じ
- ease-in-out：重いものが動く感じ
- liner：ずっと一定

```css
{
 animation-timing-function: ease;
 transition-timing-function: ease;
}
```
【APIGateway+Lambda】APIキーを必要とするAPIでアクセス制限

APIはすでに作成されておりデプロイ状態にある前提とします。

まずは**使用量プラン**をクリック
![スクリーンショット (160)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/ab8d8948-cf4a-e5fc-6f26-70f29f3d710a.jpeg)

**作成**
↓

![スクリーンショット (161).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/f3a042a1-3675-5b4f-d1f2-475af1aa4b9e.png)

作成に必要な設定を行います。


このリクエスト数を越えてしまうと
429 Too Many Requests　というエラーが出てアクセスができなくなります。

![スクリーンショット (162).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/6d7aeb48-46c8-57f7-5cf6-403563e5c8bf.png)

![スクリーンショット (163).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/37fac12b-063a-a1d2-5ddf-7f45b9bc6967.png)

APIキーを作成して使用料プランの作成を終えるとリソースのメソッドリクエストページ、APIχの必要性の欄に注意書きが出ています。

![スクリーンショット (164).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/9ec9a2b0-c95c-aff3-0d93-ed4b00a38d06.png)

こちらを**true**に切り替えると使用量プランに紐づいたAPIキーがないとこのエンドポイントにはリクエストが届かなくなります。


![スクリーンショット (165).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/256952e5-3026-af8f-4bd4-dbe5518e87f3.png)

![スクリーンショット (166).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/e56da38e-bde6-e565-72d1-4f3c0f164730.png)

設定したAPIキーは
**APIキー→APIキー名→表示**で確認できますのでコピーしておきましょう。

## 実行

APIキーをヘッダーに含める場合は**x-api-key:**の後に設定されたキーを追加します。

キーが正しい場合

```
$ curl  -X POST -H "x-api-key: correct_api_key" https://aj.execute-api.us-east-2.amazonaws.com/default
>> {"message": "Request is Suceeded"}
```
キーが違う場合

```
$ curl  -X POST -H "x-api-key: incorrect_api_key" https://xxxxxxx.execute-api.us-east-2.amazonaws.com/default
>> {"message":"Forbidden"}
```
キーがない場合

```
$ curl  -X POST https://xxxxxxx.execute-api.us-east-2.amazonaws.com/default
>> {"message":"Forbidden"}
```
Pythonで学ぶ制御工学　第7弾：グラフ作成へ向けて

# #Pythonで学ぶ制御工学< グラフ作成へ向けて >

##はじめに
基本的な制御工学をPythonで実装し，復習も兼ねて制御工学への理解をより深めることが目的である．
その第7弾として「グラフ作成へ向けて」を扱う．

##グラフ作成へ向けて
ここでは，次回以降必要になってくるグラフ作成において，便利になってくるであろうものを関数化し，以降使えるようにする．**関数化することで，毎度細かな設定を行う手間が省ける**．なお，ここで記述するのは，参考書にあったものであり，絶対的なものではない．あくまでもその参考書の説明の中で手間を省くために用意されているものである．しかしながら，**設定の方法を学ぶことができ，今後自分好みや，ある基準に従った仕様でグラフ作成する際に，役立つ知識となる**であろうと思い，ここに記録することとする．

##関数の定義
```for_plot.py
"""
2021/02/25
@Yuya Shimizu

図を整えるための関数定義
"""

#グラフをプロットするときの線種を決めるジェネレータ
def linestyle_generator():
    linestyle = ['-', '--', '-.', ':']
    lineID = 0
    while True:
        yield linestyle[lineID]
        lineID = (lineID + 1) % len(linestyle)


#グラフを整える関数
def plot_set(fig_ax, *args):
    fig_ax.set_xlabel(args[0])   #x軸のラベルを1つ目の引数で設定
    fig_ax.set_ylabel(args[1])   #y軸のラベルを2つ目の引数で設定
    fig_ax.grid(ls=':')             #グラフの補助線を点線で設定
    if len(args) == 3:
        fig_ax.legend(loc=args[2])  #凡例の位置を3つ目の引数で設定

#ボード線図を整える関数
def bodeplot_set(fig_ax, *args):
    #ゲイン線図のグリッドとy軸ラベルの設定
    fig_ax[0].grid(which='both', ls=':')
    fig_ax[0].set_ylabel('Gain [dB]')

    #位相線図のグリッドとx軸, y軸ラベルの設定
    fig_ax[1].grid(which='both', ls=':')
    fig_ax[1].set_xlabel('$\omega$ [rad/s]')
    fig_ax[1].set_ylabel('Phase [deg]')

    #凡例の表示
    if len(args) > 0:
        fig_ax[1].legend(loc=args[0])  #引数が1つ以上：ゲイン線図に表示
    if len(args) > 1:
        fig_ax[0].legend(loc=args[1])  #引数が2つ以上：位相線図にも表示        
```

##感想
今回は直接制御工学についての学習ではなかったが，グラフをきれいに整えるものを関数化するというのは，この教材にとどまらず，以降，何かしらグラフを扱っていく中で役立つことにはなってくるはずである．

##参考文献
Pyhtonによる制御工学入門　　南 祐樹　著　　オーム社
LPC1114のMbedでのHT16K33でナイトライダー(ハードは、ichigojam)


1.SCLとSDAを接続、プルアップも忘れずに
2.電源の接続
3.下記のソースコードを書き込む
4.コンパイル実行で表示されたら終了
5.おわり

```c++

#include "mbed.h"
//#include <stdio.h>
 
//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX);

#define ADDR        (0x70<<1)  //  address
#define ADDR_LCD    (0x7C)  //  address

//I2C i2c(I2C_SDA, I2C_SCL); //767
I2C i2c(dp5, dp27); //1114
//I2C i2c(PA_10, PA_9); //010

char data_read[8];  //i2cバッファー
int ii;             //ループカウンター


int main() {
    
///*INIT start *********  
    
    data_read[0]=0x21;
    i2c.write(ADDR, data_read, 1);wait_ms(1);

    data_read[0]=0x81;
    i2c.write(ADDR, data_read, 1);wait_ms(1);

    data_read[0]=0xef;
    i2c.write(ADDR, data_read, 1);wait_ms(1);

    for(ii=0;ii<16;ii++){
        data_read[0]=ii;
        data_read[1]=0x00;
        i2c.write(ADDR, data_read, 2);wait_ms(1);
    }//for

    
    wait_ms(2000);
    
//*/  //INIT end *********    

    while(1){
        for(ii=0;ii<8;ii++){
        
        data_read[0]=0;
        data_read[1]= (1<<ii);
        i2c.write(ADDR, data_read, 2);wait_ms(1000);

        }//for
    }//while

} // main


```

![i2c_HT16K33_1114_1_m.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/0b9ba2be-a986-2b92-6541-7e21cb514d2c.jpeg)
PHPでMySQLの接続確認をする

MySQLのクライアントが入っていないサーバーでMySQLアカウントの確認をする方法です。

```
ssh 対象のサーバ
vi test.php
-------------------------------------------------------------------------------------------------
<?php
define('HOSTNAME', 'hoge01');
define('DATABASE', 'db1');
define('USERNAME', 'test');
define('PASSWORD', 'hogehoge');
 
try {
  $db  = new PDO('mysql:host=' . HOSTNAME . ';dbname=' . DATABASE, USERNAME, PASSWORD);
  echo "OK\n";
} catch (PDOException $e) {
  echo "NG\n";
  echo $e->getMessage()."\n";
}
-------------------------------------------------------------------------------------------------
php test.php
```
Cでテキストファイルの入出力

標準ライブラリstdioを用いたファイル操作のまとめです.

#書き込み

```c:write.c
#include <stdio.h>
#include <stdlib.h>
int main(void){
   FILE *fp;
   fp = fopen("hoge.txt", "w");
   if (fp == NULL) {
      printf("error\n");
      exit(1);
   }
   fprintf(fp, "hello.\n");
   fclose(fp);
   return 0;
}


```
#読み込み

```c:read.c
#include <stdio.h>
#include <stdlib.h>
int main(void){
   FILE *fp;
   int N=256;
   char str[N];
   fp = fopen("hoge.txt", "r");
   if (fp == NULL) {
      printf("error\n");
      exit(1);
   }
   while(fgets(str, N, fp) != NULL) {
      printf("%s\n", str);
   }
   fclose(fp);
   return 0;
}
```
【JavaScript】 海外Teck系YouTuberを真似てみた！(part 1) BookList App | No Frameworks

#１，はじめに
>この記事は、**海外Teck系YouTuberの動画**を参考に、同じプロジェクトを作成してみたものになります！
簡単にですが、動画を通して学べた技術や知識をまとめました！

➡[**partⅡ**](https://qiita.com/iwasaki-hub/items/ccafa245fdee92afa5e5)では、**JavaScript**で**ToDoList**を作成しています:book:
完成品は、下記に載せています:bangbang:

#２，学んだこと
Frameworksを使わずに、BookListを作ることができました！
主に、
>①　**class**の作成
②　**static メソッド**の作り方と使い方
③　**localStorage**の追加と削除

**Bootswatch**や**Font Awesome**も使いながら、デザインについても学ぶことができました！

#３，参考動画

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/JaMCxVWtW58/0.jpg)](http://www.youtube.com/watch?v=JaMCxVWtW58)

https://youtu.be/JaMCxVWtW58

#４，完成:tada:
![2021-02-25_16h47_16.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/0142e485-54d3-03a8-75b5-90890368b9d8.gif)

#５，次回は、
JavaScriptで、[ToDoList](https://qiita.com/iwasaki-hub/items/ccafa245fdee92afa5e5)にトライしてみます！
Spinnaker導入時halyardのinstallで"Java >=8 not yet installed - please install java >=8."となる

2021/02/25時点の情報です。

macOS Catalinaにhalyardを導入します。
javaのバージョン確認。

```
java -version
java version "15.0.2" 2021-01-19
Java(TM) SE Runtime Environment (build 15.0.2+7-27)
Java HotSpot(TM) 64-Bit Server VM (build 15.0.2+7-27, mixed mode, sharing)
```
Java SE 15を導入しています。

halyardをinstallすると

```
sudo bash InstallHalyard.sh
Halyard version will be stable
Halconfig will be stored at /Users/sota/.hal/config
Uninstall script is located at /Users/sota/.hal/uninstall.sh
Java >=8 not yet installed - please install java >=8.
  Try using brew or jenv
```
なぜかjavaのバージョン8以上がないよと言われる。
`InstallHalyard.sh`をエディタで開くと：

```
152   if [[ "$java_version" == *"1.8"* ]] || \
153      [[ "$java_version" == *"9.0"* ]] || \
154      [[ "$java_version" == *"10.0"* ]] || \
155      [[ "$java_version" == *"11"* ]] || \
156      [[ "$java_version" == *"12"* ]] || \
157      [[ "$java_version" == *"13"* ]] || \
158      [[ "$java_version" == *"14"* ]] || \
160      [[ "$java_version" == "java version \"10\""* ]]; then
161     echo "Java is already installed & at the right version"
162     return 0;
163   fi
```

ゴリ押しでjavaのバージョンを確認しているので、以下の1行加えてあげる。

```
159      [[ "$java_version" == *"15"* ]] || \
```
isntallを再実行すると先ほどのポイントは通過する。
以上。
Macでシンボリックリンクを使って「cd」で移動できるエイリアスを作る

いつも忘れてしまうので忘却録
iCloudのディレクトリにコマンドラインで移動したいときにパスが長く面倒なのでエイリアスを作りたい。
GUIのエイリアスではcdコマンドが使えず不便なので、シンボリックリンクで作成する。

```
ln -s "iCloudのPath"
```

これでcdコマンドで移動できるようになる。
【APIGateway+Lambda】AWS外からのパラメーターを使用する

## 先ずはLambda関数を作成

今回は与えらえた値を返すだけの**test_return_valuables**という
シンプルな関数をPythonで作成します。

![スクリーンショット (154).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/f28ce3f9-7fd9-00d7-2747-81e75bcfb34e.png)


## APIGatewayでAPIを作成

![スクリーンショット (150)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/0b50e9a4-5a7d-4902-6a0e-88b12bd91e7c.jpeg)

**REST API**を選択し構築。

さらにメソッド作成で**POST**を追加します。
![スクリーンショット (158).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/0fe4e708-da7a-ba7f-e9d1-11193bd68fb8.png)


これでPOSTメソッドをAPIとして使用できます。

### Lambdaと統合

次にAPIGatewayから実行するLambdaを統合します。

リソースの画面から**POST**をクリック

統合タイプにデフォルトでLambdaが選択されているためそのまま統合したい関数を入力します。

![スクリーンショット (157).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/4ee3bf0d-ec91-f3a9-14d1-0c546f92dc2e.png)

Lambdaの統合はたったこれだけで完了します。

APIGatewayとの統合はシンプルで良いですね

それではこのAPIをデプロイして外部からアクセスできる様にしましょう。



デプロイを忘れるとエンドポイントが作成されていないため、外部からアクセスできません。

リソースを作成してるのにAPIが使えないのは直観ではわかりにくかったです…

![スクリーンショット (153)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/ae10ebd2-bf96-9475-98b2-cbeddbdf56fd.jpeg)

**ステージ選択→新しいステージを作成→わかりやすい名前で作成(今回はdefault)**

それではコンソールからPOSTメソッド指定してリクエストを送ってみます。

ステージ作成時に表示されたAPIエンドポイントへリクエストを送ります

```
$ curl  -X POST https://xxxxxxx.execute-api.us-east-2.amazonaws.com/default

>> {}
```

パラメーターが何もないため空欄が返されました。
APIGatewayとLambdaが正常に機能していることが分かります。



しかしこのままクエリパラメータを送ってもLambdaには引数として渡すことはできません。

```
$ curl  -X POST https://xxxxxxx.execute-api.us-east-2.amazonaws.com/default?name=hoge
>> {}
```

パラメーターをマッピングしてAWS側で受け取れようにしましょう。

### マッピング

リソースの画面で**統合リクエストを選択**
↓
マッピングテンプレート

![スクリーンショット (151)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/306107f1-0942-ba04-81fc-cb798b97e53c.jpeg)

新たにマッピングテンプレートを追加します。
**application/json**と入力


![スクリーンショット (152).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536448/a2581017-9857-7651-2f84-0a316ea50da7.png)

上記のように

{
**"受け取るパラメーター名": "$input.params('送る際のパラメーター名')"**
}
のように記載すると、Lambda関数でevent変数としてパラメーターを使用できるようになります。

**$input.params**はAPIGatewayを使用してパラメーターを送った際に自動的に格納される場所です。


最後にリソースを忘れずにデプロイしましょう！


デプロイされたリソースの反映には少し時間がかかるようなので、時間が経ってから再度更新されたエンドポイントへリクエストを送信

```
$ curl  -X POST https://aj7i8pust1.execute-api.us-east-2.amazonaws.com/default?name=hoge
>> {"name": "hoge"}
```

無事パラメーターを送信できました。

アクセスを制限したい場合はapi-keyなども必須にすることもできます。

```
$ curl  -X POST -H "x-api-key: correct_api_key" https://aj.execute-api.us-east-2.amazonaws.com/default?name=hoge
>> {"name": "hoge"}
```
key間違い

```
$ curl  -X POST -H "x-api-key: incorrect_api_key" https://xxxxxxx.execute-api.us-east-2.amazonaws.com/default?name=hoge
>> {"message":"Forbidden"}
```

keyなし

```
$ curl  -X POST -https://xxxxxxxx.execute-api.us-east-2.amazonaws.com/default?name=hoge
>> {"message":"Forbidden"}
```

[>> APIキーの設定方法]()はこちら解説してますのでよろしければご覧くださいー
Promiseで配列を逐次処理する


# Promise で配列を逐次処理する
Promiseを再帰的に呼び出すことで配列を逐次処理します、配列を元にWEBAPIを１回ずつ呼び出す必要があり作成に至りました。
ソースコード内 sequentialPromise 関数が逐次呼出しする関数です、sequentialPromiseSub をAJAX等でAPI呼び出しする関数に置き換えて考えれば使用用途がわかりやすいかと思います。

``` javascript
<html>
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="Pragma" content="no-cache">
        <meta http-equiv="Cache-Control" content="no-cache">
        <title>
            テスト
        </title>
    </head>
    
    <body>
        <button id="button1" type="button">
            ボタン１
        </button>
        
        <div id="view">
        </div>
    </body>

    <script type="text/javascript">
        function TestClass() {
            var self = this;
            self.sequentialPromiseSub = function(value) {
                var me = this;
                console.log("value", value);
                document.getElementById("view").textContent = "value = " + value;
                return new Promise(function(resolve) {
                    setTimeout(function() {
                        resolve(true);
                    }, 1000);
                });
            }
            self.sequentialPromise = function(array) {
                var me = this;
                if(array.length == 0) {
                    return Promise.resolve(true);
                }
                var value = array.shift();
                return me.sequentialPromiseSub(value)
                .then(function() {
                    return me.sequentialPromise(array);
                });
            }
            self.setupEvent = function() {
                var me = this;
                var array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
                document.getElementById("button1").addEventListener("click", function() {
                    console.log("button click");
                    me.sequentialPromise(array)
                    .then(function(result) {
                        console.log("result", result);
                        return true;
                    });
                });
            }
            self.setupEvent();
        }
        var obj = new TestClass();
    </script>
    
</html>
```


## Promise.all じゃだめなのか
Promise.allだと並列に一斉にWEBAPIを呼んでしまい１００個とか数が多かった場合にAPIが１，２個失敗しました、API側の環境を改善しろという話なのかもしれませんが呼び出し側で対応した結果こうなりました。
珍しい使い方のように思えたので記事にしました、以上です。
OCIで突如ネットワーク転送量が跳ね上がって焦った話

# OCI
Oracle Cloud Infrastructure の略でオラクルが運営するクラウドサービス.  

# 経緯
OCIでは月10TBまでのアウトバウンド通信が、無料で使えます。AWS,GCPと比べても格別です。
このOCIを使ってプログラムを動かしていたのですが、ある機能を追加した瞬間に全く関係ないネットワーク通信量が加算されていることに気が付きました。  

追加した機能はそこそこの量のデータを計算によって作成してブロックストレージに保存するもので、ネットワークの通信はしないものです。
ブートボリュームに大量のデータを保存するのは嫌だったので、新たにブロックストレージを作成してマウントし、そこに保存するようにしました。

プログラムは意図したとおりに動き始めたのですが、しばらくするとOCIコンソール上のインスタンスモニタの`Network (R/T) Bytes`の項が凄まじい通信量を記録していることに気が付きました。 

いくら無料枠が大きいとはいえ、このままでは軽々とオーバーしてしまいそうです。

# 原因
OCIでは、ブロックストレージをアタッチする際に

* Paravirtualized
* iSCSI

が選べます。

ここでiSCSIを選択したのが原因でした。

iSCSIは、TCP/IPを利用して、ブロックストレージに対する読み書きを行います。
そのため、外部のアドレスに対するネットワークの通信が行われない操作でも、コンソール上のネットワーク通信量が急増したのでした。


# 対処
Paravirtualizedでマウントし直しました。
ネットワーク転送料金の計算に、iSCSIでの通信も含まれるのかどうかの記述がなかったため、だれか知っている方がいれば教えて下さい。

# おわりに
ネットワークの通信量を外部へのネットワーク通信だと決めつけていたことを反省しました。
【VM002】Azure 仮想マシンを設計する（ディスク編）

# Azure仮想マシン作成時のストレージパラメータについて考慮すべき点はなに？

仮想マシンのディスクの設定パートですが、以下画面となっております。いまいち直感的に判断できないので各パラメータについて確認した内容を説明します。

まず概要については以下図をご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111921/79ee9a37-cede-036b-2396-24b28ec337a2.png)
詳細を以降でご説明いたします。

## OSディスクの種類
※[エフェメラル OS ディスクを使用する]を有効にしているとVMサイズなどにより
※自動決定されるのでグレーアウトして設定できなくなる。

WindowsのCドライブ、Linuxの"/"が格納されるディスクをここで指定する。

[Premium SSD]
128GBで￥2500くらい。
パフォーマンスが保証されている。基本的にディスクサイズがでかいほどパフォーマンスが良い。ディスクサイズによっては、バースト機能でIOPSやディスクへの帯域が一時的に通常性能の最大約30倍の性能を出せる。正直OSのCドライブやルートパーティションにそこまでのスペックが必要かと考えると要らないと思う。
[Standard SSD]
128GBで￥1000くらい。
[Standard HDD]
128GBで￥650くらい。なんかよく事例としてAzureに移行したらクソ遅くなったっていう話あるけど、SSDにしてなおったってケース多いみたい。

## 暗号化の種類
ここで設定する暗号化はMSなどのマニュアル上ではSSEと呼ばれる機能の暗号化のこと。Azureのサービスを提供しているデータセンター内の物理リソースであるストレージ機器がテロなどで物理的に損失した際に、該当のストレージハードウェア以外で中身が見れない、中身のデータが流出しないようにする機能みたい。いまいちMSのマニュアルにはっきり書いているの見たことない。OSレイヤではなく、ストレージ機能側による暗号化でこの機能によるパフォーマンス影響はない。選択肢としては以下が存在。

[プラットフォームマネージドキーを使用した保存時の暗号化]
MSが用意した鍵を使って暗号化

[カスタマーマネージドキーを使用した保存時の暗号化]
自分で用意した鍵を使った暗号化

[プラットフォームマネージドキーとカスタマーマネージドキーを使用した二重暗号化]
MSが用意した鍵と自分で用意した鍵を両方使って暗号化

## Ultra Diskの互換性を有効にする
OSが乗っかるシステムディスクではなく、データを格納する別ディスクとしてUltra Diskを利用するかのオプション。後から有効化できるし仮想マシン作成タイミングでUltra Diskを付けたいとかの要件が無ければ無効でいいはず。

## データ ディスク
データを格納する別ディスクの指定。
実際に画面を進めると以下になる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111921/6bd97cc3-c4fc-d284-a371-8b43f0b403a4.png)

[ソースの種類]
ディスクを追加する際、すでに作成済みのスナップショットやBLOBストレージから作成することもできるため、そのためのオプション。
なし：ソースなどを指定せず新規に作成。
BLOBストレージ：事前作成しているディスクイメージのURIを指定して作成。
スナップショット：事前取得しているスナップショットをもとに作成

[共有ディスクを有効にする]
複数の仮想マシンに同時に接続させるためのオプション。クラスタソフトウェアなどで共有ディスクを利用するケースがあるが、利用ケースとしてはその認識でよい。

[ホストキャッシュ]
なし：その名の通り。キャッシュを使わない。
読み取り専用：その名の通り。読み取りデータはキャッシュ上に保管され読み取り時のパフォーマンスが向上する。
読み取り／書き込み：読み取りキャッシュに加え、書き込み時はキャッシュ書き込みによってアプリケーションが書き込み完了ステータスを受け取るので書き込み処理が早くなる。ただし、障害が発生してキャッシュデータが失われた場合、その分のデータが失われる可能性がある。

## 詳細
[マネージド ディスクを使用]
マネージドディスクはAzure側で管理しているディスクのこと。Azure仮想マシン向けのディスク。
アンマネージドディスクはストレージアカウントを通して作成してページBLOBストレージのこと。

[エフェメラル OS ディスクを使用する]
※注意　この機能を使うとRecovery Serviceコンテナからのバックアップができない仮想マシンが出来上がる。

イメージ的にあんまり可用性の高くないディスクに保存すると考えればよい。Microsoft側はホストサーバにOSディスクを作成するという表現を使っているが、Azure仮想マシンが動いているAzure Hyper-Vのホストサーバのディスク領域を使っているということみたい。
前段の”基本”VM作成画面でVMのサイズを選ぶが、PremiumストレージをサポートしているVMサイズでなおかつ選択したVMの一時サイズがOSで必要な最低限のサイズを満たしているものを選択した場合にのみ利用可能な模様。利用ケースとしては、一時的なサーバだったり、踏み台サーバなどのVMでは有用かと思われる。
なお、これを選択した場合、OSディスクサイズが利用できないVMサイズを選択していた場合には「選択したイメージは、選択したインスタンスの OS キャッシュに対して大きすぎます。」が表示されてこの機能を有効化できない。

さらに、このオプションを使うとポータル画面から仮想マシン停止ができない。
以下のように停止ボタンがグレーアウトしていて選択できない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111921/4dd8580a-02a3-2164-c639-6f03b198b5c6.png)
さらになお、注意書きにも記載したがエフェメラル OS ディスクを使用している場合、Recovery Serviceコンテナからのバックアップやサイトリカバリ設定ができない。後続の管理タブ画面からRecovery Serviceコンテナの設定を行うのだが、設定したバックアップは「UserErrorBCMUnsupportedEphemeralDisk」と失敗してしまう。

だけど、OSログインしてshutdown -h nowとかは実行できちゃう。
そして/ファイルシステムにテスト的に保存していたデータは消えなかった。なにこれ。。。いまいち機能わかんないわこれまじで。
VSCodeで、「ターミナルの起動に失敗しました。エラー 1260」でPythonが実行できない。

さて、VSCodeでPythonを使う方法は、色々ウェブ上で紹介されていますが、基本的にインストーラを使えば、パスの設定などは必要ないはずだと思います。
ところが、私の場合、Windows10でVSCodeのインストール　→　Pythonのインストール　→　print("Hello world!")を実行、と行けるはずが、print文を実行して、「ターミナルの起動に失敗しました。エラー 1260」で、右下にターミナル・ウィンドウが表示されませんでした。
そこで、VSCodeを一度アンインストールし、再インストールしたのですが、ダメでした。
さらに、設定　→　機能　→　ターミナル　を確認し、
```
External: Windows Exec
どのターミナルを Windows で実行するかをカスタマイズします。
C:\WINDOWS\System32\cmd.exe
```
と正しく設定されていました。

そこで、このエラーメッセージ上にあった[トラブルシューティング](https://code.visualstudio.com/docs/supporting/troubleshoot-terminal-launch)をよく読み、
C:\Users\(ユーザ名)\AppData\Roaming\Code\User\　にある　**settings.json**　に、
```"terminal.integrated.shell.windows": "C:\\WINDOWS\\system32\\cmd.exe"```
の1行を手動で追加して、Pythonが無事動きました。

何かの参考になれば、幸いです。
以上です。
Azure 管理グループ、サブスクリプションを設計する

# 管理グループ、サブスクリプション設計時の考慮すべき点はなに？
※この記事は実例などをベースに常に更新していく予定です。

エンタープライスシステムの場合、このあたり整理してきちんと設計しないとのちの保守運用で大変なことになるのでAzureサブスクリプションの設計を本気で考えようと思います。
そもそもサブスクリプションの管理対象スコープを明確にしたいと思いますが、MS社サイト情報でいい図がありました。著作権の問題もあるのでそのままコピーすることができませんが、URLは以下です。

https://docs.microsoft.com/ja-jp/azure/role-based-access-control/elevate-access-global-admin

なお、ベストプラクティスとしてMicrosoft担当者が作成したと思われる資料もありました。URLは以下です。

https://www.slideshare.net/TechSummit2016/cld025-it-azure


この図の情報と私が調査した結果サブスクリプションの管理対象は
　・リソースをひとくくりにしたリソースグループ
　・リソースに掛かる費用(こちらはタグレベルで管理するなども可能)
　・リソースへのアクセス権限（当然リソースグループ単位でのアクセス制御も可）
のようでした。なのでそれらリソースを一括管理したい場合に便利です。どのように取り扱いしたいか、管理したいかで設計を纏めるのが良いかなと思います。
この設計の際、以下非機能要件が大事かと思います。特にNW。

## 【非機能要件】
・NW
やりたいこと
プライベートIPアドレスの有効活用、CIDR設計をあんまり考えすぎたくない

避けたいこと
AzureにプライベートIPアドレスを配分した結果社内で利用できるプライベートIPが枯渇すること

・セキュリティ
やりたいこと
決められた担当者が決められたリソースにしかアクセスできない環境にする。第三者にセキュリティを突破された場合に被害を最小限にする。なるべくシンプルな設計にしてアクセス許可を与える際に楽な運用になるよう設計する。システム担当者へある程度委任して担当者側で作業者のアカウント追加などが可能なようにする。

避けたいこと
複雑にしすぎてもはやよくわからない。管理がすごいめんどくさい。局地的でいい感じのシンプルなわかりやすいアクセス許可の委任ができないので、基本すごい偉い人が申請をメールとかで受けて、それをベースにちまちまやる。

・運用性
やりたいこと
担当者は与えられた環境で柔軟に素早くシステムリソースを用意できる。システム担当者はサブスクリプション上のシステムリソースを柔軟に作成、削除、変更対応可能。

避けたいこと
申請ベースにして承認を受けないとサーバが作れない。変更もできない。スピード感やDevOps前提のクラウドを申請ベースで作るのは良くないと思うので。

もちろん、サブスクリプションの括りで費用やアクセス権を管理しなくてもいいんでしょうけども、ある程度自由度の高い対応をシステムカットでシステム担当者の推進力を使ってやってもらうことを考えた場合にサブスクリプションをシステム側に引き渡せばそのなかでのサービスなど自由に使えるので上記要件を実現する場合にしっくりくるのかなという印象でした。

## 自分なら絶対にやること
a.社内システムとイントラでの接続が必要なサブスクリプション
b.社内システムとイントラでの接続が不要なサブスクリプション
は絶対に分けます。インターネット経由でのSaaSみたいな使いかたしかしない基盤はbにします。
bに突っ込んだものは社内NW、別のサブスクリプションなどには連携させない感じにします。CIDRも社内プライベートIPと重複しても気にしなくていいのでbに関しては各システム担当者が独自に開発できるようシステム担当者に権限を全部渡します。

AWS VPCを社内に導入する際に非常に考えたのですが、これ系の部分ってAzure側のシステムが社内インフラとの内部NW経由での連携を前提としていて、社内のプライベートIPとAzure側のプライベートIPアドレスとの接続有無などを考えつつやらないと詰むので熟考しないといけないです。

## 設計例（１）
サブスクリプションは本番、検証、開発など環境毎に毎に作成し、
リソースグループを各システム毎に作成するパターン（Microsoftの資料でベストプラクティスとして案内されているパターン）

## 設計例（２）
リソースグループを
NW関連、ストレージアカウント関連、
VScodeでファイルを開くとき、常に新しいタブでエディタを開く方法

ご覧いただきありがとうございます。
この記事は[こちら](https://hnnsk.hatenablog.com/entry/2021/06/26/114153)へ移動致しました。
お手数おかけしますが、よろしくお願いいたします。
git push で、Please make sure you have the correct access rights and the repository exists.って言われた話


<h1>なぜ起こる？</h1>
<p>
　push先のリモートディレクトリの設定が行えていない。gitからしてみれば、『どこにpushすればええねん。』状態です。
</p>


<h2>簡単に解消法を説明</h2>
<p>
　こちらは、既存のリモートレポジトリで現在のプロジェクトをgit管理する場合になります。
</p>

<h3>git管理します宣言</h3>

```
git init
``` 
<p>
既にありますよ？って言われたら、.gitを一度削除して、initし直すのが一番手っ取り早いです。
</p>

<h3>push先レポジトリの指定</h3>

```
git remote add origin https://github.com/ユーザー名/プロジェクト名.git
```
<p>
ユーザー名、プロジェクト名は下記画像参考にしてください。
</p>
![スクリーンショット 2021-02-25 15.55.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/754176/879cd5f8-4f4e-17fa-6581-5ed0bfe3e886.png)


<h4>レポジトリの作成</h4>
```
git checkout -b develop
```

<p>試験的にpushするためのレポジトリなので説明は省略します。とりあえずdevelop</p>

<h4>add,commit,push</h4>
```
git add .
git commit -m "コミットメッセージ"
git push origin develop
```

<p></p>pushでエラーが出なければ、本記事における作業は終了です。<a　href="https://github.com/">github.com</a>にてリモートに反映ができているかの確認をしてください。


<h2>おわりに</h2>
<p>
　今回コマンドでのgitの扱いを解説しましたが、コンフリクト等起こった時は個人的にコマンドでの解決が一番早いので、慣れておいて損はないかと思います。僕自身初心者としてgitが煩わしく感じましたが、ラプトップ一つで仕事をする上で非常に重要なツールなので、常に触るようにすることを心がけております。
</p>
<p>　最後までお読みいただきありがとうございます。</p>

<br>
Laravel DBレコードの存在判定

<h2>LaravelのクエリビルダでDBレコードの存在チェック</h2>

<h3>記事内容</h3>
Laravelでオリジナルアプリのバックエンドを実装していく際に、DBにレコードが存在すればtrueを返し(ページ遷移)、レコードが存在しなければfalseを返す(エラーメッセージを表示する)という機能を実装したので、備忘録として残したいと思います。
<h2>開発環境</h2>
Laravel 8.22.1
PHP：8.0.1
MySQL：8.0.23
MacOS：11.1 ( Big Sur )
<h2>DBレコードの存在チェック</h2>

```○○Controller.php
DB::table('table名')->where(column, $data)->exists();
```
クエリビルダの基本的な書き方に、existsメソッドを繋げて記述することで簡単にレコードの存在を判定できます。

<h2>実際の記述</h2>

今回僕は、下記のように記述しました。

内容としては、ユーザーによるフォームからのリクエスト内容と一致するレコードが、存在するかどうかで条件分岐しています。

```○○Controller.php
$user = User::all()->where('id', $request->id)->first();

$msg = ['msg' => '入力されたIDは存在しません'];

if (DB::table('users')->where('id', $request->id)->exists() && [$request->id === $users->id])
{
    return redirect()->route('home'); 
} else {
    return view('login', $msg);

```

ifのカッコ内の記述により、DB内にレコードが存在していて且つ、フォームから送信された内容と一致する場合は、homeビューが返され、DBにレコードが存在しない場合は$msg変数の内容とともにloginビューが返される。

参照：[公式ドキュメント ~クエリビルダ~](https://readouble.com/laravel/8.x/ja/queries.html?header=%25E3%2582%25A4%25E3%2583%25B3%25E3%2583%2588%25E3%2583%25AD%25E3%2583%2580%25E3%2582%25AF%25E3%2582%25B7%25E3%2583%25A7%25E3%2583%25B3)

<h2>あとがき</h2>

今回のアプリを作っていく過程で、フォームからDBにレコードが存在しない値を入力された際、
「Attempt to read property "id" on null」というエラーにつまづき、なかなか前へ進めなかったので、その解決策を模索していたところ、本記事に記載した対処法に至りました。

他にも解決策はあると思いますので、laravelの公式ドキュメントや他の記事を参考にして、引き続きアプリの実装をしていきたいと思います。
Couchbase Server アーキテクチャ解説: Dataサービス

# はじめに
本記事では、Couchbase Serverの各種サービスの中から、Dataサービス（Data Service）について解説します。

Dataサービスの役割を理解することは、Couchbase Server管理者にとって必要であるばかりでなく、分散データプラットフォームの検討において、適切なテクノロジーを選択する上でも重要です。

本記事を読むことによって、Couchbase Serverが、ドキュメント指向型に分類されるNoSQLでありながら、その最も基本的な部分で（つまりDataサービスは）、純粋なKVS（キーバリューストア）として、設計されていることが理解しやすいのではないかと考えます（バリューとしてJSONドキュメントを格納することによって、Queryサービス等のJSON関連機能を活用することができますが、バリューには、バイナリデータを格納することも可能です）。

# Dataサービスとは

Dataサービスは、Couchbase Serverの管理するデータへのアクセスを提供します。ここで扱われるデータは、メモリ、あるいはディスク上に存在します。Dataサービスへのメモリの割り当ては設定により調整することが可能です。
Dataサービスは、全てのCouchbaseサービスにおいて、最も基本的なものです。Dataサービスは、クラスターを構成する全てのノードのうち、少なくとも1つのノードで実行される必要があります。

Dataサービスのコンポーネント概要図を下に示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/15bc3c7c-d2f7-f94a-d6ee-8e0b36a9dec4.png)

# Dataサービスの構成要素

Dataサービスは、以下の３つのコンポーネント（とデータ）からなります。

- ディスパッチャ(Dispatcher)
- KV(キーバリュー)エンジン(KV Engine)
- スケジューラー(Scheduler)

### ディスパッチャー
- Dataサービスへのリクエストを受けとり、応答を提供します。
- DCP(Database Change Protocol)を使用して、クラスター内の他のノードおよび他のクラスターにデータをストリーミングします。
- 認証を処理します。


### KVエンジン

バケットに関する以下の機能を提供します。

#### マネージドキャッシュ
マネージドキャッシュは、設定されたクォータに従って、バケットに割り当てられたメモリです。これには、パーティションハッシュテーブルが含まれています。これにより、メモリ内およびディスク上の、クラスター全体のさまざまなノード上のバケットアイテムの場所が記録されます。アイテムが書き込まれると、アイテムはまずキャッシュに入り、その後、1つ以上の他のノードに複製するために、複製キューに配置されます。さらに（揮発性のエフェメラル型バケットではなく、デフォルトのCouchbase型バケットの場合）ディスクキューを介して、ディスクに書き込まれます。

#### チェックポイントマネージャ
チェックポイントマネージャは、チェックポイント(checkpoint)という名称のデータ(構造)を使用して、アイテムの変更を追跡します。チェックポイントには、メモリ内のアイテムとして加えられ、まだレプリケーションキューとディスクキューに配置されていない変更が記録されます。

#### アイテムページャー
必要に応じてスペースを解放するために、最近使用されていないアイテムをメモリから取り除きます。

#### フラッシャー
バケット内のすべてのアイテムを一括削除します。バケットのデフォルト設定では、フラッシュ処理は無効になっています。 。

#### 有効期限(Expiry)ページャー
期限切れのアイテムをスキャンし、メモリとディスクから消去します。その後、トゥームストーンは、デフォルトの3日間残ります。有効期限ページャーは、デフォルトで60分ごとに実行されます。

#### バッチリーダー
ディスクキューに溜まっている複数のアイテムに加えられた変更を、ディスクに書き込むために、バッチとして結合することにより、パフォーマンスを向上させます。

### スケジューラー
主にI/Oを処理するためのスレッドのプールです。スレッドは4種類に分けられ、互いに独立して、影響を与えずに実行されます。

#### Non IO
ディスクアクセスを必要としないスケジューラー専用のタスクです。接続通知、チェックポイントの削除、ハッシュテーブルのサイズ変更などが含まれます。

#### Aux IO (補助 auxiliary IO)
フェッチ、スキャン、およびバックフィルタスク等、補助的な処理を担います。

#### Reader IO
ディスクから情報を読み取るスレッドです。

#### Writer IO
ディスクに情報を書き込むスレッドです。

# 最後に
本記事の内容が、Couchbase Server管理者の方だけでなく、分散データプラットフォームを検討されている方にも、活用いただけるようであれば幸いです。

一つの記事で、全体を敷衍することは不可能であるため、分からない用語などが登場しているかもしれませんが、その際には、下記の関連情報を参考としていただきますよう、お願いします。

# 関連情報

[NoSQL/JSONデータベースCouchbase理解・活用へのロードマップ](https://qiita.com/yoshiyuki_kono/items/4c9cd1115efc5807b49f)

https://docs.couchbase.com/server/current/learn/services-and-indexes/services/data-service.html

https://forums.couchbase.com/t/what-is-couchbase-server-bin-scan-backfill/9873/6