OmniAICreator/Qiita-1.07M huggingface dataset:
GASでGoogleスプレッドシートを使いやすくするためのクラス

イマイチ使いたい形でAPIを提供してくれてないので、GoogleSheetクラスをラップするクラスを書いた。

あるタスクで利用した用途によっているので、今後拡張する必要あり。

```javascript
class WrappedWorkSheet {
  constructor(sheet) {
    this.sheet               = sheet
    this.data                = this.sheet.getDataRange().getValues()
    this.header              = this.data.slice(0,1)[0] 
    this.body                = this.data.slice(1,) 
    this.latestRow           = this.data.slice(-1,)[0]
    this.latestRowWithHeader = Object.fromEntries(this.latestRow.map((e, index) => [this.header[index], e]))
    this.latestRowPos        = this.data.length
  }

  static build(sheetId, sheetName) {
    // TODO: あってるっぽいが要チェック。継承した場合用
    const self = this
    return new self(SpreadsheetApp.openById(sheetId).getSheetByName(sheetName))
  }

  getLatestRowWithHeader() {
    return this.latestRowWithHeader
  }

  getLatestRowPos() {
    return this.latestRowPos
  }

  updateWholeRow(rowPos, newValues) {
    this.sheet.getRange(rowPos, 1, 1, this.sheet.getLastColumn()).clear({ contentsOnly: true })
    this.sheet.getRange(rowPos, 1, 1, this.sheet.getLastColumn()).setValues([newValues])
  }
    
  updateValueOfRow(rowPos, label, newValue) {
    const colPos = this.findTargetColPosition(label)
    this.updateValue(rowPos, colPos, newValue)
  }
   
  findTargetRowPosition(label, targetValue) {
    const targetColumnPosition = this.findTargetColPosition(label)
    if (targetColumnPosition === null) { return null }
  
    const ValuesInTargetColumn = this.getColumnValues(targetColumnPosition)
    return this.getPosition(ValuesInTargetColumn, targetValue)
  }
  
  findTargetColPosition(headerLabel) {
    return this.getPosition(this.header, headerLabel)
  }

  // basic utility and delegation

  updateValue(rowPos, colPos, value) {
    this.sheet.getRange(rowPos, colPos).setValue(value)
  }
  
  getPosition(values, value) {
    const position = values.indexOf(value)
    return position == -1 ? null : position + 1
  }
  
  getColumnValues(columnPoistion){
    return this.sheet.getRange(1, columnPoistion, this.sheet.getLastRow()).getValues().flat()
  } 

  appendRow(row) {
    this.sheet.appendRow(row)
  }

  deleteRow(rowPos) {
    this.sheet.deleteRow(rowPos)
  }
}
```
特定のファイルサイズを持つ画像ファイルを作成する


#### 方法
画像ファイルのExif情報に大量のテキストデータを格納し、目的のファイルサイズにする。
Exif情報をいじるには、ExifTool https://exiftool.org/ を使用する。
`exiftool(-k).exe` のファイル名で配布されているので、 あらかじめ`exiftool` にリネームしておく。

#### 環境
- Windows 10

#### 手順

- 目的のファイルサイズより小さい画像ファイルを用意する
- 追加で必要なサイズを計算する。[目的のファイルサイズ] - [画像ファイルサイズ]
- 追加で必要なサイズのファイルサイズのファイルを作る。以下は5MBのファイルを作るコマンド。

```
fsutil file createnew comment.txt 5242880
```
- ExifToolで作成したファイルをexif情報を追加する

```
.\exiftool.exe -comment<=".\comment.txt" .\test.png
```
Dockerがディスクを圧迫した時にやること

# 概要

Dockerすごい便利なんですが、油断して作業していると大量にデータが発生して、容量100%でサーバが動かなくなるまで気づかなくて死ぬというイベントが不定期に発生します。本記事では対策として以下の2つの方法について紹介します。

* 定期的にクリーニングする
* データの保存場所を余裕のあるディスクに移動する


# クリーニング方法
## Dockerイメージをクリーニング
Dockerイメージのビルドを繰り返しているとゴミイメージが大量に蓄積します。使用していないイメージなどをすっきり掃除しましょう。動作しているコンテナには影響を与えないようにいい感じに削除してくれます。

```bash
docker image prune -a -f
```

## Dockerコンテナをクリーニング
コンテナの停止起動を繰り返していたり、実験をしていると使われていないコンテナが大量に溜まっていきますね。`docker ps`だけでは見えないコンテナも隠れているのでお掃除しちゃいましょう。動作しているコンテナには影響を与えないようにいい感じに削除してくれます。

```bash
docker system prune -a -f
```


# Dockerの一時ファイル保存場所を別の場所に移動する

Dockerの一時ファイルは`/var/lib/docker`にデフォルトで保存されます。データには、イメージ、ボリューム、コンテナ内の一時ファイル、およびクラスタの状態などの永続化されたデータが格納されています。HDDなどの余裕のあるディスクに移動することでディスクを圧迫するようなイベントの頻度を下げることができます。

1. コンテナは動かしたままでOKです。まずは退避先にファイルの一次コピーを開始します。コマンド終了後に「コピー中に削除・追加されたファイルがあるでー」と言われますが、後でコピーし直すので無視でOKです。

	```bash
	sudo rsync -axPS /var/lib/docker/ /移動先のディレクトリ
	```
1. `sudo vi /etc/docker/daemon.json`で設定ファイルに以下の設定を追記します。ファイルがなければ作成してください。

	```json:/etc/docker/daemon.json
	{
	  "data-root" : "/移動先のディレクトリ"
	}
	```
1. Dockerデーモンを停止します。

	```bash
	sudo service docker stop
	```
1. Dockerデーモンが停止したら2次コピーを開始します。すでにある一次コピーの差分コピーを行います。数分で終わるはずです。

	```bash
	sudo rsync -axPS /var/lib/docker/ /移動先のディレクトリ
	```
1. この時点でデーモンを再開すると、`/移動先のディレクトリ`を参照してデーモンが開始しますが、元のディレクトリの場所を参照せずに動作していることを確認するためにディレクトリ名を変更しておきます。もし動作しなかった場合に備えて削除はまだ我慢です。

	```bash
	sudo mv /var/lib/docker /var/lib/docker.bak
	```
1. Dockerデーモンを開始し、コンテナが起動していることを確認します。

	```bash
	sudo service docker start
	```
1. コンテナの動作やDockerコマンドの操作含め問題が起こっていないことを入念に確認してから、元のファイル場所を削除します。できれば数日間観察してほしいです。

	```bash
	sudo rm -rf /var/lib/docker.bak
	```

# 参考

https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file
Box マイコレクション・コレクション！

# マイコレクション
Boxには、マイコレクションという、いわゆる”お気に入り”のような機能があります。
Boxに格納されているフォルダ・ファイルで、よく使うものを自分で好きなカテゴリにわけて保存できます。
[マイコレクション](https://support.box.com/hc/ja/articles/360048730094-コレクションの使用)
このマイコレクションは、人によって様々で、今回はBox社CSM(※）に実際のコレクションを見せてもらったので、それを記事にしたいと思います！
※CSM：カスタマーサクセスマネージャー。サブスクリプションモデルのビジネスにおいて、リテンションをKPIにしてお客様の利活用を促進を支援する役割を担います。

#　自分のマイコレクション

まずは、自分のマイコレクション。
私はBoxでファイルを見つけるときは必ずマイコレクションからアクセスして、２クリックくらいで目的のファイルへアクセスできるようにしています！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135983/c03ed8ee-e156-7a35-4046-c7e9e3fe0796.png)

イベント（ユーザー会や表彰イベントなど）に分かれていたり、施策（ニュースレター、NPS、HealthScoreなど）ごとに分かれていたり、役割（Partner CSM）や機能（Product、Relayなど）に分かれていたり、軸はバラバラですね（笑）。

#　CSMその１ マイコレクション
隣のCSMにマイコレクション見せてもらいました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135983/a6f7cdf8-9dcb-449a-a4ee-cebbfb0609d0.png)

**お客様フォルダ**　：担当するお客様とコラボしているフォルダですね。特に外部から招待されているものとかは、コレクションに保存しておくととてもわかりやすいです。
**勉強会・セミナー**：勉強会やセミナーの資料を保存しておく用でしょうか。確かに勉強会切り口も良さそうですね。
**自習**：後で見たい動画や資料を保存しておくのかな。この切り口は良さそうですね。私も後で見ようと思っている社内の動画などめちゃくちゃあります。
**まずはこれ**：まずはこれを参照するという意味かな？？
**自分**：自分... のなんでしょうね？？


# CSMその２　マイコレクション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135983/7a8b8448-537c-5ec8-de72-6773ddc192a0.png)
**Automobile, Construction**:担当業界別のコレクションのようです。
**External Collaboration**:社外から招待されている＆社外とコラボしているフォルダを集めているものです。
**BoB， Education**:Box連携アプリケーションやトレーニングコンテンツを集めたコレクション。
**MS, Google Workspace**:こちらもBoxとの連携機能に関するコレクションですね。
こちらも、機能別だったり施策別だったり、複数の軸で作られていますね〜。

# CSMその3　マイコレクション　　＊追記しました！

