OmniAICreator/Qiita-1.07M huggingface dataset:
Google Tag Manager（2017-11時点）でモーダル表示をPVとしてカウントする方法

SPAじゃないサイトだけど、特定の機能だけモーダルで、そこだけをピンポイントでPVカウントしたかったのです。
意外と簡単でした。
#手順1.トリガー作成
これはサイトによって違うと思いますが、今回は特定のクラスが付いているDOM要素をクリックした際にモーダルを表示しているので、こんな感じでトリガーを作成。
![スクリーンショット 2017-11-13 15.18.50.png](https://qiita-image-store.s3.amazonaws.com/0/44525/bdfd5b71-7511-6c51-0bbe-4dbd2f24e3cc.png)
#手順2.仮想ページURL、ページ名称となる変数の作成
これもサイトによってまちまちですが、今回は手順1でトリガーとして設定する要素と同じ要素のカスタム属性の値をページURLとページ名称にします。
![スクリーンショット 2017-11-13 15.32.09.png](https://qiita-image-store.s3.amazonaws.com/0/44525/e7884df7-b238-7502-e03f-7cacea9df4b3.png)
#手順3.タグ作成
1.追加するタグのタグタイプは「従来のGoogleアナリティクス」を選択
1.トラッキングタイプは「ページビュー」
2.「その他設定」->「基本設定」の「仮想ページ遷移」「ページタイトル」を設定する
3.トリガーに手順1で作成したトリガーを設定して完了
![スクリーンショット 2017-11-13 15.25.40.png](https://qiita-image-store.s3.amazonaws.com/0/44525/5cd41b3d-c33c-2065-44a3-0859665c42e1.png)

以上！
あとはプレビューしてAnalyticsからご確認を。
openFrameworks 展示で外部ディスプレイ出力で困るやつ備忘録

## 背景と目的

![Screen Shot 2017-11-13 at 14.43.14.png](https://qiita-image-store.s3.amazonaws.com/0/56510/7ac4990a-bf2a-847e-1a0f-084898ae36b0.png)



PCはmacOSを想定しています、上の図のように、openFrameworksアプリケーションを作って、それを外部ディスプレイにフルスクリーンで表示されなくて困るなんてことありませんか？(この前、自分じゃなくても困ってる現場に遭遇した)

展示系の案件とかで毎回、あれどうやってやるんだったっけと思い出せなくなるので備忘録として残します。

他の手法とか周辺知識に関してはforumで議論されていました

- https://forum.openframeworks.cc/t/multi-display-fullscreen-0-9-0-osx/22010

今回のコードはgithubに上がっています

- https://github.com/Hiroki11x/openFrameworksSample/tree/master/SecondDisplay

## 方法

#### 1. SystemPreference

以下の画像の通り、mainをmacOSのPC、subdisplayとして外部のディプレイ(表示に使いたい側)をセットしておきます。
この時、二つのディスプレイの上端が揃っているといろいろコーディングしなくて済みます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/56510/4b110bcd-f380-9e95-7f61-306e1d499518.png" alt="1" width="50%" /><img src="https://qiita-image-store.s3.amazonaws.com/0/56510/f0615183-b243-4181-bff8-89ffaaee89f0.png" alt="2" width="50%" />

この時右側のディスプレイの大きさ(3440x1440)を覚えておきます。

#### 2. windowSetting

openFrameworksのコード側でwindowSettingというのを変更します。
正確には ofGLFWWindowSettings のことです 

- http://openframeworks.cc/documentation/application/ofGLFWWindowSettings/

変更前

```main.cpp

#include "ofMain.h"
#include "ofApp.h"

//========================================================================
int main( ){
	ofSetupOpenGL(1024,768,OF_WINDOW);			// <-------- setup the GL context

	// this kicks off the running of my app
	// can be OF_WINDOW or OF_FULLSCREEN
	// pass in width and height too:
	ofRunApp(new ofApp());

}
```

変更後

```main.cpp
#include "ofMain.h"
#include "ofApp.h"

//========================================================================
int main( ){
    ofGLFWWindowSettings windowSettings;
    windowSettings.decorated = false;
    windowSettings.width = 3440;
    windowSettings.height = 1440;
    ofCreateWindow(windowSettings);
    ofRunApp(new ofApp());
}

```

`windowSettings.decorated`に関しては、縮小拡大閉じるボタンなどを含む外枠をつけるかつけないかの選択肢です、今回フルスクリーンで出したいのでfalseとしています

`windowSettings.width`と`windowSettings.height`はwindowの幅と高さです、 SystemPreferenceで控えたディスプレイのサイズを入力しています。

`ofCreateWindow`に今まで設定したwindowSettingを渡してWindowを作ります。

次に、適当なものを描画するために、

```ofApp.cpp
#include "ofApp.h"

//--------------------------------------------------------------
void ofApp::setup(){
    ofSetWindowPosition(ofGetScreenWidth(), 0);
    ofSetLineWidth(2);
    ofSetCircleResolution(64);
}

//--------------------------------------------------------------
void ofApp::update(){

}

//--------------------------------------------------------------
void ofApp::draw(){
    ofBackground(0);
    ofDrawCircle(ofGetWidth()/2, ofGetHeight()/2, ofSignedNoise(ofGetElapsedTimef())*1000);
    ofDrawLine(0, 0, ofGetWidth(), ofGetHeight());
}
```

ポイントは

```cpp
ofSetWindowPosition(ofGetScreenWidth(), 0);
```

で、windowのポジションをmacOSの画面分横にずらしています。
SystemPreferenceで画面の上端を揃えていない場合、第二引数の0が変わってきて、これを計算するのが面倒なので、揃える形をとりました。


## 実行結果

実行してみると以下のような結果となります

[![youtube movie](http://img.youtube.com/vi/qDONna0pqpE/0.jpg)](http://www.youtube.com/watch?v=qDONna0pqpE)
Service Control Managerでのエラー　　イベントID7011、7000

「Smart Card Device Enumeration Service」のサービスを"停止"し、スタートアップの種類を"無効"にした事で問題が解消された。
http://miyamon-se-exp.hatenablog.jp/entry/2016/08/24/015620

とあるのでやってみたのをメモ失礼します。
OGPで本当に必要なメタタグは?

OGP。Facebookなどの投稿時にURLが含まれてたら見栄えの良いリンクにしてくれるアレです。
使い方を知りたくていろんな記事を読みましたが、最新の正しい情報を得るには、やはり公式ドキュメントを読むのが一番でした。

:link: [OGP公式ドキュメント](http://ogp.me/)

:link: [Facebook公式ドキュメント](https://developers.facebook.com/docs/sharing/webmasters/)
:link: [Facebookアプリの新規作成ページ](https://developers.facebook.com/apps/)
:link: [Facebook用表示テスト](https://developers.facebook.com/tools/debug/sharing/)

:link: [Twitter公式ドキュメント](https://developer.twitter.com/en/docs/tweets/optimize-with-cards/guides/getting-started)
:link: [Twitter用表示テスト](https://cards-dev.twitter.com/validator)


# 2017年11月13日時点で

## 一番シンプルな例
個人製作で、FacebookとTwitterにだけ対応すればいいのなら。

```html
<head><!-- prefixは不要 -->
<title>普通のタイトル</title>
<meta name="description" content="普通のディスクリプション">
<meta property="og:title"       content="OGPのタイトル">
<meta property="og:description" content="OGPのディスクリプション">
<meta property="og:url"         content="http://foo.com">
<meta name="twitter:card"       content="summary">

<!-- 画像を載せたい場合 -->
<meta property="og:image"       content="http://foo.com/bar.jpg">
```

### 画像なし
Twitter
![Twitter-simple.png](https://qiita-image-store.s3.amazonaws.com/0/27816/ab881364-df1a-ec57-4959-7b1ec7236ba1.png)

Facebook
![Facebook-simple.png](https://qiita-image-store.s3.amazonaws.com/0/27816/a89d816c-23a5-d54d-f116-84c2320a70a3.png)

### 画像あり
画像の元サイズは250x250です。

Twitter
![Twitter-normal.png](https://qiita-image-store.s3.amazonaws.com/0/27816/795fab46-b2c2-5463-92d1-ada488c13096.png)

Facebook
![Facebook-normal.png](https://qiita-image-store.s3.amazonaws.com/0/27816/a40c4360-caa7-4220-b40d-102c7c826c7a.png)

Facebookのデバッガーでは「修正が必要な問題」として`fb:app_id`などが不足していることが警告されますが、無視してかまわないと思います。
なお、Twitterでは`og:title`が必須です。
ないとTwitterのバリデーターでは下記のように警告され、実際の投稿でもカードが表示されません。

```
INFO:  Page fetched successfully
INFO:  6 metatags were found
INFO:  twitter:card = summary tag found
ERROR: Possibly invalid value (if specified) (og:title)
ERROR: Possibly invalid value (if specified) (twitter:text:title)
ERROR: Possibly invalid value (if specified) (twitter:title)
```

また、Twitterでは`og:description`がないと、タイトルのみの寂しいカードになってしまいます。
![Twitterディスクリプションが必要.png](https://qiita-image-store.s3.amazonaws.com/0/27816/a0e9d8b2-423f-5915-ee11-35402e7cad59.png)


## 推奨されている例
お仕事ならば、それぞれの公式ドキュメントに従って正しく記述した方がいいと思います。
調べていませんが、他のSNSでは必要かもしれませんし。

```html
<head prefix="og: http://ogp.me/ns# website: http://ogp.me/ns/website#">
<title>普通のタイトル</title>
<meta name="description" content="普通のディスクリプション">
<meta property="og:title"       content="OGPのタイトル">
<meta property="og:description" content="OGPのディスクリプション" />
<meta property="og:type"        content="website" />
<meta property="og:url"         content="http://foo.com" />
<meta property="og:image"       content="http://foo.com/bar.jpg" />
<meta property="fb:app_id"      content="1234567890123456" />
<meta name="twitter:card"       content="summary" />
<meta name="twitter:site"       content="@foo_bar" />
<meta name="twitter:creator"    content="@foo_bar" />
```
猫でもわかりたいDDD(Domain Driven Design)　0から開発したことないあなたに　その１

この業界に入って3年目のペーペーがDDD(Domain driven design)について書きたいと思います。
DDDについての要約というよりも、より噛み砕いた説明になっているので、かなり冗長かもしれません。

~参考書籍~
Domain Driven design Quickly
エリック・エヴァンスのドメイン駆動設計
現場で役立つシステム設計の原則

#DDD(Domain driven design)とは？

以下wikipediaから抜粋(読まなくていいです)

>Eric Evans提唱したソフトウェア設計の手法です。
「複雑なドメインの設計は、モデルベースで行うべき」であり、また「大半のソフトウェアプロジェクトでは、システムを実装するための特定の技術ではなく、ドメインそのものとドメインのロジックに焦点を置くべき」であるとする。

具体的に以下の特徴が挙げられる(読まなくていいです)。

>・エンティティ (参照オブジェクト): ドメインモデル内のオブジェクトであり、その属性によってではなく、連続性と識別性によって定義される。
・値オブジェクト: 事物の特性を記述するオブジェクトである。特に識別する情報はなく、通例、読み出し専用のオブジェクトであり、Flyweight パターンを用いて共有できる。
・サービス: 操作がオブジェクトに属さない場合に、問題の自然な解決策として、操作をサービスとして実現することができる。サービスの概念は、GRASPにおいて"純粋人工物"と呼ばれるものである。
・リポジトリ:ドメインオブジェクトを取得するメソッドは、記憶域の実装を簡単に切り替えられるようにするため、専門のリポジトリオブジェクトに処理を委譲するべきである。
ファクトリー : ドメインオブジェクトを生成するメソッドは、実装を簡単に切り替えられるようにするため、専門のファクトリーオブジェクトに処理を委譲するべきである。

わかりにくいですね。
新しい概念を学んでる時に、また新しい概念が出てくるとイライラしますよね。

なのでここではできるだけ、すでに知っている概念に置き換えて説明して見たいと思います。

#・そもそも何に役立つ物なの？？
私事なんですが、私は既存のコードをこの三年間で色々見てきました。
小規模から大規模な案件、どのコードを眺める時も思ってたことがあります。

「クラスやDBのモデルがたくさんあるけど、どうやってこう設計したんだろう」

ソースコードを見れば、クラスやモデルがどのような動きをするのか理解はできます。
ただ、そのコードを何も見ないで同じ動きをするものを作れと言われたら、作れない気がしていました。

そんな中、現職場のリーダーにオススメされたのが、DDDでした。

なのでこの記事は「ある程度技術がついてきてソースリーディングも行えるが、設計ってどうやるの？」って人向けです

#・ドメイン

何はともあれ一番最初に説明しなければいけないのがこれですね。

まずドメインとは**『専門領域』**です。
意味がわからないと思うので、具体例で説明しましょう。

*あなたは航空会社に依頼されて、航空監視システムを作ることになりました。*
何から手をつければいいでしょうか？
飛行機のクラスを作るところからでしょうか？
各飛行場のDBモデルを作るところからでしょうか？
そうではないですね。
最初にやらなければいけないのは、実際にどのように航空を監視しているのか知ることです。

業務に対する十分な知識がないまま、システムを構築することは不可能です。
私たちは飛行機が空を飛んでいること以外何も知らないのです。

ではどのように知ればいいでしょうか。
一体、誰が航空監視システムについて一番詳しいでしょうか？
それはもちろん、実際に航空会社で働かれている方です。
専門領域の話は専門家に伺うのが一番確実ですね。


###ドメインまとめ
ドメインとは専門領域のことである。
ドメインについて詳しく知るには、専門家に聞くのが一番である。

#・モデリング ~ウォーターフォール設計の功績と問題~

誰もが一度は聞いたことがあるだろうウォーターフォール設計
どの様なものかをざっくばらんに説明しますと

1.業務の専門家が要求を書き起こして、それをアナリストへ渡す
2.アナリストはそれを元に設計書を作り(モデリング)、それがソフトウェア開発者へと流れて行く
3.開発者が設計書を元に開発を始める
と言うものです。

この手法はソフトウェア設計の伝統的な手法で、一定の成果を上げて長く使われてきました。
しかしいくつかの問題を内包しています。

その中の一つに
**専門家->あなた**へと、ドメイン(専門領域)知識が直接渡ってきていないことです。
あなたは、アナリストがモデルに落とし込んだ設計書から、実際にしてほしいことを読みとらなければいけないわけです。

設計書通り作っているうちは問題ないですが、実際のシステムが設計の段階で完璧に収まっていることなどあり得ません。
必ずどこかしらで
「このような状態の時にはどのように振る舞うのが正しいのか」
などの疑問が生まれてきます。

その際、あなたはアナリストへ仕様を伺いに行き、
アナリストは専門家へ何が正しいのかを確認しに行きます。
まるで伝言ゲームみたいですね。

お互いの関心を共有させるのに最も適しているのは、面と向き合って言葉で概念や疑問をぶつけ合うことです。
文字に起こしたり一方通行的な情報フォールだと、知識というのは純度が下がって行きます。
これがウォーターフォール開発が抱えている問題の一つです。

エリックは上記の問題について
**「なら初めから専門家と開発者がミーティングすればよくない？」**
と考えました。

これらがDDDの骨幹となっている部分です。

###前編まとめ
DDDとはつまり、実際にあるドメインをどの様に実装に落とし込み、開発に変換して行くかを考えた手法の一つです。

既存の開発方法で問題が起きていることを、DDDではいろんな方法を使い解決していこうと試みています。

ほぼさわりだけになってしまいましたが
具体的な内容は中編で。。。
【Ethereum】テスト用イーサのもらい方【Rinkeby】

アドレスを載せたgistファイルのURLを[Rinkeby Authenticated Faucet](https://faucet.rinkeby.io/)にコピペしてイーサをもらうリクエストをする方式はもう終了したっぽいです。

google+かfacebook、twitterが利用できます。

ちなみにtwitterだとこんなんでよいみたいです。
<img width="614" alt="rinkebytweet.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/753d20f8-3206-b637-e956-793e83490960.png">

gistを使う方式の時は３ethirから選択できたけど、twitter方式だといくらもらえるのだろうか…
実はまだもらってないので分からない。


##2017.11.14 追記
[きあい＠ドルジ](https://twitter.com/kiaiP)さんという方のツイートによると、ツイートしたURLを、[Rinkeby Authenticated Faucet](https://faucet.rinkeby.io/)に入れるようです。さっきやったら緑文字でリクエスト受理された的なメッセージ出ました。
<img width="588" alt="スクリーンショット 2017-11-14 21.41.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/151314/a6e3e46e-b9bb-8932-ceb5-765683abd66f.png">
きあいさんありがとう 🙏
Navicat Premium Essentials で PostgreSQL の Materialized View を確認する

# バージョン情報

| ツール | バージョン |
|----|----|
| PostgreSQL | 9.6.5 |
| Navicat Premium Essentials | 11.2.18 |

# 方法

デフォルトのツリービュー (画面左側) には Materialized Views が存在しない。Views にも並ばない。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/6697/2a458819-5268-9645-fa06-c3b1bd955c8d.png)

Materialized View を表示するには、まず画面上部のメニューで **Other** をクリックする。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/6697/f6f4d9c3-cf2a-a018-b18d-ee57cd7ca7c9.png)

次にプルダウンメニューで **Materialized View** をクリックする。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/6697/ae48216b-e9c8-87b8-eb89-a99bebde4bc3.png)


そうすると画面右側に Materialized View の一覧が表示される。もちろん、任意の Materialized View をクリックすれば、そのレコードを確認できる。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/6697/ec57db8b-76d9-0b6a-10b9-fd48f87e887a.png)
特定のファイルだけerbからhamlに変換する

#はじめに
既にアプリケーションが稼働している状態で、影響範囲などを加味して部分的に`erb`から`haml`に置き換えをしたい場合の手順です

# gemfileにhtml2hamlを追加する
```
group :development do
    gem 'html2haml'
end
```
# コマンドを実行
## erbファイルを残す場合
```
for file in app/views/hoge/fuge.html.erb; do bundle exec html2haml -e $file ${file%erb}haml --trace; done
```
## erbファイルを削除する場合
```
for file in app/views/hoge/fuge.html.erb; do bundle exec html2haml -e $file ${file%erb}haml --trace && rm $file; done

```

# 課題
- 変換後のhamlを見るとロケットハッシュが使われていたり、best practicesでは無いシンタックスが散見されるので、手動でいい感じに修正する必要があります
トップページで参照するhtmlファイルをindex.htmlから別htmlファイルにする方法

htmlファイルがあるディレクトリで.htaccessという名前のファイルを作成し、以下のような内容を入力する。
以下の例では、index.htmlをhryshtk.htmlにしている。

```
DirectoryIndex hryshtk.html
```
High Sierraへアップデート後のgitエラー

```text
追記 ： Catalinaでも同様の対応で解決します
追記 ： Mojaveでも同様の対応で解決します
```

# 問題

mac osをHigh Sierraにアップデート。
その後、ターミナルでgitコマンドを実行するとエラーが。

```shell-session
$ git --version
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

# 対応

Sierraの時にも同じことあったなと思いググる。

参考
https://qiita.com/ARTS_papa/items/60ba305b23dc967bba87

下記コマンドを入力

```shell-session
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

![スクリーンショット 2017-11-13 14.39.57.png](https://qiita-image-store.s3.amazonaws.com/0/2380/40d4179b-1802-196e-ab5a-c411cc4b30b1.png)

「インストール」を選択。 更に次の画面で「同意」を撰択してしばらく待つ。

![スクリーンショット 2017-11-13 14.42.02.png](https://qiita-image-store.s3.amazonaws.com/0/2380/b6fbda58-d633-78db-4301-159798fa4f83.png)

「完了」を撰択して、コマンド入力して確認。

```shell-session
$ git --version
git version 2.13.5 (Apple Git-94)
```

無事終了。
Xcode9でビルド時間を短縮する

Xcode9から、**BuildSystem** を変更することで、ビルド時間を短縮することができます。

## Build Systemってなんだ
[Whats New in Xcode (Xcode9](https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/WhatsNewXcode/xcode_9/xcode_9.html)に、次のように書いてあります

> New in Xcode 9 – Preview of a new build system written in Swift. Currently, This system is optional but it will become the default  in a future version of Xcode

> - Added a preview of a new build system written in Swift.
> - Provides higher reliability.
> - Catches many project configuration problems.
> - Improves overall build-system performance.
  Note, build system performance does not include the compilers, linkers, and other tools used by the build system.

> To opt into the new build system for a project or workspace, choose File > Project Settings or File > Workspace Settings, and then choose New Build System (Preview) for the Build System type. For notes on compatibility with existing projects, see the Xcode Release Notes.

簡単にまとめると、

- 現在はオプションとして選択すると使えるようになる（将来的にはデフォルトになる)
- Swiftで書かれたビルドシステム
- 高い信頼性、プロジェクト構成の問題のキャッチ
- ビルドシステム全体のパフォーマンス向上

のようです。**早くなりそうな感じがしますね!**


## 試した環境
- Xcode 9.1
- MacbookPro 15インチ late2016 (TouchBar付、2.9GHz、４コア)

ビルド時間の計測方法については以下が参考になります
- [Swiftのメソッド毎のコンパイル時間を計測してビルド時間を短縮する](https://qiita.com/rizumita/items/913b05d799b3712260f6)

あとは、PCが４コアなので以下のコマンドをターミナルで叩いています。

```bash
$ defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 4
```

## Workspaceの設定を変更する
Xcodeの[File]->[WorkSpace Settings...] を開きます

![スクリーンショット 2017-11-13 14.06.13.png](https://qiita-image-store.s3.amazonaws.com/0/27802/94ecd880-8d64-f446-f55e-9e872e1b51f8.png)

## Build Systemを変更する
[Shared Workspace Settings:]の項目のプルダウンで、 **NewBuildSystem(Preview)**に変更します。

![スクリーンショット 2017-11-13 14.06.21.png](https://qiita-image-store.s3.amazonaws.com/0/27802/a00a8f60-9f56-2cc3-42d0-bb284ab528e2.png)
↓
![スクリーンショット 2017-11-13 14.29.31.png](https://qiita-image-store.s3.amazonaws.com/0/27802/9c51cd2a-023d-e881-6916-8b6150830f30.png)


あとはいつもどおりビルドするだけです。
ビルド中、画面上部の表示がこんな感じになります

![スクリーンショット 2017-11-13 14.38.37.png](https://qiita-image-store.s3.amazonaws.com/0/27802/fb55c1ec-594d-7dc7-eb55-ae86770a002f.png)


(Preview)とあるので、今後仕様や性能が変わる可能性はありそうです。

また、この設定は各Project毎に行う必要があります。

## どれくらい早くなるのか
手元に巨大なProjectがなかったので、ファイル180程度のもの+CocoaPodsのビルドありで試しましたが、 
[BuildTimeAnylizer](https://github.com/RobertGummesson/BuildTimeAnalyzer-for-Xcode)を用いて計測したところ

- 前: *174秒*
- 後: ***143秒***

となりました。なので、およそ20％ほど早くなったようです。(何度か計測して平均...まではやっていません)
大きいProjectほど恩恵は得られそうですね。

## 参考
- [Whats New in Xcode (Xcode9](https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/WhatsNewXcode/xcode_9/xcode_9.html)
- https://github.com/quellish/XcodeNewBuildSystem
Treasure DataのWorkflowをRubyでキックする

```ruby
require 'net/http'
require 'uri'
require 'json'
require 'time'

module Digdag
  class Client
    BASE_URL = 'https://api-workflow.treasuredata.com/api/'

    def initialize(key)
      @key = key
    end

    def get_sessions
      get('sessions')
    end

    def start_attempt(workflow_id, params = {})
      put('attempts', workflowId: workflow_id, params: params, sessionTime: Time.now.iso8601)
    end

    private

    def get(path)
      request(Net::HTTP::Get, path)
    end

    def put(path, params)
      request(Net::HTTP::Put, path, params)
    end

    def request(method_class, path, params = nil)
      uri = URI.parse(File.join(BASE_URL, path))
      https = Net::HTTP.new(uri.host, uri.port)
      https.use_ssl = true

      req = method_class.new(uri.request_uri)
      req['Content-Type'] = 'application/json'
      req['Authorization'] = "TD1 #{@key}"
      req.body = params.to_json if params

      res = https.request(req)
      JSON.parse(res.body)
    end
  end
end

td_apikey = 'xxx'
workflow_id = 12345
workflow_params = { entity_id: 10000 }

client = Digdag::Client.new(td_apikey)
p client.start_attempt(workflow_id, workflow_params)
```

キックしたいWorkflowのIDとパラメータは適当な値に変更してお使いください
[メモ]ラズパイzero w事始め(OSインストールからWifi/VNC設定まで）

#概要
ラズパイ初心者の設定メモです。備忘の為の記載なので掘り下げた情報はありません。
##環境(HW)
raspberry pi zero w
microSDカード：transcend premium 400x 32GB

##OSインストール
- Windows端末で[ラズパイ公式DLサイト](https://www.raspberrypi.org/downloads/)からNOOBSをDL。
- DL完了後に解凍ソフト「Lhaplus」を使用して解凍(アーカイブを右クリックで回答先にSDカード指定)。
- 解凍完了後にラズパイにSDを移動し、HDMI、キーボード、マウス、電源側microUSBを指して起動。
- ディストリはRASPBIAN、言語はザパニーズを指定してインストール実行(しばし待機)
- 問題なく完了(解凍がうまくいってないケースだとここいら辺で躓くケースあり)

### 初回ログイン：各種バージョン確認
```bash
uname -a
Linux raspberrypi 4.9.59+ #1047 Sun Oct 29 11:47:10 GMT 2017 armv6l GNU/Linux
cat /etc/debian_version
9.1
```

##初期設定
- GUI右上のラズパイマーク->設定->Rspgerry Piの設定を選択。
- ローカライゼーションタブよりロケール設定ボタン押下
    - 言語：ja
    - 国：JP
    - 文字セット：UTF-8
- タイムゾーン設定ボタン押下
    - 地域：Asia
    - 位置：Tokyo
- キーボードの設定（インストール時にJPキーボードがセットされるがHHKB利用の場合変更）
    - Country:米国
    - Variant:英語(US)
- 無線LANの国設定
    - 国：JP

上記設定完了後にOKボタン押下(状況により再起動あり)。

##ネットワーク設定(Wi-Fi設定)
接続環境がstaticにIPを設定する必要が在るため、下記設定ファイルを編集。

Wlanの設定ファイル

```bash:/etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=GB
network={
	ssid="SYSTEXXX"
	psk="XXXXXXXXX"  # 都合によりX箇所は伏字
        priority=2
	key_mgmt=WPA-PSK
}
```

固定IP設定ファイル

```bash:/etc/dhcpdc.conf
#SSID SYSTEMXXX
interface wlan0
inform 10.22.223.104
static routers=10.22.223.1
static domain_name_servers=10.22.223.1
```

上記設定後に再起動(debian系のコマンドが弱いのでservice network restartに該当するコマンドがわからん)。
で、ブートしたらpingでNetwork疎通確認

```bash:
ping -c1 www.google.co.jp
```

最初にパッケージを更新(可能ならば不要パッケージを削除した方がよい)
待機時間の長いコマンド。。。

```bash:
sudo apt-get update
sudo apt-get upgrade
```
上記更新処理でdhcpcd.confが更新パッケージによる変更と競合したので、自分の設定ファイルを残す(N)を選択。
パッケージのアップデートが終わればまた再起動。

```bash:
sudo reboot
```
## SSHの有効化

sshを有効にするためにはラズパイオリジナルの設定コマンドraspi-configで有効化する必要あり。

```bash:
sudo raspi-config
```
[5 Interfacing Option]-> [P2 SSH] と選択すると「Would you like the SSH server to be enabled?」と聞かれるので<はい>を選択。->「The SSH server is enabled」との
完了メッセージに<了解>を押下して<Finish>する。

ついでに、キーボード、マウスを刺すのが面倒なので、同じ手順でVNCも有効化([5 Interfacing Option]-> [P3 VNC])。

### SSH接続確認
TeraTerm等でSSH接続可能になった事を確認。
ユーザ名：pi
パスワード：raspberry

### VNC接続確認
同じく[VNCクライアントソフト](https://www.realvnc.com/en/connect/download/viewer/)で接続可能であることを確認。
(ユーザ名/パスワードはSSH接続と同じ)


とりあえず、今回はここまで。
Googleスライドへ追加されたSlideAppについて

# 概要
少し前のアップデートでGoogleスライドにスクリプトエディタが追加されていることに気づきました。その後のアップデートでスライドを操作するための[Class SlidesApp](https://developers.google.com/apps-script/reference/slides/slides-app)が追加されていることに気づきました。これまでは[Google Slides API](https://developers.google.com/slides/)を使用していましたが、今後はSpreadsheetAppやDocumentAppと同様に、SlidesAppを使用することができるようです。

細かい部分まで操作できるようになっていますので試してみると楽しいです。ここではSlidesAppが加わって初めてできるようになった２つの例をご紹介させていただきます。個人的にはまずこの2点が有難いと思いました。

# 1. サイドバーの設置
``SlidesApp.getUi()``もありますので、下記のようにサイドバーも設置することができるようになりました。

![sidebarsample.png](https://qiita-image-store.s3.amazonaws.com/0/133383/43671f68-d60a-6766-db35-38b05c177f86.png)


~~~javascript
function showSidebar() {
  var html = HtmlService
    .createHtmlOutput('Hello, world! <input type="button" value="Close" onclick="google.script.host.close()" />')
    .setTitle('My custom sidebar')
    .setWidth(300);
  SlidesApp.getUi().showSidebar(html);
}
~~~

参考: [参考にしたサイドバーのサンプルスクリプト](https://developers.google.com/apps-script/guides/dialogs#custom_sidebars)

# 2. 既存スライドの一部のページを新規スライドファイルへコピー
これまではできなかった既存スライドのコピーもできるようになりました。いろいろ探したのですが、スライドのあるページを直接別のスライドへコピーする方法は見当たりませんでした。もっと効率の高い方法があるかもしれませんが、今のところ次のような流れで実現しています。

1. DriveAppを使用してスライドファイルそのものをコピーする。
1. コピーでできた新たなスライドファイルを開く。
1. [``remove()``](https://developers.google.com/apps-script/reference/slides/slide#remove)を使用してコピーしたいページ番号以外のページを削除する。

~~~javascript
function slideCopy() {
  var srcSlides = [1, 3]; // コピーしたいページ番号。この場合サンプルとして1ページ目と3ページ目をコピーしています。
  var srcId = SlidesApp.getActivePresentation().getId(); // ファイルIDを直接指定してもOKです。

  var dstId = DriveApp.getFileById(srcId).makeCopy().getId();
  var dstSlides = SlidesApp.openById(dstId).getSlides();
  for (var i in srcSlides) {
    dstSlides[srcSlides[i] - 1] = null;
  }
  var removeSlides = dstSlides.filter(function(e){return e != null});
  for (var i in removeSlides) {
    removeSlides[i].remove();
  }
}
~~~

同一スライドファイル内へあるページのスライドをコピーする場合は下記のように簡単に行うことができます。

~~~javascript
var slide = SlidesApp.getActivePresentation(); // 0はページ番号1です。
slide.getSlides()[0].duplicate(); // 0はページ番号1です。これは1ページ目をコピーしています。
~~~

[``duplicate()``](https://developers.google.com/apps-script/reference/slides/slide#duplicate())
NativeScriptでChromeデバッグが出来ないときに確認したい点

NativeScriptでは、Android、iOSともにChromeでデバッグをすることができます。(iOSはNativeScript ver3.3より対応しています) ネイティブ部品の属性をChromeで変更できたり、TypeScriptのコードに直接ブレークポイントを張ってオブジェクトの中身を見たりすることができるので、デバッグが捗ります。

# 準備

ChromeデバッグをiOSで行うためにはNativeScript Core ver3.3以上が必要になります。

```tns info```

と打って、バージョンを確認しましょう。

# Chromeデバッグの開始

Chromeデバッグはとても簡単です。
プロジェクトルートで以下のコマンドを打ちます


### iOS
```tns debug ios --chrome --simulator```

### Android
```tns debug android --chrome --simulator```

ビルドが終わると、

```shell-session
To start debugging, open the following URL in Chrome:
chrome-devtools://devtools/remote/serve_file/@02e6bde1bbe34e43b309d4ef774b1168d25fd024/inspector.html?experiments=true&ws=localhost:52680
```

のような文字が出てくるので「devtools://」以下のURLをコピーして、Chromeで開けばDebugセッションが開始されます。

## Chromeデバッグが出来ない！？

なのですが、時にChromeデバッグがうまく開始されないことがあります。
コンソールを見ると以下のような文字列が。

```shell-session
Frontend client connected.
Backend socket created.
Backend socket closed!
```

どうやらWebSocketのセッションが開始してすぐに閉じてしまっているようです（涙)
まず最新のChromeを使っているか確認して、古い場合にはバージョンアップしましょう。
私の場合には、残念ながらすでにChromeの最新版を使っていました。そこで、「Chrome canary」を使うことで、無事にデバッグができるようになりました。

Happy debug!
[初心者向け] 実務開始の前に知っておきたいWordPressのこと

この投稿は、チュートリアルを終えて実務に入る前の人に知っておいて欲しいことをまとめています。

チュートリアルは終えている前提なので、フォルダ構造などの説明は省いています。
デザイナーではなくエンジニアがさわるなら、このくらいは知ってほしいという温度感です。そのため、デザイン修正ではなく機能修正・追加を目的としています。

社内メンバー宛なので偏りがあるかもしれないですが、みなさまの役にも経てば幸いです。


## ショートコードの追加
ショートコードとは、本文中で使える機能のことです。
例えば、 `[affiliate amazon="B00337XTSM"]` と書いたら、`B00337XTSM`の商品へのリンクと、amazon画像が出てくる　みたいな機能を付与することができます。
ショートコードは`wp-content/themes/(theme名)`配下にある `functions.php` に記載します。

### [affiliate amazon="B00337XTSM"] と書いたら、B00337XTSMの商品へのリンクと、amazon画像が出てくる例


```:wp-content/themes/(theme名)/function.php
function affiliate($atts) {
    extract(shortcode_atts(array(
        'amazon' => '',
    ), $atts));
    $amazon_html = "";
    if (!empty($amazon)) {
        $amazon_html .= '<a class="affiliate-btn" href="http://amazon.jp/dp/'.$amazon.'/?tag=xxxx" target="_blank">';
        $amazon_html .= '<img src="https://images-fe.ssl-images-amazon.com/images/G/09/associates/buttons/assocbtn_orange_amazon1.png"/>';
        $amazon_html .= '</a>';
    }
    return $amazon_html;
}
add_shortcode('affiliate', 'affiliate');
```


## プラグインの追加
プラグインとは、機能の集まりのことです。
wordpressの管理画面から他の人が作ったものをインストールもできますが、自作もできます。
プラグインの実態は `wp-content/plugins`配下のフォルダおよびファイルです。
詳しい書き方は、他の人のプラグインを覗き見しながら学んでください。

## add_action/do_actionとは
add_actionとdo_actionは一体です。自分がadd_actionで定義したものが、プラグインやwordpress本体で定義されたdo_actionで実行されます。
add_actionという名前の通り、追加でこの関数も実行したい！ときに使います。

### login画面のfooterに`hello`と表示する例

```:wp-login.php
do_action('login_footer');
```

```:wp-content/themes/(theme名)/function.php
add_action('login_footer', 'echo_hello');
function echo_hello() {
  echo "hello";
}
```

## add_filter/apply_filtersとは
add_filterとapply_filtersも一体です。自分がadd_filterで定義したものが、プラグインやwordpress本体で定義されたapply_filterで実行されます。
add_filterという名前の通り、関数の途中で、挙動を少し修正したい（オプションを付与したい）などのときに使います。

### titleにサイト名を追加する例

```:wp-includes/general-template.php
$title = apply_filters( 'wp_title', $title, $sep, $seplocation );
```

```:wp-content/themes/(theme名)/functions.php
add_filter( 'wp_title', 'add_sitename_to_title', 10, 3 );

function add_sitename_to_title($title, $sep, $seplocation) {
	$title .= get_bloginfo( 'name' );
	return $title;
}
```

## 最後に
既存のwordpress、pluginを変更したければwordpressフォルダのルートで

```
grep -r "\(apply_filters\|do_action\)" *
```

とすると、apply_filtersとdo_actionの一覧が得られるので、どこをカスタマイズできるかがわかります。

Let's enjoy with wordpress!

## [初心者向け] 実務開始の前に知っておきたいシリーズ
[[初心者向け] 実務開始の前に知っておきたいSpreadSheetのこと](https://qiita.com/vankobe/items/5bcd2ca38f289bb9b98f)
[[初心者向け] 実務開始の前に知っておきたいAnsibleのこと](
https://qiita.com/vankobe/items/5dc71bc0ab52114b34d6)
[[初心者向け] 実務開始の前に知っておきたいGoogleAnalyticsのこと](https://qiita.com/vankobe/items/2ef45365c190d154103b)
[[初心者向け] 実務開始の前に知っておきたいRailsのこと](https://qiita.com/vankobe/items/f7e7b2592fcb3c51988f)
Delphi Starter Edition でメモ帳クローンを作る - 2nd Edition -

# begin { はじめに

これは [Delphi Advent Calendar 2017](https://qiita.com/advent-calendar/2017/delphi) 15 日目の記事です。

前回、初心者向けチュートリアルとして [Delphi Starter Edition でメモ帳クローンを作る](https://qiita.com/ht_deko/private/bd854e8a22cf31b636b0)というのをやりましたが、その続きとなります。

![notepad_000.png](https://qiita-image-store.s3.amazonaws.com/0/21785/25c2dfd6-d3f6-a4c2-f3f2-8a98dabcc4d4.png)

# 残りの機能
長くなってしまったので機能毎に分割しました。上から順番に読む事をオススメします。

 - [[編集(E)] （1）](https://qiita.com/ht_deko/private/f2f330ebdcb3f9f49e96)
 - [[編集(E)] （2）](https://qiita.com/ht_deko/private/d40247d93533c42f4ef0)
 - [[書式(O)]](https://qiita.com/ht_deko/private/4309e5fc56419a8aa05d)
 - [[表示(V)]](https://qiita.com/ht_deko/private/774482e86c8380a08bf8)
 - [[ヘルプ(H)]](https://qiita.com/ht_deko/private/2d82538c58ed2d16b261)
 - [[ファイル(F)]](https://qiita.com/ht_deko/private/46c476859388dd566b27)
 - [その他の機能](https://qiita.com/ht_deko/private/5347de15b7856f3008fc)

# おわりに } end.
今回の記事は **「詳細を書く気がないんだな？」** というのを途中から感じ取って頂けたかと思いますが、その通りです (w

メモ帳のように簡単だと思えるものですら**一定の量のコードを書かなくてはならない**のは避けられず、その実装のための **Windows に対する知識もある程度は必要**です。メモ帳クローンを作るために必要なすべての情報を説明していたらアドベントカレンダーを一人ですべて埋めてしまいそうですし、残念ながらそれを書く時間もありませんでした。

それでも、**それなりに動作するコード**を公開しておけば初心者向けの取っ掛かりにはなるのではないかと思い、駆け足で恐縮ですが記事にしてみました...誰かの役に立つのなら幸いです。

## ZIP でプリーズ

ここまでのソースコード一式は以下から DL 可能です。

 - https://ht-deko.com/software/notepad_clone.zip


## えっと...

Delphi 10.2.2 がリリースされています。Starter Edition でももちろん 10.2.2 へアップデートできます。

- [RAD Studio / Delphi / C++Builder 10.2.2 Tokyo へのアップデート ht_deko@Qiita](https://qiita.com/ht_deko/items/cd51409742383333e47a)


え？ **begin~end. の後に何か書いたように見える**ですって？あぁ、右上のリスト (インデックス) の件ですね。**Delphi ではユニットに書かれた end. の後は無視されるんです**。だから好きに書いていいんですよ。僕はワークや、ちょっと込み入った備忘録を書くのによく利用しています。

え？「**W1011 ワーニングが出るじゃないか！**」ですって？そんな時は end. の直前あたりにこう書いておきましょう。

> {$WARN GARBAGE OFF}

これで end. 以降に何を書いても文句を言われません！

```pascal:
  ...

{$WARN GARBAGE OFF} // <-- 追加
end.

自由に使える！
```
プロジェクトオプション (`[プロジェクト | オプション] -> [ビルド ▶ Delphi コンパイラ ▶ ヒントと警告]`) で消す事も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/32a396f7-23e4-9e1c-0db4-f2e9cf50e861.png)

**See Also:**

 - [警告メッセージ（Delphi）(DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/%E8%AD%A6%E5%91%8A%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%EF%BC%88Delphi%EF%BC%89)
 - [W1011 コンパイラは 'end.' 以降の文字を無視します - (Delphi) (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/W1011_%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%AF_%27end.%27_%E4%BB%A5%E9%99%8D%E3%81%AE%E6%96%87%E5%AD%97%E3%82%92%E7%84%A1%E8%A6%96%E3%81%97%E3%81%BE%E3%81%99_-_(Delphi))
RailsのActiveRecordでwhere in句を使う

RailsのActiveRecordで```WHERE IN```句を使いたい場合は
以下のようにする。

```rb
Model.where(id: ids)
```
hashで渡すとActiveRecord がクォーテーションをエスケープしてくれるそうです。
QUANONさんありがとうございました
QComboBoxのフォントを変える

# はじめに

QComboBoxのアイテム要素の種類を可視化するため、
フォントスタイルとテキストカラーを変更を試みました。

英語でも日本語でも、これだという記事が見つからなかったので、忘備録的に残しておきます。

# アイテムのフォントとテキストカラーを変える

setItemData で指定します。
フォントは Qt.FontRole、テキストカラーはQt.ForegroundRoleで指定できます。

```python
    combo = QComboBox(w)
    combo.addItem("Normal")
    font = QFont()
    font.setItalic(False)  # 指定しないと、ComboBox のフォントに引っ張られる
    combo.setItemData(0, font, Qt.FontRole)
    combo.addItem("BlueItalic")
    font = QFont()
    font.setItalic(True)
    combo.setItemData(1, font, Qt.FontRole)
    combo.setItemData(1, QBrush(Qt.blue), Qt.ForegroundRole)
```

※ イタリックにしない場合は、setItalic(False)を指定します。指定しない場合、以下で説明するコンボボックスのフォントに影響されます。

# コンボボックスのフォントとテキストカラーを変える

アイテムの指定だけでは、選択中のアイテムのフォントとテキストカラーは変わりません。
そこで、currentIndexChangedシグナルを活用して、選択変更時に切り替えます。

```python
class ComboBox(QComboBox):
    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.setObjectName("comboBox")
        self.currentIndexChanged[int].connect(self.__on_currentIndexChanged)

    @pyqtSlot(int, name="on_comboBox_currentIndexChanged")
    def __on_currentIndexChanged(self, index):
        # setStyleSheetで指定。item のテキストカラーには干渉しない
        # フォントはsetItemDataされていれば、干渉されない
        font = self.itemData(index, Qt.FontRole)
        fontStyle = 'italic' if font and font.italic() else 'normal'
        brush = self.itemData(index, Qt.ForegroundRole)
        color = "#{0:06x}".format(brush.color().rgb() if brush else 0)
        styleSheet = "ComboBox { font-style: " + fontStyle + "; color: " + color + "; }"
        self.setStyleSheet(styleSheet)
```
SublimeText3のやっておきたい初期設定(備忘録)

## 目的

備忘録。よく使うが、インストールしたあとに設定し忘れたりして、毎回調べてしまうものをまとめておく。

## Word Wrap のショートカット設定

文字折り返しのトグルのショートカット設定

メニュー　→　Preferences　→　KeyBindings　→　以下のコードを追加

```json
{
    "keys": [
      "ctrl+shift+w"
    ],
    "command": "toggle_setting",
    "args": {
      "setting": "word_wrap"
    }
  }
```

## 行削除のショートカット

行削除のショートカット。デフォルトで設定はされているが、eclipse育ちの自分はDを使うようにしてるため。

メニュー　→　Preferences　→　KeyBindings　→　以下のコードを追加

```json
{ "keys": ["super+shift+d"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Delete Line.sublime-macro"} }
```

## Increment Selection のショートカット

プラグイン、Increment Selection のショートカット

```json
{ "keys": ["shift+ctrl+0"], "command": "multi_number_input"}
```
CLIで音を録音して、MP3に変換する。


定期的に音のサンプルを取得する案件があったので、調べてみた。
Raspberry Piではまだ未確認だけど、クロスプラットフォームであるSoXを使ってるので基本的にはLameとSoXがぶち込んであればMacでもPi(というかLinux)でも動くはず。

### パッケージを突っ込む
Macなら当然のことながら以下のようにパッケージをインストール。apt-getでも同様と思われる。

```
$ brew install sox lame
```

### 実行

```
rec -c 1 -r 44k output.wav trim 0 5 // 5秒間録音
lame --abr 56 -m m output.wav output.mp3 // ABRモノラルでMP3にエンコーディング
```

音響サンプルの送信はcronとシェルスクリプトだけで普通にどうにかなりそう。
ろくに試してませんが、とりあえず手元のMacでは期待通りの動作をしてます。
さくらのクラウド ウェブアクセラレータ（CDN）で Zone Apex ドメイン（ネイキッドドメイン）を使う

さくらのクラウド ウェブアクセラレータでZone Apexのドメインを使いたい場合、
CNAMEで設定をしないといけない都合上、ウェブアクセラレータで利用することができない。

この問題はRoute53などのAWSのサービスを使えば解決できるが、安価に解決したいため、
Gehirn Web ServiceのDNSサービスを使って解決できるのでその方法のメモです。

**2019年10月03日追記**
さくらのクラウドのDNSがALIASレコードに対応したため、さくらのクラウドのみで、
ネイキッドドメインをウェブアクセラレータで利用可能になりました:tada:

## そもそもZone Apexとは
Zone Apexとは 「www.example.jp」のようにホスト部「www」を含むものではなく、
「example.jp」のようなドメインのことを言います。
ネイキッドドメインといわれることもあるようです。

ウェブアクセラレータに限らず、CDNサービスはCNAMEで自身のドメインからCDNサービスに
DNSで設定して使う都合上、CNAMEが設定できないZone Apexでは事実上利用できないのです。

細かな話をするとCNAMEは**CNAME以外の他のレコードを含むことを許されていません**。
そのため、example.jpのようなZone Apexには**SOAレコード**や**NSレコード**などが
含まれるため、CNAMEが利用できないというわけです。

## ではどのように解決するか？
DNSサービスでAレコードを任意のFQDNの内容に合わせて応答してくれるサービスが存在します。

* [Gehirn Web Service DNS](https://www.gehirn.jp/dns/)

DNSのサービスでなんと1ゾーンあたり、1日2円（30日でも60円）で利用できます。
このDNSサービスのApex Aliasという機能で実現可能です。

* [さくらのクラウド DNS(アプライアンス)](https://manual.sakura.ad.jp/cloud/appliance/dns/index.html)

こちらは1ゾーンあたり、1日2円（1か月43 円）とGehirn DNSより安いです。
※ただ、こちらはレコード数の上限が存在します。

個人的に [Deboo! Japan](https://deboo.info/) というサイトのサーバ運営のお手伝いをしており、
そちらでも利用していて、問題なく利用できています。

* Gehirn DNSでの設定
![15fb3854054c9bafa1017bb4.png](https://qiita-image-store.s3.amazonaws.com/0/117368/39690cad-489b-b889-39bc-3bd9e1361ebd.png)

* さくらのクラウドDNSでの設定
![ALIAS.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117368/60180afc-3a22-ac72-ab4f-b09d2d63338c.jpeg)

**Aliasで設定した場合、ドメインの所有チェックでCNAMEが見えずに行えないので、その場合はTXTレコードを付けて所有チェックをお願いします。**

このような感じでApex Aliasで使えているようです。
Gehirn DNS、さくらのクラウドDNSともにDNSのクエリー数に関する課金が無いので、AWSのRoute53のような従量課金に怯えることもないので、
便利に使っています。

##### 2019/12/05 追記
ムームードメインのDNSもALIASレコードに対応してたのでネイキッドドメインで使えると思います。（環境が無いので未確認）

  * [ムームーDNSでALIASレコードが設定できるようになりました！](https://muumuu-domain.com/?mode=info&id=3775)

###### 2022/01/25 追記
* [さくらのウェブアクセラレータ（CDN）でネイキッドドメインを使う ～さくらのクラウドDNS編～](https://qiita.com/masa23/items/471a42271a28a6bca7ba)
イーロン・マスクがテスラの従業員に宛てたメール「優れたコミュニケーションの姿」

刺激的だったので、タイトルもそのまま載せます。

https://service-knowledge.support-project.org/open.knowledge/view/29?offset=0

最近、宇宙開発とかAIで名前が出てくるテスラモーターズのイーロン・マスクが従業員に宛てたコミュニケーションの取り方の記事。

ざっくり言うと

- 階層的なコミュニケーションのエスカレーションは無駄が多い
- それを解決するために、テスラでは上司の許可なしでも要件がある人に対して直接コンタクトを取って良い
- 最終的な目的の一つは、会社の中でコミュニケーションを阻害するような対立した人間関係や、閉鎖的な組織を作り出すことを防止するため

というようなことが書いてあります。

統率の観点で、今誰がなんのために動いているのかということを把握することが大変にはなりそうです。

ただ、文章中の「物事が正しい方向に進むまで、自分にはその義務があると考えて良い。」という文がありますが、一人ひとりが認め合い、仕事完遂のために責任を強く持つスタンスであれば、割りと回るのかなとも思いました。

スクラム開発が近いスタンスなのではないかと思いました。
Laravelの開発環境をDockerで作るときのメモ

# 動機
身近でLaravelの開発環境にDockerを使うということがあって、ちょこちょこアドバイスをしたので忘れないように自分用メモ。

LaraDock使います。
Docker for Mac使います。

# 手順
適当にディレクトリを作成。

```
$ mkdir myApp
```

移動

```
$ cd myApp
```

laradockをgitHubからcloneします。

```
$ git clone git@github.com:laradock/laradock.git
$ cd laradock
```

.envファイルがないのでコピー。

```
$ cp env-example .env
```

アプリケーションサーバ起動

```
$ docker-compose up -d workspace

Creating laradock_applications_1 ...
Creating laradock_applications_1 ... done
Creating laradock_workspace_1 ...
Creating laradock_workspace_1 ... done
```

コンテナを確認

```
$ docker ps

CONTAINER ID            IMAGE                COMMAND             CREATED             STATUS              PORTS                  NAMES
[任意のコンテナID]        laradock_workspace   "/sbin/my_init"     2 minutes ago       Up 2 minutes        0.0.0.0:2222->22/tcp   laradock_workspace_1
```

コンテナに入ります。
[コンテナ名]は```$ docker ps```の出力に応じて変えてください。

```
$ docker exec -it laradock_workspace_1 /bin/bash
```

コンテナに入ると```/var/www```にいると思います。
適当にプロジェクトをcreateします。

```
$ composer create-project --prefer-dist laravel/laravel test
```

コンテナから抜けます。

```
$ exit
```

1つ上の階層にコンテナ内でcreateしたプロジェクトが存在することを確認

```
$ ls ..

laradock	test
```

.envを修正

```laradock/.env
APPLICATION=../test[プロジェクト名]/
```

nginxとphp-fpmのコンテナを起動

```
$ docker-compose up -d nginx php-fpm

Recreating laradock_applications_1 ...
Recreating laradock_applications_1 ... done
Recreating laradock_workspace_1 ...
Recreating laradock_workspace_1 ... done
Creating laradock_php-fpm_1 ...
Creating laradock_php-fpm_1 ... done
Creating laradock_nginx_1 ...
Creating laradock_nginx_1 ... done
```

localhostにアクセス。

Laravelのスタート画面が表示されればとりあえず完了。
PHPMailerで複数の宛先へメールを送信する

## やりたいこと

外部のメールサーバを参照してメール送信を行なっているのだけど、宛先が複数だった場合に、エラーがあったので、対処した。
解決方法自体はなんてことないけど、同様な問題に当たってしまう人もいるかと思うので、残しておく

具体的にはどんな事象かというと以下のような感じ

正しく動作している例：

```php
$to = 'hoge@mail.com';
$mail->addAddress($to);

$mail->send();
```

上記のような場合は、正しく動作する。
今回起こった事象として、以下のような事象

```php
// $toにカンマ区切りで、宛先が複数指定されていた
$to = 'hoge@mail.com,hoge2@mail.com';
$mail->addAddress($to);

$mail->send();
```

上記見てわかるように、`$mail->addAddress`で複数の宛先を指定していたためエラーになった。

## 解決方法

```php
$to = 'hoge@mail.com,hoge2@mail.com';
$to = explode(',',$to);

for ($i = 0; $i < count($to); $i++) {
  $mail->addAddress($to[$i]);
}
```

とすればいいと思います。上記の方法であれば、`$to`の中がカンマで区切られてなくてもエラーとならず正しく動作します。
ローカルでGitHubアカウントを使い分けようとしたら少し失敗した


普段GitHubを仕事以外で使ってこなかったので、ローカルのgitのユーザ情報は会社で使用しているアカウントを登録しています。

最近ようやく個人でもGitHubを使い始めたのですが、ローカルのgitのユーザ情報の切り替えに苦戦したのでメモしておきます。

# 新規GitHubアカウントを取得
会社用のアカウントをそのまま使うのに抵抗があったので個人のアカウントを取得しました。

テストとして個人のGithub Pagesを作成しようとリモートリポジトリも作りました。

# ローカルでリモートリポジトリをclone
作成したリモートリポジトリをcloneして作業開始です。

simple is bestなhtmlを作成し、addしてcommitします。

GitHubを使ってないだけでgitは使ってきたのでなんら脅威はありません。

# リモートリポジトリにpush
**問題発生しました。**

> ERROR: Permission to <個人アカウント>/<個人アカウント>.github.io.git denied to <会社用アカウント>.
>fatal: Could not read from remote repository.

なんと会社のアカウントでpushしようとしているではありませんか！

※良い子はpushの前にgit logで確認しましょう

## 原因1
git config user.nameとgit config user.emailを確認したら会社のアカウントになっていました。（変えてなかった）

早急に設定を個人用アカウントに変えました。
`git commit --amend --author "xxxxx "`でコミットした情報も書き換えたので一安心です。


## 原因２
そういえばssh keyの設定を全くしていなかったので原因１を修正したのと同タイミングでssh keyの設定も行いました。
`~/.ssh/config`に以下の内容を追加しました。

```bash
Host github-xxxx
    HostName github.com
    IdentityFile ~/.ssh/<秘密鍵のファイル名>
    User git
```

ここまでもしても会社用アカウントでpushしようとします。

## 原因３
原因２でsshの設定をしましたが、その設定内容に不足があるようです。

http://biwakonbu.com/?p=585

こちらのページを参考に、`IdentitiesOnly yes`の項目を付け足したらpushできました。

git cloneした時に会社のアカウント情報になっていたので、それが使われていたみたいですね。

# 確認
ユーザのGithub Pagesは`https://<アカウント>.github.io`で確認できます。

無事表示されることを確認できました。

まだまだ駆け出しのGitHubユーザですが、使いこなせる日が来るのでしょうか？
AzureAD：ディレクトリ同期で作成したユーザの強制削除


##孤立化したユーザーの削除
Windows Server Active Directory(ASAD)からAzure Active Directory(AAD)へ同期によって作成したーザーはAADのポータルから削除することはできません。
ASADでユーザーを削除すれば次回同期時にAAD上のユーザーも削除されますが、不慮の事態によってAADに同期したユーザーが残ってしまい削除できないといった場合は、PowerShell ISEを起動してAADへ接続し、以下のコマンドで強制削除を実行します。

**例：On-Pre User04を強制削除**

```ruby:Azureへ接続
> Login-AzureRmAccount
```
```ruby:AzureADのユーザーをリスト
> get-azurermaduser

DisplayName                    Type       ObjectId                
-----------                    ----       --------                
       
On-Pre User01                  User       d0d0d0d0-e0b4-4a87-b2d0-78a1eb5ccf48            
On-Pre User02                  User       a1a1a1a1-b7ec-4e7f-b7d2-AAAAAAAA4d5e            
ON-Pre User03                  User       c3c3c3c3-95de-44af-acdd-c532ae39aa9b            
On-Pre User04                  User       d4d4d4d4-3a9b-4f14-bf3b-BBBBBBBBaaaa

```
ユーザーの強制削除を行う場合はユーザーをObject-IDで指定します。

```ruby:ユーザーの強制削除
> Remove-AzureRmADUser -UPNOrObjectId d4d4d4d4-3a9b-4f14-bf3b-BBBBBBBBaaaa -Confirm
```

```ruby:AzureADのユーザーをリスト
> get-azurermaduser

DisplayName                    Type       ObjectId                
-----------                    ----       --------                
       
On-Pre User01                  User       d0d0d0d0-e0b4-4a87-b2d0-78a1eb5ccf48            
On-Pre User02                  User       a1a1a1a1-b7ec-4e7f-b7d2-AAAAAAAA4d5e            
ON-Pre User03                  User       c3c3c3c3-95de-44af-acdd-c532ae39aa9b 
```


こんな感じで・・・
Beanstalk を触ってみて分かった細かいこと

本記事はBeanstalkを触ってみた時の個人的なメモになります。
記述部分に間違いがあれば指摘いただければと思います。

# Beanstalk を触ってみた

## AZ間冗長化を犠牲にしてでも通信料を $0.00にしたい (Production環境では行わないこと)
Private な Service A, Service B 間の通信でもAvailability Zone(以下 Zone)を超えた通信を行えばテータ転送(アウト) $0.01 GB が必要になる

ただし以下の条件を満たせば $0.00 GB で service 間通信が行える。
・Service A 及び Service B の ELB 及び Instance を「同一Zone」上に構築する
・ELBは「内部」設定にする
・同一 VPC である

PublicなIPを付与している環境等あるとは思うので初めの構築時に traceroute とかで確認しておくと確実かと

ただしこの設定は単一 Zone 上で構築するため可用性を高めるといった非機能要件を満たすことはできないので要注意
検証等で Service 間通信を多用する場合はやってみても良いのではないかと

Amazon EC2 料金
https://aws.amazon.com/jp/ec2/pricing/on-demand/

## Immutable な更新・デプロイメント

ヘルスチェックを「拡張」にしなければ設定することができない。

## 事前設定済みプラットフォーム

Docker : docker がインストールされた AWS 提供のAMIを利用したデプロイ
Multi-container Docker : 実態は AWS ECS (https://aws.amazon.com/jp/ecs/details/)

## Docker プラットフォームについて

更新・デプロイ時は以下の流れになる模様

`METAファイルの更新-> docker rm -> docker run の順`

このとき「何らかの原因で」docker rm に失敗した場合は環境情報の更新に失敗する。

特に「環境プロパティ」の更新を行いたい場合は要注意
更新と環境の再構築は同時に行えないため immutable な設定を行っていない場合は新規構築をする形になる。
ざっくばらんメモ_14：kaggle


###kaggle seguro
[code](https://github.com/festa78/kaggle_seguro)
Cross validationを利用したxgboostのパラメータチューニングを
もう少し細かいパラメータグリッドでやり直してみる．
結果：LB0.269 -> 0.272へ改善
以前チューニングした際に改善どころか悪化した理由の一旦は
パラメータ探索のグリッドがあらすぎた事であると言える．
ただしこの場合計算時間が多くかかってしまうのが原因で
並列計算を駆使する必要がある．
IntelliJでGoの開発環境を整える


__環境__

OS: macOS High Sierra
shell: fish

__インストールするもの__

- go
- delve
- IntelliJ Go plugin

# Goのインストール

homebrewでインストール。

```
$ brew install go
```

GOPATHを設定。

```~/.config/fish/config.fish
# GOPATH
set -x GOPATH $HOME/go
set -x PATH $GOPATH/bin $PATH
```

# delveのインストール

[derekparker/delve](https://github.com/derekparker/delve)はGo言語用のデバッガ。

コマンドラインツールをインストール。

```
$ xcode-select --install 
```

delveのインストール。

[こちら](https://github.com/derekparker/delve/issues/753)によると、
goとdelveを共にhomebrewでインストールするとエラーが発生する場合があるので、マニュアルインストールします。

```
$ go get -u github.com/derekparker/delve 
$ cd $GOPATH/src/github.com/derekparker/delve
$ make install
```


# IntelliJにGoプラグインをインストール

Goのプラグインを追加。

![intellij.png](https://qiita-image-store.s3.amazonaws.com/0/18185/f4ebe076-1be2-080e-8012-306c4ebc49d1.png "スクリーンショット 2017-11-10 9.16.31.png")

# デバッグしてみる
New ProjectでGoプロジェクトを作成。

![スクリーンショット 2017-11-10 10.05.22.png](https://qiita-image-store.s3.amazonaws.com/0/18185/7f814a1d-5252-272d-5930-cfa76946737d.png "スクリーンショット 2017-11-10 10.05.22.png")

`hello.go`を準備してブレークポイントを置く。
![スクリーンショット 2017-11-10 9.59.45.png](https://qiita-image-store.s3.amazonaws.com/0/18185/7703fced-b4b9-9401-ba20-3413af2aeac1.png "スクリーンショット 2017-11-10 9.59.45.png")

デバッグ開始。
![スクリーンショット 2017-11-10 9.59.27.png](https://qiita-image-store.s3.amazonaws.com/0/18185/7146d15c-7ab3-f327-3dbe-5bc41413e984.png "スクリーンショット 2017-11-10 9.59.27.png")

ちゃんとブレークポイントで処理が止まる！
![スクリーンショット 2017-11-10 10.01.50.png](https://qiita-image-store.s3.amazonaws.com/0/18185/f9bdcb4d-d5a1-4e7f-ce7d-c8aaf4fd8b95.png "スクリーンショット 2017-11-10 10.01.50.png")


# 参照
- [[derekparker/delve] Installation on OSX](https://github.com/derekparker/delve/blob/master/Documentation/installation/osx/install.md)
[初心者向け] 実務開始の前に知っておきたいRailsのこと


この投稿は、チュートリアルを終えて実務に入る前の人に知っておいて欲しいことをまとめています。
チュートリアルは終えている前提なので、コードではない部分を補完するようにしています。
ベンチャー企業の複数あるうちの1サービスくらいの規模感のアプリケーションを前提としています。
社内メンバー宛なので偏りがあるかもしれないですが、みなさまの役にも経てば幸いです。

## 開発スタイル
### rails consoleとlogは常に表示しておきましょう
![コンソール.png](https://qiita-image-store.s3.amazonaws.com/0/68146/b44b41b6-aa93-5bde-a2fc-76ba653ff183.png "コンソール.png")
こんな感じで、コンソールを縦に割っておくと両方見れていいと思います
（ログとコンソールをセットにするか、エディターとコンソールをセットにするかは状況によると思います）

### エディターを整えよう
Railsはルールに則ってファイルが細かく分割されていますので、ファイル間を移動することが多いです。
少なくともファイル間をジャンプできる機能だけは整えておいた方がいいと思います。
自分は [rails.vim](https://github.com/tpope/vim-rails)を使ってますが、 [ctags](https://qiita.com/soramugi/items/7014c866b705e2cd0b95)を使えばsublimeなどのエディタにもジャンプ機能をつけれます

## エラーの見方
![エラー画面.png](https://qiita-image-store.s3.amazonaws.com/0/68146/c1b86d4f-fe0a-2033-8409-bdeaca68e6f9.png "エラー画面.png")
Rails開発してるとよく見るエラー画面。「一番最初にどこを見ますか？」と聞かれたら、黄色い枠で囲んだところです。
この画面が出ていて、『undefined local variable or method』と書いているのに「なぜエラーが出てるのかわからない」と言われることが多いです。
英語ですが、ちゃんと読みましょう。「aという変数、メソッドなどが定義されてません」って書いてるので、aを定義してあげればいいです（だいたいこのエラーの場合はtypoですが）
paramsを参照している場合は、Request欄のparametersも見ましょう。値が正しくわたってない（intだと思ってたらstringが渡ってる）のもよくあるミスです。

## Gemの種類
たくさんありますが、メディア系のサイトを作るときによく使うものをいくつか
載せてないものもここら辺で探したり、「rails gem （やりたいこと）」でググればいい感じのまとめが見つかります
http://bestgems.org/

### production
[kaminari](https://github.com/kaminari/kaminari) ... paging
[paperclip](https://github.com/thoughtbot/paperclip), [carrierwave](https://github.com/carrierwaveuploader/carrierwave) ... 画像アップロード
[devise](https://github.com/plataformatec/devise) ... 認証周りをいい感じにしてくれるやつ
[whenever](https://github.com/javan/whenever) ... cronの管理
[delayed_job](https://github.com/collectiveidea/delayed_job) ... 非同期処理

### development, test
[rspec](https://github.com/rspec/rspec-rails) ... テスト
[factory_girl](https://github.com/thoughtbot/factory_bot) ... テスト時にテストデータ作るやつ
[guard](https://github.com/guard/guard) ... ファイルを監視して、編集をhookにスクリプト走らせたりするやつ


## 見ておいたらいいと思うページ
[便利メソッド集1](https://qiita.com/kinako0909/items/ad42b165c24bf68a1846)
[便利メソッド集2](http://www.techscore.com/blog/2012/12/25/activesupport-%E3%81%AE%E4%BE%BF%E5%88%A9%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89-try-blank-present-presence/)
[モデルのフック](https://railsguides.jp/active_record_callbacks.html)
[コントローラーのフィルター](http://ruby-rails.hatenadiary.com/entry/20141129/1417223453)

## [初心者向け] 実務開始の前に知っておきたいシリーズ
[[初心者向け] 実務開始の前に知っておきたいSpreadSheetのこと](https://qiita.com/vankobe/items/5bcd2ca38f289bb9b98f)
[[初心者向け] 実務開始の前に知っておきたいAnsibleのこと](
https://qiita.com/vankobe/items/5dc71bc0ab52114b34d6)
[[初心者向け] 実務開始の前に知っておきたいGoogleAnalyticsのこと](https://qiita.com/vankobe/items/2ef45365c190d154103b)
[[初心者向け] 実務開始の前に知っておきたいWordPressのこと](https://qiita.com/vankobe/items/bc16ec597cf7cf37c348)
VB.netでETWを使ってイベントログ出力するサンプルコード

#はじめに
ETWでイベントログ出力したいけどサンプルコードがC#ばかりでVB.netでどう書いたらいいかわからないという人向け。

この記事の内容は以下の環境でテストしています。
Windows 10 Pro
Visual Studio Community 2017
.Net Framework 4.7

#サンプルコード
こちらの記事に記述されているC#のサンプルコードを使用させていただきました。
[急にEventSourceクラスを使ってEvent Tracing for Windows経由でイベントログにログを書くことになった人向けのチュートリアル](https://qiita.com/cafeaulait/items/19e35aeeef19a102dfed)
面倒くさがらずにコード以外の手順等を尊守すればイベントログに無事出力されます。
がんばって！

```vbnet:Module1.vb
Imports System.Diagnostics.Tracing
Module Module1

    Sub Main()
        SampleETW.MyEventSource.Log.Critical("大変なことになりました。")
        Console.WriteLine("イベントログを確認して下さい(Enterキーで終了)")
        Console.ReadLine()
    End Sub

End Module

Namespace SampleETW
    <EventSource(Name:="AwesomeService")>
    Friend NotInheritable Class MyEventSource
        Inherits EventSource

        Public Shared Log As MyEventSource = New MyEventSource()

        <[Event](1, Level:=EventLevel.Critical, Message:="{0}", Channel:=EventChannel.Admin)>
        Public Sub Critical(message As String)
            MyBase.WriteEvent(1, If(message, ""))
        End Sub
    End Class
End Namespace
```
firewallで固定IPのsshのみを接続許可する

```
//sshを削除
firewall-cmd --permanent --remove-service=ssh
//特定IPからの接続を許可
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="許可するIP" port protocol="tcp" port="22" accept"
//リロード
firewall-cmd --reload
```

適宜ポート変更すれば、他のサービスでも使える
【LINE】LINE@ とか developers とか よくわからなくてビビっちゃう僕ちゃんのためのメモ 

## 背景
LINE BOTを作ってみた。
友達何名かにメッセージを送りたいんだけど、どうやらLINE BOT のアカウントをフォローしてもらわないといけないらしい。
今使ってるLINE@のフォロワーを使いまわしできないかなーと思って勉強

## 何にビビったか
　①Messaging API のアカウントを作ったけど、LINE@アプリで使えない
　②でも、LINE@の管理者ページにはアカウント出てる
　⇒LINE@とDevelopers、個人LINEのアカウントは同じもの？別物？　よくわからん

## つまり、こういうこと
　①LINE@のアカウントタイプの1つにDevelopers(MessagingAPI)
　②メールアドレスを紐づけている、LINE@とか Developersがログインすると使える
　③Developers(MessagingAPI)使うと、LINE@の個人チャットができなくなる
　・個人チャットしたい　・・・　LINE@でよろし（アプリからチャットできる
　・個人チャットいらない・・・　MessagingAPIを設定しよう（ただし個人チャットはできなくなるぞ！

　↓LINE@でMessagingAPIを設定しようとするとこうなる。
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/172765/fcb6d8cb-c6c9-c718-c00b-47bb232c5f51.png)

## まとめ
　LINEBOT(MessagingAPI)を作ったら、もっかい友達募集しようね
kotlinでsortを使った配列練習

##概要
kotlinで配列を使う練習を行うためバブルソート、挿入ソート、クイックソートを作ってみる

```kotlin:Bubble.kt
fun Bubble(b:IntArray){
    val len =b.size
    //val len =b.lastIndex+1
    var lenn : Int
    var tmp : Int
    if (len == 0){
    }else{
        for(i in 1..len){
            lenn = len - i -1
            for (q in 0..lenn){
                if(b[q] > b[q+1]){
                    tmp = b[q]
                    b[q] = b[q+1]
                    b[q+1] = xa
                }
            }
        }
    }
}
```

```kotlin:Insertion.kt
fun kihon(d: IntArray) {
    var i: Int
    var a: Int
    var b: Int
    i = 1
    while (i < d.size) {
        val tmp = d[i]
        a = 0
        while (a < i) {
            if (d[a] > tmp) {
                break
            }
            a++
        }
        b = i
        while (b > a) {
            d[b] = d[b - 1]
            b--
        }
        d[a] = tmp
        i++
    }
}
```

```kotlin:Quick.kt
fun quick_sort(d: IntArray, left: Int, right: Int) {
    if (left >= right) {
        return
    }
    val p = d[(left + right) / 2]
    var l = left
    var r = right
    var tmp: Int
    while (l <= r) {
        while (d[l] < p) {
            l++
        }
        while (d[r] > p) {
            r--
        }
        if (l <= r) {
            tmp = d[l]
            d[l] = d[r]
            d[r] = tmp
            l++
            r--
        }
    }
    quick_sort(d, left, r)  
    quick_sort(d, l, right) 
}
```

出力はこっち

```kotlin:main.kt
fun main(args: Array<String>) {
    val data = intArrayOf(5, 10, 3, 7, 8, 1, 9)
    Bubble(data)
    for (i in data.indices) print(data[i].toString() + " ")
}
```