OmniAICreator/Qiita-1.07M huggingface dataset:
LaTeX で日本語を均等割り付けする方法

LaTeX で日本語を均等割り付けするマクロを作製しました。

`\kintou{x}{文字列}` で文字列をx字に均等割り付けします。
`\kintouwidth{dim}{文字列}` が実際に長さdimに文字列を均等割付し、
`\kintou` は内部で `\kintouwidth{x\zw}{文字列}` を呼ぶだけです。

LuaLaTeX 用に作ったので、それ以外のエンジンを用いる場合は `\zw` の代わりに`zw`を用いてください。
英文字も文字ごとに均等割り付けしたい場合は
`\kintou{5}{A B C D}`のように1文字ごとに半角スペースを入れてください。

![スクリーンショット 2020-07-27 16.37.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302937/30607084-d939-4329-3954-d2d7e2b17ee7.png)


```latex
\documentclass[b5paper,10pt]{ltjsarticle}

\usepackage{calc}
\usepackage{ifthen}
\usepackage{graphicx}

\makeatletter
\newlength{\wtarget}
\newlength{\wactual}
\newcommand*{\kintou}[2]{\kintouwidth{#1\zw}{#2}}
\newcommand*{\kintouwidth}[2]{%
    \setlength{\wtarget}{#1}%
    \settowidth{\wactual}{#2}%
    \ifthenelse{\lengthtest{\wtarget < \wactual}}{%
        \setlength{\wtarget}{1pt * \real{\strip@pt\wtarget} / \real{\strip@pt\wactual}}%
        \scalebox{\strip@pt\wtarget}[1]{#2}%
    }{%
        \makebox[\wtarget][s]{#2}%
    }%
}
\makeatother

\begin{document}

\begin{tabular}{ll}
\makebox[5\zw][s]{\textleftarrow\ 5字 \textrightarrow}
& \makebox[2cm][s]{\textleftarrow\ 2cm \textrightarrow}\\
\kintou{5}{寿限無寿限無五劫の擦り切れ} & \kintouwidth{2cm}{寿限無寿限無五劫の擦り切れ}\\
\kintou{5}{寿限無寿限無五劫} & \kintouwidth{2cm}{寿限無寿限無五劫}\\
\kintou{5}{寿限無寿限} & \kintouwidth{2cm}{寿限無寿限}\\
\kintou{5}{寿限無} & \kintouwidth{2cm}{寿限無}\\
\kintou{5}{寿限} & \kintouwidth{2cm}{寿限}\\
\end{tabular}

\end{document}
```

パッケージにしたもの。

```latex:kinto.sty
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
\ProvidesPackage{kintou}[2020/07/27 Kintou waritsuke Package]

\RequirePackage{calc}
\RequirePackage{ifthen}
\RequirePackage{graphicx}

\makeatletter
\newlength{\wtarget}
\newlength{\wactual}
\newcommand*{\kintou}[2]{%
    \ifthenelse{\isundefined{\zw}}{\kintouwidth{#1zw}{#2}}{\kintouwidth{#1\zw}{#2}}%
}
\newcommand*{\kintouwidth}[2]{%
    \setlength{\wtarget}{#1}%
    \settowidth{\wactual}{#2}%
    \ifthenelse{\lengthtest{\wtarget < \wactual}}{%
        \setlength{\wtarget}{1pt * \real{\strip@pt\wtarget} / \real{\strip@pt\wactual}}%
        \scalebox{\strip@pt\wtarget}[1]{#2}%
    }{%
        \makebox[\wtarget][s]{#2}%
    }%
}
\makeatother

\endinput

```
SwiftでUIViewにグラデーションを付ける方法

# はじめに
SwiftでUIViewにグラデーションを付ける方法をまとめました。

# 対象バージョン
- Xcode ver.11.6
- Simulater ver.13.6
- iOS ver 13.5.1

## デフォルト(上から下)
```swift
let gradientLayer = CAGradientLayer()
// グラデーションレイヤーの領域をviewと同じに設定
gradientLayer.frame = self.frame
// グラデーション開始色
let topColor = UIColor(red: 0.0, green: 0.0, blue: 0.73, alpha: 0.1).cgColor
// グラデーション終了色
let bottopColor = UIColor(red: 0.0, green: 0.20, blue: 0.40, alpha: 1).cgColor
let gradientColors: [CGColor] = [topColor, bottopColor]
gradientLayer.colors = gradientColors
// ビューにグラデーションレイヤーを追加
layer.insertSublayer(gradientLayer, at:0)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99869/81710182-8eef-b221-843e-b58c2bd1dfc8.png)

## startPointとendPointを変更することでグラデーションの向きを変更
### 左から右
```swift
let gradientLayer = CAGradientLayer()
// グラデーションレイヤーの領域をviewと同じに設定
gradientLayer.frame = self.frame
// グラデーション開始色
let topColor = UIColor(red: 0.0, green: 0.0, blue: 0.73, alpha: 0.1).cgColor
// グラデーション終了色
let bottopColor = UIColor(red: 0.0, green: 0.20, blue: 0.40, alpha: 1).cgColor
let gradientColors: [CGColor] = [topColor, bottopColor]
gradientLayer.colors = gradientColors
gradientLayer.startPoint = CGPoint.init(x: 0, y: 0)
gradientLayer.endPoint = CGPoint.init(x: 1, y: 0)
// ビューにグラデーションレイヤーを追加
layer.insertSublayer(gradientLayer, at:0)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99869/c884af53-bf4f-d22c-13a5-c1a9a1a1961f.png)

### 左上から右下
```swift
let gradientLayer = CAGradientLayer()
// グラデーションレイヤーの領域をviewと同じに設定
gradientLayer.frame = self.frame
// グラデーション開始色
let topColor = UIColor(red: 0.0, green: 0.0, blue: 0.73, alpha: 0.1).cgColor
// グラデーション終了色
let bottopColor = UIColor(red: 0.0, green: 0.20, blue: 0.40, alpha: 1).cgColor
let gradientColors: [CGColor] = [topColor, bottopColor]
gradientLayer.colors = gradientColors
gradientLayer.startPoint = CGPoint.init(x: 0, y: 0)
gradientLayer.endPoint = CGPoint.init(x: 1, y: 1)
// ビューにグラデーションレイヤーを追加
layer.insertSublayer(gradientLayer, at:0)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99869/8f225750-75f5-5790-cd68-415570b8ce02.png)

# まとめ
Viewのサイズとグラデーションのサイズが異なる場合は適時frameを調整すれば、
一部でけグラデーションを適用することも可能なようです。
グラデーションのcolorsプロパティも配列になっているので2色以外も設定して使用できるのかなと思います。
【Java】初心者のServlet理解-①

#目次
- はじめに
- Servlet(サーブレット)って何？
- クラス宣言
- 主なメソッド
    - doGet(), doPost()
    - getWriter()
    - setContentType()
- 例外
- おわりに


##はじめに
本記事は
　　・「いまからJavaをやるよ～」
　　・「Javaやってるけどもっかい復習したいよ～」
人向けの雑な内容です。
筆者も鋭意学習中の身なので、内容の正確性は保証しませんが。。。
皆さんの学習の一助~~(自分の学習のメモ帳)~~になればと思います。

#Servlet(サーブレット)って何？
一言でいうと、「<b>サーバサイドで動くJavaのプログラム</b>」のこと。

・通常のクラスファイル
　　　→ローカルの環境下でのファイルのやり取り
・Servletクラスファイル
　　　　→HTTPリクエストに応じた処理をサーブレットが行い、レスポンスとして出力する
のイメージ。

```java
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {
    
    // GET送信が行われたHTTPリクエストに対し、返却するHTTPレスポンスを設定するメソッド
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        // HTTPレスポンスとして返却するファイルの形式を「html」に、
        // 文字セットを「UTF-8」に指定
        response.setContentType("text/html; charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.println("<body>HelloServlet</body>");

    }
}
```

##クラス宣言
ServletはHttpServletクラスの継承クラスとして作成

```java
public class HelloServlet extends HttpServlet{
}
```



##主なメソッド
####●doGet(), doPost();
```java
public void doGet[doPost](HttpServletRequest request, HttpServletResponse){
}
```
Get/Postのリクエストに対し、HTTPレスポンスを返すメソッド。
第1引数がHTTPリクエスト,第2引数がHTTPレスポンスに対応している。


#####●setContentType()
```java
response.setContentType("text/html; charset=UTF-8");
```
HTTPレスポンスとして出力するファイルの「形式」と「文字コード」を指定するメソッド。
設定した値がhtmlヘッダのContent-Typeへ反映される

#####●getWriter()
```java
PrintWriter out = response.getWriter();
```
出力用のストリームを取得するメソッド
PrintWriterクラスをoutオブジェクトとして作成することで、println()などのPrintWriterクラスメソッドを使用できるようにする
※ここでprintln()した内容はhtmlファイルとして書き込まれる。

##おわりに
つたない文章/わかりづらい構成でつらい...
もっと伝わる文章を書けるようになりたいっすね。
徐々に改善していけるように投稿頑張るぞ～～

では。
Node.js+Express+MySQLでWebAPIを作成してみる①

# はじめに
NodeでReactを用いてフロントの作業をしていて、せっかくならバックエンドもNodeつかってJavaScriptで作ってみようということでWebApiサーバーを作ってみました。

# 実行環境
- CentOS7
- Node.js 8.17.0

# Expressの動作確認
`npm install express`でインストール

以下のサンプルソースを任意のフォルダに保存

``` index.js
var exp = require("express");
var app = exp();

