OmniAICreator/Qiita-1.07M huggingface dataset:
生のjsでgetする(jQuery禁止)

# javascriptでjQueryなしでgetする
色々あってjqueryが嫌いになったから、生のjsで書いた

```js
function callback(data){console.log(data)}
get('example.com',{'foo':'bar','hoge':'hoge'},callback)
```

```js
function get(url, param, callback_function){
    let Full_url = url + "?";
    let count = 0;
    for (key in param) {
        if (count++ != 0) Full_url += "&";
        Full_url += key + "=" + param[key]
    }
    let xhr = new XMLHttpRequest();
    console.log(Full_url)
    xhr.open('GET', Full_url);
    xhr.setRequestHeader('Content-Type', 'text/html');
    xhr.onreadystatechange = function () {
        if (xhr.readyState === 4) {
            if (xhr.status === 200) {
                callback_function(xhr.responseText)
            } else {
                console.log("error\nstatus = " + xhr.status);
            }
        }
    };
    xhr.send();
};
```
rubyで無限ループする（のとexitで脱出する）

rubyで無限ループを実装したくて、perfect rubyにかかれていたloopというものを使ってみた。
ただ、そのまま使うと当然抜けれなくなるので、`exit`をいう文字列が入力されたらループを抜けるようにした。（getsメソッドの文字列そのままだと改行コードが付いてしまうので、chompするようにした。）

```ruby
loop do
  input = gets.chomp
  puts input
  break if input == 'exit'
end
```
Mterial-UI > Cannot find name 'Map'.



行かようなエラーが出た場合

```
MuiThemeProvider.d.ts Cannot find name 'Map'.
```


tsconfig.jsonに以下を追加

`"lib": ["es5", "es6", "dom"], `


```
  "compilerOptions": {
    "target": "es5",
    "lib": ["es5", "es6", "dom"], 
    ...
  }
```
言語設定を取得したい場合はLocale.prefferedLanguagesを使う

#はじめに
Localeの言語関連の備忘メモを残します。

# Locale.current.identifier
値として、"ja_JP"のような書式の値が返ってきます。ja(日本語)_JP(日本で使われている) という意味。(ちなみに、current.descriptionだと末尾に` (current)`がつく。)

Localeのプロパティに.languageCodeと.regionCodeがあり、これを_で結合すれば多くの場合にlocaleの識別子として使えます。
ただし、.scriptCode(例えば、繁体字の別)の情報がある場合は、.languageCodeの後ろに`"-\(locale.scriptCode)"`を挿入する必要があります。

# 香港繁体字
設定言語を使いたい場合、Locale.current.identifierでは不十分。香港繁体字の場合、"Zh-Hant-Hk_CN"となるべきところ、"Zh-Hant_CN"としか取得できません。繁体字までの情報しかなくて、例えば台湾繁体字と区別できません。

そこで、Locale.current.identifierではなく、Locale.prefferedLanguages.firstを使います。"ZH-HANT-HK"が返ってきます。

これに、`"_\(Locale.regionCode)"`をつけて、Locale(identifier: )にそのまま入れると、適切に変換してくれて、対応するlocaleを取得できます。(prefferedLanguages.firstの値はアッパーケースですが、Locale(identifier:)が内部変換してくれるようです。)

# グレゴリアン以外のカレンダー(例えば、和暦)を設定している場合
Locale.identifier は、`ja_JP@calendar=japanese` のように、カレンダー情報が添付される。グレゴアンカレンダにキャストしたい場合、`Locale(identifier: "ja_JP")` とすればよい。前掲の方法で識別子を生成すれば、設定にもとづいて西暦表示にキャストされたlocaleを取得できます。キャストしたlocaleをdateFormat(fromTemplate:options:locale:)などで使います。

locale.calendarを直接セットできればシンプルなのですが、getしか用意されていません。

# iOS 11+
iOS 11からLocale.currentの値は、アプリがローカライズ対応している言語に制約されるようになりました。それ以外は、設定値がそのまま返ってきます。
前掲のprefferedLanguages.firstの値は、仕様変更がないようで、設定値がそのまま返ってきます。

#以上です
もっと良い方法をご存知の方がいたら教えていただきたいです。
ssh ログイン時に setlocale の warning が出て vim で日本語が文字化けした

## ssh ログイン
```
-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory
```
Amazon Linux で kernel をアップデートした影響か、ssh ログイン時に上記のエラーが出力され、 vim でマルチバイトが文字化けするようになった。

## locale
```bash
locale
```
```
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE=UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
```
`locale` コマンドを打つと `LC_CTYPE` と `LC_ALL` でエラーが出ている。

## /etc/sysconfig/i18n
```
cat /etc/sysconfig/i18n
```
```
LANG=en_US.UTF-8
```
```
echo 'LC_ALL="en_US.utf-8"' >> /etc/sysconfig/i18n
echo 'LC_CTYPE="en_US.utf-8"' >> /etc/sysconfig/i18n
```
`/etc/sysconfig/i18n` ファイルに `LC_ALL` と `LC_CTYPE` を追記したら解決した。
Raspi3 で Camera Moduleを接続

■目的
・Raspi3にCameraModuleを接続し動画をとる

■実施内容
①以下を参考にして接続
https://www.mztn.org/rpi/rpi23.html

http://wp.developapp.net/?p=3806

https://qiita.com/miyamotok0105/items/7dc26235b7788d7c4dde

https://arakan60.mydns.jp/04kousaku/22-01motionml.html

②カメラが認識されないというトラブルがあったが、カメラ接続状態で再起動したら認識された。

③テストプログラムを動かすために、userlandなどをインストール。
　Cmakeコマンドを使ってるためCmakeもインストール。パス追加が必要。
　しかし、PATH=ドルPATH:hogehoge の ドルPATH部分を書き忘れたので環境変数がぶっ飛ぶ。
　ログイン(初期PW:raspberry)しなおすとbash_profileなどが復活するらしく助かった。
　また、環境変数を設定しなおすと sourceなどで読み込み直さないといけない。
　今日覚えたコマンド　
　　・find 
    ・source
    ・export
④Cmakeをインストールしようとするが、やり方がわからずとん挫。エラーの内容的にbitが32なのに64にしてしまってる模様。　
https://web.plus-idea.net/2014/11/linux-32bit-64bit-cpu-bit/
https://yatta47.hateblo.jp/entry/2016/10/05/151304
https://qiita.com/YutakakINJO/items/69f01d2abfb958ada88b

⑤Cmakeのアンインストールをしようと思ったがそもそもCmakeがよくわかってなかったので調べた。
Cmakeもmakefile的なものをディレクトリにおいたうえで実行する模様。
http://www.wagavulin.jp/entry/2011/11/27/222636


⑤再インストールを実施。cmake-3.13.2 を実施。
cm_kwiml.hというファイルをincludeしようとしても見つからない
というエラーのようなので、findしてみたらdownloadの方にあるcmake-3.13.2の
下にあるutilityというフォルダがdesktop>cmake-3.13.2の方には存在してない
ことに気が付いた。
よって、コピペで張ったところ動きはした(今実施中 201902241333時点)
→結果workフォルダにログ的なのおいてます
→いろいろと読み込みファイルが足りてないように見えた。
　https://kanonji.hatenadiary.com/entry/20120127/1327649853
　を見ると、ライブラリ不足はあるあるのようだから、その方向で調べるために
　倣ってconfigureを実施(中身はgmailに貼ったので、cmake configure log で検索)
→とりあえず、cmakelistが見つからないという事象らしく、
　Findで探す。→たくさん見つかったがどれが大事なのかようわからん。
→とりあえず、CMakeListsを空ファイルで置いたら進んだが、includeできへんとのこと。
→わけわかんないんで、cmake-3.13.2 を入れるところからやろう
→binary distributionを入れるのかsource distributionを入れるのかようにわからん。
 win_86_64は64bit用なのはわかった
FizzBuzz問題であえてカリー化した関数を使ってみる

## はじめに

あまり馴染みがなさそうな「カリー化」を使ってFizzBuzzを書いてみたいと思います。

## FizzBuzz問題とは
一応説明しておくと、FizzBuzz問題とは

1から100まで(?)数字を1つずつカウントしていき、3の倍数だけのときは「Fizz」を、5の倍数だけのときは「Buzz」を、3と5両方の倍数(公倍数)のときは「FizzBuzz」を、それ以外のときは数字をそのまま出力するプログラムです。

プログラマ志願者を本当にコードが書ける人かどうか見分けるための有名なプログラミングの問題で、面接でFizzBuzzを書かされることもあるらしい。
**「Ruby FizzBuzz」でググった明日が面接のプログラマ志願者は変態コードじゃなく普通のを探すんだっ・・・！**

## カリー化を使ってFizzBuzz書くとこんな感じ

```ruby
closure = (lambda do |a, b, i|
    case 0
    when i % a + i % b
        puts "FizzBuzz"
    when i % a
        puts "Fizz"
    when i % b
        puts "Buzz"
    else
        puts i
    end
end).curry
dump = closure.call 3, 5
1.upto(100) {|i| dump.call i}
```

