OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScript(JS)で変数宣言　書き方を整理してみた

今回はJavaScript(JS)の変数宣言の書き方に関してお伝えしていきたいと思います。


JavaScriptでの宣言のパターンについて、列挙してみました。

好みの問題もあるかと思いますが、チーム内で話し合う際の材料になれば幸いです。

### 変数宣言の書き方　値代入の場合

#### パターン1　改行＆変数ごとに`let`をつける
```javascript
let userId = 1;
let user = 'kumkum';
let age = 29;
```

#### パターン2　1行にまとめて書く
```javascript
let userId = 1, userName = 'kumkum', age = 29;
```

#### パターン3　改行＆末尾カンマでつなげる
```javascript
let userId = 1,
  userName = 'kumkum',
  age = 29;
```

#### パターン4　改行＆先頭にカンマでつなげる
```javascript
let userId = 1
  , userName = 'kumkum'
  , age = 29;
```

#### 有名フレームワークはどのように書いているのか？
※コードを全てチェックできていないので、他の書き方が存在しているかもしれません。ご了承願います。

##### Vue.js
```javascript
// src/compiler/parser/filter-parser.js
let inSingle = false
let inDouble = false
let inTemplateString = false
let inRegex = false
 
// test/unit/modules/vdom/modules/dom-props.spec.js
const vnode = new VNode('a', { domProps: { src: 'http://localhost/' }})
const elm = patch(null, vnode)
```
Vue.jsはパターン1の書き方をしていますね。

##### React.js
```javascript
// packages/scheduler/src/TracingSubscriptions.js
let didCatchError = false;
let caughtError = null;

// scripts/release/utils.js
const {exec} = require('child-process-promise');
const {createPatch} = require('diff');
```
React.jsもパターン1の書き方ですね。

### 変数宣言の書き方　宣言のみの場合

#### パターン1　改行＆変数ごとに`let`をつける
```javascript
let userId;
let userName;
let age;
```

#### パターン2　1行にまとめて書く
```javascript
let userId, userName, age;
```

#### パターン3　改行＆末尾カンマでつなげる
```javascript
let userId,
  userName,
  age;
```

#### パターン4　改行＆先頭にカンマでつなげる
```javascript
let userId
  , userName
  , age;
```

#### 有名フレームワークはどのように書いているのか？

##### Vue.js
```javascript 
// src/compiler/parser/index.js 
let delimiters
let transforms
let preTransforms
let postTransforms

// src/compiler/parser/filter-parser.js
let c, prev, i, expression, filters
```
Vue.jsはパターン１とパターン２の書き方が混在していました。
ざっと見た感じだと、全文字数が短い場合はパターン２（1行にまとめる）の書き方をしているようです。

##### React.js
```javascript
// packages/react-devtools-shared/src/__tests__/profilingCharts-test.js
let React;
let ReactDOM;
let Scheduler;
let SchedulerTracing;

// scripts/babel/__tests__/transform-test-gate-pragma-test.js
let shouldPass;
let isFocused;
```
React.jsはパターン１の書き方をしていました。
値代入あり、なしに関わらず、全て1行ごとに変数宣言しているようです。


### 参考文献
・現代の JavaScript チュートリアル
https://ja.javascript.info/variables
・Vue.js(Github)
https://github.com/vuejs/vue/search?p=3&q=let&unscoped_q=let
・React.js(Github)
https://github.com/facebook/react/search?p=4&q=let&unscoped_q=let
物理サーバーと仮想サーバーのいいとこ取り ベアメタルクラウドとは？

# ベアメタルクラウドとは？
クラウド経由で物理サーバーを提供するサービスのこと。ユーザーに対して専有の物理サーバーが提供され、ユーザーはそのサーバーをクラウドを通して利用することができる。  

![001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668115/a0d70c18-64fe-85bb-ae97-e38229b42360.jpeg)


# ベアメタルクラウドの特徴
物理サーバーのメリットと仮想サーバーのメリットを兼ね備えているのが特徴。  

物理サーバーなので高い処理能力を持ち、動作も安定している。  
ユーザー専有のサーバーなので他のユーザーからの影響を受ける心配もない。  

また、仮想サーバーのように利用を申込むと自動的にユーザーにサーバーが割り当てられるのですぐに使え、料金は利用期間に応じた課金制なので初期費用もかからない。  

サーバーの操作（電源操作、バックアップ作成、サーバー複製、サーバー規模拡大・縮小等）もクラウド経由で簡単に行うことができる。

![002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668115/0700a156-8aa2-1f5f-9936-468d557e280f.jpeg)


# ベアメタルクラウドとベアメタルサーバー
似たような言葉に「ベアメタルサーバー」というものもあるが、ベアメタルクラウドとベアメタルサーバーは意味が異なるので注意。  

「ベアメタルサーバー」とは「ホストOSを使わずハイパーバイザーを使う仮想サーバー」のこと。  

しかし、ベアメタルクラウドのことをベアメタルサーバーと呼んでいることもあるので、「ベアメタルサーバー」という言葉がどちらの意味（クラウド経由で使う専有物理サーバー or ハイパーバイザーを使う仮想サーバー）かは前後の文脈から判断が必要。

# まとめ
* ベアメタルクラウドとはクラウド経由で物理サーバーを提供するサービスのこと
* 物理サーバーのメリットと仮想サーバーのメリットを兼ね備えている
* ベアメタルサーバーと呼ばれることもあるが、ベアメタルサーバーという言葉には別の意味もあるので注意
APIとは？

# APIとは？
APIとは「Application Programming Interface」の略であり、アプリ開発者向けに公開されているソフトウェアを呼び出す機能のこと。  
開発者はアプリにAPIを導入することで様々な機能を簡単に実装することができる。  
例えばECサイトを開発する場合、開発者はクレジットカード決済のAPIを利用すれば決済に関するプログラムを開発する必要がなく、かつ安全なカード決済機能を実装することができる。

![001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668115/d4f923ef-19cb-ebb3-3d76-70827c0fe93d.jpeg)

![002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668115/4dfb751e-b3b8-f356-7431-9d886d2305c2.jpeg)


# いろいろなAPI
世の中には便利なAPIがたくさんあるので、その中の一部を紹介。

## Google Maps Platform

https://cloud.google.com/maps-platform/?hl=ja

アプリ内にGoogleマップやストリートビューを表示することができるAPI。経路検索なども可能。

## PAY.JP

https://pay.jp/

クレジットカード決済処理を導入するAPI。カード情報を自作アプリのサーバーで管理せずPAY.JP側で管理してくれるので、販売サイトなどを作成するときに安全な決済処理を簡単に実装することができる。

## Twitter

https://developer.twitter.com/en

ツイート投稿やタイムラインの取得等、ツイッターの機能を導入するAPI。自分が開発したアプリからツイートを投稿したり、タイムラインを取得することができるようになる。

## ぐるなび

https://api.gnavi.co.jp/api/

アプリ内に飲食店の検索機能を導入したり、飲食店の詳細情報表示することができるAPI。

## 天気予報

https://tenkiapi.jp/

天気予報や湿度、紫外線、花粉などの指数情報を取得するAPI。取得した情報を自分が開発したアプリの中で利用することができる。

# まとめ
* APIとは「Application Programming Interface」の略、アプリ開発者向けに公開されているソフトウェアを呼び出す機能のこと
* APIを利用することで、便利な機能を簡単に実装できる
* 世の中には多種多様なAPIが公開されている
Ruby 二次元配列とは？

# 二次元配列とは？
二次元配列とは、配列を要素に持つ配列のこと。

```ruby
# 例：
number_arrays = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
color_arrays = [["red", "yellow", "blue"], ["white", "black", "gray"]]
```

二次元配列を使用することで、二次元（平面）のデータを表すことができる。  
例：マス目の状態（◯ or ✕）を二次元配列で表現する  
  
![001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668115/3404d4ba-2cf3-610c-eee5-7779d0003ffd.jpeg)

```ruby
# ◯：1, ✕：0 とする
arrays = [
  [1, 1, 0, 0],
  [1, 1, 1, 1],
  [0, 1, 1, 1],
  [1, 1, 0, 1],
  [1, 0, 1, 1]
]
```

# 二次元配列の使い方
## 二次元配列の作成
二次元配列は通常の配列と同じように作成できる。

```ruby
# 直接定義して作成
arrays = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# 空の配列arraysを定義し、その中に配列を追加して作成
arrays = []
arrays << [1, 2, 3]
arrays << [4, 5, 6]
arrays << [7, 8, 9]

arrays #=> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
```

## 値の取得
二次元配列内の配列を取得するには  
**変数名[取得する配列のインデックス番号]**  
のように記述する。

```ruby
arrays = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

arrays[0] #=> [1, 2, 3]
arrays[1] #=> [4, 5, 6]
arrays[2] #=> [7, 8, 9]
```

また、二次元配列内の配列の各要素を取得するには  
**変数名[取得する配列のインデックス番号][取得する要素のインデックス番号]**  
のように記述する。

```ruby
arrays = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

arrays[0][0] #=> 1
arrays[0][1] #=> 2
arrays[0][2] #=> 3
arrays[1][0] #=> 4
arrays[1][1] #=> 5
arrays[1][2] #=> 6
arrays[2][0] #=> 7
arrays[2][1] #=> 8
arrays[2][2] #=> 9
```

# 二次元配列用のメソッド
二次元配列用のメソッドもある。
## transpose
transposeメソッドを使用すると、二次元配列の行と列を入れ替えた二次元配列を作成できる。

