OmniAICreator/Qiita-1.07M huggingface dataset:
【AWS SwitchRole】アカウントに設定したロールの削除方法

Qiita初投稿です。

削除～とか安易な言葉で調べてもすぐには出てこなかったのでメモ。
ほぼ他の方の記事通りですが。

## Switch Roleに関して
参考箇所に貼った2つ目の記事の方が全てを書いていたので引用します。
>クロスアカウントでのIAMロールスイッチを使うと、ログイン・ログアウトを行わずに、異なるAWSアカウントの操作が可能になります。
>
>この機能を使いこなせば、複数のブラウザを使い分けたり、作業途中で別のアカウントにログインして、セッションが切れて作業がやり直しになる>といった不幸を避けることが出来ます（サポートケースを書いている途中で、別アカウントの確認とかするとセッションが切れて泣けます）​

使っていると最後のカッコ部分の気持ちがすごいわかります。

## 削除方法
ロール先はブラウザのクッキーで保持している為にクッキーをさわらないと削除できないみたいです。
*2019/01/18 コメント引用*
>Cookieに「noflush_awsc-roleInfo」という名称で保存されるようですね。

シークレットウィンドウでは使えないのが不便ですね。

また、接続先のロール履歴に関しては最大5個までの制限があるようです。

ツッコミ等有りましたら是非、お願いします。

**2019/08/22 追記**
https://dev.classmethod.jp/cloud/aws/introduction-aws-extend-switch-role/
SwitchRoleを行うのであればこれを使いましょう。
すごく便利です。

