OmniAICreator/Qiita-1.07M huggingface dataset:
Galaxyでファイルをダウンロードしてみよう

GalaxyにアップロードしたファイルやGalaxyで解析したテーブルやファイルを手元にダウンロードするには、画面左側の"History"の領域を利用する。
例えば、Sample.csvというファイルがGalaxyに有ってそれをダウンロードする手順はこんな感じ

画面左"History"の"Sample.csv"をクリック
![History_Sample_CSV.png](https://qiita-image-store.s3.amazonaws.com/0/213053/05434b93-8835-8cc3-0b68-6c046f3052d5.png)

"Sample.csv"の概要が表示されるので、今や古代のテクノロジーとなった3.5インチフロッピーディスクのアイコンをクリック
![History_Floppy.png](https://qiita-image-store.s3.amazonaws.com/0/213053/05f1ecfe-26ee-30ae-b9d8-de605caa178a.png)

後はブラウザ上で普通にファイルをダウンロードするのと同じ。

今日はここまで:grinning:
【Xcode】xcodebuildの参照コンパイラ変更【iOS】

##xcodebuildが参照するコンパイラの指定方法

ターミナルからこれ
`sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer`

たとえば、Xcode9x.app配下のコンパイラを指定する場合はこう
`sudo xcode-select --switch /Applications/Xcode9x.app/Contents/Developer`


carthageなどxcodebuildを使用するライブラリ管理ツールを利用する場合は上のコマンドで同期をとること
Salesforceの本番環境にあるApexクラスやトリガーを削除する

#やりたいこと
不要になったソースをクラスごと消したい。がしかし、sandbox上では削除できるんだけども、本番環境は削除できない。
sandboxから削除したという情報をリリースもできない。

詰んでしまった👼👼👼

そこで、調べてみると、 `destructiveChanges.xml` をリリースすることで削除できるということがわかりました。

#やりかた

##ファイルを作る
ファイルを2つつくります。階層は下記のようにしてください。

```
folder
   ├──package.xml
   └──destructiveChanges.xml
```

```package.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
   <version>41.0</version> <!-- APIバージョン -->
</Package>
```

```destructiveChanges.xml
<?xml version="1.0" encoding="UTF-8"?>
<Package xmlns="http://soap.sforce.com/2006/04/metadata">
    <fullName>codepkg</fullName>
    <types>
        <!-- 消したいクラスの名前をmembersに -->
        <members>OpportunityRefAccountUpdTriggerHandler</members>
        <members>OpportunityRefAccountUpdTriggerHdlTest</members>
        <name>ApexClass</name>
    </types>
    <types>
        <!-- 消したいトリガーの名前をmembersに -->
        <members>OpportunityRefAccountUpdTrigger</members>
        <name>ApexTrigger</name>
    </types>
    <version>41.0</version>
</Package>

```

カスタムオブジェクトなども削除できるみたいです。

##作ったファイルをZipにします

ここからが苦労ポイントでした。

Mac先生の標準機能でフォルダを圧縮すると、余計な隠しファイルを入れてきます。
そいつが悪さする。すごく。
この状態で以降の処理をすると「No package.xml file found」のエラーになってしまうので、もしそのエラーが出たら、隠しファイルを疑ってみてください。


Macで作った手順。

###zipファイルを作る

```
zip -r archive ./folder
```

###中身を見る

```
unzip -l ./archive.zip
```

はい、余計な隠しファイルがいる！

```
Archive:  ./archive.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  11-09-17 18:48   folder/
     6148  11-09-17 18:41   folder/.DS_Store <--おまえだ
      603  11-09-17 17:26   folder/destructiveChanges.xml
      135  11-09-17 17:28   folder/package.xml
 --------                   -------
     6886                   4 files
```

###隠しファイルを消す

```
zip -d ./archive.zip folder/.DS_Store
```

```
Archive:  ./archive.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
        0  11-09-17 18:48   folder/
      603  11-09-17 17:26   folder/destructiveChanges.xml
      135  11-09-17 17:28   folder/package.xml
 --------                   -------
      738                   3 files
```

消えました

これでZipファイルの作成は完了です。

##Workbench
Salesforceにログインをしたあと、workbenchにアクセスします。

https://workbench.developerforce.com/

認証しましょう。

migration > Deploy を選びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97162/730c185d-b2f1-e3cb-185c-7b9f2257fd52.png)

さっき作ったzipを選んで、画像の設定をして、 `Next`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97162/d1608802-c47e-f67a-fbc8-ef973f744adf.png)

`Deploy` を押せば完了

SUCCESSがTrueになっていれば成功です！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/97162/610505e1-52f7-1fd0-14ec-1ba46671afd1.png)

#参考にしたもの
https://help.salesforce.com/articleView?id=000187562&language=ja&type=1
https://medium.com/@wangyidan621/salesforce-workbench-zip-deployment-no-package-xml-found-error-on-mac-ec7ce49a7126
Ethereumクライアント実装の種類

Bitcoin等で何かと話題のブロックチェーン。
その一種であるEthereumについて調べた内容を備忘録的にまとめておきます。

# Ethereumクライアント
Ethereumを利用するにはP2Pネットワークに参加するためのクライアントが必要になります。
このクライアントは、Ethereumの仕様に沿っていればネットワークに参加できるため、
実装方法にはいくつかの種類があります。
(現在の推奨クライアントはGo言語実装の「`Geth`」)

ここからは、Ethereumクライアントの実装方式とそのgithubリンクを列挙していきます。

# 実装方式
## go-ethereum
https://github.com/ethereum/go-ethereum

Go言語での実装。
公式で推奨されているクライアントであり、
Ethereumを使ってみる場合におそらく始めに触るであろうクライアントです。

### 参考：クライアント「Geth」の公式サイト
https://geth.ethereum.org

## cpp-ethereum
https://github.com/ethereum/cpp-ethereum

C++での実装。
公式のGitHubでもピン留めされており、
wikiなども用意されているクライアント。

### 参考：クライアントの公式サイト
http://cpp-ethereum.org

## Parity
https://github.com/paritytech/parity

Rust言語での実装。
ウォレットの脆弱性が話題になっていますが、
その内容についてはここでは触れません。
詳しくは別の方が書かれている記事にお任せします。

### 参考：クライアントの公式サイト
https://parity.io

## pyethereum / pyethapp
https://github.com/ethereum/pyethereum
https://github.com/ethereum/pyethapp

pythonでの実装。
公式でサイトなどは準備中とのアナウンスがされています。
pyethereumがネットワークの作成、pyethappがetehereumネットワークへの接続(クライアント)です。

## ethereumj
https://github.com/ethereum/ethereumj

Javaでの実装。
利用したことはないので詳細は不明です。。

### 参考：クライアントの公式サイト
http://www.ethereumj.io/

## web3.js
https://github.com/ethereum/web3.js

Javascriptでの実装。
正確には、JavascriptのAPI。
類似のAPIとしてweb3.py(python API)やweb3j(Java API)が存在する。
PHPUnitを分割実行する

# はじめに
PHPUnitを分割実行して、実行後にログとカバレッジをそれぞれマージする方法です。
分割実行することでメモリ使用量を下げることができるので、大規模なプロジェクトでPHPUnitを実行するときなどに有用です。

# 必要なもの
## [phpcov](https://github.com/sebastianbergmann/phpcov)
コードカバレッジのマージに必要です。

Composerでインストールします。

## [merge-phpunit-xml.php](https://gist.github.com/sebastianbergmann/4405658#file-merge-phpunit-xml-php)
ログのマージに必要です。

ダウンロードして適当な場所に配置します。

Composerでphpcovをインストールしていれば、必要なパッケージも一緒にインストールされているはずなので、下記のように書き換えて`vendor/autoload.php`ファイルをインクルードすれば動くはずです。

```diff
@@ -1,7 +1,6 @@
 #!/usr/bin/env php
 <?php
-require 'SebastianBergmann/FinderFacade/autoload.php';
-require 'TheSeer/fDOMDocument/autoload.php';
+require_once __DIR__ . '/vendor/autoload.php';
 
 use SebastianBergmann\FinderFacade\FinderFacade;
 use TheSeer\fDOM\fDOMDocument;
```

