OmniAICreator/Qiita-1.07M huggingface dataset:
Mac で Julia #10 IJulia


前回に引き続きJuliaについてです。

[ドキュメント](https://docs.julialang.org/)に沿って試していきます。

### Browser-based workflow

> It is also possible to interact with a Julia REPL in the browser via IJulia. See the package home for details.

IJuliaというのをつかうとブラウザでインタラクティブに使えるそうです。

### IJulia

[IJulia](https://github.com/JuliaLang/IJulia.jl)のサイトを見てみます。

#### Installation

説明にしたがって追加してみます。

```julia
julia> using Pkg

julia> Pkg.add("IJulia")
  Updating registry at `~/.julia/registries/General`
  Updating git-repo `https://github.com/JuliaRegistries/General.git`
 Resolving package versions...
 Installed Compat ─ v1.1.0
  Updating `~/.julia/environments/v1.0/Project.toml`
 [no changes]
  Updating `~/.julia/environments/v1.0/Manifest.toml`
  [34da2185] ↑ Compat v1.0.1 ⇒ v1.1.0
```

いいのかな？

#### Running the IJulia Notebook

これも説明に従って起動してみます。

```
julia> using IJulia
[ Info: Recompiling stale cache file /Users/qoAop/.julia/compiled/v1.0/IJulia/nfu7T.ji for IJulia [7073ff75-c697-5162-941a-fcdaad2a7d2a]

julia> notebook()
```

なんか立ち上がりました！

![jupyter.png](https://qiita-image-store.s3.amazonaws.com/0/51116/0da30652-ad04-83cd-5225-23507db67bb5.png "jupyter.png")

右上の[New]プルダウンからjuliaを選ぶと新規ウインドウがでます。

![jupyter1.png](https://qiita-image-store.s3.amazonaws.com/0/51116/14d18725-bda6-48b9-3399-83072365bf85.png "jupyter1.png")

![test1.png](https://qiita-image-store.s3.amazonaws.com/0/51116/75931c84-26b0-0017-e33d-1f2293502096.png "test1.png")

juliaコマンドを起動したのと同じように使えます。

今日はこの辺で。
HLS動画ストリームの確認方法


streampack の田中です。

動画サービスを提供している場合、下記のような配信ストリームをブラウザにて確認するケースがあるかと思います。(再生に影響があった場合によく見ます。)

- 配信形式 (mpeg-dash, HLS, progressive download)
- ストリームの数
- どのストリーム(ビットレート)を参照しているか　- 動画の品質確認

今回は配信の定番で使用されている HLS でのストリームの確認方法です。

## デベロッパーツールへアクセス


Chrome の場合
> 右上のアイコン -> その他のツール　-> デベロッパーツール
> または ツールバー[表示] -> 開発 / 管理 -> デベロッパーツール

Safari の場合
> ツールバー[開発] -> ウェブインスペクタを表示

Firefox
> ツールバー[ツール] -> ウェブ開発 -> 開発ツールを表示

Windows Edge
> 右上の設定アイコン -> デベロッパーツール


## ストリームの詳細分析

まずは、[Network] -> 検索フィルターで '.m3u8' と絞りこみすると、下記のような結果になります。

<img width="1479" alt="m3u8.png" src="https://qiita-image-store.s3.amazonaws.com/0/232803/b9aeb423-df77-2baa-7720-12269432feee.png">

HLSの場合は m3u8 というマニフェストファイル、プレイリストファイルを参照します。
マニフェストファイルはストリームの本数、ビットレート情報(Bandwidth)、サイズ(Resolution)などが記載されています。
プレイリストファイルは分割されたファイルの順序を定義しているファイルです。(ここでは詳細は割愛)

下記はそれぞれの ts ファイルと呼ばれる動画の分割されたファイル(チャンクファイル)を取得した際のリクエストの履歴です。見やすいように '.ts' でフィルターしてます。

<img width="1325" alt="【ServerlessConf_Tokyo】Building_Serverless_Machine_Learning_Models_in_the_Cloud_by_Alex_Casalboni_-_Cloud_Academy___cloudpack公式チャンネル.png" src="https://qiita-image-store.s3.amazonaws.com/0/232803/8d61fb37-8f98-dcf9-854e-6e6794a710f6.png">

それぞれ提供しているサービスの URL によって異なりますが、streampack では 3,4 本のストリームを提供してます。

- 400k   - 480x270
- 1000k(1M) - 960x540
- 2000k(2M) - 1280x720

あとはプレイヤー側が非同期で下記の条件によって、ストリームを定期的に取得し動画を再生します。

- ネットワークの帯域
- プレイヤーのサイズ
- CPUなどの負荷

上記の添付画像にある右側のデベロッパーツールの結果を見る限りでは、

1. 最初は sd_1000k のサイズのストリームを取得している
2. 6番目の ts からネットワークの帯域などの影響により sd_400k を取得。つまり映像品質が悪くなる
3. その後にhd_2000k　を取得し続けて、より良い品質の動画が提供されている

という流れが確認できます。

最近の動画サイトは HLS/mpeg-dash で提供されているものがほとんどですので、
このサイトでは、このビットレートを準備しているんだとか、
回線が悪い環境のために映像ではなく Audio のストリームの提供してたりなど、
一度デベロッパーツールで見て見ると何か新たな発見があるかもしれません。
Docker で Web サーバを立てて検証環境を作る

## 概要

静的なサイトやちょっとした js を使ったサイトを作る時に、Web サーバ上でサイトを検証したい時なる事はよくあると思います。　　
そんな時に一瞬で手元に Web サーバを作成し、てサクッとブラウザで確認する方法を記録しておきます。（ついでにDocker コンテナ入門もできます

## 対象

- Web 開発始めたての人
- Docker にあまり馴染みのない人

## 手順

作業時間: 5分位
必要なものは [Docker](https://www.docker.com/get-started) だけです。
自分の OS に合ったものをインストールしてください。

### 作業

```sh
# Docker コンテナの起動
$ docker container run --name web -d -p 8888:80 -v $(pwd):/usr/share/nginx/html nginx:alpine
```

これでブラウザで `localhost:8888` を開くとコンテンツが見れます。 

```sh
# 停止
$ docker container stop web

# 削除
$ docker container rm web
```

これで、Docker コンテナが削除されます

### 解説

今回使っているコマンドは以下の役割を担っています。

```sh
docker                           # Docker コマンドです
container                        # コンテナ操作に関するサブコマンドです
run                              # コンテナが起動します
--name <container-name>          # コンテナに名前を付けます
-d                               # コンテナをバックグラウンドで起動します
-p <host-port>:<container-port>  # ホスト（今回は自分のPC）のポートとコンテナのポートをポートフォワーディングします
-v <host_path>:<container_path>> # ホストのボリュームをコンテナにマウントします（ファイルが共用になります
nginx:alpine                     # コンテナのイメージを選択します
```

### docker-compose を使ったパターン

上記で紹介したコマンドを yaml コードにすると以下になります。
docker-compose というツールを使います。（Docker をインストールすると入ってます)
これは、複数のコンテナを操作するのに便利ですが、1つ以上のコンテナを管理するのに使えます。
コマンドを覚える必要がなくなるので、こちらもおすすめです。

使う場合は自分の作業ディレクトリに `docker-compose.yaml` を作成し、以下をコピペしてください。

```yaml:docker-compose.yaml
version: "3"
services:
  web:
    image: nginx:alpine
    ports:
      - 8888:80
    privileged: true
    volumes:
      - "./:/usr/share/nginx/html"
```


操作は以下の通りです。

```sh
# Docker コンテナの起動
$ docker-compose up -d

# 停止
$ docker-compose stop

# 削除
$ docker-compose rm
```
大量リクエストをさばくにはサーバレス＆非同期の導入を検討してはいかがか？

#前提
あなたは、小さめの会社のインフラエンジニアだ
幸いなことに会社は オンプレではなくクラウドサービス AWSを使っている
残念なことに　システムを全て理解出来るのはあなたしかいない

#大量アクセスがきたら？
想定外の大量アクセスがきたらサーバはどうなるだろうか？
処理がおいつかず サーバエラーが表示されたり
サーバが落ちる事もある

#でもオートスケーリングがあるじゃない？
インスタンスの立ち上げに数分かかる。
DBのレプリケーションもデータ同期まで時間がかかる。
じわじわとアクセスが増えれば、設定次第では起動間に合うが
CMが出た、アイドルが宣伝した、イベント開始　など、一気にスパイクが来ることの方が多い
そのようなスパイクに耐える方法もあるが、たとえば　常に多めにサーバインスタンスを立ち上げるなど。
しかし　それではお金がかかる

オートスケーリングは スパイクに対しては信用できない
あなたは ２４時間サービスを監視し、なにか障害があればすぐに駆けつけなければならない
あなたは　旅行にはいけないし、親戚に不幸があっても行くことが出来ない。


#超大量リクエストきたら？
実際に 知り合いのサービスは 急なスパイクでフロントサーバが１００台以上立ち上がった
Readだけなら問題ないが、DBへのWriteをふくむアクセスの場合
DBをレプリケーションしたとしても、マスターがボトルネックになり レスポンスが悪くなり
最悪DBが落ちる
もちろん、シャーディングで対応すれば それも回避できるはず！

#Amazonにインフラ監視まかせられない？
もちろん物理的なサーバトラブルはAmazonが今でも保証してくれているが
サービスやインスタンスの管理はしてくれない

ところが　AWSにはマネージドサービス つまり SaaS的なサービスがいくつかある
DBだとDynamoDBなど
これらを使えば、サービスの監視をAmazonに委ねる事ができる
しかも オートスケーリングと違い、AWSが必要に応じて瞬時にスケーリングしてくれる
NoSQLになるので、設計は色々変える必要が出てくるが・・・

DBはこれで 管理しなくてよくなった！
だが　Webサーバは管理必要なので、まだ旅行に行けない

＃API Gateway
API Gatewayという、指定したURLに対するアクセスがあった場合に
指定したイベントを呼ぶ（後に出る LambdaやDBなど）
いわゆる　Routingのコントローラーである
当然　これも AWSマネージドなので、大量アクセスも気にしなくてよい

#Lambda
上記のAPI Gatewayから特定URLがアクセスされた時の動きを記述する　Modelだ
AWSだと node、go、Java、Pythonなど　いろいろな言語で記述出来る
これも　マネージドなので、自動的にスケーリングしてくれる

#完璧？？
API Gatewayでリクエストをうけ
Lambdaでロジックをかき
DynamoDBに R/W する

サーバレス＆フルマネージド！
安心して旅行行ける？？

そう、ある程度までの規模のアクセスなら、これで完成だが
超大量アクセスが来た場合、DynamoDBが料金が高くなるのもあるし、アクセス数も制限がある

#Queue
直接DynamoDBに入れるから問題が起こるので
いったん　Queueにためて　非同期処理をすれば、アクセスが集中しても DBへのR/Wは時間を分散できる
もちろん、リアルタイムに結果が返ってくる必要があるサービスには向かないが
実は非同期で問題ないサービスは非常に多い

AWSのキューサービスは複数あるが　代表的なものは
SQS: 順番が保証されない
SQS FIFO： 順番保証されるがパフォーマンス悪い
Kinesis：　順番が保証され大量データに強い

ということで　私はKinesisをおすすめ

API Gateway -> Lambda -> Kinesis  --> DynamoDB

これで 超大量アクセスがあっても、まず問題なく 非同期アクセスが可能

これで旅行に行ける！

#EMR
DynamoDBは Writeがけっこう高い・・
ので　超大量アクセスを処理する安くて速い方法は？

Hadoopですね

HadoopはAWSではEMRでマネージドされてます

API Gateway -> Lambda -> Kinesis --> EMR(Hadoop) -> DynamoDB

場合によっては、Hadoopを使ってバッチ処理をするほうがいいかもしれませんね


#最後に
サーバレス（マネージドサービス）により　あなたは旅行に行けました

スマートフォンにアラートが来る
Amazonが管理してくれてくれるから大丈夫
・・・復帰しないサービス

プログラムやデータの不具合は　あなたしか直せないので
やはり　あなたは旅行に行くべきではない

サーバだけでなく、エンジニアもバックアップ作ることが　次の目標です
Web制作でよく使うサイトまとめ

## はじめに
個人レベルのWebで使えるサイトをまとめました。
全部無料で使えます。多分商用フリー。
小規模のWeb制作やポートフォリオ作成にどうぞ！

## 素材

### [APPLAUNCHPAD](https://theapplaunchpad.com/mockup-generator/#)
モックアップのジェネレーター。
画像ファイルからいい感じのモックアップを作成してくる。
テンプレートが豊富でおしゃれ。

### [Dimmy.club](https://dimmy.club/)
モックアップのジェネレーター。
iPhone、Laptop、Desktop、tabletの種類がある。
ポートフォリオの作成に重宝した。

### [FRAME](http://frame.lab25.co.uk/)
モックアップのジェネレーター。
テンプレートの種類は少ないが登録不要で気軽に使える。

### [Icon-rainbow](https://icon-rainbow.com/)
アイコン素材サイト。
png,jpeg,svg,ai,epsあらゆる拡張子に対応している。
種類も豊富で便利。

### [FLAT ICON DESIGN](http://flat-icon-design.com/)
フラットデザインに最適なアイコン素材サイト。
png,jpeg,svg,ai,epsあらゆる拡張子に対応している。

### [unDraw](https://undraw.co/illustrations)
ハイセンスなイラスト素材サイト。
色を自由に選べるあたりがすごい。

### [StockSnap](https://stocksnap.io/)
写真素材サイト。

### [STOCKIO](https://www.stockio.com/)
写真、動画、イラストの素材サイト。


## カラーパターン

### [Paletton.com](http://paletton.com)
一つのカラーコードを選択すると、カラーパレットを作成してくれる。

### [MATERIAL DESIGN](https://material.io/)
マテリアルデザインに則ったカラーパレットを作成してくれる。
レイアウトやタイポグラフィまでサンプルがあり多機能。

### [Khroma](http://khroma.co/)
好きな色を50選択するとAIが最適なカラーパレットを提案してくれる。

### [BRAND MARK](https://brandmark.io/)
ブランド名や、その説明等を入力するとロゴやカラーパレットを作成してくれる。
UIがいい感じ。

### [ColorSpace](https://mycolor.space)
一つのカラーコードを選択すると、いい感じのグラデーション定義を作成してくれる。


## その他

### [Font-familyメーカー](https://saruwakakun.com/font-family)
様々なフォントファミリーを作成してくれる。
有名サイトのフォントファミリーが揃っていたり参考になる。

### [PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/)
ウェブページの読み込み時間を測定してくれる。
読み込みが遅い場合は、ボトルネックも教えてくれる。
Googleが提供している。

### [Tinypng](https://tinypng.com/)
画像を圧縮してくれる。
pngとjpegファイルを最適化して圧縮してくれる。
SPSS Modelerで相関行列を見たい

SPSS Modelerで相関行列、相関行列プロットが出せないかという質問をよくいただきます。
■試した環境
Modeler 18.1.1
Windows 10

##0 「データ検査」ノードを使う
これは相関行列、相関行列プロット自体は出せないのですが、対目的変数だけであれば、これで見るのが一番簡単です。

以下は収入を目的変数とした場合の各相関値と散布図の一覧です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/64f8f587-336a-56f4-a786-66aaa2780694.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/e61c7519-e90e-862b-3c14-46d42f08dfc5.png)


##1 「シミュレーションのあてはめ」ノードを使う
「シミュレーションのあてはめ」ノードはモンテカルロシミュレーションを行うのが本来の役割ですが、これをつかうと相関行列を簡単につくることができます。「シミュレーションのあてはめ」ノードをデータにつないで実行するとSimGenというノードができます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/6c8ea6f3-fa67-c54d-777f-0aac7bdba9a1.png)

これをダブルクリックし、データタブの相関の項目を選択するとできています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/14ef4815-7b5a-9c43-8fbe-ecffa2c159e5.png)

ただしこの方法には以下の欠点があります。
・コピーはできない
・スクロールはできない

##2 「線形回帰」ノードを使う
線形回帰ノードでも相関行列を作ることができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/6c4553b7-557a-21f6-5ade-ce4d9c9493e8.png)

エキスパートタブでエキスパートモードにして出力ボタンを押します。そして「記述統計」にチェックをつけてからモデルを作成します。目的変数は何でも構いません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/2f367def-fd2c-768d-77ed-c99cc60aca16.png)

モデルナゲットを開き、詳細タブの「相関」の項を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/293ea281-faec-203d-992b-a95d995911ca.png)

このデータはスクロールもコピーもできます。

##3「グラフボード」ノードを使う
グラフボードを使うと相関行列プロットが作成できます。

対象列を選択して、「散布図の行列」を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/c500c05c-1f3b-1356-7005-2ee9fe15d4a1.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/223763/0c0857f8-c4c0-f56d-2b13-5005a373df31.png)

対象列が多いとかなり時間がかかってしまうので列をある程度絞ったほうがよいようです。

##サンプルストリーム
https://github.com/hkwd/spsssample/blob/master/stream/180817%E7%9B%B8%E9%96%A2%E8%A1%8C%E5%88%97.str

##おまけ
拡張ノードをつかってRやPythonで相関行列、相関行列プロットを作ることもできます。

参照：JALがSPSSの機能を独自に開発 相関行列、PLSAなど16のデータ分析を追加 - 日経BigData
https://business.nikkeibp.co.jp/atclbdt/15/258680/092800080/

SPSS ModelerのDSXL版では相関行列をView Dataから見ることができるようになりました。
Dockerfile for OpenStack keystone queens 

運用中のopenstack proxyサービスのkeystone versionをv2からv3へ、対応versionは「queens」にする必要がありまして、開発環境提供を目的にしたqueens versionのkeystone instanceをdockerで作りました。

```dockerfile
FROM python:2.7
MAINTAINER crowdy "crowdy@gmail.com"

ENV VERSION=13.0.1

RUN set -x \
    && apt-get -y update \
    && apt-get install -y libffi-dev python-dev libssl-dev mysql-client python-mysqldb \
    && apt-get -y clean

RUN curl -fSL https://github.com/openstack/keystone/archive/${VERSION}.tar.gz -o keystone-${VERSION}.tar.gz \
    && tar xvf keystone-${VERSION}.tar.gz \
    && cd keystone-${VERSION} \
    && pip install -r requirements.txt \
    && PBR_VERSION=${VERSION}  pip install . \
    && pip install uwsgi MySQL-python \
    && cp -r etc /etc/keystone \
    && pip install python-openstackclient \
    && cd - \
    && rm -rf keystone-${VERSION}*

COPY keystone.conf /etc/keystone/keystone.conf
COPY keystone.sql /root/keystone.sql

# Add bootstrap script and make it executable
COPY bootstrap.sh /etc/bootstrap.sh
RUN chown root:root /etc/bootstrap.sh && chmod a+x /etc/bootstrap.sh

ENTRYPOINT ["/etc/bootstrap.sh"]
EXPOSE 5000 35357

HEALTHCHECK --interval=10s --timeout=5s \
  CMD curl -f http://localhost:5000/v3 2> /dev/null || exit 1; \
  curl -f http://localhost:35357/v3 2> /dev/null || exit 1; \


#######################################
#
# 1) for VERSION, see https://releases.openstack.org/queens/index.html
# 2) to build image
# docker build -t openstack-keystone:queens .
# 3) to run image
# docker run -d -ti -p 35357:35357 --name keystone -p 5000:5000 openstack-keystone:queens
# 4) test
# curl http://localhost:5000/
# curl http://localhost:5000/v3
```

Dockerfileは https://github.com/crowdy/docker-keystone にもあります。
TouchBarに現在iTunesで再生中の曲名を表示する(BTT使用)

#TouchBarに現在iTunesで再生中の曲名を表示する
##はじめに
BetterTouchTool(BTT)で設定します。
BTTって何？って方はこちらの方の記事をどうぞ。
[BTT(BetterTouchTool)でTouch Barをカスタマイズする](https://qiita.com/kazuito/items/5aa41ce01dbdbd305f5d)

##TouchBarでapplescriptを動かす
まずBTTの設定画面を開き、Widgetの追加を行います。

<img width="1003" alt="qiita01.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/241671/8f82deb2-c44c-6ce1-54ea-eb98762c5a49.jpeg">

次に追加されたWidgetを"Run Apple Script and Show Return Value"に変更します。
<img width="997" alt="スクリーンショット 2018-08-30 15.53.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/241671/09d376a9-8724-3f7f-da87-45e61c180aa1.png">
(追記：もっと簡単な方法をコメントで教えてもらいました。
そっちのがいい人は最後だけみてください)

すると、次のような画面が開くので、好きな名前を入れ、以下のAppleScriptを入力してください。
<img width="870" alt="qiita2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/241671/42472a06-cb29-b46b-7b4b-f47eebdadc2f.jpeg">

```
tell application "iTunes"
	set trackName to name of current track
	return trackName
end tell
```
参考 http://d.hatena.ne.jp/m92o/20091013/1255419449

そして、Run Scriptを押し、Saveを押してください。


##結果
iTunesで現在再生中の曲がTouchBarに表示されます。
<img width="1085" alt="Touch Barショット 2018-08-30 16.05.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/241671/faf6c532-4af3-9e2b-f920-b13234fc08a0.png">
設定で色を変えたり、キーを押すことで表示させることもできます。
<img width="1085" alt="Touch Barショット 2018-08-30 16.24.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/241671/7b36615a-488d-79b1-cb69-681e84f0611f.png">

##追記
BTTの基本機能でできることをコメントで教えていただきました。
Widgetの「Now Playing Widget」を選択するだけです。 
<img width="303" alt="スクリーンショット 2018-10-17 22.33.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/241671/7e3391b9-ef2b-015f-9b70-aec6b83a7586.png">
<img width="1085" alt="Touch Barショット 2018-10-17 22.29.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/241671/a1a2a3a4-8b38-f44f-12ac-2387dbfd7987.png">
基本機能でできたとは……。
しかも高機能。~~apple scriptの勉強になったと思えば。~~
まずはアプリ自体を触ることが大切ですね。(戒め)
VB.NETでInterSystems Cache'の派生クラス（テーブル）を取り扱う方法

ODBらしくなってきました。

前回作ったTestClassをベースにします。
派生クラスをTestClassInhelitという名前で作成します。Extendsを選び、User.Main.TestClassを設定します。
![20180830-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/c04cdf04-36fc-7f7a-8d07-ba66f9ce8f11.png)
![20180830-2.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/367a25c8-32d9-47d8-fccb-deaed8b24fa5.png)
派生クラスを次のように記述します。
![20180830-3.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/e3f9dd08-629e-0d80-209e-d08e741bfd99.png)

★☆重要
StudioのTestClassの基底クラスに、次のコードを追加します。これは、VBで操作する際、Cache'に取り込んだクラスの規定動作が、(operator =)に対して「データベースアドレスを代入する」という動きになり、よく使われる（代入する）の動きになりません。それを実現するのがこのGetClone関数です。

```vb:TestClass.cls

Method GetClone(deep As %String = 1) As User.Main.TestClass [ Language = cache ]
{
		   //OK
           Quit ..%ConstructClone(deep)
}

```
![20180830-6.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/41ce72ac-113a-0445-1469-84beafd983b0.png)

VB.NETに設定したObjectBindingの機能で、TestClassとTestClassInhelitを＞で取り出し、Generateボタンで生成して、VB.NETの「追加→既存の項目」でObjectBinding2.vbを追加します。
![20180830-4.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/f5d9beb7-e3e0-cb44-85a6-3900dd23a256.png)

VB.NET側で、Button3を作り、次のように記述します。GetCloneを使う個所に注目してください。なお、オブジェクト指向プログラミングにおける派生クラスのキャストと同様に、基底クラスで生成された変数は（派生クラス型のデータ）をすべて持つことになります。
![20180830-5.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/2aaec48a-d23b-e865-b99f-e4cc6c15d8db.png)

```vb:Button3_Click()

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        '派生クラスを呼ぶ方法
        Dim cacheConnectStr As String = "Server = localhost; Port=1972;" +
               "Log File = C:\VSProject\NewCarte\NewCarte\NewCarte\bin\NewCarte.log; Namespace = USER;" +
               "Password = yourpass; USER ID = yourid"
        Dim cnCache As CacheConnection = New CacheConnection(cacheConnectStr)
        cnCache.Open()

        Dim d2 As User.Main.TestClassInhelit
        d2 = New User.Main.TestClassInhelit(cnCache)
        d2.name = "Nakagawa Saburou"
        d2.age = 34
        d2.name2 = "Sanchan"
        d2.age2 = 35
        d2.Save()
        d2.Close()

        'そもそも、Cache'クラスにおける（operator =）は、「同じデータベースの箇所」を参照することになるので、以下のように記述する
        Dim d11 As New User.Main.TestClass(cnCache)
        d11 = d2.GetClone("1")  '★注意：d11=d2とすると、単にd2と同じレコードを参照してしまう!
        '★注意：d22 = TryCast(d1, User.Main.TestClass) 、 d22 = d1.GetClone("1")はいずれもエラーになる！
        'd11はTestClassInhelitのデータをすべて持つ
        d11.Save()
        d11.Close()

    End Sub

```
実行結果（ID=20が、基本クラスでインスタンスを生成し、派生クラスのキャストをして保存した結果。基本、Cache'はMUMPSの柔軟性を生かし、データが消える側にデータ操作をしない傾向にある。）
![20180830-7.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/392336fa-c8a6-a689-4a32-09ae64304598.png)
![20180830-8.PNG](https://qiita-image-store.s3.amazonaws.com/0/262065/8200b9f9-c4ce-868e-ef7a-58a9e6a5bcc8.png)
複数に分割したJSONファイルから、swaggerのyamlファイルを生成する

yamlファイルが凄く……大きいです……
という状況になってしまって更新が大変になってしまったので。
どうしてこうなるまで放っておいたんだとか、その管理方法は間違ってるよね！と言われればそれまでなんですが……:sob:
こういう方法もあるよね、ということで。

# 実装例
https://github.com/fumihiko-hidaka/create-swagger-yml-from-many-json

# 

```json
{
  "swagger": "2.0",
  "info": {
    "description": "create-swagger-yml-from-many-json",
    "version": "1.0.0",
    "title": "create-swagger-yml-from-many-json"
  },
  "host": "localhost",
  "basePath": "/",
  "schemes": [
    "https"
  ],
  "consumes": [
    "application/json"
  ],
  "produces": [
    "application/json"
  ],
  "paths": {
    "$ref": "./path.json"
  }
}
```

```js
const fs = require('fs');
const JsonRefs = require('json-refs');
const YAML = require('json2yaml');
const root = require('./sample/index.json');
const options = {
  filter: ['relative', 'remote']
};

const outputPath = process.cwd() + '/swagger.yml';

process.chdir('sample');

JsonRefs.resolveRefs(root, options)
  .then(function (res) {
    fs.writeFileSync(outputPath,
      YAML.stringify(res.resolved)
    );
  }, function (err) {
    console.log(err.stack);
  });
```

対象のjsonファイルを読み込み、jsonRefsというライブラリで$refの部分を結合させています。
キモはprocess.chdir('sample') です。
$refを探す時にcurretディレクトリをベースに探してしまうので、chdirでcurrentディレクトリを変更してあげます。

# 結果
https://github.com/fumihiko-hidaka/create-swagger-yml-from-many-json/blob/master/swagger.yml

```yaml
---
  swagger: "2.0"
  info: 
    description: "create-swagger-yml-from-many-json"
    version: "1.0.0"
    title: "create-swagger-yml-from-many-json"
  host: "localhost"
  basePath: "/"
  schemes: 
    - "https"
  consumes: 
    - "application/json"
  produces: 
    - "application/json"
  paths: 
    /test_api: 
      get: 
        summary: "TEST API"
        parameters: []
        responses: 
          200: 
            schema: 
              type: "object"
              properties: 
                id: 
                  type: "integer"
                  description: "店舗ID"
                  example: 1
                name: 
                  type: "string"
                  description: "店舗名"
                  example: "店舗！"
```

mergeした結果ができました！

# 追記
毎日更新してみようと思ったけれども、ネタ切れが酷い！
Nginx+PHP-FPM+LibreOfficeで--convert-to pdfで失敗する時の対処法

PHPExcel+LibreOfficeでエクセルファイルからPDFを生成する方法がありますが、WEBアプリケーションとして実行した場合に失敗するケースがありました。
その場合、nginx(もしくはapache)ユーザーのHOMEディレクトリに.config/libreofficeディレクトリへの書き込み権限があるかどうかを確認するとうまく行く場合があります。

以下のコマンドを叩いて`createSettingsDocument`でエラーとなっていた場合は有効のようです。

```bash
$ sudo -u nginx libreoffice5.4 --headless --convert-to pdf --outdir /tmp /tmp/phpfoobarbaz.xlsx

[Java framework] Error in function createSettingsDocument (elements.cxx).
javaldx failed!
Warning: failed to read path from javaldx
```

nginxユーザーのHOMEディレクトリを確認します。

```bash
$ echo ~nginx

/var/cache/nginx
```

そのHOMEディレクトリ配下に、設定ファイルのディレクトリを作成します。

```bash
$ sudo mkdir -p /var/cache/nginx/.config/libreoffice
$ sudo chown -R nginx:nginx /var/cache/nginx/.config
```

再度実行して成功するかどうか確認します。

```bash
$ sudo -u nginx libreoffice5.4 --headless --convert-to pdf --outdir /tmp /tmp/phpfoobarbaz.xlsx

convert /tmp/phpfoobarbaz.xlsx -> /tmp/phpfoobarbaz.pdf using filter : calc_pdf_Export
```
Microsoft Flowで定型文の書かれたノートを毎日作成する

やってみたら意外と資料が分散してて大変だったのでメモがてら。

# きっかけ

わたしはプライベートの日記をOneNoteにつけています。
「日記」というノートブックに「今年の年(2018年など)」というセクションを作り、その中に「yyyy/MM/dd その日のタイトル(タイトルはその日の最後に追記)」という名前のノートを作って運用しているのですが、毎回定型文(ほんのわずかではありますが)を書かなければいけないのがちょっと面倒に感じていました。
そのためFlowでノートの作成だけ自動化しようとしたのですが、関連するドキュメントが結構あちこちに富んでいてやりづらかったです。同じMicrosoftのプロダクトなんだから相互リンクくらいしてくれよという気もしますが…。

# 毎日n時実行のトリガーを作る

これは簡単。「繰り返し」というトリガーがあるので、これを使いましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/14499/2acbc03f-25d8-f774-7472-21256f469a57.png)

# OneNoteにページを作る

本来であればセクション名をちゃんと式を使って入力したかったんですが、FlowのOneNoteアクションでは、セクション名ではなく、セクションIDを要求してくるので面倒なのでやめました(ノートブックのセクションを取得 というアクションもあるので、そこから頑張ればなんとかできそうな気もする)。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/14499/39910e97-d731-0b69-0db7-14ea176e3160.png)

## ページの内容を書く

で、ここからなのですが、OneNoteのノートページは簡易HTMLとなっています。「[OneNote ページの作成](https://msdn.microsoft.com/ja-jp/office/office365/howto/onenote-create-page?f=255&MSPPError=-2147217396#supported-html-and-css-for-onenote-pages)」というところにまとまっていますので、使えるタグはそこを参照しましょう。なお、titleタグは丁寧にheadタグに囲んであげないと認識してくれないようです。(雑にtitleタグだけ書いてもダメ)

わたしの場合ひとまずこんな感じで作成しました。

```html:テンプレート文
<!DOCTYPE html>
<html>
  <head>
    <title>@{formatDateTime(addHours(utcNow(),9), 'yyyy/MM/dd')}</title>
    <meta name="created" content="@{formatDateTime(addHours(utcnow(), 9),'yyyy-MM-ddTHH:mm:ss+09:00')}"/>
  </head>
  <body>
    <p>&nbsp;</p>
    <h1>今日やった</h1>
    <ul>
      <li></li>
    </ul>
    <h1>明日やる</h1>
  </body>
</html>
```

`<p></p>`タグは何か入れてない場合は出力されないため、`&nbsp;`でも入れておくと良いです。

本当は前日のページに書いた内容を一部コピー などやってみたかったのですが、これもまたFlowだけでやるのは困難なようなので諦めました(セクション名・ページ名をIDで指定しなければいけないうえ、前日ページのHTMLをパースする処理も必要になるため)。

# 参照ページ

* [OneNote \(Business\) \- Connectors \| Microsoft Docs](https://docs.microsoft.com/ja-jp/connectors/onenote/)
* [OneNote ページの作成](https://msdn.microsoft.com/ja-jp/office/office365/howto/onenote-create-page?f=255&MSPPError=-2147217396#supported-html-and-css-for-onenote-pages)
* [OneNote API HTML タグ サポート](https://msdn.microsoft.com/ja-jp/library/office/dn575442.aspx#bkmk_onsvc_creation)
【Rails】入力データをテーブルに保存


#アクションを作成
今回はテーブルに新しいレコードとして入力データを挿入する。
そのためコントローラには<font color="Red">newアクション</font>と<font color="Red">createアクション</font>が必要になる。
とりあえずビューを表示したいので、createアクションにおける保存処理についてはあとで追加する。
新しいレコードを作成するので、newアクションの中身は以下のように記述。

```ruby:users_controller.rb
class UsersController < ApplicationController

	def index
		@users = User.all
	end

	def new
		@user = User.new
	end

	def create
	end
end
```
ビュー側の処理で変数@userにデータを格納するので、@userの定義をした。

#form_forメソッドを用いたビュー
サンプルとして会員登録画面を作成してみた。
formの使い方の詳細がわからない場合は<a href="https://qiita.com/Hal_mai/items/1e5afd0c99dd9059839f">こちら</a>を参考に。

```html:users/new.html.erb
<head>
	<meta charset="utf-8">
	<link rel="stylesheet" href="members.scss" type="text/css">
</head>
<h1>
	会員登録
</h1>
<body>
	<%= form_for(@user, url: users_path, method: :post) do |f| %>
		<p>
            <%= f.label :name, "アカウント名" %><br>
            <%= f.text_field :name %>
        </p>
		<p>
			<%= f.label :email, "メールアドレス" %><br>
			<%= f.email_field :email %>
		</p>
		<p>
			<%= f.label :password, "パスワード" %><br>
            <%= f.password_field :password %>
		</p>
		<p>
		<%= f.label :password_confirmation, "パスワード確認" %><br>
            <%= f.password_field :password_confirmation %>
		</p>
		<%= f.submit "登録する"%>
	<% end %>
</body>
```
<img width="469" alt="スクリーンショット 2018-08-30 14.36.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/b4322c11-ecef-7cbb-35fe-4e8289fa415b.png">

このページで入力したアカウント名、メールアドレス、パスワードをテーブルに挿入したい。
これまでの記述だと、フォームに入力して登録ボタンをクリックした後、指定したURLのページに遷移する。
特にエラーは起きないが、テーブルにデータは挿入されない。
そこで、createアクションに保存処理を記述する必要がある。

#コントローラに保存処理を記述
簡単な保存処理をcreateアクションに記述すると、以下のようになる。

```ruby:users_controller.rb
	def new
		@user = User.new
	end

	def create
		@user = User.new(user_params)
		if @user.save
			render 'index'
		else
			render 'new'
		end
	end

	private
		def user_params
			params.require(:user).permit(:name, :email, :password)
		end
```

「登録する」ボタンによってPOSTされたデータが<font color="Red">params</font>。
<font color="Red">params</font>の中身は下のようになっている。
<img width="633" alt="スクリーンショット 2018-08-30 14.48.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/180127/d585affe-f982-07bb-d926-7bf619764bb5.png">
<font color="Red">.require(:user)</font>によって、このparamsから"user"部を取り出している。
さらに、<font color="Red">.permit(:name, :email, :password)</font>によって、nameとemail,passwordカラムへの挿入を許可している。

これらの操作によって入力されたデータを適切に取得したあとは、
<font color="Red">saveメソッド</font>を用いてデータをテーブルに保存した。

---

保存処理に成功した場合、indexアクションのページに遷移するようにしたが、
このような場合、<font color="Red">render</font>や<font color="Red">redirect_to</font>を使用することができる。

```ruby:
render 'アクション名'

#例
render 'index'
```

```ruby:
redirect_to rootpath名

#例
redirect_to users_path
```
どちらも同じ機能になる。

---
###補足
今回入力データを保存する簡単な処理を記述したが、本格的に導入するとなると

**・保存トランザクションが失敗した時のロールバック処理周り**
**・メールアドレスやパスワードのバリデーション**


などの機能が必要になってくるが、これらはまた別の記事にまとめる。
「Joy, Inc.」を読んでみた

いまさらながら「[Joy, Inc.](https://www.amazon.co.jp/dp/4798148784)」を読んでみました。

最初は懐疑的だったのですが、読んでみてすごくよかったです・・！！
ぜひいろんな人にオススメしたいと思いました:sunglasses:

# 読む前
* 「Joy=喜び」に着目・・？？ （怪しい・・）
* 仕事と喜びの関係は人それぞれでは？
	* そもそも喜びを求めるべきか
	* 喜びを感じたいかどうか＆どう感じたいかは、人によるのでは・・

# 読んでみて感じた内容
* 「仕事に喜びを！」のような精神論的なことを主張する内容ではなかった（よかった・・）
* 著者がCEOを務めるメンローイノベーションズ社でやってきた数々の試みの紹介
* それらの活動には、社員・顧客・世界が「喜び」を得られるために、という軸がある
* 各テーマごとのエピソードや試みの内容がストーリー仕立てで具体的に書かれていて、イメージしやすい！

# キーワード
* あらゆることをオープンにする・ひと目でわかるようにする
* 全員が同じ方向を向くようにする
* いろいろなことを小さく試すことから始め、変化に対応できるようにする
* etc.

# 印象に残ったエピソード
**第7章の「メンローベイビーズ」！** :baby:

* 既存の枠組みに捉われず、「喜び」のためにどうするのが最もよいかを考え試した事例として、とても印象的でした！
* 当初は考えていなかったような副次的な効果も大きく、「試してみること」に勇気を与えてくれるエピソードでした。

# その他の感想
## 仕事に活かせそうなヒントがたくさん！
* チームメンバー・顧客・ステークホルダーと良好な関係を築きながら、本当に価値のある「よいもの」を作り届けるためのヒントがたくさん詰まっていました！
* ちょうど読んだタイミングで、どう関係構築していけばよいか・どう進めていけばよいかなどを悩んでいた時期だったので、響くものがたくさんありました。

## 誰でも読みやすそう！
* 「アジャイル」「スクラム」などの言葉を使わずにそれらのプロセスが紹介されているので、誰でも読みやすそうでした。

## いろいろな人にオススメしたい！
* 題材こそソフトウェア開発ですが、あらゆる業界のあらゆる現場で活用できることがたくさんありそうなので、いろいろな人にオススメしたいです！
* 特に、私が日頃お客様として接している方々にもぜひ知ってもらいたいと思いました。
gcc > マクロ定義時のみmain()を含める + コンパイル時に-Dにてマクロを指定

```txt:動作環境
Ubuntu 16.04.3 LTS desktop amd64
tmux 2.1-3build1
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
```

### 処理概要

- Linuxと組込み環境で同じソースを使う
- Linux上では`main()`を含め、組込みでは含めない

### gccの-Dオプション

https://explainshell.com/explain?cmd=gcc+-D

### コード例

```withMain_180830.c
#include <stdio.h>

void testFunc(void)
{

}

#ifdef DEBUG_WITH_MAIN
int main(void)
{
	printf("hello\n");
}
#endif
```

Linuxでmain()付きでコンパイルするには

```shell
$ gcc -DDEBUG_WITH_MAIN withMain_180830.c 
```

組込みでは`DEBUG_WITH_MAIN`マクロを指定せずに使う。

### 備考

他にも方法はあるかもしれないが、一つの方法として。

他には`__GNUC__`や`__LINUX__`を使う方法も考えたが、組込みの環境は将来GNUCと関わったり、Linuxで使うことになる可能性も残せるように、上記のようにしている。
wordpressに絵文字が入らなかった件

## 概要
業務でutf8mb4対応を他のシステムでやって存在を知った。
自分ブログにもutf8mb4に対応して絵文字を入力できるようにしてみた。

### 環境
CentOS 6.9
mysql 5.1
wordpress 4.9.8

## 原因
mysqlはutf8mb4じゃないと絵文字を入れることができない。
ちなみに吉田さんの「𠮷」バージョンとかもutf8mb4じゃないと化けてしまう。
使っているmysql5.1でutf8mb4を使えなかった。
mysql5.5以上で出来る様子、使えないならバージョンアップしちゃえばいいじゃない:point_up_tone1:

カラムの型を変えることで対応することもできるみたいです。

[MySQL5.1 で 4byte な utf8 文字を扱う方法](https://qiita.com/umechiki/items/06df599a069526ab90c3)

## 対応
### DBダンプを取る
消えてはまずいものをバックアップする

```
mysqldump -u root -p -h localhost wordpress_db > wordpress_db_dump.sql
```

### mysqlのバージョンを上げる

[こちら](https://qiita.com/tachitechi/items/b59278a16f636651410f)を参考に下記コマンドを実行した。

```
service mysqld stop
yum remove mysql*
yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
yum install mysql mysql-devel mysql-server mysql-utilities
```

バージョン確認

```
mysql --version
mysql  Ver 14.14 Distrib 5.6.41, for Linux (x86_64) using  EditLine wrapper
```

OK!!

とりあえずここまでで、絵文字入力できました。
特にutf8mb4設定してないのに入力できたのは謎:frowning2:

## (その他)utf8mb4について
とりあえず、絵文字入力ができたが全体でutf8mb4に合わせたほうがいいかと思ったので下記を実施した。

### mysqlとクライアントの文字コードを設定する
```/etc/my.cnf
[mysqld]
character-set-server=utf8mb4

[client]
default-character-set=utf8mb4
```

下記で確認する。

```
show variables like "chara%";
```

### データベースの文字コードを設定する

```
alter database wordpress_db character set utf8mb4;
```

下記で確認する。

```
show create database wordpress_db;
```

### テーブルの文字コードを設定する
下記SQLを流す。今回エラーがでなかったが変換時に行フォーマット系でエラーが出る場合がある。

```mb4_alter.sql
alter table `wp_commentmeta` convert to character set utf8mb4;
alter table `wp_comments` convert to character set utf8mb4;
alter table `wp_links` convert to character set utf8mb4;
alter table `wp_options` convert to character set utf8mb4;
alter table `wp_postmeta` convert to character set utf8mb4;
alter table `wp_posts` convert to character set utf8mb4;
alter table `wp_term_relationships` convert to character set utf8mb4;
alter table `wp_term_taxonomy` convert to character set utf8mb4;
alter table `wp_termmeta` convert to character set utf8mb4;
alter table `wp_terms` convert to character set utf8mb4;
alter table `wp_usermeta` convert to character set utf8mb4;
alter table `wp_users` convert to character set utf8mb4;
```

下記で確認する。create文が表示されて、charsetがutf8mb4になっているのがわかる。

```
show create table wp_posts;
```

## 番外編
### カラムだけ適応させるには？
業務でカラムだけutf8mb4対応した。

```
alter table table_name modify 'column_name' varchar(255) character set utf8mb4;
```

みたいな感じでカラムのみ変更できる。
【JS不要】CSSだけで作ったアコーディオンパネル×２

諸事情によりJSを使えない/使いたくない、それでもアコーディオンは実装したい…！
という時用に作ったものです。
　①1つ選択したら他は非表示にするバージョン
　②項目それぞれで開閉を選択できるバージョン
の2種類。

#①1つ選択したら他は非表示にするバージョン
<p data-height="800" data-theme-id="0" data-slug-hash="bxBwgb" data-default-tab="html,result" data-user="yuki_24" data-pen-title="CSSだけで作ったaccordionパネル01" class="codepen">See the Pen <a href="https://codepen.io/yuki_24/pen/bxBwgb/">CSSだけで作ったaccordionパネル01</a> by Yuki Koide (<a href="https://codepen.io/yuki_24">@yuki_24</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#②項目それぞれで開閉を選択できるバージョン
<p data-height="800" data-theme-id="0" data-slug-hash="QVGGma" data-default-tab="html,result" data-user="yuki_24" data-pen-title="CSSだけで作ったaccordionパネル02" class="codepen">See the Pen <a href="https://codepen.io/yuki_24/pen/QVGGma/">CSSだけで作ったaccordionパネル02</a> by Yuki Koide (<a href="https://codepen.io/yuki_24">@yuki_24</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#ポイント
・1つだけ開くものを作る場合はradioボタン、それぞれ開閉できるものを作る場合はcheckboxの利用が便利
・input要素は挙動の管理にだけ利用。表示そのものはdisplay:noneで消してしまう
・ボタン部分にはlabel要素を利用
・E + F　（隣接している要素に適用）is 便利
・E ~ F　（後にある要素に適用）is 神
UiPath Developer Community 第6回ワークショップ 覚え書き「出現するタイミングが不定のポップアップを処理する」

[UiPath Developer Community 第6回ワークショップ](https://www.uipath.com/ja/resources/knowledge-base/uipath-developer-community-20180829) で聞いてきた内容の覚え書き。。


今回のワークショップで聞いてきた話のうちなかなか印象的だったのは、Parallelアクティビティの使い道について。処理の効率化のための並列実行のアクティビティよね？くらいに思ってたんですが「出現するタイミングが不定のポップアップを処理する」というTIPSの紹介がありましたので、メモっときます。



## Parallelアクティビティの使い道について

たとえばメモ帳を開いてファイル保存するばあい、ファイル名を固定的にすると、初めはそのまま保存できますが、2回目以降は「上書きする？」ってダイアログが表示されます。この「出たり出なかったりするダイアログ」をParallelアクティビティで処理すれば、処理の見通しがよくなるよねって話です。

![pic.jpg](https://qiita-image-store.s3.amazonaws.com/0/73777/8401f6c4-4416-1c06-af53-0f7fc3ddd7f2.jpeg "pic.jpg")
ワークショップの画面キャプチャ

## やってみる

具体的にはこんな感じ。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/73777/69b07993-c755-a1ff-f98c-a2de4d08f162.png "001.png")

Parallelアクティビティのうち、左の処理はメモ帳を開いて保存する処理を記録しています。

右の処理は、上書きする？ってダイアログが出たときに「はい」をクリックするようにしてあります。


また、Parallelアクティビティは通常、両方の処理が完了するまで待つようになっていますが、「CompletionCondition」をTrueに設定することで、片方の処理が終了したら、残りの処理はキャンセルされるようにしてあります。

こうすることで

- 左の処理がおわってファイルが何事もなく保存されれば、右の処理はキャンセルされる。
- 左の処理が「保存する？」ってダイアログを表示すれば(それで左の処理は待ちになる)、右側のボタン表示待ちになっているほうが反応して、保存を押してくれる。

となるわけですね。

注意点としては、先に終了したほう"じゃない"ほうは、途中で処理がキャンセルされます。つまり、右で保存ダイアログをクリックすると左右の処理はまた共に動き出しますが、左のメイン処理でまだまだ処理しようとしても、右が終了したら左の処理が実行されないので、その点はご注意下さい。

## ソースコード

ソースコードはココに置いておきました。
https://github.com/masatomix/uipath_sample/releases/tag/fix



## 関連リンク
- [UiPath Developer Community 第6回ワークショップ](https://www.uipath.com/ja/resources/knowledge-base/uipath-developer-community-20180829) 
- [UiPath Japan のTwitter (ワタクシちょっとだけ見切れてます)](https://twitter.com/UiPathJapan/status/1034767768015388672)
- [今回のソースコード](https://github.com/masatomix/uipath_sample/releases/tag/fix)


これからちょくちょく、UiPath関連について書いていこうとおもいます。よろしくお願いします。
JSON Schemaで少し凝ったvalidationをするための定義方法

## 経緯

cloud functionsでAPI作るにあたって入力をjsonで受け取るようにしたが、validationどうしようと調べてたら[JSON Schema](https://json-schema.org/)という素敵なものと出会った。

単純に必須項目や文字列、数値などのスキーマ定義するだけならそれほど悩まず書けるが、radioボタンの入力項目などもう少し制限かけたいなーという欲が出たので調べて見た。

## 前提

JSON Schemaはdraft-06で動作確認しています。

[JSON Schema | The home of JSON Schema](https://json-schema.org/)

### NULLを許容したい

typeを配列にしてnullを許容するように記載すればOK。

```nullable.json
    "nullable": {
      "type": [
        "string",
        "null"
      ]
    }
```

### 特定の項目の中から選択されているか確認したい

radioボタンなど入力項目が特定の内容に決まっている場合にはenumを使えばOK。

```enum.json
    "selected": {
      "type": "string",
      "enum": [
        "dog",
        "cat",
        "monkey"
      ]
    }
```

複数選択可の場合は以下のように書ける。

```enum2.json
    "multiselected": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "dog",
          "cat",
          "monkey"
        ]
      }
    }
