OmniAICreator/Qiita-1.07M huggingface dataset:
Androidアプリケーション開発入門（アプリケーションの公開）

# Androidアプリリリースの流れ

1. Googleディベロッパーアカウントを作成する
    * [AndroidアプリをGooglePlayでリリースする方法【初心者でも簡単！】 | TechAcademyマガジン](https://techacademy.jp/magazine/2255) の **"Googleディベロッパーアカウントを作成する"** を参照
2. デジタル署名したパッケージファイル（apkファイル）を準備する
    * [Android アプリを Google Play に公開、apkファイルの作成](https://akira-watson.com/android/apk.html)
        * **"ビルド"** => **"署名付きAPKの生成"** を選択
2. GooglePlayにアプリケーションを登録する
    * [AndroidアプリをGooglePlayでリリースする方法【初心者でも簡単！】 | TechAcademyマガジン](https://techacademy.jp/magazine/2255) の **"GooglePlayにアプリケーションを登録する"** を参照
    * [Android アプリを Google Play Console に登録する](https://akira-watson.com/android/developer-console.html)

## 【補足】:署名付きAPKの生成

![](https://drive.google.com/uc?usp=sharing&export=view&id=1fz1pZ4k9hsNVVYMLvIe9BOyWLSBOh_bl)

![](https://drive.google.com/uc?usp=sharing&export=view&id=1OFILY8_vq6IuljA6jxDN50WZXdvNrXa8)

![](https://drive.google.com/uc?usp=sharing&export=view&id=10nW_OuRWcmbqolA_2G6ao7xhlSuPVuBG)

## 【補足】:Google Play Console設定

![](https://drive.google.com/uc?usp=sharing&export=view&id=1FO17C6h0QzzPpd_TvW1QLnaRVKb90OR0)
![](https://drive.google.com/uc?usp=sharing&export=view&id=1sezfZeaSS-rHb1AOXULSym1xqtOY484a)

![](https://drive.google.com/uc?usp=sharing&export=view&id=1TE3TnvMFAymqbgrqQF4tpYgxYgWTBweB)
UITableViewのCellが底まで表示されたかどうか判定する

下記コードで実現しました。

```swift
extension UITableView {
    // indexPathsForVisibleRowsの内、そのCellの底が表示されているもののみ返します。
    func indexPathsForVisibleRowsOfDisplayedCellBottom() -> [IndexPath] {
        return self.indexPathsForVisibleRows?.filter { indexPath in
            let cellRect = self.rectForRow(at: indexPath)
            let cellBottomFromTableViewTop = cellRect.maxY
            let visibleTableViewBottomFromTableViewTop = self.contentOffset.y + self.frame.maxY
            if cellBottomFromTableViewTop <= visibleTableViewBottomFromTableViewTop {
                return true
            } else {
                return false
            }
        } ?? []
    }
}
```
RecyclerViewのItemが底まで表示されたかどうか判定する

下記コードで実現しました。  

```kotlin
        recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrolled(recyclerView: RecyclerView?, dx: Int, dy: Int) {
                super.onScrolled(recyclerView, dx, dy)

                recyclerView ?: return
                val layoutManager = binding.pressRecyclerView.layoutManager as? LinearLayoutManager ?: return

                val visibleItemPositions = layoutManager.findFirstVisibleItemPosition()..layoutManager.findLastVisibleItemPosition()
                val displayedItemPositions = visibleItemPositions.filter { position ->
                    val childViewHolder = recyclerView.findViewHolderForLayoutPosition(position) ?: return@filter false

                    val recyclerViewHeight = recyclerView.height
                    val childView = childViewHolder.itemView
                    val rect = Rect()
                    val point = Point()
                    recyclerView.getChildVisibleRect(childView, rect, point)

                    val childViewBottomPosition = point.y + childView.height

                    if (recyclerViewHeight < childViewBottomPosition) {
                        return@filter false
                    }

                    return@filter true
                }
            }
        })
Vue.jsのdataオプションで型を宣言的に書く方法

今回試してるVue.jsのバージョンは2.5で
vue-class-componentを使わず、Thisの型推論ができるコードを対象にしている
（また、strictもしくはnoImplicitThisをtrueにする必要あり）

## 宣言的でない例
以下の場合、dataオプションでcountの初期値に0を指定しているため、
addCount内でthis.countはnumber型と解釈される

```js
export default Vue.extend({
  data() {
    return {
      count: 0
    }
  },
  computed: {
    addCount() {
      this.count += 1
    }
  },
  created() {
    this.addCount
    console.log(this.count) // 1が出力される
  }
})
```

よって、以下のようにcountを'a'に変更すると、this.countはstring型と解釈される
当然結果も文字列結合となり、a1と出力されてしまう

```js
export default Vue.extend({
  data() {
    return {
      count: 'a'
    }
  },
  computed: {
    addCount() {
      this.count += 1
    }
  },
  created() {
    this.addCount
    console.log(this.count) // a1が出力される
  }
})
```

この結果は予期せぬ結果かもしれないので、コンパイル時に気付けるようにしたい

## dataオプション内のプロパティの型を宣言的に書く
dataオプションを以下のように書くことで、countがnumber型であると明示的に書ける
単純にdataオプションは関数なので、その戻り値の型を定義してあげてるだけ

```js
export default Vue.extend({
  data(): {
    count: number
  } {
    return {
      count: 0
    }
  },
  computed: {
    addCount() {
      this.count += 1
    }
  },
  created() {
    this.addCount
    console.log(this.count) // 1が出力される
  }
})
```

先程の例のようにcountに'a'などnumber型以外の値を設定しようとするとコンパイルエラーになる
VSCodeであれば以下のようなエラーを出してくれる

<img width="508" alt=" 2018-05-01 18.54.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/168197/ec7973b4-e643-e984-07c5-6a391d9068be.png">
Emacs 25.3.1 を Mac に brew でインストールする (2018-05-01版)

Emacs をひさびさに落としたら依存しているlibjpegのバージョンが合わなくて起動しなくなり、libjpegのバージョンを切り替えてEmacsを起動できるようにすると他のアプリが起動しないというカオスな状態になったため一年以上ぶりに Emacs を新しく入れなおした、ほぼ自分用の記録です。

# 1. 日本語 IME inline パッチを当てる

```sh
$ brew edit emacs
```

HomebrewでEmacs 24.4+インラインパッチをインストールする
http://www.sevencredit.com/2014/11/07/669/

参考にして 日本語IME inline パッチを当てる

# 2. いったん消す

```sh
$ brew unlink emacs
$ brew uninstall emacs
```

# 3. インストール時に aclocal-1.15 がないというエラーがでるため automake を 1.15 に切り替える

```sh
$ brew switch automake 1.15
```

# 4. インストールする

```sh
$ brew install --with-cocoa --with-gnutls --with-modules emacs
```

5分ぐらい待ちます。

# 5. いろいろリンクする前に確認する

```sh
$ brew link --dry-run emacs
```

# 6. いろいろリンクする

```sh
$ brew link emacs
```

あと `brew linkapps emacs` としたら brew の linkapps 機能が消えていたので自力で

```sh
$ ln -sfv /usr/local/opt/emacs/Emacs.app /Applications
```

とした。

# 7. 確認する

```sh
$ which emacs
/usr/local/bin/emacs

$ which emacsclient
/usr/local/bin/emacsclient

$ emacs --version | head -1
GNU Emacs 25.3.1
```
List[Foo]を返すメソッドは継承しにくい

# 前提

## 引数のList[T]は論外

Pythonのtypingを使ってお型付けをしているときの話。

```Python
from typing import List


class Bar:
    def list_to_none(self, foo: List[Foo]) -> None:  # Bad
        for f in foo:
            self.something(f)
```

こういうメソッドを書くのはよろしくない。
中でやっていることは`iteration`でしかないのに、`list`を継承しているものしか受け取れないようになっているからだ。
この場合は、できるだけ`list`に近い構造を期待している場合は`Sequence[T]`を、単にiterationさえできればいいなら`Collection[T]`を受け取るようにすればよい。

```Python
from typing import Sequence


class Bar:
    def seq_to_none(foo: Sequence[Foo]) -> None:  # Good!
        for f in foo:
            self.something(f)
```

# 本題

## 返り値のList[T]も状況によってはよろしくない

```Python
from typing import List


class Bar:
    def __init__(self, N: int) -> None:
        self._foo = [Foo() for i in range(N)]

    def none_to_list(self) -> List[Foo]:  # Good...?
        return self._foo
```

返り値は自分で決めるものなので、受け取る側の引数と違ってできるだけ表す内容が狭い方がいい。
なので`Collection`や`Sequence`といった広い型ではなく、`List`を使って表したくなる。

だが、このクラスを継承する場合を考えると、話は変わってくる。


```Python
from typing import List


class Bar:
    def __init__(self, N: int) -> None:
        self._foo = [Foo() for i in range(N)]

    def none_to_list(self) -> List[Foo]:
        return self._foo


class MyFoo(Foo):
    pass


class BarOfMyFoo(Bar):
    def __init__(self, N: int) -> None:
        self._myfoo = [MyFoo() for i in range(N)]

    def none_to_list(self) -> List[MyFoo]:
        # Mypy Error
        # Return type of "none_to_list" incompatible with supertype "Foo"
        return self._myfoo
```

この継承はエラーになる。というのも、Python の Generics の引数には covariant （共変） と contravariant （反変） と invariant (不変) があり、`Collection[T]`や`Sequence[T]`が共変なのに対して`List[T]`は不変だからである。なので、これを`Sequence`に変えるとエラーは消える。

```Python
from typing import Sequence


class Bar:
    def __init__(self, N: int) -> None:
        self._foo = [Foo() for i in range(N)]

    def none_to_seq(self) -> Sequence[Foo]:
        return self._foo


class MyFoo(Foo):
    pass


class BarOfMyFoo(Bar):
    def __init__(self, N: int) -> None:
        self._myfoo = [MyFoo() for i in range(N)]

    def none_to_seq(self) -> Sequence[MyFoo]:  # No error
        return self._myfoo
```

ちなみに、`List`のまま返り値の中身を`Foo`であると宣言してもエラーは消えてくれない。


```Python
from typing import List


class Bar:
    def __init__(self, N: int) -> None:
        self._foo = [Foo() for i in range(N)]

    def none_to_list(self) -> List[Foo]:
        return self._foo


class MyFoo(Foo):
    pass


class BarOfMyFoo(Bar):
    def __init__(self, N: int) -> None:
        self._myfoo = [MyFoo() for i in range(N)]

    def none_to_list(self) -> List[Foo]:
        return self._myfoo
        # Invokes another mypy Error
        # Incompatible return value type (got "List[MyFoo]", expected "List[Foo]")
```

`MyFoo`は`Foo`の子だと認識されるが、`List[MyFoo]`は`List[Foo]`の子にはなりえないという話である。

継承されることを想定したクラスを書く際は注意してほしい。


追記:
もう少しだけ詳しく書いておくと、`List`は`Collections.abc.MutableSequence`のサブクラスだが、`Sequence`は`Collections.abc.ImmutableSequence`のサブクラスなので、返したリストを変更される予定がないなら`Sequence`を返すのがよい。
返したリストを変更される予定が少しでもあるなら、継承で`List[MyFoo]`を返してはいけない。なぜなら、変更する側は中身を`Foo`だと思って変更を行うので、例えば`Foo`のインスタンスをリストに追加されてしまうかもしれないからだ。
ExcelVBAでIE操作 Windows7→Windows10で起きたこと

・VBAでInternetExplorerを自動で操作してました。
・Windows7からWindows10に移行しました。

すると、
IE.navigate "url" で、
特定のURLのみ、IEが空っぽになってしまう不具合が発生しました。

【対策まとめ】
・CreateObject("InternetExplorer.Application")ではなく、New InternetExplorerMediumを利用
・Sleepの宣言を書き換える

【詳細】
ググったところ、
「Excel VBAでIE操作時にオートメーションエラーが出た時は、対象のURLが「信頼済みサイト」に登録されているからかもしれない。」
https://qiita.com/3mc/items/da045e86d25ef697ec43

こちらで

CreateObject("InternetExplorer.Application")ではなく、New InternetExplorerMediumを利用します。

と書いてあったので、
そのとおりにしたら動きました。

=======================================

と思ったら、まだエラー
どうやら sleep がうまくいかないらしい。

```vb
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
```

こうすると良いらしい
ruby-opencvがインストールできない

## 環境
High Sierra 10.10.3
HomeBrew 1.6.2 
gem 2.4.5.1
OpenCV3

## 実行コマンド
``` gem install ruby-opencv ```

## エラー
```
Building native extensions.  This could take a while...
ERROR:  Error installing ruby-opencv:
	ERROR: Failed to build gem native extension.

    
>> Check the required libraries...
checking for main() in -lstdc++... yes
checking for main() in -lopencv_calib3d... yes
checking for main() in -lopencv_contrib... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.
```

## 解決策
OpenCV3にはlopencv_contribがないのでOpenCV2をインストール

``` brew install opencv@2 ```

gemをインストールする際にOpenCV2のパスを指定

``` gem install ruby-opencv -- --with-opencv-dir=/usr/local/opt/opencv@2 ```
TypeScriptで連想配列を定義する

TypeScriptで連想配列を書く時に迷ったのでメモ。

# デモ
```typescript

// 連想配列
let list1: { str: string; flag: boolean } = {
    str: 'string',
    flag: true
};

// 配列内連想配列
let list2: { key: string; index: boolean }[] = [
    {
      key: 'string',
      index: true
    },
    {
      key: 'hogehoge',
      index: false
    }
];

// interface
interface list3 {
    id: number,
    season: 'spring' | 'summer' | 'autumn' | 'winter'
}

let obj: list3 = {
    id: 1,
    season: 'spring'
};
```

上記のコードを下記のサイトにコピペすれば確認できます。
ブラウザ上でTypeScriptを試せるのでオススメです。
[Playground](https://www.typescriptlang.org/play/)
サーブレットとはなんぞや

##( Java ) Servlet
- リクエストを受け取り、処理して、クライアントへ返す窓口役
- HTTPメソッド(GETやPOST)から呼び出されるメソッド(doGetやdoPost)の処理を記述するJavaプログラム
- Webサーバ上(バックエンド）で動作する
- データ処理を行う他、Webページ（HTML画面）生成もできる
- クライアント側端末へのダウンロード不要
- 部品(モジュール)化されているので、追加するだけで機能拡張できる
- Javaプログラムなので、OSやハードウェアに依存せず動く
- 一度呼び出すとメモリに常駐するので処理が早い


*補足*
##アプレット
- クライアント側で動作するJavaプログラム
- サーブレットの対義語

##使い方
- HttpServletクラスを継承することで使える
- クライアント端末で使われたHTTPメソッド（GET/POST )に応じて、doGet() / doPost()が呼び出される。

```
// HttpServletは必ず継承する
// 返すURLを @WebServlet で決める
@WebServlet(urlPatterns = {"/SampleServlet"})
public class SampleServlet extends HttpServlet {

  // GETリクエスト時に呼び出される
  @Override
  protected void doGet(HttpServletRequest request
    , HttpServletResponse response)
    throws ServletException, IOException {

      // Serializableインターフェイスを実装しているため必要 / ユニークな値にする
      private static final long serialVersionUID = 1L;

      // 出力内容を設定 (ここではHTMLで、文字列UTF-8を設定)
      response.setContentType("text/html;charset=UTF-8");

      // 画面出力用のWriterクラスインスタンスを取得
      PrintWriter out = response.getWriter().println("<!DOCTYPE html>");
      out.println("<html>");
      out.println("<head>");
      out.println("<title>title</title>");
      out.println("</head>");
      out.println("<body>");
      out.println("<h1>見出し</h1>");
      out.println("</body>");
      out.println("</html>");

  // POSTリクエスト時に呼び出される
  @Override
  protected void doPost(HttpServletRequest request
    , HttpServletResponse response)
    throws ServletException, IOException {
      doGet(request, response);
  }

  // Headメソッドでリクエスト時に呼び出し
  @Override
  protected void doHead(){}

  // Putメソッドでリクエスト時に呼び出し
  @Override
  protected void doPut(){}

  // Deleteメソッドでリクエスト時に呼び出し
  @Override
  protected void doDelete(){}
}
```


>参考
https://employment.en-japan.com/tenshoku-daijiten/14901/
JSPとServletについてよくまとまっています↓
http://cartman0.hatenablog.com/entry/2015/12/01/205220
シリアライズIDってよく見るけど何なの？という疑問には↓
http://java-study.blog.jp/archives/1021151333.html
CentOSで"Peer's Certificate issuer is not recognized"が発生したときの対処

## 結論

`ca-certificates.noarch`パッケージを再インストールする。

## エラーメッセージ

```
[Errno 14] curl#60 - "Peer's Certificate issuer is not recognized."
Trying other mirror.
It was impossible to connect to the CentOS servers.
This could mean a connectivity issue in your environment, such as the requirement to configure a proxy,
or a transparent proxy that tampers with TLS security, or an incorrect system clock.
You can try to solve this issue by using the instructions on https://wiki.centos.org/yum-errors
If above article doesn't help to resolve this issue please use https://bugs.centos.org/.
```

## 対処

```
yum --disablerepo=epel --disablerepo=nodesource --disablerepo=pgdg96 --disablerepo=yarn reinstall ca-certificates.noarch
```
SourceTreeでBitbucketの複数アカウントを切り替えて使う

タイトルそのまんまですが、Bitbucket上に複数のアカウントを持っていて、それをSourceTree上で同時に管理する方法がなかなか見つからなかったので、備忘録兼ねてメモ。

結論としては、

- **メインとなるアカウントをSSH接続で登録**
- **サブアカウントはHTTPS接続で登録**

・・・で行けました。

![capture.png](https://qiita-image-store.s3.amazonaws.com/0/75864/10fd14ca-cd42-d2fb-dca3-76f1b395510c.png)

あんまり根本的な解決方法じゃない（できればどちらもSSH接続でいきたい）ですが、WEB上で見つけた数々の複数アカウント切り替え方法が自分の環境上ではうまくいかなかったので、自分の中では当面こちらを採用。
FuellPHPのインストール

#**FuellPHPとは**
Webアプリケーションのフレームワーク。
FuellPHPを使うには、PHPが実行できるサーバーが必要。

[公式インストール手順](http://fuelphp.jp/docs/1.9/installation/instructions.html#/command)



#**FuellPHPのインストール**
まずは、oilコマンドを使えるようにする。

```sh:クイックインストーラ
$ curl https://get.fuelphp.com/oil | sh
```



#**FuellPHPを表示させる**
oilコマンドが使えるようになったので、プロジェクトを作ってみよう！

```sh:プロジェクト作成
$ oil create <project_name>
```
###**エラーが出る場合**
```sh:エラー
[RuntimeException]
  Failed to clone https://github.com/fuel/fuel.git via https, ssh protocols, aborting.

  - https://github.com/fuel/fuel.git
    Cloning into '<project_name>'...
    fatal: unable to access 'https://github.com/fuel/fuel.git/': Peer reports incompatible or unsupported protocol version.

  - git@github.com:fuel/fuel.git
    Cloning into '<project_name>'...
    Permission denied (publickey).
    fatal: Could not read from remote repository.

    Please make sure you have the correct access rights
    and the repository exists.
```
zip・unzip・gitをインストールすれば解決した...

```sh:上記のプログラムをインストール
$ yum install -y zip unzip git
```

#**FuellPHPのWelcome!ページ**
ブラウザで**localhost/\<project_name>/public**にアクセスするとWelcome!ページが出てくる。

もしこのようなエラーが出てくる場合は...

```text:エラーメッセージ
Fuel\Core\FuelException [ Error ]:
Unable to create the log file. The configured log path 
"/<project_name>/fuel/app/logs/" does not exist.
```
```fuell/app/``` に ```logs```フォルダがないか、パーミッションがおかしいので変更をする。

```text:例
chmod 777 logs
```


#**プロジェクトを作るに当たって**
fuelPHPはセキュリティの観念から公開ディレクトリに配置しないようにする。
ドキュメントルートを **\<project_name>/public** に変更する

#おすすめ記事
[FuelPHP フレームワークをインストール](https://cloudear.jp/blog/?p=354)
draw.ioを使ってドラクエの戦闘のフローチャートを作ってみた。

# はじめに
フローチャートの書き方の**勉強がてら**、
draw.io(https://www.draw.io) を使ってフローチャートを作ってみました。

間違っている箇所があった場合、コメントを頂けると助かります。

# 作ったフローチャート
ドラクエの戦闘のフローチャートを作ってみました。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/a43810c3-bca8-350c-4033-dd701368c991.png">

# 図の解説
## 開始・終了
丸が付いた長方形はフローの開始・終了を表します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/89a96a1b-ca89-0eb7-7de9-668475097a4b.png)

## 入力
平行四辺形は入力を表します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/7aa7b4e3-1011-f212-e6b5-37e2eaf26b07.png)

## 処理
長方形は処理の実行を表します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/d53e5af6-70a6-cf0b-a090-0c85af30b364.png)

## 判断
ひし形は判断を表します。

if文
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/ee1566fa-e323-1c84-30a1-334f7e3b5234.png)

switch文
![image.png](https://qiita-image-store.s3.amazonaws.com/0/44288/ba8cf843-cde7-b4ad-d398-8f9718f05f98.png)

# draw.ioの感想
・使いやすい
・分かりやすい
マインクラフト MakeCodeを使ったずるい方法で採掘やってみた

# MakeCodeついて

Microsoftから提供されているマインクラフト内でプログラミングができるツール。
導入は[こちら](https://qiita.com/HyunwookPark/items/f1ec5c7a51b38e89bcaa)。

# マイニング

今回は実用的な？機能を作って動かしてみた。
diggerというサンプルプログラムはすべてを空気に換えるというものだが、
マイニングのとき邪魔な石や丸石・砂・土などをガラスに変換するプログラムを作ってみた。
空気にすると何かと落ちて来たり道自体が消えてしまうので、
自分がどこにいるのかわかりづらかった。

そこで以下のものをガラスに変換することにした。
* 石
* 丸石
* 岩盤
* 土
* 砂利
* 花崗岩
* 安山岩
* 閃緑岩

**※置きかえの範囲を広くし過ぎると反応しなくなるのでほどほどに**
![digger01.png](https://qiita-image-store.s3.amazonaws.com/0/224453/fbd1f6c5-1041-d424-5a40-4cc35a805e0d.png)

歩くたびに周りがガラスになっていって、
金・ダイヤ・レッドストーンなどほしいものは残って丸見えに！

![digger02.png](https://qiita-image-store.s3.amazonaws.com/0/224453/3936db95-86b9-1000-21be-847cdd5cf50e.png)
![digger03.png](https://qiita-image-store.s3.amazonaws.com/0/224453/e027c234-7b40-924b-ddfa-b16f7e8633d8.png)


溶岩も見えるので掘ってみてびっくりということがない！

# 注意

* ネタバレになるので掘削の楽しみがなくなる
* 広範囲にガラスにしているとやっぱり道に迷ってしまう
key入力に応じて配列に格納したshellコマンドを実行するスクリプト(2018/06/11追記)

# 目的

毎週手動で動作確認しているテストケースの中にadbコマンドを叩いて確認するものがある。作業手順としては、

1. Androidデバイス(動作確認対象となるアプリインストール済み)をMacにUSB接続する
2. テスト用コマンド(`adb shell ~ `)をテスト仕様書からコピーする
3. Terminalにテスト用コマンドをペーストする
4. Androidデバイス側の挙動を目視で確認する

というものだが、テスト用コマンドは増減することはあっても変更になることはそうそうないので、

1. AndroidデバイスをMacにUSB接続する
2. **Terminalでshellを実行しコマンドIDを入力する**
3. Androidデバイス側の挙動を目視で確認する

くらいシンプルに作業できるようにしたい。実現することで、

- 煩雑なコピペが不要になる
- コピペミスが生じなくなる

というメリットがある。

# 要件

- コマンドIDはテスト仕様書に準ずる(0スタートではない)
- このスクリプトを書くために工数を使いたくないのでやっつけでいい
- 今のところ自分しか使わない
- adbコマンド実行に必要なPATHはあらかじめ通しておく

# 実装・実行

## 実装

```bash
#!/bin/bash

# 配列宣言
arr_command=()

# keyを指定してadbコマンドを配列に格納
arr_command["1"]="adb shell am broadcast -a jp.co.example.XXX"

# コマンドがいくつ格納されているか表示
echo "there are ${#arr_command[@]} commands"

# なぜ対話型にしたのか思い出せない
while :
do
  echo "input command No."
  read key
  echo "run command No.${key}"
  echo `${arr_command[${key}]}`
  break
done
```

文字列として配列に格納したshellコマンドは`echo`するときにあの……フランス語の記号のアクサングラーヴみたいなやつ……で括ると実行できる。

## 実行

```terminal
$ sh test_adb.sh
there are 12 commands
input command No.
```

`key`と入力すると`arr_command["key"]`のコマンドが実行されレスポンスが返る。

```terminal
1
run command No.1
 Broadcast completed: result=XXXX }
```

配列にない値を入力した場合はそのままスクリプトが終了する。

# 拡張

## 配列もっときれいに指定できないのか問題

shellスクリプトをちゃんと書いたことがないので存じ上げないんだけどJSONみたいにkey:valueで一括指定できないんだろうか？

ℹ️ [bash 配列まとめ - Qiita](https://qiita.com/b4b4r07/items/e56a8e3471fb45df2f59)

## 実行コマンドを外出しにできないのか問題

上でJSONって言ったけど本当はnodeでfs使って外出しにしたかった。作業時間が見合わなかったのでしなかった。いつかします。

## 対話型にする必要ないよね問題

さっき実際に使ってみて思ったんだけどこれ

```terminal
$ sh test_adb.sh id
```

で実行できてほしい。実行ファイルパス以降にパラメータがあった場合コマンドIDとみなしてそのまま動くようにしたい。

## その他

- デバイスのステータス(Wi-fi/モバイルネットワーク/Bluetooth接続の有無とかGPSの有効・無効)を取って吐くようにするとちょっと便利かもしれない
- ステータスチェックもしてくれるともっと便利かもしれない
- 期待値もTerminal上で表示されると楽かもしれない

# 2018/06/11追記

## 対話型にした

> `$ sh test_adb.sh id`で実行できてほしい

って書いたけどやっぱり対話型にしたほうが楽じゃない？と思って対話型にした。動作確認自体はAndroidデバイス上でするので。

```bash
#!/bin/bash

arr_command=()

arr_command["1"]="adb shell am broadcast -a jp.co.example.XXX"

echo "there are ${#arr_command[@]} commands"

while :
do
  echo "input command No."
  read key
  # 数字のみの文字列の場合はコマンドを実行、それ以外は終了
  if [[ ${key} =~ [0-9]+ ]]; then
    echo "run command No.${key}"
    echo `${arr_command[${key}]}`
  else
    echo "exit."
    break
  fi
done
```
こんな↓感じになりました。

```terminal
$ sh test_adb.sh
input command No.
1
run command No.1
 Broadcast completed: result=XXXX }
input command No.
a
exit.
```
jQuery 楽に書くための基本的な工夫まとめ

こんにちは。
プログラミングをするうえでjQueryに触れることがある方は多いと思います。そこで今回はjQueryを楽に、綺麗に書くためにできる、基本的な工夫をまとめます。

# メソッドチェーン

jQueryを書く時に、一つの場所に対して複数の効果を出したいことがあると思います。その時に一つ一つコードを書くのは面倒ではないでしょうか。そんな時に役立つのがメソッドチェーンです。
ピリオドを打つことで複数の効果を書くことができます。

例えば、```<p>Udon</p>```の色を赤色にしつつゆっくり消したいのであればこのように書くことができます。
```$('p').css('color','red').fadeOut('slow');```

# 複数の場所にまとめて効果を与える
「子要素の```<div></div>```に同じ効果を与えたい。」このように、子要素の同じセレクターなどに対して同じ効果を一気に与える方法があります。「どんな効果を与えるか」の直前に```find```を使えば実現可能です。

例えば```<p id="greeting">あいさつ</p>```の中に子要素、```<div>よろしくお願いします</div>```や```<div>どうぞお見知りおきください</div>```があるとします。
```$('#greeting').find('div').css('color','green');```とすれば、「よろしくお願いします」と「どうぞお見知りおきください」両方を緑色で表示することができます。

なお、```find```では子要素を指定することに注意してください。

# 同じタグのものの中でも特定のものだけに効果を与える

もしかすると同じタグを持つ子要素の中でも一つ下の要素にしか効果を与えたくない場合があるかもしれません。そんな時に使うといいのが```children```です。

こんなコードを用意してみました。

![index.html.png](https://qiita-image-store.s3.amazonaws.com/0/240709/1cd3654f-4f39-d38f-b9f3-d1a066478a3a.png)


「日本のジェスチャー」、「カナダのジェスチャー」、「イギリスのジェスチャー」をふわっと消すとしましょう。
その時に```find```を使うと「同じ国の中で差はあるの？」にまで効果が適用されてしまいます。
そこで```children```が使えます。```find```と同じようにコードを書けばOKです。

![index.js.png](https://qiita-image-store.s3.amazonaws.com/0/240709/0b297f91-7cd0-fb07-06f2-95dcba60cdf0.png)

ここでは、```<h1></h1>```のすぐ下の、子要素は「日本のジェスチャー」、「カナダのジェスチャー」、「イギリスのジェスチャー」です。
そのため「同じ国の中で差はあるの？」には効果が適用されません。

# まとめ

以上、楽に書くための基本的な工夫についてご紹介しました。
ご参考になればと思います。
Kitematicを作ってWindows端末にMySQL + phpMyAdmin環境を構築する

# 何これ
Kitematicを使い全てGUIでMySQLとphpMyAdminを入れるためのメモ

# 前提条件
Hyper-V上で導入をするのでWindowsのエディション
がHomeの場合は別途VMWare等を入れる必要がある
けれど正直Hyper-VだけでもProにする価値はある。値段を理由にHomeにしているのであれば迷わずProにすべし。自己投資の価値はある。

# やること

1. docker for windows をいれる
2. kitematicをいれる
3. mysqlをいれる
4. phpMyAdminをいれる

# docker for windowsをいれる

[ここ](https://store.docker.com/editions/community/docker-ce-desktop-windows)からダウンロードする。基本的にはポチポチ押していくだけで全てが完了する。
Hyper-Vを有効にしていない人は、インストーラの最後Hyper-VをEnableにできる

# kitematicをいれる

docker for windowsを入れるとタスクトレイにDockerアイコンができるので右クリックする。メニューにKitematicというのがあるのでクリックする。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/35278/b2eb5add-e61c-f637-96bf-92fcb35ef975.png)

すると下記のような画面があらわれるので`Download`をクリック

![2018-05-01.png](https://qiita-image-store.s3.amazonaws.com/0/35278/90e050da-4485-d0ef-7742-c4085a821fbe.png)

ダウンロードしたファイルを上記画面にある通り`C:\Program Files\Docker\Kitematic`に展開する
ダウンロード及び正しい場所に展開が完了したらもう一度Kitematicをタスクトレイから起動するとKitematicが立ち上がる

# MySQLをいれる

Kitematicの上部にある`Search for Docker images from Docker Hub`と書かれている検索欄に`MySQL`と入れる。
すると公式のDockerイメージが表示されるので`CREATE`を押す。これでインストール完了。凄い。
![mysql.PNG](https://qiita-image-store.s3.amazonaws.com/0/35278/17854ac6-d371-318a-c0a1-9c4bd523b374.png)

インストールが完了したらMySQLを選択して画面右上の`Settings`を開く。`General`にある`Environment Variables`に`MYSQL_ROOT_PASSWORD`を設定してあげる。これがないと立ち上がらないので必ず設定する

![env.PNG](https://qiita-image-store.s3.amazonaws.com/0/35278/e3e4a332-e0d9-2ecc-e6ba-fe898bcb3aec.png)

[他にも色々設定できる](https://hub.docker.com/r/library/mysql)のだけれどここでは割愛。起動時にDB作ったり接続用ユーザ作ったりできるようになる。
Volumesを設定するとDockerを落としてもDBがクリアされなくなるのでオススメ

# phpMyAdminをいれる
MySQLと同じ要領でphpMyAdminの公式を入れる。
phpMyAdminの`Settings`で今度は`Network`を設定する。これはphpMyAdminのコンテナとMySQLのコンテナが別々に存在するため、phpMyAdminからMySQLにうまく接続できない問題を解消するために設定する。
きちんと設定できていると`Select container`の部分に`mysql`がいるはず。`ALIAS`を`db`にしてやって追加をする。これでphpMyAdminが動く。あとはrootに設定したパスワードなりなんなりでログインしてやればOK。ね？簡単でしょ？

![links.PNG](https://qiita-image-store.s3.amazonaws.com/0/35278/08e19737-12fc-05f4-b8c5-d90f6fc6d14c.png)


# まとめ
色々凝ったことをやろうと思うとdocker-composeをサクっと触ったほうが楽だと思う。既存の情報も多いしね。でも脳死状態でGUIでポチポチするだけでこれだけの環境が揃うのはKitematicやべーなと思うよ。もっと情報溢れてくれればいいのにな。
仕事上での問題解決方法まとめ

業務中に問題が発生した時、どういった手順で解決するかの備忘録です。
初投稿なので、問題等ありましたらご指摘お願いします。

#0. まずはじめに
問題が発生した時は、パニックに陥りがちです。
ですので、私は混乱しかけたら、以下の手順に沿って事実を書き並べるようにしています。

#1. 問題の確認
根本的に、問題が発生した時には何が問題なのか理解できていない事が頻発します。
なので、まず問題が何かを確認します。

---
###i. 何が起きたか
問題が発生した時点で何が起きたかを確認します。
ex)プログラムがエラーを出力した、△が出力された、朝起きたら家を出る時間を過ぎていた、etc...

###ii.問題が発生する前はどうだったか
問題が発生する前も何かしらの不具合は抱えながらも実行はできていたことと思います。
その実行結果を確認します。
ex)予定していたレイアウトとは違う画面が出力されていた、○が出力されていた、昨日までは目覚ましが鳴っていた、etc..

###iii.問題は何か
何が問題なのか改めて確認します。
ex)自分の記述したコードに間違いがあった、目覚ましが鳴らなかった、etc...

---

ここまで書き出して、問題を再確認します



#2. 問題の特定
次に、確認した問題に対して情報を集めます。

---
##i. 問題個所の特定
どこに問題の原因があるかを確認します。
プログラムであればエラーコードを確認しますし、実生活であれば発生した原因を確認します。
ex)○行目のコードがエラーを出力している。目覚まし時計の針が進んでいない、etc...

##ii.問題発生理由の確認
なぜその問題が発生したかを確認します。
プログラムなら先ほど確認した特定位置を確認しますし、実生活であれば原因に不備がないかを確認します。
ex)セミコロンが抜けていた、目覚まし時計の電池が切れていた、etc...

---

##iii.仮説を立てる

どこで起きているかは分かったが、ついぞなぜ起きているかがわからない場合があります。
特に、不慣れなフレームワークなどを使っている時などには頻発します。
ex)新しくControllerとViewを足して、それに対してのリンクも貼ったのに、そのページに遷移しようとするとエラーが出力される。

その場合は、目安の時間を切って、仮説を立てます。
ex)ルーティングを行うファイルがどこかにあって、それに追記しなければいけないのにしていないのではないか

そして、私たちの友達であるGoogleに聞きます。
私は15分を目安に調べ、見つからなかったら先達に質問することにしています。


#3. 問題の解決
ここまで調べたら、問題を解決していきます。

---

##i.解決に必要な時間の見積
まず、修正にどのくらいの時間を取られるかを大まかに見積もります。

- たとえば、自分が書き込んだ修正によって、プログラム全体の不具合が見つかったなら、それはもう自分の手に負える工数を超えています。
- たとえば、セミコロンが抜けているだけだったら、それは修正に30秒もいらないでしょう。

##ii.見積の報告
問題は大きくても小さくても対応に時間がとられます。
私の場合は、タスクの終了が1時間以上遅れるような修正作業と、手に負えない問題に関しては、報告を行っています。
とりあえず上長の方に現在どこまで来ていて、どういった問題が発生しているか、またどのくらいで修正できるか、または対応が難しい旨を報告します。
結果、上長の方がその問題に対応しきれると判断したなら、自分でその問題に対応しますし、無理だと判断したなら巻き取ってくださるでしょう。

##iii.問題の解決
見積もりを行った際に目星をつけておいた修正点を修正していきます。
また、見積もりが甘く、修正にさらに時間がとられそうな場合は、上長の方に再度さらに時間がかかりそうな旨をお知らせして、再度指示を仰ぎます


#extra. 問題解決の方法がわからない場合に、質問する場合の注意点
時間を軽く見積もるタイミングで、どこをどう直せばいいかがわからない場合がよくあります。
この場合は上長の方にわからないので教えてくださいと質問をすることになります。
その場合は以下の点に気を付けて質問を行うようにしています。

###1. 何についての質問なのかを整理する
問題の確認を行ったタイミングの内容を再度確認します。
上長の方は忙しいので、突然質問が飛んできても何の内容かわからないと思います。
ですので、現在対応中のタスクがわかるように質問を行います。
チケットが発行されているなら、その番号やURLを書くなどするようにしています。

###2. 仮説と、その仮説の結果をまとめる
わからないことが起きた時、仮説を立てたと思いますが、質問をするということは仮説は間違っていることでしょう。
ただ、どういうアプローチを行ったかは上長の方に伝える必要があるかと思います。
ですので、どういった手順で何について調べたかを確認し、まとめます。
「○○であるだろうと仮説を立て、その仮説に沿って調査を行いました。結果××であることがわかり、仮説は間違っていました。」と言った感じです。

#最後に
個人的な問題解決の手順をまとめてみました。
この手順が絶対に正しいわけではないとは思いますが、ご指摘などありましたら書き込んでいただけると幸いです。
最後までお読みいただきありがとうございました。
[React Native] 学習記録

ここにReact Nativeやそれに付随するところで新たに学習したことやTipsを記録していこうと思います。
結構、初歩的なところも書いたりしていますがご了承のほどよろしくお願い致します。
また記述が間違えていたり、アドバイスなどございましたらご指摘いただけると幸いです。

**2018/5/1**

**import構文について**

ES6(ECMAScript6）で策定された構文
[ここをチェック](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/import)

**メモ**

React NativeはECMAScript2015を率先して使用している、もしECMAScript2015について学習したいなら、[ここをチェック](https://babeljs.io/learn-es2015/)

React Native公式ページから引用（[ページへ](https://facebook.github.io/react-native/docs/tutorial.html#what-s-going-on-here)）
***
The other unusual thing in this code example is <Text>Hello world!</Text>. This is JSX - a syntax for embedding XML within JavaScript. Many frameworks use a special templating language which lets you embed code inside markup language. In React, this is reversed. JSX lets you write your markup language inside code. It looks like HTML on the web, except instead of web things like <div> or <span>, you use React components. In this case, <Text> is a built-in component that just displays some text.
***

> このコード例の他の珍しいものは、<Text> Hello world！</ Text>です。 JSX  -  JavaScript内にXMLを埋め込むための構文です。多くのフレームワークでは特別なテンプレート言語を使用しています。この言語を使用すると、マークアップ言語内にコードを埋め込むことができます。リアクションでは、これは逆です。 JSXでは、コード内にマークアップ言語を記述できます。 <div>や<span>のようなWebの代わりに、Reactコンポーネントを使用する以外は、Web上のHTMLのように見えます。この場合、<Text>はテキストだけを表示するビルトインコンポーネントです。
Amazon SumerianでEC2を起動してくれるおじさんを作る

Amazon Sumerianのプレビュー版を触ってみての雑記です。

## Sumerianとは

Unityのような何かという印象を受けました。
特徴としては、
・すべての操作がブラウザ上で可能
・他のAWSサービスとの連携
になるかと思います。
Lex,Lambdaと連携して音声入力でEC2を起動してくれるシーンを作成したので、
おおまかな手順を記します。

## 構築手順

基本的にはSumerianのチュートリアルを参考に作成しました。
https://docs.sumerian.amazonaws.com/tutorials/create/beginner/dialogue-component/
チュートリアルに記載されているもの以外に必要な手順のみを説明します。

###1.Lambdaを作成する
Node.js 6.10で作成します。

```javascript:index.js
'use strict';

const INSTANCE_ID = 'x-xxxxxxxxxxxxxxxxx';

var AWS = require('aws-sdk'); 
AWS.config.region = 'eu-west-1';
 
function ec2Start(cb){
    var ec2 = new AWS.EC2();
    var params = {
        InstanceIds: [
            INSTANCE_ID
        ]
    };
  
    ec2.startInstances(params, function(err, data) {
        if (!!err) {
            console.log(err, err.stack);
        } else {
            console.log(data);
            cb();
        }
    });
}
exports.handler = function(event, context, callback) {
    //EC2インスタンスを起動する
    console.log('start');
    ec2Start(function() {
        context.done(null, 'Started Instance');
    });
    //メッセージを返す
    var message = 'Server Start!';
    var response = {
        sessionAttributes: event.sessionAttributes,
        dialogAction: {
            type: 'Close',
            fulfillmentState: 'Fulfilled',
            message: {
                contentType: 'PlainText',
                content: message
            }
        }
    };
    callback(null, response);
};

```

###2.LexとLambdaを連携する
※チュートリアルではBookTripで作成していますが、
　今回はCustom botで作成してください。

Lexを作成したらIntentsとSample utterancesを作成します。
その後、Fulfillmentで「AWS Lambda function」にチェックを入れ、
Lambda functionは先ほど作成したLambdaの名前を選択します。
ビルドした後、TestBotでLambdaが正常に働く事を確認します。

###3.作成したSumerianからLambdaが働く事を確認する
完成したらチュートリアルのチャットボットテストと同じように話しかけます。
返答とEC2の起動が確認できれば成功です。

## まとめ
Sumerianを1週間程度触ってみての所感です。

まず、すべての操作がブラウザ上で完結するというのはローカルの環境を汚すことがないので
良いと思います。しかし、PCのスペックや回線の速度によっては快適な動作は損なわれてしまいます。
回線が込み合う状況では実行するのに数分待たされることもあり、エディターとしてはいまいちな印象を受けました。

他のAWSサービスとの連携しやすさは素晴らしいと思います。
今回はEC2の起動を試しましたが、おそらくLambdaで書ける処理であれば、なんでもできるのではないかと思います。

Sumerian単体ではUnityで良いのではという印象ですが、
他のAWSサービスと連携して何かサービスを考えるのが楽しいと思います。
[AWS][CloudFront] 既存の CloudFront をまとめて IPv6 Enabled に変更する

aws-cli でやるなら、こんな感じ

```bash:update-distribution.sh
#!/bin/bash
DIST_IDS=$(aws cloudfront list-distributions | jq -r '.DistributionList.Items[] | select(.IsIPV6Enabled == false) | .Id')
for DIST_ID in ${DIST_IDS}; do
    ETAG=$(aws cloudfront get-distribution --id ${DIST_ID} | jq -r '.ETag')
    CONFIG_JSON=$(mktemp)
    jq -s '.[0] * .[1]' <(aws cloudfront get-distribution --id "${DIST_ID}" | jq '.Distribution.DistributionConfig') <(echo '{"IsIPV6Enabled": true}') > ${CONFIG_JSON}
    aws cloudfront update-distribution --id ${DIST_ID} --distribution-config file://${CONFIG_JSON} --if-match ${ETAG}
    rm -f ${CONFIG_JSON}
done
```
Macbook Pro 事始め備忘録

## 目的

Macbook Proを購入した際の環境構築のための手順を記載します。

- OpenMPIを用いた並列計算
- Fortran, C, C++のコンパイル
- tex環境の構築

が可能になります。

## 備忘録

### `.bashrc`の作成

```bash
# ~/.bashrc
  
export EVENT_NOKQUEUE=1

PS1="[\u:\W]$"
```

### `.bash_profile`の作成

```bash
# ~/.bash_profile
  
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

export PATH=$PATH:/usr/local/bin
```

### アプリのインストール

- Chrome
- Paraview
- Sublime text 3
- Ricty diminished
- Skim
- Sizeup

### Sublime text 3の設定

- installパッケージをGithubからインストール
    - Flatland
    - ConvertToUTF-8
    - japanize
    - minimalFortran
    - rsub
    - LatexTools
    - OmniMarkupPreviewer
- Browse Packages/Userに自身でfixしたテーマをコピー

User Prefernceは以下のように設定する。

```
{
  "color_scheme": "Packages/User/Flatland Dark.tmTheme",
  "default_encoding": "UTF-8",
  "default_line_ending": "unix",
  "draw_white_space": "all",
  "fallback_encoding": "UTF-8",
  "file_exclude_patterns":
  [
    "*.mod",
    "*.pyc",
    "*.pyo",
    "*.exe",
    "*.dll",
    "*.obj",
    "*.o",
    "*.a",
    "*.lib",
    "*.so",
    "*.dylib",
    "*.ncb",
    "*.sdf",
    "*.suo",
    "*.pdb",
    "*.idb",
    ".DS_Store",
    "*.class",
    "*.psd",
    "*.db",
    "*.sublime-workspace"
  ],
  "find_selected_text": true,
  "flatland_square_tabs": true,
  "font_face": "Ricty Diminished",
  "font_options":
  [
    "no_bold"
  ],
  "font_size": 13,
  "highlight_line": true,
  "ignored_packages":
  [
    "Objective-C",
    "Vintage"
  ],
  "open_files_in_new_window": false,
  "show_encoding": true,
  "show_full_path": true,
  "tab_size": 2,
  "theme": "Flatland Dark.sublime-theme",
  "translate_tabs_to_spaces": false,
  "trim_trailing_white_space_on_save": true,
  "word_wrap": true
}
```
Preferences > Package Settings >　LaTeX Tools　> Setting User の
`"builder_settings" : {}`の中に、以下を加筆する。

```
"command" : ["latexmk", "-cd",
  "-e", "$latex = 'platex %O -interaction=nonstopmode -synctex=1 %S'",
  "-e", "$biber = 'biber %O --bblencoding=utf8 -u -U --output_safechars %B'",
  "-e", "$bibtex = 'upbibtex %O %B'",
  "-e", "$makeindex = 'upmendex %O -o %D %S'",
  "-e", "$dvipdf = 'dvipdfmx %O -o %D %S'",
  "-f", "-%E", "-norc", "-gg", "-pdfdvi"],
```

### Homebrewによるインストール

はじめに、[https://brew.sh/index_ja](https://brew.sh/index_ja)からHomebrewのインストールを行う。

```
brew install gcc
brew install cmake
brew install gnuplot
brew install open-mpi
```

### BasicTeXのインストール

以下のbrewコマンドでインストールする。

```
brew install ghostscript
brew install gnupg2
brew tap caskroom/cask
brew cask install basictex
```

インストール後は、以下のコマンドで、tex環境を構築する。

```
sudo tlmgr update --self --all
sudo tlmgr install collection-langjapanese
sudo tlmgr install txfonts algorithms helvetic latexmk
sudo tlmgr install latexmk framed enumitem here
cd /usr/local/texlive/2018basic/texmf-dist/scripts/cjk-gs-integrate
sudo ./cjk-gs-integrate.pl --link-texmf --force
sudo mktexlsr
sudo fmtutil --all
kanji-config-updmap -sys ipaex
```

以下のコマンドを利用し、フォントの環境を確認する。
フォントが埋め込まれていない場合には、`CURRENT family : noEmbed`と帰ってくる。

```
kanji-config-updmap status
```

Tex 環境を更新した場合に、ビルドができない場合がある。このときはコマンドラインから `open -a "Sublime Text"` コマンドを実行して sublime text を立ち上げると、アプリ側の環境変数が更新され、ビルド可能になる。
【質問】バーコードスキャンするアプリをcordovaで作成する方法をご存じないですか？

現在、cordovaを用いてJANコード（いわゆるバーコード）を読み込むアプリの制作を行おうとしています。
しかし、ネットで資料を検索してもサンプルとして使えそうなソースが見つからず
ionicやmonacaを用いたものばかり見つかります。
一応、cordovaのアプリと書かれたものもありましたが、うまく起動しませんでした（下記リンク先）。

よい解決方法をご存知の方がいらっしゃれば、ご協力をお願いいたします。


・参考にしたサイト
バーコードのスキャン
→https://www.kmrweb.net/mobile/barcode.html
koto を TITAN V でソロマイニングする(29.4 kH/s @ 115W)

漢なら koto をソロマイニングしたいですね!

**優秀な koto マイナー若人さま**から, koto は 20 kH/s くらいならソロマイニングもできる(2018 年 4 月 30 日時点)という有益な情報をいただきました. 

ソロマイニングやりましょう!

<img width="500" alt="Screen Shot 2018-05-01 at 17.19.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/36275/0a0238e9-e8a9-5a78-e249-2767e5ab9c9e.png">


## セットアップ.

koto をコンパイルし, kotod を動かします.

国産仮想通貨KOTOの作業メモ
https://qiita.com/bohemian916/items/75abd51930b5b5f0d48e

を参考に kotod をセットアップしておきます.

それなりにディスク容量を消費します. 100 GB くらいのディスク容量を確保しておくとよいでしょう.

## マイニング

20 kH/s 以上出るのが期待できそうな TITAN V でソロマイニングしてみます.

TITAN V で BitZeny(Yescryptr8) をマイニングする(34.0 kH/s @ 150W)
https://qiita.com/syoyo/items/0c6db4ec0eb230dddc09

国産暗号通貨 コト　3koto目
http://askmona.org/8590

を参考に, kotod の動いているマシン(今回は GPU マイニングと kotod を同じマシンで動作させたので localhost)に繋ぐことにします.

https://bitcointalk.org/index.php?topic=521563.0

を参考に, koto.conf で server モードにします

```
rpcuser=RPCUSER
rpcpassword=RPCPASS
server=1
listen=1
daemon=1
gen=0
```

`daemon=1` はデーモンモードで動作させます. console にステータスを表示したいのであれば 0 に設定しましょう.

`gen=1` でも動作する... かも?(このあたり bitcoin core のソフトの挙動きちんと調べたい)

kotod を起動し, その後 miner を動かします.

```
$ ./minerd -a yescrypt --userpass=$(RPCUSER):$(RPCPASS) -o localhost:8432 
```

最近(気温 25 度)だとリファレンスファンだと 150W だと GPU 温度が 80 度を超えてしまうので, 75 度程度に抑えるために 115W にしました. 115 W にパワーリミットで 29.4 kH/s くらいでました.

## マイニングの成果

すぐには反映されないので, きちんとマイニングが動いているのか不安になりますが,
１日くらい放置していたら 2 block(200 koto) 採掘できました(2018 年 5 月 1 日時点). 
ありがとうございます. 

## TODO

* nomp 系プールソフトを使って, 複数の PC のマイニングをまとめる.
* ソロマイニングで得た koto の課税を考える(ブロックチェーンに直接記録されるので, pool マイニングに比べて課税計算はしやすそう)
* TITAN V 水冷化を行う
ConstraintLayoutを理解する前に・・・

# はじめに
いつからか、Android Studioでレイアウトのルートタグのデフォルトが、RelativeLayoutからConstraintLayoutに変更されていました。
ConstraintLayoutを軽く調べてみたら、設定可能な属性が多すぎて一回では説明しきれないので、数回に分けて説明していくことに決めました。
この記事では、ConstraintLayoutで設定できる種類とその概要のみについて説明します。そして、以降の記事で詳細な説明をして行く予定です。


# ConstraintLayoutとは・・・
下記の公式サイトを見ると。
「ConstraintLayoutとはViewGroupの一種で、Viewのサイズや位置を柔軟に設定できる」だそうです。
↑少し意訳はいってます。

https://developer.android.com/reference/android/support/constraint/ConstraintLayout.html

# 種類と概要
下記は今後、説明していく種類です。
ConsraintLayoutを使用するために最低限必要となる種類を選定しました。
一部説明しない種類もあります。それは、各自で調べてください。

|種類|概要|記事|
|:---|:---|:---|
|Relative positioning|相対位置<br>Viewを配置するときに設定する項目です。イメージとしてはRelativeLayoutが近いです。|[ConstraintLayoutのRelative positioningの基本](https://qiita.com/naoi/items/79416483cce89c058a95)|
|Margins|マージン<br>言葉のままですが、隣接するViewとのマージン（間隔）を設定する項目です。|[ConstraintLayoutのMarginsの基本](https://qiita.com/naoi/items/8fb5e565342c3d642411)|
|Centering positioning and bias|中央揃えと微調整<br>中央揃えを設定する項目です。更に、中央揃えしたときに少しだけ右や左微調整する項目も存在します。|[ConstraintLayoutのCenteringとbiasの基本](https://qiita.com/naoi/items/5149e5e46a99f1295287)|
|Circular positioning|円形配置<br>隣接するViewを半径〇〇の距離で角度◯度に配置する設定項目です。|[Circular positioningで更に柔軟な配置](https://qiita.com/naoi/items/373bc0d90d080072ab9b)|
|Dimension constraints|横幅・縦幅の指定<br>layout_widthやlayout_heightなどの指定する項目です。|-|

下記は残念ながら説明しない種類です。
興味ある方は自身で調べてください。

* Visibility behavior
* Chains
* Virtual Helpers objects
* Optimizer

# おわりに
各種類の記事が完成したら、記事のリンクを「種類と概要」に追記していきます。
C#に動的型付けを導入する

# 動機
C#は静的型付け！！
なんだけど、型を定義するのがたまに面倒。
私、javascriptなんかも書くことがありますので、any型に親しみすぎてきつい。

# 対策
C#に動的型付けを導入する。

# 方法
DynamicObjectクラスとDictionaryクラスのdynamicコンボを使う。

## コード
以下、簡略化したソースコード。
下記のクラスのインスタンス生成時にdynamicで変数を定義するのがポイント。

```csharp
using System.Collections.Generic;
using System.Dynamic;

namespace Library
{
    public class ArgsObject : DynamicObject
    {
        private Dictionary<string, object> dictionary;

        public ArgsObject()
        {
            this.dictionary = new Dictionary<string, object>();
        }

        // プロパティに値を設定しようとしたときに呼ばれる
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            this.dictionary[binder.Name] = value;
            return true;
        }

        // プロパティから値を取得しようとしたときに呼ばれる
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = this.dictionary[binder.Name];
            return true;
        }

        public bool ContainsKey(string key)
        {
            return this.dictionary.ContainsKey(key);
        }
    }
}
```

## 使用例

```csharp
namespace Usage{
    public class UseDyanamic {
        public void a() {
            // ここでdynamicを使用することが大事
            dynamic args = new ArgsObject();
            args.AAA = "aaa";
            args.BBB = 1;
        }
    }
}
```

# 結論
超快適！！
ダックタイピング大好きです！！

**※ご使用時にはかなりの注意が必要です。ご使用の際は、ご自身の判断のもとお願いいたします。また、try-catchなどはここでは記載しておりません。ご自身の判断で追加してください。**

# 参考URL
公式で似たようなことしている。
https://code.msdn.microsoft.com/windowsdesktop/30-DynamicObject-dynamic-8d1ff1e4

Qiitaにも似たような記事があった。
https://qiita.com/NetSeed/items/0210cfe514b1bb24d651
【質問】instascanのプレビュー画面を反転させる方法をご存じないですか？

Instascanを用いて、cordovaでQRスキャンのハイブリッドアプリを制作しております。
その際、スキャンを行うカメラのプレビューに鏡像反転されたものが表示されてしまうのですが
これを反転されていない画像に修正する方法をご存じないでしょうか？

当初はスマホのバックカメラを使用して、プレビューの反転したものが表示される仕組みとなっておりました。

これでは問題があるとなり、参考サイトを元にscaleXを変更する形でjsファイルに変更を行いました。
すると今度は、表示は希望通りに反転のないものが表示されたのですが
スマホのフロントカメラで取得した画像が表示されるようになってしまいました。

よい解決方法をご存知の方がいらっしゃれば、ご協力をお願いいたします。


```使用しているjsファイル
Instascan.Camera.getCameras()
      .then(function (cameras) {
          if (cameras.length > 0) {
              //カメラのデバイス情報を指定して読み取りを開始する
              scanner.start( cameras[1] );
          }
          else {
              console.error('カメラが見つかりません！');
          }
      })
```

・参考サイト
PCカメラが「QRコードリーダー」に大変身！JavaScriptで簡単に開発できる「Instascan」を使ってみた！
→https://paiza.hatenablog.com/entry/2017/08/17/PC%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%8C%E3%80%8CQR%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%80%8D%E3%81%AB%E5%A4%A7%E5%A4%89%E8%BA%AB%EF%BC%81JavaScript%E3%81%A7%E7%B0%A1%E5%8D%98

カメラを使ってみよう ーWebRTC入門2016
→https://html5experts.jp/mganeko/19728/

フロントカメラで撮影した場合、画像が左右反転してしまう問題
→https://ja.stackoverflow.com/questions/23223/%E3%83%95%E3%83%AD%E3%83%B3%E3%83%88%E3%82%AB%E3%83%A1%E3%83%A9%E3%81%A7%E6%92%AE%E5%BD%B1%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88-%E7%94%BB%E5%83%8F%E3%81%8C%E5%B7%A6%E5%8F%B3%E5%8F%8D%E8%BB%A2%E3%81%97%E3%81%A6%E3%81%97%E3%81%BE%E3%81%86%E5%95%8F%E9%A1%8C
Powershell動詞の解説

> Powershell動詞別コマンドランキング https://qiita.com/Marimoiro/items/f094fad9a26f06a8cf52
>> powershellのコマンドは「Get-Content」のように動詞(的な何か)-目的語のような形式になっています。
> さらにGet-Verbというコマンドで頭に使える動詞一覧が出てきます。

Get-Verbコマンド一覧を見ても、どんなタイミングで使うべきか迷うことがある。
MSDNで動詞の解説したサイトがある。これを参照すべし。

Approved Verbs for Windows PowerShell Commands
https://msdn.microsoft.com/en-us/library/ms714428(v=vs.85).aspx

似てる動詞の使い分け

- New vs. Set
Newは新しく作るとき（既存なし）、Setは既存あれば上書き、既存なければ作成

- Find vs. Search
Findは1個の参照、Searchは複数の参照

- Get vs. Read
Getはファイルの取得、Readは中身を見る

- Invoke vs. Start
Invokeは逐次での開始、Startは並列での開始

- Ping vs. Test
とりあえずTest使っとけ。
（と原文には書いてあるが日本人にはTestが別の意味に誤解されるので業務システムでは使いにくい。。。）
ESP32(ESP-WROOM-32)でMilkcocoaSDKを使う

ESP32でMilkcocoaを使った例がなかったのでメモ

皆さんどうも。お久しぶりです。306です。大学生というモラトリアム期間も終わり、~~社畜になりました~~。

さて、弊社では事業でIoTやっていないのですが個人で勝手にやっています。

今回はESP32を入手したので、これにMilkcocoaを乗っけて遊ぼうと思ったんですが、ESP02の例は多くあるものの、ESP32の例(そもそもSDKがESP32向けに提供されていない)がなかったので、ESP8266のMilkcocoaSDK使ってみようという試みです。
結論から言うと幾つかソースコードとライブラリを変えれば大丈夫でした。
ArduinoIDEでESP32で使えるようにする部分とMilkcocoaSDKを導入する部分は省略します。
ライブラリは`/Users/foo/Documents/Arduino/libraries/Milkcocoa_Arduino_SDK-master/Adafruit_MQTT.cpp`を(パスはMacの場合です。他のOSは知りません。)修正します。

```c
#include "include/Adafruit/Adafruit_MQTT.h"

#if defined(ARDUINO_ARCH_AVR)
#define strncasecmp strncasecmp_P
#define strncpy strncpy_P
#else
//#include "avr/dtostrf.h" //=>ここをコメントアウト
#endif
```


チュートリアルのサンプルを書き換えると以下のようにすれば大丈夫でした。

```c
#include <Milkcocoa.h>
#include <WiFi.h>

#define MILKCOCOA_APP_ID      "hogehoge"
#define MILKCOCOA_SERVERPORT  1883
#define MILKCOCOA_DATASTORE   "esp32"

const char MQTT_SERVER[] PROGMEM    = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] PROGMEM  = __TIME__ MILKCOCOA_APP_ID;

WiFiClient client;
Milkcocoa milkcocoa = Milkcocoa(&client, "milkcocoa_app_id.mlkcca.com", 1883, "milkcocoa_app_id", "mqtt_client_id");

const char* ssid     = "SSID";
const char* password = "WIFI_PASS";

void setup(){
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi network

  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop(){
  // 以下をloopの中で必ず実行します
  milkcocoa.loop();

  // データ格納用のオブジェクトです
  DataElement elem = DataElement();

  // 以下のようにkey, valueを設定していきます。
  elem.setValue("name", "Milk");
  elem.setValue("age", 35);

  // データストア名を指定して、データをpushもしくはsendします
  milkcocoa.push(MILKCOCOA_DATASTORE, &elem);
  // or
  milkcocoa.send(MILKCOCOA_DATASTORE, &elem);
}
```
React Nativeでキーボードを避ける3つの方法



[spencercarli/react\-native\-keyboard\-avoidance\-examples](https://github.com/spencercarli/react-native-keyboard-avoidance-examples)


react-native-keyboard-avoidance-examples



## 隠れる問題

以下のように入力項目がキーボードに隠れてしまいます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/51f9bfa9-75b9-d1d4-3dab-bea8cec93b63.gif" width=200 />


## 3つの方法の比較

左から

* KeyboardAvoidingView (React-Nativeのコアコントロール)
* [Keyboard Aware ScrollView](https://github.com/APSL/react-native-keyboard-aware-scroll-view)
* [Keyboard Aware ScrollView](https://github.com/APSL/react-native-keyboard-aware-scroll-view)の拡張 



<img src="https://qiita-image-store.s3.amazonaws.com/0/49910/40246bdf-9c49-1901-82c1-610ace5c7b8d.gif" width=200 /> <img src="https://qiita-image-store.s3.amazonaws.com/0/49910/c24c2f08-94a8-881f-17a9-929f6a4d3d0f.gif" width=200 /> <img src="https://qiita-image-store.s3.amazonaws.com/0/49910/8820e64d-d432-8ba9-1284-a2ddeebdc7b6.gif" width=200 />





## KeyboardAvoidingView

・ 最も簡単なのは KeyboardAvoidingView
・ Android を対象とする場合、唯一の方法 
・ 上部のイメージがビューから押し出される。

>注意すべき点の1つは、30行目に高さが60pxに設定されたビューが表示される。 
>キーボードがビューを避けることは最後の要素ではうまく動作せず、パディング/マージンの設定がうまくいかないことが分かりました。 だから私は新しい要素を追加して、すべてのピクセルを「バンプ」しました。


|  Ios  |  Android  |
| ---- | ---- |
| <img src="https://qiita-image-store.s3.amazonaws.com/0/49910/40246bdf-9c49-1901-82c1-610ace5c7b8d.gif" width=200 />  |  <img src="https://qiita-image-store.s3.amazonaws.com/0/49910/ae186293-3132-8541-b5ed-c13f90667dba.gif" width=200 /> |
| 縦方向にスタックしすぎた場合、キーボードに隠れることがある | アニメーションしない。 | 


### Android


AndroidManifest.xmlにandroid:windowSoftInputMode="adjustResize"を追加
AndroidManifest.xmlの書き方は→を参照 [Example AndroidManifest.xml](https://gist.github.com/spencercarli/e1b9575c1c8845c2c20b86415dfba3db#file-androidmanifest-xml-L23)



## Keyboard Aware ScrollView

・動きがきれい
・Android では動かないっぽい
 [Android support? · Issue \#2 · APSL/react\-native\-keyboard\-aware\-scroll\-view](https://github.com/APSL/react-native-keyboard-aware-scroll-view/issues/2)


|  Ios  |  Android  |
| ---- | ---- |
|  <img src="https://qiita-image-store.s3.amazonaws.com/0/49910/c24c2f08-94a8-881f-17a9-929f6a4d3d0f.gif" width=200 />   |  <img src="https://qiita-image-store.s3.amazonaws.com/0/49910/ab52ef3d-f936-12d2-a998-02ac521ab62c.png" width=200 />   |


Androidは切れてしまいました。





## [Keyboard Aware ScrollView](https://github.com/APSL/react-native-keyboard-aware-scroll-view)の拡張 

・動きがきれい
・Android では動くっぽい
・サンプル中ではComboとして紹介されてます。


|  Ios  |  Android  |
| ---- | ---- |
| <img src="https://qiita-image-store.s3.amazonaws.com/0/49910/cdc715fb-56f8-1368-564d-2be1b50004b6.gif" width=200 />  |  <img src="https://qiita-image-store.s3.amazonaws.com/0/49910/477d3fd1-6aec-7be0-0925-abc8f571ed2e.png" width=200 /> |
EclipseのJavaとJavaEEの違い

EclipseでNew Projectを作るとき、PackageにJavaとJavaEEがあった。なにそれ。

##JavaSEとは
- **Javaの基本機能を最低限でまとめたもの**
- PC上で動くゲームやソフトを作れる
- VM(仮想マシン)搭載の家電ならアプリ開発もできる
- Java Standard Editionの略
- 旧J2SE( = Java2PlatformStandardEdition)
- 要JDKインストール　

##JavaEEとは
- **JavaSE　＋　サーバサイド（拡張）機能**
- **拡張機能を使ってWebAPI開発ができる**
- Java Enterprise Edition
- 旧J2EE

##JREとは
- Java Runtime Environment
- Javaで作られたアプリを動かす為に必要なソフト
- 開発側・ユーザ側双方に必要

##JDKとは
- Javaでプログラムを組む際に必要な開発キット
- Java SE Development Kit
- JavaSEの開発者に必須（ユーザは不要）
- **JREも含んでいる**
- つまり**JREソフト + アプリ動作ソフト**



>参考
https://www.sejuku.net/blog/12902
Facebookが開催する「F8 2018」に来ています！

## 自己紹介

こんにちは、アーロンです！Qiitaに投稿アップしたことないのですけれども、これから頑張りたいと思います！
あれ？アーロンって外国の人だと思ってるでしょう？正解です！
元々はWashington D.C.から来たんですけれでも、僕は日本に６年間に住んでいて、
今東京のZEALSという会社でエンジニアとして働いていまして主にJavascriptとRubyとPythonを使っています！チャットボットと綺麗なアプリケーションのアーキテクチャーとピザが好きです！

ZEALSはfanpというチャットボットのサービスを提供してますよ！https://fanp.me/

よろしくお願いします！

## Day 0: 4月30日 [前夜祭]

私と社長はFacebookが開催するデベロッパーカンファレンス「F8 2018」に参加するためにシリコンバレーに来ています。 

![F8 2018](https://scontent-atl3-1.xx.fbcdn.net/v/t1.0-9/31578132_1621510297965723_6498243853370261504_o.jpg?_nc_cat=0&oh=e669ea8fa49b63889445dc9ad56e806d&oe=5B56EC06)


F8のコンファレンスの前日でしたから、シリコンバレーの有名なところと観光地を見たりテックの人と交流する日にしようと思っていました。
Pinterestのビルに偶然にF8に参加する人と出会って、今日早めに会場でBadgeを取りに行けるのとF8の前のJoin All Voicesというめっちゃめっちゃエクスクルーシブなイベントがありますよ！と教えてくれました。Badgeを普通に取りに行けると思いましたが、Join All Voicesのイベントのウェブサイトを見てみたらやはり招待限定のやつだとわかりました。このイベントで偉い人しかも世界の色々な国から来た人が多いと思って、どうにか入りたいな〜と思いました！オーガナイザーまで連絡しようとしたんですけど、ダメでした、、

会場でBadgeを取ってから何も期待されずJoin All Voicesのイベントの列に並びました。やはり僕たちがGuest Listに入ってなかったですけど、ブラジル人の偉い人がうまく誘導してくれて、受付の人がなんとなくイベントのGuest Listに入れてくれたんです！僕たちのすぐ後にスタッフに「Guest Listに入ってない人を入らないで」と言われました。ギリギリでした！

![F8 2018](https://scontent-atl3-1.xx.fbcdn.net/v/t1.0-9/31740050_1621510311299055_9025884604451520512_o.jpg?_nc_cat=0&oh=f43f3624f9c577a1d3f490718498eca8&oe=5B5D2778)

色々な国からのBotmakerと出会えました！アメリカを初めイギリスやウクライナやインドやドイツの人もいて、さすがにFacebookのコンファレンスでしか得られない経験でしたねと思ってありがたいでした。

![F8 2018](https://scontent-atl3-1.xx.fbcdn.net/v/t1.0-9/31717802_1621511157965637_4056604161624506368_n.jpg?_nc_cat=0&oh=dd7b588ed8dcb379715fd9d3b0b12b28&oe=5B61CC24)


ドイツでNLPを頑張ってる人や、ロンドンでメディカル情報を提供するボットを作ってる人や、ウクライナでボットを作ってる人と、ボットやりたい人をつなぐサービスをやってる人や、ブラジルでボットのコミュニティを作ってる人や多くの人たちがいました。

明日本番のF8のDay 1が始まりますので、僕が色々なプレゼンをみに行ってQiitaに発信しようと思います！
次の記事からは技術に関する情報をアップしますので楽しみにしててね！

（Facebookがプリクラやってたから記念に一枚！）
![F8 2018](https://scontent-atl3-1.xx.fbcdn.net/v/t1.0-9/31676688_1621510287965724_2085329642956259328_o.jpg?_nc_cat=0&oh=0d67a5e1ee78bea206316cbd74dbdf6e&oe=5B9848AC)

### Day 1の記事
https://qiita.com/aburd/items/3630cd3e9d08fee78674
【メモ】Gitでcommit前にSource Treeでファイルステータスを確認しよう

# Gitでcommit前にSource Treeでファイルステータスを確認しよう

## なぜ使うか
`git add` → `git commit` → `git push` を行なった後に、pull/reqをし、同僚にレビューしてもらうことがあるだろう。
その際に、不要なコードの変更や意図しない変更が含まれていた場合、レビューの範囲が広まったり、予期せぬ不具合を生み出す場合がある(レビューが通ったりした場合)。
commitした時点で、履歴には残ってしまうので(commit自体を修正すればいいが...)、できれば、その前にそのような不要な変更は入らないようにしたい。

その時に役に立つのが、Source Treeのファイルステータスである。

## Source Treeのファイルステータス
Source Treeに対象のリポジトリのローカルを指定した場合、ローカルで変更した `git add` 前のファイルをファイルステータスで確認することができる。

よって、以下の手順に従えば不要な変更をcommitに含めずに済む。

1. ファイルを変更する
2. Source Treeのファイルステータスを確認する
3. (不要な変更が含まれていたら、修正し、2を行う)
4. コードが正しければ、`git add` を行う
5. `git commit` を行う
6. `git push` を行う

## おまけ
ちなみにわざわざコマンドライン上で `git add` しなくても、Source Treeのファイルステータスの「作業ツリーのファイル」で表示されるファイル名一覧の内、ステージングにあげたいものをチェックすれば、 `git add` したことと同じになる。(それを行なった場合、「Indexにステージしたファイル」の部分に表示される)。逆に「Indexにステージしたファイル」で表示されるファイル名一覧の内、ステージングからおろしたいものは、チェックをするとステージングから下ろすことができる。

上記を行うことで、不要なコードの変更や意図しない変更がcommitに含まれるのを防ぐことができる。