OmniAICreator/Qiita-1.07M huggingface dataset:
Bitcoinで開発を行う上で、便利なサイト

Bitcoinのアプリケーションを開発する上で必要なExplorerやFaucet、APIなどをまとめています。もし良かったらご活用下さい。

## BTC

### Explorer
- [Bitcoin Core (BTC) Block Explorer](https://explorer.bitcoin.com/btc)

### Testnet Explorer
- [Bitcoin Testnet Block Explorer | BlockCypher](https://live.blockcypher.com/btc-testnet/)

### Testnet Faucet
- [Faucet - Bitcoin TestNet sandbox](https://testnet.manu.backend.hamburg/faucet)
- [Bitcoin testnet3 faucet](https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cad=rja&uact=8&ved=2ahUKEwjfs9C_7-7cAhUIurwKHRByCDYQFjABegQICRAB&url=https%3A%2F%2Ftestnet.coinfaucet.eu%2Fen%2F&usg=AOvVaw3D9oIqekNzk8XNWetXKPwb)

## BCH

### Explorer
- [Bitcoin Cash (BCH) Block Explorer](https://explorer.bitcoin.com/bch)

### Testnet Explorer
- [BLOCKTRAIL | Bitcoin API and Block Explorer](https://www.blocktrail.com/tBCC)

### Testnet Faucet
- [Bitcoin Cash Faucet - Bitcoin TestNet sandbox](https://testnet.manu.backend.hamburg/bitcoin-cash-faucet)

## API
[bitpay/insight-api: The bitcoin blockchain API powering Insight](https://github.com/bitpay/insight-api)

### endpoint
- BTC Mainnet: https://insight.bitpay.com/api
- BTC Testnet: https://test-insight.bitpay.com/api
- BCH Mainnet: https://bch-insight.bitpay.com/api
- BCH Testnet: https://test-bch-insight.bitpay.com/api


## Script、OP_CODEについて参照したい時
- [Script - Bitcoin Wiki](https://en.bitcoin.it/wiki/Script)

## BitcoinのContractの参考資料
- [Contract - Bitcoin Wiki](https://en.bitcoin.it/wiki/Contract)
- [Bitcoin contracts — Curiosity driven](https://curiosity-driven.org/bitcoin-contracts)
Open Api Specification(Swagger)ファイルを分割する方法

# 問題

Open Api Specificationファイルを書き進めると中規模程度のサーバですら仕様ファイルが1000行を簡単に超える。
しかも1つのAPIについての記述がpaths下、requestbody下、schema下など非常に分散するので編集が辛い。

# 既存の解決策

* [中規模のSwaggerファイルをいい感じに管理するために薄いフレームワーク作った \- swglow \- Qiita](https://qiita.com/chuross/items/7cdea50b965d98d8bd55)
    * OAS 3.0に対応していない
* [OpenAPI Spec 3\.0でのSwagger Specの分割管理 \- Qiita](https://qiita.com/funa1g/items/f5952e1d77de95a155ae)
    * JSON PATHの仕様に則っており良いが、書かれている通りswagger-editorやswagger-uiのようなツールで分割したままファイルを編集・表示することが非常に難しい
    * また分割したファイルへ詳細を書いても結局のところ親のファイルで$refにより参照先を書かなければいけないため手間がかかる

swglowの分割手法は非常に良い気がしたが、現状ではOAS 3.0のファイルには対応していなかった。
コードを見ていると、swglowではswaggerの構造に特化した処理をしているがそもそも単純にyamlファイルをマージする感じでよいのではないかと思った。
なので自分で作ることにした。

# 解決策

### 1. Open Api Specificationファイルをyamlとして書いた上でAPI種別ごとに分割する。
[petstore API](http://petstore.swagger.io/)で例えるなら以下のように分割する感じ。

* common.yml
    * [openapiフィールドやinfoフィールドなど共通のフィールド](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#openapi-object)
* pet.yml
    * petタグが付けられたpathsオブジェクトやcomponents/requestBodies, components/schema などを集約する
* store.yml
    * storeタグが付けられたpathsオブジェクトやcomponents/requestBodies, components/schema などを集約する
* user.yml
    * petタグが付けられたpathsオブジェクトやcomponents/requestBodies, components/schema などを集約する

### 2. [yaml_strict_merge](https://github.com/bigwheel/yaml_strict_merge)ツールを使って分割したyamlを合成(merge)する

rubyが動く環境ならgemで直接実行しても良いが、環境への依存を最小限にしたければ[kbigwheel/yaml\_strict\_merge \- Docker Hub](https://hub.docker.com/r/kbigwheel/yaml_strict_merge/)が使える。

# この手法のメリット

## 1. 分割方法が非常に柔軟

単純にyamlのツリーをすべてマージするだけなので、分割方法の自由度が非常に高くAPI設計に合わせて分割できる。

## 2. 分割したファイルもOpen Api Specificationファイルとして正当にできる

yaml_strict_mergeは単純にすべてのファイルを合成する。
ということは、分割したpet.ymlやstore.ymlでもトップレベルで[openapiフィールドやinfoフィールドなど](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#oasObject)の必須プロパティを
きちんと書けば分割したファイルもまた正規のOASファイルとして扱うことができる。
それによりJSON schemaによるvalidationやSwagger-editorなどによる編集支援もエラーを無視する必要なく十全に使用できる。

## 3. API仕様のズレ・衝突の早期検知

API仕様ファイルを分割した場合、お互いのファイルで矛盾した記述が行われる可能性がある。
例えば２つのファイルでたまたま同じスキーマ名を付けてしまった、あるいはOASバージョン指定が3.0.0と3.0.1でずれた場合などだ。
この問題は非常にやっかいで、もしそれに気づけなかった場合、合成結果がどちらになるかは合成方法に依存し、非常に気づきづらい潜在的なバグとなる。

私が調べた限りjsonやyamlのメジャーなmergeツールのすべてはこの矛盾を無視してどちらかの値を無条件で選択する。
[しかしyaml_strict_mergeはこの値の矛盾を許容しない。このツールは同じオブジェクトの同じプロパティの値が矛盾した場合、エラーが出て処理が止まる。配列の長さが違った場合や配列の要素が異なる場合も同様である。](https://github.com/bigwheel/yaml_strict_merge/blob/a3ea9c67/lib/yaml_strict_merge.rb#L11-L38)
これによりOASファイルを分割しても、早期に定義のズレ・矛盾を検出できる。

# 蛇足

yamlではアンカーとエイリアスを使うことでよりDRYに記述できるが、swagger仕様的にはこれを許容していない。
swagger-uiは概ね正常に描画してくれるがたまに表示されないときもある。
そこで[bigwheel/yaml\_expand\_alias](https://github.com/bigwheel/yaml_expand_alias)を使えばalias先でanchorの値を展開しつつすべてのalias/anchorを取り除ける。

この2つを組み合わせて、分割したファイルでは特定リソースに集中したAPI定義を集めた上で可能限りalias/anchorを使いDRYにしつつ、
合成した先のファイルはanchor/aliasがなくクリーンですべてのAPI情報が集約されたものにするというのが2018/09時点での僕のベストソリューション。
Windows10でOpenSSHの接続時エラーの対処方法

windows10ではOpenSSHが正式にサポートされるようになり、windowsでのSSHが簡単に出来るようになりました。ただ使っているとこんな感じの接続エラーで接続出来ないことがあります。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:bz0bwurjI3mT2s17YKf2hOX1v8aO01RgRho/+rWwcOE.
Please contact your system administrator.
```

このエラーは簡単に言うと接続先のサーバの情報が変わったときに起こるエラーで、安全な接続を行うための措置だそうです（間違っていたら補足ください）。接続しても問題の無いサーバだった場合はこのエラーを避ける必要がありますが、macやlinuxだと``ssh-keygen -R hostname``で簡単に回避できますが、```Updating known_hosts is not supported in Windows yet ```となり、windowsではコマンドで情報を更新することが出来ないようです。そこでエラーメッセージの中にある「known_hosts」ファイルを直接修正することで解決できました。ファイルの場所はエラーメッセージ内にある、

``Add correct host key in C:\\Users\\ユーザー名\.ssh\known_hosts to get rid of this message.
``
を確認してください。修正はメモ帳でOKです。（\記号が二重になっているところは一個に書き直す）
ここから、エラーの出るホスト名が書かれている1行を消して再度sshを行うと、エラーを出すことなく接続出来ます。

※この方法はセキュリティ的に問題ないときに行ったほうがいいですが、そこは自己責任でどうぞ。

##参考

[SSH接続エラー回避方法：.ssh/known_hostsから特定のホストを削除する/削除しないで対処する3つの方法](https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938)
[Windowsで始める初めてのSSH](http://memomo2.blogspot.com/2018/06/windowsssh.html)
Docker for Windows で、docker-compose build 時に  'deb.debian.org' の名前解決に失敗する

# 環境
* docker for windows (Version 18.06.1-ce-win73)
* Windows 10 Pro (Version 1803)

# 事象
* docker-compose build をした際に、以下のようなエラーがでて先へ進めなくなった
  
  ```sh
  Temporary failure resolving 'deb.debian.org'
  ```
* Dockerfile は以下のような感じ

```Dockefile
FROM php:7.2-apache

RUN apt-get update\
    && apt-get install -y --no-install-recommends git\
    && apt-get install -y --no-install-recommends openssh-client\
    && apt-get install -y --no-install-recommends zip\
    && apt-get install -y --no-install-recommends sudo\
    && apt-get install -y --no-install-recommends supervisor\
    && apt-get install -y --no-install-recommends wget\
    && apt-get install -y --no-install-recommends vim\
    && apt-get upgrade -y\
    && apt-get clean -y
```

# 対応
* Docker のDNS設定を固定にする
![2018-09-04_20h12_21.png](https://qiita-image-store.s3.amazonaws.com/0/65416/b703fbb0-1aea-f3d4-07fe-58649d3063c4.png)
Cinema4D: マテリアルがアサインされていないテクスチャタグを削除するスクリプト


マテリアルがアサインされていないテクスチャタグをシーンの中から探してすべて削除するスクリプトを書きました．

テクスチャタグにマテリアルがアサインされていない場合，テクスチャタグがハテナマークになります．テクスチャタグには投影法などのデータが格納されているので，再利用することもありますが，不要であれば削除して整理させたいところです．これらの削除は標準機能でも出来ますが，オブジェクトマネージャのフィルタを使ったりする必要があるので，ボタン一発で出来ないかなと思ったのがきっかけです．

先に言っておきますが，十分なテストをしたわけではありません．もし使う場合は参考程度にしてください．

```
import c4d
from c4d import gui

## Search object Hierarchy
def GetNextObject(obj):

    if obj.GetDown():
        obj = obj.GetDown()
        return obj

    if obj.GetNext():
        obj = obj.GetNext()
        return obj

    while obj.GetUp():
        obj = obj.GetUp()
        if obj.GetNext():
            obj = obj.GetNext()
            return obj

    return False


# Delete texture tag if not assigned material
def Delete_Textag_No_Material(obj):

    tag = obj.GetFirstTag()

    while tag:
        if tag.GetType() == c4d.Ttexture:
            print tag.GetType()
            if not tag[c4d.TEXTURETAG_MATERIAL]:
                 tempTag = tag.GetNext()
                 doc.AddUndo(c4d.UNDOTYPE_DELETE, tag)
                 tag.Remove()              
            else:
                tempTag = tag.GetNext()
        else:
            tempTag = tag.GetNext()

        tag = tempTag

    return



def main():

    doc = c4d.documents.GetActiveDocument()
    doc.StartUndo()
    obj = doc.GetFirstObject()

    if obj == None:
        print "Object is none"
        return None

    while obj:
        Delete_Textag_No_Material(obj)
        obj = GetNextObject(obj)


    doc.EndUndo()
    c4d.EventAdd()
    return


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


GetNextObject(obj):
シーン内の最初のオブジェクトから最後のオブジェクトまで階層を走査する関数です．

Delete_Textag_No_Material(obj):
objのタグを調べてマテリアルがないテクスチャタグを削除していきます．



```
tag = obj.GetFirstTag()
```
読み方そのままですが，オブジェクトの最初のタグを取得します．

while内でそのオブジェクトのタグがなくなるまでチェックしていきます．

```
while tag:
        if tag.GetType() == c4d.Ttexture:
            print tag.GetType()
            if not tag[c4d.TEXTURETAG_MATERIAL]:
                 tempTag = tag.GetNext()
                 doc.AddUndo(c4d.UNDOTYPE_DELETE, tag)
                 tag.Remove()              
            else:
                tempTag = tag.GetNext()
        else:
            tempTag = tag.GetNext()

        tag = tempTag
```

```
if not tag[c4d.TEXTURETAG_MATERIAL]:
```
もしテクスチャタグであれば，そのテクスチャタグにマテリアルがアサインされているかを確認します．

tempTag = tag.GetNext()
もしマテリアルがない場合(None)は，削除するまえにtemTag変数に自身の次のタグを代入しておきます．次のテクスチャタグがない場合は，Noneが代入されます．

```
doc.AddUndo(c4d.UNDOTYPE_DELETE, tag)
```
tagを削除する前にAddUndo関数を使ってUndoを記録しておきます．

```
tag.Remove()  
```
tagを削除します．

```
tempTag = tag.GetNext()
tag = tempTag
```
タグが削除された場合も，削除されなかった場合もtemTagに代入された次のタグを，tagに代入します．tempTag(次のタグ)がNoneならwhileを抜けます．

すべてのオブジェクトを走査していきます．

```
doc.EndUndo()
c4d.EventAdd()
```
最後にStarUndo()に対応するEndUndo()を追加し，c4d.EventAdd()で終了します．
【VMware vSphere】仮想マシンのコンソール画面にコピー&ペーストできるようにする

#はじめに
VMware vSphere環境を普段から使用していると、vSphere ClientやvSphere web Clientのあるシステムから仮想マシンにコピペできなくて「不便だ・・・」と感じたことが一度はあるのではないかと思います。
現行のバージョンではデフォルトで仮想マシンへのコピペが禁止されていますが、設定を有効にすればコピペができるようになるので、普段の作業の手間を省くためにも是非設定することをお勧めします。
今回は、以下3つの変更方法について説明します。

- vSphere ClientからVMへのコピペを可能にする。
- vSphere Web ClientからVMへのコピペを可能にする。
- ESXi上にある全てのVMに対してコピペを可能にする。

#前提条件
作業を開始する前に以下の2点を確認してください。

**１．仮想マシンがパワーオフされていること**
　　パワーオフされていないと設定の追加及び反映ができない
**２．仮想マシンにvmware toolsがインストールされていること**
　　コピペの機能はvmware toolsによってサポートされている


#vSphere Clientから変更する
###①対象マシンを右クリックし、設定の変更を選択
###②オプションタブから[詳細]>[全般]に移動
###③構成のパラメータボタンをクリック
###④行の追加をクリックし以下のパラメータを入力
| パラメータ    　  | 値　　　　　　　　　 |   
|:-----------------|------------------:|
| isolation.tools.copy.disable　　　 |FALSE              　　　　　　　　 |  
| isolation.tools.paste.disable　　　　|FALSE              　　　　　　　　|  
###⑤対象マシンを起動しコピペできるか確認

#vSphere Web Clientから変更する
大体の手順は同じです。
###①対象マシンを右クリックし、設定の変更を選択
###②VMオプションタブに移動し、[詳細]>[構成パラメータ]>[設定編集]をクリックする
![art](http://drive.google.com/uc?export=view&id=1Al5rHLU0Xkh0mjp-eAJQAdfRucBJCldF)
###③名前と値にパラメータと値を入力し[追加]をクリックする
パラメータは上記と同じ
![art2](http://drive.google.com/uc?export=view&id=18FsJFaZ1U2pLB_y5_drmgo9echCEwJ6y)
###④仮想マシンを起動して確認

#ESXiにSSH接続して変更する
ESXi上にある全ての仮想マシンの設定を変更する場合はESXi単位の変更が便利です。

###①SSHで対象のESXiにrootログイン
###②/etc/vmware/configファイルのバックアップを取る

```ruby:
cp /etc/vmware/config /etc/vmware/config.bak
ls /etc/vmware/
```
###③テキストエディタで/etc/vmware/configを開く

```ruby:
vi /etc/vmware/config 
```
###④以下のパラメータを入力し保存する

```ruby:
vmx.fullpath = "/bin/vmx"
isolation.tools.copy.disable="FALSE"
isolation.tools.paste.disable="FALSE"
```

###⑤vSphere Client/vSphere Web Clientにて仮想マシンを起動or再起動する

設定すると便利なので是非やってみてください。
以上です。
初めてのGitHubの利用備忘録

秘密鍵の作成
https://qiita.com/knife0125/items/50b80ad45d21ddec61a9

ターミナル操作手順
https://qiita.com/KosukeQiita/items/cf39d2922b77ac93f51d

エラーの対応例
https://teratail.com/questions/24590
要素を取得してきたときに変数に格納する理由

変数を取得したときにわざわざ変数に格納しなくてもそんなに回数使わないならいいのではないかと考えていたが、パフォーマンスに割と影響を与えるということがわかったのでメモ。

```html:html
<div id="sampleId">
  <span>a</span>
  <span>a</span>
  <span>a</span>
  <span>a</span>
  <span>a</span>
</div>  
```

```js:js 
let elem;
elem = document.getElementsByTagName('span');

//lengthを毎回取得
let statTime1 = new Date();
for (let i = 0; i < 100; i++) {
  for (let j = 0; j < elem.length ; j++) {
    console.log(elem[j])
  }
}
let endTime1 = new Date();


//lengthを予め定義
var statTime2 = new Date();
len = elem.length
for (let i = 0; i < 100; i++) {
  for (let j = 0;j < len; j++) {
    console.log(elem[j])
  }
}
var endTime2 = new Date();

console.log(endTime1 - statTime1 + 'ms'); //567ms
console.log(endTime2 - statTime2 + 'ms'); //465ms
```

処理の最初と最後にDateオブジェクトを生成することで、その差分から処理速度が計算できる。

length要素を毎回取得しに行くので、その分パフォーマンスが悪くなる。変数に格納すると、キャッシュされ、同じように監視する必要がなくなり、パフォーマンス性が上がることが、上記のことからわかった。
【Airflow】過去のジョブが実行されないようにする

# はじめに
　この記事では、インストール方法や初期設定などは紹介しません。Airflowのジョブの実行について困っている方向けに書いています。

# バージョン
- airflow 1.8.0
- python 3.6.0

# **catchup=False** にしても過去のジョブが実行される
- 例えば、毎日18:00にbashを実行するようなジョブがあったとして  
1/2 19:00　ジョブ停止  
1/5 19:00　ジョブ再開  
としたら普通は1/6 18:00に次のジョブが実行されると考えますが、Airflowでは**catchup=False**にしてもジョブを再開してすぐに1/5 18:00の分のジョブが実行されるようにできています。また、1/5 17:00にジョブを再開すると1/4 18:00の分のジョブが実行されます。つまり、１つ前のジョブが実行されてしまうということです...

## 対処方法
- `lib/python3.6/site-packages/airflow/jobs.py`の809行目あたりを書き換える。  

``` python:書き換え前
@provide_session
    def create_dag_run(self, dag, session=None):
        """
        This method checks whether a new DagRun needs to be created
        for a DAG based on scheduling interval
        Returns DagRun if one is scheduled. Otherwise returns None.
        """
       ...
            next_run_date = None
            if not last_scheduled_run:
                # First run
                task_start_dates = [t.start_date for t in dag.tasks]
                if task_start_dates:
                    next_run_date = dag.normalize_schedule(min(task_start_dates))
                    self.logger.debug("Next run date based on tasks {}"
                                      .format(next_run_date))
            else:
                next_run_date = dag.following_schedule(last_scheduled_run)
            
            # make sure backfills are also considered
            last_run = dag.get_last_dagrun(session=session)
       ...
```
``` python:書き換え後
@provide_session
    def create_dag_run(self, dag, session=None):
        """
        This method checks whether a new DagRun needs to be created
        for a DAG based on scheduling interval
        Returns DagRun if one is scheduled. Otherwise returns None.
        """
       ...
            next_run_date = None
            task_start_dates = [t.start_date for t in dag.tasks]
            if task_start_dates:
                next_run_date = dag.normalize_schedule(min(task_start_dates))
                self.logger.debug("Next run date based on tasks {}"
                                  .format(next_run_date))
 
            # make sure backfills are also considered
            last_run = dag.get_last_dagrun(session=session)

       ...
```
これで意図しないジョブの実行を防ぐことができます。

# サンプルコード
- example.shを毎日18:00に実行するジョブを定義します。
- bashコマンドを実行したいときは`BashOperator`を使います。

``` python:airflow/dag/test.py
import airflow
from airflow import utils
from airflow.operators.bash_operator import BashOperator
from airflow.models import DAG
from datetime import timedelta,datetime



default_args = {
    'owner': 'airflow',
    'start_date': datetime.now() - timedelta(days=1)
}

dag = DAG(
    dag_id='test',
    default_args=default_args,
    schedule_interval='0 18 * * *',
    catchup=False
    )

task1 = BashOperator(
    task_id='task1',
    bash_command='bash example.sh ',
    dag=dag)

```
- **重要**
    - 毎日実行するタスクなら、start_dateはちょうど24時間前になるように`datetime.now() - timedelta(days=1)`にする。
    - 毎週実行するタスクなら、ちょうど1週間前`datetime.now() - timedelta(days=7)`を指定する。

### 実行

```
$ airflow webserver -p 8080 &
$ airflow scheduler &
```
【Unity】EntityManager.Instantiateを少し便利にする拡張メソッド【小技】

丹下健三が今日生まれたから初透光です（）

#前提環境

 - Unity2018.2.6f1
 - ECS 0.0.12-preview.11

#問題提起
ECSにおいてISharedComponentDataはSetする度にチャンク移動を引き起こす割と面倒な存在です。
でもチャンク毎に処理する際にはかなり便利ですから使わざるを得ません。

何千ものEntityを生成して初期化する際にはISharedComponentDataも初期化せねばりませんよね？
その時に個々のEntityに対してEntityManager.SetSharedComponentDataするのは非効率です。
故に雛形となるEntity1つを先に生成してそれに対してのみEntityManager.SetSharedComponentDataした後、EntityManager.Instantiateすると効率が良いのです。
こういう場合は以下の例のようなコードになります。

```csharp:Spawn114514
void Spawn(EntityArchetype archetype)
{
    var template = EntityManager.CreateEntity(archetype);
    EntityManager.SetSharedComponentData(template, new MeshInstanceRenderer
    {
        // 適当な初期化
    });
    using (var rest = new NativeArray<Entity>(114514 - 1, Allocator.Temp, NativeArrayOptions.UninitializedMemory))
    {
        EntityManager.Instantiate(template, rest);
        for (int i = 0; i < rest.Length; i++)
            InitializeEntity(rest[i]); // 適当にIComponentDataを初期化
    }
    InitializeEntity(template);
}
```

……IComponentDataを初期化するInitializeEntityが２箇所で呼び出されている点がいただけませんね。
それに、このSpawnメソッドは114514個Entityを生成したいのにそれをストレートに表現しきれていない気がします。

#解決策
次の拡張メソッドを定義してあげましょう。

```csharp:NativeArrayUtility.cs
public static class NativeArrayUtility
{
    public static unsafe NativeArray<T> SkipFirst<T>(ref this NativeArray<T> array) where T : struct
    {
        var dataPointer = ((byte*)NativeArrayUnsafeUtility.GetUnsafePtr(array)) + UnsafeUtility.SizeOf<T>();
        var answer = NativeArrayUnsafeUtility.ConvertExistingDataToNativeArray<T>(dataPointer, array.Length - 1, Allocator.Invalid);
#if ENABLE_UNITY_COLLECTIONS_CHECKS
        NativeArrayUnsafeUtility.SetAtomicSafetyHandle(ref answer, AtomicSafetyHandle.GetTempUnsafePtrSliceHandle());
#endif
        return answer;
    }
}
```

ハイ、unsafe使います。
やっていることとしては引数のarrayのC++ポインタを受け取って最初の一つを飛ばした残りの配列を戻り値にしているだけです。
途中#ifの部分はEditorで実行する際に安全に読み書きを行うためのおまじないです。 ~~正直この部分をこう書くのが正しいのかわからないです。~~
この拡張メソッドで戻されたNativeArrayはDisposeしてはいけません。
なお、ref拡張メソッドである理由ですが、これは筆者がref教徒なだけであり、別にrefをつけない通常の拡張メソッドであってもよいでしょう。
NativeArray&lt;T&gt;のサイズは16byte程度ですからrefするかどうかギリギリのラインですしね。
using文との食い合わせを考えるとrefを使わないのも十分にアリだと思います。

in拡張メソッドにしないのはメソッド中でarray.Lengthという風にプロパティを呼び出しているからです。
非readonly structであるNativeArray&lt;T&gt;のプロパティを呼び出すと無駄コピーが発生してしまいますから避けるべきでしょう。LengthプロパティがLengthフィールドになるIL2CPP環境でどうなるのかは未検証なのでわかりませんが、よしたほうが良さそうです。

さて、上記拡張メソッドを定義した場合最初の例は以下のように書き換えられます。

```csharp:改良版
void Spawn(EntityArchetype archetype)
{
    var array = new NativeArray<Entity>(114514, Allocator.Temp, NativeArrayOptions.UninitializedMemory);
    try
    {
        array[0] = EntityManager.CreateEntity(archetype);
        EntityManager.SetSharedComponentData(array[0], new MeshInstanceRenderer
        {
            // 適当な初期化
        });
        EntityManager.Instantiate(array[0], array.SkipFirst());
        for (int i = 0; i < array.Length; i++)
            InitializeEntity(array[i]); // 適当にIComponentDataを初期化
    }
    finally
    {
        array.Dispose();
    }
}
```

かなりスッキリしましたね！

#感想
ECSもっと盛り上がって、どうぞ。
Raspi3+Raspbian9で複数のwifiインターフェースに個別にアクセスポイントの設定をする

#概要
- 他のwifiアクセスポイントの下で更にRaspberryPiをAP付きルーターとして動作させる場合に、全てのインターフェースが他のAPに繋ごうとする現象を回避する


###用途:
- ポケットwifiの同時接続数制限回避
- 勉強会等で、会場のwifiアクセスポイントor有線LANを利用しつつ、勉強会の参加者だけが利用できる無線LAN環境を仮設する(要:何らかのファイルサーバー)
    - 資料・サンプルコード・素材類の配布/共有/交換
    - 宿題の配布/回収

##前提条件
- RaspberryPi 3
- Raspbian 9
- インターフェース:
    - eth0:有線LAN
    - wlan0:Raspi3内蔵のもの(クライアントと接続する、LAN側)
    - wlan1:USB接続のドングル(他のAPと接続する、WAN側)

ここで、各々のインターフェースのIPアドレスはdhcpcdを使用して取得、wlan0のみ/etc/dhcpcd.confを編集してIPアドレスを固定し、それ以外は他のdhcpサーバーからIPアドレスを割り当ててもらうように設定する。




###問題点と対処法
問題点:

- 全てのインターフェースが他のAPに繋ぎに行ってしまって、自身がAPとして動作しない
    - 設定ファイルの名前を/etc/wpa_supplicant/wpa_supplicant-*(インターフェース)*.confに変更し、他のAPに接続するインターフェースを明示的に指定する


##設定ファイル名とデバイスの対応について:
- /etc/wpa_supplicant/wpa_supplicant-*(インターフェース)*.conf :指定したインターフェースのみ適用。 
    - 例えば、設定ファイル名をwpa_supplicant-wlan1.confとすると、、wlan1にのみ適用。
- /etc/wpa_supplicant/wpa_supplicant.conf: 未指定のインターフェース全てに適用。(APとして動かすインターフェースがある場合、このファイルがあってはならない。)

#参考資料
https://raspberrypi.stackexchange.com/questions/37920/how-do-i-set-up-networking-wifi-static-ip-address/37921#37921
内の、「Use different wpa_supplicant files」の項目
(raspbian7以降に適用らしいけど、raspbian9以外では試していない)
Google ColaboratoryでPyTorchを使おう

### ほぼ身内向けですが忘れっぽい人のために。。。

[Google Colaboratory](https://colab.research.google.com/notebooks/welcome.ipynb)にアクセス

colab上でコマンドを打つときは先頭に**!**を付ける必要があります。

- 新規python3ノートブックを作る   
- pythonのバージョン確認   
 ```!python  --version```   
- cudaのバージョン確認   
```!ls /usr/lib/x86_64-linux-gnu/libcuda*```   
- 確認できたら[PyTorchのダウンロードページ](https://pytorch.org/)にてダウンロード方法を選択   
- PyTorchをインストール   
一例:　```!pip3 install torch torchvision```   
- インポートできるか確認   
```import torch```
How to enable seek for audio tag by Laravel5.5 Audioタグでシークを有効にする

Laravel5.5で、mp3ファイルへのリンクを直接貼るのではなく、アプリケーションからバイナリを
返却するようにしたい時、Accept-Ranges、Content-Rangeヘッダをレスポンスに追加するとaudioタグでシークできるようになる

You can enable to seek in audio tags by adding "Accept-Ranges" and "Content-Range" headers.

controller

```
class AudioController extends Controller
{
    public function loadAudio(Request $request)
    {
        //S3からオーディオファイルの取得
        $audioFile = Storage::disk('s3')->get('test_audio.mp3');

        $fullSize = strlen($audioFile);
        $startByte = 0;
        $endByte = $fullSize - 1;
        return response($audioFile)
            ->header('Content-Type', 'audio/mpeg')
            ->header('Content-Length', $fullSize)
            ->header('Accept-Ranges', 'bytes')
            ->header('Content-Range', 'bytes '.$startByte.'-'.$startByte.'/'.$endByte);
    }
}
```

view file

```
<audio controls>
    <source src="{{ route('audio.route', compact('key')) }}" type="audio/wav">
    Your browser does not support the audio element.
</audio>
```

参考URL：
https://forums.asp.net/t/2125393.aspx?Html+5+Audio+control+seek+is+not+working+
paizaでSランクをとって,優秀なプログラマってどうやって測るんだろうって思った話

<img width="300" src="https://qiita-image-store.s3.amazonaws.com/0/91558/9040d0d0-5d6f-708b-9845-75459ed477a4.png">

# まとめ
「スプラトゥーンでS+とるぞ」って感覚で「paizaでSランクとるぞ」でpaizaやってたらすぐとれたって話。paizaのスキルチェックとは:thinking:ってなったけど、それって業務的なプログラムと関係なくねって思ったっていう話。
※paizaの批判記事ではありません。スキルチェックを楽しくやらせていただきました。ありがとうございました！!

<a href="#hondai">本題はここから。</a>

# paizaとは

paizaとはググると以下のような感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/3978cf7c-a250-2499-7160-38c2e882a1d1.png)

paizaはウェブサービスで、できることは以下の通り(たぶん)

- プログラムの勉強ができる
- 転職活動ができる
- スキルチェックができる←今回は話す内容はコレ

スキルチェックはお題が出されてプログラムを書く感じ。
プログラムの採点はプログラム完成までの時間と、テストケースを何個通ったかで採点される。(100点満点)

お題には難易度があって、難しい問題を解いたりとかするとランクが上がる。ランクはDからSまで。

以下で練習問題ができるので、気になった人はどうぞ。
[paizaプログラミングスキルチェック(練習問題)](https://paiza.jp/challenges/practice)

# Sランクまでの感想

一応以下のような感じ、Sランクまでいけた。スーパープログラマとか書かれてるけど、言い過ぎだと思う。
おそらくpaizaの年収は年齢とかも関係していると思われる。(不明)(多く問題を解くと上がるという噂を聞いた)(そもそも参考値)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/92e5831c-8a4b-6221-bd75-87b5d3675d6b.png)

やった問題は以下の通り。下の問題が初めにやった問題で、上の問題が後にやった問題。
全部の問題で実際にプログラムを書いている時間は合計2時間ぐらい。Sの問題は1つに30分以上かかっている。

凡例 (ランク)(問題番号):(問題タイトル)

- S010:ひとりすごろく
- S015:ABC文字列
- C055:ログのフィルター
- A009:ビームの反射
- D029:サイコロの裏面
- D055:ワインのキャッチコピー
- B012:チェックディジット
- C016:Leet文字列
- C010:安息の地を求めて
- D007:N倍の文字列

## それぞれのランク帯の話

**以下が公式の見解**

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/7863a162-ec70-bc95-3c6c-21ace0e90fde.png)
出展 [paizaプログラミングスキルチェック](https://paiza.jp/challenges/info)

**以下が個人的な見解**

|ランク|個人的な感想|目安のコード量(Python)|目安の完成までの時間|スキルレベル|
|:--|:--|:--|:--|:--|
|D|if文とか知ってれば解ける。|2~5行|1~5分|プログラミング習い始め|
|C|if文とか算術演算の仕方を知っていれば解ける。|10~20行|5~10分|プログラミング初心者|
|B|ドットインストールの入門レベルを知っていれば解ける。|20~40行|10~40分|プログラミング初心者|
|A|ちょいめんどい。配列をいい感じに使えると楽に解けたりする。|40~80行|30分~60分|プログラミング初心者に毛が生えた程度|
|S|めんどい。めんどい。|60~120行|30分~90分|プログラミング初心者に毛が生えた程度|

Sランクの問題はまぁめんどい。
でも、ある程度問題自体を理解できればわりと解ける。

Sランクの上位2%っていうのはなんともコメントできない。おそらく面倒くてみんな途中でやめてると推測できる。

競プロとかやったことないけど、たぶんpaizaは競プロの簡単版みたいな話だと思う。

<h1 id="hondai">優秀なプログラマって?:thinking:</h1>
ここからが本題。
paizaではSランクの人は「非常に高いスキル持っている」ことになっている。

**それってどうよ**

そもそもpaizaのスキルチェックの問題が解けたからといって業務で役に立つかといわれると、**NO**だと思う。

スキルチェックでの問題が業務で行うことはほぼまずないと考えられる。(アルゴリズム屋以外)
そんなことよりも、できてたほうがいいことってたくさんあるはず。でもそれってなに:thinking:

スキルチェックの問題が解けるレベルがあれば他のスキルレベルもある程度高いという意見は少しだけわかる←結論?

## 優秀なプログラマの条件ってなんだろう

- 読みやすいコードを書く
- バグをうまないコードが書ける
- コーディングがはやい
- ベストプラクティスをよく知っている
- コードだけじゃなくてチーム開発とかも得意
- コードだけじゃなく開発手法とかにも精通している
- デザインパターンとか詳しい
- OSSに貢献している
- GitHubが大草原
- なんか質問したらいい答えが返ってくる
- 常に新しいなにかを探している
- 言語仕様を把握している
- 勉強会とかに行っている
- 有名
- お金を持っている
- コーディングだけじゃなく運営もできる
- 経営もできる
- 人格者
- 全知
- 創設者なのにﾁｮｯﾄﾃﾞｷﾙとか言っている
- 優しい終身の独裁者

いろいろ挙げてみたけどあんまり納得いかない。煩雑すぎる。

## 優秀なプログラマってどうやって測るの

バグになりそうなコードを見つける機械学習を用いたシステムがあるらしい。
内部の実装的にはGitHub上にあるプロジェクトを教師として、変わっていきやすいコードを見つけるらしい。
そのシステムの応用として、コードに点数をつけることができたら面白そう。

以上の話はコードの測り方だが、プログラマのスキルの測り方ではない。
様々な要素が相まってその人(プログラマ)になるので、正しく人を見極めるスキルとは常人には到達できないのでは。

# 最後に:coffee:
いい感じにマサカリが飛んできそうな記事が書けました。
人事関係を行っている方、プログラマの方、教師の方、その他誰でも、ぜひコメントを下さい。よろしくお願いいたします。
Advanced rest clientでログインしてAPIを叩く方法

advanced rest clientはHTTPのリクエスト送信-レスポンス確認ができるchromeの拡張機能です。
デバッグするときに便利ですね。
curlでやってもいいのですが、諸々の処理を１ウィンドウで済ませられるのは嬉しいです。
よく使うリクエストを保存したり、履歴を参照できるのもありがたい。

よく使い方を忘れてしまうので、自分用も兼ねて書き残しておきます



# ログインする方法
ここでは「フォームにID／パスワードを入力してPOSTすると、cookieやらなんやらにトークンが発行される」形式のログインを行う場合の方法です

URLはID／パスワードを受け取るページのものを入力。
そのあとHeaderタブを開いてヘッダーを設定します。
Header NameにContent-type、値はapplication/x-www-form-urlencodedとします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242303/fa214e2c-241c-c55c-2b65-07fb5518e7b2.png)

それからbodyタブを開いてユーザ名とパスワードを入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242303/226d66f9-179e-ed30-6302-6be2c919aaf5.png)
 - 左側に入力要素のname,　右側に値を入れてあげます 
 - Body content typeをapplication/x-www-form-urlencoded, Editor viewをFormData(www-url-encoded)と入力して,
右上のSENDを押してみます。

うまくいけば、画面下のレスポンス表示部分にトークンが返ってくるはずです。
# APIを叩いてみる
ログインした状態でAPIを叩くにはHeaderにトークンを指定してあげる必要があります
cookieの場合はこんなかんじ↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242303/66e7ee58-8951-b056-2a66-786655727d82.png)

あとはvalueをもたせてsendして、想定した結果が返ってくるか試してみましょう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242303/1da67768-c869-17ff-341f-298cbfde3d5a.png)
Windows10でChocolateyを使ってみた

## この記事について…

開発用PCがWindows10にリプレースされたので、最近業務の合間にセットアップを進めています。
せっかくWindows10になったということで、気になっていた`Chocolatey`を使用したセットアップについて調査してみました。その備忘録を纏めておきます。
尚、2018/08/30現在 Windows10 1803を使用しています。

> 本当はWindows10標準で使用できる`PackageManagement`を使用するつもりで記事を書き始めたのですが、Twitterで色々苦戦されている方のツイートが確認できたこと、結局`Chocolatey`をWrapperしているだけということから、ひとまず`PackageManagement`は見送りしました。仮想環境を使って色々検証してから、次回以降使用してみたいところですね。)

## Chocolateyのサイトにアクセス

[Chocolatey](https://chocolatey.org/)のサイトにアクセスすると、[Install Chocolatey Now]と表示されたボタンが見付かるので押下します。すると、かなり丁寧にインストール手順が書かれているので、上から順に見ていきましょう。今回はPowerShellを使用してセットアップします。
尚、Windows10であれば要件は全て満たしています。

1. 管理者権限でPowerShellを立ち上げます。
2. PowerShell用のセットアップコマンドをコピーします。(Install with PowerShell.exe の項からコピーできます。)
3. 1.で立ち上げたPowerShellに2.でコピーしたコマンドを貼り付けして実行します。
4. 少し待つとインストールが完了します。
5. 特にエラーが出ていなければ、`choco`とか`choco -?`とかコマンドを実行してみましょう！

## PowerShell用のセットアップコマンドを確認する

```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
```

`Set-ExecutionPolicy Bypass -Scope Process -Force`の部分では、「現在のプロセスに限り強制的に実行ポリシーをBypass(ブロックされず、警告等も出ない)に変更」という処理をしています。
`iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))`の部分では、「Chocolateyのサイトから`install.ps1`をダウンロードして、`iex`(`Invoke-Expression`のエイリアス)でPowerShellスクリプトを実行」という処理をしています。

> 参考
> Web上にスクリプトを置いて、PowerShellで実行可能にしてみた（その1／Hello,World編）
> https://qiita.com/minr/items/b4f71dad4438707d84d3

## 操作方法

以下のようにコマンドを実行すると、色々なパッケージ操作を行うことができます。

```powershell
# パッケージの検索
choco list package_name
# パッケージのインストール
choco install package_name
# パッケージのアップグレード
# choco update は廃止であるとDocsに記載有
choco upgrade package_name
# パッケージのアンインストール
choco uninstall package_name
```

## ChocolateyGUIをインストールしてみよう

管理者権限でPowerShellを立ち上げて、下記のコマンドを実行するとChocolateyGUIをインストールすることができます。GUI形式でChocolateyのパッケージ管理ができて便利です。

```powershell
choco install chocolateygui
```

## Git for Windowsをインストールしてみよう

管理者権限でPowerShellを立ち上げて、下記のコマンドを実行するとGit for Windowsをインストールすることができます。

```powershell
choco install git --params "/NoShellIntegration /NoAutoCrlf"
```

`--params`によって指定した内容の詳細については[こちら](https://chocolatey.org/packages/git)を確認した方が確実だと思いますが、ざっくり説明すると`/NoShellIntegration`はインストーラーを使用した際の`Windows Explorer integration`のチェックボックスについてチェックを外した場合と同様、`/NoAutoCrlf`は`Configuring the line ending conversions`の値を`Checkout as-is, commit as-is`と指定した場合と同様に設定を行います。
前者についてはインストール時にしか変更できないものであり、後者については下記のコマンドを実行することと同様です。

```powershell
git config --file C:\ProgramData\Git\config core.autocrlf false
```

Chocolateyを使用するとGit for Windows以外にも色々とパッケージが自動インストールできますが、インストール時に設定初期値を変更したい場合があれば、一度Chocolateyのサイトで`--params`が準備されていないか確認してみるのがいいと思います。

## 使ってみた感想

ちょうど作業中にバージョンが上がったパッケージがあったのですが、`choco upgrade package_name`とするだけで面倒な操作なくアップグレードできた際は感動しました。(Linuxでは日常ですが、Windowsでできると感動。)
ChocolateyGUIを使用するとインストール済みのパッケージをxml形式で掃き出しすることができ、次回Windowsセットアップ時はそれを使用して一括インストールもできるようです。自宅機の話ですがWindows10になってからは再インストールをする機会も多いので、これでセットアップ作業がぐっと楽になるなーと思いました。
Windows7からのリプレースが盛んな時期ですが、是非Chocolateyをご検討ください。
Pythonで競プロに挑む日誌 vol.7 ~制約条件の利用と, sys.exit() による中断~

嵐は過ぎ去った.

# 現在の目標
* 今年の10月内に茶色を取得する **←イマココ**
* 年内に緑色を取得する
* [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す

#今日の問題
ABC085C - Otoshidama
https://beta.atcoder.jp/contests/abs/tasks/abc085_c

**結果**

```answer1.py
# coding: utf-8
N, Y = map(int, input().split())
ans = []
for i in range(N+1):
    for j in range(N+1 - i):
        k = N - (i + j)
        val = 10000 * i + 5000 * j + 1000 * k
        if val == Y:
            ans.append("{} {} {}".format(i, j, k))
            break
 
if ans == []:
    print("-1 -1 -1")
else:
    print(ans[0])

# 実行時間：832 ms
# メモリ　：3060 KB
# コード長：344 Byte
# 得点　　：300/300
```
問題文を素直にそのまま書き下したつもりなのですが...  なんじゃこりゃ！めっちゃ遅い.  なんでこんなに遅いのか...

少し粘ってみたのですが, あまり改善しなかったので他の方のコードを参照して書き直しました.  その結果がコチラ↓

```answer2.py
# coding utf-8
import sys
N, Y = map(int, input().split())
 
y = Y // 1000
diff = y - N
lim_a = y // 10
#ans = []
for a in range(lim_a + 1):
    b = (diff - 9 * a) // 4
    c = N - a - b
    val = (diff - 9 * a) % 4
    if b >= 0 and c >= 0 and val == 0:
        print(a, b, c, sep=" ")
        sys.exit()
        #ans.append("{} {} {}".format(a, b, c))
 
print("-1 -1 -1")
'''
if ans == []:
    print("-1 -1 -1")
else:
    print(ans[0])
'''

# 実行時間：18 ms
# メモリ　：3060 KB
# コード長：462 Byte
# 得点　　：300/300
```
今回は問題文から数式を立てて, パラメータをひとつ消して考えることが重要だったようです.

問題文の条件から2つ式を立てて, 1000 円札の枚数 c を消すと 10000　円札の枚数 a と, 5000円札の枚数 b に関する式が残ります.  そして, 問題文から算出される範囲内で a が決まれば, b と c は芋づる式に求まります.  最後に b と c が 0 以上の整数であることを確認したらおしまいです.

for ループがひとつ減ったこと, sys.exit() を使って途中でむだな計算をさせないことで実行時間が短くなったのでしょうか.

**感想**
とても時間はかかったのですが, 「問題を正しく理解すること」, 「問題をうまいこと翻訳すること」の大切さを学べて楽しかったです.  結城浩さんの数学ガールシリーズには大事なことがたくさん書いてあったんだなぁ, と思いました.

#明日やること
[ABC049C - 白昼夢 / Daydream](https://beta.atcoder.jp/contests/abs/tasks/arc065_a) を解く.
[Vuex] vuexの配列をinputとbindするサンプル

## はじめに
少し悩んだのでメモがてら。
まとめますと、

1. inputのイベントをキャッチして、
1. どの位置のデータかを特定する情報を渡して、
1. commitします。

です。

## 状況

以下のようなvuexを...

```javascript:vuexのstate
state: {
    rows: [
        {
            id: 1,
            name: "6-1",
            score: 1,
        },
        {
            id: 2,
            name: "6-2",
            score: 1,
        }, 
        ....
    ]
}
```

以下のようなUIにbindする方法です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23715/8b6cbd91-d1e2-6288-d703-e7945724048f.png)

## 本題

このUIは以下のようなテンプレートになっています。

```html:vueのテンプレート
    <tbody>
      <tr 
        v-for="row in $store.getters['rows']" 
        v-bind:key="row.id">
        <td class="tdname">
        {{ row.name }}
        </td>
        <td class="tdscore">
          <input 
            type="number" 
            :value="row.score" 
            @change="(e) => { changeScore(e, row.id); }">
        </td>
      </tr>
    </tbody>
```

`:value`はvuexの配列情報とbindします。そして、`@change`で、変更をキャッチして、イベントのオブジェクトと、該当するidをイベントハンドラに渡します。

そしてイベントハンドラでcommitを呼べば…

```javascript:changeのイベントハンドラ（vueのcomponentのメソッド）
methods: {
  changeScore: (e, rowid) => {
    const score = e.target.value;
    this.$store.commit("storescore", {
        score: score,
        rowid: rowid,
    });
  },
}
```

最後にcommitに対応するvuexのmutation（と、ついでテンプレートで使ったgetter）。

```javascript:vuexのcommitとgetter
mutations : {
    storescore: (state, payload) => {
        const idx = state.rows.findIndex((ele) => {
            return ele.id == payload.rowid;
        });
        state.rows[idx].score = payload.score;
    },
},
getters : {
    rows: (state) => {
        return state.rows;
    },
}
```

## おわりに

何かひと手間かかるというか…便利な構文を見落としているのでしょうか？それともvuexの配列をbindするという案がそもそもイマイチ？
Bitbucketで課題（Issueのようなもの）を使う

GitHubで言うIssue…のようなものをBitbucketで使うには、「課題管理」を使うのだが、ちょっと一癖あったのでメモ。

Bitbucketの「課題管理」は既定では有効になっていない。

## リポジトリの新規作成時に有効にする場合

リポジトリを作成する手順で、作成する手前まで実施。

画面左端の「＋」ボタンをクリックし、
![create.png](https://qiita-image-store.s3.amazonaws.com/0/9104/e6201133-4255-71bf-3696-e2f0196081f4.png)

「リポジトリ」をクリック、
![create_repo.png](https://qiita-image-store.s3.amazonaws.com/0/9104/cc438ab9-3611-f1fa-ea79-5cdb7a5291c3.png)

ここでリポジトリ名等を設定し、「詳細設定」で「課題管理」にチェックを入れた状態で「リポジトリの作成」する。
![create_repo2.png](https://qiita-image-store.s3.amazonaws.com/0/9104/4733f130-c730-2d90-d722-15bc99c83dea.png)

すると、課題が有効になる。

## 既存のリポジトリで有効にする場合

既存のリポジトリでも設定可能。

リポジトリを設定した状態で、「設定」をクリック。
![already_setting.png](https://qiita-image-store.s3.amazonaws.com/0/9104/d0a91e1b-9300-5e2a-6257-c0085a2424ea.png)

「課題管理」から「課題管理」を「非公開 課題トラッカー」または「公開 課題トラッカー」を選択して「保存」する。
![already.png](https://qiita-image-store.s3.amazonaws.com/0/9104/ba0ea725-e70e-5f22-7af1-ea892106c75b.png)

## 課題を作成してみる
対象のリポジトリで「課題」を選択。
![kadai.png](https://qiita-image-store.s3.amazonaws.com/0/9104/7da44249-e592-4f1e-f422-aede67aa12e5.png)

空っぽの状態なので「課題を作成」を選択。
![create_kadai.png](https://qiita-image-store.s3.amazonaws.com/0/9104/44014a7d-e925-29fc-4a65-2d62f59eff05.png)

適当にTitleと説明を入力して「課題を作成」。この「説明」はHTML的に改行は無視されてしまうので注意。
![create_kadai2.png](https://qiita-image-store.s3.amazonaws.com/0/9104/f6fa09ec-68ba-1a7a-4af1-421779c4e56f.png)

課題作成完了。
![create_kadai3.png](https://qiita-image-store.s3.amazonaws.com/0/9104/80fea71c-c0cd-8b92-a912-5656bfbde6fb.png)

## GitHubのIssueとの違い
- PRとは切り分けられている（同じデータの種類違いみたいな扱いにはなっていない）
- 既定では無効
- GitHubと同じくマークダウン記法っぽくなっている
  - チェックボックスは使えない
  - 改行は無視され、段落（2回改行すると段落という判断）のみ。
- タグは埋め込めない
- PRの説明欄で[GitHubのcloses/fixedのような書き方](https://help.github.com/articles/closing-issues-using-keywords/)はできないが、[コミットのコメントから課題を閉じたりreopenする事ができる模様](https://confluence.atlassian.com/bitbucket/resolve-issues-automatically-when-users-push-code-221451126.html)。
back to prev view from click Alert button

1. add code below to main view controller
```
 @IBAction func backMenuViewFromCalibrationView(_ segue: UIStoryboardSegue) {
        NSLog("back")
    }
```

2. add segue to second view controller exit(Ctrl + drag) to Exit on storyboard
3. set identifier
4. call this 
```
 self.performSegue(withIdentifier: "backMenuView", sender: nil)
```
Mac で Julia #13 Webサービス用パッケージ Mux


前回に引き続きJuliaについてです。

基本的には[ドキュメント](https://docs.julialang.org/)に沿って試していきます。

今回はMux.jlというWebサービス用パッケージを試してみたいと思います。

## Mux

[Mux.jl](https://github.com/JuliaWeb/Mux.jl)のサイトを参考に試したいと思います。

### インストール

```julia
julia> Pkg.add("Mux")
 Resolving package versions...
 Installed Pidfile ─────── v1.1.0
 Installed AssetRegistry ─ v0.0.2
 Installed Hiccup ──────── v0.2.2
 Installed Mux ─────────── v0.5.3
 Installed Lazy ────────── v0.13.1
 Installed WebSockets ──── v1.0.0
 Installed QuadGK ──────── v2.0.2
  Updating `~/.julia/environments/v1.0/Project.toml`
  [a975b10e] + Mux v0.5.3
  Updating `~/.julia/environments/v1.0/Manifest.toml`
  [bf4720bc] + AssetRegistry v0.0.2
  [9fb69e20] + Hiccup v0.2.2
  [50d2b5c4] + Lazy v0.13.1
  [a975b10e] + Mux v0.5.3
  [fa939f87] + Pidfile v1.1.0
  [1fd47b50] ↑ QuadGK v2.0.1 ⇒ v2.0.2
  [104b5d7c] + WebSockets v1.0.0
```

### 起動

```julia
julia> using Mux
[ Info: Precompiling Mux [a975b10e-0019-58db-a62f-e48ff68538c9]

julia> @app test = (
         Mux.defaults,
         page(respond("<h1>Hello World!</h1>")),
         page("/about",
              probabilty(0.1, respond("<h1>Boo!</h1>")),
              respond("<h1>About Me</h1>")),
         page("/user/:user", req -> "<h1>Hello, $(req[:params][:user])!</h1>"),
         Mux.notfound())

julia> serve(test)
[ Info: Listening on: Sockets.InetAddr{Sockets.IPv4}(ip"127.0.0.1", 0x1f40)
```

ローカルホストで起動したようです。8000ポートでアクセスできました。

- http://localhost:8000/ -> ```Hello World!```
- http://localhost:8000/about  -> ```About Me か 時々 Boo!```
- http://localhost:8000/user/qoAop -> ```Hello, [User]```

ログはこんな感じです。


```
julia> [ Info: Accept:  🔗    0↑     0↓    0s 127.0.0.1:8000:8000 ≣16
┌ Info: HTTP.Messages.Request:
│ """
│ GET /about HTTP/1.1
│ Host: localhost:8000
│ Connection: keep-alive
│ Upgrade-Insecure-Requests: 1
│ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
│ DNT: 1
│ Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
│ Accept-Encoding: gzip, deflate, br
│ Accept-Language: ja,en-US;q=0.9,en;q=0.8
│ Cookie: _ga=GA1.1.1000618626.1461677072
│
└ """
┌ Info: HTTP.Messages.Request:
│ """
│ GET /user/qoAop HTTP/1.1
│ Host: localhost:8000
│ Connection: keep-alive
│ Upgrade-Insecure-Requests: 1
│ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36
│ DNT: 1
│ Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
│ Accept-Encoding: gzip, deflate, br
│ Accept-Language: ja,en-US;q=0.9,en;q=0.8
│ Cookie: _ga=GA1.1.1000618626.1461677072
│
└ """
```

ソースファイルをserver.jlなどで保存して```julia -L server.jl```でも起動できます。

Muxの使い方がまだよくわかっておりません。

今日はこの辺で。
vscode でmacの Icon^M をエクスプローラーから隠す方法

GoogleDrive や DropBox とかで同期すると出てくる Macのリソースファイル？ `Icon?` を消す

settings.json で

```json
    "files.exclude": {
        "**/Icon[\r]": true
    },
```

`"**/Icon^r":true` だと消えてくれなかった
Macのシステムの容量をターミナルから削除

## とりあえずすごいことに。。。

<img width="583" alt="Screen Shot 2018-09-04 at 17.01.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/4386db7c-e4fb-4be2-a8d6-16151564426a.png">

## 下記のコマンドを実行

```
$ sudo du -ahx / | grep -E '\d+G\s+'
```

## パスと容量を取得

sudo rm -rf とかでバシッと、やっちゃってください。。。

```
4.9G	/Users/hujisawa/Library/Containers/com.docker.docker/Data
4.9G	/Users/hujisawa/Library/Containers/com.docker.docker
6.6G	/Users/hujisawa/Library/Containers
2.1G	/Users/hujisawa/Library/Caches/CloudKit/com.apple.bird
2.1G	/Users/hujisawa/Library/Caches/CloudKit
6.8G	/Users/hujisawa/Library/Caches
 56G	/Users/hujisawa/Library
```

## 容量減った！！(自己責任でお願いします)

`56G	/Users/hujisawa/Library`をたくさん消したら容量が減った。

<img width="583" alt="Screen Shot 2018-09-04 at 17.30.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/1f36e758-b3e3-9660-6be9-326f5d57d063.png">
CondaでNCLをインストール

Windows Subsystem for Linux (Debian)にNCLをインストールします。Windows用は提供されていません。

公式ドキュメント

* [Installing NCL with "conda"](http://www.ncl.ucar.edu/Download/conda.shtml)

この通りに行かなかったのでメモしておきます。今時Python 2.7はないので，Mini CondaはPython3用にしてPython 2.7の仮想環境をつくることにしました。

```bash
$ conda create -n ncl python=2.7
$ source activate ncl
$ conda install -c conda-forge ncl
```

一部のライブラリのシンボリックリンクが見つからない問題があります。ここでは手動で作っておきます。`miniconda3/lib`にシンボリックリンクを張っても効果なしで，仮想環境でシンボリックを作成する必要があります。

```bash
$ cd $(which ncl)/../lib
$ ln -s libncursesw.so.6.1 libncurses.so.6
$ ln -s libtinfow.so.6.1 libtinfo.so.6
```

テストします。

```bash
$ ncl -V
$ ng4ex xy05n -clean -W png
```

![xy05.png](https://qiita-image-store.s3.amazonaws.com/0/130247/6ffeadc7-6f86-cf65-5d4b-ab822e590b4b.png)
Azure IoT

# 参考(iotHub)
* maven https://mvnrepository.com/artifact/com.microsoft.azure.sdk.iot/iot-service-client/1.14.1
* API reference https://azure.github.io/azure-iot-sdk-java/service/
* github https://github.com/Azure/azure-iot-sdk-java

# 参考(eventHub)
* eventhub for sdk doc https://docs.microsoft.com/ja-jp/azure/event-hubs/event-hubs-java-get-started-send
* github https://github.com/Azure/azure-event-hubs-java
* API reference https://docs.microsoft.com/ja-jp/java/api/com.microsoft.azure.eventhubs?view=azure-java-stable
yumが機能しなくなったので、とりあえずyumコマンドが動くようにした時のメモ

# 前置き
`rm -rf /var/cache/yum/*`が原因だと思うが
yumが機能しなくなったので、とりあえずyumコマンドが動くようにした時のメモ

（一部、設定が適切でない部分などがあるかもしれません）


# 環境
VirtualBox上にLinux（CentOS7）をインストールして利用。
VirtualBoxのネットワーク設定は「ブリッジ接続」

# yum動かなくなった

```zsh:エラー
[root@centos7 ~]$yum list
^Chttp://mirror.centos.org/centos/7/os/x86_64/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: mirror.centos.org; 不明なエラー"
他のミラーを試します。

 One of the configured repositories failed (CentOS-7 - Base),
 and yum doesn't have enough cached data to continue. At this point the only
 safe thing yum can do is fail. There are a few ways to work "fix" this:

     1. Contact the upstream for the repository and get them to fix the problem.

     2. Reconfigure the baseurl/etc. for the repository, to point to a working
        upstream. This is most often useful if you are using a newer
        distribution release than is supported by the repository (and the
        packages for the previous distribution release still work).

     3. Run the command with the repository temporarily disabled
            yum --disablerepo=base ...

     4. Disable the repository permanently, so yum won't use it by default. Yum
        will then just ignore the repository until you permanently enable it
        again or use --enablerepo for temporary usage:

            yum-config-manager --disable base
        or
            subscription-manager repos --disable=base

     5. Configure the failing repository to be skipped, if it is unavailable.
        Note that yum will try to contact the repo. when it runs most commands,
        so will have to try and fail each time (and thus. yum will be be much
        slower). If it is a very temporary problem though, this is often a nice
        compromise:

            yum-config-manager --save --setopt=base.skip_if_unavailable=true

failure: repodata/repomd.xml from base: [Errno 256] No more mirrors to try.
http://mirror.centos.org/centos/7/os/x86_64/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: mirror.centos.org; 不明なエラー"
```
```zsh:エラーメッセージ中のキーワード
Could not resolve host
```
# yum動かない時の対処

DNSを設定

```zsh:/etc/sysconfig/network-scripts/ifcfg-????
# ファイル名「ifcfg-????」は環境によって異なる

# DNSを設定
DNS1=8.8.8.8
DNS2=8.8.4.4
```
```zsh:/etc/resolv.conf
# 追記
nameserver 8.8.8.8
nameserver 8.8.4.4
```
```zsh:ネットワーク再起動
service network restart
```

```zsh:/etc/yum.repos.d/CentOS-Base.repo
# 何箇所かあるので、全ての箇所で
# 「mirrorlist〜」部分をコメントアウトして
# 「baseurl〜」部分を有効化する

#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
```
```zsh:確認
yum list
yum update
```
updateがおっそい。。。

# 参考
>
[CentOSでyumを使えない時の対処法+ネットワーク設定](https://qiita.com/networkyohan69/items/6a39313ab94c9f5521e2)
[yum Error: Cannot find a valid baseurl for repo: baseの対処法 – rilakkuma3xjapan's blog](https://weblike-curtaincall.ssl-lolipop.jp/blog/?p=561)
Error: getaddrinfo ENOTFOUND localhost のエラーが出た時

Macのローカルでwebサーバーを立ち上げる時に以下のエラーが出て苦労したのでメモ
(gulpとかnpmとかyarnとか)

# 実行時のエラー
```
events.js:167
      throw er; // Unhandled 'error' event
      ^

Error: getaddrinfo ENOTFOUND localhost
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)
Emitted 'error' event at:
    at GetAddrInfoReqWrap.doListen [as callback] (net.js:1507:12)
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:17)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
ERROR: "nuxt:dev" exited with 1.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
```

# 解決策
というか疑う箇所。
`/private/etc/hosts` をテキストエディタで開いて、空だったりしたら以下を追記する

```
127.0.0.1   localhost
```

出ていたエラーは localhostが立ち上げられないよ、ってことだったみたい。


参考サイト）
[javascript \- gulp webserverでのエラー \- スタック・オーバーフロー](https://ja.stackoverflow.com/questions/10170/gulp-webserver%E3%81%A7%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC)
[Macでhostsファイルを書き換える方法 \| HAZIMARU](https://hazimaru.jp/820/)
spring boot with  jsp 

spring boot default does not support jsp.
to enable jsp, add those maven dependencies

```xml:pom.xml
		<!-- Tomcat Embed -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-tomcat</artifactId>
			<scope>provided</scope>
		</dependency>
		<!-- JSTL -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
		</dependency>
		<!-- To compile JSP files -->
		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>

```
imagenet-downloader

# 【What is this?】

ImageNetから画像をダウンロードするプログラム

# 【Install】

```
$ cargo install --git https://github.com/miyagaw61/imagenet-downloader
```

# 【Usage】

まずはURLの一覧が記述されたファイルを用意する。

```
$ cat urls.txt
n00004475_6590  http://farm4.static.flickr.com/3175/2737866473_7958dc8760.jpg
n00004475_15899 http://farm4.static.flickr.com/3276/2875184020_9944005d0d.jpg
n00004476_32312 http://farm3.static.flickr.com/2531/4094333885_e8462a8338.jpg
```

1つ以上の空白で区切られており、左側はID、右側はURLになっている。
IDはまた一つのアンダースコアにより区切られており、imagenet-downloaderにこのようなURLリストファイルを渡すことによって、記述されているURLをすべて"{IDの左側}/{IDの右側}.jpg"にダウンロードする。

```
$ imagenet-downloader urls.txt
[+]Download: n00004475/6590.jpg
[+]Download: n00004475/15899.jpg
[+]Download: n00004476/32312.jpg
```

```
$ cat urls.txt
n00004475_6590  http://farm4.static.flickr.com/3175/2737866473_7958dc8760.jpg
AAAAAAAAAAAAAAAAAAA http://google.com
n00004475_15899 http://farm4.static.flickr.com/3276/2875184020_9944005d0d.jpg
n12345678_12345678 BBBBBBBBBBBBBBBBBBBBB
n00004475_32312 http://farm3.static.flickr.com/2531/4094333885_e8462a8338.jpg

$ imagenet-downloader urls.txt
[+]Download: n00004475/6590.jpg
[!]INCORRECT ID FORMAT: AAAAAAAAAAAAAAAAAAA http://google.com
[+]Download: n00004475/15899.jpg
[!]RETRY: n12345678/12345678.jpg
[!]RETRY: n12345678/12345678.jpg
[!]RETRY: n12345678/12345678.jpg
[!]Skipped: n12345678/12345678.jpg (download error)
[+]Download: n00004475/32312.jpg
```

上記のように、不正なIDが検出された場合はINCORRECT ID FORMATとしてSkip、URL先が存在していなかったり、ネットワークが落ちていてアクセスできなかったりといった場合には3回のリトライの後それでもアクセスできなかったらSkipするようになっている。また、既に同名のファイルが存在していた場合もSkipする。
log4j2 で 出力をバッファリングするには immediateFlush 設定が必要

# log4j2 で 出力をバッファリングするには immediateFlush 設定が必要


log4j2 で、 `bufferedIO="true"` （そもそもtrueがデフォルト）にしても出力がバッファリングされないので悩んでいたら、
`immediateFlush="false"` も設定しないと、各ログ毎にフラッシュされてしまうことに気づいた。

よって、ログ出力をバッファリングするには、 `immediateFlush="false"` も設定しないと駄目

例：

```xml:log4j2.xml
    <Appenders>
        <RollingFile name="Name" fileName="/var/log/hoge.log" filePattern="/var/log/hoge.log.%i.gz" immediateFlush="false">
            <PatternLayout pattern="%d{yyyy-MM-dd'T'HH:mm:ssZ} %m%n"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="100MB"/>
            </Policies>
            <DefaultRolloverStrategy max="10" fileIndex="min"/>
        </RollingFile>
    </Appenders>
```

参考

- [Apache Log4j2 Appenders](https://logging.apache.org/log4j/2.x/manual/appenders.html)