```ruby
# 例：

arrays = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

# arraysを平面で表すと以下のようになる
# arrays = [
#   [1, 2, 3],
#   [4, 5, 6],
#   [7, 8, 9]
# ]

transposed_arrays = arrays.transpose
transposed_arrays #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]

# transposed_arraysを平面で表すと以下のようになる
# transposed_arrays = [
#   [1, 4, 7],
#   [2, 5, 8],
#   [3, 6, 9]
# ]
```

## flatten
flattenメソッドを使うと、二次元配列を平坦化（中の配列をバラす）した配列を作成できる。

```ruby
# 例：

arrays = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened_arrays = arrays.flatten
flattened_arrays #=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

# まとめ
* 二次元配列とは、配列を要素に持つ配列のこと
* 二次元配列を使うと平面のデータを表現できる
* 二次元配列内の配列や値はインデックス番号を指定することで取得できる
* transpose, flattenなどの二次元配列に使用できるメソッドもある
SwiftでFirebaseAppの「Use of unresolved identifier 'FirebaseApp'」が消えない....

# はじめに
SwiftでFirebase使って、アプリを作っているのですが、最初問題なくビルドできていたのに、途中から、「Use of unresolved identifier 'FirebaseApp'」エラーが出始めて、エラーが表示されるけどビルドは通るのだが、何度もビルドしていると、そのうち、ビルドすら通らなくなったので、調べて解決できたので...

# 更新履歴
2020.8.14 初回投稿

# 環境
- macOS Catalina(10.15.5)
- Swift5.2.4
- Xcode11.6

# 現象
1.PodsでFirebaseインストール後、アプリ開発途中ビルドすると「Use of unresolved identifier 'FirebaseApp'」エラー発生。しかし、ビルドは通る

2.何度かビルドを繰り返すと、ビルドが通らなくなる。

# 試したこと
1.↓を参考にpod updateなどを試みる
https://qiita.com/cusa/items/e0a7b6f2a87f99e00cd8
しかし、ある日これを試してもダメになってしまった。

2.さらに調べて、↓を参考に、import FirebaseCoreを追加してみる
https://tomolog.reafo.io/jp/article/error-firebaseapp-unresolvedidentifier-ga-kienaitoki

あっさりエラー消えた....

# 結論
ちゃんとFirebaseインストールしてうまくビルドできていたのに、ある日急に、「Use of unresolved identifier 'FirebaseApp'」のエラーが出たら、「import FirebaseCore」をApp Delegateに追加してみる。
というか、最初から追加しておく。
Java SE, EE, ME, SDK, JDK, JRE, JVM ややこしい用語を図で解説

# Java SE、Java EE、 Java MEはプラットフォームの種類

![001.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668115/3bc99480-2d3d-c392-964a-2d50469b1d2e.jpeg)
  
Java SE、Java EE、 Java MEはJavaのプラットフォームの種類。
プラットフォームとは、Javaのプログラムを作成するための作成キットのことである。
プラットフォームにはAPIが含まれており、SE、EE、MEはそれぞれ含まれているAPIの種類が異なる。

# SDK、JDK、 JRE、 JVMはJavaの開発や実行に使うソフトウェア
SDK、JDK、 JRE、 JVMはJavaの開発や実行に使うソフトウェアの名称。
それぞれ図のような関係にある

![002.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/668115/e239b854-3d4c-8eaf-55bd-a752840aafa7.jpeg)
  
## JDKとSDKはプログラムを開発するキット
まず、プログラムを開発するのに必要なものが一通り含まれた開発キットのことをSDK (Software Development Kit)と言う。  
前述のプラットフォームは作成キットなのでプログラムを作成することしかできないが、SDKはプログラム作成する際に便利な機能が使えたり、作成したプログラムの実行、デバッグなどができる。  
その中でも、Javaプログラムを開発するための開発キットをJDK(Java Development Kit)と言う。つまり、JDKはJavaのSDKとも言える。

## JREはJavaプログラムを実行するためのソフトウェア
JDKの中にはJavaプログラムを実行するためのソフトウェアが含まれており、そのソフトウェアをJRE(Java Runtime Environment)と言う。

## JVMはOSの違いに対応するための仮想マシン
JREの中には、どのOS上でもJavaプログラムが実行できるようにするための仮想マシンが含まれている。その仮想マシンをJVM(Java virtual machine)と言う。

# まとめ
* Javaのプログラムを作成するキットをプラットフォームと言う
* Java SE、Java EE、 Java MEはJavaプラットフォームの種類で、含まれるAPIが異なる
* プログラム開発キットをSDKと言う
* JavaのSDKがJDK
* JREはJavaプログラムを実行するためのソフトウェアでJDKに含まれている
* JVMはどのOS上でもJavaプログラムが実行できるようにするための仮想マシンでJREに含まれている
mongoDBでドキュメント100万件のパフォーマンスを測ってみた

アプリでmongoDBを使う機会があったので
パフォーマンスを測ってみた

結論から言うと
<b>インデックスのないDBは遅すぎて使い物にならない</b>

実行環境は下記

|名称|スペック|
|:---|:---|
|OS|Ubuntu18.04|
|CPU|仮想6コア|
|メモリ|24GB|
|HDD|7200rpm(100IOPS相当)|

IOPSについては下記参照
https://qiita.com/you21979@github/items/21c125a6359d55e9dec4

<h1>INSERTの速度</h1>
挿入速度、一つのドキュメントは大体1kBに調整済み

![insert_speed_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334847/9767875f-0dd1-1b8b-ca0d-f8c47566b315.png)

insert_oneはひとつずつ、insert_manyは100万件まとめてぶっこんだ速度
後はインデックスが付いているか付いていないかの違い

挿入方法には速度の違いは大きく出たが
インデックスの有無では大きな違いはなかった

<h2>インデックスの数を変化させる</h2>

先ほどは１つのインデックスのみだったので
０、１、１０、２５、５０で変化させてみる

<h3>insert_many</h3>

![index_speed_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334847/b63c34be-6b4b-8e48-d120-923fe1c0cb74.png)

<h3>insert_one</h3>

![index_insert_one_speed_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334847/21ecd2cb-728a-ac08-5e67-b0d398699691.png)


定説通りインデックスは大きくなればなるほど遅くなる
ちなみに今回のケースではインデックスの数は最大で61だった
(それ以上はエラー)

<h1>FINDの速度</h1>
100万件のドキュメントを100万件のリストで調べ終えるまでの時間
結論から言うと<b>インデックスなしは測定不能</b>

![find_speed_qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334847/c595654e-42f8-f521-41a3-d02c64baa694.png)

結局インデックスありのみの比較になってしまったが
二つの違いはfind_oneは一つのドキュメントが
findはカーソル(イテレータ)が返ってくるだけ

<h1>まとめ</h1>
今回はHDDだったのでSSDならかなり早くなるはず
何にせよ100万件程度だとDBをDBとして使うならインデックスは必須
だということがわかった
CentOS8 SELinux有効下でunboundが port 61000 で怒られる

# SELinux is preventing unbound from name_bind access on the udp_socket port 61000.

怒られる。しかもたまに。CentOS8。

## unbound outgoing-port

どうやらデフォルトは以下

```
	# permit unbound to use this port number or port range for
	# making outgoing queries, using an outgoing interface.
	# Only ephemeral ports are allowed by SElinux
	outgoing-port-permit: 32768-65535
```

__Only ephemeral ports are allowed by SElinux__だそうです。

```
# sysctl -a | grep net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 32768	60999
# semanage port -l | grep ephemeral_port_t
ephemeral_port_t               tcp      32768-60999
ephemeral_port_t               udp      32768-60999
```

ズレてる。

## unboundに61000以降のポートを使わないように設定

```
# unbound設定に不可範囲を設定。読み込まれ順で追加適応されるはず。
# CentOS8だと /etc/unbound/conf.d/outgoing-port-avoid.conf とかで良いのかな
server:
        outgoing-port-avoid: 61000-65535
```

### 参考

https://bugzilla.redhat.com/show_bug.cgi?id=1667742

Fedoraでは治ってるっぽいけどどう治ってるのか。

outgoing-rangeとかoutgoing-interfaceとかあるので別なベターな方法がありそう。

#### たぶんそのうちパッチ出ると思う
Ruby 文字列の中から文字を抽出 sliceメソッド

# sliceメソッドとは？
sliceメソッドとは、文字列の中から引数で指定した条件の文字を抜き出すメソッド。

```ruby
# 例：文字列 "Hello world" の頭から2文字目の "e" を抜き出す
string = "Hello world"
string.slice(1) #=> "e"

# 引数に該当する文字が見つからなければnilを返す
string.slice(11) #=> nil
```

# sliceメソッドの使い方
sliceメソッドは引数に、抜き出す文字の条件指定する。
引数の指定は以下の様な方法がある。

## 文字列の先頭 or 後ろから何文字目かを指定
文字列の先頭から何文字目かを指定する。番号は0から始まるのに注意（先頭の文字が0、先頭から2番目が1）

```ruby
string = "Hello world"

# 先頭から何文字目かを指定、先頭の番号は0
string.slice(0) #=> "H"
string.slice(1) #=> "e"
string.slice(2) #=> "l"
string.slice(3) #=> "l"
string.slice(4) #=> "o"
```

マイナスの値を指定することで、後ろから何文字目かを指定することもできる。その場合、一番後ろの文字が-1、後ろから2番目が-2のように数えられる。

```ruby
string = "Hello world"

