OmniAICreator/Qiita-1.07M huggingface dataset:
プライマリ言語を英語にして配信する際の勘所【AppStore】

## この記事は
リリース作業などはしばらくやっていないと忘れますね。
AppStoreConnectで**プライマリ言語を英語にするか日本語にするか悩んでる**方向けに書きました。

## プライマリ言語
AppStoreは国別にあり、デフォルトでは全ての国に対してアプリを配信することができます。
プライマリ言語設定を`英語(アメリカ)`にしてリリースすると、ローカライズされていない国に関してはプライマリ言語設定が優先されます。

ローカライズされていない国に関してはプライマリー言語(英語)が優先されるということは、北米や、英語のアジア圏の各国、イギリス、インドなどの英語を利用している国々対してアプリをリーチすることができます。

ではプライマリ言語設定を`日本語`設定にしてリリースするとどうなるかというと。
日本以外の諸外国でかつローカライズをしていない場合、`日本語`のApp名、概要、スクリーンショット、プロモーションテキスト、キーワードなどが適応されるので、日本語で検索しないとアプリが引っかからないため、世界に対してアプリをリーチすることができなくなります。

## 結論

主要言語設定を `英語(アメリカ)` にして `日本語` はローカライズとしてリリースする。
日本を除き他の所外国に関しては英語が優先されるので、App名、キーワード、概要などが英語で表示されます。
仮にアプリをいつか中国エリアにも対応したい場合は、`中国語(簡体or繁体)`のローカライズを追加というように国別に言語を追加していくことが理想です。


## プライマリ言語を英語にした際に必要なもの

### アプリ
- アプリ内で使用する文言
- アプリ内で使用する素材

### AppStore
- アプリ名
- 概要
- キーワード
- サブタイトル
- プロモーション用テキスト
- スクリーンショット

### 必ずしもローカライズする必要ない？
- プライバシーポリシー
- サポートURL

プライバシーポリシーページは日本語・英語で記載があるといい思います。
サポートページは英語対応していたら海外のユーザーからフィードバック等があると思います。

時間的に制約がある場合は、AppStore用だけでも用意すればいいのかなと思います。

