OmniAICreator/Qiita-1.07M huggingface dataset:
C++ Builder XE4 > TeeChart > TChartでZoom, panningを禁止する

```txt:動作環境
C++ Builder XE4
TeeChart Lite v2013.08.130414 32bit VCL
```

### 処理概要

- TChartコンポーネント(例: Chart1)に対して下記を禁止したい
    - Zoom
    - Panning

### 参考

- [monodroid Steema.TeeChart.TChart : how to disable user interaction](https://stackoverflow.com/questions/16563360/monodroid-steema-teechart-tchart-how-to-disable-user-interaction)

### 実装

Chart1のZoomやPanningの設定変更、という方法は無効だった。
Chart1自体のEnabledをfalseにする、という方法が有効だった。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	// zoomと移動の禁止 （無効)
	Chart1->Zoom->UpLeftZooms = false;
	Chart1->Panning->Active = false;

	// zoomと移動の禁止 (有効)
	Chart1->Enabled = false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
	// ダミーデータ作成

	Chart1->Series[0]->XValues->DateTime = true;
	Chart1->BottomAxis->DateTimeFormat = L"nn:ss";

	TDateTime dt;
	dt = Now();

	double yval;
	for (int idx=0; idx < 10; idx++) {
		yval = (1+ idx) % 2;
		Series1->AddXY(dt, yval, "", clRed);
		dt = IncSecond(dt, 1);
	}

}
//---------------------------------------------------------------------------
```

### 実行例

(ZoomもPanningもできない)
![2018-12-24_11h47_04.png](https://qiita-image-store.s3.amazonaws.com/0/32870/13f9ff08-da0b-2251-5aac-b9e9d5f229a0.png)

### 検索用キーワード

- 制限をかける
- ズーム
- パン
- パニング
2018年の振り返りと2019年の展望 

# 目的
ユニークビジョン株式会社Advent Calendar 2018の最後の記事でうちの昨年の振り返りと来年何をしているかを書いてみようとおもいます。

# 2018年振り返り

## ISO27001
12月に審査があり審査クリアー。
2年前くらいからセキュリティ委員会として製品や社内のセキュリティ向上の活動をしていて、今年からISO27001にフォーカスを絞り取得を目指しました。セキュリティ向上を最大化し無駄が少ない運用を目指しました。取得には[ニュートン・コンサルティング](https://www.newton-consulting.co.jp/)さんの協力していただきました。

## Devops
1プロジェクトでのCI/CDが導入され、それを他のプロジェクトで展開できるようにする準備中の段階です。
GitlabのSelf-ManagedだったけどSaasに切り替えてみる予定です。

## テストケース
テストの品質やテスト時間の長さが課題になっています。
適切なテストケースを洗い出す手法が導入されました。

## ハイパフォーマンス
RustとRedisを使って1分間で10万アクセスさばけたました。
当初Redisの組み込みLUAを使って処理したいたところパフォーマンスがでず、処理をRust側にもってくるとパフォーマンスがよくなっていきました。Rustはその他にも巨大帳票を出す時などに使っています。

## 機械学習
ツイートの内容を分析することができるようになりました。またいくつかの画像認識もすすみはじめています。
ただの技術検証ではなく、きちんとした製品として提供できています。

## Slackの導入
簡単にチャンネルやグループが作れたりするので、社内のコミュニケーションが活発になりました。
チャンネルごとにプッシュ通知を受け取る時間を設定できるので、システムエラーなどの緊急通知のみ24時間受け付けるみたいなことができるようになっています。
12月にスタンダードプランになりました。

## フロント開発
Webのフロントは以前はBackbone.jsを使っていましたが、Vue.jsとVuexを取り組み始めました。
Typescriptも導入しています。

# 2019年展望

## Devops
CI/CDは全プロジェクトへの導入
ログの収集から分析までのフレームワークの導入

## 機械学習
ツイートでは男女判定、年齢判定、ポジネガ判定などの要望があるので実現していきたいです。
画像認識では依頼から学習してAPIの提供までスムーズな流れを作りたいです。

## ERD
現在ERDツールがWindowsのアプリケーションのため複数人の作業やできあがったERDファイルの持ち運びが課題になっています。Webで管理できるツールの選定か構築を検討しています。名前と型をひもづけるドメインの機能がほしいんですが、これをサポートしているWebアプリは皆無なので必須条件から下げようかと思っています。

## フロント開発
iPhoneとAndroidにfluxを導入
画面フロー制御に状態遷移マシンを使ってみたい。以前複雑な画面フローがうまく制御できず苦労したアプリがあったのでその反省から。

## マイクロサービス
うちのプロジェクトではSNSのクローラーが入る事が多いので、色々なクローラーをマイクロサービスで提供したいです。
現在はTwitterのAccount Activity APIに対応したマイクロサービスのみが稼働しています。
AWSのLambdaでRustがサポートされたので、これで爆速なクローラーが作れないかと考えてます。
[PHP]ini_setについて

phpファイル内に、下記を記述することで、エラーを表示してくれる。

```php5
<?php
ini_set('display_errors', 1);
```

エラーの例
<img width="761" alt="スクリーンショット 2018-12-23 22.34.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/330623/72599d64-6043-a8cd-43f9-adf9abc23afa.png">

その他ポイント
1. 「1」を「0」に変更すると、エラーを表示しない。
2. エラー文の中に、何行目が怪しいか書いてくれているので、その周囲を中心にチェックできる。



参照：http://php.net/manual/ja/function.ini-set.php
参照：https://web-dev.xyz/php-iniset-displayerrors/
まだClean Architectureで消耗しているの?

LOBでGopherをやっているChifung Cheungです。

最近Gopher界隈でClean ArchitectureだったりDDDだったりでやる風潮が強まっているが、
「別にどうでもいいじゃない？」と主張したいだけです。

- 「まだClean Architectureで消耗しているの?」というタイトルをつけたが、Clean Architectureに限らず、DDDなどのアーキテクチャも似た問題があります。
- Golangに限る話です。
- ベンチャー企業での話です。

# そもそもなんでClean Architectureを使う

主な理由は、**持続可能な開発** にしたいです。いわゆる、開発規模の「Scale」をしたいのです。
Clean Architectureの信者は、コードを書く前にまずはClean Architectureを導入する、そのシルバーバレットがあれば、プロジェクトが簡単にスケールできると信じているでしょう。

もちろん、現実はそう甘くない。

![CDKZ3NKWgAM1c36.png](https://qiita-image-store.s3.amazonaws.com/0/86204/bf6ef5cb-631a-7e14-1aaf-3cb39bc8cbb5.png)

スケールの確認ができる前に、Clean Architectureを導入したらすぐ問題が出る。

- 一つの機能を開発するには、Interface、Domain Models、Adapters、Usecaseなどの登場人物が揃えないといけない。どの機能をどのドメインに置くべきを考えるのが頭にいっぱいで迷い子になる。
- 関心が細かく分離することで、一人ですべてのドメインをカバーしにくくなる。
- コンポーネントとインターフェイスが多くて、すべてのテストを書くのが時間かかる。
- Clean Architectureを導入すれば自分の書いたソフトウェアがスケールできると信じて他の問題を無視してしまう。

いわゆる、問題解決するために導入するために導入したソリューション自体が、プロブレムになってしまう。

# じゃ、どうすればいいのか

趣味で常にGitHub上の様々な優秀なGolangのOSSを読んでいます。一つ分かったのは、
**いくら複雑なソフトウェアであっても、Clean Architectureを使っていません**。

GolangのカリスマDave Cheneyは最近のブログで、持続可能な開発したいなら[Golangを書く時にこの３つの原則を守るべき](https://dave.cheney.net/practical-go/presentations/qcon-china.html)と書きました。

- Simplicity
- Readability
- Productivity

なぜかというと、Goはソフトウェアエンジニアリングの問題を解決するために開発された言語であって、Go自体がソリューションです。

優秀なOSSはほとんどこの３つの原則を守って様々な人を開発に巻き込んでプロジェクトが成長できたわけです。

逆に、下手にGoでClean Architectureを入れると、この三原則を全部違反してしまう。

- Simplicityなし：不要なコンポーネントが多い、過度な抽象度、本来簡単であるべきソフトウェアの複雑度が一気に上がる
- Readabilityなし：一つの機能の構成部分が多くて、ロジックを理解するために幾多のファイルを全部読まないと理解が不可能。アーキテクチャの習得コストも高まり、読む側の負担になりがち。
- Productivityなし：GoにはまだGenericもない、自動生成のあるライブラリもない。Clean Architectureに対応するには、コピペか下手な自作ライブラリか他の手段がない。余計な工数が発生する。

# Clean Architectureが悪？

いいえ、悪いのは問題の制約と本質を考えずに過度な設計をする人間です。
自分もClean Architectureを含んだ様々なアーキテクチャやフレームワークを使ったことがありますが、どちらでも適用範囲があります。
Goはそもそも特定のドメインの問題を解決するための言語なので、
Goの原則を守らない使い方をするなら、絶対他の言語にしたほうがいいと思います。

**「Goに入ればGoに従え」**

Merry Christmas
Vue.js + Apollo Client (GraphQL) により変化するアプリケーション設計を摘む

## はじめに
記事を書く時間があまり取れなくて文書としては薄い内容になってしまったのですがどうかご容赦ください(´；ω；｀)
サンプルコードもありません。
しかし以下の内容は今私が一番注目している内容になります。
何卒よろしくおねがいします。

## 港での騒ぎ
Apolloを使えばReduxが消せるって話は港ではとてもホットな話題です。
つまり、Vue.jsを使っている場合、そのエコシステムがVue.jsでも使えるのならば、Vuexを消せるのと同じぐらいのインパクトがあります。
どうせまたまたなんか言ってんなー。どうせ無理だろ〜〜〜と思ってた時期が私にもありました。
しかしそれが現実になっているのでこんな時代がVue.jsにも来るかもしれないということを共有しようかと思います。

## 「React + Apollo Client (GraphQL) により変化するアプリケーション設計」
https://speakerdeck.com/vwxyutarooo/react-plus-apollo-client-graphql-niyoribian-hua-suruapurikesiyonshe-ji

先日[node fes](https://nodefest.jp/2018/)でこのような内容が発表されました。
内容はスライドを見て頂けるとわかるのですが、reduxが消えてApolloに完全に置き換わっています。
[とある例](https://speakerdeck.com/vwxyutarooo/react-plus-apollo-client-graphql-niyoribian-hua-suruapurikesiyonshe-ji?slide=9)だと移行によりコードは3000行以上減っています。
これは凄い！Vue.jsでも同じようなことが起こるのか！？そう、起こります。
注目すべきはgraph qlの仕様とそれを活かしたのQueryコンポーネントとlink-stateです。

## なぜRedux、Vuexが消せるのか
graph qlではqueryには厳格なルールがあります。
つまり、Aコンポーネントはこのリソースのこの条件に対して関心があるのがわかります。
では、Bコンポーネントがそのリソースを更新するqueryを発行した場合、Aコンポーネントのデータはそれに伴い一緒に変更されるべきです。
でないと画面上のデータに不整合が発生しちゃいますよね。
Apolloだけを使ってquery操作をすることにより、Apolloはクライアント上の全ての状態を把握できます。(ローカル変数もどきも管理できるので、データソース以外の値も管理できる
では、変更があったらHoge.subscribeとかで値を捕まえないと行けないのかというと、そうではなくQueryコンポーネントというのがあります。
これは、[vue-apollo](https://vue-apollo.netlify.com/guide/components/query.html)にも用意されています。
そう、全てのデータがslot-scopeで受け取れるので、その辺のバインドのコードも書かなくて良いんです！なんて素晴らしい！！！

## つまり
Apolloを使うとRedux, Vuex等が消せるだけじゃなく、ReactとVue.jsの状態管理やデータソースとのやり取りの仕方がほぼ一緒になります！
React畑だから、Vue.js畑だから設計が違いすぎてわからない！ということも減ります！
しかも従来と比べてコード行数が超減ります！

ちなみにかのAirbnbもApolloを導入しています。
https://medium.com/airbnb-engineering/how-airbnb-is-moving-10x-faster-at-scale-with-graphql-and-apollo-aa4ec92d69e2

## 期待していること
firebaseのfirestoreもcollectionやdocのパスが示すリソースは常に同じです。
schemaもそうでしょう。
なので、firestore用のQueryコンポーネントならず、firestoreコンポーネントが誕生しないか期待しています。
または、firestoreがgraphqlに対応しないかなーとか。
喋る言語は同じgraphqlです。

## まとめ
結局は常に正しいデータを少ない労力で確実に扱いたいだけなので、apolloじゃなくてもrestでもなんでも同じ事ができますう。
rest版のrest componentみたいなの作ればきっとイケるでしょう。reduxやvuex使っても全然いけます。
しかし、その辺のできの良さやエコシステムはapolloも凄く、またVue.jsがとても大切にしているDXもApollo Queryコンポーネントはとても高いでしょう。

しかし、Flux系storeが勝ち残る可能性も凄く高いので、これからどうなるのか楽しみです。
自分の予想としては既存の資産で作られているのと流用する必要があるのはReduxやVuexでやって、新規プロダクトはGraphQL + Apolloに寄るのかなぁと思ってます。

## 最後に
状態管理の戦国時代が来る予感がしています。。。
Towards Microservices

この記事は「Relux Advent Calendar 2018」25日目（最後）の記事です。

#Microservicies（マイクロサービス）の起点と導入事例
"Microservices"(マイクロサービス)という単語自体は、随分と前からあったとも言われていますが、有名どころでいうと、2014年にマーチン・ファウラー氏と他数名が公開した「Microservice」という記事が起点になる人も多くいると思います。

またそのアーキテクチャを採用している企業も有名なところが多く、
海外では、Amazon、NetFlix、eBay、日本では楽天、メルカリ、LINE、クックパッド、Gunosyなど多くの企業で採用されており、検索すると最近では多くの企業で導入または検討の進んでいることが伺えます。

#当社の導入背景
ローレベルでは書ききれないので、ざっくりとハイレベルでいうと、「ビジネススピードに追従できない」という問題に対する一つの手段となります。
手段は数多くあると思いますが、なぜ”Microservices”かは今後述べていきたいと思っておりますので割愛します。

という事で、トレンドの波に乗るのが遅くなりましたが、当社でもいよいよ「Microservices」の導入を決定し、準備を進めています。

#先ずはメリット・デメリットの考察から
####＜メリット＞
*・Improvement fault isolation：単一モジュールの障害において、影響の受けない作りが可能*
　伝統的？なモノリシックアプリケーションでは、一部の障害＝全体的な障害になるケースが多く、期待大ですね。

*・Eliminate vendor or technology lock-in：ベンダーロックインが排除でき、必要に応じ個々のサービスに異なるテクノロジの採用が可能*
　まさに、多くの企業が直面している問題に対する解決策で、ベンダーAさんはX機能について経験豊富で先端的であっても、システムとしてみた場合、他の機能の経験が少なく結果期待値に満たない作りとなってしまうリスクの回避が可能そうです。また機能によって開発言語を変えることも可能ということは人財（ここは人材ではなくあえて人財とします）の確保の幅が広がりますね。

*・Ease o Understanding：追加がシンプルで開発者にとって機能の理解が容易に*
　外資はもちろん日本の企業でも特にエンジニアは転職率が上がってきており、人財の流動化か加速している中、せっかくJoinしていただいたのに既存システムが複雑すぎるケースにおいては、理解するために時間を要することも多くとても非効率ですが、サービス単位に分割されていることで、オーバーヘッドも効率化できそうですね。
　
####＜デメリット＞
*・個々が独立したサービスになるため、総合的に見ると開発が複雑になる可能性があり、 特にモジュール間のリクエストは慎重に設計する必要があります。 またリモートコールに待ち時間が発生すると、複雑な問題の発生が懸念
・複数のデータベースとトランザクション管理が困難（複数のAPIコールでトランザクションを組むのは困難）
・マイクロサービスベースのアプリケーションをテストするのは困難。モノリシックなアプローチでは、アプリケーションサーバを起動し、基盤となるデータベースとの接続性を確保することでアプリケーションのテストが可能に対しマイクロサービスでは、テストを実行する前に各依存サービスの状況の確認が必要。
・複数のサービス間の調整が必要とするケースにおいて、マイクロサービスのデプロイは複雑になる可能性があるため十分な検討が必要。JavaのケースでいうところのコンテナにWARを配置するほど簡単ではない。*

なるほど、世界最初の汎用コンピュータ「ENIAC」の誕生から74年経た現在においても、ソリューションとしての銀の弾（Silver Bullet）は存在しないという事ですね。では可能な限り、ポリシーを決めリスクとなり得るものはマネジメントして進んでいくことにしましょう。

#次に、キーテクノロジーの洗い出しと検証#
・API Gateway
・オーケストレーションとコレオグラフィ
・メッセージング（AMQP, MQTT…)
・サービスモニタリンング、トレーシング
他にも多くのものがありますが、リスト化すると長すぎるため割愛します。
また検証結果は別途、タイトル毎、機能毎に紹介していきたいと思います。

#そして多くの先人たちの事例からの検討事項#
・サービス分割の粒度と分割の切り口（最も重要かつ失敗につながるポイント）
・サービス間のデータ一貫性（運用を想定したデータ不整合に対する対策含め）
この課題は非常に悩ましく、一筋縄での解決は難しいですが、一定の法則を見出したいと検討しております。


#終わりに#
今日おいて、特にWebアプリケーションの開発スタイルは着実に進化し一方で機能は、ますます複雑化（一部は簡略化）してきており、
もはや属人的にアプリケーション全体を抱えるには限界に達しており、必然的にマイクロサービスという手段が生まれました。
当社も同様に” Microservices"化という道のりを選択しましたが、準備・検証は怠りなく十分実施し、いざ歩き始めたらゴールを明確に意識しながら、問題に対しては臨機応変に対応し、ゴールを目指していきます。
今後当社ブログ等で、随時情報を発信していきますので、"Microservices"化を検討しはじめている方々に少しでもお役に立てれば幸いです。

*-引用情報-*
[Microservices Architecture: Advantages and Drawbacks](https://cloudacademy.com/blog/microservices-architecture-challenge-advantage-drawback/)
AWS SSOを試してみた

AWS SSOを試してみました

# どんなもの？
AWS accountsやGithub/SalesforceのようなSaaSに対してシングルサインオンを提供するサービスです。

# 必要なもの
- AWS Organizations

# 

# 1. ユーザーとグループを追加する

AWS SSOのコンソールから、ユーザーを作成します。

<img width="991" alt="1_1_user.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/029a7b90-46ad-3992-5257-9b260ca54ab5.png">


<img width="825" alt="1_2_user.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/2c479f11-db9c-4c18-22ee-cddd85a4d778.png">

次にグループを作成します。

<img width="482" alt="1_3_user.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/2deaf732-19a8-fb82-3985-d2f64480d591.png">

最後にグループとユーザーを紐づけます。
※⭕️のチェックを忘れるとグループとユーザーが紐づかないので注意

<img width="822" alt="1_4_user.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/7f843c72-477e-6f2f-7a9c-d981d7b12820.png">




# 2. AWSアカウントへのシングルサインオンを許可するグループを指定する

許可するAWSアカウントを指定します。

<img width="982" alt="2_1_assign.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/24b9b770-fe63-3387-27c0-a168be5d9874.png">

許可するグループを指定します。

<img width="820" alt="2_2_assign.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/5c9c6494-bb65-dc6e-1e4a-fca15b48c8b5.png">

アクセス権限セットを作成後、指定します。
ここでは、PowerUserAccessを指定しました。

<img width="818" alt="2_3_assign.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/e929fdf5-9038-35dc-cb6d-92c92db30b07.png">
<img width="805" alt="2_4_assign.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/c927fcf4-a1c1-2434-311b-7b98706e3401.png">
<img width="811" alt="2_5_assign.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/3b34d16c-9fa3-e5cb-4939-d4b0f3bc07fb.png">
<img width="817" alt="2_6_assign.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/7a92881a-be16-d841-0619-52b6860a8e82.png">

# 3. ログインする

招待メールのAccept invitationをクリックすると、パスワード更新画面になるのでパスワードを更新してログインします。

<img width="333" alt="3_2_login.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/1116d1d6-32ca-ae20-d313-6ceab2e651b6.png">

AWSのアカウントが選択できるようになっています。

<img width="918" alt="3_3_login.png" src="https://qiita-image-store.s3.amazonaws.com/0/192584/548433e3-20aa-a53d-d8a7-a96cd977bb4e.png">

# 雑感
- Microsoft ADと連携する以外にAWS SSO自体にDirectoryを持てるようになって、少しAzure ADに近づいた感じがします。
- パスワード認証しかないのかなぁ。普通のIAMユーザのログインはyubikeyに対応しているのに。。。
Python GUIで質問です ->解決済

pythonのpandasを用いてファイルを分析するanalysis.pyというツールを作成しました。これは、あるcsvファイルを読み込んで解析し、結果をresult.txtに書き込み、ファイルを作成するものです。

WEBアプリでGUIからオープンファイルダイアログなどでcsvファイルを選択しアップロードし、バックエンドでanalysis.pyが動いて、できたresult.txtファイルをダウンロードするみたいにしたいです。

サンプルのプログラムありましたら、教えてください。

よろしくお願いします。
GitのGUIクライアントアプリを自作している話

# はじめに

この記事は12/24に書いています。遅刻ではなく、枠が空いてたので、せっかくだから埋めてやりましょうということで、過去に何度も記事にしたのと同じネタの宣伝なのです。

# デスクトップアプリをC++とQtで！

他の方の記事を読んでいて、最近では個人開発もウェブサービスとかモバイルアプリ開発が主流になってきたのですね。時代の変化を感じます。私はおっさんなので、流行に付いていくのがしんどく感じるようになってきました、それでも、きっとどこかに需要はあるはずと信じて、C++でデスクトップアプリを作り続けています。

# Git GUI クライアント

表題のアプリは「Guitar」といいます、2年くらい前から作り始めました。先日v0.9を公開しました。GitHubのコミット数は600に達し、★の数は100を超えました。ピーク時より更新頻度は減ってきましたが、今でも少しずつ改良を重ねています。

▼作り始めた頃の記事（2年前）
「GUIのGitクライアントアプリを作ってみた」
https://qiita.com/soramimi_jp/items/4bdffae3f8660b7e6874

▼だいぶできてきた頃の記事（1年前）
「自作Gitクライアントアプリを作っています」
https://qiita.com/soramimi_jp/items/8425196ddc28bf283333

▼先日公開した記事（2ヶ月前）
「自作 Git GUIクライアント Guitar, v0.9」
https://qiita.com/soramimi_jp/items/19d698a4c88575a3b1f9

上に挙げた記事にも書きましたが、そもそも、Gitクライアントを作ろうと思ったきっかけは、私自身がGitを習得することが目的でした。「Git難しくてわからん」「仕事で使わざるをえなくなってしまった」というわけで、ソフトウェアエンジニアとしてGitを避けては通れなくなってきたと感じました。いざ始めて見ると「内部はどういう仕組みで動いているんだろう？」という技術的な興味の方が上回ってきて、さらには、実用的なツールにしたいという思いが出てきました。それがGit GUIクライアント「Guitar」なのです。

今時の優秀なエンジニアの方は、GUIでGitなんて、、、と思う方もいらっしゃるかもしれません。それはそれで大いに結構なことです。私自身も、めったに使わないコマンドを実行したいときは、無理してGUIに頼らず、ターミナルを開いて`git`コマンドを手入力することもあります。これは便利だと思う機能を見つけたら、このアプリに組み込んだりします。日常で頻繁に使うGit操作を快適に行いたいとか、コミットグラフを綺麗に見たいとか、そのような用途だけでもお使いいただけます。使いたがらない人にGUIを強要する考えはないので、ブランチの流れをビジュアルに見たいだけの理由でこのアプリを使っていただくのでも嬉しいです。なので、高機能なクライアントアプリではなく、GUI支援アプリと思っていただいても結構です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61222/67807fd2-fcaf-f44d-7890-f216a8443b89.png)

マルチプラットフォーム対応です。WindowsとmacOSとUbuntuで同じように動きます。協力者募集なのです。開発に参加してくれる方、アイディアをくれる方、使ってみて感想をくれる方、英語の説明書を書いてくれる方、薄い本を書いてくれる方など歓迎します。

GitHub: https://github.com/soramimi/Guitar
ダウンロード: http://files.soramimi.jp/guitar/

デスクトップアプリ開発はオワコンだとか言ってないで、C++とQtやりましょう！
AdventCalendar2018 8 WordPress でつくるブログメディアの企画で、WordPress プラグインについて


- [ ]  8日目 
 - WordPress プラグインの設定
 - Jetpack
 - セキュリティ
 - キャッシュ
 - 集客
 - 画像
 - アクセス数
 - カスタム投稿タイプ
 - CSV インポート
 - 問い合わせ

# WordPress プラグイン
WordPress を利用する大きな理由の一つに豊富なプラグインの存在があります。

プラグインがあるために、コードを書かずにリッチなメディアを作成することができます。

# WordPress プラグインの設定
最初に必要そうなプラグインをリストアップします。

- Jetpack
- セキュリティ
- キャッシュ
- 集客
- 画像
- アクセス数
- カスタム投稿タイプ
- CSV インポート
- 問い合わせ

## Jetpack
Jetpack はいろいろな機能がある便利プラグインなのでいれておきます。

- Jetpack by WordPress.com

インストールしたら、WordPress.com にアカウントを作成して、無料スタートします。

おすすめ機能を有効化します。 



## セキュリティ

- Akismet Anti-Spam (アンチスパム)
- All In One WP Security
- SAKURA RS WP SSL

## キャッシュ


## 集客
SEO で有名なプラグインをいれます。

- Yoast SEO

ただしこちらは場合によってはなしでも大丈夫です。

## テキスト周り

- WP Multibyte Patch
- Table of Contents Plus

`WP Multibyte Patch` は最初から入っているものです。


## 画像
- ImageMagick Engine
- Enable Media Replace

## 外部共有

- Public Post Preview
- Public Post Preview Configurator

## アクセス解析

- Google Analytics Dashboard Plugin for WordPress by MonsterInsights

## カスタム投稿タイプ

- Custom Post Type UI
- Custom Post Type Permalinks

## CSV インポート

- WordPress インポートツール

## 問い合わせ
後ほど検討しますが、以下は有名。

- Contact Form 7
revelのテンプレート関数を使ってアクションへIDを返そうとするとReverse: reverse route missing route argumentが発生する問題

####試み
___
revelで以下のようなroutingを設定
`POST    /player/:id/delete Player.Delete`

対応するアクション

```go
// Delete delete one player
func (c Player) Delete(playerID int) revel.Result {
	deletePlayer(playerID)
	return c.Redirect(routes.Player.Index())
}
```

####問題
___
revelに標準搭載されているテンプレート関数であるurl関数を利用してリバースルーティングを試みると以下のエラーが発生する。

```go
{{range .players}}
  ...
  <form action="{{url "Player.Delete" .ID}}" method="POST">
    <button>DO</button>
  </form>
  ...
{{end}}
```
↓
`ERROR 09:44:22  revel router.go:708: Reverse: reverse route missing route argument   section=router argument=id`
*エラーは出るものの、意図した挙動は実現する

####解決法
___
url関数を使いのをやめ、素直にURLを埋め込んだ

```html
{{range .players}}
  ...
  <form action="/player/{{.ID}}/delete" method="POST">
    <button>DO</button>
  </form>
  ...
{{end}}
```

アクション

```go
func (c Player) Delete() revel.Result {
	playerIDStr := c.Params.Get("id")
	playerID, _ := strconv.Atoi(playerIDStr)
	deletePlayer(playerID)
	return c.Redirect(routes.Player.Index())
}
```
コンサルタントになりたい人へ

先ずはコピー用紙やチラシの裏でも良いのでロジックツリーを手書きしてみよう。

[サンプル]
‪【"問題と定義した事項"】‬
1.大項目
 ⑴中項目
   ｱ.小項目
   ｲ.小項目
   ｳ.小項目
 ⑵中項目
   ｱ.小項目
   ｲ.小項目
   ｳ.小項目
 ⑶中項目
   ｱ.小項目
   ｲ.小項目
   ｳ.小項目

2.大項目
  ⑴中項目
   ｱ.小項目
   ｲ.小項目
   ｳ.小項目
 ⑵中項目
   ｱ.小項目
   ｲ.小項目
   ｳ.小項目
 ⑶中項目
   ｱ.小項目
   ｲ.小項目
   ｳ.小項目

3.大項目
 ⑴中項目
   ｱ.小項目
   ｲ.小項目
   ｳ.小項目
 ⑵中項目
   ｱ.小項目
   ｲ.小項目
   ｳ.小項目
 ⑶中項目
   ｱ.小項目
   ｲ.小項目
   ｳ.小項目
久しぶりに。

久しぶりに投稿です。
巷ですっかりBlenderという言葉をよく聞くようになりましたね。

私が知ったのは2010年ごろでしょうか・・・？
Autodeskさんと無縁のような会社さんではじめて
Blenderを進められましたが・・・UIが・・操作が・・・
色々と駄々こねてMayaを導入してもらったこと。

それ以来・・。
ひとまずDL。こんなサイトだっけ？って思いながらDL開始して
メッチャ時間かかるやん・・・。寝る！

今朝インストールして今。
とりあえず起動確認。

※なぜか画像が張り付けられなかったので・・・省きます。。。

とりあえずインタラクティブモードで
Mayaができるみたいなので指定して
触ってみたら　まあ確かに”ぽい”！(^^)

それよりもグリースペンシル楽しい！！！！

本題はFBX出力についてです。
ひとまず今見ているサイトのURLだけを。
http://renderhjs.net/fbxbundle/

なんしかFBXについてよく聞かれるので・・・また試してみようと思います。

FBXとは・・・
https://ja.wikipedia.org/wiki/FBX

Autodeskさんが所有しているってあまり知られていないのかもしれないですね。
冬休みに読みたいUiPath関連のまとめブログ 

（UiPath関連で何かしら情報がピックアップできたり、話題のサイトをまとめてみました。）

## UiPathの使い方

- [RPAチャンネル](https://www.innovated-solution.jp/rpa/blog)
- [UiPath Activities ガイド（公式）](https://activities.uipath.com/lang-ja/)
- [UiPath道場](http://www.uipath-dojo.com/)


## ブログ

- [RPA BANK](https://rpa-bank.com/report/11036/)
- [RPA Blog (UiPath公式)](https://www.uipath.com/blog)
- [RPA Blog (ミツエーリンクス)](https://www.mitsue.co.jp/knowledge/blog/rpa/)
- [RPA Navi](http://rpa-navi.com/archives/category/uipath)
- [RPAチャンネル](https://www.innovated-solution.jp/rpa/blog)
- [UiPathでRPAを始めよう](https://uipath.site/blog)
- [【UiPath／ユーアイパス】まとめブログ](https://uipath.info/)
- [クレスコ エンジニアブログ](https://www.cresco.co.jp/blog/entry/category/rpa/)


## SNS

- [Qiita#UiPath](https://qiita.com/tags/uipath)
- [Twiiter#RPA](https://twitter.com/search?q=%23RPA&src=typd)
- [Twitter#RPA女子](https://twitter.com/hashtag/RPA%E5%A5%B3%E5%AD%90?src=hash&ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1052123877059395589&ref_url=https%3A%2F%2Fsuisui3.com%2Frpa_sns%2F)
- [Twitter#RPA女子プロジェクト](https://twitter.com/hashtag/RPA%E5%A5%B3%E5%AD%90%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88?src=hash&ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1050615203996479488&ref_url=https%3A%2F%2Fsuisui3.com%2Frpa_sns%2F)
- [Twitter#UiPath](https://twitter.com/search?q=%23UiPath&src=typd)


（これもおすすめ！みたいなのがあればご教授くださいまし）
ProgateのPHPで理解が思うように進まなかった話

#PHP学習で難しかったところ
ProgateのPHPを修了することに、大分時間をかけてしまいました。
学習で、詰まったところをアウトプットし、対策をまとめようと思います。
詰まったところは、
・プロパティなど、PHPの文法忘れ
・「;」のつけ忘れなど単純なミス
・テクニカルタームの理解が遅い

###・プロパティなど、PHPの文法忘れ
プロパティ、メソッド、インスタンスなどの文法を忘れてしまい、また検索にも時間がかかっていました。
###・「;」のつけ忘れなど単純なミス
これに関しては、本当に単純なミスです。
コードが書けたと思って、ボタンを押したらエラーが吐き出され、原因を探したら「;」のつけ忘れ、全角スペース、などが結構な頻度でありました。
###・テクニカルタームの理解が遅い
例えば、「Menuクラスに、$countというpublicなクラスプロパティを、初期値を数値の4
として定義してください。」
即座に理解できないことが何度もありました。


##対策まとめ
・PHPに限らずプログラミングの文法をノートなどに、逆引き、検索できるようにまとめておく。
・自由課題実装の際には、コードを書けたら一度じっくりと確認する。
・テクニカルタームを覚える。
POPCOUNTで考えるSIMD

立っているビットの数（POPCOUNT）を数える鮮やかな方法があって、簡単なSIMDとなっていました。

## どのような方法で計算するか

CPUやJavaなど環境によっては[計算ルーチンが用意されています](https://qiita.com/jkr_2255/items/ec141731682a79f605d0)が、ない時はどのように計算すればいいでしょうか。まずは単純な方法を考えてみます。

### 1ビットずつ足していく

単純に1ビットずつ見て足していくという方法もありますが、桁数に比例して時間がかかってしまいます。

### 表引きにする

8ビット分なりを表にすれば加算の回数は減りますが、それでも桁数に比例する状況はそのままとなります。

ということで、これらの方法では桁数比例の時間がかかるのは変わりません[^1]。

## まずは1ビットの演算なんだし

1ビットずつ足していくとすれば、最初の結果は0～2の2ビットで収まります。なら、何ビットあるか知りませんがレジスタの全幅を使うのは無駄が多すぎます。なお、ビット幅が決まらないと定式化の際に問題が出るので、以下では32ビットとしておきます（いちばん下が0ビット、いちばん上が31ビット）。

0ビット目+1ビット目の結果を0ビット～1ビットの2桁に、2ビット目+3ビット目の結果を2ビット～3ビットに…というように2桁ごとに別々な計算をするようにすれば、一気に16ビットの足し算が終わってしまいます。おまけに、結果の境界を超えた繰り上がりが発生しないので、**単なる整数演算**でこの演算を行うことができます。

C言語で書けば、`val = (val & 0x55555555) + ((val >> 1) & 0x55555555)`のようになります（`0x55555555`は、1ビットおきに値を拾うためのマスクです）。

あとは同様に、2桁+2桁の足し算、4桁+4桁の足し算というようにすすめていけば、桁数の対数のステップで終わらせることができます。

## SIMDって？

3DCGなどのマルチメディア分野で顕著に見られますが、「大量のデータに同じ演算を行う」必要はよくあります。今回はたまたまふつうの整数演算で片付きましたが、現代のCPUやGPUには、長いレジスタに複数のデータを突っ込んで、複数の演算を並列で一気に行う、SIMD命令が搭載されています。


[^1]: 桁数にかかわらず整数どうしの演算は定数時間でできる、という前提です（多倍長演算で足し算も桁数に比例する時間がかかる、ような場合は考慮していません）
機械学習論文読みメモ_147

[Mix-and-Match Tuning for Self-Supervised Semantic Segmentation](https://arxiv.org/abs/1712.00661)
Semantic segmentationタスクにおいては事前学習としてCOCOやImageNetなどの大規模データセットが用いられる。
しかしこうしたデータセットのラベリングは高コストである。
そのためラベルを必要としないself-supervisedなsemantic segmentation手法が最近提案されてきている。
こうした手法はimage colorizationなどの代理タスクを用いたself-supervised学習を通して画像の特徴を
学習させる。
しかしこうしたタスクは結局、semantic segmentationタスクにとって重要な特徴を学習させる
事が未だ難しくなっている。
本論ではこの問題を解決する手法としてmix-and-match (M&M) tuningを提案する。
この手法は通常のself-supervisionタスクに簡単に組み込む事が可能である。
この手法は、targetタスクの限られたラベルとself-supervisedタスクを繋げる事で実現する。
まずmixステップでは、targetタスクのラベル付きデータからサンプリングを行い、
self-supervised学習用のデータに混ぜる事で、targetドメインの情報を入れ込む。
Matchステップでは、class内と外のdiscriminative lossを導入する事で特徴分布をtargetの
分類に即した形に正則化する。

[A Closed-form Solution to Photorealistic Image Stylization](https://arxiv.org/abs/1802.06474)
Photorealistic style transferでは、画像内のコンテンツに対して参照画像のスタイルを現実性を損なう事なく
適用するタスクを行う。
従来多くの手法が提案されてきたが、未だ空間的に一貫性のある画像の生成は難しくなっている。
本論ではこうした問題を解決できる手法を提案する。
提案手法はstylization stepとsmoothing stepに分かれる。
Stylization stepはコンテンツ画像に、スタイル画像のスタイルを適用する。
Smoothing stepでは空間的に一貫性が出るように画像を変換する。
従来手法と違い、本手法はどちらのステップも閉形式で解くことができる。

[Joint 3D Proposal Generation and Object Detection from View Aggregation](https://arxiv.org/abs/1712.02294)
新たにAggregate View Object Detection network (AVOD)を提案する。
この手法はLiDARとRGB画像を両方入力として用いるネットワーク
により特徴抽出を行う、その特徴の上にregion proposal network(RPN)及び
Second stage detectorの2つを適用する。
提案するRPNはマルチモーダルなsensor fusionをhigh resolutionな特徴空間に対して
適用できる。
これによって３D object proposalを複数の物体クラスに対して予測可能になる。
これらproposalに基づき、second stage detectorは抽出してある特徴マップと共に
より正確な3D object bounding boxを予測し、そのクラスも予測する。
ざっくり、Homebrew導入

#はじめに
MacにHomebrewを導入した際の手順を簡単にまとめてみました。

#Homebrewとは
Mac OS用のパッケージ管理システムです。
Macのターミナル（コマンドライン）から、ソフトウェア（ex.PHP、Pythonなど）などを簡単に導入出来るようにするものです。

#環境
Mac OS Mojave Version 10.14

#手順

###1. ターミナルを起動
Macでは、ターミナルが標準装備されています。

「アプリケーション」の中の「Utilities」フォルダーの中にある、ターミナルを開きます。
(command + spaceを押して「ターミナル」でもOKです)


###2. Command Line Toolsのインストール

ターミナルを起動したら、Homebrewをインストールするのに必要なコマンドを入力します。

`xcode-select --install`

上記のコマンドをターミナルに打った後に、いろいろな画面が表示されると思いますが、
インストールや同意するを押して進めます。

「ソフトウェアがインストールされました」と表示されればOKです。
Command Line Tools が正しくインストールされると, 次のコマンドでインストールされたバージョンを確認できます。

`xcode-select -v`


###3. Homebrewのインストール
非常に簡単です。
[Homebrewの公式HP](https://brew.sh/index_ja)から、インストール用のスクリプトをコピーしてターミナルに貼り付けるだけです。

![](https://original-game.com/wp-content/uploads/2016/05/homebrew2-1.jpg)

`Installation successful!`と表示されればOKです。


#最後に

下記のコマンドを入力して、`Your system is ready to brew.
 `と表示されれば導入成功です。

`$ brew doctor`


以上、ざっくりですがHomebrew導入についてでした！
お疲れ様でした。
初めてのVulkanプログラミング step2 論理デバイスの生成


[目次に戻る](https://qiita.com/tositada_nakada/items/db0f01c1c8c2945f786b)

ソースコードは以下の場所に置いておきます。各自のバージョンに合わせたプロパティ設定をしてから自由にご利用ください。
[github:  VulknAppAdocal2018](https://github.com/nakadasanda/vulkanAppaddcal2018)


使用する物理デバイスを選択したら、それとインターフェースをとるための論理デバイスを設定する必要があります。論理デバイス作成のプロセスは、インスタンス作成のプロセスに似ています。deviceに必要な情報,作成したキューをなどを論理デバイスの作成時に指定します。またさまざまな要件がある場合は、同じ物理デバイスから複数の論理デバイスを作成することができます。

##作成するキューを指定する

論理デバイスの作成には、queuefamilyを指定してあげる必要があります。現時点では、グラフィクス用途の機能しか考えていません。

```c++
float queue_priorities[]{ 1.0f };
	VkDeviceQueueCreateInfo device_queue_create_info{};
	device_queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
	device_queue_create_info.queueFamilyIndex = 0;// TODO Choose correct queuefamily index
	device_queue_create_info.queueCount = 4; // TODO  Check if this amount is valid
	device_queue_create_info.pQueuePriorities = queue_priorities;
