OmniAICreator/Qiita-1.07M huggingface dataset:
ACMのSSL証明書に切り替えてみた



## やりたいこと
やりたいことは、AWSベースで作成したウェブサイトのSSL証明書をまとめて管理したいため、ACM（[AWS Certificate Manager](https://aws.amazon.com/jp/certificate-manager/)）で取得したSSL証明書を利用すること。

ACMのSSL証明書をそのままでウェブサイトにインストールができないため、ALB（[Application Load Balancer](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/introduction.html)）も導入する。

## 構成イメージ
![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176796/10054b23-a838-ab54-f8f8-550dee775498.png)

Route53はhttpsのリクエスト受け取って、ALBに送信する。
ALBに設定しているリスナーのルールに従って対象のインスタンスに送信する。

ACMのSSL証明書をALBに登録するので、基本はHTTPS:443のリクエスト受信する想定です。ただ、80番のリクエストにも対応しておきたいため、ALBのHTTP:80のリスナーにHTTPS:443にリダイレクトするようにしている。
やり方の参考：https://aws.amazon.com/jp/premiumsupport/knowledge-center/elb-redirect-http-to-https-using-alb/

## 事前準備
①対象ウェブサイトはRoute53で管理しているドメインで立ち上げたもの。
②SSL証明書をACMから取得しておく。



## ALBの設定
### SSL証明書の登録
HTTPS:443のリソナーに取得したSSL②をインポートする。
参考：https://aws.amazon.com/jp/premiumsupport/knowledge-center/associate-acm-certificate-alb-nlb/

### ターゲットグループの作成
今回作成したのはTarget typeがInstanceになっているもの。

参考：https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/create-target-group.html

### リスナーにルールの追加
HTTPS:443のルールを編集し、IF−THENのルールを追加する。
例えば、example.comのリクエストが来たら、exampleターゲットに転送。


>IF ホストがexample.com
>
>THEN　
>転送先
>example: 1 (100%)


## Route53の設定
ここの目的はALBとRoute53連携できるように設定する。

### レコードの編集＆追加
ALBの画面には当該DNS名の情報はあり、あとで確認するため、先にコピしておく。

Route53画面にある当該ホストゾーンの詳細から、Aレコードを編集＆追加する。
(元々インスタンスIPに関連するAレコードがありまして、それをALBに変更すれば良いですが、テスト＆確認しながら行いたいため、そのAレコードのルーティングポリシーを加重に変更してから、新規でALBのAレコード（ルーティングポリシーも加重にする）を追加する形にした。重みの調整でALBに行くか、本来の固定IPに行くかのコントロールできるのは自分の狙い。)

ALBのAレコードを作成する時に、「**ターゲットのヘルスを評価**」という項目があり、ONにする場合、予想している動きになる可能性があります。その時に以下の資料を参考になれると思います。ちなみに、今回はOFFにした。
[ヘルスチェックが設定されている場合に Amazon Route 53 がレコードを選択する方法](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/health-checks-how-route-53-chooses-records.html)
[複雑な Amazon Route 53 構成におけるヘルスチェックの動作](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/dns-failover-complex-configs.html#dns-failover-complex-configs-hc-alias)

### レコードのテスト
Route53の画面には「**レコードをテストする**」機能があるので、自分の設定が正しいかを確認したい時に使えると思います。

## 最後: 確認する
1. CloudWatch、ALBのターゲットのモニタニングでリクエストの集計を確認できます。
2. 普通にサイトにアクセスして、対象インスタンスのaccess.logにはALBのIPからのアクセスが出てきましたら、それでRoute53とALB設定はOKだと思います。
3. ブラウザーでサイトにアクセスして、URL欄の鍵マーク🔒からSSL証明書はAWS発行のSSL証明書になれば証明書の切り替えができたと思います。
CSV配置ファイルの最適化策

今回の主な話題：CSV配置ファイルの最適化策、単数回setactiveがコントローラーの初期化を導く、WWWでアセットをロードするとクラッシュする、Unityバージョンのアップグレード後にテクスチャ形式が変更され、すべての.metaが自動的に変更されます。

---
###Monoメモリ
Q1: UWAのレポートによると、Mono GCの割り当ては30MBに達し、存続メモリは約20MBです。直接Splitすることもindexof+substringをすることも試しましたが、あまり改善されませんでした。CSV配置ファイルの最適化策ありませんか？
![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/52d4538b-32fa-4761-c196-923240e149f1.png)
>C＃文字列は変更できないため、文字列操作によって多数の一時変数が生成することが多く、一般的な操作で回避しにくいです。問題主は、以下の二つの方法を考慮できます。
1）CSVを他のストレージ構造に変換します。例えば、protobufまたはMessagePackなど。
2）unsafeポインタを使用して文字列を操作します（少し面倒かもしれません）。

>基本的な考え方は、文字列が[idx0,idx1]間のcharを手動的にint、float、boolまたはstringに変更します。Stringとboolは比較的簡単で、次にint、floatにはさらに考慮事項があります。unsafeポインタを使用して文字列を操作します（少し面倒かもしれません）。基本的な考え方は、文字列が[idx0,idx1]間のcharを手動的にint、float、boolまたはstringに変更します。Stringとboolは比較的簡単で、次にint、floatにはさらに考慮事項があります。C++の経験があれば、このようなコードを書くにはより簡単はずです。次のステップは配列です。最初に配列の長さを確定して、後で配列を構造することは一部のGCを減らすことをできます。最終的な問題はDictionaryです。

---
###アニメーション
Q2: 動作コントローラーで特殊効果を表現する時に、表示中にコントローラーの初期化が発生するため、そのフレームの時間コストが大幅に大きくなります。さらに、毎回SetActiveすると、コントローラーを初期化し、毎回も初期化の時間コストがあります。何か良い解決策ありませんか？

①
>GameObjectを非表示にするために、必ずしもSetActiveが必要なわけではありません。すべてのRendererコンポーネントのEnableをFalseに設定できます。

②
>Animatorコンポーネントを含むGameObjectsのActiveな操作は、間違いなくAnimator.InitializeのCPUコストを引き起こします。

---
###クラッシュ
Q3： Unity 4.xでWWWを使用してアセットをロードしますと、クラッシュします。表示された内容は以下になります。
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR)。

最後に確認した、コールされたインターフェイスは、
MemoryProfiler::RegisterRootAllocation(void*, BaseAllocator*, char const*, char const*)+124

どのように処理すれば良いですか？

>Development BuildバージョンでクラッシュLogが発生したら、実際には処理しなくでも大丈夫です。なぜなら、このCrashはUnity 4.x以上のDevバージョンのみで出現し、Releaseバージョンではありません。問題主がReleaseバージョンでも同じ位置でクラッシュが発生したら、原因は他の問題はずで、このCrash Logと関係ありません。このBugはUnity 5.0以降修正されましたが、Unity 4.xでまた存在しています。

---
###アセット管理
Q4: 私たちのプロジェクトがUnity5.6から2017.4.3にアップグレードされた後、アーティストのテクスチャファイルが全部変更されました。主にMetaは自動的に変更されました。変更は次のとおりです。これは、Unityバージョン自身の問題で、テクスチャの一部の情報が変更されましたか？
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/e8b51bf6-d056-13f3-85df-526d815e1e80.png)

>問題を解決しました。この原因は、私たちのプロジェクトに後処理スクリプトがあり、OnPostprocessTextureでアーティストのテクスチャのサイズを制限し、2048を超えるテクスチャを提出することを防ぎます。インポートされたテクスチャにインポート修正をしなければ大丈夫です。

---
###Monoメモリ
Q5: ManagedHeap.ReservedUnUsedSizeのメモリ占用は2GBで、これはなぜですか？このパラメータは一般的にどの範囲に制御しますか？
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/32d12c10-26cd-6c33-d957-fa762ca71cd9.png)
>これは、ゲームが特定の段階まで実行しましたから、大きなMonoメモリの割り当てが発生し、全体的なMonoメモリを高めました。後でここのMonoメモリがGCされましたが、全体的なMonoメモリはシステムに返りません。これが、ManagedHeap.ReservedUnusedSizeが非常に大きい理由です。これに対して、問題主にこのような状況があるかどうかを確認することをお勧めします。一般的には、ゲーム、スキルリストまたは地形ナビメッシュをロードする時に発生します。これらの方面から確認することをお勧めします。

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

UWA公式サイト：https://jp.uwa4d.com
UWA公式ブログ：https://blog.jp.uwa4d.com
リポジトリにCRLFを混入するな小学校

Mac-Windows間で開発環境をころころ変える。

Nuxtのdev時、Prettier に CRLFを使うなと怒られたけどeslint --fixする前にgitの設定を見直す

```cmd
git config --global core.autocrlf input
```
改行lfのまま読み込んで、commit時に改行lfにしてくれる。

VS Codeの人は改行lfに設定してしまおう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/703685/c2b4af9b-2916-67db-a6d5-35eca8ba862f.png)
refileの画像保存先を変更した際のこと

