OmniAICreator/Qiita-1.07M huggingface dataset:
gitlab web UI って何？ (知っておくと便利な機能)

# 概要
本ページでは、gitlab web UI の機能のうち、
知っておくと便利な機能をさらっと説明します。

メインページは以下になります。

https://qiita.com/hanzo-k/private/174e6c003ea111d3ccca


# 知っておくと便利な機能

## README.md
Files 直下に置かれるファイル。
プロジェクトを開いた際に、一番最初に表示される内容になるので、
**プロジェクトの概要やルールを書いておくと良いでしょう。**
　※記述方法は issue や wiki と同じマークダウンです

### 作り方
プロジェクトを作る際に、
`initialize repository with a README` のチェックを入れるだけ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568441/10b0f9db-02b3-01a8-e7b7-839c703f3558.png)

※もし、チェックを外してプロジェクトを作ってしまった場合。
　一度プロジェクトを `git clone` し、
　`READEME.md` を作成して `git push` する必要があります。
　操作が分からない場合は、有識者に依頼しましょう。


## snippets
snippet と呼ばれる短文を書ける機能です。

リンク知っていれば gitlab にログインできるユーザなら誰でも見られるので、
ちょっとした情報の連携にも使えます。

### 活用例
+ リリース作業時の差分を貼りつけて確認してもらうとき
+ あまり大きくないファイルを共有したいとき
  - Description にファイルを添付すれば OK

### 作成方法
gitlab 上部のツールバーの `＋` マークから、`New snippet` を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568441/d3e33132-d3dc-a044-e7c3-9cc5cd822512.png)

Title に分かりやすい名前を付け、
Files（下図の赤枠内）に書きたい事を書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568441/3def3153-c62a-f978-2419-241cf479b81b.png)

公開範囲（Visibility level）を選択し、
Create snippet を押して作成します。
**公開範囲は、Internal（gitlab にログインできるユーザのみ見られる）にするのが無難です**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/568441/e0ac0a44-08dd-99ef-8460-c875912f22e1.png)

※なお、Public だとログイン不要で見られますが、
　gitlab 自体に特に閲覧制限をかけていない場合、
　社外からも見えてしまうので注意です！
※private は snippet の一覧に表示されないだけで、
　URL を知っていれば見られます。
　なので、個人間のファイルのやりとりなどで使えそうです。


## integration
外部サービスに gitlab の変更を通知する機能です。
Settings > integration から設定できます。

gitlab の通知は、デフォルトで gitlab アカウントのメールアドレスに対して届きますが、
昨今のテレワーク続きにより、メールよりも Teams などのツールを利用する方が多いので、
issue の更新通知漏れを防ぎたい場合、などに有効です。

ただし、メンションされていなくても通知が飛ぶので、
ノイズになる可能性はあります。


## インラインコード と コードブロック
gitlab の issue などでは、マークダウン（Markdown）と呼ばれる特殊な記法があります。

そのマークダウンの中に、
インラインコード (Inline code) と
コードブロック (Code block) というものがあります。

### これは何？
マークダウンにおいて、文章整形の記号を無視してくれる機能です。

本来はその名の通り コード（cd /var/xxx）を表現するために使いますが、
運用現場などでは URL や 作業ログ、長い会話の引用 にも使います。

### 使用ケース
マークダウンでは、一部の記号を文中の特定の位置や、
特定の個数使用すると、文章を自動的に変換※してくれます。
※箇条書きや太文字に変換する など

しかし、状況によっては意図しない変換が行われることもあります。
例えばこんな内容を書きたい場合。

```
-    "mode": "0644",
+    "mode": "0755",
```

そのまま書いてしまうと

-    "mode": "0644",
+    "mode": "0755",

こんな感じで `+` や `-` が箇条書きに変換されてしまいます。

こんな時にインラインコードなどを使うと、
`+` や `-` など、どんな記号でも
自動変換されずに記述することができます。

また、URL についても自動リンクされなくなるので、
ログなどを貼った際に、意図しないリンク（ツールなどのインストール元 URL）が有効化されることを防げます。
`https://qiita.com/drafts/6f61fe5dd47296c4071a`


### 使い方
#### インラインコード
自動変換されたくない文字列を `` ` ``(バッククォート) で括ります。
主に、URL や コマンド など、単一行の文章で使います。

例：
\`cd /var/log/maillog; pwd\`
↓
`cd /var/log/maillog; pwd`

#### コードブロック
自動変換されたくない文字列を ```` ``` ````（トリプルバッククォート）で括ります。
主に、複数行に渡る長文（ログや操作記録、過去の長い会話）などで使います。