FizzBuzz出力するところは「15で割って余りが0」という判定でもいいですね。実際、15で割っているFizzBuzzの回答例もググれば見つかりますし。
そうするとこうなる。

```ruby
closure = (lambda do |lcm, a, b, i|
    case 0
    when i % lcm
        puts "FizzBuzz"
    when i % a
        puts "Fizz"
    when i % b
        puts "Buzz"
    else
        puts i
    end
end).curry
dump = closure.call 15, 3, 5
1.upto(100) {|i| dump.call i}
```


## 【おまけ】

プログラマ志願者: FizzBuzzできました（ドヤァ）

面接の人: お！早いですねぇ！

プログラマ志願者: （えへへ・・・、昨日の夜がんばって覚えたからな）

面接の人: うん、このプログラムは完璧です

プログラマ志願者: ありがとうございます！（これは採用きまりだな！楽勝楽勝！）

面接の人: あの、このプログラムについて質問いいですか？

プログラマ志願者: はい！なんでしょうか

面接の人: なんで15で割りました？

プログラマ志願者: えっ・・・？

面接の人: なんで15で割って余りを求めました？

プログラマ志願者: えっと・・・

面接の人: 「FizzBuzzを出力するとき」がなぜ「15で割り切れるとき」なんですか？

プログラマ志願者: それは・・・

面接の人: ・・・

プログラマ志願者: ・・・

面接の人B: あのーちょっといいですか？ 15はどこから出てきたんです？

プログラマ志願者: ・・・

面接の人A: どこから15が出てきたんだ！？なにもないところから出てきたとは言わせんぞ！

プログラマ志願者: ヒィィィぃ！ 

面接の人A: ・・・なにも取って食おうってんじゃない

面接の人A: だが、このFizzBuzzプログラムを書いたのは紛れもなく君だろう？

面接の人A: なぜFizzBuzzを出力するときが15で割り切れるときなのか、説明していただけませんか？

プログラマ志願者: ・・・・・・それは・・・

プログラマ志願者: 掛け算です・・・！

面接の人B: フハッ！

プログラマ志願者: ぼくはっ・・・3と5を掛け算しました…！

面接の人A: ハーーーーッハッハ！血迷って滅多なことを言い出したわ！

面接の人C: 「3と5を掛けた」…と？

面接の人D: ほっほっほっ。これはこれは…。おもしろいですねぇ

面接の人E: ｲ~~~ﾋｯﾋｯﾋｯ…

面接の人F: そうら、本性が現れたぞい

面接の人A: 静粛に！どうかみなさん静粛に！

面接の人A: ・・・ｺﾎﾝ

面接の人A: 「3と5、両の数字を掛け合わせ、その結果を以て15の根拠とする。」

面接の人A: ・・・それが汝の答えという理解でいいかな？

プログラマ志願者: そ、それは・・・

面接の人B: 慎重に答えたまえ。次の君の答えで私たちは君の採用の可否を決める

プログラマ志願者: ・・・・・・！

面接の人B: 呆れたものだ・・・！君は自分で書いた簡単なFizzBuzzプログラムの説明も満足にできないのか・・・！？

プログラマ志願者: うぅっ・・・！じゅ、15は・・・掛けざ・・・

オレ: ちがう、そうじゃないんだ！待ってくれ！

プログラマ志願者: オレ君！？

面接の人A: なんだキサマ！出て行け！面接中だ！

オレ: うるさい！心配でもう見ちゃいれないよ！いいか、聞いてくれ！

オレ: FizzBuzzを出力するときは「3と5の両方の倍数で割り切れるとき」、

オレ: それは言い換えれば「3と5の最小公倍数で割り切れるとき」なんだ！

オレ: つまり、3と5の最小公倍数が15の根拠なんだっ・・・！！

面接の人A: ちょっと待て！認めん！認めんぞ！

オレ: なぜだ、認めてくれ！

面接の人A: いや、認めん！

オレ: なぜだ！

面接の人A: 「3と5の最小公倍数が15であること」はどうやって導いた！？

オレ: うぐっ・・・

面接の人A: フハハハ、それみたことかペテン師め！もっともらしいことを

オレ: 倍数だ

面接の人A: …なに？

オレ: 3と5を比べて数が大きいほう、つまり「5」の倍数を、 5, 10, 15… と小さい方から数えていく・・・

オレ: そして、最初に3で割り切れた5の倍数こそが「3と5の最小公倍数」であり、それが15だったんだ！

オレ＆プログラマ志願者: これが15の根拠だ！くらえ！

<img src="https://qiita-image-store.s3.amazonaws.com/0/37104/35cec824-466e-d32c-bca5-f8e1c76c5649.png" width=80%>
計算論的神経科学(Computational Neuroscience)の研究グループまとめ

Computational Neuroscienceを扱う研究室を備忘録がわりにメモしていきます。

#US
###University of Washington, Seattle ワシントン大学
**Micael Buice**
Allen Institute for Brain Science & Affiliate faculty, UW Applied Mathematics
Machine intelligence and network dynamics
https://alleninstitute.org/what-we-do/brain-science/about/team/staff-profiles/michael-buice/

###UCSD

###UCLA

###UC Berkley

###Stanford

###Southern Califolnia


###Caltech
computation and neural systems
http://www.cns.caltech.edu/research/index.html




#UK イギリス
###Cambridge
system and computational, Cambridge neuroscience
https://www.neuroscience.cam.ac.uk/research/themes/systemsComputational.php

###Imperial College London
Neurotechnology and robotics, Department of Bioengineering
http://www.imperial.ac.uk/bioengineering/research/neurotechnology-and-robotics/

Etienne Burdet
Human Robotics
http://www.imperial.ac.uk/human-robotics

Paul Chadderton
Synaptic and network mechanisms of sensory processing
http://neuralcircuitsinbehaviour.squarespace.com/brief/


http://www.bg.ic.ac.uk/research/c.clopath/

Albo Faisal
Machine and biorogical learning, human agumentation
http://wp.doc.ic.ac.uk/bbl/publications/

Dario Farina
human-machine interface, biological signal processing, neural control of movement
http://www.imperial.ac.uk/people/d.farina/publications.html

#Switzerland スイス
###EPFL
Labolatory of computational neuroscience
https://lcn1.epfl.ch

###ETZ
Cent OS で Laravel Mix のインストール時にエラーが発生する場合の対処法

## 発生したエラー

```
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! pngquant-bin@4.0.0 postinstall: `node lib/install.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the pngquant-bin@4.0.0 postinstall script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
```

## 原因

libpng がインストールされていない

## 対応

```shell
yum install libpng-devel
```

他のOSで発生した場合は、各OSのパッケージ管理ツールで libpng を探してインストールしてみれば良い。
Homesteadでxdebugが使えなくなったり502 Bad Gatewayとか言われたときの対応記録

# 前段
以前、こちらでPhpStormでxDebugを使う記録を取ってました。

- [PhpStormとHomesteadとXdebugでDebugできるようにする - Qiita](https://qiita.com/ragingalpaca/items/5e476656ec71a589623c)

その後、なんか調子悪くなったhomesteadをdestroyしたせいで？
xdebugのインストールとかが吹き飛んだっぽくて、デバッグできなくなってしまいました。
`php -m`でモジュール一覧を見ても、Zend Modulesにxdebugが表示されません。

なので、改めて入れ直します。

# 使えるかどうかの確認
毎回、「どこを確認すればええんや……」となるのでまとめておきます。
各設定が具体的にどうなっていればいいかは以下を参照してください。

- [Homestead + Xdebug + PhpStorm でリモートデバッグ環境をつくる - ラボラジアン](https://laboradian.com/remote-debug-setting-for-homestead-xdebug-phpstorm/)

## PhpStormの設定
- PhpStorm
    - Preferences
        - Langages & Frameworks
            - PHP
                - Debug
                    - Xdebugのポート設定・・・xdebug.iniと同じかどうか
                - Servers
                    - DebuggerをXdebugに設定したサーバーが作成されているかどうか
- Run
    - Edit Configurations
        - PHP Remote Debug
            - 上記サーバーを指定したデバッグ設定が存在するかどうか


## 仮想環境（Homestead）の確認
利用しているphpが7.2です。
（そういえばここの設定もどこかでいじった気がします）

php7.2に対応しているxdebug2.6はbeta版らしく、そのままでは使えません。
うまいこと設定を揃えてやる必要があります。
確認すべきポイントは以下。

### 設定ファイル
- /etc/php/7.2/mods-available/xdebug.ini
    - 各行が存在すること
        - zend_extension=/usr/lib/php/20170718/xdebug.so
        - xdebug.idekey = "PHPSTORM"
- /etc/php/7.2/fpm/conf.d/20-xdebug.ini
    - /etc/php/7.2/mods-available/xdebug.iniへのシンボリックリンクであること

### phpのインストール状況
- php -v
    - xdebugが表示されること

あるいは、

- php -m
    - Zend Modulesにxdebugが表示されること


# やったこと
今回は、Homesteadのdestroyが原因？っぽいので、PhpStorm側の設定は問題なく、仮想環境側のシンボリックリンク、xdebug.iniの追記、phpへのxdebugのインストール、の3点がされていない状況でした。

**3点っていうか全部なんですけど。**

で、あとは何度かやったことがあるような気のする対応をしました。

- php -iの結果を　[Xdebug: Support; Tailored Installation Instructions](https://xdebug.org/wizard.php)　に貼り付ける
    - 毎度お世話になります。
- 出てきた手順に沿ってxdebugをインストール
    - 今後もdestroyすることはありそうなので、仮想環境の共有フォルダにtoolとか作成してその中で展開しました

```bash:
tar -xvzf xdebug-2.6.0.tgz
cd xdebug-2.6.0
phpize
./configure
make
cp modules/xdebug.so /usr/lib/php/20170718
# このxdebug.so自体はすでに存在していたんですけどファイルサイズとか違うみたいなんで一応
##
## ちなみにこの手順自体もwizardに表示された内容丸パクリです
## なるべく鵜呑みにしないでwizardを使ったほうがいいです
##