```

### 複数選択可だが最低1つ選択させたい

複数選択可のselect boxなどで未設定はNGという場合にはminItemsを指定すればOK。

```enum3.json
    "requiredselected": {
      "type": "array",
      "minItems": 1,
      "items": {
        "type": "string",
        "enum": [
          "dog",
          "cat",
          "monkey"
        ]
      }
    }
```

### URLやEMAILなど特定のフォーマットの文字列か確認したい

formatを指定すればOK。指定できるフォーマットは[こちら](https://json-schema.org/latest/json-schema-validation.html#rfc.section.7.3)を確認ください。

```url.json
    "url": {
      "type": "string",
      "format": "uri"
    }
```

ちょうどいいformatがない場合は正規表現が使えるpatternを使うこともできます。(\dが使えないなど少々使いづらいが)

### 数値が範囲内か確認したい

minimumとmaximumを指定すればOK。

```range.json
    "range": {
      "type": "number",
      "minimum": 0,
      "maximum": 100
    }
```

最小値、最大値を含めたくない場合はexclusiveMinimum(Maximum)をFalseにすればOK。

### 特定の数値の倍数が設定されているか確認したい

multipleOfを指定すればOK。

```price.json
    "price": {
      "type": "number",
      "multipleOf": 100
    }
```

ただ、multipleOfに0.1などの少数を指定すると精度の関係でvalidationの結果が予期しない結果になりかねないので、少数は基本使わない。
リモートデスクトップの自動リサイズ設定

これを追記するだけ。
Default.rdp は、ユーザーのドキュメントフォルダー配下にあるはず。

```text:Default.rdp
smart sizing:i:1
```

## 仲間募集中
[弊社](https://www.nittsu-infosys.com/)ではエンジニアを募集中です。インフラからアプリ、ユーザサポートまで幅広く業務を行ってます。
https://www.nittsu-infosys.com/recruit/2019/index.html
Androidのレイアウトの背景画像に、gravityを指定して見切れる形で表示させる方法

AndroidのLayout(FrameLayoutやLinearLayout)で、backgroundに画像を指定するときのTipsです。

##概要
Androidのlayoutの背景に画面より大きい画像を利用した時に大きい部分を見切れるように表示させたい場合、**背景にXMLのDrawableを利用する**ことで解決できます。
汎用的に言えば、XMLにgravity等を指定することで、[ここ](https://developer.android.com/guide/topics/resources/drawable-resource?hl=ja#XmlBitmap)にある仕様に基づき背景画像をレイアウトできます。

画面サイズより大きい画像を指定すると、画像が画面に合わせて強制的に縮小してしまいます。scaleTypeも効かない為、画面比と画像がマッチしていないと、きれいに縮小されません。

こういう場合、*ImageView*を配置して解決するのが一番最初に思いつく方法でそれでも解決できるかと思います。今まで自分もその方法で解決してきましたが、他にレイアウト要素がたくさんある場合、レイヤーを意識するのが面倒です。Layoutの背景で指定出来れば、その辺りを気にせず実装出来ます。


##手順

####1.drawableのxmlで用意する
例として、**background.xml**というファイルを作ります。
素材として、**bigger_than_display.png**という画面サイズより大きい素材があるとします。
drawableディレクトリ配下に下記XMLを保存します。


```xml:background.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
    <bitmap
        android:gravity="top|left"
        android:src="@drawable/bigger_than_display" >
    </bitmap>
    </item>
