OmniAICreator/Qiita-1.07M huggingface dataset:
[光-Hikari-のPython]01章-01 Pythonについて（はじめてのPython）

# 【01-01】はじめてのPython

Pythonプログラミングを始める前に、まずは簡単に概要を説明していきます。

ここでは、Pythonを習得することで何ができるようになるかを見ていき、Python言語の主な特徴などを説明していきます。

また令和2年春試験より、基本情報技術者試験（FE）の午後試験のプログラミングでもPythonが選択できるようになったため、Pythonを選択しようと考えている方に向けた説明もしていきたいと思います。

##プログラミング言語
プログラミング言語はご存じの方も多いと思われますが、C・Java・C#・C++・JavaScript・PHPなどといった様々なものが存在します。
今回はPythonというプログラミング言語を扱っていきます。

## Pythonの特徴
Python言語はほかの言語と比べると主に以下の特徴があげられます。

- 文法がシンプル ―― プログラミング初学者でも学びやすい
- 様々なOS環境でも利用が可能 ―― WindowsだけでなくLinux等でも稼働可能
- オープンソース<font color=#ff9966>（※）</font>で配布されているため、自由に利用が可能

<font color=#ff9966>（※）</font>プログラミング言語で書かれているソースコードを一般に公開して、世界中の誰でも自由に改変したりしてもよいという考え方です。

## Pythonの利用用途
Pythonはざっくり言うといろいろなことができ<font color=#ff9966>（※）</font>、前述した通り文法がシンプルのため以下のような様々な目的で利用されています。

- AI（人工知能）
- IoT
- データ分析
- データサイエンス

<font color=#ff9966>（※）</font>「ライブラリ」という機能がPythonにはたくさんあり、それによりいろいろなことができます。

## Python3
「3」というのはバージョンのことである。今後はPythonのバージョンは3で説明していきます。
もともとはPythonは**Python2**と**Python3**に分かれていました。

しかし、Python2で記載したプログラムがPython3で動かすことができないですし、ライブラリがPython3に対応してくるようになってきて、現在はPython3がほとんどです。

##最後に
以上がPythonの簡単な概要です。
次回以降は実際にPythonプログラムを書いていき、実行して動作を確認したり、開発環境のインストールの説明も行っていきます。

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)
Android Studio アプリ画面の回転固定にする方法

画面固定するために具体的にどこに記述したらいいのか
詳しく書いていない記事もあり多少手間取ったので、
健忘録として書いておきます。

アプリによっては画面固定にしておかないと
画面回転時にアプリ停止など予期せぬ動作をすることがあります。

<h1>縦画面固定にする場合

AndroidManifest.xml内の

acticity 　 と　　>    　の間に

android:screenOrientation="portrait"を挿入します。



```
 <activity android:name="com.catsw.catswitch.MainActivity"
                  android:screenOrientation="portrait">

```

↓のように記入する場所が違うと画面固定が反映されません。

``` 
<activity android:name="com.catsw.catswitch.MainActivity">

 android:screenOrientation="portrait"


```


<h1>横画面固定にする場合

AndroidManifest.xml内の

acticity 　 と　　>    　の間に

android:screenOrientation="landscape"を挿入します。

```
 <activity android:name="com.catsw.catswitch.MainActivity"
                  android:screenOrientation="landscape">

```
deviseの導入方法

## 背景
よく使うgemのため、導入方法を備忘録として残しておく。

## 手順

1.Gemfileに、gem 'devise'を記述する。

```
gem 'devise'
```

忘れず実行する。

```
bundle install
```


2.device専用のインストールをする。

```
$ rails g devise:install
```

3.device専用のビューを作成する

```
$ rails g devise:views
```

4.モデル作成しマイグレーションファイルを編集。

```
$ rails g devise user
```

5.マイグレーションファイルを修正し、マイグレーション実行する。

```
rails db:migrate  
```
良く忘れるcode集 part2

#HTML & CSS

1.背景画像

```css:back-pic.css
background-image:url();

background-size:cover;
```

2.中央寄せ(ブロックとインライン)

```css:center.css
{
width:100px;

margin:0px auto;
}

text-align:center;
```
![スクリーンショット 2020-04-21 22.38.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611734/642a7eb9-b742-6e44-ed2a-f1b4d15de284.png)
![スクリーンショット 2020-04-21 22.38.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/611734/731257b4-20e8-b772-06be-026a9afd4b62.png)


3.透明・文字間隔・細くする

```css:xxx.css
opacity:0.5;

letter-spacing:10px;

font-weight:normal;
```
4.丸と影→クリック時に影を消す

```css:layout.css
border-radius:10px;

box-shadow:0 7px #1a7940;

.box:active{
  box-shadow:none;
  position:relative;
  top:7px;
}
```

5.アイコン

```html:icon.html
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css">
 
<span class="fa fa-facebook">
}


```

Font Awesome 
https://fontawesome.com/kits/0510cdeddb/use?welcome=yes
ここから選べます

6.カーソル

```css:cursor.css
div{
  transition:all 1s;
}

div:hover{
  background-color:white;
}

cursor:pointer;
```

7.重ねる

```css:position.css
.parents{
  position:relative;
}
.child{
  position:absolute;
  top:90px;
  width:100%;
}
```

7.ヘッダーの固定

```css:header.css

.header{
position:fixed;
  top:0;
  z-index:10;
}
```
CentOS7でSQUIDが遅い件(ISGでDNS戻りパケット破棄)

CentOS6で構築したプロキシサーバのリプレイスとして、pfSenseでプロキシサーバを構築したが
webサイトへのアクセスがなんか遅い。。。。

pfSenseのせいかと思い、CentOS7で作り直すも状況は変わらず
tcpdumpにてパケットの状況を確認すると名前解決に時間がかかっている？？


#構成
外部DNSサーバ----FW(ISG)----PROXYサーバ

PROXYサーバの名前解決先はFWで分断された別ネットワークに設置されたDNSサーバ

FWで下記を開示済み
Src:PROXYサーバのIP
Dst:外部DNSサーバ
Service:DNS

#原因
FWのログを確認すると、戻りパケットを破棄していた。。。
下記事象に合致している模様

