OmniAICreator/Qiita-1.07M huggingface dataset:
UnityでOculusGoのVRゲームを作った時のTips

UnityでVRゲームを初めて作成した時に参考にしたサイトやつまったところを
共有するために残しておきます．

#OculusGoでビルドする

Unityで作成したプロジェクトをOculusGoでビルドするためには特に難しいことはなく．
Androidでビルドする環境を構築すればビルドすることができます．

参考:[UnityでOculus Goの開発環境をセットアップしてみた](https://www.yoshidayo.com/entry/2018/05/09/103503)

#コントローラーを表示する

参考:[【Unity / Oculus Go】Oculus Goコントローラー表示方法とボタン取得方法](http://rikoubou.hatenablog.com/entry/2018/06/04/193607)

#コントローラーでオブジェクトを操作する．

参考:[Oculus Go開発【コントローラー表示、クリック反応、移動、ポインタ、uGUI】](http://bibinbaleo.hatenablog.com/entry/2018/05/14/171744)

#コントローラーでGUIを操作する．

uGUIを操作するには追加で捜査する必要があります．

参考:[Oculus Go 開発メモ - uGUI編](https://qiita.com/JunSuzukiJapan/items/bead777e8dfeaa49ea30)

このサイトでは眉間からrayをとばしてuGUIを操作していますがコントローラーからrayをとばして操作したい場合は
CenterEyeAnchorで設定したところをRightHandAnchorに変更すればコントローラーの先でクリックすることができます．

またCanvasのRenderModeをworldSpaceに変更する必要があります．
そのためポジションとサイズを変更してください．
文字のサイズは変更すると読めなくなるのでScaleで変更した方がいいと思います．

#コントローラーで移動をする

コントローラーのパッドの入力を取得して自身の位置を移動できます．

参考:[Oculus Go開発【コントローラー表示、クリック反応、移動、ポインタ、uGUI】](http://bibinbaleo.hatenablog.com/entry/2018/05/14/171744)

しかしこの移動方法だとVR酔いを引き起こしやすいためテレポートを使用することをお勧めします．

参考:[Oculus Goでテレポート移動する](https://qiita.com/noitak/items/c7283d912a723e8c27fd)

#つまったところ

###ボタンで関数を呼び出す
uGUIのボタンのOnClickで自身に追加したスクリプトの関数を呼び出すというのをよくつかうのですが，なぜか他のオブジェクトを操作することができませんでした．同じオブジェクトのコンポーネントであれば操作はできるみたいです．
他のオブジェクトを指定して操作したり，スクリプトの関数を呼び出すことは可能みたいです？なぜ？

###ビルド時
OculusGoに毎回ビルドするのは時間がかかるのでPCやWebGLでビルドして確認しようとしたのですが，インポートしたOculusのスクリプトが邪魔してAndroid以外でビルドができない...
PC用にもビルドしたいという人は気を付けてください．
Prometheus Alertmanagerのアラートリンク先URLを変える方法

# Prometheus Alertmanagerのアラートリンク先URLを変える方法


起動オプションの `--web.external-url` で指定すればよい

prometheusと、alertmanager 両方で指定すること

- prometheus : AlartmanagerのWEBのSourceなどに利用される
- alertmanager : 通知内のURLなどに利用される
チームメンバー間の「期待」マネジメント(ドラッカー風エクササイズ)

# 「期待」のマネジメントとは
チームメンバー間のお互いに対する「期待」はマネジメント対象です。
たとえば、マネジメントがうまくいっていないと以下のような問題が起こります。

* 任せられる仕事と自分の得手不得手がミスマッチすることでストレスがたまる。
* チームでの最大のアウトプットが出せない。

スクラムのタグをつけていますが、スクラム開発に限らずチームメンバーとのお互いの「期待」の認識をすり合わせることは重要だと考えられます。

#ドラッカー風エクササイズ
期待のマネジメントを行うためのエクササイズです。書籍「[アジャイルサムライ](https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4%E2%88%92%E9%81%94%E4%BA%BA%E9%96%8B%E7%99%BA%E8%80%85%E3%81%B8%E3%81%AE%E9%81%93%E2%88%92-Jonathan-Rasmusson/dp/4274068560/ref=sr_1_1?s=books&ie=UTF8&qid=1536143748&sr=1-1&keywords=%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4)」で紹介されているアクティビティです。
複数の問いに答え共有することで、**自分が何ができて**、**どのようにチームに貢献しようとしているのかをはっきりさせ**、またその認識を合わせます。そうすることで、期待のマネジメントを行い、上記のような問題を回避します。

## やるタイミング
* チーム発足時
* 新たなメンバーが入ってきたとき

上記のように、まだお互いをよく知らないタイミングでやると効果的です。

## やり方
そこまで難しいものではありません。まずは、以下の複数の問に答えて共有します。

1. 自分は何が得意なのか
2. 自分はどうやって貢献するつもりか
3. 自分が大切に思う価値はなにか
4. チームは自分にどのような貢献を期待していると思うか

#### お互いが言っている`4.`はあっているか
以上の問いに答えて、共有が終わったら、**自分が期待されていると思っている**ことと**他のチームメンバー**が期待していることの認識のすり合わせを行います。
具体的には以下のようなアンケートをとるなどして、認識のすり合わせを行います。
 
**他のメンバーが発表した、そのメンバーに対する「期待」は自分が抱いていた「期待」と合っていたか？**
 * 完全にあっている
 * だいたいあっている
 * ふつう
 * だいたいあっていない
 * 完全にあっていない


## 最後に
良いアウトプットを行うためには、チームメンバーをよく知る必要があります。このアクティビティはお互いを知り、チームで最大のアウトプットを出すのに役立つと思います。
また、実際にやってみるとよく知っているはずの人でも新しい発見があったりして楽しいです。ぜひ、試してみてください。


## 参考文献
* [カイゼンジャーニー](https://www.amazon.co.jp/%E3%82%AB%E3%82%A4%E3%82%BC%E3%83%B3%E3%83%BB%E3%82%B8%E3%83%A3%E3%83%BC%E3%83%8B%E3%83%BC-%E3%81%9F%E3%81%A3%E3%81%9F1%E4%BA%BA%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%80%81%E3%80%8C%E8%B6%8A%E5%A2%83%E3%80%8D%E3%81%99%E3%82%8B%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%BE%E3%81%A7-%E5%B8%82%E8%B0%B7-%E8%81%A1%E5%95%93/dp/4798153346)
tigergate - django練習まとめ

tigergateでのdjangoの練習のまとめです。

#5. Djangoの練習
1. [Djangoでウェブアプリ - 準備](https://qiita.com/egplnt/items/92dd3022bb69964f0a8a)
- [Djangoでウェブアプリ - htmlページを表示](https://qiita.com/egplnt/items/d307997e830c5bc302c7)
- [Djangoでウェブアプリ - cssを使ってみる](https://qiita.com/egplnt/items/fbd99a08347246f955e2)
- [Djangoでウェブアプリ - bootstrapを使ってみる](https://qiita.com/egplnt/items/ef7e609b60fb50e5608b)
- [Djangoでウェブアプリ - views.pyからhtmlへ出力](https://qiita.com/egplnt/items/9f68828f4f8d2680506b)
- [Djangoでウェブアプリ - htmlからviews.pyへ入力](https://qiita.com/egplnt/items/4d6fe35dc01067f765cd)
- [Djangoでウェブアプリ - templateでforループ](https://qiita.com/egplnt/items/0d09aa9a9d069e3764ed)
- [Djangoでウェブアプリ - templateでif-then条件分岐](https://qiita.com/egplnt/items/e89f7ffa10611e7db94c)
- [Djangoでウェブアプリ - データベースにしまってみる](https://qiita.com/egplnt/items/e4d3db4bc59c4450f9f0)
- [Django Girls - Djangoを使ってみる](https://qiita.com/egplnt/items/9620e1948fedcc052585)
- [DjangoでAPI呼び出し](https://qiita.com/egplnt/items/9cc0dec14d1b3eb7e34c)
- [Django REST Frameworkで画像収集](https://qiita.com/egplnt/items/e5c14199ed901fe1fd66)
Djangoでウェブアプリ - htmlからviews.pyへ入力

Djangoを使ってウェブアプリを作ります
ｈｔｍからviews.pyへデータを入力し、そのデータを出力してみます

- このページで作成されたDjango環境は[ここ](https://github.com/eggplnt/northernlights26)からダウンロード可能です

#1. ファイルを用意します

- `penguin`フォルダの`urls.py`に以下を追加します

```python:penguin/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('exercise', views.exercise, name='exercise'),
    path('', views.index, name='index'),
]
```

- `penguin`フォルダの`views.py`に以下を記述します

```python:penguin/views.py
from django.shortcuts import render
from datetime import datetime

def index(request):
    return render(request, 'index.html')

def exercise(request):
    text = 'テストです。'
    try:
        input_text = request.POST['input_text']
        print(input_text)
        text = input_text
    except:
        return render(request, 'exercise.html')

    now = datetime.now();
    context = {
        'text': text,
        'time': now,
    }
    return render(request, 'exercise.html', context)
```

- `static`フォルダに下記のようなcssを用意します

```css:test.css
.a1 {
  background-color:  #98d98e;
  height: 120px;
  padding: 20px;
}
.b1 {
  background-color:  #e4de8a;
  padding-left: 20px;
  height: 100px;
  text-align:left;
  font-size: 18pt
}
.c1 {
  background-color:  #cee4ae;
  height: 100px;
  text-align:left;
  font-size: 18pt;
  padding: 20px;
  font-family: Meiryo;
}
```

- `penguin`フォルダの`templates`サブフォルダに下記のようなhtmlを用意します

```html:penguin/templates/exercise.html
{% load static %}
<html>
<head>
</head>
<body>
  {% block extrahead %}
  <link href="{% static 'test.css' %}" rel="stylesheet">
  {% endblock %}

  <div class='a1'>
    <h1>テストページ</h1>
  </div>

  <div class='b1'>
    <p>
      時刻は：{{ time }}<br>入力されたテキストは：{{ text }}
    </p>
  </div>

  <div class='c1'>
    <form action="exercise" method="POST" >
      {% csrf_token %}
      <h3>入力テキスト</h3>
      <textarea class="form-control" id="input_text" name="input_text" rows="1" required>{{ input_text }}</textarea>
      <button type="submit" name="submit" value="送信" style="background-color: #bcbcff" >
        <font size="5">送信</font>
      </button>

    </form>
  </div>

</body>
</html>
```

#2. 稼働を確認します
- `python manage.py runserver`を実行し、Djangoを起動します
- ブラウザで`localhost:8000/exercise`へアクセスし、views.pyからのデータが表示されていることを確認します

<img width="505" alt="スクリーンショット 2018-09-05 19.18.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/f1ee611c-5c1a-86f2-f355-5f96bf43f9af.png">
<img width="429" alt="スクリーンショット 2018-09-05 19.19.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/9ed82006-09c0-f328-55b0-fe352904d3e5.png">
Windows エクスプローラーで表示中の複数のファイル名を一気にテキストで取り出す方法

■環境
- win7 or win10

１．エクスプローラーで目的のフォルダのファイルの一覧を表示。
２．必要なファイルを複数選択状態に。
３．選択状態になっている部分の上で、Shift+右クリック
　　表示されたメニューから「パスとしてコピー」。
４．これでテキストが取り出せる

コマンドプロンプトを使うまでもない時に。
Cognito User Poolsでユーザーを取得する


`$ aws cognito-idp admin-get-user --user-pool-id COGNITO_USER_POOLS_ID --username USERNAME`でいけます。

`User does not exist`が返ってきたらユーザーは存在しない（or退会済）です。

```
$ aws cognito-idp admin-get-user --user-pool-id COGNITO_USER_POOLS_ID --username USERNAME

An error occurred (UserNotFoundException) when calling the AdminGetUser operation: User does not exist.
```
成功したらこんな感じ。

```
$ aws cognito-idp admin-get-user --user-pool-id COGNITO_USER_POOLS_ID --username hideokamoto
{
    "Username": "hideokamoto", 
    "MFAOptions": [
        {
            "DeliveryMedium": "SMS", 
            "AttributeName": "phone_number"
        }
    ], 
    "Enabled": true, 
    "UserStatus": "CONFIRMED", 
    "PreferredMfaSetting": "SMS_MFA", 
    "UserCreateDate": 1484806199.008, 
    "UserAttributes": [
        {
            "Name": "sub", 
            "Value": "b3e56722-c100-4fec-9d0d-a1311481a0f0"
        }, 

```
正規表現で日本語を探す

# 正規表現で日本語を探す - (UTF-8)

## マルチ言語対応

マルチ言語対応アプリの開発を行うときにテンプレートファイルに日本語が混じっていないかを探す。

`[^\x01-\x7E\xA1-\xDF]+`
![caption.png](https://qiita-image-store.s3.amazonaws.com/0/285832/fa4f6037-dbf4-8877-5ce1-70ed6358c324.png)

## bash shell script example

### ファイル数が少ないとき

```
grep -nPo "[^\x01-\x7E\xA1-\xDF]+" $(find . -type f -name "*html")
```
### ファイル数が多いとき

```
find . -type f -name "*html" | xargs grep -nPoH "[^\x01-\x7E\xA1-\xDF]+"
```
### パスに を含んでいるとき

```
while read file
do
  grep -nPoH "[^\x01-\x7E\xA1-\xDF]+" "$file"
done < <(find . -type f -name "*html")
```
### while が使いたくないとき

```
find . -type f -name "*html" -exec grep --color=auto -nPoH "[^\x01-\x7E\xA1-\xDF]+" {} \;
```
### less を使いたいとき

```
unbuffer find . -type f -name "*html" -exec grep --color=auto -nPoH "[^\x01-\x7E\xA1-\xDF]+" {} \; | less -SR
```
CircleCI2.0でphanを回す

## はじめに

人生って大変ですね。プログラマ辞めてワルキューレに入りたいです。

`Laravel` でphanを回すって記事はそこそこあるし、 [師tadsanのデカルチャーな記事](http://inside.pixiv.net/entry/2016/11/11/202656) など当たれば `phan` について大体わかると思いますが、 `CircleCI 2.0` と組み合わせるとなると全然見当たらなかったので頑張りました。

`phan` と `phpunit` をCIで回すと快適に夜眠れるので安心して眠ることができるので回すことをおすすめします。

## コード抜粋

```yml
version: 2
jobs:
  build:
    docker:
      - image: circleci/php:7.1-node-browsers
      - image: circleci/mysql:5.7
    environment:
      - APP_DEBUG: true
    working_directory: ~/repo
    steps:
      - checkout
      - run: sudo apt-get install -y libzip-dev libpng-dev libsqlite3-dev
      - run: sudo docker-php-ext-install pdo_mysql zip
      - run:
          name: Install php-ast
          command: |
            cd ~
            git clone https://github.com/nikic/php-ast
            cd php-ast
            phpize
            ./configure
            make
            sudo make install
            echo -e "extension=ast.so" | sudo tee /usr/local/etc/php/php.ini > /dev/null
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "composer.json" }}
          - v1-dependencies-
      - run: cd ~/repo
      - run: composer install -n --prefer-dist
      - save_cache:
          paths:
            - ./vendor
          key: v1-dependencies-{{ checksum "composer.json" }}
      - run: composer phan
workflows:
  version: 2
  build-and-deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only: /^develop$|^staging$/

```

## 雑に解説

`php` は `CircleCI` 側が用意してくれてるdockerを使えば楽チンに入りました楽勝！
`name: Install php-ast` の部分がめんどくさかったです。`phan` には `php-ast` extensionが必要なのですが、良いやり方がなかったのでとりあえず `make` して `php.ini` に `extension=ast.so` を追加するように書きました。


`docker image` を作ってる方もいらっしゃいますが、なるべく `circleci` が提供してる `docker image` に合わせたかったのでこういう風にしました。

## おわり

もっといいやり方、ここちげーよ、などあればコメントください。
Djangoでウェブアプリ - views.pyからhtmlへ出力

Djangoを使ってウェブアプリを作ります
views.pyからhtmlへ情報を出力してみます

- このページで作成されたDjango環境は[ここ](https://github.com/eggplnt/northernlights24)からダウンロード可能です

#1. ファイルを用意します

- `penguin`フォルダの`urls.py`に以下を追加します

```python:penguin/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('exercise', views.exercise, name='exercise'),
    path('', views.index, name='index'),
]
```

- `penguin`フォルダの`views.py`に以下を記述します

```python:penguin/views.py
from django.shortcuts import render
from datetime import datetime

def index(request):
    return render(request, 'index.html')

def exercise(request):
    now = datetime.now();
    context = {
        'text': 'テストです。',
        'time': now,
    }
    return render(request, 'exercise.html', context)
```
- `static`フォルダに下記のようなcssを用意します

```css:test.css
.a1 {
  background-color:  #98d98e;
  height: 120px;
  padding: 20px;
}
.b1 {
  background-color:  #e4de8a;
  padding-left: 20px;
  height: 100px;
  text-align:left;
  font-size: 18pt
}
.c1 {
  background-color:  #cee4ae;
  height: 100px;
  text-align:left;
  font-size: 18pt;
  padding: 20px;
  font-family: Meiryo;
}
```

- `penguin`フォルダの`templates`サブフォルダに下記のようなhtmlを用意します

```html:penguin/templates/exercise.html
{% load static %}
<html>
  <head>
  </head>
  <body>
    {% block extrahead %}
      <link href="{% static 'test.css' %}" rel="stylesheet">
    {% endblock %}

    <div class='a1'>
      <h1>テストページ</h1>
    </div>

    <div class='b1'>
      <p>
        {{ text }}
      </p>
    </div>

    <div class='c1'>
      <p>
        {{ time }}
      </p>
    </div>

  </body>
</html>
```

#2. 稼働を確認します
- `python manage.py runserver`を実行し、Djangoを起動します
- ブラウザで`localhost:8000/exercise`へアクセスし、views.pyからのデータが表示されていることを確認します

<img width="496" alt="スクリーンショット 2018-09-05 18.37.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/eb44a564-818e-1835-edcd-01fc325ad41f.png">
はじめての Flask #3 ~htmlをrenderしてみよう~

[前回: ~POSTを受け取ろう~](https://qiita.com/nagataaaas/items/3116352da186df102d96)

今回は、htmlファイルを用意してそれをブラウザに表示させてみましょう！

前回までは、**return** で文字列として返していましたが、醜いですし、扱いづらいですよね。

今回からは **render_template** を使います！

# ファイル構成
まず

```
root/
|__main.py
|__templates/
      |__mainpage.html
      |__name.html
```

という形にファイルとフォルダを作ってください。

# はじめてのrender

main.pyを

```main.py
from flask import *

app = Flask(__name__)


@app.route("/", methods=["GET", "POST"])
def main_page():
    return render_template("mainpage.html")


@app.route("/<name>", methods=["GET", "POST"])
def namepage(name):
    return render_template("name.html")


if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=8888, threaded=True)

```

として、**mainpage.html**と**name.html**をそれぞれ

```mainpage.html
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
    this is the main page
    </body>
</html>
```

```name.html
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
    this is the name page
    </body>
</html>
```

とでもしておいて下さい。

さて、この状態でmain.pyを実行し、
`http://localhost:8888/`
と
`http://localhost:8888/<何か好きな文字>`

に接続してみてください。それぞれ
`this is the main page` `this is the name page`と表示されているでしょうか。

このようにして、htmlファイルを出力することができます。

# htmlファイルを動的に返す

htmlのrenderには[jinja2](http://jinja.pocoo.org/docs/2.10/)というものが使われており、中でPythonのコードを実行することができます。

値を渡すには、render_templateにキーワード引数として入力すればよいです。

namepageをこう書き換えてください。

```python
@app.route("/<name>", methods=["GET", "POST"])
def namepage(name):
    return render_template("name.html", name=name)
```

そして、name.htmlもこう書き換えましょう

```name.html
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
    hello, {{name}}
    </body>
</html>
```
( **二重波括弧 {{}}** )内がPythonのコードとして評価されます。

`localhost:8888/python`に接続すると　`hello, python`となりますね。

このように、render_templateを使って、ファイルとしてのhtmlを出力できます。

**for文** や **while文**、ほかの**htmlファイルの読み込み**などたくさんのことができますが、あまりにもできることが多いので、それはまたの機会にします。

Documentは[ここ](http://jinja.pocoo.org/docs/2.10/)ですので、気になった方は閲覧してみてください。

次回は[データベースをいじってみましょう！](https://qiita.com/nagataaaas/items/5c7c9ec4813fea85c40c)
cURLでPOSTする際にCURLOPT_POSTFIELDSで渡す値が文字列か配列かでheaderのContent-Typeが変わるの知らなくて詰んだ

```php
$data = [
	'a' => 1,
	'b' => 2,
	'c' => 3,
];

//中略

curl_setopt($ch, CURLINFO_HEADER_OUT, true);

//中略

curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
print curl_getinfo($ch, CURLINFO_HEADER_OUT);	//Content-Type: application/x-www-form-urlencoded; boundary=***

//中略

curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data, '', '&') );
print curl_getinfo($ch, CURLINFO_HEADER_OUT);	//Content-Type: application/x-www-form-urlencoded
```

はいくそー。

```php
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded') );
```

って設定しておいても一緒。
仕様考えればそうなんだろうけど、REST APIによっては任意のContent-Typeしか受け入れなくなっていたりするので注意しましょうって話。
QGISラスタ計算機で斜面方位をカテゴリー化

考古学でよく使う斜面方位ラスタを4方位のベクタ地図に変換します。

こんな斜面方位ラスタ
![01.png](https://qiita-image-store.s3.amazonaws.com/0/60438/7ed5e9f2-f6d6-aa64-3714-09f7e4564979.png)

4方位に区分したベクタに変換したい
![02.png](https://qiita-image-store.s3.amazonaws.com/0/60438/2672927f-949c-f070-5a7f-5ff3b6e97fa0.png)


### ラスタ計算機で斜面方位ラスタをカテゴリー化

![37.png](https://qiita-image-store.s3.amazonaws.com/0/60438/0d08c5b0-050c-6dbc-2c42-c414531dedf1.png)

ラスタ演算式は次のとおりです。なお、東が0で半時計回りに増加するラスタ地図です。GRASS GISで作成した傾斜方位地図などがデフォルトで東が0の半時計回りとなっています。

完成したラスタ地図は

- 東10
- 北20
- 西30
- 南40

が代入されます。


### 数式説明

```
("Aspect@1">0)*("Aspect@1"<=45)*10+
("Aspect@1">45)*("Aspect@1"<=135)*20+
("Aspect@1">135)*("Aspect@1"<=225)*30+
("Aspect@1">225)*("Aspect@1"<=315)*40+
("Aspect@1">315)*10
```

- 「"Aspect@1"」はAspectレイヤのバンド1を意味します。
- 「"Aspect@1">0」が真なら計算機は「1」を返し、偽なら「0」を返します。
- 続く「"Aspect@1"<=45」が真なら同様に「1」を、偽なら「0」を返します。
- 「("Aspect@1">0)*("Aspect@1"<=45)」では0より大きく、45以下でない値はすべて0が返されます。
- 「("Aspect@1">0)*("Aspect@1"<=45)*10」では、0より大きく45以下の値が真の場合に10をかけるので、0〜45の値をとるピクセルには10が代入されます。
- 同様に45〜135（北）では20が代入され、135〜225では30が代入され、225〜315では40が代入されます。
- 真となるのはどれか一つの項なので全部の項を足し合わせると真となる項の数字だけが残ります。

上記の計算式は「[カッパ出没マップを作成する](https://github.com/Arctictern265/QGIS_book/blob/master/4/4-4.md)」を参照して作成しました。合わせてどうぞ。

### ラスタのポリゴン化
gdal_polygonize.py コマンドを使用します。

```
# 引数は入力ファイル（Aspect_reclass.tif）、出力ファイル（Aspect.shp）の順に指定
# -b オプションはバンドの指定「1」を指定します。
gdal_polygonize.py Aspect_reclass.tif Aspect.shp -b 1
```

### ラスタ計算機で対応する数字を文字列に変換
方位を表す整数値が「DN」フィールドに入力されているので、文字列（東西南北）に変換します。

![42.png](https://qiita-image-store.s3.amazonaws.com/0/60438/3793c67c-d925-e99f-1a7a-baa19c528d50.png)

計算式は以下のとおりです。特に説明することはないと思います。

```
CASE 
WHEN "DN"=10 THEN  '東'
WHEN "DN"=20 THEN  '北'
WHEN "DN"=30 THEN  '西'
WHEN "DN"=40 THEN  '南'
END
```

aspectフィールドに文字列の方位が入力されていれば完成。
![43.png](https://qiita-image-store.s3.amazonaws.com/0/60438/dfb832a8-c61d-d98b-96d8-ee14bba401a4.png)
Laravel Dusk1.0 でヘッドレス実行を行う手順


Laravel Dusk でブラウザを立ち上げず、テストケースを流したいと思い、
設定した内容です。

ヘッドレス実行というもので、最新バージョンではヘッドレス実行が初期設定されているようなのですが、
Laravel　Duskのバージョンが「1.0」だったため、入っておらず、対応しました。


## 実行環境
 
Laravel5.5
MacOS High Sierra 10.13.2
PHP 7.1
Docker 18.06.0

## 設定内容

DuskTestCase.php ファイルの記載を以下に変更します。

```
use Facebook\WebDriver\Chrome\ChromeOptions;

abstract class DuskTestCase extends BaseTestCase

・・・

    /**
     * Create the RemoteWebDriver instance.
     *
     * @return \Facebook\WebDriver\Remote\RemoteWebDriver
     */
    protected function driver()
    {
        $options = (new ChromeOptions)->addArguments([
            '--disable-gpu',
            '--headless',
            '--lang=ja_JP',
            '--window-size=1920,1920',
        ]);

        return RemoteWebDriver::create(
            'http://localhost:9515', DesiredCapabilities::chrome()->setCapability(
                ChromeOptions::CAPABILITY, $options
            )
        );
    }
```

## つまづいたところ （２箇所）

### つまづいたところ 1つ目

以下のエラーが発生したので、

```
Error: Class 'Tests\ChromeOptions' not found
```

こちらを追記しました。

```
use Facebook\WebDriver\Chrome\ChromeOptions;
```

### つまづいたところ 2つ目

以下のエラーが発生したので、

```
Facebook\WebDriver\Exception\UnknownServerException: unknown error: Element is not clickable at point (1008, 432)
  (Session info: headless chrome=68.0.3440.106)
  (Driver info: chromedriver=2.41.578706 (5f725d1b4f0a4acbf5259df887244095596231db),platform=Mac OS X 10.13.2 x86_64)

```

こちらを追記しました。

```
--window-size=1920,1920
```


## 参考文献

https://www.neontsunami.com/posts/element-is-not-clickable-at-point-laravel-dusk
Proxy 環境下の Jenkins からHTTPリクエストを送りたかった

Jenkinsからチャットツールにビルド結果を通知してChatOpsのような仕組みを試行した際の備忘録。

## 基本情報
* 執筆：2018/08/31
* OS：Windows Server 2008
* Jenkins:2.121.3

## tl;dr(ここだけ読めば使えます)
* JenkinsにHTTP Request Pluginを導入
* （今回のケースはpipelineスクリプトを利用しているので）以下のようなスクリプトで。

```groovy
httpRequest url: "https://httpbin.org/ip", httpMode: 'GET', contentType: 'APPLICATION_JSON'
```

* 訳あってWindowsのサービスとしていなかったため、JVMの引数として以下を追加

```
-Dhttps.proxyHost=ホスト名
-Dhttps.proxyPort=ポート番号
```
※おそらくWindowsのサービスとして起動されている場合はシステムプロパティからProxyの設定を引っ張ってこれるのだと思うが、今回は訳あって手動でJVMを起ち上げたため、引っ張ってこれなかったと推測される。

## ハマったポイント
* MissingPropertyException等
インターネットに転がっているコードをコピペして実行してみるも色々例外が発生して動かず…。原因はそれなりに調査してみたが、よく分からなかったので、生のgroovyスクリプトで回避する案は見切りをつけ、HTTP Request Pluginにスイッチ。（java, groovy, jenkinsの知識不足から原因究明には至らず。）

* jenkinsのプロパティ設定が（実は）使われていなかった
HTTP Request PluginでHTTP POSTの送信を試みるもタイムアウトエラー。（例外は出なくなったので１歩進んだ。）jenkinsを搭載するサーバのブラウザでHTTP POSTは送信可能であることは確認できていたため、jenkinsのプロキシ設定（プラグインマネージャー >> 高度な設定）を疑い始めるが正しく設定されており、アップデートやプラグインのダウンロードはちゃんとできるので益々「？」悩みつつ調べを進めていくと…
https://issues.jenkins-ci.org/browse/JENKINS-25801
このプラグインはシステムプロパティを参照するような記載を発見し解決。

<br/>
同僚の記事に似たような内容があったので、一通り目を通しておくべきだったと痛感。
そんな弊社ではエンジニアを募集中です。こちらも見て頂けると嬉しいです。
https://www.nittsu-infosys.com/recruit/2019/index.html
AWSIoTCoreルート証明書をAmazonTrustServices(ATS)に切り替える

#はじめに

Googleなどが「Symantecの証明書を全面的に信頼しないようにするよ」と発表([参考](https://security.googleblog.com/2017/09/chromes-plan-to-distrust-symantec.html))してからだいぶ経ちますが、8月の終わりにAWSがこんな発表をしました。

[AWS IoT Core がお客様に提供する Symantec の認証局無効化の対応方法](https://aws.amazon.com/jp/blogs/news/aws-iot-core-ats-endpoints/)

要するに「10月以降、AWSIoTCoreの証明書で利用しているSymantecのルート証明書が無効化される動きがあるから、こういう対処をしてね！」という内容でした。

## 何をしたのか

### 1. AmazonTrustServices(ATS)発行の証明書を取得

ATSが用意してくれているルート証明書を利用するように対応します。
[**各証明書のリンクが用意されているページ**](https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/managing-device-certs.html)から必要なものをダウンロードしてください。(別タブでテキストが表示されるのでコピーしてください。)
<img width="1161" alt="X.509 証明書と AWS IoT - AWS IoT 2018-09-05 17-36-02.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/909b9c1d-1afd-ab29-2be3-d671af2edeaf.png">

その他の秘密鍵や証明書はそのままで問題ないので、ルート証明書を取得したものに置き換えてください。

### 2. エンドポイントの変更

AWSIoTCoreのエンドポイントが変わります。
`aws iot describe-endpoint --endpoint-type iot:Data-ATS` を実行すればATS用のエンドポイントを取得することができます。

```console
$ aws iot describe-endpoint --endpoint-type iot:Data-ATS
{
    "endpointAddress": "xxxxxxxxxxxxx-ats.iot.ap-northeast-1.amazonaws.com"
}
```

上記で取得したエンドポイントにMQTTでPublishするようにしてください。
ちなみにSymantec証明書用のエンドポイントを所得する場合は、コンソール画面から確認できます。
<img width="761" alt="AWS IoT 2018-09-05 17-33-36.png" src="https://qiita-image-store.s3.amazonaws.com/0/95875/45d5dafe-f198-5a8a-e9d2-b74a38b1805c.png">

## さいごに

まだ移行の過渡期だと思うので、これから更にわかりやすく取得、切り替えができるようになるとは思いますし、現行のSymantec発行証明書を用いた場合も、引き続き提供されるようですので、そこまで急いで行う対応ではないのかなと感じています。
ただもうすでにデバイスに証明書を組み込んでしまっている場合などの対応を考えていかないといけないですね。

ではまた！
glamorous-native + Typescript propsを渡すと怒られる件

## Issue
ReactNative + Typescript下でNativeBaseのTextコンポーネントに[glamorous-native](https://github.com/robinpowered/glamorous-native)でpropsを渡してstyle定義しようとする以下のようなケースで怒られました。

```
import React from 'react';
import { Component } from 'react';
import { Text } from 'native-base';
import glamorous from 'glamorous-native';

const Foo = (props:Props)=>{
	return (
		<StyledSubLabel statuColor="red">ラベル</StyledSubLabel>
	);
}

const StyledSubLabel = glamorous(Text)({
	fontWeight: 'bold'
}, (props)=> ({ color: props.statuColor }));
```

**Error!!**
> Property 'statuColor' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes<Component<ExtraGlamorousProps & Text & object & Pick<any, number>, any, any>> & Readonly<{ children?: ReactNode; }> & Readonly<...>'.

## 対策

glamorous(Component)({...styles}, event)で受け取るprops引数を型定義してあげると収まりました。

```
type StyledSubLabelProps = {
	statuColor: string
}
const StyledSubLabel = glamorous(Text)({
	fontWeight: 'bold'
}, (props:StyledSubLabelProps)=> ({ color: props.statuColor }));
```

ちなみに glamorous-nativeでは `fontSize={10}` というようなstyle属性と同名のpropsを渡すと `style={{fontSize: 20}}` と同じになるようでらしいのですが、同様にTypescriptだと怒られます。NativeBaseのコンポーネントを渡してるからかなとglamorous-nativeのコンポーネントでやってみましたが結果は同じでした。

上の対策同様に型を `fontSize: number` と定義してあげると怒らないのですが、propsが渡ってないみたいで変化はありませんでした。

謎い… 🙃
VB.NETでTLS1.2対応


WebサーバとHTTPS通信を行うVB.NETのアプリで、Webサーバを新しいものにリプレースしたらうまく接続できず、エラーを吐いていた。見慣れないエラーだ。リモートパーティってなんだ、僕も混ぜてもらえないか。

```
System.Net.WebException: 接続が切断されました: 送信時に、予期しないエラーが発生しました。。 ---> System.IO.IOException: リモート パーティがトランスポート ストリームを終了したため、認証に失敗しました。
   場所 System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   場所 System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   場所 System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   場所 System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   場所 System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   場所 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   場所 System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
   場所 System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   場所 System.Net.ConnectStream.WriteHeaders(Boolean async)
   --- 内部例外スタック トレースの終わり ---
   場所 System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
   場所 System.Net.HttpWebRequest.GetRequestStream()
```

やれやれ。僕は検索した。

[**TLS1.2サポートするサーバとのHTTPS通信実装**](https://qiita.com/tanj/items/31a0fd6b188952886de5)

どうやらTLS1.2環境とやらに対応する必要があるようだ。


##対応

C#だとこう

```c#
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
```

全てのSecurityProtocolTypeを列挙してServicePointManager.SecurityProtocolに突っ込んでもいいが、単に追加するだけなら上記で足りるらしい。
へー。

VB.NETだとこう

```vb
ServicePointManager.SecurityProtocol = ServicePointManager.SecurityProtocol Or SecurityProtocolType.Tls12
```

スタートアップ時に呼び出される`MyApplication_Startup`関数で呼んであげると以降接続失敗することはなくなった。
なお以下によると、C#でいう`|=`演算子はVBには無いらしい。まどろっこしい。

[**What is the equivalent of |= in Visual Basic?**](https://stackoverflow.com/questions/4011357/what-is-the-equivalent-of-in-visual-basic)

##おまけ

捜し物の過程で、IEで`ファイル＞プロパティ`と開いていくとTLSバージョンが見られるというのを初めて知った。

[**.NET Framework で TLS1.1 および 1.2 を有効化する方法**](https://blogs.technet.microsoft.com/jpieblog/2015/04/07/net-framework-tls1-1-1-2/)
Ruby：二次元配列を取り出しメモ

二次元配列を使う時にはeachを二重にして取り出していたが、
ブロック引数に複数指定すれば中の配列の要素がそのまま取り出せそう

これまでの書き方

```ruby:qiita.rb
array = [[1,2,3], [4,5,6], [7,8,9]]
array.each do |ary|
  ary.each do |fed|
    puts fed
  end
end
```

###短くしたい
とにかく短くしたいと調べてて見つけた書き方

```ruby:qiita.rb
array = [[1,2,3], [4,5,6], [7,8,9]]
array.each do |fed1, fed2, fed3|
  puts fed1, fed2, fed3
end
```

これで少し短くなりました。
多変量正規分布における検定法

```{r}

#データが多変量正規分布に従うと見たとき、独立的な変数とみなしてｔ検定したほうがいいのか、そうでないのか


library(mvtnorm)

sigma_vec<- matrix(c(5,7,7,3), ncol=2)

n=50

data=rmvnorm(n,mean=c(0,0),sigma=sigma_vec)

data=data.frame(data)

ave=apply(data,2,mean);ave_diff=ave*c(1,-1)

S2_paired=sum(apply(t(t(as.matrix(data))-ave_diff),1,sum)^2)/(n-1)
  
S2_ind=sum(t(t(as.matrix(data))-ave_diff)^2)/(2*(n-1))

T_paired=sum(ave_diff)/sqrt(S2_paired/n)

T_ind=sum(ave_diff)/sqrt(2*S2_ind/n)

alpha=0.05

1-(qt(alpha/2,df=2*(n-1))/qt(alpha/2,df=n-1))^2

T_paired/qt(1-alpha/2,df=n-1)

T_ind/qt(1-alpha/2,df=2*(n-1))

```

```{r}
#分散が既知のとき

library(mvtnorm)

sigma_vec<- matrix(c(4,0,0,3), ncol=2)

n=500

samples=rmvnorm(n,mean=c(1,2),sigma=sigma_vec)

mean=c(3,2)

dmvnorm(c(1,2),mean=mean,sigma=sigma_vec)

apply(samples,2,mean)

#kai^2 value

(apply(samples,2,mean)-mean)%*%solve(sigma_vec)%*%(apply(samples,2,mean)-mean)

alpha=0.05

#chisq point

qchisq(alpha,2)

#non-central chisq point

qchisq(alpha,2,(apply(samples,2,mean)-mean)%*%solve(sigma_vec)%*%(apply(samples,2,mean)-mean))

qchisq(1-alpha,2,(apply(samples,2,mean)-mean)%*%solve(sigma_vec)%*%(apply(samples,2,mean)-mean))

```

```{r}

#分散が未知のとき

library(mvtnorm)

sigma_vec<- matrix(c(4,0,0,3), ncol=2)

n=500

samples=rmvnorm(n,mean=c(1,2),sigma=sigma_vec)

mean=c(1,2)

dmvnorm(c(1,2),mean=mean,sigma=sigma_vec)

apply(samples,2,mean)

var=diag(0,2)

for(j in 1:n){

var=var+(samples[j,]-mean)%*%t(samples[j,]-mean)

}

#S

var=(1/(n-1))*var

test_value=(apply(samples,2,mean)-mean)%*%solve(var)%*%(apply(samples,2,mean)-mean)

test_value=test_value*((n-2)/((n-1)*2))

#F test

alpha=0.01

qf(alpha,2,n-2)



```
```{r}

#p.123 H0:mu1=mu2

#2-variable normal dis

sigma1<- matrix(c(40,1,1,30), ncol=2)

sigma2<- matrix(c(10,1,1,30), ncol=2)

n=100

mean1=c(1,2);mean2=c(1,2)

samples1=rmvnorm(n,mean=mean1,sigma=sigma1)

samples2=rmvnorm(n,mean=mean2,sigma=sigma2)

ave1=(apply(samples1,2,mean)*10)/10

ave2=(apply(samples2,2,mean)*10)/10

ave1

ave2

(ave1-ave2)%*%solve(sigma1/n+sigma2/n)%*%(ave1-ave2)*1/2

alpha=0.2

qchisq(alpha,2)

qchisq(alpha,2,(ave1-ave2)%*%solve(sigma1/n+sigma2/n)%*%(ave1-ave2))

```

```{r}

#p.123 H0:mu1=mu2 (sigma is not known)

#2-variable normal dis

sigma1<- matrix(c(40,1,1,30), ncol=2)

sigma2<- matrix(c(10,1,1,30), ncol=2)

n1=100;n2=200

mean1=c(1,2);mean2=c(1,2)

samples1=rmvnorm(n1,mean=mean1,sigma=sigma1)

samples2=rmvnorm(n2,mean=mean2,sigma=sigma2)

ave1=(apply(samples1,2,mean)*10)/10

ave2=(apply(samples2,2,mean)*10)/10

var1=diag(0,2)

for(j in 1:n){

var1=var1+(samples1[j,]-ave1)%*%t(samples1[j,]-ave1)

}

var2=diag(0,2)

for(j in 1:n){

var2=var2+(samples2[j,]-ave2)%*%t(samples2[j,]-ave2)

}

p=2

S=(1/(n1+n2-2))*(var1+var2)

f=((n1*n2)/(n1+n2))*(ave1-ave2)%*%solve(S)%*%(ave1-ave2)*((n1+n2-p-1)/((n1+n2-2)*p))

ave1

ave2

f

alpha=0.2

qf(alpha,p,n1+n2-p-1)

```
【Python】SeleniumでHeadless Firefoxを使おう


# 目次
- [準備](#準備)
- [コード例](#コード例)
- [その他のヘッドレスブラウザ](#その他のヘッドレスブラウザ)


# 準備
- selenium
- Firefox (今回はDeveloper Editionを使用します)
- geckodriver (Firefoxドライバー)

## selenium
pipでもcondaでもインストール可能です。

```
>> pip install selenium
```
```
>> conda install selenium
```

## geckodriver
condaで導入すれば，pythonパッケージと同様にバージョン管理ができるほか，パスを設定する必要もないので楽です。(pipでもあるかも)他にも，brewでインストールする方法などがあります。

```
>> conda install -c conda-forge geckodriver
```
```
>> brew install geckodriver
```


# コード例
Google検索画面のHTMLを取得し表示します。

```py
from selenium import webdriver
from selenium.webdriver.firefox.options import Options

# ブラウザーを起動
options = Options()
options.binary_location = '/Applications/Firefox Developer Edition.app/Contents/MacOS/firefox'
options.add_argument('-headless')
driver = webdriver.Firefox(firefox_options=options)

# Google検索画面にアクセス
driver.get('https://www.google.co.jp/')

# htmlを取得・表示
html = driver.page_source
print(html)

# ブラウザーを終了
driver.quit()
```


# その他のヘッドレスブラウザ
Chrome → https://qiita.com/derodero24/items/9e9567790bde9e4b9d0c
Splash → https://qiita.com/derodero24/items/a181cd34b081bee055c7
ActiveRecordのhas_manyメソッドのsourceオプションについて

##きっかけ
アソシエーション名に被りが生じてしまい、違う名前をつけたアソシエーション名と関連先テーブルが異なる名前になったため、sourceオプションを省略することができなくなったため、改めて調べる必要が生じた

##具体例
ユーザーは複数(has_many)の質問をしている
質問はいずれかのユーザーに所属(belongs_to)している

```
class User < ActiveRecord::Base
has_many :answered_questions, through: :answers, source: :question
end
```

##解説
以上の具体例は、下記の意味と同じになる

```
class User < ActiveRecord::Base
has_many :questions, through: :answers
end
```
つまり、関連先テーブル名とアソシエーション名が同じ場合は、sourceオプションは省略することができる。
しかし、異なる場合は、source: :モデル名にて関連先テーブル名を書かなければならない
Windows環境のpython で日本語出すと文字コードでエラーがでるときの対処方法。

簡単なサンプルとしてWindowsに付属しているメモ帳などを開いて

~~~python:jp_test.py
print ("日本語")
~~~

と記載して実行してみると・・・

~~~
C:\sample>python jp_test.py
File "jp_test.py", line 1
SyntaxError: Non-UTF-8 code starting with '\x93' in file jp_test.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
~~~

というようなエラーになります。

これは、作成したファイルがANSI(SJIS)コードで作成されているからです。
そのため作成したファイルの文字コードをANSI→UTF-8に変更することでエラーがなくなります。

メモ帳だとこんな感じ。
![jp_test.png](https://qiita-image-store.s3.amazonaws.com/0/255677/f0ea7642-c1e5-ea6b-9767-d6d293255376.png)

UTF-8で保存して！

~~~
C:\sample>python jp_test.py
日本語
~~~

となります。

~~~
#coding: UTF-8
~~~

って入れないとダメなのか？とか、

~~~
print (u"日本語")
~~~
ってしなければいけないのか？とか悩んだけど、何のことは無い保存したファイルの文字コードの問題だっただけという落ちでした・・・:stuck_out_tongue:
Python配列の生成＆アクセスの速度

#背景

「配列の要素に先頭から最後まで順番にアクセスしていく」処理が必要になったが、配列が大きくなると、結構重い処理になる。少しでもアクセス速度を上げたい。

この記事の改良(https://qiita.com/pegasusBS15/items/75da968c9d3ee285f851)
前の記事は配列の生成とアクセスが混交していたので、分けて速度を確認

#環境
- macOS High Sierra10.13.5
- Python3.6.4
- Jupyter notebook5.5.0

#方法
比較する配列の型は4種類
1. リスト
2. 辞書
3. タプル
4. Numpyのarray
各配列は一次元で0から999の数字を格納
処理時間の計測はJupyter notebook上でマジックコマンド` %timeit `、` %%timeit `を使用
複数回実行して、処理時間の平均・標準偏差を出してくれるので、処理時間にばらつきのあるプログラムの時に便利

#結果

###リスト型
####生成
```py
%timeit List = list(range(10**3))
```
15.8 µs ± 546 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

####アクセス
```py
List = list(range(10**3))
b = 0
%timeit for w in List: b = w
```
14.9 µs ± 364 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

###タプル型 
####生成

```py
%timeit Tuple = tuple(range(10**3))
```
14.3 µs ± 99.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

####アクセス
```py
Tuple = tuple(range(10**3))
b = 0
%timeit for w in Tuple: b = w
```
15 µs ± 72.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

###辞書型 

####生成

```py
%timeit Dict = {i:i for i in range(10**3)}
```
63.3 µs ± 2.18 µs per loop (mean ± std. dev. of 7 runs, 100

####アクセス
```py
Dict = {i:i for i in range(10**3)}
b = 0
%timeit for w in Dict: b = w
```
20.5 µs ± 381 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

###Numpyのarray型

####生成

```py
%%timeit
import numpy as np
Array = np.array([range(10**3)])
```
106 µs ± 2.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

#####生成（一応import抜いたら）

```py
import numpy as np
%timeit Array = np.array([range(10**3)])
```
97.4 µs ± 332 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each

####アクセス
```py
import numpy as np
Array = np.array([range(10**3)])
b = 0
%timeit for w in Array: b = w
```
862 ns ± 171 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
※単位がこれだけns

#結論
生成だけならListやTupleが速い
Numpyのarrayは生成遅いけど、アクセスが圧倒的に速い
何度もアクセスする場合はNumpyが良さそう
※用途に合わせて使い分ける
※そもそもリストの要素に何度もアクセスするようなコードを書かないほうが良い
学習記録：Python

#9月4日　Python

Python2周目の学習
関数の作成、メソッドの処理、インスタンスの作成などは数を経てスムーズに出来るようになりましたが、inputで入力された値が文字列なので、それをint型に変換したり、printするときにstring型にしたり…そういった部分を見落とすことが多いので、注意が必要だなと感じました。

で、Progate上でPythonを2周し、基礎は掴めたように感じたので、今後PythonはAidemyで学習をしていこうと思います。

**条件分岐**

```python
x =9 * 10

#　ifなどの条件式の後ろには「:」をつける
#　条件式が適用されている範囲はインデントによって判定される
if x >= 100 :
     print('xは100以上です')　#条件式の範囲内
elif x >=50 :
　　 print('xは50以上です')　

#　条件式として機能しないパターン
if x == 70 :
print('xは70ではありません')　#インデントが揃っており、条件式の範囲外
```

**入力した数字を受け取る**

```python
# 変数 = input('コンソールに表示したい文字列')で数字を受け取る
# ※inputで受け取った値は文字列型になっているので、数値にする場合はintで変換
input_count = int(input('購入するりんごの個数を入力してください：'))
```

**pythonにおけるリスト（配列)**

```python
# リスト化：　リスト名 = [ , , , … ]
fruits = ['apple', 'banana', 'orange']
#　リストの末尾に要素を追加する:　リスト名.append()
fruits.append('grape')

# 配列の要素を繰り返して全て取り出す: for 変数名 in リスト名 :
for fruit in fruits :
    print(fruit)
```
**pythonにおける辞書**

```python
# キー名と値を用いて辞書化する: 辞書名 = {'キー名':'値','キー名':'値',…}
fruits = {'apple':'りんご','banana':'バナナ'}
# 辞書の特定のキーの値を出力する　辞書名['キー名']
print(fruits['banana'])
# 値を更新する:　辞書名['キー名'] = 値
fruits['banana'] = 300
#辞書に新しい要素を追加する:　辞書名['新しいキー名'] = 値
fruits['grape'] = 500
# 辞書の全要素を繰り返し処理をする: for 変数名 in 辞書名　:
# 変数名にキー名が順番に挿入される。値を呼び出すにはfruits[変数名]　[]内に''は用いない。
for fruit in fruits :
    print(fruit+'は'+fruits[fruit]+'という意味です')
```

**関数の定義**

```python
# 関数は「def 関数名():」のように定義する。コロンを忘れない。
# 関数に引数を渡す場合は、「def 関数名(引数):」とする
def print_hand() :
    print('グーを出しました')
# 関数名()のように() をつけて呼び出す。
print_hand() 
```
**ファイルの分割とモジュールの呼び出し

```python
# モジュールを読み込んで使いたいファイルに「import モジュール名」と書くことで読み込む。
# ※モジュール名はファイル名から拡張子（.py）を取り除いたもの。
import utils
#「モジュール名.関数名()」と書くことで、モジュール内の関数を実行することができます。
utils.print_hand(player_hand, player_name)
# 標準ライブラリと呼ばれる関数を格納したモジュールが用意されている。
import math , import random , import datetime , …etc
```
**pythonにおけるクラスとインスタンス**

```python
# クラスは「class クラス名:」とすることで定義出来る
 class MenuItem:
#  クラス名()でインスタンスを生成する事が出来る
# 「変数名 = クラス名()」とすることで、生成したインスタンスを変数に代入することが出来る
 menu_item1 = MenuItem()
# クラスの中で定義した関数のことをメソッドと呼ぶ。
# メソッドの定義の方法は通常の関数と同様だが、第1引数にselfを追加する必要がある。
# クラスの中で定義したメソッドは、「インスタンス.メソッド名()」とすることで、
  そのメソッドを呼び出すことが出来る
class MenuItem:
    def info(self) :
        print('メニューの名前と値段が表示されます')
# __init__メソッドは、「クラス名()」でインスタンスを生成した直後に自動で呼び出すことができる
# インスタンスを生成している「クラス名()」に対して引数を渡すことで、__init__メソッドにその値を渡すことができる
class MenuItem:
    def __init__(self,name,price):
        self.name = name
        self.price = price
    def info(self):
        return self.name + ': ¥' + str(self.price)
menu_item1 = MenuItem('サンドイッチ',500)
print(menu_item1.info())
```

**モジュールからクラスを直接呼出す**

```python
# from モジュール名 import クラス名とすることで、特定のクラスを直接呼び出すことが出来る
```

**継承**

```python
#「class 新しいクラス名(元となるクラス名):」とすることで他のクラスを継承することが出来る
class Food(MenuItem):
# super().メソッド名()」とすることで、親クラス内に定義されたインスタンスメソッドを
# そのまま利用することが出来る。末尾に:は不要。
```
国会でも話に上がった "HASH" をPythonで -- hash()じゃないよ! --

以前、”国会にhash関数の話が出たwww”といって、そっちの界隈の人でちょっとした話題になっていました。

では、hashとはなんなのか？分からない人もいると思います。

それがわかっても、Pythonでの実装がわからない方もいらっしゃると思いますので、この記事を書いた次第です。

# hashって？

wikipediaを参照すると

>
データから算出した小さな値。各データを区別・表現する目的に用いる。


となっています。

つまり、<b>あるデータから、それ固有の値を取り出して(計算から導き出す)、データの区別に使うための値</b>。です

この<b>計算</b>というのが大事で、たとえば、長さが400ページ以上もある本を文字に落とし込んで所得したhashと、

その文字列の句点と読点を一個だけ入れ替えた文字列のhashは<b>異なります</b>。

そこから、文書の改ざん対策などにも用いられるんですね。

また、その『元からhashを求めるのは用意である』が『hashから元を求めるのは非常に困難である』という性質を利用して、暗号・セキュリティにも用いられています。
# Pythonで実装

Pythonにはhash関数が元からありますので、それを利用してみましょう。

```python
>>> hash("1")  # "ハッシュ不可能"(listやset, dictなど)は用いないでください
4940519975841726253
```

求められましたね。

しかし、<b>これではだめです</b>

このhashが<b>信頼できるのは、このインタープリタを閉じるまでだから</b>です。

一度閉じて、もう一度実行してみましょう。

```python
>>> hash("1")
2261270426266027010
```

おなじ文字列のhashを取り出したにもかかわらず、違う値が出ていますよね。

このように、正当性を確かめるには、標準のhashは不向きであるとわかります。

そこで使うのが、**hashlib**です

```python
>>> import hashlib
>>> hashlib.md5(b"1").digest()  # bytesにしましょう
b'\xc4\xcaB8\xa0\xb9#\x82\r\xccP\x9aou\x84\x9b'
  # 一度閉じます
>>> import hashlib
>>> hashlib.md5(b"1").digest()
b'\xc4\xcaB8\xa0\xb9#\x82\r\xccP\x9aou\x84\x9b'  # 同じ値が返ってきます
```

みなさんが同じコードを打っても、同じ値が返ってくるはずです。

これが、一意性を保っているということです。

MD5(hash化の方法の種類です)のほかに、SHA1、SHA224、SHA256、SHA384、SHA512に対応しているようです。

ユーザーのパスワードをhash化して持っておき、ログインしようとしたときに、そのhashと入力された文字列のhashを比べる、なんてこともできますよね。
MD5に関しては、衝突(別のデータが同じhash値を持つこと)が他のものと比べて多いようなので、注意です


しかし、単にハッシュにしただけでは脆弱で、Brute-Force-Attack(総当たり攻撃)に対抗するだけの力がありません。

なので、Salt(パスワードと関係のない値)と反復を繰り返すのがhashlib.pbkdf2_hmac()です。

* より高度な使用

```python
>>> import os, hashlib, binascii
>>> salt = os.urandom(64)  # osの提供する64文字長の信頼できるrandomなbytes
>>> salt
b'\xc0<U\xdc5\xea\x8d+y\xe6W\x882U\xdaG\xbe\xd5\x19\xc0\xb2l\xf5\xd5/~W2\xa9\x92z\x8b\xff\xba\x8bs\x95t)I\xd1s\xfa.\x85R\xff\xd6\x89\x10n\xb7\xc3<\x84\x87\xea\xe6X\x8a\xdb,\xc3\x1c'
>>> dk= hashlib.pbkdf2_hmac("sha256", b"PaSsWoRd", salt, 100000)  # sha256でb"PaSsWoRd"とsaltを使って100000回hmacの反復
>>> binascii.hexlify(dk)  # 得られたhash
b'53ce88a1559e955b7b68794225365af09261f0a411629cef554de208e33e8da7'
```

といった感じです。

最低反復は 10,000回以上回すことが推奨されています。

それでは皆さん、よいPythonLifeを!!
【覚書】回転した場合の座標位置の計算方法

# 覚書

プログラミングするときについ忘れてぐぐるので残しておく。
なぜそうなるか？という説明は読むのが面倒なのでどうすればいいかだけ書いておく。なぜそうなるか？というのを知りたい場合は三角関数でぐぐってください。
学校で習う三角関数もちゃんと役に立つでしょ。:smirk:

## 回転した座標の位置
(x, y) 座標の点を(cx, cy)を中心に r 度反時計回りに回転させた場合の座標(x', y')

x' = (x - cx) * cos(r) - (y - cy) * sin(r) + cx
y' = (x - cx) * sin(r) + (y - cy) * cos(r) + cy  

(x', y')

として求める。

## 画像の中心
画像の中心点は、幅wの半分, 高さhの半分が中心なので

center = (w/2, h/2)

となる。
Raspberrypiで起動時にkivyを立ち上げる


起動時にプログラムを実行させる方法はいくつかありますが、今回はGUIを起動するので、autostartで実行しています
/etc/rc.localだと、rootで立ち上がってしまうので、/home/piで作成している環境が動作しません。

## autostart

- ファイル

```
$ vim ~/.config/lxsession/LXDE-pi/autostart 
```

- 起動したいシェルを記述

```
@/home/pi/start.sh 
```

## シェルの注意

- 環境変数が必要な場合は、exportを実行
- kivyの中で相対パスでfontの読み込み設定していると失敗するのでフルパスで指定するか、ディレクトリを移動させて実行する
- kivyは標準エラー出力にログを出すので、**&>** でログファイルに出力すること


例）

```
#!/bin/bash
export GOOGLE_APPLICATION_CREDENTIALS=XXXXX

cd /home/pi/python/

/usr/bin/python3 main.py &> /home/pi/log/kivy.log

```

立ち上がらない場合はログファイルを参照してdebug。
ポリーモフィック関連付け（初級）

##きっかけ
ポリモーフィックをrailsガイドをみて勉強したので、メモを共有します

##具体例（railsガイドより引用）
写真(picture)モデルがあり、このモデルを従業員(employee)モデルと製品(product)モデルの両方に従属させたいとします。

```
 class Picture < ApplicationRecord 
   belongs_to :imageable, polymorphic: true 
 end 
  
 class Employee < ApplicationRecord 
   has_many :pictures, as: :imageable
 end 
   
 class Product < ApplicationRecord 
   has_many :pictures, as: :imageable 
 end 
```
##解説
はじめにポリーモフィック関連付けは、一つのモデルが複数のモデルに属していることを簡単に表現することができるものです。
所属する側の写真モデルでは、belongs_to :imageable, polymofic: trueとすることで、他の複数のモデルに属することができるようにしています。
そして、所属される側のモデルにはas: :imageableとすることで所属先とすることができています。
JavaScriptでUUID4を実現させる


# タイトルのまま[JavaScriptでUUID4を実現させる]

参照先:[JavaScript で UUID (Ver4)][link1]

こちらを参考にminifyしました。

```
function uuid4(){for(var x="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".split(""),t=0,o=x.length;t<o;t++)switch(x[t]){case"x":x[t]=Math.floor(16*Math.random()).toString(16);break;case"y":x[t]=(Math.floor(4*Math.random())+8).toString(16)}return x.join("")}

```


以上です。

[link1]:https://qiita.com/psn/items/d7ac5bdb5b5633bae165
ActiveRecordのアソシエーションにおけるhas_manyのdependentオプションについて

##きっかけ
railsガイドを読んでいて、気になったので、同じように「？」になった人のためにまとめました

##具体例（railsガイドより引用）
```
class Author < ApplicationRecord 
   has_many :books, dependent: :destroy 
 end 
 
 class Book < ApplicationRecord 
   belongs_to :author 
 end 
```
ここでいうdependentオプションはどういった役割を果たしているのか、全くわかりませんでした。

##意味
ここでいうdependentオプションは親であるAuthorモデルの投稿が削除されたら、それに紐づく子であるBookモデルの投稿も削除されるという意味です。
kintone アプリで、サブテーブルのブランクレコードを削除して保存してみた

# ０．はじめに

以前、こちらの投稿をやってみましたが、

* [kintone アプリで、日付を入力して、別フィールドに値を自動入力させてみた \- Qiita](https://qiita.com/kusokamayarou/items/a7b16ed6cbc2b0b0c1f2)

kintone アプリで、
サブテーブルを設定して、レコードを作成・編集すると、
ブランクレコードであっても…、
サブテーブルに必ずレコードが一つ保存されてしまうみたいなので、
レコード保存時に、サブテーブルのブランクレコードを削除したいな、

と思い、やってみました。

# １．JavaScript ファイルを作成する
1. 以下の JavaScript ファイルを作成し、以下の部分を修正します。
    * [ｻﾌﾞﾃｰﾌﾞﾙのﾌｨｰﾙﾄﾞｺｰﾄﾞ名] : サブテーブルのフィールドコード名
    * ※ 以降は、サブテーブルの中の項目のフィールドコードで、ブランクレコードか判定し、削除する条件になります。
    * `![ｻﾌﾞﾃｰﾌﾞﾙのﾌｨｰﾙﾄﾞｺｰﾄﾞ名][i].value.[ｻﾌﾞﾃｰﾌﾞﾙ項目①のﾌｨｰﾙﾄﾞｺｰﾄﾞ名].value`
    * `[ｻﾌﾞﾃｰﾌﾞﾙのﾌｨｰﾙﾄﾞｺｰﾄﾞ名][i].value.[ｻﾌﾞﾃｰﾌﾞﾙ項目②のﾌｨｰﾙﾄﾞｺｰﾄﾞ名].value.length == 0`
        * 配列の場合は、上記の条件式になります。
    * `![ｻﾌﾞﾃｰﾌﾞﾙのﾌｨｰﾙﾄﾞｺｰﾄﾞ名][i].value.[ｻﾌﾞﾃｰﾌﾞﾙ項目③のﾌｨｰﾙﾄﾞｺｰﾄﾞ名].value`
<br>

```javascript:Kintone_ClearSubTableBlankRecord.js
//
// サブテーブル空白レコードクリアプログラム
//
// Copyright (c) 2018 KUSOKAMAYAROU
//
// Licensed under the MIT License
//

(function () {
    "use strict";

    // 「【Kintone】Javascriptカスタマイズ event(インベト)を使いこなせ！」
    // http://infosys.tokyo/kin_171030
    // 「Javascriptで指定した配列の要素を削除する - Qiita」
    // https://qiita.com/Sekky0905/items/598b47fea2106b8c140e

    kintone.events.on(['app.record.create.submit','app.record.edit.submit','app.record.index.edit.submit'], function(event) {
        var record = event.record;
        var [ｻﾌﾞﾃｰﾌﾞﾙのﾌｨｰﾙﾄﾞｺｰﾄﾞ名] = record.[ｻﾌﾞﾃｰﾌﾞﾙのﾌｨｰﾙﾄﾞｺｰﾄﾞ名].value;
        for (var i = [ｻﾌﾞﾃｰﾌﾞﾙのﾌｨｰﾙﾄﾞｺｰﾄﾞ名].length - 1; i > -1; i--) {
            if (![ｻﾌﾞﾃｰﾌﾞﾙのﾌｨｰﾙﾄﾞｺｰﾄﾞ名][i].value.[ｻﾌﾞﾃｰﾌﾞﾙ項目①のﾌｨｰﾙﾄﾞｺｰﾄﾞ名].value
                && [ｻﾌﾞﾃｰﾌﾞﾙのﾌｨｰﾙﾄﾞｺｰﾄﾞ名][i].value.[ｻﾌﾞﾃｰﾌﾞﾙ項目②のﾌｨｰﾙﾄﾞｺｰﾄﾞ名].value.length == 0
                && ![ｻﾌﾞﾃｰﾌﾞﾙのﾌｨｰﾙﾄﾞｺｰﾄﾞ名][i].value.[ｻﾌﾞﾃｰﾌﾞﾙ項目③のﾌｨｰﾙﾄﾞｺｰﾄﾞ名].value) {
                [ｻﾌﾞﾃｰﾌﾞﾙのﾌｨｰﾙﾄﾞｺｰﾄﾞ名].splice(i, 1);
            }
        }
        return event;
    });

})();
```

# ２．JavaScript ファイルをアップロードする
1. まず、アプリの設定画面を開き、「設定」タブの「JavaScript / CSSでカスタマイズ」リンクをクリックします。
<br><br>
    * ![0001.png](https://qiita-image-store.s3.amazonaws.com/0/161939/f1db54f8-76ad-f76c-1945-e15376c3d11b.png)
　
1. 「JavaScript / CSSでカスタマイズ」画面が開くので、「PC用のJavaScriptファイル」の「アップロードして追加」ボタンを押下し、作成した JavaScript ファイル (Kintone_ClearSubTableBlankRecord.js) をアップロードします。
<br>
    * ![0002.png](https://qiita-image-store.s3.amazonaws.com/0/161939/d945cac3-1a42-468e-31a0-37f9ad2c946a.png)

# ９９．ハマりポイント

* それほど困ったことはありませんでしたが…、
<br><br>
* ブランクレコードか判定し、削除する条件で、配列の場合の条件式に多少時間を食いました。

# ＸＸ．まとめ

kintone を使っていると、

意外にこういう細かい機能が欲しくなります。

参考になれば♪

---

* ※ 参考 :
    * [【Kintone】Javascriptカスタマイズ event\(インベト\)を使いこなせ！](http://infosys.tokyo/kin_171030)
    * [Javascriptで指定した配列の要素を削除する \- Qiita](https://qiita.com/Sekky0905/items/598b47fea2106b8c140e)
uglifyjs-webpack-plugin のせいで npm install ができない

AWS EC2 インスタンスで下記のような感じのエラーが出て `npm install` ができない

```
npm ERR! Linux 4.4.0
npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "install"
npm ERR! node v4.2.6
npm ERR! npm  v3.5.2
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn

npm ERR! uglifyjs-webpack-plugin@0.4.6 postinstall: `node lib/post_install.js`
npm ERR! spawn ENOENT
npm ERR!
npm ERR! Failed at the uglifyjs-webpack-plugin@0.4.6 postinstall script 'node lib/post_install.js'.
npm ERR! Make sure you have the latest version of node.js and npm installed.
npm ERR! If you do, this is most likely a problem with the uglifyjs-webpack-plugin package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node lib/post_install.js
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs uglifyjs-webpack-plugin
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!     npm owner ls uglifyjs-webpack-plugin
npm ERR! There is likely additional logging output above.

npm ERR! Please include the following file with any support request:
npm ERR!     /hogehoge/npm-debug.log
```

## 解決方法１
`npm cache clean` をしてみる
https://github.com/webpack-contrib/uglifyjs-webpack-plugin/issues/113

## 解決方法２
環境によっては nodejs をインストールしてもがリンクされない
`apt-get install nodejs-legacy` で node をいれてみる
https://github.com/webpack-contrib/uglifyjs-webpack-plugin/issues/129#issuecomment-355157180
開発現場で必要　git stash 操作

# まとめようと思った理由

　**　開発現場で３つ４つタスクを同時にこなしていく中で、作業が途中でコミットしたくないけど別のブランチで作業をしないといけない。**

**↑開発現場ではよくあることです。そういう時に作業を一時避難することが多いです。
新卒でやり方をよく忘れるので簡単にまとめましたww**

## 作業を一次避難する

- git stash
- git stash save
__↑一緒の意味__

## 避難した作業を確認する

- git stash list

**復元するときも削除するときも一度このコマンドで確認しとく**

## 避難した作業を復元する

// 最新の作業を復元する

- git stash apply 

// ステージの状況を復元する

- git stash apply --index

// 特定の作業を復元する

- git stash apply [スタッシュ名]

// 例

- git stash apply stash@{0}

## 避難した作業を削除

// 最新の作業を削除する

- git stash drop

// 特定の作業を削除する

- git stash drop [スタッシュ名]
- git stash drop stash@{1}

//全ての避難した作業を削除する

- git stash clear

# 終わりに

**git stash を用いて複数のタスクをこなしていきたいもんですね**
**復元や削除するときは必ず git stash listで番号を確認しときましょう**
Djangoでウェブアプリ - cssを使ってみる 

Djangoを使ってウェブアプリを作ります
cssを使ってみます

- このページで作成されたDjango環境は[ここ](https://github.com/eggplnt/northernlights10)からダウンロード可能です

#1. cssを用意します
- `northernlights`フォルダの`settings.py`の末尾に下記を追加します

```python:northernlights/settings.py
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
```

- `manage.py`があるディレクトリで、｀static｀サブフォルダを作成し、その中に下記のようなcssを作成します

```css:test.css
.a1 {
  background-color:  #98d98e;
  height: 120px;
  padding: 20px;
}
.b1 {
  background-color:  #e4de8a;
  padding-left: 20px;
  height: 40px;
  text-align:left;
  font-size: 18pt
}
```
<img width="620" alt="スクリーンショット 2018-09-05 15.39.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/ba9cf88b-e4a0-3dea-02b4-697d515f730f.png">

#2. htmlを用意します
- `penguin`フォルダの`urls.py`に以下を追記します

```python:penguin/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('test', views.test, name='test'),
    path('', views.index, name='index'),
]
```

- `penguin`フォルダの`views.py`に以下を追記します

```python:penguin/views.py
from django.shortcuts import render

def index(request):
    return render(request, 'index.html')

def test(request):
    return render(request, 'test.html')
```

- `penguin`フォルダの`templates`サブフォルダに下記のようなhtmlを追加します

```html:test.html
{% load static %}
<html>
  <head>
  </head>
  <body>
    {% block extrahead %}
      <link href="{% static 'test.css' %}" rel="stylesheet">
    {% endblock %}

    <div class='a1'>
      <h1>テストページ</h1>
    </div>

    <div class='b1'>
      <p>コンテンツ</p>
    </div>

  </body>
</html>
```

#3. 稼働を確認します

- `python manage.py runserver`でDjangoを起動します
- ブラウザで`localhost:8000/test`へアクセスし、用意したcssが適用されることを確認します

<img width="452" alt="スクリーンショット 2018-09-05 15.48.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/125842/72bc1760-18c7-5338-2ed3-bb61947c4571.png">
kubectlを複数クラスタに同時実行するスクリプトメモ

さっと同じkubectlを管理している複数クラスタに利用したかったので書いたスクリプトのメモ。

# 前提
- jq、kubectx、yaml2jsonをインストール済み
- kubeconfigのcontextに設定されているクラスタ全部に実行される

```sh
#!/bin/bash

set -u

KUBECOM=$1

clusters=`yaml2json ~/.kube/config | jq -r ".contexts[].name"`

for cluster_name in $clusters
do
  kubectx $cluster_name
  echo "kubectl $KUBECOM"
  kubectl $KUBECOM
done
```