OmniAICreator/Qiita-1.07M huggingface dataset:
eosio.sudo の役割

EOS　の公式コントラクトとして、下記あります。

- [x] eosio.bios　紹介記事 [eosio.bios の役割 - Qiita](https://qiita.com/blueplanet/private/85fba0513fe2bd535909)
- [x] eosio.msig　紹介記事　[EOS のアカウント・ロール・権限　応用編 - Qiita](https://qiita.com/blueplanet/items/2e6148ab02f56d22c229)
- [ ] eosio.sudo
- [x] eosio.system　紹介記事 [eosio.system の役割 - Qiita](https://qiita.com/blueplanet/items/92bede3e13e67cfc0a73)
- [x] eosio.token 紹介記事　[eosio.token コントラクトを解読してみる - Qiita](https://qiita.com/blueplanet/items/dad6ffce0e5d5f583f3f)

今回は、最後の`eosio.sudo` を読んでみます。

## ソース
意外に内容が少ないです。
処理では、標準のアクションではなく、処理の中 `read_action_data` を使って独自でパラメータを解析しています。
ソースにインラインでコメントして行きます。

### eosio.sudo.hpp

```c++
#pragma once

#include <eosiolib/eosio.hpp>

namespace eosio {

   class sudo : public contract {
      public:
         sudo( account_name self ):contract(self){}

         void exec();

   };

} /// namespace eosio
```

### eosio.sudo.cpp

```c++
#include <eosio.sudo/eosio.sudo.hpp>
#include <eosiolib/transaction.hpp>

namespace eosio {

/*
exec function manually parses input data (instead of taking parsed arguments from dispatcher)
because parsing data in the dispatcher uses too much CPU if the included transaction is very big

If we use dispatcher the function signature should be:

void sudo::exec( account_name executer,
                 transaction  trx )
*/

void sudo::exec() {
   // 認証確認
   require_auth( _self );

   // この４行は、手動でアクションのデータを取得しています。理由は、冒頭のコメントによると、CPU を節約するためです
   constexpr size_t max_stack_buffer_size = 512;
   size_t size = action_data_size();
   char* buffer = (char*)( max_stack_buffer_size < size ? malloc(size) : alloca(size) );
   read_action_data( buffer, size );

   account_name executer;

   // この2行は、取得したアクションデータから、アカウントを解析し、`executer` 変数に設定しています
   datastream<const char*> ds( buffer, size );
   ds >> executer;

   // 実行者の確認
   require_auth( executer );

   // アクションデータから、２番めのパラメータのポインター位置を取得する
   size_t trx_pos = ds.tellp();
   // 遅延トランザクションを送信する（遅延時間は 0 ）
   send_deferred( (uint128_t(executer) << 64) | current_time(), executer, buffer+trx_pos, size-trx_pos );
}

} /// namespace eosio

EOSIO_ABI( eosio::sudo, (exec) )
```

## 結局何をやってるの？
`EOS` は、ガバナンス仕組みがあります。ECAF　によって、21 個の BP の中、15 個の認可を貰えば、アカウントのオーナーキーを変更したり、コントラクトを変更したりすることができますが、この過程は不透明であるため、もっとシンプル、かつ透明化するために、`eosio.sudo` コントラクトが設けられました。

こうすることで、たとえ、ECAF の投票によって、`hackaccount1`の `active` キーを変更したい場合、下記のように実行することになります。

```shell
# トランザクションデータを change.json に作成する
$ cleos set account permission -s -j -d hackaccount1 active EOS4uY...HJR owner > change.json

# wrap コントラクトの exec アクションを実行する
$ cleos wrap exec hackaccount1 change.json
```

## EOS ネットワーク上の立ち位置
- `EOS` のメインネットでは、`eosio.wrap` アカウントにデプロイされています
- もともとコントラクトは `eosio.sudo` となっていますが、`sudo` は、Linux の場合、スーパー権限を持っていて、一旦認可しておくと一定時間内で再認可なしで権限を持てるようになっているので、**`EOS` の場合もスーパー権限持ってるの？　一定時間内で権限を持つままになるの？** と誤解しやすいので、`eosio.wrap` アカウントにデプロイされています

## まとめ
これで、公式のコントラクトを一通り確認しました。
Jupyter Notebookでjulia ノートをmodule化?したい->nbinclude

[「IPythonでNoteBookをモジュールとしてインポートする方法」](https://qiita.com/tdual/items/32d3918b4c8dd1f703e7)を見て`julia`でもやりたくなったわけです．
# ノートを跨って関数を使いたい時
[NBInclude](https://github.com/stevengj/NBInclude.jl)のパッケージを使用して

```
using NBInculde
@nbinclude("hoge.ipynb")
```
とすることで使えるようになる．
GCP MarketPlaceからWordPress環境を5分で構築する


Wordpressを使ってみる必要があったので、
ローカルに構築しようと思ったけど、MySQL入れたり割と面倒だったので
いっそのことGCPの無料枠で使ってみようかと思い構築してみました。

MarketPlace使えば一瞬という話ですが、真相は如何に
（ちなみに最近GCP触り始めたのでMarketPlace使うのも初めてです）


#### プロジェクトを作成

対象のプロジェクト名を入力して作成ボタンをクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/243163/b0026871-d313-c4a5-9a7a-596f6cc4a521.png)

#### WordPressをデプロイ

MarketPlaceから「WorkPress(Google Click to Deploy タイプ 仮想サーバー)」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/243163/4709bff8-1a8f-7117-be05-5c9129429984.png)

「COMPUTE　ENGIN上で起動」をクリック

![image.png](https://qiita-image-store.s3.amazonaws.com/0/243163/2daccdee-3645-e02a-a227-bc681947451f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/243163/c37110a1-703a-60c7-7126-e46fcc94a822.png)

「デプロイ」ボタンをクリックすると数分で環境が構築される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/243163/5579ce95-0338-17a8-3cef-272282ade2d1.png)

## WordPressにログインする

環境構築完了後表示されるWordPressの構成情報にサイトおよび管理画面のURLを記載されている。
（したの方にユーザーとパスワードも）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/243163/399c4071-9db6-c825-c3f5-80b00a1faa2f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/243163/2f69f988-cb10-c0d3-a98e-ceb692d766d5.png)

あとは、Wordpressの管理画面から記事を書いたりPlugin入れたり色々できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/243163/59160c36-3239-3e2c-9879-fb63b502258e.png)

# 結論

まじで5分でできた！
構成情報から、次の操作へのリンクなどが漏らさずついてるなど
GCPは本当にUIが素晴らしいですね
ZenjectはどうやってAwakeより先にInjectできるの？

# はじめに
この記事は [CyberAgent Developers #2 Advent Calendar 2018](https://adventar.org/calendars/2953) の19日目の記事です。
昨日は [med-orange](https://qiita.com/med-orange) さんの [C# 7.2: in パラメータ修飾子](https://qiita.com/med-orange/items/b49ca4fc0e8604d83eb2) でした。

どうも！株式会社サムザップで Unity/C# エンジニアをしている二宮です。
[リンクスリングス](https://linqsrings.jp/)のバトル部分で、サーバとクライアントの両方を担当しています。

リンクスリングスでは、[Zenject](https://github.com/svermeulen/Zenject)という、Unity用に設計されたDIフレームワークを利用しています。
このZenjectの挙動の中でどうやって実現しているのか気になるところがあったので、今回はそこを掘り下げていこうと思います。

# Zenjectでは何ができるのか
まず、軽くZenjectの機能に触れておきますね。

Zenjectは、
1. コンテナにBindして、
2. それをフィールドやメソッド、コンストラクタなどにInjectすることができる
シンプルなフレームワークになります。

例えば、下記のFooInstallerとFooTestの両方をシーンに配置して、UnityをPlayすると、FooTestのAwake時には、_foo変数へのInjectが済んでいる状態になります。

```
class FooInstaller : MonoInstaller<FooInstaller>
{
    public override void InstallBindings()
    {
        Container.Bind<Foo>().AsSingle();
    }
}

class FooTest : MonoBehaviour
{
    [Inject] Foo _foo;
    // Awake時にはFooが代入されている状態になる
}
```

さらに、シーン配置オブジェクトだけにとどまらず、Prefabからの動的生成時も可能です。

```
GameObject gameObject = Container.InstantiatePrefab(MyPrefab);
```

# 疑問

Attributeつけるだけで、事前に設定したインスタンスをInjectしてくれるなんて、なんて便利なんだろう、、！
しかもAwake時点でInjectされた変数を使えるとか素敵、、、！


ん？？？


<b>「あれ、AwakeってInstantiate時に呼ばれていなかったっけ、、、？この代入処理っていつしてんの、、、？」</b>

```
var instance = UnityEngine.Object.Instantiate(_prefab);
// この時点でAwakeが呼ばれていたような、、、？
```

というわけで、題名の通り、なんでAwakeより先にInjectできるのかが気になりました。

# 調べてみる

さて、調べてみました。
知ってしまえばすごく単純です。

最初に紹介した２つのパターンは別々の方法で実現されています。

## シーン配置オブジェクトのAwakeが呼ばれる前にInjectできる理由
これは、イメージ通りというか、すごく単純でした。

UnityのScript Execution Order設定を利用します。
同時に生成されたコンポーネントの実行順を定める設定ですね。

そうするとシーンロードやEditorPlay時には、こんな流れで実行されます。

1. Script Execution Orderにより、MonoInstallerのAwakeが最速で呼ばれる
2. (Awake内処理) Bind処理を実行
4. (Awake内処理) 全てのコンポーネントを取得し、Inject Attributeを探索
5. (Awake内処理) Inject対象にインスタンスをInject
6. Inject済みコンポーネントのAwakeが呼ばれる

これで、Awakeよりも先にInjectが済んでいるんですね、なるほどなるほど。


## Prefabから動的に生成したObjectのAwakeが呼ばれる前にInjectできる理由

さて、Prefabから生成する場合にはどうでしょう。
当然、ExecutionOrderのパターンは使えません。

何しろ、
```UnityEngine.Object.Instantiate(_prefab) ```
という関数を通って次の行に処理が移るときには既にAwakeが呼ばれてしまっています。

さて、Zenjectではどうやって解決しているでしょうか。

で、コードを読んでいったところ、<b>AwakeはgameObjectが非アクティブであれば呼ばれない</b>という性質を利用しているようでした。

つまり、とっても簡略化すると```Container.InstantiatePrefab(MyPrefab)```はこんな感じ。

```
var isActive = prefab.gameObject.activeSelf; // prefabのActive状態を保持
prefab.gameObject.SetActive(false); // prefabを非アクティブ化
var instance = UnityEngine.Object.Instantiate(prefab); // 非アクティブなインスタンスを生成
// ここでInject処理
instance.SetActive(isActive); // アクティブ状態をprefabの状態に戻す
return instance;
```

# 終わりに
最終的に、Unityコールバッククイズみたいになってしまいましたが、面白かったでしょうか。
「gameObjectが非アクティブだとAwakeを待てる」というのは、覚えておくと結構いろんな処理で使えるかもしれないですね。
web3.eth.signのwrap

#web3.eth.signのwrap

truffleを用いて開発しているときに，詰まったのでメモ

- truffleHDwalletProviderを使って，testnetでテストするとtruffleHDwalletProviderはweb3(v0.0.2)でweb3(v1.0.0)にはなっていない．
	
- web3(v0.0.2)のweb3.eth.signはpromiseで返っていないので，同期的処理になりtruffleHDwalletProviderでは非同期的な処理しか認めていなく，エラーとなる．

 web3.eth.signをdocumentにしたがってcallbackするように書くと以下のようになる．

```javascript

// wrap
 web3.eth.sign(organizer,hash, function(error, result){
              if(!error)
                  console.log(JSON.stringify(result));
              else
                  console.error(error);
           })
```


実際にwrapしたものを利用してテスト

```javascript:test.js
 it("create hashs and  signature",async() => {
 
         const organizer = await accounts[0]

         const hash = await web3.sha3("0x11")
 
         web3.eth.sign(organizer,hash, function(error, result){
             if(!error)
                 console.log(JSON.stringify(result));
             else
                 console.error(error);
          })
     })
```

##参考
web3ドキュメント
https://web3js.readthedocs.io/en/1.0/
https://github.com/ethereum/wiki/wiki/JavaScript-API
ElixirのPhoenixでUDPサーバを実装する

この記事は [mixiグループ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/mixi) の20日目の記事です。

[去年](https://qiita.com/kodam/items/3e4988ac8f0c2920935a)はネットワークプロトコルのポエムを書いたので、今年は実際にUDPサーバをelixirで実装してみました。去年はめっちゃQUIC推しだったのにQUIC実装じゃないんかいって思うかもですが、QUICについてはvさんに期待してます。まぁQUICを実装するためにはそもそもUDPをいじれる土台を作らないとだめなので、これをベースに遊べればいいなと思ってます。

そういえば、WebSocket2(WebSocket over http/2)がdraftから[PROPOSED STANDARD](https://tools.ietf.org/html/rfc8441)になりましたね。素晴らしい。0RTTでWebSocketがリコネクトできる時代が早く来てほしいです。

# UdpPhx
早速本題ですが, [udp_phx](https://github.com/oppai/udp_phx) というPhoenixの上にUDPのサンプルサーバを作ってみました。

Phoenixのsupervisorに作ったUDPサーバをぶら下げて、phx.serverを立ち上げるとPhoenixアプリケーションのいち部としてUDPサーバが立ち上がります。

Dockerfileを付属したのでDocker環境がある人は簡単に立ち上げられると思います。

```shell
git clone github.com:oppai/udp_phx
cd udp_phx
docker-compose build
docker-compose up -d

# Webサーバに接続
curl -i 0.0.0.0:4000/hello
# UDPで接続
nc -u 0.0.0.0 8080
< aaaa
> {:udp, #Port<0.6206>, {172, 26, 0, 1}, 52430, "aaaa\n"}>
```

ローカルの8080ポートにマッピングしてるので、ncコマンドで接続することができます。入力しデータに対してinspectした結果をそのまま返しています。タプルの先頭から、パケットの種類、Socketオブジェクト、送信側ホスト、送信側ポート、データ領域です。

コアになるアプリケーションは [UdpPhxUdp.Application](https://github.com/oppai/udp_phx/blob/master/lib/udp_phx_udp/application.ex) モジュールで　erlangの `:gen_udp` をElixirの `GenServer` でWrapしたものです。構成はPhoenixに則って、 Webサーバと同じ階層にUDPサーバを作りました。

```elixir
defmodule UdpPhxUdp.Application do
  @moduledoc """
    深く考えず作ったためにudpという文言が2つもついてしまった気持ち悪いアプリケーション
  """
  use GenServer
  require Logger

  def start_link(port \\ 12345) do
    Logger.info("UDP server binding #{port}")
    GenServer.start_link(__MODULE__, port)
  end

  def init(port) do
    :gen_udp.open(port, [:binary])
  end

  def handle_info({:udp, socket, host, port, _} = data, server_socket) do
    :gen_udp.send(socket, host, port, "#{inspect(data)}>\n")
    {:noreply, server_socket}
  end
end
```

今回作成したソースコードはGitHubにあげてるのでご自由にどうぞ。 

https://github.com/oppai/udp_phx

本当はデモサーバをHerokuに上げたかったのですが、Herokuはランダム設定されたポートを `$HOST` に保存して80/443をフォワーディングする仕組みになっており、任意のポートを利用することができませんでした。 またポートのLISTENがTCPにしか許可されない様で、指定されたランダムポートをUDPでLISTENしたところ、PermissionErrorが返ってきました、残念😢


# Elixirのパタンマッチを使ってデータをハンドリング
データをパターンマッチでハンドリングできることがElixirでUDPを扱うメリットかなと思います。
先程の `handle_info/2` をデータ拡張してみます。

```diff
+  def handle_info({:udp, socket, host, port, "ping\n"}, server_socket) do
+    :gen_udp.send(socket, host, port, "pong\n")
+    {:noreply, server_socket}
+  end

  def handle_info({:udp, socket, host, port, data}, server_socket) do
    :gen_udp.send(socket, host, port, "#{inspect(data)}>\n")
    {:noreply, server_socket}
  end
```

"ping"という文字列が来たときに"pong"と返す事ができるようになりました。またElixirはバイナリデータのパタンマッチもすることができるので、文字列だけじゃなくてバイナリデータに対しても簡単にハンドリングすることができます。便利。

# 感想

折角UDPサーバ作ったので次は簡単なUDPアプリケーションを作ってみたいなと思います。通信速度が早い今の時代UDPのサーバなんて作る必要ないと思いますが、PhoenixだけでRESTAPI/WebSocket/UDPというマルチサーバを作ることができます。何よりSupervisorの上に乗っかってるのが安心できますよね。

実はTCPのパケットがどの様に再送するのかとか、巨大なUDPが送られて欠損したときにどのようなデータが受信されるのかとかあまり理解してないので、気が向いたときにこのサーバを使って実験しようと思います。
WarningによるPHPUnitのエラーを抑制してテストケースを実行したい

#目的

PHPUnitにてWarningが例外化されテストケースがエラーとして処理されてしまった。
テストケース内で想定していた業務エラーとして扱えないのでWarningを抑制したい。[^1]

#状況

PHPUnit実行でテストケース結果でエラーが返ってきた。[^2]
今回はopenssl_x509系関数のWarningが原因となっている模様。

```bash
openssl_x509_read(): supplied parameter cannot be coerced into an X509 certificate!
```

#(対応パターン1) PHPUnitの設定で抑制する

対象のテストケースで以下の様にする。

```php5
public function testXXX(){
    $orig = PHPUnit_Framework_Error_Warning::$enabled;
    PHPUnit_Framework_Error_Warning::$enabled = false;

    //（Warningが発生するテスト）

    PHPUnit_Framework_Error_Warning::$enabled = $orig;
}
```

全体に影響してもいいならsetUp()、tearDown()内でも実施可能。

[参考 stackoverflow.com](https://stackoverflow.com/questions/8412746/ignoring-the-php-warnings-in-phpunit)

エラーが抑制され想定通りテストケースが通る様になるが以下のメッセージ出力は残る。

```bash
Warning: openssl_x509_read(): supplied parameter cannot be coerced into an X509 certificate!
```

#(対応パターン2) Warningの例外化をキャッチし抑制する[^3]

対象のテストケースで以下の様にする。

```php5
public function testXXX(){
    set_error_handler(function($errno, $errstr, $errfile, $errline) {});

    //（Warningが発生するテスト）

    restore_error_handler();
}
```

エラーが抑制された状態となりWarningメッセージ出力も無くなった。

# 参考

[PHPUnitでwarningもエラーとして扱う]
(https://nob-log.info/2014/02/17/catch-php-warnings-and-notices-when-unit-testing/)

[^1]: アンチパターン的な要素が大きいので、副作用等を想定しつつ状況に応じて対応を すべき。 

[^2]: 環境はPHP5系

[^3]: いわゆる握り潰し的な感じ
Koinのモジュールを動的に読み込む

| 環境 | バージョン |
| :--: | :--: |
| Koin | 1.0.2 |

Android アプリ開発で Dynamic Feature Module 等であとから機能を追加したりする場合に、あとから Koin のモジュールを読み込みたいことがあります。また、Activity や Fragment のインスタンス単位でスコープを切りたい場合にも動的にモジュールを追加したいかもしれません。

そんなときは `loadKoinModules` を使ってモジュールを動的に読み込むことができます。
これと scope をうまく組み合わせると Activity や Fragment のインスタント単位でのインジェクションができます。

```MyActivity.kt
class MyActivity : AppCompatActivity() {
    private val myViewModel: MyViewModel by viewModel()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val scope = hashCode().toString()
        loadKoinModules(module {
            scope(scope) { MyDispatcher() }
            scope(scope) { MyActionCreator() }
            viewModel { MyViewModel() }
        })
        bindScope(getOrCreateScope(scope))
    }
}
```

テストを考えるならメソッドに切り出してしまうなどすれば良さそうです。

```AbstractActivity.kt
abstract AbstractActivity : AppCompatActivity() {
    abstract fun getModule(scope: String): Module
}
```

```MyActivity.kt
class MyActivity : AbstractActivity() {
    private val myViewModel: MyViewModel by viewModel()

    override fun getModule(scope: String) = module {
        scope(scope) { MyDispatcher() }
        scope(scope) { MyActionCreator() }
        viewModel { MyViewModel() }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val scope = hashCode().toString()
        loadKoinModules(getModule(scope))
        bindScope(getOrCreateScope(scope))
    }
}
```
Serverless framework & Express & APIGateway でCORS対応

CORS(Cross-Origin Resource Sharing)問題は、ローカルで開発してるときにサーバで動いているAPIを叩こうとしたときに、Chrome等のWebブラウザでエラーになり怒られます。

この対処をすることで、ローカルでもAPIを叩くことが出来るので、

AWSのコンソールでポチポチせずに、CORS対応したかったのですが、中々ハマったのでメモ。
(実際には、CloudFrontの設定が必要なので、0ポチは無理でしたorz)
## 環境
- Serverless framework 1.20.2


## Express側ですること

`serverless.yml` を以下のように編集します。

```yaml
# serverless.yml
functions:
  app:
    handler:index.handler
    events:
      - http:
          path: /{proxy+}
          method: any
          cors: true
```

**cors** 対応するだけなら、trueに指定するだけなのですが、 `express-on-serverless` を使いたかったがために、methodの設定に苦しみました。

ちなみに、 `express-on-serverless` の デフォルトの書き方だと、下記のようになっており、 `http: any {proxy+}` をどうにか別の書き方で書きつつ、 `cors: true` をしようとすると上記のようになります。

```yaml
# serverless.yml
functions:
  app:
    handler:index.handler
    events:
      http: any {proxy+}
```

## CloudFrontですること
**もし、API GatewayをCloudFront通さずに利用しているのであれば、この作業は不要です。**

ここだけAWSのコンソールをいじります（（泣）

API GatewayのBehaviorで `Origin` ヘッダーだけ通します。
![cloud.png](https://qiita-image-store.s3.amazonaws.com/0/82779/6caf3137-cdf1-d635-08ef-a39b8e4c31db.png)

以上で設定は終了です！


## まとめ
- Serverlessでcors対応するなら、 cors: trueをするだけ
- express-on-serverlessを使うなら、1工夫しましょう
- CloudFrontを通してApi Gatewayを利用するなら、Originヘッダーを通しましょう。

以上です。ここまで、読んでくださりありがとうございました。
Oculus Go の Unity InputManager 設定

Oculus GoにおけるInputManagerの設定方法を調べていて、 [UnityEngine.InputでOculus Goのコントローラを使う](https://qiita.com/hilohiro/items/7f83da4da8386c892de6) という記事に辿りついたのですが、どうやら期待した結果にならない模様。手元のGoでもダメだったので、調べました。

Oculus Go の設定でコントローラーの持ち手を「右手」「左手」と変更できますが、この設定内容によって結果が違うようです。

## Unityバージョン

- 2018.2.19
- 2018.3.0

## 結果

### 左手設定

| 機能名                     | InputManagerの指定                                    |
|----------------------------|-------------------------------------------------------|
| トリガーボタン             | "joystick button 14"                                  |
| バックボタン               | "joystick button 1" + Positive buttonに "escape" 指定 |
| タッチパッド(接触)         | "joystick button 16"                                  |
| タッチパッド(押し込み)     | joystick button 8"                                    |
| タッチパッド(左右スライド) | "X axis"                                              |
| タッチパッド(上下スライド) | "Y axis"                                              |

### 右手設定

| 機能名                     | InputManagerの指定                                    |
|----------------------------|-------------------------------------------------------|
| トリガーボタン             | "joystick button 15"                                  |
| バックボタン               | "joystick button 1" + Positive buttonに "escape" 指定 |
| タッチパッド(接触)         | "joystick button 17"                                  |
| タッチパッド(押し込み)     | joystick button 9"                                    |
| タッチパッド(左右スライド) | "4th axis"                                            |
| タッチパッド(上下スライド) | "5th axis"                                            |

## 参考情報

- [UnityEngine.InputでOculus Goのコントローラを使う](https://qiita.com/hilohiro/items/7f83da4da8386c892de6)
- [Unity XR Input](https://docs.unity3d.com/2018.2/Documentation/Manual/xr_input.html)
FatalThrowableError in ConfigureLogging.php

とある既存プロジェクトの環境構築にて
---

　これは Laravel 5.1 導入時のエラーです。5.2, 5.3 も同じく出ると思います。検索からこのページにたどり着いた人は正解がここに記載されていますのでご熟読ください。

　年末も差し迫ったある日「Vagrant boxあるのでよろしく」と引き継いでようやくたどり着いたLaravelの画面ですが、いきなりエラーです。なかなか解答にたどり着けなかったのでここにポストしておきます。

```
FatalThrowableError in ConfigureLogging.php line 59:
Call to undefined method Illuminate\Foundation\Bootstrap\ConfigureLogging::configureHandler()
in ConfigureLogging.php line 59
at ConfigureLogging->configureHandlers(object(Application), object(Writer)) in ConfigureLogging.php line 29
at ConfigureLogging->bootstrap(object(Application)) in Application.php line 203
at Application->bootstrapWith(array('Illuminate\Foundation\Bootstrap\DetectEnvironment', 'Illuminate\Foundation\Bootstrap\LoadConfiguration', 'Illuminate\Foundation\Bootstrap\ConfigureLogging', 'Illuminate\Foundation\Bootstrap\HandleExceptions', 'Illuminate\Foundation\Bootstrap\RegisterFacades', 'Illuminate\Foundation\Bootstrap\RegisterProviders', 'Illuminate\Foundation\Bootstrap\BootProviders')) in Kernel.php line 222
at Kernel->bootstrap() in Kernel.php line 117
at Kernel->sendRequestThroughRouter(object(Request)) in Kernel.php line 87
at Kernel->handle(object(Request)) in index.php line 53
```

原因は、 config/app.php の log パラメータでした。'daily'にして動作確認したらビンゴでした。

```
    'log' => 'daily',
    //'log' => env('APP_LOG', 'daily'),
```

env関数はphpdotenvというライブラリを使用して .env ファイルを読みに行きくとのことで設定されていた値は何もありません。

```
APP_LOG=
```
んー
エラーを吐いたコアの関数を眺めてると

```
    /**
     * Configure the Monolog handlers for the application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @param  \Illuminate\Log\Writer  $log
     * @return void
     */
    protected function configureHandlers(Application $app, Writer $log)
    {
        $method = 'configure'.ucfirst($app['config']['app.log']).'Handler';

        $this->{$method}($app, $log);
    }

```

はあ、 'configureHandler'という文字列を作ってそのメソッドを呼び出そうとしてました。
それは例外出るでしょーと後から納得。とりあえず'daily'で存在するメソッド呼びましょう。

あー、ソースコード修正じゃなくて .env に daily 設定の方がいいですね。こちらでも動作確認OKということで無事解決。

```
APP_LOG=daily
```

そこそこタイムロスでした。
pythonでプロセスの多重起動を防ぐ

python3系でプロセスの2重起動とかの多重起動を防ぐ方法です。

多重起動を防ぐ一般的な方法としては大体以下の２つかと。

- ロックファイルを作る
- プロセスの状況をOSなどから監視する

ロックファイルは、プロセスkillしたりすると起動しなくなったりであまり好きじゃないです。

プロセス監視はシェルからの例が多くて、pythonそのものやっている例があまりなかったので以下に記載しておきます。

```python:sample.py
# -*- coding: utf-8 -*-
from os import path
import subprocess

# 2重起動を防ぐ
file_name = path.basename(__file__)
p1 = subprocess.Popen(["ps", "-ef"], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", file_name], stdin=p1.stdout, stdout=subprocess.PIPE)
p3 = subprocess.Popen(["grep", "python"], stdin=p2.stdout, stdout=subprocess.PIPE)
p4 = subprocess.Popen(["wc", "-l"], stdin=p3.stdout, stdout=subprocess.PIPE)
p1.stdout.close()
p2.stdout.close()
p3.stdout.close()
output = p4.communicate()[0].decode("utf8").replace('\n','')

if int(output) != 1:
    exit()
```

自身のファイル名を調べて、同じ名前のプロセスが1個でなかったら、処理をそのまま停止しています。

1個なのは起動したスクリプトです。

間にpythonという名前でgrepしているのは、viewとか他のプロセスの起動で邪魔されないことと、grepのプロセスそのものを排除しています。

プログラムの頭にあるともっさりしていますが、重い処理の時はそれなりに便利です。
ホラクラシーとブロックチェーン

この記事はウェブクルー Advent Calender2018 20日目の記事です。
昨日は@yagiyuuuuさんの「新卒が便利と感じたEclipseのショートカット集」でした

## はじめに
<p>本記事でお話させていただくのは新しい組織形態として、昨今注目を浴びているホラクラシーと仮想通貨を支える技術として話題のブロックチェーンとの関係性について。</p>
まずホラクラシーの説明をする前に重要なポイントに触れる必要がある。
それは会社が組織形態を持つ意味についてである。

## 会社という形態をなす意味とは
会社において一人の人がすべてのタスクをこなすことは難しい。小規模の会社であれば、可能な事もあるかもしれないが一般的には会社の規模がスケールすればすれほどタスクの総量も同時にスケールしていく、さらに各種タスクにおいて高度な専門性が要求される。
この仕事をすべて一人で行なうことは不可能であり、会社の中ではおのずとタスクは各個人に分散されていき、人々が深く絡みながら運営される。

また会社は資産を保有している。それは金融資産だったり、物的資産であったり、培ってきた専門性も情報的資産として保護されなければならない。

このような状況の中で、会社という形をとらない場合にどうなるだろうか?

すべての関係する個人個人と一つ一つのタスクについてどれだけの金融および物的資産を使用してよいか/どれだけの情報資産にアクセスできるか/どこまでが責任範囲となるか/どのような報酬であるか等を決めて契約する必要がある。

この莫大な契約コストを無くし必要な専門性を持ったメンバーを確保するために会社という限られたメンバーだけのグループを作ることで包括契約を行なっているのが会社の機能的な意味である。

裏を返せばこの契約が明確な形で、時間を掛けずに実行できるのであれば機能的な面においては会社という組織を保つ必要はなくなる。
それを実現するのがブロックチェーンである。

## ブロックチェーン
ブロックチェーンの説明については、様々な書籍や記事で詳述されているのでここでは割愛する。

ブロックチェーンは、契約の簡略化(スマートコントラクト)を急激に加速させる。
ネットオークションはブロックチェーンのベネフィットを語る上で、いい例であろう。
例えばメルカリやヤフーオークションといったサービスは、ユーザとユーザを紐づけるプラットフォームを提供すると共に品物の授受と代金の支払いの信頼性を担保することで手数料を取得している。
ブロックチェーンにおいてはこの集権的な役割は不要である。ブロックチェーンのネットワークに一旦参加さえすれば、そのネットワーク内すべての個人が潜在顧客であり、取引時の金額の誤魔化しや物品の所有権に関する問題は発生せずに取引が出来る。
ブロックチェーンは価値の移動と所有権の記録を自動的にすべて改ざんなく実施してくれるので、相手のユーザが信頼に足るものがどうかは関係ない。

これは上記で述べた会社にも応用できる。

個人が必要な条件や役割を定義してそれをブロックチェーン内に発布すれば、あるユーザがこの条件を受諾さえすれば契約成立である。
タスクが完遂したかどうかにより、自動的に価値の授受が行なわれるので、報酬の未払いを心配する必要がない。
または会社側は必要なときに必要な専門性を持ったメンバーを確保できる。

ただ会社の形態そのものをなくすという現象にたどり着くまでには、相当の日数が必要であろう。
前段階的にこのアドバンテージを享受するために、組織内で広まっているのがホラクラシーというあり方である。

## ホラクラシー
テクノロジーの発展と共に組織のあり方も変化してきた。一般的に知られている人が人を管理する集権的なヒエラルキー型組織、職能と関連性で二方向に管理されるマトリクス型組織そして中央集権的を排除したホラクラシー型組織である。

そもそもホラクラシーとは、1967年に発売された本(Arthur Koestler's 1967 book The Ghost in the Machine)の中で造成されたholarchyという単語からきておりholarchyというのはholon(それ自体が部分であるが、全体の一部としての性質も持つもの)同士のつながりを意味している。

組織の中でholonとなるのは役割(ロール)である。

ホラクラシーでは管理者を持たずに決められた範囲内のロールの中で、意思決定はそのロールをアサインされた個人が実施できる。
つまり決定権は細分され各ロールに紐づく形となる。

ホラクラシーを実践する際にまずサークルという構成単位を定義する必要がある。
これは関連する役割が集まった一つの役割の集合体でありこれ自体が大きな役割の一つである。
サークルも厳密に役割、領域、債務が定義される。

このサークル内に小さなサークルが紐付き組織を構成する。
![ホラクラシー.jpg](https://qiita-image-store.s3.amazonaws.com/0/212417/f1a09156-6749-a348-cb0a-0f80a718ca02.jpeg)

つまりこの小さなサークルの厳密に決められた定義の中で、アサインされたメンバーは意思決定を出来るのである。

例えばデザインとコーディングが双方得意なメンバーがいれば、一つのサークル内ではデザイナーという役割を担い別のサークル内ではプログラマーという役割を担う。

こうすることで組織の意思決定をスムーズにし、柔軟な組織構成を組成できることで組織にダイナミズムを生むことが出来る。

ただし一般的な懸念として、ガバナンス(組織統治)を働かせにくいという問題がある。
こういった組織構成上一見するとルールがなく自由な組織に見えるが、むしろ個人の裁量は役割として厳密に細かく縛られる。
つまり役割自体についている裁量権は非常に限定的であり、全体の意思決定の総和は総じて正しいものという大枠に基づいて自律的なガバナンスが図られる。

また上記で述べた特徴から用意に推察できるが、ブロックチェーンと組み併せることでこの組織の効果を最大化することが出来る。
すべての役割の定義はブロックチェーン上で定義され、スムーズに役割のアサインやサークルの活動を把握することが出来る。
またどのようなアクションが行なわれたのかすべての記録を改ざんなく閲覧することが出来るため、この部分での透明性を確保できることにより中央集権を排除した分散型のガバナンスシステムを構築することができる。

## 最後に
まだまだホラクラシーという定義自体もあいまいな、醸成の必要な組織形態ではあるが爆発的に世の中の仕組みを変え、社会のスピードを加速させる可能性秘めている。
今後も様々なホラクラシーとブロックチェーンの融合した適用事例をウォッチしていきたい。

明日は @hiro_mori さんです。よろしくお願い致します。
Homebrew 1.8.6でmkpasswdが動かない

# はじめに

いつの頃からか、Macでmkpasswdが動かなくなった。おそらくMojaveからだと思うが自信がない。その暫定的な対処法を書いておく。

# 現象

mkpasswdはパスワード生成プログラムである。だいたいexpectというパッケージに入っている。Macなら

```sh
$ brew install expect
```

で入ると思う。実効するとデフォルトで8桁のランダムなパスワード候補を生成してくれる。

```sh
$ mkpasswd
E51jqq%Jx
```

ところが、Macである時から使えなくなった。

```sh
$ mkpasswd 
can't find package Expect
    while executing
"package require Expect"
    (file "/usr/local/bin/mkpasswd" line 6)
```

# 原因

原因は、Macに入っているｔｃｌshにexpectパッケージが無いから。先程のmkpasswdは、こんなスクリプトになっている。

```sh
#!/bin/sh
# -*- tcl -*-
# The next line is executed by /bin/sh, but not tcl \
exec tclsh "$0" ${1+"$@"}

package require Expect
```

このスクリプトは、/bin/shで実効され、さらにtclshに処理を移管する。tclshがこの、`package require Expect`を実効しようとしてエラーが起きる。

```sh
$ tclsh
% package require Expect
can't find package Expect
```

対策として、brewed-tclを使う方法が紹介されていた。

```sh
brew install tcl-tk --without-tcllib
brew install expect --with-brewed-tk
```

しかし、現状(Homebrew 1.8.6)では`tcl-tk`には`--without-tcllib`オプションは無いと言われ、`brew install expect --with-brewed-tk`後でもmkpasswdは使えない。

# 対策

これ、/bin/shからtclshに処理を移管してるのが問題なので、冒頭部分を削除して、/bin/shのままexpectを実行してやるようにすれば良い。

```sh:mkpasswd
#!/bin/sh
#\
exec expect "$0" ${1+"$@"}
```

パッチにするとこんな感じ。

```patch
--- mkpasswd.org	2018-12-19 18:18:26.000000000 +0900
+++ mkpasswd	2018-12-19 18:16:42.000000000 +0900
@@ -1,10 +1,6 @@
 #!/bin/sh
-# -*- tcl -*-
-# The next line is executed by /bin/sh, but not tcl \
-exec tclsh "$0" ${1+"$@"}
-
-package require Expect
-
+#\
+exec expect "$0" ${1+"$@"}
 
 # mkpasswd - make a password, if username given, set it.
 # Author: Don Libes, NIST
```

上記のように直したファイルはちゃんと実行できる。

```sh
$ head -n 3 mkpasswd
#!/bin/sh
#\
exec expect "$0" ${1+"$@"}

$ ./mkpasswd
fbtQ.3Ty3

$ ./mkpasswd -l 12
iwL8aR2)nxwb
```

# まとめ

なぜだかわからないが、現状ではExpectパッケージが見えない(入っていない？）ので、とりあえず簡単なワークアラウンドだけここに書いておく。

# 参考にしたサイト

* https://trac.macports.org/ticket/31225
couldn't login to Ubuntu18.04 with GUI

#problem
- I accidentally removed libpng16-16:amd64 as shown below;
 `sudo apt-get remove libpng16-16:amd64`

- then my desktop gradually disappeared.
- I stopped the process and killed it.

    - I checked the process number and killed it with the command;
   
     `ps ax|grep apt`
     `sudo kill -KILL <process number>`

- After I rebooted my PC, of course I couldn't login to my PC with GUI.

#what i am doing
- log in the PC and installed `ubuntu-desktop`

`sudo apt-get install ubuntu-desktop`

#now
- I could login to Ubuntu18 with GUI, but I cannot use Japanese Keyboard, now I am repairing.

#reference
- https://blog.amedama.jp/entry/2018/08/04/230601
通常マウスでコピー,ペースト,戻るなどができるようにするマクロ

# 概要
autohotkeyというソフトを使ってゲーミングマウスを使わずにコピーペーストなどが出来るようにする方法を紹介します。具体的に以下のコードを作成しました。

- 右クリック ＋ 左クリック          ⇒ <b>ページを戻る</b>(alt + ←)
- ホイールクリック                   ⇒ <b>コピー</b>(ctr + c)
- ホイールクリック ＋ 右クリック      ⇒ <b>貼り付け</b>(ctr + v)
- 右クリック ＋ ホイール移動         ⇒ <b>ウィンドウ切り替え</b>(Alt + tab)
- ホイールクリック ＋ ホイール移動    ⇒ <b>タブ切り替え</b>(ctr + tab)

※ホイールクリックとはマウスの中央にあるボタンのことです。

# 参考（autohotkeyが何者か知らない人向け）
autohotkeyを使ったことが無い方は下のリンクを参考にしてみてください。
autohotkeyの使い方リンク↓
https://ch.nicovideo.jp/Jinsichi/blomaga/ar455334
http://wg16.hatenablog.jp/entry/autohotkey_001
https://qiita.com/chr/items/47f50e36703d3bb20371

# コード

```c
;これ最初に書かないとだめ
RButton::send, {Blind}{RButton}
return
;右クリック＋左クリックで戻る
RButton & LButton::send, !{left}
return
;ホイールクリックでコピーする
Mbutton::send, ^c
Return
;ホイールクリック＋右クリックで貼り付け
MButton & RButton::send, ^v
return
;右クリック＋ホイール移動でAlt+tab
RButton & WheelUp::ShiftAltTab
RButton & WheelDown::AltTab
return
;ホイールクリックしながらホイール移動でクロームのタブを移動
MButton & WheelUp::send, ^+{tab} ;ctr+shift+tab
MButton & WheelDown::send, ^{tab} ;ctr+tab
return
```
一応デメリットとして、このコードを実行すると右クリックのドラッグが無効になります。治す方法はわかりませんでした・・・
ただ右のドラッグは使う機会がかなり限られるので普通に使う分には問題ないと思います。
以下で細かく説明します。

```c
;これ最初に書かないとだめ
RButton::send, {Blind}{RButton}
```
最初のこれですが、別のコマンドで「右クリック＋◯◯」を設定すると右クリック単体が動作しなくなります。なので新しく右クリック単体で右クリックを出力するように書く必要があります。そしてこれが右ドラッグが動かない原因です笑
断っておくと、同様にして「左クリック＋◯◯」を設定すると左ドラッグが無効になります。これは非常に困るので「左クリック＋◯◯」は設定しないほうがいいです。

```c
;右クリック＋左クリックで戻る
RButton & LButton::send, !{left}
```
これ凄く便利です。Chromeやエクスプローラーなどで使えます。
ただ、youtubeで音量を調節した後にこのコマンドを実行すると音量を下げる操作が行われ正常に前のページに戻れません。なので私は応急処置として以下のようにして使っています。

```c
RButton & LButton::
IfWinActive, ahk_class Chrome_WidgetWin_1
{
ControlClick, x9 y138, A
}
send, !{left}
return
```
このコードの意味は最初に画面端の座標(9,138)(つまり何もないところ)をクリックした後で「戻るコマンド」を実行します。ですのでもしその位置にリンクが存在するとそのページに飛ばされてしまい、あまりスマートでは無いです。

ちなみに例えば同様にして「進む」を右クリック ＋ ホイールクリックに割り当てられるのですが「進む」は「戻る」と比べて使用頻度がかなり少ないので別の自分の好きなコマンドに割り当てることをオススメします。この右クリック ＋ ホイールクリックもかなり便利です。

ダブルクリックも併用するとさらに割り当てる種類を大幅に増やせますが(右ダブル, ホイールダブル, 右＋ホイールダブルなど)、ダブルクリックは少し疲れるのでよほどそれに見合った便利な操作でない限りあまりオススメしません。ダブルクリック用のコードはここでは省略します。

```c
;ホイールクリックでコピーする
Mbutton::send, ^c
```
ホイールクリックはすでに活用していて変えたくないという人もいると思います。（スクロールやChromeで「新規タブで開く」が出来ます。）
ただ注意したいのが、コピーと貼り付けはコマンドを実行する時のカーソル位置が重要になってくるので、右クリックからスタートする操作ではカーソル位置が変わってしまいうまく動作しません。なのでホイールクリックから始める必要があり、その場合ホイールクリック＋右クリック か ホイール＋左 かホイールダブルクリックなどになるのですが、正直ホイール＋左クリックとホイールダブルクリックはかなり使いづらいです。

```c
;右クリック＋ホイール移動でAlt+tab
RButton & WheelUp::ShiftAltTab
RButton & WheelDown::AltTab
return
;ホイールクリックしながらホイール移動でクロームのタブを移動
MButton & WheelUp::send, ^+{tab} ;ctr+shift+tab
MButton & WheelDown::send, ^{tab} ;ctr+tab
return
```
このコマンドの特徴は、最初のキーを押している間はホイールを回すことで何回でも移動が可能であるということです。とは言ってもChromeのタブ移動は、時間が空くと経由したタブが全て再読込みされるのでちょっと動作が重いかもしれません。上のコードを入れ変えると移動する方向をお好みで変えれます。これもまあまあ便利です。
# まとめ
上にあげたコードはなるべくどんな人が使っても使いやすいものを意識して書いたのですが、もちろん使う人によって重要なコマンドの優先度は異なってきますので、それぞれ使いやすいようにカスタマイズしてぜひ参考にしてみてください。

もしよければこちらの記事もどうぞ。↓
[wordでギリシャ文字を素早く入力する](https://qiita.com/mu_mura/items/82148783a06c043470d9)
[wordで指数を自動で上付き文字に変換させる](https://qiita.com/mu_mura/items/1e35f55d8dcfcbc506ca)
Windows + ImageMagick > はまり > convertコマンドを使おうとして失敗 > Windowsにもあるコマンド

```txt:動作環境
Windows 7 pro(32bit)
```

### エラー

とある公式ツールがメモリエラーでまともに動かないため、ImageMagickで処理をしようとした。

.NEFファイルを.jpgへ変換するという作業。

1. Git bashをインストール
2. ImageMagickをインストール
3. bashスクリプトを実装

```bash:loop_conv_181219_exec
#/usr/bin/env bash

for afile in $(ls *.nef);do
  tofile=$(echo $afile | sed s'/nef/jpg/g')
  echo $afile $tofile
  convert $afile -quality 100% $tofile
#  exit # for test
done
```

実行をしようとすると

```
$bash loop_conv_181219_exec
Invalid parameter: XXX.jpg
```

### 理由

Windows自体にconvertコマンドがあるようだ。

下記に詳しい。
https://stackoverflow.com/questions/3060205/error-invalid-parameter-fom-imagemagick-convert-on-windows

> convert is also the name of a windows executable which converts FAT filesystem to NTFS. 

convertコマンドでなく、magickコマンドで引数をconvertとする、とも上記リンク先に記載がある。

パス指定の方法で対処したところ、うまく動いた。

```bash:loop_conv_181219_exec
#/usr/bin/env bash

for afile in $(ls *.nef);do
  tofile=$(echo $afile | sed s'/nef/jpg/g')
  echo $afile $tofile
  "C:\Program Files\ImageMagick-7.0.8-Q16\magick.exe" convert $afile -quality 100% $tofile
#  exit # for test
done
```
Cybozu Garoon の予定を Slack で通知する

# ことの始まり
![image.png](https://qiita-image-store.s3.amazonaws.com/0/61079/b22d260b-691f-d4ca-49b2-2fce42ce8a36.png)
取締役会長との 1on1 を Youtube みてたらすっぽかしてしまったため、再発防止策として Garoon の予定を Slack に通知してくれる bot を即席で作りました。
見てた Youtube は [GrooveX の Lovot というロボットの発表ライブ](https://www.youtube.com/watch?v=xwQBGJlQkmg&fbclid=IwAR1fQ3-4tDIBKv3FIWojfQMhNCrxOIfdyiZguPqYTFVAe_OvCCDeSKMTukk)です。かわいい。

- ガルーン Rest API をいじる
- Slack に簡単な通知を送る

の勉強にもなるので遊びたい人はどうぞ。

# 注意事項
- 雑実装なので、1分に1回 Garoon の API を叩きます。（結果のキャッシュなどしていません）
- うまく動かず会議に遅刻しても責任はとりません！

# リポジトリ
https://github.com/halhorn/cybozu_slack_bot

# インストール
```shell
git clone git@github.com:halhorn/cybozu_slack_bot.git
cd cybozu_slack_bot
cp -fr secret.sample secret
# 編集内容は後で説明
emacs secret/cybozu.yml
emacs secret/slack.yml
```
## cybozu.yml
```yml
sub_domain: hogehoge
id: harumitsu.nobuta
```
sub_domain は自社の Garoon の `https://*****.cybozu.com/` の **** 部分です。
ID は書き換えてください。
パスワードは後ほど環境変数で指定します。

## slack.yml
Webhook を作ってください。作ったら Webhook URL をコピーしましょう。

```yml
webhook: https://hooks.slack.com/services/***********
user_name: hal_nobuta
channel: hal_work
```
- webhook のところにコピーした URL を貼り付けます。
- user_name は slack の自分の名前から @ を除いたもの
- channel は通知したいチャンネル名から # を除いたもの

# 実行
```shell
# スペースから始まるコマンドは history に残さないようにする
setopt hist_ignore_space
 export CYBOZU_PASS=my_cybozu_password

# とりあえず動かして様子を見る場合 python -m bot.run
nohup python -m bot.run &

export CYBOZU_PASS=''
```
Watson Studio（Cloud版） の Notebook を GPUで動かす

クラウド版のNotebookでGPUを使えるものとしては、Google Colaboratoryが有名ですが、IBMのWatson Studioでも Notebook on GPU のベータ試用ができるようになったので使って見ました。ベータについては以下のリンク先から申し込みをすると、順次連絡が来るようになります。

https://medium.com/ibm-watson/gpu-powered-notebook-is-coming-to-watson-studio-56876f60c056

# GPU 環境の作成
Watson StudioでProjectのEnvironmentsタブを選択し、「New environment definition」を選択します。Tesla K80 または Tesla V100 を選択し、Environmentを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/a76a3560-c4a0-0d85-ae9d-b6a834d6c943.png)

Notebook作成時にruntimeの選択でこのEnvironmentを選択すれば、NotebookをGPUで動かせるようになります。

# テスト
今回のお試しでは、[こちら](https://qiita.com/schiyoda/items/1e1578fc605aea88abcd)で紹介したYOLO V3のカスタム物体検出の学習を、Notebookだけでやってみました。

Watson Studioでプロジェクトを作成して、以下リンク先から Notebook を作成します。

https://github.com/schiyoda/YOLOV3-Keras-Custom-GPU/blob/master/YOLOV3-GPU.ipynb

Notebookに記載の通り、以下より学習済み重みデータを取得しNotebookのローカルにダウンロードします。
http://www.mediafire.com/file/l1b96fk7j18yi7v/backend.h5

Notebookを実行して行くと、Deep Learningによるモデル生成も高速に実行していってくれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/a70ddf76-0a85-11ff-0124-797e6e465d6f.png)

最後は物体検出まで実行することができました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/4266f51c-d73c-a81f-d24d-6fc8310ae6d2.png)


これまではWatson StudioでGPUを使うには Experiment とか Training Definitionを作成する必要があり少々煩雑でしたが、Notebookだけで完結できるのはかなり便利だと思いました。
東大松尾研データサイエンティスト育成講座データベースの章の試し方[暫定]

ちょっと前に話題になった東大松尾研[データサイエンティスト育成講座](https://weblab.t.u-tokyo.ac.jp/gci_contents/)の Jupyter 教材を眺めていると、8 章と 9 章で SQL をカーネルにしています。Jupyter で SQL を直接扱うというのは面白いのでやってました。一応困らない程度に設定出来たみたいなので記録を残します。ただ出力が全部アスキー文字列で、実際に授業使われているような TABLE 形式にする方法は分かりませんでした。

もしも正しいやり方を知っている方がいましたら教えて下さい。。。

## 前提条件

Jupyter + Python3 のインストールは終わって使える所から始めます。

## インストール

[MySQLをjupyter notebookのkernelに入れる方法](https://blog.aidemy.net/entry/2017/08/08/194608) のとおり `ipython_mysql_kernel` を使います。ググると https://github.com/shemic/jupyter-mysql-kernel というのが出てくるが、これは複数行の SQL がエラーになるので使えません。

```
pip install git+https://github.com/shemic/jupyter-mysql-kernel
mkdir -p ~/.ipython/
~/.ipython/mysql_config.json

{
    "user"     : "root",
    "port"     : "3306",
    "host"     : "127.0.0.1",
    "charset"  : "latin-1",
    "password" : "my-secret-pw"
}
```

ここで charset を `latin-1` にするのがコツです。教材で使われているサンプルデータ http://downloads.mysql.com/docs/world.sql.gz の文字コードが latin-1 なので utf8 では動きません。

この教材では mariadb というのを使っているらしいので、そちらも起動します。後腐れのないように docker で起動。

```
docker run --name some-mariadb -p 3306:3306 --rm -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb
mysql -h 127.0.0.1 -P 3306 -u root -pmy-secret-pw -e 'show databases'
```

もし間違って jupyter-mysql-kernel をインストールしてしまったら以下で削除。

    rm -r /usr/local/share/jupyter/kernels/jupyter-mysql-kernel 

## 参考

* [【スマホOK/実行しながら学ぶ】東大松尾研のデータサイエンティスト育成/ Deep Learning基礎講座を自習する]( https://qiita.com/tomo_makes/items/5d6f5860bb793e3b354a)

## BUGS

* このやり方で 9 章を試すとストアドファンクションがうまく入力出来ません。コンソールの mysql コマンドを使いましょう。
M5stackを使って湿度を測ってみる

この記事は、[リンク情報システム](https://www.lis.co.jp/)が主催する2018年アドベントカレンダーのリレー記事です。
(リンク情報システムのFacebookは[こちら](https://www.facebook.com/lis.co.jp/)からどうぞ。)

#はじめに
21日担当の@hawaです。マイコン完全初心者の自分ですが、先輩からM5stack FIREとセンサー一式をお借りしたのでこれを使って記事を書いていきたいと思います。

#やりたいこと
先日、中々良いベースを購入し、湿度にも気を使おうかなと思った矢先にアドベントカレンダーのお話があったので、**M5stackを使ってベースを普段保管しているケース内の湿度を計測したい**と思います。

#使ったもの
- M5stack FIRE
- 温湿度センサー([M5GO IoTスターターキット](https://www.switch-science.com/catalog/3875/)同梱のもの)
- iPhone 8

#やってみた
###1.開発環境の準備
まずは、M5stackの開発環境を構築します。
**偶然**にも、[弊社が2018年秋に開催したアドベンドカレンダー](https://qiita.com/dgkz/items/4c3a449f3168d6c787cf)にて、[M5stackとM5UI.Flowに関する記事](https://qiita.com/mashed-p/items/1ba7a3dc54e3b766c2a8)があったのでこれを参考に、開発環境の構築を進めていきます。

左下のM5stackとの接続状態を表す表示が"Connected"になっているので、開発環境の構築はひとまず完了です。
![advent calendar_1.png](https://qiita-image-store.s3.amazonaws.com/0/320886/5f2608f2-34a3-712e-fc41-52ec379bc2ee.png)

###2.実装
折角UiFlowを使うので、処理はプログラムブロックを使って書いていきたいと思います。
プログラムブロックの説明については、M5GOの操作マニュアルに記載されていたので、これを参考にしたいと思います。
UiFlow上のMore(右上端のボタン)→Settingからダウンロードすることが出来るので、日本語のものを選んでダウンロードします。

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3332303838362f36336364656437352d366666352d366234662d633265.png](https://qiita-image-store.s3.amazonaws.com/0/320886/b1485047-08c7-6ceb-dfda-4fc99c1237aa.png)


![advent calendar_3.png](https://qiita-image-store.s3.amazonaws.com/0/320886/238457e3-e70e-dbdd-536e-2f0a8a8ad34d.png)

ドキュメントを読みつつ、処理を記述していきましょう。
まずは、今回使う温湿度センサーをプログラムブロックで扱えるようにします。
Unitsの下の+をクリックして…
![advent calendar_4.png](https://qiita-image-store.s3.amazonaws.com/0/320886/5fa36dc9-81da-272b-a5c4-e48e4cc5de5b.png)

Envにチェックを入れて、OKボタンを押すとユニットからEnvが選択できるようになります。
今回計測したいのは湿度なので、湿度を表示するラベルを選択します。
![advent calendar_5.png](https://qiita-image-store.s3.amazonaws.com/0/320886/43da8f60-322d-1694-c963-6fa2acbf77d7.png)

次に、センサーの計測結果をiPhone上から確認するための準備を行います。
ドキュメントによるとRemoteブロックを使うことで、スマートフォンまたはパソコンからリモコンページにアクセスし、プログラムの実行制御などが行えるようです。
Remoteブロックは、UiFlow中央のリモコンから追加することができます。

![advent calendar_6.png](https://qiita-image-store.s3.amazonaws.com/0/320886/a3d146c5-9750-71aa-817c-bdf929d91430.png)

なんと必要なブロックは、これで全てのようです。
次は処理が動くように、ブロックを組み合わせていきます。
![advent calendar_7.png](https://qiita-image-store.s3.amazonaws.com/0/320886/682579f8-4ca9-a9bd-77c9-3467f5f12f6a.png)

これで、あらかたの準備ができました。
早速、作成したプログラムブロックを実行してみましょう。
![advent calendar_8.png](https://qiita-image-store.s3.amazonaws.com/0/320886/7fcd91c9-c74b-6ccb-9d18-0270635d292b.png)

M5stack上にQRコードが表示されました。
これを、iPhoneで読み取ってM5stackとセンサーをベースのケースの中に入れます。
さて、結果やいかに…。
###3.確認

![advent calendar_9.png](https://qiita-image-store.s3.amazonaws.com/0/320886/0036c3fc-020d-cd39-ce39-7348e4990f59.png)


温湿度センサーが計測した湿度を、iPhone上から確認することが出来ました。
(ベースにとって最適な湿度は約45% ~ 50%と言われているので、湿度に関しては少し対策を講じる必要がありそう…。)

#さいごに
思っていたよりも簡単に目的を達成することが出来ました。
今回はマイコンデビューということで本当に触りだけでしたが、時間を作ってがっつり触ってみたいと思います。

明日の担当は、@hunyuさんです!
PowerMockito.when()が全然うまくいかなくて困った話

```
PowerMockito.when(sut, "privateMethod", "parameter").thenReturn("pleaseReturnThis");
```

って書いても全く反応してくれなくてハマった。

```
PowerMockito.doReturn("pleaseReturnThis").when(sut, "privateMethod", "parameter");
```

こう書いたら"pleaseReturnThis" 返してくれた！
GASを使うべきか否かの判断材料

GASは手軽に使える便利な言語ですが、なんでもGASでやろうとすると苦労することもある…ということでこれGASでやるべきか？という視点でGASのメリット・デメリットを書いてみようと思います。
なお、一部のデメリットはG Suite Business以上なら解消できるものもあります。


#GASを選択する理由
##Googleのサービスにアクセスする
- Googleカレンダー
- スプレッドシート
- Googleドライブ
- AdminDirectoryサービス（G Suite管理者なら）

他の言語などからアクセスする場合、GoogleCloudPlatformでプロジェクト作成→認証情報の作成…といった手順を踏む必要がありますし、認証鍵の管理の手間も発生してしまいます。
GASならコード書いて最初の実行時に承認すればいいです（厳密にはGASに紐づくGCPプロジェクトが作成されていますが通常は意識する必要はありません）




##定期的に実行したい
GASはデフォルトで定期実行機能を備えています。定期実行のためのサーバーを用意したりサービスを利用する必要がありません。

##開発環境の準備が不要
GASの直接のメリットではないですが、特に環境構築をしなくてもすぐブラウザでコードを書き始めて実行できるのは大きなメリットだと思います。


#GASを諦めたほうがいい理由


## 処理が6分を超えるような処理をする場合
各所で散々言われていることですが、GASは1処理6分を超えると強制的に終了してしまいます。

対処方法はいろいろありますが、そもそも他の言語や環境ならば考慮しなくていいはずの部分なので、わざわざGASでやるべきかは考えてみたほうがいいでしょう。

G Suite Business以上のアカウントの場合は1処理30分まで処理時間が延長されているのでよほどじゃなければあまり気にしなくてもよくなると思います。
[Quotas for Google Services](https://developers.google.com/apps-script/guides/services/quotas#current_limitations)


## 大量の処理をする必要がある
GASは簡単にAPIアクセスや定期実行ができますが、それぞれの回数や頻度には制限があります。
[Quotas for Google Services](https://developers.google.com/apps-script/guides/services/quotas)

特にトリガーでの実行時間とUrlFetchの回数は、使用頻度の高さも相まって普通に使っててもネックになりやすいと個人的に感じています。

トリガーの実行時間は無料アカウントの場合、**90分/1日**となります。
例えば処理が5分もかかるような場合、1日に18回までしか実行できないことになります。
1時間毎の実行にしているともうアウトです。

UrlFetchの実行時間は無料アカウントの場合、**20,000回/1日**となります。
スクレイピングを大量に行ったり、ファイルを外部に頻繁にPOST/GETしていると引っかかる可能性があります。
なおUrlFetchは以前は1日の転送容量にも制限がありましたが、現在では50MB/1callと変わっています。
[UrlFetchの制限が緩和されました](https://qiita.com/tanaike/items/3d755dd527e88b47ad98)

これらはアカウントごとの合計なので、1つのGASだけならなんとかなっても複数のプロジェクトを使用すると制限に引っかかるため、原因以外のプロジェクトでエラーが発生することにもなってしまいます。
原因の調査もしづらくなります。




## 大容量ファイルやデータを扱う処理をする
大きいファイルを扱い始めると「メモリの上限を超えました」のエラーが発生します。

複数のファイルの内容をまとめてJSONを作ろうとしていたときにこのエラーに遭遇しました。
具体的な制限などの記述を見つけられませんでしたが、体感的には扱うデータがおよそ40〜50MBくらいになった辺りから発生していました。[^1]
[^1]: 分かる人がいたら教えてください。


大容量のデータを扱うには不向きと言えるでしょう。


## 複数人で開発する必要がある
GASのエディターはドキュメントやスプレッドシートと違って同時編集することはできません。（同じファイルを同時編集したいかはともかく）
編集権限を付与して複数人が編集することは可能ですが、標準でバージョン管理がないのでclaspを使うなりchrome拡張を使うなりする必要があります。

### 複数人トリガーの管理
GASのトリガーはGoogleアカウントごとの設定なので管理が煩雑になります。
一応、トリガーがG Suite Developer Hubに移ってからは他ユーザーのトリガーも確認できるようになりましたが、確認できるようになっただけで他人のトリガーを編集や無効にしたりはできません。表示されるトリガーのオーナーも「自分」か「他のユーザー」の二択のようです。

### 複数人でのWebアプリケーション公開設定の管理
Webアプリケーションとして公開する場合、ウェブアプリを有効化/無効化出来るのはスクリプトのオーナーだけとなります。
他の編集可能ユーザーはWebアプリのバージョンを更新・変更することはできますが、実行ユーザー、アクセス可能ユーザーもスクリプトのオーナーしか変更できません。

アプリケーションにアクセスできるユーザーを「自分だけ」にしていると、最後に公開設定を更新した人しかWebアプリにアクセスできなくなります。（別のユーザーが最新のURLからアクセスしてもファイルが見つかりませんエラーになる）

アプリケーションの実行ユーザーを「自分」にしている場合、最後に公開設定を更新した人がアプリの実行を承認していないと「その操作には承認が必要です」と出て実行できなくなります。




##ローカルのファイルにアクセスする必要がある
できないのであきらめましょう。
ただしGoogleDrive経由なら可能です。


#とはいえ…
GASを諦めたほうがいい理由をつらつらと書いてはみましたが、正直ひっかかってから考えてもいいような気はします。
環境構築しなくてもすぐコードを書き始められるのがGASの大きなメリットだと思うので、まずはGASで書き始めるというのは悪くないと思います。

実際、上記も自分が実際に引っかかって初めて意識し始めた部分だったりします。
その後、別言語での実装を試みましたが結局GASのメリットがほしくて方針を変えてGASで実装したりしています。

#あとがき
GASは強力ですがこういう罠もありますよという紹介でした。
Script @php artisan package:discover handling the post-autoload-dump event returned with error code 255

#Script @php artisan package:discover handling the post-autoload-dump event returned with error code 255

個人的な備忘録

発生条件

```
$ composer install
```

```
$ php artisan
PHP Warning:  Uncaught ErrorException: require...
failed to open stream: No such file or directory in
```

解決法
参考
https://stackoverflow.com/questions/50840960/script-php-artisan-packagediscover-handling-the-post-autoload-dump-event-retur/50841337


```
$ cd laravel
$ rm -rf bootstrap/cache
```
Midoを使ってPythonでMIDIを扱ってみよう


#まえがき
プログラミング言語Pythonで音楽を扱うためのツールはいくつかありますが、
その中でも、midoはMIDIを扱うにあたって平易でかつSysEX等を含む多くのメッセージを扱うことができます。今回はそんなmidoで音楽を扱うための基本に触れていきたいと思います。

- こちらは、[音楽ツール・ライブラリ・技術 Advent Calendar 2018](https://adventar.org/calendars/3353) 12/19分の記事です。
- Python、MIDI、英語のどれかに慣れてましたら　[公式ドキュメント](https://mido.readthedocs.io/en/latest/index.html)　を読みはじめて問題ないと思います。


#導入編
Python(2.7以降 or 3.2以降)がインストールされている環境で、
midoを追加しましょう。
また、MIDIポートを使ってメッセージの送受信の為python-rtmidiも追加しましょう。

```
pip install mido python-rtmidi
```

#実践編

## メッセージの種類やAPI一覧
こちらで参照できます。

- メッセージ一覧
 - [Message](https://mido.readthedocs.io/en/latest/message_types.html)
 - [MetaMessage](https://mido.readthedocs.io/en/latest/meta_message_types.html)
- API
 - [Library Reference](https://mido.readthedocs.io/en/latest/lib.html)

##ノートオンを作ってみよう
まずは音を出すためのMIDIメッセージであるノートオンを作ってみましょう。

```
import mido 
from mido import Message
msg = Message('note_on', note=60)
print(msg)
```
下記のメッセージが出力されます。

```
note_on channel=0 note=60 velocity=64 time=0
```

##ノートオンを出して聴いてみましょう

ノートオンを出すためにはまず、MIDIポートとの接続が必要です。
MIDI出力ポートの一覧は下記で取得できます。

```
ports = mido.get_output_names()
```

midoではMessage()でMIDIメッセージを作成します。
open_output()でポートを指定し、send()でメッセージを送信します。
下記ではports[0]をMIDI出力ターゲットとして指定しております。

```
msg = Message('note_on', note=64, velocity=127, time=480)
with mido.open_output(ports[0]) as outport:
    outport.send(msg)
```

DAW環境やMIDI対応楽器等が無い方は下記でMIDIの出力が確認できます。

* Windows 
Microsoft GS Wavetable Synthで確認できます。
ほかにも、loopMIDI＋SendSXでモニタリングすることなども可能です。

* Mac 
Audio MIDI設定でIAC Driverを有効化して指定すると、GaragebandでMIDI入力を確認できます。

##MIDIファイルを扱ってみよう

### MIDIファイルを作ってみましょう

下記でBPM=120でC4の4分音符を鳴らしております。
timeはtickで管理しております。
tickは1拍あたりの分解能でデフォルトが480となっており、前回からの相対値です。
テンポは、MetaMessageで指定します。bpm2tempoでBPMをテンポ時間(1拍あたりの時間：マイクロ秒)に置き換えます。

```
import mido
from mido import Message, MidiFile, MidiTrack, MetaMessage

mid = MidiFile()
track = MidiTrack()
mid.tracks.append(track)
track.append(MetaMessage('set_tempo', tempo=mido.bpm2tempo(120)))
track.append(Message('note_on', note=64, velocity=127, time=0))
track.append(Message('note_off', note=64, time=480))

mid.save('new_song.mid')
```


### 作ったMIDIファイルを再生してみましょう
msg.time分のsleepを挟んでMIDI出力をシーケンシャルに行います。

```
import mido
import time

ports = mido.get_output_names()
with mido.open_output(ports[0]) as outport:
    for msg in mido.MidiFile('new_song.mid'):
        time.sleep(msg.time)
        if not msg.is_meta:
            print(outport, msg)
            outport.send(msg) 
```
Postmanでjenkinsにビルドパラメータをjsonで渡す

#はじめに

恥ずかしながら、勘違いをして凄くハマってしまったので記録を残します

## 環境
OS CentOS7
jenkins 2.73.1
Postman

#結論

### Jenkinsの設定

- ビルドのパラメータ化 にチェックを入れる
- パラメータの追加で「テキスト」を選択する
- 名前に「payload」を入力する

### Postmanの設定

- jenkinsのURLを入力する ( http://ホスト名/job/job名/buildWithParameters )
- POSTを選択する
- Bodyで「form-data」を選択する
- Keyにpayloadを入力する(例)
- valueにjson形式の文字列(urlエンコードしていない)を入力する

あとはPostmanの「SEND」ボタンを押せばjenkinsが動きます

#おわりに
恥ずかしい勘違いとはjsonデータのことです。
Postmanの設定で「raw」の「json」を選択して、jsonデータ({"payload":"aaaa"}とか)をjenkinsに送って「payloadの値がとれない」と悩んでました。

以上です
技術の評価指標についてお話してきました at mkmklt#6

新しい技術に何でも飛びつけばいいと言うものでもない、と私は考えています。
技術をどう判断するか、私なりに考えをまとめたものをmkmklt#6 へお邪魔してお話しました。
内容は、サーバサイドエンジニアやソフトウェアエンジニアを対象に、ニーズのある技術を学んで、自分の魅力を高めよう！っと言う内容です。

10分かからず読めるボリュームなので、皆さんのご意見頂けると嬉しいです。
<https://www.slideshare.net/ssusera45aed/mkmklt-20181218-hatake>
EC-CUBE 3系/4系のレイアウト管理機能の違い＆活用例

[EC-CUBE Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ec-cube) の記事です。

EC-CUBE 4では、メニューに「レイアウト管理」が新たに追加されております。
3系でもメニューにはないものの、レイアウト管理機能はあり、
同様の機能と混同しそうなため、
ここでは、3系/4系のレイアウト管理機能の違いと、具体的な活用方法をお伝えします。

# 3系と4系の違い
## 3系
- ページ毎に、レイアウトの設定が可能
- 全ページまとめて、レイアウト設定が可能

## 4系
[初期状態]
- Topページ単体でのレイアウト設定が可能
- Topページ以外の全ページのレイアウト設定が可能
[独自設定]
4系では、レイアウトのグループのようなものを作ることができます。

[初期状態]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29627/420a9f29-a8c6-e9ba-910c-24ffe60c973a.png)

[独自設定]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29627/535b9c3a-b031-fa6f-7c6b-5aed9c5373d9.png)

# 活用例  
ネットショップでは、「いかにカート落ちを防ぐか？」が重要になってきます。  

そのため、カート以降のページにおいては、
商品検索やカテゴリ等余分なものを表示せずページをシンプルにすることがベターとされております。

そこで、今回は「カート以降用レイアウト」というグループを作成し、
カート画面以降をシンプルな画面にしたいと思います。

## Before->After
[Before]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29627/83bc068e-f0bb-05b8-5899-254ecd545b77.png)

[After]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29627/89c67736-cd70-78fe-db65-2c17ed2b2884.png)

## 設定方法
### レイアウトグループの作成
以下のように、表示したいブロックのみを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/29627/5d0071cb-816f-4094-249d-63d772114862.png)

### カート以降のページのレイアウト設定
コンテンツ管理 -> ページ管理
-> グループに設定したいページ名のリンクを押下
-> レイアウト設定を「カート以降用レイアウト」に変更する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29627/50fc17b2-ecc1-a44e-79f5-a54427505e95.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/29627/6a2769ce-d254-a55d-1c1f-63612b59dcee.png)

# 参考情報
http://doc4.ec-cube.net/design_layout
https://github.com/EC-CUBE/ec-cube/issues/2289#issuecomment-296136541
Unity上でLive2Dモデルのクリッピングマスクがエラー

## 事象
Live2D Editor上では正常に表示されているモデルが、
Unity上で見るとクリッピングマスクがバグっていた。
小一時間悩んだのでメモ。

おそらくこちらと同じ問題。
[作成したアニメーションをUnity上に配置するとNullReferenceExceptionが発生する](http://forum.live2d.com/discussion/836/%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F%E3%82%A2%E3%83%8B%E3%83%A1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92unity%E4%B8%8A%E3%81%AB%E9%85%8D%E7%BD%AE%E3%81%99%E3%82%8B%E3%81%A8nullreferenceexception%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B)

## 解決
モデルのインスペクタを見てみると、該当箇所（今回の場合は口）のクリッピングは問題なし。
一方、別のところのクリッピング（髪の毛）がnullになっていた。
<img width="234" alt="スクリーンショット 2018-12-19 13.09.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/136286/c9d209c6-52cc-95cc-058a-e29b0459053c.png">
このnullを削除するか、再度指定してあげるとUnity上でも正常に表示されるようになった。

クリッピング周りは色々と表示バグが起こりやすそう。
https://docs.live2d.com/cubism-editor-manual/clipping-mask/?locale=ja
Dockerでpython言語処理１００本ノック

##前書き

qiitaを書いた経験やマークダウン方式の書き方に慣れていないので、わかりにくい部分や不完全な部分があると思いますので、こうしたほうが良いという部分がありましたらコメントをよろしくお願いします。

東北大学の研究室が公開しているpythonを用いた言語処理１００本ノックをdockerで動かすためののコード及び環境を作成しました。
[100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/)

Dockerで言語処理100本ノックを動かすことについての記事ですのでDokcerの基本的な部分は本記事では扱いません。
以下、DockerがホストPCに入っている前提で記述していきます。

##1. はじめに

Docker上にmecabやmongodbなどを入れたDocker imageを作成しました
これをpullした後に

```
$ docker pull yasuhidegoto/zenchin

$ docker run -it yasuhidegoto/zenchin /bin/bash
# cd home
home# git clone https://github.com/noritake41/100_nokku.git
```
[githubのコードのURL](https://github.com/noritake41/100_nokku)

２章に必要なテキストファイル等が入っていないので100本ノックのホームページから各々ダウンロードしてください

基本的には、MAC上で動作確認したファイルをそのままgithubに乗せています。
そのためにファイルのディレクトリを変更しなければならないところが多々出てきますのでこちらも各々で変更してください

##注意事項

複数人で手分けして100本ノックを動かした際のコードですので記述方法に違いがある場合などがある場合があります
動作確認が出来ていない部分がある可能性があります。そのためにこの記事とgithubに書かれていることを100%は信じないようにしてください。
とりわけgithubのコードやファイル構成は適宜修正中ですので注意してください。

**実際に動作確認してうまくいかなかった部分がありましたらコメントお願いします**

##参考
素人の言語処理100本ノック
https://qiita.com/segavvy?page=6
Djangoで自機以外のデバイスからもアクセスできるようにする

## 概要

開発時にPC以外、例えばスマホやタブレットなどからもアクセスできるようにする。
ローカルネットワーク内のデバイスならどこからでもアクセスできるようになります。

## Django側の設定

```python:settings.py
# ALLOWED_HOSTSに*を設定することでどこからでもアクセス可能に
ALLOWED_HOSTS = ['*']
```

## 起動
```
python manage.py runserver 0.0.0.0:8000
```

# アクセス
ローカルネットワーク内のデバイスから、`http://[PCのIPアドレスまたはmDNS名]:8000`にアクセスすれば無事にWEBページが表示されます。