</selector>
```
####2.作成したxmlをlayoutのbackgroundに指定する
drawableのxmlが出来たら、背景画像を指定するようにbackground属性に指定するだけです。

```xml:layout.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background"
    tools:context="resource.layout.test.MainActivity">

</android.support.constraint.ConstraintLayout>
```

##メリット
- 知ってしまえば簡単に実装出来る
- レイヤーを意識しなくて済むので、後から指定した場合も手間が少ない
- imageviewを指定するよりも意味と実装が一致するので、コードが分かりやすくなる
- 小さい画像でgravityを効かせたい時も使えます。


##ググった元ネタ
元ネタは[これ](https://stackoverflow.com/questions/1400782/android-scale-a-drawable-or-background-image)

##XMLによる記述は色々便利
画面上のパーツをカスタマイズする場合、XMLでdrawableを作ると結構色々なことが出来ます。ラジオボタンのカスタマイズ、ボタンの押込み指定等、画面上のパーツのカスタマイズに悩んだらdrawableとXML,Shapeをキーワードに調べてみると良いものが見つかるかもしれません。
git log最適化

`git log --oneline`
とか書いたりするの面倒なので
glogという名前でaliaseに保存しちゃえって話。

## どうせならもっと最適化したやつほしい。
いつか調べて使っていたやつ
すごく良かったので共有します。

私の場合
`$ vi ~/.zsh_aliases`
bashとかなら
`$ vi ~/.bashrc`
もしくは
`$ vi ~/.bash_aliases`

```zsh:zsh_aliases
alias glog="git log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'"
```
### sourceで読み込みます
`$ source ~/.zsh_aliases`

### 使うとこんな感じ
```
$ glog
* 9ad2b90 2018-08-30 xxxxxxx  (HEAD) Add tmp folder for test
* 100216d 2018-08-29 xxxxxxx  compile complete but accept error!
* 081493d 2018-08-29 xxxxxxx  (master) Get share_data 100000 times
* 5a8f7db 2018-08-28 xxxxxxx  error fixd
* 7c717bf 2018-08-28 xxxxxxx  error
```
xxxxxxxはユーザ名です。

branchの名前が出ているので
(master)がどこまでcommitしているのかわかりやすく
日付も表示してさらに--onelineのオプションのようにコンパクトでみやすい！

**おためしあれ！**
Vim のファイルセーブは異常だからやめたい

Vim 使いの皆さんは、 Vim のファイルを保存する方法をご存知だろうか？

そうだ、 `:w<CR>` のことだ。

……皆さん、お気づきだろうか。
たかがファイルを保存するのに、
なんと、

# 三つもキーをタイプしている！！！

あまりの衝撃に、 # を使って強調してしまった。

そして、私みたいな US キーボード使いなら `Shift ; w <CR>` だ。

# 四つに跳ね上がっている！！！

意味がわからない。
日本は法治国家ではなかったのか（錯乱
信じられないほどの苦行だ。

プログラマーの三大美徳である「怠惰」をなんだと思ってるんだ！！　と激昂した私は、オートセーブをしたくてたまらなくなった。

## この記事で達成すること

vim からフォーカスを外した場合、自動でセーブする。

もう一つのアプローチとしては、一定時間入力しなければセーブするというものがあるが、ファイルセーブ時に何かする機能が全滅するのでやめておく。

## 手順

長く険しい道のりだが、最後までやり遂げてくれ。

### neovim, gui vim を使っていない者はここから

neovim 使いはこの項目をスキップすべし。
gui 版の vim もスキップして問題ないはず（確かめてない）。

いくつかのターミナル（どれだよ）を除いて vim はフォーカス状態を感知できないらしい。

mac 使いは以下の二つを実行すべし。
windows linux 使いは自分で頑張れ。

- iterm2 を使う
- [sjl/vitality.vim](https://github.com/sjl/vitality.vim) を入れる  
  これは iterm2 tmux vim 三者の連携をいい感じにしてくれるプラグインで、 vim がフォーカス状態を感知できるようになる。

そして下へと続く。

### neovim, gui vim を使っている者はここから始める

`$ echo 'autocmd FocusLost * silent! wa' >> ~/.vimrc`

tmux を使わない場合はここで終わり。

おめでとう。
vimrc に一行文字列を追加するという危険な旅を終えたあなたには、それ相応の見返りがあったはずだ。

このやり方は、ファイルに紐づいてないバッファーや、セーブできないファイルがあった時、スキップする。
もちろん、 vim を終了する時にはちゃんと警告が出るので、セーブを終えないまま vim を退出するようなことにはならないが、ちゃんとエラーを表示してほしい人はこっちを使うといいだろう。

`$ echo 'autocmd FocusLost * wa' >> ~/.vimrc`

これで OK 。

### Tmux を使っている

しかし、 tmux 使いはまだだ。
tmux の中の vim はフォーカス状態を感知することが出来ない。

険しい道のりが続く。

`$ echo 'set -g focus-events on' >> ~/.tmux.conf`

終わりである。

ターミナルからフォーカスを外した時はもちろん、 tmux のウィンドウを移動した時にもセーブされる。

果てしなく長い手順の果てに、 tmux 使いもきっとオートセーブを手に入れたことだろう。

少なくとも Mac デフォルトのターミナルと iTerm2 で確認したところ、問題なく動いた。

やったね。

P.S. `:w<CR>` を筋肉が覚えててやめられない。
【脱jQuery】closestをネイティブのjavascriptで書く

# はじめに
大変便利なjQueryメソッド `closest()`。
`脱jQuery` して 簡易的ではありますが、`javascript` のみで書いていきたいと思います。

# jQuery
```js:jQuery
$('.selector').closest('.targetClass');
```

# javascript
```js:javascript
const closest = (el, targetClass) => {
  for (let item = el; item; item = item.parentElement) {
    if (item.classList.contains(targetClass)) {
      return item
    }
  }
}

