OmniAICreator/Qiita-1.07M huggingface dataset:
PHPのfor foreachの違いについて

<h1>PHPにおけるfor, foreachの違いについて</h1>

for, foreachについてはどちらも繰り返し処理に対して、使いますが、それぞれ
違いがありますので、サンプルコードを載せて、解説したいと思います。


<h2>forについて</h2>

forについては同じ処理を繰り返し実行するために使います(例えば１から１２までの数値を出力する場合など)

○サンプルコード
<?php for($i=1; $i<12; $i++)

{echo $i . "\n";} ?>

○出力結果
1
2
3
4
5
6
7
8
9
10
11
12


<h2>foreachについて</h2>

foreachについては配列をループさせるために使用します。
配列とは1つの箱に複数の値を入れることができます。

○サンプルコード<br>
<b><?php  $name = array('sasaki', 'ito', 'suzuki', 'takahashi');foreach($name as $value) 

{echo $value . "\n";}
?></b>

○出力結果
sasaki
ito
suzuki
takahashi<br><br>

【補足】配列内で出力する値を指定する場合は以下のように[]内で値のIDを指定します。
idは1番最初のものが、０、２番目が１になります。

<?php
$name = array('sasaki', 'ito', 'suzuki', 'takahashi');

 echo $name[0]←
?>
○出力結果
sasaki



<h2>まとめ</h2>
foreachは配列に使うのに対して、forはそれ以外の繰り返し処理に使うことになります。
【AWS】ソリューションアーキテクト-アソシエイト(SAA)合格記