vi /etc/php/7.2/cli/php.ini
# 適当な場所に以下を追加
# zend_extension = /usr/lib/php/20170718/xdebug.so
##
## /etc/php/7.2/mods-available/xdebug.iniの設定とダダ被りですが気にしないことにします
##

```

ここまでで、`php -m`のZend Modulesにxdebugが表示されるようになりました。


# 502 Bad Gateway
で、喜び勇んでアクセスしようとしたら繋がらなくなってました。
502 Bad Gatewayとのこと。

焦りましたが、サービス再起動で直りました。

```bash:
sudo service php7.2-fpm restart

```

xdebugも動くようになってました。
【Mac OS】PostgreSQLでinsert文を書くときに、created_atカラムに現在時刻を自動で入れたい

##開発環境
- Mac OS 10.12.6
- Rails 5.1.6
- PostgreSQL 10.1

##問題
- 既にRailsでテーブルの構成を一度作っている状態、かつ、SQLiteからPostgreSQLに変更を行なった際に、insert文でレコードを追加しようとしたら、created_atカラムがnullであると返ってくる

##目標
- insert文でレコードを追加する際にcreated_atカラムに自動で現在時刻が入る

##対応
元々のテーブルの構成は以下のような感じ。
![スクリーンショット 2018-05-24 01.48.48.png](https://qiita-image-store.s3.amazonaws.com/0/237015/781e85d9-24f0-3954-edc1-b9802eeb1913.png)

で、今回は下記の部分を変更する
![スクリーンショット 2018-05-24 01.48.41.png](https://qiita-image-store.s3.amazonaws.com/0/237015/e0e6c984-dcb4-6954-a50e-0ea7605255bb.png)

※上の2つは縦線を境に対応する表だと思ってください！
<br>

解決策としてはalter tableコマンドを使用します。
alter tableコマンドは**テーブル定義の変更**をする際によく使います。

![スクリーンショット 2018-05-24 01.41.55.png](https://qiita-image-store.s3.amazonaws.com/0/237015/41feb06d-49bd-aaaf-fcae-ba129c91fa97.png)

上が僕が実際に書いた変更文です。
>alter table <テーブル名> alter column <カラム名> set default CYRRENT_TIMESTAMP;


![スクリーンショット 2018-05-24 02.00.20.png](https://qiita-image-store.s3.amazonaws.com/0/237015/a0880d66-a312-3d65-7da9-d62f9349e5c6.png)

するとこんな感じで、defaultの部分にCURRENT_TIMESTAMPが入りました！


これでcreated_atカラムに現在時刻が自動で挿入することができました！

<br>
【追記】
updated_atカラムの上記の方法で設定可能です。
ハニーポット観察(1)

複数のJoomla!の脆弱性を悪用した攻撃を検知しました。
検知内容から、GitHubで公開されている[XAttacker](https://github.com/Moham3dRiahi/XAttacker)を利用したものと考えられます。
以下は、POSTでバックドア等を作成しようとしたパス一覧です。

```URI.
POST /administrator/components/com_extplorer/uploadhandler.php HTTP/1.1
POST /administrator/components/com_rokdownloads/assets/uploadhandler.php HTTP/1.1
POST /com_sexycontactform/fileupload/index.php HTTP/1.1
POST /components/com_facileforms/libraries/jquery/uploadify.php HTTP/1.1
POST /components/com_foxcontact/lib/file-uploader.php?cid={}&mid={}&qqfile=/../../_func.php HTTP/1.1
POST /components/com_foxcontact/lib/uploader.php?cid={}&mid={}&qqfile=/../../_func.php HTTP/1.1
POST /components/com_jbcatalog/libraries/jsupload/server/php HTTP/1.1
POST /index.php?option=com_adsmanager&task=upload&tmpl=component HTTP/1.1
POST /index.php?option=com_fabrik&c=import&view=import&filetype=csv&table=1 HTTP/1.1
POST /index.php?option=com_fabrik&format=raw&task=plugin.pluginAjax&plugin=fileupload&method=ajax_upload HTTP/1.1
POST /index.php?option=com_foxcontact&amp;view=loader&amp;type=uploader&amp;owner=module&amp;id={}&cid={}&mid={}&owner=module&id={}&qqfile=/../../_func.php HTTP/1.1
POST /index.php?option=com_foxcontact&view=loader&type=uploader&owner=component&id={}?cid={}&mid={}&qqfile=/../../_func.php HTTP/1.1
POST /index.php?option=com_jwallpapers&task=upload HTTP/1.1
POST /index.php?option=com_media&view=images&tmpl=component&fieldid=&e_name=jform_articletext&asset=com_content&author=&folder= HTTP/1.1
POST /index.php?option=com_myblog&task=ajaxupload HTTP/1.1
POST /modules/mod_simplefileuploadv1.3/elements/udd.php HTTP/1.1
```

本ツールはCMSを対象とした検証ツールで、対象のサイトがどのCMSを使用しているかも判定してアクセスしてくれるみたいです。
XAttacker.plを読むと、下記の文字列マッチングで各CMSを判定しています。

```Joomla!.
$cms =~/<script type=\"text\/javascript\" src=\"\/media\/system\/js\/mootools.js\"><\/script>| \/media\/system\/js\/|com_content|Joomla!/
```
```WordPress.
$cms =~/wp-content|wordpress|xmlrpc.php/
```
```Drupal.
$cms =~/Drupal|drupal|sites\/all|drupal.org/
```
```Prestashop.
$cms =~/Prestashop|prestashop/
```

なるべく多くの方をOmotenashiさせていただくためには、上記のような文字列をサイトに含ませておくことが重要だと思います。（デフォルトでは入ってないからね）
RustのCombineパーサコンビネータの使い方例

#Combineって？
Rustのパーサコンビネータライブラリ。
Haskellのparsecを参考に作ったらしい。
LL構文解析。

#インストール
Cargo.tomlに

```toml
[dependencies]
combine = "ほしいバージョン"
```
みたいにして書く
ほしいバージョンは以下から確認して選んだらいい
https://github.com/Marwes/combine/releases

一応現時点の最新バージョンである3.3.0で説明していく。

#早速使う

ドキュメントも載せておく。

https://docs.rs/combine/3.3.0/combine/

```rust
extern crate combine;
use combine::char::char;
use combine::{Parser, many1};
fn main() {
    let r = many1::<String, _>(char('a').or(char('b'))).parse("aabbaaaaaabababa");
    match r {
        Ok((value, _remaining_input)) => println!("{:?}", value),
        Err(err) => println!("{}", err),
    }
}
```

これは、任意個のaまたはbにマッチするパーサだ。
char('a')とかにするとaにマッチするパーサが作れる。
orで「または」を表現できる。
many1で複数回続くことを表現できる。
many1の\<String,_>の部分の役割は、マッチした要素（今回だとchar型）の集合をどうやって表現するかを指定することだ。
String以外にもVec\<char>とかも指定できる。
FromIterator\<char>を実装している型であれば指定できるらしい。
作ったパーサはparse(パーサ対象)でパースし結果を得れる。
パーサ対象の型は&strだ。それ以外でもいけるがやり方よくわからん。
結果はResult型で、Okの場合、Ok(マッチしたもの,余ったもの)が返ってくる。

#再帰したパーサを作る
パーサを再起するには、関数に包む必要がある。
それ用の便利なマクロがあるのでそれを使おう。

```rust
#[macro_use]
extern crate combine;
use combine::Parser;
use combine::char::char;
use combine::parser::choice::optional;
use combine::parser::item::value;
use combine::stream::Stream;
use std::option;
parser!{
    fn paren[I]()(I) ->i32
    where [I: Stream<Item=char>]
    {
        char('(').with(optional(paren())).skip(char(')')).then(
            |op|
            {
                match op {
                    Option::Some(x)=> value(x+1),
                    Option::None=>value(1)
                }
            }
        )
    }
}

fn main() {
    let r = paren().parse("((()))");
    match r {
        Ok((value, _remaining_input)) => println!("{:?}", value),
        Err(err) => println!("{}", err),
    }
}
```

これはネストしたカッコのネスト数を出力するパーサだ。
実行結果は3になった。

parser!がパーサを関数化するマクロだ。

```rust
    fn paren[I]()(I) ->i32
    where [I: Stream<Item=char>]
