OmniAICreator/Qiita-1.07M huggingface dataset:
IFTTTからslackに投稿した内容をpythonのslackbotライブラリが拾えない現象について

# 現象

pypi経由でpythonのslackbotライブラリをインストールした場合、IFTTTからslackに投稿した内容を拾えない。

```
pip install slackbot
```

```run.py
# -*- encoding: utf-8 -*-
from slackbot.bot import Bot
from slackbot.bot import listen_to

@listen_to('てすと')
def listen_func(message):
    message.send('ぽん')

def main():
    bot = Bot()
    bot.run()

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

![スクリーンショット 2019-01-20 17.22.49.png](https://qiita-image-store.s3.amazonaws.com/0/123125/c9d50360-7936-84d0-82db-fcd93346f7c7.png)

 # 理由
[こちらの記事](https://qiita.com/zen7sky/items/fafe10a126e20f79fa36)にあるように、通常の投稿とIFTTT経由の投稿ではフォーマットが違うためです。
データの取得はslackbotの「dispacher.py」というソースがやっているのですが、
ここで取得したデータをprintするソースを仕込んで、中身を見てみると...

```dispacher.py
    def dispatch_msg(self, msg):
        category = msg[0]
        msg = msg[1]
        print(msg)  # <- 44行目にprintを仕込む
        if not self._dispatch_msg_handler(category, msg):
            if category == u'respond_to':
                if not self._dispatch_msg_handler('default_reply', msg):
                    self._default_reply(msg)
```

```
python run.py

# 普通に投稿した場合
{
  'type': 'message', 
  'user': ‘XXXXXXXX’, 
  'text': 'てすと', 
  'client_msg_id': ‘XXXXXXX’, 
  (略)
}

# IFTTT経由で投稿した場合
{
  'username': 'IFTTT', 
  'icons': {'image_36': 'https://a.slack-edge.com/8f51/img/services/ifttt_36.png', 
  'image_48': 'https://a.slack-edge.com/8f51/img/services/ifttt_48.png', 'image_72': 
  'https://a.slack-edge.com/8f51/img/services/ifttt_72.png'}, 
  'attachments': [
    {
     'pretext': 'しゅっしゃ', 
     'fallback': 'しゅっしゃ', 
     'mrkdwn_in': ['text', 'pretext']
    }
   ], 
  (略)
}
```
全然違いますね。
で、通常投稿のデータ形式にしか対応していないため、
IFTTTからの投稿はdispacher.pyで拾えてないということです。

# 対策
dispacherのmsgを取得する部分を書き換えます。
以下は、dispacher.pyの49行目〜です
（2019/9/15更新: どうもメッセージの形式が微妙に変わったようです、コメントありがとうございました！）

```(編集前)dispacher.py
    def _dispatch_msg_handler(self, category, msg):
        responded = False
        for func, args in self._plugins.get_plugins(category, msg.get('text', None)):
            if func:
                responded = True
                try:
```

```(編集後)dispacher.py
    def _dispatch_msg_handler(self, category, msg):
        responded = False
        text = None
        if 'attachments' in msg and len(msg.get('attachments')) > 0:
            text = msg['attachments'][0].get('pretext', None)
        elif 'text' in msg:
            text = msg.get('text', None)

        for func, args in self._plugins.get_plugins(category, text):
            if func:
                responded = True
                try:
```

差分：
https://github.com/lins05/slackbot/compare/develop...yakan10:develop

これを書き換えて、python run.pyすると、ちゃんとIFTTTにも反応するようになります。
![スクリーンショット 2019-01-20 17.41.47.png](https://qiita-image-store.s3.amazonaws.com/0/123125/df362f73-e0fc-4e66-2ca9-281deb77f765.png)

# 修正済みコード
https://github.com/yakan10/slackbot/tree/develop/slackbot
(※コード本体の修正のみで特にテストは追加してません...）

# 参考記事
https://qiita.com/zen7sky/items/fafe10a126e20f79fa36
ブロックチェーンの仕組み　〜ブロックチェーンは何で改ざんできないの？〜

ブロックチェーンについて勉強する機会が会ったので共有します。
開発とかの部分とかではなくて、ブロックチェーンの仕組み、改ざんできない理由をなるべくわかりやすく書きました！

# 対象者

・ブロックチェーンは聞いたことあるけどよくわからない人
・ブロックチェーンの概要を勉強したい人
・ブロックチェーンを人に説明できるくらいにはなりたい人

#ブロックチェーンとは？
ブロックチェーンとは、「**デジタル上の透明性を高め、データの改ざんを難しくする仕組み**」のことです。よく分散型台帳とか言われていますね。

ブロックチェーンは、**データの改ざんが難しい**と覚えておけば良いと思います。

# ブロックチェーンの仕組み

わかりやすいのでビットコインを例に説明します。

例えば、
「AさんがBさんに10ビットコインを送金」するとします。

これは一つの**ブロック**（トランザクション）となって、最初にトランザクションプールという場所に入ります。
この段階ではまだ取引は成立してません。

ブロックの中には、
・取引データ（ここでいうと、「AさんがBさんに10ビットコインを送金」というデータ）
・一つ前のブロックのハッシュ値
・ノンス
の3つのものが入ってます。


ハッシュ値とは、何かしらの文字列を通すとそれに対して返ってきたランダムな値のことです。（その処理を行う関数をハッシュ関数と言います。ハッシュ値はハッシュ関数を通した値って言い方もできます）

例えば、「いちご」をハッシュ関数に通すと、「39jieg52s9......」みたいな値になって返ってきます。（この値はランダムなので適当に書きました）
この「39jieg52s9......」がいちごのハッシュ値です。
ハッシュ値の特徴で、ハッシュ値からもとの文字列はわからないようになってます。つまり、「39jieg52s9......」をみても、「いちご」のハッシュ値だと理解することはできないようになってます。
ちなみにハッシュ値の桁数は一律に決まってます。（64桁か256桁かそんな桁数だったと思います、、）

次にノンスです
ノンスは「**正しいハッシュ値を見つけるための文字列**」のことです。ちゃんと説明しますね。

ブロックの中には先ほど言った３つのものが入ってます。それを取引として正式に承認するには、正しい**ブロックのハッシュ値**が必要になります。
**ブロックのハッシュ値**とは、上の３つ（取引データ、一つ前のブロックのハッシュ値、ノンス）を合わせたハッシュ値のことです。

例えば
・取引データを「あああ」
・一つ前のブロックのハッシュ値を「いいい」
・ノンスを「ううう」
とすると
このブロックのハッシュ値は、上の3つ合わせた「あああいいいううう」をハッシュ関数に通した「gn74gfg900sw...」の様な値になります。（この値もランダムです）
「gn74gfg900sw...」がこのブロックのハッシュ値です。

仮に取引データを「ああえ」とかに変えると、ブロックのハッシュ値も変わります。（「ああえいいいううう」をハッシュ関数に通すことになるので）

いま、「AさんがBさんに10ビットコインを送金」という取引は承認されていません（トランザクションプールにいます）
これを承認するには、
「**ブロックのハッシュ値の頭4つが0000から始まるハッシュ値になるようなノンスを見つける**」ことが必要です。

頭4つが0000??って感じですよねw

ブロックの中身の3つのうち、2つは決まった値です。その2つは取引データと一つ前のブロックのハッシュ値です。
前者はもちろん決まってますし、後者もブロックは繋がっているので決まった値です。
逆に変えることができるのは、ノンスだけです。
このノンスを変えて頭4つが0000のハッシュ値を見つける必要があります。

例えば先ほどの例だと、
ブロックのハッシュ値は「gn74gfg900sw...」なので頭4つは「gn74」なのでこのままだと承認されません。
ここでノンスの値を変えます（仮に「かかか」とします）
そうするとブロックのハッシュ値ももちろん変わります。（仮に「hdownd57...」とします）
これもダメですね。頭4つが0000ではありません。
またノンスを変えましょう（「さささ」とします）
ブロックのハッシュ値も変わります。（「0000hd7kf...」とします）
お！頭4つが0000になりましたね！これでこのブロックは承認され、「AさんがBさんに10ビットコインを送金」という取引は成立します！
この場合、このブロックのノンスは「さささ」で、ブロックのハッシュ値は「0000hd7kf...」になります。
つまりこの「さささ」というノンスを見つけることでそのブロックの取引が承認されるのです。これを「マイニング」と言います。


承認されると一番後ろのブロック（一つ前に承認されたブロック）に繋がります。ブロックは基本的に一本に繋がっています。またブロックが生成されれば、それを承認するためにノンスを見つけます。

これがブロックチェーンの仕組みです！

改めて簡単にまとめると、

取引をするとブロックが生成される＝＞これを承認するにはノンスをいじって0000から始まるブロックのハッシュ値を見つける＝＞見つけたら承認され、チェーンの最後尾にそのブロックが追加される！！

こんな感じです！

ちなみにビットコインでは、10分に１つのブロックが承認されます。つまり「AさんがBさんに10ビットコインを送金」という取引以外にも、10分の間に行われた世界中の取引が一つのブロックの取引データとして入っています。


# じゃあなぜ改ざんできないのか

改ざんできない理由は、
「**ブロック自体に、一つ前のブロックのハッシュ値が入っている**」からです。

例えば、
Bさんが「AさんがBさんに10ビットコインを送金」を
「AさんがBさんに50ビットコインを送金」にして儲けようとしたとします。

しかしこのデータの内容を（10から50）変えただけで、このブロックのハッシュ値も変わってしまいます。(頭4つが0000じゃなくなるので承認もされなくなります)
一つのハッシュ値が変わるとそれ以降に承認されたハッシュ値も全て変わってしまうので、どこが変更されたか一目瞭然でわかります。

なので改ざんするには、それ以降のブロックのハッシュ値に対するノンスを見つける必要があり、それは実質不可能です。

全てのブロック(一番目のブロック以外)は前のブロックに依存しているので、一つ変更しただけですぐにわかっちゃうということですね。


ちなみにブロックの承認にはみんなの合意が必要で、51%以上の合意があればそのブロックは承認され報酬がもらえます。（ビットコインが付与されます）

つまり、

一番最初にハッシュ値が0000~になるようなノンスを見つけた　＝＞　みんなで本当にこのノンスが合っているのか答え合わせ　＝＞　51%以上合意が取れれば承認！見つけた人は報酬ゲット！

って流れです！

こうやってみんなでデータを共有しながら処理を進めていくので、ブロックチェーンは非中央集権的なシステムと言われています。

# まとめ

ブロックチェーンはデータの改ざんが難しい！！
とりあえずこれがわかれば十分だと思います！

何か間違いとかあればご指摘お願いします！
Kali Linux にインストールされているツール・コマンド一覧

# Kali Linux とは
- Debian ベースのディストリビューション
- 複数のセキュリティ診断ツールを含んでおり、ペネトレーションテストで用いられる
- 右記のサイトからダウンロード可能 (https://www.kali.org/downloads/)
- VMware, VirtualBox用のイメージはこちら(https://www.offensive-security.com/kali-linux-vm-vmware-virtualbox-image-download

## インストールされているツール一覧
以下のサイトにまとめられている。
https://tools.kali.org/tools-listing
各ツール名をクリックすることでツールの詳細やコマンド例を見ることができる

## コマンド一覧
以下のサイトにまとめられている。
https://techlog360.com/a-z-kali-linux-commands/

## その他参考にしたサイト
https://ja.wikipedia.org/wiki/Kali_Linux
Android 開発 Logcat でログが表示されなかった理由

# 問題

Androidアプリの開発で `android.util.Log` を使ってログを書き出そうとしたら表示されなかった。

## 環境
- 開発環境: MacOS 10.14.2 / Android Studio 3.3
- 実行環境: UMIDIGI A3_Pro

## 解決策
実機をつなぎ直す。

## 原因
気付かずに通知センター(?)でUSBデバッグを無効にしていた。

## まとめ
USBデバッグは設定画面で有効になっていても、通知センターから一時的に無効にできる。
ログが表示されない場合は実行環境のUSBデバッグ機能を疑い、実機と開発環境をつなぎ直してみると、解決するかもしれない。
Windowsのclangで2通りのHello, World!

Windows 10(64bit版)でHello Worldプログラムを２つ書いてclangでビルドしました。１つはC++標準ライブラリを用いた書き方で、もう１つはWindows API(Win32 API)を用いた書き方です。

# C++標準ライブラリを用いた書き方

## ソースコード

```C++
#include <iostream>

