OmniAICreator/Qiita-1.07M huggingface dataset:
調査メモ

SAML2.0準拠のSSOを実装する事になったけど何をどうすればいいのか
あまりにも分からないので調査。
分からなすぎるのでアウトプットで一旦まとめてみる。
<b>※※分からない人が分からない事を書いている、ただのメモ※※</b>

##そもそもSSOとは？
SSO＝「シングルサインオン」
一度認証を通れば、その認証情報を使って、許可されているすべてのサービスを使える仕組みのこと。

シングルサインオンを実現する仕組みは４種類あり、
その内の１つが<b>認証連携（フェデレーション）方式。</b>
フェデレーション方式とは、クラウドサービス間を、パスワードの代わりにチケットと呼ばれる情報を受け渡しすることで、シングルサインオンを実現する方法。
<b>フェデレーション方式に使えるプロトコル・標準規格の１つが「SAML」</b>らしい。

####プロトコルって何…？
コトバンクによると「コンピューターネットワークで通信を行うための手順や約束事。 伝送路、伝達方法、通信相手の特定、データの構成や表現方法などをあらかじめ規定したもの」だそうです。

##SAMLとは
Security Assertion Markup Language（セキュリティ・アサーション・マークアップ・ランゲージ）の略。
前述の通りで考えると、SSOをフェデレーション方式で実装する時のお約束事のことらしい。
以下、さらに詳しく調査。参考URLの記述を列記してみる。

[SAMLとは](https://wa3.i-3-i.info/word13374.html)

* 認証情報を受け渡しするときに使うことを目的として作られたXML形式の書式（と、あれやこれやの決まり事）
* そもそもの出発点は「やり取りする認証情報は、どんな書式にしましょうね？」→「よし！XML形式をベースにして、こんな感じにしようぜ」

[SAML認証方式の仕組み](https://www.ashisuto.co.jp/product/theme/security/sso.html)

* SAMLとは異なるインターネットドメイン間でユーザー認証を行うための標準規格
* IdP（Identity Provider)とSP（Service Provider)の2つの要素で構成される
* Webサービスを提供するSP側がSAMLに対応していれば、IdPが提供する認証情報を利用しSSOを実現できる

