OmniAICreator/Qiita-1.07M huggingface dataset:
EEM でルーティング障害のログを自動取得してみた

# Qiita Advent Calendar 2022に初参加
今年はじめてQiita Advent Calendar 2022に初投稿させていただきます。
内容は簡単なものになりますが、私なりに調べて記載いたしました。
CML（Cisco Modeling Labs）で簡単な構成で構築もしましたので共有させていただきます。

![advent.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723514/30013cbf-1781-6c40-7064-d1822bc45588.jpeg)


# 本記事の概要
ネットワークエンジニアの業務をしていく中で、最近よく耳にするのはネットワークの自動化（プログラマアビリティ）です。

自動化という観点で、EEM（Embedded Event Manager）という機能がCisco機器に実装されていますので、その機能を用いてルーティング障害が発生した際のログを自動で取得するコマンドを設定してみました。


## EEM（Embedded Event Manager）とは
EEM（Embedded Event Manager）は、イベントモニタを行い、対象となるイベントが発生した際やカウンタが閾値を超えた場合にそれを検知し、そのイベントと関連づけたアクションを起こすことのできる IOS の機能です。

事前にイベントとアクションを設定し、イベントを検出すると、設定しておいたアクションを自律的に実行してくれます。

|トリガー例 　 |イベント内容例                  |
|----------|--------------------------|
|SNMP  |SNMP MIBオブジェクトを監視し、オブジェクトの値が任意の値とマッチするか、任意の閾値を越えた場合にイベント通知|
|Syslog|事前に定義した文字列をトリガーにイベント通知|
|Timer|absolute-time-of-day、countdown、watchdog、CRON の 4 タイプのタイマーをサポートし、それぞれイベントを通知|
|Interface Counter|インタフェースカウンタが閾値を超えた際にイベントを通知|
|CLI|CLIを正規表現で検査し、マッチした場合にイベントを通知|
|OIR|モジュール等のOIRを検知した場合にイベント通知|
|SNMP Proxy|外部からのSNMPトラップを受けてイベントを通知|
|Routing|ルーティングテーブルの変化を検知した際にイベントを通知|
|NetFlow|NetFlow情報監視し、オブジェクトの値が任意の値とマッチ、あるいは任意の閾値を越えた場合にイベント通知|
|Neighbor Discovery|CDPまたはLLDPによる情報を受けてイベントを通知|
|Mac Address Table|MACアドレステーブルの変化を検知した際にイベントを通知|

## テスト環境作成、トリガーイベント内容について
今回はCMLで簡単にEEMの構成を作成してみました！

<構成図>![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723514/16d315b1-1db6-c8dc-81bb-397bb625d544.png)

<トリガーイベント内容>
◆トリガー
RT01にてRT02へのOSPFネイバーがダウン

◆イベント
1.RT01のSyslogメッセージに「Neighbor Down」コメントを出力
2.RT01のflashにincident.txtを作成
3.incident.txtに「show tech-support」コマンドの結果を出力

RT01にEEMの設定を追加
```
event manager applet OSPF_Down_Log01
 event syslog pattern ".*OSPF-5-ADJCHG*.*Neighbor Down*"
 action 1.0 syslog msg "!!!OSPF neighbor down detected!!!"
 action 2.0 cli command "enable"
 action 3.0 cli command "show tech-support | append flash:incident.txt"
```

# テスト実施
手順1:RT01のflashに「incident.txt」がないことを確認
![before.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723514/8fc35bf0-9d9f-4f63-1b01-7f02c58f75c3.jpeg)

手順2:RT01が正常にRT02とOSPFネイバーがはれているか確認
![before nei.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723514/72b9d6b5-b366-7033-2f67-4f611d398b4b.jpeg)

手順3:RT02のinterface GigabitEthernet 1をシャットダウン
![shutdwon.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723514/abb0c233-a1cc-a809-be9f-45ef1adf6d61.jpeg)

手順4:RT01上でRT02とOSPFネイバーのダウンを検知
![before nei kennti.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723514/25c12f9b-a73e-7eed-3f68-8f5b053a82c1.jpeg)

手順5:RT01のflashに「incident.txt」が作成され、「show tech-support」コマンド結果を出力していることを確認
![after.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2723514/fb2400b6-7a19-47bc-4932-fb645a5ca6dd.jpeg)

上記の手順より、EEMの設定が正常に動作していることを確認できました！

# まとめ
お客様の運用をしていく中で、障害発生時のログを発生した際に取得したいと
思うケースが多々ありました！
今回はルーティング障害のみのテストでしたが、トリガーを組み合わせて、複数のイベントを実施できるのはとても魅力を感じました。
規模問わず、お客様のネットワークの運用で利用できれば、運用の質も向上しますね。

# 参考文献
https://www.cisco.com/c/ja_jp/support/docs/network-management/network-monitoring/eem.html

https://www.itbook.info/network/eem.html
【E325: ATTENTION】Found a swap file by the name "~/.bash_profile.swp"　に遭遇した際の対処法

現在エンジニアを目指して学習中です。
これまであまり触れてこなかったターミナルやvimに触れているなかで
エラーが出たので備忘録です。

## 前提

現在、自分のMacにMAMPを入れて開発をしています。
そのMAMP内のPHPをターミナルで使えるようにするために
パスを通そうとした際に発生したエラーです。


↓実行しようとしたコマンド
```
vim ~/.bash_profile
```
こんなエラーが発生しました。

```
E325: ATTENTION
Found a swap file by the name "~/.bash_profile.swp"
          owned by: hoge   dated: 木 12 01 11:14:23 2022
         file name: ~hoge/.bash_profile
          modified: YES
         user name: hoge   host name: hoge-mac.lan
        process ID: 5432
While opening file "/Users/hoge/.bash_profile"
      CANNOT BE FOUND
(1) Another program may be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r /Users/hoge/.bash_pr
ofile"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file "/Users/hoge/.bash_pr
ofile.swp"
    to avoid this message.

Swap file "~/.bash_profile.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (D)elete it, (Q)uit, (A)bort: 
```

swap fileが見つかり、それが問題らしい。

## そもそもswap fileとは