using namespace std;

int main() {
    cout << "Hello, World!\n";
    return 0;
}
```

## 実行コマンド

```
clang -Xclang -flto-visibility-public-std -o hello1.exe hello1.cpp
```

# Windows APIを用いた書き方

## ソースコード

```C++
#include <Windows.h>

// NOTE: WinMain関数ではWindowsコンソールアプリケーションを生成できないようでした
int main() {
    char text[] = "Hello, World!\n";
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), text, strlen(text), NULL, NULL);
    return 0;
}
```

## ビルドコマンド

```
clang-cl -o hello2.exe hello2.cpp
```

# 考察

２つとも`Hello, World!`を出力するプログラムなので速度の計測を行ってもあまり意味がありません。２つの実行ファイルのファイルサイズを比較してみました。

```
2019/01/20  12:57               111 hello1.cpp
2019/01/20  13:54           232,448 hello1.exe
2019/01/20  14:39               290 hello2.cpp
2019/01/20  14:39            93,696 hello2.exe
```

hello2.exeはC/C++標準ライブラリのランタイムのラッパーコードがない分だけ実行ファイルのサイズが小さくなります。hello2.cppのビルドについてはVisual Studioのcl.exeでも試していますがclangよりもcl.exeのほうが若干ファイルサイズが小さくなっているようでした。

clangはWindowsのビルドチェーンとしてはVisual Studioに比肩するほどのパワーを持ちますが、clangのドキュメントを読むと、MSVC(Visual Studio)対応はまだ途中であると書いてあります(2019年1月)。軽量な実行ファイルを作るのであればC/C++標準ライブラリのリンクは外しておきたいところですが、たったの200kBですので大人しく使っておいてもいいように思いました。

## 追記(2019.1.23)

twitterにて、斎藤敦志さんから１点ご指摘がございました。WindowsのWriteConsole関数は標準出力をリダイレクトした場合にはそのリダイレクト先に出力がされない、とのことでした。実際に、

```
hello1.exe > tmp1.txt
hello2.exe > tmp2.txt
```

を実行したときにtmp1.txtには`Hello, World!`の出力がありましたがtmp2.txtにはありませんでした。
Kotlin + Firebaseで作るチャットアプリ入門2

#1 おさらい
Kotlin + Firebaseで作るチャットアプリ
ベースはすでに完成したので徐々に書いていきます。
細かいソースの内容はGitHubをどうぞ

[その１](https://qiita.com/P3117/items/e8123c876f154385e113)
[GitHub](https://github.com/TakuyaShirosaka/KotlinMessanger)

#2 今回やること
前回はサインアップの画面を作ったので
サインインの画面とサインイン成功時の遷移先の画面を作ります。

###2-1 手始め
アプリとは関係ありませんが、Dockerを最近勉強し始めました。
そのため、Hyper‐Vとかの関係でがDockerとAndroidエミュレーターが喧嘩してうまく動かない事態に
なのでWindowsの機能でWindowsハイパーバイザープラットフォームを有効化しておきます。
→これをやってるとDockerもAndroidエミュレーターも動きます。

###2-2 サインイン画面

![Android Emulator - Pixel_2_API_28_5554 2019_01_20 16_57_18.png](https://qiita-image-store.s3.amazonaws.com/0/309466/634b2868-762a-94bd-4b11-736e8ce8409d.png)

画面的には簡単にEmailとPasswordのテキストボックスを配置
ログインのボタンはボタンの部品を配置した後、android:background="@drawable/rounded_button"
といった感じに別ファイルで定義したスタイルを適用している感じです。
ちなみにrounded_buttonは以下のような感じです。

```rounded_button.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@android:color/holo_green_dark"/>
    <corners android:radius="25dp"/>
</shape>
```

ログインの機能については、FireBaseのAuthenticationを使用しています。
機能についてはSDK経由で簡単にできるようになっています。

```LoginActivity.kt
//ログイン
FirebaseAuth.getInstance().signInWithEmailAndPassword(email, password)
   .addOnCompleteListener {
      Log.d(TAG, "Successfully signInWithEmailAndPassword")
      val intent = Intent(this, LatestMessagesActivity::class.java)
      intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
       startActivity(intent)
    }
    .addOnFailureListener {}
```

###2-3 直近のメッセージ一覧の画面
何というか迷ったがとりあえずこの呼称で行く
![Android Emulator - Pixel_2_API_28_5554 2019_01_20 17_13_01.png](https://qiita-image-store.s3.amazonaws.com/0/309466/5e602dec-6e01-5db4-d356-28ce55adad99.png)

この画面はパーツが大きく分けて
・メッセージの一覧を受け入れる母体(activity_latest_messages.xml)
・メッセージの行(写真＋名前＋最近のメッセージ)(latest_message_row.xml)
・画面上部のツールバーみたいなの(onCreateOptionsMenuでnav_menu.xmlを設定)
といったつくりになってます。
→NewMessageはLineでいう新規のトーク、サインアウトは読んで字のごとくです。

処理的にはFireBaseのRealtimeDatabaseから情報を取得して
レコード毎に画面に表示させていってる感じです。
画像はfromId,toIdに紐づく、usersのディレクトリから画像の保存先を再取得してるかんじです。
![kotlinmessenger – Database – Firebase console - Google Chrome 2019_01_20 17_29_14.png](https://qiita-image-store.s3.amazonaws.com/0/309466/e786de14-9501-add1-408c-959d632cac54.png)

![kotlinmessenger – Database – Firebase console - Google Chrome 2019_01_20 17_22_00.png](https://qiita-image-store.s3.amazonaws.com/0/309466/6bd0106d-9e41-8cd4-459c-69f79bfa2359.png)

DB周りの処理もSDK経由でできます。
めっちゃ便利ですね。

#3 次回
NewMessageの画面の予定です。
【一年生の頃の私へつづる言葉③】画像の扱いは慎重に。

・今となっては、当然のごとく使用していることを、ただ手紙としてしたためるだけの記事の第三弾。
・備忘録かつ童心回帰の「Orangeごっこ」による中毒症状は、なかなか治療法が見つからない。
・よし。今回は過去の失敗経験の払拭録を書こう。
・「これが届いた当時の私よ。このことを肝に銘じて、頭を冷やすように。」
## 画像形式と圧縮について
### ＜当時＞
- 「画像形式」・・・「透過と無透過での判断」・「写真かイラストかどうか」など、なんとなくの判断で使い分けていた保存形式。仕組みや使い分け・種類など、ほぼほぼ理解せず使用していた。  
→間違った形式で保存して、重くなったり、表示が変になってしまうこともしばしば。
- 「圧縮」・・・画像サイズを気にせず、ただ好きなものを学習用のサイトや添付として貼りまくっていた。  
→個人学習の時は気にしていなかったため、容量やUI等の観点において、そこまで意識していなかった。
  
→これらにより、「重すぎる」「表示が変」等、担当者からの多大な指摘が吹き荒れる。

### ＜現在＞
仕組みや圧縮作法・ツール等を基礎からしっかり学習。

- ***大きな種類***  
    - ①ビットマップ画像・・・画像を画素（色等の情報が入った細かい点）で表現したもの。「JPG」「PNG」「GIF」等はこの部類。  
    →画素数が増えるほど、解像度が上がってきれいなるが、容量も重くなる。
    - ②ベクター画像・・・画像の線や色を計算式（データ）で表現したもの。「SVG」や「PDF」等はこの部類。  
    →拡大の際でも計算式の都度変更のため、画像荒れがほぼない。ただ写真等の大量の色を扱う画像は向いてない。

- ***使い分け***
    - ①写真・・・基本的に「JPG」を扱う。  
    →大量の色の扱いやすさ・容量の小ささという点において、写真に向いている。
    - ②イラスト・・・基本的に「PNG」を扱う。  
    →ロゴ画像やグラフ画像等の扱いやすさに加えて、透過画像サポートもしている。  
    ※「SVG」はマルチ画面対応や画像編集の柔軟さにおいて多くの強みがあるが、未対応ブラウザのため、導入は慎重にする。

- ***圧縮方法***
    - ①画像編集ソフト・・・「ペイント」「Photoshop」等のサイズ変更機能や圧縮機能を用いる方法。
    - ②コマンド・・・「Guetzli（Google製圧縮コマンド）」「jpegoptim」等のコマンドで、開かずに行う方法。主に大量圧縮等に使用。  
    →主な詳細は[こちら](https://liginc.co.jp/403045)
    - ③ブラウザ圧縮ツール・・・インストール不要で、ブラウザ上で行う方法。主に都度使用や小規模圧縮に使用。下記おすすめ。
        - [iloveimg](https://www.iloveimg.com/ja/compress-image)・・・PNGの圧縮率が高い。大量圧縮も可能。
        - [Squoosh](https://squoosh.app/)・・・注目の新フォーマット「Webp」圧縮も可能。圧縮前後での比較可能。

- ***その他***
・「Webp」をサイト上で扱う場面がある場合（※私がそうであった）、ブラウザ対応状況も考えて、現状は下記のように対応。  
→[こちら](https://caniuse.com/#feat=webp)に応じて、定期的に変更。

```html
<!-- Webp未対応ブラウザの場合、PNG画像を表示 -->
<picture>
  <source type="image/webp" srcset="test.webp" />
  <img src="test.png" width="" height="" alt="test" />