# 後ろから何文字目かを指定、一番後ろの番号は-1
string.slice(-5) #=> "w"
string.slice(-4) #=> "o"
string.slice(-3) #=> "r"
string.slice(-2) #=> "l"
string.slice(-1) #=> "d"
```

## 文字列の先頭 or 後ろから何番目かと、そこから何文字かを指定
文字列の中の範囲を指定して文字を抽出する。始まりの位置と、そこから何文字抽出するかを指定する。この場合も、番号は0から始まる。

```ruby
string = "Hello world"

# 先頭(0番目)から5文字抽出
string.slice(0,5) #=> "Hello"

# 6番目から5文字抽出
string.slice(6,5) #=> "world"
```

始まりの位置にマイナスの値を指定することで、後ろから何文字目かを指定することもできる。この場合も一番後ろの文字が-1、後ろから2番目が-2のように数えられる。

```ruby
string = "Hello world"

# -11番目から5文字抽出
string.slice(-11,5) #=> "Hello"

# -5番目から5文字抽出
string.slice(-5,5) #=> "world"
```

## 抽出したい文字を直接指定
特定の文字を指定して抽出する。

```ruby
string = "Hello world"

# "H"を指定
string.slice("H") #=> "H"

# "Hello"を指定
string.slice("Hello") #=> "Hello"

# 含まれていない文字を指定するとnilを返す
string.slice("hello") #=> nil
```

## 正規表現で指定
抽出したい文字を正規表現で指定する。

```ruby
string = "Hello world"

# 正規表現で「wから始まってdで終わる文字」を指定
string.slice(/w.*d/) #=> "world"
```

## 範囲演算子で範囲を指定
範囲演算子( .. , ... )を使って文字列内の範囲を指定し、文字を抽出する。この場合も、番号は0から始まる。

```ruby
string = "Hello world"

# 先頭(0番目)から4番目まで抽出
string.slice(0..4) #=> "Hello"

# ...にすると範囲の終わりの文字を含まない
string.slice(0...4) #=> "Hell"
```

# sliceメソッドとslice!メソッドの違い
slice!というメソッドもあるが、こちらもsliceメソッドと同じように文字列の中から文字を抽出して返すメソッドである。引数の指定方法もsliceメソッドと同じ。ただし、slice!メソッドを使うと、抽出した文字は元の文字列から取り除かれる。

```ruby
string = "Hello world"

# sliceメソッドを使用しても元のstringは変わらない
string.slice(0..4) #=> "Hello"
string #=> "Hello world"

# slice!メソッドを使用すると元のstringから文字列が取り除かれる
string.slice!(0..4) #=> "Hello"
string #=> " world"
```

# まとめ
* sliceメソッドは文字列から文字を抽出するメソッド
* 引数に指定した条件で文字を抽出する
* 引数は文字の順番や正規表現、範囲で指定できる
* slice!メソッドは元の文字列から文字を取り除く
Java 配列の作り方

# 配列を作る3ステップ
配列を作るには3つのステップが必要。

1. 配列の変数を宣言
1. 配列の要素を作成
1. 値を代入

イメージとしては

1. 大枠の箱（配列の変数）を作る
1. 箱の中に仕切り（配列の要素）を作る
1. 仕切りの中にモノ（値）を入れる

といったところ。

## 1. 配列の変数を宣言
配列の変数を宣言するには以下のように記述する。

```
配列要素のデータ型[] 配列の変数名;
```

配列要素のデータ型は、配列の中に代入する要素のデータ型。
整数なら int[]、少数なら double[]、文字列ならString[]のようになる。  
  
配列の変数名は、配列の中身を表す英語の複数形にするのが基本。
配列の中身がテストの点数の数字なら scores、色の名前の文字列なら colorsなど。

例：整数の配列 numbers を定義する

```java
//整数なのでデータ型は int、データ型の後ろに[]をつけて定義する
int[] numbers;
```

## 2. 要素を作成
要素を代入するには以下のように記述する。

```
配列の変数名 = new 要素のデータ型[要素の数];
```

先程宣言した変数に対して、配列の要素を作成する。

要素のデータ型は変数を宣言したときのデータ型と同じもの。 
要素の数は配列に入れたい値の数。  
  
例：先程定義した配列 numbersに3つの要素を代入

```java
// numbersは整数の配列なのでデータ型はint
// 要素は3つなので要素の数は[3]
numbers = new int[3];
```

## 3. 値を代入
配列に値を代入するには以下のように記述する。

```
配列の変数名[index番号] = 代入したい値;
```

例：numbersに整数10, 20, 30を代入する

```java
// index番号は0から始まるので注意
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
```

尚、配列の要素を作成した後、値が入っていない場合はコンパイルした際にデータ型に応じて自動で値が代入される。（int なら0、String ならnull など）

# 配列作成と値の代入をまとめて記述する
上記の3ステップを踏んで配列を作成すると以下のようになる。  
  
例：整数の配列 numbersを作り、整数10, 20, 30を代入

```java
// 変数を宣言
int[] numbers;

// 要素を作成
numbers = new int[3];

// 値を代入
numbers[0] = 10;
numbers[1] = 20;
numbers[2] = 30;
```

しかし、これらは以下のようにまとめて記述することも可能。

```
配列要素のデータ型[] 配列の変数名 = {値1, 値2, 値3, ...};
```

```java
//例：整数の配列 numbersを作り、整数10, 20, 30を代入
int[] numbers = {10, 20, 30};
```
Jetson Xavier 起動時にコマンド実行

覚書として。。。
Jetson起動時に指定プログラムを実行する設定を行う。

## １．/etc/rc.local　以下に指定ファイル格納

```
sudo /etc/rc.local
```

最初の一行目は'#!/bin/sh'を入力。

システム起動時に一度だけ実行するCron（クローン）の設定

```
              string         meaning
              ------         -------
              @reboot        Run once, at startup.
              @yearly        Run once a year, "0 0 1 1 *".
              @annually      (same as @yearly)
              @monthly       Run once a month, "0 0 1 * *".
              @weekly        Run once a week, "0 0 * * 0".
              @daily         Run once a day, "0 0 * * *".
              @midnight      (same as @daily)
              @hourly        Run once an hour, "0 * * * *".
```

#cronの実行ログを残す設定
rsyslogの設定ファイル下記参照（JetsonXavierの場合）

```
/etc/rsyslog.d/50-default.conf
```
を開くと

```
#cron.*				/var/log/cron.log
```
＃でコメントアウトされているので、＃を消去。これをnanoコマンドで行う。

```
sudo nano /etc/rsyslog.d/50-default.conf
```

ログを確認

```
tail -f /var/log/cron.log
```

#参考
[LINK：初心者向けシェルスクリプトの](https://qiita.com/zayarwinttun/items/0dae4cb66d8f4bd2a337)

[【cron】定期的に処理を行う【MacOS】【Linux】](https://qiita.com/shunyooo/items/69c3523a8c500b37f33f)

[cron力をつけよう！全てのcrontab入門者に贈る9個のテクニック](http://dqn.sakusakutto.jp/2012/06/cron_crontab9.html)
Java よく使う命令一覧（初心者、入門者向け）

# よく使う命令一覧
## コメントアウト

```java
// 1行ならスラッシュ2つ

/* 複数行なら
  スラッシュと
  アスタリスクで囲む
*/
```

## キーボードから1行の文字列を受け取る

```java
// 入力した文字列を変数wordsに代入
String words = new java.util.Scanner(System.in).nextLine();
```

## キーボードから1つの整数を受け取る

```java
// 入力した整数を変数valueに代入
int value = new java.util.Scanner(System.in).nextInt();
```

## 文字列を表示（改行あり）

```java
System.out.println("表示する文字列");
```

## 文字列を表示（改行なし）

```java
System.out.print("表示する文字列");
```

## 文字列を整数に変換

```java
int n = Integer.parseInt(stringNumber);
```

例：文字列の1, 2を整数に変換して足し算する

```java
String s_1 = "1";
String s_2 = "2";

//文字列のまま足す -> 12が出力される
System.out.println(s_1 + s_2);

//整数に変換
int i_1 = Integer.parseInt(s_1);
int i_2 = Integer.parseInt(s_2);

//整数に変換してから足す -> 3が出力される
System.out.println(i_1 + i_2);
```

```
＜実行結果＞
12
3
```
Java 文字列をコンソール画面に出力する方法

# 文字列をコンソール画面に表示する命令
Javaで文字列をコンソール画面に表示する命令は2種類ある

```java
//命令1
System.out.print("Hello World!");