[ScreenOS] DNS reply packet is dropped through the firewall. How is DNS traffic handled? 
[リンク](https://kb.juniper.net/InfoCenter/index?page=content&id=KB12312)


下記ポリシーを追加で戻り通信も通るようになり、PROXY遅い問題は解決
Src:外部DNSサーバ
Dst:PROXYサーバのIP
Service:Any

IP絞っているし、とりあえずいいでしょう


CentOS6のSQUIDでは問題なく、CentOS7およびpfSense2.4.5 では発生する
SQUIDバージョンの問題か？？
おそらくSQUIDのバージョンが上がったために名前解決の動作になにか変更があったのであろう
やる気があれば今度調べてみる
【備忘録：HTML/CSS】data属性はCSS設計で大事だよね？

# data属性を活用していきたい
<img width="896" alt="スクリーンショット 2020-04-22 21.42.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625199/3ebf52fc-cfc6-540e-6645-4b1985d097e3.png">
例えば、上記のようなボタンがあったとして、LP制作とかだと、
**「そのボタンに合ったクラスを作成する」**という感じになるかと思います。

```html:hoge.html
<p><a href="#" class="m-btn-small">幅決まっているボタン</a></p>
<p><a href="#" class="m-btn">幅100%ボタン</a></p>
```
```scss:hoge.scss
.m-btn{
  position: relative;
  display: inline-block;
  color: #fff;
  background: pink;
  font-size: 1.4rem;
  font-weight: bold;
  padding: 6px 20px;
  width: 100%;
  border-radius: 5px;
  max-width: 100%;
  text-align: center;
  text-decoration: none;
  &-small{
    position: relative;
    display: inline-block;
    color: #fff;
    background: pink;
    font-size: 1.4rem;
    font-weight: bold;
    padding: 6px 20px;
    width: 100%;
    border-radius: 5px;
    max-width: 400px;//ここだけ値を変更
    text-align: center;
    text-decoration: none;
  }
}
```

この場合LPであればいいのですが、サイト運用やサイトリニューアルなどで、**「ボタンの色を青に変更したい」**とかなった場合を考えると、

```scss:hoge.scss
.m-btn{
  position: relative;
  display: inline-block;
  color: #fff;
  background: pink;
  font-size: 1.4rem;
  font-weight: bold;
  padding: 6px 20px;
  width: 100%;
  border-radius: 5px;
  max-width: 100%;
  text-align: center;
  text-decoration: none;
  &-small{
    position: relative;
    display: inline-block;
    color: #fff;
    background: pink;
    font-size: 1.4rem;
    font-weight: bold;
    padding: 6px 20px;
    width: 100%;
    border-radius: 5px;
    max-width: 400px;//ここだけ値を変更
    text-align: center;
    text-decoration: none;
    &-blue{
    position: relative;
    display: inline-block;
    color: #fff;
    background: blue;//ここの色を変えるために他のプロパティも記述しないといけない
    font-size: 1.4rem;
    font-weight: bold;
    padding: 6px 20px;
    width: 100%;
    border-radius: 5px;
    max-width: 400px;
    text-align: center;
    text-decoration: none;
    }
  }
}
```
上記のようになってしまい、
・ cssが冗長になってしまう
・ 冗長になった分保守が大変
・ 他の色や幅を追加したいときにさらに冗長になる
などデメリットが多くあります。
## data属性を使った場合

```html:hoge02.html
<p><a href="#" class="m-btn" data-btn-width="small">幅決まっているボタン</a></p>
<p><a href="#" class="m-btn">幅100%ボタン</a></p>
```
```scss:hoge02.scss
.m-btn{
  position: relative;
  display: inline-block;
  color: #fff;
  background: pink;
  font-size: 1.4rem;
  font-weight: bold;
  padding: 6px 20px;
  width: 100%;
  border-radius: 5px;
  max-width: 100%;
  text-align: center;
  text-decoration: none;
  &[data-btn-width="small"]{
    max-width: 400px;
  }
}
```
このように.m-btnにdata属性を持たせ、それに対してcssを設定することで、
・ css記述が短縮できる
・ 保守がしやすい
・ 他の色や幅を追加しても分かりやすい
というメリットがあります。


先程の、**「ボタンの色を青に変更したい」**の場合でも、

```scss:hoge02.scss
.m-btn{
  position: relative;
  display: inline-block;
  color: #fff;
  background: pink;
  font-size: 1.4rem;
  font-weight: bold;
  padding: 6px 20px;
  width: 100%;
  border-radius: 5px;
  max-width: 100%;
  text-align: center;
  text-decoration: none;
  &[data-btn-width="small"]{
    max-width: 400px;
  }
  &[data-btn-bg="blue"]{
    background: blue;
  }
```
と記述が短くなり分かりやすいです。
## まとめ
LPではなく、サイト運用、サイトリニューアルであれば、制作とその後の保守も考えdata属性を活用していくことをおすすめします。
AWSでアプリ(プロジェクト)ごとにかかった費用を算出する

1つのアカウントで様々なアプリを作成していると、どのアプリにいくら掛かっているのかが分からなくなってきます。実際問題、EC2やRDSを筆頭にAWS上の様々なサービスにまたがったアプリがほとんどなので、費用の可視化が困難になります。それを防ぎ、出来る限り、アプリごとに費用を算出する方法を紹介します。

## タグをつける
![スクリーンショット 2020-04-22 22.08.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/8140d26b-204a-80b8-5c87-c00d28823c46.png)

各サービスの設定に、どこかしらに「タグ」という項目があります。設定に際して、タグを付けて行ってください。キーはスクリーンショットでは「project」としていますが、「application_name」でも何でも分かる名前をつけてもられば大丈夫です。値の「hogehoge」は具体的なアプリ名を入れてください。

## コストエクスプローラー上でタグで集計

コストエクスプローラーを開き、グループ化の条件の詳細からタグの「project」※先程付けた物　を選択します。
![スクリーンショット 2020-04-22 22.13.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/5f80a0ac-3446-a52b-84c7-ab16149955e8.png)

するとこんな具合にアプリ別で費用を見ることが出来るようになります。

![スクリーンショット 2020-04-22 22.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/931bb5c1-0ae0-91dd-e95c-04c6eaec15b6.png)

尚、**過去に遡及しては反映されない**ので、初期設定のタイミングでタグ付けすることをおすすめします。

## 補足：No Tagkeyを減らすには
![スクリーンショット 2020-04-22 22.24.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293892/dd53c995-336d-fd67-8ffc-f246a343cdac.png)

横のフィルタのところから、タグ→project→No Tagkey:projectを選択し、グループ化の条件をサービスにします。すると、どのサービスでタグが付いていないのかざっくり分かります。ここから、タグが付いていない物にあたりを付け、タグを付けていくと良いと思われます。

※なお、著者はCloudWatchのタグ付のやり方がいまいち分からなかった…
兵庫県のコロナローソク足チャートアプリを公開しました。

#公開したサービス
https://covid19-candle-hyogo.ml
GitHubのソースコードは[こちら](https://github.com/inadati-services/covid19-candle-hyogo.services)

#動機
公表されている日毎の感染者グラフや累計のグラフって
回復した人や亡くなった人は差し引かれないので
常に拡大に向かっている感覚しか与えないと思います。

僕自身もそうですが
知りたいのはどちらかというと「傾向」
拡大傾向なのか、終息傾向なのか、あるいは均衡を保ったような状態なのか

兵庫県のオープンデータである[こちら](https://web.pref.hyogo.lg.jp/kk03/documents/yousei.xlsx)のexcelデータの
入院中の箇所が実質の県内陽性者数なのですが
前日比で-20人となる日なんかもあって、
実は、実質の陽性者数は増えたり減ったりしてる訳です。

僕はmqlという為替自動売買ツールの開発言語の経験があったのもあり
為替のローソク足チャートを応用すれば、感染拡大の傾向を視覚化出来るだろうと考えました。

#ローソク足チャートとは？
為替や株の値動きなんかを分析する為にしばしば利用されるグラフです。
値上がりしてるのか値下がりしているのか
上げ下げが非常に視覚的に分かりやすく、江戸時代の米相場での利用から現在に至るまで
利用されているチャートです。
ちなみに日本発祥です。
![011_icon.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224153/dd1f67c7-51bd-52a8-8da6-687dd99d7e65.png)


#コンテナ構成
**scraping-bot**
言語: python
説明: 30分ごとに兵庫県のホームページのエクセルファイルをコンテナ内にダウンロードし
postgreSQLにデータを格納

**gqlkit-server**
言語: Go
パッケージ: gqlgen
説明: GraphQLサーバー、scraping-botコンテナが格納したデータをpostgreSQLから読み込み
GraphQLのQueryとしてサービスする

**nuxt**
言語: javascript
説明: gqlkit-serverが提供するGraphQLからデータを受け取り
echarts.jsを用いてローソク足チャートを描画します。
また、ローソク足と5日間平均線、10日間平均線の値の並び順によって
感染拡大の度合いを評価するアラートも表示します。
GraphQLクライアントは[rapi](https://github.com/gqlkit-lab/rapi)を使用

**その他コンテナ**
postgres
pgweb(データベース確認用)

# まとめ
今回、サーバーは[mixhost](https://mixhost.jp/news/432)のVPSを使わせていただきました。
受付は一旦、4月末までのようですがコロナ関連のアプリやサイトを公開する場合
12ヶ月間無償で利用可能とのことです。
有り難い限り
rogueをbrewでインストールしてサクッと遊ぼう！

#rogueとは
@（アットマーク）が主人公のダンジョン探索型ゲームだよ！

## キャラクター操作方法など
こちらを参照
https://ja.wikipedia.org/wiki/%E3%83%AD%E3%83%BC%E3%82%B0

## インストール
```bash
$brew install rogue
```

## 実行
```bash
$rogue
```

## プレイ画面
```
    --------------------
    |.......@..........|
    |.........%........+
    --------------------

Level: 1  Gold: 0      Hp: 12(12)  Str: 16(16)  Arm: 4   Exp: 1/0

```

## 死亡
```
                       __________
                      /          \
                     /    REST    \
                    /      IN      \
                   /     PEACE      \
                  /                  \
                  |       tofu       |
                  |       0 Au       |
                  |   killed by a    |
                  |    hobgoblin     |
                  |       2020       |
                 *|     *  *  *      | *
         ________)/\\_//(\/(/\)/\//\/|_)_______
```

##以上！
java の勉強(基本情報処理技術者試験)

基本情報のjava の勉強しているのだが、どうも身につかない。

学んでいることを整理するためにこの記事を書く。

まず問題の構成は以下のようになっている。

①問題分(ソフトウェアの構成、クラスやインスタンスの紹介がある)
②プログラムのコードが４〜５本ほど掲載されている
③小問が４〜５問程度、穴埋め形式で出題される
④プログラムに追加するコードが示される
⑤ ④による動作の変化について問われる

問題を解いていく際に意識しているフローがある
(い)問題文を読む
(ろ)回答の選択肢を確認する
(は)問題のソースコードを読み、引数、返り値、型、メソッド、クラス等の情報から回答を推測する
(に) (は)でダメなら問題文を読んで、クラスやメソッドの使用を確認して、そこから回答を推測する

こんな感じで解いてみてる。
、、、これでなんで得点率が３０％くらいなんだ？
色々と手順を飛ばしてるのかな。
非同期通信とは、、、？

# 非同期通信とは

リクエスト後、レスポンスが返って来た際にブラウザが再読み込みされることなく通信が行われる通信方法。

## よく使うメソッド

$.ajaxメソッド = 非同期通信を行うための記述。キーバリュー形式で引数を渡す。
　　　　　　　　(type,data,url,dataType等の情報を渡す。)
        
doneメソッド = 通信成功時に動く

failメソッド = 通信失敗時に動く

appendメソッド = 指定した子要素の最後にテキストやHTMLを追加する

FormDataメソッド = フォームのデータ送信に使用

.attrメソッド = 要素が持つ指定属性の値を返す。何も持っていない場合はUndefinedを返す

.processオプション = デフォルト(=true)データに指定したオブジェクトをクエリ文字列に変換する。

.contentTypeオプション = サーバにデータのファイル形式を伝えるヘッダ。

respond_toメソッド = Railsのコントローラー内で使用。リクエストがHTMLかJSONかで条件分岐する。

jbuilder:array!メソッド = 配列で返したい場合に使用。

.emptyメソッド = 指定したDOM要素の子要素のみを削除する。


## よく起こるエラー
404エラー = ルーティングエラー(行き先が違う)

500エラー = サーバがおかしい。(コントローラーかjbuilderを見る)
SQL文について

##SQL文をまとめました。
「SQL文」とはデータベースへ指示をする言語。
どんなサービスでもデータベースを使うので、使いこなせるようになると良い。

###基本命令文
・SELECT文　データを取得
・INSERT文　データを追加
・UPDATE文　データを更新
・DELETE文　データを削除

###SELECT文
```
select 要素名　from テーブル名; 
//要素名を「,」でつなげることで複数取得
//要素名を「*」で全部の要素を取得
```
WHEREで条件を絞る

```
select 要素名 from テーブル名 where 条件文;
```

ORDER BYでソート（並び替え）

```
select 要素名 from テーブル名 order by ソートしたい要素名 descまたはasc;
//descは降順、ascは昇順、何も書かなければascの昇順になる
```

GROUP BYでグループ分け

```
select 要素名 from テーブル名 group by グループ分けしたい要素名;
//同じ要素名の要素数を調べるときなどに使う
//同じグループの要素数を知りたい時は、要素数の後に[,count(*)]をつける
```

ASで出力時に名前をつける

```
select 要素名 as 名前 from テーブル名;
//要素に名前をつけて表示される。
//例、　select name as "名前" from users;
//name要素が名前要素としてhyouji
```

###INSERT文
INSERT文の基本形

```
insert into 追加したいテーブル名(要素a,要素b) values (要素aに入れるデータ,要素bに入れるデータ);
//テーブル名の後の要素指定は省略できる。
```
複数データ追加

```
insert into テーブル名 values (a,b,c),(d,e,f),(g,h,i);
````

###UPDATE文

```
update テーブル名 set 更新処理;
```
WHEREで条件

```
update テーブル名 set 更新処理 where 条件;
```

### DELETE文

 ```
delete from テーブル名;
```
上記の命令文だとテーブル全部が削除されてしまうので、基本はwhereを使って条件、対象要素指定する。



簡単ですがSQL文の基本をまとめました。
SQLは必須ですので覚えていきたいです。
【AWS10分間チュートリアル】ReactJSアプリをデプロイしてホストしてみた(CI/CD)


# 概要
社内でAWSを使ったシステム設計を任される予定があり、AWSのサービスを勉強中です。
チュートリアルと画面が異なるため、記事にしています。

以下もご覧いただけると幸いです。
[【AWS10分間チュートリアル】Docker コンテナのデプロイ](https://qiita.com/tyariponzu614/items/573231bf72115034eca2)


# 教材
10分間チュートリアル
https://aws.amazon.com/jp/getting-started/tutorials/

ReactJSアプリをデプロイしてホストする
https://aws.amazon.com/jp/getting-started/hands-on/deploy-react-app-cicd-amplify/

# チュートリアル概要
Reactアプリケーションを作成し、それをGitHubリポジトリーにプッシュします。
次に、リポジトリをAmplifyコンソールに接続し、
amplifyapp.comドメインでホストされているグローバルに利用可能なコンテンツ配信ネットワーク（CDN）にデプロイします。

# 環境構築

## OS
win10 Pro

## nodejs
nodejsをインストールしておきます。
https://nodejs.org/ja/download/

node.exeにパスを通して、以下を実行します。
バージョンが12.16.2であることがわかりました。
```
> node -v
v12.16.2
```

## git
以下のwindowsにインストールするを参考にインストールします。
[1.5 使い始める - Gitのインストール](
https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

# AWS Amplifyコンソール
>AWS Amplifyコンソールは、サーバーレスバックエンドを備えた単一ページのウェブアプリケーションまたは静的サイトを開発、デプロイ、ホストするためのGitベースのCI / CDワークフローを提供します。Amplifyは、Gitリポジトリに接続すると、フロントエンドフレームワークとAmplify CLIで構成されたサーバーレスバックエンドリソースの両方のビルド設定を決定し、すべてのコードコミットで更新を自動的にデプロイします。

# 1. 新しいReactアプリケーションを作成する

ターミナルにて、以下を実行します。

```
npx create-react-app amplifyapp
cd amplifyapp
npm start
```
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/2badaa21-3b05-a803-26a5-23fa44f0b008.gif)

# git リポジトリを作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/866e2b7c-74a3-7e5e-d519-4a19d8ba7eea.png)

```
git init
git remote add origin https://github.com/(username)/amplifyapp.git
git add .
git commit -m "initial commit"
git push origin master
```

# アプリをAmplifyにデプロイする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/25b12d04-1802-0a13-5132-1d0813c12632.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/efa09412-78ef-333b-8e06-4a59a807496c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/f2aa6f99-7ab6-2a6e-094c-9cd117a443f9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/64e96a62-f4c6-aaf5-5f83-708a2eceb617.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/9ff00995-ac45-ac6f-dc17-03aabea1f013.png)

URLをクリックすると、AWS上でReactアプリが動作しているのを確認できます。

and save to reload Part 2.と言葉を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/13f74249-19a3-56d9-805e-3a79871c33c3.png)

githubにpushします。
```
git add .
git commit -m "second commit"
git push origin master
```

すると...URLにアクセスすると、表示が変わっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230037/1d36884b-b550-feaf-95c8-238f19860b77.png)

# これであなたもCI/CDの一端に触れました
>GitHubと統合し、Amplifyコンソールを使用して、Reactアプリケーションをクラウドにデプロイしました。

>AWS Amplifyコンソールを使用すると、アプリケーションをクラウドに継続的にデプロイし、グローバルに利用可能なCDNでホストできます。
deviseのよく使うメソッド集

# 背景
よく使うgem「devise」は便利なメソッドがあるが、その度に調べるのは面倒なのでまとめておくこととした。


## メソッド集
##### ⑴configure_permitted_parameters メソッド,⑵devise_parameter_sanitizer メソッド
⑴deviseでは初期状態ではサインアップ時にメールアドレスとパスワードのみを受け取るように設定してあるので、追加したキーのパラメーターは許可されない。追加のパラメーターを許可したい場合は、application_controllerにおいてbefore_actionにconfigure_permitted_parametersメソッドを設定します。
[例]ユーザー名、年齢も一緒に登録したい等。

⑵deviseで設定されているstrong_parametersに対してパラメーターを追加することができます。


```application_controller.rb

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
  end
end
```

#####after_sign_out_path_for メソッド
deviseでサインアウト後、リダイレクト先を指定するメソッド。
このメソッドは返り値にサインアウト後のリダイレクト先URLを指定出来ます。
deiviseのメソッドを上書きしている関係上、resourceを引数に渡さなけらばならないので、resourceを引数に渡します。
(逆のサインイン後の指定をするときは、after_sign_in~とする)

```application_controller.rb

def after_sign_out_path_for(resource)
    user_path(resorces) # サインアウト後のリダイレクト先URL
end

def after_sign_in_path_for(resource)
    users_path　　　　　　# サインイン後のリダイレクト先URL
end
```

#####authenticate_user! メソッド
コントローラーに設定して、ログイン済ユーザーのみにアクセスを許可するメソッド。
except:を指定することでそのアクションは対象外にできる。

```users_controller.rb

before_action :authenticate_user!,except: [:index, :show] 
```

##### user_signed_in? メソッド
ユーザーがサインイン済かどうかを判定する
[例]ログインしていない時に他のアクションが動かないようにする

```tweets_controller.rb
before_action :move_to_index, except: :index

def index
  
end

private
def move_to_index
  redirect_to action: :index unless user_signed_in?
end
```

#####current_user メソッド
サインインしているユーザーを取得する

#####user_session メソッド
ユーザーのセッション情報にアクセスする

```articles_controller.rb

class ArticlesController < ApplicationController
...
  def index
    user_session[:cart] = "Cart"
    respond_with(current_user)
  end
```
[AWS]Amazon WorkSpacesとPrivateLinkは同居できないので注意

# 概要
Covid-19対策での通勤自粛に関連して、Amazon WorkSpacesを導入しようとしたところ、
特定の条件でWorkSpacesを起動させられない事象にハマったので皆様にも共有します。

# 問題
WorkSpacesを構築する際、以下の画像の通り2種類の方法から選択できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358513/81ac3f42-61c4-162d-5c25-47e4bc2dd6a1.png)
オンプレミスのADとの連携等も不要でしたので、高速セットアップを実行したところ、
「An internal service error has been encountered during directory creation. Please retry the operation.」というエラーが発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358513/8c0453f4-b738-66d9-decd-c078a81a422f.png)
内部エラーなのでググってもAWS自身が対応しているものばかりで、よいHowToが出てきません。
手動でSimple ADを作ったりもしましたが、同じエラーが出るのみで、どうしようもないのでAWSに問い合わせしました。

# 原因
AWSからの回答では、タイトルにも記載した通り、PrivateLink(=インターフェース型VPCエンドポイント)があると、
Simple ADが起動できないため、別のVPCで起動するか、MicroSoft ADを利用することで回避せよとのことでした。
このことは、ドキュメント[Simple ADの前提条件](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/prereq_simple.html)にも記載がないですが、
恒久的なものではなく、AWS社で対応を進めているとのことでした。(対応時期は未回答)
[golang]可変サイズのSliceやmapを作る時 make([]T, 0)で初期化してはいけない

golangのsliceパフォーマンスに関する小ネタ。
「いけない」というのは言い過ぎですがしない方が良いよレベルのお話。

# NG例

例として引数で渡されてきたsliceから偶数の値だけ別のsliceに格納するような処理を書くとします。
偶数である数値の数は引数で渡された時点では不明であるためresultのlengthの初期値は0です。

```Go
func SliceFullExtension(samples []int32) []int32 {
	var result = make([]int32, 0)
	for _, s := range samples {
		if s % 2 == 0 {
			result = append(result, s)
		}
	}
	return result
}
```

動作として問題ないですが上記のような書き方でsliceやmapを初期化してしまうと
appendの度に都度allocateが発生してしまい非常に効率が悪いです。

# 高速化その1: 最大値を定義した上で0にカットする

appendの度にsliceを拡張させないためには初めからsliceのメモリ確保をしてしまえば良いので
lengthに入りうる数の最大値を最初から定義してしまいます。
その上でsliceを0にカットします。

```Go
func SliceCut(samples []int32) []int32 {
	var result = make([]int32, len(samples))[:0]
	for _, s := range samples {
		if s % 2 == 0 {
			result = append(result, s)
		}
	}
	return result
}
```

# 高速化その2: capacityを指定する

高速化その1のようなことをしなくても、実はmakeの第三引数にはcapacityを指定出来ます。
https://blog.golang.org/slices-intro
`make([]T, length, capacity)`

```Go
func SliceCap(samples []int32) []int32 {
	var result = make([]int32, 0, len(samples))
	for _, s := range samples {
		if s % 2 == 0 {
			result = append(result, s)
		}
	}
	return result
}
```

こっちの方が良いですね。


# ベンチマーク

どれくらい高速化出来るのかベンチマークを取ってみます。

```Go
func BenchmarkSlice(b *testing.B) {
	b.Run("SliceFullExtension", func(b *testing.B) {
		var samples = make([]int32, b.N)
		for n := 0; n < b.N; n++ {
			samples[n] = int32(n)
		}
		SliceFullExtension(samples)
	})
	b.Run("SliceCut", func(b *testing.B) {
		var samples = make([]int32, b.N)
		for n := 0; n < b.N; n++ {
			samples[n] = int32(n)
		}
		SliceCut(samples)
	})
	b.Run("SliceCap", func(b *testing.B) {
		var samples = make([]int32, b.N)
		for n := 0; n < b.N; n++ {
			samples[n] = int32(n)
		}
		SliceCap(samples)
	})
}
```

```
BenchmarkSlice
BenchmarkSlice/SliceFullExtension
BenchmarkSlice/SliceFullExtension-8         	215787544	         5.36 ns/op
BenchmarkSlice/SliceCut
BenchmarkSlice/SliceCut-8                   	442801159	         3.07 ns/op
BenchmarkSlice/SliceCap
BenchmarkSlice/SliceCap-8                   	522813318	         3.40 ns/op
```

capacity指定版よりcut版の方が早いけど何度も実行すると逆転したりするので誤差の範囲です。
元々のcapacity指定しない版よりは2倍くらい早くなりました。
Herokuでgit push heroku masterした時にrejectされたら見る記事

# herokuでgit pushしたらrejectされた時の対処

gitに不慣れなのに頑張ってherokuを使おうとしてpushしたらrejectedと言われて何が悪いのかわからない時に見る記事です

コメント、いいね大歓迎です。誤字や間違いは指摘していただけると助かります
注　masterではなくmainとなっている人は記事内のmasterと書かれている部分を読み替えてください。

## rejectの原因はどこに書いてあるのか
```
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 212 bytes | 212.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> App not compatible with buildpack: https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/python.tgz
remote:        More info: https://devcenter.heroku.com/articles/buildpacks#detection-failure
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to project.
remote: 
To https://git.heroku.com/project.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/project.git'
```

例えばこの例だと真ん中の方の

```
App not compatible with buildpack: https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/python.tgz
```
この文章がエラーの内容です

ここからはこれを踏まえてエラーの種類ごとに見ていきます。

## App not compatible with buildpack 
##  No default language could be detected for this app.
この二つのメッセージはherokuが「何の言語でどんな依存関係を持っているのかわからん」と言っています。

この場合はリポジトリのルートディレクトリに言語ごとに決まったファイル名のファイルを配置する必要があります。そのファイルには依存関係が記述されます。
※ルートディレクトリは```git init```を実行した場所で、.gitという隠しフォルダがある場所です
中身がなくても空のファイルを配置してください。
既にファイルあるよという場合は記述ミスの可能性もあります。
### 言語ごとに必要なファイル
#### PHP
composer.json
#### Node.js
package.json
#### Ruby
Gemfile
#### Python
requirements.txt
#### Go
Godeps/Godeps.json 又は vendor/vendor.json 又は srcと言う名の.goファイルを一つ以上含むディレクトリ
#### Scala
sbt.versionプロパティーを持つ/project/build.propertiesと言う名のファイル
#### java
pom.xml
#### Clojure
project.clj

## non-fast-forward
前にpushした内容とgitの履歴が噛み合わない時に出ます。気にしないのであれば強制的に

```
git push heroku master -f
```

## request runtime not available
runtime.txtがちゃんとルートディレクトリにあるかを確認
runtime.txtに指定されているランタイムがサポートされてない可能性があるので他のバージョンを試す


参照
https://devcenter.heroku.com/categories/language-support
bash: : command not found　〜どんなコマンドを打っても抜け出せない地獄〜

#はじめに
このエラーは本当に良く見ますが、原因は色々といったところなのですかね？
でも、ホンマに毎回このエラーを見るたびに残念な気持ちになってます。
今回はそのエラーの中でも重複して抜け出せなくなったので原因を調べて解決していきます。

#エラーの内容は？
```
-bash: rbenv: command not found
-bash: brew: command not found
-bash: curl: command not found
```

今回ですが、macのターミナルで行っていたのですが、そこでのエラーです。
homebrewはインストール済みだったのはずが```-bash: brew: command not found```だったので、
あれ？インストールされてない？と思いもう一度[公式ページ](https://brew.sh/index_ja)からhomebrewをインストールしようとしたところ```-bash: curl: command not found```
その後も、同じようなエラーの連続

```
-bash: rbenv: command not found
-bash: brew: command not found
-bash: curl: command not found
```
もうどうしたことやら、、、

#エラーの原因は？
原因は、
####『パスの通し方』でした。

つまり、

```
export PATH="$PATH:/opt/local/bin"
```
こんなやつですね。

恥ずかしながら、エラーを解決していく段階で適当にコマンドを打っていたせいでおかしなことになっていたみたいです。。。

自分が『何故そのコマンドを打つのか？』ってところは本当に基本的ながら大事ですね。

もう一度、パスって何なのか？ってところから勉強し直しました。
（パスが何か分かっている方は、『パスって何？何のために？』の段落は飛ばしてください。）

#パスって何？何のために？
まず、パスとは
####環境変数（$PATH）の記述を変えて、コマンド検索パスを追加することです。

ん〜、意味がわからない。

とりあえず、環境変数から。
###ー　環境変数とは何かと言うと、
#####ローカル環境のOSが持っている変数のこと。
つまり、
#####自分のパソコン上の全てで使える変数
環境変数に設定されている値は、すべてのプログラムで使えるみたいです。

では、コマンド検索パスってのは何なのでしょうか？
###ー　コマンド検索パス
#####『ターミナルがコマンドを検索するためのパスの事です』
もっと噛み砕くと、
『コマンドを打ってファイルを読み込む』
何故そんなコマンドを打って探すのかと申しますと、
#####パソコンの中には無数のファイルがあります。
そんな中からファイルを探してくるために必要なのが『パス』です。
つまり、shell（ターミナル）に実行ファイルがある場所を探してくれる役割があるのが『パス』です。

実際にコマンドを打ってみるのが早いですね！！！
そこで、[この記事](https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015)を参考に進めていたのですがとても理解しやすかったので是非！

それでは、パスを通し直してエラー解決していきましょう！

#エラー解決法は？
exportで通しているだけなら、ターミナルを一度閉じれば解決するみたいです。

それも解決しない場合は以下を行ってください。

まず、

```
$ echo $PATH ←現在のパスの確認
```
これで現状の実行ファイルのパスが確認できます。
そのパスに
「/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:」
が含まれていない場合は

```
$ echo export PATH='/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH' >> ~/.bash_profile

$ source ~/.bash_profile

$ exit
```
これで解決しました。


#参考
・ターミナルで "command not found＂のエラーにしかならない時。
https://alis.to/kusshi/articles/3ldp4b5Rvmrw

・Linux入門 ~「パスを通す」とは~
https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015
BigQueryでLIKE文の複数条件指定をORから正規表現に直す

# 概要
BigQueryでLIKE文の複数条件指定をORから正規表現に置き換えます。

# 事の発端
IN演算子のLIKE版はありませんか？という質問を受けたので調べました。

```sql
Address IN ('東京', '新潟', '香川')
```

素直にORを使えば良いと思いますが、正規表現があるよ！
というアンサーはイマイチな気もしています。
※ORと正規表現でどれくらい抽出速度が変わるのか？までは調べられておりません

# SQL
## ORで書く場合
```sql
SELECT * FROM
(
  SELECT '東京都XXX' AS Address
  UNION ALL
  SELECT '神奈川県XXX' AS Address
  UNION ALL
  SELECT '新潟県XXX' AS Address
  UNION ALL
  SELECT '香川県XXX' AS Address
)
WHERE
  Address LIKE '東京%'
  OR Address LIKE '新潟%'
  OR Address LIKE '香川%'
```

## 正規表現で書く場合
BigQueryで正規表現を書くとき `REGEXP_CONTAINS` が使えます。

> REGEXP_CONTAINS(value, regexp)
> 説明
> value が正規表現 regexp に対して部分一致である場合、TRUE を返します。
> regexp の引数が無効な場合は、関数はエラーを返します。

公式ドキュメントより引用
https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators?hl=ja#regexp_contains

```sql
SELECT * FROM
(
  SELECT '東京都XXX' AS Address
  UNION ALL
  SELECT '神奈川県XXX' AS Address
  UNION ALL
  SELECT '新潟県XXX' AS Address
  UNION ALL
  SELECT '香川県XXX' AS Address
)
WHERE
  REGEXP_CONTAINS(Address, r'^(東京|新潟|香川)')
```
SSMパラメータストアから10件以上のデータを取得する

SSMパラメータストアから複数のパラメータを一括で取得したい！というときには`get_parameters`や`get_parameters_by_path`を使うといい感じに取れる。

ただ、これ知らなかったが一度に10件までしか取得できないようで、それ以降取得するには返却されるトークンを使ってリトライしないといけないらしい。

SSMパラメータストアの`/HOGE/`以下のパスに11件のパラメータを作っておきlambda(python3.8)で実験。

```python:lambda
import json
import boto3

ssm = boto3.client("ssm")

def lambda_handler(event, context):
    params = dict()
    responseSSM = ssm.get_parameters_by_path(
        Path = "/HOGE",
        WithDecryption = False
    )
    for param in responseSSM["Parameters"]:
        params[ param["Name"] ] = param["Value"]
    
    while True:
        if not "NextToken" in responseSSM:
            break
        responseSSM = ssm.get_parameters_by_path(
            NextToken = responseSSM["NextToken"],
            Path = "/HOGE",
            WithDecryption = False
        )
        for param in responseSSM["Parameters"]:
            params[ param["Name"] ] = param["Value"]
            
    for prm in params:
        print(prm)

    # params["/HOGE/FUGA1"] 等そのままパラメータ名を指定してアクセスできる。
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

IAMロールにSSMFullAccess権限を与えておき実行。

出力は以下のようになっている。10件以上取得できることが確認できた。
順番は。。謎。

```:log
/HOGE/FUGA1
/HOGE/FUGA10
/HOGE/FUGA11
/HOGE/FUGA2
/HOGE/FUGA4
/HOGE/FUGA5
/HOGE/FUGA6
/HOGE/FUGA7
/HOGE/FUGA8
/HOGE/FUGA9
/HOGE/FUGA3
```
Grape / Rails / Swagger UI   でAPIサーバーを構築する①



### grapeとは 
#### RESTful APIを簡単に作るためのDSL(ドメイン固有言語)です。


Ruby 2.4以降が必要です。gemをインストールするだけです。

※Usersモデル(name)が作成されているアプリがある前提で話を進めていきます。


## 1.インストール

gemをGemfileに追加します。

```ruby:Gemfile
gem 'grape'
```

`bundle install`
で実行します

## 2.基本ディレクトリの作成

```
[アプリ名] $ mkdir app/api
[アプリ名] $ mkdir app/api/base
[アプリ名] $ mkdir app/api/v1
```

## 3.base/api.rb の作成とマウント /V1::Rootの作成とマウント

```
[アプリ名] $ touch app/api/base/api.rb
```

```ruby:/api/base/api.rb
module Base
  class API < Grape::API
    mount V1::Root
  end
end
```

```ruby:config/routes.rb
Rails.application.routes.draw do
  mount Base::API => '/'
end
```


## 4.Base::APIからマウントするためのrootファイルを作成

APIの実装は app/api/v1 ディレクトリ以下に置いていくことになる。
また、 V1::Root 内で、各APIをマウントするのを忘れないようにする。

```ruby:/api/v1/root.rb
module V1
  class Root < Grape::API
    version :v1
    format :json

    mount V1::Users
  end
end
```

## 5.application.rbの編集

applicationクラス定義内に、以下を追加します。

```ruby:config/application.rb
config.paths.add File.join("app", "api"), glob: File.join("**", "*.rb")
config.autoload_paths += Dir[Rails.root.join("app", "api", "*")]
```

## 6.APIの実装

※Usersモデル(nameなど)が作成されているアプリがある前提で話を進めていきます。

以下のように追加します。

```ruby:/api/v1/users.rb
module V1
  class Users < Grape::API
    resources :users do
      desc 'returns all users'
      get '/' do
        @users = User.all 
      end

      desc 'returns an user'
      params do
        requires :id, type: Integer
      end
      get '/:id' do
        @user = User.find(params[:id])
      end

      desc 'Create an user'
      params do
        requires :name, type: String
      end
      post '/' do
        @user = User.create(name: params[:name])
      en d

      desc 'Delete an user'
      params do
        requires :id, type: Integer
      end
      delete '/:id' do
        @user = User.find(params[:id])
        @user.destroy
      end
    end
  end
end
```

アプリを起動しましょう。

```
$ curl http://localhost:3000/v1/users
```

すると

```
{
    "id": 61,
    "name": "中島 七海",
    "email": "sample-59@email.com"
  },
  {
    "id": 62,
    "name": "渡辺 結菜",
    "email": "sample-60@email.com"
  }
```

のように返って来るはずです！！！！！（model内容によって違います）

## Grape / Rails / Swagger UI   でAPIサーバーを構築する②
今回APIを作成できたので、次回はそのAPIをSwagger UIで
簡単に操作できるようにします。
https://qiita.com/tksh8/items/c3a80a7cdfbd5086403f
[rails]ECサイトでのカートの作り方（カートモデル持たない版）


カートモデルを作らずにカート機能を作れたので、貼っておきます。
ネット上にあまり記事がなかったので、、、

```ruby:cart_items_controller
def create
    @cart_item = current_user.cart_items.build(cart_item_params)
    @cart_item.save
end
```
思いの外、シンプルになりました。
ここから、商品詳細のviewで必要なキーを代入していきます。

```ruby:items/show.html.erb

    <%= form_for(@cart_item) do |f| %>
      <% if user_signed_in? %>
        <%= f.hidden_field :user_id, :value => current_user.id %>
      <% end %>
    <% end %>
```
まずは、ログインしているユーザーのPKをカートの商品のFKに入れてあげましょう。
買い物で言うと、棚から商品とって「これ、自分の番号書いとこ」みたいなイメージですかね。
ここでif文にしないと、ログインしていないユーザーが商品詳細ページに行けないので注意。

```ruby:items/show.html.erb

    <%= form_for(@cart_item) do |f| %>
      <% if user_signed_in? %>
        <%= f.hidden_field :user_id, :value => current_user.id %>
      <% end %>                                  ↓Item.find(params[:id])
        <%= f.hidden_field :item_id, :value => @item.id %>
        <%= f.submit "カートに入れる", class: "btn btn-primary" %>
    <% end %>
    
```
あとは、商品側もキーを代入してあげましょう。
カートに入ってる商品見て、「てか、これどこの棚にあったん？棚の番号もふっとこか。」みたいな感じですかね。すいません。
hidden_fieldでキーを代入すると、シンプルになりますね。ちょっと感動しました。


参考までに↓

```ruby:schema.rb

create_table "cart_items", force: :cascade do |t|
    t.integer "item_id"
    t.integer "user_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```
eSIM活用

iPhone XS/XS Max/XR/11/11Pro/11Pro Max
iPad Air 2019
iPad mini 2019
iPad Pro 11'' 2018/2020
iPad Pro 12.9'' 2018/2020
で利用可能になったeSIMですが、楽天モバイルから「iPhoneは動作保証外だがeSIM対応製品」とアナウンスされたので、安心してiPhoneで楽天のeSIMを使えるでしょう。もっとも、eSIM自体、国際標準規格に準拠しているはずなので、BAND対応/非対応を除き、使えるのが当たり前のはず。1年間無料なので、通信専用とするのが吉ですが、eSIMの契約が当初はできない仕様なので、RAKUTEN miniを契約してからeSIM再発行するか、適当なAndroid端末を契約してからSIM変更でeSIMにするか等、思案中。
https://network.mobile.rakuten.co.jp/product/sim/esim/
iPhoneアプリ開発入門

#はじめに
某プログラミング学習サイトの実施記録を記します。

#04
・シミュレータ起動：Command + R
・Optionキーを押しながらマウス操作：二本指の点対称操作

#08
・複数のデバイスでの部品配置について、Editor > Previewから確認しておく必要がある。

#09
・画面を増やすには、View ControllerをMain.storyboardにD&Dする。
・ボタンによる遷移先を指定するには、ボタンを選択した状態でControlを押しながら遷移先の画面にD&Dして「Action Segue」で「Present Modally」を選ぶ。
・下記のエラーを解決した
https://qiita.com/kagiyo/items/1105aaa05f7dcd406ce2

#10
・遷移した画面から元の画面に戻る動作を設計するとき、遷移先の画面のボタンを選択した状態でControlを押しながら元の画面にD&Dすると、元の画面に戻るのではなく新しく画面が作成されてしまう。
・遷移先の画面を終了することで、元の画面に戻るよう設計する。
・ViewController.swiftのclass ViewController:UIViewControllerクラスに「@IBAction func (関数名)(segue:UIStoryboardsegue)」を追加する。関数の中身は空で良い(終了時の動作がないため)
・main.storyboardで、遷移先の画面の「元に戻るボタン」を選択してContorolを押しながら右上のExitにD&Dする。
・作成した関数が表示されるので選択する。
・シミュレータを起動すると、遷移先の画面の「元に戻るボタン」をタップすると確かに元の画面に戻る。

#11
・ボタンによる遷移先を指定する方法としてControlを押しながらD&Dは、一つの画面から一つの画面を呼び出す時に適しる。
・階層的に画面を呼び出すためにはNavigation Contorollerを使う。
・関連づけるボタンを選択してControlを押しながらD&Dし、「Actioon Segue」で「Show」を選ぶ(Navigation Controllerを使う場合はShowを選ぶ)
・Showだけでは戻れないので、遷移元の画面を選んでEdit > Embed In > Navigation Controllerを選ぶ

#12：ボタンを押すとラベルのテキストが変わるように設計する
・画面のViewControllereを選択して、右ペインの「Is Initial View Controller」にチェックを入れる
　→ アプリが最初に表示される画面に指定される(画面左に「→」が表示される」)

#13：No12の続き
・アシスタントエディタを開きソースコードを表示する
　(ViewController.swiftが開く)
・ラベルを選択し、Controlを押しながらソースコードの空行(関数の間)にD&Dする。
・ラベルを変数に紐付けたいだけであれば、「Connection」は「Outlet」で良い。
　→ ラベルが変数として登録される
・ボタンを選択してControlを押しながらソースコードの空行にD&Dする。
・ボタンを押したときの処理を紐付けたいので、ConnectionはActionを選ぶ
・関数内に「(ラベル名).text = (変更文字列)」と入力する。
・シミュレートする(Command R)
・ボタンをクリックすると、ラベルが上記の(変更文字列)に変わる

以上
[社内勉強会] プログラミングでインフラ定義

### 今回話すこと

プログラミングにインフラを作成する
AWSのCDK（Cloud Developer Kit）の入門について話す

### ざっくりCDKとは

AWSでインフラ定義するものとして、CloudFormationやTerraformといった手法がある。
記述に癖があるものが多い中、プログラミングで記載できるのがCDKの特徴。

CDKに対応しているプログラム言語は、
JavaScript、TypeScript、Python、 Java、およびC#に対応している

記載例） SQSとSNSを立ち上げるコード。TypeScriptで出来ている。

```typescript
export class HelloCdkStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const queue = new sqs.Queue(this, 'HelloCdkQueue', {
      visibilityTimeout: cdk.Duration.seconds(300)
    });

    const topic = new sns.Topic(this, 'HelloCdkTopic');
    topic.addSubscription(new subs.SqsSubscription(queue));
  }
} 
```

ただし、実態はCloudFormation
プログラミングをCloudFormationに変換して実行してくれるもよう

### ハンズオン

こちらのワークショップで進めいていく。

実際につくるのは、プログラミングからLamdbaとAPIGateWayでHelloWorldを作成する。

https://cdkworkshop.com/15-prerequisites.html
Font Awesomeの導入手順について

##背景

アイコンをすぐに導入できるため使ってみたくなり調べた手順内容を記載。

## 手順

1.Gemfileに、以下を記述。

```
gem "font-awesome-sass"
```

こちらも忘れずに。。

```
bundle install
```


3.application.scssに、以下を記述。　　　　　　
                    
```application.scss
@import "font-awesome-sprockets";
@import "font-awesome";
```


### おまけ知識
icon('接頭辞名', 'アイコン名')
[例]
icon('far', 'clock')
macOSのNetworkExtension利用上の注意点


# まずは結論から

1. プロビジョニングプロファイル内のentitlementsとXcode内のentitlementsファイルのkey名が一致することは必ず確認すること
2. Xcodeのビルドログをちゃんと読むこと

# 何が起きたのか

NetworkExtensionを利用したmacOS向けアプリを作成しようとしたときに下記の謎の事象が起きました。

- リリースビルドしたアプリを実行すると、```EXC_CRASH (Code Signature Invalid)``` というエラーが発生し、落ちる
- 署名自体は問題なく、Notarizationの取得も成功しているにも関わらず、エラーが発生し、落ちる
- 一方でデバッグビルドだと問題なく起動ができる

[別の投稿](https://qiita.com/noby111/items/8ea98021bad1ea0470c8)に詳細は書いてありますが、Xcode11で適切に設定を行えば、署名とNotarizationの取得を行うことができます。

尚、アプリに署名が付いているかとNotarizationが取得できているかは下記のコマンドで確認することができます。

### 署名の確認
```$ codesign -dv xxx.app```

### Notarizationの確認
```$ spctl -a -vv xxx.app```

# 原因

Xcode上のビルドログをよく読むと、そこにヒントが書かれていました。
尚、???はプロビジョニングプロファイル名が、XXXはアプリのターゲット名が入ります。

> warning: Provisioning profile "???" for "XXX" contains entitlements that aren't in the entitlements file: com.apple.developer.system-extension.install. To use these entitlements, add them to your entitlements file. Otherwise, remove unused entitlements from your provisioning profile. (in target 'XXX')

つまりはプロビジョニングプロファイル内のentitlementsにXcode内にあるentitlementsファイルに無い値が入っていますよとのワーニングが出ています。

そんなばかな、Apple Developerの正規の手順で作ったプロビジョニングプロファイルとXcodeのCapabilityから作ったentitlementsファイルだぞ！おかしいはずはない！と思って確認したところ見事に一致していませんでした。
プロビジョニングプロファイル内のentitlementsは下記のコマンドで確認ができます。

### 確認コマンド
```$ security cms -D -i プロビジョニングプロファイル``` 

確認したところ、プロビジョニングプロファイル内では NetworkExtensionのentitle名として **packet-tunnel-provider-systemextension** という値を確認できましたが、Xcode内のentitlementsファイルでは **packet-tunnel-provider** という値になっていました。

Xcode内のentitlementsファイル内の値をpacket-tunnel-provider-systemextensionに修正してビルドしたところ、起動時に落ちることはなくなりました。
また、デバッグビルドで落ちなかった理由は、デバッグビルド用のプロビジョニングプロファイルではentitle名がpacket-tunnel-providerになっているためでした。

# 最後に

[公式のドキュメント](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_networking_networkextension)を改めて確認すると次の説明がありました。

> packet-tunnel-provider-systemextension
The APIs you use to tunnel IP packets to a remote network using any custom tunneling protocol, when signed with a Developer ID profile.

確かに、今回のアプリはMac App Store外で配布するため、Developer IDの証明書で署名を行なっていました。
更によく読むとMac App Store外でアプリ配布するときにはプロジェクト内のentitlements.plistの値をプロビジョニングプロファイルインポート後にこうしんするようにとの注意点も書かれてありました。

また、[Appleのフォーラム](https://forums.developer.apple.com/thread/67613)にも次の注意事項が書かれていました。

> \#8 — On the Mac, can Developer ID apps host NetworkExtension providers?
>
>Yes, but there are some caveats:
>
>This only works on macOS 10.15 or later.
>
>Your NetworkExtension provider must be packaged as a system extension, not an app extension.
>
>You must use the xxx-systemextension values for the NetworkExtension entitlement >(com.apple.developer.networking.networkextension).
>
>See my 14 Jan 2020 post on this thread for more details.

NetworkExtensionを使ったアプリをビルドする際にはご注意ください。
[Rails]データベース設計について

## 基礎知識

#### データベースを構成する要素
1.サービスで扱う概念。もしくは情報。(エンティティ)　　※　エンティティ=サービスで扱う情報の大枠

2.エンティティの属性　　　　　　　　　　　　　　　　　※　属性=エンティティが持つ情報　
　　　　　　　　
3.エンティティ同士の関係性（リレーション）




#### データベース設計の手順
1.データベースで管理するデータ（エンティティ）を決める

2.それぞれのデータが持つ属性を決める

3.エンティティ同士の関係性を決める

4.データを実際にデータベースのテーブルとして定義する


#### キーの種類
主キー = あるテーブル内のレコードを判別するための識別子となるカラム。大体はidカラム。

外部キー = 関連する他のテーブルのレコードの主キーを値として持つカラム。"多"のテーブルにおく。


#### 制約
制約とは特定のデータの保存を許さないためのバリデーションのこと。

1.NOTNULL制約=カラムの値にはNULL（空の値）を入れることができなくなる。
[例]

```20××××××××××××××××.rb

t.string :name, null: false

````

2.一意性意性制約　=　テーブル内で重複するデータを禁止する制約.(※add_indexの中で制約をつけれる)
[例]

```20××××××××××××××××.rb

add_index :users, :title, unique: true

````

3.主キー制約　=　主キーである属性値が必ず存在してかつ重複していないことを保証する制約。
　　　　　　　　　(主キーに対してNOT NULL制約と一意性制約を両方設定するのと同義)
※Railsでテーブルを作成する際、主キー制約は元々実装されている。

4.外部キー制約=外部キーの対応するレコードが必ず存在しなくてはいけないという制約。
　　　　　　　　
[例]

```20××××××××××××××××.rb

t.references :user, foreign_key: true

````


####インデックス
テーブル内のデータの検索を高速にするための仕組みのこと。

デメリット
1.データを保存・更新する速度が遅くなる
2.データベースの容量を使う
[例]→add_index :テーブル名, :カラム名


#### 正規形
データベースのデータ構造をより効率的で重複や無駄のないシンプルな構造にするための手順。
非正規形から第一正規形、第二正規形、第三正規形と段階を踏んでいく。
正規化するたびパフォーマンスは下がるため、最低限レベルの第３正規形までに留める。


#### READMEへのDB設計

[例]

######usersテーブル

|Column|Type|Options|
|------|----|-------|
|email|string|null: false|
|password|string|null: false|
|username|string|null: false|

######Association

- has_many :messages
- has_many :groups
- has_many :groups_users
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host isの解決法

AWSの作業をしていたら以下のエラー。


```
S:.ssh sahota0701nemoto$ ssh -i aaaa.pem ec2-user@18.180.202.188
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:TyeE9O0wDaMbxrOIaYWj50sPOgWFnJzkEs55zjhHUuk.
Please contact your system administrator.
Add correct host key in /Users/shogo/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/shogo/.ssh/known_hosts:10
ECDSA host key for 18.180.202.188 has changed and you have requested strict checking.
Host key verification failed.
```
キーがなくなった。したがって新しい物を作ります。

```
S:.ssh sahota0701nemoto$ ssh-keygen -R 18.180.202.188
# Host 18.180.202.188 found: line 10
/Users/shogo/.ssh/known_hosts updated.
Original contents retained as /Users/shogo/.ssh/known_hosts.old
S:.ssh sahota0701nemoto$ 
```

```
$ ssh-keygen -R 自身のIpアドレスもしくは弾かれた物。
```

終わり。
Railsのルーティングにつて！

#はじめに
自分のアウトプット用に整理して見ました、また、備忘録をかねてまとめたいと思います。
　
#ルーティングとは
簡単に「どのようなURLへどのようなHTPPメゾットでアクセスされたら、コントローラーのアクションを呼び出したいか」

````config/routes.rb
  get 'user/index' to: 'user#index'
````
get メゾットで'user/index'というURLに対してのリクエスト来たらUserControllerのindexアクション呼んで！！！って感じ



#最後に
とても基礎ですが、個人的にとても大切だと感じました！
最後までありがとうございました
Gitの基礎知識一覧

# 基礎用語
リポジトリ = ファイルやディレクトリの変更履歴を保管しておく入れ物。

ローカルリポジトリ = 自分のPCに置くリポジトリ。

リモートリポジトリ = 外部のサーバーなどネットワーク上に置くリポジトリ。

インデックス = バージョンを記録するためにファイルを一時的に登録する場所。
           (バージョンを記録したいファイルはインデックスにあげる。)
       
コミット = インデックスに追加された変更修正をバージョン記録する操作。

masterブランチ = 最初のコミットを行うと自動生成されるブランチ。大元。

トピックブランチ = masterブランチをコピーしたブランチ。機能ごとに作成し完成したらmasterブランチに結合させる。
        
プルリクエスト = 各コミットにおける変更修正にコメントをつける機能。
※作成時のポイント
1.実装途中は、[WIP]をタイトルの先頭につける
2.詳細は、WhatとWhyで書く
3.マークダウン表記で書く

LGTM = Looks good to me(コードに問題ないからマージしていいよ！)

マージ = 結合させる

プル = リモートリポジトリの変更をローカルリポジトリに取り込む操作


<よく使うコード>
※変更したファイルを確認する時、addされているか確認する時に
git statusを用いる。
（変更されたファイルは赤文字になる）
（add済は赤文字、add未は緑文字）

```

$ git status
```

※変更内容を把握したい時
git diffを用いる。
（追加されたコードが緑色で表示）
（変更前のコードが赤文字で表示）

```

$ git diff
```

※コミットメッセージを見たい時
git log（git log -p）を用いる。
（）内は内容を見たい時に使う。


```

$ git log

$ git log -p
```
今更だけどrails6でいいね機能を作ってみた！ [非同期通信,ajax,js]

###はじめに
先日、開発したサイト[資格試験の質問サイト Qua](https://www.quaquestions.com/)（よくわからない人は以下のリンクを見てね！
[rails歴10ヶ月の人が初めてWEBアプリを公開してみた](https://qiita.com/UTOG/items/4fc66f8b43286209ddaf))にいいね機能をつけました。簡単だろうと思っていたけど意外に手こずったところがあったので軽い説明とともに記事に残そうと思います。あと書いている私自身も初心者なので間違っている部分、もっといい方法がある場合はコメントに書いてくれると嬉しいです。

###前提
初心者向け
投稿モデルはQuestionモデル
ユーザーモデルはUser.rb
がある前提です。

##likeモデルを作る

投稿データを紐付けるlike_idと投稿した人のデータを登録するliker_idを作る。（わかりにくいので別の名前がいいかもしれない。）

```shell:ターミナル
rails g model like like_id:integer liker_id:integer 
#カラムをもう少し違う名前にしたほうがわかりやすいかもしれない。
```

```ruby:db/migrate/xxx_create_likes.rb
class CreateLikes < ActiveRecord::Migration[6.0]
  def change
    create_table :likes do |t|
      t.integer :like_id
      t.integer :liker_id

      t.timestamps
    end
  end
end

```
↑こんな感じになったはず。
そしたらuserモデルに

```erb:user.rb
has_many :likes
```

と書く。

##アクションを作ろう
```shell:ターミナル
rails g controller likes
```
```ruby:likescontroller.rb
class LikesController < ApplicationController
    def create
        @like = Like.new(like_id: params[:like_id], liker_id: current_user.id )
        @like.save
        @question = Question.find_by(id: @like.like_id)
        @likes = Like.where(like_id: @question.id)
    end

    def destroy
        @like = Like.find_by(like_id: params[:like_id], liker_id: current_user.id)
        @question = Question.find_by(id: @like.like_id)
        @like.destroy
        @likes = Like.where(like_id: @question.id)
    end
end
```

簡単に説明するとcreateアクションの一行目で投稿と紐付けるlike_idといいねしたユーザーを認識するためのliker_idを登録する。
三行目で投稿データのIDを取得して四行目の@likesでいいね数をカウントする。
destroyはその名の通りcreateで作ったデータを消す。
単純っちゃ単純なしくみ。

##テンプレートを作る

_like.html.erbという名前でテンプレートを作る。

```erb:views/likes/_like.html.erb
<div class="like_button">
    <% if current_user.likes.find_by(like_id: @question.id) %>
        <%= link_to "いいね済み", {controller: :likes, action: :destroy, like_id: @question.id}, method: :delete, remote: true %>
    <% else %>
        <%= link_to "いいね", {controller: :likes, action: :create, like_id: @question.id}, method: :post, remote: true %>
    <% end %>

    <%= @likes.count %>
</div>
```

二行目でユーザーがいいねしているかどうか判別しtrueなら「いいね済み」,falseなら新しく「いいね」できるボタンを表示。

###jsを書く
非同期通信をするためjsを書きます。
create.js.erbとdestroy.js.erbを新しく作り、

```javascript:views/likes/create.js.erb
$(".like_button").html("<%= j(render("likes/like")) %>");
```

```javascript:views/likes/destroy.js.erb
$(".like_button").html("<%= j(render("likes/like")) %>");
```

この一行だけで非同期通信ができるようになります。めちゃめちゃ簡単で短く楽ですね。

###routes.rb

```ruby:config/routes.rb
  post "likes/:like_id", to: "likes#create"
  delete "likes/:like_id", to: "likes#destroy"
```

これだけです。当たり前ですがデータの製作と削除をするだけなのでgetやpatchはいりません。
あとはいいね機能を実装したいページにrenderを書くだけです。

```erb:好きなところ（僕の場合はshow.html.erb)
<% if user_signed_in? %>
<%= render "likes/like" %>
<% end %>
```

登録されていない人に押されるとエラーになるため一行目で登録していない人はボタンが表示されないようにしています。

###おわり

お疲れさまでした！うまくいいね機能は実装できましたか？僕はいいね機能は結構難しいと思っていたのですが意外に仕組みは簡単なんだなと思いました。最後にここまで読んでくれてありがとうございました。(*´ω｀*)
[Swift]Realm Swift #1  クラス

iOS で`Realm　Swift`  を 調査し、クラスを作成してみました。

## 目次
・Realm Swift #1 クラス
[・ Realm Swift #2 サンプル  ](https://qiita.com/mario7/items/a0a6a4e4c09ce1e0986b)
[・ Realm Swift #3 トラブル対応](
https://qiita.com/mario7/items/d10170fb649acd05dcd3)

# Realm Swift
プロパティの定義

① `dynamic` キーワードと`@objc`
　　・`dynamic` キーワードを使いたい場合、明示的につける

　　・理由：内部で Objective-C で書かれた専用のアクセスメソッドに置き換えられるため

※参照資料
[https://realm.io/docs/swift/3.20.0/](https://realm.io/docs/swift/3.20.0/)
[https://github.com/realm/realm-cocoa](https://github.com/realm/realm-cocoa)
[RealmSwift-introduction](https://dev.classmethod.jp/articles/realmswift-introduction/)

## 動作環境
- Swift 5.0
- Xcode 11.1
- Carthage
  - github "realm/realm-cocoa" == 3.20.0
  

##  クラス

＊　Source: [RealmBaseDao.swift](https://github.com/mario7/studyForiOS/blob/realmJsonSample/realmAndJsonSample/realm/RealmBaseDao.swift)


```RealmBaseDao.swift
import RealmSwift

class RealmBaseDao <T: RealmSwift.Object> 
```

###レコードの追加

```RealmBaseDao.swift

    /**
     レコードの追加
     - parameter :  T
     */
    func add(obj :T) throws {
        
        try realm.write {
                realm.add(obj)
        }
    }
```

###レコードの更新

```RealmBaseDao.swift
    /**
     レコードの更新
    　 条件： primaryKey()が実装されている時のみ有効
     - parameter :  T
     - parameter :  (() -> Void)?
    */
    func update(obj: T, block:(() -> Void)? = nil) throws {
        
        try realm.write {
            block?()
            realm.add(obj, update: .modified)
        }
    }
```

###レコードの削除

```RealmBaseDao.swift
    /**
     * レコードの削除
     */
    func delete(obj: T) throws {
        
        try realm.write {
            realm.delete(obj)
        }
    }

```
 [≫ Realm Swift #2  サンプル  ](https://qiita.com/mario7/items/a0a6a4e4c09ce1e0986b)
ACM(AWS Certificate Manager)で証明書をインポートする際はプライベートキーの暗号化はNG

表題通りですが、ACM(AWS Certificate Manager)で証明書をインポートする際はプライベートキー（秘密鍵）の暗号化はNGです。
CSRを作成時に秘密鍵にパスフレーズを設定した場合は、パスフレーズを削除するか再作成しなければインポートできません。

https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/import-certificate-format.html
https://docs.aws.amazon.com/ja_jp/acm/latest/userguide/troubleshoot-import.html

公式ドキュメント上もその記載があります。

>プライベートキー (存在する場合) は暗号化されていない必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257241/81420046-b5d9-2a64-33c4-d7aecd4c4d4f.png)



#補足：opensslでパスフレーズを削除するコマンド
```
# openssl rsa -in <パスフレーズが設定されている秘密鍵> -out <パスフレーズを解除した後の生成される秘密鍵名>
```
Apache Velocityでクラスパス上のテンプレートを使用

https://stackoverflow.com/questions/2931516/loading-velocity-template-inside-a-jar-file

```gradle:build.gradle
dependencies {
    implementation 'org.apache.velocity:velocity:1.7'
}

```


```text:/src/main/resources/templates/hoge.vm
key = $key
```

```java
import java.io.IOException;
import java.io.StringWriter;
import java.util.Properties;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;

public class Main {

  public static void main(String[] args) {
    Properties p = new Properties();
    p.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");
    p.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
    Velocity.init(p);

    Context context = new VelocityContext();
    context.put("key", "value0001");

    Template template = new Template();
    template = Velocity.getTemplate("templates/hoge.vm", "UTF-8");

    try (StringWriter body = new StringWriter();) {
      template.merge(context, body);
      body.flush();
      System.out.println(body.toString());;
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

```