OmniAICreator/Qiita-1.07M huggingface dataset:
［Android］エミュレータで Screen Pinning (画面の固定) を解除する方法

# 問題

Screen Pinning(画面の固定)の解除は 戻るボタンとタスクボタンを長押しすることで解除できるが、エミュレータではマルチタップが上手くできなくて解除できない。ちなみに Screen Pinning (画面の固定)とは次のように戻るボタンやタスクボタンなどを効かなくして他のアプリを起動できなくするモードのことです。

| 画面固定設定を変更する | アプリを画面固定する | ボタンが効かなくなる |
| ------- | ------- | ------- |
| <a href="https://gyazo.com/41afc4fff1cd2bf4b9e9991a6951901a"><img src="https://i.gyazo.com/41afc4fff1cd2bf4b9e9991a6951901a.gif" alt="Image from Gyazo" width="250"/></a> | <a href="https://gyazo.com/ab8972b1cd41a42b12d6e019466d410d"><img src="https://i.gyazo.com/ab8972b1cd41a42b12d6e019466d410d.gif" alt="Image from Gyazo" width="250"/></a> | <a href="https://gyazo.com/2939903220b3ad3c367a6c0bce87cc90"><img src="https://i.gyazo.com/2939903220b3ad3c367a6c0bce87cc90.gif" alt="Image from Gyazo" width="250"/></a> |

# 解決方法

## ADB コマンドで解除する

次の ADB コマンドを実行すれば Screen Pinning(画面の固定)は解除できる。

```
adb shell am task lock stop
```

<a href="https://gyazo.com/5d3fa828ca53fe5c306991baa0d6d67e"><img src="https://i.gyazo.com/5d3fa828ca53fe5c306991baa0d6d67e.gif" alt="Image from Gyazo" width="250"/></a>

## Command + 右クリック + 左クリックで解除する

エミュレータ種類によってはできないこともあったのですが Macだと Command + 右クリック + 左クリックで解除できます。（Linuxだと Ctrl Left + 右クリック + 左クリックで解除できます。）


<a href="https://gyazo.com/89c4c7049fe0d2e326f0115fe1b1425c"><img src="https://i.gyazo.com/89c4c7049fe0d2e326f0115fe1b1425c.gif" alt="Image from Gyazo" width="1392"/></a>
Unity で動画をテクスチャとして使用する

VideoPlayer を使う．かつて使用されていた MovieTexture は現在は非推奨 (deprecated) である．
# GameObject に貼る
VideoPlayer コンポーネントを GameObject に追加する．
<img width="292" alt="2020-08-07_23h53_42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53034/590f4b7e-54c8-9e94-a31e-f4c1c0d02ba5.png">
## 動画ファイルを Unity の管理下に置く
再生する動画ファイルを，Video Clip Asset として import する．ここではテストのため，https://www.pexels.com/ から CC0 ライセンスで利用可能な動画をダウンロードし，フォルダ VideoClips を作成した中に import した．
<img width="137" alt="2020-08-08_00h03_37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53034/3399d42f-b379-4f8c-709f-cefad154e7cc.png">
この動画を，Video Player コンポーネントの Video Clip 欄に drag & drop する．
<img width="292" alt="2020-08-08_00h07_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53034/06670d92-a77c-8745-f25c-578203d87317.png">
実行すると動画が再生される．
<img width="573" alt="2020-08-08_00h14_18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53034/8487c058-c280-118b-18ef-6c8a5cba2a14.png">
元の動画(横:縦=16:9)を正方形(横:縦=1:1)に割り当てたため，やや縦長で再生されてしまう．
対象となる GameObject の Scale を変更することで対応する．
<img width="292" alt="2020-08-08_00h19_19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53034/d02a0dbf-6936-1359-c0d2-529a6e44ef0b.png">
## 動画ファイルを別に管理する or ダウンロード
Video Player コンポーネントの Source をプルダウンメニューで Video Clip から URL に変更し，新しく表示された URL 欄に適切な URL を記述する．ファイルシステム内のファイルであれば file:// で記述する．
<img width="292" alt="2020-08-08_00h35_26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53034/96229304-1be6-d0eb-5306-727cc4373e58.png">
# カメラの背景に貼る
Video Clip コンポーネントを Main Camera に追加すると，カメラの背景が動画になる．
<img width="573" alt="2020-08-08_00h41_07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53034/dd356d92-bbf6-8659-f7a7-8a2d1401c2ec.png">
JS URLのクエリをオブジェクトに変換する

#本文

JavaScriptでURLのクエリ部分をオブジェクトに変換するための関数群です。車輪の再発明だと思いますが毎回調べるので記録します。引数は型チェックしていません。

```js
// URLからクエリ（?以降）を抜き出します。
function urlGetQuery(url) {
	const i = url.indexOf("?");
	return (i != -1) ? url.substring(i + 1) : null;
}

// URLのクエリから「=」より前をキー、後を値に持つオブジェクトを作成します。
function createQueryObjectForUrlQuery(query) {
	return Object.fromEntries(query.split("&").map(s => s.split("=")));
}

// URLからクエリを抜き出して、クエリの「=」より前をキー、後を値に持つオブジェクトを作成します。
function createQueryObjectForUrl(url) {
	return createQueryObjectForUrlQuery(urlGetQuery(url));
}
```

Google検索でYahooと調べた結果に適用すると次のようになります。

```js
// Google検索でYahooを調べたときのYahoo!のURL（改変）
const url = "https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&url=https%3A%2F%2Fwww.yahoo.co.jp%2F&usg=...";
// URLからクエリ部分のオブジェクトを作成
const query = createQueryObjectForUrl(url);

// 全体を出力
console.log(query);
//>> Object { sa: "t", rct: "j", q: "", esrc: "s", source: "web", url: "https%3A%2F%2Fwww.yahoo.co.jp%2F", usg: "..." }

// urlをURIデコードして出力
console.log(decodeURIComponent(query.url));
//>> https://www.yahoo.co.jp/
```

# 蛇足

- `Object.fromEntries`にキーと値の配列を与えることで対応するオブジェクトが作成できます。
- URLをデコードする関数は`decodeURI`と`decodeURIComponent`があります。今回は「:」「/」のような特殊文字もデコードしたいので`decodeURIComponent`を使用しています。
- Internet Explorerを考慮しない場合は`Object.fromEntries`と`URL.searchParams`の組み合わせが使えます（コメントより）。
【Python】データサイエンス100本ノック（構造化データ加工編） 021 解説

- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