```
vulkanでは、浮動小数点を利用してコマンドバッファのスケジューリングの優先度をキューに割り当てます。これは、単一のキューしかない場合にも必要です。

キューファミリーindexとキューカウントは、今回直接調べて代入していますが、動的にqueufamilyPropertiesを参考にして選択することができます。一例として自分は、以下のように設定します。

キューファミリーインデックス
**queufamilyProperties[i].family_property[i].queueFlags**の中で自分の使いたいキューファミリー機能があるもの。

キューカウント
**queue_family_property[i].queueCount**

そして、**vkCreateDevise**関数を呼び出して、論理デバイスをインスタンス化する準備が整いました。

```cpp
VkDeviceCreateInfo device_create_info{};
	device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
	device_create_info.queueCreateInfoCount = 1;
	device_create_info.pQueueCreateInfos = &device_queue_create_info;
	auto err = vkCreateDevice(_gpu, &device_create_info, nullptr, &_devise);
```
**vkCreateDevice**のパラメータは、接続される物理デバイス、先ほど指定したキュー及び仕様情報、オプションの割り当てコールバックポインタ、作成した論理デバイスハンドルを格納する変数のポインタです。この関数の返り値を参照することで、作成が成功したかどうか確認することができます。

## 連絡先

tweeter: [tositada_nakada](https://twitter.com/nakadasanda17)
mail: nakadasanda@outlook.com

## 寄付

paypal: [tositada_nakada](https://www.paypal.me/nakadasanda)
Amazon: [欲しいものリスト](http://amzn.asia/fGpGuJo)
Ubuntu Server 18.04 で AMIを作成後繋がらなくなる

色々原因はあるかと思いますが、私の今回のケースは**デスクトップ環境**をインストールしたのが理由の模様。

## 環境
・Ubuntu Server 18.04 LTS (HVM), SSD Volume Type
・t3.small
**Ubuntu Mate Desktop**をインストール後AMIを作成、AMIから起動すると**SSHなど外部からのアクセスが繋がらなくなる**
※AMI構築にはPakcerを利用

## 解決策
`/usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf`を削除してからAMIを作成

## 原因
NetworkManagerがNW設定の諸々を無効化してしまうからの模様

```10-globally-managed-devices.conf
[keyfile]
unmanaged-devices=*,except:type:wifi,except:type:wwan
```

## 参考
https://askubuntu.com/questions/838865/network-manager-refusing-to-manage-wired-interfaces
もしもjustInCaseの保険APIでハッカソンを開いたら

# もしもjustInCaseの保険APIでハッカソンを開いたら
この記事は[国産Web API Advent Calendar 2018](https://qiita.com/advent-calendar/2018/apijp/)参加記事です。

justInCaseでは、Webサービスを提供するお客様が自社のエンドユーザーに保険商品を提供できるような[保険API](https://justincase.jp/api/)の開発を進めています。
今回保険APIについてご紹介できる機会をいただいたので、「もしもjustInCaseの保険APIでハッカソンを開いたら？」と題し、世界中のハッカソン生まれのプロジェクト✖️保険APIで何ができるかを考えてみます。

# ルール
* ハッカソンのプロジェクトを紹介するWebサイトを[横断的に検索](http://hackathons.hiroga.cc.s3-website-us-east-1.amazonaws.com/)して、その中で保険APIと組み合わせて面白そうな3+1アイデアを選びました。
* チョイスはブログを担当した[@hiroga_cc](https://twitter.com/hiroga_cc)の独断と偏見によるものです。
* ここでご紹介したアイデアは、justInCaseの保険商品開発とは全く関係ありません。

# 自動車 ✖️ 生体情報 ✖️ 保険API
https://protopedia.net/prototype/0c048b3a434e49e655c1247efb389cec

生体情報を日常的に取得するための方法の一つとして、自動車のハンドルにセンサーを取り付けるアイデアがあります。
日本のマッシュアッププロジェクトの記録サイト"Protopedia"からチーム"レッドインパルス"の作品です。

もしもこれを保険APIを組み合わせると、姿勢や脈拍のデータを元にAIが保険料を算出できるようになりますね。
正しい姿勢で運転していると安全スコアが高まり、保険料が安くなる...なんてこともあるかもしれないですね！

# ライフセーバー ✖️ 保険API
https://devpost.com/software/mercury-motion-the-real-time-life-saver

海での事故の予防のため、スマホのセンサーのデータを元にアプリからライフセーバーへ自動通報するアイデアがあります。
2015年にIBMが主催した"Bluemixathon"で提案されたアイデアです。

アイデアの中でも言及されていますが、保険APIを組み合わせるなら、保険金の支払い査定のためのデータをアプリから自動送信したいですね。保険金請求そのものを自動化することもできそうです。
保険金請求をAPI化することによって、請求の窓口がIoTにまで広がるのは夢がありますね！


# 緊急出産 ✖️ 保険API
https://devpost.com/software/trinity-health

スタンフォード大学が主催したハッカソン"health++"から、母子の健康に関わるアイデアです。
このアイデアは、ナイジェリアの妊産婦が専門技能を持った分娩介助者の助けを受けられないのはコストの問題と考え、それを保険で解決しようとしています。
そのための鍵となるのが、持続可能な収益をあげられることと低額な保険料の両立です。

justInCaseでは保険料をAPIで提供するため、その人のリスクに応じた保険料を提示しやすくなっています。
また、専門家を呼ぶ際のコストを保険API経由で直接支払うことも考えられますね。

# おまけ: CLI ✖️ 保険API
https://devpost.com/software/solartis-quotes

terminalから保険に加入できるアイデアを見つけました。
すっごく面白いけど誰得だろう...（褒め言葉）

# まとめ
他にも保険APIと組み合わせて面白そうなアイデアはたくさんあったのですが、紹介しきれず残念です。
justInCaseでは保険APIを鋭意開発中です！皆さんに面白い使い方をしてもらえる日を楽しみにしています！
VSCODEでLaTexを書こう

#はじめに
この記事は以下の人を対象にしています
・vscodeはある程度わかるがsetting.jsonの書き方がわからない人
・LaTexの事がよくわからない人
それ以外の人は下記の記事を読んだ方が詳しく書いてあります。

[最速で最小構成のLaTeX環境をVSCodeに構築する](https://qiita.com/geek_shanshan/items/d2b6218bbd66e3f62497
)
[とりあえずVisual Studio CodeでLaTeXを書く](https://qiita.com/keisukesato-ac/items/e0de3ada8960a6b69a69
)

#導入環境
MacOS　Mojave　バージョン10.14.2
Visual Studio Code バージョン1.30.1 (1.30.1)
Tex Live　バージョン1.35 (1.35)
Tex shop　バージョン4.21 (4.21)
LaTeX Workshop　

#各種インストール
公式Wikiを見るとわかりますが、様々な導入方法があります。
自分は下記のリンク先でpkgファイルをダウンロードし、インストールをおこないました。
https://tug.org/mactex/mactex-download.html
vscodeのプラグインはLateX Workshopのみインストールで十分です。（LateX　Previewは不要です）

#vscodeの設定変更
vscodeのメニューバーのcode>基本設定>設定を開くとユーザー設定とワークスペース設定のタブが表示されます。
ユーザー設定のタブを選び、setting.jsonで編集をクリックし下記のコードを{}内にコピペしてください。

```
  "latex-workshop.latex.tools": [{
      "name": "ptex2pdf (platex)",
      "command": "ptex2pdf",
      "args": [
        "-l",
        "-ot",
        "-kanji=utf8 -synctex=1",
        "%DOC%"
      ]
    },
  ],
  "latex-workshop.latex.recipes": [
    {
      "name": "ptex2pdf (platex) * 1",
      "tools": [
        "ptex2pdf (platex)"
      ]
    },
  ],
  "latex-workshop.synctex.afterBuild.enabled": true,
  "latex-workshop.view.pdf.viewer": "tab"
