OmniAICreator/Qiita-1.07M huggingface dataset:
【Ruby】ｉｆ文の条件分岐

# ｉｆ文説明

```ruby:公式.rb
if 条件
　ifで設定した条件が成立したときの処理方法
end
```

【問】
もしもおさいふに５００円以上入っていたら
"マンガを買って帰ろう♪"
とｉｆ文で表示させるには？
おさいふは 変数wallet とし財布の中身は７００円とする。




【答】

```ruby:if文.rb
wallet = 700
if wallet >= 500
  puts "マンガを買って帰ろう♪"
end
```

ターミナルでは
↓↓↓

```ターミナル.
マンガを買って帰ろう♪
```


よし！ちゃんと表示されてるな。
じゃあもしさいふに３００円しかなかったらどうなるんだろう？？？:thinking::thinking::thinking:

```ruby:if文.rb
wallet = 300
if wallet >= 500
  puts "マンガを買って帰ろう♪"
end
```

```ターミナル.
〈ユーザー名〉MacBook-Air:desktop 〈ユーザー名〉$ 
```



うん、そりゃそうだ。
だってお金足りないときの条件なにもしてないもん:sweat_smile:
じゃあお金が足りないときの処理を付け加えよう！


```ruby:if文.rb
wallet = 300
if wallet >= 500
  puts "マンガを買って帰ろう♪"
else
  puts "おうちに帰ろう･･･"
end
```

```ターミナル.
おうちに帰ろう･･･
```

else + 条件が成立しないときの処理方法　をつけくわえることで
条件が成立しないときの処理を加えることもできる

```ruby:公式.rb
if 条件
　ifで設定した条件が成立したときの処理方法
else
  条件がなにも成立しないときの処理方法
end
```

いやいや待ってよ！
そのままおうちに帰るのも寂しくない？
私が設定しといてなんやけど
ターミナルにめっちゃ寂しそうに表示されたわ:scream:
じゃあ３００円以上あったら紅茶を買って帰ろう！

```ruby:if文.rb
wallet = 300
if wallet >= 500
  puts "マンガを買って帰ろう♪"
elsif wallet >= 300
  puts "紅茶を買って帰ろう！"
else
  puts "おうちに帰ろう･･･"
end
```
```ターミナル.
紅茶を買って帰ろう！
```

よし！表示された！:thumbsup:

elsifを使うことによってさらなる分岐ができ
elsifを増やせば増やすほど条件が分岐できる。
でもそれだとちょっと見づらいので case文を使用したほうがいいかもしれない。
使用する人によるかもしれないし、コード作成する状況によるかもやけど。

●現時点での私の判断材料
　if文使用　→　AかＢの二択で決まる条件分岐
　　　　　　（下記のおまけにも書きますが二択の場合は１行でコード書けます）

　case文使用　→　AかBかCなどの三択以上で決まる条件分岐

```公式.rb
if 条件
　ifで設定した条件が成立したときの処理方法
elsif　条件
  最初のｉｆの条件が成立せずｅｌｓｉｆで条件が成立したときの処理方法
else
  条件がなにも成立しないときの処理方法
end
```

##おまけ 後置if(if修飾子)
処理が１行でおさまるときは後置ifを使うとコードを１行で書くことができる。
一番最初に問いを例にすると・・・
これが・・・↓↓↓

```ruby:if文.rb
wallet = 700
if wallet >= 500
  puts "マンガを買って帰ろう♪"
end
```

こうなる！！！:laughing:

```ruby:if文.rb
wallet = 700
puts "マンガを買って帰ろう♪" if wallet >= 500
```

かんたん！:laughing:


##おまけ unless文
unless文を使うとｉｆ文の反対バージョンになる。

```ruby:if文.rb
wallet = 300
if wallet >= 500
  puts "マンガを買って帰ろう♪"
else
  puts "おうちに帰ろう･･･"
end
```
ｉｆ文だと　おうちに帰ろう・・・　が表示されるが
unless文に変更すると・・・

```ruby:unless文.rb
wallet = 300
unless wallet >= 500
  puts "マンガを買って帰ろう♪"
else
  puts "おうちに帰ろう･･･"
end
```

```ターミナル.
マンガを買って帰ろう♪
```

と表示されてしまう！！

この場合は unless を使用すると
お金が足りないのにマンガを買おうとしている私がいるので
if文を使用すべきなのですが
処理によっては unless の場合がいいときもあります。
要はそのときそのときの使い分けですな:smiley:

ちなみに unless も同じくおまけ１で記述したように１行で書けますよ:grinning:
ifの部分をunlessにするだけです。
Android Studioでのデバッグについて

# 環境
Android Studio 3.5

