OmniAICreator/Qiita-1.07M huggingface dataset:
RaspberryPiでDHT11センサーから温湿度データを取得

#**目的**
RaspbeeryPiで温湿度データを取得する


#**使用したもの**
・Raspberry Pi 3 MODEL B
・DHT11(温湿度センサー)。
・ジャンプワイヤー×3本
<img src="https://qiita-image-store.s3.amazonaws.com/0/22526/40cddc89-9d2c-c27b-5fdb-c9542b2bda2b.jpeg"  width=50%>



#**参考**
[ラズパイでDHT11温湿度センサーを作動する](http://osoyoo.com/ja/2017/04/14/raspberrypidht11/)

#**参考元からの変更点**
他からの呼び出し予定があるため、温度と湿度をリターン
センサーが0を返してきたら無視する

#**ソースコード**
```PYTHON:gettemp.py 
# coding: UTF-8
# RaspberryPiでDHT11センサーから温湿度データを取得

import time
import dht11
import RPi.GPIO as GPIO

#定義
#GPIO 14 as DHT11 data pin
Temp_sensor=14

#温湿度データ取得
def get_temp():

    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)

    instance = dht11.DHT11(pin=Temp_sensor)

    while True:
        #データ取得
        result = instance.read()
        return result.temperature,result.humidity

if __name__ == '__main__':
    try:
        while True:
            #温湿度データ取得
            temperature,humidity = get_temp()

            #画面出力
            if temperature == 0:
                continue
            print("Temperature = ",temperature,"C"," Humidity = ",humidity,"%")

            #指定された秒数スリープ
            time.sleep(5)

    except:
        pass

```

#**実行**
事前にdht11.pyをダウンロード
`sudo wget http://osoyoo.com/driver/dht11.py`

実行
`sudo python gettemp.py`


![スクリーンショット (1269).png](https://qiita-image-store.s3.amazonaws.com/0/22526/de1224e7-ca75-5c54-ffe1-b41e221ab2f7.png)
プログラミングコードを手軽に共有するなら Gist の埋め込みが良いかも知れない

# [Gist](https://gist.github.com/) にコードを書いて「Share」を選ぶ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/716735c1-d3b7-810e-1821-c69a8aefb088.png)

このURLをクリップボードにコピー。
というより Gist 本体ページのURLと同じっぽいので、アドレスバーからコピるだけでも良さそう。

https://gist.github.com/YumaInaura/a7ed9cca63be318457f5d938ac5639e3

# 各サービスで貼り付ける

## Mediumを使う例

URLを貼り付けるだけで展開してくれる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5b498784-c257-2ed0-e774-d40013d83e90.png)


# はてなブログは？

対応してる。

「見たままモード」でURLを貼り付けて「埋め込み」を選べば良い。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/da8d1d53-d7f4-406d-d7fa-8e7e760ec47d.png)

なぜか「見たままモード」のリアルタイムプレビューには反映されなかったが、実際の記事には反映された。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/db201f0c-d539-ffb8-ccce-10f356223191.png)

# なぜ Gist ？

まあサービス側が対応していれば、Gistに限らずどんな共有型のURLでも埋め込めるんだろうけど。

Githubのサービスは親しみもあるし、廃れにくいだろうし、手始めに使いやすいんじゃないだろうか。コードのリビジョン管理もされるし。


# ところでQiitaは？

対応していないっぽい。

せっかくQiitaからGistに送る仕組みがあるので、逆方向も出来たら良いんだけど。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/550f745c-de3f-cd4f-5042-1eb5c6bef470.png)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Ruby on Rails】Ruby on Railsで投稿一覧ページを作る②[Progate]

前回記事参照URL: https://qiita.com/hiroshimaeasyryo/items/f888f9b687a32821d064

# rails consoleの使い方

$ rails console
と入力すると、演算計算や変数定義などができるようになる。

quite
を実行するとconsoleを終了できる。


# 1.rails consoleでテーブルに投稿データを保存する

> $ rails console 
  > post = Post.new(content:"Hello world")

newメソッドで、contentがHello worldであるPostインスタンスを作成する。

<img width="973" alt="スクリーンショット 2018-07-13 21.33.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/265778/5b9a8650-c2c2-2fdc-bb1f-7c9fab0c4731.png">



> post.save
次に、Postインスタンスをテーブルに保存する。