</picture>
```
        
### ＜過去の私へ送る言葉＞
- <font color = "tomato">Web担当になって、てんやわんやが止まらないと思うが、落ち着いて。</font>
- <font color = "tomato">こういう一見地味な知識をコツコツ学んでいこう。</font>

## まとめ
- 今回は、画像の扱いということで、容量などおかまいなし精神でペタペタ貼りをしていた頃を懐かしみながら、記事を書く。
- 「あの日の担当者からの怒涛の指摘があって良かったぁ」と、量産型自己啓発の世界へ没入。
- 「とにかく、GoogleとAdobeは最強」という、ただただ着地失敗な結論で終了。
GitHubを使い始めてみる

#はじめに

　明けましておめでとうございます。１月もすでに終盤に入った今日この頃ですが、本記事が2019年初投稿になります。本年も残念な記事を量産し続けそうな気がしますが、ご指導・ご鞭撻のほど、何卒よろしくお願いいたします。

　今回は、GitHubに挑戦してみます。これまでは、ちまちまJavaのプログラムをつくり、~~自虐ネタ~~色々勉強したことを含めて投稿してきたのですが、ソースコードの分量が増えてくるにつれ、自分がどこを書き換えたとか、どこを書き換える予定なのかとか、うまく動かなかったらどこを変更前に戻すのか、といったことがさっぱり分からなくなってしまいました。これらの混乱に加え、昨年12月に[株式会社ITPM Advent Calendar 2018](https://qiita.com/advent-calendar/2018/itpm)で投稿したことによる、やりきった感（自称）も相まって、ちょっとモチベーションが下がってしまっていました。で、少し期間を置いて~~ぐーたら~~リフレッシュしたところで、心機一転、勉強を再開しようと思った訳ですが、せっかくなので上記の混乱の元を断ち切ることから始めることにしました。

#GitHubとは？……すみません、良く分かりません

　[ウィキペディア](https://ja.wikipedia.org/wiki/GitHub)より抜粋。
>GitHubにソースコードをホスティングすることで複数人のソフトウエア開発者と協働してコードをレビューしたり、プロジェクトを管理しつつ開発を行うことができる。
このサイトはSNS機能をもち、feeds、followersとして提供されている。ネットワークグラフとして開発者は自身のソースコードのバージョンのリポジトリを視覚的に把握できるようにしている。

　もうね、カタカナが多すぎて何言ってるか良く分からんのです。いつも変数名を英語にしようとして長時間悩んでしまう、英語が苦手な私にはなかなか辛いものがあります。しかし、ここでまたモチベーションを下げる訳にはいかないので、辛いものからは目を背けつつ、とりあえずできたら良いやの方針でやっていきます。

　ちなみに、上記の説明を私なりに翻訳すると「GitHubではソースコードをみんなで共有して、意見を言い合ったり開発したりできるよ。ソースコードのバージョンは目で見て分かるようになっているよ」となりました。色々見なかったことにしていますが、気にしない。

#とりあえず、何かプロジェクトをつくってみる

　日本語に対応していないというのは知っていましたが、想像以上にきつかったです。
![qiita_githublogin.png](https://qiita-image-store.s3.amazonaws.com/0/305248/e98b15a9-e336-1577-2b93-20d4bcbc832a.png)

ちょっと何書いてるのか分かんないですが、とりあえず真ん中辺りにある「Start a project」を押してみます。当然、何書いてるのか分からないので、Chromeの翻訳機能も使います。

![qiita_githubripositori.png](https://qiita-image-store.s3.amazonaws.com/0/305248/63604980-f17c-2fec-84da-a217c9580437.png)

GitHub「優れたリポジトリ名は短く覚えやすいです。インスピレーションが必要ですか？__至高ワッフル__はどうでしょう。」
私「ちょっと何言ってるか分かんない。」

更新するたびに、シルバーオクトアドベンチャーとか、リファクタリングワッフルとか、ファンタスティックポテトとか、__斬新__なインスピレーションを与えてくれるので、とりあえず「MyOthello」にしてみました。で、いずれQiitaにリンクを貼る予定なので「Public」を選んで、「Create Repository」を押します。この辺で今更Repositoryの意味をぐぐってみると「倉庫」。なるほど！

![qiita_githubripositori2.png](https://qiita-image-store.s3.amazonaws.com/0/305248/3133b8b7-f883-09e2-df56-de6a7b28dd56.png)

　この辺から、翻訳しても訳が分からなくなってきました。とりあえず「uploading an existing file（既存のファイルをアップロードする）」を押します。

![qiita_githubripositori3.png](https://qiita-image-store.s3.amazonaws.com/0/305248/586f810d-fbd8-4625-deba-281582c4de6b.png)

すると、「ファイルをドラッグしなよ」的なエリアが出現するので、[以前のオセロの記事](https://qiita.com/syoukou/items/ac4cf24f69122002523c)のソースコードをコピペしたファイル「Othello.java」をドラッグし、「Commit changes」を押します。

![qiita_githubripositori4.png](https://qiita-image-store.s3.amazonaws.com/0/305248/3ebfade8-03f3-76d8-99e1-444f87cc7aff.png)

　良く分かりませんでしたが、なんかできたっぽい画面が出てきました。

#終わりに

　現時点においても、ブランチとかリクエストとか良く分からない用語で目白押しなのですが、ひとまずはGitHubでバージョン管理をする準備ができたという感じでしょうか。勢いでやってしまったので、ひょっとしたら何かやらかしているかも知れませんが（ご指摘いただけると、大変助かります）。

　ここまでお読みいただき、ありがとうございました。
退屈なことはPythonにやらせるやつの演習プロジェクト〜コツコツとコラッツ数列〜

#退屈なことはPythonにやらせよう
![image.png](https://qiita-image-store.s3.amazonaws.com/0/330590/1a265c52-2b58-bd45-2727-679a9ef2864b.png)

##はじめに
　最近プログラマの間で流行り？　の良書である「退屈なことはPythonにやらせよう」．
　６章までのPythonチュートリアルも実に魅力的で，章末についている演習問題は，ノンプログラマー向けの復習問題としても役に立つだろう．
　そして演習問題のあとに鎮座しているのが「演習プロジェクト」．これが実に面白いと評判だが，問題なのはここから．

　そう，**解答がない**．

　一部のプログラマや熟年プログラマならばパッと数学の解法のように思いついてしまうのかもしれないが，残念ながら貧相な私の知識と経験では思いつかないものもある．
　そのため，運良く思いついた一部の演習プロジェクトの回答をメモしていくものである．

##注意
　この文章は薄くて軽い内容です．

##略称？
　略称を募集中．
　個人的にブームなのは「退屈なことはPythonにやらせよう」，略して「退屈なPython」．この矛盾した感じがツボにはまったのだが，一部の人に怒られそうなのでやめておきたい．


##３章演習プロジェクト「コラッツ数列」
　コラッツ数列の詳しい説明については[Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%A9%E3%83%83%E3%83%84%E3%81%AE%E5%95%8F%E9%A1%8C)を参照．
　ものすごーく簡単にすると，任意の整数を選び，奇数であれば３をかけ１を足したものを返し，偶数であれば２で割る．返り値（プログラミングの便利な用語）で同様にして再帰的にやっていくといつの間にか１になってしまうという不思議な数列である．
　まだ未解決だとか．

　「ちょっと何言ってるかよくわからない」問題もあるこの書籍において，簡単な部類であろう．
　無限ループを作り，条件分岐をすればよい．

```python:collatz.py
def collaz():
    print("整数を入力してください")
    try:
        number = int(input())
    except ValueError:
        print("整数値を入力してください")
    if number % 2:
        return number * 3 + 1
    else:
        return number / 2
