OmniAICreator/Qiita-1.07M huggingface dataset:
QThread備忘録(QueuedConnection便利)

#はじめに

QThreadを使っていて、
ThreadからUIを更新したい。（ログを出したい）
といった時、UIの更新を直接やるのは大抵NG。

サブスレッドからメインUIスレッドの内容を書き換えるといった流れをQtでどうするのか？

の備忘録です。（間違いあるかもですが）


#シグナル、スロットを使う
Qtの場合、シグナル、スロットという仕組みがある。
これ経由して呼び出す。　
Qtが拡張したメソッド呼び出しみたいなもので、いろいろ便利。

相手を知らずにブロードキャストしている emitとかがある。
emitされたシグナルを受けてスロットが動くみたいなの。
（受け側は両方知っている必要があるけど、送り側は知らなくてもOK)


#シグナルスロットの接続状態
で、そのどこへ出して、どこから受けるといったことを解決するのが

connect
というもの。

これの引数に　Qt::QueuedConnectionというものがある。

##Qt::QueuedConnection

スレッドからきたイベント情報をキューに貯めて、良きタイミング（おそらく空いている時）に実行してくれる。

####投げておけば、勝手になんかいい感じに処理してくれる。
すごい便利なやつ。管理しなくてよい。
いつ本実行されるかわからないくてもいいくらい適当なものに使える。
（UI処理だとよくある）

スレッドからくるシグナルをUIのスロットで受け取る時に、Qt::QueuedConnectionで繋いでおくことで、
スレッドをまたいで処理を行える。

###接続仕方

``` HogeLogWindow.cpp
    //  色付きログ
    connect(this,&HogeLogWindow::callSendLogWithColor,
            this,&HogeLogWindow::sendLogWithColor,Qt::QueuedConnection);
```

###送信

``` HogeLogWindow.cpp
    emit callSendLogWithColor("nanikaLog",textColor,textBackgroundColor);
```

###受信

```
void CommandlineWindow::sendLogWithColor(QString str,QColor textColor,QColor textBackGroundColor)
{
    this->ui->textEdit->setTextColor(textColor);
    this->ui->textEdit->setTextBackgroundColor(textBackGroundColor);
    this->ui->textEdit->append(str);
}
```

###定義

``` HogeLogWindow.h
signals:
    void callSendLogWithColor(QString str,QColor textColor,QColor textBackGroundColor);
public slots:
    void sendLogWithColor(QString str,QColor textColor,QColor textBackGroundColor);
```

# Qt::QueuedConnectionの仲間

Qt::BlockingQueuedConnection てのもあって、
これは、メインで処理されるまで、サブスレッドをブロックしてしまう。