```
TASK [change mode] *******************************
Monday xxx
--- before
+++ after
-    "mode": "0644",
+    "mode": "0755",
```
RSpecのControllerテストでNoMethodError:  undefined method `get' for xxxx と表示される

# はじめに
RailsでRSpecを使用してcontrollerのテスト時のエラー　NoMethodError:  undefined method `get' for　xxx について
# 目次
<!-- タイトルとアンカー名を編集 -->
1. [Rspecでのバージョンの違い](#Chapter1)
1. [エラーの原因](#Chapter2)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Rspecでのバージョンの違い
Rspec3以降ではデフォルトでファイルの場所から自動的に推測する機能がなくなっています。
Rspec3以降ではcontorollerのテストをする時は指定する必要があるようです。

<a id="#Chapter2"></a>
# エラーの原因
**１.typeを指定していない**(今回の私)

```rb
# type: :controller　または type: :request　とする必要あり
RSpec.describe Api::V1::PostsController, type: :controller do  
  describe '#index' do
   ・
　　　　　　・
　　　　　　・
 end
end
``` 

バージョンの違いで説明した通りtypeの指定が必要となります。テキストを確認しながら進めていたときはViewのテストしかなく、contollerでtypeを指定すると知らなかったので躓きました。
注意点として、contorollerの記述方法です。``Api::V1::PostsController``どこの階層にあるかによって記載方法が違います。
私は自分のcontrollerの一番上のクラス部分を貼り付けました。

```rb
class Api::V1::PostsController < ApplicationController
```

**２.specファイルにrails_helperを読み込んでいない** 
テストファイルにrails_helperを読み込ませる必要があります。

**posts_spec.rb**

```rb
require 'rails_helper'

RSpec.describe Api::V1::PostsController, type: :controller do
```

rails_helperファイルには
　・本番環境の時にテーブルに格納されているデータの全削除を防ぐ設定

```rb
abort("The Rails environment is running in production mode!") if Rails.env.production?
```

　・migrationを確認（schemaとmigationに差異がある場合は例外が発生）

```rb
begin
  ActiveRecord::Migration.maintain_test_schema!
rescue ActiveRecord::PendingMigrationError => e
  puts e.to_s.strip
  exit 1
end
```

　・テスト後にテストデータを削除してくれる設定

```rb
config.use_transactional_fixtures = true
```

　・ファイルに応じたメソッドを使える設定（contorollerの場合はgetなど）

```rb
config.infer_spec_type_from_file_location!
```

などがあります。これを読み込むことによってgetメソッドなどが使えるので、``NoMethodError:  undefined method `get' for xxxx ``などのエラーの場合は``rails_heper``が読み込まれていない可能性があります。

<a id="#reference"></a>
# 参考文献
https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#file-type-in​​ference-disabled


https://stackoverflow.com/questions/6296235/undefined-method-get-for-rspeccoreexamplegroupnested-10x00000106db51f


https://qiita.com/aiandrox/items/7ff4d73416dc15f0cc0f
DockerとDocker ComposeをUbuntu 20.04にインストールする。2022年冬

# 概要

2022年1月にUbuntu20.04にDockerをインストールする手順についてまとめます。
なるべく新しいのを入れます。

**[DockerとDocker ComposeをUbuntu18.04にインストールする。2019年冬](https://qiita.com/abetomo/items/ee6c77f0b3312dd9c1c5)　との差分はDocker Composeのインストールについてです。**

# 環境

```
% cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
```

# なるべく新しいのを入れる

## Install Docker Engine on Ubuntu

以下の通りに進めます。
https://docs.docker.com/engine/install/ubuntu/

詳細は上記URLの公式ドキュメントを参照してください。
実行したコマンドだけ書きます。

```
% sudo apt-get update
% sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
```

```
% curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```

```
% echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

```
% sudo apt-get update
% sudo apt-get install docker-ce docker-ce-cli containerd.io
```

```
% docker -v
Docker version 20.10.12, build e91ed57
```

### permission denied

```
$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json": dial unix /var/run/docker.sock: connect: permission denied
```

```
% sudo usermod -aG docker ${USER}
```

上記コマンドを実行した後、一度exitしてからログインしなおせばエラーが出なくなる。
が、他にもいろいろ情報が載っているので、こちらの資料もご確認ください: https://docs.docker.com/engine/install/linux-postinstall/

# Installing Compose V2

**追記：　上述の通り docker をインストールするとComposeもコミコミなので、以下の手順を実行しなくても `docker compose` が使えるはず！**

この方法: https://docs.docker.com/compose/install/
より
こっちの方法: https://docs.docker.com/compose/cli-command/
がナウいらしいので2022年冬はこちらの方法でインストールします。

詳細は上記URLの公式ドキュメントを参照してください。
実行したコマンドだけ書きます。

```
% mkdir -p ~/.docker/cli-plugins/
% curl -SL https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
```

v2.2.3をインストールする例です。リリースページを確認して最新をインストールすると良いと思います。

```
% chmod +x ~/.docker/cli-plugins/docker-compose
```

```
% docker compose version
Docker Compose version v2.2.3
```

`docker-compose` コマンドではなくて、`docker compose` になるっぽい。

### 参考: インストール前

```
% docker compose version
docker: 'compose' is not a docker command.
See 'docker --help'
```

# まとめ

インストール手順に従いDockerをインストールできました。
Docker Composeもインストールできました。
【Storj】安心安全に使える150GB無料のクラウドストレージがあるんですか！？


# 要約

* 分散型ストレージ「**Storj**」が、150GB無料で使用できるらしい
* とりあえず使ってみた
* ブロックチェーン / 分散技術については素人なので、誤りがあればコメントください

# はじめに
「WEB3.0の時代になると使用されるアプリが変化する」という記事を見かけました。
中でも、DropboxやGoogleドライブといった中央集権型クラウドストレージは「**Storj**」「**IPFS**」等の分散型ストレージに代替されていくようです。

![スクリーンショット 2022-01-18 7.43.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423992/405deacd-0d99-67c2-cf53-842e14e3467f.png)
出典：[Why the Web 3.0 Matters and you should know about it](https://medium.com/@essentia1/why-the-web-3-0-matters-and-you-should-know-about-it-a5851d63c949)

[Storjのサイト](https://www.storj.io/)を覗いてみたところ、（2022年1月現在）なんと150GBが無料で使用できるようです。
![スクリーンショット 2022-01-18 7.41.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423992/0f932ef0-3b31-bdfa-0181-6e0bf5b52095.png)
これは使わない手はありませんね…！！

# 使ってみた
取り急ぎサインアップ、サンプルバケットの作成をしました。
（demo-bucketはデフォルトでありました）
![スクリーンショット 2022-01-18 8.35.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423992/069eeea1-74be-0c2b-1750-d19d5983f65f.png)

バケットを選択すると、パスフレーズの入力を求められました。
このパスフレーズを使用して暗号化されるようです。
![スクリーンショット 2022-01-18 8.39.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423992/22059545-dd56-2d8d-ad43-95ac7160ef41.png)

無事バケットにアクセスでき、画像ファイルのアップロードができました。
![スクリーンショット 2022-01-18 8.42.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423992/018b42de-a2cd-c3f6-9a64-8159c6e52bc9.png)

少し小さいですがプレビューも見れます。
また、分散されたデータが世界中のどこに保存されているか、も分かるようです。
![スクリーンショット 2022-01-18 8.44.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423992/57b13603-ed5c-c875-f28b-1f30fcee8920.png)

プレビュー機能が無いものの、スマホアプリからもアクセスできました。
![Storj_Android.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423992/3e62e45b-f759-3044-ec82-ff64de25123f.png)

# 仕組み

[Storj > How it works.](https://www.storj.io/how-it-works)より抜粋

> - STEP1. Objects are encrypted.
> - STEP2. Encrypted objects are split into smaller pieces.
> - STEP3. Object pieces are globally distributed.
> - STEP4. Objects are retrieved when you need them.

今流行の(?)DeepLで翻訳したものは以下です。

> - STEP1.オブジェクトを暗号化します。
> - STEP2.暗号化されたオブジェクトは、より小さな断片に分割されます。
> - STEP3.オブジェクトの断片はグローバルに分散されます。
> - STEP4.必要な時に必要なオブジェクトを取り出すことができます。

# 感想 / 最後に
* エンドユーザが直接動画や画像を保管するというよりも、開発者がAWS S3等のオブジェクトストレージ代わりに使用する用途が強いのでしょうか。
* 利用者が増える → ストレージを貸し出して利益を得る人が増える → 便利になって利用者が増える → ・・・という循環になると嬉しいなと思い、この記事を書きました。目指せ脱GAFAM？
* ブロックチェーン / 分散技術については素人であるため、誤り等あればコメント頂けると幸いです。
[Paloalto]Content Updates の頻度

Timings for updates（更新タイミング）

▪ Regular content updates happens on Tuesdays. 
(毎週火曜日に定期的なコンテンツアップデート)

▪ New apps are introduced once per month on the third Tuesday.
（新しいApp-IDのリリースは毎月第三火曜日）

▪ Low risk threat releases will now occur on average twice weekly.
（リスクの低い脅威は平均週二回リリース）

▪ Emergency updates happen as needed.
（緊急性の高いUpdateは必要に応じて提供される）

Palo Alto Networks recommends that you follow the Best Practice below:
https://docs.paloaltonetworks.com/pan-os/9-1/pan-os-admin/software-and-content-updates/best-practices-for-app-and-threat-content-updates.html
EDoS攻撃 ってのもあるらしい

## 勉強前イメージ

DDoSとは聞くけど、E？

## 調査

### EDoS攻撃 とは

Economic Denial of Sustainability の略で、
DoS攻撃の一種になります。
内容としては経済的(Economic)な損失を与えることを目的とする攻撃になります。
クラウドサービスでは従量課金が多く、利用料に応じた金額を利用者は支払いします。
それを利用して、外部から不正なリクエストを大量に送りつけトラフィックを増加させることで
多額の利用料を支払わせるように仕向ける方法になります。

### 対策

EDoS攻撃の対策としては以下が考えられます。

- 契約で課金の上限を設定する

課金の上限をサービス側で設定し、使えないようにする方法です。
しかし、上限に達すると他の利用者も使えなくなるので
上限を設定する場合はそれもセットで対策を考えないといけないです。

- EDoS攻撃の際の費用について確認する

サービス内容によっては、EDoS/DDoS攻撃での課金に関しては費用が発生しない等もあります。
クラウドサービスとの契約を確認してください。

- できるだけ従量課金のサービスを使用しない

上記とも通ずるのですが、選択肢がいくつかある際は従量課金のサービスを利用しないと
EDoS攻撃も防げます。

## 勉強後イメージ

そういう攻撃方法もあるのね・・・
でもある程度の費用にするには負荷かける側も相当の費用・機器が発生するので
大変そう。。。

## 参考

- [EDos (Economic Denial of service/Sustainability)](https://securitychecklist.net/security/cyber-attack/EDos.html)
- [EDoS攻撃（読み）イードスコウゲキ](https://kotobank.jp/word/EDoS%E6%94%BB%E6%92%83-465734)
nvm-windows を使って node のバージョンを変えてみた


node のバージョンを切り替える必要があったので簡単に切り替えれる方法を残します。

nodist と迷ったが、更新されてないので nvm-windows を今回採用しました。

## nvm-windows の導入

最新のバージョンをインストールする

- [nvm-windows v1.1.9](https://github.com/coreybutler/nvm-windows/releases)

👆から nvm-setup.zip をダウンロードして解凍する。

（試してないですが、すでにインストール済みである場合は nvm-update.zip で更新できるのかな？）

インストーラ起動して手順に沿って行けば問題なく install できると思います。

コマンドプロンプト or PowerShell などで👇コマンドでバージョンやヘルプを確認できます。(**管理者で開かないとバージョン変えられなかったはず**)

```PowerShell
nvm
```

## インストール済み node の確認

```PowerShell
nvm list
```

## 別バージョンをインストールする

- 別のバージョンをインストールする

```PowerShell
nvm install 12
```

メジャー番号だけ指定すればそのバージョンの最新をインストールしてくれます。
バージョン指定する場合👇

```PowerShell
nvm install 12.xx.xx
```

- 別バージョンのインストールができたのを確認する

```PowerShell
nvm list
```

インストールしたことで1つ増えてると思われます。

## 別バージョンへ切り替える

現在のバージョンを確認

```PowerShell
node -v
```

バージョンを指定して切り替える

```PowerShell
nvm use 12.22.9
```

もう一度 node -v で切り替わったかどうかを確認しましょう。

おわり
foliumを使ってコロプレスマップを作成する

## はじめに
僕は地図を描画することが結構好きで、今まで愛知県のデータを使ってコロプレスマップを作ったりしていました。今回はPythonで`leaflet.js`が使うことができる`folium`というライブラリを使って、コロプレスマップを作成してみたいと思います。

## foliumを使ってコロプレスマップを作成する
### `folium`とは

`leaflet.js`はインタラクティブなマップを扱えるJavaScriptのライブラリで、それをPythonでも扱えるようにしたのが`folium`です。Pythonで扱えるため、簡単にインタラクティブなマップを扱えるようになります。

https://python-visualization.github.io/folium

### 実際に描画してみる
今回は都道府県ごとに区切ったコロプレスマップを作成してみたいと思います。都道府県の県境のデータは、以下のリポジトリに上がっている`japan.geojson`を使用させていただきました。

https://github.com/dataofjapan/land

スクリプトは以下です。
都道府県のデータを読み込むには、`GeoPandas`というライブラリを使っています。

```python
# モジュールの読み込み
import folium
import geopandas as gpd

# 都道府県データの読み込み
geojson_path = "https://raw.githubusercontent.com/dataofjapan/land/master/japan.geojson"
geojson = gpd.read_file(geojson_path)

# 元となる地図の作成
map = folium.Map(
    location=[36.288055, 138.097424],　　# 日本が地図の中心になるように設定、位置は長野県上田市
    tiles='cartodbpositron',
    zoom_start=4)

# 都道府県のデータを描画
folium.Choropleth(
    geo_data=geojson,
    name='choropleth'
).add_to(map)

map
```

描画された地図は、このような感じです。
![スクリーンショット 2022-01-18 8.50.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/efd0cc4c-5139-0c28-786a-11c8a0e4ee4a.png)

このうえに都道府県ごとに何かしらのデータを使うと、色分けして描画することが可能です。

## さいごに
今回はPythonで`leaflet.js`が使うことができる`folium`というライブラリを使って、コロプレスマップを作成してみました。今後は都道府県の何かしらのデータを使って、何かしらのコロプレスマップを作成してみようと思います。
チーム内のコミュニケーションロスを解消するために導入した3つのコト

# ■ 事のあらまし

私たちのチームは2020年4月あたりからリモートワークに移行しました。
最初は3人だったチームが、今では倍以上に。

対面での会話が減ったからでしょうか
メンバーが増えたからでしょうか

どんどんコミュニケーションロスが起こるように…

* ex)
    * 報連相が不足し、タスクの進捗が不透明になった
    * 作業内容の認識齟齬が目立つようになり、手戻りが発生するようになった

少人数だったからこそ会話でカバーできていたチームにボロが出てきましたね…。

こりゃいかんということで、これらを解消するために3つの施策を導入しました。

# ■ 3つの施策
## 1. マンダラチャートで意識調査

改めてメンバーのことを知ろう！ということで意識調査を行いました。

マンダラチャートとは目標設定・達成のためのツールで、プロ野球選手・大谷翔平さんも取り入れていたことで有名になった印象ですね。

目標(=テーマ)を中央に記載し、それを達成するために必要な要素を周りに書き出して深堀りしていく、というものです。

私たちは「良いチーム」を構成する要素は何か？というテーマを設定し、レクリエーションとして取り組んでもらいました。

目標設定ではなく、それぞれのメンバーの意識調査を目的とした利用になります。

こんなテンプレートを用意してチームメンバーに埋めてもらいました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302049/0ccc010c-5e56-4fdf-0c11-69732b0f5826.png" width="600px">

出来上がったものを見せてもらって、それぞれのメンバーのスタンスを知れたことが大収穫でした。

「同じオフィスで、近くの席に座って働く」という過程をすっ飛ばして集まったメンバーだったので、人となりが分からなかった部分も多かったんだな…と再認識。

チーム編成に活かすため、各メンバーを2つのタイプに分類しました。

* タスクは誰かに振ってもらって、コツコツ進めたい  
→ 職人肌タイプ
* チーム全体の雰囲気を見て立ち回る  
→ バランサータイプ

これらを念頭に置きつつチーム編成を考えていきます。

## 2. 組織行動論を参考にしたチーム編成

報連相漏れが目立つようになったため、指示系統の見直しを行いました。

人間の行動に影響を与える要素として「個人」「集団」「組織」という分類がある…という考え方が組織行動論です。

この3つの分類をチーミングに活かせないかな？というところからスタートした施策でした。

これらの分類のうち、どこまでを意識して行動できているか？という観点が重要そう。

前述のマンダラチャートで分かったメンバーのスタンスと合わせると…

|  意識できている分類  |  スタンス  |  できること  |  期待する役割
| ---- | ---- | ---- | ---- |
|  個人  |  職人タイプ  |  自分にアサインされたタスクをこなす  |  実際にタスクを遂行してもらう作業者  |
|  集団  |  バランサータイプ  |  自分のタスクに加えて、<br>チームメンバーの動向についても意識できる  |  メンバーにタスクを割り振るチームリーダー  |
|  組織  |    |  チーム全体の意思決定、顧客折衝  |  全体の舵を取るプロジェクトリーダー  |

こんな感じでしょうか。

これを踏まえて、下図のような指示系統になるよう再編成を行いました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302049/06af949c-7b75-4390-58fb-62c843a776bf.png" width="1200px">

また、メンバー間の相性もあるだろうと考え、しばらくは色々な組み合わせでタスクを遂行してもらい、なるべくコミュニケーションに摩擦が生じない組み合わせになるよう調整も行いました。

再編成以前と比べて報告の抜け漏れが少なくなり、しっかり状況把握できるようになりました。

## 3. 作業見積もりで認識齟齬を防止

指示者と作業者の間で認識齟齬が生じるようになったため、作業フローを見直しました。

作業者は手を動かす前に作業内容について調査を行い、指示者との間に認識齟齬がないことを確認した上で作業を開始するフローとしました。

私たちのチームではソース管理にGitLabを利用しているため、「issueテンプレート」機能を使いました。

テンプレートの内容は以下の通りです

|  項目  |  記入者  |  記入内容  |  目的  |
|  ---  |  ---  |  ---  |  ---  |
|  概要  | PL or TL  | 作業内容の概要を記載する  |    |
|  再現手順  |  作業者  |  実際に再現できるか確認し、その手順を記載する  |  事象が再現することを"作業前に"確認してもらいたい  |
|  本来期待される挙動  |  作業者  |  修正後はどのような状態になる想定かを記載する  |  issueが発生した経緯について理解してもらいたい  |
|  修正しないとどう困るか  |  作業者  |  そのバグによってどのような影響が出ているかを記載する  |  issueが発生した経緯について理解してもらいたい  |
|  原因  |  作業者  |  そのバグが発生した原因となったファイルを記載する  |  見切り発車せず、原因を特定した上で作業してもらいたい  |
|  修正案  |  作業者  |  原因となったファイルの修正案を記載する  |  見切り発車せず、修正の方針を相談した上で作業してもらいたい  |

作業者はこれらを埋めた状態でチームリーダーからのレビューを受け、認識齟齬がないことを確認した上で作業を開始してもらうことをルールとしました。

ちょっと堅苦しいルールにしたので作業者目線だと面倒だったかもしれません…。

が、このテンプレートの運用開始以降、作業内容の認識齟齬は少なくなり、ほとんど手戻りしなくなったので効果大でした。

# ■ まとめ

報連相漏れ、認識齟齬といったコミュニケーションロスが目立ち始めたため、3つの施策を導入しました。

導入以降は改善され、効果を実感できました。

皆様のチーミングの参考になれば幸いです。
`deno test` で付けたほうがよさそうなオプション

denoには組み込みのテストランナーが備わっています。テストランナーは`deno test`コマンドで利用できますが、いくつかのオプションを指定することができます。その中から便利そうなものをピックアップして紹介します。

## `deno test`で付けたほうがよさそうなオプション

### `deno test --parallel`

`--parallel`オプションを指定すると、複数のCPUを使ってテストを並列実行します。

```shell
> deno test --parallel   # CPUの個数分並列実行する
> deno test          # --parallelオプションが指定されていない場合は並列実行しない
```

デフォルトでは、CPUの個数分だけ並列に実行されます。この数は環境変数`DENO_JOBS`に数値を指定することで変更できます。

`--parallel`オプションを指定しない場合、並列実行されないので注意しましょう。
筆者の場合は、`--parallel`オプションを指定することで、1分半かかっていたCIを45秒に短縮することができました。

かつては`--jobs`というフラグ名でしたが、v1.24からフラグ名が`--parallel`に変更されました。

### `deno test --shuffle=<NUMBER>`

`--shuffle`オプションを指定すると、テストの実行順をシャッフルできます。
実行順序に依存しているテストを見つけ出し、バグの発見に繋がります。

オプションの引数は0以上1以下の整数で、シャッフルに使うランラムシードを指定できるようです。

```shell
> deno test --shuffle # テストの実行順序がシャッフルされる
> deno test           # デフォルトではシャッフルされない
```

## `deno test`の便利なオプション

付けるべき、までは行かないものの、あると便利なオプションを紹介します。

### `deno test --watch`

ソースコードの変更を監視して、変更があった場合にテストを再実行します。
このオプションの便利な所は、**変更があったファイルに依存するテストのみ再実行してくれる**ところです。

```shell
> deno test --watch # ソースコードの変更を監視
```

### `deno test --doc`

JSDocのコードブロックを型チェックします。
将来的にはテストが実行されるようになるそうですが、今のところ型チェックだけです。

```ts
/**
 * # ↓この部分の型チェックが実行される
 * ```ts
 * import { add } from "./code.ts";
 * add(2, 3)
 * ```
 */
export function foo(a: number, b: number): number {
  return a + b;
}
```

```shell
> deno test --doc
```

### `deno test --import-map <FILE>`

import mapを使うと、import文を書き換えて依存関係にモンキーパッチを当てることが可能です。

```json:import_map.json
{
  "imports": {
    "https://example.com/": "./example_com/"
  }
}
```

```ts
// 実行時にimport mapを指定すると、example_com/foo からimportしているかのように振る舞う
import {} from "https://example.com/foo";
```

```shell
deno test --import-map import_map.json
```

テストに限らず、`deno run`で実行する時にもimport mapを使用できます。

### `deno test --fail-fast=<N>`

このオプションを指定すると、テストが1つでも失敗した場合は、他のテストを実行することなく即座に終了します。

### `deno test --inspect`

Chromeなどの開発者ツール（デバッガ）に接続することができます。
`deno run`コマンドや`deno repl`コマンドでも使用できます。

### `deno test --no-run`

`--no-run`オプションを指定すると、テストを実行せずに型チェックだけを行います。
`deno cache`コマンドでも同じ効果があります。

### `deno test --no-check=<NO_CHECK_TYPE>`

TypeScriptファイルの型チェックを行わないオプションです。
`--no-check=remote`を指定すると、リモート依存関係の型チェックを行わずにローカルファイルのみ型チェックします。

```shell
> deno test --no-check        # 型チェックしない
> deno test --no-check=remote # ローカルファイルのみ型チェック
```

`--no-check=remote`は、外部ライブラリだけから型エラーが出ている時などに重宝しそうです。

### `deno test --filter <filter>`

実行するテスト名をフィルタリングします。
指定したテスト名に一致したテストだけ実行されます。

### `deno test --coverage=<DIR>`

`deno coverage`コマンドと合わせて、カバレッジを出力することができます。

## まとめ

`deno test`コマンドに指定できるオプションについて紹介しました。せっかく高機能なテストランナーが組み込まれているので、活用していきたいところです。
この記事で紹介した情報は、`deno test --help`コマンドから参照することができます。
競プロ初心者がPythonでAtCoderを始めるのに役立った記事まとめ

#はじめに
競技プログラミングに関して知識ゼロの状態から勉強をしていて、実際に参考にしているものや見返す頻度の高いものをまとめました。これからPythonで競技プログラミングを始める方におすすめの記事のまとめになっています。

#入茶を目指して
https://qiita.com/drken/items/fd4e5e3630d0f5859067

https://qiita.com/e869120/items/f1c6f98364d1443148b3

https://qiita.com/uniTM/items/a4ad3f0bb67e12380e75

https://qiita.com/shirumono/items/0d6a3abb747d6b144cca

https://qiita.com/ryusuke920/items/4a3bf6cd07d4df39c06e

https://kenkoooo.com/atcoder/#/table/

https://atcoder-tags.herokuapp.com/

#Pythonの基本的なこと

https://qiita.com/KoyanagiHitoshi/items/3286fbc65d56dd67737c

https://qiita.com/AI_Academy/items/b97b2178b4d10abe0adb

https://qiita.com/KoyanagiHitoshi/items/32dc42d8c5ee75339e54

https://qiita.com/jamjamjam/items/e066b8c7bc85487c0785

https://qiita.com/ell/items/6eb48e934a147898d823

https://qiita.com/Hironsan/items/68161ee16b1c9d7b25fb

#おわりに
これからPythonで競技プログラミングを始める方の参考になれば幸いです。
EKSのセキュリティグループについて理解する

※ 2022年8月更新：ドキュメントが大幅に変わっていたため本記事も大きく書き換えました。

# 背景
EKSクラスターやワーカーノードに用いるセキュリティグループ（以下SG）には何種類かありますが、それぞれの役割について一部よくわからない部分がありました。
今回、AWSサポートへの問い合わせや動作検証によりきちんと調べてみたので、まとめていきたいと思います。

# EKS関連SGの種類
EKS関連のSGは下記3種類がある。
1. **クラスターSG**
2. **コントロールプレーンSG**
3. **ノードSG**

ノードSGがワーカーノードEC2に付与するSGっていうのは、なんとなく分かる。けど、1.と2.の違いがよく分からん。。という状態でした。
さらに検証進めていく中で、ノードSGも少し特殊な動作することがわかりました。

# それぞれ詳しく
### 1. クラスターSG
- 下記3者に付与されるSG
    - **EKSコントロールプレーン通信用ENI（EKS-managed ENI）**
    - EKSonFargateの場合：**Fargateノード**
    - EKSonEC2の場合：**マネージドノードグループ内のEC2ノード**
    ※ただし後述の``ノードSG``がEC2ノードに付与されている場合、クラスターSGは付与されない。
- **EKSクラスターを作成した時にEKS側で自動作成される。**（デフォルトでは自身SGからの通信を全て許可するルール）
- そのためCFnでルールをカスタマイズしてデプロイ等できない。カスタマイズするならクラスター作成後に手動変更が必要。


### 2. コントロールプレーンSG
- **EKSコントロールプレーン通信用ENI（EKS-managed ENI）** に付与されるSG。
- ただしマネージド型ノードグループEC2ノード、Fargateノードには付与されない。
- **このSGは作成は必須ではなく、``クラスターSG``とは別に追加ルールをコントロープレーンENIに設けたい時に作成する**。
- マネジメントコンソールのEKSクラスター設定で「追加のセキュリティグループ」と表示される。
- CFnでは、"ResourcesVpcConfig"の"SecurityGroupIds"で指定したSGが``コントロールプレーンSG``となる。（[ドキュメント](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-eks-cluster-resourcesvpcconfig.html)）


### 3. ノードSG
- EKSonEC2限定で使えるSG
- マネージドノードグループ内のEC2ノードに付与するSG。
- コントロールプレーンや、ノードEC2と通信するリソース（他ノード、ALBなど）からのアクセスを許可するために使用可能。
- 作成は必須ではなく、``ノードSG``の指定がなければ``クラスターSG``がマネージドノードグループに自動適用される。


# 図解
文章だけだとどうしても分かりづらいため、図にしてみました。
### EKS on EC2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577028/3fa4f78c-0e44-13ac-1345-d6f72e8ca037.png)

- ノードSGを指定した場合、ノード-コントロールプレーン間の通信はノードSGのルールによる
- ノードSGを指定しない場合、デフォルトではノード-コントロールプレーン間は自由に通信行き来できる（クラスターSGのデフォルトルールが自身SGからのインバウンド全開のため）

### EKS on Fargate
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577028/ac0ceda1-76ea-dbbf-a444-36c27e8c9311.png)

- デフォルトでは、ノード-コントロールプレーン間は自由に通信行き来できる（クラスターSGのデフォルトルールが自身SGからのインバウンド全開のため）
- ノード-コントロールプレーン間の通信に制限を設けたい場合は最低限のポート（[ドキュメント](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/sec-group-reqs.html)に記載あり）を開けつつ、あとはアプリケーションワークロードに応じて適宜開放する。



# 最後に
ドキュメントに明記されておらずAWSサポートからの回答で判明したこともいくつかありました。分からなかったら積極的に問い合わせるのが吉ですね。


# 参考
[1. ドキュメント「Amazon EKS セキュリティグループの考慮事項」](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/sec-group-reqs.html)
[2. EKS CFnテンプレート「AWS::EKS::Cluster」](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-eks-cluster.html)
【Win10】カレンダーを表示するショートカットキー【Win11】

##概要
リモートワークの普及により、オフィスから自分の座席がなくなって久しい。

直近の日付を確認したいとき、今までは紙の卓上カレンダーを見ていたが、
座席がなくなったことで卓上カレンダーが置けなくなった。

Windows右下の日付表示をクリックしてカレンダーを呼び出すようになったが、
マウスを右下まで移動させるのが面倒だったので、ショートカットキーを調べてみた。

##Windows10：`Win`＋`Alt`＋`D`
…おわかりいただけただろうか。
ものすごく押しづらい。

##Windows11：`Win`＋`N`
だいぶ簡単になった。
`Win`＋`B`が画面右下の通知領域にジャンプするショートカットキーなので、
その右隣にあるカレンダーは、`B`の右隣の`N`だと覚えるとよい。

##以下余談。スタイリッシュ`Win`＋`Alt`＋`D`コンテスト
色々なパターンが考えられるので、スタイリッシュに紹介。
各自が指に負担がかからないと感じたスタイルを採用ください。

###薬指＋親指＋中指
自分にとって一番自然なスタイル。
暇を持て余した人差し指が起立する姿がヒロイックだ。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/8cfaa294-8d80-2181-61f8-bfdbcd6a9a05.jpeg" width="400">
---

###薬指＋親指＋人差し指
手のひら全体がやや内側を向くスタイル。
中指を突き立てている感じがロックである。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/c338aeff-1341-51f3-9d5a-9137c598f6e7.jpeg" width="400">
---

###小指＋親指＋中指
一般的なホームポジションからの移行がスムーズなスタイル。
使う指と使わない指が交互に現れ、シンメトリーな美しさが魅力。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/eadacab3-1043-62ba-3ed0-0cf3f052d81c.jpeg" width="400">
---

###親指＋親指＋人差し指
親指で`Win`と`Alt`を同時押しするスタイル。
人間にとって発達度の高い親指と人差し指のみを使った、ミニマルな押し方である。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/cb3d845c-c5ca-8a57-fded-a4cbc192c8c8.jpeg" width="400">
---

###親指＋親指＋中指
親指での同時押しとホームポジション移行を両立するスタイル。
人差し指で`D`を押すよりもパワフルに、親指を横から叩きつけるような形になる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464218/7c58c66c-c3d0-1864-35b4-16fa3236bb37.jpeg" width="400">

##まとめ
・Win10からWin11で、変更されたショートカットキーがある。
・キー同時押しにもこだわってみると奥深い。写真まで撮って何してんだ。
SENet(Squeeze-and-Excitation Networks)の重要性がうまく理解できない。

# SENet(Squeeze-and-Excitation Networks)の重要性がうまく理解できない。

Google scholarをみると、**1万以上の引用**がされている。　↓↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342207/5b69d273-ce77-9feb-45b4-4cc571052bfa.png)

時々、SENetについてattentionの観点で書かれているものも見かけるが、  

* attentionの観点で学習がされる気もあまりしない。
* channelの選択に関して、attentionと言われても、少し、違和感がある。画像でattentionというと、狭義には、画面内の特定の領域に注目することでは？

さて。。。。

# 参考記事

## 【1】SENet論文読み
 https://qiita.com/Q_ys/items/2054a8a724d22bd10aff

* attentionについては書かれていない

## 【2】SENetで「self-attention」までつなげるのは、さすがに（筆者の）話の盛り過ぎか。
https://ai-de-seikei.hatenablog.com/entry/2022/01/16/173639

* attentionとの関係に、むしろ、否定的


# 重要性を少し考えてみると。。。

* CNNの構成は比較的硬直的というか、似たり寄ったりになると思うが、その中では、このネットワーク構成は他と違いがあるという意味で重要なのかも。。。

# 関連記事（本人）
以下の記事の『わかりやすいと思った記事（その１９）　Self-Attention Generative Adversarial Networks』と比較すると、attentionとしては、Self-Attention Generative Adversarial Networksぐらいの内容に行かないと。。。。と思う。↓↓
https://qiita.com/enoughspacefor/items/c9810d1065741a7f461c

# コメント
代表的なモデルの系譜図みたいなの、どこかにあるのだろうか？
2022/1/18主にITとかセキュリティの記事

旧サーバが改ざん、偽通販サイトを設置される - 江東区健康スポーツ公社
https://www.security-next.com/133274

「Switch」が大幅割引とだます任天堂の偽サイトに注意
https://www.security-next.com/133304

ウクライナ政府サイトに大規模サイバー攻撃(1/14)
https://www.afpbb.com/articles/-/3385157?act=all

中国の拘束記者数は3年連続で世界最多(1/15)
https://www.epochtimes.jp/2022/01/84766.html

仮想通貨犯罪の全体的な影響は22年にさらに低下へ：チャイナリシスが予測(1/16)
https://jp.cointelegraph.com/news/crypto-crime-s-overall-impact-set-to-fall-even-further-in-2022-chainalysis

キングジムのパスワードマネージャー「ミルパス」に脆弱性、すぐに利用停止を(1/15)
https://news.mynavi.jp/techplus/article/20220115-2249049/

海外で働くのにも役立つ？ 資格「情報処理技術者」のメリット3つ(1/16)
https://news.careerconnection.jp/career/129903/

さよならAndroid？サムスンが将来的にAndroidから「フクシア」OSに乗り換えるとの噂(1/15)
https://smhn.info/202201-samsung-may-change-os-from-android-to-fuchsia

情報通信政策に関する記事のまとめ(2022.1.10～2022.1.16)
https://blogs.itmedia.co.jp/business20/2022/01/20221102022116.html?ref=rss

情報抜き取りを懸念か、欧米五輪委「出場選手はスマホ持ち込まないで」(1/14)
https://news.yahoo.co.jp/articles/2261d8c00f14f9a85164717c27ff3101065068a2

野村・東芝・NECなど、大容量金融取引データの量子暗号による高秘匿通信・低遅延伝送の検証実験に成功(1/14)
https://www.nikkei.com/article/DGXLRSP625406_U2A110C2000000/

AWS認定試験の申し込みは何日前から？日程変更や流れも解説(1/16)
https://and-engineer.com/articles/YaOoxhIAAB4AjhJS

IoB（Internet of Behavior／Bodies）(1/17)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600009/011100105/

役所・銀行・薬局　マイナカード利用に挑む(1/17)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600014/011100107/

相次ぐ二重決済や勝手な口座引き落とし　スマホ決済の市場拡大にブレーキ(1/17)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/092400133/011200067/

1日当たりのスマホの利用時間　「2～3時間」が最多の19.7％(1/17)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600010/010700105/
【React】404ページを表示させる方法

## はじめに
　本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
　そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
　間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

##404ページを表示させる方法

### 1.404ページを作成する

```page404.jsx
import React from 'react'
import { Link } from "react-router-dom"

export const Page404 = () => {
  return (
    <>
      <h1>404 NOT FOUND</h1>
      <p>お探しのページが見つかりませんでした。</p>
      <Link to="/">Topに戻る</Link>
    </>
  )
}
```

### 2.ルーターの設定をする

```Route.jsx
import React from 'react'
import { BrowserRouter, Routes, Route } from 'react-router-dom'
import { Page404 } from '../components/Page404'
import { SignIn } from "../components/SignIn"
import { SignUp } from "../components/SignUp"


export const Router = () => {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="sign_in" element={<SignIn />} />
        <Route path="sign_up" element={<SignUp />} />
        <Route path="*" element={<Page404 />} />
      </Routes>
    </BrowserRouter>
  )
}
```

注. react-router-domv6で記述しています。
Heroku CLIをBeta版にアップグレードできなかった問題

herokuにアプリ作成時にハマったので備忘録もかねてメモ

OS：Ubuntu20.04


#### Heroku CLI を ubuntuにインストール
```
$ wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
$ heroku -v
heroku/7.59.2 linux-x64 node-v12.21.0
```

#### plugin-manifestインストール
```
$ heroku plugins:install @heroku-cli/plugin-manifest
$ heroku plugins
manifest 0.0.5
```

#### Heroku アプリ作成

```
heroku create <アプリ名> --manifest
```

アプリは作成されるが、heroku.ymlに記載されているaddonsとconfigで記載した[環境変数]が反映されない。。

調査したところ、HerokuがBeta版にアップグレードされていなければ、Plugin manifestも実行されない模様。


#### Heroku CLIをBeta版にアップグレード
```
$ heroku update beta
 ›   Warning: update with "sudo apt update && sudo apt install heroku"
Updating completions... ⣻ [4/4] Building fresh packages...
Updating completions... done
$ heroku -v
heroku/7.59.2 linux-x64 node-v12.21.0
```

アップグレードできない。。


色々調べた結果、一度削除して再インストールするのが良いらしいので削除

#### Heroku CLI削除
```
which heroku
sudo rm -v <which herokuで表示されたパス>
cd /usr/ && find -type d -name 'heroku'
sudo rm -rfv /usr/lib/heroku
cd (ホームディレクトリへ移動)
find  -type d -name 'heroku'
rm -rfv ~/.local/share/heroku ~/.cache/heroku
```

参考サイト

https://qiita.com/akitkat/items/5f94a9c9bdaa3fbc4af5


#### Heroku再インストール
```
$ curl https://cli-assets.heroku.com/install.sh | sh
$ sudo heroku -v
heroku/7.59.2 linux-x64 node-v12.21.0
```

#### Beta版にアップアップグレード
```
$ sudo heroku update beta
heroku: Updating CLI from 7.59.2 to 7.59.2-beta.67d33d6 (beta)... done
Updating completions... ⡿ [4/4] Building fresh packages...
Updating completions... ⣻ [4/4] Building fresh packages...
$ sudo heroku -v
heroku/7.59.2-beta.67d33d6 linux-x64 node-v12.21.0
```

ようやくアップグレードできた。
原因はよくわからないが、Heroku CLIのインストールは

```
https://cli-assets.heroku.com/install-ubuntu.sh
```

ではなく

```
https://cli-assets.heroku.com/install.sh 
```

でやらないとBeta版にアップグレードできないのかもしれない。
バッチファイルでPDFをAcrobat Reader DCで印刷させるときのプリンター名はExcelのActivePrinterと異なっている

#前提
Windows
Acrobat Reader DC 32 bit
プリンターはサーバー上にあるネットワークプリンター

#コマンドライン
この場合、印刷のコマンドラインは、

```bat
"%programfiles(x86)%\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" /h /t "\\Server\name\folder\hoge.PDF" "XXXX Printer"
```

という形になる。もちろん、オプションはこれ以外もある。


[Adobe Reader 8.1の起動オプション(その２)2007年7月 1日 (日)](http://scripting.cocolog-nifty.com/blog/2007/07/adobe_reader_81_e41e.html)

|オプション|意味|備考|
|:---|:------------|:------------|
|/n |New Instance |	新規プロセス|
|/s |Suppress Splash Window |	起動ウィンドウ抑止|
|/o |? 	|不明|
|/h |Hide Window |	最小化ウィンドウ(印刷設定画面非表示)|
|/t |PrintTo 	|指定プリンタへ印刷　(6.0:プリンタ必須；7.0:プリンタ省略可)|
|/p |Print |	デフォルトプリンタへ印刷 |
|/l |Cool 	|非表示 7.0で追加|
|/u |Url Protocol 	|不明 acrobat:で使われる？ 7.0で追加|
|/a引数 |Arguments 	|オープンパラメタ(page=nなど) 7.0で追加|
|/eo |? |不明 CreateObjectで/o /eo /lが使われる。 7.0で追加|
|/b|Browser ? |IE表示で/o /eo /l /b /w hwmdが使われる。8.1で追加|
|/w hwnd 	|Window handle| 	IEのhwndを10進数で指定|

>使用例、コマンドラインでPDFファイルを印刷する。

>```bat
START ACRORD32.EXE /p ファイル...       印刷設定画面表示
START ACRORD32.EXE /p /h ファイル...   印刷設定画面非表示
START ACRORD32.EXE /n /t "ファイル"  印刷設定画面非表示 (7.0～)
START ACRORD32.EXE /n /t "ファイル" "プリンタ名" 印刷設定画面非表示
```

>いずれの場合も印刷後、アプリが残るので、別途終了(CTRL+Q)が必要です。

>/n /tは、印刷後にほかになければ開いたまま残ります。
>8.0以前では、/nがなくても、新規に起こして、印刷後にほかにあれば消えました。
>8.1では、/tオプションのデフォルト動作が/nから変更されたようです。
>/pの複数ファイル指定が、8.1では可能です。以前は駄目だったような。


となっている。
[コマンドラインでPDFファイルを印刷する。(その２) 2007/07/03](http://scripting.cocolog-nifty.com/blog/2007/07/pdf_7cfb.html)
>Adobe Reader 6.0 ～ 8.1 用

DCでは未確認だが、8.1まではVBSでもできた。


しかし現在はバージョン名や言語はフォルダ名にはない。
また、Startではなくてもexeに指定する形で動く。
現在のDCも8.1と挙動は同じだと思われる。

#使いみち
なお、この形ではAcrobat Readerが終了しないので、連続して使えるというものではない。
しかし、該当するフォルダのhoge.PDFを開いている場合、その開いているファイルの印刷指示を出すことができる。
このため、例えば、カラープリンターと白黒プリンターが別な場合、いちいち印刷設定窓を開かず、２つ指示を出すことができる。
また同じプリンターを設定を変えて登録している場合には、設定を変えて印刷することが可能と思われる。
あまり早くはないが、多数のPDFファイルを確実にファイルを印刷するような場合、右クリックで印刷するよりはいい。
右クリックは最大で10ファイル程度をまとめて印刷できるが、これより多いと、途中で印刷されないものが出てくる。

#Pritnter名の取得
##Micrsofot Office(ex.Excel)
ところで、サーバー上にあるプリンターをExcelのVBAで出すと
　\\server\testPrinterName on 9999:
とon のあとにポート番号が付く。
実際にExcelの印刷のマクロは、このポート番号をつけた状態で指定することで、プリンターが切り替わる。
ところが、Acrobat Reader DCのコマンドラインの時はこれをそのまま使うとエラーになる。
それではbat用のネットワークプリンターの名前はどうするかというと、ポート番号を削ってもいいが、一応VBSで
出力する。
[VBScript を使用してプリンタ名の一覧を取得する SQLの窓](https://winofsql.jp/lightbox/vbscript-printer-list-20190220-951.html)
PrinterListを出すVBSを使うと、
testPrinterName (server 上)
という表示になる。
こちらで指定すると印刷ができる。
On 以下は必要な時と不要な時があるということになる。
【AWS】RDS でダウンタイムが発生する作業

## 前置き

今回調査した内容は、RDSの作業の中でDBのダウンタイムが発生するものをまとめたものになります。
調査対象は、RDS for MySQLとしています。

## ダウンタイムの発生する作業一覧

ダウンタイムが発生する作業として以下のものが挙げられます。
スケールアップのためのインスタンスの変更やメンテナンスウィンドウに通知されるアップグレード作業はダウンタイムとなる場合があります。

- DBエンジンバージョンのアップグレード
- インスタンスの昇格
- インスタンスの変更
- OSのアップグレード 

## マルチAZ配置

上記のような作業を実施する場合や障害に備える必要があります。
そこで、2つ以上のAZにDBインスタンスを配置して片方のインスタンスのダウンタイムに合わせてフェイルオーバーを行う方法があります。
これをマルチAZ配置と言います。
メインとなるAZに配置されたインスタンスをプライマリインスタンス、異なるAZに配置されたインスタンスをセカンダリインスタンスと呼びます。
実際のフェイルオーバーは次のような流れで行われます。

## フェイルオーバーの流れ
一部例外を除いて、障害やインスタンスの変更などによるフェイルオーバー発生時は、ダウンタイムが最小となるように動作します。
以下の例は、インスタンスの変更を実施したときの変更作業完了までの流れです。

1.インスタンスの変更があった場合、セカンダリインスタンスから変更作業を開始します。
2.セカンダリインスタンスの変更完了後、フェイルオーバーが発生し、プライマリと入れ替わります。
3.入れ替わり後、元プライマリインスタンスの変更作業が開始されます。
4.変更作業が完了すると、インスタンスの変更作業が終了します。なお、フェイルバックは行われません。

マルチAZとすることで、変更作業のダウンタイムはフェイルオーバーが発生するごく短い時間だけとなります。

## マルチAZ構成でもダウンタイムが発生してしまうDBエンジンアップグレード
公式のドキュメントによると、DBエンジンのアップグレード作業は、プライマリインスタンスとセカンダリインスタンスに同時に実施されるため、マルチAZ配置に関わらず、ダウンタイムが発生してしまうそうです。
一応、ダウンタイムを短縮してアップグレードをする方法が掲載されていました。以下リンクを参考にしてください。

[MySQL DBアップグレード](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.MySQL.html#USER_UpgradeDBInstance.MySQL.ReducedDowntime)



## 参考
[必要な Amazon RDS メンテナンスの実行時におけるダウンタイムを最小限に抑えるにはどうすればよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-required-maintenance/)
[Amazon RDSでのMySQL](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.MySQL.html)

##後書き

今回は、RDSでダウンタイムが発生する作業を調査しました。
ダウンタイムはなるべく短縮した方が良いので、マルチAZとフェイルオーバー時の挙動を確認できたのは良かったです。
初心者の拙い文章ですので、ご指摘・訂正がありましたら遠慮なくお願い致します。
perlのワンライナーでreduceByKey

Apache SparkのreduceByKey的な処理をbashで使いたくなることがよくある
毎回書くのは嫌なので、perlのコードをメモする。入力はTAB区切りでkey-valueの順。降順でTop20を出力：

```
perl -e 'my %h; while(<>) { my ($k, $v) = split("\t"); $h{$k} += $v; }; for my $k (@{[ sort { $h{$b} <=> $h{$a} } keys %h ]}[0..19]) { print join("\t", ($k, $h{$k})),"\n" }'
```
SE転職したい駆け出しエンジニアが絶対知っておくべき昨今のIT業界事情

#はじめに
毎日のように新たなITサービスがリリースされ、
日常が徐々に変化していく昨今ですが、
それは多くのエンジニアによって支えられています。

世界的に政府や企業がIT化促進を図っていますが、
日本では将来的にIT人材が大きく不足することが懸念されており、
**市場での人材需要が高まっている**ため、
IT業界は非常に注目度の高い業界と言えるでしょう。

この記事では、**駆け出しエンジニアが最も知っておくべきことを簡単にまとめました**。

技術的な要素は含まれないので、未経験のSE転職or就職を目指す方はご一読下さい。

#日本で進むIT化
世界では、ここ十数年でIT化が急速に進みました。

世界の企業ランキングを席捲しているのは間違いなくIT企業で、
アメリカではGAFA（Google、Amazon、Facebook、Apple）が、
中国ではBATH（Baidu、Alibaba、Tencent、Huawei）などの巨大IT企業群が形成されています。

日本政府も『IT新戦略』において行政手続きの電子化やキャッシュレス化、
プログラミング教育などを推進しているほか、
経産省主導の若者向けプログラミングコンテストやエンジニア育成合宿も行われています。

現在は企業のペーパーレス化や飲食店のタブレット導入、出前サービス、QRコード決済など、
普段生活する中で変化を実感する機会も多いのではないでしょうか？

**このようなIT化の発展はますます速くなっていくと予想されますが、
日本ではエンジニアの数が足りておらず、
オフショア開発や外国人エンジニア雇用に頼っているのが現状です。**

#IT人材の現状と将来
前項で日本は現在、慢性的なIT人材不足に陥っていることについて説明しましたが、
**2030年には最大で79万人まで人材不足が拡大する**ことが予想されています。
![エンジニア不足.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511626/eeb0a424-327c-f65c-7c16-16b57f971b1a.png)
出典：『IT人材白書2020』独立行政法人情報処理推進機構社会基盤センター

**現状で特に不足している分野はセキュリティ**で、
2020年時点で約19万人が不足しています。

このような現状を背景として、
外国人（特にIT人材の余っている中国など）の雇用や外国企業への委託で対処しています。

![外国人IT従事者.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511626/ca82f3ef-16b0-4ea9-1951-45ef9c768985.png)
出典：https://www.persol-group.co.jp/service/business/article/261/

また、**AIやブロックチェーン技術を使用した分野は将来的に需要が高まる**ことが予想されています。

日々進歩するIT技術に比例するように、
エンジニアへ求める技術力も高まっているため、
高度IT人材の不足を免れることはできないしょう。

#エンジニア転職
ここまで記事を読んでいる読者の多くがエンジニアへの転職を希望している方だと思います。

前項までで、**「エンジニア不足で、エンジニア需要が高まっている」**と述べましたが、
下図を見ると実際には**IT企業の転職倍率が非常に高い**ことが分かります。
![エンジニア求人b.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2511626/8d08e3ef-edb9-e400-a378-f5c511f07adf.gif)
出典：https://doda.jp/guide/kyujin_bairitsu/data/

このグラフと市場のエンジニア需要の背景から分かることは、
**企業が求める人材の技術力に対して、転職希望者の技術力が足りていない**ということです。

教育にもコストがかかるため、
企業としても当然ながら未経験者を簡単に雇うわけにはいきません。

つまり、潜在的なIT人材はいるが、
技術力の伴ったIT人材が非常に少ないために求人倍率の高さと人材不足という矛盾が生じているわけです。

#未経験者はどうすればいい？
前項で説明したように、ITに関する知識や技術力が未熟な転職希望者が多いのが現状です。

そこで、**未経験者がエンジニア転職の活動にあたってすべきことは学習とアウトプット**です。

幸いにも現在は、**書籍だけでなくUdemyやプログラミングスクール**など、
学習する上で選択肢は多くあります。

単に独学で身につけるよりもエンジニア向けのサービスを利用したほうが効率的に学習できるはずです。

様々なサービスを利用して自分にあったやり方で学習方法を確立しましょう。

また、アウトプットも非常に重要です。

個人成果物をgithubに上げたり、
tipsをQiitaに投稿するなどで十分です。

少し慣れたらココナラを利用して実際に金銭が絡む案件に挑戦するのもいいでしょう。

現在は**転職時に成果物を確認されるケースも多々ある**ので、学習だけでなくアウトプットも積極的に行いましょう！
Python Webアプリケーションフレームワークについて簡単に紹介(学習まとめ)

#初めに(前書き)

今回は、PythonのWebアプリケーションフレームワークについて簡単に紹介していきたいと思います。



#本題(本文)

「Django」
　Pythonにおける最も人気のあるフルスタックフレームワーク。

「Flask」
　Pythonで書かれたマイクロフレームワーク。

「Masoniite」
　モダンで開発者中心のフレームワーク。

「Pyramid」
　「小さく、速く、堅実な」オープンソースのフレームワーク。

「Sanic」
　とにかく速く動くように書かれたフレームワーク。

「Vibora」
　Flaskにインスパイアされたフレームワーク。

「Tornado」
　非同期ネットワークライブラリとセットにされたフレームワーク。

※調べてみると、１番人気は「Django」で、２番人気が「Flask」といったところでしょうね。

ここからは、「Django」と「Flask」の違いについて解説・紹介しておきます。

「Django」は、2005年に開発されたもので、Webアプリケーションに必要な機能が一通り揃っているフルスタックフレームワークです。フルスタック(＝全部入り)なので、環境ファイルや設定ファイルの作成・編集などの手間がかかるというデメリットもあります。
Djangoを使った有名なWebアプリ(サーヴィス)としては、「Instagram」「Bitbucket」「Udemy」「Dropbox」「Spottify」「Youtube」などが挙げられます。

「Flask」は、2010年に開発されたもので、Webアプリケーションに最小限必要な機能のみを備えたマイクロフレームワークです。その分、自由度やカスタマイズ性は高いです。あと、「シングルファイル」という仕様・設計となっていて、たった一つの実行ファイル(＝.py)でWebアプリケーションを作れてしまいます。
Flaskを使った有名なWebアプリ(サーヴィス)としては、「Netflix」「Lyft」「Maigun」「Pinterest」などが挙げられます。
ちなみに、Flaskは、「WSGI」(＝ウィズギィー)と呼ばれる「WebアプリとWebサーヴァーをつなげて連携させる規格」に準拠しています。

※「Django」「Flask」の両者に共通するのは、どちらもBSDライセンスで提供されていることと、MTVアーキテクチャーに基づいて設計されているということの２点です。
※MTVアーキテクチャーとは、Webアプリを「Model」「Template」「View」の３者で構成するという設計思想です。

筆者個人は、「Flask」を推したいので、Flaskでのコードサンプルを掲載しておきます。

```
#Flaskをインポートする。
from flask import Flask
#このプログラムファイルを基に、Flaskのアプリケーションモジュールを作る。
app = Flask(__name__)

#WebクライエントからWebサーヴァーのURL(＝ルート)にアクセスされた際の動作。
#この場合、クライエント(＝ブラウザー)に、"Hello World"という文字列を返します。
@app.route('/')
def hello_world():
    return "Hello World"

#このファイルが直接実行された場合のみ、Flaskアプリのモジュールを起動・実行します。
if __name__ == ('__main__'):
   app.run()
```
Flaskでは、たったこれだけで一番簡単なWebアプリがつくれてしまうのです！。
すごいですよね。これがJavaだったら、Springだったらと思うとゾッとします(笑)。
※正確には、Flaskと「Werkzeug(ヴェルクツォイク)」を併用しないといけないそうですが・・・。


#終わりに(後書き)

いかがでしたでしょうか？。
この記事が、今後PythonでWebアプリをつくろうと考えている方のお役に立てれば幸いです。
それではまた～。
railsにおける.(ドット)の役割

こんにちは！石田佳介です！

僕がインターン生として実務に入っていて、一つ気になったことがあったのです。

rubyのコードでこのようなコードを見たことがありませんか？

```
<div class="hoge">
    <%= @books.each do |book| %>
        <p><%= book.title %></p>
        <p><%= book.body %></p>
    <% end %>
</div>
```

この書き方って不自然じゃないですか？
rubyの公式のドキュメントにもこう書いてありました

```
xxx.yyy
　オブジェクトのメソッド
```

[ruby公式ドキュメント](https://docs.ruby-lang.org/ja/latest/doc/symref.html#period)


公式ドキュメントのいう通りだとするならば、titleやbookはメソッドになるよなっておもったわけです。titleやbookってカラムじゃね？って思ったので、変だなって思いました。

そこで自分なりに調べてまとめましたので、この記事を読んで理解してみてください。

今回この謎を解決するためには、２つのものを理解しなければなりません。

①activerecord
②ゲッターとセッター

## ①activerecord
activerecordとはざっくりいうと、データベースから情報をとってくるとき、普通だったらSQLを使わないといけなません。でも、activerecordというもののおかげで、SQLをたたかなくても、直感的に、そしてrailsらしく簡単にデータベースの情報をとってくれるというものです。
コードでいうと、

```
User.all
User.find_by(params[:id])
```

こんな感じで、簡単なコードでデータベースから情報をとってこれるのは、activerecordのおかげなんです。

## ②セッターとゲッター
これを理解するためには、インスタンス変数の基本的な知識が必要になってきますので、上にあげたぼくの記事を読んでみてください。

そしてインスタンス変数は、基本的に定義されているクラス内でしか使えないんですね。
例えば

```
user.rb
@users = User.all 


group.rb
@groups = @users.comment #適当に書いたので 、ご容赦ください。
```


このように、書くと書くとgroup.rbファイルで、エラーが起きるんですね。
これは、Ruby on Railsの規則で、インスタンス変数はそのクラス内でしか使えないというルールがあるんです。

でも、この例でいえば、「他のファイルで@usersを使いたいなー」ってなることがありますよね。　
じゃあそんな時、どうしたらいいのか。それを解決してくれるのが、
セッターとゲッターです。

具体的にコードを見ていきましょう。

```
user.rb

class User
  def initialize(name) #セッター 
    @name = name
  end
  
  def getName #ゲッター 
    @name 
  end
end
```

initializeメソッドに関しては、[こちら](https://style.potepan.com/articles/29301.html#new)のリンクを参考にしてみてください。
要は、newメソッドが呼び出されたときに、自動的にやってほしいメソッドのことです。

まず、セッターというのは、インスタンス変数をどのクラスでも使えるようにするための下準備をしていると考えてください。名前の通り、インスタンス変数をセッティングしているんです。
ゲッターでは、実際にセッティングされたものをゲットしているんです。ホント名前の通りです(笑)
バレーでもセッターがいるから、ポイントをゲッティングできるんですね！(僕は野球やってました)

このようにすることで、インスタンス変数をクラス外でも参照できるようになるんですね。


##activerecordとセッターとゲッターの関係性
今回の話の結論を最初にいいます。

**activerecordにおいて、カラムのデータを取り出すために、カラム名と同じ名前のメソッドが自動で作成されている**
ということです。

どういうことか？

先ほどの例でいえば、

```
user.rb

class User
  def initialize(name) #セッター 
    @name = name
  end
  
  def getName #ゲッター 
    @name 
  end
end
```

これぜーんぶが、acctiverecordによって、カラム名と同じ名前のメソッドが自動的に作成されるんです。

だからこそ、

```
<div class="hoge">
    <%= @books.each do |book| %>
        <p><%= book.title %></p>
        <p><%= book.body %></p>
    <% end %>
</div>
```


この例でいうと、title、bodyなどのカラム名だとおもわれていたものが、
**実はカラム名と同じメソッドをactiverecordが自動で作成していたからこそできたことだったのです。**

activerecordはさすがですな！
Ubuntu 20.04 focal カスタマイズしてインストールするスクリプト

カスタマイズというか要するにdebianであるような「ネットワークインストール」で，
liveではなくて自分好みのデスクトップ環境を構築しようという自分の作業メモです。

# 使用例と少し解説

**警告とかエラーチェックとかほとんどせずにメディアに書き込みますのでご注意ください**

作業する ubuntu 20.04(jp) の上で以下をcloneします。
https://github.com/numeru55/ubuntu_custom_install

```bash
$ sudo ./format.sh /dev/sdb # パーティショニング
$ sudo ./build.sh /dev/sdb # 環境構築 時間がかかる
```

ディスクは，/dev/sdb1 = 200MのESP領域を確保し，残り /dev/sdb2 をext4にしてrootを構築します。

/dev/sdb2に以下の環境がインストールされます。

- Ubuntu 20.04 focalベース gnomeデスクトップ環境「最小インストール」状態
- 私のMacBookで必要なBroadcom WiFiドライバー
- chrome等，私好みのパッケージ
- ubuntu Japanese Team のパッケージ
https://www.ubuntulinux.jp/japanese

自分のMacBookProで起動可能なメディアができることを確認しました。

- grub-efi で起動できるようにセットアップします。

# つまづきの経緯や言い訳など

## debootstrap とパッケージインストールだけでは完成しない

自分がいかに無知だったかを思い知りました...

以下を思い切り参考にさせて頂きました。

- https://nomunomu.hateblo.jp/entry/2018/10/19/002805
- https://jkbys.net/ubuntu-20-10-%E6%97%A5%E6%9C%AC%E8%AA%9E-remix%E3%81%AE%E4%BD%9C%E6%88%90%E7%94%A8%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88
- https://github.com/mvallim/live-custom-ubuntu-from-scratch

## `/etc/fstab`を作る必要がある
デバイスを明示して，/=rootがどこにあるのかを示さなくてはいけないのでした。UUIDを調べて`/etc/fstab`を作り出すようにスクリプトを書きました。

## localeやキーボード設定等
基本日本語なので，いろいろなweb記事を参照させてもらい，インストール時には聞かれないように`build.sh`に記載しました。
キーボード設定はスマートな方法がわからず，結局設定済みのファイルを記述してコピーすることで無理やり解決させました。

## userの追加
インストール時に指定しない場合，初回起動時に尋ねられる動作になるようです。私好みなのでそのままにしていますが，`build.sh`内で指定することもできます。該当箇所のコメント部分を参照願います。
「自動でログインするようにインストールする」手法がわかりませんでしたが，問題なしとして放置しています m(_ _)m

##`sudo` 時に「名前の解決ができません」と怒られる
以下に感謝です！
- http://blog.livedoor.jp/suguniwasurechau/archives/33047667.html

## grub.cfgの修正
直接の修正は推奨されないようですが... しかたありません。私のMacでは，メニューエントリーが表示されなかったり，うんと小さい文字になったりします。やむを得ず，それっぽく書き込むことにしました。

## 時間がかかります...
手持ちの32G USBメディアでは，1時間弱かかりました。さすがに全パッケージをaptしてインストールスクリプトを実行して，というのは時間がかかりますね。
`\etc\fstab`の修正は必要ですが，書き込みが速いメディアに構築してまるごとコピーする，という回避策があります（完全な言い訳）

# 感想など

「デスクトップ環境構築」というのは一般ではそれほど頻度が高い作業ではないのでしょう。
すくなくともfocalのインストールメディアには，「最小インストール」というのが選べて，とりあえずそれを選択して，あとから自分の好きなカスタマイズを施すほうが多分時間もかからないし確実かもしれません。
それでも，それが趣味のような私にとってはいい勉強になったと思いました。

# 更新

- 最初の記事ではrEFIndを使っていましたが，grubを使うように変更しました。
- Makefileを使う方法から，（formatを除き）1本のスクリプトで完結するようにしました。
React チュートリアル　パート9　（npm install json-server）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/9dfbb9d3-76d5-0b92-2a31-58a5f4508b05.png)

#目標:military_medal:
まずは、**json-server**を**localhost:5000**ポートに設定しましょう:bangbang:
コードはたった２行で構築できるので、サクッと行きましょう:point_up:

#json-serverをlocalholst:5000に設置します！

###１，Vscodeのターミナルを開いていただき、”npm install json-server"をインストールしてください:bangbang:
:arrow_down:公式ドキュメント:arrow_down:

https://www.npmjs.com/package/json-server

###２，package.jsonを開いていただき、【22行目】に一行追加します。【21行目】末尾に コンマ ” , ” を忘れないように:bangbang:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/38a00bf1-ff49-9f1d-8c9c-f04fc28792df.png)

###３，ターミナルに、”npm run server"と入力して実行します
そうすると”db.json"が作成されて、そのファイルを開くと下記のようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/8928e172-cc28-d0cc-1a9a-dbd77f607be5.png)

###これで、json-serverの設置完了です:tada:

あとは、ブラウザからlocalhost:5000ポートを確認してみます:bangbang:

#ブラウザで確認:fire::fire:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/5b9884e3-1689-703e-dad5-a98f8057bba1.png)

他にも、**localhost:5000/comments**もしくは**localhost:5000/profile**を入力すると別のファイルを見ることができます:bangbang:

簡単でしたね:blush:

#次回:bell:
次回は、fetch()を使ってjsonファイルを、Reactアプリケーションから取りに行く方法を学びましょう:bangbang:

#参考

https://youtu.be/w7ejDZ8SWv8
日々の疲れにサンショウウオの画像を返して癒しのLINE BOTを作りたかった、、

__１．はじめに（狙い）__
日々の仕事をしていると毎日がルーチン化して飽きてしまう。
そこで何か毎日変化があるということで、変わった生き物（サンショウウオ）の
画像がLINEで返ってきて癒される、そんなBOTを作ろと思いました（結論　完成しませんでした、、）


__２．どんなLINE BOTか__
LINE BOTとサンショウウオランダム画像とランダム知識のAPIを繋げました。
LINEに何かキーワードを打つとサンショウウオの画像とその生態や豆知識
が返信で返ってくるものです。

〔LINE返信結果〕
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476779/5a973e11-fd6a-d85c-9335-742e22776b44.png)

〔フローです〕
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476779/a170f868-5b9d-d505-56c6-9dc5407b7b92.png)


__３．使用したツール__
・Heroku
・Node-RED
・LINE Developers Messaging API


__４．技術上の課題__
（１）LINEの返信結果の画像にあるようにURLは表示されるがLINE上に画像を表示することができなかった。
　　　そこで、画像が表示できるフロー↓を参考にset mag.payloadを追加し、他のAPIで画像を表示させることを確認できた上で、
　　　changeノードをコピーしたが、画像を表示することはできなかった。

![キャプチャa.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2476779/7d41afc0-4230-6052-ea47-479e28b3174a.png)


（２）豆知識の部分も日本語に翻訳できればよいのだが、どうしたらよいか応用ができなかった。


__５．最後に__
もう少し現実的に役立つLINE BOTを考えたいが、この画像が表示されない問題はなんとかクリアにしたい。

最後までご覧いただきありがとうございました。
名古屋の降雪について少し調べてみた

## はじめに
昨年の5月に名古屋に来て東海の冬を初め体感している真っ最中なのですが、結構雪が降るんだなという印象を受けました。そこで今回は気象庁のデータを使って、降雪の状況を可視化していきたいと思います。

## 使用したデータ
今回使用したデータは、気象庁の[過去の気象データ検索](https://www.data.jma.go.jp/obd/stats/etrn/index.php)から名古屋の観測地点の12月の降水量、12月の最深積雪のデータを過去10年分取得しました。それぞれ整形し、CSVファイルとして保存しました。12月のデータを使用しているのは、僕が12月しか経験していないからです笑

## 結果
今回はRを使ってグラフを描画し、内容をみていきたいと思います。スクリプトをこちらに記載します。

```r
# パッケージの読み込み
library(tidyverse)

# 降水量のデータの読み込み
data_p <- read_csv("./precipitation_dec.csv")
# 最深積雪量のデータの読み込み
data_d <- read_csv("./deepest_snowfall_dec.csv")

# グラフの描画
# 降水量のグラフ
g_p <- ggplot(data_p, aes(x=year, y=precipitation)) + # データの指定
       geom_bar(stat = "identity")　+ 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　# 棒の追加
       theme_gray(base_family = "Osaka") + 　　　　　　　　　　　　　　　　　　　　　　# フォントを指定
       xlab("年") +　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　# x軸のラベルを指定
       ylab("降水量") +　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　# y軸のラベルを指定
       ggtitle("12月の名古屋の降水量")　                  # タイトルを指定

# 最深積雪量
g_p <- ggplot(data_p, aes(x=year, y=deepest_snowfall)) + # データの指定
       geom_bar(stat = "identity")　+ 　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　   # 棒の追加
       theme_gray(base_family = "Osaka") + 　　　　　　　　　　　　　　　　　　　　　　   # フォントを指定
       xlab("年") +　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　   # x軸のラベルを指定
       ylab("最深積雪量") +　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　# y軸のラベルを指定
       ggtitle("12月の名古屋の最深積雪量")　                   # タイトルを指定

g_p
g_d
```

### 降水量について
結果はこちらです。
![スクリーンショット 2022-01-17 23.37.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/079d7797-57c4-3b88-a392-d37a7bbd4ffd.png)

僕が初めて経験した12月の降水量はここ数年間でみると多かったようです。ただ過去10年間で見てみると、圧倒的に多いとは言えないようです...

降水量なので、単純に降雪量ということはできませんが...

### 最深積雪量について
結果はこちらです。
![スクリーンショット 2022-01-17 23.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581736/e82067b9-837d-db90-5ceb-014ae64ea916.png)

僕が初めて経験した名古屋の12月ですが、降雪が少しだったようです。積雪がない年もある中で積雪があったのは、やや雪が降った年だったんだなという印象を受けました。一つ気になるのは２０１４年の12月には積雪が20cmを超えています...1年だけ圧倒的ですね...

## さいごに
今回は名古屋の12月の過去10年分のデータを使って降水量と最深積雪量に関して可視化してみました。気象庁のデータを取得するのが1番難しかったという印象でした...
整数のそれぞれの桁の数字を求める

学習したことのアウトプットとして

勉強をしていると「３桁のそれぞれの桁の数字を足すプログラムの作成」というものがあった。
今まで桁を取り出す方法とか考えたことがなく、勉強になったため記事にしてみる。

## それぞれの桁の数字の取り出し方

```ruby
num = 3456

# 千の位
result_1000 = (num / 1000) % 10
# 百の位
result_100 = (num / 100) % 10
# 十の位
result_10 = (num / 10) % 10
# 一の位
result_1 = (num / 1) % 10

puts result_1000 # => 3
puts result_100  # => 4
puts result_10   # => 5
puts result_1    # => 6
```

### ちなみに
一万の位の場合は
（num/`10000`） % 10 で取り出すことが可能。

以上。法則は分かりやすいので特別難しいことはないかと。


## 追記(20230118)
コメントで教えていただいたことを追記しときます。
（教えていただき有難うございます！）
### digitsメソッド
表記した数値を配列で返してくれる

```zsh
#整数を定義
irb(main):001:0> num = 123456
=> 123456
#配列として帰ってくる
irb(main):002:0> num.digits
=> [6, 5, 4, 3, 2, 1]
```
非負整数でなければいけない。非負整数でない場合はエラーが発生する。


### 文字列として考える
`to_sメソッド`を使用する。to_sメソッドは文字列以外のオブジェクトを文字列に変換するメソッド。

```ruby
num = 1234
#頭からn桁目を指定して取り出せる
puts num.to_s[0]  #1
puts num.to_s[1]  #2
puts num.to_s[2]  #3
puts num.to_s[3]  #4

#末尾からn桁目みたいな書き方をする場合
puts num.to_s[-1]  #４
puts num.to_s[-2]  #３
```
　

こうしてみるとコードの書き方や考え方ってたくさんあるなぁと…
そこが難しくもあるし、奥深いなと感じた。


※補足等ありましたらコメントいただけると幸いです。