OmniAICreator/Qiita-1.07M huggingface dataset:
Arduino IDE で作成した .ino ファイルを、C++コンパイラでコンパイルできる .cpp ファイルに 

# 実質最終更新日
実質最終更新日 2019年02月21日です。
2025年にヘッダだけ直しましたが記述は直してないので古い内容あったらすみません。

# これまでのあらすじ
Arduino-ESP32 で書いたプログラムを ESP-IDF でビルドしたいのだ。しかしAruino IDE で作成した .ino ファイルは .cpp じゃないので、ESP-IDF の C++コンパイラではコンパイルできない。

# 言うてもArduino IDE だって C++コンパイラ通してるんでしょう？
ログを詳細に見ればわかるとおり、Arduino IDE だって avr-g++ とか xtensa-esp32-elf-g++ とか C/C++コンパイラを通しているのである。
さらに良く見ると sketch.ino 等の拡張子ではない、 sketch.ino.cpp とかいうファイルをコンパイルしているので、そんなファイルがあるならそいつを ESP-IDF に持って行けば絶対コンパイルできるはず。

# C++コンパイラ通せる sketch.ino.cpp ってどこにある？

探すのが面倒な場所にあるので、場所を変えておくのが楽。

[参考サイト：Arduino IDEのビルドを速くする｜オブジェクトファイルの出力先を固定する](https://nagayasu-shinya.com/arduino-buildpath-fix/)

変更の方法。まずファイル-環境設定を開くと下の方に**「以下のファイルを直接編集すれば、より多くの設定を行うことが出来ます。」**との文言とpreferences.txt のフルパスが書いてあって、ファイル名をクリックするとそのフォルダが開く。
Arduino IDE を一応終了させてから preferences.txt を編集。build.path の行を探して 
`build.path=c:\arduino_b` 
とでも指定して保存して終了。ディレクトリは自分で作っておく。
改めて Arduino IDE を起動して適当な sketch.ino をコンパイルすれば、 c:\arduino_b\sketch\sketch.ino.cpp が生成されている。

# 一部ライブラリも持って行かないといけない
ESP32 特有じゃない Arduino ライブラリ（LiquidCrystal とか) は、ESP-IDF にも Arduino-ESP32 にも無いライブラリなので自分で持って行く必要がある。

ESP32特有の（もっていかなくてもいい）ライブラリは Windows に Arduino-ESP32 1.0.1 を入れた場合なら下記場所にある。
`C:\Users\uesrname\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.1\libraries`
ESP-IDF の components として Arduino-ESP32 を入れてるなら、そのディレクトリに libraries というディレクトリがあり、中に同じ物が入っている。

LiquidCrystal のようなものも、libraries に置けば済むのであれば楽なのだが、 CMakeLists.txt とか書き直さないといけないようで面倒だ。

自分は sketch.ino.cpp と同じ所に LiquidCrystal.h と LiquidCrystal.cpp を置いて、sketch.ino.cpp の中に `#include <LiquidCrystal.h>` と書いてあったら `#include "LiquidCrystal.h"` に直すことで対応している。（ダブルクオートであれば、.cppファイルと同じフォルダにある .h を読んでくれるが、<> だと読んでくれない）