```
この部分について軽く説明。
Iは入力される値の型を示している。今回だと&strだ。
i32はパース結果の型だ。
それ以外はよくわからん。
parenの内部でparenを呼び出しているので無限再帰しそうだが、一旦関数ポインタに入れて工夫しているのだろう。無限ループしたりはしない。
マクロマジックだ。withやskipやvalue,optionalについては各自で調べてほしい。
参考URLだけ載せておく
https://docs.rs/combine/3.3.0/combine/parser/item/fn.value.html
https://docs.rs/combine/3.3.0/combine/parser/trait.Parser.html
https://docs.rs/combine/3.3.0/combine/parser/choice/fn.optional.html
WireMockサーバーの導入手順

## 背景
マイクロサービスにより構築されたwebアプリケーションのテストコードではサービス間の通信が発生するケースがある。今回はサービス間の通信が発生するテストの実装を実装するためmockツールを検証したので導入手順を残しておく。

## 利用ツール
WireMock
thoughtworksの[Technology Radar](https://www.thoughtworks.com/radar/tools)でも紹介されており、この1年間でも進化が著しいとのことなので、さっそく試してみる。

## WireMock
HTTPベースのAPIのシミュレータ、mockサーバー。
http://wiremock.org/
https://github.com/tomakehurst/wiremock

## WireMockの起動
WireMockはjarファイルで提供されており、起動についてはこれを実行する。
http://repo1.maven.org/maven2/com/github/tomakehurst/wiremock-standalone/2.17.0/wiremock-standalone-2.17.0.jar

```Console
$java -jar wiremock-standalone-2.12.0.jar
```

`http://localhost:8080`でmockサーバーが起動する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/89990384-0384-404e-ecbc-85b7cde6ca98.png)

## WireMock API登録

### レスポンスマッピングAPIベース
※Chrome Postmanを使用して検証を実施
特定のリクエストに対して指定したレスポンスを返す設定を行う。
なお、マッピングにはWireMockの`/__admin/mappings`APIを使用する。
POST : /__admin/mappings
- `/hello`のPOST APIを定義する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/824985d1-a185-1fb3-0e78-396bdf5bd201.png)

- 登録された結果が返却される
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/e84d8763-bd8b-3773-b6cf-68e1b363e78a.png)

- 設定した結果が返却される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/e394afd6-4e37-c9b7-22bf-52ee28cd6560.png)

- 登録されたAPIはwiremock-standalone-2.12.0.jarと同一階層のmappingsに保存される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/b53bc015-c581-cb1b-1500-d8312349d60c.png)
- mapping配下
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/2023e118-2c4d-875a-1841-01c0485fc74b.png)

### レスポンスマッピング fileベース
- wiremock-standalone-2.12.0.jarと同一階層のmappingsにjson fileとして配置する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/18ea2168-9ff1-655a-f889-20082133214a.png)

```user.json
   {
	"scenarioName": "findUser",
	"request": {
		"url": "/user/find",
		"method": "GET"
	},
	"response": {
		"status": 200,
		"body": "Taro",
		"headers": {
			"Content-Type": "application/json"
		}
	}
}
```
- `__admin/mappings/reset` APIでWireMockの定義を更新する。
- APIを呼び出しを行うと登録されていることが確認できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/148be327-82de-7057-c247-a33600c67a11.png)