[参考記事](http://nanasi.jp/articles/howto/file/seemingly-unneeded-file.html)を引用します
```
.swpファイルはスワップファイルと呼ばれています。
スワップファイルはアプリケーションのクラッシュに備えて、 vimエディタでの編集開始時に作成され、編集後に削除される編集情報の記録ファイルです。
スワップファイルを使用していれば、vimエディタがシステムエラーで強制終了しても、 保存前のデータが失われずに済みことがあります。
```

1. vimエディタで編集を始めると勝手に作成されるバックアップファイル
2. swap fileが存在しているということは、以下のどちらか
   1. 同時に同じファイルが編集されている
   2. 以前編集した際に保存しないまま終了した

ということを抑えておけば良さそう。
今回の私のケースは、「2.以前編集した際に保存しないまま終了した」に該当。

## エラーの対処法

このページに詳しくまとまっていました。
[swapファイルが見つかった場合にどのように対処すべきか（クラッシュからのリカバリー）](http://nanasi.jp/articles/howto/file/crash-recovery.html)

私の場合、phpのパスを通すコマンドをやり直すだけだったので、
`d`を入力してswap fileを削除しました。

すると、vimエディタが編集前のまっさらな状態で復活。解決です。


## どうすればよかったのか
vimエディタでの編集を終了する際のコマンドがこちら

```
// 保存して終了
:wq

// 保存ずみのファイルからとりあえず抜ける
:q

// 保存しないで終了
:q!
```


## 参考
https://www.tweeeety.blog/entry/2017/01/25/001208

http://nanasi.jp/articles/howto/file/seemingly-unneeded-file.html

https://aruga.hatenablog.jp/entry/2018/05/09/210430

https://qiita.com/kon_yu/items/b8864ff566b8b67a9810
kintoneで作るシンプルな健康管理アプリ（これ１人用なんだ）

今日は、日々の体重や健康状態などを記録するアプリを作ってみましょう。
※私からのクリスマスプレゼントです・・・。受け取ってください・・・。


# 作るアプリ
**健康目標アプリ**と**日々の健康記録アプリ**の2つ作ります。
* 健康目標アプリ
目標体重を入力するアプリ
![2022-12-01_12h22_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/b736a61d-a8ad-6525-c8ca-9c33d501fb72.png)
* 日々の健康記録アプリ
毎日の体重とか記録するアプリ。新規作成時にルックアップで自動的に体重持ってくるから色々楽。たぶん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/383a4ac4-0ebd-d821-55cf-4f64d610e9c3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/7676ff68-56f6-197e-4deb-6fbaf446fabf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/a0c4bfac-e6ec-c36a-ee3c-f9975a8bd762.png)


## 健康目標アプリ
### フィールドの準備
|フィールドの種類|フィールド名|フィールドコード|備考|
|--|--|--|--|
|日付|日付|日付||
|数値|元々の体重|元々の体重|単位kg|
|数値|目標体重|目標体重|単位kg|
|文字列(1行)|キー|キー|重複禁止|

### レコードを1件作っておこう
日付、元々の体重、目標体重を入力して、キーはとりあえず1って入れておきましょう。

## 日々の健康記録アプリ
### フィールドの準備
|フィールドの種類|フィールド名|フィールドコード|備考|
|--|--|--|--|
|日付|日付|日付||
|数値|体重|体重|単位kg|
|ラジオボタン|体調|体調|絵文字で自由に|
|文字列(1行)|備考|備考|複数行でもいいよ|
|計算|何キロ減った|何キロ減った|計算式：元の体重-体重|
|計算|あと何キロ|あと何キロ|計算式：体重-目標体重|
|グループ|グループ|グループ|
|ルックアップ|ルックアップ|ルックアップ|グループフィールド内<br>設定は後述|
|日付|最初の日付|最初の日付|グループフィールド内|
|数値|元の体重|元の体重|グループフィールド内|
|数値|目標体重|目標体重|グループフィールド内|
|文字列(1行)|カレンダータイトル|カレンダータイトル|グループフィールド内<br>☑自動計算する<br>計算式：体調 &" / " & 体重|

### ルックアップの設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/caea018a-1d68-8f00-a8e8-eebb0588675e.png)

### フォームの配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/5af5eaa7-db1c-689b-54ec-ca126905e42e.png)

### JavaScript
```javascript
(() => {
  'use strict';
  // 編集、新規作成
  kintone.events.on(['app.record.edit.show','app.record.create.show'], function(event) {
    // キーをベタがきしてる
    event.record.ルックアップ.value = 1;
    event.record.ルックアップ.lookup = true;
    
    return event;
    
  });
  
  // 一覧
  kintone.events.on('app.record.index.show',function(event){
      const el=kintone.app.getFieldElements('体調');
      el.forEach(e=>{e.style.fontSize='x-large';});
  
      return event;
  })
  
})();
```

# まとめ
日々の健康記録アプリのグラフや一覧画面をちょっと工夫すると
現在の体重がバレないような見た目にできる。
コードもちょっとだし、作るのも入力も簡単だからやってみてね。
Docker上にNodeJSとAWS Amplify（Amplify CLI）の環境の構築

# はじめに
本記事は、チーム開発において、個々のローカル環境を同一に整えるためにDocker上にNodeJSとAWS Amplify（Amplify CLI）の環境の構築した。
主に、Dockerfileとdocker-compose.ymlのコードを説明する。

## AWS Amplifyとは　
※[AWS Amplify で始める、サクッとアプリ開発](https://aws.amazon.com/jp/builders-flash/202103/amplify-app-development/?awsf.filter-name=*all)から引用

1. サーバーレスなバックエンドをセットアップするための Amplify CLI
2. フロントエンドからバックエンドに接続するための Amplify Libraries
3. CI/CD やウェブアプリのホスティングに向けた Amplify Console
4. ユーザー管理や CMS 的なコンテンツ管理を一元化するコンソール Amplify Admin UI
などから構成される、Web およびモバイルアプリ開発のためのフレームワークです。

# Dockerfileの作成（Node18を使用）
```Dockerfile:Dockerfile
FROM node:18

# amplify CLI
RUN npm install -g @aws-amplify/cli

WORKDIR /app
```

# docker-compose.ymlの作成

```yml:docker-compose.yml
version: '3.8'

services:
    amplify:
        build:
          context: .
          dockerfile: Dockerfile
        volumes:
            - .:/app
            - ~/.aws/:/root/.aws/
        ports:
            - "3000:3000"
        tty: true
        command: sh -c "yarn install && yarn dev"
```

# イメージの作成からコンテナの起動、Amplify CLIの確認まで
## Dockerイメージの作成
```bash
$ docker-compose build
```

## イメージの確認
```bash
$ docker images
```

## コンテナの起動
```bash
$ docker-compose up -d
$ docker-compose ps
```

## 起動中のコンテナに入る
```sh
$ docker exec -it コンテナ名 sh
```

## コンテナ内でAmplifyのバージョン確認
エラーが発生せず、amplifyのバージョンが出力されれば成功。
```sh
$ amplify --version
```
この30年でコンピュータはどれだけ速くなったのか?

## 祝Thinkpad30周年

IBM Thinkpad (現Lenovo Thinkpad) は1992年発売開始です。祝30周年！

https://www.thinkwiki.org/wiki/ThinkPad_History

まだインターネットが世間でマイナーだった時代、1993年製の220(中古)にNetBSD/i386を入れて使っていました。最近のThinkpadは持ってませんけどX220あたりまで歴代のThinkpadを使ってきました。でもX61までが好き(まぁ譲ってX220までか?)

>Thinkpad か... なにもかもみな懐かしい


## ベンチマークコレクション(30年分)

さて、それから30年、コンピュータは、どれくらい速くなったのでしょうか？

おりにふれベンチマークしてきた30年分の秘伝のタレのような[ベンチマークレコクション](https://technotes.fml.org/tech/benchmark/unixbench/)から、いくつか抜粋して見ていきましょう。オリジナルは次のURLになります(新製品をゲットするたびに随時アップデート)。詳細は、そちらの表を御覧ください。速いマシンから遅いマシンへ降順で並んでいますので、30年前のマシンは一番下になります

https://technotes.fml.org/tech/benchmark/unixbench/

なお、ツールはbytehench v4 v5が混在、計測時のOSもアーキテクチャもマチマチですが、オーダの比較程度と思って生暖かくみまもっていただければとおもいます。あと以下、複数コアの場合は複数コアの計測値を引き合いに出していきますが、オリジナルの表には、1COREと全CORE使うばあい両方のデータがあるので興味のある方はそちらをじっくり御覧ください


### 1993

Thinkpad 220のベンチマークは**0.3**でしたが、このマシンでドキュメントの読み書きをしていたのでした。全然だいじょうぶ。OSは、もちろんNetBSD/i386 [(Of course it runs NetBSD)](http://www.jp.netbsd.org/ja/about/portability.html)。いまでも起動しますが、HDDが壊れてきてます...

ちなみに1993年はNCSA Mosaic (-> Netscape navigator -> Mozilla Firefox)が登場した年でした。fj.sourcesの記事を集めて、コンパイルして、いざ起動してみた！け、れ、ど、見るサイトがないよ?とりあえず気象庁で人工衛星ひまわりからの地球の様子を見てすごいぞ！と思った記憶があります(ただ、そのあと二度と起動しなかったかもしれません、だって見る先がないんですもの:-)


### 1996

1996年発売のThinkPad 560 (OS: NetBSD/i386 4.0時代の計測値)は12.5なので、3年で随分はやくなりました。
40倍?（なんか220の計測値がおかしい気がしますね)

![Thinkpad_560.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321909/1e32d849-8474-ce9a-c857-531ddeb4bae6.jpeg)
写真:Thinkpad 560 (大きさ比較のため、手前にマッキーを置いてみました)。最近は3:2のディスプレイが流行だったりするので、一周回って4:3も変ではない気がしますね(?)



### 2001

HP lp2000r はサーバ機です。CPUはPentium3 1.13GHz、ベンチマークは 129.6 (OSはNetBSD/i386 9.0)です。5年でThinkpad560の10倍になりました…ってノートと業務用サーバを比較するのはフェアではないですね(次のRX300S6との比較に使います)。

ちなみに、これは当時のままSCSIで今でも動いています。昔のサーバ機材は頑丈です。


### 2012

[FUJITSU PRIMERGY_RX300S6](https://technotes.fml.org/tech/benchmark/unixbench-rx300s6/)が5608.9(1COREあたり975.3)です。仮想母艦に使うクラスですね。1コアあたりで比べるとlp2000rの8倍くらい。10年でこれだけ速くなりました。業務用は、コア数と搭載メモリ量でハイパワーになっています
- 2012年あたりの業務用サーバ
- 4コアx2(16HT)
- メモリ8GBx12 (96GBなのは単に予算の問題です、最大384GB)
- SAS15000rpm(MBE2147RC)x8をMegaRAIDでRAID10
- Debian/amd64 9.9

![RX300S6](https://jp.fujitsu.com/platform/server/primergy/product-navi/image/rx300s6-201004-25x8.jpg)



### 2022

では最新の機材は？というと、手のひらサイズのMINISFORUM HM90は実に**11677.7**です(20年で約100倍！1コアあたりで十数倍)
- AMD Ryzen9 4900H (8C/16T)
- DDR4 16GB
- M.2 2280 SSD 512GB
- OSはUbuntu/amd64 22.04
- RX300S6とくらべてCOREあたり2倍なので、同じ8C/16HTなので、トータルも2倍の差です


ついでにChromebookも紹介しましょう。あまり速くなさそう？と思うかもしれませんが、そんなことはないです。2022年3月発売のASUS Chromebook Flip CM3 (CM3200FM1A)は2338.4です(注: linux環境での計測)。ちなみに、これは名機[Chromebook C101PA-OP1](https://technotes.fml.org/tech/pc/chromebook/chromebook-c101pa-op1/)の事実上の後継機だと思われる機材です(十分速いとおもっていたC101PAの約3倍はやい)


## おまけ

HAL9000(映画版)も1992年生まれだそうですが、残念ながらベンチマークはできていません:-)


## CHANGES

- 2024/09/29: タグの bytebench を unixbench に変更しました
ひとりでやることをやめた話「Qiita Organization」

自分のスキルが伸び、できることが増えて、いろいろなことに興味を持つと同時にそれらに手を出すことを繰り返してきました。広く浅く、良く言えば多趣味、悪く言えば飽き性とも言えます。これが完全にダメなこととは言いませんが「継続は力なり」という言葉あるように、そのスキルが自分の中で定着しない状態や、試みが効果を発揮する状態の前にやめてしまったりということが続いていました。

この問題に対応するには、結論から言うとタイトル通り「ひとりでやることをやめる」ことがとても重要です。これをどういう考えをもって進めているかを書いていこうと思います。

この記事はTDCソフト株式会社Advent Calendarの1日目です。

https://qiita.com/advent-calendar/2022/tdc

## Qiita Organization

じつはこのQiita Advent CalendarやTDCソフトでやっているOrganization、去年までは一人で作って一人で運用してました。立ち上げや社内承認を手伝ってくれていた先輩社員はいたのですが、企画者が自分だったこともありなんやかんやで運用は一人でやっていました。一人でやると、気楽である反面、コミットメントは薄れますし、Organizationとしての成長は微妙だったようにも感じます。特にこの活動に対してKGIもKPIも設定していなかったし、たまに声掛けしながら執筆している人にOrganizationに入ってもらっていたぐらいで、人数の伸びも2000人近くいる社員数に対してゆっくりでした。

ですがある時ふと、これ自分が死んだらOrganization終わっちゃうなって思いと、やる気や目的感持ってやっている人を巻き込めば、ダレてしまっている自分自身やOrganizationにも息を吹き込めるんではないかという期待のもと、@Shoma0210さんに声をかけました。即快諾してくれて嬉しかったのを覚えています。

そこからどうすればQiita Organizationが盛り上がるのかというのをチャットでも議論したり、運用に沿って新メンバーを受け入れたり記事のチェックを行っているのを見ると、「あ、楽しいぞ」と思うことが増えました。

## Advent Calendarの話

そしてTDCソフトAdvent Calendarにいたります。実はわたしは去年一昨年とQiitaにアジャイル開発のAdvent Calendarを作ってきましたが、もう全然人が集まらないのなんの（その中でも書いてくださった方は本当にありがとうございます！）。

https://qiita.com/advent-calendar/2021/agile

でも今年はそれを社内のアドベントカレンダーとしてやって、全部埋めることを目指そう！というゴールができると途端にイベントっぽくなり、告知して人がくるのが嬉しくなったりしました。実際にこのアドベントカレンダーの期間にも何人もの方がOrganizationにジョインしてくれました。そうするとこの活動をすることが楽しくなり、また広めていこうという活力が湧いてきます。まだ現時点では空きはあるのですが、これもどうにかしたい！そのためにアクション取っていこうという雰囲気が私たちの中にあるのがまず昨年度までの自分との違いとして感じています。

## チームを作ること

当たり前の話ですが、自分が影響を与えられる範囲は自分が見えている範囲だったり自分が露出している範囲に限定されます。そこで発揮できる影響力も異なります。そこに新たな人が１人でも増えれば、多少エリアがかぶっていても影響力が変わったり、異なる展望がチームにもたらされるのです。

「早く行きたければ一人で進め。遠くまで行きたければ、みんなで進め」というフレーズは岸田首相の演説でも使われましたが、それ以前からアジャイル界隈ではよく同じ意味の言葉が使われていました。ジョン・コッターの変革のステップでも2ステップ目が「変革をリードするチームをつくること」となっています。

何かをしたい時は、きっかけは一人でもいいと思います。それが最初のスタートダッシュにもなることはさっきのフレーズにもありますし、私自身経験からそういう場合もあるなとは思います。自分のやりたいをビジョンに変換し活動を開始することは大切です。でも活動を楽しくしたいなら、その大きなゴールを本気で達成したいなら、まずは仲間を見つけてみて一緒に活動してみてはいかがでしょうか。

明日はそんな私のQiita Organization運営仲間の@shoma0210の2日目記事です！いつもありがとうございます！楽しみ！
【Ruby】「puts、print、p」の違いについて

## puts

- オブジェクト出力後に改行して、メソッドの戻り値を出力する
- putsメソッドの戻り値は「`nil`」になる
- 配列を渡した場合、要素ごとに改行して出力する
- 文字列以外のオブジェクトは、to_sメソッドによって文字列に変換される

```ruby
> puts 123
123
=> nil

> puts 'foo'
foo
=> nil

> puts "foo\nbar"
foo
bar
=> nil

> puts [1, 2, 3]
1
2
3
=> nil
```

## print

- オブジェクト出力後に改行されない
- printメソッドの戻り値は「`nil`」になる
- 配列を渡した場合、配列をそのまま出力する
- 文字列以外のオブジェクトは、to_sメソッドによって文字列に変換される

```ruby
> print 123
123=> nil

> print 'foo'
foo=> nil

> print "foo\nbar"
foo
bar=> nil

> print [1, 2, 3]
[1, 2, 3]=> nil
```

## p

- putsメソッドと同じようにオブジェクト出力後に改行する
- 文字列を出力すると、ダブルクォーテーション(`""`)で囲んで出力する
- 渡されたオブジェクトそのものがメソッドの戻り値になる。
    - 改行文字(`\n`)をそのまま出力する(改行されない)
- 配列を渡した場合、配列をそのまま出力する
- 文字列以外のオブジェクトは、inspectメソッドによって文字列に変換される

```ruby
> p 123
123
=> 123

> p 'foo'
"foo"
=> "foo"

> p "foo\nbar"
"foo\nbar"
=> "foo\nbar"

> p [1, 2, 3]
[1, 2, 3]
=> [1, 2, 3]
```

## 参考

https://qiita.com/nyaoo/items/f5d84581d3a301a9c22f

https://qiita.com/yyykms123/items/2706d14ee4515c2ba406
プログラミングは「書く」だけでなく「読む」力が大切

ボクがプログラミング学習したいた時と実際の業務で感じたギャップの一つを今日も書こうと思う。

タイトルでもある通り、コードは「書く」以外に「読む」力が大切だ。

学習しているときは一から書こう、とボクも意気込んでいたが、実際の現場になると「書く」よりコードを読む時間の方が長くなる時すらある。

今日はどうしてそんなにコードを「読む」ことが大切なのか、書いていきたいと思う。

###### ■理由１：実業務では新規開発より、すでに存在しているプログラムの改修や解析が圧倒的に多いから。

これは会社を立ち上げるか・就職するかの違いに例えたらわかりやすいかな、と思う。
会社を一から立ち上げるのは、プログラムでいうと新規開発にあたる。
もちろん起業自体は世の中にたくさんやっている人はいる。
ただ大抵の人は、すでにある会社に就職すると思う。これがすでに存在しているプログラムの改修・解析にあたる。
すでにある会社に就職するとなるとまずいきなり、社内で新しい部を立ち上げよう、新しく制度を提案しようとする人は少ないのではないだろうか。
まずはその会社の風土を理解したり、同僚・先輩や上司と仲良くなるために行動すると思う。

プログラムの場合も同じで、まずは存在するプログラムの理解に努めた方がよい。
プログラム（会社のこと）を理解して、初めてプログラムの改修・解析（会社をよくするための行動）ができるようになると思う。

###### ■理由２：自分がコーティングするにあたって、他の機能に影響しないか調べる必要があるから。
現場で扱うプログラムは、1つ・2つのソースコードでなく、数十・数百となるプログラムを扱うときが多い。こういった場合、自分が実装した部分が思わぬところに影響が出ることがある。
例えば、このように改造したとしよう。

~~~ プログラム：サンプル.txt
関数A (
       処理（１）
       処理（２）
       処理（３）  → ここを改造
  )
~~~

この関数Aを呼び出しているところが仮に3か所あったとしよう。
すると、3か所の中で自分が関わっていない機能が存在しているかもしれない。
となった時、自分に関係ないから。。と放置するわけにはいけない。
3か所の部分で問題ないことを確認する（読み解く）必要がある。

###### ■理由３：仕様書が使い物にならず、実際のプログラムからシステムの仕様を読むとる必要が出てくるケースがあるため。

現場によっては、仕様書（システムの説明資料）、プログラムがあったとしても、
プログラムにだけ機能追加や改修をやって仕様書を更新し忘れていたり、下手すると仕様書自体存在しないケースもある。
こういった場合、プログラムを実際に読んでシステムがどういう動作をしているか、読んでいく必要がある。
実業務で扱うシステムは練習と違って、1ファイルや2ファイルでなく数十・数百ファイルで構成されているため、自力では理解できないところもたくさんある。
こういう時に重要なのは、以前別記事でも紹介した、人に聞く力だ。
（※) 参考記事
https://qiita.com/894kun/items/f818faed1057dc41100d











参考までに。
picoCTF Writeup picoGym Practice Challenges Search source (注意<spoiler>)

# Search source

Description
The developer of this website mistakenly left an important artifact in the website source, can you find it?
The website is here


サイト内全探索
```
>wget -m http://saturn.picoctf.net:58133/
```

```
>grep -r "picoCTF" *
saturn.picoctf.net+58133/css/style.css:/** banner_main picoCTF{1nsp3ti0n_0f_w3bpag3s_587d12b8} **/
```

picoCTF{1nsp3ti0n_0f_w3bpag3s_587d12b8}
【Docker】自分なりのDockerfile ベストプラクティス

# 自分なりのDockerfile ベストプラクティス

## Dockerfileとは
Dockerfileとは、Docker imageを構成するための設計書のこと。
DockerはDockerfileに記載されている命令を読み込み、自動的にDocker imageを構築します。

## Dockerfileのベストプラクティス
### 1コンテナ1プロセス
コンテナは1つの役割のみ持つことが推奨されています。
アプリケーションを複数のコンテナに切り離すことで、水平スケールやコンテナの再利用がより容易になります。
（どうしても追加プロセスが発生する場合はその限りではありません）

### Rootlessなコンテナを作成する
コンテナをrootで実行することは推奨しません。
（通常、コンテナはデフォルトでroot実行されてしまいます）

推奨しない理由については、下記が分かりやすいかと思いますので、引用させていただきます。

> コンテナを root 実行することはなぜ危険なのでしょうか。それは、コンテナ内の root の実態がホスト(仮想)マシン上の root と全く同じだからです。攻撃者が root として実行されているコンテナを侵害することに成功した場合、ホストを乗っ取るための一歩を踏み出すことになります。その「一歩」として、コンテナエスケープの脆弱性が利用される可能性があります。頻繁に起こるものではありませんが、可能性はゼロではありません。新しいコンテナ脱出の脆弱性が発見された場合、悪用されるためには権限が必要になることが多いため、まず行う対策としてはコンテナが root 実行されていないことを確認することです。
[引用](https://www.creationline.com/lab/aquasecurity/40163)


コンテナを、非rootユーザで実行することによって、Dockerに脆弱性があったとしても、攻撃者にホストのroot権限を奪取されることを防ぐことができるということです。

``` Dockerfile:良い例
USER app
```

### built contextを意識する
docker build実行時にDockerfileだけではなく、Dockerfileのあるディレクトリ内の他のファイルも使ってDocker imageを作成します。この、ディレクトリ内の状況を**built context**といいます。

重要なのが、**docker daemon**に受け渡しているデータ量が、built contextに依存するということです。

つまり、built contextに不要なディレクトリやファイルがあると、build時に時間がかかってしまったり、メモリを消費する原因となってしまうのです。

built context内にファイルを配置しなくてはいけない状況になった場合は、**.dockerignore**を使用して、該当ファイルをbuilt contextから除外しましょう。

:::note info
ポイント
* **built context**に不要なファイルやディレクトリを含まない
* **.dockerignore**を使用する
:::

### Layerを最小にする
Docker imageを作成する際は、Dockerfileに記述された手順に沿って1つのimageを作成することになります。
このとき作成されたimageはLayer構造をしており、1つのLayerはDockerfile内の1つ手順に該当します。

Dockerfileでimage Layer数を最小に意識する必要があります。

RUNやCOPY、ADDといった命令はdocker imageのLayerを増やすことになり、Layerが増えることによって最終的にできるimageの容量が大きくなってしまいます。

Layerの最小化については、命令を&&で繋ぐことによって実現可能となります。

``` Dockerfile:悪い例
FROM ubuntu:latest

RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y nginx
```

``` Dockerfile:良い例
FROM ubuntu:latest

RUN apt-get update && apt-get install -y curl nginx
```

### マルチステージビルドを利用する
マルチステージビルドとは、Dockerfileを最適化するための手法のことです。
マルチステージビルドを利用すると、複数のFROM命令をDockerfileに記述することができます。

例えば、開発環境用にアプリケーション構築に必要な手順をすべて含むDockerfileと、本番環境用にスリム化したDockerfileを用意したとしましょう。

この場合、1つのプロジェクトで2つのDockerfileを運用・保守する必要が出てきます。
運用コストが高くなってしまいますね。

マルチステージビルドは、環境にかかわらず、1つのDockerfileで共通部分をベースにして、それぞれの環境のimageを作成することが可能になります。

また、最終段階（ステージ）でimageをbuildすることができるため、imageやlayerを最小化することができます。

### ADDではなく、COPYを使用する
ADDはローカルファイルのCOPYに加えて、URLからファイルシステムに追加する機能も持っています。
そのため、悪意のある外部URLからファイルを取得しないためにも、ADDではなくCOPYの利用が推奨されています。

また、URLからファイルを自動で取りに行くのでダウンロード中、中間者攻撃の対象となり得るため可能性もあります。

### ベースimageのバージョンを指定する
ベースimageのバージョンをlatestにしてしまうと、時間が経過するにつれてコンテナのimageのバージョンが変更されてしまいます。
バージョンによってもたらす影響は計り知れないため、latestを指定するのではなく、利用バージョンを指定するようにしましょう。

また、ベースimageには、信頼性のあるimageを利用しましょう。

``` Dockerfile:悪い例
FROM ruby:latest
```

``` Dockerfile:良い例
FROM ruby:3.1.2
```


---
他にも意識しなくてはいけないポイントがあるかと思いますが、自分なりの重要要素をまとめてみました。
またアップデートがあれば、更新していきます。

以上。
picoCTF Writeup picoGym Practice Challenges Local Authority (注意<spoiler>)

# Local Authority
Description
Can you get the flag?
Go to this website and see what you can discover.

とりあえずadminでログインしてみる
http://saturn.picoctf.net:49699/login.php

```:

function checkPassword(username, password)
{
  if( username === 'admin' && password === 'strongPassword098765' )
  {
    return true;
  }
  else
  {
    return false;
  }
}


```
username === 'admin' 
password === 'strongPassword098765'

これでもう一度ログインすればフラグが取れる
picoCTF{j5_15_7r4n5p4r3n7_05df90c8}
obnizで他のBLE機器と簡単につないでデータ収集

obnizはGPIOで作って手軽にスマホ連動など出来るのが利点です。
それ以外にも市販のBLE機器と接続してデータ収集など簡単にできるものがあり、サンプルコードもあるので簡単に面白い機器とも接続できるので、知っておくと色々アイディアの幅が広がると思います。

https://obniz.com/ja/sdk/parts?tags=ble

今回はその中から面白そうな機器をピックアップしようと思います。

# 環境センサ系

#### 照度センサ

https://obniz.com/ja/sdk/parts/MESH_100PA/README.md

みなさんご存知かと思うMESHです。その中でも照度センサーが使えるので、遠くにある箱の中に仕込んで開けてあかるくなったら、電気をつけたらなどのトリガーを使ってobnizを動かすことが出来るようになります。

#### 騒音測定

https://obniz.com/ja/sdk/parts/2JCIE/README.md

紫外線や騒音、なおかつ本体の加速度までも取れます。部屋の中に複数台置いていろんな環境データを送信して可視化させるとかそういうのも簡単にできるようになります。この手は可視化方法がわかってもデータを作るのが大変ですから…

#### 水温測定

https://obniz.com/ja/sdk/parts/MINEW_S1/README.md

完全防水の水温計です。熱帯魚などやられてる方だと水温計データで何かしたいなどあることがあると思うのでそういう用途でも使えると思います。ただこの機種はネットであまりない（古い？）のでなんですが…。
唯一見つけた販売サイト -> https://www.beaconzone.co.uk/Minew/S1T

# 生体情報

#### 体重計

https://obniz.com/ja/sdk/parts/UC421BLE/README.md

体重計のデータを取れます！これで体重が前日より減っていたらobnizで作った応援ロボがサーボで旗をふってくれるなども作れます。

#### 体温計

https://obniz.com/ja/sdk/parts/UT201BLE/README.md

このご時世で体温測ることが多くなりましたが、それらのデータをちゃんと測定しただけで自動で記録してくれるものが作れます。

#### 血圧計

https://obniz.com/ja/sdk/parts/HEM_9200T/README.md

血圧情報はだいたいがディスプレイに出るだけでその時みて終わりが多いですが、それらを測定しただけでデータ収集することができるようになります。

# 行動計測系

#### 距離センサ

https://obniz.com/ja/sdk/parts/iBS03R/README.md

ToFセンサがついていて距離がとれます。例えばゴミの残量測定するとか色々使えると思います。IP67の防水防塵機能があるのと電池で2年くらい持つので実用にも耐えれます。

#### ビーコン

https://obniz.com/ja/sdk/parts/iBS04/README.md

obnizを複数置いておいて特定のビーコンが部屋に入ってきたなどの収集ができます。出勤したかなどの自動集計なども作れそう。



# 応用例

#### 血圧計

https://protopedia.net/prototype/3562

手前味噌ですがこんなのを作ってみました。

#### 環境センサ

https://protopedia.net/prototype/3415

自分の体に何の環境が大きな影響を及ぼしてるのか数値で見えるのはいいですね。

#### 距離センサ

https://protopedia.net/prototype/3448

こちらは画像解析でやられてるものです。ですが、これを距離センサ(iBS03R)でobnizで取得してって感じも行ける気がするのでのっけてみました。防塵防水なので車止めなどに埋め込めたらいける気がします。
picoCTF Writeup picoGym Practice Challenges Inspect HTML (注意<spoiler>)

# Inspect HTML

Description
Can you get the flag?
Go to this website and see what you can discover.

```:(index)
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>On Histiaeus</title>
  </head>
  <body>
    <h1>On Histiaeus</h1>
    <p>However, according to Herodotus, Histiaeus was unhappy having to stay in
       Susa, and made plans to return to his position as King of Miletus by 
       instigating a revolt in Ionia. In 499 BC, he shaved the head of his 
       most trusted slave, tattooed a message on his head, and then waited for 
       his hair to grow back. The slave was then sent to Aristagoras, who was 
       instructed to shave the slave's head again and read the message, which 
       told him to revolt against the Persians.</p>
    <br>
    <p> Source: Wikipedia on Histiaeus </p>
	<!--picoCTF{1n5p3t0r_0f_h7ml_1fd8425b}-->
  </body>
</html>

```

picoCTF{1n5p3t0r_0f_h7ml_1fd8425b}
picoCTF Writeup picoGym Practice Challenges Includes (注意<spoiler>)

# Includes

Description
Can you get the flag?
Go to this website and see what you can discover.

```:style.css
body {
  background-color: lightblue;
}

/*  picoCTF{1nclu51v17y_1of2_  */

```

```script.js

function greetings()
{
  alert("This code is in a separate file!");
}

//  f7w_2of2_df589022}
```

picoCTF{1nclu51v17y_1of2_f7w_2of2_df589022}
Oracleの文字コードをSQLで確認

# やり方

```sql
SELECT VALUE 
FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER='NLS_CHARACTERSET'
```

# 参考サイトさん

https://searchman.info/tips/1150.html

# バージョン

Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
【General】PowerBI Connector

[Sharperlight](https://www.sharperlight.com/) alone can complete the acquisition and integration of data, output to Excel, creation of web reports, supply of data as an API endpoint, etc. However, there are users who want to use Microsoft PowerBI.
Therefore, Sharperlight also has a PowerBI connector, so I will introduce it a little.

## Sharperlight RESTful Service ##
First, start the Sharperlight RESTful service.
With Windows Service dialog, 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/aa7924f3-79ef-6eb2-d0d0-dc6e139b416f.png)
or from Sharperlight application menu,
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/bd694653-d68d-1d63-c593-ae291c41b6be.png)
## Making Connection between Sharperlight and Microsoft PowerBI ##
### Getting Sharperlight's PowerBI URL ###
For **Sharperlight's PowerBI URL**, launch **Publisher** from the Sharperlight application menu and select **Links** -> **PowerBI** from the right-click menu.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2415610d-fcd5-10b0-0e08-1de65401ac93.png)
The URL is copied to the clipboard.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a1d82c41-d50e-7433-7550-aa07f81779c2.png)
### Launching Microsoft PowerBI ###
Then launch PowerBI Desktop and navigate to **Get Data** from the menu. Select **Sharperlight** from the list and click Connect to proceed.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/db5f13be-8a06-4d8c-52bd-b5248afa850a.png)
Paste the **Sharperlight PowerBI URL** in the URL input dialog that appears.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/f6d7d6e5-11a9-3230-2b45-cc3917f48ef3.png)
Paste it into PowerBI's URL dialog. Proceed to the next with the `OK` button.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/49c657a9-5276-b50f-3fb4-ce455a8d64d6.png)
### Authentication ###
Since the connection setting dialog is displayed, I set it like this. Proceed with `Connect` button.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/94f26461-37c4-8aaa-6f54-f9c0e37dbeb5.png)
### Choosing the Datasource ###
If the authentication passes, the following screen will be displayed, and the list of your Web reports will be displayed by group.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/55846d35-7e7f-1c99-4166-1b30453cac76.png)
Let's navigate and select this in our example. Press the `Load` button to proceed
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/767ef5e7-c5e7-b7c1-fa8e-f40ea39e0377.png)
The data is loaded and the model is ready. This time, I will simply display all columns as a table.
The query I chose this time was in Japanese, but of course there is no problem with English.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/514e192b-fae7-b584-8679-909f8abe0acc.png)
You can easily provide data to PowerBI using queries designed with Sharperlight's query builder.