closest(document.body.querySelector('.selector'), 'targetClass')
```

# 例
`.item` クリック時に先祖要素である `.wrapper_inner` を取得して `class` `demo` を追加したいと思います。

```html:html
<div class="wrapper">
  <div class="wrapper_inner">
    <ul class="items">
      <li class="item">item</li>
      <li class="item">item</li>
      <li class="item">item</li>
      <li class="item">item</li>
      <li class="item">item</li>
    </ul>
  </div>
</div>
```

```js:javascript
const closest = (el, closestClass) => {
  for (let item = el; item; item = item.parentElement) {
    if (item.classList.contains(targetClass)) {
      return item
    }
  }
}

const items = [].slice.call(document.body.querySelectorAll('.item'))

items.forEach((item) => {
  item.addEventListener('click', (e) => {
    const closestEl = closest(e.currentTarget, 'wrapper_inner')

    if (!closestEl) {
      return
    }

    closestEl.classList.add('demo')
  })
})
```

# まとめ
最近、一部のブラウザでは [Element.closest()](https://developer.mozilla.org/en-US/docs/Web/API/Element/closest) 実装済で `Polyfill` もありますので、利用シーンに応じて使い分けていただければと思います。

最後まで閲覧いただきありがとうございました！
Ubuntu18.04でlibcurl3と4が共存できない問題

```bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=18.04
DISTRIB_CODENAME=bionic
DISTRIB_DESCRIPTION="Ubuntu 18.04.1 LTS"
```

Ubuntu18.04に入るcurlはlibcurl4に依存していて、
もし任意で使っているパッケージがlibcurl3に依存している場合、共存ができずに困る。

そのため、libcurl4に依存しているcurlをインストールした状態で、
libcurl3に依存しているパッケージを利用しようとするとエラーになります。

```bash
$ apt-cache show curl | grep -i depends
Depends: libc6 (>= 2.17), libcurl4 (= 7.58.0-2ubuntu3.2), zlib1g (>= 1:1.1.4)
```

# 解決策

```bash
$ sudo apt-get install libcurl3 #curlが削除される
#libcurl.so.4.5.0をlibcurl3.so.4.5.0としてコピーしておく
$ sudo cp /usr/lib/x86_64-linux-gnu/libcurl.so.4.5.0 /usr/lib/x86_64-linux-gnu/libcurl3.so.4.5.0
$ sudo apt-get install curl #libcurl3が消え、libcurl4が入る
```

これで問題なくcurlも使えて、libcurl3に依存しているパッケージも動くはず。
【Ruby on Rails】繰り返しメソッドをビューで出力したとき最後に余計な数字が出る。

```
<%= (0..2).each do |n| %>
<%= n %>
<% end %>
```

のようにviewに出力すると

```
0 1 2 0..2
```

のように0..2というような文字が出力されてしまいます。これを表示させないためには
<%= を　<%にするというごく単純な問題でした。
数字からカナ変換 convert Alphanumeric Number to Katakana

#数字からカナへ変換ツール
Convert Number to Katakana
Mecabでは、数字の変換ができない。


| Input | Commad | Output |
|:-----------|------------:|:------------:|
| 10人       | echo "10人" &#124; mecab  |  ジュウニン  |
| 10     |  echo "10" &#124; mecab  |  10   |


フリガナとしては確かに必要ではないが、音声認識のラベリング（Hummm使い道は今このぐらいですｗ。）
必要なツール：

+  jaconv
+  urlopen
+  BeautifulSoup
各自インストールしてください。

```python:num2kana.py
import sys
import re
import jaconv
from urllib.request import urlopen
from bs4 import BeautifulSoup

