OmniAICreator/Qiita-1.07M huggingface dataset:
RailsでCORSのAccess-Control-Expose-Headersを設定する

# 問題

RailsとReactを使ってアプリを作っているのですが、ローカル環境で別々のサーバを立ててaxiosでRailsのAPIにアクセスしたところレスポンスのheadersが空でした。

# 解決方法

以下に書いてありました。

https://stackoverflow.com/questions/37897523/axios-get-access-to-response-header-fields

```ruby:config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins Rails.application.config.x.cors_allowed_origins

    resource '*',
             headers: :any,
             expose: ['access-token', 'uid'], # 追加
             methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end
```

expose: ['access-token', 'uid']の部分を追加したところ、適切にheadersが返ってくるようになりました。
exposeの配列の中身はクライアント側で受け取りたいheadersになります。
Ruby redo

####redoを使ったループ処理参考例
ググった結果redoについての説明が乏しく理解に苦労したので。。

```ruby
i=0 
while i < 3   #print[0123] instead of [012]
print i 
i=i+1 
redo if i==3 
end
#=>0123
```

break や nextとの違いは
redoはループ処理の中にredoの為の変数を用意してあげなければならない、または
カウンタ変数の初期値と更新をループ処理内に記述しなければならない

```ruby
[1, 2, 3].each do |i|
  if i == 2
    next
  end
  p i
end
```
例えばnextなら記述するだけで済みますが、同じことをredoでやると無限ループに突入します。

####redo　無限ループ例