#はじめに
AWS認定試験-ソリューションアーキテクト-アソシエイト(SAA)に合格した(2020-07-26)ので、合格までの道のりを残しておこうと思います。
CLF合格記は以下をご覧ください。
[【AWS】クラウドプラクティショナー(CLF)合格記](https://qiita.com/nnydtmg157/items/6c66a23d6b4c544cfcb2)

SAAはCLF合格後すぐに勉強を始めました。

#What's SAA?
まずは、SAA試験について
[AWS認定 ソリューションアーキテクト – アソシエイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)

上記サイトによると、認定によって検証される能力は以下のようです。

* AWS のテクノロジーを使用して安全で堅牢なアプリケーションを構築およびデプロイするための知識を効果的に証明すること
* 顧客の要件に基づき、アーキテクチャ設計原則に沿ってソリューションを定義できること
* プロジェクトのライフサイクルを通して、ベストプラクティスに基づく実装ガイダンスを組織に提供できること

SAAはCLFよりもベストプラクティスに基づいた設計ができるかどうかの要素が大きいように思います。

#試験に向けて
###公式サンプル問題
これはCLFと変わらず事前に受けて現状のレベルの確認をします。
私は50％ほどの出来でした。

###参考書を読む
私は以下の本を読みました。
[AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/479739739X)

###ホワイトペーパーを読む
CLFと同じくホワイトペーパーを読みました。

###ハンズオンに参加する
幸いなことに会社から研修への参加許可が出たので、「Architecting on AWS」に参加しました。
こちらは、実機にて設定ができるので参加してよかったと思います。

###Black Beltを読む
こちらもCLFと同じくBlack Beltを読みました。

#試験当日
上記対策を計2週間(延べ18時間程度)行い、試験に臨みました。

結果は、660点(720点以上で合格)で不合格でした。

#試験に向けて(2)
前回は問題演習が少なかったと反省したので、上記復習に加えて、以下のサイトにて問題演習を行いました。

###問題を解く
[AWS WEB問題集で学習しよう](https://aws.koiwaclub.com/)

こちらのサイトは一問ごとに解説が表示され、都度確認ができ、BlackBeltやホワイトペーパーへのリンクもあるので、勉強しやすかったです。

#試験当日(2)
上記対策を2週間(延べ20時間程度)行い、試験に臨みました。

結果は、725点(720点以上で合格)で、なんとか合格でした。

#感想
CLFよりもやはり難易度は非常に高く、より設計にフォーカスする部分が多かったように思います。
また、コストを優先するのか、期間を優先するのかなど、問題によって観点が変わるので、そこに注意する必要がありました。

各サービスのより深い部分(S3のライフサイクルや、セキュリティグループの設定内容、ACLの設定内容など)に言及する部分が多かったので、その点を勉強してもらえれば一発合格できると思います。

今後は他のアソシエイト試験の記事も書いていきますので、興味があれば見てみてください。
Hurry Coderと魔法の数字

## 登場人物
- ハリー先輩・・・忙しい先輩。「ハリー・コーダー」と呼ばれている。
- ワイ・・・・・・ワイ

## とあるシステム開発会社にて

ハリー先輩「なあ、やめ太郎」

ワイ「なんでっか、ハリー先輩？」

ハリー先輩「去年お前が構築した**マンガ販売サイト**あるやろ？」
ハリー先輩「その修正作業を今やってるんやけど」

ワイ「あー、あの案件、ハリー先輩が引き継いでくれたんでっか」
ワイ「おおきにです」

ハリー先輩「それはええねんけど、ちょっと分からへんことがあんねん」

ワイ「なんでっか？」

ハリー先輩「あのな・・・」

```typescript
const campaignMessage = (campaignStatus: number): string => {
  switch (campaignStatus) {
    case 0:
      return "もうすぐコミック半額キャンペーンが始まるよ！"

    case 1:
      return "キャンペーン開催中！対象コミックスはこちら！"

    case 2:
      return "次回キャンペーンもお楽しみにね！"
    
    default:
      return "エラーが発生しました。サイト管理者にお問い合わせください。"
  }
}
```

ハリー先輩「↑この関数についてやねん」
ハリー先輩「`campaignStatus`という引数の値によって」
ハリー先輩「画面に表示するメッセージを出し分けてるみたいなんやけど」

ワイ「はい」

ハリー先輩「この`campaignStatus`っていう数値、何なん？」
ハリー先輩「キャンペーンの状態を表してるとは思うんやけど」
ハリー先輩「`0`とか`1`とか`2`って、何なん？」

ワイ「ああ、それなら・・・」

> `0` -> キャンペーン**開催前**
> `1` -> キャンペーン**開催中**
> `2` -> キャンペーン**終了後**

ワイ「↑こういう意味ですわ」
ワイ「APIから取得した数値なんですわ」

ハリー先輩「ああ、そうなんか」
ハリー先輩「初めてこのソースを見る人は、数値だけだとよう分からんから」
ハリー先輩「一応コメントとか書いといてや」

ワイ「何を言うてはるんですか」
ワイ「ちゃんと**社内Wikiのどっか**に書いてありまっせ」

ハリー先輩「**どっか**て」
ハリー先輩「どこが**ちゃんと**やねん」
ハリー先輩「貴様も把握しとらんやないかい」

ワイ「ぐぬぬ」

ハリー先輩「ええか？」
ハリー先輩「こういう数値は**マジックナンバー**いうねん」

ワイ「マ、マジックナンバーでっか？」

## マジックナンバーとは

ハリー先輩「マジックナンバーいうんはな・・・」

> 保守担当「さあ、修正するためにコード読んでいこか」
> 保守担当「ん？`campaignStatus === 0`・・・？」
> 保守担当「なんやこの`0`って」
> 保守担当「何を表しとるかよう分からんけど、プログラムはちゃんと動いとるな」
> 保守担当「なんか**魔法の数字**みたいやな」

ハリー先輩「↑こんな感じや」

ワイ「上手いこと言うたもんですな」
ワイ「ほな、どう書けばええんですか」

ハリー先輩「せっかく**TypeScript**を導入してんねやから」
ハリー先輩「`enum`型でも使えばええやろ[^1]」

```typescript
enum CampaignStatus {
  BeforeStart = 0,
  IsStarted = 1,
  IsEnd = 2
}
```

ハリー先輩「↑こうや」

ワイ「へえ」
ワイ「それぞれの数値に名前を付けてやった感じでっか」

ハリー先輩「せや」
ハリー先輩「そんで、関数の方は・・・」


```typescript
const campaignMessage = (campaignStatus: CampaignStatus): string => {
  switch (campaignStatus) {
    case CampaignStatus.BeforeStart: // <- 変更
      return "もうすぐコミック半額キャンペーンが始まるよ！"

    case CampaignStatus.IsStarted: // <- 変更
      return "キャンペーン開催中！対象コミックスはこちら！"

    case CampaignStatus.IsEnd: // <- 変更
      return "次回キャンペーンもお楽しみにね！"
    
    default:
      return "エラーが発生しました。サイト管理者にお問い合わせください。"
  }
}
```

ハリー先輩「↑こうや」

ワイ「あー、確かに」
ワイ「さっきまでのコードは・・・」

> 「`0`だったら」
> 「`"もうすぐコミック半額キャンペーンが始まるよ！"`って表示してや！」

ワイ「↑こんな感じでしたけど」

> 「`CampaignStatus.BeforeStart`だったら」
> 「`"もうすぐコミック半額キャンペーンが始まるよ！"`って表示してや！」

ワイ「↑こっちの方が説明的で良いかもしれまへんな」
ワイ「初めてこのコードを読んだ人でも分かりそうですわ・・・」

ハリー先輩「せやろ」
ハリー先輩「『**リーダブルコード**』[^2]でいう**説明変数**みたいなもんや」

ワイ「なるほどー」

> 「この数値は、こんな意味でっせ！」

ワイ「ってことを**命名**で表現するわけでんな」

## まとめ

- マジックナンバーやめよう
- 説明変数を使おう
- `enum`は、名前と数値の対応表みたいに使える[^3]

ワイ「ってことでんな！」

ハリー先輩「そんなとこや！」

ワイ「ハリー先輩、今日も勉強になりましたわ！」

**〜おしまい〜**



[^1]: 型安全性的には、readonlyなオブジェクトから生成した`Union`型を使用するほうが良いかもです。
[^2]: 有名な本です。
[^3]: 今回の場合、数値を書かなくても同じように動きます。また、文字列も指定できます。
Keycloak 概要

Keycloakの概要情報をまとめる。学習目的記事。

## Keycloakとは？
* オープンソースのアイデンティティ・アクセス管理用ソフト。

## Keycloakの機能

※以下、[公式](http://keycloak-documentation.openstandia.jp/master/ja_JP/server_admin/index.html#%E6%A9%9F%E8%83%BD)サイトより抜粋。

* SSO/SLO
* 以下のプロトコルサポート
  * OpenID Connect
  * OAuth 2.0
  * SAML
* 外部のOpenID Connect/SAMLに対応しIdPによる認証。
* ソーシャル・ログイン 
* ユーザー・フェデレーション
* ユーザー、ロール、ロール・マッピング、クライアント設定の管理コンソール。
* ユーザーに自身のアカウントを一元管理することを許可するためのアカウント管理コンソール。
* 二要素認証
* ログイン・フロー
  など...

## Keycloakの概念
![keycloak_concept.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/b3c55d1e-a159-817c-5f02-8b00838cd456.png)

* **ユーザー**
  * システムにログイン可能なエンティティーを指す。Eメール、ユーザー名、住所、電話番号、生年月日など自分自身に関連する属性を保持する。また、"グループ"や"ロール"が割り当てられることもある。
* **クレデンシャル**
  * Keycloakがユーザーの身元を確認するために使用するデータの一部を指す。例：パスワード、ワンタイムパスワード、デジタル証明書、指紋など。
* **ロール**
  * ユーザーのタイプまたはグループの識別子を指す。 `Admin`、`user`、 `manager`、`employee` などが組織内に存在するロールとして定義されている。パーミッションを割り当てて、複数のユーザーに対する制御が可能。ユーザーには0以上のロールをマッピング可能。
* **グループ**
  * ユーザーの管理単位を指す。属性を定義可能。ロールをマッピングできる。グループのメンバーになったユーザーは、そのグループが定義する属性とロールのマッピングを継承する。
* **レルム**
  * ユーザー、クレデンシャル、ロール、および、グループのセットを管理する主体を指す。ユーザーは属しているレルムにログインする。レルムは互いに分離され、制御するユーザーのみを管理し、認証できる。
* **クライアント**
  * Keycloakにユーザーの認証を要求できるエンティティーを指す。Keycloakを使用して自身を保護し、シングル・サインオン機能を提供するアプリケーションとサービスを指す。また、クライアントはKeycloakによって保護されるネットワーク上の他サービスをセキュアに呼び出すために、アイデンティティー情報やアクセストークンを要求する。

## ローカルDocker環境構築
ローカルでのDocker環境構築例
1. 以下のDockerコマンドを実行する。

   ```shell
   docker run -d -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=adminpass --name keycloak_test jboss/keycloak
   ```
   ※初期ユーザー情報やポート、コンテナ名は自環境に合わせて適宜設定する。
2. ブラウザからhttp://localhost:8080/auth/admin/ (ログイン画面)にアクセスする。
  ※以下の画面が表示される。
   ![keycloak_login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/13e13262-c95d-d196-6047-aa4c3497aef8.png)
3. 初期ユーザ `admin` パスワード `adminpass` でログインする。
  ※以下の画面が表示される。 
   ![keycloak_console.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/344ba851-6986-9e23-45a7-b96760111ca5.png)



## 参考情報

* [Server Administration Guide](https://keycloak-documentation.openstandia.jp/master/ja_JP/server_admin/index.html#%E6%A6%82%E8%A6%81)
* [jboss/keycloak](https://hub.docker.com/r/jboss/keycloak/)
railsチュートリアル １章の躓き

##1.4.4 README.mdを編集時に
ブランチ、編集、コミット

```README.md
# Ruby on Rails Tutorial

## "hello, world!"

This is the first application for the
[*Ruby on Rails Tutorial*](https://railstutorial.jp/)
by [Michael Hartl](https://www.michaelhartl.com/). Hello, world!

```

上記を編集後コミット

```
$ git commit -a -m "Improve the README file"
```


その後エラー発生

```
$ git checkout master
error: pathspec 'master' did not match any file(s) known to git

```

###原因
そもそもブランチ名が違うことに気づく

```
$ git branch
  main　←　master
* modify-README
```


###対処

自分が編集しているブランチ名がそもそも一致していなかったので、masterからmainに変え実行したら解決。
問題なくpushすることができたが、ケアレスミスにも程がある。

```
$ git checkout main　←←　
Switched to branch 'master'
$ git merge modify-README

```
[Rails]respond_toについて勉強してみた！！[初心者]

#respond_toメソッドとは?
URLにアクセスする際に、リクエストされるフォーマット(HTMLやJSONなど)ごとに、処理を分けることができるメソッドです。
リクエストのフォーマットは、URLの最後に拡張子(htmlやjsonやjs等)をつけることで、指定することが出来るものです。

普段、インターネットを利用する時に、わざわざ拡張子まで意識して利用している人は少ないと思いますが、特にフォーマットの指定がなかった場合は、デフォルトのHTML形式で送信されます。

近年に入り、Web APIでJSON形式のデータを扱うことも増えたので、このメソッドを目にする機会も多くなりました。

つまり、通常はHTML形式で結果を取得できているのですが、明示的に他のフォーマットを指定された場合に備えて、この``respond_toメソッド``を使用しましょう、ということです。

#使い方
まずは基本構文から確認しましょう。

````
respond_to do |format|
  format.形式 {行いたい処理}
end
````

↑のように記述します。

#具体的な使用例

```ruby:books_controller.rb
class BooksController < ApplicationController
  def index
    @books = Book.all
    respond_to do |format|
      format.html {redirect_to root_path}
      format.json {render json: @books}
      format.js {render 'shared/index.js.erb'}
    end
  end
end
```

また、``format.html``に処理の指定を記載しない場合もあります。

```ruby:books_controller.rb
class BooksController < ApplicationController
  def index
    @books = Book.all
    respond_to do |format|
      format.html #何も書かないパターン
      format.json {render json: @books}
      format.js {render 'shared/index.js.erb'}
    end
  end
end
```
このように、``format.html``に具体的な指定を書かない場合は、デフォルトのテンプレートが指定されたフォーマットで表示されます。

#format.anyとは?
通常は、上記のような記述をするパターンがほとんどです。
まれに、それ以外のフォーマットを指定されるパターンもあり、
``format_any``
を使用することもあります。

#おわりに
メソッドの意味自体は、比較的簡単だと思うのですが、使いどころが難しいですね。
アプリを開発するときは、あらゆる可能性を考え抜いた上で、ユーザーに快適に使ってもらえるように、試行錯誤しないといけないということでしょうか。
Power BI DesktopからHeroku PostgresにODBC接続してデータをインポートする

Heroku Postgresのデータを元にPower BIでレポートを作成したくてデータをインポートしてみました。

#事前準備
PostgresのODBCドライバーをインストール
https://www.postgresql.org/ftp/odbc/versions/msi/

#データソースの設定
「新規」→「データの取得」→「別のソースからデータを取得する」→「その他」→「ODBC」を選択して接続ボタン押下![power_bi_20201123_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236988/c136b6bc-30fd-654a-bb08-bde3000a8915.png)


#接続情報の設定
- 「データソース名(DNS)」
    - 「なし」を選択
- 「詳細設定オプション」 → 「接続情報文字列」
    - 「database=dbname;driver={PostgreSQL Unicode(x64)};port=5432;server=host;sslmode=require;」
    - 接続情報文字列に上記形式で記述。「dbname」はHeroku Postgresのデータベース名、「host」はホスト名(XXX.amazonaws.com)に差し替え。
    - sslmodeは「require」にする。Heroku Postgresへの接続はSSL通信を要求されるため。

![power_bi_20201123_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236988/a71f068d-da26-5ce2-45f8-328ecb710d65.png)

ユーザ名とパスワードを要求されるのでHeroku Postgresのユーザ名/パスワードを入力して接続。
![power_bi_20201123_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236988/d8d81d2f-7ab4-11f9-fe02-738f94060416.png)

#データのインポート
接続するとナビゲータに接続対象のHeroku Postgresのスキーマが表示されます。
インポートしたいテーブルを右クリック→データの変換でテーブルのデータ取り込めます。
![power_bi_20201123_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236988/7fe8437f-94f8-faa2-a8d3-291fa5a669f7.png)

取り込むとレポート作成画面のフィールドに表示されます。
あとは通常のExcelインポートデータ等と同様の手順でレポートのデータソースとして使えます。
![power_bi_20201123_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236988/21c61273-d56f-37ef-e9ed-5a4ce459b776.png)

メニューの更新ボタンを押せばデータの最新化も可能です。
テーブルレイアウトが変更された場合も変更後のレイアウトで自動反映されます。
![power_bi_20201123_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/236988/3ad087da-5125-fb67-007e-fbbca8b454d7.png)
Djangoのテストでrequest.POSTに任意の値を設定する方法

##テスト対象の関数

```python:my_view.py
class MyView(LoginRequiredMixin, View):
    def post(self, request, *args, **kwargs):
        if 'test_value' in request.POST:
            # 何らかの処理

```

上記のpostメソッドでrequest.POSTが'test_value'という情報を持っている場合のテストをしたい。


##テストコード
```python:test_my_view.py
from django.test import TestCase, Client

class MyViewTests(TestCase):
    def setUp(self):
        self.client = Client()
        self.client.login(email='email', password='password')

    def test_my_view(self):
        response = self.client.post(
            path='/my_app/my_view',
            data={'test_value': 'A'},
        )
        # 検証
        self.assertXxx(xxx, xxx)
```

これでOK

breakpoint()を貼って確認してみる。

```
% python manage.py test

.> /views/MyView.py(191)post()
-> if 'test_value' in request.POST:
(Pdb) l
188     class MyView(LoginRequiredMixin, View):
189         def post(self, request, *args, **kwargs):
190             breakpoint()
191  ->         if 'test_value' in request.POST:
192                 # 何らかの処理
...
(Pdb) request.POST
<QueryDict: {'test_value': ['A']}>
(Pdb) request.POST['test_value']
'A'

```


##おまけ
test_my_viewで使用しているself.client.post()にcontent_type='application/json'を渡すとrequest.POSTではなくrequest.bodyに値が設定されるので注意。
備忘録：フレームワークとは

# フレームワークとは
フレームワークとは以下のように定義されています↓([Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF)より)
>プログラミングにおいて、アプリケーションソフトウェアの標準構造を実装するのに使われるライブラリ（サブルーチンやクラスなど）の集まりである。

フレームワークは「**枠組み**」と言う意味を持っており、その名の通りアプリケーションをプログラミングするための枠組みが**フレームワーク**と呼ばれています。
(ex.この処理したいときはこうしてね、など予め決められている)
一通り汎用性の高いライブラリや機能を標準で用意しているのが主な特徴ですかね。

# 何がいいのか
こちらは言及するまでもない気がしますが、自己満のためつらつらと書いていきます。

まずは、と言うかこれしかないと思いますが、**爆速で開発を進められる**ということです。

フレームワークなしで開発する場合、処理の書き方やファイルの置き場までも自分で決めなければなりません。
が、フレームワークはあらかじめ、そう言ったものを用意してくれています。「その処理はここに書いてねー」だとか「それはここに置いておいて！」とか。それを明示的に示してくれている場合が多いので、開発者はそこをあまり意識せず、開発を進めることができるようになるんですよね。
~~これだけだと、「いや、そんなことはせずに1からじっくりと自分の形で開発したい」と思う方もいると思います。個人開発ならそれもいいと思います、そう**個人開発なら**。~~

**ただ**、こんな便利なフレームワークにも注意点があります。

# 便利さ故の落とし穴
前項ではフレームワークの便利さについてちょこっと言及しましたが、今度はその反対を語っていこうと思います。(いや、便利ではあるんですけどね)ここからは実際の現場目線も入ってきます。

実はフレームワークが光るには条件が実はありまして、、、
`1. 対象のフレームワークに対して知見がある`
`2. 実装したいプログラムが比較的汎用な処理しか行わない`

この2点が揃ったときに比較的フレームワークは光るんですよね...
1に関しては完全に現場目線のものです。(個人開発では時間が有り余っている場合が多いので除外。現場では常に時間との戦いが起きています。)
例として、とある開発でフレームワークを使うことになったとしましょう。
> A「今回の開発でこんなフレームワーク使うみたいだけど知ってる？」
B「いや、使ったことないな」
A「え、じゃあ勉強しながらの開発になるってことじゃん」
B「いやいや、それは時間が...
　　だったらその言語なら知ってるし、1から作った方が早いと思う」

みたいなことが起きないとも限りません。(言語知ってりゃフレームワーク知ってるだろ、とかはなしで)

2に関してはプログラミングの深みを知るに連れて、フレームワークの存在意義を問い始める原因です(知りませんが)。
そもそも、フレームワークが存在してる意味が「汎用的なプログラムをまとめ、開発を楽にする」と言う所にあります。これはある意味、裏を返すと簡単な処理しかしませんよ(例外はあり)と言うことであり、応用的な処理を実現しようとしたときに、フレームワークの制限か何かで実現できない可能性がある、と言うことです。
とは言いつつも、フレームワークにいちゃもんをつけられるレベルになると相当に技術持ってるだなとも思ってしまいますが...

# まとめ
個人開発はとりあえずおいといて、

・フレームワークは特定の条件下で光る
・慣れちゃえばめちゃくちゃ強い武器になる
・応用はあまり効かないことが多い

と言うことですね
【Rails】RailsアプリをAWSへデプロイする際に特定のgemがあることでCMake Errorになりデプロイできない場合

#### 環境

- Rails 6.0.3
- ruby 2.6.6
- AWS
- EC2
- nginx
- Capistrano

## 内容
`Rails`アプリを`AWS`へデプロイする際に、<font color="Red">特定のgem</font>があることで、<font color="Red">**CMake Error**</font> となり、デプロイに失敗したときのメモです。

今回の場合、<font color="Red">特定のgem</font>とは`qiita-markdown`になります。

## 説明
下記コマンドでデプロイを実施。

```ruby:ローカル環境のターミナル（Railsアプリのルートディレクトリ）
$ bundle exec cap production deploy
```
その後途中まで順調に進みますが、`bundler:install` の部分でエラーがはかれ、デプロイに失敗しました。
エラー文が長いので割愛しますが、原因に直結する部分だけ載せます。

```:エラー文

----------- 略 -----------

bundler:install

----------- 略 -----------

  01 Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

----------- 略 -----------

  01 CMake Error at CMakeLists.txt:15 (CMAKE_MINIMUM_REQUIRED):
  01 CMake 3.5.1 or higher is required.  You are running version 2.8.12.2

----------- 略 -----------

In Gemfile:

  qiita-markdown was resolved to 0.27.0, which depends on

    github-linguist was resolved to 4.8.18, which depends on

      rugged

```

エラー文を見る限り、<font color="Red">**CMake**のバージョンが古い</font>ことが直接的な原因でした。

**特別なgem（今回の場合は`qiita-markdown`）が入っている場合は先に依存関係のあるパッケージをEC2にインストールしておく必要があります。**

[こちらの記事](http://tech.ckme.co.jp/ffmpeg_compile_aws.shtml)を参考に、`CMake`をアップデートすることにしました。
また、記事投稿時点での`CMake`の最新バージョンが`3.19.0`だったので、このバージョンでアップデートすることにしました。
→ `CMake`の最新バージョンは[CMakeのホームページ](https://cmake.org/files/)で確認できます。

下記が一連のコマンドの流れです。

```:サーバー環境のターミナル 
$ sudo yum remove cmake

$ wget https://cmake.org/files/v3.19/cmake-3.19.0.tar.gz

$ tar xvzf cmake-3.19.0.tar.gz

$ cd cmake-3.19.0

$ ./bootstrap      (少し時間がかかります)

$ make             (結構時間がかかります)

$ sudo make install
```

上記が完了後、再度下記コマンドでデプロイを実施。

```ruby:ローカル環境のターミナル（Railsアプリのルートディレクトリ）
$ bundle exec cap production deploy
```

これで無事にデプロイが完了しました！
初投稿　markdown練習

#初投稿
エンジニア転職を目指し、プログラミング勉学に励んでいます！
Qiitaでは学習中に起こった不明点、気付きなどアウトプットメインに利用していきます。

まずは記事投稿に慣れるためmarkdown記法を使ってアウトプットします



#マークダウン練習
練習用

##コードの強調
コードファイル記載し強調して見せるようにするシンタックスハイライトが適用される
入力は　　[Shift]　＋　[@] 入力

```test.rb
バックフォード
```

##テキストの強調
*で囲む


*テスト*

②**で囲む

強調したいことばを後に**テスト**←文字を強調することができる

##箇条書き
-ハイフンを使用


- テスト
 - 二列目
      - 三列目
      - 三列目
 - 四列目
     

##引用
> 縦に灰色の線を入れたい場合に>使用
> 二重>>で入力すると
> >このよう二列を追加することができる
>


##取消し線

~~で囲むと利用可能

~~文字の上にかぶせて線が引かれる~~

##まとめ

はじめは不慣れですが投稿数を高頻度で行い
早くなれていきたいと思います。
契約書をちゃんと()作ったC#湯婆婆

##はじめに

この記事は、[N高等学校アドベントカレンダー](https://qiita.com/advent-calendar/2020/n-highschool)14日目の記事です。ちなみに僕はよわよわN高生です。C#の理解もめちゃくちゃ浅いです。

@Nemesisさんの[Javaで湯婆婆を実装してみる](https://qiita.com/Nemesis/items/c7192a7c510788d2cba2)が若干ゃ流行っているのでC#で適当に書いてみました。
C#湯婆婆はとっくに実装している方がいらっしゃるので、契約書クラスをちゃんと()作ったものを実装してみました。ついでにほんのちょっと機能が改善されています、たぶん、おそらく、きっと。(ぶっちゃけコードはほとんど変わりませんが、せっかく作ったので)

一応ネタバレになるかもしれないのでそこは注意してください。
##コード

```C#:Yubaba.cs
using System;
using System.Text.RegularExpressions;
using static System.Console;

namespace Yubaba
{
    class Program
    {
        static void Main(string[] args)
        {
            WriteLine("契約書だよ。そこに名前を書きな。");
            Contract contract = new Contract();
            contract.Name = ReadLine();
            string name = Regex.Replace(contract.Name, @"\s", "");
            WriteLine($"フン。{name}というのかい。贅沢な名だねぇ。");
            string newName = CreateNewName(name);
            WriteLine($"今からお前の名前は{newName}だ。いいかい、{newName}だよ。分かったら返事をするんだ、{newName}!!");
            ReadLine();
        }

        static string CreateNewName(string name)
        {
            if (name == "荻野千尋") return "千";
            Random random = new Random();
            return name[random.Next(name.Length)].ToString();
        }
    }

    public class Contract
    {
        public string Text { get; set; } = "契約書の本文が適当に書いてある";
        public string Name { get; set; } //署名
    }

}
```
まあ契約書(Contract)クラスを作ったり、名前を奪う部分をメソッドにしたりと(そこまで必要のないことを)したぐらいで、特に変わった実装はないです。(ただ契約書を作成して署名させるという流れを忠実に再現しようとしたらこういう実装になりました)

ただ、「山田 太郎」のように空白なんかを入れると空白が名前になってしまう可能性が出てくるので、

```C#
string name = Regex.Replace(contract.Name, @"\s", "");
```

の部分で正規表現を使って空白を消しています。(こうするとTabなんかも消せることをgoogle先生に教わりました)
また、「荻野千尋」と入力した場合は確定で「千」になるようにしています。(原作の原作の再現)
###実行例

```
契約書だよ。そこに名前を書きな。
山田太郎
フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は山だ。いいかい、山だよ。分かったら返事をするんだ、山!!
```

```
契約書だよ。そこに名前を書きな。
        タロ =  ウ      = ヤマダ
フン。タロ=ウ=ヤマダというのかい。贅沢な名だねぇ。
今からお前の名前はヤだ。いいかい、ヤだよ。分かったら返事をするんだ、ヤ!!
```

```
契約書だよ。そこに名前を書きな。
荻野 千尋
フン。荻野千尋というのかい。贅沢な名だねぇ。
今からお前の名前は千だ。いいかい、千だよ。分かったら返事をするんだ、千!!
```

~~名前が空の場合はお察し~~

##おわりに
当然といえば当然なんですが、千尋の名前を奪うところはもっといろいろセリフがあったんですね、見たのが昔すぎてほとんど覚えていない…

若干ふざけたコードなのであれですが、変なところがあれば教えてもらえるとありがたいです。

###別の方で参考にさせてもらった記事
このコードで対応していない𠮷田さんを働かせる方法
[C# で湯婆婆を実装してみる（𠮷田さんにも対応)](https://qiita.com/okazuki/items/03049da368222b562da9)

早い湯婆婆
[C# で湯婆婆を実装してみる「性能のいい湯婆婆を目指して」](https://qiita.com/okazuki/items/0a9e009b3f8736140393#%E5%88%A5%E8%A8%98%E4%BA%8B)
[C#で性能のいい湯婆婆](https://qiita.com/fujieda/items/1523c3ee656caef91aa8)
M1 MacBookでNode.js環境構築

初macOSで操作方法すら良くわからない中、Apple Silicon(M1)搭載ということでNode.js環境の構築に一工夫が必要でした。M1対応するまではRosettaで回避するのが無難そう。homebrewもこれでインストールできました。

# TerminalをRosettaで開く

Finder -> 移動 -> ユーティリティ

![スクリーンショット 2020-11-22 17.31.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556119/11a465c7-8165-16dc-90e1-902461bc3759.png)

command &#8984; + I
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556119/217f0515-d62c-7f19-bcbf-8332cfc9b698.png" width="50%">

Rosettaを使用して開くにチェックして、Terminalを起動。

# nvmをインストールする

https://github.com/nvm-sh/nvm#installing-and-updating

```
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.0/install.sh | bash
```

一旦Terminalを終了して、再起動。

なぜか以下のようなwarningが出始めるが、落ち着いてググって解決する。#homebrewも同時にインストールしたからかな？

```
zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?
```

# Node.jsをインストール

```
nvm i v14.15.1
```

```
% npm -v
6.14.8
% node -v
v14.15.1
```
めでたし、めでたし

# v15.xのインストール(2020/12/26 追記）

Apple SiliconにNative対応したv15.xをインストールしたかったのでそのときのメモです。

まず、Rosettaを使用して開くのチェックを外して、Terminalを再起動します。

```
nvm i v15.5.0
```
コンパイルが始まりました。終わるまで待ちます。５〜１０分くらいは掛かったかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556119/dced0626-1184-8fcf-67a9-8cd85c70bede.png)
なお、インストールが終わった後は、Rosettaを使用して開くのチェックをつけてTerminalを起動しても、Nativeのまま起動してくれるようです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/556119/d77ff5ca-e9c9-929d-a964-901701ace515.png" width="80%">


# v16.xのインストール(2021/05/09 追記）

上記v15.x同様、Rosettaを使用して開くのチェックを外して、Terminalを再起動します。

```
nvm i v16.1.0
```
今回はさくっとビルド済みがインストールされました。

以上
Railsチュートリアル_3章_学習メモ

#学んだ事
##RENAMED.md
プログラムを作成し、Gitbuｂなどに公開する際に他人が見ても分かるにするための<b>説明書</b>のようなもの
書き方などを工夫する必要があり、キレイに分かり易くする必要がある。
※下記方などは下記の記事を参考にすると良い
https://cpp-learning.com/readme/
##テストコート
###意義
>+ テストが揃っていれば、機能停止に陥るような回帰バグ（Regression Bug: 以前のバグが再発したり機能の追加/変更に副作用が生じたりすること）を防止できる。
+ テストが揃っていれば、コードを安全にリファクタリング（機能を変更せずにコードを改善）できる。
+ テストコードは、アプリケーションコードから見ればクライアントとして動作するので、アプリケーションの設計やシステムの他の部分とのインターフェイスを決めるときにも役に立つ

###書き方
+ 基本的には先に書くらしく、〇〇が通ろなかったらエラーというような書き方をする。

###エラーの種類
####NameError: undefind~
〇〇が定義されていない→URLが見つからない→URLがルーティングされていなかった
####ActionNotFound
〇〇アクションが見つからなかった→〇〇アクションが追加されていなかった
####Missing a template
テンプレートとはviewの事でviewが存在していなかった
##リファクタリングとは
「外部から見た時の挙動は変えずに、内部構造を整理すること」らしい
→イマイチよく分からん。
とりあえず、現時点では後からの修正やバグの発見→解決などに着手し易い、他人が見ても分かりやすいようにする為に、
<b>コードを整理する</b>という理解でいく
>コードや記法の統一が崩れて読みづらくなる、クラスやメソッドが何百行にも膨れ上がって読む気を削がれる、なぜこのコードがここにあるのか最早誰もその理由を思い出せなくなる、同じコードがあちこちにコピペされて少しずつ書き換えられ手に負えなくなる、などです。コンピュータにしてみればどんなに汚らしいコードであろうと、そこにあるがままに実行するだけですが、人間はそういうわけにはいきません。こまめにリファクタリングを繰り返してコードを常にすみずみまで美しくコンパクトに保ち、他の開発者や未来の自分の開発意欲を阻喪することのないようにしなければなりません。
【Unity】ランダムで沢山の武器の中から三つを選べるシステムを実装してみた

#この記事は？
先日stgゲームを作っている際に、タイトル通りのことを作ってみようと思ったのですが、
自分にとって難しかったので実装までの道のりを備忘録的に書いてみました。
#実装までの道のり
まず、問題の切り分けをしました。**ランダムで沢山の武器の中から三つを選ぶシステム**を作るためには、
１　沢山の武器を作り、配列の中に入れる。
２　乱数を使って三つの「**被らない**」乱数を添え字として使う。
３　プレイヤーが選んだことを検知して選んだ武器を渡す。
この３つがあれば実装できそうなので、順に実装していきました。

##１　沢山の武器を作り、配列の中に入れる。
あとから武器を追加する可能性があるので、静的配列ではなく動的配列を作り、順次武器を作ってその中に入れていきます。

##２　乱数を使って三つの「**被らない**」乱数を添え字として使う。
これが正直一番大変でした。ただwhileを使って被らないような内容を作るだけなのですが、
for文やらif文やらが混雑してなんの文がなにをしているかがわからなくなってしまい、
解読に時間がかかったり、Unityがフリーズしたりと。
切り分けて一つずつ問題を解決していけば難しくないことに気が付きました。

##３　プレイヤーが選んだことを検知して選んだ武器を渡す。
これはゲームを作ったことのある人なら誰もが覚えのあるOnButtonClickメソッドで、
選んだ武器の情報を取得すればよさそうです。

#最後に
Listとかを使うときはAddやらRemoveやらを使わなければならないみたいなので使うのを尻込みしていましたが、
色々検索してみたら意外にもなんとかなったのでGoogle先生に感謝しながらコード書いていきたいと思います。
vue create myappでMissing required argument #1と出たら

vue cliでアプリケーションを作った際に起きたことをメモ

## 環境
```text
virtual boxでの仮想環境on Windows 10
OS: ubuntu 18.04
WSLは特有の謎現象が多いので趣味で使うのをやめた
```

## 背景

vue cliをインストール&アプリケーションを新規作成

```
npm install -g @vue/cli
sudo vue create my app
```

## エラー内容(ディレクトリ名などに含まれる具体的な名称は消してます)

```text
Vue CLI v4.5.9
 WARN  You are using an outdated version of NPM.
there may be unexpected errors during installation.
Please upgrade your NPM version.
✨  Creating project in /home/Project/myapp/myapp.
⚙️  Installing CLI plugins. This might take a while...

npm ERR! Linux 5.4.0-53-generic
npm ERR! argv "/usr/bin/node" "/usr/bin/npm" "install" "--loglevel" "error" "@vue/cli-plugin-babel@~4.5.0" "@vue/cli-plugin-eslint@~4.5.0" "@vue/cli-service@~4.5.0" "--save-dev"
npm ERR! node v8.10.0
npm ERR! npm  v3.5.2
npm ERR! code EMISSINGARG

npm ERR! typeerror Error: Missing required argument #1
npm ERR! typeerror     at andLogAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:31:3)
npm ERR! typeerror     at fetchPackageMetadata (/usr/share/npm/lib/fetch-package-metadata.js:51:22)
npm ERR! typeerror     at resolveWithNewModule (/usr/share/npm/lib/install/deps.js:456:12)
npm ERR! typeerror     at /usr/share/npm/lib/install/deps.js:457:7
npm ERR! typeerror     at /usr/share/npm/node_modules/iferr/index.js:13:50
npm ERR! typeerror     at /usr/share/npm/lib/fetch-package-metadata.js:37:12
npm ERR! typeerror     at addRequestedAndFinish (/usr/share/npm/lib/fetch-package-metadata.js:82:5)
npm ERR! typeerror     at returnAndAddMetadata (/usr/share/npm/lib/fetch-package-metadata.js:117:7)
npm ERR! typeerror     at pickVersionFromRegistryDocument (/usr/share/npm/lib/fetch-package-metadata.js:134:20)
npm ERR! typeerror     at /usr/share/npm/node_modules/iferr/index.js:13:50
npm ERR! typeerror This is an error with npm itself. Please report this error at:
npm ERR! typeerror     <http://github.com/npm/npm/issues>

npm ERR! Please include the following file with any support request:
npm ERR!     /home/Project/myapp/myapp/npm-debug.log
 ERROR  command failed: npm install --loglevel error @vue/cli-plugin-babel@~4.5.0 @vue/cli-plugin-eslint@~4.5.0 @vue/cli-service@~4.5.0 --save-dev
```

## 対処

[ここ](https://github.com/npm/cli/issues/681)に書いてあった。

```
sudo npm install -g n
sudo n latest
sudo npm install -g npm
hash -d npm
npm i
```

一通り実行したところアプリケーションの作成に成功した。
PMP試験当日のメモ


## この記事について
11月になんとかPMPに合格することが出来ました。 2021年1月からはあたらしい出題形態に代わるということなので、
追い込みで勉強しているかたに向けて、当日の参考になれば。  

## 会場
東京会場(有楽町)は、インペリアルタワー18Fのピアソンでした。 新橋からゆっくり歩いて10 分くらい。 
帝国ホテルに行く機会なんてまずないので緊張しますが、エレベータ上ってしまえば、ちょっと綺麗な
普通のオフィスビルです。 トイレも結構広いので安心です。  

当日は8:00スタートとなっていて、早めにくるようにとあったので、7:25に入室したところ一番乗りでした。
受付の人に「もう始めますか？」と聞かれるので前倒しで開始可能です。

## テスト
私が持っている参考書や、いろんなWEBに書かれた情報と多少違っているところがありました。
- ホワイトボード的なメモ用紙とペンをもらえるが、開始までメモ用紙に記載するのは禁止   (メモは消せない仕様)
- **問題数は200問**
- 89問が終わったところで、前半終了。10分の休憩に入るかどうか質問される(後半に入ると、前半の見直しは出来ない)
- 後半は111問。時間ギリギリまで粘って見直ししたところ、画面が切りかわって「よく頑張りました」みたいな
　 コメントが表示され、アンケート画面が表示される。
- 合格だと"Pass"って表示されると聞いていたので、ドキドキして待っていても表示されない。
- 待っていると、監視のお兄さんに部屋から出るように促される。
- 部屋から出ると、受付で結果用紙をもらう。”Pass”の文字はこちらにあった。


## 最後に
テストが近くなると、いろんな参考書とか情報が気になりますよね。
でも、最後はこれまで勉強してきた自分を信じるしかないと思います。
頑張ってください！！
Gitの用語集

##はじめに
この記事はJ自分用のメモです。
※内容について、誤った知識やもっとわかりやすい表現等ございましたら、ご指摘いただけますと幸いです。



|用語|意味|
|---|---|
|ディレクトリ|フォルダのこと|
|リポジトリ|開発の履歴管理を行う場所
|ローカルリポジトリ|自分のPCにあるリポジトリ、各人がそれぞれのPC上で使うリポジトリ
|リモートリポジトリ|GitHubにあるリポジトリ、サーバに配置して複数人で共有するリポジトリ
|ブランチ(branch)|履歴を枝分かれさせること<br>>他のブランチの影響を受けないため複数の作業を同時に進められる<br>>作業単位で履歴を残すことで後で見た時にわかりやすい<br>・git branch [branch-name]：ブランチの作成<br>・git branch：ブランチの一覧表示<br>・git branch –d [branch-name]：指定したブランチを削除
|マージ(merge)|ブランチで枝分かれした履歴を１つにまとめること
|コミット(commit)|ファイルの追加や変更の履歴をリポジトリに保存するコマンド
|インデックス(index)|コミットしたいファイルを登録する場所
|ステージング(staging)|ファイルをインデックスにあげるコマンド
|プッシュ(push)|ローカルリポジトリの変更をリモートリポジトリに反映させるコマンド
|プル(pull)|リモートリポジトリの変更をローカルリポジトリに反映させるコマンド
|クローン(clone)|既存のリモートリポジトリをローカルに落とすために使うコマンド<br>例）GitHubに公開されているリポジトリを自分のコンピュータへ落とすときに使う
|アド(add)|ファイルやディレクトリをインデックスに追加するために使うコマンド
|checkout|ローカルリポジトリのブランチを切り替えるときに使うコマンド
|remote|リモートリポジトリを操作するために使うコマンド<br>・git remote：リモートリポジトリの名称一覧を表示<br>・git remote -v：リモートリポジトリの詳細一覧を表示<br>・git remote add [name] [url]：リモートリポジトリを追加<br>・git remote rm [name]：リモートリポジトリを削除
|ステータス(status)|リポジトリの状態を確認するために使うコマンド
|init|リポジトリを新規作成する、または既存のリポジトリを初期化するコマンド
|mkdir|ディレクトリ（フォルダ）作成用のコマンド
|cd|ディレクトリ(フォルダ)を移動するときに使う<br>例）cd (移動先のパス)
M1チップ搭載MacBookproにおけるFlutter+Firebase環境構築

#cocoapods関連のエラー出まくった話
新発売のMacBookProを使ってflutterとfirebase使ってアプリ開発をしようとしたら、cocoapodsに関するエラーが出た。Podを消したり、flutter cleanとか試してもダメ。友達の旧型Macbook(Intelチップ搭載)だと問題なく動いているっぽい。M1チップが原因かもと思い英語検索したら解決しました。

#最終的な解決策

```
＄sudo gem install ffi
```

参考サイト
<https://stackoverflow.com/questions/64901180/running-cocoapods-on-apple-silicon-m1/64938441#64938441>



#やったことメモ
以下の記事を再現。
<https://qiita.com/unsoluble_sugar/items/95b16c01b456be19f9ac>
ios環境においてはこれでバッチリ再現できました。


※Androidにおいてはfingerprint認証が必要。

```
keytool -list -v \
-alias androiddebugkey -keystore ~/.android/debug.keystore
```

これをするにはjavaのインストールが必要
sha1, sha256を発行できたら、firebaseの設定画面「SHA 証明書フィンガープリント」の欄に
コピペして保存。そしたらgoogle認証できるようになりました。

※これではうまくいかないときは下記をお試しください
<https://qiita.com/surasurag/items/54134821da011ffa6ac5>
Railsのフォーム画面で、ページをリロードしないと、投稿できないときの対処法

##解決したいこと
フォーム画面で、データを送信したいが、毎回リロードしなければ、送信ボタンを押しても反応が何もないこと。
一度リロードすれば、正常にフォームのデータを送信できる状況です。

##解決法
 (コードは簡略化しています。)

```
<div class= "items_request_contents">
 <div class="new_items">
  <%= form_with model: @request, local: true do |f| %>
    <div class="field">
      <%= f.text_field :name %>
    </div>
    <div class= "btn_contents">
     <%= f.submit "送信する" ,class:"btn" %>
    </div>
  <% end %>
 </div>
</div>
```
上記のコードを下記コードに変更しました。

```
<div class= "items_request_contents">
 <%= form_with model: @request, local: true do |f| %>
   <div class="new_items">
     <div class="field">
      <%= f.text_field :name %>
     </div>
     <div class= "btn_contents">
      <%= f.submit "送信する" ,class:"btn" %>
     </div>
   </div>
 <% end %>
</div>
```

変更点は、form_withメソッドを囲んでいたdiv要素の記述を消し、逆に、form_withメソッドの中にdiv要素を記述しました。
詳細な原因は、説明できませんが、これで解決したので、アウトプットをしました。
以上になります。
【Spring Boot】ポートが使用されてたときの対応

最近Spring Bootを使用して開発をしているのですが、基礎的な部分が抜け落ちているので、参考書を見ながら進めています。

そんな中で、アプリケーションを起動した際にエラーが起きたので、その時の対応をメモしておきます。

##エラー内容

``` 
Web server failed to start. Port 8080 was already in use.
```
![スクリーンショット 2020-11-21 11.46.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756649/738638a7-631b-059c-dd25-82571a521fb3.png)

## 対応方法
使用しているポート番号のPIDを検索

```
$ lsof -i:[ポート番号]
```

稼働しているポートを止める

```
$ kill [PIDの番号]
```
再度ポート番号の使用状況を確認

```
$ lsof -i:[ポート番号]　
```
何も表示されなければ、成功です。
この後は再度Springのアプリケーション起動してもらえれば大丈夫なはずです。

![スクリーンショット 2020-11-21 11.50.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/756649/baf1124b-c001-de83-4b9d-72e4b94bc6c4.png)

## 終わりに
今回のエラーは使用していないdocker環境を8080ポートで起動していたのが原因でした。
開発の環境と試験的に動かしてる環境を整理したほうがよさそうです。
モバイルアプリのアイコン画像用意するの面倒くさくない？自動化しちゃおう！

##PhotoShopでいちいち何十回も解像度を変える作業めんどくさ・・・

####AndroidとiPhone合わせるとこのくらいの画像が必要になる。

![b1d2c8bfdad903f18ac9aa668706984e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500172/cf87672e-ac78-75c8-2094-ef74eb5b0d95.png)

しかもiPhoneの画像は20@2xみたいな語尾を付けているからややこしい。

だからPhotoshopのスクリプトで自動化してしまおう

###<font color="Red">まず出力したいPSDのレイヤーは全てスマートオブジェクトにして下さい。</font>←これ重要
これを忘れると出力された画像がボケるから気をつけて！
レイヤーを右クリック→スマートオブジェクトに変換
![Inked4ec9e66d5b55a3bcdc164078007e697a_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500172/56cb9452-a73c-2c53-d779-37482835362d.jpeg)

##全部出来たらこんな感じで変なマークが追加される
![Inked7cc6c02a13d6c064c7f25102f02f795f_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500172/0dee1ff4-1488-21e6-ae53-69c622835fe5.jpeg)


#スクリプトファイルダウンロード
https://drive.google.com/file/d/19dk19n3V2ciiC1BXWAHbdFAilxHzvqO_/view?usp=sharing
↑からスクリプトファイルをダウンロードしたら

####PhotoShopのディレクトリを探してPhotoshop\Presets\Scripts下に配置
僕の場合は↓だった
C:\Program Files\Adobe\Adobe Photoshop 2021\Presets\Scripts

#実行
念の為Photoshopでは何も開いていない状態からスタートする事をおすすめする。

####メニュー→ファイル→スクリプト→MakePngsForMobileを選択


![11f4fc7cd9cc70a2fbf8e2ee64994346.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500172/4fe5f22b-78bc-a9dc-81c3-ec70f0c9b9bb.png)

###ファイル選択ダイアログが出現するので実行したいPSDを選択してOKを押す

![Inkedb5816321b57c782742b12e66e15e1bdc_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500172/f9aed68f-1492-907c-2428-5dbd843494b1.jpeg)

##PSDとPNGが同ディレクトリに出力されていれば成功！

![47910029a03e66f30f7c9685c0912825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/500172/26dbee70-da46-d01e-14ab-3088a7d7b942.png)


####もしこのスクリプトが既存であったり、エラー、不具合等あれば報告して下さい！

#####色々雑でしたがqiita初投稿なので多めに見てやって下さい。
備忘録：ライブラリとは

どの言語でプログラミングするにも、ほぼ必ず必要になってくるこの **ライブラリ** 。
興味が湧いたのでちょっと調べて見ました。

# そもそもライブラリとは
ライブラリとは以下のように定義されています↓([Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)より引用)
>汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたものである。ライブラリと呼ぶときは、それ単体ではプログラムとして動作させることはできない、つまり実行ファイルではない場合がある。

簡単にいうと、よく使われる部品(プログラム)をまとめたものです。さらにいうと、開発者の「こんな処理がしたいなぁ」を叶えてくれる(大概)ものなのです。ただ、どの言語にも対応した万能ライブラリと言う物はなく、各言語に対応したライブラリが存在しています。

※ここから以下は完全に趣味です。

# 何がいいのか
2つあると思ってまして、まずは**開発効率の向上**。

背景から話すと、もうコンピュータと会話する言語が定義されてから随分と月日が立っていてパイオニアたちが組んだプログラムが無数に存在しているのが今日なんですよね。なので、「こういう処理がしたい」
と思った時に、大抵過去の偉人たちが残したプログラムがあり、それが**ライブラリ**として残されている訳です。その処理を最短で１行、クラスやメソッドを書くだけで処理が行えるんですよね。100行その処理を書くのと1行で呼び出すの、どちらが楽かなんてもう...

そしてもう一つは、**プログラムが軽くなることが多い**ということ。

こちらに関しては「絶対」なんては言えないのですが、大抵の場合は自分自身で処理を書くよりは軽くなることが多いです。そりゃあよほどのセンスと才能がなければ先人達が残したプログラムより綺麗でDRYなコードを書くのは経験も知識もいるよねって話ですよね。

ここまで書くと当時の私みたいに
「じゃあどんどん入れたろ！！」
なんて脳死プレイを決める人がいないとも限らないので少し注意事項を。

・**必ず**ある程度は処理の流れをソースから読み解く
　→ これをやらないといずれ詰みます。ほんとに。いいことは確実にない。
・ライセンスの確認
　→ 人が作っているのでもちろん権利関係が発生してくるものもあるので確認は必須。

この2点は最低でも意識すれば問題が起きることはそうそうないと思います。特に、1点目に関してはやるかやらないか(読み解けるかは別として)で全体的に大きく差が出てきます。
そこさえしっかりやれば、その言語ややりたいことに合わせて用法用量？を守って使用すれば大丈夫でしょう。

# まとめ
ライブラリって便利ですよね。どんどん使っていきましょう！！！
php artisan migrate:refresh --seedしてSQLSTATE[21S01]のエラー

## 前置き
Webを検索しても解決方法が見つかりづらかったので、備忘のために記録します。

## 動作環境
php 7.4
laravel 6.0
mysql 8.0

## 状況
php artisan migrate:refresh --seed
を実行したときに、
Illuminate\Database\QueryException  : SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count
というエラーが出た。

## 原因
原因はseederファイルで作成したカラムの数が違っていることでした。
php artisan migrate:refresh --seed
でサンプルデータを作る場合、サンプルのデータをコメントアウトしたり追加したりすると、このようなエラーが発生してしまうということです。

## 対策
シーダーファイルの書き方を変えればコメントアウトした場合でもエラーが出ないようにすることが出来た。以下、その方法を書きます。

以下のような書き方をすると、レコードの一部のカラムをコメントアウトや追加した場合に、上記のエラーが発生してしまいます。

```php 
<?php

use Illuminate\Database\Seeder;

class PropertiesTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('テーブル名')->insert([
            ['name' => 'だんご',
             'project_id' => 1,
             'maker_name' => '鈴木商店',
             'product_type' => '食品'
            ],
            ['name' => 'なす', 
             'project_id' => 2,
             //'maker_name' => '山田農園',    ← このようにコメントアウトするとエラーになる
             'product_type' => '食品'],
        ]);
```

```
// 上記シーダーファイルで、山田農園をコメントインして以下を実行すると成功。
php artisan migrate:refresh --seed

結果（成功）
Database seeding completed successfully.

// コメントアウトして以下を実行するとSQLSTATE[21S01]のエラー。
php artisan migrate:refresh --seed

結果（エラー発生）
Illuminate\Database\QueryException  : SQLSTATE[21S01]: Insert value list does not match column list: 1136 Column count doesn't match value count at row 2
```

## 解決したコードの例
シーダーで作成するサンプルデータのカラム内容を追加したりコメントアウトする可能性がある場合は、以下のように**DB::table('テーブル名')->insert**を分けて書くと、エラーを発生させずに実行することが出来ます。

``` php
class PropertiesTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('テーブル名')->insert([
            ['name' => 'だんご',
             'project_id' => 1,
             'maker_name' => '鈴木商店',
             'product_type' => '食品'],
        ]);
        DB::table('テーブル名')->insert([
            ['name' => 'なす',
             'project_id' => 2,
             //'maker_name' => '山田農園',
             'product_type' => '食品'
           ],
        ]);
    }
}
```
**DB::table('テーブル名')->insert**をレコードごとに分けて実行するだけです。つまり、**DB::table('テーブル名')->insert**の行を一回しか書きたくない場合は、作成したいサンプルのカラム数を全て合わせる」ということですね。

```
// シーダーファイルで、コメントインしようがアウトしようがエラーは発生しません。
php artisan migrate:refresh --seed

結果
Database seeding completed successfully.
```

## 感想
ベテランの人たちはどんな書き方ややり方でやっているのか知りたいです。カラム数が１００個くらいあるテーブルだとシーダーファイルでサンプルを作ると大変ですし。
【AWS】クラウドプラクティショナー(CLF)合格記

#はじめに
少し前のことですが、AWS認定試験-クラウドプラクティショナー(CLF)に合格した(2020-06-27)ので、合格までの道のりを書いておこうと思います。

#About　Me
私はSIer2年目で、オンプレサーバー設計・構築を行っています。
パブクラの知識・経験は０からのスタートでしたが、何とか1発合格することができました。

#What's CLF?
まずは、クラウドプラクティショナーについて
[AWS認定試験-クラウドプラクティショナー](https://aws.amazon.com/jp/certification/certified-cloud-practitioner/)

上記サイトによると、認定によって検証される能力は以下のようです。

* AWS クラウドとは何かということ、およびベーシックなグローバルインフラストラクチャについて定義できる
* AWS クラウドのベーシックなアーキテクチャ原理を説明できる
* AWS クラウドの価値提案について説明できる
* AWS プラットフォームの主なサービスと一般的なユースケース (例: コンピューティング、分析など) について説明できる
* AWS プラットフォームのセキュリティとコンプライアンスのベーシックな側面、および共有セキュリティモデルについて説明できる
* 請求、アカウントマネジメント、料金モデルを明確に理解している
* ドキュメントや技術サポートのソースを特定できる (例: ホワイトペーパー、サポートチケットなど)
* AWS クラウドにおけるデプロイと運用のベーシックで重要な特徴を説明できる

つまり、AWSを使って何ができるか、使う利点は何かなどの基本的な点が問われます。

先に言っておくと、CLFは広く浅くサービスを勉強することが大切だと思います。
サービスの数は出てきますが、内容がそこまで深くなることはあまりありませんでした。

#試験に向けて
###公式サンプル問題
これは受験を決めて一番最初に取り組みました。
どんな問題形式で出るのか、どのレベルの問題が出るのかを把握するためです。

###参考書を読む
私は以下の本を読みました。
ひとまず1周目はざっとどんなサービスがあるのか、略称などを勉強し、2周目により細かい部分を読み込みました。
[AWS認定資格試験テキスト AWS認定 クラウドプラクティショナー](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%83%97%E3%83%A9%E3%82%AF%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%BC-%E5%B1%B1%E4%B8%8B-%E5%85%89%E6%B4%8B/dp/4797397403/ref=asc_df_4797397403/?tag=jpgo-22&linkCode=df0&hvadid=295691444786&hvpos=&hvnetw=g&hvrand=13601050886453414636&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009310&hvtargid=pla-718362586207&psc=1&th=1&psc=1)

###ホワイトペーパーを読む
本の中で理解できない部分はAWSが公式に出しているホワイトペーパーを読みました。
[ホワイトペーパー](https://aws.amazon.com/jp/whitepapers/?whitepapers-main.sort-by=item.additionalFields.sortDate&whitepapers-main.sort-order=desc)

###Black Beltの資料を読む
ホワイトペーパーに加えてブラックベルト資料を読みました。
[Black Belt](https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/)

###公式ビデオを見る
AWS認定のトレーニングライブラリの動画で片手間勉強しました。
[トレーニングライブラリ](https://www.aws.training/LearningLibrary?filters=language%3A2&tab=view_all)


#試験当日
上記対策を計3週間(延べ30時間程度)行い、試験に臨みました。

結果は、755点(700点以上で合格)でした。


#感想
試験時間は余裕があり、じっくり考えて取り組むことができました。
試験問題の中で日本語が変な部分がありますが、英語に切り替えることができるので、そちらで確認した方が良いです。

問題で何を聞かれているのか(コスト?運用?)などを読み取っていくことが大切です。

問題をもっと解いて対策したいという方にはUdemyなどの問題集がおススメです。(セール中に買い溜めをしておきましょう。)
あとはハンズオンなどが出来れば、より理解は早いと思います。

今後はアソシエイト試験の記事を書いていこうと思います。
Go言語のTwitter APIで定期的にツイートする

###用意するもの
・MAC(PC)
・AWS Lambda
・Twitter API
・Twitterアカウント

###やったこと
####1.Twitter API申請
下記URLからTwitter API申請をします。
https://developer.twitter.com/ja/docs

API key & secretとAccess token & secretを取得します。

####2.Go言語で書く
Twiiter認証用のソースコードを書きます。
別にファイルは分けなくてもいいです。

```go:keys.go
package keys

import 
(
    //Twitter APIに必要なimportになります。なければインストールしましょう。   
    "github.com/ChimeraCoder/anaconda"
)

func GetTwitterApi() *anaconda.TwitterApi {
	anaconda.SetConsumerKey("API Key")
	anaconda.SetConsumerSecret("API secret Key")
	api := anaconda.NewTwitterApi("token", "token secret")
	return api
}

```

ツイート本文のソースコードを書きます。
これも別にファイル分けなくてもできます。
日付とテキストをツイートするようにしています。

```go:text.go
package text

import (
	"fmt"
	"time"
)

func TextTweet() string {
    //tweetする文章を書くよ
    tweetText := "test"

    d := time.Now().Day()
    m := time.Now().Month()

    //ツイートする文章を格納する。
    TweetContent := tweetText
    TweetOfToday := fmt.Sprintf("【%d月%d日】\n %s", m, d, TweetContent)
    return TweetOfToday
}
```
実際にツイートするソースを書きます。

```go:main.go
package main

import (
	"fmt"
	. "fmt"

	. "./keys"
	. "./text"
)
func main(){
    api := GetTwitterApi()
    text := TextTweet()
	
    tweet, err := api.PostTweet(text, nil)
    if err != nil {
       panic(err)
    }
     Print(tweet.Text)

     fmt.Println("Finish!")
}

```

ちなみにフォルダ構成は以下です。

```フォルダ構成
autoTweet
  ∟main.go
　∟keys
   ∟keys.go
  ∟text
   ∟text.go
 ```

####3.AWS Lambdaで実行させる
AWS LambdaにGoソースコードをzipファイルにしてアップロードします。
↓がとても参考になりました。
https://dev.classmethod.jp/articles/aws-lambda-supports-go/

AWS Lambdaにアップロードして実行するにはバイナリファイルが必要です。
私は１つのファイル(main.go)にまとめてバイナリファイルにしました。
バイナリファイル作成コマンドは↓です。zipにするのはバイナリファイルのみで大丈夫です。

```バイナリ作成コマンド
#GOOS=linux GOARCH=amd64 go build main.go
```

バイナリファイルが作成がエラーになった場合は、下記試してみてください。

```エラーの時コマンド
#go get -u golang.org/x/sys/unix
#set GOOS=linux
#set GOARCH=amd64
#set CGO_ENABLED=0
```
Lambdaでテストしてみて実行エラーにならなかったらツイッター見にいきましょう！
ツイートされているはずです！

####4.CloudWatchEventsでLambdaを定期実行する。
CloudWatchEventsのCron式でLambdaを定期実行させます。
Cron式は2ヶ月に一度とか、設定次第で好きな時間に実行できます。
参考URL：https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-cloudwatchevents-expressions.html

参考に毎日12時に実行するcron式記載しておきます。 (UTCのため-9時間になります)

```cron式
crons式：
00 3 * * ? *
```
####5.ツイート確認
設定した時間になってツイートされてたらOK！

かなり雑に書いてしまいましたが、誰かの参考になれば幸いです。。。
Markdownプレゼンテーションでパワポおじさん脱出

普段 VSCode で Markdown を書いている人におすすめです。VSCode の拡張機能で Marp というものがあります。Markdown を書くと16:9のスライドPDFに変換してくれます。

- [Marp for VS Code](https://marketplace.visualstudio.com/items?itemName=marp-team.marp-vscode)

# ポイント
- Markdownとスライド資料が１つで済む
- 良くも悪くも１ページ10行程度にまとめる
- 使い捨ての資料には向くが、本気のプレゼンには向かない

# Markdown

```
---
marp: true
paginate: true
theme: default
backgroundColor: whitesmoke
headingDivider: 1
---
<style>
h1 { font-size: 42pt; color: royalblue; }
li,p,table { font-size: 32pt; color: black; }
</style>

# Marp のメリット
- メリット
  - 改ページが自動になる。
  - 文字位置を考えなくてよい。
- デメリット
  - 長い説明には向かない。
  - 画像が扱いにくい。

# 表
|名前|vCPU|メモリ|月額|
|-|-:|-:|-:|
|t3.micro  |2| 1 GiB| 1700円|
|t3.small  |2| 2 GiB| 3400円|
|t3.medium |2| 4 GiB| 5500円|
|t3.large  |2| 8 GiB|10300円|

# ページごと
<!-- _class: lead -->
_class でこのページだけ中央寄せ（gaiaのとき）

# 画像（右）
- 背景画像を使います。
![bg right:35% 90%](1.png)

# 画像（挿入）
![h:200](1.png)
画像を挿入できます。
```

# Markdown プレビュー

<table>
<tr>
<th>theme=default<th>theme=gaia
<tr>
<td>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/de008d26-1234-1bcd-3c17-4bb4fa9b45ae.png'>
<td>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/fcb32506-bb39-9101-4ade-68ae08915c77.png'>
<tr>
<td>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/31068597-5044-2f5b-7a80-01018fee262e.png'>
<td>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/ddd62a87-f04f-6833-b879-5bead6bc32d3.png'>
<tr>
<td>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/5cc6d4ca-ea37-833d-83a6-4f027339fed3.png'>
<td>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/385d1f62-121e-8e64-7bf1-892c07a696b5.png'>
<tr>
<td>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/d6d595eb-827a-f35b-e357-95749d10cb91.png'>
<td>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/950aab8b-8b5b-461f-b798-3c371f777d53.png'>
<tr>
<td>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/77aa2beb-1f93-180c-4649-251cf5c3a269.png'>
<td>
<img src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253995/fdb15225-5814-6b3b-3ff1-674eaea3cf8f.png'>
</table>

# 解説

|値|説明|
|---|---|
|marp|Marpを有効|
|paginate|ページ番号を表示|
|theme|default と gaia、あとテーマなしの uncover があります|
|backgroundColor|背景色|
|headingDivider|見出し１で改ページが可能|
 
画像

```
できる
![bg right:40% 90%](1.png)
![bg left:40% 90%](1.png)
![w:200](1.png)
![h:200](1.png)

できない
![bg bottom:40% 90%](1.png)
![x:200](1.png)
<img src='1.png'>
``` 

補足
style を駆使すればもっといろんなことができるのですが、やりすぎるとMarpの意味がなくなってしまいます。デザインに凝るならパワポ使った方がいいです。

# 感想

１ページに収まるように説明文を10行以内にまとめなければいけません。逆に１ページにまとめることがいいと思いました。ITのドキュメントって長いわりに意味不明なものが多いです。スライドだけじゃなく普段のMarkdownもコンパクトにまとめようと思いました。
VirtualBOXのアップデート手順

#はじめに
昔インストールしていたVirtualBOXのアップデートをしてみましたので簡単にまとめます。
不具合、脆弱性等があるので出るだけ最新を利用する方向で、、、

**　環境：Windows10、Oracle VM VirtualBOX(6.1)**

##### 1. バージョン確認
VirtualBOXを起動し、ファイルタブから「アップデート確認」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/d4f11a14-c7a6-50b3-1518-88511484d50e.png)
表示されたURLのリンクをクリックします。するとファイルがダウンロードされます。（このときは103MB）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/515dab0f-834a-0301-b69d-7fdbbab9a6f0.png)
##### 2. アップデート
ダウンロードしたファイルを実行します。適宜設定を変更します。（この時は全てデフォルト）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/1bf6a570-cf51-38c6-acfe-7722fbeb97fa.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/6e764298-a89c-d04c-632f-4f0a738a9f8d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/f1814475-6178-f34d-eb37-c719229ebdc5.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/2cd68e50-3da0-bfe3-4bc0-b97f4e672d9a.png)
最後に「Install」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/ba9f3e01-0382-c4b6-cac9-9e0792a45bd9.png)
（注）アプリを起動中だとエラーになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/e719188d-8d9a-4031-b159-2c6ac0047af9.png)
無事終了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/b88dcd61-34bb-bc23-4720-1f88c0745466.png)

##### 3.バージョン確認
VirtualBOXを起動し、ヘルプからバージョンを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/0a5916a5-0567-198f-1ae9-c396f4df1827.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513529/a7c8417b-9c95-ecdc-58c3-8cdac69903f1.png)
以上です。
備忘録：ライブラリとフレームークの違い

プログラミングをしていく中で、
>ライブラリ？フレームワーク？使ってはいるけど何が違うの？？？

と思っていたことがあったため、軽くまとめました。
# ライブラリとは
ライブラリとは以下のように定義されています↓([Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA)より引用)
>汎用性の高い複数のプログラムを再利用可能な形でひとまとまりにしたものである。ライブラリと呼ぶときは、それ単体ではプログラムとして動作させることはできない、つまり実行ファイルではない場合がある。

もう少し噛み砕いて言うと「よく使われるプログラム(処理)をまとめたもの」と言うことになります。これはあくまで部品であり、ライブラリ単体では何かをすることはできないことがほとんどです。

開発していて、「うわ、こんな処理をさせたいけど実装が面倒臭そう...」と思った時に、処理内容なんかで検索かけると大体そう言った内容のライブラリがヒットします。

つまり、**開発していて**こんな処理したいけど実装がなぁ...と思ったときに使うのがライブラリなんです。
（あまりにも有名すぎるライブラリとかはそのフローさえ無視して利用されていたりしますが）

→ [もう少し詳しく](https://qiita.com/Int5522/items/c8cb42cca4735b8f5e77)

# フレームワークとは
フレームワークとは以下のように定義されています↓([Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF)より)
>プログラミングにおいて、アプリケーションソフトウェアの標準構造を実装するのに使われるライブラリ（サブルーチンやクラスなど）の集まりである。

そう、もうまんま。ライブラリの集まりなんですよね(サブルーチンやクラスとかは今は無視してください)。でもただのライブラリの集まりではなくて、**フレームワーク(枠組み)なんです**。一通りの開発に必要なものは**ほぼ全て**用意してくれて、「こういう処理はここでしてね」とか親切に教えてくれますし、公式ドキュメント見ながらコードを書くだけで何を意識するでもなく、一つのアプリケーションができてしまいます。

こちらに至っては、**開発を始める前に**導入することがほとんどです。というかフレームワークに沿って開発をするのが通常です。
(逆にひねくれたことを言えば、枠組みが決まっているので自由度は**比較的低い**です。とは言え、少しひねったくらいのアプリケーションなら全然問題はないので、気にしたこともありませんが...)

→ [もう少し詳しく](https://qiita.com/Int5522/items/7f951ab43f3b840f2cab)

# 違いは？
まとめると、**役割** と **できること** が違います。
`ライブラリ`：`「こんな処理したい」が簡単に実装できる`
`フレームワーク`：`「こんなアプリケーションを作りたい」が簡単に作れる`
ターミナルでファイル編集（vi）

初書：2020/11/22

# 前置き

※完全な自分用メモです。


# 編集モードにする

```zsh
% vi ファイル名.txt
```
`ファイル名.txt`はファイル名（そのまま）
管理者権限でやる場合は、先頭に`sudo`をつける

# 画面モード
画面モードが２つ
一つはカーソル選択モード、もう一つが編集モード（名前は適当につけた。もし名前が設定されていたらすみません）

カーソル選択モードでは、キー入力によってカーソル位置を入力したり、ファイル保存や終了などが出来る。
編集モードでは、普通のメモ帳などのように文字入力や、カーソル移動をすることができる。


# よく使うコマンド
それ以外は参考サイトなり、他のサイトなり。


## カーソル操作
※選択モードのみ

|キー|移動先||
|:---:|:---:|:-----:|
|h|左|←|
|j|下|↓|
|k|上|↑|
|l|右|→|

## 編集

|キー|操作|モード|
|:---:|:---:|:--:|
|a|そのまま追加|選択モード|
|o|下の行に追加|選択モード|
|ESC|編集終了|編集モード|

## ファイル操作
※選択モードのみ
画面の一番下に現在の入力が表示されるので、そこに打ち込む。

|キー|操作|
|:---:|:---:|
|:wq!|保存して終了|
|:w!|保存|
|:q!|終了|

# 終わりに

普段viコマンドを使うことが無いので、必要最低限使えればいいかな、という感じのコマンドだけメモです。
使い慣れたら変わるのだろうか。。。？



# 参考サイト
[linuxのテキスト編集（vi, sed, tr, grepなど＋xargs）まとめ | marketechlabo](https://www.marketechlabo.com/linux-commands-text-processing/)
mac os Big Surユーザ git kraken速度改善方法

この記事はMac OS big surのユーザが対象です

# git kraken速度完全方法

公式のtwitterアカウントが一時的な回避方法が載っていました。。

git krakenをアップデートした際には、毎回署名を外す必要があるそうです。

```bash
codesign --remove-signature /Applications/GitKraken.app/Contents/Frameworks/GitKraken\ Helper\ \(Renderer\).app
```



## 参考

https://twitter.com/gitkraken/status/1329443370385743877?s=21