print(collaz())
```

##プログラム内に改善箇所があればご指摘お願いします．

##追記
　一日以内に追記するという驚きのクオリティ．

```python:collatz2.py
#関数の機能を一つずつにするため，関数を分けて作成．
#整数除算，数値以外の入力時エラー表示とともにプロンプト再表示．

def input_number():
    print("整数を入力してください")
    while True:
        try:
            num = int(input(">>"))
        except ValueError:
            print("Error! 整数を入力してください")
            continue
        break
    return num

def collatz(number):
    if number % 2:
        return number * 3 + 1
    else:
        return number // 2

print(collatz(input_number()))
```
　ご指摘くださった[shiracamus](https://qiita.com/shiracamus)さん，ありがとうございました．
【BAT】IF文やFOR文の括弧内で変更した変数の値を取得する方法

# はじめに
この前ハマったので書いておく。
結論からすれば、よくハマると言われる遅延環境変数の問題だったわけですが、遅延環境変数は知っていたのですがFOR文のとき使用するものと思い込んでいて、IF文でも同様だったことに気がつかなかった。

下記の記事を見つけてやっと解決できたわけです。
[バッチファイル。IF文やFOR文の中で複数コマンドを書く時の注意点 - Windowsのコマンドプロンプト(bat,cmd)](http://tounderlinedk.blogspot.com/2011/01/if-windowsbatcmd.html)

# 例
サブルーチン内で変数の値を変更し、if内でその変数の値を使用しようとした際にハマりました。
変数なら駄目なのかとサブルーチンの戻り値として「exit /b 値」として、%errorlevel% で使用しようとしても同じでした。

```bat:test.bat
@echo off
set hoge=0
set fuga=0

call :test

pause
exit

:test

if %fuga%==0 (  
  call :test2
  echo if内hoge=%hoge% 
)

echo hoge=%hoge%

exit /b

:test2
set hoge=1

exit /b
```

call :test2 で変更したhogeの値はif内では反映されません、括弧内で代入する前の値となります。
代入した値が有効になるのは、IF文やFOR文を抜けた直後となります。

```bat:想定している値
if内hoge=1
hoge=1
```

```bat:実際の値
if内hoge=0
hoge=1
```

# 対応
遅延環境変数を使用すればいい。

* `setlocal enabledelayedexpansion` と `endlocal` で囲む
* 遅延評価したい環境変数は`%`ではなく`!` で囲む

今回はif内括弧の `echo if内hoge=!hoge!` に変更しています。 

```bat:test.bat
@echo off
set hoge=0
set fuga=0

setlocal enabledelayedexpansion

call :test

endlocal

pause
exit

:test

if %fuga%==0 (  
  call :test2
  echo if内hoge=!hoge! 
)

echo hoge=%hoge%

exit /b

:test2
set hoge=1

exit /b
```

これで想定した結果となります。

```bat:実際の値
if内hoge=1
hoge=1
```

# 最後に
他のプログラム言語と同じように単なるグローバル変数だと思い込んでいるとハマりますね。
解決しようとしてネットで検索しようとしても、何のキーワードにすればいいんだって感じです。

今回タイトルを「IF文やFOR文の括弧内で代入した変数の値を参照する方法」にしようと思ったのですが、代入や参照というキーワードでは検索されないと思ったのでやめました。
Pingを基礎から理解しよう1~ICMPプロトコル

## はじめに

こんにちは！テコンドーです。前回の記事に続きネットワークの勉強してます。

```
➜  source ping www.google.co.jp
PING www.google.co.jp (172.217.25.67): 56 data bytes
64 bytes from 172.217.25.67: icmp_seq=0 ttl=52 time=13.817 ms
```

ネットワークの疎通を確認するときにPingコマンドって必ず使いますよね

Pingコマンドとはネットワークを確認したいホストに対してIPパケットを送信して、通信ができるかどうかを確認するコマンドです。

Pingを活用する事でIP以下の階層でエラーがおきているのかどうかを確認する事ができます。

しかしPing通信が実際に何をしているのかはみなさん意外と知らないはず。

なのでPingについての話をしていきたいと思っています！！！

今回はPingを支えているOSI参照モデルとICMPプロトコルについて話していきます！

では早速見ていきましょう！

## OSI参照モデルについて

Pingを詳しく見ていくためにはOSI参照モデルについて理解しましょう。

OSI参照モデルとは、

![alt](https://camo.qiitausercontent.com/d6a1429cdccec949aac629ba4e7a21e68c69cde5/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3133303330322f30623837326261622d333738642d366463642d376163372d3261333631663764313532662e676966)

こんなやつ。通信プロトコルを７つの階層に分けることを言います。

このプロトコルに準拠することで**異種機関**が通信を行う事ができます。

USB端子っていろんな企業が規格を守っているからどのメーカーの物でも不自由なく使えますよね？
それと同じように通信の世界でもルールを決めてそれを守る限り通信を行う事ができます。

pingコマンドではネットワーク層までの通信を確認しています。



## ICMPプロトコル

PingコマンドではICMP（Internet Control Message Protocol）を使用しています。

このプロトコルは
>ICMP ( Internet Control Message Protocol ) は、IPプロトコルの「エラー通知」や「制御メッセージ」
　を転送するためのプロトコルです。TCP/IPが実装されたコンピュータ間で、通信状態を確認するために
　使用されます。 ICMPはインターネット層（OSI参照モデルのネットワーク層）で動作するプロトコルです。
[引用](https://www.infraexpert.com/study/tcpip4.html)

です。
階層的にはIP、ARPと同じインターネット層となっていてTCP等のトランスポート層の一つ下です。*1

ここでわかるのは、
**PingはIPの通信を確認しているだけで、TCP/IP通信を確認しているわけではない**
という事です。

はじめはTCPも含めた通信を確認してくれるところだと思っていたのですが、そうでないと調べて初めて知りました。

### PingではPortの指定ができない
この理由もPingがIP通信のみを確認しているからです。
Portの指定をして通信するのはTCPの範囲となっています。
ですのでPortをPingで指定することはできないんですね

##　まとめ

今回はOSI参照モデルとICMPプロトコルについて書きました。
今後はパケットを送信してからDNSでホスト名をアドレスに変換➡︎ルーターを経由して指定ホストへ到達するところまで調べていきたいです。
それでは！！！

コンピューターってアルファベット略語多いですよね、、、
この調子で作成されていくといずれ略語枯渇するんじゃないかな、、、



##　注釈
[1] 
インターネット層なのだが、ICMPはIP通信の疎通を確認するために存在しているので、フォーマット的にはIPの上位のような扱いになっている。
[画像の引用](https://www.infraexpert.com/studygif/tcpip11.gif)

## 参考文献
[Qiita記事、OSI参照モデルについて（OSI参照モデル画像引用）](https://qiita.com/tatsuya4150/items/474b60beed0c04d5d999#%E5%8F%82%E8%80%83)
初心者のUnityゲーム作り2

# はじめに
少し時間がたってしまいましたが、2回目です。
前回（[初心者のUnityゲーム作り](https://qiita.com/qtminuro/items/dfcd3d6dc69546e9688d)）の続きです。
タイトル画面、スコア、ライフ、ゲームオーバーを作成しました。
前回同様、調べたポイントを残しておきます。

# 作ったもの
タイトル画面～
![title.png](https://qiita-image-store.s3.amazonaws.com/0/311225/836caf57-d00c-0757-b3d9-fd68b7197a60.png)
めちゃくちゃシンプルだけど、タイトルあるだけでゲーム感マシマシ。

メイン画面にもスコアとライフを表示しました。
![main.png](https://qiita-image-store.s3.amazonaws.com/0/311225/83890870-91d0-399a-088d-c71fa055b28b.png)

ゲームオーバー状態。
![gameover.png](https://qiita-image-store.s3.amazonaws.com/0/311225/3cf110d4-2459-18f3-f311-8401082eaaae.png)


# シーンの遷移
```cs
using UnityEngine.SceneManagement; // シーン遷移用

public class GameOverBtn : MonoBehaviour 
{
    public void OnClick()
    {
        SceneManager.LoadScene("Title"); // シーン遷移
    }
}
```
`LoadScene("シーン名")`で遷移できます。
ちなみに、`LoadSceneAsync`は非同期らしいです。どう使うかはよくわかりません。

# ハイスコアの保存
ゲームを終了しても値を保持する方法を調べました。

```cs
    PlayerPrefs.SetInt("hiscore", score);
    score = PlayerPrefs.GetInt("hiscore");
```
`SetInt("名前", "値")`で保存、`GetInt("名前")`で取得できます。
他にも以下のような種類があります。

| メソッド名  | 保持する型   |
|:-----------|:------------|
| GetInt     | Int         |
| GetString  | String      |
| GetFloat   | Float       |
また、`HasKey("名前")`でその名前で値を保持しているかbool値で返してくれます。

# オブジェクトの取得
```cs
    GameObject hoge = GameObject.Find("GameManager");
```
`GameObject.Find("名前")`でシーン上のオブジェクトを取得できます。
他にも`FindGameObjectWithTag("タグ名")`といったものもあります。
おいおいまとめたいです。

# 他のスクリプトを参照
```cs
    GameObject.Find("GameManager").GetComponent<GameManager>().damageMethod();