Thank you for reading this article.
[初投稿]　Qiitaに投稿していく上で　意識すること

# 目的

良いQiita記事を書く！　役に立つ記事の型にはどんなものがあるかを知る


## はじめに
##### 投稿することをためらわない>>
とはいうものの、
Qiita記事を投稿することに躊躇してしまう
初めは、誰しもそうではないだろうか？
先人たちの記事にお世話になっているが、そもそもMarkdownの書き方なんて大枠でしか覚えていない

私は良いめんどくさがりを推奨しています　
素晴らしい記法が既にあるのに、利用しない真似しないのは勿体ない！！

…ということで、様々な方の記事をQiita記事機能である【Markdownで本文を読むから】
記事の骨格をコピペさせていただき、中身をいじくらせてもらいました
初回投稿、時短で極力誤りの無いように文章点検、　自分ルール：作成時間20分以内の制限ではこれがせいぜい

とりあえずTryすることが大事なのであって、稚拙さ百も承知　アップデートしていければ良い

>- 投稿をするときの一番の障壁がこれだと感じる。
>- 「こんな投稿内容で大丈夫だろうか・・・？」「自分なんかの知識を投稿して恥ずかしい思いはしないだろうか・・・？」なんて言葉が心をよぎる。
>- そんなことはない。あなたの知識一つ、コマンド一つで救われる人がいる。
>- 少ない情報でも、0か1かで大きな違いになるので、投稿ボタンを押すときに無心で押そう！
    引用元：大川 峻さん【Qiitaに投稿するときに大切なこと】(https://qiita.com/miriwo/items/1dd91ca5010e0f790e66)

### シンプル　イズ　ベスト
*Markdownの書き方は、ggれば良い　記事内容で必要とあれば都度取り入れていくので　今回は触れない

具体的で簡潔なタイトル
---

記事のタイトルは、記事のページだけでなくQiitaのフィードやGoogleの検索結果にも表示されます。タイトルを見ただけで記事の中身を想像できるようにする
例：
>「Rubyメモ」→「Rubyの定数探索はスコープと継承関係のどちらが優先されるか」
「正規表現でハマった」→「RubyとJavaScriptの正規表現では複数行モードの意味が違う」
「OpenSSLのバグ」→「CentOS 6.5でOpenSSLのHeartbleedバグにパッチを当てた」
　引用元：Qiitaヘルプ　(https://help.qiita.com/ja/articles/qiita-article-guideline)


環境や前提条件を説明する
---
記事で取り上げたソフトウェアのバージョンは何か、記事中のコードを実行するためにはどんな手順が必要かを書いておくと、自分の環境に当てはまるかどうかを後から読む人が判断しやすくなる

引用元や参考元へのリンクを書く
---
他のwebページから文章を引用したらそのページへのリンクを張る。そのほか、記事の内容を理解する助けになるページがあればリンクすると親切

著作権に気をつける
---
自分のものではない文章を引用したり画像を掲載したりするとき、著作権で認められた引用の範囲を超えないように注意



著作権に関しては、この記事以降または追記という形で　著作権法についてアウトプットしていきたいと考える
私としては、イマイチ定義が理解しきれないし、
あまりに、法律的にグレーなものが多い
明確に定義しきってしまうと、あらゆる分野で支障が生じるのだろうと想像はつく
だが、曖昧な要素が多いと、気持ちが悪く感じてしまう

何のための法律か考えていきたい・・・脱線失礼

## 終わりに
Qiita記事書いちゃおう　行動あるのみ
翻訳とプログラミングは似てる？？ ー その決定的な違い

今回、初めて Advent Calendar に参加してみました。カレンダーのテーマは「翻訳に役立ってくれそうなツール」です。私はエンジニアではなく翻訳者ですが Qiita の記事はよく参考にしているので、そんな風にどこかのだれかに役立つ情報を少しでも共有できればと思っています。

カレンダーの 1 日目は、エンジニア向けの Qiita で翻訳というテーマを扱うことに少し迷いもあったので、その言い訳も兼ねたポエムです。どうか、温かい目でご覧ください。

翻訳をテクニカルライティングの一部と考えれば、それだけで Qiita で扱ってよいテーマになるかとは思います。ただ、それ以外の点でも、私は昔から翻訳とプログラミングはよく似ていると感じていました。そして、1 つ決定的な違いがあるとも感じています。


# いろいろなツールを使う
翻訳も、今や紙と鉛筆でやっているわけではありません。小説などの文芸翻訳ではまだ紙と鉛筆に近い環境が残っているかもしれませんが、産業翻訳の世界はまったく違います。デジタルな辞書やネット検索で調べ物をし、TMS やら CAT ツールやらを使って TM と TB を参照し、一括置換や自動入力の力も借りてエディターにせっせと訳文を入力していきます。

:::note info
TMS: Translation management system (翻訳管理システム)
CAT: Computer-assisted translation (コンピューター支援翻訳)
TM: Translation memory (翻訳メモリ)
TB: Termbase (用語集)
:::

お客様からの指定で特定のツールを使わなければならないこともありますが、個人では何を使っても構いませんし、もちろん使わないこともできます。何をどう使うかで品質や効率に違いが出ますが、翻訳する文の種類、お客様の好み、環境などがさまざまなので、これが絶対というツールはなく、試行錯誤することが多いです。

# 実はチームプレイ
翻訳もプログラミングも基本的には個人の作業ですが、趣味ならともかく、仕事としてやっている限り自分勝手なことはできません。お客様の要望は第一ですし、たいていの翻訳作業では「スタイルガイド」と呼ばれる仕様書のようなものが提供されます。記号の使い方、固有名詞の訳し方、推奨される言い回しなど、そこには重要な仕様やルールが書いてありますが、なかには謎ルールのようなものもあります。「個人の好みでどっちでもよくない？」と思うこともありますが、それを許していたら最終的にとんでもないことになります。

また、プログラムの改訂と同じように、前にだれかが作ったものに手を加えることもあります。その場合は、他の人の訳文に合わせることが必要になってきます。そのときに、前任者の訳文でスタイルガイドが守られていなかったりすると、読みにくく、更新しにくく、ちょっと直すだけなのに大変な作業になってしまう、なんて事態に陥ります。


# 決定的な違いは、テストができないこと
翻訳とプログラミングはとても似ていますが、1 つ決定的な違いがあります。それは、翻訳ではテストができないことです。

プログラムは、実際に動かしてみてこの結果が出力されたら OK というようなテストができますが、翻訳ではそもそも何が正しいのかわからないのでテストができません。訳文が本当に正しいかを確かめるには、原文と訳文両方の言語を理解できる人が両方を読んでみるしかありませんが、それも人間の作業なのでプログラムのテストのようにはいきません。

最近は、プログラミングのノーコード・ローコードと同じように、機械翻訳で訳文がパッと出力されることもあります。ノーコード・ローコードで作ったプログラムは、後でテストをして正しいかどうかを確認できますが、機械翻訳は、その言語を理解できる能力がない限り、正しいのかどうかわかりません。そして「理解できる」としても、それは人間のやることなので、やっぱり絶対的に正しいことにはなりません。


# まとめ
こんな感じで、私は、テストのできないプログラムを作っているような翻訳作業をどんな風に進めればよいか日々悩みながら格闘しています。翻訳業界では「辞書はお金で買える実力」なんて言われることもありますが、ツールはお金を払わなくても手に入れられる実力です。もちろん有料のツールもありますが、使い方によっては支払った金額以上の力を得られる可能性があると思います。

今回のカレンダー「翻訳に役立ってくれそうなツール」への参加を心よりお待ちしております。
Oracleで文字数やバイト数をカウント

# 文字数カウント

```sql
LENGTH()
```

# バイト数カウント

```sql
LENGTHB()
```

# 動作確認用SQL

Oracleの文字コードがAL32UTF8の場合の結果。

```sql
SELECT 

-- 文字数
--  ↓ 結果3
LENGTH('ABC') AS tes_1,
--  ↓ 結果5
LENGTH('あいうえお') AS tes_2,
--  ↓ 結果5
LENGTH('ｱｲｳｴｵ') AS tes_3,
--  ↓ 結果NULL
LENGTH('') AS tes_4,
--  ↓ 結果NULL
LENGTH(NULL) AS tes_5,

-- バイト数
--  ↓ 結果3
LENGTHB('ABC') AS tes_b_1,
--  ↓ 結果15
LENGTHB('あいうえお') AS tes_b_2,
--  ↓ 結果15
LENGTHB('ｱｲｳｴｵ') AS tes_b_3,
--  ↓ 結果NULL
LENGTHB('') AS tes_b_4,
--  ↓ 結果NULL
LENGTHB(NULL) AS tes_b_5

-- 何かしらテーブルを指定する必要あり
FROM TESTER

-- 1行だけでいい
WHERE ROWNUM < 2
```

# マルチバイトは2～4バイト

例えば…

『あいうえお』は3バイト×5で15バイト。

『ｱｲｳｴｵ』は3バイト×5で15バイト。
半角カタカナにしたからといってバイト数が減るわけではないので注意。

# 長さ0の文字列はNULL扱い

Oracle触る時は注意。

# バージョン

Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
picoCTF Writeup picoGym Practice Challenges login (注意<spoiler>)

# login
Description
My dog-sitter's brother made this website but I can't get in; can you help?
login.mars.picoctf.net

```:index.js
(async()=>{
    await new Promise((e=>window.addEventListener("load", e))),
    document.querySelector("form").addEventListener("submit", (e=>{
        e.preventDefault();
        const r = {
            u: "input[name=username]",
            p: "input[name=password]"
        }
          , t = {};
        for (const e in r)
            t[e] = btoa(document.querySelector(r[e]).value).replace(/=/g, "");
        return "YWRtaW4" !== t.u ? alert("Incorrect Username") : "cGljb0NURns1M3J2M3JfNTNydjNyXzUzcnYzcl81M3J2M3JfNTNydjNyfQ" !== t.p ? alert("Incorrect Password") : void alert(`Correct Password! Your flag is ${atob(t.p)}.`)
    }
    ))
}
)();

```

YWRtaW4 はBASE64でデコードした場合adminとなる。
cGljb0NURns1M3J2M3JfNTNydjNyXzUzcnYzcl81M3J2M3JfNTNydjNyfQは
picoCTF{53rv3r_53rv3r_53rv3r_53rv3r_53rv3r}
AndroidでNavigationを使ったDeep Linkの実装Part1

# 初めに
今回から、Navigationを使ったDeepLinkの実装を紹介していこうと思います
### 本文
まずは、Manifestの書き方からです
`scheme`はその名の通りスキームを設定します。
何も書かなかった場合は`http`と`https`が適用されます
`host`には送られてくるurlの頭部分を指定します
`pathPrefix`はurlに含まれるパスを指定します。
指定のパスが含まれてない場合は無効になります。
完全一致で指定したい場合は`pathPattern`を使いましょう。
```xml
<intent-filter android:autoVerify="true">
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <data
        android:host="domain"
        android:pathPrefix="/deeplinks"
        android:scheme="https" />
</intent-filter>
```
上記の設定の場合
`https://domain/deeplinks`から始まるurlが踏まれた場合に対象のアプリが開かれるようになります
### 最後に
今回は基本の基本であるManifestの書き方から紹介していきました
Part2は下記になります
https://qiita.com/ryuji_sato/items/db6de3e447f83726a732
Cognos Analyticsで、シングルトンを使用するレポートで複数行の結果セットをページごとに出力する

Cognos Analyticsのレポート開発時の、シングルトンを使用するようなレイアウトのレポート開発を行うこともあります。
シングルトンは、クエリーの結果セットの1行目の値を取得し表示するので、結果セットが1行になるように絞り込まれたレポートなら問題ないのですが、
複数行の結果セットを取得し、複数ページのレポートとして出力したいといった場合があります。

その場合、単純にシングルトンを置くだけでは複数ページに分かれたレポートを実現することができないので、今回はそんな要件を実現するテクニックのご紹介になります。
あくまで、こうやったら実現できたという方法なので、使用する場合は、検証とテストは実施頂くようお願いします。

# 実現したいこと


こんな感じにシングルトンを配置したレポートで、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/f85ac906-a86f-c774-07df-6bc998dcb071.png)

ページを切り替えることで、シングルトンの内容も変化させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/4b7cf541-0c44-6164-2e3c-283714897275.png)


