OmniAICreator/Qiita-1.07M huggingface dataset:
【React】スタイルの扱い方　

# はじめに
Reactのスタイルの扱い方についてまとめてみました。私のプロジェクトではCSS Modulesを使うことが多いです。CSS Modulesは、今までのCSSの書き方と同じように書くことができます。

##  Inline Style
Reactでも各タグにstyle属性を記述することで、スタイルの適用をすることができます。JavaScriptで記述するので、style={}のように波括弧で囲み、その中にオブジェクトでCSSに対応する要素を指定しているため、```style={{}}```と記載します。

```javascript:App.jsx
//文字を赤色に変更
export const App = () => {
  return (
    <>
      <h1 style={{ color: "red" }}>こんにちは</h1>
    </>
  );
};
```

```javascript:index.html
import ReactDom from "react-dom";
import { App } from "./App";

ReactDom.render(<App />, document.getElementById("root"));
```

### 事前に定義する場合

```javascript:App.jsx
  const contentStyle = {
    color: "blue",
    fontSize: "100px",
  };
  return (
    <>
      {console.log("a")}
      <h1 style={{ color: "red" }}>こんにちは</h1>
      <p style={contentStyle}>よろしくおねがいします。</p>
    </>
  );
};
```

```javascript:index.html
import ReactDom from "react-dom";
import { App } from "./App";

ReactDom.render(<App />, document.getElementById("root"));
```

## CSS Modulesを使う場合

はじめにパッケージをインストールします。私の環境がnode14なので、node14に対応した```node-sass```を入れます。

https://github.com/sass/node-sass

```sh:terminal
$ node -v                                                                         
v14.17.6
$ yarn add node-sass@4.14.1
```

.module.scssという拡張子で、CSSファイルを作成します。


```scss:CssModules.module.scss
.title {
  margin: 0;
  color: red;
}
.button {
  background-color: #ddd;
  border: none;
  padding: 8px;
  border-radius: 8px;
  &:hover {
    background-color: #aaa;
    color: blue;
    cursor: pointer;
  }
}
```

使うコンポーネントでimportします。

```jsx:CssModules.module
import classes from "./CssModules.module.scss";

export const CssModules = () => {
  return (
    <>
      <p className={classes.title}>CSS Modulesです</p>
      <button className={classes.button}>ボタン</button>
    </>
  );
};
```
DockerでMariaDBを使用した際に全角文字が入力できなかった件

##概要
DockerでMariaDBを使用した際に、全角入力ができない事態に陥りました。
そこであれこれ試行錯誤したので、メモ用に保存しておきます。

・docker-compose.ymlファイルの内容
　コンテナ起動時に投入する初期データ関連のsqlファイルはinitdb.dディレクトリ下に。

```docker
services:
  db:
    build:
      context: .
      dockerfile: ./Dockerfile
    restart: always
    volumes:
      - ./initdb.d:/docker-entrypoint-initdb.d
    environment:
      MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
      MYSQL_USER: $MYSQL_USER
      MYSQL_PASSWORD: $MYSQL_PASSWORD
      TZ: "Asia/Tokyo"
    ports:
      - 3306:3306
```

・Dockerfileの内容
　(※ 現在(2021/10/7)の最新verは10.6であるが、10.6だと必要なレポジトリが存在しないため10.5を使用。)

```
FROM mariadb:10.5

RUN apt-get update && \
    apt-get install -y locales && \
    rm -rf /var/lib/apt/lists/* && \
    echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen && \
    locale-gen ja_JP.UTF-8
ENV LC_ALL ja_JP.UTF-8

RUN { \
    echo '[mysqld]'; \
    echo 'character-set-server=utf8mb4'; \
    echo 'collation-server=utf8mb4_general_ci'; \
    echo '[client]'; \
    echo 'default-character-set=utf8mb4'; \
} > /etc/mysql/conf.d/charset.cnf
```
Nuxt/FirebaseのGoogleログイン時に毎回アカウント選択を表示する

生きてます。

Webアプリケーションにつきもののユーザ管理ですが、APIベースのアプリだと非常に面倒です。出来るだけ個人情報は自前で持ちたくないですし、大体のケースにおいてここに労力をかけることが本題ではないと思います。今回は自主的に夜な夜な開発していたNuxt.js製社内用Webアプリケーションで、尚更そこに手間をかけたくなかったので、Firebaseを使ってちゃちゃっと済ませます。

といっても今回は表題の件がメインなので、それまでの過程についてはかなり端折ります。一応Nuxtは使って入るものの、主題に関しては特に関係なく流用出来るんじゃないかと思います。

# 導入

```sh
npm install firebase@8.10.0
npm install @nuxtjs/firebase
```

パッケージマネージャで入れます。
留意点としては`firebase` のメジャーバージョンが上がったことに伴い、最新版の9.xに`@nuxtjs/firebase`が2021/10/08現在では対応していないようで、`npm install firebase`で最新版を入れてるとこけるようです。（私のときは、`firebase`のアプデ3日後のことだったので、地味にハマってました）

https://github.com/nuxt-community/firebase-module/issues/573

将来的には対応されると思いますが、取り急ぎは8系の最終リリース版を指定して入れました。手元ではこれで問題なく動いていますので、これでよしとします。

# 実装

とりあえずちゃちゃっと実装します。

## サインイン

Googleアカウントでのログインのみを想定しているので、`@click`を適当なボタンに張ってplugin化したサインイン操作の関数を実行します。

```js:plugins/auth.js
import firebase from 'firebase';

export const UserLogin = {
  provider: new firebase.auth.GoogleAuthProvider(),
  login: () => {
    firebase
      .auth()
      .signInWithPopup(UserLogin.provider)
      .then(res => {
        console.log(res);
      })
      .catch(error => {
        console.log(error);
      });
  },
```

これでサインインが実装完了です。別タブが開いてGoogleアカウント選択画面が表示され、選択するとアプリにリダイレクトされてくると思います。あとは`@nuxtjs/firebase`の機構に沿って、サインイン時に更新されたstoreのステートを使ってよしなにしますが、ここでは割愛します。

## サインアウト

```javascript:plugins/auth.js
  logout() {
    firebase
      .auth()
      .signOut()
      .then(() => {})
      .catch(error => {
        console.log(error);
      });
  },
```

サインアウトも同様に実装します。涙が出るほど簡単ですが、アプリケーション側での後処理を忘れると残念なことになるので各自ちゃんとしておきましょう。

# 一度ログアウトして、再度サインインする

すると、Googleアカウントの選択をすっ飛ばしてサインインが完了します。

## 便利だけど…

毎回選択する手間を考えたらこれはこれで親切設計なんですが、うっかりサインインするGoogleアカウントを間違えた時など、Googleアカウントを選択し直したいケースもあると思います。

公式を色々読み直してみたんですが、求める答えが得られませんでした。半分くらいアカウントを間違えるほうが悪いという強い心で生きて行こうと思いましたが、どうにも気持ち悪さが拭えなかったので色々調べたんですが、再ログインに言及されている記事がかなり少なく非常に苦労しました。（AndroidやFirebase CLIについての言及は見つかったのですが…）

そこまで特殊な事象じゃないとは思うんですが、皆横着しないでちゃんと実装してるってことなんでしょうか？

## 答え

ともあれブチキレつつ半分あきらめながら調べまくり、結果としては以下で回答が得られました。

https://stackoverflow.com/questions/42992026/firebase-how-to-always-force-a-sign-in

はい神

https://developers.google.com/identity/protocols/oauth2/openid-connect#authenticationuriparameters

Googleのドキュメントまでは見に行ってなかった…。`firebase.auth.GoogleAuthProvider()`インスタンスをちゃんと掘らなかった自分の落ち度でした。

# ログイン実装の修正

というわけで、上記の通りパラメータを設定して、再認証時のアカウント選択を明示的に指示します。

```javascript:plugins/auth.js
  login: () => {
+    UserLogin.provider.setCustomParameters({
+      prompt: 'select_account',
+    });

    firebase
      .auth()
      .signInWithPopup(UserLogin.provider)
      .then(res => {
        console.log(res);
      })
      .catch(error => {
        console.log(error);
      });
  },
```

これで初回以降のログイン時でも、Googleアカウントの選択画面が表示されますので、うっかり初回サインイン時のアカウントを間違えたときもこれで安心です。

そもそもこっちが標準じゃないのか？という気持ちもありますが、一人1アカウントという考え方が根底にあるのだとしたらそりゃまぁ再認証時の選択なんて煩わしいだけか、とも思うのでこういう作りなのでしょう。

---

というわけで認証処理がようやく片付いたので本題の実装に入れたのでした。めでたし。

本日は以上です。
PhotoshopでSVG書き出しできないし、JPEG保存時の画質も抽象的な表現になってしまったんやが

# 「書き出し形式」の画面が変わって、ちょっと使いづらい

Photoshopでレイヤーを書き出す際、方法は色々あると思いますが、レイヤーを右クリックして「書き出し形式…」を選択して出てくるウィンドウが微妙に変わりました。
![スクリーンショット 2021-10-07 18.29.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924363/983de369-fd8d-75f5-97bd-d1eaa5cf8474.png)