```

#ビルド実行
vscodeでtexファイルを開くと、vscodeのアクティビティバーにTeXのアイコンが出ます。
選択するとCOMMANDSタブにBuild LaTeX projectがあるのでそこを選択するとビルド（多分コンパイルしてPDF化）が始まります。
ステータスバーにBuildと出てチェックマークが出たら成功です。
その後View　LaTex　PDFを選択すればリアルタイムに変更が表示されるPDFが見れます。

#ビルドエラーが出るときや中々終わらないときは
vscodeの出力で出るエラーを読んでください
自分の場合はuptexのパッケージが不足してたので、LaTex　Workshopで導入しました。

###platexできない(command not found)
Tex shopやTex Liveのバージョンアップを行ってください
メニューバーから行えます
Tex shop:Texshop>アップデート確認
Tex Live:Tex Liveユーティリティー>更新があるか確認
クリスマスイブなのでVue.jsでタイピングゲーム作ってみた

# :rainbow: これ :rainbow: 

http://nena3.xii.jp/vue-typing/


# :rainbow: github :rainbow: 
https://github.com/babu-ch/vue-typing-game

# :rainbow: なぜ作ったか :rainbow: 
CSSとVueのお勉強のため
文字をふわふわさせる部分とダメージ時のエフェクトにCSS Animationを使用しています
コード部分はVueとVuex、あと少しのunderscoreで作られています

# :rainbow: どういう構造なのか :rainbow: 
これでわかるかな？
![typing.png](https://qiita-image-store.s3.amazonaws.com/0/329559/ff3656c9-6e5e-30ec-430d-e09c90686a95.png)


# :rainbow: 困っているとこ :rainbow: 

**入力された文字と変数の一文字目だけで判定しているので以下のようなパターンに対応できていない**
「つ」 -> tsu, tu
「ちゃ」 -> tya, cha

**ノリでかいているので変なコードがあるはず**
バグあるかも

**途中から難しくなりすぎなきがする**
ゲームっぽい要素欲しいですね
長いもじ程回復量が高いとか

**キーのイベントは誰が受け取るのが正しいのか？**
現状はSting.vueという入力されたら変数の一文字めと一致していたら文字列からshiftするコンポーネントが受け取っている
各コンポーネントごとにそれをやったほうがいいのか？
それともそういうオブジェクトを作ってなんとかする？（やり方が不明）

**（そもそもVuexの使い方あっているのか？？）**
わからん

**sakuraレンタルサーバーにnpm入れたい。。。**
めんどくさそう
開発／ネットスラング

ネットスラングは便宜上記載したけど、基本は開発の時に使われている（自分はあまり使わないのだけれど）スラングをメモ。

# A

## ASAP
as soon as possible
「できるだけ早く」の意。
これを聞くと何故かPPAPが思い浮かぶ。

## ASIS
as is
「現状」の意。
スラングではない気がするけどよく使う。


# F

## FYI
for your information
「参考までに」の意。

# I

## IMO
In My Opinion
「私の意見としては」の意。
ネイティブの印象としては、言いにくいこと切り出すときに使う感じらしい。
開発の現場ではそこまで考えているか謎。

# L

## LGTM
Looking Good To Me
「私には良いように見える」→いいんじゃね？
レビューOKの意味で使っている。

## LGTM with nits
nitsで調べても何の略？　→　nitが「一言ある」みたいな指摘事項の意味だった。
「本質には関係ない指摘はあるけどLGTM」みたいなことらしい。
参加したプロジェクトでは「LGTMだけどちょっと指摘あって、再レビュー要らないから」という意味で使っている。

# R

## REPL
Read-Eval-Print Loopとは、入力・評価・出力のループのこと。
主にインタプリタ言語において、ユーザーとインタプリタが対話的にコードを実行する。

## RTFM
Read The Fine Manual
マニュアル読め。（良いドキュメントがあるから読んでね）

#T

## TBC
To Be Confirmed
「確認中」「未定」の意。
```
すでに決定、もしくは発表されていても、変更の可能性がある場合に使われる。
つまり、これから最終確認をするときに使う表現。
```
らしい。

## TBD
To Be Determined
「将来決定する」→未定、未確定。

## TL;DR
Too Long; Didn't Read 
「長すぎて読めるか」→転じて「要約すると」
元々は「長文うざい」的な使い方らしいけど、最近Qiitaの投稿とかで内容の要約を書く場合に使っている印象。

## TOBE
to be
「あるべき姿」の意。
「こんな風にしたい」というニュアンスも私は感じる。
スラングではない気がするけどよく使う。

# Y

## yy
yes yes
yeah yeah
「そうそう」「それそれ」の意。

## YAGNI
You ain't gonna need it.
「必要になるまでやらない」の意。

久々に読めない原文だった。
ain'tって知らない単語だけど、便利な否定系っぽい。
is not、are not、have not、has notがain'tで使えると・・・。


# そもそも既にまとまってる情報
https://qiita.com/uasi/items/86c3a09d17792ab62dfe
https://www.nichibeieigo.jp/kotsukotsu/business/2150/

# 思うこと
自分はあまり積極的に導入しているわけではないけど、記号的に使っている。
こういう言葉も輸入するんだなぁと思いつつ、もっと日本語で分かりやすいものがほしいとは思いつつ。
[Bootstrap-Table] JavaScriptでテーブル表示（その2）

Bootstrap Table で前回紹介したUIと異なるデータ追加/更新方法を紹介します。

Bootstrap Table
http://bootstrap-table.wenzhixin.net.cn/

```Markdown:JavaScriptライブラリ
Bootstrap Table: 1.12.1
```

# 入力値の更新

テキストボックスやプルダウンの値が変更したら
変更した内容を更新するという実装になっています。
HTMLのIDから、テーブルのindexを取得します。
その後、`bootstrapTable('getData')`でデータを取得します。
以上から、`bootstrapTable('updateRow',{})`でデータを更新します。

```JavaScript:入力値の更新
}).on('change', '[id^=name_]', function () {
    var id = $(this).attr('id');
    var index = parseInt(id.replace('name_', ''));
    var dataList = userTable.bootstrapTable('getData');
    dataList[index].name = $(this).val();
    userTable.bootstrapTable('updateRow', { index: index, row: dataList[index] });
})
```

[デモはこちら](https://yunbow.github.io/sample-bootstrap-table/02/01/)
[ソースファイルはこちら](https://github.com/yunbow/sample-bootstrap-table/tree/master/02/01/)

以上です。

# 関連記事

[[Bootstrap-Table] JavaScriptでテーブル表示（その1）](https://qiita.com/yun_bow/items/f3f70b42584b7fb56ea5)
[[Bootstrap-Table] JavaScriptでテーブル表示（その2）](https://qiita.com/yun_bow/items/f95e67c0bdec8923b315)
[[Bootstrap-Table] JavaScriptでテーブル表示（その3）](https://qiita.com/yun_bow/items/4ca4620da895b131edb9)
[[Bootstrap-Table] JavaScriptでテーブル表示（その4）](https://qiita.com/yun_bow/items/c84acb7fd45fdd481d46)
[[Bootstrap-Table] JavaScriptでテーブル表示（その5）](https://qiita.com/yun_bow/items/d845a2b3389fc8ca7ae1)
【PHPデザインパターン】予備知識（アクセス権・抽象と実装・スコープ定義演算子・static宣言・コンストラクタ）

ゆるふわだった知識をまとめました。

デザインパターンは「振る舞いを保証する」という観点から、これらの特性がフル活用されています！

# アクセス権
- プロパティ、メソッド、定数に以下のキーワードをつけることにより設定できる。
- 明示しない場合は``public``となる。

> [php.net〜PHP: アクセス権](http://php.net/manual/ja/language.oop5.visibility.php)

## public
- どこからでもアクセス可能。

## protected
- 定義したクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセス可能。

## private
- 定義したクラスからのみアクセス可能。

### 親クラスでprivate宣言したプロパティを継承先で使う場合

親クラスのメソッドを通じてプロパティのセットや呼び出しができます。

> [[PHP] そのプロパティ、privateに出来ませんか？~プロパティを private にする](https://qiita.com/mpyw/items/1cb6fc8170b6a8c8eb04#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%82%92-private-%E3%81%AB%E3%81%99%E3%82%8B)

# 抽象と実装

## abstract

- ``継承（extends）``が使われる。
- 親クラスで``abstractと宣言された全てのメソッド（抽象メソッド）``は、継承クラスで定義しなければならない。
- 親クラスで抽象メソッドを実装することはできない。（外観を定義するだけ。）
- 親クラスの抽象メソッドで定義したアクセス権や引数は、継承クラスに影響を与える。

> [php.net〜クラスの抽象化](http://php.net/manual/ja/language.oop5.abstract.php)


## interface

- ``imprements演算子``を使って実装できる。（extendsで継承することもできるらしい・・・）
- 実装したクラスでは、``インターフェイスに含まれる全てのメソッド``を実装する必要がある。
- インターフェイス内では、メソッドの実装は全く定義されていない。
- インターフェイス内で宣言される全てのメソッドは、``public``でなければならない。
- クラスは複数のインターフェイスを実装することができる。

> [php.net〜オブジェクト インターフェイス](http://php.net/manual/ja/language.oop5.interfaces.php)

extendsとimprementsは、同時に使用することもできます。

>[前回記事〜【PHPデザインパターン】03_Adapter～APIを変更する](https://qiita.com/33yuki/items/ad5966951fb92e274e57)

```DisplaySourceFileAdapter.php
class DisplaySourceFileAdapter extends MyShowFile implements DisplaySourceFile
```

# スコープ定義演算子 (::) 

- ``クラス名::メソッド名やプロパティ名``と明示することにより、メソッドやプロパティの属するスコープを定義することができる。
- クラス名を直に指定することもできる。

> [php.net〜スコープ定義演算子 (::)](http://php.net/manual/ja/language.oop5.paamayim-nekudotayim.php)
> [PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜](http://maeharin.hatenablog.com/entry/20130202/php_late_static_bindings)

## self

- スコープは、selfが記載されたクラスに属する。（自分自身のクラスを意味する。）

## parent

- スコープは、parentが記載されたクラスの親クラスに属する。

## static

### スコープ定義演算子としてのstatic

- 直近の``非転送コール``のクラス名を保存する。（？？）
- スコープは、実行時に最初にコールされたクラスに属する。
- 親クラスで``static::``が使用されたメソッドを継承クラスでコールすると、そのスコープは継承クラスに属する。

公式サイトの例がわかりやすかったです。
selfと比較してみると良さそうです。

> [php.net〜遅延静的束縛 (Late Static Bindings)](http://php.net/manual/ja/language.oop5.late-static-bindings.php)

# staticキーワード 

- staticとして宣言することで、クラスのインスタンス化の必要なしにアクセスすることができる。

> [php.net〜static キーワード](http://php.net/manual/ja/language.oop5.static.php)

## staticなメソッド
- オブジェクトのインスタンスを生成せずにコールすることができる。
- インスタンス化されたクラスオブジェクトからアクセスすることができる。
- static宣言したメソッドの中では、疑似変数``$this``を使用することはできない。（selfキーワードを使用する。）

## staticなプロパティ
- インスタンス化されたクラスオブジェクトからアクセスすることができない。（矢印演算子（->）でアクセスすることができない。）

# コンストラクタ

- 新たにオブジェクトが生成される度にコールされるメソッド。
- オブジェクトを使用する前に必要な``初期化``を行うことができる。
- 子クラスがコンストラクタを有している場合、親クラスのコンストラクタが暗黙の内にコールされることはない。（``parent::__construct()``を記述する必要がある。）
- 子クラスでコンストラクタを定義していない場合は、親クラスのコンストラクタを継承する。
- 親クラスのコンストラクタが``private宣言``されている場合は、子クラスでは使用できない。

> [php.net〜コンストラクタとデストラクタ](http://php.net/manual/ja/language.oop5.decon.php)
copperでラベルとネームスペースvalidation

[Kubernetesのマニフェストのテストツールを調べてみた - Qiita](https://qiita.com/inajob/items/759a0063d455a2fbaaae)で紹介されているCopperを利用してみた。
コメントラインをドキュメント通りやってもシンタックスエラーがでたり、上記ページでも書かれているがすこし実装が怪しい。簡単なvalidationに用いるくらいならとりあえず便利かも。以下のユースケースでのexampleを考えてみた。

- リソース管理のために、ラベルづけを強制したい
    - ただし以下の例ではyamlのトップレベルのlabel確認しかできていないためDeploymentのpodのlabelが確認できていない、、、。良い方法ないものか。
    - 一旦、ないよりかはましという感じで使ってみるかなあ
- namespace指定を強制したい
    - 全種類のリソースを確認するので、ネームスペースで分離されないリソースは例外として外す必要がある
    - とりあえず以下の例ではClusterRoleBindingだけ外しておいた

# rule.cop
```
rule existLabel ensure {
   fetch("$.metadata.labels['app']").count == 1
}