##Youtube
[動画解説](https://youtu.be/6YwPPVoFwE4)もしています。

##問題
P-021: レシート明細データフレーム（df_receipt）に対し、件数をカウントせよ。

##解答
```:コード
len(df_receipt)
```

```:出力
104681
```

##解説
・PandasのDataFrame/Seriesにて、行数をカウントする方法です。
・行数が全部で何件あるのかを確認したい時に使用します。

※他にも、行数や列数を確認したい時によく使用する関数があります

- 行数や列数などの情報を要約して表示します

```:コード
df_receipt.info()
```
```:出力
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 104681 entries, 0 to 104680
Data columns (total 9 columns):
 #   Column          Non-Null Count   Dtype 
---  ------          --------------   ----- 
 0   sales_ymd       104681 non-null  int64 
 1   sales_epoch     104681 non-null  int64 
 2   store_cd        104681 non-null  object
 3   receipt_no      104681 non-null  int64 
 4   receipt_sub_no  104681 non-null  int64 
 5   customer_id     104681 non-null  object
 6   product_cd      104681 non-null  object
 7   quantity        104681 non-null  int64 
 8   amount          104681 non-null  int64 
dtypes: int64(6), object(3)
memory usage: 7.2+ MB
```

- 列数を表示します

```:コード
len(df_receipt.columns)
```

```:出力
9
```

- 行数、列数を表示します

```:コード
df_receipt.shape
```
```:出力
(104681, 9)
```

- 全要素数（サイズ）を表示します

```:コード
df_receipt.size
```
```:出力
942129
```
Ruby で HTTP リダイレクト先の URL を取得する

## 概要

- Ruby で HTTP リダイレクト先の URL を取得する
- 動作確認環境: Ruby 2.7.1 + macOS Catalina

## ソースコード

get_redirect.rb というファイル名で以下の内容を保存する。

```get_redirect.rb
require 'net/http'

# コマンドライン引数を取得
src_url = ARGV[0]

# リダイレクト先URLを取得
redirect_url = Net::HTTP.get_response(URI.parse(src_url))['location']

# リダイレクト先URLを出力
puts redirect_url if redirect_url
```

実行例。

```
$ ruby get_redirect.rb https://bit.ly/3kmTOkc
https://t.co/yITSBp4ino
```

```
$ ruby get_redirect.rb https://t.co/yITSBp4ino
https://qiita.com/niwasawa
```

```
$ ruby get_redirect.rb https://qiita.com/niwasawa
```

## 参考資料

- [library net/http \(Ruby 2\.7\.0 リファレンスマニュアル\)](https://docs.ruby-lang.org/ja/2.7.0/library/net=2fhttp.html)
- [HTTP のリダイレクト \- HTTP \| MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Redirections)
- [Location \- HTTP \| MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Location)
direnvでpython環境構築

## direnv
インターンでフロントのReactサーバとやりとりするAPIサーバの環境構築にdirenvを利用することになった。
direnvを使うメリットはディレクトリごとに環境変数を使い分けられるというところ。
今回は対象ディレクトリにpython3.8にしたく、.envrcに以下を記述

```
layout python3
```
これでここのディレクトリでpython -vをするときちんと3.8が適応されていることを確認。

（参考）
https://qiita.com/kompiro/items/5fc46089247a56243a62
EC2 Amazon Linux 2  + nginx で Laravel の環境構築の際によく使うコマンド


## yumアップデート
```
sudo yum update -y
```

## nginxのインストール
```
sudo amazon-linux-extras install nginx1.12 -y

// nginxの起動
sudo systemctl start nginx

// 自動起動設定（これをやっておくとEC2再起動などの際に自動で起動してくれる）
sudo systemctl enable nginx

// nginxのステータス確認（起動失敗時などに調査で使用する）
systemctl status nginx.service

// nginxでPHPを動かす際はこの設定ファイル内のapacheをnginxに変える
sudo vi /etc/php-fpm.d/www.conf
```

## PHPのインストール
```
sudo amazon-linux-extras install php7.3 -y

// Laravelを動かすためには　php-xmlとphp-mbstringが必要
sudo yum install php-xml php-mbstring -y
```

## MySQLのインストール
```
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm -y
sudo yum install mysql-community-server -y
sudo systemctl start mysqld.service
sudo systemctl enable mysqld.service
```

## Composerのインストール
```
sudo curl -sS https://getcomposer.org/installer | php

// パスを通す
sudo mv composer.phar /usr/local/bin/composer
```

## Laravelのインストール
```
// インストール先のディレクトリに権限を付与する
sudo chmod -R 777 /usr/share/nginx/html

cd /usr/share/nginx/html

composer create-project --prefer-dist laravel/laravel app_name
```

## Laravelのセットアップ
```
cd app_name

cp .env.example .env
```

## php artisan コマンドを使えるようにする
```
composer install
```
シェルで配列を使う方法

###シェルで配列を使用する
最近使ったシェルの配列化方法を忘れないように残す。

####ポイント
・区切り文字 IFSで 指定する
・変数を ()で囲んで 配列化
・配列は [n]指定で 使用する

(ちょっと標語っぽくしてみた）

#####シェル
```
#区切り文字を定義(デフォルトはtab and スペース区切り)
OLD_IFS=${IFS}
IFS=','

#配列にするデータ
line="a,b,c,d"
echo "line=${line}"

#配列に格納。変数を()で囲むのがお作法
aline=(${line})

#配列全体を表示する。
echo "aline[@]=${aline[@]}"

#配列の先頭列を表示する。
echo "aline[0]=${aline[0]}"

#配列の4列目を表示する。
echo "aline[3]=${aline[3]}"
```

#####結果
```
[oracle@test ~]$ ./test.sh
line=a,b,c,d
aline[@]=a b c d
aline[0]=a
aline[3]=d
```
Array.prototype.filterメソッドを甘く見ていた…

今まであまり意識しなかったのですが、配列要素を削除する際に5行以上かけていたのですが、1行でシンプルに完結できて感動したので共有します。

今までの自分のコード


```
const array = [0, 1, 2, 3, 4];

console.log(`before : array = ${array}`);

array.forEach((item, index) => {
    if(item === 1) {
        array.splice(index, 1);
    }
});

console.log(`after : array = ${array}`);
```

今後

```
const newArray = array.filter(n => n !== 1);
```


(*IEで動かすには、BabelやTypescriptでコンパイルする必要があります)


今まで自分が書いてたコードの拙さを思い知らされました…




関数型プログラミングという概念があります。
JavascriptでいうとElmが有名かと思います。
最近になって知り合いの話を聞くと、この関数型プログラミングを学んでおくと、かなりエンジニアとしての地力がつくと教えられました。
その知人は、Elmを学んだ事でTypescriptやReact, Reduxといった概念がスッと理解できるようになったとか。


他にも、(知り合いの超スゴいエンジニアの方いわく)今や、JSでfor分を使うのはあまりパフォーマンスの観点からよくなくて、Array.prototype.reduceを使うのが良いらしいです。
調べて見たら、こちらも(使いこなせるようになるまで時間はかかりそうですが)体得できればよりシンプルにコードを書けそうです。
関数型プログラミングの一種だそうです。



………コードの書き方1つとっても、奥が深くて覚える事がいっぱいだーーーー！！！！(だからこそ、プログラミングは面白い)
2段階認証と2要素認証の違い

同じだと思っている人も多いと思うので、整理しました。

厳密には2段階認証と2要素認証は別物です。


#２段階認証とは？
- 2段階認証：**同じ認証方式**

　ex) パスワード認証を２回求める

######※ IDとパスワードの認証をそれぞれ求める場合は2段階認証に該当する。

- この2段階認証自体にはそれほどセキュリティを高める効果はないらしい。

#2要素認証とは？
- 2要素認証：**異なる認証方式**

ex)パスワード認証と電話番号認証をそれぞれ求める

- 2要素認証のことを2段階認証だと誤解しているケースが多い。

- 傾向として、トークン(一度限りの有効なパスワードを生成する仕組みのこと)を使った認証方法が増えている。
curl コマンドで HTTP リダイレクト先の URL を取得する

## 概要

- curl コマンドで HTTP リダイレクト先の URL を取得する
- 動作確認環境: curl 7.71.1 + macOS Catalina

## 使用するオプション

- -w, --write-out : "%{redirect_url}" を指定してリダイレクト先URLを出力する
- -s, --silent : サイレントモード。プログレスバーやエラーメッセージを出力しない
- -o, --output : /dev/null を指定してレスポンスボディを出力しない

## 実行例

```
$ curl -w "%{redirect_url}" -s -o /dev/null https://bit.ly/3kmTOkc
https://t.co/yITSBp4ino
```

```
$ curl -w "%{redirect_url}" -s -o /dev/null https://t.co/yITSBp4ino
https://qiita.com/niwasawa
```

```
$ curl -w "%{redirect_url}" -s -o /dev/null https://qiita.com/niwasawa
```

## 参考資料

- [curl \- How To Use](https://curl.haxx.se/docs/manpage.html)
エンジニア登壇のすゝめ

2020年2月にはじめて外部イベントで登壇をしました。
社内向けに自分の初登壇時の経験を投稿しましたが、社内に閉じる必要もないと思い、まとめなおしてQiitaに投稿します。

結局伝えたいことは[記事の最後](https://qiita.com/ko-flavor/items/d7ebf1990d11807a9c61#自分の初登壇の体験を通して伝えたいこと)に書いているので、
お忙しい方はそちらだけでも見てくださると嬉しいです。

## 勢いで登壇応募してみた

ちょうど、オブジェクト指向に興味が出てきてしばらくした頃、
OOC(Object Oriented Conference)というオブジェクト指向のイベントがあることを見つけました。
もちろん参加申し込みをしたのですが、スピーカーも募集していたのを発見・・・！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/58ebcc1d-7e7c-a1c6-69ba-fee58bf3955a.png)


「素人の自分なんかが・・・」と思っていましたが、採択されなかったとしても特段デメリットもないと思いなおし、
プロポーザルを頑張って書いてみました。

ちょうど運よくその頃社内の勉強会で発表していたので、その内容で発表しようと決断。
書いているうちに本気で採択されたいと熱が入り、3時間くらいかけてプロポーザルを書き上げました。

後日、、、なんと採択されました。:v: 
自分の初登壇までの準備とやってみた感想を共有したいと思います。

#### 自分の宣伝
イベントページは[こちら](https://ooc.dev/)
登壇資料は[こちら](https://speakerdeck.com/koheiokamoto/ooc2020)

## 初登壇のプレッシャー

2週間前まではプレッシャーに押しつぶされていました、休日になると登壇のことで頭がいっぱいになってました。
資料作りも難航していて、パソコンを開いて「どうしようどうしよう」って悩んでパソコンを閉じる日々が続きました。


**はじめての発表は緊張するのは仕方ないと思います。**たぶん人間そんなもんです。
これから初登壇迎える方も緊張している自分を受け入れてあげてください。

あとから振り返ってみると、
緊張するってことはそれだけストレッチができているということなのかなって思います。

## フィードバックループを回して準備をする

スライドが全く完成していない状態で2週間前の休日を迎えました。
登壇することは決まっているのでとにかく実際に手をつけはじめました。

最初は紙に雑な絵を描いてスライドのイメージを作りました。
その紙を使って発表してみたのが自分の最初の発表練習です。

**実際に声に出して**発表練習すると、必要な情報、不要な情報が見えてきます。
固まってきたら、パワポを作成しました。
発表練習して、資料にフィードバックしてというサイクルを何回も何回もまわしました。

ここまで練習すると不安はどっかに飛んで行ってました。
**資料はまず紙でもいいから作ってみて、フィードバックループを回すのがよいと思います。**

## いざ登壇

朝。めちゃくちゃ緊張してましたが、とりあえず会場に。
他の方の発表を聞いているうちに刺激をもらいながらも、緊張もほぐれてきました。

[平鍋さんの登壇](https://www.slideshare.net/hiranabe/modeling-in-the-agile-age-228224347?ref=https://cards-frame.twitter.com/i/cards/tfw/v1/uc/1228937758632136704)がすごく印象に残っていて、その発表を真似たスライドを急遽追加しました。
また、当日の聴衆の雰囲気を見て、アドリブも多少いれようと決めました。

(↓追加したかっこいいスライド↓)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561891/086fbb79-3d49-5844-5cc0-e22d72f239e7.png)


いざ登壇！というときは、案外緊張しませんでした。

自分の中でこのスライドになったら自分を振り返ろうと決めていたスライドがあって、
そこのチェックポイントで自分の目線が画面とかスクリーンにいっていることに気づいたりして修正できました。

スライドの内容は意識せずとも話せるようになっていたので、
会場の雰囲気を見つつアドリブをどういれようかと考えながら話せました。

聴衆の雰囲気にもよりますが、
**可能なら当日用意した内容を交ぜるとよさそう**と実験してみてわかりました。
当日急遽スライドを足したりアドリブをいれたりできたのは大正解だったなと思います。

## 登壇後

会場の反応でまあまあ手ごたえは感じていたのですが、
twitterでの反応がすごく優しくてびっくり。

登壇前は「内容薄っ！」「これ間違ってね？」など言われないか不安だったのですが、
「良い話だった。」「めっちゃいいセッションだったわー。」など温かい反応をいただけました。
やさしい世界だなと。すごくうれしかったです。
登壇見てくださって、コメントしていただいた方々ありがとうございます。:relaxed: 

懇親会でも自分でもよく知っているエンジニアの方と会話できたり、
コンテキスト違うエンジニアと話して刺激をもらったり、モチベーションも向上しました。

## 自分の初登壇の体験を通して伝えたいこと

- 話すネタだけでも用意しておくと、登壇チャンスあるときに掴みやすい
- 準備しているときはしんどかったですが、登壇して自信がつきました
  - きちんと準備すればできる
  - リアクションがtwitterなどで見れるのはすごくうれしい
- **世界は思ったより優しい**ので、恐れずにアウトプットしていきましょう！
  - 日本のエンジニアの技術力をエンジニア同士で刺激・協力しあって上げていきたいです

この記事がきっかけで、
「LTやってみよう！」「今度発表聞きに行ってみよう！」って思ってくれる人が一人でも増えてくれれば嬉しいです。

最後まで読んでいただきありがとうございました！
どこかのイベントでお会いするのを楽しみにしてます :smile:
【Laravel】コントローラから、テンプレートへの値の受け渡しメモ

コントローラから、viewテンプレートへ値を受け渡したいときは、複数の方法で記述できます。

基本的には、コントローラのメソッドで

```php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class SampleController extends Controller
{
    public function index()
    {
        // 
        return view('テンプレート情報', 配列);
    }
}
```
`index`メソッドの`return`以下のように、view関数の第1引数にテンプレート情報、第2引数にテンプレート側に送る配列を用意します。

例えば、

```php
class SampleController extends Controller
{
    public function index()
    {
        // 
        return view('index', ['message' => 'メッセージです。']);
    }
}
```
こんな感じで記述すると、第2引数のキーである`message`がviewテンプレート側で変数名として使用され、その変数に`メッセージです。`の値が用意される、という感じになります。

また、この`return view()`をスッキリしたコードにするために`compact`関数を使用することもお勧めです。

```php
class SampleController extends Controller
{
    public function index()
    {
        $message = [
             'message' => 'メッセージです。'
        ];

        return view('index', compact('message') );
    }
}
```

`view`関数内に連想配列を書く必要がないので、見やすくなると思います。
Swiftでの複数ファイルの扱い

Swiftで、複数ファイルの扱いがどうなっているのか調べてみた。具体的には、Rubyで言う require みたいのがどうなっているのかよくわからなかったので、調べてみた。
# Swift.org
Swiftの仕様等はこちらのサイトに集まっている。
複数ファイルの扱いは、まずはこちらにある。

https://swift.org/getting-started/#using-the-package-manager
> Swift package manager provides a convention-based system for building libraries and executables, and sharing code across different packages.

詳細は、こちら。
https://swift.org/package-manager

実際に作ってみよう。以下のようにする。

> % cd ~/dev
> % mkdir PackageManager
> % cd PackageManager
> % swift package init
> Creating library package: PackageManager
> Creating Package.swift
> Creating README.md
> Creating .gitignore
> Creating Sources/
> Creating Sources/PackageManager/PackageManager.swift
> Creating Tests/
> Creating Tests/LinuxMain.swift
> Creating Tests/PackageManagerTests/
> Creating Tests/PackageManagerTests/PackageManagerTests.swift
> Creating Tests/PackageManagerTests/XCTestManifests.swift

ビルドする際には、以下のようにする。

> % swift build

コマンドライン実行するようなプログラムの場合は、`--type executable`をつける。

> % cd ~/dev
> % mkdir Hello
> % cd Hello
> % swift package init --type executable
> Creating executable package: Hello
> Creating Package.swift
> Creating README.md
> Creating .gitignore
> Creating Sources/
> Creating Sources/Hello/main.swift
> Creating Tests/
> Creating Tests/LinuxMain.swift
> Creating Tests/HelloTests/
> Creating Tests/HelloTests/HelloTests.swift
> Creating Tests/HelloTests/XCTestManifests.swift

実行する際には、以下のようにする。

> % swift run Hello

省略形で、以下のようにもできる。

> % swift run

以下のようなファイルを作り、

```Sources/Hello/Greeter.swift
func sayHello(name: String) {
    print("Hello, \(name)!")
}
```

`Sources/Hello/main.swift`を以下のようにする。

```Sources/Hello/main.swift
if CommandLine.arguments.count != 2 {
    print("Usage: hello NAME")
} else {
    let name = CommandLine.arguments[1]
    sayHello(name: name)
}
```

すると、`main.swift`から、`Greeter.swift`の`sayHello`を呼び出せるようになる。

> % swift run Hello earth
> [4/4] Linking Hello
> Hello, earth!
> % swift run Hello \`whoami\`
> Hello, eto!

main.swiftの冒頭には、`require`や`#include`等の記述は無い。しかし、同じDirectoryにファイルがあるということで、同じPackageにあるとみなされ、呼び出される。これが、convention-based systemということ。convention-basedというのは、慣例にもとづくということ。単にファイルを置いただけで関連付けられるのは、楽で良さそうと思いつつ、恐いなという気持ちもある。

さて、ここまではわかったが、わからなかったのは、インタープリタで実行する方法だ。実行してみると、

> % cd ~/dev/Hello/Sources/Hello
> % swift main.swift
> main.swift:6:5: error: use of unresolved identifier 'sayHello'
>     sayHello(name: name)
>     ^~~~~~~~

となる。main.swiftからsayHelloを発見する方法が無いので、当然だ。main.swiftに`import Greeter`を追加しても、

> % swift main.swift
> main.swift:3:8: error: no such module 'Greeter'
> import Greeter
>        ^

となる。 import "Greeter.swift" や import "Greeter" も同様の結果になる。
どうやって読み込めばいいんだろう？
[Rails][Gem] mini_racer_extension.so: undefined symbol: _ZTTNSt7*  解決法




# 起こったこと

`Vagrant` `CentOS`7 環境に Rails プロジェクトに gem `react_on_rails` を導入して
React を動かそうとしたところ `rails generate react_on_rails:install
`
で

追加されていた依存する gem `mini_racer`
が以下のエラーを出してRails 起動しなくなった。

```
/home/vagrant/dev/rails-proj/vendor/bundle/ruby/2.6.0/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/
kernel_require.rb:23:in `require': 
/home/vagrant/dev/rails-proj/vendor/bundle/ruby/2.6.0/gems/mini_racer-0.3.1/lib/
mini_racer_extension.so: 
undefined symbol: _ZTTNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEE - /home/vagrant/dev/rails-proj/vendor/bundle/ruby/2.6.0/gems/mini_racer-0.3.1/lib/mini_racer_extension.so (LoadError)

```


# 原因

最近、gem `mini_racer` が version 0.3.x に上がったようで
不安定のよう。




# 解決法


とりあえず、gem `mini_racer` (最近0.3.xに上がったようなので) 、修正対応のある、最新のversion を取り入れる。

``` :Gemfile
gem 'mini_racer', git: 'https://github.com/rubyjs/mini_racer', platforms: :ruby
```


該当部分

https://github.com/rubyjs/mini_racer/commit/94cdb03211044f2e0620c6275525d09f84f26c78


https://github.com/rubyjs/mini_racer/issues/169

また、それでも直らない場合、参照している(この場合 `./vendor/bundle` 配下) の`mini_racer_extension.so` をコンパイルしなおす。
一旦ファイル削除して、再度`bundle install`
 
```
$ sudo chmod 777 -R ./vendor/bundle # すべて削除する場合
$ rm -rf ./vendor/bundle
$ bundle install --path vendor/bundle
```

## 補足2

また、発生していたので、、追記。

```
$ rails 
rails aborted!
LoadError: /home/vagrant/dev/rails-proj/vendor/bundle/ruby/2.7.0/gems/mini_racer-0.3.1/lib/mini_racer_extension.so: undefined symbol: _ZTTNSt7__cxx1119basic_istringstreamIcSt11char_traitsIcESaIcEEE - /home/vagrant/dev/rails-proj/vendor/bundle/ruby/2.7.0/gems/mini_racer-0.3.1/lib/mini_racer_extension.so
..

```

CentOS などOS の`GCC` が古いと使えない。
`GCC` version を上げて、
`bundle install` などでbuild native extension する。


```
$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)  # <- 古い
..
# gcc upgrade
$ sudo yum install centos-release-scl 
$ sudo yum install devtoolset-9
$ scl enable devtoolset-9 bash
$ gcc --version
gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2)

```
その上で、

```
# ↑ のGemfile 修正版branch 指定
$ rm -rf ./vendor/bundle
$ bundle install --path vendor/bundle
```



## 補足

最初は gem `mini_racer`を 安定版の`0.2.15` に戻したりしたが、
`libv8` などで特定のGCC version 依存があるようで、
OSの GCC version調整がいるようで、
とりあえずこれで。



```
$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)
```

https://www.cyberciti.biz/faq/centos-rhel-7-redhat-linux-install-gcc-compiler-development-tools/

https://stackoverflow.com/questions/36327805/how-to-install-gcc-5-3-with-yum-on-centos-7-2


# 参考

https://stackoverflow.com/questions/36327805/how-to-install-gcc-5-3-with-yum-on-centos-7-2


https://github.com/rubyjs/mini_racer/issues/169
UbuntuでOpenJDK11をインストール

## OpenJDK11をインストールする
```bash
$ sudo apt update
$ sudo apt upgrade -y
$ sudo apt install -y openjdk-11-jdk
```

## 環境変数JAVA_HOMEを設定する
```bash
$ cat >> ~/.bashrc <<'EOF'
# set JAVA_HOME adn append PATH
JAVA_HOME=$(readlink -f /usr/bin/javac | sed "s:/bin/javac::")
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin
export PATH
EOF
```

## bashrc更新
```
$ source ~/.bashrc
```

## 環境変数JAVA_HOMEを確認
```bash
$ echo $JAVA_HOME
/usr/lib/jvm/java-11-openjdk-amd64
```

## すでにjava11以外のバージョンをインストールしている人は、デフォルトのバージョンを切り替える

- javaコマンドのパージョンを切り替える

```bash
sudo update-alternatives --config java
```

- javacコマンドのバージョンとを切り替える

```bash
sudo update-alternatives --config javac
```
githubで特定チーム向けのリポジトリを作る手順

## 手順
1.所属組織（自分の会社、あるいは顧客の会社等）内にprivateでリポジトリを作成する
2.リポジトリの画面からSettings → Manage acceessを開く
3.invite team or peopleのボタンから、所属チームを追加する※

## 注意ポイント
- ※のとき、チームが階層構造になっていてもチーム名だけ記入すれば良い
- 具体的には、XXX company / hoge / fuga のような構造になっている場合でも、手順3.では所属チーム名"fuga"で検索し、追加すれば良い
AndroidStudioでEmacsのキーバインドにする

emacsのキーバインドに慣れているので、AndroidStudioでもそれを使う。

AndroidStudioのタブからPreferencesを選択
![スクリーンショット 2020-08-07 23.09.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321031/cfe4de44-cf18-b36e-d787-92592eaa88b7.png)

KeymapからEmacsを選択してOKボタンを押す
![スクリーンショット 2020-08-07 23.09.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321031/288e1e66-86aa-6d9c-58f2-f4b21a556f32.png)
Font Awesome Sass 5 をscssで使用する

# インストール
https://github.com/FortAwesome/font-awesome-sass

↑の順にimportを行ったらできます。

# 使い方
```icon.html
<div class="icon"></div>
```

任意のclass名をつける。

[アイコンのUnicode(ユニコード)](https://fontawesome.com/cheatsheet/free/solid)をcontentに記載

[scss](https://qiita.com/takeshisakuma/items/1c40c42f61c6e751c0e3)の書き方はこの記事を参考に

```icon.scss

.icon{
  &:before {
	content:'\f35a';
	font-family:'Font Awesome 5 Free'
	font-weight:900;
   }
}
```

実行結果↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528657/d9bf681c-d454-e757-8531-fe98076e7ddf.png)


ちなみに`content: "\f044";`とすると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528657/01722123-197f-ba3e-8743-ef974cdb64c4.png)

になります。
any?メソッドを使用してエラーメッセージの取得

エラーメッセージの表示の際に使用したメソッドをまとめたいと思います。

##any?メソッドとは

any?メソッドはすべての要素が偽である場合に false を返します。真である要素があれば、ただちに true を返します。

書き方はこのような感じ

```ruby
p [false, nil].any? # => false
```

例えばエラーメッセージの記述を部分テンプレートに記載してオブジェクトにエラー情報がある場合のみ表示するように設定するとします。

```ruby:app/controllers/items_controller.rb
def create
    @item = Item.new(item_params)
    if @item.save
      redirect_to root_path
    else
      render :new
    end
  end
```

この記述でバリデーション等で保存に失敗した際に
newアクションへ戻るように設定します。


```ruby:app/views/items/new.html.erb

  <%= form_with model: @item, local: true do |f| %>
      <%= render 'shared/error_messages', model: @item %> 
```

レンダー先にエラーの情報を持ったモデルオブジェクトを持っていきます。


```ruby:app/views/shared/_error_messages.html.erb

<% if model.errors.any? %>
<div class="error-alert">
  <ul>
    <% model.errors.full_messages.each do |message| %>
    <li class='error-message'><%= message %></li>
    <% end %>
  </ul>
</div>
<% end %>
```


any?メソッドでerrorsの中身を確認して存在する場合はtrueとなりエラーの繰り返し処理が働きます。

またpresent?メソッドとかなり似ていますがany?メソッドは



上記例では繰り返し処理でエラーメッセージ を表示していますが

labelの場所ごとにエラーメッセージを表示したい場合はinclude?メソッドを使ってもいいなと思います。
Python で HTTP リダイレクト先の URL を取得する

## 概要

- Python 3 で HTTP リダイレクト先の URL を取得する
- 動作確認環境: Python 3.8.5 + macOS Catalina

## ソースコード

get_redirect.py というファイル名で以下の内容を保存する。

```get_redirect.py
import sys
import urllib.request

# リダイレクトしないハンドラークラス
class NoRedirectHandler(urllib.request.HTTPRedirectHandler):
  # HTTPRedirectHandler.redirect_request をオーバーライド
  def redirect_request(self, req, fp, code, msg, hdrs, newurl):
    self.newurl = newurl # リダイレクト先URLを保持
    return None

# リダイレクト先 URL を取得する関数
def get_redirect_url(src_url):
  # リダイレクトしないハンドラーをセット
  no_redirect_handler = NoRedirectHandler()
  opener = urllib.request.build_opener(no_redirect_handler)
  try:
    with opener.open(src_url) as res:
      return None # リダイレクトしない URL だった
  except urllib.error.HTTPError as e:
    if hasattr(no_redirect_handler, "newurl"):
      return no_redirect_handler.newurl # リダイレクト先 URL を返す
    else:
      raise e # リダイレクト以外で発生した例外なので投げ直す

# コマンドライン引数を取得
src_url = sys.argv[1]

# リダイレクト先URLを取得
redirect_url = get_redirect_url(src_url)

# リダイレクト先URLを出力
if redirect_url is not None:
  print(redirect_url)
```

実行例。

```
$ python get_redirect.py https://bit.ly/3kmTOkc
https://t.co/yITSBp4ino
```

```
$ python get_redirect.py https://t.co/yITSBp4ino
https://qiita.com/niwasawa
```

```
$ python get_redirect.py https://qiita.com/niwasawa
```

## 簡略版

get_redirect.py というファイル名で以下の内容を保存する。

```get_redirect.py
import sys
import urllib.request

# リダイレクト先URLを取得する関数
def get_redirect_url(src_url):
  with urllib.request.urlopen(src_url) as res:
    url = res.geturl() # 最終的な URL を取得
    if src_url == url:
      return None # 指定された URL と同じなのでリダイレクトしていない
    else:
      return url # 指定された URL と異なるのでリダイレクトしている

# コマンドライン引数を取得
src_url = sys.argv[1]

# リダイレクト先URLを取得
redirect_url = get_redirect_url(src_url)

# リダイレクト先URLを出力
if redirect_url is not None:
  print(redirect_url)
```

実行例。
簡易版では、リダイレクト先の URL にリクエストを投げてしまったり、多段リダイレクトの場合は最終的な URL を出力する。

```
$ python get_redirect.py https://bit.ly/3kmTOkc
https://qiita.com/niwasawa
```

```
$ python get_redirect.py https://t.co/yITSBp4ino
https://qiita.com/niwasawa
```

```
$ python get_redirect.py https://qiita.com/niwasawa
```

## 参考資料

- [urllib\.request \-\-\- URL を開くための拡張可能なライブラリ — Python 3\.8\.5 ドキュメント](https://docs.python.org/ja/3.8/library/urllib.request.html)
- [urllib パッケージを使ってインターネット上のリソースを取得するには — Python 3\.8\.5 ドキュメント](https://docs.python.org/ja/3.8/howto/urllib2.html)
- [HTTP のリダイレクト \- HTTP \| MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Redirections)
- [Location \- HTTP \| MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Location)
【初心者でもわかる】CSSでボタン風のチェックボックス作る方法

# どうも7noteです。inputをボタン風にコーディングする方法を解説。

チェックボックスの☑デザインを変えるだけでなく、まるでボタンが並んでいるかのようなデザインに変更する方法を書いていきたいと思います。

## 見本
<img width="264" alt="mihon.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/ce5f8a0b-f17d-f1f8-6ee7-e1744fca114a.png">
※チェックボックスです


## ソース

```index.html
<p>どの動物をお供に連れていく？</p>
<label><input type="checkbox" value="いぬ" name="animal"><span>いぬ</span></label><!--
--><label><input type="checkbox" value="さる" name="animal"><span>さる</span></label><!--
--><label><input type="checkbox" value="きじ" name="animal"><span>きじ</span></label>
```

```style.css
label {
	margin-right: 5px; /* ボタン同士の間隔 */
}
label input {
	display: none; /* デフォルトのinputは非表示にする */
}
label span {
	color: #333; /* 文字色を黒に */
	font-size: 14px; /* 文字サイズを14pxに */
	border: 1px solid #333; /* 淵の線を指定 */
	border-radius: 20px; /* 角丸を入れて、左右が丸いボタンにする */
	padding: 5px 20px; /* 上下左右に余白をトル */
}
label input:checked + span {
	color: #FFF; /* 文字色を白に */
	background: #FBB; /* 背景色を薄い赤に */
	border: 1px solid #FBB; /* 淵の線を薄い赤に */
}
```

## 書き方の解説

ボタン風にする上で、デフォルトのチェックボックスについているデザインやcssは使えないので、
**最初にinputを`display: none;`にして非表示にします。**

**その後spanに対して、ボタン風（押されてない時）のデザインのCSSを書いていきます。**

そして、`input:checked + span`と書くことによって、**「チェックされたインプットの次のspan要素」に対してCSSを書く**ことができます。
これにより**ボタン風（押された時）のデザインのCSS**を書き分けることができます。

意外と簡単で綺麗にCSSの装飾を付けることができるので、オススメの方法です。
そして**inputとspanをlabelで囲むこと**によって、spanをマウスで押した時にもinputが反応してチェックがつく仕組みになるので、
labelは必ず入れましょう。

「+」や「~」などの隣接セレクタや間接セレクタの書き方は過去に書いたこちらの記事で詳しく解説しています。
→[【初心者でもわかる】CSSのセレクタ3種類の書き方（隣接セレクタ・間接セレクタ・直下セレクタ）](https://qiita.com/7note/items/48ff835be8a88d31bd17)

## まとめ

チェックボックスのデザインはデフォルトのままでもいいですが、少し味気なさがでるので、こだわったWEBサイト作りをするのであれば**ひと手間加えてオシャレなチェックボックスやサイトの雰囲気に合わせたボタン風にするなどができるとWEBデザインの幅が広がります。**
サンプルをそのまま持ってきてもいいですが、**自分で自由に作れた方が楽しい**かなと思います！
今後もそんな作るのが楽しい人向けに参考になる記事を書いていきます。

#### おそまつ！
（コメント・質問・ソースの指摘等なんでもウェルカムです！初心者の方でも気軽に質問ください！）
GitHub PagesでHello Worldしよう

#はじめに
[GitHub](https://pages.github.com/)のページを見ながら、GitHub PagesによるHello Worldページを作成したい。

#手順
##新しいレポジトリ作成
GitHubで「Create a new repository」ページでRepository nameを{ユーザ名}.github.ioを入力する。 
<img width="1013" alt="スクリーンショット 2020-08-07 14.27.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/db5d866d-e9f8-e4f4-cd8c-01fc5561a3d8.png">

##レポジトリをクローン
今回はMacのTerminalで行うこととする。
ページでは該当のフォルダーで`git clone https://github.com/{ユーザ名}/{ユーザ名}.github.io`でクローンするということだが、`remote: Repository not found.`エラーが出た。

[SouceTreeでCloneしたらremote: Repository not found.となった時の対応方法](https://qiita.com/ponsuke0531/items/4fe191b7bed03342cff2)によると、上記エラーの原因がユーザー名とパスワードを入力しないと認証できないためらしい。
上記エラーが出たら、下記コマンドでクローンする。

```
$ git clone https://{ユーザ名}:{パスワード}@github.com/{ユーザ名}/{ユーザ名}.github.io.git
```

##Hello World
該当ディレクトリで、index.htmlを作成。

```
$ cd {ユーザ名}.github.io
$ echo "Hello World" > index.html
```

##プッシュする
Gitの一連のコマンドを入力。

```
$ git add --all
$ git commit -m "Initial commit"
$ git push -u origin master
```

#ブラウザで確認
https://{ユーザ名}.github.io
上記URLで「Hello World」できているか確認する。
<img width="285" alt="スクリーンショット 2020-08-07 14.51.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/e7c60b65-0316-90ed-e0d0-7b3de7344cba.png">
Power BI（Power Query（M言語））でExcelの日付データのタイムゾーンを変更する

# 概要
Power Appsでアプリを作ってデータをExcelに出力する際に、日付は標準時間(UTC)で出力されるため、Power BIでそのまま読むと日本時間にならないので変換する必要がありました。
ちなみに、Power Appsは自動的に日本時間に変換します。
おまけに、Power Automateは日付のシリアル値を取るというちぐはぐな仕様になっています。

## やりたい事
単純に日本時間にずらすだけなら、時間に9を加算すれば良いのですが、日付が変わらないのでタイムゾーンを変更する方法をとることにしました。

## 目指す結果
Excelデータを読み込んで、Power BI側で日本時間に変換する。

|Excelデータ（標準時間）|Power BIデータ（日本時間）|
|:-------------------:|:-------------------------:|
|2020/8/7 15:46|2020/8/8 00:46| 
|2020/8/6 23:58|2020/8/7 08:58| 

## Excelデータ
Excelで以下のように登録されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/e17e0691-8454-9ab2-e310-2d37609595a7.png)

# 変換までの手順
ここからStep By Stepで変換までの手順を紹介します。
## Power BIで読み込み
1. Power BIを起動して、《データを取得》をクリックします。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/2dc50fac-476f-21ab-ec46-c5f9adaca4c1.png">

1.  Excelコネクタを選択し、《接続》をクリックします。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/00c598d7-1de5-54a3-db56-47f664182caf.png">

1. 対象のExcelファイルを選択します。

1. 対象のデータを選択し、《データの変換》をクリックします。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/eca3888e-d9ea-e6c9-2b70-62d46db0da8c.png">

1. 今は何もしていないのでそのままExcelデータが読み込まれています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/52faf62a-a951-d718-2945-fcff455c1bb8.png)