# 参考文献
[アプリのデバッグ | Android developers](https://developer.android.com/studio/debug/?hl=ja)
[IntelliJ IDEAのデバッガのstep over, step into, force step into, step out, drop frame, run to cursor 機能の解説](https://qiita.com/takc923/items/35979a3ae68c9ad890df)

# デバッグの手順

1. Breakpoint(ブレークポイント)を1箇所以上作成．
2. デバッグモードで実行．1つ目のブレークポイントのところで実行が止まる(ブレークポイントの行は実行されない)．
3. 少しずつ実行していく

##3について
実行方法

- Step Over(ステップオーバー)
- Step Into(ステップイン)
- Force Step Into
- Step Out(ステップアウト)
- Run to Cursor

###Step Over(ステップオーバー)
次のコード行に進む(メソッドには入らない)．

###Step Into(ステップイン)
呼び出し先のメソッド内の最初の行に進む．

###Force Step Into
step intoではスキップしてしまう箇所を実行できる．
最初の頃は気にせずstep intoを使えば良いと思う．「このメソッドを1行ずつ実行したい！」と思ったらこの機能を思い出そう．

###Step Out(ステップアウト)
現在のメソッドを抜けて次の行に進む(現在のメソッドは全て実行される)．

###Run to Cursor
カーソルが選択している行まで実行(選択している行は実行しない)．

###確認用コード(Kotlin)

```kotlin
class MainActivity : AppCompatActivity() {

    private var count = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        count++
        method1()
        count++
        method2()
        count++
        println(count) // soutで出せます
    }

    private fun method1() {
        count++
        Log.d("method1", count.toString())
        method11()
    }

    private fun method11() {
        count++
        Log.v("method11", count.toString())
    }

    private fun method2() {
        for (i in 0..99) {
            count++
        }
        Log.i("method2", count.toString())
    }
}
```

このコードでデバッグ機能色々試してみてください．
ブレークポイントの付け忘れにご注意を．
学生がG検定を受けた感想

#なぜ受けたか
普段研究で機械学習を弄っていますが、自分の実力を客観的に評価したいなと思い受けてみました。

#勉強期間
１週間

#教材
G検定の公式本
study-AIの模試
ゼロから作るDeep Learning
ゼロから作るDeep Learning②

ゼロから作るシリーズはもうすでに読んでいたので、復習でざっと読んだくらいです。基本的には、公式本とStudy-AIさんの模試をひたすら解いてました。

#難易度
問題数が多いので、時間はギリギリでした。あと、法律関係の問題が想像以上に多くかなり焦りました。(結構長い文章問題なので、検索することが難しかったです。。。) 試験終了後はあまりの手応えのなさに少々ブルーになりました。笑

#結果
合格してました!　でも、合格率70%だったので、ほとんどみんな受かってますね。笑

#感想
学生は5,000円と通常の半額で受けられるので、この分野を勉強している人はサクッと取ってしまうのはありかも。そして、もし受けるとしたら、AI関係の法律や時事ネタの勉強を重点的にやりましょう。
また、合格すると、JDLAのコミュニティに入れるらしいので、情報収集などで役にたつかもしれません。(これが一番嬉しい特典かも)
flutter upgradeで最新バージョンへ更新されない時に確認すること

# 変わらぬ、バージョン
Flutterアプリ開発中、バージョン違いによる不具合の可能性を検証するため、最新バージョンへのアップデートを試みた。

が、`flutter upgrade`で想定していたバージョンへ更新されない現象に遭遇。その顛末をメモしておく。

## flutter upgradeで更新をかける


`flutter --version` でバージョンを確認。現在のバージョンは`1.9.1+hotfix.6`となっている。

```
Flutter 1.9.1+hotfix.6 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 68587a0916 (9 weeks ago) • 2019-09-13 19:46:58 -0700
Engine • revision b863200c37
Tools • Dart 2.5.0
```

`flutter version` でバージョンリストを表示

```
v1.12.2
v1.12.1
v1.12.0
v1.11.0
v1.10.16
v1.10.15
v1.9.1+hotfix.6
v1.9.1+hotfix.5
...
```

`v1.12.2`が出ていた。とりあえず最新バージョンへ更新してみよう。

`flutter upgrade` で更新をかけて、`flutter --version` で再度バージョンを確認。

```
Flutter 1.9.1+hotfix.6 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 68587a0916 (9 weeks ago) • 2019-09-13 19:46:58 -0700
Engine • revision b863200c37
Tools • Dart 2.5.0
```

`1.9.1+hotfix.6`のままだ…

:tired_face:


## チャンネル毎にリリースバージョンを管理

バージョン情報をよく見てみると、**channel stable**と書かれていた。
 > Flutter 1.9.1+hotfix.6 • **channel stable**

アップデート関連のドキュメントによると、Flutterにはリリースチャンネルという概念があるようだ。
[Upgrading Flutter | Switching Flutter channels - Flutter](https://flutter.dev/docs/development/tools/sdk/upgrading#switching-flutter-channels)


さっそく`flutter channel`コマンドでチャンネルを確認。

```
Flutter channels:
  beta
  dev
  master
* stable
```
現状の`stable`のほか、安定性の高い順に`master`、`dev`、`beta`というチャンネルが存在している。

どうやらこれらのチャンネル毎に、リリースバージョンを管理している模様。
[Flutter SDK releases  - Flutter](https://flutter.dev/docs/development/tools/sdk/releases?tab=macos#macos)

本記事執筆時点では、`stable`の最新バージョンが`v1.9.1+hotfix.6`、`dev`の最新バージョンが`v1.12.2`といった具合だ。

`flutter version`コマンドのバージョン一覧では、チャンネルに関する明記がなかったこともあり、`v1.12.2`が降ってくるものだと勘違いしていた。

### stableは安定版

`stable`は安定版ということで、最新のリリースバージョンが必要でない限り、`stable`チャンネルの使用が推奨されている。

> **stable**
> When we believe we have a particularly good build, we promote it to the stable channel. We intend to do this more or less every quarter, but this may vary. We recommend that you use this channel for all production app releases. We may ship hotfixes to the stable channel for high-priority bugs, although our intent is to do this rarely.
> 
> [Flutter build release channels · flutter/flutter Wiki](https://github.com/flutter/flutter/wiki/Flutter-build-release-channels#stable)

Flutetrインストール時、特にチャンネルをいじった覚えは無いので、デフォルトで`stable`が選択されていたものと思われる。


## チャンネルを変更してupgrade
試しに`dev`チャンネルに切り替えて、`v1.12.2`が使えるか見てみた。

`flutter channel`コマンドに対象チャンネルを指定して切り替え。

```
 $ flutter channel dev
 $ flutter channel

 Flutter channels:
  beta
* dev
  master
  stable
 ```

チャンネル変更後に`flutter upgrade`を実行（めっちゃ時間かかる）

```
$ flutter upgrade
```

`flutter --version` でバージョンを確認。

```
Flutter 1.12.2 • channel dev • https://github.com/flutter/flutter.git
Framework • revision 6de6267942 (4 days ago) • 2019-11-13 14:37:20 -0800
Engine • revision b358dc58fb
Tools • Dart 2.7.0
```

ねんがんの`v1.12.2`を 手に入れたぞ！

`flutter upgrade`で想定していたバージョンへ更新されない場合は、チャンネルを確認するようにしましょう。

ちなみに`flutter version`コマンドで、特定バージョンを指定した切り替えも可能。

```
$ flutter version v1.9.1+hotfix.3
```

なお、今回検証したかった不具合は変わらず、別問題の可能性もある模様。

:innocent:
Google Colaboratoryで自分の書いたコードがpythonのコーディング規約「pep8」へ対応しているか自動でチェックする方法

#概要
Google Colaboratoryでpep8に対応しているかを自動でチェックする方法をまとめる。
#方法
まずはこれを実行

```
!pip install pycodestyle flake8 pycodestyle_magic
%load_ext pycodestyle_magic
```

チェックをしたいセルの先頭にこれを追加し実行

```Python
%%flake8
```

#実行例
例

```python
%%flake8
result=DataFrame.from_dict(correlations,orient='index')
result.columns=['PCC','p-value']
print(result.sort_values('PCC'))
```
結果

```
2:7: E225 missing whitespace around operator
2:40: E231 missing whitespace after ','
3:15: E225 missing whitespace around operator
3:22: E231 missing whitespace after ','
```

左の番号はpep8に対応していない部分の行と何文字目かを表している。

#お願い
%%flake8を全てのセルにコピペするのに時間がかかる。。。一括ですべてのセルに挿入する方法あれば教えてください。
ターミナル とは

# ターミナルとは

操作(入出力)する端末。
またはその環境(？)

Mac/Linux → ターミナル
Windows → コマンドプロンプト
などなどもこれにあたる


# 入社してまず言われた事

「ターミナルは好きなの使ってね〜」

？？？
ターミナル？？？

とりあえずggった。
<img width="375" alt="15B51CDC-259B-4319-8C4C-AD9420C15F3A.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533402/6e530702-040c-0ac5-233c-9ba02fe239dc.png">
<img width="375" alt="109B452C-3F86-44BE-82FC-11BD3B06BB1D.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533402/27333ef6-7909-053b-1e33-cd38911a7e7b.png">

ですよね。知ってた。


ちなみに、広義に渡る文言の場合、とりあえず「システム」とか「it」とか入れておけばそれなりの結果が出ます。


# で、結局なんなの

検索していろんなサイトを読み倒しましたが、「これがこう」ってものではなく、操作とかするやつを総称したのがターミナルらしい。

今までなんとなく使ってましたが、考えてみたら似たのを知ってた。

DOS
※詳しくはwikiをどうぞ→https://ja.m.wikipedia.org/wiki/DOS_(OS)

これだ。
若者が嫌がる言い方かもしれませんが、大昔のPC、今ほど簡単でも分かりやすくもなかった。
全部コマンド操作だったんですね〜。
それが見やすく分かりやすく操作できるようになったものが、今主流のOS達。

自分的にはそれで分かりますが、逆行して考えるなら、PCであればマウスとかタッチパネルでやる操作をコマンドだけでやる、って言った方がイメージしやすいのかも。

ちなみに自分が使っているのは、かの有名なvsCODEさんです。
https://code.visualstudio.com/
簡単に日本語化できるし、統合開発環境でなんでもできるので非常に重宝しています。
Git操作まとめ 〜編集差分の確認(git diff)

この記事では、Ubuntu18.04LTSにインストールしたGit(version 2.17.1)を使用しています。

Gitには以下の3つの階層があります。ファイルにこれらの階層を行き来させながら、作業を進めていくことになります。
くわしくは[こちら](https://qiita.com/tsweblabo/items/2a3cf554f98fd2576a21)をご覧ください。

- 作業ディレクトリ(ワークツーリー)
- ステージングエリア(インデックス)
- リポジトリ(ローカルリポジトリ)

いま作業した状態が、「どの階層とどのような違いがあるのか」を確認したい時にgit diffを使います。

## 作業ディレクトリとステージングエリアとの差分

作業をしていてステージング(git add)する前に変更箇所を確認する場合は、以下のコマンドを使います。

```shell
git diff
```

---

## ステージングエリアと最新のコミットとの差分

ステージング(git add)した後でステージングエリアと最新のコミットとの変更箇所を確認する場合は、以下のコマンドを使います。

```shell
git diff --cached
```

---

## 「最新のコミット」と「最新のコミットのひとつ前」との差分

コミット(git commit)したあとで、コミットした変更箇所を表示したい場合は以下のコマンドを使います。

```shell
git diff HEAD^
```

---

### 本記事目次ページ
[Git操作まとめ](https://qiita.com/tsweblabo/items/6aec9d022c08954f5024)

### 参考サイト
- [Qiita:忘れやすい人のための git diff チートシート](https://qiita.com/shibukk/items/8c9362a5bd399b9c56be)
Raspberry Pi でJuliusを実行【備忘録】

# インストール
基本的に以下のコマンドでインストールできます。

```
wget https://github.com/julius-speech/julius/archive/v4.5.tar.gz
tar xvzf v4.5.tar.gz
cd julius-4.5
./configure --with-mictype=alsa
make
make install
```

# トラブルシューティング

```
sudo modprobe snd-pcm-oss
modprobe: FATAL: Module snd-pcm-oss not found in directory /lib/modules/4.14.34-v7+
```
これが出てきたら、

```
sudo apt-get install osspd-alsa
sudo aptitude install libasound2-dev
./configure --with-mictype=alsa
make
make install
```

です。これは参考にも書いてあります。あと、**juliusを実行する際は「sudo」はつけてはだめっぽい。**

#参考

― raspi最新カーネルでjuliusを動かす[https://qiita.com/mooriii/items/e6bd0c8c07ef4c94fa0d](https://qiita.com/mooriii/items/e6bd0c8c07ef4c94fa0d)
「デ」の謎。濁点/半濁点文字のカタカナが同じようで違う。制御文字？エンコード？ 二倍のバイト数があるぞ。 MAC-UTF8とは。#Mac  #VsCode

# デ

1. デ
2. デ

同じように見えて違うっぽい。なにこれ。

# エディタでカタカナの「デ」が違う文字として認識されている

VsCode の 同じ文字にフォーカスするモードで、選ばれる「デ」と得ればれない「デ」がある

文字検索でも同じく

この記事からコピペして同じ結果になるかどうかは不明。

![image](https://user-images.githubusercontent.com/13635059/69014742-e818ac00-09d0-11ea-88a4-8dcfc4c6f9fd.png)

![image](https://user-images.githubusercontent.com/13635059/69014746-f1097d80-09d0-11ea-945d-f1f17bd8fdf2.png)

# バイト数の違うカタカナ

Rubyで見るとサイズが違う。

```
[128] pry(main)> "デ".size
=> 1
[129] pry(main)> "デ".size
=> 2
```
![image](https://user-images.githubusercontent.com/13635059/69014729-c28ba280-09d0-11ea-844a-2f5c453c1707.png)



# Google で「デ」を検索する

https://www.google.com/search?q=%E3%83%86%E3%82%99&oq=%E3%83%86%E3%82%99&aqs=chrome..69i57j69i59l3.709j0j7&sourceid=chrome&ie=UTF-8

https://www.google.com/search?q=%E3%83%87&oq=%E3%83%87&aqs=chrome..69i57j69i59l2j69i61l3.220j0j7&sourceid=chrome&ie=UTF-8

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2734








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【AWS EC2】ログインしようとすると@@WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!@@

#あなたのターミナルにはこのようなエラー が出ますか？
AWSのEC2にログインしようとするとこのようなエラーが出ました。

```console
$ ssh -i *****.pem ec2-user@XX.XXX.XXX.XXX
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:AdlcTXuxFvQD34T43YEl3bHo4xR3e9qgEVLRuPZSi58.
Please contact your system administrator.
Add correct host key in /Users/XXX/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/XXX/.ssh/known_hosts:4
ECDSA host key for XX.XXX.XXX.XXX has changed and you have requested strict checking.
Host key verification failed.
```
Google先生に翻訳してもらうとこんな感じ

>@警告：リモートホストの識別が変更されました！ @
誰かが何かひどいことをしている可能性があります！
誰かがあなたを盗聴している可能性があります（中間者攻撃）！
また、ホストキーが変更された可能性もあります。
リモートホストによって送信されたECDSAキーのフィンガープリントは
SHA256：AdlcTXuxFvQD34T43YEl3bHo4xR3e9qgEVLRuPZSi58。
システム管理者に連絡してください。
/Users/XXX/.ssh/known_hostsに正しいホストキーを追加して、このメッセージを削除します。
/Users/XXX/.ssh/known_hosts:4の問題のあるECDSAキー
XX.XXX.XXX.XXのECDSAホストキーが変更され、厳密なチェックを要求しました。
ホストキーの検証に失敗しました。

free wifiスポットだから、ログインとか危なくね？
みたいなことが言われてますね。

この後、「それでも接続しますか？」と聞かれるのでyesするとログインできます。
でも、危ないからできれば控えた方が良さそうですよね。

#自宅でもこのエラー出るんだけどジーサス
自宅でも上記のようなエラーが出てしまった。
もしかしたらすでに「セキュリティに難あり」的なことを言いたいのかと思い、
なんとなく感じたのが自分の下記の行動。

**インスタンスをなんども作り直し　同じElastic IPに再度紐付け**

同じIPの向き先が短期間でなんども変わるから「え、このサーバやばいと思うんですけど」と感じたのかと思い、
既存のElastic IPを解放し、再取得して関連付けし直しました。
そしたら、警告出ますがなんとかログインできました。

でも絶対このIPじゃないとだめ！って時はどうやって対処したらいいかわかんないなー。
参考記事のコマンド一通り入力したけど、うんともすんともだったので、
Elastic IPを再取得して関連付けし直したって話でした。

#参考記事
SSH接続エラー回避方法：.ssh/known_hostsから特定のホストを削除する/削除しないで対処する3つの方法
https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938
乃木坂46ブログの画像をスクレイピングで取得する

#はじめに
乃木坂46ブログの画像保存をPythonによるスクレイピングで行いました。
秋元真夏の最初の1ページをスクレイピングしました。

##コード

```python:scraping.py
import requests
import urllib.request
import os
from bs4 import BeautifulSoup


def scraping():
    # メンバーURL
    member_name = "manatsu.akimoto"
    url = "http://blog.nogizaka46.com/" + member_name + "/"

    # フォルダ作成
    if not os.path.isdir(member_name):  # ”member_name”のフォルダがない場合
        print("フォルダ作成")
        os.mkdir(member_name)

    # 保存枚数カウント用
    cnt = 0

    # BeautifulSoupオブジェクト生成
    headers = {"User-Agent": "Mozilla/5.0"}
    soup = BeautifulSoup(requests.get(
        url, headers=headers).content, 'html.parser')

    # 画像が置かれているhtmlを見つける
    for entry in soup.find_all("div", class_="entrybody"):  # 全てのentrybodyを取得
        for img in entry.find_all("img"):  # 全てのimgを取得
            cnt += 1
            urllib.request.urlretrieve(
                img.attrs["src"], "./" + member_name + "/" + member_name + "-" + str(cnt) + ".jpeg")
    print("画像を" + str(cnt) + "枚保存しました。")


if __name__ == '__main__':
    scraping()

```
***
####メンバーURL
![スクリーンショット (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533114/a8dd4795-939e-a413-e54a-058c459a87ff.png)
![スクリーンショット (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533114/f4f5a409-0be1-70f6-518f-689980eb80f2.png)
メンバーの名前がURLとして使用されているので、取得したいメンバーの名前をmember_nameに入れています。

```python
member_name = "manatsu.akimoto"
url = "http://blog.nogizaka46.com/" + member_name + "/"
```
***
#### BeautifulSoupオブジェクト生成
以下のサイトに分かりやすく説明があります。
参考サイト：　https://python.civic-apps.com/beautifulsoup4-selector/

***
#### 画像が置かれているhtmlを見つける
ブログを構成しているhtmlを見ると、
![スクリーンショット (7).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533114/a0e42a14-bdbc-69fd-d663-edc851378e6e.png)
クラス名”entrybody”のdivタグに本文があり、
![スクリーンショット (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533114/7a7406d7-516c-3483-2a90-6ac641f798a1.png)
その中のimgタグに画像があるので、見つけ次第フォルダに保存します。

```python
for entry in soup.find_all("div", class_="entrybody"):# 全てのentrybodyを取得
    for img in entry.find_all("img"):# 全てのimgを取得
        cnt += 1
        urllib.request.urlretrieve(img.attrs["src"], "./" + member_name + "/" + member_name + "-" + str(cnt) + ".jpeg")
```
***
#実行結果
###実行当時のページ
![screencapture-blog-nogizaka46-manatsu-akimoto-2020-02-19-12_42_35.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533114/5e7a3430-01fa-da0a-9b36-52a4b53ff261.jpeg)

###作成されたフォルダ
![スクリーンショット (12).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533114/3819c1dd-95be-acb1-e018-f524e0190df4.png)

#コマンドライン表示
```
フォルダ作成
画像を22枚保存しました。
```
Elm初学者が感じたElmの魅力

関数型言語、フロントエンドの開発経験ほとんどなしな私が初めてElmに触れてみて感じた魅力をつらつら書いていく投稿です。

```
開発環境
- Elm0.19
- WebStorm
```
## 公式ドキュメントがめっちゃ親切
[公式のチュートリアル](https://guide.elm-lang.org/)がとても丁寧です。途中で挫折しないように、できる限り親切かつ分かりやすく丁寧に書かれています。簡単なアプリケーションを作成しながら進む構成になっているので、一通りチュートリアルをやればElmの魅力を存分に感じられるし、基本的なElmコードの特徴は網羅できるんじゃないかと思います。
公式チュートリアルは[日本語訳](https://guide.elm-lang.jp/)もあります。優しい。

## コードフォーマットに設定ファイル必要なし
公式のコードフォーマットである `elm-format` に設定ファイルは一切必要ありません。コードの整形に関わることは全てelm-formatに任せることができるところが生産的かつラクで良いなと思いました。タブかスペースか問題に悩まされないのは嬉しいですね。

## エラーメッセージが親切
エラーメッセージが親切で分かりやすいです。 `ここが怪しいよ！ここをヒントに修正してみて！` という優しさを感じる温かみのあるエラーメッセージになっております。

## 豊富なサンプルコード
Elmの作者である Evan Czaplicki氏がたくさんサンプルを[公開してくれています。](https://github.com/evancz?tab=repositories)
ビギナー向けの良いサンプルが充実してるのは有り難いです。

## Elmアーキテクチャのお陰でアプリケーションの見通しが良い
Elmアーキテクチャは `Model` `Update` `View` という３つから構成されます。どんなアプリケーションでもElmアーキテクチャを使用するため、規模が大きくなっても見通しが良くなりそうだなと感じました。

このように、Elmは初学者向けのドキュメントが充実している、アーキテクチャで悩む必要がない、豊富なサンプルコードがある等プログラミング初心者にとって学びやすい言語なのではないかなと思いました。
もっとElmの世界にこれからDiveしていきたい所存です。
かえってきたｍッピー３

この記事は[#クラッピーチャレンジ Advent Calendar 2019](https://adventar.org/calendars/4222?fbclid=IwAR1R5JARl-7czdiHFMoUmZYtWMbXm8eN3CwOjKe0BfUuxknZYhSFDaBdhRY) 22日目の記事になります。

去年のクラッピーチャレンジではmp3プレイヤーを内蔵した[ｍッピー３を作りました](https://www.youtube.com/watch?v=c67e0s85Hvc)。

あれから1年。
![IMG_8183.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/58055f2c-b44b-f195-d39b-2aa18a37e6d4.png)

[より洗練した形となってかえってきました。](https://www.youtube.com/watch?v=MDDzzKn8sAg&feature=youtu.be)
![2019-11-18_132741.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/11a55a23-b3aa-e4e9-5cee-b444b047876d.png)
IPアドレス計算方法

#　はじめに
約1年前に全くの未経験でIT業界(インフラ)に入りました。
前職は普通のOLでした。IPアドレスの理解がやっとできた気がするので自分なりにまとめてみました。
もし間違っていたらご指摘お願い致します。。

#　IPアドレス(IPv4)について
IPv4(IPアドレス)は、**32bit**の構成になっています。

表1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533707/68f9ede6-0afe-79a2-ad55-731e35afe345.png)


表1から8bitごとに「.」で区切られていて4ブロックの32ビットになっていることがわかります。
普段は、わかりやすいように10進数で表示されていることが
ほとんどですがコンピュータは1と0の2進数で処理をしています。

そして、**サブネット**を使用してネットワークを分けています。


#　IPアドレスの計算方法
例１９２．１６８．１０．１００　／２６

まずサブネットマスクCIDER表記を2進数に変更します。
サブネットマスク／２６は

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533707/a4a4e423-3504-798e-13a4-4e9e1b3efbae.png)

となります。
赤の26bitがネットワーク部になります。
残りの6bitがホスト部になります。

表2※
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533707/96ac08dd-f39e-712f-de1e-ac1dce4ef631.png)

そして表2から128＋64で
／２６　→　２５５．２５５．２５５．１９２　になります。


２５５．２５５．２５５．１９２から
IP総数は**６４個**(ホストアドレス６２個)
ネットワークアドレス　１９２．１６８．１０．６４
ブロードキャストアドレス　１９２．１６８．１０．１２７
IPアドレス使用可能範囲
１９２．１６８．１０．６５~１９２．１６８．１０．１２６
となります。

#　覚えておくこと
★　／２４は２５５．２５５．２５５．０

表３
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/533707/d961aa9d-5ef1-30d8-955d-360be099df05.png)

／２４を軸として右に数字が増えれば、÷２をして、左に数字が増えれば、×２をすると使用可能なIPアドレスを算出できる。

表3で考えた場合、／２５では１２８となっているので、
２５５．２５５．２５５．１２８となり、使用可能なIPアドレスは１２８－２(ネットワークアドレスとブロードキャストアドレス)となる。

**１・２・４・８・１６・３２・・・を頭にいれて考えること！**


#　例題
**１９２．１６８.１０．２３２/２７**
　★IPアドレス使用可能総数
　★IPアドレスの開始と終わり

①まず、表３から/２７は３２となるのでネットワークアドレスとブロードキャストアドレスを引いた数＝３０個が使用可能IPだとわかります。
②１９２．１６８.１０．２３２/２７は、３２を掛け算していくことによってアドレス範囲が求められます。
　３２×７＝２２４で１９２．１６８．１０．２３２の範囲に入っていることがわかります。
③②から１９２．１６８．１０．２２４~２５５までということがわかります。
④ブロードキャストアドレスとネットワークアドレスを除いて
　１９２．１６８．１０．２２５　～　１９２．１６８．１０．２５４までがアドレス範囲です。


#おわりに

自分のメモみたいな形になってしまいましたが…
もう少しうまくまとめられるように頑張ります。
Centos8にh2oをyumでインストール

#centos8にh2oをインストール
centos7からcentos8へは、クリーンインストールが必要なためwebサーバのh2oをyumでインストールを行おうとしたらキャッシュの同期に失敗と表示されインストールが行われなかった。

検索すると、Fedoraでは/etc/yum.repos.d/内の.repoにhttpsをhttpに変更するとあったため確認したが全てhttpになっておりh2oをインストールするためのbintray-tatsushid-h2o-rpm.repoをhttpに変えてみたが同様のエラーが表示された。

##centos8にyumでh2oをインストールする方法
bintray-tatsushid-h2o-rpm.repoを確認してみると
`baseurl=https://dl.bintray.com/tatsushid/h2o-rpm/centos/$releasever/$basearch/`
にアクセスするようになっており、`https://dl.bintray.com/tatsushid/h2o-rpm/centos/`にアクセスすると
centos6と7までしか用意されていない（2019/11/18日現在）のでインストールが行えていなかった

`baseurl=https://dl.bintray.com/tatsushid/h2o-rpm/centos/$releasever/$basearch/`の$releaseverを7にし
`baseurl=https://dl.bintray.com/tatsushid/h2o-rpm/centos/7/$basearch/`へ変更したら無事最新バージョンがインストールされた

`vim /etc/yum.repos.d/bintray-tatsushid-h2o-rpm.repo`

`#bintray-tatsushid-h2o-rpm - packages by tatsushid from Bintray`
`[bintray-tatsushid-h2o-rpm]`
`name=bintray-tatsushid-h2o-rpm`
`#If your system is CentOS`
`baseurl=https://dl.bintray.com/tatsushid/h2o-rpm/centos/7/$basearch/`
`#If your system is Fedora`
`#baseurl=https://dl.bintray.com/tatsushid/h2o-rpm/fedora/$releasever/$basearch/`
`gpgcheck=0`
`repo_gpgcheck=0`
`enabled=1`
Ambiguous use of xxxx の修正方法

# 前提
Extensionをまとめたファイルについて、Unitテストを書いていたのですが、そのうち一つのメソッドに対するテストでこれが出て対処法を見つけるまで結構時間奪われたので残します。

# 問題
ユニットテストを実行時に、`Ambiguous use of xxxx` というエラーが一部のメソッドに出てテストが失敗する。

# 修正方法
各クラスについて、右のパネル内にある `Target Membership` から Testsのチェックマークを外す！これだけ！

- [x] AppName
- [x] AppNameTest -> これ！
- [ ] AppNameUITest 

# 原因
Unitテストをする際は、下記を記載してテストクラスへアプリターゲットの参照を追加するのが一般的だと思います。

```swift
@testable import AppName
```

しかし、各クラスの `Target Membership` にチェックマークを入れてしまうと、上記とは別に個別の参照が作成されてしまうようです。
今回Extensionのテストということもあり、メソッド名が重複してしまい当該のエラーが出たということだと推測できます。

これデフォルトではチェックついてないのですが、テスト対象クラスだからチェックつけない！って勝手に勘違いしてましたことが原因でした。自戒です。
SwiftUIでTextViewを使う（日本語入力可能）

[SwiftUIでTextViewを使う](https://qiita.com/abouch/items/8fa4c8e7777fd4ed37db)を参考にした。

```swift
import SwiftUI
import PlaygroundSupport

struct MultilineField: UIViewRepresentable {
    @Binding var text: String
    
    let onEditingChanged: (Bool) -> Void
    
    init(text: Binding<String>, onEditingChanged: @escaping (Bool) -> Void = {_ in}) {
        self._text = text
        self.onEditingChanged = onEditingChanged
    }
    
    func makeCoordinator() -> MultilineFieldCoordinator {
        MultilineFieldCoordinator(target: self, onEditingChanged: onEditingChanged)
    }
    
    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView()
        textView.delegate = context.coordinator
        textView.text = text
        return textView
    }
    
    func updateUIView(_ textView: UITextView, context: Context) {
        if textView.text != text {
            textView.text = text
        }
    }
}

class MultilineFieldCoordinator : NSObject, UITextViewDelegate {
    let target: MultilineField
    let onEditingChanged: (Bool) -> Void
    
    init(target: MultilineField, onEditingChanged: @escaping (Bool) -> Void = {_ in}) {
        self.target = target
        self.onEditingChanged = onEditingChanged
    }
    
    func textViewDidChange(_ textView: UITextView) {
        target.text = textView.text
    }
    
    func textViewDidBeginEditing(_ textView: UITextView) {
        onEditingChanged(true)
    }
    
    func textViewDidEndEditing(_ textView: UITextView) {
        onEditingChanged(false)
    }
}

struct ContentView: View {
    @State var content = ""
    
    var body: some View {
        VStack {
            MultilineField(text: $content, onEditingChanged: update)
                .overlay(RoundedRectangle(cornerRadius: 5).stroke(Color(#colorLiteral(red: 0.803921568627451, green: 0.803921568627451, blue: 0.803921568627451, alpha: 1.0))))
                .padding()
            Text(content)
        }
    }
    
    func update(changed: Bool) {
        guard !changed else { return }
        //document.content = content
        //document.updateChangeCount(.done)
    }
}

PlaygroundPage.current.setLiveView(ContentView(content: """
千早ぶる神代もきかず龍田川
からくれなゐに水くくるとは
"""))
```

~~しかし、これだとSwiftUI側の入力値更新がリアルタイムに反映されない問題がある。例えばマークダウンのコードをリアルタイムでプレビューしたい時には、それを考慮して別の実装が必要。~~

リアルタイムで反映できるように修正した。

追記:Stateへの代入で更新されないのを修正した。
アジャイルをつまみにOSTしてきた話


まず前座が面白かった！（そこかい
https://www.menti.com/55ccwc2sjv
mentiはちょこちょこ見かけてたけど、ここまで使いこなしてる人はじめて見ました。
手元のPCと上映中のスライドが連動してて、いいねマークを手元で押すとすぐ、スライドで反映されるの面白いです。
聞いてる人の人数構成とかアンケート取るのをアイスブレイクにしてましたね。

##製造業アジャイル勉強会
https://beyond-hardware-agile.connpass.com/event/149472/

というわけでこれ行ってきました。
LTを聞いた後⇒OSTという形式でグループディスカッションのながれでしたが
分からないままに凸ったけど、行ってみてよかったです！

##事例LT

ホンダさんの事例だったのですが、ITへの抵抗感すごい・・・
>心にしみるワード
>「俺たちが必死に1分1秒を削って稼いだお金を一瞬で使うIT！お金は使わせない！」

実際に職人さんたち言われたそうです（怖い！

高い壁に囲まれながら、
システム化推進を実現できた理由は？

###社内フロー回避
ざわつく聴衆

>そもそも今回してる支障にフローって自動車製造のためのフローでしょ？
システムには関係なくない？

という姿勢.。たしかに！目からウロコ！


###マネージャの理解
>気にせず進める

想像以上にシンプルだった・・・！
つよい心で回避
結果が出れば理解されるとのこと


###マーケット課題
組織に目を向ける
みんなハッピーになる価値の提供を考える

###1日1クレームへの対応
- 「おやつ神社」
一人で食べるのはいいけど、みんなで食べると目立つからダメ・・・

- 「ホワイトボードに付箋貼って議論」
・・・してると「遊んでる」と怒られる

何それと思うけど同じレベル感のクレームとか忖度、みんなあるはず

>気にせず進める

やっぱりシンプルだった！！
スルー力こそ万能説。
現場とIT部門の溝は深いようだ
（どっちもお互いに偉そうなんだとか・・・）

##委託⇒内製への道のり
現場からIT化の要望が増えるのはうれしい反面
リソースが足りなくなっていくので、一度は外部に委託したのだそうです。
が・・・

- 遠隔はコミュニケーション不足
- 社内インフラ特殊

>ものはできても活用されない問題
　現場の言う通り作るとイメージがそもそも足りてない
　（現場もわかってない）

これ、ホントあるあるですよね。根深い・・・
そこで
企画から現場と一緒にやってデザインシンキングを活用する流れへ


##VSM
バリューストーミングマッピング
　参考：https://qiita.com/i35_267/items/1c2d75861b55c537f1e0

VSMを導入したきっかけは、
ユーザとの合意形成の上でプロジェクトを進めるためのようです。
現場側もITを活用しようという気持ちになってくれたとのこと！
　（最初はやっぱりなんで俺らも一緒に・・・というスタンスの人が一定数いたようだ）

⇒リードタイム　70％削減！

##課題
チームが大きくなると
- 全体最適
- 派閥

###予算の問題
現場が予算をつけてくれるように！
成果がでて、現場でもIT化を歓迎されると進んで協力してくれるように。:v_tone3:

はじめは1人で現場チームの課題改善のために開発…
きっかけは「これは自動化できる」をわかったから。
純粋に喜んでもらおうと思って取り組む姿勢、すごいです。


##オープンスペーステクノロジー
https://www.ourfutures.net/session_methods/ost

トピックをたくさん用意して時間割をつくり、
トピック主の周りにみんなで集まって自由に議論する形式のようです。
初めてやりましたが、初心者・初対面でも思いのほか盛り上がりました！
みんな、そうそうそれそれ！という分かりいがとにかく深い。。。

わたしが参加したトピックがそういう系統だったってのもありますが。

製造業独特の問題もあるようで、
ウォーターフォールをかっちりやろうと思っても
できないと仰る方もおられましたね。

しかし、じゃぁアジャイルでっていうとき
「それ、いろんなことを端折るための体のいいわけでは？」という疑問とか。

そうそう、それで端折ったもの！ほんとは必要なんじゃないのか？！っていうね。
結局、しっかり本来のプロジェクトの回し方をみんな勉強できてるのか？実践できてるのか？？
みんな頭の痛い問題なのでした。。。

![EJaOuMJU8AA4huk.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/b44286d4-68c4-d0a2-6e58-a6a79f6f9ea0.jpeg)
![EJacB_PUcAAT2-3.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351274/0a1b539f-7c80-e7f6-964d-ef47698056c9.jpeg)
jQueryのajaxでJSONを送るとIntegerがStringになるやつをいろいろ調べた

業務中に質問を受けたので検証しました

## 結論

JSONをJSON.stringify()で囲み、Content-Typeを'application/json'にすることで、Integerのまま送信できました。

参考: **[jQuery.ajax()](https://api.jquery.com/jquery.ajax/)**

## 検証ログ

### フロント（通信部分のみ）

```javascript:jQuery
$.ajax({
  url: "http://localhost:3000/api/v1/test",
  type: "POST",
  dataType: "json",
  data: jsonData
}).done(function(r) {
  console.log(r)
})
```

```javascript:axios
axios
  .post("http://localhost:3000/api/v1/test", jsonData)
  .then(r => {
    console.log(r)
  })
```

### バックエンド(Express)

```javascript
const express = require("express")
const cors = require("cors")
const bodyParser = require('body-parser')
const app = express()

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(cors())
app.use(function (req, res, next) {
  res.setHeader('Content-Type', 'text/plain')
  next()
})

app.listen(3000, function() {})

app.post("/api/v1/test", function(req, res, next) {
  console.log(req.body)
  res.json(req.body)
})
```

## 送信データ

### パターン1

```javascript:パターン1
{
  a: [],
  b: [1, 2, 3],
  nulls: {
    a: [, 2, 3],
    b: [, , ,],
    c: [, 2, , ],
    d: [, 2, , 4]
  },
  karas: {
    a: ["", 2, 3],
    b: ["", "", ""],
    c: ["", 2, "",""],
    d: ["", 2, "", 4]
  }
}
```

### パターン2

```javascript:パターン2
JSON.stringify({
  a: [],
  b: [1, 2, 3],
  nulls: {
    a: [, 2, 3],
    b: [, , ,],
    c: [, 2, , ],
    d: [, 2, , 4]
  },
  karas: {
    a: ["", 2, 3],
    b: ["", "", ""],
    c: ["", 2, "",""],
    d: ["", 2, "", 4]
  }
})
```

## 結果

### パターン1

```javascript:jQuery
[Object: null prototype] {
  'b[]': [ '1', '2', '3' ],
  'nulls[a][]': [ '', '2', '3' ],
  'nulls[c][]': [ '', '2' ],
  'nulls[d][]': [ '', '2', '', '4' ],
  'karas[a][]': [ '', '2', '3' ],
  'karas[b][]': [ '', '', '' ],
  'karas[c][]': [ '', '2', '' ],
  'karas[d][]': [ '', '2', '', '4' ] }
```

```javascript:axios
{ a: [],
  b: [ 1, 2, 3 ],
  nulls:
   { a: [ null, 2, 3 ],
     b: [ null, null, null ],
     c: [ null, 2, null ],
     d: [ null, 2, null, 4 ] },
  karas:
   { a: [ '', 2, 3 ],
     b: [ '', '', '' ],
     c: [ '', 2, '' ],
     d: [ '', 2, '', 4 ] } }
```

### パターン2

> contentType: 'application/json' をセット

```javascript:jQuery
{ a: [],
  b: [ 1, 2, 3 ],
  nulls:
   { a: [ null, 2, 3 ],
     b: [ null, null, null ],
     c: [ null, 2, null ],
     d: [ null, 2, null, 4 ] },
  karas:
   { a: [ '', 2, 3 ],
     b: [ '', '', '' ],
     c: [ '', 2, '' ],
     d: [ '', 2, '', 4 ] } }
```
flutter runで「Configured the default Firebase app __FIRAPP_DEFAULT.」エラーが起きた際の対処法

## はじめに
FlutterとFirebaseを使ったアプリ作成中に、`flutter run`すると以下のようなエラーが起きる場面に遭遇した。

```
Launching lib/main.dart on iPhone Xʀ in debug mode...
Running pod install...                                              3.3s
Running Xcode build...                                                  
                                                   
 ├─Assembling Flutter resources...                           8.0s
 └─Compiling, linking and signing...                         6.3s
Xcode build done.                                           19.1s
Configuring the default Firebase app...
Configured the default Firebase app __FIRAPP_DEFAULT.
*** First throw call stack:
(
	0   CoreFoundation                      0x0000000105a016fb __exceptionPreprocess + 331
	1   libobjc.A.dylib                     0x0000000104fa5ac5 objc_exception_throw + 48
	2   CoreFoundation                      0x0000000105a01555 +[NSException raise:format:] + 197
	3   Runner                              0x0000000101d4f3b6 +[FIRApp configureWithName:options:] + 326
	4   Runner                              0x0000000101d4f12f +[FIRApp configureWithOptions:] + 143
	5   Runner                              0x0000000101d4f085 +[FIRApp configure] + 165
	6   Runner                              0x0000000101cf4f2c $s6Runner11AppDelegateC11application_29didFinishLaunchingWithOptionsSbSo13UIApplicationC_SDySo0j6LaunchI3KeyaypGSgtF + 204
	7   Runner                              0x0000000101cf5254 $s6Runner11AppDelegateC11application_29didFinishLaunchingWithOptions<…>

```

## 対処法

`ios/Runner/AppDelegate.swift`に配置してある、

```swift

FirebaseApp.configure()
```

を以下のように条件式を追加する形で修正する。

```swift
import UIKit
import Flutter
import Firebase

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    if FirebaseApp.app() == nil {
        FirebaseApp.configure()
    }
    GeneratedPluginRegistrant.register(with: self)
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }
}
```

`FirebaseApp.configure()`を2回以上呼んで、FirebaseAppのオブジェクトを複数生成しようとすることでエラーが起きているので、それを確認する過程を入れることでエラーを防ぐことができる。
よく使う便利なウェブサイト（Web制作関連）

## はじめに
よく使う便利サイトをまとめておきます。
※随時更新

## サイト制作関連
**Can I use... Support tables for HTML5, CSS3, etc**
HTML/CSSのプロパティなどがどのブラウザに対応しているか確認できる。
https://caniuse.com/

**Markup Validation Service**
HTML の構文チェックをすることができる。
https://validator.w3.org/

**Placehold.jp**
ダミー画像を作成する際に簡単に好きなサイズで作成してくれる。
https://placehold.jp/

**cman**
htaccessでリダイレクトする際に、ちょっぱやでファイルを作るときに活用してます。
https://htaccess.cman.jp/explain/redirect.html
※初心者取り扱い注意

ついでに、ご紹介。現在使用しているIPを確認することができます。
https://www.cman.jp/network/support/go_access.cgi

**Format CSS Online**
軽量化のため改行圧縮されたソースをもとの改行など読みやすく整えて戻してくれる。
https://beautifier.io/

**Online JavaScript Beautifier**
Format CSSのJavaScript版。
https://beautifier.io/

## SEO関連
**関連キーワード取得ツール（仮名・β版）**
サイトのキーワードを選定するときに関連するキーワードを一気にリストアップできる。
リストアップしたキーワードをキーワードプランナー（次の項目）を使うと検索気ワードのボリュームが分かるので、キーワード選定の参考になる。
http://www.related-keywords.com/

**キーワードプランナー**
Googleの提供するサービス。サイトのキーワードを選定する際に、検索キーワードのボリュームが確認できる。
無料で利用すると、検索ボリュームがざっくりしか分からない様子（有料版は細かく見れるらしい）
https://ads.google.com/intl/ja_jp/home/tools/keyword-planner/

**パワーランク相場（SEOキーワード上位10件のドメインパワー平均値）| アクセスSEO対策ツールズ**
「パワーランク」とは様々なデータから独自の計算によりドメインの強さを計測したもので、パワーランクはSEOの観点から、サイトの強さという視点で評価・判断できます。
https://www.ispr.net/rate

## 素材関連
**アプリダウンロードバッジ**
App Store
https://developer.apple.com/jp/app-store/marketing/guidelines/#section-badges

Google Play
https://play.google.com/intl/ja_jp/badges/

**フリーアイコン**
https://icooon-mono.com/

以上
[jinja2] 変数を二重展開したい

こんな感じの変数があるとして

```
{% set id = 1 %}
{% set user.1.name = 'hoge' %}
```

こうした時に、 `id = 1` が入って、 `user.1.name` になって、 `hoge` が返ってくるのを期待しますがうまくいきません。

```
{{ user.id.name }}

=> 'user.id.name'
```

idが展開されていません。 idを展開させてあげたいのですが、どうしたらいいのでしょう :thinking: 

```
{{ user.'{{ id }}'.name }}
=> 'user.'{{ id }}'name'

{{ 'user.' + id + 'name' }}
=> user.1.name（idは展開されるけど名前が展開されない）

{{ 'user.' ~ id ~ 'name' }}
=> user.1.name（idは展開されるけど名前が展開されない）
```

この辺は全部ダメでした。結論から言うと、これでできます。

```
{{ user[id].name }}
=> 'hoge'
```

無駄に悩んだのでメモ。
三重展開とかすることが今後あるかわからないですが、その時も同じ手法で可能なのかきになるので今度調べてみよう
強化学習１３　Mountain_carをChainerRLでやってみる。

強化学習１２まで達成していることが前提になります。
Ubuntu18.04の方でやっていきます。
先に作ったCartPoleで、CartPole-v0をMountainCar-v0に代えて実行してみました。
難易度が上がっているようです。

そのまま入れ替えてやってみましたが、なんか違う。。。。
gammaを0.99にしていますが。

サイトを見て回ると、学習量が多い。
多くするのが、コツなのだろうか？
以下のように設定しました。

```python
chainerrl.experiments.train_agent_with_evaluation(
    agent, env,
    steps=1000000,           # Train the agent for 2000 steps
    eval_n_steps=None,       # 10 episodes are sampled for each evaluation
    eval_n_episodes=1,       # 10 episodes are sampled for each evaluation
    eval_max_episode_len=200,  # Maximum length of each episodes
    eval_interval=100,   # Evaluate the agent after every 1000 steps
    outdir='result')      # Save everything to 'result' directory
print('Finished.')
```
epsilon=0.003にしました。

それなりに学習時間はかかりましたが、登れています。

2000回学習の曲線がこちら。
![mountaincar_20191118124725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190782/92d79fe1-332e-d29c-0de1-d644866481e8.png)

10000回学習の曲線がこちら。
![mountaincar_20191119123112.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190782/d40ed170-b0fa-54d5-72e9-37bf75be6719.png)

10000回だと、85分かかってしまいます。使っていないパソコンならいいのだけれど。
モバイルで普段使っているパソコンだとどうするべきか。

30回目くらいを目標にGPUを始めようと思っています。
その準備というか調査をしているのですが、Chainerはプログラム量が極端に少ない。HDD上で８Mｂくらい。tensorflowは大きくて300Mb以上。GPUとして、Radeonを使いたいのだが、chainerは動くかなあ。
Linux Ubuntu screen コマンドでAttachedになったセッションをDetachする方法

# 目的

- screen でAttacchedのままになってしまったセッションに入れないときの対処法をまとめる。

# 実施概要

1. Attachedになっているセッションに強制的に入る。
1. 正常な形でセッションを終了する。

# 実施詳細

1. Attachedになっているセッションに強制的に入る。
    1. 下記コマンドを実行してAttachedになっているセッションをIDも含めて調べる。
    
    ```
    $ screen -ls
    > XXXX.セッション名
    ```

    1. 下記コマンドを実行してAttachedになり`$ screen -r`で入れなくなったセッションを強制的に開く

    ```
    $ screen -rx XXXX.セッション名
    ```

1. 正常な形でセッションを終了する。
    1. 「ctrl」 + 「d」でセッションを終了する。
リリースの下書きをGithubActionsで自動的に作成する

# はじめに
この記事は[GitHub Actions Advent Calendar 2019](https://qiita.com/advent-calendar/2019/github-actions)の9日目の記事です。

GitHubのヘルプに[リリースを自動的に作成](https://help.github.com/ja/github/administering-a-repository/creating-releases#automatically-creating-releases)の項目があるのですが、APIドキュメントへのリンクしか用意されていないので、GithubActionsでの実装例を紹介します。

# 課題
私が所属する開発チームではデプロイ後にリリースの下書きを作成して、そこに変更内容やリリースの前後に必要な作業をまとめてる運用をしています。
リリースの下書きを作成する際は、他のドキュメントツールに雛形を用意しておいて、毎度コピペしていて若干面倒でした。[^1]
また、リリース直後は、動作確認や負荷を監視したりと、他に気を使うことがあるため忘れがちになるので、自動化するのは課題でした。

# やったこと
- Github Actionsを利用して、リリースをPublishすると自動的に雛形どおりの下書きリリースを作成するようにしました。

## 作成例
<img width="492" alt="スクリーンショット 2019-11-27 9.54.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15400/4b9f8593-a337-e499-a69a-8b7075885fac.png">


# テンプレート
以下のYAMLをリポジトリの`.github/workflows` 下に `release_draft.yml` などのファイル名で配置するだけです。


```yaml
name: release_draft

on:
  release:
    types: published

jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
    - name: Post draft release
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        URL: ${{ github.event.release.url }}
        BODY: |
            ### 変更内容

            - 

            ### リリース前作業
            - [ ]

            <details>
              <summary>実作業</summary>



            </details>

            ### リリース後作業
            - [ ]

            <details>
              <summary>実作業</summary>



            </details>
      run: |
        URL=$(echo "$URL" | sed -E 's/\/[0-9]+$//g')
        BODY=$(echo -e "$BODY" | sed ':a;N;$!ba;s/\n/\\n/g')
        curl -X POST \
             -H "Authorization: token ${GITHUB_TOKEN}" \
             -d "{\"tag_name\": \"\", \"name\": \"Release 2019-MM-DD-N\", \"draft\": true, \"body\": \"${BODY}\"}" \
             $URL
```

## 解説
`github.event.release.url` から`/${release-id}` の部分を除いてたものをAPIエンドポイントにしました。リポジトリを変更してもコードの変更は必要ありません。
テンプレートは環境変数で定義し、JSONで扱えるように改行をエスケープするようにしました。改行ありのYAMLなので、通常のMarkdownのように扱えます。

# 最後に
リリースを自動的に作成することで一つ手間が減り、リリース後の動作確認や負荷監視に専念できるようになりました。
リポジトリにYAMLを追加するだけなので、運用に合わせてタイトルや本文を変更して使ってもらえると幸いです。

[^1]: [クエリパラメータ付きのリリースフォームのための自動化](https://help.github.com/ja/github/administering-a-repository/automation-for-release-forms-with-query-parameters) で雛形の代用はできます。
WordPress 5.3 で導入された巨大画像の処理

このページは「[Introducing handling of big images in WordPress 5.3](https://make.wordpress.org/core/2019/10/09/introducing-handling-of-big-images-in-wordpress-5-3/)」をもとに作成しています。

---

WordPress にアップロードされる画像は主に2種類に分けられます:

* 画像編集アプリなどで加工済み、または作成したもの
* カメラなどから未加工のまま直接アップロードした写真

上のものについてはたいていのケースで、Web 向けの最適なサイズに縮小済みでしょう。

下の場合の画像は Web で使うにはかなり大きすぎで最適化もされていません。最近のスマホで撮った画像なら余裕で 5MB を超えます。高級なカメラで撮った写真ならそれよりはるかに大きくなります。

WordPress 5.3 では、大きなイメージを検出して、Web に最適な最大サイズを生成する新しい管理方法が導入されています。

##動作原理

新しい画像をアップロードすると、WordPress は ``big_image threshold`` で設定した幅、または高さを超えていないかチェックします。デフォルトの閾値は 2560 ピクセルで、``big_image_size_threshold``でフィルタ可能です。

画像の高さ、または幅がこの閾値を超える場合、指定した値を最大幅、かつ最小幅として縮小を行います。この縮小画像が使用できる画像の最大サイズとなります。

この操作が行われた場合、オリジナルのアップロード画像はアップロードディレクトリに保存され、画像メタ配列の ``original_image`` で参照します。常時オリジナル画像のパスを取得できるように、新しく ``wp_get_original_image_path()`` 関数が追加されました。

##縮小を無効にするには

縮小処理は ``big_image_size_threshold`` フィルタで制御されます。フィルタコールバックから ``false`` を返せば無効にできます。

```php
add_filter( 'big_image_size_threshold', '__return_false' );
```
背景の位置（background-position）を「右下起点」で値を指定する方法

## はじめに
「background-position」を設定するときに、右から〇px 下から〇pxで指定する方法。

## 内容
右下への指定はできるけど、値を入れて調整したい。。。

```sample.css
background-posotino : left top; //初期値
background-posotino : 10px 10px; //左上起点の指定
background-posotino : right bottom; //右下
```

## 解決
方向＋値で指定できるので、解決！

```sample.css
background-posotino : right 10px bottom 10px; //右下起点の指定
```

##対応ブラウザ
下記で確認してみてください。
https://caniuse.com/#feat=background-position-x-y

以上
webstormの便利なショートカット

エディタのショートカットの備忘録です。とりあえずMACだけです。
エディタを使いこなして開発効率を上げていきましょう！

# 行削除
command + delete

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/bd2073c1-9f71-a7f6-37e5-de292f708f6c.gif"/>

# 行切り取り
command + X

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/1663b9d7-6112-6782-0523-a92c18907085.gif" />


# カーソル移動系
## 行頭、行末移動
command +  ←／→

## 単語単位での移動
option +  ←／→

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/5cc5e844-09d7-3267-06a9-ec13ba28eda8.gif" />

# 行の移動
## 1行分の移動
shift + option + ↑／↓

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/38a3e44a-1c1c-8af6-e024-3f84355d08ae.gif" />


## 命令単位の移動
shift + command + ↑／↓

チェーンなどで複数行にわたる場合はまとめて移動してくれるようです。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/ec379460-8fb1-b586-45d0-e1c3a01c3104.gif" />

ただ逆に1行のコードから移動しようとしたら変になっちゃったのであまり使わないほうがいいのかもしれません。。。

<img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187768/bf7519e8-4f5e-3f8b-9117-365d92a3c744.gif" />


# 参考
https://qiita.com/4cres/items/5bcf0a916333521e9523
Compassの起動手順


1. コマンドプロンプトを起動する
2. 「cd」と入力し、Compassに監視させたいフォルダ（SCSSフォルダ）をドロップしてEnterキーを押す。（フォルダ移動）（※）
3. 「compass watch」または「compass w」と入力してEnterキーを押す。

※　Cドライブ以外のフォルダを監視させる場合先にドライブ移動をする。例えばDドライブのフォルダであれば、「D:」と入力してEnterキーを押し、続けて手順2を行う。
【Unity】【macOS Catalina】【iosビルド】 shader compiler errorの対処について

今回はUnityでARを試してみようとした際に出たエラーの対処について書きたいと思います。

# 開発環境
- macOS Catalina ver: 10.15.1
- Unity 2019.2.10f1

# 背景
iosビルドでARアプリを実装しようとしたところshader compiler errorが大量に出ました。
最初、ARkitかARfoundationに関するバグかと思ったのですが調べるとmacOS Catalinaでのビルドに関するバグみたいです。

# エラー対処
参考資料に載せているforumに従っただけですが以下手順を示します。

結論から言うと、ベータ版をダウンロードしてベータ版のshader compilerを現在使用しているバージョンのそれに置き換えるだけです。

1. ベータ版である Unity 2019.3.0b11をダウンロード
2. ダウンロード終了後、Finderからパッケージの内容を表示する。<br>
<img width="320" alt="img.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191216/f20d8b6c-1192-478c-9528-7169b12db039.png">
3. Contents/Tools/UnityShaderCompilerをコピペして、自分の開発環境のそれに置き換える<br>
<img width="320" alt="img2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191216/e3fef295-1efe-fb37-fb1a-02961a4ef28d.png">
4. 適用させたいプロジェクトのLibraryフォルダーを削除。Unityを起動すると新しくLibraryが作られて完了です。<br>
<img width="320" alt="img3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191216/77be7b05-2029-84fb-a071-f8225dfc22b5.png">



# 参考資料
1. https://issuetracker.unity3d.com/issues/ios
2. https://forum.unity.com/threads/unity-2019-2-7-build-ios-crashes-in-shader-compile.757754/?_ga=2.186811885.456730236.1573928598-986812279.1568100368
Longan nano のLチカを別の色でやってみる

Longan nano、秋月電子も扱っているので入手しやすくなりましたね。

[Longan Nano 爆速Tips - 環境設定～Lチカ編 -](https://qiita.com/iwaoka1986/items/21f0f43c63e819d1d2d8)

では、赤色のLEDを光らせていました。
Longan nanoに載っているLEDはRGBなので赤色以外も光らせられるはずです。

やってみましょう

#LED PINの確認
longan-nano-blinkのソースから分かる通り、赤色はPC13になっています。
緑色、青色はどこでしょう？

答えはLongan nanoの[回路図](http://dl.sipeed.com/LONGAN/Nano/HDK/Longan%20Nano%202663/Longan%20nano%202663(Schematic).pdf)に載ってました。

![longan_LED.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129938/37c50560-235f-04bc-4457-81f1ad9bb8f2.jpeg)

緑はPA1、青はPA2ということがわかりました。

#緑のLEDをチカチカさせよう
私はプログラミングの知識が乏しいので、サンプルプログラムをあさりました。

[GD32VF103_Demo_Suites_V1.0.2.rar](http://dl.sipeed.com/LONGAN/Nano/SDK/GD32VF103_Demo_Suites_V1.0.2.rar)

この中に、運良く「01_GPIO_Running_LED」というデモがありました。
これは、PA7につながっているLED(たぶん、BOOT0ボタンの近くにあるLED)を点滅させるもののようです。

PA7もアナログですので、PA1,2を制御するのも基本的には同じはずです。

longan-nano-blinkのmain.cの中身を以下にして、ビルドして書き込みます。

```c:

#include "gd32vf103.h"
#include "systick.h"
#include <stdio.h>

/* GREEN LED OF LONGAN BOARDS IS PIN PA1 */
#define LED_PIN GPIO_PIN_1



int main(void)
{  
    /* enable the LED clock */
    rcu_periph_clock_enable(RCU_GPIOA);

    /* configure LED GPIO port */
    gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, LED_PIN);


    gpio_bit_reset(GPIOA, LED_PIN);


    
    while(1){
        /* insert 500 ms delay */
        delay_1ms(500);

        /* toggle the LED */ 
        gpio_bit_write(GPIOA, LED_PIN, (bit_status)(1-gpio_input_bit_get(GPIOA, LED_PIN)));

        /* insert 500 ms delay */
        delay_1ms(500);


    }
}
```


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Longan nanoでグリーンLEDチカチカ <a href="https://t.co/R3jSYwhevz">pic.twitter.com/R3jSYwhevz</a></p>&mdash; 大沼　功(Shigezoneﾃﾝｲﾝｻﾝｼﾞｬﾅｲ 求職中なのよ) (@myston) <a href="https://twitter.com/myston/status/1196263604930007040?ref_src=twsrc%5Etfw">November 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

うまくいきました。

```
#define LED_PIN GPIO_PIN_1
```

の「1」を2にすると、青色になります。
カレンダー一日目なのでConoHaについてお話する。

# はじめにと挨拶
三年連続も書かせていただいております。
ConoHa Advent Calendar 2019 の時期が来ましたね。
今年も性懲りもなく書かせてもらいたいと思います。

今年で一番やらかしたことは MySQL(データベース) のディレクトリ(/var/lib/mysql)を吹き飛ばしたことです。
皆さんも削除コマンドは慎重に実行しましょうね。あとSSHで接続しているサーバの確認もしっかりしましょう....

さて、この記事は **ConoHa Advent Calendar 2019 1日目**の記事でございます。
1日目はConoHaについて書いていこうと思います。

# ConoHaとはなんぞや

ConoHaは、「美雲このは(cv:上坂すみれ)」という~~おっさ~~じゃなくて可愛い女の子が応援団長を務めるVPS(バーチャルプライベートサーバ)のことです。 
IPv6対応、初期費用無料、複数IPアドレス付与、ローカルネットワークによる複数台構成に対応など、様々な機能を備えています。
料金は月額制でかつ定額制です。一時間だけサーバを借りた場合、1.3円(1GBプランの場合)と時間で料金を出すことも可能とすばらいいサービスです。

更に、「ConoHa Mobile」というものが存在し、スマホからサーバの管理ができるというすごいアプリがあるわけです。

一応機能も書いてますが、見づらいし説明を省略するので詳しいことはConoHaのサイトを確認してください。

そんなConoHaのVPSを借りて3年ほど借りていますが、つい数ヶ月ほど前から使っているサービスが、学割です。
ConoHaショップで10%OFFの割引を年に4回使えるわけです。
学生にも優しいので、学生でVPSとかゲームのサーバとか必要ならConoHaが便利だと思いますね。

ちなみに、ConoHaショップでは、限定Tシャツ、アクリルフィギュア、プロ生ちゃんとのコラボマグカップ、フルジップパーカー、WordPress移行代行チケット、ConoHaカード(デジタル版もあるよ!)、ConoHaデビュー割2GBなど、色々あります。

自分は学割でConoHaカードを買いました。デジタル版は購入後メールで届くので便利です。

つらつら書きましたが、簡単にまとめると「機能性抜群、学割ある、ｺﾉﾊﾁｬﾝｶﾜｲｲﾔｯﾀｰ」ということです。

# ConoHaの良いところ悪いところ
上で色々書きましたけど、「使ってる人の話を聞きたい!」という方もいるかと思います。
## 良いところ
1.値段が安い
>まじでやすいです。
>安いプランで月額630円※、お昼とおやつを我慢すれば払えるぐらいの値段です。
>(※ VPS 512MB CPU1Core/SSD20GB プランの場合)

2.メールサーバやDBサーバなどが一瞬で用意できる
>月500円でメールサーバ、DBサーバが用意できる他、
> Minecraft、Mastodon、7 Days To Die などのゲームのサーバもあるので、わざわざVPSにサーバ用のソフトをダウンロードしてサーバを用意する必要もありません。
>かなり便利だと思います

3.サポートが抜群に良い。
> 他のVPS提供企業(さ○らインタ○ネ○トなど)を借りたことがないので、サポートについて比較できませんが、抜群に良いと思います。
> 昔のコントロールパネル(cp.conoha.jpの方と書いておけば伝わる人には伝わるはず)の方のVPSを借りていたんですが、
> 昔のコンパネの方にチャージした数日ぐらいにConoHaが新しくリニューアルしたわけですね。
>泣きながらサポートに「昔のコンパネに3000円チャージしたんですけど、新しい方にチャージ分を移行できませんか」と問い合わせると移行作業をしていただき、問い合わせ数日後に「移行できました」と連絡をもらいました。
>この時「ConoHaのサポートは神だ」と思いました。

## 悪いところ
1.コンパネが少し重い
> 我慢できなくもない程よい重さですが、「コンパネサクサク描画しないとブチ切れる」という潔癖の方にはあまり向いていないかもしれません。
> ちゃんと待てればちゃんとページは描画されます。

2.サーバ加入者向けのキャンペーンがあんまり行われない
>新規サーバを追加した場合、「2GBプランを20%OFF!」なんてやっていますが、すでにサーバを持っている人にはあんまりキャンペーンはありません。
>たまーに、このはちゃんが季節に合わせたプレゼント企画をする程度だと思ったほうが良いです。

※上記書いた内容はあくまで個人の感想です。
他の利用者の人が全く同じないし似たような考えを持っているとは限りません。

# このはちゃんって何なん?
上の方でも書いたんですが、~~おっさn~~じゃなくて可愛いマスコットキャラクターです。
この~~おっさn~~可愛いキャラクターのCVが 上坂すみれ さんと有名な声優さんが声あてをしています。
CDを購入すれば素晴らしい歌声を聞くことができると思います。
GooglePlayやiTunesでも販売しているので、スマホでも聞けます。
やったねこのはちゃん、みんなに聞いてもらえるよ！

# 最後に
編集後記的なやつです。
最後まで書いてて思いましたけど、「こんな内容で大丈夫か？」
ConoHaの良し悪しはこれを読んだConoHa初見の人が体験して、来年のCalendarにでも書いてくれれば色んな人のためになると思います。

ちなみに、去年のカレンダー投稿終わりのときぐらいから、考えていたネタがありました。
「RTMPサーバを構築しよう」というやつです。
誰得だよというのがありまして、去年のカレンダーの自作gyazo鯖もProxy鯖も全く使っていませんので、RTMPを立てても今後一切使わないと思ったので、「万が一もし見ている人がいれば多分恐らくきっと役立つ内容を」とシフトした結果、こんな内容になりました。

カレンダーにお混ぜさせていただいて、もう3回目です。
来年こそはもっと役立つことを書きたいですね。

# リンクとSpecial Thanks
+ [ConoHa公式のサイト](https://www.conoha.jp/conoha/)(このはちゃん仕様)
+ [昔のコンパネ](https://cp.conoha.jp/)
+ [今のコンパネ](https://manage.conoha.jp/Dashboard)(ログインしていない場合、ログイン画面が表示されます)
+ [Tw:ConoHaPR](https://twitter.com/ConoHaPR)
+ [Tw:MikumoConoHa](https://twitter.com/MikumoConoHa)
+ [さ○らインタ○ネ○ト](https://www.sakura.ad.jp/)←！？
+ 他のカレンダー参加者の皆様
+ ｺﾉﾊﾁｬﾝｶﾜｲｲﾔｯﾀｰ
+ 見てくれた方
ionic よく使うであろうコマンド　コピペ用（capacitor）

# テストの時

```terminal
ブラウザで開く
ionic serve

ビルド
ionic build

copy
npx cap copy

IDEを開く
npx cap open ios
npx cap open android
```

# 各種バージョンなどの確認

```terminal
ionic info

Ionic:

   Ionic CLI                     : 6.17.1 (/Users/user/.nodebrew/node/v14.17.2/lib/node_modules/@ionic/cli)
   Ionic Framework               : @ionic/angular 5.1.0
   @angular-devkit/build-angular : 0.901.9
   @angular-devkit/schematics    : 8.1.3
   @angular/cli                  : 9.1.4
   @ionic/angular-toolkit        : 2.3.3

Capacitor:

   Capacitor CLI      : 3.0.2
   @capacitor/android : 3.0.2
   @capacitor/core    : 3.0.2
   @capacitor/ios     : 3.0.2
```

# プラグイン関係
## プラグインの追加
```terminal
npm install plugin-name
```

## プラグインを同期
```terminal
npx cap sync
```
capacitorでcordovaのプラグインを使う場合は必須っぽい。

## プラグインのアップデート
```terminal
npm install plugin-name@latest
npx cap update
```

## プラグインを削除
```terminal
npm uninstall plugin-name
npx cap sync
```

# 新しく作る時
## 新規プロジェクト作成
```terminal
ionic start myApp blank --capacitor
```

## 既存のionicプロジェクトにcapacitorを入れる
```terminal
ionic integrations enable capacitor
```

## アプリの初期設定
```terminal
npx cap init [appName] [appId]
```
appIdは`com.example.app`みたいなやつ。

## ビルド
```terminal
ionic build
```
ネイティブプラットフォームを追加する前にする必要あり。

## 新規プラットフォームの追加
```terminal
npx cap add ios
npx cap add android
```