## 参考
- [App Store Connectのプライマリ言語の注意と、後から変更する方法 | パティオ](http://patio.work/archives/1165)
- [iOS(iPhone, iPad)アプリの配信国の変更方法 - Qiita](https://qiita.com/hshimo/items/a13eb92164f4ac5abbc7)
Railsチュートリアル 5章最後でHerokuが動かなくなる

Railsチュートリアルをもりもりとやっています。
5章に来て初めて本格的に躓いてしまったので、備忘録として記録します。

<h2>herokuが動かない・・・</h2>
5章の最後に'git push heroku'をしたところこの画面がでました。
![スクリーンショット 2020-08-20 20.25.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176783/52c3d388-2e84-6f4a-6cac-8d1d7357ee87.png)

```
Application error
An error occurred in the application and your page could not be served. 
If you are thee application owner, check your logs for details. 
You can do this from the Heroku CLI with the command
heroku logs --tail
```

<h2>対処</h2>

ひとまず色々検索して以下のコマンドを打ちました。
>`heroku logs`　herokuのログの出力
見るべきポイント：errorと書かれている行

```
>>$ heroku logs #ログ出力
:
（中略） #errorと書かれている箇所を探す
:
2020-08-20T12:51:51.649616+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=enigmatic-harbor-30759.herokuapp.com request_id=6cf41616-a067-4dc6-8d2c-696895e1b968 fwd="60.76.208.83" dyno= connect= service= status=503 bytes= protocol=https
:
```

>`heroku run rails c` railsでコンソールを起動する
見るべきポイント：エラーになっているファイル、エラー原因

```
>>$ heroku run rails c　#コンソールの起動
:
（中略） #ファイル名が書かれている箇所を探す
:
4: from /app/app/helpers/application_helper_test.rb:1:in `<top (required)>'
: 
:#最終的なエラーを確認する
/app/vendor/bundle/ruby/2.6.0/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:292:in `require': No such file to load -- test_helper.rb (LoadError)
```


以上の内容でわかったこと
・`log`を見る限りだと、よくわからない・・・
・console起動でみると、どうやら`application_helper_test.rb`が悪さをしている？
・上のファイルが`test_helper.rb`を呼んでるけど、ファイルがないと言われている。


<h2>結論</h2>
`application_helper_test.rb`が`test_helper.rb`を参照できないようフォルダ構成になっていまいました。
本来であれば、testsフォルダ内にあるべき`application_helper_test.rb`ファイルが別のフォルダ(app)に入っていたようです。
ひとまず、ファイルを移動させ、再度実行するとエラーがなくなりました。

<h2>感想</h2>
エラーが出た時の、ログの読み取りがうまく出来なかったのでてこずってしまいました・・・。改めて整理してみて、案外読み取るポイントってシンプルなんだなと改めておもいました。
API Endpointのエントリポイント・コードの書き方

API Gatewayとかから飛んできたリクエストをLambdaでいい感じに処理する、よくあるバックエンドコード
この辺のいい感じの記述を模索してて最近こんな感じになっています。

## 最近の自分の書き方

```js
/**
 * フォーマットに関してはこいつに任せる。
 */
const run = async(event, hoehoe) => {
  // どでかいtry-catchで例外をアプリ内に封じ込める
  try {
    // 悩むけどこの辺の情報はこっちでいいかな
    const name = event.pathParameters.name;

    // 処理は極力別クラスに任せる
    const service = new Service(hoehoe);
    const pet =service.getPet(name);

    // 仕様と対応するので正常系の出口は一箇所
    return getSuccessResponse({
      color: pet.color.value,
      size: pet.size || 99999,
    });
  } catch(error) {
    console.error(error);

    // 最低限の整形をしてエラーを通知する。ここはアプリの最終防衛ラインなので重点的にテスト
    return getErrorResponse(error);
  }
} 

/**
 * エントリポイント
 * 外部プラットフォーム依存するコードを集約する
 * ここは結合テストのスコープ（LamndaやAPI Gatewayのテスト機構を使う）
 */
exports.handler = async(event) => {
  return await run(
    event,
    process.env.HOGEHOGE // 環境変数はスコープがでかいので入り口で捕まえて引き回す
  );
};
```
[netscreen]ポリシーの中の行を1行消したいとき

## ポリシーの中の行を1行消したいとき

以下のnetscreenのポリシー1があったとする。

```
set policy id 1 name "title" from "Untrust" to "DMZ"  "test-stg" "MIP(1.1.1.1)" "HTTP" permit count 
set policy id 1
set src-address "office1"
set src-address "office2"
set service "HTTPS"
exit
```

その中の　`set src-address "office1"` だけ削除したいときは以下のコマンド

```
set policy id 1
unset src-address "office1" 
exit
```

削除後のポリシー1は以下

```
set policy id 1 name "title" from "Untrust" to "DMZ"  "test-stg" "MIP(1.1.1.1)" "HTTP" permit count 
set policy id 1
set src-address "office2"
set service "HTTPS"
exit
```

## 参考

```
https://kb.juniper.net/InfoCenter/index?page=content&id=KB27570
```
Firebase CloudFunctionsで関数名に、ハイフン(-)が使えない場合の対処

##Firebase CloudFunctionsで - があるエンドポイントを作りたいけど、やり方がわからない
express.jsを使えば特に調べずにできるが、そこまで複雑ではないので、firebaseのみで完結させたい。

頑張って調べてみることにした。

####これだと、当然エラーが出ます

```typescript
exports.hello-world = functions.https.onRequest((request, response) => {
  response.json({ name: 'first' })
})
```

####そんなときは、ブラケット記法だと使ってみてlintでは引っかからなかったけど、firebaseにデプロイするときに弾かれる。

```typescript
exports['hello-world'] = functions.https.onRequest((request, response) => {
  response.json({ name: 'first' })
})
```
```
Running command: npm --prefix "$RESOURCE_DIR" run build

> functions@ build /Users/USERNAME/Desktop/PROJECTDIR/functions
> tsc

✔  functions: Finished running predeploy script.
i  functions: ensuring required API cloudfunctions.googleapis.com is enabled...
i  functions: ensuring required API cloudbuild.googleapis.com is enabled...
✔  functions: required API cloudbuild.googleapis.com is enabled
✔  functions: required API cloudfunctions.googleapis.com is enabled
i  functions: preparing functions directory for uploading...

Error: Function name "hello-world" is invalid. Function names cannot contain dashes.
```

### なんで(　；∀；)

##結論

```typescript
exports.hello = {
  world: functions.https.onRequest((request, response) => {
    response.json({ name: 'first' })
  }),
}
```

これが正解なのだそう。
ネストさせるみたいですね。

ブログなどの記事を見る前に、githubのissueを先に探しておけばよかったです。



##参考文献

https://github.com/firebase/firebase-tools/pull/1972
Raspberry PiでTensorflowの環境を構築【2020年】

<h1>Raspberry PiでTensorflowの環境構築【2020年】</h1>
<p>情報が少なく、Version管理の難しいRaspberry Piでの環境構築を以下に記します。
<ol>
<li>Raspberry Pi OS (32-bit) LiteをSDに書き込む
<p>僕はmobileNetV2を用いてリアルタイムの画像処理をするのにOSのサイズをできる限り軽量化する必要がありました。
<li>自分のパソコンをsshでつなぐ。同じwifi環境下でのみ
<p>Wifiの管理ファイルにご自身のWifi設定を書き加え、sshで接続します。
<li>下記のコマンドでOS関係を最新の状態にします。
sudo apt update
sudo apt upgrade -y
sudo reboot

<li><a href="https://qiita.com/nyas/items/f4d0675061ee8cdcc3e7">この記事</a>を参考にスワップ領域を拡張します。
<p>少しでもメモリ容量を持たせるために拡張します。
<p>テキストファイル開くときおすすめはnanoです。Nanoは使い方は基本的にメモ帳と一緒ですが、セーブがctrl+Xでそのあと保存ファイルの確認が出ますがエンター押してください
使用例：sudo nano /etc/dphys-swapfile (違うかも)
ファイルの中身は上のサイトを参考に変更してください。
<li>いよいよ<a href="https://qiita.com/rhene/items/71b92c253d5ac2a4cc52">この記事</a>を参考にTensorflowの環境を構築します。
上記の記事を参考にインストール
ただし一部変更があるため以下のコマンドが絶対です。
必ず記事と見比べながらお願いします。
ファイルの中身の変更はこの記事を参考に...

    sudo nano /etc/sysctl.conf
    sudo sysctl -p
    sudo nano /etc/rc.local
    sudo reboot　#再起動
    sudo apt install -y libhdf5-dev libqtwebkit4 libqt4-test libatlas-base-dev libjasper-dev
    sudo apt install python3-pip
	sudo apt install python3-dev -y

	sudo pip3 install pip -U
	sudo pip3 install setuptools -U
# numpy
sudo pip3 install numpy==1.16.4

# sklearn
sudo pip3 install scipy
sudo pip3 install scikit-learn==0.21.3

# matplotlib
sudo pip3 install matplotlib

# pandas
sudo pip3 install pandas==0.24.2

# seaborn
sudo pip3 install seaborn


# Tensorflow
sudo pip3 install tensorflow==1.14.0

# keras
sudo pip3 install keras

# flask
sudo pip3 install flask flask_cors -U

<li>最後にOpenCVのインストールを<a href="https://qiita.com/mt08/items/e8e8e728cf106ac83218">この記事</a>を参考に行います。

<footer>
全部入れた後はpip listで確認してください。
Vuexってなんだーーー

今回、買い物リスト的なものを作成するにあたり、どうもvuexについて学んだほうがいいとのことで。勉強を・・・始め、ます。
自分の勉強不足、知識不足により、いつも優しく寄り添ってくれたVuejs公式さんでさえ難しくて挫けそう。:persevere:
とりあえずGo:runner_tone3::runner_tone3::walking_tone3:

#Vuexってなあに
公式さんによると、
>Vuex は Vue.js アプリケーションのための状態管理パターン + ライブラリ
> これは予測可能な方法によってのみ状態の変異を行うというルールを保証。


- state・・・状態、vuejsでいうdata的な。vuexはdataではなくこのstateを管理している。
- store・・・stateを保管しているところ。
- mutation(みゅーてーしょん)・・・vuejsでいうメソッド的な。このmutationの処理によって、state（状態）が変化する
- action・・・mutationにコミットして、実行する。　ﾍﾟｰﾍﾟｹｯﾍﾟｯﾍﾟﾍﾟ-ﾍﾟｰﾍﾟﾍﾟ♪

>予測可能な方法

つまり、mutationで予測された範囲（どうやって変化するのか）を定義。
いきなり、関係ない値に変わったりしない。mutationには処理（変更）の内容が定義されている。
 
stateに直接変化を加えるわけではなく、状態はあくまでも状態。データではない。
commitって英語には引き渡す、委ねる、委託するとかの意味があるようで。
actionによって呼び出され（委ねられた）mutationが状態を変更している。
**mutationは状態の変更だけを行う。actionでmutationを呼び出す。**

>Vuex アプリケーションの中心にあるものはストアです。"ストア" は、基本的にアプリケーションの 状態（state） を保持するコンテナです

**stateはいろんなコンポーネントからアクセスできる。**propsとかでもらわなくてもいいと。
画期的なのでは・・・？:thinking:


#vuexの導入

```terminal
yarn add vuex
```
vuejsでvuexを使えるようにしたので、下記をjsに追加。
私は！vuexを使います！使いますからね！？！？！？！？と宣言:triumph::triumph::triumph::triumph:

```main.js
import Vuex from 'vuex'

Vue.use(Vuex)
```


むずかしい・・・
まだVuexさんのことがわからなくて、仲良くなれそうにない
プログラミング学習記録 Day3

#今日の学習時間
1.5h(トータル5.0h)

#今日の学習内容

##デイトラ初級編DAY7 ゼロからサイトを作ってみよう③

画像の上に文字を載せよう！とのことだったので、まずはレッスン動画を見ずに自力でコーディングし、その後動画を見て答え合わせをしました。
結果、見た目はほぼ同じようにコーディングすることができました！

お手本との相違
* topセクションをdiv.containerで囲んでいなかった
* top-titleにpadding-top、top-subtitleにpadding-bottomをつけていたが、topそのものに上下のpaddingを入れればOKだった

レスポンシブ対応
768pxタブレットのmaxサイズなのでmax-width:767pxがスマホ版となる

float:noneでfloat解除

![screencapture-file-Users-oyamadahayu-Desktop-practice-index-html-2020-08-20-08_43_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692520/10ecc719-f362-a52a-cc18-ed55d7a670c4.png)

![screencapture-file-Users-oyamadahayu-Desktop-practice-index-html-2020-08-20-09_16_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692520/e8ba4f8d-5914-0089-c538-3937c4c687b7.png)

PC版と、レスポンシブ対応したスマホ版サイトが完成！
明日からは復習としてゼロから自力でコーディングしていきます。
UITableviewをスクロールした際、Section headerを固定しない

#自分用メモ
SwiftでUItableviewを使っている時、スクロールしたときにHeaderが画面に残るのをFloatにする。


##コード

```
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let sectionHeaderHeight:CGFloat  = 40;
        if (scrollView.contentOffset.y <= sectionHeaderHeight && scrollView.contentOffset.y >= 0) {
            scrollView.contentInset = UIEdgeInsets(top: -scrollView.contentOffset.y, left: 0, bottom: 0, right: 0);
        } else if (scrollView.contentOffset.y >= sectionHeaderHeight) {
            scrollView.contentInset = UIEdgeInsets(top: -sectionHeaderHeight, left: 0, bottom: 0, right: 0);
        }
    }
```
[Git] ブランチの作成とpush

# 作業ブランチを作成
ブランチ一覧を表示

```
$ git branch -a
```
ブランチを作成して移動

```
$ git checkout -b [branch_name]
```

# push
全ファイルをステージング

```
$ git add .
```
コミット

```
$ git commit -m "Commit Message"
```
リモートリポジトリにプッシュ

```
$ git push origin [branch_name]
```

# ブランチをマージ
masterブランチに移動

```
$ git checkout master
```
[branch_name]をマージ

```
$ git merge [branch_name]
```
push

```
$ git push origin master
```

# 参考
[[Git] 基礎 ~master反映まで~](https://qiita.com/hikaru_/items/dc875b27a515f9ee9284 "Qiita")
[git mergeを使ってブランチをマージする方法【初心者向け】](https://techacademy.jp/magazine/10264 "Qiita")
[gitを使用したブランチ作成からpushまでの簡単な流れ](https://qiita.com/infratoweb/items/5021a36f69f26dc7f0b9 "Qiita")
[【Git】安全にリモートブランチにPushする](https://qiita.com/shuhei_sakiyama/items/9bd0a8882e7c9f58ae67 "Qiita")
Homebrewを使わずにMacへgit-completionとgit-prompを設定してみた

# 背景

Macで`git-completion`を使いたくなって設定方法を調べてみたが、Homebrewを使ってGitをインストールした前提での説明ばかりがヒットする。
私はひねくれ者だったらしく、GitのインストールにはHomebrewを使っていなかった。

Homebrewを使わずにGitをインストールした場合でも、`git-completion`を使えるようにする手順をまとめる。
ついでに、`git-prompt`も設定した。


# 手順

#### 1. 本体をダウンロード
```bash
# git-completion
curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash

# git-prompt
curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh -o ~/.git-prompt.sh
```

#### 2. `~/.bashrc`の編集

下記を追記する。
ファイルが存在しない場合は新規に作成する。

```bash:~/.bashrc
source $HOME/.git-completion.bash
source $HOME/.git-prompt.sh

GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\h\[\033[00m\]:\W\[\033[31m\]$(__git_ps1 [%s])\[\033[00m\]\$ '
```

#### 3. `~/.bash_profile`の編集

ターミナル起動時に`~/.bashrc`が読み込まれるように、下記を追記する。
ファイルが存在しない場合は新規に作成する。

```bash:~/.bash_profile
if [ -f ~/.bashrc ]; then
    . ~/.bashrc
fi
```

#### 4. ターミナルを再起動

これで、gitの各種コマンドのタブ補完と、プロンプトにリポジトリの状態が表示されるようになる。
UNetで脳腫瘍を検出してみた(colab環境)

広島大学で社会基盤(土木)を専攻している３年生です。
現在は１年間休学して建設系のIT企業でインターンをしています。
今回はSemantic SegmentationのUNetを脳のMRI画像のデータセットを学習させ可視化まで行いました。

#今回学習に使ったデータセットについて
kaggeで公開されている脳のMRIデータセット(https://www.kaggle.com/mateuszbuda/lgg-mri-segmentation )を使用しました。
UNetで脳の腫瘍を検出します。

以前はPSPNetで学習して可視化まで行いました。

# UNet とは
<p>U-Netは2015年に生物医学的画像セグメンテーションのために作られたモデルです。<br>
2014年に発表されたFCNがモデルのがベースとなっており、論文ではトレーニングのデータセットが少量でも正確なセグメンテーションができるとされている。<br>
簡単にモデルの概要を説明すると</p>
- ダウンサンプリングとアップサンプリングが対照的になっている。
- プーリングしてダウンサンプリングされた特徴マップと同じサイズのアップサンプリングされた特徴マップをチャンネルに対して連結している。
- 浅い層で取れるエッジなどの特徴と深い層で取れる複雑な特徴・認識したい物体の特徴を連結により重ね合わせています。

![unet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/eb39331b-15cc-54d8-3493-7961d39798ad.png)

こちらが今回UNetについて調べた参考資料です。
https://arxiv.org/pdf/1505.04597.pdf
https://lib-arts.hatenablog.com/entry/paper15_U-Net

# 実装について
https://www.kaggle.com/arunmohan003/pytorch-brain-mri-segmentation-unet
実装についてはkaggleの公開されているnotebookを参考にしました！
UNetで実装している例が数個あるのでより理解を深めたい方は見てみると面白いかもしれません。
ファインチューニングしていないので少し学習時間がかかるかもしれません、、、

自分が実装したコードのgithubリンクがこちらです(https://github.com/Akito-Fujihara/MRI-Brain-Unet-model)
jupyter notebookとpyファイルを載せています。
データセット、weightファイルなどはダウンロードして以下の構成にしてください。

MRI-Brain-UNet256-model/
┣ kaggle_3m(kaggleからダウンロードしたデータセット※https://www.kaggle.com/mateuszbuda/lgg-mri-segmentation)
┣ log_output.csv(学習のlossを記録)
┣ UNet_test.ipynb(推論・可視化)
┣ UNet_train.ipynb(学習)
┣ result_image(推論結果を可視化した画像を保存するファイル)
┣ utils
┃&emsp;┣ __init__.py(このファイルが存在するディレクトリをパッケージとなる。)
┃&emsp;┣ data_augumentation.py(前処理)
┃&emsp;┣ dataloader.py(pytorchのdataloaderを作成)
┃&emsp;┣ unet.py(モデル)
┃&emsp;┗unet256_show.py(可視化)
┗weights(weightファイルを保存する)

# 学習・推論結果と考察
可視化した画像のは水色が教師データ、黄色が推論結果である。
上手く推論できている例
![TCGA_HT_8106_19970727_15_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/ed52a9b0-a8c7-5ffe-3214-00e704a8aed9.png)&emsp;&emsp;![TCGA_HT_8107_19980708_14_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/8fe23f4d-1a9c-aa78-8cef-1278dc3faad9.png)
上手く推論できなかった例
![TCGA_HT_A5RC_19990831_23_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/ca852154-ba8a-741d-5998-a1b0bbe4e47e.png)&emsp;&emsp;![TCGA_HT_A616_19991226_15_result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677912/703acaf8-a305-0a92-d4f7-a61d8a8ec2c8.png)

腫瘍部分と正常な部分の色の濃淡がはっきりしているところはかなり綺麗に検出することができました。濃淡が少ない腫瘍部分は以前試したPSPNet(https://qiita.com/1998922akito/items/0bd1174bf0c5fd149b7f )よりも検出できていない画像が多い印象でした。

今回のデータセットだと色の濃淡をはっきりさせる前処理などを勉強して取り入れると大幅に精度が改善しそうな感じがします。

また、UNetの論文ではdata augmentationを実装することで精度が大きく変わると書いてあるので様々な処理を加えてみたいと思います。
Git 操作方法の基本

Gitの勉強を本格的に始めるので、忘備録を兼ねて投稿。
Udemyの<a href="https://www.udemy.com/course/intro_git/" target="blank">Git：はじめてのGitとGitHub</a>で学習。
#ファイルの追加方法(git add)

```
~ $ git add #ファイル名
# git add . で全てのファイルをaddすることが可能
```
gitにファイルを追加する方法。ファイル名は　abc.txtなど
このとき、addされたファイルはステージングエリアに追加される
【ステージングエリアとは】
ステージングエリアとはGitレポジトリにコミットするファイルを置いておくためのエリア。
ステージングエリアがあることによって、いきなりセーブされずに、セーブするファイル（フォルダ）群を選択することができる。

#リポジトリに変更を記録するコマンド(git commit)

```
~ $ git commit
```

１つの作業ごとに１コミットを心がける。
それにより、どの作業を何のためにしたかをすぐ確認できるのが魅力。

そのためにコミットメッセージは「何をどうして変更したのか」が分かるように記載する必要がある。
１行目：変更内容の要約
２行目：空行
３行目：変更した理由

commitした際、デフォルトではVIMというエディタで開かれ、操作方法が少し特殊。
1.半角英数字に切り替え「i」を入力するとメッセージが入力できるようになる
2.コメントを入力（初めての際は initial commit と入力する
3.escキーを入力した後、「:wq」と入力しEnterを押すことで保存が可能となる

#リモートリポジトリ-Git Hub-に登録(git push)
まずローカルリポジトリをリモートリポジトリに登録する必要がある。

```
~ $ git remote add origin https://github.com/user/repo.git
#今後はoriginという名前でGitHubリポジトリにアクセスできるよといった意味
```

```
~ $ git push origin master
#リモートリポジトリへ送信　登録したGitHubへ送信
```

```
~ $ git push origin feature
#master以外のブランチへ送信　featureへブランチを送信
```

# 状況確認のコマンド(git status)
```
~ $ git status
```
このコマンドを打つことで最新のファイル変更状況などを確認できる。

#変更履歴の確認(git log)
```
~ $ git log
```
このコマンドを打つことで、誰がどんな変更をしたかを確認することができる。
下記のオプションを追記することで、見易く情報を習得することも可能。

```
~ $ git log --oneline
#1行で表示することが可能
```

```
~ $ git log -p index.html
#ファイルの差分を表示する index.htmlはファイル名
```

```
~ $ git log -n 3
#最新の変更から３つまでを表示　３の部分を９にすると9つまで表示といった様に変更可能
#--onelineと組み合わせて使用することも可能
```

ちなみにGit logは「J」を入力で下にスクロール、「K」で上にスクロールすることができる。終了するときは「Q」を入力する。

# 変更差分を確認(git diff)
```
~ $ git diff
#ステージとの差分を表示
```
「git add」や「git commit」をする前にどの様な変更をしたのか、確認をする際に利用。

```
~ $ git diff HEAD
#ステージとコミットとの差分を表示
```
kotlinとjavaで前の画面に戻りたい！

# はじめに…

この記事は[5個前の記事](https://qiita.com/sato-na/items/cc23f9b1db9c948dc00e)で書いた、

**7日間毎日記事投稿の6日目**

になってます

使うコードは下に貼りますが、このアプリの詳しい機能はその5個前の記事をご覧ください！

- java版 : https://github.com/sato-na/guruwake_java

- kotlin版 : https://github.com/sato-na/guruwake_kotlin

↓ここからが今回の記事の本題です↓

# それぞれの言語で前の画面に戻るには…

※これはツールバーの戻るボタンから一つ前の画面に戻るための方法です

## ツールバーの実装方法

- javaの場合

```java
Toolbar 変数名 = findViewById(R.id.ツールバーのid);
setSupportActionBar(変数);
```

例)

```java:WhoActiity.java
Toolbar whoTb = findViewById(R.id.who_tb);  // 30行目
setSupportActionBar(whoTb);
```

- kotlinの場合

```kotlin
setSupportActionBar(ツールバーのid)
```

例)

```kotlin:WhoActivity.kt
setSupportActionBar(who_tb)  // 21行目
```

javaはToolBar型の変数を作る必要があるが、kotlinは作る必要がない

## ツールバーに戻るボタンをつけて戻る方法

- javaの場合

(onCreate関数内)

```java
getSupportActionBar().setDisplayShowHomeEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
```

(onCreate関数外)

```java
@Override
public boolean onSupportNavigateUp() {
    finish();
    return super.onSupportNavigateUp();
}
```

例)
(onCreate関数内)

```java:WhoActivity.java
getSupportActionBar().setDisplayShowHomeEnabled(true);  // 32行目
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
```

(onCreate関数外)

```java:WhoActivity.java
@Override  // 69行目
public boolean onSupportNavigateUp() {
    finish();
    return super.onSupportNavigateUp();
}
```

- kotlinの場合

```kotlin
supportActionBar?.let {  // 22行目
    it.setDisplayHomeAsUpEnabled(true)
    it.setHomeButtonEnabled(true)
} ?: IllegalAccessException("Toolbar cannot be null")
```

```xml:AndroidManifest.xml
<activity
    android:name=".WhoActivity"
    android:parentActivityName=".MainActivity" />  // ←ここを追加
```

例)

```kotlin:WhoActivity.kt
supportActionBar?.let {  // 22行目
    it.setDisplayHomeAsUpEnabled(true)
    it.setHomeButtonEnabled(true)
} ?: IllegalAccessException("Toolbar cannot be null")
```

```xml:AndroidManifest.xml
<activity  // 20行目
    android:name=".WhoActivity"
    android:parentActivityName=".MainActivity" />
```

javaはコードと新しく関数を定義する必要があり、kotlinはコードとAndroidManifest.xmlを編集する必要がある

# 最後に…

今回はjavaとkotlinでツールバーを使って前の画面に戻りました。
どちらの言語でも画面遷移よりも複雑なコードが必要だと感じました。

明日も記事を投稿するので、引き続き温かく見守ってください。
AWS Certificate Managerで長時間【検証保留中】となる原因

AWS Route 53でドメインを購入した。その後、AWS Certificate Manager(ACM)で証明書を発行しようとしたら、ACM側で1日以上検証保留中(pending)となってしまった。

本来なら数分から30分程度で成功するという記事も見たので、これは何かがおかしいと思い原因を調べた。

# 原因

## 
ドメインのネームサーバーと、ホストゾーンのネームサーバーが異なっていた。

## 詳細

私はRoute 53が自動で作ったホストゾーンを削除し、新しくホストゾーンを手動で作り直してしまった。

ホストゾーンを作り直した際、レコード(タイプ:NS)に示されたネームサーバーと、ドメインに登録されたネームサーバーが異なっていた。これが原因だった。

私はTerraformで証明書を管理しようとして、ホストゾーンを何度も作り直していたので、このような事態に陥った。

# 解決方法

Route 53のコンソールに移動する。

左のメニューから「ホストゾーン」をクリック。該当のホストゾーンを選択し、そのレコード(NS)を見て、ネームサーバーを全てコピーする。

左のメニューから「登録済みドメイン」をクリック。「ネームサーバーの追加/編集」をクリック。そこで既存のネームサーバーをすべて削除し、先ほどコピーしたものに差し替える。

ほどなくして証明書のステータスが「成功」に代わるはず。

# 参考

[AWSのDeveloper Guide](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/migrate-dns-domain-in-use.html)

> When you create a hosted zone, Route 53 automatically creates a name server (NS) record and a start of authority (SOA) record for the zone. The NS record identifies the four name servers that Route 53 associated with your hosted zone.

自動で作成されるホストゾーンには正しいネームサーバーが記録されている。そもそもそのホストゾーンを削除しなければこのような事態にはならないことがわかる。

---

[redditの似た現象についてのスレッド](https://www.reddit.com/r/aws/comments/bq4qnt/deleting_and_recreating_acm_ssl_certificate_stuck/)

> In my case, it turned out to be the mismatch in nameserver(NS) lists between the new hosted zone and the registered domain. Apparently, a new hosted zone is created with different NS list each time, so I've copied them into the one of my registered domain. Thanks though, this comment guided me to dig up there :)

本記事での解決方法はここから頂いた。
Win32APIのGetStockObjectをHPENに代入した話

#はじめまして
Qiitaどころか、外部にアウトプットすること自体が初めてですが、投稿の練習もかね、Win32APIの学習をしたときに少しだけ詰まった箇所を投稿します。

#環境
 Windows10 Home
 Visual Studio 2017

####学習の参考にしたサイト
http://wisdom.sakura.ne.jp/system/winapi/
このサイト様を参考に学習しています。

#エラーの内容
ペンを作成する際に下記のコードではエラーになってしまった。

```cpp:hoge.cpp
HPEN hoge;
hoge = GetStockObject(WHITE_PEN);
```

####エラー
このようなエラーがでました。
変数？(厳密には違うと思うけど)の型の問題っぽいです。

```error
型"HGDIOBJ"の値を型"HPEN"のエンティティに割り当てることはできません。
```

#修正方法
型の問題なのでキャストするのが簡単だと思って試したところ

```cpp:hoge2.cpp
hoge = (HPEN)GetStockObject(WHITE_PEN);
```

キャストするだけで無事に解決しました。

#ありがとうございました
なんとなくロマンを感じたのでWin32APIの学習をしていますが、情報が少なく(もしくは古くて、そのままでは使えない)ため、なかなか進みませんが折を見てアウトプットしていきたいと思います。

もっと効率の良い方法もあるかもしれないので(それすら分からないほどの浅い知識なので)何か参考になるサイトや書籍があれば教えてほしいです。
コールバック関数とは何か

今回は私のような初心者にとって恐らく最初の壁で、何が起きているのか理解しにくいコールバック関数についてです。

前回２つの記事はES5で書いてたので、今日からES6で書いていきます。

##コールバック関数とは何か　
関数の引数に渡す関数
※渡される関数は「高階関数」といいます。

なので、高階関数の中で実行される関数のことですね。
「関数」の単語ばかりでややこしいですが...

実はこれは結構色々なところで見かけます。

例えば、addEventListenerやfind、mapメソッド等ですね。
だから理解は必須で、理解することで何が起こってるかわかりやすくなるということです。


早速超絶シンプルな例

```JavaScript:
let red = function() {
  console.log('I am red'); 
}

let blue = function(callback) {
  console.log('I am blue');
  callback();
}

blue(red); 
//結果：
// I am blue 
// I am red
```
二つ目のfunctionの引数にcallbackが渡されてますね。
①関数「I am red と表示してね」 をredに代入
②関数「I am blue と表示してね」をblueに代入　
　この子は関数に引数callbackをもち、そのcallback引数も実行。
③blueの関数が呼び出される時、引数にredを渡す。
　この引数callback = red
<br>
ちなみにこちらの引数にはわかりやすいように、「callback」の名前を付けてますが、この名前はなんでもいいのです。
ABCとかでも動きます。任意の名前を引数に付ければOK。


```JavaScript:
let red = function() {
  console.log('I am red');
}

let blue = function(abc) {
  console.log('I am blue');
  abc();
}

blue(abc);
//結果：
// I am blue 
// I am red
```
<br>

次は、よく見る一つの例、mapのコールバック関数について。

mapは、与えられたコールバック関数を配列それぞれに順番に実行し、その結果から新しい配列を作成できるというメソッドですね。

- value : 現在処理中の要素の値
- index : 配列のindex番号
- array : 現在の配列そのもの

詳細はこちらから [MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map)

mapメソッドを使ってそれぞれの年齢を計算した配列を作ってみます。

```JavaScript:
const birthYears = [1980, 2000, 1995];

const ages = birthYears.map((value) => {
  const thisYear = new Date();
  return thisYear.getFullYear() - value;
});

console.log(birthYears); //結果: [1980, 2000, 1995]
console.log(ages); //結果: [40,20,25]
```
mapの引数に、その場で作られた無名関数を渡してます＝コールバック関数
①birthYearsに誕生年が格納されてる
②birthYearsに対してmapを実行。
 その時その場で作られたコールバック関数も実行。
＊今年の年を取得する為Dateオブジェクトも使用してみた
＊今年 - 現在の要素の値をリターン
③bithYearsとagesをそれぞれコンソールに表示
<br>
以上簡単な二つの例でした。
<br>
コールバック関数は非同期処理にも使われていたりするので、
その辺はまた記事にまとめて理解を整理していきます！
CodeBuild で AWS CLI 2 を使う

## はじめに

CodeBuild で使用できる AWS CLI のバージョンはデフォルトでは `1` です。
そのため、 `--output yaml` 等の一部のオプションが使用できません。
そこで、CodeBuild で AWS CLI のバージョンを `2` にアップデートする方法を調べました。

## 概要

[Installing the AWS CLI version 2 on Linux](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html#cliv2-linux-upgrade) に則り `AWS CLI version 2` にアップデートするだけです。

```buildspec.yml
version: 0.2

phases:
  install:
    commands:
      - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
      - unzip awscliv2.zip
      - ls -l /root/.pyenv/shims/aws
      - ./aws/install --bin-dir /root/.pyenv/shims --install-dir /usr/local/aws-cli --update
  build:
    commands:
      - aws --version
```

出力結果抜粋

```log
[Container] 2020/08/20 06:25:10 Running command aws --version
aws-cli/2.0.41 Python/3.7.3 Linux/4.14.186-110.268.amzn1.x86_64 exec-env/AWS_ECS_EC2 exe/x86_64.ubuntu.18
```

## 補足

aws command のパスは以下の通り

```log
[Container] 2020/08/20 06:25:07 Running command which aws
/root/.pyenv/shims/aws
```
GCP で 502 Bad Gateway

# はじめに
タイトルの通り、Web Applicationで502が出た話です。
実は、2度目で、1度目とは別の原因だったのでlogとして。

# E2E Testsにて
サービスインに向けて、テストをしていました。
以前の記事でも書いていますが、レガシーなmonolithicなsystemをCloudにLift & Shiftしています。
一部、30sec以上経過してもResponseがないものもあります。
Excelを作成中だったり、画面からbatchを動かしていたり。
30sec経過したところで、「502 Bad Gateway」が出てしまいます、、。

# 調査
前回の502で、loadbalancerのerrorをロギングする設定に変更したのを思い出しました。
k8sのclusterを月に1回、delete & createしている関係で、Terraformの設定が漏れているのか？
調べてみると、前回とは違う502でした。
前回は、CloudからVPNを経由して、オンプレに繋いているところで出たもので、Cloud VPNの問題でした。これは、また別に記事を書きます。

でも、確かに、502がロギングに残っています。

loadbalancerの設定を見ていくと、バックエンドに30secという記載があります。
ですが、画面からは、変更できない、、。

ここから、半日、調べに調べると、Resourceで定義する必要があるようです。

# 対応策
その名も`BackendConfig`という、カスタム リソース定義(CRD)。
sampleはこちら。

```yaml:BackendConfig
apiVersion: cloud.google.com/v1
kind: BackendConfig
metadata:
  name: my-backendconfig
spec:
  timeoutSec: 40
  connectionDraining:
    drainingTimeoutSec: 60
```

これを、front-endのsvcに、アノテーションとして宣言してあげる。

```yaml:Service
apiVersion: v1
kind: Service
metadata:
  name: web-svc
  annotations:
    beta.cloud.google.com/backend-config: '{"ports": {"80":"my-bsc-backendconfig"}}'
```

これで、502は、解消しました。

# まとめ
k8sについては、アンテナを張って、さまざまなPracticeを呼んでいるつもりでしたが、まだまだ、知らないことが多いことを知らされました。
以上。
皆さんの参考になれば幸いです。
Boost Lambdaのキャプチャとポインタ渡しについての雑感

Boost.Lambdaに、キャプチャという機能がある。

キャプチャをつかうことで、ラムダ式に引数を取ることができるようになる。
下記の13行目の[]の中に値を入れることができる。

英語では。。

The pair of square brackets ([]) is often called lambda introducers which need not empty.
[]は、lambda introducersというそうな。

     1#include <vector>
     2#include <string>
     3#include <algorithm>
     4#include <iostream>
     5
     6int main() {
     7  std::string concat;
     8  char startCharacter = 'M';
     9  std::vector<std::string> names{"Midori", "Gubugubo", "Madori"
    10                 , "Muramura", "Gyogyogyo", "Gmge", "Moooooo"};
    11
    12  std::for_each(names.begin(), names.end(),
    13               [&concat, startCharacter](const std::string& name) {
    14                 if (name.size() > 0 && name[0] == startCharacter) {
    15                   concat += name + ", ";
    16                 }
    17               });
    18  std::cout << concat << '\n';
    19}

上では、文字列のリスト
names{"Midori", "Gubugubo", "Madori", "Muramura", "Gyogyogyo", "Gmge", "Moooooo"}

について、"M"で始まるものを、文字列concatに追加していく。

<pre>
$ ./a.out 
Midori, Madori, Muramura, Moooooo,
</pre>

13行目の[&concat, startCharacter]の&concatでは、ポインタ経由の値渡しを使っている。

ポインタ経由の値渡しとは？
昔からある方法で、関数の戻り値以外の方法で値を返してもらう方法である。

C言語では、関数から値を返してもらう際には、戻り値を使うことができるが、その戻り値は１つだけである。
そのため、２つ以上の戻り値を取得する際に使わるクラシックなテクニックである。

     1#include <stdio.h>
     2
     3void func(int *a, double *b)
     4{
     5  *a = 10;
     6  *b = 3.14;
     7}
     8
     9int main(void)
    10{
    11  int a;
    12  double b;
    13
    14  func(&a, &b);
    15
    16  printf("a->%d b->%f \n", a, b);
    17
    18  return 0;
    19}

14行目で

<pre>
    14  func(&a, &b);
</pre>

と、&をつけて、（つまり、引数としてポインタを渡している）、呼び出され側（関数）でそのポインタの指すアドレスに値を格納するようにする。

実行結果
<pre>
$ ./a.out 
a->10 b->3.140000 
</pre>

話が少しそれたが、ラムダ式キャプチャの
[&concat, startCharacter]の&concatも、同じ感覚である。と見てよい。

c言語のポインタは↓の書籍がハイスタンダードである。
http://kmaebashi.com/seiha2/index.html

初版が出たのが2001/1/1で、今も読まれているので、またあと20年は読まれる可能性が高い。
（｀ー´）b
privateメソッドとprotectedメソッド


【概要】
----------------------------------------
<b>1.結論</b>

<b>2.”private”と”protected”とは何か</b>

<b>3.どのように”private”と”protected”を使うのか</b>

<b>4.ここから学んだこと</b>



1.結論
----------------------------------------
状況に応じて使い分けるが、ほぼprivateメソッドを使えばいい！


2.”private”と”protected”とは何か
----------------------------------------
publicは制限がないメソッドですが、private,protectedの違いがわからず悩みました。

<b>private</b>:
クラス外からは呼び出せない。同じインスタンス内で呼び出せる。

<b>protected</b>:
クラス外からは呼び出せない。同じインスタンス内で呼び出せる。<b>しかし、他のインスタンスであれば同じクラスであれば呼び出せる。</b>

ということですが、3.の例を見て
理解していきましょう。



3.どのように”private”と”protected”を使うのか
----------------------------------------

```ruby:private
class saturday

 def  day
  holiday
 end

 private

 def holiday
  puts "今日は休日です"
 end
end

human=Human.new
human.holiday
```

```ruby:protected
class school

  def class (student)
   @student = student
  end
  
  def brother(human)
   puts "#{class_brother}と#{human.class_brother}は兄弟です。"
　end
end

 protected
  def class_brother
   @student
  end

studentA=Student.new
studentA.school("桜木")
studentB=Student.new
studentB.school("山田")

studentA.brother("山田 ")
```

もちろんprivateのプログラムでも、
protectedが適用できます！
ただ、protectedの方は、同じクラス内でも
違うメソッド（他のインスタンスであれば同じクラスであれば呼び出せる）のため、protectedのみでしか適用できません。

4.ここから学んだこと
----------------------------------------

i)privateは使用頻度が高いと思いますが、protectedは使う範囲・頻度が限られそうです。

ii)邪魔されたくないメソッドや、影響されたくないメソッド（インスタンス変数）を使う時にはものすごく便利なのでこれからも使いつつ、プログラムを学んでいきます！
生年月日から年齢を計算して表示 JS PHP

プロフィールに年齢を表記することがあったのでメモ



## PHPで年齢を計算して表示
"19910402"の部分を変更


```php:php
年齢は<?php echo floor((date('Y/m/d') - 19910402) / 10000); ?>歳です。
```

## JavaScriptで年齢を計算して表示
"19910402"の部分を変更

```html:html
年齢は<span id="age"></span>歳です。
```
```javascript:javascript
function calcAge(birthdate) {
	const today = new Date();
	targetdate = today.getFullYear() * 10000 + (today.getMonth() + 1) * 100 + today.getDate();
	return (Math.floor((targetdate - birthdate) / 10000));
}
document.getElementById("age").innerHTML = calcAge(19910402);
```

## まとめ
現在の日付から生年月日を引いて、1万で割ると年齢が出るらしいです。数学不思議。
FieldRef.labels['KEY'] を知らなかった


`Kustomize` を使っていて、`label` の値を取れたらいいのに・・・って思っていました。
結論は `Kustomize` は関係ないのですが、`metadata.labels['KEY']` で取得できます。

# 困ってたこと
`Kustomize` の `commmonLabels` や `namePrefix`, `nameSuffix` は便利ですし、各種リソースも命名を追従してくれるのですが、`args:` や `commands:` などで `svc` を直打ちしたい時は流石に`Kustomize` では追従できず不便(baseにまとめずらい)でした。

調べると `fieldRef:` で取得できそうなのですが、[環境変数によりコンテナにPod情報を共有する](https://kubernetes.io/ja/docs/tasks/inject-data-application/environment-variable-expose-pod-information/)などをみても `labels:` に触れておらず、ダメもとで`fieldPath: metadata.labels` としてもエラー文のサポートに含まれていませんでした。。

```bash
$ kubectl kustomize .
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: sample
    env: stg
  name: sample-stg
spec:
  containers:
  - command:
    - sleep
    - "1000"
    env:
    - name: MY_LABEL
      valueFrom:
        fieldRef:
          fieldPath: metadata.labels
    image: busybox:1.28
    name: sample

$ kubectl kustomize . | kubectl aapply -f -
The Pod "sample-stg" is invalid: spec.containers[0].env[0].valueFrom.fieldRef.fieldPath: Unsupported value: "metadata.labels": supported values: "metadata.name", "metadata.namespace", "metadata.uid", "spec.nodeName", "spec.serviceAccountName", "status.hostIP", "status.podIP"
```

そんな折に、[Expose Pod Information to Containers Through Files](https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/)にヒントが書いてありました。

>Information available via fieldRef:
> metadata.name - the pod’s name
> metadata.namespace - the pod’s namespace
> metadata.uid - the pod’s UID, available since v1.8.0-alpha.2
> metadata.labels['<KEY>'] - the value of the pod’s label <KEY> (for example, metadata.labels['mylabel']); available in Kubernetes 1.9+
> metadata.annotations['<KEY>'] - the value of the pod’s annotation <KEY> (for example, metadata.annotations['myannotation']); available in Kubernetes 1.9+


Keyで指定すればいいのか！と思っていたら[ラベル(Labels)とセレクター(Selectors)](https://kubernetes.io/ja/docs/concepts/overview/working-with-objects/labels/)にちゃんと書いてありました。

> ラベル(Labels) はPodなどのオブジェクトに割り当てられたキーとバリューのペアです。

ドキュメントはちゃんと読まないとダメですね。。

# 動作確認
次のように `metadata.labels['KEY']` を与えることで取得できます。

`kustomization.yaml`

```yaml
nameSuffix: -stg
commonLabels:
  env: stg
resources: 
    - pod.yaml
```

`pod.yaml`

```yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: sample 
  name: sample
spec:
  containers:
  - command: 
    - sleep
    - "1000"
    image: busybox:1.28
    name: sample
    env:
      - name: MY_LABEL
        valueFrom:
          fieldRef:
            fieldPath: metadata.labels['env'] # <--- 追加
```

buildした結果を確認

```bash
$ kubectl kustomize .
apiVersion: v1
kind: Pod
metadata:
  labels:
    app: sample
    env: stg    # <--- これを読み取ってくる
  name: sample-stg
spec:
  containers:
  - command:
    - sleep
    - "1000"
    env:
    - name: MY_LABEL
      valueFrom:
        fieldRef:
          fieldPath: metadata.labels['env']
    image: busybox:1.28
    name: sample
```

envに登録されていることを確認

```bash
$ kubectl exec -it sample-stg -- /bin/sh
/ # env | grep LABEL
MY_LABEL=stg
/ # echo $MY_LABEL
stg
/ # exit
```

# まとめ
簡単なことですがググってもダイレクトに書いてあるリソースが見つからなかったので、書いてみました。
SPA（Single Page Application）とは？普及した理由を歴史から学ぶ

##SPAとは？##
「**S**ingle **P**age **A**pplication」の略であり、単一のWebページでアプリケーションを構成する設計構造の名称になります。
従来ページの遷移させる際に、ページ全体の更新（次ページの情報取得）が必要でした。
これがページ内の部分的な遷移を可能としたのがSPAであり、これによりページの表示速度や応答速度が向上しました。

**SPAを用いた具体例**
・Google Map
・Slack
・Facebook

上記の具体例に上げたGoogle Mapはイメージしやすく、ページ内のマップ部分のみドラッグして動かす事ができます。
これにはAjaxというアプローチ方法が採用されており、一部の情報をサーバーに送信して、それを受け取り反映させる仕組みとなっています。

Ajaxとは「**A**synchronous **Ja**vaScript + **X**ML」の略称で、元々採用されている技術である「DOM」「XML」「JavaScript」等を組み合わせたアプローチ方法です。
その為「**新しくて古い技術**」と呼ばれており、こういった技術を用いて作成したものがSPAになります。
※「Ajax」はプログラミング言語などの概念ではなく、**アプローチ方法**という概念になります。

##SPA（Single Page Application）が普及した理由##
###Flashを始めとしたRIA（Rich Internet Application）の存在###
近年SPAが普及されてきた背景としてはスマートフォンの普及が挙げられます。
従来のWebページはHTML,CSSの構成に対して、動的なアプリケーションを実装する際に「**RIA（Rich Internet Application）**」と呼ばれる外部プラグインを用いておりました。
代表的なものでいうと「**Flash**」です。
これにより従来のWebページに動きをつけることができ、表現力が高まったことからRIAは脚光を浴びるようになります。

しかし2010年頃からこの「Flash」は衰退していきます。
[当時AppleのCEOだったスティーブジョブズが、iPhone OSでAdobeのFlashテクノロジをサポートしない理由を説明するメッセージ「Thoughts on Flash」](https://news.mynavi.jp/article/20100430-a003/)を発表したことをきっかけにオープン性のあるHTML5を推進するようになりました。

簡単に言うとジョブズ氏は、
「Flash」はAdobeが提供しているもので**100%プロプリエタリ(独占的)な製品**であるが、Webに関連する全ての標準はオープンであるべきだと考え、HTML5やCSS、JavaScriptなどの**オープン標準を製品に採用**しているということを発表したのです。

その後RIAで行っていた処理は、HTML5、CSS3、JavaScriptで実現が可能となり、その概念がSPAとなります。

※2017年7月25日にAdobe Systems社よりFlashのアップデート・配布などのサポートが2020年末に終了することが正式発表されました。

##まとめ##
時代の流れと共に、技術は移り変わりながらもSPAで用いられている技術はAjaxという元からある技術を組み合わせた構造になっています。
勿論SPAに適したフレームワークや新しい技術等はありますが、技術の組み合わせや使用方法を検討することで、十分にUXの向上を果たせる可能性もあり、Webの世界はまだまだ進化していくことが予想されます。
仮に新しい技術が必要となっても、その根幹を理解するにあたって基礎的な知識は常に求められる為、HTML5,CSS3,JavaScriptはしっかり学んでおく必要がありそうです。

##参考記事##
IT media
https://www.atmarkit.co.jp/ait/articles/0708/23/news134.html
HTML55Experts.jp
https://html5experts.jp/albatrosary/4939/
日経クロステック
https://xtech.nikkei.com/atcl/learning/lecture/19/00034/00003/
RuboCopの導入と基本的な使用方法【ポートフォリオメモ①】

##はじめに
現在、ポートフォリオとしてオリジナルアプリを作成中ですが、自分一人でコードを書いているとついつい自分が読めれば問題ないコードを書きがちになってしまいます。

変な癖が付かないように、その辺も意識していきたいということで、RuboCopを導入することにしました。導入で学んだことを忘れないようにここに綴ります。

##RuboCopとは
> RuboCopとは、Ruby向けの静的解析ツールである。Ruby Style Guideのコーディング規約に従って、コードが書かれているかチェックするためのgemである。
参考：[RuboCop // Docs](https://docs.rubocop.org/rubocop/index.html)



##RuboCopをインストール
Gemfileに記入

```:Gemfile
group :development do
  gem 'rubocop', require: false
  gem 'rubocop-rails', require: false
end
```

インストール

```:terminal
$ bundle
```

##RuboCopを使ってみる

```:terminal
$ bundle exec rubocop
```

（余談ですが、bundle execって何？という時は　[bundler、bundle execについて ※自分用メモ](https://qiita.com/dawn_628/items/1821d4eef22b9f45eea8)　の記事がオススメ。）

なんだかエラーがたくさん出てしまった・・・
直さなければいけないところが書かれているので親切だけど、全部直すには時間がかかり過ぎてしまう。

ということで以下のコマンドを実行

```terminal
$ rubocop --auto-gen-config
```

すると、.rubocop_ymlと.rubocop_todo.ymlの2つのファイルが生成される。


##.rubocop_todo.yml
.rubocop_todo.ymlファイルの生成によって、先ほど大量に出た警告が一旦無視されるように設定される。すなわち.rubocop_todo.ymlに書かれているかぎり、RuboCopに怒られなくて済むということである。

試しにもう一度 budle exec rubocop を実行すると、警告が出なくなっている。

とはいえあくまでも今は一時的に警告を回避しているに過ぎないので、このファイルに何も書かれていなくてもRuboCopから警告文が表示されない状況に持っていくことが最終的な目標となる。


##警告をなくす

```.rubocop_todo.yml
Bundler/OrderedGems:
  Exclude:
    - 'Gemfile'
    
Layout/SpaceInsideArrayLiteralBrackets:
  Exclude:
    - 'config/environments/production.rb'

Layout/TrailingEmptyLines:
  Exclude:
    - 'Gemfile'

```

例えば、.rubocop_todo.ymlに上記のような記載があったら、まずは

Bundler/OrderedGems:
　Exclude:
　　- 'Gemfile'

をコメントアウトして、bundle exec rubocop を実行。すると警告文が出る。

このあとの手順は2パターンある。

**①警告に従って、コードを修正する
②コードは変えず、警告のデフォルト変更・もしくは今後警告を出さないように設定する**

①は文章通り、該当ファイルを開いて、コードを修正するということ。

##.rubocop.yml
②については、先ほど .rubocop_todo.ymlと同時に生成された .rubocop.ymlに設定を書いていく。

- RuboCopの対象から外す時

```.rubocop.yml
inherit_from: .rubocop_todo.yml
AllCops:
  # 除外するファイル
  Exclude:
    - "config/environments/*"
    - "vender/**/*"
    - "bin/**"
    - "db/**/*"
    - "tmp/**/*"
    - "lib/**/*"
    - "Gemfile"
 
```

自分でExcludeを設定する時は、デフォルトの設定が外れてしまうため、それらも改めて明記する必要がある。

ちなみに、上記のファイルの最上部にinherit_from: .rubocop_todo.yml があるが、この一文がないと、.rubocop_todo_ymlに書かれた内容が反映されないので注意。

- Copの無効化

**Copとは**、RuboCopにおける1つのルールのことである。
上から3つ目までのCopは、有効にするか無効にするかを記述しないとエラーが出るので書く。

```.rubocop.yml
Style/HashEachMethods:   
  Enabled: true
Style/HashTransformKeys:
  Enabled: true
Style/HashTransformValues:
  Enabled: true

# 日本語のコメントを許可する
Style/AsciiComments:
  Enabled: false
```

警告文に対してどちらかの対処を行ったら、コメントアウトした警告を削除する。
.rubocop_todo.ymlの中身がなくなるまでこの繰り返し。

##まとめ

- .rubocop.yml：コーディングのルールを記載
- .rubocop_todo.yml：現在の違反部分を記載 (名前の通りToDoリスト的な役割だ！)

.rubocop_todo.ymlの違反を1つずつチェックして、コードを修正もしくは新たなルールを作って.rubocop.ymlに記載するのがRuboCopの基本的な使い方である。

##おわりに
とにかく今後はRuboCopを適宜利用して、規約に沿ったコードを書いていきたいと思います。本記事で何かツッコミどころ、おかしな点などあればご教示いただけると幸いです。

尚、本記事は以下を参考にしています。

- [RuboCop is 何？](https://qiita.com/tomohiii/items/1a17018b5a48b8284a8b)
- [RuboCopをRailsオプションやLintオプションで使ってみよう](https://blog-ja.sideci.com/entry/2015/03/12/160441)
DockerでGD Libraryのエラー対応

LaravelをローカルのDockerで動かしていて、
画像の圧縮しようとしたときにつまずいたのでメモ。

# エラー

```
GD Library extension not available with this PHP installation.
```

PHPのGDライブラリが使用できないらしい。
早速Dockerfileを編集

# 結論だけ言うと、このようなDockerfileになりました

```
FROM php:7.4-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y wget git unzip libzip-dev libpq-dev libfreetype6-dev libjpeg62-turbo-dev libpng-dev \
  && docker-php-ext-install zip pdo_mysql \
  && docker-php-ext-configure gd --with-freetype --with-jpeg \
  && docker-php-ext-install -j$(nproc) gd

#Composer install
COPY --from=composer /usr/bin/composer /usr/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin


WORKDIR /var/www

RUN composer global require "laravel/installer"
```

# Dockerfileの変更を反映
イメージ：再構築の必要あり：docker-compose build
コンテナ：再構築の必要あり：docker-compose up -d

無事にエラーが出なくなりました。
Pythonの数値計算をRustに置き換えて速度比較してみた

 
## TL;DR

Pythonで3分かかっていた数値計算・約800万行のテキストファイル書き出し処理をRustに置き換えたら約5倍速くなった

## はじめに

https://github.com/MIERUNE/japan-mesh-tool

上記は[こちらの記事](https://qiita.com/Kanahiro/items/78078ef0da47f8280825)でも紹介した、日本の地域メッシュを.geojsonl形式で生成するPythonモジュールです。標準モジュールのみで書けるくらい純粋な数値計算ですが、たとえば3次メッシュでは800万弱のポリゴン数となり、後述しますが所要時間は3分くらいになります。

このPythonの処理をRustに置き換えたらどれくらい速くなるのか、Rustの勉強を兼ねて試してみました。ちなみにRustのコードも上記のリポジトリに含まれています。

### 参考：Python上での高速化を検討

アルゴリズムをいじっても劇的な速度改善とはなりませんでした。Python自体インタプリタ言語ですし、速度を求めるべきではないでしょう。また、numpyを使えばC言語の力を借りて速くなるでしょうが、外部モジュールへの依存なしの状態を保ちたかったためボツとしました。

## Python vs Rust 速度比較

### テスト条件

- macOS: Core i7 9750H RAM:16GB
- 3次メッシュを日本全域で生成する
- Python 3.8.3
- Rust 1.43.0
- Rustはreleaseビルドした実行ファイルで測定する

ファイッ！

### Python

```
time python main.py 3
initializing...
making meshes...
writing file...
done

real    2m46.227s
user    2m31.846s
sys     0m11.249s

```

166.227秒

### Rust

```
time ./target/release/japan-mesh 3

real    0m35.955s
user    0m34.233s
sys     0m1.272s

```

35.955秒

### 結果

35.955/166.227=21.63006%

約5倍の高速化！

## Rustについて

### なぜRust？
- 速いらしい
- 今アツいらしい

これくらいの軽い理解で始めました。今考えると、何より魅力的なのは、環境構築の容易さだと思います。コマンド一発でコンパイラやパッケージマネージャとか全部入ります。

## Rustって難しいんでしょう？

多少かじったくらいですが、Pythonよりは難しいです。ただRustを難しくしているのは所有権システムやライフタイムやらの概念で、今回のようなただの数値計算なら、コンパイラに怒られながらも動くものは作れます。


## 感想

- アレなコードになってるはずのRustでもちゃんと速いのがうれしい
- 当然ながら計算部分の速度差は歴然だが、ファイル書き出しはそんなに変わらなそう
- Rustはコンパイラが優秀でおかしなコードを書くと怒ってくれる
- いずれもコードに最適化の余地があると思う
- 当初は[georust/geojson](https://github.com/georust/geojson)を使っていたが、to_string()がとても遅かった
Railsで既存アプリにgretelを使用しパンくずリストを追加した。

# 目的

Railsで作成したフリマサイトでgretelを使ってパンくずリストを作成する。

# gretel導入

https://github.com/lassebunk/gretel

document

https://www.rubydoc.info/gems/gretel

## install

```
gem "gretel"
```

```
$ bundle install
```

## fileの設定

設定fileを下記コマンドで作成

```
$ rails generate gretel:install
```
```ruby:config/breadcrumb.rb
# Root crumb
crumb :root do
  link "Home", root_path
end

# Issue list
crumb :issues do
  link "All issues", issues_path
end

# Issue
crumb :issue do |issue|
  link issue.title, issue
  parent :issues
end
```

## viewに設置

```ruby
<% breadcrumb :issue, @issue %>
```

上記で各ページでどこまでのパンくずを出すのか設定する。実際にパンくずが出るのは下記を記述した箇所

```ruby
<%= breadcrumbs pretext: "You are here: ", separator: " &rsaquo; " %>
```

* pretext→パンくずリストの前のテキスト
* separator→パンくずの間の区切り

# 親の設定

config/breadcrumb.rbのcrumbとendの間にparentを設定することで親を設定することができる。

```ruby:config/breadcrumb.rb
crumb :root do
  link "Home", root_path
end

# user#index
crumb :users do
  link "Users", users_path
  parent :root
end
```

上記でparentにrootを設定。


# リンクをつける

## リンクの設定

リンクはconfig/breadcrumb.rbのcrumbとendの間にlinkを下記のように設定する。

```ruby:config/breadcrumb.rb
crumb :root do
  link "Home", root_path
end

# user#index
crumb :users do
  link "Users", users_path
  parent :root
end
```
PCが落ちてRailsがposgreSQLにつながらない　解決策

#Rails でPG::ConnectionBad　のエラーの解決方法

Macbook pro でスクールのrailsの課題を勧めていたらパソコンが落ちてしまった。PCを再起動してRails をターミナルで起動させようとしようとおなじみの以下を入力

```
% rails s
```
chromeでlocalhost:3000につなげてみると画像のようなエラーが発生した。
![スクリーンショット 2020-08-20 19.29.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680678/3a44dbe0-436e-6c7c-a6f2-720d472d6bd3.png)
SQLが停止していると思い

```
% brew services start postgresql
```
を行ったみたものの

```
Service `postgresql` already started, use `brew services restart postgresql` to restart.
```
なので

```
% brew services restart postgresql
```
を実行してみたものの、全く変化なし。
英語のサイトを参照
>https://stackoverflow.com/questions/13410686/postgres-could-not-connect-to-server

```
rm /usr/local/var/postgres/postmaster.pid
```
実行したらうまく行った😊　１時間かかりましたが解決してよかった。もし同じようなエラーで困っている方がいたら参考にしてください。
posgreを正常に停止させないと出てくるエラーらしいです。
IEさえ、、IEさえいなければ・・・こんなに便利な機能が・・・

# どうも、7noteです。IE好きの方はみないでください。

**（この記事は、IEの影響で安易に使えないCSS3選の記事です。）**

ちょうど本日、
[「Microsoft 365サービスが「IE 11」サポートを2021年8月終了--旧「Edge」予定も明らかに」](https://japan.zdnet.com/article/35158284/#:~:text=Microsoft%20365%E3%80%8D%E3%81%AE%E6%AE%8B%E3%82%8A%E3%81%AE,%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E3%82%92%E5%8F%97%E3%81%91%E3%82%89%E3%82%8C%E3%81%AA%E3%81%8F%E3%81%AA%E3%82%8B%E3%80%82)
というニュース記事が上がっており、一瞬

---

***「えっ、ついにIE終了か？！」***

---

と思いましたが**違いました**、残念。

Microsoft 365サービスにおけるIE11のサポートを終了するだけなので、まだまだIEは続くようですね。

はぁ。。。


**IEさえいなければ、こんなに使えるCSSがたくさんあるのに。**

## filter:～～;（画像の色変えれるのに・・・）

画像にぼかしや色変化などのグラフィック効果が可能になる。

```css
filter: blur(5px);      /* ぼかし */
filter: contrast(200%); /* コントラストを強く */
filter: grayscale(80%); /* グレースケールに変更 */
filter: hue-rotate(90deg); /*色相を変更(回転)*/
filter: drop-shadow(16px 16px 20px red) invert(75%); /*影*/
```

これがあれば、１種類の画像で複数色に対応できたり、
コントラストを調整させたりが可能になるのに・・・

![fillter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/5fe119c1-15d2-c647-5029-e3db3a89496f.png)



## positon: sticky;（スクロール固定できるのに・・・）

スクロールの途中からついてくる要素を作れる

```css
position: sticky;
```
![sticky.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/c86ed7fc-1f8d-75a5-51f6-76ada5630f77.gif)
引用：https://developer.mozilla.org/ja/docs/Web/CSS/position

あと、`sticky`はSafariだと、`display: inline;`か`display: inline-block;`だと効かないとか。
`display: block;`か`display: flex;`を指定している要素に`sticky`を当てるようにしましょう。

（※PolyfillがあればIEでも可能）

## object-fit:～～;（画像のトリミング変えれるのに・・・）

`object-fit: cover;`を使うと、img要素でも`background-size: cover;`のような自動トリミングを使うことができます。

```css
object-fit: cover;
```

wordpressとかで呼び出した画像のトリミングなどをcssで一発解決できたら楽ちんなのに。。。

（※PolyfillがあればIEでも可能）

## text-align: justify;（文字を均等配置できるのに）

均等配置（左右の端がピシっと揃う）ができるのに

ーーーーーーーーーー
住　　所
名　　前
生年月日
ーーーーーーーーーー

でも、`text-justify: inter-ideograph;`を追記するだけで対応可能！
という記事を見たのだが私の環境(ie11とEdge)では効かなかった。原因は不明・・・。
効いたり効かなかったリ。

あと、Safariではどうしようもないのが難点。

```index.html
<ul>
  <li>もも</li>
  <li>りんご</li>
  <li>さくらんぼ</li>
  <li>パイナップル</li>
</ul>
```

```style.css
li {
  text-align: justify;            /* Chrome・Firefox用 */
  text-justify: inter-ideograph;  /* IE・Edge用 */
                                  /* Safariには効かない */
}
```

## まとめ

まだまだ**フロントエンジニアによるIEとの戦いは続きます**が、めげずに技術や情報を駆使していいサイト作りを続けていきましょう！
**他にもIEの影響で使えないCSSなどがあれば共有ください！**記事に追加させてもらいます！

#### おそまつ！
（コメント・質問・ソースの指摘等なんでもウェルカムです！初心者の方でも気軽に質問ください！）
vscodeでコメントの色をいい感じにする

#はじめに
最近色々とコメントを書くことが増えてきてvscodeでうまくできないかなーと調べてやってみたら意外と簡単に設定ができたので共有いたします。簡単にしか説明してませんがおそらく大丈夫だと思います。。

### 導入方法

下記の二つをインストールしてください。

- [Better Comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments)

- [Todo Tree](https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree)

その後にこちらの設定をvscodeのsettings.jsonに追記してください。

```json:settings.json
  "todo-tree.general.tags": [
    "CHANGED",
    "FIXME",
    "NOTE",
    "REVIEW",
    "TODO",
    "WARNING",
  ],
  "todo-tree.highlights.defaultHighlight": {
    "icon": "checklist",
    "type": "text",
    "fontWeight": "bold",
    "iconColour": "#2C7CFF",
  },
  "todo-tree.highlights.customHighlight": {
    "CHANGED": {
      "foreground": "#FF00FF",
    },
    "FIXME": {
      "foreground": "green",
    },
    "NOTE": {
      "foreground": "#C0C0C0",
    },
    "REVIEW": {
      "foreground": "#2C7CFF",
    },
    "TODO": {
      "foreground": "#FF5F17",
    },
    "WARNING": {
      "foreground": "red",
    },
  },
  "better-comments.tags": [
    {
      "tag": "CHANGED",
      "strikethrough": false,
      "backgroundColor": "transparent",
      "color": "#FF00FF",
    },
    {
      "tag": "FIXME",
      "strikethrough": false,
      "backgroundColor": "transparent",
      "color": "green",
    },
    {
      "tag": "NOTE",
      "strikethrough": false,
      "backgroundColor": "transparent",
      "color": "#C0C0C0",
    },
    {
      "tag": "REVIEW",
      "strikethrough": false,
      "backgroundColor": "transparent",
      "color": "#2C7CFF",
    },
    {
      "tag": "TODO",
      "strikethrough": false,
      "backgroundColor": "transparent",
      "color": "#FF5F17",
    },
    {
      "tag": "WARNING",
      "strikethrough": false,
      "backgroundColor": "transparent",
      "color": "red",
    },
  ]
```

✳️　 最後にvscodeを再起動しないとBetter Commentsの設定が反映されませんのでご注意ください・

これで以上です。笑　おそらくこんな感じでできるはずです。

![スクリーンショット 2020-08-20 16.57.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305148/9fb18a4c-03bc-7644-b580-6ad6ced3738f.png)


## 最後に

今回の設定では最低限の設定しかしてませんし色もお好みのものでないかもしれません。
詳しくは各ドキュメントを参考にしてください！

#### 参考記事
- [Visual Studio Code拡張機能 14選](https://qiita.com/taka-kawa/items/673716d77795c937d422)
- [TODO: 以外のアノテーションコメントをまとめた](https://www.hypertextcandy.com/visual-studio-code-extensions#todo-tree)