```
先述のメソッドで取得したオブジェクトから`GetComponent<"スクリプト名">`でスクリプトを取得して、その中のpublicのメソッド・変数を参照できます。
あらかじめ、取得するオブジェクトにスクリプトをアタッチしておく必要があります。

# オブジェクトの表示・非表示
```cs
    gameoverPnl.SetActive(true);
```
`SetActive`を呼ぶだけです。trueなら表示。falseなら非表示です。
注意としては、これで非表示にしたものは先述の`Find`等で参照できなくなります。あらかじめ変数に確保などが必要です。

# ボタンクリック処理
まず、以下のスクリプトを用意します。

```cs
public class StartBtn : MonoBehaviour 
{
    public void OnClick()
    {
        SceneManager.LoadScene("Main");
    }
}
```
このスクリプトを、UIで作成したボタンにアタッチし、`Button`コンポーネントの`OnClick`欄の+ボタンを押します。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/311225/c9678edf-2c6b-9a6b-d2c1-063a1d1c670a.png)
左下のNoneになっているところを押します。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/311225/6cfdd3d0-5d26-b913-d5ec-808f15db1339.png)
呼び出したい処理がアタッチされているオブジェクトを選択します。（ここでは自分自身）
![3.png](https://qiita-image-store.s3.amazonaws.com/0/311225/d1c2d55f-b993-f939-54bf-b6525371b647.png)
No Functionになっている部分を押します。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/311225/0c52af79-a17a-1bc2-1f3f-829c8a973266.png)
選択したオブジェクト名の中の呼び出したいメソッドを選択します。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/311225/ea788e61-f8e7-8f55-baa2-25c4e9397902.png)
これで呼び出せるはずです。

# UIの配置
完成と思いビルドして実行してみたところ、下のようになってしまいました。
![miss.png](https://qiita-image-store.s3.amazonaws.com/0/311225/e9d89460-dad7-f9b3-ec55-f5d10203dbd1.png)

……UIのテキストの表示がおかしい！

色々調べまして、ひとまず以下の方法でうまくいきました。

Canvasの`Canvas Scaler`コンポーネントの`UI Scale Mode`を`Scale With Screen Size`に変更する。（変更時に表示が乱れたのでそこは修正しました。）
![ui.png](https://qiita-image-store.s3.amazonaws.com/0/311225/0b61ac2b-59c1-2f24-4d8d-a789a98715f0.png)

# さいごに
今回作ったゲームは一旦ここまでにします。
次は3Dも触ってみたいです。アセットストアとかも。
それではまた次回に。
【Oculus Go】Canvasを表示する

# はじめに
Oculus Goの画面上にCanvasを表示してみます。

# 準備
* [【Oculus Go】コントローラを表示する](https://qiita.com/eKushida/items/0ba3599536c3aef51f04)
* [【Oculus Go】コントローラからレーザーポインタを表示する](https://qiita.com/eKushida/items/ba58949dc2d85ee39f6f)

# 手順
## 1. Canvasの追加
Hierarchy上にCanvasを追加し、インスペクタで、以下のような設定に変更する。

| 項目名 | 値 |
|---|---|
| Render Mode | WorldSpace |
| Event Camera | OVRCameraRig > TrackingSpace > CenterEyeAnchor |
| Rect Transform | (PosX, PosY, PosZ) = (0, 0, 200) |
| Width | 500 |
| height | 200 |

<img width="374" alt="スクリーンショット 2019-01-20 15.41.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/0373e139-5519-0298-1f54-c35e5bed52ef.png">

## 2. OVRRaycasterの追加、Graphic Raycasterの削除

「Graphic Raycaster」コンポーネントを削除し、Assets > OVRInputSelection > InputSystem > OVRRaycasterを追加する。

<img width="376" alt="スクリーンショット 2019-01-20 15.42.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/22aaa617-5261-29a2-c3af-1e46c82aa375.png">

## 3. EventSystemの設定
「Standalone Input Module」を削除し、Assets > OVRInputSelection > OVRInputModuleを追加し、インスペクタで、以下のような設定に変更する。

| 項目名 | 値 |
|---|---|
| Tracking Space | OVRCameraRig > TrackingSpace |

## 4. Canvasに背景色をつける
「Image」コンポーネントを追加し、Canvasの範囲がわかりやすいように背景色をつける。

<img w<img width="384" alt="スクリーンショット 2019-01-20 15.43.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/9daaf470-1411-91e8-6f55-f17f66099670.png">

## 5. 実行
Canvasが表示されました。
が、、、レーザーポインタが突き抜けています。

![canvas.jpg](https://qiita-image-store.s3.amazonaws.com/0/71694/9fff7c7e-928c-1851-14d1-3a4b5ecea5c8.jpeg)

OVRPointerVisualizer.csのコードを修正すると、良い感じになりました。

![screenshot-1547969828776.jpg](https://qiita-image-store.s3.amazonaws.com/0/71694/ee14b1e8-407e-777f-7bb2-01b594b5d5ad.jpeg)

# おまけ

## 6. UIパーツの追加
Canvas上にTextとButtonを適当に配置してみます。
ゲーム画面上は、以下のように配置しました。

| 項目名 | 値 |
|---|---|
| Text (x,y,z) | (0, 80, 0)|
| Button (x,y,z) | (0, 20, 0)|

画面の中心が、(0,0)ぽいことが、ようやく分かってきました。

<img width="595" alt="スクリーンショット 2019-01-20 16.02.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/71694/f749e262-1eaf-656a-377b-a44073ab9282.png">

## 7. 実行
Game画面と特に変化はありません。

![screenshot-1547969679766.jpg](https://qiita-image-store.s3.amazonaws.com/0/71694/63b52daa-e181-4381-8fd4-5cd6d8eb63e6.jpeg)

# 次回への課題
イベント処理を実装できるようにしたいです。
Pythonでランダムな数列を1行で作る

#Pythonでランダムな数列を1行のコマンドで作る
ランダムな数列をちょっとほしいときに便利。リスト内包表記を使えば1行で書けます。すぐ忘れそうなので自分用にメモしておきます。
Google Colaboratory（Python3.6）利用。

##浮動小数点のランダムな数列を作る
```.py
#-10～+10の範囲で浮動小数点のランダムな数列を作る
import random
numlist = [random.uniform(-10,10) for i in range(5)] 
print(numlist)
```

##整数のランダムな数列を作る
```.py
#0～+10の範囲で整数のランダムな数列を作る
import random
numlist = [random.randint(0,10) for i in range(10)]
print(numlist)
```
バックスラッシュで標準のコマンドを実行する

# 概要

間違って実行して痛い目見たので、まとめ。

# サーバーの設定によるコマンド実行の差分

サーバーのエイリアスの設定によっては複数サーバーのコマンド実行を行う場合は、独自のコマンドを使われてしまう可能性がある。(というか実際あって、障害を起こしかけた・・・)

## 例

```bash:リリースしたいコマンド
# 元からあるsampleディレクトリのの名前を変えて、
# sample2ディレクトリからsampleディレクトリにシンボリックリンクを貼りたい