メイン側がうまく作られていればいいけど、下手に呼ぶとずっと止まってしまうので気をつけよう。
(こちらはちゃんと管理しないとやばいやつ）

処理順とかがとても大事なものなどに使うと思われる。


#まとめ
Qtの中の人賢い
キーワードはQThread
Qt::QueuedConnection　

以上
aws cli で s3のContentTypeとACLを変更

何も考えずに `boto3` で s3 に 大量のpdfファイルを上げたら、全部 `Content-Type` が `binary/octet-stream` になってしまったので、まとめて `application/pdf` に直したかった話。
ついでに `public-read` で外部から読めるようにしたかったので、

まとめてこう。

```bash
BUCKET="your-bucket"
KEY="path/to/your.pdf"

aws s3api copy-object --bucket "$BUCKET" --copy-source "$BUCKET/$KEY" --key "$KEY" --content-type "application/pdf" --metadata-directive REPLACE
aws s3api put-object-acl --acl public-read --bucket "$BUCKET" --key "$KEY"
```

確認。

```bash
aws s3api head-object --bucket "$BUCKET" --key "$KEY"
aws s3api get-object-acl --bucket "$BUCKET" --key "$KEY"
```
PowerShellで空のフォルダに.gitkeepを作成する

Gitで空のフォルダを管理するために、PowerShellで.gitkeepを作成するスクリプトを作った。

```powershell:New-GitKeep.ps1
# 空のフォルダに.gitkeepファイルを作成する 

Param(
  [string]$path="." # .gitkeepファイルを作成するパス
)

if( [String]::IsNullOrEmpty($path) ){
  # 空のときはカレントにする
  $path = "."
}

if(Test-Path $path){
  # 指定のパス配下の一覧を取得する。
  $collection=Get-ChildItem $path -Recurse 
  foreach ($item in $collection) {
    # $itemがディレクトリでファイル数とディレクトリ数が0個の場合に　.gitkeepファイルを作成する。
    if ($item.PSIsContainer -and !$item.GetFiles().Count -and !$item.GetDirectories().Count){
      $gitkeep=Join-Path $item.FullName .gitkeep
      New-Item $gitkeep -Force -type file
    }
  }
  exit 0
}
else {
  Write-Host $path is not found! 
  exit 1
}
```

# 実行例
```:example
PS C:\Work> ls -r -n
PS
TEST
PS\New-GitKeep.ps1
TEST\Folder1
TEST\Folder2
TEST\Folder1\Folder1-sub
PS C:\Work> .\PS\New-GitKeep.ps1 .\TEST


    ディレクトリ: C:\Work\TEST\Folder2


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2018/01/25     13:13          0 .gitkeep


    ディレクトリ: C:\Work\TEST\Folder1\Folder1-sub


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2018/01/25     13:13          0 .gitkeep


PS C:\Work> ls -r -n
PS
TEST
PS\New-GitKeep.ps1
TEST\Folder1
TEST\Folder2
TEST\Folder1\Folder1-sub
TEST\Folder1\Folder1-sub\.gitkeep
TEST\Folder2\.gitkeep

```
SparkでDataFrameのjoinする時に、結合キーにnullが入るとレコードが落ちるのを解決する話

テーブルを結合する際、普通、結合キーにnull値が含まれるとそのレコードは結合されないが、
Apache Sparkで無理やりnullレコードをくっつけるやり方

```scala:null値が落ちる例
val data1 =
sc.parallelize(
    Array(
        ("a",  1),
        ("b",  2),
        ("c",  3),
        (null, 4)
    )
).toDF("k", "v1")

val data2 =
sc.parallelize(
    Array(
        ("a",  "x"),
        ("b",  "v"),
        ("c",  "z"),
        (null, "w")
    )
).toDF("k", "v2")

data1.join(data2, Seq("k"), joinType="inner").show()
```

これを実行すると、k列がnullのレコードは落ちてしまう。
それを避けたい場合、Sparkでは以下のようにすればよい。

```scala:scala解決法
data1
.join(
    data2,
    data1("k") <=> data2("k"),
    joinType="inner"
).select(data1("k"), $"v1", $"v2").show()
```

```python:python解決法
data1 \
.join(
    data2,
    (data1["k"] == data2["k"]) | (data1["k"].isNull() & data2["k"].isNull()),
    "inner"
).select(data1["k"], "v1", "v2").show()
```

pythonはもっと楽で効率の良いやり方がありそう。
上記のやり方だとちょっと遅く感じました。　

[追記]
withColumnで、欠損埋めした列を作った方が多分良さそう。
特に結合キーが複数ある場合は、cross joinするらしく、エラーが出る(scalaで確認)。

```scala:withColumn例
data1
.withColumn("k", when($"k".isNull, lit("")).otherwise($"k"))
.join(
    data2.withColumn("k", when($"k".isNull, lit("")).otherwise($"k")),
    Seq("k"),
    joinType="inner"
).select("k", "v1", "v2").show()
```
Google Cloud Storage を PHPで。

メモ
・自分の場合はGCP用に複数アカウント作っているので、projcectIdに注意


#はじめに

・コンテナ作成、公開は管理画面から
・PHPではアップロードのみ
・アップロードしたものは一般公開
・バケットとは、フォルダみたいなもの
・asia-northeast が東京リージョン

GCPトップ
https://console.cloud.google.com/home/dashboard



#アップロード先のバケットを作成

## バケット作成まで

ストレージを選択
![1.png](https://qiita-image-store.s3.amazonaws.com/0/31338/a7adc57d-c9ab-3289-7c92-a62255bc1081.png)

バケットを作成
![2.png](https://qiita-image-store.s3.amazonaws.com/0/31338/953735b1-fe2c-f0dd-fd4e-0bacc05e9904.png)

バケットをみんな見れるように
![3.png](https://qiita-image-store.s3.amazonaws.com/0/31338/682ccd15-be4b-b511-bfd0-36b5d9ec241a.png)



メンバーに allUsers と入力し、 ストレージオブジェクト閲覧者を クリック
![4.png](https://qiita-image-store.s3.amazonaws.com/0/31338/2e97c2bd-5df3-1cc0-748d-290362126cd8.png)


**ここまでで、公開用バケットの用意完了**

#APIキーを取得

https://qiita.com/ngyuki/items/6c0782737ba327150c97
秘密鍵を作成してサーバーにアップロード（JSONファイルを取得するまでを参考に）

**APIキーの準備OK**

#composer で ライブラリをインストール

適当にパスは変えてね。

```
php /var/www/html/composer.phar require google/cloud-storage
```


そして、PHPで。
プロジェクトIDはこのぺーじの一番上の画像に乗ってるよ。

```

<?php

use Google\Cloud\Storage\StorageClient;

class HogesController extends AppController
{


    public function test()
    {

#
        $projectId = 'project-id123456';

# Instantiates a client
        $storage = new StorageClient([
            'projectId' => $projectId,
            'keyFile' => json_decode(file_get_contents('/hoge/your_secret_key.json'), true)
        ]);

        $bucketName = 'your_bucket';

        $bucket = $storage->bucket($bucketName);

        $object = $bucket->upload(
            fopen('/img/your_upload_file.jpg', 'r')
        );

        pr($object);
        die;
        $this->autoRender = false;
    }


}



```

追記
以下をやると、画像の表示速度が遅くなるので、
```
https://storage.googleapis.com/...
```

って感じで直接リンクを貼った方が良い。

ファイルのアップロード先は
https://storage.googleapis.com/your_bucket/your_upload_file.jpg

になる。
また nginx のリバースプロキシを使えば独自ドメインみたいに表示可能。

```default.conf

server {

listen 443 ssl http2;
listen [::]:443 ssl http2;

//略

    location ^~/gcp_storage/ {
        proxy_pass https://storage.googleapis.com/your_bucket/;
    }


}

```


設定したら service nginx restart 忘れずに。


**以上で完了**
ES6での配列の連結(破壊的)

# ES6での配列の連結(破壊的)

https://qiita.com/kaz2ngt/items/6e08acc537fd77273cff

ES6から配列が展開できるようになったため、上記記事のようにapplyを使って展開する必要がなくなりました。
下記のようにシンプルに記述できます。

## 実行ファイル
```js:test_es6.js
const a = [0, 1, 2, 3], b = [4, 5, 6, 7], count = 1000000;
console.time();
for (let i = 0; i < count; i++) {
  a.push(...b);
}
console.timeEnd();
```
```js:test_old.js
const a = [0, 1, 2, 3], b = [4, 5, 6, 7], count = 1000000;
console.time();
for (let i = 0; i < count; i++) {
  Array.prototype.push.apply(a, b);
}
console.timeEnd();
```

## 方法
上記のファイルをそれぞれ5回ずつ実行して計測(node v8.9.0)

## 結果
| | 1回目 | 2回目 | 3回目 | 4回目 | 5回目 | 平均 |
|:--|:--:|:--:|:--:|:--:|:--:|:--:|
| push(...) | 77.85ms | 80.21ms | 74.85ms | 73.50ms | 78.91ms | 77.06ms |
| Array.prototype.push.apply | 75.51ms | 77.59ms | 76.46ms | 79.54ms | 81.60ms | 78.14ms |
一応計測しましたが誤差の範囲です
KotlinでSAM(Single Abstract Method)インターフェースを作ったら省略記法が使えなかった話

## 問題
JavaでInterface定義し、抽象メソッドが一つだけのもの(Single Abstract Method: SAM)をKotlinで呼び出すときは下記みたいな感じでいける

```kotlin
view.setOnClickListener { view ->
  // something
}
```

一方、下記のようにKotlinでSAMのInterfaceを作っても同じように呼び出せない


- 呼ばれる側

```kotlin
interface HogeListener {
    fun fuga(s: String)
}

setHogeListener(listener: HogeListener) {
    this.listener = listener
}
```

- 呼ぶ側

```kotlin
hogehoge.setHogeListener { s ->

} 
// ERROR: 
//   Type Mismatch.
//   Required: A.HogeListener
//   Found: (???) -> Unit
//   Cannot infer a type for this parameter. Please specify it explicitly.
```

## 原因
https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

`Also note that this feature works only for Java interop; since Kotlin has proper function types, automatic conversion of functions into implementations of Kotlin interfaces is unnecessary and therefore unsupported.
`

JavaのSAMはよしなに変換してくれるけど、Kotlinは必要ないから変換しないとのこと。

## 対応
とりあえずJavaの時と使い勝手を変えたくなかったので下記のように実装。

```kotlin
class Hoge(private var listener: (String) -> Unit) {
    fun fuga(string: String) {
        listener(string)
    }
}

setHogeListener(listener: (String)->Unit) {
    listener = Hoge(listener)
}
```

実際にはKotlin化と同時に不要なインターフェースを無くしていくのがベストなんだろなぁと思いつつ、一時対応としてメモ。
【バグ】NSObject を継承したオブジェクトを unowned プロパティーとして保持すると、それを保持しているインスタンスを print すると落ちる

# TL;DR

下記のようなコードは落ちます：

```swift
import Foundation

class C: NSObject {
    
}

struct D {
    unowned let x: C
}

let c = C()
let d = D(x: c) // Playground ではここで落ちる
print(d) // シミュレーターや実機ではここで落ちる
```

# どういうことか

自作ライブラリー [NotAutoLayout](https://github.com/el-hoshino/NotAutoLayout) をメンテナンスして、とある修正を対応している時に、新しくできたものがどうしても Playground だけで落ちて、まったく同じコードでも Test でも普通に動くしシミュレーターで確認しても何の問題もありませんでした。

ちなみに実際それを再現するブランチをこちらから落とせます：
https://github.com/el-hoshino/NotAutoLayout/tree/Playground-Bug

上記のものを落として、Workspace を開いてシミュレーターを Target にビルドして Playground 開くと、確実に `parent.nal.layout(child) { $0` のクロージャーの終了場所で `EXC_BAD_ACCESS` で落ちるのです。しかし、Test にまったく同じコードがありますが、そちらは何の問題もなくテストが通ります。Playground は当然ながら lldb も使えないし Call Stack も表示されないので、落ちたとしても具体的になぜ落ちたかもわかりません。

この問題を [Discord](https://medium.com/swift-column/discord-ios-20d586e373c0) に投げてみたら、@kishikawakatsumi さんと @rintaro さんのおかげで、原因がようやく突き止められて、最終的には上の TL;DR で出したコードとなります。

具体的に言いますと、`NSObject` を継承したオブジェクトを class や struct の `unowned` プロパティーとして保持した際に、どうやら `swift_ClassMirror_subscript()` のバグで、これを強参照として読み取ろうとしているのが原因だそうです。現在このバグはこちらにも上がっています：
https://bugs.swift.org/browse/SR-5289

このバグを再現するには 2 つの条件が必要です：

1. プロパティーの型は `NSObject` を継承する必要があります（つまりそうではない通常の `class` は問題ありません）
2. プロパティーを `unowned` として保持する必要があります（つまり通常の強参照と `weak` による弱参照の保持も問題ありません）

上記 2 つの条件を満足した場合、そのプロパティーを持つインスタンスを `print` しようとすると落ちます。

また、Playground で動かす場合は、そもそも作られたものを全てとりあえず `print` しようとしているので、作られた時点で落ちます。ツラい。

以上、改めまして、この現象の原因を究明するのにお世話になりました @kishikawakatsumi さんと @rintaro さんに、大変ありがとうございます。
他人が作ったアプリのViewの情報を知る

初めまして:smile:初投稿です。
#はじめに
Androidアプリの自動化ツール作成にあたり、対象アプリのViewの情報が知りたかった。
方法を調べたのでメモ。

#準備
Android SDK にて提供されている「UI Automator Viewer」を使用します。

```:Mac
/Users/hoge/Library/Android/sdk/tools/bin/uiautomatorviewer
```
```:Windows
C:\Users\hoge\AppData\Local\Android\Sdk\tools\bin\uiautomatorviewer.bat
```

#実行
起動すると以下の画面が表示されます。
![スクリーンショット 2018-01-25 11.56.57.png](https://qiita-image-store.s3.amazonaws.com/0/233487/92fab757-5b46-3827-b3cc-647cbe7cc1b1.png)
<br>
1. 端末をPCに接続して、確認したいアプリの画面を表示しておきます。(今回はPlayストアのアプリを表示)
2. ウィンドウ左上のアイコンメニューの左から二番目のアイコンをクリック。
3. 端末のスクリーンショットが表示されます。
<br>
![スクリーンショット 2018-01-25 12.02.01.png](https://qiita-image-store.s3.amazonaws.com/0/233487/9b4da517-f78d-47be-7283-4cdfd540c621.png)
<br>

あとは確認したいオブジェクトをクリックすることで、リソースIDやレイアウトの階層などの情報が確認できます。
<br>
以上です。
何かおかしな点などがあれば、ご指摘頂けると幸いです:relaxed:
<br>
<br>
####参考元
[(Android) 知らない人が作ったアプリのテストを書く](https://qiita.com/ikota/items/5c1362069062c760da9f)
蟹さんへlwIPを移植してはまった話

[RTL8196CのBare Metal](https://qiita.com/yamori813/items/c1d8111a3f45c5a74655)でlwIPを使えるようしてみました。NICのコードはlwIPのテンプレート(ethernetif.c)に埋め込み、Switchのコードはbootのコードをそのまま利用しました。

![RTLWIP_ETHER.png](https://qiita-image-store.s3.amazonaws.com/0/104066/6d21a420-b7be-17f9-c8b3-051ecf497d95.png)

Switchのコードはifdefやコメントアウトが錯綜していてとてもひどいコードです。チップのバージョン毎の仕様の違いやバグがそうしているようです。

当初自分が書いたNICのコードのバッファサイズの指定が抜けていて送信が出来ない状態でしたが、これを設定して送受信ができるようになりました。

NICの実装はシンプルにTX,RXとも1リング4段で実装しました。

![RTL-ETHER.png](https://qiita-image-store.s3.amazonaws.com/0/104066/b18b0f23-3833-65fc-c0f3-9937b2642b3d.png)

ところが、シリアルケーブルを抜くとネットワークが機能しなくなります。

いろいろ調べたところシリアルのRXがつながれていないとNIC送信が出来なくなるようです。

bootのコードを確認したり、linuxのコードを確認したのですが、理由がわかりません。そもそもNICとUARTは別のデバイスなのになぜ干渉するのでしょうか。

電気的にプルアップしたりプルダウンしてもだめでした。

半分あきらめかけたのですが、朝うとうとしていたときにオリジナルのコードを思い出しました。

```c:init/ethInt_865x.c
        //avoid download bin checksum error
        uint32 rx[6] = {4, 0, 0, 0, 0, 0};
        uint32 tx[2] = {4, 2};

        /* Initialize NIC module */
        if (swNic_init(rx, 4, tx, MBUF_LEN)) {
                dprintf("¥nSwitch nic initialization failed!¥n");            
                return;
        }
```

rx,txはリングのバッファ数なのですが、rxは1本なのに何故かtxは2本になっています。それも何故か4と2。bootのネットワーク処理はtftpでバイナリを受け取るだけのはずなので、txの方が多いのは解せません。

これが秘伝のたれでした。同じようにしたところシリアルを外してもネットワークが使えるようになりました。

bootのNICのコードはlinuxのコードを流用したようですが、bootを作った人も同じようにはまったのかもしれません。

RTL8196CなどのネットワークのコードはREALTEKのboot(boot/rtl8196x)とlinuxのコード(drivers/net/rtl819x)とOpenWRTにあります。OpenWRTのものはrealsil(関係会社?)の人が結構頑張って整理しています。

ちなみにRTL8196Cにはレビジョンが二つあって、私のターゲットは2だったのですが、1の方のレビジョン用に結構やばそうなワークアラウンドがbootのNICのコードに入っています。

REALTEKの最初のmips系のsocはRTL8181だとおもうのですが、これにはSwitchが入っていませんでした。バッファもTulipライクな32Bit×4な構成だったようです。どうも蟹さんは必要以上に複雑にしてしまう感じがします。

まったくもって蟹です。

ソースはここに置いてあります。

https://github.com/yamori813/rtlbm-mruby

後日追記：いろいろいじっていて、受信のリストを二つにしていたのですが、夏の間は動いていたのですが、年末になったら調子が悪くなったので、bootと同じように一本にしました。ほんと蟹さんは分けの分からん動きをします。
[Swift]enumから適当に一個選ぶ


```swift

protocol EnumRandomized {
  static var all: [Self] { get }
  static var random: Self? { get }
}

extension EnumRandomized {
  static var random: Self? {
    let all = self.all
    if all.isEmpty { return nil }
    let index = Int(arc4random_uniform(UInt32(all.count)))
    return all[index]
  }
}

enum Hoge {
  case a
  case b
  case c
}

extension Hoge: EnumRandomized {
  static var all: [Hoge] {
    return [a, b, c]
  }
}

```

`Hoge.random`みたいな感じで使う
Python > help(): Runtime error | builtin module namesを表示する > sys.builtin_module_names | mathはbuiltinなのかどうか問題 (macOS + homebrew | CentOS | Ubuntu)

```txt:動作環境
ideone (Python 3.5)
```

[Python3.7のmathの場所](https://qiita.com/yukimurashun/items/e5a932f389c4be0a6c53)
を見て、help()を使ってFILEの位置以降を表示しようとした。

以下を試みたが、Runtime errorになる。

https://ideone.com/xGiRQj

```py3
import math

res = help(math)
for elem in res:
    print(elem)

```

help()を使わない方法を検討した。
別途以下を見つけた。
https://stackoverflow.com/questions/8370206/how-to-get-a-list-of-built-in-modules-in-python

https://ideone.com/OyqOSJ

```py
import sys

print(sys.builtin_module_names)
```

実行結果は以下のようになった。

`
('_ast', '_bisect', '_codecs', '_collections', '_datetime', '_elementtree', '_functools', '_heapq', '_imp', '_io', '_locale', '_md5', '_operator', '_pickle', '_posixsubprocess', '_random', '_sha1', '_sha256', '_sha512', '_signal', '_socket', '_sre', '_stat', '_string', '_struct', '_symtable', '_thread', '_tracemalloc', '_warnings', '_weakref', 'array', 'atexit', 'binascii', 'builtins', 'errno', 'faulthandler', 'fcntl', 'gc', 'grp', 'itertools', 'marshal', 'math', 'posix', 'pwd', 'pyexpat', 'select', 'spwd', 'sys', 'syslog', 'time', 'unicodedata', 'xxsubtype', 'zipimport', 'zlib')
`

~~Python 3.5でもmathはbuiltinのようだ。~~

(追記 2018/01/25)
別途、Mac OS X + homebrew + Python3.6(@knoguchi さんの[コメント](https://qiita.com/7of9/items/b9b18cc3786a9562bf28/#comment-44db559741a717223415))やCentOS6.8+Python3.6.4ではmathはbuiltinではないようです。

### 関連

- [Python > set > set()にて変換 > dictionaryはkeyだけになる > dictionaryのvaluesをsetに変換する方法を教えていただきました / dir({}) / help({}) / help({}.values)](https://qiita.com/7of9/items/c1958d662ec776f7df61)

### 検索用キーワード

@knoguchi さんとのコメントで登場したキーワードです。
コメントは検索できないので。

- dunder file (`math.__file__`)
    - 関連: [Pythonの`__init__`なんて読むの問題](https://qiita.com/little_hand_s/items/7273e0f07d2c76120942)
- スタティックリンク
- libSystem.dylib
- ld-linux-x86-64.so.2
- libm.so.6
gitで、特定のコミットからファイルを取り出す方法

# 問題
昨日作業したファイル（例えばHEAD^^^にある）が欲しい時、どうしましよう

- github, bitbucketなどから copy & paste; バージョン管理できてない気がします、ファイル数が多い時手間がかかります。
- HEAD^^^へチェックアウトする; 直近のコミットの内容がなくなります。
- checkout + cherry-pick; ちょっと手間、、
- rebase;　コミット履歴を消すまでやるのは、、、

 
# 結論
```git checkout COMMIT_SHA  --  FILE_NAME```を使います。
COMMIT_SHA: コミットのSHA番号;　HEAD~;ブランチ名（develop)などの記述も可
FILE_NAME: 取り出したいファイルの名前（現ワーキングスペースになくても、つまりどこかのコミットで削除されたファイルでもおっけー）
-- なくてもいけますが、FILE_NAMEと同じなブランチ名がある時必要

# git checkout
git checkoutは主にブランチの切り替えとファイルのバージョン管理ができます。
## ブランチの切り替え

```git
git checkout TARGET_BRANCH_NAME
```
でターゲットのブランチに切り替えるのが一番馴染み深い使い方です。

## インデックスにあるファイルへの変更のアンステージング
例えばあるブランチの中にtmpというファイルがすでにコミットされていました。

```
echo changes >> tmp
git status
```
という風に、tmpファイルを修正しました。しかし後になって、やっぱりこの変更をコミットしないと決めた時
git statusで表示した手順でアンステージングできます

```
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   tmp
```
つまり

```
git checkout -- tmp
```
イコール

```
git checkout HEAD -- tmp
```
を入力すれば、tmpをHEADの状態に戻せます。
## 特定のコミットからファイルを取り出す
実は、上記の例を活用すれば

```
git checkout HEAD^^ -- targetFile
git checkout COMMIT_SHA -- targeFile
```
という風に特定のコミットからファイルを取り出せます。
【React Native】三点リーダーでテキストを省略

文字が多い時に省略する。
### numberOfLines
テキスト表示コンテナの行数
### ellipsizeMode
head - 行がコンテナに収まるように行が表示され、行頭の欠落したテキストは省略記号で示されます。
例えば、 "... wxyz"

middle - 最初と最後がコンテナに収まるようになり、途中の欠落したテキストは省略記号で示されます。
例えば、"ab ... yz"

tail - 最初がコンテナに収まるようになり、行末の欠落したテキストは省略記号で示されます。
例えば、 "abcd ..."

clip - コンテナに収まらない文字はひょうじされなくなり、改行されません。


### 例
```
<Text
  numberOfLines={1}
  ellipsizeMode="tail"
>
longlongfoobarbazbarfoobarbazbarlonglongfoobarbazbarfoobarbazbarlonglongfoobarbazbarfoobarbazbarlonglongfoobarbazbarfoobarbazbarlonglongfoobarbazbarfoobarbazbar
</Text>
```

### 参考URL
https://facebook.github.io/react-native/docs/text.html#ellipsizemode
brewでAWS CLIのインストール

MacにHomebrewでAWSのCLIをインストールする。

###brewのアップデート

```
$ brew update

$ brew search aws
==> Searching local taps...
aws-apigateway-importer    aws-elasticbeanstalk       aws-sns-cli
aws-as                     aws-keychain               awscli
aws-cfn-tools              aws-mon                    awslogs
aws-cloudsearch            aws-sdk-cpp                kube-aws
aws-elasticache            aws-shell                  yaws
```

###CLIのインストール

```
$ brew install awscli

確認
$ aws --version
aws-cli/1.14.30 Python/3.6.4 Darwin/16.7.0 botocore/1.8.34
```
###環境変数の設定
```
$ vi ~/.bash_profile

以下を追記
export PATH=~/.local/bin:$PATH
```

##アクセスキーの設定

```
$ aws configure
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE　　（自分の）
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY　　（自分の）
Default region name [None]: ap-northeast-1　　（東京リージョン）
Default output format [None]: json　　（空だとJSON）
```
##ロールの切り替え

###プロファイルの設定
設定ファイル（~/.aws/config）にロールの情報を記述します。

```
[profile プロファイル名]
output = json
region = ap-northeast-1
role_arn = arn:aws:iam::操作対象のAWSアカウントID:role/ロール名
source_profile = default
```
```
$ vi ~/.aws/config

[profile hoge]
role_arn = arn:aws:iam::069581120308:role/role-name
region = ap-northeast-1
source_profile = default
```

###動作確認

```
$ aws ec2 describe-instances --profile hoge
実行中のインスタンスが表示される
```
###デフォルトプロファイルの設定
何度もプロファイルを指定するのが面倒であれば、

```
$ export AWS_PROFILE=hoge
```

とすれば、シェルセッションの終了時までプロファイルが固定される。
Railsのログをクリアするコマンド

log/development.logやlog/production.logはクリアしないと永遠にログを蓄積し続けます。
なので、定期的にクリアするなどの対策が必要です。

以下のコマンドでクリアできます。
<pre class="command-line"><code class="language-markup">rake log:clear</code></pre>
ApiGenを使ってみる

仕事で使うことになり詰まったので、備忘録として。

### 環境
- windows
- vagrant 
- scotch box(v2.5)
- php 5.5.9
- laravel 5.2.45

#### 今回使うもの
[ApiGen](https://github.com/ApiGen/ApiGen/tree/v4.1.0)

#### ApiGenとは
phpのドキュメントを自動で作成してくれるパッケージ
今回はv4.1.0を使用予定
最新のバージョンはphp7.1以上を要求されるので、バージョンダウンして使う
*ApiGenの4系はもうサポートされていないらしいので、自己責任で使ってください

## インストール方法
- vagrant・laravelは割愛
- laravelプロジェクトのcomposer.jsonにapigenを記述


``` composer.json
　　　　　・
　　　　　・
　　　　　・
"require-dev": {
        "apigen/apigen": "4.1.*"
    },
　　　　　・
　　　　　・
　　　　　・
```
- この状態でvagrant sshでlaravelプロジェクトのルート直下でcomposer install
- なにもエラーが出なければ成功

```
php vendor/apigen/apigen.phar generate -s ./app -d ./docs
```
- このコマンドを打てば生成される

ApiGen自体のプロジェクトが一度止まってたみたいな記述がある記事を見かけたので、もしかしたらインストールするのに苦労するかもしれません(僕は1週間以上かかりました)
入れ子になったデータを取得する

[引数指定したキーでmapを掘り下げる](https://qiita.com/piacere/items/f376e36a092921b18797) に触発されて書いています．

入れ子になったデータを取得するのには [`Kernel.get_in/2`](https://hexdocs.pm/elixir/Kernel.html#get_in/2) と [Access](https://hexdocs.pm/elixir/1.6.0/Access.html) を使うと便利です．

```elixir
# An example to get a value from nested data structure with using Kernel.get_in/2 and Access module

map = %{a: [1,2,3], b: %{"x" => "X", "y" => "Y"}, c: {:i, :j}}
IO.puts "map # => #{inspect map}"

key=:a
IO.puts "key # => #{inspect key}"
IO.puts "get_in(map, [key]) # => #{inspect get_in(map, [key])}"
IO.puts "get_in(map, [key, Access.at(1)]) # => #{inspect get_in(map, [key, Access.at(1)])}"

IO.puts "========"

key=:b
IO.puts "key # => #{inspect key}"
IO.puts "get_in(map, [key]) # => #{inspect get_in(map, [key])}"
IO.puts "get_in(map, [key, Access.key(\"y\")]) # => #{inspect get_in(map, [key, Access.key("y")])}"

IO.puts "========"

key=:c
IO.puts "key # => #{inspect key}"
IO.puts "get_in(map, [key]) # => #{inspect get_in(map, [key])}"
IO.puts "get_in(map, [key, Access.elem(1)]) # => #{inspect get_in(map, [key, Access.elem(1)])}"
```

を実行すると

```
map # => %{a: [1, 2, 3], b: %{"x" => "X", "y" => "Y"}, c: {:i, :j}}
key # => :a
get_in(map, [key]) # => [1, 2, 3]
get_in(map, [key, Access.at(1)]) # => 2
========
key # => :b
get_in(map, [key]) # => %{"x" => "X", "y" => "Y"}
get_in(map, [key, Access.key("y")]) # => "Y"
========
key # => :c
get_in(map, [key]) # => {:i, :j}
get_in(map, [key, Access.elem(1)]) # => :j
```

という感じです．

コードはwandboxに置いたので改造してお試しください．
https://wandbox.org/permlink/06RBC9YjTx4Wj7HN
Python3.7のmathの場所

```
import math
math.__path__
```

結果

```
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'math' has no attribute '__path__'
```
ファ!?

```
help(math)
```

をやると最後の文に

```
FILE
    (built-in)
```

built-inでした。
バイナリでもらってきたツールチェインがx86_64の環境で動かないとき、それは32bitのライブラリが無いためかも

組み込みのLinuxの開発で時々ある話。
まっさらの仮想マシン(ubuntu 16.04) にビルド環境をセットアップしようとしたら、SoCベンダーの提供するバイナリのツールチェインが動かない。

# 実行ファイルは確かに存在するのに、なぜか No such file or directory ??

```
$ ls -l ./arm-xxxxx-linux-gnueabi-gcc 
-rwxr-xr-x 1 root root 1897163 Jan 25 03:36 ./arm-xxxxx-linux-gnueabi-gcc
$ ./arm-xxxxx-linux-gnueabi-gcc 
-bash: ./arm-xxxxx-linux-gnueabi-gcc: No such file or directory
```

# これは32bit x86用のバイナリだった
```
$ file ./arm-xxxxx-linux-gnueabi-gcc 
./arm-xxxxx-linux-gnueabi-gcc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.9, not stripped
```

# ldd で共有ライブラリのリストが見られない
```
$ ldd ./arm-xxxxx-linux-gnueabi-gcc 
	not a dynamic executable
$ 
```

```
$ ls /lib/ld-linux.so.2
ls: cannot access '/lib/ld-linux.so.2': No such file or directory
```

わかった。32bit用の共有ライブラリが入っていないからだ。

# 32bit用の共有ライブラリをインストールする

```
$ sudo apt-get install lib32stdc++6 lib32z1
```
この2つを入れれば芋づる式に必要なファイルはほとんど入るはず。

```
$ ldd ./arm-xxxxx-linux-gnueabi-gcc 
	linux-gate.so.1 =>  (0xf7f16000)
	libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf7d94000)
	libm.so.6 => /lib32/libm.so.6 (0xf7d3f000)
	libgcc_s.so.1 => /usr/lib32/libgcc_s.so.1 (0xf7d22000)
	libc.so.6 => /lib32/libc.so.6 (0xf7b6e000)
	/lib/ld-linux.so.2 (0xf7f18000)
```

今度は共有ライブラリのリストが見られるようになった。

```
$ ./arm-xxxxx-linux-gnueabi-gcc 
arm-xxxxx-linux-gnueabi-gcc: fatal error: no input files
compilation terminated.
```

実行できるようになった。
cmakeでccacheを使う

ccacheを使うとコンパイルの中間ファイルがキャッシュされ、２度め以降のコンパイルが速く終わります。

cmakeでのビルドで、ccacheを活用するにはどうしたらよいでしょうか。
よくあるのは`export CC='ccache gcc'`とかでコンパイラ自体をccacheに置き換える方法です。

cmakeにはコンパイル時にラッパを噛ませるための、[RULE_LAUNCH_COMPILE](https://cmake.org/cmake/help/v2.8.0/cmake.html#prop_global:RULE_LAUNCH_COMPILE)プロパティがあります。
このプロパティを使い、かつcmakeのオプションに対応したのが以下です。`ccmake`等で有効/無効を調整できるので、少し便利です。

```cmake:EnableCcache.cmake
option(CCACHE_ENABLE
  "If the command ccache is avilable, use it for compile."
  ON)
find_program(CCACHE_EXE ccache)
if(CCACHE_EXE)
  if(CCACHE_ENABLE)
    message(STATUS "Enable ccache")
    set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_EXE}")
  endif()
endif()
```

cmake 3.4以降なら[CMAKE_\<LANG>_COMPILER_LAUNCHER](https://cmake.org/cmake/help/v3.4/variable/CMAKE_LANG_COMPILER_LAUNCHER.html)変数を使ったほうがよさそうです。
[Specify multiple RULE_LAUNCH_COMPILE will result in command line with semicolon (#17273) · Issues · CMake / CMake · GitLab](https://gitlab.kitware.com/cmake/cmake/issues/17273)

```cmake:EnableCcache.cmake(3.4以降)
option(CCACHE_ENABLE
  "If the command ccache is avilable, use it for compile."
  ON)
find_program(CCACHE_EXE ccache)
if(CCACHE_EXE)
  if(CCACHE_ENABLE)
    message(STATUS "Enable ccache")
    if(CMAKE_C_COMPILER_LAUNCHER)
      set(CMAKE_C_COMPILER_LAUNCHER "${CMAKE_C_COMPILER_LAUNCHER}" "${CCACHE_EXE}")
    else()
      set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_EXE}")
    endif()
    if(CMAKE_CXX_COMPILER_LAUNCHER)
      set(CMAKE_CXX_COMPILER_LAUNCHER "${CMAKE_CXX_COMPILER_LAUNCHER}" "${CCACHE_EXE}")
    else()
      set(CMAKE_CXX_COMPILER_LAUNCHER "${CCACHE_EXE}")
    endif()
  endif()
endif()
```
IBM Cloud DSXで使うデータをオブジェクトストレージにツールで簡単に入れておく方法

IBM Cloudのデータサイエンティスト向けのサービスData Science Experience (以下DSX) 、データの格納場所としてIBMのオブジェクトストレージが使えます。このオブジェクトストレージはAWSのS3互換なので世の中にたくさん出回っているS3用のツールが使えます。とりあえずこのツールで気になるデータを入れておいて後でDSXを使っていろんなことを試してみることができたので設定方法忘れないうちに書いておきます。ちなみにずっと無料で使えるライトプランでもできるのでぜひお気軽におためしください。
ライトプランはこちらを参照ください。
＊IBM Cloud上のLiteプラン(ずっと無料)でData Science Experience(DSX)が使えるようになったので、触ってみた　★2017/11 Update
https://qiita.com/ishida330/items/db496801290279aa015d

![スクリーンショット 2018-01-25 11.00.44.png](https://qiita-image-store.s3.amazonaws.com/0/59741/eab521e9-b4b5-29e1-5cc3-1b7e52bc183d.png)


やることは
-S3互換ツールのインストール
-IBM CloudでDSXを作成
-オブジェクトストレージ のCredential情報を調べて上記S3互換ツールに入力
-ツールにデータをアップロード
-DSXでData Assetとして登録

-S3互換ツールのインストール
　実際のやり方は各ツールで違うので参考のリンクだけ貼っておきます。
　CLoudDuck https://cyberduck.io/index.ja.html?l=ja
　CLoudBerry https://www.cloudberrylab.com/explorer/amazon-s3.aspx
　Transmit4  https://panic.com/jp/transmit/

-IBM CloudでDSXを作成
　こちらも下のブログに書いてあるのでそちらを参照ください。ただ一点だけ変更点があります。
新しいプロジェクトを作成する際にオブジェクトストレージ の種類を聞かれます。IBM Cloud Object Storageを洗濯してください。下のブログでは Object Storage (Swift API)が選択されてます。ただ現在はIBM Cloud Object Storageがデフォルトになっているようです。
![スクリーンショット 2018-01-25 11.16.12.png](https://qiita-image-store.s3.amazonaws.com/0/59741/2dbd2fcb-066b-5d37-e87b-739437fd8e62.png)

＊IBM Cloud上のLiteプラン(ずっと無料)でData Science Experience(DSX)が使えるようになったので、触ってみた　★2017/11 Update
https://qiita.com/ishida330/items/db496801290279aa015d

-オブジェクトストレージ のCredential情報を調べて上記S3互換ツールに入力
　IBM Cloudのダッシュボード画面に戻ってください。そしてObject Storageのを選択（クリック）してください。
![スクリーンショット 2018-01-25 11.22.57.png](https://qiita-image-store.s3.amazonaws.com/0/59741/7864edfb-ecb9-cd86-3f09-c8138cb1af8f.png)
そして以下の３つの情報をメモしてください。この後ツールの設定で使います。
エンドポイント、Access Key id, Secret Access Key
-エンドポイントはこちら
![スクリーンショット 2018-01-25 11.25.41.png](https://qiita-image-store.s3.amazonaws.com/0/59741/7d5066a2-c605-a9ee-ede3-870ccc3d8743.png)
-Access key id, Secret Access keyはこちら
![スクリーンショット 2018-01-25 11.30.56.png](https://qiita-image-store.s3.amazonaws.com/0/59741/fdcdb2d0-269d-6bf7-b14b-ee2e015eac47.png)
この３つの値をツールに入れてください。
![スクリーンショット 2018-01-25 12.08.38.png](https://qiita-image-store.s3.amazonaws.com/0/59741/3c78c877-2ef1-47c6-852a-8cc3d882dc35.png)

-ツールにデータをアップロード
　ツールを起動してファイルをアップロードしてください。（バケットが既に作られているのでその中に）
![スクリーンショット 2018-01-25 12.11.14.png](https://qiita-image-store.s3.amazonaws.com/0/59741/ea425a9c-b51f-d45a-1b40-6f0c7f0354fb.png)

-DSXでData Assetとして登録
　DSXで作成したプロジェクトを開いてください。
![スクリーンショット 2018-01-25 12.16.43.png](https://qiita-image-store.s3.amazonaws.com/0/59741/caa4685e-3ab8-3c1c-1fda-64c6936e7d86.png)
今のデータがData assetsに出てきます。
![スクリーンショット 2018-01-25 12.18.05.png](https://qiita-image-store.s3.amazonaws.com/0/59741/514240ee-6629-4542-b7ae-12e2f1b2c150.png)
ちなみにnotebookで使うときはこんな感じで
![スクリーンショット 2018-01-25 12.22.56.png](https://qiita-image-store.s3.amazonaws.com/0/59741/e4d0c05a-91a6-2045-3d56-9068f87d1016.png)
workflowで一気に複数のpngをjpgに変換する(実用)

#背景
　　仕事中でエビデンスを作る時に、画像のタイプの変換とサイズの変換が必要だ。その時にMACを使っている方にとっては外部のソフトを使わずにmacのAutomatorを使えば楽にできるはず。

![スクリーンショット 2018-01-25 11.35.19.png](https://qiita-image-store.s3.amazonaws.com/0/191439/921b76ec-76a4-7050-5709-effcd41894cd.png)
図1

##操作

###1.Automatorを開く
![スクリーンショット 2018-01-25 11.36.44.png](https://qiita-image-store.s3.amazonaws.com/0/191439/472bb279-94d3-a876-06da-6fb840a68bc2.png)
図2

###2.新規->サービス
![スクリーンショット 2018-01-25 11.38.47.png](https://qiita-image-store.s3.amazonaws.com/0/191439/cd857baa-0b52-75d5-e123-ac969fa5370c.png)

###3.左側のサイトメニュー:
  ファイルとフォルダ->フォルダの内容を取得
　　　　　　　　　->Finder項目にフィルタを適用->ファイル拡張しがpngである
　　　　　　　　　->Finder項目の名前を変更(自動的にFinder項目をコピーが追加され)
                        ->連番付きの名前にする
　　　　　　　　　　　　　　　　->番号の追加先:
                                     ->新しい名前:img
                             ->番号の位置:名前の後 
　　　　　　　　　　　　　　　　->開始番号:1
                             ->区切り記号:ハイフン
　
                 
![スクリーンショット 2018-01-25 11.48.19.png](https://qiita-image-store.s3.amazonaws.com/0/191439/4618f76b-8985-faad-81f4-24d8592e4bb2.png)


###4.左側のサイトメニュー:
 　写真->イメージのタイプを変更(自動で追加されたFinder項目をコピーを削除する)
　　　　　　　　　　　　　->変更後のタイプ:JPEG

![スクリーンショット 2018-01-25 12.04.00.png](https://qiita-image-store.s3.amazonaws.com/0/191439/e81ee113-a6fd-7bad-f465-35cb71f81ca1.png)

###5.ファイル->書き出す->名前をconvert.workflowにして、保存する

![スクリーンショット 2018-01-25 12.05.36.png](https://qiita-image-store.s3.amazonaws.com/0/191439/82f1d7f5-4ae4-b809-ede1-027e75a40565.png)

####6.pngファイルがいっぱい入っているdrawableフォルダにいく

![スクリーンショット 2018-01-25 12.06.56.png](https://qiita-image-store.s3.amazonaws.com/0/191439/ab2d57b2-66d2-0d81-4c32-5d253e91fcea.png)


####7.drawableフォルダに右クリっっく->サービス->convertをクリック
![スクリーンショット 2018-01-25 12.07.16.png](https://qiita-image-store.s3.amazonaws.com/0/191439/58a7bbf7-f678-1969-b7ff-5158454f0e4e.png)


####8.~/Desktop/onepieceの内容を確認する
![スクリーンショット 2018-01-25 12.23.03.png](https://qiita-image-store.s3.amazonaws.com/0/191439/683ea160-544c-bc7c-3fc6-7a82a9debe2c.png)


　　みんな、元気で！
【G Suite】Google Spread Sheet で隣セルへの移動について

Google Spread Sheet では、セルにて入力後、次に隣のセルへの移動は
以下のショットカット キーで実現することができます。

---
![无标题.png](https://qiita-image-store.s3.amazonaws.com/0/194463/dfb590be-176b-b482-05f8-837095137d22.png)
PyMOL tips

## show Periodic Boundary Cell (PBC)

MDのPBCを視覚化したいときに使う。
なお，VMDでは，tkconsoleで`pbc box`で同じことができる。

```
show cell
```

![z2.png](https://qiita-image-store.s3.amazonaws.com/0/99215/46dbe8b2-5092-c32b-be3a-00e19351cda5.png)

- ref. https://sourceforge.net/p/pymol/mailman/message/35537986/

## make an image schematic

イラストや模式図を描きたいときに使える。

```
set ray_trace_mode, 3 # (or 1 or 2; best with "bg_color white;set antialias,2")
```

### set ray_trace_mode, 2

![z4.png](https://qiita-image-store.s3.amazonaws.com/0/99215/ab09a1f5-4409-475a-f52b-ec92927163b3.png)

### set ray_trace_mode, 3

![z3.png](https://qiita-image-store.s3.amazonaws.com/0/99215/122ea25e-ae30-72b2-db9a-772fc352b167.png)

- ref. https://pymolwiki.org/index.php/Ray#Modes

## set user's preference

WindowsでもLinuxでも，ユーザのホームディレクトリに，`.pymolrc`というファイルを作成し，中にコマンドを書いておくと，pymolを起動したときに自動で実行される。

- 例

```txt:~/.pymolrc
import os
os.environ["http_proxy"] = "http://111.11.11.11:1111/"
os.environ["ftp_proxy"] = os.environ["http_proxy"]

set h_bond_cutoff_center, 3.5
set h_bond_max_angle, 30

set cartoon_ring_mode, 3
#set cartoon_ring_finder, 1
#set cartoon_ladder_mode, 1
#set cartoon_nucleic_acid_mode, 4
set cartoon_ring_transparency, 0.5

#Extending colors with color-blindness friendly color palette
#References:
#http://jfly.iam.u-tokyo.ac.jp/html/color_cb/#pallet
#https://personal.sron.nl/~pault/colourschemes.pdf
set_color cb_blue, [51, 34, 136]
set_color cb_tan, [221, 204, 119]
set_color cb_lightblue, [136, 204, 238]
set_color cb_green, [17, 119, 51]
set_color cb_teal, [68, 170, 153]
set_color cb_gold, [153, 153, 51]
set_color cb_salmon, [204, 102, 119]
set_color cb_red, [136, 34, 85]
set_color cb_pink, [170, 68, 153]

set stick_radius, 0.2
set orthoscopic, 0
set overlay, 1
set spec_reflect, 0
set ray_shadow, 0

log_open log.pml, mode=a
```
antminer S9 の設定。antpoolでマイニング開始までのメモ。


## 1.本体の各配線

電源と本体、10本のケーブルを接続。
本体裏にLANケーブルさす。
電源裏に電源ケーブルさす。電源はまだつながない。
電源ケーブルは本体付属のものをとりあえず使う。市販PC用のケーブルは、細すぎて、稼働後に熱くなるので注意。
市販でもっと太いのがあれば安心かも。

## 2.antpoolのアカウント作成

antpoolログインはbitmainと同じ。
workerを管理しやすい名前で、サブアカウントを作成。
サブアカウントは、[settings]から。
workerは1台につき1worker作成した。

ダッシュボードで、マシンからantpoolに接続するURLを確認しておく。
stratum+tcp://stratum.antpool.com:3333
stratum+tcp://stratum.antpool.com:443
stratum+tcp://stratum.antpool.com:25

## 3.設定用PCの用意

このPCから、マシン本体に内部IPで接続するので、同じネットワーク内であること。
ネットワーク内の接続端末を探すため、lan検索アプリを入れる。
macなので、lanscanを使った。

## 4.設定PCから本体へ接続

本体の電源を差すとファンが回る。
ちょっとまってから、lanscanでlanの端末を検索すると、新しいIPで端末が見つかる。
デフォルトで、hostnameがantminerとなっている。

見つかったIP 192.168.xxx.xxx でブラウザアクセスする。
id,pwとも、rootがデフォルト。
本体内のコンパネが表示される。

## 5.本体の設定

ダッシュボードで確認したURLと、作成したworker名を入れる。
パスワードは適当でよいみたい。
そしてリセット。

しばらくすると（5〜10分くらい）mining statusにハッシュレートなどが表示されることを確認。
さらに（5〜10分くらい）で、antpoolのダッシュボードにも、ハッシュレートが表示されれば採掘できている。

## その他
マニュアルには、network設定をDHCPからstaticに変更を推奨。
変更しなくても本体接続はできる。が、IPが変わるかも。

staticの各アドレスに入力に失敗したら、本体にアクセスできなくなった。
その場合、電源を一度入れ直して、本体裏の小さい穴のresetをペンの先とかで、しばらく長押し。それで復旧。
dev.toにおけるServiceWorker活用術

重い腰を上げてServiceWorkerに触れました（[Service Worker の紹介](https://developers.google.com/web/fundamentals/primers/service-workers/?hl=ja)）。
こんなにも簡単にブラウザキャッシュできるのか！と感動し、「速い速いと言われる[dev.to](https://dev.to/)でも使っているんでしょう？」と見てみたら更なる感動があったので内容を書き残します。

# 何をやっていた？

結論から

1. [dev.to](https://dev.to/)にアクセスした時点で、記事ページのhtmlがキャッシュされる（上から6枚くらい）
2. オフライン用のhtmlがキャッシュされていて、リクエストが失敗する（= キャッシュされていない）画面ではこれが返される
3. スクロールする毎に記事ページのhtmlを取りに行き、次々にキャッシュする

なので、[dev.to](https://dev.to/)にアクセスした後にオフラインになったとしても

- ファーストビューに出ている記事くらいは見ることが可能で
- それ以降の記事を踏まれたとしても「ネット回線切れているよー」というhtmlが表示されるため、殺風景な画面を見ることがない

ということになっていました。

# `serviceworker.js`の内容

minifyされていますが、chromeさんのdevToolsでフォーマットしてみても
**たったの63行！！**
なので、是非実際に見てみてください。

ここではざっくり内容を書きます。

## イベント
`install`、`activate`、`fetch`のみ設定されています。

### install
- 各画面共通のリソースをキャッシュ

### activate
- キャッシュの更新

### fetch
- 取得したレスポンスデータをキャッシュ
- リクエストにマッチするキャッシュがある場合にキャッシュを返す
- キャッシュがなく、リクエストも失敗した場合にオフライン用htmlを返す

# `ServiceWorker`導入のハードル

レスポンスデータをキャッシュして返す、という点に絞ってみた場合ですが

- サイトがSSL化されている
- 実装に少しだけ時間がかかる

これだけで、これさえクリアすれば

- ページの高速化
- オフライン時でも何らかのレスポンスを返す

ことができるようになります。

`ServiceWorker`非対応の環境ではこれまで通りサーバーにリクエストが飛ぶだけなので、入れない理由がないと思いました。






# 結論

すぐやります。
パクります。
AWS ap-northeast-1に4個のAZがあることを確認する (ap-northeast-1dができた)


https://aws.amazon.com/jp/blogs/news/the-fourth-new-availability-zone-tokyo-region/

> 東京リージョンに新たにアベイラビリティゾーンを追加 | Amazon Web Services

というブログが2018-01-25に出ていました。執筆日(2018-01-25)現在、本家の https://aws.amazon.com/blogs/ には同様の記事はないようです。

## 既に2AZ使えている環境の場合の確認方法
```
$ aws ec2 describe-availability-zones --output text
AVAILABILITYZONES	ap-northeast-1	available	ap-northeast-1a
AVAILABILITYZONES	ap-northeast-1	available	ap-northeast-1c
AVAILABILITYZONES	ap-northeast-1	available	ap-northeast-1d
```

-> ap-northeast-1a/ap-northeast-1cが使えていた場合、ap-northeast-1dが追加されるようです。そのため、3AZsでコンピュートができるはずです。

## 既に3AZ使えている環境の場合の確認方法

```
$ aws ec2 describe-availability-zones --output text
AVAILABILITYZONES	ap-northeast-1	available	ap-northeast-1a
AVAILABILITYZONES	ap-northeast-1	available	ap-northeast-1b
AVAILABILITYZONES	ap-northeast-1	available	ap-northeast-1c
AVAILABILITYZONES	ap-northeast-1	available	ap-northeast-1d
```

-> ap-northeast-1a/ap-northeast-1b/ap-northeast-1cが使えていた場合、ap-northeast-1dが追加されるようです。が、いつも通り、実務上はVPCで使えなかったAZは引き続き使えないので、3AZsでコンピュートすることになるようです。

## 4AZ導入後の新規アカウント

ap-northeast-1a, ap-northeast-1b, ap-northeast-1c, ap-northeast-1dの中か3AZsが利用可能になるのか、ap-northeast-1dは必ず含まれるような具合になるのかは試せていないので分かりませんが、確認しておきたい要素ではありますね。

## 課題

### (1) 参照できないケース

```
$ aws ec2 describe-availability-zones --output text

Could not connect to the endpoint URL: "https://ec2.ap-norheast-1.amazonaws.com/"
```

というようにコケるAWS Accountがあるようです。AWS, AWS CLI, AWS SDK, Amazon EC2, Amazon VPCのいずれも詳しくないので、時間が経つのを待っていれば解決するのかアカウントの問題なのか分かりませんので、しばらく待つことにします。

### (2) 4AZs
Web console (Amazon Web Servicesの用語ではManagement Consoleと表現される気がする) では、上記のCLI (API) をコールしているため、

<img width="434" alt="ap-northeast-1a-error.png" src="https://qiita-image-store.s3.amazonaws.com/0/49113/3d7b495c-f8ee-be6b-eca3-e7a33da41f9d.png">

となってしまうので、誤って使えないAZを選んでしまうと

<img width="433" alt="ap-northeast-1a-error-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/49113/84614a61-6ecb-1c29-b5db-08beafeff22e.png">

というようなら、エラーに遭遇してしまう。
「既に3AZ使えている環境」=「これから4AZ使えそうに見える環境」の方は**従前通り**注意が必要です。と言っても、Management Consoleから触ってVPC/Subnetを構築する人はいないので、多分誰も困らないでしょう。

## これにより実現できること

これでようやくAWS Tokyo (ap-northeast-1) で3AZないと高SLAが実現できないアプリケーション・ソフトウェアが動かせる日がやってきました。

Google Cloud Platform (GCP)のGCEでのasia-northeast-1では2016年秋より使えていましたので、私の状況として[こちらで困っていませんでした](https://cloudplatform-jp.googleblog.com/2015/04/google-cloud-platform-o2o.html)。最近になって、AzureでもAzure AZが2017年末頃から提供開始されていたよう（伝聞）なので、AWSでも（少なくとも結果的に）それに追従する形で実現に至ったようです。

今後も積極的に3AZを活用したコンピューティングで高可用性を実現していきたいと思える瞬間でした。

## References
- [aws . ec2 . describe-availability-zones](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-availability-zones.html)
- [AWS Documentation » Amazon EC2 » API Reference » Actions » DescribeAvailabilityZones
](https://docs.aws.amazon.com/goto/WebAPI/ec2-2016-11-15/DescribeAvailabilityZones)
nginx > (windows) nginxのインストールとサービス常駐



# 本家サイト
[Welcome to NGINX Wiki! | NGINX](https://www.nginx.com/resources/wiki/)


# インストールガイド
[Install | NGINX](https://www.nginx.com/resources/wiki/start/topics/tutorials/install/)


# インストーラー
[nginx: download](http://nginx.org/en/download.html)

Installation:

```
cd c:\
unzip nginx-1.2.3.zip
ren nginx-1.2.3 nginx
cd nginx
start nginx
```

<pre>
startとは:
現在のウインドウとは別のコマンドプロンプトウィンドウを起動して、指定したプログラムまたはコマンドを実行する。
</pre>

startコマンドで何も表示されなければ、ポートがかぶっている可能性もあります。（IIS等）

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/3c522286-2484-fd77-a9f3-278a33fa825b.png)

ローカルにアクセスして、「Welcome to nginx!」が出ればOK
http://localhost/


## 停止
nginx -s stop
nginx -s quit
nginx -s start


# サービス

nginxが動いていれば停止しときます。

`nginx -s stop`


winswを使ってサービス化します。

以下から最新版をダウンロードし、C:\nginxの直下に置く
[Index of releases/com/sun/winsw/winsw](http://repo.jenkins-ci.org/releases/com/sun/winsw/winsw/)

名称をリネームする。名称はなんでもOK
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/5289b42b-7be1-4834-5afb-3eaa4380ee47.png)

バージョンが分かるように
winsw-2.1.2-nginxsvc.exeにリネームしました。


winsw-2.1.2-nginxsvc.xmlを作成

```winsw-2.1.2-nginxsvc.xml
<service>
  <id>nginx</id>
  <name>nginx</name>
  <description>nginx</description>
  <logpath>c:\nginx\logs</logpath>
  <logmode>roll</logmode>
  <depend></depend>
  <executable>c:\nginx\nginx.exe</executable>
  <startargument></startargument>
  <stopexecutable>c:\nginx\nginx.exe</stopexecutable>
  <stopargument>-s</stopargument>
  <stopargument>stop</stopargument>
</service>
```

以下のような構成になっています。
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/a79ad767-de9b-b3ae-4bd7-5bbe23e1a314.png)


管理者権限でコマンドプロンプトを開き、以下のコマンドを叩く

```
C:\nginx\winsw-2.1.2-nginxsvc.exe install
```

以下のようにでればOK

```
C:\nginx>winsw-2.1.2-nginxsvc.exe install
2018-01-25 11:06:46,673 INFO  - Installing the service with id 'nginx'

```

サービスを削除する場合には以下

```
C:\nginx\winsw-2.1.2-nginxsvc.exe uninstall
```
Kerasのimportをシンプルにする

# 増え続けるimport文

みなさんの中にはKerasに限らずPythonのファイルの頭がこんなことになってしまって整理するのも面倒になってしまった経験のある方はいないでしょうか。

```importだらけ
from keras.layers.core import Reshape, RepeatVector, Permute, Dense, Activation
from keras.layers.merge import Multiply, Add, Concatenate
from keras.layers.recurrent import LSTM
from keras.models import Model, load_model
from keras.optimizers import Adam
from keras.callbacks import TensorBoard
from keras.layers.wrappers import TimeDistributed
from keras.layers.core import Lambda
from keras.engine.topology import Container
from keras import backend as K
```

きっとこれ以外にも `import os, sys` や `import numpy as np` という呪文が書いてあったりすると思います。

# Kerasのimportをシンプルにする

実は `layers` 以下のモジュールは全て `keras.layers` から読み込めます。

```
from keras.models import Model, load_model
from keras.layers import Input, Activation, Dense, LSTM, TimeDistributed, Lambda, Reshape, RepeatedVector, Permute, Multiply, Add, Concatenate
from keras.optimizers import Adam
from keras.callbacks import TensorBoard
from keras.engine.topology import Container
from keras import backend as K
```

これを知っておくと、ちゃちゃっと小さいモデルを新たに作ろうとした時に「あれ、LSTMって `keras.layers.recurrents` だっけ？(違う)」とか「RepeatVectorって `core` だっけ？」とか「TimeDistributedってどこに入ってたっけ？」とかで悩んでいちいちググらなくて済みます。
ElixirのEctoでSQLを直接投げる

mix phx.gen.～を使うと、RailsのActiveRecordチックに、ModelとDBアクセッサ関数を自動生成してくれるが、DBアクセッサ関数のみだと、非効率なselectにしてしまうケース…たとえば、get_xxxxx()で毎回1行ずつ取り出してロジック側でループしてしまうバッドパターンがRails同様にあるし、joinやgroup_by等はDBアクセッサ関数でフォローされないため、自由にSQLを書きたいニーズがある

そういうときは、以下のようなEctoの使い方をすればOK

```elixir
	sql = "select * from hoge inner join foo on hoge.customer_id = foo.customer_id"
	{ :ok, result } = Ecto.Adapters.SQL.query( Livery.Repo, sql, [] )
```

以下のように関数化しておくと便利かも知れない

```elixir
	def query( sql ) when sql != "" do
		{ :ok, result } = Ecto.Adapters.SQL.query( Livery.Repo, sql, [] )
		result
	end
```

Repoの指定が、固定だと困る場合は、モジュールを引数渡しするか、Agentに持たせる等で工夫する
Emacsで拡張を書く

Emacsの機能を拡張しようと思って.elファイルを作成するといつもEmacsにここの書き方がだめなんだよ！
って怒られてたんでどうしたらいいのか調べました。

## これを書きたい
```lisp
;; hello.el
(message "hello world")
```
↑を表示したいとしたらEmacsが怒る

## どうしたら？
```lisp
;; hello.el
;;; hello.el --- write something here!
;;; Commentary:
;;; code:

(message "hello world")

;;; hello.el ends here
```
↑ここまで書くと怒られない

なんでここまできっちりしてるんだって気持ちになった
きっと大事なことなんだろう
pip の constraints の正しい用途

[Pythonプロジェクトのディレクトリ構成](http://www.rhoboro.com/2018/01/25/project-directories.html) という記事を見かけたのですが、どうも constraints の使い方について誤解が広まっているようです。

この記事で利用されている requirements.txt と constraints.txt の正しい実現方法と、 constraints の本来の使い方を紹介しておきます。

## バージョンロックの実現方法

プロジェクトで Flask を使うとしましょう。特にバージョンに関して意見が無いので requirements.txt はこの状態で始めます。

```requirements.txt
Flask
```

さて、 Flask をインストールしましょう。新しい仮想環境の中で次のコマンドを実行します。

```
$ pip install -r requirements.txt
$ pip install flask
Collecting flask
  Downloading Flask-0.12.2-py2.py3-none-any.whl (83kB)
    100% |████████████████████████████████| 92kB 3.7MB/s
Collecting Jinja2>=2.4 (from flask)
  Using cached Jinja2-2.10-py2.py3-none-any.whl
Collecting click>=2.0 (from flask)
  Downloading click-6.7-py2.py3-none-any.whl (71kB)
    100% |████████████████████████████████| 71kB 3.8MB/s
...
Successfully installed Jinja2-2.10 MarkupSafe-1.0 Werkzeug-0.14.1 click-6.7 flask-0.12.2 itsdangerous-0.24
```

CI環境と本番環境では固定された、再現性のあるバージョンで実行したいとします。その場合は `pip freeze` を使います。

```
$ pip freeze > requirements.lock
```

```requirements.lock
click==6.7
Flask==0.12.2
itsdangerous==0.24
Jinja2==2.10
MarkupSafe==1.0
Werkzeug==0.14.1
```

新しい仮想環境に同じバージョンをインストールするのには、 requirements.txt の代わりに requirements.lock ファイルを使います。

```
$ pip install -r requirements.lock
```

## ライブラリの更新

ライブラリのバージョンアップは大事です。しておかないとセキュリティFixを見逃す恐れがあります。定期的に lock ファイルを更新しましょう。そのためには新しい仮想環境で lock ファイルを作り直すだけです。

```
$ rm -rf venv
$ python -m venv venv
$ venv/bin/pip install -r requirements.txt
$ venv/bin/pip freeze > requirements.lock
$ rm -rf venv
```

## 利用バージョンのゆるい制限

このままライブラリの更新を頻繁にしていると、後方互換性のないメジャーバージョンアップも実行される可能性があります。

例えばFlask 0.12.3 が出たらアップデートするけど、 Flask 0.13 や 1.0 へのアップデートは通常のライブラリの更新フローで更新したくない場合は、 requirements.txt 側に [version specifier](https://www.python.org/dev/peps/pep-0440/#version-specifiers) を書いておきましょう。

```requirements.txt
Flask ~= 0.12.2
```

あるいは、 0.13 なら大きな非互換はないから、メジャーバージョンだけ固定したいというなら次のように書くこともできます。

```requirements.txt
Flask == 0.*
```

Flask が依存しているライブラリについても、同じように requirements.txt でメジャーバージョンやマイナーバージョンが上がらない用に指定することができます。


## constraints の使い方

constraints は、 pip install の -c オプションを使います。 -r オプションと違い、これで指定しただけではライブラリはインストール **されません**。ただバージョンを制限するだけです。

```
$ pip install -c requirements.lock
You must give at least one requirement to install (see "pip help install")
```

constraints は OpenStack からの要望で追加された機能です。

OpenStack にはたくさんの Python プロジェクトがありますが、ある程度利用するライブラリとそのバージョンを共通化しています。

例えば、 eventlet の 0.17.4 を共通で使うとしましょう。しかし、すべてのプロジェクトが eventlet を使うとは限りません。その場合に、全体で共通の constraints.txt にこう書いておきます。

```constraints.txt
eventlet == 0.17.4
```

これを使うときはこうします。

```
$ pip install -r プロジェクトのrequirements.txt -c 共通のconstraints.txt
```

これで、プロジェクトのrequirements.txt に eventlet （や eventletに依存するパッケージ）が書かれていたらそのバージョンが 0.17.4 に固定化され、なければ eventlet はインストールされません。

constraints.txt はこのようにして使うものなので、世の中の殆どの Python 製アプリの開発では使う必要がないでしょう。

---

最近は Pipenv が流行ってきているので、この誤解も含めてすべてをリセットしてわかりやすくなることを期待しています。
mongo-ruby-driverを2.5.0にあげたらサーバー接続エラーが出る

# 経緯

MongoDBを使っているRailsアプリで、Rubyのバージョンを上げようとした時の話。
バージョン2.4以前のmongo gemを使っていて、Rubyのバージョンを2.4以上に上げようとすると以下のような警告が大量に出る。

```
/.../.rbenv/versions/2.5.0/lib/ruby/gems/2.5.0/gems/mongo-2.4.3/lib/mongo/cursor.rb:225: warning: Mongo::Cursor#limit at /.../.rbenv/versions/2.5.0/lib/ruby/2.5.0/forwardable.rb:157 forwarding to private method Mongo::Index::View#limit
```

実はこの対策はすでに取られていて、mongo gemの2.5に入れられている。
https://jira.mongodb.org/browse/RUBY-1240

そこで`bundle update mongo`を行って2.4.3->2.5.0に更新したのだが、railsを起動したところ

```
Mongo::Error::NoServerAvailable: No server is available matching preference: #<Mongo::ServerSelector::Primary:0x70282203496220 tag_sets=[] max_staleness=nil> using server_selection_timeout=30 and local_threshold=0.015
```
というエラーが出て接続できなくなってしまった。

# 原因と対策

変更したのはmongo gemのバージョンだけだったので、ソースの差分を確認してみた。
https://github.com/mongodb/mongo-ruby-driver/compare/v2.4.3...v2.5.0

すると怪しい箇所を発見

```diff:lib/mongo/address.rb
-          res = FAMILY_MAP[info[4]].new(info[3], port, host)
+          res = FAMILY_MAP[info[4]].new(host, port, host)
```

おそらく、この変更によってアドレス解決に失敗するようになったのだろう。ちょっとgemを編集して`info`と`host`を出力してみる。

```
info => ["AF_INET", 0, "127.0.0.1", "127.0.0.1", 2, 1, 6]
host => "localhost"
```

というわけで原因がわかった。`host`にはrailsアプリのconfig/mongoid.ymlで設定している値が入っているので、このファイル内でIPアドレスで指定するようにした。

```diff:config/mongoid.yml
       hosts:
-        - localhost:27017
+        - 127.0.0.1:27017
```

これによって無事にmongo gemを更新することができた。
Swift備忘録~ボタンの実装編~

#はじめに
お仕事でStory Boardを使わずにボタンを実装することがあったので、今後も使えそうなのでここに記録します。
前回の投稿にも書いてありますが筆者の備忘録ですので、投稿の内容に過度な期待はしないでください。

#環境
Xcode9.2


#今回の備忘録
##ボタンを実装するための必要最低限のコード
```
static func buttonMethod() -> UIButton {
　　　　　　　　　　let button = UIButton()  //ボタンを定義 
　　　　　　　　　　let height = CGFloat(○)   //ボタンの高さを定義、○の中に数値を入れる
　　　　　　　　　　let width = CGFloat(○) 　　　　　　//ボタンの横幅を定義、○の中に数値を入れる
　　　　　　　　　　button.backgroundColor = 〇〇  //ボタンの背景色を定義、○○の中に色を入れる
     return button
}
```

##ボタンの中に画像を入れる
```
button.setImage(UIImage(named: "○○"), for: .normal)  //namedの部分に挿入したい画像の名前、forは最初の状態を入れる
button.imageInsets = UIEdgeInsets(top: ○, left: ○, bottom: ○, right: ○)  //ボタンの縁と画像の余白を定義、○の中に数値を入れる
```

##ボタンの中にテキストを入れる
```
button.setTitle("○○", for: .normal)  //○○に入れたいテキスト、forは最初の状態を入れる
button.titleInsets = UIEdgeInsets(top: ○, left: ○, bottom: ○, right: ○)  //ボタンの縁とテキストの余白を定義、○の中に数値を入れる
button.setTitleColor(○○, for: .normal)  //○○にテキストの色、forは最初の状態を入れる
```

ボタンの中に画像とテキストの両方を挿入したいときは、表示される位置に注意。これを書けば右側に画像、左側にテキストが表示できるようになる。
```
button.semanticContentAttribute = .forceRightToLeft
```

##文字数でボタンの横幅を変える
```
button.sizeToFit()
```

##ボタンの角を丸める
```
button.layer.cornerRadius = ○  //○の中に数値を入れる
```

##タップされた時のボタンの色の設定
```
button.setTitleColor(○○, for: .highlighted)  //タップされた時のボタンの文字の色を決める、○○の中に色を入れる
button.setBackgroundImage(createImageFromUIColor(color: ○○), for: .highlighted)  //タップされた時のボタンの画像の背景色を決める、○○の中に色を入れる
```

##ボタンが非活性時の色の設定
```
button.setTitleColor(○○, for: .disabled)  //非活性時のボタンの文字の色を決める、○○の中に色を入れる
button.setBackgroundImage(createImageFromUIColor(color: ○○), for: .disabled)  //非活性時のボタンの画像の背景色を決める、○○の中に色を入れる
```

createImageFromUIColor(color: ○○)は、これは作られたメソッドなのでそのままコピペしてもエラーになるだけなので、UIColorからUIImageを作るメソッドを作る。**このメソッドの意義、実はちゃんとわかってない。**

```
static func createImageFromUIColor(color: UIColor) -> UIImage? {
     let rect = CGRect(x: ○, y: ○, width: ○, height: ○)  //width * height の　bitmapを作成、○に数字を入れる
     UIGraphicsBeginImageContext(rect.size)
     let context = UIGraphicsGetCurrentContext()
     context?.setFillColor(〇〇)  //〇〇に色を入れる
     context?.fill(rect)　　//bitmapを塗りつぶす
　　　　　　　　　　let image = UIGraphicsGetImageFromCurrentImageContext()  //UIImageに変換
     UIGraphicsEndImageContext()
     return image
}
```