1. 《詳細エディター》をクリックして詳細エディターを開きます。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/5488a5a8-c4f7-9aa3-700c-c342a87214b7.png">

1. コードを以下の通りに書き換え、《完了》をクリックする。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/5912a05d-d431-2938-832b-2918c96771ce.png">


``` :書き換え前
let
    ソース = Excel.Workbook(File.Contents("C:\タイムゾーン変換.xlsx"), null, true),
    テーブル1_Table = ソース{[Item="テーブル1",Kind="Table"]}[Data],
    変更された型 = Table.TransformColumnTypes(テーブル1_Table,{{"timeRec", type datetime}})
in
    変更された型
```

``` :書き換え後
let
    ソース = Excel.Workbook(File.Contents("C:\タイムゾーン変換.xlsx"), null, true),
    テーブル1_Table = ソース{[Item="テーブル1",Kind="Table"]}[Data],
    変更された型 = Table.TransformColumnTypes(テーブル1_Table,{{"timeRec", type datetime}}),
    変更された型２ = Table.TransformColumns(変更された型, {{"timeRec", each DateTime.AddZone(_, 0, 0)}}),
    変更された型３ = Table.TransformColumns(変更された型２, {{"timeRec", each DateTimeZone.SwitchZone(_, 9), type datetimezone}}),
    変更された型４ = Table.TransformColumns(変更された型３, {{"timeRec", each DateTimeZone.RemoveZone(_), type datetime}})
in
    変更された型４
```
- コード説明
    - 変更された型２
        - Excelから読み取った日付にはタイムゾーンが付いていないので、DateTime.AddZone(_,0,0)で標準時間のタイムゾーンを付加する。
    - 変更された型３
        - タイムゾーンを標準時間からDateTimeZone.SwitchZone(_,9)で日本時間に変換する。
    - 変更された型４
        - タイムゾーンはPower BIでは必要ないのでDateTimeZone.RemoveZone(_)でタイムゾーンを削除する。