## 形式からSVGがなくなった

![スクリーンショット 2021-10-07 18.34.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924363/56108b15-8ef4-9cdd-1f17-df0f7980466d.png)

ないです。
ベクターはイラレでやれと言われそうですが、デザインデータのテキストをシェイプに変換して書き出しをシームレスにやりたいマンにとっては不便です。

## JPEG形式で保存する際の画質が抽象的な表現

![スクリーンショット 2021-10-07 18.31.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924363/d3ff7894-99b7-d59f-c506-672168147e28.png)

謎の7段階表現です。詳しめの通信簿ですか？

こちらも「％」を使っている人にとっては分かりづらいものです。

## 戻したい

アップデートしたらこの画面になり、少し使いづらかったので、前の画面に戻す方法を書き留めておきます。
**※今後のアップデートで使用できなくなる可能性はあります。**

# 設定方法

1. ファイル→書き出し→書き出しの環境設定…を開く
![スクリーンショット 2021-10-07 18.39.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924363/7f3c0ff3-39ca-c3c9-9f17-19b0de3362b9.png)
2. 一番下の『従来の「書き出し形式」を使用』にチェックを付ける

以上です。確認します。

SVG
![スクリーンショット 2021-10-07 18.47.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924363/75c4e4c4-c9a7-b7b8-9e7a-81667aada635.png)

JPEG
![スクリーンショット 2021-10-07 18.48.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/924363/3dd3a503-21d8-daa1-38ad-9b6826c076fb.png)

無事、復活しました。

# 余談：SVG書き出しがなくなった経緯

[Adobeのユーザガイド](https://helpx.adobe.com/jp/photoshop/using/export-artboards-layers.html)を参照すると、SVG書き出しがなくなった理由が書かれています。

> Photoshop では、「SVG として書き出し」機能は、常に試験的にサポートされていました。低い使用率と制限のため、Photoshop 22.5 の 8 月リリースをもって、この機能は廃止されました。 

そして、やはりイラレかXDを使えと釘を刺されています。

> Photoshop では主にピクセルベースの作業をおこなうため、Illustrator や XD などのベクトルアプリを使用すると、SVG をより効率的に処理できます。Adobe XD または Illustrator で PSD を開き、SVG として書き出し機能を使用します。

すみませんAdobeさん、XD使います。。。

# まとめ

従来の書き出し形式画面に戻す方法をお伝えしました。

画像アセットの生成を使用している方は、JPEGに関しても「.jpg10」などで画質も設定できるので関係ないかもしれませんが、自分は違和感だったので調べてみました。

お役に立てば幸いです。
javascriptで多次元配列の重複を削除

１・名前の重複を削除したい
２・名前が重複していた場合、moneyが2000のデータだけ欲しい

```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');
var arr = [
    {id:1,name:"花子",money:5000},
    {id:2,name:"江藤",money:4000},
    {id:3,name:"山田",money:3000},
    {id:4,name:"山田",money:2000},
    {id:5,name:"山田",money:8888},
    {id:6,name:"山田",money:9999},
    {id:7,name:"松井",money:2000},
    {id:8,name:"松井",money:2093},
    {id:9,name:"松井",money:2090},
    {id:10,name:"大川",money:1000}
    ];
var check = [];
arr.forEach(function(list) {
    check[list.name] = (list.name in check) ? true : false;
});

var filtered = arr.filter(function (e) {
    return false === check[ e.name ] || true === check[ e.name ] && e.money === 2000;
} );
console.log( filtered );

```

#結果
```
[
  { id: 1, name: '花子', money: 5000 },
  { id: 2, name: '江藤', money: 4000 },
  { id: 4, name: '山田', money: 2000 },
  { id: 7, name: '松井', money: 2000 },
  { id: 10, name: '大川', money: 1000 }
]

```
DBeaverの初期設定

#数字のカンマ区切りをやめる

ウィンドウ→設定

エディタ→データエディタ→データ形式の「Disable numeric formatting」にチェックを入れるとカンマが入らなくなる。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532979/3a7514ae-1189-5198-e778-0876f14a2783.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532979/ea9fb8ed-a95c-42ae-e1ca-5eca026406e9.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532979/5b8ae352-fc05-0099-9c36-458e0ee993e6.png)


#不可視文字を可視化する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532979/653fb32b-7e42-6253-5434-f8dda1aa800e.png)

#SQL ServerのデータをCSVエクスポート時に文字化けを防ぐ
シフトJISでは、「髙 (はしご高)」や「﨑 (立ち崎)」が文字化けする
エンコーディングを「windows-31j」(=SHIFT-JIS+Windows拡張文字)にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532979/f1e83ce4-027a-21b1-b10d-1d31232c0779.png)


#SELECT結果のすべての行を選択する(200行の制限を解除する)
SQLエディタ側をアクティブにして
Ctrl+Shift+Alt+A
または
SQLエディタ→すべての行を選択

「Alt+6」で結果側をアクティブにして
Ctrl+A→Ctrl+Cでコピーできる


#複数行のSQLを実行する
SQLスクリプトを実行する（Alt+X）

#単一行のSQLを実行する
Ctrl+Enter

#フィルタをかけて、選択範囲の値を一度に入力する
「Shift」+「矢印キー」で範囲選択、値を入力後「Enter」で選択範囲にすべて一括で入る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532979/e41c09cf-3ba7-5701-1a93-8d94d5295aa4.png)


#Excelやスプレッドシートのデータを貼り付ける
対象の範囲を選択して、ctrl + shift + v　(※ctrl + v　だと、一つのからむにすべてのデータが入る)


#便利なショートカット：
(参考：https://wonwon-eater.com/dbeaver-shortcut/)

高度な貼り付け(Excel等から複数セルへの貼り付け)
ctrl + shift + v


SQLエディタを開く
Ctrl+F3　または　Ctrl+]

SQLエディタを閉じる
Ctrl+W


クエリを実行する
Ctrl+Enter


次のクエリ・前のクエリに移動する
Alt＋↑
Alt＋↓


クエリを実行し、結果を新しいタブに表示する
Ctrl+\


エディタと結果の切り替え
Alt+6

結果の表示・非表示切替
Ctrl+6

レコード一覧と個別詳細の切り替え
Tab
Workato：Rubyコネクターで都道府県名から都道府県コード(JIS X 0401)を取得する

# 手順
## １．変数に都道府県名をセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/d7868207-4a02-0ab5-e0e6-326b5ed9fc9e.png)

## ２．Rubyコネクターを追加し、以下の通り設定を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/72e3a4d3-896b-fc1e-0296-82b99f890014.png)

### コード

```ruby
pref_cd = ''
prefs = [
  {'pref_cd' => '01', 'pref_name' => '北海道'},
  {'pref_cd' => '02', 'pref_name' => '青森県'},
  {'pref_cd' => '03', 'pref_name' => '岩手県'},
  {'pref_cd' => '04', 'pref_name' => '宮城県'},
  {'pref_cd' => '05', 'pref_name' => '秋田県'},
  {'pref_cd' => '06', 'pref_name' => '山形県'},
  {'pref_cd' => '07', 'pref_name' => '福島県'},
  {'pref_cd' => '08', 'pref_name' => '茨城県'},
  {'pref_cd' => '09', 'pref_name' => '栃木県'},
  {'pref_cd' => '10', 'pref_name' => '群馬県'},
  {'pref_cd' => '11', 'pref_name' => '埼玉県'},
  {'pref_cd' => '12', 'pref_name' => '千葉県'},
  {'pref_cd' => '13', 'pref_name' => '東京都'},
  {'pref_cd' => '14', 'pref_name' => '神奈川県'},
  {'pref_cd' => '15', 'pref_name' => '新潟県'},
  {'pref_cd' => '16', 'pref_name' => '富山県'},
  {'pref_cd' => '17', 'pref_name' => '石川県'},
  {'pref_cd' => '18', 'pref_name' => '福井県'},
  {'pref_cd' => '19', 'pref_name' => '山梨県'},
  {'pref_cd' => '20', 'pref_name' => '長野県'},
  {'pref_cd' => '21', 'pref_name' => '岐阜県'},
  {'pref_cd' => '22', 'pref_name' => '静岡県'},
  {'pref_cd' => '23', 'pref_name' => '愛知県'},
  {'pref_cd' => '24', 'pref_name' => '三重県'},
  {'pref_cd' => '25', 'pref_name' => '滋賀県'},
  {'pref_cd' => '26', 'pref_name' => '京都府'},
  {'pref_cd' => '27', 'pref_name' => '大阪府'},
  {'pref_cd' => '28', 'pref_name' => '兵庫県'},
  {'pref_cd' => '29', 'pref_name' => '奈良県'},
  {'pref_cd' => '30', 'pref_name' => '和歌山県'},
  {'pref_cd' => '31', 'pref_name' => '鳥取県'},
  {'pref_cd' => '32', 'pref_name' => '島根県'},
  {'pref_cd' => '33', 'pref_name' => '岡山県'},
  {'pref_cd' => '34', 'pref_name' => '広島県'},
  {'pref_cd' => '35', 'pref_name' => '山口県'},
  {'pref_cd' => '36', 'pref_name' => '徳島県'},
  {'pref_cd' => '37', 'pref_name' => '香川県'},
  {'pref_cd' => '38', 'pref_name' => '愛媛県'},
  {'pref_cd' => '39', 'pref_name' => '高知県'},
  {'pref_cd' => '40', 'pref_name' => '福岡県'},
  {'pref_cd' => '41', 'pref_name' => '佐賀県'},
  {'pref_cd' => '42', 'pref_name' => '長崎県'},
  {'pref_cd' => '43', 'pref_name' => '熊本県'},
  {'pref_cd' => '44', 'pref_name' => '大分県'},
  {'pref_cd' => '45', 'pref_name' => '宮崎県'},
  {'pref_cd' => '46', 'pref_name' => '鹿児島県'},
  {'pref_cd' => '47', 'pref_name' => '沖縄県'}
]

prefs.each{ |val|
  if val['pref_name'] == input['pref']
    pref_cd = val['pref_cd']
  end
}
  
{ 'pref_cd' => pref_cd }
```