## WireMock API確認
- WireMockのAPIについては[公式のAPI docs](http://wiremock.org/docs/api/)を確認する、またはWireMockを起動後にブラウザで`__admin/docs`を開きSwagger UIの管理画面で確認できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/217019/197af68e-ba7a-0b6c-de29-79aa80bde4ea.png)

## 関連
- [WireMockを使って通信が発生するサービステストを実装してみる](https://qiita.com/Junichi_M_/items/d23c5bb61b4d5be9fc07)

## 参考文献
http://wiremock.org/docs/running-standalone/
Ubuntu 18.04 LTS で日本語入力を使えるようにする

# 方法
Ubuntu 18.04 LTS ではデフォルトでは、日本語入力できないようになっています。
キーボードの入力ソースを日本語(Mozc)に変更して、半角/全角キーを押すと、日本語入力できるようになります。

以下は日本語Mozcのインストール方法の紹介なので、既にインストール済みの方は読む必要はありません。

# 日本語(Mozc)のインストール方法①
環境によっては、入力ソースの日本語(Mozc)がデフォルトでインストールされていない場合があります。私自身の環境でもインストールされていませんでした。

日本語(Mozc)を使えるようにするためには、***ibus-mozc***のパッケージをインストールする必要があります。

```
# apt -y install ibus-mozc
```
そして、設定から入力ソースに日本語(Mozc)の追加を行えば、日本語入力ができるようになります。

# 日本語(Mozc)のインストール方法②
別のインストールの方法は、コマンドラインからではなく、言語サポートのソフトウェアからインストールを行います。
初めて言語サポートを開く際、言語サポートが完全にインストールされていないというポップアップが出てくると思うので、そこでインストールを選択すればibus-mozcを含めて色々なパッケージがインストールされます。
インストールされたら、あとは同じように設定から入力ソースに日本語(Mozc)を追加すればOKです。

# 参考文献
- https://linuxfan.info/ubuntu-18-04-japanese-input
- https://www.hiroom2.com/2018/04/29/ubuntu-1804-ibus-mozc-ja/
Laravel：5つの便利なBladeディレクティブ

## 元の記事
[Five Useful Laravel Blade Directives](https://laravel-news.com/five-useful-laravel-blade-directives)

## はじめに
この投稿は↑の記事を和訳したものです。

## 本文

テンプレートを簡素化するため、もしくは特定の問題を楽勝で解決できる便利なディレクティブを学ぶため、これから5つのBladeディレクティブを紹介します。特にLaravel初心者の方々にとっては、これらのヒントはLaravelのテンプレートエンジンであるBladeの素晴らしい機能を習得するのに役立つでしょう。

それでは、始めましょう。

# 1. ユーザーが認証されているかチェックする
ユーザーが認証されているかチェックする際には、以下のようにしてユーザーがNULLかどうかで判断できます。

```php
@if(auth()->user())
    // ユーザーは認証されています。
@endif
```

しかしながら、Laravelにはもっと綺麗に同じ機能を実現するカスタムBladeディレクティブが備わっています。

```php
@auth
    // ユーザーは認証されています。
@endauth
```

# 2. ユーザーがゲストかどうかをチェックする
以下のように`guest()`関数を利用すれば、ユーザーが認証されていないゲストであるかどうかをチェックする事ができます。

```php
@if(auth()->guest())
    // ユーザーは認証されていません。
@endif
```

しかしながらLaravelは`@guest`ディレクティブも提供しています。

```php
@guest
    // ユーザーは認証されていません。
@endguest
```

`@else`ステートメントを利用することで、これらの2つのディレクティブを組み合わせる事もできます。

```php
@guest
    // ユーザーは認証されていません。
@else
    // ユーザーは認証されています。
@endguest
```

# 3. 最初のViewが存在すればそれをInclude、存在しなければ二つ目のViewをInclude
テーマが複数あるウェブサイトを構築する際には、指定されたファイルが存在しているか、存在していない場合は次のファイルIncludeするといった機能が必要になります。
これは、Bladeの簡単な条件式を用いる事で容易に実現できます。

```php
@if(view()->exists('first-view-name'))
    @include('first-view-name')
@else
    @include('second-view-name')
@endif
```

最初に見つかったテンプレートをIncludeするには、以下のようにもっと短くてクリーンなディレクティブがあります。

```php
@includeFirst(['first-view-name', 'second-view-name']);
```

# 4. 条件を元にViewをInclude
認証されたユーザーの場合にのみコンテンツを追加する場合など、条件に応じてViewをIncludeできるのは非常に便利です。

`@if`の条件式を使うと、以下のように書き換える事もできます。 

```php
@if($post->hasComments())
    @include('posts.comments')
@endif
```

`@includeWhen`ディレクティブを利用すれば、もっとクリーンに（たったの1行で）条件に応じたViewをIncludeする事ができます。

```php
@includeWhen($post->hasComments(), 'posts.comments');
```

# 5. Viewが存在すればInclude
テーマをカスタマイズできるシステムもしくは、動的にViewを生成するようなシステムでは、必ず指定されたViewが存在するかをチェックしなければなりません。

もちろん、Viewヘルパーの`exists`関数を利用して対処する事ができます。

```php
@if(view()->exists('view-name'))
    @include('view-name')
@endif
```

しかし、`@includeIf`ディレクティブを利用すると、同じ事をするのにもっと簡単な方法がある事がわかると思います。

```php
@includeIf('view-name')
```

[official Blade documentation](https://laravel.com/docs/5.6/blade)を見れば、これらのヒントや他の便利なコツに加えて、Laravelのプロジェクトにおけるフロントエンドのテンプレートに関するスキルアップをする事ができるでしょう。

これらのディレクティブを利用して、リファクタリングを楽しんでください！
ImageMagickの備忘録

# 参考サイト
http://shumilinux.blogspot.jp/2016/06/imagemagick-mogrify.html
http://technique.sonots.com/?UNIX%2F%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%2F%E5%A4%89%E6%8F%9B%2Fmogrify
http://imagemagick.rulez.jp/

# mogrify
https://www.imagemagick.org/script/mogrify.php

### 縦横比を固定してリサイズ

```bash
# 縦横比固定で、幅を128pxにリサイズする
mogrify -resize 128x *.jpg
```

### 出力先を指定
`-path`オプションを使う。

```bash
# リサイズした画像を、一つ上の階層のoutputディレクトリに保存する
mogrify -path ../output -resize 128x *.jpg
```

```shell-session
$ mogrify -help
...
Image Settings:
...
  -path path           write images to this path on disk
```


# mogrify & convert

### クロップ（切り出す）

```shell-session
$ mogrify -crop "100x200+10+20"
```

https://www.imagemagick.org/script/command-line-options.php#crop


### 矩形で塗りつぶす

```shell-session
$ mogrify  -fill black \
 -draw "rectangle 10,20,110,120"
```

https://www.imagemagick.org/script/command-line-options.php#draw
http://imagemagick.rulez.jp/archives/744


### 四角の枠で囲う

http://d.hatena.ne.jp/iww/20120809/imagemagick 参考

```bash
# 枠線を書く順番
# 上辺
# 右辺
# 左辺
# 下辺

convert  -stroke red -strokewidth 5 \
 -draw "stroke-linecap square \
line ${lefttop_x},${lefttop_y} ${rightbottom_x},${lefttop_y} \
line ${rightbottom_x},${lefttop_y} ${rightbottom_x},${rightbottom_y} \
line ${lefttop_x},${lefttop_y} ${lefttop_x},${rightbottom_y} \
line ${lefttop_x},${rightbottom_y} ${rightbottom_x},${rightbottom_y} \
" ${src_image_file} ${output_image_file}
```

# その他

### `find`コマンドで見つけたファイルを変換

```
$ find . -name "*.png" | xargs mogrify -resize 224x
```


### parallelコマンドで並列化
作成中
sudoコマンドでaliasを使えるようにする

# 目的
Linuxでroot権限でコマンドを実行したいとき、わざわざrootユーザに変更するのではなく、sudoコマンドを使用することが多いと思います。しかし、通常のsudoコマンドでは、あとに続くコマンドがaliasかどうかチェックされないので、設定したaliasは使用できません。なので、sudoコマンドでもaliasを使用できるようにする設定をご紹介します。

# 方法
sudoを***sudo＋半角スペース***のaliasとして設定します。
そのために、自身がaliasを設定しているファイルに***`alias sudo='sudo '`***を追加してください。または、コマンドライン上で実行してください。
このように設定することで、sudoコマンドでもaliasが使用できるようになります。

# 仕組み
sudoのあとに半角スペースを入れることによって何が起こるかといいますと、bashのマニュアルには以下のように説明されています。
>
If the last character of the alias value is a blank, then the next command word following the alias is also checked for alias expansion.
（bashのマニュアルより引用）

つまり、あるaliasを展開(実行)するとき、そのaliasの設定値(シングルクォートで囲まれた部分)の最後の文字が空白(半角スペース)であれば、その次に続くコマンドもaliasかどうかチェックするということです。
例えば、`alias ll='ls -l`と設定して`sudo ll`を実行すれば、***`sudo ls -l`***として展開されます。
RaspberryPi3(STRETCH )にPython3.6を導入する

Raspbian(STRETCH) にはPython2.7.13とPython3.5.3がデフォルトで入っているが、
機械学習などでPython3.6が要求された時のために、3.6をインストールをしておく。

#準備
パッケージの更新とインストールしたpythonをビルドするためのツールをインストール

```
$ sudo apt-get update
$ sudo apt-get -y upgrade
$ sudo apt-get install build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev
```

#インストール
Python3.6をダウンロードしてインストールする。
ソースコードをダウンロードする時は、公式サイトのPython3.6の最新版をにファイル名を置き換える。

```
$ wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz
$ tar xf Python-3.6.5.tar.xz
$ cd Python-3.6.5
$ ./configure
$ make
$ sudo make altinstall
```

#動作確認
ターミナルでpython3.6と入力しpythonの対話環境が起動したらインストール成功

```
$ python3.6
Python 3.6.5 (default, May 23 2018, 23:42:48)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

```

#参考サイト
https://gist.github.com/dschep/24aa61672a2092246eaca2824400d37f
Android StudioのJUnitでハマった事

Android StudioでJSONObjectを使用したUTでハマりました。

下記のUTを実行すると。。。

```java:JSONObjectTest.java
public class JSONObjectTest {
    @Test
    public void testJsonObject() throws JSONException {
        JSONObject json = new JSONObject();
        json.put("key", "value");
        // 説明のため、簡単なテスト内容にしています
        assertEquals("value", json.get("key"));
    }
}
```

RuntimeExceptionが発生します。

```console:
java.lang.RuntimeException: Method put in org.json.JSONObject not mocked. See http://g.co/androidstudio/not-mocked for details.
```

これは、UTを実行するために使用されるandroid.jarには、実際のコードが含まれていないためです。

そして、上記のメッセージ通りに対応すると。。。

```gradle:build.gradle
android {

    // 下記を追加
    testOptions {
        unitTests.returnDefaultValues = true
    }
}
```

テストが失敗します。

```console:
java.lang.AssertionError: 
Expected :value
Actual   :null
```

これは、returnDefaultValuesをtrueにすると、RuntimeExceptionの代わりに、default値（null/0）を返すためです。
mockすることも可能ですが、UTの際はjavaのorg.jsonを使用することで対応が出来ます。

```gradle:build.gradle
dependencies {

    // 下記を追加
    testImplementation 'org.json:json:20180130'
}
```
GitLabのインストール

試しにやってみたのでメモ

# 手順
## 依存ライブラリのインストール

1. ライブラリをインストールする

    ```
    # yum install -y curl policycoreutils-python openssh-server openssh-clients
    ```

2. sshdサービスの自動起動を設定する

    ```
    # systemctl enable sshd
    ```

3. sshdサービスを起動する

    ```
    # systemctl start sshd
    ```

4. firewallコマンドを設定し、再読み込みする

    ```
    # firewall-cmd --permanent --add-service=http && systemctl reload firewalld
    ```

## Postfix のインストール

1. postfixパッケージをインストールする

    ```
    # yum install postfix
    ```
2. postfixサービスの自動起動を設定する

    ```
    # systemctl enable postfix
    ```

3. postfixサービスを起動する

    ```
    # systemctl start postfix
    ```

## GitLab Community Edition のインストール

1. GitLabリポジトリを登録する

    ```
    # curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
    ```

2. GitLabをインストールする

    ```
    # yum install -y gitlab-ce
    ```
3. Reconfigureを実行する

    ```
    # gitlab-ctl reconfigure
    ```

## 確認
マシンのホストもしくはIPアドレスにアクセスする
![GitLabログイン画面.png](https://qiita-image-store.s3.amazonaws.com/0/34297/59ea03c0-2d3f-e65d-afb7-ca993171aaf5.png)

# 参考
- [GitLab Installation](https://about.gitlab.com/installation/#centos-7?version=ce)
- [GitLab CEをインストールしてみた](https://www.creationline.com/lab/18684)
月500円～のIDCFクラウド上のサーバーでLet's Encryptを使ってhttps通信をする

#[自分で立てたAPI]()でSSL通信をさせようと思った
こちらの記事（[翻訳: WebAPI 設計のベストプラクティス](https://qiita.com/mserizawa/items/b833e407d89abd21ee72)）を見てAPIはSSL通信であるべきということだったので

[アニソン情報を取得するRESTfulAPIを公開しました。](https://qiita.com/2ndponpu/items/20cef429a47fa7cdfb69)

で公開したAPIに無料で使えるらしいLet's Encryptの証明書を使ってhttps通信に対応させてみました。

#Let's Encryptを使用する前に確認すること
Qiita:[Let's Encryptで無料SSL証明書を取得する](https://qiita.com/shojimotio/items/4fa82b21390e8a6d8446)より

> ## 取得前に確認すること
>
>- まずドメイン名を取得していること。
>
>- そのドメイン名をDNS登録してIPアドレスへ名前解決している事
>
>- 期限切れ時近くにくるメールの受信用メールアドレスを決める。


#環境
マシンはIDCFクラウドのlight.S1タイプ
IDCFクラウドは最低月500円からIaaSを利用できるのでクラウド+Linux周りの勉強にいいかもしれない。
というか環境構築から何から何までめちゃくちゃ勉強になったし公式のドキュメントも充実しているのでWeb系初心者に非常におすすめです。

|||
|:--|:--|
|OS|CentOS 7.4.1708|
|httpd|apache 2.4.6|

#IDCFクラウド管理コンソールでの準備
下図のようにHomePageServer01というマシンでWebサーバーが動いていて、https通信対応させたいとする。
![ServerName.png](https://qiita-image-store.s3.amazonaws.com/0/204347/2b4affaa-f19a-4a20-077a-0b3264ffef1c.png)



## 1. まずはIPアドレスメニューを開き、HomePageServer01が所属するIPアドレスをクリック
![IPアドレス.png](https://qiita-image-store.s3.amazonaws.com/0/204347/4d3e245e-7231-7c11-8baf-a070112d0801.png)

## 2. 設定画面が出てくるので、ファイアウォールのタブを開き、https通信用のポート(443)を追加
![FireWall.png](https://qiita-image-store.s3.amazonaws.com/0/204347/75ce04ee-b8a0-507b-e147-a82ae534e046.png)

## 3. ポートフォワードタブでパブリックポートの443へのアクセスをHomepageServer01の443ポートへ転送するように設定
![PortFoward.png](https://qiita-image-store.s3.amazonaws.com/0/204347/fa4b7ea5-47bd-c030-23b2-9dd7a33db4ce.png)

これで管理コンソールでの下準備は完了。


#Let's Encryptから取得した証明書をapacheに適用してhttps通信をできるようにする

こちらは上で引用させてもらった記事の内容をそのままやりました。

Qiita:[Let's Encryptで無料SSL証明書を取得する](https://qiita.com/shojimotio/items/4fa82b21390e8a6d8446)

コンソールでコマンドを叩いた後がちょっと面倒ですが
一度設定すればあとはコマンド一つで証明書の更新ができるのでとても楽ですね。
[cronで定期的にコマンドを実行するよう](https://qiita.com/msrks/items/6a180e03d7af622f2101)にすれば完全に自動で更新できます。
私は80日ごとに実行するように設定しました。


#httpでのアクセスをすべてhttpsでリダイレクトさせる
**※こちらはAPIではあまり推奨されていないようです。**
**　ブログやWebアプリで必要となってくるかも。**

こちらの記事の設定をそのまま追加しました。

[apacheでhttpへのアクセスをhttpsへ自動リダイレクトする](https://qiita.com/sue71/items/100004b704b9ff129b09)

rewritemoduleとても便利。

ブログとAPIサーバーを同じマシンで運用してるので
APIへのアクセスの場合はリダイレクトさせずに[Errorをきちんと返してあげる必要がある](https://qiita.com/mserizawa/items/b833e407d89abd21ee72#いつ何時もssl-通信を使おう)ようです。
今後の課題ですね。

#最後に

調べ始めてからものの30分ぐらいでhttps通信対応できました。

Let's Encrypt がわかりやすいのと先人の方のおかげではありますが、

Web周りのことの理解のスピードがどんどん上がっているのはとても嬉しい限りです。

**[APIの方](https://qiita.com/2ndponpu/items/20cef429a47fa7cdfb69)**も是非宜しくお願いします。
Angular アプリケーションのコードカバレッジを CircleCI の Artifacts で見る

# やりたいこと
- Angular アプリケーションを CircleCI 上でテスト
- コードカバレッジを出力
- コードカバレッジのレポートを CircleCI 上で見る

# Angular アプリケーションを CircleCI 上でテスト
- circleci/config.yml を用意
    - 前に https://qiita.com/kasaharu/items/affba96063cb8309118f でも書いたので詳細は割愛
 
```yaml:.circleci/config.yml
version: 2
jobs:
  test:
    docker:
      - image: circleci/node:8.9.4-stretch-browsers
    steps:
      - checkout
      - run: echo "Start test"
      - run: yarn install
      - run: yarn test --watch=false
workflows:
  version: 2
  test:
    jobs:
      - test:
```

# コードカバレッジの出力

- `--code-coverage` のオプションをつけるだけ

```diff:.circleci/config.yml
     steps:
       - checkout
       - run: echo "Start test"
       - run: yarn install
-       - run: yarn test --watch=false
+       - run: yarn test --watch=false --code-coverage
 workflows:
   version: 2
```

- ローカルで試すとプロジェクトルートに coverage/ が作成されることが確認できる

# コードカバレッジのレポートを CircleCI 上で見る

- test を実行すると coverage/ が作成されるのでこれを CircleCI の Artifacts に配置する

```diff:.circleci/config.yml
     steps:
       - checkout
       - run: echo "Start test"
       - run: yarn install
       - run: yarn test --watch=false --code-coverage
+      - store_artifacts:
+          path: coverage
 workflows:
   version: 2
```

- CircleCI で test が走ると下記のように Artifacts に格納される
<img width="1005" alt="artifacts.png" src="https://qiita-image-store.s3.amazonaws.com/0/28573/eae825c0-830f-4fa1-7f16-b44cf622bddf.png">


- index.html を押すとコードカバレッジが確認できる :tada: 
<img width="1070" alt="coverage.png" src="https://qiita-image-store.s3.amazonaws.com/0/28573/3fdd2a38-3d57-b8e8-65ee-30bb3ac75cbe.png">

# 参考リンク
- [Storing and Accessing Build Artifacts - CircleCI](https://circleci.com/docs/2.0/artifacts/)
nmcliコマンドでのネットワーク設定（備忘録）

CentOSでローカルIPアドレスを設定するときに、いまいちnmcliコマンドの使い方がわからなかったので、
備忘録として残しておきます。

__環境__
・CentOS 7.X（すでに8.X台が出ているので、少々古い情報ですね…）
・Ethernet:enp0s1（とします）

__ゴール__
・静的IPアドレスの設定
・ネットワークインターフェースの自動起動

1．すべての接続を表示する
   現在システムにあるすべての接続を表示させるために、以下のコマンドを打ちます。

` # nmcli con show`

  現在、アクティブな接続だけを表示させたい場合は、以下のコマンドを打ちます。

`# nmcli con show --active`

  もし、アクティブな接続がない場合は、何も表示されないはずです。

2．設定ファイルのバックアップを取得
   このまま設定をしてもいいんですけど、何かあった時のために、バックアップを取得しておきます。
   私の場合は、`/backup`を作成し、そこに設定ファイルのバックアップを取得するようにしています。

   `# mkdir /backup`
   `# cp -ip /etc/sysconfig/network-scripts/ifcfg-enp0s1 /backup`

   これで、万が一何か問題が発生しても、いつでもオリジナルのファイルを復元できます。

3．設定変更するデバイスをオフラインにする
   ネットワーク設定を変更する前に、インターフェースをオフラインにします。
   オフラインにするには、以下のコマンドを打ちます。

   `# nmcli dev disconnect enp0s1`

4．静的IPアドレスを設定する
   いよいよ目的の静的IPアドレスを設定します。
   今回は例として、`IPアドレス：192.168.100.100`、`サブネット：/24`としましょう。

   `# nmcli con mod enp0s1 ipv4.addresses "192.168.100.100/24"`
   `# nmcli con mod enp0s1 ipv4.method manual`
   `# nmcli con mod enp0s1 connection.autoconnect yes`

   これで
   ・静的IPアドレスの付与
   ・ネットワークの自動起動
   が設定されました。

   何が変化しているかは、`diff`コマンドで、オリジナルの設定ファイルと比較してみてください。

5．インターフェースを起動する
   そして最後に、設定変更したインターフェースを起動します。

   `# nmcli con up enp0s1`
   
   起動したか確認するには、` # nmcli con show`、もしくは`# nmcli con show --active`で
   確認してみてください。

6．最後に
   設定がちゃんとできているか、`ping`で確認します。
   ちゃんと設定できている場合は、応答が返ってくるはずです。

以上、`nmcli`を使った静的IPアドレスの付与手順でした。
Rails5とMySQLで絵文字を使えるようにするリンク集

いつも苦労するので...

大まかに...

- [ ] MySQL側の設定(character_set => utf8mb4, collation => utf8mb4_binあたり）を設定
- [ ] Railsの`config/database.yml`のcharaset, collation, encodingあたりをutf8mb4, utf8mb4_binに設定
- [ ] create_tableするときの設定を、`config/initializer/utf8mb4.rb`あたりに書いておく
- [ ] (DBに設定を反映させる）

## 一番参考になる
Rails5.1でutf8mb4（絵文字）に対応させる on @Qiita https://qiita.com/okamu_/items/5eb81688849fbe351350

設定し直すときは、データベースを作り直すのが楽（他の方法もありそう）

```
rails db:drop
rails db:setup
```

## その他参考になりそう
AWS Aurora MySQL5.7互換の文字コードをutf8mb4に変更 on @Qiita https://qiita.com/shohein/items/ed192526f68ceb1ec60b

RailsとMySQLでiOSの絵文字に対応(UTF8MB4化)した話 - Akata Works http://akataworks.hatenadiary.jp/entry/2016/02/26/102439
AVRマイコンでUART(シリアル)通信

#はじめに
AVRマイコンに用意されているUSARTを使ってUARTシリアル通信をしてみます。

USARTはUniversal Synchronous Asynchronous Receiver Transmitterの略で、
非同期通信のUARTだけでなく、同期通信も可能とした機能のことです。

今回は非同期通信のUARTについてのみ記述します。
基本的にはデータシートに記載されていることを簡潔に述べるようにします。

※サンプルコードの表記について
U16やF32はそれぞれunsigned short(16bit), float(32bit)を表しています。

#準備
AVRマイコンでUARTを使うには

1. ボーレートの設定
2. レシーバーとトランスミッターの有効化
3. フレームフォーマットの設定

を行う必要があります。

##1. ボーレートの設定
設定したいボーレート（通信速度）に合わせて通信用の内部クロックを生成するため、
下表の式に従ってレジスタUBRRの値を算出します。
BAUD:ボーレート
Fosc:マイコンのクロック

![baudrate.png](https://qiita-image-store.s3.amazonaws.com/0/193372/7478867a-1290-8b6d-3519-67c9134b4f24.png)

```c
/* Set baudrate parameter */
UBRR0 =  (U16)(((F32)F_CPU / (F32)BAUDRATE / 16.0) - 1.0 + 0.5);	//RoundOff
```
表と式が異なりますが、
そのまま計算すると**整数切り捨てのため誤差が大きくなるため、四捨五入で誤差を小さくしています。**

UBRRのサンプル値もデータシートに記載されているので、そちらを参照して定数で指定してもいいと思います。
例えば、マイコンのクロック8MHzにおいて、ボーレート19.2kbpsに設定したければUBRRは25になります。

![example_baudrate.png](https://qiita-image-store.s3.amazonaws.com/0/193372/2beff964-d954-3227-0324-1662aaa5725d.png)

誤差が大きくなると文字化けするので、適宜試しながら正しく通信できる速度を探ってください。


##2. レシーバーとトランスミッターの有効化
レシーバーとトランスミッターの有効化はUSARTのコントロールレジスタを叩いてあげます。

```c
/* Enable receiver and transmitter */
UCSR0B = (1 << RXEN0) | (1 << TXEN0);
```

##3. フレームフォーマットの設定
シリアル通信では1本の信号線で時系列に0か1を送ることで通信を行います。
そのため、あらかじめどのようなフォーマットでデータを送るかを定義する必要があります。

シリアル通信のフレームフォーマットは以下の要素で構成されます。



| 名称              | ビット数  |    意味    |
|:-----------------|:----------|:------------------|
| スタートビット    | 1         | フレームの先頭であることを示すビット |
| データビット      | 5 ~ 9     | 送るデータ。5~9bitの範囲で自由に設定できる。 |
| パリティビット    | 0 or 1    | ビット誤りしていないかをチェックするビット。無くてもよい。|
| ストップビット    | 1 or 2    | フレームの終わりであることを示すビット|

スタートビットは常に1bitなので、残りの3項目のビット数を設定します。

```c
/* Set frame format: 8data, 1stop bit : 8N1 */
UCSR0C = (0 << USBS0) | (3 << UCSZ00);
```

一般的には
データビット8bit、パリティビット無し、ストップビット1bit、の通称8N1という形式が多いです。


#使い方

送信・受信ともにUDR0というレジスタを用いて1byteデータを操作します。
1度の操作で1byteしか扱えないため、
複数byte扱いたい場合は単純にその分同じ操作を繰り替えすことになります。



##送信方法
送信バッファが空くまで待機し、UDR0レジスタに1byteデータを書き込みます。

```c
void Uart::Transmit1Byte(char data)
{
	/* Wait for empty transmit buffer */
	while ( !(UCSR0A & (1 << UDRE0)))
	{
		/* Do Nothing */
	}
	
	/* Put data into buffer, sends the data */
	UDR0 = data;
}
```

##受信方法
データを受信するまで待機（ポーリング）し、UDR0レジスタを読み取ります。

```c
char Uart::Receive(void)
{
	/* Wait for data to be received */
	while ( !(UCSR0A & (1 << RXC0)) )
	{
		/* Do Nothing */
	}
	
	/* Get and return received data from buffer */
	return UDR0;
}
```

#最後に
簡単ではありますが、AVRマイコンでUART通信をするための設定方法と使い方を記述しました。

今回は割り込みを使った記述をしていませんが、受信割り込みを使うこともできるので
受信するまでは他の処理をしておき、受信したらデータを読み取るといったプログラムも作れます。

基本的にはデータシートに使い方は全て記載されているので、興味あれば是非試してください。


#リファレンス
ATmega328p Datasheet
http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_Datasheet.pdf
Progate勉強の備忘録

【HTML】
input placeholder インプットの初期値
modal 子画面が開いている場合は親画面が操作できないこと
id 名前は１つだけ
class 名前の重複は可能

hタグ　改行されない
pタグ　改行される
【CSS】

【JS】
$('').click(function(){ 処理 });
addClass(**) **のクラスを追加すること

cssで非表示にしてから、特定条件で表示させるようにする
　modal、アコーディオンなど
  text テキストの表示

index 連続する要素の番号を取り出す　index($('***'))
 index No. は０から
 length で長さをとった場合は１から始まる

属性　class id href src type などなど
PHPで文字列を丸める処理3パターン「文字幅」「文字数」「バイト数」

# 目的

出来るだけサイズ制限ギリギリまで入力を許して，それをはみ出るタイミングで `…` を末尾に付与したい。但し，それを付与してもサイズ制限を超過しないようにうまく計算する。

（例） `あいうえお` → 最大4文字までで丸める → `あいう…`

## 最大文字幅 `$width` までで丸める

- [PHP: mb_strimwidth - Manual](http://php.net/manual/ja/function.mb-strimwidth.php)

素直にそのまま使うだけ。但し `a` が 幅1 で `あ` が 幅2 なのに `👪` が幅1 だったりするので謎。見た目の用途だと基本CSS使うのであんまり出番はないかも。

（関連）[mb_strimwidth関数なんて必要なかった（？） - Qiita](https://qiita.com/mpyw/items/e91aaec88880cb5ef37a)

## 最大文字数 `$length` までで丸める

- [PHP: mb_strlen - Manual](http://php.net/manual/ja/function.mb-strlen.php)
- [PHP: mb_substr - Manual](http://php.net/manual/ja/function.mb-substr.php)

素直にこのあたり使うだけ。

```php
function truncate(string $input, int $length = -1, string $trimMarker = '…'): string
{
    // 無制限またはサイズ内
    if ($length < 0 || mb_strlen($input, 'UTF-8') <= $length) {
        return $input;
    }

    // $trimMarker だけで $length を超えている
    if (mb_strlen($trimMarker, 'UTF-8') > $length) {
        return '';
    }

    return mb_substr($input, 0, $length - mb_strlen($trimMarker, 'UTF-8')) . $trimMarker;
}
```

## 最大バイト数 `$capacity` までで丸める

- [PHP: mb_strcut - Manual](http://php.net/manual/ja/function.mb-strcut.php)

知らない人も多いであろうマイナー関数。自分も今日久々に思い出しました。最大ペイロード長がバイト数で制限されているときとかに超便利。

```php
function truncate(string $input, int $capacity = -1, string $trimMarker = '…'): string
{
    // 無制限またはサイズ内
    if ($capacity < 0 || strlen($input) <= $capacity) {
        return $input;
    }

    // $trimMarker だけで $capacity を超えている
    if (strlen($trimMarker) > $capacity) {
        return '';
    }

    return mb_strcut($input, 0, $capacity - strlen($trimMarker)) . $trimMarker;
}
```
accepts_nested_attributes_forを用いて複数のmodelを一括で保存する

# 目的

複数のmodelのデータを一括して保存したい。

# accepts_nested_attributes_forについて

accepts_nested_attributes_forはnestで情報を保存するもの。

https://railsguides.jp/form_helpers.html#%E8%A4%87%E9%9B%91%E3%81%AA%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B

# 実装方法

## model

```ruby:例
class Post < ApplicationRecord
  has_many :schedules
  accepts_nested_attributes_for :schedules
end

 
class Schedule < ApplicationRecord
  belongs_to :post
end

```

## view

```ruby:view
<% @post = Post.new unless @post %>
<%= form_for @post ,:url => {:controller => :post,:action => :create} do |f| %>
<div class="form-group">
  <label for="exampleInputEmail1">タイトル</label>
  <%= f.text_field :title , class: "form-control" %>
  <label for="exampleInputEmail1">詳細</label>
  <%= f.text_field :des , class: "form-control" %>
  <%= f.fields_for :schedules ,@post.schedules.build do |sches_form| %>
    <label for="exampleInputEmail1">スケジュール名</label>
    <%= sches_form.text_field :name %>
    <label for="exampleInputEmail1">日程</label>
    <%= sches_form.datetime_field :sche_date , class: "form-control" , id: "calendar" , placeholder: "月：日：時間"%>
    <label for="exampleInputEmail1">URL</label>
    <%= sches_form.text_field :url %>
  <% end %>
  <%= f.submit "投稿" , class: "btn btn-primary" %>
</div><!--form-group-->
<% end %>
```

* form_forは@postでないと行けないが@postが情報を持っていない場合エラーが出るので<% @post = Post.new unless @post %>が必要
* <%= f.fields_for :schedules ,@post.schedules.build do |sches_form| %>で@post.schedulesを生成することでfomrが現れる
* これで勝手にschedulesがschedules_attributesになる

## controller

```ruby:controller
  def create
  @post = Post.new(post_params)
  if @post.save
    redirect_to "/"
  end
  end
  def post_params
     params.require(:post).permit(:title,:des,:user_id, schedules_attributes: [:sche_date, :name, :url])
  end
```
Anaconda で科学計算用の Python 環境構築

# 対象読者
python を使って機械学習などを始めようと思っていて, ネットを調べて Anaconda というキーワードにたどり着いた・・・という方.

# Anaconda とは
python と科学計算用のパッケージをまとめたセットです. 

- python ではパッケージを使って, python の機能をどんどん拡張して使うことができる. パッケージは本来, 個別にインストールする必要があるが, Anaconda をインストールすると今後使うであろう便利なパッケージがまとまって base 環境（後述）にインストールされる.
- conda コマンドを使ってパッケージの管理や仮想環境の管理（後述）が簡単にできる.
- OS に依存せず Python 環境が作ることができる.

# インストール方法
[公式ホームページ](https://www.anaconda.com/)からダウンロードして, 手順に従いインストールできます.

__インストール時の注意:__
環境 path を通すの忘れないようにしましょう.
（表示されるダイアログで path を通すにチェック, もしくは後で自分で path 設定を行う）

# インストール後に初めにするべきこと
インストーラーでインストールされたパッケージは最新のものではない可能性があります（バージョンが古い）. まず, 最新のパッケージに更新しておきましょう.

__手順:__
1. anaconda prompt / command prompt / terminal のいずれかを起動
2. 以下のコマンドを順に実行

```
conda upgrade conda
conda upgrade --all
```
コマンドの意味:

- パッケージ管理ツール conda を使って conda パッケージをアップグレード
- パッケージ管理ツール conda を使って現在の環境における全てのパッケージをアップグレード

# base 環境, 仮想環境
Anaconda では conda というパッケージ管理ツールを使ってパッケージや仮想環境の管理ができます.
具体的には,

- パッケージの追加/更新/削除
- 仮想環境の切り替え
 - 具体的には仮想環境ごとのパッケージ管理

などができます.　Anaconda をインストールした場合, 最初はデフォルトで base 環境のみが存在します.　仮想環境は必要に応じて作成する必要があります.

# 仮想環境の作り方
仮想環境を 作成/削除/activate/deactivate する方法の詳細は [こちらの記事](https://qiita.com/kattoyoshi/items/79e924c487cb7c2bec69) を参照してください.


# 個人的に良いと思う使い方
1. Anaconda インストール環境（base）は, 簡単に計算したりグラフ作成したり初期検討するために使う
2. 本格的にプロジェクトを立てて課題をこなす場合は, プロジェクトごとに仮想環境を構築して, 仮想環境上でプロジェクトに関する作業をする

プロジェクトごとに仮想環境を構築する意味:

- 仮想環境上ごとにパッケージ管理ができる. 例えばある仮想環境にパッケージを追加/削除/更新した場合, その仮想環境内にしかパッケージが追加されない.
- 他のマシンで同じ仮想環境を構築すれば、ライブラリバージョン違いにより生じるつまらないエラーを回避できる
- ライブラリ一覧ファイルを出力できるため, 他のマシンでも同じ環境が構築可能
find コマンドの出力を while read ループ処理（シェルスクリプト）

こんにちは。
```find``` コマンドで検索した複数のファイルを処理するシェルスクリプトを作りました。

```while read``` を使ってファイルを一つずつループ処理し、下記例は ```ls``` コマンドのような働きをします（極めて多数のファイルにも対応可能のはず）。

```
$ ./ls.sh "*.jpg"
./1.jpg
./2.jpg
./3.jpg
```

```ls.sh
#!/bin/sh
filePattern="$1"
find . -maxdepth 1 -name "$filePattern" | while read -r fname
do
  echo "$fname" | grep -q "^/" && fname="."$fname
  echo "$fname"
done
exit $?
```

上記の ```echo $fname|grep "^/"``` の箇所は、ファイル名先頭の ```.``` の欠落の発生に気が付いたので善後策です（まだ原因は調べていません）。
railsでmodel削除する際の注意

# なぜdestroyだと危ないか

railsでmodelの名前ミスったり、削除したくなったときにそのままdestroyを使うとmigrationfileも消えてまずい。migrationfileが消えるとなぜまずいかというとrailsは毎回全部のmigrationfileを読み込んでschemeと整合性が取れているようにできているので途中のfileも消えると整合性が取れず、エラーが出る。

# 削除方法

modelは下記のやり方で削除するのが良さそう。名前変更の際も一旦削除して作っちゃったほうが色んなファイルの変更が間違ってた際のエラーを避けれる。

## migrationfileの作成

```
rails generate migration drop_table_users
```

```
def change
 drop_table :users
end
```

## 関連ファイルの削除

modelファイルの削除
app/models/user.rb

testファイルの削除
test/models/user_test.rb

fixturesファイルの削除
test/fixtures/users.yml
vue-routerを利用したSPAにGoogle Analyticsを仕込む方法

# 初めに

以前vue-cliを利用してSPAを作ってリリースをしたのですが、Google Analyticsを入れてないことに気づきました。

静的なサイトにはGoogle Analyticsを入れたことはあったのですが、SPAのような動的にURLが変わるサイトに入れたことはなかったので、入れ方を書いていきます。

トラッキング方法はanalytics.jsではなく、gtag.jsになります。

## サイトについて

[holy-place-photo.com](holy-place-photo.com)

SPAはvue-cliを利用して実装しました。


# 静的なサイト場合

静的なサイトの場合は下記コードをトラッキングしたい全てのページのheadタグ内に埋め込みます。

※UA-XXXXXXX-XはトラッキングID

```javascript
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXX-X"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());

  gtag('config', 'UA-XXXXXXX-X');
</script>
```

# SPAの場合

SPAの場合は一度読み込んだ後は、新しいページのコンテンツをダウンロードしURLを更新するため、トラッキングが初めの読み込みしか行われません。

そのためSPAをトラッキングする場合はURLが更新される度に、手動でトラッキングする必要があります。

手動トラッキングは下記コードで実現できます。（/new-page.htmlにURLを更新した場合）


```javascript
gtag('config', 'UA-XXXXXXX-X', {'page_path': '/new-page.html'});
```

今回vue-cliを利用しているので、URLが更新された後に上記コードを実行したいためvue-cliのafterEachを利用します。

```javascript
const router = new Router({
  routes: [
    {
      path: '/',
      component: top,
    },
    {
      path: '/hoge',
      component: hoge,
    },
  ],
});

router.afterEach((to, from) => {
  gtag('config', 'UA-XXXXXXX-X', {'page_path': to.path});
})
```

# 終わりに

vue-cliがURL更新後に実行される関数を用意してあったので、簡単に実装できました。

# 参考サイト

[gtag.js を使用した単一ページ アプリケーションのトラッキング](https://developers.google.com/analytics/devguides/collection/gtagjs/single-page-applications?hl=ja)


[ナビゲーションガード](https://router.vuejs.org/ja/advanced/navigation-guards.html)
Pythonista3 をいろいろ触ってみる_その1


## 1.Pythonistaの使い方

### 1.1.画面構成

- Pythonista3は、3つのパネルで構成されている<br><font color="Red">※左右のスワイプジェスチャーにて切り替えることができる</font>


	**1. スクリプトライブラリ**
	**2. コードエディタ**
	**3. インタラクティブプロント**

#### 1.1.1.スクリプトエディタ

- 作成したスクリプトとサンプルスクリプトが表示される<br><font color="Red">--> スクリプト以外のファイルも表示される</font>
- 新しいスクリプトを作成するには、ファイルブラウザ下部の「＋」ボタンをタップする<br><font color="Red">--> テンプレート選択画面が開き、ファイルの種類とファイル名を設定する</font>

![IMG_0162.jpg](https://qiita-image-store.s3.amazonaws.com/0/33479/15e2010f-6c82-5b52-cd5a-d410f14a4f97.jpeg "IMG_0162.jpg")

![IMG_0163.jpg](https://qiita-image-store.s3.amazonaws.com/0/33479/ca6eaef5-54ac-77e0-9d12-38061cc21980.jpeg "IMG_0163.jpg")


#### 1.1.2.コードエディタ

- キーボード上部に <font color="Red">**特殊文字**</font> を含む、入力ボタンが表示される

![IMG_0164.jpg](https://qiita-image-store.s3.amazonaws.com/0/33479/96350901-f7e9-3e09-b519-478c6db5ff9b.jpeg "IMG_0164.jpg")

- シーン、UI、サウンドなどのモジュールを使用する時は、キーボード上部の「＋」ボタンを使用して、<br>内臓の画像や効果音、色の名前を挿入できる
- オリジナルのアクションメニューを追加して開発を効率化することもできる

#### 1.1.3.インタラクティブプロント

- Pythonを最も簡単に使い始める方法
- 入力するとすぐに実行されて、簡単に構文を試すことができる
- Python2系とPython3系を切り替えて使用することができる

### 1.2.キーボード

- 純正のiPadキーボード以外に、外部キーボード（Bluetoothキーボードなど）を使用することができる<br><font color="Red">--> 操作性としては、外部キーボードを使用したほうがいい（※個人的な感想）</font><br><font color="Red">--> 外部キーボードだとショートカットキーを使用できる（※キーボードによって異なる）</font>

### 1.3.Pythonistaアプリの拡張

- 他アプリからPythonスクリプトを実行できるようにアプリ拡張機能が含まれる
- iOS共有シートから呼び出すことができる

### 1.4.PythonistaのURLスキーム

- 下記のURLスキームを使用して他アプリから起動できる

```
pythonista3:// ....
```