OmniAICreator/Qiita-1.07M huggingface dataset:
Rustの基本型(整数型編)

# この記事について
Rustの基本型についてまとめます。
Rustは他の言語のと違って明示的に宣言しなくても標準ライブラリ（std）が読み込まれます。
基本型は全てその標準ライブラリ内で宣言・定義されています。詳しいことは[Rustの標準ライブラリのリファレンス](https://doc.rust-lang.org/std/#primitives)を参照してください。

# 基本型の分類
Rustの基本型はC/C++の基本型にPythonなどの比較的新しい言語の基本型をミックスしたものようなものになっています。大まかにそれらの型を分類すると次のようになっています。

* 整数型
* 浮動小数点型
* 関数型
* bool型
* ポインタ・参照型
* タプル型
* char型・固定長の文字列型
* 配列型

はじめは全ての型を一挙に紹介しようと思ったのですが、公式ドキュメントを見ると型のトレイト（メンバメソッドみたいなもの）がかなりの量があり驚きました。そこで、今回は整数型についてのみ紹介します。

# 整数型
Cや多くの言語と同様に整数型を持っています。大きな違いは型のサイズによって細かく分類されている点です。

```rust:int_types.rc
let a:i8 = 8; // 8bit整数型
let b:i16 = 16; // 16ビット整数型
let c:i32 = 32; // 32ビット整数型
let d:i64 = 64; // 64ビット整数型
let  e:i128 = 128; //128ビット整数型
```

もちろんunsigned型もあります。

```rust:int_types.rc
let a:u8 = 8; // 8bit整数型
let b:u16 = 16; // 16ビット符号なし整数型
let c:u32 = 32; // 32ビット符号なし整数型
let d:u64 = 64; // 64ビット符号なし整数型
let  e:u128 = 128; //128ビット符号なし整数型
```

ハードウェアによって扱いやすい・高速に演算できる整数のサイズは変わってきます。そういった違いを吸収するためにハードウェアにとって都合のいいサイズの整数型（isize・usize）が定義されています。usizeは、配列のインデックスに使われます。

```rust:iusize
let idx:usize = 2;
let idx_diff:isize = -32;
let my_array = [1,2,3,4];
println!("{}", my_array[idx]); // 配列のインデックスにusizeの変数をつかう。
```

# 整数型の演算
## 型情報の取得
それぞれの整数型は表現できる値の範囲をmin_value()、max_value()関数を用いて取得することができるます。

```rust:max_min
let max_val = i32::max_value();
let min_val = i8::min_value();
```

## 数学演算子
Rustは以下の数学演算子をそれぞれの型に対してサポートしています。

```rust:arithmetic_operator
/* bit演算 */
let c = a & b; // AND演算
let c = a | b; // OR演算
let c = a >> b; // 右シフト
let c = a << b; // 左シフト
/* 加算乗除 */
let c = a + b; // 加算
let c = a - b; // 減産
let c = a * b; // 乗算
let c = a / b; //除算
/* 比較演算 */
let c = a == b;
let c = a <= b;
let c = a < b;
let c = a > b;
let c = a >= b;
```

# bit演算
Rustは演算子で定義されたビット演算以外に次のような演算を行う関数を標準で提供しています。

```
n.count_ones(); // ビット表現したときに現れる1の数を求める
n.count_zeros(); // ビットで表現したときに現れる0の数を求める
n.leading_zeros(); // ビットで表現したときの頭の0の数を求める
n.trailing_zeros(); // ビットで表現したときの末尾の0の数を求める
n.swap_bytes(); // byte順序を逆にする
n.rotate_right(4); // ラップする右シフト 
n.rotate_left(4); // ラップする左シフト
```
## エンディアン変換
ネットワークプログラミングをするときに悩ましいエンディアン変換の関数を提供しています。

```rust:endian
a.from_be(0x1213i32); // ビッグエンディアンから実行環境のエンディアンへ
a.from_le(0x19218); //リトルエンディアンから実行環境のエンディアンへ
let b = a.to_be(); // 実行環境からビッグエンディアンへ
let b = a.to_le(); // 実行環境からリトルエンディアンへ
```

# 安全な整数型演算
Rustが最も力を入れている要素の一つに安全性があります。通常の 数値演算に加えて安全性に配慮した数値演算関数を別に提供しています。

## Optionで演算結果をラップする関数
オーバーフローなどで演算ができない場合に備えて、結果をOptionでラップして返します。

```rust:checked_ope
let result = a.checked_add();
let val = result.unwrap();
```

もちろん、加算以外にも演算子で定義されている演算は全てこの仲間の（checked_xxxx）があります。

## 飽和する関数
演算結果がオーバフローするときは、その型で取りうる値で飽和します。

```
let result = a.saturating_add(100000000000000000000000000000000000);
```

## ラップする関数
演算結果が飽和するときは、その型の最小の値にラップします。

```
let result = a.wrapping_add(10000000000000000000000000000);
```

## オーバーフローチェックつきラップする関数
演算結果を(整数型, bool)のタプルとして返します。オーバーフローが発生した場合はboolはtrueとなります。

```
let result = a.overflowing_add(100000000000000000000000000000);
```

# 参考文献
[Rustの公式標準ライブラリリファレンス](https://doc.rust-lang.org/std/primitive.isize.html)
RxJavaを学ぶ

#この文章について

RxJavaを使うために学んだことを備忘録としてメモ。

## 参考


リアクティブプログラミングへの理解がイマイチだったのでまとめてみた。
http://system.blog.uuum.jp/entry/%E3%83%AA%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%B8%E3%81%AE%E7%90%86%E8%A7%A3%E3%81%8C%E3%82%A4%E3%83%9E%E3%82%A4%E3%83%81%E3%81%A0%E3%81%A3

「RxJS」初心者入門 – JavaScriptの非同期処理の常識を変えるライブラリ
http://liginc.co.jp/web/js/151272

## RxJavaとは

**ReactiveX**をJavaで使えるようにしたライブラリ、
ReactiveX公式サイト：http://reactivex.io/

# Reactive X

公式サイトより引用。
>ReactiveX is a library for composing asynchronous and event-based programs by using observable sequences.

つまり非同期処理とイベントベースの処理を*Obserbleパターン*により実現したものであるらしい。

**Observleシーケンス**とは？
さらに読み進めると以下の通り。

>It is sometimes called “functional reactive programming” but this is a misnomer. ReactiveX may be functional, and it may be reactive, but “functional reactive programming” is a different animal. One main point of difference is that functional reactive programming operates on values that change continuously over time, while ReactiveX operates on discrete values that are emitted over time.

**FRP**(functional reactive programming)と似ているけど、そっちは時間に継続的な値に対して動作し、ReactiveXは個別の値に対して動作する…？

FRPとは？

そもそもこれは何を解決するために存在して、何がうまみなのか、ピンとくるのがなかなかない…。
根底にあるのは、**非同期処理**をもっと便利に簡単に！というものがあるようだ。

## 解決したい内容：非同期処理の問題点

近年のシステム(特にWebアプリケーション)では非同期処理の需要が高まっている。
しかし非同期はそのシステムが大きくなるにしたがって管理が難しくなる、具体的にはコールバック地獄に陥りエラーハンドリングが難しくなっていく…といった問題点がある。

これらの問題点に対して解決するライブラリの一つがReactiveXであり、マイクロソフトが採用しJavaSclipt向けに作ったのがRxJavaScliptとのこと。

解決方法について理解するために、Observleシーケンスなどのバックボーンの知識を学ぶ

# ReactiveXはObserverパターン



## Obserbleシーケンスについて

以下のサイトが非常にわかりやすかった。
http://liginc.co.jp/web/js/151272

イベントが一連の流れとして流れてくる(Stream)、これをObserbleシーケンスと言う。

イベントを受け取りたいユーザーはObserberを登録する。このObserber登録をSubscribeによって以下のように登録する。

```Java
Obserble.subscribe(new observer(...));
```

Obserberに通知される前にObserbleにたいして特定の処理をかけることができる、
これを**Operation**と呼ぶ。


```java
Observable
    .filter() //Operation
    .map(User::getName) //Operatioin
```

.filterとか.mapとか…Obeserbleに付属しているこれらの関数は同時に戻り値として処理をかけたObserbleを返却するためメソッドチェーンのようにつなげることができる。

Observerには、
次の作業を表すのonNext()
作業終了を表すonComplete()
エラーを表すonError()
という三つメソッドがある。

Obserbaleではこの上記の三つのメソッドを流れに沿って呼び出しているが、この作業をemitterによって行っている。
Rubyでutf8のCSVをsjisに変換するワンライナー

単純にsjisに変換しようとすると、特殊な文字が入っていた場合にエラーでコケる。ので、encodeメソッドの引数にそれらを無視するオプションを付けておく。
これだけあればパッと変換できるので備忘録代わりに。

```Ruby
File.open(output_csv_path_sjis, 'w') { |f| f.puts File.read(input_csv_path_utf8).encode('Shift_JIS', invalid: :replace, undef: :replace) }
```
ClickUp 公式アプリ / 他サービスとの連携

# 充実の公式アプリ

<img width="824" alt="Screen Shot 2018-10-12 at 14.28.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/300876/657c74dd-77cf-4eb2-712d-324753a0c0fb.png">

スマホ用アプリ、PC用アプリ、とモダンなツールとしては一通り揃っている。

Apps | Mobile, Desktop, Extension, Alexa, Google Home
https://clickup.com/apps

PC用アプリについては基本的にWebブラウザ版と変わらないので使い勝手に大差は無し。
スマホアプリは基本的に十分利用出来るものではあるが、Asana、Trello等のメジャー勢力と比べた場合、UI、動作速度の面で若干劣る感あり。特に現時点では一覧性に難があるがおそらく今後改善されるであろうと思われる。



## 音声UI (VUI)

<img width="824" alt="Screen Shot 2018-10-12 at 14.29.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/300876/fe8b5357-cb2a-66c4-2bd3-9b9f8c4b1acc.png">

ここで目を引くのは音声UI(VUI)、しかし...

実際に利用してみると現時点ではお世辞にも効率的とは言えないものであり、現実的な利用方法とは言えないので、素直に他のアプリを利用すべき。
今後の展開に期待したいところ。

How To Connect With Alexa & Google Assistant | Clickup Blog
https://clickup.com/blog/alexa-google-assistant-project-management/

ClickUp Apps Across all Devices | ClickUp Tutorials & Docs
https://docs.clickup.com/general/clickup-apps-across-all-devices

ちなみに、VUI経由で最も非効率である現実はというと、タスク作成。以下、タスク追加フロー

- ClickUp を呼び出す
- 「Create task」
    - ClickUp: チーム沢山あるけど名前は?
- 「チーム名」
    - ClickUp: 分からない、名称?
    - 何度か繰り返した後
    - ClickUp: これだけあるけど何番?
- 「番号」
    - ClickUp: スペース沢山あるけど名称は?
- 「スペース名」
    - ClickUp: リスト沢山あるけど名称は?
- 「リスト名」
    - ClickUp: タスク名は?
- 「タスク名」
    - ClickUp: OK、作ったよ
- (Clickupは去りました)
    
### アレクサ連携

- [Apps \| Mobile, Desktop, Extension, Alexa, Google Home](https://clickup.com/apps/)
    - [Alexa Project Management and Personal Assistant](https://clickup.com/apps/alexa)
- [Alexa \| アレクサ\| Amazon開発者ポータル](https://developer.amazon.com/ja/alexa)
    - [Amazon Alexa](https://developer.amazon.com/alexa)
- [Amazon\.com: ClickUp: Alexa Skills](https://www.amazon.com/Mango-Technologies-ClickUp/dp/B0795DTYJY)

### Googleアシスタント連携

- [Apps \| Mobile, Desktop, Extension, Alexa, Google Home](https://clickup.com/apps/)
    - [Google Personal Assistant and Project Manager](https://clickup.com/apps/google-assistant)
- [Google アシスタント \- あなただけの Google](https://assistant.google.com/intl/ja_jp/)
    - [Google Assistant \- Just Say “Hey Google” and Make Google Do It](https://assistant.google.com/)
- [ClickUp \| Google Assistant](https://assistant.google.com/services/a/uid/000000fc81b2e464)





# 他サービスとの連携


![Screen Shot 2018-10-14 at 19.09.44.png](https://qiita-image-store.s3.amazonaws.com/0/300876/ae7bad17-0494-0679-2a2d-d0f3647cbbf0.png)

今時のツールなので他サービスとの連携は基本的に問題無し。
細かいところで改善の余地はあるように思えるが、2018年現在において、無料プランでこれだけ充実していることこそがまさにClickUp最大の特徴である。

ClickUp | Integrations
https://clickup.com/integrations
Azure Blobストレージのアップロード・ダウンロード時にはチェックサム確認処理を検討すべき

2019年10月10日
久しぶりに読み直すと日本語がおかしい、断言するのはおかしいと思う部分があったので修正します。

# 何故、チェックサム確認処理が必要か

　とあるシステムで[Microsoft Azure Storage Libraries for .NET](https://github.com/Azure/azure-storage-net)を使ってAzure Blobストレージからファイルをダウンロードしていたのですが、

* クライアントライブラリの処理としては正常に完了しているのに、ファイルが破損している

という事象が発生しました。
傾向を調べてみるとファイルサイズが大きくなると発生頻度が上がるようで、特に100GBytesを超えるファイルでは50%を超える頻度で問題が発生していました。

　色々な調査の結果、最終的に原因はライブラリのバグで並列ダウンロード中に通信エラーが起きるとデータ破損が発生するというものでした。また、ライブラリのアップデートにより、問題は収束しました。[^1] 
[^1]: このバグはv8.3.0で修正 https://github.com/Azure/azure-storage-net/releases/tag/v8.3.0

　この件ではダウンロード後にファイル変換処理があったおかげで問題が顕在化しましたが、例えばダウンロード後にどこか別のストレージに保存して終了という場合はすぐに問題が発覚せず、後々に大きな問題になってしまう危険性があります。処理コストとのバランスは必要ですが、ダウンロードしたファイルの復旧が難しい場合、ダウンロードされたファイルはアップロード前のファイルと同一のものなのか、チェックする処理は必要と思います。

# Azure Blobは自動でMD5を計算してくれるが、クライアント側による暗号化をしている場合はうまくいかない

Azure BlobストレージはMD5のハッシュ値を自動で計算してくれますので、この機能を使えばアップロード前のファイルとダウンロード後のファイルが一致するかどうかが簡単にチェックできます。

> [しばやん雑記:Azure Blob Storage へのアップロード時にファイルの MD5 を同時に計算して保存する](https://blog.shibayan.jp/entry/20150302/1425260123)

上記の記事ではリクエストオプションで指定が必要とありますが、現在ではデフォルトでこの機能がオンになっているようです。


ただし、このAzure BlobのContentMD5はあくまでAzure Blobにアップロードされたファイルに対して計算されます。クライアント側による暗号化[^2]を利用している場合はうまく検出できません。
[^2]: [Microsoft Docs:Microsoft Azure Storage のクライアント側の暗号化と Azure Key Vault](https://docs.microsoft.com/ja-jp/azure/storage/common/storage-client-side-encryption)

# 解決策：独自にハッシュ値を計算してメタデータとして設定する

Azure Blobストレージの機能では足りないため、独自にハッシュ値を計算する必要があります。
Azure Blobストレージでは独自のメタデータを設定することができますので、事前に計算した値を保存しておくことでダウンロード時にチャックすることができます。[^3]


```csharp:実装例
public static async Task AddMetadataAsync(CloudBlockBlob blob,string checkSum)
{
    blob.Metadata.Add("RawContentMD5", checkSum);
    await container.SetMetadataAsync();
}

public static async Task<string> GetMetadataAsync(CloudBlockBlob blob)
{
    await blob.FetchAttributesAsync();
    string checkSum = null;
    if (block.Metadata.TryGetValue("RawContentMD5", out checkSum))
    {
       return checkSum;
    }
    else
    {
        // 例外処理
    }
}
```

ただし、この方法だとファイルの暗号化はライブラリ内で行われるため、正しくアップロードされたかはダウンロードしてみないと確認できません。

# まとめ

もしもの場合を考慮をし始めると、事前に計算したチェックサムは正しいのか？など、この手の問題は際限ありません。
Microsoft Azure Storage Librariesに関しては、私が遭遇したバグの後も2018年10月14日時点で[最新版であるv9.3.2でもダウンロード中のファイル破損のバグ修正が入っています](https://github.com/Azure/azure-storage-net/releases/tag/v9.3.2)。ライブラリに何らかのバグのリスクを考えると、確実にデータを保存したいファイルに対してはチェックは入れておくべきと思います。

[^3]: [Microsoft Docs:プロパティおよびメタデータを設定および取得する>メタデータの設定と取得](https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-properties-metadata#setting-and-retrieving-metadata)
herokuにデプロイできない時

<h1>herokuにpushしたらrejectされた</h1>

以下エラー内容

```
remote:  !     Precompiling assets failed.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !   Push rejected
```

$ heroku create した直後に、以下のコマンドでnodejsを使えるようにする。
（bootstrapとかをインストールした時、node_modulが作成されるから）

```
$ heroku buildpacks:set heroku/nodejs

$ heroku buildpacks:add --index 2 heroku/ruby
```

んで、pushして　

```
$ heroku run rails db:migrate 
```

を忘れない

<h1>DB関係のエラーが出た時の最終手段</h1>

```
$ heroku buildpacks:set heroku/nodejs

$ heroku buildpacks:add --index 2 heroku/ruby
```

これすると、heroku上のDBがリセットされる
MySQL サービスがダウンしても自動的に復旧できるよう簡易監視＆サービス再起動ツール Monit を導入する。

### 要旨
MySQL サービスがダウンしても自動的に復旧できるよう監視＆サービス再起動ツール Monit を導入する。

### インストールする
```
$ sudo yum install monit -y
```

### 設定ファイルを作成する
```
$ sudo vim /etc/monit.d/mysqld.conf
check process mysqld
    with pidfile "/var/run/mysqld/mysqld.pid"
    start program "/etc/init.d/mysqld start"
    stop program "/etc/init.d/mysqld stop"
    if failed unixsocket /var/lib/mysql/mysql.sock then restart
    if 5 restarts within 5 cycles then timeout
```

### monitサービスを起動する
```
$ sudo service monit start
```

### 自動起動に設定する
```
$ sudo chkconfig monit on
```

### 単体テスト
手動で mysqld を落とし、2分で自動的に復旧するか確認する。

以上。
SWI-Prolog で、Web サーバーを立てる

サーバーのプログラムです。

```text:helloweb.pl
#! /usr/bin/swipl -f -q

:- use_module(library(http/thread_httpd)).
:- use_module(library(http/http_dispatch)).

server(Port) :-
        http_server(http_dispatch, [port(Port)]).

:- http_handler(/, say_hi, []).

say_hi(_Request) :-
        format('Content-type: text/html~n~n'),
        format('Hello World! Oct/14/2018<p />~n'),
        format('こんにちは。　今日は、１０月１４日です。<p />~n').
```

サーバーの実行
> server(8000). とキーイン

```text
$ ./helloweb.pl 
?- server(8000).
true.

?-
```

ブラウザーで、　http://localhost:8000 にアクセス
![swipl_oct14.png](https://qiita-image-store.s3.amazonaws.com/0/179446/57162f85-e685-8276-f714-50f1fc69992d.png)

サーバーを終了される時は、次のようにキーイン

```text
halt.
```

次のバージョンで確認しました。

```text
$ swipl --version
SWI-Prolog version 7.6.4 for x86_64-linux
```
Rubyで指数探索を実装してみた

# はじめに
以下の指数探索の記事を見かけ、興味を持ちました。
[二分探索よりも速い指数探索の解説](https://qiita.com/kgoto/items/e3cf4dc9a46ac6c0f190)
この記事では、上記の記事においてC++で実装されていた指数探索を、Rubyで実装してみました。

# ソースコード

```ruby:exponential_search.rb
class Exponential_search
  def initialize(array)
    @array = array.sort # 配列は事前にソートしておく
  end

  def exponential_search(first,last,key)
    # 指数探索の開始
    len = @array.size
    prev = first
    cur = prev + 1
    dis = 1
    while dis < len and @array[cur] < key
      prev = cur
      cur += dis
      dis *= 2
    end
    exponential_search_last = dis < len ? cur : last
    binary_search(prev,exponential_search_last,key)
  end

  def binary_search(first,last,key)
  # ２分探索のメソッド
    while first <= last
      mid = (first + last) / 2
      return @array[mid] if @array[mid] == key
      if @array[mid] < key
        first = mid + 1
      else
        last = mid - 1
      end
    end
  end
end
```

# 実行速度の評価
実装した指数探索の計算速度を、二分探索と比較してみました。
探索対象として、1〜1000までの整数の中から重複なしでランダムに500個取り出したデータを用意しました。

|探索した数|指数探索での探索時間（ミリ秒）|二分探索での探索時間（ミリ秒）|
|---|---|---|
|10|0.1417|2.0549|
|500|2.5296|0.1498|
|900|0.1607|0.1425|
[インストール]windows + nginx + php + pukiwiki

# はじめに

　情報共有の場が必要になり手軽に情報更新ができるのでwikiを導入することした。
　合う合わないがあるので、いったんローカルPCにインストールする。

# 各種インストール

### 準備（ダウンロード）

　まずは各ソフトを以下のリンクからダウンロード

- nginx

　 [nginx: download](http://nginx.org/en/download.html)
　　→　nginx/Windows-1.15.5 を選択

- php

　 [PHP: Downloads](https://windows.php.net/download#php-7.2)
　　→　VC15 x64 Thread Safe のzip(php-7.2.9-Win32-VC15-x64.zip） を選択

- pukiwik

　 [PukiWiki 1.5.1](https://pukiwiki.osdn.jp/?PukiWiki/Download/1.5.1)
　　→　pukiwiki-1.5.1_utf8.zip を選択

### インストール

- nginx

　　zipファイルを解凍
　　C:\dev\nginx-1.15.5
  　
　　解凍したディレクトリに起動スクリプト停止スクリプトを準備
　　・起動スクリプト

```start.bat
@echo off

set BASE_DIR=%~dp0
cd %BASE_DIR%
start nginx
echo 起動しました
pause
```

　　・終了スクリプト

```stop.bat
@echo off

set BASE_DIR=%~dp0
cd %BASE_DIR%
nginx -s quit
echo 停止しました
pause
```

- php

　　・zipファイルを解凍
　　　　C:\dev\php-7.2.9-Win32-VC15-x64
　　・windowsのシステム環境変数のpathにphpのディレクトリを登録


- pukiwiki

　　・zipファイルを解凍
　　　　C:\dev\nginx-1.15.5\html\wiki

# 設定

　 [nginx wiki](https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/) を見ながら設定しました。

1． RunHiddenConsole をダウンロード

　→リンクをクリックしてダウンロードして、nginxのフォルダに解凍
　　C:\dev\nginx-1.15.5\RunHiddenConsole.exe

2． nginx と php を連携

```start-php-fcgi.bat
@ECHO OFF
C:\dev\nginx-1.15.5\RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:9123
pause
```

3．nginxの設定

```nginx.conf
    server {
        listen       1080;
        server_name  DESKTOP-PC;  # localhost → マシン名に変更

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9123;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
```

4．起動
　・start-php-fcgi.bat を実行
　・start.bat

5．動作確認

　・PHP
　　　→テスト用ファイル作成
　　　　C:\dev\nginx-1.15.5\html\index.php

```index.php
<?php
phpinfo();
```
　　→ ブラウザでアクセス
　　　http://localhost:1080/index.php

　・pukiwiki
　　→ ブラウザでアクセス
　　　http://localhost:1080/wiki/index.php

　　→ メニューのURLを確認
　　　※新規作成をクリック
　　　　nginx.confのserver_nameに設定した値がドメイン部分に設定されている
　　　　　http://desktop-pc:1080/wiki/index.php?plugin=newpage&refer=FrontPage

# トラブルメモ

　nginx.confのserver_nameに設定をしていないとデフォルトの**localhost** にしていると
　wikiのメニューがlocalhostになっていて、
　他のPCからアクセスした場合、新規ページ作成リンクをクリックすると404:NotFoundになってしまった。
　忘れずに設定すること。

# その他

　まだ本格的に使い始めていないので、設定漏れがあるかもしれない。
　徐々に確認して、必要であれば更新をしていく。
Android Open Source Project(AOSP)環境のmirrorの作成・利用

Android Open Source Project(AOSP)のビルド環境を利用する際に、ローカルにmirrorを用意しておくと、取得時間の短縮と、個別のビルド環境毎のストレージサイズ節約ができる

基本的には[AOSPサイト](https://source.android.com/setup/build/downloading#using-a-local-mirror)の手順どおり

#mirror環境の取得

ローカルにmirror環境を取得
その場合のストレージ専有サイズは230GiB程度

```bash
mkdir /mirror/aosp
cd /mirror/aosp
repo init -u https://android.googlesource.com/mirror/manifest --mirror
repo sync
```

#ビルド環境の取得

mirrorを利用してビルド環境の取得
ローカルパスを指定する方法と、referenceパラメータを用いる方法がある

なお、mirrorを用いずに取得した場合のストレージ専有サイズは70GiB強

## ローカルパス指定での取得

取得元自体の指定をローカルパスとする
ストレージ専有サイズは70GiB弱

```bash
repo init -u /mirror/aosp/platform/manifest.git -b master
repo sync
```
## reference指定での取得

取得元の指定を本線にしつつも、mirrorを参照させる動作とする
ストレージ専有サイズは37GiB強となる

```bash
repo init --reference=/mirror/aosp -u https://android.googlesource.com/platform/manifest -b master
repo sync
```
はさみうち法（非線形方程式の数値解法）

# はさみうち法とは
- 非線形方程式の数値解法の一つ
- [二分法](https://qiita.com/omu58n/items/f00efa797055dc436d33)の改良
  - 二分法では、二点の中点を新しい端点としたのに対して、はさみうち法では、二点を結ぶ直線が$x$軸と交わる点を新しい端点とする

![qiita-num-5.png](https://qiita-image-store.s3.amazonaws.com/0/299208/60e6b787-93c7-9233-bf49-0f9cced4bc35.png)


# 算法
#### 初期値
$x_{a_0},x_{b_0}$ : 適当な方法で決める。ただし、$f(x_{a_0})f(x_{b_0})<0$
#### 反復手順
$x_{c_n}=\frac{x_{a_n}f(x_{b_n})-x_{b_n}f(x_{a_n})}{f(x_{b_n})-f(x_{a_n})}$
$f(x_{c_n})f(x_{a_n})<0$ ならば、$x_{a_{n+1}}=x_{a_n}$ $,$  $x_{b_{n+1}}=x_{c_n}$
$f(x_{c_n})f(x_{a_n})>0$ ならば、$x_{a_{n+1}}=x_{c_n}$ $,$  $x_{b_{n+1}}=x_{b_n}$

#### 停止則
$|f(x_c)|<\varepsilon$ のとき反復停止
※$[x_a,x_b]$はゼロに収束しない

# サンプルコード
$f(x)=x^2-1$、初期値 $a=0.5,b=2$ としてはさみうち法を使って解を求めるプログラム。
$f(a)f(b)<0$の確認とか入れてないガバガバコード

```c:regula_falsi.c
#include<stdio.h>
#include<math.h>

double f (double x) {
  return x*x-1;
}

double regula_falsi (double a, double b) {
  double c;
  do {
    c = (a*f(b) - b*f(a)) / (f(b) - f(a));
    if (f(c) == 0) { break; }
    if (f(a) * f(c) < 0) { b = c; }
    if (f(a) * f(c) > 0) { a = c; }
  } while (fabs(f(c)) > 1e-10);
  return c;
}

int main (void) {
  double alpha;
  alpha = regula_falsi(0.5, 2);
  printf("%f\n", alpha);
  return 0;
}
```

実行結果

```
1.000000
```

# 特徴
- 初期値が悪いと[二分法](https://qiita.com/omu58n/items/f00efa797055dc436d33)より収束が悪い場合がある
- [Newton法](https://qiita.com/omu58n/items/dc2368da350b13bcaf30)の初期値を求めるのに適している
[解決編]AlexaからIFTTT経由でショッピングリストの情報を取得すると文字化けするのをなんとかした


[この](https://qiita.com/ryo_naka/items/ae3b00a4c9be861c86d0)続きです。

前回は文字化けの正体がわからないままだったので、どうにもできなかったが、
@yoshiro_mihiraさん、@mstk0531さんからのコメントを元に自分なりのフローに当てはめてみたところ、なんとか上手くいったので書き残しておく。

Alexaの買い物リストを流用したい人は最終的なアウトプットがそれぞれ別々だと思うのでデコード後の処理は適当に読みかえてもらえるとありがたい。

## 文字コード関連
@mstk0531さんの[この記事](https://qiita.com/mstk0531/items/d7bcf462bec38c825e2e)にてnode-redのnode-red-contrib-iconvで文字コード変換なら使用できる状態になることがわかった。

[もじばけらった](http://lab.kiki-verb.com/mojibakeratta/)で文字コードを改めて調査。
<img width="256" alt="2018-10-14_17h40_10.png" src="https://qiita-image-store.s3.amazonaws.com/0/106639/fc3c3a8e-8593-f59e-991c-6140176c3fe2.png">
<img width="678" alt="2018-10-14_17h39_33.png" src="https://qiita-image-store.s3.amazonaws.com/0/106639/71bee7a9-f11e-7d2c-6ee1-1e48e0d27bf9.png">

お二人のいうように[ISO-8859-1]→[UTF-8]ということを確認。
そのうえでPythonで試行錯誤した結果、こんな感じに。

    def lambda_handler(event, context):
        get_item_name = event['item']
        bytes_data = get_item_name.encode("ISO-8859-1")
        str_data = bytes_data.decode("UTF-8")
        get_item_name = str_data

これでUTF-8として読み取れるようになった。
いざ書いてみるとシンプルな構成。

## その後の処理

ここからMail送信すればWunderListに登録できるけど、前に作ったのを流用すりゃいいと思ったので
[WunderListにMailで登録](https://qiita.com/ryo_naka/items/b6dc93c6f7c7fe94e8d0)と[SKILLとIFTTTでWunderListに登録](https://qiita.com/ryo_naka/items/c8d00abb283c29c278cb)の二つを適当に流用して、もう一回IFTTTに返してそこからMail送信。
なので、ここではPOSTでIFTTTへPOSTするのみ。

こんな感じに。

        # IFTTT の Makerへ送信
        url = 'https://maker.ifttt.com/trigger/towunderlist/with/key/XXXXXXXXXXXXXXXXXXX'
        data = {
            'value1': get_item_name,
        }
        headers = {
            'Content-Type': 'application/json',
        }    
        req = urllib.request.Request(url, json.dumps(data).encode(), headers)
        with urllib.request.urlopen(req) as res:
            body = res.read()

Alexa→IFTTT→Lambda→IFTTT→Gmail→WunderListというよくわからない経路になっているが、買い物リストに登録したものが文字化けしないでWunderListに再び登録できるようになった。
よかったよかった。

# 感謝
@yoshiro_mihiraさん、@mstk0531さんありがとうございました。
ROS講座71 Qtを使う3(classの作成)

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 20.04 |
| ROS | Noetic |
| Qt | 5.12.8 |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

# ソースコード

## プログラム本体

```c++:qt_lecture/src/qt_basic4.cpp
#include <QApplication>
#include <QDialog>

#include "qt_mydialog.h"

int main(int argc, char** argv)
{
	QApplication app(argc,argv);
	QWidget* window = new QWidget;
	MainDialog* dialog = new MainDialog(window);
	dialog->show();
	return app.exec();
}
```

## ライブラリ宣言

```c++:qt_lecture/src/qt_mydialog.h
#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>

class MainDialog : public QDialog
{
  Q_OBJECT
public:
  MainDialog(QWidget* parent);

private Q_SLOTS:
  void setLabelText(); 
private:
  QLabel* label;
  QLineEdit* lineEdit;
  QPushButton* setButton;
};
```

ここがQtの一番独特なところです。最初の`Q_OBJECT`はこのclassがQtのWidgetとして働けるための記述を追加するためのマクロです。必ずclassの宣言の最初に書きます。
`private Q_SLOTS:`も同じようにQtのマクロでSLOTとして使う関数の前に置きます。

## ライブラリ実装

```c++:qt_lecture/src/qt_mydialog.cpp
#include <QDialog>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>

#include "qt_mydialog.h"

MainDialog::MainDialog(QWidget* parent): QDialog(parent)
{
  label = new QLabel(tr("empty") );
  setButton = new QPushButton(tr("Set") );
  lineEdit = new QLineEdit;

  connect(setButton, &QPushButton::clicked, this, &MainDialog::setLabelText);

  QVBoxLayout* layout = new QVBoxLayout;
  layout->addWidget(label);
  layout->addWidget(lineEdit);
  layout->addWidget(setButton);
  setLayout(layout);
}

void MainDialog::setLabelText()
{
  QString text = lineEdit->text();
  label->setText(text);
}
```

* 9行目では`MainDialog::MainDialog(QWidget* parent): QDialog(parent)`では基底クラスのコンストラクタを呼んでいます。
* connect関数でGUIのボタンが押されたときにsetLabelText関数が実行されるように設定しています。

## CMakeList.txt
以下の2つを追加します。

```cmake:qt_lecture/CMakeLists.txtに追加
add_executable(qt_basic4 src/qt_basic4.cpp src/qt_mydialog.cpp)

target_link_libraries(qt_basic4
  ${catkin_LIBRARIES}
  ${QT_LIBRARIES}
)
```
`add_executable(qt_basic4 src/qt_basic4.cpp src/qt_mydialog.cpp)`のようにプログラム本体とライブラリの実装のみを追加します。ヘッダファイルは追加してはいけません。

# ビルド
```shell
cd ~/catkin_ws
catkin build
```

# 実行
以下のコマンドを打つと下の図のようなウィンドウが表示されます。
各ターミナルごとに実行前にsource ~/catkin_ws/devel/setup.bashを実行する必要があります。

```
rosrun qt_lecture qt_basic4
```

![qt_basic4.png](https://qiita-image-store.s3.amazonaws.com/0/254442/87fb036b-e34b-b4e9-0380-7fb03aedaa56.png)


# 【参考】MOCについて
ライブラリの宣言にあったQ_OBJECTなどのマクロは通常のコンパイルのプリプロセッサではなく、もっと複雑なMOC(Meta-Object Compiler)という処理をしています。cmakeで`set(CMAKE_AUTOMOC ON)`を入れることでこれが実行されるのですが、通常のc++のビルド処理とは違うためにqt周りでコードエラーを起こすと、通常とは違うMOC関連のエラーが出るので注意が必要です。

# 参考
[Qtプログラミング入門](https://densan-labs.net/tech/qt/)
[Dockable panel tutorial](http://wiki.ros.org/ja/rviz/Tutorials/hydro/Plugins%3A%20New%20Dockable%20Panel)

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)
初めてのsolidityを触る人へのサンプルコード

**※注意※**
**これは特定の人に対して学習教材として使うサンプルであるため、みなさまに読んでいただく内容に整理されていません。**

solidity初学者の方のために、ethfiddleを活用して、solidityのコードの共有を行います。
ethfiddleとは loom network社が提供しているsolidityのコード共有ツールです。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3234303033342f63343239306238392d616265302d373931612d663533652d6536643438383738303731302e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/60143/178574d6-1edc-63af-e1f2-b6a784ea0116.png)

https://ethfiddle.com

### EthFiddleでsolidityコードを共有しよう
https://qiita.com/LoomNetworkJP/items/73b1c21063764bcfc7f9

※ Remixも使うかも
https://remix.ethereum.org

もしゲーム的にブロックチェーンを勉強したい場合はこちらをおすすめ。
https://cryptozombies.io

#サンプルコード
## solidityの型
https://ethfiddle.com/XW7ByVXOd1

## コントラクトの継承と制限
### public, private, internal, external
https://ethfiddle.com/wWAtt4rHKy

### require, assert, revert
https://ethfiddle.com/V63OS76tzP

### modifier
https://ethfiddle.com/hHCTyXpBIZ

### memory, storage
https://ethfiddle.com/jWleB1mYSD

## 文字列比較
https://ethfiddle.com/tooHsbaJiB

## 複数return
https://ethfiddle.com/tDRRAFdIex

## payable
https://ethfiddle.com/7TBLegdUby
Gentoo on Raspberry Pi でXorg serverをemergeする際にハマったこと。


##要点
1. gentoo wikiでuserland-raspberrypiをインストールすると
便利だよというのでその通り入れる。

2. /opt/vc/ディレクトリ以下に様々な便利ツールが入る。
3. （この際に、opengl関連のライブラリが入る）


4. ある時思い立ってx11base/xorg-serverをemergeしようとする。

5. 依存関係にあるmedia-libs/mesaもopenglのライブラリを入れる。

6.競合するでもなく、/opt/vc/のライブラリが勝手に使われて、しかもエラーがはっきりしないままビルドが失敗する。

##解決策
userland-raspberrypiパッケージを消す。
`localhost#emerge --unemerge raspberrypi-userland`
SQLiteをCLIから使う（sqlite3）


# 概要
SQLiteをCLIから使う際によく使うコマンドをまとめる。

# 環境
* macOS High Sierrra
* sqlite3 3.19.3

# まとめ
## sqlite3コマンド

|コマンド|意味|
|:---:|:--:|
|sqlite3 -h|ヘルプを表示|
|sqlite3|インメモリーのデータベースを作成し、対話的なセッションを開始|
|sqlite3 foo.db|foo.db(任意の名前)に接続（無ければ作成）し、対話的なセッションを開始|
|sqlite3 foo.db SQL|foo.db(任意の名前)にSQL(SELECT文とか.tablesとか)を実行|

## データベースに接続後

|コマンド|意味|
|:---:|:--:|
|.help|ヘルプを表示|
|.show|現在の設定を表示|
|.quit|終了|
|.tables|テーブル一覧を表示|
|.schema TABLENAME|テーブルの定義を表示|
|.dump [TABLENAME]|テーブルのダンプで使えるSQLを表示|
|SQL文|任意のSQLを実行|


# まとめ

`sqlite3 -h`と`.help`さえ覚えておけばやっていける。
Markdownで参考文献や注釈を記載するときに便利な脚注記法の書き方

論文などで参考文献を記載するときによく利用される『右上にリンクとなっている数字が割り振られている記法』をMarkdownで書きたい場合があると思います。

『Markdownの脚注[^1]です。』
[^1]: 脚注を書きます。


↑こんなやつです。
これは**脚注記法**と呼ばれており、Markdownでは以下のように書きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/140792/b5fef67c-f538-3524-03fc-3a6dc3a5b540.png)





Pygame で音を読み込み、再生する

## 目標:

### Pygame 音を読み込み、再生する
#### Tasks
- soundディレクトリを作成し、そこに音をいれる
- soundディレクトリのパスを変数に格納
- `pygame.mixer.init()`で初期化
- `Sound`クラスのインスタンスを作成
- インスタンスを`play()`で再生

### プロジェクトストラクチャー

- `project/` -- 全てを入れるフォルダ（ディレクトリ）
    - `snd/` -- 音を保存するフォルダ（ディレクトリ）
		- `shoot.wav`
    - `app.py` -- codeを書くファイル


***
#### soundディレクトリを作成し、そこに音をいれる
#### soundディレクトリのパスを変数に格納


```python:app.py
snd_folder = os.path.join(game_folder, "snd")
```

***
#### `pygame.mixer.init()`で初期化


```python:app.py
pygame.init()
pygame.mixer.init() # ここで音を扱うためのinit
```

***
#### `Sound`クラスのインスタンスを作成

- `os.path.join(snd_folder, "shoot.wav")`で`shoot.wav`までの絶対パスを作成
- その絶対パスを`pygame.mixer.Sound()`に渡し、`shoot_sound`というインスタンスを作成



```python:app.py
shoot_sound = pygame.mixer.Sound(os.path.join(snd_folder, "shoot.wav"))
```


***
#### インスタンスを`play()`で再生

```python:app.py
shoot_sound.play()
shoot_sound.set_volume(0.5) #このように音を小さくすることも可能
```
Istioで複数FQDNのホスティング

Istioで複数アプリケーションを別Host名でホスティングするのに詰まったので、記事にしておきます。
Istio自体の導入については[前回の記事](http://techeten.xyz/10305)などをご参考ください。

## 問題
前回の記事で導入したのと同じように

- 別のNamespaceを新たに作成し、Istio injectionを有効化
- そこに新しいFQDN用のGatewayとVirtualServiceを作成

して、新しいFQDNのリソースをIstioで受けられるようにしたかったのですが、どうしてもできないのです。

いろいろ試して実験してみたところ、

- VirtualServiceは、自分が所属するNamespace内に存在するGatewayにしか紐づけできない
- 複数のGatewayを複数のNamespaceにデプロイすると、最初にデプロイしたGatewayに記載のあるFQDNしか名前解決ができない

ということがわかりました。

異なるアプリケーションは別のNamespaceで管理したかったため、全部を一つのNamespaceで管理することは避けたく、原因を調査しました。
(全て同じNamespace内にデプロイする方法は[公式のドキュメントに記載があります](https://preliminary.istio.io/docs/tasks/traffic-management/secure-ingress/#configure-a-tls-ingress-gateway-for-multiple-hosts))

## 原因: GatewayリソースはNamespace間で共通
今回の問題の調査として大いに参考になったのが[こちらのGoogle groupのディスカッション](https://groups.google.com/forum/#!topic/istio-users/QFUcc4AV4Jk)。

> gateways are not namespaced -they are common across all namespaces.

これが全てでした。Gatewayは複数デプロイすると互いに干渉するようです。
([Issue](https://github.com/istio/istio/issues/6046)も立っていますが、仕様かバグかよくわからない)

じゃあNamespace分割するにはどうしたらいいんだ…？と思ったのですが、kube-dnsを使えば解決できます。
k8s内のリソースの名前解決は

```
<service-name>.<cluster-namespace>.svc.cluster.local
```

が使えるので、これをVirtualService > destination > host に記載すれば、Namespaceをまたいでサービスディスカバリが可能になります。

コードでは下記の感じです。

```yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
 name: common-istio-gateway
spec:
 selector:
   istio: ingressgateway # use istio default controller
 servers:
 - port: #マルチドメインの場合は、certificateなどを別名で(another-tls.crtなど)Secretとしてデプロイし、この項目を増やしていく
     number: 443
     name: https
     protocol: HTTPS
   tls:
     mode: SIMPLE
     serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
     privateKey: /etc/istio/ingressgateway-certs/tls.key
   hosts:
   - my-app1.example.com
   - my-app2.example.com
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: my-app1
spec:
 hosts:
 - my-app1.example.com
 gateways:
 - common-istio-gateway
 http:
 - route:
   - destination:
       host:
         my-service1.my-app1.svc.cluster.local
       port:
         number: 80
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
 name: my-app2
spec:
 hosts:
 - my-app2.example.com
 gateways:
 - common-istio-gateway
 http:
 - route:
   - destination:
       host:
         my-service2.my-app2.svc.cluster.local
       port:
         number: 80
```

Namespaceをまたいで共通のリソースなので、全てdefault namespaceにデプロイすることにします。
これで無事マルチホスティングができました。

## 補足
さきほどのディスカッションにて

> Also, I would suggest launching different gateway controllers for each gateway spec, instead of adding multiple gateways to the same controller (istio: ingressgateway).

ということが述べられており、Controllerを複数作成することで複数Gatewayも可能のようですが、まだ試していません。
Python3 のソースを JavaScript に移植する際にFunction作った

## 備忘用
疲れた。。
ほとんどstackOverFlowからもらった。

`values = dict((s, hoge) for s in foo)`
こういうことができるPythonはズルいなと思いました。

<hr/>

```js
// ### common function.
let zip = function(){
  let args = [].slice.call( arguments );
  let shortest = args.length == 0 ? [] : args.reduce( function( a, b ){
    return a.length < b.length ? a : b
  });

  return shortest.map( function( _, i ){
    return args.map( function( array ){ return array[i]} )
  });
}

let dict = function( ary ){
  let ret = {};
  for ( let key in ary ){
    ret[ ary[ key ][0] ] = ary[ key ][1];
  }
  return ret;
}

let dict_dual = function( ary, val ){
  let ret = {};
  for ( let key in ary ){
    ret[ ary[ key ] ] = val;
  }
  return ret;
}

let all = function( iterable ){
  if ( ! iterable ) return false;
  for ( let idx = 0; idx < iterable.length; ++idx ){
    if ( !iterable[ idx ] ) return false;
  }
  return true;
}

let set = function( ary ){
  return ary.reduce( function( a, val ){
    if ( a.indexOf( val ) === -1 ){
      a.push( val );
    }
    return a;
  }, [] );
}

let randomChoice = function( ary ){
  return ary[ Math.floor( Math.random() * ary.length ) ];
}

let len = function( obj ){
  if ( /\[object Array\]|\[object String\]/.test(
    Object.prototype.toString.call( obj ) )
  ){
    return obj.length;
  }
  throw "TypeError: arguments is illegal.";
}
```
SequelでPostgreSQLのバイナリデータを扱う

PostgreSQLには`bytea`という型があり[^1]、バイナリデータを表現することができます。

[Sequel](https://github.com/jeremyevans/sequel)で`bytea`型を取り扱う方法を解説します。

## migration

マイグレーションファイルは以下のように書きます：

```001_create_table.rb
Sequel.migration do
  change do
    create_table :some_table do
      bytea :content1 # => PostgreSQL固有の書き方
      File  :content2 # => PostgreSQLではbytea型として解釈され、他のRDBMSではblob型などとして解釈される
    end
  end
end
```

## insert

insertは以下のように書きます：

```insert.rb
binary_data = File.read('hoge.png')
content = Sequel::SQL::Blob.new(binary_data)
DB[:some_table].insert(content1: content)
```

`String` をそのままinsertすることはできません。`Sequel::SQL::Blob` [^2] に変換する必要があります。

## select

selectは以下のように書きます：

```select.rb
content = DB[:some_table].first.content1
File.write('some_image.png', content.to_s)
```

データベースから取り出した値は `Sequel::SQL::Blob` [^2] になっています。`#to_s`メソッドを呼ぶことで元のバイナリデータを取得することができます。

[^1]: https://www.postgresql.jp/document/9.0/html/datatype-binary.html
[^2]: https://sequel.jeremyevans.net/rdoc/classes/Sequel/SQL/Blob.html
【翻訳記事】Flutterでの必須スキルとは？

# はじめに
本記事は[Essential Flutter Skills](https://hackernoon.com/essential-flutter-skills-2466d91d3926)の翻訳記事です。
原著者はFlutterアプリのオンライン指導教室やっているプロなので、
それなりに信頼できる記事かと思います。

誤訳などありましたら、ご指摘いただけると幸いです。
![1_tZb_x5AIsUWcClGqIUZE6Q.jpeg](https://qiita-image-store.s3.amazonaws.com/0/190712/45fc2ad4-b34f-4bd9-c357-0162dc574272.jpeg)
# Introduction(はじめに)
**Flutterはこの1年間を通じて爆発的な人気**をえて、私はモバイルアプリ開発に多くの新人が参画するのを見てきました。わたしにとって、世界中の開発者が効果的にFlutterを学ぶことができるように指導・参画することは本当にエキサイティングで価値あるものでした。だから私は今月[指導コース](https://fluttercrashcourse.com/)を新設しました。

本稿では、**学習スタイル**、（学習に）**効果的だと思うこと**、そして最終的にはFlutterエンジニアが偉大なモバイルアプリの開発に成功するための、必要ないくつかの**コアスキル**について考察します。

# How Are You Learning, Exactly?（どうやって勉強してる？）
私が見るに2タイプの開発者がいます。 1つのタイプの開発者は、公式のドキュメントから簡単に始め、いくつかのランダムな例を試して、回答の多くの部分をスタックオーバーフローに依存しています。ここに問題があります：

- 遊びならば大丈夫ですが、いつでもすぐには必要としない機能を使って遊んでいるなら、効果的な時間の使い方とは言えないです
- スタックオーバーフローの答えが品質の低いコード例が含まれています。私は一般化しているように聞こえますが、若い開発者においてはあまりにも頻繁に(私の経験上では、)このようなことが起こっています。

もう1つのタイプの開発者は、学習するために必要なものについて計画を立て、いくつかの簡単なサンプルアプリケーションを作成し、最も重要なのは第1日から適切に学ぶために質の高いコンテンツを見つけることを行います。個人的には、最初は適切な本を読んで、必要なものごとをそろえてから、自分でアプリを書くのが大好きです。

そしてこの記事は、上述の後者の開発者、つまり有能な開発者になるために必要なものを集中的・効果的に学習する開発者に焦点を向けて書いています。

# Essential High Level Skills(必須のハイスキルとは)
私はアプリの90％で多くの繰り返しパターンを見てきました。パターンは、画面とウィジェットという2つの主要な領域に分類できます。あなたは個人学習の目標として以下を設定できます。もしあなたがコーディングサンプルを用いてに作業している場合ならば、これらサンプルから作成していくことは、あなたにとって重要なマイルストーンとなるでしょう。

## Milestone #1: A Product Detail or User Profile Page(1.詳細とプロフィールページ)
この場合、一番上にスタイリッシュな画像やアバター、洗練されたテキスト、テキストを含むセクションリストがあり、それが本当に大部分です。

## Milestone #2: Lists(2.リスト)
ニュースフィードを考えると、垂直方向にスクロールし（無限にする必要はありません）、どこかのデータソースによってバックアップされます。各項目は、クリーンな「[DRY](https://qiita.com/yatmsu/items/b4a84c4ae78fd67a364c)」アプローチで実装されています。

## Milestone #3: Forms(3.フォーム)
これは、ログインフォームまたは登録フォームまたは編集フォームです。フォームはモバイルアプリの中心であり、見た目よく機能するデザインフォームは素晴らしいものです。

# Essential Widgets for Newcomers(初心者用の必須ウィジェットとは？)
上述のリストアップに対してFlutter固有のウィジェットで必要性を補うつもりですが、少なくとも私にとっては、Flutter開発技術を自信に満ちたレベルに到達するためには基本的なものだと考えます。

注意:多くのウィジェットがあります、大事なことは、基本的なものに焦点を当てることです。初心者が習得することをお勧めするウィジェットを伴うスキルのスターターセットは以下です：

- MaterialApp、Scaffold、およびAppBarを使用して画面をレンダリングするための基本。
- 列(Column)と行(Row)を使用したレイアウトの基本。
- コンテナ(Container)を使用してコンテンツの領域をグループ化して飾る基礎。
- テキスト(Text)とイメージ(Image)ウィジェット、特にAssetImageとNetworkImageを使用したもの
- GestureDetectorを使用して柔軟なカスタムボタンを作成する。
- フォント、テキストスタイル、および色を使用してアプリケーションをカスタマイズする。
- DartとJSONを使用したAPIの操作

私はあなたが言うことであろうことを知っています。これは非常に基本的なリストですが、あなたはこれだけで達成できるものに驚くでしょう。私はいつも人々に、これより多くのウィジェットを使って外に出る前に（難しいアプリを作成する前に）、基本的な仕組みをもったシンプルなアプリを最初に書くことに集中するべきだといいます。
>I know what you’re saying, this is a very basic list, but you’d be surprised what you can achieve with just this. I always say to be people to focus on writing dead simple apps first with the basic skills you have before going overboard on using more widgets than this.

あなたはそれらを提出する必要はありません。単に友人や家族にそれらを見せるだけでよいのです。要点は、このプロセスで学んだこと以上に、一貫したアプリを作ることです。要するに、やって学ぶことです！

あなたは私の無料の[Flutter動画コース](https://fluttercrashcourse.com/)をチェックすることができます。これらはすべてこれらの基本的なことをカバーしています。また、定期的にFlutterのTipsを書いている私のTwitterのフォローをお願いいたします。
Windows10でnpm install -g hogeしたものがcommand not foundになる

## この記事 is 何
Windowsで`firebase-tools`をインストールしたのだけど、なぜかコマンドが存在しないって怒られたときの、私の場合の対処法

## 原因
**Pathが通ってなかった**

インストールされたパッケージのPathを通せばOK。

## 症状とか
以下のようにして`firebase-tools`をインストール

```
PS C:\> npm install -g firebase-tools
```

これでコマンドが使えると思いきや…

```
PS C:\> firebase
firebase : 用語 'firebase' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識され
ません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行して
ください。
発生場所 行:1 文字:1
+ firebase
+ ~~~~~~~
    + CategoryInfo          : ObjectNotFound: (firebase:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

PS C:\>
```

Pathを調べてみる

```
PS C:\> npm bin -g
C:\Users\takuma\AppData\Roaming\npm
(not in PATH env variable)
```

上記の通り、Pathが通ってないことが確認できたので、通常通りPathを追加したら…

```
PS C:\> firebase
Usage: firebase [options] [command]

Options:
  -V, --version                              output the version number
  -P, --project <alias_or_project_id>        the Firebase project to use for this command
  -j, --json                                 output JSON instead of text, also triggers non-interactive mode
  --token <token>                            supply an auth token for this command
  --non-interactive                          error out of the command instead of waiting for prompts
  --interactive                              force interactive shell treatment even when not detected
  --debug                                    print verbose debug output and keep a debug log file
  -h, --help                                 output usage information
～～～～～～～～～ 略 ～～～～～～～～～
```
割線法（非線形方程式の数値解法）

# 割線法とは
- 非線形方程式の数値解法の一つ
- [Newton法](https://qiita.com/omu58n/items/dc2368da350b13bcaf30)では、一階の微係数が必要だが、方程式によってはこの計算はしばしば困難
- 微係数を数値的に求める

![qiita-num-3.png](https://qiita-image-store.s3.amazonaws.com/0/299208/1ccb6ad9-3310-2890-5fe4-d2a2487e6c0b.png)



# 算法
#### 初期値
$x_0,x_1$ : 適当な方法で決める
#### 反復手順
$x_{n+1}=x_n-f(x_n)\frac{x_n-x_{n-1}}{f(x_n)-f(x_{n-1})}$
#### 停止則
- 更新量が小さい：$|f(x_n)\frac{x_n-x_{n-1}}{f(x_n)-f(x_{n-1})}|<\varepsilon_1$
- $f(x_n)$が$0$に近い：$|f(x_n)|<\varepsilon_2$

# サンプルコード
$f(x)=x^2-1$ 、初期値 $x_1=0.5,x_1=2$ として割線法を使って解を求めるプログラム。
$f(x_n)-f(x_{n-1})\neq 0$の確認とかを入れてないガバガバコード

```c:secant_method.c
#include<stdio.h>
#include<math.h>

double f (double x) {
  return x*x-1;
}

double df (double x_1, double x_2) {
  return (x_1 - x_2)/(f(x_1) - f(x_2));
}

double secant_method (double x_n, double x_n_1) {
  double new_x;
  while (1) {
    new_x = x_n - f(x_n)*df(x_n, x_n_1);
    if (fabs(f(x_n)*df(x_n, x_n_1)) < 1e-10) break;
    if (fabs(f(new_x)) < 1e-10) break;
    x_n_1 = x_n;
    x_n = new_x;
  }
  return new_x;
}

int main (void) {
  double alpha;
  alpha = secant_method(0.5, 2);
  printf("%f\n", alpha);
  return 0;
}
```

実行結果

```
1.000000
```

# 特徴
- $f^{\prime}(x)$の計算不要
  - $f^{\prime}(x)$が煩雑で微係数の計算が困難な時に有効
- 初期値二つ必要
  - 初期値によってはうまく収束しない
- [Newton法](https://qiita.com/omu58n/items/dc2368da350b13bcaf30)に比べ、反復回数が増加
画像等の配列を扱うときの操作方法

pythonの配列の操作の仕方は記事が多数ありますが

画像とかkerasに特化した
**作業に対してどう記述すればいいのか**をまとめてみました

ええ、自分用メモです



#画像を1枚だけNumpy配列にする（3次元）
(224,224,3)で入力
リサイズの時は**target_size=(224,224)**を変更
jpg,bmpは読込確認済み
裏でPILが動いているらしいのでおそらくpngも平気なはず

**※2018.10.23　pngも読み書きOKでした**


```python
from keras.preprocessing.image import load_img, img_to_array

img_path = ('./' + ファイル名 + '.jpg')
img_3 = img_to_array(load_img(img_path, target_size=(224,224)))
```

#3次元のNumpy配列をベクトル化する
3次元(224,224,3)をベクトル（1次元）化（150528）

```python
import numpy as np

img_1 = np.ravel(img_3)
```

#3次元のNumpy配列を4次元にする
Kerasで使用する、最初にサンプル数のついた4次元配列にする(1,224,224,3)

```python
img_4 = img_3[None, ...]
```

#4次元のNumpy配列を3次元にする
4次元配列(1,224,224,3)からサンプル数の位置を指定して3次元配列に（224,224,3）

```python

#iはサンプル数の指定、0から始まるので注意
i=0
img_3 = img_4[i,:,:,]
```

#フォルダ内の画像を全部まとめて4次元のNumpy配列にする【ex.(10,224,224,3)】

```python
import glob
import numpy as np
from keras.preprocessing.image import load_img,img_to_array

#image  array size
img_size = (224,224)
#load images Folder
dir_name = 'test1'
#File type
file_type  = 'jpg'

#load images and image to array
img_list = glob.glob('./' + dir_name + '/*.' + file_type)

temp_img_array_list = []

for img in img_list:
    temp_img = load_img(img,grayscale=False,target_size=(img_size))
    temp_img_array = img_to_array(temp_img) /255
    temp_img_array_list.append(temp_img_array)

temp_img_array_list = np.array(temp_img_array_list)

```

細かい話は下記参照
https://qiita.com/tom_eng_ltd/items/286a8012527a3dd3c542

#4次元のNumpy配列を2次元にする
4次元配列【ex.(10,224,224,3)】から2次元配列に【ex.(10,150528)】
**SVMへの入力とかに使用できます**

```python
#保存先の配列を確保
temp_img_array_list = []

for i in range(10):
    #4次元データから3次元データを取り出し
    temp_img = img_4[i,:,:,]
    #3次元をベクトル（1次元）化
    temp_img = np.ravel(temp_img)
    #変換したNumpy配列を末尾に追加
    temp_img_array_list.append(temp_img)

#Numpy配列をリスト化
img_list = np.array(temp_img_array_list)
```
#フォルダ内の画像を全部まとめて2次元配列化【ex.(10,150528)】
```python
import glob
import numpy as np
from keras.preprocessing.image import load_img,img_to_array

#image  array size
img_size = (224,224)
#load images Folder
dir_name = 'test1'
#File type
file_type  = 'jpg'

#load images and image to array
img_list = glob.glob('./' + dir_name + '/*.' + file_type)

temp_img_array_list = []

for img in img_list:
    temp_img = load_img(img,grayscale=False,target_size=(img_size))
    temp_img_array = img_to_array(temp_img) /255
    temp_img_array = np.ravel(temp_img_array)
    temp_img_array_list.append(temp_img_array)

temp_img_array_list = np.array(temp_img_array_list)
```

#Conv2Dの特長量から1ch抜き出す
特長量マップの4次元配列は「layer_output」とする（ex.1,14,14,512）
そこから2次元（14,14）を抽出

```python
#iはチャンネル数で、この場合0-511
img_res = layer_output[0,:,:,i]
```

#Conv2Dの特長量からマップの行列サイズとチャンネル数を取得する
特長量マップの4次元配列は「layer_output」とする（ex.1,14,14,512）

```python
#G:行　R：列　ch：チャンネル数
G, R, ch = layer_output.shape[1:]

#G = 14
#R = 14
#ch = 512
```
#4次元の画像配列から一部分を取り出し
cifar10とかのデータセットから必要数だけ取り出したい時とかに
x_train（50000,32,32,3）からx_train（1000,32,32,3）へ

```python
#1000枚目まで
x_train = x_train[:1000]

#49000枚目以降の1000枚
x_train = x_train[49000:]

#1000-2000枚目の1000枚
x_train = x_train[1000:2000]
```
[GAS] Google フォームの保存先を変更する

# イントロダクション
## 背景
Google フォームを大量生成する際にフォルダを管理し、データを整理したい。
## 目的
生成したGoogle フォームを指定したフォルダに移動させる。
## 目標
指定したフォルダに生成したGoogleフォームをコピーして、元々のGoogle フォームは削除する。

# ソースコード
下記のプログラムの ID の箇所を自身のフォルダーIDに変更して実行してください。

```javascript
function mySF2(){
  var form = FormApp.create("新規ページの移動")
  var folder_ID = 'ID';
  var form_ID = DriveApp.getFileById(form.getId());
  DriveApp.getFolderById(folder_ID).addFile(form_ID);
  DriveApp.getRootFolder().removeFile(form_ID);
}
```

# 参考文献
- Class DriveApp, https://developers.google.com/apps-script/reference/drive/drive-app, 2018/10/14 アクセス
vimgolfをやろう！

## vimgolfとは
https://www.vimgolf.com/

## 準備
サインインにはTwitterアカウントが必要。
アカウント登録後、TOPに記載されている通りにセットアップする。

```shell
Your VimGolf key: please sign in

$ gem install vimgolf
$ vimgolf setup
$ vimgolf put [challenge ID]
```
※ ruby必須, winでもたぶんできると思うけど上記コマンドになるかは不明

## vimgolfのコツ
普通では使わなそうな処理がいくつか必要に見える。
まだまだあると思うので、思いついたら書き足す。
（普通に業務利用する技術は記載しない）

### ファイル保存
通常は `:wq` とするが `ZZ` を使うことで1文字短縮する。
ZZを使うと、変更しなくてもファイルタイムスタンプが矯正で上書きされるようだが、使う人は通常業務でも使うのかも…？

### マクロ登録
通常は `qa{macro操作}q` でマクロ登録し `｛繰り返し回数}@a` などでマクロを実行する。
vimgolfでは `i{macro操作}<Esc>` でマクロを `.` に登録し `{繰り返し回数}@.` でマクロ実行する。
これによって1打少なくマクロの登録＆実行が可能。
[Minecraft 1.12.2] MOD EntityCount

# EntityCount

Minecraft client side MOD to count the number of entities such as villagers, animals, enemies, picture frames and others

村人・動物・敵・額縁などのエンティティの個数を数えるMinecraftのクライアントサイドMOD

# Install

## Environment(First release)

- Java: 8 or later
- Minecraft: 1.12.2
- Forge: 14.23.5.2768

## Download

https://github.com/MirrgieRiana/EntityCount/releases

# Usage

## Display the measurement window

1. Create a stick named `EntityCount.show`.
   ![2018-10-14_16.04.49.png](https://qiita-image-store.s3.amazonaws.com/0/280627/dffd7643-deff-1d99-5e37-60332dd7972e.png)
2. Right click holding the stick to display the measurement window.
   ![2018-10-14 16_09_44-EntityCount.png](https://qiita-image-store.s3.amazonaws.com/0/280627/f35e4aac-b301-92aa-396c-eefc217915fc.png)

## Usage of measurement window

The window has an internal entity list. When the measurement is performed, all the entities which the client knows are added to the internal entity list and refresh the UI. However, entities with duplicate UUIDs are not counted in multiple. So even if measurements are taken at the same place, the list will not increase excessively. Even if an entity dies, it will not be removed from the list.

Entities which clients can obtain are limited in distance. So walk around in the large city to cover the entities of there.

- The `Measure` button will perform one measurement immediately. 
- The `Continuously Measure` toggle button measures every 5 seconds.
- The `Clear` button will clear the internal entity list.
- In the upper text area, the internal entity list is displayed.
- In the lower text area, the number of entities for each class is displayed.
- In the bottom label, the total number of entities is displayed.

![2018-10-14 16_33_38-EntityCount.png](https://qiita-image-store.s3.amazonaws.com/0/280627/b3c17d64-46ff-6bba-3fc1-51605ee88fc8.png)

Please paste it in Excel and process it.
TimeLineから条件によって、呼び出すTimeLineを変える方法の失敗談

#開発環境
    Unity2018.2.3f1
    VisualStudio2017Community
    C# ver7.2?

#お詫び
ここでの記事で行ったことは、あくまでもEditor上での挙動での確認だったため、起こりえたことであって、
何かしらの媒体にて吐き出した際に、Evenetでの呼び出しが行われることが、少なくとも、このVerでは、起こらないものでした。なので、以下の内容は、UnityEditor上ではイベントチェックがうごいてしまうように見えてしまう失敗談（書き方はそのように書いてませんが）なので、ご注意の上お読みください。


#この記事の対象者
UnityのTimeLine機能をつかって、<b>無理やり</b>でも何かしらのイベントを起こす仕組みを考えたい人
とりあえずTimeLineを触りたい人

#注意書き
この記事に書いている内容は、本来であるつくり方から逸脱している可能性はあります。
そのため、あくまで、そんな使い方もできなくはない。ホンマでっか！の精神で参考にしていただけると幸いです。

また、それを実現するのに、こういうやり方あるよっていうのがあれば教えて下さい。
よろしくお願いいたします。


#今回この記事を書くにあたって実装したもの

図でざっくり表すと以下のような感じ

![遷移図.jpg](https://qiita-image-store.s3.amazonaws.com/0/101366/f0436e18-476a-cd88-1fcb-a94261f86c52.jpeg)

最初のTimeLine1の流れているタイミングで、<b>特定の期間</b>のみ、<b>条件</b>を判定して、そのタイミングから、次のタイミングへと遷移を行うと
いった感じの構造です。




#内容
どうやってイベントを発生させるか？アニメーションイベント単体のものに、呼び出す関数を設定してあげて
そのタイミングまでに、変わったかどうかを管理している側で呼び出された際に、
そのタイミングで、TimeLine2を再生するか？TimeLine3を再生するか？を決める感じになります。

なので、具体的なクラスとしては以下のようになります

```　DirectorManager.cs

    //以下の参照に切り替えるようのTimeLineを設定しておく。

    [SerializeField]
    private PlayableDirector timeline2;

    [SerializeField]
    private PlayableDirector timeline3;

```

なお、これは、勝手に再生を行わないように、PlayableDirector自身のenableはfalseの状態で、
Hielarchyに配置されているものとします。

そして、このクラスに対して、

 
```  DirectorManager.cs

//イベントチェックを行う
public void EventCheak()
{
   if(状態をみたしているか？)
   {
      timeline2.enable = true;
      timeline.time = 0;//再生位置を調整
      timeline.Play();//再生
   }
　　else
   {
      timeline3を上記のように行う。
   }

}

```


この関数をAnimationから呼び出すようにしています。

これが呼び出されていた際に、イベントとして判断してあげることができます。

場合によっては、そのイベントによって、このManagerのクラスが、再生するタイムラインを再生する感じになります。


##AnimationからEvent呼び出しを行う

では、これをどのようにTimeLineに組み込むか？
手順として、私がやったのは以下の手順
1.適当なGameObject作成（Event確認が必要な関数を保有するGameOBject）
2.TimeLineにAnimationTrackを追加し、先ほどのObjectを入れ、CreateAnimation　onGameObjectを選択
3.Record状態に行い適当に、何かRecordしたのち、ダブルクリックしてAnimationの編集画面を出す
4.Animationの編集画面にて、AddEventを行う。

で可能です。


#最後に
この方法は、短期的に行う分には、一つの方法ではあるのですが、長期的、プロダクト的には、不向きな作りにはなる方法かと思います。