# 結果

東京都の都道府県コードが出力されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/62e2c1ff-a6eb-f18d-c04d-f7a2c6314e3e.png)
cloudwatchの詳細モニタリングについて

## 勉強前イメージ

1分間隔で見れるとか正直それくらいしか覚えてないし違いがわからん

## 調査

### cloudwatchの詳細モニタリングとは

EC2のモニタリングタイプで、
`基本モニタリング` と `詳細モニタリング` があります。

- 基本モニタリング
	- 費用 : 無料
	- データの取得間隔 : 5分

- 詳細モニタリング
	- 費用 : 有償
	- データの取得間隔 : 1分(10個までは無料利用枠)

### 詳細モニタリング有効化の方法

詳細モニタリングはEC2インスタンス1台ごとに有効化を行います

- EC2へ移動

EC2へ移動します

![1インスタンス _ EC2 Management Console - Google Chrome 2021-10-07 18.11.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/21587591-e479-0943-8fe4-41e672db60fc.png)


- 有効化

アクション > モニタリングとトラブルシューティング > 詳細モニタリングを有効化 へ進みます。

![2インスタンス _ EC2 Management Console - Google Chrome 2021-10-07 18.12.06 2021-10-07 18.12.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9c4aaf75-bd40-54b4-bedf-0735fc4621aa.png)


- 設定を変更

有効化にチェックを入れて有効化します

![3詳細モニタリングを有効化 _ EC2 Management Console - Google Chrome 2021-10-07 18.13.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/a1d576f3-a1c0-943e-2917-7094d47bca77.png)


- 確認

内容を確認すると、詳細と記載があります。

![4インスタンス _ EC2 Management Console - Google Chrome 2021-10-07 18.14.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/5c6e8fe3-ba74-84b0-3bd0-75a54005ef40.png)


- 無効化の方法

分かりづらいのですが、詳細モニタリングを無効化するには 有効化 を外すだけで出来ます。

![5詳細モニタリングを有効化 _ EC2 Management Console - Google Chrome 2021-10-07 18.15.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/27ed1d8a-99b4-1ea7-68cb-f52e021728a9.png)

## 勉強後イメージ

実際ちょっと調べてみたけど1分くらいしかなかった気がする。
あと、有償なのねこれ

## 参考

