OmniAICreator/Qiita-1.07M huggingface dataset:
オンデマンド、Spot、RIを含んだAutoScalingGroupを作成する

##目的
2018/11/16に発表になった全部入りAutoScalingを試してみる
https://aws.amazon.com/jp/blogs/aws/new-ec2-auto-scaling-groups-with-multiple-instance-types-purchase-options/

##手順
###起動テンプレートの作成
Laucn Templateを選択し、Create Launch Templateをクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/75f7519b-c52f-d30f-05a8-a09a57298b45.png)

ここでは起動テンプレート名とAMI IDのみ指定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/6316d400-4e75-b5e9-9f4e-e173651fa288.png)

###AutoScalingGroupの作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/c8ff84e3-ddee-d6f9-63b7-e6f341edf327.png)

起動テンプレートをクリックし、先程作成した起動テンプレートを選択する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/70b7a157-1420-3729-d584-859e2870f14d.png)

グループ名を記載
「購入オプションとインスタンスを組み合わせる」をクリック
インスタンスタイプを選ぶ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/994af3f1-9fe2-dd86-edca-6cf7bbf37205.png)

次のデフォルト設定を使用し、すぐに開始しますのチェックを外す
ここでは、
オプションのオンデマンドベース:1
ベースを超えるオンデマンド割合:10%
グループサイズ:5
にしてみました。![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/7f9c1fd3-01a7-6815-4162-09aa27407498.png)


###確認
EC2の管理コンソール＞インスタンスで確認
オンデマンド
![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/f979ceb6-e8fa-eade-7845-da07dc200372.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/a5dfaa88-7967-95a4-2856-1431ee06faeb.png)

スポットインスタンスの画面で確認すると自動的にスポットリクエストが実行されている

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/4993f497-ad1f-64bb-e037-7636108b3609.png)

##約束事
投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。
小学生の息子にプログラミングを教えて学んだこと

#きっかけ
オタク気質の息子が「プログラム教えて」と言ってきたのは去年の夏ごろ。
自由研究の題材として何かしら凝ったものを作りたいという意図らしいが、その日から息子の、というより私の奮闘記が始まったわけです。
試行錯誤していくうちに学んだ、「なるほどこうすれば効果的なのか」をまとめます。
同じ境遇で悩んでる方の一助になれば幸いです。
また本質的には新入社員教育などにも応用が利くのではないかと。利くといいな。
##攻略①：１分で理解させる
皆さんが小学生の頃どんな脳ミソしてたか思い返してもらいたいが、とにかく集中力が続かない。
こちらが熱心に説明しても、途中からヘリコプターに心を奪われてる。ヘリにすら勝てないんだよなぁ。
一度にすべてを説明すると長くなる傾向があるので、**短いセンテンスの分割した説明**を心がける。
かつ、説明は全体で1分以内を目指す。短ければ短いほど効果的と思われる。
###例：失敗パターン
息子「ループって何？」
親父「指定した条件を満たすまで、繰り返し行われる処理のことだよ。ループといえば、無限ループって言葉聞いたことあるかもしれないけど、あれはしっかりしたプログラム設計ができていないから起きる現象でペラペラペラ、あ、それにはまず配列を理解しないとペラペラペラペラ」
息子（クラスの女子の事考えてる目）
###例：成功パターン
息子「ループって何？」
親父「繰り返すって意味で、漢字ドリルみたいなもんだね」
息子「どういうこと？」
親父「あれは先生から君が『地球』って字を30回繰り返し書いてこいって言われるんだよね？」
息子「そうだね」
親父「ループを使うと、君がコンピューターに××を●●回繰り返してこいって命令できるのだよ」
息子「ふーん便利じゃん」
##攻略②：擬人化、例え、図解
「HTMLって何？」とかいう抽象的な質問は「ググりなさい」で片付けるのが常だったが、相手が息子の場合そうはいかず、かといって短い説明も難しい。
興味を持続させ、かつ知識の範囲内で理解させるためにはどうすればよいか。
三種の神器使うしかない。すなわち、擬人化、例え、図解（つまりマンガ）。

**HTML物語**

【登場人物】
クロームさん：
　女性、外国人。写輪眼みたいな目してるなと思ったらChromeのマークだった。
主人公：
　男性、日本人。クロームさんに興味津々。だけど言葉が通じないんだ。モヤモヤするよう。
博士：
　男性、日本人。主人公の親父。クロームさんと会話するヒントを持ってるらしい…？

【ストーリー】

主人公：
　博士！クロームさんが日本の料理教えてって言うから紙に書いて渡したんだけど、よくわからないって言うんだ！
博士：
　息子よ、どんな紙を渡したんだい？
主人公：
　これだよ。
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/173993/1a652029-7480-51e2-7cf0-dd823e3687eb.png)
博士：
　ホッホッホ、これじゃダメだな。
　ダメっていうかゴミだな。
　代わりにこれを渡してごらん。　
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/173993/cf87718a-8e58-9789-55cf-91a6f48635a6.png)
このくだりで、実際に図２の通りに記述させ、Chromeで開かせる。
するとほんとに番号が振られたリストが表示される。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/173993/f49453b4-8d76-0c56-7141-6d38a3e6e890.png)

息子が驚いたところで、すかさず博士が補足説明。
・クロームさんは<> ～ </> で括られた文字しか読めない
・クロームさんは<>に入る文字によって内容を理解する

…とまぁ、ストーリーの良し悪しは置いといて、
今回は、「HTMLとはブラウザに理解させるための言葉なんだ」を息子が理解できれば勝ちで良いと思う。
この物語の延長で、`<table>`,`<p>`,`<li>`,`<nav>`,`<h1>～<h6>`,`<a>`などなど…主要な要素を説明し、かつクロームさんはおしゃれ好きって後付け設定でCSSの説明もした。
javascriptは無理があったが、興味を持続させたまま詰め込むことに成功したと思う。
実際に描いたマンガをご覧になりたい方はお問い合わせください。
##攻略③：１０秒考えさせる
質問は集中を切らさないテクニックの一つだが、単純な質問よりも10秒くらい考えさせる質問のほうがより効果的だと感じた。
例えば下のような条件分岐について、ひと通り説明した場合。

```javascript
// okozukai = お小遣いの金額 
if(okozukai > 3000){
   msg = "うれしい！";
}
else{
   msg = "かなしい！";
}
```
「じゃあ、お小遣いが4000円の場合は？」
「お小遣いがいくらなら悲しい？」
という質問も悪くないが、それより
「じゃあ、お小遣いじゃなくてお年玉で考えた場合、どう作り直す？」
という質問のほうが良い反応を引き出せた。
##攻略④：おまじないは効かない
「include stdio.hって何すか？」
「ああ、それはおまじないだと思って。」
このような会話を経験したエンジニアは多いはず。
言語の習得に「おまじない」はつきものだと思っていたが、息子には見事に効かなかった。
効かないっていうか覚えてくれない。
小学生は意味がわからないものを覚えるのが苦手なのかもしれない。
覚えさせたいなら、無理やりでも意味を説明すべきだと思う。
この時、気を付けておきたい事がある。
例えば、

```javascript

var today = new Date();
var arr = new Array('あ','い','う','え','お');
var valnum = 1;
var valstr = 'あ';
```
この`new`をどう説明するか。
付けるものと付けないものがあるのはなぜか。

「そういうもんなんだよ」
ではダメで、
「DateとかArrayは設計図みたいなものでだね、newしてようやく本物になるんだよ」
はイマイチ、
「インスタンスってのがあってだね…」
は論外。

「自動販売機でジュース買うとき、見本のボタン押すでしょ？
カッコが付いてるのは見本。本物が欲しい時はニュッ（new）と指で押さなきゃね」

こんなしょうもない説明でようやく「ああね」となった。
つまり、**正確な説明よりイメージを優先**することが攻略のカギと思われる。
#まとめ
とりあえず4点だけまとめてみたが、ほかにも細々と気付きがありました。
機会があればまとめてみます。
内容についてはウチの子特有のものもあるかもしれませんので、参考程度に。
こういう説明のほうがいいんじゃない！？みたいなご意見があれば是非とも教えて頂きたいところです。
Google Hangouts Chat にpythonプログラムからメッセージを送信する

##Google hangouts ChatのWebhookを使ったメッセージ送信について
　自分の職場はイケてるITな職場ではないのでSlackなぞ使っておらず、Googleのhangoutsをたまに利用するくらい（しかも昼飯のお誘いくらいしか使ってないorz）ほど情弱なのだが。なんでも有償のG Suiteには、Google hangoutsの後継ツールとして<font color='red'>Google hangouts Chat</font>というのがあるらしく。Slack上でAPIを使って何か業務で有益な情報を自動で投稿させるのと同じイメージで、Google hangouts Chatで、例えばpythonプログラムから定期的に何かメッセージを送信するといったことが可能。ということで情弱脱出をもくろみ、Google hangouts ChatのBotを作成することにしてみた。

