OmniAICreator/Qiita-1.07M huggingface dataset:
IDaaS利用時におけるV字モデル

## 経緯
「認証基盤が欲しい」と顧客から話がありました。
近年ではIDaaSと呼ばれるクラウドサービスがあり、
自分でサーバーを用意したり、アプリケーションを開発しなくてもよくなりました。

では、IDaaSを利用してシステムを構築する場合、
"何"をして品質を担保すればよいのでしょうか？

## 考えてみた
### V字モデルを利用してみる
ウォーターフォール開発でよく利用されるV字モデルで考えてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172015/1c860f8e-4cb9-a6e0-921d-f2fabd884d98.png)
※[参考:https://webrage.jp/techblog/v_shaped_mode/](https://webrage.jp/techblog/v_shaped_mode/)

自分で認証基盤アプリを開発するのと比べて大きく違うところは、
コーディングするか否かです。

IDaaSでは、管理画面にアクセスし"設定"を行います。
これが通常の開発時の"コーディング"にあたるものだと思います。

なので、V字モデルはこうなるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172015/92e50b63-2c3f-d13d-7b7d-2cbb2986c49a.png)

ここに各工程でやるべきことのサンプルを書いてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172015/0eb0b30e-fd15-2781-8f18-11b294c40f31.png)

各テスト工程でなにをすべきか少しみえてきたでしょうか？
同じ悩みを抱える人に伝わればと思います。

本文書は随時更新します。
大学のゲーム制作サークルにおけるSiv3D普及度調査

チルゴロウです。Siv3Dアドベントカレンダーに3年ぶりに参戦します。
10日目の記事は、Siv3DおよびOpenSiv3Dを採用している、大学のゲーム制作サークルがどれだけあるかを紹介します。

なぜ大学サークルかというと、チルゴロウが大学の学園祭で毎年ゲーム制作サークルの情報収集をしており、自分にとっての専門分野だからです。
なお、作品ひとつひとつの詳細まで紹介することはできないのでご了承ください。

#Siv3Dをよく採用しているサークル

##1、[早稲田コンピュータエンタテインメント(WCE)](https://wce.jp/)
ここがSiv3D発祥のサークル。Siv3Dの総本山。Siv3D開発者Ryo Suzuki氏が所属していた。
Ryo氏が現役部員の頃はSiv3D作品がほとんどを占めていた。現在では他のゲームエンジンを使う作品も増えたが、Siv3Dをメインに使用することに変わりはない。
OpenSiv3Dを使用した作品も制作されていて、徐々にOpenSiv3Dに転換する動きもみられる。
ただ、サークルの活気は以前よりも落ち込んでるので、今後の活動が少し心配。早稲田にはもっと大きくて強いゲーム制作サークルがあるので、そちらの方に新入部員が流れてしまい競り負けてしまったのかもしれない。

##2、[千葉大学電子計算機研究会(CCS)](https://densanken.com/)
毎年コミックマーケットで部員の作ったゲームを作品集として出している。
元々DXライブラリ主体のサークルだったためSiv3Dの採用率は全体の1~2割程度で決して多くはないが、好んで使う部員が一定数いる。
CCSの最大の特徴は、強烈なネタを仕込んだミニゲームが一定数含まれていることが挙げられる。その時ネットで流行したものを題材にしたり、中には実写画像を切り抜いて素材として使ってしまうくらい。(ex. 腕の実写画像をお湯の中に突っ込んで、おでんを掴むゲーム。どうしてそのような発想に至るのか)
Siv3D作品でその強烈ネタ作品を作りに行ったこともある。
その反面で大学サークルとしては非常にクオリティ高く仕上がった作品も多数輩出しているので、非常に強いサークルだ。

##3、[東大マイコンクラブ(UTMC)](http://www.komaba.utmc.or.jp/)
ゲーム制作専門というより、プログラミング全般をゆるーく活動しているサークル。
2014年ころまではC#のMicrosoft XNAをメインに採用していた。しかしXNAのサービスが終了してからは制作ツールがバラバラになり部の規模も縮小してしまった。東大には本気でゲームを制作する最強サークルが別にあり、そちらに部員が流れ苦戦している。
現在ではグラフィッカーが1人もいない状態に陥ってしまい、画像素材ではなく基本図形だけでゲームを制作する独特なスタイルを確立した。
Siv3Dは基本図形の描画が充実しており、UTMCの部員にとっても扱いやすいツールであると考えられる。

##4、[名古屋工業大学コンピュータ倶楽部(NITMic)](http://nitmic.club.nitech.ac.jp/)
Siv3DとUnityをメインに扱うサークル。使用率は半々くらいで、Siv3Dをメインに使うサークルは全国的にも珍しい。
プログラマーだけではなくグラフィックとサウンドの専門部員も所属しており、1チーム3人体制。どの部員もスキルが高く、とても良い制作環境が整っている。
愛知県の県民性なのか、複数人で対戦するゲームの比率が高い。

##5、[秋田大学プログラミングサークルTNP](http://akitatnp.wp.xdomain.jp/)
秋田県で活動するサークル。
使用ツールはバラバラ。DXライブラリやUnity、中にはRPGツクールでゲームを作るひともいる。
2018年ころからSiv3Dの採用率が急に上がり、2019年夏コミの作品集には、Siv3D製の起動ランチャーとOpenSiv3D製の簡易「スマートボール」が収録された。

