OmniAICreator/Qiita-1.07M huggingface dataset:
言語処理100本ノック(2020): 24

```py
"""
24. ファイル参照の抽出
記事から参照されているメディアファイルをすべて抜き出せ．
"""

import json
import re


def get_uk_text(path):
    with open(path) as f:
        for line in f:
            line_data = json.loads(line)
            if line_data["title"] == "イギリス":
                data = line_data
                break
    return data["text"]


uk_text = get_uk_text("jawiki-country.json")
# See uk_text.txt


# ans24
def get_file(string: str) -> list:
    """
    https://docs.python.org/3/library/re.html#regular-expression-syntax

    RE:
        - re.X (re.VERBOSE)    allow us add command to explain the regular expression
        - re.M (re.MULTILINE)  apply match to each line. If not specified, only match the first line.
        - re.S (re.DOTALL)      allow to recognize '\n'
        - (...)       matches whatever regular expression is inside the parentheses,
        - (?:...)     a non-capturing version of regular parentheses.
        - ?           causes the resulting RE to match 0 or 1 repetitions
        - *?          the '*' qualifier is greedy.
                    Adding ? after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched.
                    e.g. <.*> is matched against '<a> b <c>'
                    e.g. <.*?> will match only '<a>'

    Input:
        - '[[ファイル:2019 Greenwich Peninsula & Canary Wharf.jpg|150px]]'
    Return:
        - '2019 Greenwich Peninsula & Canary Wharf.jpg'
    """
    pattern = re.compile(
        r"""
            (?:File|ファイル)  # 非キャプチャ、'File'か'ファイル'
            :
            (.+?)            # キャプチャ対象、任意の文字1文字以上、非貪欲
            \|
            """,
        re.MULTILINE | re.VERBOSE,
    )
    result = re.findall(pattern, string)
    return result


files = get_file(uk_text)

for f in files:
    print(f)
# Royal Coat of Arms of the United Kingdom.svg
# Descriptio Prime Tabulae Europae.jpg
# Lenepveu, Jeanne d'Arc au siège d'Orléans.jpg

```
言語処理100本ノック(2020): 23

```py
"""
23. セクション構造
記事中に含まれるセクション名とそのレベル（例えば”== セクション名 ==”なら1）を表示せよ．
"""

import json
import re


def get_uk_text(path):
    with open(path) as f:
        for line in f:
            line_data = json.loads(line)
            if line_data["title"] == "イギリス":
                data = line_data
                break
    return data["text"]


uk_text = get_uk_text("jawiki-country.json")
# See uk_text.txt


# ans23
def get_section(string: str) -> list:
    """
    https://docs.python.org/3/library/re.html#regular-expression-syntax

    - re.VERBOSE  allow us add command to explain the regular expression
    - re.S        allow to recognize '\n'
    - (...)       matches whatever regular expression is inside the parentheses,
    - (?:...)     a non-capturing version of regular parentheses.
    - ?           causes the resulting RE to match 0 or 1 repetitions
    - *?          the '*' qualifier is greedy.
                  Adding ? after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched.
                  e.g. <.*> is matched against '<a> b <c>'
                  e.g. <.*?> will match only '<a>'
    Input:
        - ===主要都市===
    Return:
        - [('==', '脚注'), ...]
    """
    pattern = re.compile(
        r"""
            ^     # 行頭
            (={2,}) # キャプチャ対象、2個以上の'='
            \s*     # 余分な0個以上の空白（'哲学'や'婚姻'の前後に余分な空白があるので除去）
            (.+?)   # キャプチャ対象、任意の文字が1文字以上、非貪欲（以降の条件の巻き込み防止）
            \s*     # 余分な0個以上の空白
            \1      # 後方参照、1番目のキャプチャ対象と同じ内容
            .*      # 任意の文字が0文字以上
            $       # 行末
            """,
        re.MULTILINE | re.VERBOSE,
    )
    result = re.findall(pattern, string)
    return result


def get_level(sections: list):
    result = []
    for level, value in sections:
        level = len(level) - 1
        result.append((level, value))
    return result


sections = get_section(uk_text)  # [('==', '脚注'), ...]
result = get_level(sections)  # [(1, '脚注'), ...]

for level, value in result:
    print(" " * 2 * (level - 1) + value)
# 国名
# 歴史
# 地理
#   主要都市
#   気候
# 政治
#   元首
#   法
#   内政
#   地方行政区分
#   外交・軍事

```
言語処理100本ノック(2020): 22

```py
"""
22. カテゴリ名の抽出
記事のカテゴリ名を（行単位ではなく名前で）抽出せよ．
"""

import json
import re


def get_uk_text(path):
    with open(path) as f:
        for line in f:
            line_data = json.loads(line)
            if line_data["title"] == "イギリス":
                data = line_data
                break
    return data["text"]


uk_text = get_uk_text("jawiki-country.json")
uk_text_list = uk_text.split("\n")
ans = [x for x in uk_text_list if "Category:" in x[:11]]
# ans:
# [[Category:イギリス連邦加盟国]]
# [[Category:英連邦王国|*]]
# [[Category:G8加盟国]]
# [[Category:欧州連合加盟国|元]]
# [[Category:海洋国家]]
# [[Category:現存する君主国]]
# [[Category:島国]]
# [[Category:1801年に成立した国家・領域]]


# ans22
def extract_category_value(string: str) -> str:
    """
    https://docs.python.org/3/library/re.html#regular-expression-syntax

    - re.VERBOSE  allow us add command to explain the regular expression
    - re.S        allow to recognize '\n'
    - (...)       matches whatever regular expression is inside the parentheses,
    - (?:...)     a non-capturing version of regular parentheses.
    - ?           causes the resulting RE to match 0 or 1 repetitions
    - *?          the '*' qualifier is greedy.
                  Adding ? after the qualifier makes it perform the match in non-greedy or minimal fashion; as few characters as possible will be matched.
                  e.g. <.*> is matched against '<a> b <c>'
                  e.g. <.*?> will match only '<a>'
    Input: [[Category:イギリス|*]]
    Output: 'イギリス'
    """
    pattern = re.compile(
        r"""
        ^       # 行頭
        .*      # 任意の文字0文字以上
        \[\[Category:
        (       # キャプチャ対象のグループ開始
        .*?     # 任意の文字0文字以上、非貪欲マッチ（貪欲にすると後半の'|'で始まる装飾を巻き込んでしまう）
        )       # グループ終了
        (?:     # キャプチャ対象外のグループ開始
        \|.*    # '|'に続く0文字以上
        )?      # グループ終了、0か1回の出現
        \]\]
        .*      # 任意の文字0文字以上
        $       # 行末
        """,
        re.VERBOSE | re.S,
    )
    result = re.findall(pattern, string)[0]
    return result


category_values = [extract_category_value(s) for s in ans]
print(category_values)
# ['イギリス',
#  'イギリス連邦加盟国',
#  '英連邦王国',
#  'G8加盟国',
#  '欧州連合加盟国',
#  '海洋国家',
#  '現存する君主国',
#  '島国',
#  '1801年に成立した国家・領域']

```
言語処理100本ノック(2020): 21


```py
"""
21. カテゴリ名を含む行を抽出
記事中でカテゴリ名を宣言している行を抽出せよ．
"""

import json


def get_uk_text(path):
    with open(path) as f:
        for line in f:
            line_data = json.loads(line)
            if line_data["title"] == "イギリス":
                data = line_data
                break
    return data["text"]


uk_text = get_uk_text("jawiki-country.json")
uk_text_list = uk_text.split("\n")
ans = [x for x in uk_text_list if "Category:" in x[:11]]

for a in ans:
    print(a)

# [[Category:イギリス|*]]
# [[Category:イギリス連邦加盟国]]
# [[Category:英連邦王国|*]]
# [[Category:G8加盟国]]
# [[Category:欧州連合加盟国|元]]
# [[Category:海洋国家]]
# [[Category:現存する君主国]]
# [[Category:島国]]
# [[Category:1801年に成立した国家・領域]]

```
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.の解決法