# テクニック

改ページの機能を有効にするには、リストを使用するのが簡単なので、非表示オブジェクトとしてレポートに追加します。

まずは、リストを追加しシングルトンと同じクエリーを使用するように設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/bfde9081-8f84-bb4d-2b79-f9dac4766382.png)

改ページの基準となる項目を1項目のみ追加し、ヘッダー部を選択したのち、「マスター/詳細を使用した改ページを設定」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/2871824b-bbc5-3462-77eb-4a708c211ec6.png)

これで、改ページの設定が完了です。

最後に、レポートページ上にリストの表示は不要なので、リスト全体を非表示にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146283/083d5a24-52f6-b42f-c30a-fae24b8092aa.png)


以上でテクニックの紹介は終了です。


# 自己学習記事一覧

Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト
https://qiita.com/shinyama/items/95885c7246dc413b6448
チームの雰囲気を良くするリアクションのすすめ

# はじめに

:::note info
この記事はLITALICO Engineers Advent Calendar 2022 カレンダー2の2日目の記事です
:::

LITALICOに2022年4月に入社したエンジニアの@taka-fujitaです。
今回は、チームに良い影響を与えるために何ができるか考えている中で気づいた、『リアクション』がもたらすメリットについてまとめた上で、チームにとって重宝される『リアクションエンジニア』になることをすすめていきたいと思います。