```python:test.py
# encoding: utf-8
from datetime import datetime
import requests

webhook_url = 'https://chat.googleapis.com/ABCDEFG******(中略)******XYZ'
tdy = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
 
response = requests.post(
  webhook_url,
  json={"text": "botから送信テスト\n"+str(tdy)}
)
```
※実行結果
![9.png](https://qiita-image-store.s3.amazonaws.com/0/91974/627fa8e8-b878-f890-4708-9037005534b0.png)

　Google hangouts Chatのチャットルームやユーザーには「**Webhook**」が用意されていて、任意のチャットルームやユーザーの「Webhook」のURLを指定して、requestsを使ってそのWebhookに対してJSONファイルをPOSTしてあげればメッセージを送信することが可能。
　ちなみにメッセージ文に、改行(<font color='blue'>|n</font>)や太字(<font color='blue'>**</font>)も入れることが可能。またメッセージ文中に、リンクURLも含めることも可能。

## 応用編
　ビジネスチャットでどういうものを自動でBOTに投稿させてあげれば諸々ハッピーになれるのかいろいろ考えた際に、例えば今日の日経平均の値などを、前場終了の11:30と後場終了(大引け)の15:00に自動投稿させようかなとも思ったのだが。さしあたり前回作成した[当日EDINETに提出された新規上場会社の有価証券届出書（新規公開時）を定点観測するプログラム](https://qiita.com/Fortinbras/items/00a0a137a6d7bf1bb0ed)を少し改良して、15時ちょい過ぎくらいに巡回結果をGoogle hangouts Chatに投稿することにしてみた。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/91974/d4450e89-dbaf-8a6a-04da-5418a746c786.png)
※本日上場が決まったレオスキャピタルだとこんなイメージ。ていうかレオスキャピタル上場するんすかそうですか。
agora.io SDKでビデオ通話アプリの開発(iOS版)

#1対1のシンプルなビデオ通話の実装
利用SDK:AgoraVideoSDK for iOS
SDKバージョン:2.3.1

##SDKの入手
https://www.agora.io/en/download/ からiOS用のSDKをダウンロードします。
サンプルコードも内包されています。
![スクリーンショット_0030-11-19_16_15_50.png](https://qiita-image-store.s3.amazonaws.com/0/300377/9141c885-f647-ec86-55ee-2ff0865a3ccc.png)

samplesフォルダにはビデオ通話用のサンプルとライブ配信用のサンプルが含まれてます。
今回はビデオ通話用のサンプル「Agora-iOS-Tutorial-Swift-1to1」を利用します。

AppIDをご利用のものに変更します。

```swift:AppID.swift
let AppID: String = <#Your App ID#>  
```

AgoraSDKを初期化します。

```swift:VideoChatViewController.swift
func initializeAgoraEngine() {
    agoraKit = AgoraRtcEngineKit.sharedEngine(withAppId: AppID, delegate: self)
}
```

ローカル映像を設定を行います。

```swift:VideoChatViewController.swift
func setupVideo() {
    agoraKit.enableVideo()
    agoraKit.setVideoEncoderConfiguration(AgoraVideoEncoderConfiguration(size: AgoraVideoDimension640x360,
                                                                         frameRate: .fps15,
                                                                         bitrate: AgoraVideoBitrateStandard,
                                                                         orientationMode: .adaptative))
}
```

ローカル映像を表示します。

```swift:VideoChatViewController.swift
func setupLocalVideo() {
    let videoCanvas = AgoraRtcVideoCanvas()
    videoCanvas.uid = 0
    videoCanvas.view = localVideo
    videoCanvas.renderMode = .hidden
    agoraKit.setupLocalVideo(videoCanvas)
}
```

チャネルに接続します。

```swift:VideoChatViewController.swift
func joinChannel() {
    agoraKit.setDefaultAudioRouteToSpeakerphone(true)
    agoraKit.joinChannel(byToken: nil, channelId: "demoChannel1", info:nil, uid:0) {[weak self] (sid, uid, elapsed) -> Void in
        if let weakSelf = self {
            UIApplication.shared.isIdleTimerDisabled = true
        }
    }
}
```

他拠点の映像を表示します。

```swift:VideoChatViewController.swift
func rtcEngine(_ engine: AgoraRtcEngineKit, firstRemoteVideoDecodedOfUid uid:UInt, size:CGSize, elapsed:Int) {
    if (remoteVideo.isHidden) {
        remoteVideo.isHidden = false
    }
    let videoCanvas = AgoraRtcVideoCanvas()
    videoCanvas.uid = uid
    videoCanvas.view = remoteVideo
    videoCanvas.renderMode = .adaptive
    agoraKit.setupRemoteVideo(videoCanvas)
}
```


必要最低限の実装はこれだけです。
サーバを用意する必要はなく、これだけのコード量で低遅延のビデオ通話アプリが構築可能です。



#最後に
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=e1d31d9f0af0e0bf917c)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=e1d31d9f0af0e0bf917c)
【更新中】FI勉強会(概要)

##前提知識
####1. 勘定コード表
#####定義
勘定コード表には、1 つ以上の会社コードで使用されるすべての G/L 勘定が含まれています。

- T-cd:OB13 更新: 勘定コード表一覧

#####使用
各会社コードに対して 1 つの勘定コード表を割り当てる必要があります。この勘定コード表が運用勘定コード表であり、この会社コードでの日々の転記に使用されます。
複数の会社コードを使用できます。

- T-cd:OB62 割当: 会社コード -> 勘定コード表

####2. 勘定科目
#####定義
複式簿記の仕訳や財務諸表などに用いる表示金額の名目をあらわす科目のことである。単に「勘定」、「科目」とも呼ばれる。 
#####概要
主な勘定科目としては、貸借対照表（balance sheet）で用いられる

- 資産（asset）
 - 流動資産
 - 固定資産 
 - 繰延資産
 
   例：現金、預金、受取手形、売掛金、未収金、有価証券、商品、短期貸付金、長期貸付金など

- 負債（liability）
 - 流動負債
 - 固定負債
 
   例：買掛金、未払金、短期借入金、長期借入金、預り金、支払手形、仮受金、未払費用など

- 純資産（net asset）

 例：資本金、引出金、資本準備金、利益準備金など

や、損益計算書（income (profit and loss) statement）で用いられる 

- 費用（expense）
 - 営業費用
 - 営業外費用
 - 特別損失
 - 税等
 
 例：仕入高、給料手当、退職金、福利厚生費、荷造発送費、販売促進費など

- 収益（revenue）
 - 営業収益
 - 営業外収益
 - 特別利益
   
 例：売上、受取手数料、受取家賃、受取利息、有価証券利息、受取配当金、受取地代など

がある。 

#####2.1 勘定グループ
勘定コードを登録する際は、 勘定グループを指定する必要があります。
勘定グループにより以下を決定します。

- 勘定コードの間隔
- マスタレコードの登録時および変更時に必須入力する項目とオプション入力する項目
- マスタデータの登録時および変更時に非表示にする項目

勘定グループによって、画面のレイアウトを制御することができます。
勘定グループによって、上記の条件に従って勘定を組み合わせます (損益勘定グループ、資産勘定グループ、品目勘定グループなど)。

-  T-cd:OBD4 定義: 勘定グループ

####3. 総勘定元帳（そうかんじょうもとちょう）
#####定義
仕訳帳の内容を勘定科目ごとに転記した帳簿です。

####4. 仕訳帳
#####定義
仕訳とは、ある取引を「勘定科目」を使って「借方（左側）」と「貸方（右側）」に分けることです。借方と貸方は、それぞれ同じ残高にする決まりとなっています。

####5. 統制勘定
#####定義
統制勘定は、補助元帳勘定 (債権、債務、固定資産など) に取引が入力されるたびに自動で転記が行われる G/L 勘定です。それぞれの補助元帳では、総勘定元帳で同じ統制勘定に表示される補助元帳勘定は、常に、勘定設定グループにまとめられます。勘定設定では、それぞれの勘定設定グループに対して少なくとも 1 つの統制勘定が割り当てられます。

####6. 消込
#####定義
未消込明細は、契約アカウントのすべての転記トランザクションについて生成され、まだ終了していない取引を表します。明細消込管理で、未収金および未払金の残高があるかどうかを確認することができます。契約未収金 /未払金管理のほとんどの処理手順 (督促処理や支払など) は、未消込明細にもとづいて契約アカウントを管理していないと使用できません。

####7. 勘定コードマスタデータ
#####定義
勘定コードマスタレコードには、勘定の機能を決定するために、総勘定元帳で常に必要とされるデータが格納されています。勘定コードマスタレコードにより、会計取引の G/L 勘定への転記および転記データの処理が制御されます。
#####構成

勘定コードマスタレコードは次の 2 つの領域に分かれています。そのため、同じ勘定コード表を持つ会社コードでは同じ G/L 勘定が使用されます。

 - 勘定コード表上の勘定コードマスタレコード(T-cd:FSP0)
 タイプ/テキスト、キーワード/翻訳、情報の3つのタブ
 - 会社コード上の勘定コードマスタレコード(T-cd:FSS0)
 管理データ、登録/銀行/金利、情報の3つのタブ
 会社コード別領域には、会社コードごとに異なるデータが格納されています。たとえば、勘定の転記に使用される通貨などです。
 - 共通(T-cd:FS00)
 以上のタブ6つをすべて含む

#####テーブル

- SKA1　G/L 勘定マスタ (勘定コード表)
- SKB1　勘定コードマスタ (会社コード)
- SKAT　勘定コードマスタレコード (勘定コード表: テキスト)

#####7.1 勘定科目のカテゴリ

- BSA 貸借対照表勘定
- PLA 損益計算書勘定
- RAA 統制勘定

#####7.2 項目ステータスバリアント
一つの項目ステータスバリアントにいくつかの項目ス テータスバリアントを一緒にグループ化します。
各 G/L 勘定の会社コード依存の領域に項目ステータスグループを定義する必要があります。 項目ステータスグループによりどの項目が入力可能であるか、どの項目が入力項目を必要とするかそして、どの項目が伝票入力のときに非表示であるかが決定されます。追加勘定割当 (例えば、原価センタや指図) は対応する項目にデータが入力される場合のみ可能であることに注意してください。

IMG:
財務会計-->総勘定元帳⇒取引-->一般転記-->伝票設定の実行/チェック-->定義: 項目ステータスバリアント


####※参照
[SAP 文書](https://help.sap.com/saphelp_erp2005/helpdata/ja/c7/a88ab243dd11d182b30000e829fbfe/frameset.htm)
[Wikipedia](https://ja.wikipedia.org/wiki/%E5%8B%98%E5%AE%9A%E7%A7%91%E7%9B%AE#主な勘定科目)
Vue.js SVGで円グラフタイマーを作る

Vue.jsでちょっとしたゲームをつくっています。（Vueでつくるってどうなのという話はさておき）
制限時間内に何かをするという内容のゲームでして
制限時間が減少すると円グラフが増えていくようなタイマーを作成してみました。

完成イメージ
![aaa_1_1.gif](https://qiita-image-store.s3.amazonaws.com/0/3093/e3892675-017e-9277-6955-9623cc41239a.gif)

ソースはこちらです。

```js

<template>
  <div class="pieWp">
    <svg width="100%" height="100%" viewBox="-1 -1 2 2" class="donut">
      <!--背景-->
      <circle cx="0" cy="0" r="1" fill="#dddddd" />
      <path :d=calc :fill=color ></path>
    </svg>
    <p>{{nowTime}}</p>
  </div>
</template>

<style lang="stylus">
  .donut
    transform rotate(-90deg)
</style>

<script>
  import { TweenMax } from 'greensock';
  export default {
    data(){
      return {
        time: 6,
        percent:1,
        color: 'red',
        startX:1,
        startY:0,
        currentPercent:0
      }
    },
    methods: {
      getPieVal(per){
        const x = Math.cos(2 * Math.PI * per);
        const y = Math.sin(2 * Math.PI * per);
        return [x, y];
      },
      start(){
        TweenMax.to(this.$data, this.time, {
          currentPercent : this.$data.percent,
          onComplete:this.complete,
          ease: Power0.easeNone
        });
      },
      complete(){
        alert("Finish")
      }
    },
    computed : {
      calc(){
        const [endX, endY] = this.getPieVal(this.$data.currentPercent);
        const largeArcFlag = this.$data.currentPercent > .5 ? 1 : 0;
        const pathData = [
          `M ${this.$data.startX} ${this.$data.startY}`,
          `A 1 1 0 ${largeArcFlag} 1 ${endX} ${endY}`,
          `L 0 0`,
        ].join(' ');
        return pathData;
      },
      nowTime(){
        return Math.ceil(this.$data.time - this.$data.time * this.$data.currentPercent)
      }
    },
    mounted(){
      setTimeout(()=>{
        this.start()
      },100);
    }
  }
</script>
```


Codepenはこちら
※上記のコードをボタンでスタートするように変えてます。
<p data-height="265" data-theme-id="0" data-slug-hash="PxJEQY" data-default-tab="js,result" data-user="AsaToBan" data-pen-title="Vue Pie" class="codepen">See the Pen <a href="https://codepen.io/AsaToBan/pen/PxJEQY/">Vue Pie</a> by AsaToBan (<a href="https://codepen.io/AsaToBan">@AsaToBan</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

SVGのPathタグは分かりづらいですね。
Canvasで作成するほうがどちらかというと直感的に操作できそうです。

こちらを改造したインフォグラフィックサイトなどでつかえそうなグラフ版も作成しましたので、
機会がありましたらご紹介します。


下記の記事を参考にしました。
https://hackernoon.com/a-simple-pie-chart-in-svg-dbdd653b6936
solidus内のカテゴリーと商品のidをcontrollerを使わずにテンプレートに呼び出して表示させる

#はじめに
solidus内のtaxonomy,taxon,productのidをviewのlink_toに使用したい場合について。
当初は変更前で実装していたのですが、コントローラーを使わずに直接テンプレートに呼び出せると知ったので備忘録として記します。
以下ではtaxonomy,product共に一番最初のカテゴリー、商品を取得する実装にしてあります。

##変更前
コントローラーでインスタンス変数を定義してからビューでidを呼び出す

```ruby:hogehoge_controller.rb
def index
  @taxonomy = Spree::Taxon.roots.first
  @product = Spree::Product.first
end
```

```ruby:index.html.erb

# taxonomyのidをlink_toで使用する場合
link_to "Categories", hogehoge_category_path(@taxonomy.id)

# productのidをlink_toで使用する場合
link_to "Product", hogehoge_product_path(@product.id)

```



##変更後
テンプレート内で直接idを呼び出す

```ruby:index.html.erb

# taxonomyのidをlink_toで使用する場合
link_to "Categories", hogehoge_category_path(Spree::Taxon.roots.first.id)

# productのidをlink_toで使用する場合
link_to "Product", hogehoge_product_path(Spree::Product.first.id)

```

##おわりに
テンプレート内で直接idを呼び出すことで、controllerでインスタンス変数を記述しなくてもよくなり、簡潔になりました。
文字列を数値に変換

文字列を数値に変換する場合、今までは `try` ~ `catch` したり、`if("文字列".isNotEmpty() "文字列".toInt() else 0`や正規表現で考慮する必要があったが、**Kotlin1.1**から`toIntOrNull()`が追加された
正規表現などでやるよりずっと楽で便利


```kotlin
  "1".toIntOrNull()         // 1
  "hoge".toIntOrNull()      // null
  "hoge".toIntOrNull() ?: 0 // デフォルト値を設定するときとか
  "hoge".toInt()            // NumberFormatExceptionが発生する
```

#### 参考
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/to-int-or-null.html
Kibana を 6.4.x -> 6.5 に バージョンアップして「Kibana server is not ready yet」が出てしまった場合

最終手段として Index を削除して再起動してください。
=============================

.kibana_1
.kibana_2
...

```shell:Index削除
curl -XDELETE http://localhost:9200/.kibana_1
curl -XDELETE http://localhost:9200/.kibana_2
```
Font Awesome Version: 5.1.0をCDNで利用し、cssの疑似要素で表現する方法


こんにちは、missyです。

今回はタイトルどおり、
1. Font Awesome Version: 5.1.0をCDNで引っ張ってくる
2. CSSでFont Awesomeのアイコンを出す
これらについてカンタンに解説していきますーー！！

## Font Awesome Version: 5.1.0をCDNで引っ張ってくる

まずは[本家サイト](https://fontawesome.com/how-to-use/on-the-web/setup/getting-started?using=web-fonts-with-css)から以下のようなCDNの`linkタグ`をコピーします。
※ 有料版と無料版に分かれています。今回は無料版(FREE)を使います。

```
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
```

これをペッと`HEADタグ`内に貼り付けてください。

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>test</title>
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
    <link rel="stylesheet" href="./style.css">
  </head>
```


これで下準備はOKです。

ちなみにサンプルのhtmlはこちら

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>test</title>
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
    <link rel="stylesheet" href="./style.css">
  </head>
  <body>
    <main>
      <section>
        <h1>テスト</h1>
        <li>リスト1</li>
        <li>リスト2</li>
        <li>リスト3</li>
      </section>
    </main>
  </body>
</html>
```

## CSSでFont Awesomeのアイコンを出す

```css:style.css
@charset "UTF-8";

li:after{
  font-family: "Font Awesome 5 Free";
  font-weight: 900;
  content: "\f579";
}
```

 ポイントは3つ。
 - `font-family`の指定をしっかりとしてあげる。(Version 5以降、"Font Awesome 5 Free"という指定に変わったようです。)
- font-weightもお忘れなく！(選んだアイコンによって数値が変わります。bold, normalでもOK!)
- ユニコードにはバックスラッシュ(\)もお忘れなく！(例: `"\f579"`)


以上です。

### 結果

上記方法でそのままブラウザに表示させると以下のように出現すると思います。

<img width="617" alt="スクリーンショット 2018-07-07 20.29.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/224562/c800201d-5236-05b5-1494-e7d7888c4bc5.png">


#
Oculus Goでアプリを録画する

## 録画の流れ
個人の備忘録です。

1, アプリを起動
2. コントローラーのホームボタンを一度押す
3. アプリが待機中の状態でメインメニューのシェアというタブをクリック
4. 録画ボタンを押す
5. 中断中のアプリが自動で始まる(録画が始まる)
6. アプリを落とすと録画が止まる
です。
キャプチャーした動画は、
VR-Headset\内部共有ストレージ\oculus\VideoShots (Windowsのパスですが)
に保存されます。
TypeScriptのEnumのループはObject.entries()で実現可能

TypeScriptのEnumは`Object.entries()`でループが可能だったのでメモ。

## EnumはJSでどのように表示されるか

```typescript
export enum Hoge {
  FOO,
  BAR,
  PIYO
}
```

というEnumを記述すると、以下のようなJSにトランスパイルされる。

```javascript
export var Hoge;
(function (Hoge) {
    Hoge[Hoge["FOO"] = 0] = "FOO";
    Hoge[Hoge["BAR"] = 1] = "BAR";
    Hoge[Hoge["PIYO"] = 2] = "PIYO";
})(Hoge || (Hoge = {}));
```

早い話がJS内ではオブジェクトに変換されているということなので、Object.entries()を使えば要素ごとのループが可能ということがわかる。ということで、

```typescript
Object.entries(Hoge).forEach(([key, value]) => {
  console.log(key, value)
})

/*
0 FOO
1 BAR
2 PIYO
と出力
*/
```

と書けばOK。
オークファンのご紹介

# はじめに

オークファンで基盤技術部門を担当している @gessy0129 と言います
今回、ノリと勢いでAdventCalendar に参加してみました
企業としての参加は初めてです
organization に前年に登録し、今年はAdventCalendar と着々とQiita に情報を公開していっています
引き続き弊社のテクノロジーを公開していきますので皆様宜しくお願いします

# オークファングループの紹介

<img width="963" alt="スクリーンショット 2018-11-27 13.21.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/11006/8ecddbf3-3dc6-5e3b-0cf3-3c8a43b4e906.png">


※ 決算資料より


# 使用している技術について

+ グループ会社も含めて５社の企業の集合体となっています
+ そのため、使用している言語やミドルウェアも非常に多岐に渡っています
+ ざっくりとこんな環境ですというご紹介

## オークファン

__開発環境__

+ IntelliJ、PhpStorm
+ Vagrant、Docker

__ミドルウェア__

+ PHP、Perl、Java、Kotlin
+ CakePHP、FuelPHP、Laravel、CodeIgniter、SpringBoot
+ MySQL、SQLServer
+ Redis、memcached
+ AWS、Azure、DELL

## グループ各社

__開発環境__

+ IntelliJ、PhpStorm
+ Vagrant、Docker

__ミドルウェア__

+ PHP、Ruby、Perl、Go
+ MySQL、PostgreSQL、
+ Redis
+ DELL、AWS、さくら、IDCFクラウド

# その他ツール系

+ SharePoint
+ GoogleDrive
+ trello
+ Redmine
+ Kibela
+ PlantUML

# 今回のAdventCalendarについて

予想ですが、今回は初参加のため、オークファンの赤裸々な部分を出す人と、当たり障りのないやってみました系の人の二軸に分かれると予想しています
もし、オークファンについて聞いてみたいことあれば教えて下さい！
カレンダー上、 `なにか書きます` と書いてる人の所にいってリクエストするのでｗ

それでは、２５日間よろしくお願いいたします
Pickleの拡張子は.pickleと.pklどっちがいいの？

# 結論
**どっちでもいい**



そもそもPickleは拡張子自由に決められる．
ただ，他者が一目見てPickleのファイルとわかるべきなので，
少なくとも.pickleや.pkl以外の自作拡張子にすべきではない．
[Swift4]AppleTVでMenuボタンにアクションを追加する方法

# はじめに
まだまだtvOSの情報（日本語とか特に）がころがっていない2018年の年末に近づいてきました。

今回はSwift4でtvOSのApple TV Remoteの「Menu」ボタンにアクションを加える方法について記述します。

さっとググればstack overflowなどでソリューションを見つけられるので、既にググった上でここに辿り着いた方は見新しいものはないのでお引取りください..

# UITapGestureRecognizerを用いる
```swift:ViewController.swift
override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        let menuPressRecognizer = UITapGestureRecognizer()
        menuPressRecognizer.addTarget(self, action: #selector(ViewController.menuButtonAction(recognizer:)))
        // UIPress.PressType.menu.hashValue ではなくUIPress.PressType.menu.rawValue
        menuPressRecognizer.allowedPressTypes = [NSNumber(value: UIPress.PressType.menu.rawValue)]
        self.view.addGestureRecognizer(menuPressRecognizer)
    }
    

    func menuButtonAction(recognizer:UITapGestureRecognizer) {
        // ここにアクションを追加
        self.dismiss(animated: true, completion: nil)
    }
}
        
```

# ポイント
- **.rawValue**

Stack Overflowなどで`menuPressRecognizer.allowedPressTypes = [NSNumber(value: UIPress.PressType.menu.hashValue)]`と書いてあるものがありますが、`.rawValue`で動作します。



# 参考サイト
https://stackoverflow.com/questions/40634638/how-to-handle-menu-button-action-in-tvos-remote/41426885
https://qiita.com/noppefoxwolf/items/d2d6389127089f737a1b
STM32CubeMXをUbuntuにインストールする

##STM32CubeMXをUbuntuにインストールする
STM32CubeMXをUbuntuにインストールする上でいろいろ詰まったところがあるので、手順を書いていこうかと思います。
防備録です。

以下のYouTubeを参考にさせていただきました。ありがとうございます。
https://www.youtube.com/watch?v=FGneBNKR93k

#手順
最初に、TrueStudioをインストールしておいてください。

以下のサイトより、STM32CubeMXをダウンロードしてください。

https://www.st.com/ja/development-tools/stm32cubemx.html

ライセンスアグリーメントの承認と、名前とメールアドレスを聞かれます。
ダウンロードしたファイルを展開してください。

```
$cd en.stm32cubemx/
```
で、展開したフォルダの中に入り、

```
$./SetupSTM32CubeMX-4.27.0.linux
```
でインストーラを実行します。
手順に従ってインストールしてください。

次、Homeのインストールしたディレクトリに入ります。

```
$cd /home/username/STM32CubeMX
```
以下のコマンドで実行します

```
$java -jar STM32CubeMX
```

STMCubeMXが実行されました。
Alexaスキル申請のフィードバック内容まとめ

Alexaスキル公開で実際に申請が通らなかったフィードバック内容について
初めての申請で色々勉強になったので、まとめです。
まず。。。日本語でかなり丁寧にフィードバックをいただけます。

--------------------------------------------------
<img width="730" alt="スクリーンショット 2018-11-19 14.46.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/215684/cb3b0ca2-88ff-b7e4-5d8c-7fe6b2a02519.png">
--------------------------------------------------
Appleの申請のリジェクトの英語を思い出すと、
英語が苦手な私にとっては
フィードバックが日本語というだけでもやる気がぐんとあがります。
以下、私が実際に受けたフィードバック項目です。。。

##①スキル名
単純な単語だけだと以下のようなフィードバックを受けます。
>呼び出し名が一般的なため、ユーザーがスキルを呼び出しているということに気が付かないおそれ
があります。新しい呼び出し名に変更し、認定を再申請してください。呼び出し名を変更後にすべてのサンプルフレーズ、スキルの応答、スキルの説明に使用したフレーズが、新しい呼び出し名と一致していることを確認してください。

二語くらいを組み合わせたスキル名にする方が通りやすいようです。

##②サンプル発話
サンプル発話が少ないと通りにくく、以下のようなフィードバックを受けます。
>言い回しの異なるサンプル発話が不足しています。スキルを確実に起動させ、多くのユーザーのリクエストに対応するためには、サンプル発話を充実させる必要があります。今回ご提示いただいたサンプル発話のみでは、スキルが確実に起動しない可能性があります。以下のようなサンプル発話を追加して、再度ご申請ください。

思いつく限りのサンプル発話を登録する方が良いです。
例えば単に名前のスロット{name}があった場合は、
サンプル発話の例は単に{name}だけでなく、
{name}さん
{name}さんです
{name}くん
{name}ちゃん
など、考えられるものはできるだけ多く書いた方が良いようです。


## ③複数のインテントに同一のサンプル発話が含まれている場合
私の場合は自身のカスタムスロットとして{EndSlot}というスロットを作成したのですが、
何でもかんでも終われそうな文言を入れたら怒られてしまいました。。。。
>複数のインテントに同一のサンプル発話が含まれています。各インテントには独自のサンプル発話が必要です。ユーザーのリクエストが正しいインテントへ送られるように、修正・変更によって以下のスロット発話の重複を取り除いてください。 

>該当する箇所： 
{endSlot} やめて, とめて 

>補足： 
「やめて」はAMAZON.CancelIntentに、「とめて」は、既にAMAZON.StopIntentに定義されています。重複となりますので、上記のスロット値を削除して下さい。

単純に勉強不足です。。。
調べてみたら以下に記載がありました。
https://developer.amazon.com/ja/docs/custom-skills/standard-built-in-intents.html

##まとめ
数打ちゃ通るくらいの感覚でがんがん申請出しまくって本当にAmazonさんごめんなさい。。。
と思いつつも、本当にわかりやすいフィードバックに感謝いっぱいなので、
皆様もぜひ、スキル申請してみませんか・・・・？
独自プログラム言語を作る

### 概要
独自のプログラム言語を作ってみたい．そして，プログラムをコンパイルして実行してみたい．という人は(少数ではあると思うけれども)存在すると思う．しかし，普通に使われている言語は既に構文が難しかったり，機能がありすぎて実装を見ても挫折してしまう．また，プログラム言語を作る系の本はいくつか出版され，コードは取得できるけれど，最終的なコードしかなくて読むのが辛い．という事があるかと思う．
そこで，ここでは二項演算などの式の計算，および代入文，組み込み関数`print`(引数なし)しかないプログラム言語を定義し，字句解析，構文解析，意味解析．コード生成．仮想マシンの実装と．**ステップバイステップ**でコンパイラ．仮想マシンの実装を紹介していく．

### 言語仕様
とりあえず，以下のようなプログラムを実行できる言語にする．

```
int i;
double j;
i = 10;
j = i + 1;
print();
```

### 目次
・[字句解析を自作する](https://qiita.com/hiro4669/items/7455053e01fdc7b8653d)
・[構文解析1](https://qiita.com/hiro4669/items/8f3a7294bf7475f29b4b)
・[構文解析2](https://qiita.com/hiro4669/items/bf63488a4e6f4158d4a0)
・[意味解析](https://qiita.com/hiro4669/items/6113b0d36293610602e9)
・[バイトコード生成](https://qiita.com/hiro4669/items/a3cdd8e6e7e6d4fc30d2)
・[バイナリファイルの出力](https://qiita.com/hiro4669/items/1dcaa3d85da0303d824b)
・[仮想マシンの実装](https://qiita.com/hiro4669/items/b8e0d3fd27995c1bb3e4)
Windows で先頭に"."が付くファイル名に変更できない時の対策

# 名前を変えようとすると

Windowsのエクスプローラーでファイルの先頭に"."を付けて名前を変えようとすると、「ファイル名を入力してください。」というエラーが表示されます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/61404/8ea93e6d-4434-9196-087c-7f9fc7a113f3.png)

開発者であれば `.gitignore` など、頻繁に遭遇する条件だろうけど、10年以上前から地味に悩んでいても、未だに改善されないと思ってました

実はこれにはワークアラウンドがあって、末尾にも"."を付けると、どういう訳か末尾の"."が削除されて先頭に"."が付いた状態で名前変更ができるのでした

# 解決手順

`.editorconfig.` と本来の名前の後に "." を入れます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/61404/4114827c-d085-47cb-fbb6-3e046ed163ac.png)

警告画面には [はい] をクリックします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/61404/0f18cbed-6d9d-9790-be1c-61bb5b31fe05.png)

なんと、`.editorconfig` にかわり、目的のファイル名になりました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/61404/9a10102c-88c1-dd33-1a30-2c6791380f64.png)
Fabric導入にあたってやったこと

# Fabricアプリのインストールとログイン
以下からFabricアプリをダウンロードし、インストールする
https://fabric.io/downloads/xcode

インストールが完了したらログインする

# Podfileの編集
```
$ vi Podfile

~
pod 'Fabric'
pod 'Crashlytics'
~
※Podfile内に上記を追加

$ pod install

~
Installing Fabric (1.8.1)
Installing Crashlytics (3.11.1)
~
となればインストール完了
```

# アプリ側の実装
以下にアクセスする。ログイン状態になっていることが必要
https://fabric.io/kits/ios/crashlytics/install

Build Phase -> +ボタンを押してrun script -> テキスト欄に以下を追加

```
"${PODS_ROOT}/Fabric/run" xxxxxxx
```
※上記アドレスの「Run Script Build Phase」に記載してある
※ログインしていることで、ユーザーアカウント情報が紐付けられている

XCode10の場合はInput Filesに以下を追加

```
$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)
```

# ビルドおよびアーカイブの作成
ビルド対象をGeneric iOS Device に変更 -> ビルド -> アーカイブの順に行う

# アプリの配布
Fabricアプリの方にアプリが反映され、Destributeができるようになれば成功
Bash: 変数のデフォルト値の定義は`${変数名:-初期値}`でやる

Bashで変数のデフォルト値をセットするには、`${変数名:-初期値}`という書き方でやります。

```bash
#!/bin/bash
echo "message: ${MESSAGE}"
echo "message: ${MESSAGE:-hello}"

# ここでは、$MESSAGEは未定義。
MESSAGE=${MESSAGE:-bye} # 初期値を変数化するときは再代入する
echo "message: ${MESSAGE}"
echo "message: ${MESSAGE:-hello}"
```

output:

```
message: 
message: hello
message: bye
message: bye
```
Egretのプロダクトラインナップ



https://www.egret.com/products/

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/d36cefa3-60ad-3395-5d56-ee2562d51dfc.png)


# Egret Engine
オープンソースで無料なHTML5 2Dエンジン
TypeScript/JavaScript(ES6)による開発に対応

# Egret3D
Egret2Dとシームレスに統合されたマルチプラットフォーム対応の3Dゲームエンジン

***注意事項*** クローズドβのため普通の人は触れません

# Egret Native
Egret Engineで作成されたゲームをネイティブアプリ化できる
洗練されたリソースのキャッシュ戦略とホットアップデート機構を備えている

***注意事項*** 独立したプロダクトではなく書き出し時にネイティブアプリを選択するとこちらのソリューションが利用されます

# Egret Wing
Egret Wing は EgretプロジェクトのためのIDE(統合開発環境)

- EUI(EgretUI)プロジェクトのWYSIWYG編集や管理ができる
- TypeScriptコードのコーディングとブレークポイントを使ったデバッグができる

# Egret DragonBones
オープンソースで無料のモバイルゲーム用のスケルトン・アニメーションのためのソリューション

# Lakeshore
プログラミング不要でゲームが作れるフリーのツールです

ゲーム画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/93181612-9151-9a49-d9f0-a8f9914a7e35.png)

エディタ画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/199aef7b-2b6a-6704-2c66-07b9f788cff8.png)

#  Egret Feather
複数のパラメータをいじってゲームにエフェクトを追加できるパーティクルエディター

# Texture Merger
テクスチャーをパッケージングするツール
小さな複数のテクスチャーを一つの大きなテクスチャーに結合することでパフォーマンスを改善します


#  Res Depot
Egretでゲーム制作するためのビジュアル・リソース・管理ツール
簡単かつ効率的に大量のゲームのマテリアルやリソースファイルを管理できます

# Egret Inspector
EgretプロジェクトをビジュアルデバッグできるようにするChrome デベロッパー向けのプラグイン

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/dc40f909-d534-e39e-6340-a4277bd14313.png)


# Egretia Server
前記のサイトには記載されていませんが、Egret LauncherのToolsに存在したプロダクトです。ブロックチェーンEthereum用のサーバーのようです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/302078/73c2730c-425d-a516-3f79-fb7416059aea.png)
ReactNative(expo)でQRをReadする。


expoを利用すれば簡単にQR（Barcode)をリードできます。ちなみに生成は[こちら](https://qiita.com/zaburo/items/0f81d8568e577f03da1d)。

## 実装

下記のように書けば動きます。
パーミッション取ったり。

```js:App.js
import React from 'react';
import { StyleSheet, Text, View,Alert } from 'react-native';
import { BarCodeScanner, Permissions } from 'expo';

export default class App extends React.Component {

  state = {
    hasCameraPermission: null,
  }

  async componentDidMount() {
    const { status } = await Permissions.askAsync(Permissions.CAMERA);
    this.setState({
      hasCameraPermission: status === 'granted'
    });
  }

  render() {

    const { hasCameraPermission } = this.state;

    if(hasCameraPermission === null){
      return <Text>Requesting for camera permission</Text>
    }

    if(hasCameraPermission === false){
      return <Text>No access to camera</Text>
    }

    return (
      <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
        <BarCodeScanner
          onBarCodeRead={this.handleBarCodeScanned}
          style={{height:300, width:300}}
        />
      </View>
    );
  }

  handleBarCodeScanned = ({type, data}) => {
    Alert.alert('barcode type:' + type + ' data: ' + data);
  }
}
```

## 考察

* 読み取りを中止するコマンドが無いため、画面移動等、ずっと読み続けない実装が必要である。
* Androidでheightが効かない（伸びてしまう）。
* オーバーレイで読み取り範囲とかを表示するにはハック的対応が必要となる。

## 参考

下記に読み取り画面のスタイリングやキャンセル等のサンプルがある（未検証）。

* https://forums.expo.io/t/styling-the-barcodescanner/4637

画面制御によりQRの読み取り開始、終了を制御するサンプルを書きました（環境依存です。すみません）。

* https://qiita.com/zaburo/items/6c79d642465b4c540593
1つのオブジェクトに対する基本設定

#何の設定が必要なのか
まずはそこを考えなければならない。
動かす、当てる、タッチする、移動するなど様々な処理がある。
必要に応じて変えていってほしい。

##画像オブジェクト

var 変数名= new Sprite(350,494);//オブジェク作成
変数名.image=game.assets['画像パス'];//画像挿入
変数名.x=screenwidth-175;//x座標の初期位置を設定
変数名.y=screenHeight-247;//y座標の初期位置を設定
変数名.scaleX = screenwidth / 200;//x軸の画像倍率設定
変数名.scaleY = screenHeight / 300;//y軸の画像倍率設定
game.rootScene.addChild(変数名)//オブジェクを表示

必要最低限である。特に画像のトリミングなどは行っていないので丸いの画像を表す時には難しい。
CSSで設定できれば楽なのだが、実際にはできない。
四角の画像に無理やり重ねたりして設定して自分は行っている

##Label
変数名 = new Label(10, 10); //x y 引数
変数名.width = 112;//横のサイズ
変数名.x=screenWidth;//x軸の初期位置を設定
変数名.y= screenHeight;//y軸の初期位置を設定
変数名.color = 'magenta';//color設定(いろいろある)
変数名.font = '35px "Arial"';//pxとフォントを設定
変数名.text=Etherumkakuritu+"/1";//テキスト設定(ここに上書きすれば更新される)
変数名.scaleX = screenwidth / 400;//x軸の画像倍率設定
変数名.scaleY = screenHeight / 600;//y軸の画像倍率設定
game.rootScene.addChild(変数名);//オブジェクトを表示


特に難しいことはないが、画像で表したいときは１枚の画像に全部の数字を入れて都度画像の表示位置を変更していくのが一番楽かな、とは思う。

終わり
Mac OSX Chromeで特定URLのみしかアクセスできなくする（ホワイトリスト）

時々大企業のお客様では「うちのオフィスだとこういうURLフィルタ書けてるんだけど、御社のWebサービスって使える？」って聞かれることがあります。
製品サポートに聞くのもいいですが、エンジニアですから自分で試しましょう。

とはいえSSLを紐解いて中身でフィルタするのもそれはそれで面倒。
なので手っ取り早く、クライアントサイドで試してしまう方法をば。

**1.用意するもの**
- Chrome（今回はバージョン70以上）
- ターミナル

**2.やりかた**
では。
ホワイトリストしたいURLを列挙。
例えばGoogle（```https://www.google.com```と```https://www.google.co.jp```）しか使わせたくない場合。

```
defaults write com.google.Chrome URLWhitelist -array https://www.google.com https://www.google.co.jp
```
次にそれ以外をすべてのHTTPアクセスをブロックする。

```
defaults write com.google.Chrome URLBlacklist -array http://* https://*
```

これがおわったらブラウザから```chrome://policy/```にアクセス。「ポリシーの再読込」をクリック


これでブラウザからUIを操作。問題ないか確認。


終わったらもとに戻す。

```
defaults delete com.google.Chrome URLWhitelist
defaults delete com.google.Chrome URLBlacklist
```

ブラウザから```chrome://policy/```にアクセス。「ポリシーの再読込」をクリックしてきれいにしましょう。

おしまい。
iOSカメラのアクセス許可

毎回ググっている気がするのでメモ

Xcodeビルドでカメラのアクセス許可でエラーが出るので...

```
[access] This app has crashed because it attempted to access privacy-sensitive data without a usage description.  The app's Info.plist must contain an NSCameraUsageDescription key with a string value explaining to the user how the app uses this data.
```
PlayerSettings > Other Settings > Configuration > Camera Usage Descriptionを設定する。

<img width="367" alt="スクリーンショット 2018-11-21 20.12.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/136286/be4baa70-a09d-d775-61bb-7d06005175d4.png">

これでXCodeの`info.plist`に`Privacy - Camera Usage Description`が追加されてアプリが起動するようになる。

> 参考
[Info.plist - Requesting Permission Privacy Settings in iOS 10.](https://iosdevcenters.blogspot.com/2016/09/infoplist-privacy-settings-in-ios-10.html)
Nextcloud のパスワードポリシー設定

#パスワードポリシー設定
Nextcloudを利用していると、ユーザ自身がパスワードを設定する事があります。よく使うところでは、

**・ユーザーのログイン時のパスワード　**
**・URLリンク共有設定時のパスワード**

というシチュエーションで使います。
パスワードはユーザが任意で設定できますが、単純なパスワードだと、少し不安ですよね。
Nextcloudは、管理者がパスワードポリシーを設定できるので、今回はこれを紹介したいと思います。

#プラグイン
プラグイン名はそのまんまで「Password Policy」です。公式アプリです。
![画像103.png](https://qiita-image-store.s3.amazonaws.com/0/308127/b9a32bcd-0e63-2ee1-df00-2393982fada4.png)

#設定画面
管理者画面のセキュリティ項目で設定できます。
**・文字の長さ（何文字以上）**
**・一般的なパスワードの禁止**
**・大、小文字を必ず含む**
**・数字を必ず含む**
**・記号を必ず含む**
![画像104.png](https://qiita-image-store.s3.amazonaws.com/0/308127/4b090a9f-1b40-ca10-fd70-fdda4bd0718b.png)

ちなみに、ユーザーのパスワードポリシーについては、Nextcloudのローカルユーザのみ反映できます。LDAP連携したユーザは対象外です。（LDAP側でパスワードを管理しているので、当たり前な事ですが・・・。）

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
AugurのMarket内訳(2018-11-19)

予測市場のプラットフォームである[Augur(オーガー)](https://www.augur.net/)の、2018-11-19現在のマーケットの内訳です。
カテゴリ名を元に分類し、そのカテゴリに含まれるマーケット数を合計しました。


# マーケットの内訳(mainnet)

メインネット上には現在726個のマーケットがあります。

PRE_REPORTING(売買受付中)のマーケットの内訳は、
暗号通貨関連(crypt currency)：279(先週から+2)
スポーツ(sports)：121(+8)
政治(politics)：100(+0)
経済(finance)：71(+0)
その他(other)：155(+10)
でした。
![20181119-augur-market-count.png](https://qiita-image-store.s3.amazonaws.com/0/142577/d1eefc11-88d1-041d-5fb1-88ab970c5958.png)

# 感想
新たに作成されたマーケットもあれば、クローズしたマーケットもあるので、一概にどんな種類が活発かは分かりませんが、スポーツは人気があるようですね。
今後もウォッチを続けたいと思います。
jvn ipediaでベンダ名を指定して検索する

メモ書き

* URL末尾に「&vendor={数字}」をつける
* 詳細検索画面にベンダ名を指定するプルダウンメニューがあるが、選択肢が多すぎて選ぶのが辛い。
* 頻繁に調べたいベンダがあるなら各ベンダにふられている番号を控えておくと良さそう。

## The PHP Groupの場合
* vendor=22
もう一度ウィンドウ操作を考え直してみる

[前にもやったんですけど](https://qiita.com/astrorobot110/items/4b493d285a01437c3288)、ウィンドウ操作に関していろいろと見つめ直して業界で言う[「質実剛健な」](https://www.kaoriya.net/blog/2012/01/19/)vim使いを突き詰めてみようということで…あと転職活動中でヒマつぶししたいんですよ。  
あと、当時は任意のバッファを開くために`:sb`からいろいろと覚えようとしていたけど**無理でした。**そこは割り切って別な方法を…

## ウィンドウ分割くらいキーマップでなんとかせい

当時の表をちょっと加工して再掲…

| command   | key map       |
| :--       | :--           |
| `:sp`     | `<C-w> <C-s>` |
| `:vs`     | `<C-w> <C-v>` |
|           |               |
| `:new`    | `<C-w> <C-n>` |
| `:on[ly]` | `<C-w> <C-o>` |

横ペインに慣れてしまった現代の私たちは``:vs``を多用しようとしていたせいで無駄に``:vne``を覚えてなんとかしようとしていたのですが、覚えることが増えただけでした。素直に垂直分割してから新しいバッファにしましょう…ということで覚える必要があったのはこのくらいでした…その上で``<C-w>``絡みのキーマップが別にCtrlを引っ掛けていても全く問題がないのも忘れずに…

## バッファの移動もスイスイできればいいんだけど…

まーーーー`:sbなんちゃら`とかは無理でした。じゃあまず`:ls`すればいいじゃないということにしてしまうのが良さそうです。

## そもそも本当にコマンドでやるの？

本当に質実剛健にvimを操作できるわけではない現在、`:b`や`:ls`を使う大方の原因はバッファの行方不明というのが現状です。それをわざわざバッファを探すのに`:ls`するくらいならちゃんと`<C-o>`、`<C-i>`で辿って戻ればええんです。

## 編集中に覚えたりしたこと

### ghostTextは確かに便利だけど…

何が悪いのか、よくvimが落ちる様子。クセで`:w`してしまうと途端に挙動が変になるのでファイル書き込みを強制的に留めてしまうのが一番…ということでオートコマンドの出番なんですけど…

```kagome.vim
augroup toggleGhost
	autocmd!
	if v:servername == 'GHOSTTEXT'
		au VimEnter * call s:toggleGhost()
		au BufWinEnter ~/vimfiles/ghosttext/*.txt setlocal buftype=nowrite
	endif
augroup END
```

これがBufWinEnterの方だけ動かないわけです。うーん…
レンタルサーバーの使い道を元システムエンジニアが考えてみる

https://xn--t8j4aa4ntgvb8c2dre1cxqka5g3fb2887p2be232esy9i.com/post-1703

レンタルサーバー借りたはいいが
Googleフォトで対処出来るため
このレンタルサーバーはどうしよか……と迷ったため
使用方法をメモらせて頂きます。

やっぱりWordpressで子育てブログでも開設したいな……
[iOS]iOS12でiPadの解像度が変わっている？件

公式情報未確認ですが、自分で実験してみた結果です
　
それっぽい情報見当たらないんですが
https://developer.apple.com/documentation/ios_release_notes/ios_12_release_notes
　
「iPhone向けのアプリ」をiPadで表示した時、これまではiPhone4sと同じ縦横比で表示されていたと思います
それがiOS12で試したらiPhone6,7,8に近い、1:1.75程度の比率になっていました

iPad Air iOS11.4
![Simulator Screen Shot - iPad Air (11.4) - 2018-11-19 at 13.35.31.png](https://qiita-image-store.s3.amazonaws.com/0/20784/b5d3c46d-1679-1e6f-709d-75c8c0fa0506.png)

iPad Air iOS12.1
![Simulator Screen Shot - iPad Air - 2018-11-19 at 13.42.36.png](https://qiita-image-store.s3.amazonaws.com/0/20784/7eb37a98-0953-d2d3-3c19-34e238aed808.png)

詳細がわかったら追記します。

## 考えられる影響

iPhone4sがiOS9までなので、iOS10以降のアプリは、1:1.33や1:1.5などの優先度がかなり減ります
とは言えやっぱり対応していないとリジェクト対象なんでしょうか？？
ちなみにiPhoneX系は1:2以上なので、同じレイアウトで全部対応しようとすると大変です

（そこらヘん、今度別記事で書きたい）
3秒でわかるBQML

BQMLについて雑にまとめました。
構文等についてはほとんど書きません。
かなり雑に書いているので雰囲気だけ掴んでもらえるといいかもしれません。
詳細版は後日書く(と思います。)


## BQMLってなに？
- Bigqueryで機械学習ができるよ
- SQL(StandardSQL)でできるよ

## 何ができるの？
- 線形回帰
	- 予測に使える
		-	ex: こんな行動をした時ユーザーは課金するよ
		 
- ロジスティック回帰
	- 要因特定に使える
		- ex: 課金したユーザーはこの行動をしたから課金したよ
		
## 料金
- 今はかからないはず(BQの課金体系同様スキャン量で課金される)
- 2018/12/15からお金がかかる(遊ぶなら今がチャンス！)
	- モデルの作成: 250$/TB
	- 評価,予測: $5/TB

(参考:https://cloud.google.com/bigquery/pricing#bqml)
	

## どうやってやるの？
### 1.モデルの作成
- `CREATE MODEL`を使ってモデルを作成
	- 線形回帰/ロジスティック回帰でモデルを作る
	- 全データを使ってモデルを作らないように！(学習用と検証用に分ける)
	- 目的変数には `as label`をつける

### 2.モデルの評価
- `ML.EVALUATE`を使って作成したモデルを評価する
	- モデルの評価に使うデータは検証用を使う
	- 統計がよく分からん人は最低限下記だけみれば良さそう
		- ロジスティック回帰
			- f1_score:モデルの精度。1に近ければgood
		- 線形回帰
			- r2_score: 決定係数。1日近ければgood
			
### 3. 予測
- `ML.PREDICT` を使って予測する
- `predicted_{column_name}`が予測値として取得できる
Kafka

[Kafka](https://www.amazon.co.jp/Kafka-Neha-Narkhede/dp/4873118492/ref=sr_1_1?ie=UTF8&qid=1537094165&sr=8-1&keywords=kafka)から気になったところだけ抽出

# 2章 Kafkaのインストール

## partition数の選び方

* そのtopicに対するスループットを考慮する。
    * 例えばそのtopicに1GB/secのReadWriteを期待し、かつConsumerが50MG/secでしかデータを処理できない場合、20のConsumerが並列に仕事ができるよう、partition数を20にすればよいことがわかる。
    * 尚、ProducerはConsumerよりずっと高速なので、見積もりの考慮に含む必要はない。
* partition数が多すぎてもよくない
    * リーダーの選出に時間がかかる。
    * 各partitionはBroker上のメモリやその他のリソースを費やす。
* 現在ではなく将来の設計に基づいて数を決める。
    * partition数は、減らすことはできないが増やすことはできる。
    * しかしながら、partition key に基づいてメッセージをルーティングしている場合は、後からpartition数を増やすことが難しくなりがち。

## ハードウェアの選択

* Kafka自体には、ハードウェア構成に対する厳しい要件はない。が、パフォーマンスが問題となると考慮すべき。
* ディスク
    * ディスクへの書き込みは速ければ速いほどよい(そりゃそうだ)
* メモリ
    * Consumerが読み出すメッセージはページキャッシュに格納されている。即ちページキャッシュに使えるメモリの容量が大きいほど高速に読み出せる。
    * JVMのヒープメモリはさほど使わない。150,000 mes/sec と 200 Mbit/sec のデータレートの処理が必要であっても、Brokerは5GBのヒープ領域で実行できる。
* CPU
    * CPUはハードウェア選択における面たる要因ではない。


## Zookeeper

* Zookeeperへの書き込みが発生するのは以下の二つ**のみ**
    * ConsumerGroupのメンバーシップに対する変更
    * Kafkaクラスタ自体に対する変更
* Consumerはオフセットの管理にZKかKafkaのどちらかを使用するか設定できる。
    * 0.9.0.0 より前のバージョンではZKでオフセット管理するのがデフォルト。0.9.0.0からKafka自体でオフセットを管理できるようになった。
    * ZKでオフセットを管理する場合、他のソフトウェアでZKを使用していなかを考慮する(たとえばSparkやHadoopなど)。この場合ZKとのやり取りが増えるので別のソフトウェアに影響を及ぼしうる。

# 3章 Kafka Producer: Kafkaにメッセージを書き込む

* `bootstrap.servers`は全てのBrokerを指定する必要はない。初期接続で全ての詳細情報を取得できるので。ただそれでも複数指定しておいたほうがよい。一つのBrokerがダウンしても別のBrokerにアクセスできるので。
* Producerの送り方は3種類
    * Fire-and-forget: うまく届いたかは気にしない
    * 同期送信: `send().get()`で一個ずつ届いたかどうかを確認する
    * 非同期送信: Kafkaから応答を受け取るとコールバック関数が呼び出される。大抵の場合これでよい。なぜならProducerはうまく届いたときにKafkaから返ってくるオフセット情報などは必要ないから。ERRORである場合のみ気にしたいので。
* keyがnullでデフォルトのPartitionerを使っている場合はラウンドロビンで均等にparitionに分配される。
* keyが指定されてデフォルトのPartitionerを使っている場合はそれらのメッセージが同一のpartitionにpublishされる。
    * keyからhashを計算してそれに相当するpartitionにpublishされる。
    * hashの計算は独自のアルゴリズムが使われているのでjavaのバージョンがあがってもここは変化なし。
* keyを指定すると同じpartitionにメッセージがpublishされるが、これは特定のpartitionにデータが偏ることにもなってします。これを避けるためには独自のPartitionerを実装すればよい。

# 4章 Kafka Consumer: Kafkaからデータを読み出す

* topicのpartition数よりも多いConsumerは意味がない。それだけアイドル状態になってしまう。
* リバランス(一番興味がある)
    * リバランスとは、Consumerから別のConsumerにOwnershipを移すことを指す。
    * リバランスが起きる条件:
        * ConsumerGroupにConsumerが追加された
        * Consumerがクラッシュした
* ConsumerはGroup Coordinatorに指定されたBrokerにheart beatを送る。
* heart beatを送るのは以下のタイミング:
    * pollingしているとき
    * commit時
* 一定時間heart beatがないと、BrokerはそのClientが死んだとみなしてリバランスを開始する。
    * その間処理をしていたConsumerはコミットされないままになる。


# Kafkaのpartitionとtopicの関係
* https://www.confluent.io/blog/how-choose-number-topics-partitions-kafka-cluster
* benchmark: https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines
* Performance of Producer: http://ingest.tips/2015/07/19/tips-for-improving-performance-of-kafka-producer/
TreasureDataのtdコマンドをAWS Lambdaで動かす

TreasureDataは`td` コマンドでいろいろな作業ができて便利。AWSのLambdaから動かせればもっと便利かな？と思ったのでトライしてみる。

# Lambdaの中身
[Lambda 実行環境と利用できるライブラリ](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html)によれば、Lambdaは `amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2` というAMIをベースに動いている。
[AWS Lambdaをいろいろ暴く](https://qiita.com/Keisuke69/items/9951a93fd711360a61c5)でも書かれているように、ファイルが展開される `/var/task` などはRead Onlyで、書き込みできるのは `/tmp` 、のようになっている。 

# tdを動かしたい...
tdコマンドはRubyで書かれているのだが、現時点でLambdaはRubyをサポートしていない。
なので `/var/task` 内にRubyの実行環境を含めて構築する必要がある。

が、ポータブルなRubyとしてよく例のでてくるTraveling Rubyは2.2.2と古い。それに、Ruby力の低い僕にはmsgpackをビルドすることができなかった…

行き詰まりつつあったが、[TreasureDataがオフィシャルに配布しているパッケージ](https://docs.fluentd.org/v1.0/articles/install-by-rpm#amazon-linux)をよく見てみたところ、Ruby含めて全て`/opt/td-agent` に同梱されてるじゃん!　これでいいじゃん!

# Dockerfile
Lambda用のzipを作るにはDockerを使うのが便利です。
配布されているスクリプトはLinux上でsudo出来ること前提につくられているので、Dockerfile用にばらしてあげる必要がある。

```
 FROM amazonlinux:2017.03
 
 RUN rpm --import https://packages.treasuredata.com/GPG-KEY-td-agent
 RUN echo $'[treasuredata]\n\
 name=TreasureData\n\
 baseurl=http://packages.treasuredata.com/3/amazon/1/\$releasever/\$basearch\n\
 gpgcheck=1\n\
 gpgkey=https://packages.treasuredata.com/GPG-KEY-td-agent\n\
 ' > /etc/yum.repos.d/td.repo
 RUN yum update -y \
   && yum install -y td-agent
 
 RUN mkdir -p /var/task/opt \
   && cp -r /opt/td-agent /var/task/opt
```

こんなかんじ。
`$ docker run --rm -v \`pwd\`/work:/work -it td-lambda:latest /bin/sh` のようにしてコンテナ内に入って `$ cp -r /var/task/* /work/` とかやればtd-agent一式が手に入る。

PythonなりNodeなりのスクリプトから動かすことになるのだが、Rubyのライブラリのパスを `/opt/...`から`/var/task` に変える方法がようわからんかったので、下のような残念なラッパを書いた。

```
 set -ex
 
 export GEM_HOME="/var/task/opt/td-agent/embedded/lib/ruby/gems/2.4.0/"
 export GEM_PATH="/var/task/opt/td-agent/embedded/lib/ruby/gems/2.4.0/"
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/var/task/opt/td-agent/embedded/lib
 
 exec ./opt/td-agent/embedded/bin/ruby \
   -I./opt/td-agent/embedded/lib/ruby/2.4.0/ \
   -I./opt/td-agent/embedded/lib/ruby/2.4.0/x86_64-linux \
   ./opt/td-agent/embedded/bin/td "$@"
```

とりあえずここまでで `td db:list` はできたっぽい。良かったね。

# 後日談
クライアントの案件にぶちこんで楽しようと思ったのだけど、よくよく考えると接続元IPにホワイトリスト制限があるからLambdaからアクセスできないじゃん!! ということでお蔵入りになってしまったので成仏のために記事にした。
Carloをpkgでパッケージ化してみた（おまけ付き）

# はじめに

:link: [CarloでNode.jsのツールにGUIをもたせる](https://qiita.com/Quramy/items/d38b26a7c0007e757353)

こちらの記事を拝見して「Calroの開発チーム曰く、 pkg を利用すればいいんじゃね？」ということなので、早速試してみました。

# Carlo の examples/systeminfo を pkg でパッケージ化してみる

まずは適当なディレクトリに Carlo を落としてきます。

```
$ git clone https://github.com/GoogleChromeLabs/carlo.git
```

中に examples/systeminfo があるので、これを使えるようにします。

```
$ cd carlo/examples/systeminfo
$ npm install
```

次に pkg を使えるようにします。

```
$ npm install -g pkg
```

最後に、pkg で systeminfo をパッケージ化します。

```
$ pkg .
```

なにやら３つほどファイルができました。

- systeminfo-app-linux
- systeminfo-app-macos
- systeminfo-app-win.exe

<img width="541" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/165224/1b4f9088-890d-681c-16dd-befebb7f7c35.png">

27～42MBほどです。小さい。。のかな？

# 実行してみる

手元の環境がWindowsですので、systeminfo-app-win.exeファイルを実行してみます。

<img width="974" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/165224/78bb47df-e1b4-92ec-e1b1-e49a0db252d9.png">

起動しました！
がっ、右下のCUI窓も立ち上がってしまいました。
先にNode.jsが立ち上がるので致し方ないのですが。。。
Electron のように、窓単体というわけにはいかないようです。

# おまけ
Electronの場合、パッケージを作るときは [electron-packager](https://github.com/electron-userland/electron-packager) が使えます。これを Carlo に使うとどうなるの？
ということで、これも試してみました。

electron-packagerを使えるようにします。

```
$ npm install -g electron-packager
```

パッケージ化します。

```
$ electron-packager . systeminfo --electron-version=3.0.9
```
※バージョン指定しないとElectronのバージョンがわからん！と怒られるので、バージョンだけ指定してあげます。

できたようです。さすがにこちらはランタイムがてんこ盛りでボリューミーですね。。

<img width="628" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/165224/771132c0-7472-514d-62b5-493b7bc05618.png">

起動します。

<img width="747" alt="無題.png" src="https://qiita-image-store.s3.amazonaws.com/0/165224/af66133c-cfce-b60f-01d8-d8eccfa3ad10.png">

おお！今度は単独の窓で起動できました！

余計なランタイムがてんこ盛りになって、いったい何がどう動いているのかはわかりませんが、Carlo を electron-packager でパッケージ化することができました。

このあたり、どちらでパッケージ化した方がお得かなど、わかるかたいらっしゃいましたら是非コメントください！
公共データのAPI化「しずみちinfo」

公共データを、オープンデータにし、それをAPI配信している例を紹介したいと思います。

静岡市では、道路規制情報をオープンデータとして公開しています。サービス名は、[「しずみちinfo」](https://shizuokashi-road.appspot.com/index_pub.html)。
<img width="1438" alt="スクリーンショット 2018-11-07 14.19.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/17424/e4de5726-c01c-e52c-5ce9-77906430d49c.png">
そして、このデータは、REST APIとしても公開されています。
[API仕様](http://opendata-api-wiki-dot-shizuokashi-road.appspot.com/)
このような公共データを、CC BY 4.0ライセンスで公開されたものをオープンデータと呼びます。APIアクセスも、もちろん無料でキーなどがなくてもアクセスできます。
道路の規制情報（自動運転には必須）、アンダーパスの冠水水位情報(ナビで教えてよ)、災害情報などをAPIで取得できます。
ちなみに**現在の道路規制情報**は、この[URI]((https://openapi.city.shizuoka.jp/opendataapi/servicepoint/roadRegulation?jsonp=true&callback=myCallbackFn&radius=24833&lat=34.98&lng=138.385&dummy=false))で取得できます。
https://openapi.city.shizuoka.jp/opendataapi/servicepoint/roadRegulation?jsonp=true&callback=myCallbackFn&radius=24833&lat=34.98&lng=138.385&dummy=false

静岡市では、道路を使った大型イベントの情報も配信されています。静岡市の大型イベントというと、"大道芸ワールドカップin静岡"や、"静岡マラソン2019"、そして花火大会。雨天中止の判断が何時下るのか、どの道路が封鎖されるのかすべてAPI公開されています。大道芸ワールドカップは、Yahoo! MAPにAPIが組み込まれ配信もされました。
[記事](http://daidogei.com/2018/yahoomap.php?fbclid=IwAR2b4QwA6jN4-5idPMJ38CwJk-cZIniNOmYAWLtTUd4oNlzQoAHZ2Su0FuA)

日本では**静的**なデータの公開は行われていますが、**動的**なデータの公開は始まったばかりです。現在、政府系のオープンデータサイトにも、動的なオープンデータは、他に見当たりません。
[DATA GO JP](http://www.data.go.jp/)
[オープンデータ | 政府CIOポータル](https://cio.go.jp/policy-opendata)

しかし、自動運転はもとより、民間の各種データに付加価値をつけるためにも、こうしたデータのAPI化は必要なことです。また、APIとして出すためには、標準化も必要です。静岡市は、標準化に向け仕様や、アイコンの図柄まで公開しています。
語彙のゆらぎはもとより、データ仕様さえも統一されないまま、政府の各省庁や、全国1800近い自治体がそれぞれに独自フォーマットで静的なデータを出しているのが現状です。動的なデータが出てくるまでに、標準化し、その後にAPIの流れを作り、早めに仕様を固めるべきです。

仕様を書いたことがある方々、今こそこうした状態を変えるときだとは思えないでしょうか？
CloudFrontのキャッシュ削除

CloudFrontでキャッシュを削除したが
パスの指定で削除できない状況があったのでメモ

# CloudFrontにキャッシュされたファイルを削除するには
CloudFrontコンソール画面の[無効化]タブから
[無効化を作成ボタン]を押し削除したいファイルのパスを指定します。
この時のパスはCloudFrontコンソール画面のオリジンタブでパスを設定している場合そこが基準になります。通常はドキュメントルート以下のパス（ドメイン以下のパス、例えばexample.com/path/test.txtのファイルを削除したいのであれば/path/text.txt）を指定します。

# 削除できたパス指定
/css/example.css

# 削除できなかったパス指定
/css/*.css

# 説明が出ました（過去の管理画面での話）
Create Invalidationsの画面でObject pathという
テキストにオンマウスすると説明がでました。

```google翻訳.txt
この無効化バッチで無効化するオブジェクトのパス。パスの末尾に*ワイルドカードを指定すると、ディレクトリ内のすべてのオブジェクトなど、多量のオブジェクトを無効にすることができます。パスの途中に*を指定すると、CloudFrontはワイルドカードではなく*文字として扱います。
```

```原文.txt
The paths of the objects that you want to invalidate with this invalidation batch. You can specify a * wildcard at the end of a path to invalidate muiltiple objects, for example, all of the objects in a directory. If you specify a * in the middle of a path, CloudFront treats it as a * character, not as a wildcard.
```
おそらく
/css/*
と指定すればよかったのかも。

Behaviorsタブでのパス指定と
同じかと思い指定しましたが少し挙動が違う気がします。

# 無効化の注意
月間1000件までは無料ですがそれ以降は
無効をリクエストしたパスごとに 0.005 USDかかるとのこと。（現時点では）
以下公式のリンクを随時ご確認ください。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html#PayingForInvalidation

# CloudFront管理下の全てのキャッシュを削除する
CloudFront管理下の全てのキャッシュを削除する時は以下の指定をします。

```
/*
```

# ファイルのバージョニング
ファイルのバージョニングでもキャッシュをクリアできるとの説明があった。
/jquery.js?v=xxxxx
みたいなものでブラウザのキャッシュがクリアできるが
CloudFrontでもクリアできるのか？試したら追記します。
CircleCIでPHPの拡張モジュールをインストールする際にDirectory nonexistentエラーが発生する

この記事はCircleCI2.0環境でPHPの拡張機能をインストールする際、エラーでビルドが停止してしまう現象を何とか回避する手順です。

* 2018/11/19 原因が判明したため解決方法を追記しました

## 現象
CircleCIの設定ファイルであるconfig.ymlを全くさわっていないにもかかわらず、直前まで通っていたビルドが一切通らなくなってしまいました。

エラーは以下のような内容が出力されます。

```sh
$ sudo docker-php-ext-install pdo_mysql

・・・

/usr/local/bin/docker-php-ext-enable: 108: /usr/local/bin/docker-php-ext-enable: cannot create /conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent
```

~~原因はまだ分かっておらず、根本的な解決にはなりませんがとりあえずの解決策として以下の対応を実行します。~~

どうやらdocker-libraryのphpモジュールが修正された際、sudoでは一部環境変数が引き継がれずディレクトリパスが見つからなくなっていたようです。

* [Docker build on circle CI failed: cannot create /conf.d/docker-php-ext-mcrypt.ini: Directory nonexistent](https://github.com/docker-library/php/issues/750)
* [Fix hardcoded ini dir #740](https://github.com/docker-library/php/pull/740)


## 対応（追記）

原因が判明して問題の解決方法がわかったので、イメージの固定ではなく環境変数の引き継ぎで対応します。

環境変数を引き継ぐために `sudo` コマンドに `-E` オプションを追加して実行するだけです。

```
$ sudo -E docker-php-ext-install pdo_mysql
```

これでイメージを固定しなくてもよくなり、すっきりビルドが通るようになりました。

## 仮対応

原因が判明して問題が解決した今、こちらの対応は一時しのぎですが一応残しておきます。

### 最後に成功したビルドのイメージIDを探す

まずCircleCIのビルドログを確認します。
確認するのは一番最初の `Spin up Environment` の実行ログです。
実行ログの最後の方にsha256のハッシュが記載されているので、これをメモします。

```
Status: Downloaded newer image for circleci/php:7.1-apache-jessie-node-browsers
  using image 
circleci/php@sha256:{hash}
```

### インストールするイメージを固定する

config.ymlに先ほど取得したハッシュを使用して、インストール時に使用されるイメージを固定します。

```
version: 2
jobs:
  build:
    docker:
      - image: circleci/php:7.1-apache-jessie-node-browsers@sha256:{先ほど取得したハッシュ値}
```

これで再度ビルドを通すと無事最後まで完走しました。