OmniAICreator/Qiita-1.07M huggingface dataset:
Gradleのpropertiesをapplication.ymlから参照する

# 環境
Android開発環境じゃありません。
AndroidはBuildConfigFieldとか使ってた覚えがありますが、SpringBootで開発してる今はそんなもんありませんでした(勘違いだったらご指摘ください)。

# 経緯
gradle側とapplication側で同じ値を使うため、単純に二箇所に書きたくなかった事が発端でした。変えるときに絶対ミスするから2箇所に書きたくない。こんなん先人たちがやってるだろうとタカをくくったら全然資料ないし(ググり力足りない + 主に日本語の記事ばかり見てしまう)、四苦八苦しました。

# 方法
## propertiesを宣言する
ここは普通に書くだけです。

```gradle.properties
datasourceUrl=jdbc:mysql://localhost:13306/myApp?useSSL=false
datasourceUser=root
datasourcePassword=root
datasourceSchemas=my_app_db

applicationName=myApp
applicationVersion=0.0.1-SNAPSHOT
```

## build.gradleに以下を追加

```build.gradle

// ~~~~ 省略 ~~~~ //

import org.apache.tools.ant.filters.ReplaceTokens
processResources {
	filesMatching('**/application.yml') {
		filter(
				ReplaceTokens,
				tokens: [
						'applicationName': "${applicationName}".toString(),
						'version': "${applicationVersion}".toString(),
						'datasourceUrl': "${datasourceUrl}".toString(),
						'datasourceUser': "${datasourceUser}".toString(),
						'datasourcePassword': "${datasourcePassword}".toString()
				]
		)
	}
}

```

- filesMatching()
置き換えたい対象のファイルを指定します。指定しないと全ファイルが対象になります。

- filter()
対象の文字列を置き換えます。

```gradle
filter(
	ReplaceTokens, // ReplaceTokensを使う
	tokens: ['置き換えたい対象ファイルに記載したKEY': '${置き換えたいpropertiesのKEY}']
)
```


## 使う側

```application.yml
spring:
  profiles:
    active: local, development
  # MySQL接続情報
  datasource:
    url: @datasourceUrl@
    username: @datasourceUser@
    password: @datasourcePassword@
app:
  name: @applicationName@
  version: @version@
```

* 置き換えたい文字列を「@」で囲む。

# 終わり
これでクリーンビルドをすれば、ymlの値が置き換えられて参照できるようになります。
ymlから値を参照する方法は他に沢山資料があるのでそちらを。
EC2オンデマンドインスタンスのキャパシティ不足に備える（オンデマンドキャパシティの活用）

EC2はメンテナンスなどでStop/StartまたはAMIからのインスタンス作り直しが必要になることがままあります。
手軽さから、なるべく前者で済ませたいところ。

ただ、無対策でやっちゃうと、StopしたもののAWS側のキャパシティ不足によってStartできないってことも。。。


そこで、自分流オンデマンドキャパシティー予約について基本的な使い方↓
1: オンデマンド予約の作成　（終了は手動。targeted。）
2-a: 予約が成功したらインスタンス立ち上げ。立ち上げ確認後、予約登録をキャンセル。
2-b: 予約が失敗したら別のインスタンスタイプにするかなどの検討


要するにStop/Startする前にキャパシティチェックをする使い方です。

上記はあくまで、作業直前のタイミングでのキャパ確認です。
「キャパ予約できる＝キャパあり」って考えです。

完全性を求めるなら、キャパ予約からインスタンスを立ち上げ（AMIから立ち上げ）する必要があります。
キャパ予約したものがラスイチで、stop/startに失敗するリスクはゼロではないです。
その場合は、キャパ予約を使ってインスタンス起動することになるかと。

なお、常時Stop/Startできるようにする場合は予約をキャンセルしないなど、上記のフローは要件によってカスタマイズが必要です。

これまで、通常起動と同じ料金が課金されるオンデマンドキャパシティ予約の使いどころがピンと来ていませんでしたが、上記では活用できそうだなと思いました。


東京リージョンにおける旧版インスタンスの枯渇は結構深刻っぽいです。

上記のキャパ予約やAMIなどの事前対策とらずに、Stop/Startやっちゃうとサービス断の時間を長引かせてしまう可能性高いです。
ご注意を！
【AppleScript】Mojave以降でアクセス許可のメッセージが毎回出るのを防ぐ

AppleScriptをアプリケーション形式で書き出したものをmacOS 10.14(Mojave)で実行すると、以下のような確認ダイアログが毎回出てしまいます。
「"hoge"が"fuga"を制御するアクセスを要求しています。制限を許可すると、"fuga"の書類やデータにアクセスしたり、そのアプリケーション内で操作を実行したりできるようになります。」

どうやらMojaveでセキュリティが強化されたゆえの現象みたいです。
これを出ないようにするには以下のようにします。

```applescript
script MyScript
    -- ここに処理を書く
end script
on run
    local tempScript
    copy MyScript to tempScript
    run tempScript
end run
```
以下から引用して、コメントを変えただけですが。
https://stackoverflow.com/questions/52771415/how-to-make-a-script-that-doesnt-ask-permission-every-time-its-opened
解説の訳は、ざっくりとこんな感じでしょうか。
>通常のappは1度許可すればその後はダイアログは出ない。
>AppleScript製のものは終了時にスクリプト内のトップレベル変数の値が書き換わるので、実行するたびに別のappだと判断されて、毎回ダイアログが出る。

AppleScriptはドが付く初心者なのでトップレベル変数がなんのことかよく分かってないのですが、そういうことらしいです。
素人のjQuery奮闘記 その2

素人が手探りでjQueryでWebサイトによくある機能を作った奮闘記②です。

前回に引き続き、jQueryを学んでいきます。
今回はタブ機能を作成します。

#作るときの縛り
未知の技術を学ぶ練習も兼ねて、使えるメソッドを自分で判断し、組み立てる事ができるようになることを目標として、今回は縛りを設けて作成しています。