# 本記事の内容
- リアクションエンジニアの定義
- リアクションエンジニアがチームにもたらす恩恵
- 自身がリアクションエンジニアになることで得られる利点


# 前提
- 『リアクションエンジニア』という言葉は一般的に活用されているものではなく、本記事を書く上で便宜上著者が勝手に命名しているものになります
- 本記事は、読者が、SlackやChatoworkなどの「リアクション」機能が含まれているビジネスチャットツールを利用可能な組織に所属していることを想定しています

# リアクションエンジニアの定義
本記事において、リアクションエンジニアとは以下の振る舞いをするエンジニアのことを指すことにします。
- 人が投稿したメッセージにポジティブなリアクションをつけまくる
- 投稿が送られてきたら、可能な限りすぐにリアクションをつける
- 自分宛てのメッセージではなかったとしても、感謝 / 労い / 閲覧 のリアクションをつける
    - 全体向けのメッセージはもちろんのこと、自身が所属していないチームに関連する内容であっても可能な限りリアクションをつける
- 役に立ちそうなスタンプやGIFをリアクションにどんどん追加する（Slackのように追加可能な場合）


# リアクションエンジニアがチームにもたらす恩恵
- メンバーの心理的安全性を高める
- チームの士気を高める
- 議論（コミュニケーション）を活発化させる