mv ~/sample ~/stash_sample;ln -nfs ~/sample ~/sample2 
```

```bash:ssh先の.bashrc
alias mv=mv -i 
```

これによって確認が入ることになるが、確認のレスポンスをすることはリリースするコマンドの考慮入っていないため、最後までコマンドが実行されずに終わってしまう。さらに「;」が使われていることで、lnコマンドが実行される。(-nfsのオプションを使っていたことからもっとおかしなことになる)

このようなことを起こさないためには、エイリアスを適用しないようにする工夫が必要。

# バックスラッシュが救世主

バックスラッシュ　をつけるとどうやらエイリアスを無視して標準のコマンドを実行するらしい。
今回リリースしたかったコマンドを実際に利用する場合は、以下のように実行すればよかった。

```bash:本来リリースすべきだったコマンド
\mv ~/sample ~/stash_sample;\ln -nfs ~/sample ~/sample2 
```
AWS DocumentDBを作成して、EC2から接続するまで

最近発表されて話題になっていたAWS DocumentDB(以下DocumentDB)を使ってみた。

##DocumentDBとは？
AWSが最近発表したMongoDBと互換性のあるデータベース。
MongoDBでのスプリットブレイン問題などが解消されている。
MongoDBとの互換はversion: 3.6(最新は4)
実態はMongoDBをエミュレートしているだけ。

##想定されるユースケース
現在多くのサービスでNoSQLとしてDynamoDBが用いられているが、これがDocumentDBに置き換わっていくかもしれない。
SQLで手軽に検索できるのはやはり大きい。

##セットアップ
[公式トラブルシューティング](https://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/troubleshooting.html#troubleshooting.cannot-connect)によるとパブリックエンドポイントがサポートされておらず、同一VSN内、同一リージョン内でないと接続できないとのこと。
sshトンネルなどもできるらしいが、今回は普通にec2のLinaxからアクセスして試してみることにした。

##クラスターを作成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185233/b5ae04fe-4678-7c43-9b22-8db434ff1cf8.png)

画面からまずはクラスターなるものを作成する必要がある。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/185233/5d8f178f-1a67-29f5-778b-c608e296d2c3.png)
作成すると、指定したインスタンス数に応じてインスタンスが立ち上がる。
ここに書かれている情報を用いて接続する。


##接続
ec2インスタンスを作成する。

ssh接続してMongo3.6.9をインストールする

```
sudo vim /etc/yum.repos.d/mongodb-org-3.6.repo
```
を実行して以下のコードを書き込む

```
[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/amazon/2013.03/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
```
書き込んだらインストールののちにdocumentDBに接続！

```
sudo yum install -y mongodb-org-shell
mongo --ssl --host [DocumentDBのClusterのドメイン]:27017 --sslCAFile rds-combined-ca-bundle.pem --username [ユーザ名] --password [パスワード]
```




##結果
パブリックエンドポイントが使えないのはちょっと悲しい。 次回はLambdaからアクセスして使ってみたい。
前にどこかの記事でこういう優良なオープンソースをクラウドサービスが全て持って行って利益を総取りしてしまうためにコミュニティが育たないという批判記事を見かけた気がするが、やっぱりAWSとなると信頼性がすごい。安心できる。
東京リージョンもまだサポートされていないし、これからが楽しみなサービス。
どうでもいいけど、1日動かしっぱなしにしておいたら$13も取られた… 高い…

##参考
https://dev.classmethod.jp/cloud/docdb-via-nlb/
https://docs.aws.amazon.com/ja_jp/documentdb/latest/developerguide/troubleshooting.html#troubleshooting.cannot-connect
AMScrollingNavBarで戻った時に上の位置がずれる

#はじめに
このAMScrollingNavBarを使ってNavigation barを隠し、表示領域を増やそうと考えCocoaPodsを使って入れた。しかし、navigationbarが思い通りに隠れず調べても分からなかったので書いてみた。

#CocoaPods導入
自分で書いたものであるのでこの記事の参考文献なども見ていただくと深く知ることができるかもしれません。
[CocoaPods導入](https://qiita.com/suzuki-ryou/items/7967ffff1e040c78f3d1)

#Podfileの変更
Podfileを変更する。Podfileの一部抜粋。

```:Podfile
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks

pod 'AMScrollingNavbar'

use_frameworks!
```

変更される可能性があるのでリンクも添えて
[AMScrollingNavBarの元リンク](https://github.com/andreamazz/AMScrollingNavbar)

#いよいよ書き込み
- `???.xcworkspace`を開く。
- storyboardのNavigation ControllerのclassをScrolling Navigation Controllerにし、ModuleをAMScrollingNavBarにする。
- その後`???.swift`に書き込む。必要部分だけを抜粋

```swift:ViewController.swift
import AMScrollingNavbar
class ViewController: UIViewController{
override func viewDidLoad() {
        super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if let navigationController = navigationController as? ScrollingNavigationController {
            navigationController.followScrollView(tableview, delay: 50.0)
        }
    }
}
```

このときnavigation barを透明化するプログラムを書いていると正しく表示されないと書かれていたがそんなんことはなかった。透明化するプログラムは書いてもよかった。

```swift:ViewController.swift
 self.navigationController?.navigationBar.isTranslucent = true
```

#失敗する例
ここに書いてある失敗する例は書かれていなかった気がする。
toolbarやnavigation barを隠すことができる元々のものがある。
そのコードを書いているとうまく動かない。

```swift:ViewController.swift
func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if scrollView.panGestureRecognizer.translation(in: scrollView).y < 0 {
            navigationController?.setToolbarHidden(true, animated: true)
        } else {
            navigationController?.setToolbarHidden(false, animated: false)
        }
    }
```
このコードを書いているとおそらくtoolbarの高さ分だけスクロールするたびに一番上の値が変わっていく。期待通りの結果は得られなくなる。

#最後に
toolbarも一緒に変更したい場合は違うライブラリを使うしかないということがわかった。

#参考文献
[途中で紹介したAMScrollingNavBarの元リンク](https://github.com/andreamazz/AMScrollingNavbar)
CocoaPodsの導入方法

#はじめに
Xcodeでアプリ開発を進めていくとどうしても欲しい機能が実装できなくて困っていた。そんな時にライブラリに出会い導入する方法を調べて忘れないためにここに保存しておこうと思う。

#環境
Xcode:Version 10.1(10B61)
macOS Mojave:Version 10.14.2

#導入
ターミナルを起動し以下のコードを入力。

```
sudo gem update --system
```

```
sudo gem install cocoapods
```

エラーが出たら下記を。

```
sudo gem install -n /usr/local/bin cocoapods
```

```
pod setup
```

これで初期設定が完了。次にアプリにcocoapodsを使ってライブラリを入れます。まずアプリがあるところまで到達。

```
ls
```
と打つと次にあるものの一覧を表示できます。

```
cd ???
```
で次のディレクトリに進むことができます。???はlsで表示されたものしか打ってはいけない。???/???とすると2つ進むことができる。アプリの階層に到達したら次を実行。

```
pod init
```
Podfileが作成されるはずなのでそれを開いてライブラリに書かれているコードを書いて次を実行。

```
pod install
```
または、

```
pod update
```

Podfileを編集した後に

```
pod update
```
を実行したらライブラリの削除もできる。

#最後に
結構簡単だったのでライブラリを導入していきたい。

#参考文献
https://fukatsu.tech/install-cocoapods
https://www.ukeyslabo.com/development/iosapplication/how-to-use-cocoapods-for-beginner/
https://qiita.com/ShinokiRyosei/items/3090290cb72434852460
https://qiita.com/pekocalypse/items/b80f6c343355a872dde6
navigation barやtoolbarの色変更と透かす方法

#初投稿
長期に渡り開発、挫折を繰り返すと忘れることが多い。
また、以前のコードを見て内容が完全に理解できないことがあったので記録のまとめ用として書こうと思う。

#本題へ
safariに似た色のnavigation bar、toolbarを作成したいと思い調べた。
同様にtoolbarも変更可能。

まずstoryboardでnavigation controller sceneを追加し、shows navigation barにチェックするとnavigation barが作成される。shows toolbarにチェックするとtoolbarが作成される。

下記のコードを挿入すれば色が変更される。

```swift:ViewController.swift
 //navigation barの色設定
 self.navigationController?.navigationBar.tintColor = nil
 self.navigationController?.navigationBar.barStyle = UIBarStyle.black
 self.navigationController?.navigationBar.isTranslucent = true
 self.navigationController?.navigationBar.backgroundColor = nil
```

同様にtoolbarもコードを挿入すれば色が変更される。

```swift:ViewController.swift
//toolbarの色設定
self.navigationController?.toolbar.tintColor = nil
self.navigationController?.toolbar.barStyle = UIBarStyle.black
self.navigationController?.toolbar.isTranslucent = true
self.navigationController?.toolbar.backgroundColor = nil
```

#参考文献
https://gist.github.com/ttsubono/2969830
systemd-networkdでIPv6トンネルとネイティブIPv6を同時接続する

### 前提
未だにIPv6が/128しか振られなかったり不安定なルータに悩まされているため、he.netのIPv6 tunnel brokerを利用しつつ、ネイティブなIPv6も念の為維持したい。いわゆるマルチホームを行う。

* systemd-networkdで設定をまとめたい。
* 基本的なIPv4/IPv6は特に問題なく設定できている
* Ubuntu 18.04で実施。netplanでは実現できそうにないので使わない。
* 外向き接続時にtunnelをネイティブ割当より優先するが、両方でlistenできること。
* 通常のインターフェース`ens3`を通るsitトンネルを`he`として作成。


### ルーティング設定
Linux iproute2のPolicy Routingで複数のtableを使って実現できる。これはlinux multi homeあたりで検索すればいろいろ出てくる。

以下挙動の理解が怪しいが、外向きの接続の場合、

* `ip route show table main`を参照してリモートアドレスに対応するインターフェースが判定される
  - デフォルトルートの`metric`を自動生成される1024より小さくして`dev he`を優先させる
* 決定したルート`dev he`にしたがって`src`節か`ip addr`でインターフェースに設定されているアドレスが送信元として使用される
* 生成されたパケットは`ip rule`の送信元IPアドレス範囲のフィルタでどのテーブルを使うか振り分ける
* ネイティブなら`table 10`を参照させる
  - `table 10`にデフォルトルートと送信元IPアドレスを指定
  - ついでにon-linkなネットワークも指定
* トンネルなら`table 20`を参照させる
  - これは`main`テーブルと同じことをしているので本来は必要ない。優先度を簡単に切り替え（tunnel > native）したい時のために書いてある


### systemd.network周り
systemd-networkdでは、`.network`ファイルの`[Route]`節が設定されたルーティングテーブル1エントリに対応する。
ややこしいことに`[Route]`では`ip route add`の`from`は`Source=`, `src`は`Preferred Source=`が対応するようだ。

[Route]での対応
* `dest`: `Destination=`
* `via`: `Gateway=`
* `dev`: networkファイルに対応するインターフェース自身
* `from`: `Source=`
* `src`: `PreferredSource=`

`ip rule`は`[RoutingPolicyRule]`が対応する。
ここでは`ip rule add src`が`From=`に対応。統一してよ……

[RoutingPolicyRule]での対応
* `from`: `From=`
* `to`: `To=`


### 設定例

```
# cat /etc/systemd/network/10-ens3.network
[Match]
Name=ens3

[Network]
Address=ipv4_addr/24
Gateway=ipv4_gw
Address=ipv6_addr/64
Gateway=ipv6_gw
Tunnel=he

[RoutingPolicyRule]
# source route
Table=10
From=ipv6_net/64
Priority=100

[Route]
# default route
Table=10
Gateway=ipv6_gw

[Route]
# link-local
Table=10
Destination=ipv6_net/64
Metric=256

```

```
# cat /etc/systemd/network/50-he.netdev
[NetDev]
Name=he
Kind=sit
MTUBytes=1480

[Tunnel]
Remote=tunnel_server
TTL=64
```

```
# cat /etc/systemd/network/50-he.network
[Match]
Name=he

[Network]
Address=tunnel_addr/64

[Route]
Gateway=tunnel_gw

# prefer he tunnel over native
Metric=512
# prefer native over he
# Metric=1536