画像のアップロードにrefileを使用していて、ファイルの保存先を変更することがあったので備忘録として書きます。

##開発環境
- Ruby 2.6.3
- RubyOnRails 5.3.4

```Gemfile.

# 画像アップロードにrefileを利用
gem "refile", require: "refile/rails", github: 'manfe/refile'
gem "refile-mini_magick"

```

###保存先の変更
デフォルトだとアップロードされた画像は tmp/uploads/store に保存されます。
今回は public/uploads/ に変更したかったので、configのinitializers配下にrefile.rbというファイルを作成し、下記のように設定を加えます。

```config/initializers/refile.rb

Refile.backends['store'] = Refile::Backend::FileSystem.new('public/uploads/')

```
これで、保存先を変更することができました。
しかし、本番環境を確認すると困ったことが起きました。
画像ファイルを読み込む場所を変更したので、当然のことですが、
変更前にアップロードした画像が表示されなくなってしまいました。

試しに変更前にtmp配下に保存されたファイルたちをpublicに移動してあげたら無事表示されました。

```terminal.

$ cp tmp/uploads/store/* public/uploads/

```

どのケースでもこの対応で解決できるかはわかりませんが、どなたかの参考になれば幸いです。
Gitコマンドについて

Gitについての、流れをまとめてみました。

## リポジトリとは
Gitでファイルを管理する場所
- ローカルリポジトリ
- リモートリポジトリ（publicリポジトリとprivateリポジトリ）

## Gitコマンドと流れ

### ①リモートリポジトリ→ローカルリポジトリへダウンロード
- git clone （新規）
- git pull origin （上書き）

### ②gitの管理
- git status（状態の確認）  
・赤文字：gitで管理していないファイル
・緑文字：gitの管理化にあるファイル（ステージング）

- git add ファイル名
gitでファイルを管理させる際に使用（ステージングする際に使用） 
※git add .　と最後にファイル名ではなくドットをつける事により全てのファイルをステージング

- git commit -m "コミットメッセージ"
gitに保存する

- git log
コミット履歴の確認

### ③ローカルリポジトリ→リモートリポジトリへアップロード
- git push origin
- git push origin develop（developブランチへアップロード）
※originはリモートサーバーのこと

## ブランチ
### ブランチを切る
- git checkout -b develop master（マスターからdevelopブランチを切るという意味）

### ブランチの切替
- git checkout master（マスターブランチへ切替）
- git checkout ブランチ名（作業するブランチへ切替）

### ブランチの確認
- git branch
- git branch -a（-aがつくとリモートも含めた全てのブランチを表示）

### マージ
- git merge develop（developブランチをマスターへマージ）
※マージしたいブランチ（マスター）で行う

## プルリクエスト（GitHubを使ったマージ前の確認）
作成したブランチをマスターにマージしてもらいたいという依頼のこと
1. AさんがGitHubでプルリクエストを作成（Create Pull Request）
2. Bさんが内容を確認しレビューを行う（Files changed箇所で変更画面の確認・コメントを記述ができる）
3. 最終的に問題なければ、マージボタンを押す事によりマージができる


## 同じブランチで作業する場合（共同開発）
AさんとBさんのローカルリポジトリで別々のコミット履歴が出来上がる。
Aさんが先にプッシュ
次にBさんがプッシュするとエラーが発生する

プッシュの前にリモートの状態をローカルにマージしておく必要がある（下の①もしくは②の内容）
① git fetch origin/develop
※このコマンドが実行されるとVIエディタが開かれるので、「:wq」と入力しEnterキーを押すことで、マージが行われる

② git pull develop
※「pull」は「fetch＋merge」を一つのコマンドにまとめたもの

### コンフリクト
編集している箇所が同じで競合状態にある事
1. Aさんが編集しプッシュ
2. Bさんが同じ箇所を編集していてPullするとコンフリクトが発生
3. コンフリクトを解消してからコミットしてプッシュする

## git rebase（mergeとの違い）
- merge  
コミット履歴が時系列のまま
- rebase  
Aさんのコミット履歴の後にBさんのコミット履歴を持ってくる（一直線のコミットツリーになる）
git fetch origin
git rebase origin/develop develop
git push origin -f
※rebaseの場合、-fが必要で強制的にプッシュする事になる


## git reset と git stash
- git reset --hard HEAD 
今編集中の内容を全てリセットして、最終コミットのところまで戻す

- git stash 
コミットしていない内容をいったん全て削除
- git stash pop
内容を元に戻す
※違うブランチで作業していて、ブランチを切り替える必要がある際に使える
debian8：visudo でnanoではなくvimで開く方法

debian8をある作業で使用しています。
sudoersファイルを編集しようとして、"sudo visudo"したら、nanoが立ち上がりました。

```bash
guest@debian:~$ sudo visudo
#
# This file MUST be edited with the 'visudo' command as root.
#

(省略)

#
Defaults        env_reset
Defaults        mail_badpass

(省略)

# User privilege specification
                               [ Read 28 lines ]
^G Get Help  ^O WriteOut  ^R Read File ^Y Prev Page ^K Cut Text  ^C Cur Pos
^X Exit      ^J Justify   ^W Where Is  ^V Next Page ^U UnCut Text^T To Spell
```
**nanoの使い方知らない...vimで編集したい...**

少し調べたら、"EDITOR=vim sudo -E visudo"でvimで編集が可能になった。

```bash
guest@debian:~$ EDITOR=vim sudo -E visudo
  1 #
  2 # This file MUST be edited with the 'visudo' command as root.
  3 #

(省略)

 19 # User privilege specification
 20 root    ALL=(ALL:ALL) ALL
 21 guest   ALL=(ALL) ALL
 22 
"/etc/sudoers.tmp" 28L, 689C                7,1          先頭

```

"VISUAL=vim sudo -E visudo"でもvimで開く！

Debian8以外でもうまく行くのかは知りません。
visudoのバージョンは以下の通りでした。

```bash
guest@debian:~$ sudo visudo -V
visudo バージョン 1.8.10p3
visudo 文法バージョン 43
guest@debian:~$ 
```

###補足
たぶん、"sudo update-alternatives --config editor"とかして、環境を変えてもいいのでしょうが...
環境を変えずに取り敢えず...ならば、ここで示した方法がいいかも。

以上
VS Codeで重複してる文字列を選択・変更する

#はじめに
これは学習用のメモになります。

今回はVSCodeで文字列が重複した際に同時に文字列を修正してきます。

#方法
マルチカーソル選択機能を使って文字列を一括に変更していきます。

`マルチカーソル選択機能`とは「現在のカーソル位置にある単語と同じ単語をまとめて選択」できる機能です。

|内容| コマンド
|:------:|:------:|
|現在のカーソル位置にある単語と同じ単語を一括して選択する| ［Ctrl］＋［Shift］＋［L］キー（Windows／Linux）　［Shift］＋［Command］＋［L］キー（macOS）| 
|現在のカーソル位置にある単語と同じ単語を1つずつ選択範囲に追加する| ［Ctrl］＋［D］キー（Windows／Linux）［Command］＋［D］キー（macOS）|
gem wheneverをdockerで動かす方法

## 環境

Docker Engine 20.10.2
Ruby 2.7.0
Bundler 2.1.4

## 手順

wheneverをGemfileへ

```
# Gemfile

source 'https://rubygems.org'
git_source(:github) do |repo| "https://github.com/#{repo}.git" end

gem 'whenever'
```

コンテナにcronをインストール

```docker
# Dockerfile

FROM ruby:2.7.0

RUN apt-get update && apt-get install -y cron && apt-get install -y vim

WORKDIR /usr/src/app
COPY Gemfile .
COPY Gemfile.lock .
RUN bundle install
```

コンテナのsetupとwheneverの設定

```bash
$ docker build -t test_image .
$ docker create --name="test_container" -it -v "$PWD":/var/src/app test_image
$ docker start test_container
$ docker exec -it test_container /bin/bash
/usr/src/app# bundle exec wheneverize .
```

以下の設定ファイルができるのでカスタマイズする

```ruby
# schedule.rb

#
# Use this file to easily define all of your cron jobs.
#
# It's helpful, but not entirely necessary to understand cron before proceeding.
# http://en.wikipedia.org/wiki/Cron

# Example:
#
set :output, "log/cron_log.log"
#
every 1.hours do
  # command
end
#
# every 4.days do
#   runner "AnotherModel.prune_old_records"
# end

# Learn more: http://github.com/javan/whenever
```

もう一度コンテナに入りコマンドを実行