あとは ESP-IDF のバージョンが Arduino-ESP32 と整合していて、sdkconfig が適切で、partitions.csv も適切なら make が通って make flash で書き込める。
 ESP-IDF のバージョンが Arduino-ESP32 と整合 については[すでに書いた記事](https://qiita.com/ajtajta_j/items/08c9be0937a8ada5e4d6) の通りだが、他はまた別の記事として書く、かも。

# ちなみに .ino.cpp への変換は何をやってるかというと
[Arduino IDE の Build process - Pre-Processing](https://github.com/arduino/Arduino/wiki/Build-Process#pre-processing) 

.ino ファイルは以下の プリプロセスを経て .ino.cpp ファイルに変換されてから c++コンパイラでコンパイルされます。

・スケッチフォルダの中の全ての .ino ファイル(IDEにてタブ表示されているもの。タブ名＝拡張子なしのファイル名）は１つに統合される。
　先頭はスケッチフォルダと同じ名前で拡張子 .ino のファイル。その後は残りのファイルを abc 順に。そして、.ino.cpp ファイルとして一旦保存する。
・もしなければ #include "Arduino.h" を .ino.cpp ファイルの先頭に。このヘッダは 選択されているボードの core フォルダにあり、Arduino Core に必要な定義をしています。
・プロトタイプ宣言の無い関数すべてについてプロトタイプ宣言が作成され、.ino.cpp の最初の関数定義の前に挿入されます。
・コンパイラの warning や error が元々のファイルの名前と行番号で出力されるように #line ディレクティブが必要箇所に挿入されます。

つまり、ハードウェアに関係無いお話、だったりします。
GCP + pythonをやっていくとき、どのサービスを使うか？

# 概要

pythonでwebアプリを作って公開したいとき、GCPでは様々なサービスを利用できる。
それぞれ特徴があるため、目的に合わせて選別する必要がある。

# Cloud Function

公式サイト
https://cloud.google.com/functions/docs/

+ 長所
    + 流行りのサーバレス
    + スクリプト置くだけなのでサーバ側のことを考えなくて良い
    + HTTPアクセスに対してスクリプト実行するので一応webサイトっぽいものも出来る
+ 短所
    + 時間トリガを使うのが面倒
        + Pub/Sub, Schedulerと組み合わせる必要がある
    + 1スクリプトにやりたい処理を書き込むしかないため管理が難しい
        + 普通のソフトウェアなら役割ごとにファイルを分割する

# Firebase

公式サイト
https://firebase.google.com/docs/

REST API
https://firebase.google.com/docs/database/rest/start?hl=ja

+ 長所
    + 認証機能がブラウザ上からポチポチ設定で出来るため楽
    + 静的ファイルなら置くだけで動作するので楽
+ 短所
    + python使うとしたらサードパーティ製ライブラリが必要
    + REST APIの操作に限られるので出来ることは少ない

# GAE (Google App Engine) + python2 SE

公式サイト
https://cloud.google.com/appengine/docs/

+ 長所
    + webアプリに必要なSDKが豊富
    + アプリ外の設定を考えずに利用可能
    + ErrorReporting, Loggerがあるので監視も楽
    + cron.ymlをデプロイするだけでスケジューラ使用可能
        + Cloud Functionより楽に時間トリガを使える
+ 短所
    + 2系なのでもうすぐサポート切れる
    + 使用できない外部パッケージが多い

# GAE (Google App Engine) + python3 SE

+ 長所
    + 2系 SEでは使えなかったパッケージ（scipy, pandasなど）が利用できる
+ 短所
    + GAE SDKが未対応のライブラリ(ndbなど)が多く、2系と比べ使いにくい

# GAE (Google App Engine) + python3 FE

+ 長所
    + webアプリに必要なSDKが豊富
    + 2系 SEでは使えなかったパッケージ（scipy, pandasなど）が利用できる
+ 短所
    + SEに比べて高い
    + 起動が遅い

# GCE (Google Compute Engine)

+ 長所
    + インフラ周りまで全ての設定が可能
    + 従来のアプリと同様の構成なので、そのままデプロイすれば利用可能、移行が楽
    + GAEと異なりパッケージの制限など検討しなくていい
    + Dockerでデプロイ可能
+ 短所
    + webサーバなどGAEでは不要だった項目の設定が必要で面倒

# 結論

+ 基本はGAE使うのがベター
+ 裏側で複雑な操作をしないのならfirebase
+ アプリ外の設定を行いたいならGCE

# おまけ

GKE (Google Kubernetes Engine)は使ったことないので書いてません。
使うとしたら対象のプロダクトが成熟して、マイクロサービス化するとなったときにようやく出番が出るものという認識。
BeebotteのメッセージをRaspberry Piで受信する

Raspberry Piと連携するAlexaスマートホームスキルの開発を検討しています。Alexa→Lambda関数→AWS IoT→Raspberry Piでも良いのですが、AWS IoTは従量料金制ということもあり、とりあえずはAWS IoTではなくBeebotteと使おうと思っています（2019年2月現在Beebotteはフリープランでも私の用途には十分すぎる量のメッセージが利用できます）。そこで、今後Lambda関数にのせるべくBeebotteにPublishするコードを作成してNode-REDのmqtt inノードで受信を行ってみました。BeebotteにPublish/Subscribeしようと思っている方はぜひお試しください。（ラズパイからBeebotteにPublishするのであれば、Node-REDのmqtt outノードを使ったほうが楽です。）

# Beebotteの準備とNode-REDでのSubscribe
[こちら](https://qiita.com/HeRo/items/9978bedf353fc790a5b5)に分かりやすくまとまっていますので、ここでは割愛します。

# BeebotteへのPublish
[こちら](https://beebotte.com/tutorials/quick_start)のNodejsのコードをほぼそのまま利用しています。異なる点としては、'Hello World'を渡すのではなく、家電操作を見据えて複数の要素を返していることくらいです。AWS LambdaはNodejsのサンプルが多そうでしたのでNodejsにしています。

```test_publish.js
var bbt = require('beebotte');

var API_KEY = 「API Key」;
var SECRET_KEY = 「Secret Key」;
var CHANNEL = 「チャネル名」;
var RESOURCE = 「リソース名」;

var bclient = new bbt.Connector({apiKey: API_KEY, secretKey: SECRET_KEY});

bclient.publish(
  {channel: CHANNEL, resource: RESOURCE, data: {
    'resource': 'light', 'command': 'on', 'option': '30'
  }},
  function(err, res) {
});
```
※ 「API Key」「Secret Key」「チャネル名」「リソース名」を適宜置き換えてください。「API Key」と「Secret Key」は2019年2月現在BeebotteのWebページで『Account Settings』→『Access Management』タブから参照可能です。「チャネル名」と「リソース名」はご自身で設定したものです。
※ 今回はこれを受信するのみで家電操作は行いません。

これを実行するとNode-RED上のmqtt inノードで受信できるはずです。mqtt inノードの設定の注意点としては、トピックには「チャネル名/リソース名」を設定することくらいかと思います。また、mqtt inノードのすぐ次にjsonノードを配置することで、Subscribeしたdataを分解することができます。
![json.JPG](https://qiita-image-store.s3.amazonaws.com/0/317078/8dea39d5-c345-eb6f-33c3-0f1cb0602816.jpeg)

先ほどのサンプルプログラムから送信した要素は、
- msg.payload.data.resource（"light"が入る）
- msg.payload.data.command（"on"が入る）
- msg.payload.data.option（"30"が入る）
といった形で後続の処理で利用可能になります。

今後のスマートホームスキル作成でも当該トピックをSubscribeするmqtt inノードを1つ用意しておき、msg.payload.dataのresourceで操作対象を切り替え、commandとoptionで操作内容を切り替える予定です。

# 参考にしたサイト
[Beebotte のメッセージを Node-RED で受ける](https://qiita.com/HeRo/items/9978bedf353fc790a5b5)
[beebotte Quick Start Guide](https://beebotte.com/tutorials/quick_start)
個別銘柄の株価データ

トレーディングアプリとして作成し、AnalysisTechniqueのInitializedイベントに「AnalysisTechnique_Initialized」を設定して動かし

```EasyLanguage
using elsystem;
using tsdata.marketdata;
 
vars:
    PriceSeriesProvider psp(Null),
    varIndex(0);
     
method void AnalysisTechnique_Initialized( elsystem.Object sender, elsystem.InitializedEventArgs args ) 
begin
     
    ClearPrintLog;
     
    psp = PriceSeriesProvider.Create();
 
    // 銘柄の設定
    psp.Symbol = "1321";
     
    // チャートの設定（足種など）
    psp.Interval.ChartType = DataChartType.Bars;
    psp.Interval.IntervalType = DataIntervalType.Daily;
    psp.Interval.IntervalSpan = 1;
     
    // 期間の設定
    psp.Range.Type = DataRangeType.Years;
    psp.Range.Years = 1;
    psp.Range.LastDate = Datetime.Create(2017,4,30);
     
    psp.LoadProvider();
 
    // 取得した株価データを印刷ログに出力
    varIndex = 0;
    For Value1 = 0 to psp.Count - 1 Begin
        varIndex = ( psp.Count - 1 ) - Value1;
         
        Print(
            psp.Symbol, "   ",
            psp.Time[varIndex].Format("%Y/%m/%d"), "    ",
            psp.Open[varIndex].ToString(), "    ",
            psp.High[varIndex].ToString(), "    ",
            psp.Low[varIndex].ToString(), " ",
            psp.Close[varIndex].ToString(), "   ",
            psp.Volume[varIndex].ToString(), "  "
        );
    End;
end;

```
pyodbcが動くdockerコンテナの作り方

pythonを使ってSQLServerのデータを操作するときに使えるpyodbcをdockerコンテナで動かそうと思って作ったお話です。

# 作ったDockerfile
下記の設定で警告出ずに作れました。ここには最低限のものしか入ってないので、必要があれば追加してください。

```
FROM python:3.6.4
# 環境変数
ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NOWARNINGS yes

# インストールに必要なライブラリ
RUN apt-get update && \
    apt-get install -y apt-utils apt-transport-https

# ms製のライブラリ入れるために必要
RUN curl https://packages.microsoft.com/keys/microsoft.asc | apt-key add -
RUN curl https://packages.microsoft.com/config/debian/8/prod.list > /etc/apt/sources.list.d/mssql-release.list

# 反映
RUN apt-get update

# pyodbc動かすために必要になるライブラリ達
RUN ACCEPT_EULA=Y apt-get install -y msodbcsql17 && \
    ACCEPT_EULA=Y apt-get install -y mssql-tools && \
    ACCEPT_EULA=Y apt-get install -y unixodbc-dev

# goal
RUN pip install --upgrade pip && \
    pip install pyodbc
```
# 解説
いくつか補足で説明をします

## 環境変数
DEBIAN_FRONTENDは`Debian Installer パラメータ`と呼ばれるもので, noninteractiveにしておけば Debian Package をインストールする際に手動設定をスキップしてくれます。
参考: https://www.debian.org/releases/sarge/s390/ch05s02.html.ja

DEBCONF_NOWARNINGSは最初のapt-utilsのインストールの時にapt-utilsが無いことが原因であるとの旨の警告があり、ジレンマなので無理やり消しています(いい方法があれば知りたい)

## インストールに必要なライブラリ
```
apt-get install -y apt-utils apt-transport-https
```
apt-utilsは入れておかないと警告が出てしまうので入れてます。
apt-transport-httpsはms用のライブラリを入れる時にhttpsが使われるので必要です。

## ms製のライブラリ入れる
ここは公式ドキュメントに準じているだけです。
https://docs.microsoft.com/ja-jp/sql/connect/odbc/linux-mac/installing-the-microsoft-odbc-driver-for-sql-server?view=sql-server-2017

# 公式にあった
https://github.com/Microsoft/mssql-docker/tree/master/oss-drivers/pyodbc
公式にいい感じのが用意されてるのに気づいたのは最近。こっち使った方がいいと思いますが、debianでやりたいとか何かしらの事情で自前で作りたい時に参考になれば。
pandasでcountif

Pythonでcountifをやるときは一回真偽値で出して整数型に変換したあと和を取るのがスマートだと思う。

```python:countif
def f(a):
    return sum((条件式).astype(int)) 
```

```python:例
def f(a):
    return sum((a.values >= 3).astype(int)) 

a = pd.Series([3, 2, 2, 5, 7])
f(a)　#3が出力
```
RHEL8 betaを使ってみる(podmanも使ってみる)

![RHEL.png](https://qiita-image-store.s3.amazonaws.com/0/258841/860dd936-034c-aa58-3c87-dd897248138e.png)

## 背景

Red Hatは2018年の11月15日にRHELの次世代バージョンRHEL8のベータバージョンを公開した。
ダウンロードはしたもののインストールして試すまでには至らなかったが時間があったのでちょっと調べて使ってみました。

製品リリースは2019年中とのこと。
コンセプトは「Application Streams」らしい。

Fedora28がベースとなっていてカーネルも従来RHEL7の3系から4.18となっている。

## リリース履歴

リリース|製品リリース日|Red Hat がリリースするエラータ日|カーネルのバージョン
-------|-------------|------------------------------|------------------
RHEL 7.6|2018-10-30|2018-10-30 RHBA-2018:3014|3.10.0-957
RHEL 7.5|2018-04-10|2018-04-10 RHEA-2018:0700|3.10.0-862
RHEL 7.4|2017-07-31|2017-07-31 RHBA-2017:1850|3.10.0-693
RHEL 7.3|2016-11-03|2016-11-03 RHEA-2016-2544|3.10.0-514
RHEL 7.2|2015-11-19|2015-11-19 RHEA-2015:2461|3.10.0-327
RHEL 7.1|2015-03-05|2015-03-05 RHEA-2015:0524|3.10.0-229

自分の環境を確認するには以下のコマンドで見れます

``` bash
# リリース番号確認
$ cat /etc/redhat-release

# カーネルバージョン確認
$ uname -a
```

## 入手

下記サイトからisoが入手できる。
ダウンロードにはRed Hatユーザーアカウントが必要でない場合は新規作成で使えます。

https://developers.redhat.com/rhel8/getrhel8/

## 用意するもの

* VMware Workstation 15 Player
* RHEL8 betaのiso

## インストール

公式で大変わかりやすく説明されていました。
こちらは省略します。

システム要件：

* A 64-bit x86 or ARM machine
* 4 GB of RAM
* At least 20 GB of available disk space

参考：https://developers.redhat.com/rhel8/install-rhel8/

この画面はほとんど変わりなし
分かりやすくて直感的に選べていい。

![Step-by-Step-Guide-To-Install-RHEL-8-Select-Language.jpg](https://qiita-image-store.s3.amazonaws.com/0/258841/9a1f2f78-7ce4-0db1-6bd0-d795fac75b53.jpeg)

ログイン画面

![Step-by-Step-Guide-To-Install-RHEL-8-Login-Screen.jpg](https://qiita-image-store.s3.amazonaws.com/0/258841/3874ba0e-5c79-485d-8e61-8c3560a974bb.jpeg)

## 特徴

#### コンテナ管理ツール

追記予定

#### Chronyのみサポート

RHEL7でChronyが標準となったがntp関連のコマンドも使えたが8からはデフォルトでは使えない
ntpd と chronyd の大きな違いの 1 つは、コンピューターのクロックを管理するために使われるアルゴリズム。

#### pythonコマンドがない

RHEL8のデフォルトでは、pythonコマンドが無い。

``` bash
$ python
-bash: python: command not found
```

詳しくは下記をご参照ください
https://rheb.hatenablog.com/entry/rhel8-python

#### iptablesからnftablesへの置き換え

RHEL８からはパケットフィルタリングにnftablesを採用している
iptablesの実態がnftablesへのシンボリックとなりiptablesはそのまま使えるようです。

## まとめ

とりあえずbeta版を使ってみました。
centOS8もリリース予定はあるとのことなのでリリースされたらこっちを試そうと思います。

メインとしていじったコンテナ管理ツールについては別途追記します。

## 参考リンク

[リリースノート](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8-beta/html-single/8.0_beta_release_notes/index)
[Red Hat Enterprise Linux 8 のPython事情](https://rheb.hatenablog.com/entry/rhel8-python)
[Python in RedHat Enterprise Linux 8](https://qiita.com/go50/items/9d6f00851ca4e7f7a939)
[CentOS8リリースに向けての準備(Road to 2024.06)](https://suzume8-vc.net/?p=1409)
Rails Tutorialのbundle installでエラーが出たときの対処法

## エラー内容

```
You have requested:
  minitest = 5.10.3

The bundle currently has minitest locked at 5.11.3.
Try running `bundle update minitest`
```

## 原因

Gemfile.lockの内容より古いバージョンを指定してインストールしようとすると発生するエラーのようです。
今回の場合、Gemfile.lockではminitestのバージョンが`5.11.3`となっていましたが、Gemfileの方は`5.10.3`でインストールしようとしたため発生したようです。

## 対策

今回の場合、Gemfile.lockを削除することで解決します。
最初は削除していいか戸惑いましたが、このGemfile.lockはインストールした結果を依存関係も含めて記したもので、再度bundle installを実行することでその結果のGemfile.lockが生成されるようです。
(Gemfile.lock自体は開発環境と運用環境を同じにするために用いられるファイルのようです)
micro:bitで超簡単計測→csv

#グラフを使うと簡単にデータ計測できる

microbitとPC（macを使用。ブラウザはChrome。ファームウエアを最新に書き換え)を使ったら、Editor上でデータ取得できてしまうのですね。多分　Winでも問題なくできると思います。

<img width="920" alt="スクリーンショット 2019-02-21 21.26.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/237044/6aef3c7c-67a0-6fa8-34fe-78e3d6b19283.png">


- [情報元](https://www.stem.org.uk/system/files/community-groups/topic-files/2018/03/Data-capture%20and%20analysis%20with%20the%20BBC%20microbit.pdf)
- [公開ソース](https://makecode.microbit.org/_f6L5WfV8YikY)
- Aボタンを押すと光センサーの値をグラフ表示開始
- そのときエディタ上に「コンソールを表示」のボタンがでてくる。<img width="1263" alt="スクリーンショット 2019-02-21 21.27.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/237044/a2354b35-f114-eddd-9930-fa77f33476d2.png">

- そのボタンを押してコンソールを表示<img width="1436" alt="スクリーンショット 2019-02-21 21.28.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/237044/69e106f8-dbf2-b972-3728-b05a04a89487.png">

- コンソール上にリアルタイムで計測値がグラフ化される。
- そのグラフの右上にある、ダウンロードボタンを押すと計測していたデータがCSVとしてDLできる。
- わざわざシリアル通信してファイル作成をする必要がないようだ（絶句）。
PropTypesでpropsのデータ型を指定する

## はじめに
Reactでは、型チェックによるミスが思いもよらないバグの温床になることがあります。
それを``props-typesライブラリ``を使うことで防ぐことができます。

```Greeting.js
import React from 'react';
import PropTypes from 'prop-types';

function Greeting(props) {
  return(
    <div>Hi {props.name}</div>
  );
}

Greeting.propTypes = {
  name: PropTypes.string
};

export default Greeting;
```

## 1. PropTypesをインポートする

```
import PropTypes from 'prop-types';
```

## 2. コンポーネントに対してpropTypesを使う

```
コンポーネント.propTypes = {
  props名: PropTypes.データ型
};
```
```
Greeting.propTypes = {
  name: PropTypes.string
};
```
ここでは、nameに文字列を指定している。

## 参考
[公式ドキュメント](https://reactjs.org/docs/typechecking-with-proptypes.html)
Windows10 + WSL + FluentTerminal + Vim にて、「Ctrl + W」が競合する

## 問題
FluentTerminal上でVimを起動すると、`Ctrl+W`などが競合する。

## 解決法
1. 左上のハンバーガーメニューをクリック
2. `Setting`をクリック
3. `Keybindings` > `Close tab` > `Delete`

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/32691/ab8318b6-e847-6523-2aea-f1c125141caf.png)
micro:bitとmacのターミナルでシリアル通信

#MacBook Proとシリアル通信をやってみた

![スクリーンショット 2019-02-21 13.49.46.png](https://qiita-image-store.s3.amazonaws.com/0/237044/9043253c-8e6c-4245-5934-5834b5a8bd38.png)

- [公開ソース](https://makecode.microbit.org/_e6149U2MyLt2)

# macで接続してみた

- ターミナル起動
- デバイスの特定　 ls /dev/cu.*
- 私の場合の出力結果
- /dev/cu.Bluetooth-Incoming-Port	/dev/cu.usbmodem14102
- screenで接続　screen /dev/cu.usbmodem1433302 115200
- 画面が真っ黒になるが、Aボタンを押すと、各センサの値を取得して出力された。
- キーボードから入力した文字がLEDで表示された。
- screenからの脱出は、control+a、aのみはなして、￥を押す。＜この操作が一番難しかった（笑）
空の配列と空のセル配列を合わせたら空じゃなくなる件

## empty + empty = notempty

matlabには空かどうか判定するisemptyがあります。
ここに空の配列を入れてみると、1(=true)が返ってきます。そらそうですね。

```matlab:array.m
>> isempty([])
     ans=
       logical
         1
```

じゃあ空のセル配列では？
もちろん1が返ってきます。想像通りですね。

```matlab:cell_array.m
>> isempty({})
     ans=
       logical
         1
```

じゃあこの二つを合わせて、空のセル配列に空の配列を入れてみるとどうなるか。
答えは0(=false)になります。
配列は空ですが、セル配列は**空の配列が入っている状態**なので0です。

```matlab:multi_array.m
>> isempty({[]})
     ans=
       logical
         0
```

空がどういう意味かちゃーんと考えておかないと思わぬところでハマるのでお気をつけくださいませ。
No.038【Python】組み込み関数：all(  )／any(  )について

![python-logo-master-v3-TM-flattened.png](https://qiita-image-store.s3.amazonaws.com/0/336067/8fb9f6aa-57f7-dc4b-b4bf-a648969d315c.png)

####今回は、組み込み関数「all()・any()」について書いていきます。
I'll write about built-in functions, "all () and any()" in python" on this page.

###■ all()とany()の使い方
&emsp;How to use all() and any()


```
>>> # all() と any()の使用：
>>> #イテラブルオブジェクトの要素が全てTrue or False, いずれかがTrueかを判定するため
```
###■ 全ての要素がTrueかを判定する：all()
&emsp;Judging all elements areTrue or not

``` 
>>> print(all([True, True, True]))
True
>>> 
>>> print(all([True, False, True]))
False
```

``` 
>>> # タプル・set型も引数に指定することが可能
>>> 
>>> print(all((True,True,True)))
True
>>> 
>>> print(all({True,True,True}))
True
``` 

``` 
>>> # bool型のTrue,
>>> # bool型のTrue, Falseだけでなく他の型も判定し、結果を返す
>>> 
>>> 
>>> print(all([100, [0, 1, 2, 3, 4], "abcde"]))
True
>>> 
>>> print(all([100, [0, 1, 2, 3, 4], "abcde", {}]))
False
``` 
###■ いずれかがTrueかどうかを判定：any()
&emsp;Judging some elements are True or not

```   
>>> print(any([True, False, False]))
True
>>> 
>>> print(any([False, False, False]))
False
>>> # ↑ 全てがFalseの場合は、Falseを返す
``` 

```
>>> # タプルやset型も引数に指定することが可能
>>> 
>>> print(any((True, False, False)))
True
>>> print(any({True, False, False}))
True
```


###■ # すべての要素がFalseかどうかを判定：not any()
&emsp;Judging all elements are False or not

``` 
>>> print(not any([False, False, False]))
True
>>> 
>>> print(not any([True, False, False]))
False
```

###■ 条件に対する判定: リスト内包表記／ジェネレータ
&emsp;Judging to conditions：list comprehension / generator 


```
>>> # リスト内包表記：任意条件に対し、all()やany()の適用が可能
>>> 
>>> l = [0, 1, 2, 3, 4]
>>> 
>>> print([i > 2 for i in l])
[False, False, False, True, True]
```
``` 
>>> # 上記結果をall()またはany()の引数に指定
>>> # 全てまたはいずれかの条件を満たすか判定が可能
>>> 
>>> print(all([i > 2 for i in l]))
False
>>> 
>>> print(any([i > 2 for i in l]))
True
>>> 
>>> 
>>> print(type([i > 2 for i in l]))
<class 'list'>
>>> 
>>> 
>>> print(type(i > 2 for i in l))
<class 'generator'>
>>> # ↑ [　]を( )へかけることでジェネレータ式となる
```
``` 
>>> #ジェネレーター式を all(), any()の引数に指定可能
>>> 
>>> print(all(i > 2 for i in l))
False
>>> 
>>> 
>>> print(any(i > 2 for i in l))
True
```
```
>>> # True = 1 , False = 0として処理される
>>> # sum を使うとTrueの数を取得することができる
>>> 
>>> print(sum(i > 2 for i in l))
2
>>> 
>>> # Falseを数える場合は、notを使用する
>>> 
>>> print(sum(not( i > 2) for i in l))
3
```

随時に更新していきますので、<br>定期的な購読をよろしくお願いします。
I'll update my article at all times.
So, please subscribe my articles from now on.

本記事について、<br>何か要望等ありましたら、気軽にメッセージをください！
If you have some requests, please leave some messages! by You-Tarin
Why should you use Rust in WebAssembly?(日本語訳)

# はじめに
この記事は[Why should you use Rust in WebAssembly?](https://opensource.com/article/19/2/why-use-rust-webassembly)の非公式日本語訳になります。

# なぜRust+WebAssemblyなのか
## tl;dr
- WebAssemnly(以下、wasm)はJavaScriptの既存資産を活用しながら、必要な部分だけを高速化することができるテクノロジーである
- Rust以外にもwasmを構築できる言語はあるが、それぞれ以下の欠点がある  
  - C#, Go
     - wasmランタイムだけで2MBを超えてしまう。Rustでは2KB以下で済む
  - C, C++
     - washランタイムはRustと同様に軽量
     - JavaScriptとのインターフェイスがRustと比べて複雑
     - C,C++と違ってRustはメモリセーフ

よってもって、Rust+wasmが最適。

## wasmとは？
wasmとはメジャーなブラウザー(IE11除く)上で動作するバイナリーファイルフォーマットである。このバイナリーはブラウザー向けにより高度に最適化、軽量化されているためJavaScriptよりも高速に起動、実行される。詳細は[Lin Clarkの記事](https://hacks.mozilla.org/2017/02/a-cartoon-intro-to-webassembly/)を参照。

## wasm活用のメリット
私は当初wasmについて、Rustを書く他の環境(例えばブラウザー)ための手段として見ていたが、それはwasmの特別さ、本質ではなかった。私はJavaScirpt、特にTypeScriptを書くことが好きであり、JavaScriptが持つWeb開発のためのエコシステムに含まれる膨大なアセットを放棄するべきではない。wasmはJavaScriptでは事足りない部分を補完するには最適なものである。
wasmによって、Webアプリケーションをゼロから作成することや、パフォーマンスが十分でない可能性がある既存のアプリケーションの一部をネイティブに近い速度で実行されるものに置き換えることができる。また、wasmはネイティブに似たアセンブリ形式であるため、多くの言語をそれに合わせてコンパイルできる。つまり、他のプラットフォームとWebの間でコードを共有することがより実用的になる。

## Rust以外の言語との比較
上記の通り、C#やGoなど、Rust以外の言語もwasmへコンパイルすることは可能である。ではなぜこれらを活用しないのか。プログラミング言語には常に個人の好みがつきまとうが、それでもRustが仕事にとって最適である理由は少なからず存在する。  
C#やGoといった言語はwasmのランタイムが巨大であるため、ゼロからのWebアプリケーション構築プロジェクト(greenfield project)

## 最後に
WIP
STSでデータベースからJSON形式のデータを取得する方法

#STSでデータベースからJSON形式のデータを取得する方法

テーブル：user_friend
カラム
Email(varchar)
FriendEmail(varchar)


#コントローラークラス

```java:TestController.jacva
package com.example.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.example.service.TestService;

@RestController
public class TestController {
	@Autowired
	TestService service;
	
	//GET フレンド情報全件取得
	//"http://localhost:8080/{email}/test"で呼び出されるメソッド
	@RequestMapping(value = "{email}/test", method = RequestMethod.GET)
	List<Map<String,Object>> findGet(@PathVariable String email) {
		//Serviceクラスのfindメソッドを呼び出す
		return service.run(email);
	}
}
```

#サービスクラス

```java:TestService.java
package com.example.service;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.repository.TestRepository;

@Service
public class TestService {
	@Autowired
	TestRepository repository;
	
	//RestControllerクラスから呼び出されるメソッド
	public List<Map<String,Object>> run(String email) {
		//Repositoryクラスのfindメソッドを呼び出す
		return repository.run(email);
	}
}
```

#リポジトリクラス

```java:TestRepository.java
package com.example.repository;

import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;

@Repository
public class TestRepository {
	@Autowired
	NamedParameterJdbcTemplate jdbcTemplate;
	
	//Serviceクラスから呼び出されるメソッド
	public List<Map<String,Object>> run(String email) {

		List<Map<String,Object>> list = null;
		
		//SQL文
		final String sql = "SELECT * FROM user_friend WHERE Email = :email";
		
		//SQLで送るパラメーターをセット
		SqlParameterSource param = new MapSqlParameterSource().addValue("email", email);
		
		try {
			//SQLを実行して結果を受け取る
			list = jdbcTemplate.queryForList(sql, param);
		} catch(EmptyResultDataAccessException e) {
			e.printStackTrace();
			return null;
		}
		
		//Logを出力
		Log log = LogFactory.getLog(TestRepository.class);
        log.info(list);
		
		return list;
	}
}
```
Queue<Object> 拡張for文(iteratorだけど)の出力順序

Queue<Integer>を拡張for文で実行した場合の出力順序について
気になったので実機で確認。

```java:QueueCheckTestMethod.java
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.Iterator;

public void test() {
   Queue<Integer> aaa = new ArrayDeque<>();
   aaa.add(1);
   aaa.add(2);
   aaa.add(3);
   aaa.add(4);
   aaa.add(5);
   String message = "";
   Iterator<Integer> it = aaa.iterator();
   while(it.hasNext()){
       message += it.next() + ":";
   }
   Toast.makeText(getApplicationContext(),message,Toast.LENGTH_SHORT).show();
}
```
「1:2:3:4:5:」と出力されます。先出しですね。
Chromeでlocalhost開発をしていて、別サイトと通信をする方法

# 開発状況


* vue.jsでdevserverを使って、localhost開発をしている。
* 開発しているSPA（ページA）が、別ウィンドウでページBを開いて、そちらと[postMessage](https://developer.mozilla.org/ja/docs/Web/API/Window/postMessage)で通信をしている。
* 本番で動く場合は、ページAもページBも同一ドメインである。
* 開発中は、ページAはLocalhostで、ページBが諸般の事情でインターネット上の開発サーバを利用する状況

開発中は以下のような感じです。
![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/133291/e7fa6400-08cc-ce54-e38e-ad501f9d1386.png)

# 問題

同一ドメインの場合では問題ないのですが、開発環境ではドメインが違うので以下のようなエラーがでます。

```
Uncaught DOMException: Blocked a frame with origin "http://localhost:8080" from accessing a cross-origin frame.
```

![2019-02-21_19h32_06.png](https://qiita-image-store.s3.amazonaws.com/0/133291/fc70f842-a618-951f-dcc2-7816e1afcec1.png)


ちなみに、ページAからページBを開いて、ページBから通信を待つのは、以下のようにしています。

```javascript
      const win = window.open('http://example.com')
      // オープン先のサイトのロード時間があるので、1秒ほど待機をしてからイベントを設定する。
      setTimeout(() => {
        win.addEventListener('message', event => {
          const data = event.data
          if (data.command === 'close_page') {
            win.close()
          }
        }, false)
      },
      1000)
```

何をしているかというと、ページBを開いて、ページBで何かを作業して、処理が完了したら、ページBからpostMessageを送ってもらいます。ページAは、それを待ち受けて、ページBを閉じるというものです。

ここでは端折っていますが、ページBからページAに必要なデータも送ってもらっています。

# 解決法

まずは、以下を試しましたが、うまくいきませんでした。
[クロスドメイン制約を回避するChromeショートカットを作る](https://qiita.com/shika-e/items/808ccdd047133315b95c)

でも、それなりにセキュリティレベルは落ちているし、開発用のChrome環境としてもよいので、これはこれで生かしておきます。


次に、Chromeの実験的な機能を操作できるフラグがあるということを、ソースは失念しましたが、見つけて、変更しました。

ChromeのURLに「chrome://flags/」を入力します。

下記のように「Disable site isolation」を「Disable」にしたらエラーがでなくなりました。

![2019-02-21_19h42_25.png](https://qiita-image-store.s3.amazonaws.com/0/133291/8fa48d97-e8e8-fdb0-58b0-edc4846ae2a8.png)


# イベントリスナーが設定されているかを確認する

今回、addEventListenerで待ち受けているのですが、これをモニターする方法も探しました。
DevToolsの[イベントの監視](https://developers.google.com/web/tools/chrome-devtools/console/events)にあります。

みんながお世話になっている開発者ツールのコンソールで、「getEventListeners(window)」と入力すると、イベント一覧が取得できます。

今回は、「message」イベントを仕掛けているので、「messege」を開きます。
ここでは2個ありあした。その1個目の「lisner」を開くと、「FunctionLocation」が「<unknown>」がでてきます。こいつになります。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/133291/13de9aca-d25a-1f7b-9c5a-e265c24a0dcc.png)

なぜ1個目だとわかったかというと、同一ドメインでの場合と開発環境での場合で比較したからです。
エラーがでにく本番の場合で、イベントが効いてないようなら、こちらで調べてみてもいいかもしれません。

# 最後に

個人的に、「Disable site isolation」を「Disable」にしたら、「enable site isolation」で、ほんとにページ間通信ができないんじゃない！？って考えているのですが、まぁ、とりあえず、デバッグを進めたいので目をつむっておきます。


このあたり、Chromeのデバッグ関係の詳しい説明があれば嬉しいんですけど。。。。
データ構造　まとめ

#はじめに
データ構造について学んだのでざっくりアウトプットしてみる。
##データ構造
データ構造とは、論理的なデータのつながりのことである。
主要なデータ構造は「スタック」と「キュー」と呼ばれる。
それぞれを以下で解説する。

###スタック
後から入れたデータが先に取り出される仕組み。
LIFOとも呼ばれる。
箱に入れたものを上からとりだすと考えるとイメージしやすい。
・PUSH・・・スタックにデータを入れる
・POP・・・スタックからデータを取り出す

###キュー
先に入れたデータが先に取り出される仕組み。
FIFOとも呼ばれる。
・エンキュー・・・入れる
・デキュー・・・取り出す

##ポインタ
場所を指し示すもの。
ポインタによってデータが連結されるものを連結リストと呼ぶ。

###連結リスト
連結リストには以下の二種類が存在する。
・単方向リスト・・・1方向のみしかたどれない
・双方向リスト・・・前のデータと後ろのデータの両方をたどることができる。

##2分探索木
各ノード（節点）にデータを持たせることで探索を容易にするも探索木である。

##並び替え
データを並び替えるのはいくつかの方法がある。
・バブルソート
・選択ソート
・挿入ソート
これらは単純な方法なのでソート速度は遅い。
・クイックソート
・シェルソート
・マージソート
これらは高速ソートと呼ばれる。
ソートのそれぞれの詳しい説明はまた記事として書く
##探索法
多量のデータの中からデータを見つけることを探索という。
探索方法にはいくつかある。
・線形探索法
・2分探索法
・ハッシュ表探索法
探索法のそれぞれの詳しい説明はまた記事として書く

#まとめ
次回はアルゴリズムを学習する予定
リリースしたアプリのdSYMをFirebase/CrashlyticsにアップロードするTips

# はじめに
Firebase/Crashlyticsでクラッシュの原因知りたいですよね？
原因を知るためにiOSアプリの場合はアプリのdSYMをFirebase/Crashlyticsにアップロードする必要があります。


本記事では、Bitriseとfastlaneを組み合わせて自動でアプリのdSYMをアップロードする方法の
ポイントについて書いてみます！

# 大まかな処理の流れ
ざっと2セクションです。
1. BitriseでdSYMをFirebaseにアップロードするWorkFlowを走らせる
2. WorkFlowに含まれているfastlane(dSYMアップロード用のlane指定)でAppStoreConnectに上がってる最新版アプリのdSYMをFirebaseにアップロード

# Xcodeの設定

Debug Information FormatのReleaseをDWARF with dSYM File
**ReleaseBuildを行う場合はdSYMを書き出すように設定**

Enable Bitcodeをtrue
**trueにしておくことで、Apple側でdSYMが作成されこのdSYMがAppStoreConnectからダウンロードできるようになるっぽい。**

<img width="516" alt="スクリーンショット 2019-02-21 18.40.44（3）.png" src="https://qiita-image-store.s3.amazonaws.com/0/75593/7da8586d-ec24-b6ac-f537-e73039b0bc98.png">

# fastlaneでdSYMアップロード用のlane作成

アプリの最新版を指定
`version: 'latest'`

毎回WorkFlow回すごとにdSYMが溜まらないようアップロードした後に削除
`clean_build_artifacts`

```ruby

  desc "Automatically download and upload dSYM symbolication files from iTunes Connect for Bitcode iOS apps using fastlane"
  lane :upload_dsyms do
    download_dsyms(
      version: 'latest'
    )

    # FirebaseにdSYMをアップロード
    upload_symbols_to_crashlytics(gsp_path: "[GoogleService-Info.plistのPATH]")

    # Delete the local dSYM files
    clean_build_artifacts
  end
```
# Bitriseの設定
一部抜粋になりますが、
fastlaneをworkflowに組み込んでdSYMアップロード用のlane(upload_dsyms)を指定
<img width="1870" alt="スクリーンショット 2019-02-21 18.47.41（3）.png" src="https://qiita-image-store.s3.amazonaws.com/0/75593/23289005-2413-e130-3653-1b93986bb269.png">
webpack4を学んでみた

## はじめに
自身のメモをせっかくなので、アウトプットしようと思い投稿。
間違いなどがございましたら、ご指摘いただけると助かります。

職場で`webpack`に触れることになり、webpack怖い病を克服すべく.....
さぁ、いざいかん!!
(随時更新予定)

## webpackとは
A. モジュールバンドラ（複数のファイルをまとめる）

モジュール： JavaScript,scssや画像などを部品（モジュール）として扱う
バンドル： モジュールを1つのファイルにまとめたファイル

## ファイルをまとめると、なにが嬉しいのか
A. ページの読み込む速度が速くなる

もう少し詳しく言うと.....
webページを構成する複数の**モジュール**を、1つのファイルに**バンドル**することで
ファイルのリクエスト数が減り、ページの読み込む速度が向上します。



## webpack導入方法

####1.`package.json`の生成

```bash
npm init -y 　　//-yを入力することでyesを省略することができます
```

####2.`webpack`の導入

```bash
npm i -D webpack webpack-cli 　　//npm install --save-dev 略
```
グローバルではなくローカルにインストールすることで、プロジェクト内のみの影響にとどめます。
また、ローカルにインストールすると共同開発時も、バージョンを揃えて利用し、環境差異を最小化することができます。
※webpack4から`webpack-cli`が必要になりました。

これで以下のようなディレクトリ構造になります。

```
├── package-lock.json
├── package.json
└── node_modules
```


####3.エイリアス（ショートカット）を貼る

以下のように`scripts`に書くことで、
`webpack`というビルドコマンドを`build`に置き換えることが可能になります。

```json:package.json
一部省略
{
  "scripts": {
    "build": "webpack"
  },
"devDependencies": {       //ここにインストールしたものが記載されます
    "webpack": "^4.29.5",
    "webpack-cli": "^3.2.3"
  }
```
これにより`npx webpack` から  `npm run build`というコマンドでビルドできます。

####4.`src`ディレクトリを作成し、`index.js`,`hoge.js`を作る
中身はよしなにどぞ....

####5.`npm run build`する!!

```
.
├── dist
│   └── main.js
├── package-lock.json
├── package.json
├── src
    ├── index.js
    └── hoge.js
```

`dist`ディレクトリの中に`main.js`がバンドルされました!

## webpackでつまづいた箇所
### ビルドができない

```
ERROR in Entry module not found: Error: Can't resolve '/src/index.js' in '/Users/hoge~'
```


```js:webpack.config.js

const path = require('path');

module.exports = {
	mode: 'development',
	entry: '/src/index.js',
	output: {
		path: path.join(__dirname, '/dist'),
		filename: 'main.js'
	},
};
```
原因は`webpack.config.js`のエントリーポイントを`entry: '/src/index.js'`と記載したためでした。
正しくは`entry: './src/index.js'`とカレントディレクトリ表記を含めた指定が必要となります。

参照：https://nodejs.org/api/modules.html#modules_all_together




また、
エントリーポイントの指定がない場合
設定ファイルである`webpack.config.js`なしの場合
にビルドするとデフォルトで`src/index.js`を探しにいきます。
※webpack4から`webpack.config.js`がなくても、ビルドできる仕様になったみたいです。

逆に上記２つの場合に`src/index.js`がないと
`module not found: Error: Can't resolve '.src/' in '/Users/hoge/~`とエラーになりますのでご注意。



## 参考
可視化されていて理解が深まる秀逸スライド　→　[なぜ初心者は webpackが解らないのか？](https://www.slideshare.net/ssuser46977e/webpack-why-cant-you-understand-the-webpack?ref=https://mizchi.hatenablog.com/entry/2018/11/26/164523)
こちらの手順を参考にさせていただきました　→　[最新版で学ぶwebpack 4入門](https://ics.media/entry/12140)
[Node.js All together](https://nodejs.org/api/modules.html#modules_all_together)
jsライブラリHandsontableにてソート後に実データにアクセスする方法

ちょっとしたことですが、はまったのでメモを共有します。
有用な人は少ないと思いますが、2時間前の自分は助かったと思います。

超便利ライブラリhandsontableにて、afterChangeコールバックなどで受け取れるchangesパラメータのindexは、見た目上のindexであって実データのindexではありません。
そのため、ソートした後に、afterChangeでindexをみて、実データに追記する等の場合、ずれてしまいます。

バージョン2まではsortIndexメソッドで近いことができていたようですが3.0.0からremoveされています（参考：https://handsontable.com/blog/articles/2018/5/handsontable-3-0-0-is-now-available）

対策としてtoPhysicalRowメソッドを使うとchangesのindexから実データのindexに変換できます。

afterChangeコールバックの関数例です。

```js
afterChange = function(changes, source) {
  // changesは [[row, prop, oldVal, newVal], ...]
  if(changes){
    var target_row = "";
    for(var i = 0; i < changes.length; i++){
      target_row = hot.toPhysicalRow(changes[i][0]);
      original_items[target_row].someColumne = someMessage;
    }
    hot.render();
  }
}
```

反対に`toVisualRow`メソッドもありますね。

公式ドキュメント）
https://handsontable.com/docs/6.2.2/Core.html#toPhysicalRow


handsontable便利なので使い方などノウハウ共有したいです。
制御文字やサロゲートペア文字を置換する


かなり限定された子ネタですが、メモ。
文字列 ``String`` 中の以下の **文字** (``char``) をまとめて一括で消します。

* [制御文字](https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html?is-external=true#isISOControl-char-) ``\u0000`` 〜 ``\u001f`` + ``\u007f`` 〜 ``\u009f``
* [サロゲートペア文字](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Character.html#isSurrogate-char-)

## コード

java8 標準の [Character] と、[Google Guava] ライブラリの [CharMatcher] を使います。

* 正規表現は便利ですが、遅いので今回はやめ

* １サロゲートペア文字は [下位サロゲートコード] と [上位サロゲートコード] からなるので、２文字に置換されます

```kotlin
import org.junit.Test
import kotlin.test.assertEquals
import com.google.common.base.CharMatcher

// 制御文字 + サロゲートペア文字 にまとめてヒットする CharMatcher を定義します.
val BAD_CHARS: CharMatcher = CharMatcher.javaIsoControl()  // 制御文字
    .or(CharMatcher.forPredicate { Character.isSurrogate(it!!.toChar()) })  // サロゲート文字

class CharMatcherTest {
    // 0x0a = LF（改行）
    @Test
    fun test_isoControl_u000a() {
        assertEquals(
            "こんにちは 世界",
            BAD_CHARS.replaceFrom("こんにちは\n世界", " ")
        )
    }

    // 0x0d = CR（復帰） &  0x0a = LF（改行）
    @Test
    fun test_isoControl_u000d_u000a() {
        assertEquals(
            "こんにちは  世界",
            BAD_CHARS.replaceFrom("こんにちは\r\n世界", " ")
        )
    }

    // サロゲートペア文字
    @Test
    fun test_surrogatePair() {
        assertEquals(
            "  -  -  ",
            BAD_CHARS.replaceFrom("𠀋-𡈽-𡌛", " ")
        )
    }
}
```

> kotlin ですいませんが java8 に読み替えて下さいい〜



[Character]:https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Character.html
[Google Guava]:https://mvnrepository.com/artifact/com.google.guava/guava
[CharMatcher]:https://google.github.io/guava/releases/27.0-jre/api/docs/com/google/common/base/CharMatcher.html
[下位サロゲートコード]:https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Character.html#isLowSurrogate-char-
[上位サロゲートコード]:https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Character.html#isHighSurrogate-char-
Word Cloudで同じ単語が2回出てきて困る

# 結論
collocationsオプションを書かないと、複数の単語をまとめて1語として書き出すので、同じ単語が複数回出ているように見えることがあります。

# Word Cloudで単語が重複する
Andreas Mueller氏のWorldCloudライブラリ https://github.com/amueller/word_cloud を使ってみたけれど、同じ単語が2回ぐらい出てきてしまって困った、という話です。

![badpoint.png](https://qiita-image-store.s3.amazonaws.com/0/50575/a7696f61-2dab-a627-bc52-f85d9b2d0a6e.png)
真ん中に大きく**「仕事」**が出てるのですが下の端にも**「仕事」**が出ています。困る。

ちなみにこれは「会社へのご意見」という闇のアンケートをWordCloudで可視化しようとしてみた闇の画像です。
もっと楽しいデータで勉強すればよかった・・・。

# 実は重複ではない
結論から言うと下の方の「仕事」は**「仕事」**ではなく**「仕事 内容」**でした。
このように複数の単語をまとめて1語とされないように、collocationsオプションを書いてあげます。

```python:wordcloud.py
import codecs
from wordcloud import WordCloud

#分かち書きしたテキストの読み込み
text_file = codecs.open('C:/Users/hogehoge/wakachigaki_iken.txt','r','utf-8')
text = text_file.read()
text_file.close()

# 画像に出したくない単語リスト（本当はもっと色々）
stop_words = [u'なる', u'ある', u'いる', u'する', u'ない', u'れる', u'ため', u'こと', u'もの']

wordcloud = WordCloud(background_color="white",
    font_path = "C:/Windows/Fonts/meiryo.ttc",
    stopwords = set(stop_words),
    collocations = False, # 複合語のオプションをオフ
    width = 800,
    height = 600).generate(text)

wordcloud.to_file("C:/Users/hogehoge/iken.png")

print('End')
```

これで消えたはずです。
![badpoint2.png](https://qiita-image-store.s3.amazonaws.com/0/50575/a66d29c3-e399-40f3-4cb4-bb813b01c986.png)
ただし**「住宅 手当」**なんていう単語も消えて**「住宅」**と**「手当」**になってしまいました。
「住宅手当」として拾いたいのであれば、分かち書きの時点で「住宅手当」は一語だと認識させておかないとダメですね。

Githubのissueを見れば即解決なのですが、自分のように英語が読めない人の参考になればと思って書いてみました。

# （蛇足メモ）分かち書き
分かち書きファイルはこんな感じで作りました。
テキストファイルは事前にutf-8にしてあります。

```python:wakachi.py
import codecs
text_file = codecs.open('C:/Users/hogehoge/iken.txt','r','utf-8')
txt = text_file.read()

# テキストを改行で区切った配列にする
sentences = txt.split('\n')

# janomeでテキスト分解
from janome.tokenizer import Tokenizer
t = Tokenizer()

write_file = codecs.open('C:/Users/hogehoge/wakachigaki_iken.txt','w','utf-8')

for sentence in sentences:
    tokens = t.tokenize(sentence)

    # 出てきた単語から名詞・動詞・形容詞・形容動詞だけ抽出
    for token in tokens:
        if token.part_of_speech.split(',')[0] in['名詞', '動詞', '形容詞', '形容動詞']:
            write_file.write(token.base_form + ' ')

    write_file.write('\n')

write_file.close()
text_file.close()

print('End')
```
ReactNativeの導入(expo)

# はじめに
react-nativeの導入を[公式](https://facebook.github.io/react-native/docs/getting-started)通りにやっても、自分は八神月くんみたいに計画通り出来ませんでした。詰まった部分とそれを解決した方法を紹介します。
# 詰まった部分
まず公式の現在の導入手順は

1. npm install -g expo-cli
2. expo init AwesomeProject
3. cd AwesomeProject & npm start
 
となっています。初心者の自分は２で詰まりました。
具体的にこんなん↓でした。

```
expo init someProjectname
? Choose a template: expo-template-blank
? Choose which workflow to use: managed
? Please enter a few initial configuration values.
  Read more: https://docs.expo.io/versions/latest/workflow/configuration › 50% completed
 {
   "expo": {
     "name": "<The name of your app visible on the home screen>",
     "slug": "someProjectname"
   }
 }

❯ Required: The name of your app visible on the home screen
```

expo initでとりあえず適当にenter押していくと３回目から
ここからenter押しても進めない、、、
どうしてだよおおぉお！！！！！！！あああぁぁああ！！！！（cv：藤原竜也）
# 解決方法

```
expo init someProjectname --non-interactive --template blank --workflow managed 
--name someProjectname
```

とやるみたいです。
シェルが対話モード対応だと公式ので上手くいくけど、bashは非対応だからコマンドで操作しなきゃいけない？みたいです。※Google翻訳が吐き出した文を国語が苦手な自分が勝手にそう理解しました。信じるか信じないかは貴方次第です。
# workflowをadvancedにする場合

```
--android-package [name]
--ios-bundle-identifier [name]
```

この二つも指定しなければいけないようです。

# 参考
- https://github.com/expo/expo-cli/issues/342
- https://github.com/expo/expo-cli/issues/332
- https://docs.expo.io/versions/latest/workflow/configuration/
汎用的な権限名一覧

メモ

| 権限名 | 意味 |
|:-----------|:------------|
| Guest| 利用登録をしていないユーザ　閲覧は可能だが登録は不可のようなイメージ |
| Member| 一般ユーザ |
| Admin| エンドーユーザ側の管理ユーザ |
| Owner| システム運用側の管理ユーザ |
UWPでStreamSocketListener使ったときにテストできなかった話

UWPアプリの通信部分を作っているときにちゃんとつながるかテストしようとした。

1時間ほど調べた結果としてテストできないらしいことが分かった。

#使用したコード

サーバー側

```サーバー
 int port = 5555;
 HostName ip = new HostName("127.0.0.1");

 Task.Run(async () =>
 {
    StreamSocketListener streamsocketlistener = new StreamSocketListener();
    streamsocketlistener.ConnectionReceived += ConnectionReceived;

    await streamsocketlistener.BindEndpointAsync(ip, port.ToString());
                
 });
```

クライアントはtelnet

#原因

Stack Overflowで有力そうな記事を見つけた

https://stackoverflow.com/questions/33622546/c-sharp-universal-windows-streamsocket-clients-not-connecting-to-streamsocketlis

「同じコンピュータ内で実行されている別のアプリケーションまたはプロセスからStreamSocketListenerに接続することはできません」
STSでコンソールログを表示する

#STSでコンソールログを表示する方法

```java:App.java
package com.example;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;

@EnableAutoConfiguration
@ComponentScan
public class App  {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
        
        //Logコンソールログの出力方法
        //import org.apache.commons.logging.Log;
        //import org.apache.commons.logging.LogFactory;
        //getLog("このファイルのクラス名.class")
        Log log = LogFactory.getLog(App.class);
        log.info("ログ出力");
    }
}

// src/mail/resourceのschema.sql に自動でテーブルを作る仕組みあり。
```
Puppet Pipelines for ApplicationsでNode.jsサンプルアプリケーションのデリバリーパイプラインを作る

この記事は[こちら](https://qiita.com/hisashiyamaguchi/items/ea21bdb9985486fb07d3)の続編です。デリバリーパイプラインを作ってみました。

# 前提
- GitHubのアカウントを持っている
- PCにgitがインストールされていてgit add, commit, push等基本的な操作を習得している
- AWS, Azure, GCP等のクラウドプラットフォームを利用できる

# 手順
## デリバリーターゲットの作成
アプリケーションのデリバリー先となる環境を作成します。この記事ではdevelopment, qa, staging, productionの4つのステージを作成します。Environmentsをクリック、右側の+Create Environmentをクリックします。

<img src="https://i.imgur.com/FEojSLn.png" width=50%>

Environment Nameにdevelopmentを入力してCreateを押します。同じ手順でqa, staging, productionを作成します。

<img src="https://i.imgur.com/dmpEpra.png" width=50%>

Environmentに紐付けるサーバを設定します。トップバーのServersをクリック、Add Serverを押します。Add Existing Serverを押してPipelinesのAgentインストール手順に従いAgentをインストールします。インストール完了後、サーバを選択してAdd Environmentsを押し、development, qa, staging, productionの各Environmentにサーバを追加します。

<img src="https://i.imgur.com/z0AN5Dw.png" width=50%>

<img src="https://i.imgur.com/mwrNbLc.png" width=50%>

```
$ curl -sSL https://pipelines.puppet.com/download/client | sh
$ sudo /usr/local/bin/distelli agent install
Distelli Email: hisashi.yamaguchi@puppet.com
      Password:
```

## デリバリーパイプラインの作成
トップバーのApplications -> PFA_NodeJS_SampleAppをクリックし右下のCreate Targetを押します。

<img src="https://i.imgur.com/pMjfHfJ.png" width=50%>

Existing Environmentからdevelopmentを選択してAdd Targetを押します。同様の手順でqa, staging, productionの順で追加します。

<img src="https://i.imgur.com/AVRkPsY.png" width=50%>

右側のデリバリーパイプラインでAuto Deployチェックボックスを全てチェックします。

<img src="https://i.imgur.com/t8DeJSN.png" width=50%>

## 承認ゲートの作成
production -> Environments -> Environment Settings -> DeploymentをクリックしてSet Approval Permissionsをチェックし、あらかじめ作成済みのグループを選択してSaveを押します。
**グループの作成手順は割愛しています。**

<img src="https://i.imgur.com/CGEnW0u.png" width=50%>

## 動作確認
READMEを編集してリモートリポジトリにコミット、自動的にデリバリーパイプラインが流れるか確認します。NEW EVENTSが表示されてその後各々のターゲットにデリバリーされればデリバリーは成功です。

```
$ vi README
update.
$ git push origin master
```

<img src="https://i.imgur.com/LNVogA3.png" width=50%>

productionのPendingApprovalをクリックします。

<img src="https://i.imgur.com/jaXb1fB.png" width=50%>

Approve and Deployを押します。

<img src="https://i.imgur.com/gcSfxJh.png" width=50%>

緑色の画面が表示されればディプロイも成功です。

<img src="https://i.imgur.com/RQpe8NP.png" width=50%>
Raspberry PiによるUSB-MIDIの接続

Raspberry Pi（以下ラズパイ）に各機器を接続します。

ラズパイには標準でALSAというMIDIを制御するモジュールが入っているらしいので、それを利用することにします。

参考にしたサイトはこちら

https://sites.google.com/site/larksl159/home/dtm-midi-pokemiku

ラズパイにUSB-MIDI機器を接続するとこんなふうに見えます。

pi@raspberrypi:~ $ aplaymidi -l
Port Client name Port name
14:0 Midi Through Midi Through Port-0
20:0 UM-1G UM-1G MIDI 1
24:0 NSX-39 NSX-39 MIDI 1
28:0 GP-10 GP-10 MIDI 1
28:1 GP-10 GP-10 MIDI 2

20:0 UM-1G はローランド社のUSB-MIDI変換ケーブルで、この先にFC-50がつながっているので、まずはこのポートの信号を28:0 GP-10に転送する設定をします。

pi@raspberrypi:~ $ aconnect UM-1G GP-10
pi@raspberrypi:~ $ aconnect  GP-10 NSX-39
 

ネットで検索すると大体 aconnect 20:0 28:0 とポートIDで指定していますが、USBの指す順番や場所が変わるとこのIDも変わってしまうので、今回はクライアント名で送受信先を指定しました。

接続状況の確認

pi@raspberrypi:~ $ aconnect -l
client 0: 'System' [type=kernel] 
  0 'Timer           ' 
  1 'Announce        '
client 14: 'Midi Through' [type=kernel]
    0 'Midi Through Port-0'
client 20: 'UM-1G' [type=kernel] 
  0 'UM-1G MIDI 1    '
Connecting To: 28:0
client 24: 'NSX-39' [type=kernel]
    0 'NSX-39 MIDI 1   '
Connected From: 28:0
client 28: 'GP-10' [type=kernel] 
  0 'GP-10 MIDI 1    '
Connecting To: 24:0
Connected From: 20:0    1 'GP-10 MIDI 2    '
pi@raspberrypi:~ $ 

 

これでFC-50を踏んだときにGP-10の音色が変更となって、GP-10に接続したギターを弾くとポケット・ミクが鳴る

というところまで完了です。

 

とりあえずはここまで。
Raspberry PiとBoss GP-10をメインにしたペダルボードの作成（設置と機器説明）

Raspberry Piを利用したBossのGP-10ギタープロセッサーをメインにしたペダルボードの作成記を書いてきます

GP-10はフットスイッチがプログラムチェンジ2個、コントロール用2個、ボリュームペダル１つという構成で、演奏中に音色変更をするのにかなり苦労するので、まずはそこの改善を行います。

まずは全体構成から・
![20190221_144141.jpg](https://qiita-image-store.s3.amazonaws.com/0/355938/592d0afb-f0a5-9b73-6206-7f7c344bb4e2.jpeg)

配置はこんな感じです。

下段

右　GP-10：Bossのディバイデッド・ピックアップ対応ギタープロセッサです

左　FC-10：MIDIプログラムチェンジ送信用フットコントローラー

上段

右　Raspberry Pi：各機器をUSBで接続しコントロールするパソコン

中　USBハブ：各機器を接続するアタッチメント

左　ポケット・ミク：ボーカロイド初音ミクの音声出力ができるハード音源

 

FC-50でGP-10のエフェクトパッチやポケット・ミクの音色を変更

GP-10に接続したギターでポケット・ミクを演奏

 

みたいなことを考えています。

 

とりあえずはここまで
Perlでバイナリ文字列をunpackするときの改行の考慮は十分に

Perl でバイナリ文字列を可読にするために、以下のような記述をすることは、わりとあると思います。（URLエンコードや暗号化(RC4等)の時）

```
$str =~ s/(.)/'%'.unpack('H2', $1)/eg;
```

(`$str =~ s/([^ ])/'%'.unpack('H2', $1)/eg; $str =~ tr/ /+/;` のように `.` を使っていない場合は、関係ないです。）

しかし上記のように `.` の場合、`$str` に改行コードが含まれていた場合どうなるほうが良いかを考えておくほうが良いです。


上記の場合 `.` に改行コードはマッチしませんので、以下のようになります。

```perl
my $str = "123\n456";
$str =~ s/(.)/'%'.unpack('H2', $1)/eg;
print $str;
# (出力結果)
%31%32%33
%34%35%36
```

改行が改行のままで良いのであれば、問題ないのですが、この文字列をファイルに出力などの場合は、意図と違う動作になる場合もあります。このような場合は、以下のように `s` オプションを付けると回避できます。

```
$str =~ s/(.)/'%'.unpack('H2', $1)/egs;
```

```perl
my $str = "123\n456";
$str =~ s/(.)/'%'.unpack('H2', $1)/egs;
print $str;
# (出力結果)
%31%32%33%0a%34%35%36
```

バイナリ文字列内の改行コードの考慮は十分に。
スライダーライブラリーSlickを使って、URLパラメータを操作する

## はじめに

[Slick](http://kenwheeler.github.io/slick/)でスライダーを作成した際に、URLパラメータの操作を行いました。スライダー以外のURLパラメータに配慮しながら作成したため、多少ハマりました。Slickの使用方法については[こちら](https://qiita.com/katsunory/items/25b385aae0f07b41e611)をご参考に。


## サンプルコード

```sample.html
<div class="slider-container">
  <div class="slider">
    <div class="slick-slide">
       <img class="slide-img" src="https://hogehoge.jp/images/20190101/xxxxxx.jpg" alt="hogehoge">
    </div>
    <div class="slick-slide">
       <img class="slide-img" src="https://hogehoge.jp/images/20190102/xxxxxx.jpg" alt="hogehoge">
    </div> 
    <div class="slick-slide">
       <img class="slide-img" src="https://hogehoge.jp/images/20190103/xxxxxx.jpg" alt="hogehoge">
    </div>
    ︙
  </div>
</div>
```



```sample.js
var $slider_container = $('.slider-container'),
$slider = $('.slider');
    
$(function() {
  $slider.on('init', function(event, slick) {
    // slider-counterクラスの中にカウンターを用意
    $('img.slide-img').append('<div class="slider-counter">【<span class="current"></span> / <span class="total"></span>】</div>');
    $('.current').text(slick.currentSlide + 1);
    $('.total').text(slick.slideCount);
  })
  .slick({
    infinite: true,
    speed: 300,
    slidesToShow: 1,
    dots: true,
    ︙
    // その他オプションはお好みで設定
  })
  .on('beforeChange', function(event, slick, currentSlide, nextSlide) {
    $('.current').text(nextSlide + 1);
  })
  // スライド変更後に以下のメソッドが発火
  .on('afterChange', function(event, slick, currentSlide, nextSlide) {
    var slideNum = currentSlide + 1;
    var url = location.href;
    var params = location.search;

    if (params) {
        // パラメータがある場合
        if (params.match(/(\?|&)image=/)) {
            // 既にimage=パラメータがある場合、「image=数字」の箇所を現在のスライド番号に文字列置換
            url = url.replace(/(\?|&)image=\d+/, '$1image=' + slideNum);
        } else {
            // image=パラメータを含まない場合、URLの末尾にパラメータ「image=数字」を追記
            url += '&image=' + slideNum;
        }
    } else {
        // パラメータがない場合、単にパラメータ「?image=数字」を追記
        url += '?image=' + slideNum;
    }
    $('.current').text(currentSlide + 1);
  });
});
```

### サンプルコードの解説

1. `slider-counter`クラスの中にカウンターを用意し、【1/5】のように画像下でスライドを数えれるようにしています。`slide-img`クラスがついた`img`タグの直後にカウンターが表示されます。`current`クラスが現在のスライド枚数で、`total`クラスが合計のスライド枚数です。
2. ここではオプションで、`dots: true`を指定していますが、代わりに `arrows: true` として「<>」矢印を設定しても良さそうですね。
3. 既存のJSメソッド`location.href`と`location.search`で、それぞれURL全体とパラメータを取得し変数に代入します。
4. 最初のif文は、URLパラメータの有無で分岐します。無ければ単に、スライドのパラメータ`?image=数字`を追加します。
5. 入れ子になっている次のif文は、スライドのパラメータの有無で分岐します。ここで正規表現を利用し、`?image=数字`または`&image=数字`にマッチした場合、現在のスライド番号に文字列置換します。`$1`は正規表現の後方参照で、ここではマッチした`?`または`&`が代入されます。


## 参考

1. [Slick](http://kenwheeler.github.io/slick/)
2. [【jQuery】スライダー系プラグイン slickの使用方法](https://qiita.com/katsunory/items/25b385aae0f07b41e611)
3. [Javascript で現在のページのURLを取得する方法。](http://www-creators.com/archives/4466)
4. [JavaScriptで正規表現（文字列置換え編）](https://qiita.com/hrdaya/items/291276a5a20971592216)
5. [正規表現あれこれ](https://qiita.com/ikmiyabi/items/12d1127056cdf4f0eea5)
Android Developers Blog 適当意訳 #4 How we fought bad apps and malicious developers in 2018

# 我々は2018年にどうやって出来の悪く悪意のあるアプリと戦っていたか
2019年2月13日

[原文](https://android-developers.googleblog.com/2019/02/how-we-fought-bad-apps-and-malicious.html)
**※英語の勉強と自分用のメモ程度のかなり適当なものです。**

Google Playは膨大なアンドロイドユーザーの彼らが愛し、楽しむアプリの発見と経験の提供にコミットしています。
我々は去年違反検知技術の改良に取り組み、悪い行いをする者たちと戦うための人員も大幅に増進させました。
新しい悪用傾向からユーザーを守り、悪意のある開発者のより早い発見と追放、Google Play からの悪意のあるアプリのこれまで以上の停止の為に、我々は2018年に一連のポリシーを紹介しました。
却下されたアプリ申請数は55%以上増え、公開停止させられたアプリは66%以上増えました。
これらの増加は、悪いアプリの特定と強制に大きな役割を果たしている自動保護や人間による審査同様、Play Store上の有害なアプリを減らすために方針を厳しくする努力を行なってきた事結果です。

加えて、Play Store から悪いアプリの特定と停止の為に、[Google Play Protect](https://www.android.com/play-protect/) はユーザーのデバイスにインストールされているアプリが悪い振る舞いを行いっていないかをチェックする為に500億以上のアプリをスキャンしています。
そのようなシステムのおかげで、Google Play からインストールされたアプリは、その他からインストールされたアプリよりも8倍以上害を受けにくいです。

下記は2019年も引き続き注力している分野です。


### ユーザーのプライバシーの保護

ユーザーのプライバシーとデータを保護する事はユーザーとの信頼を構築する上で重要な要素です。
我々は開発者に、パーミッションはアプリが必要な機能を提供するためのものに制限するべきだと要求してきました。
また、どのようにデータが使われるかをユーザーが理解するために、我々は開発者にユーザーのデータとコレクションに関するわかりやすい開示を要求してきました。
去年我々は、ユーザーのデータやプライバシーに関する規約に反する多くのアプリを却下しました。

2018年10月、我々は通話やメッセージ送信などでユーザーのデフォルトのアプリに選ばれるようなアプリを制限するために、SMSとCall Logのパーミッションに関する新しい規約制限を発表しました。
我々は最近この規約に反するアプリをGoogle Playから削除し始めています。
We plan to introduce additional policies for device permissions and user data throughout 2019.
我々は2019年に更なるパーミションとユーザーデータに関する追加の規約を発表予定です。

### 開発者の誠実さ

我々は重大な違反アプリの80%が再犯者や悪意のある開発者ネットワークによるものだと理解しています。
悪意のある開発者が追放された時、彼らはGoogle Playに戻る為に新たなアカウントを作成したり、開発者アカウントを買ったりしています。
我々は更なるクラスタリングやアカウントマッチング技術を向上と人間によるレビューのノウハウを合わせてアプリの公開をブロックする事で、悪意のある開発者にとってインストール数を得にくくしていきます。


### 有害なアプリの内容と振る舞い

去年ブログで言及したように、我々は多くの偽物、不適切な内容、有害になりうるアプリと戦いました。
このようなアプリとの戦いの中で、疑わしいアプリを見つけるための先進的な機械学習の利用だけでなく、合わせて大胆な分析を行い、ユーザーからのデータや専門家によるレビューも活用する事が、より多くの悪意のあるアプリの正確で効率的な発見の助けになってきました。
我々の悪意のあるアプリへの対策の幾重にも及ぶ向上にも関わらず、悪意のある開発者は新しい方法で我々のシステムに侵入を試みるでしょう。
我々は今後も悪意のあるアプリに対抗する為に機能を向上させ、ユーザーの皆様に安全なアプリストアを提供していきます。