//命令2
System.out.println("Hello World!");
```

# 命令1 System.out.print();
System.out.print(); を使用するとコンソールに表示した文字列の後に**改行が入らない**

```java
//例：System.out.print(); で Hello World! を2つ表示する
System.out.print("Hello World!");
System.out.print("Hello World!");
```

実行結果は以下のようになる。

```
Hello World!Hello World!
```

# 命令2 System.out.println();
System.out.println(); を使用するとコンソールに表示した文字列の後に**改行が入る**

```java
//例：System.out.println(); で Hello World! を2つ表示する
System.out.println("Hello World!");
System.out.println("Hello World!");
```

実行結果は以下のようになる。

```
Hello World!
Hello World!
```

# まとめ
* Javaで文字列をコンソールに表示する命令はSystem.out.print(); と System.out.println();の2種類ある
* 2つの違いは文字列の後に改行が入るか入らないか
* System.out.print(); は改行が入らない
* System.out.println(); は改行が入る
Deep Securityに関する備忘録

## 近況報告
　勤務が始まってはや二週間。何ができるようになったとかは実感少ないけど，着実に進んでいるとは思うのでこれからもがんばっていく。

　スクールでの親交のあった同期が，新規開発事業に内定をもらった報告を頂きました。その人はスクールの時，同期の中でも擢ん出た成績を残し，さらに自身の勉強時間を犠牲にして同期のカリキュラムの進行を手助けするほどの聖人でした。
　先月，連絡を取った際にSESで妥協していたことを聞いて，「絶対もったいない」と思い，おこがましい話ですが就活を続ける打診をしたところ，そのあとも就活をつづけ，昨日，内定をいただいたとのことです。
　「私のおかげでがんばれた」って言われたのですが，私個人の考えでは，「その人の能力的にその結果は当然」であると思っていました。なので，そんなたいしたことはした気がしないのですが，感謝されるほどのgiveができる能力を自身が持っていることには自信を持たないとですよね。とにかく，本人がスクールに通っていた時から願っていた環境に就職できたことは本当に素晴らしいことだと思いました。そんなわけで，明日，ウィスキーで祝杯をあげに行ってきます。

# 本日のお題
Trend MicroのDSaaSのコンソール画面の備忘録（2020/08/14時点）

　昨日コンソール画面について上司からレクチャーを受けたので一部をここに残します。おもにイベントとレポートのタブは何を管理しているものなのかの把握がゴールです。

##DSaaSって
**Deep Security as a Service**
　噛み砕くとセキュリティの総合サービス。EC2などのサーバーに設置してセキュリティ関連の管理を行うもの。基本的にDSA（Deep Security Agent）をサーバーにインストールして同期し，DSaaSで管理する感じ。３０日の無料トライアルサービスが存在し，今回私はそれを用いた講義を上長から受けました。

現在，DSaaSではなく，WorkLoad Securityって名前らしい。

##イベントとレポート

<img width="1203" alt="スクリーンショット 2020-08-13 18.14.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614205/c2ef8a5c-58be-bc6d-8153-b206d8e90828.png">

###　システムイベント
　サーバー内で生じたイベントが流れる空間。
　ex.) パスワードの認証失敗とか

###　不正プログラム対策イベント
　ウィルスを見つけたら，「削除」「隔離」「駆除」してくれる，それに関するログが流れる。
「削除」・・・言葉の通りそのまま害悪なデータを削除する
「隔離」・・・害悪な因子を取り除き，隔離ファイルで管理する
「駆除」・・・害悪な因子を取り除き，削除する。

　ウィルスが混じっていても上のアクションが正常に取られているのであればセキュリティを憂いる必要がない。**問題なのは上のアクションが失敗した場合**。その場合はサーバーの中にウィルスが残留し続けているということなので，早急に解決する必要がある。

 　**検出ファイル**
 処理されたウィルスが表示される。そのウィルスがいつ，どこのサーバーで見つかって，どんなウィルスなのかが表示されるとのこと。

###　Webレプテーション(Reputation)イベント
　滅多に起こらない分，このイベントは危険度が高い.
　外部サイト，外部端末への不正な情報の送信を検知したらアラートが鳴る。そしてその通信を遮断する。HTTP通信をキャッチ。HTTPSは暗号化して予防しており，中間者攻撃を防いでいる。

**中間者攻撃**
正規クライアント　▶️▶️▶️▶️▶️▶️▶️▶️▶️▶️▶️▶️▶️▶️・・・・・・・・・・▶️　サーバー
　　　　　　        　　↑第三者が解析　　　　　　　↓別のURLに飛ばす

###　アプリケーションコントロール
　DSで許可したアプリケーション以外はブロックする。これにより，ユーザーが意図していないアプリケーションの起動を防ぐことができる。逆を言えば，この機能を利用していて，かつ，DS管理者とサーバー管理者が異なる場合，サーバー管理者はDS側の許可なくアプリケーションを本番環境に投入できないため，業務にラグが生じることがある。

###　変更監視イベント
　ファイルやディレクトリが変更された日付，権限の変更を管理する場所。しかし，変更された事実を管理するものではあるが，どこが変更されたか具体的な場所は追跡することができない。

###　セキュリティログ
　セキュリティログの監視。作業内容の確認など

### 　firewall
 めっちゃ噛み砕くと許可されたIPを通す機能。AWSでいうセキュリティグループのような役割。もしこの機能をオフにしても，侵入防御イベントがオンになっている場合はアラートが鳴る可能性がある。

###　侵入防御イベント
　侵入を防衛したことを残すアラート。
ex.) 攻撃確認▶️ブロック▶️どこからのアクセスか
　　　データ詳細から攻撃元のIPや攻撃方法が解析できる。
　　　善良なスキャンソフトがこれに引っかかる時もある。

###　アラートについて
　どのアラートを表示させるかはカスタマイズすることができる。またアラートが複数存在する場合，新しいアラートが出現した場合通知が出ないことがあるため，アラートが解決したらアラートを消去する癖をつける。
　DSaaSで検知した問題はDSaaSのコンソールで消せるが，DSAなど別の場所由来のアラートはDSaaSでは消せない。

## 終わりに
　セキュリティど素人のまとめです。アドバイスは24365お待ちしています。
Java 変数宣言の書き方

# 変数宣言の書き方
Javaで変数宣言をするときは以下のように記述する  
  
データ型 変数名;

```java
//例：整数型の変数 age と文字列の変数 name を宣言