app.get("/",function(req,res){
    res.send("Hello,World");
})

app.listen(3000,function(){
    console.log("成功")
})
```

保存したフォルダに移動し、`node index.js`で実行した後`http://localhost:3000/`にアクセス。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672909/c3e06433-343c-4cac-c5e1-b8dceb77bace.png)
サーバーが起動し、GETリクエストのレスポンスが返ってきました。

# MySQLの設定
まずはMySQLにログイン。その後
`create database ApiTest;`
`use ApiTest;`
`create table api_tbl(id int(5),name varchar(10));`
`insert into api_tbl values(2,'test');`
上記のコマンドで、データベースとテーブルを作成、レコードを追加。

# データの取得
作成したテーブルデータをGETリクエストで実際に取得してみます。

```index.js
var exp = require("express");
var app = exp();

var mysql = require("mysql");
var connection = mysql.createConnection({
    host: "localhost",
    user: "root",
    password: "****",
    database: "ApiTest"
});



app.get("/", function (req, res) {
    connection.query('select * from api_tbl', function (error, results, fields) {
        if (error) throw error;
        res.send(results);
    });
});

//任意のポート番号
app.listen(****, function () {
    console.log("成功");
})
```
上記のソースを保存し、`node index.js`を実行。Postmanを使用してレスポンスを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672909/3c57fffa-a1a9-1ff8-8f01-309993c439be.png)

先ほど登録したデータがちゃんと返ってきたので成功です。

# 感想
Expressを使うことでとても簡単にWebApiが作成できて感動しました！
今回は初めてということでGETリクエストのみの実装でしたが、今後CRUDすべてのAPIを実装し、フロント側もReactなどで開発することで1つのWebアプリケーションを作ろうと考えております。
Java JDK14でプレビュー追加されたRecordsについて

# はじめに
Javaも早いもので、もうすぐJDK15がリリースされます！(2020年9月予定)
ただ、その一つ前のJDK14も、あまりキャッチアップできていないのが正直なところでした・・・。
色々と調べていて、 `Records` という概念がJDK14でPreview版リリースされたことを知ったので、ちょっと記事を書いてみました。

※ Preview版ということで、JDK15以降ではまた形が変わるかもしれません。予めご了承ください。

# Recordsとは
下記です。
https://openjdk.java.net/jeps/359
データ保存用としてrecordが提供されるようになり、
これを付与したクラスは結果として変更不可能(immutable)なオブジェクトとなります。
具体的には下記のような形になります。

```java
record Point(int x, int y) { }
```

上記は結果として以下のクラスとなります。

```java
class Point extends Record {
  private final int x;
  private final int y;

  public Point(int x, int y) {
    this.x = x;
    this.y = y;
  }

  public int x() {
    return x;
  }
  public int y() {
    return y;
  }

  public int hashCode() { ... }
  public boolean equals() { ... }
  public String toString() { ... }
}
```
上記のように、コンストラクタ以外からフィールド変数にアクセスできず(immutable)、
`equals` `hashCode` `toString` のメソッドを実装したクラスが生成されます。

引数の値は、下記のようにチェック可能なようです。

```java
record Point(int x, int y) {
  public Range {
    // yにx未満の値のみ設定可能とする場合
    if (x > y) throw IllegalArgumentException();
    // 下記のように明示的に設定しなくても、値の設定をしてくれる。
    // this.x = x;
    // this.y = y;
  }
}

```

# 所感
まだPreview版なので今後どのようになるのかは不明ではありますが、
DTOで用いたり、 `Record` を用いることで直感的に理解可能になったりするのではと思いました。
名前付きtupleである、という表現が個人的に一番しっくりきました。
より深く知りたい方は、下記の記事が非常によくわかりやすかったです。
https://www.infoq.com/jp/articles/java-14-feature-spotlight/

Javaもどんどん進化していきますね・・・。ちゃんとキャッチアップしていきます。
読んでいただきありがとうございました！
Puppet3D使ってみた