## 結果確認

日本時間に変換されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/520689/e4116907-1b7c-9819-6d3c-21342203b0a2.png)
【subprocess】Pythonのコードの中で別のPythonプログラムを実行したいとき

#はじめに
Pythonで書いたコードが複数あり、それらの開始をとある一つのプログラムに制御させたい――
そんなときありますよね。
今回はプログラムの中から他の起動させたいプログラムを非同期で実行させる方法を紹介します。

# 環境
Windows10
python 3.7.6
anaconda 20.02

#今回のメインコード

```
import subprocess

command = [python (ファイル).py (引数)]
proc = subprocess.Popen(command)  #->コマンドが実行される(処理の終了は待たない)
result = proc.communicate()  #->終了を待つ
```

#コード例

何の捻りもないコードですが、とりあえず動くかのお試しで２つのファイルを作成しました。
call.pyでは与えた引数を出力するようにできています。
コマンドはスペース区切りで””で囲んでリストにします。

```python:call.py
import sys
from time import sleep

sleep(1)  #一秒寝てもらう(非同期になっているか確認のため)
args = sys.argv[1]
print(args)
```

```python:main.py
import subprocess

command = ["python","call.py,"呼ばれた！"]
proc = subprocess.Popen(command)
print("呼び出し中")
proc.communicate()
```