args = sys.argv

url_str = "https://www.sljfaq.org/cgi/numbers_ja.cgi?number=" + args[1] + "&usedaiji=0"

html = urlopen(url_str)
soup = BeautifulSoup(html,"lxml")
print(jaconv.hira2kata(soup.find("th", text = re.compile("ひらがな")).find_next_sibling("td").getText().strip()))

```
####実行:####

```
~$ python3 num2kana.py 125
ヒャクニジュウゴ
```

引用するサイト:

>https://www.sljfaq.org/cgi/numbers_ja.cgi
ASP.NET が書き出すクッキーのドメイン等を設定する方法と知見

# 本題

ASP.NET_SessionIdや.ASPXAUTHなどASP.NETが書き出すクッキーのDomainやSecureを変更するには下記の設定をWeb.configに追記します。

```xml
  <system.web>
    <httpCookies domain="your.domain.name" httpOnlyCookies="true" requireSSL="true" />
  </system.web>
```

上記で動かない場合、コードで書き換える方法もあるようです。（[参考](https://stackoverflow.com/questions/2326521/asp-net-session-cookies-specifying-the-base-domain)）

# ちなみにクッキーの名前を変える方法

```xml
  <system.web>
    <!--SessionId-->
    <sessionState cookieName="foo" />
    <!--.ASPXAUTH-->
    <authentication mode="Forms">
      <forms name="bar" loginUrl="/Path/To/LoginPage" />
    </authentication>
  </system.web>
