OmniAICreator/Qiita-1.07M huggingface dataset:
ConcourseでGithubのprivateレポジトリをビルド & デプロイする話

# 初めに

ConcourseでGithubのレポジトリを取得する際、publicなレポジトリの場合のbuild.ymlをどうするかの記事は既にあったがprivateな場合の記事が見当たらなかったので書くことにした。
ここではiOSアプリの場合。

publicな場合: [Concourse CIでiOSアプリのCIを行う](http://qiita.com/tenten0213/items/7a362a4b9d65040d93d6)

# 結論
↓ こんな風にsshの秘密鍵を設定してやれば、特に難しいことは無くprivateなレポジトリを取得してfastlaneでビルド & beta配布したり出来る。
対応する公開鍵は予めいつもの手順でGithubに登録しておく。
また、パスワード付きの秘密鍵には対応していない様子。
秘密鍵をベタ書きにするのが嫌な場合 or ベタ書きにしたらまずい場合は工夫が必要と思われる。

```build.yml
resources:
  - name: as_you_like
    type: git
    source:
      uri: git@github.com:your/private-repository.git
      branch: master
      private_key: |
            -----BEGIN RSA PRIVATE KEY-----
            MIIEowIBAAKCAQEAw0ej
            (中略)
            EhZFPOmxlHtfLMLNYdqQVKHpyAr0d
            -----END RSA PRIVATE KEY-----
jobs:
  - name: build_as_you_like
    plan:
      - get: as_you_like
        trigger: true
      - task: specs
        config:
          platform: darwin
          inputs:
            - name: as_you_like
          run:
            path: sh
            args:
              - -c
              - |
                bundle install
                bundle exec fastlane beta
```

公式リファレンス: https://github.com/concourse/git-resource

# 終わりに
Jenkinsを避けたくて使い始めたが今後どうなるかはわからない。
Vimについて



## ショートカット

| ショートカット | 効果 |
|:---:|:---:|
| :set columns= xxx | 横幅 |
| :set lines= xxx | 縦幅 |
| 0 | 先頭に移動 |
| :Tutorial | チュートリアル |

## 編集、保存

| ショートカット | 効果 |
|:---:|:---:|
| :e （Tabでファイルを選択）[file] | fileを開く |
| :w | 保存 |
| :q | 終了 |
| :q! | 保存せず終了 |
| ZZ | 保存して終了 |


### 移動系

| ショートカット | 効果 |
|:---:|:---:|
| 0 | 先頭に移動 |
| ctrl + u | 半画面分 上へ |
| ctrl + d | 半画面分 下へ |
| dd | 最下部 |
| D | 最上部 |
| gg | 先頭行に移動 |
| G | 先頭行に移動 |



### モード変換

| ショートカット | 効果 |
|:---:|:---:|
| i | カーソル位置からインサートモードに入る |
| Ctrl-r 0(ゼロ)(インサートモード中に) | レジスタ0に保存されている文字列を貼り付ける. 通常, yを使用してコピーした文字列は, レジスタ0に保存される。|

### コピー

| yy | カーソルがある行をコピー |
|:---:|:---:|
| x | 削除 |
| d$ | 行を削除 |
| dd | 行を削除 |


### 検索

| ショートカット | 効果 |
|:---:|:---:|
| dw |	カーソル位置から1単語分削除する |
| ノーマルモードで ? | 続けて文字を打ち, Enterで文字列を確定し, 前方検索をかける |
| / | の後に語句をタイプで前方検索 |
| ? | の後に語句をタイプで後方検索  |
| /か?語句を入力後にn | 同じ語句を検索  |


### 編集

| ショートカット | 効果 |
|:---:|:---:|
| 前回の動作を消す | u |
| 行全体の変更を取消す | U |
| 取り消しの取消し| CTRL-R |
| 編集する文字にカーソルを合わせる | r |
| 単語の一部を削除と変更 | cw |


## 参照サイト

- <a href="http://motw.mods.jp/Vim/command.html" target="_blank">Vimの使い方 よく使うコマンドまとめ | Memo on the Web</a>
- <a href="http://d.hatena.ne.jp/lemniscus/20121022/1350920565" target="_blank">Vimのウィンドウ操作 - 再帰の反復</a>
- <a href="http://sawasawato.blog.fc2.com/blog-entry-19.html" target="_blank">さわさわと Vim Windowサイズ変更　設定</a>
- <a href="http://nanasi.jp/articles/howto/install/tutorial.html" target="_blank">チュートリアルでvimエディタの使い方を覚えよう — 名無しのvim使い</a>
- <a href="http://qiita.com/tetsuya/items/75987487ffac42250d3b" target="_blank">Vimの設定ファイルを作る - Qiita</a>


## 用語解説

### ビジュアルモード

ViとVimの大きな違いの1つに、Vimには「ビジュアルモード」と呼ぶテキスト選択機能があるということが挙げられる。ビジュアルモードではテキストを文字単位、行単位、矩形単位で選択し、選択したテキストに対してVimのコマンドを適用できる。
COBOLの開発環境を快適にしよう　3 - 補助作業の自動化の勧め-

COBOL システムの開発をしている状況でも、他の言語での開発と同じように、検索、ファイルの比較、Excelファイルの操作などを行なっているはずだ。
それらの処理は、手作業で行なうにはあまりに、面倒な作業なはずだ。
私は、COBOLは使っていないが、ソースコードの中から検索したり、結果ファイルを比較したり、Excelファイルからデータを取り出したりとかすることがある。

そういった処理を自動化はするには、Python　がお勧めの１つです。

自分の目的のために、独自のファイルコピーツールをPythonで自作したことがあります。
そういった補助的な作業を、自動化するためのレシピが次の本です。

自分はCOBOL　プログラマであって、最新の技術動向から取り残されていると感じている人は、
ぜひ次の本を読んで、利用してみてください。

本の中にある例題を見て、「やりたかったことはこれなんだよ！」とある人は、
ぜひ本を購入して、試してみてください。

[退屈なことはPythonにやらせよう
――ノンプログラマーにもできる自動化処理プログラミング](https://www.oreilly.co.jp/books/9784873117782/)

![](https://www.oreilly.co.jp/books/images/picture978-4-87311-778-2.gif)

そうすれば、少しずつ変わっていきます。
例の黒い画面に慣れるための準備 その１（VirtualBoxを使ってLinuxに触れてみる 

# 例の黒い画面・・・
エンジニアなら使いこなせて当然のアレに少し慣れたい。
windows標準のコマンドプロンプトも使えるようにならないとなんだけど、業務で使うのがLinuxメインな気がするのでそっちをやる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/199415/16edba55-5d5c-b4de-d3be-784ac641b8c8.png)
※ 画像はwindowsのものです

# やること
自分のPC(Windows 7)にLinux環境を構築。
VirtualBoxというものを利用して、Windows上でLinux環境を動作させる。
MacOSとWindowsを1台のPC上で動作させるのとたぶん同じノリ。
VMWareとか他にも色々あるみたいだけど、ググって一番上にでてきたのがVirtualBoxなのでこっちを使ってみる。


# やることのザックリとした流れ
1. __VirtualBox__をインストール
2. VirtualBoxを使って、PC上に「仮想マシン」を作る  
仮想マシンていうのはOSをインストールする土台って思っとけばたぶん平気。  
HDD,光学ドライブ,ディスプレイ,メモリとかなんやらをPCの中に作るらしい。マジ未知の技術。
3. 作った仮想マシンにLinuxOS(今回は__Ubuntu__)をインストール
4. 黒い画面デビュー  

　お　わ　り

# 準備するもの
1. VirtualBoxのexe
2. Ubuntu Server 16.04.3 LTS  
ちなみにファイル形式はiso(仮想ディスク)で、OSがまるごと入っているので__結構容量あります。__(800Mくらい  
回線弱者なので夜通しかかりそうで泣いてる。

# 手順
1. VirtualBoxのexe起動してOK連打。インストール完。
2. VirtualBox起動。左上のノコギリマークをクリックしてOK連打。マシン作成完。
3. Ubuntuをインストール。したいけどDLおわらないので今日はここまで。

# まだ寝る時間じゃない・・・
のでLinuxについて考える。調べてもいいんだけどせっかくなので考える。
なんとなく知ってる特徴は

- 無料
- オープンソース
- Linuxにもいろいろ種類がある

っていうことくらい。
で、どういうところで使われてるかというと、サーバーで使われているイメージが強い。
たぶんオープンソースだからなんかあったときにも柔軟に対応できるのかな？
大いなる力には大いなる責任が、じゃないけど、自由度が高い分自分でなんとかしなくちゃいけない場面も多くなると思ってるので、要求される知識も多くなるよねぇ。
あとは最近流行りのIoT。どういうものかはよく分かってないけど、あれもLinuxとかUNIX使ってるんじゃないのかなぁ（イメージ
画面が必要ないものは全部UNIX系のイメージ。わざわざwindowsとか使ってコストかける意味が無い気がする。

ここでサーバーOSシェアというものが気になって調べてみたらLinuxが7割を越えてた。
2年前のデータなので今はもっと上がってそう。
ただwindowsサーバーも2割近くあるのに驚いた。この辺りのメリットは、また機会があったら調べよう。
あとLinuxの種類も調べる。


# 感想
完全に脱線しました。全部クソ回線のせいだ。
OSのインストールにどれくらい時間かかるかわからないけど、DLさえ終わってれば構築は30分位で終わるのでは？
これを書いている時間の方が長い。（本末転倒
文字列型のバグをできるだけ埋め込みたくない(Crystal編)

[こちらの投稿](http://qiita.com/Huruikagi/items/c6cc82e8379c24baaf39)を見て、以前自分も Crystal で同じようなことをやってみたのを思い出したので投稿します。

「静的型付き言語を使おうが、文字列型は変わらずバグの温床である」は Crystal のマクロなら少し改善できるというお話です。

# やりたいこと
「あるパターンにマッチする文字列」を表す型を作りたい。例えば、URL型なら、URLのフォーマットを持つ文字列のみを保持できる型を作りたい。とりわけ、

* 正しいフォーマットの文字列リテラルが渡された場合は非 `Nil` な `URL` インスタンスを返す
* 誤ったフォーマットが渡された場合はコンパイルエラーを返す
* 変数が渡された場合はコンパイル時のチェックは不可能なので実行時にチェックを行う。そのため戻り値の型は `URL | Nil` となる。

つまり以下のようなことが実現できるようにしたい。

```rb
URL.parse("http://www.google.com") #=> URL

URL.parse("www.google.com") #=> compile error

s = "http://www.google.com"
URL.parse(s) #=> URL | Nil
```

# コード
macro を使えば一発です。

```rb
class URL
  REGEX = /http(s)?:/
  def initialize(url)
    raise "invalid pattern" unless url =~ REGEX
    @url = url
  end

  macro parse(str)
    {% if str.is_a? StringLiteral %}
      {% if str =~ REGEX %}
        URL.new({{str}})
      {% else %}
        {% raise "invalid URL pattern" %}
      {% end %}
    {% else %}
      ({{str}} =~ URL::REGEX ? URL.new({{str}}) : nil)
    {% end %}
  end
end
```
簡単に解説すると、文字列リテラルが渡された場合に限りマクロの中でパターンにマッチするかどうか正規表現でチェックしてもしマッチしなければ例外を投げるだけです。

実際コンパイルエラーを出してみると以下のようになります。

```
Error in url.cr:25: invalid URL pattern

url = URL.parse("www.google.com")
          ^~~~~
```

# まとめ
このように Crystal ではコンパイル時に簡単な計算を走らせることでコード中のリテラルのチェックを行うことができます。実際のコードで使ったことはまだありません。電話番号やJSONなど他のフォーマットに応用は可能だと思います（簡単かどうかは別として）。

このようなコンパイル時の能力の高さが Crystal に惹かれた理由の一つです。（他にもこんなことができる言語ってあるんでしょうか？）
[WIP]Rails5.1(webpacker) + Vue.js + Karma + mocha + power-assertでJSテスト環境を構築してみた

Rails5.1(Webpacker使用)にフロントのユニットテスト環境を構築してみました。
自分自身の備忘録としてフロントのユニットテスト環境構築をメモっときます。
※Webpackerは導入済みとして話を進めていきます

# Karmaでとりあえずテストを走らせるまで
## Karamaのインストール
```
yarn add karma --dev
yarn global add karma-cli
```

## karma.conf.jsの作成
```
karma init

Which testing framework do you want to use ?
Press tab to list possible options. Enter to move to the next question.
> mocha

Do you want to use Require.js ?
This will add Require.js plugin.
Press tab to list possible options. Enter to move to the next question.
> no

Do you want to capture any browsers automatically ?
Press tab to list possible options. Enter empty string to move to the next question.
> Chrome
>

What is the location of your source and test files ?
You can use glob patterns, eg. "js/*.js" or "test/**/*Spec.js".
Enter empty string to move to the next question.
> app/javascript/packs/components/**/*.js
> app/javascript/packs/components/**/*.vue
> test/javascript/**/*_spec.js

Should any of the files included by the previous patterns be excluded ?
You can use glob patterns, eg. "**/*.swp".
Enter empty string to move to the next question.
>

Do you want Karma to watch all the files and run the tests on change ?
Press tab to list possible options.
> yes
```

## 必要なライブラリのインストール
```
yarn add mocha --dev
yarn add karma-mocha --dev
yarn add power-assert --dev
yarn add karma-mocha-reporter --dev
yarn add karma-webpack --dev
```

## karma.conf.jsに設定を追加
```karma.conf.js
module.exports = function(config) {
  config.set({
    basePath: '',

    // mochaのフレームワークを設定
    frameworks: ['mocha'],

    files: [
      'app/javascript/packs/components/**/*.js',
      // 'app/javascript/packs/components/**/*.vue', 一旦コメントアウトしておく
      'test/javascript/**/*_spec.js',
    ],

    exclude: [
    ],

    // ユニットテストの実行時の前処理を設定。ここではspecファイルをWebpackerの設定通りにトランスパイルさせるようにしている
    preprocessors: {
      'test/javascript/**/*_spec.js': ['webpack']
    },


    // テスト結果をみやすくさせるための設定
    reporters: ['mocha'],

    port: 9876,

    colors: true,


    // デバッグレベルを変更しておく
    logLevel: config.LOG_DEBUG,

    autoWatch: true,

    browsers: ['Chrome'],

    singleRun: false,

    concurrency: Infinity
  })
}
```

## テスト対象のjsファイルとSpecファイルの作成
テスト対象ファイル

```app/javascript/packs/components/test_sample/target.js
function add(a, b) {
    return a + b;
}

function subtract(a, b) {
    return a - b;
}
```

Specファイル

```test/javascript/test_sample/test_spec.js
import assert from 'power-assert'

describe('test add func', () => {
    it('1 + 2 = 3', () => {
        assert(3 === add(1, 2));
    });
});
```

## テストの実行
```
karma start
```

すると・・・

```
~~~~長いので省略~~~
  test add func
    ✔ 1 + 2 = 3

Finished in 0.011 secs / 0.001 secs @ 00:08:03 GMT+0900 (JST)

SUMMARY:
✔ 1 test completed
```

テスト成功!

# Vueコンポーネントのテストをする

## avoriazをインストール
Vue.jsのテストライブラリは様々ありますが、avoriazが良さそうなので、avoriazを使用します。

```
yarn add avoriaz --dev
```




# 参考にした記事
テスト環境を構築するにあたり大変参考になりました。
本当にありがとうございます。
http://qiita.com/howdy39/items/b9d704e7f84053924da3
http://qiita.com/kuy/items/6aaab9b80a3cc017c103
https://speakerdeck.com/hypermkt/vuekonponentofalseyunitutotesuto
google shorter apiを利用した短縮URL生成スクリプト

短縮URLを生成するスクリプトを作りました。

googleのAPIでしたら1日に100万リクエストまで行けるので他の短縮URLサービスより高可用性があります。
例えば、bitlyでは100URL/分で1ヶ月あたり5000URLの制限があり厳しいです。

参考:[https://www.quora.com/What-is-the-Bitly-API-rate-limit](https://www.quora.com/What-is-the-Bitly-API-rate-limit)


API_KEYは以下URLから取得します。API_KEYの取得方法はその次のURLをご参考に。

https://console.developers.google.com


[APIキーの取得 | Google Maps API入門](https://www.ajaxtower.jp/googlemaps/charset/index1.html)




長くてスミマセン。API_KEYの部分は取得したキーを入れます。

```ruby:google-shorter.rb
#!/usr/bin/ruby

require 'json'
require 'net/http'

long_url = ARGV.shift

API_KEY = 'your api key'

url = "https://www.googleapis.com/urlshortener/v1/url?key=#{API_KEY}"
uri = URI.parse(url)

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

req = Net::HTTP::Post.new(uri.request_uri)
req["Content-Type"] = "application/json"
req.body = { longUrl: long_url}.to_json
res = http.request(req)

short = JSON.parse(res.body)['id']
print short
```

使い方。

```
ruby google-shorter.rb http://qiita.com
```

結果:
https://goo.gl/6giPj



gemを使用したい人は以下のほうが楽だと思います。ただ、単に短縮URLがほしいだけなら独自実装でも十分。

[zigotto/googl: Google URL Shortener API in Ruby](https://github.com/zigotto/googl)

## 参考
- [net/httpsでWebAPIにPOSTリクエストを投げる - Qiita](http://qiita.com/seisonshi/items/c23c0154c45ccbfa9999)
- [【ruby】net/httpでPOSTリクエスト(https)投げてみる。 - 訳も知らないで](http://shirusu-ni-tarazu.hatenablog.jp/entry/2012/07/02/023326)
お試しMicrosoft Flow 毎朝Slackにお天気情報を送信するBotを作成する

Microsoft Flowなるワークフローをコーディングなしで作成できる便利なサービスがあったのでお試しということで、Slackで毎朝11時に新宿のお天気情報をつぶやくBotを作ってみました。
DropboxやGoogle Drive、Slackなど、様々なサービスを横断的に接続できるので結構便利です。
しかもかなりお手軽。


#1. テンプレからフロー作成

https://japan.flow.microsoft.com/ja-jp/galleries/public/templates/dc19fda0d36411e69a99cdf03e6c73d2/get-daily-updates-of-the-weather-forecast-celsius-with-push-notifications/
から。
１からやってもすぐできるのですが、せっかくあるので。

#2. Recurrenceの設定

ワークフローのトリガーから順に見ていきます。
定期的な繰り返し処理がトリガーですが、頻度はお好みで。
タイムゾーンは東京に設定。
自分は朝11時に起動してほしかったので、 1回/day とし、開始時刻を2017-08-29T11:00:00Zとしました。

#3. Todayの天気を取得する

場所は新宿区とかで大丈夫。
単位も普通にMetricで。

#4. Slackの設定

Slackの投稿メッセージアクションを追加。
どのチャンネルに投稿するかを決定し、下のような感じで設定しましょう。

![スクリーンショット 2017-08-28 23.54.54.png](https://qiita-image-store.s3.amazonaws.com/0/174325/5d87f765-9552-598d-d751-d687d2c30d2d.png)

条件分岐で、降水確率が70%以上の日は「傘は忘れてないですか？」とか、最高気温25度以上の日は「熱中症には気をつけてください」とか言うようにしてもいいかも。

#5. 動作確認

最終的にこんな感じです。
（画像はLocationが追加されているけど、いらないです。）
![スクリーンショット 2017-08-28 23.57.05.png](https://qiita-image-store.s3.amazonaws.com/0/174325/d9dec3d3-7ec9-9a1d-f9b1-85ad2a24c4ee.png)

「フローを更新」を押下すると、今すぐ実行を選択できるようになるので試しに実行してみましょう。

![スクリーンショット 2017-08-28 23.59.49.png](https://qiita-image-store.s3.amazonaws.com/0/174325/853bba1c-97e9-c183-5b53-9a51dd32df8e.png)

できました。
見た感じ、もっと複雑なこともできそうです。
まだまだアクションなども追加されていきそう。
CSSのバージョン変遷

CSSはCascading Style Sheetsの略。
いくつかのバージョンがあり、改善されてきたポイントをかいつまんでまとめる。

##CSS１

一番初期のバージョンであり、フォント・色・背景・マージン・パディング・ボーダーなどが設定できる。

##CSS2

CSS2では、パソコン以外のモニタでも利用できる規格であり、動的な内容の生成・配置・表のレイアウト・カウンタなどが設定できる。

##CSS 2.1

CSS2のエラー修正や一部プロパティの削除をはじめとして、音声スタイルなどのCSS2には存在していた機能の一部が廃止されている。

##CSS3

角丸・画像ボーダー・ドロップシャドウ・グラデーション・透明度・アニメーションなどの機能が追加されている。「セレクタ」、「フォント」、「テキスト」などの、さまざまな機能がモジュール化されている。
古いMacbookでBLEを使えるようにする

古いMacbookではBLE(bluetooth4系）に対応していない事があります。
今回はUSBアダプター(Class1)をぶっ刺す事で使えるようにします。

## 私のMac環境
MacBook Pro (13-inch, Mid 2009)
OS X El Capitan ver.10.11.6
※古すぎる為OSのアップデート対象から外されています(/_;)

## 確認方法 
1. 左上のリンゴマーク
2. このMacについて
3. 「概要」タブの「システムレポート」
4. ハードウェアのBluetooth
5. LMPのバージョンが「0x06」になっている方はもうこの記事を閉じてもらってOK。対応してます。それ以外の方は残念ながら非対応です。

## USBドングルを購入
http://www2.elecom.co.jp/products/LBT-UAN05C1.html
今回はelecomのLBT-UAN05C1（Class1）を使います。
ヤマダ電機で2000円ちょいでした。
class２製品も隣にありましたが、実用的なものを作りたいのでclass1に。
（作ってみたけど全然使い物にならなかったってのは大体class2製品のせいです。切断をトリガーにするものでなく、常に監視したいタイプのものが作りたいならclass1必須)

## Bluetooth ExplorerをDLする
https://developer.apple.com/download/more/

1. ログイン後、「Hardware IO Tools」の最新版をDLする。
2. DLフォルダの中にある「Bluetooth Explorer.app」をクリックし起動
3. 上メニュー「Tool」の「HCI Controller Selector」を選択
4. 「Cambridge Slilicon Radio, LocationID: 6200000」を選択して「Activate」ボタンをクリック。
5. bluetoothで繋がっていたマウス系が切断されてしまうので、再度ペアリングを行う。

## まとめ
パッケージのどこにもMac対応の文字がなく不安でしたが無事動かす事ができました。
最新のmac製品であればデフォルで４系に対応していますが、長距離のclass1を試したい方は今回と同じ方法で対応する事が出来ると思います。
非同期通信やビデオカメラ使用許諾リクエストのcompletion handlerで気をつけるべきこと

##はじめに
処理実行を行う際に、AppKitやUIKitに対する操作はメインスレッドからの場合しか動作が保証されていないため、メインスレッド以外のスレッドから実行すべきではありません。
自分でスレッドを指定してコーディングをする場合は、この点を注意するのですが、コンポーネントに用意されているメソッドのcompletion handler内での処理で少々つまづいたことがあったため、今後のためのメモとして記載いたします。

##検証環境
以下の環境を使用しています。

* macOS Sierra Version 10.12.6
* Xcode Version 9.0.0 GM
* iOS11.0 GM

##UI要素への直接アクセスを避けるべきcompletion handler
以下のメソッドの場合はcompletion handlerでのUI要素への直接アクセスは避けるべきです。直接UI要素にアクセスした場合、意図しない動作やクラッシュの原因になります。

```Swift:リソースへのアクセス許諾リクエスト
AVCaptureDevice.requestAccess(for: AVMediaType, completionHandler: { (authentication) in   }

PHPhotoLibrary.requestAuthorization { (authorization) in }

let center = UNUserNotificationCenter.current()
center.requestAuthorization(options: .alert) { (authorization, error) in }
```


```Swift:非同期通信
let session = URLSession.shared
let url = URL(string: "https://hogehoge.com")
session.dataTask(with: url!) { (data, response, error) in }
```

例えばですが、`AVCaptureDevice`のrequestAccessには以下のように書かれています。使用許諾でtrueと返ってきた場合にカメラ画面に遷移する、通信結果を元にtableViewのreloadDataを行うなどやってしまいがちかと思いますので、注意が必要かと思われます。

```
The completion handler is called on an arbitrary dispatch queue.
Is it the client's responsibility to ensure that any 
UIKit-related updates are called on the main queue or
main thread as a result.
```

[Apple Document - requestAccess(for:completionHandler:)](https://developer.apple.com/documentation/avfoundation/avcapturedevice/1624584-requestaccess?changes=latest_beta)

##対処方法
mainスレッドで実行するように修正します。

```Swift:sample
AVCaptureDevice.requestAccess(for: AVMediaType.video, completionHandler: { (authentication) in   
            DispatchQueue.main.async {
                let viewController = UIViewController()
                navigationController.pushViewController(viewController, animated: true)
            }
}
```

##その他（Main thread checkerについて）
Xcode9からmain thread checkerが登場し、不正なスレッドでのAppKit, UIKitなどへのアクセスを検知するようになったようです。
[Main Thread Checker](https://developer.apple.com/documentation/code_diagnostics/main_thread_checker)
EXCEL VBAでカラーのセットをセット

# Excel VBAでよく使うカラーのセットをセットする

VBAから色をセットする際にRGB関数を使う。
それほどバリエーションもないし、カラーテーマ的に
セットで書いておければ便利かなと。
ColorIndexでは満足できない人には暇つぶしにセットを作ると
きっと自己満足が得らること請け合い(適当)。


```vbnet

Function func_get_rgb_value(ByVal s_colorname As String) As Long
	Dim f_dict As Object

	Set f_dict = CreateObject("Scripting.Dicionary")

		f_dict("black") = RGB(0, 43, 54)
		f_dict("yellow") = RGB(181, 137, 0)
		f_dict("red") = RGB(220, 50, 47)
		f_dict("blue") = RGB(38, 139, 210)
		f_dict("green") = RGB(133, 153, 0)

	get_rgb_value = f_dict(s_colorname)

	Set f_dict = Nothing	
End Function

Sub test_set_color()

	With ThisWorkbook.ActiveSheet.Cells(1, 1)
		.Font.Color = func_get_rgb_value("black")
		.Interior.Color = func_get_rgb_value("green")
	End With

End Sub

```


#### 思いついたとこ

VBEでインテリセンスに色のキーワードが出ると楽なんだけど
今の方法だと出ない。
関数側にConstとかで登録するほうがいいのか。
でもどう書いたらいいかパッと思いつかない。
ubuntu(16.04)をXクライアントとして稼働する

# やりたいこと

遠隔ホストのXアプリケーションを、ローカルPC(ubuntu)上で表示したい。

# 昔の方法で実行すると失敗した

昔の知識で、以下のように実施してみたが、ローカルPC上でXアプリが表示されない。

1. (ローカルPC上で) $ xhost +
2. (ローカルPC上で) $ ssh -X {Remote-IP}
3. (リモートPC上で) $ export DISPLAY={Local-IP}:0.0
3. (リモートPC上で) $ ./{X-PGM}
4. 以下のようなメッセージが表示され、Xアプリ画面が表示できない。

```
Can't connect to X11 window server using '{IP}:0.0' as the value of the DISPLAY variable.
```

# 調べてみると

ubuntu内の"Xorg"の引数に変なもの(-nolisten tcp)が入っていた。

```
/usr/lib/xorg/Xorg -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt7 -novtswitch
```

どうやら、nolistenがあるので、Xorgポートが外部にLISTENされていないらしい。

# 対応その１(失敗)

まず、文字列nolistenを/etc/内から検索。

```
# egrep -R nolisten /etc/
/etc/X11/xinit/xserverrc: exec /usr/bin/X -nolisten tcp "$@"
```

そして、 /etc/X11/xinit/xserverrcの該当行をコメントした。
が、"Xorg"の引数は変更されず。失敗。

# 対応その2(成功)

```
# ps -ef | egrep 898
root       898     1  0 07:06 ?        00:00:00 /usr/sbin/lightdm
root      1004   898  0 07:06 tty7     00:02:17 /usr/lib/xorg/Xorg -core :0 -seat seat0 -auth /var/run/lightdm/root/:0 -listen tcp vt7 -novtswitch
root      1024   898  0 07:06 ?        00:00:00 lightdm --session-child 12 15
```

Xorgを起動しているのが、lightdmであることが判明
lightdmの設定ファイルに"xserver-allow-tcp=true"を追加。

```
# cat /etc/lightdm/lightdm.conf
[Seat:*]
autologin-guest=false
autologin-user=mishikawan
autologin-user-timeout=0
# ADD
xserver-allow-tcp=true
```

lightdmのリスタート

```
# /etc/init.d/lightdm restart
```
Raspberry Pi 2 model B / DHT11 Temperature and Humidity Module

REF：http://osoyoo.com/ja/2017/07/06/dht11/

### Connection:
| DHT11            |    Broadcom Name   |
|:----------------:|:------------------:|
| GND              |        GND         |
| DATA             | GPIO14(UART TXD)   |
| VCC              |       +3V          |

```:sample
wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_17/dht11.py
vi dht11.py
sudo python ./dht11.py
```
```:result
humidity: 68 %,  Temperature: 27 C
bits: [0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0], length: 40
[68, 0, 27, 1, 96]
humidity: 68 %,  Temperature: 27 C
Data not good, skip
bits: [0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0], length: 40
[68, 0, 27, 3, 98]
humidity: 68 %,  Temperature: 27 C
```
DockerでJenkinsを動かしつつ、JenkinsでDockerコンテナを動かす


このために利用できるDockerfileを作りました。
https://github.com/toto1310/Simple-Jenkins-DooD

## 起動方法
### Dockerイメージを取得するor作る
- Pull

```
$ docker pull toto1310/simple-jenkins-dood
```
↑↑追記　2017/9/20
DockerHubにリポジトリ作りました。ビルドしなくてもpullでイメージとれます。

- Build

```
$ git clone https://github.com/toto1310/Simple-Jenkins-DooD
$ cd Simple-Jenkins-DooD
$ docker build -t toto1310/simple-jenkins-dood .
```

### DockerホストのdockerグループIDを確認する
- Linux

```
$ grep docker /etc/group
```

- Mac

```
$ docker run -it --rm -v /etc/group:/host-etc-group busybox grep docker host-etc-group

docker:x: *DOCKER_GID* :docker

$ DOCKER_GID= *DOCKER_GID*

```

- Windows

```
T.B.D.
```

### Dockerコンテナを動かし、Jenkinsを起動する

```
$ docker run -d --name jenkins \
 -u jenkins:${DOCKER_GID} \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v ${PWD}:/var/jenkins_home \
 -p 8080:8080 \
 -p 50000:50000 \
 toto1310/simple-jenkins-dood
```
しばらく待てば、アクセスできるようになります。 http://localhost:8080

## 仕組み
DooD(Docker outside of Docker)といわれる類のことができるよう作りました。
DooDは、Dockerコンテナの中から別のDockerコンテナを動かしたり、Dockerイメージを作ったりする方法の１つです。
[冒頭のリポジトリ](https://github.com/toto1310/Simple-Jenkins-DooD)では、Dockerコンテナの中にはDocker用のクライアントを使えるようにしてあり、Dockerホストにアクセスして実現します。

似たようなことをDinD(Docker in Docker)でもできます。
違いは、Dockerサーバを持つのか、Dockerクライアントを持つのか、だと理解しています。
具体的には、DinDでは、DockerコンテナがDockerコンテナの中（＝孫コンテナ）で動かすのに対し、DooDでは、DockerコンテナがDockerコンテナの外（＝兄弟コンテナ）で動かします。

今回JenkinsからDockerを使うにあたり、DockerサーバとしてDockerイメージを保持する必要がなく、むしろDockerコンテナ内で複数プロセスが動く気持ち悪さを感じ、DooDの構造にしました。

それぞれのいいトコ／わるいトコは、こちらを参考にすればよいかと思います。
https://jpetazzo.github.io/2015/09/03/do-not-use-docker-in-docker-for-ci/
iOS11で追加されるScreen Recordingについて

###はじめに
iOSDC2017に参加して自分もなにかアウトプットしたい！！！！！！！
と思って温めていたものを書こうと思います。

---
###Screen Recording
iOS11でiPhone単体での画面録画ができるようになりましたね。
NDA違反になるため画面は出せないですが、
設定 > コントールセンター
からコントロールセンターにScreen Recordingのボタンを出せます。

**なんでもかんでも録画されると困る！！！**
という方向けの記事です。

結論から書きますとアプリ側では録画を止めることはできません😇
録画を始めさせないというのも無理です😇

ではどうするか。
ちゃんとApple様は用意してくれています。

iOS11から追加されたプロパティ
Objective-C
```UIScreen.mainScreen.isCaptured```
Swift
```UIScreen.main.isCaptured```

このプロパティは現在録画中か否かを返します。
録画中なら**true**
録画していない状態なら**false**

これで現在の状態を取れるようになったので、
例えば録画されたくない画面などの場合に何らかの対応を入れることができますね。
対応内容はプロダクトによって分かれると思うのでここでは割愛します。

他にもNSNotification.Nameに```UIScreenCapturedDidChange```が
追加されておりこれは```isCaptured```の値が変わったタイミングで通知が送られてきます。
注意する点はあくまでも**```isCaptured```の値が変わったら**通知がくるだけなので、
通知が来たら任意のメソッドに飛ばして```isCaptured```の値を見て処理をする必要があります。

もし他にも対応方法を知っていたらコメント等で教えていただけると幸いです。

---

###あとがき
iOSDC2018楽しみです！！！！！！
Azure DevTest Labにカスタムイメージを持ち込む

# 注意
本記事は執筆時点の情報をまとめているため、Azureのアップデートにより、変更されている可能性があります。
併せて最新の公式ドキュメントをご確認ください。

# 概要
2017/09/04現在、Azure Dev Test Labにカスタムイメージを持ち込むためには、VHDディスクのコピーが必要。
https://docs.microsoft.com/en-us/azure/devtest-lab/devtest-lab-faq#how-do-i-move-my-existing-azure-vms-into-my-devtest-labs-lab

というわけで、下記のVHDファイルを持ち込めるのか、試してみる。
- OSディスク
- データディスク

# 結論
- OSディスクは持っていける
- データディスクは持っていけなかった

# OSディスク
## SAS作成
管理ディスクを使用しているVMからVHDディスクをエクスポートする場合、
Shared Access Signature(SAS)を生成し、コピー元として指定してやる必要あり。
https://blogs.technet.microsoft.com/jpaztech/2017/08/17/export-managed-disks-to-vhd/

## コピー進捗確認
非管理ディスクの場合、

```bash
az storage blob list --account-name <コピー元ストレージアカウント名> --container-name <コピー元コンテナー名>
```

出力結果のcopyプロパティを見ると、最後にコピー操作をした時刻が分かる（未検証）。
https://github.com/Azure/azure-cli/issues/1787

管理ディスクの場合、方法が不明。。。（）

Azureポータルから、DevTest Labs用ストレージアカウントのBLOB、uploadsコンテナを見れば、転送されている事を確認可能

## VHDファイルからカスタムイメージの作成
https://docs.microsoft.com/en-us/azure/devtest-lab/devtest-lab-create-template

アップロードしたVHDファイルをベースにカスタムイメージを作成する。
Azureポータルにて、
[DevTest Labs]-[対象のLabsを選択]-[設定]-[カスタムイメージ]-[追加]
カスタムイメージブレードにて、以下のように設定
- 名前: 必須。Labs環境でのイメージファイル名
- 説明: 任意
- OSの種類: 必須。カスタムイメージに合わせて選択
- sysprep実行/プロビジョニング解除: 任意。実行していればチェック、していなければチェック不要。
  - 実行/解除していないイメージでチェックを入れると、カスタムイメージ作成の段階でエラーが発生するので注意。
  - 実行/解除していないイメージから作成したカスタムイメージでVMを作成した場合、ホスト名などは元の設定が残る模様。
- VHD: 必須。アップロードしたVHDファイルを指定

後、Labs環境でのVM作成時、ベースイメージとして作成したイメージファイルを指定すればOK

# データディスク
OSディスクと同様に、SAS作ってコピー
しかし、Labs環境でVM作成後、既存ディスクとして転送したVHDファイルが出てこない。
カスタムイメージ作成にしか使えない模様？
Azure DevTest Labsまとめ

# 注意
本記事は執筆時点の情報をまとめているため、Azureのアップデートにより、変更されている可能性があります。
併せて最新の公式ドキュメントをご確認ください。

# 料金
ラボ機能自体は無料。
ラボ内に作成した各種リソース（VM、ストレージ、仮想ネットワークなど）は通常通り課金される。

# メリット
ラボ内のリソースについて、利用可能な範囲を制限したり、各リソースのコストを可視化できるため、
意図せず大量リソースをデプロイしてしまい、多額の課金が発生してしまう事態を防ぐ事ができる。
主に検証開発環境での利用を想定

# 仮想ネットワークの管理
https://docs.microsoft.com/ja-jp/azure/devtest-lab/devtest-lab-configure-vnet

## 仮想ネットワークに関する注意
Labsを作成した際、自動的にデフォルトの仮想ネットワーク等が作成されるが、
同一サブスクリプションに存在する既存の仮想ネットワークに割り当てたアドレスレンジは考慮されず、固定のアドレスレンジ(10.0.0.0/20?)が割り当てられる。

**もしDevTest Labs用の仮想ネットワークが既存の仮想ネットワークのアドレスレンジと重なっている場合、仮想ネットワーク同士を接続できなくなるので注意すること。**
必要であれば、別途DevTestLabs用の仮想ネットワークを手動で作成し、使用可能。

VM作成時、IPアドレスの構成を「共有」にした場合、グローバルからSSH接続する際、ランダム？に割り当てられたハイポートでアクセスする必要がある。
** SSHクライアント環境によっては、上位FWのポリシーでハイポートが落とされてたりするため、アウトバウンドのポリシーをチェックしておく事**
Azure Cloud Shell(Public Preview)まとめ

# 注意
本機能はプレビュー段階であり、今後仕様が変更される可能性があります。
本記事の内容はあくまで執筆時点の情報になります。
併せて最新の公式ドキュメントをご確認ください。

# 概要
Webブラウザ上で動作するコマンドライン環境
Azureポータルから起動
Azure CLI 2.0環境を完備
最大容量5GBのAzureファイル共有領域（$HOMEディレクトリの永続化に使用）

# 利点
- ローカルコンピュータの環境に左右されず、オペレーション可能
- 自動認証（ログイン中のアカウントで認証）
- VM作成時に自動生成されたSSHキー登録
- Azureポータル画面を見ながらCLI操作
  - CLI操作の結果を同じウィンドウで視覚的に確認できるため、このメリットは意外と大きい。

# 料金
シェル環境のコンピューティングは無料
ただし、$HOMEを永続化するためにストレージを使用するため、その分の使用量は発生する。

# 推奨ブラウザ
公式には以下のブラウザを推奨。
- Chrome
- Edge
- Safari

** FirefoxやIEも動作サポート対象だが、一部機能が正常に動作しない事あり（例えば、シェルへのコピペが出来ない等）。**
試しにFirefoxで動かしてみた所、最初のストレージアカウント作成に関するウィザードが出てこず、先に進めなくなった。

# 操作
## $HOMEとファイルをやり取りしたい。
$HOMEディレクトリと同期しているAzureファイル共有領域は、通常のAzureファイル共有と同様に、Azureポータルからアクセス可能。そこへアップロード/ダウンロードすればOK
https://docs.microsoft.com/ja-jp/azure/cloud-shell/persisting-shell-storage#transfer-local-files-to-cloud-shell


# 参考リンク
Azure Cloud Shell (プレビュー) の概要
https://docs.microsoft.com/ja-jp/azure/cloud-shell/overview

Azure Cloud Shell の機能とツール
https://docs.microsoft.com/ja-jp/azure/cloud-shell/features

Azure Cloud Shell でファイルを永続化する
https://docs.microsoft.com/ja-jp/azure/cloud-shell/persisting-shell-storage
Pythonでのモンテカルロ法の実装を手抜きで速くする．

#本日は

モンテカルロ法を実装したコードを早くしてみましょう．

```py3
import random
NUM=100000000
def monte():
    counter = 0
    for i in range(NUM):
        x = random.random()
        y = random.random()
        if x*x+y*y < 1.0:
            counter += 1
    pi = 4.0*counter/NUM
    print(pi)


def main():
    monte()

if __name__ == '__main__':
    main()
```

```shell-session
$ time python monte.py
real	1m37.223s
user	1m35.556s
sys	0m0.636s
```
自分の環境ですと100秒ほどかかるのでやってられないです．

## Cython　を使いましょう．

明らかに型はこれだろ！ってのをコンピュータに教えます．そして型推定する時間を省くことにします．

```cython
#monte.pyx
import random

cdef int NUM = 100000000

cdef cmonte():
    cdef :
        int counter = 0
        int i=0
        double x
        double y
    for i in range(NUM):
        x = random.random()
        y = random.random()
        if x*x + y*y < 1.0:
            counter += 1

    cdef double pi = 4.0*counter/NUM
    return pi

def monte():
    pi=cmonte()
    print(pi)
```

`pyximport`　を使って通常のPythonのモジュールのようにインポートできるようにします．

```py3
#main.py
import pyximport
pyximport.install()
import monte
import time

print("start")
s=time.time()
monte.monte()
e=time.time()
print("elapsed",e-s)
```

```shell-session
$ time python main.py
start
3.14175328
elapsed 17.078665018081665

real	0m17.540s
user	0m17.211s
sys 	0m0.158s
```

型つけのヒントがあるかないかで全然違ってきます．　
補足記事にてもっと速くしました↓
[Cython手抜き実装のモンテカルロ法のスピードを速くする．](http://qiita.com/SatoshiTerasaki/items/0da978c14cbe2a12ebaf)

## Numpy を使いましょう．

for 使ってるのがいけないんや．．． Numpy の配列を一気に生成して
各成分の二乗和を求めて　1．0 未満の部分だけをカウントすればOKという方式

```py3
import numpy as np
NUM=100000000

def no_for():
    xs = np.random.rand(NUM)
    ys = np.random.rand(NUM)
    square = xs*xs+ys*ys
    counter = np.sum(square < 1.0)
    pi = 4.0*counter/NUM
    print(pi)

def main():
    no_for()

if __name__ == '__main__':
    main()
```

```shell-session
$ time python monte.py
real	0m10.838s
user	0m5.213s
sys 	0m3.200s
```

かなりましになりました． 書き方の違いはあれど結果だけ見るとCythonの呼び出しよりも速くできますね．
forを書かずにできるような方法があればこちらの方が良いということでしょうか．

## Numba　の力を借りる
JITコンパイルさせれば．．．

```py3
import numpy as np
from numba import jit

NUM=100000000

@jit
def jit_no_for():
    xs = np.random.rand(NUM)
    ys = np.random.rand(NUM)
    square = xs*xs+ys*ys
    counter = np.sum(square < 1.0)
    pi = 4.0*counter/NUM
    print(pi)

def main():
    jit_no_for()

if __name__ == '__main__':
    main()
```

```shell-session

$ time python monte.py
real	0m5.836s
user	0m3.922s
sys 	0m1.497s
```

よし，早くなりました．

## 実は．．．

元々のloopのコードに対してJITコンパイルをかけます．

```py3
import random
from numba import jit

NUM = 100000000

@jit
def jit_for():
    counter = 0
    for i in range(NUM):
        x = random.random()
        y = random.random()
        if x*x + y*y < 1.0:
            counter += 1

    pi = 4.0*counter/NUM
    print(pi)

def main():
    jit_for()

if __name__ == '__main__':
    main()
```

```
time python monte.py
real	0m3.122s
user	0m2.855s
sys 	0m0.162s
```

ええ．．．結果的にはこの例では@jitのデコレータをつければよかったというオチです．

このケースではNumbaが勝ちましたが，ケースによってはNumpyで書いた方が勝つという場合もありますので，Numbaが最強というわけではないです．最適化できない場合は逆にJITのコストで遅くなることもあるので，`@jit` つければいいや．．．というものでもないです．　オールマイティで見ればNumpyが使いやすいですね．　Cythonはまだ勉強不足なので高速化の手段の一つとして勉強の一歩とできればと思います．

以上手を抜いて結構速くすることができました．
スクロールバーで横幅がずれる


# 経緯

現在、以下のような環境でフロントエンドのサイトを作成しています。

|名称|バージョン|
|:--|:--|
|Vue.js|2.3.4|
|Element UI|1.4.4|
|Element Theme Default|1.4.4|1

※ 他にもありますが、ここでは省略。ブラウザはiOSのChrome。

# ハマり事象

私がハマった事象の概要は、「ElementUIのダイアログを開くと、fixedされているヘッダーが15pxくらい横に動く。（ダイアログを閉じた時も動く）」というものです。


これは、以下の条件の場合に発生します。

1. ダイアログの裏のメインコンテンツが垂直方向のスクロールを表示している場合
1. ElementUIのダイアログを、`modal: true`かつ`lock-scroll: true`（要はデフォルト）で開いた場合
2. Flexboxなどでメインコンテンツを中央寄せしている場合
1. **メインコンテンツのヘッダーやナビゲーションを`position: fixed`していた場合**

ソースコード例は以下のような感じとします。

```html:index.html
<html>
  <head>
  <!--省略-->
  </head>
  <body>
    <div id="app">
      <header>
        <p>ヘッダー</p>
      </header>
      
      <main>
        <p>メインコンテンツ</p>
        <el-button type="primary" @click="enabledDialog = true">
          ボタン
        </el-button>
        
        <el-dialog title="ダイアログ" :visible.sync="enabledDialog">
          ダイアログの中身
        </el-dialog>
      </main>
    </div>
  </body>
</html>
```

```js:app.js
window.Vue = require('vue');

import ElementUI from 'element-ui'
import locale from 'element-ui/lib/locale/lang/ja'
import 'element-theme-default/theme/index.css'
Vue.use(ElementUI, {locale})

const vm = new Vue({
  el: '#app',
  data: {
    enabledDialog: false
  }
})

```

```scss:app.scss
header {
  height: 40px;
  position: fixed;
  width: 100%;
  z-index: 10;
}

main {
  // ヘッダーの分だけ余白を取る
  padding-top: 40px;
}

body {
  // スクロールの出る画面と出ない画面でずれるのを防止するため出しっ放しにする
  overflow-y: scroll;
}
```

という感じです。良くあるヘッダー固定の構成です。

# 要因

ElementUIのダイアログを上記のオプション指定で開くと、ダイアログの裏のコンテンツのスクロールバーを`overflow: hidden`にしてくれます（`body`タグのスタイルに追加する）。
こうすることで、ダイアログ内をスクロールした時に、裏のコンテンツのスクロールが動くといった問題を解決できます。

また、同様に`padding-right: 15px`も`body`タグにスタイル指定しています。
これは、スクロールバーの幅が15pxくらいなので、メインコンテンツの**スクロールバーを消す分を打ち消しています。**

しかし、この`padding-right`は、`position: fixed`であるヘッダーには機能せず、ヘッダーだけがスクロールバーが消える分を打ち消せずにずれてしまうわけです。

# 解決策

[スクロールバーの幅に依存しないスタイル指定](http://qiita.com/nanocloudx/items/0efba5d35fe5a4cc7230)

上記を参照し、修正した結果のコードは以下のようになりました。
※ Sassのみの変更


```scss:app.scss
header {
  height: 40px;
  position: fixed;
  // width: 100%;
  width: calc(100vw - 15px); /* 追加 */
  z-index: 10;
}

main {
  // ヘッダーの分だけ余白を取る
  padding-top: 40px;
}

body {
  // スクロールの出る画面と出ない画面でずれるのを防止するため出しっ放しにする
  overflow-y: scroll;
  width: calc(100vw - 15px); /* 追加 */
}
```

以上。
【GAS@SpreadSheet】自作関数で入力時刻を自動的に入力

業務上でレコードの入力時刻が要求される場合があります。
一つ考えられるのは、あるセルに値が入りましたら、「入力時刻」一覧（仮）に時刻を自動的に入力する**自作関数**を作成する方法です。サンプルコードは以下にご参考ください。

```code.gs
function setCurrentTime(value) {
  if (value) {
    var ctime = new Date();
    var hh = ctime.getHours();
    var mm = ctime.getMinutes();
    var t = hh+":"+mm;
    return t;
  }
}
```
**自作関数**が作成しましたら、スプレッドシートで下図のように関数をセルに入力します。
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/194463/1f1f810e-960f-1b95-f79c-44bcd7f84019.png)

上記のコードは、シートをリロードする際に時刻も更新するとの点について考慮しないので、一旦下記のコードに修正しました。
使い方については、セルに次の式を入力 =setCurrentTime_R(A1, "B1")。
■ "B1"は、時刻を表示するセルに該当する。

```code_r.gs
function setCurrentTime_R(value, index) {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var str_time = sheet.getRange(index).getValue();
  var str_input = value;
  var temp = "";
  
  if ((value) && (str_time != "")) {
    var ctime = new Date();
    var hh = ctime.getHours();
    var mm = ctime.getMinutes();
    var t = hh+":"+mm;
    return t;
  } else {
    return temp;
  }
}
```
mdbファイルを使ってSQLの練習をしよう。

VBSで簡単にSQLが操れるインタープリタのウインドウを作りました。
ACCESSのmdbファイルが必要です。
一応、Vecterの[「SQL実習キット」ページ](http://www.vector.co.jp/soft/win95/edu/se479341.html)からアプリとサンプルデータベースと手引き書をダウンロードできます。
![AccessPractice1.jpg](https://qiita-image-store.s3.amazonaws.com/0/147091/9d68be7d-edcf-3456-d0cf-dad893830e7a.jpeg)
なお、打ち込んだＳＱＬ文にエラーがあると、打ち直して実行ボタンを押してもこのページは反応しなくなるので、ページを閉じてから、再実行して下さい。

```アクセスデータベースSQL操作画面.hta
<html>
<head>
  <title>アクセスデータベースSQL操作ページ</title>
  <HTA:APPLICATION SHOWINTASKABAR="no"
                   WINDOWSSTATE="maximize" />
    <style type="text/css">
        #Text1
        {
            margin-bottom: 0px;
        }
        #MdbFile1
        {
            height: 19px;
        }
    </style>
   <script language="vbscript">
    <!--
'  ACCESSデータベースSQL操作ページ
'  開発日　平成21年10月5日
'  開発者　海星  E-mail:seastar@orion.nifty.jp
'  copyright 2009 Hitode all rights reserved
    Option Explicit
    On Error Resume Next
    Dim DBPath,SQL1
    Dim Dbmei
    Err.Clear
    DBMei="取引.mdb"
Sub load1()
    DBMei="取引.mdb"
    With CreateObject("Scripting.FileSystemObject")
    	DBPath = .GetFolder(".").path & "\" & DBMei
    End With
'	msgbox DBPath
    Form1.MdbFile1.value = DBPath
End Sub

Sub Syori()
'  DBMei=form1.MdbFile1.value
' 取引データベース
  With CreateObject("Scripting.FileSystemObject")
	DBPath = form1.MdbFile1.value
  End With
  With CreateObject("ADODB.Connection")
	.Provider = "Microsoft.Jet.OLEDB.4.0"
	.Open DBPath
' ＳＱＬ文の代入
'	SQL1 = "SELECT * FROM 現金出納帳テーブル WHERE 日付<DateSerial(2009,12,31);"
    SQL1 = form1.TextSQL1.Value
'	MsgBox .Execute(SQL1).GetString(, , , vbLf)
	document.getElementById("SQL-Kekka").innerText = .Execute(SQL1).GetString(, , , vbLf)
    If Err.Number<>0 Then MsgBox Err.Description,,"ＳＱＬ実行時エラー"
	.Close
  End With
End Sub
Sub JikkouButton1_onClick
    Syori()
End Sub
   </script> 
</head>
<body onLoad="load1()" bgcolor="#FFFFCC">
  <h1 align="center">アクセスデータベースSQL操作ページ</h1>
<form id="Form1">
<p>
　操作するアクセスデータベースファイルのパス　<br />
    <input id="MdbFile1" type="file" size="120" /></p>
<p>
　実行させたいＳＱＬ命令　<br />
    <textarea id="TextSQL1" cols="80" name="TextSQL1" rows="10"></textarea></p>
<p>
    <input id="JikkouButton1" type="button" value="　ＳＱＬ実行　" /></p>
</form>
<div id="SQL-Kekka">
ここに結果を表示します。
</div>
</body>
</html>

```
Reactアプリ(with Redux)のディレクトリ構成

参考：　http://razokulover.hateblo.jp/entry/2017/08/28/173807

Reduxのチュートリアルとか見てると、よく垂直分割を見るけど、水平分割の方が良いのかなとか
それぞれ、どんなメリット、デメリットがあるのか調べよーと

## 垂直分割
レイヤーで分ける。

<img width="492" alt="スクリーンショット 2017-09-17 21.13.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/e227a726-b57c-b458-c93f-2c870962cb0c.png">

## 水平分割
コンポーネントや機能で分ける。
Angularとかはデフォルトこっち側な感じだったはず。
すぐ下にテストファイルとかあって、個人的にはこっち派ですかね

<img width="474" alt="スクリーンショット 2017-09-17 21.13.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/132777/01a8c368-38d1-53a0-d7f6-3b22cb30718f.png">
C++でのモンテカルロ法の実装例 

# 本日は

モンテカルロ法C++での実装です．　あくまでも例ですので，参考程度に．．．OTL

## 書いてみましょう
```C++
//monte.cpp
#include <iostream>
#include <random>
using namespace std;

#define NUM 100000000

int main(int argc, char const *argv[])
{
    random_device rnd;
    mt19937 mt(rnd());
    uniform_real_distribution<double> score(0.0,1.0);
    double x, y;
    int counter=0;
    for(int i=0;i<NUM;i++){
        x=score(mt);
        y=score(mt);
        if(x*x + y*y < 1.0){
            counter++;
        }
    }
    double pi=4.0*counter/NUM;
    printf("%f\n",pi );
    return 0;
}
```

乱数はどうやってやるけまと調べたところ
　[Siv3D 開発ブログ C++11 の乱数ライブラリ <random>](http://siv3d.hateblo.jp/entry/2013/02/17/231829)
にたどり着きましたのでこれを参考にしました．

## 動かしましょう．

SublimeTextでの動作例です．
<img width="685" alt="スクリーンショット 2017-09-17 20.46.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/135978/de72fd03-30c2-9a17-ac68-b80d663a15b1.png">

## 最適化オプションを使う．

最適化オプションをつけましょう．
最適化オプションの種類の例として
[最適化オプション込みのGCCとClangベンチマークの結果は?](http://news.mynavi.jp/news/2016/03/05/127/)
を参考にしました．

```sh
$ clang++ -o monte -O1 monte.cpp
$ time ./monte
real	0m4.967s
user	0m4.869s
sys	0m0.033s
```
```sh
$ clang++ -o monte -O2 monte.cpp
$ time ./monte
real	0m3.965s
user	0m3.861s
sys	0m0.036s

```

```sh
$ clang++ -o monte -O3 monte.cpp
$ time ./monte
real	0m3.276s
user	0m3.219s
sys 	0m0.021s

```

```sh
$ clang++ -o monte -Ofast monte.cpp 
$ time ./monte 
real	0m3.276s
user	0m3.218s
sys 	0m0.018s
```

PCはMacBook12-inchの初代です．　だいたい3秒ほどかかります．
世界で最もシンプルなテスト支援ツール Chibineko を Docker 上で動かしてみた

# 経緯

仕事がテスト関係なので、テストツールに興味があり、Test Linkを使用しているのですが、それ以外になにか無いかなと定期的に調べている中で、以下の記事を一年前に見つけ、興味を持っていました。

http://qiita.com/tabbyz/items/6513e84f319843c316d5

いつか使ってみたいなと思っていたのですが、なかなか時間が取れていませんでした。そして、最近になってようやく時間が取れるようになったので、試してみた次第です。

ただ、サービスを使うだけであればすでに作者がサービスを立ち上げていらっしゃいますので、技術的な要素はなにもありません。

https://chibineko.jp/

また、仕事で使う上で、できればオンプレミスで動かしてみたいという気持ちがあり、今回はDocker上で動かしてみようと思い立ち、実行しました。

# Dockerfile

```Dockerfile
FROM ubuntu:16.04

WORKDIR /root
RUN apt-get update
RUN apt-get -f install
RUN apt-get install -y git libpq-dev libsqlite3-dev tzdata ruby-dev build-essential
ENV CONFIGURE_ARGS with-pg-include=/usr/include/postgresql/
RUN git clone https://github.com/tabbyz/chibineko
WORKDIR /root/chibineko
RUN sed -i -e "s/^ruby.*/ruby '2.3.1'/g" Gemfile
RUN gem i bundle
RUN bundle install
ADD mailer.yml /root/chibineko/config/
RUN rake db:migrate
RUN rake db:seed

EXPOSE 3000

CMD ["rails", "s", "-b", "0.0.0.0"]
```

Chibineko では Gemfile中で `pg` と `sqlite3` を使用しているので、先に`apt`で`libpq-dev`と`libsqlite3-dev`をインストールしています。

また、`rake db:migrate`の段階でタイムゾーン系のエラー(http://qiita.com/74th/items/33e05b6c823f64eaf6d0) が出るので、追加で`tzdata`をインストールしています。

あとは、`ruby-dev`を`build-essential`をインストールしていますが、これはrails を使っているからですね。bundle install するときに native build を行う必要もあります。ですのでインストールしています。

`pg` gem モジュールも native build が実行されるのですが、その途中でエラーになってしまいます。理由は`libpq-fe.h`を発見できない為に発生するようですので、bundle install する際のincludeパスをCONFIGURE_ARGSを設定することで追加してあげます。

その後、chibinekoのセットアップですが、ubuntu:16.04でインストールされるrubyのバージョンが2.3.1なので、Gemfileの中のrubyバージョンを2.3.0から2.3.1に変更します。

その後は、mailer.ymlをコンテナ内にコピーして、所定の手順を踏んでいるだけですね。

ただ、一点注意していただきたいのは、このDockerfileはenvironmentが`development`でしか動かないという点です。なぜなら、`production`では`postgresql`を使用しているんですが、今回はpostgresqlのコンテナは動作させていないからです。

# mailer.yml

mailer.yml の設定はChibinekoのgithubページのREADMEに記載してある通りですね。

https://github.com/tabbyz/chibineko#configure-email

それをDockerfileと同じディレクトリに配置していただければ問題ないと思います。

# 実行

以下を実行していただくと、docker上でChibinekoが動作します。

```bash
$ docker build . -t chibineko
$ docker run --rm -p3000:3000 --name chibineko -t chibineko
```

# 使用感

フロントページにもある通り、「世界で最もシンプルなテスト支援ツール」という感じです。無駄な部分はそぎ落として、必要な情報のみを提供している。といったところでしょうか。

プロジェクトに属さないテストケースを作成できたり、テスト結果に実施者や実施日付がないのは新鮮だなと思ったのと、テスト仕様書とテスト実施が分かれていないという点もシンプルさにこだわっている点だと思いました。また、OK/NG/保留だけでなく、対象外の結果が残せるのはTest Linkに無い点だなとも思いました。

チームでの使用も想定されているので、単純なプロジェクトであれば十分使用できるのではないでしょうか。もし、別媒体でレポートが必要な場合はcsvにも吐き出すことができるため、そのデータをEXCEL等で整形しレポートすることも可能です。

# まとめ

ChibinekoをDocker上で(開発環境であるが)動かしました。
少しだけですが使用してみて、使用感をTest Linkと比較しました。
モンテカルロでNimってみよう


# はじめてのQiitaデビューです．
お勉強のがてらモダンな言語にトライしていきたいと思います．

# 本日はNim
本日はNimでよくあるモンテカルロ法を書いてみます．

[Nim](https://nim-lang.org/) はプログラム言語の一つです．　
見た目 Python っぽくかけて C /C++ に近い速度を出すというロマンあふれる言語です．

知ったっきっかけは下記サイト偶然のぞいてからです．
[この頃 流行りの 言語たち（他）でベンチマーク （Dart, Go, Julia, Nim, Python, Rust 他）](http://h-miyako.hatenablog.com/entry/2015/01/23/060000)

## 書いてみやう（Nim)
ららららと書いてこんな感じになります．

```nim
#monte.nim
import random
import system

const NUM=100000000

if isMainModule :
  var x,y:float64
  var counter=0
  for i in countup(0, NUM):
    x=random(1.0)
    y=random(1.0)
    if x*x+y*y < 1.0:
      counter+=1

  var pi=4.0*float64(counter)/float64(NUM)
  echo pi
  system.programResult = 0
```

varで変数を宣言するという部分を無視するとなんとなくPythonっぽいですね．　

##　書いてみやう(Python)

```py3
#monde.py
import random
NUM = 100000000

def monte():
    counter = 0
    for i in range(NUM):
        x = random.random()
        y = random.random()
        if x*x+y*y < 1.0:
            counter += 1
    pi = 4.0*counter/NUM
    print(pi)

def main():
    monte()

if __name__ == '__main__':
    main()
```

あまり変わらないですよね．これがNimのウリの一つだと思います．

## 皆さんも書いてみましょう
### SublimeText
Editorは各自好みのものを選べば良いでしょうが，ここではSublimeTextを使ってみます．
`Cmd＋Shift+p`　を押してパッケージコントロールのインストールを選択してNimと打つと必要な `NimLime` というパッケージが出てきますのでそれをインストールしましょう． SublimeTextを再起動してNimのコードを入力するとコードがシンタックスハイライトされます．　保存するたびにシンタックスのチェックが入ってここがおかしいよなどと教えてくれます．

### 動かしてみましょう． 
Nimはインストールしておきましょう．話はそれからです．

一番楽なのはMacの人は`brew install nim` で．
Windowsの人は素直に公式ホームページのインストール方法に従えば良いです．

追記（2018/06/28）：Linux,Macのインストールは https://github.com/dom96/choosenim の choosenim を使うと便利です。

実行は簡単でCmd+Bでビルドと実行をしてくれます．楽ですね．

## 動作例（Nim)

下の添付のようになります（Nim Version 0.17.0 MacBook 12-inch 初代）．
 <img width="505" alt="スクリーンショット 2017-09-17 19.46.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/135978/65c95426-4986-07d4-8ecc-d3b1638f8f26.png">
## 動作例(Python)
下の添付のようになります（Python 3.5.2　MacBook 12-inch 初代）．
<img width="357" alt="スクリーンショット 2017-09-17 19.52.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/135978/b87f5790-9dbd-c154-ad75-3ea872ee6891.png">

Nim速いですね（にっこり）．

## モットハヤクデキマスヨネ？

オッシャルトオリデスネ．　最適化オプションを使いましょう．
そしてtimeで測ってみましょう．

> $ nim c -d:release monte.nim
> $ time ./monte


<img width="186" alt="スクリーンショット 2017-09-17 20.04.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/135978/9e3d782d-d5ad-d5e6-3d16-8c9b327362c9.png">

ほらほら．速くなりました．

## Python「ゲセヌ」

100秒もかかってるとやってられないので，　これについてはまた今度触れる予定です．
[こちらに書きました．](http://qiita.com/SatoshiTerasaki/items/8fe51a21590582ee873e)

##　C++の場合

興味があれば是非トライしてみてください．
私の環境では素直に書いてclang++による最適化オプションを込みで3秒ほどかかります．
[こちらに書きました]
(http://qiita.com/SatoshiTerasaki/items/08c7c3e7e21b706c3205)

# その他のReference
モンテカルロ法やPython, Go での実装例については
[1] [GoとPythonとGrumpyの速度ベンチマーク ～Googleのトランスパイラはどれくらい速い？～](http://qiita.com/kotauchisunsun/items/db28d14f7f13fb29e5f9)
などを参考にすると良いです（この記事自体はトランスパイラに主眼を置いています）．
そして調べて見るとわかるのですが[1]に対する追加検証として，　
[2] [Re: GoとPythonとGrumpyの速度ベンチマーク](https://shogo82148.github.io/blog/2017/05/30/grumpy/)
なる記事も存在します．　残念ながら私の環境ではGrumpyが動きませんでした．．．
Pythonの変数アノテーション

変数アノテーションとはPythonで変数の型を明示的に書く方法。
よく忘れるので書き方をメモしておく。

# 基本

```py3
def test_func(x: bool, y: str)-> int:
    if x == True:
        return 0
    if y == "a":
        return 1
    return -1
```

# リスト、タプル

```py3
from typing import List
from typing import Tuple

def test_func(x: List[int, int])-> Tuple[float, float]:
    return (x[1] + 0.5, x[0] - 0.5)
```
Laravelでwithしたモデルのwithも取ってくる

# 何がしたかったか

タイトルの通り、withで取得した先のmodelのwithも取得したかったんです。

例を挙げると、

- ユーザーが記事を投稿する
- 他のユーザーはその記事に対してコメント出来る

こんな要件があった場合で、対象となるモデルが

- User
- Article
- Comment

だったとします。

そこで、 `記事とそれに紐づくコメント情報を取得したい`場合、withを使って

```php:Article.php
public function comments()
{
    return $this->hasMany('App\Models\Comment');
}
```

としておいて、

```php
$article = Article::with('comments');
```
で取得出来ると思いますが、今回はCommentを書いた人の名前も一緒に取得したかったんです。

# 前提

Laravel5.5

# どうやったか

withで取得した先のwithを取ってきました。


```php:Article.php
public function comments()
{
    return $this->hasMany('App\Comment');
}
```

```php:Comment.php
public function user()
{
    return $this->belongsTo('App\User');
}
```
としておいて、

```php
$article = Article::with('comments')
    ->with('comments.user');
```

で、articleの中にcommentsが入っていて、commentsの中の各commentにuserが入った状態のデータを取得出来ました。

# さいごに

今まで単純なものしかwithで取ってくることなかったんですが、これである程度入れ子のデータを取りたくなってもwithで行けるなと安心しました。
JavaBasePlugin がみつからなくてGradleでJUnit5が実行できなくなった


apply plugin: 'org.junit.platform.gradle.plugin' を追加したら以下のようなエラーが出た。

```
FAILURE: Build failed with an exception.

* Where:
Build file '/Users/eiel/Documents/ghq/github.com/junit-team/junit5-samples/junit5-gradle-consumer/build.gradle' line: 23

* What went wrong:
A problem occurred evaluating root project 'junit5-gradle-consumer'.
> org/gradle/api/plugins/JavaBasePlugin

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

* Get more help at https://help.gradle.org
```

~/.gradle を削除したら、治った。
ChromeでPCからスマホサイトを表示

ChromeでPCからスマホサイトを表示する方法です。

#環境
Windows 10
Chrome 61.0.3163.91

#手順
Chromeでサイトを表示（今回はYahooで試してみました）

https://www.yahoo.co.jp/
![aaa.png](https://qiita-image-store.s3.amazonaws.com/0/112075/5fe8bb02-2c3f-54a7-3305-be27a5d77f56.png)

F12キーを押してデベロッパーツールを起動

![ccc.png](https://qiita-image-store.s3.amazonaws.com/0/112075/c82517d7-8aad-530d-45df-8a7282bab251.png)

ツールバー左上のこのボタンを押します
![ddd.png](https://qiita-image-store.s3.amazonaws.com/0/112075/c9bf0910-570a-a3b1-fcca-040ab716ae6e.png)

サイトがスマホで表示されたように小さくなりますが、まだスマホのサイトは表示されません。

![bbb.png](https://qiita-image-store.s3.amazonaws.com/0/112075/2aa8fce3-20b3-6baf-d060-709b7bcee960.png)

左上からデバイスを選択します。（今回はiPhone6を選択）

![ggg.png](https://qiita-image-store.s3.amazonaws.com/0/112075/a634de13-170f-a136-7e56-17e690a9ea76.png)

F5キーを押してページを更新するとスマホのサイトが表示されます。

![eee.png](https://qiita-image-store.s3.amazonaws.com/0/112075/ec17847b-84e5-9a60-7989-093372c7648f.png)

以上です。


選択したHTML要素が画面上のどこか確認することができたりします。

![fff.png](https://qiita-image-store.s3.amazonaws.com/0/112075/d0f2cb62-9f19-7968-ff3c-6b067640519c.png)
matplotlibでグリッドを残したまま目盛りの値表示を消す方法


# 問題点
matplotlibで単に`grid()`によりグリッドを表示すると
目盛りが表示されている箇所にしか線を引いてくれません

```python
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 2 * 100 + 1)
f = sin(x)

plt.rc('font', family='serif')
plt.figure()
plt.ylim([-1.5, 1.5])
plt.plot(f, color='black')
plt.grid()
plt.show()
```

![例1.png](https://qiita-image-store.s3.amazonaws.com/0/64633/1881a165-b77c-15d0-3a72-bfbd24c34853.png "例1.png")

このグラフに対し、x軸に5刻み、y軸に0.1刻みの線を追加したいとします。
gridは「目盛りが表示されている箇所に線を引いてくれる」ので`xticks`及び`yticks`を用いて目盛りを増やしてみると

```python
plt.rc('font', family='serif')
plt.figure()
plt.ylim([-1.5, 1.5])
plt.plot(f, color='black')

# 5刻みに目盛り表示
plt.xticks(list(filter(lambda x: x%5==0, np.arange(201))))
# 0.1刻みに目盛り表示
plt.yticks(list(map(lambda y: y*0.1, np.arange(-15,15))))

plt.grid()
plt.show()
```


![例2.png](https://qiita-image-store.s3.amazonaws.com/0/64633/05222796-a4fa-246d-5241-a666b5ef4725.png "例2.png")

というように表示はされるものの目盛りの値表示がひどく見づらくなってしまいます



# 解決策
そもそもとして、matplotlibの目盛りには大目盛りと小目盛りが存在し、目盛りの値は大目盛りにのみ表示されます。
`xticks`と`yticks`では大目盛りの表示を操作していたので、
今回は`set_minor_locator`により小目盛りの表示を操作することで
「グリッドを残したまま目盛りを消す」ことを実現させます

```python
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tick # 目盛り操作に必要なライブラリを読み込みます

x = np.arange(0, 2 * 100 + 1)
f = sin(x)

plt.rc('font', family='serif')
plt.figure()
plt.ylim([-1.5, 1.5])
plt.plot(f, color='black')

# x軸に5刻みにで小目盛り(minor locator)表示
plt.gca().xaxis.set_minor_locator(tick.MultipleLocator(5))
# y軸に0.1刻みにで小目盛り(minor locator)表示
plt.gca().yaxis.set_minor_locator(tick.MultipleLocator(0.1))

# 小目盛りに対してグリッド表示
plt.grid(which='minor')

plt.show()
```


![例3.png](https://qiita-image-store.s3.amazonaws.com/0/64633/435fd25e-f381-15f8-ee6f-a68f3534b019.png "例3.png")
このようにグリッドは小刻みに表示しつつ、目盛りの部分はスッキリさせることができます
Windows10 64bit でgitBashやSourceTreeがやたら遅い　重い

なぜかgit GUIクライアントのSourceTreeやコンソールからgitを使用するgitBashがやたら遅くなる。
gitBashのコンソールが起動するのも遅いし、起動したあともただEnterキー押しただけなのに
シェルに戻ってくるまで時間がかかる。
SourceTreeもステージングやコミット、差分の検出がとても実用に耐えないほどクソ遅い。
どうしたもんかと検索しても合致する現象が出てこない。
英語ならどうかなと[gitBash Windows10 very slow]で検索してみたら
同じ現象のがあった

https://stackoverflow.com/questions/42888024/git-bashmintty-is-extremely-slow-on-my-windows-10

「Disabling AMD Radeon graphics driver in the Windows device manager」
AMD Radeon graphics driverを無効にすればいいらしい。
こんなんで治るんかいなと思ったがとりあえずやってみる。
デバイスマネージャを開いてドライバを無効にする。
![デバイスマネージャ.png](https://qiita-image-store.s3.amazonaws.com/0/151329/d69d0234-c626-fc5d-047f-43467754cb29.png)

、、、、、治った！

gitBashもSourceTreeもサクサク動くようになりました。

git使うときはこのドライバOFFにしておけばとりあえず大丈夫か
にしてもgitBashにしろSourceTreeにしろ3D機能グリグリ使ってるわけでもないんだけどなあ


2017年12月27日追記
デバイスマネージャからデバイスの更新を選択したところ
ドライバの更新が始まった。更新後はAMD Radeon graphics driverを有効にしたままでもgitBashやSourceTreeを
サクサク使えるようになりました。

![driverinstall.png](https://qiita-image-store.s3.amazonaws.com/0/151329/cf927623-b02a-ef30-7de8-5fb4515aec8c.png)