実行権限も与えておきます。

```bash
chmod 755 merge-phpunit-xml.php
```

# PHPUnitの分割実行

分割前に下記のように実行していたとすると、

```bash
phpunit --log-junit /tmp/test-reports/phpunit/phpunit.result.xml --coverage-html coverage.html --coverage-xml coverage.xml
```

分割後は下記のように実行します。

```bash
phpunit --group group1 --log-junit /tmp/test-reports/phpunit/phpunit.result.01.xml --coverage-php /tmp/test-reports/phpunit/coverage.txt/coverage.01.txt
phpunit --group group2 --log-junit /tmp/test-reports/phpunit/phpunit.result.02.xml --coverage-php /tmp/test-reports/phpunit/coverage.txt/coverage.02.txt
```

この例だと、グループで分割しています。


# ログのマージ
```bash
merge-phpunit-xml.php /tmp/test-reports/phpunit /tmp/test-reports/phpunit/phpunit.result.xml
```

第1引数にマージ前のログが置いてあるディレクトリ、第2引数にマージ後のログを出力するパスを指定します。

この例だと、`/tmp/test-reports/phpunit/phpunit.result.01.xml`ファイルと`/tmp/test-reports/phpunit/phpunit.result.02.xml`ファイルがマージされて、`/tmp/test-reports/phpunit/phpunit.result.xml`ファイルが生成されます。

# カバレッジのマージ
```bash
phpcov merge --html /tmp/test-reports/phpunit/coverage.html --xml /tmp/test-reports/phpunit/coverage.xml /tmp/test-reports/phpunit/coverage.txt
```

マージしたカバレッジを色々なフォーマットで出力可能です。

この例だと、`/tmp/test-reports/phpunit/coverage.txt/coverage.01.txt`ファイルと`/tmp/test-reports/phpunit/coverage.txt/coverage.02.txt`ファイルがマージされて、`/tmp/test-reports/phpunit/coverage.html`ディレクトリと`/tmp/test-reports/phpunit/coverage.xml`ディレクトリが生成されます。