### メンバーの心理的安全性を高める
自身がリアクションをもらう側になって考えるとイメージがしやすいと思います。
例えば、自分が何かメッセージを投稿した時、誰から何もリアクションをもらえなかったらどう感じますか？


人によるとは思いますが、不安に感じるという人は多いのではないかと思います。
特に新入社員であれば、その傾向は色濃く出てくるはずです。


一方で、色んな人からたくさんポジティブなリアクションをつけてもらえたらどうでしょうか？
こちらの場合、自分が受け入れてもらえている感覚を抱き、安心するのではないかと思います。

このように安心感を与えられるため、リアクションエンジニアがいることで、メンバーの心理的安全性は高まっていきます。


### チームの士気を高める
テキストコミュニケーションが難しいと感じる理由の一つとして、「感情/表情が見えづらい」というのがあります。これは、必要最低限の連絡を粛々と共有し合う淡白なやりとりが続くからだと考えてます。

テキストコミュニケーションが生み出すこの淡白さは、メンバーを不安にさせるだけではなく、チームの士気を高められる場面で適切に士気を高めきれない問題にもつながります。
例えば、チーム内で喜ばしいこと（ユーザ様から感謝のお言葉をいただいたなど）を共有する際、テキストの共有では感情が見えにくいために、喜びを分かち合い次の開発の励みにするといった雰囲気をチームに作り出すことが難しくなりがちです。