rule existNamespace ensure {
   fetch("$.metadata['namespace']").count == 1
   or
   fetch("$[?(@['kind'] == 'ClusterRoleBinding')]").count == 1
}
```
[Bootstrap-Table] JavaScriptでテーブル表示（その1）

Bootstrap Table のテーブルを使用したサンプルプログラムを紹介します。

Bootstrap Table
http://bootstrap-table.wenzhixin.net.cn/

```Markdown:JavaScriptライブラリ
Bootstrap Table: 1.12.1
```

# ライブラリの読み込み

以下の2ファイルを参照します。

```html:index.html
<link rel="stylesheet" type="text/css" href="../../lib/bootstrap-table/bootstrap-table.min.css" />
<script type="text/javascript" src="../../lib/bootstrap-table/bootstrap-table.min.js"></script>
```

# テーブルの作成

`bootstrapTable({})`でテーブルに表示するカラム定義とデータを指定します。

```JavaScript:テーブルの作成
userTable.bootstrapTable({
    data: initDataList,
    columns: [
        {
            field: 'name', // データ上のカラム名
            title: 'Name' // 表示上のカラム名
        },
        {
            field: 'age',
            title: 'Age'
        },
        {
            field: 'gender',
            title: 'Gender'
        }
    ]
});
```

[デモはこちら](https://yunbow.github.io/sample-bootstrap-table/01/01/)
[ソースファイルはこちら](https://github.com/yunbow/sample-bootstrap-table/tree/master/01/01/)

# データの取得

`bootstrapTable('getData')`でテーブルに表示しているデータを取得します。

```JavaScript:データの取得
var dataList = userTable.bootstrapTable('getData');
```

[デモはこちら](https://yunbow.github.io/sample-bootstrap-table/01/02/)
[ソースファイルはこちら](https://github.com/yunbow/sample-bootstrap-table/tree/master/01/02/)

# 選択したデータの削除

`bootstrapTable('getSelections')`でテーブルのチェックボックスで選択しているデータを取得します。
`bootstrapTable('remove', {})`でテーブルに表示しているデータを削除します。

```JavaScript:選択したデータの削除
var idList = $.map(userTable.bootstrapTable('getSelections'), function (row) {
    return row.id;
});
userTable.bootstrapTable('remove', { field: 'id', values: idList });
```

[デモはこちら](https://yunbow.github.io/sample-bootstrap-table/01/03/)
[ソースファイルはこちら](https://github.com/yunbow/sample-bootstrap-table/tree/master/01/03/)

# データの追加

`bootstrapTable('insertRow', {})`でテーブルにデータを追加します。

```JavaScript:データの追加
var dataList = userTable.bootstrapTable('getData');
userTable.bootstrapTable('insertRow', { index: dataList.length, row: rowData });
```

[デモはこちら](https://yunbow.github.io/sample-bootstrap-table/01/04/)
[ソースファイルはこちら](https://github.com/yunbow/sample-bootstrap-table/tree/master/01/04/)

# データの更新

`bootstrapTable('updateRow', {})`でテーブルにデータを更新します。

```JavaScript:データの更新
var rowIndex = $('#rowIndex').val();
userTable.bootstrapTable('updateRow', { index: rowIndex, row: rowData });
```

[デモはこちら](https://yunbow.github.io/sample-bootstrap-table/01/05/)
[ソースファイルはこちら](https://github.com/yunbow/sample-bootstrap-table/tree/master/01/05/)

以上です。

# 関連記事

[[Bootstrap-Table] JavaScriptでテーブル表示（その1）](https://qiita.com/yun_bow/items/f3f70b42584b7fb56ea5)
[[Bootstrap-Table] JavaScriptでテーブル表示（その2）](https://qiita.com/yun_bow/items/f95e67c0bdec8923b315)
[[Bootstrap-Table] JavaScriptでテーブル表示（その3）](https://qiita.com/yun_bow/items/4ca4620da895b131edb9)
[[Bootstrap-Table] JavaScriptでテーブル表示（その4）](https://qiita.com/yun_bow/items/c84acb7fd45fdd481d46)
[[Bootstrap-Table] JavaScriptでテーブル表示（その5）](https://qiita.com/yun_bow/items/d845a2b3389fc8ca7ae1)
円と円の当たり判定を使った簡単なシューティング　

#はじめに
今回は簡単なゲーム作りを通して円と円の当たり判定を学んでいきましょう。
前提
if,for,変数などが分かる

数学的な話は苦手なのでググってください。

作るゲームはこんな感じです。
![図1.jpg](https://qiita-image-store.s3.amazonaws.com/0/162983/6ca1c8e5-df8f-6e35-849c-558972369205.jpeg)

使う画像
![EDGE1.png](https://qiita-image-store.s3.amazonaws.com/0/162983/73274827-b59f-2fb3-dca0-38e51ec3c929.png)




##数学的な話(少し)

円1：　半径　ｒ1 ,　中心　C1(Cx1,Cy1)
円2：　半径　ｒ2 ,　中心　C2(Cx2,Cy2)

使う公式
(Cx1-Cx2)^2 + (Cy1-Cy2)^2 ≦ (r1+r2)^2

以上の公式が成り立っていれば当たっています。

これオブジェクトの数だけ繰り返せばどれが当たっているか分かります。
簡単ですね。ここまで読んだならもうできる。

##当たり判定の実装

```javascript:main.js

