OmniAICreator/Qiita-1.07M huggingface dataset:
Sourcetreeでコミットを行う際に「git: 'secrets' is not a git command. See 'git --help'.」というエラーが表示される。

## 背景
開発中アプリケーションのS3設定を終え、Sourcetreeでコミットを行った際に、
「git: 'secrets' is not a git command. See 'git --help'.」というエラーが表示され、
コミットが出来なかったので、プログラミング初学者ですが、備忘録として記事を書きました。

参考記事：[git-secretsをSourceTree (Macintosh)で使えるようにする手順](https://qiita.com/yamaryu0508/items/d959dc32442b08b8a0a4)
※ほとんど、上記の記事を参考にしていますので、まずは上記の記事を確認して、実行してみてください。

## 前提
Sourcetreeの環境設定のgitでは、システムのgitを使用するを選択している状態です。

## 手順1
「git: 'secrets' is not a git command. See 'git --help'.」というエラーは、git-secretsがインストールされていませんというエラーとのことです。

まず、git-secretsのインストールを行いました。

```
% brew install git-secrets
```
すると、下記の結果が返ってきました。

```
Warning: git-secrets 1.3.0 is already installed and up-to-date
```
既に、git-secretsはインストールされているとのことです。

## 手順2
gitの場所の確認を行いました。

```
% which git
/usr/bin/git
```
git-secretsの場所の確認を行いました。

```
% which git-secrets
/usr/local/bin/git-secrets
```
gitとgit-secretsのパスが違いますね。

readlinkでgit-secretsの場所を確認します。

```
% readlink git-secrets
```
私の場合は、変化がありませんでした。
そのため、Finderの「Macintosh HD」から確認しました。
Macintosh HDで「command + shift + .」で隠れファイルを表示します。
私の場合は、Macintosh HD > usr > local > Cellar > git-secrets > 1.3.0 > bin > git-secrets
にありました。
確認が出来ると、下記コマンドを実行します。

```
% cd /usr/bin
% sudo ln -s /usr/local/Cellar/git-secrets/1.3.0/bin/git-secrets 
```
すると、下記の結果が返ってきました。

```
ln: ./git-secrets: Operation not permitted
```
/usr/local や /usr/bin へのリンクはsudoしても拒否されてしまうみたいです。

## 手順3
####System Integrity Protecton(SIP)を無効にします
- macをシステム終了し、再度立ち上げます。その際に「command + R」でリカバリーモードを立ち上げます。
- ユーザーを選択し、パスワードを打ち込み、画面が切り替わると、ヘッダメニューの「ユーティリティ」から「ターミナル」を立ち上げます。
- ターミナルでSIPコマンド「csrutil disable」を実行します。
- macをシステム終了し、再度立ち上げます。

####SIPが無効化されたら、git-secretsを/usr/bin/にリンクします

```
% cd /usr/bin
% sudo ln -s /usr/local/Cellar/git-secrets/1.3.0/bin/git-secrets 
```
すると、下記の結果が返ってきました。

```
ln: ./git-secrets: Read-only file system
```

これはgit-secretsが読み取り専用ファイルシステムとのことです。
そのため、下記コマンドを実行し、書き込み権限を付与します。

```
% sudo chmod g+w /usr/local/Cellar/git-secrets/1.3.0/bin/git-secrets
% sudo ln -s /usr/local/Cellar/git-secrets/1.3.0/bin/git-secrets
```
※上記コマンドを実行しても、画面の変化はありません。

####System Integrity Protecton(SIP)を有効にします
- macをシステム終了し、再度立ち上げます。その際に「command + R」でリカバリーモードを立ち上げます。
- ユーザーを選択し、パスワードを打ち込み、画面が切り替わると、ヘッダメニューの「ユーティリティ」から「ターミナル」を立ち上げます。
- ターミナルでSIPコマンド「csrutil enable」を実行します。
- macをシステム終了し、再度立ち上げます。

すると、Sourcetreeでコミット・プッシュが出来るようになりました。
Wordpressの記事をカスタムフィールドごとjsonで吐き出す

この記事は<a href="https://qiita.com/advent-calendar/2020/wano-group">Wanoグループ Advent Calendar 2020</a> の11日目です。

他所との連携でjson形式でやり取りしたい！というパターンが増えて来たので備忘録がてら。

<a href="https://ja.wp-api.org/" target="_blank">WP REST API</a>を使え？
当然そちらのほうがスマートなんですが、Wordpressがメジャーすぎてアップデートの度にすぐにゼロデイ攻撃の対象になるので__セキュリティをガッチガチに固めてからでないと__怖くて使えません…
（もう3年も前なんですねREST APIの脆弱性攻撃）

## 要件
- パラメータで「何件取得するか、何ページ目を取得するか」を設定可能にしたい
- カスタムフィールドごと突っ込みたい

## コード
まず適当に`json_api`のような固定ページを作成し、
対象のテンプレートを下記のように記述。

``` php:page-json_api.php
<?php
//getパラメータを取得
$ppp = $_GET["ppp"]; // 1ページ当たりの取得件数
$cp = $_GET["cp"]; // 何ページ目を持ってくるか

$args = array(
  'post_type' => array('post'), // 取得する投稿タイプをarray内に記載
  'post_status' => 'publish',
  'orderby'     => 'post_date',
  'order'       => 'DESC',
  'posts_per_page' => $ppp,
  'paged'       => $cp,
);

$the_query = new WP_Query($args);

if($the_query->have_posts()) {
  $count = 0;
  while ($the_query->have_posts()) {
    $the_query->the_post();
      setup_postdata($post);
      $custom = get_post_custom($post->ID);
      $json[$count] = $post;
      $json[$count]->custom = $custom;
      $count++;
  }
}

header("Content-Type: application/json; charset=utf-8");
echo json_encode($json,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
?>
```

## 出力
上記で `/json-api/?ppp=10&cp=1` とパラメータを指定してアクセスすると出力されます。

``` json
[
  {
    "ID": 1,
    "post_author": "1",
    "post_date": "2020-12-10 12:12:12",
    "post_date_gmt": "2020-12-10 12:12:12",
    "post_content": "記事本文",
    "post_title": "記事タイトル",

～～～

    "custom": {
      "post_thumb": [
        "hoge"
      ],
    }
  },
  {
    "ID": 2,
    "post_author": "1",
    "post_date": "2020-12-10 12:12:12",
    "post_date_gmt": "2020-12-10 12:12:12",
    "post_content": "記事本文",
    "post_title": "記事タイトル",

～～～

    "custom": {
      "post_thumb": [
        "hoge"
      ],
    }
  }
}
```

## 最後に
これで大概のwordpressの投稿データはどこかしらにぶん投げられます。
`WP_QUERY`のクエリの部分を変更すれば他にもカテゴリでのフィルタだったり投稿日時でのフィルタだったりをパラメータ指定できるようにも改造可能になっています。

__くれぐれもセキュリティにはご用心を！__

===================================

Wanoは積極的にエンジニア採用を行なっています！
まずはオンラインでVPoEとのカジュアル面談から。お好きな入り口からお気軽にお声がけください！
Wano Recruitページ　https://group.wano.co.jp/recruit/
QiitaJobs　https://jobs.qiita.com/employers/wano-inc/postings/1297
Wantedly　https://www.wantedly.com/companies/wano/projects
Findy　https://findy-code.io/companies/522
DataPortal: 新機能さかのぼり（パラメータ ベースの基準線）

DataPortalのまだ知らない使えそうな機能を求めて、新機能の一覧を遡ってみました。

[パラメータ ベースの基準線](https://support.google.com/datastudio/answer/9921462)
> パラメータから値を取得する基準線をグラフに作成できるようになりました。たとえば、パラメータを [入力ボックス] コントロールにバインドして、ユーザーが販売目標を入力できるようにすると、販売目標がグラフの基準線として表示されます。

早速試してみます。

![20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/429d8e18-2105-0632-572a-fe627d6d476c.png)

定義済みのパラメータの値で、グラフに基準線を引けました。
`入力ボックス` を利用して、線の位置を変更できます。

![60.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423506/fb400153-b6e9-ec06-9a93-6e77c20abe56.png)

こ、こいつはすげぇ！
いったい何に使えばいいんだ！？

基準線が目標値だとして、上司とかが値を設定した上でレポートへのリンクを取得し、部下に「来期これな」って言いながらリンクのURLを送りつける時に使えそうですね。
nlコマンドでの正規表現の利用


nlコマンドは正規表現が利用でき、特定の条件に当てはまる行だけに行番号を出力することができます。利用できる正規表現はPOSIXの「基本正規表現(BRE)」です。

正規表現についての詳細は他の記事をご覧ください。

-  [IEEE Std 1003.1-2017 9.3 Basic Regular Expressions](https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03)
- [Wikipedia 基本正規表現](https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE#%E5%9F%BA%E6%9C%AC%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE)

# `nl`での正規表現の使い方

[前の記事](https://qiita.com/Carol_815/items/997de8239ce3402b46dc#bfh%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9)にて紹介済みですので、coreutilsのものだけ一部引用します。

```console
     ‘pBRE’
          number only lines that contain a match for the basic regular
          expression BRE.  *Note Regular Expressions: (grep)Regular
          Expressions.
```

`-b pBRE`というように各`-b` `-h` `-f`オプションのあとにパターン指定します。パターンに一致する行にだけ行番号が出力されるようになります。`p`のあとにスペースを入れて`-b p BRE`としてしまうと期待通りの動きをしませんので注意しましょう。

#正規表現を試してみる

正規表現が使えると自由度が高くなんでもできそうな気がしてきます。使いどころはわかりませんが、いくつか試してみます。


## 特定の文字種を含む行

```console
$ echo -e 'aaa\n123\nbbb' | nl -b p'[0-9]'
       aaa
     1	123
       bbb
$ echo -e 'aaa\n123\nbbb' | nl -b p'[[:alpha:]]'
     1	aaa
       123
     2	bbb
```

## 同じ文字が連続する行

```console
$ echo -e 'aaa\naba\nbbb' | nl -b p'\(.\)\1\{2\}'
     1	aaa
       aba
     2	bbb
$ echo -e 'aaa\naba\nbbb' | nl -b p'\(.\)\1\1'
     1	aaa
       aba
     2	bbb
```

## 特定の長さの行

```console
$ echo -e 'aaa\naaaa\naaaaa\naaaaaa' | nl -b p'^.\{4,5\}$'
       aaa
     1	aaaa
     2	aaaaa
       aaaaaa
$ echo -e 'aaa\naaaa\naaaaa\naaaaaa' | nl -b p'^.\{4,\}$'
       aaa
     1	aaaa
     2	aaaaa
     3	aaaaaa
```

# 応用例

ごく一部のテキストあるいは特定条件でのみ番号を振りたい場合には活躍すると思いますが、自由度が高い一方で具体的な応用例はあまり思いつきません。例として[論理ページの記事](https://qiita.com/Carol_815/items/d1f52df36b0d39b374b0#%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E8%A1%A8%E7%A4%BA)で利用した上野東京ラインのテキストデータ「utl-doc」を用いて、「フッターに配置された備考テキストが複数存在するときだけ番号を出力」してみます。

```console
$ nl -f p: utl-doc 

       【東海道線（JT）】

     1	東京
     2	新橋
     3	品川
     4	川崎
     5	横浜
     6	戸塚
     7	大船

       大船以南、小田原方面へ直通

       【宇都宮線・高崎線（JU）】

     1	東京
     2	上野
     3	尾久
     4	赤羽
     5	浦和
     6	さいたま新都心
     7	大宮

     1	宇都宮線: 大宮以北、宇都宮方面へ直通
     2	高崎線: 高崎方面へ直通
       
```
東海道線の備考テキスト「大船以南〜」には番号が振られませんが、分岐する宇都宮線と高崎線には番号が振られました。この例では、路線名の後の「:」を正規表現のパターンに指定しています。`-s`や`-w`もセクションごとに指定できるともう少し便利そうですが、そういった使い方は想定されていないようです。

----
TensorFlow Recommendersの紹介

[フューチャー Advent Calendar 2020](https://qiita.com/advent-calendar/2020/future)の10日目の記事です。

この記事では今年の9月にリリースされたばかりのライブラリ、[TensorFlow Recommenders](https://www.tensorflow.org/recommenders)についての紹介を行います。

# レコメンドタスクの特徴について
レコメンドタスクでは、あるユーザーに対して万単位や億単位のアイテムの中からユーザーが気に入りそうなアイテムを選び、順位付けしてアイテムを提示します。そのため、基本的にはユーザーと候補のアイテムをそれぞれ入力カテゴリとして購入するかどうかの二値分類や、レビューの回帰問題として予測し並び替えることが多いです。しかしレコメンドタスクには、一般的な機械学習の分類問題や回帰問題と比較した際にいくつかの特徴と難しい点があります。

* たくさんのユーザー・アイテムの特徴・相性をそれぞれ上手く数値化しないといけない
* ユーザー×アイテムの総数はとても多いが、実際に観測できる組み合わせの数はとても少ない
* ユーザーの好みが明示的にわかるレビューの数はもっと少ないか手に入らない
* 比較的多く手に入るユーザーがアイテムを閲覧したかどうか、購入したかどうかの情報は正例しかない
* 未知のアイテム・ユーザーに対しても予測を行いたい

これらの問題を、tensorflow recommendersでは解決することができます。

# 2-tower modelについて
![2-tower model](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237496/4d49c97e-d87e-6553-bd4d-3fc7dbbc37b4.png)
TensorFlow Recommendersはレコメンドタスクを以下の二つに分解してモデル化します。

* たくさんの候補の中からアイテムを絞り込むRetrieval(検索)タスク
* 選んだ候補をより精度高く並び替えをするRanking(順位付け)タスク

精度は荒くても高速に実行できる前者と、計算時間がかかっても正確な結果を出せる後者の二つに分解することにより、計算コストとパフォーマンスの両立を達成することができます。後者は比較的普通の回帰問題を解くので、今回は前者のRetirievalタスクについて紹介します。

# Embeddingについて
カテゴリの特徴を表す方法として、一般的にはone-hot encoding(カテゴリごとに01で扱う)やtarget encoding(カテゴリを予測値の平均で表す)が用いられますが、深層学習ではカテゴリをK次元のベクトルで表すEmbedding(埋め込み)を用いることが多いです。このEmbeddingとは色を赤色や黄色の名前で表すのではなく、RGB値やHSV値で表すようなものです。この手法を活用することで、膨大な数のカテゴリをk次元のベクトルとしてあらわすことができます。

# Retrieval taskについて
Retrievalタスクでは推薦対象のユーザーと推薦するアイテムの情報を上記のEmbeddingなどを用いてそれぞれk次元のベクトルで表し、その二つの内積の大きさでユーザーに対してアイテムがクリック・購入された組み合わせを1、そうでなかった組み合わせを0で予測します。これにより

* たくさんのユーザー・アイテムをそれぞれ上手く特徴化できる
* 観測したことの無いユーザーxアイテムの組み合わせでも予測できる
* たくさんある正例しかないクリックデータも活用できる
* アイテムのベクトルを事前計算しておけば、高速に多数の組み合わせを評価できる
* 数が豊富なクリックデータで得たEmbeddingを他の学習(ランキング等)に転用できる

といった利点がうまれます。また、k次元のベクトルはそれぞれユーザー・アイテムのembeddingだけでなく、他に付随した情報(カテゴリ・数値・画像・テキストなど)を全結合層などを用いて組み合わせて表現してもよいので

* 未知のユーザー・アイテムに対しても予測することができる

という利点もあります。
学習は一度にN個の組み合わせについて同時に学習を行います。ユーザーのベクトルとアイテムのベクトルをそれぞれNxkの行列で表し、行列積を計算します。行列の対角成分を1、それ以外を0としたラベルで学習を行い、内積は~~sigmoid~~ softmax関数(2020/12/10修正)で0-1に変換します。
![行列計算.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237496/eac34c36-d10a-19ea-da98-64011af4d968.png)

検索については、すべての組み合わせについて内積を計算してもよいのですが、ANN(近似近傍探索)を用いるとより効率的に求めることができます。tensorflow recommendersにはScaNNというgoogle謹製の近似近傍探索の手法が手軽に使えるよう実装されています。

# 実装について
tensorflow recommendersではモデルをkerasのように容易に構築することができます。[トップページの例](https://www.tensorflow.org/recommenders?hl=ja)を見ると分かるのですが、上記のretrieval taskについてこれだけの実装で手軽に実行できるようになっています。

# 感想
tensorflow recommendersはシンプルに書けて、かつtensorflowの豊富なライブラリでカスタマイズできるので使い勝手が良さそうに感じました。今はv0.3.0ですが、ScaNNの他にも最新の推薦モデルが手軽に使えるよう実装される予定らしいので今後も動向をチェックしていきたいと思います。
AmazonConnectで日本の電話番号を取得しようとしたら個人利用を断られた件


# はじめに

本記事は2020年12月時点の最新の備忘録として残しておくものです。

そもそもこの話は、フルリモートになったときの電話対応をどうしようという話が出たときに
「twilioは使ってるけどAmazon Connect使ったことないから、いっちょR&Dしたるか」と意気込んで
Amazon Connectインスタンスを作って失敗した話の一部始終です。

Qiitaを始め、ネットの何処の記事を探してもこの話が出てこなかったので書くことにしました。
もし「この方法なら個人でも番号とれるぜ」という方法があればこっそり教えてください。

**2021年11月20日**
twilioが個人への番号提供を停止している旨を追記しました。

# Amazon Connect とは

言わずと知れたAWSが展開する「オムニチャネルのクラウドコンタクトセンター」のサービス
https://aws.amazon.com/jp/connect/

従来のコンタクトセンターでは多額の初期投資と構築時間が必要だったが、Amazon Connectならば比べものにならないくらいスピードでコンタクトセンターが構築ができるというサービス。

# Amazon Connect での日本の電話番号取得

インスタンスの作成などは他の方がたくさん記事にしているので、そちらを参照。
ここで記事にするのは、電話番号の取得についてです。

東京リージョンのAmazonConnectで取得できる電話番号は

- 直通ダイヤル (DID) 番号

 - 050 プレフィックス番号
 - 03 プレフィックス番号 (東京の市外局番)

- 通話料無料番号

 - 0120 プレフィックス番号
 - 0800 プレフィックス番号

の4種類です。

これらの番号を取得するためには、**AWSサポートから申請が必要です**。

古い記事だと、050番号はそのまま取得できるという記載が多いのですが、2020年12月時点では**新規で050を取得することもできません**。
すべてのプレフィックスでAWSサポートからの申請が必要だそうです。

サポート担当からは、

```日本の電話番号を取得する場合は、必要な電話番号(03,050,0120,0800)ごとに、Amazon Connect のインスタンスに直接割り当てる申請制となっております。```

と返ってきたので、自分で好きに選べるわけではないようです。
古い記事を参照していると、ここで突っかかります(笑)
素直にAWSサポートからケースを立ち上げましょう。


# 個人では日本の電話番号取得は不可

AWSサポートからケースを立ち上げ、検証のため個人で050番号を取得したい旨を伝えたところ…

```大変恐れ入りますが、Amazon Connect では現在個人利用のための日本の電話番号付与は行っておりません。```
```企業としてのご利用のみ申請を受け付けておりますため、企業の住所を証明する書類のご提出が必須となっております。```

という悲しい答えがサポートの担当者から返ってきました。

東京リージョンで日本語の電話番号を取得するためには、次の書類をAWSサポートに提出する必要があるそうです。

```
▼電話番号のリージョンの要件｜Japan
https://docs.aws.amazon.com/ja_jp/connect/latest/adminguide/phone-number-requirements.html#japan-regulations 
企業は、認定代理人の ID またはパスポートのコピー、住所の証明が記載された ZIP ファイル、および認定代理人を企業の関連を示すドキュメントを提出する必要があります。

① 番号が付与されている都市と一致する住所を含む書類 
(例: 公益法人、法務省からの企業登録証明書、国または地方の税務申告書、社会保障支払の領収書などの政府機関への支払い済み領収書、銀行明細書、6か月以内の光熱費請求書、など）
② 代表者の有効な身分証明書 (個人識別カード、パスポート、運転免許証など)
③ 代表者と該当企業の関連を証明できる書類（社員証など）
```

このあたりは、クラスメソッドの記事に詳しく出ています。

Amazon Connect 電話番号の取得画面で「その国でお使いいただける番号はありません。」というメッセージが表示され、新規番号が取得できない場合の対処方法
https://dev.classmethod.jp/articles/tsnote-support-amazon-connect-003/

過去には個人でも050番号は取得できたようですが、今は**個人では050番号も取得不可でした**。

悲しみに暮れつつR&D用に立てたインスタンスはきれいさっぱり削除しました。
(米国の番号なら取れるのかもしれないけど、国際電話になるのはちょっと…)




# 結局twilioか…

twilio
https://twilio.kddi-web.com/

~~twilioは、個人でもeKYCによる本人確認を行えば050番号取得が可能です。~~

~~でもAmazon Connect使ってみたかったんだよなぁ…。~~
~~Amazonさん、ぜひ個人にも開放してくださいましm(_ _)m~~

**2021年11月22日現在、twilioも個人への日本の電話番号の提供を停止しているようです。**
よって、twilioも企業アカウントで所定の手続きを踏まないと日本の番号取得ができません。
既に取得している番号は問題なく利用できるようですが、番号をリリースしてしまうと、再度番号を追加するのは難しそうです。(未確認)

日本の電話番号を利用する際に必要となる提出書類
https://cloudapi.zendesk.com/hc/ja/articles/360000337582-%E6%97%A5%E6%9C%AC%E3%81%AE%E9%9B%BB%E8%A9%B1%E7%95%AA%E5%8F%B7%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%A8%E3%81%AA%E3%82%8B%E6%8F%90%E5%87%BA%E6%9B%B8%E9%A1%9E

うーん、本人確認だってeKYCで厳格にやってるわけだし、取得できる電話番号の数を制限するとかで再度解放してくれないかなぁ…。

番号少なくても、個人で利用できたほうが開発者としては幅も広がるし、色んなアイディアが出ると思うのですがねぇ。
twilioさん、KDDI Webコミュニケーションズさん…。
cssとjsで overflow:hidden の要素を上下に開閉アニメーション

## 概要
cssとjsで `overflow:hidden` の要素を上下に開閉アニメーションします。

## 動作の流れ

1. 同じ要素をhiddenでクローン作成
2. 高さを取得
3. 取得した高さを `max-height` として設定
4. cssの `transition` でイイ感じにアニメーション


## ソースコード

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="js,result" data-user="toromoon" data-slug-hash="PoGVoGG" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="cssとjsで overflow:hidden の要素を上下に開閉アニメーション">
  <span>See the Pen <a href="https://codepen.io/toromoon/pen/PoGVoGG">
  cssとjsで overflow:hidden の要素を上下に開閉アニメーション</a> by toromo (<a href="https://codepen.io/toromoon">@toromoon</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
【Java】数値リテラル内のアンダースコア

# Javaにおいて数値リテラル内にアンダースコアを書く理由

についてまとめました。

## なぜアンダースコアを書くのか

一言でいうと

数値リテラルの桁の集まりを分離することで、コードの可読性を向上させることができるからです。

例えば、下記の2つの宣言は同義になります。

```java

int i1 = 123456789;
//アンダースコアを挿入した変数
int i2 = 123_456_789;

//2つの変数が正しいか確認する
System.out.println(i1 == i2);
```

```java
true
```

## 【説明】

Java 7以降、プリミティブな数値リテラルの数字のグループを区切るために、1以上のアンダースコア「_ 」を使用して可読性を向上させることができました。

重要なことなので先にいうと、配置の出来ないルールが大まかに2つあります。

- **リテラルの先頭と末尾には記述ができない**
- **記号の前後には記述ができない**

細かなルールについては下記で説明する。

## アンダースコアを配置できる場所

アンダースコアを配置できるのは桁の間のみです。

## アンダースコアを配置できない場所

次の場所にアンダースコアを配置することはできません。

- 数値の先頭または末尾
- 浮動小数点リテラルの小数点の隣
- `F`または`L`接尾辞の前
- 数字の文字列が想定されている場所

### 数値の先頭または末尾

番号の先頭または終わりに、配置することは出来ません

```java
_123_456_789 または 123_456_789_ など
```

### 浮動小数点リテラルの小数点の隣

リテラル浮動小数点の小数点に隣接して、配置することは出来ません

```java
1._23 または 3_.1415F など
```

### `F`または`L`接尾辞の前

FまたはL接尾辞に先立ち配置することは出来ません

```java
9999999_L　または　999_99_9999_L　など
```

### 数字の文字列が想定されている場所

数字の文字列が期待されている位置で、配置することは出来ません

```java
0_xFFFF　など
```

## 【まとめ】

厳密には4つのルールがあるが、まずは以下の2点を覚えておこう。

- **リテラルの先頭と末尾には記述ができない**
- **記号の前後には記述ができない**

## 参考文献・記事

- [数値リテラル内のアンダースコア](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/language/underscores-literals.html)
- [徹底攻略Java SE 11 Silver問題集[1Z0-815]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-815/dp/4295007625/ref=pd_lpo_14_img_0/356-5238196-1895250?_encoding=UTF8&pd_rd_i=4295007625&pd_rd_r=1c21865b-a9fe-43e8-ac01-46170e44abca&pd_rd_w=9El0Q&pd_rd_wg=hh5Hc&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=72AVH18EM90CKG00CH5W&psc=1&refRID=72AVH18EM90CKG00CH5W)
自前EDR その4

#概要

vistaにedrを構築する。
不審な通信を探すtcpviewを入れた。

#環境

windows vista 32bit

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/371dfd67-00fa-1f02-cdb4-d9b3fa022aba.jpeg)


#chromeを起動した。

以上。
【Carbon】日本語で曜日を出力する。


自分用のメモとして残します。


#■やり方

```php
// laravelの場合、configのapp.phpの'locale' => 'ja'であればsetlocalは不要
Carbon::setLocale('ja'); 
Carbon::now()->isoFormat('YYYY/MM/DD(ddd) HH:mm:ss');
// 2020/01/01(水) 00:00:22
```
IBMCloud vSRX ClusterError(HW)

##小ネタ
vSRXを利用していて、クラスター状態を確認した際にエラーが表示されている場合がある。
ネットで調べても情報があまりでていないので、記載する。


##エラー内容 **HW(Hardware monitoring)**

```
vSRX-Node0> show chassis cluster status
Monitor Failure codes:
    CS  Cold Sync monitoring        FL  Fabric Connection monitoring
    GR  GRES monitoring             HW  Hardware monitoring
    IF  Interface monitoring        IP  IP monitoring
    LB  Loopback monitoring         MB  Mbuf monitoring
    NH  Nexthop monitoring          NP  NPC monitoring
    SP  SPU monitoring              SM  Schedule monitoring
    CF  Config Sync monitoring      RE  Relinquish monitoring
    IS  IRQ storm

Cluster ID: 8
Node   Priority Status               Preempt Manual   Monitor-failures

Redundancy group: 0 , Failover count: 1
node0  100      primary              no      no       None
node1  1        secondary            no      no       None

Redundancy group: 1 , Failover count: 1
node0  100      primary              no      no       None
node1  1        secondary            no      no       HW
```

##修正方法
/var/crash/corefile配下のファイルが原因
corefileフォルダ配下にcoreダンプファイルが存在し、数が多くなってくると**HW**アラームが上がる模様
特に問題が起きていなければ、不要なファイルになるので削除する。

なお、ログイン先はFreeBSDの方となる
![IBM_Cloud_-_Gateway_details.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703043/bb2ba229-a098-daeb-ca93-6b349ce3f383.png)


```
vSRX-Node0:/#cd /var/crash/corefiles/
vSRX-Node0:/var/crash/corefiles # ls
local-node.srxpfe.4215.1607566938.core.tgz
local-node.srxpfe.4381.1607566963.core.tgz
local-node.srxpfe.4540.1607566987.core.tgz
local-node.srxpfe.4697.1607567012.core.tgz
local-node.srxpfe.4855.1607567036.core.tgz
local-node.srxpfe.5013.1607567061.core.tgz
local-node.srxpfe.5177.1607567086.core.tgz
local-node.srxpfe.5338.1607567112.core.tgz
local-node.srxpfe.5503.1607567139.core.tgz
localhost.srxpfe.3759.1607566912.core.tgz

vSRX-Node0:/var/crash/corefiles # rm -rf local*
vSRX-Node0:/var/crash/corefiles # ls
vSRX-Node0:/var/crash/corefiles #
```

##ファームバージョンのアップグレードも検討
根本的には、ファームウェアのバグの模様
IBMCloudでは、修正版の**19.4R2-S3**をサポートしているのでこちらにアップグレードする。

この問題は、以下のJunosバージョンで修正されています。
18.4R3-S6 / 19.2R3 / 19.3R3 / 19.4R2-S3 / 19.4R3 / 20.1R2 / 20.2R2 / 20.3R1
CodeBuildでブランチ名を取得する

# 概要

- AWS CodeBuildでどのブランチをビルドしているのか取得したい

# やりかた

CodeBuildのWebHookでGitHubのプルリクをトリガーにしている場合、ビルド環境変数 `$CODEBUILD_WEBHOOK_BASE_REF` を用いることでマージ先のブランチを取得できます。

このとき、`git branch` の形式ではなく、 `git symbolic-ref HEAD` の形式で取得されるので、`test`などで切り分けるときは注意が必要です。



```buildspec.yml
version: 0.2
phases:
  pre_build:
    commands:
      # Git Branch を取得
      # 
      - >
        if [ "$CODEBUILD_WEBHOOK_BASE_REF" = "refs/heads/main" ];then
          DEPLOY_ENV="prd"
        else
          DEPLOY_ENV="stg"
        fi
```

# 参考

[Git - Gitの参照](https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-Git%E3%81%AE%E5%8F%82%E7%85%A7)

[ビルド環境の環境変数 - AWS CodeBuild](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/build-env-ref-env-vars.html)
MacBook M1 chip に HomeBrewをインストールする手順 2020/12



#この記事の目的

* Apple MacBookAir M1(Apple Silicon)チップを購入したのですが、HomeBrewインストールする場合、2020/12時点では一手間かけないとインストールできず、
[こちらの記事](https://qiita.com/shira-shun/items/0f6213f4923cb5544367) および [こちらのサイト](https://stackoverflow.com/questions/64882584/how-to-run-the-homebrew-installer-under-rosetta-2-on-m1-macbook)を参考にさせていただき、自分の環境(MACBookAir2020/M1chip)に何とかインストールすることができたので、メモとして情報を残しておきます。
* <font color="DeepPink">「とりあえず、すぐ動かしたい」</font>という人向けの簡易手順です。

## TerminalのRosetta有効化

* まずRosettaを有効化します。
* [Finder] -> [アプリケーション] -> ["ターミナル"で右クリック] -> [情報を見る]
    * アプリケーションフォルダにターミナルソフトが見つからない場合、検索すると出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/20e8c81d-75df-f2cc-c125-6df061bd6b85.png)

* 以下の"Rosettaを使用して開く"にチェックを入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703075/01a79dc3-b047-4b30-ccc2-5763fdbf5a53.png)

## HomeBrewをインストール

* Terminalを起動する。
* Terminal上でHomebrew(x86)以下のコマンドを入力。

<font color="DeepPink">arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)</font>

```
[実行結果]
onlysound@onrinoAir homebrew % arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
Password:
==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew
/usr/local/etc/bash_completion.d/brew
/usr/local/Homebrew
==> The following existing directories will be made group writable:
/usr/local/bin
==> The following existing directories will have their owner set to onlysound:
/usr/local/bin
==> The following existing directories will have their group set to admin:
/usr/local/bin
==> The following new directories will be created:
/usr/local/etc
/usr/local/include
・・・
(以下省略)
```

* Rosetta有効にした上で、さらにx86アーキテクチャでのインストールする、というコマンドを実行する必要があるようで、[こちらの海外サイト記事](https://stackoverflow.com/questions/64882584/how-to-run-the-homebrew-installer-under-rosetta-2-on-m1-macbook)を参考にさせていただきました。

## HomeBrewで必要なパッケージをインストールする

* 実際にインストールしたいパッケージをインストールする際も、<font color="DeepPink">arch -x86_64 brew install <インストールしたいパッケージ名>"</font>で実行する必要があります。
私自身が業務で使う必要のある、OpenConnectというツールをインストールした時のコマンド例を参考までに添付します。

```
onlysound@onrinoAir homebrew % arch -x86_64 brew install openconnect
==> Downloading https://homebrew.bintray.com/bottles/gettext-0.21.big_sur.bottle
==> Downloading from https://d29vzk4ow07wi7.cloudfront.net/a025e143fe3f5f7e24a93
・・・
(以下省略)
```

* 以上で完了です。
自前EDR その3

#概要

vistaにedrを構築する。
不審なプロセスを探すprocexpを入れた。

#環境

windows vista 32bit

#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/7d37b355-f0e0-e12d-ab93-af1c612a5d34.jpeg)


#calcを消す。

右クリックして、kill processする。

以上。
持て余してるM1 Mac miniでIntegration testing

# 事の発端

M1 Mac mini性能いいしビルドめっちゃ早くなるじゃん！！！
↓
ただメモリ少ないし大食いChromeのおかげでスワップ入りまくって快適じゃない...
↓
メイン開発機にはスペック不足だけど置いとくのももったいない...
↓
なんかIntegration testいい感じにアップデートされたっぽいしやってみるか
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">🎉 Announcing version 1.0 of the integration_test plugin, a simpler way to test your Flutter apps that also supports <a href="https://twitter.com/Firebase?ref_src=twsrc%5Etfw">@Firebase</a> Test Lab. Learn more on...<br><br>✅ Running on Firebase Test Lab<br>✅ Migrating from Flutter driver tests<br>✅ Native UI testing<br><br>Read → <a href="https://t.co/pZIDL3V2Ix">https://t.co/pZIDL3V2Ix</a> <a href="https://t.co/BXeqJRcbKd">pic.twitter.com/BXeqJRcbKd</a></p>&mdash; Flutter (@FlutterDev) <a href="https://twitter.com/FlutterDev/status/1336738454756077568?ref_src=twsrc%5Etfw">December 9, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
↓
テスト実行に毎回ビルド必要っぽいしトライアンドエラー時間かかるなぁ
↓
テストだけMac miniで回せばよくない？ ← いまここ

---
**（M1である必要性は全くない）**

# 動作概要

結局はrsyncで必要そうなファイルを同期してテスト実行するだけ。

スクリプト書いた [sync\_and\_test\.sh](https://gist.github.com/KoheiKanagu/013effdc9286a8033936928469b03d33)
同期元と同期先のディレクトリを指定して、実行するテストを指定する
（テストを実行したいマシン(本記事ではM1 Mac mini)にsshして実行する）

プロジェクト自体はgit clone済みで、よく変更するかもしれないファイルだけを同期する形

[Flavorなど](https://qiita.com/KoheiKanagu/items/516f43686b3f96fc3022#flavor)を渡したい場合は`flutter drive `でも`--dart-define`が使える

```sh
#!/bin/bash -eu

if [ $# -ne 3 ]; then
  echo "e.g. ./sync_and_test.sh from/path to/path target_test_dart" 1>&2
  echo "e.g. ./sync_and_test.sh your-mac.local:~/Develop/projectA/ projectA splash_page_test.dart" 1>&2
  exit 1
fi

rsync -ahv --progress \
--exclude='.DS_Store' \
--include='lib/**' \
--include='assets/**' \
--include='scripts/**' \
--include='test/**' \
--include='integration_test/**' \
--include='test_driver/**' \
--include='pubspec.yaml' \
--include='pubspec.lock' \
--exclude='android' \
--exclude='ios' \
--exclude='build' \
--exclude='*.*' \
$1 $2

APP_NAME=アプリの名前
APP_SUFFIX=.dev
APP_ENV=dev

( \
cd $2 && \
flutter drive \
--dart-define APP_NAME=$APP_NAME \
--dart-define APP_SUFFIX=$APP_SUFFIX \
--dart-define APP_ENV=$APP_ENV \
--driver=test_driver/integration_test_driver.dart \
--target=integration_test/$3 \
)
```
Raspberry Pi4 + openSUSE (Leap 15.2)

## はじめに

2020/12/09 日時点での内容です。
Raspberry Pi 上で動作する OS は色々ありますが、今回は openSUSE Leap 15.2 をインストールしてみました。
自分自身への覚え書きでもありますが、ご覧いただいた方への参考情報となれば幸いです。


## 1.イメージのダウンロード

元ネタ URL https://en.opensuse.org/HCL:Raspberry_Pi4

今回は、最低限のものしか入っていない JeOS を使いました。
個人的な感想ですが、いきなり全部入りから始めるよりも、JeOS から順にアップデートや必要なパッケージをインストールした方が手堅いように思います。

http://download.opensuse.org/ports/aarch64/distribution/leap/15.2/appliances/openSUSE-Leap-15.2-ARM-JeOS-raspberrypi4.aarch64.raw.xz

## 2.MicroSD への書き込み

ダウンロードした xxx.raw.xz を unxz して xxx.raw にします。その raw イメージを、Micro SD へ書き込みます。
DD for windows とか、イメージがそのまま書き込めるツールであれば何でも良いと思いますが、僕は USBImageTool で MicroSD へ書き込みました。

![USBImageTool.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/a834d1d0-18eb-6273-effd-865d0e0b9e78.jpeg)


## 3. MicroSD からの起動

書き込んだ MicroSD をラズベリーパイに差し込み起動します。
ユーザ名：root パスワード：linux で、ログインします。

## 4.アップデート

なにはともあれ、最新のパッケージバージョンにする。
JeOS のイメージに含まれるものが最新パッケージとは限らないので、余計な bug を踏まないためにも、まずはアップデートします。

IP アドレスを振り、デフォルトルータを設定し、/etc/resolv.conf に DNS の設定を加えたのちに zypper を実行 

```# zypper up ```

## 5. 追加パッケージ＿GUI 環境

私は gnome を使いたかったので gnome を追加インストールしました。
gnome を入れる、依存関係も含めて 1550 ものパッケージがリストアップされ、私の環境では、ダウンロードとインストールに２時間近くかかりました。
まあ、ダウンロードにかかる時間はネットワークの速度に依存しますが・・・

```
# zypper search -t pattern gnome
Loading repository data...
Reading installed packages...

S | Name        | Summary                             | Type
--+-------------+-------------------------------------+--------
  | devel_gnome | GNOME Development                   | pattern
  | gnome       | GNOME Desktop Environment (Wayland) | pattern
  | gnome_basic | GNOME Desktop Environment (Basic)   | pattern
  | gnome_x11   | GNOME Desktop Environment (X11)     | pattern
# 
# zypper in -t pattern gnome

インストール完了後、システムの環境を CUI から GUI へ変更します。
# systemctl set-default graphical.target

```

晴れて GUI 環境が利用できるようになりました。
![gnome.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246034/15e91e55-34f4-698c-d409-478c86bb663f.jpeg)

## 6.その他

後は、お好みに応じてパッケージをインストールしていきます。
例えば C コンパイラが欲しいときに zypper in gcc でも良いのですが、コンパイラ以外に make も欲しくなるのが普通かと思います。
1つ1つインストールするのは面倒なので、パターンでインストールするのがおすすめです。

```
zypper search -t pattern で、パターンの一覧がリストされます。

# zypper search -t pattern
リポジトリのデータを読み込んでいます...
インストール済みのパッケージを読み込んでいます...

S  | 名前                         | 概要                                               | 種類
---+------------------------------+----------------------------------------------------+---------
   | 32bit                        | 32-Bit Runtime Environment                         | パターン
   | apparmor                     | AppArmor                                           | パターン
i  | base                         | Minimal Base System                                | パターン
   | books                        | Documentation                                      | パターン
   | ceph_base                    | Ceph base                                          | パターン
... 後略 ... 

例えば C の開発環境が必要なら以下のように devel_C_C++ を入れるなど
# zypper in -t pattern devel_C_C++

```
FlutterでScrollViewに固定Footerを配置したい

詳しくは👉 https://zenn.dev/nitaking/articles/ad61015f8ddfae

## やりたいこと

```dart
Column(
  children: [
    SingleChildScrollView(),
    Container(),
  ]
)
```

これで`Container`を固定にしたい。

でも、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/b42b4929-0d15-12d3-5062-aade821e6d10.png)

こうなっちゃう

## Solution
`Expanded`をかませる

```dart
Column(
  children: [
    Expanded(
      child: SingleChildScrollView()
    ),
    Container(),
  ]
)
```

すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103475/a68cc308-c89f-d05f-b65f-19206f55553d.png)

消えました
OCI MarketplaceのODA simulatorでRAC環境を簡単構築

こちらの記事は [Oracle Cloud Infrastructure Advent Calendar 2020](https://qiita.com/advent-calendar/2020/oci) Day10の記事として書かれています。

OCI MarketplaceでOracle Database Appliance (ODA) simulatorを使用してみます


※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
本製品は検証用途のappliance製品なので、本番での使用はおやめください
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※


# はじめに
Oracle Cloud Infrastructure上で (シミュレータとはいえ) RAC databaseが組めるようになりました。
IaaS上でRACを安価に構築できるということで、セットアップ手法を今回取り上げます。
冒頭でも書きましたが、シミュレータですので、検証用途での使用にとどめてください。
また、シミュレータなので実際にdatabaseは構築されません。


# Oracle Database Appliance (ODA) とは？
簡単・低コストにオラクルのデータベースとアプリケーションを実行するためのAppliance製品で、
ハードウェアとソフトウェアが一体となった最もシンプルなOracle Engineer Systemです。

> https://www.oracle.com/jp/engineered-systems/database-appliance/

## 0. 構成
* ODA X8-2 HA (2-node system)

## 1. VMの作成
OCIコンソール画面 > ソリューションおよびプラットフォーム > マーケットプレイス
ODAで検索し、該当のappliance製品を選択し、インスタンスの起動をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232951/531eb8ce-f589-01d8-4621-04ef2734d360.png)


次に、ODA simulatorを実行するためのVMを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232951/437ca5fe-f69e-fcfd-9b1a-3038387790a5.png)


## 2. セキュリティリストの更新
OCIコンソール画面 > ネットワーキング > 仮想クラウド・ネットワーク > 該当のVCN > セキュリティ・リストの詳細

イングレス・ルールとエグレス・ルールを以下のように設定。
(デフォルトの設定だとイングレス・ルールにソース0.0.0.0/0に対してポートが開いていないため、追加で許可する)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232951/ffd92dcd-b61e-4e43-0600-270e0899ed05.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232951/9557c9d7-58be-25fe-f567-a6f8d4894a8c.png)

## 3. 作成したVMに対してssh接続
``` sh
# 該当のインスタンスにssh接続 
ssh -i <key_path> opc@<OCI public IP address>

# インストール
sudo -s
cd simulator_19.9.0.0.0 
./setup_odasimulator_sw.sh noportainer
./createOdaSimulatorContainer.sh -o noportainer -t ha -d oda
```

2つのcontainerが作成され(oda-1-node0, oda-1-node1)
ODAのコンソール画面に飛ぶためのポート番号が出力されるので、メモ。

# 4. ODA simulatorにアクセス
## CLIでのアクセス
```
sudo -s
cd simulator_19.9.0.0.0
./connectContainer.sh -n oda-1-node0
or
./coonectContainer.sh -n oda-1-node1

```

## BUI (Browser User Interface)
セットアップ時に出力されたメモを参照
https://<server IP>:xxxx/mgmt./index.html
※chrome, firefox推奨

# 5.まとめ
[Work Shop Manual](https://cloudmarketplace.oracle.com/marketplace/content?contentId=86863380)には、以下の記載があるが、ODA simulatorはODAの操作検証のためのappliance製品ということか(?)。
> no database is actually created and running

今度、[Work Shop Manual](https://cloudmarketplace.oracle.com/marketplace/content?contentId=86863380)に記載されたセットアップ後の手順についてもしかしたら書くかも。
jqueryでよく使う関数のメモ

#要素を挿入する
```jquery.html
$('#id').html('<div>hello</div>');
```

#要素の値を取得する

```jquery.html
$('#id').html();
```

#要素のcssをセットする

```jquery.html
$('#id').css('background-color','red');
```

#要素のcssを取得する

```jquery.html
$('#id').css('background-color');
```

#クラス名を追加する

```jquery.html
$('div').addClass('apple');
```

#クラス名を削除する

```jquery.html
$('div').removeClass('apple');
```

#要素のプロパティをセットする

```jquery.html
$('#id').attr('width','500');
```

#要素のプロパティを取得する

```jquery.html
$('#id').attr('width');
```

#該当する複数の要素のうちの一つを指定する(indexは0から開始)

```jquery.html
$('div').eq(0);
```

#該当する要素数を取得する

```jquery.html
$('div').size();
$('div').length; //プロパティを取得するため、こちらの方が実行スピードが速い
```

#要素を隠す

```jquery.html
$('#id').hide();
```

#隠された要素を表示する

```jquery.html
$('#id').show();
```

#ラジオボタン・チェックボックスが選択されたのをチェックする
```jquery.html
$('#id').is(":checked");
```

#DOMのロードが完了する時に関数を実行する

```jquery.html
$(document).ready(function (){ 処理 });
$(function(){ 処理 });
```

#要素がクリックされたら関数を実行する
```jquery.html
$('#id').click(function (){ 処理 });
```
Zoom・Meet・Webexのチャットの最大文字数

Web会議ツールのチャットはその場の参加者に情報を伝えるのに便利だが、長い文章、ソースコード、エラーメッセージ等を貼り付けると文字数の制限で途中で途切れることがある。そこで1回の投稿が何文字で制限されているかを調査した。

調査方法はテキストエリアに`a`を十分な数入力して投稿したのち、実際に投稿された文字を数えた。調査に用いたバージョンは2020年12月10日現在で最新のものである（Zoom 5.4.6、Webex 40.12.4.7）。

結果は以下の通りであった。

- Zoom: 1024文字
- Meet: 500文字
- Webex: 1000文字
Manjaro Linuxで画面共有すると、共有を見ている人側で画面がチカチカする問題を解消する

## 前提

* KDE Plasma Editionを使う
* GNOMEだと解消方法はないかも？

## 解消方法

System SettingsのCompositorで、`Tearing prevention("vsync")`を、`Never` に変更する。


## 参考

[Bug Report - Flickering on Arch Linux with a Screen Capture | OBS Forums](https://obsproject.com/forum/threads/flickering-on-arch-linux-with-a-screen-capture.63322/#post-439645)
WPFでプリザンターのAPIに利用するJson基盤生成ツールを作ってみた！

本記事は[Pleasanter(プリザンター) Advent Calendar 2020](https://qiita.com/advent-calendar/2020/pleasanter) 18日目の記事です。

# はじめに

国産オープンソースのローコード開発プラットフォームであるPleasanter(プリザンター)のAPIに利用するJsonデータの基盤を生成するツールをWPF(Windows Presentation Foundation)で作ってみました。
今回の記事ではそのツールについて説明してみたいと思います。

# プリザンターAPI

プリザンターにはレコード操作やユーザ操作等、様々なAPIが揃っています。
2020年12月10日現在では以下のAPIがあるようですね～。

・レコード取得/作成/更新/削除/エクスポート/一括削除/物理削除
・ユーザ取得/作成/更新/削除
・組織取得/作成/更新/削除
・グループ取得/作成/更新/削除（.NetCore版では取得のみ）
・メール送信

# リクエストに使用するJsonデータの作成が大変
しかしながらリクエストを送る際に利用するJsonデータの書き方はなかなか難しい部分もあるかと思います。
「ColumnFilterHashってどう書くんだっけ？」「Apiのバージョン1.1ではClassHashとかを書く？！」など。。。

それらに対処するため、今回はレコード取得/作成/更新/削除のみではありますがJsonデータの基盤を生成するツールを作ってみましたので是非だれかの役に立てば幸いかなと思います！

# プリザンターAPI Jsonデータ製造機

今回作成したツールは以下です。
https://github.com/Oooooomin2/Create-PleasanterApiJsonDataTool/releases/tag/v1.0

上記リンク先より「CreatePleasanterApiJsonDataTool.zip」をダウンロードします。
ダウンロードしたzipファイルを解凍し、CreatePleasanterApiJsonDataTool.exeをクリックするとプリザンターAPI Json製造機が起動します。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/fcf27bf3-31b0-bec5-110b-88165d0c88a1.png "プリザンターAPI Jsonデータ製造機")

任意のAPIKeyを入れてJsonを作成すると、以下のようにJsonの基盤が出力されます。

![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538249/a23a0e1f-8b90-2ecf-b6c1-207d9974041e.png "プリザンターAPI Jsonデータ製造機_レコード取得")

あとは利用したいパラメータを追記していくだけでJsonが完成します。

# さいごに

今回作成したツールのソースコードは以下です。
https://github.com/Oooooomin2/Create-PleasanterApiJsonDataTool

現時点ではこちらのツールはレコード取得/作成/更新/削除に対応したJson基盤のみの生成となっております。
今後もし機会があればその他APIはもちろん、基盤だけでなく実際に使用する項目等もUIから設定してまとめてJsonで出力できるようにしていきたいなと思います。
MariaDBからAurora MySQLへのデータリストアに頭を抱える

皆さん　初めましてです:wave:
今回 私が今までインフラをやってきて2,3番目ぐらいに
頭を抱えた作業を行い...
これが皆様のお役にたてたらと投稿させて頂きました:clap:

掲題にもある通り
今回EC2上に構築されたMariaDBを
Aurora MySQLへ移行する作業になります( ;∀;)
対応した内容は３つ...

①通常通りmysqldump取得してAurora側へリストア
②サポートから教えて頂いたPercona XtraBackupを使用してS3からの復旧構築
②MySQLユーティリティを使用してリストア 

頭の中では今まで通り
Aurora側の設定をチューニングして
mysqldump取ってリストアすれば問題なく
いけるだろうって思いつつい
いざ、①の対応へ...
おぉ、問題な、さ、そ...
3.5GBのテーブルデータが1時間半掛かってやっとリストア完了...
かかりすぎじゃ～と💦
そして60GBのテーブルデータに突入した矢先
途中でリストアが終了...
インスタンス側に原因は特になく、
何回かやっても同じだったので頭を抱え
サポートにお問い合わせ:joy:

Percona XtraBackupを使用してS3へデータ転送し
S3復旧からインスタンス作成すれば高速で構築出来ると！
めちゃくちゃ簡単な方法が:innocent:
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Migrating.ExtMySQL.html
いざ、設定してS3から復旧を実行
問題なくインスタンス作成に取り掛かり
30分後... ん？ｴﾗｰが出てる💦
内容をドーン...

====

Database instance put into incompatible-restore. Cannot restore from the backup in your Amazon S3 bucket because the source database engine brand mariadb is not supported for migration to Aurora MySQL.

====

え... S3から復旧はMariaDBはサポート外なの！！！
嘘やん💦

サポートに再度お問い合わせ
別方法を頂いたので③に記載されている
MySQLユーティリティを使用してのリストア
お願いだから、これで成功してと:persevere:
https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/MySQL.Procedural.Importing.NonRDSRepl.html


〇作業内容を共有

# my.cnfに以下を設定

[mysqld]
log-bin=mysql-bin
server-id=1 

[保存]
mysqlを再起動

# mysqldump取得
mysqldump \
    --databases xxxxxxxx \
    --master-data=2  \
    --single-transaction \
    --order-by-primary \
    -r backup.sql \
    -u xxxxxxx \
    -p xxxxxx 

Database,ユーザ名,パスワードは対応する方々の
環境情報で取得して下さい。

# 対象ﾃﾞｨﾚｸﾄﾘに移動して取得したsqlが格納されてるか確認
dumpの容量が極端に少なくなってますが正常にdump取得されてます。
mysqlに接続

# ﾘｽﾄｱ対応
ﾊﾞｯｸｱｯﾌﾟとったﾃﾞｨﾚｸﾄﾘまで移動しmysqlへ接続

cd /xxx/xxx/xxx/
mysql -A -u root -p -h Auroraのエンドポイント

MySQL [(none)]> source backup.sql;
↓
Query OK, 843 rows affected (0.05 sec)
Records: 843  Duplicates: 0  Warnings: 0

こんなんが流れ始めたらリストア中なので
終わるのをしばしお待ちをで。


MySQL [対象DB]> 
が返ってきたらリストア終わり:open_hands:

# ﾘｽﾄｱ中
MySQL [(none)]> show processlist;
か
MySQL [(none)]> use 対象DB;
MySQL [(対象DB]> show tables;
でどこまでリストア出来てるか確認出来ます。

後は正常にデータがリストアされてるか確認して問題なければ
お渡しです:vulcan:
86GBの容量が4時間以内でリストア終わりました♥

こちら皆様のお役にたてれたら嬉しく。
また更新ありましたら共有します:innocent:
【Java】整数型リテラル

# Javaにおいての整数型リテラル

についてまとめました。

## 整数型リテラルとは

一言でいうと整数リテラルは、整数の数値を扱うためのリテラルである。

## 【整数型リテラルの種類】

整数型リテラルには以下の種類がある

- 10進数リテラル
- 16進数リテラル
- 8進数リテラル
- 2進数リテラル

| 種類           | 始まりの値   | 続きの数値                                                        | 
| -------------- | ------------ | ----------------------------------------------------------------- | 
| 10進数リテラル | 0以外の数値  | 「0 1 2 3 4 5 6 7 8 9」の組み合わせ                               | 
| 16進数リテラル | 0x           | 「0 1 2 3 4 5 6 7 8 9」と「A B C D E F 」(小文字含む)の組み合わせ | 
| 8進数リテラル  | 0            | 「0 1 2 3 4 5 6 7」の組み合わせ                                   | 
| 2進数リテラル  | 0b または 0B | 0 と 1 の組み合わせ                                               | 

### 10進数リテラル

先頭がゼロでない数値で始まり、続く数値は0から9までの数値の組み合わせになる。

```java
1-9までの数値　[0-9までの数値]
```

```java
//int型変数integerValueの宣言をし、123を代入
int integerValue = 123;
//integerValueの値を表示
System.out.println(integerValue);
```

```java
123
```

### 16進数リテラル

先頭が「0x」で始まり、続く数値が「0 1 2 3 4 5 6 7 8 9」と「A B C D E F」（小文字も含む）の16文字の数値の組み合わせになる。

```java
0x [0-9 a-f A-F]
```

```java
int hexIntegerValue = 0x12cd;
System.out.println(hexIntegerValue);
```

```java
4813
```

### 8進数リテラル

先頭が「0」で始まり、続く数値が「0 1 2 3 4 5 6 7」の組み合わせになる。

```java
0 [0-7]
```

```java
int octalIntegerValue = 01234;
System.out.println(octalIntegerValue);
```

```java
668
```

### 2進数リテラル

先頭が「0B」または「0b」で始まり、続く数値が「0 1」の組み合わせになる。

```java
0B [0-1]　または　0b [0-1]
```

```java
// int型変数binaryIntegerValueの宣言をし、0b1111_0101_0000_1111を代入
int binaryIntegerValue = 0b1111_0101_0000_1111;
// binaryIntegerValueの値を表示
System.out.println(binaryIntegerValue);
```

```java
62735
```

### long型の整数リテラル

最後が「L」または「l」で終わる。一方、最後の文字がそうでなければ、int型になる。

```java
1-9までの数値　[0-9までの数値]L
```

```java
//long型変数longValueの宣言をし、123456789L;を代入
long longValue = 123456789L;
//longValueの値を表示
System.out.println(longValue);
```

```java
123456789
```

## 【まとめ】

正直進数とか難しくて理解はしていませんが、Silver試験ではおそらく以下の点の理解度が求められるかと思う

- 頭文字ははなにからはじまるか？
- 扱える数値やアルファベットは？

## 参考文献・記事

- [徹底攻略Java SE 11 Silver問題集[1Z0-815]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5Java-SE-11-Silver%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-815/dp/4295007625/ref=pd_lpo_14_img_0/356-5238196-1895250?_encoding=UTF8&pd_rd_i=4295007625&pd_rd_r=1c21865b-a9fe-43e8-ac01-46170e44abca&pd_rd_w=9El0Q&pd_rd_wg=hh5Hc&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=72AVH18EM90CKG00CH5W&psc=1&refRID=72AVH18EM90CKG00CH5W)
- - [【超初心者向け】Javaでの数値の扱い方](https://eng-entrance.com/java-variable-num)
- - [整数リテラル](https://www.javadrive.jp/start/num/index5.html)
Windows10機能更新プログラム（May 2020 Update：バージョン2004）適用後 エラー対処方法

# 現象
Windows10機能更新プログラム（May 2020 Update：バージョン2004）適用後
　１）デスクトップ上に、データが開けなくなる。
　２）ダウンロードフォルダ内に、勝手にデータが消える。
　　　※１時間後消えることもあり、消えないときもある。
　　　※再起動後、消える。
# 注意
**万が一に備え、データバックアップをしてね。**
これが正解な手順ではないため、参考として読んでみてください。

# 対処方法
###１．ドライバーのアップデートを実施する。
　　私は、「Dell Command | Update」を実施し、デスクトップ上の動作が正しくなった。

###２．Windows内のストレージの設定を確認する。
　１） Windows の設定画面から「システム」の「ストレージ」を開く。
　２）ストレージセンサーという項目＞スイッチがオンになっている場合、オフ。

####すでにオフになっている場合、下記を確認。
１）スイッチの下にある「ストレージセンサーを構成するか、今すぐ実行する」のリンクをクリック
２）画面の一番下にある「[ダウンロード]フォルダーに保存してから次の期間が過ぎたファイルを削除する」の項目を「許可しない」に設定。
　
###３．その後も改善しない場合、windows側の問題の可能性がある。修復作業を実施。

####■コマンドプロンプトにて修復を行う
※コマンドプロンプトの起動方法：画面左下の[ここに入力して検索]欄に｢cmd｣と入力する。
または[スタートボタン]⇒[Windowsシステムツール]⇒[コマンドプロンプト]を右クリックして[その他]⇒[管理者として実行]をクリック

####下記コマンドを入力してEnterキーを押下
1. sfc /scannow
　不足または破損しているWindowsのシステム ファイルを修復できるコマンド。

2. chkdsk c: /f
　コマンドを入力すると、「スケジュールしますか？」というMSGが出ますので、
　Yキーを押してEnterキーで進め、OSを再起動すると開始されます。
　chkdsk c: /f でエラーの修正が出来ないときは更に強力な「chkdsk c: /r」を試すといい。
[初心者向け]Gitのコメントログのテンプレートをササッと見たいよね。



## コミットログのサンプルが見たいのよ。
突然ですが、gitでいい感じにコミットログを残したいと思いませんか。

私はターミナル派なのでgitのコマンドもターミナルからバシバシ打ち込みます。
しかし、いい感じのコミットログをさらっと打ち込むことができません。
絵文字使いたいけど、、覚えていません。なので検索したり過去コミットからコピーしたりです。

コマンドでコミットログのサンプルがササッと見れればいいのになと思ったのです。

## すぐに見れるように作りました。

```sh:.bash_profile
function git-m {
  echo "# ==================== Emojis ==================== "
  echo "# 🎉  :tada: 初めてのコミット（Initial Commit） "
  echo "# 🔖  :bookmark: バージョンタグ（Version Tag） "
  echo "# ✨  :sparkles: 新機能（New Feature） "
  echo "# 🐛  :bug: バグ修正（Bugfix） "
  echo "# ♻️  :recycle: リファクタリング(Refactoring) "
  echo "# 📚  :books: ドキュメント（Documentation） "
  echo "# 🎨  :art: デザインUI/UX(Accessibility) "
  echo "# 🐎  :horse: パフォーマンス（Performance） "
  echo "# 🔧  :wrench: ツール（Tooling） "
  echo "# 🚨  :rotating_light: テスト（Tests） "
  echo "# 💩  :hankey: 非推奨追加（Deprecation） "
  echo "# 🗑️  :wastebasket: 削除（Removal） "
  echo "# 🚧  :construction: WIP(Work In Progress) "
  echo " "
  echo " "
  echo "# ==================== Format ==================== "
  echo "# :emoji: Subject "
  echo "# "
  echo "# Commit body... "
}
```

.bash_profileあたりにこれをコピーしてもらえればすぐに利用することができます。

```sh
$ git-m
# ==================== Emojis ====================
# 🎉  :tada: 初めてのコミット（Initial Commit）
# 🔖  :bookmark: バージョンタグ（Version Tag）
# ✨  :sparkles: 新機能（New Feature）
# 🐛  :bug: バグ修正（Bugfix）
# ♻️  :recycle: リファクタリング(Refactoring)
# 📚  :books: ドキュメント（Documentation）
# 🎨  :art: デザインUI/UX(Accessibility)
# 🐎  :horse: パフォーマンス（Performance）
# 🔧  :wrench: ツール（Tooling）
# 🚨  :rotating_light: テスト（Tests）
# 💩  :hankey: 非推奨追加（Deprecation）
# 🗑️  :wastebasket: 削除（Removal）
# 🚧  :construction: WIP(Work In Progress)


# ==================== Format ====================
# :emoji: Subject
#
# Commit body...
```

いい感じです。
お好みのテンプレートに編集するのも簡単です。
コミット時のルールがあればそれも追記とかすればいいかと思います。

## gitにはコミットテンプレートあるよ。

gitにはコミットログのテンプレートを用意する方法があります。

```
$ git config --global commit.template ~/.gitmessage.txt
```

ですがこれだとプロジェクトごとにテンプレートを用意したりと大変です。
フロントやバックエンドでプロジェクトが別れている場合もあります。
なので、自身のマシンに設定してしまいましょう。

そうすると簡単にコミットログのテンプレを確認することができます。
表示してコピーして利用です。

お手軽ですね。

簡単ですがコミットログをササッと確認するための方法でした。
【Kotlin】マーカーインターフェースの使い方

クラスに属性を持たせて、属性によって何かしら処理を変えたいときに使用。

## 使い方
### 1. マーカーインターフェースの作成

```Marker.kt
interface Marker
```

### 2. クラスにマーカー付与
```SampleClass.kt
class SampleClass : Marker
```

### 3. クラスがマーカー付与されているかどうか判別
```kotlin
fun hoge(fuga: Any) {
    when (fuga) {
        is Marker -> {
            //何かしら処理
        }
        else -> {
            //何かしら処理
        }
    }
}
```
neo4jでsandbox その21

#概要

neo4jでsandboxやってみた。
mitre att&ckを投入してみた。


#MITRE ATT&CK

Adversarial Tactics, Techniques, and Common Knowledge
(敵対的戦術、技術、および共有知識)は、攻撃者の振舞いのモデルおよびナレッジベースです。
攻撃者が利用する可能性のある200種類以上の手法を集めた包括的なナレッジベースおよび複合的なフレームワークです。
具体的な手法や一般的な手法をはじめとして、良く知られた敵対者グループとその戦術に関するコンセプトや背景情報が含まれています。

#nodeの説明

|ATT&CK |node |説明 |
|:--|:--|:--|
|intrusion-set    |Group     |   攻撃者|
|malware          |Software  |   マルウェア|
|tool             |Tool      |   ツール|
|attack-pattern   |Technique |   攻撃手口|
|course-of-action |Technique |   攻撃手口|

#攻撃者グループATP1をクエリー

攻撃者グループATP1が使うマルウェア

```
APT1	uses	Software	Seasalt
APT1	uses	Software	PoisonIvy
APT1	uses	Software	WEBC2
APT1	uses	Software	BISCUIT
APT1	uses	Software	GLOOXMAIL
APT1	uses	Software	CALENDAR
```

攻撃者グループATP1が使うツール

```
APT1	uses	Tool		xCmd
APT1	uses	Tool		Cachedump
APT1	uses	Tool		Pass-The-Hash Toolkit
APT1	uses	Tool		PsExec
APT1	uses	Tool		Net
APT1	uses	Tool		gsecdump
APT1	uses	Tool		Lslsass
APT1	uses	Tool		Mimikatz
APT1	uses	Tool		ipconfig
APT1	uses	Tool		Tasklist
APT1	uses	Tool		pwdump
```

#攻撃者グループATP3をクエリー

攻撃者グループATP3が使うマルウェア

```
APT3	uses	Software	SHOTPUT
APT3	uses	Software	OSInfo
APT3	uses	Software	PlugX
APT3	uses	Software	RemoteCMD
```

攻撃者グループATP3が使うツール

```
APT3	uses	Tool		LaZagne
APT3	uses	Tool		schtasks
```

#マルウェアBISCUITを使う攻撃者グループ

```
BISCUIT		APT1
```

#マルウェアASPXSpyを使う攻撃者グループ

```
ASPXSpy		APT41
ASPXSpy		APT39
ASPXSpy		Night Dragon
ASPXSpy		Threat Group-3390
```

以上。
KUSANAGIでドキュメントルートを変更するとSSL証明書が更新できない問題

## 問題点
### ドキュメントルートを変更したいときがある
KUSANAGIでWebサーバを立てると、デフォルトでドキュメントルートが DocumentRoot というディレクトリになります。しかし、このドキュメントルートを変更したくなる場合があります（例えば、Laravel環境構築の場合など https://qiita.com/tajima_taso/items/f139eb71423041120247 ）。
ドキュメントルートの変更は簡単で、 nginx または Apache の設定ファイルを編集すればできます（詳しくは上記の記事を参照）。

### しかし、ドキュメントルートを変更するとSSLの問題が
ただし、ドキュメントルートを変更してしまうと、SSLの自動更新、手動更新いずれもうまくいかなくなります。SSLの証明書の期限が過ぎて気付く場合が多いと思います。

↓SSL証明書が切れると、こんな感じで保護されていない通信って表示されます
![スクリーンショット 2020-12-10 15.13.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276819/4ed1ff21-f297-d383-883d-68685f9fbc83.png)

私もまんまと引っかかりました ＼(^o^)／

そこで、どうすればSSL証明書の更新で不具合を出さずにドキュメントルートを変更できるのか、その方法を解説します！

## ご注意
この記事は、 KUSANAGI8 での対処方法を記載しています。
最新版の KUSANAGI9 では対処方法が一部異なる可能性があります。
詳しくは、 [こちら](https://kusanagi.tokyo/kusanagi9/document/changes/) をご覧ください。

## どうすればSSL証明書の更新で不具合を出さずにドキュメントルートを変更できるのか
### 1. まずは普通にプロファイルを作成する
KUSANAGI公式サイトの手順に従い、プロファイルを作成しましょう。
このとき、SSLの設定も忘れずにやりましょう。
（下記参照サイトの 4. Let’s Encryptの設定 をスキップせずに入力しましょうということです）
https://kusanagi.tokyo/document/kusanagi-provision/

### 2. ドキュメントルートを変更する
nginx または Apache の設定ファイルを編集してドキュメントルートを変更します。
Laravelの場合は下記参照
https://qiita.com/tajima_taso/items/f139eb71423041120247

### 3. Let's Encrypt の設定ファイルを編集する
まず /etc/letsencrypt/renewal ディレクトリに移動します。
`cd /etc/letsencrypt/renewal`

そして、ファイル一覧を取得します
`ls -l` または `ll`

すると、自分の設定したドメイン名が含まれるファイルがあると思います。そのファイルを編集します。
expample.com というドメインで example という名前のプロファイルを作成したと仮定して話を進めます（適宜ご自分のドメイン・プロファイル名に読み替えてください）。
その場合、 `example.com.conf` というファイルを編集することになります。

そのファイルの最後の方に、下記のような記述があると思います。

```example.com.conf
[[webroot_map]] 
example.com = /home/kusanagi/expample/DocumentRoot
www.example.com = /home/kusanagi/example/DocumentRoot
```

この最後の2行を独自に設定したドキュメントルートに変更する必要があります。
例えばLaravelのディレクトリ構成であれば、下記の通り変更します。


```example.com.conf
[[webroot_map]] 
example.com = /home/kusanagi/example/DocumentRoot/public
www.example.com = /home/kusanagi/example/DocumentRoot/public
```

ファイルを保存した後、SSL証明書更新のコマンドをたたいてみましょう。
`kusanagi update cert`

これでエラーが出なければ、正常に設定できています！
お疲れ様でした！
fastifyをDockerで動かしてみてハマったポイント

## はじめに
node.jsでメジャーなWeb Framworkは[express]('https://expressjs.com/')で長らく使っていましたが。
[fastify]('https://www.fastify.io/')についての記事を多く見かける様になったの使ってみました。
その際にDockerで実行環境を構築した時にハマったポイントを記載します

## 実行環境
os: mac os X 10,14,6
node.js: v14.15.0
docker: v19.03.13

## ハマったポイント
fastifyはデフォルトでリッスンするホストが`127.0.0.1（localhost）`でdocker環境で実行した場合にportをexposeしていてもapiエンドポイントに接続できない。
※ expressはデフォルトが`0.0.0.0`

127.0.0.1でもLocal環境での実行なら問題はありませんが、docker環境で実行すると問題が発生します。
それは、ホストのlocalhostとdockerのlocalhostは違うという事です。(別ネットワーク)
なので、コンテナをrunして`localhost:port`でアクセスしても繋がりません。
なので別ホストから接続が出来るように`0.0.0.0`でリッスンしましょうという事です。

## 解決方法
expressと同じ仕様だろうと思わず、ちゃんとドキュメントを読みましょうという事でした。
[引用]('https://www.fastify.io/docs/latest/Getting-Started/#your-first-server')

- 対処前

```
=== 省略 ===
fastify.listen(3000, function (err, address) {
  if (err) {
    fastify.log.error(err)
    process.exit(1)
  }
  fastify.log.info(`server listening on ${address}`)
})
```

- 対処後

```
=== 省略 ===
fastify.listen(3000, '0.0.0.0', function (err, address) {
  if (err) {
    fastify.log.error(err)
    process.exit(1)
  }
  fastify.log.info(`server listening on ${address}`)
})
```

- express（参考）

```
app.listen(3000);
```
VC間での値の受け渡し

  


VC間での値の受け渡しについてざっくりとですが説明して行きたいと思います

####0.完成イメージ


https://twitter.com/kou09010901lam1/status/1336923280180092929?s=20####1. コード


####2.解説
左上のFILE->New->cocoa touch で ViewControler2 を作ります。
Viewcontrolerの値をViewControler2に渡します。
渡すのはテキストフィールに入力してその文字列を渡して行きたいと思います。

ViewControler
 

 ```
@IBOutlet weak var text: UITextField!
  var present = ""
override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let VC = segue.destination as! ViewController2
        VC.present2 = text.text!
    }
```

view controler2

```
    @IBOutlet weak var Label: UILabel!
    var  present2 = ""
    override func viewDidLoad() {
        super.viewDidLoad()
        Label.text = present2
    }
```
#####override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
segueが実行される前に呼び出されるメソッドです。
overrideして
#####  let VC = segue.destination as! ViewController2
遷移先画面のViewControllerを取得します



####3.関連記事
[Qlita]
[Qlita]
[Qlita]
[Qlita]
####4.最後に
簡単ですね。遷移先がナビゲーションコントローラーだった場合は少しややこしいので次回またあげてやっていきたいと思います。