int age; //整数型の変数 age
String name; //文字列の変数 name
```

# 変数名の付け方
変数名を付ける際には以下のような注意点がある

* 予約語（Javaの構文で使用する単語 if や void など）を使用しない
* すでに利用している変数名は使わない
* 大文字、小文字は区別される（例：name と Name は別の変数とみなされる）
* キャメルケースを利用することが望ましい（例：userName）
NuxtJSによる基本CRUDサンプル

NuxtJS初心者がアプリを作ろうとしています。
参考にできるソースとして、下記が見つかりました。

[Quickly Building RESTful UI’s in NuxtJS](https://itnext.io/quickly-building-restful-uis-in-nuxtjs-782bce539440)
[ソース（GitHub）](https://github.com/toadkicker/nuxt-crud-example)

下記のような、シンプルでありながら、技術要素としては充実した内容になっています。

### 画面例
![スクリーンショット 2020-08-14 11.15.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/c97b2d1f-38f2-b124-3c88-539117bb60db.png)

![スクリーンショット 2020-08-14 11.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/a86b14ad-f719-19aa-cf03-2b585c6204b5.png)

![スクリーンショット 2020-08-14 11.14.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/902c4692-15b2-c12a-07bd-e89236f77668.png)

![スクリーンショット 2020-08-14 11.15.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/4c09d9dd-f643-0652-1c6f-34de073f8778.png)

![スクリーンショット 2020-08-14 11.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77307/0e79c6f8-5e57-ab2c-ef88-7b0a92231957.png)

### 技術要素
@nuxtjs/auth ログイン・認証
@nuxtjs/axios 外部API参照
bootstrap-vue UIコンポーネント
vee-validate バリデーション
velocity-animate/vue-notification トースト通知
vue-moment 日付フォーマット
nuxt-i18n 多言語対応

## 環境構築

GitHub からソースを取得し、

```sh
yarn install
yarn dev
```

で、ポート3000でログイン画面は表示されます。
ただ、ログインするには、APIも起動しなければなりません。
そちらは[json-server](https://github.com/typicode/json-server)が使われています。
よく紹介されているのは、グローバルにインストールして、参照データを指定して、起動する

```sh
json-server --watch users.json --port 3001
```

という方式のようですが、今回は、fake-server.js が提供されているので、そちらを起動します。

ターミナルをもう一つ上げて、

```sh
node fake-server.js
```

これにより、ログインできるようになります。ID、パスワードは、users.json に書かれています。

## 若干のコメント
UIコンポーネントは、日本語ドキュメントの充実と、コンポーネントレベルだけでなく、レイアウトサンプルから提供されているという点で、Vuetify が良いなと思っていました。
https://vuetifyjs.com/ja/getting-started/pre-made-layouts/
が、BootstrapVue も王道の一つではあるでしょうから、こちらでやってみようと思います。

バリデーションについては、やはり、Vuetify を前提に、Vuetify の標準の v-form の仕組みだけで良いかなと思っていました。
https://vuetifyjs.com/en/components/forms/#validation-with-submit-clear
が、これについても、Vuelidate と、VeeValidate も合わせて紹介されていて気にはなっていたので、VeeValidate を使ってみることとしたいと思います。
アジャイル開発とは？

# アジャイル開発とは？
アジャイル開発とはシステムやソフトウェアの開発手法の1つで  
  
**「要件定義→設計→開発→実装→テスト→運用」**  
  
の開発工程を小規模なサイクルで繰り返す開発手法である。  
  
全ての機能に対して「要件定義→設計→開発→実装→テスト→運用」の開発工程を順に行っていくウォーターフォール開発と異なり、1つ1つの機能ごとに順次実装することで仕様変更に柔軟に対応しプロダクトの価値を最大化することに重きを置いているのが特徴。

# アジャイル開発のメリット
アジャイル開発のメリットは以下の通り

* 優先度の高い機能から実装に着手できる
* 早い段階で実装した機能を試すことができる
* 仕様変更に対応しやすい

# まとめ
* アジャイル開発とは機能ごとに「要件定義→設計→開発→実装→テスト→運用」を行う開発手法
* 仕様変更に柔軟に対応し、プロダクトの価値を最大化することに重きを置いている
* 優先度の高い機能から実装できる、仕様変更に対応しやすいなどのメリットがある
MVCモデルとは？

# MVCモデルとは？
MVCモデルとは、アプリケーションの設計パターンの1つであり  
M（Model  : モデル）、V（View : ビュー）、C（Controller : コントローラ）にそれぞれ機能を分担させた構造になっているものを指す。

# MVCモデルの特徴
モデル、ビュー、コントローラの3つを持ち、それぞれが以下のような役割を担っている。
## モデル（M）
ビジネスロジックを担当し、データベースに登録するデータの加工、データベース内の検索、取得したデータの加工などを行う。
## ビュー（V）
インターフェイス部分を担当し、クライアントに表示する画面を作成する。
## コントローラ（C）
クライアントとのやりとり担当し、クライアントからのリクエストに応じて、レスポンスに必要なデータを用意する。

# MVCモデルのメリット
* フロントサイドとサーバーサイドのコードが分離されているので、分業して開発しやすい
* コードの変更が他の機能に影響しなくて済むので保守性が高い

# まとめ
* MVCモデルとはアプリケーションの設計パターンの1つ
* モデル、ビュー、コントローラから構成され、それぞれが独自の機能を担う
* フロントサイドとサーバーサイド分離された構成なので、分業して開発しやすい
* コードの変更が他の機能に影響しなくて済むので保守性が高い
テストの分類とそれぞれの特性_メモ_20200814

#テストの種類と違いについて



**１．単体テスト**

　　**単体テスト**(UT:Unit Test)では、１つの部品について詳細なテストを行い、
　　その部品単体として完成していることを検証します。
　　たとえば、二つクラスがあるとしてそれぞれについて、すべてのメソッドを呼び出して
　　動作が正常であることを確認していきます。単体テストはクラスの開発者自信が担当することも多く、
　　ほとんどの不具合はこの段階で修正されます。



　　**＜単体テスト実施のメリット・デメリット＞**

　　・メリット

　　　　ひとつひとつをしっかりテストすることで工程の手戻りをなくすことができる。

　　・デメリット

　　　　コストがかかる
　　　　実施に当たってその機能に特化した動作を把握していることが必要とされます。
　　　　誰でもできるというわけではありません。
　　　　そしてテストには仕様書やテストケースの作成も必要で工数がかかります。


**２．２種類の単体テスト**

　　「単体テスト」という言葉は次の２つの異なるテストに利用されるため注意が必要です。


　　**・クラスの単体テスト**

　　　　ある１つのクラスを１部品とみなし、そのクラスをテストする。


　　**・機能の単体テスト**

　　　　ある１つの機能(例：権限参照機能)を実現する複数のクラスの集まりを１部品とみなし、
　　　　それらをまとめてテストする。



Javaのような新しめの言語から学び始める人は前者のようなものを単体テストと呼ぶそうです。
一方、いろいろな言語を使って開発に携わってきた人や、巨視的、客観的な観点に立つ
プロジェクト管理者などは後者の意図で単体テストという言葉を使うことが多いようです。

※筆者はどちらのタイプも経験したので単体テストの範囲がわからず混乱しました
どちらの意図であるかを判断できない場合は確認してみましょう。



**３．結合テスト**

　　単体テストが完了している完成部品をいくつかつないで動作させ、うまく連携して動作するかを
　　確認するのが**結合テスト**(IT:Integration Test)です。
　　たとえば単体テスト済みの３クラスを利用して権限登録を完了するまでの流れを実行してみるなどです。

　　例：「ログイン」→「権限登録画面に遷移」→「権限登録実行」→「権限登録完了画面に遷移」


　　**＜結合テスト実施のメリット・デメリット＞**

　　・メリット

　　　　品質が上がる
　　　　ユーザーの業務に耐え得るかどうかを確認できる。
　　　　結合テストで致命的なバグを洗い出すことによって
　　　　品質が上がります。

　　・デメリット

　　　　データの流れや基本設計レベルでそのプログラムを知っていない人がやれば
　　　　観点を正常に確認できない場合がある。
　　　　そしてバグによって手戻りが発生すれば、テストの進捗自体に大きな遅れが出てしまう点です。


**４．総合テスト(システムテスト)**

　　**総合テスト**(ST:System Test)は、すべての部品を結合して行う最後のテストです。
　　開発物がプログラムだけでなく、ハードウェアやネットワークも含めたシステム一式の場合、
　　本番本番でつかう機材の上でテストを行うことが一般的です。

　　ユーザーが運用するところまでをテスト範囲とする場合、運用テストと呼ばれる場合もあります。


　　**＜総合テスト実施のメリット・デメリット＞**

　　・メリット

　　　　品質が上がる
　　　　今までのテストで洗い出せなかったバグを最後の砦のように検出して
　　　　品質が上がる。

　　・デメリット

　　　　処理設計レベルでそのプログラムを知っていない人には実施ができない。
　　　　実施できる人が限られてくる。


いかがでしたでしょうか。筆者自身テスト区分をいまだに理解できていない部分があったので
今回学習しメモとして残しました。
インディーズゲーム「Abi」のシーンCPUコスト分析

本日共有したコンテンツは、LILITHが開発した人気のインディーズゲームAbiからのもので、現在高い評判を獲得しています。 該当プロジェクトをテストしたところ、ローエンドおよびミッドレンジの携帯電話でフレーム率が低く、デバイスの発熱の問題がより深刻になることがわかりました。開発スタッフとのコミュニケーションを通じて、問題の原因を分析し、分析プロセスとソリューションを共有しました。

---
##一、問題の説明
このシーンでゲームをテストすると、ローエンドデバイスとミッドレンジデバイスのパフォーマンスが低下し、デバイスの発熱問題がより深刻になります。
![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/e411c016-73ea-ccc1-1b69-9d634ea5bbe2.jpeg)

##二、問題の再現
開発チームから提供された例に対して分析した結果、ローエンドデバイス（Redmi 2 & Redmi Note 2）においてこの問題が再現されました。具体的なCPUコストは、下の図で示している。Redmi 2 & Redmi Note 2において、いずれも25フレーム以下となります。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/1fe85a43-9d9d-1701-f743-792c033644aa.png)
Redmi Note 2：Gfx.WaitForPresent – 平均46ms
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/cf9adb5c-ce01-ae5c-0c62-157bc7964e85.png)
Redmi Note 2：Gfx.WaitForPresent – 平均31ms

##三、問題の分析
Gfx.WaitForPresentはローエンドでの温度が持続的に高まっています。これは、現在のパフォーマンスのボトルネックがCPUではなくGPUにあることを示しています。そのシーンをテストした結果を踏まえて次のことがわかりました。

####（1）Android側でAA機能が無効になっています。
####（2）シーンには2つのRealtime Directional Lightがあり、両方のRealtimeシャドウがオンになっています。
####（3）シーンには5〜6個のRealtime Point Lightがあります。

検出結果から、シーンにはRealtimeの光源が多すぎます。これが、GPUの過剰な圧力の主な理由です。 シーン内の1つのDirectional LightのみをImportantな光源として予約し、他の光源は「Importantでない」に設定しましたRedmi Note2デバイスのパフォーマンスを次の図に示します。Gfx.WaitForPresentは平均14msに削減され、フレーム率は45FPSで安定しました。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/254abc8b-f477-3250-bdca-f3a250bbaa0c.png)
同時に、Directional LightのRealtimeシャドウをオフにしようとしましたが、パフォーマンスの向上は明らかではありません。これは、シャドウがGPU側の主なプレッシャーではないことを示しています。

さらに、2つの異なる状況でデバイスのコスト消費量もテストしました。 **最適化されていない場合、モバイルデバイス（テストデバイスはXiaomi 5S）の電力消費率は20.07％/時間です。Importantな指向性ライトを1つだけ予約すると、モバイルデバイスの電力消費率は16.44％/時間、つまりデバイス電力消費率は20％節約されます。**

##四、結論
上記の分析から、ローエンドデバイスとミッドエンドデバイスでの現在のゲームシーンの低フレーム率と主な理由は、GPUパフォーマンスの圧力が大きすぎることであり、根本的な原因はシーンで使用されているRealtime光源が多すぎることです。 **この点に関して、開発チームは、実際の状況に応じてシーン内のImportantなRealtime光源の数を可能な限り制御し、GPUのパフォーマンス圧力を軽減することをお勧めします。**

---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com
リクエストパラメーターとその型について

最近のAPIの開発に着手し始めて、クライアントから送られてくるリクエストパラメーターの型について意識し始めた。クエリストリングやボディーのフォーマットに応じてどのような型がくるのか整理したく記録に残す。


###クエリストリングで送られてくる場合

```
localhost:3000/shops?pageno=1&pagesize=60
```

キーに値が指定していればその値の型は`文字列`となる。

*ちなみに`key=value`の記述がない場合は`null`となり、`key=`のみ記述した場合はその値は`空文字列`となる。
*（Railsの場合）paramsで文字列として値がセットされるので、API側で文字列以外の値を使いたいときはその型へキャストする必要がある。

###ボディーで送られてくる場合

####ボディーのフォーマットが`Content-Type: application/x-www-form-urlencoded`の場合

WEBブラウザのフォームのリクエストでよく使われる。
キーに指定した値はRFC1866が定める変換フォーマットにしたがって`文字列`に変換される。

*（Railsの場合）paramsで文字列として値がセットされるので、API側で文字列以外の値を使いたいときはその型へキャストする必要がある。


####ボディーのフォーマットが`Content-Type: application/json`の場合

アプリのリクエストやAjaxのリクエストでよく使われる。
jsonは型を持つことができるので、`クライアント指定した型`を持った状態でリクエストを投げることができる。


###Chromeを使った確認方法

「右クリック＞検証＞Networkタブ」でリクエストとレスポンスの情報を確認することができる。

以下は、`Content-Type: application/x-www-form-urlencoded`でリクエストを投げた時の例。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/2d973d20-1fb4-0792-9017-07717014c5fd.png" width=90%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/bba5b037-ab3e-1855-9674-e3a46227b904.png" width=90%>
Cloudflare Access で簡単に認証機能を付けてみました！

#はじめに

本記事は[個人ブログ](https://blog.matsuda-yoshihiro.com/2020/08/cloudflare-access.html)からの複製記事です。

---
Cloudflare も使っているのですが、Cloudflare Access を使ったことがなかったので簡単にさわってみました。

https://www.cloudflare.com/teams-pricing/

Cloudflare Access もいくつかの機能があるのですが、今回は以下の様な構成でAlibaba Cloud Object Storage Service (OSS) に置いてある静的コンテンツにログイン認証機能を簡単に付けてみます。
なおオリジンは別に Amazon S3 でも良いと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/ec4189ed-376d-ec76-13f9-4644997856ff.png)

「Access を使えば、VPN を使用せず内部のアプリケーションに安全にアクセスできます。9月1日まで無料です。」
と表示されているので「Access を有効にする」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/e906f911-782e-a78f-d324-4bac6dd043e9.png)


「Access Premium」でアクティブユーザー数を「５」にすると書いてあるのでやってみます。
・・・課金発生しないか若干ドキドキしますが、`現在の請求額: $0.00`を信じて進みます😌

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/394c76b0-9bed-f82f-9478-10d22411542e.png)

`合計支払い額`が$0.00 なのを確認し購入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/c6ed0e73-a619-4fa7-5c77-75cd99837498.png)

画面が遷移して Cloudflare Access のセットアップが出来る様になっているので「始めましょう」を選択して先に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/9ce15cbf-c620-cdbb-8ac4-2b9e3a5e1aa5.png)

自動的に`ログイン ページ ドメイン`が発行されます。
「cloudflareaccess.com」より前のサブドメイン部分は変更可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/0ce7ab32-a5ae-d6ba-9d5d-603fdb776882.png)

ログイン ドメインの設定は完了です。次に Access ポリシーを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/d3049f6f-28da-8155-7d74-9159ef2a3981.png)

今回は以下の様な画像を表示するだけのページに対して Access ポリシーを設定してみます。
Image by <a href="https://pixabay.com/users/pencilparker-7519217/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3644073">pencil parker</a> from <a href="https://pixabay.com/?utm_source=link-attribution&amp;utm_medium=referral&amp;utm_campaign=image&amp;utm_content=3644073">Pixabay</a>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/e50b060e-42bb-d310-af7b-7865015e5665.png)


アプリケーションドメイン：保護する対象のサイト
ポリシー：メールアドレスやIP、トークンなどのパラメータを使って接続の許可・拒否を設定します。
今回はメールアドレスを許可対象として設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/35861eeb-9694-9017-edcf-90604b8d7988.png)

アプリケーションドメインに設定したURLへアクセスすると、先程と違って以下の様な認証画面が表示される様になります。
ここで先程のポリシー設定で指定したメールアドレスを入力して`Send me a code`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/334989df-d234-8738-e6a4-a48c89e2c297.png)

入力したアドレス宛に以下の様なメールが届きます。
リンクをクリックするか６桁のコードを画面に入力するか選べる様です。
今回はコードを使ってみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/eb391de5-9a84-686e-cf2f-b5b3a2ecbdf5.png)

６桁のコードを入力して`Sign in`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/32deab92-9b57-39c1-3aa8-9ce6051ba35a.png)

コードが正常に認証されればサイト（画像）にアクセスができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/e50b060e-42bb-d310-af7b-7865015e5665.png)

一つもコードを書いたりせずに、簡単にログイン認証機能を追加できるとは思いませんでした。
Argo Tunnel などの他の機能も試していきたいと思います。
【Swift】Realm accessed from incorrect thread


## 題のエラーについて。

realmをクラス変数にして複数の関数でそのインスタンスを使いまわしていたとき、よくアクセスするスレッドがおかしいですよーなんてエラーが見られた。

どうもこのやり方は良くないらしく、データの操作を実行するたびに新しいrealmのインスタンスを作って読み書きなどしなければならないらしい。

個人的には何度もインスタンス化するのはパフォーマンス的にもコード的にも気持ちよくないのでは、？と感じたのだが、
取り敢えずパフォーマンス面においてはスレッドごとにrealmのインスタンスをキャッシュしてくれる様なのでそれを問題視する必要なんて無い様です。

### **BAD**

```swift:RealmModel.swift
// bad bad bad bad bad bad bad bad
final class RealmModel {
    let realm = try! Realm()