```bash

$ docker exec -it test_container /bin/bash
/usr/src/app# bundle exec whenever
# =>
# 0 0,2,4,6,8,10,12,14,16,18,20,22 * * * /bin/bash -l -c '/usr/bin/some_great_command >> /path/to/my/cron_log.log 2>&1'
# 0 0,2,4,6,8,10,12,14,16,18,20,22 * * * /bin/bash -l -c 'cd /usr/src/app && bundle exec script/runner -e production '\''MyModel.some_method'\'' >> /path/to/my/cron_log.log 2>&1'
# 0 0,2,4,6,8,10,12,14,16,18,20,22 * * * /bin/bash -l -c 'cd /usr/src/app && RAILS_ENV=production bundle exec rake some:great:rake:task --silent >> /path/to/my/cron_log.log 2>&1'
# 0 0 1,5,9,13,17,21,25,29 * * /bin/bash -l -c 'cd /usr/src/app && bundle exec script/runner -e production '\''AnotherModel.prune_old_records'\'' >> /path/to/my/cron_log.log 2>&1'
```

cronを起動

```bash
/usr/src/app# service cron start
#=> [ ok ] Starting periodic command scheduler: cron.
```

cronが動いているか確認

```bash
/usr/src/app# service cron status
#=> [ ok ] cron is running.
```

## 参考