[RoutingPolicyRule]
From=tunnel_net/64
Table=20
Priority=200
[Route]
Gateway=tunnel_gw
Table=20
```

### 動作確認

* 外部からens3とheの両方にpingが通ること
* 内部から外向きIPv6接続でheが優先されることを確認
PhpSpreadsheetでxlsからxlsxへの変換

#前置き

エクセルからのデータ移行が必要になった :thinking:

そういう時はPhpSpreadsheet :thumbsup_tone2:
https://github.com/PHPOffice/PhpSpreadsheet

移行が必要なエクセルは実はxlsとxlsxの２パターン存在していた :ghost:
そういえばxlsの対応していないことに気づく・・・ :angel:

取り込みのロジックそのままだと、エラーになる部分があッたので、
xlsは先にxlsx変換することにした。

#いざ変換

```php

use PhpOffice\PhpSpreadsheet\Writer\Xlsx as XlsxWriter;
use PhpOffice\PhpSpreadsheet\Reader\Xls as XlsReader;

// XlsReaderで読み込み
$reader = new XlsReader();
$spreadsheet = $reader->load($xlsFilePath);

$xlsxFilePath = str_replace('xls', 'xlsx', $xlsFilePath);

// XlsxWriterで書き込み
$writer = new XlsxWriter($spreadsheet);
$writer->save($xlsxFilePath);

```

xls用の処理作り直そうかと一瞬迷ったけど、変換したら一瞬で解決した :raised_hands_tone2:
Rails + CarrierWave +Cloudinary

##はじめに
画像をアップロードするのに何かいい方法はないかとググっていました。
するとCloudinaryという名前の通りcloud上にデータを保存できるアプリの存在を知ったのでアップロードから画像を表示するまでの過程を書いていきたいとい思います。

※cloudinaryのアカウントがある前提で話します。

##アップローダーの中身
carrierwaveをインストールしてアップローダーを作成するとimg_uploader.rbが出来ます。
それまでの過程は下記で書いているのでそちらをご覧ください。
[carrierwaveのインストール方法](https://qiita.com/k19911848/items/a082cc4e0c0103f935b1)


cloudinaryのdocumentationを開けてrailsのcarriewaveを探すとこのコードがあるので、参照する。

```ruby:img_uploader.rb
class ImgUploader < CarrierWave::Uploader::Base
 include Cloudinary::CarrierWave

#画像を保存する際に,png形式で保存するということ
 process :convert => ‘png’

#タグの設定。アップされた画像はcloudinaryのファイルでタグがつけられ、（例で言えばpost_picture）検索する際に役立つ。
 process :tags => ['post_picture']

 version :standard do
   process :resize_to_fill => [300, 300, :north]
 end

 version :thumbnail do
   resize_to_fit(100, 100)
 end

end
```


##cloudinary.rbを作る

config/initializers内にcloudinary.rbファイルを作る。中身は下記のようにする。

```ruby:cloudinary.rb
Cloudinary.config do |config|
  config.cloud_name = "自身のcloud_name"
  config.api_key = "自身のapi_key"
  config.api_secret = "自身のapi_secret"     
  config.cdn_subdomain = true
end

```
この３つはcloudinaryのマイページの上部にあります。


##環境変数設定
Gemfileを開けてfigaroをインストール。

```ruby:Gemfile
gem 'figaro', '~> 1.1', '>= 1.1.1'
```

```ruby：ターミナル
$ bundle exec figaro install
```

するとconfig内にapplication.ymlが作成され、.gitignoreファイルにapplication.ymlが記載される。

```
 create  config/application.yml
 append  .gitignore
```

application.ymlに移り、中身を以下のように。

```ruby:application.yml
cloudinary_cloud_name: "自身のcloud_nam"
cloudinary_api_key: "自身のapi_key"
cloudinary_api_secret: "自身のapi_secret"
```

**cloudinary.rb**に戻り、

```ruby:cloudinary.rb
Cloudinary.config do |config|
  config.cloud_name = ENV["cloudinary_cloud_name"]
  config.api_key = ENV["cloudinary_api_key"]
  config.api_secret = ENV["cloudinary_api_secret"]
  config.secure = true
  config.cdn_subdomain = true
end
```

とする。

**さてここからが本題です。**
せっかくcloud上に画像をアップできるようにしたんだからそれを使いたいですよね？

でも実はこの状態で作成中のアプリを開けるとエラーが出てしまいます。
エラー文の内容が**cloud_nameがわからん。ちゃんと設定してくれ**といった感じでした。

##解決策
例）viewで投稿した画像を表示するにはこうする。

```ruby:view
<%= image_tag post.img_url, :cloud_name => "自身のcloud_name"  if post.img? %>

```
:cloud_name => "自身のcloud_name"を指定することで自分のcloudinaryのファイルに保存されます。


##最後に
Cloudinaryの設定をして画像をアップロードするには結構な時間がかかってしまいました。
しかし私が書いたこの記事をみて皆さんが開発にかける時間が少しでも短縮されると幸いです。

また、私自身間違っている可能性もあるので指摘もしてもらえるとありがたいです。
【第2回】Vuex公式ドキュメントを学んでみる〜store(ストア) とは？〜

# この記事のレベル感
・Vue.jsを使ったWeb開発やアプリを作ったことはあるけどは、Vuexのドキュメントを読んだり、実務で使っていない人

# Vuexのstoreとは？
* Vuexアプリの中心
* アプリのstate(状態)を保持するコンテナ
* storeのstateに対しリアクティブかつ効率的な更新を行う
* mutationsをcommitすることでのみstoreのstateを更新できる

# Vuexの環境構築
BootStorap等のライブラリ同様、CDNもしくはnpm、yarnで環境を整えられます。
詳しくは[Vuexのインストール]
(https://vuex.vuejs.org/ja/installation.html)をご確認ください。

# Vuexのstoreを使用した例

Vuex公式ページにも掲載されている[カウンターアプリ](https://jsfiddle.net/n9jmu5v7/1269/)を例に取ります。

```html
<div id="app">
  <p>{{ count }}</p>
  <p>
    <button @click="increment">+</button>
    <button @click="decrement">-</button>
  </p>
</div>
```
カウンターで表示する**count**とカウントの値の増減アクションを起こす**@click**イベントを記述します。
 

```js
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
  	increment: state => state.count++,
    decrement: state => state.count--
  }
})

new Vue({
  el: '#app',
  computed: {
    count () {
	    return store.state.count
    }
  },
  methods: {
    increment () {
      store.commit('increment')
    },
    decrement () {
    	store.commit('decrement')
    }
  }
})
```
**new Vuex.Store**側では**state**と**mutations**を設定します。
**state**にはカウンターで表示する値を**mutetions**にはカウントの値の増減をstateに反映させます。(素のVueでいうとmethodsで記述していたようなカウントの処理も記述します。)

new Vue側ではstoreで管理するデータを取り出し、HTML　viewに反映させます。

# 感想
これだけ簡易的なアプリであればVuex導入の効果は薄いかと思いますが、コードはかなりシンプルになりますね。
【Unity(C#)】オブジェクトをまとめて回転させるとMeshが変形した

　　
　　
　　
この記事は

**『プログラミング完全未経験からUnityでの開発現場に迎え入れてもらえた世界一の幸せ者』**

の記事です。そのつもりでお読みください。



##回転させる

Cubeをいろいろと回転させてみたいと思います。
![キューブ配置.png](https://qiita-image-store.s3.amazonaws.com/0/244071/e88ac34d-8109-77be-470e-24053f1c5cc1.png)

###キューブの角度のみ回転
それぞれのCubeをInspectorでRotationをいじって回転させました。
このとき、それぞれのCubeのPositionは変わりません。
![Rotation_45.png](https://qiita-image-store.s3.amazonaws.com/0/244071/ffad886f-d8ba-f0b0-5d72-29e0ae161a4d.png)

###親にCubeを詰め込んで親を回転
Hierarchyで空のゲームオブジェクトを作成して、Cubeの親に設定しました。
親のRotationをいじって回転させています。それぞれのCubeのPositionは変わっています。
ちなみに、この画像の親のPositionは緑のCubeと同じにしています。
![Rotation_Self_45.png](https://qiita-image-store.s3.amazonaws.com/0/244071/44ce20c4-a362-a55f-da7a-a506af5abc29.png)

親子の関係を作るときに、PositionやRotationを変更する場合には
気を付けなければならないことがあります。

親のPositionやRotationを基準に子のオブジェクトのLocalPositionが決まるので、
回転させたい軸の場所に親のオブジェクトを配置する必要があります。

例えば、白い円柱の周りを回転させたいのであれば、
白い円柱を親にして、白い円柱のRotationを変更すればいいということです。
![Center_Rotation_45.png](https://qiita-image-store.s3.amazonaws.com/0/244071/4403ba92-a9c8-34ed-7a93-07e4b7c0ffc4.png)


##Meshが変形した
なぜこんなどうでもいいことをまとめようかと思ったかというと、
いろいろいじってたらCubeの形が変形したので調べたら意外な理由だったからです。

![mesh 変形_.png](https://qiita-image-store.s3.amazonaws.com/0/244071/42a28de8-4f3f-a470-bdb9-de8820830c95.png)

画像のように、回転させると変形してしまいました。
どうやら、親のScaleを変更した状態((1,1,1)ではない状態)で、
子のRotationを変更すると、このようにMeshが変形してしまうようです。

なので、親のオブジェクトのスケールを変えたい＆子のオブジェクトを回転させたい場合は
別の空のオブジェクトの子にするなどの工夫が必要かもしれません。

---
2019/06/04　追記
[メッシュをぶっ壊してみた](https://qiita.com/OKsaiyowa/items/fd141ca6a02704513434)
書きました。

というか、この記事の**まとめて回転させるとMeshが変形**って再現性あるのか？
今日試したらできなかったんだが。誰が書いたんだこの記事いい加減にしろ(ブチ切れ)
e-Statからの人口メッシュデータダウンロード

#背景とか
人口メッシュデータが欲しかったので、eStatのメッシュデータを見に行きました。(https://www.e-stat.go.jp/gis/statmap-search?type=1)
で、ダウンロードのためにボタンを一つ一つクリックするのが面倒くさかったので、curlで実装。

一番面倒くさかったのは、地域メッシュ情報を抜き出すところだったと思う。ここは手実行しか思いつかなかった。。。
抜け漏れあるかもしれないので、漏れてたら指摘ください。
↓のサイトの数字を見ながら抜き出し。。。
(https://www.e-stat.go.jp/sites/default/files/pdf/gis/primary_mesh_jouhou.pdf)

あと、離島については、一次メッシュ情報は定義されているものの、データがないらしくってzipの中身がエラーになるようなので、そこはご承知ください。

#実行環境
macOS Mojave(10.14.2)のbashで実施


#コマンド
下記コマンドは、2015年国税調査 => 4次メッシュ(500mメッシュ) => その１　人口等基本集計に関する事項、を落とすように作っています。
他の情報が欲しい場合は、ダウンロードボタンのURL確認してアレンジしてください。

あと、1つダウンロードするごとに5秒sleepにしてます。
まぁ、気長にやってください。

```bash