```ruby
[1, 2, 3].each do |i|
  p i
  if i == 3 then
    redo
  end
end
=>123333333333333333......
```
[Rubyがミニツク 繰り返しの制御](http://www.minituku.net/courses/566428009/contents/505181528.html)
よりredoのサンプルコードがありますが、実行すると無限ループに入ります。
（学習サイトのコードになぜ誤ったコードが例示されているかは別として・・）

####redo 無限ループ修正例

```ruby
x=0
[1, 2, 3].each do |i|
  p i
  x=x+1
  if x == 3 then
    redo
  end
end
=>1233
```
さきほどのミニツクコードを修正した結果がこちら。ちなみに下のコードでも実行結果は同じです。

```ruby
[1, 2, 3].each do |i|
  p i
  i=i+1
  if i == 3 then
    redo
  end
end
=>1233
```
redoの為のカウンタ変数を用意してあげる、もしくは「i=i+1」カウンタ変数の更新を忘れずに記述することで無限ループ突入は回避可能です。
whileループの場合ではカウンタ変数の更新が必須であるのに対して、eachメソッドでは記述する必要がない為に、eachメソッドでredoを用いる場合は煩わしいかと思われます。

参考リンク
ctrl+F　「ruby redo」
[The Ruby Programming Language: Everything You Need to Know](https://books.google.co.jp/books?id=jcUbTcr5XWwC&pg=PA151&lpg=PA151&dq=ruby+redo&source=bl&ots=fKDhrb8yiE&sig=_Cx2IC1-N7H4fqENyWjHIW4bvt4&hl=ja&sa=X&ved=0ahUKEwj4__ed347cAhULppQKHbePCcE4ChDoAQg7MAM#v=onepage&q=ruby%20redo&f=false) 
リンク内にて、「redoは通常使われれる命令文ではなく、多くのredo例は不自然なコードである」と言われているので、その直後にredoを用いる特例が記述されていますが、 ~~使わないことにこしたことはなさそうです。~~

頂いたコメントより、redoを用いるケースはユーザー入力など、入力値が期待値に沿わなかった場合再度処理を実行する際に用いるとのことでした。
実際に頂いたサンプルコードを実行したところ、普段ログイン時にパスワードを間違えたりした時のあれか！と一発でイメージが掴めました。ありがとうございます・・！
Gitで「error: There was a problem with the editor 'vi'.」が発生した際の対処法

Mac環境でgitコミットする際、以下のエラーが発生する場合があります。

```terminal
error: There was a problem with the editor 'vi'.
```
## 対処法

```terminal
git config --global core.editor 'vim -c "set fenc=utf-8"'
```
gitコミット時に利用するエディタをvimに設定することでエラーが発生しなくなります。
※日本語ログが文字化けせずに読めるようエンコードはutf-8指定しておきます。

[参考]現在設定されているエディタを確認する。

```terminal
less ~/.gitconfig
```

[参考]設定値

```terminal
[core]
   editor = vim -c \"set fenc=utf-8\"
```
MurataのLoRaWANチップCMWX1ZZABZ搭載ボードをArduino IDEで開発(環境構築編)

STマイクロのB-L072Z-LRWAN1のような
MurataのLoRaWANチップCMWX1ZZABZを搭載したボードの開発環境として
Arduino IDEを使ってみました。

**参考にしたページ**
[https://github.com/GrumpyOldPizza/ArduinoCore-stm32l0](https://github.com/GrumpyOldPizza/ArduinoCore-stm32l0)
このページに書かれている通りに設定していけば動くと思います。

**・先ずは Arduino IDEの環境設定への追加**
　[ファイル] → [環境設定]

　追加のボードマネージャのURLに
　{https://grumpyoldpizza.github.io/ArduinoCore-stm32l0/package_stm32l0_boards_index.json}
　を追加します、すでに別の追加のボードを設定している場合は改行して追加します。
![ボード追加.jpg](https://qiita-image-store.s3.amazonaws.com/0/99249/f4802eb0-a7ac-9dca-e562-d3611a26979a.jpeg)

**・次にボードマネージャへの追加**
　[ツール] → [ボード] → [ボードマネージャ]
　{Tlera Corp STM32L0 Boards} をインストールします。
　(2018年7月8日時点では Ver0.6が最新版)

![ボードマネージャー.jpg](https://qiita-image-store.s3.amazonaws.com/0/99249/264e8ebf-4a4d-2413-6223-71a62ffb2f34.jpeg)

![ボードマネージャー_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/99249/94f2a581-cde8-a6b1-1274-2b13657d1c83.jpeg)


これで、MurataのLoRaWANチップ(CMWX1ZZABZ)を使ったボードの開発環境が整いました。
なお対応しているボードは

Tlera Corp
 [Grasshopper-L082CZ](https://www.tindie.com/products/TleraCorp/grasshopper-lorawan-development-board/)(*)
 Cricket-L082CZ
 Cicada-L082CZ

STMicroelectronics
 [B-L072Z-LRWAN1](https://www.st.com/ja/evaluation-tools/b-l072z-lrwan1.html)(**)
 P-NUCLEO-LRWAN1
 NUCLEO-L053R8
 NUCLEO-L073RZ
 です。(*)は検証に使ったボードです。

Arduino IDEの　[ツール] → [ボード] からこれらのボードを選択できるようになっているはずです。
![ボード選択.jpg](https://qiita-image-store.s3.amazonaws.com/0/99249/cc5d06bc-00a0-a89d-c8b8-ba87c4df87c3.jpeg)

ちなみに今回インストールしたソースファイルとサンプルファイルは
**C:\Users\ユーザー名\AppData\Local\Arduino15\packages\TleraCorp\hardware\stm32l0\0.0.5\libraries\LoRaWAN**
フォルダーに置かれています。

次回はこのサンプルプログラムを基にプログラムを組んでみます。
JavaScriptで0からnまでの配列を作成する

## やりかた

```js
Array.from({ length: 10 }).map((_, index) => 1 + index)
```

試しにブラウザで実行するとこんな感じになりました。

<img width="419" alt="スクリーンショット 2018-07-08 15.25.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/252304/3292732d-5da9-661f-6940-3681996a8f65.png">


## 参考

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/from
terminal起動時に command not found エラーが表示される

####ターミナル起動時に複数のcommand not foundが表示される
```
bash ~~ command not found
bash ~~ command not found
bash ~~ command not found
```
Linuxやvim関連の背景知識０からこの問題を解決するまでの手順。
ググって調べてみた結果、bash・ファイルパスというものが関係している模様。
元の原因がAWS Cloud9にrbenvを用いてrubyのインストールを実行したところエラーを吐きまくって、エラー対処の度にググって出てきた参考サイトを参考に

```
export PATH="$HOME/.rbenv/bin:$PATH"
```
など複数の謎の設定を追加してい際に何らかの不手際で、「.bash_profile」の内容を書き換えてしまったようです。


####起動時に読み込まれるファイル設定の編集
以下のコードをterminalに打ち込むことで、.bash_profileの編集画面に飛べます。

```
vi ~/.bash_profile
```
画面を開いたところで、rubyインストールの際に複数記述したファイルパス関連やエスケープキーを押さずに:q/:wといったvimコマンドを打った結果、ファイル起動時にコマンド扱いになってしまった残念なコードが記述されてました。

####.bash_profileを初期化

```
# .bash_profile
 
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi
 
# User specific environment and startup programs
```
上コードが.bash_profileの初期状態なのでデフォルトに戻してあげましょう。また、誤ってパスを消す際にbash_profileの

```
#Get the aliases and functions
```
以下を削除してしまった際の復元備忘録にもなります。

参考リンク
[bashが起動時に実行するファイル](http://www.itmedia.co.jp/enterprise/articles/0803/10/news012.html)
[初心者向け：command not foundを解決する方法](https://qiita.com/iwaseasahi/items/6e00883ccd0864ede17e#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%AE%9F%E8%A1%8C%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%A4%9C%E7%B4%A2)
[ユーザーの環境変数を設定するbashの設定ファイルと、カスタムプロンプトについて](https://oxynotes.com/?p=5418)
[MacでPATHを通す](https://qiita.com/nbkn/items/01a11392921119fa0153)
[How to exit the Vim editor?](https://stackoverflow.com/questions/11828270/how-to-exit-the-vim-editor)

#####AWS Cloud9にRubyインストール 2018/7/8現在
以下のリンク参照に手順通りに進めれば、rebnv/linuxbrew/homebrewなどを利用せずにAWS Cloud9に初期実装されているrvmを用いてRubyのインストールが可能です。その他のサイトでは環境や日付が違うものが多く、一つずつ試した結果今回のエントリーのようなバグが起こるか、ファイルパスが数十行になってしまう可能性があります。
最新版rubyをインストールしたのに

```
ec2-user:~/environment $ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
```
と表示されてしまう場合は

```
rvm  --default use ruby-2.6.0-preview2
```

と記述することで解決されます。
[How to update Ruby Version 2.0.0 to the latest version in Mac OSX Yosemite?](https://stackoverflow.com/questions/38194032/how-to-update-ruby-version-2-0-0-to-the-latest-version-in-mac-osx-yosemite)
Slack EmojiをまとめてexportするスクリプトをNode.jsで書いて、Chrome Extensionでまとめてimportする

もう腐るほどやり方はネットに落ちている、Slack Emojiのexport&importネタです。
例えば新しいSlack Workspaceを作成したときなどに、その他に参加しているSlack Workspaceに登録されているEmojiを、そこでも使いたいときなどに便利です。

## Slack Emojiをまとめてexportする

シンプルなスクリプトなので、Node.jsのバージョンなどの環境まわりの話は省略します。

### Nodeのプロジェクトを作成する

適当なディレクトリを作成して、その中で `npm init` します。

```bash
# プロジェクトのルートディレクトリを作成する
$ mkdir SlackEmojiExporter
# プロジェクトのルートディレクトリに移動する
$ cd SlackEmojiExporter
# Nodeのプロジェクトを作成する
$ npm init
```

### npmモジュールのインストール

以下の3つのモジュールをインストールします。

- [slack-node](https://www.npmjs.com/package/slack-node)
- [request](https://www.npmjs.com/package/request)
- [fs](https://www.npmjs.com/package/fs)

```bash
$ npm install --save slack-node
$ npm install --save request
$ npm install --save fs
```

### APITokenを生成する

以下のリンク先でEmojiをexportしたいSlack　WorkspaceのAPITokenを作成します。

[Legacy tokens \| Slack](https://api.slack.com/custom-integrations/legacy-tokens)

<img width="1247" alt="Legacy_tokens___Slack_.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/40e412af-57d8-ebf1-7156-89234987449e.png">

### スクリプトを書く

たとえば `slack-emoji-exporter.js` というファイルを作ります。

```javascript
const Slack = require('slack-node');
const request = require('request');
const fs = require('fs');

apiToken = "<APIToken>"; // <- ここに生成したAPITokenを入力する
slack = new Slack(apiToken);

slack.api("emoji.list", function (err, response) {
    for(key in response.emoji){
        url = response.emoji[key];
        //エイリアスは無視
        if(url.match(/alias/)){
            continue;
        }
        request
        .get(url)
        .on('response', function (res) {
        })
        .pipe(fs.createWriteStream(key + '.png'));
    }
});
```

### スクリプトを実行してEmojiを保存する

たとえば今のプロジェクトルートで先ほど書いたスクリプトを実行すると、直接画像ファイルが流れてきてしまうので、　 `images` ディレクトリを作成してその中でスクリプトを実行します。

```bash
$ mkdir images
```

- node_modules
- package-lock.json
- package.json
- slack-emoji-exporter.js
- images

```bash
$ cd images
$ node ../slack-emoji-exporter.js
```

すると、以下のように画像ファイルがダウンロードされるでしょう。
これでEmojiをまとめてexportできました。

<img width="651" alt="スクリーンショット 2018-07-08 15.10.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/6bc6fdba-b8d2-1f5a-454f-96f91e109104.png">

## Slack Emojiをまとめてimportする

### Chrome Extensionをインストールする

以下のChrome Extensionをインストールすると、SlackのEmoji追加するところにUIが追加され、ドラッグ&ドロップで画像をまとめてimportできるようになります。

[Neutral Face Emoji Tools \- Chrome ウェブストア](https://chrome.google.com/webstore/detail/neutral-face-emoji-tools/anchoacphlfbdomdlomnbbfhcmcdmjej)

### Emojiをまとめてimportする

以下の画像の手順で `Customize Slack` を開きます。

<img width="398" alt="Slack_-_AKIBA_swift.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/a0f43a0e-428f-9311-0e03-084fa465f6e3.png">


するとEmojiを追加するウェブが開くので、そこのBulk Emoji Uploaderにドラッグ&ドロップで画像ファイルをまとめて複数登録することができます。

<img width="886" alt="スクリーンショット 2018-07-08 15.17.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/46597/7672fc74-4de3-61a2-337b-000cb8fde828.png">

## 参考
- [Slackのカスタム絵文字を全てダウンロードする \- Qiita](https://qiita.com/kure/items/7938d92532bb7577d8b8)
- [Slackの絵文字\(emoji\)を一括エクスポート＆インポートする \- Qiita](https://qiita.com/ne-peer/items/cbdef4f02b1bb6103e51)
Colaboratory使ったら、環境構築いらない

適当な機械学習の本を使って勉強を始めたのですが、`Colaboratory`を使ったところ、環境構築がひとつもいらず、驚きすぎたので記事を書きます。
pythonもjupyter-notebookも機械学習もさっき初めて見たチンパンジーが書いた記事ですので、嘘が書いてあるかもしれません。

# 環境構築不要

* jupyter-notebookが使える環境が一瞬で手に入る
* 単純にどこかのLinux上に構築されたjupyter-notebookの環境にリモートで接続しているだけなので、ファイルのダウンロード処理なんかも動く
* どうやら、90分、12時間ルールというのがあるらしいけど、その場で試す分には十分すぎる
* まだ試してないけど、Google Driveがマウントできるので、↑のルールはほぼ無視していいんじゃない？
* スマホのブラウザから見れたので、PCで書いて、スマホから後から見て理解する、みたいなこともできそう
* GPUも使わせてくれるらしいので、自分のPC上に環境構築する方が時間の無駄という説すらある

# 使い方

* Googleアカウント使って開くくらいしかすることない。

# その他

* jupyter-notebookってすごい
Vue Nuxt Firebaseでプロジェクトを始める

# Nuxt
## Vue Cliを使ってNuxtのプロジェクトを作成
[参考](https://ja.nuxtjs.org/)

```
$ vue init nuxt-community/starter-template <project-name>
$ cd <project-name>
$ npm install
$ npm run dev
```

![nuxt project.png](https://qiita-image-store.s3.amazonaws.com/0/144543/6e0af0f5-d324-75a7-8e96-d5d67972f5fd.png)

[localhost:3000](localhost:3000)にアクセスして以下の画面を表示

## FireBaseプロダクトの作成

[Firebase console](https://console.firebase.google.com/)に行き、プロジェクトの作成。
![Firebase console.png](https://qiita-image-store.s3.amazonaws.com/0/144543/133f7a6d-2383-e4f7-d97a-e39737dedc49.png)


プロジェクト名とリージョンを選択します。
この時に生成される _プロジェクトID_がaliasとなっています。
この後のfirebase initでプロジェクトIDを選択するので確認しといてください。
![Firebase console (1).png](https://qiita-image-store.s3.amazonaws.com/0/144543/1f0ab264-749f-74fa-c984-2c5a12ab07ca.png)


## FireBaseの設定

```
$ npm install -g firebase-tools
$ firebase --version # 3.19.3 2018.07.08現在
$ cd <project-name>
$ firebase init # とりあえずhostingの設定
```

今回の設定では、hostingだけ使うので
\> ◯ Hostingで SpaceをおしてEnter

```
 ◯ Database: Deploy Firebase Realtime Database Rules
 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
>◯ Hosting: Configure and deploy Firebase Hosting sites
 ◯ Storage: Deploy Cloud Storage security rules
```

nuxtの設定でdistファイルが生成されているため、distを入力

```
 ? What do you want to use as your public directory? (public) dist
```

## Firebase Hostingを使ってdeploy

```
$ npm run generate
$ firebase deploy
```

最後にurlが表示されるため、そのurlを開き以下が表示されればHosting完了。

![nuxt project.png](https://qiita-image-store.s3.amazonaws.com/0/144543/756bd399-3e2b-cefd-4865-99312f808eea.png)

##### 備考

上記に付随してshellファイルを作成
- setup.sh
- firebase-hosting.sh

###### setup.sh

```
$ cd <project_path>
$ touch setup.sh
$ chmod 777 setup.sh
```

```setup.sh
#bin/bash

rm -Rf node_modules
npm install
```
###### firebase-hosting.sh

```
$ cd <project_path>
$ touch firebase-hosting.sh
$ chmod 777 firebase-hosting.sh
```

```firebase-hosting.sh
#bin/bash

npm run generate
firebase deploy
```

できたファイル群(-L 1)

```
.
├── README.md
├── assets
├── components
├── database.rules.json
├── dist
├── firebase-hosting.sh
├── firebase.json
├── layouts
├── middleware
├── node_modules
├── nuxt.config.js
├── package-lock.json
├── package.json
├── pages
├── plugins
├── public
├── setup.sh
├── static
└── store
```
C++/OpenSiv3D で 10 行ライフゲーム 

OpenSiv3Dでライフゲームを 10 LOC で書く方法
![20180708-145419-291.png](https://qiita-image-store.s3.amazonaws.com/0/34295/7ef5998e-0a4c-2e45-ee3a-d23082bdb71a.png)


```cpp:Main
# include <Siv3D.hpp> // OpenSiv3D v0.2.7

void Main()
{
	Image i(Window::Size(), Arg::generator = []() { return Color(0, 0, Random(0, 1)); });
	DynamicTexture t(i);
	Array<Point> n = { { { -1,-1 },{ 0, -1 },{ 1, -1 },{ -1, 0 },{ 1,0 },{ -1, 1 },{ 0, 1 },{ 1,1 } } };

	while (System::Update())
	{
		for (auto p : step(Point(1, 1), i.size() - Point(2, 2)))
			i[p].r = (6152 >> i[p].b * 9 + n.count_if([&](auto v) { return i[p + v].b; })) & 1;

		t.fill(i.forEach([](auto& c) { c = c.r ? Color(0, 255, 1) : Color(0); }));
		t.draw();
	}
}
```
メタプログラミングruby 6章まとめ

## bindingオブジェクト
bindingはスコープをオブジェクトにまとめたもの。bindingを使って、ローカルスコープを所得すれば、そのスコープを持ち回すことができる。

```ruby:sample.rb
class MyClass
  def my_method
    @x = 1
    binding
  end
end 

b = MyClass.new.my_method
eval "@x" b # => 1
```

##フックメソッド
reactでイベントを継承して、クラスを定義したりするように、rubyでも、クラスが継承されたときや、moduleがミックスインされたときに、コードを実行することができる。

```ruby:sample.rb
class String
  def self.inherited(subclass)
    puts "#{self}は#{subclass}に継承された。"
  end
end

class MyString < String; end
=> "StringはMyStringに継承された。"
```
inheritedの他にもincludedやprepended,extendedなどがある。
C++でのsubstrのサンプル

C++でsubstrのサンプルを見るとマジックナンバー使うのが当たり前みたいに感じてしまうけど、現場でそれやられると辛いです。書いてて辛くないのでしょうか。

私は間違えそうなので、文字数なんて数えたくないです。
ということで、下記のような数えないサンプルを考えて見ました。

```c++:main.cpp
// #include <string.h>
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
  const string sample = "20180707_000001_param0_param12345";

  // よくあるサンプル
  string sub = sample.substr(16, 6);
  cout << sub << endl;

  // 位置、サイズを人間が数えないサンプル
  const string date_part = "YYYYMMDD";
  const string id_part = "IDXXXX";
  const string param0_part = "PARAM0";
  const string param1_part = "PARAM1XXXX";

  string pre_str = "";

  string date = sample.substr(pre_str.size(), date_part.size());
  // 下記のようにsubstrの中で埋め込んだほうが読みやすいかも。
  // string date = sample.substr(pre_str.size(), string("YYYYMMDD").size());
  // string date = sample.substr(pre_str.size(), strlen("YYYYMMDD"));
  pre_str += (date + "_");

  string id = sample.substr(pre_str.size(), id_part.size());
  pre_str += (id + "_");

  string param0 = sample.substr(pre_str.size(), param0_part.size());
  pre_str += (param0 + "_");

  string param1 = sample.substr(pre_str.size(), param1_part.size());

  cout << date << ", " << id << ", " << param0 << ", " << param1 << endl;

  return 0;
}
```

マジックナンバーのサンプルの量が多すぎて焼け石に水ですが、
少しでもそんなコードを減らせればと思います。
にかいどーIoTびぼうろく H30.7.8

#ミッション：タイマーによる電源のオンオフができるポンプを創れ！
ギルドマスター「よお新入り。よく来たな。最近老眼でアナログタイマーの細かい数字がセットできなくなった老人がいるんだ。そこでデジタルタイマーを創って入力をしやすくしてやってくれ。設定された時間が経過したら潅水ポンプのオンオフできる装置だ。報酬は現地の人の信頼だ。新人りにはちょうどいい仕事だろう。しっかりやんな。」


#課題達成のための方向性
現在考えているのは、

1.まず依頼者の使っている潅水ポンプはAC100Vによる電気式である。
2.ゆえに電源コンセントを制御すれば良い。
3.RaspberryPiで制御できるACコンセントを作成し、間接的に潅水ポンプの電源を制御する。
4.テンキー等外部入力装置から数字をRaspberryPiに入力し、その時間をトリガーに電源をオンオフにする。
5.入力された時間をトリガーに電源制御させるのはPythonで行う。

こんなところである。
おそらく大丈夫であろう。たぶん。

#課題達成に必要そうなもの

・RaspberryPi一式
・入力に必要なLinuxで使える安いテンキー
・確認のために画面出力に必要な安い液晶画面
・RaspberryPiで制御できるACコンセント

おそらくこれだけあれば創れるのではないか。
数字だけ読めればいいので、テンキーに液晶画面がついているのが望ましい。
またRaspberryPiで制御できるACコンセントはどうも売っていないようなのでこれは自作する必要があるようだ。
この自作のために

・ソリッドステートリレー
・延長コード
・ヒューズ

あたりも買わねばなるまい。
RaspberryPi制御できるコンセントは今後何度も創ることになりそうだが、どこかの電気屋さんで売ってくれないだろうか。
材料費は1,000円くらいだが、完成品4,000円でも私は買う。

#山を動かす者もまずは小石から始める
まずはPythonの基本を覚えて慣れることである。
最初の目標は外部入力された数字をトリガーに何か文字を表示させる感じのタイマーである。
Twilio Functionsを使って、YuMake気象情報APIのデータを取得する

#はじめに
[YuMake合同会社](https://www.yumake.jp/)では、ハッカソンやアプリコンテストなど、多くのイベントへAPI協賛を行っています。また、株式会社KDDI Web Communicationsでは、[Twilio](https://twilio.kddi-web.com/)という電話APIを提供し、同様に多くのイベントへ協賛しています。Twilioには、Twilio APIおよび、その他のAPIとの連携を容易にするためのnode.js環境「Twilio Functions」が準備されています。今回は、Twilio Functions上でYuMake気象情報APIにアクセスし、データを取得するサンプルを掲載します。気象データとTwilioを連携する場合などの参考にお使いください。

#Twilio Functionsの作成
Twilio Functionsの作成は、[こちら](https://qiita.com/mobilebiz/items/c5e31f1a0cd492373856)の記事が参考になります。記事と同様にして、Functionを作成します。テンプレートはBlankを選択し、pathはYuMakeと分かるように「/yumake」などと入力します。以下は、現在地の天気を取得する場合のサンプルです。

```Function.js
const https = require('https');

exports.handler = function(context, event, callback) {
    const HOST = '*********';     // YuMake APIへのURLを入力します
    const LAT = '34.692800';      // 必要に応じてconstでパラメータを設定してください（これは位置情報ベースでアクセスする場合です）
    const LON = '135.700537';
    const APIKEY = '********';    // API KEYを設定してください

    // 仕様書に則ってリクエストを書きます
    let result = {};
    const req = https.request(`https://${HOST}?lat=${LAT}&lon=${LON}&key=${APIKEY}`, (res) => {
        res.on('data', (chunk) => {
            result = JSON.parse(chunk);
        });
        res.on('end', () => {
            console.log(`Aさんはいま、天気が ${result.weather} のところにいるようです。さあ、どこでしょうか！？`);
            callback(null, result);
        });
    });

    req.on('error', (e) => {
      console.error(`problem with request: ${e.message}`);
      callback(e.message);
    });

    req.end();

};
```

取得した他のデータと合わせて、ぜひ気象と別な情報の面白い組み合わせを考えてみてくださいね。
YuMake気象情報APIについては、[コチラ](https://www.yumake.jp/api/weather-api)を参照してください。
MVCの深淵

#MVCとは何か

　これに関して、そこら中で議論が起こる。[Wiki](https://ja.wikipedia.org/wiki/Model_View_Controller)をみるとTrygve Reenskaug氏が考案したと書かれている。定義した人間以外が黒と言えば黒だし、白といえば白なのだ。MVCとはもしかしたら、一人一人の心の中にあるのかも知れない。今回はこのMVCに対して、自分なりの解釈を書いていきたいと思う。

　まずは基本的なことを確認してみる

|項目              |内容 |
|:---------------:|---|
|<b>Model</b>     | アプリケーションの振る舞い、あらゆるデータやロジックの処理|
|<b>View</b>      |視覚的な部分|
|<b>Controller</b>|ユーザ入力|

　では、これを元に図を作ってみたい。

#深淵への案内、MVCを図にしてみた



##　　1. MVCで間違った例として叩きのめされる例

![01 MVCの間違った例.png](https://qiita-image-store.s3.amazonaws.com/0/267629/f2e616f5-fdb4-1520-0ad9-0cba635acb78.png)

　コントローラがサーバにあるので、ユーザはどうやってコントロールすれば良いのか分からない例である。



##　　2. MVCでユーザがコントローラに触れられる例
![02 MVCその1.png](https://qiita-image-store.s3.amazonaws.com/0/267629/9cb60214-8b36-ac10-f83e-d79d7912e8c5.png)

　ビューに操作オブジェクトがある場合と、単純にキーボードやマウスの状態を拾うことを考慮する例である。しかしよく考えるとおかしい。たとえばキーボードから入力した文字を画面に表示しているのは誰なのだろう？



##　　3. お前、実はそこにいたんだという例
![02 MVCその2.png](https://qiita-image-store.s3.amazonaws.com/0/267629/d97b0aad-27dc-e41c-2539-3f4e4be2a082.png)

　人間の認識ではビューとコントローラが同じ場所にいるように見えるが、モデルからみれば全く別物である。実はモデルがあなたの背後をとり、気づかれずに入力したモノを対象となる位置に表示する指示を出しているに過ぎない。JavaScriptを使っていない場合でもそれは変わらないのだ。



##　　4. いや、人間の手はブラウザに触れないだろ突っ込みを入れる例
![02 MVCその3.png](https://qiita-image-store.s3.amazonaws.com/0/267629/caf819ea-f157-a826-c519-1a451baceed6.png)

　「なんか視点が変わってない？」と誰しも突っ込みを入れたくなるところだろう。昔のアニメで、主人公がディスプレイに吸い込まれる描写を見たことがある。「いや、吸い込むならキーボードからだろ！」と私も突っ込みを入れたことがある。まったく見当外れな突っ込みなのは気にしてはいけない。さらに、今のディスプレイにはタッチパネルの機能もあるという突っ込みの応酬が起きそうだが、出力装置の上に入力装置をのっけただけで、結局は出力部分から入力できるわけでは無いのだ。突っ込むのは、狭いところを目指して突撃する猫だけで良い。

　そもそもビューとはどのように表示するのか、色や形、大きさの最終情報を持っているらしい。Webブラウザは本当にその情報を持っているか？いや違う。ディスプレイに表示されるまでは、本当のサイズなど誰にも分からない。



##　　5. 本当にそれでいいのか？答えはノウだ！
![02 MVCその4.png](https://qiita-image-store.s3.amazonaws.com/0/267629/bcdffda6-0f5c-47b7-0cda-605602bc1b29.png)


　脳である。まず視覚情報について考えるが、ディスプレイに表示されたからと言って、それが最終情報だろうか？いや、人間は東京タワーを見て、赤という人もいればオレンジという人もいる。正解はインターナショナルオレンジだ。つまり人間によって最終情報は異なるのだ。

　そして人間の入力である。キーボードやマウス、それを操作する手は一定のプロトコルで動く通信経路の一部として考えることは出来ないだろうか。実はそのスイッチを入れているのは、脳なのである。



##　　6. それは本当に自分なのか？

![02 MVCその5.png](https://qiita-image-store.s3.amazonaws.com/0/267629/37337d01-1900-0735-5314-d9d94c9c49f3.png)

　人間が本当に人間の意思で動いているのだろうか？なにか別の意思の介在を感じることは無いだろうか？考えれば考えるほど、深みにはまっていく。まるで深淵を覗き込んだかのようだ。



#つまり言いたいこと

　冗談です。
Xcodeのビルドとテストの成功・失敗時に音を出す

Xcode玄人の方はもう既知も既知な機能だと思いますが、 `Xcode > Preferences > Behaviors` のあたりで設定できます。

![スクリーンショット_2018-07-06_17_12_47.png](https://qiita-image-store.s3.amazonaws.com/0/46597/b3ee9b3c-a565-dac7-bd3b-0fc70ee09d4a.png)

真面目な話をすると、Swiftのビルドは遅いのでビルドの最中に他のことをしがちです。
他のことをして、気づいたらビルドしてることを忘れがちなんですが、音を流すようにするとコンテキストスイッチの切り替えになって元の作業に戻りやすくなるので、オススメです。

## ビルドの成功・失敗時の設定

`Xcode > Preferences > Behaviors > Build > Succeeds/Fails > Play sound`

## テストの成功・失敗時の設定

`Xcode > Preferences > Behaviors > Testing > Succeeds/Fails > Play sound`
C言語でTOMLファイルを読み込むプログラムを作ってみた

# きっかけ
Rust の学習中に TOMLファイル形式に出会いました。
最初は「iniファイルにそっくりだなー」って印象しかなかったけれど、改めて考えてみると記述されている内容が読みやすいということを理解できました。
以下は設定例です。

```
[owner]
name = "Tom Preston-Werner"
dob = 1979-05-27T07:32:00-08:00 # First class dates

[database]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ]
connection_max = 5000
enabled = true
```

設定情報が [ ] で囲まれた名称で段落で纏められているのがイメージできると思います。
json形式の代替と考えられていますが、実際は完全に置き換えるのではなく、使い分けかなと思います（jsonはデータ構造の表現に優れていると思います）
C言語では XML／jsonではなく、ini／confファイルを使うのが通例ですが、配列表現など不適であり、自分はこれからはTOMLを使おうと実装してみました。

# 開発環境
GitHubに[ソースファイル](https://github.com/zoppa-software/Toml-Parser-By-C)を公開しています。
Windows、Visual Studio 2017で開発しているため環境依存な部分も許容しています。
例えば、

 - mallocは失敗したらアプリケーションがアボートします
 - メモリの使用量は大目に使えるとして実装しています
 - リトルエンディアンを前提にしています



# TOMLは面白いなー
設定ファイル記述向けとして必要とされているためか面白い記述方法がありますね。

```
str1 = "The quick brown fox jumps over the lazy dog."

str3 = """\
       The quick brown \
       fox jumps over \
       the lazy dog.\
       """
```

上記の str1 と str2 は同じ値になります \ が次の空白、改行以外の文字を見つけれまで読み飛ばすという仕様があるため不要な空白を無くしてくれます。
XMLで改行を含む文字列を使用する場合、エスケープ文字を使わない場合ネストが崩れてしまいますが、可読性を損ねずシンプルに文字列を表現できていると思います。

また、数値の区切りに _ が使用できること。

```
int5 = 1_000
int6 = 5_349_221
```

これも設定ファイルの読みやすさを支える機能でしょう。

しばらく C言語でアルゴリズムを記述する機会はないと思いますが、使う機会を楽しみにしています。
にかいどーIoTびぼうろく

#人間は進化しない　技術は進歩はする
技術の進歩は凄いものだ。
ムーアの法則よろしく、20年前のスパコン程度なら手のひらサイズで収まるくらい進歩した。
たまにもう新しいものを新たに開発しても人間が役に立つものはないという人がいるが、私は嘘だと思っている。
このような進歩した小さいPCを既存のものをさらに生産性を上げることに使えるはずだ、と。
いや私は技術者でもなんでもないズブの素人なので勝手にそう思ってるだけなのだが。
だが思うだけでは何も考えていないのと同じだ。
何かしら行動を起こさねばならない。
私の場合このように考えたときに何を起こすかは場合によって違うのだが、今回は自分で技術を覚えて自分でIoT関連を創ることにしようと決意した。
幸いにして、twitterで所属しているクラスター、主にCivilizationクラスターとParadoxクラスターであるが、フォロワーにIT技術者も多く、私が困ったときにアドバイスをくれる優秀な人も多い。
彼らに対する感謝は今後私のように素人がIoTをやってみようと思う人のためにログとして残し、後人が同じところで引っ掛からないようにするように道を整備することこそが最大の礼となろう。
Qiitaはそのために投稿することとなる。

#更新する内容
基本的にIoT全般であるが、特に RaspberryPi と Python に関してが多くなると思われる。
どちらも完全なる素人であるが、これから覚えればいいだけの話だ。
やる気があればなんでもできるとはよく言ったものである。
またQiitaの使い方はまだほとんどわかっていないが、いくつかの記事をざっと見た限り、
創るものが完成してから引っかかったところや思ったことを書いているようだ。
だが私はそのような使い方をせずある程度思うことがまとまった時点で投稿しようかと思う。
アドバイス出す側としても今何を考えているのかがわかったほうがエラーを指摘しやすいであろう。
指摘しやすい、されやすい環境を創るのは義務である。
何より後人が同じ轍を踏まないようするには先人がどのようにしてエラーを犯したかを実際に見せるのが一番だ。
あいつあんなアホなことしてるよとバッカだなーとニヤニヤしてもらいたい。

#投稿日
これは自分に対する縛りとして、特別なことがない限り毎週日曜日は更新日にする。
私は極度の怠け者なので、このような縛りをいれておかないと、サボってやらないからだ。
また日曜日以外も思うことがあり次第投稿する。

#明日はよりよくなっているであろう
I am the future.
Macに最新版node.jsのインストール[nodebrew]

## 概要
Macにnode.jsをインストールした際の手順を載せます。

## 動作環境
- MacOS High Sierra (バージョン10.13.4)
- Homebrew 1.6.9

## インストールの手順
1. nodebrewのインストール
2. ディレクトリの作成
3. nodeのインストール
4. PATHの設定

## 1. nodebrewのインストール
nodeのバージョン管理ツールであるnodebrewをインストールします。


```bash:~
$ brew install nodebrew

$ nodebrew -v
nodebrew 1.0.0
```

nodebrewを使えば、プロジェクトごとにnodeのバージョンを変更することができるので便利です。

## 2. ディレクトリの作成
ホームディレクトリ以下に、隠しファイル.nodebrew/srcを生成します。

```bash:~
mkdir -p ~/.nodebrew/src
```
-pオプションは、途中に現在存在していないディレクトリがある場合、そのディレクトリも生成するという意味です。

## 3. nodeのインストール
nodebrewを使って最新版のnodeをインスールしていきます。

```bash:~
nodebrew install-binary latest
```

現在インストールしたnodeの一覧です。まだ、最新版だけしかインストールしていないことがわかります。

```bash:~
$ nodebrew list
v10.6.0

current: none
```

最新版を使用するので、以下のようにコマンドを叩きます。

```bash:~
$ nodebrew use v10.6.0
use v10.6.0

$ nodebrew list
v10.6.0

current: v10.6.0
```
現在の設定で、最新版のnodeに切り替えられたことがわかります。

## 4. PATHの設定
```bash:~
echo 'export PATH=$PATH:/Users/***/.nodebrew/current/bin' >> ~/.bash_profile  #***にはPCのユーザー名を記入
```

ホームディレクトリ下の~/.bash_profileに上記の設定を書き込みます。

```bash:~
source ~/.bash_profile
$ node -v
v10.6.0
```
.bash_profileに書いた設定を読み込み、node最新版へ切り替えが完了しました。
selfについて（影薄く感じてたけど案外濃い）

#あまり影の濃くないself

Railsをいじると、あまりselfを使う機会がないので意識することが少ないですが、selfについてまとめます。
rubyを少しやると、ああ〜重要やわ〜と思います。


#selfはインスタンス自身のこと

selfはインスタンスそのもののことを指します。

インスタンスってなんやねんという方は、一応自分なりにまとめましたので
ご覧いただければ幸いです。

[クラスとインスタンスがなんとなくわかったのでメモ](https://qiita.com/tomoharutsutsumi/items/4458ed7e6e9cd1e1cecf)

なので、インスタンスメソッドとかもこのselfになら使えます。


```ruby.rb

class Myclass

  def insert(item)
    @hoge = item
  end

  def add
    @added_hoge = "私の名前は#{@hoge}です。"
  end

  def show
   puts @added_hoge
  end

end


myclass = Myclass.new
myclass.insert("ttm")
myclass.add
myclass.show

#=> 私の名前はttmです。
```

こんな感じのclassがある時、普通に動くのですが、
メソッドチェインやり始めると下のようなエラーになります。

```ruby.rb

class Myclass

  def insert(item)
    @hoge = item
  end

  def add
    @added_hoge = "私の名前は#{@hoge}です。"
  end

  def show
   puts @added_hoge
  end

end


myclass = Myclass.new
myclass.insert("ttm")
myclass.add.show

#=> undefined method `show' for "私の名前はttmです。":String (NoMethodError)

```

となります。

#原因はaddメソッドの返り値が文字列だから

```ruby.rb

class Myclass

  def insert(item)
    @hoge = item
  end

  def add
    @added_hoge = "私の名前は#{@hoge}です。"
  end

  def show
   puts @added_hoge
  end

end


myclass = Myclass.new
myclass.insert("ttm")
puts myclass.add

#=> 私の名前はttmです。
```

試しにaddメソッド後の返り値を見てみると、『私の名前はttmです』となっています。
これはstringですので、それに対して、インスタンスメソッドであるshowをつけることができないのです。
と困ったところで、selfの出番です。


#返り値をインスタンスにしてあげる


```ruby.rb

class Myclass

  def insert(item)
    @hoge = item
  end

  def add
    @added_hoge = "私の名前は#{@hoge}です。"
    self
  end

  def show
   puts @added_hoge
  end

end


myclass = Myclass.new
myclass.insert("ttm")
puts myclass.add

#=>#<Myclass:0x007fd2d181e948>


```

addメソッドの中に返り値でselfを追加しました。そうすると、myclass.addの中身はMyclass:0x007fd2d181e948になりました。これはインスタンスです。
インスタンスになら、インスタンスメソッドであるshowは使うことができます。
つまり。。。

```ruby.rb

class Myclass

  def insert(item)
    @hoge = item
  end

  def add
    @added_hoge = "私の名前は#{@hoge}です。"
    self
  end

  def show
   puts @added_hoge
  end

end


myclass = Myclass.new
myclass.insert("ttm")
myclass.add.show

#=> 私の名前はttmです。
```

となります。

Railsでは自動でselfを割り当ててくれるので、あまりこの辺りを考えずとも実装可能ですが、
きちんと裏で何が動いているのかを理解することは大切だと思うので書いてみました。

間違い等指摘がありましたら、お教えください！
Let's encrypt 環境の運用

Let's encrypt による HTTPS サーバの構築/運用めも。

```shell-session
$ nginx -v
nginx version: nginx/1.10.3 (Ubuntu)
$ more /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.4 LTS"
$ openssl version
OpenSSL 1.0.2g  1 Mar 2016
```


# パッケージのインストール

```shell-session
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install python-certbot-nginx 
```
参考: https://certbot.eff.org/lets-encrypt/ubuntuxenial-nginx.html

# 証明書の取得

以下のシェルスクリプトを実行する。

```shell:letsencrypt.sh
#!/bin/sh

DOMAIN=www.example.com
EMAIL=foo@example.com
certbot certonly --nginx -m $EMAIL --agree-tos --non-interactive -d $DOMAIN
```

```shell-session
$ sudo ./letsencrypt.sh
```

参考:https://qiita.com/tkykmw/items/9b6ba55bb2a6a5d90963

# nginx の設定

```nginx:/etc/nginx/conf.d/https.conf
server {
	listen 443 default ssl;
	ssl on;
	ssl_certificate /etc/letsencrypt/live/(ドメイン名)/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/(ドメイン名)/privkey.pem;
	ssl_dhparam /etc/nginx/dhparam.pem;
	ssl_prefer_server_ciphers on;
	ssl_session_cache  shared:SSL:10m;
	ssl_session_timeout  10m;
	ssl_protocols TLSv1.2;
	ssl_ciphers 'HIGH !aNULL !eNULL !RSA';
	add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
}
```

```shell-session
$ openssl dhparam 4096 -out dhparam.pem
$ sudo mv dhparam.pem /etc/nginx/
$ sudo chown root:root /etc/nginx/dhparam.pem
$ sudo service nginx restart
```

- TLS1.0/1.1 は切ってみた。PCI DSS で非推奨になったので。
- RSA 鍵交換は無効化
- HSTS 対応

参考: https://www.saintsouth.net/blog/safety-of-ssl-certificate-setting-improvements-in-web-server-nginx-to-get-rankaplus-from-ssl-server-test

# 証明書の更新

cron で毎週 certbot を実行する。

```shell:/etc/cron.d/letsencrypt
# run at 1:14 am every monday
1 2 * * 1   root    /usr/bin/certbot renew -q --no-self-upgrade --post-hook "service nginx restart"
```
Ruby初心者課題 繰り返し処理

***課題を解いて学んだことを書いていきます***:no_mouth:


Q　ターミナルに、1~10を順に表示してください。
　　ただし、5のみ表示させないでください。

解答↓

```ruby:qiita.rb
num=0
while num<10 do
	num+=1
	next if num==5
	
	puts num
end

```
繰り返しの処理を行ってくれるwhile構文を使う


```ruby:qiita.rb
while 条件式 do
〜処理〜
end
```

条件式を実行した結果がtrueであれば、do ～ end を繰り返し実行しますが、falseであれば、繰り返しの最後になり、繰り返しを抜け、終了します。

while構文を使うと今回の場合num<10と定義しているので1~10の値がターミナルに表示されます。
ですが、5を表示しないという問題も課されているので5をスキップするために使うのが**next**です。

**next**は指定の回数の時だけ繰り返しをスキップしたい時に使用します。
スキップした後は、whileの次の回から繰り返し処理が継続されます。

```ruby:qiita.rb
next if num==5
```
(もしnumが５だったらスキップ処理をしてください。って感じでかきました。）


##ついでに
今回使ったnextと同じ要領で使えるbreakというものがあります。
breakは、繰り返し処理を中断し繰り返しを抜けて終了するために使用します。

```ruby:qiita.rb
num=0
while num<10 do
	num+=1
	break if num==5

	puts num
end

```
（numが5の回数の時、繰り返しを抜けて中断して、終了処理をしてください。って感じです。）

この時ターミナルには1~4の数字が表示されている。
Adminerで「不正なCSRFトークン。再送信してください」と言われる時のチェックリスト

英語だと `Invalid CSRF token. Send the form again. If you did not send this request from Adminer then close this page.` というやつ。

# 1. サーバーがsessionを保存しているディレクトリにアクセスできるか

例えば

```php.ini
session.save_path = "/var/lib/php/sessions"
```

としているならば、このディレクトリの所有権・アクセス権を確認する。
（Apacheやnginxがアクセスできるかどうか。）

# 2. session.save_handlerを設定

```php.ini
session.save_handler = files
```

になっていないとAdminerはデータの追加・編集ができない。

# 3. セッションファイルを消してみる

`1.` で権限を確認したディレクトリ `/var/lib/php/sessions` 内にあるファイルをリネームするなどして読まれないようにする。
LaravelのクエリビルダとEloquentのメソッド分類

LaravelのクエリビルダのメソッドとEloquentのメソッドを分類したかったので自分用メモ

# クエリビルダのメソッド
## 取得
- get()
- first()
- firstOrFail()
- value()
- pluck()
- chunk()
- count()
- max()
- min()
- ave()
- sum()
- select()

## 生のSQLを実行
- raw()
- selectRaw()
- whereRaw()
- orWhereRaw()
- havingRaw()
- orHavingRaw()
- orderByRaw()

## 結合
- join()
- leftJoin()
- crossJoin()
- union()

## 条件指定
- where()
- orWhere()
- whereBetween()
- whereNotBetween()
- whereIn()
- whereNotIn()
- whereNull()
- whereNotNull()
- whereDate()
- whereMonth()
- whereDay()
- whereYear()
- whereTime()
- whereColumn()
- whereExists()

## 順序、グループ分け、制限、オフセット
- orderBy()
- latest()
- oldest()
- inRandomOrder()
- groupBy()
- having()
- skip()
- take()

## 条件節
- when()

## 挿入
- insert()
- insertGetId()

## 更新
- update()
- increment()
- decrement()

## 削除
- delete()
- truncate()

# Eloquentのメソッド
## 取得
- all()
- find()
- findOrFail()
- chunk()

## 条件指定
- where()

## 更新
- save()

## 挿入
- create()
- firstOrCreate()
- firstOrNew()

## 更新または挿入
- updateOrCreate()

## 削除
- delete()


その他にもメソッドはあるが、大体はこんな感じということで以上。
Gazeboのサンプルでロボットが表示されなかった

# Gazeboとは

ODE(Open Dynamics Engine)などの物理エンジンを使ってロボットシミュレーションできる環境。ROSにデフォルトで入ってる。
インストール方法はROSの[公式](http://wiki.ros.org/kinetic/Installation/Ubuntu)を参照。Ubuntu14系ならROS Indigo、16系ならROS Kineticが良いらしいので注意。僕は16.04だったのでKinetic。
それから、UbuntuデフォルトのPythonと相性があるらしくて、pyenvなら`pyenv global system`でデフォルトに戻しておいた方が良さそう。(?)

# Sampleを動かそうとしたところ

サンプルとしてRRBotという2軸ロボットのデータを動かしてみる。
[参考1](http://cir-kit.github.io/blog/2015/02/17/gazebo-urdf-in-gazebo/)
[参考2](http://products.rt-net.jp/micromouse/archives/3262)
どっちも[Gazeboのチュートリアル](http://gazebosim.org/tutorials/?tut=ros_urdf#Tutorial:UsingaURDFinGazebo)に沿ってるのでほぼ同じ手順。
モデルダウンロード

```bash
cd ~/catkin_ws/src/
git clone https://github.com/ros-simulation/gazebo_ros_demos.git
cd ..
catkin_make
```

ROSで表示&関節動かせる

```bash
roslaunch rrbot_description rrbot_rviz.launch
```

Gazeboで表示&シミュレーション

```bash
roslaunch rrbot_gazebo rrbot_world.launch
```

ところがここで、Gazeboでロボットが表示されない(読み込みエラー)という問題が生じた。
エラーはこんな感じ。

```
IOError: [Errno 13] Permission denied: '/home/oginom/.ros/rosdep/sources.cache/index'
[urdf_spawner-4] process has died [pid 3743, exit code 1, cmd /opt/ros/kinetic/lib/gazebo_ros/spawn_model -urdf -model rrbot -param robot_description __name:=urdf_spawner __log:=/home/oginom/.ros/log/dd9eb0e6-8257-11e8-b2e9-e8b1fce8910d/urdf_spawner-4.log].
log file: /home/oginom/.ros/log/dd9eb0e6-8257-11e8-b2e9-e8b1fce8910d/urdf_spawner-4*.log
```

![Screenshot from 2018-07-08 12-50-38.png](https://qiita-image-store.s3.amazonaws.com/0/257749/0e8aca17-7bea-bd89-d882-4376cce5cb1e.png)

# 解決

とりあえずググったところ、[同じエラー](https://answers.ros.org/question/281477/ioerror-errno-13-permission-denied-rosrosdepsourcescacheindex/)発見。

```bash
sudo rosdep init
rosdep update
```

を実行してみましょう、と書いてある。
initの方はすでにされてます、て言われて、updateの方をしたところ、

```
Failed to write cache file: [Errno 13] Permission denied: '/home/ogi/.ros/rosdep/source
s.cache/a4b3c8956ab7a3e6d293ba33b57fac42799e69e6.pickle.tmp.VWwTpR'
Try running 'sudo rosdep fix-permissions'
```

とでてきた。ので、

```bash
sudo rosdep fix-permissions
```

としたら解決。`rosdep update`して`roslaunch rrbot_gazebo rrbot_world.launch`すると、無事表示されて重力でぶらーんってなった。

![Screenshot from 2018-07-08 12-50-53.png](https://qiita-image-store.s3.amazonaws.com/0/257749/9819a670-f6bc-3894-6067-715a6304a602.png)
Truffleのtutorialを試してみる

スマートコントラクトでdappを作るべく、
truffleのtutorialを実施してみた。
https://truffleframework.com/tutorials/pet-shop

```
$ truffle develop
```
をすると
Connected to existing Truffle Develop session at http://127.0.0.1:9545/
につながる。

chromeでmetamaskを立ち上げる。
`http://127.0.0.1:9545/` に接続しておく
```
truffle(develop)> compile
truffle(develop)> migrate
truffle(develop)> test
```

migrateの時点でスマートコントラクトがデプロイされてgasが引かれている

別ターミナルで
`npm run dev`

petが出てくるので、adoptボタンを押すと
metamask windowが立ち上がる

この際に、大きめのethをgas priceで払わないとsuccessにならなかった。
（222gweiくらい）

＊ganacheを立ち上げよと書いてあるが、特に必要なかった。（truffle developでテストサーバを立てずに実施する際には必要そう）

##参考：
・【Ethereum】truffleのチュートリアルで、ペットショップのアプリ（Dapp）を作ってみた
https://www.katonobo.com/entry/ethereum-truffle
・Solidity 言語における詰まりどころメモ
Attempting to run transaction which calls a contract function, but recipient address is not a contract address エラー
https://qiita.com/kyrieleison/items/7f37b5349fc6c7c220cd
RubyでURIが存在するかどうかチェック

URLが存在するかどうかを知りたかったので、`URI#exists?`を書きました。


```.rb
module URI
  def exists?
    req = Net::HTTP.new(host, port)
    req.use_ssl = true if scheme == 'https'
    res = req.request_head(path)
    return URI(res['location']).exists? if %w(301 302).include?(res.code)
    res.code == '200'
  end
end
```


こちらのコードに`301`,`302`の場合に追尾する機能を追加したものです。
https://stackoverflow.com/questions/5908017/check-if-url-exists-in-ruby
（stackoverflowの回答にも追加したかったけど`close`されててできなかったので、`reopen`権限ある人がいたらお願いします。)
Ruby初心者課題　配列

**課題を解いて学んだことを書いていきます**:relieved:




```ruby:qiita.rb
fruits = [ "Apple", "Orange", "Strawberry" ]
```


Q　Orangeを取り出してください

解答↓

```ruby:qiita.rb
puts fruits[1]
```
配列の要素は[　]内左から順に[0],[1],[2]とインデックス番号が振られているので左から２番目に並んでるOrangeは[1]で取り出す。


---



Q　配列「fruites」から要素を順番に取り出して、ターミナルに表示してください。

実行結果

```ruby:qiita.rb
ターミナル
Apple
Orange
Strawberry
=> ["Apple", "Orange", "Strawberry"]
```


解答↓


```ruby:qiita.rb

fruits.each do |fruit|
	puts fruit
end
```
配列の要素を順番に取り出して処理を行うことができるeach文を使う。
配列.each do |変数名|
〜実行したい処理〜
end　　（←endまでの間に実行したい処理を書く）

この問題でいう変数fruitはendの外で使おうとするとエラーになる。
実に面白い SORACOM Lagoon 温湿度＆受信信号強度を可視化

## 目的
・もちろんSORACOM Lagoon評価
・湿度と受信信号強度の相関調査

## 準備
・WioLTEと温湿度センサ
・SORACOMアカウント

## プログラム
・温湿度センサのプログラムはSEEEDさんのサンプルプログラム参照
・LTEモジュールが受信している信号強度[dBm]を取得します。
　　int rssi = Wio.GetReceivedSignalStrength();

## 完成
![tte.jpg](https://qiita-image-store.s3.amazonaws.com/0/153317/d872fe26-fa9e-b3a5-5065-c26d1cd95e7a.jpeg)


## 一言
・湿度と受信信号強度の２軸グラフもやってみましたが
　見づらいのでやめました。
・「晴天」「雨天」などで電波信号強度がどのように変化するか
　モニタリングしようと思っていた矢先に「SORACOM Lagoon」リリース！
　初心者でも簡単にモニタリングできる時代になったんですね。
rubyからAmazon SNSを利用して電話番号指定でSMSを送信する

# はじめに

rubyからAmazon SNSを利用して電話番号指定でSMSを送信する方法について調べたので備忘録として投稿させていただきます。

# 用途

- 特定の電話番号宛にSMSを1通送信する
- 複数の電話番号宛への同時送信は不要

# 準備

AWSコンソールでAccessKeyを払い出す。(だけ)


# サンプル

## コード

```ruby:sms.rb
require 'aws-sdk'

def send_sms(tel:, msg:)
  
  sns = Aws::SNS::Client.new()
  sns.publish(phone_number: tel, message: msg)

end


send_sms(tel: '+81 xxxxxxxxxx',msg: "テスト")
```

## 補足

AccessKey/Regionはコード内に記述することも可能。

```ruby
  sns = Aws::SNS::Client.new(
      access_key_id:     'xxxxx',
      secret_access_key: 'xxxxx',
      region:            'xxxxx'
  )
```

メッセージ配信の信頼性を高くしたい場合は*送信するメッセージのタイプ*に**Transactional**を指定する。

```ruby
  # オプション：送信するメッセージのタイプに「Transactional」を指定
  sns.set_sms_attributes({
                             attributes: {
                                 "DefaultSMSType": "Transactional"
                             },
                         })
```

## 実行

```shell-session
# sws-sdkをインストール
$ gem install aws-sdk

# 環境変数でAccessKey/Regionを設定
$ export AWS_ACCESS_KEY_ID="xxxxx"
$ export AWS_SECRET_ACCESS_KEY="xxxxx"
$ export AWS_REGION="ap-northeast-1"

# サンプルコードを実行
$ ruby sms.rb
```

# SMSの分割について

本文が長い場合にSMS内のテキストが何文字で分割されるか確認した。

## 調査環境

- 端末：iOS 11.4 iPhoneX
- キャリア：au

## 結果

1通のSMSに含められるテキストは、

- 半角：最大153文字
- 全角：最大67文字

| 送信したSMSの本文 | 受信したSMS |
| :--- | :--- |
| 半角200文字 | 153/47文字の2通に分かれて受信した |
| 全角200文字 | 67/66/67文字の3通に分かれて受信した |
PM2のクラスターモードでホットデプロイを行う

node nginx pm2 expressのアプリケーションの基盤を作りたくて色々試しているのですが、クラスターモードでダウンタイム0でリロードが出来るということで試してみました。

**補足**

ホットデプロイに見えるだけでホットデプロイではない感じ、なんというのかわかりません。

[Cluster Mode](http://pm2.keymetrics.io/docs/usage/cluster-mode/)


2coreでやってるけどreloadをかけると同時にリロードしてしまって
アクセスすると一時的に404になってしまってうまくいかない。

色々巡ってたどり着いたのが[Graceful shutdown NodeJS HTTP server when using PM2](http://www.acuriousanimal.com/2017/08/27/graceful-shutdown-node-processes.html)

以下を追加して試したところうまくいきました。

```js:bin/www
process.on('SIGINT', function() {
  // リクエストの受け入れを停止してからプロセスを止める reload時に404にさせない
  server.close(() => {
    // close connections, clear cache, etc
    
    process.exit();
  });
  // Force close server after 10sec
  setTimeout((error) => {
    // close connections, clear cache, etc

    process.exit(1);
  }, 10000)
});
```

reloadすると順番にreloadされました。

ファイルを配置してからreloadすることで404になるタイミングが無く、目的の動作が出来ました。
Githubのコミットでプロフィール画像が空白になる 

# 例

Github上では同じアカウントのはずだけど、別アカウントとして認識されているかのように見える。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7be4763b-1ba1-6736-1747-17c387f52cdc.png)

# 解決

gitconfig の email 設定が間違っていた。
email を Githubアカウントと同じものに揃えたところ、以後のコミットでは正しくプロフィール画像が反映されるようになった。

```diff:~/.gitconfig
[user]
-  email = typo.monster@gmail.com
+  email = correct.human@gmail.com
```

## コマンドでやる場合

### グローバル設定を変える

- `git config --global user.email correct.human@gmail.com`

### ローカル設定 (カレントのレポジトリの設定) だけを変える

- `git config --local user.email correct.human@gmail.com`


# 参考

- [Git の Commit Author と Commiter を変更する - Qiita](https://qiita.com/sea_mountain/items/d70216a5bc16a88ed932)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PM2でファイルの変更を自動反映させる

node nginx pm2 expressのアプリケーションの基盤を作りたくて色々試しているのですが、ログを実装したら謎の挙動をしていました。

ログ設定を行ってブラウザ更新すると何故か404になったりずっと読み込み中になったり謎の動作をしてしまいました。

`pm2 monit`で状況を確認すると以下の様なログが出てました。

ログの本体は`/root/.pm2/pm2.log`

```
PM2 error: Change detected on path log/error.log for app web - restarting
PM2 log: Stopping app:web id:0
PM2 log: Stopping app:web id:1
PM2 error: Change detected on path log/error.log for app web - restarting
PM2 error: [Watch] Process name %s is being stopped so I won't restart it
PM2 error: Change detected on path log/info.log for app web - restarting
PM2 error: [Watch] Process name %s is being stopped so I won't restart it
PM2 log: App name:web id:1 disconnected
PM2 log: App [web] with id [1] and pid [615], exited with code [0] via signal [SIGINT]
PM2 error: Change detected on path log/access-2018-07-08.log for app web - restarting
PM2 error: [Watch] Process name %s is being stopped so I won't restart it
PM2 log: App [web] with id [0] and pid [610], exited with code [0] via signal [SIGINT]
PM2 log: pid=615 msg=process killed
PM2 log: Starting execution sequence in -cluster mode- for app name:web id:1
PM2 log: pid=610 msg=process killed
PM2 log: Starting execution sequence in -cluster mode- for app name:web id:0
PM2 log: App name:web id:0 online
PM2 error: (node:413) [DEP0007] DeprecationWarning: worker.suicide is deprecated. Please use worker.exitedAfterDisconnect.
PM2 log: App name:web id:1 online
PM2 error: (node:413) [DEP0007] DeprecationWarning: worker.suicide is deprecated. Please use worker.exitedAfterDisconnect.
```

開発中でファイルの変更を自動反映させたくて`--watch`をつけてたからログが書き込まれる度にリロードされている様子。

普通にドキュメントに載っていました。
[Watch & Restart](http://pm2.keymetrics.io/docs/usage/watch-and-restart/)

`--watch`に気を取られて`ignore_watch`を見逃していました。

```
"watch": ["server", "client"],
"ignore_watch" : ["node_modules", "client/img"],
"watch_options": {
  "followSymlinks": false
}
```

|||
|---|---|
|watch|監視対象|
|ignore_watch|監視対象外を設定（正規表現）|
|"followSymlinks": false|シンボリックリンクの先を監視しない|

ということなので以下で設定しました。

```json:processes.json
{
  "apps" : [{
    "name" : "dev",
    "script"    : "bin/www",
    "instances" : "max",
    "instance_var": "INSTANCE_ID",
    "exec_mode" : "cluster",
    "watch": ["./"],
    "ignore_watch" : ["node_modules", "log", "\.git"],
    "watch_options": {
      "followSymlinks": false,
      "usePolling": true
    },
    "env" : {
      "NODE_ENV" : "development"
    }
  },
  {
    "name" : "prod",
    "script"    : "bin/www",
    "instances" : "max",
    "instance_var": "INSTANCE_ID",
    "exec_mode" : "cluster",
    "env" : {
      "NODE_ENV" : "production"
    }
  }]
}
```

開発時のみ`watch`したいので`env_production`を使わずにappsで分けています。

**アプリケーションフォルダをマウントしている場合は`usePolling`を`true`にしないと`ignore_watch`が効きませんでした。**

> When working with NFS devices you’ll need to set usePolling: true

```
pm2 start processes.json --only dev
```

これでとりあえず目的の動作は出来ました。
DBクエリ(RDB)を軽くするためのポイント　性能改善

#概要

DB（RDB)を利用するときには、クエリ負荷が性能に大きく関わる。
Webシステムなどで性能を担保するときに、ボトルネックになるのは大体DBクエリになる。
重いクエリによるDBサーバの負荷が高く、システム全体に影響を与えることもしばしば、、

いままでの経験上、DBクエリを軽くするためのポイントを列挙する。
ちなみに当方DBに詳しくない。その中でもできるポイントを記載した。

AWS上のRDSでも同じことなので、このポイントはクラウド上でも使える。
ただ、MySQL/PostgreSQLを触ってきての内容のため、それ以外のRDBでは役に立たないこともあるかも

#①DB設計時に気をつけること

##SELECTするデータは可能な限り1テーブルから取れるようにする（JOIN回数を減らす設計を）
DB設計時から検討が必要になるが、なるべくシンプルなDB構成にすること。1機能=1テーブルが理想

もちろんRDBである以上、JOINはどうしても出てくる（ユーザ情報からユーザが存在するかなど）
しかし、設計時にある程度考慮して、JOIN回数を減らすようなテーブル設計は可能である
データが大量に発生しそうなところで考慮しておくと効果抜群

##採番カラムを入れる（AUTOINCREMENT大事）
こちらも設計時から。割と忘れがち。よくあるユーザと何かの関連情報とかだと、ユーザIDと何かのIDを複合主キーなどにしやすい
ソート時に性能が出なくなるので、明確な理由がなければいれておくべき。
後々、ソート性能が出て非常に助かる

#②クエリ作成時に気をつけること
##INDEX（インデックス）を都度足すこと
RDB上、避けて通れないINDEX。もちろん設計時に全て考慮ができればいいが、よっぽど熟練した人でないと無理と思う。
実装・試験をしていく中で、遅いSELECTがあればINDEXが貼れるかは都度考慮する
これも割りと後回しにしがち

##UNIONよりUNIONALL
クエリ結合にUNIONを使いたい場合がでてくる
できる限り、UNIONALLを利用するべき

UNIONALL・・・結合クエリそのまま
UNION・・・結合したクエリをソート->重複削除（DISTINCT)

UNIONは便利なので、使おうとしがちだが、ソート->重複削除 の処理は非常に重い。
DBを操作するアプリケーション側で処理を肩代わりもできるはずなので、明確な理由がない限りはUNIONは使うべきではない

##JOIN対象は絞りを意識する（積算にならないように）
JOINをするときに、「大量データA * 大量データB」　で必要なデータ引っこ抜いてJOINするようなクエリは作らない
「大量データA * Aをぐっと絞る条件」でJOINを考えること
JOINは母体データを極力絞って、処理母体数を減らしていくために使うべき

##VIEWをシステム根幹で使わない
VIEWは便利。事前に作っていればクエリの複雑さを解消させる。
ただ、システム全体で何回もJOINするような対象については、VIEWを作成するべきではない
VIEWは汎用的に使えるように検索対象の最大値で組みがちなため、多くのクエリで不要なデータを交えたVIEWから検索することになる
非常に大きな遅延要因になる
また、VIEWでは前述したUNION・UNIONALLを利用しがちなため、UNIONALLを使うこともあてはまる

#③試験時に気をつけること
##スロークエリをみつける　たくさんの軽いクエリよりも一発の重いクエリ
DBサーバに負荷がかかるときは、たくさんの軽いクエリより、一発の重いクエリ
重いクエリを作らないことを重視すること
試験時にスロークエリログを出力するようにして、性能試験を実施するのがよい
 -MySQLなら long_query_timeの設定
 -PostgreSQLなら　log_min_duration_statementの設定
など

##繰り返しクエリを実施することで遅延もする
1回だけクエリを通したら早い場合も、繰り返し同じクエリを実行すると負荷が高く、応答遅延の原因になったりする
性能試験などで、繰り返しの試験を実施すべき。共通処理とか何度も通る処理は特に大事

##最大値と輻輳制御は必ず考慮すること
非機能用件の話なので、設計に近いかもしれない

####最大値
システムのでの各機能における最大値は必ず規定すること。それ以上はエラーではじくが望ましい
規定をしないとどこまでも増えていくデータに対して、性能を考慮することになる

####輻輳制御（スケール制御）
規定の許容値を超えないように、処理対応を削減、エラーで返すなど、最大値制御の１つ
TCPなどのネットワークの制御はよくあるが、システム的にも考慮すべき

最近はAWSなどクラウド上で簡単にサーバがオートスケールするので、その対応を代替とすることも良いと思われる
DBもマスター：書き込み、リードレプリカ：読み取りにして、負荷によりスケールさせる

ただ、マスターをスケールすることは結構考慮がいる。シャーデングなど。
そのため、DB負荷が高い場合はエラーを返すなどもあわせて考慮するとよい


#まとめ
DBクエリ改善は地道な道。楽な道がない。
データベースに詳しいエンジニアを入れられれば最高だが、アサインできなくても上記の対応をやっておくことでかなり負荷は軽減される。
progateのGoレッスンやってみた(Go合宿2018進捗報告)

※こちらの資料は[Go合宿2018](https://go-beginners.connpass.com/event/86555/)での、雑な進捗報告発表資料です。

---

#自己紹介

- @afroscriptといいます。
- teratailのDevRelやってます
- 仕事としてプログラムを書いたことはないです
- Go　ビギナーズの運営してます
- Golang暦
    - 2015年10月に初心者向けハンズオンで初Golang
    - 11月に入門LT大会で発表
    - 1年半以上触ってなかったです、すみません
    - ...って、去年の合宿のときにも書いてました。
    - そして、そこから1年くらいほとんど触ってなかったです、すみません
    - Goビギナー賞を狙った発表ですが、このペースを見る限り、今後の成長はあまり見込めません。投票はお控えください。
- 風邪気味。
    - 鼻水やばめ

---

#progateのGoレッスンやってみた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99740/a4480811-1961-5153-d4f9-19907352df23.png)

---
#progateとは？

- プログラミング学習サービス
- プログラミグ初心者向け
- ブラウザ上でコード書いて、実行までできる
- コードを書く前にスライドで説明がある。図もいっぱいで分かりやすい。
- UI/UX良好
    - 無駄にマウス使ったりせず、(ほぼ)キーボード操作だけでさくさくやれる
    - 色使いが好き

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99740/9bfe420f-a686-9b64-71b9-7a74137d2235.png)

---
#なぜやってみたか？

- 今日はGeth（Go Ethereum）やろうかなーと思ってたけど、tenntennさんにやってみてーと言われたので。
    - やってみて、ブログ書いてたら、時間なくなったので、Gethの方は進捗ゼロでした、残念。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99740/e81cc973-3f33-fc34-a672-376df36ef86b.png)


---
#内容

- Goに触れてみよう
    - Goに触れてみよう
- Goの基礎を学ぼう
    - GoのFormat
    - Goの基本
    - 数値
    - 数値の計算
    - 文字列の連結
- 変数を使ってみよう
    - 変数の基本
    - 変数の更新
    - 色々な変数の作り方
    - 変数とエラー
    - 変数と自己代入
- 真偽値と条件分岐
    - if文を使ってみよう
    - 真偽値
    - else
    - else if
    - 条件式を組み合わせよう
    - switch

---

#やってみてどうだったか？① -Good

- プログミング初心者向け
    - tenntennさんいわく、今回のレッスンのターゲットは、「プログラミング自体が初心者」
    - 説明スライドにも「変数とは？」「条件分岐とは」などのスライドがあり、プログラミング言語についてのそもそもの説明が入ってる
    - Go言語といえば、他のなにかしらの言語で、ある程度の開発はしたことがある人向け、玄人向けの言語ってイメージ
    - でもこうゆうレッスンがあることで、ゼロからの人でも最初からGo言語に触れられるというのが、すごくいいなと思った
    - 「Go言語しかまだやったことありません！」的なGolangネイティブなエンジニアがどんどん生まれてくるとうれしいな。

---

#やってみてどうだったか？② -Good
- gopherがちょいちょい出てきてかわいい
- やはりGo言語の特徴といえば、Gopherがかわいい！というとこ
- protateの説明スライドにもちょいちょいgopherが顔を出してくる。 
- キャラクターを推すのは、言語そのものへの愛着がわくので、いい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/99740/95816732-3e14-8622-1bf8-84884a56eafe.png)

---
#やってみてどうだったか？③ -Bad?
- 短い！
    - 1時間弱で終わった
- 何かつくりたい
    - 次回以降かと思いますが、Goで"何かつくる"レッスンがやりたい
    - 第2弾以降が楽しみです：）

---
#このレッスンを機に、もっと幅広い人たちがGolangを楽しんでくれるといいな：）

---
#おまけ
最近ようやく始めた雑Blogにも書きました：）
http://afroscript.hatenablog.jp/entry/2018/07/07/231252