    func saveBook(book: Book) {
        try! realm.write {
            realm.add(book)
        }
    }
    func updateBook(book: Book, title: String) {
        try! realm.write {
            book.title = title
        }
    }
}
// bad bad bad bad bad bad bad bad
```

### **OK**

```swift:RealmModel.swift
// ok ok ok ok ok ok ok ok ok ok ok
final class RealmModel {
    func saveBook(book: Book) {
        let realm = try! Realm()
        try! realm.write {
            realm.add(book)
        }
    }
    func updateBook(book: Book, title: String) {
        let realm = try! Realm()
        try! realm.write {
            book.title = title
        }
    }
}
// ok ok ok ok ok ok ok ok ok ok ok
```

勉強になった。
httpcore-4.4.5 で削除されたannotation ThreadSafe NotThreadSafeの置換

httpcore-4.4.4 では使用可能だが httpcore-4.4.5 から削除されたannotation

`@ThreadSafe`, `@NotThreadSafe` に関する置換メモ。


Release Note:
https://archive.apache.org/dist/httpcomponents/httpcore/RELEASE_NOTES-4.4.x.txt 

httpcore ThreadSafe class not found solution:
https://dev-aux.com/java/org-apache-http-annotation-threadsafe-class-not-found


## 置換

@ThreadSafe class not found compilation error occurs after updating your org.apache.httpcomponents:httpcore dependency version to 4.4.11 or above.
@NotThreadSafe 

```
org.apache.http.annotation.Immutable
org.apache.http.annotation.NotThreadSafe
org.apache.http.annotation.ThreadSafe
```
削除されたこれらの代わりに、`org.apache.http.annotation.Contract` と`org.apache.http.annotation.ThreadingBehavior` enum が導入された。

よって `@ThreadSafe` を `org.apache.http.annotation.Contract` に置換し、`ThreadingBehavior` enumの値`SAFE`を渡せば、スレッドセーフな動作規約を指定できる。


## 例
```
@Contract(threading = org.apache.http.annotation.ThreadingBehavior.SAFE)
```

等々。

同じく `@NotThreadSafe` は `@Contract(threading = org.apache.http.annotation.ThreadingBehavior.UNSAFE)`

`@Immutable` は `ThreadingBehavior.IMMUTABLE` あるいは `IMMUTABLE_CONDITIONAL`

以下も参考: 
https://hc.apache.org/httpcomponents-core-ga/httpcore/clirr-report.html
ESP-WROOM-02で書き込んだSDをubuntu18.04でマウントして読み込むコマンド

##概要
**FAT16**のSDに書き込んだファイルをubuntu18でファイルとして認識させるのに必要なコマンド。個人用メモ。

```
sudo mkdir /mnt/sd
sudo mount -t vfat /dev/sdb1 /mnt/sd
```
2020/08/14 今日も暑い。
iterm2でエンターを押すと^Mと出力されて改行できない

何言ってるかわからねえと思うが、
僕の場合は、itermの窓で、

```
bundle exec rails server -p 3000
```

を実行させてて、コンソールログを眺めてたわけです。

ログの境目をわかりやすくするために処理を実行させる前に、エンターを連打して改行をいれようと思ったら、

```
^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M^M
```


は？ｗｗ

## 対処法

いったん、rails serverを切って、ターミナル上で

```
stty sane
```

のコマンドを叩けば解決です。

## 説明（僕なりの解釈）

何かしらの理由でターミナル上の特殊文字を変更（今回でいうと^M？）されたんだけど、通常であれば変更後、それをデフォルトに戻すはずが何かしらの理由でそれが戻されず、^Mが表示されるようになってしまったのではないかと。

僕の場合容疑者は、rails serverかtmuxのコピーモードのどっちかだと思う・・・ｗ（エンターの挙動が変わりそうなのはコピーモードっぽいので後者かな・・・）
変更データキャプチャの基礎⇒変更データキャプチャの概要

１．変更イベントに該当する特性は次のどれですか?
２．変更データキャプチャに最適なシナリオはどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/ae51feb3-cbd8-c45d-7fc6-504d3f179736.png)
基本情報技術者試験を勉強して良かったこと（学べること）

エンジニアとして最低限知っておいたほうが良い知識を吸収するために、基本情報技術者試を勉強しました。

使わせていただいた書籍は[キタミ式イラストIT塾 基本情報技術者](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C02%E5%B9%B4-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297110210/ref=pd_lpo_14_t_0/357-6980848-8055732?_encoding=UTF8&pd_rd_i=4297110210&pd_rd_r=2ac17477-cf89-4b59-9f7d-05354f8cd5ca&pd_rd_w=orSmJ&pd_rd_wg=PMNcO&pf_rd_p=4b55d259-ebf0-4306-905a-7762d1b93740&pf_rd_r=ZVTFEBMRA2RHF0RM6SZA&psc=1&refRID=ZVTFEBMRA2RHF0RM6SZA)です。

キタミ式を使った基本情報の勉強で良かったこと・学んだことを、広く浅く共有しようと思います。

##基本情報で学べること
キタミ式を参考に、どんなことを学べるのか？を体系的にまとめました。

###1. n進数の計算
2進数、８進数、１０進数、１６進数...の扱い方を学べます。

コンピュータは「０と１」２種類の数字（２進数）しか理解できないので、もっと扱いやすいようにするため、8進数や16進数など大きな情報に変換してあげないといけません。

僕たちがキーボードで「あ」と入力しても、コンピュータは「あ」を理解しているわけでなく、「あ」に対応する数字を識別して「あ」を理解します。

キーボードのお話を含めてコンピュータ内部のやりとり、ネットワークの通信など、あらゆる仕組みにn進数という概念が使われてるようです。


###2. データの表し方
僕たちが使っている画像・音声・動画というマルチメディアの正体は、0と1のデータがたくさん集まったデータです。

例えば、画像を表現するには色が欠かせません。何千何万種類ある色という情報を表現すためのデータが0と1で表されています。


###3. コンピュータが動く仕組み
パソコンでカタカタできるけど、パソコンの動作原理が分かりませんでした。

基本情報は、コンピュータが動くロジックを分かりやすく教えてくれます。
制御装置・演算装置・記憶装置・入力装置・出力装置の関係や役割などが掲載されています。

###4. ソフトウェア
ソフトウェアは、基本ソフトウェアと応用ソフトウェアに大別できます。

基本ソフトウェアはOSです。Windows、macOS、UNIXなど。

応用ソフトウェアはアプリケーションソフトです。WordとかExcelなど。

基本ソフトウェア・応用ソフトウェアは何をしていて、どのようにハードウェアとやりとりをしているのかを理解できるようになります。


###5. データベース
アプリ開発で欠かせないデータベースの仕組みや設計の基本を学べます。

データベース管理システム（DBMS）や、主にリレーショナルデータベース（RDB）の正規化に言及されています。

正規化とは、DB設計に関わる重要な考え方です。

その他、障害やロールバックなども学べます。


###6. ネットワーク
ネットワークの概念を理解できます。
例えば、無線WiFi/赤外線です。

ネットワークによる情報伝達の内部で何が起きていて、「なぜ僕たちのPCは数多ある情報から特定の一部を受け取れるのか」という概念が網羅されていました。

###7. セキュリティ
認証システム、コンピュータウイルス、ファイアウォール、暗号化技術の仕組みを学べます。

・ログイン機能のあり方
・GitHubやAWSなどで使われる鍵認証

上記の理解が深められます。


###8. システム開発
コードを書くことは開発の一部であり、その他にいっぱい工程があります。

企画→要件定義→開発→運用→保守

・各工程の役割
・外部の企業と連携

システム開発の本質を学べると思います。

###9. プログラム
言語の書き方ではなく、

・プログラミング言語について
・一般的なアルゴリズムやフローチャート図
・オブジェクト指向プログラミング
・データの持ち方

などプログラムの本質を教えてくれます。


###10. システムの構成と故障対策
・サーバー
・クライアントサーバー
・システム故障

上記の役割、考え方がとても勉強になります。



###11. 企業活動

・CEO、CTO
・請負、派遣
・プログラムの著作権
・企業活動
・業務改善

IT業界の知識を学べます。



## 感想
モヤモヤが解消してスッキリしました。

記事の内容は書籍のごく一部なので、もっと知りたい方は書籍をお買い求めください。

## 今後
応用情報もやってみたいです。

以上になります。
誤りがありましたらご指摘いただけますと幸いです。
ページネーションの実装

##「kaminari」というGemをインストール
```ruby:Gemfile
gem 'kaminari'
```
ターミナル（実装したいアプリのディレクトリ）でbundle installを実行し、rails sで再起動

kaminariを導入すると、モデルクラスにpageメソッドとperメソッドが定義されます。
2つのメソッドは、よく以下のように使われます。
【例】

```
変数名 = クラスを利用して取得したレコードのインスタンス.page(params[:page]).per(1ページで表示したい件数)
```
##コントローラーを編集
```tweets_controller.rb
def index
  @tweets = Tweet.includes(:user).order("created_atDESC").page(params[:page]).per(5)