enemys.forEach(enemy => {
        let sc = 0
        if (enemy.isDead) {
            return
        }
        bullets.forEach(bullet => {
            //敵
            const er = enemy.width / 2
            const enemyCenterX = enemy.x + enemy.width / 2
            const enemyCenterY = enemy.y + enemy.height / 2
            //弾
            const br = bullet.r
            const bulletCenterX = bullet.x + enemy.width / 2
            const bulletCenterY = bullet.y + enemy.height / 2
            
            const x = (enemyCenterX - bulletCenterX) ** 2
            const y = (enemyCenterY - bulletCenterY) ** 2
            const r = (er + br) ** 2
            //成り立っていれば敵と弾が消える
            if (x + y <= r) {
                enemy.isDead = true
                bullets.splice(sc, 1)
            }
            sc++
        })
    })
```
実装結果
![Page Title - Google Chrome 2018-12-24 07.47.31.png](https://qiita-image-store.s3.amazonaws.com/0/162983/ff3c875d-2cce-825c-70ba-65aceff1d5ee.png)
動くものは[こちら](https://hiragyukina.github.io/shootingCollision/)
aが左移動
dが右移動
eで弾を打つ




#終わりに
全体の実装は[ここ](https://github.com/HiragYukina/shootingCollision)に置いておきます。
今回は大学1・2年生の少しプログラムが書ける人向けに書いてみました。
あまり難しくないが２Ⅾゲームを作る時多用するので覚えておくといいと思います。

#参考

2D衝突　その３　点と円、円と円
http://marupeke296.com/COL_2D_No3_PointToCircle.html
Python3の標準入力やり方まとめ

## はじめに
今年は、paizaなどのサイトでプログラミングチェックを行うことが時々ありました。その際に手こずったのが、標準入力のコーディング方法です。
今回の記事では、自分へのメモ書きの意味も込めてPython3の標準入力の方法をまとめてみました。

## 標準入力にはinput関数
標準入力をするには、input関数を使います。input関数はキーボードに入力されたデータを受け取るためのの関数になります。
ただしinput関数は入力されたデータを文字列で扱うので、入力された数値をそのまま数値として扱い場合には、int関数またはfloat関数を使います。
また整数型の入力データ1をfloat整数で受け取った場合には、1.0になることにも注意が必要です。それでは、実際にコードを使って値を取得したいと思います。

## 1行に1つの文字列の入力を取得し、出力する
```
例)入力：s