array=("6840" "6841" "6842" "6847" "6848" "6740" "6741" "6742" "6747" "6748" "6641" "6642" "6643" "6644" "6645" "6646" "6647" "6540" "6541" "6542" "6543" "6544" "6545" "6546" "6439" "6440" "6441" "6442" "6443" "6444" "6445" "6339" "6340" "6341" "6342" "6343" "6239" "6240" "6241" "6243" "6139" "6140" "6141" "6039" "6040" "6041" "5939" "5940" "5941" "5942" "5839" "5840" "5841" "5738" "5739" "5740" "5741" "5636" "5637" "5638" "5639" "5640" "5641" "5531" "5536" "5537" "5538" "5539" "5540" "5541" "5432" "5433" "5435" "5436" "5437" "5438" "5439" "5440" "5332" "5333" "5334" "5335" "5336" "5337" "5338" "5339" "5340" "5229" "5231" "5232" "5233" "5234" "5235" "5236" "5237" "5238" "5239" "5240" "5129" "5130" "5131" "5132" "5133" "5134" "5135" "5136" "5137" "5138" "5139" "5029" "5030" "5031" "5032" "5033" "5034" "5035" "5036" "5038" "5039" "4928" "4929" "4930" "4931" "4932" "4933" "4934" "4939" "4828" "4829" "4830" "4831" "4839" "4728" "4729" "4730" "4731" "4739" "4740" "4629" "4630" "4631" "4529" "4530" "4531" "4540" "4429" "4440" "4328" "4329" "4229" "4230" "4128" "4129" "4142" "4027" "4028" "4040" "4042" "3926" "3927" "3928" "3942" "3823" "3824" "3831" "3841" "3724" "3725" "3741" "3622" "3623" "3624" "3631" "3641" "3653" "3036")

i=0
for e in ${array[@]}; do
    echo "array[$i] = ${e}"
	curl "https://www.e-stat.go.jp/gis/statmap-search/data?statsId=T000847&code=${e}&downloadType=2" --output "$HOME/Documents/${e}.zip"
	sleep 5
    let i++
done

```

#参考文献
https://qiita.com/b4b4r07/items/e56a8e3471fb45df2f59
Unity:マイクの音量を取得する(2)

[前回](https://qiita.com/ELIXIR/items/ff503d48c24092c05843)はOnAudioFilterReadを使ってマイクの音量を取得しましたが、今回は別の方法でとってみます。
こちらの方法を使用すると周波数ごとの音量（パワー）をとることもできます。

- Hierarchyタブで右クリック>空のゲームオブジェクトを作る
![2019-01-09_140631.png](https://qiita-image-store.s3.amazonaws.com/0/59911/9962de3b-2f24-6ab8-fdcf-44314d983555.png)

- 作ったオブジェクトに[AddComponent]>AudioSourceでオーディオソースをつける
![2019-01-09_140719.png](https://qiita-image-store.s3.amazonaws.com/0/59911/643e0e8c-4be7-a69a-8e85-91f0caf55ffe.png)

- Project>Create>C#Scriptでスクリプトを作成し、MicVolumeSample.csという名前を付けて下記をコピペする

```MicVolumeSample.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MicVolumeSample: MonoBehaviour {
    private readonly int SampleNum = (2 << 9); // サンプリング数は2のN乗(N=5-12)
    [SerializeField, Range(0f, 1000f)] float m_gain = 200f; // 倍率
    AudioSource m_source;
    float[] currentValues;

    // Use this for initialization
    void Start () {
        m_source = GetComponent<AudioSource>();
        currentValues = new float[SampleNum];
        if ((m_source != null) && (Microphone.devices.Length > 0)) // オーディオソースとマイクがある
        {
            string devName = Microphone.devices[0]; // 複数見つかってもとりあえず0番目のマイクを使用
            int minFreq, maxFreq;
            Microphone.GetDeviceCaps(devName, out minFreq, out maxFreq); // 最大最小サンプリング数を得る
            int ms = minFreq / SampleNum; // サンプリング時間を適切に取る
            m_source.loop = true; // ループにする
            m_source.clip = Microphone.Start(devName, true, ms, minFreq); // clipをマイクに設定
            while (!(Microphone.GetPosition(devName) > 0)) { } // きちんと値をとるために待つ
            Microphone.GetPosition(null);
            m_source.Play();
        }
    }

    // Update is called once per frame
    void Update () {
        m_source.GetSpectrumData(currentValues, 0, FFTWindow.Hamming);
        float sum = 0f;
        for (int i = 0; i < currentValues.Length; ++i)
        {
            sum += currentValues[i]; // データ（周波数帯ごとのパワー）を足す
        }
        // データ数で割ったものに倍率をかけて音量とする
        float volumeRate = Mathf.Clamp01(sum * m_gain / (float)currentValues.Length);
        Debug.Log(volumeRate);
    }
}
```

- 音量がログに表示される
  - （ログウィンドウが表示されていない場合はWindow>General>Consoleを選択）
![2019-01-10_194501.png](https://qiita-image-store.s3.amazonaws.com/0/59911/5d331107-af90-dda0-9c3d-aeca10b11a33.png)

![2019-01-09_141213.png](https://qiita-image-store.s3.amazonaws.com/0/59911/2359d8d5-ae7b-b6b7-3524-44aa840bf3ad.png)


このままだとマイクの音をそのままオーディオソースに流すのでハウリングを起こしてしまうので

- Projectタブで右クリック>Create>AudioMixer でオーディオミキサーを作る
- オーディオミキサー>Groups>+マークをクリックし、Dummyという名前のグループを作る
- できたDummyのボリュームを最小(-80)にする

の手順を行うのは前回と同じです。
 
![2019-01-09_141456.png](https://qiita-image-store.s3.amazonaws.com/0/59911/59eac10a-583d-f8e2-24dd-ee4e09b2274b.png)

- 最初に作成したGameObject>AudioClip>OutputにDummyを指定する
![2019-01-09_141552.png](https://qiita-image-store.s3.amazonaws.com/0/59911/b3e6815d-2c9d-abc9-824d-ff252cb119af.png)

これでマイクで拾った音を出力しないようになり、ハウリングが起きなくなります

[Unity:マイクの音量を取得する(3)](https://qiita.com/ELIXIR/items/595579a9372ef181e0bc)
LaravelでStorageから取得したファイルをダウンロードさせる

#ダメな例
Laravel5.5のStorageのドキュメントに記載がなかったので、感覚的にこんな感じかな？

```ｐｈｐ
$file = Storage::get('file.jpg');
return response()->download($file);
```
と思ったけどダメだった。

#正しい例

もっとシンプルに実現できた！

```ｐｈｐ
return Storage::download('file.jpg');
```

#補足

Laravel5.6以降のドキュメントには普通に記載があります :thumbsup_tone2:
https://laravel.com/docs/5.6/filesystem#downloading-files
https://laravel.com/docs/5.7/filesystem#downloading-files

Laravel5.5でも大丈夫でした :stuck_out_tongue_winking_eye:
WebviewにてiPhoneでの横スクロールを滑らかにする方法

Webviewで横スクロールを実装したときにAndroidだと横スクロールが可能な部分でスワイプすると滑らかにスクロールされるが、iOSだと滑らかにスクロールできない。
通常だと以下のような挙動になってしまう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/271450/24342f19-0ac1-d9a6-d86e-16645694979a.gif" width="400px">

上記は弊社で開発しているアプリのWebviewで実際に横スクロールを実装した画面です。
見る限りスクロールが滑らかではありません。

そこでcssで以下のコードを記入します。

```css
-webkit-overflow-scrolling: touch;
```

このcssは指定された要素で惰性付きのスクロールを使用するかどうかを制御します。
デフォルトだと`auto`になっています。
autoだと通常のスクロールの場合、タッチパネルから指を離すとすぐにスクロールが停止します。
今回の場合はここを`touch`に変更します。
touchだとスクロールが終了した場合、タッチパネルから指を離した後もスクロールを続けます。

指定すると以下のような挙動になります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/271450/1423f90f-52d8-3639-f214-74d73500e761.gif" width="400px">

対応前と比べるとすごい滑らかにスクロールされていることがわかります。