[Unity アセット真夏のアドベントカレンダー 2020 Summer!](http://assetstore.info/eventandcontest/adventcalendar/summer-advent-calendar-2020/) の、6日目担当のニア(ニアルカちゃんねる)です!
よろしくお願いします!✧ヾ(❀╹◡╹)ﾉﾞ

本日ご紹介するのは、[Puppet3D - Asset Store](https://assetstore.unity.com/packages/tools/animation/puppet3d-111554?utm_source=twitter&utm_medium=social&utm_campaign=jp-advent-calendar-summer)です。リギングやスキニングをUnityの中で行えるアセットです。
![f9d38efe-c4f0-46f8-8201-8cd76742a78c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681503/f25e7c1e-2960-a0f7-a855-b2fbbe07b185.png)

#こんなシチュエーションでおすすめ!
・Boneの入っていないモデルを、ウェイト調整にあまり拘らず簡易的に揺らしたい
・ツール間の行き来をせずUnity内でリギング・スキニングを完結したい
・モデリングツールが手元に無い、モデラーが居ない

#やってみたこと
今回は、**VRM形式キャラクターモデルのスカートをUnity ClothからBone制御に変更する**というのをやりました。
[一部始終をYoutubeにアップしたのでご覧下さい!!](https://www.youtube.com/watch?v=HWlN9EQ-Cm0)(←Clickで動画へ)
![Puppet3d.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/681503/9e46351c-9907-d8cc-6810-2e3183ddbbd2.png)

#動画内容のおおまか手順


**〇準備**
Boneを入れたいスキンオブジェクトに以下コンポーネントがアタッチされている事を確認します
・Skined Mesh Renderer
・Mesh Filter
・Mesh Collider

※特にMesh Colliderが無いと意図した場所にBoneが生成されません...
私は動画収録時これで失敗しました!

**〇Boneを入れる**
Puppet3Dウィンドウを出して以下手順を繰り返します
1.スカート選択
2.Create Bone Tool
3.骨を入れたい箇所でマウスクリック
4.Finish Bone

**〇バインド**
生成したBone全てとメッシュを選択
->Puppet3DウィンドウのSkinningタブで「Skinning」をClosest Pointにする
->「Bind Smooth Skin」を押す


#おわりのあいさつ
株式会社スパイス バーチャル支社　研究開発室所属のニアルカちゃんねるの髪が赤い方です!
動画ネタの一つとしてUnityアセット使ってみたをもっとやっていきたいと思ってますｲｪｲL(‘ω’)┘三└(‘ω’)」ｲｪｲ

明日は [潮留](https://siodome0.fanbox.cc/)  さんの「Arbor3をおすすめしたい3つの理由」です!!
Linuxでコア電圧を読む

タイトルの通りのことをするのにCLI環境で楽に実行できる方法を調べたのでメモ

# 必要

- intel CPU Sandy Bridge 以降
    - intel以外のことは調べてないので不明
- msr-tools
    - apt-get とかでインストールできる
- msrドライバ
    - ```/dev/cpu/*/msr``` が存在しない場合は ```modprobe msr``` でロードする

# 読む

## 生値

```bash
sudo rdmsr 0x198 -u --bitfield 47:32
```

## 電圧[V]に変換

```bash
awk "BEGIN { print $(sudo rdmsr 0x198 -u --bitfield 47:32)/8192 }"
```

```bc``` でもいいけど、```awk``` のほうが確実にインストールされている気がする。

## 繰り返し読む

```bash
watch -n 1 'awk "BEGIN { print $(sudo rdmsr 0x198 -u --bitfield 47:32)/8192 }"'
```

# やってること

CPUのMSR (Model Specific Register) レジスタのアドレス0x198は ```MSR_PERF_STATUS``` という名前で、コア電圧がビット[47:32]に格納されている。これを```rdmsr```コマンドで読み出し、読み出しやすいように変換する。

取説によると、

> P-state core voltage can be computed by MSR_PERF_STATUS[37:32] * (float) 1/(2^13).

とのことなので、読みだした値を8192で割ってる。(↑[37:32]になってるけど多分誤植)

- 取説 : Intel 64 and IA-32 Architectures Software Developer’s Manual
    - https://software.intel.com/content/www/us/en/develop/download/intel-64-and-ia-32-architectures-software-developers-manual-volume-4-model-specific-registers.html

ただし、このレジスタの[47:32]ビットの定義があるのはSandy Bridgeのテーブル2-20だけで、他の世代については記載がない。取説によるとMSR_hogeは世代ごとに定義されるものなので、上書きされる可能性はある。現に、Core世代(core2duoとかの)では、ビット[46,44:40]はそれぞれ別の定義が存在する。

これについてSandy Bridge以降の世代のCPUで読んだ場合に値が保証されるのか調べたものの、解釈が割れておりよくわからなかった。ただし、上書き定義も無い。手持ちのKaby Lakeではそれっぽい値が読めてる。

もっと確実な方法があったら教えて下さい。
Google流 資料作成術まとめてみた！

[**Google流 資料作成術**](https://aax-us-east.amazon-adsystem.com/x/c/Ql4vbjlKNmNv9Ray40upz7IAAAFzg_nsnQEAAAFKASwvZwg/https://assoc-redirect.amazon.com/g/r/http://www.amazon.com/gp/product/1119002257?imprToken=Z539PtYGHGfouZy9DbANHA&slotNum=1&ie=UTF8&creativeASIN=1119002257&linkCode=xm2&tag=storytellingwithdata-20)を読んでGoogleSlidesにまとめてみました

コメントありの参加型スライドになっています！
気づいたことや感想など待ってます。修正箇所も指摘していただけると嬉しいです！
↓
↓
↓

# [**スライド**](https://docs.google.com/presentation/d/1lCPZa-91R0qKntaQO6zUzQ9dTTmbYuNZYug4Gwh90_o/edit?usp=sharing)

## こんな人にオススメ

- <font color="RoyalBlue">G</font><font color="Red">o</font><font color="Gold">o</font><font color="RoyalBlue">g</font><font color="ForestGreen">l</font><font color="Red">e</font> ってなんかおしゃれだよねって思う方
- 元Google社員がデータを分析するときの思考回路を知りたい方
- データを使っても相手を上手く説得できない方
- データを使って相手のアクションにつながるようなプレゼンをしたい方
- Excelを使って以下のような美しいグラフを描きたい方

<img width="571" alt="スクリーンショット 2020-07-27 15.41.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429781/f944b8ef-acc9-2d33-c3f3-6a9dc1b6a51a.png">


## 感想

元Google社員のデータ可視化テクニックだけじゃなく、その方の思考回路も垣間みえて、本当に面白かったです。
【AWS】【CircleCI】【Terraform】【Rails】CircleCIでECSに自動デプロイをする時にハマったとこ

# 状況

```yml:config.yml
version: 2.1 
orbs:
  aws-ecr: circleci/aws-ecr@6.11.0
  aws-ecs: circleci/aws-ecs@1.2.0
```

Orbsを使用してデプロイを実行しようとすると以下のエラーが発生

`An error occurred (ClientException) when calling the DescribeTaskDefinition operation: Unable to describe task definition.`
![スクリーンショット 2020-07-27 15.36.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/630802/5ceedb7c-463e-5058-30b6-de9465a6fddd.png)

# エラー内容と対処

調べると、`aws ecs describe-task-definition`コマンドを叩いて、うまくいかなかった時のエラーであるとわかる

circleciのlogから、awsコマンドを叩いてる部分を探すと以下の記述に出会う

```terminal:circleci
PREVIOUS_TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition ${MY_APP_PREFIX}-service --include TAGS)
```

注意するのは、引っ張りたいタスク定義の`familyの末尾は-service`である必要があるということ

なので、Terraformでは

```terraform:task_definition.tf
resource "aws_ecs_task_definition" "manabi-app" {
  family = "app名" #これをapp名-serviceに変更
  container_definitions = file("./container_definitions/service.json")
  task_role_arn = data.terraform_remote_state.iam.outputs.ecs_task_role_arn
  execution_role_arn = data.terraform_remote_state.iam.outputs.ecs_task_role_arn
  network_mode = "bridge"
}
```

うまくデプロイできた！
VMware vSphere上のRancherにstorage classを割り当ててDynamicにPVを作ってもらう

[前回記事](https://qiita.com/yo_C_ta/items/27751293959aaf35808d)で、Proxy下にあるVMware vSphere上にRancherを入れて、Harborを構築する検証をしました。
構築することはできたのですが、しばらくしてからアクセスするとProjectにimageのリストはあるのにPullできない状態になっていました。
Persisitent Volume（永続ボリューム？）なしで立ち上げたので、その後何度かPodが再作成され、image本体が失われてしまったのだとわかりました。

そこで、検証の一環としてRancherにstorage classを設定して、動的なPVC/PV払い出しを行いました。

## Cluster への設定 :tools: 

vSphere上でRancherに動的PVを作成させるためには、Clusterへの設定が必要になります。
Cluster作成時に、`Edit as YAML` をクリックして `rancher_kubernetes_engine_config:` 下に下記のような設定を追記します。

```yaml
cloud_provider:
  name: vsphere
  vsphereCloudProvider:
    global:
      insecure-flag: true       # 今回の検証環境ではオレオレ証明書を使用しているので有効に
    virtual_center:
      vc.example.com:           # vCenter URL
        user: provisioner       # vCenter へのアクセスユーザ
        password: secret        # パスワード
        port: 443
        datacenters: /eu-west-1 # 使用するdatacenterのパス
    workspace:
      server: vc.example.com                       # vCenter URL 上記と異なるパターンは試してません
      folder: /eu-west-1/folder/myvmfolder         # dummy vm が作成されるディレクトリ
      default-datastore: /eu-west-1/datastore/ds-1 # storage classで指定しなかった場合に使用されるdatastore
      datacenter: /eu-west-1                       # 使用するdatacenterのパス 上記と異なるパターンは試してません
      resourcepool-path: /eu-west-1/host/hn1/resources/myresourcepool # リソースプールを使用したい場合（今回は使用せず）
```

Clusterを作成し、Provisioningが完了するのを待ちます :relaxed:

各種設定については :point_down: を参照ください。
[vSphere Configuration Reference](https://rancher.com/docs/rke/latest/en/config-options/cloud-providers/vsphere/config-reference/)

## Storage Classの作成 :floppy_disk:

Cluster作成が完了したら、Rancher の `Storage` -> `Storage Classes` から作成します。
名前だけ設定して、他パラメータはデフォでOKでした。
上記で設定した`default-datastore`を使用しないのであれば、ここのDatastoreで設定するものと思います（実施はしていません）。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221423/33c3e8aa-756a-3cb4-5fea-82ef65198f0c.png)

## アプリのデプロイ :muscle: 

アプリカタログからアプリをデプロイします。
この時、Rancherに登録されているカタログであればGUIから、自前で追加したのカタログであればYAMLをEditして、上記で作成したstorage classを選択してデプロイします。

デプロイしてPVが作成されると、Cluster作成時に指定した`default-datastore`もしくは、`Storage Class`を作成した時の`Datastore`で指定したストレージに、`kubevols`というディレクトリが作成されます。
そして、そこにデータが格納されることがvSphere上から確認できます。

### HarborのPV

というわけで、Harborのマニフェストを修正して

```yaml
persistence:
  enabled: true
  persistentVolumeClaim: 
    registry: 
      storageClass: "vsphere-volume"
      size: "5Gi"
    jobservice: 
      storageClass: "vsphere-volume"
      size: "1Gi"
    database: 
      storageClass: "vsphere-volume"
      size: "5Gi"
    redis: 
      storageClass: "vsphere-volume"
      size: "5Gi"
```

無事にPV付きでデプロイされたのでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221423/97668e43-d605-d0ba-baf2-42ade2536579.png)

お　し　ま　い :innocent:
私はこうしてC言語を覚えた(C言語を勉強する人に)

前回C言語のポインタ(基礎編)についての記事をまとめました。
それの番外編記事としてその昔、右も左もC言語のことがわからなかった私が、どのようにC言語を勉強してある程度業務で使えるようになったかをまとめようと思います。
※当時の私はC言語以外の言語は少しは触ったことがあったのでプログラムとはなんぞ？などの基本的ことは抑えている前提の書き方になります。

#C言語部屋に入門する前に
C言語をバリバリ使う部署に配属された当時私はC言語の存在は知っていても内容がどのようなものかわかっていませんでした。
プログラムの中身をみても他の言語ではみない書き方・鬼門と言われるポインターなど恐怖でしかありません。
現場の先輩に泣きついてC言語のイロハを学ぶことになりました。
まず先輩から指示された内容は以下のようなものです。
###C言語を学習したいなら２つの書籍を買いなさい
 - これから一生使えるような逆引きのC言語辞典を買いなさい  
　　当時私が買った書籍：[C/C++ 辞典 第3版](https://www.amazon.co.jp/%E8%BE%9E%E5%85%B8-%E7%AC%AC3%E7%89%88-DESKTOP-REFERENCE/dp/4798112011)
 - 初心者学習用の入門書を買いなさい  
　　当時私が買った書籍：[猫でもわかるC言語プログラミング 第3版](https://www.amazon.co.jp/%E7%8C%AB%E3%81%A7%E3%82%82%E3%82%8F%E3%81%8B%E3%82%8BC%E8%A8%80%E8%AA%9E%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E7%AC%AC3%E7%89%88-%E7%8C%AB%E3%81%A7%E3%82%82%E3%82%8F%E3%81%8B%E3%82%8B%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E7%B2%82%E4%BA%95-%E5%BA%B7%E5%AD%9D/dp/4797372788)

入門書と逆引きを両方買うのはかなり効果的です。
入門書で勉強しながらも、標準関数などの仕様を詳しく調べることもできますし、何よりも今後業務に関わっている限りは逆引き書は必須となります。

#C言語部屋に入門直後
上記の書籍を買ってからすぐは書籍をみることよりも以下の課題に注力するように指示を受けました

###C言語の入門書を開く前に覚えることがある
 - まずはC言語の変数の型の種類と各変数の型のサイズを覚えなさい    
 　　→ここは今だからこそ大事なことだとわかりますが当時はあまり理解できていませんでした  
　　　C言語はポインタを使用してアドレスの値を直接書き換える関係上、型のサイズを覚えることは必須です  
 　　(覚えないとメモリ破壊している原因にたどり着けない)
 - 構造体を宣言した際のサイズも理解しなさい  
　　→ここも変数のサイズ同様の理由でC言語ではかなり重要です
 - アスキーコードを理解しなさい  
   →C言語をやったことがない人はあまり知らないかもしれない(一般的に知ってたらごめんなさい)ですがcharなどの中身には直接abcdなどの文字が入っているわけではなく、アスキーコードなどの文字コードが格納されています。

#C言語部屋での生活
###変数を理解したら入門書+αだ！
ここからは入門書+αを進めてみます。
ただし、入門書はあくまでサブ課題で自分で進めるように指示を受けます
メインの課題は以下でした。

- 逆引き書にある標準関数のうち```str```,```mem```がつく関数を自分で作ってみなさい
    - 作るときは１つの案ではなく２つ以上の案を出すこと
    - 納期を決めて作ること
    - 実装を始める前にまずはコメントで処理を書いてみること

かなり実践を意識して指示を出したのだと思います。
当時の親方は現場を教え込ませるために上記の条件をつけたのだと思います。

#C言語部屋の卒業試験はやっぱり
卒業間近になるとポインターについてみっちり学習が始まります
例えば以下のような内容でした

 - ポインタ変数の中身に入っているアドレスをインクリメントした場合のアドレス値はいくつになる？
 - 配列を使用した場合のアドレス操作は？
 - 関数ポインタを理解しなさい

上記はまず卓上で値を計算し、その後実際にプログラムを動かして正解かを確認するなどを反復しました。
そのようなことを繰り返していると自然とポインタについては理解できるようになってきました。

#最後に
C言語は他の言語に比べてはっきり言って泥臭い処理が多いです。
その分基礎を知っていないとバグやメモリ破壊などが起きた場合のデバックがかなり困難な言語になっているため
挑戦する際はコピペ実装を行うことはあまり考えずに、自分のロジックや知識を生かせるようにしっかりと基礎を固めることが大事だと思います。
【CircleCI】【Terraform】【Rails】【AWS】Orbsを利用してECSでdb:migrateする方法

# 概要

開発環境でなんらかの機能を追加した際に、本番環境へのデプロイと同時にdb:migrateしたい場合、CircleCIのOrbsを使うと楽に実装可能

# 前提

Terraformやコンソールからすでにサービスをデプロイしていること

# migrationの実行

今回はTerraformから、マイグレーション用のタスクを準備した

```Terraform:task_definition.tf
resource "aws_ecs_task_definition" "rails-migration" {
  family = "rails-migration"
  container_definitions = file("./container_definitions/migration.json") # jsonfileはサービスで使用しているタスクのcommandを"ash", "-c", "bundle exec rails db:create db:migrate"に変更 logを出力している場合はprefixをmigrationとかに変更してやるとあとで楽
  task_role_arn = data.terraform_remote_state.iam.outputs.ecs_task_role_arn
  execution_role_arn = data.terraform_remote_state.iam.outputs.ecs_task_role_arn
  network_mode = "bridge"
}
```

CircleCIでデプロイ時にマイグレーションする用に設定する

```yml:.circleci/config.yml
version: 2.1 
orbs:
  aws-ecr: circleci/aws-ecr@6.11.0
  aws-ecs: circleci/aws-ecs@1.2.0
workflows:
  rails_build_and_deploy_and_migration:
    jobs:
      # イメージのビルドとプッシュ
      - aws-ecr/build-and-push-image:
          account-url: AWS_ECR_ACCOUNT_URL
          extra-build-args: "--build-arg RAILS_MASTER_KEY=${RAILS_MASTER_KEY}"
          region: AWS_REGION
          repo: 'app-image' 
          tag: '${CIRCLE_SHA1}'
          filters:
            branches:
              only:
                - master
      # デプロイ(サービスのアップデート)
      - aws-ecs/deploy-service-update:
          requires:
            - aws-ecr/build-and-push-image 
          family: '${MY_APP_PREFIX}-service'
          cluster-name: '${MY_APP_PREFIX}-cluster'
          container-image-name-updates: 'container=rails, tag=${CIRCLE_SHA1}'
      # ここからマイグレーションの実行
      - aws-ecs/run-task:
          cluster: '${MY_APP_PREFIX}-cluster'
          task-definition: rails-migration # マイグレーション用に定義したタスクの名前
          awsvpc: false # 環境に合わせて
          launch-type: EC2 # 環境に合わせて
          requires:
            - aws-ecs/deploy-service-update
```

`Orbs`を使用すると簡単に実装できる
HTML,CSSにてブラウザでマンダラートを表示する際のフロントコーディングメモ

# やりたいこと

* ブラウザでマンダラートを表示させたい。


# 実装

### PHP

```php

<?php
    $item = [];
    $item[] = 'Fruit';
    $item[] = 'apple';
    $item[] = 'banana';
    $item[] = 'orange';
    $item[] = 'lemon';
    $item[] = 'strawberry';
    $item[] = 'melon';
    $item[] = 'grape';
    $item[] = 'cherry';
    $item[] = 'peach';
?>
```


### HTML


```html
<div class="mandal">
    <div class="box cell"><center class="cell-inner"><?=$item[1]?></center></div>
    <div class="box cell"><center class="cell-inner"><?=$item[2]?></center></div>
    <div class="box cell"><center class="cell-inner"><?=$item[3]?></center></div>
    <div class="box cell"><center class="cell-inner"><?=$item[4]?></center></div>
    <div class="box cell-center"><center class="cell-inner"><?=$item[0]?></center></div>
    <div class="box cell"><center class="cell-inner" ><?=$item[5]?></center></div>
    <div class="box cell"><center class="cell-inner"><?=$item[6]?></center></div>
    <div class="box cell"><center class="cell-inner"><?=$item[7]?></center></div>
    <div class="box cell"><center class="cell-inner"><?=$item[8]?></center></div>
    <div class="clear"></div>
</div>

```


### CSS

```css
    div.mandal {
        width: 608px;
        height: 608px;
        border: 2px solid #999;
        padding-top: 2px;
        padding-left: 2px;
    }
    div.box:hover {
        background-color: white;
    }
    div.box {
        float: left;
        text-align: center;
        width: 200px;
        height: 200px;
        border: 1px solid #999;
    }
    div.cell-center {
        display:table;
        background-color: #fff;
    }
    div.cell {
        display:table;
        background-color: #efefef;
    }
    center.cell-inner {
        display:table-cell;
        vertical-align: middle;
    }
    div.clear {
        clear: both;
    }
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/35b63d2c-4daf-6d8c-401b-df609345c2f8.png)
枠など全て消して、背景が透明なグラフを作成

#枠など全て消して、背景が透明なグラフを作成
PowerPointとかで、グラフを張り付けるとき枠とか軸が要らない時、
色々表示しないように設定が必要。忘れそうなのでメモ。

波形をグラフ化して、PNGファイルで保存する。
透明部分が結構広いのが玉の傷。個々も削れるのだろうか。

```python
import soundfile as sf
import matplotlib.pyplot as plt

# 波形読み込み
a1,fs=sf.read("a1.wav")
b1,fs=sf.read("b1.wav")
c1,fs=sf.read("c1.wav")
n1,fs=sf.read("n1.wav")

settings = [
    """
    (a1, "g_a1.png", "#808080"),
    (b1, "g_b1.png", "#4d4d4d"),
    (c1, "g_c1.png", "#b2b2b2"),
    (n1, "g_n1.png", "#dddddd"),
    """

    (a1, "c_a1.png", "#FBBF9C"),
    (b1, "c_b1.png", "#ff9999"),
    (c1, "c_c1.png", "#B8B400"),
    (n1, "c_n1.png", "darkgrey"),
]

for value, name, color in settings:
    fig, ax = plt.subplots()
    fig.patch.set_alpha(0)
    ax.patch.set_alpha(0)
    ax.plot(value, c=color)
    plt.ylim(-0.8, 0.8)
    plt.tick_params(labelbottom=False, labelleft=False, labelright=False, labeltop=False, bottom=False, left=False, right=False, top=False)
    plt.gca().spines['right'].set_visible(False)
    plt.gca().spines['top'].set_visible(False)
    plt.gca().spines['left'].set_visible(False)
    plt.gca().spines['bottom'].set_visible(False)
    fig.savefig(name, transparent=True)
```
delete文を打った後sqlplusから一度抜けてしまった場合

DBサーバにtelatermで接続し、
sqlplus アカウント/パスワード
でsqlplusに接続しました。

その後不要なデータを削除するため、
delete文を打ったのですが、
一部誤りがあり、rollbackしようと思ったのですが、
sqlplusから一度抜けてしまいました。

再度、sqlplusに入りなおし、rollbackを行ったのですが、
データは戻りませんでした。
一度抜けてしまった場合、rollbackは効かないものなのでしょうか。
【GCP】課金対象国からのアクセスを遮断する

# はじめに
ファイアウォール機能で中国、オーストラリアからの通信を遮断するシェルスクリプトです。
対象のIPアドレスはこちら（[中国](https://ipv4.fetus.jp/cn.txt)、[オーストラリア](https://ipv4.fetus.jp/au.txt)）から取得しました。
それぞれ5000ずつあります。

# 実行環境
以下の環境で動作確認しました。

- Linux
- bash
- gcloud
- Python3.8.2

# FWルールの作成
FWルール1つあたりのIPアドレスが256個までに制限されているので、256個ずつルールを作成しています。
タグは国単位で付けました。
ブロックリストを変えると他のルールの作成が可能です。

```firewall.sh
#!/bin/bash

# ソースIP範囲の最大数
MAX_RANGES=255
# ブロックリスト[連想配列]
#   key   : ファイアウォールのタグ名
#   value : ブロックしたいIPアドレスの一覧取得URL
declare -A BLOCK_LIST=(
        ["block-china"]="https://ipv4.fetus.jp/cn.txt"
        ["block-australia"]="https://ipv4.fetus.jp/au.txt"
)

# FireWallルール作成
create_firewall_rules() {
    local rules_no=`printf %03d ${1}`
    local rules_name=${2}
    local ip_ranges=${3}

    gcloud compute firewall-rules create ${rules_name}${rules_no} \
    --direction=ingress --priority=100 --action=deny --rules tcp \
    --source-ranges=${ip_ranges} --target-tags ${rules_name}
}

main() {
  for rules_name in "${!BLOCK_LIST[@]}"; do
    local URL=${BLOCK_LIST[${rules_name}]}
    local input_file=`basename ${URL%\?*}`
    wget ${URL} -O ${input_file}

    # ソースIP範囲
    local ip_ranges=
    # FWルール名の連番
    local rules_no=0
    # ルール数カウンター
    local line_count=0
    while read line; do
      line_count=`expr ${line_count} + 1`
      
      # IPアドレスをカンマ区切りで連結する
      if [ -z ${ip_ranges} ]; then
        local comma=
      else
        local comma=,
      fi
      ip_ranges=${ip_ranges}${comma}${line}

      # 1ルールの最大IPアドレス数になったら
      if [ ${line_count} -gt ${MAX_RANGES} ]; then
        rules_no=`expr ${rules_no} + 1`
        create_firewall_rules ${rules_no} ${rules_name} ${ip_ranges}

        # 初期化
        ip_ranges=
        line_count=0
      fi
      
    done << END
    `grep -v '^\s*#' ${input_file} | grep -v '^\s*$'`
END

    rules_no=`expr ${rules_no} + 1`
    create_firewall_rules ${rules_no} ${rules_name} ${ip_ranges}
  done

}

main
```

実行ログ

```bash
bash-5.0# ./firewall.sh 
Connecting to ipv4.fetus.jp (172.67.130.105:443)
saving to 'au.txt'
au.txt               100% |********************************| 89239  0:00:00 ETA
'au.txt' saved
Creating firewall...
..Created [https://www.googleapis.com/compute/v1/projects/home-283704/global/firewalls/block-australia001].
done.
NAME                NETWORK  DIRECTION  PRIORITY  ALLOW  DENY  DISABLED
block-australia001  default  INGRESS    100              tcp   False
Creating firewall...
..Created [https://www.googleapis.com/compute/v1/projects/home-283704/global/firewalls/block-australia002].
done.
NAME                NETWORK  DIRECTION  PRIORITY  ALLOW  DENY  DISABLED
block-australia002  default  INGRESS    100              tcp   False
Creating firewall...
..Created [https://www.googleapis.com/compute/v1/projects/home-283704/global/firewalls/block-australia003].
done.
〜（省略）〜
```

Search Consoleでファイアウォールの設定を見るとこんな感じでルールが作られます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463308/b3a82b28-d086-cb79-14a2-4db335edc660.png)

# FWルールを適用する
最後にGCEインスタンスのネットワークタグに作成したタグを指定して保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/463308/23346927-312e-a521-12df-5d90fdfa7590.png)
【備忘録】git mergeでconflictが発生した場合の対処

#発生したマージコンフリクト
branchをmasterにチェックアウトしてブランチでの変更をmergeしようとした時にコンフリクトが発生。
初めてのことだったので記録しておくことにしました。
ブランチ作業を終えてmasterブランチにマージしようとしたところ、

```terminal
$ git merge finalpage
・
・
CONFLICT (content): Merge conflict in config/routes.rb
・
・
Automatic merge failed; fix conflicts and then commit the result.
```

と、怒られてしまいました。googleで調べてみると、コードの内容に競合が発生した時に起こるとのことらしいですね。git status で確認すると、

```
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:   routes.rb

no changes added to commit (use "git add" and/or "git commit -a")
```

と、なりました。すなわち別々のブランチで修正されていてどっちかにしないとおかしいよ、ってことですね。私の場合、masterブランチの内容とfinalpageブランチ両方で内容の変更が発生しており、双方が両立しないためコンフリクトが発生したのでは、と考えています。

vscodeでコードを確認すると、

```routes.rb
  get 'sessions/new'
<<<<<<< HEAD

  resources :users do
    member do
      get '/password_reset', to: 'password_resets#new'
      post '/password_reset', to: 'password_resets#create'
    end
  end
=======
  resources :users
>>>>>>> finalpage

```

となっていました。
<<< HEAD === >>>　finalpage
で囲まれている内容をlocalで修正しなければならないということなので、

<<<　HEAD ===　に囲まれた内容にしたいため、
=== >>> finalpage で囲まれている内容は手動で削除し、
git add routes.rbを実行して、git statusでコミット内容を確認すると、

```
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

        modified:   routes.rb
```
に変わりました。コンフリクトは直せているからcommitしてマージを完了してね、ってことらしいので、あとはコミットしてマージも完了し、解決できました。

#参考文献
https://yu8mada.com/2018/06/13/how-to-resolve-a-merge-conflict-in-git/
こちらの執筆者様が非常に分かりやすく解説されていてとても助かりました！
Node.js: CouchDB のデータを削除 (Delete)

```js:couch_delete.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	couch_delete.js
//
//					Jul/27/2020
// ---------------------------------------------------------------
var Client = require('node-rest-client').Client
// ---------------------------------------------------------------
console.error("*** 開始 ***")

const key_in=process.argv[2]

console.log (key_in)

const url = "http://localhost:5984/nagano/" + key_in

var client = new Client()
client.get(url, function(data, response) {
	console.log (data)
	console.log (data._rev)

	const url_del = url + '?rev=' + data._rev
	client.delete(url_del, function(data, response) {
		console.log (data)
		console.error("*** 終了 ***")
		})
	})

// ---------------------------------------------------------------
```

実行

```bash
export NODE_PATH=/usr/lib/node_modules
./couch_delete.js t2029
```
[一発ネタ] Golang で GoTo キャンペーン [クソコード]

みなさんこんにちは！　最近旅してますか？
私は天気が悪いわコロナで騒がしいわで旅できてません！

なんかイライラしてきたので今回はプログラムの中だけでも旅をしましょう。
**というわけで、モダンな言語なのになんでか知らんがgoto文のあるGo言語でGotoキャンペーンをキメたいと思います！**

次のプログラムが最終的に出力する文字列を、実行せずに処理を追って当ててみましょう！

## プログラム本文

```Go
package main

import "fmt"

func main() {
	fmt.Print("Go to ")

	var money int = 10000
	var toWhere string
	var a int

	goto TROUBLE
	goto TRAVEL

	NIGATA:
		if money == 31000 {
			toWhere = "fukuoka"
			goto FUKUSHIMA
		} else {
			toWhere += "tou"
			goto YOKOHAMA
		}
		return

	TRAVEL:
		fmt.Println("travel")
		return

	YOKOHAMA:
		fmt.Println(toWhere)
		return

	TROUBLE:
		a = 3

		if a % 2 == 1{
			goto KYOTO
		} else {
			goto TOKYO
		}
		return

	FUKUSHIMA:
		fmt.Println(toWhere)
		return

	TOCHIGI:
		toWhere = "ret"

	SAITAMA:
		money += 3000

	HOKKAIDO:
		if money > 30000{
			goto NIGATA
		} else if money > 20000{
			goto CHIBA
		} else if money < 20000 {
			goto SAITAMA
		} else if money <= 12000{
			goto GUNMA
		}
		fmt.Println("hokkaido")
		return

	GUNMA:
		fmt.Println("gunma")

	TOKYO:
		fmt.Println("tokyo")
		return

	CHIBA:
		money = 29000
		goto TOCHIGI
		return

	FUKUOKA:
		fmt.Println("fukuoka")
		return

	KYOTO:
		toWhere = "kyoto"

		for _, char := range toWhere {
			if char == 'y' {
				money += 5000
				goto HOKKAIDO
			}

			if char == 't' {
				money += 2000
				goto FUKUOKA
			}
		}

		fmt.Println(toWhere)

		return


}
```

## おわりに
いかがでしたか？　クソコードすぎて Go to hell するところでしたね。
実際の現場でこんなコードを書いたら Go to hell してもらいます。
このクソコードを素早く読めた人は高いクソコード適性があるので、自慢がてら**コメント欄にて回答をコメントしてね！**
Node.js: CouchDB のデータを更新 (Update)

```js:couch_update.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	couch_update.js
//
//					Jul/27/2020
// ---------------------------------------------------------------
var Client = require('node-rest-client').Client
// ---------------------------------------------------------------
function get_current_date_proc()
{
	const today = new Date ()
	var ddx = (1900 + today.getYear ()) + "-" + (today.getMonth () +1)
	ddx += "-" + today.getDate ()

	return ddx
}

// ---------------------------------------------------------------
console.error("*** 開始 ***")

const key_in=process.argv[2]
const population_in=process.argv[3]

console.log(key_in)
console.log(population_in)

const url = "http://localhost:5984/nagano/" + key_in

var client = new Client()
client.get(url, function(data, response) {
	console.log(data)
	console.log(data._rev)
	console.log(data.name)

	const date_mod = get_current_date_proc()
	console.log(date_mod)

	var unit_aa = new Object ()
	unit_aa["population"] = population_in
	unit_aa["name"] = data.name
	unit_aa["date_mod"] = date_mod
	const json_str = JSON.stringify (unit_aa)
	console.log(json_str)

	const url_put = url + '?rev=' + data._rev

	var args = {
		data: json_str,
		headers: { "Content-Type": "application/json" }
		}

	client.put(url_put, args, function(data, response) {
		console.log(data)
		console.error("*** 終了 ***")
		})

	})

// ---------------------------------------------------------------
```

実行

```bash
export NODE_PATH=/usr/lib/node_modules
./couch_update.js t2023 9345100
```
Node.js: CouchDB のデータを読む (Read)

```js:couch_read.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	couch_read.js
//
//					Jul/27/2020
// ---------------------------------------------------------------
var Client = require('node-rest-client').Client

// ---------------------------------------------------------------
console.error("*** 開始 ***")

var client = new Client()

const url = "http://localhost:5984/nagano/_all_docs?include_docs=true"

client.get(url, function(data, response) {

	data.rows.forEach (function(row)
		{
		var out_str = row.id + "\t"
		out_str += row.doc.name + "\t"
		out_str += row.doc.population + "\t"
		out_str += row.doc.date_mod;
		console.log (out_str)
		})

	console.error("*** 終了 ***")
})

// ---------------------------------------------------------------
```

実行

```bash
export NODE_PATH=/usr/lib/node_modules
./couch_read.js
```
Node.js: CouchDB のデータを作成 (Create)

```js:couch_create.js
#! /usr/bin/node
// ---------------------------------------------------------------
//	couch_create.js
//
//					Jul/27/2020
//
// ---------------------------------------------------------------
var Client = require('node-rest-client').Client
// ---------------------------------------------------------------
console.error ("*** 開始 ***")
//
const url_collection = 'http://localhost:5984/nagano'

var client = new Client()

client.delete(url_collection, function(data, response) {

	console.log(data)

	client.put(url_collection, function(data, response) {
		console.log(data,url_collection)
		create_proc (client,url_collection)
		console.error ("*** 終了 ***")
		})
	})


//		create_proc (db)

// ---------------------------------------------------------------
// [4]:
function create_proc (client,url_collection)
{
	var dict_aa = data_prepare_proc ()

	for (var key in dict_aa)
		{
		const url_put = url_collection + "/" + key

		const json_str = JSON.stringify(dict_aa[key])

		var args = {
			data: json_str,
			headers: { "Content-Type": "application/json" }
			}

		client.put(url_put, args, function(data, response) {

			console.log(data)
			})

	}
}

// ---------------------------------------------------------------
function data_prepare_proc ()
{
	var dict_aa = new Object ()

	dict_aa = dict_append_proc (dict_aa,'t2021','長野',52136,'1950-6-18')
	dict_aa = dict_append_proc (dict_aa,'t2022','松本',71928,'1950-3-15')
	dict_aa = dict_append_proc (dict_aa,'t2023','上田',63241,'1950-10-2')
	dict_aa = dict_append_proc (dict_aa,'t2024','小諸',38724,'1950-6-22')
	dict_aa = dict_append_proc (dict_aa,'t2025','岡谷',49357,'1950-8-14')
	dict_aa = dict_append_proc (dict_aa,'t2026','塩尻',67283,'1950-9-12')
	dict_aa = dict_append_proc (dict_aa,'t2027','茅野',36251,'1950-3-21')
	dict_aa = dict_append_proc (dict_aa,'t2028','飯田',54623,'1950-7-26')
	dict_aa = dict_append_proc (dict_aa,'t2029','中野',21847,'1950-10-2')
	dict_aa = dict_append_proc (dict_aa,'t2030','諏訪',48392,'1950-12-20')
	dict_aa = dict_append_proc (dict_aa,'t2031','駒ヶ根',51875,'1950-2-7')
	dict_aa = dict_append_proc (dict_aa,'t2032','佐久',69234,'1950-5-17')
	dict_aa = dict_append_proc (dict_aa,'t2033','伊那',31897,'1950-6-19')
	dict_aa = dict_append_proc (dict_aa,'t2034','千曲',51768,'1950-3-24')

	return	dict_aa
}	

// ---------------------------------------------------------------
function dict_append_proc(dict_aa,id_in,name_in,population_in,date_mod_in)
{
	unit_aa = {}
	unit_aa['name'] = name_in
	unit_aa['population'] = population_in
	unit_aa['date_mod'] = date_mod_in

	dict_aa[id_in] = unit_aa

	return	dict_aa
}

// ---------------------------------------------------------------
```

実行

```bash
export NODE_PATH=/usr/lib/node_modules
./couch_create.js
```
【Python初心者】classの使い方とは？5stepsで理解しよう！（メソッドとインスタンス）

今回目指すアウトプット
------------------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616412/37fdd220-eb23-4878-0f2b-b675d44c1a5f.png)


結論
------------------
・クラス
・メソッド
・インスタンス
の3つを定義する。

```Python:結論
class クラス名():        #クラス名をつける
    def メソッド名(self): #メソッド名をつける
        実行したい処理    #実行したい処理
インスタンス名 = クラス名() #インスタンス名をつける

インスタンス名.メソッド名() #呼び出す
```



各論
--------------------


classの定義(step1)
--------------
```Python:step1
class クラス名(): # <--- これをまず覚える
```
↓
classの使い方(step2)
--------------
```Python:step2
class クラス名(): 
    実行したい処理 # <--- ここに処理をかく
```
classを使うためには、インスタンス化する必要がある。
これにより、classを呼び出すことができる。
（実行したい処理に関しては、「メソッドの定義」で説明する）

↓
インスタンス化(step3)
--------------
```Python:step3
      class クラス名(): 
          実行したい処理 
      インスタンス名 = クラス名()   # <--- インスタンス化して呼び出せるようにする
```
実行したい処理には、「メソッド」を使用することができる。

↓
メソッドの定義(step4)
----------
```Python:step4
      class クラス名(): 
          def メソッド名(self): #メソッドの定義（実行したい処理を関数化）
      インスタンス名 = クラス名()
```

メソッド名(self)の()の中には、必ず1つ以上の引数を渡す。その際、最初の引数はselfにする。

classの呼び出し方(step5)
------------
```Python:step5
       インスタンス名.メソッド名()# <--- これで呼び出す
```

結論
--------------

```Python:結論
class クラス名():        #クラス名
    def メソッド名(self): #メソッド名
        実行したい処理    #実行したい処理
インスタンス名 = クラス名() #インスタンス名

インスタンス名.メソッド名() #呼び出す
```

具体例
--------------

```Python:例1

class message():        #クラス名=message
    def hello(self):    #メソッド名=hello
        print("Hello!") #実行したい処理=「Hello!」を出力
mess = message()        #インスタンス名=mess

mess.hello() #呼び出す

```


出力として「"Hello!"」が得られる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/616412/2ddc3c01-bafa-f18c-7e59-6f93fd67c3a2.png)

```Python:例2
class MyPetInfo:    # <--- mypetinfoというclassを作成
    family = '犬'   # <---ここから下は関数
    def say(self):
        print('ワン')
    def growl(self):
        print('ウー')

mypet_info = MyPetInfo()   # <---インスタンス化して呼び出せるようにする

mypet_info.family          # 表示されず
print(mypet_info.family) # 犬

mypet_info.say()  # ワン
mypet_info.growl()# ウー

```

これができたら、次は_init_を理解しよう。


＜追記＞
"守るべき命名規約(PEP8)"


| 対象              |ルール                                  | 例                   |
|:----------------:|:--------------------------------------:|:--------------------:|
| クラス          | 最初大文字 + 大文字区切り| MyFavoriteClass     |
| メソッド       | 全小文字 + アンダースコア区切り| my_favorite_method  |
| 関数           | 全小文字 + アンダースコア区切り| my_favorite_funcion |
| インスタンス変数  | 全小文字 + アンダースコア区切り| my_favorite_instance|
| 定数           | 全大文字 + アンダースコア区切り| MY_FAVORITE_CONSTATA  |


[PEP8](https://pep8-ja.readthedocs.io/ja/latest/#id29)より抜粋しました。
cgitbのHTML出力前にContent-Typeを送信する

# 環境
* python2.7
* Apache2.4

## 問題点
`cgitb`ではHTMLの一行目に`<!--: spam`が出力されるため、`Content-Type`を送信していないとApache側でエラーが発生してしまう。
> AH02429: Response header name '<!--' contains invalid characters, aborting request

## 方法
`cgitb`のHTML出力前に`Content-type`を出力する。

```python
from __future__ import absolute_import, print_function, unicode_literals

import sys
import cgitb

def my_except_hook(exctype, value, traceback):
    print('Content-Type: text/html')
    print('')
    hook = cgitb.Hook()
    hook(exctype, value, traceback)
    sys.__excepthook__(exctype, value, traceback)

sys.excepthook = my_except_hook
```
今更ながらC言語のポインタについてまとめてみる(基本編)

最近Go言語でもポインタを使用していることがわかったので応用できるかはわからないが
以前使用していたC言語でのポインタについてまとめてみる。

#そもそもポインタとは
変数のメモリアドレスを格納している変数のことです。
変数や関数はメモリ上に格納されており、その場所がどこなのかを示す情報を持っている変数がポインタ変数となります。

○ 例:変数宣言をした場合のアドレスと値の関係

```
/* 変数宣言 */
int A;
/* ポインタ変数の宣言 */
int* pA;
/* 変数に値を代入 */
A = 10;
/* ポインタにAのアドレスを格納 */
pA = &A;
```
上記の内容だと以下のような形で値がメモリ上に格納されています。
![スクリーンショット 2020-07-27 14.15.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/33eb56ae-c9f7-c717-bbee-b513483bc87d.png)
上記図の場合は変数に値を格納した段階で```0xXXXX4~0xXXXX7```に'10'が格納されています(ここで複数のアドレスが確保されていることについては後続で解説します)
例ではポインタ変数'''pA'''に'''A'''のアドレスを代入していますので'''pA'''には```0xXXXX4```が入ります
※ちなみに4アドレス分確保されているのはint型のサイズが4byteのためです
　変数の型サイズについてはポインタを覚える上では必ず通る道ですので後続の記事(注意点編)にて詳しく説明していきます。

#ポインタの基本的な使い方
ポインタを使用することでメモリの番地を確認することができ、また番地先の値の操作を行うことができます。

○ポインタの各操作方法

```
/* 変数のアドレスを取得 */
/* &を変数の先頭につけると対象変数のアドレスを取得することができます */
/* 以下の場合だとポインタ変数pAにアドレスを代入 */
pA = &A;
/* ポインタ先(アドレス先)にアクセスする */
/* *を変数の先頭につけると変数に格納されたアドレス先にアクセスすることができます */
/* 以下の場合だとポインタ変数pAに格納されたアドレス先の値を20に書き換えています */
*pA = 20;
```
上記を図にすると以下のような形です
![スクリーンショット 2020-07-27 14.31.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563324/1fa1d695-4029-341a-7aa8-53318941486e.png)
ここまでがポインタの基本となります。
ここからさらにポインタの注意点や応用編など記事として続けていければと思っています。
MAMPをインストールしたらMAMP PROもついてきてしまう

###MAMP PROのアンイストールの仕方

1. Finderで`アプリケーション`を開く
2. MAMP PROのアイコン上で右クリック
3. `パッケージの内容を表示`をクリック
4. Contentsの中のMacOsのフォルダを開く
5. その中に`MAMP PRO Uninstaller.app`があるのでクリック
Dockerの環境をリセットしたい　コンテナ・イメージ ・ボリュームを全削除

###コンテナを全削除

``` 
docker ps -aq | xargs docker rm
```

###イメージ全削除
``` 
docker images -aq | xargs docker rmi
```


###ボリューム全削除
``` 
docker volume rm $(docker volume ls -qf dangling=true)
```
Raspberry Pi で Swift を使えるようにする【Swift 5】

Raspberry Pi に Swift をインストールし、「Hello, world!」を出力するまでをやってみます。

# 環境
Mac にインストールした Visual Studio Code で Raspberry Pi 3 Model B にSSH 接続。

## Mac 側の環境
- MacBook Pro (Retina, 15-inch, Late 2013)
- macOS Catalina バージョン 10.15.6（19G73）
- Visual Studio Code バージョン: 1.47.2
  - コミット: 17299e413d5590b14ab0340ea477cdd86ff13daf
  - 日付: 2020-07-15T18:18:50.054Z
  - Electron: 7.3.2
  - Chrome: 78.0.3904.130
  - Node.js: 12.8.1
  - V8: 7.8.279.23-electron.0
  - OS: Darwin x64 19.6.0

## Raspberry Pi 側の環境
- Raspberry Pi 3 Model B

```
$ cat /etc/issue
Raspbian GNU/Linux 9 \n \l

$ cat /etc/debian_version
9.11

$ uname -a
Linux raspberrypi 4.19.66-v7+ #1253 SMP Thu Aug 15 11:49:46 BST 2019 armv7l GNU/Linux

$ cat /proc/version
Linux version 4.19.66-v7+ (dom@buildbot) (gcc version 4.9.3 (crosstool-NG crosstool-ng-1.22.0-88-g8460611)) #1253 SMP Thu Aug 15 11:49:46 BST 2019

$ bash --version
GNU bash, バージョン 4.4.12(1)-release (arm-unknown-linux-gnueabihf)
```

# Swift-Arm の入手
Swift-Arm を入手します。以下のスクリプトで OS の判別、curl のチェック、gpg のチェック等が行われ、Swift-Arm がインストールされます。

```
$ curl -s https://packagecloud.io/install/repositories/swift-arm/release/script.deb.sh | sudo bash
```

# Swift のインストール
```
$ sudo apt-get install swift5
```
必要なパッケージも一緒にインストールされます。

# インストールした Swift のバージョンを確認
```
$ swift --version
Swift version 5.1.5 (swift-5.1.5-RELEASE)
Target: armv6-unknown-linux-gnueabihf
```
無事に Swift をインストールできました🎉

# ディレクトリと初期ファイルの作成
今回は `SwiftPractice` というディレクトリを作成します。`swift package` で初期ファイルたちを作成します。

```
$ mkdir SwiftPractice
$ cd SwiftPractice
$ swift package init --type executable
```

![sc001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90125/60b8616d-97a0-faa4-4193-afeb0e086609.png)

生成された `main.swift` には `print("Hello, world!")` と書かれています。

# ビルドと実行
ビルドして実行します。

```
$ swift build
[4/4] Linking SwiftPractice
$ swift run
Hello, world!
```

ビルドに成功し、正しく「Hello, world!」が出力されました🎉🎉🎉

# 参考資料
- [swift-arm/release - Packages · packagecloud](https://packagecloud.io/swift-arm/release)
- [Official Swift-Arm Community Releases – Swift-Arm](https://swift-arm.com/2019/01/07/official-swift-arm-community-releases/)
git flow init が完了しているかチェックするシェルスクリプト

[git-flow](https://github.com/nvie/gitflow) を初めて利用する際には `git flow init` で初期設定を行う必要があります。
チーム開発で利用するための CI 用のシェルスクリプトを作成していた際、この初期設定が完了しているか確認するスクリプトを書いたのでメモしておきます。

そもそも Git Flow って何？という方は以下の記事が参考になるかと思います。

- [Git\-flowって何？ \- Qiita](https://qiita.com/KosukeSone/items/514dd24828b485c69a05)

## スクリプト

```bash
#!/bin/bash

function warn() { echo "$@" >&2; }

function die() { warn "$@"; exit 1; }

function checkIfGitFlowBranchExists() {
  local branch_config
  local existed_in_local

  branch_config=${1}
  existed_in_local=$(git config --get ${branch_config})

  if [[ -z ${existed_in_local} ]]; then
    die "${branch_config} が存在しません。 Git Flow の初期化を行ってください。"
  fi

  if ! git branch | egrep "\s+${existed_in_local}" > /dev/null; then
    die "${branch_config} に指定したブランチが存在しません。"
  fi
}

function checkIfGitFlowInitialized() {
  # cf. https://stackoverflow.com/questions/28464229/programmatically-determine-if-git-flow-is-initialized
  local master_branch_config
  local develop_branch_config

  master_branch_config="gitflow.branch.master"
  develop_branch_config="gitflow.branch.develop"

  # 1. gitflow.branch.master が設定されており、設定したブランチが存在すること
  checkIfGitFlowBranchExists ${master_branch_config}

  # 2. gitflow.branch.develop が設定されており、設定したブランチが存在すること
  checkIfGitFlowBranchExists ${develop_branch_config}

  # 3. gitflow.branch.master と gitflow.branch.develop に指定したブランチが別のブランチであること
  if [[ $(git config --get ${master_branch_config}) == $(git config --get ${develop_branch_config}) ]]; then
    die "master ブランチと develop ブランチを分けてください。"
  fi

  # 4. release/hotfix ブランチが設定されていること
  if [[ -z $(git config --get "gitflow.prefix.release") || -z $(git config --get "gitflow.prefix.hotfix") ]]; then
    die "release ブランチまたは hotfix ブランチが設定されていません。"
  fi
}

checkIfGitFlowInitialized # 初期設定チェック
```

`git flow init` が実行済みかどうかを確認する手順については [Stack Overflow の関連 Q&A](https://stackoverflow.com/questions/28464229/programmatically-determine-if-git-flow-is-initialized) を参考にしています。
以下に引用した回答の内容をスクリプトとして落とし込んでいます。

> [Answered here](https://groups.google.com/forum/#!topic/gitflow-users/7HzYr2JsJT0). Basically:
> 1. Check config for gitflow.branch.master and if the branch does exist in the repo
> 2. Check config for gitflow.branch.develop and if the branch does exist in the repo
> 3. Master branch can not be the same as develop branch.
> 4. Make sure all the prefixes are configured.

1 と 2 では `.git/config` の以下の設定およびそのブランチが存在することを確認し、加えて 3 で2つのブランチが別々のものであることを確認しています。

```
[gitflow "branch"]
        master = master
        develop = develop
```

4 は以下の prefix 設定があるかどうかの確認です。

```
[gitflow "prefix"]
        feature = feature/
        release = release/
        hotfix = hotfix/
        support = support/
        versiontag =
```

上記のスクリプトでは release と hotfix しか見ていませんが、必要に応じて feature ブランチなども確認するようにスクリプトを修正してください。

## ちなみに

git-flow をデフォルト設定で運用することをチーム内で合意できるのであれば、 `git flow init -df` で強制的に初期設定を行ってしまった方が早いかもしれません。
拡張子MWBファイルを開く方法

拡張子が`mwb`となっているER図を見たかった・・・MySQL Workbenchで開けると知ったのでやってみる。
参考 : [MWBファイルを開くには？ .MWBファイル拡張子 - File Extension .MWB](https://www.file-extension.info/ja/format/mwb)

# MySQL Workbenchをインストールする
1. [MySQL :: Download MySQL Workbench](https://dev.mysql.com/downloads/workbench/)からファイルをダウンロードする
    2. Oracleアカウントでのログインが必要なのでアカウントがない場合は作成する
    3. 今回ダウンロードしたのは、`mysql-workbench-community-8.0.21-winx64.msi`
3. ダウンロードしたファイルをダブルクリックして起動する
4. [Next]ボタンをポチポチしていけばインストールできる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/927c2993-4af6-cd81-e506-87383fb97ecb.png)

# MWBファイルを開く
1. MySQL Workbenchを起動する
2. `Ctrl + O`([File] > [Open Model])でファイルを選択して開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/e106225d-38fd-dbb2-548d-0f71f5ecba1c.png)