## 参考サイト
[Switching to a Role (Console) - AWS Identity and Access Management](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)
[IAMロールによるクロスアカウントアクセス – サーバーワークスエンジニアブログ](http://blog.serverworks.co.jp/tech/2016/04/08/iamroll-crossaccountaccess/)
サブドメインでのCookieの取り扱いメモ

## やりたいこと
`hoge.com`というドメインを取得している前提。
サブドメインとして`sub1.hoge.com`と`sub2.hoge.com`を設定し、
`sub1.hoge.com`と`sub2.hoge.com`間で、同じCookieのデータを共有したい。

## 例
### cookieのセット
ドメインを特に意識しないなら、
`document.cookie = "data=hogehoge";`
でいいが、上記のやりたいことをやるには、
以下のように`domain=.hoge.com`を末尾につける必要がある。

```
document.cookie = "data=hogehoge; domain=.hoge.com";
document.cookie = "data2=hogehoge2; domain=.hoge.com";
```


### cookieの取得
こちらは普通に取得。

```
var cookie = document.cookie
```

配列のかたちで取得したければ、

```
var aryCookie = function() {
    var ary = new Array();
    if (document.cookie != '') {
        var cookieList = document.cookie.split('; ');
        for (var i = 0; i < cookieList.length; i++) {
            var data = cookieList[i].split('=');
            arr[data[0]] = decodeURIComponent(data[1]);
        }
    }
    return ary;
}
```

実装するのは`sub1.hoge.com`と`sub2.hoge.com`どちら側でもおk。
LaravelでpluckしたデータをControllerからViewに渡す処理をサービスを使って省略する

## どういうことをするものか

たとえば、セレクトボックスが多くあるフォーム入力画面があり、その中身を DB から取得して View に渡すとします。

下記のコード例は、複数の関連会社のユーザーがアクセスできるシステムで、ユーザーのロール・会社・支店・部署などなどを設定できる画面としましょう。

### before

```php:app/Http/Controllers/HogeController.php
public function index()
{
    $roles = $this->role->pluck('name', 'id')->all();
    $companies = $this->company->pluck('name', 'id')->all();
    $branches = $this->branch->pluck('name', 'id')->all();
    $departments = $this->department->pluck('name', 'id')->all();
    $users = $this->user->pluck('name', 'id')->all();
    // ... 省略 ...

    return view('hoge.index', compact(
        'roles',
        'companies',
        'branches',
        'departments',
        'users',
        // ... 省略 ...
    ))
}
```

例は5つくらいだけど、これが大量に続くとウザいので、スッキリさせたい。
これから紹介する方法だと、このくらいスッキリします。

### after
```php:app/Http/Controllers/HogeController.php
public function index()
{
    // 取得、Viewに渡す記述がいらなくなる！
    return view('hoge.index')
}
```

```php:resources/views/hoge/index.blade.php
@inject('pluck', 'App\Services\Pluck')

<!-- 省略 -->

{{ Form::select(
    'role_id',
    $pluck->getPluck('App\Role'),
    old('role_id')
) }}
```

## やり方

```php:config/app.php
// ... 省略 ...

'aliases' => [
    // ... 省略 ...
    'Pluck' => App\Facades\Pluck::class,
]
```

```php:app/Facades/Pluck.php
<?php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;

class Pluck extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'Pluck';
    }
}
```

```php:app/Services/Pluck.php
<?php
namespace App\Services;

class Pluck
{
    protected static $plucks = [];

    public function getPluck($model, $column = 'name')
    {
        $reflection = new \ReflectionClass($model);
        $class = $reflection->getName();

        if (empty(self::$plucks[$class])) {
            self::$plucks[$class] = $model::pluck($column, 'id')->all();
        }

        return self::$plucks[$class];
    }
}
```

```php:app/Providers/PluckServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Services\Pluck;

class PluckServiceProvider extends ServiceProvider
{
    public function boot()
    {
    }

    public function register()
    {
        $this->app->bind('Pluck', Pluck::class);
    }
}
```

View に記述する `$pluck->getPluck('App\Role')` の第一引数に Model、第二引数にカラム名を渡すと、ID とそのカラムで pluck するようになります。
第二引数は省略すると `name` になります。
【Laravel】フォームリクエストを使いつつ勝手にリダイレクトさせない

[フォームリクエストバリデーション](https://readouble.com/laravel/5.7/ja/validation.html#form-request-validation)を使うと簡単にバリデータを書けて楽ではあるのですが、こいつはバリデーションに失敗すると勝手に前ページにリダイレクトします。
[リダイレクト先を変更する](https://qiita.com/a_yasui/items/83cfe5b9f4bb61ffbb49)手段はありますが、止める手段がありません。
リダイレクトさせずにコントローラ側でどうこうしたいことがあったのだけど、その対応にやたら苦労したので備忘録。
試したバージョンはLaravel5.7。

# ソース

## フォームリクエスト

```php
<?php
namespace App\Http\Requests;

use Illuminate\Contracts\Validation\Validator;
use Illuminate\Foundation\Http\FormRequest;

class FooRequest extends FormRequest
{

    /**
     * バリデーションルール
     *
     * @return array
     */
    public function rules()
    {
        return [
            'bar' => 'required',
        ];
    }

    /**
     * @Override
     * 勝手にリダイレクトさせない
     * @param  \Illuminate\Contracts\Validation\Validator  $validator
     */
    protected function failedValidation(Validator $validator)
    {
    }

    /**
     * バリデータを取得する
     * @return  \Illuminate\Contracts\Validation\Validator  $validator
     */
    public function getValidator()
    {
        return $this->validator;
    }
}
```

リクエスト時にはまず`ValidatesWhenResolvedTrait::validateResolved()`が呼ばれるのだが、その中で`if ($instance->fails()) { $this->failedValidation($instance); }`までべったり書かれている。
そして`FormRequest::failedValidation()`はその中でリダイレクトしている。

ここまでコントローラより先に動くので、コントローラからは手を出す手段がない。
従って、フォームリクエストで`failedValidation()`を上書きしてリダイレクトしないようにした。

次にコントローラからバリデータを取得したいのだが、フォームリクエストのValidatorはprotectedであり、さらに取得するメソッドがないのでコントローラで取り出すことができない。
従って、Validatorを取得するメソッド`getValidator()`を追加した。


## コントローラ

```php

class FooController extends Controller
{
    /**
     * なんかするアクション
     * @param FooRequest
     * @return Response
     */
    public function setBar(FooRequest $request)
    {
        // バリデータ取得
        $validator = $request->getValidator();
        // 以後Validatorファサードと同じように使える
        if($validator->fails()){
            return redirect('hoge/fuga')
                ->withErrors($validator)
                ->withInput();
    }
}
```

`Validator::make`したときと同様にValidatorを取れるので、あとはコントローラ側で任意に操作することができる。

# 感想

解決策だけ見ると簡単っぽく見えるけど、当初は流儀に則ったやり方がないかを探していたらFormRequestやらValidatesWhenResolvedTraitやらValidation\Factoryやらを延々彷徨う羽目になりました。
そのうえ良さげな方法が結局見当たらなかったので、直接上書きして穴を空けるという物理的解決法になりました。
絶対もっといい方法があると思うんだけどどうなんだろう。

# その他

Laravelは用意された道に沿って歩くだけなら快適だけど、ちょっとでも道を外れようとすると途端に酷道になるという印象。

今度は`Route::any('hoge\{fuga}', 'HogeController@{fuga}Action');`ってできないのか調査中。
ある行にコピペして帳票を自動作成＆印刷

初投稿。VBA、プログラミング初心者。

データベースのシート上の1行をコピーしてある1行にペースト。
その情報が同じファイル内の、別の送り状シートに反映され（エクセルの関数で反映されている。）
それを印刷する。しかも宛先によっては2種類の帳票を出さねばならない。

という作業が嫌いでどうしても自動化したかった。

Do WhileとIFの組み合わせ
https://vba-code.net/basic/do-while/
Firebase Auth の refreshトークンの取得とIDトークンの更新

## 概要
Firebase Auth については、以下のapps-gcpの記事か公式ドキュメントを参照でおｋ

・apps-gcp:面倒なログイン機能の実装はFirebase Authenticationに丸投げしよう
https://www.apps-gcp.com/firebase-authentication/
・Firebase Authentication 公式ドキュメント
https://firebase.google.com/docs/auth/?hl=ja

## refreshトークンについて
そもそもFirebase Authに関しては、IDトークンが認証処理時に自動更新されるため、refreshを意識しなくてもいい。

しかし、それでもこっちからrefreshトークンを投げて、それによって更新されたIDトークンを返す、みたいな処理をやりたくなるときがあるのだ...

## refreshトークン の取得
`firebase.auth().onAuthStateChanged()`などで取得する

```
firebase.auth().onAuthStateChanged(function(user) {
  if (user) {
    // User is signed in.
    var refreshToken = user.refreshToken; //こんな感じ
    // ...
  } else {
    // User is signed out.
    // ...
  }
});
```

## refreshトークンによるIDトークンの更新
以下のエンドポイントに先ほど取得したrefreshトークンをPOST。

`https://securetoken.googleapis.com/v1/token?key=【API KEY】`
ここでのAPI Keyは、
https://console.cloud.google.com/apis/credentials?hl=ja
で設定したキー。

**Method:** *Post*
**Content-Type:** *application/x-www-form-urlencoded*

| Property Name | Type | Value | 
|-----------|------------|------------|
| grant_type | string | "refresh_token" |
| refresh_token | string |【上で取得したrefreshトークン】|

ドキュメントはここ。ちとこのAPI古臭い
https://firebase.google.com/docs/reference/rest/auth/#section-refresh-token


POSTして成功したら、IDトークンが返ってくるので、それを使う。

以上。
BeatSaberでアバターを表示する２つの方法

# はじめに

BeatSaberというVRゲームに最近はまっています。こんな感じのゲームです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">BeatSaberで足腰もトラッキングできるようになりました！バーチャルモーションキャプチャーを利用させていただきました。解説が充実していて、すごくわかりやすかったです！<br><br>プレイしているのはOne Hopeという公式曲です。ミスばっかりだけど、自分のアバターが動いているのは楽しいですね！ <a href="https://t.co/28nBk0Em6I">pic.twitter.com/28nBk0Em6I</a></p>&mdash; せぎゅ (@segur_vita) <a href="https://twitter.com/segur_vita/status/1083406157136330753?ref_src=twsrc%5Etfw">2019年1月10日</a></blockquote>



実はこのゲーム、標準では一人称視点であり、このように三人称視点で録画することはできません。また、アバターを表示することも標準ではできません。

アバターを表示させる方法を調べたところ、2通りあったので、忘れないうちにメモします。今後、始める人の参考になれば幸いです。



# アバターを表示する２つの方法

アバターを使って撮影するには、以下の２つの方法があります。

- Beat Saber MOD の Custom Avatar を使う
- VirtualMotionCapture （VMC、ばもきゃ）を使う

どちらの方法がよいかは、状況によりますので、フローチャートにしてみました。

![image2.png](https://qiita-image-store.s3.amazonaws.com/0/221845/da7d7d82-2303-ae66-c1c1-2a300fb9c7bb.png)

### 2019/01/25 追記

「CustomAvatarでも足腰のキャプチャはできる」というご指摘を何名からかいただきました。上記のフローチャートは間違っていますので、修正版を以下に記載します。ご迷惑をおかけして申し訳ありません。

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/221845/754918c8-1456-6baf-bd6d-4fb2bfd4b290.png)



# CustomAvatarを使う

まず、CustomAvatarを使う方法があります。この方法は、Beat SaberをMODで拡張することによって、アバターを用いた撮影を実現します。



必要な作業をざっくり挙げると以下の通りです。

- **Beat Saber Mod Manager**を導入する
- **SongLoaderPlugin**を導入する
- **CustomUI**を導入する
- **CameraPlus**を導入・設定する
- **CustomAvatar**を導入・設定する
- 録画する



以下のサイトが非常にわかりやすかったので、詳細はこちらをご覧ください。

- [Beat Saber MODの導入方法【初心者向け解説】](https://noshilog.com/beat-saber-mod-installation-guide)
- [ビートセイバー カメラを三人称視点にしたりFOVを変更できるMOD CameraPlusの導入方法](https://noshilog.com/beat-saber-mod-cameraplus)
- [Beat Saber カスタムアバターの導入方法と使い方](https://noshilog.com/beat-saber-customavatarplugin)



この方法の場合、.avatarという拡張子のファイルをアバターとして使用できます。おそらくBeatSaber専用のファイル形式です。



.avatarファイルは公開されているものを入手して使うこともできますし、自作することもできます。自作する場合、BlenderとUnityでの作業が必要です。

以下のサイトが非常にわかりやすかったので、詳細はこちらをご覧ください。

- [ビートセイバー アバターの作り方 【初心者向け作成ガイド】](https://noshilog.com/beat-saber-avatar-creating)
- [BeatSaberにVRChatのアバターを持って行ったメモ](http://kurotori4423.hatenablog.com/entry/2018/06/03/171758)





# VirtualMotionCaptureを使う

次に、VirtualMotionCapture （VMC）を使う方法があります。この方法は、Beat Saberのプレイ映像に、アバター映像を合成することで、あたかもBeat Saberの世界にアバターが存在するかのように見せることができます。（間違っていたらすみません）



必要な作業をざっくり挙げると以下の通りです。

- **VirtualMotionCapture**を導入・設定する
- **LIV**を導入・設定する
- 録画する



以下の公式サイトが非常にわかりやすかったので、詳細はこちらをご覧ください。

- [VirtualMotionCapture / 操作方法](https://sh-akira.github.io/VirtualMotionCapture/manual/)



この方法の場合、アバターには、先ほどの.avatarファイルを利用できず、代わりに、.vrmファイルが利用できます。vrm形式は様々なVR系のプラットフォーム・ツールで利用できますので、便利です。

Viveトラッカーを持っていれば、足腰のトラッキング（通称フルトラ）も可能です。




# さいごに

今回、Beat Saberでの撮影にあたり、Twitterを通じて、様々な方にご協力いただきました。この場を借りてお礼申し上げます。ありがとうございました。
rubyでハッシュのキーと階層が一致するものだけマージするメソッド

rubyといいつつrails環境でしか試してないけど

# 機能概要
2つのハッシュ間で同じキー・同じ階層で存在している値のみ取り込む機能

```ruby
base = { a: 1, b: 2, c: { ca: 10 }, d: 0 }
input = { a: { aa: 10 }, b: 10, c: 2, e: 6 }

p merge_keep_struct(base, input)
# => { a: 1, b: 10, c: { ca: 10 }, d: 0 }
```

`[:a]`キーだと`input`側が深すぎるので`base`のまま出力される
`[:b]`は同じ階層で同じキーなので`input`の値が上書きされて出力される
`[:c]`キーだと`input`側が浅すぎるので`base`のまま出力される
`[:d]`は`base`側しかないので`base`のまま出力される
`[:e]`は`input`側にしかないので出力されるhashに含めない

# コード
```ruby
def merge_keep_struct(base_hash, input_hash)
  input_hash.each do |key, val|
    # input_hashのネストが深すぎる時にエラーになるからtry
    next unless base_hash.try(:keys).try(:include?, key)

    if val.is_a?(Hash)
      base_hash[key] = merge_keep_struct(base_hash[key], input_hash[key])
    else
      # input_hashのネストが浅すぎる時(inputは底までついたけどbaseはまだhashの時)はスルーするように
      next if base_hash[key].is_a?(Hash)
      base_hash[key] = val
    end
  end
  base_hash
end
```

# 拡張
配列を結合されるようにしたり
型検証する機能もあるといいかな
【2019年1月最新版】PythonによるOpenCVプロジェクトの始め方

# はじめに
Python3とOpenCV4で開発環境を構築します。Pythonバージョン管理にpyenv, パッケージマネージャにpipenvを用います。
# 環境
macOS High Sierra
# Pythonの準備
## pyenv
pyenvはPythonのバージョンを管理する目的で利用します。これを使うことでPython3.5とPython3.7の切り替えといったことが簡単にできるようになります。

brewを用いてインストールします。

```
$ brew install pyenv

$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc
```
## Pythonのインストール
pyenvを用いて目的バージョンのPythonをインストールして、デフォルトでそれを使うようにします。ここでは最近リリースされた3.7.2を利用します。

```
$ pyenv install 3.7.2
$ pyenv global 3.7.2
$ python --version
Python 3.7.2
```

インストール時に下記のようなエラーが出るときは`xcode-select`でcommand line toolsを入れます。

```
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
```

```
$ xcode-select --install
```


# pipenv
pipenvはPythonのパッケージマネージャです。以前まではpip3やvirtualenvなどを用いてライブラリを管理していたと思うのですが、pipenvを用いることでそれらを直接扱う必要が無くなります。

> requirements.txt ファイルの管理は 問題になり得る ので、代わりにPipenvは Pipfile および Pipfile.lock を使い、最小限の依存関係の宣言と直前にテストした依存関係の組み合わせを区別します。
（https://pipenv-ja.readthedocs.io/ja/translate-ja/）

pipenvをダウンロードします。

```
$ brew install pipenv
```
pipenvはデフォルトで仮想環境を`~/.local/share/virtualenvs`に作成しますが、プロジェクトディレクトリ内に作成した方が管理しやすいのでそのように設定変更します。

`PIPENV_VENV_IN_PROJECT`という環境変数をtrueに設定します。

```bash:.bashrc
$ echo 'export PIPENV_VENV_IN_PROJECT=true' >> ~/.bashrc
$ source ~/.bashrc
```

# プロジェクトの作成

## pipenvによる仮想環境の作成
OpenCVを用いて開発するプロジェクトを作成します。

```
$ mkdir myproject
$ cd myproject
```

pipenvにより仮想環境を作成します。

```
$ pipenv install --python 3.7.2
```

ここで以下のようなエラーが出ることがあります。

```
Locking [packages] dependencies...
lib/python3.7/site-packages/pipenv/utils.py", line 402, in resolve_deps
    req_dir=req_dir
  File "/usr/local/Cellar/pipenv/2018.7.1/libexec/lib/python3.7/site-packages/pipenv/utils.py", line 250, in actually_resolve_deps
    req = Requirement.from_line(dep)
  File "/usr/local/Cellar/pipenv/2018.7.1/libexec/lib/python3.7/site-packages/pipenv/vendor/requirementslib/models/requirements.py", line 704, in from_line
    line, extras = _strip_extras(line)
TypeError: 'module' object is not callable
```
pipenvのバージョンが古いとpip18.1に対応していないためこのようなエラーが出ます。pipenvのバージョンを確認して`$ brew upgrade pipenv`でアップグレードしましょう。

## OpenCVのインストール
次にOpenCVをインストールします。[opencv-python](https://pypi.org/project/opencv-python/)の方々が最近OpenCV4のビルドをリリースしてくださったのでそれを利用します。

```
$ pipenv shell #仮想環境のアクティベート
$ pipenv install opencv-python
```

opencv-contrib-pythonとすればcontribモジュールもインストールすることができます。また、もしOpenCV3系が必要なら以下のように指定します。

```
pipenv install opencv-python==3.4.5.20
```

# テスト
動作テストをします。カレントディレクトリに`sample.png`を置いて、それを表示させるプログラムです。
表示されましたか？

```test.py
import cv2
import numbers as np

src = cv2.imread('sample.png')
cv2.imshow('test', src)
cv2.waitKey(0)
```

```
$ pipenv shell # すでに仮想環境中に入っているなら不要
$ python test.py
```
VBA_実行時間測定クラス(ストップウォッチクラス)

#1.概要
プロジェクトの実行時間測定用にストップウォッチクラスを作成した。

#2.ソースコード

テスト用Sub

```vb

Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)

Sub sub_ストップウォッチ()
    Dim sw As New StopWatch
    
    '総経過時間(スプリットタイム)測定スタート
    Call sw.Sprit_Start
    
    'ラップタイム記録
    Call sw.Lap
    Call Sleep(1000)
    
    'ラップタイム出力(同時にラップが記録される)
    Call sw.Lap_OutPut("ラップ1：", "秒")
    
    Call Sleep(2000)
    Call sw.Lap_OutPut("ラップ2：", "秒")

    '総経過時間を出力
    Call sw.Split_OutPut("総経過時間：", "秒")
    
End Sub


```

StopWatchクラス

```vb

Option Explicit
'実行時間測定用クラス

Dim me_splitStart As Double 'スプリットタイム測定開始時刻
Dim me_lap As Double 'ラップタイムを保持

Sub Class_Initialize()
End Sub

'-------ラップタイム用-------------

'前回Lapからの経過時間を記録
Public Function Lap() As Double
    
    Dim elaps As Double '前回ラップからの経過時間
    Dim timer_buf As Double
    
    timer_buf = Timer '現在時刻記録
    elaps = timer_buf - me_lap '前回ラップからの経過時間計算
    
    me_lap = timer_buf 'ラップを更新
    
    'return
    Lap = elaps
    
End Function

'Lapからの時間を出力(Lapも更新される)、結果はの表示形式は「引数1  結果  引数2」
Public Function Lap_OutPut(Optional arg_text1 As String, Optional arg_text2 As String) As Double
    Dim elaps As Double
    
    '経過時間を取得
    elaps = Me.Lap
        
    Debug.Print arg_text1 & Format(elaps, "0.000") & arg_text2
    
    '一応return
    Lap_OutPut = elaps

End Function


'-------総経過時間用(スプリットタイム)-------------

'スプリットタイム開始時刻を記録
Public Function Sprit_Start()
    me_splitStart = Timer
End Function

'Sprit_Startからの経過時間を取得
Public Function Split_() As Double
    Split_ = Timer - me_splitStart
End Function

'RunStartからの経過時間をPrint、結果はの表示形式は「引数1  結果  引数2」
Public Function Split_OutPut(Optional arg_text1 As String, Optional arg_text2 As String) As Double
    Dim elaps
    
    '経過時間を取得
    elaps = Me.Split_
    
    Debug.Print arg_text1 & Format(elaps, "0.000") & arg_text2
    
    '一応return
    Split_OutPut = elaps

End Function


```


#3.出力
ラップ1：1.000秒
ラップ2：2.016秒
総経過時間：3.023
SPとPCのレスポンシブデザインで改行位置を変えたい場合のCSSハック

例えば、

```text:SPの場合
あのイーハトーヴォの
すきとおった風、
夏でも底に冷たさをもつ
青いそら、うつくしい森で
飾られたモリーオ市、
郊外のぎらぎらひかる
草の波。
```

```text:PCの場合
あのイーハトーヴォのすきとおった風、
夏でも底に冷たさをもつ青いそら、
うつくしい森で飾られたモリーオ市、
郊外のぎらぎらひかる草の波。
```

こんな感じで１行に表示させたい文章があったとする。
単純に `<br>` を入れようとしてもSPだけ、PCだけで改行したいポイントがある。

```html
あのイーハトーヴォの<br class="br-sp">
すきとおった風、<br>
夏でも底に冷たさをもつ<br class="br-sp">
青いそら、<br class="br-pc">
うつくしい森で<br class="br-sp">
飾られたモリーオ市、<br>
郊外のぎらぎらひかる<br class="br-sp">
草の波。
```

```css
.br-sp {
  display: none;
}

@media screen and (max-width: 1080px) {
  .br-pc {
    display: none;
  }

  .br-sp {
    display: inline-block;
  }
}
```

こんな感じで `<br>` にクラスを振り、CSSで表示を切り替えると実現できる。
scikit-learnで機械学習(分類)ロジックを実装する時参考にしたものまとめ

##参考文献
scikit-learn で決定木分析 (CART 法)
https://pythondatascience.plavox.info/scikit-learn/scikit-learn%E3%81%A7%E6%B1%BA%E5%AE%9A%E6%9C%A8%E5%88%86%E6%9E%90

検索キーワードを python sklearn RandomForestClassifier でクラス分類してカテゴリ分けする
https://www.monotalk.xyz/blog/google-search-console-%E3%81%AE-%E3%82%AD%E3%83%BC%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92-python-sklearn-randomforestclassifier-%E3%81%A7%E3%82%AF%E3%83%A9%E3%82%B9%E5%88%86%E9%A1%9E%E3%81%97%E3%81%A6%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E5%88%86%E3%81%91%E3%81%99%E3%82%8B/

Kernel SVC（クラス分類）（SVM Classification）【Pythonとscikit-learnで機械学習：第5回】　
http://neuro-educator.com/ml5/

SGD（クラス分類）【Pythonとscikit-learnで機械学習：第1回】
http://neuro-educator.com/mlearn1/

多クラス分類（Multi-Class Classification）
http://www.tsjshg.info/udemy/Lec80-81.html

確率的勾配降下法とは何か、をPythonで動かして解説する
https://qiita.com/kenmatsu4/items/d282054ddedbd68fecb0

公式doc
https://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

機械学習におけるカーネル法について
http://enakai00.hatenablog.com/entry/2017/10/13/145337

Python: データセットを標準化する効果を最近傍法で確かめる
https://blog.amedama.jp/entry/2017/03/14/213128

経済学徒が知らない機械学習の世界
https://adtech.cyberagent.io/research/archives/919

Scikit-learnのpipeleine.Pipelineが便利
http://tkzs.hatenablog.com/entry/2016/06/26/093502

【機械学習初心者向け】scikit-learn「アルゴリズム・チートシート」の全手法を実装・解説してみた
https://qiita.com/sugulu/items/e3fc39f2e552f2355209

【機械学習入門|Python|scikit-learn】結局何ができる？cheat-sheetから解説してみる篇
https://engineers.weddingpark.co.jp/?p=872
Vue-Cliのインストールに失敗して試したこと

# 問題点
vue-cliをインストールしようと思ったら、以下のエラーが出てきました。

```terminal

$ npm install -g @vue/cli
npm WARN deprecated cross-spawn-async@2.2.5: cross-spawn no longer requires a build toolchain, use it instead
npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules
npm ERR! path /usr/local/lib/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!  { Error: EACCES: permission denied, access '/usr/local/lib/node_modules'
npm ERR!   stack: 'Error: EACCES: permission denied, access \'/usr/local/lib/node_modules\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'access',
npm ERR!   path: '/usr/local/lib/node_modules' }
npm ERR! 
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR! 
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator (though this is not recommended).

npm ERR! A complete log of this run can be found in:
npm ERR!     /＜各位のディレクトリ＞

```

#解決方法
npmのデフォルトディレクトリを以下コマンドで変更
```npm config set prefix '~/.npm-packages'```
この後もう一度```npm install -g @vue/cli```を行って、無事にインストール完了。


オプションの```-g```はグローバルを意味するため、これを実行するにはrootユーザーでないとエラーが出ます。
そのためsudoを使ってインストールするか、あるいは（モジュールがグローバルにインストールされたくない場合は）許可があるパスにnpm prefixを設定する必要があるわけですが、今回は後者を使いました。
Windows 10 の「Windows Defender セキュリティセンター」の設定で LibreOffice や GIMP によるファイルの書き込みが出来ない時の対処法

Windows 10 では OS 標準でセキュリティソフトがインスコされているが、oss で作成されたアプリケーションでは、読込が出来ても書き換え等が出来ない。

LibreOffice での表示
![1.png](https://qiita-image-store.s3.amazonaws.com/0/152444/14f33e9c-1e8c-2acf-37b2-b86a684b5c50.png)

OS での表示
![3.png](https://qiita-image-store.s3.amazonaws.com/0/152444/8e2624b4-44a3-8a91-3688-0102a4059b91.png)

個別に実行ファイルに対してコントロールされたフォルダーアクセスへ許可の設定をする。

「ホーム」→「設定」→「Windows セキュリティ」→「Windows Defender セキュリティセンターを開く」→「ウィルスと脅威の防止」→「ランサムウェアの防止」→「アプリをコントロールされたフォルダーアクセスで許可する」を順次クリックする。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/152444/3f74d004-9c5a-779a-8087-9ccafc66c912.png)

「許可されたアプリを追加する」をクリックする。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/152444/ea4c66a6-7838-5682-93ea-d4e68a1b38d6.png)

「開く」のウィンドウが出るが LibreOffice の実行形式が出ないので、ファイル名の箇所に「\*.\*」を入力して全てのファイルを選択できるようにする。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/152444/7ae5909c-ba2a-8e8f-2207-3a520e2d23a0.png)

OS の通知に表示していた「soffice.bin」を選択し、「開く」をクリックする。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/152444/d5d95e1e-b004-b926-ee78-8882c46d4266.png)

変更の許可を求めてくるので認証して完了。
![7.png](https://qiita-image-store.s3.amazonaws.com/0/152444/56cc44d4-dd8d-fbd8-b3af-e9a16cb104c2.png)

GIMP の場合は gimp-?.??.exe なので、適宜読み替えれば対応可能。
JavaFXを使ったGUIサンプル

JAVAでフォームとボタンを作ってみた。
まだ表示のみでDB等の接続機能は設定していない状態。


![GUI.PNG](https://qiita-image-store.s3.amazonaws.com/0/294636/d0cb4f14-eb87-3a3d-bf8f-25367fa815b9.png)


```java
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class Sgn extends Application{
	Label label;
	Label label2;
	Label label3;
	TextField textField;
	TextField textField2;
	TextField textField3;
	Button button;

	public void start(Stage stage) {
		stage.setTitle("社員マスタ");
		stage.setWidth(800);
		stage.setHeight(700);


		label = new Label("ID:");
		label2 = new Label("氏名:");
		label3 = new Label("年齢:");
		textField = new TextField("IDを入力してください");
		textField2 = new TextField("氏名を入力してください");
		textField3 = new TextField("年齢を入力してください");


		Button button1 = new Button("読込");
		Button button2 = new Button("取消");
		Button button3 = new Button("決定");

		button1.setPrefSize(100, 50);
		button2.setPrefSize(100, 50);
		button3.setPrefSize(100, 50);

		GridPane root = new GridPane();
		GridPane.setConstraints(label, 0, 0);
		GridPane.setConstraints(label2, 0, 1);
		GridPane.setConstraints(label3, 0, 2);
		GridPane.setConstraints(textField, 1, 0);
		GridPane.setConstraints(textField2, 1, 1);
		GridPane.setConstraints(textField3, 1, 2);
		GridPane.setConstraints(button1, 2, 0);
		GridPane.setConstraints(button2, 3, 3);
		GridPane.setConstraints(button3, 4, 3);
		root.getChildren().addAll(label, label2, label3,textField, textField2, textField3, button1, button2, button3);


		Scene scene = new Scene(root);
		stage.setScene(scene);

		stage.show();

	}
	public static void main(String[] args) {
		launch();

	}

}
```
Windows上のLazarusからWSL経由でLinux用バイナリをクロスコンパイルする

Windows上でLinuxのバイナリ作るのはかなり面倒ですね。クロスコンパイラ作ったり、ライブラリをLinuxからコピーしてきたりなど。

WSL (Windows Subsystem for Linux)経由でコンパイルすると意外とスピーディーに簡単にクロスコンパイルの環境ができたのでメモしておきます。

今回使用したのは

* Windows 10
* WLinux Enterprise

です。

* まず WLinux をインストールします (これはウェブ上にいっぱい情報があるので良いでしょう)

* ここから先はWSLで作業
* ターミナルを起動したらウィザードに従ってLinuxをセットアップ
* yum update とかしてとりあえず最新に
* FPCのインストールに libgcc が必要なようなのでインストール

```
# yum install libgcc
```

* free pascalのサイトからRPMをダウンロード・インストール

```
# rpm -ivh https://sourceforge.net/projects/freepascal/files/Linux/3.0.4/fpc-3.0.4-1.x86_64.rpm
```

* インストールできたかチェック

```
$ fpc -h
Free Pascal Compiler version 3.0.4 [2017/10/02] for x86_64
```

* ここから先はWindowsで作業
* Lazarusプロジェクトのあるディレクトリへ移動
* 下記の内容でバッチファイルを作成

``` fpc.bat
set str=%*
set str=%str:\=/%
set str=%str:C:/=/mnt/c/%
set str=%str:D:/=/mnt/d/%
C:\Users\AnaKutsu\AppData\Local\Microsoft\WindowsApps\wle.exe run cd /mnt/d/Users/AnaKutsu/Documents/path/to/your/project/; fpc %str%
```
※ フォルダ名やドライブレターは環境に合わせてください

* ここから先はLazarusで作業
* プロジェクトオプションでコンパイラコマンドタブのコンパイラのパスを上記で作成したbatファイルに変更

これでLazarusのIDEからWSLのFPCでコンパイルできるんじゃなかろうか!

※ ちなみにLCLは試してみません。コンソールアプリケーションとシェアドオブジェクトは作成できました。
JSの関数の引数について現在の理解を書いていく

##引数とは？
**関数に情報を渡す**ための変数（関数が呼び出され流まで存在しない変数）

関数に情報を渡すとは？

```引数.js
function avg(a,b){
   return (a + b) / 2 //引数a,bが関数内の情報に値を渡している(代入している)
}
let a = 5, b = 10; //定義
console.log(avg(a,b)); //avg関数の呼び出し 7.5
```

次は少し難しい

##関数外で定義された変数名と引数名が同じ場合#プリミティブ編
まずはコードを。

```.js
function f(x){
    console.log(x); //3
    x = 5;
    console.log(x); //5
}
let x = 3;
console.log(x); //x=3の結果が表示
f(x);//関数fの呼び出し  引数x=変数xを代入 ここのxはletで定義したx=3の変数であって、引数ではない　f(3)
console.log(x); //3　「あれ？　5じゃないの？」
```

一旦置いておき次の例

##関数外で定義された変数名と引数名が同じ場合#オブジェクト編

```.js
function f(o){
   console.log(o.message); //messageの初期化
   o.message = "関数fのなかでmessageを変更した！"
   console.log(o.message); //関数fのなかでmessageを変更した！
}
let o = {
   message:"messageの初期化"
}: //オブジェクト作成
console.log(o.message); //messageの初期化
f(o); //関数の呼び出し
console.log(o.message); // ??

//=>関数fのなかでmessageを変更した！
```

これはJSのデータ型が関係しています。
**このようにプリミティブ型とオブジェクト型で動作が異なる！**

##なぜ？

- プリミティブ
    - 値型（value type）:プリミティブ側が引数に渡されるとき値がコピーされる
- オブジェクト
    - 参照型（reference type）:オブジェクトが引数に渡されるときは同じオブジェクトを参照する

つまり！

**プリミティブ**
<img width="1148" alt="スクリーンショット 2019-01-15 14.42.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/328210/af4bfd2d-d4e3-f6ec-2425-e1a453b4124f.png">

**オブジェクト**
<img width="1146" alt="スクリーンショット 2019-01-15 15.53.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/328210/738b2711-8acd-17db-d81f-faba698d6219.png">



##デフォルト引数

```.js
function f(a, b=4){
   return `${a} - ${b}`;// a = 3, b = 4 
   // -1
}
console.log(f(3));
```
のような感じで、初期値として引き数に値を与えておくことも可能なのである。

###デフォルト値の変化

```.js
function f(a, b=4){
   return `${a} - ${b}`;// a = 3, b = 2
   // 1
}
console.log(f(3,2));
```
このように引数分の値を書いてあげることで、デフォルト値を変更することができる。
gitの簡易メモ

#用途
gitを利用するにあたって忘れたとき用の軽いメモ。

# gitの導入
1.githubにリモートリポジトリを作成
2.ローカル環境にリポジトリを作成

```
$: git init
```

3.管理するフォルダをgithubのリモートリポジトリに登録

```
$: git remote add origin https://github.com/[ユーザー名]/[リポジトリ名].git
```

4.ファイルをインデックスに追加
`add`は指定したものをインデックスに追加するコマンド。
ここでは`.`で現在いるディレクトリを追加している。

```
$: git add .
```

5.addされたファイルをローカルリポジトリに登録

```
$: git commit
```

`-m "コメント"`でコメントをつけられる。

6.ローカルリポジトリをプッシュしてリモートリポジトリへ反映させる

```
$: git push -u origin master
```

# gitの更新
1.変更をインデックスに追加
とりあえず管理するフォルダに移動し、`.`で全て指定していればよさそう。

```
$: git add .
```

2.ファイルをコミット

```
$: git commit -m "伝えたいこと"
```

3.リモートリポジトリにデータの送信

```
$: git push origin master
```

# 参考
これを書くにあたって以下の記事を参考にしました。
- [基本的なGitコマンドまとめ](https://qiita.com/2m1tsu3/items/6d49374230afab251337)
- [【GitHub超初心者入門】この前初めてGitHubを使い始めたエンジニア見習いが書くGitHubの使い方と実践～とりあえず一緒に動かしてみようぜ！～](https://qiita.com/nnahito/items/565f8755e70c51532459)
- [~バージョン管理を始めよう~gitの導入からバージョン管理を行うまで](https://qiita.com/toshi-toma/items/d0efe37edc38f399c6a5)
- [git push コマンドの使い方と、主要オプションまとめ](http://www-creators.com/archives/1472)
SDLアプリコンテスト 十五日目

#概要

SDLアプリコンテスト、見つけたので挑戦してみる。
提出資料は、pdfらしい。
jsdoで、pdfを作ってみた。

#仕組み

markedで、Markdownを書く。
html2canvasで、canvasに書く。
jspdfで、pdfをダウンロード。

#成果物

http://jsdo.it/ohisama1/C6O1


以上。
Unity内でアセットが利用されてるか調べる方法

このシーンが不要になったから削除したいが、ひょっとしたらこの画像は他シーンで使われてるかも....不安！　
ってときに役立つかも。

まず、検索したい場所のディレクトリまで移動する。

```terminal
cd /UnityProject/Assets
```

検索したいファイルのmetaファイルを開き、guidを確認する。

```sample.meta
fileFormatVersion: 2
guid: 7b8ce8844f5e146b78746508f3beb9ba  // このguidを知りたい！！
timeCreated: 1427529950
licenseType: Pro
TextureImporter:
  fileIDToRecycleName: {}
  serializedVersion: 2
  mipmaps:
    mipMapMode: 0
    enableMipMap: 0
    linearTexture: 0
    correctGamma: 0
    fadeOut: 0
    borderMipMap: 0
    mipMapFadeDistanceStart: 1
    mipMapFadeDistanceEnd: 3
  bumpmap:
    convertToNormalMap: 0
    externalNormalMap: 0
    heightScale: 0.25
    normalMapFilter: 0
  isReadable: 0
  grayScaleToAlpha: 0
  generateCubemap: 0
  cubemapConvolution: 0
  cubemapConvolutionSteps: 8
  cubemapConvolutionExponent: 1.5
  seamlessCubemap: 0
  textureFormat: -2
  maxTextureSize: 2048
  textureSettings:
    filterMode: 1
    aniso: 0
    mipBias: -1
    wrapMode: 1
  nPOTScale: 0
  lightmap: 0
  rGBM: 0
  compressionQuality: 50
  allowsAlphaSplitting: 0
  spriteMode: 1
  spriteExtrude: 1
  spriteMeshType: 1
  alignment: 0
  spritePivot: {x: 0.5, y: 0.5}
  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
  spritePixelsToUnits: 1
  alphaIsTransparency: 1
  textureType: 5
  buildTargetSettings: []
  spriteSheet:
    sprites: []
    outline: []
  spritePackingTag: 
  userData: 
  assetBundleName: login-bonus.dat
  assetBundleVariant: 
```

terminalで以下の通りコマンドをうつ。検索。

```terminal
$find . -type f -print0 | xargs -0 grep -n "7b8ce8844f5e146b78746508f3beb9ba"
```

- type f　オプション： ファイルのみを対象とし検索する。
- [print0オプション](https://qiita.com/tbrook/items/ce1bfd03a25f6d5080b5)
- grep -n：行番号付きでマッチ結果を表示。

アトラス画像から特定の画像のみ検索したい場合、　| grep ファイルID と追記する。

```terminal
$find . -type f -print0 | xargs -0 grep -n "xxxx"| grep yyyy
```
SolrJ でfacet countの結果を取得する


# SolrQuery の addFacetField を使う



```java

public class HelloSearch {

	public static void main(String[] args) throws Exception {

		String urlString = "http://localhost:8983/solr/sandbox";
		SolrClient solr = new HttpSolrClient.Builder(urlString).build();

		SolrQuery query = new SolrQuery();
		String mQueryString = "*:*";
		query.setQuery(mQueryString);

		query.setFields("id,field_text_en");
		query.addFacetField("カウントしたいフィールド"); // <- これ

		QueryResponse response = solr.query(query);

		SolrDocumentList list = response.getResults();

		for (SolrDocument doc : list) {
			System.err.println(doc);
			System.err.println("id: " + doc.get("id"));
		}

		System.err.println("---");

		if (response.getFacetFields() != null) {
			for (FacetField field : response.getFacetFields()) {
				for (Count c : field.getValues()) {
					System.err.println(c.getName() + "=" + c.getCount());
				}
			}
		} else {
			System.err.println("null");
		}
	}
}


```
Ubuntu18.04の中にRails5.2.2をインストールしよう


###動画での解説はこちらから
https://www.youtube.com/watch?v=UVwx3KOS64A&t=1s

###Mac 
PCからUbuntuにログイン

```bash:terminal
vagrant ssh
```

###Ubuntuの中

文字コードの設定
viはファイルの編集という意味なので、他のエディタで編集しても構いません。

```bash
echo -e 'LANG=en_US.UTF-8\nLANGUAGE= \nLC_CTYPE="en_US.UTF-8"LC_NUMERIC="en_US.UTF-8"\nLC_TIME="en_US.UTF-8"\nLC_COLLATE="en_US.UTF-8"\nLC_MONETARY="en_US.UTF-8"\nLC_MESSAGES="en_US.UTF-8"\nLC_PAPER="en_US.UTF-8"\nLC_NAME="en_US.UTF-8"\nLC_ADDRESS="en_US.UTF-8"\nLC_TELEPHONE="en_US.UTF-8"\nLC_MEASUREMENT="en_US.UTF-8"\nLC_IDENTIFICATION="en_US.UTF-8"\nLC_ALL=en_US.UTF-8' | sudo tee /etc/default/locale
```

```bash:terminal
sudo vi /etc/default/locale
```

cyberduckから編集する時は、一旦、書き込み権限を与えてやります。
viで編集する時は、この行は無視して下さい。

```bash:terminal
sudo chmod o+w /etc/default/locale
```

```/etc/default/locale
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
```

cyberduckから編集した時は、書き込む後に書き込み権限を削除しましょう。

```bash:terminal
sudo chmod o-w /etc/default/locale
```

インストールツールのupdate

```bash:terminal
sudo apt-get update
```

RubyとRubyの開発に使うツールをインストール

```bash:terminal
sudo apt-get -y install ruby ruby-dev
```

ソフトウェアのインストールに使う基本的なツールをインストール

```bash:terminal
sudo apt-get -y install build-essential
```

Railsをインストール

```bash:terminal
sudo gem install rails
```

MySQLをインストール

```bash:terminal
sudo apt-get -y install mysql-server
```

MySQLのクライアントをインストール

```bash:terminal
sudo apt-get -y install libmysqlclient-dev
```

MySQLにログイン

```bash:terminal
sudo mysql --user=root mysql
```

rootユーザーのパスワードを更新

```terminal
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Testpass1#';
```

権限を更新

```terminal
flush privileges;
```

Railsの雛形を作成

```bash:terminal
rails new cebu_app -d mysql
```

```bash:terminal
vi Gemfile
```

mini_racerをコメントイン

```bash
sed -i -e "s/# gem 'mini_racer', platforms: :ruby/gem 'mini_racer', platforms: :ruby/" Gemfile
```

mini_racerをインストール

```bash:terminal
bundle install
```

```terminal
vi config/database.yml
```

usernameとpasswordを変更

```config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: Testpass1#
  socket: /var/run/mysqld/mysqld.sock
```

```bash:terminal
rake db:create
```

```bash:terminal
rails s -b 0.0.0.0
```

ブラウザにアクセスするとRailsの画面を見ることができます。

http://192.168.33.10:3000/

![スクリーンショット 2019-01-15 15.48.00.png](https://qiita-image-store.s3.amazonaws.com/0/39073/4c480b26-1b01-19cc-709f-4569558b0fb2.png "スクリーンショット 2019-01-15 15.48.00.png")
AWS Auroraでダンプしたデータをmysqlにインポートしようとしたらはまった

# Auroraでダンプしたデータをmysqlにインポートしようとしたらはまった

Aurora (MySQL 5.6.10)で mysqldumpして、そのデータをMySQL 5.7.24でインポートしようとしたら、見慣れないメッセージが出た。

```
ERROR 1726 (HY000) at line xxx: Storage engine 'InnoDB' does not support system tables. [mysql.columns_priv]
```

mysql.columns_priv っていうテーブルがInnoDBで、システム用のテーブルにはInnoDBが使えないって言われているっぽい。

Aurora上で下記のクエリを流したら、確かにmysql.columns_priv はInnoDBだった。

```.sql
SELECT table_name, engine FROM information_schema.tables WHERE table_schema= 'mysql';
```

↓

```.csv
table_name,engine
aurora_s3_load_history,InnoDB
bin_log_md_table,InnoDB
bin_log_table,InnoDB
columns_priv,InnoDB
db,InnoDB
ddl_log_md_table,InnoDB
ddl_log_table,InnoDB
event,InnoDB
func,InnoDB
general_log,CSV
general_log_backup,CSV
help_category,InnoDB
help_keyword,InnoDB
help_relation,InnoDB
help_topic,InnoDB
innodb_index_stats,InnoDB
innodb_table_stats,InnoDB
metadata_md_table,InnoDB
metadata_table,InnoDB
ndb_binlog_index,InnoDB
plugin,InnoDB
proc,InnoDB
procs_priv,InnoDB
proxies_priv,InnoDB
rds_configuration,InnoDB
rds_global_status_history,InnoDB
rds_global_status_history_old,InnoDB
rds_history,InnoDB
rds_replication_status,InnoDB
rds_sysinfo,InnoDB
relay_log_md_table,InnoDB
relay_log_table,InnoDB
ro_replica_status,InnoDB
servers,InnoDB
slave_master_info,InnoDB
slave_relay_log_info,InnoDB
slave_worker_info,InnoDB
slow_log,CSV
slow_log_backup,CSV
tables_priv,InnoDB
time_zone,MyISAM
time_zone_leap_second,MyISAM
time_zone_name,MyISAM
time_zone_transition,MyISAM
time_zone_transition_type,MyISAM
user,InnoDB

```

# 原因
Aurora上でInnoDBになっていて、インポートしようとしたら使えませんって馬鹿なって思って、my.cnfをずっと調べていたけど見当違いだった。

↓のページに「**MyISAM ストレージエンジンなど、特定の MySQL の特徴は Amazon Aurora で使用できません。**」って書いてあった。

https://aws.amazon.com/jp/rds/aurora/faqs/

ユーザが作ったテーブルだけではなく、システムで作られるテーブルも例外ではない模様。

ダンプデータをインポートする際に下記のクエリが走ってしまう。

```
DROP TABLE IF EXISTS `columns_priv`;
```
これをやってしまうと**mysqlが起動できなくなってしまう**。

# 解決法
mysqldumpのオプションで"--skip-add-drop-table"というのがあるので、それを付ければ"mysql.columns_priv"はdropされなくなるので、エラーは出なくなる。

https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html#option_mysqldump_add-drop-table

ただし"mysql.columns_priv"をCREATE TABLE するクエリは存在するので、インポートする際にエラーは出てしまう。
なのでインポート時に"-f"オプションを付けてエラーを無視してあげる。

無害なはずだけど、正確にやるならmysqudumpの時にDBを指定したほうが良いように思う。
LaTeXで作成した数式をEPSファイルに変換する方法

## より便利な方法
以下に記述してあるものより，より使いやすい方法を見つけました．[こちらの投稿](https://qiita.com/MasashiSD/items/3061df37d671cde8b89d)を参考にしてください．

## 要約
* [Tex2img](http://island.geocities.jp/loveinequality/)を使って，Texの数式をepsに変換する． 


## インストール

[Tex2img](http://island.geocities.jp/loveinequality/)を参照のこと．

## 数式の作成

以下のテンプレートを適当な名前で保存して式を書き換える．

```tex:template.tex
\documentclass{article}
\pagestyle{empty}
\begin{document}
    \[
        \int_{0}^{\infty} \frac{\sin x}{\sqrt{x}} dx = \sqrt{\frac{\pi}{2}}
    \]
\end{document}

```

## EPSファイルへの変換

作成したファイルに対して以下のコマンドを実行する．DOCUMENTの部分は適宜名前を変更すること．

windowsの場合:

```s
> C:\PATH\TO\TeX2img\Tex2imgc.exe DOCUMENT.tex DOCUMENT.eps
```
UIPastboard 的 RxSwift 擴充

## 實作

因為 RxCocoa 裡面不存在這個擴充，就自己寫：

``` swift
import UIKit
import RxSwift
import RxCocoa

extension Reactive where Base: UIPasteboard {
    var string: Binder<String?> {
        return Binder(base) { pasteboard, string in
            pasteboard.string = string
        }
    }
}
```

## 使用

假設我們有一個 view model 的類別, 裡面有宣告一個這樣子的 property：

``` swift
let copyContent: Driver<String?>
```

使用的時候就像這樣即可：

``` swift
// viewModel 是上面說的該 view model 的實例
// disposeBag 即 DisposeBag()
viewModel.copyContent
    .drive(UIPasteboard.general.rx.string)
    .disposed(by: disposeBag)
```
Excelで編集を有効にしないままだと動作が重くなった

せしまるです。

会社でExcel2016を使いまくっていたら動作が重くなった。
というよりほとんど動いてくれなくなった・・・。

同じ症状になった人もいるかもしれないのでその時にした対処を書いておきます。
※PCの性能によるかもしれないので、これで直る！というわけではないことをご理解ください。

## 発生したときの状態
・Excelのウィンドウを2つ開いていた（それぞれA、Bとする）。
・Aは編集、Bは編集しないため編集を有効にしていなかった（ウィンドウ上部に「編集を有効にする」ボタンが表示されている状態）。

この状態でBの表をAにコピーするために、範囲選択してCtrl+Cっと…

止まった（迫真）


## 対処
この時した対処は簡単。

**Bの編集を有効にするだけです。**

なんとわんぽち。
私の環境ではこれで止まることが無くなりました。
MacのgccでmecabインストールがコケるときはHomebrew経由でgccを入れる

# `pip install mecab-python3` でエラー

2019/01/15現在、Macデフォルトの`gcc` (`xcode-select`経由で入るもの)では `mecab-python3` のインストール時にエラーが出る。

```
#include <stdexcept>
             ^~~~~~~~~~~
    1 warning and 1 error generated.
    error: command 'gcc' failed with exit status 1
```

そのため、Homebrew経由の`gcc`を使う必要がある。

## Mecabインストール

`$ brew install mecab`
`$ brew install mecab-ipadic`


## gccインストール

`$ brew install gcc`
`$ ln -s /usr/local/bin/gcc-8 /usr/local/bin/gcc`
`$ ln -s /usr/local/bin/g++-8 /usr/local/bin/g++`

`.bash_profile` なり `.zshrc` なりを編集して、
`$ which gcc` が `/usr/local/bin/gcc` となるようにする。

## mecab-python3 インストール

`$ brew install swig`
`$ pip install mecab-python3`

以上でインストールができる。
Outsystemsのカメラ機能を試してみる

#はじめに

あけましておめでとうございます:D
今年最初の記事になります。

ある日社内の開発で、モバイルアプリのモックを作る事になった私。

でもOutsystemsのカメラにまつわる記事って全然存在しない・・・

じゃあ実装ついでに書いちゃえってノリでここに書いちゃいます(..)

内容に関してはカメラ起動から保存までの流れをざっくりと記します。

#想定読者

・Outsystemsのカメラ起動についてイメージがつかない方


#Outsystemsでのカメラアプリについて

forgeで調べてみるとOutsystemsで扱えるカメラアプリは下記2つがメジャーらしいです。
Camera previewはよく見ると、2019/01/15時点でIOS端末にしか対応していないため、今回はCamera Pluginを採用します。

モジュールの中身を見る感じでは、camera previewのほうができることが多い感じがします。

・Camera Plugin
https://www.outsystems.com/forge/component-details/1390/Camera+Plugin/

・Camera preview-plugin
https://www.outsystems.com/forge/component-overview/1578/camerapreview-plugin

#Outsystemsでのカメラを起動してみる

###■事前準備
・Mobileのアプリの土台をscaffoldで自動生成
・テスト端末にOutsystems Nowをインストールしておく
・対象のアプリのDependencesにCamera pluginを忘れずに入れる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/69fb5032-5c0a-e768-0ce9-8b255eb9b762.png)


###■実装フロー
![WS000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/130275/1ac210e3-65d1-367b-2a60-6aff36350137.jpeg)


####①Iconウィジェット利用し、カメラボタンの設置
Iconウィジェットに「Event」と「Handler」を設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/96e2ab8a-52d1-102d-dfc7-5cf91866e93d.png)

####②撮影した写真を表示するためのImageウィジェットの設置
撮影前と撮影後で写真の切り替えをするため、If文で分岐

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/44648839-1c4e-94cb-bc5e-213b68683309.png)


####③Local valiableとカメラボタンを押下した際のアクションを追加

・Local valiableはBinary Data型

・アクションの中身（TakePic）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130275/4762fb9a-413a-99b6-916c-2913b3c6e16a.png)

Camera Pluginの「Take Picture」をドラッグアンドドロップで配置。

撮影された写真は「ImageCaptured」というOutputParameterに格納されるため、この値をassgin（Photo）に格納。

今回はあくまでモック作成のため、DBには保存しませんでした。



#終わりに

ドキュメント周りが本当に少なくて最初そもそもCamera Pluginの「Take Picture」でカメラが起動するのか心配でした・・が案外うまくいきました。
触りはこれで理解したので、もうちょっと触ってみたいですね。
Node.jsとexpressを使って簡単なWebAPIを作成する

# 概要
Node.jsとexpressを使って、簡単な情報を提供するWebAPIを作成する手順を解説する。

# 環境
Windows 10
Node.js `v8.9.1`
npm `5.5.1`
express `4.16.0`
express-generator
Google Chrome `71.0.3578.98`
Visual Studio Code

# 簡単なWebAPIの作成手順

## 準備
### インストール
* Node.jsのインストール
* npmのインストール
* expressのインストール
* express-generatorのインストール（expressコマンドを利用するため）

### npm init
WebAPIのソースを格納するフォルダを作成し、コマンドプロンプトでそのフォルダまで移動して以下のコマンドを実行。
色々聞かれるが何も変更せずにEnterキーを押して進める。

```
$ npm init
```

## GETのレスポンスでHello Worldを表示する
### コード

```index.js
// expressフレームワーク
const express = require('express');
const app = express();

// ルート設定
app.get('/', (req, res) => res.send('Hello World'));

// イベント待機
app.listen(3000, () => console.log('Listening on port 3000'));
```

### 実行結果
コマンドプロンプトで以下のコマンドを実行し、Nodeサーバを起動する。

```
$ node index.js
```

Webブラウザを立ち上げ、[http://localhost:3000](http://localhost:3000)にアクセス。"Hello World"という文字が表示されることを確認する。

![WS000075.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/feb9f218-d298-8a58-14ab-d84ca49ed7ff.jpeg)

### 何が起きているのか

![WS000077.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/763c8c31-fc3b-907a-0937-9cf37d2cb5ce.jpeg)

1. WebブラウザがNodeサーバに対してGETメソッドのHTTPリクエストを送信
1. Nodeサーバは受け取ったGETメソッドのHTTPリクエストに対して、'Hello World'という文字列をHTTPレスポンスとして返す
1. Webブラウザは受け取ったHTTPレスポンスを描画する

## GETのレスポンスでJSONを返す
上記のHello Worldでは文字を返したが、WebAPIの提供する情報はJSON形式になっていることがほとんどだと思うので、次はJSON形式のデータをWebAPIが返すようにindex.jsを改善してみる。

"ppap"というWebAPIを作成し、このWebAPIにGETメソッドでHTTPリクエストを送るとHTTPレスポンスでppapの内容（ppapで使用する物とその順番）を含むJSON形式で返してくれるようにする。

### コード

```index.js
// expressフレームワーク
const express = require('express');
const app = express();

// ルート設定
app.get('/', (req, res) => res.send('Hello World'));

// api-ppapの設定
app.get('/api/v1/ppap', (req, res) =>{
    const ppap = [
        { object:'pen', order:1 },
        { object:'pineapple', order:2 },
        { object:'apple', order:3 },
        { object:'pen', order:4 }
    ];
    res.json(ppap);
});

// イベント待機
app.listen(3000, () => console.log('Listening on port 3000'));
```

### 実行結果
`Ctrl+C`でNodeサーバを一度停止し、再度以下のコマンドでNodeサーバを起動する。

```
$ node index.js
```

Webブラウザを立ち上げ、[http://localhost:3000/api/v1/ppap](http://localhost:3000/api/v1/todolist)にアクセス。
ppapで使用するものとその順番がJSON形式の文字列として表示されることを確認する。　[^1]
[^1]: WebAPIのURLは`ルートURL/api/バージョン/api名`とするのが一般的らしい

![WS000080.JPG](https://qiita-image-store.s3.amazonaws.com/0/329353/ebe602cb-be22-72e9-324a-649de975f1cb.jpeg)

# GET以外のメソッド
今回はHTTPのGETメソッドを対象にWebAPIから情報を提供する方法を解説したが、GETメソッド以外にもHTTP通信には以下のメソッドがある。

| メソッド | 使用する場面 |
|:-:|:-:|
| GET | データの取得 |
| POST | データの登録 |
| PUT | データの更新 |
| DELETE | データの削除 |

WebAPIを利用してデータの取得だけでなく、データの登録・更新・削除まで行いたい場合は、これらのメソッドを使い分ける必要がある。
Netlify StatusKit でつくる Status ページ

# はじめに
Webサイトの稼働状況や障害情報をユーザーに掲示する手段として、ステータスページというものがあります。たいてい、[Atlassian Statuspage](https://www.statuspage.io/) とか有料サービスを利用していることが多いと思いますが、フリーのツールもそれなりにあります。今回、Netlify StatusKit というものを利用して手作りしたことがあった為、紹介します。

# Netlify StatusKit とは
静的Webサイト/SPA 向けの PaaS である Netlify が公開している ステータスページ構築のためのテンプレートです。
https://www.netlify.com/status-pages/
![Netlify StatusKit](https://i.gyazo.com/19d35767375f96c7a8496185acfc81cf.png)

静的Webサイトを出力するためのキットとなっており、 Netlify で運用することが可能です。公式の紹介動画があるので、ご覧ください（リンクor画像クリックでYoutube動画に遷移できます）。
https://youtu.be/sCXGMu5QzQs
[![Netlify Status Page Kit紹介動画]
(https://i.gyazo.com/13ce0f2d427b21327a3dff25bf80e816.png)](https://youtu.be/sCXGMu5QzQs)

# なにができる

- 機能別のステータス掲示
  - ステータスの初期値は `Operational`, `Under maintenance`, `Degraded performance`, `Partial outage`, `Major outage`です。
- インシデント情報の投稿/編集/掲示
  - インシデントは `Active`と`Past`の２つのステータスをとります。
  - インシデント情報は gulp タスクとしてCLI入力により作成できます。インシデント情報は mdファイルとして保存されます。インシデント情報の編集と削除は md ファイルを直接変更することで実現できます。
- インシデント履歴の掲示
  - `Active`と`Past`に関わらず、すべてのインシデントの履歴を掲示します。

# デプロイ
- まずは 上記のリポジトリにある Deploy to Netlify ボタンをつかって、自分のNetlify プロジェクトにデプロイしてみるといいと思います。
- Netlify の `site` と 任意の GitHub 上の Git リポジトリとが連携させてあれば、Git リポジトリへのpushを感知してデプロイが実行されます（手動デプロイも可能です）
- ちなみに、`dist` ディレクトリ配下にWebサイトの静的ファイル群が出力されます。実際にインターネットに公開される静的ファイルはこれらになるので、これらを直接アップロードすれば Netlify でなくてもデプロイは可能です。

# カスタマイズ
ソースコードが公開されており、自分でカスタマイズして利用することも可能です。
https://github.com/netlify/netlify-statuskit

コードを見ると、静的サイトジェネレーターである [Hugo](https://gohugo.io/) をベースしたものということがわかります。私は Hugo を触った経験はありませんでしたが、それなりにいじれたと思っています（機能追加、デザイン変更など）。基本的な HTML/JavaScript/CSS/タスクランナーの知識があれば、問題なくカスタマイズできるのではないかと思います。
いまさらだけど Qiita と Google Analytics の連携は一瞬で簡単すぎた

いまさらだけど Qiita と Google Analytics の連携は一瞬で簡単すぎた

https://qiita.com/settings/analytics


![image](https://user-images.githubusercontent.com/13635059/51162201-b29ac200-18d8-11e9-9366-baf3cc0baa00.png)



# 一瞬でAnalyticsに反映されてきた
![image](https://user-images.githubusercontent.com/13635059/51162227-cba37300-18d8-11e9-9620-22a0b28010ad.png)

# どんどん流れてくる

![image](https://user-images.githubusercontent.com/13635059/51162361-33f25480-18d9-11e9-9ad4-89bc9e84b70e.png)

# 地域

![image](https://user-images.githubusercontent.com/13635059/51162368-394f9f00-18d9-11e9-9b43-bb4c2a79f40c.png)

---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Docker Toolbox、Laradock、PhpStorm環境のXdebug設定手順

Xdebugの設定手順を書いた投稿は多いですが、自分の環境に合った方法が少なく、設定に手こずったので同じ環境の人向けに残しておきます。

## 目次
1. Laradockの設定  
2. PhpStormの設定
3. 動作確認

## 環境
- Windows10 Home
- Docker Toolbox
- Laradock 
- PhpStorm

## 1. Laradockの設定
まずLaradockの設定を行います。

```
$ vi .env
```
```shell:.env
#WORKSPACE_INSTALL_XDEBUG=false
WORKSPACE_INSTALL_XDEBUG=true

#PHP_FPM_INSTALL_XDEBUG=false  
PHP_FPM_INSTALL_XDEBUG=true  
```

```
$ vi workspace/xdebug.ini
```
```ini:workspace/xdebug.ini,php-fpm/xdebug.ini
; xdebug.remote_host=dockerhost
xdebug.remote_host=192.168.99.1
#xdebug.remote_connect_back=1
xdebug.remote_connect_back=0
#xdebug.remote_port=9000
xdebug.remote_port=9001
xdebug.idekey=PHPSTORM

#xdebug.remote_autostart=0
xdebug.remote_autostart=1
#xdebug.remote_enable=0
xdebug.remote_enable=1
#xdebug.cli_color=0
xdebug.cli_color=1
xdebug.profiler_enable=0
xdebug.profiler_output_dir="~/xdebug/phpstorm/tmp/profiling"

xdebug.remote_handler=dbgp
xdebug.remote_mode=req

xdebug.var_display_max_children=-1
xdebug.var_display_max_data=-1
xdebug.var_display_max_depth=-1
```
  
同じ設定をphp-fpmのxdebugでも行います。
  
```
$ vi php-fpm/xdebug.ini
```
設定が完了したら、イメージを再構築して起動してください。

```
$ docker-compose up -d --build nginx mysql workspace 
```

## 2. PhpStormの設定 
次にPhpStormの設定を行います。 
ツールバーの**[File]**、**[Settings...]**を選択してください。
![setting-phpstorm01.png](https://qiita-image-store.s3.amazonaws.com/0/177029/fbb71e5c-1bad-06ea-5b6a-bfcb3de0ac4e.png)

**[Languages & Frameworks]**、**[Servers]**で**[+]**を選択し、次のように設定を追加します。  
![setting-phpstorm02.png](https://qiita-image-store.s3.amazonaws.com/0/177029/97ed04f9-2570-5d5c-4a0d-fc8f9431bffe.png)

- Name: Laradock
- Host: 192.168.99.100
- Port: 80
- Debugger: Xdebug
- Use path mappings: チェックする
- File/Directory: Laravelプロジェクトのフォルダ
- Absolute path on the server: /var/www

---

**[Languages & Frameworks]**、**[Debug]**で**[xdebug]**のDebug portを変更します。  
![setting-phpstorm03.png](https://qiita-image-store.s3.amazonaws.com/0/177029/b1db78c0-4151-120c-9c18-8a380dd4dea3.png)

- Debug port: 9001

## 3. 動作確認  
デバッグしたい行の数字の右側をクリックすると赤い丸が表示されます。
この赤い丸はブレークポイントと呼ばれ、そこでプログラムが一旦停止します。  
![check01.png](https://qiita-image-store.s3.amazonaws.com/0/177029/99b729b8-6b36-8a25-2d3e-652e25767b88.png)

次に右上の**[虫マーク]**を選択し、デバッグを実行した状態でブラウザにアクセスするとブレークポイントで停止されます。
PhpStormの下部のDebuggerに定数や変数が表示されれば設定完了です。
![check02.png](https://qiita-image-store.s3.amazonaws.com/0/177029/fc904542-a479-51bf-33b5-25e61a82f397.png)