![1492598843396.gif](https://qiita-image-store.s3.amazonaws.com/0/265778/c28eeecd-c8af-e5f1-c155-6d7cb569394b.gif)


> ApplicationRecordを継承しているのでsaveメソッドが使えるらしい！
・・・AplicationRecordってなんだ？

![1492580904720.png](https://qiita-image-store.s3.amazonaws.com/0/265778/e9e6ce9c-f427-9189-63b4-93102cb21eee.png)




# 2.テーブルに保存したデータを取り出す

> インスタンス.firstを変数に代入

![image.png](https://qiita-image-store.s3.amazonaws.com/0/265778/416ecbbd-1bab-dd3e-4dc0-148950fa2fd6.png)

>変数.contentで内容を取得できる！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/265778/c9fdde51-48e0-c8e5-28a9-01dc19d9d36b.png)

> インスタンス.allで全ての要素を配列で取得することができる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/265778/b96e4d83-0db1-61f0-79d3-eff3c753a522.png)

> インスタンス.all[インデックス番号]で配列から一つの要素を取り出すことも可能

![image.png](https://qiita-image-store.s3.amazonaws.com/0/265778/be61d4ab-1909-5bc6-c822-b712e28c880f.png)

> インスタンス.all[インデックス番号].contentで内容を取得できる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/265778/2183bfc4-5d57-5a55-6673-b062157d5b1b.png)
Docker初心者がJupyter NotebookをDockerで動かしてh2oでサーブして「Docker最高！」を体感する

## お前 is 誰？

こんにちは、初めてのqiitaです。15年ぐらい「はてな」にいた底辺派遣ITの老人がqiitaに来ました。

## どんな話？

ソフトウェアエンジニアが遊びで自宅サーバーにDokcerでJupyter Notebook環境を作る話。

## 環境

Ubuntu 18

## なぜDocker?

* 環境汚したくない
* コマンド一発で楽

これに尽きます。理由はこれだけで十分です。

* Dockerって別に難しくない

というのもわかりました。
Ubuntu12ぐらいからずっとアップデートし続けたサーバーが最近死んでUbuntu18で再構築したのですが、好き勝手やってたので本当に環境が汚れて意味がわからなくなっていました。Docker使えば環境が閉じれるので非常に気持ちよいです。

## Docker導入

はい。下記の通り流すだけ
https://linuxconfig.org/how-to-install-docker-on-ubuntu-18-04-bionic-beaver

## Jupyter NotebookをDockerで

ここに実はもうまとまっている
https://qiita.com/kshigeru/items/ea174d6bcacc474f2a51

## 方針
* ホスト的にはポート18888でjupyter NotebookをLISTEN
* tensorflow付きのものを入れることにしました
* `/var/www/python/jupyter`にあるホストのディレクトリをdocker内部に繋げる

## 実際に流したコマンド

### dockerで動かすまで

```
sudo su
docker pull jupyter/tensorflow-notebook  
docker run -d --name tfnb -p 18888:8888 -v /var/www/python/jupyter:/home/jovyan/work jupyter/tensorflow-notebook  
```

### h2o経由でサーブする

#### h2oを設定する

私は`https://jn.lovesaemi.daemon.asia/`に繋げます。
websocket(WSS://)も使うので`proxy.websocket: ON`が必要

```
  "jn.lovesaemi.daemon.asia:443":
    listen:
      port: 443
      ssl:
          certificate-file: /etc/letsencrypt/live/lovesaemi.daemon.asia-0001/fullchain.pem
          key-file: /etc/letsencrypt/live/lovesaemi.daemon.asia-0001/privkey.pem
    paths:
      "/":
        proxy.websocket: ON
        proxy.reverse.url: http://127.0.0.1:18888/
```

```
service storp h2o
service start h2o
```

「h2oはさいつよ」なのでみんなもっと使うとよい。
設定簡単だと思いませんか!?
しかもApacheよりNginxより高速なHTTP/2サーバーなんですよ！まじ最高。
https://h2o.examp1e.net/

#### tokenをメモする

```
# jupyterのlistを調べる
docker exec tfnb jupyter notebook list  
  Currently running servers:  
    http://localhost:8888/?token=トークン :: /home/jovyan   
```
トークンとかパスワードとか固定できるらしいのでやりたいならやれば良いと思います。

`https://jn.lovesaemi.daemon.asia/?token=トークン`でアクセス可能

#### proxy経由なのでallow_originを弄ってdocker stop / startする

proxy経由なのでjupyter notebookを設定する必要がある。
ここがちょっとめんどくさかった。。
https://github.com/jupyter/jupyter/issues/79
に従って作業する
viぐらいは入っていると思ったけどエディタがnanoしかなくて。

```
# 設定ファイルを作る
docker exec tfnb jupyter notebook --generate-config
# dockerに入る
docker exec -it tfnb bash  
# 設定ファイルを編集する(nano)
nano ./.jupyter/jupyter_notebook_config.py
```

nanoをよくわかってないのだけどctrl + wで検索らしい。  
`allow_origin`で検索  

```
# c.NotebookApp.allow_origin = ''
```
となっているので

```
c.NotebookApp.allow_origin = '*'
```
とする。
`ctrl + s`で保存、`ctrl + x`でnano抜ける
`exit`でdockerの中から抜けて

```
docker stop tfnb
docker start tfnb
```
でdockerを再起動。トークンを再度確認しておけば良いですね。変わっているかも？

```
docker exec tfnb jupyter notebook list  
```

## Dockerでなんか変だなーと思ったら

ログ見る

```
sudo su
docker logs -f  
```

## 評価

* 基本的にコマンド一発で立ち上がるのが良い
* 環境を汚さないのが良い
* Docker Hubの仕組みがとても良い

Docker最高だ！
[Elixir]absinthe_tutorialをmysqlで動かす

ElixirのGraphQLライブラリ、absintheの[tutorial](https://github.com/absinthe-graphql/absinthe_tutorial)をmysqlで動くようにする
(ectoがデフォルトではpostgresqlを使うようになっているので)

## `mix.exs` の変更
depsに `mariaex` を追加

```elixir
       {:argon2_elixir, "~> 1.2"},
+      {:mariaex, "~> 0.1"},
     ]
```

## `config/dev.exs` の変更
接続先情報をmysqlのものに変更

```elixir
 config :blog, Blog.Repo,
-  adapter: Ecto.Adapters.Postgres,
-  username: "postgres",
-  password: "postgres",
-  database: "blog_dev",
-  hostname: "localhost",
-  pool_size: 10
+adapter: Ecto.Adapters.MySQL,
+  database: "your database name",
+  username: "your user name",
+  password: "your password"

```

## マイグレーション
まいぐれーしょんスクリプトを流してテーブルの作成

```elixir
$ mix ecto.migrate
```

## 初期データの挿入

```elixir
$ mix run priv/repo/seeds.exs
```

## フェニックス起動

```
$ mix phoenix.server
```

http://localhost:4000/api/graphiql
にアクセスしたらブラウザ上でGraphQLを確認できる 😊
<img width="1396" alt="スクリーンショット 2018-07-14 14.04.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/250899/950f8323-06e6-898c-97ab-436130759678.png">
Windows10のHyper-VでNAT構成をしてみた（ゲストCentOS7）

# NATで繋ぐ必要のある状況
ゲストOSに、社内ネットワーク用のIPが割り当てできない
とか。。
自分のパコソン以外からゲストOSを見せたくない（やりようはあると思うがめんどくさい）

#Hyper-V側設定
仮想スイッチマネージャ→内部を選択して→「仮想スイッチの作成(S)」
名前は、**HyperV-NAT**　としておく
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/ba5f5be3-cba7-c5f9-7df2-0e0c485d912a.png)
コントロールパネル￥ネットワークとインターネット￥ネットワーク接続
（ショートカット：　*ncpa.cpl* ）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/eee30730-a60a-fc2b-2b67-a45229267e64.png)
↑こいつができている。

今つながっているネットワークが **ローカル　エリア接続** だとすると
プロパティを開いて、共有タブの設定を↓のようにする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/8d3ff53f-0cc6-b6ac-3665-f58058468685.png)
…すると、こんな感じになる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/58f28eac-4a53-ae1a-253c-af50bb36f0e6.png)
**ローカル　エリア接続**  に ”共有”の文字が表示される
**HyperV-NAT**　に ローカルエリア接続の接続先が表示され、勝手にIPアドレスが作られている**192.168.137.1**
こいつが、ゲストOSのゲートウェイアドレスになる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/80ae81a2-e345-1e10-5b8a-916a11b56a61.png)

#ゲストOS側：centosを入れた
ネットワークアダプタに **HyperV-NAT**を設定しておく
##OSインストール直後の確認
ifconfigがなくなったので… ip addr show コマンドで確認する
eth0にIPアドレスらしきものは出ていない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/b7eecd6e-2786-0b0b-a5be-a33d259b949d.png)


##IPアドレス設定

```terminal
nmtui
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/bc2b17fd-0ef1-bcb7-8ca4-858f0c4e6600.png)
*Edit a Connection* を実行して、ゲストOSのIPアドレスを設定する
対象は、**eth0**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/e779cba4-791a-76e4-4264-ee755cc13229.png)
IPv4 CONFIGURATION の <Show>を選択して展開する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/6e750cdc-825b-b19e-c84c-80ea011435c7.png)

アドレスの設定
IPv4 CONFIGURATION ＜Automatic＞ →  **＜Manual＞**
Addresses: **192.168.137.2/24**
Gateway: **192.168.137.1**
Dns Servers： **8.8.8.8**  ←GoogleのDNSサーバ（ほかのDNSサーバでもよい）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/2a7426fa-f0a4-a22c-0331-e750fb6c5068.png)

有効化する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/2369ceb0-873a-f2f2-4fd7-a4db278c7c73.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/1b55480c-dbf8-7462-0d5f-05703de963d7.png)
コメジルシ  ＊がつく

```terminal
# ip addr show      ← 
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185989/2b2b0dd2-f63c-1bf2-20a2-5d0b4e6d04a9.png)

はいできた

ちなみに、DNS設定していないと,yumができなかった
Kotlinまとめ

# TL;DR
本を読んでKotlinの勉強をする
https://www.amazon.co.jp/dp/B06XHJMR65/

# 実行環境
* ツール
    * IntelliJ IDEA
    * Android Studio  
      Androidの内容になったらAndroid Studioを使う
* Kotlinのバージョン
    * 1.2