# 問題
本番環境でアプリケーションをデプロイしようとしている途中。
Nginxを起動できない。

# エラー
```
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
```

```
[アプリケーションのディレクトリ]$ systemctl status nginx.service
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 水 2020-09-30 06:32:13 UTC; 9s ago
  Process: 31655 ExecStart=/usr/sbin/nginx (code=exited, status=1/FAILURE)
  Process: 31652 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 31651 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
```

# 解決手順
Apatcheを停止したら

```
/ディレクトリで

$ sudo apachectl stop
```
Nginxを起動できました🎉

```
sudo service nginx start
```

ApatcheとNginxは競合してはいけないんですね。

# 参考記事
[CentOS7でNginXを起動する](https://qiita.com/hysdsk/items/af3867abe4ea9bfc48739)
[コマンドラインからapacheを起動／停止／再起動する](https://www.kishiro.com/apache/start_stop.html)
AWS問い合わせ

Amazonカスタマーサービスへの電話やチャットの問い合わせはこちらです。
https://www.amazon.co.jp/gp/help/contact-us/general-questions.html

AWSに関しては電話サポートはなくチャットとメールのみの対応のようですね。
https://aws.amazon.com/jp/contact-us/aws-sales/
VisualStudio C++で静的解析ツールcppcheckを実行する

# cppcheckのインストール
http://cppcheck.sourceforge.net/ からソフトウェアをダウンロードしてインストールします。

# Visual C++への組み込み
メニューから「ツール」→「外部ツール」を選択します
![external_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109997/f0e0a2f9-4133-4503-197a-8d661ab7341a.png)

## タイトル(T)
自由に設定可能です。ここではcppcheckとします。

## コマンド(C)
`C:\Program Files\Cppcheck\cppcheck.exe`
64ビット版Windowsで32ビット版cppcheckをご利用の場合は以下のようにして下さい。
`C:\Program Files (x86)\Cppcheck\cppcheck.exe`

## 引数(R)
オプションの説明は後ほどいたしますので、ここでは以下のように入力してください

### ソリューション全体をチェックしたい場合
```
--quiet --enable=warning,style,performance,portability --language=c++ -j %NUMBER_OF_PROCESSORS% --template=vs --project=$(SolutionDir)\$(SolutionFileName)
```
### プロジェクト全体をチェックしたい場合
```
--quiet --enable=warning,style,performance,portability --language=c++ -j %NUMBER_OF_PROCESSORS% --template=vs --project=$(ProjectDir)\$(ProjectFileName)
```
### 現在開いているファイルをチェックしたい場合
```
--quiet --enable=warning,style,performance,portability --language=c++ --template=vs $(ItemPath)
```
## 初期ディレクトリ(I)
### 現在開いているファイルをチェックする場合
`$(ItemDir)`
### プロジェクト全体をチェックする場合
`$(ProjectDir)`
## その他
`出力ウィンドウを使用(O)`にチェックを入れると、出力ウィンドウ上のcppcheckの結果からダブルクリックするだけで該当箇所へジャンプすることが出来とても便利です。

# おまけ
## --enableオプションについて
|引数|コメント|
|---|---|
|warning|バグを防ぐための提案|
|style|コードのクリーンアップに関連した問題（未使用の機能、冗長コード、const性、その他）|
|performance|高速なコードを作るための提案|
|portability|64ビットへの移植など移植性の警告。異なるコンパイラで異なる動作する可能性があります|
|information|設定の問題。configの設定時に有効にすることができます|
|unusedFunction|未使用関数の検出。ただしjオプションを使用した場合は無効|
`--enable=warning,style,performance,portability`
このように,で区切って指定することが出来ます。

# その他
さらに詳しい説明は[公式マニュアル](http://cppcheck.sourceforge.net/manual.pdf)を参照して下さい。
言語処理100本ノック(2020): 20


# Question

20 JSONデータの読み込み

Wikipedia記事のJSONファイルを読み込み，「イギリス」に関する記事本文を表示せよ．問題21-29では，ここで抽出した記事本文に対して実行せよ．

# Answer


```py
import json

with open("jawiki-country.json") as f:
    for line in f:
        line_data = json.loads(line)
        if line_data["title"] == "イギリス":
            data = line_data
            break

print(data["text"][:1000])
# {{redirect|UK}}
# {{redirect|英国|春秋時代の諸侯国|英 (春秋)}}
# {{Otheruses|ヨーロッパの国|長崎県・熊本県の郷土料理|いぎりす}}
# {{基礎情報 国
# |略名  =イギリス
# |日本語国名 = グレートブリテン及び北アイルランド連合王国
# |公式国名 = {{lang|en|United Kingdom of Great Britain and Northern Ireland}}<ref>英語以外での正式国名:<br />
# *{{lang|gd|An Rìoghachd Aonaichte na Breatainn Mhòr agus Eirinn mu Thuath}}（[[スコットランド・ゲール語]]）
# *{{lang|cy|Teyrnas Gyfunol Prydain Fawr a Gogledd Iwerddon}}（[[ウェールズ語]]）
# *{{lang|ga|Ríocht Aontaithe na Breataine Móire agus Tuaisceart na hÉireann}}（[[アイルランド語]]）
# *{{lang|kw|An Rywvaneth Unys a Vreten Veur hag Iwerdhon Glédh}}（[[コーンウォール語]]）
# *{{lang|sco|Unitit Kinrick o Great Breetain an Northren Ireland}}（[[スコットランド語]]）
# **{{lang|sco|Claught Kängrick o Docht Brätain an Norlin Airlann}}、{{lang|sco|Unitet Kängdom o Great Brittain an Norlin Airlann}}（アルスター・スコットランド語）</ref>
# |国旗画像 = Flag of the United Kingdom.svg
# |国章画像 = [[ファイル:Royal Coat of Arms of the United Kingdom.svg|85px|イギリスの国章]]
# |国章リンク =（[[イギリスの国章|国章]]）

with open("uk_text.txt", "w") as f:
    f.write(data["text"])

```
Cypressでテストを使いまわしたい、同じspecの中でもう一回テストをしたい時のやり方

## Cypressでテストをもう一回やりたいことってありません？

例えば、以下のようなケースです。

1. 画像を登録するテスト
2. 画像を削除するテスト
3. 画像を登録するテスト (1をもう一回やりたい・・・)
4. 登録した画像を色々するテスト

4を1の後にやればいいじゃないか、というのはごもっともですが、
例えばシナリオテストで以下のような場合はちょっと面倒です。
2の管理者のテストが終わった後にまたユーザーの削除テストをしないといけません。
管理者とユーザーのtestspecを分けたい場合は見通しが悪くなります。

1. ユーザーAの画像登録機能のテスト
2. 管理者がユーザーAの画像を見るテスト

公式リファレンスでは、使いまわしたいテストはCommandに書け、とありますが、そのspec内で完結するテストをCommandに外出しするのも見通しが悪くなりますよね。

## というときは、テスト関数を外に出しましょう。

以下が完成例です。

```
describe("retry test code", () => {
  function commontest() {
    Cypress.log({
      message: "common test",
    });
  }
  it("first test", commontest);
  it("second test", ()=>{
    Cypress.log({
      message: "second test",
    });
  });
  it("third test", commontest);
});

```

つまり、itに渡すテスト関数を外に出すことで、後からもう一度使うことができます。

それでは良いE2Eテストライフをお過ごしください。
言語処理100本ノック(2020): 10-19

# 第2章: UNIXコマンド


## 10. 行数のカウント

```bash

wc popular-names.txt 
    # 2780   11120   55026 popular-names.txt
wc -l popular-names.txt 
    # 2780 popular-names.txt
```


## 11. タブをスペースに置換

```bash
# Differences between sed on Mac OSX and other “standard” sed? https://unix.stackexchange.com/questions/13711/differences-between-sed-on-mac-osx-and-other-standard-sed
# GNU sed interprets escape sequences like \t, \n, \001, \x01, \w, and \b. 
# OS X's sed and POSIX sed only interpret \n (but not in the replacement part of s).

# We should install the GNU sed: https://medium.com/@bramblexu/install-gnu-sed-on-mac-os-and-set-it-as-default-7c17ef1b8f64
# > is used to overwrite (“clobber”) a file and >> is used to append to a file.


# sed method 1
sed -E 's/\t/ /g' popular-names.txt > popular-names-space.txt

# sed method 2
sed -E 's/[[:space:]]/ /g' popular-names.txt > popular-names-space.txt

# tr method
tr -s '\t' ' ' < popular-names.txt > popular-names-space.txt

# expand method
expand -t 1 popular-names.txt > popular-names-space.txt 
```


## 12. 1列目をcol1.txtに，2列目をcol2.txtに保存

```bash
cut -d $'\t' -f1 popular-names.txt > col1.txt
cut -d $'\t' -f2 popular-names.txt > col2.txt

cut -d ' ' -f1 popular-names-space.txt > col1.txt
cut -d ' ' -f2 popular-names-space.txt > col2.txt
```

## 13. col1.txtとcol2.txtをマージ

```bash
paste col1.txt col2.txt > merge_test.txt
```

## 14. 先頭からN行を出力

```bash
head -n 10 merge_test.txt
```

## 15. 末尾のN行を出力

```bash
tail -n 10 merge_test.txt
```

## 16. ファイルをN分割する

```bash
# This solution is based on mac os, which not support -d -n option.
# The GNU split support -d -n option.


# -l: line_count. Create files that are smaller than 500 lines in length.
# -a: suffix_length. The splited file cannot have names like split01.txt, split02.txt. Otherwise, we have to use the GNU split.
# split- prefix: name

split -l 500 -a 1  popular-names.txt split-

# split-a
# split-b
# split-c
```

## 17. １列目の文字列の異なり

```bash
cut -d $'\t' -f1 popular-names.txt | sort | uniq > unique_names.txt
```

## 18. 各行を3コラム目の数値の降順にソート

```bash
sort -k 3 -n -r popular-names.txt > popular-names-sorted.txt
# -k 3: sort as the 3rd column
# -n: numeric sort
# -r: reverse order
```

## 19. 各行の1コラム目の文字列の出現頻度を求め，出現頻度の高い順に並べる

```bash
cut -d $'\t' -f1 popular-names.txt | sort | uniq -c | sort -k1nr > name_frequency.txt

# cut -d $'\t' -f1 popular-names.txt | sort | uniq -c 
#   17 Abigail
#    3 Aiden
#    8 Alexander
#    8 Alexis

# uniq -c 
# -c: output the count of unique names in the 1st column

# sort -k1nr
#   -k1: sort by first column
#   n: numeric sort
#   r: descending order
```
WOLのポートフォワードについて

#ポートフォワーディングでWOLを使用する場合について
[前回の記事](https://qiita.com/kazu314159265/items/8b85cd47dcc8cc881d76)で、実際にWANからVPNサーバーに対してマジックパケットを送信したところ、パソコンはうまく起動したが、パソコンの電源を落としてしばらく立ってからマジックパケットを送ると、起動しないことがわかりました。

パソコンを消してすぐはうまく動くので、キャッシュクリアかなんかでパケットが届いてないのではないか？と考えました。そもそもWikiによると、マジックパケットはブロードキャストアドレスで送信しないといけないらしいので、ポートフォワードの設定を変えて、192.168.100.255のブロードキャストアドレスにしてみたらセキュリティの問題でうまくいきませんでした。

調べてみると、同じ問題で悩んでいる人がいたみたいで、[Yahoo知恵袋](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13224200528)に答えがありませした。

サーバーのARPテーブルがクリア？されたみたいでWOLがうまく動かなかったらしい。

```bash:shell
arp -a
```
でみると、たしかに192.168.100.127のMACアドレレスがなくなっていました。

```bash:shell
sudo arp -s 192.168.100.127 (ホストのMACアドレス)
```


を実行すればこのエントリは半永久的なものとなり、クリアされなくなるので、これからは問題なくWOLが使えます。
しかし、SoftetherVPNやサーバー自体を再起動させるとTAPデバイス自体が一旦削除されるので、上記のコマンドを再起動するごとに実行しなければいけません。まあでも再起動なんてそう頻繁にするもんでもないし、このままにしておきます。
絶対に挫折しないScss(超丁寧)

Scssとは？
---
SCSSとSASSは、Sass（Syntactically Awesome Style Sheets）というRuby製のCSSメタ言語です。メリットはたくさんありますので、利用者は多いです。プログラミング言語にかなり似ているので、変数やmixin,ループ処理も行えます。Cssでの記述量と比較すると半分程度で済むかもしれません。それぞれ、Scssで出来ることを説明していきますね。

ネスト構造(これはHTML構造に似てる)
---
```style.css
header{
width:100%;
position:relative;
clear:both;
}

header h1{
float:left;
}

header.imformation{
float:right;
width:350px;
}

```

↓Scssだとこんなにコンパクトに記述出来るのです！

```style.scss
header{
 width:100%;
 position:relative;
 clear:both;

 & h1{
 float:left;
 }

 &.imformation{
 float:right;
 width:350px;
 }
}

```

変数(プログラミング言語に近い感覚)
---
```style.css
section h2{
color:#6cc6c4;
}

.text p{
border:1px solid #6cc6c4;
}

ul.top li > p{
background-color:#6cc6c4;
}
/*何度も色番号を手入力しないといけないのってめんどくさいですよね？*/
```

```style.scss
/* 色番号を変数に代入してしまう＝使い回しが何度でも可能だし、修正がしやすいですよね。
cssだけだと、全部書き直しもしくは、置換するしかない。 */
$color:#6cc6c4;

section h2{
color:$color;
}

.text p{
border:1px solid $color;
}

ul.top li > p{
background-color:$color;
}
```
mixin
---

```style.scss
@mixin .maru{
border-radius:10px;
border:0.5px dashed #000;
}

div.bg{
@include .maru;
background-color:navy;
}

/*もしくは*/
.maru{
border-radius:10px;
border:0.5px dashed #000;
}

div.bg{
@extend .maru;
background-color:navy;
}
/*extendの場合、mixinを使用する必要が無い！*/

```

```style.css
.maru{
border-radius:10px;
border:0.5px dashed #000;
}

div.bg{
border-radius:10px;
border:0.5px dashed #000;
background-color:navy;
}

```

ループ処理
---
```style.scss
@for $j from 1 through 3 {
  /* #は文字列を表現しています。*/
  li:nth-child(#{$j}) {width: 10px * $i;}
}
```

```style.css
li:nth-child(1){
width: 10px;
}

li:nth-child(2){
width: 20px;
}

li:nth-child(3){
width: 30px;
}
```

Scssの導入について
---
環境構築っていうやつです。ここで躓く方はいると思います。(私はここに3ヶ月くらい悩んでいました涙)　結論から申し上げると、visual studio codeを使っている方であれば、かなり容易です！！


❶まずやることは、vscodeをインストールしましょう。
(https://code.visualstudio.com/)

![スクリーンショット 2020-09-30 15.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721000/adcd969f-b8da-fbc3-91d3-2440d5b967b1.png)

❷インストールが終わったら、拡張機能であるLive Sass Compilerをインストールしてくる。

![スクリーンショット 2020-09-30 15.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721000/c277ad65-68e5-637a-ffac-2da03bd23f56.png)

❸アプリケーション下部に表示されているWatch Sassをクリックする。(写真だと、watching...に
なっている部分)

![スクリーンショット 2020-09-30 15.17.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721000/24ab6ed2-5b2a-82cd-3076-129396a55fc5.png)

❹拡張子が .scssのファイルを作成し、保存する。
![スクリーンショット 2020-09-30 15.20.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721000/566a46b7-4c2a-bf04-92b5-086248799a26.png)
この時に、画面左下のWatch Sassをクリックすると、自動的にファイル名.css.mapファイルが
生成されます。

ーーーこれで、コンパイルという作業が終わり、Scssが、cssに自動的に変換されます。ーーー

![スクリーンショット 2020-09-30 15.29.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/721000/a8242705-ccc8-0c86-225c-23ce2ba5cb1b.png)
⬆︎ちなみに、HTMLファイルでScssファイルを読み込む場合ですが、必ず、コンパイルされたCssファイルを読み込んでください！　私は、Scssファイルを読み込んでおり、あれ？コンパイル上手くいってない？とプチパニックになりましたっけ笑
みなさんはすぐに出来ると思いますので、是非、挑戦してみてくださいね！
c: uart 通信のテストプログラム

uart 通信のテストをする c のプログラムです。
Raspberry Pi で、TxD　と RxD を短絡させてテストしました。

```c:uart_test.c
// -----------------------------------------------------------------------
/*
	uart_test.c

					Sep/20/2020
*/
// -----------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <termio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <string.h>
#include <sys/select.h>

#define SERIAL_PORT "/dev/ttyS0"

static char w[2] = "A";

// -----------------------------------------------------------------------
int main(int argc,char *argv[])
{
	int fd;
	int it;
	unsigned char buf[255];
	struct termios tio;

	fprintf(stderr, "*** start ***\n");
	fprintf(stderr, "*** Sep/30/2020 ***\n");

	for (it = 0; it < sizeof(buf); it++)
		{
		buf[it] = 0;
		}
 
	int rv; 
	struct timeval timeout;

	timeout.tv_sec = 0;
	timeout.tv_usec = 10000;

	fd_set set;

	if ((fd = open(SERIAL_PORT, O_RDWR)) < 0)
		{
		fprintf(stderr, "open error\n");
		exit(1);
		}

	FD_ZERO(&set);
	FD_SET(fd, &set);

	fprintf(stderr, "*** check *** aaa ***\n");

	bzero(&tio, sizeof(tio));

	/* 115200bps, フロー制御有り, ８ビット，DTR/DSR無効，受信可能 */
	tio.c_cflag = B115200 | CRTSCTS | CS8 | CLOCAL | CREAD;
	tio.c_cc[VMIN] = 1;	/* 入力データをバッファしない */
	tcsetattr(fd, TCSANOW, &tio); /* アトリビュートのセット */

	fprintf(stderr, "*** check *** bbb ***\n");

	for(it = 0; it < 10; it++)
		{
		write(fd, w, 1);

		rv = select(fd + 1, &set, NULL, NULL, &timeout);

		if(rv == -1)
			fprintf(stderr,"select\n"); /* an error accured */
		else if(rv == 0)
			fprintf(stderr,"timeout\n"); /* a timeout occured */
		else
			{
			int len = read(fd, buf, sizeof(buf));
			if (0 < len)
				{
				printf("read = %s\n", buf);
				}
			else
				{
				printf("len = %d\n", len);
				}
			}

		w[0]++;
	}

	close(fd);

	fprintf(stderr, "*** end ***\n");

	exit(0);
}



// -----------------------------------------------------------------------
```

```text:Makefile
all: uart_test.o
	cc -o uart_test uart_test.c
clean:
	rm -f uart_test *.o
```

TxD　と RxD を短絡させた時の結果

```text
# ./uart_test 
*** start ***
*** Sep/30/2020 ***
*** check *** aaa ***
*** check *** bbb ***
read = A
read = B
read = C
read = D
read = E
read = F
read = G
read = H
read = I
read = J
*** end ***
```

短絡させない時の結果

```text
# ./uart_test 
*** start ***
*** Sep/30/2020 ***
*** check *** aaa ***
*** check *** bbb ***
timeout
timeout
timeout
timeout
timeout
timeout
timeout
timeout
timeout
timeout
*** end ***
```

次のページを参考にしました。
[Raspberry PiでUARTの有効化＋シリアル通信](https://qiita.com/s_fujii/items/466d455ca19fb4c20744)

関連ページ
[Raspberry Pi で uart 通信のテスト](https://qiita.com/ekzemplaro/items/11789ed14fa2afd095d9)
Macの新規セットアップ時の手順メモ（2020）

# Macの新規セットアップ時の手順メモ(2020)
## はじめに
Macを購入するたびに書き直してる秘伝のメモです
毎回のセットアップに関する備忘録

## セットアップメモ

### システム環境設定

ここいじるのが1番大事ですよね！
ってことで，私はこんな感じに変更してます．

#### トラックパッド→ ポイントとクリック
* タップでクリック→有効
* 軌跡の速さ→最速

#### トラックパッド→その他のジェスチャ
* アプリケーションExposeを有効

#### キーボード→キーボード
* 装飾キー→caps lockをcontrolに変更
* F1,F2などをキーを標準のファンクションキーとして使用
* キーのリピートを最速に

#### キーボード→ショートカット
* 入力ソース→前の入力ソースを選択を⌘スペースに
* 入力ソース→入力メニューの次のソースを選択をオフ
* Spotlight検索を表示をオフ
* Finderの検索ウィンドウを表示をオフ

#### キーボード→入力ソース
* フォントをヒラギノ角ゴシックW0に
* フォントサイズを１４に

#### アクセシビリティ→ポインタコントロール→マウスとトラックパッド→トラックパッドオプション
* ドラッグを有効にする→ドラッグロックあり

#### Mission Control
* ディスプレイごとに個別の作業スペース→オフ

#### 共有
コンピュータ名の変更

#### 日付と時刻
時計→秒を表示、日付を表示

### GUIアプリケーションのインストールと設定

#### Slack
インストールして各ワークスペースにログイン
テーマはオーシャン
各設定は勝手に引き継がれてる

#### safari
機能拡張でVimariとLastPassを入れておく
（普通のアプリと一体化してるんですねいつの間にか...）

#### Alfred
ショートカット変更 ctrl＋space

#### Spectacle
これだけは公式アプリで置き換えることのできない最強アプリ
自動起動の機能が死んでるのだけが小さな不満
tophalfとbottomhalfのコマンドを少し変更command+ctrl+矢印

#### ターミナル
プロファイルを変更
http://cocopon.github.io/iceberg.vim/
フォントだけMenloの12ptに

表示名を短く
https://qiita.com/tonkotsuboy_com/items/b752a86cee7eaedf28da

#### その他インストールしたアプリ
* Acrobat DC
* Twitter
* Trello
* Messenger
* LINE
* Mathpix Snip
* parallels
* discord
* The Unarchiver
* Google Drive File Stream(https://support.google.com/a/answer/7491144?hl=ja)
* google バックアップと同期
* Anaconda(https://www.anaconda.com/products/individual)
* Spark
* Kindle
* Pixelmator Pro
* zoom
* Atom

#### 参考：クビになったアプリ
Firefox→結局メインブラウザはsafariに。vimperator全盛期は最高でしたね
夜フクロウ→公式機能のアップデートについて行けておらず...大好きなアプリなんだけどなぁ
google日本語入力→Apple公式の精度が良くなったので使わなくなっちゃいました
karabiner→キーのリピートが早くできるようになったので、まぁ…いいかなと
iTerm2→コーディングの機会が減ったので...


### CUI環境の整備
#### Xcodeインストール
homebrewを使うためにはXcodeのコマンドラインツールが必要になります。
AppStoreから普通にインストールします
あとは以下を参考にコマンドラインツールのインストール
https://qiita.com/3yatsu/items/47470091277d46f3fde2

っていうか直でここからDLすれば良いのでは？
https://developer.apple.com/download/more/?=for%20Xcode

次回セットアップの機会に要検証
そもそもなんでxcode-select --installでインストールできなかったんだろ？

なおコマンドラインツールインストール後にアンスコしました

### home brewインストール
ソフトウェアの管理はhomebrewさんにお任せ

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
#homebrewのインストール
brew upgrade
brew update
#brewの最新化（brew upgradeだけでも良いはず…）
echo export PATH='/usr/local/bin:$PATH' >> ~/.zshenv
#環境変数を通しておかないとbrewが行方不明になるので注意
```


### HomebrewにてCUIソフトウェアのインストール

こんな感じでインストールしちゃいます

```
brew install git
brew install tmux
brew install htop
brew install opencv
brew install imagemagick
```

今回を機にswigだとかpython周りだとかは取っ払いました

## 今後の課題
多分，このメモはアップデートされていくはず…

#### スケジューラの検討
ブラウザでgooglecalenderを使うようになりました。
Macの公式アプリって同期遅いのよね

#### メモアプリ
いつの間にかMacの公式メモを使うように
AmazonESのFGACとCognito連携

あんまりないかもだけど、すでにFGACしてる状態からCognito連携
AES(v7.7)がすでにありFGAC有効化済とする
※FGACは作成時にのみ有効化できる。既存ドメインにはできない。また、後から無効化できない

## Cognito作成

こちらの手順を参考にCognito周りを構築
AmazonESの"Cognito認証有効化"の手前まで実施

https://qiita.com/NorihitoYamamoto/items/2da392ac8133c067bc96#kibana%E8%AA%8D%E8%A8%BC%E6%99%82%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E8%A8%AD%E5%AE%9A%E4%BE%8B

## CognitoとFGAC連携

>管理者としてはall_access および security_manager ロールの2つにマッピングが必要

>https://docs.aws.amazon.com/ja_jp/elasticsearch-service/latest/developerguide/fgac.html

左メニューのSecurityをクリックし、"Role Mappings"をクリック

![スクリーンショット 0002-09-30 14.48.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/5208802d-c169-0659-1335-770faa2c8404.png)

all_access ロールおよび security_manager ロールの2つに、Cognitoユーザー(cognito-uehara)とCognitoが使うロール(arn:......ueharaAuth_Role)をマッピングする
以下はall_accessロールの例、security_managerロールも同じく実施する

![スクリーンショット 0002-09-30 14.51.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/e3f2e469-a4c7-b3eb-0c92-4f4bdb04ed5d.png)

ログアウトする

## AmazonESでCognito有効化

こちらの手順で続きを行う
AmazonESの"Cognito認証有効化"以降を実施

https://qiita.com/NorihitoYamamoto/items/2da392ac8133c067bc96#kibana%E8%AA%8D%E8%A8%BC%E6%99%82%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC%E8%A8%AD%E5%AE%9A%E4%BE%8B

## Kibana URLをクリック

Cognitoログイン画面が表示するので、Cognitoのユーザー&パスワードを入力しSign in

![スクリーンショット 0002-09-30 14.44.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/427670a8-1edc-0b39-59e7-5c90daa63a9c.png)

管理者としてSecurityのメニューも操作可能

![スクリーンショット 0002-09-30 14.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27932/1bb5546e-bdf0-56d0-b992-ee9d4bdf6210.png)
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'の解決法

# 問題
アプリを本番環境にデプロイする過程の中で、「MySQLを起動→データベース作成→マイグレーション」のうちの「MySQLを起動」でつまずいた。

なぜかMySQLが起動できない。
MySQLを起動したい。

# エラー
```
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'(2)
```

# 解決手順

#### ① MySQLサーバーを削除
```
yum remove mysql-server mysql-devel
```
#### ② MySQLサーバーを問題なくインストールするための下準備
```
$ sudo yum remove mariadb-libs
$ sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
$ sudo yum -y install mysql-community-server
```
これをせずに

```
$ sudo yum -y install mysql-server
```
MySQLサーバーをインストールしようとすると、「パッケージ mysql-server は利用できません。」と言われてしまいます。

「デフォルトで入ってるmariaDBと競合してしまうから」という理由なので、MySQLサーバーをインストールする前にmariaDBをremoveしておく必要があるようです。

冒頭の「MySQLを起動できない」原因はおそらくこの手順を踏んでおらず、MySQLをインストールしたつもりが「MySQLサーバーが利用不可になったまま」になっていたのだと思います。


#### ③ MySQLサーバーをインストール
```
sudo yum -y install mysql-server
```
これでMySQLを無事インストールして起動できるようになりました。

#### ④ MySQLを起動
```
本番環境の自分のアプリケーションのディレクトリで

$ sudo service mysqld start
```

# 参考記事
[DBの中身もろとも消したいときの、Mysql-server の完全削除](https://qiita.com/m-shin1/items/80dda65d832b407322f1)

[Amazon Linux 2でmysql-serverがインストールできないときの対処方法](https://qiita.com/riekure/items/d667c707e8ca496f88e6)
WSL プロキシ配下でnpxコマンドを実行する

プロキシ配下の場合、npm -g config set でプロキシの設定をしていても、
```npx create-react-app my-app```
を実行すると、
```npm ERR! FetchError: request to https://registry.npmjs.org/create-react-app failed, reason: connect ECONNREFUSED```
といったエラーになってしまう。
どうやらnpmの設定を見ていない模様。

そこで、
```npx --userconfig /home/${USER}/.nvm/versions/node/v12.18.4/etc/npmrc create-react-app my-app```
のように、npmの設定ファイルを明示的に指定すれば良い。

なお、設定ファイルの場所は、
```npx create-react-app my-app```
で表示される。
CodeWarでの勉強（ruby）⑤　proc


##この記事について
最近始めたCodewarを通じて学べたことを少しずつアウトプット


##問題
>Bob is preparing to pass IQ test. The most frequent task in this test is to find out which one of the given numbers differs from the others. Bob observed that one number usually differs from the others in evenness. Help Bob — to check his answers, he needs a program that among the given numbers finds one that is different in evenness, and return a position of this number.
! Keep in mind that your task is to help Bob solve a real IQ test, which means indexes of the elements start from 1 (not 0)

仲間外れの数値を見つけてその値を返してやるメソッドを作成してやる。


##例

以下であれば`iq_test("2 4 7 8 10")`だと7だけが奇数やから、インデックス番号に+1した数である3を返すって感じ。

iq_test("1 2 1 1")だと2が少数派やから２を返すようにさせる。

```ruby
iq_test("2 4 7 8 10") => 3 // Third number is odd, while the rest of the numbers are even

iq_test("1 2 1 1") => 2 // Second number is even, while the rest of the numbers are odd
```

###僕の回答
```ruby
def iq_test(numbers)
  numbers = numbers.split().map{|num| num.to_i}
  even_count = numbers.select {|num| num.even?}.count
  odd_count = numbers.select {|num| num.odd?}.count

  numbers.each_with_index do |num, i|
    if even_count > odd_count
      return i + 1 if num.odd?
    else
      return i + 1 if num.even?
    end
  end
end
```

①引数で渡されたデータを`split`で配列にして、`map`で配列の要素を`to_i`で数字に変換
②`select`を使用して、偶数となるデータだけ取り出して`count`メソッドで何個あるか数える
③奇数の数も②と同じように数える

④数字が入った配列を`each_with_index`で要素だけではなくて、インデックス番号も一緒に渡す。
⑤条件分岐で、偶数と奇数のどちらが少数派かを比べて少数派の方を`return`で返すようにする



##ベストプラクティス

相変わらず短いコードやな。。。

```ruby
def iq_test(numbers)
  nums = numbers.split.map(&:to_i).map(&:even?)
  nums.count(true) > 1 ? nums.index(false) + 1 : nums.index(true) + 1
end
```

###解説①


```ruby
 nums = numbers.split.map(&:to_i).map(&:even?)
```

numbersを`split`で配列にして、そのまま`map`で数値の変換して、さらに続けて２つ目の`map`で偶数かどうかを評価してtrue/falseの結果を`nums`に入れている。

####map(&:to_i)って何者や？

`each`や`map`ではブロックを使用して以下のようなパターンがよく使われる。

```ruby
["1", "2", "3"].map{|v| v.to_i}
=> [1, 2, 3]
```

ここでプログラマーさんたちが「もっと短く書けるようにしたいなー」という思いを実現して、`&演算子`を組み合わせて短く書くことができるしたんや。

```ruby
#ノーマル
["1", "2", "3"].map{|v| v.to_i}
=> [1, 2, 3]

nums = numbers.split.map(&:to_i).map{|num| num.even?}

#&を使用
["1", "2", "3"].map(&:to_i)
=> [1, 2, 3]

nums = numbers.split.map(&:to_i).map(&:even?)
```
https://www.xmisao.com/2014/02/09/ruby-array-map-idiom-symbol-to-proc.html
mapメソッドはブロック付きののメソッドで、ブロック付きメソッドの引数にはもちろんブロックを渡す必要がある。
**しかし、to_procメソッドを持つオブジェクトの前に&を置くと、ブロックとして解釈される**



####procとは？
ブロックをオブジェクト化したものが`proc`。
ブロックは`each`とか`map`のようなメソッド呼び出しのときにしか利用することができなくて、オブジェクトとして扱えない。そこで`&`を使ってブロックをオブジェクト化したものが`proc`となる。 



###解説②
```ruby
nums.count(true) > 1 ? nums.index(false) + 1 : nums.index(true) + 1
```

` nums = numbers.split.map(&:to_i).map(&:even?)`でtそれぞれの数字を評価してtrue/falseを配列を`nums`に入れて、trueの数が１以上であれば、偶数の方が多く、奇数の方が少ないということになる。
偶数が多ければ、奇数のインデックス番号+1を返して、偶数が１よりも多くなかったら偶数のインデックス番号+1を返すようになっている。



####最後に
コードの認識合ってるのか自信がないので、もし違うとこがあればぜひご指摘頂きたいです。
Ansible Tips: loopにおけるwhenにてregister変数を使用する場合、failと評価されるのは次の回

備忘

# loopにおけるwhenにてregister変数を使用する場合、register変数はそのloopの回の最後に設定/更新されるので、次の回の先頭でのwhenの評価時に意味をもつ

## 例
```yaml:loop_when.yml
- hosts: all
  gather_facts: false
  tasks:
    - loop: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
      shell: echo {{ item }}
      register: r
      when: r.stdout | default(0) | int < 5  # <= このr.stdoutは前ループの値
```

## 実行結果
```
% ansible-playbook -i localhost, -c local loop_when.yml      

PLAY [all] *****************************************************************************************************************************

TASK [shell] ***************************************************************************************************************************
changed: [localhost] => (item=0)
changed: [localhost] => (item=1)
changed: [localhost] => (item=2)
changed: [localhost] => (item=3)
changed: [localhost] => (item=4)
changed: [localhost] => (item=5)
skipping: [localhost] => (item=6) 
skipping: [localhost] => (item=7) 
skipping: [localhost] => (item=8) 
skipping: [localhost] => (item=9) 

PLAY RECAP *****************************************************************************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


```
- itemに0から9までを設定してループが実行される
- itemをそのままstdoutとして返すコマンドを実行
- whenにてコマンド実行結果が5未満の場合に実行する様に指定している様に見えるが、
    - rは各ループ終了時に確定するため、r.stdoutの値は前ループのもの。すなわち、itemが5の回では、r.stdoutは4であり、実行される
    - また、初回はrが未設定のため、default()により値を与えるなどの対応が必要



-----

旧ドキュメント

## 例

```yaml:loop_when.yml
---
- hosts: all
  gather_facts: false
  tasks:
  - vars:
      loop_list: [ 0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0 ]
      r:
        msg: "{{ loop_list|first * 2 }}" # r.msgの初期値を設定
    loop: "{{ loop_list }}"
    when: "(r.msg)|int < 5"              # このr.msgは初回を除いて前ループにより作成される
    debug:
      msg: "{{ 2 * item }}"
    register: r
```

- itemに0から5まで、そこから0までを設定してループが実行される
- この例では、r.msgの初期値に初回loopの結果を先取りさせている為、初回のwhenのみ、その回の(先取り)結果にて判断
- 2倍した数が最初に5以上となるまで、つまり0, 2, 4, 6まで実行され、以降はskipされる
- 言い換えると、when節がfalseであるべき最初の1回は、whenの評価がloopの最初なので前loop回の結果より実行され、かつそれ以降は全てskipされる

## 実行結果
```
$ ansible-playbook -i localhost, -c local loop_when.yml 

PLAY [all] **********************************************************************************************************

TASK [debug] ********************************************************************************************************
ok: [localhost] => (item=0) => {
    "msg": "0"
}
ok: [localhost] => (item=1) => {
    "msg": "2"
}
ok: [localhost] => (item=2) => {
    "msg": "4"
}
ok: [localhost] => (item=3) => {
    "msg": "6"
}
skipping: [localhost] => (item=4) 
skipping: [localhost] => (item=5) 
skipping: [localhost] => (item=6) 
skipping: [localhost] => (item=7) 
skipping: [localhost] => (item=8) 
skipping: [localhost] => (item=9) 
skipping: [localhost] => (item=10) 

PLAY RECAP **********************************************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

```
git_remote_codecommitが突然動かなくなる

一行目にあるようにどうやらXcodeのpythonに依存しているらしい。今回はおそらくXcode12への自動更新によって、動かなくなってしまった。
`/usr/local/bin/python3` で動かすようにしたら解決した。

```bash:git_remote_codecommit
#!/Applications/Xcode.app/Contents/Developer/usr/bin/python3
# -*- coding: utf-8 -*-
import re
import sys

from git_remote_codecommit import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())
```
Konyでよく遭遇するエラーまとめ　＊Build編（共通）＊

##目次
1. はじめに
2. エラーまとめ
3. 最後に


##はじめに
この記事では、Kony Visualizerを利用しているとよく遭遇するエラーと対処法についてまとめています。
その他のエラーまとめについてはこちら:point_down_tone1:

- [Konyでよく遭遇するエラーまとめ ＊Kony Visualizer 起動〜開発編＊](https://qiita.com/Kony_Team/items/0667ca2c8ee346f046d7)
- [Konyでよく遭遇するエラーまとめ ＊Build編（共通）＊](https://qiita.com/Kony_Team/items/4a1ac93faf43b2a92dc3)
- [Konyでよく遭遇するエラーまとめ ＊Build編（iOS）＊](https://qiita.com/Kony_Team/items/2dbb66b34c05e09369f7)

##エラーまとめ
###<font color="Red">Kony Fabricに接続しているのに、APIエラーが表示される</font>
Kony FabricのAppと接続しているのに、アプリをBuildするとAPI接続エラーが表示されてしまう場合、
Visualizerの見た目上は接続されていますが、接続は外れている場合があります。

その場合は、
Project SettingのKony Fabricを開き、Kony Fabric Environmentで環境を選択→Finishをクリック
![スクリーンショット 2020-09-29 15.24.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/d7baccfb-4227-b639-671f-559ee9468655.png)
更に、Kony Visualizerの左メニューのKony Fabricを右クリックし、
一度Unlinkして、再度Use Existing Appをクリックして再接続してください。
ここまで完了すれば、Kony Fabricに正常に接続されます。
![スクリーンショット 2020-09-29 15.27.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/f0aadf6a-187a-3345-cd53-28af58846001.png)

これは、特にWebアプリをBuildした時によく発生するエラーですので、
おかしいなと思った際には一度試してみてください:point_up_tone1:


###<font color="Red">Buildが遅い</font>
**対策1**
Build完了までの時間がいつもより遅い場合、
モバイル等のBinaryファイルをあげる必要のないアプリの場合は、
Kony Visualizer上部メニューの環境設定（Preference）を開き、
Kony Visualizer->Buildの設定で、`Generate Kony Fabric app binary during SPA build`の項目のチェックを解除してください。
標準でチェックOnになっているため、binaryをKony Fabricにアップしない場合は、外してしまって構いません。
![スクリーンショット 2020-09-29 15.34.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/d3ef7812-8d70-72cb-770b-9213caebf83a.png)

Web又はSPAアプリをPublishする場合は、
Publish時にKony Fabricの該当Appにbinaryをアップする必要があるため、
その場合のみチェックをOnに戻すと良いかと思います。
BinaryがAppにアップロードされると、Kony FabricのAppはこのような表示となります。
![スクリーンショット 2020-09-29 15.40.29 6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/9ba9514b-97b8-3aa4-ded8-44c88d3f28f0.png)

**対策2**
それでも遅い場合、過去のプロジェクトのNFIが残っている可能性がありますので、
SourceTreeなどでバージョン管理をしている場合は、一度Kony Visualizerの上部メニューから
Edit->Manage Native Function(s)を開き、不要なNFIは削除してRefresh後に再度Buildしてみてください。
![スクリーンショット 2020-09-29 16.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/0db10680-2aa1-6cf4-3ec3-e6a4bc084740.png)
![スクリーンショット 2020-09-29 16.14.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592264/8a088b4e-9ed8-21df-6a36-0c13f719c7c9.png)


##まとめ
Konyでよく発生するエラーと対策についてまとめてみました。
また新たなエラーに遭遇したら、改めてまとめたいと思います！
PostgreSQL 10の関数名指定の変更点

CentOS8のデフォルトでインストールされるPostgreSQLが10（手元の環境を見たら、10.14でした）になっていますが、
関数名の指定方法が、9.6以前と変わった点があり、その点でちょっとだけハマったので、書いておきます。

PostgreSQL 10で、以下の変更点があります。

> 唯一であるならDDLコマンドで引数無しに関数名の指定を可能にしました。 (Peter Eisentraut)
> 例えば、その名前をもつ関数が一つだけしかないなら、引数なしで関数名だけのDROP FUNCTIONが可能です。 この振る舞いはSQL標準で必要とされています。

以下、変更点が書かれているページです。
https://www.postgresql.jp/document/10/html/release-10.html#id-1.11.6.10.5

関数名の指定で、その関数がユニークであるなら、()が省略できるようになりました、ということです。
※引数の有無関係なく、関数名がユニークな場合、引数があっても()が省略できました。

以下、実際にこの変更点に関する部分を試した内容です。

```
CREATE OR REPLACE FUNCTION myfunc(i integer)
 RETURNS void
 LANGUAGE plpgsql
AS $function$
DECLARE
BEGIN
	
	RETURN;
END
$function$
;

-- PostgreSQL 10は、成功する
-- PostgreSQL 9.6以前の場合は、ERROR:  syntax error at or near "owner"
alter function myfunc owner to myname;


CREATE OR REPLACE FUNCTION myfunc(v text)
 RETURNS void
 LANGUAGE plpgsql
AS $function$
DECLARE
BEGIN
	
	RETURN;
END
$function$
;

-- myfunc(i integer); と、myfunc(v text);がある場合、PostgreSQL 10でも失敗する
-- エラーメッセージは、ERROR: function name "myfunc" is not unique
alter function myfunc owner to myname;

```

で、ハマった点として、CentOS7（PostgreSQL 9系）とCentOS8を使って作業をしていて、CentOS8でクエリを実行して問題なかったのに、CentOS7だとクエリが通らない、という状況に陥って、なんで？ってなった次第です。はい。

新しいバージョンだけ使っていくことが確定しているなら良いですが、9系もまだ使う、という場合は、注意が必要ですね。。。
rails初心者が使用したコードのおさらい

#はじめに
progateとドットインストールで`rails`の学習を行い、使用したコードの説明をしてみました。
学習の効率を向上させるためのアウトプットとしての活用なので、間違いがあればご指摘いただけると嬉しいです。

#使用したコードと説明
##コマンドライン
```
$ rails new myblog
```
アプリケーションを作成する。

```
$ rails g model Post title:string body:text
```
モデルとテーブルを作成する。
モデルとは、データベースとのやり取りを行うクラスのこと。
`string`は文字列、`text`は長い文字列を作成する。

```
$ rails db:migrate
```
データベースに変更を反映させる



```
$ rails g controller Posts
```
`controller`を作成する。
`controller`：ブラウザからリクエストを受け取り、model・viewとのやり取りをする役割を持つ。

```
$ rails routes
```
設定されているルーティングの内容を確認する。
ルーティング：受け取ったURLを認識し、適切なコントローラ内アクションに割り当てる役割を持つ。

```
$ rails c
```
`rails console`を実行する


```
$ rails s
```
railsのサーバを起動させる。

##controllser.rbファイルで使用したコード

```ruby
@post = Post.find_by(id: params[:id])
```
データベースから、該当するidを見つけて、そのデータを`@post`に代入する。

```ruby
@post.save
```
`@post`の中身をデータベースに保存する。

```ruby
@post.destroy
```
`@post`の中身をデータベースから削除する。
`destroy`アクションへのリンクを記述するときは、メソッドを記述する。

```ruby
def update
    redirect_to("フォルダ名/ファイル名")
end
```
`redirect_to`は、アクションを実行した後、指定したURLにページ遷移する。

```ruby
def update
    render("フォルダ名/ファイル名")
end
```
`render`は、別のアクションを経由せずに、指定したURLに直接viewを表示する。



```ruby
def update
    flash[:notice] = "表示させたい文字を入れる"
end
```
`<%= flash[:notice] %>`を記述した箇所に、フラッシュメッセージを表示させる。
フラッシュメッセージの特徴は、ページ上に一度だけ表示されること。

```ruby
def index
    @posts = Post.all
end
```
全てのデータを取得する。

##新しくページを作成する手順
例として詳細ページを作成する手順を見ていきます。
そのため、アクション名は`show`とします。
コントローラ名は、コマンドラインの項目で記述した`posts`とします。
手順は３つありますが、どの手順から行っても問題ないです。

```ruby:posts_controller.rb
def show
end
```
①`controller`ファイルに`show`アクションを追加する。


```ruby:routes.rb
get "posts/:id" => "posts#show"
```
②`show`アクションへのルーティングを追加する。

③作成したアプリケーションの中にある`app`→`views`→`posts`フォルダの中に、`show.html.erb`を作成する。

##リンクを作成する
`index`から詳細ページへ移動するリンクを見てきます。

```erb:index.html.erb
<%= link_to(post.content, "/posts/#{post.id}") %>
```
`link_to`メソッドは`<a>`タグに相当する。
この場合、`post`に記述してあるテキストがリンクになり、データベースから取得した`id`のページに移動する。

##フォームに入力した内容をデータベースに保存する

```erb:new.html.erb
<%= form_tag("/posts/create") do %>
  <textarea name="content"></textarea>
<% end %>
```
`form_tag`は、入力フォームの値を送信する。
送信する値を指定するために、`name`属性を設定する。

```ruby:posts_contoroller.rb
@post = Post.new(content: params[:content])
@post.save
redirect_to("/posts/index")
```
入力フォームから受け取ったデータをデータベースに保存する。
保存後に、`index.html.erb`ページに移動する。

##カラムを追加する
```common-lisp:ターミナル
rails g migration ファイル名
```
①マイグレーションファイルを作成する。

```ruby
def
  add_column :テーブル名, :カラム名 , :データ名
```
②マイグレーションファイルの中身を記述する。

```common-lisp:ターミナル
rails bg:migrate
```
③データベースに保存する。

#最後に
とにかく`rails`で成果物を作れるくらいに学習を進めていきたいと思います！
libmysqlclient.so.18: cannot open shared object file: No such file or directoryの解決法

# 問題
本番環境の自分のアプリのディレクトリで rake db:create RAILS_ENV=production したら
以下のエラーが表示された。

# エラー
```
libmysqlclient.so.18: cannot open shared object file: No such file or directory
```
# 解決手順
#### ① mysql2というgemをアンインストール

```
$ gem uninstall mysql2
```

#### ② mysql2というgemをインストール
```
$ gem install mysql2
```
以下のエラーが出る。

```
ERROR: Error installing mysql2:
ERROR: Failed to build gem native extension.
```
解決方法を提示してくれる。

```
mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again.
```

#### ③ mysql-develをインストール 
```
sudo yum install mysql-devel
```
ここまでやって rake db:create RAILS_ENV=production すると、「bundle installして」と言われる。

```
Could not find mysql2-0.5.3 in any of the sources
Run `bundle install` to install missing gems.
```
#### ④ bundle install
言われたとおりbundle installしたら、今度こそ rake db:create RAILS_ENV=production できました🎉

# 参考記事
[MySQLのバージョンを5.1から5.7にしてRubyからMySQLに接続する際にlibmysqlclient_r.so.16: cannot open shared object file: No such file or directory](https://tackeyy.com/blog/posts/fix-libmysqlclient-r-so-16-cannot-open)
Amazon Linux 2(EC2)で時刻（タイムゾーン）と言語を日本に設定

Amazon Linuxが安いのでよく使います。が、毎回タイムゾーンと言語設定を直しています。
（日本は時差ないし、母国語は日本語だけだがら、作成したリージョンに対応したタイムゾーンと言語に設定して欲しい）

## 時刻（タイムゾーン）を日本へ

```bash:設定
sudo timedatectl set-timezone Asia/Tokyo
```

* ★1が日本時間
* *1がタイムゾーン

になっていれば設定完了です。

```bash:確認
[ec2-user@ip-10-x-x-x ~]$ sudo timedatectl
      Local time: 水 2020-09-30 14:29:43 JST ★1
  Universal time: 水 2020-09-30 05:29:43 UTC
        RTC time: 水 2020-09-30 05:29:43
       Time zone: Asia/Tokyo (JST, +0900) ★2
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
```

## 言語を日本へ

今回は文字コードをUTF-8に設定します。
以下```localectl```で設定します。

```bash:設定
sudo localectl set-locale LANG=ja_JP.utf8
```

★のようになっていれば設定完了です。

```bash:確認
[ec2-user@ip-10-x-x-x ~]$ sudo localectl
   System Locale: LANG=ja_JP.utf8 ★
       VC Keymap: n/a
      X11 Layout: n/a
```
UIとサーバーサイドの関連性について

自身、UIを極めたいという漠然としたキャリアプランを立てているが、色々ありサーバーサイドエンジニアとしてWEARのWEBのリプレイスの仕事をさせて頂いています。数多くの先輩からUIとサーバーサイドは繋がっているというアドバイスを頂いてたが、腹落ちする具体例が見つからず、疑問に思う時期もありました。しかし最近、UIに関係したサーバーサイドのタスクを振って頂き、業務を進めるうちに「UIとサーバーサイドの関連性について知ることができてきた」ので記録に残そうと思います。


UIとサーバーサイドの関連性について気づくきっかけとなった業務は、
以下のWEARのWEBのお気に入りブランド画面のリプレイスです。
<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/b94999ab-6e37-cd61-a29c-a160830c5c19.png">
https://wear.jp/member/edit/




####お気に入りブランド画面のリプレイス前に抱えていた問題

##### 問題１、レスポンスタイムが遅く、ユーザー体験として良くない問題。

以下の動画のように、モーダルを表示するまでの時間が`約５秒`かかる問題がありました。
その原因は`「一度に数万件にも及ぶブランドを全件取得」`していてレスポンスに時間がかかってしまっているからでした。これではユーザー体験としては良くないです。

<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/73c21a63-b050-8757-fe6e-7d4787c9e7db.gif">


##### 問題２、Webとアプリで仕様・UIが違うせいか、ユーザーが混乱してしまう問題。

また、以下の画像のようにWebとアプリで仕様・UIが統一されていなくユーザーも混乱してしまう問題もありました。具体的にはWebは`ブランドを名前順で全件取得`、アプリは`ブランドを人気順TOP30を取得`といった具合です。


WEBの画面
<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/b94999ab-6e37-cd61-a29c-a160830c5c19.png">


アプリの画面
<img width="300px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/b9bfc1c4-7ccc-bd44-1750-77198e64cb0e.png">


##### 問題３、Webとアプリで仕様・UIが違うせいか、違う挙動のAPI・テストを実装しなければならない問題。

また、同じお気に入りブランドの登録ページなのにも関わらず仕様・UIが違うので、
WEB用・アプリ用で違う挙動のAPI・テストの実装をしなければならない問題がありました。
仕様・UIが統一されていたら、APIとテストの実装は似た感じになるので、実装者の負担が減るはずです。


####リプレイスでどう解決したか？
#####解決策：WEBもアプリとほぼ同じ仕様・UIにしました。 具体的には、ブランドを人気順TOP100で表示するようにしました。

<img width="500px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185492/05d2b4d8-f075-3ceb-1454-8b514c3296fd.gif">

よって、以下のメリットが生まれました。
・上位100件に絞っているのでレスポンスタイムに時間はかからないのでユーザー体験として良い。（問題１を解決）
・Webとアプリで仕様・UIが統一されているので、ユーザーが混乱することはない。（問題２を解決）
・Webとアプリとで仕様・UIが統一されていることは、WebとアプリでAPI・テストの実装の差分が少なく、開発者の負担が減る。（問題3を解決）



####教訓

このリプレイスの業務を経験通して以下の教訓を得ました。
・Webとアプリの仕様・UIはできるだけ統一させた方が良い。
・UI次第でレスポンスタイムが変わってくるので、UIの知識とサーバーサイドの知識両方持つに越したことはなさそう。


####感想
今回の業務を通して、Webとアプリの仕様・UIは統一させることのメリットを心底理解しました。UIに関わるタスクを振っていただき感謝です。
grep で特定ファイルを無視をしたい

# git grep と ripgrep で特定のファイル/ディレクトリを無視をしたい

## git grep

https://qiita.com/laiso/items/6a453abdf3998a3475eb

リポジトリ毎に指定したかったので，`.git/config` に指定した

```config:.git/config
[grep]
    defaultFile = :!ignoredDirectory
```

```zsh:~/.zshrc
function gg () {
  git grep $* `git config grep.defaultFile`
}
```

## rg も同じ設定を使いたい

https://qiita.com/ktrysmt/items/70fa1d4e88e0d362c410

```zsh:~/.zshrc
export RG_DEFAULT_OPT='-p'
function rg() {
  # separated by :
  typeset -a glob;
  for p in ${(@s.:.)$(git config grep.defaultFile)}; do
    glob+=(--glob $p)
  done
  command rg $RG_DEFAULT_OPT "$@" "${(@)glob}"
}
```

古いもの(クォートがうまくない)

```zsh:~/.zshrc
export RG_DEFAULT_OPT='-p'
function rg() {
  local glob=`git config grep.defaultFile | sed -e 's/:/--glob /g'`
  if [[ ! -z "$glob" ]]; then
    eval command rg $RG_DEFAULT_OPT $* $glob
  else
    eval command rg $RG_DEFAULT_OPT $*
  fi
}
```

`!` しか無い前提だけど，とりあえずこれでやりたいことはできる．

# LINK

http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion

https://qiita.com/mollifier/items/f897b3fddd2d10369333
中国からのアクセスをブロック

Google Cloud Platformを使用しているサイトについて、
色々あって中国からのアクセスをブロックする事とした。

これを参考に中国からのアクセスをブロックした。
[Google Cloud Platform で特定の国からのアクセスをブロックする方法](https://gotohayato.com/content/520/)

gloudコマンド実行時に「Insufficient Permission: Request had insufficient authentication scopes.」が出た件は
Cloud SDKツールの許可が必要だったので、以下を参考に解決した。
[GCPでgcloudコマンドを利用する](https://qiita.com/average_nobody/items/87eb9ab434ab9d9f8637)
ffmpegインストール

Windows10にインストール実施(実施日2020/09/30)

下記を参考に実施
[【windows】FFmpegをインストールする手順](https://fukatsu.tech/windows-ffmpeg#FFmpeg)

FFmpegの公式ページをのリンク
Windows builds from gyan.dev を選択

※Windows builds from gyan.devのリンクは下記
[CODEX FFMPEG](https://www.gyan.dev/ffmpeg/builds/)

releaseのLinks
"ffmpeg-release-full.zip"をダウンロード

ダウンロードしたzipを解凍し"C:\ffmpeg"にコピーする