OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidアプリにFirebase Analytics導入

# はじめに
AndroidアプリにFirebase Analyticsを導入する手順です。
Firebase公式ドキュメントの[Android プロジェクトに Firebase を追加する](https://firebase.google.com/docs/android/setup?hl=ja)を読んで導入したほうが間違いがないです。
読んだ後に不安になったり難しいと感じた場合は、導入までの流れをスクショを貼って補足を添えて説明しているこの記事が有効だと思います。

# 手順
## 1. AndroidStudioの`Tools>Firebase`を開く
<img width="342" alt="スクリーンショット 2019-04-27 22.43.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/a2447be7-cb2d-2d65-5b3f-125aa2cb6ead.png">
すると右のタブの`Firebase Assistant`が開きます。
<img width="490" alt="スクリーンショット 2019-04-27 22.44.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/b874f965-f9c6-828c-f872-6115d49e94bd.png">

## 2. Analyticsの項目から`Connect to Firebase`を押す
<img width="485" alt="スクリーンショット 2019-04-27 22.45.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/c8590c97-668c-8f5e-2a89-69c7af8d99a8.png">
するとこんな画面が出てくるのでFirebaseのプロジェクト名を記入しConnect to Firebaseを押します。
<img width="694" alt="スクリーンショット 2019-04-27 22.50.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/4ff9b9c7-db13-b019-a8ec-b4ad54016f65.png">

## 3. 3点の確認項目
これまでの手順がうまくいっている事を確認するために、以下の3点を確認します。

- 「Connect your app to Firebase」が`Connected`になっている事
<img width="455" alt="スクリーンショット 2019-04-27 22.51.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356260/f9321f47-fec9-9bda-d801-81d52ced7e2e.png">
- Androidプロジェクトに`google-services.json`が作成されている事
- Firebaseのコンソール画面にさきほど入力した名前のプロジェクトが作成されている事

## 4. Analyticsをアプリに入れる
次にgradleにAnalyticsを入れますが上記のスクショにある「2 Add Analytics to your app」をポチると入れられます。
しかし、確認すると古いバージョンである`16.0.4`が入れられていました。
`implementation 'com.google.firebase:firebase-core:16.0.4'`
最新のバージョンにしたいので`16.0.8`に修正しました。(2019-4-28)
`implementation 'com.google.firebase:firebase-core:16.0.8'`

Syncして導入は完了です。
何故かpipがタイムアウトするのだが、Wi-Fiでテザリングしたらあっさりクリア

自宅の環境でpipを実行すると何故かタイム・アウトするのですが、もしかしたらネットワーク環境が良くないのかと思い、Wi-Fiのテザリングで接続したら普通に動きました。
Why?

## pipの設定でなんとかしようとした

ネットで調べると、pipのオプションに `--default-timeout=100` とかすると良いとか、書いているのですが、一向に改善しません。

## 考え方を変えてみた

もしかしたら、ネットワーク環境が悪いのかと思い、自宅のWi-Fiからスマホのテザリングに切り替えてみました。
すると…。
あっさり成功。
プロバイダから、pypi.orgが遠いのでしょうか。

## 2019/4/30追記

802.11aを使っていたのですが、802.11gに切り替えてみてもあっさり成功しました。
PCか無線LANルーターが悪いのかな。
今年の言語はRust その４２

# 今年の言語はRust その４２

Rustを学びます

Rustの日本語ドキュメント 2nd Edition
https://doc.rust-jp.rs/book/second-edition/

オリジナル(英語)
https://doc.rust-lang.org/book/


## 実行環境

```sh
$ cargo -V
cargo 1.33.0 (f099fe94b 2019-02-12)

$ rustup -V
rustup 1.17.0 (069c88ed6 2019-03-05)

$ rustc --version
rustc 1.33.0 (2aa4c46cf 2019-02-28)

$  cat /proc/version
Linux version 4.14.97-74.72.amzn1.x86_64 (mockbuild@gobi-build-64002) 
(gcc version 7.2.1 20170915 (Red Hat 7.2.1-2) (GCC)) 
#1 SMP Tue Feb 5 20:59:30 UTC 2019

$ uname -a
Linux ip-10-100-0-8 4.14.97-74.72.amzn1.x86_64 
#1 SMP Tue Feb 5 20:59:30 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/\*release
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Amazon Linux AMI release 2018.03

```

## 15 スマートポインタ

### 15.1 ヒープのデータを指す'Box<T>'を使用する

下記の例では、'Box'を使って、ヒープ領域に'i32'のデータを格納しています

```rust
fn main() {
    let b = Box::new(5);
    println!("b = {}", b)
}
```

> ヒープに単独の値を置くことはあまり有用ではないので、このように単独でボックスを使用することはあまりありません

#### ボックスで再帰的な型を可能にする

再帰的な型の場合、コンパイラは領域サイズを知ることができない。

しかし、ボックスは既知のサイズなので、再帰的な型の定義にボックスを挟むことで、__再帰的な型__ を存在可能

#### コンスリストについて

```rust
enum List {
    Cons(i32, List),
    Nil,
}
```

```rust
use List::{Cons, Nil};

fn main() {
    let list = Cons(1, Cons(2, Cons(3, Nil)));
}
```

これはコンパイルエラーになります。
ListがListを含んでおり、再帰的な定義となっているからです。


#### 非再帰的な型のサイズを計算する

```rust
enum Message {
    Quit,
    Move {x:i32, y:i32},
    Write(String),
    ChangeColor(i32, i32, i32),
}
```

Boxを使って定義するとこうなります

```rust
enum List {
    Cons(i32, Box<List>),
    Nil,
}


fn main() {

    let list = List::Cons(1, Box::new(List::Cons(2, Box::new(List::Nil))));
}
```

頭がおかしくなりそう。

Consは'i32'と'Box(usize)'を保持するだけで、サイズが既知になります。

Boxは間接参照のためのスマートポインタ?なので、ポインタサイズ(usize)あればよいのです。

usizeは環境依存し32bit or 64bitなので、メモリの番地ですね。


イエス！
bitbucketを使ったリモートリポジトリ作成（サーバー 上のローカルリポジトリと同期）


#1. bitbucketでリポジトリ作成
#2. bitbucketのリモートリポジトリとローカルリポジトリを接続

```
$ git remote add origin git@bitbucket.xxx/xxx.git
$ git push -u origin master

The authenticity of host 'bitbucket.org (xxx)' can't be established.
RSA key fingerprint is xxxxxx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'bitbucket.org,xxx' (RSA) to the list of known hosts.
git@bitbucket.org: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

 　<b>[問題]</b>
　bitbucketに追加した秘密鍵がサーバーには登録されてなかったためサーバー経由で接続時に権限がないと怒られる

　<b>[解決策]</b>

```
$ ssh-add ~/.ssh/id_rsa
$ ssh -A root@xxxx
```
#3. ローカルリポジトリ(サーバーでない)にクローン

```
$ git clone git@bitbucket.org:xxx/xxx.git
```

#etc.
git commitの時、ubuntuサーバーだったためエディタがnanoに設定されていたのでviに設定

```
$ git config --global core.editor "vi"
```
インフラの勉強前に押さえておきたい最低限の基礎知識③〜トランスポート層について〜

## 概要
インフラの勉強の基礎となる知識の概要をまとめたものです

## 対象
インフラ周りの勉強を始めようとしてる業務経験の浅い初心者

## 目次
- プロトコルの種類
- TCP
- UDP

## トランスポート層とは
トランスポート層は一言で言うと、アプリケーション層に正しくデータを送るための階層です。
データの送受信で、どんな風にデータを受送信したり、ミスがないかチェックしたり、正しい宛先まで届けるのかについての部分です。

## トランスポート層のプロトコルは何があるのか。
トランスポート層のプロトコルは主に２種類です。

- TCP・・・データの正確性を重視するプロトコル。基本的にはこのプロトコルが採用されている。
- UDP・・・データの高速性・複数性などを重視するプロトコル。電話やライブ配信などで採用されている。

## PORT番号とは

送られてくる様々なパケットを適切なアプリケーションに渡さなければなりません。そのための識別に使用されるのがPORT番号です。

PORT番号は0~65535番まであります。

0~1023→ウェルノウンポート
1024~49151→レジスタードポート
49152~65535→ダイナミックポート

上記のように分かれています。

ウェルノウンポート・・・ホスト側のサーバー用のプログラムが、リクエストなどの待ち受けに使用するポート番号です。通信などの処理ごとに固定されています。

ダイナミックポート・・・クライアント側で動的に使用するポート番号。

## 通信の流れ

①クライアント側のアプリにダイナミックポートを割り当てる
②ホスト側に接続を要求する
③ホスト側と接続できたら、①で割り当てられたダイナミックポートをホスト側に解放する。

#### ホスト側はなぜ複数の接続を区別できるのか？

ホスト側は、全てのリクエストを同一のPORT番号で受け付けます。（例えばHTTPなら８０番）

複数のアクセスをそれぞれ別個に処理できるのは、PORT番号とIPアドレスの組み合わせで端末を区別しているからです。

## TCPとは何か
TCPとはトランスポート層で使用されるプロトコルの一種であり、web, FTP, emailなどの確実に正しいデータを届けたいときに使用されます。

#### TCPヘッダーとは何か
TCPプロトコルにおいては、データはセグメントと呼ばれる分割された単位で送信されます。
各セグメントには、TCPヘッダーと呼ばれるものが付加されます。

####TCPヘッダーの構造
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281917/8573ff1b-0395-9ef4-36cb-1138275c0731.png)
>TCP/IP - TCP headerより引用
>https://www.infraexpert.com/study/tcpip8.html

- シーケンス番号・・・送信ずみのバイト数を表す
- 確認応答番号・・・受信ずみのバイト数を表す
- データオフセット・・・TCPヘッダーのバイト数
- ウィンドウサイズ・・・まとめて送信可能なデータサイズ
- チェックサム・・・データが壊れてないかの情報
- コントロールフラグ・・・データの送信状況を自動で制御するためのフラグ。上の画像にはないフラグもあり、CWRフラグは回線が混雑しているので送信量を減らしたことを示すなど、それぞれのフラグが意味をもつ。

####TCPの通信の方法
TCPの通信はコネクションを確執するところから始まる（３ウェイ・ハンドシェイクと呼ばれている）
①クライアント側が、コントロールフラグのSYS(接続を開始する際に使う)をオンにしたデータをホストに転送する
②ホスト側はコントロールフラグのSYSとACK（応答できたことを伝えるフラグ）をオンにしたデータをクライアントに送る
③クライアント側がコントロールフラグのACK（応答できたことを伝えるフラグ）をオンにしたデータをホストに送る
④データのやりとりが始まる

※4月9日Nobu12様の指摘を受け追記

####シーケンス番号と確認応答番号
シーケンス番号・・・一連の通信の中で、実際に受け取ったデータ量が全て加算したもの
確認応答番号・・・一連の通信の中で、要求されて送信したデータ量を全て加算したもの

クライアントのシーケンス番号とホストの確認応答番号は基本的に一致する。
逆にクライアントのホスト番号とホストのシーケンス番号も一致する。

####通信失敗の際にどう処理されるのか
TCPでは、複数のセグメントが同時に送られます。その中で途中のデータが抜け落ちてしまった場合、複数を同時に送っているためにシーケンス番号と確認応答番号のズレが生じます。

そんな時には、SACKという特定のパケットのみを再送信する事ができるサービスも用意されています。

##UDPとは
高速に送ることを重視したプロトコル。データの抜け落ちなどが生じるが、音声サービスや動画サービスなどで用いられる。

####UDPヘッダー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281917/fc98ff30-391e-99d6-0d87-1078e85bb9ca.png)
>第13回　データグラム通信を実現するUDPプロトコル (3/4)より引用
>https://www.atmarkit.co.jp/ait/articles/0310/09/news001_3.html

####UDPの特徴
・接続の確認なしにデータを送信する
・データグラム（パケット）が欠落しても無視
・バッファから溢れても無視
・ブロードキャストとマルチキャストという一つのパケットを複数へ送信する機能がある（TCPにはない）
【Uipath】UiPath Orchestrator Communityからの接続に詰まったときのメモ

#はじめに
10連休で10ロボ作るという目標をひっそりと掲げている私です。

ほかの作業の合間でなんとなくUiPath Orchestrator Community(以下OC)との接続を試してみたくなったので、そのときの記録を備忘録として残しておきます。

#目標
- 業務ロボットの実行方法として、OCからロボットを遠隔で起動する方法を試す。

#手順
- テナント登録からロボとの接続ついてはこちらの手順どおりに進めましたので、割愛
https://qiita.com/irohamaru/items/a2bbfb4e647f2cb9146b

## 問題
- OCと端末の接続、ローカルからUipathRobot経由での実行はうまくいったが、肝心のOCから実行すると、「保留中」となり、ロボットが実行されない

## 原因と対処
- ツイッターでつぶやいてみたところ、UipathJP様からこんなリプライが。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79318/ea1117bd-ccfb-f3a1-712b-48df96458bd3.png)
https://twitter.com/UiPathJapan_TS/status/1122551574117531648

https://robot.uipath.com/lang-ja/v2018.4/docs/converting-robot-deployment-type
貼られているURLの手順を参考に、RobotをWindowsサービスモードにしてサービスとして立ち上げると。

>Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

>C:\Windows\system32>TaskKill /F /IM UiPath.Agent.exe
エラー: プロセス "UiPath.Agent.exe" が見つかりませんでした。

>C:\Windows\system32>TaskKill /F /IM UiPath.Service.Host.exe
>エラー: プロセス "UiPath.Service.Host.exe" が見つかりませんでした。

>C:\Windows\system32>cd %localappdata%¥
>指定されたパスが見つかりません。

>C:\Windows\system32>cd %localappdata%

>C:\Users\■■■■\AppData\Local>cd UiPath

>C:\Users\■■■■\AppData\Local\UiPath>cd app-19.4.2

>C:\Users\■■■■\AppData\Local\UiPath\app-19.4.2>
>C:\Users\■■■■\AppData\Local\UiPath\app-19.4.2>
>C:\Users\■■■■\AppData\Local\UiPath\app-19.4.2>UiPath.Service.Host.exe instal
l
>Configuration Result:
>[Success] Name UiRobotSvc
>[Success] DisplayName UiPath Robot
>[Success] Description UiPath Robot Service
>[Success] ServiceName UiRobotSvc
>Topshelf v4.0.0.0, .NET Framework v4.0.30319.42000

>トランザクションのインストールを実行中です。

>インストール段階を開始しています。
>Installing UiPath Robot service
>サービス 'UiRobotSvc' をインストールしています...
>サービス 'UiRobotSvc' は正常にインストールされました。

>インストール段階が正常に完了しました。コミット段階を開始しています。

>コミット段階が正常に終了しました。

>トランザクション インストールが完了しました。

>C:\Users\■■■■\AppData\Local\UiPath\app-19.4.2>Net Start UiRobotSvc
>UiPath Robot サービスを開始します.
>UiPath Robot サービスは正常に開始されました。


>C:\Users\■■■■\AppData\Local\UiPath\app-19.4.2>

無事に、OCからロボットが起動されることを確認しました。

# 感想
- OCコミュニティでは1週間でテナントが削除されてしまうため、個人でOCを継続的に使うことは難しいですが、試すだけならこれで十分ですね。
- ツイッターでつぶやいたのはホントなんとなくだったんですが、まさか引用ツイートで助けてもらえるとは思ってませんでした。Uipathさんってこういうユーザーに近いところにいてくれるのが個人的には大好きです。

# まとめ
>cd %appdata%
>cd ..\
>cd Local
>Net Stop UiRobotSvc
>UiPath.Service.Host.exe uninstall
>UiPath.Service.Host.exe install
>Net Start UiRobotSvc
>pause
Design by Contractのメモ 

Design by ContractはDbCとよく呼ばれる
この記事の解説がわかりやすかった。
サーバーサイドで静的型付き言語だとController以外ではあまり使わないパターンかな(フレームワークがやっちゃってくれてる。
https://blog.ohgaki.net/design-by-contract-and-trust-boundary
Railsを5.2から6.0へアップデートする時にハマったポイント

Rails5.2で作ったシステムを6.0にアップデートした際に、ハマったポイントをまとめました。

|元のバージョン|アップデートしたバージョン|
|:--------:|:----------------:|
| 5.2.2    |  6.0.0.beta3     |

# 1. Webpackerの標準インストール
Rails6では、`Webpacker`が標準でインストールされるようになりました。

- 参照
 - [Make Webpacker the default JavaScript compiler for Rails 6](https://github.com/rails/rails/pull/33079)

というわけで、Rails5.2までで`Webpacker`を入れていなかった場合は、インストールしましょう。

```shell
$ bundle exec rails webpacker:install
```

# 2. CoffeeScriptからES2015(ES6)への変換
Rails6では、`ActionCable`のjavascriptパッケージが`CoffeeScript`から`ES2015`(`ES6`)に変換されました。

- 参照
 - [Ruby on Rails 6.0 Release Notes](https://github.com/rails/rails/blob/master/guides/source/6_0_release_notes.md#notable-changes-1)

というわけで、もしRails5.2までで`CoffeeScript`を使っていると、以下のエラーが発生します。

```shell
LoadError: cannot load such file -- coffee_script
```

これは、tmpディレクトリ下のキャッシュをクリアすればOKです。

```shell
$ bundle exec rails tmp:cache:clear
```

# 3. `ActionDispatch::HostAuthorization`の導入
Rails6では、`DNSリバインディング`や`Hostヘッダインジェクション`の対策として、`ActionDispatch::HostAuthorization`が導入されました。

- 参照
 - [Guard against DNS rebinding attacks by permitting hosts](https://github.com/rails/rails/pull/33145)

## 3-1. `ActionDispatch::HostAuthorization`とは？
`ActionDispatch::HostAuthorization`は新たに追加されたミドルウェアで、ホワイトリストによってホストを認証します。
ホワイトリストによる認証なので、リストに登録されたホストは通しますが、それ以外のホストへのリクエストはエラーになります。

## 3-2. デフォルト設定
デフォルトでは、`development`にのみ以下3つの値が指定されています。

```ruby
Rails.application.config.hosts = [
  IPAddr.new("0.0.0.0/0"), # All IPv4 addresses.
  IPAddr.new("::/0"),      # All IPv6 addresses.
  "localhost"              # The localhost reserved domain.
]
```
というわけで、IPと`localhost`へのリクエストはデフォルトで通ります。

`staging`や`production`など`development`以外の環境は、デフォルトでは何も指定されていないので、自分で一からホストを指定する必要があります。

## 3-3. ホストの指定
ホストを指定する時は、`Rails.application.config.hosts`に以下のように追加します。

```ruby:myapp/config/application.rb
module MyApp
  class Application < Rails::Application
...
    config.hosts << "product.com"
...
  end
end
```

また、以下の形で追加すると全てのサブドメインを指定することができます。

```ruby:myapp/config/application.rb
config.hosts << ".product.com"
```

## 3-4. エラーメッセージ
ちなみに、[3-3. ホストの指定](#3-3-ホストの指定) を行わずに`product.com`でアクセスしようとすると、以下のエラーメッセージが出力されます。

```
Blocked host: product.com
To allow requests to product.com, add the following to your environment configuration:
config.hosts << "product.com"
```
やはりRailsのエラーメッセージは、対応方法まで親切に教えてくれますね。
[Android] [kotlin] ObjectAnimatorの生成をいい感じにしたい

# はじめに

少し前にAndroidアプリ開発に復帰しました。もう数年ぶりです。
いろいろとブランクがあって、覚えることだらけで大変なんですが、それもまた楽しいですね。
特に Kotlin がステキです。楽しいです。いろいろ出来ていいですね。

そんな中、こんなコードを書いたよ、という紹介です。
(紹介するのは書いたコードの一部分です)

# ObjectAnimator を使うのがめんどくさい

`ObjectAnimator` をコードで生成するとき、ちょっとめんどくさくないですか？
例えば、だんだん小さくなりながら、消えていくアニメーションを作るとこんな感じです。

```kotlin
ObjectAnimator.ofPropertyValuesHolder(
    targetView,
    PropertyValuesHolder.ofFloat(View.ALPHA, 1f, 0f),
    PropertyValuesHolder.ofFloat(View.SCALE_X, 1f, 0f),
    PropertyValuesHolder.ofFloat(View.SCALE_Y, 1f, 0f))
.apply {
    duration = 300
}.start()
```

## 名前が長い

`PropertyValuesHolder` って何ですか。長くないですか。
エディタのサポートがあれば、数文字のタイプで済むとはいえ、何度も入力したくありません。

## 意味がわかりにくい

自分だけでしょうか。`ofFloat()` ってどういうことですか。
`ofPropertyValuesHolder()` って何ですか。
もうちょっと易しい英語にしておいて欲しいです。

# 拡張関数でわかりやすくしてみた

そこで、このような関数を用意してみました。

```kotlin
// ObjectAnimator 生成
fun View.createObjectAnimator(vararg propertyValuesHolders: PropertyValuesHolder): ObjectAnimator
    = ObjectAnimator.ofPropertyValuesHolder(this, *propertyValuesHolders)

// PropertyValuesHolder 生成
fun <T> Property<T, Float>.createPropertyValuesHolder(from: Float, to: Float): PropertyValuesHolder
    = PropertyValuesHolder.ofFloat(this, from, to)

// ↑だと長いので、簡易的に書けるようにする
infix fun <T> Property<T, Float>.changes(values: Pair<Float, Float>): PropertyValuesHolder
    = this.createPropertyValuesHolder(values.first, values.second)
```

これだけ見てもどういうコードになるのかわかりにくいと思うので、次の例を見てください。

## ObjectAnimator を生成する

上記の拡張関数を使って、最初の例を書き直すと次のようになります。

```kotlin
targetView.createObjectAnimator(
    View.ALPHA changes (1f to 0f),
    View.SCALE_X changes (1f to 0f),
    View.SCALE_Y changes (1f to 0f))
.apply {
    duration = 300
}.start()
```

## 少し説明

いかがでしょうか。読みやすくなったのではないでしょうか。(大差ない？)

ポイントは `changes` ですね。`infix` を使って英文っぽくしてみました。
`infix` にしなくても良かったんですが、使いたかったんですよね。覚えたてだったので。楽しいので。
`Property` に `changes` を生やしたのも目のつけどころが違いますね、自分。

`changes` に続く `(1f to 0f)` もなかなかイカしてるんじゃないでしょうか。(そうでもない？)
1f から 0f まで変化するというのがわかりやすく示されていると思います。
この `to` を使いたいがために `Pair<Float, Float>` を生成してるんで、無駄が大きいんですけどもね。

`createObjectAnimator()` という関数はちょっと長いので、うまい名前がつけられれば短くしたいんですが、自分の英語力では出て来ず…。
悔しいですね。

# まとめ

今回紹介したコードがどう評価されるかはわからないですが、こうやっていろいろできる Kotlin はステキですね。
どんどん使いましょう！Kotlin 楽しい！
UnityでARKITを使うとき最初にやる準備/設定

OS; MacOS Mojave 10.14.4
IOS; 12.2
Unity; 2018.3.0f2 Personal
Xcode; 10.2.1

(UnityでARKITを使うとき最初にやる準備/設定)
こちらのチュートリアルを参考にしました
https://www.youtube.com/watch?v=Ml2UakwRxjk

１　Unityを開ける
２　新規プロジェクト、保存場所と名前
３　プロジェクトが開く
４　設定をする〜 Edit/ Project Setting/
<img width="361" alt="Screenshot 2019-04-28 at 18.35.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397861/eb1708d7-0b5b-9217-4ebc-69701d92c59e.png">

・・ここが重要・・・・・・・・・・・・・・・・・・・・・・・・
５　Project Setting  画面〜　上側ウィンドウ〜　Playerタブ/ Company Name ;入力(超重要)
<img width="794" alt="Screenshot 2019-04-28 at 18.36.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397861/5c78a3b0-2237-f1c7-c050-efbf8763b3b6.png">


６　Project Setting  画面〜下側ウィンドウ〜　スマートホンアイコンタブ(IOS Setting)〜　
<img width="502" alt="Screenshot 2019-04-28 at 18.39.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397861/f8186a4a-90ae-fa70-3687-23dbd6888778.png">


 6-1.　Bundle Identifire ;任意(例　TheUnityWorkbench.demo.ARdemo)
    <img width="795" alt="Screenshot 2019-04-28 at 18.33.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397861/119086db-c70d-d2e1-ae1c-76bfb9367e13.png">
6-2.　Requires ARKit support; チェック (Camera Using descriptionにコメントが入る;     Required for augmented reality support ) 
    6-3.　Target minimal IOS version; 12.2(未来ではその都度最新のバージョン) 
    6-4.　Architecture ; ARM64
<img width="795" alt="Screenshot 2019-04-28 at 18.33.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397861/21684956-f66d-a16f-0c7a-21d00b449af7.png">


７　設定画面を閉じる
８　ARパッケージをインポート　Windows 〜Package Manager / 上の真ん中らへん Advanced/ Show preview packages/ AR Foundation, ARCORE XR Plugin, ARKit XR Plugin インストール
<img width="700" alt="Screenshot 2019-04-28 at 18.42.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397861/46c49d40-f9da-fbed-ba7b-374bc5b24e75.png">

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・

そしたら、通常画面から

１　Unity編集画面　Hierarchy内で右クリック〜　XR/ AR Session
２　Unity編集画面　Hierarchy内で右クリック〜　XR/AR Session Origin (重要)
３　AR Session Origin〜　中に AR Camera /Inspectorタブ/ 一番上 AR Camera/ Tab; MainCamera
４　デフォルトの　Main Cameraを削除
５　画面には２つのARオブジェクトがある(オブジェクトとカメラ) オブジェクトはいらないので〜　Sceneタブの上真ん中あたり Gizmus/3D Icons 丸を左にドラッグしてオブジェクトを消す

準備完了
平面ゲームに1つのコントローラーで、相対移動によるカーソルを用意する方法

# はじめに
この記事はGWアドベントカレンダーという企画の「VCIアドベントカレンダー GW ver」2日目の記事です。

GWアドベントカレンダー全体についてはこちら↓
 [10連休向けアドベントカレンダーシステムを作った【個人開発】](https://qiita.com/wicket/items/f2aa70ac9cd734a01c7d)

VCIアドカレはこちら↓
[VCI(Virtual Cast Interactive) アドベントカレンダー GW ver](https://gw-advent.9wick.com/calendars/49)


今日は2日目で、平面ゲームに1つのコントローラーで、相対移動によるカーソルを用意する方法について説明します。

# TL;DR
まず何を書こうとしているのかわかりにくいので、動画で示します。
画面上に、操作中のフィールドに右手に持ってる黄色い四角を動かしている間出てくる黒丸について注目してください。
こちらが、フィールドが90度画面が動いても黄色い四角が下に動けば下に右に動けば右に動くようになっています。
![FourLinksVCIDemo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150633/ce7f6014-3fc5-6ec0-e35e-0f8be147b756.gif)

## 移動量計算
移動量＝「フィールドのデフォルトからの逆回転量」*「コントローラを掴んだ場所からの移動量」

```lua:Movement.lua
Movement = Quaternion.Inverse(Field.GetLocalRotation()) * (Controller.GetLocalPosition() - GrabStart.LocalPosition())
```

## 黒丸に移動量を反映
黒丸の位置＝初期位置＋移動量

```lua:locate.lua
RelativeMarker.SetLocalPosition(Const.CTRL_POSITION_CORRECTION + Vector3.__new(Movement.x,Movement.y,0))
```

あとでもっと詳細に書く
swiftでFirebaseAppがクラスとして認識されない問題の解決

# 問題

`pod 'Firebase/Core'`した後、`FirebaseApp.configure()`を書いても、
`Use of unresolved identifier 'FirebaseApp'`というエラーで`FirebaseApp`がクラスとして認識されない。

```AppDelegate.swift
import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate {

    var window: UIWindow?


    // [START didfinishlaunching]
    func application(_ application: UIApplication,
                     didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]?) -> Bool {
        FirebaseApp.configure()
     
        return true
    }
```

# 原因
古いバージョンのFirebaseCoreがインストールされていた。
何かしらが原因で3.x.xがインストールされていた。
どうやら'FirebaseApp'は4.x.x以降でないと定義されていないらしい。


問題のPodfile.lockファイル↓

```Podfile.lock
Firebase/Core (3.17.0):
    - FirebaseAnalytics (= 3.9.0)
    - FirebaseCore (= 3.6.0)
  - FirebaseAnalytics (3.9.0):
    - FirebaseCore (~> 3.6)
    - FirebaseInstanceID (~> 1.0)
    - "GoogleToolboxForMac/NSData+zlib (~> 2.1)"
  - FirebaseCore (3.6.0):
    - "GoogleToolboxForMac/NSData+zlib (~> 2.1)"
  - FirebaseInstanceID (1.0.10):
    - FirebaseCore (~> 3.6)
```

# 解決策
一旦Podfile.lockファイルを削除。
`pod repo update`と`pod update`をして、podを最新にする

依存関係とかでごちゃらないように、podfileには`pod 'Firebase/Core'`だけを記述して`pod install`する。
これで最新のFirebaseCoreと、関連のライブラリがインストールされるはず。
一度最新をインストールすればPodfile.lockファイルも最新のものが固定されるため、他のライブラリを入れても大乗なはず

# なぜ古いバージョンがインストールされたか
```
pod 'GoogleAPIClientForREST/Sheets'
pod 'Google/SignIn'
```
をインストールすると古いFirebaseCoreがついてくるようだ。
[G Suite APIs for iOS](https://developers.google.com/gsuite/guides/ios?hl=zh-cn)はドキュメントも適当だし、メンテされてない感が満載だから、古い依存関係のままインストールされたのだろう...
docker for macで、docker-syncをbuildしたときに発生したエラーを解決

macを新しくしたので、docker周りのインストールを行っていたところ、docker-for-macのbuildしたときにエラーが出て、解決に時間がかかったので自分用メモとして残しておく。
ちゃんとエラー内容読めばわかる内容だった。

#エラー発生前のコマンド
```zsh
$ docker-sync-stack start
```

##エラー内容
```zsh
$ docker-sync-stack start
note:  You can also run docker-sync in the background with docker-sync start
          ok  Starting unison for sync sync-front-volume
Unable to find image 'eugenmayer/unison:2.51.2.1' locally
docker: Error response from daemon: Get https://registry-1.docker.io/v2/eugenmayer/unison/manifests/2.51.2.1: unauthorized: incorrect username or password.
See 'docker run --help'.
/Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.11/lib/docker-sync/sync_strategy/unison.rb:190:in `start_container': Precopy failed (RuntimeError)
        from /Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.11/lib/docker-sync/sync_strategy/unison.rb:39:in `run'
        from /Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.11/lib/docker-sync/sync_process.rb:85:in `run'
        from /Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.11/lib/docker-sync/sync_manager.rb:111:in `block in run'
        from /Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.11/lib/docker-sync/sync_manager.rb:110:in `each'
        from /Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.11/lib/docker-sync/sync_manager.rb:110:in `run'
        from /Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.11/tasks/stack/stack.thor:46:in `start'
        from /Library/Ruby/Gems/2.3.0/gems/thor-0.20.3/lib/thor/command.rb:27:in `run'
        from /Library/Ruby/Gems/2.3.0/gems/thor-0.20.3/lib/thor/invocation.rb:126:in `invoke_command'
        from /Library/Ruby/Gems/2.3.0/gems/thor-0.20.3/lib/thor.rb:387:in `dispatch'
        from /Library/Ruby/Gems/2.3.0/gems/thor-0.20.3/lib/thor/base.rb:466:in `start'
        from /Library/Ruby/Gems/2.3.0/gems/docker-sync-0.5.11/bin/docker-sync-stack:15:in `<top (required)>'
        from /usr/local/bin/docker-sync-stack:22:in `load'
        from /usr/local/bin/docker-sync-stack:22:in `<main>'
```
ちゃんと理由書かれてる。
> unauthorized: incorrect username or password

#実行環境
```zsh
$ ruby -v                                                                                                                                                 ~
ruby 2.3.7p456 (2018-03-28 revision 63024) [universal.x86_64-darwin18]

$ docker -v                                                                                                                                               ~
Docker version 18.09.2, build 6247962

$ docker-compose -v                                                                                                                                       ~
docker-compose version 1.23.2, build 1110ad01

$ docker-sync -v                                                                                                                                          ~
0.5.11
```

#解決手法
docker for macのログインをGUIにてメールアドレスでログインしていたが、メールアドレスではなくusernameでログインするよう変更した

```zsh
$ docker login
```
対話式でusernameとpasswordを求められるので、`メールアドレス`ではなくusernameとパスワードを入力し、再度エラーの発生したコマンドを実行する。
Docker for Macを使ってみる

わからんなりにまとめてみる系の独り言。

docker-compose.ymlを使っての、
LAMP環境構築は次回行う予定です。

##TL;DR
Docker for Macをインストール、
Kitematic（GUI）を使って既存イメージからPHP7系インストール済みWebサーバー（Apache）を立ち上げてみました。

##Docker for Macを使ってみる

###【インストール】

####**Docker for Macのインストール**
コマンドでも出来るけどこっちの方が必要なコマンドをまとめてインストール出来る。
https://store.docker.com/editions/community/docker-ce-desktop-mac

Windows版もある（[この記事](https://qiita.com/kikuchi_kentaro/items/2fb0171e18821d402761)を見る限り、VMを噛ましている気がする）
https://store.docker.com/editions/community/docker-ce-desktop-windows

インストールしたアプリを起動したらterminalで確認

```console:terminal
$ docker -v
Docker version 18.09.2, build 6247962
$ docker-compose -v
docker-compose version 1.23.2, build 1110ad01
```

※注意※
Docker for Macを閉じたらDockerコマンドは使用できなくなります。
Kitematicで登録済みのDockerコンテナも停止します。

####**Kitematicのインストール**

GUIからDockerイメージをDL→コンテナを立ち上げることができるツール。
必須ではないが、とりあえず動かしてみたい場合には便利。

1. Docker for Macを起動
2. メニューよりKitematicを選択
3. 初回の場合はインストールをしてくれとのアラートが出る
4. hereをクリックするとDL開始

あとはDLされたzipを解凍して、出現するアプリケーションをApplicationsフォルダに突っ込む。

###【Kitematic経由でコンテナを立ち上げる】

####**今回立ち上げてみるイメージ**
**tplatform/apache-php**
https://hub.docker.com/r/tplatform/apache-php/

※注意※
- Kitematic経由はネット（DockerHub）上のイメージを直接参照してしているので、ローカルにはDockerfileが保存されない。
- ローカルのファイルと連携させたい場合は、使いたいイメージにVolumesが定義されていないと設定できない（なんだかんだで使いたい設定作るにはDocker-CLIの理解やdocker-composeの理解が必要。[参考](https://tinytamb.hateblo.jp/entry/2018/11/12/085502)。）

####**基本的な手順**

1. Newをクリックして使いたいイメージをggる
    1. タグ指定がある場合は「・・・」をクリック、SELECTED TAGを選択してタグを指定する
2. Createをクリック
3. Settingsを修正する
    1. ローカルファイルとリンクさせたい場合、Volumesを選択。使用したいローカルファイルを設定する。
    2. Restartさせる

しばらくたってindex.phpが表示されたら成功。

```php:root/index.phpはとりまこれ
<?php
phpinfo();
```

Terminalで以下のコマンドを入力すると実際に動いているのが確認できる。

```console:terminal
$ docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
d64c1cb5651a        apache-php          0.01%               42.25MiB / 1.952GiB   2.11%               10.7MB / 117kB      131kB / 43.7MB      29
```
###【参考記事】

- [（前編）【コマンド不要】XAMMPもMAMPも使わない！ローカル開発環境はdockerで構築してみよう！
](https://yatteq.com/localdev-docker/)

##まとめ
DB使わない素PHPだけ（そんな場面基本ない）ならこれで動きます。
が、普通に使うにはdocker-compose.ymlを作ってMySQL・PHPMyAdmin用コンテナ立ち上げる必要があります。。。
Docker勉強したことまとめ

勉強中につきそんなに参考にはしないでください。

##Dockerとは
参考記事： https://noumenon-th.net/programming/2019/03/20/docker/

##自主勉記事一覧

- [Docker for Macを使ってみる
](https://qiita.com/rockinruuula1227/private/c838cc05a87145f85e3f)
- [Docker Composeを使ってLAMP環境を構築する：前編](https://qiita.com/rockinruuula1227/items/83f3f1406f339083ef3f)

##今後の予定
- composer、Linter、PHPUnitをインストールした環境を構築する。
- そのほかdocker-composeやdockerfileについてまとめたほうがよさそうならば随時。
Gitの基礎知識｜リポジトリとは？

今回はリポジトリについて紹介します。しかし、プログラミング初心者であるため、内容に誤りがあるかもしれません。もし、誤りがあれば修正するのでどんどん指摘してください。

## Gitの基礎知識

### リポジトリとは
ファイルやディレクトリの状態を記録する場所で、保存された状態は、内容の変更履歴として格納されています。変更履歴を管理したいファイルやディレクトリをリポジトリの管理下に置くことで、そのディレクトリ内のファイルやディレクトリの変更履歴を記録することができます。Gitのリポジトリには主に2種類あります。

* リモートリポジトリ
専用のサーバに配置して複数人で共有するためのリポジトリのことです。リモートリポジトリからアップロードされた他の人のファイルを閲覧できる
* ローカルリポジトリ
ユーザ一人ひとりが利用するために、自分の手元のマシン上に管理するリポジトリのことです。ローカルリポジトリで編集した内容をリモートリポジトリにアップロードできる。
Python勉強用の環境構築1(Gitインストール,GitHubアカウント登録)

##目的
自宅でPythonを勉強する為にまずはGit,GitHubを使えるように環境設定。

##GitHubアカウント登録
https://qiita.com/kooohei/items/361da3c9dbb6e0c7946b
上記サイトを参考にアカウントを新規作成。

##Gitインストール
https://eng-entrance.com/git-install
上記サイトを参考にgitをインストール。

##Git-GitHub間の連携
https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000
上記サイトの「環境の構築（2） SSHの鍵を取得する」から「GitHubを使う（2） ファイルを追加してコミットする」を実施。
ひとまずローカルファイルをコミットし、GitHub上で確認できるようになったため、本日のタスクは完了。

##Next
ここまでゆっくりやって2時間弱？程度。
(Qiitaのアカウント作成なども同時進行していた為、突き詰めて始めればもっと早く終わるかと。)
明日以降はDjangoの基礎学習/インストールを行っていく予定。
(Pythonに関してはインストール済み。)
itertoolsを用いて順列, 組合せを作ろう

#環境
python3.6.3
macOS version10.14.

#itertools
python で組合せについて調べていたら, itertoolsモジュールにたどり着きました. イテレーションに関する関数が多く用意されているようなので, いくつか試してみます. 
import itertools と記述することで使うことができます. 

#順列
itertools.permutations(iterable, r)
rで一度に取り出す要素数を指定する. 
順列はタプルで格納される. 

```python
tmp = ['a', 'b', 'c',]
print(list(itertools.permutations(tmp,2)))
#[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
```

#組合せ(重複なし)
itertools.combinations(iterable, r)
rで一度に取り出す要素数を指定する. 
組合せはタプルで格納される. 

```python
tmp = ['a', 'b', 'c',]
print(list(itertools.combinations(tmp,2)))
#[('a', 'b'), ('a', 'c'), ('b', 'c')]
```

#組合せ(重複あり)
itertools.combinations_with_replacement(iterable,r)
rで一度に取り出す要素数を指定する. 
組合せはタプルで格納される. 

```python
tmp = ['a', 'b', 'c',]
print(list(itertools.combinations_with_replacement(tmp,2)))
#[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')]
```

#無限イテレータ
####count(start, [step])
startからstep飛ばしの整数を無限に返す. 

```python
itr = itertools.count(5,3)
for i in itr:
    print(i, end=' ')
    if i >25:
        break
#5 8 11 14 17 20 23 26
```
####itertools.cycle(iterable)
引数に与えられたイテレータの要素を無限に返す

```python
tmp = ['a', 'b', 'c']
itr = itertools.cycle(tmp)
for i, x in enumerate(itr):
    print(x, end=' ')
    if i >10:
        break
#a b c a b c a b c a b c
```
####itertools.repeat(object, times)
objectを指定回数返す

```python
itr = itertools.repeat('Hello',3)
for i in itr:
    print(i, end=" ")
#Hello Hello Hello
```
Macでバッチファイル(.command)を作る



## 1. 「.command」を拡張子にしてテキストファイルを作成する

- この拡張子をつければダブルクリックでターミナル実行ができる

## 2.処理を書く
### *注意* 
- スクリプトを起動したディレクトリがカレントディレクトリになるようにする

```
#!/bin/bash
MY_DIRNAME=$(dirname $0)
cd $MY_DIRNAME
```

## 3. 作成したファイルの実行権限をつける

1.ターミナルを開く

2.作成した「.command」ファイルディレクトリに移動

   ```
   cd ディレクトリ
   ```

3.ファイルの権限を確認

   ```
    ls -l ファイル名.command
   ```

   ```
   -rw-r--r-- こうなっているはず
   ```

4.ファイルの権限を書き換える

   ```
   chmod u+x ファイル名.command
   ```

5.書き換わったか確認

   ```
   ls -l ファイル名.command
   ```

   ```
   -rwxr--r--	こうなっていれば成功
   ```

#参考
http://sakuranon.blog.fc2.com/blog-entry-27.html
【AndroidStudio】MainActivityを違う階層に移動しようとしたらハマった話

AndroidStudioでプロジェクトを新規作成した際、`MainActivity`をuiパッケージ配下に移動しようとしたのですが結構ハマりました:sob:
なんとか解決したのでその方法をメモしておきます。
（AndroidStudioのバージョンは3.4です）

↓やりたかったこと
<img width="380" alt="スクリーンショット 2019-04-29 0.16.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/6bb801ac-c997-2682-8ad0-6e2f85e0b114.png">

#どうハマったか
右クリック>Newで`com.example.testapplication`配下にuiパッケージを追加し、`MainActivity`をドラッグアンドドロップでuiパッケージに移動させたところ…
<img width="380" alt="スクリーンショット 2019-04-29 0.15.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/8547e009-db0d-121e-ffd2-80f6c705f334.png">
<img width="380" alt="スクリーンショット 2019-04-29 0.15.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/94ff1cc5-621d-7a65-9c54-b6b000c9f916.png">

`com.example.testapplication`が`com.example.testapplication.ui`と変更され、uiパッケージは消えてしまいました…。
なんか思ってたのと違う…:sob:

# 解決方法
色々試した結果、uiパッケージを追加する際に**ほかのパッケージも合わせて追加する**と、狙った階層に移動させることができました。
今回の例だと、uiパッケージだけでなくdataパッケージも合わせて追加し、その上で`MainActivity`をuiパッケージに移動させると上手くいきました。

<img width="380" alt="スクリーンショット 2019-04-29 0.16.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/8832d858-ec39-d695-4107-79e392ae7a4c.png">

なぜこの方法だと上手く行ったのかまでは理解できていないため、理由を知っている方がいたら教えて頂けると嬉しいです:pray:

# 2019-04-29 追記
理由がわかったので追記します。

`com.example.testapplication.ui`と表示されてしまうのは、Projectウィンドウの設定で`Compact Middle Packages`にチェックが入っていることが原因でした。
ここにチェックが入っているとパッケージが省略されて表示されるみたいです。

早速左上のProjectウィンドウを右クリックし、`Compact Middle Packages`のチェックを外すと…
<img width="380" alt="スクリーンショット 2019-04-29 12.26.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/474c335b-7941-26ff-4469-637863e43897.png">
<img width="380" alt="スクリーンショット 2019-04-29 12.32.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/5b29911f-2166-9e8e-609e-9cc8af1c0ffa.png">
たしかにuiパッケージが表示されて、`MainActivity`を狙った階層に入れることができました！

※`com.example.testapplication`の部分についても省略されずに表示されるようになるため、uiパッケージにたどり着くまでの階層が深くなるのが少し難点だなと思いました。
<img width="380" alt="スクリーンショット 2019-04-29 12.32.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/ac48b9c5-3ce3-1b38-fe5f-cb445de4437f.png">
uiパッケージがなくなってしまう（←省略されていた）理由がわかってスッキリしました:relaxed:
コメント欄にて丁寧に教えてくださった @keijumt さま、ありがとうございました！！
ターミナルの基礎的なコマンドのメモ


##はじめに
今回はPythonの公式チュートリアルを進める中でinterprinter（内側のプリント?:anguished:）の理解ができませんでした。もう、使われている日本語が日本語に見えなくなる時があります。そこでググっているとターミナルと似ており、Progateの Command line基礎コースがありました。今回はその学習のまとめです！

毎度保険をかけますが、
**プログラミング初心者であるため内容に誤りがあるかもしれません。もし、誤りがあれば修正するのでどんどん指摘してください。（今回は特に！！）**

##目次
- touch
- mkdir　　make directory
- cat　　　concatenate
- cd　　　change directory
- pwd　　　print working directory
- ls　　　list segments
- mv　　　move
- cp　　　copy
- rm　　　remove


####touch

```
~$ touch [   ]
```

ファイルの最終アクセス日時と最終更新日時を変更する。
ファイルがない場合は新しいファイルを作成する。

####make directory

```
~$ mkdir [directory_name]
```
フォルダを作る

####concatenate
```
~$ cat [file_name]
```
ファイルの中身を表示する:smirk_cat:

####change directory

```
~$ cd [directory_name]
```

指定したファイル名に移動する
``ls``を使って選択肢を見てから使うことが多い

```
~$ cd
```

ファイル名を指定しない時、ホームディレクトリに移動

```
~html cd .. 
```

一つ前（上？）のdirectoryに移動する

####print working directory
```
~$ pwd [directory_name]
```
```
例
/Users/Usam/Downloads/Programing/Progate
```
指定したdirectoryまでのルートを検索（現在地がわかる）
root directory から　current directory
root directory  ----->  current directory
※current　現在の
　root　根っこ

####list segments

```
~$ ls
```
```
例　私がホームディレクトリで用いた場合
Applications			Downloads				Music					env
Desktop					Library					Pictures				iCloud Drive（アーカイブ）
Documents				Movies					Public					メモの保存方法.txt
```
current directory を１つの階層文を並べて表示する。
何かたくさんのオプションがあるらしい。

####move

```
mv [directory_name] [directory_name]　
　　　　　目的　　　　　　　　移動先
```

移動先のdirectoryがなかった場合は指定したファイルの名前がその名前になる。

```
例：TheFile を HokkaidoMilk に変更

~$ mkdir TheFile
~$ mv TheFile HokkaidoMilk
```
<img width="374" alt="スクリーンショット 2019-04-29 0.25.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388345/953fe73e-c374-6f32-15d4-cfa733e5f8e2.png">
<img width="343" alt="スクリーンショット 2019-04-29 0.28.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388345/7dda55c2-4134-2973-4b6d-beaa05549336.png">

####copy
```
cp [file_name] [another_name]
cp -r [directory_name] [another_name]
```
directory の時には`-r`を忘れるとエラーになるので注意
####remove
```
rm [file_name]
rm -r [directory_name] 
```		
消去
これもコピーと同じで`-r`を忘れるとエラーが出ますのでご注意を。

##終わりに
Qiitaに少し慣れてきた気がします。これからも更新していくので内容だけではなく、「こうしたら見栄えがいい」などの外見的なアドバイスも募集してます。
今日は絵文字と画像の挿入ができた。ちょっと成長（ファファファファッミ♭ッソッ ファ〜♪）
プロデルでネ申Excel作成を自動化したい #1

##セル内の文字列の置換～その１
　[前回](https://qiita.com/shukvaal/items/7b1f6bd3a342f5070ef8
)ではセル内の文字列の読み出しができたので、今度は置換を試してみたいと思います。前回使ったものに手を加えて、図のようなxlsxファイルを用意しました。
![コメント 2019-04-28 231324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349242/f1d908ae-c14c-50f3-f1bd-73b794cd6c5d.png)
どのセルの文字列か判定できるようにこんな風にしましたが、ひとまず、全部同じ文字列に置換させてみます。

```xlsx操作2.rdr
文字列xmlは、「［プログラムの位置］カレンダー\xl\sharedStrings.xml」をXMLとして開いたもの
文字セル一覧は、文字列xmlから「sst\si」を取得したもの
文字セル一覧を箱へそれぞれ繰り返す
	臨時一覧は、箱の要素一覧
	臨時一覧を器へそれぞれ繰り返す
		もし器の名前が「t」ならば
			器の内容は、「テスト」
		もし終わり
	繰り返し終わり
繰り返し終わり

「［プログラムの位置］カレンダー\xl\sharedStrings.xml」に文字列xmlを保存する
```

プロデルでXMLをファイルに保存すると、インデントや改行で整形して出力してくれます。コードの実行結果です。

```sharedString.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="56" uniqueCount="56">
  <si>
    <t>テスト</t>
    <phoneticPr fontId="3" />
  </si>
  <si>
    <t>テスト</t>
    <phoneticPr fontId="3" />
  </si>
  <si>
    <t>テスト</t>
    <phoneticPr fontId="3" />
  </si>
  <si>
    <t>テスト</t>
    <phoneticPr fontId="3" />
  </si>
  <si>
    <t>テスト</t>
    <phoneticPr fontId="3" />
  </si>
 <以下略>
```

置換できています。
##xlsxファイルを復元する
このxmlファイルからxlsxファイルを復元します。元のxlsxファイルを展開した時にできたファイル群をzip圧縮して拡張子を変更すればいいのですが、いろいろなサイトで書かれているように、ファイル群が入っているフォルダごと圧縮するのではなく、その直下の

```
_rels
docProps
xl
[Content_Types].xml
```
の4つをzip圧縮しないとExcelで開いたときにエラーになります（そうと分からずちょっと悩みました）。できたファイルは正常に開けました。
![コメント 2019-04-29 004509.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/349242/79ed150e-9790-07b9-a0a5-a3aae14d083f.png)
xlsxの自力編集は高率で読み込みに失敗するらしいのですが、sharedStrings.xmlを整形した程度なら大丈夫なようです。
[～続く～](https://qiita.com/shukvaal/items/ddaadaa191c5e199712b)
PerlでGitHubのプレビュー版APIにアクセスする

Preview版として提供されているGitHubの[Projects API](https://developer.github.com/v3/projects/)をPerl＋[Net::GitHub](https://metacpan.org/pod/Net::GitHub)から実行してみたので、メモ。

Net::GitHubでは多くのAPIがオブジェクトメソッドでラッピングされているけど、ProjectsのようにまだラッピングされていないAPIもある。これらを実行するときは、[Net::GitHub::V3のqueryメソッド](https://metacpan.org/pod/Net::GitHub::V3#query($method,-$url,-$data))を使う。

~~~
use Net::GitHub::V3;
my $github = Net::GitHub::V3->new(login => 'fayland', pass => 'mypass');
my $result = $github->query('GET', '/repos/USERNAME/REPOSITORY/projects', {});
~~~

通常のAPIは上記の方法でアクセスできるのだけど、Projectsなどプレビュー版のAPIでは、以下に書かれている通りACCEPTヘッダーを追加する必要がある。

> The Projects API is currently available for developers to preview. During the preview period, the API may change without advance notice. Please see the blog post for full details. To access the API during the preview period, you must provide a custom media type in the Accept header:
> `application/vnd.github.inertia-preview+json`
> ( https://developer.github.com/v3/projects/ より)

Net::GitHubはHTTPアクセスに[LWP::UserAgent](https://metacpan.org/pod/LWP::UserAgent)を利用しており、このインスタンスには[uaメソッド](https://metacpan.org/pod/Net::GitHub::V3#ua)でアクセスできる。このLWP::UserAgentインスタンスにデフォルトのヘッダー項目を追加してやればいい。

こんな感じになる。

~~~
use Net::GitHub::V3;
my $github = Net::GitHub::V3->new(login => 'fayland', pass => 'mypass');
$github->ua->default_headers->push_header('Accept' => "application/vnd.github.inertia-preview+json");
my $result = $github->query('GET', '/repos/USERNAME/REPOSITORY/projects', {});
~~~

これでプレビュー版のAPIにアクセスが可能。
RaspberryPiにDockerでMosquittoを立てて、MQTTとWebsockets

RaspberryPiでUSBを利用したDocker環境を作っていた時に、Pub/Subが要るなと思い、Reddis立てようかと考えましたが、そういえばよく使ってるMosquittoはDocker Hubで用意してくれてたりするんかな？と思って調べたらありまして、しかもオフィシャルで、なんとも簡単に環境構築ができましたのでご報告。

Mosquitto on Docker Hub
https://hub.docker.com/_/eclipse-mosquitto

### イメージ取得
```
$ docker pull eclipse-mosquitto
```

### 永続データ
以下のディレクトリを永続的に利用し、マウントする必要があるのでホストに作成する

mosquiitto/config
mosquitto/data
mosquitto/log

### mosquitto.conf

mosquitto/config/mosquitto.conf
が必要なので、gitから持ってきます。
https://github.com/eclipse/mosquitto

永続データについて、以下の様に書き換えます。

``` mosquitto.conf
persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
```

### Websockets

上記の内容で起動できるのですが、MQTT over Websocketsできるように、以下のように設定を加えます。
mqttは1883, websocketsは9001に設定します。

``` mosquitto.conf
port 1883
listner 9001
protocol websockets
```

### 起動

```
$ docker run -itd --name mosquitto -v mosquitto:/mosquitto -p 1883:1883 -p 9001:9001 eclipse-mosquitto:latest
```

いやぁ、便利な世の中だねぇ...
コマンドラインでzipを作るコマンドまとめ


## 基本
```
zip zipname * 
```
- 現在のディレクトリ内の全てのファイルを対象に
- zipnameという名前のzipファイルを作る

## 現在のディレクトリ配下のファイル全てはいったzipを作る
```
zip -r zipname * 
```
- 現在のディレクトリ配下の全てのファイルを対象に
- zipnameという名前のzipファイルを作る

`-r`をつけることでディレクトリ配下のファイルも対象にできる。
`zip zipname * `だけだと、現在のディレクトリにフォルダがあった場合、フォルダ配下はzipに含まれない。


## 特定の拡張子の全ファイルが入ったzipを作る
```
zip zipname *.js
```
- 現在のディレクトリ内の拡張子がjsのファイルを対象に
- zipnameという名前のzipファイルを作る

対象ファイルを正規表現で特定の拡張子にしただけ。

## 特定のディレクトリの全ファイルが入ったzipを作る
```
zip zipname /path/to/save/* 
```
- /path/to/save/配下の全てのファイルを対象に
- zipnameという名前のzipファイルを作る

対象ファイルを正規表現で特定のディレクトリにしただけ。
もちろん、拡張子とディレクトリを組み合わせて使える。

## 特定のファイル、パターンを除外してzipを作る
```
zip zipname * --exclude exclude.sh *.json
```
- 現在のディレクトリ内の全てのファイルを対象に
- exclude.shと拡張子がjsonのファイルを除外して
- zipnameという名前のzipファイルを作る

--excludeの引数は複数指定できるし、正規表現も使える。

## 特定のディレクトリのzipを作る
```
zip -r zipname.zip directory/directory2
```
- directory/directory2のディレクトリを対象に
- zipnameという名前のzipファイルを作る

## 特定のファイル、パターンを除外して特定のディレクトリのzipを作る
```
zip -r zipname.zip directory/directory2 --exclude exclude.sh *.json
```
- directory/directory2のディレクトリを対象に
- exclude.shと拡張子がjsonのファイルを除外して
- zipnameという名前のzipファイルを作る

上記と同じ`--exclude`オプションを使っただけ。
ABC - 031 - A&B&C

#AtCoder ABC 031 A&B&C
[AtCoder - 031](https://atcoder.jp/contests/abc031)

#A問題

```java

	private void solveA() {
		int a = nextInt();
		int d = nextInt();
		int res = 0;
		if (a > d) {
			res = a * (d + 1);
		} else {
			res = d * (a + 1);
		}

		out.println(res);
	}
```

#B問題

```java
	private void solveB() {
		int numL = nextInt();
		int numH = nextInt();
		int numN = nextInt();
		int[] wk = IntStream.range(0, numN).map(i -> nextInt()).toArray();

		for (int i : wk) {

			if (i < numL) {
				out.println(numL - i);
			} else if (numH < i) {
				out.println(-1);
			} else {
				out.println(0);
			}
		}

	}
```

#C問題

 - 総当たり
    - 読解力の問題で問題文を意味をとるのに1時間以上かかったが、、、
    - 以下の方針で実装して通ったのでおｋ？
        1. まず、0-Nの間で高橋の位置を決める
        2. 高橋の位置を決めた状態で、青木が一番高いポイントを取れる場所を決める
            2-1. 青木は0->Nの間で場所を決める
        3. 青木の選択位置を0->Nまで動かしながら、青木のポイントが最大となった時の高橋のポイント取っておく
        4. [1-3]をループし、高橋の位置を0->Nまで移動したときの最大の高橋のポイントが答え

　同じ回答を次も導ける自信がない。。。

```java
	private void solveC() {
		int numN = nextInt();
		int[] wk = IntStream.range(0, numN).map(i -> nextInt()).toArray();

		int res = Integer.MIN_VALUE;

		/*
		 * 高橋が選択する箇所を総当たり
		 * 高橋が選択した場所次第で青木の手が決まる
		 * はず。。。
		 * i=高橋の選択場所
		 */
		for (int i = 0; i < numN; i++) {
			/*
			 * Integer.MIN_VALUEにしたときに値がMAX側にるーぷしてしまったので、、、
			 * この位置を高橋が選択した場合の高橋と青木のポイント
			 */
			int aokiPoint = -1000000;
			int takahashiPoint = 0;

			/*
			 * 高橋の選択位置を固定した状態で
			 * 青木の選択場所を探す
			 * この選択場所は、青木のポイントが最大となるところ
			 * i==jのときは高橋と手が被るので選択できない
			 * 青木のポイントが最大となったところが、高橋のポイント
			 *
			 */
			for (int j = 0; j < numN; j++) {
				if (i == j) {
					continue;
				}
				int innerAoki = -100000;
				int innerTakahashi = 0;
				/*
				 * 青木か高橋どちらかの選択位置で小さいほうが開始
				 * 青木か高橋どちらかの選択位置が大きいほうが終了
				 * 両端を含むので終了は<=
				 */
				int cnt = 1;
				for (int k = Integer.min(i, j); k <= Integer.max(i, j); k++) {
					/*
					 * 奇数は高橋のポイント
					 * 偶数は青木のポイント
					 */
					if ((cnt & 1) == 1) {
						innerTakahashi += wk[k];
					} else {
						innerAoki += wk[k];
					}
					cnt++;
				}
				/*
				 * この位置を選択した場合の青木のポイントは、
				 * 今までの青木のポイントより大きいか否か
				 * 大きい場合は、高橋のポイントはこれで確定
				 */
				if (innerAoki > aokiPoint) {
					//今までの青木のポイントよりも大きければ入れ替え
					aokiPoint = innerAoki;
					//青木のポイントが今までよりも大きいので高橋のポイントも入れ替え
					takahashiPoint = innerTakahashi;
				}
			}
			/*
			 * この高橋の選択は、今までのポイントよりも大きいか否か
			 */
			res = Integer.max(res, takahashiPoint);

		}

		out.println(res);
	}