**実行結果**
![0807_subprocesspopen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/680120/658ef7d8-ec9b-7ee8-55ff-451312fa363d.png)

先にmainの「呼び出し中」がprintされていることから、
**subprocess.Popen()で実行した処理を待っていない**ことがわかります。

#処理時間について
subprocess.Popen()で呼び出すと**処理時間**が気になります。
1280×800の画像に対して、下記の処理を行うcall_2.pyを呼び出してみます。

```python:call_2.py
from time import time
import numpy as np
import cv2

start =  time()

img = cv2.imread("sample.png")
resize = cv2.resize(img,dsize=None,fx=0.5,fy=0.5)  #resize

kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(resize,kernel)  #erode

cv2.imwrite("resize.png",erosion)

end = time() - start
print(end)
```

これでpython main.pyで実行した場合と、python call_2.pyで実行した場合の
printされるendの時間を比べてみました。
何度かコンソールを出入りして試しましたが、
**処理時間はほぼ同じ**でした。
(実際の数字は実行環境に因るかと思いますので割愛)

#おわりに
subprocess.Popen()で別のpyファイルを実行する方法を紹介しました。
今回使用したプログラムでは処理速度に差は出ませんでした。
速度面でのネックがないのは嬉しいですね。
ただ、環境がLinuxとかだともしかしたらかわるかもしれません。