str = input() # sを取得し、strに値を入れる
print(str) #出力：s
```

input()で入力文字列sを取得し、print(str)によってsの値を出力することができます。文字列の前後の空白を取り除くstrip()も用意されていて、

```
str = input().strip()
```

という書き方もできます。

## 1行に1つの整数の入力を取得し、整数として取得する

```
例)入力：i

int = int(input()) #iを取得し、intに値を入れる
print(int) #出力：i
```

入力整数iを取得し、整数iのまま出力します。

## 1行に複数の入力値を取得し、出力する

```
例)入力：s_1 s_2

s = input().split() #s_1 s_2を分割して取得し、sに値を入れる
print(s) #出力：['s_1', 's_2']
print(s[0]) #出力：s_1
print(s[1]) #出力：s_2
```

split()は、半角スペースだけでなく、カンマsplit(',')、スラッシュ('/')の分割も可能です。

## 1行に複数の整数の入力を取得し、整数として出力する

```
例)入力：i_1 i_2

i = list(map(int, input().split())) #i_1 i_2を取得し、iに値を入れる
print(i[0]) #出力：i_1
print(i[1]) #出力：i_2
```

## 複数行に複数の入力値を取得し、出力する

```
例)入力：
s_1
s_2
s_3

s = [input() for i in range(3)]
print(s) #出力['s_1', 's_2', 's_3']
```

input関数の文字列に含まれる改行は無視される点に注意が必要です。
複数行に複数の整数を取得し、整数として出力する場合には、

```
i = [int(input()) for i in range(3)]
print(i) #[i_1, i_2, i_3]
```

で入出力することができます。

## 最初に入力回数、次に入力値を取得し、出力する

```
例)入力：
N
s_1
s_2
s_3
...
s_N

