OmniAICreator/Qiita-1.07M huggingface dataset:
Rails6 のちょい足しな新機能を試す34（send_data filename オプション編）

# はじめに

Rails 6 に追加されそうな新機能を試す第34段。 今回は、 `send_data filname オプション` 編です。
Rails 6 では、 send_data, send_file の filename オプションを指定した場合、ファイル名を RFC 2231, RFC 5987 に従った形式で送信するようになりました。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。

```shell
$ rails --version
Rails 6.0.0.rc1
```

# rails プロジェクトを作る

```shell
$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1
```

# controller を作る


```shell
$ bin/rails g controller fruits
```

# routes を編集する

今回は、 show だけにします。

```ruby:config/routes.rb
Rails.application.routes.draw do
  resources :fruits, only: :show
end
```

# controller を編集する

`FruitsController` に `show` メソッドを追加します。

show メソッドの中で、 ファイル名を `果物の絵文字.txt` で、ファイルの中身がその果物の英語になるようにして send_data メソッドを呼び出します。

```ruby:app/controllers/fruits_controller.rb
class FruitsController < ApplicationController
  FRUITS = %w[grapes melon watermelon tangerine lemon].freeze
  GRAPES = 0x1f347

  def show
    i = params[:id].to_i
    filename = [GRAPES + i].pack('U*') + '.txt'
    send_data FRUITS[i], filename: filename
  end
end
```

# rails server を実行する

```shell
$ bin/rails s
```

# ブラウザからアクセスする

http://localhost:3000/fruits/0 にアクセスすると`🍇.tx` がダウンロードされます(Chrome 75.0.3770.80 で確認しました)。

# curl コマンドで Content-Disposition を確認する

curl コマンドで Content-Disposition を確認すると RFC 2231, RFC 5987 に従った形式になっていることがわかります。

```shell
$ curl --head http://localhost:3000/fruits/0
...
Content-Disposition: attachment; filename="%3F.txt"; filename*=UTF-8''%F0%9F%8D%87.txt
...
```

# Rails 5 では

ブラウザ(Chrome 75.0.3770.80) で http://localhost:3000/fruits/0 にアクセスしたときは同じ動作ですが、 curl コマンドで Content-Disposition を確認すると違いがあります。

```shell
Content-Disposition: attachment; filename="🍇.txt"
```

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try033_cache_error

# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Encode Content-Disposition filenames on send_data and send_file](https://github.com/rails/rails/pull/33829)
* [RFC 2231](https://tools.ietf.org/html/rfc2231)
* [RFC 5987](https://tools.ietf.org/html/rfc5987)
[BluePrism]日付として入ってきた文字列が、カレンダーに存在する正しい日付かどうかを判定する部品を作りました。

#作ったもの

有効な日付かどうかを判定するものをつくりました。
計算ステージでIsDate関数を使ったら、区切り文字がないものが入ってきたときに判定してもらえなかったので。

- 年は2文字もしくは4文字
- 区切り文字がある場合は月と日は1文字でもオッケー
- 区切り文字は無しもしくは「/」「-」「.」のいずれか

上記条件を満たすときのみカレンダーに存在する日付かどうかを見ます。
それ以外のフォーマットは全部日付じゃないとします。（なので2019.1とか6/12とかはダメです）
yyyyMMdd　yyyy/MM/dd　yyyy-MM-dd　yyyy.MM.dd
yyMMdd　yy/MM/dd　yy-MM-dd　yy.MM.dd

#作りかた
コードステージに以下のように書きます。

入力：InDate(型はText)　半角でお願いします
出力：IsDate(型はFlag)

```c#
DateTime tmp;

if (System.Text.RegularExpressions.Regex.IsMatch(InDate,
    @"^(?<year>[0-9]{4}|[0-9]{2})(?<datesep>\/|-|\.|)" + 
    @"(?<month>0?[1-9]|1[012])\k<datesep>" + 
    @"(?<day>0?[1-9]|[12][0-9]|3[01])$"))
{
	if (InDate.IndexOf("/") < 0 && InDate.IndexOf("-") < 0 && InDate.IndexOf(".") < 0)
	{
		if(InDate.Length == 8)
		InDate = InDate.Substring( 0, 4 ) + "/" + InDate.Substring( 4, 2 ) + "/" + InDate.Substring( 6, 2 );
		else if(InDate.Length == 6)
		InDate = InDate.Substring( 0, 2 ) + "/" + InDate.Substring( 2, 2 ) + "/" + InDate.Substring( 4, 2 );
	}
	IsDate = DateTime.TryParse(InDate, out tmp);
}
else
{
	IsDate = false;
}


```


#終わりです

c#とか読んだことも書いたこともなく……
とりあえず見よう見まねで書いて、動いたからたぶんこれで合ってるのかなーというレベルです。
違うところとかがあったら教えてください。ありがとうございます。
VSCodeのSettings Sync拡張機能でOS毎に設定を切り替えた話

## 複数のOSでVSCodeを使うならSettings Sync拡張機能を使うべき！

仕事柄 ホストOSのWindows上のHyper-Vで、ゲストOSのUbuntuを動かす、みたいな開発環境でいろいろやっています。
ホストOS/ゲストOSともにVSCodeを愛用していて、設定については[Settings Sync](https://github.com/shanalikhan/code-settings-sync)を使って同期しているのですが、「Linuxではこの設定を使いたいけど、Windowsでは使いたくないんだよなぁ」ってことが結構あって悩んでいました。

[VSCodeのissues](https://github.com/microsoft/vscode/issues/5595)にも同じような悩みを持つ人が挙げたissueがありますが、2019/06/12時点でまだ公式な対応方法はないようです。


こんな悩みを抱えていたある日、なんとなくSettings SyncのWikiを読んでいると…

https://github.com/shanalikhan/code-settings-sync/wiki/Sync-Pragmas

上のページを見つけました。どれどれ…。

Settings Sync supports per-os and per-host inline settings and keybindings by using Sync Pragmas.
> Settings Syncは、Sync Pragmas機能を使用してOS毎およびホスト毎の設定とキーバインドをサポートします。

悩みを解決する方法はこれだー！！


## Sync Pragmas機能のざっくりとした使い方

詳細は[Wiki](https://github.com/shanalikhan/code-settings-sync/wiki/Sync-Pragmas)を見ていただくとして、ざっくりとは以下のような感じです。

```json:settings.json
{
    // @sync os=linux
    "window.zoomLevel": "1" // ...(1)
}
```

(1)の設定をLinuxでのみ適用したい場合、1行上に`// @sync os=linux`というキーワードを挿入します。
すると、Settings Syncの`Sync : 設定をダウンロード`機能を使用したときに、

 - Windows OS/Mac OSの場合は(1)を自動的にコメントアウトしてダウンロードする
   (＝設定が無効となる)

```json:settings.json
{
    // @sync os=linux
  //    "window.zoomLevel": "1" // ...(1)
}
```

 - Linux OSの場合は何もしない
   (＝設定が有効となる)

```json:settings.json
{
    // @sync os=linux
    "window.zoomLevel": "1" // ...(1)
}
```

という動作を自動処理してくれます。

> 補足
> 先ほどの`// @sync ...`キーワードを挿入して`Sync : 設定をアップロード`機能を使用した後、すぐに`Sync : 設定をダウンロード`機能を使用しても(自分のWindows環境では)自動処理は実行されませんでした。たぶん既に最新の設定を持っている場合は自動処理が実行されないのだと思います。
> その場合は、`Sync : 拡張機能の設定をリセット`機能を使用して初期化してからやるとうまくいきます。(トークン等の情報を控えておくようにしてくださいね)


キーバインドについては、[v3.3.0から対応する](https://github.com/shanalikhan/code-settings-sync/wiki/Sync-Pragmas#keybindings-keybindingsjson)みたいなのでもう少し待ちましょう。


これでVSCodeがより使いやすくなりそうです！
16進数形式の文字列をBASE64形式にして2/3に圧縮する

# 16進数形式の文字列について
`ハッシュ値`を生成したり`uniqid`などでユニークな文字列を生成した際、`16進数形式`で文字列が生成されます。例えば、

* 画像アップロードされた場合に`1d5c1b66fefdec9ed1fb54af60dc27d957e60ca6.jpg`といったランダムな文字列を生成してファイル名が重複しないように制御
* メール認証のために `https://~~.jp/auth?key=16115b7e66a2068c1eb24f75d6ab826f8e658be4`といったURLを生成

などというときに使ったりすると思います。

# もう少し文字列を圧縮しませんか？

このままでも問題ありませんが、`16進数`から`BASE64`に変換すれば、**安全に使用可能な文字種の範囲内**で文字数を圧縮できます。
文字数が短くなればDB等の容量削減や、URL等が短くなることによる通信量削減になります。
また、一部のメーラーでメール本文内のURLが折り返されて切れてしまう可能性も少しだけ減らせます。

| 16進数 | BASE64 |
| ------ | ------ |
| **3バイト (16777216通り)**の情報を**6文字** ($16^6 = 16777216$)で表せる | **3バイト**の情報を**4文字** ($64^4=16777216$)で表せる | 

したがって、`16進数`と比べて`BASE64`だと文字数を$\frac{2}{3}$に圧縮できます。

# PHPでの具体的な手順

具体的には、`16進数` → `バイナリ文字列` → `BASE64` という二段階で変換をかけていきます。
また、BASE64の文字列の中で`+`, `/`, `=`はシステムとの相性が悪いケースが多いので、より安全な記号に変換します。

```php
// BASE64に変換する
$str = '変換前16進数文字列';
$str = strtr(base64_encode(pack('H*', $str)), ['+' => '-', '/' => '_', '=' => '']);

// 16進数に戻す
$str = bin2hex(base64_decode(strtr($str, ['-' => '+', '_' => '/'])));

// ※PHP5.4未満の場合は [~~] を array(~~) に置き換えてください。
```

# 結果

`c42ffbaacf25ba233cbf731d33001ed341eb6a31` → `xC_7qs8luiM8v3MdMwAe00HrajE`
40文字から27文字に減りました。

# 注意点
変換対象の文字列が**奇数文字数**だと、16進数に戻したときに末尾に**余分な0**が追加されてしまいます。
文字数が奇数になる可能性がある、かつ、16進数に戻せるようにする必要がある場合は、強引ですが以下のようにして回避します。

```php
// 奇数の場合は「~」の文字を足し、戻すときに~の文字がついていれば末尾の0を取り除く
// ※「~」の文字列が許容されている前提

// BASE64に変換する
$str = (strlen($str) % 2 ? '~' : '') . strtr(base64_encode(pack('H*', $str)), ['+' => '-', '/' => '_', '=' => '']);
// 16進数に変換する
$str = substr(bin2hex(base64_decode(strtr($str, ['-' => '+', '_' => '/', '~' => '']))), 0, strpos($str, '~') === 0 ? -1 : strlen($str));
```
Rocket徒然メモ

RISC-Vのオープンソース実装であるRocket-coreに関するメモ。

Githubはこちらhttps://github.com/freechipsproject/rocket-chip

## Version管理 
- どこでVersionが定義されているのか？
    - rocket-chip/build.sbt の version変数
    - ただGithubのレポはTagがキチンとうってなくて困る
- どのCommitを使えばよいのか？
    - 安定した所という意味では、SiFiveのFreedomが見ている所が良いかも
        - 4146f6a, Nov 26, 2017
        - 7e75d6,  Nov 2, 2017
        - 47d63d, Feb 25, 2018, version=1.2
        - 8c6e745, Mar 1, 2018, version=1.2
        - 4ba8acb, Mar 22, 2018
        - 25b5a2, Aug 25, 2018 
        - b21c78, Oct 15, 2018
    - 結構頻繁にかわってた



## Privilege  

- Privilegeの実装は？
    - rocket-chip/src/main/scala/tile/BaseTile.scala あたり？
- Privilegeの設定は？
    - RocketCoreParamsのuseVMやuseUserを設定、useVMをTrueにすれば、useUserもTrueになるっぽい
    - 設定例
        - https://github.com/google/bottlerocket/blob/master/src/main/scala/bottlerocket/Params.scala
- Privilegeの設定とコアサイズの関係は？
    - TBD

## Physical Memory Protection (PMP) 

RISC-Vのセキュリティ機能の一つ。

- PMPの実装は？
    - https://github.com/freechipsproject/rocket-chip/blob/master/src/main/scala/rocket/PMP.scala 

- PMPのエントリ数はどこで設定しているのか？ 
    - src/main/scala/rocket/RocketCore.scala
    - https://github.com/freechipsproject/rocket-chip/blob/master/src/main/scala/rocket/RocketCore.scala
    - nPMPs: Int = 8, ということで普通は８
- PMPの最大数は？ 
    - https://github.com/freechipsproject/rocket-chip/blob/2a01eb85e2b3fbae9787523a92875baa9d9bdc8a/src/main/scala/rocket/CSR.scala
    - maxPMPsは16
- PMPのエントリ数とコアサイズの関係は？
    - TBD

EOF
【Looking Glass】HoloPlay SDK 1.0.0が使えない

**【重要】2019/06/12の時点でまだ未解決です。**

#はじめに

手元にLookingGlassが2台あるのに、片方のLookingGlassでHoloPlay SDK 1.0.0が動かないため同時2台使用が出来ない状況です。
まだ検証環境が少ない＆未解決ですが、何かしらの参考になればと書きました。

でもLookingGlassを複数台使うアプリを作ると、ただでさえ少ない実行環境がさらに少なくなるんですよねぇ…

#検証

2台あるLookingGlassは、1台は2018年12月に届いたおそらく初期ロット（シリアル700番台）、もう1台は2019年2月に届いたシリアル2000番台のものです。以降、前者をLKG A、後者をLKG Bとします。

**なお LKG B は以下の全ての検証環境で問題なく動いています**

###検証環境1：デスクトップPC（Ryzen7 2700+GTX2070）

|                  |LKG A| LKG B|
|:-----------------|:------------------:|:------------------:|
| HoloPlay SDK 0.1.4|○|○|
| HoloPlay SDK 1.0.0|×|○|
| ディスプレイ名|汎用非PnPモニタ|LKG021JueKDNG|
| 接続：HDMI|○|○|
| 接続：DP（AMC-DPHD20）|○|○|

LKG Aを接続してHoloPlay SDK1.0.0を使うと
![D8DYoKrUIAEZl7Q.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227733/656ecb33-26cd-12fe-80df-d04df2736622.png)
となります…

###検証環境2：Surface Book2 15'（i7-8650U+IGP+GTX1060[Optimus]）

|                  |LKG A| LKG B|
|:-----------------|:------------------:|:------------------:|
| HoloPlay SDK 0.1.4|○|○|
| HoloPlay SDK 1.0.0|○|○|
| ディスプレイ名|LKG01□・□□i□□|LKG021JueKDNG|
| 接続：<br>Type-C(AD-ALCHVDVDP)|○|○|
| 接続：<br>Type-C(HFM-00006)|×|○|

Surface Book2 は外部モニタ出力がType-CしかないのでLookingGlassを同時に2台繋げることが出来ませんが、1台ずつなら LKG A も LKG B もSDK1.0.0を使うことができます。

ただ LKG A を AD-ALCHVDVDP を使ってSurface Book2に繋げた場合、認識はしますがディスプレイ名が文字化けします。

![LKG_A_ディスプレイ名.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227733/73d57e00-7f35-94d5-f725-a15375d6ae72.jpeg)

HFM-00006 の場合はそもそもモニタとして認識すらされません。

#いまのところ

環境次第で LKG A でもSDK 1.0.0 が使えるため不良ではなく相性という整理になると思いますが、個人的にはLookingGlassのモニタ識別のファームウェアあたりがちょっと怪しく感じます（モニタ名が正常に取得出来ない→HoloPlay.dllでエラーなんじゃないかと思ったり）

まぁ2台のLookingGlassともSDK 0.1.4 は問題なく使えるので、いよいよとなればSDK 1.0.0 に 0.1.4のような手動環境設定を追加するすれば解決なのかも。
UITableViewでカスタムHeaderを使う方法

# サンプルコード

- このコードでは、以下のサイトで紹介されているUITableViewのextentionを使っています。
  - [Storyboardを使ってUITableViewを組み立てる場合のテンプレート(Swift3)](http://xyk.hatenablog.com/entry/2017/01/15/202620)
- xib, storyboardは省略しています。

```SectionHeaderView.swift
import UIKit

final class SectionHeaderView: UITableViewHeaderFooterView {

    static let height: CGFloat = 44

    @IBOutlet weak var titleLabel: UILabel!

    func setup(titleText: String) {
        titleLabel.text = titleText
    }
}
```

```SampleViewController.swift

final class SampleViewController: UIViewController {

    @IBOutlet private weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
    }

    private func setupTableView() {
        tableView.separatorStyle = .none
        tableView.delegate = self
        tableView.dataSource = self

        tableView.register(headerFooterViewClass: SectionHeaderView.self)
    }
}

extension SampleViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let header = tableView.dequeueReusableHeaderFooterView(withClass: SectionHeaderView.self)
        header.setup(titleText: "Section title")
        return header
    }
    
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return SectionHeaderView.height
    }
    
    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return CGFloat.leastNormalMagnitude
    }
...
```

# 注意点

## UITableViewのStyleを「Grouped」にすること。

デフォルトの「Plain」だとスクロールしてもHeaderが残ってしまうので、「Grouped」を指定します。

<img width="390" alt="スクリーンショット 2019-06-12 11.59.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9875/5f046ac9-e0fd-9b51-a091-9b3d9c9db69f.png">


## heightForHeaderInSection, heightForFooterInSection を指定すること

参考: [iOS11で Grouped UITableView のセクションヘッダーに余分な高さが出る問題について](https://qiita.com/masashi-sutou/items/405adf126d0d2c4f0b4e)
DockerをWindows 『Home』で動かす方法

Dockerはもともとlinux環境で動くことを想定しており、windows向きではないので、
「docker toolbox」というdockerをインストールするために必要な諸々を一気にインストールするためのツールが用意されています。

ここでインストールされる諸々の中にはvartual boxも入っており、仮想化した上にdockerを立ち上げるようです。

「仮想化が必要」なのですが、Windows 『Home』エディション*ではデフォルトで仮想化が有効になっていません。

*windowsと言ってもエディションがあり、大抵の家庭用パソコンはHomeだと思います。他にはPro, Enterpriseなどがあります
自分のPCがどのエディションかわからない人は「windows エディション　調べかた」などでググってください。

ですので、まずは「仮想化を有効」にすることから始めます。


#仮想を有効にする
Pro, EnterpriseなどのエディションではHiper-Vという機能があり、コントロールパネルから、有効にできるようですが、Homeエディションではそれができません。

Homeエディションで仮想化を有効にする方法は、
「PC起動時にF1を押して立ち上げるあの黒くて怖そうな画面」
から設定します。
**Biosセットアップ画面**というらしいのですが、これの開き方、また、仮想化有効の仕方はwindowsPCのメーカーによって違いますので、「（PCのメーカー名） bios　仮想化」などでググって見てください。

ちなみに、「thinkPad bios　仮想化」のやり方は,[このURL](https://support.lenovo.com/jp/ja/solutions/ht500006)にピンポイントでありましたのでThinkPadをお使いの方は参考にしてください。

#Dockerインストール
仮想化を有効にしたら、あとはDocker Toolboxをインストールするだけです。
[Docdekr toolboxのインストールページ](https://docs.docker.com/toolbox/overview/)から、インストールしてください。

リンク先に行ったら「Get Docker Toolbox for Windows」をクリックしてインストールスタート
<img width="946" alt="スクリーンショット 2019-06-12 11.59.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/cfcfead7-8810-f228-ba27-675de3abd42c.png">

Desktopに以下のアイコンが出てくると思うので、

![IMG_1202.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/64ab2430-e93e-0fed-96a8-6dd5f45dd0a9.jpeg)

指示に従いNextを押していってください。（基本的にデフォルト設定のままでOKですのでどんどんnextを押していきましょう）

そうしたら、Desktopに、以下の3つのアイコンが出てくると思います。

<img width="506" alt="スクリーンショット 2019-06-12 12.08.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/7259668f-8df0-c8ce-a31c-16fca0fb0db0.png">

この中の「Docker Quick Start Terminal」を押すと、setupが始まり、

おなじみのクジラのマークが出てくれば終了です！

<img width="998" alt="スクリーンショット 2019-06-12 12.10.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388525/25855186-d8df-c7d9-98fd-6ec29309d8c6.png">
エラー：fatal: Not a git repository (or any of the parent directories): .git　対処方法

git cloneした後、git branchを確認しているところに、下記のエラーが出た！！
原因は初期セットアップの不備です！

```
エラー：fatal: Not a git repository (or any of the parent directories): .git
```
エラー解消のために、

まず、ユーザーの登録。

```
$ git config --global user.name "xxxx"
$ git config --global user.email "xxxxxx@gmail.com"
```
そして、gitの初期化。

```
$ git init
Initialized empty Git repository in 作業ディレクトリ/.git/
```
上記のように表示できたら、git branchで確認してみる。

```
$ git branch
* master
```

無事に出た〜


[GitHub 初心者による GitHub 入門（１）〜 git のインストールとセットアップ・リポジトリの作成・ clone 〜](https://qiita.com/megu_ma/items/e459e62821bdd6dbaccb)　を　参考した！
Interface BuilderでSafe Areaを考慮したバーのレイアウトを設定する手順

# 概要

iOSアプリ開発において、画面上部のナビゲーションバーや、画面下部のタブバー、ツールバーなどを配置する際に、標準のコンポーネントを使わずにカスタムビューを使う事があります。その際に、Interface Builderを使用して、Safe Areaを考慮したレイアウトを設定する事があります。この記事では、その設定をする操作の手順を解説します。

# 目標

画面上部のバーをレイアウトします。標準コンポーネントと似た見た目にするため、バーの主たる部分の高さを44ptにしつつ、バーの領域自体は端末の画面上端まで伸長させます。Auto Layoutの制約構成としては、Top, Left, Rightを親Viewのエッジに密着させ、BottomをSafe Areaの上端から44ptの距離に設定することになります。

# 手順

まず、バーになるViewを追加します。その際、下図のように、親ビューの左上隅に密着するように配置します。

<img width="645" alt="ss1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20130/58b9882c-ff87-0c03-4540-357b130f74ba.png">

次に、全方向のエッジの制約を設定します。Top, Left, Rightについては、「親ビューに対して0」を設定します。Bottomについては、とりあえずそのまま設定します。

<img width="376" alt="ss2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20130/d7e7e68f-5dc4-a500-8bf3-93dcf78e45fc.png">

すると、下図のように制約が設定されます。Bottomに関してはSafe AreaのBottomとの制約になっているはずです。

<img width="421" alt="ss3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20130/2976e4b8-515d-0fc2-15e5-f799ce8245c4.png">

この、Bottomの制約をダブルクリックして編集に入ります。

まず、下図のように、`Safe Area.Bottom`との制約になっている部分を、`Safe Area.Top`との制約に変更します。

<img width="417" alt="ss4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20130/9b99ec38-77cc-16ea-3ff4-75567df00d28.png">

すると、実際の配置と制約が一致しなくなり、エラー表示になります。そこで下図のように、Constantを`Use Canvas Value`に設定します。

<img width="426" alt="ss6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20130/b4581628-7670-dd23-c957-e9dee67e22b8.png">

すると、下図のようにエラーが解消され、Constantは負の値になります。

<img width="419" alt="ss7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20130/dab5817b-dcc3-37fd-eee1-16e26ec3302d.png">

負の値だとわかりにくいので、下図のように`Reverse First And Second Item`を選択して、制約関係を反転させます。

<img width="463" alt="ss8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20130/537a6541-c77c-b3b7-f2be-43c9a98390d1.png">

これで、バーの高さがConstantに設定された制約になります。

<img width="466" alt="ss9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20130/96c0e282-e1a8-6841-706f-36f9324c766b.png">

最後に、高さを44に設定します。

<img width="458" alt="ss10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20130/73f4d6a5-830c-5128-45af-a75896393046.png">

これで望んだレイアウトができました。
PHP(Laravel)からAkamaiのFastPurgeAPI v3を叩く

https://developer.akamai.com/blog/2018/11/16/akamai-content-control-utility-ccu-api-end-life-notice

AkamaiのAPIのv1~v2のEOLが、2019年6月30日とのことで、これまでv2を利用していましたが、v3以降に移行する必要が出てきました。

v2のときは、APIの認証がcurlのヘッダにBasic認証情報を入れるだけで簡単に叩けるようになっていたのですが、v3（OPEN API)を使うためには、管理画面からAPIクライアントを登録して、認証情報を発行しなければいけません。

今回の記事では、Akamai Fast Purge API v3 をPHP（Laravel）から叩くようにするところまで記述したいと思います。

## 事前準備
まずはcredential情報をAkamaiの管理画面から発行しましょう。
https://developer.akamai.com/api/getting-started
こちらの公式ドキュメントの指示にしたがって、作業を行えば大丈夫です。

発行したcredential情報をコピーして、下記のような`.edgerc`というファイルを作ったら、とりあえず準備は完了です。

```　.edgerc
[default]
client_secret = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
host = xxxxx.luna.akamaiapis.net/
access_token = xxxxx
client_token = xxxxx
```

## composerで必要なライブラリをインストール
```
$ composer require akamai-open/edgegrid-client
```

## `public/`に `.edgerc`を配置する
https://github.com/akamai/AkamaiOPEN-edgegrid-php-client
こちらによると、`.edgerc`はWebサーバのホームディレクトリか、カレントワーキングディレクトリに置いてねとのことなので、
Laravelのプロジェクトだと`public/`に置くのが良いかと思います。

## PHP側の処理

```php
use \Akamai\Open\EdgeGrid\Client as AkamaiApiClient;


    // キャッシュクリアしたいURLを配列で列挙
    $objects = [
        'http://example.com/hoge.png',
        'https://example.com/hogehoge.jpg'
    ];

    // APIクライアント呼び出し, createFromEdgeRcFileの引数に何も与えなければ.edgercの[default]の認証情報がセットされます。
    $client = AkamaiApiClient::createFromEdgeRcFile();

    // Fast Purge v3 API 呼び出し、キャッシュクリア
    $response = $client->request('POST', '/ccu/v3/delete/url', [
        'body' => json_encode(['objects' => $objects,]),
        'headers' => ['Content-Type' => 'application/json',],
        'proxy' =>  'http://example-proxy.jp:8080', // プロキシの設定が必要な場合のみこちらを記述
    ]);

    echo $response->getStatusCode();
```

objectにURLを詰め込みます。
headersには、`'Content-Type' => 'application/json'`を指定
proxyは設定の必要がなければ削除してしまって構いません。
`getStatusCode()`で`201`が帰ってきていたら成功です。
以上になります。

## 参考にしたページなど
これ以外にも実装方法は複数ありますので、
別の実装を検討される方は公式のサンプルやドキュメントを参照されるのが良いかと思われます。
https://github.com/akamai/api-kickstart/blob/master/examples/php/ccu_v3.php
https://developer.akamai.com/api/core_features/fast_purge/v3.html#cd1e7257
Action mailerでlink_toを使うときのRSpec設定

# Action mailerでlink_toを使う時にやったこと

Action mailerのテンプレートでlink_toを使う時にハマったことメモです。

## mailerのテンプレートファイルでlink_toを記述

```send_message_to_user.slim
h1 お知らせ
  p = link_to event.event_title, event_url(event)

```

## Helperの読み込み

mailerのテンプレートではlink_toをそのまま使うことができないので、mailerでhelperを読み込む。

```testmailer.rb
class TestMailer < ApplicationMailer
  add_template_helper(ActionView::Helpers::UrlHelper)

  default from: 'test@test.com'

  def send_message_to_user
    #省略
  end
end
```

参考：https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html

## development.rbの設定

#### しかし、このままだとこんなエラーが...

```
ActionView::Template::Error:
       Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
```


怒られている通り、development.rbにhost情報を設定しなくてはならない
参考：https://qiita.com/saicologic/items/1c692b42ba203bf2d406

```development.rb
config.action_mailer.default_url_options = { host: 'localhost:3000' }
```

今度はうまくいきました！

## RSpecでハマる

調子に乗って簡単なRSpecを動かしてみると...

```test_mailer_spec.rb
require "rails_helper"

RSpec.describe TestMailer, type: :mailer do
  describe "メール送信機能" do
    let(:user) { FactoryBot.create(:user) }
    let(:mail) { TestMailer.send_message_to_user(user) }

    it "正しいメールアドレスから送信すること" do
      expect(mail.from).to eq ["test@test.com"]
    end
  end
end
```

先ほど乗り越えたはずのエラーが！


```
ActionView::Template::Error:
   Missing host to link to! Please provide the :host parameter, set　default_url_options[:host], or set :only_path to true
```

確かに記述したはずなのに動かない...としばらくハマってしまいました。

## テスト環境でも同様の設定をする必要があった

理由は簡単で、開発環境用のdevelopment.rbだけでなくテスト環境でもhostを指定しなければなりませんでした。

```rails_helper.rb
config.action_mailer.default_url_options = { host: 'localhost:3000' }
```

これで通るようになりました！
テストを書く時には環境ごとの差異に注意しなくてはなりませんね...
【環境構築】HoloLens + Dynamics365 Guides 

de:code2019 でDynamics365 Guidesというアプリのことをいろいろ聞いたので、自分でも試したくなって環境を作りました。  

### Dynamics365 Guidesとは
[Dynamics365 Guides](https://www.youtube.com/watch?v=V8c3pDKdHEc)は動画を見てもらうのが一番理解してもらえると思いますが、一言でいえばMR用のマニュアル・3Dの作業手順書です。 
リンクの動画はHoloLens2を使って作られてますが、今のHoloLens(便宜的にHoloLens1としておきます)でもできるので触ってみようと思います。HoloLens2はより直感的に操作できますが、HoloLens1は2ほど操作性が良くないのでエアタップ駆使して作っていきます。  

### とりあえず環境構築  
といっても公式のドキュメントがめちゃくちゃ詳しく丁寧に書いてあるのでそれ通りにやっただけですね。
ポイントとしてはPowerApps Plan2に登録(Guides使う分には無料で行けそう)したのと、common Data Service作ったくらいですかね。詰まるポイントはなかった代わりに、アプリの移動が多くてあっちこっち行き来してました。あとちょいちょい待ち時間が発生するので1時間くらいは最低でも見ておいたほうが良いです。  
[Dynamisc365 Guides Setupはこちら](https://docs.microsoft.com/en-us/dynamics365/mixed-reality/guides/setup)  

Dynamics365(D365)の環境って会社にはあるんですが、プロジェクトとしては携わったことがないので初めて触りました。
ちなみに今回は会社の環境ではなく、個人の環境としてD365の環境を作りました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/5fab318c-6aca-cecd-bde3-36ba2987f99d.png)

無事にインストールが完了しました。Office365(O365)もそうですが、管理画面を触る機会がないので結構ドキドキしました。変に課金されても嫌ですしね。
ちなみに、D365はビジネス用のサービスになるので登録にはビジネス用のメールアドレスが必要です。私の場合は個人でO365 businessを契約していて、ビジネス用として認識されるメールアドレスがあるのでそれを使いました。  
### いざ起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/288cfb30-4f06-474a-5e16-bc19ea017802.png)
HoloLens側もアプリを問題なくインストールできて起動できました。  サインインしたらこんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/c6d0e43a-69fe-e0c7-a528-e2fbf6297a6b.png)
PCのほうもMicrosoftストアからDynamisc365 Guidesのアプリを入れればよいので簡単です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/283609bb-350d-98a6-0453-feeccd2c3c79.png)
Guidesはマーカーを使って初期の位置を検出するか、デジタルアンカーを使って初期の位置を決めるかの2パターンあります。  
で、今回はマーカーを印刷して使おうと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/ba0be5b5-31ea-3da5-20e0-ae1f102c070d.png)
ただ、規約があるらしく、サイズが結構でかい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/4ccad7fc-b239-2163-b216-01b318f8b74c.png)
実際に印刷したらこんな感じでした。うん、でかいなｗ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261327/12962910-06da-91b7-0926-cf721eaca355.png)

家のプリンターに貼ったらこんな感じになった。とりあえず準備は出来たので、次回はインクを変えるというシナリオを試しに作ってみようと思います。別にインクの入れ替えでなくてもいいんだけど他にハードと組み合わせられるものが周りになかった。

ひとまず今回はここまで
自分のためのjQuery学習コース1メモ

jQueryのProgate学習コース1をメモ。

##jQueryの書き方
基本はJavaScriptなので、jsファイルに記述する。

```js:基本の書き方.js
// 基本の書き方
$('セレクタ').メソッド名(引数);

// 例：
$('h1').hide();
```
`$('セレクタ')` の部分をjQueryオブジェクト、`.メソッド名(引数)` をメソッドという。

### 主なメソッド1
`.hide` 要素を隠す
`.show` 要素を現す（CSSでdisplay: none;と指定したものなど）
`.fadeOut` フェードアウトして隠す
`.fadeIn` フェードイン
`.slideUp` 下のほうから消えていく
`.slideDown` 上のほうから現れる


### セレクタの指定方法
HTML内に記述した要素をセレクタにする。CSSと基本的に一緒と思えばOK。

- HTMLタグ
    - タグ名をそのまま指定（例：`$('h1')`）
- class
    - クラス名にドットをつけて指定（例：`$('.class')`）
    - ページ内で複数設定できる
- id
    - id名に#をつけて指定（例：`$('#id')`）
    - ページ内で重複させないので、jQueryの処理早くなるので推奨

## イベントを使う
発動するタイミングをコントロールする方法。

```js:イベントの書き方.js
$('セレクタ').イベント名(function(){
  // 実行する処理
});

// クリックしたらそのセレクタ部分を隠す
$('#button1').click(function(){
  $(this).hide();
});

// クリックしたら別のセレクタ部分を隠す
$('#button2').click(function(){
  $('#text').hide();
});
```

### 主なメソッド2
`.css('プロパティ','値')` CSSを変更する
`.text('文字列')` セレクタ内を文字列で置き換える
`.html('HTMLソース')` セレクタ内をHTMLで置き換える

### thisの使い方
```html:ソース.html
<ul>
  <li>リスト1</li>
  <li>リスト2</li>
  <li>リスト3</li>
</ul>
```
```js:ソース.js
$('li').click(function(){
  $(this).css('color','red');
});
```
thisはそのイベントが発生した要素を取得できる。上記のように書くと、クリックしたリストの行だけが赤くなる。

## 省略・高速化
変数やメソッドチェーンを利用することで、コードの省略ができる。また処理速度の高速化にもつながる。

### 変数
```js:script.js
const $div = $('div');
// と宣言することで、
$div.hide();
// のようにjQueryオブジェクトを変数化することができる。
```
変数の宣言は、主に`const`を使用する。constは再代入できないので、後から変更する必要がある場合は`let`を使う。`var`もあるが現在は多くの場合、推奨されていない。

参考：
[JavaScript var/let/constによる変数宣言 - Qiita](https://qiita.com/wannabe/items/b2a0d63fc786eab13c48)
[var/let/constの使い分けのメモ - Qiita](https://qiita.com/masarufuruya/items/096e51c3e4c36c86ae27)
など

### メソッドチェーン
```js:script.js
$('#method').css('color','red').text('テキスト');
```
のように `.` ドットでつなげることで、ひとつのjQueryオブジェクトに複数のメソッドが使える。

### findメソッド
```js:script.js
$('#method').find('a').css('color','red');
```
で、`#method` のすべての配下のうち `a` セレクタを持つ要素を取得できる。

### childrenメソッド
```js:script.js
$('#method').children('a').css('color','red');
```
で、`#method` のひとつ下の階層から `a` セレクタを持つ要素を取得できる。

### hoverイベント
```js:script.js
$('div').hover(
  function(){
  // マウスポインターをのせたときの処理
  },
  function(){
  // マウスポインターを外したときの処理
  }
);
```
引数となる関数は2つ。
認証トークンをWeb Storageに保存して良いか？

## はじめに


XSSへの対策を考えたとき、認証トークン(JWTを想定)をどこに保存すべきかの検討メモです。
なおXSS攻撃の場面は以下を想定しています。

```
攻撃者が仕掛けた任意のスクリプトが、他の第３者のブラウザで実行されその人の認証情報が奪われるケース。
```

なお私は元々、こう思ってました

- Cookie??ダサくね?よくわからんけど危なくない？
- Web Storageって最近の仕様なんでしょ？同一オリジンポリシーあるし大丈夫でしょ

ですが、そうでもないことが分かり、自戒を込めてメモを残す次第です。

## 結論

先に結論を示します。
以下の順でXSS攻撃に対してセキュアと結論づけました。
ただし、あくまでXSS攻撃に対するセキュア度を述べただけで、必ず1.を採用すべきという訳ではないと思っています。

1. HttpOnly, Secure属性をつけたcookieに保持する(場合によってdomain, path属性もつける)
2. in-memoryで保持する
3. Web Storageに保持する

## HttpOnly, Secure属性をつけ、同一オリジンポリシーを適用したcookieに保持する

以下の理由から、仮にXSSを仕掛けられていても認証トークンが盗まれるリスクがほとんどありません。

- HttpOnly属性でJavaScriptからアクセスができなくなるためXSSが存在しても読み取られない。
- サーバー側でセットされたCookieはそのサーバーにしか送信できない。(異なるサーバーに送信したい場合はdomain属性を使う)
- Secure属性で通信路上で盗まれるリスクも低い

一方で、XSS以外の観点では以下の課題や制約があります。

- 認証サーバー側でSet-Cookieしてもらう必要がある（が、外部認証サービスを使っていると必ずしもそのような仕様とはなっていない）
- Authorizationヘッダの仕様 (RFC6750) に従えなくなる

この方法は確かにセキュアですが、認証APIの実装やCookieの取り扱いの正しい実装などコストの高い方法となるでしょう

## Web Storageに保持する

`window.localStorage`, `windos.sessionStorage`から情報を抜き出して、別のサーバーに送信するJavaScriptコードを書くのは比較的簡単です。
おそらく数行で書けるでしょう。


様々なサイトをクロールして、XSSできそうなフォームを見つけ、数行のコードをSubmitしてみるというのは簡単に自動化できそうなタスクです。
もし、Web Storageに認証トークンを保持していればこのような無差別的な攻撃の対象になるリスクがあります。

## in-memoryで保持する

Web Storageには保持せずメモリ展開(JavaScript上の変数など)のみに格納する方法です。

原理的には、XSSによってメモリ上の認証トークンを盗まれる可能性はありますが、
WebStorageと違い、攻撃者からみるとどこに認証トークンが存在するかは不明であり困難性が大幅に向上しているといえるでしょう。
（もしかすると、変数スコープの関係で読み取ることが不可能な可能性もあります）

ただし、in-memoryに保持された認証トークンは、ページ再読み込みの際には消えてしまうでしょう。
これがユーザービリティにどの程度の影響を与えるかは判断が必要です。

ちなみに、Auth0ではこの方法が推奨されています。

参考： https://auth0.com/docs/security/store-tokens#regular-web-apps

## 終わりに

現実的に、1.の方法を取れない場合は多くあると思いますし、そもそもサイト自体にXSS対策を十分にするから大丈夫だ！という判断もあると思います。

2,3はどちらも極端な話、ログインページでgetByElement, innerHTMLなどの利用をXSSで許してしまえば、
攻撃者がログインフローを任意の処理でハックして認証トークンを盗むことが原理的に可能です。

そうすると、認証トークンが盗まれた場合を想定した対策を別途行うことで、3の方法を取るという選択肢もあると思います。
JIRAのフィールドに自動で日付をセットする

##日付ピッカーのフィールドに本日の日付をセットする

①対象の日付ピッカーのフィールド（カスタムフィールド）のIDをメモする
　（フィールド構成画面を開いた時にURLにIDが表示されている）

②フィールドの編集画面の説明欄に下記のスクリプトを記載する
  （customfield_nnnnnの「nnnnn」はカスタムフィールドID）


```groovy

<script>
  try{
   var dateField = document.getElementById('customfield_nnnnn');
   var date = moment();
   var dateFormat = document.querySelector('[name="ajs-date-dmy"]').getAttribute('content');
   var dateString = date.format(JIRA.translateSimpleDateFormat(dateFormat));
   dateField.value = dateString;
  }catch(e) {
   console.log(e.message);
  }
</script>
```

※再表示すると常に当日日付がセットされてしまうため、ワーク用のフィールドとして使うようにする。
※日付を保存する場合は、ワークフローの事後操作で別の保存用日付フィールドにコピーすると良い。


*JIRA Softwareバージョンは7.12.1*
dialogFlow超個人的メモ

dialogFlowを触ってみたのでメモ。

超個人的メモなので時間が惜しい人は読まないでください。

## dialogFlowとは
機械学習を使い、複雑なチャットボットを簡単に作るサービスらしい。
例えば、カスタマーサービスの一部を人工知能で置き換える。自社サービスに、人工知能のチャットボットを設置するなどに使える。
機械学習エンジニアを雇うほどでもない。しかし、高性能なチャットボットがほしいというユースケースに対応している。
slackやgoogle homeと連携できるので、ちょっとしたツールに使えそう。

<img width="1642" alt="スクリーンショット 2019-06-12 11.37.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/f124be91-0e45-0c3a-4a7c-09566518fb34.png">

iframeを使って、以下のようにお手軽にチャットサービスを作成し、webサイトに埋め込む事が出来る。
<img width="403" alt="スクリーンショット 2019-06-14 11.52.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183835/90b9277b-3162-de0e-1f9d-4a1dbf0108a1.png">



左側の項目を説明する。

## intent
文字入力の定義。
ここで定義した単語が話されると、dialogFlowのEventsが発火する。

Traninig pharases = インプットの文章を入力。
Response = レスポンス。
一般的なチャットボットなら、この二つだけで良い。

## Entities
entiti= 権利、実在
言葉の呼び方を定義する。
「お腹空いた」という言葉は他にも色々な言い方があります。
「腹減った」とか「お腹ペコペコ」とか。
そういった色んな言い方をしても意味は「お腹すいた」だよっていうのを定義します。
様々な言い方を一つの言葉に集約させるんです。

## Fulfilment
webhookを定義するところ
オンラインエディタで、firebase functionをいじれる。
npm モジュールが提供されていてローカルで開発も出来る。
ただ、web hookでは、postのbodyを編集することは出来なさそう？
結局、cloud functionなど、lassを使ってコードをデプロイしないと、複雑なものは作れないようだ。
以下のライブラリを使わないといけないらしい。
https://github.com/dialogflow/dialogflow-fulfillment-nodejs

また、webHookとは、会話の内容を全て、指定されたuriにpostする。
どの会話に、どの発話を返すかは、api側でif elseを返す必要がある。

inlineエディターでは、サードパーティ製のライブラリ（axiosなど）を使うことができない。
作成したapiのuriを、webhookの欄に記入する。

## integrations
様々なサービスとインテグレーション出来る。
action on googleとか、slackとか電話とか。
個人的には、webが雰囲気を掴めておすすめ

## Training
今までー会話した内容が表示される。

## History
今まで会話した内容が表示される。

## analytics
アナリティクス

## Prebuild Agents
テンプレートが並ぶ。
ラインナップは悪い

## 結論
結局、clound functionを、firebaseにデプロイした。
インラインエディターは、使いずらい。
結局、clound function内で if elseを書き始めたので、
「codingなしにチャットボットを作る」のはやはり無理そう。
ただ簡単なチャットボットなら、コーディングゼロで作成出来るのは魅力。

## 値段
電話　100分 ５ドル

## 結論
ある程度の規模まではコーディングなしに、チャットボットを作成出来るが、webhookとか使い始めるとコーディングが必要になる。
後、googleにしてはUIが悪くかなり使いにくいw

## dialogFlow-fulfilmentの使い方（執筆途中）

```
yarn add dialogflow-fulfillment
```

```js
const {WebhookClient} = require('dialogflow-fulfillment');
const {Card, Suggestion} = require('dialogflow-fulfillment');
```

のように、普通のnodeで使えそう。




###　参考一覧
https://qiita.com/miso_develop/items/28cbfcdfb61d455ce346
複数行にまたがる複数AND条件でのファイル検索

Macを含む*Unixで、複数行にまたがる複数AND条件でのファイル検索をしたいとする。以下の例は

1. `aui:validator`という文字列と、`submitForm`という文字列の両方を含む場合 
1.  `aui:validator`、`submitForm`の順で出現するとわかっている場合

での検索となる。

```bash
find ./ -name "*.jsp" -exec pcregrep -M 'aui:validator.*(\n|.)*submitForm' {} \; -print
```
Python Tips

# Pythonで関数の引数にリスト、タプル、辞書を展開して渡す

こんな風に書くと、リストや辞書を展開してメソッドに渡せる模様。

```python

def list_func(list1, list2, list3):
    print(list1)
    print(list2)
    print(list3)

def dict_func(key1, key2, key3):
    print(key1)
    print(key2)
    print(key3)

l = ['one', 'two', 'three']
list_func(*l)

d = {
 "key1": 1,
 "key2": 2,
 "key3": 3,
}
dict_func(**d)
```

参考
 - https://note.nkmk.me/python-argument-expand/
VMware 15 Pro > 取り外し可能デバイスにUSBデバイスが表示されない 

```
ThinkPad W541
ホストOS: Windows 10 Pro v1809
VMware(R) Workstation 15 Pro v15.0.4 build-12990004
ゲストOS: Windows 10 Pro v1809
```

### 症状

ゲストOS(Windows 10 Pro)にて「取り外し可能デバイス」にUSBデバイスが表示されない。


### 対処

タスクマネージャー > サービス > VMware USB Arbitration Service
が停止している。

実行状態にする。
【python】 累積和を取るときのお話

#1.型に注意

itertools.accumulate()で返ってくるのはlist型ではないので、要素をindexで指定できません(多分)


```python
from itertools import accumulate
list_1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#ng
cumsum_1 = accumulate(list_1)
print("1:",cumsum_1)
print("type:", type(cumsum_1))

print(cumsum_1[1])
```

結果
`1: <itertools.accumulate object at 0x10f8af108>
type: <class 'itertools.accumulate'>
Traceback (most recent call last):
  File "test.py", line 9, in <module>
    print(cumsum_1[1])
TypeError: 'itertools.accumulate' object is not subscriptable
`

#2.list型にキャストしよう
list型に変更してしまえばこちらのものなので、普通はこうしてしまいます。

```python
#ok
cumsum_2 = list(accumulate(list_1))
print("2:",cumsum_2)
print("type:",type(cumsum_2))
```

結果
`2: [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
type: <class 'list'>
cumsum_2[1]: 3
`

#3.もっと簡単に(これが書きたかっただけ)
こんな書き方も出来ます
※ **","を忘れると死にます**

```python
#ok
* cumsum_3, = accumulate(list_1)
print("3:",cumsum_3)
print("type:",type(cumsum_3))

print("cumsum_3[1]:",cumsum_3[1])
```

結果
`3: [1, 3, 6, 10, 15, 21, 28, 36, 45, 55]
type: <class 'list'>
cumsum_3[1]: 3
`

#-1.余談
for文で回すときに使うだけだったらlistにしなくても問題はないです

```python
for c in accumulate(list_1):
    print(c,end=", ")
```

`1, 3, 6, 10, 15, 21, 28, 36, 45, 55, `

あと、なにか補足や豆知識あったらおしえてくだしあ。
Google Compute EngineでCentOSのタイムゾーンを変更する 


# 概要
Google Compute Engine(GCE)上でCentOSを使ったVMインスタンスを作成した際、デフォルトのタイムゾーンがUTCとなっているため、日本標準時に変更する。

# 使用OS
CentOS 6.10

# 設定変更手順
### 1. ZONE変数の修正
下記ファイルを編集する。
> /etc/sysconfig/clock

デフォルトは ZONE="UTC" となっている。
日本国内(UTC+9)であれば "Asia/Tokyo" を設定する。

```
ZONE="Asia/Tokyo"
```

### 2. /etc/localtime編集
次に、/usr/share/zoneinfo/Asia/Tokyoを/etc/localtimeに上書きコピーする。

```
$ sudo cp -a /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

### 3. VMインスタンスを再起動する
GCEのコンソール上から再起動するか、コマンドラインで下記を実行して再起動する。

```
$ sudo shutdown -r now
```

### 4. 確認
再起動の完了後、以下コマンドを実行して日本時刻になっているか確認する。

~~~
$ date
~~~


（以上）
python 正規表現 group化

### 背景
group化についてわからないところがあったのでメモ

### 概要
```python
In[1]: m = re.match(r'.*optional_attr:"(.*)".*(|>)', '{{ fr.max_length|optional_attr:"max-length" }}>')
In[2]: m.group(1)
Out[2]: 'max-length'
In[3]: m.group(2)
Out[3]: ''
```
- group2に `'>'` が現れてほしい。

### どうやったら現れるようになるか
```python
In[1]: m = re.match(r'.*optional_attr:"(.*)".*([|>])', '{{ fr.max_length|optional_attr:"max-length" }}>')
In[2]: m.group(1)
Out[2]: 'max-length'
In[3]: m.group(2)
Out[3]: '>'
```
- []を忘れていたんですね。。。

### []とは
kintoneにてシステム日付を取得する

##kintoneのフォームにシステム日付を設定する

kintoneにて新規フォームを表示時にシステム日付を自動設定する場合。
moment.jsを読んでおくこと。

```javascript:inputForm.js
   // レコード新規作成時
   kintone.events.on(["app.record.create.show"], function(event){

      var record = event.record;

      // 設定する日付を取得
      var presentDate = moment().format('YYYY/MM/DD');
      record['勤務日']['value'] = presentDate;

      // イベントを返却
      return event;
    
   });

```
buttonタグで勝手にリロードされてしまう(vue.js)

formをひとつだけ用意して、それぞれどのボタンを押されたかで挙動を変更するためボタンにv-on:clickを設定したところ
画面が勝手にリロードされハマりました。

(laravelのbladeテンプレート内でVueを使用)

```vue
<form id="item-form">
	<select v-on:change="addCondition($event, 'operator_name')">
	    <option v-for="member in members">
	        @{{member.name}}
	    </option>
	</select>
    <button id="search_button" v-on:click="search">検索</button>
    <button id="delete_button" v-on:click="deleteItem($event, item)">削除</button>

    <ul id="show-list">
		<li v-if="search_condition !== null" v-for="val in search_condition">
			@{{ val }}
		</li>
	</ul>
</form>


@section('script')
<script>

var vm = new Vue({
	el: '#item-form',
	data: {
		members: {!! json_encode($members) !!},
		search_condition: [],
	},
	methods: {
		 addCondition: function(event, type, cond="="){
			 console.log(event);
            if(event.target.value == ""){
                vm.search_condition.pop();
            }else{
            	vm.search_condition.push(event.target.value);
            }
        },
		search: function(){
			alert('検索する');
			console.log(this.search_condition);
		},
		deleteItem: function(){
			alert('削除する');
			console.log(this.search_condition);
		}
	},

});
</script>
```

alertを出したあと一旦console.logするだけにしたのですが
なぜか画面がリロードされてしまう。。。（URLの最後に?がつくのでget通信しようとしているようにみえる）

##原因:type属性が設定されていないbuttonタグは、type=submitを付与しているときと同じ動作をします。
しらなかった。。。。

ドキュメント( https://developer.mozilla.org/ja/docs/Web/HTML/Element/button )より以下抜粋
・form属性`この属性を指定しない場合は、祖先に <form> 要素が存在すれば、その要素に関連付けられます。`
・type属性`submit: 自身が属するフォームのデータをサーバーに送信するボタンとなります。これは type 属性が指定されていない場合、もしくは属性値が動的に空にされたり不正な値にされた場合の既定の動作です。`



###解決方法1: buttonタグじゃなくてinputタグのtype=buttonにする

```vue
<input type="button" v-on:click="search" value="検索">
```

###解決方法2: buttonタグのままtype=buttonを追加
```vue
<button type="button" v-on:click="search">検索</button>
```

###解決方法3: イベント修飾子.preventを使う
```vue
<button v-on:click.prevent="search">検索</button>
```

####参考:
https://stackoverflow.com/questions/44681646/the-page-will-strangely-refresh-when-i-click-the-button
画像をExcelにぺたぺたしてくれるExcelVBA

SI業界にいる方だとエビデンスを取るのはWinshot使って作業中にパシャパシャとったけど、
Excelにぜんぶ貼り付けるのは苦行だったりします。

そもそもこの作業無意味じゃね？ってのは偉い人達にまかせて、
偉い人たちが欲しいってものを楽してつくりたい！

そんな方へ。

拾いものを改造したものなので作りは粗いです。
ご容赦を。

■できること
Excelファイルに指定フォルダ内の画像をすべて貼り付ける。
A1セルを起点に上から下に向かって貼り付ける。
画像と画像の間は3行程度空ける。

■ExcelVBA
<pre>
' 指定したフォルダにある画像ファイルを読み込み、EXCELに貼り付ける。
'
Sub pasteDirAllImage()

' 変数定義
Dim fileName As String
Dim targetCol As Integer
Dim targetRow As Integer
Dim targetCell As Range
Dim shell, myPath
Dim pos As Integer
Dim extention As String
Dim isImage As Boolean

' 選択セルを取得
targetCol = ActiveCell.Column
targetRow = ActiveCell.Row

' フォルダ選択画面を表示
Set shell = CreateObject("Shell.Application")
Set myPath = shell.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\Users\USERNAME\")
Set shell = Nothing

' フォルダを選択したら...
If Not myPath Is Nothing Then

fileName = Dir(myPath.Items.Item.Path + "\")

Do While fileName <> ""

' ファイル拡張子の判別
isImage = True
pos = InStrRev(fileName, ".")
If pos > 0 Then
Select Case LCase(Mid(fileName, pos + 1))
Case "jpeg"
Case "jpg"
Case "gif"
Case Else
isImage = False
End Select
Else
isImage = False
End If

' 拡張子が画像であれば
If isImage = True Then

' 貼り付け先を選択
Cells(targetRow, targetCol).Select
Set targetCell = ActiveCell

' 画像読込み
ActiveSheet.Pictures.Insert(myPath.Items.Item.Path + "\" + fileName).Select

' 画像が大きい場合、画像サイズをセル幅に合わせる
'If Selection.Width > targetCell.Width Or Selection.Height > targetCell.Height Then
'If Selection.Width / targetCell.Width > Selection.Height / targetCell.Height Then
'Selection.Height = Selection.Height * (targetCell.Width / Selection.Width)
'Selection.Width = targetCell.Width
'Else
'Selection.Width = Selection.Width * (targetCell.Height / Selection.Height)
'Selection.Height = targetCell.Height
'End If
'End If

' 表示位置をセル中央に移動
Selection.Top = targetCell.Top + (targetCell.Height - Selection.Height) / 2
Selection.Left = targetCell.Left + (targetCell.Width - Selection.Width) / 2

' 貼り付け先行を+1
targetRow = targetRow + 30

End If

fileName = Dir()

Loop

MsgBox "画像の読込みが終了しました"

End If

End Sub
</pre>
Layout xmlをData Binding xmlに変換する方法

ルートの要素にカーソルを合わせて `Option + Enter` すると以下のダイアログが表示されます。
電球アイコンをクリックしても同じです。

![figure1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18273/9bcb1f58-3938-5a16-175c-36f24c192097.png)

`Convert to data binding layout` を選択すれば、データバインディング用のxmlにコンバートされます。
結果はこんな感じ。

![figure2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18273/b4258a95-f959-1584-d8de-64436773acc8.png)

参考
https://plugins.jetbrains.com/plugin/9271-databinding-support
自動ログインしてホスト名とIPを取得するTeratermMacro

Ansibleなどまともな構成管理ツールが導入されていればいいんですが、
現実のところ、ドキュメントはクソ！実機情報は正しい！なので、
大抵泥臭いことをしてシステム構成図を確認したり作ったりします。

何百回も同じことする苦行はやりたくないので、
とりあえずLinuxサーバだということがわかれば自動で構成情報を取得したい。
Linux踏み台あればBashスクリプト組むけど、Windows踏み台orローカルPCからのアクセス・・・。
しかもツールはTeratermくらいしか許されていない・・・。
そんな方はどうぞ。

もともとは拾い物のサンプルスクリプトを改変したものなので作りは粗いです。
ご容赦を。

自動ログインしてホスト名とIPを取得するTeratermMacro。
AccessList.csvに記載されたサーバすべてに自動実行する。
実行するコマンドは任意に変更可能。
<pre>
csvfile = 'AccessList.csv'
separator = ','


; 読み取り専用でCSVファイルを開く
fileopen fh csvfile 0 0


while 1
filereadln fh buf
if result then
break
endif


strsplit buf separator
ip = groupmatchstr1
user = groupmatchstr2
passwd = groupmatchstr3


sprintf2 conbuf '%s /ssh /auth=password /user=%s /passwd=%s' ip user passwd
connect conbuf


; 何か処理をする
pause 3
sendln 'uname -n'
csvfile = 'AccessList.csv'
separator = ','


; 読み取り専用でCSVファイルを開く
fileopen fh csvfile 0 0


while 1
filereadln fh buf
if result then
break
endif


strsplit buf separator
ip = groupmatchstr1
user = groupmatchstr2
passwd = groupmatchstr3


sprintf2 conbuf '%s /ssh /auth=password /user=%s /passwd=%s' ip user passwd
connect conbuf


; 何か処理をする
pause 3
sendln 'uname -n'
        pause 3
sendln "ifconfig |grep inet|awk '{print $2}'|cut -d: -f2 | grep -v -e ^$"
        pause 3
sendln 'exit'


unlink
endwhile


fileclose fh
end
        pause 2
sendln 'exit'


unlink
endwhile


fileclose fh
end
</pre>

AccessList.csvにログイン情報を羅列しておく
<pre>
IP_ADDR1,USERNAME1,PASSWORD1
IP_ADDR2,USERNAME2,PASSWORD2
IP_ADDR3,USERNAME3,PASSWORD3
</pre>
雰囲気を伝えたい！ DjangoCongress JP 2019に関連する皆さんのアウトプットまとめ

## はじめに

2019/05/18に東京でDjangoCongress JP 2019 カンファレンスデーが開催されました。
Python製のWebフレームワーク、Djangoについて、丸1日使った勉強会です！
この記事では、DjangoCongress JP 2019の登壇者、参加者の皆さんのアウトプットを一覧にします。

## 背景

記事作成者は、[2019/06 みんなのPython勉強会](https://startpython.connpass.com/event/124251/)にてDjangoCongress JP 2019のレポートをします。
DjangoCongress JPの雰囲気が伝わるように、アウトプット一覧を用意してみました。

「自分のアウトプットも追加してほしい」などありましたら、編集リクエストを送ってください。
また、誤りがありましたら、コメントまたはTwitter [@ftnext](https://twitter.com/ftnext)宛でお知らせいただけると嬉しいです。

## 本家

https://djangocongress.jp/2019 [^1]
スライドリンクや動画リンクが追加されています！

[^1]: 2019/12/11前後にトップが2020向けに更新されていますが、2019へのアクセス方法をTwitterで教えていただきました。https://twitter.com/kashew_nuts/status/1204726351191625728?s=20 ありがとうございます

[DjangoCongress JP 2019 YouTube動画アーカイブ](https://www.youtube.com/playlist?list=PLfNCXSj_QJrquQyL-bSBdOFyvInP3vxqX)

## 非公式まとめ

Qiitaで早めに以下のまとめが出たのはありがたかったです。
[DjangoCongress JP 2019 発表資料まとめ(仮)](https://qiita.com/cuz/items/e6597bf6338a92a4340b)

Togetter（私の方でまとめてみました）
https://togetter.com/li/1359565

## 発表者レポート

- [DjangoCongress JP 2019に登壇したので事故らないためにやったこと](http://farewell-work.hatenablog.com/entry/2019/05/19/171248) Nakajimaさん
- [DjangoCongress JP 2019 で「現場で使える Django のセキュリティ対策」というタイトルで登壇してきました](https://akiyoko.hatenablog.jp/entry/2019/05/19/140642) akiyokoさん
- [DjangoCongress JP 2019 で登壇してきました](https://www.chirashiura.com/entry/2019/05/18/210000) nasumさん
- [DjangoCongress JP 2019で発表するまでの準備を振り返ってみた](https://thinkami.hatenablog.com/entry/2019/05/21/122555) thinkAmiさん
- [DjangoCongress JP 2019 に参加 & 発表しました](https://thinkami.hatenablog.com/entry/2019/05/20/223259) thinkAmiさん
- [登壇報告 | #djangocongress にて、Django Girls Tutorialの次に取り組みたいトピックについて共有してきました](https://nikkie-ftnext.hatenablog.com/entry/2019/05/19/105750) It's me!(私です)

## 参加者レポート

- [DjangoCongress JP 2019に行ってきました](https://kamekokamekame.net/2019/2019-05-18-article.html) kame-chanさん
- [DjangoCongress JP 2019に参加しました。](http://trybox-itneta.hatenablog.com/entry/2019/05/18/180501) t_kobさん
- [【参加レポート】DjangoCongressJP 2019 に参加してきたよ](https://moryata.com/wp/2019/05/18/372/) kidoki（夫）さん
- [DjangoCongress 2019に行ってきました。](https://blog.mtb-production.info/entry/2019/05/19/124043) mtb_betaさん
- [Djangoでロギング(logging)を行う方法](https://sinyblog.com/django/logging-001/) sinyさん
- [DjangoCongress JP 2019に参加してきました。](https://sandfishfactory.hatenablog.com/entry/2019/05/19/173619) sandfish03さん
- [コミュニティに貢献する〜DjangoCongress JP 2019に参加して来ました〜](https://kumappp.hatenablog.com/entry/2019/05/19/215155) kumapppさん
- [DjangoCongress2019に参加しました](http://mizzsugar.hatenablog.com/entry/2019/05/19/220605) mizzsugarさん
- [DjangoCongress JP 2019に参加しました](https://xaro.hatenablog.jp/entry/2019/05/19/222416) XaroCydeyknさん

## スタッフ

- [DjangoCongress JP 2019 主催者インタビュー　前編](https://blog.pyq.jp/entry/python_event_20190603)
- [DjangoCongress JP 2019 主催者インタビュー　後編](https://blog.pyq.jp/entry/python_event_20190604)
- [DjangoCongress JP 2019 にスタッフとして参加してきた](https://massa142.hatenablog.com/entry/2019/06/10/110806) massa142さん

以上です。
FTP Server Installation on OracleLinux 7

# Create FTP User

```
[root@docker] $ useradd ftp-user
[root@docker] $ passwd ftp-user
[root@docker] $ mkdir -p /var/nfs/ftp_dir
[root@docker] $ chown ftp-user /var/nfs/ftp_dir
[root@docker] $ chmod 755 /var/nfs/ftp_dir
```

# Install FTP Module
```
[root@docker] $ rpm -qa vsftpd
[root@docker] $ rpm -ivh /run/media/holuser/OL-7.5\ Server.x86_64/Packages/vsftpd-3.0.2-22.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:vsftpd-3.0.2-22.el7              ################################# [100%]
```
# Install FTP Module via yum
```
sudo yum -y install vsftpd
```

# Configuration FTP Server
```
[root@docker] $ cd /etc/vsftpd/
[root@docker] $ cp vsftpd.conf vsftpd.conf.original
[root@docker] $ vi vsftpd.conf
```
```file:/etc/vsftpd/vsftpd.conf
#anonymous_enable=YES
anonymous_enable=NO

#idle_session_timeout=600
idle_session_timeout=600

userlist_enable=YES
#tcp_wrappers=YES
tcp_wrappers=NO
pasv_enable=YES
#pasv_address=127.0.0.1
force_dot_files=YES
user_config_dir=/etc/vsftpd/user_conf
userlist_deny=NO

#chroot_local_user=NO
#chroot_list_enable=YES
#chroot_list_file=/etc/vsftpd/chroot_list
chroot_local_user=NO
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
```

<!--
```
[root@docker] $ vi user_list
```
```file:/etc/vsftpd/user_list
ftp-user
```
-->

```
[root@docker] $ mkdir /etc/vsftpd/user_conf
[root@docker] $ cd user_conf
[root@docker] $ vi ftp-user
```
```file:/etc/vsftpd/ftp-user
local_root=/var/nfs/ftp_dir
```


```
[root@docker] $ vi /etc/vsftpd/chroot_list
```
```file:/etc/vsftpd/chroot_list
ftp-user
```

# Configuration FTP Server Service
```
[root@docker] $ chkconfig --list vsftpd
[root@docker] $ chkconfig vsftpd on
[root@docker] $ chkconfig --add vsftpd
```

# Startup FTP Server
```
[root@docker] $ service vsftpd status
[root@docker] $ service vsftpd start
```

## Check log file (Optional)
```
[root@docker] $ tail -f /var/log/xferlog
```

<!--
```file:/etc/hosts.deny
vsftpd: ALL
```

```file:/etc/hosts.allow
vsftpd: 192.168.1.
```
-->

# Confirm FTP Server Access
```
CMD> ftp <FTP-HOST>
USER (FTP-HOST:(none)): ftp-user
331 Please specify the password.
Password:
230 Login successful.
ftp> pwd
257 "/var/nfs/ftp_dir"
ftp> quit
```
ansibleを踏み台越しに実行する

# ansibleを踏み台越しに実行する

## 環境

　MyPC --> 踏み台サーバ (password) --> 中継サーバ(IdentityFile) --> 対象サーバ(IdentityFile) 

## ssh_config

```ssh_config
Host fumidai
  HostName CCC.CCC.CCC.CCC
  User hanako

Host step1server
  HostName BBB.BBB.BBB.BBB
  User centos
  IdentitiesOnly yes
  IdentityFile ~/.ssh/hoge.pem
  ProxyCommand ssh -W %h:%p fumidai

Host target
  HostName AAA.AAA.AAA.AAA
  User centos
  IdentitiesOnly yes
  IdentityFile ~/.ssh/hoge.pem
  ProxyCommand ssh -W %h:%p step1server
```

## ansible.cfg

```ansible.cfg
[ssh_connection]
control_path = %(directory)s/%%h-%%r
ssh_args = -o ControlPersist=15m -F ssh_config -q
scp_if_ssh = True
```

## 実行
実行すると、最初に踏み台サーバのパスワード入力を求められます。
その後は、IdentityFileが使われる
スウェーデン発のプロトタイピングツールNoodlを触ってみた

## Noodl(ヌードル)とは

TOPPというスウェーデンのイケてるデザインの会社がつくってる新しいプロトタイピングツール。
日本で使ってる人は見たことない。

[Noodl](https://www.getnoodl.com/)
[Topp Design & Innovation](http://www.topp.se/)


## 特徴
- Macアプリで作業し書き出しはwebベース
- IoTデバイスとの連携もできる
- ストレージがある
- **jsが動く**
- **Unityと連動もできる**
- なんでもできそう

## とりあえず触ってみる

## インストール
ここから
[Download](https://www.getnoodl.com/download)

### Lesson
Noodlを起動するとLessonというのが出てくるのでそれをやってみる。

### ボタンひとつでブラウザチェックできる
バーの上部に `preview in web browser` がありそこをクリックするとローカルのブラウザで簡単に見れる。
非常に便利。

### Nodeと呼ばれるものを組み立てていく
Nodeはビジュアルもロジカルなものもアニメーションもある
- 四角形
- アニメーション
- state

### 各nodeをクリックするとpropertyが見れる
ここらへんはXcodeっぽい。
iOS書いてる人はやりやすそう。

### 円を置いてクリックしたら大きくなり、話したら小さくなるものをつくる

1. Circleを作成しSizeを設定
2. Statesを作成しstatesとValueをつくる
    - States: Small, Big
    - Value: Size
3. StatesからCircleへびよーんと伸ばす
    - Source: Size
    - Target: Size
4. RootからStatesへびよーんと伸ばす
    - Source: Press
    - Target: To Big
5. RootからStatesへびよーんと伸ばす 
    - Source: Release
    - Target: To Small

![Jun-09-2019 14-46-22.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50232/5fc96903-9f28-48e8-34e1-8c60b15c1755.gif)

できた。

## 所感
プロトタイプツールというと、画面上を直感的に触るっていうのが多いけどこれはノードエディターを触るのが基本なので最初慣れないけど構造としてはシンプルで分かりやすい。
あと実行されると関連した箇所がグラフィカルにアニメーションし未来っぽい。

## 次回
[NoodlでHTTP通信する - Qiita](https://qiita.com/ryusukefuda/items/0a9317ed3f8db50b1b1e)