以上、ご参考になれば幸いです。

#参考資料
**下記サイトも是非ご参考にしてください**
[公式ドキュメント(Python3.8.5)](https://docs.python.org/ja/3/library/subprocess.html)
[実行したいファイルが別のディレクトリに存在する場合](https://srbrnote.work/archives/4110#toc5)
[Pythonからシェルコマンドを実行！subprocessでサブプロセスを実行する方法まとめ](https://dev.classmethod.jp/articles/python-subprocess-shell-command/)
[subprocessでPythonからLinuxコマンド実行](https://jellyware.jp/kurage/raspi/subprocess.html)

**参考になりそうな本(単に自分が読んでみたい…)**
[エキスパートPythonプログラミング改訂２版](https://www.amazon.co.jp/exec/obidos/ASIN/4048930613)
配列内のアイテム順を無視してオブジェクトの比較が行えるChaiのプラグイン

# 目的
Chaiを使ったテストコードで、オブジェクトの比較を行う際に、配列内のアイテム順を無視して比較を行う必要があった。Chaiには[deep-equal-in-any-order](https://www.chaijs.com/plugins/deep-equal-in-any-order/)と言うプラグインがあり、配列内の順番を無視して、「配列内のどこかに同じ値があればパス」として比較をしてくれる。

# 公式ドキュメント
Chaiのサイトにドキュメントがある。
https://www.chaijs.com/plugins/deep-equal-in-any-order/

# TypeScriptで使ってみる
## 準備
chaiのプラグインなので、インストールが必要。プラグインパッケージとかた情報をインストールする。

```bash
$npm install --saveDev deep-equal-in-any-order @types/deep-equal-in-any-order
```
テストコード内では忘れずにプラグインの使用を宣言すること。

```typescript
import * as chai from "chai";
import deepEqualInAnyOrder from 'deep-equal-in-any-order';
chai.use(deepEqualInAnyOrder);
```

## コード
まとめると、下のようなコードでテストできる。

```typescript:typescript
import * as chai from "chai";
import { expect } from "chai";
import deepEqualInAnyOrder from 'deep-equal-in-any-order';

chai.use(deepEqualInAnyOrder);

const leftObj = {
  sameOrder: ['a', 'b', 'c'],
  differentOrder: [1, 2, 3]
};
const rightObj = {
  sameOrder: ['a', 'b', 'c'],
  differentOrder: [3, 2, 1] // 異なる順番の配列。
}

describe("comparing two deep equality methods.", () => {
  it("should deep equal when using 'equal'.", () => {
    expect(leftObj).to.deep.equal(rightObj);
  });
  it("should deep equal when using a plug-in 'equalInAnyOrder'.", () => {
    expect(leftObj).to.deep.equalInAnyOrder(rightObj);
  });
});
```

## 実行結果
走らせると、想定どおり```deep.equal```を使ったテストは配列内のアイテムの順番の違いが原因でfail。
対照にプラグインを使って```deep.equalInAnyOrder```で比較テストを行った方はpassになる。

```bash
 comparing two deep equality.
    1) should deep equal when using 'equal'.
    ✓ should deep equal when using a plug-in 'equalInAnyOrder'.

 1 failing

  1) comparing two deep equality.
       should deep equal when using 'equal'.:

      AssertionError: expected { Object (sameOrder, differentOrder) } to deeply equal { Object (sameOrder, differentOrder) }
      + expected - actual

       {
         "differentOrder": [
      +    3
      +    2
           1
      -    2
      -    3
         ]
         "sameOrder": [
           "a"
           "b"

```

# 結論
APIでやり取りされるJSONデーターを扱うテストでは、配列内の順番を無視して比較を行いたい場合が多く、この```deep-equal-in-any-order```プラグインはとても便利。
Quip によるコラボレーション ⇒ Quip の基礎 ⇒ Quip のツアー

１．Quip サイドバーの目的は何ですか?
２．行っている作業に対してQuip のメニューはどのように適応しますか?
３．Quip を使用できるのはどのような種類のチームですか?
４．技術チームが Quip を最も便利に使用できる方法の 1 つは何ですか?
５．会話ペインには何が表示されますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/0a92aa60-01d5-1551-37da-abb21baa3aca.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/96f2164a-98f5-8bdb-16ed-6d0c12a13e76.png)
Quip によるコラボレーション ⇒ Quip の基礎 ⇒ Quip の使用開始

１．Quip が他のツールと異なる理由はどれですか?
２．Quip 文書について正しいのはどれですか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/45d626d2-0f2b-37fc-ac2a-d457e314babc.png)
Node.js (JavaScript)でセミコロンを付けていなかったことで "TypeError: require(...) is not a function"が発生していた(JavaScriptの構文について)

今日JavaScript(Node.js)を書いていたときに遭遇した出来事を備忘録がてら書き残しておく。

## エラーになったコード
下記のコードはエラーになる。

```js
const fs = require('fs')

(async () => {
  console.log(fs)
})()
```

実行結果

```bash
(async () => {
^

TypeError: require(...) is not a function
```

## 上のエラーを解決させたコード

JavaScriptは`;`を書こうが書かまいがが動く、と思っていたが、1行目の末尾に `;` をつけることで、今回のコードは問題なく動くようになる。

```js
const fs = require('fs');

(async () => {
  console.log(fs)
})()
```

※実行結果は長くなるので省略。サンプルコードが悪かった...

## "TypeError: require(...) is not a function"が出る仕組み

これはどういうことかなと思ったけど、考えてみれば単純なことだった。

JavaScriptは文末にセミコロンを付けなかった場合、その後の文が構文的に解釈可能な場合、解釈しようとする。
自分もここらへんは自信がないので、[JavaScript Primer](https://jsprimer.net/) の記述も引用させていただく。

> JavaScriptには、特殊なルールに基づき、セミコロンがない文も行末に自動でセミコロンが挿入されるという仕組みがあります。 しかし、この仕組みは構文を正しく解析できない場合に、セミコロンを足すという挙動を持っています。 これにより、意図しない挙動を生むことがあります。そのため、必ず文の末尾にはセミコロンを書くようにします。

引用元のページ: https://jsprimer.net/basic/statement-expression/#statement-expression-summary



つまり先ほど私が書いたコードは下記のように解釈された形となる。

```js
// require('fs')(/* ~ */) 的な解釈となっていた
const fs = require('fs')(async () => { 
  console.log(fs) 
})()
```

## 余談: prettierでセミコロンを付けない設定をした際の挙動
気になったので試してみた。

`prettier` の設定で `semi: false` にしたとき、`;`はどこにつくのか？
結果は下記の通り。

```js
const fs = require('fs')

;(async () => {
  console.log(fs)
})()
```

## あとがき

普段 `;` は付ける派なのだが、なんとなくプロトタイプのコードを書いていてつけないでいた。後から `prettier` かければ済む話だとか考えていたら、思わぬエラーに引っかかった。
おかげでJavaScriptのことを少し知ることができたので結果的に良かったと思う。
【Python】データサイエンス100本ノック（構造化データ加工編） 010-020 所感+解説リンクまとめ

# 所感
- データサイエンス100本ノック（構造化データ加工編）の20問目までを解説してあらためて感じました。
- 粛々とデータサイエンス100本ノックを解いていくのは、モチベーション的にも結構きついです。笑
- なので、データサイエンス100本ノックをしている方々でコミュニティを作りたく、データサイエンス100本ノックをやりきる会を作りました🎉
- こちらの[Slack招待URL](https://join.slack.com/t/data-science-100nocks/shared_invite/zt-gfncg9vm-8W8b3UrDg8R~TKaqUkQpgw)からご参加ください！！
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています！

#解説まとめ
- ここからはリンクを貼ります。
- データサイエンス100本ノック初心者の方は、001から順番に解いていくことをおすすめします。
- 001から010までの解説は、[こちら](https://qiita.com/TosakaNaoya/items/34f1a1b090341904221d)をご覧ください。

## 011
[解説記事](https://qiita.com/TosakaNaoya/items/51f3b21f80bb4e298170)
[解説動画](https://youtu.be/q9av-XzHhNo)

## 012
[解説記事](https://qiita.com/TosakaNaoya/items/9759e39576d64d97c5f7)
[解説動画](https://youtu.be/fZJdGwEu-qQ)

## 013
[解説記事](https://qiita.com/TosakaNaoya/items/11d12a8ebc2369d75ea5)
[解説動画](https://youtu.be/8MCbzyCo7hY)

## 014
[解説記事](https://qiita.com/TosakaNaoya/items/e1f5b71831614130d011)
[解説動画](https://youtu.be/ceMOn5IjJL0)

## 015
[解説記事](https://qiita.com/TosakaNaoya/items/f154b7c65d835cc39a95)
[解説動画](https://youtu.be/W5K26k-nByg)

## 016
[解説記事](https://qiita.com/TosakaNaoya/items/af3ce911fb093b5a9632)
[解説動画](https://youtu.be/JLZl6K3DIL4)

## 017
[解説記事](https://qiita.com/TosakaNaoya/items/89e113d3d29dc11f4576)
[解説動画](https://youtu.be/3dhUuiD97_0)

## 018
[解説記事](https://qiita.com/TosakaNaoya/items/223f64a2f1da57744f76)
[解説動画](https://youtu.be/7ceMjih3vOs)

## 019
[解説記事](https://qiita.com/TosakaNaoya/items/fb6db12a82d4c268fd4d)
[解説動画](https://youtu.be/lmXvBTeS0J0)

## 020
[解説記事](https://qiita.com/TosakaNaoya/items/e27651121741a9184f85)
[解説動画](https://youtu.be/ql3yHmorK1k)
LXDコンテナ内でSamba(CIFS)とNFSの両方をマウントする

# 背景

LXDのコンテナ内からネットワーク上のフォルダをSamba(CIFS)でマウントする際は以下のようにする。

~~~
lxc config set TEST raw.apparmor 'mount fstype=cifs,'
lxc config set TEST security.privileged true
~~~

同様にLXDのコンテナ内からNFSでマウントする際は以下。

~~~
lxc config set TEST raw.apparmor 'mount fstype=nfs,'
lxc config set TEST security.privileged true
~~~

ここまでの情報はたくさん見つかるのだが、1つのLXDコンテナ内でSambaとNFSの両方とも使おうとしたときにどうすればよいのか情報が見つからなかった。

# 方法

結論としては、下記のように`raw.apparmor`を設定する。

~~~
lxc config set TEST raw.apparmor "mount fstype=nfs, mount fstype=cifs,"
lxc config set TEST security.privileged true
~~~

※ 試行錯誤した結果なので冗長かもしれない

# 例

Ubuntu 18.04のコンテナイメージで両方ともマウントする例。

~~~bash:(ホスト)
lxc launch ubuntu:b TEST
lxc config set TEST security.privileged true
lxc config set TEST raw.apparmor "mount fstype=nfs, mount fstype=cifs,"
lxc restart TEST

lxc exec TEST bash
~~~

~~~bash:(コンテナ内)
apt update

# NFS
apt install nfs-util nfs-common
mkdir /mnt/nfs
mount -t nfs -o vers=3 192.168.10.***:/mnt/share /mnt/nfs

# Samba
apt install cifs-utils
mkdir /mnt/cifs
mount -t cifs -o uid=1000,gid=1000,vers=3.0,username=***,password=*******,rw //192.168.10.***/share /mnt/cifs
~~~

もちろん、コンテナ起動時に自動的にマウントするには`/etc/fstab`を編集すればOK。

# 参考

* [LXDコンテナで CIFS 共有をマウントする \- Qiita](https://qiita.com/n3k2t1/items/f518a922f4db6943c2a0)
MACでhomebrew使ってyarnを入れたい

[こちら](https://qiita.com/poteko_jagaimo/items/aadd04ce25bba250457b)の記事で、初心者さんがNode.jsを入れることに成功したので、次に開発環境構築になります。

開発環境ではyarnを使用していたんで、(npm消しちゃったし、yarnの方が早いしいっかってことで)yarnを落とすことにしました。その時の備忘録です。


## 事前準備ともろもろ
[homebrewでyarnインストール](https://qiita.com/hiro266/items/fb1d37c180d6cbc696c8)
こちらの記事を参考にしました。ありがとうございます。
※homebrewがインストールされている前提で書きますので、まだの方は[こちら](https://brew.sh/index_ja)から

また、nodeの管理をnodebrewで管理してるので、`brew install yarn`　でyarnを落とすとnodeの依存関係で色々とまずいのでやめましょう

## yarnを入れよう
ターミナルで

```
brew install yarn --ignore-dependencies
```

yarnをそのままインストールしてしまうとnodeも一緒に入ってしまうようなのでignoreしてるようです。
nodebrewで管理しているnodeと通常のnodeに依存関係が生まれるそうです。

## エラーが起きた
自分のMacではエラーが起きてしまいました。

```
Error: An exception occurred within a child process:
  RuntimeError: /usr/local/opt/icu4c not present or broken
Please reinstall icu4c. Sorry :(
```
通常、yarnを入れるとき、`brew install yarn`でインストールをするのですが、このとき

```
icu4c
node
yarn
```
この3つが入るのですがどうやらyarnに必要なパッケージが足りないということのようなので
`icu4c`というものが入ってないのでいれてあげます。
homebrewでicu4cをインストールしてあげましょう

```
brew install icu4c
```

## 再びエラーがでた
```
Error: An exception occurred within a child process:
  RuntimeError: /usr/local/opt/node not present or broken
Please reinstall node. Sorry :(
```
nodeが無いぞと言われました
しかしnodeはnodebrewで管理しているため、nodeを入れてしまうとまずいです。
なのでyarnが参照する「node」ディレクトリにシンボリックリンクを設定します。

yarnは`/usr/local/opt/node`を参照するので、ディレクトリを作りましょう

```
mkdir /usr/local/opt/node
```

作成したnodeのディレクトリからnodebrewのnodeを参照するようにシンボリックリンクを設定します
いわゆるショートカットを作ることらしい。

```
ln -s ~/.nodebrew/current/ /usr/local/opt/node/
```

## 再びyarnをインストールする
これで私も初心者さんもうまくいきました。

参考文献さんありがとう

## 参考文献
* [homebrewでyarnインストール](https://qiita.com/hiro266/items/fb1d37c180d6cbc696c8)
* [cu4c not present or broken エラーに対応する](https://blog.cloud-acct.com/posts/column-brew-install-yarn-ignore-dependencies/)
ROS2でのキー入力専用nodeの作成

【[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)】

OpenAI GymをROS2ノード化するにあたって，「人がキー入力で実験・ゲームプレーを行う時に必要となるキー入力」をしてくれるnodeの作成を行った．

# 作成物
* [github:key_event](https://github.com/nek009/key_event)

## 説明
githubの[README_JP.md](https://github.com/nek009/key_event/blob/master/docs/README_JP.md)に基本事項を記載．

### ワークスペース構成

* key_event_msgs
    * key_event_nodesで使用するメッセージ
* key_event_nodes
    * キー入力を取得し定期的にpublishするノード
        * key_hit_event_node
            * 1文字キー打鍵に対してpublish
            * 入力がないときには`\0`文字をpublish
* tests
    * 作成物のテスト用プロジェクト


### ノードについての説明
ノードはコンポーネントとして作成しているのでtests以下のように実行形式(target)としても使用できるし，compornentsとして単独で実行もできる．
IEEE829から学ぶテストドキュメント～④テスト手順書編～

#１．概要
これまでテストに最低限必要な計画、設計、テストケースの3つについて説明いたしました。今回からは上記を補足するドキュメント郡について説明いたします。

今回の対象となるのは**「テスト手順書」**になります。テスト手順書は、**テストケースの実施手順と合否判定のプロセス**等を記載したドキュメントになります。


#2．IEEE829のテスト手順書とは？
IEEE829のテスト手順書は以下の構成となっています。こちらは、実際にテスト手順を考えるにあたって項目数が少ないので、3章以降で経験談も交えて解説いたします。

構成
・テスト手順書識別番号
・目的
・特殊な要件　⇒テスト実施に必要な特殊な環境、データ等を記載します
・手順のステップ　⇒どのテストから実施するのか流れを記載します

テストを実施する上で問題になる部分や、事前に必要なものについて記載します。


#3．テスト手順書の考え方
テスト手順書では大きく、
**①テストケースの実施順序を決める
②テストの合否安定方法の詳細を決める**
の2つを考えます。


##①テストの順序を決める
作成したテストケースをどの順序で実施するかを決定します。

基本的な実施順序の考え方は、**信頼度成長曲線を描けるように順序を決めること**です。つまり、**初めに不具合を質・量ともに多く出し、後半に少なくする**、ということになります。

なぜ上記のような考え方を行うかというと、以下の理由が挙げられます

- 終了ギリギリに重大な不具合が出ると、**リリースに影響が出る**
- 早めに見つかれば**リリース時期の再検討や対応策を検討することも可能**

では、どのようにして信頼度成長曲線を描けるような順序を決めるかというと、以下のように考えます。

- 複雑な機能からテストを行う

複雑であればあるほど不具合は多くなる傾向にあります。そのため、**機能の連携が多い部分、外部のシステムと関わるところ、読み込むデータの種類が多い**などを優先的にテストします。

- 開発者がここは不具合が多いかも、と指摘しているところからテストを行う

開発者側にも確認しテストの順序を決めます。経験則から、ここが多いかも、と開発者が言った部分は結構な確率で当たります。

- コードレビューや単体テストで不具合が多かったところかたテストを行う

事前のレビュー等で不具合が多かった機能は、大抵その後のテストでも多くなる傾向があります。そのため、事前にコードレビュー等の結果を入手し、テストの実施手順書に含めるべきです。

- 見落としそうな例外パターンからテストを行う

テスト設計中にテスト担当者が作成した例外パターンのテストは、早めに実施するべきです。例外パターンは開発に反映されていないことが多く、**不具合が多く出る傾向があります。**


また、そのほかのテスト手順を考える上で以下のような考え方もあります。

- 時間がかかるテストから行う（環境の準備が大変、大量のテストデータが必要、性能テストなど）

**どこか間違いがあって、やり直しになること**が多くあります。後半にやり直しになると、時間がなくやり直すことができなくなり、テスト未実施でリリースしなければならないこともあります。

ただ、段階的にリリースされる場合は時間のかかるものからテストできないことがあるので、その場合は、できるだけ早めにテストできるように努めるしか方法はないです。

- 仕様が不明確な機能からテストを行う

仕様が不明確ということは、そこに不具合があるのかどうかも誰にも分らない状況でもあります。そのため、早期にその部分をテストすることで問題部分を明瞭にすることができます。（一部をテストして不具合が出ない場合は、途中で順序を後の方に変えることもあります）


##②テストの合否安定方法の詳細を決める
テストの合否判定基準についてはテスト計画書で概要を決めています。そのためテスト手順書では、どんな時にどんな判定をすればいいのか、詳細や例外を決めます。

ここでの基本的な考え方は、**だれでもそのフローに沿って判定できるような基準となっていること**、です。そのため、今回テストを担当する**担当者のスキルレベルによって記載の粒度は変わってきます**。
※テストの実施が初めてのチームや、複数の会社に依頼する場合も詳細に記載する必要があります。

例えば、担当者の技術レベルが高ければ、

- 期待結果と同じになっていればOKとする
- 期待結果と違う場合はNGとする
- 環境不備で実施できない場合は保留とする…など

とテスト計画書で記載する概要レベルで問題ありません。なぜなら、上記から外れる問題については、担当者自身が自分で考え判定してくれるからです。

ただ、担当者の技術レベルが低い、もしくは複数の会社に依頼する場合などは、不具合の判定フローなどを作成して詳細化する必要があります。

不具合フローには**関係する担当者と、時間軸上の対応の流れ**を記載しておけば大丈夫です。





#4．テスト手順書の項目

IEEE829の項目と3章の内容から、テスト手順書に含めるべき項目は以下となります。

- ①目的

ここではテスト手順を決めるための大方針を記載を記載します。不具合を早めに見つける、A機能が重要なためここを優先する、などを記載して、テスト実施の順序でもめる場合は、ここの目的を参照します。

- ②特殊要件

テスト実施に必要な環境、データなど用意に時間がかかるものを記載します。また、**できれば誰がいつまでに用意するのか、スケジュールも記載しておいた方がいいです**。

- ③テストの手順

機能テストB　⇒機能テストC　⇒機能テストAの順にテストを実施するなど、ケースレベルでの実施順序を記載します。もしくは実施のWBSなどを記載して、テストの手順をわかりやすく記載しましょう。
**※ここが最重要項目**

- ④テスト手順の変更条件

不具合が多く検出されないなど、信頼度成長曲線が描けない場合の対応方法を記載します。例えば、目的通りにテストをしても不具合が出ない場合は様子見や、別のテストを先行して一部実施する、などの対応を記載します。

- ⑤テスト合否合判定の詳細

テスト担当者の技術レベルが低い場合や、複数の会社に依頼する場合はテストの合否判定基準の詳細を記載します。

基本的には、こういったときにこういった流れで対応する、といったフロー図を記載することが多いです。ただ、特に記載しなくても対応できる人選の場合は、この項目を記載しなくても問題ないです。

最低限、上記の5つの項目（テストの合否判定を記載しないのであれば4つ）が記載されていればテスト手順書として問題ないです。


#5．まとめ

テスト手順書はテスト実施をスムーズに進めるために作成するドキュメントです。そのため、テストが複雑になりそうであれば、テスト手順書を作成しテストを円滑に進める必要があります。

ただ、1～2週間で終わるようなテストであれば、テスト手順書を作成しなくても問題ないことが多いです。ただ、その場合、テスト手順書等にテスト手順書の考えを取り入れて、設計を行う必要があります。