しかし、リアクションエンジニアがいれば、リアクションを駆使して感情を見えやすくしてくれます。文章のみの「感情/表情が見えづらい」という問題を解消し、メンバーの嬉しい/楽しいといった感情を共有できる環境を作り上げることで、チームの一体感を向上させることに貢献します。その結果、チームの士気は次第に高まり活気あるチームへと変化していきます。


### 議論（コミュニケーション）を活発化させる
メンバーからの質問や提案の数を増やし議論を活発化させるには、メンバーの心理的安全性を高め、様々な意見が出ることがチームを健全に成長させるのだという考えを浸透させる必要があります。

リアクションエンジニアはオープンな場でポジティブな反応を行います。そのため、チームとして『どのような振る舞いが特に賞賛されるのか』をメンバーに伝えることに役立ちます。
多様な意見を歓迎していることを言葉で伝え続けるだけではなく、反応/態度として明示的に示し続けることは、メンバーへ様々な意見が出ることがチームを健全に成長させるのだという考えを浸透させる上で非常に重要な役割を果たします。

リアクションエンジニアがいることで、メンバーの心理的安全性を高め、様々な意見が出ることがチームを健全に成長させるのだという考えを浸透させることができ、議論（コミュニケーション）の活発化へとつながっていきます。



# 自身がリアクションエンジニアになることで得られる利点

- 組織内の知り合いが増える
- 組織的な動きの解像度が高まる

### 組織内の知り合いが増える
リアクションエンジニアは、チーム外の連絡にも反応します。そのため、チーム外の人に認識してもらいやすくなります。
「あ、リアクション早くてたくさんつける人だ」という認識を持ってもらえれば儲け物です。そこから話を膨らませることができれば、自然と知り合いが増えていき、組織内の活動をより楽しむことができるようになります。

特に、チーム外の知り合いが増えることは、組織の活動を継続する上で精神的に良いとされているため、自分自身を守るためにも非常に有効であると言えます。


### 組織的な動きの解像度が高まる

多様なチームの連絡にも反応することで、他のチームの動きを知ることができるようになります。

今何を取り組んでいるのか？
なぜそれを取り組んでいるのか？
最終的に何を目指して取り組んでいるのか？

あたりを知ることができるようになれば（意識的に集めていけば）、組織的な動きをより解像度高く理解することができるようになります。
組織的な動きの解像度を高めることは、自身の今の仕事の目的の理解にも役立ちますし、チームとして今後何を目指してどのような意思決定をしていく必要があるのかを考える上でも非常に役に立ちます。



# おわりに
今回、『リアクション』がもたらすメリットと、自身がリアクションエンジニアになるメリットについて整理してみました。

時間をかけて大きな変化を生むのは、いつだって小さな行いの継続だと思います。
「たかがリアクション」と侮らず、リアクションというアプローチを通してチームの雰囲気を良くしていく動きをたくさんの人が取っていただけたら嬉しいなと思います。

いつだって、ワイワイ楽しく活動していきましょう！

明日は、僕が一方的に尊敬している、論理的思考力も説明能力も技術力も高い @ti_aiuto さんの記事になります。
是非明日の記事も楽しんでいってください〜
Oracle Analytics Cloud：ブラッシング処理および実行される論理SQL

はじめに
---
Oracle Analytics Cloud(OAC)で複数のビジュアライゼーションがあるそれぞれのビジュアライゼーションでの処理に加えてワークブックを実行するとブラッシング処理が流れます。

複数のビジュアライゼーションがあるワークブック
左部に、年、製品カテゴリ、売上金額がある表と、右部に、年、製品サブカテゴリ、売上金額があるグラフを利用してみてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/a564e38a-c665-30bc-faac-4978f35a0325.png)



ブラッシング処理の確認手順
---
以下の流れで確認できます
・複数ビジュアライゼーションがあるワークブックを開く
・開発者メニューをオンにする
・開発者メニューを開く
・リフレッシュする






開発者メニューをオンにする
---
右上部のアカウントアイコンをクリックします。メニューからプロファイルをクリックします。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/f81700dd-cdb5-6f1b-09b1-97cd62d8e72f.png)

左部の拡張をクリックします。図のように開発者オプションの有効化でスライダを右に移動し、オンの状態にします。
保存をクリック後、閉じるをクリックします。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/e063332f-21cd-0804-080f-b82550850b79.png)



リフレッシュする
---
開発者ウィンドウを開きます。
右上部２段目、「…」アイコンをクリックし、メニューの開発者をクリックします。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/07ace155-fbd9-d021-f12e-e0bea23402cd.png)

開発者ウィンドウが下部に表示されます。
リフレッシュをクリックします。情報を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/76d16022-8305-2d88-a8d5-26f389b6474b.png)

ビジュアライゼーション毎に１行、およびブラッシング問合せで１行表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/7e29f5e9-582d-6050-b0f9-e48bffa6a6b7.png)

論理を確認する
---
論理SQLをクリックします
論理SQLと実行結果が表示されます。
１つめ、左の表の論理SQL、実行結果
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/d7df102b-95ff-9a75-b9ed-cf8777bbbc08.png)

２つめ、右のグラフの論理SQL、実行結果
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/08381647-5d88-d284-980a-c96ac636e054.png)

３つめ、ブラッシング問合せです
１つに含まれるPROD_CATEGORY、２つめに含まれるPROD_SUBCATEGORYが論理SQL、実行結果に入っています。
![{5DB2ECAB-E045-4E79-BEA6-90E21F38D16E}.tmp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2516153/5bf340ab-3581-d01d-aae0-5997d483efbc.png)

ブラッシング処理はON/OFFの設定がワークブックレベル、キャンバスレベルにあり、動きについては別途。

以上
New Watson Assistantがやってきた！

![wa.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/402a6ae9-0f93-94a7-ede7-ebd0da6b6e3c.jpeg)
# New Experienceの登場
2021年10月7日にローンチされた New Watson Assistant は、早いもので、もう1年が経ちました。
バーチャル・アシスタントを開発する UI が一新され、

:one: 対話フローは直感的に操作できる Action にお任せ :muscle:
:two: Web Chat で高速デプロイ :smiley:
:three: 音声ボットにも対応 :relaxed:
:four: Discovery との連携はお手のもの :heart_eyes_cat:
:five: Extensionsを使ってさまざまなシステムと繋がる :railway_car:

等、より使いやすい開発プラットフォームとして生まれ変わっています。

#### バーチャル・アシスタント開発に威力を発揮する特徴的な機能
対話フローの作成に必要なAction機能、本番環境へのクイックなデプロイを可能にするWeb Chat機能、電話をバーチャル・エージェントに接続する電話チャネルの統合機能、対話内容の幅を広げるシステム連携機能等、バーチャル・アシスタントの開発を支援する機能が標準で提供されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/17cecb2c-b29c-bcc3-9183-6cb0e89a3249.png)

# バーチャル・アシスタント開発手順の全体像

#### 必要な開発ステップをナビゲートするメニュー構成
ステップに沿って開発作業を進めることで、クイックにバーチャル・アシスタントを立ち上げることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/73ebaac8-13ab-497f-e797-b985590b5631.png)

# :one: Build ビルド

#### 解決したいタスクを Action として定義する GUI ベースの対話フロー・エディター
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/0788dee4-9a8d-f100-fc89-490ba621da5e.png)

#### 開発したバーチャル・アシスタントの動作をクイックに確認できる Preview ページ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/64f25ab7-04d6-2929-339b-c5fd3615c8d8.png)

# :two: Deploy デプロイ

#### Preview ページで確認したドラフト環境をライブ環境に移行
Publish ボタンをクリックすることで、Preview ページで確認したドラフト環境をライブ環境としてデプロイできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/c9f32d03-642f-b4c0-60ba-7b1564447766.png)

# :three: Improve 分析と改善