##その他のサークル
- [中央大学情報工学研究部](https://www.chuo-u.ac.jp/activities/culture/culture_circle/culture92/)
- [芝浦工業大学デジクリ](https://digicre.net/)
- [埼玉大学・SGP(Saitama Game Production)](https://saitamasgp.wixsite.com/sgp-homepage)
- [電気通信大学X680x0同好会](https://www.x68uec.org/)

等のサークルでもSiv3Dが使用されたことがあります。
そのとき入った部員の中にSiv3D使いがいて、Siv3Dで作品制作したからだと思われます。
使用は一時的で、後輩部員に引き継がれない場合が多い。
チルゴロウもかつては東京工科大学の[クリエイティブスタッフ](http://www.creative-staff.com/projects/CreativeStaff)に所属していました。ある時Siv3Dを知って、後輩部員にSiv3Dを広めようと試みたことがあるが、失敗に終わった。

#Siv3Dを導入しない大学サークル
##サークルの伝統
多くの場合、これだと思います。
DXライブラリをメインに使うサークルは、1年部員にゲーム作りを教える時も当然DXライブラリで教える。Unityが登場してからは一部のサークルがUnityメインに移行したが、Siv3Dが登場するのはよっぽど強いSiv3D愛好家が入部でもしない限りはないだろう。もし入部したとしても、チルゴロウが普及活動に失敗したようにSiv3Dを定着させることは難しい。
中には宗教的にSiv3Dを拒むサークルもあるらしい？

##Siv3Dが完成していない
旧版Siv3Dは2Dゲームエディタとしては実用的な段階まで完成した。しかし、一部未実装項目を残したままOpenSiv3Dへ移行してしまい、そのOpenSiv3Dも完成までほど遠い段階。完成が急がれるも作者のRyo氏の行動力に限界がある。
まだ、Siv3Dが日の目を見るのは早いのかもしれない。

#最後に
今回の記事はまったくコードを書かない記事だったので、つまらないものだったかもしれない。
でも、最新規格のC++を積極的に取り入れるSiv3Dが普及してくれることを望んでいます。
みんな、Siv3Dつかおうね。![Siv3D_2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100088/f3ca19e5-a80f-546c-7092-f12099a7e839.png)
Gutenberg/Blockエディタで困ってることメモ

## ACFのリピートフィールドがデータが入っていても表示されない

[WordPress5\.0\-Gutenberg\(グーテンベルグ\)に更新したらカスタムフィールド\(ACF\)が出現しなくなる問題の解決方法](https://blackpigtail.com/web-design/2054)を真似して、一度Classicエディタにした後位置を移動させて戻したら直った

## カテゴリ・カスタムタクソノミーにAdjust Admin Categoriesが効かない

カテゴリを移動させない、必須にする、択一（ラジオボタン）にする、親を選択させないができた[Adjust Admin Categories](https://ja.wordpress.org/plugins/adjust-admin-categories/)ですが、Gutenberg/Blockエディタでは使えない・・・
無理やりjsで修正するしかなさそう。
Splunk Add-on for Amazon Web ServicesがSplunk Cloudのトライアル版で利用できなくなっちゃったようなので代替策メモ

# TL;DR

背景はこんな感じ

- 顧客のSplunkから自社AWSリソースへ接続する必要がある
- 接続方法を案内する必要があるため、Splunkのトライアル版で調査・テストを行う
- Splunk Cloudのトライアル版にSplunk Add-on for Amazon Web ServicesをInstallして作業しようとしたら、Installできなくなっていた
    - Home > Find More Appsから検索してもAdd-on自体が見つからない
    - 2019年9月時点では^でInstallできていた

そんなわけで代わりにSplunk Enterpriseのトライアル版を使用したのでその流れメモ


# Splunk EnterpriseにSplunk Add-on for Amazon Web ServicesをInstallするまで

## トライアルアカウント(A)を作っておく

https://www.splunk.com/ja_jp/cloud/aws-solutions.html
「無料トライアル」からどうぞ

## Splunk Enterprise in Dockerをセットアップする

https://hub.docker.com/r/splunk/splunk/https://www.splunk.com/ja_jp/cloud/aws-solutions.html
のQuickstartにある通り、imageをpullして起動しましょう。

\<password\>は適当に置き換えます

```
docker pull splunk/splunk:latest
docker run -d -p 8000:8000 -e "SPLUNK_START_ARGS=--accept-license" -e "SPLUNK_PASSWORD=<password>" --name splunk splunk/splunk:latest
```

imageが起動し終えた頃合いに、http://localhost:8000 にあるGUIからログインします。
admin:さっき設定した\<passwor>でログインできる。

## Splunk Add-on for Amazon Web ServicesをInstallする

1. splunkbaseからAdd-onをダウンロードしておく(B)。今回はtgzをダウンロードしました。
https://splunkbase.splunk.com/app/1876/
2. ローカルのSplunk EnterpriseのGUIの下記から、(B)をインストール
    * Home > ⚙ > Install app from file
        * 途中、SplunkにSign upしたトライアルアカウント(A)でのログインを求められます。
3. Home画面(左上のSplunk Enterpriseアイコンをクリックして遷移できる)に「Splunk Add-on for Amazon Web Services」があれば目的達成

お疲れ様でした。
【AWS×SORACOM×Salesforce】IoTデバイスで顧客満足度100％を実現した話

会社のお客さまにIoTデバイスを配布して、100％の顧客満足度を達成したというお話を書きます。


# 今日の主役
[SORACOM LTE-M Button for Enterprise](https://soracom.jp/products/gadgets/enterprise_button/)
![products_soracom-lte-button-enterprise_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167339/3fc0393f-3f8e-bc31-8f49-03b3d14f275f.jpeg)

製品説明（HPから抜粋）
> SORACOM LTE-M Button for Enterprise はIoT SIM(plan-KM1)内蔵のボタンデバイスです。
plan-KM1による LTE-M 通信を使用し、乾電池(交換可能)で駆動します。
SORACOM Beam,SORACOM Funnel,SORACOM Harvestを使用することができます。

このIoTボタンはソラコム社から販売されていて、クリックするとソラコムのサーバー経由でAWSなりAzureなりにリクエストを飛ばすことができるというものです。
私は別にソラコム社の回し者はないですが、今回はこれを業務（サービス）で利用してみたよ、というお話です。

# 何に使おう
お客さまにお配りして、弊社と連絡したいときにクリックしていただくという形にしました。

# つ…つかえるのか？？
業務での使用のため、いくつか懸念点はありました。

1. そもそもボタン押したらちゃんとリクエストが飛ぶのか
2. どのリクエストがどのボタンから送信されたものなのか判別できるのか
3. （乾電池で動くので）電池切れたらどうする？
4. ボタンと社内システムをどう連携させる？

色々検証してみたので、さっと見ていきます。

# 懸念1.そもそもボタン押したらちゃんとリクエストが飛ぶのか
（いちおう）大丈夫でした。
ボタンの表面にLEDランプがあって、

- クリック→リクエスト送信完了→緑のランプ点灯
- クリック→リクエスト送信失敗→赤のランプ点灯

となります。
ただ、ボタンを押してから緑ランプ点灯するまでに５秒くらいのラグがあって、その間（ドキドキしながら）見守らないといけないので、若干めんどくさくはあります。

# 懸念2. どのリクエストがどのボタンから送信されたものなのか判別できるのか
各ボタンからのリクエストにはIMSI（端末識別番号）が含まれているので、これで突合できます。
どのボタン（IMSI）をどの顧客に渡したかの紐付けは、社内システム（Salesforce）側に持たせました。

# 懸念3. （乾電池で動くので）電池切れたらどうする？
電池が切れたらボタンのランプがつかないので当然わかるけど、
お客さまに渡す以上、そこはケアしたいですよね。
しらべたらリクエストのJSONには、「batteryLevel（バッテリーレベル）」というのがあり、これで残量をキャッチできるようです。（ちなみに値は0.25 / 0.5 / 0.75 / 1.0の4つで若干大味）
リクエストが来たことを社内メール通知するときに、この値も含めれると、「もうそろそろバッテリー切れそうですよ」という連絡もできるようになります。

# 懸念4. ボタンと社内システムをどう連携させる？
ここからが本題です。
アーキテクチャはこんな感じにしました。
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167339/c09a1b7c-5afe-6f83-fe88-23fc5ca67f63.png)

ボタンクリックしたときにどのクラウドサービスへ接続するかは、「ソラコム管理コンソール」というソラコム側の設定から行います。
今回はAWS IoTに接続させ、さらにlambdaで、社内システム（Salesforce）とコネクションします。
Salesforceでは、リクエスト受信するとその履歴を残しつつ、顧客毎の営業担当をしらべ、メール通知する寸法です。

# ボタンとAWSを連携
詳細は[公式ドキュメント](https://dev.soracom.io/jp/design_patterns/soracom_aws/#aws2)に譲りますが、SORACOM Funnel + AWS IoT Core パターンで連携させます。
SORACOM Funnelは、ボタンリクエストを任意のクラウドサービスに転送する設定が楽にできるよ、というもので、一回設定を作成すれば他のボタンでも使い回せるので、大量にボタンを設定するときには大変便利でした（ここはポイントたかめ）

# 会社のSalesforceとボタンを連携
AWS IoTからLambdaへ飛ばし、LambdaからSalesforceへ送信します。
認証は何でもいいと思いますが、今回は普通にOAuth 2.0 JWT べアラートークンフローを使いました。
（CF：https://help.salesforce.com/articleView?id=remoteaccess_oauth_jwt_flow.htm&type=5）
ボタンリクエストからIMSIを抜き出して、Lambdaから送信するリクエストに転記しておけば、後ほどIMSIからボタン名を抜き出すことができます。

# Salesforceでリクエスト受信履歴作成＆メール通知
AWSからのリクエストは、「[RestResource アノテーション](https://developer.salesforce.com/docs/atlas.ja-jp.apexcode.meta/apexcode/apex_classes_annotation_rest_resource.htm)」をつけたApexクラスで受信します。
受信さえできればコッチのもので、Apexクラスではレコード作成やメール送信などはだいたいヨロシクできます。

# 実際、お客さまからの反応はどうだったのか？
それなりの数の顧客にボタンを配りましたが、反応は上々でした。
「このボタン、どうやって使うの？」みたいなことを言われることを覚悟していたんですが、お叱り系の言葉は一つもなかったのが驚きでした。
「距離が近くなったと感じる」「電話しなくて便利」みたいな声ばかりだったので、やってよかったかなという感触。
「作っておわり」のエンジニアではなく、その後の顧客体験まで意識して、プロダクトを作っていきたいですね。
VPCエンドポイント（インターフェイス型）でハマった話

# 経緯

クローズサブネット（インターネット接続性なし）で、[セッションマネージャ](https://dev.classmethod.jp/cloud/aws/ssm-session-manager-release/)の接続を検証したくて、[インターフェイスエンドポイント](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpce-interface.html)を作った。

クローズサブネットからはセッションマネージャで接続できるようになったのだが、
同じVPC内のパブリックサブネットにあるインスタンスに、セッションマネージャで接続できなくなった。（元々接続できていたのに）

パブリックサブネットには、インターフェイスエンドポイントはアタッチしていないし、NW的には何も変わっていないはずなのに…と思っていたのだが。。
![201911_ssm構成図-1 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541822/0d5ef340-aeba-5244-57ed-1689d87d3846.png)

# 結論

同一VPC内はすべてインターフェイスエンドポイントを見に行く[^1]。
パブリックサブネットにはアタッチしてないから、変わらないものと誤認していた。
そして、エンドポイントのセキュリティグループで許可してなかったので接続できなくなった。

インターフェイスエンドポイントを使用すると起こる事であって、SSMに限ったことではない。
![201911_ssm構成図-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/541822/17cabcc7-8cd6-eefc-aebc-fe6af1b04f06.png)

# 調査したこと

- 対象インスタンスにSSH接続
- SSM Agentのログを調べると、インターフェイスエンドポイントに接続しにいって失敗している模様。  
  `journalctl -u amazon-ssm-agent | less`
  
  ```bash
  amazon-ssm-agent[2391]: caused by: Post https://ssm.ap-northeast-1.amazonaws.com/: dial tcp 172.30.4.52:443: i/o timeout
  amazon-ssm-agent[2391]: 2019-12-09 08:02:05 INFO [HealthCheck] increasing error count by 1
  amazon-ssm-agent[2391]: 2019-12-09 08:02:05 ERROR [HealthCheck] error when calling AWS APIs. error details - RequestError: send request failed
  amazon-ssm-agent[2391]: caused by: Post https://ssm.ap-northeast-1.amazonaws.com/: dial tcp 172.30.4.52:443: i/o timeout
  amazon-ssm-agent[2391]: 2019-12-09 08:02:05 INFO [HealthCheck] increasing error count by 1
  ```

# なぜか

エンドポイントの「プライベートDNS名」を有効化すると、デフォルトのDNS 名には、インターフェイスエンドポイントのIPが紐付けられる。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpce-interface.html#vpce-private-dns

DNSはVPC毎[^2]なので、サブネットに関わらず、インターフェイスエンドポイントを見に行く。

# 余談

- DNSがVPC毎[^2]なのは知っていたので、考えてみれば分かる事ではある。
- しかし、インターフェイスエンドポイントの[ドキュメント](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpce-interface.html)には、「インターフェイスエンドポイントを使用する VPC 内のサブネットを選択します」と書かれていて、実態と記述の印象が異なる。
- これは社内の検証環境なので全然影響は無いのだが、既存通信に影響が出て結構危ない。  
  感覚的には、影響範囲はサブネットであるように感じたが、実際はVPC全体である。
- ちなみに、プライベートDNS名を有効化した上で、サブネットをどこも選択しないと、  
  デフォルトDNS名で名前解決したとき、IPが返ってこなくなるのでどこからも接続できなくなる。  

  ```bash
  $ nslookup  ssm.ap-northeast-1.amazonaws.com
  Server:         172.30.0.2
  Address:        172.30.0.2#53
  
  Non-authoritative answer:
  *** Can't find ssm.ap-northeast-1.amazonaws.com: No answer
  ```

- 少なくとも、ドキュメントの「使用するサブネット」を選択しますという表現は良くないと思う。  
  また、サブネットはAZ毎に1つしか選べないので、そこでも違和感がある。
- マルチAZなら2つのAZに設定しよう。
- 「仕組みを考えれば理解はできるけど、誤解を招きませんか？」とサポートに言ってみたら、フィードバックして頂けるとのこと。

[^1]: 「プライベートDNS名を有効にした上で、デフォルトのDNS 名を使用してアクセスした場合」は、なのでこの表現は正確ではないが、簡潔に述べたかったのでこう書いている。
[^2]: この表現はニュアンス的には伝わったとしても正確じゃない気がするが、なんと表現するのが正確なのか不明。
僕の大好きなDynamoDBの特徴

#DynamoDBの特徴
##どんなDB?
AWS内のNoSQLなDBです．
大量のデータを高速でDBに蓄積．
検索や取り出しも超高速．

まずは非SQLを私の言葉ですが簡単に説明します
##非SQL

コレクションの中にドキュメントで格納します．
要はテーブルにカラムとフィールドを設定する感じ．
(MongoDBならコレクション，ドキュメントと言いますが，DynamoはテーブルでもコレクションでもどっちでもOKみたいです)

JSON形式で格納できて，自由自在に操れる．
慣れれば手足です．

例えば，　「user」というコレクションを作ったとしましょう．
そうすると，
{name : "茂木" , age : 23 , sex : man}
のようなオブジェクトで表せます．

パラメータを足すことも簡単です．
樹形図も出来ます．

僕はSQLよりもこっちの方が好きだなあ．．．

##容量
データ容量に制限はありません．

##整合成モデル
DynamoDBは3つのアベイラビリティーゾーン間でデータの書き込みをしてます．
それにより高速レスポンスを実現しています．

注意は，3つ中2つに読み込みをしたら
「書き込み完了やで」と非同期的な処理を行うことです．
デフォだと書き込み後に古いデータがresされる可能性がありますので，
オプションで「強力な生合成のある読み込み」にすることで，その心配はなくなります．
しかし，その場合費用がかかります．

普通のappならオプション設定する必要はないですが，すぐに反映させたい場合には設定しましょう．
（僕ならコードでcallback使いますが）


##作り方
超簡単です．
![スクリーンショット 2019-12-10 17.13.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/543591/b4fedafc-9c5e-0407-78fd-6ece29a8e0c0.png)

キーもあとで追加出来ますし，とりあえず作るのは速攻出来ます．

テーブル名と変数入れるだけ．
RDSよりも楽チンだ．
OracleAPEX ピポット表示での名称をみや

# 概要
Oracle APEX の「対話モード・レポート」のピポット機能を使い、
複数列を行に指定したときの見た目がイマイチだったので、その表示内容をCSSを使って変えたときのメモ。

# 環境
* Oracle Database 12c
* Oracle APEX 18.2

# やりたいこと
* 以下の画像のような、グループごとの目標・実績の集計値をピポットを使って表示したとき、
画像内の赤枠の部分の文字を表示しないようにしたかった。
![ape.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/1d5ca531-ba0d-352a-f53c-0ebf667c11a5.png)

# 対応内容
* 文字の色を透明にする以下のCSSクラスをページ内で定義する
![apex_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/da8f6c5d-8014-0b1d-7ed6-a639a0288e51.png)

```css
.text-display-none {
  color: transparent;
}
```

* 先ほど定義したクラスをデータとして持つよう、抽出するクエリに列を追加する
  * 文字の色を透明にする行のみ

* 文字の表示を変更したい列の書式で先ほど追加した列をclassとして設定するよう以下のように記述する
![apex_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/740619e5-3f57-2580-fced-fdd4418dd92c.png)

```html
<span class="#STYLE#">#LABEL#</span>
```

* 無事文字が消え、完成。見やすい！
![apex_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/4c72fb0f-a5e3-fe5f-9c60-a9d6211b1d7f.png)


# おまけ
今回のサンプルデータを作った時のクエリとピポットでの設定を載せておきます。

* ピポット設定
![apex_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/8850b760-9939-469d-79aa-79053a12acfe.png)

* サンプルデータクエリ

```sql
SELECT 
  BASE.LABEL,
  BASE.AGG_CATEGORY,
  BASE.YM_DATE,
  DECODE(VAL_1.VAL, NULL, VAL_2.VAL, VAL_1.VAL) VAL,
  STYLE.STYLE STYLE
FROM 
  (
    SELECT
      *
    FROM (
      SELECT 
        CASE ROWNUM
          WHEN 1 THEN 'グループ1'
          WHEN 2 THEN 'グループ2'
          WHEN 3 THEN 'グループ3'
        END LABEL
      FROM DUAL CONNECT BY ROWNUM <= 3
    )
    CROSS JOIN (
      SELECT
        *
      FROM (
        SELECT 
          CASE ROWNUM
            WHEN 1 THEN '1.目標'
            WHEN 2 THEN '2.実績'
            WHEN 3 THEN '3.達成率（%）'
          END AGG_CATEGORY
        FROM DUAL CONNECT BY ROWNUM <= 3
      )
    )
    CROSS JOIN (
      SELECT
        TO_CHAR(TRUNC(ADD_MONTHS(A.YM_FROM, ROWNUM - 1),'MM'),'YYYYMM') AS YM_DATE
      FROM
      (
        SELECT
          TRUNC(TO_DATE('201801', 'YYYYMM'),'MM') AS YM_FROM,
          TRUNC(TO_DATE('201812', 'YYYYMM'),'MM') AS YM_TO
        FROM DUAL
      ) A
      CONNECT BY LEVEL <= MONTHS_BETWEEN (A.YM_TO , A.YM_FROM) + 1
    )
  ) BASE
  LEFT JOIN (
    SELECT
      1000000 VAL
    FROM DUAL
  ) VAL_1
  ON BASE.AGG_CATEGORY IN ('1.目標','2.実績')
  LEFT JOIN (
    SELECT
      100 VAL
    FROM DUAL
  ) VAL_2
  ON BASE.AGG_CATEGORY IN ('3.達成率（%）')
  LEFT JOIN (
    SELECT
      'text-display-none' STYLE
    FROM DUAL
  ) STYLE
  ON BASE.AGG_CATEGORY IN ('2.実績','3.達成率（%）')
```

# まとめ
ピポット後のソート順には依存してしまうため、使える場面は限られてしまうと思うが、
何とか表示を変えることができた。
Windowsでエクスプローラ上から複数のフォルダを一括で生成する

プロンプトを使わずにpowershellを使います。
但し、エクスプローラのアドレスバーを使うので、かなり気軽に出来るかと思います。

作成したいフォルダ名をテキストファイルに記載する（ここでは、list.txt）

作成したいフォルダのアドレスバーに入力

```text:アドレスバー
powershell foreach ($filename in Get-Content list.txt){mkdir $filename}
```

入力後にenterを押下すると、テキストに記載された名称のフォルダが生成されます。

ホスト名ごとにログを分ける時とか便利ですね。

複数作る必要がなくて一つだけフォルダを作る時は下記のコマンドでいけます。

```text:アドレスバー
powershell mkdir フォルダ名
```
Laravel　seedingでDBへ初期データを自動投入する

マイグレーションファイルを作成し、マイグレーション実行しDBにテーブルがあることを確認した後、
次にseederを使って初期データを追加する作業に移ります。

このseederというものを使えば簡単にDBへ初期データを入れることができます。

>アジェンダ
        1.Seedファイルの生成
        2.シーダークラスの定義
        3.シーダクラスをコールする為の設定
        4.オートローダ再生成
        5.シーディング実行
        6.マイグレーションとシーディングでデータベースを再構築する

##Seedファイルの生成

まず初めに投入するデータを記述するseedファイルを生成します。
その前に公式にならって、シーダクラス名を決めます。
"App"TableSeederのようにTableSeederが後に続いたシーダクラス名にします。

シーダー生成のartisanコマンド

```
php artisan make:seeder AppTableSeeder
```

そうすると
laravel/database/seeds 配下に AppTableSeeder.phpが生成されます。 

##シーダークラスの定義
laravel/database/seeds/AppTableSeeder.php

run()メソッドにデータを投入する記述を行う。

```<?php

use Illuminate\Database\Seeder;

class AppTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
       $param = [
            'name' => Str::random(10),
            'email' => Str::random(10).'@yamada.jp',
            'password' => bcrypt('password'),
            'birthday' => '2000/01/01',
        ];
        DB::table('users')->updateOrInsert($param);

        $param = [
            'name' => Str::random(10),
            'email' =>  Str::random(10).'@yamada.jp',
            'password' => bcrypt('password'),
            'birthday' => '2000/01/01',
        ];
        DB::table('users')->updateOrInsert($param);
       
        $param = [
            'name' => Str::random(10),
            'email' =>  Str::random(10).'@yamada.jp',
            'password' => bcrypt('password'),
            'birthday' => '2000/01/01',
        ];
        DB::table('users')->updateOrInsert($param);
 　　　
    }
}
```

##シーダークラスをコールするための設定
シーダクラスの定義が完了したら、このシーダークラスをシーディング実行時にコールできるようにします。

laravel/database/seeds/DatabaseSeeder.php

```<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $this->call([
          AppTableSeeder::class,
        ]);
    }
}
```

##オートローダ再生成

composerのオートローダーを再生成します。

```
composer dump-autoload
```

##シーディング実行

それでは早速シーディングの実行をしていきます。
Laravelのルートディレクトリに移動し、コマンドを叩きます。

```
php artisan db:seed
```

実行が完了したら、実際にmysqlでデータを確認してみます。


ここまででシーダクラスに手動で情報をインサートし、シーディングを行うことができました。


###参考文献
PHPフレームワーク　Laravel入門
Laravelでのマイグレーションファイル作成からマイグレーション実行、DBの確認までを行う

今回この記事はLaravelでWEBサービスを開発するにあたって必要になってくる
DB周りのことについてわからないことだらけで解説されているソースもあったのですが
少し理解するのに時間がかかるのでできるだけ簡潔に一連の流れで開発を行えるように
書いていきたいと思います。

>Laravelのmigration（マイグレーション）機能とスキーマビルダを使ってデータベースのテーブルやカラムを管理する一連の流れを行います
・ルートディレクトリはlaravel
>>アジェンダ
   1.開発環境
   2.マイグレーションについて
   3.データベース接続確認
   4.マイグレーションファイルの生成
   5.マイグレーションクラス実装
        a.スキーマビルダ
             b.カラムタイプ
   6.マイグレーション実行
   7.ロールバック



##DBの接続確認
自分自身こののちに行うマイグレーションを行うときに頻繁に
DBの接続エラーが出てしまいました。
その原因は.envファイルとconfig/database.phpとMysqlこの3つのユーザー名とパスワードが一致していなかったということでした。
大体のマイグレーションのエラーがこの接続エラーらしいので
これを押さえておけばこのコマンドでのエラーは大方防げるのではと思います。

まず.envファイル
####laravel/.env
```DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel :データベース名
DB_USERNAME=root　　：ユーザ名
DB_PASSWORD=root　　：パスワード`
```

####config/database.php
```
'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'engilio'),:データベース名
            'username' => env('DB_USERNAME', 'root'),   ：ユーザ名
            'password' => env('DB_PASSWORD', 'root'),   ：パスワード
```

このように両ファイルの設定を確実にMysqlのユーザー名、パスワードに設定します。
意外と忘れがちなのでこれで再確認できればいいかと思います。



##マイグレーションファイルの生成

```
php artisan make:migration create_[ここにテーブル名]_table  --create=[テーブル名]
```
このようにコマンドを打つことでマイグレーションファイルが作成されます。

これによってできたファイルは
laravel/database/migrationsのフォルダに入ります。

##マイグレーションクラスの実装

生成されたマイグレーションフォルダのエディターで開いてみます。


```<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTestTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tests', function (Blueprint $table) {
            $table->increments('id');
            $table->timestamps(); 
            →ここにカラムの修飾を行う
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tests');
    }
}
```


##マイグレーション実行

```
php artisan migrate
```
このコマンドでマイグレーション実行を行う

実行後、MysqlでDBを確認する

```
mysql -u root -p root;

mysql> show columns from [テーブル名];
```
Spring Bootでアプリ作成

現在SpringBootのアプリを作成中。
とりあえず環境構築して、アプリ起動のところまで行けたのでメモ。
個人用のメモ用にアウトプットします。

## STSのダウンロード
・Spring Bootの開発進めるために専用のエディターをインストールする。
　手順は以下を参照。
　https://qiita.com/andna0410/items/e9cc07c9e2e34a542245
~~・オプションでLombokをインストールする。
　手順は以下を参照。
　https://qiita.com/t-iguchi/items/a0c88df01b6a601afbed~~

## プロジェクト作成
●「ファイル」→「新規」→「その他」→「Spring Boot」→「Spring スターター・プロジェクト」
　<img width="428" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/8a15b01b-1a6a-c4f8-5daf-b2582729c6a6.png">

●プロジェクト名設定
　・「名前」：<font color="Blue">SpringApp1</font> →アプリの名前。
　・「グループ」：<font color="Blue">com.ex1</font> →ドメイン的な感じ？(ｘｘｘ.comみたいな),他のグループと被らないようにする。
　・「成果物」：<font color="Blue">SpringApp1</font> →これもアプリの名前。基本的には「名前」を入力すると自動的に入力される。
　・「パッケージ」：<font color="Blue">com.ex1</font> →そのままパッケージ名。「グループ」と同じでいいと思う。
　・以下の画像のようになっていれば「次へ」を押す。
　<img width="428" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/2f936d50-4cbd-e85e-619e-db8d4bdce9db.png">
●依存関係の設定
　・「使用可能：」ってところにキーワード入れて何を使うか選定する。
　・「Spring Boot DevTools」→コードを編集したら自動的にサーバの再起動をしてくれる。
　~~・「Lombok」→getterとsetterを自動生成してくれる。~~
　・「JDBC API」→データベースドライバ。
　・「H2 Database」→データベース（本番では使わない）
　・「Thymeleaf」→とは、 SpringBoot 標準 で 使わ れる HTML の テンプレート エンジン。
　・「Spring Web」→Spring MVCとSpring Bootが使えるようになる。
　・以下の画像のようになれば「完了」を押す。
　<img width="428" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/35a1cffe-6e59-5ab0-50cc-473c8c7b787a.png">
●コントローラとビューを作成する
　・「src/main/<font color="Blue">java</font>」に「com.ex1」が出来ているので**その配下に「Controller」フォルダーを作成。**
　・その配下に、**「UserController.java」を作成。**
　・「src/main/<font color="Blue">resorces</font>」の**「templates」配下に「user.html」を作成。**

●作成したファイルの内容を編集する。

```java:user.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"></meta>
    <title>User</title>
</head>
<body>
    <h1>User Search</h1>
<body>
</html>

```

```java:UserController.java

package com.ex1.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class UserController {
	@GetMapping("/")
    public String getUser() {
        return "user";
    }
}

```

　・以下の画像のようになっていればOK。
　<img width="960" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/a355b02b-06e7-a71a-7a99-7e639063b0f9.png">

●プロジェクトを実行してアプリの起動確認をする。
　・「プロジェクト右クリック」→「実行」→「Spring Bootアプリケーション」
　<img width="590" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/1bea0753-8f7d-4c1b-ddb8-f4ce00993ca2.png">
　・するとコンソール画面に以下の様な表示が出力される。
　<img width="960" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/b67b5c2c-bea4-a0b1-10e6-365e42d2e2d7.png">
　・「http://localhost:8080/」にアクセスし以下の様な画面が出れば成功。
　<img width="484" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/420031/56dd9072-9a6b-b7a0-3551-fad2306e70b3.png">



いったんここまで。
次はPostメソッドと、DBからデータを持ってくるところまでやる。
【Django】「Table名 dose not exists」 とか 「django_content_type already exists」 を無理やり解決した 【TDD】

# 症状
タイトルのようなエラーが出た。
確かにテストコマンド実行時にテスト用のDBを作り直す仕様なので、テーブルないよって言われても、そらそうよと思う。
じゃあ実行時にテーブルつくればいいのか？
そう思ったけどORMでDB操作してるので、そもそもORMのところでテーブルないぞって怒られてるみたい。
んじゃあ最初っからテーブル作っておけばいいじゃん、と思ったのです。

# 対応方法・table名 dose not exists
テストに使うTable名を`test_table`とします。
テーブルがないといわれているのでつくってしまえばいい。

私はテーブルがたくさんあったのでPHPMyAdminでDBごとコピーしました。
これでテーブルはあるわけだから怒られるはずがないです。

テスト実行時に`-k`オプションを使えば、DBを消すことなくテストしてくれるので、このオプションは絶対につけましょう。
つけないとテスト用DBが消えちゃってせっかくコピーしたデータがなくなります。

こうした後に実行したら下のエラーに出会った。

# 対応方法・django_content_type already exists

django_content_type ってテーブル、もうあるよ。とのことです。
あって怒られるなら消せばいいのですよ。
と思ったのですが、このテーブル単体を(PHPMyAdminで)消そうとしても全然消えてくれません。
なので、テスト時にDjangoが勝手に作成するテーブルを一緒に全部消してみました。
消したリストを下に出します。

|テーブル名|
|:-:|
|auth_group|
|auth_group_permissions|
|auth_permission|
|auth_user|
|auth_user_groups|
|auth_user_user_permissions|
|django_admin_log|
|django_content_type|
|django_migrations|
|django_session|

以上です。
これで消えてくれました。

これで実行するとちゃんと動いてくれました。


# まとめと注意
テーブル消すだけでよかったので助かりました。
ファイル構造のせいなんじゃないかとかいろいろかんぐってました。

対応としてテストに利用するDBのテーブルをいじっていますが、くれぐれも本番DBを削除したりしないようにし気をつけましょう。つらい思いをします。はい。
NOREN 条件文の書き方！

NORENでの条件文の書き方についてまとめました。

●IF/Then/Else
 ・・・条件により分岐処理を行う。If文をネストさせることも可能。
　　　Ifの属性のなかで「exist」と「is」は同時に使用できない。

　例1．表示するコンテンツにサムネイル(画像)が登録されている場合のみ、サムネイル(画像)を表示する。
``
[[--ActionStart,row:*--]]
      [[--IfStart,exist:ArtImage--]]
          [[--ThenStart--]]
              <img src="[[--ArtImage--]]">
          [[--ThenEnd--]]
      [[--IfEnd--]]
[[--ActionEnd--]]
``
  例2.表示するコンテンツでアクションフィールド「check」の値が「yes」の場合、アクションフィールドの値を表示する。
``
[[--IfStart,is:check=yes--]]
      [[--ThenStart--]]
          [[--ArtFieldValue,field:check--]]
      [[--ThenEnd--]]
[[--IfEnd--]]
``
  例3.「kuma」というIDのアクションフィールドが登録されていない条件下において、変数「kuma」に格納されている値が「yes」の場合、変数の値を表示する。
``
[[--IfStart,is:kuma=yes--]]
        [[--ThenStart--]]
            [[--Write,name:kuma--]]
        [[--ThenEnd--]]
[[--IfEnd--]]
``

 例4.表示するコンテンツにサムネイル(画像)が登録されている場合サムネイル(画像)を表示し、サムネイル(画像)が登録されていない場合は「閉店ガラガラ」というテキストを表示する。
``
[[--ActionStart,row:*--]]
      [[--IfStart,exist:ArtImage--]]
          [[--ThenStart--]]
              <img src="[[--ArtImage--]]">
          [[--ThenEnd--]]
          [[--ElseStart--]]
              閉店ガラガラ
          [[--ElseEnd--]]
       [[--IfEnd--]]
[[--ActionEnd--]]
``
ワンタイムパスワード（暗証番号みたいなの）用の入力フォームを作ってみる

# 目的

iOS13になりinput type=numberの箇所のIME？がONとなっており

動きが悪くなったためフォームの見直しを行ったが、かなり苦戦したため残しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184107/94598dde-4f30-29af-66d3-5fc145820fed.png)
※こんなの

完全に正しく動くわけではないので、その後の入力チェック等は別途行ってください。

また、もっと簡単な方法があれば、教えていただけると嬉しいです。

## 前提

環境: Angularで書いてます
なんとなくですが、確認した対象ブラウザ: 
 Android: Chrome
 iPhone: Safari, Chrome
 WinPC: Chrome, Firefox, Edge, IE

## 結果

細々したコードなので、stackblitzのコードURLをおいておきます。

https://stackblitz.com/edit/angular-xfkmu7

## 補足

今回やったことはそのままStackblitzにあります。

需要があれば、詳細の説明記載します。
rails new　エラー　Catalina

Catalina 10.15.1にアップグレード後
rails newで妙ななエラーが出たので
その備忘録を書きます。

# エラー内容
エラーと言ってもアプリそのものは作れるうえに
アプリ作成は最初のうちは問題なかったです。

赤字だけ紹介するとこのような内容でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430767/e58abb23-03e8-3c4c-f2f5-23a7e9a6db67.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430767/7582c38c-9232-fd56-2f50-8b3353109851.png)

# 対応方法
やることは二つ
①xcodeのインストール
②ソフトウェアアップデート
この2点です。

## ①xcodeのインストール
私はひとまずコマンドからインストールしました。
app storeでも無料されてるので、気になる人は調べて下さい。

```bash:ターミナル
xcode-select --install
```

## ②ソフトウェアアップデート
Apple メニュー  から「システム環境設定」を選択し
「ソフトウェアアップデート」をクリックして、アップデートがないか確認します。
ある場合は、「今すぐアップデート」ボタンをクリックしてインストールしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430767/b84e134a-8796-4e28-9e7b-def3d40cdcd9.png)

## 反省点
今回の反省点は

1,うかつにアップグレードして手間がかかったこと
2,xcodeなどインストール必要ことについて調べることが遅れたこと
3,更新のチェックをし忘れたこと
ついでに
4,ターミナルのコードでうっかりスペースを入れてエラーを出したこと。

こんなところです。
webカメラの画像サイズ指定が中途半端になる

#webカメラをつかって動画をとりたい
pythonとopencvをつかったら取れる！と思ったので
適当なwebカメラかってつないでみたんだけど
カメラのスペック以下のサイズでしかimshowで表示されてない気がする。

#確認

```python:webcamtest.py
# -*- coding: utf-8 -*-
import cv2
camera = cv2.VideoCapture(0)					

#希望のセッティングにしてみる
camera.set(cv2.CAP_PROP_FPS,30);
camera.set(cv2.CAP_PROP_FRAME_WIDTH,1280);
camera.set(cv2.CAP_PROP_FRAME_HEIGHT,720);
 
while True:
	ret, frame = camera.read()         # フレームを取得
	cv2.imshow('camera', frame)        # フレームを画面に表示

	# キー操作で抜ける
	if cv2.waitKey(1) & 0xFF == ord('q'):
		break
 
camera.release()
cv2.destroyAllWindows()
```
##結果
とりあえずこれで表示はされるんだけど、
両端切れてるし、画像も粗い。多分640x480ぐらいじゃないかな
でもファイルのプロパティとしては1280x720になってる…

#Windows標準ではどうかな
ドライバが悪いのかな？とか、USBのポートが悪いのかな？とか考えて、
Windows10標準のカメラアプリで確認してみることにした。
これで希望のサイズになっていれば、悪いのはこっちのプログラムってこと。

##結果
きちんとでた。こっちのプログラムの問題だな。

#対策
DirectShowを使うモードでカメラを有効化する。

```python:webcamtest.py
camera = cv2.VideoCapture(0+cv2.CAP_DSHOW)	#ここを変更	
```


#おまけ

カメラの設定ダイアログを開く方法。
DirectShowモードになっているときに、↓のコードを実行するとダイアログが開く

```python
cv2.set(cv2.CAP_PROP_SETTINGS,0)
```
C++でCSVを１行ずつ読み取るクラス

UEC（電気通信大学）アドベントカレンダーの10日目の記事です。

# 概要
2年ほど前、[C++でCSVファイルを扱うためのクラスを自作し、Qiitaに掲載](https://qiita.com/takoyaki3/items/269060a916a66d9c411a)したのですが、現在も稀にストックされることがあるので、現在私が使っている、もう少し実用性を高めたバージョンも記します。

ライブラリを追加するのとかがめんどくさい時、簡易的な読み取りであれば、これで十分かと思います。
１行ずつ読み取るので、巨大なCSVファイルでも読み取ることができます。

## コード

```loadcsv.cpp
#include <string>
#include <vector>

using namespace std;

typedef vector<string> CellsTy;

CellsTy cells_split(char* line, char comma) {

	size_t len = strlen(line);
	line[len - 1] = comma;
	line[len] = '\0';
	int last = 0;

	CellsTy cells;
	string l;

	for (int i = 0; i < len; i++) {
		if (line[i] == '\r') continue;
		if (line[i] == comma) {
			cells.push_back(l);
			last = i;
			l.clear();
			continue;
		}
		l.push_back(line[i]);
	}
	return cells;
}
```

## 使い方
必要な標準ライブラリを読み込んだ後に、上記コードをペーストし、main関数のように1行ずつ読み取ります。
下の使用例は、``data.csv``というCSVを１行ずつ読み取り、各セルを出力するプログラムです。

```main.cpp
#include <string>
#include <vector>
#include <iostream>
#include <cstdio>

using namespace std;

typedef vector<string> CellsTy;

CellsTy cells_split(char* line, char comma) {

	size_t len = strlen(line);
	line[len - 1] = comma;
	line[len] = '\0';
	int last = 0;

	CellsTy cells;
	string l;

	for (int i = 0; i < len; i++) {
		if (line[i] == '\r') continue;
		if (line[i] == comma) {
			cells.push_back(l);
			last = i;
			l.clear();
			continue;
		}
		l.push_back(line[i]);
	}
	return cells;
}

const int MaxLine = 1024; // 読み取るファイルの１行あたりの最大文字数

int main() {
	FILE* fp = fopen("data.csv", "r");
	if (fp == NULL) return 1;
	while (!feof(fp)) {
		char line[MaxLine];
		fgets(line, MaxLine, fp);
		CellsTy cells = cells_split(line, ',');
		if (cells.size() == 0) continue;

		// セルの出力処理
		for (int i = 0; i < cells.size(); i++) {
			cout << cells[i] << "   ";
		}
		cout << endl;
	}
}
```

## 少し汎用性を持たせる

使用する型をtypedefで別途定義することで、汎用性を持たせました。wstringを使用する場合は、``typedef~``の行を変更してください。

```loadcsv.cpp
#include <string>
#include <vector>
#include <cstdio>

using namespace std;

typedef string cells_string;
typedef char cells_char;
typedef vector<cells_string> CellsTy;

CellsTy cells_split(cells_char* line, cells_char comma) {

	size_t len = strlen(line);
	line[len - 1] = comma;
	line[len] = '\0';
	int last = 0;

	CellsTy cells;
	cells_string l;

	for (int i = 0; i < len; i++) {
		if (line[i] == '\r') continue;
		if (line[i] == comma) {
			cells.push_back(l);
			last = i;
			l.clear();
			continue;
		}
		l.push_back(line[i]);
	}
	return cells;
}
```

## template関数にする

さらに、引数の型をtemplate化したバージョンです。
``char型``にも``wchar_t型``にも対応することができます。

```loadcsv.cpp
#include <string>
#include <vector>

using namespace std;

template <typename cell_char> vector<basic_string<cell_char>> cells_split(cell_char* line, cell_char comma) {

	size_t len = strlen(line);
	line[len - 1] = comma;
	line[len] = '\0';
	int last = 0;

	CellsTy cells;
	basic_string<cell_char> l;

	for (int i = 0; i < len; i++) {
		if (line[i] == '\r') continue;
		if (line[i] == comma) {
			cells.push_back(l);
			last = i;
			l.clear();
			continue;
		}
		l.push_back(line[i]);
	}
	return cells;
}
```

こうした方がよいという改善案や、挙動がおかしな点がありましたらコメントお願い致します。
ボルダリングの安定性をロボット工学で考えてみる


この記事は[東京大学航空宇宙工学科/専攻 Advent Calendar 2019](https://adventar.org/calendars/4086)の10日目の記事として書かれています。昨年の同カレンダーでは[イベントカメラの話](https://qiita.com/minomonter/items/6d71029f6c860da60740)という記事を書きました。なんか地味にリアクションが多くて嬉しい限りです。

# 今回の内容

最近ボルダリングにはったのですが、やっぱり安定性が重要なので力とかモーメントのつり合いを（定性的に？）考えることが多いです。まあつまり力学なわけです。

実は今すこしだけ留学してロボット工学を勉強しているのですが、ロボット工学で登場する力学がこれに近いことをしているような気がしたので、ボルダリングをロボット工学（実質力学だけど）で考えてみようと思います。

# ボルダリングとは
まあ皆さんボルダリングの壁くらいはみたことあると思いますが、下の画像のように壁についているホルダーを上手く使いながら壁を登るスポーツです。個人的には、上達っぷりが目に見えてわかること、周りの人とどう登るかを議論したりワイワイしたりしながら楽しむことができるのでハマっています。
実は筋力は（特に難しい課題でなければ）あまり必要では無く、それよりも**手足や重心をどう配置してどの方向に力を入れれば安定して登れるのか**という「力学的な安定性」を考えなければ上手く登ることができるができません（ボルダリング問題とここでは呼ぶことにします）。ちゃんと考えないと手足が滑ったり次のホルダーに手が届かなかったりしてうまく登れません。
![1565586537404_jb4bwk9vlgeuzzk2t0nb8j4h.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272738/ce06dc4b-ae8c-a0b9-2f1d-5c04c8208d6a.jpeg)

# ゼロモーメント点 (ZMP)
多分似ていると思われるのが、脚付きロボットの安定性の指標として用いられる**ゼロモーメント点(ZMP)**というものが近いかもしれません。

平面に立っている歩行ロボット（動物でも可）にはたらく重力と慣性力との合力が地面と交差する点がZMPです。航空力学でいう風圧中心的なやつですかね。慣性力を考慮しているあたりからも分かる通りロボットが動いている間の安定性も解析することができます。

![BC883D5B-BAA7-41E0-AC61-1640C8DB3B38.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272738/f77468c4-e089-a2c7-b239-4367570791dc.gif)

# ZMPでは不十分？
ZMPは、ロボットの接地面が水平なら良いのですが、実は水平ではなく**「滑り」を考慮しなければいけない場面では不十分**です。というのもZMPは摩擦が十分にあることを仮定していて、手足が滑るかどうかを判定することはできません。

ボルダリングでは、手足がホルダーから滑らないようにしっかりと垂直抗力をかける必要があります。経験者ならわかると思いますが（というか考えれば当たり前ですが）ホルダーの面に対してなるべく垂直に力をかけないとルートによってはすぐに滑ってしまいます。

ZMPは、手足のついたロボットや動物の安定性を数学的に扱えるという点でボルダリング問題に使えると思うのですが、滑りを考慮できないので拡張が必要そうです。

# CWCへ拡張
とある論文で [^1] Contact Wrench Cone (CWC)というものが提案されています。ロボットの安定性を「レンチ$\mathbf{w}=(f,\tau)^T \in \mathbb{R}^6$が特定の領域（=CWC）内に入っていること」という条件として書き下すことができます。$f,\tau$はそれぞれロボットに作用している力とモーメントです。ちなみに接地面が水平なときはZMPと等価らしい [^2]です。

上の「特定の領域内」は6次元なので図示するのが難しいんですが、最初の3次元分だけ図示すると下図のようになります。接地点ごとにコーン状の領域を定義することができ、その積集合が上で言うCWCとなります。つまり、「ロボットにはたらいている力とトルクが下図のようなコーン内に入っている」ことが確認できればその状態は安定だということができるわけです。ボルダリングで言い換えれば
> 自分にはたらく力とトルクから定義されるレンチが、手足の接地点から定義されるCWC内にあれば安定である

というわけです。

<img width="356" alt="スクリーンショット 2019-12-09 9.22.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/272738/0b29cec8-51f4-ff54-7455-58ae7cc8b6f6.png">

# ようするに
こんなこと考えないでもなんとなーく学習してスルスル登れる人間ってすごいですね。

...とあるきっかけでこの辺りに関する論文を読んでいて、ふとボルダリングにおける安定性の評価に使えるのではないかと思って書いたのですが、締め切りまであまり時間が取れず、にわか丸出しの内容スカスカ系記事になってしまいました、、、。というか内容が間違っている可能性もあるので誰か専門の人いたら教えてください。

留学のことについて書こうとも思ったのですが、僕よりインパクトのある（と期待される）南アフリカ留学体験記がこのカレンダーの後ろに控えているので気が引けたのと、特に航空と関係ないことなのでやめました。そして留学中にはまったボルダリングについて書こうと思い書いて見ましたが結局航空関係なくなりました。おわり。


[^1]: Hongkai Dai and Russ Tedrake. Planning robust walking motion on uneven terrain via convex optimization. In IEEE-RAS 16th International Conference on Humanoid Robots (Humanoids), 2016.

[^2]: H Hirukawa, S Hattori, K Harada, S Kajita, K Kaneko, F Kanehiro, K Fujiwara, and M Morisawa. A universal stability criterion of the foot contact of legged robots - Adios ZMP. Proc. of the IEEE Int. Conf. on Robotics and Automation, 2003.
laravel でキューを使う(database経由)

キューはメール一斉送信やPDF帳票生成などの時間がかかる処理を
バックエンドで処理する仕組み

# キューをDBテーブル経由で捌く
[Laravel 6.x キュー](https://readouble.com/laravel/6.x/ja/queues.html)
大まかな流れ
controllerから非同期処理テーブル(jobs)に処理内容を追加(dispatch)する
キューワーカーを実行し、レコードがあれば実行する
手動で上記コマンドを打つのは現実的ではないのでsupervisorなどのプロセスモニタを利用する

## config設定
.envかconfig/queue.phpで`QUEUE_CONNECTION`をdatabaseにする

## jobsテーブルを作成
```bash
$ php artisan queue:table 
$ php artisan migrate
```

DBにjobsというテーブルが作成される。
## ジョブクラスをつくる
```bash
$ php artisan make:job IssueReciept
```
app\Jobs\配下にIssueReciept.phpファイルが生成される

function handle()に実処理を記述する。初期情報が必要な場合は__construct()に引数を渡す。


## コントローラからジョブを呼び出す
```php
use App\Jobs\IssueReciept;
public function doSomething(Request $request)
{
    IssueReciept::dispatch();
}
```

doSomethingを呼び出すとjobsテーブルに追加される。
がこのままでは何も実行しないので
`php artisan queue:work`で実行する

## supervisorの設定
インストール

```
# yum install -y supervisor
# systemctl enable supervisord
# systemctl start supervisord
```

設定のひな型がないのでreadable.comから参照
artisanまでのパスは適宜修正
user 行はフロントエンドのuserを指定する(apache/nginx/forgeなど)

```bash
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work --sleep=3 --tries=3
autostart=true
autorestart=true
user=nginx
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
```

`sleep`がjobsにキューを見に行く間隔(秒)。`tries`は最大試行回数。
その他オプション引数はreadable.com参照。
備忘録　正規表現　文字列の中に区切りたい文字が複数ある場合

### 正規表現での処理
・　最短一致
・　最長一致


【例文】　
String = "フリースローチャレンジ_ hogeさん _1回目"

上記文字列に対して
①　フリースローチャレンジのみを抽出したい（最初のアンダーバーより前を抽出）
②　何回目かを抽出したい（最後のアンダーバー以降を抽出）

① -> re.search("(.*?)(?=_)", String)[0]　→　フリースローチャレンジ が抽出
② -> re.search("([^_]*$)", x)[0]　→　1回目　が抽出される
あるシリーズの文字列が辞書のKeyにあった時、辞書のValueに文字列を変換させる


## やりたいこと　：　あるSeriesが辞書のkeyにあった時、辞書のvalueに値を変換させる

【元のデータ】
hoge = pd.Series(["3回目", "1回目", "5回目", "5回目", "2回目", "4回目"])

【変換リスト】
name_lis = {"1回目": "01.first",
            "2回目": "02.second",
            "3回目": "03.third",
            "4回目": "04.fourth",
            "5回目": "05.fifth"
            }

mapでSeriesを囲う(@nkayさんありがとうございます！)

```
hoge.map(name_lis)
```

辞書でSeriesを囲う

```
hoge.apply(lambda x: name_lis[x])
```

> 0     03.third
> 1     01.first
> 2     05.fifth
> 3     05.fifth
> 4    02.second
> 5    04.fourth
> dtype: object
Microsoft FLOW (Power Automate)でGoogle Vision API を手軽に使う

# はじめに
Microsoft FLOW (Power Automate)にはモバイルアプリが公式から無料配布されており、今回はこれを活用します。私がFLOWで一番好きなトリガーであるモバイルアプリの[ボタン](https://docs.microsoft.com/ja-jp/power-automate/introduction-to-button-flows)便利だし、何よりも楽しい:point_up:
# 目指したところ
良いプロダクト・良い機能、これら使われてなんぼだと思いってます
iPaaSであるFLOWは巷に溢れる素晴らしいAPIを広く使ってもらう為のプラットフォームとして最適に思えます。そこでGoogle VisionAPIをここに載せる事で「**可能な限り簡素な形**」かつ[**NoCode**]で利用させる事を目指します

# やろうとした事
画像から文字を起こし、その文字情報を活用したい・共有したい -> OCRで画像から識字させて情報を得る
例： お届け先情報、スマホの画面見ながら補完も無しに書きたくない...
<img width="320" alt="kuroneko_okuri.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149993/152939fd-64cf-0a5e-9e96-abf224e25c7a.jpeg">

# Google Vision API
MicrosoftにもCognitive Serviceがありますよね...(自主規制
今回はFLOW同様に手軽に性能を手にする為に[Google VisionAPI(OCR)](https://cloud.google.com/vision/?hl=ja)を使います

Google Vision APIはoauth2 tokenを事前に取得しておけば誰でも簡単に使える優れものです。ただ、APIをコールしなければならないのはコーディングを不得意とする層にはちょっとハードルが上がります

# カスタムコネクタ化
Google Vision API用oauth2 tokenを事前に取得しておきます。[gcloudコマンド](https://cloud.google.com/sdk/gcloud/reference/auth/application-default/print-access-token)や[OAuth2.0 Playground]
(https://developers.google.com/oauthplayground/)を使います。

さて、FLOWには公式HTTPコネクタが提供されているので、カスタムコネクタにわざわざせずとも利用可能ですが、今回はPOST Methodがどう、Endpointは何か？等々を一切気にせず、VisionAPIを**手軽に**利用させる事を目的とするので[カスタムコネクタ](https://docs.microsoft.com/ja-jp/connectors/custom-connectors/define-blank)を作成します

![FLOW_CustomConnector_VisionAPI_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149993/08769cfb-49ee-bbb2-5e64-1f5faa7ab7b5.png)
![FLOW_CustomConnector_VisionAPI_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149993/29c4bf67-f650-4194-f760-e69fbbab946e.png)

# こうなった
0. スマホで文字情報を取り出したい写真を撮る
1. FLOWモバイルアプリでカスタムコネクタをベースにしたフローを起動し【ボタン】を押す
2. スマホの画像フォルダから撮影した画像を選択して送信
3. 文字情報がメールで送られてくる
![useVisonAPI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149993/8bda530c-4843-b64a-5b26-7476a6eaaded.png)

# こうするともっと面白いかも
## Google MAP API連携
- FLOWモバイルアプリ経由でロケーション情報(lat,lng)からおよその住所を入力補完

## 画像判断/機械学習の追加実装
- 実際に送る物を写真に撮ってVisionAPI経由で判別させる「パソコン」

# 終わりに
- FLOWモバイルアプリを組み合わせる事でFLOW自体をo365に縛られない使い方へ
- APIの実装次第でカスタムコネクタ化は数日で実装可能
- APIを作るだけでなく、nocodeな世界(FLOW + カスタムコネクタ)でプロダクトの利用ハードルを下げる/広げる
HugoとGitHub Pagesでお手軽にポートフォリオサイトを作った

自分の作ったものがまとまったような、自分のWebサイトが欲しい！
Hugoなら自分なりにカスタマイズできてかつお手軽にできそうだったのでやってみた

# 作ったサイト
こんな感じ

https://souring001.github.io/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404817/6481809c-54c4-6b84-727f-8536c100a7de.png)

# メリット
* 1ブロックを1つのmarkdownで書けるので便利
* テーマが豊富

テーマありすぎて選べない
https://themes.gohugo.io/

# 作り方

作り方をメモ程度にまとめておく

## インストール
https://gohugo.io/getting-started/quick-start/ に従う

```
$ brew install hugo
```

## Hugoのプロジェクトを作る
MyWebsiteという名前は自分で決める

```
$ hugo new site MyWebsite
$ cd MyWebsite
```

## サーバを起動
```
$ hugo server
```

http://localhost:1313 にアクセスすればWebページをプレビューできる

## テーマを決める
https://themes.gohugo.io からテーマを選ぶ
今回は[Swift](https://themes.gohugo.io/hugo-swift-theme/)にした

```
$ git submodule add https://github.com/onweru/hugo-swift-theme.git themes/hugo-swift-theme
```

## ページを追加

```
hugo new posts/my-first-post.md
```

`content/posts/my-first-post.md`が生成される

以下のように編集したりすればいい
draftをfalseにすれば表示される

```md
---
title: "イルミパケット"
date: 2019-12-11T14:43:18+09:00
draft: false
tags: [
    "HCI",
]
image: 'illumi-packet.jpg'
---

通過するパケットを可視化するLANケーブル．

---
### 技術
* golang
* Raspberry Pi
```

## メニューをカスタマイズ
`data/menu.yml`を編集する

## その他
ファビコンとか自分のにする場合などは `themes/hugo-swift-theme/exampleSite` を参照する

そこにはサンプルプロジェクトの中身があるので、それを参考にする


## 公開

`config.toml` に公開するURLを指定する

```
baseURL = "https://example.org/"
languageCode = "en-us"
title = "My New Hugo Site"
theme = "hugo-swift-theme"
```

以下のコマンドでpublicフォルダが生成されるので、それをGitHub Pagesなどで公開する

```
$ hugo
```

# おわりに
ページごとにOGP画像を指定したい
それとhtmlやjsをインラインで書いたりできるのかな？
ffserverを使ってさくっと動画配信サーバーを構築してみよう

# はじめに

この記事は[NTTテクノクロス Advent Calendar 2019](https://qiita.com/advent-calendar/2019/ntt-tx)の11日目の記事です。

NTTテクノクロスの中西(@9800se)です。
普段の業務では[OSSクラウド基盤トータルサービス](https://www.ntt-tx.co.jp/products/osscloud/?utm_source=qiita&utm_medium=ac2019&utm_campaign=11)のメンバーとして、いろいろな機能を持ったサーバーやコンテナを構築・運用しています。今回はこれまで作った環境の中から動画配信サーバーの構築方法を紹介します。


#動画配信サーバーの構築

## ffserver

今回はCentOS上でffserverを使って、動画配信サーバーを構築する方法を紹介します。ffserverは映像などのマルチメディアデータを配信をできるストリーミングサーバーで、ffmpegをインストールすると利用できるようになります。

##ffmpegのインストール

さくっとインストールするのであれば、次の4コマンドを投入するだけです。

```
$ yum -y install epel-release
$ rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
$ rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-1.el7.nux.noarch.rpm
$ yum -y install ffmpeg ffmpeg-devel
```
記事を執筆するために調査している段階で気が付いたのですが、上記コマンドでインストールされるのはちょっと古いバージョンでした。最新版のインストール方法を調査したのですがffmpegの公式サイトには、必要なrpmファイルの一覧が記述されているだけだったので、(依存関係などを考慮すると)どうにもさくっと構築するという本記事の目的から外れてしまうので今回は上記の手順でご勘弁ください。

##設定ファイルの準備

ffserverを起動する前に設定ファイルを用意します。

```
vi /etc/ffserver.conf
```

動画配信を実施するうえでffserverに記載する最低限の情報は以下の通りです。
複数の動画を配信する場合は動画毎に<Feed>及び、<Stream>を記述します。<Stream>内に動画の解像度、フレームレートなどを指定することこともできます。指定しない場合はデフォルト値が設定されます。

```
HttpPort 8090 # 動画ファイルを格納する際のポート番号
RtspPort 5554 # クライアントが接続する際のポート番号

<Feed feed1.ffm> # rtspサーバーに格納する動画ファイルその1
File /tmp/feed1.ffm　# サーバーに内での動画のファイルパス
FileMaxSize 100M # ファイルの最大サイズ
</Feed>

<Stream test.mpeg4># 動画ファイルその1の情報
Feed feed1.ffm #ファイル名(<Feed>のFileに対応)
Format rtp # ファイルのフォーマット
</Stream>
```

##ffserverの起動

以下のコマンドでffserverを起動します。(権限がないユーザーで実行した場合、エラーメッセージは出力されませんが起動に失敗しています。)

```
ffserver
```

-fオプションで設定ファイルを指定してffserverを起動できます。
ffserverが利用するポート番号を変更することで、複数のffserverを同時に起動できます。

##配信する動画の準備

ffserverサーバーに動画を格納するには、以下のようにffmpegコマンドを実行します。

```
 ffmpeg -re -f lavfi -i "movie=sample.mp4:loop=0, setpts=N/(FRAME_RATE*TB)" http://localhost:8090/feed1.ffm
``` 

 ffmpegは動画・音声に関してはなんでもできるすぐれたソフトウエアです。しかし、なんでもできるが故にコマンドオプションが膨大になって、やり方を調べるのが大変ですが、動画配信に使うのであれば上記の通り実行すれば問題ありません。
今回指定したコマンドオプションについて簡単に説明すると以下の通りです。
 
```
  -re:ライブストリーミングモードで動画をエンコードし、出力先ディレクトリにファイルを格納します。
  -f:入力もしくは出力するファイルをのフォーマットを強制します。通常は不要ですが、lavfiフィルタを利用する場合は必要となります。
  lavfi：lavfiフィルター
  -i:インプット(ファイルだけでなく、Webカメラを指定することもできます)
  setpts:ptsを設定する。
  movie:動画ファイルを指定する。
  loop:指定した動画ファイルをループする回数。0を指定すると無限ループしてくれます。
  uri:ffserverのIPアドレス
　　　 ffconfigに記載したHttpPort 
      ffconfigにFeedに記載したファイル名
```

##動画の再生
動画の再生は、適当なソフトを利用して再生します。
今回の記事で紹介した方法で格納した動画を再生する場合は以下にアクセスします。

```
rtsp:/ffserverのIPアドレス:5554/test.mpeg4
```

#おわり

最近は有料・無料問わず至る所で動画配信・共有サービスが展開されていますが、動画配信サーバーの構築は案外さくっとできることが分かりました。

明日は@AkmIOtUE4さんの記事が投稿される予定です。お楽しみに。
[ Android ] ApplicationContextをどこからでも呼び出す

前回はApplicationを継承したクラスについて紹介した。
https://qiita.com/QiitaD/items/549fb2143b2774c30d72

今回は、そのクラスを使ってApplicationContextをどこからでも呼び出す実装の仕方について紹介する。

##実装
メンバ変数にインスタンスを格納しておくことで、このクラスのgetメソッドからインスタンスを取り出すことができる。

~~~java
public class MyApplication extends Application {

    //このクラスのインスタンスを保持しておくためのメンバ変数
    private static MyApplication myApplication = null;
       @Override
       public void onCreate() {
           super.onCreate();
           //onCreate()が呼び出されると、インスタンスをメンバ変数に格納
           myApplication = this;
       }

       //メンバ変数に保持したインスタンスをgetするメソッド
       public static MyApplication getMyApplication() {
           return myApplication;
       }
    }
~~~

これでMyApplicationクラスのインスタンスを取得できるので、そこから以下のようにしてApplicationContextを取得できる。

~~~java
Context context = MyApplication.getMyApplication().getApplicationContext();
~~~


##参考サイト
https://qiita.com/roba4coding/items/0585b8240873ec5e9c20
OracleAPEX リージョン表示セレクタの初期表示制御

# 概要
Oracle APEX の「リージョン表示セレクタ」を使ってタブごとに表示内容を制御する画面を作成していた時に、
初期表示のタブをデフォルト（1番最初のリージョン）から変える必要があったため、
そのときの設定内容のメモ。

# 環境
* Oracle Database 12c
* Oracle APEX 18.2

# やりたいこと
以下のような画面を作っているときに、リージョンの初期表示を「リージョン2」に設定したかった。

* リージョンの構成
![apex_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/d7160d58-6a1c-fbd2-55f6-c2feddeaca65.png)

* 画面表示
![apex_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/502eda17-a941-e812-0cdf-c47463bdf39f.png)

# 対応内容
* 初期表示対象のリージョンに「静的ID」を設定
![apex_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/bf50f657-6b93-74b3-6242-5e581d9d70d5.png)

* ページロード時の処理に以下の内容のスクリプトを記述する
![apex_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220144/693e498f-aa86-18b0-a762-704417859d11.png)

```javascript
// ページ表示時に以下の処理を実行（リージョンの静的ID_tabで要素指定）
document.getElementById("sample2_tab").getElementsByTagName('a')[0].click();
```

# まとめ
やってることとしては、ページロードのタイミングでクリックイベントを起こして、タブ表示を切り替えている。

JavaScriptを使って対応できたけど、個人的にはリージョンの設定で初期表示の制御ができるようになってほしい。
予測 統計(理論編)

勉強のアウトプットとして、間違ってたりすることがあるので、お気軽にコメントして下さい。
今回は予測することに関して書いてきます。

#内容
・予測するとは
・変数の種類
・予測する手法
・データについて

##予測するとは
ある時間前のグラフの情報からその時間後のグラフが上昇するのか下降するのかを予測したり、あるラベルが与えられて、それをどのように分類するのかを予想したりすることを言います。

##変数
予測で使う変数は主に二つあります。
・目的変数
・説明変数
###目的変数
目的変数とは扱うデータの対象のことです。例えば、商品の売り上げを挙げてみると商品の個数そのもの自体が目的変数となります。
###説明変数
説明変数とは、目的変数に作用する事象のことです。例えば、りんごの売り上げには天候、消費者の需要、現代の社会問題が原因で売り上げが下がったり、上がったりします。説明変数はそれらの事象のことです。

##予測する手法
予測する手法として以下の二点があげられます。
・回帰
・分類
###回帰
これは数値を対象にグラフの予測をしたりします。例えば、さっき例で挙げたような商品の需要予測がそれにあたります。
###分類
これはカテゴリ別に分ける手法です。例えば、ライオンやチーターなどをネコ科の動物というカテゴリに分けますよという予測をするわけです。

##データについて
データとは日常的によく用いられていますがデータサイエンスの世界ではしっかりと構造化されています。それが以下の二つです。
・学習(train)
・評価(test)

###学習
データをもとにモデルを作ること
###評価
学習したモデルともとの評価データを比べること

<b>※注意点</b>
モデルを作っていくうえで、気を付けなければならないのが<b>過学習</b>を避けることです。過学習とは、特定のデータを入れすぎて柔軟に予測ができなくなることを言います。例えば、100人の生徒がいる塾で全員がリンゴが大好きというデータを入れたときに機械は他の人たちも100%の確率でリンゴが大好きであろうと予測するわけです。しかし、別の塾ではリンゴが大好きな生徒が半分しかいなかったり、またはそれ以下だったりするわけです。この時点で予測100%ではなくなってしまうわけです。これが過学習です。だから、これを避けるべく学習するデータ量というのは調整が必要なのです。
【javascript】高負荷な計算中にアニメーションを更新する

以前JavaScriptでリバーシを作ったことがあるのですが、そのとき実装に手間取ったことがあるのでメモしておきます。

リバーシAIが8手読みやら10手読みを実行すると、JavaScriptではどうしても10秒前後時間がかかってしまいます。その間に現在AIがどのマスについて先読みしているのかを表示させようとしました。

# うまくいく実装

```javascript
for(const node of childnodes){
    //数秒かかる重たい処理
    const evaluation = node.calcEvalucation();

    //評価値を計算し終えたマスに色を付ける
    document.getElementByID(node.id).style.background = "#00ff00";

    //アニメーションを実行
    await new Promise(resolve=>{
        setTimeout(()=>{}, 0);
    });
}
```

## 解説
3段目の「アニメーションを実行」の部分がみそです。

```javascript
//アニメーションを実行
await new Promise(resolve=>{
    setTimeout(()=>{}, 0);
});
```
setTimeoutで空の関数を並行処理させると、その間にDOMのアニメーションが実行されるようです。
もちろんawait構文を使っているので、外側の関数がasyncでなければなりません。

# うまくいかない実装
念のため、うまく行かない実装も載せておきます。

```javascript
for(const node of childnodes){
    //数秒かかる重たい処理
    const evaluation = node.calcEvalucation();

    //評価値を計算し終えたマスに色を付ける
    document.getElementByID(node.id).style.background = "#00ff00";
}
```

そのまま実装すると、アニメーションが更新される前に別のマスについて先読みが開始してしまいます。これではAIがどのマスについて思考中なのかわかりません。アニメーションが更新されるのは全体の処理が実行し終わってからになります。
Atom エディター sublim text のように選択時のみ不可視文字を表示させる方法

# 選択時のみ不可視文字を表示させる方法

![スクリーンショット 2019-12-10 16.02.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/ec59bb52-00e1-b250-7da3-cf76b773c60e.png)

### まだそういったパッケージはない
実はこれsublimから移行した人はみんなここで不便をしてると思います。
日本語で検索してもヒットしないですね。英語で検索すると出てきます。
https://github.com/atom/atom/issues/6669
まあ一言で言うとそう言うパッケージはまだないから自分で設定いじってね
ってことです。

### 自分で設定する
Macでの操作
バーからAtomを選択し`stylesheet...`を開きます。
![スクリーンショット 2019-12-10 15.38.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/08e34773-d36d-9bf0-bea9-9ecb325939e2.png)


ここに設定を書いていきます。下のコードを全てコピペしましょう

```
// この一行をファイルの一番最初に置きましょう
@import "syntax-variables";

/*
  範囲選択時のみ不可視文字を表示させるようにします。
*/
atom-text-editor.editor {
  .invisible-character {
    // 1. 不可視文字を背景と同じ色にすることで通常の不可視文字の状態を隠します
    color: @syntax-background-color;

    // 2. カーソルラインの時に不可視文字を表示させる (ここは意味わからないけどとりあえず書いとく)
    // Should work by default but just in case.
    .cursor-line & {
      color: @background-color-highlight;
    }
    // 2a. または現在のラインで表示させない (ここは意味わからないけどとりあえず書いとく)
    .cursor-line & {
      color: transparent;
    }

    // 3. テーマによってインデントガイドで不可視文字が表示されることがあるためここを追加する
    &.indent-guide {
      box-shadow: inset 1px 0 0 0 @syntax-indent-guide-color;
    }
  }

  // 無駄なスペースやタブなどは赤で表示させる (カーソルライン以外のところ)
  div.line:not(.cursor-line) { 
    .trailing-whitespace {
      background-color: @background-color-error;
      color: contrast(@background-color-error);
    }
  }
}
```

# 完成系
![スクリーンショット 2019-12-10 15.59.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387055/431c0140-deca-aae1-7631-9e358dc8f07b.png)


# 補足
設定で不可視文字を表示するにチェックを入れないと不可視文字は見れませんよ。
全く関係ないがstylesheetに下記のように書くことでカーソルの文字の色も変えられる

```
// style UI elements inside atom-text-editor
atom-text-editor .cursor {
   border-color: #FCC800;
}
```