N = int(input()) #1行目のNを取得する
s = [input() for i in range(N)] #複数行の数値の入力を取得
print(s) #出力：['s_1', 's_2', 's_3', 's_N']
```

以上、Python3における標準入力やり方まとめでした。
ディスクコピー

■
fdisk -l |grep /dev/sd
pvscan
vgscan
lvscan

vgdisplay

umount /test
vgchange -a n vg02

vgimportclone /dev/sdc1

pvscan
vgscan
lvscan

vgchange -a y vg02
vgchange -a y vg021

mkdir /test2

mount /dev/mapper/vg02-lv01 /test

mount -t xfs -o ro,nouuid /dev/vg021/lv01 /test2


[root@tdb01 ~]# xfs_admin -U generate /dev/vg021/lv01
Clearing log and setting UUID
writing all SBs
new UUID = 94270df5-c24e-4abd-a4d0-32918a36eadb



■vg削除
lvscan
vgscan
pvscan

umount /test2

vgchange -a n vg021

vgremove vg021

lvscan
vgscan
pvscan

pvremove /dev/sdc1

pvscan


---
@echo off

REM ■バッチ名
REM RPリポジトリ外部バックアップ

REM ■処理概要
REM DドライブのRPのバックアップデータをNASにコピー（バックアップ）する。

REM ■処理対象
REM コピー元：D:\PLANET\BACKUP、D:\PLANET_STAR\BACKUP
REM コピー先：backup\01_databackup\PLANET、backup\01_databackup\PLANET_STAR

REM 変数設定
set src1=D:\PLANET\BACKUP
set src2=D:\PLANET_STAR\BACKUP
set dest1=\\192.168.1.111\Landisk\backup\01_databackup\PLANET
set dest2=\\192.168.1.111\Landisk\backup\01_databackup\PLANET_STAR

REM 前々日分削除
del /F /Q %dest1%\OLD\*
del /F /Q %dest2%\OLD\*

REM 前日分退避
move %dest1%\CURRENT\* %dest1%\OLD
move %dest2%\CURRENT\* %dest2%\OLD

REM 当日分コピー
xcopy /e /h /d %src1% %dest1%\CURRENT
xcopy /e /h /d %src2% %dest2%\CURRENT
[Practical BEAR.Sunday] 続・Aura.Filter カスタムバリデーションの作成

## はじめに

### [Aura.Filter](https://github.com/auraphp/Aura.Filter) カスタムバリデーションを作るときの課題

- [既出の記事のやり方](https://qiita.com/kumamidori/items/7ca139b7103f2b2c3aa3) には設計上の問題点がありました。カスタムフィルターの構成設定をBEARの `プロバイダー` クラス内に定義しているので、 `構成の知識` が埋もれて分かりにくい状態になっているのです。

- [satomif/ExtraAuraFilterModule](https://github.com/satomif/ExtraAuraFilterModule/) は `設定ファイル` を提供することでこの問題を解決していました。ですが、このモジュールには使用上の制約がありました。ユーザサイドでオブジェクト生成を行う（手組みによる `new` が行われる）ものであるため、`DI` 基盤（オートワイヤリングの機能）をサービスクラス定義に使いたいというケースだと利用することができないのでした。

### この記事では・・・

上記課題を解決するために、「設定ファイルでカスタムルールを設定できて、カスタムフィルターサービスでは普通にDIを使うこともできる」というモジュールを作ったことを書きます。

## 方法の検討：拡張フレームワークにおけるDIインジェクタ利用

BEARアプリケーションではDIインジェクタへの直接の依存は一行も無いのが普通です。DIインジェクタを使わないスタイルを守りつつも前述した課題を解決できる方法が必要と感じました。
そこで、アプリケーションではなく、「フレームワーク拡張モジュール」という位置付けでフレームワークサイドでDIインジェクタを利用することを考えました。フレームワークではDIインジェクタを、必要に応じて用法用量を守って（？）使おうというアプローチです。

## Fob.DiAuraFilterModule 

この方法で実際に作ってみたモジュールが下記です。

- [Fob.DiAuraFilterModule](https://github.com/kumamidori/DiAuraFilterModule)

以前仕事で「PHP連想配列形式の設定ファイル」で構成定義ができるモジュールを開発していたのですが、せっかくなので今回は新たに [FormalBears](https://github.com/kumamidori/FormalBears) を使ったバージョンのモジュールを書きました。

### 使い方

#### セットアップ

1. カスタムフィルターサービスの各クラスはあらかじめ束縛済みとします。
2. Fob.DiAuraFilterModule モジュールをインストールします。

```php
$this->install(new DiAuraFilterModule($this->registry));
```

#### 設定の書き方

バリデーターとサニタイザーのカスタムルールを設定します。カスタムルール名に対応させたいサービスクラスのFQCNを書きます。

例：

```yaml
di_aura_filter:
  # バリデーター構成
  validate_filters:
    # カスタムルール名に対応させたいクラス名を指定
    app.name_in:
      class: 'Fob\DiAuraFilterModuleDemo\Bridge\AuraFilter\NamesValidator'
  # サニタイザー構成
  sanitize_filters:
    app.name_mask:
      class: 'Fob\DiAuraFilterModuleDemo\Bridge\AuraFilter\NameMaskSanitizer'
