OmniAICreator/Qiita-1.07M huggingface dataset:
[AWS,Rails]EC2のRailsアプリに外部から接続できない問題の解決

###問題の概要
世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで
https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce

上記記事を参考にEC2のサーバー構築をしており、unicornとnginx両方正常に起動している状態でElasticIPにアクセスしようとしても

>このサイトにアクセスできません
>[xx.xx.xx.xx]からの応答時間が長すぎます。

と表示される。

その他にも特徴があり

- curlコマンドが弾かれる

`$ curl http://xx.xx.xx.xx`

- nginxのログ、unicornのログにエラーは出ていない。

###原因
SSL証明書を発行していないにもかかわらずHTTPS接続を要求しており、サーバー側が対応できず接続を拒否している。

原因は２つあり

- **ブラウザの問題**
 どこかのタイミングでブラウザからHTTPS接続を要求し、キャッシュに残っていた(→自動的にHTTPS接続を要求する)

- **Railsの設定の問題**
 Railsの`production.rb`で`force_ssl = true`になっている。

###解決策
- `production.rb`の設定を`config.force_ssl = false`に変更する。

```ruby:config/environments/production.rb
#Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = false
```
この段階でcurlコマンドが通るようになる
`$ curl http://xx.xx.xx.xx`

- ブラウザのキャッシュをクリアする。(chromeであれば右上のメニューボタン>その他のツール>閲覧履歴を消去)


###まとめ
エラーログが吐き出されないため初学者には原因を特定しづらい問題だと思います。
他の初学者の方の助けになれば幸いです。

また上記内容は参考にさせていただいたQiita記事[世界一丁寧な〜]のコメント欄にて@napojin様が書き込まれた解決法をまとめたものです。私が検索したかぎりでは一つの記事になっていなかったのでまとめさせていただきました。
この場を借りてお礼を申し上げます。
【Udemy Python3入門+応用】　36. InとNotの使い所

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


##■In と Not の使い所
#####◆基本の使い方
```python:in_and_not
y = [1, 2, 3]
x = 1

if x in y:
    print('in')

if 100 not in y:
    print('not in')
```
```:result
in
not in
```

#####◆not を使うべきではない場合
```python:not
a = 1
b = 2

# こうするよりも
if not a == b:
    print('Not equal')

# こうすべき
if a != b:
    print('Not equal')
```
```:result
Not equal
Not equal
```

#####◆boolean型のときのnot
```python:boolean_not
is_ok = True

if not is_ok:
    print('hello')
```
```:result
```
慣れないと少し気持ち悪いかもしれないが、
boolean型にnotをつけて記述することがしばしばあるので慣れておこう。
No such file or directory: 'chromedriver': 'chromedriver'の解決