# 参考
- [PHPUnitのログ(XML)をマージする方法](https://qiita.com/ngyuki/items/2f0defdee91a2cb8040f)
- [複数回に分けて実行した PHPUnit のコードガバレッジを phpcov でマージする](https://qiita.com/gusagi/items/7a6475e59d4d612aa296)
Visual Studio | WPF > 名前からコントロールを見つける > FindName()

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

C++ BuilderでのFindComponent()に相当する処理を試す。

### link

[FindName](https://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.findname(v=vs.110).aspx)

### code

```MainWindow.xaml
<Window x:Class="_171110_t1630_findcomponent.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171110_t1630_findcomponent"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <Button Content="Button" Height="30" Click="Button_Click"/>
            <TextBlock Name="T_info" Height="30"/>
        </StackPanel>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _171110_t1630_findcomponent
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            object obj = FindName("T_info");
            if (obj != null)
            {
                var txt = (TextBlock)obj;
                txt.Text = "Pushed";
            }
        }
    }
}
```

### 関連

https://stackoverflow.com/questions/12238599/find-wpf-control-by-name
においてはFindName以外にもcontrolsにDictionary登録をしておいて、あとで名前をキーとして使う例がある。
(TextBlockの場合は、FrameworkElementでなく、TextBlockでDictionaryを作る）。
Edge.jsをnodeのv9.x系で動かすには

# 背景

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">まさか、Amazonのダッシュボタンでつくった子供向けのオニが来たぞボタンが動かなくなり、解決のためにVS2017を入れるとは思わなかった。　<a href="https://t.co/KZqNJIt0IV">https://t.co/KZqNJIt0IV</a></p>&mdash; kjunichi (@kjunichi) <a href="https://twitter.com/kjunichi/status/928811580690542592?ref_src=twsrc%5Etfw">2017年11月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

以前、イクメン系の記事として書いた

- [Node.jsとAmazon Dashボタンで鬼が来たボタンを作った](https://abrakatabura.hatenablog.com/entry/2017/03/03/070231)

を、思い出し、試そうとしたら、動かなかった

node.jsでC#なコードを埋め込めるEdge.jsモジュールがnode v9.1.0に対応していない
というようなエラーメッセージが出力された。

# edge.jsとは

- [[Node.js] Edge.js を触ってみた - Qiita](https://qiita.com/t-koyama/items/1acdc8d52e7ed0ebd940#_reference-90d78d72e5ac4470cc10)

という記事がQiitaにも上がっていた。

こちらの記事でどういうものかがわかると思う。


# node-gyp入れてnpm rebuildしてもダメ

どうやら、edge.jsのビルドは独特で、通常のリビルドではなく、
windowsでは.batファイルでビルドすることが分かった。
（edge.jsのgithubのページにもよく読むと書いてある。。）

で、このやり方に従って、ビルドするもnullptrが変換できない！みたいなエラーがでる。
しかもこれ、node側のヘッダファイルで怒られるという始末。


# Node v9.x系は多分使ってるV8がVS2017向けのものっぽい

Edge.jsの以下のissueを斜め読みすると、VS2017ではビルドが通るように記述があり、

- [Can't compile for node 8.3.0 on Windows 10 · Issue #584 · tjanczuk/edge](https://github.com/tjanczuk/edge/issues/584)

ちょっと前にChromiumがVS2017でビルドするようになっており、Node.jsのv9.xの
V8も新しめのものを使っているはずで、VS2017でビルドされている気がした。

# VS2017のコミュニティ版をいれた

VS2017のコミュニティ版をいれた。なんか別件でVS2015相当のC++のツールセット？を
入れられるみたいなことを目にしており、それっぽいオプションがあったので、追加してインストールした。VS2015はそのまま放置。

![SnapCrab_NoName_2017-11-10_16-54-2_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/3458/11c8955f-994b-1a39-ca8c-7b5156309a07.png)

# Edge.jsのtools\build.batの修正

最近使い始めたMS製？のMS版のchakuraエンジン版のnodeと切り替えることもできるらしい[nvs](https://github.com/jasongin/nvs)環境だったので、その辺の変更


```bat
set GYP=%LOCALAPPDATA%\nvs\node\%3\%2\node_modules\node-gyp\bin\node-gyp.js
```

と今回メインとなるmsvsのバージョンを2015から2017に変更

```bat
"%NODEEXE%" "%GYP%" configure build --msvs_version=2017 -%FLAVOR%
```
を行い、

```bat
build release 9.1.0
```

で、無事edge.jsのモジュールがビルド出来た。

# まとめ

WindowsでのC++がだいぶまともにつかえるようになってきたのかも。。

# 関連記事

- [Node.jsとAmazon Dashボタンで鬼が来たボタンを作った](https://abrakatabura.hatenablog.com/entry/2017/03/03/070231)
- [Amazon dashボタンをWindowsで使うまで](https://abrakatabura.hatenablog.com/entry/2016/12/15/005833)
- [Amazon dashボタンをWindowsで使うまで 完結編](https://abrakatabura.hatenablog.com/entry/2016/12/16/003554)
- [WindowsだけでAmazon DashボタンのMACアドレスを取得できるjsを書いた](https://abrakatabura.hatenablog.com/entry/2017/03/04/230941)
GPD Pocketをチューニングしてみた

# はじめに
会社の後輩が面白そうな端末をキックスターターから入手していたので、余りを安く譲っていただいた。
モバイル開発環境としてのカスタムチューンアップを行ったのでまとめたいと思う。

## モバイルに求めた要件

1. Visual Studioでちょっとしたプログラミングができる
2. Excel、Wordなどを使ってドキュメント作成ができる


# GPD Pocketとは
中国のメーカーGPD社が発表したUMPC。7インチという小型サイズでありながらフルHDディスプレイなこと、ハイスペックなことからモバイル好事家から着目されている...らしい。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/184939/c2856d60-7842-1395-e28e-257fe3fbd02d.png)


## スペック
|HWリソース|スペック|
|:-:|:-:|
|画面サイズ|7インチ|
|解像度|WUXGA(1920 x 1200) 323.45ppi|
|アスペクト比|16:10|
|CPU|Intel Atom Z8750(1.6GHz～2.56GHz)|
|RAM|8GB(LPDDR3-1600)|
|GPU|Intel HD Graphics 405|
|OS|Windows10 home or Ubuntu 16.04 LTS|
|マルチメディアデバイス|Realtek ALC5645|
|Wifi|IEEE802.11 a/b/g/n/ac|
|Bluetooth|Bluetooth 4.1|
|最大稼働時間(バッテリサイズ)|約12時間(7000mAh)|
|重量|480g|
|本体サイズ|180×106×18.5mm|
|キーボード配列|QWERTYキーボード(英語キーボード101/102)|

## 販売店
https://www.indiegogo.com/projects/gpd-pocket-7-0-umpc-laptop-ubuntu-or-win-10-os-laptop--2#/

# 初感



# チューニングしてみた

## Windows10 設定
1. 画面に合わせて、拡大縮小の表示倍率を150%に変更。
<img width="543" alt="SnapCrab_NoName_2017-11-23_1-34-28_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/184939/906f580b-214e-f0a6-e836-d7b2a974eef1.png">


2. Windowsタスクバーを画面下から画面上に移動し、固定。
<img width="960" alt="SnapCrab_NoName_2017-11-23_1-38-22_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/184939/3cce467a-39a2-c200-7b91-eef629d1292a.png">
※ディスプレイの下面がタッチしづらいのでコントロール系のUIは上面にもってくることをオススメします。

3. 電源オプションに休止状態を追加し、休止状態になるように調整。
<img width="590" alt="SnapCrab_システム設定_2017-11-23_1-42-36_No-00.png" src="https://qiita-image-store.s3.amazonaws.com/0/184939/8f6bd791-deb6-c9a2-bb4f-b43476236b96.png">



## キーボードレイアウト

普段は日本語109キーボードレイアウトを使っているので、それに近づけるように調整した。

## before
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184939/ba5ceb4d-9902-de9c-6ed6-af3f729f6a61.png)

## after
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184939/ab2084d8-e2ff-9f83-eb9c-ac0c0d80bae1.png)

※キートップを張り替えている猛者もいるようだが、テプラで対応しようと思う

## トラックポイント
トラックポイント・キャップをGPD純正から[レノボ・ジャパン ThinkPad ロープロファイルトラックポイント・キャップ](https://www.amazon.co.jp/gp/product/B00C9OVLWG/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)に変更。
※購入したものは10個入りだった
※グリップ具合が全然違うので必ず変えることをオススメする。重要。

## 液晶保護フィルム
[ミヤビックスの指紋が目立たない 反射防止液晶保護フィルム](https://www.amazon.co.jp/gp/product/B0728HBK5L/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1)を使用。タッチパネルは結構使えるので指紋が目立たないタイプの保護シートを使うことをオススメする。

#参考URL
https://gpd.wiki/

http://gadget-system.com/%E3%82%AC%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E9%96%A2%E9%80%A3/mouse-2

https://www.sunmattu.net/pctablet/gpd-pocket/8820

[電源の操作メニューに"休止状態"を追加するには via dynabook support](https://dynabook.com/assistpc/faq/pcdata2/016713.htm)
Angular のlength of null の対処（デバッグ）

デモアプリを使っていると、こんなエラーに遭遇した。これは、最初にアクセスした時のみ発生した。

<img width="912" alt="Screen Shot 2017-11-10 at 4.39.28 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/52ee8076-020c-aa70-7c39-f09cca33d6c9.png">

自分のコードを見て、本番コードではなく、スパイクのプロジェクトを作ってみる。同僚が localStorage のfix を入れたところで、発生しているので、多分それと思われる。


``` 
ng new local
```

このリポを一応あげとく

*[Angular Experiment](https://github.com/TsuyoshiUshio/AngularExperiment)

起動時初回のみなので、localStorage にマトを絞って再現させてみる。

```ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app';
  cars = [];
  constructor() {
    this.cars = JSON.parse(localStorage.getItem("cars"));
    console.log('this.cars:' + this.cars);
  }

  ngOnInit(): void {
    setTimeout(() => {
    this.cars = [{"name": "subaru"}];
    localStorage.setItem("cars", JSON.stringify(this.cars));
    }, 3000)

  }
}
```

```html
<h2>Here are some links to help you start: </h2>
car number is {{cars.length}}
<ul>
  <li *ngFor="let c of cars"> {{c.name}} </li>
</ul>
<ul>
```

<img width="780" alt="Screen Shot 2017-11-10 at 4.43.42 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/3470/4034ec65-ac35-dcf6-0790-89f515d3afe0.png">

ブラウザの開発者モードで調べると、html のlength のところで、null になっている。コードをみると、デフォルト値でnull になっている。なんでだろ、、、ちなみに、setTimeout() をかけているのは、タイムアウトをここでかけないと、画面の描画の前に、`ngOnInit()` が動いてしまうため、問題が発生しないから。（本当のアプリはリモートコール）これで再現する。

```ts
export class AppComponent {
  title = 'app';
  cars = [];
  constructor() {
    this.cars = JSON.parse(localStorage.getItem("cars"));
    console.log('this.cars:' + this.cars);
  }

  ngOnInit(): void {
    setTimeout(() => {
    this.cars = [{"name": "subaru"}];
    localStorage.setItem("cars", JSON.stringify(this.cars));
    }, 3000)

  }
}
```

ポイントはシンプルで、最初に、`cars = []` を書いているけど、`JSON.parse(localStorage.getItem("cars"));`で上書きしているので、localStorage がなければ、null になるという問題。ということは、解決策は、デフォルト値を設定すると良い。`||` をつけることで、null の場合デフォルト値になる。

```ts
    this.cars = JSON.parse(localStorage.getItem("cars")) || [];
```

解決。プルリクエスト書いた。
WP-CLI で WordPress のベータ版を試す


まもなく（たぶん11/14）に WordPress の 4.9 がリリースされますが、そのβ版を WP-CLI でインストールするには、以下のコマンドを使用してください。

```
$ wp core update --nightly
```

ここで１つ注意なのですが、この後、正式版がリリースされた後に以下のコマンドでアップデートすると、その時点でのαバージョンがインストールされてしまいます。

```
$ wp core update # 4.9がリリースされた直後から 5.0α がインストールされてしまう。
```

正式版がリリースされた後は、以下のコマンドで最新の正式版にアップデートしてください。

```
$ wp core update --version=latest
```

うっかり一度 5.0α にアップグレードしてしまった場合には、以下のように `--force` をつけるとダウングレードできます。

```
$ wp core update --version=latest --force
```

ちなみに僕は制作のお仕事をしているときは、常に `--version=nightly` でやっています。こうすると将来発生するかもしれないトラブルに対してあらかじめ対処することができます。
react-native で code push を設定する(iOS) => AppCenterに統合

### 追記
code push が microsoft app center に統合されるっぽいです。2018年9月以降使えなくなる(導入方法が変わる)可能性があります。
```
We are committed to maintaining the CodePush CLI through September 2018. You are free to continue using it until then, but all features except for releasing and viewing metrics will be disabled on March 31st, 2018.
```

http://microsoft.github.io/code-push/index.html#getting_started


### このページについて
code push 設定を毎回わすれるので備忘録

### 公式Docs
iOS
https://github.com/Microsoft/react-native-code-push/blob/master/docs/setup-ios.md

### やったこと
※code-push-cliとアカウント登録は済の前提

0) code-push でアプリの設定
`code-push app add MY_APP_NAME ios react-native`
出てきたdeployment keyをメモしておく

1) ライブラリのインストール
`npm install --save react-native-code-push`
`react-native link react-native-code-push`

※ 追記： 現在react-native link のみだとCodepush.h not found になってしまうので、マニュアルで確認必要

2) AppDelegate.mの設定

`#import <CodePush/CodePush.h>`

`jsCodeLocation = [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];`
を下に入れ替える

`jsCodeLocation = [CodePush bundleURL];`

3) Staging Schemaの作成
https://github.com/Microsoft/react-native-code-push/blob/master/docs/multi-deployment-testing-ios.md

Go to Build Location -> Per-configuration Build Products Path -> Staging and change Staging value from $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) to $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

4) BuildSettingに環境毎のkeyを追加
Click the + button on the toolbar and select Add User-Defined Setting

5) info.plistの修正
![image.png](https://qiita-image-store.s3.amazonaws.com/0/206623/25dabf7b-728f-9aa2-b667-b80a9563c386.png)


完了！
プログラミング未経験者がエンジニア目指す（その２）

# N予備校の章
第１章はじめよう
　03．さまざまなHTMLタグ（tableタグ）
　04．HTMLで作る自己紹介ページ
## はじめに
・久々に赤坂見附にあるヤフーロッジで勉強。
## 概要
・tableタグとは
・さまざまなタグを駆使して自己紹介ページを作る。（好きな動画、SNSも入れる）
## 分かったこと
・好きな動画や地図の入れ方が思った以上に簡単だったこと。
## 疑問点
・HTMLのタグって全部でいくつあるんだろう。どれだけ覚えたら良いんだ？
## 感想
・テキスト通りにただ入力するだけじゃなくて、そのコードがさす意味を考えながら入力しないと、勉強している意味がないことに気が付いた。
## 終わりに
・平日なのにヤフーロッジ席がない位混んでた。だけどみんな真剣そうに見えたから、いつもよりもやる気が出た。
[Swift] @objcの話 [Objective-C]


## `@objc` の話

Swift4になって`@objc`を付けなければならないプロパティやメソッドが増えて大変ですね。
`@objc`って付けないとだめなの？っていう疑問がある人も多いと思います。

この記事では `@objc` を付けると何が起こるのかを解説しています。

ただし、**素人が雰囲気で書いています。**

### Objective-Cの話

`@objc`を付けると何が起こるかを知るにはObjective-Cの話が必要です。
しかも割と低レベルな話です。ちゃんと説明できるかよくわかりません。

#### メソッド
ご存知の通り、Objective-CはC言語にオブジェクト指向な記述を付け加えたものです。
メソッドは他のOOPLと同じように隠し引数を持った関数としてコンパイルされます。


```objc
@implementation Hoge
- (void)moveTo:(NSPoint) point {
    // do something
}
@end
```

これをコンパイルすると次のようになります。（疑似コードです。）

```objc
void moveTo(id self, SEL cmd, NSPoint point) {
    // do something
}
```

隠し引数として`self`と`cmd`が追加されています。
`self`はレシーバー自身、`cmd`はSELと呼ばれるセレクタを表す何かです。
Objective-Cではメソッドをコンパイルするとふたつの隠し引数を持った関数が生成されるということを覚えてもらえればOKです。

#### プロパティ

古いObjective-Cと最新のObjective-Cではプロパティの捉え方が完全に変わってしまっています。
今は最新のObjetive-Cの話をします。

```objc
@interface Hoge: NSObject

@property NSRect point;

@end
```

分かるようなわからないような宣言ですが、まあわかるでしょう。
一般的な言語では、このプロパティはオブジェクトを構造体のように連続した領域に収めてオフセットアドレスに直接アクセスしたりするのですが、（新しい）Objective-Cではsetter, getterでアクセスするようになっています。
通常setter, getterはコンパイラにより自動的に生成されます。
setter, getterはObjective-Cの文法では次のようになります。

```objc
- (NSPoint)point;
- (void)setPoint: (NSPoint) point;
```
コンパイルされると以下のような関数になります。（疑似コード）

```objc
NSPoint point(id self, SEL cmd);
void setPoint(id self, SEL cmd, NSPoint point);
```
こちらもメソッド同じく`self`と`cmd`のふたつの隠し引数を持ちます。

### Swiftの話

ではSwiftの話に戻りましょう。
公式で公表されているようにSwiftは未だABI安定に至っていませんので、以下の話はSwift4.0までの話となります。変わらないと思いますが。

#### メソッドとプロパティ

Objective-Cと同様にメソッドとプロパティがどのようにコンパイルされるか見てみましょう。

```swift
class Hoge {
    var point: NSPoint = .zero
    
    func moveTo(point: NSPoint) {
        // do somethig
    }
}
```

以下疑似コード

```swift

// getter
NSPoint point(Hoge *obj);

// setter
void setPoint(Hoge *obj, NSPoint point);

// method
void moveTo(Hoge *obj, NSPoint point);
```

Swiftでは隠し引数はオブジェクト自身ただ一つであるということです。

### `@objc`の話

ここまで、Objective-CとSwift4.0でメソッドやプロパティがどのようにコンパイルされているかを見てきました。
それらにはObjective-CとSwift4.0で決定的な違いがありました。
**隠し引数の数**です。
Objective-Cには２つの隠し引数がありましたが、Swift4.0には１つしかありません。
これはつまり**相互に利用することができない**ということです。

ただし、Swift側からObjective-Cのそれらを利用することが可能なように細工がなされています。
Objective-C側に存在する第二の隠し引数`cmd`はメソッド名プロパティ名から簡単に生成できるためそれらを呼び出すためのSwift用の関数が（半）自動的に生成されているのです。
Swiftで作成したアプリケーションバンドル内にframeworksフォルダがありその中に多量のdylibがあるのを見たことがあるかもしれません。
あれです。
この仕組みによりSwift側からObjective-C側へのアクセスは表面上はシームレスに行えます。

ところがObjective-C側からはそうはいきません。
これまで、SwiftからObjective-Cへのフィードバック的な変更が各種ありましたが、基幹部分への変更は行われていません。
つまりObjective-CのランタイムはSwiftを知らない状態のままなのです。
この状態でSwiftのメソッドを呼び出そうとするとObjective-Cは余分な第二引数を付けて呼び出してしまいます。（詳細は省きますが正しくは関数を見つけられないです。）
当然動きません。

そこで登場するのが `@objc` です。
`@objc`を付けられたメソッド、プロパティにはSwiftの実装に加え、Objective-Cで用いられるふたつの隠し引数を持った関数を同時に作成するようになります。
このことで`@objc`を付けたメソッド、プロパティはObective-Cからも正しく利用することができるようになります。


### まとめ？

先に書いたように、**素人が雰囲気で書いた**ものなのでいろいろ突っ込みどころがあるとは思いますが、ご了承ください。
BitStarで利用しているXaaSまとめ [オフィス編]

# はじめに
はじめまして、BitStarのCTOの山下です。
社内でADVENTカレンダーを書いてみようという試みでBitStarで採用しているXaaSにつて説明できればと思います。

# XaaSとは
XaaSとは「X as a Service」の略でして、

> XaaSとは、情報システムの構築・運用に必要な何らかの資源(ハードウェア、回線、ソフトウェア実行環境、アプリケーションソフト、開発環境など)をインターネットを通じてサービスとして遠隔から利用できるようにしたもの。また、そのようなサービスや事業モデル。
出展: http://e-words.jp/w/XaaS.html

っという感じです。

# BitStarで使っているSaaS
BitStarで採用しているSaaSを調べてみました。

* 全社向け
  * G Suite (旧 Google Apps for Business)
  * Microsoft Office 365
  * Slack
  * Sansan
* 開発向け
  * Wercker
  * New Relic
  * GitHub
  * ZenHub
  * MailChimp
  * Mandrill
  * Bugsnag
  * CircleCI
  * Code Climate
* デザイナー
  * Adobe Creative Cloud

こう見ると思った以上に多いですね。
大きく分けると、エンジニア系のSaaSと

## オフィス向け
### G Suite
![G Suite](https://gsuite.google.jp/setup/assets/images/misc/logo-350x215.png)

* 元々はGoogle Apps for Businessっという名称でしたが、G Suiteという名称に変わりました。
* 個人的には伝わりにくいなとも思いますが、単独サービスとして独立してやってく意思なんでしょうか。
* 仕事する上では必要不可欠なサービスですね。。。
* メールサーバー作ってBecky!使ってた時代が懐かしいです。
* どうでも良いのですが、特定のドメインがG Suite使ってるかどうかどうかはDNSのMXレコード見ればわかります。
* 価格: 600円/月

```
$ dig bitstar.tokyo MX

; <<>> DiG 9.8.3-P1 <<>> bitstar.tokyo MX
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3330
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;bitstar.tokyo.			IN	MX

;; ANSWER SECTION:
bitstar.tokyo.		299	IN	MX	1 aspmx.l.google.com.
bitstar.tokyo.		299	IN	MX	10 alt3.aspmx.l.google.com.
bitstar.tokyo.		299	IN	MX	10 alt4.aspmx.l.google.com.
bitstar.tokyo.		299	IN	MX	5 alt1.aspmx.l.google.com.
bitstar.tokyo.		299	IN	MX	5 alt2.aspmx.l.google.com.
```
aspmx.l.google.comがその証拠です。

### Microsoft Office 365
![Microsoft Office 365](https://gxcuf89792.i.lithium.com/t5/image/serverpage/image-id/18732iB2969CDE7C5BA298?v=1.0)

* MicrosoftのOffice製品を使う為のサービス
* Word, Excel, PowerPoint, Access...等々使えます
  * OutlookはGmail使うので出番がなく、、、
  * OneNoteとPublisherもきっと使う人は使うんでしょうね程度
* CDインストールしてシリアル番号を手入力してた時代が懐かしいですね、、、
* 価格: 900円/月

### Slack
* アメリカのSlack Technologiesが開発している社内用コミュニケーションツールです
* Slack Appという機能で非エンジニアでも容易に他サービス連携ができます
* エンジニアだとAPI連携でガンガン遊べます
* 何よりもタダでも使えるのでとてもうれしい(機能制限あり)
* 和製のサービスだとChatworkさんもあります
  * BitStarでは主に社外とのやり取りだとChatworkを使う事が多いです
* 非ベンチャーな会社の導入障壁としては
  * 英語表示だからわかりにくい ▶ 文字打てば送れるので英語は読まない
  * Channelが全て英語しか登録できない ▶ 大丈夫です最近日本語チャンネル作れるようになりました
  * 名前の登録も英語 ▶ 同様に日本語使えるようになりました
* 運用してよくあるあるなのは
  * チャンネルが乱立する１ ▶ 1ヶ月運用してないChannelは強制的に閉じる
  * チャンネルが乱立する２ ▶ チャンネルの作成は申請制
  * チャンネル名がカオス ▶ チャンネルの命名規則を作る。BitStarでは下記で運用してます

| プリフィックス  | 部署          |
|------------- |---------------|
| a-           | 全員系         |
| ad-          | 広告事業       |
| dev-         | 開発部         |
| prod-        | プロダクション部 |
| corp-        | コーポレート部   |
| z-           | 雑談           |

### Sansan
* Sansanはクラウド名刺管理サービスです。
* ようはスキャナーでスキャンした名刺をクラウドに取り込んでデータ化するサービスです。
* 個人的にはSansanを"さん"付けすると、"さんさんさん"となって発音ややこしいなと、、、

# まとめ
という形でBitStarで使ってるSaaSまとめ [オフィス編] でした。
では来週の [開発編] をまた宜しくお願い致します。
あくまで、書き疲れたわけじゃないですよ
Visual Studio | WPF > タイマーイベント > ボタン押下からの経過秒数を取得する > DispatcherTimer  + DateTime.Subtract()

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

### 処理概要

- Buttonを押した時に1秒インターバルのタイマーを起動する
    - DispatcherTimer 使用
        - [MSDN](https://msdn.microsoft.com/ja-jp/library/system.windows.threading.dispatchertimer(v=vs.110).aspx)
- タイマーの処理ごとに経過秒数をDateTime.Subtract()で取得する
    - [MSDN](https://msdn.microsoft.com/ja-jp/library/system.datetime.subtract(v=vs.110).aspx)

### code

```MainWindow.xaml
<Window x:Class="_171110_t1515_dispatcherTimer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171110_t1515_dispatcherTimer"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBlock Name="T_time" Height="50" Text=""/>
            <Button Width="120" Height="30" Content="Start" Click="Button_Click"/>
        </StackPanel>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
//以下を追加 (DispatcherTimerのため)
using System.Windows.Threading;

namespace _171110_t1515_dispatcherTimer
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        DispatcherTimer myTimer;
        DateTime startTime;

        public MainWindow()
        {
            InitializeComponent();

            myTimer = new DispatcherTimer(DispatcherPriority.Normal);
            myTimer.Interval = new TimeSpan(0, 0, 1);
            myTimer.Tick += myTimer_Tick;
        }

        void myTimer_Tick(object sender, EventArgs e)
        {
            int elapsed_sec = DateTime.Now.Subtract(startTime).Seconds;
            T_time.Text = elapsed_sec.ToString() + " sec";
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            startTime = DateTime.Now;
            myTimer.Start();
        }
    }
}
```

### 実行

ボタン押下後の様子。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ace3e4c7-3a62-3f13-9fa4-dc09a9fc43b3.png)

### 関連

- [unity > System.DateTime > 日曜日からの日数を計算する > nowとsundayを取得 / int daysdiff = now.Subtract (sunday).Days;](https://qiita.com/7of9/items/861fd19dbe819841bbf6)

- [Visual Studio / WPF > イベント > Timer処理を使った時刻表示 | new TimeSpan(0, 0, 1); | DispatcherTimer | DateTime.Now.ToLongTimeString()](https://qiita.com/7of9/items/b2e9f5d2c644ff82fe22)
Galaxyでファイルをアップロードしてみよう

## Galaxy(pitagora galaxyをお薦めします) に手元のファイルをアップロードしてみよう。

まずはGalaxyに今利用しているコンピューターの上のファイルをアップロードしてみよう。

画面の左上の"Get Data"をクリック。
![GetData.png](https://qiita-image-store.s3.amazonaws.com/0/213053/be3143d0-fe38-3268-9842-5fd73998fc98.png)


色々な種類のデータを様々な所から取ってこられるけど、ここは手元のコンピューターからファイルをアップロード。
そこで"Upload File from your computer"をクリック
![GetData_UploadFileFromYourComputer.png](https://qiita-image-store.s3.amazonaws.com/0/213053/cf8e8d8d-d0e9-ed05-29b1-a79a02244759.png)

大きなダイアログが表示されるので、手元のコンピューターからアップロードしたいファイルをここにドラッグ・アンド・ドロップ。
![GetData_UploadFileFromYourComputer_Dialog.png](https://qiita-image-store.s3.amazonaws.com/0/213053/5d46250f-b3f1-f533-fe8a-30cee373dd68.png)

ファイルをドロップするとファイルの種類(Type)と関連するゲノムの種類(Genome)を設定できる。ファイルの種類について良くわからない場合でも"Auto-detect"のままにしておけば、大抵適切に処理してもらえる。
そして、ダイアログ右下の"Start"をクリック。
![GetData_UploadFileFromYourComputer_Dialog_Start.png](https://qiita-image-store.s3.amazonaws.com/0/213053/20b86246-456e-aeaa-6ed3-8aa902455f13.png)

"Status"が100%になったらアップロードは終了。
ダイアログ右下の"Close"をクリック。
![GetData_UploadFileFromYourComputer_Dialog_Close.png](https://qiita-image-store.s3.amazonaws.com/0/213053/ffd02f2a-e7f3-d8a5-120e-3d4fad1ec837.png)

今日はここまで:smiley:
Elm 0.18 入門(5) Subscriptionsによるイベント処理、関数合成

前回: [Elm 0.18 入門(4) 時刻の取得とMaybe](https://qiita.com/mather314/items/df25d593bc6f2f11ad31)

前回はアプリケーション初期化時の現在時刻の取得を実装しました。
今回は現在時刻を毎秒自動更新するようにしてみましょう。

## そもそも subscriptions とは

`subscriptions` は「予約」「購読」などの意味で、イベントに応じて自動的にアクションを発火するための仕組みです。
今回紹介する一定時間ごとのイベントの他にも（ボタン押下でないような）マウスクリックイベントやキーボード、WebSocketのリクエストなど様々なものがイベントとして指定できます。

また、 `subscriptions` 関数の入力値として `model` を指定することから推測できるように、モデルの状態に応じて反応を変化させることもできます。

## subscriptions の実装

まずは `subscriptions` 関数を次のように更新します。

```diff
 subscriptions : Model -> Sub Msg
 subscriptions model =
-    Sub.none
+    let
+        updateCurrentDate t = 
+            Date.fromTime t |> UpdateDatetime
+    in
+        Time.every Time.second updateCurrentDate
```

初めて `Time` モジュールを使うので `import` を追加します。

```hs
import Time exposing (Time)
```

`in` の中から順に関数シグネチャを確認しましょう。

```hs
Time.every : Time -> (Time -> msg) -> Sub msg
Time.second : Time
```

`Time.every` は第一引数にインターバル時間を受け取り、そのインターバルで第二引数の関数を呼び出して、アクション(`msg`)を生成する `Sub msg` を出力します。

`Time` 型は実際は `Float` 型なので、例えば5秒ごとに処理をする `subscriptions` が作りたい場合は `Time.every (5 * Time.second) ...` とすれば良いです。
よりDSLっぽく書きたければ、 `import Time exposing (Time, every, second)` として `every (5 * second) ...` のように書いてもいいでしょう。

```hs
UpdateDatetime : Date -> Msg
Date.fromTime : Time -> Date
```

呼び出す関数には既に実装している時刻更新用のアクションを作る関数（コンストラクタ）を組み合わせます。ただ、こちらの関数は `Date` 型を引数にとるので、 `Date.fromTime` 関数で `Time` 型の値を変換する必要があります。
`|>` に関しては前回の記事を参考にして下さい。

さて、時刻表示が時計のように動いているでしょうか？

ココまでのコード : https://ellie-app.com/cDXLnLdsRa1/2

## 関数合成

さきほどの記述では、 `let ... in ...` を使って呼び出す関数部分をわざわざ定義していましたが、実際には必要ありません。 `Time -> Date` と `Date -> Msg` を組み合わせて `Time -> Msg` の関数を作ればよいのです。これを関数合成と言います。

正にそのようなシグネチャを持つ中置演算子 `>>` があります。

```hs
(>>) : (a -> b) -> (b -> c) -> a -> c
```
http://package.elm-lang.org/packages/elm-lang/core/5.1.1/Basics#>>

関数合成を利用することで仮引数 `t` を用いた関数定義をしなくても、複数の関数そのものを合成して新しい関数を生成できるのでコードがスッキリします。

```diff
 subscriptions : Model -> Sub Msg
 subscriptions model =
-    let
-        updateCurrentDate t =
-            Date.fromTime t |> UpdateDatetime
-    in
-        Time.every Time.second updateCurrentDate
+    Time.every Time.second (Date.fromTime >> UpdateDatetime)
```

ただ、一般には関数合成というと逆の順番で合成をすることが多いです。

```hs
f : a -> b
g : b -> c
(<<) : (b -> c) -> (a -> b) -> a -> c
h = g << f
```

これは、通常の関数適用で考えると `g (f x)` となることから、 `g << f` (Haskellだと `g . f` ）という並び方が自然になるためです。
読みやすい方を選んで使うようにしましょう。

ココまでのコード : https://ellie-app.com/cDXLnLdsRa1/3

## まとめ

まずはシンプルな `subscriptions` の実装をしてみました。
次回は何を作ろうか決めてないですが、アプリケーションっぽいものを作れたらなと思います。
janus webrtc gateway + react native webrtc for iOS and Android

# 背景
昨今、ライブコマースやゲーム配信が流行っており、モバイルユーザでも映像のリアルタイムの送受信がしたい。ここで、候補になるのが、①大規模配信で遅延を許容できる場合はHLS②小規模配信で遅延なしならWEBRTC-SFU（頑張ればできそうだが）。WEBRTC-SFUで自分はjanusが好きなので、そのモバイルの例をreact-nativeを用いて実装した。

# 実装
janus gateway のvideo room pluginを使用。本家のjanus.jsはnpmモジュールがないので、自前で実装する必要がある。 この辺りは手抜きした。

# レポジトリ
https://github.com/atyenoria/react-native-janus-gateway-webrtc-video-chat
(面白ければスターお願いします。需要見てます。)

# 懸念点
react-native-webrtcがM58なので古い(現行M63?)


# TODO
- [x] iOS works
- [ ] Android works
- [x] Janus Plugin Demo: Video Room works ( https://janus.conf.meetecho.com/videoroomtest.html )
- [x] Local camera view
- [x] Remote view
- [x] Audio mute
- [x] Video mute
- [x] Audio Speaker 
- [x] Unpublish and publish 
- [x] Switch front and back camera with react-native-webrtc MediaStreamTrack.prototype._switchCamera()
- [x] End call
- [x] Problem: the delay of receving remote viedeos increases when recreating the webrtc session by unpublish/publish. Soulution: use janus.destroy() for republishing instead of unpublish and publish 
- [x] Rerender teh remote video view if others join and leave continuously
- [x] Rerender my video view when publishing and unpublishing
- [x] Switching camera works after recreating the session
- [x] Connecting modal when creating session
- [x] Redux integration
- [ ] Better handling the janus session by simple redux 
- [ ] Better restarting the the janus session by simple queue system
- [x] Text Chat Mock
- [ ] Rich UI
- [ ] Refactor index.js and janus.mobile.js
- [ ] More Details about how to use this Documentation
- [ ] PR to awesome-react-native ( https://github.com/jondot/awesome-react-native )
- [ ] Other Janus Plugin(Audio bridge, Streaming, Sip, Video Call ... etc)


# 展開例
下図の例のように、モバイルからHLSのトランスコーディングを行えば、WEBRTC(~200) + HLS (~ 1000)とかできる（はず）。
https://github.com/atyenoria/janus-webrtc-gateway-docker
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79563/30aff664-3e8f-6b27-262c-182d09d595ed.png)
Wio LTEを使ってみた。

# WioLTEとは
Arduino互換のLTEモデム付きマイコンである。
10000円を切った販売価格によりラズパイ+3G USBドングルといった旧来の方法より若干コスト面でリーズナブルかつスマートな構成が組めるデバイスとして超新星のように登場した。

# 特長
- SIMを挿してすぐIoTデバイスとして活用できる。
- ラズパイだと（ライブラリの準備等で）使うのが面倒なGPIO端子がGroveコネクタとして実装されている。
- 実装面積が小さい。
- 安定している。

# クラウド連携
- Arduino版MQTTクライアントを利用して、一般的なMQTTブローカーとコミュニケーションできる。
- 連携サンプル：[Wio LTE+SORACOM Air/Beamを使いThingScaleに接続する](https://sensinics.atlassian.net/wiki/spaces/TD/pages/91422721/Wio+LTE+SORACOM+Air+Beam+ThingScale)
- HTTPのソケット操作ライブラリもあるので、HTTP POST等も利用可能。
- SORACOM Beam経由でのMQTT連携も問題無し。

# まとめ
プロトタイプ構築時に必要とされている機能が良くまとまっていると感じた。
専用のケースも販売してほしい。
Codilityを解く #1　フィボナッチ数列

##はじめに
最近、[Codility](https://codility.com/programmers/)というプログラミングテストサイトを見つけて、色々な問題に取り組んでいます。
英語圏、外資系企業のプログラマー採用試験としても使われているみたいです。

##問題
以下のJavaScriptコード（フィボナッチ数列の表示）の入出力の関係を崩さずに、
冗長な部分を省き、より速い動作のコードに書き換えよう。
（問題元：[Codilityのトップページ](https://codility.com/programmers/)）
※一般に公開されている問題で、実際の試験問題とは異なります。

```js:Fibo_0.js
var yourself = {
    fibonacci : function(n) {
        if (n === 0) {
            return 0;
        }
        if (n === 1) {
            return 1;
        }
        else {
            return this.fibonacci(n - 1) +
                this.fibonacci(n - 2);
        }
    }
};
```


#アプローチ
####１．n=0,n=1の場合を分けなくてよい。
どちらもnの値を返すという同じ処理なので、分ける必要がない。
「nが1以下の時」と一括りにしてしまおう。

```js:Fibo_1.js
var yourself = {
    fibonacci : function(n) {
        if (n <= 1) {
            return n;
        } else {
            return this.fibonacci(n - 1) +
                this.fibonacci(n - 2);
        }
    }
};
```

####２．elseがいらない。
いちいちelseで分けなくても、n>1のときは勝手に処理してくれる。
n <= 1となれば、関数はnを返して停止する。
else{}も取り払ってしまおう。

```js:Fibo_2.js
var yourself = {
    fibonacci : function(n) {
        if (n <= 1) {
            return n;
        }
        
        return this.fibonacci(n - 1) +
            this.fibonacci(n - 2);
    }
};

```

####３．アキュムレータ関数でもっと簡単にする。
ここが難しい。
今の状態だと、反復動作が多すぎる。
####【例】####
fibonacci(n)をf( n )と表現する。

f( 4 ) 
= f( 3 ) + f( 2 )
= f( 2 ) + f( 1 ) + f( 1 ) + f( 0 )
= f( 1 ) + f( 0 ) + 1 + 1 + 0
= 1 + 0 + 1 + 1 + 0
= 3

右辺に出てくる「f( )」の数が、再帰呼出しの回数である。
n(≧2)の値1つごとに、2回の再帰呼出しが行われており、
その回数はnに対して指数関数的に増大する。→ O（n^2）

計算時間を、なんとか減らせないだろうか？
**アキュムレータ**という、状態を保持する役割の関数を追加して減らしてみよう。


```js:Fibo_3.js
var yourself = {
    fibonacci : function(n) {
        if (n <= 1) {
            return n;
        }
        
       return this.fibonacci_ac(n, 1, 0);
    },

    fibonacci_ac : function (n, prev, ac) {
        if (n <= 0) {
            return ac;
        }
         
        return this.fibonacci_ac(n - 1, ac, prev + ac);
    }
};
```

(例)：n = 4 (答えは3)


|　　n　　|　　prev　　|　　ac　　|
|:-----------------|------------------:|:------------------:|
|　　4　|　　1　　| 0|
|　　3　|　　0　　| 1|
|　　2　|　　1　　| 1|
|　　1　|　　1　　| 2|
|　　0　|　　2　　| 3|

n=0の時のacが出力されるので、出力は3となり正解。
今までの方法(Fibo_2.jsまで)だと、nの数値1つごとに2回再帰呼び出しをしていたが、
この手法ならnの数値一つごとに1回に抑えられる。

n=4　のときの　ac = f( 0 )
n=3　のときの　prev = f( 1-1 ) = f( 0 )　ac =  f( 1 )
...
n=1　のときの　prev = f( 3-1 ) = f( 2 )　ac =  f( 3 )
n=0　のときの　prev = f( 4-1 ) = f( 3 )　ac =  f( 4 )

常にf( n )の値をn = 0 から蓄積することで、いちいち計算する手間を省いている。
f( 3 )まで求めていれば、f( 2 )の値まで分かっているはず。

再帰呼び出しの回数は、表で言うn=3以下の行数なので、O(4)=4。
結果、nに対して線形関数的に増大する。→ O（n）

#終わりに
アキュムレータのもうちょっと分かりやすい説明を考えています。
多分、関数ばらけさせなくても何とかなる。
調べ次第更新予定。
osxでvalgrindが使えないときのtips

#### motivation
- xcodeでプロジェクトを作らないのでinstrumentはそのまま使えない
- valgrindを使っていたがhigh sierraで動かなくなっているらしいので代わりを探している

#### leaks command
- instrumentの一部として入っているleaks command (/usr/bin/leaks) が使えそう。
- ターゲットのバイナリを以下のようにして動かす

  ```
  MallocStackLogging=1 /path/to/debugging_binary
  ``` 

- debugging_binaryの実行中にpidを調べて以下のコマンドを実行する。

  ```
  leaks $PID
  ```

- 以下のようなフォーマットでメモリリークのアドレスとサイズ、メモリのコンテント、またmallocしたときのスタックトレースが見れる。

  ```
  Leak: 0x7fe950b8ea00  size=1536  zone: DefaultMallocZone_0x105c38000
	0x00000000 0x00000000 0x00000000 0x00000000 	................
	0x00000000 0x00000000 0x00000000 0x00000000 	................
	0x00000000 0x00000000 0x00000000 0x00000000 	................
	0x00000000 0x00000000 0x00000000 0x00000000 	................
	0x00000000 0x00000000 0x00000000 0x00000000 	................
	0x00000000 0x00000000 0x00000000 0x00000000 	................
	0x00000000 0x00000000 0x00000000 0x00000000 	................
	0x00000000 0x00000000 0x00000000 0x00000000 	................
	...
	Call stack: [thread 0x70000eb21000]: | thread_start | _pthread_body | _pthread_body | void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, net::NqWorker::Start(moodycamel::ConcurrentQueue<net::NqPacketReader::Packet*, moodycamel::ConcurrentQueueDefaultTraits>&)::'lambda'()> >(void*) type_traits:4291 | net::NqWorker::Start(moodycamel::ConcurrentQueue<net::NqPacketReader::Packet*, moodycamel::ConcurrentQueueDefaultTraits>&)::'lambda'()::operator()() const nq_worker.h:32 | net::NqWorker::Run(moodycamel::ConcurrentQueue<net::NqPacketReader::Packet*, moodycamel::ConcurrentQueueDefaultTraits>&) nq_worker.cpp:28 | net::NqLoop::Poll() nq_loop.cpp:101 | nq::Loop::Poll() loop.h:64 | non-virtual thunk to net::NqDispatcher::OnEvent(int, kevent const&) nq_dispatcher.cpp:0 | net::NqDispatcher::OnEvent(int, kevent const&) nq_dispatcher.cpp:46 | net::NqPacketReader::Read(int, int, net::QuicClock const&, net::NqPacketReader::Delegate*, unsigned long long*) nq_packet_reader.cpp:77 | net::NqPacketReader::ReadPackets(int, int, net::QuicClock const&, net::NqPacketReader::Delegate*, unsigned long long*) nq_packet_reader.cpp:165 | net::NqPacketReader::NewBuffer() nq_packet_reader.h:84 | operator new(unsigned long) | malloc | malloc_zone_malloc 
  ```

- 最初から一緒に実行するのではなく、必要な時に外部から実行できるのでvalgrindだと遅くなりすぎるようなときにも有用かもしれない
Visual Studio | WPF > ソフト操作 > Explorerを起動する > ShellExecute()でなくProcess.Start()を使う方法

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

### 処理概要

外部ソフトを起動したい。

https://qiita.com/7of9/items/a78d42389deda90f5aaa
で使ったようなShellExecute()を利用するかと思ったが、以下を見ていているとProcess.Start()が便利そうとのこと。

https://stackoverflow.com/questions/31144116/shellexecute-vs-process-start

Process.Start()は内部的にはShellExecute()をコールしている。

### 関連

[Visual Studio | WPF > 終了処理 > shutdown | reboot > System.Diagnostics.Process.Start()](https://qiita.com/7of9/items/7bb508290725b5e27479)
にてProcess.Start()は使った。

### code

```MainWindow.xaml
<Window x:Class="_171110_t1525_Explorer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:_171110_t1525_Explorer"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Button Width="200" Height="30" Content="Open Folder" Click="Button_Click"/>
    </Grid>
</Window>
```

```MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace _171110_t1525_Explorer
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var psi = new System.Diagnostics.ProcessStartInfo();
            psi.FileName = "Explorer.exe";
            psi.Arguments = "C:\\";
            psi.UseShellExecute = true;
            psi.CreateNoWindow = true;
            var proc = System.Diagnostics.Process.Start(psi);
        }
    }
}
```

### 実行

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/415612c9-6f1d-7f01-aedd-c78dfb78ad70.png)

ボタンをクリックしたらExplorerが起動してCドライブを表示する。
『独習Git』8章メモ

# 試したコマンド
- git log --parents
- git log --oneling
- git checkout
- git tag

# メモ

## git log, git checkout
- checkoutでHEADが移動する
- 
```
ubuntu# git log --oneline
c16348f tyoi tsuiki
7333e25 tsuiki
3a11407 new file1
15f6de4 rm
7ec8b4b hoge
91d258c reset
3ddd498 mv
b409561 rm
ab37a80 file1
ce41a41 rm
0b03cbe modified
7b578a9 second
ab05ab6 first
ubuntu#
ubuntu#
ubuntu#
ubuntu# git rev-parse HEAD
c16348f4a1b89122a8b888fab3d6ebc40947c1ce
ubuntu# git rev-parse master
c16348f4a1b89122a8b888fab3d6ebc40947c1ce
ubuntu# git checkout 7333e25
Note: checking out '7333e25'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at 7333e25... tsuiki
ubuntu# ls
file1
ubuntu# cat file1
file1
2017-11-10 13:59

ubuntu#
ubuntu#
ubuntu# git log --oneline
7333e25 tsuiki
3a11407 new file1
15f6de4 rm
7ec8b4b hoge
91d258c reset
3ddd498 mv
b409561 rm
ab37a80 file1
ce41a41 rm
0b03cbe modified
7b578a9 second
ab05ab6 first
ubuntu#
ubuntu#
ubuntu#
ubuntu#
ubuntu# git checkout master
Previous HEAD position was 7333e25... tsuiki
Switched to branch 'master'
ubuntu#
ubuntu# git log --oneline
c16348f tyoi tsuiki
7333e25 tsuiki
3a11407 new file1
15f6de4 rm
7ec8b4b hoge
91d258c reset
3ddd498 mv
b409561 rm
ab37a80 file1
ce41a41 rm
0b03cbe modified
7b578a9 second
ab05ab6 first
```

# git tag
Commitしてgit tagでタグを付与する
SHA1 IDではなく、タグで管理できる
Mac homebrew で service 起動した postgresql に接続できないときは、pidファイルが怪しい

私はよくMacのローカルでRails > Postgresqlを動かすのですが、以下のようなエラーに悩まされたりすることがたまにあります。

~~~
#<PG::ConnectionBad: could not connect to server: Connection refused
	Is the server running on host "localhost" (::1) and accepting
	TCP/IP connections on port 5432?
could not connect to server: Connection refused
	Is the server running on host "localhost" (fe80::1) and accepting
	TCP/IP connections on port 5432?
could not connect to server: Connection refused
	Is the server running on host "localhost" (127.0.0.1) and accepting
	TCP/IP connections on port 5432?
~~~


# restartしてもだめ

~~~
$ brew services restart postgresql
$ ps aux | grep postgresql
soeda            13514   0.0  0.0  2443044    808 s001  S+    3:04PM   0:00.00 grep postgresql
~~~

プロセスisない

# 結局postgresqlをuninstallしてinstall

~~~
$ brew uninstall postgresql
$ rm -rf /usr/local/var/postgres
$ brew install postgresql
~~~
これで直りますけど、DB再作成などしなきゃでしんどい。

# PIDファイルっぽい
https://stackoverflow.com/questions/19828385/pgconnectionbad-could-not-connect-to-server-connection-refused

~~~
$ brew services start postgresql
$ ps aux | grep postgresql
soeda            13514   0.0  0.0  2443044    808 s001  S+    3:04PM   0:00.00 grep postgresql
~~~

実際のプロセス確認しようにも、そもそも起動できてないですね

~~~
$ cat /usr/local/var/postgres/postmaster.pid 
13457
/usr/local/var/postgres
1510293800
5432
/tmp
localhost
  5432001     65536
~~~

PIDファイルはあるな...
（通常通りstopしてもPIDファイルはあるみたい）

~~~
$ brew services stop postgresql
$ rm /usr/local/var/postgres/postmaster.pid
~~~

PID消してみた

~~~
$ brew services start postgresql
$ ps aux | grep postgresql
soeda            13514   0.0  0.0  2443044    808 s001  S+    3:04PM   0:00.00 grep postgresql
soeda            13457   0.0  0.1  2605700  13796   ??  S     3:03PM   0:00.03 /usr/local/opt/postgresql/bin/postgres -D /usr/local/var/postgres
~~~

動いた！

# 考察
brewが管理できないところでpostgresqlプロセスが落ちてしまって、PIDファイルでのプロセス管理が破綻して起動できなかった？
Ruby on Rails　ソースファイルの読む順序について


# Ruby on Rails　ソースファイルの読む順序について

## はじめに

かの有名なRuby on Rails チュートリアルを実施していたのですが、
ソースファイルの数が増えたり、章によって作成、編集するソースファイルの順序が異なったりしており、
どのような順序で読み解くのかが分からなくなってきましたので、整理の意味も込めてまとめます。


## MVC（Model-View-Controller）と全体の処理の流れ

前提として、MVC（Model-View-Controller）について触れたいと思います。
Railsでは、MVCというアーキテクチャパターンを採用しています。

- Model:Viewにて表示するためのデータの集積
- View:Modelのデータの表示
- Controller:リクエスト全体のコントロール

上記内容を踏まえて、全体の処理の流れを簡単に説明すると、以下の通りとなります。

1. リクエスト内容からどのコントローラに振り分けるかを特定
1. 該当コントローラにて処理を実施（Controller）
1. 場合によってはデータベースへのアクセス、その他必要なデータに関する処理を実施（Model）
1. HTML、JavaScript、JSON等を生成し、ブラウザにて描画（View）


## フォルダ構成

Ruby on Rails チュートリアル実施時に作成したディレクトリ構成（抜粋）とそれぞれの役割についてまとめます。

・
├── app
│   ├── controllers （リクエストのコントロール）
│   ├── helpers     （各種メソッド）
│   ├── models      （データベースへのアクセス、その他必要なデータの集積）
│   └── views       （HTML、JavaScript、JSON等の生成）
├── config          （各種設定（そのうち、本稿で重要なものはルーティングの設定））
└── db              （DBの構成）


## ソースファイルの読む順序

上記内容を元に、ソースファイルの読む順序をまとめます。

1. リクエストがどのURLかを特定する。（GETであればURLから、POSTであれば __app/views__ 配下のソースから特定する。）
1. __config/routes.rb__ を読み、URLのリクエストからコントローラ、アクションを特定する。
1. __app/controllers/[該当コントローラ]\_controller.rb__ を読み、その中の該当アクションの処理を読む。
1. 必要に応じて、__app/models/[該当モデル].rb__ や __db/schema.rb__ 内の該当DBの構成を読む。
1. 必要に応じて、__app/helpers__ 内のファイルを読む。
1. コントローラのファイルが読み終わったら、__app/views/layouts/application.html.erb__ を読む。
1. 必要に応じて、パーシャル（__app/views/__ 内のアンダースコアから始まるファイル）、
   __app/views/[該当コントローラ]/[該当アクション].html.erb__ 、
   __app/helpers__ 内のファイルを読む。


## まとめ

基本的には、config(routes.rb)、controllers、viewsの順に読む。
controllers、viewsの内容に応じて、models、db、helpersを読む。

もちろん、プロジェクトによって例外はあると思いますので、参考程度に留めておいてください。