```

#### BEARアプリケーションでの使用例

```php5
class Hello extends ResourceObject
{
    private $vFilter;

    /**
     * @Inject
     * @Named("vFilter=fob.aura_filter.service_value_filter")
     *
     * @param ValueFilter $vFilter
     */
    public function __construct(ValueFilter $vFilter)
    {
        $this->vFilter = $vFilter;
    }
    
    public function onGet(string $name): self
    {
        // 例なので素朴な実装にしてある
        $success = $this->vFilter->validate($name, 'app.name_in');
        if (! $success) {
            throw new \UnexpectedValueException('name is not valid.');
        }
        $this->body['hello_message'] = 'Hello ' . $helloName;

        return $this;
    }
}
```

デモアプリケーションのソースコードをこちらに置きました。

- [Fob\.DiAuraFilterModuleDemo](https://github.com/kumamidori/Fob.DiAuraFilterModuleDemo)

詳細な説明は省きますが、任意のサービスコールバックを指定できる機能もあります。

## レビュー

- 私自身はDIが開発基盤としてすっかり手になじんでいるので、このやり方のおかげで便利になった、この箇所でやりたかったことに関しては全部できたと感じました。
- フレームワーク拡張というアプローチどう見るかは意見が分かれるところでしょうか。

## （p.s.）

今月は記事を2つ書きました。気に入っているフレームワークをたまたま仕事で使うことができて、活動を記事に残すこともできて良かったです。良いお年を！