[SAML技術解説](http://xmlconsortium.org/websv/kaisetsu/C10/content.html)

* 「AuthXML（AuthenticationXML）」と「S2ML（Security Services Markup Language）」という2つのセキュリティ標準を基にできている

なんかまたよく分からないのが出てきた……調べてみたら、
<b>同様の技術として既に存在していた、Securant Technologies社のAuthXMLと、Netegrity社のS2MLという２つの規格を統合したものがSAML</b>だそうで。なるほど。

##結局SAML2.0準拠って何すればいいの？
以下、２つの記事からシーケンス図を見比べてまとめてみる。
図は無いがこの記事も参考にしてみる→[やさしい言葉で理解するSAML認証のまとめ](https://qiita.com/pasta_kun/items/4a57bd3b71ac8bf5d736)

[今更ですがSAMLのおさらい](https://qiita.com/samiii/items/a144a8661635fcc9fb0e)
>![https___qiita-image-store.s3.amazonaws.com_0_246440_134d987e-582a-7039-63e1-a455381e7acb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291024/d282bffd-46ea-aafd-e501-5a64db79fb97.jpeg)

***
[SAML2.0ベースのSSOをわかりやすく解説してみる](https://qiita.com/hanenao/items/27c1219d41828ec7532d)
>![https___qiita-image-store.s3.amazonaws.com_0_100530_240000f6-5f70-1593-f453-506e09a7f017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/291024/6ab7594b-d4a7-e7fc-bec7-bbf07f4ce1e2.png)

>1. ユーザーはSPに対しアクセスする
>* ユーザーはSP未認証のため、SPはIdpにAuthnRequestを送信する（リダイレクト）
>* Idpはユーザーの認証状況を確認する。ここでは、既に認証済み（ログイン済み）とする
>* Idpはユーザーの認証情報をSAMLResponse(Idpの秘密鍵で署名する)としてSPに送信する（リダイレクト）
>* SPはSAMLResponseをIdpの公開鍵で検証する
>* SPはSAMLResponseに含まれる認証情報を基にSP側の紐づくアカウントで認証したことにする
>* SPにアクセスが許可され、利用する

***
* <b>IdP</b>(Identity Provider)＝認証情報を提供する側。認証情報を提供するシステム。
* <b>SP</b>(Service Provider)＝認証情報を利用する側。WEBサービスの提供側。クラウドサービス。
~~クラウドサービスってことはAPIサーバーに使うAWSとかはこっちになる？のか？わからん。~~
→なんか自分がすごく見当違いな事を言っている事だけは分かった。

どうやらSAML認証には、SPから流れが始まる<b>SP-initiated SAML</b>と、Idpから流れが始まる<b>IdP-initiated SAM</b>の２種類があるらしい。
上記シーケンス図はどちらもSPから始まっているように見受けられるので、SP-initiated SAMLっぽい。
cssでgridを表現できるなんて


今回、とあるサイトを構築しようと一念発起しました。
まぁ、遊びの範疇なので、以前作った個人ブログをもとにさくっと行おうと。
gatsbyを使ってnetlifyへデプロイすることにしました。Theme自体は転がっていたものを使います。
gatsbyのなのでReactで作られており、これをいろいろカスタマイズしていく段階で、
gridを使う必要が出てきました。

bootstrapなどのCSSフレームワークに必ず含まれているgridなので、
まぁこのThemeが使っているCSSフレームワークのgridを使おうと思いましたが、
「あれ？なにもはいっていない。。。」
「このご時世そんなことあるか？」と思いつつ調査してみると、「grid-template-column」の記述が。。
調べていくうちにCSSだけでgridを表現できるということがわかりました。
「あー、CSS書いてくのかー。めんどくせーな」と思いつつ調査してみると、意外と便利そうなので今回まとめておきます。


## メリット
- もともと何もCSSフレームワークが入っていないThemeにたいして、bootstrapを適応するのは至難の業。絶対フォームやら見た目がある程度変わること前提できると入れますが、CSSで書けばその必要はなく他への影響が最小限に押さられます。
- CSSフレームワークは正直言ってクラス地獄になりますがCSSのみで対応すればクラスはすっきりする。

## デメリット
- ブラウザ依存がいまだあるらしいので、何とかしないといけない。
- CSSの記述が多くなるのがめんどくさい。


メリデメはあるものの、今回は使ってみるの一択なので、やってみます。



# 概念
まずはイメージが大事ということで、イメージをお伝えすると。ばっこっととったコンテナ（枠）を縦横何分割し何pxとるかを定義し、その枠にたいしてアイテムの位置を指定していくイメージです。
CSSフレームワークでは、rowを定義してそこにアイテムを何分割しておいていくかという言ってしまえば１次元のイメージですが、CSSでは縦横の２次元になるイメージです。

今回の目的としては、サイドバーを追加したかったので、
こんなイメージです。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308228/cbac8847-96c2-4ea6-0040-27d00cc870fd.png)


## まずはコンテナを定義する

```html
<div id="container">
    <div>sidebar</div>
    <div>contents</div>
</div>
```

簡単なHTMLです


```css
#container {
    display: grid;
    grid-template-columns: 150px 1fr;
}
```



コンテナにたいして、display: grid;とし、列を定義します。
上記の場合だと２列で１列目が150px、2列目は残りの幅ということになります。
行と列が定義し、今回は列だけでよいのでgrid-template-rowsは使いませんが、それぞれの意味としては下記とのこと。

- grid-template-rows: 行のトラックの高さを半角スペースで区切って指定
- grid-template-columns: 列のトラックの幅を半角スペースで区切って指定
- rfは見慣れない単位ですが残りの幅という意味らしいです。基本1rfで使うと思いますが2rfにすれば残りの幅の倍の幅ということになります。

今回私がやりたかったことはこれで実現できてしまいますが、もっといろんなことができそう。

例えば

- 分割したコンテナの任意の位置にアイテムを作る。
- 分割したコンテナの一部を結合する。
- エリアに名前を付けて管理する。
- repeatで完結に定義する。


あとは素晴らしい記事があったので、[こちら](https://qiita.com/kura07/items/e633b35e33e43240d363)を参照すれば、よくわかる。
Tera Termの便利な機能

# はじめに
今回はTera Termの便利な機能について紹介させていただきます。

# Tera Term Macro
Tera Term Macroは.ttl(Tera Term Language)の拡張子を持って実行するとmacro通り、Tera Term上で実行される便利な機能でございます。

下記の例はlinuxサーバーにSSH接続するマクロです。{}の中を自分の環境に合わせて変更後、使ってください。

```shell:example.ttl
;==============================================
;; 接続先IPアドレス
HOST='{接続先}'
;; ポート番号(SSH:22)
PORT='22'
;; ユーザ名
USERNAME='{ユザー名}'
;; キーファイル名
KEY_FILE='{鍵名}'
;; 設定ファイル(任意)
INI_FILE='TERATERM.INI'
;==============================================

;; 接続コマンド生成
MACRO_DIR=''
KEY_FILE_PATH='{鍵の場所}'
getdir MACRO_DIR
strconcat KEY_FILE_PATH KEY_FILE
COMMAND = HOST
strconcat COMMAND ':'
strconcat COMMAND PORT
strconcat COMMAND ' /ssh /2 /auth=publickey /user='
strconcat COMMAND USERNAME
strconcat COMMAND ' /keyfile='
strconcat COMMAND KEY_FILE_PATH

;; 接続
connect COMMAND

end
```
`KEY_FILE_PATH='{鍵の場所}'は後ろに\を必ず付けてください。例：C:\keys\`
「ttpmacro.exe」で上記で作成した.ttlファイルを実行できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/ee513067-7928-935e-1bc8-b93b718db712.png)
実行すると上記のようにttlファイルを選択できるWindowが出るので、接続先ごとにttlを作って置くと便利にSSH接続ができるようになります。
マクロについてもっと詳しい情報は[公式フォームページ](https://ttssh2.osdn.jp/manual/ja/macro/)を参照してください。

#サーバーからファイルのアップロードとダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/6092e078-1c1d-3384-c49c-31ec86a241c4.png)
File→SSH SCPをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/3dbdbe24-5d17-e3f6-d465-f560585d8974.png)
上の半分はアップロード、下の半分はダウンロード用です。
ほしいファイルを指定してアップロードとダウンロードが可能になります。
※権限がなければ出来ないのでご注意ください。


#自動ログ作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/e2ea5bf6-9c76-93ba-4222-bdfce79eeff0.png)
Setup→Additional settingsをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/501270/199217ee-adbe-adcf-a877-ba383d87dd65.png)
「View log editor」にはログを開く際のエディターを設定できます。
「Default log save folder」にログを保存したいところを指定します。
「Auto start logging」にチェックを入れるとteraTerm上で出力されるすべての内容がログに記載されます。
間違いの設定などしたら、SSHの接続が終わっても確認できるので便利な機能です。
※Tera Termを同時に2つ以上開いた場合は最初のTera Termのみログされます。
※このログはただTera Term上で出力される文字を残すログなのでサーバーのログとは違います。

#終わりに
以上、3つの機能についてご紹介させていただきました。
機会があれば、他の機能についてもご紹介させていただきます。
ありがとうございます。
Shopifyテーマ開発の概略、ハマりポイント

# tl;dr

* 今からShopifyやるならTheme Kit一択だよ。 Scssを使いたいならgulpなどと組み合わせるのが吉
* Slateは辞めたほうがよいよ。癖が強すぎて後々メンテしづらい
* セクションは上手く使えば相当便利だよ。

# Shopifyとは？

Shopifyはカナダ発のECサイトプラットフォームです。越境ECで各国の支払いプラットフォームとの連携を行っており多くの開発者が開発するアプリがあることが大きな特徴です。

本投稿ではShopifyにおいてテーマを開発/カスタマイズする際に知っておくべき知識と実務上のハマりどころについてまとめさせていただきます。

## Shopifyテーマの構成

Shopifyのテーマは以下のディレクトリ構成となってます。

* assets ... jsやcssや画像ファイルを配置
* config ... テーマ全体の設定内容＋テーマのカスタマイズで行った設定が格納されるフォルダ
* layout ... テーマ全体のヘッダ、フッタなどのレイアウトファイルを配置するフォルダ
* locales ... 各言語の翻訳データを格納するフォルダ
* sections ... 「セクション」を格納するフォルダ（詳しくは後述）
* snippets ... 「スニペット」を格納するフォルダ（詳しくは後述）
* templates ... 各ページのテンプレートを格納するフォルダ

基本ウェブアクセスがあった場合、表示するページに応じてtemplatesフォルダのテンプレートが選ばれ描画されます。templatesの中にあるテンプレートは必要に応じてスニペットやセクションを読み込んで描画します。
最終的に状況に応じて指定されたlayout内のレイアウトファイルと組み合わされ、表示されるという流れです。

assetsファイルにある画像などのファイルはHTML上で指定されると専用のURLが発行されて表示されます。

configやlocalesフォルダは描画の際に設定や言語情報として使われるというざっくりとした構成になります。

## セクション(section)とスニペット(snippet)の使い方

Shopifyのテーマファイルで困惑することはセクションとスニペットの扱いだと思います。
端的に言うと、設定可能なものがセクション、設定不可能なものがスニペットです。

|        |  セクション |  スニペット |
|:-----------------|:-----------------:|:------------------:|
| 読み込める場所    | templates/layoutsフォルダ内からのみ | どこからでもOK |
| 設定(schema)可能? | 可能 | 不可能 |
| script/style利用可能?  | 可能 | 不可能 |

セクションはtemplates/layoutsディレクトリにあるファイルからしか読み込むことはできません。ページ全体に置くヘッダ、フッタやコレクションを選んで表示する商品一覧、スライダーなどで使うことになりますが、テーマ全体で1セクション1設定とセクションに設定がリンクしています。
そのため、例えば、同じセクションをサイト内の別の場所で読み込んでもまったく同じ設定が反映されてしまうため注意が必要です。

一方、スニペットは設定ができないどこからでも読み込めるテンプレです。セクションの場合は、セクションの中からセクションを読み出したり、スニペットの中からセクションを読み出すことはできませんが、スニペットはスニペットやセクションからも読み出すことができます。

そのため、ページで使われるページ内の構成要素はセクションで、全体的にいろいろな場所で使い回す共通部品はスニペットで作るのが一般的です。

## Shopifyサイト内からのテーマ編集

簡単なテーマの編集だけであればShopifyのサイト内からやることができます。
Shopifyの管理画面から オンラインストア を選択し、編集したいテーマの「アクション」から「コードを編集する」をクリックします。

後は編集したいファイルを選んで編集をするだけです。

Shopifyはテーマの履歴をある一定期間残してくれるので、仮にウェブでいじってなにかおかしな事があった場合、該当ファイルの編集画面で「旧バージョン」というリンクをクリックすると過去のファイルに戻すことができます。

なお、編集する際には、既存のテーマを普通に編集するだけではなく「アクション」から「複製」を選んで修正案件ごとにテーマを複製していくことをおすすめします。

## Theme Kitを使ったテーマ開発

Shopifyのテーマ開発では[Theme Kit](https://shopify.github.io/themekit/)というソフトウェアを使うのが昨今一般的です。
Theme Kitは単純にShopifyのテーマファイルを同期するためのソフトウェアですが、テーマキットを使うことでファイルの更新管理＋差分アップロードができるため、非常にスピーディーにテーマの開発をすることができます。

Theme Kitについて詳しくはこちらの記事を参照ください: [Shopify Theme Kit を使ったテーマ開発](https://medium.com/@yonemoto/shopify-theme-kit-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%86%E3%83%BC%E3%83%9E%E9%96%8B%E7%99%BA-55ced8ab3de9)

※ Slateというソフトウェアを使ってSCSS/JSをコンパイルするやり方もありますが、非常に癖が強いこと、開発がほぼストップ状態となっていることから、オススメできません。

## BootstrapなどSCSSやJS(ES6)をフル活用したい場合はgulpなどの併用がオススメ

Theme Kitで基本テーマのカスタマイズは多くのことができますが、SCSSでimportを使えなかったりjsでもrequire/importを使えないなどモダン開発の利便性を享受している開発者に取ってはストレスも多い状態になっています。

もしSCSSやJSなどのモダン技術をフルに活用したい場合は、gulpやwebpackなどと併用することがオススメです。assetsフォルダ内に .css.liquid / .js.liquid というファイル名で出力し、touchすることでTheme Kitとも同期することができます。
ChromeでWeb打刻自動化

# 概要
毎朝パソコン起動してChrome開いて打刻するのがめんどくさかったので自動化しました。

# 用意したもの
・Windows 8.1
・Google Chrome
・Python 3
・selenium
・ChromeWebDriver

バージョン覚えてなくてすみませんが、どれも2019年6月時点での最新版だったはずです。

## WebDriverの準備
[こちら](https://chromedriver.chromium.org/downloads "ChromeDriver")から自分のChromeのバージョンに対応したWindows版のChromeDriverをダウンロードします。
例えば、Chromeのバージョンが78なら、ChromeDriverを78のものを。
他のOSの方は他のOS版をダウンロードしてください。

ダウンロードしたChromeDriverは適当なところにおきます。
（プロジェクトフォルダ内、C直下など）

# 実装
Pythonで以下のような形で実装します。

```python:clockin.py
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import datetime
import time
import sys

# 要素（定数）
ELEMENT_CLASS = "btnSTART"

# webdriver読み込み
driver = webdriver.Chrome(executable_path="おいた場所/chromedriver.exe")

# Chrome起動して指定URLに飛ぶ
driver.get("https://www.clockin.hoge.jp")

# 表示されるまで待つ
try:
    element = WebDriverWait(driver, 5).until(
        EC.presence_of_element_located((By.CLASS_NAME, ELEMENT_CLASS))
    )
finally:
    if not driver.find_element_by_class_name(ELEMENT_CLASS).is_enabled():
        driver.quit()

# 打刻
driver.find_element_by_class_name(ELEMENT_CLASS).click()
```

# プロキシで自動化できない場合
プロキシがあって毎回ログインしないと接続できない場合、Chromeを起動した時点で止まるかと思います。
[SwitchyOmega](https://chrome.google.com/webstore/detail/proxy-switchyomega/padekgcemlokbadohgkifijomclgjgif "SwitchyOmega")という拡張機能を使用して自動化することができます。
詳しい使い方は書きませんが、SwitchyOmegaを起動した状態でアクセスし、プロキシ設定を追加すると、userフォルダが作られます。これをWebDriverを読み込む際にオプションとして記述します。

## 実装
```python:clockinproxy.py

# webdriver読み込み(chrome_options=optionが追加部分です）
driver = webdriver.Chrome(executable_path="./chromedriver.exe", chrome_options=option)

# ちょっと止める
time.sleep(1)

# Chrome起動して指定URLに飛ぶ
driver.get("https://www.clockin.hoge.jp")
```

プロキシ認証処理のためか、たまに指定したURLに飛ばず、画面が真っ白になることがあります。そのため、1秒程度sleepで止めると問題なくURLに飛びます。

# 参考
・https://qiita.com/memakura/items/20a02161fa7e18d8a693
　ページ内要素の操作に参考にさせていただきました。
【初心者】JavaScript　関数／引数／戻り値【備忘録１１】

##11/03～11/05に勉強したこと

###関数
-　関数とは、いくつかの処理をまとめたものを言う。
-　関数を定義するとは下記のように書く。

```js
const introduce = function(){
 //まとめたい処理
 };

 introduce();
```

-　一番下を「関数の呼び出し」という。


###アロー関数
-　JavaScriptのE6から新たに書き方が加わり、下記のようにも書ける。

```js
const introduce = () => {
 //まとめたい処理
 };

```

###引数
-　引数とは、関数に与える追加情報のことを言う。(処理をする前の値)
【例】

```js
const greet = (name) => {
 console.log(`こんにちは${name}さん`);
};

greet("りんご");
```
-　上記の書き方で、「こんにちはりんごさん」が出力される。

###戻り値
-　戻り値とは、関数に与えた値が処理された結果の値のことを言う。
【例】

```js
const add=(a,b)=>{
 return a+b ;
//ここで処理が終了するので{}内でこの後console...を書かないように気を付ける。
};

const sum = add(1,3);
console.log(sum);

```

【その他戻り値例】

```js
const check=(number)=>{
 return number % 2 ===0;
};

if(check(123)){
 console.log("偶数である");
}else{
 console.log("偶数ではない");
}
```
- この場合は「偶数ではない」が表示される。


##気を付けたいこと
-　関数で複数書く場合は、関数を呼び出す際も[,]を使用するので忘れないこと。
-　function(){...だけでは出力されないので、呼び出すことを忘れないよう気を付ける。
-　戻り値の際、returnの後に[=]を入れてしまうことがあったので気を付ける。
【Kubernetes】Job/CronJobのmanifest作成と設定値メモ

# やること
KubernetesでCronJobを動かすためのマニフェストファイル（Manifests）を作成します。
設定値などのメモも記載します。

# CronJobを作成

## YAMLファイルを作成
```yaml:cronjob.yml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  # Jobの名前
  name: my-cronjob
spec:
  # スケジュールはcron形式
  schedule: "*/1 * * * *"
  # スケジュール対象外にするか
  suspend: false
  # ジョブを同時実行するかどうか
  concurrencyPolicy: Forbid
  # ジョブの開始期限（秒）
  startingDeadlineSeconds: 100
  # ジョブ成功の履歴数
  successfulJobsHistoryLimit: 7
  # ジョブ失敗の履歴数
  failedJobsHistoryLimit: 3
  # 実行内容を指定
  jobTemplate:
    spec:
      # 正常終了回数
      completions: 1
      # 並列数
      parallelism: 1
      # リトライ回数
      backoffLimit: 0
      template:
        spec:
          # 再起動の設定
          restartPolicy: OnFailure
          containers:
          - name: my-cronjob
            # imageを設定
            image: busybox
            # コマンドを設定
            args:
            - /bin/sh
            - -c
            - date
```

## 補足事項
上記で作成したCronJobの設定値についての補足です。
オプションは、不要であれば行ごと削除しても問題ありません。そのときはデフォルト値が有効になります。

### suspend
このフィールドはオプションです。デフォルトはfalse。
スケジュール実行を一時的に止めたいなど、対象外にしたいときはtrueを設定してください。

### concurrencyPolicy
このフィールドはオプションです。デフォルトはAllow。
Allow：並列実行を許可。
Forbid：前回のジョブが終わってないときは、ジョブをスキップします。並列実行はしません。
Replace：前回のジョブが終わってないときは、ジョブをキャンセルし新しいジョブを実行します。

### startingDeadlineSeconds
このフィールドはオプションです。
何らかの理由でジョブのスケジュールが遅れたときに、開始する期限（秒単位）を設け、startingDeadlineSecondsに到達するまでジョブの再試行を続けます。
値を指定しないときは、CronJobはタイムアウトしません。

### successfulJobsHistoryLimit
このフィールドはオプションです。デフォルトは3。
0を設定すると、ジョブ終了後の履歴は保持されません。

### failedJobsHistoryLimit
このフィールドはオプションです。デフォルトは1。
0を設定すると、ジョブ終了後の履歴は保持されません。

### completions
このフィールドはJobのオプションです。
Jobの正常終了した回数を指定できます。この値に達するとJobが完了となります。

### parallelism
このフィールドはJobのオプションです。デフォルトは1。
Jobの並列数です。

### backoffLimit
このフィールドはJobのオプションです。デフォルトは6。
Jobのリトライ回数です。
0を設定すると、リトライしません。1を設定すると、1回リトライするのでジョブは2回動くことになります。


### restartPolicy
これは、再起動するかどうかを設定する訳ではなく、どのように再起動するかを設定します。
Never：起動するごとに失敗のカウントをして、新しいPodを作成し再実行します。
OnFailure：起動するごとに失敗のカウントをせず、同じPodで再実行します。

### image/args
この辺りはCronJob特有ではなくKubernetes共通なので省略します。以下のあたりを参考にしてみてください。
https://kubernetes.io/docs/concepts/containers/images/
https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/
ちなみにですが、imageは最速でCronJobを実行したかったのでbusyboxを利用させていただきました。
https://hub.docker.com/_/busybox

# さいごに
これでManifestファイルの作成はできました。
linuxのcronと比較すると、Dockerのimageを準備しておくなど面倒なこともありますが、時間の設定や環境変数、コマンドラインなど似ているところも多いですね。
それに加えて随分と高機能になっていると思います。

このManifestファイルをもとに、kubectlコマンドを使用して実際に動かしてる記事はこちらです。
https://qiita.com/boutan/items/ec6c0f410bf32e9caa78
Firebase Cloud MessagingをiOSアプリで利用したときのメモ

- Apple Push Notification Authentication Keyを用意する
- アプリIDの作成
- プロビジョニング プロファイルを作成

https://firebase.google.com/docs/cloud-messaging/ios/certs?hl=ja

---

- FirebaseプロジェクトにiOSアプリを追加
- Apple Push Notification Authentication KeyをFirebaseプロジェクトのiOSアプリにアップロード
- Firebase 構成ファイル（GoogleService-Info.plist）をDLしてiOSプロジェクトに追加
- iOSプロジェクトにFirebaseSDKを追加（CocoaPods）
- https://github.com/firebase/quickstart-ios/blob/15a45e32607dceb3264da28879a48d7890b7dd0c/messaging/MessagingExampleSwift/AppDelegate.swift を参考に `AppDelegate.swift`を実装

https://firebase.google.com/docs/cloud-messaging/ios/client?hl=ja

---

```
You've implemented -[<UIApplicationDelegate> application:didReceiveRemoteNotification:fetchCompletionHandler:], but you still need to add "remote-notification" to the list of your supported UIBackgroundModes in your Info.plist.
```
と言われたら 「TARGET」->「Capabilities」->「Background Modes」を「ON」にして 「Remote notification」にチェック

- Runした際に `messaging didReceiveRegistrationToken`が走るので、printされたトークンをコピーしておく

- FirebaseコンソールのCloudMessagingからコピーしたトークンを「FCM 登録トークンを追加」してテストメッセージを送信し、受信を確認する。
ubuntu18.04でのxrdpトラブル対応 　と　リモートデスクトップ設定

# ●ubuntu 18.04でのxrdpトラブル対応
xrdpを設定すると、ローカルPCでマウス・キーボードの入力を受け付けなくなる
（リモート接続時は問題なし）
####【解決方法】
```
sudo apt-get -y install xserver-xorg-input-all 
```
https://c-nergy.be/blog/?p=13390

# ●リモートデスクトップ設定手順（履歴）
## 検証環境
OS: ubuntu 18.04
GPU: GTX1080Ti
###1.パッケージのインストール
```
sudo apt-get -y install xserver-xorg-core xorgxrdp xrdp　（xrdpだけではダメ）
sudo apt-get -y install xserver-xorg-input-all　(これがマウス・キーボード対策)
```
###2.新カーソルの無効化
sed -e 's/^new_cursors=true/new_cursors=false/g' -i /etc/xrdp/xrdp.ini
sudo systemctl restart xrdp
###3.~/.xsessionrcの作成
```
$ D=/usr/share/ubuntu:/usr/local/share:/usr/share:/var/lib/snapd/desktop
$ cat <<EOF > ~/.xsessionrc
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_DATA_DIRS=${D}
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
EOF
```
###4.「カラープロファイルを作成するには認証が必要です」の回避
sudo vim　で作成するのが良い

```/etc/polkit-1/localauthority.conf.d/02-allow-colord.conf
polkit.addRule(function(action, subject) {
   if ((action.id == "org.freedesktop.color-manager.create-device" ||
        action.id == "org.freedesktop.color-manager.create-profile" ||
        action.id == "org.freedesktop.color-manager.delete-device" ||
        action.id == "org.freedesktop.color-manager.delete-profile" ||
        action.id == "org.freedesktop.color-manager.modify-device" ||
        action.id == "org.freedesktop.color-manager.modify-profile") &&
       subject.isInGroup("**")) {
      return polkit.Result.YES;
   }
});
```

## 参考サイト
https://www.hiroom2.com/2018/04/28/ubuntu-1804-xrdp-gnome-ja/
https://note.spage.jp/archives/576
http://aimingoff.way-nifty.com/blog/2017/06/xrdp-4be6.html
The Virtual Brain のインストール

The virtual brain を ubuntu 18.04 にインストールしたときのメモです．

# 動機
脳波などのメソスコピックレベルの脳活動の数理モデルの共通基盤を作ることを目指している The Virtual Brain というシミュレータがある。 解剖学や臨床のデータを構造に反映した脳の数理モデルを構築し、仮想的な脳波やfMRIデータを生成することができる。端的にいうと、実際の脳の構造を反映した結合行列を持った結合非線形振動子系のシミュレータ。region-based model と suface-based model があり，region-based modelならpcレベルでも動くので、インストールして試してみたい。

# 環境
* Ubuntu 18.04 (desktop)

Dockerとかよく知らない化石なので，今回は仮想マシン使います．

* サーバーとして他のマシンから使いたい。
* 主にWebインターフェースになるか、スクリプト使って動かすか、これから次第だが、とりあえずはWebから使ってみる。

# official web site
https://www.thevirtualbrain.org/tvb/zwei

![VirtualBox_tvb1_06_11_2019_12_52_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311036/e26b7287-e950-f483-4ca7-20fee2ba2d8c.png)

## 推奨環境
https://www.thevirtualbrain.org/tvb/zwei/brainsimulator-requirements
抜粋

* 1シミュレーションに１CPUコア必要．
* 一回のregion-level のシミュレーションには8GB以上のメモリで十分．より複雑なシミュレーションの場合は少なくとも16GB以上．
* surface-level のシミュレーションにはより多くのメモリが必要
* surface-level の 10ms のシミュレーションに300MBのディスクスペースが必要．ユーザ一人あたり50GBが目安．
* PCを使う場合，WebGL対応のグラフィックカードが必要．

## ダウンロード
https://www.thevirtualbrain.org/tvb/zwei/brainsimulator-software
2019/11月時点で最新のv1.5.8をダウンロードする．
右のLinux 版 1.2GB をダウンロード．

![VirtualBox_tvb1_06_11_2019_12_56_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311036/c0fdb8c2-d892-12a4-89a4-4e46b9d5c9ed.png)



# インストールと起動


```bash
$ unzip TVB_Linux_1.5.8.zip 
```

```bash
$ cd TVB_Distribution/
```

webブラウザから操作するweb application GUI interface を使うには，解凍したディレクトリの```bin```の中にあるスクリプト```tvb_start.sh```を実行する．

```bash
$ cd TVB_Distribution/bin
$ ./tvb_start.sh
```
終了するときは

```bash
$ ./tvb_stop.sh
```

# configuring

最初の起動時は少し待つと，ブラウザが開いて初期設定をする画面がでるので，管理者のユーザ名やパスワード，メールなどを登録する．matlabやoctaveが使える場合はそのpathを指定する．他はとりあえずデフォルトにした．

# ログイン画面
ログイン画面が出ました．他のマシンのブラウザからもアクセスできるようです．
今回はとりあえずここまで．

![login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311036/d91c9dab-49ef-018c-cdc5-e52c2b865ad0.png)

# デモデータ
デモ用のデータはインストールパッケージにも一部含まれているが，より多くのデータがGithubにあるらしい．
https://github.com/the-virtual-brain/tvb-data

# TODO
* マルチユーザ設定で使うには，専用ユーザーをつくってそこから動かしたほうが便利か．
width の合計を 100%; にしたときに改行が入って横幅に納まり切らなくなる問題の解決

#問題点
以下は子要素がすべて `display: inline-block;` により横並びになっている。
この場合要素間(\<time>,\<span>の間)に改行が半角スペースとして要素の間に挿入されてしまう。



```html
<li class="scroll-item">
  <a href="#">
    <time class="date" datetime="2019-10-19">2019.10.19 SUN</time>
    <span class="category news">NEWS</span>
    <span class="title">aaaを更新しました。</span>
  </a>
</li>
<li class="scroll-item">
  <a href="#">
    <time class="date" datetime="2019-10-19">2019.10.19 SUN</time>
    <span class="category">TOPIC</span>
    <span class="title">あいうえお</span>
  </a>
</li>
```

```css
.scroll-list .date {
  /* border: 1px solid red; */
  display: inline-block;
  width: 19%;
  font-size: 1.0rem;
}
.scroll-list .category {
  display: inline-block;
  width: 8%;
  font-size: 1.0rem;
}
.scroll-list .title {
  display: inline-block;
  width: 73%;
  padding-left: 15px;
  font-size: 1.0rem;
}
```

その半角スペースのせいでwidthが100%を超えてしまい、横幅に納まり切らなくなる。

#解決
親要素に`font-size: 0;`を記述することで挿入された半角スペースのサイズを0にする。

```css
.scroll-list .scroll-item a {
  /* border: 1px solid red; */
  display: block;
  padding: 10px 15px;
  color: #333;
  transition: background-color 0.1s;
  font-size: 0;
}
```

そうすると子要素も0になり文字が表示されなくなってしまうので、`font-size: 1.0rem;`のように指定し直す必要がある。

```css
.scroll-list .date {
  /* border: 1px solid red; */
  display: inline-block;
  width: 19%;
  font-size: 1.0rem;
}
.scroll-list .category {
  display: inline-block;
  width: 8%;
  font-size: 1.0rem;
}
.scroll-list .title {
  display: inline-block;
  width: 73%;
  padding-left: 15px;
  font-size: 1.0rem;
}
```
AWSでのクロスアカウントアクセス（2019年11月版）

# 概要

最新記事をこちらに書きましたので、よければこちらも御覧ください。
https://red-full-moon.com/aws-cross-account/

AWSで使うアカウントが天文学的数字まで膨れ上がってきたので（嘘
今までブラウザ分けてたけど、クロスアカウントアクセスしてみようかなーなんか便利そうだし
と思って調べてみたら、意外と古い記事ばっかりで今とビミョーに違ったので最新情報を乗っけておきます。
皆さんの快適なAWSコンソールライフの一端を担えればと思っております。

ちなみに、クロスアカウントアクセス、むっちゃ便利なんでみんな使って下さい！！

# 事前準備
以下のものが必要です。

- 常にログインしておきたいアカウント
    - 以下メインアカウントと呼称する
    - IAMにアクセスできる権限
- メインアカウントに統合したいアカウント
    - 以下サブアカウントと呼称する
    - IAMにアクセスできる権限

双方ともIAMユーザーである必要があり、 rootユーザはNGです！

# 流れ
- サブアカウントで、メインアカウントからのアクセスを許可する
- メインアカウントで、サブアカウントへのアクセスを行う
- Happy!

# いざ実践
## サブアカウントでのやること
1. 「IAM > ロール > ロールの作成」から別のAWSアカウントを選ぶ
<img width="1062" alt="スクリーンショット 2019-11-06 16.05.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125791/51cd6f62-14f5-cf8b-e7d8-c0895c558fa3.png">
1. アカウントIDにメインアカウントのアカウントIDを入れる
    - ログインするときに使う12桁の数字のアレ
    - オプションはお好みで
        - 基本的にはなくても行ける
<img width="972" alt="スクリーンショット 2019-11-06 16.07.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125791/e41ab745-8744-9363-3099-8920a71db991.png">
1. メインアカウントでやりたいことに合わせて権限をふる
  - 脳みそ停止したいなら、画像のように「AdministratorAccess」にチェック
<img width="1019" alt="スクリーンショット 2019-11-06 16.08.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125791/2147b868-250b-2789-177a-e3ed9bd22252.png">
1. タグや名前はお好みでつける
    - No Tag No Instance
        - 何が何かわからなくならないようにタグ付はしっかりしよう
1. 完了
    - 赤枠の値はメモっておこう
        - 後で使うよ！
<img width="1694" alt="スクリーンショット 2019-11-06 16.12.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125791/8f69605e-3df8-aa08-a914-200ee3aa891c.png">

## メインアカウントでやること
- 「IAM > ポリシー > ポリシーの作成」からjsonで下記の内容のポリシーを作成

```json
{
    "Version": "2012-10-17",
    "Statement": {
        "Effect": "Allow",
        "Action": "sts:AssumeRole",
        "Resource": "さっきのメモった値の上の枠（ロールARN）の中身"
    }
}
```  
- さっき作ったポリシーを自分にアタッチ
- さっき控えた下の赤枠のURLにアクセス！
- 表示名だけをお好みでチェンジ
<img width="1695" alt="スクリーンショット 2019-11-06 16.24.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125791/24ad73ba-5b7b-b02e-ceb8-e5393eb8402f.png">
 
## 完成
<img width="1647" alt="スクリーンショット 2019-11-06 16.22.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125791/bb028ead-93ec-403a-f7c8-37ec8c802282.png">
設定が終われば、右上の自分のIAMユーザーのところからいつでもユーザーが切り替えられる様になるぞ！
（今回は名前を伏せているが、水色と黄色の四角いマークのところ）
matplotlib+pandasで階層的な軸ラベルを描く

階層構造のインデックスを持ったMatplotlibのデータフレームを、そのままプロットすると、軸ラベルがタプルそのままの表示となって、やや残念な感じになります。

```py
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

a = pd.DataFrame(np.random.random([6, 2]),
                 index=pd.MultiIndex.from_product([['group1', 'group2'],['item1', 'item2', 'item3']]),
                 columns=['data1', 'data2'])

a.plot.bar()
```

![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54842/f449b069-30ad-440c-2389-ee3473a7f904.png)


階層構造のデータであることが見やすいような軸ラベルが付けたいと思って調べてみましたが、とりあえず下記のような方法でできる模様。

```py
def set_hierarchical_xlabels(index, ax=None,
                             bar_xmargin=0.1, # 線の左右両端のマージン、X軸のスケール
                             bar_yinterval=0.1, # 線の上下の間隔、Y軸の長さを1とした相対値？
                            ):
    from itertools import groupby
    from matplotlib.lines import Line2D

    ax = ax or plt.gca()

    assert isinstance(index, pd.MultiIndex)
    labels = ax.set_xticklabels([s for *_, s in index])
    for lb in labels:
        lb.set_rotation(0)

    transform = ax.get_xaxis_transform()

    for i in range(1, len(index.codes)):
        xpos0 = -0.5 # 対象グループの左側の座標
        for (*_, code), codes_iter in groupby(zip(*index.codes[:-i])):
            xpos1 = xpos0 + sum(1 for _ in codes_iter) # 対象グループの右側の座標
            ax.text((xpos0+xpos1)/2, (bar_yinterval * (-i-0.1)),
                    index.levels[-i-1][code],
                    transform=transform,
                    ha="center", va="top")
            ax.add_line(Line2D([xpos0+bar_xmargin, xpos1-bar_xmargin],
                               [bar_yinterval * -i]*2,
                               transform=transform,
                               color="k", clip_on=False))
            xpos0 = xpos1

a.plot.bar()
set_hierarchical_xlabels(a.index)

```

![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54842/370bca2d-87b7-5ad0-4505-6067896440e3.png)

細かいデザインは目的や好みによって変わると思うので、上記を参考に適当に改変すればOK。
3階層以上のMultiIndexでもプロットできます。
Dockerが認識しなかった〜とりあえず解決まで

こちらを参考にDockerをインストールする
https://qiita.com/kurkuru/items/127fa99ef5b2f0288b81
>
nginxを起動してみる

nginx（ンギンクス）…

>
nginx（「エンジンエックス」のように発音[3]）は...
###エンジンエックスぅぅぅ〜〜〜！！！？？？

までしたとことで日をまたいだので
改めて続きを始めたところ…

`$docker container ls`
を叩くと下記の記述になった

```
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

そこで下記を参照
https://qiita.com/raySSK/items/655e63f12755012a28db

# つまりDockerが起動していないのである！

`$ systemctl start docker`

を叩いても
`systemctl: command not found`
そんなコマンドありませんよ
みたいなことを言われる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/528622/4f735548-2d3a-111e-d215-743bdf15bdb7.png)

# アプリをクリックして起動しました

解決しました（とりあえず）
Vagrant box をローカルにダウンロードするの巻


# Vagrant box をローカルにダウンロードしたいとき

Vagrant up するときにBoxをダウンロードするのは時間かかるね。。。そうだBoxをローカルに置いておこう！

以下Box名などは必要に応じ変更してください。

### Vagrant Cloud でダウンロードしたいボックスを検索
そしてダウンロードしたいバージョンを選択

Ubuntu 18.04 のBoxならここ　→　https://app.vagrantup.com/ubuntu/boxes/bionic64
CentOS 7 ならここ　→　https://app.vagrantup.com/centos/boxes/7/
CentOS 8 はまだないようです。（2019/11/6時点で)

### wgetでダウンロード
※MacとLinuxならwgetでWindowsは。。。。？
選んだボックスのバージョンをクリックするとURLがわかります。
↓こんな感じでOK

``` 
wget https://app.vagrantup.com/<BoxのURL/バージョン>/providers/virtualbox.box -O <指定したいBox名>.box

例）wget https://app.vagrantup.com/ubuntu/boxes/bionic64/versions/20191105.0.0/providers/virtualbox.box -O ubuntu1804_20191105.box
```

### Boxを追加

``` 
vagrant box add <好きな名前> <ダウンロードしたBoxの名前>.box
例）vagrant box add ubuntu1804 ubuntu1804_20191105.box
```

追加したあとに vagrant box listで確認をしてみよう。こんな感じならOK

> vagrant box list
ubuntu1804 (virtualbox, 0)


### Vagrantfile に記述
必要な設定は別途追記。そのあとにVagrant up :thumbsup:

```
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu1804_20191105.box"
end
```
[ UML ] シーケンス図





##シーケンス図とは
クラスやオブジェクト間の処理を時間軸に沿って表記した図。

##要素
・**ライフライン**
オブジェクトやクラスを表現する。どちらか一方を省略できる。
時間軸は下に流れていく。
![スクリーンショット (86).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/8fdd3f6f-1afe-d6e8-fb0e-7914f4aa03a1.png)



・**実行**
ライフラインが実行していることを表す。
![スクリーンショット (87).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/efe8ea3a-ba65-2389-74f6-56d7d6a4977e.png)

・**停止**
ライフラインの消滅を表す。ライフラインの下に罰を書いて表現する。
![スクリーンショット (88).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/5d93a83b-0e98-55b3-b276-b765ff63d730.png)


・**同期メッセージ**
送り先のライフラインの実行に同期されるメッセージを表す。
以下は例としてregist(Item item)を呼び出した時の図である。
![スクリーンショット (89).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/53f9c850-2a15-7935-c4f6-48a251f59c3b.png)


・**非同期メッセージ**
送り先のライフラインの実行に同期されないメッセージを表す。
同期メッセージの矢印を以下の矢印に変えて表す。
![スクリーンショット (67).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/7421e457-1b71-e910-8345-b8f7d13f8baf.png)
・**応答**
メッセージを受けたライフラインから送り手への戻り値を表す。
例えばString型変数nameを返り値とするとき以下のように表現する。
![スクリーンショット (90).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/255e684a-a81b-36a6-7e42-07dd64fe730b.png)


・**複合フラグメント**
ref・・・別のシーケンス図を参照する
![スクリーンショット (75).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/6a2851a2-8b1e-7ff0-d6aa-7fa6123a89c5.png)

alt・・・条件分岐を表現する
iが1か2かで処理を分けるときは以下の通りである。
![スクリーンショット (77).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/7b845033-1911-3496-30a1-b527073e2458.png)

loop・・・ループ処理を表現する。
[]内に[ 初期値、終了値 ]を書く。
![スクリーンショット (79).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506451/ba78c1fa-d484-e3a4-0c09-d0ac0b98b5f3.png)
NuxtでstoreをlocalStrageに保存して永続化する方法

Googleで検索すると以下の方法が出てくる。

- 参考: [nuxt.jsを使う時にlocalStorageでstoreを永続化する](https://qiita.com/sakapun/items/a0cf5698751ae70c8088)

```
import createPersistedState from "vuex-persistedstate";

export default ({store, isHMR}) => {
  // In case of HMR, mutation occurs before nuxReady, so previously saved state
  // gets replaced with original state received from server. So, we've to skip HMR.
  // Also nuxtReady event fires for HMR as well, which results multiple registration of
  // vuex-persistedstate plugin
  if (isHMR) return;

  if (process.client) {
    window.onNuxtReady((nuxt) => {
      createPersistedState()(store); // vuex plugins can be connected to store, even after creation
    });
  }
};
```

これだとTSでは、`onNuxtReady`がエラーになる。

```
Property 'onNuxtReady' does not exist on type 'Window & typeof globalThis'.ts(2339)
```
windowにonNuxtReadyないけどどこで定義してる？って感じだと思う。

以下の方法がいいと思いました。
TSでもエラーなく動きました。

- 参考: https://review-me.tech/post/detail/63

```js:~/plugin/localStorage.js
import createPersistedState from 'vuex-persistedstate'

export default ({ store }) => {
  createPersistedState({
    paths: ['authUser'],  // localStorageに保存したいstoreを入れる
  })(store);
};
```

```js:~/nuxt.config.js
plugins: [
    { src: '~plugins/localStorage', ssr: false },
]
```
AHK(AutoHotkey)を実行している最中に「ユーザーアカウント制御」が表示され処理が中断されるのを防ぐ方法

　AHK(AutoHotkey)を実行中「ユーザーアカウント制御」が表示され画面背景が真っ暗になり「はい」or「いいえ」を選択する画面が出て処理が中断され前に進めないことがあります。

そこで　【　ユーザーアカウント制御の回避方法 】をご紹介いたします。

　Win7(32bit)、Win10(64bit)で動作を確認

１．Windowsパソコンで
　　スタート　→　AutoHotkey　→　Convert.ahk to.exe　をクリック
２．コンパイル画面が表示されたら exe化したいスクリプトを選択していきます

　　Source(script file)の[Browse]ボタンを押して　[ xxx.ahk ]　ファイルを選択

　　Destination(.exe file)の[Browse]ボタンを押して　[ xxx.exe ] と入力（同じ名前にしました）

　　Custom Icon(.ico file)は　何もせず [ 空白のまま ] に

　　Base File(.bin)は　[ v.1.1.30.3 Unicode 32-bit ]　を選択
　　＃汎用にするなら32bitを選択している

　　Check ON　→　Use MPRESS(if present) to compress resulting exe　　

　　最後にクリック　→　>Convert<

３．上記で作成された【 xxx.exe 】ファイル（アイコン）を
　　右クリック　→　管理者として実行

　これで xxx.exe が実行中に「ユーザーアカウント制御」は
　表示されず処理が最後まで実行出来ました。

以上
Java Word文書をマージする

この文は以下の2つの方法を使用して、Javaアプリケーションでword文書をマージします。

方法1：  結合された文書は新しいページから開始されます
方法2：前文を受けるWord文書をマージする

DockmentクラスのinsertTextFroomFile()を使用して、異なるドキュメントを同じドキュメントに統合できます。この方法でドキュメントを結合すると、結合されたドキュメントの内容がデフォルトで新しいページから表示されます。

```java

import com.spire.doc.Document;
import com.spire.doc.FileFormat;

public class MergeWordDocument {
    public static void main(String[] args){

        //最初の文書を取得するパス
        String filePath1 = "merge1.docx";

        // 2番目の文書のパスを取得します
        String filePath2 = "merge2.docx";

        //最初の文書を読み込む
        Document document = new Document(filePath1);

        // 2番目のドキュメントの内容を最初のドキュメントに挿入します
        document.insertTextFromFile(filePath2, FileFormat.Docx_2013);

        //文書を保存
        document.saveToFile("Output.docx", FileFormat.Docx_2013);       

    }
}
```
![merge-word-documents-in-java-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/b9388af5-6e30-0736-a862-476a82998a00.png)

新しく追加するドキュメントが、前のドキュメントの最後の段落の終わりに続いて表示される場合は、次の方法で最初のドキュメントの最後のセレクションを取得し、残りの結合されたドキュメントの段落を新たな段落としてセレクションに追加します。

```java

import com.spire.doc.Document;
import com.spire.doc.DocumentObject;
import com.spire.doc.FileFormat;
import com.spire.doc.Section;

public class MergeWordDocument {
    public static void main(String[] args){

        //最初の文書を取得するパス
        String filePath1 = "merge1.docx";
        //2番目の文書のパスを取得します
        String filePath2 = "merge2.docx";

        //最初の文書を読み込む
        Document document1 = new Document(filePath1);
        //2番目の文書を読み込む
        Document document2 = new Document(filePath2);

        //最初の文書の最後のセレクションを取得します
        Section lastSection = document1.getLastSection();

        //2番目のドキュメントの段落を新しい段落として、最初のドキュメントの最後のアクションに追加します
		 for (Section section:(Iterable <Section>)document2.getSections()) {
            for (DocumentObject obj:(Iterable <DocumentObject>)section.getBody().getChildObjects()
                 ) {
                lastSection.getBody().getChildObjects().add(obj.deepClone());
            }
        }


        //文書を保存
        document1.saveToFile("Output.docx", FileFormat.Docx_2013);

    }
}
```
![merge-word-documents-in-java-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/a2d3797c-c9fd-11a2-b5dd-a00733ef5eaa.png)
ofstreamでバイナリ追記モードで出力する時にハマった話

# 概要
ofstreamを使うとき、バイナリモードかつ末尾に追記の詳しい情報がなく、そもそも毎日はプログラミングしないので色々ど忘れしていて、見事にハマったのでメモ。
C/C++, ofstreamの初歩的な所に詰まった話なので、ベテランの方には価値のない情報です。
（※ 記事を書いた当初、初歩的なミスに気付いておらず、コメント頂いてから分かる始末。ご指摘ありがとうございました。）

コード見ればほぼ一発なので、サンプル内コメントを見てください。
ちなみに環境は Visual Studio 2017のVC++(C++)です。

```cpp:main.cpp
#include <fstream>
using namespace std;

int main()
{
    ofstream ofs;
    string path = "./hoge.bin"; // パス区切り「/」「\\」は可、「\」は不可

    //// 暗黙の ios::trunc ？で開いた時に中身が消されちゃう
    // ofs.open(path.c_str(), ios::binary);

    //// ビット演算のORではなく、論理和のORになっている。
    //// 警告レベルを高めにしてもビルドエラーや警告は出ない。
    // ofs.open(path.c_str(), ios::app || ios::binary);
    
    ofs.open(path.c_str(), ios::app | ios::binary);
    if (!ofs) {
        return 1;
    }

    char dat[3] = { 0, 1, 2 };

    // これだけだと、close()するまで（？ 少なくともこれくらいの字数では）ファイルに出力されない。
    ofs.write(dat, 3);

    // バッファの書き込み指令が出る。厳密にはこの命令で書き込むのではなく、遅延書き込みらしい？
    // ofs << flush; でも可。endl は、内部的に行われるので flush 不要。
    ofs.flush();

    ofs.close();
    return 0;
}


// 余談

//// これは機能しない。引数が streampos 型なので ios::end を使うのは間違い。
//// ビルドエラーや警告は出ない。
// ofs.seekp(ios::end)

// 第2引数は ofs.end でも可。
// （内部的にはどちらも、enum _Seekdir 内にある _Seekend が指定されているもよう。）
ofs.seekp(0, ios::end);

```

# まとめ
コンパイラを過信しない。
思い込みはよくない。何かおかしいと思ったら、コーディングから疑うこと。

即時出力したい場合は flush する。
RailsからVueにデータを渡すには

RailsでVue.jsを使うときは、なるべくRailsアプリケーションとVueアプリケーションを独立させて、データはAjax経由だけでやり取りしたい。

とは言っても、Railsのデータ（paramsやインスタンス変数）を直接Vueに渡したい、というケースに出くわすことがあります。そうした場合のノウハウが見当たらないので、まとめてみました。

### 環境

Rails 6.0、Webpacker 4.0、Vue.js 2.6

### 1. URLのクエリーから取る

URLに`/entries?foo=bar`のようなクエリー部があれば、JavaScriptだけで取り出せます。ここでは、[qsライブラリ](https://www.npmjs.com/package/qs)を使います。`/entries?entry[title]=bar` のようなクエリーも処理できます。

```
$ yarn add qs
```

```javascript
import qs from 'qs';
// 中略
let params = qs.parse(location.search.slice(1));
console.log(params.foo); // bar
```

この方法では、`/users/123/entries`からuser_idを取り出す、といった場合が面倒になります。パスのパターンをいちいちJavaScript側に書かないといけません。

### 2. data属性とpropsを使う

追記：いろいろ勘違いしていたことがあったので、2.は修正しました（2019/11/10）。

ここからヒントを得ました：[Passing Props to Vue in a Rails View - Devan Flaherty - Medium](https://medium.com/@devanflaherty/passing-props-to-vue-in-a-rails-view-56e287be9c2d) 。こちらも参照してください： [new Vue(App) と new Vue({ render: h => h(App) }) の違い](https://qiita.com/kazutosato/items/c6ad32cdbb2c47de2ab8)。

Railsのビューではdata属性で渡したいデータを指定します。

```erb:app/views/entries/index.html.erb
<%= content_tag :div, '', id: "entry-list", data: { user_id: @user.try(:id) } %>
```

Vueインスタンスを作る際には、renderを使い、propsにdata属性の情報を渡します（jQueryを使っています）。

```javascript:app/javascript/packs/application.js
import EntryList from '../entry_list.vue';

document.addEventListener('DOMContentLoaded', () => {
  new Vue({
    el: '#entry-list',
    render: h => h(EntryList, { props: $('#entry-list').data() })
  });
```

VueアプリのObjectにpropsを加えておけば、propsの名前を使って取り出せます。

```vue:app/javascript/entry_list.vue
<script>
export default {
  props: ['userId'],
  // 中略
  created() {
    let userId = this.userId;
  }
)
</script>
```

Vueアプリの独立性を気にしないなら、createdかbeforeMountで直接data属性の値を取ることもできます（mounted以降のサイクルではできません）。

```vue:app/javascript/entry_list.vue
<script>
export default {
  // 中略
  created() {
    let userId = $('#entry-list').data('userId');
  }
}
</script>
```

### 3. グローバル変数を使う

グローバル変数を使ったっていいじゃないか。

Railsでこうやって

```ruby:app/controllers/application_controller.rb
  def shared_data
    @shared_data ||= {}
  end
  helper_method :shared_data
```

こうやって

```erb:app/views/shared/_shared_data.html.erb
<script>
var sharedData = <%= shared_data.to_json.html_safe %>;
</script>
```

こうやっておいてから （追記：Turbolinksだと実行されないことがあるので、headではなくbody内に入れる）

```erb:app/views/layouts/application.html.erb
<%= render 'shared/shared_data' %>
```

こうやって

```ruby:app/controllers/entries_controller.rb
  def index
    @user = User.active.find(params[:user_id]) if params[:user_id].present?
    shared_data[:user_id] = @user.try(:id)
  end
```

Vueでこうします。

```vue:app/javascript/entry_list.vue
<script>
export default {
  // 中略
  created() {
    let userId = sharedData.user_id;
  }
}
</script>
```

Vueアプリケーションの独立性が落ちるのが気になるなら、グローバル変数を先ほどのpropsに渡す、という手もあります。

とここまで書いてから、グローバル変数をpropsに渡すのがベストな気がしてきました。
Quillのペーストのテキストスタイルを消す

# Quill
[Quill https://github.com/quilljs/quill](https://github.com/quilljs/quill)
> Quill is a modern WYSIWYG editor built for compatibility and extensibility.

Quillはテキストエディタライブラリです。
拡張性も高いですが、特殊な仕様の理解が必要です。

画像や文字装飾など機能豊富なのですが、シンプルなテキストエディタ+αくらいの機能にとどめたいときコピー＆ペースト時にスタイルが反映されてしまいます。
このテキストスタイルを消す方法をいくつか紹介します。

## Clipboardモジュールのconvertの拡張
https://quilljs.com/docs/modules/#extending

公式で拡張のサンプルとして紹介されている方法です。
このサンプルには問題があり、Safariにおいて`this.container.innerText`が空文字として返ってきます。
`textContent`に変えた場合、Safariでペーストは動くものの改行が反映されなくなります。

## Matcherで対応する方法
```.js
quill.clipboard.addMatcher(Node.ELEMENT_NODE, (node, delta) => {
  let ops = []
  delta.ops.forEach(op => {
    if (op.insert && typeof op.insert === 'string') {
      ops.push({
        insert: op.insert
      })
    }
  })
  delta.ops = ops
  return delta
})
```
この実装で概ね動きます。
ただし、IEやiOS Safariにおいて改行が消える、半角スペースが消えるなど空白文字が一部そのまま適切にペーストされない問題が発生します。


## Clipboardのテキスト取得処理を差し替えてしまう方法
この方法が一番問題がありませんでした。

```.js
const Clipboard = Quill.import('modules/clipboard')
const Delta = Quill.import('delta')
class PlainClipboard extends Clipboard {
  onPaste (e) {
    if (e.defaultPrevented || !this.quill.isEnabled()) return
    let range = this.quill.getSelection()
    const text = e.clipboardData.getData('text')
    let delta = new Delta().retain(range.index)
    let scrollTop = this.quill.scrollingContainer.scrollTop
    this.container.focus()
    this.quill.selection.update(Quill.sources.SILENT)
    setTimeout(() => {
      // ここだけ変更箇所 本来はconvert()
      const pastedDelta = new Delta().insert(text)
      delta = delta.concat(pastedDelta).delete(range.length)
      this.quill.updateContents(delta, Quill.sources.USER)
      // range.length contributes to delta.length()
      this.quill.setSelection(delta.length() - range.length, Quill.sources.SILENT)
      this.quill.scrollingContainer.scrollTop = scrollTop
      this.quill.focus()
    }, 1)
  }
}
Quill.register('modules/clipboard', PlainClipboard, true)
```

```追加分.js
const text = e.clipboardData.getData('text')
...
  const pastedDelta = new Delta().insert(text)
  delta = delta.concat(pastedDelta).delete(range.length)
```
v1.3.7の`onPaste`のテキスト挿入処理を`e.clipboard`のテキストを直接使う形に書き換えます。
Quillではテキストスタイルの反映のためDOMを使った複雑な変換処理をしているため欠損が起きてしまうものと思われます。

この方法の問題点としては、今後のQuillのアップデートで`Clipboard`の設計が変わるのでアップデート時のタイプが必要になります。
なので利用の際はpackage.jsonのquillのバージョン固定を忘れないようにしましょう。
SFTPをシェルで実行

SFTPにID,PASSWORDでログインする場合
対話的なログインにsshpassを使います

例えば日時が最新のnginxのログファイルをSFTPを使ってアップロードする処理

```sftp.sh
#!/usr/bin/sh

SFTP_HOST=hogehoge.domain
SFTP_ID=hogehoge
SFTP_PW=passw0rd

NEW_LOG_FILE=`ls -lt /var/log/nginx/access.log.* |head -n 1 |gawk '{print $9}'`

sshpass -p $SFTP_PW sftp ${SFTP_ID}@${SFTP_HOST} << EOF
put $NEW_LOG_FILE
bye
EOF
```
ログイン後SFTPの処理はEOFの間に記述します。
Azモジュールを使ったAzure Automation Runbookの記述方法

## はじめに
これからAzure AutomationでPowershellスクリプトを作るにあたって、AzureRM系列のモジュールが2020年で更新停止となり、AzureAz系列のモジュールをこれから使ってください。とのアナウンスがあったのでAzを使ってスクリプトを作ろうとしたらサンプルスクリプトは無いわ、モジュールは入ってないわで2019/11現在で一工夫しないと使えない状態だったのでAzで使える方法を確認しました。
もしかしたらすぐグローバルモジュールがRMからAzに切り替わるかも知れないですが、過渡期の手順として残しておきます。
参考文献：
[MS:Azure Automation での Az モジュールのサポート](https://docs.microsoft.com/ja-jp/azure/automation/az-modules)
[MS:最初の PowerShell Workflow Runbook](https://docs.microsoft.com/ja-jp/azure/automation/automation-first-runbook-textual)

## 0. 環境準備
現時点ではAutomation RunbookにはデフォルトでAzのモジュールが入っていないので追加で投入する必要があります。
参考文献に記載の通り、Az.AccountsとAz.Automationは最初に投入が必要なので以下で投入します。　その後、スクリプト作成に必要な各モジュール類(Az.Sql等)を任意で投入します。
※スクリプト本文中でダウンロードしてくる形でスクリプト記載する方は不要と思います。

Automationアカウントリソースメニューから「モジュールギャラリー」を選択すると、モジュールをアカウントに対してインポートできます。
([Powershellギャラリー](https://www.powershellgallery.com)からでもインポートできます。

![27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515252/3620b34a-5ea6-509d-e5bc-1b446e70cfd0.png)

![28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515252/3250d1f6-028b-2888-db24-e5a0f9d0cd0c.png)

![29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/515252/24af9685-8c32-6119-d429-9abf6f92c796.png)

## 1. Azureへの接続文
Automationからリソース管理をする場合は、スクリプト文内でAzureへAutomationアカウントで接続する必要があります。　Azでこの部分を以下のように記載します。
Azモジュールの場合は、「Connect-AzAccount」が接続用のコマンドになります。
また、最後にコンテキストに認証情報をオブジェクトに格納しておき、以降のコマンドにコンテキスト引数として利用します。

``` AutomationConnect.ps1
# Automationアカウントの接続名(既定名の場合)
$connectionName = "AzureRunAsConnection"

# AzureRMContextでセッションが残っているとAzコマンドが使えないため念の為セッション継続を無効にしておく
Disable-AzContextAutosave –Scope Process

$conn = Get-AutomationConnection -Name $connectionName
Connect-AzAccount -ServicePrincipal -Tenant $conn.TenantID `
-ApplicationId $conn.ApplicationID -CertificateThumbprint $conn.CertificateThumbprint

$AzureContext = Select-AzSubscription -SubscriptionId $conn.SubscriptionID

```

※「Disable-AzContextAutosave」はMSのサンプルスクリプトにも記載があったのでオマジナイ代わりではありますが、RM系のモジュールで作ったセッションが残った状態でAz系のモジュールを動かすとエラーが発生(逆の場合でも)する為、要件が無ければ念の為記載した方が良いかと思います。

## 2. 認証情報の差し込み方
1.で作成した認証情報はAzコマンドの引数として以下のように差し込みます。
例はNew-AzSqlServerです。

``` Create_SQLServer.ps1
$server = New-AzSqlServer -ResourceGroupName $resourceGroupName `
   -ServerName $serverName `
   -Location $location `
   -SqlAdministratorCredentials $cred `
   -AzContext $AzureContext
```
一番下に指定してある引数「-AzContext」でコンテキストの認証情報を差し込みます。
面倒ですがコマンド毎引数を指定して差し込む必要があります。
※AzContextのデフォルト値を指定する方法が別途あるのかもしれませんが

### おわりに
Automationのアカウント設定から環境準備まで長かった。。。
これでやっとAutomationで諸々のスクリプトを実装する準備が整いました。
これから暫くSQLServerのリソースリストア用、DBバックアップ、DBリストアなど
非機能要件周りのコマンドを弄っていきたいと思います。
githubのPR（プルリクエスト）のテンプレート機能が便利

githubの大きなメイン機能としてPullRequest（プルリクエスト・PR）があるが、
プルリク作成時のコメント記載箇所にテンプレート導入ができるみたいなのでやってみたら便利だった。

## PullRequestテンプレート導入方法

### TEMPLATEファイル作成

``pull_request_template.md``または``PULL_REQUEST_TEMPLATE.md``

というファイル名でテンプレートを作ります。
内容はこんな感じ

```
# pr review template test

## title

- 改修内容。
- 変更理由

## memo

- その他備考
```

※ファイル拡張子の指定は特にないようだが、マークダウン形式で記載しておくと
PR作成時にpreviewで整形できるので便利かと思います。

### TEMPLATEファイル配置

リポジトリ直下に上記のテンプレートファイルを配置し、コミットする。
すると次回よりプルリク作成時に自動的にテンプレートが展開されます。
プロジェクトなど記載情報の統一化を図りたい場合やナレッジとしてノウハウを残す際にとても便利だなと思いました。

<img width="840" alt="スクリーンショット 2019-11-06 15.34.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/55e66882-5da2-0e24-143e-5d75ebbc6df2.png">

<img width="770" alt="スクリーンショット 2019-11-06 15.45.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/8a643707-8ca6-0c86-15fa-d78cb029a7af.png">
RX63N/RX631のインデックス

# はじめに
GR-CITRUSもしくはGR-SAKURAを通して行ったRX63N/631の備忘録

# 準備
- 統合開発環境 e2studio（インストール，用途：コーディングとビルド）
     - [e2 studio 統合開発環境 ユーザーズマニュアル 入門ガイド](https://www.renesas.com/jp/ja/doc/products/tool/doc/014/r20ut4374jj0100-e2studio.pdf)
     - RX...が入れば大丈夫．

- Renesas Flash Programmer（インストール，用途：書き込み）
- [GR-CITRUS](https://www.renesas.com/jp/ja/products/gadget-renesas/boards/gr-citrus.html)もしくは[GR-SAKURA](https://www.renesas.com/jp/ja/products/gadget-renesas/boards/gr-sakura.html)等の評価ボード（購入）
- [RX63Nグループ、RX631グループ ユーザーズマニュアル](https://www.marutsu.co.jp/contents/shop/marutsu/datasheet/R5F563.pdf)

# インデックス

### プロジェクト設定
- [プロジェクト作成と書き込み](https://qiita.com/shiduku/private/66cdc847a2dd562981f0)
- [プロジェクトファイルについて](https://qiita.com/shiduku/private/85785468034d9f0c469b)

### 端子設定
- [汎用I/Oポート(GPIO)](https://qiita.com/shiduku/private/4866a4e1a13ae5dbbd10)
- [クロック設定](https://qiita.com/shiduku/private/bb352d2b84a08621c7e1)
- タイマー 
    - [Timer割り込み(コンペアマッチタイマー CMT)](https://qiita.com/shiduku/private/d6b012b7ab4e95382aac)
    - [Delay関数(コンペアマッチタイマー CMT)](https://qiita.com/shiduku/private/b393f089a602b76044fe)
    - [PWM](https://qiita.com/shiduku/private/0f31f6be53327855d440)
- [外部割込み](https://qiita.com/shiduku/private/14f2580347bc2b6d6ada)
- シリアル通信
    - [UART](https://qiita.com/shiduku/private/2dcd56418ed5201287da)
    - [UART(RXI割り込み)](https://qiita.com/shiduku/private/fb5dc49ad6a9e6047d78)
    - [I2C（マスター）](https://qiita.com/shiduku/private/4409ef5c6c5772a0ac9d)
- [12bitAD変換](https://qiita.com/shiduku/private/5eb3b8ab2281e5ddcb64)
    

### 実装例

- [futaba rs304](https://qiita.com/shiduku/private/aeefb37ced9c75b5299d)

### その他
- [マイコンとPCのシリアル通信](https://qiita.com/shiduku/private/6f1f2ba5558c4d2816d2)
- [C言語標準ライブラリ関数の使用設定](https://qiita.com/shiduku/private/a9a8bbd3ca0736c2ab40)
RedashでデータソースにElasticsearchを使用した時の問題

RedashのデータソースとしてElasticsearchが使えるようなので、試してみた所、色々と問題がある事が分かった。

# 環境
Redash(v7.0.0)
Elasticsearch(v7.3.2)

# 問題

**Elasticsearchからのクエリ結果を正しく（期待する）表形式にできない。**

RedashからQueryを実行すると、下記のようにQueryRunnerを介してクエリの発行及び、結果表示が行われている。

画面からQuery実行 → QueryRunner → Elasticsearch → QueryRunner → 画面に結果を表形式で表示

**Elasticsearchからのクエリ結果は期待通りになっている事を確認できたので、今回の問題は、Elasticsearchからのクエリ結果をQueryRunnerで表形式にパースできていないとこにある事が分かった。**

### 複数Aggregationのクエリを実行した際の結果
下記のようなAggregationを入れ子にしたクエリを実行。

```
{
    "index": "インデックス名",
    "size": 1000,
    "aggs": {
        "1st": {
            "terms": {
                "field": "LogDate"
            },
            "aggs": {
                "2nd": {
                    "terms": {
                        "field": "SectionName"
                    }
                }
            }
        }
    }
}
```
イメージ的には、日付、部署で集計するので、下記のような結果を期待。

| LogDate | SectionName | 数 |
|:-----------------|:-----------------|:-----------------|
|2019年10月29日|システム部|10|
|2019年10月29日|人事部|20|
|2019年10月29日|総務部|30|
|2019年10月30日|システム部|100|
|2019年10月30日|人事部|200|
|2019年10月30日|総務部|300|

しかし、RedashでTableの結果として表示されるのは、下記のようになる。
→もはや、何で集計されていて、何の数か分からない。

| 2nd | doc_count |
|:-----------------|:-----------------|
|（SectionNameの何かしらの値）|110 |
|（SectionNameの何かしらの値）|220 |
|（SectionNameの何かしらの値）|330 |

### JSONの構造が複雑になるケース
例えば、Sum Bucket Aggregationを使用した場合、Elasticsearchからのクエリ結果は下記のように、バケットのルートと同じ階層に別バケットが存在する。

```
{
   　・
   　・
   　・
   "aggregations": {
      "バケット名": {
         "buckets": [
            {
               バケット結果
            }
         ]
      },
      "SUM BUCKET名": {
          "value": 1000.0
      }
   }
}
```

結果は、"バケット名"の方だけ表形式で表示される
※"バケット名"の方だけ表形式で表示されるが、Aggregationが入れ子の場合には、前述の問題が発生
※"SUM BUCKET名"の方は捨てられる

# 対応方法
これらの問題を解決するには、
　・Redashの既存ソースを修正するか、拡張プログラムを追加して、プログラム対応を行う
　　拡張プログラムの対応は、[「RedashのQueryRunnerを拡張する」](https://qiita.com/J-SHK/items/e270fc797b630a182985)を参考にして頂ければ
　・ISSUEを起票してアップデート待ち（もしくは、自分で動く）

# まとめ
多分、Elasticsearchをデータソースとする場合、Kibanaを選択する事が多いのか、発生した問題の挙動（クエリパターンとして、絶対あたるであろう）からしてほとんど使われてないのかな。

「データソースをElasticsearchにするなら、Redashは使わない」
「Redashを使うなら、データソースをElasticsearchにしない、もしする場合にはシンプルなクエリのみ」

のようにして、実現させた方が効率的だと感じました。

# 余談
データソースにKibanaにしたら結果が変わるかなと思いやってみましたが、Kibana用のクエリの記述で処理されるだけなので、同様の結果になりました。

データソースがKibanaではなく、あくまでクエリがKibana用で記述できるだけの挙動でした。

※こうではないので、注意が必要
　Kibanaを通した結果を得られるわけではない

画面からQuery実行 → QueryRunner → Kibana(Elasticsearch) → QueryRunner → 画面に結果を表形式で表示