OmniAICreator/Qiita-1.07M huggingface dataset:
iOS Simulator で PCのキーボードで@と_を入力する方法

##アプリをSimulatorでテスト中

iOS SimulatorではPCのキーボードで文字入力が出来る。
https://qiita.com/colorrabbit/items/478ddd1e796b202c7325

Simulator上のキーボードをクリックするよりも楽ちん。

あれ、@と_が入力できないぞ...
##解決方法

|文字|Simulatorでの入力方法|
|:---:|:---:|
|@|[Shift] + [2]|
|_|[Shift] + [-]|
RSSのデータをZabbixへ格納する(外部チェック編)

　RSS のアップデートを Zabbix で監視する仕組みを簡単に作ってみました。Zabbix 単体の機能では実装できないため。Zabbix の外部チェックを使用し実装してみました。
　RSS をテキストに出力し、前回との差分を取得するという形でも良かったのですが、Zabbix サーバに障害が発生し、別のサーバで稼働させるとなったときに、チェック用のファイルをわざわざ移すのは面倒だし、絶対に忘れると思い、外部チェックを選択しました。

## 環境
- CentOS 8.0 (インターネットへアクセスできること)
- Python 3.6
- Zabbix 5.0

## 実現したこと
- Python を使って RSS を取得する
- 前回からのアップデート分を取得し、Zabbix のアイテムへ格納する

## ここではお話しないこと
- Python の初期設定方法
- Zabbix のインストール方法
- Zabbix の一般的な機能説明

## Pythonで実現したこと
　Python では、RSS をインターネット経由で取得し、タイトル、更新日を取得し、1行に書き出すという処理を行いました。最終的に Zabbix へ転送させるため、出力はテキストです。
（API を使えば、JSON 形式でも行けるかもしれませんが、今回はやっていません。）
　なお、Zabbix に重複したデータを送りたくないため、全件取得ではなく、前回の取得時間からの間に更新された記事のデータを取得する方式にしました。

　出力については、Zabbix の外部チェックは標準出力の結果をアイテムに格納するため、print で出力を行っています。

　コードは以下の通りです。

``` RSS_Checker.py
#!/bin/env python3
import feedparser
from datetime import datetime, timedelta, timezone

# 前回の期間を設定 (今回は1時間前の時間を指定)
lasttime = (datetime.utcnow() - timedelta(hours=1))

# RSSの取得
RSS_URL = "(URLを指定)"
feed = feedparser.parse(RSS_URL)

# 前回の時間以降にアップデートされた記事を取得
def f(entry):
    return datetime(*entry.updated_parsed[:6]) >= lasttime

# フィルタ関数を使用しデータを選定
rdflists = filter(f, feed.entries)

# 何もない時は処理を終わる
if not rdflists:
    sys.exit()

# データがあるときは、出力を行う
for entry in rdflists:
    title = entry.title
    link = entry.link
    time = entry.updated

    print (title, link, time) 

```

## Zabbixサーバへのコードの配置
　Zabbix の外部チェック機能を使用する場合は、zabbix_server.conf の ExternalScripts のパスにスクリプトファイルを配置する必要があります。デフォルトは以下のフォルダが指定されています。

```
ExternalScripts=/usr/lib/zabbix/externalscripts
```

　また、Zabbix ユーザが実行できるように、実行権限と所有者設定もお忘れなく。

```
# cd /usr/lib/zabbix/externalscripts
# chmod 744 RSS_Checker.py
# chown zabbix:zabbix RSS_Checker.py
# ls -l
-rwxr--r-- 1 zabbix zabbix 1200 Jan 01 01:23 RSS_Checker.py
```


## Zabbixで設定したこと
　Zabbix では、専用の Item を作成します。

![Item 設定画面.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103369/43c1fa0d-8a1b-ed6e-0662-b986eaea57c7.jpeg "Item 設定画面")

　タイプは「外部チェック」を選択。データ型はテキストを選択しています。なお、ホストインターフェースは、Zabbix サーバで実行するため、「127.0.0.1:10051」を指定します。
　監視間隔については、コードで指定した差分時間と合わせる必要がありますので、適宜変更が必要です。コードの間隔が長いと、データが重複して格納される可能性があり、Item の監視間隔が長いと、取得漏れが発生する可能性があります。

## うまくいかなかったこと
　この構成で、Zabbix の Item にデータが格納されましたが、2つ問題が発生しました。

1. 出力された更新情報が複数ある場合でも、Zabbix では1レコードとして格納されてしまう
2. 更新情報が無い場合でも、空のレコードが作られてしまう。

　Trigger で文字列を拾って通知を行う場合は特に問題はないのですが、どうも美しくないなぁ…と。少し調べては見たのですが、外部チェックのテキスト格納の動きについて、調べることができませんでした。Item のデータ型を「ログ」や「文字列」にしても同じ結果でした。

　この事象に対する解決方法は見つけられませんでしたが、取り込むことができたので、一旦完成としました。

　うーん、でもやはり美しくない。。

(続く)