[gem whenever]([https://github.com/javan/whenever](https://github.com/javan/whenever))
dockerコンテナ作った（Dockerfileから）

#イメージの作成


＊コンテナ起動時にapacheが自動起動しない・・・なぜだ
>追記
>CMD /usr/sbin/apachectl -D FOREGROUND
>にすれば自動起動した

## Dockerfileを準備

```bash
mkdir -p /usr/local/etc/docker_files/test/
vi /usr/local/etc/docker_files/test/Dockerfile
```


```Dockerfile
FROM ubuntu

RUN apt-get update
RUN apt-get -y upgrade
RUN apt-get install -y sudo
RUN sudo apt-get install -y vim
RUN sudo apt-get install -y curl
RUN sudo apt-get install -y tzdata
RUN sudo apt-get install -y php7.4

ADD ./home /home/
ADD ./php.ini /usr/local/etc/php/
ADD ./apache2 /usr/local/etc/
COPY ./startup.sh /usr/local/etc/
RUN chmod 744 /usr/local/etc/startup.sh

RUN ["sudo", "/bin/bash", "-c", "echo \"ServerName $HOSTNAME\" > /etc/apache2/conf-available/fqdn.conf"]
RUN a2enconf fqdn
#RUN apachectl start

EXPOSE 80
CMD ["/usr/local/etc/startup.sh"]
#ENV APACHE_RUN_USER www-data
#ENV APACHE_RUN_GROUP www-data
#ENV APACHE_PID_FILE /var/run/apache2.pid
#ENV APACHE_RUN_DIR /var/run/apache2
#ENV APACHE_LOG_DIR /var/log/apache2
#ENV APACHE_LOCK_DIR /var/lock/apache2
#CMD ["apachectl", "-D", "FOREGROUND"]
#RUN ["sudo", "/bin/bash", "-c", "/etc/init.d/apache2 start"]
#RUN ["sudo", "/bin/bash", "-c", "/usr/sbin/apachectl -D FOREGROUND"]
```

## Dockerfileからイメージを作成
イメージあるかどうか確認

```bash
docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
```

ビルド（イメージを作成）

```bash
docker build -t test /usr/local/etc/docker_files/test/
```

できたかどうか確認

```bash

docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
php74test    latest    b5f7bfd05352   58 seconds ago   297MB
ubuntu       latest    f63181f19b2f   24 hours ago     72.9MB
```

##コンテナ作成

```bash
docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
```

```bash
docker run --name container01 -it php74test:latest /bin/bash

Ctrl + P + Q でコンテナから出る
```

```bash
docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
a3270221bbd8   php74test:latest   "/bin/bash"   54 seconds ago   Up 53 seconds             container01
```

```bash
docker attach container01
```
スーパユーザでリダイレクションする時【>, >>】

# 概要
- SSH先でコマンド打つ時等、sudo権限出ないといけない場合のファイル作成方法を記述します。

例:

```
$ ssh user@host "sudo echo 'test' > /var/test/hoge.txt"
```

以下だと失敗する。

```
$ sudo echo 'test' > /var/test/hoge.txt  
zsh: permission denied: /var/test/hoge.txt
``` 

以下は成功する。

```
$ sudo sh -c "echo 'redirect' >> /var/test/hoge.txt"
```

# 結論
OK

```
$ ssh user@host "sudo sh -c \"echo 'test' > /var/test/hoge.txt\""
```

NG

```
$ ssh user@host "sudo echo 'test' > /var/test/hoge.txt"
```

リダイレクションはパイプと同じでファイル作成する頃にはsudo権限が切れてしまっている。
DHCPのIPアドレスリース状況の確認

#DHCP

DHCPは普段我々があまり意識せず使っている、インターネットを支える通信インフラの一つで、所謂IPアドレスをPCに割り当てて、TCP/IP通信が可能な状態にしてくれます。これは、PCだけではなく、携帯電話やタブレット、IoT機器のすべてに当てはまります。ここでは、IPアドレスの割当などといった、先駆者の方々が説明してくれているような、DHCPの設定方式等のお話をすることはありません。もっとニッチにですが、サブネットに対するIP払出情報をまとめることについて備忘録を書いていきます。

#leases

DHCPのIP払出情報は、ISC-DHCPだと、leasesファイルといわれるファイルで管理しています。この内容を読み込めば、各IPの情報を知ることができます。ただ、ちょっと癖があって、

>leaseファイルの中身は同一IPに対して複数状態が書かれる。

というルールです。最初、単純に状態freeの数を数えていけばよいと思ったのですが、exfiredやfree, activeなどが混在したIPアドレス情報が出力されていました。
これどれが正しいの？と思ったのですが、これは[マニュアル](http://www.linux-cmd.com/dhcpd.leases.html)に書いてありました。

>*Internet Software Consortium DHCP サーバは、割り当てたアドレスの貸し出し記録を永続的なデータベースに保持しています。このデータベースはフリーフォームの ASCII ファイルで、一連の貸し出し宣言 (declaration) からなります。貸し出しが要求・更新・破棄されると、その新しい値がこの貸し出しファイルの末尾に記録されます。よって、ひとつの貸し出しに対して複数の宣言があった場合は、ファイルの後ろの方にあるものが現在のものになります。*

すなわち、同一IPの場合、最後に書かれた状態が現在の状態ですよ。ということになります。マニュアルめんどくさいけどちゃんと読まないといけなかった。

#binding state
さて、IPの状態を示すbinding stateですが、以下の内容が定義されています。

1. FREE... 利用可能なIPアドレス
1. ACTIVE... 現在利用中なIPアドレス
1. EXPIRED... 期限切れなIPアドレス
1. RELEASED... 利用機器から解放されたIPアドレス
1. ABANDONED... 破棄されたIPアドレス
1. RESET... 現在利用中なIPアドレス
1. BACKUP... Failoverしている相手サーバで払出可能なIPアドレス

ここで、IPの払出状況に関係するのは、freeとactiveなんですが、failoverしているなら、バックアップの数も数えておいた方がよさそうです。EXPIRED, RELEASED, ABANDONEDが利用可能に含めるか否かはちょっとわからないので、今回は見送りました。

#払出数の確認

dhcpd.leasesの中身は、こんな感じです。

```
lease 192.168.1.2 {
  starts 1 2021/01/11 03:08:04;
  tstp 1 2021/01/11 02:08:01;
  tsfp 1 2021/01/11 03:08:04;
  atsfp 1 2021/01/11 03:08:04;
  binding state free;
}
  
lease 192.168.1.3 {
  starts 0 2021/01/03 03:48:29;
  ends 0 2021/01/03 03:48:39;
  tstp 0 2021/01/03 03:48:39;
  tsfp 0 2021/01/03 03:48:39;
  atsfp 0 2021/01/03 03:48:39;
  cltt 0 2021/01/03 03:48:39;
  binding state free;
  hardware ethernet 00:11:22:33:44:55;
  uid "\001\000\333p\303\021\327";
}
```

これらの内容は、たぶんいろんなサイトで書かれておりますが、
払い出したipアドレスを示す、lease 192.168.1.xxxの値とそのIPの状態を示す、binding state xxxxをカウントしていけばよさそうですね。で、IPは複数出てくることがありますが、最後のものを採用することで現在の状態が得られます。leasesファイルは、dhcpd.confで定義した、払出範囲のIP情報と突き合せれば、払出数の計算ができるので、今回はちまちまエクセルでまとめてIPを払い出せなくなりそうなサブネットを見つけ出すことにしました。
定期的にこの作業を行うのなら、スクリプトやプログラムを作成して、定期実行すると良さそうです。

#参考文献

1. [https://www.ns-lab.org/wiki/?FrontPage](https://www.ns-lab.org/wiki/?Linux/Source/DHCP)
1. [リナックスコマンド](http://www.linux-cmd.com/dhcpd.leases.html)
1. [Nobwak&#039;s Lair](http://april.fool.jp/blogs/2013/06/17/freebsdlinux-dhcp%E3%82%B5%E3%83%BC%E3%83%90isc-dhcpd%E3%81%A7%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%A6%E3%81%84%E3%82%8Bip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E6%95%B0%E3%82%92/)
1. [golangによるdhcpd.leasesファイルパーサー](https://github.com/npotts/go-dhcpd-leases)
SCSSでの画像の挿入とサイズの指定

# 1.SCSSとは
　SCSSとはウェブページのスタイルを指定するCSSより効率よく記述するためのものです。
cssはよく聞くと思いますが、scssはあまり聞かないのじゃないかと思い今回記事を書かさせていただきました。

# 2.SCSSでの画像挿入
　1)まずcssファイルがscssファイルになっていない場合、scssファイルに変更しましょう。名前の変更で語末のcssをscssに変えるだけです。

  2)そして次に以下のように画像の挿入ですまずapp/asset/imagesのフォルダの中に写真を用意しましょう。
![Image from Gyazo](https://i.gyazo.com/202c95c9f61caf25635cfb81ce3f5ae8.gif)

  3)用意したscssファイルを開き画像を用意します。以下が書き方の例です。
   htmlで用意したクラス名contentsを使い指定していきます。
　まずbackground-imageのなかに背景の画像としておきたいものをimage-urlの括弧の中に指定します。
これだけで写真は貼り付けられますが、何回も写真がリピートしてしまします。その時に使うのがbackground-repeatです。これにno-repeatをつけると一枚だけの写真にすることができます。そのほかはbackground-sizeで大きさを指定したり、heightやwidthでも大きさは指定できたり、位置をどうするかなどは基本的なcssの指定の仕方で大丈夫です。またこれは背景画像なので、この上にhtmlの文字を乗っけてデザインすることも可能です。

```scss:index.scss
  .contents {
  background-image: image-url("image_top.jpg");
  background-size: cover;
  background-repeat: no-repeat;
  background-position: top center;
}
```

# 3.最後に
このようにscssならではの簡単な記述で指定できるものもたくさんあるので是非使ってみてください！！
多項式回帰分析

#0.はじめに
初めまして。Qiita初投稿です。

現在、エンジニアへの転職へ向けてpythonによるデータ分析などを学習しています。

自身の備忘録として書いていますので、間違いや気になるところなどあればご指摘頂けるとありがたいです。

#1.単回帰分析と多項式回帰分析
どちらも2つの量的データの関係を予測する分析手法ですが、

・単回帰分析　一次式を用いて<font color="Red">直線的</font>に予測
![qiita単回帰グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679669/7764f891-fecd-876b-9f9b-19a8c4a7b487.png)
・多項式回帰分析　多項式を用いて<font color="Red">曲線的</font>に予測
![qiita多項式グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679669/98f33e98-82de-42c7-8103-ef079832e857.png)

の違いがあります。

式で書くと、

単回帰分析・・・*y = wx + b*
多項式回帰分析・・・ *y = w<sub>0</sub>x<sup>0</sup> + w<sub>1</sub>x<sup>1</sup> + w<sub>2</sub>x<sup>2</sup> + ... + b<sub>0</sub>*

#2.pythonでの実装

###1.データの読み込み
sklearnのデータセット boston.data を使って実装してみます。
(参考[【データ解析】ボストン住宅価格データセットを使ってデータ解析する](https://qiita.com/yut-nagase/items/6c2bc025e7eaa7493f89))

まずは、データの読み込みから、

```python
import pandas as pd
from sklearn.datasets import load_boston

#説明変数となるデータ
boston = load_boston()
boston_df = pd.DataFrame(boston.data, columns=boston.feature_names)

#目的変数の追加
boston_df['MEDV'] = boston.target
```

###2.データの可視化

説明変数にRM（平均部屋数）、目的変数にMEDV（住宅価格）を使用しています。

```python
import matplotlib.pyplot as plt

#平均部屋数RMと住宅価格MEDVの散布図
x = boston_df['RM']
y = boston_df['MEDV']
plt.scatter(x, y)
plt.title('boston.data')
plt.xlabel('RM')
plt.ylabel('MEDV')
plt.show()
```

![qiita.bostonPlot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679669/9177b713-7445-40c2-9f06-f6f5e3a5dbf7.png)

###3.学習用データとテストデータに分割する

```python
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
```
###4.モデルの作成
PolynomialFeaturesの引数degreeに任意の値を指定することで、N項の多項式にすることができる。
以下では、degree=1（１項なので単回帰分析）、degree=4（４項の多項式分析）を試している。

```python
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline

x_train = np.array(x_train).reshape(-1, 1)
y_train = np.array(y_train)

#degree=1で単回帰分析
model_1 = Pipeline([
    ('poly', PolynomialFeatures(degree=1)),
    ('linear', LinearRegression())
])
model_1.fit(x, y)

#degreeの値に任意の値を指定することで、多項式分析に（以下は４項）
model_2 = Pipeline([
    ('poly', PolynomialFeatures(degree=4)),
    ('linear', LinearRegression())
])
model_2.fit(x, y)
```

###5.散布図と回帰モデルの可視化

```python
fig, ax = plt.subplots()
ax.scatter(x_train, y_train, color='blue', label='train')
ax.scatter(x_test, y_test, color='gray', label='test')

x_ = np.linspace(3, 9, 100).reshape(-1, 1)
plt.plot(x_, model_1.predict(x_), color='red', label='degree=1')
plt.plot(x_, model_2.predict(x_), color='yellow', label='degree=4')
plt.legend()
plt.show()
```

![boston多項式グラフ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/679669/c252ffa7-2b08-caaf-d0a3-714fb66e4498.png)

degreeの値を増やせば、もっとグニャグニャの線になり、学習データに対して適合した線になっていくが、増やし過ぎると過学習になってしまうので、調整が必要。

この他、正則化によって過学習を抑える方法もある。
flashメッセージ

##flashとは
paramsと似たような存在。
ハッシュなので、キーを指定しなければならない。
paramsと違い、画面遷移を１回までは、データを保持したままにしてくれる。

##制作物

以下のコードからは、bootstrapを前提としているが、レイアウトを気にしなければ参考になるはず。

<%= yield %>の上にflash用のdivを用意する。
flash[:info]における、[:info]はキーにあたる。
flash[:oshirase]と定義しても問題ない。

```erb:application/html/erb
  <main>
    <div class="my-2 bg-warning text-center text-dark" id="flash_error"><%=flash[:error]%></div>
    <div class="my-2 bg-info text-center text-dark" id="flash_info"><%=flash[:info]%></div>
    <div class="container">
        <%= yield %>
    </div>

  </main>
```

本の投稿を例にあげる。

```rb:books_controller.rb

def create
  @book=Book.new(book_params)
  if @book.save
     flash[:info]="成功しました。"
     redirect_to .....
  else
     flash[:error]="保存に失敗しました。"
     render "books/new" #もといたページ
end
tkinterのEntryから取得した値をリストの末尾に追加する

#背景
クラスがよくわかっていなかったので、自らの勉強を兼ねて書いてみた。

#クラスのコードを試しに書いてみる
試しに、以下のような簡単なクラスを書いてみる。

```python3:tkclass.py
class x:
    def __init__(self,x): #クラスを実行したときに必ず実行されるメソッド
        self.x = x
    def go(self):
        self.x = x #__init__で取得した変数xを引き継いでいる。
        print(x)
```
ここで、Xというのがクラスの名前である。
また、クラス内での関数はメソッドと呼ばれる。

ただ、ここでxの内容を入れてもこのままでは呼び出されない。
ここで、インスタンスというものを定義する

```python3:test.py
yobidashi =x(10)
```
このyobidashiが、インスタンス名(クラスを呼び出したいときの名前)である。
(10)は、xに入れたい引数を入れている。

```python3:test.py
yobidashi =x(10)
yobidashi.go()
```
実際にインスタンスを呼び出したいときは、インスタンス名.メソッド名(引数が必要な場合は引数)で呼び出すことができる。
ここでは、yobidashi.go()で、yobidashiインスタンスのうち、goメソッドだけ呼び出している

出力結果としてはこうなる。

```python3:test.py
10

```



#Tkinterでクラスを作ってみる
内容としては、EntryBoxに入れた文字を指定されたリストの末尾に代入し、その文字をStringVar()でラベルを更新する

```python3:test.py
import tkinter as tk

#客リスト
namelist=[]
#commandにクラスのメソッドを当ててみるテスト
class disp():
    e=0
    l=0
    #土台を作成
    def tki(self):
        global e
        global l
        root = tk.Tk()
        root.geometry("640x480")
        l = tk.StringVar()
        l.set("あ")
        la = tk.Label(textvariable=l,font=("Meiryo UI",60))
        la.pack()
        e = tk.Entry(width=20)
        e.pack()
        bt = tk.Button(text="登録",width=20,height=5,command=self.nameappend)
        bt.pack()
        root.mainloop()
    #list_append
    def nameappend(self):
        global e
        global l
        global namelist
        get1 = e.get()
        namelist.append(get1)
        if str(get1) == "":
            l.set("名前を入力してください!")
        else:
            l.set(str(get1)+"さんを名前リストに追加しました")
        print(namelist)
#インスタンス作成
d = disp()
d.tki()
```

出来上がりイメージ
![capture1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702737/784f31e0-6dee-d721-3f18-7000f405932f.png)

![capture2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702737/381dac49-b8c2-7f45-7dd9-1b7f8fd9e993.png)

![capture3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702737/28610eee-843c-9179-a79a-f3bf4cfa1012.png)



#参考サイト
buttonのcommandにクラスのメソッドを割り当てる方法 https://www.shido.info/py/tkinter5.html
super()の使い方 https://teratail.com/questions/85379
[Python]リストの最後から順に取り出す

# はじめに
気まぐれでアルゴリズムの問題を解くことがあるのですが、このときは普段利用しないPythonを選択しています。
その中で、Pythonにおいて「リストの最後から順に要素を取り出す」という操作をどうしたらいいのかで悩みました。

Python自体、めったに利用することがなく、基本的なfor文の書き方すら頭から抜け落ちることもあるため、
基礎から学び直しつつ、最後に「リストの最後から順に要素を取り出す」にチャレンジします。

また、こちらは、[エンジニアの新たな学びキャンペーン](https://qiita.com/official-events/716dbcb617afc83e9555)に向けた記事となります。


# まず基本的なfor文から


> ```py
for 変数 in データの集まり:
    実行する処理
```
[【基礎を全解説】はじめての人の無料で学べるPython超入門！](https://www.udemy.com/course/python-free-intro/)

適当なリストを作成し、そのリストについて操作してみます。

```python
a = ["hoge", "foo", "bar", "fuga"]
for i in range(4):
    print(a[i])
# hoge
# foo
# bar
# fuga
```

```python
for i in range(len(a)):
    print(a[i])
# hoge
# foo
# bar
# fuga
```

# 拡張for文のように書く

他言語でいうところの拡張for文のように処理することもできます
ここでは`i`はインデックスではなく、リスト内のリテラルとなります

```py
for i in a:
    print(i)
# hoge
# foo
# bar
# fuga
```

# 飛ばし飛ばしで要素を取得する

> ```py
print(list(range(0, 10, 3)))
# [0, 3, 6, 9]
```
[Pythonのfor文によるループ処理（range, enumerate, zipなど）](https://note.nkmk.me/python-for-usage/)


0を出発点、10を終了点として、3飛ばしで要素を取得することができるメソッドのようです。


# リストの最後から次々に取り出す

前述 [#飛ばし飛ばしで要素を取得する](#飛ばし飛ばしで要素を取得する)を利用して、
リストの最後のインデックスを出発点、リストの最初を到達点、-1ずつ飛ばしていくという引数指定をしてみます。


```py
a = ["hoge", "foo", "bar", "fuga"]
for i in range(len(a), 0, -1):
    print(a[i])

# Traceback (most recent call last):
#  File "Main.py", line 3, in <module>
#     print(a[i])
# IndexError: list index out of range

```

エラー文を読むと、リストのインデックスの当て方が間違っていたようです。

今回はリストの個数は4ですが、厳密には0番から3番目までに要素が格納されています。
従って、出発点は`len(a)-1`ではないかと想像します。
また、第二引数である到達点について、「この数字に達する直前の数」まで適用するため、ここに記載すべきは0ではなく-1であると想像します。

そこで以下のようなソースコードに書き換えました。

```Python
a = ["hoge", "foo", "bar", "fuga"]
for i in range(len(a)-1, -1, -1):
    print(a[i])

# fuga
# bar
# foo
# hoge
```


「リストの最後から順に取り出す」という、意図していた挙動が確認できました。
しかし-1が引数に複数含まれていて、なんとも見づらいですね。

# リストの最後から次々に取り出す（別解）

別解というよりもこちらのほうがスタンダードな気配さえするのですが、
`reverse`でリストの順序を逆転させることができるようで、これを使えばさらに簡単に目的が達成できそうです。
とはいえ、もともと用意していたリストの順序そのものが変わってしまうので、一癖はあるのかなと感じます。

```py
a = ["hoge", "foo", "bar", "fuga"]
a.reverse()
for i in a:
    print(i)
```

もとのリストの順序を変えずに済む方法も、[こちら](https://www.python-izm.com/advanced/reverse/)に紹介されていたので、これに沿って書き直してみます。

```py
a = ["hoge", "foo", "bar", "fuga"]
for i in reversed(a):
    print(i)
print(a)

# fuga
# bar
# foo
# hoge
# ['hoge', 'foo', 'bar', 'fuga']
```

# おわりに

Udemy学習応援ということで、本記事で扱ったUdemy講座の内容について、最後に触れます。

『【基礎を全解説】はじめての人の無料で学べるPython超入門！』はタイトルの通り、初心者向けの講座となっています。
他言語を少しやったことのある人向けというよりは、今からプログラム言語に初めて触れる人を対象にしており、
環境構築の方法や、変数とは何か？といったところから解説されていて、本当に土台から学べるコースになっています。

さらに無料であることも大きなポイントかと思います。

他言語の習得済みの方にとっては物足りない内容だろうなと感じる一方で、
真に初心者な方にとっては強力な教材であると感じます。

このコースの習得後に、例えばPaizaのPythonコースといった、初心者向けでありながらも やや発展的&演習問題つきの教材、
あるいは私は存じ上げないのですがUdemyの発展的教材に向かうのが良いかなと思います。

# 参考
- [【基礎を全解説】はじめての人の無料で学べるPython超入門！](https://www.udemy.com/course/python-free-intro/)
- [Pythonのfor文によるループ処理（range, enumerate, zipなど）](https://note.nkmk.me/python-for-usage/)
- [【python入門】for文のいろいろなパターンまとめ](https://kokiblog.com/2019/08/26/python_for_pattern/)
- [リストの逆順](https://www.python-izm.com/advanced/reverse/)
GitHub【プルリクエスト】

#はじめに
これは学習用のメモになります。

#プルリクエストとは？
自分が変更したコードをリポジトリに取り込んでもらえるよう依頼する機能。(チーム開発で使用)

#プルリクエストの手順(開発フロー：GitHub Flow)
`ローカル`
①masterブランチを最新に更新
②ブランチを作成
③ファイルを変更
④変更をコミット
⑤GitHubへプッシュ
`GitHub（リモートリポジトリ)`
⑥プルリクエストを送る
⑦コードレビュー
⑧プルリクエストをマージ
⑥ブランチを削除

#GitHub Flowを実践する際のポイント（チーム開発）

* masterブランチは常にデプロイできる状態に保つ
* 新開発はmasterブランチから新しいブランチを作成してスタートする
* 作成した新しいブランチ上で作業しコミットする
* 定期的にPushする
* masterにマージするためにプルリクエストを使う
* 必ずレビューを受ける
* masterブランチにマージしたらすぐにデプロイする←テストとデプロイ作業は自動化
azureのPoint-to-Site(P2S) VPNにCertificateを使ってアクセスする時にもうハマりたくない

## 概要

公式ドキュメントに書かれていた、カトリーナのの注釈を見逃していたことが原因でVPN接続できずはまってしまいました。

VPN接続を行う時に手順に従い、

`connect`

しようとすると

`An unexpected error occurred`

となってしまっていた。


## 解決策

`SystemPreference -> Network -> VPN`
において、
`Authentication Settings`
にてcertificateを追加する時、

`Authentication Settings`  のプルダウンで
`certificate`を選んでからcertificateを選ぶとエラーになる。

プルダウンで`None`を選び、
そのあとにCertificateを選択する。と接続できる。

なんでこうなっているのか理解が難しいが、もしエラーになった人は参考になるかもです。
TypescriptでMap⇄JSONを実装する

# 端書き
- いつも通りの自分用備忘録
- 参照：）[Extending TypeScript to serialise Map objects to JSON](http://codebuckets.com/2018/06/17/extending-typescript-to-serialise-map-objects-to-json/)

# 結論

```typescript
// Mapオブジェクトを作成する
let map = new Map()
let hoge = {
  setting: {
    label: 'aaa'
  },
  value: 'bbb',
  isError: false,
}
let huga = {
  setting: {
    label: 'ccc'
  },
  value: 'ddd',
  isError: true,
}
map.set('huga', huga)
map.set('hoge', hoge)
map.forEach((value,key) => {
  console.log('key: ' + key + ' value:' + JSON.stringify(value))
})
// > "key: hoge value:{"setting":{"label":"aaa"},"value":"bbb","isError":false}"
// > "key: huga value:{"setting":{"label":"ccc"},"value":"ddd","isError":true}"

// JSON化する
let toJson = JSON.stringify(Array.from(map.entries()));
console.log('toJson: ' + toJson)
// > "toJson: [["hoge",{"setting":{"label":"aaa"},"value":"bbb","isError":false}],["huga",{"setting":{"label":"ccc"},"value":"ddd","isError":true}]]"

// 再度MAPオブジェクト化する
let toMap = new Map(JSON.parse(toJson));
toMap.forEach((value,key) => {
  console.log('key: ' + key + ' value:' + JSON.stringify(value))
})
// > "key: hoge value:{"setting":{"label":"aaa"},"value":"bbb","isError":false}"
// > "key: huga value:{"setting":{"label":"ccc"},"value":"ddd","isError":true}"

```

戻った！
郵便がポストに届いたら LINE で通知がくるようにした

# はじめに

今日もまた
郵便ポストを
ポーリング

どうも。怠惰なソフトウェアエンジニアです。

郵便ポストの確認って面倒くさくないですか？
しかもだいたい届いてないですよね。
そして、番号をクルクル回すポストの鍵、僕と相性悪すぎる。

# どうしたいか

![郵便ポストくん](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13867/b2131b14-afed-f46e-8fb8-39dbbf181168.png)

# どうしたか

コイン電池で動く加速度や磁石のセンサータグ [TWELITE CUE-トワイライトキュー](https://mono-wireless.com/jp/products/twelite-cue/index.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13867/a3a0f3c2-d478-2f42-1cb8-de4682787c42.png)

と [Raspberry Pi Zero W](https://www.raspberrypi.org/products/raspberry-pi-zero-w/)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13867/5827b9b7-aebe-535e-82b5-7c48431de1b8.png)
を使って、**郵便ポストの投入口が開閉したら LINE に通知がくる仕組みを作ってみました。**

## Twelite Cue の設定

[開閉センサーパルモード](https://twelite.gitbook.io/mw-pug-cue/mode-selection/magnet-sense-pal-mode) に設定をします。

こんな感じで郵便ポストの投入口の裏側に Twelite Cue と付属の磁石を張り付けました。

![Twelite Cue を郵便ポストに設置した](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13867/9aa3d898-8190-0476-0365-549d77621a8c.gif)


## [MONOSTICK](https://mono-wireless.com/jp/products/MoNoStick/index.html) の設定

[親機・中継機アプリ](https://mono-wireless.com/jp/products/TWE-APPS/App_Wings/index.html)(App_Wings) で動かしています。

## Raspberry Pi W の設定

上記で設定した MONOSTICK(/dev/ttyUSB0) のデータをシリアル通信で取得し、磁石の状態を確認し、LINE で通知しています。
実装は自分が一番楽な [Qt で作りました](https://github.com/task-jp/mailbox) が、なんでも簡単にできると思います。
systemd のサービスとして起動時に立ち上がるようにしました。

参考：[パルアプリ > 出力例 > 開閉センサー](https://wings.twelite.info/how-to-use/parent-mode/receive-message/app_pal#sensparu)
参考：[メッセージを送信する | LINE Developers](https://developers.line.biz/ja/reference/messaging-api/#send-reply-message)

![Raspberry Pi W](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13867/de7ce923-7d4b-2474-cac9-290d50133f80.jpeg)

## （おまけ）中継器の設定

郵便ポストと親機との接続状態が悪かったので、MONOSTICK を単体で中継器として玄関に設置しました。
参考：[中継機の使用方法](https://mono-wireless.com/jp/products/TWE-APPS/App_Wings/router.html)

![中継器](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13867/3bc8b22b-e800-79a6-b024-2244c436c7d5.png)

# できたもの

![Incoming mail](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13867/bdbf9360-4983-0c42-573f-7efa6ccfdc90.png)

# 今後の予定

クルクル回す鍵も改善したかったんだけど、空振りがなくなったおかげで苦にならなくなりました。

あとは、Siri とか Alexa とかに通知しようとも思ってたんだけど、
自分のスマホに通知がくれば十分だということがわかった。

Raspberry Pi に繋がっている USB のケーブル系をもうちょっとすっきりさせたい。

４年後に電池を交換する。

~~SORACOM の「[IoT 体験キット 〜磁気センサー〜](https://soracom.jp/store/5237/)」を試してみたい。~~

試しました → [郵便がポストに届いたらメールで通知がくるようにした](https://qiita.com/task_jp/items/a32707ef9226af85a847) (2021/02/06 追記)
azure functions debug できなくなる現象

azure functions をVSCodeでデバッグしようと起動し、ブレークポイントに止まらず、
実行はうまく行く現象が発生。

うまく行く環境
AzureFunctionsCoreTools　3.0.3233
.net core sdk 3.1.300.15161

だめだったほう　3.1.404

合わせてもだめだった。

しょうがないので、VSCで起動＞VisualStudioでFunc.exeにアタッチ＆ファイル開いてデバッグでいけた。。
docker, docker-composeを ubuntu18にワンライナーインストール

## 概要

これを実行すること。

```bash

sudo apt-get update &&\
sudo apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common &&\
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - &&\
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable" &&\
sudo apt-get update &&\
sudo apt-get install -y docker-ce docker-ce-cli containerd.io &&\
sudo apt-get install -y docker-compose

```


## 備考
この後 `docker login` で謎のgoのpanicエラー(sigfault的な)が出た時は
https://qiita.com/kenmaro/items/1adc71b42088f12d1b95
これを実行する。

また、

```
ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.
Makefile:5: recipe for target 'config' failed
make: *** [config] Error 1

```

が発生した場合、

https://qiita.com/dnnnn_yu/items/14a31721a2870b735938

ここをフォローすること。（記事ありがとうございます。)
HTTP ステータスコードについて

[Real World HTTP](https://www.oreilly.co.jp/books/9784873118048/)を読んでいるので、あとで見返せるようにメモ。
備忘録。

## ステータスコードについて
送信したリクエストに対して、サーバがどのような応答をしたのかを示す3桁の数字。大きく分けると5つに分けることが可能。

### 100番台
- 処理中の情報伝達。特殊な用途で使用。

### 200番台
- 成功時のレスポンス。

### 300番台
- サーバからクライアントへの命令。エラーではなく、正常処理の範疇。
- リダイレクトやキャッシュの利用を指示。
- レスポンスのステータスが300番台かつヘッダーに**Locationヘッダー**があった場合、このヘッダーで指定されたURLに再度リクエストを送信。
- curlコマンドに-Lを付与することで、Locationヘッダーを付与可能。
```curl -L [リダイレクト先URL]```

- リダイレクトについて
    - **301/308**: リクエストされたページが他の場所へ移動した時に使用。恒久的な移動。
    - **302/307**: モバイル専用サイトにジャンプしたり、メンテナンスページを表示したりする時に使用。一時的な移動。
  - **303**: リクエストされたページには返すべきコンテンツが存在しない、あるいは本来返すべきページが別にある場合そちらにジャンプさせるために使用。（例：ログインページ→ログイン後、元のページに飛ぶ場合）

### 400番台
- クライアントから送られたリクエストにおかしなことがある場合に付与。
- 例：**404**: URLは存在しない。

### 500番台
- サーバ内部でエラーが発生した場合にクライアントに付与。
XcodeのComponentsのSimulatorがdownload済みなのに使えない時の対処法

Xcodeをuninstallしてinstallしなおした時に、前のXcodeの情報が残っていたのでその対処法を備忘録として残しておきます。

# 現象
- `Add additional Simulators` または `Window -> Devices and Simulators -> Simulators -> +` でsimulatorを追加しようとしたところ、 `OS Version`の選択にiOS 10.3が表示されない

![スクリーンショット 2021-01-22 13.48.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150615/6f86d44b-e205-248b-7af4-152662eed962.png)

- `Download Simulators` または `Xcode -> Preference -> Components` で確認するとiOS 10.3 Simulatorはダウンロード済みになっている

![スクリーンショット 2021-01-22 13.48.37のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150615/1179c550-7e4d-1523-8cd2-e560f6894a4e.png)

つまり
**ComponentsのSimulatorのOSがDL済みになっているのに、Simulator作成画面で選択できない**

# 解決策
- `~/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 10.3.simruntime` を削除
- `/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS 10.3.simruntime` を削除

**"~/Library" と "/Library" があるので注意**

無事ComponentsのSimulatorのチェックマークが外れたのでDLしなおすことができた
（未検証だが、 `/Library` のsimruntimeを `~/Library` の方に移動させれば再ダウンロードしなくても大丈夫だったかもしれない）
Googleスプレッドシートで郵便番号から住所を表示する関数 その４

# 概要
セルに郵便番号を入力することで、住所を表示してくれる関数があったらなぁと思って書いた[プログラム](https://qiita.com/KensukeSakakibara/items/01470b28fd5ec4cf3416)が動かなくなっていたので、zipcloudさんのAPIを使って書き直してみた[プログラム](https://qiita.com/KensukeSakakibara/items/a5c4da9d62d7dcb8d665)の出来がイマイチだった。
というわけで、zipcloudさんのAPIを使わずに[自前でAPI](https://qiita.com/KensukeSakakibara/items/a822177cd106948a1b35)を作成して書き直してみたもののプログラムの実行速度がアレだった。

もうこうなったらサーバごと全部自前でやっちまえ！
ってな具合にAPIサーバ建てました。

https://zipaddress.suisuinet.com/

ご興味がある方はどうぞ。
使い方は前回のものとほぼ同じです。

# 使い方
下記をスクリプトエディタにコピペすれば関数を利用できるようになります。
`=ZIP_ADDRESS("154-0004","address1")`
みたいな感じ。

利用できるデータの種類は次の通りです。
zipcode	郵便番号
prefcode 都道府県コード
address1 都道府県名
address2 市区町村名
address3 町域名

```js
function ZIP_ADDRESS(zip,part)
{
  zip = zip.replace(/\-/g, '');
  var response = UrlFetchApp.fetch('https://zipaddress.suisuinet.com/search.php?v=' + zip);
  var res = JSON.parse(response.getContentText());
  if (res.status == 400) {
    return res.message;
  }

  if (res.results) {
    var address = res.results[0];
    return (address[part]) ? address[part] : "";
  } else {
    return "該当するデータがありません";
  }
}
```

外部システムのデータを読み込むときに承認が必要と言われると思います。
そんなときはこちらの記事を参考に承認すれば大丈夫！
https://qiita.com/h-sto/items/fdde0905d0a4070d18fc
ColumnStyleのUISplitViewControllerで最初に表示されるColumnを指定する

「iPhone(compact)の環境では、初期に表示するviewControllerをmasterにしたい」という事があります。Classic StyleのUISplitViewControllerでは[splitViewController(_:collapseSecondary:onto:)](https://developer.apple.com/documentation/uikit/uisplitviewcontrollerdelegate/1623184-splitviewcontroller)というDelegateを使えば良いという記事が出てくるのですが、Column Styleを利用しているとClassic StyleのAPIは呼ばれないことになっており、利用できません。

代替となるColumn StyleのDelegateメソッドやプロパティを探したところ、[Apple Developer Forum](https://developer.apple.com/forums/thread/656014)で発見したので紹介します。(そこからlinkされている[StackOverFlow](https://stackoverflow.com/questions/63237929/uisplitviewcontroller-in-ios-14-works-as-intended-in-landscape-mode-but-not-in))

# API
[splitViewController(_:topColumnForCollapsingToProposedTopColumn:)](https://developer.apple.com/documentation/uikit/uisplitviewcontrollerdelegate/3580925-splitviewcontroller?changes=latest_major)

# 使い方
`.primary`や`.secondary`など、任意のColumnを返します。そうすると初期表示のColumnが変更されます。

```swift
func splitViewController(_ svc: UISplitViewController, topColumnForCollapsingToProposedTopColumn proposedTopColumn: UISplitViewController.Column) -> UISplitViewController.Column {
    return .primary
}
```
circleciでgitのtagによってworkflowを発火させるときはbranchをignoreしておかないといけない

表題の通り。よくマニュアルを読むと書いてあるが、そこを見つけるのに時間がかかったのでメモ。

https://circleci.com/docs/2.0/workflows/#executing-workflows-for-a-git-tag

branchでfilterしてるときはtagに変化あっても発火しないのにtagだけこうなるのは謎。原因知ってる人居たら教えてください。

```yml
workflows:
  main:
    jobs:
      - main-jobs # ソースコードの変化があったときに発火する(tagのみpushされたときは発火しない)
  branch:
    jobs:
      - branch-jobs: # branch-test ブランチでのみ発火する
          filters:
            branches:
              only: branch-test
  tag:
    jobs:
      - tag-jobs: # tag-test タグが発行されたときのみ発火する
          filters:
            branches:
              ignore: /.*/ # これ入れないとタグに関係なく発火する
            tags:
              only: tag-test
```
dockerをubuntuにインストール後、docker login できない問題解決備忘録

## 概要

`$ docker login registry.gitlab.com`
等のコマンドで、

```
 SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x5647add8ed76]

goroutine 1 [running]:
github.com/docker/cli/cli/command.ConfigureAuth(0x5647af9cfce0, 0xc00050d6c0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5647af93f100, 0xc000414eb0, 0xc00059b968)
	/go/src/github.com/docker/cli/cli/command/registry.go:128 +0x46
github.com/docker/cli/cli/command/registry.runLogin(0x5647af9cfce0, 0xc00050d6c0, 0x7ffdf63d38a5, 0x13, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, ...)
	/go/src/github.com/docker/cli/cli/command/registry/login.go:123 +0x223
github.com/docker/cli/cli/command/registry.NewLoginCommand.func1(0xc000138dc0, 0xc0005e37f0, 0x1, 0x1, 0x0, 0x0)
	/go/src/github.com/docker/cli/cli/command/registry/login.go:45 +0xcc
github.com/docker/cli/vendor/github.com/spf13/cobra.(*Command).execute(0xc000138dc0, 0xc000364410, 0x1, 0x1, 0xc000138dc0, 0xc000364410)
	/go/src/github.com/docker/cli/vendor/github.com/spf13/cobra/command.go:850 +0x462
github.com/docker/cli/vendor/github.com/spf13/cobra.(*Command).ExecuteC(0xc000139b80, 0xc000364400, 0x2, 0x2)
	/go/src/github.com/docker/cli/vendor/github.com/spf13/cobra/command.go:958 +0x34b
github.com/docker/cli/vendor/github.com/spf13/cobra.(*Command).Execute(...)
	/go/src/github.com/docker/cli/vendor/github.com/spf13/cobra/command.go:895
main.runDocker(0xc00050d6c0, 0x5647af941de0, 0xc000010020)
	/go/src/github.com/docker/cli/cmd/docker/docker.go:287 +0x1d3
main.main()
	/go/src/github.com/docker/cli/cmd/docker/docker.go:298 +0xf3
```

となる。。


## 解決方法

```
sudo apt remove -y golang-docker-credential-helpers
```

とりあえずこれで大丈夫になる。。
【Rails】seedとFakerでランダムなサンプルデータを作成

#はじめに
データベースに予め大量のデータを入れておきたいとき手動では大変です。
この記事ではseedとFakerを使って、自動でランダムなサンプルデータを作成する方法を紹介します。


####seedについて
seedファイルは、データベースにあらかじめ入れておきたいデータを定義しておくものです。
データをあらかじめ定義し`rails db:migrate`することで、簡単にDBへデータを投入できます。


####gem 'faker'について
Fakerとはランダムな値を入れられるgemです。
　Gemfileの中にgem 'faker'を追記し、 bundle installコマンドを実行することで使用出来る様になります。


詳しくは下記の公式ページを参照してください。
【公式】
https://github.com/faker-ruby/faker

#開発環境
ruby 2.6.5
Rails 6.0.3.4
faker 2.15.1
gimei 0.5.1


#fakerインストール

```:Gimile
gem 'faker'
gem 'gimei'
```
`gimei`は、日本人の名前や、日本の住所をランダムに返すGemです。

```:ターミナル
bundle install
``` 

今回demosデーブルに200件のダミーデータを追加します。

```ruby:db/seeds.rb
require 'faker'

200.times do |n|
  sample_name = Gimei.kanji
  sample_kana = Gimei.katakana
  sample_email = Faker::Internet.email
  sample_tel = Faker::Number.number(digits: 11)
  start_time = Faker::Date.forward(50)
# start_time = Faker::Date.between(from: '2021-01-01', to: '2021-04-30') #期間を限定することもできます。
  Demo.create!(
    sample_name:         sample_name, 
    sample_kana:         sample_kana, 
    sample_email:        sample_email, 
    sample_tel:          sample_tel, 
    sample_product_name: "京都ツアー", 
    price:               "19600", 
    num_id:              "2", 
    start_time:          start_time, 
    sample_id:           "1", 
    created_at:          "2021-01-01 00:00:00",
    updated_at:          "2021-01-01 00:00:00"
  )
end
```

```:ターミナル
rails db:seed
```

データベースを確認します。
![スクリーンショット 2021-01-13 8.32.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/382be094-8645-31bb-feae-d4114a044dcd.png)
サンプルデータ作成完了です！

#まとめ
fakerの使い方さえわかれば非常に簡単です。
このデータを検索機能のサンプルにするのも良いと思います。

###最後に
同じ様に悩んでる方々の助けになればと思い、記事を投稿しております。
それでは、また次回お会いしましょう〜


#参考
【公式】
https://github.com/faker-ruby/faker
【備忘】Ubuntu 20.04　インストール

# 環境情報

* サーバー：FUJITSU server PRIMERGEY RX2530 M2
* OS：Ubuntu 20.04.1

# 手順

1. サーバーのRAID設定
2. OSイメージのダウンロード<br />
[Ubuntuのサイト](https://releases.ubuntu.com/20.04/)からAMD64のサーバー用イメージをダウンロード
3. OSイメージをNFS経由でマウントできるよう設定<br />
iRMC（PRIMERGYのIPMI機能）の`Virtual Media` > `Remote Image Mount`
から設定
![remote_image_mount_connected.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350260/0ca0c29c-8a02-3a75-50c6-cee250227ef8.png)
4. マシンを再起動し、マウントしたイメージからブート
5. iRMCの`Video Redirection`を使用して、コンソールを起動
6. 言語設定<br />
`English`を設定
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350260/ff5a0cd9-83fe-a49b-e66c-85910f45fd4d.png)
7. キーボード設定<br />
`Japanese`/`Japanese`を指定
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350260/c38cc50e-753e-de12-b437-67d7ddd33dc4.png)
8. NIC設定<br />
とりあえずSSH接続で使用するNICの設定を実施。
他のNICは、OSインストール後に設定するので、ここでは実施しない。
![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350260/cac09115-f483-3d2c-bcf5-8679676ddcce.png)
9. proxy設定<br />
OSインストール後に実施するので、ここでは実施しない。
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350260/f71020fc-337e-5983-8963-44fca36fb53a.png)
10. ストレージ設定<br />
システムディスクの設定だけ実施。
他のディスクはOSインストール後に実施。
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350260/28065c39-19e6-6b2a-7cef-ca5c2a1c9469.png)
11. ホスト名、ユーザー名等の設定<br />
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350260/ae1c8ad9-0b15-3e79-f72d-12d573dc13be.png)
12. OpenSSHのインストール設定<br />
SSHでログインするために、インストールする。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350260/2784d47c-8e90-91f6-567d-efa92a188899.png)
13. 再起動
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350260/62c8275e-6838-58a1-12af-1a5209783efd.png)
14. OSイメージのアンマウント<br />
iRMCから実施。
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/350260/c5af0ad2-924d-f4e2-0c6b-857147420bea.png)
15. SSHでログインできることを確認

```
Last login: Fri Jan 22 05:26:32 2021
ubuntu@bootstrap:~$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="20.04.1 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.1 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```
CLIでUbuntuのGUIのインストール方法

## 前提
 - Ubuntuの起動ができていること。

 - CLIが表示されていること。

 - sudoが実行できるものでログインできていること。

**もし、分からなかった場合はネットなどで調べてください....**

:::note warn
CLIでUbuntuのGUIのインストール方法だけを記載してあります。
:::

## この記事で使用した環境
| 名称 | 詳細| 
| :-- | --: |
| クラウドサーバー | Linode |
| / Linode Plan | Nanode 1GB |
| // Ubuntu | v20.04 LTS |
| // RAM | 1GB |
| // CPU | 1 |
| // Storage | 25GB |

# 導入手順
Ubuntuのパッケージを更新する。最新のセキュリティパッチとバグ修正が適用されます。

```shell-session
$ apt-get update && apt-get -y upgrade
```
```shell-session
# なんか色々と出てくる。もしエラーがでても基本的には問題ないので無視...
```
ユーザーを追加する。(すでにユーザーがある場合は実行しなくてもいいです。)
`user_name`はユーザー名に置き換えてください。

```shell-session
$ adduser user_name
```
```shell-session
Adding user `user_name' ...
Adding new group `user_name' (1002) ...
Adding new user `user_name' (1002) with group `user_name' ...
Creating home directory `/home/user_name' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:  # パスワード入力
Retype new UNIX password: # パスワード入力（確認）
passwd: password updated successfully
Changing the user information for user_name
Enter the new value, or press ENTER for the default
        Full Name []:    # Enter連打
        Room Number []: 
        Work Phone []: 
        Home Phone []: 
        Other []: 
Is the information correct? [Y/n] Y  # Yes
```

> **必要な人のみ:**　sudo グループに追加して管理者権限を与える。~~(もし初心者の場合でよく分からない場合はセットアップ完了してなんかしら実行するときエラーが発生して実行できないトラブルを避けるために一応実行しておくことをおすすめする)~~
`user_name`はユーザー名に置き換えてください。

```shell-session
$ adduser user_name sudo
```
`ubuntu-desktop`をインストール

```shell-session
$ sudo apt-get -y install ubuntu-desktop
```
:::note warn
ubuntu-desktop のインストールが終わったら、再起動する。
:::

## 不要なソフトウエアの削除

libreoffice, thunderbird が不要なときは、次のように実行

```shell-session
sudo apt purge libreoffice*
sudo apt purge thunderbird*
sudo apt -y autoremove
sudo apt autoclean
```

## GUI表示する方法
表示する方法がいくつかある。

1. リモートでVNCを使用して表示する。
1. ソフトウェア(仮想環境など)で直接ローカルでアクセスして表示する。
1. クラウドサーバーにある機能を使いアクセスする。(Linodeだとこんな感じ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/946490/2cf4d619-647d-74ea-2a71-78e62fc8245f.png)
1. etc...
テキストデータをキーワードで区切ってブロックごとに配列に入れる

同じテキストデータにいろいろ書きこんじゃったけどそれぞれのデータを区分して配列に入れたいとき、ありますよね。

```a.py
filename = 'yourtxt.txt'
keyword = '区切る言葉'

with open(filename, 'r', encoding='utf-8') as f:
  text = f.read().splitlines()
 
  sp_num =[]
  sp_txt =[]
  a = 0
  num = 0


  while num != len(text):
      num = text.index(keyword,a,len(text))
      sp_txt = list(text[a:num])
      print(sp_txt)

      a = num+1

```

while文でテキストファイルの終わるまで繰り返す。
キーワードがあるたびに次のキーワードの一つ前までの単語をリスト化して配列に入れます。
そもそもsplitlinesして読み込んだファイルを行ごとに分割しているのですが、これはテキストデータが結構箇条書きっていうのは大きいです。
長文の場合は少し変わってくるかと思います。
CSS記述

colorプロパティ
==
文字色指定

font-sizeプロパティ
==
文字の大きさ指定

heightプロパティ
==
要素の高さ指定

widthプロパティ
==
要素の幅指定

displayプロパティ
==
値によって要素の種類を指定
　・block
　　ブロックレベル要素
　・inline
　　インライン要素
　・flex
   小要素が横並びになる
　・none
　　非表示

justify-contentプロパティ
==
display:flex;と併用
水平方向の小要素の並び順、幅を指定
　・flex-start
   左寄せ
　・flex-end
   右寄せ
　・center
   中央寄せ
　・space-between
   両端は左右に寄り等間隔
　・space-around
　　両端の余白1:要素感の余白2

align-itemsプロパティ
==
display:flex;と併用
垂直方向の小要素の並び順、幅を指定
　・flex-start
   上揃え
　・flex-end
   下揃え
　・center
   中央揃え

flex-directionプロパティ
==
要素の主軸方向、並び順を変更
　・row
   左から右
　・row-reverse
　　右から左
　・column
　　上から下
　・column-reverse
　　下から上

borderプロパティ
==
ブロックレベル要素のみ指定可能
太さ、スタイル、色の変更
　・solid
   1本線
　・double
   2本線

paddingプロパティ
==
ブロックレベル要素のみ指定可能
内側の余白指定
上下4方向別に指定可能

marginプロパティ
==
ブロックレベル要素のみ指定可能
外側の余白指定
上下4方向別に指定可能

positionプロパティ
==
要素の配置方法を指定
　・relative
　　相対的な位置を決める
　・absolute
　　絶対的な位置を決める
　・fixed
　　指定した位置に固定

viewport
==
ブラウザで表示されている領域

vh
==
viewport height
viewportの高さに対する割合
1vh = 1%

vw
==
viewport width
viewportの幅に対する割合
1vw = 1%

calc()
==
widthプロパティに使用
()内に計算式を入れ、計算結果を値に出来る
異なる単位でも計算可能

％
＝＝
親要素を100%として、小要素のサイズを何%で表示するか指定できる

font-weightプロパティ
==
文字の太さを指定
　・normalやboldの他、数値も指定可能

text-decorationプロパティ
==
下線や上線の表示、非表示などを指定
【初期化する方法】Ruckusのアクセスポイントはクセがつええ

#RuckusのAPはクセがつええ

![faw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/a8ef0f06-4906-4be7-3775-bff4cf4caf3b.png)


#参考記事
こちらの記事の一番上の回答が参考になります。
https://forums.ruckuswireless.com/conversations/default_topic/i-push-the-reset-buttom-for-more-than-15-seconds-and-now-i-cant-get-teh-dir-ip-19216801-to-set-up-the-wireless/5f91c3df135b77e2478bed0a

#手順

##(1)初期化ボタンを押す
機種によって初期化ボタンの位置が違うのですが、
ものによっては、PoE差込口の横だったり、裏面に親切にRSTってかいてあったり。

これ、本当にリセットボタンなの？！みたいなところにあるんで、本当に（涙）です。

とりあえず、15秒くらいは押してください。

##(2)有線接続する
市販のAPはリセットすると、APにSSIDが書いてあって勝手にwifiが立ち上がるのですが
Ruckusは違います。

wifiを待ってたら日が暮れます。

有線接続して、192.168.0.1にアクセスをします。

（そのときに、自分のIPアドレスを192.168.0.2-230くらいの間にしておくことを忘れずに。）

まずは、pingが遅れているかを確認して、ブラウザで192.168.0.1にアクセス。

パスワードは、AP本体に書いてあります。

これで管理ページにはいります。

設定も英語で難しい！！！