# 勉強内容
* [Kotlinとは](https://qiita.com/hicka04/items/48f273d574b645a3aa73)
* 基本的な文法
    * [型](https://qiita.com/hicka04/items/66d045bc1f0b5e9d9561)
    * [条件分岐, ループ](https://qiita.com/hicka04/items/0fee2c0b5955600d29b8)
* 文法詳解
    * [関数](https://qiita.com/hicka04/items/62cc5570ce869f8c24e8)
    * [第一級オブジェクトとしての関数](https://qiita.com/hicka04/items/2bdad26dcd21ec970971)
    * [オブジェクトからクラスへ](https://qiita.com/hicka04/items/d39dbce6095c369d95bc)
    * [クラスとそのメンバ](https://qiita.com/hicka04/items/6f47f505d7b68ede3680)
    * [継承と抽象クラス](https://qiita.com/hicka04/items/e00a9d9896f7017a932b)
    * [インタフェース](https://qiita.com/hicka04/items/9922c8342ff8a8fcda8a)
    * [文法詳解 - ジェネリクス](https://qiita.com/hicka04/items/d5882e99d4254b25cae4)
Kotlinまとめ - 基本的な文法 - 型

# 変数と型とリテラル
## 型とリテラル
* 他の言語にもあるような型は基本的にある
    * 文字、文字列
        * "Kotlin"
    * 整数
        * 1
    * 浮動少数
        * 1.5
    * 真偽値
        * true
    * など

## 変数、定数
```Kotlin
// 変数
var hoge: String = "hoge"

// 定数
val fuga: String = "fuga"
```
明記した型と代入したい型が異なる場合はもちろんコンパイルエラー

型推論のおかげで以下のように型名を省略できる

```Kotlin
// 変数
var hoge = "hoge"

// 定数
val fuga = "fuga"
```

# さまざまなオブジェクト
## 文字列
```Kotlin
val name = "hicka04"
print("Hello, ${name}!")
print("Hello, $name!")
// Swiftなら
// print("Hello, \(name)!)

// 複数行
val message = """
hogehoge
fugafuga
"""
```

## 配列
```Kotlin
val strings = arrayOf("red", "green", "blue")
print(strings[0]) // red
```

## リスト
```Kotlin
val ints: List<Int> = listOf<Int>(1, 2, 3)
ints[0] = 5 // コンパイルエラー
// ListはImmutableなのでListの中身を編集することはできない
// varで宣言すればList自体を再代入は可能

// Mutableはこっち
val chars: MutableList<Char> = mutableListOf('a', 'b')
chars[0] = 'c'    // ['c', 'b']
chars += 'X'      // ['c', 'b', 'X']
chars.removeAt(0) // ['b', 'X']
```

## セット
```Kotlin
// Immutable
val ints = setOf(1, 2, 1, 3)
print(ints) // [1, 2, 3]

// Mutable
val chars = mutableSetOf('a', 'b', 'a')
print(chars) // ['a', 'b']
```

## マップ
```Kotlin
// ImmutableとMutableがそれぞれあるが今回は省略
val map = mutableMapOf("one" to 1, "two" to 2)
println(map) // {one=1, two=2}
```

### リスト、セット、マップの雑感
* Swiftだと`var`で宣言すればMutable、`let`で宣言すればImmutableなので、
  `val`と`mutable`が両立しているのが慣れないな…。

## レンジ
```Kotlin
val range = 0 .. 5
println(1 in range)  // true
println(1 !in range) // false
println(range.toList()) //[0, 1, 2, 3, 4, 5]
println((5 downTo 0).toList()) // [5, 4, 3, 2, 1, 0]
println((1 .. 5 step 2).toList()) // [1, 3, 5]
```
末尾を含まないレンジが作れないのかな…
Swiftなら`0 ..< 5`なんだけど

---

[← Kotlinとは](https://qiita.com/hicka04/items/48f273d574b645a3aa73) || [基本的な文法 - 条件分岐, ループ →](https://qiita.com/hicka04/items/0fee2c0b5955600d29b8)
ビンゴ

# C言語でビンゴの判定プログラムを書いたときのメモ

```c:bingo.c
#include <stdio.h> // 標準入出力
#include <stdlib.h> // 乱数生成用
#include <time.h> // 現時刻取得用
#include <unistd.h> // sleep関数用

#define NUM 20
#define MAP_NUM 9
#define bingo_pattern 8

// プロトタイプ宣言
void shuffle(int ary[], int size);

int main(void) {
  // ビンゴになったときの添字、全8パターン
  int bingo[bingo_pattern][3] = {
    {0, 1, 2},
    {0, 3, 6},
    {0, 4, 8},
    {1, 4, 7},
    {2, 4, 6},
    {2, 5, 8},
    {3, 4, 5},
    {6, 7, 8}
  };

  int i, j, tmp; // カウンタ

  // 1から20までの値を入れた配列をつくる
  int numbers[NUM];
  for(i=0;i<NUM;i++)
    numbers[i] = i+1;

  int map[MAP_NUM]; // ビンゴマップをつくる
  shuffle(numbers, NUM); // シャッフルする

  // シャッフルしたものをmapに入れる
  for(i=0;i<MAP_NUM;i++)
      map[i] = numbers[i];

  // 表示->入力->判定を繰り返す
  while(1) {
    // 表示
    printf("==================\n");
    for(i=0;i<3;i++) {
      for(j=0;j<3;j++) {
        printf("%d ", map[3*i+j]);
      }
      printf("\n");
    }
    printf("==================\n");

    // 入力
    printf("数字を入力してください : ");
    scanf("%d", &tmp);
    // map内の数字を0にする
    for(i=0;i<MAP_NUM;i++) {
      if(map[i] == tmp) {
        map[i] = 0;
      }
    }

    // ビンゴの判定　ビンゴのパターンに一致している時
    for(i=0;i<bingo_pattern;i++) {
      int flag = 0; // フラグのリセット

      // 縦、横、斜めに揃ったときにflag=3を立てる
      for(j=0;j<3;j++) {
        if(map[bingo[i][j]] == 0) {
          flag++;
        }
      }

      // ビンゴの時
      if(flag == 3) {
        printf("ビンゴです。\n");
        return 0;
      }
    }
  }

    return 0;
}

// シャッフル用関数
void shuffle(int ary[],int size) {
  int i, j, tmp; // カウンタ
  srand(time(NULL)); // 乱数の初期化

  // 前からランダムな値と入れ換える
  for(i=0;i<size;i++) {
      j = rand()%size;
      tmp = ary[i];
      ary[i] = ary[j];
      ary[j] = tmp;
  }
}

```
カレンダー表示

# C言語でカレンダーを表示する課題

```c:calender.c
#include<stdio.h> // 標準入出力用

// プロトタイプ宣言
int judge_leap(int y);
int judge_week(int y, int m, int d);
void show(int leap, int weeknum, int m);

// メイン関数
int main(void) {
  int y, m, d; // 年:y, 月:m, 日:d
  int leap, weeknum; // judge_*の結果を入れる


  // 入力
  printf("年を入力してください : ");
  scanf("%d", &y);
  printf("月を入力してください : ");
  scanf("%d", &m);
  d = 1;

  // うるう年:1, 違う:0
  leap = judge_leap(y);

  // 日:0, 月:1, 火:2, 水:3, 木:4, 金:5, 土:6
  weeknum = judge_week(y, m, d);

  // 表示
  show(leap, weeknum, m);

  return 0;
}


// うるう年の判定
int judge_leap(int y) {
  if(y%4 == 0) {
    if(y%100 == 0) {
      if(y%400 == 0) {
        return 1;
      } else {
        return 0;
      }
    } else {
      return 1;
    }
  } else {
    return 0;
  }
}

// ついたちが何曜日か？の判定
int judge_week(int y, int m, int d) {
  int tmp1, tmp2; // 一時的な変数

  // 1月は13月、２月は14月として、計算する
  if(m == 1)
    m = 13;
  else if(m == 2)
    m = 14;

  // ツェラーの公式より
  tmp1 = y + y/4;
  tmp1 = tmp1 - y/100;
  tmp1 = tmp1 + y/400;
  tmp2 = (m*13 + 8)/5;

  return (tmp1 + tmp2 + d)%7;
}

// 表示
void show(leap, weeknum, m) {
  int i, j; // カウンタ
  int days[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; // 1月から12月の日数

  printf("日 月 火 水 木 金 土\n");
  printf("--------------------\n");

  for(i=0;i<days[m-1];i++) {
    // ついたちを表示する前にスペースを入れて形成する
    if(i == 0) {
      for(j=0;j<weeknum;j++) {
        printf("   ");
      }
    }

    // 日付を表示
    printf("%d ", i+1);
    // 1~9の数字の時、スペースを入れて形成する
    if(i+1 < 10)
      printf(" ");

    // 改行を入れて形成
    weeknum++;
    if(weeknum%7 == 0) {
      printf("\n");
    }
  }
  // 改行を入れて形成
  printf("\n");
}

```
Redisの使い方

#サーバーの起動
redisサーバーの起動 redis-server
redisクライアントの起動 redis-cli
#データを扱う
データを格納する　　set key value
valueを取得　get key
複数のデータを一気に格納 　mset key1 value1 key2 value2
複数のデータを一気に取得 　mget key1 value1 key2 value2

帰ってくるデータの型はstring型だが、

```　ターミナル
$mset email hoge@icloud score 100 name tarou
#=>OK
$mget email score name

#=>1) "hoge@icloud"
#=>2) "100"
#=>3) "tarou"
```
 1だけ増やす　incr score
 1だけ減らす　decr score
 Nだけ増やす　incrby score N
 Nだけ減らす　decrby score N
で数値の増減も可能。

keyの一覧取得 keys * 
keyが存在するか exists key(存在したら1,しなかったら0が帰ってくる)
keyの名前をkey1からkey2に変更する rename key1 key2
keyの削除　del key
keyにsecondsで消えるような有効期限をつける　expire key seconds

#List型のデータを格納する
[key][value]
color red green blue yellow
というlint型のデータを格納する。(redの方がleft,yellowの方がright)

データを右に追加　rpush key value
データを左に追加　lpush key value
右のデータを削除　rpop key value
左のデータを削除　lpop key value
0番目からN番目のデータの確認　lrange key 0 N+1
先頭から末尾のデータの確認　lrange key 0 -1
N番目のvalueを取得　lindex key N-1
valueの数を取得 llen  key
0からN番目を切り取る ltrim key 0 N-1

#Set型のデータを格納する
（Set型はvalueの順番は管理しない）
追加 sadd key value
削除 srem key value
一覧　smembers key 
和集合 sunion key1 key2
積集合　sinter key1 key2
差集合　sdiff key1 key2

#Sorted Set型（ソート済みセット）
追加 zadd key score value
削除 zrem key score value
低い順に一覧 zrange key 0 -1
高い順に一覧 zrevenge key 0 -1
ランク　zrank
keyにおけるvalueのランクを知りたい時(低い順)　zrank key value
keyにおけるvalueのランクを知りたい時(高い順)　zrevrank key value

```ruby:qiita.rb
zadd ranking 1 a 2 b 3 c 4 d
#=>4
zrange ranking 0 -1
#=>1) "a"
#=>2) "b"
#=>3) "c"
#=>4) "d"
zrevrange ranking 0 -1
#=>1) "d"
#=>2) "c"
#=>3) "b"
#=>4) "a"
zrank ranking a
#=>0
zrevrank ranking a
#=>3
```
AzureのFunction AppのドメインをGoogleのSearch Consoleに登録する

[GoogleCalendarAPIのWebhook](https://developers.google.com/calendar/v3/push)先をAzureのFunction Appにしたい時に、ドメインの所有者の確認が必要になる。ドメインの所有者の確認はSearch Consoleで行うが、確認する方式はいくつかあるが、今回は、ドメインのルートURLでアクセスした時に下記のようなヘッダーが入った認証用のページを作成して、確認する方式を取ることにする。

`<meta name="google-site-verification" content="xxxxxxxxxx" />`

# 前提
* AzureのFunction Appではカスタムドメインは使用しない

# 使用するもの
* Azure　Function Appのプロキシ設定
* Azure  ストレージアカウント

# 手順
1. Function Appを作った時に自動で作られたストレージアカウント（別に新しく作ってもいいかもしれない）のBLOB SERVICEでコンテナの追加を行う。その時に「パブリック　アクセス　レベル」を「BLOB」にする
1. 認証用のメタタグの入った、HTMLファイルを作成する。
1. 新しく作ったコンテナー配下に認証用のメタタグの入ったHTMLファイルをアップする。アップできたら、そのファイル（BLOB）のプロパティでURLをコピーする。ブラウザでそのコピーしたURLにアクセスし、作成したHTMLが表示され、ヘッダーに認証用メタタグが埋め込まれているか確認する。
1. Function Appの画面を開き、「プロキシ」で新しいプロキシを作成する。コピーしたURLが、ドメインのルートURLで見られるようにプロキシの設定を行う。プロキシを設定しない状態で、ルートURLにアクセスすると「Your Function App is up and running」というメッセージの画面が表示される。
* Search Consoleで確認手続きを行い、登録を完了する
GCE(Debian)でサーバーの設定してみた - インスタンスの作成編 -

サーバの設定をしてみたので、手順を残します。
- インスタンスの作成編
[Google Cloud Platform](https://console.cloud.google.com)

##インスタンスの作成
本家チュートリアル通りに進めると作成できますが、以下の記事はとても参考になります。
https://qiita.com/FukuharaYohei/items/0614354d6a4eda32d521
ここでは、ブートディスクにはDebianを設定します。
##鍵の登録
Google Cloud PlatformのCompute Engineから公開鍵を登録します。
メニューから[[メタデータ](https://console.cloud.google.com/compute/metadata?project=i-melody-209714)]＞[SSH 認証鍵]＞[項目の追加]の順に選択します。
手順は次のサイトの「GCPにSSH認証鍵を登録する」を参考に。
[Qiita-GCPに共通鍵を追加する手順まとめ](https://qiita.com/ariaki/items/e225b815924d37bc19d5)
##22番ポートの閉鎖
1. コンソールより、作成した鍵を使用してssh接続する。
<br>```ssh -A [user name]@[external IP address]```
<br><br>
2. /etc/ssh/sshd_configに、Port \* を追記する。
<br>\* には、解放するポート番号を指定します。
<br>```Port *```
<br><br>
3. sshdの再起動
<br>```sudo /etc/init.d/ssh restart```
<br><br>
4. ファイフォールの設定
<br>[Google Cloud Platform VPCネットワーク](https://console.cloud.google.com/networking/firewalls/list?project=i-melody-209714&tab=INGRESS)のメニューから[ファイアウォール ルール]を選択し、default-allow-sshのルールを変更します。
<br><br>4.1 default-allow-sshをクリックする<br>
<img width="988" alt="Screen Shot 2018-07-14 at 11.27.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/271386/5f39095a-ec04-b8ab-b1c0-30bfae8f845d.png">
<br><br>4.2[編集]を選択する<br>
<img width="752" alt="Screen Shot 2018-07-14 at 11.27.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/271386/b40c24aa-2311-8e34-6df6-41a98048cd49.png">
<br><br>4.3 ポート番号を22からサーバに指定したポート番号に変更し保存する<br>
<img width="543" alt="Screen Shot 2018-07-14 at 11.28.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/271386/ad594068-8871-c643-433d-b00604b0ddb1.png">

##接続の確認
サーバで指定したポート番号を指定し、ssh接続にて接続を確認する
```ssh -A [user name]@[external IP address] -p [port number]```
SMART-NAVRTKをRaspberryPiで使う

#RTKLIB
http://www.rtklib.com/

RTKLIBにはWindowsのほかにLinuxなどのUNIX系向けのソースコードも用意されているため、CUIで使うことは可能なんだけど、やっぱGUIあったほうがいいよね！って場合も多いので探してみたところ、ドローン用？のオープンソースGUIがあったのでご紹介します。

#SMART-NAVRTK
https://github.com/drorgl/SMARTNAV-RTK

#インストール

可搬性を考えて、RaspberryPi3にインストールしてみました。
(PizeroWなどにも入れてみましたが、立ち上がりに少々時間かかりました。)

##Raspbianの設定は省略
よそにたくさんあるので、Node.jsとnpmを入れるところから書きます。
SMART-NAVRTKに必要なパッケージをインストールしていきます。

参考元：[Raspberry PiにNode.jsとnpmの最新版をインストールする](https://qiita.com/mascii/items/77c685df65c4cbca9315
)

```bash
$ sudo apt-get update
$ sudo apt-get -y upgrade
$ sudo apt install -y nodejs npm 
$ sudo npm cache clean
$ sudo npm install npm n -g
$ sudo n stable
```

##permission denyエラーが出たのでぐぐってみた。
[npmでpermission deniedになった時の対処法[mac]](https://qiita.com/okoysm/items/ced3c3de30af1035242d)

```bash
$ mkdir ~/.npm-global
$ npm config set prefix '~/.npm-global'
$ vi ~/.profile
export PATH=~/.npm-global/bin:$PATH
$ source ~/.profile
```

#あとは公式のReadmeに従いインストール

```bash

$ cd ~/
$ git clone --depth 1 https://github.com/drorgl/SMARTNAV-RTK.git
$ git clone --depth 1 https://github.com/bnoordhuis/gyp.git
$ export GYP_PATH=~/gyp/gyp
$ cd ~/SMARTNAV-RTK/Software/rtklib-smartnav/
$ chmod +x build_linux.sh
$ ./build_linux.sh
$ cp ./build.linux/out/Debug/rtkrcv ./build.linux/out/Debug/str2str ../binary/
$ cd ~/
$ npm install pm2 -g
$ cd ~/SMARTNAV-RTK/Software/webconsole
$ cd RTKLIB-Server
$ npm install
$ cd ..
$ ls
（RTKLIB-Serverだけではなく、RTKLIB-WebConsole,RTKLIB-RTKRCV,RTKLIB-STR2STRもそれぞれcdでディレクトりに入り、npm installする）

$ cd ~/SMART-NAVRTK/Software/webconsole/
$ pm2 start pm2production.yaml
```
##404エラーが出た場合

```console
node-pre-gyp ERR! Tried to download(404):
```

```bash
$ sudo npm cache clean -f
$ sudo npm install -g n
$ npm update -g npm
$ npm update -g
```

#ブラウザで開く
http://raspberrypi.local:8080/

![スクリーンショット 2018-07-14 19.23.21_01.png](https://qiita-image-store.s3.amazonaws.com/0/181687/a4cc42b2-593b-71a8-fd1d-eb04259f2015.png)

#自動起動

[ラズパイ起動と共にpm2でスクリプト起動](https://qiita.com/ikemura23/items/68fb61b16c6752daa7e8)
C > C99 > restrict キーワード > link || 実装ソースのコメント

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

ADDA v1.3b6に出てくる下記の実装。

```interaction.c
// tables of integrals
static double * restrict tab1,* restrict tab2,* restrict tab3,* restrict tab4,* restrict tab5,* restrict tab6,
	* restrict tab7,* restrict tab8,* restrict tab9,* restrict tab10;
```

関連して下記を見つけた。

- by @yohhoy さん
    - [restrictキーワード](http://d.hatena.ne.jp/yohhoy/20120223/p1)
    - [続 restrictキーワード](http://d.hatena.ne.jp/yohhoy/20120229)
    
情報感謝です


ADDAでは様々な場所にrestrictが使用されている。

ADDAの`iterative.c`の`SwapPointers()`に下記のようなコメントもある (赤字はこちらで強調)。

> swap two pointers of (doublecomplex `*`) type; should work for others but will give "Suspicious pointer conversion" warning. While this is a convenient function that can save some copying between memory blocks, it doesn't allow consistent usage of 'restrict' keyword for affected pointers. This may hamper some optimizations. <font color=red>**Hopefully, the most important optimizations are those in the linalg.c, which can be improved by using 'restrict' keyword in the functions themselves**</font>.
Retrofit で Qiita の記事一覧を取得するサンプル

学習等の用途でちょっとしたプロトタイプを作るときに、APIで〇〇を取得して〜というコードを毎回、思い出しながら作るのが面倒なので、自分用にメモしておきます。

Qiita API v2 で `https://qiita.com/api/v2/items?page=1&per_page=10` を叩き、記事の一覧を取得するとします。

```gradle:build.gradle

// ...

def retrofit_ver = '2.3.0'
def moshi_ver = '1.5.0'
def okhttp3_ver = '3.10.0'

dependencies {
    // ...

    implementation "com.squareup.retrofit2:retrofit:$retrofit_ver"
    implementation "com.squareup.moshi:moshi:$moshi_ver"
    implementation "com.squareup.moshi:moshi-kotlin:$moshi_ver"
    implementation "com.squareup.retrofit2:converter-moshi:$retrofit_ver"
    implementation "com.squareup.okhttp3:okhttp:$okhttp3_ver"

    // ...
}
```


```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hoge">

    <!-- インターネット接続を許可 -->
    <uses-permission android:name="android.permission.INTERNET" />

    // ...    

</manifest>
```

```kotlin:ItemEntity.kt
data class ItemEntity(
    @Json(name = "id") // 記事ID
    val id: String,
    @Json(name = "title") // タイトル
    val title: String,
    @Json(name = "body") // 記事の中身
    val body: String
)
```

```kotlin:ItemService.kt
interface ItemService {

    // 特に RxJava 等は使わず Retrofit 標準のコールバックで結果を受け取る
    @GET("items")
    fun items(
            @Query("page") page: Int,
            @Query("par_page") perPage: Int
    ): Call<List<ItemEntity>>
}
```

```kotlin:ItemRepository.kt
class ItemRepository {

    private var itemService: ItemService

    init {
        val okHttpClient = OkHttpClient.Builder().build()
        val moshi = Moshi.Builder().add(KotlinJsonAdapterFactory()).build()
        val retrofit = Retrofit.Builder()
                .baseUrl("https://qiita.com/api/v2/")
                .addConverterFactory(MoshiConverterFactory.create(moshi))
                .client(okHttpClient)
                .build()
        itemService = retrofit.create(ItemService::class.java)
    }

    // エラー処理は省いています
    fun getItemList(callback: (List<ItemEntity>) -> Unit) {
        itemService.items(page = 1, perPage = 10).enqueue(object : Callback<List<ItemEntity>> {

            override fun onResponse(call: Call<List<ItemEntity>>?, response: Response<List<ItemEntity>>?) {
                response?.let {
                    if (response.isSuccessful) {
                        response.body()?.let {
                            callback(it)
                        }
                    }
                }
            }

            override fun onFailure(call: Call<List<ItemEntity>>?, t: Throwable?) {}
        })
    }
}
```

ここまで出来たら、後は次のように記事の一覧(`List<ItemEntity>`型)を取得するだけです。

```kotlin
val itemRepository = ItemRepository()

itemRepository.getItemList { itemList -> 
    Log.d("test", "$itemList")
}
```

`itemRepository.getItemList()` について補足すると、WEB API の呼び出し結果を非同期で取得する必要があるので、引数に `(List<ItemEntity>) -> Unit` 型の function を渡すことでコールバックを実現しています。Kotlin だと簡単に書けていいですね。
z88dkのMSXテープ自動読み込み

```hello.c
/*
z88dk / WebMSX
zcc +msx -lndos -create-app hello.c
zcc +msx -lndos -create-app -bnhello hello.c
bload"cas:",r
*/

#include <stdio.h>

void main()
{
	printf("hello, world");
}
```

`zcc +msx -lndos -create-app hello.c`
上記ソースをコンパイルするとa.casファイルが作られる。これをWebMSXのCassetteにドロップする（もしくは[Load Image File]）。
左下の[Cassette Tape]アイコンをクリックし、[Run Program]を選択するとa.binがSkipされて`Device I/O error`となる（テープEND）。
a.casファイルをドロップし直すか、[Rewind Tape]で巻き戻し
`bload"cas:",r`
と入力すると正常に実行される。
![WMSX Screen (1).png](https://qiita-image-store.s3.amazonaws.com/0/257554/f8d648d1-2a6e-c5e3-30a3-c9a0b46c8443.png)

bsaveしたファイルと比べたりした結果、どうやらテープ内ファイル名a.binにピリオドを含むのが原因のようだ。テープなのに拡張子処理してるように思われる。

`zcc +msx -lndos -create-app -bnhello hello.c`
とコンパイルするとhello.casファイルが作られる。テープ内ファイル名はhelloとなる。
`-bn	Set the output file for the linker stage`
-bnオプションにはa.binの代わりとなるファイル名を指定する。

同様にhello.casファイルをドロップし、[Run Program]した結果、正常に実行された。
![WMSX Screen (2).png](https://qiita-image-store.s3.amazonaws.com/0/257554/1c11b0d3-958d-a703-08e3-176a7cae3533.png)

[WebMSXテープ自動読み込みサンプル](http://webmsx.org/?tape=http://www.maroon.dti.ne.jp/lance/file/hello.cas)
【楽したい】GitHubへのpushからHerokuへのデプロイの自動化

#はじめに
GitHubへpush、そしてHerokuにもpush、、
を一回で済ませたい！楽したい！をします
すでにこの内容の投稿はあると思いますが、自身の備忘録用に作成します

##やってみる
今回はscaffoldで作成したアプリを自動デプロイの対象とします

![スクリーンショット 2018-02-15 22.49.11.png](https://qiita-image-store.s3.amazonaws.com/0/224934/c4a377f3-3061-5e58-5377-8186233a90a8.png)

####1. Heroku側でアプリを登録
今回は、「scaffold-demo-app」という名前で作成

####2. DeployタグのDeployment_methodからGitHubを選択
![スクリーンショット_2018-02-15_22_52_18.png](https://qiita-image-store.s3.amazonaws.com/0/224934/6b29fcb9-33f1-1054-8271-31daefa46ee1.png)

####3. GitHubへの接続確認をされます
![スクリーンショット_2018-02-15_22_56_24.png](https://qiita-image-store.s3.amazonaws.com/0/224934/1221ae65-499a-a066-7382-6c3be666d372.png)

####4. 認証する 
![スクリーンショット_2018-02-15_22_57_03.png](https://qiita-image-store.s3.amazonaws.com/0/224934/f494013c-e1c1-1c94-529a-8ea468cad385.png)

####5. リポジトリ選択
![スクリーンショット_2018-02-15_22_57_54.png](https://qiita-image-store.s3.amazonaws.com/0/224934/60d7f153-b291-2c6e-7b55-bd582abe2705.png)

####6. 自動デプロイを有効化する
![スクリーンショット_2018-02-15_23_00_01.png](https://qiita-image-store.s3.amazonaws.com/0/224934/c28f258e-308a-fce5-e42c-9f3b0a0cbfc1.png)

これで自動デプロイが可能です〜
windows版のvagrantでrails5+webpack使うとコンパイルができない問題

## 状況

rails5下でwebpack-dev-server起動してjs類をインクリメンタルにコンパイルするというのをvagrant上でやろうとしたら、jsがコンパイルされない。
どうやらホストがwindowsの場合、共有フォルダを使うと、vboxsfがionotifyに対応しておらず、それを使用しているwebpack-dev-server変更を検知できない模様。

## 解決策

デフォルトのionotify使わずにpollオプションを使った。

```yaml:config\webpacker.yml
development:
  # Reference: https://webpack.js.org/configuration/dev-server/
  dev_server:
....中略.....
    watch_options:
      aggregateTimeout: 300
      poll: 1000
```

参考

* https://qiita.com/derui@github/items/44977e0de5b892009b2f
* https://webuilder240.hatenablog.com/entry/2015/11/03/154245
Gitプルリクエストでコンフリクトが発生した場合の対応

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66405/eb8c3fb3-32c9-2af1-a133-56b3dd24c41e.png)

はじめに
-----
プルリクエストでコンフリクトが発生した場合にどうするかというのが初心者が混乱する最初のポイントになるかと思います。どれが良いのかわからないが、困らないようにやってみる。

準備
-----
`master`から`feature`を分岐してそれぞれいくつかコミット。
githubの`pull-request`で、`master`に`feature`を取り込む際にコンフリクトが発生した場合。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66405/456cae6a-7438-be27-5777-b31dde48cb75.png)

【option1】featureにmasterをmergeする
-----
1. masterを最新にする
1. featureにmasterをmerge
1. コンフリクトを解決
1. featureをリモートにpush
1. github上でpull-requestをマージ

```
git checkout feature
git merge master
(resolove conflicts)
git push origin feature
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66405/8c228fb4-a00c-7b1a-7b21-cb43a2239ae4.png)

### Benefits
- コンフリクトの解決が1回で済む
- 履歴を書き換えない
- 強制pushせずに済む

### Drawbacks
- 一回の統合操作で、ローカルでのマージログ、githubでのマージログの2つが残り、あまり意味のないコミットが発生する


【option2】featureにorigin/masterをmergeする
-----
1. featureをcheckout
1. pullでfeatureに`origin/master`をmerge
1. コンフリクトを解決（SourceTreeだとメッセージ出ないので注意）
1. featureをリモートにpush
1. github上でpull-requestをマージ

```
git checkout feature
git pull origin master
(resolove conflicts)
git push origin feature
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66405/08de7346-2acb-643c-11fc-c872b5f144ce.png)


### Benefits
- option1と全く同じ結果、仕組みになるが、最新取得＋マージが一発で早い

【option3】masterをfeatureにrebaseする
-----
1. masterを最新にする
1. featureをcheckout
1. masterをfeatureにrebase
1. コンフリクトを解決
1. featureをリモートに`強制push`
1. github上でpull-requestをマージ

```
git checkout feature
git rebase master
(resolove conflicts)
git push -f origin feature
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66405/4e106b03-e0f7-8ca5-4af1-92f950091316.png)

### Benefits
- ブランチの履歴が別になってわかりやすい

### Drawbacks
- コンフリクトの解決が複数回発生して面倒
- リモートを強制的に書き換えてしまう

【option4】origin/masterをfeatureにrebaseする
-----
1. featureをcheckout
1. `origin/master`をfeatureにrebase
1. コンフリクトを解決（SourceTreeだとメッセージ出ないので注意）
1. featureをリモートに`強制push`
1. github上でpull-requestをマージ

```
git checkout feature
git pull --rebase origin master
(resolove conflicts)
git push -f origin feature
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/66405/14550c89-8772-d1dc-30d5-69656d08148d.png)

### Benefits
- option3と全く同じ結果、仕組みになるが、最新取得＋リベースが一発で早い

まとめ
-----
githubでマージコミットが残ることを考えると、ローカルでマージコミットを残さないリベースをしたほうが無駄がない感じがする。ただマージ作業が複数回発生してしまうのは危険な香りがする。
この対応で混乱すると、Gitよくわかんね、という評価になってしまうので、事前に考え方を整理しておきたい。
Kotlinまとめ - Kotlinとは

# Kotlinとは
* JetBrainsが開発したJVM言語
* 2016年2月にv1.0がリリース
* 2017年のGoogle I/OでAndroidでの公式サポートが発表

# 特徴
## 簡潔
* セミコロン不要
* 型推論
* データクラス
* 拡張関数
* などなど

## 安全
* null安全
    * 変数やメソッドの戻り値などにnilが入る可能性があるかを明示しなければならない

## JVM言語
* Javaと100%互換性がある
* Java→Kotlinの呼び出し、Kotlin→Javaの呼び出しも可能

## 静的型付け
* Javaと同様コンパイルするので
* 型推論のおかげで型の冗長な記述は不要

[基本的な文法 - 型 →](https://qiita.com/hicka04/items/66d045bc1f0b5e9d9561)
銃を構えた先にレティクルを表示する

<img width="1405" alt="スクリーンショット 2018-07-14 10.57.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/256717/de3d476b-c6ef-a603-0759-b2778029bf00.png">

銃を構えたときに照準を表示したいなーと思い作成。





まず、カメラがAIM状態になったとき、レティクルを表示する。カメラを操作するスクリプトの一部です。
省略されていますが、レティクルはSetActive(false)で、ヒエラルキー上にあります。

```csharp.cs
 void FixedUpdate () {
        transform.position = new Vector3(Player.position.x, transform.position.y, Player.position.z); //プライヤー位置を追従する

        transform.RotateAround(transform.position, Vector3.up, Input.GetAxis("Mouse X")* RotateSpeed);       //横回転
        transform.RotateAround(transform.position, transform.right, -Input.GetAxis("Mouse Y")* RotateSpeed); //縦回転

        //AIM時のカメラ挙動
        if (PlayerController.isAIM)  
        {
            RotateSpeed = 0.3f;
            Cam.transform.DOMove(AimPosition.position, 1);

            //カメラ中心の先を取得するため
            CameraRay = new Ray(Cam.transform.position, Cam.transform.forward);
           
            //レイの当たり判定
            if(Physics.Raycast(CameraRay, out CameraHit)){
                if (CameraHit.collider.gameObject.tag == "ignoreRay") return;
                Reticle.SetActive(true);
                Reticle.transform.position = CameraHit.point;
            }
        }
        else
        {
            RotateSpeed = 1.0f;
            Reticle.SetActive(false);
            Cam.transform.DOMove(DefaultPosition.position, 1); 
        }
	}
```

次に、レティクルが距離によらず一定の大きさになるコードを、
レティクルへアタッチします。

こちらは下記を参考にしました。
【参考】 [Perspectiveカメラからの距離が変化しても見た目の大きさは変わらないオブジェクトを作る]
(https://qiita.com/r-ngtm/items/e4df707d45b097999776)

```ReticleController.cs
using UnityEngine;

public class ReticleController : MonoBehaviour {
    Vector3 baseScale; // カメラからの距離が1のときのスケール値

    private void Start()
    {
        // カメラからの距離が1のときのスケール値を算出
        this.baseScale = this.transform.localScale / GetDistance();
    }

    void Update () {
        transform.localRotation = Quaternion.Euler(0, Camera.main.transform.localRotation.y, 0);

        //カメラからの距離によらず、一定の大きさで表示させる
        this.transform.localScale = this.baseScale * this.GetDistance();
	}

    // カメラからの距離を取得
    float GetDistance() 
    {
        return (transform.position - Camera.main.transform.position).magnitude;
    }
}
```
【新人エンジニア向け】分からないことをググるときに気を付けるべきこと

## 前置き

システム開発を行っていると、「link_to_if の引数なんだっけ？」とか、「ヘルパーメソッドをmodel内で呼び出したいけど、どうやったら出来るのかな？」とか、色々とググる機会が多いですね。
しかし、世の中には、誤った情報・古い情報も数多くあることを忘れてはいけません。

「怪しげな情報を鵜呑みにして、バグを仕込んでしまった！」なんてことにならないよう、私がWebで情報を集める時の手順と、気を付けていることをまとめてみます。

## 1. 公式ドキュメントを読む

まずは、軽くでいいので、公式ドキュメントに目を通します。
解決方法が見つかったら調査終了です。
見つからないなら「2」へ。

## 2. tipsをググる

普通にググります。
日本語より英語で検索した方が情報が見つかりやすい気がします。

ここで気を付けるのが、以下の3点です。

* 複数の記事を漁る（同じことを言っている記事が多ければ信ぴょう性が高いので）
* 記事の投稿日を確認する（書かれた当時は正しくても現在は……なケースがあるので）
* コメント欄までしっかり読む

「これだ！」と思う情報を見つけたら「3」へ。

## 3. 裏を取る

* 再び公式ドキュメントを読み、調べた情報が正しいことを確認します。（調査対象がrailsなどのOSSなら、ソースコードを読むのも効果的です）
* 自分の手で動かして確かめます。

ソースコードまで読んで確認するのは、一見、手間がかかりすぎるように思えますが、フレームワークやライブラリに対する理解が深まるので、応用が効きやすくなります。トータルで考えるとお得です。
EditTextへのonClickイベントを発火させる方法

## 前置き

EditText（たぶんTextViewとかも）のonClickにイベントをただ指定するだけではイベントが発火しなかった。結論から言うと、clickableとfucusableをtrueにすることでそもそものクリックイベントを受けれるようにする必要があったようだ。

## 詳細

サンプルに、EditTextだけを配置したActivity

![EditTextActivity.png](https://qiita-image-store.s3.amazonaws.com/0/166629/f5499ab5-3080-d56d-ddcd-cc27f5d6fc47.png)

クリックされたらToast表示するだけのイベント関数

```kotlin
fun onClickEditText(v: View)
            = Toast.makeText(this, "click!", Toast.LENGTH_SHORT).show()
```

余計な項目が多くて見にくいんだけど、`android:onClick="onClickEditText"`を指定しただけ

```activity.xml
 <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"

        android:onClick="onClickEditText"/>
```

→ 実際にタップしてもイベントが発火しない！！

EditTextに`android:clickable="true"`と`android:focusable="true"`を追記してあげるとイベントが発火します

```activity.xml
<EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"

        android:onClick="onClickEditText"
        android:clickable="true"
        android:focusable="true"/>
```
Wio LTEで遊んでみる（その１：環境構築＋Ｌチカ）

ちょっとだけやる気と時間ができたので、
社内に放置されていた[Grove IoT スターターキット for SORACOM](https://soracom.jp/press/2017102501/)を借りてちょっと遊んでみました。




##〇環境構築
まずは環境構築。
基本的には書いてある通りにやれば簡単に環境構築できるかと。
https://dev.soracom.io/jp/start/lte_hw_wio-lte/

・Arduino IDE：今回入れたのは1.8.5
・WinUSB ドライバ
・Virtual COM Port ドライバ
・TeraTerm：これはすでに入っていたので特に追加しなかった
・zadig
→これも必要
　https://seeedjp.github.io/Wiki/Wio_LTE_for_Arduino/ReplaceDriver-ja.html
　これを忘れているとIDEからの書き込みで失敗する


##〇Ｌチカ
Ｌチカまではすぐにできるのだが、このタイミングでログを確認したくて
TeraTermで見てみても何も表示されない。。
→よくわからないが、スケッチ例のままだと表示されないが、
loopの中のどっかに[SerialUSB.println]で適当なログを入れてみたら表示された。
**なぜだ。**


##所感
言語的にはC言語がベースなのかな。
にしてもIDEが超絶使いにくい。それともこんなものなのか。
※軽く調べてみるとVSCODEにExtensionがありそうなのでそのうち試してみよう。

とりあえずはここまで
ジェイソンがいつ来ても良いように13日の金曜日を検出するツール作ってみた


先日（2018/07/13）は、今年何度目かの13日の金曜日でしたね。
そこで次にいつジェイソンが来るかを知るために、13日の金曜日を検出するツール作ってみました。
ちなみに中身はGo言語による日付を解析したプログラムです。

## コード
```main.go
package main

import "flag"
import "fmt"
import "time"

var (
	year = flag.Int("y", 3, "検出する年数")
)

func main() {
	flag.Parse()

	// 現在日取得
	t := time.Now()
	fmt.Println(t)

	if t.Day() != 13 {
		// 一度、当月の13日に変換する
		t = time.Date(t.Year(), t.Month(), 13, t.Hour(), t.Minute(), t.Second(), 0, time.UTC)
		fmt.Println(t)
	}

	// 指定年数分の日付検出
	fmt.Println("ジェイソンが出現する日です")
	for i := 0; i < *year*12; i++ {
		t = t.AddDate(0, 1, 0)
		if t.Weekday() == 5 {
			fmt.Println(t)
		}
	}
}
```

## 使い方/ポイント
* `go run main.go`もしくは`go build` & `./main`で実行可能
* 引数の`-y`に検出年数を指定可能（詳細は`-h`で参照可能）
* `time.Weekday`はfmtで出力時は文字列（String）(ex: `Friday`)だが、戻り値は数値（Int）(ex: `5`)
* 一度現在日を取得後、当月の13日に変更してから、検出を開始しているため、実行日の現在日が13日の前後の場合問わず、出力される仕様

## 実行/出力内容
```
$ go run main.go
2018-07-14 10:19:34.798320968 +0900 JST m=+0.000362720
2018-07-13 10:19:34 +0000 UTC
ジェイソンが出現する日です
2019-09-13 10:19:34 +0000 UTC
2019-12-13 10:19:34 +0000 UTC
2020-03-13 10:19:34 +0000 UTC
2020-11-13 10:19:34 +0000 UTC
```

## 最後に
Go言語だとこれぐらいの行数で簡単に出来ましたね。
ソースは[こちら](https://github.com/SRAUFactory/Jason-s-Days-Detector)でも公開中です。
そのうち過去の日付も検出できるようにするかもしれません。
フリーのSVG素材の出典を明示するためのgulpプラグインを作った

## 作ったもの

[gulp-svg-gallery](https://github.com/ykiu/gulp-svg-gallery)
![screen shot](https://user-images.githubusercontent.com/32252655/41199715-a71ef21a-6cd1-11e8-89e5-15d2f46a3854.png)
SVGファイルと、SVGファイルのキャプションを書いたテキストファイル(.txt)を与えると上の画像のような静的HTMLを生成します。

## きっかけ

フリーのSVG素材の多くは、使用条件として出典を明記することを挙げています。決まった作者のSVG素材しか使わないのであれば、フッターにその作者に対するクレジットを示すことで対応できますが、複数の作者/サイトの素材を組み合わせて使う場合、上記の方法では、どの画像がどの作者によるものなのかが分からなくなるという問題があります。そこで、画像のサムネイルと、その画像の出所やライセンスを組み合わせて表示したいと考えました。

## 技術的なこと

gulpプラグインを作るのはこれが初めてだったので、@morouさんの[分かりやすい入門記事](https://qiita.com/morou/items/1297d5dd379ef013d46c)を参考にしました。独立したSVGファイルをインライン化するための加工には[cheerio](https://github.com/cheeriojs/cheerio)を使いました。

## 苦労したこと

初めてのgulpプラグインでしたが、作り込まなければ意外に簡単にできることが分かりました。作り始めてから2時間くらいで、SVGをHTMLに無加工で埋め込むだけの単純な機能が実装できました。その後、SVGを正しくインライン化するためにcheerioでいくつかの加工を施すようにしたのですが、cheerioのAPIになかなか馴染めず、かなり時間がかかってしまいました。

今回はcheerioで苦労しましたが、gulpのプラグイン自体はかなり簡単に作れるもののようです。ちょっと自動化したいタスクがある、という場合には自分用のプラグインを作ってみてはいかがでしょうか。
Golangで画像をスクレイプする


[Agouti](https://github.com/sclevine/agouti)を使って操作する
webdriverは[chromedriver](http://chromedriver.chromium.org/downloads)を使用

対応ブラウザー
- Google
- yahoo
- Bing


以下をインストール

```
$ brew cask install chromedriver
$ go get github.com/PuerkitoBio/goquery
$ go get github.com/sclevine/agouti
$ go get gitlab.com/torufukui/octopus_stock
```


[octopus_stock](https://gitlab.com/torufukui/octopus_stock)はGoogle、Yahoo、Bingから画像を取得できるように作った簡単なライブラリ
以下のようにして使用する

```

package main

  import (
    "gitlab.com/torufukui/octopus_stock"
    "gitlab.com/torufukui/octopus_stock/google"
    "gitlab.com/torufukui/octopus_stock/yahoo"
    "gitlab.com/torufukui/octopus_stock/bing"
  )

  func main() {
    stock_image := &octopus_stock.StockImage{
      FolderName: "Folder name",  // Specify the folder to download
      KeyWord:    "keyword name", // Specify search keywords
    }

    google := google.New(stock_image)
    google.ImageStock()

    yahoo := yahoo.New(stock_image)
    yahoo.ImageStock()

    bing := bing.New(stock_image)
    bing.ImageStock()
  }

```

## コード、仕組みの解説

**FolderName**は保存するフォルダ名を指定する、コードを実行したカレントパス上にフォルダが作成されダウンロードした画像が保存される

**KeyWord**はダウンロードしたいキーワード名を指定する

ダウンロードしてきたファイル名はURLをSHA1に変換して16進数でつけているがこれはURLからファイルの重複を防ぐため

デフォルトではchromedriverはheadlessモードに指定しているがブラウザを表示させたかったら内部のコードをいじってheadlessモードを外して対応してください

うまくいけば、一キーワードにつき１０００枚の画像のダウンロードができます

画像のスクレイプはいたちごっこなのでブラウザ側の仕様変更で取得できなくなる可能性があります
サーバーサイドの動作をngrokでローカル環境を外部から動作確認

# Step 1: Download ngrok
https://ngrok.com/
からMac用のバイナリをダウンロード


# Step 2: 解凍
```
$ unzip /path/to/ngrok.zip
```

# Step 3: 実行
ポートを外部に公開する
```
$ ./ngrok http [ポート番号]
例) 5000番ポートの場合
$ ./ngrok http 5000
```

以下のような画面が表示されます
<img width="569" alt="スクリーンショット 2018-07-14 10.05.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/35613/86cbe8d2-71da-e809-b4c3-adf8b972dcdb.png">


a1f8c9d5 は起動のたび、ランダムな文字列が設定されます。

# ヘルプ
```
$ ./ngrok help
```
Github で Fork して PullRequest を送るのはこんなに簡単

# ふぉーくで始めるぷるりくえすと

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1c722b7f-02d9-f521-fa77-e267a2f5734f.png)

# 「Fork ってなにそれ、怖い」

そんな風に思っていた昔の自分に贈る。

そういえば当時、解説ページを一瞬読んで、なんだか難しそうだと思って閉じてしまっていたような記憶もある。

# で Fork って何？

ひとつのレポジトリを丸コピして、自分のレポジトリを作れる機能。

## (どういうこと？)

「つまり、やりたい放題ってことだ！」

## Pull Request と何の関係が？

僕が思うに、ここが分かりづらい。
言葉の響き的に関係してるような気がしない


(フォークは‥肉を食べるための‥道具‥！)

Githubでは、このForkという機能を「利用」して、本体のレポジトリを汚さずに、安全にPullRequestを送れる仕組みがある。

ここでは「PullRequestを送るための手順」ぐらいに考えておいたら良い。

# 試してみよう

## 好きなレポジトリを Fork する

好きなレポジトリを選んで、 Fork ボタンを押す。
押してみろ。そこから全ては始まる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7371f5d5-4310-d113-0d70-6d16eb11861d.png)

## Fork される

自分のレポジトリが作成される。
本体のレポジトリからのクローンだ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/90ba3c09-8583-c780-8f32-c5998a9c096a.png)

この例だと `stympy/faker` のコピーとして `Yumainaura/faker` が作られたのが分かる。

## Forkした自分のレポジトリにコミットを積む

ブランチは何でも良い。

コミットを積んで push してみる。

ここでpushしたりbranchを作ったりという作業は、あくまで自分のレポジトリに対してのものなので、何をしても本体のレポジトリは汚さないし、壊さない。(これがForkの良いところ)


## 本体のレポジトリにPullRequestを送る

**自分のレポジトリ** の「Create Pull Request」ボタンを押してみよう。
( 本体レポジトリの「Create Pull Request」からは進めないので注意)

「本体のレポジトリのブランチ」に対して「自分のレポジトリのブランチ」のPullRequestを作れるのが分かるだろう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/dfcbb880-471c-72d5-c069-d825e353b064.png)

こうやってレポジトリをクローンして、git的に安全な状態を保っておきつつ、つつましく本体レポジトリにPullRequestを送るというのが、Forkの礼儀正しさだ。

# PullRequestが作成される

画像は、それがやがてマージされた例。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4ffb78b9-9b13-d61e-ea3f-e40e8d8e399a.png)


# いかがだろう

簡単さの感触が伝われば幸いだ。

# あわせて読みたい

ここでは「Fork式」のPullRequestを紹介したが「レポジトリ共有式」のPullRequest作成を理解していることが前提となる。

PullRequest自体に慣れていない人は自分だけのまっさらなレポジトリを作って、色々と遊んでみたら良いかも知れない。

- [GitHub初心者はForkしない方のPull Requestから入門しよう | qnyp blog](https://blog.qnyp.com/2013/05/28/pull-request-for-github-beginners/)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
XCodeのPlaygroundで自動ビルドをオフにする

調べてもパッと分からなかったのでメモ

# 環境
XCode 9.4.1

# 方法
## 自動ビルドOFF
左下の▷ボタンを長押しするとメニューが表示されるので「Manually Run」を選択

![playground.png](https://qiita-image-store.s3.amazonaws.com/0/22205/27f29581-e8d7-6ec0-26b3-abaaca3344e2.png)

これだけで自動ビルドのOFFはOK

## キーボードショートカットの設定
Playgroundでの実行にはキーボードショートカットが割り当てられておらず、このままだとビルドする際に▷ボタンを押す必要がある。
このため、自分でキーボードショートカットを設定する。

Preference>Key Bindingsで「execute」と検索すると「Execute Playground」が出てくるのでショートカットを設定。⌘Rを設定したいところだが、通常のRunとconflictするので⌥（option)Rを設定

![keyboard shortcut.png](https://qiita-image-store.s3.amazonaws.com/0/22205/70cf7505-a4c9-8d5d-31ca-b6dc6ef91fa3.png)

## 参考
Macから設定すれば⌘Rで実行できる？
https://fluffy.es/xcode-playground-tips/#manual
webrtc.orgのnative使ってMacOSのプログラム組む・実際に組んだ時のアレコレ

# 概要

最終的にはMacOS、Android、iOSで
unityとwebrtcを連携させて色々やるのが目標

今回はMacOSで動作させる方向

まず手はじめに必要なライブラリ等を揃えた話
https://qiita.com/taktod/items/a8c87068265fff951c0f

次に実際にプログラムを組んでみた時の話
https://qiita.com/taktod/items/76f0fc450745e5e87f57

今回は作ってみた時にハマったアレコレ

# signalingで利用するwebsocket

いろんな端末に対応する上で処理をできるだけUnityの動作に委ねる方が楽だと考えた。
なので、websocketで利用するプログラムを当初、Websocket-sharpにしてみた。

すると・・・

なぜかはわからないけど、webrtcのプログラムが暴走した。
どうやらwebrtcの世界に第三の世界から触るのはよろしくないみたい。

# 逆にwebrtcのthreadからcsharpの関数をcallすると・・・

これもだめみたい。
c++で実装したコードからunity側のcsharpのコードをcallすることができるので、webrtcのイベント、例えばdataChannelでメッセージを受けた時にcsharp側の特定の関数をcallする・・・
というコードを書いてみた

すると全く動作しない。

unityの世界では、unityが設定したthreadから処理しなければいけないという制限がある模様。

# 映像データの表示

webrtc経由できたVideoFrameの映像データ
僕のイメージだとYUVデータできているのわけですが・・・
これも試行錯誤しました。

## まずは、plugin側でyuv -> rgb変換して応答するやり方
素直な動作ではあるんですが、CPUで計算してやる動作は想定以上に重かった。

## yuvの要素をそのまま渡してshaderでyuv -> rgbする方法

それぞれの要素のデータをそのままcsharp側にIntPtrの形で渡してやって、それでunity上でtextureを３つ１セットつくって表示させる・・・

これをやってみたところ、そこそこの動作したのですが、unity側でtextureを作りまくった結果。
textureが保持するデータが解放されないみたいで、メモリー使いすぎて死にました。

## native側でtextureを準備する方法
で、結局これに行き着きました。
native側でtextureの更新をしてしまえば、メモリーリークしないことがわかっているので、この方法で調整しました。
websocketと同じく、環境依存なコードを書く必要がありましたが、まぁ・・・なんとか

metalで動作させる場合は、考慮する必要はあまりないですが、OpenGL使う場合は、このrenderThreadに手を加える必要が出てくるのでややこしかった。

# というわけでMacOSの動作はこんな具合になりました。

nativePluginを作成する。
signalingはSocketRocketを使って動作する形に・・・で、nativePlugin側に練り込む形にしました。

dataChannelのやりとりメッセージは、取得したらクラスインスタンスが保持する形にしておき、unity側のthreadから必要ように応じて問い合わせる形にした。
これにより、取得ミスするデータが生まれる懸念や、通信が遅れる懸念も出てきた。

音声データは全てwebrtcに任せる形にした。

映像データの取り扱いはTexture自体はUnity側で作るけど、その更新をnativePluginで実施するという形に
Metalはid<MTLTexture>が取得できるので、それを保持して、webrtcのVideoSinkで取得したyuvデータを設定
OpenGLはGLuintでtextureIdが取得できるので、RenderThreadをうまく使って更新する感じに・・・

音声の配信はwebrtcに任せる形にした。
映像の配信は未実装

プログラムは基本c++で実装だけど拡張子はmmでobjective-c++の体裁を取っておきました。

となりました。