![スクリーンショット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135983/99712f3c-f911-25ea-9b7a-ec3228a885ad.png)

コレクションにナンバリングしているのが新しい！順序を制御したいときは、こちらですね！
**業界カット**：業界別にCSMがアサインされているのと、業界別ノウハウを貯めるためにこの切り口なんですね。
**あとで見る**：開けちゃいけない、あとでみる。
**Microsoft連携**：機能拡張も多いMicrosoft連携。お客様からの質問も多いので情報量も多い。
**競合**：気になる...!
**上手な資料**：資料作りは、基本１から作ることはほぼなくて。Boxにある上手な資料を作り直す事が多い会社の文化です。
**セキュリティチェック**：お客様から依頼が多いのと種類が多いのでコレクションできちゃいましたね。


# 運用
何年も運用していると少しづつ追加されるコレクション。
定期的に見直して必要なファイルを見極め、断捨離が必要です。

年末のこの機会にBoxの中も大掃除して整理しましょう。
Boxの中で必要なファイルを素早く見つけるためには、マイコレクションぜひ活用してみてください！
【Laravel】Debugbarのインストールでkillされる

## 0. はじめに
こんにちは、[@kazuma_dev](https://twitter.com/kazuma_dev)です。
Debugbarのインストールでkillされる際の対処法です。

## 0-1. 全体の流れ
> [1.エラー内容](#1-エラー内容)
> [補足](#補足)
> [Reference](#reference)

## 0-2. 本記事の対象者
- Debugbarインストール


# 1. エラー内容
## 1-1. 前提・実現したいこと
- Debugbarインストール

## 1-2. 発生している問題・エラーメッセージ
1. `Updating dependencies (including require-dev) killed`されて、Debugbarがインストールできない
2. Debugbarインストール後、表示されない

## 1-3. 該当のソースコード
```zsh:zsh
~/laravel-sns/laradock $ COMPOSER_MEMORY_LIMIT=-1 composer require barryvdh/laravel-debugbar --dev
Updating dependencies (including require-dev)
Killed
```

## 1-4. 試したこと 
- `.env`ファイルに`DEBUGBAR_ENABLED=TRUE`を追記

```php:.env
DEBUGBAR_ENABLED=TRUE
```


- `DockerDesktop`の設定`Resource`にてメモリ容量変更
- Memory:2GB→8GB
- Swap:1GB→2GB

![Screenshot 2021-12-18 17.19.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687994/a319b89e-a46d-dc0d-8650-8d7d9a14ed63.png)

- Debugbarのインストール

```zsh:zsh
~/laravel-sns/laradock $ COMPOSER_MEMORY_LIMIT=-1 composer require barryvdh/laravel-debugbar --dev
```

- キャッシュクリア

```zsh:zsh
docker-compose exec workspace php artisan cache:clear
```

```zsh:zsh
docker-compose exec workspace php artisan config:cache
```

```zsh:zsh
docker-compose exec workspace rm -f bootstrap/cache/config.php
```

# 補足
|ツール|バージョン|
|:--|:--|
|PHP|7.4.1|
|Laravel|6.20.43|
|PostgreSQL|13.5|
|Composer|2.0.14|
|Docker|20.10.11|
|docker-compose|v2.2.1|
|MacBook Air|M1,2020|
|macOS|Monterey 12.3|
|Homebrew|3.3.8|

# Reference
https://qiita.com/ikeyansaza/items/c231dc0f411336803f4d
【postgreSQL】ユーザ定義型の一覧を取得するSQL

#はじめに
現在担当しているPJTでpostgreSQLの[ユーザ定義の型](https://www.postgresql.jp/document/12/html/xtypes.html)なるものを色々作成していたのですが、
利用しているクライアントツール（A5:SQL Mk-2）だと画面から作成したユーザ定義型の一覧がわからなかったため、抽出用のクエリを作成しました。

**※補足**
DBeaverだと「スキーマ名」>「データ型」から作成したユーザ定義型の一覧が確認できるようです。
![スクリーンショット 2021-12-18 16.49.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292212/d4edaa53-4821-a4cf-7524-cd64aa553b63.png)

#検証用データ
```SQL:createtypeサンプル
-- 複合型のユーザ定義
create type PLPGSQL.DATA_TYPE1 as (
	param1 numeric(1,0)
	,param2 text
	,param3 bytea
);

-- 列挙型のユーザ定義
create type PLPGSQL.DATA_TYPE2 as enum (
	'spade'
	,'club'
	,'diamond'
	,'heart'
);
```







#ユーザ定義型の一覧取得SQL
```SQL:ユーザ定義型の一覧取得SQL
select
	t1.typname
    , case 
    	when t1.typcategory = 'C' then '複合型' 
    	when t1.typcategory = 'E' then '列挙型'
		else 'other'
      end 
from
	pg_catalog.pg_type t1 
	left outer join pg_catalog.pg_namespace t2 
		on t1.typnamespace = t2.oid
	left outer join pg_catalog.pg_tables t3
		on t1.typname = t3.tablename 
	left outer join pg_catalog.pg_sequences t4
		on t1.typname = t4.sequencename
where t2.nspname = 'plpgsql'　 -- スキーマ名を指定
	and ( t1.typcategory = 'C' or t1.typcategory = 'E' )
	and t3.tablename is null
	and t4.sequencename is null
order by t1.typname;
```

#実行結果
```:実行結果
  typname   |  case  
------------+--------
 data_type1 | 複合型
 data_type2 | 列挙型
```

#参考
postgreSQLの内部情報を調べる際はシステムカタログに大変お世話になります・・！

https://www.postgresql.jp/document/12/html/catalogs.html
【2021.12】Laravel localhostで500 error が出て終わったと思った話


環境

###docker上でLaravelで開発を行なっており、herokuにデプロイ後にlocalを開いたら5oo error.

logを辿ってみて、原因になりそうだったのは デプロイを試みてる際にcomposer updateしてしまった事。。

何となく辿り着いた記事を参考に、以下を実施（多分やらない方がよかった）

```
php artisan config:cache
php artisan config:clear
composer dump-autoload -o
```


を実行後、

###phpのバージョンが8.2必要だけど、あなたは7.4よとエラー

やっぱやったわ、、
と終わりを感じていたところ

###先輩登場（以下解決法）

```
git status
```

で状況確認し、私は編集中のものは一旦なかったので、一旦移動させ
git stash ：https://qiita.com/chihiro/items/f373873d5c2dfbd03250

```
git stash
```

```
composer install
```

で解決。

git でマージとかしていなければ、一旦は戻れる。みたいです。:)
Pythonで辞書から引数を自動的に抽出する

この記事は [MicroAd Advent Calendar 2021](https://qiita.com/advent-calendar/2021/microad) の 18 日目の記事です。


## 概要
Pythonでは辞書もしくは辞書ライクなオブジェクトで設定を管理することが多いですよね。

ただその中から関数やクラスに渡す引数をキーで指定して取り出すのは億劫です。

理想を言えば関数の引数名に応じて自動的に抽出されて欲しいところです。

そこでこの記事では以下のコードのような辞書と関数との引数の受け渡しをよりズボラに書く方法をご紹介していきます。

```python
def hoge(a, b):
    print(a, b)

def fuga(c):
    print(c)


config = {'a':1, 'b':2, 'c': 3}

hoge(config['a'], config['b'])
fuga(config['c'])
```


## 可変長引数を利用する方法

まず１つ目はPythonの可変長引数という機能を利用した方法です。

可変長引数`_`がいらない引数を詰め込むゴミ箱のような役割をしてくれるので、関数を呼ぶ辞書を雑に展開して渡すことができます。


```python
def hoge(a, b, **_):
    print(a, b)

def fuga(c, **_):
    print(c)


# 引数を詰め込んだ辞書
config = {'a':1, 'b':2, 'c': 3}

# 
hoge(**config)
fuga(**config)
```

この方法はシンプルではあるんですが、可変長引数をゴミ箱として利用しちゃっているので、本来の用途に使えないというのが残念なところです。


## デコレータで渡す

２つ目はデコレータで設定辞書の内容を渡す方法です。


デコレータが設定辞書に含まれる値の中から関数の引数に含まれるもののみを抽出して渡しています。
先ほどは可変長引数で行なっていた要らない引数の回収をデコレータが代わってくれているので、可変長引数を通常通り利用できるようになっています。

```python:demo.py
config = {}

def load_config(conf):
    config = conf

def deco(f):
    def f_(*args, **kwargs):
        # configから関数の引数に含まれるものだけを選択
        fargs = f.__code__.co_varnames[:f.__code__.co_argcount]
        config_kwargs = {k: v for k, v in config.items() if k in fargs}
        # configから作った引数と元の引数をマージして渡す（元の引数優先）
        f(*args, **(config_kwargs | kwargs))
        
    return f_
```


```python:main.py
import deco

@deco.deco
def hoge(a, b):
    print(a, b)

@deco.deco
def fuga(c):
    print(c)


config = {'a':1, 'b':2, 'c': 3}
deco.load_config(config)

jobs.hoge()
jobs.fuga()
```

コード自体は簡潔ですがデコレータ使ってるので処理の流れは追いづらい気がしますね。
Conoha WingでWordPressのSSL化ができない？

Conoha WingでWordPressをインストールするとき、SSLの設定をONにした状態で稼働するとCSSやJSが正常に読み込まれなくなった。どうも外部参照URLがhttpのままになっているせいで発生しているようだった。

Conohaのコントロールパネルからいわゆる簡単インストールを行うと上記の現象は発生しない。
手動でインストールした場合にのみ発生している。

いずれのconfig.phpを開いて違いを確認してみることにした。
すると簡単インストールしたほうのconfig.phpに以下の記述を発見。

```php:config.php
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
    $_SERVER['HTTPS'] = 'on';
    define('FORCE_SSL_LOGIN', true);
    define('FORCE_SSL_ADMIN', true);
}
```
上記のグローバル変数を書き換えている？ようだ。

これを手動インストールしたconfig.phpにも追記すると、改善した。良かった。
Javaのマルチスレッド実行モデル

多分こう。
rust, go だと、threadが、キューからタスクをstealしていたはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534442/2e4f38a3-b796-8ad0-21ed-e4c2daf8a5da.png)
音声認識をして特定の言葉をカウントしたい＃2

#おもてなしを見える化するIoTがつくりたい！！
<img width="500" alt="![image (30).jpg]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052662/48a0d396-6bad-30a7-3610-9189b193838b.jpeg">
普段は居酒屋で働いており、プログラミングとは無縁なのですが、
おもてなしが見える化するIoTをつくりたい！！と思い、一念発起！
お休みの日にプログラミングを学びながら、日々挑戦をしています！

前回書いた記事はこちらです。

https://qiita.com/Izumi0711/items/deab0c0052eddc3ae030

学んだプログラミングを活かして、このような企画を考えています。

https://camp-fire.jp/projects/528848/preview?token=3m633zhp


#今考えている実装までの道のり
<img width="700" alt="![キャプチャ66.PNG]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052662/93566cca-e726-191a-39fa-d3c94d2b1d67.png">
3段階で考えています。
1）Teachable Machine➡音声学習をして、「ありがとう（お見送り）」を認識
2）Googleスプレッドシート➡「ありがとう」を認識したものをデータに起こす
3）LINE➡1日のおもてなし結果を通知する＆フィードバックを行う

今回は1）の実装を行ってみたいと思います。
使い方に関しては、こちらの記事がわかりやすいので、ご参考ください。
参考：[Teachable Machineの利用方法を紹介します](https://qiita.com/misa_m/items/d8a20d153c8ee7daf0c1)

#準備したもの
<img width="700" alt="![キャプチャ67.PNG]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052662/6ab939a7-af8f-547c-bf40-e4e55bdecd0a.png">
実際にTeachable Machineを開いてみると、このような形だったので、
**・ありがとうと言っていない時のバックグラウンドノイズ
・ありがとうと言った時の音声**
に分けて学習させていきます。

なので、今回は
①スマホで店舗の音声を録音する
②音声をトリミングして、バックグラウンドノイズとありがとうの音声に分ける
③それを学習させるで進めていきます。

①に関しては、出口にスマホを置いて録音するだけなので、省略。

#音声をトリミング
こちらの[Online Mp3 Cutter](https://mp3cut.net/ja/)というサイトが簡単に音声をトリミングできたので、活用して見ました。

<img width="700" alt="![キャプチャ64.PNG]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052662/d5d618cc-7080-b759-7ea7-ebf6a6777e12.png">

一番ここに時間がかかり、録音した音声を全部聞いてトリミングしていきました。
（ここはめっちゃアナログ）
![キャプチャ69.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052662/b03bb2e0-b073-9517-fb7f-722e832d91ea.png)
うう。。。がんばった。。。！！！

#Teachable Machineに学習させる
<img width="700" alt="![キャプチャ68.PNG]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052662/ce65d5e6-dc0d-db00-c139-2770c2ae2c95.png">

先程の音声ファイルをZip形式にしてアップロード！

<img width="700" alt="![キャプチャ65.PNG]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2052662/ff454321-ff4f-42a7-c241-f3fc107de9b5.png">
できない・・・。

調べてみると、
**どうやら音声ファイルに関しては、ローカルのファイルのアップロードはできず、
ブラウザ上でTeachableMachineを起動して録音しないと駄目だった模様。。。**
参考：[Teachable Machine を使った音声からの任意のキーワードの検出（ブラウザ上で機械学習）](https://qiita.com/youtoy/items/9096836e5d77274500ea)

#まとめ
今回できたことは、
**・Teachable Machineの使い方が分かった（失敗も含めて）
・音声のトリミングができるようになった
・機械学習をさせる素材を作成した**
の3つです。

次は、
**・Teachable Machineに機械学習をさせる
　（この頑張って作成した素材を使うのか？再度Teachable Machineで録音し直すか？も検討）
・Teachable Machineで判定した結果をスプレッドシートに反映する**
の実装を進めていきたいと思います。

（続く）
Webの勉強はじめてみた その14 ～標準出力とvim編～

ちょっと右手を痛めまして間が空いてしまいました。
N予備校の「Webプログラミング入門 Webアプリ」をアーカイブとともに勉強しています。
今回は、第2章5節と6節です。

<h2>リダイレクト</h2>

リダイレクトの意味・使用について勘違いしていたので、追記しています。

:::note alert
> : 標準出力をファイル保存する
>> : ファイルに追記
2> : 標準エラー出力
2>&1 : 標準出力と標準エラー出力の両方を出力
:::

https://qiita.com/tsubasaogawa/items/9495ad6e903998c4d1ac

`2>&1` について間違えた場合どうなるか検証されていたので勉強させていただきました。

<h3>追記 2021/12/22</h3>
「リダイレクト」の意味、仕様について勘違いしていました。
頂いたコメントからの引用で失礼します。

:::note
> : リダイレクトは ( 予め何らかのファイルにつながっている「口」を ) 指定のファイルにつなぎ替えるという操作
:::


https://qiita.com/angel_p_57/items/03582181e9f7a69f8168#%E3%83%AA%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3

実際の挙動を考えると確かに、リダイレクトは出力先を「繋ぎ変えている」というほうがより自然な感覚に近い気がします。


<h2>覚えておきたいコマンド</h2>
:::note
grep : 第一引数に「検索条件」 第二引数に検索する「ファイル名」
less : 表示するものが多い場合に使うとよい<
|(パイプ) : コマンドを連結して実行する
:::

<h3>オプションとか</h3>
`grep -v` : 検索に「含まない」単語を調べる。
`/` : `less`表示の際、`/` をつけるとこの後の単語で検索ができる。 

<h2>Vim</h2>
そもそも`vim`とは、`Vi Improved` らしい。

:::note
vimtutor ：vimのチュートリアルを実行する
:::

なお、実行環境が日本語になってないと全部英語になるので注意。

<h3>:q と :wq の違い</h3>

:::note
編集した場合に:qで終了しようとするとエラーが表示され、:wq か :q!しないと終了できない
:::

`:`が特別なコマンドを実行、
`!`が「強制的に」という意味らしい

<h3>モーションとカウント</h3>

<h4>モーション</h4>

:::note
w: カーソル位置から空白を含む単語の末尾まで
e: カーソル位置から空白を含まない単語の末尾まで
$: カーソル位置から行末まで
:::

<h4>カウント</h4>

:::note
0: 行の先頭まで移動
2w: 単語2つ分前に移動。
3e: 3つ目の単語の終端に移動。
:::

`0`はよく使いそう。
モーション前の数字は、現在のカーソル位置を0としてカウント。

<h3>その他便利そうなコマンド</h3>

:::note
u : u(小文字)は前回の動作、U(大文字)は行全体の変更を取り消す
CTRL + R : 取り消しの取り消し
dd : 行の削除
:::

<h2>まとめと次回について</h2>
`vim`って今まで簡単な(しかもかなり曖昧)使い方しかしてこなかったので、かなり勉強になりました。
右手首（小指側）を痛めたのでしばらく1日1講座で授業は進めてます。記事の投稿は少し様子を観つつになるかと。
M1 mac で sencha cmd が動かないとき

M1 の mac で sencha cmd が動かないことがありました。

```
[INF] Processing Build Descriptor : default (production environment)
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007ff816ba06f2, pid=69104, tid=0x00000000000099bb
#
# JRE version: OpenJDK Runtime Environment (8.0_242-b08) (build 1.8.0_242-b08)
# Java VM: OpenJDK 64-Bit Server VM (25.242-b08 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# C  [libsystem_platform.dylib+0x16f2]  _platform_strlen+0x12
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
```

その場合には、`~/Library/Application Support/Sencha/Cmd/Update` にある `app.properties` ファイルを一旦削除してから実行すると動作します。(僕の場合は動作しました)

```
cd ~/Library/Application Support/Sencha/Cmd/Update
rm app.properties
```

また、Java でのエラーが出る場合は、with JRE のパッケージで SenchaCmd をインストールするとよいでしょう。

### 追記

上記の対応をしてもまだエラーが出る場合があります。その場合は `app.json` に次の行を追加します

```json
    "bypass_lp" :true,
```


参考: https://stackoverflow.com/questions/70266708/sencha-cmd-problem-after-macos-monterrey-update
Dynamics 365 Finance and Operations ~ Power Apps を活用する① ~

おはこんばんちは。
Dynamics 365 Finance and Operations（FO） は Power Apps を用いることで、以下のようなソリューションを構築することができます。​

・ビジネスプロセスに即してデータ収集や意思決定を行える。​
・PowerPointのような操作性で開発も可能。​
・モバイルやデスクトップ問わず、いつでも利用できる仕組みを構築できる。​
・FO 含むバックエンドのシステムからデータを活用できる。​

https://docs.microsoft.com/ja-jp/dynamics365/fin-ops-core/dev-itpro/power-platform/overview

例えば、以下のようなユースケースで効果を発揮します。​

・FO の画面やバッチ処理やワークフローのカスタマイズを内製できる。​
・FO 単体では対応できないバーコード・QRコードリーダーなどを実装できる。​
・購買や経費申請のセルフサービス機能のポータル化。​
・営業メンバがいつでも素早く在庫状態や納期を確認できる。​
・製造メンバがいつでも素早くリソースを確認できる。 ​
・在庫管理メンバがモバイル上でピッキングリストを確認・登録できる。​

D365 Finance や SCM ライセンスをお持ちのユーザは、(コネクタを介して)そのまま Power Apps や Power Automate を利用できます。
※コネクタへのAPIリクエスト数の制限などはあります。

ファーストラインワーカーのユーザが多いSCM領域は(営業担当/購買担当/在庫・倉庫担当)は、出先でのモバイル利用などで、Power Apps (+Automate)
バックオフィスのユーザが多いFinance領域(経理担当)は、たくさんの伝票の処理などで、Power Automate
との親和性が高いのかなと考えます。​

Power Apps をアプリ作成したら、Teams や Power Apps アプリから利用したり、FOの画面に埋め込んで利用したり、というパターンになります。
*Canvas Appの場合​

アプリからの利用: FOを開かず簡単にデータを検索・入力したい、モバイルから利用したい etc.​
埋め込みでの利用: FOにて他データを見ながら入力したい、既存の画面に補助データが欲しい etc.

私もまだまだ初心者ですが、色々と手を動かして学んでいきたいです。とりあえず今日は、

#簡単に一覧・新規登録・編集の画面を作成する
ということで、私もまだまだ Power Apps で画面を作り込むのは厳しいので、連携したいデータを指定すれば勝手にいい感じの画面を自動で作ってくれるこの機能を使ってみました。
ギークフジワラさんの[ページ](https://www.geekfujiwara.com/tech/d365/753/)を拝借させていただき、作成してみました。ありがとうございます。

こちらは顧客マスタ（CustomersV3）をデータソースとした一覧画面の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/ca65bab7-a057-c83a-428a-b17f91e1dd46.png)

こちらは発注書（PurchaseOrderHeaderV2）をデータソースとした一覧画面の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/520c84f7-20b5-2bfe-7e3d-72f256579e66.png)

新規登録画面で、必要な項目を入力させるように画面を作れば、Power Apps からも情報入力ができますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/6ce5938b-373f-c30f-0bef-39447fc4246d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375815/760805fc-14eb-c6d1-65bb-f0b137af1c14.png)
phpunitをGitHubActions化する方法

# 概要
​
プロジェクトで`phpunit`の自動化テストをGitHubActionsで自動化したので紹介します
​
https://phpunit.de/
​
# やり方

```yml:.github/workflows/main.yml
name: CodeCheck
​
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
​
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: docker-compose up
      run: |
        # docker-compose build
        docker-compose up -d
    - name: composer install
      run: |
        docker-compose exec -T laravel bash -c "composer install"
    - name: phpunit
      run: |
        docker-compose exec -T laravel bash -c "php vendor/bin/phpunit"
​
```
​
# mainブランチにPRを投げるとテストが実行される
​
![](https://storage.googleapis.com/zenn-user-upload/121beab76c0e-20211213.png)
【初心者向け】Ruby の Hash#each はブロックに何を渡す？

# 質問

Ruby の `Hash#each` はブロックに対して何を渡すか。

# 回答

うわー，これまたチョー初心者向けの質問やなあ，各要素のキーと値のペアに決まっとるやん。
だってほら，たとえば

```rb
food = {morning: 3, evening: 4}

food.each do |time, amount|
  p [time, amount]
end
# => [:morning, 3]
#    [:evening, 4]
```

ってなるやんか。

# 更問

その「キーと値のペア」ってどういうこと？
たとえば次のコードの結果はどうなる？

```rb
food = {morning: 3, evening: 4}

food.each do |x|
  p x
end
```

# 回答

げっ，二つ渡されてるのにブロックパラメーターを一つしか書いてないときって，ええと・・・。
リファレンスマニュアルの「[ブロックパラメータの挙動](https://docs.ruby-lang.org/ja/3.0.0/doc/spec=2fcall.html#block_arg)」に出てる

```rb
def foo
  yield 1,2,3
end

foo{|v| p v}       #=> 1
```

と同じようになるはずやから，

```
:morning
:evening
```

って表示されるやろな。

# 確認

ところが実際はこうなる：

```rb
food = {morning: 3, evening: 4}

food.each do |x|
  p x
end
# => [:morning, 3]
#    [:evening, 4]
```

# 驚愕

えっ，なんで？？？

# 解説

`Hash#each` がブロックに渡しているのは，実は「キーと値のペアを長さ 2 の**配列**で表現した一つのオブジェクト」なわけ。

つまり，今の場合，`[:morning, 3]` とか `[:evening, 4]` という配列がブロックに渡されている。

ところがこれを

```rb
food = {morning: 3, evening: 4}

food.each do |time, amount|
  # なんとかかんとか
end
```

のように，ブロックパラメーター二つで受けると，配列の第 0 要素が `time` に入り，第 1 要素が `amount` に入る。

ブロックに渡された値をブロックパラメーターがどのように受け取るか，その仕様の全貌はちょっと複雑なのだけど，このように単一の配列を複数のブロックパラメーターで受ける場合は**配列が展開される**ことになっている。

# 納得

なるほどー。

# 蛇足

番号指定ブロックパラメーターを使った場合にどうなるかも見ておこう。

```rb
food = {morning: 3, evening: 4}

food.each{ p _1 }
# => [:morning, 3]
#    [:evening, 4]

food.each{ p _1 ,_2 }
# => :morning
#    3
#    :evening
#    4

food.each{ p _2 }
# => 3
#    4
```

`_1` だけを使った場合，ブロックパラメーターは一つであるとみなされ，配列の展開は行われない。

`_2` を使った場合，配列は展開される。
サービス改善って結局これやらないとダメだよ。。


この記事は「株式会社エイチームフィナジーAdvent Calendar 2021」21日目の記事になります。
クリスマスイブイブイブイブ🎄の担当は私@yudai_neba が務めさせていただきます:santa_tone3:
#目次
[1.私について](#1-初めまして)
[2.今日のお話](#2-今日のお話は)
[3.ズバリ結論](#3-ズバリ結論)
[4.チーム内エクスペリエンスの向上](#4-チーム内エクスペリエンスの向上)
[5.サービスビジョンからミクロな戦略に落とし込む](#5-サービスビジョンからミクロな戦略に落とし込む)
[6.おわりに](#5-おわりに)

#1. 初めまして

![1920 Web – 32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538724/43696e8e-36a4-6c9b-6931-e232817c28f6.png)


私は株式会社エイチームフィナジーでデザイナーをしています根橋侑大と申します。
以前は既存事業、現在は新規事業である転職サイト比較のサービスデザインをしています。

### 少しだけ事業説明
![1920 Web – 34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538724/66c7c221-3504-6a15-9b72-b753636d6b65.png)

私が働くエイチームフィナジーでは「世の中からお金の不安をなくす」というミッションのもと、金融領域を中心に様々なサービスを展開しています。その中でも私が所属する部署ではこのようなBtoBtoCのリボン型ビジネスモデルを展開しているので、
私は利用していただくユーザー様にとってより効果的なサービスを提供することを日々の使命としています。

#2. 今日のお話は
既存事業と新規事業の両方でサービス改善を経験して、「結局これができたから上手くいったな」という体験を元にお話できたらなと思います。この投稿を読んでいただけた方の一助になれれば幸いです。


#3. ズバリ結論
結論から言うと

:::note info
チーム内エクスペリエンスの向上
:::

:::note info
サービスビジョンからミクロな戦略に落とし込む
:::

この２つをチームメンバー全員が意識して推進できるよう団結する事です。

ありがたいことに、改善についての相談をちょくちょくいただくのですが、このことを伝えると相談に来てくださる皆さんの大体が「やりたいんですけどね...」「時間がなくて...」「施策を止めれなくて」「そもそも他事業部とこの議論にはならなくて」という回答をされます。

この２つって、**言うなれば施策を作る前の段階に戻ること**なので
皆んなやったほうがいいのは分かるけど、現在進行してるにも関わらず戻る勇気が持てなかったり、直近タスクを捨てれなかったりと、結局**決断するまでもなくプライオリティが下がってしまう**のかなと思います。

なので、この場をお借りして言います。

### `これこそ、優先度高の最重要タスクです`

- 施策が単発でインパクトが小さい
- 「これやりたい」同士でぶつかる
- 施策立案時に着地地点が毎回違う
- 分析時や施策立案時に見るべきKPIがわからない
- 結局もう何したらいいかわからない

１つでも当てはまったら是非一度勇気を振り絞って原点に戻り２つをやってみて欲しいです。


#4. チーム内エクスペリエンスの向上
これは、**チーム内の共通目的と共通認識を揃えて、同じ方向を向こう。**ということです。
`→チーム内で進めたい方向性が各々違う`
そんなフェーズかも？と今思う方は真っ先にここを揃えることから始めてください。詳しい内容は以前noteでまとめたので下記を参照いただければと思います。

https://note.com/nyudai/n/n28abe8456a1c

`僕の体験談なのでデザイナー目線の記事でありますが実際にチームで体現した軌跡と結果を記載してます`


#5. サービスビジョンからミクロな戦略に落とし込む
ここでいう`サービスビジョンの確立`とは具体的に何をするのかと言うと、**「誰のために」「どんなサービスを展開するべきか」**を定めることです。そして`ミクロな戦略に落とし込む`というのは、そのサービスビジョンから想定される**「理想のユーザー体験」に対して現実とのギャップを埋める**施策を立てていくことです。

上記を持って**今期「何をしていくか」の認識をチームで揃える**ことがとても大事です。
これが揃うと施策をストーリー立てて考えることができます。

できれば方法まで書ければと思うのですが、長くなってしまうのでまた別記事でまとめたものを後日投稿いたします:bow_tone1:

#5. おわりに

ここまで読んでいただいてありがとうございます。私も日々勉強の毎日ですが、自分たちが運営するサービスが使ってくださるユーザー様にとってどんなサービスであるべきか常に考えることが最重要であると確信していますので、これからももっと追求していけたらと思います。
Managed Instance Group 作成方法

## What's This

MIGのまとめです。


## MIGと相関

![スクリーンショット 2021-12-18 13.23.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/0ccd36d6-fa8e-0bfa-c481-dfd68e1c09e0.png)


## 作成

#### インスタンス グループを作成

![スクリーンショット 2021-12-18 13.16.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/00ac5bbe-9f38-f6c2-4ce2-ecb5f824b41d.png)

#### ステートレスかステートフルを選択

デフォルトはステートレス。
両者の違いはこうらしいです。ほとんど文字通り。

```
ステートフル ワークロードとステートレス ワークロードの主な違いは、
ステートフル ワークロードは個々の VM の状態（データベース シャード、アプリの構成など）を
VM のディスク上に維持するのに対し、ウェブ フロントエンドなどのステートレス ワークロードは個々の VM で状態を維持しないという点にあります。
```

![スクリーンショット 2021-12-18 13.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/17fe7c4f-4bb7-8e72-8561-fbad1aa7ee74.png)

### インスタンスの再分配 

これを有効にすると、ゾーン間での負荷分散は均等になるように再分配されるけど、実行中の他のインスタンスに影響を与えてしまうんですね。
ステートフル ワークロードが実行されているインスタンスが、プロアクティブな再分散によって自動的に削除されたら困る場面もあると思うので、注意ですね。

ここ分からなかったのが、調整されるために削除されたインスタンスって、再作成されるインスタンスにちゃんと中身引き継がれるんですかね？
>新しいインスタンスを起動する際、グループの容量が一時的に失われます。

この記述から考えても、よく分からない。
インスタンステンプレートを使用して、同じインスタンス群をMIGとして作るのがスタンダードだから、予め決めておいた構成でインスタンスが作られるのかな？

![スクリーンショット 2021-12-18 13.25.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/fd25b666-c72a-51c6-8120-4e1c5b426c0a.png)

![スクリーンショット 2021-12-18 13.25.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/86a38fd5-ec4a-a076-ba8f-e7e371c9b532.png)

### インスタンス テンプレートの作成

インスタンス テンプレートがない場合は、ここで作成する。

![スクリーンショット 2021-12-18 15.48.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/d5e7b418-07df-bf99-963c-20b4501ed9bc.png)

### 他オプション

#### 予測自動スケーリング

CPU負荷の履歴に応じて予測される。

![スクリーンショット 2021-12-18 15.51.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/a4984827-27b3-61bd-3144-ae1a40e2f2c5.png)

#### クールダウン期間

![スクリーンショット 2021-12-18 15.53.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/816a15e0-832d-12ce-5949-a527003eb294.png)

#### スケールインの制御

![スクリーンショット 2021-12-18 15.54.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/9c8f3305-9645-0ff1-138e-5c62a46ddebb.png)


##### Auto Healing
ヘルスチェック設定して、反応なかったら再作成すると。すごい。

![スクリーンショット 2021-12-18 15.50.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/91df89d3-c95d-5d6a-63c0-8bdbdf727810.png)

これであとは作成を押下するのみ。

## 参考

```
https://cloud.google.com/compute/docs/instance-groups/distributing-instances-with-regional-instance-groups
```
Android Kotlinの日本語チュートリアルを書きました

# Android Kotlin日本語チュートリアル
![androidkotlin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520839/4060a995-f839-6cd5-9f54-fe08013b7e87.png)
このたび表題の通り、初学者向けにAndroid×Kotlinの日本語チュートリアルを執筆しました。
全9回(+α) からなり、昨今のAndroid開発には欠かせない知識をできるだけ盛り込んだ内容にしたつもりです。

記事: [Android Kotlin日本語チュートリアル](https://araki.tech/android/article_135/)
Github: [HiroshiARAKI/AndroidKotlinTutrial](https://github.com/HiroshiARAKI/AndroidKotlinTutrial)

このQiita記事は本チュートリアルのポータル的な意味合いで書いています。
(あまり良い使い方ではないかもしれませんね、ごめんなさい。)

# 学べる内容抜粋
ジャンルバラバラですが、おおよそ学ぶ順番で書いていくと...

Actvity, Fragment, Resource, Lifecycle, RecyclerView (Adapter, LayoutManager), Coroutine (非同期処理), Android公式推奨アーキテクチャ, ViewModel, RoomDatabase, Dao, SharedPreferences, DataStore, Theme... (+ Unit Test)

こんな感じです。
流石に全機能は解説していられないのですが、最近よく使われるDataStoreも取り入れていますし、[Android公式ドキュメントが推奨しているアーキテクチャ](https://developer.android.com/jetpack/guide?hl=ja)についても触れています。

# 背景
このチュートリアルを書いたきっかけは、私自身の学びのアウトプット、というのもそうですがこれからAndroidを学ぶ方達に向けて、**「良い最初の一歩を提供したい」**という想いで書いています。~~(あと自己満)~~

なので、表面上の学びだけでなく、詳細の挙動まで知ってほしい部分には、できる限り解説を挟むことを心がけていますし、<font color="LightSalmon">クラス間の依存</font>の話や、<font color="LightSalmon">コードの再利用性</font>にも触れています。

このチュートリアルを終える頃には、**Android開発の土台が形成されているだけでなくアプリケーションアーキテクチャの知識もそれなりに獲得できているはず**です。

# おわりに
まだ発行したばかりなので、誤字脱字があるかもしれません、ご了承ください。
定期的に見直しをしていくつもりではあります。

たまたまこの記事を見つけた、Android初学者の方、ぜひ本チュートリアルをうまく使っていただければ幸いです。

Android経験者の皆さん、もしお時間あればぜひ覗いて、「ここ間違ってね？」や「この実装あまり良くないらしいよ」などの気付きコメントがあれば遠慮なく書いてください！

記事: [Android Kotlin日本語チュートリアル](https://araki.tech/android/article_135/)
Github: [HiroshiARAKI/AndroidKotlinTutrial](https://github.com/HiroshiARAKI/AndroidKotlinTutrial)
作品：クレディっト（Kreddit）

#概要

Odin Projectレッスンによって作ったソーシャルサイト。

レッスンURL: https://www.theodinproject.com/paths/full-stack-ruby-on-rails/courses/javascript/lessons/javascript-final-project

Github: https://github.com/RistoLibera/Kreddit

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/5588bfbb-6d43-fe76-20f1-8e9d9139e8ce.jpeg)

作品URL: https://kreddit-unpublic-d62c1.web.app/

#サイトマップ

![Sitemap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/0aff2ae0-af62-feca-cdd4-94dafb6d3529.png)

#使用技術

・HTML、CSS、SASS
・Javascript、React
・Firebase
・Git
・GitHub
・Oracle VM VirtualBox

#機能一覧
##ユーザー機能

![0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/4ecd23af-d47d-1b8d-f073-7c7ce873d5e3.jpeg)

ログイン。

![00.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/2c40332f-645a-7d2c-5e7c-7e6f2da8a587.jpeg)

登録。

##ナビゲーションバー

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/879700d6-e2cf-08e6-78f8-0360ad131e8c.jpeg)

１：何かを検索する
２：話し合いへ移動する
３：ホームページに戻る
４：グループへ移動する
５：通知メニューを出す
６：プロファイルメニューを出す
７：ダークモードに替える

##検索ページ

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/229ef06e-ea66-5b67-71da-e7e0833f5807.jpeg)

１：検索歴史
２：検索された話し合いタイトル
３：検索されたユーザー

##グループページ

![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/40bcb039-8a9a-1b07-9ecf-ea5cb517112d.jpeg)

１：レイアウト変更
２：グループを作る
３：グループ名
４：グループの説明
５：グループに加入する
６：グループの話し合いを見る

##話し合いタイトルページ

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/05596227-e7fd-8bf4-01a0-d600f6d8c4d3.jpeg)

１：グループごとに表示する
２：話し合いを作る
３：話し合いタイトル
４：クリエーター
５：所属するグループ
６：ポストの数
７：評価
８：作った時間

![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/207fb782-3afa-1c15-31c9-0fc3a70087a6.jpeg)

１：話し合いの説明
２：入る

##話し合いページ

![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/91fba74f-31db-154e-859c-51015a6c16d4.jpeg)

１：グループ名
２：評価ボタン
３：クリエーター
４：返事
５：編集
６：削除

##プロファイルページ

![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/e5e90f4a-1495-dda3-7ead-1a5b05d3555d.jpeg)

１：アイコンをアップロードする
２：パスワードを変更する
３：ユーザーを削除する
４：話し合いへリダイレクトする

##言語変更機能

![9.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/458b18be-c182-8f86-bea0-4221c81cc7cf.jpeg)

デフォルトは英語です。

![10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/3f5d8497-3519-a6f8-534f-8badf4fea4f2.jpeg)

中国語もサポートしています！

##ダークモード

![11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/d0689279-8eea-61df-f18b-f494da28b142.jpeg)

目に良い配色に切り替えます。

##レスポンシブ

![22.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/5f0ede77-12a1-9a18-6c11-13cec73d7140.jpeg)


ノートパソコンビュー。

![23.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613718/a67ed457-ad40-b127-2399-d7a55184451e.jpeg)

スマートフォンビュー

#まとめ

八月上旬から2ヶ月かかって一歩一歩着実に進んでからようやく完成しました。

これから専門的なウェブサイト開発に期待しています！
デフォルトVPC以外のVPC内でパブリックなEC2インスタンスを作る手順

### 導入

AWSを使い始めたとき、最初から「デフォルトVPC」が用意されている。
このデフォルトVPC、最初から自動でパブリックなEC2インスタンスが作れるようになっている。

デフォルトVPCは使わず新しいVPCを利用する場合には手動で設定が必要となるので、
「**デフォルトVPC以外のVPC内で、パブリックなEC2インスタンスを作る手順**」を本記事にまとめる。

---
### 実際に作る

作成するもの
![public ec instance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/9ca5e0ea-f4a0-b784-63a7-82f21c0b4061.png)

#### 手順1：VPC作成
・VPC作成
・作成後、コンソール画面よりパブリックDNSホスト名を有効にする。
　「DNSホスト名を編集」＞「DNSホスト名」を有効化
![image0001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/63aac1ed-4b8e-c43b-74c8-c1b03df09b4b.png)
![image0002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/bc749fec-6570-2e45-c554-36e42510961e.png)

手順1完了後の状態
![v001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/6bb4c86b-130a-a129-8657-8311a14ad5c0.png)

#### 手順2：インターネットゲートウェイ作成
・インターネットゲートウェイ作成
・作成後、コンソール画面の「アクション」より手順1で作成したVPCにアタッチする。
![image003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/b0feaeaa-0641-4e0a-db49-515d3d46720d.png)

手順2完了後の状態
![v002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/243adadf-92ad-d632-a119-5dfb38d27502.png)

#### 手順3：ルートテーブル作成
・ルートテーブル作成
![スクリーンショット 2021-12-18 15.28.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/96c40c44-1117-e2eb-44fb-6c0bd7b2fac2.png)
・手順2で作成したインターネットゲートウェイをルートテーブルに紐づける
　「ルート」＞「ルートを編集」
![スクリーンショット 2021-12-18 15.32.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/be0fb686-33fc-514e-9e9d-8d885c278286.png)
　「0.0.0.0/0(デフォルトゲートウェイ)」に、手順2で作成したインターネットゲートウェイを紐づける。
![スクリーンショット 2021-12-18 15.34.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/a8f2d780-128d-2fb2-5e88-bd19fbf2b3b0.png)

手順3完了後の状態
![v003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/f047d80c-8f78-543b-5a16-71a21bd5c3ac.png)

#### 手順4：パブリックサブネット作成
・手順1で作成したVPC内にサブネット作成
・手順3で作成したルートテーブルをサブネットに紐づける
　「ルートテーブル」＞「ルートテーブルの関連付けを編集」
![image004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/107f96c8-80c6-6c8e-a62f-f36e9cf1dbdf.png)
![image005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/a3529cf6-94f4-4dfd-54ab-a561435ca229.png)

今行った作業（ルートテーブル[0.0.0.0/0にIGWが設定されたもの]をサブネットに紐づけること)が、まさにパブリックサブネットを作成するという行為。最初はここらへんよく分かってなかったので自戒の念も込めてMEMO残す。

手順4完了後の状態
![v004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/48a0c4e9-f439-1c80-0e6c-e5e31048c35c.png)


#### 手順5：EC2インスタンス作成
・EC2インスタンス作成
![image006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/c8a17ba2-855d-20aa-97a2-a85f7b278afe.png)

手順5完了後の状態
![v005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653955/95e258f3-aad0-7e13-01a9-ab743a5796fc.png)

### おわり

作成したEC2インスタンスに下記２点が設定されていることが確認できる。
・パブリック IPv4 アドレス
・パブリック IPv4 DNS
git pickをfixupに変えてコミットログを綺麗にする

gitはプログラムやコーディングに関わる仕事をしているとほぼ必ず使うことになりますが、作業に忙しいと、きりのよい所でコミットをすることを繰り返し、自分の作業メモのようなコミットログになってしまいがちだと思います。
それでも動きますので、「それの何が悪いのか」といえば、
・プルリクを出すなど他の人が見た時にコミット単位で見る人もいるので、見る人が見づらい
・変更の本質でないコミットが残り続けることはよろしくない
などが考えられます。

git rebaseの記事はたくさん書かれていますが、rebaseする為の最小手順をまとめたいと思います。

1. git log --oneline
-----------------

コミットログを確認します。
git log --onelineの結果です。

```
[root@homelibrary estate]# git log --oneline
b4a5830 txtをlogに変更
53f269c qrアクセスカウンタを設置
781792d マンション用地一覧を追加
9985509 サイトマップ更新
f7a9e7a 下京区をスマホトップにも追加
4d49436 下京区を追加
0d05598 管理画面に物件名を追加
```

f7a9e7a 下京区をスマホトップにも追加
4d49436 下京区を追加

の２コミットを`9985509 サイトマップ更新`に対し１つにまとめます。

2. git rebase -i 0d05598
------------------------

git logの時とは時間の順序が逆に表示されます。
まとめたいコミットの一つ前のコミットを指定して`rebase -i`します。

```
pick 4d49436 下京区を追加
pick f7a9e7a 下京区をスマホトップにも追加
pick 9985509 サイトマップ更新
pick 781792d マンション用地一覧を追加
pick 53f269c qrアクセスカウンタを設置
pick b4a5830 txtをlogに変更
```

vimを使い以下のように編集します。
まとめたいコミットの下にまとめられたいコミットを移動し、pickをfixupに変えます。

```
pick 9985509 サイトマップ更新
fixup 4d49436 下京区を追加
fixup f7a9e7a 下京区をスマホトップにも追加
pick 781792d マンション用地一覧を追加
pick 53f269c qrアクセスカウンタを設置
pick b4a5830 txtをlogに変更
```

編集が終わったら`:wq`で保存して下さい。

3. git log --oneline
-------------------

```
ef99609 txtをlogに変更
19b4e5d qrアクセスカウンタを設置
2af24c5 マンション用地一覧を追加
6f53fc1 サイトマップ更新
0d05598 管理画面に物件名を追加
```

f7a9e7a 下京区をスマホトップにも追加
4d49436 下京区を追加

の２コミットが無くなり、`6f53fc1 サイトマップ更新`に対し一つにまとまりました。

fixupを使った場合、まとめられたコミットログが残りません。
コミットログを残したい場合はsquashを使って下さい。

fixupの短縮形はf、squashの短縮形はsです。

## 失敗する場合

また、git rebase -i実行後に(no branch)になっている場合は、rebaseに失敗しています。
`Automatic cherry-pick failed.`
というエラーが出ていないでしょうか？

上記の場合は競合して失敗しているので、競合解決後

```
git add <ファイル>
git commit --amend
git rebase --continue
```

として下さい。

以下の記事を参考にさせて頂きました。
https://chaika.hatenablog.com/entry/2019/02/25/170000

https://qiita.com/muran001/items/dea2bbbaea1260098051#%E3%82%84%E3%82%89%E3%81%8B%E3%81%97%EF%BC%91%EF%BC%94%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E8%9E%8D%E5%90%88rebase%E3%81%A7%E3%82%B3%E3%83%B3%E3%83%95%E3%83%AA%E3%82%AF%E3%83%88%E3%81%8C%E8%B5%B7%E3%81%93%E3%81%A3%E3%81%9F%E6%99%82
半角スペースの有無だけでサーバーをぶっ壊しそうになった話

本記事は「[本番環境でやらかしちゃった人 Advent Calendar 2021](https://qiita.com/advent-calendar/2021/yarakashi-production)」24日目となります。

# 前提事項
事故を起こしたのは確か6年くらい前
サーバーのOSは確かCentOS6
諸事情でワンオペだった
本番環境を操作するPCと手順書を表示するPCが別々
手順書は本番操作用PCに入れることができなかった。つまりすべて手入力。

当時の記憶を元にした再現であり多少盛ってるので細かいツッコミは勘弁してください



# 何をしてたか

～～～本番環境作業中～～～

(手順書ﾅｶﾞﾒｰ)

よし、次はファイルの移動か
mvコマンド入力してｶﾁｬｶﾁｬｶﾁｬ…ｯﾀｰﾝ

```
mv: cannot move /bin/ac to '/home/user/work_dir': Permission denied
mv: cannot move /bin/aconnet to '/home/user/work_dir': Permission denied
mv: cannot move /bin/addr2line to '/home/user/work_dir': Permission denied
mv: cannot move /bin/alias to '/home/user/work_dir': Permission denied
mv: cannot move /bin/alsaloop to '/home/user/work_dir': Permission denied
mv: cannot move /bin/alsamixer to '/home/user/work_dir': Permission denied
mv: cannot move /bin/amidi to '/home/user/work_dir': Permission denied
mv: cannot move /bin/amixer to '/home/user/work_dir': Permission denied
mv: cannot move /bin/amuFormat.sh to '/home/user/work_dir': Permission denied
mv: cannot move /bin/analog to '/home/user/work_dir': Permission denied
mv: cannot move /bin/aplay to '/home/user/work_dir': Permission denied
mv: cannot move /bin/aplaymidi to '/home/user/work_dir': Permission denied
mv: cannot move /bin/appstream-compose to '/home/user/work_dir': Permission denied

...以下省略
```

**<font color=red>！！！！！！！！？？？？？？？？？？？？？？？？？？？？？？？？？</font>**

えっえっ何これやべぇ止めなきゃ！`Ctrl＋C` ﾎﾟﾁｰ


# 何が起きたのか


```
// 実行したかったコマンド
# mv /tmp/logfile.zip /home/user/work_dir

// 実際に実行したコマンド
# mv / tmp/logfile.zip /home/user/work_dir
```

何が違うかおわかりでしょうか

実行したかったのは単純なファイル移動コマンドでしたが
ファイルの先頭の `/` と `tmp/logfile.zip` の間に半角スペースが混ざっていました

これにより本来なら`/tmp/logfile.zip`を`/home/user/work_dir`に移動するはずが
`/`配下全てとカレントの`tmp/logfile.zip`を`/home/user/work_dir`に移動するという
`rm -rf /*`に匹敵する **<font color=red>即死コマンドに変貌</font>** したわけです


# その後どうした
まずは移動先となった`/home/user/work_dir`の中を確認
不幸中の幸いとしてrootで作業しておらずsudoも付けず、すぐ処理を止めたことにより
移動されてしまったファイルは無かった(確か)ので首の皮は繋がっていました

一応作業ログを見返しやばそうな出力は無かったのでそのまま作業を再開しました。
その後特に問題は起きていませんでした。

# なぜ惨劇は起きかけたか
いうまでもなくワンオペでクロスチェックも何もあったものじゃなかった環境であり
長文コマンドを全て手打ちせざるを得ない環境だったので起きるべくして起きた事象だと思います
ただし当時は人がいなくてペアとなる人員を用意できなかったプロジェクトだったのお察しでしょう

Q. シェルスクリプトとか用意してなかったの？
A. 用意することにより手順が変わるため手順書の改版と検証が必要となり、その工数が認められるような雰囲気じゃなかったため
当時は私も技術力があるとは言えずなかったので説得しきる材料もありませんでした


# 二度と惨劇を起こさないためにどうしたのか
正直このタイプの凡ミスはどうしたって無くならないような気もするんですが
今回は手順書を横目で見ながら長いコマンドを手打ちしていたことがミスを誘発した一因と思っています

これに限らず、当時の手順書は実行するコマンドが多く長いものもあったので
実行するPC内に手順書を置く許可を貰い、コピー＆ペーストでコマンドを実行させてもらえるように交渉しました
（サーバーへ接続するのは専用のPCからのみだったため）


# 最後に
筆者はこの事故の影響でmvコマンドがトラウマになりました
今でも可能なら`cp`してから`rm`するという手間を挟んでファイル移動を行っています
当時のプロジェクトはみな平然とrootを使用していた環境でしたが
rootの怖さを思い知ったのでどうしようもない限り使うのは辞めとこうという勉強になりま

(追記)
何も変わってないやんという感じですが
`cp`というクッションを挟むことによって慎重に確認を行うための個人的な儀式です
さすがに何年も経った今はこんなこと起こさないはずだけどミスると一発アウトはどうしても怖い
素のJavaScriptでモーダルを爆速実装する

昨今の便利なフレームワークやライブラリを使えばモーダルの一つや二つ簡単に実装できそうなものですが、素のJavaScriptで実装できるようになっていても損はないはずです！
超簡易的な実装例をご紹介しますので、早速やっていきましょう！

（チャンネル登録と高評価も忘れずにお願いしますww）
## 爆速実装

一応codepenにもコードを置いているので、手元で環境作るのが面倒な場合はささっと確認してみてください！

https://codepen.io/T-unity/pen/PoJmXvr

### 実際にできるやつ

デザインは非常にしょっぱいですが、基本的な考え方は分かりますww

![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684929/824c9c6c-cde7-c455-6020-44e688829911.gif)

### HTML

```html
<button onclick='openModal()'>モーダル表示</button>
<button onclick='closeModal()'>モーダル非表示</button>
<div id='wrapper' class='wrapper'>
  <div class='title'><h2>タイトル</h2><div>
    <div class='content'><p>コンテンツ</p></div>
</div>
```

### JS

```js
const target = document.getElementById('wrapper');

function openModal() {
  console.log('wrapper');
  target.style.display = 'block';
}

function closeModal() {
  console.log('wrapper');
  target.style.display = 'none';
}
```

※補足あり

### CSS

```css
.wrapper {
  text-align: center;
  background-color: #defffd;
  padding: 250px;
  display: none;
}
.title {
  border: 1px solid;
  padding: 100px
}
```

### ポイント

モーダルというのは要するに、何かのイベントをきっかけに要素を出したり消したりできれば良いわけなので、考え方としては

・対象のエレメントを通常は`display: 'none';`にしておく
・クリック、またはスクロールなどのイベントを検知した時に、対象の要素に`display: 'block';`を付与する

を行えばOKです。

CSSはあまり得意ではないので、デザインは各自いい感じにしてくださいww
（今回書くの忘れていましたが、モーダルを表示している際はモーダルの背景はぼかすのが通常の実装かと思いますので、wrapperとtitleの間あたりに一個divを入れて、画面全体を覆うようなカラーを設定する必要がありますね。CSSはopacityとz-indexあたりを頑張って調整すれば良い感じになりそうです。もしかしたらHTMLのツリー構造も若干変える必要あるかも？）

## プロダクトレベルで実装する場合

上記はかなり簡単な例ですが、実際にプロダクトレベルで実装する場合はバックエンドとのデータの通信が必要になる場合がほとんどだと思います。

対象のデータに応じてモーダル内部のDOMを動的に生成したり、イベントのバインドを行ったり、CSSをいい感じにしたりみたいな作業はほぼ必須かと思いますので、頑張って実装してください（白目）

また、今回は超簡易的な実装のためonclickを使いましたが、大体の場合はイベントリスナーを用いる事になりそうです。
（以下のような感じ）

```
element.addEventListner('click', ()=> {
  // console.log('デバッグコードを仕込む')
  // function('関数をコールする')
  // someConst.innerHTML = '直接処理を行う'
  // ...etc
})
```

扱うデータ量が増えてきたら適切なクラスに切り分けるなど、まだまだ工夫の余地がありますので、是非上記をとっかかりにいろいろ遊んでみてください！
それでは、不明な点などあれば何かコメントください！
ios ヘルスケアデータの一覧

iOSのヘルスケアで取得できるデータの一覧
DeveloperDocument を直訳したものになります

| データ |  |
| :--- | :--- |
| ActiveEnergyBurned | ユーザーが消費した活動エネルギー量を測定する量的サンプルタイプ |
| ActivitySummary | アクティビティリングビューで表示されるアクティブサマリー |
| AppleStandHour | 1日のうち、1時間あたり1分以上立って動いた時間数をカウントするカテゴリサンプルタイプ |
| AppleStandTime | ユーザーが立っていた時間を測定する量的サンプルタイプ |
| AppleWalkingSteadiness | ユーザーの歩行の安定性を測定する量的サンプルタイプ |
| BasalEnergyBurned | ユーザーの安静時消費エネルギーを測定する量的サンプルタイプ |
| BodyMass | ユーザーの体重を測定する量的サンプルタイプ |
| DistanceCycling | ユーザーが自転車で移動した距離を測定する量的サンプルタイプ |
| DistanceWalkingRunning | ユーザーが歩いたり、走ったりして移動した距離を測定する量的サンプルタイプ |
| ECGOtherSymptom | (心電図) |
| EnvironmentalAudioExposure | 環境中の音に対する音声暴露を測定する量的サンプルタイプ |
| FlightsClimbed | ユーザーが登った階段の数を計測する数量サンプルタイプ |
| HandwashingEvent | 手洗いイベント用のカテゴリーサンプルタイプ |
| HeadphoneAudioExposure | ヘッドホンからの音声暴露を測定する量的サンプルタイプ |
| HeartRate | ユーザーの心拍数を測定する量的サンプルタイプ |
| HeartRateVariabilitySDNN | 心拍間隔の標準偏差を測定する量的サンプルタイプ |
| Height | ユーザーの身長を測定する数量サンプルタイプ |
| HKDataTypeSleepDurationGoal |  |
| MindfulSession | マインドフルなセッションを記録するためのカテゴリーサンプルタイプ |
| OxygenSaturation | ユーザーの酸素飽和度を測定する量的サンプルタイプ |
| RespiratoryRate | ユーザーの呼吸数を測定する量的サンプルタイプ |
| RestingHeartRate | ユーザーの安静時心拍数を測定する量的サンプルタイプ |
| SixMinuteWalkTestDistance | 6分間の歩行テストでユーザーが歩ける距離を保存する数量サンプルタイプ |
| SleepAnalysis | 睡眠分析情報のカテゴリーサンプルタイプ |
| StairDescentSpeed | 階段を下りているときの速度を測定する量的サンプルタイプ |
| StepCount | ユーザーが歩いた歩数を計測する数量サンプルタイプ |
| VO2Max | 運動時の最大酸素消費量を測定する量的サンプル |
| WalkingAsymmetryPercentage | 平地歩行時に、片方の足がもう片方の足と異なる速度で動く歩数の割合を測定する量的サンプルタイプ |
| WalkingDoubleSupportPercentage | 平坦な地面を安定して歩いているときに、ユーザーの両足が地面に接地している時間の割合を測定する量的サンプルタイプ |
| WalkingHeartRateAverage | 歩行時の心拍数を測定する量的サンプルタイプ |
| WalkingSpeed | 平坦な地面を安定して歩いたときの平均速度を測定する量的サンプルタイプ |
| WalkingStepLength | 平坦な地面を安定して歩いたときの平均的な歩幅を測定する量的サンプルタイプ |
| Workout | ワークアウトに関するエネルギー計測の使用方法 |
iPhone充電％壁紙の設定

充電10％刻みでiPhoneの壁紙を変更する方法と作り方です

なお5％刻み変更もショートカットの設定上できそうですが、(画像の)準備が面倒なのでやりませんでした

**

1.画像の準備
今回は充電が減るたびに満月から新月へかけていくよう、月の画像を準備しました
📷壁紙画像（[壁紙作り方](https://qiita.com/ais/items/3c6a6474c4f3600b823c)、[月](https://qiita.com/ais/items/0704130c62fcf835c50f)、ソーダ、定規、数字、体重計）



2.画像のアップロード
ローカル端末内からiCloudのShortcutsフォルダへ、フォルダごとアップロード
![210722CC-AC68-4337-80E2-8F1F93D79738.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403764/8191cb67-0f52-277d-6336-78fe562938f1.jpeg)


3.ショートカットの設定
画像の名前がある程度揃っていれば手間を減らせます
細かくは👉別に書きます
①ショートカットの通知をオフにする👉
②新規ショートカットを作成👉
　❶バッテリー残量を取得
　❷計算で、残量の1桁目を切り捨て
　❸リストで壁紙のファイル名を作る
　❹ファイルを呼び出す
　❺壁紙を設定
![5FE924CC-0244-49DD-BB27-B826EEED7AB5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403764/e28344e6-f3d8-8aa5-5ad8-8a31392ba05f.jpeg)



③オートメーションで②を呼び出す👉
　❶バッテリー残量が10〜90％を下回った時
　❷電源から接続解除された時
おまけで、電源に接続した時に「充電中」壁紙を設定
![12C9AC0F-3344-45CA-96E8-153342C1D66A.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403764/113208d1-35b2-c541-53e9-fdd50f524abe.jpeg)



4.お願い
iPhoneに不慣れで画像編集はもとよりファイルの移動すら手間取っている状況です
ミスありましたら指摘お願いします
あと
どなたかカッコいい壁紙が出来たら教えて欲しいです
![A85F2212-E778-46FF-968D-986CEA4262A8.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403764/0b2963f2-e5b5-cfe9-f75b-fca40c8fb442.jpeg)
８進数と１０進数の混在(ping, telnet)

# 192.168.012.1 が 192.168.12.1 ではない（ことがある）
今更ではある内容だが、ミスタイプしてtelnet アドレス直打ちのコマンドを叩いたら、おかしな挙動をしていたので、メモしておくそす。

ちなみにどうなるのかというと、`192.168.012.1` は `192.168.10.1` として解釈され実行される。

```text:windows10_20H2
C:\Users\user> ping 192.168.012.1

192.168.10.1 に ping を送信しています 32 バイトのデータ:
Ctrl+C
^C
C:\Users\user>
```

```text:CentOS7
[user@linux ~]$ ping 192.168.012.1
PING 192.168.012.1 (192.168.10.1) 56(84) bytes of data.
^C
--- 192.168.012.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms

[user@linux ~]$
```

お、どうやら、Linuxだけじゃなくて、WinNTでも再現するっぽい...

# 確認したのは以下の環境そす

- Windows10 20H2
    - Microsoft Windows [Version 10.0.19042.1348]
- CentOS Linux release 7.9.2009 (Core)
    - 3.10.0-1160.25.1.el7.x86_64
- Ubuntu 20.04.3 LTS
    - 5.4.0-1045-raspi

ちなみにubuntu(raspi)は結果同じだったので省略

# じゃあ、192.168.012 にtypoしたらどうなるのか
いわゆる、第4オクテットの入力せずにEnterKeyターンっしたパターン

```
C:\Users\user> ping 192.168.012

192.168.0.10 に ping を送信しています 32 バイトのデータ:
Ctrl+C
^C
C:\Users\user>
```

```
[user@linux ~]$ ping 192.168.012
PING 192.168.012 (192.168.0.10) 56(84) bytes of data.
^C
--- 192.168.012 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms

[user@linux ~]$
```

ん、`192.168.012` → `192.168.0.10` になった。

# ドット無し10進数ってのもある

```
[user@linux ~]$ ping 3232238081
PING 3232238081 (192.168.10.1) 56(84) bytes of data.
^C
--- 3232238081 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1000ms

[user@linux ~]$ 
```

これは知ってた。
ちなみにブラウザでも [`http://3232238081/`](http://3232238081/) ってやると、[`http://192.168.10.1/`](http://192.168.10.1/) に勝手に置き換わる。

ちなみにIPアドレス→10進数への変換は面倒だったので、そうゆうサイトを使った

http://www.rtpro.yamaha.co.jp/RT/docs/ip-address.php

あ、そういえば、さっきの8進数と10進数の混在アドレスをブラウザに打ち込んだらどうなるんだろうか。

## ://192.168.012.1

![バージョン: 96.0.4664.110（Official Build） （64 ビット）](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104374/2dad1a43-57c9-019f-dedf-a9c7e6a4dba1.png)

[`http://192.168.012.1/`](http://192.168.012.1/) ってやると、[`http://192.168.10.1/`](http://192.168.10.1/) ってなった。やっぱりOSレベル？カーネルレベル？で動いてるっぽい



# 他のOSではどうなるんだろうか

追加で Cisco-IOS で動作する Ciscoルータ(C891FJ/K9)(version: 15.4) と Junos で動作する Juniper(20.4R3.8) で確かめたら、***Junosでは発生***した。（出力結果がLinuxそのままだったので省略）

ちなみに、Ciscoでは置き換わりは起きなかった。うーんOS設計のレベルまで行くのかな。。。

```
cisco# ping 192.168.012.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.12.1, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)
cisco#
``` 

# 参考までに
https://geeks-world.imtqy.com/articles/J154695/index.html
iPhoneの充電％表示

はじめまして
いまさらながら人生初のiPhoneを手に入れたAISと申します

残念ながら目の衰えのためiPhone右上の充電アイコンがはっきり読み取れません

今80％なのか90％なのか分からん😔
数字％表示にはできないものか……

不慣れながら探し回った結果をメモします
なおシステムバージョンは14.3です

**

1.充電アイコンの隣に％併記
調べた範囲では無理そうです
　😔Androidなら楽なのだが…



2.コントロールセンター表示
画面の右上を下方向へスワイプすると
コントロールセンターが出ます
ここには％とアイコンで表示されます
　😔動作ひとつ必要です
![31F4918C-D3CE-412D-8DDA-5F1F62B5CCBA.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403764/6cc0859d-ea6e-48c1-5a3f-013014a36ccf.jpeg)



3.ウィジェット
ホームを長押し→左上の＋からバッテリーのウィジェットを追加できます
　😔サイズがデカい…ヒトマスなら良かった
![79C64620-9702-47FE-BB80-8B1FFF4054FD.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403764/7aaab5fd-8628-2535-c489-2f5fdf4f9976.jpeg)



4.ショートカットで壁紙設定
色々探して現在の妥協点がコレ
充電残量10％刻みで壁紙を変えています
　👉やり方は[こちら](https://qiita.com/ais/items/60e2186589cb1afc35a6)
![D55E055C-CDC0-4BA8-B13B-50617A6B370F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2403764/5eb8a81b-e2e5-317a-4b05-b913f799effc.jpeg)