### 参考サイト
- [Pythonでrssからデータを取得する方法 - 知的好奇心](https://intellectual-curiosity.tokyo/2019/03/28/python%E3%81%A7rss%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/)
- [Python, feedparserでRSS, Atomフィードを解析 - note.nkmk.me](https://note.nkmk.me/python-feedparser-tutorial/)
React.js とは？（学習備忘録）

#内容
・Reactとは
・基本ルール
・用語
・ファイル構成

環境設定に関しては、別記事にて記述します

#Reactとは
・Facebook社が開発したJavaScriptのライブラリ
・SPAで制作できるため、動作が早い(virtualDOM)
・component毎で作成する為、部分的に拡張や差し替えがしやすい
・IOS、androidのアプリケーションを作成でできる

###基本ルール
・Reactでレンダリングを指定したエリア内はすべてReactで生成する
・Reactはパーツ設計 component(パーツ)を組み合わせて構築する
・Reactは 値 = stateを元にDOMを作る
・stateは自身の「state」と上位から受け継いだ「state(=props)」が使える
・React内の HTML は JSX を使用して書く
・React自身ではスタイリング(CSS)しない

###用語
・component(コンポーネント)
　　L HTMLで表示されるUI部品
　　　function Component　関数型で定義されたコンポーネント
　　　class Component　クラスで定義されたコンポーネント

・プロパティ
　　L コンポーネントに付加する属性

・props
 　L = プロパティ  コンポーネント利用時に属性として設定できる値

・state(状態)
　　L コンポーネント内で管理する変数
　　　ローカルステート：Reactのコンポーネントの中だけで使えるstate
　　　グローバルステート：ReactのライブラリのReduxを使い、どのコンポーネントからでも参照できるstate

・render
　　L メソッドの一つ　renderメソッド内でreturnをし、JSXを返す

###ファイル構成
・src　：コンポーネントを作るjsファイルを扱う
・public ：htmｌファイルや設定ファイルを扱う
・built　：本番環境用に圧縮整理されたファイルを扱う(npm run build で出来る)
**※環境設定をCreate-React-Appで行うとsrcフォルダとpublicフォルダが用意されます**
Google Colab で GIF動画をインライン表示させる

#1.はじめに
　Google Colab で インラインに**GIF動画を表示**させたくなったのですが、方法が直ぐ分からず色々調べたので、備忘録として残します。

#2.方法
　**Ipython.display** を使うと簡単です。

```python
from IPython.display import Image
Image('./movie_256.gif', format='png')
``` 
![movie_256.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209705/8750fc77-6674-e902-770f-7ac223aaa9e1.gif)
以上です
Terraform で利用するイメージIDの取得方法

#はじめに

こんにちはhagiです。動画チームからRackspace事業部に昨年後半に移動いたしました。

cloudpackに入社してから動画一色だったわけですがRackspace事業部ではBuild Engineerポジションでインフラ構築を担当しています。（動画チームのインフラ担当でした）

環境を構築する都度TerraformやCloudFormationのテンプレを作成してから展開しております。 

Terraformなどでテンプレ化をしてから展開すると構築過程全体のスピードが上がります。もちろんインスタンスが少ない場合、AWSなので”ポチポチ”で簡単に環境を作成することができます。ただしその分設定漏れや環境全体の再現（再構築など）が複雑になったりすることがあります。
RackspaceのテンプレにはCloudWatchの監視項目やAutoscaleグループの設定、またサポートチームへの通知項目がデフォルトで含めていたり、セキュアなインスタンスへの接続するためのツールがインスタンス起動時から利用できます。
そのためインスタンスでの構築スピードは”ポチポチ”より遅くても構築からマネージドまでのスピードには分があるかなと思ってます。

#なぜAMI IDを探す？

さてそんなこんなでTerraformを利用しているのですが新規インスタンスを起動する際、AMIのIDがわからない場合があります。

AWSのコンソールからの場合、マーケットプレースから探して選んで”SELECT”を押すだけだがTerraformの場合AMI IDが必要。。。

AMI IDはAWSコンソールからインスタンスを立ち上げてから確認することはもちろんできます。それでAMI IDを記録してからTerraformのスクリプトに書き込めば良い。（今書きながらこっちの方が早い気がしてきたw）

ただしmarketplaceのAMIはお金がかかる場合がある、立ち上げっぱなしになってたら怒られるかも、お客様環境でやってたらちょっと挙動不審などいろいろ説明が面倒な場合もありそう。そこでRackspace事業部のことを軽く紹介しながらAMI IDの検索方法を記事にしました。

#describe-imagesで確認

今回はCentOSのAMI IDの確認方法を記述いたしますが基本これで他のも探すことが出来ます。

awscliのec2コマンドでは`describe-images`オプションでマーケットプレースのAMIをフィルターすることが出来ます。

https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html

例えばこんな感じです。

```
aws ec2 describe-images --owners  aws-marketplace --filters Name=name,Values="[名前]" --region [リージョン]
```

例：

```
aws ec2 describe-images --owners  aws-marketplace --filters Name=name,Values="CentOS Linux 7*" --region ap-northeast-1
```

情報がいっぱい

```
aws ec2 describe-images --owners  aws-marketplace --filters Name=name,Values="CentOS Linux 7*" --region ap-northeast-1 --query 'reverse(sort_by(Images, &CreationDate))[:5].[Description, ImageId]' --output text
CentOS Linux 7 x86_64 HVM EBS ENA 2002_01       ami-06a46da680048c8ae
CentOS Linux 7 x86_64 HVM EBS ENA 1901_01       ami-045f38c93733dd48d
CentOS Linux 7 x86_64 HVM EBS ENA 1805_01       ami-8e8847f1
CentOS Linux 7 x86_64 HVM EBS ENA 1804_2        ami-3185744e
CentOS Linux 7 x86_64 HVM EBS ENA 1803_01       ami-91c4d3ed
```

--queryのreverseとsort_byをつけることによって最新AMI順にされます。

これで最新のAMI IDを確認：ami-06a46da680048c8ae

queryの利用方法は下記AWSページをご参照ください。

https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-output.html#cli-usage-output-filter

#補足

CentOSの場合、Product codeもCentOSより提供されております。

https://wiki.centos.org/Cloud/AWS

必要に応じてproduct-codeをフィルターにするのもありですね。

```
--filters Name=product-code,Values=[ProductCode]
```

#最後に

すごく簡単でしたがdescribe-imagesを使ってのAMI IDの確認方法を記述しました。
Rackspace事業部の業務内容に興味がある方は下記URLもご確認ください。

https://rackspace.jp/

以上よろしくお願いいたします。
【Laravel】Laravel6からstr_randomとarr_randomヘルパが使えない

###自分の環境
Laravel 7.x

###経緯
ログイン機能実装の勉強をする上で、Seederを編集するときに参考にしたコードが`str_random(10)`を使用。これでSeederを作成していました。

そして作成したSeederを実行するときにエラー発生。なんでやねんってなって、エディタ上でstr_randomの色がおかしい気がしたので`laravel str_random(10)`でググった。

そしたらLaravel6からヘルパが削除されたらしい。

そして
https://readouble.com/
で`random`で検索したら、ちゃんと説明が書いてありました。


###ヘルパが削除されたらしいが、使えるようにすることもできるらしい

下記のブログを参考にしました
https://oversealife.work/2019/09/11/laravel-6-helper/

```
$ composer require laravel/helpers
```

これでヘルパーのライブラリがインストール。
これで

```
str_random(10)
```
が使えるようになりました。

###そんな便利なものがなぜ使えなくなったの？

結論、randomな文字列の生成はできます。

```
Str::random(10)
```
という感じの書き方に変わっただけ。

https://readouble.com/laravel/7.x/ja/seeding.html?header=%25E3%2582%25B7%25E3%2583%25BC%25E3%2583%2580%25E3%2582%25AF%25E3%2583%25A9%25E3%2582%25B9%25E5%25AE%259A%25E7%25BE%25A9



```php5:DatabaseSeeder
<?php

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB; // 自分のには書いてませんでした大丈夫でした
use Illuminate\Support\Facades\Hash; // 自分のには書いてませんでした大丈夫でした
use Illuminate\Support\Str; // 自分のには書いてませんでした大丈夫でした

class DatabaseSeeder extends Seeder
{
    /**
     * データベース初期値設定の実行
     *
     * @return void
     */
    public function run()
    {
        DB::table('users')->insert([
            'name' => Str::random(10),
            'email' => Str::random(10).'@gmail.com',
            'password' => Hash::make('password'),
        ]);
    }
}
```

ちゃんと説明がありました。
useが初期状態では最初の一つしか書いてませんでしたが、
`Hash::make`も`Str::random()`も使えました。

ちゃんとハッシュも生成されてました。



###配列のrandom

```
Arr::random($array, 要素数);
```
最初だけ変えればOK！！
AtCoder Beginner Contest 176 B問題「Multiple of 9」解説(Python3,C++,Java)

Ruteです。
この記事は先ほどの<b>A問題</b>の解説の続きになります！

##各問題・解説へのリンク

|A|B|C|
|---|---|---|
|[ABC176 A](https://qiita.com/rute_not_route/items/4c3497ca95e0fd75a629)|この記事です！！|[ABC176 C](https://qiita.com/rute_not_route/items/5f9c1f899cc4b10c23ce)|

それでは、<b>B問題</b>の解説を行います。

#問題概要
$N$が$9$の倍数であるかを判定して下さい。

##制約
・$0 \leq N \leq 10^{200000}$
・$N$は整数

今回は、Python3とC++,Javaで解法が異なりますのでご了承下さい。

#解説
##解法1(Python3の場合)
＊後で説明する解法2でも解けます。
Python3の場合は、<b>`int`型で表せる整数に限度がない</b>ので、以下のような条件分岐を書くことでACすることが出来ます！
<font color = "gray">(厳密に言うと多倍長整数を扱うことが出来るということです)</font>

```{ABC176B.py}
print("Yes") if int(input())%9 == 0 else print("No")
```

※ここではコードを短縮しましたが、短縮しないで解いても問題ありません。


##解法2(C++,Javaの場合)
今回の制約に注目してみましょう。
<font color = "red">・$0 \leq N \leq 10^{200000}$</font>

そうです、$N$の範囲が$10^{200000}$までとなっています。
$10^{64}$が<b>1無量大数</b>なので、$10^{200000}$は<b>とてつもなく大きな整数</b>であるといえます。

このような整数だと、C++では<font color = "red">`int`型どころか`long long int`型でも表せなくなります。</font>
(Javaの場合だとこれが`long`型になります)

そこで皆さん、$9$の倍数の性質について確認してみましょう。
まずはこちらの動画をご覧下さい。

[9の倍数の性質(ネタ元:トリビアの泉)](https://www.youtube.com/watch?v=0qLUIM9wagc)

<br>
<br>
<br>


<b><font color = "red"><font size="30">9のかけ算の答えは数字同士を足していくと必ず9になる</font>

これは、<b>$9$の倍数である場合は桁和が$9$で割り切れる</b> ということと同値になります。
<font color = "gray">(問題文にもこれと同様のことが記載されています)</font>
つまり、<b>桁和が$9$で割り切れるかどうかを判定する</b>　という単純な問題に置き換えることが出来ました。桁和を求めるには<b>文字列の長さ分の線形時間</b>がかかりますが、制約の範囲では実行時間制限に間に合います。

以下、解法2での解答例を、Python3,C++,Javaの3言語で示します。

##各言語解答例(解法2)

<details><summary>Python3での解答例</summary><div>

```{ABC176B2.py}
N = input()
ans = 0
for i in range(len(N)):
  ans += N[i]
print("Yes") if ans%9 == 0 else print("No")
```




</div></details>

<details><summary>C++での解答例</summary><div>

```{ABC176B2.cpp}
#include<bits/stdc++.h>
using namespace std;
int main(){
  string s;
  cin >> s;
  int ans = 0;
  for (int i = 0; i < s.size(); i++){
    ans = ans +  int(s.at(i))-48;
  }
  if (ans%9==0){
    cout << "Yes" << endl;
  }else{
    cout << "No" << endl;
  }
}

```
*ASCIIコードの性質を利用して桁和を計算しました。
ASCIIコードでは`'0'`が`48`, `'9'`が`57`であるため、ASCIIコードから48を引くことで、文字列を整数に直すことができます。

</div></details>

<details><summary>Javaでの解答例</summary><div>

```{ABC176B2.java}
import java.util.Scanner;
public class Main{
  public static void main(String[] args){
    Scanner scan = new Scanner(System.in);
    String S = scan.next();
    int ans = 0;
    for (int i = S.length(); i > 0 ; i--){
      ans = ans + Integer.parseInt(S.substring(i-1,i));
    }
    if (ans % 9 == 0){
      System.out.println("Yes");
    }else{
      System.out.println("No");
    }
  }
}

```

</diiv></deteils>
情報システムの可監査性

応用情報技術者平成30年秋期 午前問60

情報システムの可監査性を説明したものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7aeb7120-62ba-ff7d-60ac-d9546a932146.png)


１、可監査性(Auditability)とは、ログや処理手順が完備され、業務処理の正当性や内部統制を効果的に監査又はレビューできるように情報システムが設計・運用されている度合いを指す言葉です。簡単に言えば「監査が実施可能であること」を意味します。システム監査を円滑に実施するため、情報システムは可監査性を意識して構築、整備されなければなりません。



参照：
https://www.sc-siken.com/kakomon/30_aki/am1_22.html
アセットパイプラインについて

この記事は文字のみのため理解しづらい部分があるかと思います。


**完全に自分自身のアウトプットのためなので読みにくいなと感じたらこちらの記事を参考にしてください。**

[Rails初学者がつまずきやすい「アセットパイプライン」](https://www.transnet.ne.jp/2016/02/28/rails%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%8C%E3%81%A4%E3%81%BE%E3%81%9A%E3%81%8Dcolnr%E3%80%8C%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3/)


**アセットパイプラインについて**

そもそも前提としてRuby on Railsはどのようなアプリケーションを開発する際にも
共通して作成する必要がある物を自動的に作ってくれているフレームワークです。




例えばメールのテンプレート文なんかは御中だとか一番下の行には自身の詳細情報を載っけていたりしますよね。Ruby on Railsも同じで作業を効率化するためにフォーマットを用意してくれます。




私たちが画面越しに情報を見れているのはHTMLの情報をみていますよね。css, JavaScriptなんかはその情報を鮮やかにしてくれます。

そのHTMLとCSS、JavaScriptが紐付かせることによって私たちは情報を見れます。。Ruby on Rails では、この仕組みがアセットパイプラインによって実現されるようになっています。


初学者の私はherokuにデプロイした際レイアウトが崩れたりjsがうまく働いてくれなかったりします。

理由としてはローカルの環境とアセットパイプラインの挙動が違うことが挙げられるみたいです。

**アセットパイプライン仕組みについて**



アセットパイプラインはRails内で使用したいファイルを分割してコーディングできるように設定して最終的にそれらのファイルを一つにしてしまうという仕組みです。




私のイメージは新世界に入るためにそれぞれもっと強くなるべく二年間修行してシャボンディ諸島で集まった麦わら一族をイメージしています。

詳しく書くと

ビューディレクトリのルフィもjsディレクトリのゾロも最終的にはアセットパイプラインする（メリー号に集まる）みたいなイメージです。

このようにディレクトリ、ファイルを分けるのは開発者に何がどこに記載されているか分かりやすくさせるためにしているという認識で良いでしょう。



しかしそれらのディレクトリをそのまま一つのwebページとして扱うことはできません。なのでアセットパイプラインをして一つにまとめているのですね。



HEROKUでよくつまずきやすいのは開発環境はdevelopment環境が使われてheroku上では本番環境であるproduction環境が使わます。


アセットパイプラインの仕組みを通って生成されたファイルは、Ruby on Rails 内部では開発環境と本番環境用で別々のものとなります。
 
注意すべきことは、通常本番環境ではアセットパイプラインを通る処理が自動実行されないことです。Heroku上に送付されたWebアプリケーションを何もせずにただ動かそうとすると、CSSやJavaScriptなどが反映されない状態になります。


これらを解決する最も良い方法が本番環境上でアセットパイプラインを自動で通るように設定を変更する方法です。

config/production.rbファイル内の記述のうち
config.assets.compile = false
の記述を見つけ、「falseをtrueに書き換えて」保存します。

この記述で本来自動実行されないアセットパイプラインの処理を自動でやってくれます。
システム監査において，ペネトレーションテスト　Penetration　Test(=侵入テスト)


応用情報技術者平成30年秋期 午前問59

システム監査において，ペネトレーションテストが最も適合するチェックポイントはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/622e9d30-5acd-8b2c-6b0b-971dcaef9b0d.png)

ペネトレーションテスト(侵入テスト)は、ネットワークに接続されているシステムに対して、実際に様々な方法で侵入を試みることで脆弱性の有無を検査するテストです。

システム監査で機密性を検証する際にペネトレーションテストを実施することで、ネットワークに適切なアクセス制御が施され、権限をもたないものがアクセスできないようになっているかどうかを確認できます。

具体的には、インターネットなどの外部と接続されたネットワークを通じて、コンピュータシステムの安全性を調べるテストの事で、実際のハッカーによる攻撃手法を試みながら、システムやネットワークの脆弱性を発見するためのセキュリティチェックのことになります。

・ペネトレーション　Penetration　「貫通」「浸透」「侵入」という意味



参照：
https://www.ap-siken.com/kakomon/30_aki/q59.html

ペネトレーションテストとは
https://cybersecurity-jp.com/security-measures/23673#i
組み込みデータ型

# 組み込みデータ型

数値型
数値を扱うためのデータ形です。演算子を使った計算、比較的ができます。整数だけを扱える、int型と、小数点以下を含む数を扱えるfloat型があります。
複素をを扱えるcomplex型というのもあるのですが、今回は触れません。

整数型（int）

整数を扱うときは、整数型（int）を使います。
主な演算子には、四則演算（+、-、*、/）と剰余（%）など。
> 5 + 2
7
> 13 - 23
-10
> 3 * 9
27
> 16 / 4
4.0
> 5 % 2
1


浮動小数点型（float）
小数を扱ときは,浮動小数点型（float）を使います。
整数型と同様の演算子が使えます
> 5.5
5.5
> 5.0 + 5.5
10.5

文字列型
文字列を扱うためのデータ型です。str型と呼ばれることがあります。演算子を使った計算や比較演算子また、メソッドを使って文字列に対する操作ができます。
文字列型はリストなどと同じく、複数の要素を集めたデータです。インデックスを使って要素を取り出すことはできますが、リストアップのように要素を入れ替えることはできません。
str型は文字列を扱います。str型として代入された文字、記号、数値などは全て文字列として扱われます。

str型（文字列型）
str型の変数を作成するには、ダブルクォーテーション（"）、または、シングルクォーテーション（'）で囲んだ文字列を代入します。

>a = ‘こんにちは’
>print(type(a))

リスト型
複数の要素を並べて管理するためのデータ型です。インデックスを使って要素を取り出したり、並べ替えたりできます。
メソッドにより、要素の検索や特定の要素数を取り出したり出来ます。

タプル型
リストと同じような機能を持ったデータ型です。リストと同じような操作ができますが、要素の変更ができません異質な複数の要素
を操作するときのために使われています。

ディクショナリ型
キーと値をセットにして複数要素を管理するデータ型です。リストと同じく複数の要素を集めたデータ型ですが、順番という概念がなく、
キーや文メソッドを使用して、ディクショナリ内の要素を操作する事ができます。

set型
集合型です。重複しない複数の要素を管理するために使うデータ型です。リストと同じく、複数のデータを集めたデータですが
順番という概念がなく、インデックスで、要素にアクセスすることができません。
メソットを使って中の要素を操作できる他、演算子により、複数のsetを使った集合計算が可能です。
set型は要素の変更ができます。要素を追加したり、取り除いたりします。また、setと同じ機能を持っていて、変更ができない
frozenset型というデータ型もあります。

bytes型
文字列型の一種です。文字列型と同じく複数の文字を集めたデータです。インデックスを使って文字を取り出せますが、変更ができないということも
文字列型と同じです。文字列型は、エンコードされた文字列データを扱いますが、bytes型が扱うのはエンコードされていない生の文字列データです。
このため、ファイルやインターネットから取り込んだ文字列は、bytes型として取り込まれます。

bool型
If文に添える比較式が返すデータ型です。trueかfalseの2種類のデータしか取らない特別なデータ型です。
axiosでheaderとbodyを指定してDELETEする方法

#headerとbodyを同時にセットできない
axiosを使用してDELETEを呼び出す際に、headerとbodyを以下のようにセットしたところうまく動作しませんでした。

```
axios.delete(URL, header, payload);
```
どうやらDELETEの場合にはPOSTのように引数を3つ取ることが出来ないようです。

#headersとdataというプロパティを持つオブジェクトをセットすることで解決
以下のようにheaders,dataという2つのプロパティを持つオブジェクトを作り、2つ目の引数として渡すことで正しくヘッダーとボディがセットされました。dataのプロパティがbodyにマップされるようです。
([こちら](https://github.com/axios/axios)をよく読むと書いてあります）

```
axios.delete(URL, {
  headers: {
    Authorization: authorizationToken
  },
  data: {
    param1: param1
  }
});
```

#まとめ
ヘッダー情報とボディを用いてaxiosでDELETEを呼びだす場合には、単一のオブジェクトでラップすることで呼び出すことが可能です。
現在のHTTPの仕様上はDELETEにBodyを含めることは可能ですが、以前は許されていませんでした。API設計をする際にDELETEにBodyを含める設計を行うと、このような問題に遭遇します。必要な情報はパラメータに押し込んだほうがリスクは少ないと思われます。
主記憶管理、仮想記憶管理

#主記憶管理
　限られた主記憶空間を効率よく使えるようプログラムに割り当てるのが、主記憶管理の役割
**固定区画方式**
　主記憶に固定長の区画(<font color="#cc0000">パーティション</font>)を設けて
　そこにプログラムを読み込む方式また、全体を単一の区画とする**単一区画方式**と
　複数の区画に分ける**多重区画方式**がある
　![図80.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/032c80d6-10d0-aa50-10c5-b463b823031e.png)


**可変区画方式**
　主記憶を最初に固定長で区切ってしまうのではなくプログラムをロードする
　タイミングで必要なサイズに区切る管理方式が**可変区画方式**という
　この方式はプログラム必要とする大きさで区画を作り、そこでプログラムをロードする
　![図81.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/88991177-4fa2-f3e8-813f-0dee19228768.png)


**オーバーレイ方式**
　どれだけ区画を効率よく配置できるようにしても、実行したいプログラムのサイズが
　主記憶の容量を超えていたら、ロードしようがない、これを可能にするための工夫が
　**オーバーレイ方式**という、この方式では、プログラムを**セグメント**という
　単位に分割しておいて、その時に必要なセグメントだけを主記憶上にロードして実行する

**スワッピング方式**
　マルチプログラミング環境では優先度の高いプログラムによる割込みなどが発生した場合
　現在実行中の優先度低いプログラムが使っている主記憶領域の内容をいったん補助記憶装置に
　丸ごと退避させるやり方が**スワップアウト++といい再びCPUの使用権が与えられるときは、
　退避させた内容を補助記憶装置から主記憶へとロードしなおして、中断箇所から処理を再開
　することをスワップインという。

**プラグメンテーションとメモリコンパクション**
　主記憶の秋容量自体がプログラムの実行に足るサイズであったとしてもそれを錬ぜくした状態で確保する
　ことができないこの現象を**フラグメンテーション(断片化)**と呼ぶまたフラグメンテーションを解消する
　ためには、ロードされているプログラムを再配置することによって細切れ状態にある空き領域を連続した
　ひとつの領域にすることを**メモリコンパクション**または**ガーベジコレクション**と呼ぶ
 ![図82.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/23c28962-eade-93d2-ed65-f7287df1595d.png)



#仮想記憶管理
　仮想記憶は、主記憶や補助記憶の存在を隠蔽することで、
　広大なメモリ空間を自由に扱えるようにするもの
　仮想記憶は**主記憶装置**と**補助記憶装置**を合わせて作ったメモリ空間

#なぜ仮想記憶だと自由なのか
 仮想記憶というのは「実記憶などの物理的な存在を隠蔽して、仮想空間にマッピングしてみせる」ための技術
　仮想アドレスから実アドレスへの変換処理は、メモリ変換ユニット(MMU:Memory Management Unit)という
　ハードウェアが担当する。この仕組みを**動的アドレス変換機構**と呼ぶ

**ページング方式**
　仮想アドレス空間を固定長の領域に区切って管理する方式
　ページング方式では、プログラムを「ページ」という単位に分割して管理する。
　<font color="#cc0000">※１ページのサイズは４キロバイトが一般的</font>
　仮想記憶と実記憶との対応付けは、**ページテーブル**という表によって管理される。
　表によって、仮想ページ番号が実記憶上のどのページと結びついてるかが確認できる。
　目的のページが実記憶上にないと判明したら、補助記憶から実記憶へとそのページが読み込まれる。
　補助記憶から実記憶へのページ読込みを**ページイン**と言う
　ページインしようとしたら、すでに実記憶がいっぱいだった場合、実記憶から補助記憶へと
　ページを追い出すことを**ページアウト**と言う

#ページの置き換えアルゴリズム
　
　**FIFO(First In First Out)方式**
　最初にページインしたページを追い出して対象にする。
　![図83.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/122955f2-406e-d418-7fb0-000a3e07575b.png)

　**LIFO(Last In First Out)方式**
　最後にページインしたページを追い出し対象にする。
　![図84.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/a5d470f1-cf9c-ae1b-803c-cc09684446d2.png)

　**LRU（Least Recently Used）方式**
　もっとも長い間参照されてないページを追い出し対象にする。
　![図85.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/3b858ace-55fe-a413-41c0-8d2e2c2bce32.png)

　**LFU(Least Frequently Used）方式**
　もっとも参照回数の少ないページを追い出し対象にする。
　![図86.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686519/ab169cfc-643e-b548-edf0-c0e5e7ab6caf.png)


#以上
【前編】ネットワーク構築（BGP）

##今回やること
前回まではOSPFの構築を続けていましたが、BGPに手をつけようと思います。
久しぶりにBGPの技術書を読んでいたところ、だいぶ忘れてしまっていたので
触っていこうと思います。

##使用ツール
GNS3
IOS: c2600-adventerprisek9-mz.124-17

##ネットワーク構成図
まずは思い出す意味でも基本的な簡単な図で構築していこうと思います。

そしてできた構成図が以下
![BGP.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686507/f6e066a0-1079-b242-9593-ffa120e45c9c.jpeg)

BGPではAS間通信とAS内通信が肝になってくるので、その辺を見れるようにします。

##用語集（備忘録）
|BGP用語|概要|
|:-----|:-----:|
|AS|自律システム。ネットワークの塊みたいなもの|
|BGPスピーカ|BGPが有効になっているルータ|
|BGPピア|BGPルートを交換しあうルータ同士の関係のこと|
|iBGP|AS内部のBGP|
|eBGP|AS間で使うBGP|
|RIB|BGPテーブルのこと|
|パスアトリビュート|BGPのメトリックとして使用される|
|ベストパス|BGPの最適ルート|
|ルータID|BGPスピーカの識別番号|
|iBGPスプリットホライズン|ループ防止機能|
|ルートリフレクタ|iBGPで受信したものをピアに転送する|
|コンフェデレーション|ASをサブASに分割する|
ざっくりとこんな感じでしょうか。
いつもiBGPとeBGPが混ざってしまうので、改めて表に起こすとわかりやすいですね。
技術書を読んでいても、いきなりコンフェデレーションなど単語がでてきても不明な時があるので、
表にまとめて、見ると理解が深まりますね。

##まとめ
BGPをしばらく触っていなくて、大分忘れていました。
単語についても忘れていたり、コマンドを調べていてもやはり忘れていました。
例えば、BGPのルータコンフィグレーションに入るコマンドを忘れていたりしました・・・

router bgp [AS番号]　ですね。
最近だとospfやripを使っていたので、触っていないと忘れますね。

あとはBGPネイバーとBGPピアの違いですね。
ここが正直あやふやです。
きちんと説明できないので、腹落ちできるまで解説を読み込みます。

今日は調べてみてだいぶ知識を取り戻した感じなので、明日は構築していこうと思います。

以上となります。
【環境構築】VMwareで作った仮想環境をローカル環境の任意のディレクトリにマウントする。

VMware Workstation 15 Playerを使って開発環境を作りました。
開発効率化のためローカル環境の好きなところにマウントをしたいと思います。

###### 開発環境
| 環境       |       OS |    バージョン    |
|:-----------------|-------------------|------------------|
| ホスト(ローカル環境)  |     Windows10|        1909        |
| ゲスト(仮想環境)     |       centOS|       5.6|


###事前準備
ローカル環境で、どのディレクトリをマウント対象にするか決めておく。
仮想環境でコピペする際の文字化けを防ぐため、パスは英単語のみにする。
(例)ローカル：Desktop/project/dev

###手順
1.vmware toolのインストール
2.仮想環境の共有についての設定
3.マウントコマンド実行

#### 1.vmware toolのインストール&仮想環境の共有設定を行う。
下記の記事に従ってVMware toolをインストールする。

■VMwareとの共有フォルダの作成（HatenaBlog id:naakojrさんの記事）
https://naakojr.hatenablog.com/entry/2019/06/03/003419?utm_source=feed

記事内の環境はUbuntuですが、手順は同じです。
VMware toolのインストールについては仮想環境内のコマンドラインでvmware-install.plが実行できれば良いと思います。

####2.仮想環境の共有について確認
<img width="400" alt="仮想マシン設定_ホスト側のディレクトリを追加_黒塗り.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/762005e3-b351-b619-ee8b-a647440c535c.png">

僕はローカルの下記ディレクトリをマウント対象として設定しました。
パス：`/c/Users/{ユーザー名}/Desktop/project/dev_vmware`

仮想環境内で下記コマンドを打ち込み、共有設定が出来ているか確認します。

■共有設定確認コマンド

```
[root@localhost ~]# vmware-hgfsclient
dev_vmware ←追加したファイル
```

仮想環境の設定で作成したディレクトリ名が表示されていれば成功です。

####3.マウントコマンド
次のコマンドでローカル環境と仮想環境をマウントします。
**※マウントした場合、マウント先（今回は仮想環境の/opt）がマウント元（今回はローカルの/dev_vmware）で上書きされてしまうので、念のためマウント先のバックアップを取っておくことをおススメします。**

■マウントコマンド

```
mount -t vmhgfs .host:/{設定したファイル名} {仮想環境内のマウント先(絶対パス)}
```

僕の場合は、ローカルのdev_vmwareディレクトリを、仮想環境の/optにマウントしたいので、下記のコマンドになります。

```
mount -t vmhgfs .host:/dev_vmware /opt
```

####4.マウント確認
<img width="600" alt="マウント確認.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/70787d8d-64fa-3682-94d9-732d5d79e6a2.png">

ローカルの内容が仮想環境に反映されれば成功です！

###まとめ：かなり便利！
今まで開発環境の構築にはDockerを使っていたため、「VMwareでマウントってどうやってやるんだ...？」状態でした。ファイルを変更する度にWinSCPで仮想環境へ接続してファイルを移動する、というのも考えましたが、マウントした方が圧倒的に楽でした。

それでは！

###参考記事
■Linux ゲストでの共有フォルダのマウント
https://docs.vmware.com/jp/VMware-Workstation-Pro/14.0/com.vmware.ws.using.doc/GUID-AB5C80FE-9B8A-4899-8186-3DB8201B1758.html

■VMWare Plyaer 3.0　ホストとの共有
https://rock-n-santa.hatenadiary.org/entry/20100430/1272584798
システム監査における、サンプリング(試査)に関わる用語

応用情報技術者平成30年秋期 午前問58


システム監査における、サンプリング(試査)に関わる用語のうち、適切なものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/635daec9-d6f1-5ddd-b5c3-5f3309147970.png)


１、試査
査証拠の入手方法の一つで、特定の監査手続の実施の際に、母集団からその一部の項目を抽出して、それに対して監査手続を実施することです。
試査には、一部の項目に対して監査手続を実施した結果をもって母集団全体の一定の特性を評価する目的を持つ試査(サンプリング)と、母集団全体の特性を評価する目的を持たない試査(特定項目抽出による試査)があります。

２、精査
試査に対立する方法に精査があり、精査は特定の監査手続の実施に際して、母集団からそのすべての項目を抽出して、それに対して監査手続を実施します。

３、誤謬率
解答した問題のうち、間違えた問題の割合です。


参照：
https://itsiken.com/29S_L4/29S_L4AU_01.html
U-NetとPartial Convolutionsを用いた水中画像からの浮遊物除去

# 论文
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550605/44bf56df-95b6-ef99-0f78-27e0eb7e4369.png)



# 背景
浮遊物を含む水中画像から浮遊物のない画像を復元するため、浮遊物の存在する領域を U-Netを用いて推定し、それを元に生成したマスク画像を用いて Partial Convolutions を行うことで、浮遊物を除去する手法を提案する。



# 提案手法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550605/57b04f5c-3a1e-c0b5-05b9-16bc1ac7cf78.png)

浮遊物領域推定とImage　Inpaintingの二段階の処理からなる。
第一段階:浮遊物領域推定は人工浮遊物画像とそれに対応したマスク画像を用いて訓練したU-Netで推定を行う。
第二段階：Image　Inpaintingは浮遊物のない水中画像と第 一段階のマスク画像を用いて訓練したPartial　Convolutionsで推定を行う。



# データセット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550605/b1ee836c-82c2-872a-683a-b691a2c08c53.png)

水中画像はデータベースJ-EDI（JAMSTEC E-library of Deep-sea Images）か らダウンロードした1263枚の浮遊物がない水中画像をData Augmentationで 11367枚に増やした。





# 人工ノイズ作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550605/c10ec05a-52ee-3fde-e87e-588c87b2d859.png)
空の画像に対し、形状とサイズおよび実際の浮遊 物の色に近い色を 持つ、複数個のパターンをランダムに生成し、ガウシアンフィルタと平均化フィルタの両方を用いてぼかすことで浮遊物画像を生成する。生成した画像を元の画像に加えることで、人工浮遊物がある水中画像 を生成する。


# 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550605/3f86c52d-e57b-a93d-69b7-57d3d6bcba6c.png)


# まとめ
実験の結果、人工浮遊物の特徴を学習することで、実 際の浮遊物も検出することができ、復元した画像では 浮遊物が良く除去されていることを確認した。
【Rails6】Rails + Bootstrap 5.0.0-alpha 環境で、Bootstrapをカスタマイズする

※Qiita初投稿です。宜しくお願い致します。

BootstrapはCSSフレームワークとして数多くのプロジェクトに導入されていて、
2020年6月にメジャーバージョンアップとして5.0 alpha がリリースされました。

長年使われているフレームワークで採用数も多いことから、デフォルト設定で使用されている場合、
「Bootstrap臭」と揶揄されることもありますが、
カスタマイズすることで柔軟にUIを変えることが可能です。

今回はRails 6.0環境にwebpackerで導入したBootstrap 5.0において、
各変数をカスタマイズする方法についてご紹介します。

# 概要

Bootstrap内で設定されている_variables.scssの値を、別ファイルから上書き変更します。

# 参考文献・記事

以下記事で紹介されている方法について、cssをwebpackerで管理する場合に応用した方法になります。

http://koyacch.hatenablog.com/entry/2018/02/23/162213

また、以下リンクの公式ページで紹介している方法を参考にしています。

https://v5.getbootstrap.com/docs/5.0/customize/sass/


# 前提

- Railsの設定でcssがwebpackerで管理されている。（この記事内では、app/javascript/src/application.scss が置かれているとします）
- Bootstrapがパッケージマネージャ（yarnなど）でインストールされている。（この記事内では、node_modules/bootstrap がインストールされているとします）

# 設定手順

### app/node_modules/bootstrap 内のファイルをコピーする

app/node_modules/bootstrap 内にあるbootstrap.scssと_variables.scssをコピーして、app/javascript/src フォルダ内に貼り付けます。

### app/javascript/src 内のファイル名を変更する

app/javascript/src/bootstrap.scss は _bootstrap-custom.scssに、
app/javascript/src/_variables.scss は _bootstrap-custom-variablesに、ファイル名を変更します。

### application.scss の設定
app/javascript/src/application.scss に、以下コードを記述します。


```ruby:application.scss
@import 'bootstrap-custom';
```

### _bootstrap-custom.scss の設定
app/javascript/src/_bootstrap-custom.scss の全ての @import について、"~bootstrap/scss/"を追加します。

変更前

```ruby:_bootstrap-custom.scss
@import "variables";
```

変更後

```ruby:_bootstrap-custom.scss
@import "~bootstrap/scss/variables";
```

全ての@importを編集後、@import "~bootstrap/scss/variables";を以下の通り編集します。

変更前

```ruby:_bootstrap-custom.scss
@import "~bootstrap/scss/variables";
```

変更後

```ruby:_bootstrap-custom.scss
/* @import "~bootstrap/scss/variables";
 */
@import "bootstrap-custom-variables";
```

# カスタマイズ方法

app/javascript/src/_bootstrap-custom-variables の各変数を変更することでカスタマイズすることが可能です。

変数は数多く設定されていますので、変更次第でオリジナリティあるUIを統一的に適用することができます。

### 例：全体的なフォントサイズを小さくしたい場合

変更前

```ruby:_bootstrap-custom-variables
$font-size-base: 1rem !default; // Assumes the browser default, typically `16px`
```

変更後

```ruby:_bootstrap-custom-variables
$font-size-base: 0.9 rem !default;
```

# 終わりに

現在私が運営している[snowwshiro](https://www.snowwshiro.net)では、最低限のカスタマイズのみの為まだまだBootstrapらしい仕上がりとなっていますが、今秋のリニューアルにむけて鋭意カスタマイズ作業中です。
サービスデスク組織の構造とその特徴のうちーローカル、中央、バーチャル、フォロー・ザ・サン

応用情報技術者平成30年秋期 午前問57

ITIL 2011 editionに示されるサービスデスク組織の構造とその特徴のうち，"フォロー・ザ・サン"の説明として，最も適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/bedbd5fa-6154-eff1-fd0a-b232c9379611.png)


サービスデスクの組織構造の形態：

１、ローカルサービスデスク local service desk
ユーザのローカルサイト内、若しくは地理的に近い場所に設置されたサービスデスク。担当者の直接派遣が容易であり、ユーザの問題や改善点を把握しやすい。

２、中央サービスデスク central service desk
一箇所の拠点にてすべてのユーザからの問い合わせに対応する体制のサービスデスク。運営コストを低く抑えることができ情報の管理がしやすい。

３、バーチャルサービスデスク virtual service desk
実際には分散しているが連携することで擬似的に一つの組織として機能を提供するサービスデスク。

４、フォロー･ザ･サン follow-the-sun
2つ以上の異なる(大陸の)拠点に配置され、中央での統括管理によって24時間365日のサービスを提供するサービスデスク。

follow-the-sunとは、太陽を追いかけるよね、つまり、拠点は数多い配置され、サービスは１日中２４時間サービスを提供するようにするですよね。

参考：
https://www.ap-siken.com/kakomon/30_aki/q57.html

IT用語集
https://tech.yokohama/5863/
Android Studio でカスタムキーボードが有効になっているかの判定について(Java)

## カスタムキーボードは作った、が有効判定ができない！
いろいろ合ってカスタムキーボードをAndroid Studioで開発していて、キーボード自体は作ったはいいものの、IMEの有効判定の方法がなかなか見つかりませんでした。

何がしたくてこんなことしようとしていたかというと、某キーボードアプリでは、アプリ内でキーボードが有効になっていないときにアラートを表示して、設定まで飛んで、IMEを有効にさせようとしますよね。

わからない？

...まあ、それなら仕方ない。

とりあえずそういったことがしたかったわけですよ。

その備忘録としてコードを残しておきます。
ちなみに、今さらkotlinじゃなく、javaで開発してしまったのはご愛敬。

## 実はそれほど難しくなかった

早速コードを見ていただきましょう。

```hoge.java
//インストールされているIMEアプリケーション一覧取得
InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
List<InputMethodInfo> inputMethodInfoList = imm.getEnabledInputMethodList();

for (int i = 0; i < inputMethodInfoList.size(); ++i) {

     InputMethodInfo inputMethodInfo = inputMethodInfoList.get(i);
     CharSequence label = inputMethodInfo.loadLabel(getPackageManager());

    if(String.valueOf(label).equals("hoge_keyboard")) {

         Log.v("label", String.valueOf(label) + " is active!");

    }
}
```

まあ、こんな感じですね。自分もandroid開発始めたばっかりの初心者なので、もっといい方法があるかもしれません。

if文はキーボード名が`hoge_keyboard`とマッチするときにログで表示するようにしています。マッチしたい名称と、if文の中身を皆さんのコードに合わせて変えていただければ、大丈夫です。

同じような問題にぶち当たっている人のお役に立てれば幸いです。
GCP初心者がGCEの仮想マシン立ち上げをし、SSH接続してみた

#はじめに
二本目の記事になります。
今回は、GCPを使ったGCEの仮想環境構築と構築したGCEの仮想環境に対してSSH接続を行いました。
私なりの解釈及びどのようなことやったか解説していきたいと思います。
#今回の目的
* GCPを使ってGCEの仮想マシン立ち上げができるようになる
* SSHとは何か学ぶ
* 立ち上げたGCEの仮想環境に対してSSH接続ができるようになる

#GCPでクラウドの作成
##GCPとは
GCPとは、googleがクラウド上で提供しているサービスの一つで、仮想マシン（GCE）やデータストレージ（GCS）、機械学習、BigData解析ツールなど様々なサービスがあります。
##クラウド立ち上げ
1.プロジェクトを作成します。
![project.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/3e413ce5-bb88-0f97-4b6d-1d478a1c10d5.png)
![project1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/bf22fe18-59ed-3cc9-8850-0cbbfe3fc448.png)
2.左のメニューからCompute Engineを選択し、VMインスタンスをクリックします。
![instance.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/df8e5d8a-4873-b2d7-ebcf-7a99d034a5fe.png)
3.作成ボタンを押してインスタンスを作成します。
![instnace1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/6bd54a9d-b638-7e0f-037e-2c2248874727.png)
![instance2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/c3bbdbe3-b943-2e2e-225e-de8fe98d1a0c.png)
#SSH接続
###SSHとは
通信を暗号化する技術。SSHにはパスワード認証方式と公開鍵認証方式の二つあります。今回は公開鍵暗号方式を使いました。
###公開鍵認証方式とは
1.クライアント側で公開鍵と秘密鍵を作成します。
2.公開鍵をサーバー側に渡します。
3.秘密鍵を用いてサーバーにアクセスできるようになります。
###SSH接続実践
先ほど立ち上げたGCEの仮想環境に対してSSH接続を実際に行います。
1.コマンドプロンプトを立ち上げ、以下のコマンドを実行します。これで公開鍵と秘密鍵を作成します。

```
ssh-keygen -t rsa -f 鍵の名前 -C ユーザー名
```
『鍵名.pub』が公開鍵、『鍵名』が秘密鍵になります。

2.Windows PowerShellを立ち上げ以下のコマンドを実行します。これで公開鍵の内容を確認できます。

```
cat 公開鍵名(鍵名.pub)
```

3.公開鍵の内容を仮想マシンに渡す。
　（1）VMインスタンスのページに行きアクセスするサーバーをクリックし、詳細ページに飛びます。
　（2）編集をクリックし、2で見た公開鍵の内容をコピーし保存します。
![koukai2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/15a02090-674d-d6f6-eddd-94f9af99dc72.png)
![koukai3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/7b96baad-b9f7-6074-0c30-41aa5e2dbd2c.png)

4.コマンドプロンプトで以下のコマンドを実行します。これで仮想マシンにアクセスできます。外部IPはGCPのVMインスタンスのページから確認できます。

```
ssh 外部IP -i ~/.ssh/my-ssh-key -p 22 - C ユーザー名
```
コマンド入力後このような画面が出てくればアクセス成功です。
![kanryou.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/7857c6e6-5da1-d373-476b-8799540ae984.png)

###ポート番号の変更
1.クラウドにアクセスします。
2.以下のコマンドを実行します。これにより仮想マシンの設定ファイルにアクセスできます。

```
sudo vi  /etc/ssh/sshd_config
```
3.5行目あたりに『Port 数字（デフォルトは22）』と記載されているところがあるので、そこの数字を別の数字に変更します。
4.ファイヤーウォールの設定
 （1）アクセスするクラウドの『ネットワークの詳細設定』を開きます。
![koukai1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/d43579f7-6f7d-d48c-ce6a-7d102fca049a.png)
 （2）ファイヤーウォールルールを選択し、default-allow-sshをクリックします。
![firewalll.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/3096e0f5-82ee-dbc3-f12e-1cf83ea8f22e.png)
　(3)編集をクリック。tcpのポート番号を3で変更した番号を入れて、保存します。
![firewall2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675407/b9477822-0832-9a51-494b-cc4bf4211bd0.png)

5.以下のコマンドを実行。これで仮想マシンを再起動できます。

```
sudo systemctl restart ssh
```

5.試しに以下のコマンドを実行し、アクセスできることを確認する

```
ssh 外部IP -i ~/.ssh/my-ssh-key -p 変更したポート番号
```

#感想
今回は初めてGCEの構仮想環境築を行いました。
初めてということもあり、かなり時間がかかりましたが何とかできました。
今後は個人的に構築した仮想マシンを使って、webページの作成などしてみたいと思っています。
【python】wavファイルの読み書きにはこれを使え【wavio】

最近にわかに増えてきたハイレゾ対応wavファイル。これは24bitのビットレートであり、pythonで扱うには大変めんどくさい。そんな問題を解決してくれるモジュールが「wavio」だ。

# 導入
```pip install wavio```

# wavファイルの読み込み

```wavread.py
import wavio

wav = wavio.read(filename)

fs = wav.rate # サンプリング周波数[Hz]
samplewidth = wav.sampwidth # サンプル幅[Byte]
bit = wav.sampwidth * 8 # 量子化ビット数[bit]
data = wav.data # 波形データ
ch = len(wav.data[0, :]) # チャンネル数
```

# wavファイルの書き出し

```wavwrite.py
wavio.write("filename.wav", data, fs, sampwidth = samplewidth)
```

# 終わりに
実際に裏で動いているのはpythonの標準モジュールwaveなんだけど、まあ、こういうのがあると便利ですよね
Dockerで開発環境使ったら、Railsコマンドが使えなくなった罠を解決

いよいよ本格的に何か作ろうと思いまして、まずは開発環境で、Rails6の環境構築を終了しました。
ちなみに参考にした記事は、
・[DockerでRuby on Railsの環境構築を行うためのステップ【Rails 6対応】 - Qiita](https://qiita.com/kodai_0122/items/795438d738386c2c1966)

その他、上手くいかなかった部分には、
・[Rails6+MySQL+Nginx+Unicorn+Docker環境構築メモ - Qiita](https://qiita.com/horoyoi/items/b9f2a7f8cf066116c068)
・[PostgreSQL（Docker）にRails（Docker）が接続できなくなったから調べてみた。（could not translate host name "db" to address: Name or service not known） - Qiita](https://qiita.com/at-946/items/2fb75cec5355fad4050d)

上記の記事を参考にさせていただきました。

そして、今回は初歩中の初歩で少し躓いたのでその話を少しします。

# 早速Webサイトのトップページを作ろう！

railsでトップページを作ろうと思い、

```:ターミナル
$ rails g controller home top
```
と入力、
すると...

```:出力結果
Rails is not currently installed on this system. To get the latest version, simply type:

    $ sudo gem install rails

```

Google翻訳の力を借りるとこう↓
__Railsは現在このシステムにインストールされていません。最新バージョンを入手するには、$ sudo gem install railsを入力してね。__

う〜ん、Rails6は間違いなくインストールしているのに何ででしょうか？
0.5秒くらい悩みましたが答えは簡単でした。

## Railsが存在するのは、あくまでDocker内だけでの話

まず、Dockerとは？
>Docker（ドッカー）は、__コンテナ仮想化__を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである。
Dockerはコンテナ仮想化を用いたOSレベルの仮想化（英語版）によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。かつその環境自体をアプリケーションと同じようにコード（イメージ）として管理可能にする。Dockerを開発・テスト・デプロイに用いることで「コードを書く」と「コードが製品として実行される」間の時間的ギャップを大きく短縮できる。
引用:[Docker - Wikipedia](https://ja.wikipedia.org/wiki/Docker)

wikipediaを見てもらっても分かる通り、Dockerって仮想化技術なんですね。
つまりdocker-composeを使ってRailsをインストールしていますが、__あくまでもDocker内で使用出来るようになったよ！__くらいの認識で良い訳です。

なので、__Railsは現在このシステムにインストールされていません。最新バージョンを入手するには、$ sudo gem install railsを入力してね。__となったんですね！

## 解決策は、Dockerコマンド
```:ターミナル
$ docker-compose run web
```
これが魔法の呪文です。

この後に、さっきのコマンドを追加したら...

```:ターミナル
$ docker-compose run web rails g contoller home top
```
```:出力結果
Starting guminoki_db_1 ... done
Could not find generator 'contoller'. Maybe you meant "controller"?
Run `rails generate --help` for more options.
```

これは、どうもcontrollerを誤字ってるみたいなのでやり直し。

```:ターミナル
$ docker-compose run web rails g contoroller home top
```
```:出力結果
Starting guminoki_db_1 ... done
      create  app/controllers/home_controller.rb
       route  get 'home/top'
      invoke  erb
      create    app/views/home
      create    app/views/home/top.html.erb
      invoke  test_unit
      create    test/controllers/home_controller_test.rb
      invoke  helper
      create    app/helpers/home_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/home.scss
```

無事、完了しました！
やったね！

# さいごに
以前、Djangoでアプリケーションを作成するときにも__$ docker-compose run web__を使っていました。すっかりど忘れしていましたね（汗）

```Python:Django開発用サーバー起動例
$ docker-compose run web python3 manage.py runserver
```

更に、

```:ターミナル
$ docker-compose run --rm web rails g contoroller home top
```
の様に、__--rm__オプションを付けると、コンテナ終了時に自動的にコンテナ削除をしてくれるので、とても便利だったりします。
サービスレベル管理(Service Level Management)、キャパシティ管理（Capacity Management）、継続及び可用性管理の活動（Continuity Management）

応用情報技術者平成30年秋期 午前問56


ITサービスマネジメントにおけるサービスレベル管理プロセスの活動はどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d2e04f54-0f27-5e45-6324-71ea49e788e9.png)


１、サービスレベル管理(Service Level Management)は、
顧客とサービス提供者の間でSLA(Service Level Agreement)を締結し、サービスレベルを定義，合意及び管理するプロセスです。SLAの締結後は、PDCAマネジメントサイクルによってサービスの維持、及び向上を図る活動を行います。

２、サービスの予算及び会計業務の活動
ITサービスの提供に必要な予算に対して，適切な資金を確保する。

３、キャパシティ管理の活動（Capacity Management）
現在の資源の調整と最適化，及び将来の資源要件に関する予測を記載した計画を作成する。

４、サービス継続及び可用性管理の活動（Service Continuity Management）
災害や障害などで事業が中断しても，要求されたサービス機能を合意された期間内に確実に復旧できるように，事業影響度の評価や復旧優先順位を明確にする。


ーーーーーーーーーーーーーーーーーーーーーーーーー
補足

ITIL 2011 editionの可用性管理プロセスにおいて，ITサービスの可用性と信頼性の管理に関わるKPIとして用いるものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/4793d878-3fa1-ac77-a67e-3c3fc525300b.png)


１、可用性管理は、
ITサービスが必要な時に必要なだけ提供できるように管理を行うプロセスです。

・KPI(Key Performance Indicator，重要業績評価指標)は、企業目標やビジネス戦略の実現に向けて行われるビジネスプロセスについて、その実施状況をモニタリングするために設定する指標のことなので「サービスの中断回数」の増減がKPIとして適切となります。

２、
・災害を想定した復旧テストの回数
⇒ITサービス継続性管理のKPIとして用いられる指標です。

・処理能力不足に起因するインシデント数の削減率
⇒キャパシティ管理のKPIとして用いられる指標です。

・目標を達成できなかったSLAの項目数
⇒サービスレベル管理のKPIとして用いられる指標です。


ーーーーーーーーーーーーーーーーーーーーーーー
補足

ITサービスマネジメントにおけるサービスレベル管理の説明はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ee9db455-f4da-9642-4d47-831d0b4a32ca.png)


１、サービスレベル管理(Service Level Management)は、
顧客とサービス提供者の間でSLA(Service Level Agreement)を締結し、サービスレベルを定義，合意及び管理するプロセスです。SLAの締結後は、PDCAマネジメントサイクルによってサービスの維持、及び向上を図る活動を行います。

２、
・あらかじめ定めた間隔で，サービス目標に照らしてサービスの傾向及びパフォーマンスを監視する。
　→○。サービスレベル管理の説明です。

・計画が発動された場合の可用性の目標，平常業務の状態に復帰するための取組みなどを含めた計画を作成し，導入し，維持する。
　→○。可用性管理の説明です。

・サービスの品質を阻害する事象に対して，合意したサービス目標及び時間枠内に回復させる。
　→○。インシデント管理の説明です。

・予算に照らして，費用を監視及び報告し，財務予測をレビューし，費用を管理する。
　→○。サービスの予算及び会計業務の活動です。

参照：

https://www.ap-siken.com/kakomon/28_haru/q56.html

https://www.ap-siken.com/kakomon/27_aki/q56.html

https://www.ap-siken.com/kakomon/29_haru/q55.html
kintone ドラッグ可能なマーカーをマップに表示してみる

こんにちは、マイスター・ギルドのフクロウと申します。
今回は「open street mapにドラッグ可能なマーカーを表示してみよう。」です。
分かりやすいページがなかなか見つからなかったため、メモとして書きました。

## 使用するライブラリ
|ライブラリ|バージョン|備考|
|---|----|----|
|OpenLayers|6.3.1|CybozuのCDNで提供されいているライブラリを使用|

##マップにドラッグ可能なマーカーを表示してみる。
下記がコードになります。

```
function ShowMap(){

//マーカーの初期表示場所の指定
let coordinate = convertCoordinate(135.514383,34.6974254);

let styleMarker = new ol.style.Style({
     image: new ol.style.Icon({
     scale: 1.5,
     src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAZCAYAAADe1WXtAAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHwSURBVEiJpdW9a9NRFMbxT9qmNWmSRqlFhE6CLuIL1DcUHDqJm/0HBEUk3RQXpW7dXdysWlAEHQSlo4IoIohQKFJQxKWIIlTb5pc2anMdkmBbmleHZ3vul3Pvc865QggaCfu6uIOtTfkbGboYTRIN8yvJd5xoG4psmqk9LH0gBMJTQh+FJOPobAmKo718zbFcrACr+kI4TpThHQYbQhHr4WqG6MkG2FqtEsb5nWQJZ2pCMZDh5RBLc3WAa/WGsIMozV0k1kExnGR+jOKfJoFVLRBGKKT4jL0hBLq51kfhRZ2D04Qblfes5blNKcFynItwYTf5Ug3zc0KyolSlslrgIQpxxiCWYWaC0mbGUUIHASFDeFwD+Kjcbh/RWX3Tw1mixTYrzRP6iXBsXfppHl6m2M6bXqLYx4PNWmpnguhTi+m/L99iEf2bNn8P108RtQI9Qj5Ort5Ebenl27MmgfcoZZhFR93Zx8gu8o2GYIGQLYdzqKmFkuHtTVbrQXOsZJhsZUvtT1P4UQM4/S+cbS3t0xSTOVY2AkuEA+Q7Od/Okt6eID+7ATpRDmcGsba+k26unCRfBc6XRzXCwba+k0q18RRzUxXoOZZT3Kp3piG0Aj49SP41IcFPZP8bWmmxVwOsxDjbjL8pKPZ3c79eOGv1F5xHWAKxXNwiAAAAAElFTkSuQmCC'
   })
});

let marker = new ol.geom.Point(coordinate);
let featureMarker = new ol.Feature(marker);

let vector = new ol.layer.Vector({
  source: new ol.source.Vector({
  features: [featureMarker] //配列にしないとエラーが起きます。
  }),
 style: [styleMarker]
});
      
let map = new ol.Map({
  target: 'map',
  layers: 
     [new ol.layer.Tile({
         source: new ol.source.OSM()
     }), vector],
  view: new ol.View({ center: coordinate, zoom: 8 })
});
      
let translate = new ol.interaction.Translate({
  features: new ol.Collection([featureMarker])
});
      
map.addInteraction(translate);
      
//ドラッグイベントの定義
map.on('pointermove', function(e) {
   if (e.dragging) return;
   let hit = map.hasFeatureAtPixel(map.getEventPixel(e.originalEvent));
     map.getTargetElement().style.cursor = hit ? 'pointer' : '';
   });
}

    
// 緯度経度を球面メルカトル図法に変換
function convertCoordinate(longitude, latitude) {
   return ol.proj.transform([longitude, latitude], 'EPSG:4326', 'EPSG:3857');
}
```


今回のコードは以下のページのコードを参考にさせていただきました。
[JSFiddle ドラック可能なマーカー](https://jsfiddle.net/jonataswalker/70vsd0of/)

この記事が少しでもお役に立てたら、幸いです。

以上、マイスター・ギルドのフクロウでした。
tableの行全体(tr)をリンクにする(jQuery)

trタグ全体や、tdタグの塊をaタグで囲っても、行全体をリンクにすることはできないようです。
jqueryを使って実装したので、サンプルを記録しておきます。

```html
<table>
  <tr data-href="/hoge/">
    <td>foo</td>  
    <td>bar</td>
    <td>baz</td>          
  </tr>
</table>

<script>
  $('tr[data-href]').click(function (e) {
      if (!$(e.target).is('a')) {
        window.location = $(e.target).data('href');
      };
  });
</script>

<style>
  tr:hover {
    background: gray;
  }
</style>
```

<p class="codepen" data-height="265" data-theme-id="light" data-default-tab="html,result" data-user="d0ne1s" data-slug-hash="JjXNJVg" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="JjXNJVg">
  <span>See the Pen <a href="https://codepen.io/d0ne1s/pen/JjXNJVg">
  JjXNJVg</a> by d0ne1s (<a href="https://codepen.io/d0ne1s">@d0ne1s</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
TerraformでEC2周りの色々を構築

# Terraform

- VPC1つの中にSubnetを切ってその中にEC2を1つ
  - インターネットのアクセスをすべて受け入れる(`0.0.0.0/0`)設定なので、`yourIp/32`に置き換えた方がいいかもしれない 

```terraform
# provider
provider "aws" {
  version = "~> 2.0"
  region  = "ap-northeast-1"
}

# VPC
resource "aws_vpc" "VPC" {
  cidr_block           = "10.1.0.0/16"
  instance_tenancy     = "default"
  enable_dns_support   = "true"
  enable_dns_hostnames = "false"
  tags = {
    Name = "Terraform-VPC"
  }
}

# IGW
resource "aws_internet_gateway" "GW" {
  vpc_id = "${aws_vpc.VPC.id}"
  tags = {
    Name = "Terraform-IGW"
  }
}

# Subnet
resource "aws_subnet" "public-subnet" {
  vpc_id            = "${aws_vpc.VPC.id}"
  cidr_block        = "10.1.1.0/24"
  availability_zone = "ap-northeast-1a"
  tags = {
    Name = "Terraform-subnet"
  }
}

# route table
resource "aws_route_table" "public-route" {
  vpc_id = "${aws_vpc.VPC.id}"
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = "${aws_internet_gateway.GW.id}"
  }
  tags = {
    Name = "Terraform-rtb"
  }
}

# routing
resource "aws_route_table_association" "puclic-routing" {
  subnet_id      = "${aws_subnet.public-subnet.id}"
  route_table_id = "${aws_route_table.public-route.id}"
}

# SG
resource "aws_security_group" "Terraform-EC2-SG" {
  name        = "Terraform-ec2"
  description = "Allow SSH And HTTP inbound traffic"
  vpc_id      = "${aws_vpc.VPC.id}"
  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  tags = {
    Name = "Terraform-SG"
  }
}

# 最新のAMIを取得
data aws_ssm_parameter amzn2_ami {
  name = "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2"
}

# EC2
resource "aws_instance" "Terraform-ec2" {
  ami           = data.aws_ssm_parameter.amzn2_ami.value
  instance_type = "t2.micro"
  key_name      = "Key-Name"
  vpc_security_group_ids = [
    "${aws_security_group.Terraform-EC2-SG.id}"
  ]
  subnet_id                   = "${aws_subnet.public-subnet.id}"
  associate_public_ip_address = "true"
  root_block_device {
    volume_type = "gp2"
    volume_size = "20"
  }
  tags = {
    Name = "Terraform EC2"
  }
  user_data = "${file("./userdata.sh")}"
}

```

# UserData

- なんか入れたい奴書く

```bash
#! /bin/bash
# なんか入れたい奴書く
yum update -y
```

## 書いてみた感想
- CloudFormationより見てくれが美しい
- 秘密鍵をフォルダ内に内包できるのがうれしい
  - CloudFormationは特殊な方法を使わないと無理だと思う
- [Alibaba](https://registry.terraform.io/providers/aliyun/alicloud/latest/docs)や[Yandex Cloud](https://www.terraform.io/docs/providers/yandex/index.html)まで対応しているので、中国やロシア進出があっても安心
- いろいろ変数が使えるので使った方が楽(tagsとか特に)だけど、使いすぎると可読性が落ちる
  - 複数人で書くときは特にそうだった
Heroku上で背景画像が表示されないけどなんなんこれ

HerokuにpushしたRailsアプリケーションのassets background-imageが読み込まれない問題の解決方法

## 状況
1. ローカルでRailsアプリケーションを作成
1. Herokuにデプロイ
1. heroku open
1. ローカルで表示されていた背景画像が表示されない

## 解決策

結論、以下の方法で解決しました。

**config/environments/production.rb**

```ruby
  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false
```

上記の
**config.assets.compile = false**
を、
**config.assets.compile = true**
に修正

参考
https://qiita.com/pugiemonn/items/1663ca88766ceba6a397

その後、rails assets:precompile ~ git push heroku masterを実行

```
$ rails assets:precompile
$ git add .
$ git commit -m 'fix: config.assets.compile'
$ git push origin master
$ git push heroku master
$ heroku open
```

herokuアプリを確認してみてください。

参考
https://qiita.com/___xxx_/items/bb85d26d50ff3940441c
storybookでスペースを消す。

# storybookのスペースを消す
## TL;DR
storybookで開発していたら、横幅いっぱいに表示するコンポーネントを作成中、どうしてもpaddingが入ってしまった。
iframeのbodyにmarginとpaddingが設定されていたのでこれを0にした。
しかし、他のサイトだと!importantが設定されていないのでできなかった。
環境はreact+storybook です。

## 解決策
1. `.storyboook/preview-head.html`を追加
2. 下記の通り追記。

```html:.storyboook/preview-head.html
<style type="text/css">
    body {
        margin: 0 !important;
        padding: 0 !important;
    }
</style>
```

## 環境
環境はreact+storybook です。
バージョンは以下


```json:pacage.json
//省略

  "dependencies": {
    "@material-ui/core": "^4.11.0",
    "@material-ui/icons": "^4.9.1",
    "@testing-library/jest-dom": "^4.2.4",
    "@testing-library/react": "^9.3.2",
    "@testing-library/user-event": "^7.1.2",
    "node-sass": "^4.14.1",
    "react": "^16.13.1",
    "react-dom": "^16.13.1",
    "react-router-dom": "^5.2.0",
    "react-scripts": "3.4.2"
  },
//省略
  "devDependencies": {
    "@babel/core": "^7.11.1",
    "@storybook/addon-actions": "^6.0.12",
    "@storybook/addon-essentials": "^6.0.12",
    "@storybook/addon-links": "^6.0.12",
    "@storybook/node-logger": "^6.0.12",
    "@storybook/preset-create-react-app": "^3.1.4",
    "@storybook/react": "^6.0.12",
    "babel-loader": "^8.1.0",
    "react-is": "^16.13.1"
  }
//省略

```
設計と実装をRailsでシームレスに行う(API仕様書)

## 目的
- API仕様書のメンテコストをなくす
- 実装に前倒しで着手する


### 前提
- フレームワークにRailsを使用する
- Railsの環境構築を行う

### 手順
1. Gemfileにgemを指定してbundle installする  
2. spec/request/xxxx_spec.rbにテストケースを書く  
3. AUTODOC=1 bundle exec rspec spec/requests/xxxx_spec.rbを実行する  



### 1. Gemfileにgemを指定してbundle installする

```
group :development do
 gem 'autodoc'
end
```

### 2. spec/request/xxxx_spec.rbにテストケースを書く
```

require 'rails_helper'

RSpec.describe "Api::V1::Users", type: :request, autodoc: true do
 describe "GET /api/v1/users/:id" do
   it "ユーザー詳細API" do
     get api_v1_user_path(1)
     expect(response).to have_http_status(200)
   end
 end

 describe "PUT /api/v1/users/:id" do
   it "ユーザー編集API" do
     require 'json'
     file = File.read("#{Rails.root}/sample-json/users-update.json")
     params = JSON.parse(file)
     put api_v1_user_path(1), params: params, as: :json
     expect(response).to have_http_status(200)
   end
 end
end
```


### 3. AUTODOC=1 bundle exec rspec spec/requests/xxxx_spec.rbを実行する
Xcodeのアイコンをバージョンごとに変える

Xcodeで開発をしていると、複数バージョンのXcodeが必要になる時があります。しかし、複数バージョンをインストールしているとDock等でアイコンが被ってわかりにくいことがあります。Xcodeのアイコンに目印をつけてわかりやすくしてみます。

## 確認環境

- Macbook Pro late 2013
- macOS Mojave 10.14.6

## 手順

### 1. アイコンの抽出
まず「アプリケーション」フォルダ（`/Application/`）を開きます。
そしてXcodeを右クリックしてコンテキストメニューから「Xcodeをコピー」します。

![スクリーンショット 2020-08-27 16.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/e26e52b2-50cf-f305-fffe-e1a634ee1f7e.png)

次に「プレビュー」アプリを開き、

![スクリーンショット 2020-08-22 1.56.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/0adc992d-5d54-1a9e-8b2d-f0cc5d07deca.png)


「ファイル」→「クリップボードから新規作成」を押します。

![スクリーンショット 2020-08-22 1.59.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/1999d8fb-a2a1-2acb-f52c-7cb155e34f81.png)

するとこのように表示されます。これでアイコンが抽出できました。

![B47E04EA-E1D4-4318-A486-BF6EAC7CF03D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/0a3362a3-e375-ecf2-fc26-93d170813c08.png)

### 2. アイコンの編集

区別できるように文字を入れていきます。
「ツール」→「注釈」→「テキスト」を選び、バージョンが分かるように入力します。

![76FDDB75-0B2C-4B46-BE42-72DB067F01A2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/0306a573-a40c-408b-98bf-4b45eeed28a1.png)

文字を入れたものを画像(pngファイル)に書き出します。「ファイル」→「書き出す」を押し「Icon1024.png」という名前で保存します。

![9F10C057-BA89-4062-AEFC-26B821DC7A84.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/4c198213-1fac-f036-3e3a-13002ff0b0b7.png)


### 3. アイコンファイルの作成

アイコンファイルを作成していきます。
ここはコマンドラインでの作業になります。Terminalを開いて、先ほど出力したpngファイルと同じディレクトリへ移動してください。そこでStackoverflowの下記回答に記載のスクリプトを実行します。

How to manually create icns files using iconutil?
https://stackoverflow.com/questions/12306223/how-to-manually-create-icns-files-using-iconutil/20703594#20703594

すると、同じディレクトリに「MyIcon.icns」が出力されます。これが完成したアイコンです。

### 4. アイコンの設定

アイコンを設定します。「アプリケーション」フォルダ（`/Application/`）でアイコンを設定したいXcodeを右クリックし、「情報を見る」を選択します。

![スクリーンショット 2020-08-22 2.30.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/d2bb95d0-517e-5ee9-17c9-25c60cb9822f.png)

そして、下記の赤囲みの部分へ、先ほど作成したアイコンである「MyIcon.icns」ファイルをドラッグ&ドロップします。

![スクリーンショット 2020-08-22 2.31.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/9461e117-9fbc-e2de-743f-3e8d96822dc7.png)

これでアイコンが変更できました。Dockのアイコンはすぐには変わりませんが、対象のXcodeを一度終了→起動すると変更が適用されます。


## 参考

Macアプリのアイコン画像を取り出して素材として使用する方法
https://gori.me/mac/mac-tips/96231

How to manually create icns files using iconutil?
https://stackoverflow.com/a/20703594