```

# 知見
例えばexample.jpとadmin.example.jpという２サイトがあった時にDomainが.example.jpになるように設定すると両方で同じクッキーが使用されることになります。

SessionIdが同じでも動くのか？と疑問に思ったんですがちゃんと動きます。値も別々に書き換えてくれて、同じ値が操作されてしまう問題もありません。

…と思ったんですが、[同じ値だと操作されてしまうという記事](https://itblogdsi.blog.fc2.com/blog-entry-344.html)が。インプロセスと状態サーバ、インデックスを揃えたりしてもうちでは再現しませんでした。セッションの保存の仕方やIISの設定が違うんでしょうか？
VS Code Live Share のユーザー上限を５人から30人に引き上げる

# 更新

2018/10/11
Version0.3.788からデフォルトで30人に引き上げることができるようになりました

`設定` > `Liveshare: Increased Guest Limit` > `Increases the guest limit from 5 to 30.`
にチェックをつければ完了です

https://github.com/MicrosoftDocs/live-share/releases/tag/0.3.788




# 以下旧記事

# 結論


vs code -> user settings ->
 
```
"liveshare.features": "default",
```
を

```text
"liveshare.features": "experimental",
```
に変更する


![vscodecollaboratorlimitout.gif](https://qiita-image-store.s3.amazonaws.com/0/102978/0a9bef7e-45f2-1cd0-7ea5-c018abdbfd51.gif)




ただしこれはプレビュー版なので動作の保証はない
これによってユーザー（コラボレーター）の上限が5人から30人に引き上がる


:warning:なお、30人も友達がいないので未検証

[TASK] 友達ができたら検証する

# 前提
- vs code を使っている
- vs code live share が有効である
- live shareの使い方を知っている





## リファレンス

https://docs.microsoft.com/en-us/visualstudio/liveshare/faq

https://github.com/MicrosoftDocs/live-share/issues/229




## tag
vs code
visual studio code
collaboration
join
ジョイン
上限
人数
5人
6人
30人
最大数
livs share
ライブシェアー
やり方
使い方
【ruby on rails】formにおいて、text_areaに入力した改行をそのまま表示する方法

text_areaで入力された文章を

<p><%= @user.comment %></p>

みたいな感じで表示されたら、改行が表現されなかったので、調べました。

 

どうやらsimple_formatなるメソッドを使えばいいようなので

<%= simple_format(@user.comment) %>

に変更。
Amazon WorkSpaces の Windows10 に AWS CLIをインストールする際、エラーになるときの対応

## 公式サイトに記載している通りにインストールします
公式サイト
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/awscli-install-windows.html

☆インストールするAmazon WorkSpaces 
![w01.jpg](https://qiita-image-store.s3.amazonaws.com/0/153317/864ee64a-6a19-c0b5-4c6e-20a332be18ed.jpeg)


☆Windows（64 ビット）用 の AWS CLI MSI インストーラのダウンロード・・・
![111.jpg](https://qiita-image-store.s3.amazonaws.com/0/153317/85b89147-ff64-4549-4d37-5b2bd67eb961.jpeg)


★エラー発生しインストールできない!
![AWS_CLI-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/153317/8d103ccf-58db-0eec-bfc4-e8f0719ed18e.jpeg)


☆AWS CLI セットアップファイルのダウンロード を選択しインストール
![OK.jpg](https://qiita-image-store.s3.amazonaws.com/0/153317/0432b46f-375c-ea63-5fb9-53fc934379ec.jpeg)

☆インストールできたぁぁぁぁ！！！
あとはドキュメント通りにすすめて完了しました。

◎よく見るとインストールエラーになったインストーラのところに注記がありました
注記
AWS CLI の MSI インストーラは Windows Server 2008 (バージョン 6.0.6002) では
機能しません。このバージョンの Windows にインストールするには、pip を使用します。
【Laravel】Route Model Binding のカスタムロジックをクラスに切り出す

## 前提

Laravel ではルーティングパラメータから Model を bind させることができる。

```php:RouteServiceProvider
public function boot()
{
    parent::boot();

    // ルーティングで {user} を指定すると下記コールバックの $userName に渡され
    // その戻り値を Controller の引数に渡すことができる
    Route::bind('user', function ($userName) {
        return resolve(MyApp\Domain\Repositories\UserRepository::class)->findByName($userName) ?? abort(404);
    });
}
```

詳しくは [公式ドキュメント（Routing # Explicit Binding）](https://laravel.com/docs/5.6/routing#explicit-binding) の "Customizing The Resolution Logic" を参照。

しかし、 bind のためのロジックは ServiceProvier の関心事ではなく、そのコードがここに出てくるのはあまりよろしくない。

## `Route::bind()` の中身を見てみると

実は `Route::bind()` の第2引数には callback だけでなく文字列を渡すことができる。

過程は省略するが`Route::bind()`の第2引数に文字列を渡した場合、以下のメソッドの引数 `$binding` となる。

https://github.com/laravel/framework/blob/5.6/src/Illuminate/Routing/RouteBinding.php#L34

```php:Illuminate\Routing\RouteBinding::createClassBindig
    protected static function createClassBinding($container, $binding)
    {
        return function ($value, $route) use ($container, $binding) {
            // If the binding has an @ sign, we will assume it's being used to delimit
            // the class name from the bind method name. This allows for bindings
            // to run multiple bind methods in a single class for convenience.
            list($class, $method) = Str::parseCallback($binding, 'bind');

            $callable = [$container->make($class), $method];

            return call_user_func($callable, $value, $route);
        };
    }
```

`bind()` というメソッドを持ったクラス名、あるいはソース中のコメントにある通り`クラス名@メソッド名`を指定すれば、bind のためのロジックを指定することができる。

## bind のためのロジックを別のクラスに切り出す

上記より、次のようなクラスを作成すれば、

```php:MyApp\Application\Routing\Binders\User
namespace MyApp\Application\Routing\Binders;

use MyApp\Domain\Repositories\UserRepository;

class User
{
    protected $repository;

    public function __construct(UserRepository $repository)
    {
        $this->repository = $repository;
    }

    public function bind($userName)
    {
        return $this->repository->findByName($userName) ?? abort(404);
    }
}
```

RouteServiceProvider 側では次のようにして使うことができる。

```php:RouteServiceProvider
public function boot()
{
    parent::boot();

    Route::bind('user', MyApp\Application\Routing\Binders\User::class);
}
```

これで、ServiceProvider の関心事の外である「bind のためのロジック」をカプセル化することができる。