##seleniumを使おうと考えて、、
[Python + Selenium で Chrome の自動操作を一通り](https://qiita.com/memakura/items/20a02161fa7e18d8a693)にならってseleniumの設定を行っていました。
`非headlessモードでテスト`の部分でエラーが、、、
エラーメッセージ:
` File "/Users/[ユーザ名]/.pyenv/versions/3.7.3/lib/python3.7/site-packages/selenium/webdriver/common/service.py", line 76, in start
    stdin=PIPE)
  File "/Users/[ユーザ名]/.pyenv/versions/3.7.3/lib/python3.7/subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "/Users/[ユーザ名]/.pyenv/versions/3.7.3/lib/python3.7/subprocess.py", line 1522, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'chromedriver': 'chromedriver'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    driver = webdriver.Chrome()
  File "/Users/[ユーザ名]/.pyenv/versions/3.7.3/lib/python3.7/site-packages/selenium/webdriver/chrome/webdriver.py", line 73, in __init__
    self.service.start()
  File "/Users/[ユーザ名]/.pyenv/versions/3.7.3/lib/python3.7/site-packages/selenium/webdriver/common/service.py", line 83, in start
    os.path.basename(self.path), self.start_error_message)
selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home`

##解決
[seleniumが起動しない](https://teratail.com/questions/194886)という似た質問を見つけたので、そこの解決方法に従いました。
原因としては、解決方法にあった通り`chromedriver-binary`とchromeのバージョンが異なっていたから、
自分のchromedriver-binaryのバージョンは`chromedriver-binary-81.0.4044.20.0`に対してchromeのバージョンは`80.0.3987.132`。

バージョンを変更しようと考え、`pip install chromedriver-binary==80.0.3987.132`とchromeのバージョンに合わせたchromedriverをインストールしようと考えたら、
`ERROR: Could not find a version that satisfies the requirement chromedriver-binary==80.0.3987.132 (from versions: 2.29.1, 2.31.1, 2.33.1, 2.34.0, 2.35.0, 2.35.1, 2.36.0, 2.37.0, 2.38.0, 2.39.0, 2.40.1, 2.41.0, 2.42.0, 2.43.0, 2.44.0, 2.45.0, 2.46.0, 70.0.3538.16.0, 70.0.3538.67.0, 70.0.3538.97.0, 71.0.3578.30.0, 71.0.3578.33.0, 71.0.3578.80.0, 71.0.3578.137.0, 72.0.3626.7.0, 72.0.3626.69.0, 73.0.3683.20.0, 73.0.3683.68.0, 74.0.3729.6.0, 75.0.3770.8.0, 75.0.3770.90.0, 75.0.3770.140.0, 76.0.3809.12.0, 76.0.3809.25.0, 76.0.3809.68.0, 76.0.3809.126.0, 77.0.3865.10.0, 77.0.3865.40.0, 78.0.3904.11.0, 78.0.3904.70.0, 78.0.3904.105.0, 79.0.3945.16.0, 79.0.3945.36.0, 80.0.3987.16.0, 80.0.3987.106.0, 81.0.4044.20.0)
ERROR: No matching distribution found for chromedriver-binary==80.0.3987.132`
と怒られる。
必ずしもchromeのバージョンのchromedriver-binaryがあるわけではないらしい。
そこで一番近そうなchromedriver-binary==80.0.3987.106.0をインストール。
(他の80.0のバージョンでは試していませんが、近いバージョンを選べば良さそう)

最後に`import chromedriver_binary`をテストケースの冒頭に加えてあげたらテストケースが実行できました。

##感想
自分のchromeは最新だったのに、chromedriver_binaryの最新バージョンとバージョンが一致しなかったのは何故、、、

##参照
・[Python + Selenium で Chrome の自動操作を一通り](https://qiita.com/memakura/items/20a02161fa7e18d8a693)
・[seleniumが起動しない](https://teratail.com/questions/194886)
【Udemy Python3入門+応用】　35. 比較演算子と論理演算子

**※この記事はUdemyの
「[現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル](https://www.udemy.com/course/python-beginner/ "現役シリコンバレーエンジニアが教えるPython3入門+応用+アメリカのシリコンバレー流コードスタイル")」
の講座を受講した上での、自分用の授業ノートです。
講師の[酒井潤](https://twitter.com/sakaijun "酒井潤")さんから許可をいただいた上で公開しています。**


## 演算子一覧
```python:operator
# a が b と等しい
a == b

# a が b と異なる
a != b

# a が b よりも小さい
a < b

# a が b よりも大きい
a > b

# a が b 以下である
a <= b

# a　が b 以上である
a >= b

# a > 0 かつ b > 0
a > 0 and b > 0

# a > 0 または b > 0
a > 0 or b > 0
```
任意の位置までスクロールすると着火するモーダルウィンドウを作ってみた

##どんな時に使うの？
例えば，ある程度のページをスクロールしたら広告を打ったり，新規登録をうながしたり．
![スクリーンショット 2020-03-07 15.27.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/5469d6c4-8141-edeb-f8d3-2af0342a4b39.png)


###背景
今回，これらのものを作ろうとしても特に良さげな記事が無かったので自作しました．
コピペで使ってOKです.

###材料
bootstrap 4系
JQuery

これらのみで簡単に作っていきましょう．

##モーダルウィンドウの作成
まずはモーダルウィンドウの表示は[bootstrap](https://getbootstrap.com/docs/4.4/components/modal/)さんにお願いしましょう

```html
  <div class="modal fade" id="exampleModalCenter" tabindex="-1" role="dialog" aria-labelledby="exampleModalCenterTitle" aria-hidden="true">
                <div class="modal-dialog modal-dialog-centered" role="document">
                  <div class="modal-content">
                    <div class="modal-header">
                      <h5 class="modal-title" id="exampleModalCenterTitle">続きを見るにはログインが必要です</h5>
                      <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                      </button>
                    </div>
                    <div class="modal-body" style="text-align : center ;">
                     <p>他にもログイン特典が沢山</p>
                     <p>あなたの<b>気になる企業</b>を検索!</p>
　　　　　　　　　　　<img src="任意" alt="hoge" class="w-100" > 
                    </div>
                    <div class="modal-footer">
                      <button type="button" class="btn btn-secondary" data-dismiss="modal">戻る</button>
                      <a href="/hogelogin"><button type="button" class="btn btn-primary">ログイン</button></a>
                    </div>
                  </div>
                </div>
              </div>
```

べたっとどこでもいいのでbody内に貼ってください.
imgタグを入れるときは bootstrap classのw-100を使えばレスポンシブで綺麗にできるのでオススメ

##着火ボタン設置
次に着火ボタンをおきましょう
これもどこに置いてもOK!

```html
<button hidden type="button" id="chakka"  data-toggle="modal" data-target="#exampleModalCenter">着火</button>
```

chakkaっていうidのボタンを作ります.
ダサいのでhiddenで隠しておきます.

###着火
これをJQueryで着火させます.

```javascript
          $(window).scroll(function() {
            let nowscroll = $(window).scrollTop() ;
            if(nowscroll>=3200){
              $('#chakka').click();
              $("#chakka").remove() ;
            }
          }) ;
```
3200px以上でchakkaボタンに着火.
消した後何度もモーダルが出るとウザいのでremove()で一回コッキリに.


僕の場合はtopから3200pxで着火させてますが，例えば

```javascript

 $(window).scroll(function() {
let nowscroll = $(window).scrollTop() ;
console.log("現在地"+nowscroll)
}) ;
```

こんな感じで画面スクロールしながらどこで着火させるか見つけると良いですよ.



ログインした人に対してもこれを行うのはナンセンスなので
セッションをif文で見てあげて使いましょう.
Node.js Expressフレームワークを使用してSQL Serverに接続する（準備作業）

#はじめに
Node.js Expressフレームワークを使用して、SQL Serverのレコードを表示するページを作りたいと思います。
その前に、SQL Serverにテーブルを作成し、サンプルデータを挿入します。

#データベース作成
「Training01」というデータベースを作成します。
T-SQLによるデータベース作成の詳しい説明は[こちら](https://docs.microsoft.com/ja-jp/sql/relational-databases/databases/create-a-database?view=sql-server-ver15)を参考にして下さい。

```SQL
CREATE DATABASE Training01;
```

#テーブル作成
このようなテーブルを作成します。
![sql01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591423/88d53d44-6b3a-a8a2-b034-163bdd840978.jpeg)

```SQL:テーブル作成
CREATE TABLE [dbo].[ProductsMaster](
	[ProductsCode] [char](8) NOT NULL,
	[ProductsName] [nvarchar](50) NOT NULL,
	[UnitPrice] [int] NOT NULL,
 CONSTRAINT [PK_ProductsMaster] PRIMARY KEY CLUSTERED 
(
	[ProductsCode] ASC
)
) ON [PRIMARY];
```

#サンプルデータの挿入
次のSQL文でサンプルデータを挿入します。

```SQL
INSERT INTO ProductsMaster VALUES ('A0000001', '牛肉' , 200);
INSERT INTO ProductsMaster VALUES ('A0000002', '豚肉' , 150);
INSERT INTO ProductsMaster VALUES ('A0000003', '鶏肉' , 100);
INSERT INTO ProductsMaster VALUES ('B0000001', '玉子' , 200);
INSERT INTO ProductsMaster VALUES ('C0000001', 'タマネギ' , 100);
```

#確認
SELECT文を発行して確認します。

```SQL
SELECT * FROM ProductsMaster;
```

#まとめ
以上で準備作業は終了です。

#参考/出展
データベースの作成
[https://docs.microsoft.com/ja-jp/sql/relational-databases/databases/create-a-database?view=sql-server-ver15](https://docs.microsoft.com/ja-jp/sql/relational-databases/databases/create-a-database?view=sql-server-ver15)

Cent OS 8にSQL Server 2019をインストール
[https://qiita.com/t_skri/items/54e9a47706ba634a5558](https://qiita.com/t_skri/items/54e9a47706ba634a5558)
【シェルスクリプトBash】 if 文（test文）のオプションまとめ

>この記事では、《シェルスクリプトのif文（test文）のオプション》について、
業務を通して学習した内容をまとめています。

- __オプション①：&ensp;数値の比較__
- __オプション②：&ensp;文字列の比較__
- __オプション③：&ensp;文字列長のチェック__
- __オプション④：&ensp;ファイル・ディレクトリのチェック__
- __オプション⑤：&ensp;実行結果のチェック__

こういった内容についてまとめています。

__※本記事は、自分で学習したことのまとめ用として書いています。
尚、解説で誤った点があれば、スローして頂ければ喜んでキャッチしますのでお願い致します。__

## オプション①：&ensp;数値の比較

| オプション | 説明 | 備考① | 備考② |
| :---: | :--- | :--- | :---: |
| A -eq B | AとBが等しければ&ensp;true | equal | = |
| A -ne B | AとBが等しくなければ&ensp;true | not equal | != |
| A -gt B | AがBより大なら&ensp;true | greater than |  > |
| A -ge B | AがB以上なら&ensp;true | greater than or equal | >= |
| A -lt B | AがBより小なら&ensp;true | less than | < |
| A -le B | AがB以下なら&ensp;true | less than or equal | <= |

### --- 例題 ---

~~~sample.sh
#!/bin/bash

numA=1
numB=1

if [ $numA -eq $numB ]; then
    echo "numA と numB は等しい"
else
    echo "numA　と numB は等しくない"
fi
~~~

### --- 実行結果 ---

~~~
$ . sample.sh
numA と numB は等しい
~~~

## オプション②：&ensp;文字列の比較

| オプション | 説明 |
| :---: | :--- |
| A = B | AとBが等しければ&ensp;true |
| A != B | AとBが等しくなければ&ensp;true |

### --- 例題 ---

~~~sample.sh
#!/bin/sh

str="hello"

if [ ${str} = "hello" ]; then
    echo "${str}"
    echo "Hello!!!"
elif [ ${str} = "world" ]; then
    echo "${str}"
    echo "World!!!"
else
    echo "Hello World!!!"
fi
~~~

### --- 実行結果 ---

~~~
$ . sample.sh
hello
Hello!!!
~~~

## オプション③：&ensp;文字列長のチェック

| オプション | 説明 |
| :---: | :--- |
| -z A | Aの文字列長が&ensp;0&ensp;なら&ensp;true |
| -n A | Aの文字列長が&ensp;0&ensp;より大なら&ensp;true |

### --- 例題 ---

~~~sample.sh
#!/bin/bash

str="abcde"

if [ -n "${str}" ]; then
  echo "文字列長は 0 より大きいです!"
else
  echo "文字列長は 0 です!"
fi
~~~

### --- 実行結果 ---

~~~
$ . sample.sh
文字列長は 0 より大きいです!
~~~

## オプション④：&ensp;ファイル・ディレクトリのチェック

| オプション | 説明 |
| :---: | :--- |
| -f A | Aがファイルなら&ensp;true |
| -d A | Aがディレクトリなら&ensp;true|
| -e A | Aが存在するなら&ensp;true |
| -s A | Aのサイズが&ensp;0&ensp;より大きければ&ensp;true |
| -r A | Aが読み取り可能なら&ensp;true |
| -w A | Aが書き込み可能なら&ensp;true |
| -x A | Aが実行可能なら&ensp;true |

### --- 例題 ---

~~~sample.sh
#!/bin/bash

LOG_FILE="sample.log"

if [ -f ${LOG_FILE} ]; then
  echo "ファイルです!"
else
  echo "ファイルではありません!"
fi
~~~

### --- 実行結果 ---

~~~
$ . sample.sh
ファイルです!
~~~

## オプション⑤：&ensp;実行結果のチェック

| オプション | 説明 |
| :---: | :--- |
| $? | 直前のコマンドの実行結果を格納 |

### --- 例題 ---

~~~sample.sh
#!/bin/bash

. dummy.sh  # dummy.shを実行

exit_flag=$? # 実行結果を変数に格納

if [ $exit_flag = 0 ]; then
    echo $exit_flag
    echo "dummy.shは正常終了"
else
    echo $exit_flag
    echo "dummy.shは異常終了"
fi
~~~

### --- 実行結果 ---

~~~
$ . sample.sh
0
dummy.shは正常終了
~~~
読書ログ 『Docker / Kubernetes 実践コンテナ開発入門』 1章

## はじめに

『Docker / Kubernetes 実践コンテナ開発入門』の第1章が、Docker / Kubernetesを概観するのに分かり易かったので、まとめます。

## 要約

- **Docker**とは**仮想OS(=コンテナ)の実現のため実行される常駐アプリケーション** + **それを操作するためのCLI**から成るプロダクト
- **Dockerのメリット** =  **開発環境と本番環境をほぼ同等に再現できること**
  - 環境差異問題の解消 /  アプリとインフラ をセットで構築

## Dockerとは

- **コンテナ型仮想化技術を実現するために実行される常駐アプリケーション** + **それを操作するためのCLI(コマンドラインインターフェース)から成るプロダクト**
- **アプリケーションのデプロイに特化**しており、**コンテナを中心とした開発・運用**を可能とする。

### コンテナとは

- **Dockerによって作成される仮想OS**(ゲストOS)
- コンテナによって **開発環境と本番環境をほぼ同等に再現**できる

## Dockerの基礎概念

### コンテナ型仮想化技術とは

- 仮想化ソフトウェアなしにOSのリソースを隔離し、仮想OSにする技術のこと。
  - この**仮想OSをコンテナ**と呼ぶ

#### (参考)ホストOS型仮想化

- OS上にインストールした仮想化ソフトウェアを利用し、ハードウェアを演算により再現しゲストOSを作り出す仕組み

### Dockerのスタイル

- コンテナに**アプリケーションと実行環境(OS)を同梱してデプロイする**スタイル
  - アプリケーションや必要なファイルをDockerイメージ(OS)に同梱してコンテナとして実行していくのがDockerの基本的なスタイル
- **実行環境ごとに配布することで、依存問題の困難さを解決**

### Dockerイメージをビルドする

- Dockerfileやアプリケーションの実行ファイルからDockerコンテナの元と成るイメージを作ること

## Dockerの利用意義

### 環境差異問題からの脱却

- **Infrastructure as Code**と **Immutable Infrastructure**、これらの考え方を簡単かつ低コストに実現できる手法

#### Infrastructure as code (インフラ の構成管理)

- **コードベースでインフラ 構築を定義する考え**
- どのような構成にするか、インストールするライブラリ、ツールなどは何かをコードベースで定義し、プロビジョニングツール(Chef / Ansible)を使ってサーバを構築

#### Immutable Infrastructure

- **ある地点のサーバ(サーバのイメージ)の状態を保存し、複製可能にする考え方。**
  - 正しくセットアップされた状態のサーバを常に使えるのが最大の利点
- 不変な実行環境によって、何度実行しても同じ結果が保証される、冪等性を保つ。

### アプリケーションとインフラ をセットで構築する

- **DockerコンテナはOS(インフラ )とアプリケーションを同梱した箱**のようなもの
- Dockerイメージのビルドは、**インフラ とアプリケーションをセットでビルドできること**

### アプリケーションの構成管理のしやすさ

- 複数のアプリケーションやミドルウェアを組み合わせた複雑なシステムを単体で動かすための仕組み = Kubernates

#### Docker Compose

- 複数コンテナを利用したアプリケーションの管理をしやすくするためのツール。
- yaml形式の設定ファイルで実行するコンテナを定義したり、依存関係を定義して起動順を制御したりできる

#### Docker Swarm(Swarm Mode)

#### コンテナオーケストレーション(Kubernates)

- 複数のノードを跨いで多くのコンテナ群を管理する手法
- コンテナオーケストレーションで、デファクトスタンダードになってるのが、**Kubernates**



## 感想

Dockerの全体感をざっくり理解できたと思う🙋‍♂️
Ubuntu18.04 にAutoware.AIをインストール

Ubuntu 18.04 にAutoware.AIをインストールする。

AutowareはROSのAutoware.AIとROS2のAutoware.autoの2系統が存在する。
現在のメインラインはAutoware.ai、将来的にはAutoware.autoにする計画。

#### ROSのインストール

基本的に、
https://gitlab.com/autowarefoundation/autoware.ai/autoware/-/wikis/Source-Build
に従ってすすめる。
ROSは18.04なので、melodicを選択。
パッケージと鍵の登録を事前に実施する必要だった。

```
$ # パッケージ追加
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ # 鍵の追加
$ sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
$ # ここから手順通り
$ sudo apt update
$ sudo apt install -y python-catkin-pkg python-rosdep ros-melodic-catkin # $ROS_DISTRO を melodic に置き換え
$ sudo apt install -y python3-pip python3-colcon-common-extensions python3-setuptools python3-vcstool
$ pip3 install -U setuptools
```

#### Autoware.AIのインストール

引き続き
https://gitlab.com/autowarefoundation/autoware.ai/autoware/-/wikis/Source-Build
に従ってすすめる。
インストールするAutowareのバージョンはリリースされている最新版の1.13.0にした。
`sudo rosdep init`と`source /opt/ros/melodic/setup.bash`が追加で必要だった。

```
$ # 1. Create a workspace
$ mkdir -p autoware.ai/src
$ cd autoware.ai
$
$ # 2. Download the workspace configuration for Autoware.AI.
$ wget -O autoware.ai.repos "https://gitlab.com/autowarefoundation/autoware.ai/autoware/raw/1.13.0/autoware.ai.repos?inline=false"
$ 
$ # 3. Download Autoware.AI into the workspace.
$ vcs import src < autoware.ai.repos
$
$ # 4. Install dependencies using rosdep.
$ sudo rosdep init
$ rosdep update
$ rosdep install -y --from-paths src --ignore-src --rosdistro melodic
$ 
$ # 5. Compile the workspace
$ source /opt/ros/melodic/setup.bash
$ colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
```
【Java】Public static void main(String[] args)の意味 

`public static void main(String[] args)`はJavaを実行するのに、必須のメソッドです。
構文はひとつでも間違えるとエラーになり、実行できません。
ひとつひとつに意味があるためです。

```Hello.java
class Hello{
    public static void main(String[] args) {
        System.out.println("Hello World");        
    }
}
```

各項目の意味は、以下の通りです。

|項目|意味|
|:--|:--|
|public|どこからでも参照可能|
|static|インスタンス可(new)しなくても外部から使用可能|
|void|戻り値なし|
|main|メソッド名|
|String\[\]|引数をString型の配列で受け取る|
|[args](#argsについて)|引数名、argument（和訳：引数）の複数形でargumentsの略省|
## argsについて
String[] argsは、プログラム起動時に指定する値（コマンドライン引数）です。
引数名argsは、慣習的にargsが使われていますが、別の名前でも使用できます。
慣習的にargsが使われている理由は、JavaはC言語の後継であり、C言語の慣習をそのまま受け継いでいるためです。
### C言語ので使われている引数名
- argv（argument vector（引数の配列））
- argc（argument count（引数の個数））

### 引数の動作確認

```Hello.java
class Hello{
    public static void main(String[] args) {
        System.out.println(args[0]);        
    }
}
```

- 実行結果

```
$ java Hello "Hello world"
Hello world
```
- argsをsampleに代える

```Hello.java
class Hello{
    public static void main(String[] sample) {
        System.out.println(sample[0]);        
    }
}
```

- 実行結果

```
$ java Hello "Hello world"
Hello world
```
## 構文を誤った場合
構文を誤った場合は以下のような実行結果になります。

```
$ java Hello "Hello world"
エラー: メイン・メソッドがクラスHelloで見つかりません。次のようにメイン・メソッドを定義してください。
   public static void main(String[] args)
```
### 誤った構文例
- 引数をString型の配列以外にした場合

```Hello.java
class Hello{
    public static void main(Integer[] sample) {
        System.out.println(sample[0]);        
    }
}
```
*引数がString型である理由は、コマンドラインから受け取る値は、人間が入力する文字であり、それは文字列であるという思想から*
GAS入門編 ①


「なし」という値をGasを使って入力する

```javascript:
function myFunction() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('マスタ');
  const lastRow = sheet.getLastRow();
  const term = sheet.getRange(5, 2).getValue();
  Logger.log(term);
  const course = sheet.getRange(5, 8).getValue();
   Logger.log(course);
  const finishday = sheet.getRange(5, 20).getValue();
  Logger.log(finishday);
  // 期を指定する。
  // コースを指定する。
　// 日程を指定する。
  if(term == 72 & course == "コース" & finishday == ""){
  // 期&コースが〇〇のとき、という条件を指定する。
  sheet.getRange(5, 9).setValue("なし");
  
  }
}
```

# シートの指定方法

```javascript:
SpreadsheetApp.getActiveSpreadsheet().getSheetByName('マスタ');
```
## SpreadsheetApp
Googleの用意したメソッドを使用するための記述。

## getActiveSpreadsheet()
現在開いているアクティブなシートを取得する。

## getSheetByName('マスタ')
シート名を指定して、任意のシートの情報を取得、入力する
# 範囲の指定と値の取得
## getLastRow();
一番最後の行の情報を取得

## getRange(,)
getRange(5, 8)
取得するカラムを指定する。
第一引数に行
第二引数に列の値を入れる

## getValue();
指定した範囲の値を取得する


## setValue();
指定した範囲に引数の値を入力する

# デバック方法
## Logger.log()
バクを見つけるために引数に変数を入れる。
command+Enterでログが表示される
PythonでJSONファイルの指定位置に英語が入力されているかを調べるスクリプトを作成しました。

どうも、[たくみ](https://twitter.com/sushi_love_taku)です。

大阪在住のエンジニアです。（厳密には3/15から）
現在はLaravel・React勉強中です。
今回初めてQiitaを書きます、お手柔らかにお願いしますw


##  作成した経緯
普段からお世話になってる[shohei](https://twitter.com/hobbydevelop)さんが英語学習のアプリを作るということで、私事ですが、フィリピン留学や小学校で英語を教えていた経験から、こちらのアプリの英文コンテンツ作成をお手伝いさせていただいています。

アプリはこちら↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540099/a95bfc9d-d6ae-80e3-c0d3-88ac8231a9e9.png)

・iOS
https://apps.apple.com/jp/app/id1493691416

・Android
https://play.google.com/store/apps/details?id=com.gmail.hukusuke1007.lala

ちゃっかり宣伝w


私の役割は、JSONファイルに英語と日本語を入力するという非常にシンプルな作業なのですが、注意力散漫な私はいつも英語と日本語を書く場所を間違えてしまうのです。

どのようにして解決すれば良いかと悩んでいたところ、スクリプトを組んでみたら？とアドバイスいただきチャレンジすることにしました。

![スクリーンショット 2020-03-07 14.41.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540099/96cd8846-fa95-f44c-fccf-749e26ccc5fe.png)

##  自分が書いたコード


```script_check.py
import json
json_open = open('script.json', 'r', )
json_load = json.load(json_open)

checkWord1 = (json_load['title']['english'])
print(checkWord1)
print(checkWord1[0] .isupper()) 

checkWord2 = (json_load['description']['english'])
print(checkWord2)
print(checkWord2[0] .isupper()) 
```


```sentences_check.py
import json
json_open = open('sentences.json', 'r', )
json_load = json.load(json_open)

num = 0
while (num < 10):
    print (json_load["sentences"][num]["text"]['english'])
    checkWord = (json_load["sentences"][num]["text"]['english'])
    print checkWord[0].isupper()
    num += 1
```

##  概要
まずはPythonでJSONの値をとって、それを判断するという流れで行きたかったので、値の取得のためにこちらの記事を参考にしました。
[PythonでJSON 読み込み](https://qiita.com/kikuchiTakuya/items/53990fca06fb9ba1d8a7)

そもそもJSONって何！？って状態だったので、そこから勉強しましたw
こちらのサイトがわかりやすかったです。
[JSON入門](http://www.tohoho-web.com/ex/json.html)

調べてる途中、JSON Schema ってのを使えばいけるんじゃないか説が出ましたが、なんか難しそうなのでやめましたw

使えそうな関数がまとめられている記事を見つけ、isupper()を使うことにして出来上がったという感じです。
[英数字の判定　python](https://qiita.com/takos/items/dd1a109e283e615adb02)

## 実行結果
![スクリーンショット 2020-03-07 13.39.34のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540099/e7e0f4ea-c33c-32e9-9d47-69dffcdab8b3.png)

こんな感じで、日本語が入っていると、Falseを返します。

## 課題
これでは一つのファイルを対象にしかチェックできないので、ディレクトリを指定したらチェックするもの作れたらいいなと思います。
あとは、TrueやFalseをターミナルで色をつけたいです。

## 終わりに

これからも勉強頑張ります。
関西で所学者向けにもくもく会開催してますので、よかったらフォローお願いします。
[Twitter](https://twitter.com/sushi_love_taku)
iOSでBluetoothの許可設定

単なるメモです。
なにか作ったら、そのうちアップします。多分

##やってたこと
M5StackとiPhoneで通信するiOSアプリとM5Stack側のソフト

[数少ないM5StackとiOSの記事](https://qiita.com/From_F/items/66099d488a324ad38d40)を参考にしながら、iOSアプリを作っていたわけですが、どうしてもBluetoothで通信できない。。。。

##何をやって解決したか？
結論から言うと、Bluetoothを使うときの許可設定をやっていなかった。だけ
よく見る、Bluetooth使うけどOK?　はい　いいえ　見たいやつ。

###Appの実装
「plist」を右クリック→「Open Ad」 →　「source code」
<img width="261" alt="スクリーンショット 2020-03-07 14.59.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256408/dbdc3935-74f2-3be7-a79c-9d1b733a5365.png">

以下を書き足す

```Info.plist
<dict>
    <key>NSBluetoothAlwaysUsageDescription</key>　　　←ここを追加
    <string>Bluetooth使うけどほんとにいいよね？</string>　←ここを追加
```

##環境
Xcode:11.2.1
iOS: 13.3.1 (iphone 7 / X )
python3.8.0の仮想環境作って適用したらvscodeでコード補完が効かなくなった

# python3.8.0の仮想環境
pyenvで3.8.0の仮想環境作ってヨッシャ新機能試すぞーと思ったらコード補完が全く効かなくなってしまった。
↓ちゃんとpython3.8.0の仮想環境が適用されてる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/6db24333-af02-ab6d-475f-1b211f47c9f0.png)


# 対処法
### settings.jsonを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/5cb18776-4030-f9c9-2103-887fec5ad60e.png)

### settings.jsonに追記
`"python.jediEnabled": false`を追記

```json
{
    "python.pythonPath": "/Users/.../.pyenv/versions/new_doc_38/bin/python",
    "python.jediEnabled": false // この1行を追記
}
```

コード補完できるようになった( ´Д`)=3ッホ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/357470/7eea9095-6e80-02f8-4597-cb2827ba7715.png)
【Ruby】シンボル

#シンボル
コロン記号「：」を文字列に前置して定義したもの。

```rb
sym = :symbol    #シンボル
```

###後置コロン
シンボルをハッシュキーとして使用する際や、キーワード引数を使用する場合に後置する。

###オブジェクトの１つ
シンボルは文字列とは別物。
メソッド等の名前を識別するためにラベルをオブジェクト化したものになる。

##文字列との違い

###シンボルは値をもたない
シンボルは値をもたないため、文字列そのもののデータを必要としない場合にシンボルが使用される。

###データに特定の意味を持たせる
文字列とはRuby内部での動きも違う。

文字列では宣言されるたびに文字列の領域が生成されるのに対して、
シンボルは１度生成されるとポインタとなり、複数回使用しても同じ領域で使用される。

以下、サンプルコード例）

■文字列

```rb
str1 = "samurai"
str2 = "samurai"
p str1.object_id
p str2.object_id
p str1.equal?(str2) #同じオブジェクトならtrue、別のオブジェクトならfalseを返します。
```
【実行結果】

```
23122440
23122420
false #同じidではなかった→文字列の場合2つのオブジェクトが作成されている
```
■シンボル

```rb
sym1 = :samurai
sym2 = :samurai
p sym1.object_id
p sym2.object_id
p sym1.equal?(sym2)  #同じオブジェクトならtrue、別のオブジェクトならfalseを返します。
```
【実行結果】

```
892188
892188
true #同じidだった→シンボルの場合は1つしかオブジェクトが作成されていない
```

##シンボルのメリット

###メモリ消費が少なく、処理が高速になる
文字列と違い同じ領域を使用しないため、メモリ消費が少なく、処理が高速になる。

###可読性が上がる
簡単な記述で配列が記載できる様になり、シンプルにコードを書くことができる。

■ハッシュ

```rb
dog = { "name" => "pochi", "kind" => "shibaken" }
```
■シンボル

```rb
#シンボルをキーにするときは「：」を文字列の後につけます。
dog = {name: "pochi", kind: "shibaken" } 
```
【Nuxt.js】Copyrightで今年の年を自動で表示させる

年明けにCopyrightの年号を変えるのは毎回面倒なので、便利な方法としてJavascriptで自動更新する方法があります。
Javascriptで自動的に変える方法は調べたらよく出てくるのですが、Vue.jsで実装されたものが出てこなかったのでその実装方法をまとめておきます。


# JavaScriptで年号表記を自動更新
まずは定番、JavaScriptで年号表記を自動更新する方法

```index.html
&copy; <script>document.write(new Date().getFullYear());</script> Company.
```
こちらをCopyrightの部分に埋め込めば2020年なら

```
© 2020 Company.
```
と表示されます。

# Vueで書いてみよう
`created`で現在の年数を取得し、`now`に保存し出力する。


```index.vue
<template>
  <p class="copyright">
   &copy; {{ now }} Company.
  </p>
</template>

<script>
export default {
  data: () => {
    return {
      now: '' //取得した年数を格納
    };
  },
  created () { //年数を取得
    const d = new Date()
    this.now = d.getFullYear()
  }
}
</script>
```

するとこのように出力されます。

```index.html
<p class="copyright">© 2020 Company.<p>
```

# v-htmlでまとめる

更に`data`に前後のコピーライトのテキストをセットし`v-html`で出力するやり方もあります。


```index.vue
<template>
  <p class="copyright" v-html="copy + ' ' + now + ' ' + copyright"></p>
</template>

<script>
export default {
  data: () => {
    return {
      copy: '&copy;',
      now: '',
      copyright: 'Company.'
    };
  },
  created () {
    const d = new Date()
    this.now = d.getFullYear()
  }
}
</script>
```

注意：
`&copy;`はHTML特殊文字なので`{{}}`や`v-text`ではそのまま出力されてしまうので`v-html`にしないと変換されません。

## テンプレートリテラルで書いた場合

```index.vue
<template>
  <p class="copyright" v-html="`${copy} ${now} ${copyright}`"></p>
</template>

<script>
export default {
  data: () => {
    return {
      copy: '&copy;',
      now: '',
      copyright: 'Company.'
    };
  },
  created () {
    const d = new Date()
    this.now = d.getFullYear()
  }
}
</script>
```
EC2（Amazon Linux2）へRubyのインストールするよ2020

ServerSpecを使用するためにEC2インスタンスへRubyをインストールする必要があったのですが、思いの外てこずったので手順をまとめてみました。（主に備忘録として。）
引っ掛かりなく、サクッとインストールできると思います！

## サーバー環境
- EC2インスタンス
- Amazon Linux2
- t2.micro

## 手順
EC2が起動したらSSH接続します

### rbenvのインストール
rbenvはRubyのバージョン管理ツール

1 ひとまず更新

```
$ sudo yum update -y
```
2 gitのインストール

```
$ sudo yum install git -y
```
3 rbenvをリポジトリからクローン

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

4 クローンしてきたらrbenvのPATHを通す

```
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

5 rbenvのバージョンが表示されればインストールは成功

```
$ rbenv -v
```

### ruby-buildのインストール
Rubyをrbenv経由でインストールする時に必要なrbenvのプラグイン。これ入ってないとRubyインストールできません。

1 リポジトリからクローン

```
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

2 インストールの実行

```
$ cd ~/.rbenv/plugins/ruby-build
$ sudo ./install.sh
```

3 インストール可能なRubyのバージョン一覧が表示されればruby-buildのインストールは成功

```
$ rbenv install -l
```

### Rubyのインストール

1 Rubyインストールに必要なパッケージをインストール

```
$ sudo yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel
```

2 rbenvでバージョンを指定してRubyをインストール（けっこう時間かかります。画面がちっとも動きませんがインストールは進んでます）

```
$ rbenv install 2.7.0
$ # バージョン2.7.0をインストール
```

3 rbenvで使用するRubyのバージョンを指定

```
$ rbenv global 2.7.0
```

4 Rubyのバージョンを確認する（さっき指定したバージョンが表示されれば成功 ~> 2.7.0）

```
$ ruby -v
```

### まとめ
この手の記事は山ほどあると思いますが、なんかどれをみてもどっかで引っかかってしまったため、改めて成功した手順を上げてみました。参考になったらうれしいです。
あなたの Windows 10 には何種類の Python が入っていますか？私は5種類でしたが。

2020-03-10
Update1:  [あなたの macOS には何種類のPythonが入っていますか？私は401種類でしたが。](https://qiita.com/tonluqclml/items/83b31a160faa8b992cbb)
Update2: [わりかん がん保険](https://p2p-cancer.justincase.jp/) やってます

2020-03-15
Update3: タイトルが Window 10 だったのを Windows 10 に修正。無意識typoでした。

タイトルは煽りです。WSL Ubuntu 18.04 上にはpyenv経由で3種類+OS由来の2種類で合計10種類でした。

## なぜこの記事を書こうとしたのか

背景を説明します。ひさびさにWindows 10を開いたのでセキュリティアップデートも兼ねて Visual Studio Comminity 2019 update や Microsft Store からのアプリのアップデートをよく確認せずに実行したところ、Git bash から python が起動しなくなってしまったのでした。

そもそも Microsoft Store版pythonのinstallは意図すらしていなかったのだが、Git Bash からのpython実行がエラーを起こしていたため、その原因を探る過程で（過去の残骸も含めた）python達のインストール状況を調査した。

## インストーラーの分類

| version | installer type | installed path |
| :-: | :--: | :-: |
| python 3.7.5 | Visual studio community 2019 installer | "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\" |
| python 3.8.2 | Microsoft Store | (alias) "%USERPROFILE%\AppData\Local\Microsoft\WindowsApps\" |
| python 3.6.5 | Anaconda | (Just me) "%USERPROFILE%\Anaconda3" <br> (All users) "C:\ProgramData\Anaconda3" [個人的に "C:\Anaconda\" へ変更していた] |
| python 3.7.4 | R's reticulate installation of miniconda | "%LOCALAPPDATA%\r-miniconda\" |
| python 3.5.2 | Official exec installer | "%LOCALAPPDATA%\Programs\Python\Python35\" |

Note:
- `%LOCALAPPDATA%` is `C:\Users\your_login_name\AppData\Local`
- `%USERPROFILE%` is `C:\Users\your_login_name`


### 環境変数を編集して優先して使うpythonを指定

[Window key] を押し `path` と入力して `システム環境変数を編集` を選択。環境変数 -> 変数のPATH をダブルクリック。優先して使いたいpythonのpathを `上へ` で調整する。

なお、Windows 10 には究極の恐ろしいバグが含んでおり、なんと環境変数をGUIで入力すると（ユーザー環境変数、システム環境変数それぞれ）2048文字以上は認識しないということだ。 [@IT](https://www.atmarkit.co.jp/ait/articles/1510/30/news041.html)の記事がとても参考になる

### 結局どの Python を残したのか。

ぶっちゃけ WSL Ubuntu 上の作業が多いので、Windows上のpythonは全削除。とはいかずに RSutido から reticulate でたまに使うので、それだけ残す方針とした。いまのところは不便はない。

## 付随で見つけたゴミフォルダ達

問答無用で削除

- "%LOCALAPPDATA%Python Tools"
- "%LOCALAPPDATA%\Roaming\Python\Python35"

# Git Bash からの python の起動が Permission denied で失敗する理由と対応方法。

```bash
python -V
bash: /c/Users/your_account/AppData/Local/Microsoft/WindowsApps/python: Permission denied
```

これは、 Git Bash 上から `python -V` などを実行したとき、MiscroSoft Store 版の python がインストールされて、かつ path として `USERPROFILE%\AppData\Local\Microsoft\WindowsApps` に最初に python が見つかる場合に起こるエラーである。

## 対処法

MINGW 由来のバグのため Git Bash (via vscode terminal 含む) からの実行の、根本対処はない。( [Python official bug tracker](https://bugs.python.org/issue38734) にて報告有り、[stackoverflowにて](https://stackoverflow.com/questions/56974927/permission-denied-trying-to-run-python-on-windows-10])解説あり)


1. cmd, powershell からは実行できるため、Git Bash を使わない
2. Microsoft Store 版以外のpythonをインストールし、かつ `USERPROFILE%\AppData\Local\Microsoft\WindowsApps` のpathの優先度を下げる。

## まとめ

Windows 10 での Python 汚染に気を付けよう

## 参考
https://qiita.com/ozaki_physics/items/0547604eabf445e34969
頻出語の読み方

## はじめに
先日、後輩に、
「Current Directoryはキュレントではなく、カレントですよ」
と指摘されました。
その場では、「ふーん」と取り繕ったものの、
いやはや、とても恥ずかしい。備忘録を作ることにしました。
似たような記事があることは承知してます。
あくまでも自分用の記事です。

## 用語
単語 | 読み方 | 備考
:-- | :-- | :--
current | カレント | キュレントではない。
Node.js | ノードジェイエス | ノードてんジェイエスではない。
top command

# top 

## よく使うもの

```
$ top
$ top -a 
$ top -p <pid>
$ top -d1
$ top -u <user>

```





## 切替

```
$ top
```

### c
cを押すと、諸々切り替わる。


### u
uを押すと、
Which user (blank for all):
みたいなのが出てきて、userを絞り込める
cdbでソースを表示させながらデバッグ

# はじめに
WindowsでC言語のプログラミングをする場合にデバッグをする方法として

* Visual Studioを使う
* WinDBGを使う
* cdbを使う

などがあるが、CLIから離れたくない人はcdbくらいしか選択肢がない。

cdbを少し触って何とか使えるようになったので、備忘録を残す

# cdbのインストール
cdbはDebugging Tools for Windowsに付属している。インストール方法はいろいろあるが、VisualStudioからWindows SDKをインストールするのか手っ取り早い。

参考：https://docs.microsoft.com/ja-jp/windows-hardware/drivers/debugger/debugging-tools-for-windows--new-for-windows-10

インストールしたらcdbにPathを通すのとシンボルファイルの環境変数を設定する必要があるらしい。(よく分かってない)

_NT_SYMBOL_PATH = "srv*C:\Symbols*http://msdl.microsoft.com/download/symbols"

# コンパイル時にpdbファイルを生成
CLIから離れたくない人はコンパイルはcl.exeを使うと思うが、コンパイル時にpdbファイルを作成しないとデバッグ時にシンボルやソースを利用できない。clの/Ziオプションをつけるとpdbファイルが生成される

```
cl /Zi main.c
```

# cdb起動時のオプション
cdbはデフォルトではディスアセンブリモードになっており、ソースは表示されない。なので、起動すると同時にソースモードにして表示オプションを設定する。

```
cdb -lines -c "l+s;l+o;l+l;l+t;" main.exe
```

# ブレークポイントの設定
シンボルを読み込めているとモジュール名!関数名でブレークポイントを設定できる

```
bp main!main
```

また、ソースを正しく読めていればソースの特定の行にブレークポイントを置くこともできる

```
bp `main.c:8`
```

# cdbでデバッグ
gコマンドでプログラムが実行される。最初にブレークポイントが置かれているので2回gコマンドを実行すると自分で設定した最初のブレークポイントまで実行される。
そのあとはステップ実行や変数表示をしながらデバッグする

```
g：実行
p：ステップオーバー
t：ステップイン
dv：変数表示
lsa .：周辺のソースを表示
q：終了
何も入力せずにEnter：前回のコマンドを実行
```

とりあえずこれだけ覚えておけばデバッグできそう
AI開発に向けたPythonの開発環境構築

#１．概要

AIについていろいろ勉強している中で、いよいよAIそのものを開発していこうと思っております。今回その中で開発環境を構築しましたので、その内容を記載したいと思います。

作成した開発環境
OS：Windows10
Python：3.7.4
Anaconda：3

#２．Anacondaの導入

AI開発のプラットフォームとして今回Anacondaを選択しました。Anacondaは、

- AI開発に必要なツール一式がそろっている
- 導入が簡単

ということで今回選んでみました。ただ、以下のようなデメリットもあるようです。

- 重い
- ツールが多すぎてどうすればいいかわからなくなる...

デメリットについてはまだわかっておりませんが、使いづらいようであれば変えてみようと思います。

### Anacondaのインストール

以下のサイトからAnacondaをダウンロードしてください。また、すでにPythonをインストールしている場合は、**一旦アンインストールしてからAnacondaを導入してください**。

https://www.anaconda.com/distribution/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547663/0ab146a1-587e-bc6d-354f-dac1fec387c8.png)


最新版の3.7を選択し、OSに合わせて対象をダウンロードしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547663/1bf0fdb2-6fe1-75be-8d58-13078d0f910e.png)

後はデフォルトのまま次に進めばいいのですが、「Add Anaconda to my PATH environment variable」には必ずチェックを入れてください。
※非推奨と赤字で表示されますが、**チェックを入れないとPythonがうまくインストールされないようです。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547663/3451ca4d-bf67-c27f-0328-7c64ff30da52.png)

ダウンロードが完了したら、Anacondaのフォルダにある「Anaconda Powershell Prompt」を起動してください。（今後はこのツール上からPythonを動かしていきます。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547663/4a12cc0e-532b-1e6c-a7d7-7a8ac22da0ad.png)

そして、「Python」と入力し以下画面が表示されれば、開発環境のインストールが完了しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547663/0f797a8e-ba18-0527-4560-3720bd172919.png)

#３．仮想環境の構築

次のPythonの仮想環境を構築します。（Pythonで開発していると、各バージョンの違いによって解決の難しいエラーが多く発生するため、仮想化が必須のようです…）

開発環境を作りたいフォルダに移動し、以下コマンドを入力してください。入力することで、任意の仮想環境を作成することができます。

	python -m venv （任意の仮想環境名）

以下例では、デスクトップに「test」という仮想環境を構築しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547663/1af69584-86a6-9c13-0077-1cef7610dde0.png)

次に仮想環境を起動させます。まず仮想環境内のフォルダに移動します。

	cd （任意の仮想環境名）

以下コマンドを入力すれば、仮想環境を起動できます。

	.\Scripts\activate

起動が成功すれば、画面の左に（任意の仮想環境名）が表示されます。
（以下例では「test」と緑色で表示されています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547663/f1314ba0-67d4-24f4-042c-2538e77007fb.png)

この状態で必要なソフトをインストールしたりします。仮想環境を閉じる場合は、以下コマンドを入力してください。

	deactivate

以下画面のように、左側に記載されていた（任意の仮想環境名）が消えれば、仮想環境が閉じたことになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547663/e1318add-4a09-4ccd-27a0-4ea292a393e7.png)

#４．まとめ

今回AIの開発環境を導入してみました。次回からこの仮想環境に必要なツールをインストールし、実際の開発を行っていきたいと思います。
【備忘録】VScodeの使えるショートカットまとめ

VScodeを使うにあたり、作業効率化のため、ショートカットキーについて調べてみました。
https://qiita.com/naru0504/items/99495c4482cd158ddca8
https://qiita.com/kouhara/items/99c8d0249fcfa4b1d74e

完全に自分の偏見で、便利そうだと思ったショートカットキーを列挙します。
ちなみに自分のPCはMacです。

１、【基本コマンド？】コピーcommand+C、切り取りcommand+X、貼り付けcommand+V、削除command+K、取り消しcommand+Z

ここら辺は当たり前のコマンドだと思いますが、コピーまたは切り取りは文字を未選択の時に使用すると、”行を丸ごと”コピーまたは切り取りすることは初めて知りました。また、削除はShift+command+Kで"行を丸ごと"削除できることも初めて知りました。

2、行を下に挿入command+Enter、カーソル行を下へコピーshift+option+↓

今までは、勝手に綴じタグが補完された後、わざわざ行の末尾までカーソルを移動させてから、Enterしていましたが、command+Enterなら一発でした。
リストを作る時＜li＞の行を今まではコピペしていましたが、shift+option+↓なら一発でした。

３、【カーソル移動】行の先頭へ移動command+←、行の末尾へ移動command+→、指定数字の行へ移動ctrl+G、指定ファイルへ移動command+P

意外と←→↑↓の方向キー移動は時間がかかるので、積極的に使った方がいいと思いました。

４、【画面操作？】画面分割Ctrl+option+command+¥、分割画面移動command+1or2、サイドバー表示or非表示command+b

画面を２分割して、左をhtml、右をcssにしたら便利だと思いました。

５、【コメント】コメントを挿入shift+option+A、カーソル行をコメントアウトまたは外すcommand+/、

６、インデントを揃えるshift+option+F

７、同じ語句を全て選択command+shift+L
一括で同じ語句を変換するときに使える
ファイルやフォルダのパーミッションやアクセス権限を設定する「chmod」コマンド

##はじめに
今回はファイルやフォルダのパーミッションやアクセス権限を設定する「chmod」コマンドについて紹介します。

##ファイルの権限の見方
左からアルファベットの10桁が【権限の詳細】、黒く隠している部分が【所有者】、黒く隠している隣のstaffが【所有者グループ】を表しています。
<img width="499" alt="スクリーンショット 2020-03-07 13.58.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384180/0816b1d3-9f13-0b24-ae07-e8362a30a3e1.png">
【権限の詳細】に関して左の１文字がファイルかディレクトリかシンボリックリンクかを表わしています。
次の３文字が所有者のアクセス権限、３文字がグループユーザーのアクセス権限、その他ユーザーのアクセス権限を示しており、rが読み取り可能、wが書き込み可能、xが実行可能、-は権限なしということを示しています。

##ファイルの権限の変更で使うコマンドの組み合わせ
下記記載したものを用いて権限変更してみましょう。
【誰に】【付与or削除する】【どんな権限に】の3つに区切って考えます。
**・どのグループに対して権限変更するか**

| 記号 | 意味 |
|:--|:--|
| u | 所有者の権限 |
| g | グループの権限 |
| o | その他のユーザーの権限 |
| a | すべての権限 |

**・権限を追加削除するか**

| 記号 | 意味 |
|:--|:--|
| + | 後に記述した権限を付加する |
| - | 後に記述した権限を削除する |
| = | 後に記述した権限にする |

**・どんな権限に変更するか**

| 記号 | 意味 |
|:--|:--|
| r | 読み込み権限 |
| w | 書き込み権限 |
| x | 実行権限 |

##ファイルの権限の変更してみよう

**・その他のユーザーの読み込み権限を削除する**

```command:command
$chmod o-r (ファイル名) 

```

**・すべてのユーザーに実行権限を与える**

```command:command
$chmod a+x (ファイル名) 

```

##おわりに
次回はchmodで数字を用いてファイルやフォルダのパーミッションやアクセス権限を設定してみたいとおもいます。
参考：
[chmod コマンド](https://qiita.com/ntkgcj/items/6450e25c5564ccaa1b95)
 [パーミッションなどを設定する！chmodコマンドの詳細まとめ](https://eng-entrance.com/linux-command-chmod)
sassを使ったレスポンシブ対応ブレークポイントの記述について

現在、30DAYSトライアル2ndのDAY9をやっています。
https://tokyofreelance.jp/30daystrial-coding-5th/#outline__3

レスポンシブ対応について、はにわまんさんが書かれた記事
https://haniwaman.com/breakpoint/
について、

```
// レイアウト幅　式①
$layout-width-inner: 1180px;

// ブレークポイント 式②
$breakpoints: (
  "sp": "screen and (max-width: 767px)",
  "tab": "screen and (max-width: #{$layout-width-inner - 1px})",
  "pc": "screen and (min-width: #{$layout-width-inner})",
);
```
```
// メディアクエリー　式③
@mixin mq($breakpoint: sp) {
  @media #{map-get($breakpoints, $breakpoint)} {
    @content;
  }
}
```
のブレークポイントの書き方がとても便利ですが、私の理解力がなさすぎて何が起っているかよく分かりませんでした。
展開してみたら何となく分かったので、もし参考になればご覧ください。

まず、式①を式②に代入（？）すると、

```
$breakpoints: (
  "sp": "screen and (max-width: 767px)",
  "tab": "screen and (max-width: 1179px)",
  "pc": "screen and (min-width: 1180px)",
);
```
次に、式②を式③に代入(?)すると、

```
//mixinの引数は$breakpoint、引数の初期値はsp
@mixin mq($breakpoint: sp) {

    @media #{map-get(
        //map-get関数の$map部
        (
        "sp": "screen and (max-width: 767px)",
        "tab": "screen and (max-width: 1179px)",
        "pc": "screen and (min-width: 1180px)",
        ),
        
        //map-get関数の$key部
        $breakpoint
        
        )}{
        
    //呼び出し側の内容をもらう
    @content;
        
    }
}
```
ここで、

```
.container {
  @include mq('sp') {
    width: 100%;
    margin-right: 0;
  }
}
```
のコードを記述しcssへコンパイルすると、@mixinが呼び出され、引数breakpointに'sp'が渡されて、
$map部から"screen and (max-width: 767px)"が取り出される。
また"width: 100%; margin-right: 0;"が@contentに渡される。
cssへのコンパイル後はこうなる。

```
@media screen and (max-width: 767px) {
  .container {
    width: 100%;
    margin-right: 0;
  }
}
```
既存のVue.jsプロジェクトをPWAに対応させる

## 概要

すでに作成されているVue.jsのアプリケーションをPWA対応した際の覚書です。

## 目的

ホーム画面にPWAとして追加できるようにする。

- push通知とかは特に考えていない

## 環境

|key|value|
|---|---|
|macOS|Mojave 10.14.6|
|vue|2.5.18|
|vue-cli|3.0.5|

## パッケージの追加

```
vue add @vue/pwa
```

これでpwa対応に必要な設定やファイルをよしなに作ってくれる。

## manifest.jsonの追加/修正

なぜかmanifest.jsonを追加してくれなかったの下記サイトで作成。`public`以下に配置。
アイコンも作成されるので、`public/images/icons/*.png`となるように配置。

[App Manifest Generator](https://app-manifest.firebaseapp.com/)

生成されたやつをちょっと修正。

```diff:manifest.json
- "display": "browser",
+ "display": "standalone",
- "start_url": "/",
+ "start_url": "./index.html",
```

## index.htmlの修正(iOS safari対応)

iOS版safariではこの記述を入れないとmanifest.jsonを読み込んでくれないらしい。

```diff:index.html
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+   <link rel="manifest" href="manifest.json" />
+   <script async src="https://cdn.jsdelivr.net/npm/pwacompat@2.0.10/pwacompat.min.js"
+   integrity="sha384-I1iiXcTSM6j2xczpDckV+qhhbqiip6FyD6R5CpuqNaWXvyDUvXN5ZhIiyLQ7uuTh"
+   crossorigin="anonymous"></script>
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
```

## 結果

build&deploy(自分の場合はfirebase)して、ホーム画面に追加するとPWAとして動作するを確認できました。

## 成果物

### アプリ

[umaaji-calculator](https://umaaji-calculator.firebaseapp.com/)

### PR

[Feature/#36 PWA対応](https://github.com/tocomi/umaaji-calculator/pull/37/files)

## 参考

- [Vue.js で作った Web アプリを PWA 化してみました - michimani.net](https://michimani.net/post/programming-build-pwa-with-vuejs/)
- [【Vue.js】Vue CLI 3のプロジェクトをPWA化する \| kawadeblog](https://kawadev.net/vue-pwa/#tok-3-1)
[RubyonRails]rake db:migrate とrake db:schema:loadの使い分け

# rake db:migrate と rake db:schema:loadはどうやって使い分ける？

##コマンドのフロー
###rake db:migrate
①db:migrateタスクの実行と自動的にdb:schema:dumpタスクの実行により、schema.rbが作成される。
③作成されたschema.rbをもとにDBへクエリが送られる。

###rake db:schema:load
①schema.rbをもとにDBへクエリが送られる。
rake db:schema:loadはデータが入っていない新規作成されたテーブル構造などをロードする際に使う。

##具体的な使い分け

####ローカル→rake db:migrate
####CIツール→rake db:schema:load　
と使い分けするのが一般らしく、こうすることで異なるバージョンにならないように防止できる


##参考
(https://euglena1215.hatenablog.jp/entry/2016/08/17/184301)
(https://qiita.com/hirohero/items/2f29334878b0cb525bda)
【MariaDB】Mysql2::Error (Access denied)でハマった話

## 開発環境
* Ubuntu 18.04 
* Rails 5.2.4
* MariaDB 10.1

## 事象
Railsのサーバを立ち上げた際にエラーが出る
```
Mysql2::Error (Access denied for user 'root@localhost');
```

`sudo mysql -u root -p`での接続は可能な状態

## 原因
ユーザ認証にunix_socketというプラグインが設定されていると、
DBにrootで接続する際にOSのroot権限が必要になるらしい

```
MariaDB [(none)]> SELECT user,host,plugin from mysql.user;
+------+-----------+-------------+
| user | host      | plugin      |
+------+-----------+-------------+
| root | localhost | unix_socket |　← ここを変える必要がある
+------+-----------+-------------+
```

## 対処方法
### その1
pluginの値をmysql_native_passwordに変更する
（公式が推奨しているのはおそらくこちら）

```
ALTER USER root @ localhost IDENTIFIED VIA mysql_native_password;
SET PASSWORD = PASSWORD（ 'foo'）;
```
### その2
pluginの値を削除する

```
UPDATE user SET plugin="";

# パスワードが削除されていた場合は以下を実行する
UPDATE user SET password=PASSWORD("your_password") WHERE user="root";

FLUSH PRIVILEGES;
```

## 参考情報
* 
https://mariadb.com/kb/en/authentication-plugin-unix-socket/
* https://superuser.com/questions/949496/cant-reset-mysql-mariadb-root-password
【Laravel】php artisan migrateを実行して「SQLSTATE[HY000] [2002] Connection refused」エラーが出た時の解決方法

# 背景
以下のコマンドを実行して、マイグレーションファイルを作成。

```
% php artisan make:migration create_posts_table
```

テーブルに新規カラムを追加した後、以下のコマンドを実行。

```
% php artisan migrate
```

ここで、以下のエラーが表示された。

```
% php artisan migrate

   Illuminate\Database\QueryException 

  SQLSTATE[HY000] [2002] Connection refused (SQL: select * from information_schema.tables where table_schema = crud-sample and table_name = migrations and table_type = 'BASE TABLE')

  at vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673| 

      +37 vendor frames 
  38  artisan:37
      Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput))
```

# 原因
**データベースに接続できていなかったことが原因だった。**
接続するデータベースを定義しているファイル`.env`を開いて、自分の環境にあったデータベース設定をする必要がある。


# 解決方法
以下の設定は各自の環境で異なります。

```[.env]
例）
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=8889       <--変更
DB_DATABASE=sample <--変更
DB_USERNAME=root
DB_PASSWORD=root   <--変更
```

`.env`を変更した後に、`php artisan migrate`を実行。

```
% php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.04 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.01 seconds)
Migrating: 2020_03_07_034218_create_posts_table
Migrated:  2020_03_07_034218_create_posts_table (0.02 seconds)
```

以上。
Webの基礎知識

IT未経験のスクール生が学んだことをアウトプットします:open_mouth:

Webサイトを閲覧する際の基礎知識です。

#Webの仕組み
Webとはインターネット上で用いられている、文書の公開、閲覧システム。
文字や画像、動画など一体化した文書を公開、配布、入手、閲覧ができます。
Webとは「クモの巣」という意味であり、大規模な文書間の繋がりを図示すると、クモの巣ように見えることから呼ばれています。

##なぜWebアプリケーションを利用できるのか
普段閲覧しているWebサイトはクライアントとサーバの間で通信が走っていることによって閲覧できます。

####クライアント
クライアント(Client)とは「何かを提供される人」という意味です。
ここではWebサイトを閲覧するスマホやPCにあるWebブラウザのことを言います。

####サーバ
サーバ(Server)とは「何かを提供する人」という意味です。
Webサーバなどを表すソフトウェア、ソフトウェアを格納するハードウェアがあります。

###クライアントとサーバのやりとり
1.クライアント側(PC,スマホ)がサーバ側にリクエストを送る
2.サーバ側がリクエストを解析、処理してリクエストの答えを作る
3.サーバ側がクライアント側にレスポンスを返す

*例*
Googleにアクセスする場合、URLを打ち込みます。
URLとはネット上の住所のようなものです。URLを入力してEnterキーを押すと通信が走ります(リクエストを送る)。
通信元、即ち自身のパソコンと、Googleが所有するWeb上で情報を公開するために設計されたコンピュータが相互に通信されます(リクエストの答えを作る)。
そのコンピューターから自身のパソコンへ情報が送信されます(レスポンスを返す)。

##アプリケーションを公開
アプリケーションをWeb上で利用してもらうにはWeb上に公開しなければなりません。
そのためにはアプリケーションを***デプロイ***する必要があります。

####デプロイ
デプロイ（deploy）とは配置する、展開するという意味です。
ここではアプリケーションをサーバ上に配置し、Web上に展開するといった意味です。
即ち「アプリケーションのプログラムをサーバ内に置く」ということです。

デプロイの手順
1.アプリケーションを開発
2.アプリケーションをデプロイするためのサーバを用意
3.アプリケーションをデプロイ

サーバを用意するには***AWS***を使用することができます

##AWS
AWSとはAmazon Web Servisesの略で、Amazonが提供するクラウドコンピューティングサービスの総称です。
代表的なサービスにAmazon EC2(仮想サーバ)、Amazon S3(クラウドストレージ)、Amazon RDS(データベース)などがあります。EC2は自社にサーバ本体を置く必要がないメリットがあります。

AWSについてはもっと勉強してからアウトプットしていきたいと思います！閲覧ありがとうございました！
コロナウイルスで大変な状況になっていますが頑張っていきましょう:mask:
コントローラーの@の使い方

【例】モデル名がpostのとき

```app/controllers/posts_controller.rb
class TweetsController < ApplicationController

 def index
    @posts = Post.includes(:user)
  end

  def new
    @post = Post.new
  end

  def create
    Post.create(post_params)
  end
〜以下略〜
end
```
があるとします。
モデルクラス名はPost先頭大文字・単数系です。
@postで@はほかのファイルにも使えます。postはposts_controller.rb内でしか処理できません。
【例】

```
 <%= simple_format(@post.text) %>
    <span class="XXXX">
    <a href="/users/<%= @post.user.id %>">
      <span>投稿者</span><%= @post.user.nickname %>
      </a>
    </span>
  </div>
  <div class="YYYY">
    <% if current_user %>
      <%= form_with(to_model: [@post, @comment], local: true) do |form| %>
        <%= form.text_area :text, placeholder: "コメント", rows: "2" %>
        <%= form.submit "送信" %>
      <% end %>
    <% else %>
      <strong><p>*** コメント投稿には新規登録またはログインが必要 ***</p></strong>
    <% end %>
```
上記のように@であれば使うことができます。
gemspecのadd_development_dependencyではなく、Gemfileを使う？

久しぶりに、`bundle gem` で gem を作ったら、rake や rspec が、gemname.gemspec ではなく、Gemfile に記載されるようになっていたので、調べてみました。

調べた結果、Gemfile のほうが柔軟性があり、実際のユースケースでも gemspec の `add_development_dependency` だけでは対応できないことがある、そのため Bundler では Gemfile の使用を奨励するために修正した、ということのようです。

なお、この記事は、「こういう理由でこうした方が良い」というものではないです。

# 経緯

久しぶりに `bundle gem` コマンドで gem を作りました。

```sh
bundle gem gemname --test=rspec
```

いつも通り、自動生成された gemname.gemspec を TODO 部分を置き換えるために開いたら、`add_development_dependency` がありませんでした。

```sh
$ grep -e "dependency" gemname.gemspec 
$ 
```

なのに、`bundle install` したら、rake 等がインストールされます。

```sh
$ bundle install
Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies...
Fetching rake 12.3.3
Installing rake 12.3.3
...
```

Gemfile を見てみると、こちらに定義が移っていました。

```sh
$ cat Gemfile
source "https://rubygems.org"

# Specify your gem's dependencies in gemname.gemspec
gemspec

gem "rake", "~> 12.0"
gem "rspec", "~> 3.0"
```

個人ブログ等では、Gemfile ではなく gemspec に書くべきだ、とよく主張されているのに、なぜでしょうか？

# 調査結果

この修正が [Bundler](https://bundler.io/) に入ったのは、[この PR](https://github.com/rubygems/bundler/pull/7222) のようです。開発環境の構築は非常に複雑で、`add_development_dependency` の使用は奨励されない、とのことです。

これを契機に、Bundler と Rails が、開発環境の依存関係の定義に `add_development_dependency` を使用しないようになったようです（[Bundler の PR](https://github.com/rubygems/bundler/pull/7237)、[Rails の PR](https://github.com/rails/rails/pull/38203)）。

開発環境の依存関係の定義が `add_development_dependency` から無くなって変化があるのは、簡単に調べた限り、次の2点のようでした。

- RubyGems の gem のページで、Development依存性 の一覧が表示されなくなる
- `gem install --dev gemname` コマンドでの、開発環境の依存関係のインストールができなくなる

# 個人的感想

RubyGems の gem のページから、開発環境の依存関係の一覧が表示されなくなるのは悲しいです。

一方、`gem install --dev gemname` コマンドで開発環境の依存関係がインストールできなくなるのは、問題にならないのではないかと思います。
なぜなら、Bundler を使わない `gem install --dev gemname` コマンドでの gem のインストールは、依存関係の gem をバージョン指定している場合、マシン1台、もしくは RVM や rbenv 環境ならユーザー1つを、それ専用に使う形になってしまう可能性があるからです。

各 PR も、それほど議論にならずに Merge されているので、`add_development_dependency` を使わないというのは、当たり前になりつつあるのでしょうか？

この記事を読まれた方は、ぜひコメントください。