end
```
##ビューを編集
以下の1行を任意の場所に記述すれば実装が完了です。

```index.html.erb
<%= paginate(@tweets) %>
```
Jenkinsを使って、Docker内でビルドしてからDocker imageを作成する。

# はじめに
Jenkinsを使って、Mavenコンテナ内でビルドしていました。
どうせならDocker imageまでも一気通貫でやりたくて作成。
思っていたよりも作成に時間がかかった。

# リポジトリ構成
```
src
Dockerfile
Jenkinsfile
pom.xml
```
gitリポジトリにソースと上記のファイルを格納しています。

# Dockerfile
```
FROM tomcat:jdk14-openjdk

COPY target/*.war /usr/local/tomcat/webapps/ 
```
ビルドでできたwarファイルをwebapps配下に格納しています。
コードと同じリポジトリで管理します。

# Jenkinsfile
```
pipeline {
    agent any
    stages {
        stage('delete_workspace') {
            steps {
                 deleteDir()
            }
        }
        stage('build') {
            agent {
                docker {
                    label 'master'
                    image 'maven:3.6.3-openjdk-14'
                }
            }
            steps {
                // Run Maven on a Unix agent.
                sh "mvn clean package"
            }
            post {
                success { 
                archiveArtifacts 'target/*.war'          
                }
            }
        }
        stage('docker build') {
            agent { label 'master'}
            steps {
                sh 'docker build -t test-tomcat:0.1 .'
            }
            ////   事後に削除する場合。
            //     post {
            //     always {
            //         deleteDir()
            //     }
            // }
        }
    }
}
```
Declarative Pipelineで作成。

# stage

## エージェント指定
```
pipeline {
    agent any
    stages {
```
agent any がないとジョブが失敗したので記載している。

## delete_workspace
```
stage('delete_workspace') {
    steps {
         deleteDir()
    }
}
```
事前にworkspaceを削除、事後に必ずやるパターンもあるがジョブにエラーが出たとき、削除されると個人的に切り分けが困るので、ジョブの事前にやる派です。

## build
```
agent {
    docker {
        label 'master'
        image 'maven:3.6.3-openjdk-14'
    }
}
```
マスターノードにてでmavenコンテナを起動しています。
地味にノードの指定がこの位置だと気づくのに時間がかりました。

```
steps {
         // Run Maven on a Unix agent.
         sh "mvn clean package"
    }
    post {
        success { 
        archiveArtifacts 'target/*.war'
                             
        }
    }
```
maven ビルドして、成果物を保存しています。


## docker build
```
    stage('docker build') {
        agent { label 'master'}
        steps {
            sh 'docker build -t test-tomcat:0.1 .'
        }
        ////   事後に削除する場合。
        //     post {
        //     always {
        //         deleteDir()
        //     }
        // }
    }
```
マスターでdockerを起動したので、agentをマスターに指定。
ホストのworkspace配下にmavenコンテナでビルドした成果物とDockerfileが格納されているので、
そのままdocker build を実行。

# まとめ
コンテナないでビルドしてもホストのworkspaceにビルド結果が残るのを知らなかったので、
すっごく作成に時間がかかった。
また、jenkinsでdockerを利用して色々やるにはScripted Pipelineで書かなければいけないことがわかった。
jenkinsに限っては、pipelineで頑張るより、Ansibleやdocker-composeのコマンドを呼び出すほうがシンプルだし、
保守性も高いのではと感じた。実際はどっちなのだろうか。

# 参考文献
https://www.jenkins.io/doc/book/pipeline/docker/
XD to Flutterで書き出したコードをFlutterで使用する

こんにちは。
初心者すぎて、「えっなんで・・・」となったので備忘録含めたメモ書きです。

#Adobe XDとは

>Adobe XDは、共同作業を促進するパワフルで使いやすいプラットフォーム。webサイトやモバイルアプリ、音声インターフェイス、ゲームなどのデザイン制作をチーム全体でスムーズにおこなうことができます。 

https://www.adobe.com/jp/products/xd.html

今回はここについて触れないのでこれで割愛します。

#XD to Flutter
AdobeXDのプラグインの一つで、XDで頑張ってデザインしたものを簡単にコード化してくれるという優れもの。
僕はこれを参考にしました。
https://qiita.com/ashdik/items/d02d46a690e5e9578a7e
XD to Flutterの使い方は上の記事でわかりやすく書いてくれているのでここでは割愛します。

#問題のFlutterです

XD to Flutterで書き出したコードですが

```Dart
Pinned.fromSize(
                  bounds: Rect.fromLTWH(0.0, 47.0, 325.0, 90.0),
                  size: Size(325.0, 137.0),
                  pinLeft: true,
                  pinRight: true,
                  pinBottom: true,
                  fixedHeight: true,
                  child:
                  // Adobe XD layer: 'Categories Section' (none)
```
この__"Pinned"__というWidgetがうまく認識されていないという状態でした。

#解決方法

・Adobe XDのパッケージをFlutterに入れてあげる。

①https://pub.dev/
に飛んで「xd」と検索します。。

②[adobe_xd]というパッケージが表示されるのでクリック。

③[installing]タブをクリック。

④自分のプロジェクトのpubspec.yamlファイルに手順1を加える。
僕の場合はこんな感じ

```Dart
dependencies:
  carousel_slider: ^2.2.1
  adobe_xd: ^1.0.0+1
  flutter_svg: ^0.18.0
  flutter:
    sdk: flutter
```

⑤flutter pub getコマンドを実行

Process finished with exit code 0
と表示されればOKです。

⑥XD to Flutterで書き出したコードを書いているファイルの上に

```Dart
import 'package:adobe_xd/adobe_xd.dart';
```

を追加する。

これで
__"Pinned"__というWidgetが認識されました。
galliumos設定備忘録

# はじめに
個人的なメモです。

# 有線ケーブルの有効化
初期設定だと有線でつながらなかった

以下のフォルダが空だったのでconfig.yamlを作成
/etc/netplan/

```yaml:config.yaml
network:
  version: 2
  renderer: NetworkManager
```
反映させる

```
netplan apply
```

この状態でNetworkMangerを再起動

```bash
systemctl restart NetworkManger
```

# login keyring 無効化
ブラウザ起動時に出るうざいポップアップです

ctrl+alt+tでターミナルが開きます

```bash
rm -f ~/.local/share/keyring/*
```
次にポップアップが出たときにパスワードを空にすると出なくなる

# パネル
タスクバーを隠す
表示タブ　常に

# セッションと起動
-自動起動アプリケーション
[削除]
GalliumOS Update Notifierを外す
[追加]
chrome自動起動アプリ
名前->バイヤ席
コマンド->バイヤ席の実行パス(launcher.sh)

# chromeインストール
ランチャーにchrome、vscodeを追加

# chromeアプリインストール
Felica
バイヤ席

# 自動ログイン
```/etc/lxdm/lxdm.conf
[base]
## uncomment and set autologin username to enable autologin
autologin=mli
```

*package

```bash
apt-get install git ssh ibus-mozc unclutter
```

*other
スクリーンセーバー
セーバーを無効にする

# 電源管理
## システム
ブランクにするまでの時間->しない
## ディスプレイ
ブランクにするまでの時間->しない
スリープするまでの時間->しない
電源を切断するまでの時間->しない

# udevのUSBカードリーダー許可
```/etc/udev/rules.d/90-nfc.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="06c1", ACTION=="add", GROUP="mli", MODE="660"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="054c", ATTRS{idProduct}=="06c3", ACTION=="add", GROUP="mli", MODE="660"
```

# インストール

chrome
visual studio code
[plugin]
- japanse language pack
- remote ssh
nvm/nodejs(root/mli)

```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
.source ~/.bashrc
nvm install --lts=Erbium
```

#NetworkManager
nmcli connection 2つ
- Wired connection DHCP
- Wired connection Static Address
- 192.168.80.100/192.168.80.1/8.8.8.8

# 固有情報削除

/tmp/*
~/ダウンロード/*
~/.ssh/
vscode
Shift+P
clear history

```bash
history -c
```
chrome/chromium ユーザー削除
キャッシュ削除
rm -rf ~/.cache/
ChromeboxにLinuxをインストールする

# 準備物
* ＋/-ドライバー
* クリップ
* 小袋
* キーボード

# 手順[平均時間][<font color="Red">待ち時間</font>]
* ネジを外す[146s][<font color="Red">0m</font>]
* デベロッパモード有効化[0m][<font color="Red">300s</font>]
* FWインストールスクリプト実行[51s][<font color="Red">0m</font>]
* OSインストールスクリプト実行[0][<font color="Red">558s</font>]

* 合計[17.5分][<font color="Red">14.3分</font>]

# 詳細手順
## STEP1
ネジを外す
**デベロッパーモードに入る**
リセットスイッチを数秒押し続けながら電源ON
「復元用のUSBメモリまたはSDカードを挿入してください」の画面でCtrl+Dを押す。
「OSの確認機能をオフにするにはリカバリボタンを押してください」の画面で再度リセットスイッチを押す。
再起動し、「OSの確認機能はオフになっています」の画面が表示される。（Ctrl+Dでスキップ可）
「システムをデベロッパーモードに移行しています」の画面が表示される。
一定時間後、「ようこそ」の画面へ切り替わる
**FWインストールスクリプト実行**
「ようこそ」の画面でCtrl+Alt+F2を押す。
インターネットに繋がるようにする。
CUIログイン画面に切り替わるので、chronosでログインする。以下のコマンドを実行する。

```bash
sudo su
curl -O www.webproj.jp/chromescripts/CN60.sh;
bash CN60.sh
または
sudo su
curl -O www.webproj.jp/fw.sh;
bash fw.sh
```
SUCCESSと表示されたらOK
USBメモリを挿して再起動、次のステップへ

## STEP2
**USBからインストール用OS起動**
起動時にEscを押して、起動デバイス一覧からUSBを選択
青い画面(grub)で一番上のエントリが選択されているので、Enterを押す
**OSインストールスクリプト実行**
起動後、[Give Root password for maintainance]と表示されたら、パスワードを入力してログイン、以下のコマンドを実行

中括弧内はデバイスに応じたものを選択してください

```bash
cd /clonescripts/
bash [CN60/62/65]copyos.sh
```

完了したら再起動します。次に座席番号を設定します。

```bash
sudo setup.sh
```

座席番号フォーマットは[A-Z][1-9]{0,1}-[0-9]{2}
ex. A-01

# URL
ねじ位置
https://kodi.wiki/view/Chromebox
このページ
https://qiita.com/mitsuya99/private/b76bc02a2320f6ab2dae

#Troble Shooting
##デバイスの所有者がこのデバイスのデベロッパーモードを無効にしました
ねじ抜いてない

##Hardware write-protect enabled. cannot set Boot Options / GBB Flags.
ねじ抜いてない場合は抜いて解決しますが、ねじを抜いているにかかわらず出ることがあります。
ねじの周りの接触の問題です。テスタがあれば、扇型の金属間でショートしているところがないか確かめてください。

##Ctrl+Dが効かない？
キーボードをキーボード配列の異なるものに変えてみてください。
OpenAI Gymのインベーダーゲームをやってみる

#使ったリポジトリ
https://github.com/tensorpack/tensorpack/tree/f43309f0eb437c36b1249627ab29340c99d1dd3c/examples/A3C-Gym

#実行
```
git clone https://github.com/tensorpack/tensorpack.git
cd example/A3C-Gym
```


train-atari.pyに下記のコードを追加しパスを通す

```
import sys
sys.path.append("../../")
```

学習済みモデルをインストール

```
!wget http://models.tensorpack.com/OpenAIGym/SpaceInvaders-v0.tfmodel
```

テストする

```
!python ./train-atari.py --task dump_video --load SpaceInvaders-v0.tfmodel --env SpaceInvaders-v0 --output SpaceInvaders-v0 --episode 3
```

`--task dump_video` 動画を保存する
`--load ~~` 使用する学習済みモデル
`--env ~~` 使用するゲーム　今回の場合はスペースインベーダー
`--output ~~` 動画を保存するディレクトリ(実行前にそのディレクトリが存在するとエラーとなる)

# 結果

![ezgif-2-6a86a49e54aa.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396969/ce95c737-755e-7174-b246-d3ea4a548a61.gif)
GalliumOS LiveUSBの作成手順

# isoイメージをダウンロード
https://galliumos.org/download
Chromeboxの種類によってダウンロードするイメージが変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403805/430cf824-86b2-5554-668f-0a74f1041fff.png)

[Download GalliumOS] -> [For your Chromebook or Chromebox]から
CN60->Haswell
CN62->Broadwell
CN65->KabyLake

# ダウンロードしたイメージをUSBに書き込む
balenaEtcherがおすすめです
https://www.balena.io/etcher/

# LiveCDから起動
電源投入後にEscを押しっぱなしで起動デバイス選択ができます。
起動後にデスクトップにあるInstall GalliumOSを起動します。あとは画面の指示に従ってください。
【Salesforce】レコード編集不可にしてロックを制御する方法

「レコードを編集できないようにロックし、編集制御をする方法」を整理します。

レコードを編集できないようにロックさせたいという場合かあります。いくつかの方法がありますね。

１・カスタム項目（フラグなど）と入力規則の組み合わせで制御する方法。
　　標準機能の組み合わせで、編集ロックすることができます。
　　ロック解除機能も必要です。

２・画面レイアウトとレコードタイプの組み合わせで制御する方法。
　　標準機能の組み合わせで、編集ロックすることができます。
　　一部の項目だけ編集可能にして、不要な項目をロックするという、特殊な要望にも対応します。
　　ロック解除機能も必要になります。

３・Apexで制御する方法。
　　特殊要件がある場合に開発を行い対応することになります。
　　ロック解除機能も必要になります。

お勧めは「１」の方法です。
[Rust/Python] PyO3でnumpyを扱う (2020年8月版)

Rust で実装した `myfunction(x: f64) -> Array2<f64>` を Python から呼ぶコード例です. ゼロコピーなので大きなデータを Rust 側で生成して Python で解析する場合におすすめです. 頻繁に使うのでコピペ用に. 

```toml:Cargo.toml
[lib]
name = "mypackage"
crate-type = ["cdylib"]

[dependencies]
pyo3 = { version = "0.11", features = ["extension-module"] }
ndarray = "0.13"
numpy = "0.11"
```

```rust:src/lib.rs
use pyo3::prelude::*;
use ndarray::Array2;
use numpy::{IntoPyArray, PyArray2};

#[pymodule]
fn mypackage(_py: Python, m: &PyModule) -> PyResult<()> {
    #[pyfn(m, "myfunction")]
    fn myfunction_py<'py>(py: Python<'py>, x: f64) -> &'py PyArray2<f64> {
        let arr = myfunction(x);

        arr.into_pyarray(py)
    }

    Ok(())
}
```

コンパイルと実行例:

```shell-session
$ cargo build --release
$ ln -s ./target/release/libmypackage.so mypackage.so
$ 
$ python3
>>> import mypackage
>>> x = 3.14
>>> arr = mypackage.myfunction(x)
```