- [AWS初心者向けWebinar これで完璧、AWSの運用監視](https://www.slideshare.net/AmazonWebServicesJapan/awswebinar-aws-56679485)
- [（ショロカレ 14 日目）EC2 の詳細モニタリングが適用されていることを確認するメモ](https://cloudpack.media/17865)
UiPathとオブジェクト指向

・UiPathはオブジェクト指向で作っていきましょう。
・WinActorはオブジェクト指向では作れません。

・オブジェクト指向とは
　・カプセル化、ポリモーフィズム、継承といわれています

　・人間世界をプログラム世界に移したものともいわれます

　→　一つ一つの人間（プログラム）が、責務を持っており、責任分担制になっている世界です。
　→　あるプログラムは取り扱うお仕事が決まっており、それを他のプログラムから安易に操作できないように守られています。
　→そのようないくつかのプログラムにお仕事を振り分けるリーダーの役割をするプログラムもいます。

UiPathはそれぞれの責任を持ったプログラム=部品を作り、それをmainが呼び出して仕事をお願いします。

★しかし、このとき部品をインスタンス化するのではないというところが
少し違和感
nuroでciscoルータを使ってVPNセンターを構築する前の準備をした。

紆余曲折、結局ベストな環境にはできなかったものの、なんとかベターな設定で運用を開始しましたのでご報告いたします。
紆余曲折↓

https://qiita.com/dj5fs/items/a0b47d46ad0d7a2f1a4b

# 構成
```
                   +-----------------------------------------------+
                   | Cisco 2911                                    |
                   |        g0/0: IPv4 StaticADDR, NAPT outside    |
+-------+ (VLAN10) |    brigde 1: g0/1(IPv6 traffic only), vlan10  |
|clinets|----------| bridge BVI1: IPv4 NAPT inside                 |
+-------+          |              IPv6 DHCPv6 client               |
IPv4:              +-----------------------------------------------+
 DHCP from C2911            g0/0                     g0/1
IPv6:                         |                        |  PathThrough(nd, ra)
 configure from     IPv4 DMZ  |                        |  DHCPv6(IPv6 address & DNS)
  HG8045Qs RA                 |                        |  
                             LAN1                     LAN2
                           +-------------------------------+
                           | HG8045Q                       |
                           |  IPv4: DHCP disabled          |
                           |        DMZ = C2911 g0/0 ADDR  |
                           |  IPv6: ??????                 |
                           |  WLAN: OFF                    |
                           +-------------------------------+
                                           |
                                           | G-PON
                                           |
                                        +------+
                                        | nuro |
                                        +------+

```

# 苦労したところ
IPv4はだましだましなんとかできるのですが、IPv6がクセモノです。本当に。。。

## HG8045Q側設定
`IPv6 > LANアドレス設定`は前と変わらず。
>- [x] ルータ広告を有効にする
- [x] DHCPv6サーバを有効にする
- リソース割り当てモード: 手動
- アドレス/プレフィックスの割り当て方法:　SLAAC
- その他の情報の割り当て方法:　DHCPv6
- ULAモード:　無効

### DHCPv6を使用して、IPv6アドレスを固定する
`IPv6 > DHCPv6スタティックIP設定`
CiscoのBVI1インターフェースのMACアドレスと設定したいインターフェースIDを設定します。

> このページでは予約済みインターフェースIDとIPv6 GUAアドレスを使用してMACにIPアドレスを割り当てることができます。 IPv6 GUAアドレスはLAN側に設定されたインターフェースIDとプレフィックスの組み合わせです。 LANアドレスの取得方法がSLAACに設定されている場合、このページの設定は有効になりません。

:::note info
クライアントからDHCPv6でのアドレス要求があった場合は例外らしい。
なお、アドレスは「0」を省略して登録できないので、 dead:beef:0:1→dead:beef:0000:0001としないといけない。
なにか気持ちが悪い。
:::

## Cisco側設定
前回はDHCPv6-PDでプレフィックスやら何やらをしようとしていましたが、そこらへんの設定が純粋なクライアントとして動くような設定に変わっています。
変更箇所だけ載せています。

```
interface GigabitEthernet0/1
 no ip address
 duplex auto
 speed auto
 bridge-group 1
 bridge-group 1 input-type-list 200
!
interface BVI1
 ip address 192.168.0.254 255.255.255.0
 ip nat inside
 ip virtual-reassembly in
 ipv6 address dhcp
 ipv6 enable
 ipv6 nd autoconfig default-route
```
| (config-if)# ipv6 enable |
|:-|
| これでとりあえずリンクローカルアドレスを自動生成してくれるらしい。 |

| (config-if)# ipv6 address dhcp |
|:-|
| そのまま。IPv6アドレスはDHCPv6で設定。 |
# バグなのか、救われた。
正直、この現象に関してはわけがわからないが、CiscoのWAP150がDHCPv6か静的IPv6の二択で、DHCPv6に初期設定されていたことで、前から気になっていたよくわからないIPv6アドレスが、`IPv6 > DHCPv6情報`の一覧に入っていた情報と一致していたので、これはと思ってやってみたらできた。
【Vue.js】scrollToが効かない時、代わりに使えるscrollIntoView

#はじめに
##実現したいこと
あるボタンを押すと、画面一番上に移動するような動作（画面遷移はしない）

##やり方を探ってみる
「Vue.js トップに戻るボタン」とかで検索すると、ほとんどが👇のような`window.scrollTo`を使ったようなやり方でした。

```vue
<template>
 <div>
   <button @click="moveToTop">一番上に</button>
 </div>
</template>

<script>
 moveToTop() {
       window.scrollTo({
             top: 0,
             behavior: 'smooth'
                });
            }
</script>
```

https://yuyauver98.me/vue-scrolltop/

https://qiita.com/TK-C/items/42b25ff4ec56528ad870

https://webty.jp/staffblog/production/post-1973/

#なぜか`window.scrollTo`反応しない
が！！！

**なんでやろう？？僕が実装したいVue.jsのプロジェクトでは、`window.scrollTo`が全く反応してくれなかったのですね。。。**
👇これも試しました。。

https://cpoint-lab.co.jp/article/201903/8544/

👇の例で使われてる`window.scrollBy`も全く反応がなかったので、、、`window`の時点で何かしらの理由があって無効になっていると仮定しました:tired_face:

https://blog.capilano-fw.com/?p=4705#i-2

#scrollIntoViewを代わりに使いましょう！
色々と調べまくってる時でに運命的な出会いをしました。。

https://ageo-soft.info/programming_languages/javascript/3563/

ここで`scrollIntoView`を知りました！

そこからどうやって実装したか？

##一番上の階層のvueファイルで`id="page-top"`を指定

```vue:Layout.vue
<template>
  <div>
   <div class="page-content-wrapper" id="page-top">
     <Sample></Sample>
    </div>
    <FooterVue></FooterVue>
  </div>
</template>

<script>
 import FooterVue from './_partials/Footer';
 import Sample from './_partials/Sample';

export default {
 components: {
            'FooterVue': FooterVue,
            'Sample': Sample
        },
}
// 省略
</script>
```

##コンポーネントファイルでmethodを入れる

```vue:sample.vue
<template>
  <div>
   <button @click="moveToTop">
      次へ
    </button>
  </div>
</template>

<script>
export default {
 methods: {
  moveToTop() {
                document.getElementById('page-top').scrollIntoView({
                    behavior: 'smooth',
                    block: 'start'
                });
            }
}
// 省略
</script>
```

これで`window.scrollTo`と同じようなことが実現できました:yum:

わーい！！

#注意点

https://stackoverflow.com/questions/49820013/javascript-scrollintoview-smooth-scroll-and-offset

scrollIntoViewは**offsetが使えません**（もうちょっと移動した時の位置を上にしたい！とかが無理っぽい）

まぁそれでも一番上に移動させるだけなら全く問題はありません。
[TypeScript]Symbolの活用法

TypeScriptは構造的型付なので同じシグネチャーであれば型が異なっても受け取れてしまう
例：

```typescript
class Dog {
  id: string;
  name: string
}

class Cat {
  id: string;
  name: string;
}

function callDog(dog: Dog) {
  console.log(dog);
}

const cat = new Cat("1", "猫");

callDog(cat); // エラーにならない
```

そこでSymbolを付与することで同じシグネチャーでも型が異なれば受け取ることができないようにすることができる
例：

```typescript
const dogType = Symbol();
class Dog {
  [dogType]: any;
  id: string;
  name: string
}

const catType = Symbol();
class Cat {
  [catType]: any;
  id: string;
  name: string;
}

function callDog(dog: Dog) {
  console.log(dog);
}

const cat = new Cat("1", "猫");

callDog(cat); // エラーとなる
```
Raspberry Pi 3+の設定（忘備録）その3  新規ユーザー作成・PHPのインストール

今までRaspberry Pi 3+に16GBのmicroSDを挿してwebサーバとして運用していましたが、手狭になってきたので64GBに改めて環境構築をした時の自分の作業の忘備録です。以前導入した時とだいぶ変わっている部分が多かったので驚いたのが第一印象でした。

# 前提

* このラズベリーパイは外部に公開はしません。（twitterへのポストはします）
* 普段、このRaspberry Pi 3+は午前7時から午後11時まで30分毎にcronでbotを運用しています。
* そのため一日当たりの作業時間は夜間の23時から0時までの1時間ぐらいをメンテナンス時間として作業を行う予定です。

またこういう世界から遠ざかって久しいのでいろいろと拙い部分があると思います。ご指摘ください。

# 新しいユーザーを作成する
ずっとデフォルトユーザーのpiを使用していると、セキュリティ上物騒である為、新しくユーザーを作成します。
新しいユーザーを作成する際は、sudoが使用できるグループに所属させます。（私はこれでsudoが使用できないユーザーを作成した後にpiを凍結させて、$ sudo su - することもできずに環境を一度imgファイルから書き戻す羽目になりました。）
新しいユーザー作成後、piは削除するかアカウント凍結を行いましょう。

```console:
#グループの作成
$ sudo groupadd -（グループ番号） （グループ名）　
#ユーザーの作成
$ sudo useradd -m （ユーザー名）
#ユーザーのパスワードの設定
$ sudo passwd （ユーザー名）
#ユーザーが所属するグループの追加。
$ sudo usermod （グループ名、カンマ区切りで複数指定可） （ユーザー名）

$ groups （ユーザー名）
#↑実行すると、そのユーザーが所属しているグループ名一覧が表示される。
#新しいユーザー名を作成する時はpiのグループをそれで取得してusermodで追加することも可能。
```

# phpのインストール
以下のコマンドを実行し、phpとphp-curlをインストールします。（php-curlがないとtwitteroAuthが動きません）

```console:
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install php
$ sudo apt-get install php-curl
```

マルチバイト文字を使用するため、mbstring.dllのコメントアウトを外します。

```ini:php.ini
;(略)
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
;(略　↓行頭のセミコロンを削除し、このコメントアウトを外す)
extension=mbstring
;
```

さらに足りないのでモジュールを追加します。

```console:
$ sudo apt-get install php-mbstring
```

# とりあえずのセキュリティ設定
自分はセキュリティの専門家ではないので、一番世間で騒がれているセキュリティを一通り行うこととします。
DirecrotryIndex系は自分の環境ではwwwが置かれているディレクトリは別ディレクトリに複数分かれているため行いません。都度.htaccessに記載することにします。
もし過不足、誤りなどございましたらご指摘ください。

参考サイトはこちら
https://qiita.com/bezeklik/items/1c4145652661cf5b2271

```ini:/etc/php/x.y/apache2/php.ini
#ファイルパスx.yはPHPのバージョン。

#エラー非表示
display_errors=off
#エラーログ出力設定
log_errors=on
#バージョン非表示
expose_php=off
```
↑すいません、パス間違ってました（2023/03/29）

httpリクエストのヘッダの追加・削除・変更を行います。これを行わないとサービス再起動時に後述のheaderなんちゃら系のエラーが出力されます。

```common-lisp
$ sudo a2enmod headers
```

```config:/etc/apache2/conf-available/security.conf
#バージョン非表示
ServerTokens Prod 
ServerSignature off
Header unset "X-Powered-By"
#httpoxy対策
RequestHeader unset Proxy
#クリックジャッキング対策
Header append X-Frame-Options SAMEORIGIN
#XSS対策
Header set X-XSS-Protection "1; mode=block"
Header set X-Content-Type-Options nosniff
#XST対策
TraceEnable Off
```

サービスを再起動します。

```common-lisp
$ sudo /etc/init.d/apache2 restart
```

サービス再起動時にエラーが出力されない事を確認してください。


:::note info
念のためこのあたりでWin32DiskImagerでmicroSDのイメージをコピーしておくことをお勧めします。
:::

# 関連ページ

https://qiita.com/cafe-capitola/items/b5e3e5dfdc8ca9f9a744

https://qiita.com/cafe-capitola/items/283f41793cde409a36a6

https://qiita.com/cafe-capitola/items/d167b4e96fa78dc8878c

https://qiita.com/cafe-capitola/items/97dd713185049d4a8274

https://qiita.com/cafe-capitola/items/2b80853490c88d6eae0c?1

https://qiita.com/cafe-capitola/items/91e10926bfbe9cea61e0

https://qiita.com/cafe-capitola/items/9f97c791a598420a7e57
Microsoft365管理センターから管理者アクセス権を取得してみた

![Microsoft365管理センター](https://img-prod-cms-rt-microsoft-com.akamaized.net/cms/api/am/imageFileData/RE39c4B?ver=c0f1&q=90&m=2&h=1536&w=2048&b=%23FFFFFFFF&aim=true")

## ゴール
- お名前.com所有ドメインで、  
  お名前.com NaviからOfficeライセンスを購入せずにMicrosoft365管理者になる

## 結論
- :x: **お名前.com Navi** は間違い
- :o: **お名前.comメールコントロールパネル** でMicrosoft365管理者になれる

## 困りごと
- お名前.com NaviからOfficeを購入せずに保有ライセンスを適応したり試用版ライセンスを適応したいが、ドメインの所有者確認で失敗する
- お名前.com公式の手順ではお名前.com Naviからの購入が前提となっていて、Microsoft365には購入済みの管理者ログインアカウントを利用する手順しかなく、対処方法が不明である
- Microsoft公式の[任意の DNS ホストで DNS レコードを作成する][o365-dns_hosting]では、推奨セットアップを行うも失敗する
    - お名前.comでは`TXT名`の記入先がないがそれは問題ない（今回の失敗とは無関係）

[o365-dns_hosting]: https://docs.microsoft.com/ja-jp/microsoft-365/admin/get-help-with-domains/create-dns-records-at-any-dns-hosting-provider?view=o365-worldwide

## Microsoft365管理センターでの手順
1. [Microsoft365][o365-login]にお名前.comで購入した所有ドメインのアカウントでログインする
1. Office365のホーム画面やアプリ起動ツールから `管理`　をクリックする
1. 概要 で `次` をクリックする
1. 画面内容を控えるため一旦画面をそのままにして、[お名前.comでの手順](お名前.comでの手順)を実行する
1. [お名前.comでの手順](お名前.comでの手順)を終えたら、ドメインの確認 で `レコードの確認` をクリックする
   - ドメインの確認 で `再施行` をクリックする
1. Microsoft365管理者の画面に遷移し完了！

[o365-login]: https://login.microsoftonline.com/

## お名前.comでの手順
1. [お名前メールコントロールパネル][onamae-mail_control] にログインする
1. ホーム画面からサービス設定の `独自ドメイン設定` をクリックする
1. 適応先の所有ドメインの `DNS設定` をクリックする
1. DNSレコードを設定するの横の `設定する` をクリックする
1. レコードを追加する

    項目|値
    -|-
    Type| TXT
    VALUE| {Microsoft365管理センターで示された値}
    TTL| 3600

[onamae-mail_control]: https://cp.rentalserver.jp/Home.aspx
ファーウェイのテーマ文字盤の開発ツールの概要

![幻灯片2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776989/c7977669-0e89-6b02-14bb-555474ac7dfc.jpeg)

---
![幻灯片3.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776989/d91184a4-c241-702a-eace-e5bf0fa0fa3f.jpeg)

---
![幻灯片4.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776989/4371e5ef-e1f8-2791-54f7-620141595c99.jpeg)

---
![幻灯片5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776989/04066bc9-5513-cb2e-d1d4-bfb097fb7adc.jpeg)

---
![幻灯片6.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776989/4b3cc886-307b-f7e9-4e4a-742b336536f9.jpeg)

---
![幻灯片7.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776989/a6237fe0-bca9-4ae2-e38d-d94ec1f7902d.jpeg)

---
![幻灯片8.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776989/4359a078-8562-2024-ae56-dcb370efc554.jpeg)

---
![幻灯片9.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776989/01274469-fa0e-3061-48db-ecd95cbd6c8c.jpeg)

---
![幻灯片10.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776989/3201364a-7b5d-6c69-1eb0-744854a15029.jpeg)

---
![幻灯片11.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776989/1d3f99f3-ab10-55be-8dbc-189609a8e09a.jpeg)

---
![幻灯片12.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776989/6d75545b-3eca-2585-ecd9-e89484786248.jpeg)
enumの値によってviewページの表示を変えたい

#はじめに
現在プログラミング学習を始めて３ヶ月目の初学者です。
学んだことをqiitaに投稿という形でアウトプットするため、また備忘録として記事を作成しました。

##enumの値によってviewページの表示を変えたい
今回Todoアプリを作るに当たってタスクの種類をenumで管理してるので、そのenumの値によってそれぞれのタスクの種類のviewだけに表示させたい

###考えた方法
・controllerで指定

###controllerで指定
    @tasks = Task.categories.find(2)
で行けるかなと思ったが
undefined method `sentence' for ["よく使うタスク", 0]:Array
と出るので確かにsentenceカラムはこれだと表示できないよなぁ。

    @tasks = Task.where(category:2)
今度こそと思ったがviewにはなにも表示されない
と思ったがcreate時のログを見たところ "category"が"categories"になっていたのでform_withの記述をf.select :categoryに直してcreateしたら表示されました！



##最後に
qiitaへの投稿に慣れていないので、分かりづらい上に情報が少ないですが、これから欠かさず投稿していこうと思います。
Arduinoで明るさを測定

# 明るさセンサー(CdS)で明るさを測定する

[CdSセル](https://akizukidenshi.com/catalog/g/gI-00110/)
[10kΩ抵抗](https://akizukidenshi.com/catalog/g/gR-25103/)

CdSセルは暗いところにおくとセンサーの抵抗値が大きくなり、明るいところに置くと抵抗値が低くなる性質を持っています。その特徴を利用して、明るさセンサーとして使ってみましょう。

# 配線
ブレッドボードを使って
Arduinoの5Vー10kΩの抵抗ーCdSセルーArduinoのGND
の流れができるような配線をします。
その後、10kΩの抵抗とCdSセルが繋がっている列からArduinoのA1ピンに配線します。

![スクリーンショット 2021-10-28 20.28.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/460e5137-d57e-a2e3-e2c5-b57e91366a0f.png)


# プログラム
下記のプログラムをコピペし、Arduinoに書き込んでください。
書き込む前に[Arduinoの設定](https://qiita.com/doyodoyo/items/0f3f6c3a5e09b30062a3)でやったボードの設定とシリアルポートの設定を忘れずに。

```java
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  int val=0;
  val=analogRead(1);
  Serial.println(val);
  delay(500);
  
}
```

# シリアルモニタで数値を確認

図の赤枠の部分を押すとシリアルモニタが表示されるので、明るさセンサーで観測された値が表示されます。
暗くすると、数値が大きくなります。

![スクリーンショット 2023-03-07 10.24.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/cb7dcf4c-41a1-5f8c-e87f-4571077535aa.png)


# シリアルモニタの様子

![small___________2018-10-25_14.44.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/88348ed4-3c3a-63c8-323f-63c434fca506.png)

# ポイント
## ポイント1:アナログ入力
デジタルは01の世界と言われますが、Arduinoの例でいうと0=0V(LOW)、1=5V(HIGH)です。
つまり、[Lチカの例](https://qiita.com/doyodoyo/items/29598bc44cf54b3b174b)で行ったデジタル出力は0Vか5Vのどちらかしかない出力です。
しかし、アナログは連続した値です。0〜5Vの値の間のどの値でも取れます。
今回の明るさセンサーは明るさ、暗さを数値で表したいのでアナログピンを使います。
ただし、アナログ入力は0-5Vの入力電圧を0-1023の値に変換されます。
0→0V
1023→5V

## ポイント2:読み取り方法
val=analogRead(1);
はアナログ１番ピン(A1)の値を読むことを意味しています。
Python3.7系をwindowsにインストール

# 「このインストールはシステムポリシーで許可されていません」とエラーが出る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182994/30213fd2-a936-416b-9330-24345fac29fd.png)

# 対処方法

以下サイトにある通り、MAX_PARHの除去が必要らしい
https://docs.python.org/ja/3.7/using/windows.html#removing-the-max-path-limitation


## 1.MAX_PATHをレジストリエディターから除去

https://knowledge.autodesk.com/ja/support/autocad/troubleshooting/caas/sfdcarticles/sfdcarticles/JPN/The-Windows-10-default-path-length-limitation-MAX-PATH-is-256-characters.html

以下のように
`KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled`の値を「**1**」にすればOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182994/947e230d-b026-2575-c4ed-70f189f48223.png)

## 2.customize instalationからインストール

自動ではなく、Custmoize installを選び
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182994/eacf818a-f5f3-6f6d-374a-d0c330f07561.png)

install for all usersを選択(選択しなくても良い)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/182994/d006c03b-2655-add8-103e-ed8a2884a24f.png)
Rapberry Pi 4BにPyTorch環境をつくる覚書 2021/9/29

１．はじめに
前回の記事でRPiにTensorflowLiteをインストールしたのですが、Pytorchにも興味があるのでPytorchもインストールしてみました。一部の依存ライブラリの最新版がRaspiには対応していないようなので Pytorchのバージョンは1.5を入れています。
ついでに画像処理用と音声処理用のライブラリ(torchvisionとtorchaudio)も併せてインストールしました。
PytorchもTensolflowと同じくエッヂAI用に軽量なPytorch mobileというバージョンがある様ですが、Raspiに入れている例がみあたらなかったのでフルサイズのPytorchを入れています。

２．早速入れてみる

いろいろ試行錯誤してなんとかなったのですが、こちらのサイトにほぼ同じ内容が説明されてました。

https://taku-info.com/raspberrypi-pytorch-install/



蛇足もいいとこですが、一応私の実行した方法覚書
関係するモジュール関係をインストール。
インストール環境は、前回TensolflowLiteを入れた環境に追加インストールです。

```sh
$ sudo apt install libopenblas-dev libblas-dev m4 cmake cython python3-dev python3-yaml  python3-setuptools
$ sudo apt-get install libopenblas-base libopenmpi-dev
$ sudo apt-get install libopencv-highgui-dev
```

RPi用のwheelらしきリポジトリをclone

```sh
$ git clone https://github.com/Ben-Faessler/Python3-Wheels.git
$ cd Python3-Wheels/pytorch
$ sudo pip3 install torch-1.5.0a0+4ff3872-cp37-cp37m-linux_armv7l.whl
$ cd ../torchvision
$ sudo pip3 install torchvision-0.6.0a0+b68adcf-cp37-cp37m-linux_armv7l.whl
$ cd ../torchaudio
$ sudo pip3 install torchaudio-0.5.0a0+09494ea-cp37-cp37m-linux_armv7l.whl
```

これでpython3を立上げてimport torchでエラーが出なければOK
【リンク集】Google Cloud VMware Engine 徹底解説

<h1>Google Cloud VMware Engine 徹底解説</h1>
VMware Japan Blog の記事をまとめました。
GCVEの学習に。

1. [Google Cloud VMware Engine 徹底解説 #1 Google Cloud VMware Engine の特長とGoogle Cloud における位置づけ](https://blogs.vmware.com/vmware-japan/2020/12/google-cloud-vmware-engine-deepdive-1.html)

2. [Google Cloud VMware Engine 徹底解説 #2 Google Cloud VMware Engine での VMware ソリューションの活用](https://blogs.vmware.com/vmware-japan/2021/01/google-cloud-vmware-engine-deepdive-2.html)

3. [Google Cloud VMware Engine 徹底解説 #3 Google Cloud VMware Engine で提供されるコンポーネントとアーキテクチャ](https://blogs.vmware.com/vmware-japan/2021/03/google-cloud-vmware-engine-deepdive-3.html)

4. [Google Cloud VMware Engine 徹底解説 #4 Google Cloud VMware Engine の展開方法](https://blogs.vmware.com/vmware-japan/2021/04/google-cloud-vmware-engine-deepdive-4.html)

5. [Google Cloud VMware Engine 徹底解説 #5 オンプレミス環境とのハイブリッド構成と移行方法](https://blogs.vmware.com/vmware-japan/2021/09/google-cloud-vmware-engine-deepdive-5.html)

6. [Google Cloud VMware Engine 徹底解説 #6 Google Cloud VMware Engine でのサード パーティ ソリューションの活用](https://blogs.vmware.com/vmware-japan/2021/09/google-cloud-vmware-engine-deepdive-6.html)

7. [Google Cloud VMware Engine 徹底解説 #7 GCVE 1 ノード クラスタ リリース！](https://blogs.vmware.com/vmware-japan/2021/12/google-cloud-vmware-engine-deepdive-7.html)
amplify add analyticsを使用した際、us-west-2にpinpointが設置されてしまうとき

##　前提
バックエンドをAWSを利用してiOS開発をしています。
新たなアプリにプッシュ通知を実装する必要があり、元々amplifyを使用していたためAmazon pinpointを利用することになりました。

初めてのプッシュ通知、初めてのpinpointで山あり谷ありでしたが、なんとか実装に成功。
その山の中でも特にわけわからなかったのが**pinpointがオレゴンにpushされる**という事象です。
amplifyはap-northeast-1(東京リージョン)に設置しているので、amplify CLIを利用して作成したapi、authなどは東京リージョンに設置されます。
しかし、analyticsだけは何故かus-west-2(オレゴン)に設置されてしまいました。
これを解決しようと思ったのですが、なかなか記事が引っ掛からなかったので、ここに備忘録として残しておきます。

## 原因
`amplify add analytics` をした後に作成されるcloudformation-templete.jsonが原因。
このファイルの中でどのリージョンにpushさせるか決めています。
なので、このファイルの中身をいじってからpushするだけ。

## 解決方法
自分が作成したプロジェクトまで移動し、
`cd amplify/backend/analytics/プロジェクト名（もしくはここにあるファイル名）`
に移動します。

`ls`コマンドを実行すると
`pinpoint-cloudformation-templete.json`
というファイルがあると思います。（ここにない人はごめんなさい、わかりません）

このファイルを`cat`コマンドで見てみると、マッピングリスト的なものがあると思います。
その中に、それぞれのリージョンに対するpinpointRegionがあると思いますが、それがpinpointが設置されてしまうリージョンです。

私は東京リージョンなのでap-northeastを確認してみると以下のようになっていました。

```shell
   "ap-northeast-1": {
        "pinpointRegion": "us-west-2"
      },
```

これが原因で、us-west-2に設置されてしまう、というわけです。
なので、例えばus-east-1におきたい場合、

```shell
   "ap-northeast-1": {
        "pinpointRegion": "us-east-1"
      },
```

に変更してから、`amplify push`をしてあげればOKです。

:::note warn
pinpointは比較的新しいサービスのため、まだ対応していないリージョンがあります。自分が使用したいリージョンで使えるかは各自調べてみてください。
:::

## まとめ
amplifyはじめAWSの知識がまだまだ足りないなと思う今日この頃です。
pinpointを利用してチャットアプリの通知機能も実装できたので、そちらの記事も近々記事を上げたいと思います。

今度はfirebaseを使って通知機能も実装してみたいですね。

それでは。
【たった４行】毎日自動でリッチテキスト形式の日報下書きを作成【GAS】

##概要
GASで仕事を自動化するスクリプトの定番に、日報作成がある。

スプレッドシートやドキュメントの文章を元にメール下書きを作成するスクリプトを、トリガーで毎日実行と言うのがセオリー？

ただ、普通に文章を文字列にしてメール下書きを作るとプレーンテキストモードになってしまう。プレーンテキストモードだと本文中に表などを張り付けることができず、張り付ける前にプレーンテキストモードのチェックを外す必要がある。

大した操作ではないけど、どうせならそこまで自動化しようじゃないかと工夫。

##準備
後々メールの内容を編集しやすくするために、宛先や件名、本文などはスプレッドシートに記載。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/7642bc97-d6cb-26ca-c976-f51c074aaf1f.png)
こんな感じ。

件名には日付を入れたいので、数式で記述。
`=TEXT(TODAY(),"yyyy年mm月dd日の日報")`

##プレーンテキストモードの場合
プレーンテキストモードかどうかは三点リーダーでメニューを開くとわかる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/92600bb9-2e14-438a-fad4-5e552d944357.png)
セルの文字をそのままメール下書きにおこすと、プレーンテキストモードで作成され、表を張り付けてもただの文字列になってしまう。

例えばこれを張り付けると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/802f76b4-519d-34cd-7917-b783e92b3948.png)
こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/39ec45b1-ce10-85dc-2a21-e91b7695a000.png)
と言うわけで次のように工夫してみる。

##コード
どうやらhtml文がメールに入っていると勝手にリッチテキストになるので、シートから抽出する本文をhtml形式で記述する。

```javascript
function richText() {

  let data = SpreadsheetApp.getActiveSheet().getDataRange().getValues();
  let html = '';
  for(let i=3; i<data.length; i++) {html += data[i][1] + '<br/>';}
  GmailApp.createDraft(data[0][1], data[2][1], '', {htmlBody: html, bcc: data[1][1]});

}
```

###１行目
`data`にシートのセルを全て格納。

###２行目
後ほど本文として使う`html`を宣言。

###３行目　ポイント^^)b
B列4行目からB列最終行までを`html`に追記。
セルの内容と改行を繰り返し追記していて、セルが空欄の場合は改行だけが入る。改行を`\n`ではなく`<br/>`にすることでhtml形式になる。

###４行目
メール下書き作成。
`GmailApp.createDraft`は、`( 宛先, 件名, 本文, { オプション } )`となってるので、それぞれを引き当てる。html形式の文章とBccはオプションで指定。本文は使わないけど無いとエラーになるので空白文字を入れている。

##実行結果
上記のコードで作成した下書き。プレーンテキストモードにチェックが入っていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/79fa29dc-9c02-55bb-ab94-4034002cb6a7.png)
表を張り付けてみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708687/4f0f7c99-d067-9cce-f998-e7eadb0e90a4.png)
出来たヽ(・∀・。)ノ☆

##運用
このコードをトリガーで出勤前の時間帯に実行させてやれば、リッチテキスト形式の日報下書きが毎日自動で作成される。

トリガーの設定については詳しく説明しているサイトが多いので割愛！

###おしまい
discordでnanashi_systemを作る経験談

2020年4〜9月あたり(うろ覚え)
アカウント(nanashi_systemの)
を作成
2020年6月ごろLloydさんを知り、
開発を手伝ってもらう
2020年10月俺の活動休止(無報告)
2021年1月一時的に復帰
常時起動できるようにしておいてとお願い
2021年7月スマホで復帰📱
やっと常時起動できるようになった
2021年8月
一時的にpcも
そこから、12月まで、俺は開発をやらないと
決めた。
Lloydさんが開発担当になった。
S3 オリジンへの直接アクセス制限と、インデックスドキュメント機能をCloudFrontFunctionsで共存させる方法

S3＋CloudFrontの構成で静的Webサイトを構築した場合、サブフォルダまたはサブディレクトリからデフォルトのルートオブジェクトを返さないという問題に対し、Lambda@Edge（L@E）で解決するという記事をよく見かけますが、CloudFrontFunctions(CF2)でも実現することができました。

CF2はL@Eより手前で、シンプルな処理をより高速に、素早く、安価に実行できるサービスです。

今回のように `URLにファイル名や拡張子を含まないリクエストにindex.htmlを追加するだけ` といった単純なユースケースではより最適な方法かと思います。

# やってみた

### コードを拾ってくる
コードサンプルがAWS公式のCloudfrontデベロッパーガイドに載っているので以下のページからコピーします

[index.html を追加してファイル名を含まない URL をリクエストする](https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/example-function-add-index.html)

### CF2に追加
CloudFront>関数にアクセスし、適当な名前をつけて保存します
![CloudFront.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38574/4cfa4c12-d3ca-81a8-977a-ec925ec9ed4c.png)

### 関数を発行する
発行>関数を発行 をポチります（コレをやらないとCloudFrontと紐付けができない
![CloudFront.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38574/d5d60f28-4c8d-cc8a-7d2e-c2eaeb39453a.png)

### CloudFrontにCF2を関連付ける
CloudFrontの該当するディストリビューション > Behavior > 編集 からViewerRequestに関連付けを行います
![CloudFront.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38574/bf89151c-ddb4-00e8-1342-f82814f4d226.png)

以上

ググったら出てこなかったので,投稿してみました。
ワード簡易解説　インターフェース　コンポーネント　プラグイン　モジュール　メタ言語

AltJSとは {
        JSの代わりとなる言語の総称。違う言語をJSに変換して使用する
        理由： JSは大規模になると実装・保守の非常が悪くなる
        ・型の定義がないので意図しない値が入ることがある
        ・nullや、undefinedが入ることがある。
        ・オブジェクト指向だが、インターフェースやクラス定義がなく、プロパティ名を間違っていても実行時までエラーにならず、エラーになっても原因の解析に時間がかかる
        ・型やインタフェース、クラスタ定義がないので、エディタによる入力補完があまり受けられない
      }
      インターフェース {
        ・webページを操作す機能や部品のあるまりのこと
        ・ブラウザに組み込まれたwebページを表したもの

        ・実装のないクラス。メソッドの型だけ定義してあるが、そのメソッドを読んだ時の処理は何も定義されていない。プロパティを持つ場合もある。
        ・処理が定義されていないのでインスタンス化できない。
        ・C++, javaなどのオブジェクト指向言語ではインターフェースを作るための構文としてinterfaceが存在してる
        ・クラスの多重継承は禁止されている言語が多いがインターフェースは多重継承が可能になる。

       必須事項 {
         ・インターフェースを実装（継承）するクラスは、そのメソッドの処理を必ず実装する必要がある
         ・インタフェースを実装（継承）したクラスのインスタンスはインターフェース型の変数に代入できる
         ・
       }
      }
      コンポーネント {
        何らかの機能を持ったプログラムの部品。ソフトウェアコンポーネントはそれぞれ特定の機能を持っているが、基本的に単体では使用できず、他のプログラムと組み合わせ機能を実現、ないし追加するために用いられる。
        また、オブジェクトの一種として、特定の機能を持つが単独では意味を持たないようなオブジェクト、ということもできる。
      }
      モジュール {
        機能単位、交換可能な構成部分。システムの接合部（インターフェース）が規格化・標準化されていて、用意に追加は削除ができ、ひとまとまりの機能をもった部品のこと。
      }
      ライブラリ {
        ・ある特定の機能を持ったプログラムを、他のプログラムから利用できるよう部品化し複数のプログラム部品を一つのファイルにまとめたもの。
        ライブラリ自体は単独で実行することはできず、他のプログラムの一部として動作する。
      }
      プラグイン {
        ソフトウェアに機能を追加する小さなプログラムのことを指す場合が多い。
        多くのソフトウェアには外部のプログラムを追加することで機能を拡張できるような機構を備えている。
        追加するソフトウェアのことをプラグイン。
        ほとんどのプラグインは単体では動作せず、本体のソフトウェアに追加しなければ機能しない。
        プラグインはソフトウェア製作者が提供する場合もあるが、仕様が公開され第三者が自由にプラグインを開発・公開できるようになっている。
      }　
      メタ言語 {
        言語を定義定義したり、言語についての情報を記述したりするための言語。
        言語の文法など言語そのものを記述するのではなく、ある言語によるコードを効率的に生成するために用いられる
      }
大学2年で統計検定2級をA判定で合格してみた

# 　はじめに
　　こちらの記事は短期合格を目的と**するものではなく**、あくまで統計検定の本質を捉えながら一定以上の期間をかけて**統計検定2級をA判定での合格**を目指す人が対象になります。
　　ここで、一つだけ注意事項があります。

:::note warn
　本記事執筆者は2021年紙媒体でのテストでA判定を取得しています。CBT方式での取得ではありません。CBT形式でA判定を取得するにも大きな違いは存在しないと思われますが、ご注意ください。
:::

　　では、これから具体的な方法について書いていきます。

#　 1.講義形式をとる
 　　いきなりなんだと思われる方もいらっしゃると思いますが、短期的な合格を目指さないのであれば**確実に行うべきこと**になります。以下では、その理由とその実践方法について見ていきます。
  (参考)以下で出てくる「統計学基礎の本」はこちらのことです。

http://www.tokyo-tosho.co.jp/books/978-4-489-02227-2/

<dl>
  <dt>a.実践方法</dt>
  <dd>　基本的には高校の講義をイメージしてもらえれば大丈夫です。板書をしながら(パワポでもいいです)講義を進めます。できれば、(確率分布の期待値など)の導出まで行けるとベストでしょう。ガンマ関数なども出てきますが、理解できるに越したことはありません。<br>
　ただ、A判定程度でしたら、<b>統計学基礎の本の中で紹介されている部分</b>まででも十分です。<br>
　講義を終えたら質問タイムです。この質問タイムでは<b>わからない部分だけでなくつまづいた部分など</b>も共有できるといいでしょう。</dd>
</dl>
　　個人情報保護の観点から板書・パワポの例はこちらにはあげませんが、手元にデータは存在するため欲しい方がいらっしゃいましたら、メールアドレスにご連絡ください。
<dl>
    <dt>b.理由</dt>
<dd>　板書をしながら進められる、または流れがおかしくないようにパワーポイントを作成するのは中々骨が折れる作業になります。統計学は知識が<b>単体ではなく基本的に繋がっています。</b>
 　逆に言えば、その流れを追えるようになると特段難しい部分は存在しません。流れを掴むためには知識を持つだけでなくつながりを考える必要がありますが、1人で勉強すると気付くのは難しいです。その点、講義形式を取ろうとすると<b>嫌でも繋がりを考えさせられます。</b>
</dd>
<dl>

# 　　2. 一週間に一度は過去問を解くようにする
　　これも一つ目同様、とても重要なものになります。というよりもこれら**二点を抑えれば間違いなくA判定での合格が可能です**。
　　どれだけ自分の能力に自信がなくてもまずは一週間に一度過去問を解きます。統計系の知識を講義形式でいくら蓄えられても、**A判定を獲得するには統計検定特有の言い回し・問題になれなければなりません**。
　　2021年6月の問題では「パーシェ指数」についての問題が出題されましたが、これは先ほど紹介した本の中には出てこない指標になります。本の中で紹介されていない指標なので**問題文を読解できれば間違いなく正解が可能**です。こういった問題はA判定をもらう上では落とせない問題になります。

#　おわりに
　上記二つのみだけでも、徹底すればA判定での合格は近いです。過去問について言えば、**勿体無いからととっておくよりは何周もしましょう**。
　講義形式についても一緒にできる方がいないという方は**Twitterなどで声かけをすると案外集まったりもします**。資格を取ろうという意気を汲み取って、一緒に頑張ってくれる方はいっぱいいます。恥ずかしがらずに色々な場所で声かけをしてみてください。
　それでも恥ずかしいという方は、僕はデータサイエンスのグループの運営もしていますので是非是非メールアドレスに連絡をください！
　時間が空いてしまうかもしれませんが、必ずお返事をさせていただきます。

　**最後まで読んでくださり、ありがとうございました！！**
[Rails]deviseで使えるモジュールについて

##初めに
####なぜこの記事を書きたかったのか
deviseを使うときのmodelの記述でわからないままにしてあったのがあったので、勉強するため記事にしたかった

####環境
・Macbook Air (Retina, 13-inch,2019)
・プロセッサ 1.6GHz デュアルコアIntel Core i5
・メモリ　8GB 2133 Mhz LPDDR3
・MacOS Big Sur　バージョン 11.5.2

####記事の目次
**１）deviseって？モジュールって？**
**２）前提条件(deviseの導入)**
**３）モジュールの種類**
**４）モジュールの追加方法**
**５）最後に**

##deviseって？モジュールって？
####deviseについて
**deviseとはgemの一種で導入することでログイン/新規登録機能が簡単に使えるようになれる！**

####モジュールについて
**モジュールのイメージは機能が入っている箱の名前だと思う！これを使うことで１からコードを組んで作成しなくとも自分がほしいシステムと近いものが使えるのです！**

##前提条件（deviseの導入）
####（製作中：ここにリンクをはろうと思う）

##モジュールの種類(１０種類)
####デフォルトで入っているもの
![defaultmodulefordevise.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/861c4d0d-62fe-7371-b16e-832ec165997b.png)

上記の画像のdevise後の青い文字はdeviseを導入するときにdefaultで入っている機能です。

```
(モジュール名：database_authenticatable)
＝メールアドレスとパスワード入力のログイン機能
```

```
(モジュール名：registerable)
＝サインアップ機能
```

```
(モジュール名：recoverable)
＝パスワードリセット機能
```

```
(モジュール名：rememberable)
＝プラウザを閉じてもログインしてくれる機能
```

```
(モジュール名：validatable)
メールアドレスとパスワードのバリデーション機能
```

####追加で入れれるもの

上記の画像のコメントアウトされている緑色の単語はdefault時にはないものです。

```
(モジュール名：confirmable)
＝サインアップしたときに登録したメールを使って、userにメールアドレスを確認させることができる機能
```

```
(モジュール名：lockable)
＝設定した回数分ログインが失敗されたときにアカウントをロックさせる機能
```

```
(モジュール名：timeoutable)
＝一定期間アクセスがないと強制ログアウトさせる機能
```

```
(モジュール名：trackable)
＝ログイン時の情報をデータベースに保存することができる機能
```

```
(モジュール名：omniauthable)
＝Twitterやgoogleアカウントなどでログインが可能になる機能
```


##モジュールの追加方法
##1)rails g devise:installコマンドで生成したマイグレーションファイルを開く
![usermigrationfilesample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/1f918332-3572-d767-8706-a88118f6fa4c.png)

##2)使いたいモジュールのコメントをコメントアウトする。(例としてTrackableをコメントアウトしてみる)
![commentoutsample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1102030/56fe5e98-867d-898a-5ff0-6211adf4a557.png)

##3)ターミナルでrails db:migrateをする

##結果)追加されるもの

```
(routes)
devise_for :users
```

```
(model)
devise : Trackableが追加される
```

**※これで、サーバーを再起動してユーザがログインすると、trackableで追加したカラムに情報が保存される。**

##最後に
modelに書いてあったdevise　：ooooを覚えなくともログイン/新規登録機能が使えてたのでスルーしていましたが、deviseで使える機能がまだあることがしれて開発の幅が広がったので言語化してよかったと思った！実際に他のモジュールも使い始めたらまた記事に書こうと思いますb

ココまで読んでくださいましてありがとうございました!
HTMLとCSSの基本記述

HTMLとCSSの基本記述 {
        ・CSSはクラスに記述する {
          エレメントやタグではなくクラスに指定する。
          HTMLエレメントにCSSをかくと打ち消しのためのCSSが増える
          制限されたCSSをかくと再利用性が下がる
          クラス名をわかりやすくする
        }
        ・CSSプロパティはアルファベット順
        ・ HTMLタグとCSSのインデントは半角スペース2
        ・CSSのプロパティをまとめる
        ・色の16進トリプット表記は可能なら３桁表記に
        ・CSSのネストは孫まで
        ・CSSのレンダリング速度
        ・セレクタのマッチ数を減らすと高速に動作する
          ・CSSのセレクタは右から順に評価されるため、CSSの指定セレクタが多い場合は動作速度も遅くなる。
        ・ベンタープレフィックス {
            ・各ブラウザごとの草案段階の先行実装や、独自拡張機能であることを判断するための識別子のこと。
            メリット {
              ・ベンダープレフィックス対応のブラウザで、CSSの最新機能を反映できる
            }
            デメリット {
              ・CSSの仕様が固まれば、不要になり廃止される場合がある。
              ・その場合、CSSファイルの中に不要なコードが残りCSSファイルを肥大化させる可能性がある。
            }
          }
        ・JavascriptからアクセスするIDとクラス {
          JavascriptからIDもしくはクラスを利用する場合は、ブロック名の前に「js-」をつける。
          js-がついたクラスは、CSSファイルには記述せず、デザインのスタイルを当てないようにする。
            これはスクリプトとデザインで使用されているクラスを明確に分けるため
          HTMl要素の中に、CSS用のクラスと、JSクラスを作成しておく。
        }
        ・IDにスタイルを当てない {
          IDはページ内で一つしあk使用できない
          IDは詳細度の計算を複雑にする
            ID経由で多重継承したCSSスタイルの継承は、複雑で難易度が高い
            クラスよりもIDの方が詳細度が強いという理由でのみ、IDにCSSが書かれている現場がある。
        }
        ・インラインスタイル使用不可 {
        }
      }
JSでresizeイベントを使うときの注意点

Webページでウィンドウサイズが変化したときに何か処理をさせるのに便利な

```JavaScript
window.addEventListener("resize", function() {});
```
ですが、

このまま素の記述で実装してしまうと、スマホのブラウザで表示したときに**URLのバーが伸び縮みする動作もウィンドウサイズが変更されたと判定されてしまう**ので、単にスクロールしただけでイベントが発火してしまいます。
（例：ウィンドウサイズが変更されたときにページをリロードするように記述していた場合、スクロールしてURLバーのサイズが変わるたびにリロードされてしまう。）

これはPCブラウザのレスポンシブモードでは**確認できない現象**なので注意が必要です。

<br>
「ウィンドウサイズの変化」とは少し性質が違いますが、
例えばスマホ画面の縦・横の向きが変化したときに処理を発火したい場合などは、

```JavaScript
window.addEventListener("orientationchange", function() {});
```

を使う方がいいかもしれません。
Arduinoの設定

# Arduinoとは

Arduinoとは入出力ポートがあるマイコンボードです。
プログラムを書いて、センサーの値を読み込んだり、モーターを動かしたり、LEDを光らせたりと電子工作といわれることが簡単にできます。
![medium_IMG_0100.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/e863e740-4f01-2a2a-e598-c352a294afb4.jpeg)


# Arduinoの開発環境を整える
プログラムはArduinoの開発環境（ArduinoIDE）で作成します。
ArduinoIDEは[Arduinoのダウンロードサイト](https://www.arduino.cc/en/software)からダウンロードできるので、自分のOSにあったものをダウンロードして、インストールしてください。(Beta版はやめておきましょう）
Macはダウンロードしたzipファイルを解凍後、アプリケーションフォルダに移動させましょう。
[こんな感じ動画 Macの例](https://youtu.be/clONQaxjlJ4)

Windowsはインストール途中の画面で何か選択するような画面が出てきても、全て「次へ」を選択してインストールを完了してください。


# ArduinoとPCを接続する
ArduinoとPCはUSBで接続します。付属のケーブルはtypeAなのでパソコンがTypeCの場合は変換アダプタなどを使いましょう。

## ボードを選択
Select Boardというリストボックスをクリックします。
![スクリーンショット 2023-03-07 9.54.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/1c03cb70-829e-7fe7-359d-0e992893e1d8.png)

Arduino Unoを選択します。
Arduino Unoと出てこない場合は、Arduinoを抜き差しして、どれがArduinoか確認して、そのボードを選択してから、Arduino Unoを選択してください。
![スクリーンショット 2023-03-07 10.09.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/4dd63410-0f2c-7f40-7b72-ea60818f3f71.png)

選択されたボードがArduino Uno　という表示に変わったか確認します。
![スクリーンショット 2023-03-07 10.10.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577027/93d3a0dd-b6b3-53f6-dcbc-784153e0d130.png)
[paiza] 標準入出力 (paizaランク C 相当) Java・nextとnextLineの違い スキルチェック練習問題

<h2>初めに</h2>

今回は以下の問題に挑戦しました。
レベルアップ問題集なので、コードの公開は自由です。

<h6>今回は、nextとnextlineの違いについて理解することができました！（違いについては後述）</h6>

<h2>標準入出力 (paizaランク C 相当)</h2>


https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_std_in_out_boss



```
毎年 5 月 1 日に、自分が運営している会社の社員一覧表を作成しています。
表は年度ごとに更新され、社員の名前と年齢が載っています。
ところで、会社のメンバーは昨年度から全く変わらず、
社員の誕生日は全員 7 月 7 日だったので、
前年度の一覧表の年齢欄をそれぞれ +1 するだけで今年度の表が作れることに
パイザ君は気づきました。
昨年度の一覧表が与えられるので、今年度の一覧表を出力してください。

N
s_1 a_1
...
s_N a_N

1 行目には社員の数を表す整数 N が与えられ、
2 行目 〜 (N + 1) 行目の各行では、社員の名前を表す文字列 s_i と
その社員の昨年度の年齢を表す整数 a_i が
半角スペース区切りで与えられます（1 ≤ i ≤ N）。
```


<h2>解答コード</h2>

```java:
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //データの個数を取得
        int n = sc.nextInt();
        for(int i=0; i<n; i++){
　　　　　　　　　　　　　　　//名前取得
            String name=sc.next();
　　　　　　　　　　　　　　//年齢取得、その取得した年齢に＋１する
            int a =sc.nextInt() + 1;
            System.out.println(name+" "+a);
        }
        
    }
}
```

<h6>勘違いしていたところ</h6>
```String name=sc.next();```の箇所ですが、```String name=sc.nextLine();```としてました。
文字列を受け取るのが```sc.nextLine();```と理解しており、
```sc.nextLine();```で、「yamada」みたいな社員名を受け取ってると思っていました。
ですが、仮に```String name=sc.nextLine();```とし、
標準入力が「yamada 30」だった場合、　nameには「yamada 30」が入ってしまいます。

<h2>sc.next();とsc.nextLine();の違い</h2>
上記の記述で、なんとなく違いがわかったかと思いますが、
2つの違いは以下の通りです。
```sc.next();```空白までを文字列と認識する
```sc.nextLine();```途中の空白も文字列と認識し、改行までを文字列と認識する


```
入力が、以下だった場合、
yamada 30

String a = sc.next();
aに入るのは、　yamada

String a = sc.nextLine();
aに入るのは　yamada 30
```

<h2>以下の記事を参考にしました</h2>

https://mikado.hatenablog.jp/entry/2014/05/29/231135