#### ユーザーとバーチャル・アシスタントとの対話内容を分析し、改善することが可能
ユーザーとの対話に関する各種統計情報、実際の発話やトリガーされた Action を起点に対話内容を再現でき、分析や改善に役立てることが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/c531de94-0099-2d20-3b46-2027ca0d61e8.png)


# いかがでしたでしょうか

New Watson Assistantを使用したバーチャル・アシスタント開発の全体像と概要についてご紹介いたしました。
次回からは、実際の画面を見ながら具体的な手順を確認していきます。

# 参考情報

Watson Assistantを知る上で参考になる情報のリンクを共有します。

## 公式ホームページ

https://www.ibm.com/jp-ja/products/watson-assistant?utm_content=SRCWW&p1=Search&p4=43700073979728402&p5=e&gclid=Cj0KCQiAm5ycBhCXARIsAPldzoU7WHZGC8ihxGw7tYHE2CUKpBWEaNASvISkHOOY_mnOdzY5ceZGW8oaAtJUEALw_wcB&gclsrc=aw.ds

## オンラインドキュメント

https://cloud.ibm.com/docs/watson-assistant

## APIリファレンス

https://cloud.ibm.com/apidocs/assistant/assistant-v2

https://cloud.ibm.com/apidocs/assistant-v1
dart言語に慣れよう


Dartの書き方(自分のメモ用)

## 前提
まずFlutterでは激しいfpsなどではなく
文字列を表示したり，複雑な画面遷移などを専門に扱う

これはiOSとAndroidをひとつの言語で書けてしまう利点があり，現在人気の開発プラットフォームである．
その際にdartというC++やJavaによく似た言語を使う．

このページではdart言語の基本を実際のコードを通して記録する．

## dartの基本

ここでは私の手元の環境dart2.18.4での動作を記録する．

以下のm.dartファイルを作成して
ターミナルから
```terminal
dart m.dart
```
で動く．

```m.dart
import 'dart:math';

void main() {
  print("Hello world! OHAYO!!!!!!!!!!!!");// コンソールに出力

  // if文
  int value=4;
  if(value==3){
    print('3desu');
  }
  else if(value==4){
    print('4desu');
  }

  // for文
  for (int i=0; i<=2; i++){
      print(i);// 0~2を出力
  }
  
  // 配列
  List<int> A=[10,11,12,13];
  print(A[3]);// 13  0-index
  for(int i=0; i<=3; i++){
    print(A[i]);
  }
  /* 複数行コメントはこうする
  for(int a in A){// このpythonっぽい書き方でも大丈夫
    print(a);
  }  
  */

  // Map 連想配列
  var M = Map();
  M['a']=20;
  M['b']=21;
  M['c']=22;
  print(M['a']);// 20
  print(M['b']);// 21
  print(M['c']);// 22
  
  // 実数を扱う
  double a=0.4*pi;// mathライブラリのpiや sin() cos() e が使える 
  print(cos(a));

  // 乱数を扱う
  var random = Random();
  random.nextDouble(); // 0.0と1.0の範囲: [0, 1)
  random.nextInt(10); // 0と9の範囲
  
  // 文字列
  String s0 = "あいうえお"; 
  print(s0);
  
}

```

```m.dartの出力
Hello world! OHAYO!!!!!!!!!!!!
4desu
0
1
2
3
13
10
11
12
13
20
21
22
0.30901699437494745
あいうえお
```
行末に";"を忘れずにつける
if文やfor文，配列，連想配列，実数，乱数，文字列，について扱った．




## dartでclassを使う

以下のコードで簡単なclassの扱いを見る．
Hitoクラスを作成する．
このインスタンスは名前と年齢をもち，birth_day()という関数で自身の年齢を+1する．


```m1.dart
class Hito {
  var name;// varなら型がなんでもいける
  var age;// これらは基本public変数 (普通にアクセスできる)
  var _age=10000053;// _で始まる変数はprivate変数(getterなどを定義しないと普通にはアクセスできない)

  Hito(this.name,this.age);// コンストラクタ インスタンス生成時に名前と年齢を設定する
   
  void birth_day(){
    this.age+=1;
  }
}

void main() {
  final tarou=Hito('tarou',113);
  tarou.birth_day();

  print(tarou.name);
  print(tarou.age);
  print(tarou._age);// private変数なのでアクセスできない...はずだった
  // dartではprivate変数が定義されたファイル内では普通にアクセスできる

}

```
```出力例
tarou
114
10000053
```



注意点として
基本的にpublic変数(他から自由にアクセスできる)
だが，_を先頭につけた変数はprivate変数(他からはアクセスできない)
しかしdart言語ではprivate変数でも同じファイルからならアクセスはできる.

ここではひとつのファイルで実行しているので実質全部public変数になっている．

以下では一応真面目にsetter,getterを付けた．



```m2.dart
class Hito {
  var _age;
  String _name;

  Hito(this._age, this._name);
  
  void birth_day(){
    this._age+=1;
  }

  // setter
  set name(String s) {
    this._name = s;
  }
  set age(int a) {
    this._age = a;
  }

  // Getter
  int get age => _age;
  String get name => _name;
}

void main() {
  final taro = Hito(113, 'taro');

  taro.name='taro2';
  taro.age=13;
  
  taro.birth_day();
  print(taro.age.toString() + 'sai  name:' + taro.name);

}

```
```出力例
14sai  name:taro2
```
ここでは_name,_ageが外部からすぐにはアクセスできないようにしてある．(カプセル化)
なのでsetterで値を決めて，getterで外部からアクセスできるようにする．  
この際setterで値を制限する(年齢の負の値の入力を防ぐなど)こともできる．

これは複数ファイルを管理する大きなプログラムになれば威力を発揮するはずだ．


## まとめ
dart言語での基本構文(簡単なとこだけ)を扱い，classの扱いも記録した．

※自分用メモですが，間違い等あればコメントで教えていただけるとありがたいです．
Reactで書く"e.target.value"って何か調べてみた

:::note warn
駆け出しエンジニアがアウトプットの為に書いております。
何か指摘や問題があればお気軽にご教授いただけますと幸いです。
:::

## "e.target.value"って何？

Reactに関する下の動画で、"**e.target.value**"なるものが出てきました。
Typescriptも入っていますが、この問題には関係ないので気にしなくて大丈夫です。

https://youtu.be/ANcopd8Bmao

~~~ React:MainQuestion
  const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    //ここにe.target!
    setInputValue(e.target.value);
  };
  return (
    <div className="App">
      <div>
        <h2>Todo リスト with Typescript</h2>
        <form onSubmit={() => { }}>
          <input type="text"
            //ここ
            onChange={(e) => handleChange(e)}
            className="inputText"
          />
          <input type="submit" value="作成" className="submitButton" />
        </form>
      </div>
    </div>
  );
~~~
このコードでは、Inputに何か入力した瞬間に、その入力されたものを"e.target.value"で取り出しています。
例えば、Inputに「a」と入力すると、"e.target.value"には「a」が入っています。
このコードを見る限り、"e"は"**onChange**"から来たことがわかります。
~~~React
onChange={(e) => handleChange(e)}
~~~
しかし、「三行目の"**e.target.value**"は何！？」となったので１から調べてみたのでまとめます。
~~~React
setInputValue(e.target.value);
~~~

## onChangeとは

まず、"e"は"onChange"から来ていますね。
onChangeとは、フォーム内のエレメント（要素）の内容が変更された時に起こイベント処理の事です。
~~~React
<input type="text"
  onChange={(e) => handleChange(e)}
  className="inputText"
/>
~~~

ここでの"e"は、inputで何か入力された瞬間に、onChangeというイベント処理が行われ、その結果が"e"に沢山詰め込まれています。

[Reactの公式ドキュメント](https://ja.reactjs.org/docs/handling-events.html)と[こちらの記事](https://www.sejuku.net/blog/61631)によると、onChangeは、イベント処理のイベントハンドラーのようです。

::: note info
この場合"e"は合成イベントというもので、"e"以外を定義しても動きますが、
その後の"target"や"value"は合わせましょう。
:::

## 合成イベント"e"の中身について

では、合成イベントの"e"に何が入っているか確認してみましょう。
"console.log()"で"e"を出力してみます。（[海外のstackoverflowで、この方法を学ばせていただきました。](https://stackoverflow.com/questions/71039088/what-is-onchange-e-setnamee-target-value-in-react-mean)）
~~~React
<input type="text"
 onChange={(e) => console.log(e)}
 className="inputText"
/>
~~~
inputに「a」と入力したら、以下の結果が出力されました。


![Screen Shot 2022-12-01 at 10.30.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686088/8a49211e-d077-e0ff-808a-76595365a1d2.png)

「a」と入力しただけなのに、こんなに沢山情報がeに詰め込まれています。
よく見ると、この中に"**target**"が！
下矢印をクリックして詳しく見ると...

![Screen Shot 2022-12-01 at 10.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686088/e6f5320a-e1fe-04d4-c966-fe1b9967b133.png)

"target"の"value"に、inputで入力した「a」が格納されてました！
だから、"e.target.value"で、inputで入力したものを取り出してたんですね。

## まとめ
Inputに何か入力した瞬間に、その入力されたものを出力していた"e.target.value"の正体を調べてみました。
"e"の中に沢山の情報が詰め込まれており、入力した物が"e.target.value"に格納されているから、"target.value"で指定しないといけないということですね。

以上です。