```
Python で ntp server から時刻を取得する (Python 3 版)

# Python で ntp server から時刻を取得する (Python 3 版)

[Python で ntp server から時刻を取得する (Python 2 版)](https://qiita.com/c-yan/items/683ba3a8d0c1c13f1bdd) を Python 3 に移植した.
2to3 を使ってみたら、2208988800L の最後の L を取れって言われたので、それを修正して実行してみたら

```
TypeError: a bytes-like object is required, not 'str'
```

って怒られた. しょんぼり.

## テスト

```python
>>> ntp_now('ntp.jst.mfeed.ad.jp')
datetime.datetime(2019, 4, 29, 0, 3, 30)
```

## コード

```python
def ntp_now(server, port = 123):
    from socket import socket, AF_INET, SOCK_DGRAM
    from struct import unpack
    from datetime import datetime
    with socket(AF_INET, SOCK_DGRAM) as s:
        s.sendto(b'\x1b' + 47 * b'\0', (server, port))
        result = s.recvfrom(1024)[0]
    if result:
        return datetime.fromtimestamp(unpack(b'!12I', result)[10] - 2208988800)
    else:
        None
```

b を付けまくって、finally close を with 文で差し替えた. with がデフォルトで使えるのは 2.6 からだから 2.5 時代に書いたのかなあ.
インターネット老人が電子メールについて語るときのサマリ

#はじめに
電子メールについてインターネット老人がひたすらなつかしみながら語るときに、どんなサマリで語るか書いたものです。
どちらかといえば書き方のほうで、SMTPとかはやらないです。

## なぜこれを書こうと思ったか
後輩にメールのことを教えるときに、びっくりしたんですけど「電子メール」を使ったことが無い世代になってて。何回もいうくらいなら書いてシェアしたほうがいいと思いました。

細かいところはおのおのでアレンジしていただくとして、研修とかで若い後輩に電子メールのことを説明しないといけないメンターさんとかは使えるならこれ使ってください。

# メールの種類
##  手紙とは、文書とは
いちがいに電子メールでといっても送るものはさまざまです。だれからだれに何を送っているのか(5W1H)を見るようにしましょう。


### 信書とは何か
ついでに、信書についても知っておいたほうがええと思います。
参考　https://www.post.japanpost.jp/question/57.html
http://www.kuronekoyamato.co.jp/ytc/ad/opinion/shinsyo/



## メーリングリスト
チャットグループのようなものになるのかな。
原則としてメーリングリストから来たメールに「返信」したらメーリングリストの参加者（入会者）全員に届くので、他のメールと同様、メールの送信をする前に宛先（to/cc/bcc)とタイトルに間違いがないかをたしかめる。



##  電子メール以外の文字のやりとり
### モールス信号・電報・ファクシミリ・ポケベル・キャリアメール（ケータイ）
### SMS
2要素認証に使われる

### チャットアプリ
結局HTTP,HTTPS
参考 https://ascii.jp/elem/000/001/235/1235153/

# 電子メールの歴史
  電子メールの誕生←ディジタル作法に書いてたっけ？あとで読む

# ビジネス電子メール基礎
業種によって違うので略
ふつうにビジネスメールの本とかでいいと思う
TO/CC/BCCはいう

仕事によるけど仕事はチームでやってるので、個人宛てのメールだけで話を進めちゃいけない。チームのMLに送るか、チームメンバーにCCすること。もし君が急に休んだ時どうする？　1:1でやりとりするとリスクが高いとかはいう

あとお客さんの会社の名前・拠点名・役職名は絶対に間違えるな。


# メールにまつわるツールや設定
## メールソフト
いわゆるMUAとかだとローカル端末にメールを保存できる設定がある
ウェブメールはウェブブラウザ経由で使う。

##  電子署名
  GPGとか
## 古臭い（枯れた）メールのお作法
  80字改行
  機種依存文字
  引用するな？（昔全文引用はあかんとされていた件）

# LINEとかとの違い
## アドレス
電子メールアドレスは知っていれば誰でもメール出せる。拒否は１つの送信元メールアドレスか、送信元ドメイン名かとかでいちおうしぼれるけどいたちごっこ
## 前置き、本文、署名、（前までのやりとりの引用）
LINEは発言者名と吹き出し出るし、電子メールでもいちおう発信者名見えるけど、いまのところ前置き（○○株式会社○○様　自社名・自分の名前、挨拶など）、本文、署名、（前までのやりとりの引用）がセット
## 既読つかない
既読マークはつかないし、相手に届いたかどうかも確認する手段は（一般ユーザでは）「電話してついたかきく」くらい。
「開封確認」ってのがあるが、あれは相手がそれを受信してぽちっと押して、さらにそれがこっちに届かないとわからない。
## すぐに届かない
すべてが順調だったらすぐ届くけど、100%保証されてない。１週間くらいかかることもある。

# おわりに
メンター経験が浅い人は、後輩や新人がまさかと思うようなメールの書き方やらミスやらして、すごい疲弊すると思いますが、そもそもメールのことを知らなくて起こしたことかどうか見極めて、うまく指導してください。
Chromeのブックマークのフォルダ内全てのページを開く方法

## Chromeのブックマークのフォルダ内のページを全て開く方法
とあるプロジェクトに関わるサイトをブックマークのフォルダにまとめておくことはよくあると思います。

その時に、フォルダ内の全てのページを一気に開けたら便利ですよね。

commandを押しながらフォルダをクリックすることでこれは実現出来ます。

ぜひ活用してください。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
機械学習の環境をGoogle Colaboratoryで構築

## GoogleColaboratoryインストール〜Pytorchなど用途

事前環境
• Google Colaboratoryはジュピター・ノートブックをクラウド上で動かす
もの
• 環境など共有できるためチーム開発に便利
• Jupyter NoteBookや他のエディタ環境で実行しても大丈夫ですが、
• PyTorchニューラルネットワーク実装ハンドブック (Pythonライブラリ定
番セレクション)）宮本 圭一郎 (著でもGoogle Colaboratoryが推奨され
ています

## 事前環境の続き
• 環境を作るのが手間だと感じる方は、URLを共有するので、
• そこから開発環境に入って頂いても大丈夫です。
• 後にQiitaにまとめたりする時間などもリクエストあれば設けますので、
• 時間がない方はスルーしてください。
• こちらのURLが参照になります
• https://www.codexa.net/how-to-use-google-colaboratory/

## 新規フォルダの作成

自分のアカウントからアプリを追加し順番に構築していきます。

![colab_app.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40070/0ffe6496-be06-7c8c-ca6a-136045f2caa4.png)

##　Google Colaboratory立ち上げ&用途に応じて、
Pytorch、TensorFlow経由でデバイス設定を確認できます。

```
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
```

##Pytorchのインストール

```
from os import path from wheel.pep425tags import get_abbr_impl,
get_impl_ver, get_abi_tag platform = ‘{}{}-{}’.format(get_abbr_impl(),
get_impl_ver(), get_abi_tag()) accelerator = ‘cu80’ if
path.exists(‘/opt/bin/nvidia-smi’) else ‘cpu’ !pip install -q
http://download.pytorch.org/whl/{accelerator}/torch-0.3.0.post4-
{platform}-linux_x86_64.whl torchvision

```GPUの確認 import torch use_gpu = torch.cuda.is_available()
print(use_gpu)

```

上記のコマンドで、Trueが返ってくればインストール完了
Pytorchのインストール


• pip install -U torch torchvisionでもインストールできるかもしれません
が、各ライブラリのバージョンが違うとエラーが表示されるます。

##詳しくはこちら

• Google ColaboratoryでPyTorch
• https://qiita.com/fukuit/items/342f5c8ec84e978fad3b
• Google Colaboratory事始め
• https://qiita.com/kouki_outstand/items/cd24dccbaa92274be39e


##PyTorchを使って線形回帰
• PyTorchは機械学習ライブラリですので、データセットを使って簡単なモデリング
をしないことには終われません
• Kaggleで公開されているデータセットを使ってPyTorchでシンプルな線形回帰を
やってみましょう。
• 使うデータは「 Ramen Ratings 」を使いましょう。データの利用はkaggleの登録が 必要です。会員登録（またはログイン後）に下記のURLからデータのダウンロー
ドをお願います。
• → https://www.kaggle.com/residentmario/ramen-ratings
• ダウンロードしたファイルはZIP形式となります。解凍して「 ramen-ratings.csv 」を
Jupyter Notebookからアクセスしやすい場所へ格納してください。