・[jQueryの公式リファレンス](http://semooh.jp/jquery/)のみ
・検索をかけるときは、「メソッド名　jQuery」という検索ワードのみ使用可
　「tab　作り方　jQuery」という書き方は、コードそのものが出てきてしまうのでNG
・命名規則は「FLOCSS＋BEM」を改変して使用。

#見本
![tab_mihon.gif](https://qiita-image-store.s3.amazonaws.com/0/349181/d9087eef-248c-d18d-f7f3-39074223ae3c.gif)

よく見るタブ機能です。
タブ部分をクリックすると、内容が切り替わります。

###HTML
使用するHTMLは以下です。

```HTML
<ul class="c-tab">
	<li class="c-tab__title highlight">タブ1</li>
	<li class="c-tab__title">タブ2</li>
	<li class="c-tab__title">タブ3</li>
	<li class="c-tab__title">タブ4</li>
</ul>

<ul class="c-tab c-tab__textBox">
	<li class="c-tab__text on">内容1</li>
	<li class="c-tab__text">内容2</li>
	<li class="c-tab__text">内容3</li>
	<li class="c-tab__text">内容4</li>
</ul>
```

###CSS
ベースとなるタブのスタイルをあてています。

```CSS
.c-tab{
	font-size: 1.4rem;
	display: flex;
}

.c-tab__title{
	background-color: #ccc;
	padding: 5px 5px;
}

.c-tab__text{
	display: none;
	width: 600px;
	text-align: center;
	padding: 20px;
	background: #99998a;
	color: #fff;
}

/*onがついたとき表示する*/
.on{
	display: inline-block;
}

/*わかりやすいように表示されているタブに色を付けるスタイルを追加。*/
.highlight{
	background-color: yellow;
}
```

#作ってみよー！
###使えるメソッドの検討
まず、クリックかきっかけとなってテキストが切り替わるのでclick()は使うでしょう。
次はどうやって切り替えるかですが、前回学んだクラスを付け替えることを利用して、クラスがついたものを表示させれば良さそう。なので、addClass()、removeClass()は使いそう！

ということで最初に検討を付けたのは
・click()
・addClass()
・removeClass()
です。

この時点で特に不足に気づきませんでした。作ってみながら考えます。

###失敗
早速作って見ました。
が、これらのメソッドだけでは「タブ1」をクリックしたときに対応する「内容1」を判別することが出来ず、クリックしても全く動きませんでした。どうやって、対応する内容を判別するか…。

リストの要素数は同じなので、クリックした「c-tab__title」何番目の要素なのかを取得し、それと同じ番号の「c-tab__text」を表示させればいいのでは？？？

ということで、新たに
・index()　－クリックした要素が何番目か取得する
・eq()        －引数に指定した番号の要素を呼び出す
を使用することに。

#もう一度作成
###JS

```JS
$(function(){
	$(".c-tab__title").click(function(){
		// クリックした要素が何番目の要素か取得
		var index = $(this).index();
		// 取得した番号のクラスを取得
		var text = $(".c-tab__text").eq(index);

		// クラスの付替え
		$(".c-tab__title").removeClass("highlight");
		$(this).addClass("highlight");
		$(".c-tab__text").removeClass("on");
		$(text).addClass("on");
	});
});
```

クラスを付け替える方法で、無事作成することが出来ました。
めでたしめでたし！
AWSをこれから開始する無課金男子に送る無料クーポンの話と落とし穴

# 概要

AmazonからAWSの無料クーポンが届いたので早速アカウント作成してAWSerに！
・・・だがしかし、無料クーポンすぐもらえなかった話です。


# メイン

## 前置き
AWSは通常無料クレジットがないため、AzureやGCPとは異なり意図しない課金が発生するリスクがある。
これは無課金男子にとっては脅威であり、可能なら他の選択をしたいところ。
だがしかし、AWSはしばらくNo.1クラウドであり続けるだろうし、日本では特にAWS一色の色合いが強い。（個人の感想）
ビジネス的なスキルも上げたいのであればAWSを回避し続けるのは得策ではない。

もしあなたが業務に関係なく初めてのクラウドデビューするのであれば、1年間の無料クレジットが付くGCPをお勧めしたい。
ただし、GCPはシェアがAWSと比較すると数倍小さいので、情報も少ないというデメリットはある。

参考までに、無課金にやさしいクラウド探し
https://qiita.com/qrusadorz/items/cae2be1232cc6ac52f27


## AWSから無料クーポンプレゼントのインビテーション？

私はAWSのアカウントは作っていないのだが、以前AWSのイベントに参加したことがある。
（本格的に開始するまで無料枠12か月を浪費したくないため(;^_^A）
その時登録したメアドにAWSから無料クーポンのお知らせが！！！

![AWS無料クーポン.png](https://qiita-image-store.s3.amazonaws.com/0/310578/4d36c07d-13c8-e16a-89fe-156760fe2936.png)

インビｷﾀ――(ﾟ∀ﾟ)――!!

浮かれていたけどググってみたら不定期＆全員参加可能な単なるキャンペーンｗ
2月はここ3年連続実施中？ほかにも1年に数回実施している模様。

まだ先でもいいかな？と悩んだけど、AmplifyがFirebaseと比較するに値しそうだということでついにデビューする決意をした。
今回逃した方も、デビュー時期にこだわらなければ数か月先に実施するだろうキャンペーンを待っていいと思う。
見てみたところ5月や9月にもやっていたようだ。
今年も必ずやるとは限らないので、あくまでデビューを急いでない方限定で(;^_^A
AWSのツイッターやFacebookで告知しているようなので、その辺のチェックをしておけばいいかと。


## AWSのクーポンもらうまで

キャンペーンページに行くとAWSアカウントを登録して、発行されるアカウントIDが必要らしい(;´Д｀)
なので最初に数ステップでAWSアカウントを作成。
必要なのはSMS認証で使用するスマホとクレジットカードorデビットカード。
一つ驚いたのが住所が英文字入力(´･ω｀･)エッ?
ローマ字で入力しといたけど郵便物が万が一あったなら届かないかも(;^ω^)

後ログイン後のコンソールはアメリカリージョンだったり、課金の通貨がドルだったり国際色強い・・・
これら変更可能だけどAzureと比較すると戸惑うのは確か。

驚きはありつつも無事登録してキャンペーンページに戻る。
また同じように個人情報入力してクーポンゲットと思ったのだが・・・


## 無料クーポンは後のお・た・の・し・み

ええと・・・届いたメールに涙目

![AWS無料クーポン2.png](https://qiita-image-store.s3.amazonaws.com/0/310578/9dedff5e-1124-8380-dcbc-b6064d57c4b5.png)

ずっとAWSデビューを待って待って待って悩んでデビューしてこれっすかm9(^Д^)プギャー

クーポンはくれてやる、だが、すぐにくれてやるとは言っていない、1年とも言っていない、1か月以内・・・優しい中間管理職ｒｙ

課金リスクはごめんなのでクーポンくるまで放置しますけど何か( ´ー｀)y-~~
やっぱりAWSは無課金には優しくないなぁ(;´Д｀)


## ついにクーポンクルゥ――(ﾟ∀ﾟ)――!!

2月14日に申し込んで3月14日に到着なので、ほぼほぼ一月後に来ました。
無料クーポン戦略を実施する場合、この空白の時間をしっかり加味しておきましょう(;^_^A

![AWSインビ.png](https://qiita-image-store.s3.amazonaws.com/0/310578/27af6ec0-1a05-cb64-14b4-3ed3a248aae4.png)


## 無料クーポンの使い方

公式ドキュメント。
https://aws.amazon.com/jp/apply-coupon/

届いたらこれの通りにやろうと思う。
(先行研究調査)野球中継の映像からシーンを検出したい

執筆中

# 目的
+ 野球中継においてシーンの検出（特に投手が投げる瞬間）について興味がある
+ 中継映像からシーンを検出している先行研究がないか調査する

# 見つかった先行研究
+ Baseball scene classification using multimedia features
+ Scene-based event detection for baseball videos
+ Automatic Baseball Video Tagging Based on Voice Pattern Prioritization and Recursive Model Localization
+ A robust scene recognition system for baseball broadcast using data-driven approach
+ Event detection in baseball video using superimposed caption recognition
+ An efficient pitch-by-pitch extraction algorithm through multimodal information

# Baseball scene classification using multimedia features
## 論文情報
https://ieeexplore.ieee.org/abstract/document/1035908
google scholarで"baseball scene"と検索して一番最初に出てくる論文。
2002年発表、被引用件数61。

## 概要
野球中継の映像を用いてシーン検出する際には、映像・画像・音声を複合的にみて検出することが大事であるといっている。手法としては[最大エントロピー法](http://kento1109.hatenablog.com/entry/2017/12/13/165302)を用いており、これを使うことで複数の情報ソースをまとめて考慮することができる。

## ひとこと
シーン検出をするにあたって映像ばっかりに気を取られていたが、たしかに音声は大事だ。他にも球速だったり状況を示すフレームも検出の際に重要な要素になってくると思う。
評価関数に最大エントロピー法を使うのは分かった（機械学習でもよくつかわれる手法だし）。でも、検出のアルゴリズム自体はどうなっているのかabstractを読んだだけでは分からなかったので、そこは本文をしっかり読みたい。

# Scene-based event detection for baseball videos

## 論文情報
https://www.sciencedirect.com/science/article/pii/S1047320306000538
google scholarで"baseball scene"と検索して二番目に出てくる論文。
2007年発表。被引用件数53．

## 概要
野球の中継映像は多数のカメラから成り立っている（シーンによって映しているものが全然違う）から、それを利用して物体検出をしようとする論文。手法としては隠れマルコフモデル(HMM)を使用。

## ひとこと
この論文を筆頭にマルコフモデルを用いてシーン検出している論文は多い。深層学習が流行る前の時代だからそうなのか。論文に登場する画像をパッと見た感じだと、結構しっかりと細かくシーン検出を行えていそう。

# Automatic Baseball Video Tagging Based on Voice Pattern Prioritization and Recursive Model Localization

## 論文情報
https://www.jstage.jst.go.jp/article/jaciii/21/7/21_1262/_article/-char/ja/

## 概要

## ひとこと


# A robust scene recognition system for baseball broadcast using data-driven approach

## 論文情報
https://dl.acm.org/citation.cfm?id=1282312

## 概要

## ひとこと

# Event detection in baseball video using superimposed caption recognition

## 論文情報
https://dlnext.acm.org/doi/abs/10.1145/641007.641073

## 概要

## ひとこと

# An efficient pitch-by-pitch extraction algorithm through multimodal information

## 論文情報
https://www.sciencedirect.com/science/article/pii/S0020025514008810

## 概要

## ひとこと
社内ブログ: Firestoreについて知っておいて欲しい事   

**このブログは、株式会社Penmarkの社内ブログを転送した物です**


Firestoreにデータを保存する時のルールをいくつか。

# IDを定義し、それをdocのフィールドに保存する
Firestoreには、docの追加時に自動でUUIDを生成する方法があるが、これには頼らずに、
**ドメインEntityを一意に識別するIDを定義し、それをFirestoreのdocのIDにも流用する。**
例えば、授業Entityなら、「授業名、開講学期、キャンパス、年度、担当教員、時限」で授業を一意に定めることができる。これは人間にとって識別しやすいIDになる他、後から簡単にデータを上書きできるようにもなる。(DDD本 P92を参照)

ID生成についての知識を持つべきかどうかはコンテクストによって異なる。
授業データをスクレイピングし、それをFirestoreに保存する`penmark-timetable`アプリのコンテクストには、当然ID生成の知識が必要となる。

```typescript
class Lecture{
    constructor(
        readonly title: string,
        readonly campus: Campus,
...
```
`penmark-timetable`のコードでは、上のようにコンストラクタではIDを受け取らず、インスタンス初期化時にID生成を行っている。

しかし、`penmark-app`のコンテクストではID生成の知識はあってはならない。クライアント側から授業データを追加することはできないからである。

```dart
class Lecture{
    Lecture(
        LectureId id,
        String title,
...

```

`penmark-app`のコードでは、上のようにコンストラクタで直接IDを受け取っている。

このように、コンテクストによってID生成の知識の有無の判断が必要になる。また、IDに限らず、Aggregateの関係等もコンテクストによって変わる。
例えば`penmark-app`ではLecture Aggregateの一部として Modify Entityがあるが、
`penmark-timetable`ではLectureはAggregateではない。これは直接コードを見て確かめること。


# データ型を厳格にする
例えば、日付(Date)オブジェクトをFirestoreで表現する際、

```json
{"date": "2000-1-1"}
```
や、

```json
{
  "date": {
    "year": "2000",
    "month": "1",
    "day": "1"
  }
}
```
ではなく、

```json
{
  "date": {
    "year": 2000,
    "month": 1,
    "day": 1
  }
}
```
が望ましい。
**データ構造を適切に表現すること。**

永続化機関(ここではFirestore)に保存するのは、ドメインEntityの永続化機関での表現となる。ここからわかるように、ドメインEntityの表現はPresentation, Domain, Infrastractureで異なる物となる。
**永続化機関での表現が、Presentation層での表現やDomain層での表現に依存しないようにする事。**

このために必要になってくるのが、DTO(Data Transfer Object)である。 [参考](https://martinfowler.com/eaaCatalog/dataTransferObject.html)

`penmark-timetable`ではシラバスからのデータ構造体をドメインEntityに変換するDTOや、
Firestoreでの構造とドメインEntityの間での双方向の変換に対応したDTOがある。

`penmark-app`ではドメインEntityを文字列として表現する為のDTOがある。

**ドメインモデルの適切な表現は各層毎に変わるので、DTOで変換する事により結合度が下げられる。この変換は一方向の場合もあれば、双方向の場合もある。**

# 不変性、変性の見極め
`penmark-app`では、授業データをユーザーデータの中にコピーする事によって、オフライン時での時間割確認や、時間割の読み込みのパフォーマンス向上を図っている。
授業データのタイトルや、キャンパス、時限など、未来永劫不変である部分をコピーしているので、元データの更新に伴うコピーデータの更新の必要も無い。
**データ構造での 変性 / 不変性 を分析し、docの別々の部分に保存する事。また、必要に応じて不変なデータのコピーを行うこと。**
API仕様書をAPIblueprintとaglioを使って作り、ブラウザに表示させるまで

#API仕様書をAPIblueprintを使って作り、ブラウザに表示させるまで

###参考１、API blueprint自体はツールではなく、このmarkdown記法にのっとったファイルを、他のツールでhtmlに変換する
http://neos21.hatenablog.com/entry/2018/08/08/080000

https://qiita.com/the40san/items/0f673a9fe8b72c4b0225

https://dev.classmethod.jp/server-side/api-document-with-api-blueprint/

https://blog.amedama.jp/entry/2016/03/08/202403

###node.jsのパッケージ管理ツールである、npmをインストール
https://qiita.com/aya_akatsuki/items/f70d0d1668ef867f7256

###macでnpmがインストールできないときは、アンインストールしてから再インストール
https://www.haneca.net/mac-npm-error/

###aglioをインストール
aglioとは？
API blueprintに沿ったmarkdown形式のファイルをhtmlに変換し、
サーバーを通じてブラウザでHTMLで表示出来る。
https://qiita.com/kai_kou/items/630f6c1e4e577518bd14

###参考２、aglio起動方法
https://techblog.gmo-ap.jp/2017/05/17/api-blueprint/

###参考３、aglioディレクトリに変換したい元のファイルを作成する
http://qs.nndo.jp/use-api-blueprint-with-aglio

aglioをインストール

```
npm i -g aglio
```

インストールできたら、API blueprintのフォーマットに沿って書いたファイルを、aglioをインストールしたディレクトリと同じ所に保存する（今回はアプリのルートディレクトリにした）

サンプルファイルを作成

```
$ touch apiblueprint.md(ファイル名はなんでも良い）
```

作ったファイルを、API blueprintのmarkdown記法で記述する

```
# GET /message
+ Response 200 (text/plain)
        Hello World!
```

作ったファイルをHTMLファイルに変換するため、以下をターミナルで入力
(-o オプションで出力を指定出来る)

```
aglio -i 作ったファイル名 -o XXXX.html(出力先のファイル名。HTMLであればなんでも良い。このファイルも同じディレクトリに作成される）
```

ターミナルで以下を入力し、ドキュメントサーバーを起動

```
$ aglio -i 作ったファイル名 --server
Server started on http://127.0.0.1:3000/
Rendering apiBlueprint.md
Socket connected
```

サーバーが立ち上がるのでlocalhost:3000へアクセス

するとHTMLに変換されたAPI仕様書をブラウザで見ることが出来る。

まだ８０番では出来ていない。

>aglioでwebサーバーを立ち上げることのメリット

>・aglioが動いているホスト/ポートに対してHTTPでリクエストすることで、HTML化されたドキュメントを取得することができる

>・Webサーバが立ち上がっている状態で、API Blueprintのコードを編集すると、即座に再ビルドがかかり常に最新の状態になる

>・再ビルドがかかった際にブラウザでドキュメントを表示していると、ブラウザも自動で再読込がかかる



メモ
~/.npm配下の全てのディレクトリのオーナーを自分自身に変更する
(whoamiは自分のユーザー名を表示するコマンド)

```
sudo chown -R `whoami` ~/.npm
```
【Salesforce LightningComponent作成】recordEditFormが思ったより使いづらかった話

#LightningComponent 作成つらかった
Salesforceさん…もうちょっとDocumentほしいです…
めっちゃ大変でした…
ここでは recordEditForm の話を備忘録的に置いておきます。

#便利な recordEditForm

recordEditFormはrecordIdを指定すると、クエリ不要で値を取得してくれて便利です。

~~(※下記のコードのファイル名、本当はtest.cmpだけど、色が白で見にくいので.htmlを後ろにつけました。他に回避策あったら教えてください。)~~
追記
言語:名前 （ex.html:test.cmp）で回避できるそうです！ありがとうございます！

```html:test.cmp
<!-- Accountの項目 -->
<lightning:recordEditForm aura:id="recordEditForm" recordId="{!v.recordId}" objectApiName="Account">
    <lightning:inputField fieldName="test__c" />
</lightning:recordEditForm>
<!-- 保存ボタン -->
<lightning:button type="button" onclick="{!c.updateAccount}"/>
```

inputfield の fieldName で test__c を指定したことにより、recordId の test__c の値を取ってきてくれています。
保存も簡単です。コントローラーでaura:idを指定してsubmitするだけです。

```javascript:testController.js
updateAccount : function(component) {
    component.find("recordEditForm").submit(); //これだけで保存してくれる
}
```

aura:id が recordEditForm であるところを探し、そのタグ内の項目を submit して保存してくれます。

便利ですね。特にクエリ書かなくても良いところが凄いと思います。
と思いきや。

#不便な recordEditForm

まず結論から言うと、recordIdでIdを指定しているので、複数のレコードを編集したいときや、親オブジェクトなどの他のオブジェクトと同時に編集したいときには使用できなさそうでした:cold_sweat:

以下のようなコンポーネントを作成したとします。

```html:test.cmp
<!-- Accoutの項目 -->
<lightning:recordEditForm aura:id="recordEditForm" recordId="{!v.acc.Id}" objectApiName="Account">
    <lightning:inputField fieldName="test__c" />
</lightning:recordEditForm>
<!-- Opportunityの項目 -->
<lightning:recordEditForm aura:id="recordEditForm2" recordId="{!v.opp.Id}" objectApiName="Opportunity">
    <lightning:inputField fieldName="test2__c" />
</lightning:recordEditForm>
<!-- 保存ボタン -->
<lightning:button type="button" onclick="{!c.updateAccOpp}"/>
```

上記のを1つの保存ボタンで同時に保存したい場合は以下のように submit を2回使用する js となります。

```javascript:testController.js
updateAccOpp : function(component) {
    component.find("recordEditForm").submit();
    component.find("recordEditForm2").submit();
}
```

この submit を2回するのがダメなのですが、なぜだか分かりますか？

#submit を2回してはいけない理由

Accountの項目にエラーがあり、Opportunityの項目にエラーがあるときに良くない動作をしてしまいます。
以下の表を用意しました。

| Account    | Opportunity | 問題                         |
|:----------:|:----------:|-----------------------------|
| エラーなし  | エラーなし   | 問題なし                      |
| エラーあり  | エラーなし   | 問題なし                      |
| エラーなし  | エラーあり   | **Accountだけ更新されてしまう**    |
| エラーあり  | エラーあり   | エラー有無の確認がAccountのみ  |

上記のように2つ目のsubmitでエラーがあったとしても、1つ目のsubmitが通ってしまうという現象が起こってしまうのです。

#回避策

recordEditForm を使わずにヘルパーからApexを呼んで Database.setSavepoint を使ってエラーの時はロールバックしました。
必須項目と入力規則のエラーを同時に出せるのも個人的にはGood。
もっと良い回避策ありそうですね。知っている方がいらっしゃったら教えてください。

#まとめ
recordEditForm は編集するレコードが1つだけのときに便利。
しかし、それはわざわざコーディングする必要あるのだろうか……標準でやりなさいな、となりますよね。
考えられるのは、親オブジェクトは項目だけ表示して、子オブジェクトのみを編集するときとか？

#Lightning Componentについて

社内で「Lightning Web Componentが出るため、もう使われなくなるのでは」という噂が聞こえてきました。
ああ、学習コスト……
【Edge】position:fixedかつwidthが設定されていない場合縦スクロールバーの表示がバグる

# 再現条件
ブラウザ:
Windows版 Microsoft Edge ver.42

CSS:
- position:fixed
- overflow-y:auto
- min-widthとmax-widthが同じ値に設定されている（つまり幅が固定）
- widthが設定されていない

# 現象
**縦スクロールバーが表示される場合、min-width(またはmax-width)に収まらず、はみ出してしまう**

以下のリンクから現象を確認できます。
2つのボックスは同じ幅のはずですが、Windows版Edgeで見た場合、下のボックスの横幅が長く表示されてしまいます。
[Vertical scrollbar weirdness in Edge](https://codepen.io/hashikuchi/pen/KJxmmv)

・MacOS版Chromeで見た場合
![chrome.png](https://qiita-image-store.s3.amazonaws.com/0/44264/a1506dcb-f863-6a20-5867-6a2ae56f8572.png)

・Windows版Edgeで見た場合
![edge.png](https://qiita-image-store.s3.amazonaws.com/0/44264/5b324805-65d7-43b5-9b04-dfd90e7b9c14.png)

# 修正方法
widthの値を設定してやると、EdgeでもChromeなどと同様に表示されます。
![edge-fixed.png](https://qiita-image-store.s3.amazonaws.com/0/44264/05534486-3bc9-cd6e-fb82-0305940bd19d.png)

# どうしてこうなるの？
わかりません(´・ω・｀)
MacOSでパーミッションを数値化する方法

# MacOSでパーミッションを数値化する方法

パーミッションの数値表記に慣れている方


```
ls -lh
drwxr-xr-x  20 user  staff   640B  2 14 18:30 .
drwxr-xr-x   6 user  staff   192B  2 13 17:14 ..
-rwxr-xr-x   1 user  staff   8.6K  2 14 18:30 a.out
```

lsにはパーミッションの表記に関するオプションがないので`stat`で代用します。

```
stat -f='%p %N' ./*

=100755 ./a.out
```
DockerコンテナのSSL化

phpサイトの開発でSNS認証が必要になったため、DockerコンテナのSSL化について述べる。

## 前提
* 開発端末はMac。なので開発環境はDocker for Mac  
* docker-composeで開発案件毎にコンテナを用意
* コンテナはWebサーバとDBサーバが基本で必要に応じてキャッシュサーバ
* WebサーバはCentOS7+Apache2+php5.6で独自にイメージを作成
* ローカル環境のみで動作（外部からのアクセスを考慮しない）
* URLはhttp://hoge.localとし、開発端末のhostsファイルに記述

以上から、Let's Encryptは使えないため、オレオレ証明書で行うものとする。

## 証明書の作成
[ローカル環境で使うオレオレ認証局とオレオレ証明書を簡単に作れる mkcert を試した](https://kakakakakku.hatenablog.com/entry/2018/07/27/120009)  
とか見ると良さげだったので  
[mkcert](https://github.com/FiloSottile/mkcert)  
を使用した。

インストールは  

```
$ brew install mkcert
$ brew install nss
```
で、すんなりできた。  
（本当はbrew側の問題で少し苦戦したが。。。)  

証明書の作成は  

```
$ mkcert -install
$ mkcert hoge.local
```

これで、hoge.local.pemとhoge.local-key.pemが作成される

## ApacheのSSL設定
ローカルで動けばいいので、今回は簡単に作成。

```
Listen 443
SSLStrictSNIVHostCheck off

<VirtualHost _default_:443>
  DocumentRoot "/var/www/html"
  ServerName repo.local:443

  ErrorLog logs/ssl_error_log
  TransferLog logs/ssl_access_log
  LogLevel warn

  SSLEngine on 
  SSLProtocol all -SSLv2
  SSLCertificateFile /etc/pki/tls/certs/hoge.local.pem
  SSLCertificateKeyFile /etc/pki/tls/certs/hoge.local-key.pem
</VirtualHost>
```

## 開発環境構築
いよいよ開発環境構築である。  
ディレクトリ構成は下記のようにした。  

```
ROOTDIR/  
  ┝━ SSL   #SSL関連ファイル  
  │   ┝━ ssl.conf  
  |   └━ certs 
  |        ┝━ hoge.local.pem
  |        └━ hoge.local-key.pem
  |  
  ┝━ svr　 # Webサイトのリソース（中身は省略)
  |
  └━ docker-compose.yml
```

docker-compose.ymlは下記のように作成した。

```
dataHttpLog:
  image: busybox
  volumes:
    - "${DEVELDIR}/HttpLog:/var/log/httpd"
  environment:
    - DEVELDIR

dataSSL:
  image: busybox
  volumes:
    - ./SSL/certs:/etc/pki/tls/certs

httpsvr:
  image: phpsvrpdo:3.0   #<- 独自で構築したwebサーバイメージ名
  hostname: 'hoge.local'
  volumes_from:
    - dataHttpLog
    - dataSSL
  volumes:
    - "./svr:/var/www/html"
    - ./SSL/ssl.conf:/etc/httpd/conf.d/ssl.conf
  ports:
    - "80:80"
    - "443:443" 
```
hostnameの指定はなくても動作したかも知れないが念のため。  
以上で、docker-compose up -dでコンテナを立ち上げ  
https://hoge.local/  
でアクセス出来た。  
これでSNS側のコールバックの設定に  
https://hoge.local/**  
を追加しておけば、ローカルでSNS連携の開発・テストが可能になる。
KtorでHTTPでのリクエストを弾く

その名の通りに､KtorでHTTPでのリクエストを弾くFeatureをシンプルに実装します｡

REST API とかだとHTTPへのリクエストをHTTPSにリダイレクトさせるよりはエラーを吐かせたほうが良い気がしました｡



## Featureとは

Ktorアプリケーションを構成する一連の機能の事で基本的にはリクエストとレスポンスのパイプラインに組み込まれるものです｡
Webアプリを作る上で欠かせない主要な機能であるルーティングもその`Feature`の一つとして定義されています｡

[Featureの詳細(公式リファレンス)](https://ktor.io/servers/features.html)

`Feature`を定義するためには､その`Feature`を表すクラスと､それを組み立てるために必要な情報を詰めるクラス､`ApplicationFeature`を継承した`companion object`が必要です｡(別に`companion object`じゃなくても動くけど公式のFeature達に倣う)

今回はHTTPでのリクエストを弾いてしまう`Feature`を作るので`HttpsOnly`って名前にしたいと思います｡


## `HttpsOnly`のざっくりした機能
とにかくシンプルにHttpでのリクエストを拒否したいだけなので要件は2つだけです｡

* Httpでのリクエストを受け取った際に`HttpStatusCode:403`を返す｡
* Httpでのリクエストを受け取った際に､任意の型のレスポンスボディを返す｡

## コード

解説はコード内コメントで行います｡

```kotlin
//Httpでのリクエストを拒否するためのFeature
class HttpsOnly(configuration: Configuration) {
    //Httpでのリクエストが有った際に返すレスポンスのボディ
    val response = configuration.responseObject

    //HttpsOnlyを組み立てるための設定
    class Configuration {
        //Httpでのリクエストが有った際に返すレスポンスのボディ
        var responseObject: Any = "https only"
    }

    companion object Feature : ApplicationFeature<ApplicationCallPipeline, Configuration, HttpsOnly> {
        //Featureを一意に表すキー
        override val key: AttributeKey<HttpsOnly> = AttributeKey("HttpsOnly")

        //Featureのインストールを行う関数
        override fun install(pipeline: ApplicationCallPipeline, configure: Configuration.() -> Unit): HttpsOnly {
            //configureを元にHttpsOnlyを組み立て
            val feature = HttpsOnly(Configuration().apply(configure))
            
            
            /*
             ApplicationCallPipelineに､リクエストがHttpではないかをチェックして
             そうだったときにHttpStatusCode 403とHttpsOnly#responseを返す処理を挟む
            */
            pipeline.intercept(ApplicationCallPipeline.Features) {
                if (call.request.origin.scheme != "http") return@intercept
                call.respond(HttpStatusCode.Forbidden, feature.response)
                finish()
            }
            return feature
        }
    }
}
```

実際に使う際には

```kotlin
fun Application.installHttpsOnly() = install(HttpsOnly) {
    responseObject = ErrorResponse(
        statusCode = HttpStatusCode.Forbidden.value,
        reason = "sslRequired",
        message = "SSL is required for requests to this server"
    )
}
```

のようにしてやればHttpでのリクエストを受け取った際にエラーレスポンスを任意のオブジェクトをレスポンスボディにして返してやることが出来ます｡
`ktor-jackson`等と組み合わせればJSONを返すことも可能です｡

間違ったことや､おかしな点があればご指摘して頂けれると嬉しいです｡

## 参考
https://ktor.io/servers/features.html
https://ktor.io/advanced/pipeline.html
https://ktor.io/servers/lifecycle.html
https://github.com/ktorio/ktor/blob/43eef9ed31ba33137501820a1b292af946ede6f8/ktor-server/ktor-server-core/jvm/src/io/ktor/features/DefaultHeaders.kt
Xcode10でXcode9以前に作成したプロジェクトが実機テストできない

Xcodeを10にしてから実機でテストをしていなかったのですが、今日やってみたらハマったのでまとめます。

なぜかビルドには成功しているのにインストールできない!!

# 環境
Xcode 10.1
Xcode9以前に作成したプロジェクト
Simulatorでは成功する


# 解決方法
1.左上の File > Workspace Settings...を開く
2.Shared Workspace Settings内のBuild SystemをLegacy Build Systemに変更する

![スクリーンショット 2019-02-14 12.46.04.png](https://qiita-image-store.s3.amazonaws.com/0/355868/2ec33bf2-5c93-4d6d-9539-7fd38b98023d.png)

どうやらXcode10からNew Build Systemがデフォルトになったため、Xcode9までのbuildを実行するためにはLegacy Build Systemにしないといけないみたいです。。

ビルド自体に失敗している場合は、他の原因がありそうです。
99 PSiE [Problem 10]

# はじめに
[Ninety-nine Problems, Solved in Elm](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/) を毎日ふれることで､Elm に親しもうという『日記』です｡詳細は [99 PSiE [Problem 1]](https://qiita.com/seahal/items/36f176d68991231ee80a) をご覧ください｡

# 問題
Run-length encode a list of list to a list of tuples. Unlike lists, tuples can mix types. Use tuples (n, e) to encode a list where n is the number of duplicates of the element e.
(引用元：[Problem 10](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/p10.html))

# 成果物
```elm
import Html

noDupes list =
    let
        noDupCons y ys =
            case List.head ys of
                Nothing -> [y]
                Just a ->
                    if y == a then
                        ys
                    else
                        y::ys
    in
        List.foldr noDupCons [] list

-- Checker
main : Html.Html a
main =
    Html.text
        <| case test of
            0 ->
                "Your implementation passed all tests."
            1 ->
                "Your implementation failed one test."
            x ->
                "Your implementation failed " ++ (Debug.toString x) ++ " tests."


test : Int
test =
    List.length
        <| List.filter ((==) False)
            [ noDupes [ 1, 1, 1, 1, 2, 5, 5, 2, 1 ] == [ 1, 2, 5, 2, 1 ]
            , noDupes [ 2, 1, 1, 1 ] == [ 2, 1 ]
            , noDupes [ 2, 2, 2, 1, 1, 1 ] == [ 2, 1 ]
            , noDupes [ 1 ] == [ 1 ]
            , noDupes [] == []
            , noDupes [ "aa", "aa", "aa" ] == [ "aa" ]
            , noDupes [ "aab", "b", "b", "aa" ] == [ "aab", "b", "aa" ]
            ]
```

# 正答例
=> [Problem 10 Solutions](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/s/s10.html) 

# コメント
再帰を使って解くというのは思いつかなかったなぁ...

# P.S.
なぜ [Problem 9](https://johncrane.gitbooks.io/ninety-nine-elm-problems/content/p/p09.html) がないかというと､回答例を見てもわからなかったからだ｡takeWhile と dropWhile を復習することで､たぶん解けるようになる気がする｡
【ColdFusion】cfexecuteからexcelを開くスクリプトが動作しない

##やろうとしたこと
エクセルのマクロをCFから実行するために、マクロ起動用のVBScriptを作って実行しようとしたんですが。

```cfscript:runExcelMacro.cfm
batchFilename = "c:\runExcelMacro.vbs";
variousParameters = '"#エクセルファイルのパス#" #実行するマクロ名#';
cfexecute(name="cmd", arguments="/C #batchFilename# #variousParameters#");
```

```vb:runExcelMacro.vbs
Dim obj
Set obj=WScript.CreateObject("Excel.Application")

obj.DisplayAlerts = False
obj.Workbooks.Open WScript.Arguments(0)
obj.Application.Run WScript.Arguments(1)

obj.Workbooks.Close
obj.Quit
```
##どうなった？

なんか動かない。VBScriptからログ吐くようにしてみると、どうやら`Workbooks.Open`に失敗している様子。

でも、直接VBScriptを実行すると問題なく動くんですよ・・・なぜだ。

##解決方法を見つけたよ
[Run VBScript using CFExecute throws error but works fine via command line](https://stackoverflow.com/questions/25565565/run-vbscript-using-cfexecute-throws-error-but-works-fine-via-command-line)

Windows Serverのバグ・・・だと・・・。（脱力）

使ってるのはWindows Server 2016なんですが、まだ直っていないんですね。

自分の場合、`C:\Windows\System32\config\systemprofile`に"Desktop"フォルダを追加するだけでいけました。

3時間くらいハマった・・・。
Ubuntu18.04 USキーボードで日本語切り替えをaltキーで行う

# TL;DR
Ubuntuにてmacのkarabinerやwindowsでのalt-ime-ahkと同様にUSキーボードで左右altで英語、日本語の切り替えを行う設定。
fcitxを使用して実現しています。


# fcitxのインストール

```
sudo apt install -y fcitx fcitx-mozc
sudo im-config -n fcitx 　# fcitx設定にて入力一覧を出す
```
再起動を行い、
アプリケーション一覧からfcitx設定を開きます。
図のように追加されていれば成功です。
![fcitx設定](https://qiita-image-store.s3.amazonaws.com/0/188498/343ae82d-9cf9-8252-4d9e-1cf214d1bc4f.png)

# fcitxの設定
右下の＋アイコンから英語の追加を行います。
![Screenshot from 2019-02-14 17-32-38.png](https://qiita-image-store.s3.amazonaws.com/0/188498/b22025f3-897d-df79-23e5-842dc9667cfa.png)

追加後は英語を上にし、日本語を削除します。（一番上の設定がデフォルトになります。）
![Screenshot from 2019-02-14 17-32-50.png](https://qiita-image-store.s3.amazonaws.com/0/188498/626cca52-3130-3647-ef6c-f5e300a3a703.png)

デフォルト入力切り替えをfcitxへ変更します。
アプリケーションから言語サポートを起動、キーボード入力に使うIMシステムをfcitxへ変更します。
![Screenshot from 2019-02-14 17-33-33.png](https://qiita-image-store.s3.amazonaws.com/0/188498/42faa0b0-5ad0-1ea4-7a56-fece0baee4aa.png)


# 入力切り替えの設定（トグル切り替え）
アプリケーションのfcitx設定から全体の設定タブへ切り替え
入力メソッドのオンオフを選択し、設定に使用したいキーを押して選びます。
（karabiner-elementsのオプションと同様）
![Screenshot from 2019-02-14 17-33-12.png](https://qiita-image-store.s3.amazonaws.com/0/188498/d1cce175-b9be-a6db-cab9-a74c59b55b58.png)

# 入力切り替えの設定（単切り替え）
アプリケーションのfcitx設定から全体の設定タブへ切り替え
Show Advanced Optionsボックスにチェックを入れ、入力メソッドをオンにで日本語入力へ切り替えたいキーに、オフで英語入力に切り替えたいキーを設定します。
（alt-ime-ahkやkarabiner-elementsのデフォルトと同様）
![Screenshot from 2019-02-14 17-34-14.png](https://qiita-image-store.s3.amazonaws.com/0/188498/4fe1214c-a74a-51dd-972f-f4374b5f3f81.png)
Intel Realsense D435iのCalibration Table初期化手順

Intel Realsense D435iとNuitrackとUnityでコンテンツを作っていたところ、Realsenseがうまく機能しなくなってしまい、色々調べた結果の記録です。

##起こったこと
- Nuitrackのインストール時にファームウェアをアップデート（インストールに関しては[こちらの記事](https://qiita.com/kamihiro/items/8f423897a59a6453d1c7)が詳しいです）
- 現時点で最新のファームウェアは**Version: 5.11.1**だが間違って**Version: 5.10.6**をインストール
- Nuitrackの表情認識が動かないことに気づきファームウェアを確認、最新の**Version: 5.11.1**をインストール
- それ以降も表情認識動かず

Nuitrack側の設定ファイルをいじっていたのでそれも問題かと思ったのですが、2台あるRealsenseのもう一台（ファームウェアアップデートは行なっていない）は正常に表情認識できることからハードの問題と断定しました。

##やったこと
- Intel Realsense Viewerを試す。
→ 正常稼働
- Intel Calibration Toolを試す。
→ 「**Calibration Tables on Device Are Not Supported**」というエラーを吐いていた。
なのでググるとIntelのサポートページに行き着く。

[デバイス上のエラーキャリブレーションテーブルは、インテル® RealSense™ デプスカメラではサポートされていません D435](https://www.intel.co.jp/content/www/jp/ja/support/articles/000028777/emerging-technologies/intel-realsense-technology.html)

このページ、自動翻訳で変な風に訳されていて最初全く意味わからなかったのですが英語に戻すと以下の一文が。

「**Run Intel.Realsense.CustomRW.exe -g to recover the calibration table.**」

それもよくわからずググるとCalibration APIというのがあり、それを使ってコマンド叩くらしいことがわかったので以下よりAPIをダウンロード。

[Intel® RealSense™ D400 Series Calibration Tools and API](https://downloadcenter.intel.com/download/28517/Intel-RealSense-D400-Series-Calibration-Tools-and-API?product=128255)

ダウンロードしてきたzipを解凍し、中にあるインストーラーでAPIをインストールすると、Cドライブ以下にAPIがインストールされるので、その中にある**Intel.Realsense.CustomRW**を指定して以下のようにコマンドを叩き、**工場出荷時の状態に戻す**ことができました。

```shell
C:¥Users¥CalibrationToolAPI¥[バージョン]¥bin¥Intel.Realsense.CustomRW -g
```

以上で表情認識うまくいきました👍
Typescript & React で Type 'Element' is not assignable to type 'FunctionComponent<Props>'. のエラーがでた

## 状況
Typescript で React を書いていたらこんなエラーがでた。

```
Type 'Element' is not assignable to type 'FunctionComponent<Props>'.
  Type 'Element' provides no match for the signature '(props: Props & { children?: ReactNode; }, context?: any): ReactElement<any, string | ((props: any) => ReactElement<any, string | ... | (new (props: any) => Component<any, any, any>)>) | (new (props: any) => Component<...>)>'.ts(2322)
```

エラーのでた部分はここ。

```tsx
function MyComponent({ user }): React.FC<Props> {
  return (
    <div>{user.name}</div>
  );
}
```

## 解決

function 式で書かずに arrow function で書きなおしたらエラーは消えた。

```tsx
const MyComponent: React.FC<Props> = ({ user }) => {
  return <div>{user.name}</div>;
};
```

## あとがき

なんでなのかは分からない。
貼って使う Azure CLI スニペット（Azure Active Directory編）

## 概要
* Azure リソースのメンテナンス等で使えそうなコマンドのスニペット（PowerShell ベース）をまとめました
* PowerShell コンソールに貼って使えます
* 今回は **Azure Active Directory** に関するスニペットをまとめます

## 前提
* [Azure CLI](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest) がインストールされている前提です
* 実行するには、事前に `az login` コマンドで 認証する必要があります（参考：[Azure CLI の概要 - サインイン](https://docs.microsoft.com/ja-jp/cli/azure/get-started-with-azure-cli?view=azure-cli-latest#sign-in)）
* 環境情報：
    * Azure CLI（v.2.0.57）
    * PowerShell（v.5.1.17134.407）
* 安全に試せるよう 情報取得系 中心にまとめます（一部注意事項あります）
* 一部のスニペットは実行時にパラメータが必要となります

---

## 自分（現在サインインしているユーザ）の情報を取得したい

```
az ad signed-in-user show
```

## ユーザ の一覧を取得したい

```
az ad user list
```


## グループ の一覧を取得したい

```
az ad group list
```


## ユーザ or グループ の名称（表示名）一覧を取得したい

* ユーザ

```
(az ad user list | ConvertFrom-Json) | % {$_.displayName}
```

* グループ

```
(az ad group list | ConvertFrom-Json) | % {$_.displayName}
```


## ユーザ表示名 と オブジェクトIDを一覧表示したい

* 今回は一覧表示させるために [Out-GridView](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/out-gridview?view=powershell-5.1) を使用。GUI環境で一覧データを扱うのに便利。

```
(az ad user list | ConvertFrom-Json) | `
    select `
        @{N="表示名"; E={$_.displayName}}, `
        @{N="姓"; E={$_.surname}}, `
        @{N="名"; E={$_.givenName}}, `
        @{N="UPN(ログイン名)"; E={$_.userPrincipalName}}, `
        @{N="オブジェクトID"; E={$_.objectId}} `
    | Out-GridView;
```


## アプリケーション名、オブジェクトID、アプリケーションIDを一覧表示させる

```
(az ad app list | ConvertFrom-Json) | `
    select `
        @{N="表示名"; E={$_.displayName}}, `
        @{N="アプリケーションID"; E={$_.appId}}, `
        @{N="オブジェクトID"; E={$_.objectId}} `
    | Out-GridView;
```


## 特定のグループに所属するメンバを一覧表示させる

```
Param(
    [Parameter(Mandatory=$true)] $groupName
); `
(az ad group member list -g $groupName | ConvertFrom-Json) | `
    select `
        @{N="表示名"; E={$_.displayName}}, `
        @{N="姓"; E={$_.surname}}, `
        @{N="名"; E={$_.givenName}}, `
        @{N="UPN(ログイン名)"; E={$_.userPrincipalName}}, `
        @{N="オブジェクトID"; E={$_.objectId}} `
    | Out-GridView;
```


## 自分が所属するグループ一覧を表示する

* UPN（ログイン名） か ユーザのオブジェクトIDが必要

```
(az ad signed-in-user show | ConvertFrom-Json) | `
    % {(az ad user get-member-groups --upn-or-object-id $_.userPrincipalName | ConvertFrom-Json)} | `
        select `
            @{N="表示名"; E={$_.displayName}}, `
            @{N="オブジェクトID"; E={$_.objectId}} `
        | Out-GridView;
```


## 特定のユーザが所属するグループ一覧を表示する

* UPN（ログイン名） か ユーザのオブジェクトIDが必要

```
Param(
    [Parameter(Mandatory=$true)] $upnOrObjectId
); `
(az ad user get-member-groups --upn-or-object-id $upnOrObjectId | ConvertFrom-Json) | `
    select `
        @{N="表示名"; E={$_.displayName}}, `
        @{N="オブジェクトID"; E={$_.objectId}} `
    | Out-GridView;
```
貼って使う Azure CLI スニペット（SQL編）

## 概要
* Azure リソースのメンテナンス等で使えそうなコマンドのスニペット（PowerShell ベース）をまとめました
* PowerShell コンソールに貼って使えます
* 今回は **SQL** に関するスニペットをまとめます

## 前提
* [Azure CLI](https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest) がインストールされている前提です
* 実行するには、事前に `az login` コマンドで 認証する必要があります（参考：[Azure CLI の概要 - サインイン](https://docs.microsoft.com/ja-jp/cli/azure/get-started-with-azure-cli?view=azure-cli-latest#sign-in)）
* 環境情報：
    * Azure CLI（v.2.0.57）
    * PowerShell（v.5.1.17134.407）
* 安全に試せるよう 情報取得系 中心にまとめます（一部注意事項あります）
* 一部のスニペットは実行時にパラメータが必要となります

---


## SQLサーバ の一覧を取得したい

```
az sql server list
```


## SQLサーバ の名称、所属リソースグループ を一覧取得したい

```
(az sql server list | ConvertFrom-Json) | % {$_.name + " (" + $_.resourceGroup + ")"}
```


## SQLサーバ の サーバ管理者名 を一覧取得したい

```
(az sql server list | ConvertFrom-Json) | % {$_.name + " (" + $_.resourceGroup + ")" + "`n  管理者：" + $_.administratorLogin + "`n"}
```

* 単に見たいだけであれば、以下が 視野性○

```
az sql server list --output table
```

## 特定サーバの DB情報 を取得したい

```
Param(
    [Parameter(Mandatory=$true)] $resourceGroup,
    [Parameter(Mandatory=$true)] $serverName
); `
az sql db list -g $resourceGroup --server $serverName
```

## 全サーバの DB情報を JSONファイルとして保存したい

* **【注意】全サーバ分の情報を取得するため処理に時間がかかります**

```
Param(
    [Parameter(Mandatory=$true)] $outputDirName
); `
New-Item $outputDirName -ItemType Directory -Force; `
(az sql server list | ConvertFrom-Json) | `
    % {
        $outer = $_; `
        (az sql db list --server $_.name -g $_.resourceGroup | ConvertFrom-Json) ` 
    } | `
    % {
        New-Item ($outputDirName + "/" + $outer.name) -ItemType Directory -Force; `
        $_ | ConvertTo-Json -Depth 100 > ("./$outputDirName/" + $outer.name + "/" + $_.name + ".json") `
    };
```


## 全データベースの スペック を一覧取得する

* **【注意】全サーバ分の情報を取得するため処理に時間がかかります**
* DTUモデル と vCoreモデル 別に表示内容を切り替え

```
(az sql server list | ConvertFrom-Json) | `
    % {
        $outer = $_; `
        (az sql db list --server $_.name -g $_.resourceGroup | ConvertFrom-Json) ` 
    } | `
    % {
        if ($_.sku.family -eq $null) {
            # DTUモデル
            $outer.name + " - " + $_.name + "`n  " + `
            "モデル：DTU`n  " + `
            "データの最大サイズ：" + ($_.maxSizeBytes / 1024 / 1024 / 1024 ) + " GB`n  " + `
            "ログの最大サイズ：" + ($_.maxLogSizeBytes / 1024 / 1024 / 1024 ) + " GB`n  " + `
            "価格帯：" + $_.sku.tier + "`n  " + `
            "DTU数：" + $_.sku.capacity + "`n";
        } else {
            # vCoreモデル
            $outer.name + " - " + $_.name + "`n  " + `
            "モデル：vCore`n  " + `
            "データの最大サイズ：" + ($_.maxSizeBytes / 1024 / 1024 / 1024 ) + " GB`n  " + `
            "ログの最大サイズ：" + ($_.maxLogSizeBytes / 1024 / 1024 / 1024 ) + " GB`n  " + `
            "価格帯：" + $_.sku.tier + ", " + $_.sku.family + "`n  " + `
            "vCore数：" + $_.sku.capacity + "`n";
        }
    };
```
web系エンジニアを目指すプログラミング初学者にRubyをおすすめする理由

##はじめに
ぼくがRubyを勉強し始めたのは、1ヵ月くらい前。とはいえ、本腰を入れてプログラミングを学びはじめたのは5ヵ月くらい前で、HTML/CSS→JavaScript→PHPとさんざんつまみ食いした挙句、やっとこさRubyにたどり着きました。

でも、もし5ヵ月前の自分に声をかけられるとしたら、「HTMLとCSSやったらRubyやれ」と言うでしょう。

本記事では、ぼく自身の経験を踏まえつつ、『プログラミング初学者にRubyをおすすめする理由』を書いてみようと思います。

##Rubyがおすすめな理由
結論からいうと、ぼくが感じているRubyの魅力は以下の3つです。
①就職に有利（たぶん）
②学習環境が素晴らしい
③日本語のリソースが豊富

ひとつずつ説明していきますね。

##Rubyは就職に有利（らしい）
ぼく自身まだ就職していないので実体験をもって話せませんが、ウェブ系エンジニアになるのであれば、Rubyをやっておくと就職で有利になるパターンが多いです。

まずは単純に母数の問題です。
Rubyには『Ruby on Rails（Rails）』という有名なフレームワークがあって、多くのウェブ系スタートアップでは開発言語としてこのRailsを採用しています。

ぼく自身かなりの数の求人をチェックしましたが、Railsを使っているスタートアップはとても多い印象でした。というかむしろ、ぼくがRubyに興味をもったのは、「面白そう」と思う会社のほとんどでRailsエンジニアを募集していたからです。

また、開発言語というのは「ヤバい会社」を見分けるひとつの指標としても機能します。
古くて廃れてきている言語や技術を開発言語にしている会社は、業界の流れについていけていない可能性が高く、先行きが不安です。加えて、そういう会社でがんばって働いても、エンジニアとしての市場価値は上がりづらいことが予想されます。

Rubyは言語としてはむしろ古い部類にはいると思いますが、アップデートの頻度がたかいので、Rubyを採用している企業は必然的に積極的なキャッチアップが要求されます。

結果として、Rubyを使っている会社を選ぶだけでモダンな開発環境で開発できる可能性が高く、「ヤバい会社」をある程度フィルタすることができます。

##学習環境が素晴らしい
ぼくがとくに強調したいのは、初学者が着実に力をつけながら学習をすすめていくためのステップが確立されていることです。

未経験からエンジニアを目指すときによく言われるのは、
①オンライン教材で基礎を勉強して
②アプリつくって
③ポートフォリオをつくれ
というもの。

どんな言語を選んだとしても、基礎はプロゲートなりドットインストールなり入門書なりで身につけることができますし、簡単なクイズアプリくらいならすぐに作れます。そうすると次は「もうちょっとちゃんとしたアプリ」を作りたくなりますが、ぼくは毎回そこで手が止まってしまいました。

まずどんなものが作れるのかイメージできないし、もし「こういうアプリが作りたい！」と思っても、何から始めたらいいのか分からなくて迷子になってしまうんですよね。

完成したアプリを『家』に例えると、プログラミング言語の基礎というのは木材やコンクリートといった『材料』のようなものだと思います。でも、材料だけでは家は建てられません。家を建てるには、材料のほかに、材料の組み合わせかたや使いかたといった、『設計図』が必要なんですよね。

そしてRubyには、先ほど紹介した『Ruby on Rails』という素晴らしい『設計図』があり、『Railsチュートリアル』というチュートリアルまで用意されています。

Railsチュートリアルではツイッターのクローンアプリを作りますが、ゼロからアプリのデプロイ（公開すること）までのステップが網羅されていてアプリ開発の一連の流れが理解できます。また、HTMLやCSS（Sass）・コマンドラインやGitなども使うので、必然的にそのあたりの知識も身につきます。

くわえて、ツイッターなどを使えば自分と同じくRailsチュートリアルに挑戦中の駆け出しエンジニアと知り合えたりして、モチベーションも維持しやすい環境ができあがっています。

##日本語のリソースが豊富
Ruby自体がまつもとゆきひろさんという日本人エンジニアが開発した言語なので、他の言語と比べて、日本語のリソースが多いです。さきほど紹介したRailsチュートリアルも日本語版があります。

エンジニアをやるなら英語は必須ですが、英語とプログラミングを同時に勉強するのは正直けっこう大変なので、日本語でいろんな情報にアクセスできるのは地味なアドバンテージだと感じています。

##まとめ
ぼくがさんざん遠回りした一番の理由は、作りたいものが明確になっていなかった、ということに尽きるのかなと、書いていて気づきました。

ぼくと同じように作りたいものがハッキリしていないひと、これからプログラミングを学ぼうと思っているひと、そして、挫折しそうで悶々としているプログラミング初学者に、Rubyという選択肢があるよ、ということを伝えたくてこの記事を書きました。

作りたいものが作れるエンジニアを目指して、日々頑張っていきましょう！
unityでbuttonを使う

unityでボタン押したら適当なオブジェクトの関数が呼ばれるようにする手順をメモしておきます。

## 手順
1. Buttonを配置する
2. Buttonから呼ばれるScriptを書く
3. Buttonが呼ぶオブジェクトと関数を指定する

## 試行環境
Windows10
Unity 2018.3.0f2 Personal

## 1. Buttonを配置する

HierarchyのCreateからUIのButtonを選ぶとButtonオブジェクトが追加されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/277233/413a8ccc-9c7f-3c9c-7888-7789b62d68c6.png)
<img src="https://qiita-image-store.s3.amazonaws.com/0/277233/a8968c62-41c0-6afb-2418-76c7898bcf20.png" width=50%>

CanvasというのはUI置き場だそうです。ButtonオブジェクトはUIなのでCanvasに自動的に配置されます。UIはCanvasに配置されないと正常に表示されないそうです。

EventSystemというのはボタンが押されたときにクリックイベントを拾ってくれるオブジェクトだそうです。ときどきButton置いたのにEventSystemが出てこない事があるんですが、そのままだとボタン押しても反応しなくなっちゃうようなので注意。

## 2. Buttonから呼ばれるScriptを書く

空のGame Objectを呼ぶようにしてみます。HierarchyのCreateからCreate Emptyで空のGame Objectを作り、Inspectorの一番下にあるAdd ComponentからNew Scriptを選択してScriptを追加します。Script名はtestにしました。Projectパネルに追加されたScriptをダブルクリックしてエディタを開き、以下のコードを記入します。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    public void OnClick()
    {
        Debug.Log("click!!");
    }
}
```
## 3. Buttonが呼ぶオブジェクトと関数を指定する

ボタンが押されたときにクリックイベントを伝える先を指定します。ButtonのInspectorの下の方にあるOn Click()の＋ボタンを押すと伝える先を追加できます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/277233/8c70a1be-9551-9316-4eb1-8d7c8d0af689.png" width=50%>
Buttonを押したときに上で書いたScriptのOnClick()を呼べるようにします。ButtonのInspectorにあるOnClick()の＋を押して出てきた項目の左下が伝える対象ですので、HierarchyからButtonをdrag & dropしてこいつを呼ぶんだよって教えてあげます。次いで、呼ぶ関数を指定する為に右の選択肢からMyButton.OnClick()を選べばOKです。
<img src="https://qiita-image-store.s3.amazonaws.com/0/277233/94be9d57-78b3-180d-92cd-316e56aef2e9.png" width=50%>
実行してButtonを押すとConsoleにDebug.Log()が書き出した「click!!」が表示されます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/277233/48e0b2f8-2003-7a20-c0c5-5b52f40d5f26.png" width=50%>

## 関数名は何でも良い

ちなみに、呼ばれる関数名は別にOnClick()である必要はないので、例えば以下のようにしてもちゃんと呼べます。

```
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class test : MonoBehaviour
{
    public void Yeah()
    {
        Debug.Log("Yeah!!");
    }
}
```
呼ぶ先の変更を忘れずに…
<img src="https://qiita-image-store.s3.amazonaws.com/0/277233/3154a81d-3422-0af5-b070-4ae4baf552d4.png" width=50%>
<img src="https://qiita-image-store.s3.amazonaws.com/0/277233/6bc0380d-0414-929a-c3ed-4ead94921efc.png" width=50%>
はいできました
django-allauthをdjango2.1に導入

本記事を作成している日(2019.02.14)の[公式インストール手順](https://django-allauth.readthedocs.io/en/latest/installation.html)で一部修正が必要だったので控えておきます。

**環境**
- Django 2.1.4
- Python 3.6.7
- django-allauth 0.38.0

settings.pyに色々と追加した後に、urls.pyに以下を定義しろという記載があります。

```
urlpatterns = [
    ...
    url(r'^accounts/', include('allauth.urls')),
    ...
]
```

django2.0から ルーティング定義はpathを使うのが標準的な作法となっているので置き換えます。(urlも後方互換のために残っていますが。)

```
    path('accounts/', include('allauth.urls')),
```

そして、インストール実行

```
$ python3 manage.py migrate
```

以下のエラーがでます。

```
path('accounts/', include('allauth.urls')),
NameError: name 'include' is not defined
```

includeをimportします。

```
from django.urls import include  ★ここ★

urlpatterns = [
    path('admin/', admin.site.urls),
    path('accounts/', include('allauth.urls')),
]
```

以上です。
完全一致の日付検索をする場合, date型よりもint型のほうが早いのか？


# 検索でよく使うIdの類は全部Intじゃん

だから検索速度重視ならDateよりも、Intのほうが圧倒的に早い可能性あるなって思ったら先駆者がいた。

http://toritori0318.hatenadiary.jp/entry/20091010/1255190550

これは使うdbによって結果が変わってくるのかもしれない。
また範囲検索もdateのほうが優秀という結果がでているらしい。

あとで自分で実験してみるので、追記するかもしれない。（追記しないかも
CSCスパース行列から、あえて特定行を取り出す

訳あって、CSC（列志向）形式で保存されたスパース行列の特定の行だけをJuliaで取り出す必要があったため、書いたコード。

現状、JuliaではCSR（行志向）に対応していないらしい。

CSRであれば行の切り出しはスムーズだが、それをCSCでやると割と大変だった。

CSC、CSRなどの説明は以下の通り。
http://hamukazu.com/2014/12/03/internal-data-structure-scipy-sparse/

```julia
using SparseArrays

# こういう疎行列を列志向のスパース形式として持っていたとする
#       col1, col2, col3, col4
# row1 |       3     4     3  |
# row2 | 5           2        |
# row3 |       6     1        |
# row4 | 1           2        |
# row5 | 2     1     3     3  |

# 下の二つのベクトルのどこからどこまでの要素がどのcolに属するのかを保存したポインター
indptr = [1,4,7,12,14]
# 何行目の要素か
indices = [2,4,5,1,3,5,1,2,3,4,5,1,5]
# 要素の値
data = [5,1,2,3,6,1,4,2,1,2,3,3,3]
A = SparseMatrixCSC(5, 4, indptr, indices, data)

# 今、row2からrow4までを切り出したCSCを新たに作成したい
# Aがかなり巨大でメモリに乗り切らないので、A[2:4,:]みたいに切り出すのではなく、
# indptr, indices, dataから作成する

function ExtractedCSC(indptr, indices, data, ncol, startp, endp)
    # new objects
    newindptr = ones(Int64, 1)
    newindices = zeros(Int64, 0)
    newdata = zeros(Int64, 0)
    # Each column
    l = length(indptr) - 1
    for i=1:l
        lo = indptr[i]
        hi = indptr[i+1]
        # Extract
        extindices = indices[lo:hi-1]
        extdata = data[lo:hi-1]
        lower = searchsortedfirst(extindices, startp)
        upper = searchsortedlast(extindices, endp)
        # update
        append!(newindices, extindices[lower:upper])
        append!(newdata, extdata[lower:upper])
        append!(newindptr, length(newdata)+1)
    end
    @assert minimum(newindices) == startp
    @assert maximum(newindices) == endp
    newindices = newindices .- (startp - 1)
    return SparseMatrixCSC(endp - startp + 1, ncol,
        newindptr, newindices, newdata)
end
ExtractedCSC(indptr, indices, data, 4, 2, 4)
# 3×4 SparseMatrixCSC{Int64,Int64} with 6 stored entries:
#   [1, 1]  =  5
#   [3, 1]  =  1
#   [2, 2]  =  6
#   [1, 3]  =  2
#   [2, 3]  =  1
#   [3, 3]  =  2
```
AzureのkubernetesでPodが「ContainerCreating」のままで起動しないときにした対処 


kubernetesでpodを起動するときに「ContainerCreating」のままで起動しないことがあった。
何度か対象Podをdelete → applyしても解決しなかったときの、ひとまずの対処法をメモ。

```
NAME                         READY   STATUS               RESTARTS   AGE
pod/my-pod-f9bf58dbb-lpr96   0/2     ContainerCreating    1          13m
pod/my-pod-f9bf58dbb-hwlxc   2/2     Running              0          47m
pod/my-pod-f9bf58dbb-lrkcv   2/2     Running              0          47m
pod/my-pod-f9bf58dbb-tr69q   2/2     Running              0          47m
pod/my-pod-f9bf58dbb-zs9vz   2/2     Running              0          47m
```

ひとまずdescribeで確認

```
kubectl describe pods -n <ネームスペース名>
```

該当podの情報を見ると

```
kubelet, k8s-agentpool1-45055478-0
Failed create pod sandbox: rpc error: code = Unknown desc = failed to start sandbox container for pod "my-pod-f9bf58dbb-lpr96": Error response from daemon: grpc: the connection is unavailable
```
ふむふむ

```
Error response from daemon: grpc: the connection is unavailable
```
いろいろ文献を調べてみたが、情報が少なく根本原因がわからない。

何度か「delete → apply」を繰り返してみたが、状況は変わらず。


#ひとまずの対策
対象podが乗っているagentpoolをazure portalから再起動！

agentpool名

```
k8s-agentpool1-45055478-0
```

![再起動.jpg](https://qiita-image-store.s3.amazonaws.com/0/27112/29aa46dd-e776-f74f-6c3e-2bfaa937de1f.jpeg)

再起動完了後に、対象Podのdelete → applyで、ひとまずは解決。
MacにPostgreSQLをインストール 2019年版

## Homebrewを使用してインストール

```
brew install postgresql
```

2019年2月時点では、PostgreSQL 11がインストールされる。

### 出力

```
==> Downloading https://homebrew.bintray.com/bottles/postgresql-11.1_1.mojave.bottle.1.tar.gz
######################################################################## 100.0%
==> Pouring postgresql-11.1_1.mojave.bottle.1.tar.gz
==> /usr/local/Cellar/postgresql/11.1_1/bin/initdb /usr/local/var/postgres
==> Caveats
To migrate existing data from a previous major version of PostgreSQL run:
  brew postgresql-upgrade-database

To have launchd start postgresql now and restart at login:
  brew services start postgresql
Or, if you don't want/need a background service you can just run:
  pg_ctl -D /usr/local/var/postgres start
==> Summary
🍺  /usr/local/Cellar/postgresql/11.1_1: 3,548 files, 40.3MB
```

## 起動

brew services コマンドを使用して起動する。

```
brew services start postgresql
```

## 停止

```
brew services stop postgresql
```

## 参照

* [MacにPostgreSQLをインストール](https://qiita.com/_daisuke/items/13996621cf51f835494b)
LateXのビルドができないときに

# はじめに
AtomでLatexの日本語環境の設定を[この記事](https://qiita.com/tomochiii/items/152160a9915fb7b2146c)に従って行いました。なのですが、Atomでビルドを行う際にエラーが出てきてしまいました。

このエラーの解決法が分かったのでここでシェアします。

# 環境
OSはWindows 10になります。
[Perlをインストール](http://strawberryperl.com/)し、[LeXインストーラ3](https://www.ms.u-tokyo.ac.jp/~abenori/soft/abtexinst.html)を使ってw32texをインストールした状態です。

また、Atomのパッケージとして
・latex 0.50.2
・language-latex 
・latexer
・pdf-view
の4つをインストールしてありました。詳しくは[こちら](https://qiita.com/tomochiii/items/152160a9915fb7b2146c)を参照してください。

# 問題
大学で途中まで編集していたtexファイルを、Atom上で"latex"というパッケージを用いてビルドを行う際に、エラーが出てきてしまいました。
はかれるエラーは、
"latexmk: Failure in some part of making files."
といったものです。
ただし、このエラーは内容がシンプルなtexファイルでは出てこず、Pathが間違っているというようなものではなさそうでした。

確認のためTeXstudioやTeXworksでもビルドをしてみましたが、
"Unsupported document class (or package) detected, usage of the caption package is not recommended"
や、
Could not locate a virtual/physical font for TFM "hminr-h".
Please check if kpathsea library can find this font: HiraMinProN-W3.otf
といったエラーがみられました。

# 解決策
大学のPCのLateXの日本語環境を確認してみたところ、w32texではなくTeXLiveを使っていることがわかりました。

そのため、自分もTeXLiveを[このページ](https://www.tug.org/texlive/acquire-netinstall.html)からインストールしました。
手順は、
1. TeX Liveのインストーラinstall-tl-windows.exeをダウンロード
2. install-tl-windows.exeを実行してインストール
といった感じで、2、3時間かかります。

その後、Atom上でlatexパッケージの設定の一番上にあるTeX Pathを
C:\texlive\2018\bin\win32
に書き換えることでビルドが無事にできるようになりました。

w32texにはないフォントを使おうとしたためにエラーが出てきたのだと思われます。

Latexの日本語環境を作ろうとしている方で同じように詰まってしまった方は参考にしてみてください。
くりかえしにじょう

N^p(mod M)の値を効率的に解きたい

pがあまりにも大きすぎると計算に時間がかかりすぎてしまう。そのような時この繰り返し二乗法を使うことで素早く求めることができる。

愚直な方法

```
using ll = long long int;
ll PowMod(ll N, ll P, ll M){
    ll ans = 1;
    for(ll i=0; i<P; ++i){
        ans *= N;
        ans %= M;
    }
    return ans;
}
```
時間を短縮するためにまとめて掛ける。

```
using ll = long long int;
ll RepeatSquaring(ll N, ll P, ll M){
    if(P==0) return 1;
    if(P%2==0){
        ll t = RepeatSquaring(N, P/2, M);
        return t*t % M;
    }
    return N * RepeatSquaring(N, P-1, M);
}
```
再帰を使う

例題2^1000000000(mod INF)を求める

```
ll PowMod_RepeatSquaring(ll N, ll P, ll M) {
	if (P == 0)return 1;
	if (P % 2 == 0) {
		ll t = PowMod_RepeatSquaring(N, P / 2, M);
		return t * t%M;
	}
	return N * PowMod_RepeatSquaring(N, P - 1, M);
}
int main() {
	cout << PowMod_RepeatSquaring(2, 1000000000, INF) << endl;
	return 0;
}
```

```
140625001
```

ATC002-B
整数 N,M,P が与えられる。N の P 乗を M で割ったあまりを求めよ。

```
ll PowMod_RepeatSquaring(ll N, ll P, ll M) {
	if (P == 0)return 1;
	if (P % 2 == 0) {
		ll t = PowMod_RepeatSquaring(N, P / 2, M);
		return t*t % M;
	}
	return N * PowMod_RepeatSquaring(N, P - 1, M)%M;
}
int main() {
	ll N, M, P;
	cin >> N >> M >> P;
	cout << PowMod_RepeatSquaring(N, P, M) << endl;
	return 0;
}
```